[ppl] 01/02: Import Upstream version 1.1
Tobias Hansen
thansen at moszumanska.debian.org
Sat Nov 12 16:22:44 UTC 2016
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to annotated tag upstream/1%1.2
in repository ppl.
commit 39decfea1bc32c7e4f2743d10f06b7a4106ea685
Author: Tobias Hansen <thansen at broeselmaschine.fc.up.pt>
Date: Thu Nov 10 19:23:01 2016 +0000
Import Upstream version 1.1
---
BUGS | 22 +
COPYING | 674 +
CREDITS | 443 +
ChangeLog | 25507 +++++
ChangeLog_2001-2008 | 96130 ++++++++++++++++
INSTALL | 370 +
Makefile.am | 85 +
Makefile.in | 988 +
NEWS | 2053 +
README | 1768 +
README.alpha | 59 +
README.arm | 54 +
README.configure | 519 +
README.solaris | 50 +
STANDARDS | 739 +
TODO | 111 +
aclocal.m4 | 1177 +
compile | 347 +
config.guess | 1558 +
config.h.in | 411 +
config.rpath | 666 +
config.sub | 1788 +
configure | 27096 +++++
configure.ac | 1751 +
demos/Makefile.am | 36 +
demos/Makefile.in | 728 +
demos/ppl_lcdd/Makefile.am | 135 +
demos/ppl_lcdd/Makefile.in | 1027 +
demos/ppl_lcdd/examples/1d.ine | 5 +
demos/ppl_lcdd/examples/1da.ine | 6 +
demos/ppl_lcdd/examples/Makefile.am | 136 +
demos/ppl_lcdd/examples/Makefile.in | 659 +
demos/ppl_lcdd/examples/README | 13 +
demos/ppl_lcdd/examples/allzero.ine | 11 +
demos/ppl_lcdd/examples/ccc4.ext | 14 +
demos/ppl_lcdd/examples/ccc5.ext | 21 +
demos/ppl_lcdd/examples/ccc6.ext | 37 +
demos/ppl_lcdd/examples/ccp4.ext | 14 +
demos/ppl_lcdd/examples/ccp5.ext | 22 +
demos/ppl_lcdd/examples/ccp6.ext | 38 +
demos/ppl_lcdd/examples/cp4.ext | 12 +
demos/ppl_lcdd/examples/cp4.ine | 20 +
demos/ppl_lcdd/examples/cp5.ext | 21 +
demos/ppl_lcdd/examples/cp5.ine | 61 +
demos/ppl_lcdd/examples/cp6.ext | 37 +
demos/ppl_lcdd/examples/cp6.ine | 373 +
demos/ppl_lcdd/examples/cp7.ext | 70 +
demos/ppl_lcdd/examples/cross10.ine | 1030 +
demos/ppl_lcdd/examples/cross12.ine | 4102 +
demos/ppl_lcdd/examples/cross4.ine | 20 +
demos/ppl_lcdd/examples/cross6.ine | 69 +
demos/ppl_lcdd/examples/cross8.ine | 261 +
demos/ppl_lcdd/examples/cube.ext | 13 +
demos/ppl_lcdd/examples/cube.ine | 12 +
demos/ppl_lcdd/examples/cube10.ine | 25 +
demos/ppl_lcdd/examples/cube12.ine | 29 +
demos/ppl_lcdd/examples/cube3.ine | 11 +
demos/ppl_lcdd/examples/cube6.ine | 17 +
demos/ppl_lcdd/examples/cube8.ine | 21 +
demos/ppl_lcdd/examples/cubetop.ine | 12 +
demos/ppl_lcdd/examples/cubocta.ine | 19 +
demos/ppl_lcdd/examples/cut16_11.ext | 21 +
demos/ppl_lcdd/examples/cut32_16.ext | 37 +
demos/ppl_lcdd/examples/cyc.ine | 10 +
demos/ppl_lcdd/examples/cyclic10-4.ext | 16 +
demos/ppl_lcdd/examples/cyclic12-6.ext | 18 +
demos/ppl_lcdd/examples/cyclic14-8.ext | 20 +
demos/ppl_lcdd/examples/cyclic16-10.ext | 23 +
demos/ppl_lcdd/examples/cyclic17_8.ine | 20 +
demos/ppl_lcdd/examples/cyclic25_13.ext | 54 +
demos/ppl_lcdd/examples/dcube10.ext | 24 +
demos/ppl_lcdd/examples/dcube12.ext | 28 +
demos/ppl_lcdd/examples/dcube3.ext | 10 +
demos/ppl_lcdd/examples/dcube6.ext | 16 +
demos/ppl_lcdd/examples/dcube8.ext | 20 +
demos/ppl_lcdd/examples/diamond.ine | 10 +
demos/ppl_lcdd/examples/dodeca_m.ine | 17 +
demos/ppl_lcdd/examples/ex1.ine | 10 +
demos/ppl_lcdd/examples/grcubocta.ine | 31 +
demos/ppl_lcdd/examples/hexocta.ine | 54 +
demos/ppl_lcdd/examples/icododeca_m.ine | 39 +
demos/ppl_lcdd/examples/in0.ine | 11 +
demos/ppl_lcdd/examples/in1.ine | 37 +
demos/ppl_lcdd/examples/in2.ine | 19 +
demos/ppl_lcdd/examples/in3.ine | 16 +
demos/ppl_lcdd/examples/in4.ine | 15 +
demos/ppl_lcdd/examples/in5.ine | 17 +
demos/ppl_lcdd/examples/in6.ine | 26 +
demos/ppl_lcdd/examples/in7.ine | 23 +
demos/ppl_lcdd/examples/infeas.ine | 18 +
demos/ppl_lcdd/examples/integralpoints.ine | 36 +
demos/ppl_lcdd/examples/irbox20-4.ext | 25 +
demos/ppl_lcdd/examples/irbox200-4.ext | 205 +
demos/ppl_lcdd/examples/kkd18_4.ine | 25 +
demos/ppl_lcdd/examples/kkd27_5.ine | 34 +
demos/ppl_lcdd/examples/kkd38_6.ine | 49 +
demos/ppl_lcdd/examples/kq20_11_m.ine | 24 +
demos/ppl_lcdd/examples/metric40_11.ine | 45 +
demos/ppl_lcdd/examples/metric80_16.ine | 86 +
demos/ppl_lcdd/examples/mit.ine | 732 +
demos/ppl_lcdd/examples/mit288-281.ine | 291 +
demos/ppl_lcdd/examples/mit31-20.ine | 34 +
demos/ppl_lcdd/examples/mit41-16.ine | 44 +
demos/ppl_lcdd/examples/mit708-9.ine | 711 +
demos/ppl_lcdd/examples/mit71-61.ine | 74 +
demos/ppl_lcdd/examples/mit90-86.ine | 93 +
demos/ppl_lcdd/examples/mp5.ext | 36 +
demos/ppl_lcdd/examples/mp5.ine | 45 +
demos/ppl_lcdd/examples/mp5a.ine | 44 +
demos/ppl_lcdd/examples/mp6.ine | 84 +
demos/ppl_lcdd/examples/nonfull.ine | 11 +
demos/ppl_lcdd/examples/origin.ine | 14 +
demos/ppl_lcdd/examples/prodst62.ext | 3467 +
demos/ppl_lcdd/examples/project1_m.ine | 24 +
demos/ppl_lcdd/examples/project1res.ine | 18 +
demos/ppl_lcdd/examples/project2_m.ine | 66 +
demos/ppl_lcdd/examples/project2res.ine | 90 +
demos/ppl_lcdd/examples/rcubocta.ine | 31 +
demos/ppl_lcdd/examples/redcheck.ext | 11 +
demos/ppl_lcdd/examples/reg24-5.ext | 31 +
demos/ppl_lcdd/examples/reg24-5.ine | 30 +
demos/ppl_lcdd/examples/reg600-5_m.ext | 606 +
demos/ppl_lcdd/examples/rhomtria_m.ine | 35 +
demos/ppl_lcdd/examples/sample.ine | 11 +
demos/ppl_lcdd/examples/sampleh1.ine | 9 +
demos/ppl_lcdd/examples/sampleh2.ine | 7 +
demos/ppl_lcdd/examples/sampleh3.ine | 7 +
demos/ppl_lcdd/examples/sampleh4.ine | 12 +
demos/ppl_lcdd/examples/sampleh5.ine | 15 +
demos/ppl_lcdd/examples/sampleh6.ine | 11 +
demos/ppl_lcdd/examples/sampleh7.ine | 19 +
demos/ppl_lcdd/examples/sampleh8.ine | 110 +
demos/ppl_lcdd/examples/samplev1.ext | 8 +
demos/ppl_lcdd/examples/samplev2.ext | 11 +
demos/ppl_lcdd/examples/samplev3.ext | 16 +
demos/ppl_lcdd/examples/trunc10.ine | 119 +
demos/ppl_lcdd/examples/trunc7.ine | 65 +
demos/ppl_lcdd/examples/tsp5.ext | 16 +
demos/ppl_lcdd/examples/tsp5.ine | 30 +
demos/ppl_lcdd/expected_int16 | 98 +
demos/ppl_lcdd/expected_int16_a | 85 +
demos/ppl_lcdd/expected_int32 | 98 +
demos/ppl_lcdd/expected_int32_a | 85 +
demos/ppl_lcdd/expected_int64 | 98 +
demos/ppl_lcdd/expected_int64_a | 85 +
demos/ppl_lcdd/expected_int8 | 98 +
demos/ppl_lcdd/expected_int8_a | 85 +
demos/ppl_lcdd/expected_mpz | 98 +
demos/ppl_lcdd/expected_mpz_a | 85 +
demos/ppl_lcdd/ppl_lcdd.1 | 66 +
demos/ppl_lcdd/ppl_lcdd.cc | 1357 +
demos/ppl_lpsol/Makefile.am | 334 +
demos/ppl_lpsol/Makefile.in | 1272 +
demos/ppl_lpsol/dummy.cc | 13 +
demos/ppl_lpsol/examples/Makefile.am | 52 +
demos/ppl_lpsol/examples/Makefile.in | 576 +
demos/ppl_lpsol/examples/README | 9 +
demos/ppl_lpsol/examples/adlittle.mps | 335 +
demos/ppl_lpsol/examples/afiro.mps | 83 +
demos/ppl_lpsol/examples/bgprtr.mps | 84 +
demos/ppl_lpsol/examples/blend.mps | 366 +
demos/ppl_lpsol/examples/boeing1.mps | 2636 +
demos/ppl_lpsol/examples/boeing2.mps | 970 +
demos/ppl_lpsol/examples/egout.mps | 403 +
demos/ppl_lpsol/examples/ex1.mps | 21 +
demos/ppl_lpsol/examples/ex12.mps | 25 +
demos/ppl_lpsol/examples/kb2.mps | 219 +
demos/ppl_lpsol/examples/lseu.mps | 371 +
demos/ppl_lpsol/examples/markshare1.mps | 236 +
demos/ppl_lpsol/examples/markshare2.mps | 341 +
demos/ppl_lpsol/examples/mas74.mps | 1131 +
demos/ppl_lpsol/examples/mas76.mps | 1134 +
demos/ppl_lpsol/examples/mip.mps | 27 +
demos/ppl_lpsol/examples/modglob.mps | 1192 +
demos/ppl_lpsol/examples/noswot.mps | 729 +
demos/ppl_lpsol/examples/opt1217.mps | 1643 +
demos/ppl_lpsol/examples/p0033.mps | 152 +
demos/ppl_lpsol/examples/pk1.mps | 603 +
demos/ppl_lpsol/examples/rout.mps | 2038 +
demos/ppl_lpsol/examples/sample.mps | 24 +
demos/ppl_lpsol/examples/sc105.mps | 296 +
demos/ppl_lpsol/examples/sc50a.mps | 141 +
demos/ppl_lpsol/examples/sc50b.mps | 127 +
demos/ppl_lpsol/examples/ship08l.mps | 9547 ++
demos/ppl_lpsol/examples/unboundedmin.mps | 21 +
demos/ppl_lpsol/expected_int16 | 977 +
demos/ppl_lpsol/expected_int16_a | 183 +
demos/ppl_lpsol/expected_int32 | 997 +
demos/ppl_lpsol/expected_int32_a | 165 +
demos/ppl_lpsol/expected_int64 | 1046 +
demos/ppl_lpsol/expected_int64_a | 207 +
demos/ppl_lpsol/expected_int8 | 181 +
demos/ppl_lpsol/expected_int8_a | 161 +
demos/ppl_lpsol/expected_mpz | 6171 +
demos/ppl_lpsol/expected_mpz_a | 4578 +
demos/ppl_lpsol/glpk_set_d_eps.c | 263 +
demos/ppl_lpsol/ppl_lpsol.1 | 99 +
demos/ppl_lpsol/ppl_lpsol.c | 1435 +
demos/ppl_pips/Makefile.am | 127 +
demos/ppl_pips/Makefile.in | 1012 +
demos/ppl_pips/examples/Makefile.am | 48 +
demos/ppl_pips/examples/Makefile.in | 571 +
demos/ppl_pips/examples/README | 8 +
demos/ppl_pips/examples/big.pip | 9 +
demos/ppl_pips/examples/brisebarre.pip | 33 +
demos/ppl_pips/examples/cg1.pip | 15 +
demos/ppl_pips/examples/esced.pip | 21 +
demos/ppl_pips/examples/ex2.pip | 9 +
demos/ppl_pips/examples/fimmel.pip | 12 +
demos/ppl_pips/examples/invert.dat | 10 +
demos/ppl_pips/examples/linear.dat | 10 +
demos/ppl_pips/examples/lineri.dat | 9 +
demos/ppl_pips/examples/loz.dat | 15 +
demos/ppl_pips/examples/max.dat | 9 +
demos/ppl_pips/examples/max.pip | 9 +
demos/ppl_pips/examples/maxb.dat | 9 +
demos/ppl_pips/examples/pairi.dat | 7 +
demos/ppl_pips/examples/petit.dat | 9 +
demos/ppl_pips/examples/rairoi.dat | 9 +
demos/ppl_pips/examples/sor1d.pip | 28 +
demos/ppl_pips/examples/square.pip | 9 +
demos/ppl_pips/examples/test02.dat | 20 +
demos/ppl_pips/examples/test12i.dat | 17 +
demos/ppl_pips/expected_int16 | 20 +
demos/ppl_pips/expected_int16_a | 20 +
demos/ppl_pips/expected_int32 | 20 +
demos/ppl_pips/expected_int32_a | 20 +
demos/ppl_pips/expected_int64 | 20 +
demos/ppl_pips/expected_int64_a | 20 +
demos/ppl_pips/expected_int8 | 20 +
demos/ppl_pips/expected_int8_a | 20 +
demos/ppl_pips/expected_mpz | 20 +
demos/ppl_pips/expected_mpz_a | 20 +
demos/ppl_pips/ppl_pips.1 | 137 +
demos/ppl_pips/ppl_pips.cc | 827 +
depcomp | 791 +
doc/Makefile.am | 1736 +
doc/Makefile.in | 2354 +
doc/README.doc | 167 +
doc/bugseng_logo.pdf | Bin 0 -> 4035 bytes
doc/definitions.dox | 5028 +
doc/devref-language-interface.doxyconf.in | 308 +
doc/devref-language-interface.tex | 175 +
doc/devref.doxyconf-html.in | 333 +
doc/devref.doxyconf-latex.in | 332 +
doc/devref.tex | 173 +
doc/fdl.dox | 412 +
doc/fdl.pdf | Bin 0 -> 77376 bytes
doc/fdl.ps.gz | Bin 0 -> 100473 bytes
doc/fdl.tex | 454 +
doc/fdl.txt | 397 +
doc/gpl.dox | 691 +
doc/gpl.pdf | Bin 0 -> 69984 bytes
doc/gpl.ps.gz | Bin 0 -> 98913 bytes
doc/gpl.tex | 728 +
doc/gpl.txt | 674 +
doc/interfaces-html.sed | 4 +
doc/interfaces-latex.sed | 4 +
doc/libppl.3 | 226 +
doc/libppl_c.3 | 162 +
doc/ppl-config.1 | 142 +
doc/ppl-user-1.1-html.tar.gz | Bin 0 -> 1929177 bytes
doc/ppl-user-1.1.pdf | Bin 0 -> 2813705 bytes
doc/ppl-user-1.1.ps.gz | Bin 0 -> 2698834 bytes
doc/ppl-user-c-interface-1.1-html.tar.gz | Bin 0 -> 315443 bytes
doc/ppl-user-c-interface-1.1.pdf | Bin 0 -> 631543 bytes
doc/ppl-user-c-interface-1.1.ps.gz | Bin 0 -> 645091 bytes
doc/ppl-user-java-interface-1.1-html.tar.gz | Bin 0 -> 441271 bytes
doc/ppl-user-java-interface-1.1.pdf | Bin 0 -> 684377 bytes
doc/ppl-user-java-interface-1.1.ps.gz | Bin 0 -> 639840 bytes
doc/ppl-user-ocaml-interface-1.1-html.tar.gz | Bin 0 -> 140952 bytes
doc/ppl-user-ocaml-interface-1.1.pdf | Bin 0 -> 270568 bytes
doc/ppl-user-ocaml-interface-1.1.ps.gz | Bin 0 -> 328924 bytes
doc/ppl-user-prolog-interface-1.1-html.tar.gz | Bin 0 -> 143342 bytes
doc/ppl-user-prolog-interface-1.1.pdf | Bin 0 -> 309488 bytes
doc/ppl-user-prolog-interface-1.1.ps.gz | Bin 0 -> 382534 bytes
doc/ppl.bib | 3246 +
doc/ppl.sty | 200 +
doc/ppl_citations.bib | 4272 +
doc/ppl_logo.pdf | Bin 0 -> 5061 bytes
doc/ppl_logo_no_ppl.pdf | Bin 0 -> 4805 bytes
doc/user-language-interface.doxyconf.in | 311 +
doc/user-language-interface.tex | 174 +
doc/user.doxyconf-html.in | 307 +
doc/user.doxyconf-latex.in | 307 +
doc/user.tex | 173 +
install-sh | 527 +
instchk.hh | 389 +
interfaces/C/C_interface.dox | 1754 +
interfaces/C/Makefile.am | 268 +
interfaces/C/Makefile.in | 1222 +
interfaces/C/ppl_c.h.dist | 16187 +++
interfaces/C/ppl_c_header.h | 3272 +
interfaces/C/ppl_c_implementation_common.cc | 2642 +
interfaces/C/ppl_c_implementation_common_defs.hh | 259 +
.../C/ppl_c_implementation_common_inlines.hh | 214 +
interfaces/C/ppl_c_version.h.in | 63 +
interfaces/C/ppl_interface_generator_c_cc_code.m4 | 1437 +
interfaces/C/ppl_interface_generator_c_cc_files.m4 | 70 +
interfaces/C/ppl_interface_generator_c_h.m4 | 72 +
interfaces/C/ppl_interface_generator_c_h_code.m4 | 872 +
interfaces/C/ppl_interface_generator_c_hh_files.m4 | 85 +
...l_interface_generator_c_procedure_generators.m4 | 54 +
interfaces/C/tests/Makefile.am | 141 +
interfaces/C/tests/Makefile.in | 1304 +
interfaces/C/tests/formatted_output.c | 64 +
interfaces/C/tests/pip_test.c | 272 +
interfaces/C/tests/ppl_c_test.cc | 71 +
interfaces/C/tests/ppl_c_test.h | 41 +
interfaces/C/tests/print_to_buffer.c | 68 +
interfaces/C/tests/print_to_buffer.h | 82 +
interfaces/C/tests/watchdog1.c | 149 +
interfaces/C/tests/weightwatch1.c | 144 +
interfaces/Java/Makefile.am | 46 +
interfaces/Java/Makefile.in | 801 +
interfaces/Java/README.java | 58 +
interfaces/Java/jni/Makefile.am | 205 +
interfaces/Java/jni/Makefile.in | 1006 +
...ppl_interface_generator_java_classes_cc_code.m4 | 1607 +
...pl_interface_generator_java_classes_cc_files.m4 | 88 +
interfaces/Java/jni/ppl_java_common.cc | 1249 +
interfaces/Java/jni/ppl_java_common_defs.hh | 899 +
interfaces/Java/jni/ppl_java_common_inlines.hh | 246 +
interfaces/Java/jni/ppl_java_globals.cc | 2228 +
.../Artificial_Parameter.java | 87 +
.../Artificial_Parameter_Sequence.java | 42 +
.../Bounded_Integer_Type_Overflow.java | 40 +
.../Bounded_Integer_Type_Representation.java | 41 +
.../Bounded_Integer_Type_Width.java | 44 +
.../Java/parma_polyhedra_library/By_Reference.java | 51 +
.../Java/parma_polyhedra_library/Coefficient.java | 85 +
.../parma_polyhedra_library/Complexity_Class.java | 40 +
.../Java/parma_polyhedra_library/Congruence.java | 86 +
.../parma_polyhedra_library/Congruence_System.java | 46 +
.../Java/parma_polyhedra_library/Constraint.java | 80 +
.../parma_polyhedra_library/Constraint_System.java | 47 +
.../Control_Parameter_Name.java | 31 +
.../Control_Parameter_Value.java | 35 +
.../Degenerate_Element.java | 38 +
.../Domain_Error_Exception.java | 33 +
.../Fake_Class_for_Doxygen.java | 1291 +
.../Java/parma_polyhedra_library/Generator.java | 145 +
.../parma_polyhedra_library/Generator_System.java | 48 +
.../parma_polyhedra_library/Generator_Type.java | 42 +
.../parma_polyhedra_library/Grid_Generator.java | 123 +
.../Grid_Generator_System.java | 49 +
.../Grid_Generator_Type.java | 40 +
interfaces/Java/parma_polyhedra_library/IO.java | 48 +
.../Invalid_Argument_Exception.java | 34 +
.../Length_Error_Exception.java | 33 +
.../parma_polyhedra_library/Linear_Expression.java | 76 +
.../Linear_Expression_Coefficient.java | 54 +
.../Linear_Expression_Difference.java | 66 +
.../Linear_Expression_Sum.java | 62 +
.../Linear_Expression_Times.java | 74 +
.../Linear_Expression_Unary_Minus.java | 54 +
.../Linear_Expression_Variable.java | 57 +
.../Logic_Error_Exception.java | 37 +
.../Java/parma_polyhedra_library/MIP_Problem.java | 322 +
.../MIP_Problem_Status.java | 40 +
.../Java/parma_polyhedra_library/Makefile.am | 309 +
.../Java/parma_polyhedra_library/Makefile.in | 836 +
.../parma_polyhedra_library/Optimization_Mode.java | 38 +
.../Overflow_Error_Exception.java | 36 +
.../parma_polyhedra_library/PIP_Decision_Node.java | 35 +
.../Java/parma_polyhedra_library/PIP_Problem.java | 323 +
.../PIP_Problem_Control_Parameter_Name.java | 33 +
.../PIP_Problem_Control_Parameter_Value.java | 39 +
.../PIP_Problem_Status.java | 38 +
.../parma_polyhedra_library/PIP_Solution_Node.java | 41 +
.../parma_polyhedra_library/PIP_Tree_Node.java | 79 +
.../Java/parma_polyhedra_library/PPL_Object.java | 46 +
interfaces/Java/parma_polyhedra_library/Pair.java | 52 +
.../Parma_Polyhedra_Library.java | 327 +
.../parma_polyhedra_library/Partial_Function.java | 80 +
.../parma_polyhedra_library/Poly_Con_Relation.java | 93 +
.../parma_polyhedra_library/Poly_Gen_Relation.java | 63 +
.../parma_polyhedra_library/Relation_Symbol.java | 46 +
.../parma_polyhedra_library/Timeout_Exception.java | 33 +
.../Java/parma_polyhedra_library/Variable.java | 95 +
.../Variable_Stringifier.java | 33 +
.../parma_polyhedra_library/Variables_Set.java | 37 +
.../ppl_interface_generator_java_classes_java.m4 | 169 +
...l_interface_generator_java_classes_java_code.m4 | 771 +
...nterface_generator_java_procedure_generators.m4 | 55 +
interfaces/Java/tests/C_Polyhedron_test1.java | 137 +
.../Java/tests/Custom_Variable_Stringifier.java | 29 +
interfaces/Java/tests/MIP_Problem_test1.java | 274 +
interfaces/Java/tests/Makefile.am | 103 +
interfaces/Java/tests/Makefile.in | 640 +
interfaces/Java/tests/NNC_Polyhedron_test1.java | 123 +
interfaces/Java/tests/PIP_Problem_test1.java | 480 +
interfaces/Java/tests/PPL_Test.java | 90 +
.../Java/tests/Parma_Polyhedra_Library_test1.java | 72 +
.../Java/tests/Parma_Polyhedra_Library_test2.java | 142 +
interfaces/Java/tests/Test_Executor.java | 65 +
interfaces/Java/tests/Variable_Output_test1.java | 94 +
.../ppl_interface_generator_java_test_java.m4 | 103 +
.../ppl_interface_generator_java_test_java_code.m4 | 955 +
interfaces/Java/tests/ppl_java_tests_common | 197 +
interfaces/Makefile.am | 65 +
interfaces/Makefile.in | 761 +
interfaces/OCaml/Makefile.am | 292 +
interfaces/OCaml/Makefile.in | 1239 +
interfaces/OCaml/OCaml_interface.dox | 1269 +
interfaces/OCaml/README.ocaml | 55 +
.../OCaml/ppl_interface_generator_ocaml_cc_code.m4 | 1544 +
.../ppl_interface_generator_ocaml_cc_files.m4 | 66 +
.../OCaml/ppl_interface_generator_ocaml_hh_code.m4 | 66 +
.../ppl_interface_generator_ocaml_hh_files.m4 | 65 +
.../OCaml/ppl_interface_generator_ocaml_ml.m4 | 62 +
.../OCaml/ppl_interface_generator_ocaml_ml_code.m4 | 668 +
.../OCaml/ppl_interface_generator_ocaml_mli.m4 | 60 +
.../ppl_interface_generator_ocaml_mli_code.m4 | 588 +
...terface_generator_ocaml_procedure_generators.m4 | 57 +
interfaces/OCaml/ppl_ocaml_common.cc | 1814 +
interfaces/OCaml/ppl_ocaml_common_defs.hh | 234 +
interfaces/OCaml/ppl_ocaml_common_inlines.hh | 82 +
interfaces/OCaml/ppl_ocaml_globals.ml | 438 +
interfaces/OCaml/ppl_ocaml_globals.mli | 376 +
interfaces/OCaml/tests/Makefile.am | 176 +
interfaces/OCaml/tests/Makefile.in | 1188 +
.../tests/ppl_interface_generator_ocaml_test_ml.m4 | 61 +
.../ppl_interface_generator_ocaml_test_ml_code.m4 | 967 +
interfaces/OCaml/tests/ppl_ocaml_tests_common | 293 +
interfaces/OCaml/tests/test1.ml | 690 +
interfaces/Prolog/Ciao/Makefile.am | 317 +
interfaces/Prolog/Ciao/Makefile.in | 1681 +
interfaces/Prolog/Ciao/README.ciao | 16 +
interfaces/Prolog/Ciao/ciao_cfli.hh | 341 +
interfaces/Prolog/Ciao/ciao_clpq.pl | 56 +
interfaces/Prolog/Ciao/ciao_clpq2.pl | 56 +
interfaces/Prolog/Ciao/ciao_efli.cc | 100 +
interfaces/Prolog/Ciao/ciao_efli.hh | 92 +
interfaces/Prolog/Ciao/ciao_pl_check.pl | 170 +
.../Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 | 88 +
...face_generator_ciao_prolog_generated_test_pl.m4 | 65 +
interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh | 26 +
interfaces/Prolog/GNU/Makefile.am | 309 +
interfaces/Prolog/GNU/Makefile.in | 1713 +
interfaces/Prolog/GNU/README.gprolog | 59 +
interfaces/Prolog/GNU/gnu_pl_check.pl | 37 +
interfaces/Prolog/GNU/gnu_prolog_generated_test.pl | 37 +
interfaces/Prolog/GNU/gp_clpq.pl | 32 +
interfaces/Prolog/GNU/gprolog_cfli.hh | 461 +
interfaces/Prolog/GNU/gprolog_efli.cc | 83 +
interfaces/Prolog/GNU/gprolog_efli.hh | 89 +
.../GNU/ppl_interface_generator_gprolog_pl.m4 | 47 +
interfaces/Prolog/GNU/ppl_prolog_sysdep.hh | 26 +
interfaces/Prolog/Makefile.am | 139 +
interfaces/Prolog/Makefile.in | 827 +
interfaces/Prolog/Prolog_configured_interface.dox | 63 +
interfaces/Prolog/Prolog_interface.dox | 64 +
interfaces/Prolog/Prolog_interface_compilation.dox | 59 +
interfaces/Prolog/Prolog_interface_sysdep.dox | 235 +
interfaces/Prolog/Prolog_interface_sysindep.dox | 949 +
.../Prolog/Prolog_interface_sysindep_domains.dox | 914 +
interfaces/Prolog/SICStus/Makefile.am | 320 +
interfaces/Prolog/SICStus/Makefile.in | 1704 +
.../ppl_interface_generator_sicstus_sd_cc.m4 | 250 +
interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh | 26 +
interfaces/Prolog/SICStus/ppl_sicstus.pl | 30 +
interfaces/Prolog/SICStus/sicstus_cfli.cc | 28 +
interfaces/Prolog/SICStus/sicstus_cfli.h | 156 +
interfaces/Prolog/SICStus/sicstus_cfli.ic | 300 +
interfaces/Prolog/SICStus/sicstus_efli.cc | 108 +
interfaces/Prolog/SICStus/sicstus_efli.hh | 92 +
interfaces/Prolog/SICStus/sp_clpq.pl | 44 +
interfaces/Prolog/SICStus/sp_pl_check.pl | 49 +
.../Prolog/SICStus/sp_prolog_generated_test.pl | 49 +
interfaces/Prolog/SWI/Makefile.am | 332 +
interfaces/Prolog/SWI/Makefile.in | 1750 +
interfaces/Prolog/SWI/README.swiprolog | 50 +
interfaces/Prolog/SWI/pl_clpq.cc | 48 +
interfaces/Prolog/SWI/pl_clpq.pl | 33 +
.../SWI/ppl_interface_generator_swiprolog_cc.m4 | 72 +
interfaces/Prolog/SWI/ppl_pl.cc | 44 +
interfaces/Prolog/SWI/ppl_prolog_sysdep.hh | 26 +
interfaces/Prolog/SWI/ppl_swiprolog.pl | 24 +
interfaces/Prolog/SWI/swi_cfli.hh | 376 +
interfaces/Prolog/SWI/swi_efli.cc | 86 +
interfaces/Prolog/SWI/swi_efli.hh | 92 +
interfaces/Prolog/SWI/swi_pl_check.pl | 39 +
interfaces/Prolog/SWI/swi_prolog_generated_test.pl | 47 +
interfaces/Prolog/XSB/Makefile.am | 308 +
interfaces/Prolog/XSB/Makefile.in | 1650 +
.../Prolog/XSB/ppl_interface_generator_xsb_H.m4 | 47 +
.../Prolog/XSB/ppl_interface_generator_xsb_cc.m4 | 146 +
.../Prolog/XSB/ppl_interface_generator_xsb_hh.m4 | 39 +
...erface_generator_xsb_prolog_generated_test_P.m4 | 86 +
interfaces/Prolog/XSB/ppl_prolog_sysdep.hh | 27 +
interfaces/Prolog/XSB/xsb_cfli.hh | 351 +
interfaces/Prolog/XSB/xsb_clpq.P | 54 +
interfaces/Prolog/XSB/xsb_clpq2.P | 55 +
interfaces/Prolog/XSB/xsb_efli.cc | 82 +
interfaces/Prolog/XSB/xsb_efli.hh | 89 +
interfaces/Prolog/XSB/xsb_pl_check.P | 205 +
interfaces/Prolog/YAP/Makefile.am | 278 +
interfaces/Prolog/YAP/Makefile.in | 1644 +
interfaces/Prolog/YAP/README.yap | 23 +
.../Prolog/YAP/ppl_interface_generator_yap_cc.m4 | 165 +
interfaces/Prolog/YAP/ppl_prolog_sysdep.hh | 26 +
interfaces/Prolog/YAP/ppl_yap.pl | 24 +
interfaces/Prolog/YAP/yap_cfli.hh | 349 +
interfaces/Prolog/YAP/yap_clpq.pl | 31 +
interfaces/Prolog/YAP/yap_clpq2.pl | 31 +
interfaces/Prolog/YAP/yap_efli.cc | 95 +
interfaces/Prolog/YAP/yap_efli.hh | 91 +
interfaces/Prolog/YAP/yap_pl_check.pl | 35 +
interfaces/Prolog/YAP/yap_prolog_generated_test.pl | 36 +
.../ppl_interface_generator_prolog_cc_code.m4 | 2156 +
.../ppl_interface_generator_prolog_cc_files.m4 | 61 +
.../Prolog/ppl_interface_generator_prolog_dox.m4 | 295 +
.../ppl_interface_generator_prolog_dox_code.m4 | 1191 +
.../ppl_interface_generator_prolog_hh_code.m4 | 631 +
.../ppl_interface_generator_prolog_hh_files.m4 | 71 +
...erface_generator_prolog_procedure_generators.m4 | 133 +
.../ppl_interface_generator_prolog_systems.m4 | 79 +
interfaces/Prolog/ppl_prolog_common.cc | 3115 +
interfaces/Prolog/ppl_prolog_common_defs.hh | 1084 +
interfaces/Prolog/ppl_prolog_common_inlines.hh | 88 +
interfaces/Prolog/tests/Makefile.am | 87 +
interfaces/Prolog/tests/Makefile.in | 611 +
interfaces/Prolog/tests/ack.clpq | 5 +
interfaces/Prolog/tests/ackn.clpq | 6 +
interfaces/Prolog/tests/clpq.pl | 805 +
interfaces/Prolog/tests/clpq2.pl | 1122 +
interfaces/Prolog/tests/expected_clpq2_int16 | 103 +
interfaces/Prolog/tests/expected_clpq2_int16_a | 104 +
interfaces/Prolog/tests/expected_clpq2_int32 | 110 +
interfaces/Prolog/tests/expected_clpq2_int32_a | 103 +
interfaces/Prolog/tests/expected_clpq2_int64 | 110 +
interfaces/Prolog/tests/expected_clpq2_int64_a | 110 +
interfaces/Prolog/tests/expected_clpq2_int8 | 102 +
interfaces/Prolog/tests/expected_clpq2_int8_a | 102 +
interfaces/Prolog/tests/expected_clpq2_mpz | 110 +
interfaces/Prolog/tests/expected_clpq2_mpz_a | 110 +
interfaces/Prolog/tests/expected_clpq_int16 | 36 +
interfaces/Prolog/tests/expected_clpq_int16_a | 36 +
interfaces/Prolog/tests/expected_clpq_int32 | 36 +
interfaces/Prolog/tests/expected_clpq_int32_a | 36 +
interfaces/Prolog/tests/expected_clpq_int64 | 36 +
interfaces/Prolog/tests/expected_clpq_int64_a | 36 +
interfaces/Prolog/tests/expected_clpq_int8 | 30 +
interfaces/Prolog/tests/expected_clpq_int8_a | 30 +
interfaces/Prolog/tests/expected_clpq_mpz | 36 +
interfaces/Prolog/tests/expected_clpq_mpz_a | 36 +
interfaces/Prolog/tests/expected_pchk_int16 | 1 +
interfaces/Prolog/tests/expected_pchk_int16_a | 1 +
interfaces/Prolog/tests/expected_pchk_int32 | 1 +
interfaces/Prolog/tests/expected_pchk_int32_a | 1 +
interfaces/Prolog/tests/expected_pchk_int64 | 1 +
interfaces/Prolog/tests/expected_pchk_int64_a | 1 +
interfaces/Prolog/tests/expected_pchk_int8 | 7 +
interfaces/Prolog/tests/expected_pchk_int8_a | 7 +
interfaces/Prolog/tests/expected_pchk_mpz | 1 +
interfaces/Prolog/tests/expected_pchk_mpz_a | 1 +
interfaces/Prolog/tests/expected_pgt | 1 +
interfaces/Prolog/tests/fib.clpq | 6 +
interfaces/Prolog/tests/mc91.clpq | 6 +
interfaces/Prolog/tests/pl_check.pl | 3610 +
...interface_generator_prolog_generated_test_pl.m4 | 372 +
...face_generator_prolog_generated_test_pl_code.m4 | 1974 +
.../tests/ppl_prolog_generated_test_common.pl | 648 +
interfaces/Prolog/tests/schedule.clpq | 22 +
interfaces/Prolog/tests/script_clpq | 18 +
interfaces/Prolog/tests/script_clpq2 | 36 +
interfaces/Prolog/tests/script_clpq2_int8 | 34 +
interfaces/Prolog/tests/smm.clpq | 31 +
interfaces/Prolog/tests/sumto.clpq | 4 +
interfaces/Prolog/tests/tak.clpq | 20 +
interfaces/interfaced_boxes.hh | 108 +
interfaces/marked_pointers.hh | 64 +
interfaces/ppl_interface_generator_common.m4 | 925 +
interfaces/ppl_interface_generator_common_dat.m4 | 1006 +
...erface_generator_common_procedure_generators.m4 | 140 +
interfaces/ppl_interface_generator_copyright | 21 +
ltmain.sh | 9655 ++
m4/Makefile.am | 59 +
m4/Makefile.in | 637 +
m4/ac_check_ciao.m4 | 89 +
m4/ac_check_classpath.m4 | 63 +
m4/ac_check_fpu_control.m4 | 145 +
m4/ac_check_gmp.m4 | 235 +
m4/ac_check_sicstus_prolog.m4 | 61 +
m4/ac_check_swi_prolog.m4 | 109 +
m4/ac_check_xsb_prolog.m4 | 50 +
m4/ac_check_yap.m4 | 55 +
m4/ac_cxx_attribute_weak.m4 | 59 +
m4/ac_cxx_double_binary_format.m4 | 113 +
m4/ac_cxx_float_binary_format.m4 | 102 +
m4/ac_cxx_ieee_inexact_flag.m4 | 133 +
m4/ac_cxx_limit_memory.m4 | 121 +
m4/ac_cxx_long_double_binary_format.m4 | 353 +
m4/ac_cxx_plain_char_is_signed.m4 | 53 +
m4/ac_cxx_proper_long_double.m4 | 64 +
m4/ac_cxx_zero_length_arrays.m4 | 142 +
m4/ac_prog_jar.m4 | 54 +
m4/ac_prog_java.m4 | 268 +
m4/ac_prog_javac.m4 | 145 +
m4/ac_prog_javah.m4 | 54 +
m4/ac_text_md5sum.m4 | 38 +
m4/libtool.m4 | 7982 ++
m4/ltoptions.m4 | 384 +
m4/ltsugar.m4 | 123 +
m4/ltversion.m4 | 23 +
m4/lt~obsolete.m4 | 98 +
m4/m4.m4 | 46 +
m4/ocaml.m4 | 244 +
m4/ppl.m4 | 288 +
m4/ppl_c.m4 | 286 +
missing | 215 +
mkinstalldirs | 162 +
ppl-config.h.in | 411 +
ppl-config.sed | 71 +
ppl.lsm.in | 45 +
src/BDS_Status_idefs.hh | 117 +
src/BDS_Status_inlines.hh | 268 +
src/BD_Shape.cc | 93 +
src/BD_Shape_defs.hh | 2371 +
src/BD_Shape_inlines.hh | 910 +
src/BD_Shape_templates.hh | 6789 ++
src/BD_Shape_types.hh | 25 +
src/BHRZ03_Certificate.cc | 318 +
src/BHRZ03_Certificate_defs.hh | 118 +
src/BHRZ03_Certificate_inlines.hh | 63 +
src/BHRZ03_Certificate_types.hh | 22 +
src/BUGS.cc.dist | 24 +
src/BUGS.hh.dist | 4 +
src/Bit_Matrix.cc | 265 +
src/Bit_Matrix_defs.hh | 187 +
src/Bit_Matrix_inlines.hh | 149 +
src/Bit_Matrix_types.hh | 22 +
src/Bit_Row.cc | 341 +
src/Bit_Row_defs.hh | 214 +
src/Bit_Row_inlines.hh | 236 +
src/Bit_Row_types.hh | 22 +
src/Boundary_defs.hh | 729 +
src/Box.cc | 63 +
src/Box_Status_idefs.hh | 115 +
src/Box_Status_inlines.hh | 228 +
src/Box_defs.hh | 2286 +
src/Box_inlines.hh | 692 +
src/Box_templates.hh | 4295 +
src/Box_types.hh | 25 +
src/COPYING.cc.dist | 676 +
src/COPYING.hh.dist | 4 +
src/CO_Tree.cc | 1337 +
src/CO_Tree_defs.hh | 1559 +
src/CO_Tree_inlines.hh | 868 +
src/CO_Tree_templates.hh | 141 +
src/CO_Tree_types.hh | 22 +
src/CREDITS.cc.dist | 445 +
src/CREDITS.hh.dist | 4 +
src/C_Integer.hh | 217 +
src/C_Polyhedron.cc | 109 +
src/C_Polyhedron_defs.hh | 291 +
src/C_Polyhedron_inlines.hh | 154 +
src/C_Polyhedron_types.hh | 22 +
src/Cast_Floating_Point_Expression_defs.hh | 182 +
src/Cast_Floating_Point_Expression_inlines.hh | 64 +
src/Cast_Floating_Point_Expression_templates.hh | 46 +
src/Cast_Floating_Point_Expression_types.hh | 23 +
src/Checked_Number.cc | 92 +
src/Checked_Number_defs.hh | 1068 +
src/Checked_Number_inlines.hh | 848 +
src/Checked_Number_templates.hh | 149 +
src/Checked_Number_types.hh | 27 +
src/Coefficient.cc | 64 +
src/Coefficient_defs.hh | 61 +
src/Coefficient_inlines.hh | 72 +
src/Coefficient_traits_template.hh | 39 +
src/Coefficient_types.hh | 182 +
src/Concrete_Expression.cc | 122 +
src/Concrete_Expression_defs.hh | 201 +
src/Concrete_Expression_inlines.hh | 123 +
src/Concrete_Expression_types.hh | 98 +
src/Congruence.cc | 271 +
src/Congruence_System.cc | 471 +
src/Congruence_System_defs.hh | 544 +
src/Congruence_System_inlines.hh | 272 +
src/Congruence_System_types.hh | 22 +
src/Congruence_defs.hh | 506 +
src/Congruence_inlines.hh | 281 +
src/Congruence_types.hh | 22 +
src/Constant_Floating_Point_Expression_defs.hh | 173 +
src/Constant_Floating_Point_Expression_inlines.hh | 80 +
src/Constant_Floating_Point_Expression_types.hh | 23 +
src/Constraint.cc | 460 +
src/Constraint_System.cc | 381 +
src/Constraint_System_defs.hh | 687 +
src/Constraint_System_inlines.hh | 439 +
src/Constraint_System_types.hh | 23 +
src/Constraint_defs.hh | 836 +
src/Constraint_inlines.hh | 577 +
src/Constraint_types.hh | 22 +
src/DB_Matrix_defs.hh | 325 +
src/DB_Matrix_inlines.hh | 330 +
src/DB_Matrix_templates.hh | 319 +
src/DB_Matrix_types.hh | 23 +
src/DB_Row_defs.hh | 470 +
src/DB_Row_inlines.hh | 428 +
src/DB_Row_templates.hh | 215 +
src/DB_Row_types.hh | 26 +
src/Dense_Row.cc | 581 +
src/Dense_Row_defs.hh | 561 +
src/Dense_Row_inlines.hh | 531 +
src/Dense_Row_templates.hh | 56 +
src/Dense_Row_types.hh | 22 +
src/Determinate_defs.hh | 331 +
src/Determinate_inlines.hh | 305 +
src/Determinate_types.hh | 23 +
src/Difference_Floating_Point_Expression_defs.hh | 221 +
...Difference_Floating_Point_Expression_inlines.hh | 70 +
...fference_Floating_Point_Expression_templates.hh | 53 +
src/Difference_Floating_Point_Expression_types.hh | 23 +
src/Division_Floating_Point_Expression_defs.hh | 237 +
src/Division_Floating_Point_Expression_inlines.hh | 69 +
...Division_Floating_Point_Expression_templates.hh | 61 +
src/Division_Floating_Point_Expression_types.hh | 23 +
src/Doubly_Linked_Object_defs.hh | 65 +
src/Doubly_Linked_Object_inlines.hh | 74 +
src/Doubly_Linked_Object_types.hh | 26 +
src/EList_Iterator_defs.hh | 88 +
src/EList_Iterator_inlines.hh | 109 +
src/EList_Iterator_types.hh | 27 +
src/EList_defs.hh | 90 +
src/EList_inlines.hh | 119 +
src/EList_types.hh | 27 +
src/Expression_Adapter_defs.hh | 216 +
src/Expression_Adapter_inlines.hh | 229 +
src/Expression_Adapter_types.hh | 28 +
src/Expression_Hide_Inhomo_defs.hh | 147 +
src/Expression_Hide_Inhomo_inlines.hh | 218 +
src/Expression_Hide_Inhomo_types.hh | 23 +
src/Expression_Hide_Last_defs.hh | 165 +
src/Expression_Hide_Last_inlines.hh | 241 +
src/Expression_Hide_Last_types.hh | 23 +
src/Float.cc | 44 +
src/Float_defs.hh | 523 +
src/Float_inlines.hh | 536 +
src/Float_templates.hh | 167 +
src/Floating_Point_Expression_defs.hh | 212 +
src/Floating_Point_Expression_inlines.hh | 55 +
src/Floating_Point_Expression_templates.hh | 111 +
src/Floating_Point_Expression_types.hh | 23 +
src/GMP_Integer_defs.hh | 134 +
src/GMP_Integer_inlines.hh | 122 +
src/GMP_Integer_types.hh | 45 +
src/Generator.cc | 496 +
src/Generator_System.cc | 805 +
src/Generator_System_defs.hh | 744 +
src/Generator_System_inlines.hh | 411 +
src/Generator_System_types.hh | 23 +
src/Generator_defs.hh | 1033 +
src/Generator_inlines.hh | 709 +
src/Generator_types.hh | 22 +
src/Grid_Certificate.cc | 108 +
src/Grid_Certificate_defs.hh | 104 +
src/Grid_Certificate_inlines.hh | 61 +
src/Grid_Certificate_types.hh | 22 +
src/Grid_Generator.cc | 479 +
src/Grid_Generator_System.cc | 298 +
src/Grid_Generator_System_defs.hh | 514 +
src/Grid_Generator_System_inlines.hh | 279 +
src/Grid_Generator_System_types.hh | 22 +
src/Grid_Generator_defs.hh | 796 +
src/Grid_Generator_inlines.hh | 369 +
src/Grid_Generator_types.hh | 22 +
src/Grid_Status.cc | 245 +
src/Grid_Status_idefs.hh | 168 +
src/Grid_Status_inlines.hh | 217 +
src/Grid_chdims.cc | 477 +
src/Grid_conversion.cc | 511 +
src/Grid_defs.hh | 2665 +
src/Grid_inlines.hh | 383 +
src/Grid_nonpublic.cc | 846 +
src/Grid_public.cc | 2890 +
src/Grid_simplify.cc | 588 +
src/Grid_templates.hh | 339 +
src/Grid_types.hh | 22 +
src/Grid_widenings.cc | 493 +
src/H79_Certificate.cc | 118 +
src/H79_Certificate_defs.hh | 98 +
src/H79_Certificate_inlines.hh | 71 +
src/H79_Certificate_types.hh | 22 +
src/Handler_defs.hh | 96 +
src/Handler_inlines.hh | 66 +
src/Handler_types.hh | 35 +
src/Has_Assign_Or_Swap.hh | 54 +
src/Init.cc | 219 +
src/Init_defs.hh | 100 +
src/Init_inlines.hh | 48 +
src/Init_types.hh | 22 +
src/Integer_Interval.hh | 53 +
src/Interval_Info_defs.hh | 285 +
src/Interval_Info_inlines.hh | 116 +
src/Interval_Info_types.hh | 26 +
src/Interval_defs.hh | 763 +
src/Interval_inlines.hh | 1160 +
src/Interval_templates.hh | 402 +
src/Interval_types.hh | 23 +
src/Linear_Expression.cc | 194 +
src/Linear_Expression_Impl.cc | 468 +
src/Linear_Expression_Impl_defs.hh | 906 +
src/Linear_Expression_Impl_inlines.hh | 282 +
src/Linear_Expression_Impl_templates.hh | 1316 +
src/Linear_Expression_Impl_types.hh | 23 +
src/Linear_Expression_Interface.cc | 35 +
src/Linear_Expression_Interface_defs.hh | 489 +
src/Linear_Expression_Interface_types.hh | 22 +
src/Linear_Expression_defs.hh | 928 +
src/Linear_Expression_inlines.hh | 822 +
src/Linear_Expression_types.hh | 22 +
src/Linear_Form.cc | 26 +
src/Linear_Form_defs.hh | 499 +
src/Linear_Form_inlines.hh | 252 +
src/Linear_Form_templates.hh | 527 +
src/Linear_Form_types.hh | 23 +
src/Linear_System_defs.hh | 582 +
src/Linear_System_inlines.hh | 698 +
src/Linear_System_templates.hh | 930 +
src/Linear_System_types.hh | 26 +
src/MIP_Problem.cc | 2739 +
src/MIP_Problem_defs.hh | 975 +
src/MIP_Problem_inlines.hh | 321 +
src/MIP_Problem_templates.hh | 181 +
src/MIP_Problem_types.hh | 33 +
src/Makefile.am | 699 +
src/Makefile.in | 1783 +
src/Matrix_defs.hh | 437 +
src/Matrix_inlines.hh | 200 +
src/Matrix_templates.hh | 202 +
src/Matrix_types.hh | 23 +
...ultiplication_Floating_Point_Expression_defs.hh | 251 +
...iplication_Floating_Point_Expression_inlines.hh | 71 +
...lication_Floating_Point_Expression_templates.hh | 109 +
...ltiplication_Floating_Point_Expression_types.hh | 23 +
src/NNC_Polyhedron.cc | 88 +
src/NNC_Polyhedron_defs.hh | 267 +
src/NNC_Polyhedron_inlines.hh | 158 +
src/NNC_Polyhedron_types.hh | 22 +
src/Numeric_Format_defs.hh | 38 +
src/OR_Matrix_defs.hh | 610 +
src/OR_Matrix_inlines.hh | 751 +
src/OR_Matrix_templates.hh | 124 +
src/OR_Matrix_types.hh | 23 +
src/Octagonal_Shape.cc | 104 +
src/Octagonal_Shape_defs.hh | 2324 +
src/Octagonal_Shape_inlines.hh | 892 +
src/Octagonal_Shape_templates.hh | 8115 ++
src/Octagonal_Shape_types.hh | 25 +
src/Og_Status_idefs.hh | 112 +
src/Og_Status_inlines.hh | 225 +
src/Opposite_Floating_Point_Expression_defs.hh | 193 +
src/Opposite_Floating_Point_Expression_inlines.hh | 79 +
src/Opposite_Floating_Point_Expression_types.hh | 23 +
src/PIP_Problem.cc | 741 +
src/PIP_Problem_defs.hh | 834 +
src/PIP_Problem_inlines.hh | 96 +
src/PIP_Problem_templates.hh | 81 +
src/PIP_Problem_types.hh | 31 +
src/PIP_Tree.cc | 3809 +
src/PIP_Tree_defs.hh | 836 +
src/PIP_Tree_inlines.hh | 140 +
src/PIP_Tree_types.hh | 26 +
src/Partial_Function.cc | 42 +
src/Partial_Function_defs.hh | 87 +
src/Partial_Function_inlines.hh | 90 +
src/Partial_Function_types.hh | 22 +
src/Partially_Reduced_Product_defs.hh | 1689 +
src/Partially_Reduced_Product_inlines.hh | 815 +
src/Partially_Reduced_Product_templates.hh | 710 +
src/Partially_Reduced_Product_types.hh | 38 +
src/Pending_Element_defs.hh | 77 +
src/Pending_Element_inlines.hh | 85 +
src/Pending_Element_types.hh | 31 +
src/Pending_List_defs.hh | 79 +
src/Pending_List_inlines.hh | 82 +
src/Pending_List_templates.hh | 96 +
src/Pending_List_types.hh | 31 +
src/Ph_Status.cc | 245 +
src/Ph_Status_idefs.hh | 183 +
src/Ph_Status_inlines.hh | 217 +
src/Pointset_Powerset.cc | 344 +
src/Pointset_Powerset_defs.hh | 1449 +
src/Pointset_Powerset_inlines.hh | 320 +
src/Pointset_Powerset_templates.hh | 1610 +
src/Pointset_Powerset_types.hh | 23 +
src/Poly_Con_Relation.cc | 76 +
src/Poly_Con_Relation_defs.hh | 166 +
src/Poly_Con_Relation_inlines.hh | 100 +
src/Poly_Con_Relation_types.hh | 22 +
src/Poly_Gen_Relation.cc | 64 +
src/Poly_Gen_Relation_defs.hh | 139 +
src/Poly_Gen_Relation_inlines.hh | 85 +
src/Poly_Gen_Relation_types.hh | 22 +
src/Polyhedron_chdims.cc | 477 +
src/Polyhedron_chdims_templates.hh | 63 +
src/Polyhedron_conversion_templates.hh | 925 +
src/Polyhedron_defs.hh | 2863 +
src/Polyhedron_inlines.hh | 459 +
src/Polyhedron_minimize_templates.hh | 437 +
src/Polyhedron_nonpublic.cc | 2597 +
src/Polyhedron_public.cc | 3747 +
src/Polyhedron_simplify_templates.hh | 340 +
src/Polyhedron_templates.hh | 579 +
src/Polyhedron_types.hh | 22 +
src/Polyhedron_widenings.cc | 875 +
src/Powerset_defs.hh | 450 +
src/Powerset_inlines.hh | 231 +
src/Powerset_templates.hh | 312 +
src/Powerset_types.hh | 23 +
src/Ptr_Iterator_defs.hh | 172 +
src/Ptr_Iterator_inlines.hh | 189 +
src/Ptr_Iterator_types.hh | 27 +
src/Rational_Box.hh | 39 +
src/Rational_Interval.hh | 54 +
src/Result_defs.hh | 195 +
src/Result_inlines.hh | 102 +
src/Rounding_Dir_defs.hh | 124 +
src/Rounding_Dir_inlines.hh | 141 +
src/Scalar_Products.cc | 120 +
src/Scalar_Products_defs.hh | 227 +
src/Scalar_Products_inlines.hh | 163 +
src/Scalar_Products_types.hh | 24 +
src/Slow_Copy.hh | 61 +
src/Sparse_Row.cc | 1093 +
src/Sparse_Row_defs.hh | 930 +
src/Sparse_Row_inlines.hh | 378 +
src/Sparse_Row_templates.hh | 153 +
src/Sparse_Row_types.hh | 22 +
src/Sum_Floating_Point_Expression_defs.hh | 213 +
src/Sum_Floating_Point_Expression_inlines.hh | 70 +
src/Sum_Floating_Point_Expression_templates.hh | 53 +
src/Sum_Floating_Point_Expression_types.hh | 23 +
src/Swapping_Vector_defs.hh | 98 +
src/Swapping_Vector_inlines.hh | 234 +
src/Swapping_Vector_types.hh | 23 +
src/Temp_defs.hh | 143 +
src/Temp_inlines.hh | 97 +
src/Temp_templates.hh | 34 +
src/Threshold_Watcher.cc | 27 +
src/Threshold_Watcher_defs.hh | 96 +
src/Threshold_Watcher_inlines.hh | 66 +
src/Threshold_Watcher_templates.hh | 72 +
src/Threshold_Watcher_types.hh | 23 +
src/Time.cc | 32 +
src/Time_defs.hh | 126 +
src/Time_inlines.hh | 155 +
src/Time_types.hh | 30 +
src/Topology_types.hh | 29 +
src/Variable.cc | 53 +
src/Variable_Floating_Point_Expression_defs.hh | 187 +
src/Variable_Floating_Point_Expression_inlines.hh | 94 +
src/Variable_Floating_Point_Expression_types.hh | 23 +
src/Variable_defs.hh | 157 +
src/Variable_inlines.hh | 100 +
src/Variable_types.hh | 22 +
src/Variables_Set.cc | 92 +
src/Variables_Set_defs.hh | 107 +
src/Variables_Set_inlines.hh | 75 +
src/Variables_Set_types.hh | 22 +
src/WRD_coefficient_types_defs.hh | 153 +
src/WRD_coefficient_types_inlines.hh | 43 +
src/Watchdog.cc | 250 +
src/Watchdog_defs.hh | 148 +
src/Watchdog_inlines.hh | 101 +
src/Watchdog_types.hh | 22 +
src/Weight_Profiler.cc | 80 +
src/Weight_Profiler_defs.hh | 154 +
src/Widening_Function_defs.hh | 127 +
src/Widening_Function_inlines.hh | 75 +
src/Widening_Function_types.hh | 26 +
src/algorithms.hh | 72 +
src/assert.cc | 52 +
src/assert.hh | 150 +
src/assign_or_swap.hh | 71 +
src/c_streambuf.cc | 107 +
src/c_streambuf_defs.hh | 127 +
src/c_streambuf_inlines.hh | 40 +
src/c_streambuf_types.hh | 22 +
src/checked.cc | 500 +
src/checked_defs.hh | 716 +
src/checked_ext_inlines.hh | 923 +
src/checked_float_inlines.hh | 1234 +
src/checked_inlines.hh | 658 +
src/checked_int_inlines.hh | 1952 +
src/checked_mpq_inlines.hh | 542 +
src/checked_mpz_inlines.hh | 645 +
src/checked_numeric_limits.hh | 167 +
src/compiler.hh | 224 +
src/distances_defs.hh | 54 +
src/distances_inlines.hh | 113 +
src/distances_types.hh | 29 +
src/fpu-c99_inlines.hh | 100 +
src/fpu-ia32.cc | 75 +
src/fpu-ia32_inlines.hh | 203 +
src/fpu-none_inlines.hh | 75 +
src/fpu-sparc_inlines.hh | 77 +
src/fpu_defs.hh | 104 +
src/fpu_types.hh | 27 +
src/globals.cc | 59 +
src/globals_defs.hh | 569 +
src/globals_inlines.hh | 190 +
src/globals_types.hh | 214 +
src/initializer.hh | 62 +
src/intervals_defs.hh | 473 +
src/iterator_to_const_defs.hh | 221 +
src/iterator_to_const_inlines.hh | 202 +
src/iterator_to_const_types.hh | 26 +
src/linearize.hh | 871 +
src/math_utilities_defs.hh | 110 +
src/math_utilities_inlines.hh | 120 +
src/max_space_dimension.hh | 77 +
src/meta_programming.hh | 341 +
src/mp_std_bits.cc | 78 +
src/mp_std_bits_defs.hh | 175 +
src/mp_std_bits_inlines.hh | 38 +
src/namespaces.hh | 184 +
src/ppl-config.cc.in | 734 +
src/ppl.hh.dist | 107456 ++++++++++++++++++
src/ppl_header.hh | 121 +
src/stdiobuf.cc | 84 +
src/stdiobuf_defs.hh | 111 +
src/stdiobuf_inlines.hh | 36 +
src/stdiobuf_types.hh | 22 +
src/swapping_sort_templates.hh | 179 +
src/termination.cc | 935 +
src/termination_defs.hh | 502 +
src/termination_templates.hh | 552 +
src/termination_types.hh | 22 +
src/version.cc | 108 +
src/version.hh.in | 98 +
src/wrap_assign.hh | 380 +
src/wrap_string.cc | 95 +
src/wrap_string.hh | 60 +
test-driver | 127 +
tests/BD_Shape/Makefile.am | 319 +
tests/BD_Shape/Makefile.in | 1868 +
tests/BD_Shape/addconstraints1.cc | 182 +
tests/BD_Shape/addspacedims1.cc | 334 +
tests/BD_Shape/affinedimension1.cc | 307 +
tests/BD_Shape/affineimage1.cc | 443 +
tests/BD_Shape/affineimage2.cc | 352 +
tests/BD_Shape/affinepreimage1.cc | 455 +
tests/BD_Shape/ascii_dump_load1.cc | 247 +
tests/BD_Shape/bgp99extrapolation1.cc | 94 +
tests/BD_Shape/bhmz05widening1.cc | 344 +
tests/BD_Shape/bhz03widening1.cc | 77 +
tests/BD_Shape/bounded1.cc | 97 +
tests/BD_Shape/boundedaffineimage1.cc | 488 +
tests/BD_Shape/boundedaffinepreimage1.cc | 381 +
tests/BD_Shape/bounds1.cc | 273 +
tests/BD_Shape/cc76extrapolation1.cc | 489 +
tests/BD_Shape/cc76narrowing1.cc | 217 +
tests/BD_Shape/closure1.cc | 600 +
tests/BD_Shape/concatenate1.cc | 204 +
tests/BD_Shape/congruences1.cc | 220 +
tests/BD_Shape/constrains1.cc | 229 +
tests/BD_Shape/constraints1.cc | 197 +
tests/BD_Shape/contains1.cc | 203 +
tests/BD_Shape/containsintegerpoint1.cc | 138 +
tests/BD_Shape/difference1.cc | 279 +
tests/BD_Shape/discrete1.cc | 215 +
tests/BD_Shape/disjoint1.cc | 193 +
tests/BD_Shape/dropsomenonintegerpoints1.cc | 356 +
tests/BD_Shape/empty1.cc | 207 +
tests/BD_Shape/equality1.cc | 132 +
tests/BD_Shape/expandspacedim1.cc | 246 +
tests/BD_Shape/foldspacedims1.cc | 338 +
tests/BD_Shape/frequency1.cc | 279 +
tests/BD_Shape/frombdshape1.cc | 147 +
tests/BD_Shape/frombox1.cc | 375 +
tests/BD_Shape/fromgensys1.cc | 156 +
tests/BD_Shape/fromgrid1.cc | 223 +
tests/BD_Shape/fromoctagonalshape1.cc | 81 +
tests/BD_Shape/frompolyhedron1.cc | 65 +
tests/BD_Shape/fromspacedim1.cc | 123 +
tests/BD_Shape/generalizedaffineimage1.cc | 591 +
tests/BD_Shape/generalizedaffineimage2.cc | 518 +
tests/BD_Shape/generalizedaffinepreimage1.cc | 477 +
tests/BD_Shape/generalizedaffinepreimage2.cc | 610 +
tests/BD_Shape/generalizedaffinepreimage3.cc | 174 +
tests/BD_Shape/geomcovers1.cc | 72 +
tests/BD_Shape/h79widening1.cc | 63 +
tests/BD_Shape/integerupperboundifexact1.cc | 388 +
tests/BD_Shape/intersection1.cc | 365 +
tests/BD_Shape/limitedbhmz05extrapolation1.cc | 527 +
tests/BD_Shape/limitedcc76extrapolation1.cc | 539 +
tests/BD_Shape/limitedh79extrapolation1.cc | 71 +
tests/BD_Shape/mapspacedims1.cc | 293 +
tests/BD_Shape/max_min1.cc | 781 +
tests/BD_Shape/max_min2.cc | 440 +
tests/BD_Shape/maxspacedim1.cc | 96 +
tests/BD_Shape/membytes1.cc | 241 +
tests/BD_Shape/minconstraints1.cc | 95 +
tests/BD_Shape/relations1.cc | 471 +
tests/BD_Shape/relations2.cc | 445 +
tests/BD_Shape/relations3.cc | 464 +
tests/BD_Shape/relations4.cc | 436 +
tests/BD_Shape/removespacedims1.cc | 388 +
tests/BD_Shape/run_tests | 54 +
tests/BD_Shape/simplifyusingcontext1.cc | 306 +
tests/BD_Shape/timeelapse1.cc | 243 +
tests/BD_Shape/unconstrain1.cc | 251 +
tests/BD_Shape/universe1.cc | 90 +
tests/BD_Shape/upperbound1.cc | 281 +
tests/BD_Shape/upperboundifexact1.cc | 376 +
tests/BD_Shape/wrap1.cc | 120 +
tests/BD_Shape/writebdshape1.cc | 127 +
tests/Box/Makefile.am | 330 +
tests/Box/Makefile.in | 1957 +
tests/Box/addconstraints1.cc | 290 +
tests/Box/addspacedims1.cc | 333 +
tests/Box/affinedimension1.cc | 292 +
tests/Box/affineimage1.cc | 429 +
tests/Box/affinepreimage1.cc | 178 +
tests/Box/ascii_dump_load1.cc | 254 +
tests/Box/bgp99extrapolation1.cc | 86 +
tests/Box/bhz03widening1.cc | 79 +
tests/Box/bounded1.cc | 97 +
tests/Box/boundedaffineimage1.cc | 516 +
tests/Box/boundedaffinepreimage1.cc | 519 +
tests/Box/cc76narrowing1.cc | 207 +
tests/Box/cc76widening.cc | 120 +
tests/Box/concatenate1.cc | 225 +
tests/Box/congruences1.cc | 378 +
tests/Box/constrains1.cc | 188 +
tests/Box/constraints1.cc | 162 +
tests/Box/contains1.cc | 177 +
tests/Box/containsintegerpoint1.cc | 220 +
tests/Box/difference1.cc | 514 +
tests/Box/discrete1.cc | 204 +
tests/Box/disjoint1.cc | 189 +
tests/Box/empty1.cc | 226 +
tests/Box/equality1.cc | 131 +
tests/Box/expandspacedim1.cc | 232 +
tests/Box/foldspacedims1.cc | 269 +
tests/Box/frequency1.cc | 231 +
tests/Box/frombdshape1.cc | 88 +
tests/Box/frombox1.cc | 161 +
tests/Box/fromgensys1.cc | 182 +
tests/Box/fromgrid1.cc | 512 +
tests/Box/frompartiallyreducedproduct1.cc | 137 +
tests/Box/frompolyhedron1.cc | 511 +
tests/Box/frompolyhedron2.cc | 131 +
tests/Box/fromspacedim1.cc | 111 +
tests/Box/generalizedaffineimage1.cc | 605 +
tests/Box/generalizedaffineimage2.cc | 609 +
tests/Box/generalizedaffinepreimage1.cc | 475 +
tests/Box/geomcovers1.cc | 72 +
tests/Box/intersection1.cc | 442 +
tests/Box/interval1.cc | 224 +
tests/Box/limitedcc76extrapolation1.cc | 317 +
tests/Box/mapspacedims1.cc | 280 +
tests/Box/max_min1.cc | 762 +
tests/Box/maxspacedim1.cc | 59 +
tests/Box/membytes1.cc | 129 +
tests/Box/minconstraints1.cc | 95 +
tests/Box/propagateconstraints1.cc | 211 +
tests/Box/propagateconstraints2.cc | 454 +
tests/Box/refinewithcongruence1.cc | 197 +
tests/Box/refinewithcongruences1.cc | 388 +
tests/Box/refinewithconstraint1.cc | 151 +
tests/Box/refinewithconstraint2.cc | 79 +
tests/Box/refinewithconstraints1.cc | 436 +
tests/Box/refinewithconstraints2.cc | 447 +
tests/Box/relations1.cc | 465 +
tests/Box/relations2.cc | 442 +
tests/Box/relations3.cc | 402 +
tests/Box/relations4.cc | 487 +
tests/Box/removespacedims1.cc | 356 +
tests/Box/run_tests | 54 +
tests/Box/simplifyusingcontext1.cc | 306 +
tests/Box/timeelapse1.cc | 207 +
tests/Box/topclosed1.cc | 206 +
tests/Box/unconstrain1.cc | 248 +
tests/Box/universe1.cc | 87 +
tests/Box/upperbound1.cc | 251 +
tests/Box/upperboundifexact1.cc | 311 +
tests/Box/wrap1.cc | 202 +
tests/Box/writebox1.cc | 76 +
tests/CO_Tree/Makefile.am | 78 +
tests/CO_Tree/Makefile.in | 1105 +
tests/CO_Tree/cotree1.cc | 2496 +
tests/Concrete_Expression/C_Expr.cc | 32 +
tests/Concrete_Expression/C_Expr_defs.hh | 257 +
tests/Concrete_Expression/C_Expr_inlines.hh | 187 +
tests/Concrete_Expression/Makefile.am | 181 +
tests/Concrete_Expression/Makefile.in | 1059 +
tests/Concrete_Expression/bdshape1.cc | 335 +
tests/Concrete_Expression/bdshape2.cc | 571 +
tests/Concrete_Expression/digitalfilters1.cc | 1121 +
tests/Concrete_Expression/linearform1.cc | 342 +
tests/Concrete_Expression/linearize.cc | 326 +
tests/Concrete_Expression/octagonalshape1.cc | 347 +
tests/Concrete_Expression/octagonalshape2.cc | 464 +
tests/Concrete_Expression/polyhedron1.cc | 278 +
tests/Concrete_Expression/polyhedron2.cc | 247 +
tests/Concrete_Expression/run_tests | 56 +
tests/Grid/Makefile.am | 310 +
tests/Grid/Makefile.in | 3108 +
tests/Grid/addcongruence1.cc | 129 +
tests/Grid/addcongruences1.cc | 332 +
tests/Grid/addconstraint1.cc | 241 +
tests/Grid/addconstraints1.cc | 347 +
tests/Grid/addgenerator1.cc | 330 +
tests/Grid/addgenerators1.cc | 223 +
tests/Grid/addspacedims1.cc | 532 +
tests/Grid/affinedim1.cc | 322 +
tests/Grid/affineimage1.cc | 390 +
tests/Grid/affineimage2.cc | 398 +
tests/Grid/affinepreimage1.cc | 429 +
tests/Grid/affinepreimage2.cc | 363 +
tests/Grid/approximatepartition1.cc | 103 +
tests/Grid/asciidumpload1.cc | 633 +
tests/Grid/asciidumpload2.cc | 495 +
tests/Grid/asciidumpload3.cc | 124 +
tests/Grid/asciidumpload4.cc | 145 +
tests/Grid/asciidumpload5.cc | 155 +
tests/Grid/asciidumpload6.cc | 145 +
tests/Grid/bhz03widening1.cc | 113 +
tests/Grid/bounded1.cc | 392 +
tests/Grid/boundedaffineimage1.cc | 185 +
tests/Grid/boundedaffinepreimage1.cc | 185 +
tests/Grid/bounds1.cc | 459 +
tests/Grid/certificate1.cc | 229 +
tests/Grid/concatenate1.cc | 341 +
tests/Grid/congruence1.cc | 459 +
tests/Grid/congruences1.cc | 403 +
tests/Grid/congruences2.cc | 337 +
tests/Grid/constraints1.cc | 354 +
tests/Grid/contains1.cc | 214 +
tests/Grid/containsintegerpoint1.cc | 290 +
tests/Grid/discrete1.cc | 342 +
tests/Grid/disjoint1.cc | 255 +
tests/Grid/dropnonintegerpoints1.cc | 323 +
tests/Grid/equals1.cc | 286 +
tests/Grid/expandspacedim1.cc | 239 +
tests/Grid/foldspacedims1.cc | 401 +
tests/Grid/frequency1.cc | 349 +
tests/Grid/frombdshape1.cc | 77 +
tests/Grid/frombox1.cc | 77 +
tests/Grid/fromgrid1.cc | 102 +
tests/Grid/fromoctagonalshape1.cc | 77 +
tests/Grid/frompolyhedron1.cc | 343 +
tests/Grid/generalizedaffineimage1.cc | 556 +
tests/Grid/generalizedaffineimage2.cc | 544 +
tests/Grid/generalizedaffineimage3.cc | 377 +
tests/Grid/generalizedaffinepreimage1.cc | 540 +
tests/Grid/generalizedaffinepreimage2.cc | 321 +
tests/Grid/generalizedaffinepreimage3.cc | 462 +
tests/Grid/generator1.cc | 483 +
tests/Grid/generators1.cc | 471 +
tests/Grid/generators2.cc | 56 +
tests/Grid/grid1.cc | 839 +
tests/Grid/grid2.cc | 634 +
tests/Grid/grid3.cc | 275 +
tests/Grid/griddifference1.cc | 350 +
tests/Grid/intersection1.cc | 316 +
tests/Grid/isempty1.cc | 294 +
tests/Grid/isuniverse1.cc | 322 +
tests/Grid/limitedextrapolation1.cc | 495 +
tests/Grid/limitedextrapolation2.cc | 499 +
tests/Grid/limitedextrapolation3.cc | 499 +
tests/Grid/mapspacedims1.cc | 314 +
tests/Grid/maxmin1.cc | 519 +
tests/Grid/membytes1.cc | 277 +
tests/Grid/mincongruences1.cc | 222 +
tests/Grid/mingenerators1.cc | 241 +
tests/Grid/outputoperator1.cc | 141 +
tests/Grid/outputoperator2.cc | 100 +
tests/Grid/outputoperator3.cc | 91 +
tests/Grid/partition1.cc | 101 +
tests/Grid/powersetdifference1.cc | 315 +
tests/Grid/powersetgeometricallycovers1.cc | 181 +
tests/Grid/powersetgeometricallyequals1.cc | 114 +
tests/Grid/refinewithcongruences1.cc | 211 +
tests/Grid/refinewithconstraints1.cc | 208 +
tests/Grid/relations1.cc | 367 +
tests/Grid/relations2.cc | 424 +
tests/Grid/relations3.cc | 487 +
tests/Grid/removespacedims1.cc | 350 +
tests/Grid/removespacedims2.cc | 280 +
tests/Grid/simplifyusingcontext1.cc | 501 +
tests/Grid/timeelapse1.cc | 341 +
tests/Grid/topclosed1.cc | 337 +
tests/Grid/topclosure1.cc | 94 +
tests/Grid/unconstrain1.cc | 252 +
tests/Grid/upperbound1.cc | 335 +
tests/Grid/upperbound2.cc | 341 +
tests/Grid/widening1.cc | 598 +
tests/Grid/widening2.cc | 486 +
tests/Grid/widening3.cc | 315 +
tests/Grid/wrap1.cc | 564 +
tests/Grid/writecongruencesystem.cc | 63 +
tests/MIP_Problem/Makefile.am | 98 +
tests/MIP_Problem/Makefile.in | 1213 +
tests/MIP_Problem/ascii_dump_load1.cc | 418 +
tests/MIP_Problem/exceptions1.cc | 508 +
tests/MIP_Problem/mipproblem1.cc | 1696 +
tests/MIP_Problem/mipproblem2.cc | 176 +
tests/MIP_Problem/mipproblem3.cc | 900 +
tests/MIP_Problem/mipproblem4.cc | 55 +
tests/Makefile.am | 59 +
tests/Makefile.in | 861 +
tests/Octagonal_Shape/Makefile.am | 319 +
tests/Octagonal_Shape/Makefile.in | 1870 +
tests/Octagonal_Shape/addspacedims1.cc | 235 +
tests/Octagonal_Shape/affinedimension1.cc | 306 +
tests/Octagonal_Shape/affineimage1.cc | 542 +
tests/Octagonal_Shape/affineimage2.cc | 554 +
tests/Octagonal_Shape/affinepreimage1.cc | 294 +
tests/Octagonal_Shape/affinepreimage2.cc | 426 +
tests/Octagonal_Shape/ascii_dump_load1.cc | 331 +
tests/Octagonal_Shape/bhmz05widening1.cc | 709 +
tests/Octagonal_Shape/bhz03widening1.cc | 77 +
tests/Octagonal_Shape/bounded1.cc | 133 +
tests/Octagonal_Shape/boundedaffineimage1.cc | 602 +
tests/Octagonal_Shape/boundedaffinepreimage1.cc | 573 +
tests/Octagonal_Shape/bounds1.cc | 312 +
tests/Octagonal_Shape/cc76extrapolation1.cc | 517 +
tests/Octagonal_Shape/cc76narrowing1.cc | 265 +
tests/Octagonal_Shape/chinainit.cc | 76 +
tests/Octagonal_Shape/concatenate1.cc | 283 +
tests/Octagonal_Shape/congruences1.cc | 200 +
tests/Octagonal_Shape/constrains1.cc | 232 +
tests/Octagonal_Shape/constraints1.cc | 376 +
tests/Octagonal_Shape/contains1.cc | 373 +
tests/Octagonal_Shape/containsintegerpoint1.cc | 199 +
tests/Octagonal_Shape/difference1.cc | 258 +
tests/Octagonal_Shape/discrete1.cc | 213 +
tests/Octagonal_Shape/disjoint1.cc | 190 +
tests/Octagonal_Shape/dropsomenonintegerpoints1.cc | 358 +
tests/Octagonal_Shape/empty1.cc | 131 +
tests/Octagonal_Shape/expandspacedim1.cc | 295 +
tests/Octagonal_Shape/foldspacedims1.cc | 442 +
tests/Octagonal_Shape/frequency1.cc | 361 +
tests/Octagonal_Shape/frombdshape1.cc | 55 +
tests/Octagonal_Shape/frombox1.cc | 358 +
tests/Octagonal_Shape/fromgensys1.cc | 271 +
tests/Octagonal_Shape/fromgrid1.cc | 202 +
tests/Octagonal_Shape/fromoctagonalshape1.cc | 133 +
tests/Octagonal_Shape/frompolyhedron1.cc | 245 +
tests/Octagonal_Shape/fromspacedim1.cc | 123 +
tests/Octagonal_Shape/generalizedaffineimage1.cc | 604 +
tests/Octagonal_Shape/generalizedaffineimage2.cc | 357 +
tests/Octagonal_Shape/generalizedaffineimage3.cc | 593 +
tests/Octagonal_Shape/generalizedaffineimage4.cc | 381 +
tests/Octagonal_Shape/generalizedaffineimage5.cc | 344 +
.../Octagonal_Shape/generalizedaffinepreimage1.cc | 618 +
.../Octagonal_Shape/generalizedaffinepreimage2.cc | 620 +
.../Octagonal_Shape/generalizedaffinepreimage3.cc | 618 +
.../Octagonal_Shape/generalizedaffinepreimage4.cc | 638 +
tests/Octagonal_Shape/integerupperboundifexact1.cc | 462 +
tests/Octagonal_Shape/intersection1.cc | 309 +
.../Octagonal_Shape/limitedbhmz05extrapolation1.cc | 340 +
tests/Octagonal_Shape/limitedcc76extrapolation1.cc | 661 +
tests/Octagonal_Shape/mapspacedims1.cc | 255 +
tests/Octagonal_Shape/max_min1.cc | 691 +
tests/Octagonal_Shape/max_min2.cc | 311 +
tests/Octagonal_Shape/maxspacedim1.cc | 99 +
tests/Octagonal_Shape/membytes1.cc | 233 +
tests/Octagonal_Shape/minconstraints1.cc | 135 +
tests/Octagonal_Shape/relatwithcons1.cc | 596 +
tests/Octagonal_Shape/relatwithcons2.cc | 477 +
tests/Octagonal_Shape/relatwithcons3.cc | 509 +
tests/Octagonal_Shape/relatwithgen1.cc | 497 +
tests/Octagonal_Shape/removespacedims1.cc | 375 +
tests/Octagonal_Shape/run_tests | 54 +
tests/Octagonal_Shape/simplifyusingcontext1.cc | 340 +
tests/Octagonal_Shape/timeelapse1.cc | 372 +
tests/Octagonal_Shape/unconstrain1.cc | 251 +
tests/Octagonal_Shape/universe1.cc | 112 +
tests/Octagonal_Shape/upperbound1.cc | 391 +
tests/Octagonal_Shape/upperboundifexact1.cc | 424 +
tests/Octagonal_Shape/wrap1.cc | 406 +
tests/Octagonal_Shape/writeoctagon1.cc | 211 +
tests/PIP_Problem/Makefile.am | 94 +
tests/PIP_Problem/Makefile.in | 1214 +
tests/PIP_Problem/ascii_dump_load1.cc | 295 +
tests/PIP_Problem/exceptions1.cc | 383 +
tests/PIP_Problem/pipproblem1.cc | 813 +
tests/PIP_Problem/pipproblem2.cc | 349 +
tests/PIP_Problem/pipproblem3.cc | 179 +
tests/PIP_Problem/weightwatch1.cc | 187 +
tests/Partially_Reduced_Product/Makefile.am | 228 +
tests/Partially_Reduced_Product/Makefile.in | 2234 +
tests/Partially_Reduced_Product/addcongruences1.cc | 101 +
tests/Partially_Reduced_Product/affineimage1.cc | 89 +
tests/Partially_Reduced_Product/asciidumpload1.cc | 240 +
tests/Partially_Reduced_Product/bounded1.cc | 58 +
.../boundedaffineimage1.cc | 270 +
tests/Partially_Reduced_Product/bounds1.cc | 688 +
tests/Partially_Reduced_Product/concatenate1.cc | 71 +
tests/Partially_Reduced_Product/congruences1.cc | 96 +
.../congruencesproduct1.cc | 281 +
tests/Partially_Reduced_Product/constraints1.cc | 99 +
.../constraintsproduct1.cc | 553 +
tests/Partially_Reduced_Product/contains1.cc | 103 +
tests/Partially_Reduced_Product/difference1.cc | 141 +
tests/Partially_Reduced_Product/dimension1.cc | 84 +
tests/Partially_Reduced_Product/directproduct1.cc | 117 +
tests/Partially_Reduced_Product/discrete1.cc | 101 +
tests/Partially_Reduced_Product/disjoint1.cc | 163 +
.../dropsomenonintegerpoints1.cc | 132 +
tests/Partially_Reduced_Product/equals1.cc | 83 +
tests/Partially_Reduced_Product/frombdshape1.cc | 65 +
tests/Partially_Reduced_Product/frombox1.cc | 87 +
tests/Partially_Reduced_Product/fromgrid1.cc | 62 +
.../fromoctagonalshape1.cc | 65 +
tests/Partially_Reduced_Product/frompolyhedron1.cc | 120 +
tests/Partially_Reduced_Product/fromproduct1.cc | 179 +
.../generalizedaffineimage1.cc | 262 +
tests/Partially_Reduced_Product/intersection1.cc | 125 +
tests/Partially_Reduced_Product/isempty1.cc | 95 +
tests/Partially_Reduced_Product/isuniverse1.cc | 84 +
tests/Partially_Reduced_Product/maxmin1.cc | 249 +
.../partially_reduced_product_test.hh | 30 +
.../refinewithcongruences1.cc | 265 +
.../refinewithconstraints1.cc | 342 +
tests/Partially_Reduced_Product/relations1.cc | 316 +
.../shapepreservingproduct1.cc | 152 +
tests/Partially_Reduced_Product/smashproduct1.cc | 660 +
tests/Partially_Reduced_Product/spacedims1.cc | 287 +
tests/Partially_Reduced_Product/timeelapse1.cc | 116 +
tests/Partially_Reduced_Product/topclosed1.cc | 95 +
tests/Partially_Reduced_Product/topclosure1.cc | 68 +
tests/Partially_Reduced_Product/upperbound1.cc | 191 +
tests/Polyhedron/Makefile.am | 724 +
tests/Polyhedron/Makefile.in | 6944 ++
tests/Polyhedron/addcongruence1.cc | 234 +
tests/Polyhedron/addcongruences1.cc | 251 +
tests/Polyhedron/addconstraint1.cc | 106 +
tests/Polyhedron/addconstraints1.cc | 361 +
tests/Polyhedron/addconstraints2.cc | 94 +
tests/Polyhedron/addgenerator1.cc | 118 +
tests/Polyhedron/addgenerator2.cc | 130 +
tests/Polyhedron/addgenerators1.cc | 354 +
tests/Polyhedron/addgenerators2.cc | 138 +
tests/Polyhedron/addspacedims1.cc | 202 +
tests/Polyhedron/addspacedims2.cc | 249 +
tests/Polyhedron/affineimage1.cc | 266 +
tests/Polyhedron/affineimage2.cc | 75 +
tests/Polyhedron/affinepreimage1.cc | 438 +
tests/Polyhedron/affinetrans.cc | 82 +
tests/Polyhedron/append1.cc | 113 +
tests/Polyhedron/append2.cc | 132 +
tests/Polyhedron/ascii_dump_load1.cc | 602 +
tests/Polyhedron/ascii_dump_load2.cc | 139 +
tests/Polyhedron/ascii_dump_load3.cc | 434 +
tests/Polyhedron/bgp99extrapolation1.cc | 160 +
tests/Polyhedron/bgp99extrapolation2.cc | 256 +
tests/Polyhedron/bhrz03widening1.cc | 755 +
tests/Polyhedron/bhrz03widening2.cc | 262 +
tests/Polyhedron/bhrz03widening3.cc | 649 +
tests/Polyhedron/bhz03widening1.cc | 724 +
tests/Polyhedron/bounded1.cc | 107 +
tests/Polyhedron/boundedaffineimage1.cc | 250 +
tests/Polyhedron/boundedaffinepreimage1.cc | 125 +
tests/Polyhedron/boundedbhrz03extrapolation1.cc | 153 +
tests/Polyhedron/boundedh79extrapolation1.cc | 81 +
tests/Polyhedron/bounds1.cc | 65 +
tests/Polyhedron/cnncconversion1.cc | 154 +
tests/Polyhedron/concatenate1.cc | 284 +
tests/Polyhedron/congruences1.cc | 365 +
tests/Polyhedron/constrains1.cc | 233 +
tests/Polyhedron/constraints1.cc | 166 +
tests/Polyhedron/contains1.cc | 115 +
tests/Polyhedron/contains2.cc | 177 +
tests/Polyhedron/containsintegerpoint1.cc | 176 +
tests/Polyhedron/disjoint1.cc | 146 +
tests/Polyhedron/disjoint2.cc | 133 +
tests/Polyhedron/dropsomenonintegerpoints1.cc | 175 +
tests/Polyhedron/dropsomenonintegerpoints2.cc | 196 +
tests/Polyhedron/dualhypercubes.cc | 392 +
tests/Polyhedron/empty1.cc | 51 +
tests/Polyhedron/equals1.cc | 62 +
tests/Polyhedron/exceptions1.cc | 1463 +
tests/Polyhedron/exceptions2.cc | 910 +
tests/Polyhedron/exceptions3.cc | 235 +
tests/Polyhedron/expandspacedim1.cc | 269 +
tests/Polyhedron/expandspacedim2.cc | 103 +
tests/Polyhedron/foldspacedims1.cc | 337 +
tests/Polyhedron/foldspacedims2.cc | 231 +
tests/Polyhedron/frequency1.cc | 232 +
tests/Polyhedron/frombdshape1.cc | 57 +
tests/Polyhedron/frombox1.cc | 259 +
tests/Polyhedron/frombox2.cc | 112 +
tests/Polyhedron/fromgrid1.cc | 202 +
tests/Polyhedron/fromoctagonalshape1.cc | 56 +
tests/Polyhedron/generalizedaffineimage1.cc | 269 +
tests/Polyhedron/generalizedaffineimage2.cc | 560 +
tests/Polyhedron/generalizedaffinepreimage1.cc | 124 +
tests/Polyhedron/generalizedaffinepreimage2.cc | 64 +
tests/Polyhedron/generators1.cc | 235 +
tests/Polyhedron/geomcovers1.cc | 61 +
tests/Polyhedron/h79widening1.cc | 246 +
tests/Polyhedron/h79widening2.cc | 64 +
tests/Polyhedron/hybrid.cc | 865 +
tests/Polyhedron/intersection1.cc | 513 +
tests/Polyhedron/limitedbhrz03extrapolation1.cc | 68 +
tests/Polyhedron/limitedh79extrapolation1.cc | 274 +
tests/Polyhedron/linearexpression1.cc | 138 +
tests/Polyhedron/linearpartition1.cc | 332 +
tests/Polyhedron/linearsystem1.cc | 109 +
tests/Polyhedron/mapspacedims1.cc | 482 +
tests/Polyhedron/matrix1.cc | 322 +
tests/Polyhedron/max_min1.cc | 205 +
tests/Polyhedron/maxspacedim1.cc | 137 +
tests/Polyhedron/mc91.cc | 118 +
tests/Polyhedron/membytes1.cc | 292 +
tests/Polyhedron/memory1.cc | 220 +
tests/Polyhedron/memory2.cc | 259 +
tests/Polyhedron/minconstraints1.cc | 78 +
tests/Polyhedron/minconstraints2.cc | 71 +
tests/Polyhedron/mingenerators1.cc | 86 +
tests/Polyhedron/mingenerators2.cc | 49 +
tests/Polyhedron/nncminimize1.cc | 380 +
tests/Polyhedron/nncminimize2.cc | 81 +
tests/Polyhedron/nncpostimeelapse1.cc | 432 +
tests/Polyhedron/numberinput1.cc | 354 +
tests/Polyhedron/onepoint.cc | 57 +
tests/Polyhedron/permute.cc | 223 +
tests/Polyhedron/polydifference1.cc | 206 +
tests/Polyhedron/polydifference2.cc | 176 +
tests/Polyhedron/polyhull1.cc | 400 +
tests/Polyhedron/polyhull2.cc | 59 +
tests/Polyhedron/polyhullifexact1.cc | 465 +
tests/Polyhedron/polyhullifexact2.cc | 471 +
tests/Polyhedron/randphull1.cc | 201 +
tests/Polyhedron/refinewithcongruence1.cc | 106 +
tests/Polyhedron/refinewithcongruences1.cc | 337 +
tests/Polyhedron/refinewithconstraint1.cc | 109 +
tests/Polyhedron/refinewithconstraints1.cc | 323 +
tests/Polyhedron/relations1.cc | 485 +
tests/Polyhedron/relations2.cc | 227 +
tests/Polyhedron/relations3.cc | 317 +
tests/Polyhedron/removespacedims1.cc | 299 +
tests/Polyhedron/removespacedims2.cc | 99 +
tests/Polyhedron/simplifyusingcontext1.cc | 489 +
tests/Polyhedron/smm1.cc | 152 +
tests/Polyhedron/sparserow1.cc | 626 +
tests/Polyhedron/termination1.cc | 536 +
tests/Polyhedron/termination2.cc | 178 +
tests/Polyhedron/timeelapse1.cc | 251 +
tests/Polyhedron/timeelapse2.cc | 133 +
tests/Polyhedron/topclosed1.cc | 96 +
tests/Polyhedron/topclosure1.cc | 161 +
tests/Polyhedron/unconstrain1.cc | 251 +
tests/Polyhedron/universe1.cc | 165 +
tests/Polyhedron/universe2.cc | 80 +
tests/Polyhedron/variablesset1.cc | 160 +
tests/Polyhedron/watchdog1.cc | 141 +
tests/Polyhedron/weightwatch1.cc | 232 +
tests/Polyhedron/wrap1.cc | 626 +
tests/Polyhedron/wrap2.cc | 99 +
tests/Polyhedron/writeconsys1.cc | 83 +
tests/Polyhedron/writegensys1.cc | 90 +
tests/Polyhedron/writepolyhedron1.cc | 70 +
tests/Polyhedron/writepolyhedron2.cc | 67 +
tests/Polyhedron/writerelation1.cc | 109 +
tests/Polyhedron/writevariable1.cc | 104 +
tests/Powerset/Makefile.am | 192 +
tests/Powerset/Makefile.in | 1932 +
tests/Powerset/addcongruences1.cc | 68 +
tests/Powerset/addconstraints1.cc | 69 +
tests/Powerset/affinedimension1.cc | 139 +
tests/Powerset/affineimage1.cc | 240 +
tests/Powerset/affinepreimage1.cc | 172 +
tests/Powerset/bounded1.cc | 78 +
tests/Powerset/bounds1.cc | 97 +
tests/Powerset/closed1.cc | 100 +
tests/Powerset/closure1.cc | 59 +
tests/Powerset/collapse1.cc | 95 +
tests/Powerset/concatenate1.cc | 75 +
tests/Powerset/contains1.cc | 109 +
tests/Powerset/containsintegerpoint1.cc | 132 +
tests/Powerset/difference1.cc | 151 +
tests/Powerset/discrete1.cc | 80 +
tests/Powerset/disjoint1.cc | 117 +
tests/Powerset/disjunct1.cc | 311 +
tests/Powerset/empty1.cc | 142 +
tests/Powerset/entails1.cc | 73 +
tests/Powerset/equals1.cc | 79 +
tests/Powerset/frombdshape1.cc | 425 +
tests/Powerset/frombox1.cc | 421 +
tests/Powerset/fromcongruences1.cc | 78 +
tests/Powerset/fromconstraints1.cc | 182 +
tests/Powerset/fromgrid1.cc | 435 +
tests/Powerset/fromoctagonalshape1.cc | 432 +
tests/Powerset/frompolyhedron1.cc | 741 +
tests/Powerset/fromspacedimension1.cc | 102 +
tests/Powerset/intersection1.cc | 106 +
tests/Powerset/maxmin1.cc | 400 +
tests/Powerset/meet1.cc | 95 +
tests/Powerset/membytes1.cc | 69 +
tests/Powerset/powerset1.cc | 178 +
tests/Powerset/reduce1.cc | 81 +
tests/Powerset/refinewith1.cc | 225 +
tests/Powerset/relationwith1.cc | 278 +
tests/Powerset/simplifyusingcontext1.cc | 459 +
tests/Powerset/size1.cc | 75 +
tests/Powerset/spacedims1.cc | 213 +
tests/Powerset/universe1.cc | 104 +
tests/Powerset/upperbound1.cc | 164 +
tests/README | 117 +
tests/Random_Number_Generator_defs.hh | 47 +
tests/Random_Number_Generator_inlines.hh | 92 +
tests/Random_Number_Generator_types.hh | 22 +
tests/Watchdog/Makefile.am | 70 +
tests/Watchdog/Makefile.in | 1097 +
tests/Watchdog/watchdog1.cc | 78 +
tests/files.cc | 51 +
tests/files.hh | 36 +
tests/ppl_test.cc | 487 +
tests/ppl_test.hh | 1159 +
tests/valgrind_suppressions | 18 +
utils/Makefile.am | 61 +
utils/Makefile.in | 752 +
utils/build_header.in | 103 +
utils/cm_cleaner.sh | 35 +
utils/cm_splitter.sh | 34 +
utils/text2cxxarray.in | 76 +
utils/timings.cc | 102 +
utils/timings.hh | 32 +
1627 files changed, 833682 insertions(+)
diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..340a7ba
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,22 @@
+
+The PPL developers encourage you to report any bugs you find using the
+bug tracking system available at https://www.cs.unipr.it/mantis/ .
+Here `bug' should be interpreted in its broadest sense: outright
+software errors, misfeatures, bad interfaces, missing or unclear
+documentation... whatever is a subject for possible improvement.
+
+As far as software bugs are concerned, the best reports are those that
+are reproducible. Including (or pointing us to) code that exhibits
+the reported misbehavior is the best thing you can do to help us fix
+the library. Of course, this is not always possible and we will
+welcome any kind of bug report. Anyway, you may be interested to read
+http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report
+bugs effectively.
+
+
+KNOWN BUGS
+==========
+
+All known bugs were resolved before the release. It is likely that
+there are still bugs in the released version. Any bugs found after
+the release will be listed at http://bugseng.com/products/ppl/Bugs/ .
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 0000000..a0947c9
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,443 @@
+
+Authors
+=======
+
+The Parma Polyhedra Library and its documentation is being designed,
+extended, written, debugged, maintained and improved by the following
+people:
+
+
+Core Development Team:
+----------------------
+
+ Roberto Bagnara [1] (BUGSENG srl and University of Parma)
+ Patricia M. Hill [2] (BUGSENG srl and University of Leeds)
+ Enea Zaffanella [3] (BUGSENG srl and University of Parma)
+ Abramo Bagnara (BUGSENG srl)
+
+
+Former Members of the Core Development Team:
+--------------------------------------------
+
+ Elisa Ricci (former student of the University of Parma,
+ one of the four students with which the PPL
+ project started) has been a major contributor
+ to the development of the PPL, up until
+ December 2002.
+
+
+Current Contributors:
+---------------------
+
+ Massimo Benerecetti (University of Naples) is working on additional
+ operators on polyhedra.
+
+ Andrea Cimino (former student of the University of Parma)
+ wrote most of the mixed integer programming
+ solver, and also most of the Java and OCaml
+ interfaces. He keeps helping us, especially
+ with the web site.
+
+ Marco Faella (University of Naples) is working on additional
+ operators on polyhedra.
+
+ Stefano Minopoli (University of Naples) is working on additional
+ operators on polyhedra.
+
+ Marco Poletti (student of the University of Bologna)
+ implemented the sparse matrices that are used
+ in the MIP and PIP solvers of the PPL; he also
+ did experiments on the parallelization of the
+ sparse matrices' computations; he is now working
+ on improving the PPL's memory footprint and
+ on other improvements to the library.
+
+ Alessandro Zaccagnini [4] (University of Parma) has helped with
+ the efficient implementation of GCD and LCM
+ for checked numbers. He is now working on the
+ definitions of interval arithmetic operations.
+ Alessandro is always a very valuable source of
+ mathematical advice.
+
+
+Past Contributors:
+------------------
+
+ Roberto Amadini (former student of the University of Parma)
+ did some work on the PPL support for the
+ approximation of floating point computations.
+
+ Irene Bacchi (former student of the University of Parma) worked
+ on a development branch where she implemented
+ several variants of algorithms, checking
+ whether or not the set-union of two polyhedra
+ is the same as their poly-hull.
+
+ Fabio Biselli (student of the University of Parma)
+ did some work on the PPL support for the
+ approximation of floating point computations.
+
+ Fabio Bossi (former student of the University of Parma)
+ worked on the PPL support for the approximation
+ of floating point computations.
+
+ Danilo Bonardi (former student of the University of Parma) worked
+ on a development branch where he experimented
+ with the use of metaprogramming techniques
+ based on expression templates. The objective
+ of this work was to check the effectiveness of
+ these techniques for moving computations from
+ run-time to compile-time.
+
+ Sara Bonini (former student of the University of Parma) is
+ one of the four students with which the PPL
+ project started.
+
+ Katy Dobson (former student of the University of Leeds)
+ worked on the formalization and definition of
+ algorithms for rational grids and products
+ of grids and polyhedra.
+
+ Giordano Fracasso (former student of the University of Parma) wrote
+ the initial version of the support for native
+ and checked integer coefficients.
+
+ Francois Galea [5] (University of Versailles) worked
+ at the implementation of the Parametric Integer
+ Programming solver.
+
+ Maximiliano Marchesi (former student of the University of Parma)
+ helped a little to improve the documentation for
+ bounded differences.
+
+ Elena Mazzi (former student of the University of Parma) worked
+ on our implementation of bounded differences
+ and octagons. She also participated in the
+ theoretical and practical work concerning
+ widening operators for weakly relational
+ domains.
+
+ David Merchat (formerly at the University of Parma) helped us
+ with the generation of the library's documentation
+ using Doxygen.
+
+ Matthew Mundell [6] (formerly at the University of Leeds) worked
+ on the implementation of rational grids. He has
+ also helped on other implementation issues.
+
+ Andrea Pescetti (former student of the University of Parma) was one
+ of the four students with which the PPL
+ project started. Later, he helped a little
+ with the library's documentation.
+
+ Barbara Quartieri (former student of the University of Parma) worked
+ on our implementation of bounded differences and
+ octagons.
+
+ Enric Rodriguez Carbonell [7] (Technical University of Catalonia)
+ worked at the implementation of polynomial spaces.
+
+ Angela Stazzone (former student of the University of Parma)
+ worked on the library's documentation.
+
+ Fabio Trabucchi (former student of the University of Parma) worked
+ on a development branch where he added
+ serializers for all the objects of the PPL.
+ Support for serialization based on Fabio's
+ work will be available in a future release of
+ the library.
+
+ Claudio Trento (former student of the University of Pisa) did
+ a small amount of work on an experimental OCaml
+ interface for the PPL.
+
+ Tatiana Zolo (former student of the University of Parma) is
+ one of the four students with which the PPL
+ project started.
+
+
+
+Thanks!
+=======
+
+
+People:
+-------
+
+ Lucia Alessandrini (University of Parma) provided 4 hour-long
+ lectures on convex polyhedra for the Italian
+ authors. This was crucial for us to acquire
+ and/or refresh the notions needed for
+ developing the PPL library.
+
+
+ Frederic Besson [8] provided useful comments and observations on
+ the ideas (about an extrapolation operator for
+ convex polyhedra) sketched in a paper he
+ coauthored in 1999.
+
+ Tevfik Bultan [9] (University of California, Santa Barbara)
+ suggested us to add support for generalized
+ affine transfer functions. Discussions with
+ Tevfik have been very useful.
+
+ Manuel Carro
+ Jose Morales [9, 10] members of the CLIP Group [12], helped us
+ to produce a Ciao Prolog [13] interface for the
+ library. The decisive (and memorable) debugging
+ session took place in Parma in the afternoon of
+ March 10th, 2003, with the participation of
+ Jose Manuel Gomez.
+
+ Marco Comini [14] (University of Udine) allows us to use his
+ Mac OS X machine to work on portability to
+ that platform.
+
+ Goran Frehse [15] (VERIMAG, formerly at Carnegie Mellon University)
+ provided very useful feedback while he was
+ developing PHAVer [16]. We are working with
+ Goran in order to include more polyhedra
+ simplification facilities in the PPL.
+
+ Denis Gopan [17] (University of Wisconsin-Madison) helped us
+ extend the library with the "expand space
+ dimension" and "fold space dimensions"
+ operations of the library.
+
+ Martin Guy [18] gave us access to his ARM machine: without
+ this possibility, porting the PPL to the ARM's
+ ABIs would have taken ages.
+
+ Bruno Haible [19] (ILOG) helped us in our first steps towards
+ using versions of the GMP library installed in
+ nonstandard places.
+
+ Bertrand Jeannet [20] (IRISA) wrote the New Polka library [21]
+ and made it available. We had several
+ interesting exchanges with Bertrand concerning
+ various aspects of polyhedra manipulation.
+
+ Herve Le Verge (r.i.p.) wrote and published an implementation
+ [22] of the Chernikova's algorithm [23] that
+ has set the stage for subsequent
+ implementation work, including our own.
+
+ Francesco Logozzo [24] (formerly at Ecole Polytechnique) helped us
+ straighten out some portability issues on Cygwin.
+
+ Kenneth MacKenzie [25] provided very good bug reports that allowed
+ us to fix several problems in the OCaml interface.
+
+ Costantino Medori [26] (University of Parma) helped us on some
+ mathematical aspects of the development.
+
+ Fred Mesnard [27] (University of La Reunion), the main author
+ of cTI [28], has worked with us on one of the
+ first applications of the PPL: the "cTI"
+ data-flow analyzer, which performs a linear
+ size relation analysis using a domain of
+ convex polyhedra. The China data-flow
+ analyzer [29] uses the Parma Polyhedra Library
+ to perform the same analysis. We have been
+ running China against an old version of cTI
+ that did not use the PPL, using it to
+ analyze the same Prolog programs. Since these
+ systems did not share a single line of code,
+ this gave us excellent opportunities for our
+ initial testing and debugging work. Fred has
+ also helped us to port the PPL to Mac OS X.
+
+ Ken Mixter (then at Carnegie Mellon University) provided
+ useful feedback while working on an
+ experimental version of the Action Language
+ Verifier [30] based on the PPL.
+
+ Sebastian Pop [31] (now at AMD). During his work on interfacing
+ CLooG [32] with the PPL, Sebastian provided
+ valuable feedback, particularly on the C
+ interface to the PPL. He also suggested the
+ addition of new functionality such as the
+ "simplify using context" operation.
+
+ Thomas Reps [33] (University of Wisconsin-Madison), on several
+ occasions we have had interesting discussions
+ with him both on the PPL and on the more
+ general topics of static analysis and
+ numerical abstractions.
+
+ Mooly Sagiv [34] (Tel-Aviv University) stimulated the development
+ of the PPL by providing, in particular,
+ interesting challenges related to precision
+ and scalability.
+
+ Sriram Sankaranarayanan [35] (NEC Laboratories America, formerly at
+ Stanford University) provided very useful feedback
+ while developing StInG [36] and LPInv [37].
+
+ Axel Simon [38] (ENS, formerly at the University of Kent
+ at Canterbury) wrote some PPL 0.9
+ bindings [44] for the Glasgow Haskell Compiler.
+
+ Fausto Spoto [39] (University of Verona) did useful beta testing
+ for the Java interface. He also suggested the
+ addition of the <EM>hash code</EM> operations.
+
+ Basile Starynkevitch [40] (CEA LIST/DTSI/SOL). Basile is the author
+ of MELT [41] and suggested several improvements
+ to the PPL.
+
+
+ Pedro Vasconcelos [42] (formerly at the University of St Andrews, UK)
+ provided useful feedback while developing his
+ size and cost analyzer for Core Hume [43].
+ Pedro also solved a problem of Axel Simon's
+ PPL 0.9 bindings for the GHC and makes them
+ publicly available [44].
+
+ Ralf Wildenhues [45] (University of Bonn) helped us with
+ several issues concerning the proper use of
+ the Autotools.
+
+
+Organizations (and People Therein):
+-----------------------------------
+
+We are grateful for the following contributions:
+
+- AMD Developer Central [46] has donated a bi-quad core machine with
+ the latest AMD Opteron 2384 "Shanghai" processors and 16GB of RAM.
+ This machine now hosts all the PPL data and services. Many thanks
+ to Christophe Harle and Sebastian Pop.
+
+- The Computing Center of the University of Parma [47] allowed us to
+ test the portability of the library on a variety of platforms.
+ Fausto Pagani was especially helpful in this respect.
+
+- The GCC Compile Farm Project [48] managed by FSF France provided
+ access to a number of machines that allowed us to test and improve
+ the portability of the library. Special thanks go to Laurent Guerby
+ for his kind assistance.
+
+- The test cluster provided by Hewlett Packard and hosted by ESIEE [49]
+ allowed us to complete the porting of the PPL to the IA64 and PA-RISC
+ architectures. Many thanks to Thibaut Varene [50] and the PA-RISC
+ Linux community [51] for their kind assistance.
+
+- HiPEAC [52] sponsored the participation of Roberto Bagnara to the
+ Graphite Workshop [53]. This was very helpful to discuss the needs
+ of Graphite [54] (a framework for high-level loop optimizations on
+ the polyhedral model) and, more generally, of GCC [55] in terms of
+ numerical abstractions and how the PPL can help. Special thanks go
+ to Albert Cohen [57] for this sponsorship.
+
+- INRIA [56] supported the work of Abramo Bagnara from January 1st to
+ May 31st, 2009, to work on the PPL and its development
+ infrastructure. Many thanks go, in particular, to Albert Cohen [57].
+
+
+Some of our research work has been partly supported by the following
+projects and organizations:
+
+- University of Parma's FIL scientific research project (ex 60%)
+ ``Pure and Applied Mathematics'';
+
+- MURST project ``Automatic Program Certification by Abstract
+ Interpretation'' [58];
+
+- MURST project ``Abstract Interpretation, Type Systems and Control-Flow
+ Analysis'';
+
+- MURST project ``Automatic Aggregate- and Number-Reasoning for Computing:
+ from Decision Algorithms to Constraint Programming with Multisets, Sets,
+ and Maps'' [59];
+
+- MURST project ``Constraint Based Verification of Reactive Systems'' [60];
+
+- MURST project ``AIDA - Abstract Interpretation: Design and
+ Applications'' [61];
+
+- PRIN project ``AIDA 2007 - Abstract Interpretation: Design and
+ Applications'' [62];
+
+- Integrated Action Italy-Spain 2001-2002 ``Advanced Development Environments
+ for Logic Programs'' [63];
+
+- Royal Society Joint project 2004/R1-EU (UK-Italy)
+ ``Automatic Detection of Unstable Numerical Computations'';
+
+- EPSRC (UK) project EP/C520726/1
+ ``Numerical Domains for Software Analysis'' [64];
+
+- Royal Society International Outgoing Short Visit 2007/R4
+ ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [65];
+
+- EPSRC (UK) project EP/G025177/1
+ ``Geometric Abstractions for Scalable Program Analyzers'' [65].
+
+--------
+
+ [1] http://www.cs.unipr.it/~bagnara/
+ [2] http://www.comp.leeds.ac.uk/hill/
+ [3] http://www.cs.unipr.it/~zaffanella/
+ [4] http://www.math.unipr.it/~zaccagni/
+ [5] http://fgalea.free.fr/
+ [6] http://www.mundell.ukfsn.org/
+ [7] http://www.lsi.upc.edu/~erodri/
+ [8] http://www.irisa.fr/lande/fbesson/fbesson.html
+ [9] http://www.cs.ucsb.edu/~bultan/
+[10] http://www.clip.dia.fi.upm.es/~boris/
+[11] http://clip.dia.fi.upm.es/~jfran/
+[12] http://clip.dia.fi.upm.es/
+[13] http://clip.dia.fi.upm.es/Software/Ciao/
+[14] http://www.dimi.uniud.it/~comini/
+[15] http://www-verimag.imag.fr/~frehse/
+[16] http://www-verimag.imag.fr/~frehse/phaver_web/
+[17] http://www.cs.wisc.edu/~gopan/
+[18] http://martinwguy.co.uk/
+[19] http://www.haible.de/bruno/
+[20] http://www.irisa.fr/prive/Bertrand.Jeannet/
+[21] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
+[22] http://bugseng.com/products/ppl/documentation/chernikova.c
+[23] http://bugseng.com/products/ppl/documentation/bibliography#LeVerge92
+[24] http://research.microsoft.com/~logozzo/
+[25] http://homepages.inf.ed.ac.uk/kwxm/
+[26] http://www.math.unipr.it/~medori/
+[27] http://www.univ-reunion.fr/~fred/
+[28] http://www.cs.unipr.it/cTI/
+[29] http://www.cs.unipr.it/China/
+[30] http://www.cs.ucsb.edu/~bultan/composite/
+[31] http://www-rocq.inria.fr/~pop/
+[32] http://www.cloog.org/
+[33] http://www.cs.wisc.edu/~reps/
+[34] http://www.math.tau.ac.il/~msagiv/
+[35] http://www.nec-labs.com/~srirams/
+[36] http://theory.stanford.edu/~srirams/Software/sting.html
+[37] http://theory.stanford.edu/~srirams/Software/lpinv.html
+[38] http://www.di.ens.fr/~simona/
+[39] http://profs.sci.univr.it/~spoto/
+[40] http://www.starynkevitch.net/Basile/index_en.html
+[41] http://gcc.gnu.org/wiki/MiddleEndLispTranslator
+[42] http://www.ncc.up.pt/~pbv/
+[43] http://www.ncc.up.pt/~pbv/cgi/cost.cgi
+[44] http://www.ncc.up.pt/~pbv/research/ppl/ghc.html
+[45] http://wissrech.ins.uni-bonn.de/people/wildenhues.html
+[46] http://developer.amd.com/
+[47] http://www.siti.unipr.it/
+[48] http://gcc.gnu.org/wiki/CompileFarm
+[49] http://www.esiee.fr/
+[50] http://www.parisc-linux.org/~varenet/
+[51] http://www.parisc-linux.org/
+[52] http://www.hipeac.net/
+[53] http://gcc.gnu.org/wiki/Graphite_Workshop_Nov08
+[54] http://gcc.gnu.org/wiki/Graphite
+[55] http://gcc.gnu.org/
+[56] http://www.inria.fr/
+[57] http://www-rocq.inria.fr/~acohen/
+[58] http://theory.sci.univr.it/p40/
+[59] http://www.cs.unipr.it/Projects/COFIN01
+[60] http://www.disi.unige.it/person/DelzannoG/cover/
+[61] http://www.cs.unipr.it/Projects/AIDA/
+[62] http://www.cs.unipr.it/Projects/AIDA2007/
+[63] http://www.cs.unipr.it/Projects/AzInt2001-2002Sp
+[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/linda.html
+[65] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..ee8e117
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,25507 @@
+2013-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * PPL 1.1 released.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in: Updated.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * src/globals_defs.hh: Worked around a Doxygen bug.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * NEWS: Updated.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * ChangeLog: Updated.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/definitions.dox: Label updated.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/definitions.dox, doc/ppl.bib: BenerecettiFM13 has been
+ published.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Updated.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * tests/Polyhedron/Makefile.am, tests/Polyhedron/{postimeelapse1.cc
+ => nncpostimeelapse1.cc}: Test renamed.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * tests/Polyhedron/postimeelapse1.cc: Improved.
+
+2013-10-28 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-10-27 Patricia Hill <patricia.hill at bugseng.com>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Fixed a bug.
+
+2013-10-27 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: A couple of corrections.
+
+2013-10-27 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Java/tests/Test_Executor.java: Punctuation.
+
+2013-10-27 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4:
+ Corrected.
+
+2013-09-24 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/definitions.dox,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ src/C_Polyhedron.cc, src/C_Polyhedron_defs.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron_defs.hh,
+ src/NNC_Polyhedron_inlines.hh, src/Polyhedron_defs.hh,
+ src/Polyhedron_nonpublic.cc: Interfaced
+ Polyhedron::positive_time_elapse_assign(). Various other
+ improvements.
+
+2013-09-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * src/Polyhedron_defs.hh: Missing comment added.
+
+2013-09-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * src/Polyhedron_nonpublic.cc: Commented-out code removed.
+
+2013-09-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-09-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * : commit 7e6ceed614822e32ec6c9286ea95d2c553cf005b Author: Roberto
+ Bagnara <roberto.bagnara at bugseng.com> Date: Tue Sep 10 10:21:00
+ 2013 +0200
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * Makefile.am: Path fixed.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * demos/ppl_lpsol/Makefile.am, interfaces/C/tests/Makefile.am: Give
+ up on -Werror: it increasingly causes problems. (Thanks to Stephen
+ Montgomery-Smith.)
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * Makefile.am: Directory fixed.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * NEWS: Mention recently fixed Java interface bug. The bug was observed by Gianluca Amato when working (in Java) using
+ a 32 bit build of the PPL. Fixed in commit
+ 30478fbeb75f3e675ec0b3eff32f0a8dd7991f7a
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc: Initialize custom_compare_ext
+ field in structure custom_operations.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * tests/Grid/Makefile.am, tests/Grid/asciidumpload2.cc: Do not clean
+ inexistent dat file. Be consistent in naming dat files in Grid's
+ ascii_dump/load tests.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common_inlines.hh: Convert C++ Variable
+ id's to jlong before passing them to Java methods.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/GNU/gprolog_efli.cc: Adapted to recent versions
+ of GNU Prolog so as to work on 64-bit machines.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Use the serial test harness in
+ these directories.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Automake `subdir-objects' option
+ is not for us.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * compile, config.guess, config.sub, depcomp, missing: Updated.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * test-driver: Put under Git control.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Use the `subdir-objects' Automake
+ option.
+
+2013-05-26 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/tests/C_Polyhedron_test1.java: Fixed typo in the
+ Java interface for method `frequency' and added testcase. Bug
+ reported by Gianluca Amato.
+
+2013-05-16 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * src/Polyhedron_conversion_templates.hh: The documentation details
+ of the Polyhedron::conversion() static method are not meant for the
+ user manual.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * Makefile.am: Path fixed.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * demos/ppl_lpsol/Makefile.am, interfaces/C/tests/Makefile.am: Give
+ up on -Werror: it increasingly causes problems. (Thanks to Stephen
+ Montgomery-Smith.)
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * Makefile.am: Directory fixed.
+
+2013-09-10 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * NEWS: Mention recently fixed Java interface bug. The bug was observed by Gianluca Amato when working (in Java) using
+ a 32 bit build of the PPL. Fixed in commit
+ 30478fbeb75f3e675ec0b3eff32f0a8dd7991f7a
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc: Initialize custom_compare_ext
+ field in structure custom_operations.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * tests/Grid/Makefile.am, tests/Grid/asciidumpload2.cc: Do not clean
+ inexistent dat file. Be consistent in naming dat files in Grid's
+ ascii_dump/load tests.
+
+2013-09-09 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common_inlines.hh: Convert C++ Variable
+ id's to jlong before passing them to Java methods.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/GNU/gprolog_efli.cc: Adapted to recent versions
+ of GNU Prolog so as to work on 64-bit machines.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Use the serial test harness in
+ these directories.
+
+2013-07-03 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Automake `subdir-objects' option
+ is not for us.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * compile, config.guess, config.sub, depcomp, missing: Updated.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * test-driver: Put under Git control.
+
+2013-06-23 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Use the `subdir-objects' Automake
+ option.
+
+2013-05-26 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/tests/C_Polyhedron_test1.java: Fixed typo in the
+ Java interface for method `frequency' and added testcase. Bug
+ reported by Gianluca Amato.
+
+2013-05-16 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * src/Polyhedron_conversion_templates.hh: The documentation details
+ of the Polyhedron::conversion() static method are not meant for the
+ user manual.
+
+2013-05-15 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * : commit b06285533ca60251c4132d1c388c64bdcbea62aa Author: Roberto
+ Bagnara <roberto.bagnara at bugseng.com> Date: Wed May 15 21:42:21
+ 2013 +0200
+
+2013-05-15 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-05-15 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * demos/ppl_lpsol/examples/blend.mps,
+ demos/ppl_lpsol/examples/sample.mps: Converted to free MPS format.
+
+2013-05-13 Marco Faella <marfaella at gmail.com>
+
+ * CREDITS, doc/definitions.dox, doc/ppl.bib, doc/ppl_citations.bib,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/postimeelapse1.cc:
+ Added test cases for the positive time elapse operator. Modified
+ the user manual and the credits in order to acknowledge the new
+ function and its authors, respectively.
+
+2013-05-11 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/devref-language-interface.tex, doc/devref.tex,
+ doc/user-language-interface.tex, doc/user.tex: Apparently, some
+ versions of Doxygen require this line. (Thanks to Matthias Klose.)
+
+2013-04-21 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * src/Dense_Row_defs.hh: Trailing white space removed.
+
+2013-04-04 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * NEWS: Updated.
+
+2013-04-04 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2013-04-04 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/ppl_citations.bib: Fixed capitalization.
+
+2013-04-04 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem_defs.hh,
+ tests/MIP_Problem/mipproblem4.cc: Added a testcase showing an issue
+ in method MIP_Problem::OK(). The method checks for too strong
+ (i.e., invlaid) invariants in the case of a MIP_Problem subject to
+ space dimnesion additions. Modified method OK() to check those
+ invariants on the "internal" space dimension, rather the external
+ one. While at it, modified private method
+ MIP_Problem::process_pending_constraints() to avoid returning a bool
+ value (which is never checked).
+
+2013-03-03 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * src/Partially_Reduced_Product_inlines.hh: Fixed constructor from a
+ different partially reduced product element.
+
+2013-03-03 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * src/Bit_Matrix.cc: Fix indentation.
+
+2013-03-03 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * tests/Box/refinewithcongruences1.cc: Activate a couple of tests
+ that were ignored.
+
+2013-02-27 Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+ * README, STANDARDS, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, src/Any_Pointset_defs.hh,
+ tests/Concrete_Expression/C_Expr_defs.hh: Complete application of
+ systematic file header renaming.
+
+2013-01-30 Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+ * src/Float_defs.hh: Added missing line.
+
+2013-01-21 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/ppl_citations.bib: Obsolete link updated.
+
+2013-01-17 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * : commit fba4b31ebf3179be4fa020f5278d67728b192c8e Author: Roberto
+ Bagnara <roberto.bagnara at bugseng.com> Date: Thu Jan 17 08:59:34
+ 2013 +0100
+
+2013-01-15 Marco Faella <marfaella at gmail.com>
+
+ * : commit a357bc4aefebd03e72ed131a086f966cf7cb65f5 Author: Marco
+ Faella <marfaella at gmail.com> Date: Tue Jan 15 14:34:06 2013 +0100
+
+2013-01-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4:
+ Const-qualify immutable objects. Detected by ECLAIR service
+ cnstpnte.
+
+2013-01-14 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * doc/ppl.bib: Links updated.
+
+2013-01-09 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc: Const-qualify immutable
+ objects. Detected by ECLAIR service cnstpnte.
+
+2013-01-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4: Const-qualify
+ immutable objects. Detected by ECLAIR service cnstpnte.
+
+2013-01-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box_templates.hh, src/CO_Tree.cc,
+ src/Linear_System_inlines.hh, src/MIP_Problem.cc,
+ src/OR_Matrix_inlines.hh, src/Polyhedron_inlines.hh,
+ src/c_streambuf.cc: Const-qualify immutable objects. Detected by
+ ECLAIR service cnstpnte.
+
+2013-01-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator_defs.hh: Missing comments added.
+
+2013-01-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2013-01-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/vocabulary: Typo fixed. (Thanks to Chia-Hsun Cheng and
+ Marco Bodrato.)
+
+2013-01-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree_inlines.hh, src/Constraint.cc,
+ src/Linear_Expression_Impl_templates.hh: Const-qualify immutable
+ objects. Detected by ECLAIR service cnstpnte.
+
+2013-01-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_std_bits.cc, src/mp_std_bits_defs.hh: Typo fixed. (Thanks
+ to Chia-Hsun Cheng and Marco Bodrato.)
+
+2013-01-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Dense_Row.cc, src/Determinate_inlines.hh,
+ src/Grid_Generator.cc, src/Grid_public.cc, src/Interval_inlines.hh,
+ src/Linear_Expression_Impl_templates.hh,
+ src/Linear_System_inlines.hh, src/Linear_System_templates.hh,
+ src/MIP_Problem.cc, src/MIP_Problem_inlines.hh,
+ src/OR_Matrix_inlines.hh, src/PIP_Problem.cc, src/PIP_Tree.cc,
+ src/Partial_Function_inlines.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset_templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_conversion_templates.hh, src/Polyhedron_inlines.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_simplify_templates.hh, src/Polyhedron_widenings.cc,
+ src/Result_inlines.hh, src/Rounding_Dir_inlines.hh,
+ src/Temp_inlines.hh, src/Variable.cc, src/Variables_Set.cc,
+ src/Watchdog.cc, src/c_streambuf.cc, src/checked.cc,
+ src/checked_float_inlines.hh, src/checked_int_inlines.hh,
+ src/checked_mpz_inlines.hh, src/fpu-c99_inlines.hh,
+ src/globals_inlines.hh, src/stdiobuf.cc, src/termination.cc,
+ src/wrap_assign.hh: Const-qualify immutable objects. Detected by
+ ECLAIR service cnstpnte.
+
+2013-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc, src/Boundary_defs.hh,
+ src/C_Polyhedron.cc, src/Congruence_System.cc,
+ src/Congruence_inlines.hh, src/Constraint_System.cc,
+ src/Dense_Row.cc, src/Float_inlines.hh, src/Generator.cc,
+ src/Generator_System.cc, src/Grid_Certificate.cc,
+ src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/Interval_defs.hh, src/Interval_inlines.hh,
+ src/Linear_Expression_Impl_inlines.hh,
+ src/Linear_Expression_Impl_templates.hh,
+ src/Linear_System_inlines.hh, src/Linear_System_templates.hh:
+ Const-qualify immutable objects. Detected by ECLAIR service
+ cnstpnte.
+
+2013-01-01 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ src/Bit_Row.cc, src/Bit_Row_inlines.hh, src/Boundary_defs.hh,
+ src/Box_templates.hh, src/CO_Tree.cc, src/CO_Tree_inlines.hh,
+ src/CO_Tree_templates.hh, src/Concrete_Expression_inlines.hh,
+ src/Congruence.cc, src/Congruence_System.cc, utils/timings.cc:
+ Const-qualify immutable objects. Detected by ECLAIR service
+ cnstpnte.
+
+2013-01-01 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * Makefile.am, NEWS, README, README.alpha, README.arm,
+ README.configure, README.solaris, STANDARDS, configure.ac,
+ debian/libppl-pwl.copyright.in, debian/libppl.copyright.in,
+ demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lcdd/ppl_lcdd.1,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+ demos/ppl_lpsol/examples/Makefile.am, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+ demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+ demos/ppl_pips/ppl_pips_extra_man_text,
+ devtools/bump_copyright_years, devtools/generate_dox_biblio,
+ devtools/generate_man_pages, devtools/print_nonascii_lines,
+ devtools/update_ChangeLog, doc/Makefile.am, doc/README.doc,
+ doc/definitions.dox, doc/devref-language-interface.tex,
+ doc/devref.tex, doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text, doc/ppl.bib, doc/ppl.sty,
+ doc/ppl_citations.bib, doc/user-language-interface.tex,
+ doc/user.tex, fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh,
+ instchk.hh, interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common_defs.hh,
+ interfaces/C/ppl_c_implementation_common_inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/Makefile.am, interfaces/Java/README.java,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common_defs.hh,
+ interfaces/Java/jni/ppl_java_common_inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+ a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+ java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ , interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+ va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Custom_Variable_Stringifier.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/Variable_Output_test1.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/README.ocaml,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common_defs.hh,
+ interfaces/OCaml/ppl_ocaml_common_inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/README.ciao,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+ d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_configured_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox,
+ interfaces/Prolog/Prolog_interface_sysdep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+ test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/README.yap,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common_defs.hh,
+ interfaces/Prolog/ppl_prolog_common_inlines.hh,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+ m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+ m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+ m4/ac_cxx_zero_length_arrays.m4, m4/ac_prog_jar.m4,
+ m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+ m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4, src/Affine_Space.cc,
+ src/Affine_Space_defs.hh, src/Affine_Space_inlines.hh,
+ src/Affine_Space_types.hh, src/Any_Pointset_defs.hh,
+ src/Any_Pointset_inlines.hh, src/Any_Pointset_types.hh,
+ src/Ask_Tell_defs.hh, src/Ask_Tell_inlines.hh,
+ src/Ask_Tell_templates.hh, src/Ask_Tell_types.hh,
+ src/BDS_Status_idefs.hh, src/BDS_Status_inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape_defs.hh, src/BD_Shape_inlines.hh,
+ src/BD_Shape_templates.hh, src/BD_Shape_types.hh,
+ src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate_defs.hh,
+ src/BHRZ03_Certificate_inlines.hh, src/BHRZ03_Certificate_types.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix_defs.hh,
+ src/Bit_Matrix_inlines.hh, src/Bit_Matrix_types.hh, src/Bit_Row.cc,
+ src/Bit_Row_defs.hh, src/Bit_Row_inlines.hh, src/Bit_Row_types.hh,
+ src/Boundary_defs.hh, src/Box.cc, src/Box_Status_idefs.hh,
+ src/Box_Status_inlines.hh, src/Box_defs.hh, src/Box_inlines.hh,
+ src/Box_templates.hh, src/Box_types.hh, src/CO_Tree.cc,
+ src/CO_Tree_defs.hh, src/CO_Tree_inlines.hh,
+ src/CO_Tree_templates.hh, src/CO_Tree_types.hh, src/C_Integer.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron_defs.hh,
+ src/C_Polyhedron_inlines.hh, src/C_Polyhedron_types.hh,
+ src/Cast_Floating_Point_Expression_defs.hh,
+ src/Cast_Floating_Point_Expression_inlines.hh,
+ src/Cast_Floating_Point_Expression_templates.hh,
+ src/Cast_Floating_Point_Expression_types.hh, src/Checked_Number.cc,
+ src/Checked_Number_defs.hh, src/Checked_Number_inlines.hh,
+ src/Checked_Number_templates.hh, src/Checked_Number_types.hh,
+ src/Coefficient.cc, src/Coefficient_defs.hh,
+ src/Coefficient_inlines.hh, src/Coefficient_traits_template.hh,
+ src/Coefficient_types.hh, src/Concrete_Expression.cc,
+ src/Concrete_Expression_defs.hh,
+ src/Concrete_Expression_inlines.hh,
+ src/Concrete_Expression_types.hh, src/Congruence.cc,
+ src/Congruence_System.cc, src/Congruence_System_defs.hh,
+ src/Congruence_System_inlines.hh, src/Congruence_System_types.hh,
+ src/Congruence_defs.hh, src/Congruence_inlines.hh,
+ src/Congruence_types.hh,
+ src/Constant_Floating_Point_Expression_defs.hh,
+ src/Constant_Floating_Point_Expression_inlines.hh,
+ src/Constant_Floating_Point_Expression_types.hh, src/Constraint.cc,
+ src/Constraint_System.cc, src/Constraint_System_defs.hh,
+ src/Constraint_System_inlines.hh, src/Constraint_System_types.hh,
+ src/Constraint_defs.hh, src/Constraint_inlines.hh,
+ src/Constraint_types.hh, src/DB_Matrix_defs.hh,
+ src/DB_Matrix_inlines.hh, src/DB_Matrix_templates.hh,
+ src/DB_Matrix_types.hh, src/DB_Row_defs.hh, src/DB_Row_inlines.hh,
+ src/DB_Row_templates.hh, src/DB_Row_types.hh, src/Dense_Row.cc,
+ src/Dense_Row_defs.hh, src/Dense_Row_inlines.hh,
+ src/Dense_Row_templates.hh, src/Dense_Row_types.hh,
+ src/Determinate_defs.hh, src/Determinate_inlines.hh,
+ src/Determinate_types.hh,
+ src/Difference_Floating_Point_Expression_defs.hh,
+ src/Difference_Floating_Point_Expression_inlines.hh,
+ src/Difference_Floating_Point_Expression_templates.hh,
+ src/Difference_Floating_Point_Expression_types.hh,
+ src/Division_Floating_Point_Expression_defs.hh,
+ src/Division_Floating_Point_Expression_inlines.hh,
+ src/Division_Floating_Point_Expression_templates.hh,
+ src/Division_Floating_Point_Expression_types.hh,
+ src/Doubly_Linked_Object_defs.hh,
+ src/Doubly_Linked_Object_inlines.hh,
+ src/Doubly_Linked_Object_types.hh, src/EList_Iterator_defs.hh,
+ src/EList_Iterator_inlines.hh, src/EList_Iterator_types.hh,
+ src/EList_defs.hh, src/EList_inlines.hh, src/EList_types.hh,
+ src/Expression_Adapter_defs.hh, src/Expression_Adapter_inlines.hh,
+ src/Expression_Adapter_types.hh,
+ src/Expression_Hide_Inhomo_defs.hh,
+ src/Expression_Hide_Inhomo_inlines.hh,
+ src/Expression_Hide_Inhomo_types.hh,
+ src/Expression_Hide_Last_defs.hh,
+ src/Expression_Hide_Last_inlines.hh,
+ src/Expression_Hide_Last_types.hh, src/Float.cc, src/Float_defs.hh,
+ src/Float_inlines.hh, src/Float_templates.hh,
+ src/Floating_Point_Expression_defs.hh,
+ src/Floating_Point_Expression_inlines.hh,
+ src/Floating_Point_Expression_templates.hh,
+ src/Floating_Point_Expression_types.hh, src/GMP_Integer_defs.hh,
+ src/GMP_Integer_inlines.hh, src/GMP_Integer_types.hh,
+ src/Generator.cc, src/Generator_System.cc,
+ src/Generator_System_defs.hh, src/Generator_System_inlines.hh,
+ src/Generator_System_types.hh, src/Generator_defs.hh,
+ src/Generator_inlines.hh, src/Generator_types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate_defs.hh,
+ src/Grid_Certificate_inlines.hh, src/Grid_Certificate_types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System_defs.hh,
+ src/Grid_Generator_System_inlines.hh,
+ src/Grid_Generator_System_types.hh, src/Grid_Generator_defs.hh,
+ src/Grid_Generator_inlines.hh, src/Grid_Generator_types.hh,
+ src/Grid_Status.cc, src/Grid_Status_idefs.hh,
+ src/Grid_Status_inlines.hh, src/Grid_chdims.cc,
+ src/Grid_conversion.cc, src/Grid_defs.hh, src/Grid_inlines.hh,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_templates.hh, src/Grid_types.hh, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate_defs.hh,
+ src/H79_Certificate_inlines.hh, src/H79_Certificate_types.hh,
+ src/Handler_defs.hh, src/Handler_inlines.hh, src/Handler_types.hh,
+ src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init_defs.hh,
+ src/Init_inlines.hh, src/Init_types.hh, src/Integer_Interval.hh,
+ src/Interval_Info_defs.hh, src/Interval_Info_inlines.hh,
+ src/Interval_Info_types.hh, src/Interval_defs.hh,
+ src/Interval_inlines.hh, src/Interval_templates.hh,
+ src/Interval_types.hh, src/Linear_Expression.cc,
+ src/Linear_Expression_Impl.cc, src/Linear_Expression_Impl_defs.hh,
+ src/Linear_Expression_Impl_inlines.hh,
+ src/Linear_Expression_Impl_templates.hh,
+ src/Linear_Expression_Impl_types.hh,
+ src/Linear_Expression_Interface.cc,
+ src/Linear_Expression_Interface_defs.hh,
+ src/Linear_Expression_Interface_types.hh,
+ src/Linear_Expression_defs.hh, src/Linear_Expression_inlines.hh,
+ src/Linear_Expression_types.hh, src/Linear_Form.cc,
+ src/Linear_Form_defs.hh, src/Linear_Form_inlines.hh,
+ src/Linear_Form_templates.hh, src/Linear_Form_types.hh,
+ src/Linear_System_defs.hh, src/Linear_System_inlines.hh,
+ src/Linear_System_templates.hh, src/Linear_System_types.hh,
+ src/MIP_Problem.cc, src/MIP_Problem_defs.hh,
+ src/MIP_Problem_inlines.hh, src/MIP_Problem_templates.hh,
+ src/MIP_Problem_types.hh, src/Makefile.am, src/Matrix_defs.hh,
+ src/Matrix_inlines.hh, src/Matrix_templates.hh,
+ src/Matrix_types.hh,
+ src/Multiplication_Floating_Point_Expression_defs.hh,
+ src/Multiplication_Floating_Point_Expression_inlines.hh,
+ src/Multiplication_Floating_Point_Expression_templates.hh,
+ src/Multiplication_Floating_Point_Expression_types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron_defs.hh,
+ src/NNC_Polyhedron_inlines.hh, src/NNC_Polyhedron_types.hh,
+ src/Numeric_Format_defs.hh, src/OR_Matrix_defs.hh,
+ src/OR_Matrix_inlines.hh, src/OR_Matrix_templates.hh,
+ src/OR_Matrix_types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape_defs.hh, src/Octagonal_Shape_inlines.hh,
+ src/Octagonal_Shape_templates.hh, src/Octagonal_Shape_types.hh,
+ src/Og_Status_idefs.hh, src/Og_Status_inlines.hh,
+ src/Opposite_Floating_Point_Expression_defs.hh,
+ src/Opposite_Floating_Point_Expression_inlines.hh,
+ src/Opposite_Floating_Point_Expression_types.hh,
+ src/PIP_Problem.cc, src/PIP_Problem_defs.hh,
+ src/PIP_Problem_inlines.hh, src/PIP_Problem_templates.hh,
+ src/PIP_Problem_types.hh, src/PIP_Tree.cc, src/PIP_Tree_defs.hh,
+ src/PIP_Tree_inlines.hh, src/PIP_Tree_types.hh,
+ src/Partial_Function.cc, src/Partial_Function_defs.hh,
+ src/Partial_Function_inlines.hh, src/Partial_Function_types.hh,
+ src/Partially_Reduced_Product_defs.hh,
+ src/Partially_Reduced_Product_inlines.hh,
+ src/Partially_Reduced_Product_templates.hh,
+ src/Partially_Reduced_Product_types.hh,
+ src/Pending_Element_defs.hh, src/Pending_Element_inlines.hh,
+ src/Pending_Element_types.hh, src/Pending_List_defs.hh,
+ src/Pending_List_inlines.hh, src/Pending_List_templates.hh,
+ src/Pending_List_types.hh, src/Ph_Status.cc,
+ src/Ph_Status_idefs.hh, src/Ph_Status_inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell_defs.hh,
+ src/Pointset_Ask_Tell_inlines.hh,
+ src/Pointset_Ask_Tell_templates.hh, src/Pointset_Ask_Tell_types.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset_defs.hh,
+ src/Pointset_Powerset_inlines.hh,
+ src/Pointset_Powerset_templates.hh, src/Pointset_Powerset_types.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation_defs.hh,
+ src/Poly_Con_Relation_inlines.hh, src/Poly_Con_Relation_types.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation_defs.hh,
+ src/Poly_Gen_Relation_inlines.hh, src/Poly_Gen_Relation_types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_chdims_templates.hh,
+ src/Polyhedron_conversion_templates.hh, src/Polyhedron_defs.hh,
+ src/Polyhedron_inlines.hh, src/Polyhedron_minimize_templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_simplify_templates.hh, src/Polyhedron_templates.hh,
+ src/Polyhedron_types.hh, src/Polyhedron_widenings.cc,
+ src/Powerset_defs.hh, src/Powerset_inlines.hh,
+ src/Powerset_templates.hh, src/Powerset_types.hh,
+ src/Ptr_Iterator_defs.hh, src/Ptr_Iterator_inlines.hh,
+ src/Ptr_Iterator_types.hh, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Result_defs.hh,
+ src/Result_inlines.hh, src/Rounding_Dir_defs.hh,
+ src/Rounding_Dir_inlines.hh, src/Scalar_Products.cc,
+ src/Scalar_Products_defs.hh, src/Scalar_Products_inlines.hh,
+ src/Scalar_Products_types.hh, src/Slow_Copy.hh, src/Sparse_Row.cc,
+ src/Sparse_Row_defs.hh, src/Sparse_Row_inlines.hh,
+ src/Sparse_Row_templates.hh, src/Sparse_Row_types.hh,
+ src/Sum_Floating_Point_Expression_defs.hh,
+ src/Sum_Floating_Point_Expression_inlines.hh,
+ src/Sum_Floating_Point_Expression_templates.hh,
+ src/Sum_Floating_Point_Expression_types.hh,
+ src/Swapping_Vector_defs.hh, src/Swapping_Vector_inlines.hh,
+ src/Swapping_Vector_types.hh, src/Temp_defs.hh,
+ src/Temp_inlines.hh, src/Temp_templates.hh,
+ src/Threshold_Watcher.cc, src/Threshold_Watcher_defs.hh,
+ src/Threshold_Watcher_inlines.hh,
+ src/Threshold_Watcher_templates.hh, src/Threshold_Watcher_types.hh,
+ src/Time.cc, src/Time_defs.hh, src/Time_inlines.hh,
+ src/Time_types.hh, src/Topology_types.hh, src/Variable.cc,
+ src/Variable_Floating_Point_Expression_defs.hh,
+ src/Variable_Floating_Point_Expression_inlines.hh,
+ src/Variable_Floating_Point_Expression_types.hh,
+ src/Variable_defs.hh, src/Variable_inlines.hh,
+ src/Variable_types.hh, src/Variables_Set.cc,
+ src/Variables_Set_defs.hh, src/Variables_Set_inlines.hh,
+ src/Variables_Set_types.hh, src/WRD_coefficient_types_defs.hh,
+ src/WRD_coefficient_types_inlines.hh, src/Watchdog.cc,
+ src/Watchdog_defs.hh, src/Watchdog_inlines.hh,
+ src/Watchdog_types.hh, src/Weight_Profiler.cc,
+ src/Weight_Profiler_defs.hh, src/Widening_Function_defs.hh,
+ src/Widening_Function_inlines.hh, src/Widening_Function_types.hh,
+ src/algorithms.hh, src/assert.cc, src/assert.hh,
+ src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf_defs.hh,
+ src/c_streambuf_inlines.hh, src/c_streambuf_types.hh,
+ src/checked.cc, src/checked_defs.hh, src/checked_ext_defs.hh,
+ src/checked_ext_inlines.hh, src/checked_float_inlines.hh,
+ src/checked_inlines.hh, src/checked_int_inlines.hh,
+ src/checked_mpq_inlines.hh, src/checked_mpz_inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh,
+ src/distances_defs.hh, src/distances_inlines.hh,
+ src/distances_types.hh, src/fpu-c99_inlines.hh, src/fpu-ia32.cc,
+ src/fpu-ia32_inlines.hh, src/fpu-none_inlines.hh,
+ src/fpu-sparc_inlines.hh, src/fpu_defs.hh, src/fpu_types.hh,
+ src/globals.cc, src/globals_defs.hh, src/globals_inlines.hh,
+ src/globals_types.hh, src/initializer.hh, src/intervals_defs.hh,
+ src/iterator_to_const_defs.hh, src/iterator_to_const_inlines.hh,
+ src/iterator_to_const_types.hh, src/linearize.hh,
+ src/math_utilities_defs.hh, src/math_utilities_inlines.hh,
+ src/max_space_dimension.hh, src/meta_programming.hh,
+ src/mp_std_bits.cc, src/mp_std_bits_defs.hh,
+ src/mp_std_bits_inlines.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/stdiobuf.cc,
+ src/stdiobuf_defs.hh, src/stdiobuf_inlines.hh,
+ src/stdiobuf_types.hh, src/swapping_sort_templates.hh,
+ src/termination.cc, src/termination_defs.hh,
+ src/termination_templates.hh, src/termination_types.hh,
+ src/version.cc, src/version.hh.in, src/wrap_assign.hh,
+ src/wrap_string.cc, src/wrap_string.hh, tests/Ask_Tell/Makefile.am,
+ tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc, tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+ tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/empty1.cc, tests/Box/equality1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+ tests/Box/intersection1.cc, tests/Box/interval1.cc,
+ tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruence1.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/relations3.cc,
+ tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+ tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+ tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+ tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+ tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+ tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+ tests/Concrete_Expression/C_Expr.cc,
+ tests/Concrete_Expression/C_Expr_defs.hh,
+ tests/Concrete_Expression/C_Expr_inlines.hh,
+ tests/Concrete_Expression/C_Expr_types.hh,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/bdshape1.cc,
+ tests/Concrete_Expression/bdshape2.cc,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc,
+ tests/Concrete_Expression/octagonalshape1.cc,
+ tests/Concrete_Expression/octagonalshape2.cc,
+ tests/Concrete_Expression/polyhedron1.cc,
+ tests/Concrete_Expression/polyhedron2.cc,
+ tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+ tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+ tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+ tests/MIP_Problem/mipproblem4.cc, tests/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frequency1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc,
+ tests/Octagonal_Shape/wrap1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+ tests/PIP_Problem/weightwatch1.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearexpression1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Polyhedron/smm1.cc, tests/Polyhedron/sparserow1.cc,
+ tests/Polyhedron/termination1.cc, tests/Polyhedron/termination2.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+ tests/Polyhedron/unconstrain1.cc, tests/Polyhedron/universe1.cc,
+ tests/Polyhedron/universe2.cc, tests/Polyhedron/variablesset1.cc,
+ tests/Polyhedron/watchdog1.cc, tests/Polyhedron/weightwatch1.cc,
+ tests/Polyhedron/wrap1.cc, tests/Polyhedron/wrap2.cc,
+ tests/Polyhedron/writeconsys1.cc, tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+ tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+ tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc, tests/README,
+ tests/Random_Number_Generator_defs.hh,
+ tests/Random_Number_Generator_inlines.hh,
+ tests/Random_Number_Generator_types.hh, tests/Watchdog/Makefile.am,
+ tests/Watchdog/watchdog1.cc, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Extended
+ copyright years.
+
+2012-12-22 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Version number bumped.
+
+2012-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_std_bits.cc, src/mp_std_bits_defs.hh: GMP version 5.1.0
+ (and, presumably, later versions) defines std::numeric_limits.
+
+2012-12-17 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * compile, config.sub, depcomp: Updated.
+
+2012-11-12 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac, m4/ac_cxx_long_double_binary_format.m4: Detect bogus
+ versions of std::floor(long double).
+
+2012-11-11 Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+ * configure.ac: Do recognize also llvm-gcc and llvm-g++.
+ Floating-point-based abstractions are disabled when clang++ or
+ llvm-g++ are detected.
+
+2012-10-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox: Removed wrong observation on time-elapse for
+ closed polyhedra. (Thanks to Marco Faella for pointing this out.)
+
+2012-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess, config.sub: Updated.
+
+2012-09-20 Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+ * src/Doubly_Linked_Object_defs.hh,
+ src/Doubly_Linked_Object_inlines.hh,
+ src/Doubly_Linked_Object_types.hh, src/EList_Iterator_defs.hh,
+ src/EList_Iterator_inlines.hh, src/EList_Iterator_types.hh,
+ src/EList_defs.hh, src/EList_inlines.hh, src/EList_types.hh,
+ src/Octagonal_Shape_templates.hh, src/Pending_List_defs.hh,
+ src/Pending_List_inlines.hh, src/Pending_List_templates.hh,
+ src/Threshold_Watcher_defs.hh, src/Threshold_Watcher_templates.hh,
+ src/Watchdog.cc, src/Watchdog_defs.hh: EList is not Watchdog
+ specific. Avoided needless naming incongruences.
+
+2012-09-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape_defs.hh, src/Concrete_Expression_types.hh,
+ src/Partially_Reduced_Product_defs.hh: Fixed several Doxygen
+ warnings.
+
+2012-09-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2012-08-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Updated news.
+
+2012-08-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java: Added a Java
+ testcase for method drop_some_non_integer_points().
+
+2012-08-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Fixed a precision problem in method Polyhedron::drop_some_non_integer_points().
+
+2012-08-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/dropsomenonintegerpoints2.cc: Added a new test
+ showing a precision problem in one of the methods
+ Polyhedron::drop_some_non_integer_points();
+
+2012-08-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Fixed Java interface issues for method
+ drop_some_non_integer_points(), reported by Zell (Zhoulai). Corrected the declaration of the method by letting it accept a
+ Complexity_Class enumeration value (rather than a plain integer). Also renamed the version taking a set of variables as input, which
+ was using the suffix "_2", so as to exploit overloading.
+
+2012-08-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithcongruence1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Powerset/fromconstraints1.cc: Added test invocations that were
+ left out by mistake.
+
+2012-08-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Integer.hh: Indentation fixed.
+
+2012-08-25 Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+ * src/checked_int_inlines.hh: Avoided user defined and
+ implementation define behaviors of left and right shift.
+
+2012-08-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.cc, src/Float_defs.hh, src/Float_inlines.hh: Avoided
+ some "magic constants". Detected by ECLAIR service nomagicc.
+
+2012-08-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float_defs.hh: Fixed float_ieee754_half::POS_INF and
+ float_ieee754_half::NEG_INF. They were swapped.
+
+2012-08-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh: Revert "Two comments turned into assertions." This reverts commit e4ced22bfaf9e410719d47154dcc942ceffbeea0.
+
+2012-08-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float_inlines.hh: Avoided a couple of "magic constants".
+ Detected by ECLAIR service nomagicc.
+
+2012-08-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary_defs.hh: Comments should never be used for
+ "commenting out" code. Detected by ECLAIR service cmntdout.
+
+2012-08-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_simplify.cc: Unusual and difficult-to-maintain comment
+ removed.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh: Two comments turned into assertions.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box_templates.hh, src/Grid_conversion.cc,
+ src/Interval_defs.hh, src/Interval_inlines.hh,
+ src/Pointset_Powerset_templates.hh: Do not declare more than one
+ variable per declaration. Detected by ECLAIR service
+ declgrup_srceline.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, src/Watchdog_defs.hh,
+ src/Watchdog_inlines.hh: Avoided non-constant pointers to function.
+ Detected by ECLAIR service funpntr.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Handler_defs.hh, src/Handler_inlines.hh: Avoided non-constant
+ pointers to function. Detected by ECLAIR service funpntr.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products_defs.hh: Avoided non-constant pointers to
+ function. Detected by ECLAIR service funpntr.
+
+2012-08-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure, doc/Makefile.am, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/{ppl_c_implementation_common.defs.hh =>
+ ppl_c_implementation_common_defs.hh},
+ interfaces/C/{ppl_c_implementation_common.inlines.hh =>
+ ppl_c_implementation_common_inlines.hh},
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/{ppl_java_common.defs.hh =>
+ ppl_java_common_defs.hh},
+ interfaces/Java/jni/{ppl_java_common.inlines.hh =>
+ ppl_java_common_inlines.hh},
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/{ppl_ocaml_common.defs.hh =>
+ ppl_ocaml_common_defs.hh},
+ interfaces/OCaml/{ppl_ocaml_common.inlines.hh =>
+ ppl_ocaml_common_inlines.hh}, interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/Makefile.am, interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/{ppl_prolog_common.defs.hh =>
+ ppl_prolog_common_defs.hh},
+ interfaces/Prolog/{ppl_prolog_common.inlines.hh =>
+ ppl_prolog_common_inlines.hh}, src/Affine_Space.cc,
+ src/{Affine_Space.defs.hh => Affine_Space_defs.hh},
+ src/{Affine_Space.inlines.hh => Affine_Space_inlines.hh},
+ src/{Affine_Space.types.hh => Affine_Space_types.hh},
+ src/{Any_Pointset.defs.hh => Any_Pointset_defs.hh},
+ src/{Any_Pointset.inlines.hh => Any_Pointset_inlines.hh},
+ src/{Any_Pointset.types.hh => Any_Pointset_types.hh},
+ src/{Ask_Tell.defs.hh => Ask_Tell_defs.hh},
+ src/{Ask_Tell.inlines.hh => Ask_Tell_inlines.hh},
+ src/{Ask_Tell.templates.hh => Ask_Tell_templates.hh},
+ src/{Ask_Tell.types.hh => Ask_Tell_types.hh},
+ src/{BDS_Status.idefs.hh => BDS_Status_idefs.hh},
+ src/{BDS_Status.inlines.hh => BDS_Status_inlines.hh},
+ src/BD_Shape.cc, src/{BD_Shape.defs.hh => BD_Shape_defs.hh},
+ src/{BD_Shape.inlines.hh => BD_Shape_inlines.hh},
+ src/{BD_Shape.templates.hh => BD_Shape_templates.hh},
+ src/{BD_Shape.types.hh => BD_Shape_types.hh},
+ src/BHRZ03_Certificate.cc, src/{BHRZ03_Certificate.defs.hh =>
+ BHRZ03_Certificate_defs.hh}, src/{BHRZ03_Certificate.inlines.hh =>
+ BHRZ03_Certificate_inlines.hh}, src/{BHRZ03_Certificate.types.hh =>
+ BHRZ03_Certificate_types.hh}, src/Bit_Matrix.cc,
+ src/{Bit_Matrix.defs.hh => Bit_Matrix_defs.hh},
+ src/{Bit_Matrix.inlines.hh => Bit_Matrix_inlines.hh},
+ src/{Bit_Matrix.types.hh => Bit_Matrix_types.hh}, src/Bit_Row.cc,
+ src/{Bit_Row.defs.hh => Bit_Row_defs.hh}, src/{Bit_Row.inlines.hh
+ => Bit_Row_inlines.hh}, src/{Bit_Row.types.hh => Bit_Row_types.hh},
+ src/{Boundary.defs.hh => Boundary_defs.hh}, src/Box.cc,
+ src/{Box_Status.idefs.hh => Box_Status_idefs.hh},
+ src/{Box_Status.inlines.hh => Box_Status_inlines.hh},
+ src/{Box.defs.hh => Box_defs.hh}, src/{Box.inlines.hh =>
+ Box_inlines.hh}, src/{Box.templates.hh => Box_templates.hh},
+ src/{Box.types.hh => Box_types.hh}, src/CO_Tree.cc,
+ src/{CO_Tree.defs.hh => CO_Tree_defs.hh}, src/{CO_Tree.inlines.hh
+ => CO_Tree_inlines.hh}, src/{CO_Tree.templates.hh =>
+ CO_Tree_templates.hh}, src/{CO_Tree.types.hh => CO_Tree_types.hh},
+ src/C_Polyhedron.cc, src/{C_Polyhedron.defs.hh =>
+ C_Polyhedron_defs.hh}, src/{C_Polyhedron.inlines.hh =>
+ C_Polyhedron_inlines.hh}, src/{C_Polyhedron.types.hh =>
+ C_Polyhedron_types.hh}, src/{Cast_Floating_Point_Expression.defs.hh
+ => Cast_Floating_Point_Expression_defs.hh},
+ src/{Cast_Floating_Point_Expression.inlines.hh =>
+ Cast_Floating_Point_Expression_inlines.hh},
+ src/{Cast_Floating_Point_Expression.templates.hh =>
+ Cast_Floating_Point_Expression_templates.hh},
+ src/{Cast_Floating_Point_Expression.types.hh =>
+ Cast_Floating_Point_Expression_types.hh}, src/Checked_Number.cc,
+ src/{Checked_Number.defs.hh => Checked_Number_defs.hh},
+ src/{Checked_Number.inlines.hh => Checked_Number_inlines.hh},
+ src/{Checked_Number.templates.hh => Checked_Number_templates.hh},
+ src/{Checked_Number.types.hh => Checked_Number_types.hh},
+ src/Coefficient.cc, src/{Coefficient.defs.hh =>
+ Coefficient_defs.hh}, src/{Coefficient.inlines.hh =>
+ Coefficient_inlines.hh}, src/{Coefficient.types.hh =>
+ Coefficient_types.hh}, src/Concrete_Expression.cc,
+ src/{Concrete_Expression.defs.hh => Concrete_Expression_defs.hh},
+ src/{Concrete_Expression.inlines.hh =>
+ Concrete_Expression_inlines.hh}, src/{Concrete_Expression.types.hh
+ => Concrete_Expression_types.hh}, src/Congruence.cc,
+ src/Congruence_System.cc, src/{Congruence_System.defs.hh =>
+ Congruence_System_defs.hh}, src/{Congruence_System.inlines.hh =>
+ Congruence_System_inlines.hh}, src/{Congruence_System.types.hh =>
+ Congruence_System_types.hh}, src/{Congruence.defs.hh =>
+ Congruence_defs.hh}, src/{Congruence.inlines.hh =>
+ Congruence_inlines.hh}, src/{Congruence.types.hh =>
+ Congruence_types.hh},
+ src/{Constant_Floating_Point_Expression.defs.hh =>
+ Constant_Floating_Point_Expression_defs.hh},
+ src/{Constant_Floating_Point_Expression.inlines.hh =>
+ Constant_Floating_Point_Expression_inlines.hh},
+ src/{Constant_Floating_Point_Expression.types.hh =>
+ Constant_Floating_Point_Expression_types.hh}, src/Constraint.cc,
+ src/Constraint_System.cc, src/{Constraint_System.defs.hh =>
+ Constraint_System_defs.hh}, src/{Constraint_System.inlines.hh =>
+ Constraint_System_inlines.hh}, src/{Constraint_System.types.hh =>
+ Constraint_System_types.hh}, src/{Constraint.defs.hh =>
+ Constraint_defs.hh}, src/{Constraint.inlines.hh =>
+ Constraint_inlines.hh}, src/{Constraint.types.hh =>
+ Constraint_types.hh}, src/{DB_Matrix.defs.hh => DB_Matrix_defs.hh},
+ src/{DB_Matrix.inlines.hh => DB_Matrix_inlines.hh},
+ src/{DB_Matrix.templates.hh => DB_Matrix_templates.hh},
+ src/{DB_Matrix.types.hh => DB_Matrix_types.hh}, src/{DB_Row.defs.hh
+ => DB_Row_defs.hh}, src/{DB_Row.inlines.hh => DB_Row_inlines.hh},
+ src/{DB_Row.templates.hh => DB_Row_templates.hh},
+ src/{DB_Row.types.hh => DB_Row_types.hh}, src/Dense_Row.cc,
+ src/{Dense_Row.defs.hh => Dense_Row_defs.hh},
+ src/{Dense_Row.inlines.hh => Dense_Row_inlines.hh},
+ src/{Dense_Row.templates.hh => Dense_Row_templates.hh},
+ src/{Dense_Row.types.hh => Dense_Row_types.hh},
+ src/{Determinate.defs.hh => Determinate_defs.hh},
+ src/{Determinate.inlines.hh => Determinate_inlines.hh},
+ src/{Determinate.types.hh => Determinate_types.hh},
+ src/{Difference_Floating_Point_Expression.defs.hh =>
+ Difference_Floating_Point_Expression_defs.hh},
+ src/{Difference_Floating_Point_Expression.inlines.hh =>
+ Difference_Floating_Point_Expression_inlines.hh},
+ src/{Difference_Floating_Point_Expression.templates.hh =>
+ Difference_Floating_Point_Expression_templates.hh},
+ src/{Difference_Floating_Point_Expression.types.hh =>
+ Difference_Floating_Point_Expression_types.hh},
+ src/{Division_Floating_Point_Expression.defs.hh =>
+ Division_Floating_Point_Expression_defs.hh},
+ src/{Division_Floating_Point_Expression.inlines.hh =>
+ Division_Floating_Point_Expression_inlines.hh},
+ src/{Division_Floating_Point_Expression.templates.hh =>
+ Division_Floating_Point_Expression_templates.hh},
+ src/{Division_Floating_Point_Expression.types.hh =>
+ Division_Floating_Point_Expression_types.hh},
+ src/{Doubly_Linked_Object.defs.hh => Doubly_Linked_Object_defs.hh},
+ src/{Doubly_Linked_Object.inlines.hh =>
+ Doubly_Linked_Object_inlines.hh},
+ src/{Doubly_Linked_Object.types.hh =>
+ Doubly_Linked_Object_types.hh}, src/{EList_Iterator.defs.hh =>
+ EList_Iterator_defs.hh}, src/{EList_Iterator.inlines.hh =>
+ EList_Iterator_inlines.hh}, src/{EList_Iterator.types.hh =>
+ EList_Iterator_types.hh}, src/{EList.defs.hh => EList_defs.hh},
+ src/{EList.inlines.hh => EList_inlines.hh}, src/{EList.types.hh =>
+ EList_types.hh}, src/{Expression_Adapter.defs.hh =>
+ Expression_Adapter_defs.hh}, src/{Expression_Adapter.inlines.hh =>
+ Expression_Adapter_inlines.hh}, src/{Expression_Adapter.types.hh =>
+ Expression_Adapter_types.hh}, src/{Expression_Hide_Inhomo.defs.hh
+ => Expression_Hide_Inhomo_defs.hh},
+ src/{Expression_Hide_Inhomo.inlines.hh =>
+ Expression_Hide_Inhomo_inlines.hh},
+ src/{Expression_Hide_Inhomo.types.hh =>
+ Expression_Hide_Inhomo_types.hh}, src/{Expression_Hide_Last.defs.hh
+ => Expression_Hide_Last_defs.hh},
+ src/{Expression_Hide_Last.inlines.hh =>
+ Expression_Hide_Last_inlines.hh},
+ src/{Expression_Hide_Last.types.hh =>
+ Expression_Hide_Last_types.hh}, src/Float.cc, src/{Float.defs.hh =>
+ Float_defs.hh}, src/{Float.inlines.hh => Float_inlines.hh},
+ src/{Float.templates.hh => Float_templates.hh},
+ src/{Floating_Point_Expression.defs.hh =>
+ Floating_Point_Expression_defs.hh},
+ src/{Floating_Point_Expression.inlines.hh =>
+ Floating_Point_Expression_inlines.hh},
+ src/{Floating_Point_Expression.templates.hh =>
+ Floating_Point_Expression_templates.hh},
+ src/{Floating_Point_Expression.types.hh =>
+ Floating_Point_Expression_types.hh}, src/{GMP_Integer.defs.hh =>
+ GMP_Integer_defs.hh}, src/{GMP_Integer.inlines.hh =>
+ GMP_Integer_inlines.hh}, src/{GMP_Integer.types.hh =>
+ GMP_Integer_types.hh}, src/Generator.cc, src/Generator_System.cc,
+ src/{Generator_System.defs.hh => Generator_System_defs.hh},
+ src/{Generator_System.inlines.hh => Generator_System_inlines.hh},
+ src/{Generator_System.types.hh => Generator_System_types.hh},
+ src/{Generator.defs.hh => Generator_defs.hh},
+ src/{Generator.inlines.hh => Generator_inlines.hh},
+ src/{Generator.types.hh => Generator_types.hh},
+ src/Grid_Certificate.cc, src/{Grid_Certificate.defs.hh =>
+ Grid_Certificate_defs.hh}, src/{Grid_Certificate.inlines.hh =>
+ Grid_Certificate_inlines.hh}, src/{Grid_Certificate.types.hh =>
+ Grid_Certificate_types.hh}, src/Grid_Generator.cc,
+ src/Grid_Generator_System.cc, src/{Grid_Generator_System.defs.hh =>
+ Grid_Generator_System_defs.hh},
+ src/{Grid_Generator_System.inlines.hh =>
+ Grid_Generator_System_inlines.hh},
+ src/{Grid_Generator_System.types.hh =>
+ Grid_Generator_System_types.hh}, src/{Grid_Generator.defs.hh =>
+ Grid_Generator_defs.hh}, src/{Grid_Generator.inlines.hh =>
+ Grid_Generator_inlines.hh}, src/{Grid_Generator.types.hh =>
+ Grid_Generator_types.hh}, src/Grid_Status.cc,
+ src/{Grid_Status.idefs.hh => Grid_Status_idefs.hh},
+ src/{Grid_Status.inlines.hh => Grid_Status_inlines.hh},
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/{Grid.defs.hh =>
+ Grid_defs.hh}, src/{Grid.inlines.hh => Grid_inlines.hh},
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/{Grid.templates.hh => Grid_templates.hh}, src/{Grid.types.hh =>
+ Grid_types.hh}, src/Grid_widenings.cc, src/H79_Certificate.cc,
+ src/{H79_Certificate.defs.hh => H79_Certificate_defs.hh},
+ src/{H79_Certificate.inlines.hh => H79_Certificate_inlines.hh},
+ src/{H79_Certificate.types.hh => H79_Certificate_types.hh},
+ src/{Handler.defs.hh => Handler_defs.hh}, src/{Handler.inlines.hh
+ => Handler_inlines.hh}, src/{Handler.types.hh => Handler_types.hh},
+ src/Init.cc, src/{Init.defs.hh => Init_defs.hh},
+ src/{Init.inlines.hh => Init_inlines.hh}, src/{Init.types.hh =>
+ Init_types.hh}, src/Integer_Interval.hh, src/{Interval_Info.defs.hh
+ => Interval_Info_defs.hh}, src/{Interval_Info.inlines.hh =>
+ Interval_Info_inlines.hh}, src/{Interval_Info.types.hh =>
+ Interval_Info_types.hh}, src/{Interval.defs.hh =>
+ Interval_defs.hh}, src/{Interval.inlines.hh =>
+ Interval_inlines.hh}, src/{Interval.templates.hh =>
+ Interval_templates.hh}, src/{Interval.types.hh =>
+ Interval_types.hh}, src/Linear_Expression.cc,
+ src/Linear_Expression_Impl.cc, src/{Linear_Expression_Impl.defs.hh
+ => Linear_Expression_Impl_defs.hh},
+ src/{Linear_Expression_Impl.inlines.hh =>
+ Linear_Expression_Impl_inlines.hh},
+ src/{Linear_Expression_Impl.templates.hh =>
+ Linear_Expression_Impl_templates.hh},
+ src/{Linear_Expression_Impl.types.hh =>
+ Linear_Expression_Impl_types.hh},
+ src/Linear_Expression_Interface.cc,
+ src/{Linear_Expression_Interface.defs.hh =>
+ Linear_Expression_Interface_defs.hh},
+ src/{Linear_Expression_Interface.types.hh =>
+ Linear_Expression_Interface_types.hh},
+ src/{Linear_Expression.defs.hh => Linear_Expression_defs.hh},
+ src/{Linear_Expression.inlines.hh => Linear_Expression_inlines.hh},
+ src/{Linear_Expression.types.hh => Linear_Expression_types.hh},
+ src/Linear_Form.cc, src/{Linear_Form.defs.hh =>
+ Linear_Form_defs.hh}, src/{Linear_Form.inlines.hh =>
+ Linear_Form_inlines.hh}, src/{Linear_Form.templates.hh =>
+ Linear_Form_templates.hh}, src/{Linear_Form.types.hh =>
+ Linear_Form_types.hh}, src/{Linear_System.defs.hh =>
+ Linear_System_defs.hh}, src/{Linear_System.inlines.hh =>
+ Linear_System_inlines.hh}, src/{Linear_System.templates.hh =>
+ Linear_System_templates.hh}, src/{Linear_System.types.hh =>
+ Linear_System_types.hh}, src/MIP_Problem.cc,
+ src/{MIP_Problem.defs.hh => MIP_Problem_defs.hh},
+ src/{MIP_Problem.inlines.hh => MIP_Problem_inlines.hh},
+ src/{MIP_Problem.templates.hh => MIP_Problem_templates.hh},
+ src/{MIP_Problem.types.hh => MIP_Problem_types.hh},
+ src/Makefile.am, src/{Matrix.defs.hh => Matrix_defs.hh},
+ src/{Matrix.inlines.hh => Matrix_inlines.hh},
+ src/{Matrix.templates.hh => Matrix_templates.hh},
+ src/{Matrix.types.hh => Matrix_types.hh},
+ src/{Multiplication_Floating_Point_Expression.defs.hh =>
+ Multiplication_Floating_Point_Expression_defs.hh},
+ src/{Multiplication_Floating_Point_Expression.inlines.hh =>
+ Multiplication_Floating_Point_Expression_inlines.hh},
+ src/{Multiplication_Floating_Point_Expression.templates.hh =>
+ Multiplication_Floating_Point_Expression_templates.hh},
+ src/{Multiplication_Floating_Point_Expression.types.hh =>
+ Multiplication_Floating_Point_Expression_types.hh},
+ src/NNC_Polyhedron.cc, src/{NNC_Polyhedron.defs.hh =>
+ NNC_Polyhedron_defs.hh}, src/{NNC_Polyhedron.inlines.hh =>
+ NNC_Polyhedron_inlines.hh}, src/{NNC_Polyhedron.types.hh =>
+ NNC_Polyhedron_types.hh}, src/{Numeric_Format.defs.hh =>
+ Numeric_Format_defs.hh}, src/{OR_Matrix.defs.hh =>
+ OR_Matrix_defs.hh}, src/{OR_Matrix.inlines.hh =>
+ OR_Matrix_inlines.hh}, src/{OR_Matrix.templates.hh =>
+ OR_Matrix_templates.hh}, src/{OR_Matrix.types.hh =>
+ OR_Matrix_types.hh}, src/Octagonal_Shape.cc,
+ src/{Octagonal_Shape.defs.hh => Octagonal_Shape_defs.hh},
+ src/{Octagonal_Shape.inlines.hh => Octagonal_Shape_inlines.hh},
+ src/{Octagonal_Shape.templates.hh => Octagonal_Shape_templates.hh},
+ src/{Octagonal_Shape.types.hh => Octagonal_Shape_types.hh},
+ src/{Og_Status.idefs.hh => Og_Status_idefs.hh},
+ src/{Og_Status.inlines.hh => Og_Status_inlines.hh},
+ src/{Opposite_Floating_Point_Expression.defs.hh =>
+ Opposite_Floating_Point_Expression_defs.hh},
+ src/{Opposite_Floating_Point_Expression.inlines.hh =>
+ Opposite_Floating_Point_Expression_inlines.hh},
+ src/{Opposite_Floating_Point_Expression.types.hh =>
+ Opposite_Floating_Point_Expression_types.hh}, src/PIP_Problem.cc,
+ src/{PIP_Problem.defs.hh => PIP_Problem_defs.hh},
+ src/{PIP_Problem.inlines.hh => PIP_Problem_inlines.hh},
+ src/{PIP_Problem.templates.hh => PIP_Problem_templates.hh},
+ src/{PIP_Problem.types.hh => PIP_Problem_types.hh},
+ src/PIP_Tree.cc, src/{PIP_Tree.defs.hh => PIP_Tree_defs.hh},
+ src/{PIP_Tree.inlines.hh => PIP_Tree_inlines.hh},
+ src/{PIP_Tree.types.hh => PIP_Tree_types.hh},
+ src/Partial_Function.cc, src/{Partial_Function.defs.hh =>
+ Partial_Function_defs.hh}, src/{Partial_Function.inlines.hh =>
+ Partial_Function_inlines.hh}, src/{Partial_Function.types.hh =>
+ Partial_Function_types.hh}, src/{Partially_Reduced_Product.defs.hh
+ => Partially_Reduced_Product_defs.hh},
+ src/{Partially_Reduced_Product.inlines.hh =>
+ Partially_Reduced_Product_inlines.hh},
+ src/{Partially_Reduced_Product.templates.hh =>
+ Partially_Reduced_Product_templates.hh},
+ src/{Partially_Reduced_Product.types.hh =>
+ Partially_Reduced_Product_types.hh}, src/{Pending_Element.defs.hh
+ => Pending_Element_defs.hh}, src/{Pending_Element.inlines.hh =>
+ Pending_Element_inlines.hh}, src/{Pending_Element.types.hh =>
+ Pending_Element_types.hh}, src/{Pending_List.defs.hh =>
+ Pending_List_defs.hh}, src/{Pending_List.inlines.hh =>
+ Pending_List_inlines.hh}, src/{Pending_List.templates.hh =>
+ Pending_List_templates.hh}, src/{Pending_List.types.hh =>
+ Pending_List_types.hh}, src/Ph_Status.cc, src/{Ph_Status.idefs.hh
+ => Ph_Status_idefs.hh}, src/{Ph_Status.inlines.hh =>
+ Ph_Status_inlines.hh}, src/Pointset_Ask_Tell.cc,
+ src/{Pointset_Ask_Tell.defs.hh => Pointset_Ask_Tell_defs.hh},
+ src/{Pointset_Ask_Tell.inlines.hh => Pointset_Ask_Tell_inlines.hh},
+ src/{Pointset_Ask_Tell.templates.hh =>
+ Pointset_Ask_Tell_templates.hh}, src/{Pointset_Ask_Tell.types.hh =>
+ Pointset_Ask_Tell_types.hh}, src/Pointset_Powerset.cc,
+ src/{Pointset_Powerset.defs.hh => Pointset_Powerset_defs.hh},
+ src/{Pointset_Powerset.inlines.hh => Pointset_Powerset_inlines.hh},
+ src/{Pointset_Powerset.templates.hh =>
+ Pointset_Powerset_templates.hh}, src/{Pointset_Powerset.types.hh =>
+ Pointset_Powerset_types.hh}, src/Poly_Con_Relation.cc,
+ src/{Poly_Con_Relation.defs.hh => Poly_Con_Relation_defs.hh},
+ src/{Poly_Con_Relation.inlines.hh => Poly_Con_Relation_inlines.hh},
+ src/{Poly_Con_Relation.types.hh => Poly_Con_Relation_types.hh},
+ src/Poly_Gen_Relation.cc, src/{Poly_Gen_Relation.defs.hh =>
+ Poly_Gen_Relation_defs.hh}, src/{Poly_Gen_Relation.inlines.hh =>
+ Poly_Gen_Relation_inlines.hh}, src/{Poly_Gen_Relation.types.hh =>
+ Poly_Gen_Relation_types.hh}, src/Polyhedron_chdims.cc,
+ src/{Polyhedron_chdims.templates.hh =>
+ Polyhedron_chdims_templates.hh},
+ src/{Polyhedron_conversion.templates.hh =>
+ Polyhedron_conversion_templates.hh}, src/{Polyhedron.defs.hh =>
+ Polyhedron_defs.hh}, src/{Polyhedron.inlines.hh =>
+ Polyhedron_inlines.hh}, src/{Polyhedron_minimize.templates.hh =>
+ Polyhedron_minimize_templates.hh}, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/{Polyhedron_simplify.templates.hh =>
+ Polyhedron_simplify_templates.hh}, src/{Polyhedron.templates.hh =>
+ Polyhedron_templates.hh}, src/{Polyhedron.types.hh =>
+ Polyhedron_types.hh}, src/Polyhedron_widenings.cc,
+ src/{Powerset.defs.hh => Powerset_defs.hh},
+ src/{Powerset.inlines.hh => Powerset_inlines.hh},
+ src/{Powerset.templates.hh => Powerset_templates.hh},
+ src/{Powerset.types.hh => Powerset_types.hh},
+ src/{Ptr_Iterator.defs.hh => Ptr_Iterator_defs.hh},
+ src/{Ptr_Iterator.inlines.hh => Ptr_Iterator_inlines.hh},
+ src/{Ptr_Iterator.types.hh => Ptr_Iterator_types.hh},
+ src/Rational_Box.hh, src/Rational_Interval.hh, src/{Result.defs.hh
+ => Result_defs.hh}, src/{Result.inlines.hh => Result_inlines.hh},
+ src/{Rounding_Dir.defs.hh => Rounding_Dir_defs.hh},
+ src/{Rounding_Dir.inlines.hh => Rounding_Dir_inlines.hh},
+ src/Scalar_Products.cc, src/{Scalar_Products.defs.hh =>
+ Scalar_Products_defs.hh}, src/{Scalar_Products.inlines.hh =>
+ Scalar_Products_inlines.hh}, src/{Scalar_Products.types.hh =>
+ Scalar_Products_types.hh}, src/Sparse_Row.cc,
+ src/{Sparse_Row.defs.hh => Sparse_Row_defs.hh},
+ src/{Sparse_Row.inlines.hh => Sparse_Row_inlines.hh},
+ src/{Sparse_Row.templates.hh => Sparse_Row_templates.hh},
+ src/{Sparse_Row.types.hh => Sparse_Row_types.hh},
+ src/{Sum_Floating_Point_Expression.defs.hh =>
+ Sum_Floating_Point_Expression_defs.hh},
+ src/{Sum_Floating_Point_Expression.inlines.hh =>
+ Sum_Floating_Point_Expression_inlines.hh},
+ src/{Sum_Floating_Point_Expression.templates.hh =>
+ Sum_Floating_Point_Expression_templates.hh},
+ src/{Sum_Floating_Point_Expression.types.hh =>
+ Sum_Floating_Point_Expression_types.hh},
+ src/{Swapping_Vector.defs.hh => Swapping_Vector_defs.hh},
+ src/{Swapping_Vector.inlines.hh => Swapping_Vector_inlines.hh},
+ src/{Swapping_Vector.types.hh => Swapping_Vector_types.hh},
+ src/{Temp.defs.hh => Temp_defs.hh}, src/{Temp.inlines.hh =>
+ Temp_inlines.hh}, src/{Temp.templates.hh => Temp_templates.hh},
+ src/Threshold_Watcher.cc, src/{Threshold_Watcher.defs.hh =>
+ Threshold_Watcher_defs.hh}, src/{Threshold_Watcher.inlines.hh =>
+ Threshold_Watcher_inlines.hh}, src/{Threshold_Watcher.templates.hh
+ => Threshold_Watcher_templates.hh}, src/{Threshold_Watcher.types.hh
+ => Threshold_Watcher_types.hh}, src/Time.cc, src/{Time.defs.hh =>
+ Time_defs.hh}, src/{Time.inlines.hh => Time_inlines.hh},
+ src/{Time.types.hh => Time_types.hh}, src/{Topology.types.hh =>
+ Topology_types.hh}, src/Variable.cc,
+ src/{Variable_Floating_Point_Expression.defs.hh =>
+ Variable_Floating_Point_Expression_defs.hh},
+ src/{Variable_Floating_Point_Expression.inlines.hh =>
+ Variable_Floating_Point_Expression_inlines.hh},
+ src/{Variable_Floating_Point_Expression.types.hh =>
+ Variable_Floating_Point_Expression_types.hh}, src/{Variable.defs.hh
+ => Variable_defs.hh}, src/{Variable.inlines.hh =>
+ Variable_inlines.hh}, src/{Variable.types.hh => Variable_types.hh},
+ src/Variables_Set.cc, src/{Variables_Set.defs.hh =>
+ Variables_Set_defs.hh}, src/{Variables_Set.inlines.hh =>
+ Variables_Set_inlines.hh}, src/{Variables_Set.types.hh =>
+ Variables_Set_types.hh}, src/{WRD_coefficient_types.defs.hh =>
+ WRD_coefficient_types_defs.hh},
+ src/{WRD_coefficient_types.inlines.hh =>
+ WRD_coefficient_types_inlines.hh}, src/Watchdog.cc,
+ src/{Watchdog.defs.hh => Watchdog_defs.hh},
+ src/{Watchdog.inlines.hh => Watchdog_inlines.hh},
+ src/{Watchdog.types.hh => Watchdog_types.hh},
+ src/Weight_Profiler.cc, src/{Weight_Profiler.defs.hh =>
+ Weight_Profiler_defs.hh}, src/{Widening_Function.defs.hh =>
+ Widening_Function_defs.hh}, src/{Widening_Function.inlines.hh =>
+ Widening_Function_inlines.hh}, src/{Widening_Function.types.hh =>
+ Widening_Function_types.hh}, src/algorithms.hh, src/c_streambuf.cc,
+ src/{c_streambuf.defs.hh => c_streambuf_defs.hh},
+ src/{c_streambuf.inlines.hh => c_streambuf_inlines.hh},
+ src/{c_streambuf.types.hh => c_streambuf_types.hh}, src/checked.cc,
+ src/{checked.defs.hh => checked_defs.hh}, src/{checked_ext.defs.hh
+ => checked_ext_defs.hh}, src/{checked_ext.inlines.hh =>
+ checked_ext_inlines.hh}, src/{checked_float.inlines.hh =>
+ checked_float_inlines.hh}, src/{checked.inlines.hh =>
+ checked_inlines.hh}, src/{checked_int.inlines.hh =>
+ checked_int_inlines.hh}, src/{checked_mpq.inlines.hh =>
+ checked_mpq_inlines.hh}, src/{checked_mpz.inlines.hh =>
+ checked_mpz_inlines.hh}, src/checked_numeric_limits.hh,
+ src/{distances.defs.hh => distances_defs.hh},
+ src/{distances.inlines.hh => distances_inlines.hh},
+ src/{distances.types.hh => distances_types.hh},
+ src/{fpu-c99.inlines.hh => fpu-c99_inlines.hh}, src/fpu-ia32.cc,
+ src/{fpu-ia32.inlines.hh => fpu-ia32_inlines.hh},
+ src/{fpu-none.inlines.hh => fpu-none_inlines.hh},
+ src/{fpu-sparc.inlines.hh => fpu-sparc_inlines.hh},
+ src/{fpu.defs.hh => fpu_defs.hh}, src/{fpu.types.hh =>
+ fpu_types.hh}, src/globals.cc, src/{globals.defs.hh =>
+ globals_defs.hh}, src/{globals.inlines.hh => globals_inlines.hh},
+ src/{globals.types.hh => globals_types.hh}, src/initializer.hh,
+ src/{intervals.defs.hh => intervals_defs.hh},
+ src/{iterator_to_const.defs.hh => iterator_to_const_defs.hh},
+ src/{iterator_to_const.inlines.hh => iterator_to_const_inlines.hh},
+ src/{iterator_to_const.types.hh => iterator_to_const_types.hh},
+ src/linearize.hh, src/{math_utilities.defs.hh =>
+ math_utilities_defs.hh}, src/{math_utilities.inlines.hh =>
+ math_utilities_inlines.hh}, src/max_space_dimension.hh,
+ src/mp_std_bits.cc, src/{mp_std_bits.defs.hh =>
+ mp_std_bits_defs.hh}, src/{mp_std_bits.inlines.hh =>
+ mp_std_bits_inlines.hh}, src/stdiobuf.cc, src/{stdiobuf.defs.hh =>
+ stdiobuf_defs.hh}, src/{stdiobuf.inlines.hh =>
+ stdiobuf_inlines.hh}, src/{stdiobuf.types.hh => stdiobuf_types.hh},
+ src/{swapping_sort.templates.hh => swapping_sort_templates.hh},
+ src/termination.cc, src/{termination.defs.hh =>
+ termination_defs.hh}, src/{termination.templates.hh =>
+ termination_templates.hh}, src/{termination.types.hh =>
+ termination_types.hh}, src/wrap_assign.hh, src/wrap_string.hh,
+ tests/Concrete_Expression/C_Expr.cc,
+ tests/Concrete_Expression/{C_Expr.defs.hh => C_Expr_defs.hh},
+ tests/Concrete_Expression/{C_Expr.inlines.hh => C_Expr_inlines.hh},
+ tests/Concrete_Expression/{C_Expr.types.hh => C_Expr_types.hh},
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearize.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Makefile.am,
+ tests/{Random_Number_Generator.defs.hh =>
+ Random_Number_Generator_defs.hh},
+ tests/{Random_Number_Generator.inlines.hh =>
+ Random_Number_Generator_inlines.hh},
+ tests/{Random_Number_Generator.types.hh =>
+ Random_Number_Generator_types.hh}, tests/ppl_test.hh: Guarantee that
+ header file names are unique as per C++11's 16.2#5. Detected by
+ ECLAIR service hedrname.
+
+2012-08-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+ src/Constraint.cc, src/Constraint.inlines.hh, src/Dense_Row.cc,
+ src/Expression_Hide_Last.inlines.hh, src/Generator.cc,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Grid_Generator.inlines.hh, src/Grid_conversion.cc,
+ src/Linear_Expression.inlines.hh, src/Linear_Expression_Impl.cc,
+ src/Linear_Expression_Impl.templates.hh,
+ src/Linear_System.inlines.hh, src/Linear_System.templates.hh,
+ src/MIP_Problem.cc, src/Matrix.templates.hh, src/PIP_Problem.cc,
+ src/Polyhedron_conversion.templates.hh,
+ src/Polyhedron_minimize.templates.hh, src/Polyhedron_public.cc,
+ src/Sparse_Row.cc, src/Sparse_Row.templates.hh: Fixed the code
+ layout for several if-then-elses.
+
+2012-08-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh, src/checked.cc:
+ Fixed comments that were meant to be Doxygen comments. Detected by
+ ECLAIR service cmntdecl_srceline.
+
+2012-08-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: Comment fixed.
+
+2012-08-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Advertise the portability improvements.
+
+2012-08-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am, demos/ppl_pips/Makefile.am,
+ doc/Makefile.am, interfaces/C/Makefile.am,
+ interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am: Avoid a non-portable GNU Make
+ idiom (using `$<' in a non-suffix rule context).
+
+2012-08-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Expression_Adapter.defs.hh, src/Expression_Adapter.inlines.hh,
+ src/Expression_Adapter.types.hh,
+ src/Expression_Hide_Inhomo.defs.hh,
+ src/Expression_Hide_Inhomo.inlines.hh,
+ src/Expression_Hide_Last.defs.hh,
+ src/Expression_Hide_Last.inlines.hh, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/MIP_Problem.cc, src/PIP_Tree.cc, src/Polyhedron.templates.hh,
+ src/termination.cc: Modified the Expression_Adapter infrastructure.
+ Prefer the creation of transient, lightweight adapters to the usage
+ of wild reference casts. While at it, improved documentation and
+ systematically renamed `Expression' inner typedefs as `expr_type'.
+
+2012-08-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS, configure.ac, debian/README,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_pips/ppl_pips.cc, doc/definitions.dox, doc/fdl.txt,
+ interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/tests/pip_test.c,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java, interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/Variable_Output_test1.java,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/Prolog_interface_sysindep.dox,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/smm.clpq,
+ interfaces/Prolog/tests/smmdiff.clpq, src/Affine_Space.cc,
+ src/Affine_Space.defs.hh, src/Any_Pointset.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.inlines.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint_System.cc,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/Determinate.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Doubly_Linked_Object.inlines.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Float.templates.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Handler.inlines.hh,
+ src/Has_Assign_Or_Swap.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval_Info.defs.hh, src/Linear_Form.templates.hh,
+ src/Linear_System.templates.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Og_Status.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/Partial_Function.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pending_Element.defs.hh, src/Pending_Element.inlines.hh,
+ src/Pending_List.defs.hh, src/Pending_List.templates.hh,
+ src/Ph_Status.cc, src/Pointset_Ask_Tell.cc,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_conversion.templates.hh,
+ src/Polyhedron_minimize.templates.hh, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_simplify.templates.hh,
+ src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+ src/Powerset.templates.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+ src/Threshold_Watcher.defs.hh, src/Threshold_Watcher.inlines.hh,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variables_Set.cc, src/Watchdog.cc, src/Watchdog.inlines.hh,
+ src/Weight_Profiler.cc, src/Weight_Profiler.defs.hh,
+ src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/distances.inlines.hh,
+ src/fpu-c99.inlines.hh, src/fpu-none.inlines.hh, src/fpu.defs.hh,
+ src/globals.defs.hh, src/globals.inlines.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/linearize.hh, src/math_utilities.defs.hh,
+ src/math_utilities.inlines.hh, src/meta_programming.hh,
+ src/namespaces.hh, src/ppl-config.cc.in, src/termination.cc,
+ src/termination.defs.hh, src/termination.templates.hh,
+ src/wrap_string.cc, src/wrap_string.hh, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/constrains1.cc, tests/Box/constrains1.cc,
+ tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/polyhedron2.cc,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/approximatepartition1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/grid1.cc,
+ tests/Grid/intersection1.cc, tests/Grid/maxmin1.cc,
+ tests/Grid/membytes1.cc, tests/Grid/partition1.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/MIP_Problem/exceptions1.cc,
+ tests/MIP_Problem/mipproblem1.cc, tests/MIP_Problem/mipproblem2.cc,
+ tests/MIP_Problem/mipproblem3.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affinepreimage1.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dualhypercubes.cc,
+ tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/hybrid.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/numberinput1.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/difference1.cc,
+ tests/Powerset/powerset1.cc, tests/ppl_test.cc, tests/ppl_test.hh,
+ utils/timings.cc: Do not use TABs for code layout. Detected by
+ ECLAIR service tabindnt.
+
+2012-08-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ src/Polyhedron_conversion.templates.hh,
+ src/Polyhedron_minimize.templates.hh: Avoided som implicit integral
+ conversion that changed the signedness of the underlying type.
+ Detected by ECLAIR service utypflag.
+
+2012-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc: Unwanted recursion removed. Detected by ECLAIR
+ service funrecsn.
+
+2012-08-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc: Prefer explicit cast to implicit narrowing
+ conversion. Detected by ECLAIR service utypflag.
+
+2012-08-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: Added helper method
+ insert_precise_aux to avoid recursive call. Detected by ECLAIR
+ service funrecsn.
+
+2012-08-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh: Added several missing <CODE> tags in
+ Doxygen comments.
+
+2012-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc: Unwanted recursion removed. Detected by ECLAIR
+ service funrecsn.
+
+2012-08-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Concrete_Expression.defs.hh, src/Concrete_Expression.types.hh,
+ src/Determinate.defs.hh, src/Floating_Point_Expression.defs.hh,
+ src/Handler.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Pointset_Powerset.defs.hh, src/Result.defs.hh,
+ src/Rounding_Dir.defs.hh, src/WRD_coefficient_types.defs.hh,
+ src/globals.types.hh, src/termination.defs.hh: Fixed several minor
+ documentation issues.
+
+2012-08-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Expression_Adapter.defs.hh: Use PPL_U when macro parameters
+ are used as template type arguments.
+
+2012-08-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc: Avoid outer-scope name hiding. Detected by
+ ECLAIR service declhidn.
+
+2012-08-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression_Impl.templates.hh, src/termination.cc: Avoid
+ outer-scope name hiding. Detected by ECLAIR service declhidn.
+
+2012-08-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh: Indentation
+ fixed. Detected by ECLAIR service indntion.
+
+2012-08-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Avoid implicit floating-integral
+ conversions. Detected by ECLAIR service utypflag.
+
+2012-08-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Integer.hh: Do not let constant unsigned integer expressions
+ wrap-around. Detected by ECLAIR service cnstwrap.
+
+2012-08-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Expression_Adapter.defs.hh: Use a standard comment header
+ block. Detected by ECLAIR service cmntfile.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Literals fixed.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.defs.hh: Comment improved.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.defs.hh, src/Linear_System.templates.hh: Do not use
+ comments to "comment out" code. Detected by ECLAIR service
+ cmntdout.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Expression_Adapter.types.hh: Use a standard comment header
+ block. Detected by ECLAIR service cmntfile.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Code should not be on the same line
+ as a null statement. Detected by ECLAIR service nullstmt.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Do not use C-style casts. Detected
+ by ECLAIR service castexpr.
+
+2012-08-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: Detected by ECLAIR service inclmixd.
+
+2012-08-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Expression_Hide_Inhomo.defs.hh,
+ src/Expression_Hide_Inhomo.inlines.hh, src/Generator.defs.hh: Fixed
+ a couple of name hiding issues in Expression_Hide_Inhomo adapter.
+ This commit is meanto to be part of
+ 9e4c9c57ae8ffca73bb9ee6c75a43d6ed6cd4096
+
+2012-08-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/C_Polyhedron.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Expression_Adapter.defs.hh, src/Expression_Adapter.inlines.hh,
+ src/Expression_Adapter.types.hh,
+ src/Expression_Hide_Inhomo.defs.hh,
+ src/Expression_Hide_Inhomo.inlines.hh,
+ src/Expression_Hide_Inhomo.types.hh,
+ src/Expression_Hide_Last.defs.hh,
+ src/Expression_Hide_Last.inlines.hh,
+ src/Expression_Hide_Last.types.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_widenings.cc,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh,
+ src/Linear_Expression_Impl.defs.hh,
+ src/Linear_Expression_Impl.templates.hh, src/Makefile.am,
+ src/Octagonal_Shape.templates.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Scalar_Products.cc,
+ src/termination.cc, tests/Grid/congruence1.cc,
+ tests/Grid/generator1.cc, tests/Grid/partition1.cc,
+ tests/Polyhedron/bhrz03widening3.cc, tests/Polyhedron/disjoint1.cc,
+ tests/Polyhedron/disjoint2.cc: Changed the way of accessing the
+ underlying expression in classes Constraint, Generator, Congruence
+ and Grid_Generator. The public methods expression() systematically returns (a const
+ reference to) an expression adapter derived from template
+ Expression_Adapter (including Expression_Hide_Inhomo and
+ Expression_Hide_Last). These adapters provide a *read-only*
+ interface enabling most (but not all) of the operations that can be
+ performed on a Linear_Expression. Added four templatic constructors to Linear_Expression accepting any
+ such adapter. Removed a dozen specific constructors that were
+ tailored to the four classes Constraint, Generator, Congruence and
+ Grid_Generator. As a consequence previous code such as Linear_Expression expr(gen); will no longer compile and should
+ be replaced by Linear_Expression expr(gen.expression()); The systematic use of the new adapters, besides removing some
+ indirections, also decreases the memory overhead of classes
+ Constraint, Generator and Grid_Generator, as we no longer need
+ members `wrapped_expr' and `semi_wrapped_expr'. While at it, corrected a few latent bugs in adapter
+ Expression_Hide_Inhomo (these could not manifest as real failures
+ because currently the Hide_Inhomo adapter is always re-wrapped using
+ the Expression_Hide_Last adapter).
+
+2012-08-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2012-08-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Added a few recent changes regarding the Java language
+ interface.
+
+2012-08-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java, interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java,
+ interfaces/Java/tests/Custom_Variable_Stringifier.java: A couple of
+ changes to the Java interface: - Variable's id are of long type (like space dimension arguments); - added NOT_EQUAL value to enumeration Relation_Symbol.
+
+2012-08-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Makefile.am: Updated.
+
+2012-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/Custom_Variable_Stringifier.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Variable_Output_test1.java: Added test class
+ Custom_Variable_Stringifier and corresponding example for testing
+ customization of Variable output in the Java interface.
+
+2012-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Variable.java: Added native
+ methods toString() and setStringifier() to class Variable.
+ Implemented variable output function using the customizable
+ stringifier.
+
+2012-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java:
+ Added Variable_Stringifier interface.
+
+2012-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variable.defs.hh: The default output function for Variable's
+ objects made public. There is no actual reason to have it private:
+ being public, we simplify the life of a user willing to set it back
+ to default.
+
+2012-07-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java, interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/ppl_java_tests_common: Use ArrayList instead
+ of Vector for (constraints, ...) systems in Java. Added a paragraph
+ to the introduction of the user manual to stress that the PPL
+ *_System classes extend ArrayList. While at it, removed many
+ useless import directives. Also fixed a couple of indentation
+ issues.
+
+2012-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, src/Makefile.am: Avoid a non-portable GNU Make idiom
+ (using $< in a non-suffix rule context).
+
+2012-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Concrete_Expression/polyhedron2.cc: Changed test04 to print
+ more info when noisy.
+
+2012-06-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Use std::floor() and std::frexp()
+ instead of floorl() and frexpl(), respectively.
+
+2012-06-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am: Typo fixed.
+
+2012-06-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Typo fixed.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Spurious blank line removed.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AmatoPS12.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Work around a Doxygen bug. Stick to ASCII.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: More PPL citations.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Stick to ASCII.
+
+2012-06-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README.configure: Added a section on README.configure describing
+ dense/sparse row choices.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: More PPL citations.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: New PPL citations.
+
+2012-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_ci_prolog_manual: Redundant script removed.
+
+2012-06-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in: Upgraded doxygen configuration files to
+ version 1.8.1.1.
+
+2012-06-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Sparse_Row.defs.hh: Avoid useless namespace closing and
+ reopening.
+
+2012-06-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Improved section announcing sparse/dense row representation
+ adoption.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, compile, config.guess, config.sub, depcomp, install-sh,
+ missing, mkinstalldirs: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Notes fixed.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraMPZ12IC has just been published.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README: Updated.
+
+2012-06-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am: Unconditionally distribute the man
+ page.
+
+2012-06-26 Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+ * tests/Polyhedron/randphull1.cc: Fixed fpu rounding set/restore.
+
+2012-06-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Dense_Row.defs.hh, src/Expression_Hide_Inhomo.defs.hh,
+ src/Expression_Hide_Last.defs.hh, src/Linear_Expression.defs.hh,
+ src/Linear_Expression_Impl.defs.hh,
+ src/Linear_Expression_Interface.defs.hh, src/Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Swapping_Vector.defs.hh: Use macro
+ PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS to exclude several
+ classes/functions from user documentation. While at it, also wrap
+ several long lines.
+
+2012-06-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Version bumped.
+
+2012-06-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/watchdog1.cc: Indentation fixed.
+
+2012-06-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc: Cater for systems where Watchdog
+ objects are not supported.
+
+2012-06-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.inlines.hh: Removed a
+ couple of typedefs. These have become useless (and confusing) after
+ the merge of sparse_matrices.
+
+2012-06-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh, src/Swapping_Vector.defs.hh: Fixed
+ another couple of Doxygen warnings.
+
+2012-06-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh, src/Linear_System.defs.hh: Fixed
+ several Doxygen warnings.
+
+2012-06-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Init.defs.hh: Typo in documentation fixed.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.inlines.hh: Long source lines avoided.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh: Test restored.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc, tests/Box/membytes1.cc,
+ tests/Polyhedron/randphull1.cc: Restore the pre-PPL rounding mode
+ before using libm functions.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.defs.hh: Documentation of restore_pre_PPL_rounding()
+ extended.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Updated.
+
+2012-06-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/m4.m4: Message improved.
+
+2012-06-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Fixed a couple of Doxygen references.
+
+2012-06-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mentioned a bug corrected.
+
+2012-06-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Fixed copy-and-paste mistake. (Thanks to
+ Christian Luidolt.)
+
+2012-05-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Fixed
+ a bug affecting method contains() of weakly-relational shapes.
+
+2012-05-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/contains1.cc, tests/Octagonal_Shape/contains1.cc:
+ Added tests showing a bug in method contains() of weakly-relational
+ shapes. Method returns a wrong result when the shape is empty and the other
+ argument is not empty. Tests are based on a bug report from Gianluca
+ Amato.
+
+2012-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Links fixed.
+
+2012-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention a recently fixed bug in the PIP solver.
+
+2012-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh: Properly match #endif's directives using
+ comments.
+
+2012-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Watchdog.inlines.hh: Inclusions reordered to match the PPL
+ coding standard.
+
+2012-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.inlines.hh: Added missing inclusion of <stdexcept>.
+
+2012-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Recompute the sign of the special_equality_row
+ after modyfying it. This fixes the bug shown by test04() in
+ tests/PIP_Problem/pipproblem3.cc.
+
+2012-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem3.cc: Added a new test showing a bug
+ in PIP_Problem. The test was reduced from a slightly bigger one
+ provided by Fred Mesnard.
+
+2012-05-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression_Impl.defs.hh,
+ src/Linear_Expression_Impl.inlines.hh: Make sure template
+ specializations are declared.
+
+2012-05-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Linear_System.inlines.hh,
+ src/Linear_System.templates.hh, src/Swapping_Vector.inlines.hh,
+ src/swapping_sort.templates.hh: Avoid implicit conversions changing
+ integer signedness. Detected by ECLAIR service utypflag.
+
+2012-05-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.inlines.hh, src/Linear_Expression_Impl.templates.hh:
+ Fixed indentation. Detected by ECLAIR service indntion.
+
+2012-05-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc: Avoid C-style casts. Detected by ECLAIR service
+ castexpr.
+
+2012-05-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Linear_Expression.cc,
+ src/Linear_Expression_Impl.templates.hh: Prefer PPL_UNREACHABLE to
+ PPL_ASSERT(false).
+
+2012-05-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Grid_Generator_System.inlines.hh: Avoid redundant explicit
+ casts. Detected by ECLAIR service castexpr.
+
+2012-05-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.inlines.hh: Avoid unsigned integer wrap-around in
+ constant expressions. Detected by ECLAIR service cnstwrap.
+
+2012-05-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/OR_Matrix.templates.hh: Prefer parentheses to
+ excessive reliance on C++ operator precedence rules. Detected by
+ ECLAIR service exprprns.
+
+2012-05-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc: Reduced scope of local variable. Detected
+ by ECLAIR service minscope.
+
+2012-05-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_simplify.cc: Fixed comment about case-block termination.
+ Detected by ECLAIR service swchsynt.
+
+2012-05-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.templates.hh: Fixed file comment block.
+ Detected by ECLAIR service cmntfile.
+
+2012-05-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * README, m4/Makefile.am, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4, src/checked.cc,
+ src/checked.defs.hh, src/checked_float.inlines.hh,
+ src/checked_mpq.inlines.hh: Avoid use C++ library for exact
+ conversion from floating point numbers to string: the library is
+ free to ignore requested precision.
+
+2012-04-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Expression_Hide_Inhomo.defs.hh,
+ src/Expression_Hide_Inhomo.inlines.hh,
+ src/Expression_Hide_Inhomo.types.hh,
+ src/Expression_Hide_Last.defs.hh,
+ src/Expression_Hide_Last.inlines.hh, src/Linear_Expression_Impl.cc,
+ src/Linear_Expression_Impl.defs.hh,
+ src/Linear_Expression_Impl.inlines.hh,
+ src/Linear_Expression_Impl.templates.hh,
+ src/Linear_Expression_Impl.types.hh,
+ src/Linear_Expression_Interface.defs.hh,
+ src/Linear_System.templates.hh, src/Matrix.inlines.hh,
+ src/Polyhedron_chdims.templates.hh, src/Swapping_Vector.defs.hh,
+ src/Swapping_Vector.inlines.hh: Updated copyright years.
+
+2012-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int8_a,
+ interfaces/Prolog/tests/expected_pchk_int8_a: Corrected expected
+ results for (overflowing) tests on bounded coefficients.
+
+2012-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int16_a: Changed sign of
+ overflow in 16-bits Prolog test.
+
+2012-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/boundedh79extrapolation1.cc: test01() no longer
+ overflows with 8-bits and assertions on C polyhedra.
+
+2012-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc: test09() no longer
+ overflows with 8-bit coefficients and assertions on.
+
+2012-04-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/globals.defs.hh: Fixed typo.
+
+2012-04-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/assert.hh, src/globals.cc, src/globals.defs.hh,
+ src/globals.inlines.hh: Protect in_assert flag from exceptions.
+
+2012-04-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int16: Another test where
+ we get an overflow with changed sign.
+
+2012-04-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_pchk_int8: Sign of overflow has
+ changed.
+
+2012-04-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/wrap1.cc: test14() overflows with 16 bit integers and
+ assertions turned off.
+
+2012-04-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/affineimage2.cc: test16() overflows on 16 bits even
+ with assertions turned off.
+
+2012-04-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected_int32: Test sampleh7.ine no longer causes
+ an overflow.
+
+2012-04-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Allow for Prolog exception
+ errors to have message functor ppl_length_error.
+
+2012-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2012-04-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Sparse_Row.cc: Weaken assertion in mixed Sparse-Dense
+ linear_combine(). (Note: they can be called in
+ Constraint_System::affine_preimage() with a second argument row with
+ a smaller size than the first one; see e.g. test02() in
+ tests/Concrete_Expression/polyhedron1.cc). a call in
+ Constraint_System::affine_preimage()).
+
+2012-04-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Sparse_Row.cc: Wrap a few long lines.
+
+2012-04-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * : commit c098c056b375b809087be22be43abf29ee516d63 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Mon Apr 16 22:04:46 2012
+ +0200
+
+2012-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2012-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README, demos/ppl_lcdd/ppl_lcdd.1,
+ demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_pips/ppl_pips.1,
+ doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1: Updated.
+
+2012-04-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/Prolog/Prolog_interface_sysindep.dox: Minor corrections
+ in the documentation for set_deterministic_timeout.
+
+2012-04-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Updated.
+
+2012-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am: The Intel C/C++ compiler does not
+ support -pedantic.
+
+2012-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, demos/ppl_lpsol/Makefile.am: The Intel C/C++
+ compiler does not support -pedantic.
+
+2012-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Typo fixed. Version number bumped.
+
+2012-04-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/weightwatch1.cc: Test PIP_Problem/weightwatch1
+ requires unbounded coefficients.
+
+2012-04-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Prolog_interface_sysindep.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ src/Threshold_Watcher.inlines.hh, src/globals.defs.hh,
+ src/globals.inlines.hh: Modified signature of function
+ set_deterministic_timeout().
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/Prolog/ppl_prolog_common.cc: Fixed a bug in the
+ Prolog interface whereby predicate ppl_set_deterministic_timeout/1.
+ It was flagging arguments bigger than 4294967295 as erroneous.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Revert "The function
+ ppl_set_deterministic_timeout() in the C interface now takes an
+ unsigned long long parameter." This reverts commit 7781b2d72ad31906c830a16a942b31ac305924c2.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/OCaml/OCaml_interface.dox,
+ interfaces/Prolog/Prolog_interface_sysindep.dox: Substituted "alpha
+ testing" with "beta testing".
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: The function
+ ppl_set_deterministic_timeout() in the C interface now takes an
+ unsigned long long parameter. It erroneously used to take an
+ unsigned int.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Profiled.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am, tests/PIP_Problem/{bug1.cc =>
+ weightwatch1.cc}: New test program.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc: Comments improved.
+
+2012-04-07 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Linear_Row.cc: Ignore always unhandled bits.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am: Cleaned.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Avoid using @ outside BibTex entries.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Avoid using @ outside BibTex entries.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Missing comma added.
+
+2012-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib, doc/ppl_citations.bib: Avoid non-ASCII characters.
+
+2012-04-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Added calls to WEIGHT macros.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Weight computation fixed and adjusted.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.cc: Let ppl_unreachable_msg() print a more sensible
+ message.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.hh: Punctuation fixed.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.cc: Mimic the message given by standard assert.
+
+2012-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/assert.hh: Added a comment to clarify definition of
+ PPL_ASSERT.
+
+2012-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/assert.cc, src/assert.hh: Improved error message reporting for
+ assertion failures.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: Reordered so as to allow compilability with
+ -DPPL_PROFILE_ADD_WEIGHT=1.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Weight_Profiler.cc: Variable name fixed.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Threshold_Watcher.defs.hh: Reference to no longer existing
+ namespace removed. (Wonder why we did not have a Doxygen warning.)
+
+2012-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Row.inlines.hh: Clarified reason of assertion failing
+ by adding a message.
+
+2012-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Row.cc: When dumping Linear_Row::Flags with assertions
+ turned off, force the (unavailable) rpi/nnc validity bits as "set".
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Do not use #define without a value.
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/bug1.cc: The given problem is not satisfiable
+ (independently verified with other solvers).
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am, tests/PIP_Problem/bug1.cc,
+ tests/PIP_Problem/bug1.dat: Make it easier to reproduce issue [PPL
+ 0000353].
+
+2012-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Use add_mul_assign().
+
+2012-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Function renamed and documented.
+
+2012-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Indentation fixed.
+
+2012-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Indentation fixed.
+
+2012-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/bug1.dat: Set the validity bits.
+
+2012-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/bug1.cc, tests/PIP_Problem/bug1.dat: To
+ reproduce Mantis issue [PPL 0000353].
+
+2012-04-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Grid.defs.hh, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron_public.cc: Made several exception thrower methods
+ static. Renamed throw_generic() as throw_invalid_argument() for
+ consistency. In generalized_affine_{pre}image(), systematically
+ throw an invalid argument exception if relsym == NOT_EQUAL.
+ Corrected several inaccuracies in exception error messages.
+
+2012-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Corrected typo.
+
+2012-04-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, doc/Makefile.am: Distribute the bibliographies.
+
+2012-04-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib, doc/ppl_citations.bib: Added copyright and licensing
+ information.
+
+2012-04-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, NEWS, src/Makefile.am: Updated.
+
+2012-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron_public.cc: Removed two unused and unwanted methods.
+ (They were also wrongly implemented.)
+
+2012-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraMPZ12IC.
+
+2012-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraMPZ12TR.
+
+2011-09-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Broken link removed.
+
+2011-09-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Links fixed.
+
+2011-09-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Links fixed.
+
+2011-09-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Broken links removed.
+
+2011-09-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: URI's updated.
+
+2010-11-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Andre10.
+
+2010-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Fixed CousotC79.
+
+2010-04-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ10CGTA has been published.
+
+2010-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BandaG10.
+
+2010-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraMPZ10TR.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BozgaGI09.
+
+2010-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added FeautrierCB07.
+
+2010-02-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added TrifunovicCEFG+10.
+
+2010-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09CGTA renamed and completed.
+
+2010-01-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ10FMSD renamed and completed.
+
+2010-01-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Feautrier88.
+
+2010-01-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Updated BagnaraHZ10FMSD.
+
+2009-12-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added FagesR09 and JhalaM09.
+
+2009-10-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added the online version of BagnaraHZ09CGTA.
+
+2009-10-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Completed BagnaraHZ09TCS.
+
+2009-09-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ09CGTA.
+
+2009-09-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09TCS completed.
+
+2009-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Improved BagnaraHZ09TCS and BagnaraHZ09FMSD. Added
+ BagnaraHZ09TRb.
+
+2009-08-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Typo fixed.
+
+2009-08-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09TCS updated.
+
+2009-07-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added PerezRS09.
+
+2009-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added JeannetM09.
+
+2009-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Halbwachs93 completed.
+
+2009-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09 updated and renamed BagnaraHZ09FMSD.
+
+2009-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added LimeRST09.
+
+2009-06-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: URL added.
+
+2009-06-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added RizkBFS09.
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09 will be published in Formal Methods in
+ System Design.
+
+2009-05-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added LeconteB06.
+
+2009-05-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added SenS07TR.
+
+2009-04-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added LogozzoF08.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ09TRa updated.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Updated BagnaraHZ09TRa.
+
+2009-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added URI for arXiv.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added YangWGI09. Non-ASCII characters
+ removed.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AlbertACGPZ08.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ09TRa.
+
+2009-04-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added MoserKK07. Entries sorted. Some
+ specifications of page numbers fixed.
+
+2009-04-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Added bibtex entry for BagnaraHZ09 (submitted for
+ publication).
+
+2009-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BandaG09. Used the right kind of dash
+ in other entries.
+
+2009-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Frehse08.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AlbertAGPZ08.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added DenmatGD07.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added KimGR07.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: GulwaniL-AS09 updated.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: AlurKRS08 updated.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AlbertAGP08.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added MakhloufK06.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BjorndalenA05.
+
+2009-01-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added PopeeaC08.
+
+2009-01-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BramanM08.
+
+2009-01-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added ChenMC08.
+
+2009-01-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Entries reordered.
+
+2009-01-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added LavironL09.
+
+2009-01-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GulwaniL-AS09.
+
+2009-01-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ09TCS.
+
+2008-12-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added TraonouezLR08.
+
+2008-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Added BemporadFT00TR and BemporadFT01.
+
+2008-11-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Use \url instead of \tt.
+
+2008-11-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added QuillereRW00.
+
+2008-10-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Several corrections to BlanchetCCFMMMR02.
+
+2008-10-27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Added reference to the paper by Blanchet et al that
+ proposes the widening with thresholds (2002).
+
+2008-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Soffia08TR.
+
+2008-09-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Vasconcelos08th.
+
+2008-08-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Removed note from BagnaraHZ08SCP.
+
+2008-08-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AlurKRS08.
+
+2008-07-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BouchyFL08.
+
+2008-07-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ08SCP completed.
+
+2008-06-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Warren03.
+
+2008-06-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added SenS07.
+
+2008-06-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added RepsBL06.
+
+2008-06-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added SimonK07.
+
+2008-04-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Added bibliographic entry HenkinMT71 (to be double
+ checked).
+
+2008-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added PayetS07th.
+
+2008-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: GopanR07a completed.
+
+2008-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Gopan07th.
+
+2008-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Gobert07th.
+
+2008-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SankaranarayananIG07. Completed
+ GopanR07b.
+
+2008-02-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ08 renamed BagnaraHZ08SCP (the paper to
+ appear on Science of Computer Programming). New paper BagnaraHZ08
+ (the VMCAI 2008 paper).
+
+2008-02-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Henriksen07th.
+
+2007-08-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Starynkevitch07 completed.
+
+2007-08-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Starynkevitch07.
+
+2007-08-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ08.
+
+2007-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added YangWGI06.
+
+2007-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GopanR07a.
+
+2007-07-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GopanR07b.
+
+2007-07-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GobertLC07.
+
+2007-07-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: CovaFBV06 completed.
+
+2007-07-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SankaranarayananISG06.
+
+2007-06-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Doyen06th.
+
+2007-06-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Typo fixed.
+
+2007-06-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SlaninaSSM07TR.
+
+2007-06-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ07TRb completed.
+
+2007-06-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Typo fixed.
+
+2007-06-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Vigna07.
+
+2007-06-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added ArmandoBM07.
+
+2007-06-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ07TRb (still incomplete).
+
+2007-06-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Renamed.
+
+2007-06-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ07TR renamed BagnaraHZ07TRa.
+
+2007-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraDHMZ07 completed.
+
+2007-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Revised Ricci02th.
+
+2007-02-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: DoyenHR05 added. Formed DoyenHR05 now has
+ key DoyenHR05TR.
+
+2007-01-19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Added volume number for BagnaraDHMZ07
+
+2007-01-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ07TR.
+
+2007-01-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Fixed Frehse05.
+
+2007-01-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Fixed StoerW70.
+
+2007-01-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added FrankM02th. Completed Flexeder05th.
+
+2007-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: FrehseKRM05 replaced by FrehseKRM06.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added a PDF URL to BagnaraHZ06TR.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Flexeder05th.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added ChakrabortyMS06.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added CovaFBV06.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: AsarinDFGLGM06 is no longer "to appear."
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Completed vanHeeOSV06.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: HenriksenG06 completed.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: GopanR06 completed.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: GonnordH06 completed.
+
+2006-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: SongCR05 rekeyed SongCR06, corrected and
+ completed.
+
+2006-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ06STTT completed.
+
+2006-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraDHMZ05TR.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Missing comma added.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraDHMZ06a substituted by BagnaraDHMZ07.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: HalbwachsMG06 completed.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Typo fixed.
+
+2006-12-18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Updated BagnaraDHMZ06a and BagnaraDHMZ06b entries.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ06STTT updated.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Typo fixed.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ06TR corrected and completed.
+
+2006-12-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Key BagnaraHZ04TRa changed to BagnaraHZ04TR.
+ Provisional entry for BagnaraHZ06TR added. Do not use double quotes
+ for numeric fields.
+
+2006-12-18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl_citations.bib: Spelling corrected.
+
+2006-12-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added NakanishiJPF99 and NakanishiF01.
+
+2006-12-11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Previous references added removed.
+
+2006-12-11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Revised the reference for BagnaraDHMZ06a. Added references for AlurCHHHNOSY95, AlurCHH93, and Henzinger96.
+
+2006-09-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Avoid non-ASCII characters.
+
+2006-09-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib, doc/ppl_citations.bib: Spelling corrections.
+
+2006-09-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added GoldfarbR77.
+
+2006-09-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added PapadimitriouS98.
+
+2006-09-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added AsarinDFGLGM06.
+
+2006-08-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: HalbwachsMP-V03 fixed (copy and paste
+ mistake).
+
+2006-08-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added UchoaFLPPdAA06TR.
+
+2006-08-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GonnordH06.
+
+2006-08-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added HalbwachsMG06.
+
+2006-08-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added HenriksenG06.
+
+2006-08-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added abstracts for Avery06,
+ CarloniPPS-V06, GulavaniR06 and Pop06.
+
+2006-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added CarloniPPS-V06.
+
+2006-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Pop06.
+
+2006-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Avery06.
+
+2006-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GulavaniR06.
+
+2006-06-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GopanR06.
+
+2006-04-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Corrected a spelling error.
+
+2006-04-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Fixed Ancourt91th.
+
+2006-04-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added DooseM05.
+
+2006-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: MesnardB05TPLP fixed.
+
+2006-04-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Capitalization fixed in the references about
+ `polymake'.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added vanHeeOSV06.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added Ellenbogen04th.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SankaranarayananSM06.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SankaranarayananCSM06.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Minor formatting change.
+
+2006-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: GopanDMDRS04 was missing the address field: added.
+
+2006-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Ricci02th.
+
+2006-04-14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Added bib entries for Grid papers submitted to FM and
+ about to be sub,itted to LOPSTR. Note that the link on my site to
+ the postscript for the LOPSTR submission is deliberately unreadable
+ until the actual submission.
+
+2006-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: FrehseKR06 fixed.
+
+2006-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ05STTT renamed BagnaraHZ06STTT; year field
+ changed to 2006.
+
+2006-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added KhachiyanBBEG06.
+
+2006-01-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added FrehseKR06.
+
+2006-01-20 Andrea Pescetti <pescetti at no.email>
+
+ * doc/ppl.bib: Broken and obsolete links updated.
+
+2006-01-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib, doc/ppl_citations.bib: Added ISBN for the SAS 2005
+ volume.
+
+2006-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Trailing blanks removed.
+
+2006-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Missing comma added.
+
+2006-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraDHMZ05TR.pdf.
+
+2005-09-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Ancourt91th completed.
+
+2005-09-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Fixed many broken or redirected links.
+
+2005-09-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Frehse05th added.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: CacheraM-A05 added.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added DoyenHR05.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added LagoonMS03.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: KruegelKMRV05 added.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added FrehseKRM05.
+
+2005-09-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: SongCR05 added.
+
+2005-09-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: BagnaraR-CZ05 completed.
+
+2005-09-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Completed the bibliographic information for
+ BagnaraHRZ05SCP.
+
+2005-09-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added HuelsbergenHL90.
+
+2005-09-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Completed the entry for BagnaraHZ05FAC.
+
+2005-08-05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Added 1997 paper by Quinton et al.
+
+2005-05-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Address added to CousotC76.
+
+2005-05-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Unwanted quotes removed.
+
+2005-05-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Conflict removed.
+
+2005-05-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Frehse05 completed.
+
+2005-05-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHZ05FAC.
+
+2005-05-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added BagnaraR-CZ05 and BagnaraR-CZ05TR.
+
+2005-05-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHMZ05 and BagnaraHZ05STTT.
+
+2005-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Announce the new paper on widenings for
+ weakly-relational numeric abstractions.
+
+2005-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Reordered.
+
+2005-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added JaffarMSY94, NelsonO77, NelsonO80, Pratt77 and
+ Shostak81.
+
+2005-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Use a double hyphen in page ranges. Use month codes
+ instead of month names.
+
+2005-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraMHZ05TR.
+
+2005-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Mine04 fixed.
+
+2005-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added page numbers to Frehse05.
+
+2005-03-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Mine05th.
+
+2005-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added GopanRS05.
+
+2005-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Spurious booktitle field removed.
+
+2005-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ03b improved.
+
+2005-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added SankaranarayananSM05.
+
+2005-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Frehse05 added.
+
+2005-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHMZ04EA.
+
+2005-01-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Links to Komei Fukuda's home page updated.
+
+2005-01-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BagnaraHRZ05SCP.
+
+2005-01-04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Removed erroneous line in Mine01a.
+
+2004-12-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Mine01a and Mine02. Minor improvements
+ elsewhere.
+
+2004-12-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Mine04 added.
+
+2004-11-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Previous change reverted.
+
+2004-11-02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: "official" changed to "full".
+
+2004-09-27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: References added to abstract for the Granger 1997
+ paper.
+
+2004-09-27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Removed citations to applications in the paragraph
+ about integral grids. Added to ppl.bib, references for Ancourt
+ thesis, two papers by Granger (1991 and 1997) and Technical report
+ by Quinton et al.
+
+2004-09-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Last change reverted: in the bibliography we use the
+ right LaTeX code, which is then simplified, when needed, for the
+ sake of BibTeX2HTML.
+
+2004-09-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Do not use LaTeX that cannot be decently handled by
+ BibTeX2HTML.
+
+2004-09-27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: Completed draft descriptions of the numerical
+ abstractions. Added to ppl.bib reference to the Mine paper on the
+ octagon domain and to Roberto's thesis. Updated the gif version of
+ the illustration of a relational grid to correspond to that already
+ in abstractions.tex.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Make sure `I/O' is not touched by BibTeX.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Missing comma added.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added a first draft for FrehseHK04.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added a first draft for Frehse04.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: Added HalbwachsMP-V03.
+
+2004-08-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_citations.bib: New page and bibliography for citations.
+
+2004-08-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Integrated the "abstract" of CousotC79.
+
+2004-08-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Added entries for CousotC76 and CousotC79, with
+ "abstracts" (actually, the first sentences from the introductions)
+ and URLs to PDF versions.
+
+2004-07-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added BalasundaramK89. This paper, back in 1989,
+ introduced what are now called "octagons" under the name "simple
+ sections."
+
+2004-07-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Kannan92 removed.
+
+2004-07-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Kannan92.
+
+2004-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Bagnara98SCP fixed.
+
+2004-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added GopanDMDRS04.
+
+2004-02-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added Masdupuy92 and Masdupuy93th.
+
+2004-01-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Added entry for Q349.
+
+2004-01-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ03a added. BagnaraHZ03 renamed BagnaraHZ03b.
+
+2004-01-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ04 fixed, completed and renamed BagnaraHZ03
+ (since the publication date is 2003).
+
+2003-11-19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: added reference to Schriver text book.
+
+2003-11-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Key for NookalaR00 capitalized consistently.
+
+2003-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ04 added.
+
+2003-11-05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.bib: NELS and similar changes.
+
+2003-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Bagnara98SCP added.
+
+2003-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHRZ03 completed.
+
+2003-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Missing commas added, unnecessary commas removed.
+
+2003-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHRZ03 added.
+
+2003-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: GawrilowJ01 fixed.
+
+2003-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Entry for Quaderno 312 completed. Abstract for
+ Quaderno 305 added.
+
+2003-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Draft entry for BagnaraHRZ03TR added.
+
+2003-02-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Typo fixed in Halbwachs79th. HenzingerH95 and
+ HenzingerPW01 added.
+
+2002-11-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ02TR will appear as Quaderno 305.
+
+2002-10-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ02TR added.
+
+2002-10-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Halbwachs93 added.
+
+2002-10-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BessonJT99 added.
+
+2002-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BultanGP99 added.
+
+2002-10-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Dantzig63 added.
+
+2002-10-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Typo fixed. File bibliography.raw regenerated with
+ the new version of bibtex2html (1.54).
+
+2002-10-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Srivastava93 added.
+
+2002-09-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraHZ02a added.
+
+2002-09-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraRZH02 added.
+
+2002-07-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Force capitalization of "Parma Polyhedra Library" the
+ right way.
+
+2002-07-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: In the entry for BagnaraRZH02, enforced
+ capitalization of the PPL.
+
+2002-07-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Entry for BagnaraRZH02 completed.
+
+2002-07-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraRZH02 added.
+
+2002-06-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: BagnaraRZH02TR and BagnaraRZH02TRerrata added.
+
+2002-06-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Halbwachs79th added.
+
+2002-06-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: CousotC92-PLILP added.
+
+2002-04-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: HalbwachsKP95 added.
+
+2002-04-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/ppl.bib: Corrected entry of LeVerge92, so as to consider "Le"
+ as part of the family name.
+
+2002-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: LeVergeVDW94 added.
+
+2002-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Loechner99 added.
+
+2002-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: StoerW70 added.
+
+2002-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Kuhn56 added.
+
+2002-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: HalbwachsPR94 added.
+
+2002-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: NEW-POLKA-1-1-3c added.
+
+2002-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Added GawrilowJ00, GawrilowJ01, and LoechnerW97.
+
+2002-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: NemhauserW88 fixed.
+
+2001-12-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: There is no abstract in Weyl50.
+
+2001-12-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Weyl35 and Weyl50 added.
+
+2001-10-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: MotzkinRTT53 added.
+
+2001-10-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: NemhauserW88 added.
+
+2001-10-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Provide the source code from LeVerge92.
+
+2001-10-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Chernikova6[458] fixed: they were all wrong.
+
+2001-10-08 Elisa Ricci <ericci at no.email>
+
+ * doc/ppl.bib: Added the Chernikova's articles (what I know).
+
+2001-10-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: LeVerge92 fixed (missing comma and spurious
+ brackets).
+
+2001-10-08 Elisa Ricci <ericci at no.email>
+
+ * doc/ppl.bib: Added the 'Abstract' for "A note on Chernikova's
+ Algorithm".
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Fukuda98 added.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: LeVerge92 added.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: CousotH78 fixed.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: FukudaP96 updated: abstract revised, URL and backup
+ copy provided.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: FukudaP96 added.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: Generate a bibliography page from ppl.bib: this is
+ referenced from the Documentation page. Abstract of Wilde93th added.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: CousotH78 added.
+
+2001-10-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.bib: All the documentation, both ours and the papers we
+ cite, belong to the Documentation directory. The mirror subdirectory will contain backup copies of the papers we
+ reference: things disappear from the web far too often. HalbwachsPR97 added.
+
+2012-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in: Updated for Doxygen 1.8.0.
+
+2012-03-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Indentation fixed.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in:
+ Simplified INPUT tag values in devref manuals' Doxygen configuration
+ files. Avoid most of the explicit listing of source files,
+ favouring a much smaller number of file name patterns.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Result.defs.hh, src/Result.inlines.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh: Doxygen
+ \relates command can not be used with enumerated types. Replace it
+ with \name grouping.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am: No longer using the installdox command
+ (deprecated and subject to removal). Fixed Doxygen configuration
+ paths for license files.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/linearize.hh: Further improvements to documentation of helper
+ functions.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Concrete_Expression.types.hh: Use Doxygen command \class for
+ declared-but-undefined class templates.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/linearize.hh: Improved documentation formatting using Doxygen
+ command \tparam.
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.defs.hh: Fixed typo in documentation
+ (causing a Doxygen warning).
+
+2012-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Corrected name of Doxygen
+ documentation group.
+
+2012-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/propagateconstraints2.cc: On machines where float is
+ supported and double is not supported, test01() can yield results
+ that are significantly less precise. (Thanks to Sean McGovern.)
+
+2012-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh: Parameter name fixed.
+
+2012-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, tests/Box/interval1.cc, tests/Box/membytes1.cc: Do
+ not assume doubles are supported.
+
+2012-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2012-03-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.inlines.hh, tests/Concrete_Expression/bdshape1.cc,
+ tests/Concrete_Expression/bdshape2.cc,
+ tests/Concrete_Expression/octagonalshape1.cc,
+ tests/Concrete_Expression/octagonalshape2.cc,
+ tests/Concrete_Expression/polyhedron2.cc: Surround non integer
+ costants with a cast to boundary type.
+
+2012-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc,
+ tests/Concrete_Expression/polyhedron1.cc: Do not rely on doubles
+ being supported.
+
+2012-03-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * m4/ac_cxx_float_exact_output.m4: Output is exact also with some
+ added needless zeroes.
+
+2012-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Random_Number_Generator.inlines.hh: Removed unused parameter
+ name.
+
+2012-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh, src/Box.templates.hh,
+ src/Grid_Certificate.cc, src/Interval.inlines.hh,
+ src/MIP_Problem.inlines.hh, src/PIP_Tree.cc,
+ src/checked_float.inlines.hh, src/compiler.hh: Keep macro names
+ within the PPL namespace.
+
+2012-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am: Only build `ppl_pl' for
+ checking and install it only when shared libraries are disabled.
+
+2012-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4: Cater for versions of SWI-Prolog
+ configured with `--disable-libdirversion'.
+
+2012-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4: Make sure the trailing ^M are
+ suppressed under Windows.
+
+2012-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4: Remove the drive indication SWI-Prolog
+ prepends to the PLBASE path under Windows.
+
+2012-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_Certificate.cc: Corrected wrong assertion after call to
+ Grid::simplify().
+
+2012-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4: Added missing uses of `$EXEEXT'.
+
+2012-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am: Added missing link options.
+
+2012-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.cc: Useless declarations removed.
+
+2012-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.cc: Fixed debugging code.
+
+2012-03-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Corrected test for has_{upper,lower}_bound so as to
+ avoid calling the predicate on zero-dim boxes.
+
+2012-03-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Restored the build.
+
+2012-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh: Added comments.
+
+2012-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Watchdog/Makefile.am: Added `@extra_includes@' to
+ `AM_CPPFLAGS'. (Thanks to Joao M. Santos Silva.)
+
+2012-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray.in: Portability improved. (Thanks to Tim
+ Donahue.)
+
+2012-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.defs.hh, src/Generator_System.defs.hh,
+ src/Grid.defs.hh, src/Grid_Certificate.cc, src/Grid_nonpublic.cc,
+ src/Grid_simplify.cc, src/Grid_widenings.cc, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/OR_Matrix.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/PIP_Problem.defs.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Pointset_Powerset.defs.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_nonpublic.cc, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Variables_Set.defs.hh: Fixed lots
+ of parameter names. Detected by ECLAIR service funparam.
+
+2012-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Row.defs.hh, src/Box.defs.hh,
+ src/Box.templates.hh, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Concrete_Expression.inlines.hh, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constraint_System.defs.hh, src/Determinate.defs.hh,
+ src/Generator.cc, src/Grid.defs.hh, src/Linear_Row.inlines.hh,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Tree.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc,
+ src/Ptr_Iterator.inlines.hh, src/termination.templates.hh: Fixed
+ lots of parameter names. Detected by ECLAIR service funparam.
+
+2012-03-22 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/BD_Shape.templates.hh: Fixed indentation.
+
+2012-03-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/OR_Matrix.inlines.hh: Removed extra parenthesis.
+
+2012-03-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * demos/ppl_pips/ppl_pips.cc, src/CO_Tree.cc,
+ src/Floating_Point_Expression.templates.hh,
+ src/OR_Matrix.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/checked.cc, src/checked_int.inlines.hh: Added some missing
+ parenthesis.
+
+2012-03-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/OR_Matrix.inlines.hh, src/checked_int.inlines.hh: Added
+ missing parentheses. Detected by eclair service exprprns.
+
+2012-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4:
+ Fixed a couple of typos.
+
+2012-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh: Improved documentation for
+ Box<ITV>::has_{upper,lower}_bound(). Weakened precondition
+ regarding box emptiness: the box can be empty, but it can not be
+ marked empty. Added a test to the Prolog interface.
+
+2012-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Grid.templates.hh, src/Polyhedron.templates.hh: Modified
+ interface for Box<ITV>::has_{upper,lower}_bound. The changes are
+ meant to make it more similar to, e.g., maximize(). Hence, we no
+ pass in a Variable rather than a bare dimension_type and the boolean
+ reference argument `closed' is the last one.
+
+2012-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Boundary.defs.hh, src/CO_Tree.cc, src/Float.templates.hh,
+ src/OR_Matrix.inlines.hh, src/PIP_Tree.cc,
+ src/Pointset_Powerset.templates.hh, src/Sparse_Row.cc: Added
+ parentheses and improved formatting. Missing parentheses detected
+ by ECLAIR service exprprns.
+
+2012-03-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/glpk_set_d_eps.c: This file is not part of the
+ Parma Polyhedra Library.
+
+2012-03-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4: Added
+ Box method has_{upper.lower}_bound to OCaml and Prolog lang
+ interfaces.
+
+2012-03-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4: Added Box method has_{upper,lower}_bound to Java language
+ interface.
+
+2012-03-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Added Box methods has_{upper,lower}_bound to C language interface.
+
+2012-03-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/README: Text revised.
+
+2012-03-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure: Sentence revised.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, doc/libppl.3, doc/libppl_c.3,
+ doc/ppl-config.1, doc/ppl-config_extra_man_text: Man pages updated.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox: Use a canonical
+ FDL text.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc: Updated.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox: URL fixed.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Indentation fixed.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/clpq2.pl: Cleaned.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, README.alpha, README.arm, README.configure,
+ README.solaris, STANDARDS, tests/README: Copyright wording fixed.
+
+2012-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox: Updated two
+ spurious references to FDL 1.1.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, README.alpha, README.arm, README.configure,
+ README.solaris, STANDARDS, doc/README.doc, tests/README: Use a
+ consistent formatting.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, README.alpha, README.arm, README.configure,
+ README.solaris, STANDARDS, doc/README.doc,
+ doc/devref-language-interface.tex, doc/devref.tex,
+ doc/user-language-interface.tex, doc/user.tex, tests/README: Wording
+ fixed/improved.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc: Blank line added.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, README.alpha, README.arm, README.configure,
+ README.solaris, STANDARDS, doc/README.doc, tests/README: Use
+ consistent formatting for the FDL.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface_compilation.dox: Added missing
+ paragraph.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox, doc/devref-language-interface.tex,
+ doc/devref.tex, doc/user-language-interface.tex, doc/user.tex:
+ Standardized copyright messages.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.alpha, README.arm, README.solaris: Made uniform as far as
+ the copyright message and licensing conditions are concerned.
+
+2012-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure: Updated: we no longer use CVS.
+
+2012-03-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/checked.defs.hh, src/meta_programming.hh: Ensure macro
+ parameters in macro bodies are in parentheses.
+
+2012-03-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/checked.defs.hh, src/checked_numeric_limits.hh,
+ src/globals.defs.hh: Ensure parameters in bodies of macros are
+ parenthesized.
+
+2012-03-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Checked_Number.inlines.hh, src/checked.defs.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh,
+ src/globals.defs.hh, src/meta_programming.hh: Ensure parameters in
+ macro bodies are parenthesized appropriately. Missing parentheses
+ detected by ECLAIR service macrbody.
+
+2012-03-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.inlines.hh: Avoid needless macro complexity.
+
+2012-03-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * README.configure, demos/ppl_lpsol/glpk_set_d_eps.c,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Prolog/Prolog_configured_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Prolog_interface_sysdep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ tests/Concrete_Expression/linearize.cc, tests/Grid/Makefile.am,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Powerset/Makefile.am, tests/README: Fixed licenses text.
+
+2012-03-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Concrete_Expression/Makefile.am: Removed bogus use of
+ EXTRA_DIST.
+
+2012-03-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc: Avoid implicit conversions to bool.
+ Detected by ECLAIR service utypflag.
+
+2012-03-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/Prolog/SWI/swi_cfli.hh: Avoid implicit conversion from
+ boolean to integral. Detected by ECLAIR service utypflag.
+
+2012-03-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BDS_Status.inlines.hh, src/Og_Status.inlines.hh: Prefer
+ testing explicitly against zero. Detected by ECLAIR service
+ utypflag.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am: Use variables instead of repetition.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am: Typo fixed.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface_sysindep.dox: Typos fixed.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/clpq2.pl: Predicates renamed.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh: Identifier fixed.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/generalizedaffineimage2.cc: String fixed.
+
+2012-03-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.defs.hh, src/Grid_Generator.defs.hh: Comments
+ simplified.
+
+2012-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in: Commented-out code removed. Detected by
+ ECLAIR service cmntdout.
+
+2012-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Comment corrected.
+
+2012-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Old FIXMEs dealt with. Detected by ECLAIR
+ service cmntdout.
+
+2012-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh,
+ src/Cast_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+ src/Floating_Point_Expression.defs.hh, src/Linear_Form.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Octagonal_Shape.templates.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh, src/linearize.hh: Do
+ use the notation "[l, u]" to denote the closed interval with
+ boundaries `l' and `u'.
+
+2012-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Added missing full-stop in
+ comment.
+
+2012-03-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Grid.templates.hh, src/Polyhedron.templates.hh: Renamed Box
+ methods get_{upper,lower}_bound() as has_{upper,lower}_bound().
+ Improved documentation: in particular, make clearer that undefined
+ behavior is obtained when calling them on an empty box.
+
+2012-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Avoid implicit conversions to bool
+ (prefer explicit tests against zero). Detected by ECLAIR service
+ utypflag.
+
+2012-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row_Flags.cc: Avoid implicit cast narrowing a signed integer
+ value. Detected by ECLAIR service utypflag.
+
+2012-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row_Flags.defs.hh: Removed unused static const data member.
+
+2012-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ src/Pointset_Powerset.templates.hh: Avoid implicit conversions to
+ bool. Detected by ECLAIR service utypflag.
+
+2012-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/assert.hh: Avoid implicit coversion to bool. Detected by
+ Boolean service utypflag.
+
+2012-02-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh: Added missing parentheses around a
+ macro arguments. Detected by ECLAIR service macrbody.
+
+2012-02-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in: Avoid mixing plain character data with
+ numeric data. Detected by ECLAIR service utypflag.
+
+2012-02-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in: Code layout fixed.
+
+2012-02-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Updated.
+
+2012-02-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Added a missing project and updated a broken link.
+
+2012-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2012-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, TODO: Updated.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Concrete_Expression.defs.hh, src/Concrete_Expression.types.hh:
+ Let classes in Concrete_Expression.defs.hh appear in the user
+ manual.
+
+2012-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh: Documented the enumerated values of enum
+ Floating_Point_Format.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/intervals.defs.hh: Let the docs for the I_Result enum appear
+ on the devref manual only.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh, src/globals.defs.hh: Mark some docs for
+ the devref manual only.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/fpu.defs.hh: Group together documentation of functions
+ controlling FPU.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/linearize.hh: Fixed documentation for linearize and added
+ \relates directive.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.defs.hh: Grouped together docs for the
+ linear-ranking functions.
+
+2012-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh: CO_Tree and
+ Sparse_Row should only appear in the devref manual.
+
+2012-02-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Row_Flags.cc: Fixed missing namespace.
+
+2012-02-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.templates.hh, src/Interval.templates.hh,
+ src/Interval_Info.inlines.hh, src/Row_Flags.cc: Fixed and uniformed
+ iomanip uses.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/wrap_string.cc: Avoid mixing plain character data with numeric
+ data. Detected by ECLAIR service utypflag.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Removed
+ references to an obsolete file.
+
+2012-02-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/MIP_Problem.cc: Removed redundant and
+ unused stuff.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Ptr_Iterator.defs.hh: Use the same
+ typenames in function declarations/definitions. Detected by ECLAIR
+ service funtypes.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh, src/Pointset_Powerset.templates.hh,
+ src/checked_int.inlines.hh: Avoid mixing boolean and arithmetic
+ values. Detected by ECLAIR service utypflag.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh: Get rid of redundant declarations of a
+ couple of functions. Detected by ECLAIR service funtypes.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.inlines.hh: Simplified
+ Interval_Info::ascii_load(). Resettting format flags does not
+ change the istream status, which was previously tested and is known
+ to be good: hence, return true.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh,
+ src/BDS_Status.idefs.hh, src/Box_Status.idefs.hh,
+ src/Float.defs.hh, src/Grid_Status.idefs.hh,
+ src/Og_Status.idefs.hh, src/Ph_Status.idefs.hh, src/fpu.defs.hh:
+ `#error' messages made consistent.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh: Variable names fixed.
+
+2012-02-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Grid_public.cc, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron_public.cc, src/Variable.cc, src/Variable.defs.hh,
+ src/Variables_Set.cc, src/Variables_Set.defs.hh,
+ src/Variables_Set.inlines.hh, src/termination.templates.hh,
+ src/wrap_assign.hh, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/ppl_test.cc,
+ tests/ppl_test.hh: Avoid to use Variable references. Uniformed
+ Variable creations.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh: Types fixed. Useless if-then-else removed.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Use `libtool' to test linking with GMP only if
+ the option `--with-gmp-build' was given.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.cc, src/Interval_Info.defs.hh,
+ src/Ph_Status.inlines.hh: Prefer explicit tests against zero. Avoid
+ using boolean values as integer values. Detected by ECLAIR service
+ utypflag.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh, src/OR_Matrix.inlines.hh,
+ src/checked_float.inlines.hh: Improved implementation of
+ OR_Matrix<T>::any_row_iterator<U>::operator+=(). Increased
+ readability: - separated explicit type conversions from code performing
+ arithmetic operations (on non-mixed typed values); - added a few redundant parentheses. Similar improvement applied
+ to a couple of other functions. Detected by ECLAIR service
+ utypflag.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh, src/version.hh.in: Provide a named group for
+ all library version control functions.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ src/DB_Row.inlines.hh, src/Interval_Info.inlines.hh,
+ src/ppl-config.cc.in: Prefer explicit tests against zero. Detected
+ by ECLAIR service utypflag.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am: Added `Watchdog' to `SUBDIRS'.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Completed `ppl_config_SOURCES'.
+
+2012-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, tests/Concrete_Expression/Makefile.am: Cater for
+ platforms where no floating-point type is supported.
+
+2012-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Float.defs.hh,
+ src/Interval.defs.hh, src/Linear_Form.defs.hh,
+ src/PIP_Tree.defs.hh, src/termination.defs.hh: Added several missing
+ \relates and \ingroup Doxygen commands.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.defs.hh, src/Checked_Number.defs.hh,
+ src/Dense_Row.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/intervals.defs.hh: Remove docs for a few implementation classes
+ from the user manual.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/intervals.defs.hh: Properly terminate Doxygen comments.
+
+2012-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Wrong guard fixed.
+
+2012-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, NEWS, README, ppl.lsm.in: Updated.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/intervals.defs.hh: Hide enum initializers from docs. Remove
+ I_Result enumeration form user manual.
+
+2012-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Updated.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.cc, src/CO_Tree.cc, src/checked_float.inlines.hh: For
+ code clarity purposes, better distinguish signed/unsigned
+ operations. Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.inlines.hh: Exploit new helper function
+ least_significant_one_mask(), thereby avoiding unary minus on
+ unsigned integer values. Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh, src/globals.inlines.hh: Added helper function
+ least_significant_one_mask().
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4: Prefer explicit
+ test against zero. Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc: Prefer explicit test against zero.
+ Detected by ECLAIR service utypflag.
+
+2012-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/linearize.hh: Reduced the scope of variable declarations.
+ Detected by ECLAIR service minscope.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/c_streambuf.cc, src/stdiobuf.cc: Prefer explicit tests against
+ zero. Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Prefer explicit tests against
+ zero. Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+ Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Dense_Row.inlines.hh: Fixed a few misuses of assignment
+ (instead of comparison) in assertions. Detected by ECLAIR service
+ utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+ Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh: Avoid long line.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+ Detected by ECLAIR service utypflag.
+
+2012-02-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh, src/globals.inlines.hh: Prefer explicit tests
+ against zero. Detected by ECLAIR service utypflag.
+
+2012-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh: Code layout made conformat to the coding
+ standard.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Octagonal_Shape.templates.hh: Restore previous names.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Threshold_Watcher.cc, src/Time.cc, src/Watchdog.cc: Use ""
+ quotes to include non-system headers. Detected by ECLAIR service
+ hedrname.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Polyhedron_chdims.cc,
+ src/simplify.cc: Comments improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/WRD_coefficient_types.defs.hh,
+ src/checked.inlines.hh: Avoid commented-out code. Detected by
+ ECLAIR service cmntdout.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Comments improved.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Avoid implicit conversion
+ changing type signedness. Detected by ECLAIR service utypflag.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4: Fixed C
+ interface incongruence. Detected by ECLAIR service utypflag.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ src/checked_float.inlines.hh: Avoid implicit conversion changing
+ signedness. Detected by ECLAIR service utypflag.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh: Added
+ any_iterator operator+= and operator+ overloadings for unsigned
+ types.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Octagonal_Shape.templates.hh: Avoid to offset iterators twice.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Avoid implicit conversion changing
+ signedness. Detected by ECLAIR service utypflag.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Removed a couple of useless explicit
+ casts.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh,
+ src/Box.templates.hh, src/DB_Matrix.templates.hh,
+ src/Dense_Matrix.cc, src/Dense_Matrix.inlines.hh,
+ src/Grid_chdims.cc, src/Linear_System.cc,
+ src/MIP_Problem.inlines.hh, src/PIP_Problem.cc, src/PIP_Tree.cc,
+ src/globals.defs.hh, src/globals.inlines.hh: When working with
+ sizes, prefer vector::resize() to vector::erase(). Added helper
+ function nth_iter().
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/OR_Matrix.inlines.hh: Fixed implementation defined implicit
+ cast. Detected by ECLAIR service utypflag.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/wrap_assign.hh: Silenced a warning.
+
+2012-02-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Linear_Form.templates.hh: Fixed implementation defined
+ implicit cast. Detected by ECLAIR service utypflag.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/Octagonal_Shape.templates.hh,
+ src/PIP_Tree.cc: Delimit pseudo-code in non-Doxygen comments within
+ <CODE> </CODE>. Comments improved.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/c_streambuf.cc, src/c_streambuf.defs.hh, src/stdiobuf.cc:
+ Avoid implicit conversions changing type signedness. Detected by
+ ECLAIR service utypflag.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc: Delimit pseudo-code in non-Doxygen comments
+ within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Sparse_Row.defs.hh: Delimit pseudo-code in Doxygen comments
+ within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Comment improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc: Delimit pseudo-code in non-Doxygen
+ comments within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Comment improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Comments improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Delimit pseudo-code in non-Doxygen comments
+ within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Comment improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh:
+ Delimit pseudo-code in non-Doxygen comments within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh: Comment improved.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc: Delimit example code in non-Doxygen comments
+ within <CODE> </CODE>.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Comments fixed/improved.
+
+2012-02-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row_Flags.cc: Avoid implicit conversions changing type
+ signedness. Detected by ECLAIR service utypflag.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh: Avoid commented-out code. Detected
+ by ECLAIR service cmntdout.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Fixed punctuation in comments.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.inlines.hh, src/PIP_Tree.cc: Avoid commented-out
+ code. Detected by ECLAIR service cmntdout.
+
+2012-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh:
+ Comment punctuation fixed.
+
+2012-02-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/initializer.hh: Avoid unnamed namespace in header file.
+ Detected by ECLAIR service hedrfile.
+
+2012-02-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh: Enclose macro argument in parentheses. Detected
+ by ECLAIR service macrbody.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/interfaced_boxes.hh, src/Boundary.defs.hh,
+ src/Box.templates.hh, src/Checked_Number.defs.hh,
+ src/Integer_Interval.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval_Info.defs.hh, src/Interval_Restriction.defs.hh,
+ src/Makefile.am, src/Rational_Interval.hh, tests/Box/interval1.cc,
+ tests/Box/refinewithconstraint2.cc, tests/ppl_test.hh: Removed
+ interval restrictions.
+
+2012-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh: Prefer using C_Integer traits rather than
+ <climits> macros, thereby avoiding implicit conversions changing
+ type signedness. Detected by ECLAIR service utypflag.
+
+2012-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/wrap_string.cc: Rewritten function to avoid mixing signed and
+ unsigned integer types. Detected by ECLAIR service utypflag.
+
+2012-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Avoid implicit conversion changing signedness.
+ Detected by ECLAIR service utypflag.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/ppl-config.cc.in: Improved strcaseeq implementation.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.cc: Fixed cast. Detected by ECLAIR service utypflag.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.inlines.hh: Fixed signedness. Detected by
+ ECLAIR service utypflag.
+
+2012-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.templates.hh: Simplified implementation of method
+ Grid::reduce_reduced(). While at it, got rid of a few implicit
+ conversions changing signedness. Detected by ECLAIR service
+ utypflag.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.inlines.hh, src/checked_float.inlines.hh: mp_bitcnt_t
+ is not present in gmp 3.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Concrete_Expression.cc: Forgotten changes.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/C_Integer.hh: Simplified min/max evaluation.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Concrete_Expression.defs.hh,
+ src/Concrete_Expression.inlines.hh: Prefer bool field.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Time.defs.hh, src/Time.inlines.hh, src/Watchdog.cc,
+ src/Watchdog.defs.hh, src/Watchdog.inlines.hh,
+ src/checked_ext.inlines.hh: Use always long for time related
+ quantities.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.cc: Avoid implicit conversions changing integer type
+ signedness. Detected by ECLAIR service utypflag.
+
+2012-02-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.inlines.hh, src/Float.defs.hh, src/Row_Flags.defs.hh,
+ src/checked.cc, src/checked_float.inlines.hh: Avoid implicit
+ conversions changing integer type signedness. Detected by ECLAIR
+ service utypflag.
+
+2012-02-22 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.cc, src/Bit_Row.inlines.hh, src/CO_Tree.cc,
+ src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Float.templates.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/compiler.hh, src/globals.inlines.hh: Avoid implicit conversions
+ changing integer type signedness. Detected by ECLAIR service
+ utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh:
+ Avoid implicit conversions changing integer type signedness.
+ Detected by ECLAIR service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.inlines.hh: Avoid implicit conversion changing
+ type signedness. Detected by ECLAIR service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.inlines.hh, src/Grid.defs.hh, src/Grid.inlines.hh,
+ src/Grid.templates.hh, src/Grid_Generator.cc, src/Grid_chdims.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/NNC_Polyhedron.cc,
+ src/NNC_Polyhedron.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/globals.cc, src/globals.defs.hh:
+ Added helper function check_space_dimension_overflow(). Added
+ similar helper in class Polyhedron and got rid of no longer needed
+ method throw_space_dimension_overflow(). Exploit the new helper to
+ simplify space dim checking in constructors.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc: Avoid implicit conversion changing signedness.
+ Detected by ECLAIR service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/compiler.hh: Macro PPL_ASSERT is not available in compiler.hh.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Let `indent' have
+ type signed int, matching signature of std::setw(). Detected by
+ ECLAIR service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BHRZ03_Certificate.defs.hh: Fixed inclusion directive.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.cc, src/Constraint.cc, src/NNC_Polyhedron.cc,
+ src/Polyhedron_public.cc: Avoid implicit conversions changing
+ signedness. Detected by ECLAIR service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc, src/conversion.cc: Prefer using
+ C_Integer traits rather than <climits> macros, thereby avoiding
+ implicit conversions changing signedness. Detected by ECLAIR
+ service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Let `indent_level' have
+ type signed int, matching signature of std::setw(). Detected by
+ ECLAIR service utypflag.
+
+2012-02-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/checked_int.inlines.hh: Avoid using functional casts.
+ Detected by ECLAIR service castexpr.
+
+2012-02-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Bit_Row.cc, src/CO_Tree.cc, src/CO_Tree.templates.hh,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Interval.defs.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/intervals.defs.hh: Replaced all c-style casts. Detected by
+ ECLAIR service castexpr.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/PIP_Tree.cc,
+ src/termination.cc: Added helper function
+ Implementation::num_constraints(). When implementing it, avoid
+ implicit conversion changing signedness. Detected by ECLAIR service
+ utypflag.
+
+2012-02-22 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.inlines.hh, src/Float.inlines.hh, src/assert.hh,
+ src/compiler.hh, src/globals.inlines.hh: Uniformed, improved and
+ moved to a better place implementation of clz/ctz.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Bit_Row.cc, src/checked.cc: Prefer using
+ C_Integer traits rather than macros in <climits>, thereby avoiding a
+ few implicit conversions changing signedness. Detected by ECLAIR
+ service utypflag.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Declare pure virtual
+ methods in abstract base classes. Override them only once in
+ derived classes. Detected by ECLAIR service ovrdonce.
+
+2012-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Handler.defs.hh, src/c_streambuf.defs.hh: Specify the
+ `virtual' keyword when declaring overriding methods. Detected by
+ ECLAIR service ovrdexpl.
+
+2012-02-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/ppl-config.cc.in: Moved another declaration into a smaller
+ scope. Detected by ECLAIR service minscope.
+
+2012-02-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/ppl-config.cc.in: Move declarations to nsure variables are
+ declared at smallest possible scope. Detected by ECLAIR service
+ minscope.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Multiple-inclusion guards added. Detected by
+ ECLAIR service inclgard.
+
+2012-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh, src/ppl-config.cc.in: Avoided
+ functional cast. Detected by ECLAIR service castexpr.
+
+2012-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Handler.defs.hh: Avoid not needed virtual inheritance.
+
+2012-02-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in: Updated Doxygen configuration files to
+ release 1.7.4.
+
+2012-02-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, src/Init.cc, src/Watchdog.cc: Added
+ '&' prefix to function identifiers that are not used to call the
+ function. Detected by Eclair service funcalls.
+
+2012-02-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/PIP_Tree.cc: When object is not used for control, declaration
+ moved outside for statement.
+
+2012-02-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/PIP_Tree.cc, src/Partially_Reduced_Product.templates.hh:
+ Declarations that can be moved into a smaller scope have been moved.
+ Detected by ECLAIR service minscope.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray.in: Simplified.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray.in: Simplified.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am, src/ppl-config.cc.in: New automatically generated
+ files BUGS.hh, COPYING.hh and CREDITS.hh.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray.in: Explicitly state the array size. New
+ option --decl-only.
+
+2012-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc: Unwanted inclusion removed.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithconstraints2.cc: Unwanted inclusion removed.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ tests/Box/refinewithconstraints2.cc,
+ tests/MIP_Problem/mipproblem2.cc: The Parma Watchdog Library has
+ been merged into the Parma Polyhedra Library.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh: Missing default added.
+
+2012-02-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Boundary.defs.hh, src/Grid.templates.hh, src/PIP_Problem.cc,
+ src/checked_float.inlines.hh: Renamed some variables so that
+ declarations in an outer scope are not hidden. Detected by ECLAIR
+ service declhidn.
+
+2012-02-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.templates.hh, src/PIP_Problem.cc,
+ src/checked_float.inlines.hh: Revert "Renamed some variables so that
+ declarations in an outer scope are not hidden." This reverts commit 97cc40667310524111a674be5ad3e8e9e4ec8c90.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Watchdog/watchdog1.cc: Global-replace mistake fixed.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, Watchdog/.gitignore, Watchdog/BUGS,
+ Watchdog/COPYING, Watchdog/CREDITS, Watchdog/ChangeLog,
+ Watchdog/ChangeLog_2001-2008, Watchdog/INSTALL,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/compile, Watchdog/config.guess, Watchdog/config.rpath,
+ Watchdog/config.sub, Watchdog/configure.ac, Watchdog/depcomp,
+ Watchdog/doc/.gitignore, Watchdog/doc/Makefile.am,
+ Watchdog/doc/README.doc, Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+ Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+ Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+ Watchdog/install-sh, Watchdog/ltmain.sh, Watchdog/m4/.gitignore,
+ Watchdog/m4/Makefile.am, Watchdog/m4/lib-ld.m4,
+ Watchdog/m4/lib-link.m4, Watchdog/m4/libtool.m4,
+ Watchdog/m4/ltoptions.m4, Watchdog/m4/ltsugar.m4,
+ Watchdog/m4/ltversion.m4, Watchdog/m4/lt~obsolete.m4,
+ Watchdog/missing, Watchdog/mkinstalldirs, Watchdog/pwl-config.sed,
+ Watchdog/src/.gitignore, Watchdog/src/Makefile.am,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/.gitignore, Watchdog/tests/pwl_test.cc,
+ Watchdog/tests/pwl_test.hh, Watchdog/tests/valgrind_suppressions,
+ Watchdog/utils/.gitignore, Watchdog/utils/Makefile.am,
+ Watchdog/utils/build_header.in, configure.ac,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ interfaces/C/Makefile.am, interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/watchdog1.c, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am, ppl-config.sed, {Watchdog/src =>
+ src}/Doubly_Linked_Object.defs.hh, {Watchdog/src =>
+ src}/Doubly_Linked_Object.inlines.hh,
+ src/Doubly_Linked_Object.types.hh, {Watchdog/src =>
+ src}/EList.defs.hh, {Watchdog/src => src}/EList.inlines.hh,
+ {Watchdog/src => src}/EList.types.hh, {Watchdog/src =>
+ src}/EList_Iterator.defs.hh, {Watchdog/src =>
+ src}/EList_Iterator.inlines.hh, {Watchdog/src =>
+ src}/EList_Iterator.types.hh, {Watchdog/src =>
+ src}/Handler.defs.hh, {Watchdog/src => src}/Handler.inlines.hh,
+ {Watchdog/src => src}/Handler.types.hh, src/Init.cc,
+ src/Makefile.am, {Watchdog/src => src}/Pending_Element.defs.hh,
+ {Watchdog/src => src}/Pending_Element.inlines.hh, {Watchdog/src =>
+ src}/Pending_Element.types.hh, {Watchdog/src =>
+ src}/Pending_List.defs.hh, {Watchdog/src =>
+ src}/Pending_List.inlines.hh, {Watchdog/src =>
+ src}/Pending_List.templates.hh, {Watchdog/src =>
+ src}/Pending_List.types.hh, {Watchdog/src =>
+ src}/Threshold_Watcher.cc, {Watchdog/src =>
+ src}/Threshold_Watcher.defs.hh, {Watchdog/src =>
+ src}/Threshold_Watcher.inlines.hh, {Watchdog/src =>
+ src}/Threshold_Watcher.templates.hh, {Watchdog/src =>
+ src}/Threshold_Watcher.types.hh, {Watchdog/src => src}/Time.cc,
+ {Watchdog/src => src}/Time.defs.hh, {Watchdog/src =>
+ src}/Time.inlines.hh, Watchdog/src/Doubly_Linked_Object.types.hh =>
+ src/Time.types.hh, {Watchdog/src => src}/Watchdog.cc, {Watchdog/src
+ => src}/Watchdog.defs.hh, {Watchdog/src =>
+ src}/Watchdog.inlines.hh, Watchdog/src/Time.types.hh =>
+ src/Watchdog.types.hh, src/ppl_header.hh,
+ tests/Ask_Tell/Makefile.am, tests/Box/Makefile.am,
+ tests/CO_Tree/Makefile.am, tests/Concrete_Expression/Makefile.am,
+ tests/MIP_Problem/Makefile.am, tests/PIP_Problem/Makefile.am,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/weightwatch1.cc, tests/Sparse_Matrix/Makefile.am,
+ {Watchdog/tests => tests/Watchdog}/Makefile.am, {Watchdog/tests =>
+ tests/Watchdog}/watchdog1.cc: The Parma Watchdog Library has been
+ merged into the Parma Polyhedra Library.
+
+2012-02-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.templates.hh, src/PIP_Problem.cc,
+ src/checked_float.inlines.hh: Renamed some variables so that
+ declarations in an outer scope are not hidden.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_ids: Spurious line removed.
+
+2012-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.alpha, README.arm, README.solaris,
+ devtools/update_ChangeLog, interfaces/Java/README.java,
+ interfaces/OCaml/README.ocaml, interfaces/Prolog/Ciao/README.ciao,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/YAP/README.yap, tests/MIP_Problem/mipproblem4.cc:
+ Added/fixed some copyright notices.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Float.inlines.hh: Let bitwise operators be applied to unsigned
+ integer types. Detected by ECLAIR service utypflag.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh: Let bitwise operators be applied to
+ unsigned integer types. Detected by ECLAIR service utypflag.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Boundary.defs.hh: Exploit operator| overloading for
+ Rounding_Dir.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.cc, src/Float.defs.hh, src/Interval.defs.hh,
+ src/intervals.defs.hh: Let bitwise operators be applied to unsigned
+ integer types. Detected by ECLAIR service utypflag.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Result.defs.hh, src/Result.inlines.hh, src/globals.types.hh:
+ Let bitwise operators be applied to unsigned integer types.
+ Detected by ECLAIR service utypflag.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh: Let bitwise
+ operators be applied to unsigned integer types. Detected by ECLAIR
+ service utypflag.
+
+2012-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Add the release date for PPL 0.11.2. Mention a couple of
+ bugs that have been corrected.
+
+2012-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc, src/Box.templates.hh, src/Linear_Form.inlines.hh:
+ Reduced the scope of some variables. Detected by ECLAIR service
+ minscope.
+
+2012-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Powerset.templates.hh, src/ppl-config.cc.in: Prefer explicit
+ tests againts zero. Detected by ECLAIR service utypflag.
+
+2012-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.templates.hh: Avoid abusing
+ sort-circuited logical operators.
+
+2012-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_chdims.cc: Avoid abusing short-circuited logical
+ operators (prefer explicit control flow). Detected by ECLAIR
+ service utypflag.
+
+2012-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Prefer explicit tests against
+ zero. Detected by ECLAIR service utypflag.
+
+2012-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.templates.hh, src/checked.cc, src/globals.defs.hh,
+ src/globals.inlines.hh, src/wrap_string.cc: Added helper is_space(),
+ to be used instead of directly calling isspace().
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Boundary.defs.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh: Renamed is_infinity() as infinity_sign(),
+ returning an `int' in {-1, 0, 1}. Prefer explicit tests against
+ zero. Detected by ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.inlines.hh, src/wrap_assign.hh, src/wrap_string.cc:
+ Prefer explicit tests against zero. Detected by ECLAIR service
+ utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/assert.hh, src/globals.defs.hh: Prefer `while
+ (true)' and `while (false)' wrt `while (1)' and `while(0)'.
+ Detected by ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.cc: Prefer explicit tests against zero. Detected by
+ ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.cc, src/OR_Matrix.inlines.hh,
+ src/Polyhedron_public.cc: Prefer explicit tests against zero.
+ Detected by ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_chdims.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+ src/Grid_widenings.cc: Prefer explicit tests against zero. Do not
+ abusing short-circuit operators (prefer explicit control flow).
+ Detected by ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.cc: Prefer explicit test against zero. Detected by
+ ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.cc: Prefer explicit usage of the istream::fail()
+ method. Detected by ECLAIR service utypflag.
+
+2012-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Integer.hh, src/meta_programming.hh: Rename as
+ `const_bool_value' the "anonymous" enums encoding a bool value.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc: Prefer using vector::resize wrt insert.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_Status.inlines.hh, src/Result.inlines.hh: Prefer explicit
+ tests against zero. Detected by ECLAIR service utypflag.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.cc: Make comparison against zero explicit.
+ Detected by ECLAIR service utypflag. While at it, simplified
+ control flow by removing a use of `continue'.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box_Status.inlines.hh: Make comparison against zero explicit.
+ Detected by ECLAIR service utypflag.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.cc: Make comparison against zero explicit. Detected
+ by ECLAIR service utypflag.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, src/BD_Shape.inlines.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Grid.inlines.hh, src/Octagonal_Shape.inlines.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Pointset_Ask_Tell.inlines.hh, src/Pointset_Powerset.inlines.hh,
+ src/Polyhedron.inlines.hh, src/globals.defs.hh,
+ src/globals.inlines.hh: Added helper function to compute the hash
+ code from a space dimension. Added missing has_code() method to
+ class Box<ITV> and generate corresponding method in Java interface
+ for boxes.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Float.inlines.hh, src/Rounding_Dir.inlines.hh: Make comparison
+ against zero explicit. Detected by ECLAIR service utypflag.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Prefer testing against zero.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Float.defs.hh, src/Float.inlines.hh,
+ src/checked_float.inlines.hh: For clarity, renamed three-state Float
+ method is_inf() as inf_sign(). Similarly, renamed is_zero() as
+ zero_sign().
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh, src/Box.templates.hh, src/Interval.defs.hh,
+ src/intervals.defs.hh: Avoid long lines and try to improve
+ readability. In particular, when using helper function i_constraint(), prefer
+ passing in an already built Relation_Symbol object if its
+ computation is nontrivial.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Completed previous commit, fixing
+ is_{m,p}inf_float.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Let is_inf_float() return a Boolean
+ value, rather than an integer. Detected by ECLAIR service utypflag.
+
+2012-02-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Pointset_Powerset.templates.hh: Prefer
+ using logical (wrt bitwise) operators on Boolean values. Detected
+ by ECLAIR service utypflag.
+
+2012-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Fixed a bug in
+ Box<ITV>::upper_bound_assign(_if_exact). Calling the method with an
+ empty argument that, due to computational laziness, is not yet
+ flagged as being empty was producing wrong results. (Note: here
+ `wrong' means unnecessarily imprecise; from the point of view of
+ approximation, the results were still correct). See test08 in
+ tests/Box/upperbound1.cc.
+
+2012-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/upperbound1.cc: Restored a few tests commented out long
+ time ago. Added a new test (synthesized from a Java test provided
+ by Gianluca Amato) showing a problem in the implementation of
+ Box<ITV>::upper_bound_assign().
+
+2012-02-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2012-02-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.defs.hh: Indentation fixed.
+
+2012-02-13 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Enabled CC76_narrowing_assign for Boxes.
+
+2012-02-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am, tests/Ask_Tell/Makefile.am,
+ tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/CO_Tree/Makefile.am, tests/Concrete_Expression/Makefile.am,
+ tests/Grid/Makefile.am, tests/MIP_Problem/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am, tests/PIP_Problem/Makefile.am,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am,
+ tests/Sparse_Matrix/Makefile.am: Invoke libtool when checking with
+ Valgrind enabled.
+
+2012-02-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Concrete_Expression/Makefile.am: Fixed value for Valgrind
+ --num-callers option. According to man pages, maximum value is 50.
+
+2012-02-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh:
+ Avoid pointer casts when allocating coefficients in Dense_Row::Impl.
+ Detected by ECLAIR service M++.5-2-8. We now use a std::allocator object (similar to what done in
+ CO_Tree).
+
+2012-02-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: For
+ naming consistency, `coefficient_allocator' renamed as
+ `data_allocator'. Explicitly include <memory> for std::allocator.
+ Fixed deallocation bugs in CO_Tree::rebuild_bigger_tree(): - use delete[] for `indexes'; - use data_allocator.deallocayte for `data'. On copy
+ construction, assignment and swap, do also copy/assign/swap the
+ allocator.
+
+2012-02-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Reduce scope of loop index variable.
+ Detected by ECLAIR service minscope.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Grid_conversion.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Octagonal_Shape.templates.hh: Make sure each case within a
+ switch statement is properly terminated. Detected by ECLAIR service
+ swchbrek.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh:
+ Spurious spaces removed.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc: Type fixed. Detected by ECLAIR service
+ utypflag.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh: Added missing parentheses around a macro
+ argument. Detected by ECLAIR service macrbody.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/MIP_Problem.cc, src/globals.defs.hh: Avoid
+ null statements that, apart from a comment, are not on a line by
+ themselves. Detected by ECLAIR service nullstmt.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/depcomp, Watchdog/install-sh, Watchdog/ltmain.sh,
+ Watchdog/m4/libtool.m4, Watchdog/m4/ltoptions.m4,
+ Watchdog/m4/ltversion.m4, Watchdog/missing, compile, config.guess,
+ config.sub, depcomp, install-sh, ltmain.sh, m4/libtool.m4,
+ m4/ltoptions.m4, m4/ltversion.m4, missing: Updated.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Prolog sources must go under
+ .../share/ppl as these files are architecture independent.
+ Moreover, new versions of Automake no longer accept pkglib_DATA.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Added missing template parameter.
+
+2012-02-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh: INT_MIN % -1 is undefined behavior in
+ C++11. The PPL has been proven to be immune to this potential
+ problem by ECLAIR. (Thanks to Rene Sugar.) Long lines avoided on
+ passing.
+
+2012-02-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/Makefile.am: Reflected file removal.
+
+2012-02-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, configure.ac, m4/ac_cxx_remainder_bug.m4, src/checked.cc:
+ INT_MIN % -1 is undefined behavior in C++11. The PPL has been
+ proven to be immune to this potential problem by ECLAIR. (Thanks to
+ Rene Sugar.)
+
+2012-02-03 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid_Generator.inlines.hh: Added a default label to switch.
+
+2012-02-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.hh: Be consistent with the use of attribute weak.
+
+2012-02-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in: The functions fatal() and internal_error()
+ are now attributed with noreturn.
+
+2012-01-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/bump_copyright_years: Improved.
+
+2012-01-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh, src/Grid_Generator_System.cc,
+ src/Grid_public.cc: Reduced the scope of some variables. Detected
+ by ECLAIR service minscope.
+
+2012-01-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, README, README.configure, STANDARDS,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+ Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+ Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+ Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Pending_List.types.hh,
+ Watchdog/src/Threshold_Watcher.cc,
+ Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.inlines.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh,
+ Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+ Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ configure.ac, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+ demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+ demos/ppl_pips/ppl_pips_extra_man_text,
+ devtools/bump_copyright_years, devtools/generate_dox_biblio,
+ devtools/generate_dox_ci_prolog_manual,
+ devtools/generate_man_pages, devtools/print_nonascii_lines,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+ doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+ fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+ a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+ java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ , interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+ va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+ d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_configured_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox,
+ interfaces/Prolog/Prolog_interface_sysdep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep.dox,
+ interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+ test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+ m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+ m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+ m4/ac_cxx_remainder_bug.m4, m4/ac_cxx_zero_length_arrays.m4,
+ m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+ m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+ src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+ src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+ src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+ src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+ src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh,
+ src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Cast_Floating_Point_Expression.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Concrete_Expression.cc,
+ src/Concrete_Expression.defs.hh,
+ src/Concrete_Expression.inlines.hh,
+ src/Concrete_Expression.types.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence.types.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Congruence_System.types.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constant_Floating_Point_Expression.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+ src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+ src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+ src/Dense_Row.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Difference_Floating_Point_Expression.types.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.types.hh, src/Float.cc,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.types.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator.types.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+ src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.inlines.hh, src/Init.types.hh, src/Integer_Interval.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval.types.hh,
+ src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+ src/Interval_Info.types.hh, src/Interval_Restriction.defs.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+ src/Linear_Form.cc, src/Linear_Form.defs.hh,
+ src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Form.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.types.hh,
+ src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+ src/Partial_Function.cc, src/Partial_Function.defs.hh,
+ src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+ src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Powerset.types.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+ src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+ src/Row_Flags.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+ src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+ src/Sparse_Row.types.hh, src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.types.hh, src/Temp.defs.hh,
+ src/Temp.inlines.hh, src/Temp.templates.hh, src/Topology.types.hh,
+ src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.types.hh,
+ src/Variables_Set.cc, src/Variables_Set.defs.hh,
+ src/Variables_Set.inlines.hh, src/Variables_Set.types.hh,
+ src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/assert.cc, src/assert.hh,
+ src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+ src/distances.defs.hh, src/distances.inlines.hh,
+ src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+ src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/linearize.hh,
+ src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+ src/max_space_dimension.hh, src/meta_programming.hh,
+ src/minimize.cc, src/mp_std_bits.cc, src/mp_std_bits.defs.hh,
+ src/mp_std_bits.inlines.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/simplify.cc,
+ src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+ src/stdiobuf.types.hh, src/swapping_sort.templates.hh,
+ src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/version.cc, src/version.hh.in,
+ src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+ tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/empty1.cc, tests/Box/equality1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+ tests/Box/intersection1.cc, tests/Box/interval1.cc,
+ tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruence1.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/relations3.cc,
+ tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+ tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+ tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+ tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+ tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+ tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+ tests/Concrete_Expression/C_Expr.cc,
+ tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/C_Expr.types.hh,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/bdshape1.cc,
+ tests/Concrete_Expression/bdshape2.cc,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc,
+ tests/Concrete_Expression/octagonalshape1.cc,
+ tests/Concrete_Expression/octagonalshape2.cc,
+ tests/Concrete_Expression/polyhedron1.cc,
+ tests/Concrete_Expression/polyhedron2.cc,
+ tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+ tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+ tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+ tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frequency1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc,
+ tests/Octagonal_Shape/wrap1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+ tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearexpression1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+ tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+ tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+ tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+ tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+ tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc, tests/README,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh,
+ tests/Sparse_Matrix/Makefile.am,
+ tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Bumped
+ copyright years.
+
+2012-01-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc, src/BD_Shape.templates.hh,
+ src/Boundary.defs.hh, src/MIP_Problem.cc, src/PIP_Tree.cc,
+ src/Sparse_Row.cc, src/Variables_Set.cc, src/termination.cc,
+ src/wrap_assign.hh: Reduced the scope of several variables.
+ Detected by ECLAIR service minscope.
+
+2012-01-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am: Also add bugseng_logo.pdf to EXTRA_DIST.
+
+2012-01-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am: Added ppl_logo* to EXTRA_DIST.
+
+2011-12-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Any_Pointset.defs.hh, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+ src/Bit_Row.defs.hh, src/Boundary.defs.hh, src/Box.cc,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh,
+ src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+ src/Determinate.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Float.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval_Info.defs.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/Partial_Function.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.templates.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+ src/Scalar_Products.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variables_Set.cc, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/assert.hh,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/conversion.cc,
+ src/distances.inlines.hh, src/fpu-c99.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+ src/globals.inlines.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/linearize.hh, src/math_utilities.defs.hh,
+ src/math_utilities.inlines.hh, src/meta_programming.hh,
+ src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+ src/simplify.cc, src/swapping_sort.templates.hh,
+ src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/wrap_string.cc,
+ src/wrap_string.hh, utils/timings.cc: Revert "Do not use the <TAB>
+ character for code layout." This reverts commit f6060073e3b31277cf475ba90c0eb751663a81e8.
+
+2011-12-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Any_Pointset.defs.hh, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+ src/Bit_Row.defs.hh, src/Boundary.defs.hh, src/Box.cc,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh,
+ src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+ src/Determinate.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Float.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval_Info.defs.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/Partial_Function.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.templates.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+ src/Scalar_Products.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variables_Set.cc, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/assert.hh,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/conversion.cc,
+ src/distances.inlines.hh, src/fpu-c99.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+ src/globals.inlines.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/linearize.hh, src/math_utilities.defs.hh,
+ src/math_utilities.inlines.hh, src/meta_programming.hh,
+ src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+ src/simplify.cc, src/swapping_sort.templates.hh,
+ src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/wrap_string.cc,
+ src/wrap_string.hh, utils/timings.cc: Do not use the <TAB> character
+ for code layout. Detected by ECLAIR service tabindnt.
+
+2011-12-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: The automake option `dist-lzma' is obsoleted by
+ `dist-xz'.
+
+2011-12-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ src/Makefile.am, src/Partial_Function.inlines.hh, src/assert.cc,
+ src/assert.hh, src/checked.defs.hh, src/globals.inlines.hh: Added
+ functions ppl_unreachable() and ppl_unreachable_msg(), causing
+ program termination using abort(). Let PPL_UNREACHABLE and
+ PPL_ASSERT be based on these functions. Avoid a cycle in header
+ inclusion dependencies.
+
+2011-12-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc: Corrected typo causing test failures.
+
+2011-12-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Prefer early return to dummy assignment
+ in unreachable code path.
+
+2011-12-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Add assignment to silence compiler
+ warning.
+
+2011-12-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Fixed
+ typo.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc: Improved name of helper
+ function in OCaml interface. Add default label to switch to avoid
+ warning.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/BD_Shape.templates.hh,
+ src/Box.templates.hh, src/Grid_widenings.cc, src/MIP_Problem.cc,
+ src/Octagonal_Shape.templates.hh, src/Polyhedron_widenings.cc,
+ src/assert.hh: Added debugging macro PPL_EXPECT_HEAVY. Added
+ debugging helper function template copy_contains(). Systematically
+ use PPL_EXPECT_HEAVY(copy_contains(...)) when checking containment
+ assumptions in widening/narrowing methods.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh: Better differentiate
+ between unreachable code and unexpected values. We call, e.g.,
+ PPL_JAVA_UNEXPECTED when we are converting an illegal Java value to
+ a C++ value; we call PPL_UNREACHABLE when such a mismatch occurs the
+ other way round (an illegal C++ value produced by the core library).
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.cc: Prefer if statement to switch
+ having a single case. Detected by ECLAIR service swchlabs.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ppl-config.cc.in: Prefer if-then-else to switch having a
+ single case label. Detected by ECLAIR service swchlabs.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh: Added macro
+ PPL_C_UNREACHABLE_MSG. Use the new macro in a few places in the C
+ interface code. Standardized messages for errors due to Watchdog
+ library not enabled.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh: Added macros
+ PPL_OCAML_UNREACHABLE and PPL_OCAML_UNREACHABLE_MSG. Try and use
+ them systematically in the OCaml interface.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh: Added new macro
+ PPL_JAVA_UNREACHABLE. Use the new macro to mark unreachable code in
+ the Java interface files.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Float.templates.hh, src/Grid.defs.hh, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Linear_Form.templates.hh,
+ src/MIP_Problem.cc, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/PIP_Problem.cc,
+ src/PIP_Tree.cc, src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/linearize.hh, src/minimize.cc: Replaced throws of runtime_error
+ exceptions by calls to PPL_UNREACHABLE. Got rid of a few (now
+ unused) exception throwers.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.templates.hh: Avoid (unreachable) default label when all
+ cases have been listed.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh: Prefer PPL_UNREACHABLE to PPL_ASSERT(0).
+ Avoid mixing reachable and unreachable code paths.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.inlines.hh: Replaced an occurrence of PPL_ASSERT(0) by
+ PPL_UNREACHABLE. Added an assertion and comment explaining why
+ cases are unreachable.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_int.inlines.hh: Replaced an occurrence of
+ PPL_ASSERT(0) by PPL_UNREACHABLE. Added proper assertion for
+ preconditions.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Prefer if-then-else construct to binary
+ switch. Detected by ECLAIR service swchlabs. Prefer listing a couple of residual switch cases to default label.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Rounding_Dir.inlines.hh: Replaced PPL_ASSERT(false) with
+ PPL_UNREACHABLE. For readability, avoid mixing reachable and
+ unreachable paths.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh: Prefer if-then-else construct to binary
+ switch. Detected by ECLAIR service swchlabs.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Fixed a couple of switch statements
+ where we were mixing reachable and unreachable code paths, reducing
+ readability. Added precondition assertions at the start of
+ assign_special_float() so as to make clearer why the default switch
+ case is unreachable.
+
+2011-12-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Boundary.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/CO_Tree.cc, src/CO_Tree.templates.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_public.cc,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval_Restriction.defs.hh,
+ src/Polyhedron_public.cc, src/assert.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/intervals.defs.hh, src/linearize.hh:
+ Added new macro PPL_UNREACHABLE, to be used instead of
+ PPL_ASSERT(false). Started replacing calls to PPL_ASSERT(false) in
+ the core library code.
+
+2011-12-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * demos/ppl_pips/ppl_pips.cc: demos/ppl_pips: remove two unused
+ functions.
+
+2011-12-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh: Indentation fixed. Detected
+ by ECLAIR service indntion.
+
+2011-12-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/BD_Shape/cc76extrapolation1.cc:
+ tests/BD_Shape/cc76extrapolation1: avoid unused expression warnings
+ by casting to void.
+
+2011-12-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Disable all abstractions based on machine
+ floating-point numbers when clang++ is detected.
+
+2011-12-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * configure.ac: Detect when clang++ is used, and disable
+ -frounding-math in that case.
+
+2011-12-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/Concrete_Expression/C_Expr.defs.hh:
+ tests/Concrete_Expression: avoid using unnamed types as template
+ arguments.
+
+2011-12-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: avoid static_casts
+ between Coefficient* and void*. Use an allocator instead.
+
+2011-12-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Enforce generator normalization in
+ private method Polyhedron::BFT00_poly_hull_assign_if_exact() and add
+ corresponding assertion.
+
+2011-12-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_public.cc: Style improvements for
+ Grid::relation_with(const Congruence& cg) const. No functionality
+ change.
+
+2011-12-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_public.cc: Corrected errors in method
+ Grid::relation_with(const Constraint&) const. The method was affected by two problems: 1) when working on a non-minimized grid generator system, the points after the first one were transformed into parameters that were
+ not satisfying the Grid_Generator invariant (reported by Marco
+ Poletti); 2) the method was providing an incorrect result when comparing a
+ grid generator line/parameter with a (strict) inequality constraint, as happens for test20() in tests/Grid/relations3.cc.
+
+2011-12-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/relations3.cc: Added new test showing an error in
+ Grid::relation_with(const Constraint&).
+
+2011-11-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words, src/Pointset_Powerset.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh: Project vocabulary fixes. Detected by
+ ECLAIR service progvcbl.
+
+2011-11-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/vocabulary: Updated.
+
+2011-11-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_ids: Sorted list of good identifiers.
+
+2011-11-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words, devtools/vocabulary: Vocabulary updated.
+
+2011-11-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words, devtools/vocabulary,
+ src/Pointset_Powerset.templates.hh, src/Powerset.templates.hh,
+ src/algorithms.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/checked.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/globals.defs.hh,
+ src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+ src/meta_programming.hh, src/simplify.cc, src/stdiobuf.cc,
+ src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh, src/termination.cc,
+ src/termination.templates.hh, src/wrap_assign.hh,
+ src/wrap_string.cc, utils/timings.cc: Project vocabulary fixes.
+ Detected by ECLAIR service progvcbl.
+
+2011-11-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words, devtools/vocabulary,
+ src/PIP_Problem.defs.hh, src/Polyhedron_public.cc,
+ src/Sparse_Row.cc, src/Temp.defs.hh: Project vocabulary fixes.
+ Detected by ECLAIR service progvcbl.
+
+2011-11-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/vocabulary, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/Box.defs.hh, src/Box.templates.hh,
+ src/Grid.defs.hh, src/Grid_public.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/PIP_Problem.defs.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/wrap_assign.hh: Project vocabulary fixes. Detected by ECLAIR
+ service progvcbl.
+
+2011-11-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh: Project vocabulary fixes.
+ Detected by ECLAIR service progvcbl.
+
+2011-11-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words,
+ src/Octagonal_Shape.templates.hh, src/PIP_Problem.defs.hh,
+ src/PIP_Tree.defs.hh, src/Partially_Reduced_Product.defs.hh,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/checked.cc: Project vocabulary fixes. Detected by ECLAIR
+ service progvcbl.
+
+2011-11-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words, src/CO_Tree.defs.hh,
+ src/Checked_Number.defs.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Float.templates.hh, src/Init.defs.hh,
+ src/Interval.templates.hh, src/Linear_Form.defs.hh,
+ src/Linear_Form.templates.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.inlines.hh, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/checked.inlines.hh: Project vocabulary fixes. Detected by
+ ECLAIR service progvcbl.
+
+2011-11-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc, devtools/good_items,
+ devtools/good_words, src/Bit_Matrix.cc, src/Box.defs.hh,
+ src/Box.templates.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/CO_Tree.inlines.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.templates.hh, src/Congruence.defs.hh,
+ src/Congruence_System.inlines.hh, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/Float.defs.hh,
+ src/Float.templates.hh, src/Floating_Point_Expression.defs.hh,
+ src/GMP_Integer.types.hh, src/Generator.cc,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid_Generator.cc, src/Grid_public.cc, src/Init.cc,
+ src/Init.defs.hh, src/Interval.inlines.hh, src/Linear_Form.defs.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh:
+ Project vocabulary fixes. Detected by ECLAIR service progvcbl.
+
+2011-11-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items: Added a few more lexical items.
+
+2011-11-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.templates.hh,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.inlines.hh, src/Box.defs.hh,
+ src/Box.inlines.hh, src/Box.templates.hh,
+ src/Box_Status.inlines.hh, src/Checked_Number.defs.hh,
+ src/Float.defs.hh, src/Grid_Certificate.inlines.hh,
+ src/H79_Certificate.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Sparse_Matrix.defs.hh, src/Sparse_Row.cc,
+ src/Sparse_Row.defs.hh: Project vocabulary fixes. Detected by
+ ECLAIR service progvcbl.
+
+2011-11-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words, devtools/vocabulary:
+ Updated.
+
+2011-11-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Do not rely on libtool guessing the language.
+ (Thanks to Serge Belyshev.)
+
+2011-11-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words: Put items on the right
+ list.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_items, devtools/good_words: Separate words from
+ lexical items.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh: Fixed FSF address. Detected by ECLAIR
+ service cmntfile.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/Checked_Number.cc,
+ src/Coefficient_traits_template.hh, src/DB_Matrix.defs.hh,
+ src/DB_Row.defs.hh, src/Grid_public.cc, src/Linear_Row.defs.hh,
+ src/Linear_System.defs.hh, src/Makefile.am, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.inlines.hh, src/Og_Status.idefs.hh,
+ src/Og_Status.inlines.hh, src/{Topology.hh => Topology.types.hh},
+ src/checked.cc, src/checked.defs.hh, src/mp_std_bits.cc,
+ src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+ src/swapping_sort.templates.hh: Fixed file comment blocks and
+ related mistakes. Detected by ECLAIR service cmntfile.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh: Conflicts resolved.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Matrix.defs.hh, src/Box.defs.hh,
+ src/Box.templates.hh: Project vocabulary fixes. Detected by ECLAIR
+ service idntvcbl.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Let
+ Doxygen expand macro PPL_USE_SPARSE_MATRIX as defined.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+ src/Matrix.types.hh, src/PIP_Tree.cc, src/Row.defs.hh,
+ src/Row.types.hh, src/globals.defs.hh, tests/CO_Tree/cotree1.cc,
+ tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc: Renamed macros
+ USE_PPL_SPARSE_MATRIX to use PPL_ prefix.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Row.cc: Added a few missing
+ \relates Doxygen commands.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox: The swapping methods of PPL types are now
+ named m_swap.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/namespaces.hh: swap functions for PPL types are now defined in
+ the PPL namespace.
+
+2011-11-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_prolog_common.cc, src/Affine_Space.cc,
+ src/Affine_Space.defs.hh, src/Affine_Space.inlines.hh,
+ src/Any_Pointset.defs.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+ src/Bit_Matrix.inlines.hh, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/CO_Tree.inlines.hh, src/C_Polyhedron.inlines.hh,
+ src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Congruence_System.inlines.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/Dense_Matrix.cc,
+ src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+ src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_chdims.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval_Info.defs.hh,
+ src/Interval_Info.inlines.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Sparse_Matrix.cc,
+ src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh,
+ src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/assign_or_swap.hh, src/conversion.cc, src/simplify.cc,
+ src/swapping_sort.templates.hh, src/termination.cc,
+ src/wrap_assign.hh, tests/Ask_Tell/append1.cc,
+ tests/CO_Tree/cotree1.cc, tests/PIP_Problem/pipproblem2.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Powerset/empty1.cc,
+ tests/Powerset/powerset1.cc, tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc, tests/ppl_test.hh: Avoid
+ overloading std::swap for PPL types. Define functions
+ Parma_Polyhedra_Library::swap and exploit ADL. The swap _methods_
+ T::swap(T&) renamed as T::m_swap(T&).
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/vocabulary: More words added.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words: Added a word legitimately occurring in a
+ comment.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words: Added more Doxygen and LaTeX keywords.
+
+2011-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.templates.hh, Watchdog/src/Watchdog.cc,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh: Started fixing the vocabulary used
+ throughout the library. Detected by ECLAIR service idntvcbl.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words, devtools/vocabulary: Updated.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/vocabulary: Updated.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc: Updated.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4, src/Makefile.am: Allow `--with-gmp-build' to
+ be used with `--enable-shared'. (Thanks to Serge Belyshev.)
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-language-interface.tex, doc/devref.tex,
+ doc/user-language-interface.tex, doc/user.tex: Front matter updated
+ for all manuals.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-language-interface.tex: Front matter updated.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user.tex: No longer pass the `draft' option to package
+ `hyperref'.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/bugseng_logo.eps, doc/bugseng_logo.svg, doc/ppl_logo.eps,
+ doc/ppl_logo.svg, doc/ppl_logo_no_ppl.eps, doc/ppl_logo_no_ppl.svg,
+ doc/user.tex: Front matter improved.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.inlines.hh: Fixed Doxygen \relates command.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user.tex, m4/ac_check_gmp.m4: Typo fixed.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/.gitignore, doc/bugseng_logo.eps, doc/bugseng_logo.svg,
+ doc/ppl_logo.eps, doc/ppl_logo.svg, doc/ppl_logo_no_ppl.eps,
+ doc/ppl_logo_no_ppl.svg: New logos.
+
+2011-11-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Fixed the handling of the `--with-gmp-build'
+ configure option. (Thanks to Serge Belyshev.)
+
+2011-11-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh: Missing comment added.
+
+2011-11-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Added missing guard against multiple inclusions.
+ Detected by ECLAIR service inclgard.
+
+2011-11-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user.tex: Revised.
+
+2011-11-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/.gitignore, doc/ppl_logo.eps, doc/ppl_logo.svg,
+ doc/ppl_logo_no_ppl.eps, doc/ppl_logo_no_ppl.svg: The PPL logo in
+ various formats.
+
+2011-11-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Box.defs.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh, src/Grid.defs.hh,
+ src/Grid_public.cc, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Powerset.defs.hh, src/Polyhedron_public.cc,
+ src/Variables_Set.cc, src/minimize.cc: Indentation fixes. Detected
+ by ECLAIR service indntion.
+
+2011-11-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/PIP_Tree.cc,
+ src/checked_int.inlines.hh: Code layout corrections.
+
+2011-11-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Avoid reusing names reserved by the
+ C++ standard. Detected by ECLAIR service resvidnt.
+
+2011-11-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Avoid reusing names reserved by the
+ C++ standard. Detected by ECLAIR service resvidnt.
+
+2011-11-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: FIXME resolved.
+
+2011-11-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+ src/Polyhedron_nonpublic.cc: Avoid reusing names reserved by the C++
+ standard. In the process, consistency improved with respect to
+ conventions used throughout the library. Detected by ECLAIR service
+ resvidnt.
+
+2011-11-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.inlines.hh, src/checked.cc: Scope of variables
+ reduced. Detected by ECLAIR service minscope.
+
+2011-11-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.templates.hh: Code layout improved.
+
+2011-11-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/math_utilities.inlines.hh: Simplified implementation.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_int.inlines.hh: Avoid implicit conversions reducing
+ size of underlying type. Detected by ECLAIR service utypflag.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.cc: Avoid implicit conversion reducing size of
+ underlying type. Detected by ECLAIR service utypflag.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/meta_programming.hh: Removed redundant cast. Detected by
+ ECLAIR service castexpr.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.cc: Removed several redundant casts. Detected by
+ ECLAIR service castexpr.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_Generator_System.cc, src/Grid_nonpublic.cc: Removed a few
+ redundant casts. Detected by ECLAIR service castexpr.
+
+2011-11-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.cc: Use consistently get_digit.
+
+2011-11-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_float.inlines.hh, src/fpu-c99.inlines.hh: Fixed bool
+ vs. numeric unsafe mixing. Detected by ECLAIR service utypflag.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.cc: Avoid implicit integral conversion reducing size
+ of underlying type. Detected by ECLAIR service utypflag.
+
+2011-11-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Float.defs.hh, src/Float.inlines.hh,
+ src/Interval_Info.defs.hh, src/checked.cc: Fixed bool vs. numeric
+ unsafe mixing. Detected by ECLAIR service utypflag.
+
+2011-11-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Integer.hh: Fixed plain char vs. numeric unsafe mixing.
+ Detected by ECLAIR service utypflag.
+
+2011-11-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc:
+ Fixed plain char vs. numeric unsafe mixing. Detected by ECLAIR
+ service utypflag.
+
+2011-11-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.inlines.hh: Avoid explicit integral conversions that
+ change the signedness of the underlying type of complex expressions.
+ Detected by ECLAIR service utypflag.
+
+2011-11-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc:
+ Revert "Fixed plain char vs. numeric unsafe mixing." This reverts commit e9ce6bcef3d6f7481e5399d8746062ccc72b25b0.
+
+2011-11-02 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc:
+ Fixed plain char vs. numeric unsafe mixing. Detected by ECLAIR
+ service utypflag.
+
+2011-11-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variable.cc: Do not mix plain char and numeric values.
+ Detected by ECLAIR service utypflag.
+
+2011-11-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/CO_Tree.cc, src/CO_Tree.templates.hh: Use an explicitly signed
+ char type when dealing with numeric info. Detected by ECLAIR
+ service utypflag.
+
+2011-11-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh: Added missing using directive.
+
+2011-11-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh: Revert "Revert "Avoid anonymous namespaces
+ in header files."" This reverts commit 3fbf4608f85679fc85f89d82f40fb20e0e60ca16.
+
+2011-11-01 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Box.templates.hh: Revert "Avoid anonymous namespaces in header
+ files." This reverts commit 086a400757aa4867611c023dcda5bc70afbc18b5.
+
+2011-11-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Spurious declaration removed.
+ Detected by ECLAIR service araysize.
+
+2011-11-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh: Avoid anonymous namespaces in header files.
+ Detected by ECLAIR service hedrfile.
+
+2011-10-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.defs.hh: Header file inclusions reordered.
+
+2011-10-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/BD_Shape.cc, src/BHRZ03_Certificate.cc,
+ src/Bit_Matrix.cc, src/Bit_Row.cc, src/Box.cc, src/CO_Tree.cc,
+ src/C_Polyhedron.cc, src/Checked_Number.cc, src/Coefficient.cc,
+ src/Concrete_Expression.cc, src/Congruence.cc,
+ src/Congruence_System.cc, src/Constraint.cc,
+ src/Constraint_System.cc, src/Dense_Matrix.cc, src/Dense_Row.cc,
+ src/Float.cc, src/Generator.cc, src/Generator_System.cc,
+ src/Grid_Certificate.cc, src/Grid_Generator.cc,
+ src/Grid_Generator_System.cc, src/Grid_Status.cc,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/Init.cc, src/Linear_Expression.cc,
+ src/Linear_Form.cc, src/Linear_Row.cc, src/Linear_System.cc,
+ src/MIP_Problem.cc, src/NNC_Polyhedron.cc, src/Octagonal_Shape.cc,
+ src/PIP_Problem.cc, src/PIP_Tree.cc, src/Partial_Function.cc,
+ src/Ph_Status.cc, src/Pointset_Ask_Tell.cc,
+ src/Pointset_Powerset.cc, src/Poly_Con_Relation.cc,
+ src/Poly_Gen_Relation.cc, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Row_Flags.cc,
+ src/Scalar_Products.cc, src/Sparse_Matrix.cc, src/Sparse_Row.cc,
+ src/Variable.cc, src/Variables_Set.cc, src/Weight_Profiler.cc,
+ src/c_streambuf.cc, src/checked.cc, src/conversion.cc,
+ src/fpu-ia32.cc, src/globals.cc, src/minimize.cc,
+ src/mp_std_bits.cc, src/simplify.cc, src/stdiobuf.cc,
+ src/termination.cc, src/version.cc, src/wrap_string.cc,
+ utils/timings.cc: Use <> brackets for system and standard library
+ headers only; use "" quotes for all other headers. Detected by
+ ECLAIR service hedrbrks.
+
+2011-10-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh, src/Checked_Number.inlines.hh: Long lines
+ avoided.
+
+2011-10-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc: Fixed typo.
+
+2011-10-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+ src/Concrete_Expression.inlines.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/checked_float.inlines.hh,
+ src/globals.defs.hh: Fixed wrong type uses. Detected by ECLAIR
+ service utypflag.
+
+2011-10-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.templates.hh, src/Congruence.cc,
+ src/checked.cc: Fixed bugs whereby the wrong types were used so that
+ overflows were possible. Detected by ECLAIR service utypflag.
+
+2011-10-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Grid.inlines.hh: Unwanted null
+ statements removed. Detected by ECLAIR service nullstmt.
+
+2011-10-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.defs.hh: Long line avoided.
+
+2011-10-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh: Avoid explicit integral conversions that
+ change the signedness of the underlying type of complex expressions.
+ Detected by ECLAIR service utypflag.
+
+2011-10-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh:
+ Removed trailing whitespace.
+
+2011-10-29 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: Avoid unsigned
+ integer wrap-around in constant expressions. Detected by ECLAIR
+ service cnstwrap.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Concrete_Expression.defs.hh,
+ src/Concrete_Expression.inlines.hh: Avoid implementation-defined
+ behavior by having bitfields of explicit unsigned integral type.
+ Detected by ECLAIR service bitftype.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh, src/checked_int.inlines.hh: Do not
+ reuse names reserved by the C++ implementation. Detected by ECLAIR
+ service resvidnt.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Linear_System.cc,
+ src/swapping_sort.templates.hh: Avoid anonymous namespaces in header
+ files. Detected by ECLAIR service hedrfile.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Linear_System.cc, src/Makefile.am,
+ src/{swapping_sort.icc => swapping_sort.templates.hh}: Source file
+ renamed.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.cc: Code layout improved.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.defs.hh: Use standard notation for pairs.
+
+2011-10-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Unwanted, commented-out code removed.
+ Detected by ECLAIR service cmntdout. (Thanks to Roberto Amadini.)
+
+2011-10-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Removed commented out line of code that was
+ introduced in the debugging phase. Detected by ECLAIR service
+ cmntdout.
+
+2011-10-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl-config.sed: Do rename HAVE_DECL_SETRLIMIT. Detected by ECLAIR
+ service idntvcbl.
+
+2011-10-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS, CREDITS, Makefile.am, README, README.configure, STANDARDS,
+ TODO, Watchdog/Makefile.am, Watchdog/README, Watchdog/configure.ac,
+ Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Threshold_Watcher.cc,
+ Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.inlines.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+ Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ configure.ac, debian/control, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+ demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+ demos/ppl_pips/ppl_pips_extra_man_text,
+ devtools/generate_dox_biblio,
+ devtools/generate_dox_ci_prolog_manual,
+ devtools/generate_man_pages, devtools/print_nonascii_lines,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+ doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+ fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, instchk.hh,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+ a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+ java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ , interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+ va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+ d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+ test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+ m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+ m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+ m4/ac_cxx_remainder_bug.m4, m4/ac_cxx_zero_length_arrays.m4,
+ m4/ac_prog_javac.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+ ppl.lsm.in, src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh, src/Any_Pointset.defs.hh,
+ src/Any_Pointset.inlines.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+ src/Bit_Matrix.inlines.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.cc,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Box_Status.idefs.hh, src/Box_Status.inlines.hh, src/CO_Tree.cc,
+ src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/CO_Tree.templates.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Checked_Number.cc, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Concrete_Expression.cc,
+ src/Concrete_Expression.defs.hh,
+ src/Concrete_Expression.inlines.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Congruence_System.inlines.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+ src/Dense_Matrix.inlines.hh, src/Dense_Row.cc,
+ src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Dense_Row.templates.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.templates.hh, src/Float.cc,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+ src/Init.cc, src/Init.defs.hh, src/Init.inlines.hh,
+ src/Integer_Interval.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Form.cc, src/Linear_Form.defs.hh,
+ src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+ src/Makefile.am, src/Matrix.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Numeric_Format.defs.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/OR_Matrix.templates.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Og_Status.idefs.hh,
+ src/Og_Status.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ src/Partial_Function.cc, src/Partial_Function.defs.hh,
+ src/Partial_Function.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+ src/Poly_Gen_Relation.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row_Flags.cc,
+ src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+ src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+ src/Scalar_Products.inlines.hh, src/Slow_Copy.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Row.cc,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/Sparse_Row.templates.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh, src/Temp.defs.hh,
+ src/Temp.inlines.hh, src/Temp.templates.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/Variables_Set.cc, src/Variables_Set.defs.hh,
+ src/Variables_Set.inlines.hh, src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/algorithms.hh, src/assert.hh,
+ src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+ src/distances.inlines.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh, src/initializer.hh,
+ src/intervals.defs.hh, src/iterator_to_const.defs.hh,
+ src/iterator_to_const.inlines.hh, src/linearize.hh,
+ src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+ src/max_space_dimension.hh, src/meta_programming.hh,
+ src/minimize.cc, src/mp_std_bits.cc, src/mp_std_bits.defs.hh,
+ src/mp_std_bits.inlines.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/simplify.cc,
+ src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+ src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/version.cc, src/version.hh.in,
+ src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+ tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/empty1.cc, tests/Box/equality1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+ tests/Box/intersection1.cc, tests/Box/interval1.cc,
+ tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruence1.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/relations3.cc,
+ tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+ tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+ tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+ tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+ tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+ tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+ tests/Concrete_Expression/C_Expr.cc,
+ tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/bdshape1.cc,
+ tests/Concrete_Expression/bdshape2.cc,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc,
+ tests/Concrete_Expression/octagonalshape1.cc,
+ tests/Concrete_Expression/octagonalshape2.cc,
+ tests/Concrete_Expression/polyhedron1.cc,
+ tests/Concrete_Expression/polyhedron2.cc,
+ tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+ tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+ tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+ tests/MIP_Problem/mipproblem4.cc, tests/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frequency1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc,
+ tests/Octagonal_Shape/wrap1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+ tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearexpression1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+ tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+ tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+ tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+ tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+ tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc, tests/README,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Sparse_Matrix/Makefile.am,
+ tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Web site
+ URI updated.
+
+2011-10-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/good_words: Temporary list of words allowed in comments
+ and to compose identifiers.
+
+2011-10-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/vocabulary: An initial vocabulary for the PPL.
+
+2011-10-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Checked_Number.inlines.hh, src/Temp.inlines.hh,
+ src/checked.defs.hh, src/checked.inlines.hh, src/compiler.hh,
+ src/globals.defs.hh, src/meta_programming.hh: Make sure all the uses
+ of macro arguments are surrounded by parentheses.
+
+2011-10-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: Fixed a bug whereby a wrong computational
+ weight was computed due to missing parentheses around a macro
+ argument. Detected by ECLAIR service macrbody.
+
+2011-10-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh: Very long line shortened.
+
+2011-10-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure: Updated to reflect the removal of
+ `--with-gmp-prefix' in favor of `--with-gmp'.
+
+2011-10-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/checked_int.inlines.hh,
+ src/globals.inlines.hh: Avoid excessive and dangerous reliance on
+ the C++ operator precedence rules. Detected by ECLAIR service
+ exprprns.
+
+2011-10-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Coefficient.types.hh,
+ src/Sparse_Row.defs.hh, src/globals.defs.hh: Avoid #include
+ directives after code (except for "*.idefs.hh", "*.inlines.hh" and
+ "*.templates.hh"). Detected by ECLAIR service inclmixd.
+
+2011-10-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh, src/Linear_Expression.cc: Avoid excessive and
+ dangerous reliance on the C++ operator precedence rules. Detected
+ by ECLAIR service exprprns.
+
+2011-10-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.inlines.hh, src/BD_Shape.templates.hh,
+ src/BHRZ03_Certificate.cc, src/Bit_Row.cc, src/Bit_Row.inlines.hh,
+ src/Boundary.defs.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.inlines.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.templates.hh, src/Congruence.cc,
+ src/Constraint.cc, src/Constraint.inlines.hh, src/Float.inlines.hh,
+ src/Generator.inlines.hh, src/Grid.inlines.hh,
+ src/Grid_Certificate.cc, src/Grid_Generator.cc, src/Grid_chdims.cc,
+ src/Grid_public.cc, src/H79_Certificate.cc,
+ src/Interval.inlines.hh, src/Linear_Expression.cc,
+ src/Linear_Row.inlines.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/NNC_Polyhedron.cc,
+ src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_public.cc, src/Variable.inlines.hh,
+ src/Variables_Set.inlines.hh, src/checked.cc,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/globals.inlines.hh, src/intervals.defs.hh,
+ src/math_utilities.inlines.hh, src/minimize.cc, src/wrap_string.cc:
+ Avoid excessive and dangerous reliance on the C++ operator
+ precedence rules. Detected by ECLAIR service exprprns. Other
+ readability improvements.
+
+2011-10-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Fixed MIP_Problem bug shown by
+ tests/MIP_Problem/mipproblem4.cc.
+
+2011-10-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am, tests/MIP_Problem/mipproblem4.cc:
+ Added test showing a bug when solving again a 0-dimensional
+ MIP_Problem. The bug only manifests when a previously solved
+ 0-dimensional MIP_Problem is solved again after having modified it
+ (that is, after changing optimization mode or optimization
+ function).
+
+2011-10-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc, src/Bit_Row.cc: Minor readability
+ improvements.
+
+2011-10-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/CO_Tree.inlines.hh: Moved misplaced parentheses.
+
+2011-10-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc: Moved namespace alias declaration.
+
+2011-10-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am, interfaces/Prolog/.gitignore,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_configured_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Prolog_interface_compilation.dox,
+ interfaces/Prolog/{ppl_prolog_sysdep_dox =>
+ Prolog_interface_sysdep.dox},
+ interfaces/Prolog/{ppl_prolog_sysindep_dox =>
+ Prolog_interface_sysindep.dox},
+ interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4: Reorganized
+ the generation of Prolog interface manuals to avoid duplication.
+
+2011-10-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Make sure we find <gmpxx.hh> when compiling
+ instchk.hh to check for valid instantiations.
+
+2011-10-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.cc, Watchdog/src/Time.defs.hh,
+ Watchdog/src/Time.inlines.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/tests/watchdog1.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/watchdog1.c,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_sysindep_dox,
+ interfaces/Prolog/tests/pl_check.pl, tests/Polyhedron/watchdog1.cc,
+ utils/timings.cc: Better terminology and identifiers concerning time
+ units. (Thanks to Anthony Foiani.)
+
+2011-10-09 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh: Initialize all elements of Dimension_Kind.
+
+2011-10-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.cc, src/Init.defs.hh, src/OR_Matrix.inlines.hh: Magic
+ constants avoided. Detected by ECLAIR service nomagicc.
+
+2011-10-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc: Magic
+ constants avoided. Detected by ECLAIR service nomagicc.
+
+2011-10-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.cc, Watchdog/src/Time.defs.hh,
+ Watchdog/src/Time.inlines.hh: Magic constants avoided. Detected by
+ ECLAIR service nomagicc.
+
+2011-09-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence.cc, src/Congruence.inlines.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc: For readability, prefer infix notation
+ for operator[].
+
+2011-09-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.cc: For readability, prefer infix notation
+ for operator[].
+
+2011-09-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.inlines.hh: Removed a redundant explicit
+ cast. Detected by ECLAIR service castexpr.
+
+2011-09-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.inlines.hh, src/intervals.defs.hh: Removed several
+ redundant explicit casts. Detected by ECLAIR service castexpr.
+
+2011-09-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Declare functions at file scope.
+
+2011-09-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Constraint_System.cc, src/Octagonal_Shape.templates.hh: Fixed
+ several indentation mistakes.
+
+2011-08-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ tests/Box/refinewithconstraints1.cc: Improved portability to
+ Solaris. (Thanks to Dagobert Michelsen and Maciej Blizinski.)
+
+2011-08-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Item revised.
+
+2011-08-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * m4/ac_check_gmp.m4: Prepend to old content of shared library path
+ var, instead of overwriting.
+
+2011-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Quoted more double quotes.
+
+2011-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Quoted double quotes.
+
+2011-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: More missing quotes added.
+
+2011-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Missing quotes added.
+
+2011-08-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounded1.cc: Use all the available tests.
+
+2011-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.inlines.hh, src/Interval_Info.inlines.hh,
+ src/Interval_Restriction.defs.hh: Silenced a few warnings.
+
+2011-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh: RAII_Temporary_Real_Relaxation is a
+ struct.
+
+2011-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.inlines.hh: Do not mix `int' and `dimension_type'.
+
+2011-07-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lpsol/ppl_lpsol.c, demos/ppl_pips/ppl_pips.cc,
+ m4/ac_cxx_limit_memory.m4: Make sure we have a declaration of
+ setrlimit() before trying to use it. We still assume that a system
+ that provides setrlimit() also provides getrlimit(), the converse
+ being false for, e.g., Minix. (Thanks to Thomas Cort.)
+
+2011-07-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Added environment variable export.
+
+2011-07-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, m4/ac_check_gmp.m4: Make sure the run-time tests for
+ GMP can find GMP's shared libraries.
+
+2011-07-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc: Fixed uses of PPL_HAVE_DECL_GETRUSAGE. (Thanks
+ to Thomas Cort.)
+
+2011-07-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, configure.ac, m4/Makefile.am, m4/ac_check_gmp.m4,
+ m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: New configure
+ options `--with-gmp=DIR', `--with-gmp-include=DIR' and
+ `--with-gmp-lib=DIR'. These supersede the (now removed) option
+ `--with-gmp-prefix'. (The old option never really worked; hopefully
+ this is the last change in this area.)
+
+2011-07-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: Updated.
+
+2011-07-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am:
+ Avoid annoying warnings caused by internal OCaml C code.
+
+2011-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Prolog/SWI/swi_efli.cc, src/BD_Shape.templates.hh,
+ src/Bit_Row.inlines.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Generator.inlines.hh, src/Interval_Restriction.defs.hh,
+ src/MIP_Problem.cc, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Temp.defs.hh, src/Temp.inlines.hh, src/checked.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpz.inlines.hh,
+ src/conversion.cc, src/fpu-ia32.cc, src/globals.defs.hh,
+ src/math_utilities.inlines.hh: Simplified PPL_DIRTY_TEMP.
+
+2011-07-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/Sparse_Row.cc: Silenced a couple of gcc
+ warnings.
+
+2011-06-12 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Prolog/SWI/Makefile.am: Added missing quotes.
+
+2011-06-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+ configure.ac, doc/Makefile.am: New configuration option
+ `--disable-documentation'.
+
+2011-06-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am, doc/Makefile.am: Make sure the PDF
+ documentation is fully built before extracting the PostScript
+ documentation.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/relations3.cc: Silenced gcc warnings.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/relations3.cc, tests/Box/relations4.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc: Silenced gcc warnings.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/tests/pwl_test.hh, tests/ppl_test.hh: Silenced gcc
+ warning.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/PIP_Tree.cc: Removed another unused variable.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/PIP_Tree.cc: Avoid another warning.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.inlines.hh: Avoid another warning.
+
+2011-06-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Grid_public.cc, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/wrap_assign.hh: Fixed some warnings.
+
+2011-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am: Moved misplaced conditional.
+
+2011-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/tests/Makefile.am, interfaces/Prolog/Makefile.am:
+ Do use $(interface_generator_files) when defined.
+
+2011-05-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+ tests/Concrete_Expression/linearform1.cc: Improved the documentation
+ and removed an useless function.
+
+2011-05-06 Fabio Bossi <bossi at cs.unipr.it>
+
+ * : commit 9374a9a1b64cc335b23b59a67271a2c93d865245 Author: Fabio
+ Bossi <bossi at cs.unipr.it> Date: Fri May 6 11:53:53 2011 +0200
+
+2011-05-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/globals.types.hh: Fixed an invalid Doxygen reference.
+
+2011-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit e1cf43ab6cd604855a4b94256a20979e28192980 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Wed May 4 14:37:21 2011 +0200
+
+2011-05-04 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox: Fixed some bugs in the
+ documentation for the MIP and PIP problems.
+
+2011-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 5a5759bafd7558a88a8cd8613940fcff247ea407 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Tue May 3 13:36:52 2011 +0100
+
+2011-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 12f97bbef1ad3223c630d10474851eb5d67611db Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Mar 15 12:06:59 2011 +0100
+
+2011-02-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Two items added.
+
+2011-02-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: When cross-compiling, assume that GMP has been
+ compiled with support for propagating exceptions.
+
+2011-02-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc: Work around a bug showing up under mingw-w64.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh: Avoid
+ (again) using the same macro name for different purposes. Doing it
+ confuses both the reader and Doxygen.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-language-interface.tex, doc/devref.tex,
+ doc/user-language-interface.tex, doc/user.tex: Get rid of LaTeX
+ warnings related to package fancyhdr.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am, doc/devref-language-interface.doxyconf.in,
+ doc/user-language-interface.doxyconf.in,
+ interfaces/C/C_interface.dox: Avoid duplicate PDF labels in the
+ configured C interface manuals.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-language-interface.tex, doc/devref.tex,
+ doc/user-language-interface.tex, doc/user.tex: Fixed a duplicate
+ hypertarget error in the generated PDF documentation.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh: Avoid
+ using the same macro name for different purposes. Doing it confuses
+ both the reader and Doxygen.
+
+2011-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-latex.in,
+ doc/devref-language-interface.doxyconf.in,
+ doc/devref.doxyconf-latex.in: Set INLINE_SOURCES = NO when producing
+ LaTeX documentation. This change is a workaround to a pdftex + hyperref issue that may
+ result in the following error \pdfendlink ended up in different nesting level than
+ \pdfstartlink when using some versions of Doxygen (e.g., 1.7.3). According to http://tug.org/errors.html the error is triggered when
+ a hyperlink is split across page boundaries and it can be generated
+ even by valid LaTeX code. Disabling source inlining is a way to
+ greatly decrease its likelihood.
+
+2011-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/meta_programming.hh: Fixed a couple of Doxygen related
+ problems.
+
+2011-02-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Updated.
+
+2011-02-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc: No longer overwrite the SIGILL handler.
+
+2011-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a: Never use `\c'; use <CODE></CODE> instead (yes, uppercase).
+
+2011-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README.configure, configure.ac, m4/ac_check_fpu_control.m4:
+ The `--disable-fpmath' configure option now disables all floating
+ point computations.
+
+2011-02-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 086927949fd92366d26e8b3fc8c93b63cc661b11 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sun Feb 20 08:57:04 2011 +0100
+
+2011-02-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/src/Makefile.am, config.guess, config.sub, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config_extra_man_text, src/Makefile.am:
+ Updated to minimize risks when the time of releasing PPL 0.12 will
+ come.
+
+2011-02-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Updated the entry for Marco Poletti.
+
+2011-02-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: avoid repeated lookup of
+ Sparse_Row's coefficients, in solve().
+
+2011-02-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: improve the performance of
+ solve().
+
+2011-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am: Disabled the `memory1' test (at
+ least for the time being).
+
+2011-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: test06 no longer overflows when
+ using 8-bit coefficients.
+
+2011-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 73cfc6e2390366f132e6967d225c4d5ec317bb46 Author: Marco
+ Poletti <poletti.marco at gmail.com> Date: Mon Feb 14 21:23:11 2011
+ +0100
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .gitignore: Ignore *.lzma.
+
+2011-02-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: avoid repeated calls to
+ Sparse_Row::get(), in solve().
+
+2011-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+ src/PIP_Tree.cc: Corrected a (checked-integer related) problem in
+ PIP_Solution_Tree::solve(). Updated expected results for 32-bits
+ checked integers: ppl_pips test lineri.dat no longer overflows.
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/.gitignore, interfaces/C/tests/.gitignore,
+ interfaces/Java/parma_polyhedra_library/.gitignore,
+ interfaces/Prolog/GNU/.gitignore, tests/Grid/.gitignore,
+ tests/PIP_Problem/.gitignore,
+ tests/Partially_Reduced_Product/.gitignore,
+ tests/Polyhedron/.gitignore, tests/Sparse_Matrix/.gitignore:
+ Updated.
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Fixed a number of wrong
+ conditionals.
+
+2011-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.defs.hh: Minor improvements to
+ documentation.
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl:
+ Copyright notices updated.
+
+2011-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: Document parameter indent_level in
+ PIP_Tree_Node::solve().
+
+2011-02-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.inlines.hh: Added other plain char specializations.
+
+2011-02-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Interval.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/meta_programming.hh: Added
+ missing specializations for plain char.
+
+2011-02-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Integer.hh: Specialize C_Integer<T> for plain char.
+
+2011-01-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh: Added specializations for plain char.
+
+2011-01-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_plain_char_is_signed.m4: Copy-and-paste mistake fixed.
+
+2011-01-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, m4/Makefile.am, m4/ac_cxx_plain_char_is_signed.m4:
+ Detect whether the plain char type is signed.
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am, demos/ppl_pips/Makefile.am,
+ interfaces/C/tests/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am, tests/Ask_Tell/Makefile.am,
+ tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/CO_Tree/Makefile.am, tests/Grid/Makefile.am,
+ tests/MIP_Problem/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+ tests/PIP_Problem/Makefile.am,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am,
+ tests/Sparse_Matrix/Makefile.am: Reduce the argument of valgrind's
+ --num-callers below the allowed maximum.
+
+2011-02-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mentioned a correction affecting PIP_Problem solution trees.
+ Mentioned an improvement in the generation of PIP_Tree_Node
+ tautological cnstraints, node splitting constraints and artificial
+ parameters.
+
+2011-02-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz: Copyright notices
+ updated.
+
+2011-02-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 32c3efb0d9a72bf3b3c9a6f3efaa89dff1b204ac Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Fri Feb 11 15:01:08 2011
+ +0100
+
+2011-02-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * : commit 22b1565be0efe35f86e6323180ff6de113b19b18 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Fri Feb 11 09:53:50 2011
+ +0100
+
+2011-02-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Minor readability improvements to
+ PIP_Decision_Node::solve().
+
+2011-02-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * : commit 29201d2a5893bbe17744777de36e9a106ed8ea95 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Thu Feb 10 18:48:11 2011
+ +0100
+
+2011-02-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+ demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+ demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+ demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a,
+ demos/ppl_pips/expected_mpz, demos/ppl_pips/expected_mpz_a:
+ Corrected expected results.
+
+2011-02-10 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.cc: Fixed stream state on checked input.
+
+2011-02-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * : commit 3c8f16e240439811d501629660cedb8f99f0009a Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Thu Feb 10 10:47:59 2011
+ +0100
+
+2011-02-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Exploit variable integrality when creating
+ tautology constraints. Factored out helper function void integral_simplification(Row&); used when generating tautology
+ and sign splitting constraints.
+
+2011-02-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4: Fixed
+ function ppl_Pointset_Powerset_*_get_disjunct in OCaml interface.
+
+2011-02-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Polyhedron_public.cc: Polyhedron: fix an invalid reference bug
+ in generalized_affine_image().
+
+2011-02-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Grid.templates.hh: Grid: avoid using an invalid reference in
+ the constructor from a Box.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Fixed a bug in the simplification of the solution
+ tree. We were too eager in merging a single true child with its
+ parent: if the true child happened to be a decision node with both
+ childs, the merging was causing the violation of a PIP_Decision_Node
+ invariant.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Further improvement to debug output.
+ Preprocessor flag NOISY_PIP_TREE_STRUCTURE only activate those debug
+ print taht is useful to hightlight the solution tree construction
+ process.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: A minor
+ improvement to the debug printing mechanism. Methods solve() and
+ generate_cut() are now provided with additional argument
+ indent_level, telling the amount of indentation for debug prints.
+ Added several messages to debug prints so as to clarify the solution
+ tree construction process.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Exploit integrality when adding constraints for
+ mixed parameter sign rows. Try to distinguish between NOISY and
+ VERY_NOISY debugging output.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Fully normalize
+ artificial parameters on construction. When in noisy mode, print
+ normalized parameters.
+
+2011-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Minor changes related to coding standards.
+ Prefer initial capitalization for (user-defined) type names. Prefer
+ function objects to function pointers. Avoid nesting an anonymous
+ namespace into another anonymous namespace.
+
+2011-02-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Corrected a bug in cut generation. We were using
+ %= instead of the helper function mod_assign(), which is meant to
+ compute the *positive* modulus. For clarity, the helper function
+ has been renamed as pos_mod_assign().
+
+2011-02-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Do not use the deprecated function
+ mpz_div_2exp. Use mpz_tdiv_q_2exp instead.
+
+2011-01-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: AC_PROG_OCAML only sets OCAMLOPT if OCAMLC is
+ different from "no".
+
+2011-01-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz: Copyright notices updated
+ in expexted result files.
+
+2011-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Cast_Floating_Point_Expression.types.hh,
+ src/Concrete_Expression.cc, src/Concrete_Expression.defs.hh,
+ src/Concrete_Expression.inlines.hh,
+ src/Concrete_Expression.types.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constant_Floating_Point_Expression.types.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Difference_Floating_Point_Expression.types.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.types.hh,
+ src/Float.templates.hh, src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.types.hh, src/Integer_Interval.hh,
+ src/Linear_Form.cc, src/Linear_Form.defs.hh,
+ src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Form.types.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.types.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.types.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.types.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.types.hh, src/linearize.hh,
+ tests/Concrete_Expression/C_Expr.cc,
+ tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/C_Expr.types.hh,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/bdshape1.cc,
+ tests/Concrete_Expression/bdshape2.cc,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc,
+ tests/Concrete_Expression/octagonalshape1.cc,
+ tests/Concrete_Expression/octagonalshape2.cc,
+ tests/Concrete_Expression/polyhedron1.cc,
+ tests/Concrete_Expression/polyhedron2.cc,
+ tests/Concrete_Expression/run_tests: Copyright notices updated.
+
+2011-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, README, README.configure, STANDARDS,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+ Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+ Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+ Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Pending_List.types.hh,
+ Watchdog/src/Threshold_Watcher.cc,
+ Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.inlines.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh,
+ Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+ Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ configure.ac, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+ demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+ demos/ppl_pips/ppl_pips_extra_man_text,
+ devtools/bump_copyright_years, devtools/generate_dox_biblio,
+ devtools/generate_dox_ci_prolog_manual,
+ devtools/generate_man_pages, devtools/print_nonascii_lines,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+ doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+ fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+ a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+ java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ , interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+ va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+ d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+ test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/ppl_prolog_sysdep_dox,
+ interfaces/Prolog/ppl_prolog_sysindep_dox,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+ m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+ m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+ m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+ src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+ src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+ src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+ src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+ src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence.types.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Congruence_System.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+ src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+ src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+ src/Dense_Row.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh, src/Float.cc,
+ src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator.types.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+ src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.inlines.hh, src/Init.types.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval.types.hh, src/Interval_Info.defs.hh,
+ src/Interval_Info.inlines.hh, src/Interval_Info.types.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+ src/Partial_Function.cc, src/Partial_Function.defs.hh,
+ src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+ src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Powerset.types.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+ src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+ src/Row_Flags.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+ src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+ src/Sparse_Row.types.hh, src/Temp.defs.hh, src/Temp.inlines.hh,
+ src/Temp.templates.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/assert.hh, src/assign_or_swap.hh,
+ src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+ src/distances.defs.hh, src/distances.inlines.hh,
+ src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+ src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/math_utilities.defs.hh,
+ src/math_utilities.inlines.hh, src/max_space_dimension.hh,
+ src/meta_programming.hh, src/minimize.cc, src/mp_std_bits.cc,
+ src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+ src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+ src/simplify.cc, src/stdiobuf.cc, src/stdiobuf.defs.hh,
+ src/stdiobuf.inlines.hh, src/stdiobuf.types.hh,
+ src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/version.cc, src/version.hh.in,
+ src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+ tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/empty1.cc, tests/Box/equality1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+ tests/Box/intersection1.cc, tests/Box/interval1.cc,
+ tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruence1.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/relations3.cc,
+ tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+ tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+ tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+ tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+ tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+ tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+ tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/affinepreimage2.cc, tests/Grid/approximatepartition1.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+ tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+ tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+ tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+ tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+ tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frequency1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc,
+ tests/Octagonal_Shape/wrap1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+ tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearexpression1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+ tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+ tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+ tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+ tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+ tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc, tests/README,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh,
+ tests/Sparse_Matrix/Makefile.am,
+ tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh:
+ Copyright notices updated.
+
+2011-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, README, README.configure, STANDARDS,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+ Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+ Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+ Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Pending_List.types.hh,
+ Watchdog/src/Threshold_Watcher.cc,
+ Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.inlines.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh,
+ Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+ Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ configure.ac, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+ demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+ demos/ppl_pips/ppl_pips_extra_man_text,
+ devtools/bump_copyright_years, devtools/generate_dox_biblio,
+ devtools/generate_dox_ci_prolog_manual,
+ devtools/generate_man_pages, devtools/print_nonascii_lines,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+ doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+ fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+ interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+ a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ ,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+ java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ , interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+ va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+ d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+ test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/ppl_prolog_sysdep_dox,
+ interfaces/Prolog/ppl_prolog_sysindep_dox,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+ m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+ m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+ m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+ src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+ src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+ src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+ src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+ src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence.types.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Congruence_System.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+ src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+ src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+ src/Dense_Row.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh, src/Float.cc,
+ src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator.types.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+ src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.inlines.hh, src/Init.types.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval.types.hh, src/Interval_Info.defs.hh,
+ src/Interval_Info.inlines.hh, src/Interval_Info.types.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+ src/Partial_Function.cc, src/Partial_Function.defs.hh,
+ src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+ src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Powerset.types.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+ src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+ src/Row_Flags.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+ src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+ src/Sparse_Row.types.hh, src/Temp.defs.hh, src/Temp.inlines.hh,
+ src/Temp.templates.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+ src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/assert.hh, src/assign_or_swap.hh,
+ src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+ src/distances.defs.hh, src/distances.inlines.hh,
+ src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+ src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/math_utilities.defs.hh,
+ src/math_utilities.inlines.hh, src/max_space_dimension.hh,
+ src/meta_programming.hh, src/minimize.cc, src/mp_std_bits.cc,
+ src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+ src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+ src/simplify.cc, src/stdiobuf.cc, src/stdiobuf.defs.hh,
+ src/stdiobuf.inlines.hh, src/stdiobuf.types.hh,
+ src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, src/version.cc, src/version.hh.in,
+ src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+ tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/empty1.cc, tests/Box/equality1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+ tests/Box/intersection1.cc, tests/Box/interval1.cc,
+ tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruence1.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/relations3.cc,
+ tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+ tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+ tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+ tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+ tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+ tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+ tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/affinepreimage2.cc, tests/Grid/approximatepartition1.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+ tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+ tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+ tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+ tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+ tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+ tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frequency1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc,
+ tests/Octagonal_Shape/wrap1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+ tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearexpression1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+ tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+ tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+ tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+ tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+ tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+ tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc, tests/README,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh,
+ tests/Sparse_Matrix/Makefile.am,
+ tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh:
+ Copyright notices updated.
+
+2011-01-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 0fd2de73dd626465d1c77d925eb63e2adb639648 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Sat Jan 8 17:23:18 2011
+ +0100
+
+2011-01-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.inlines.hh: Cyclic dependency avoided.
+
+2011-01-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh: Fixed documentation copy-and-paste error.
+
+2011-01-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh, src/Octagonal_Shape.templates.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Tree.cc,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Polyhedron_public.cc, src/conversion.cc, src/globals.inlines.hh:
+ Replaced several occurrences of assert() by PPL_ASSERT().
+
+2011-01-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Added missing parameter documentation.
+
+2011-01-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am: Do not build documentation for interfaces that
+ are not enabled.
+
+2011-01-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_prolog_generated_test.pl: Added missing
+ `use_module' directive.
+
+2010-12-30 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh:
+ Dense_Row: simplify the exception safety implementation by using an
+ implementation subobject.
+
+2010-12-27 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.inlines.hh: Dense_Row: improve
+ exception safety in constructors.
+
+2010-12-27 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc: Dense_Row: remove useless debugging code from
+ the OK() method.
+
+2010-12-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Constraint.inlines.hh, src/Dense_Matrix.cc, src/Dense_Row.cc,
+ src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Generator.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh: Dense_Row, Sparse_Row, Linear_Row: modify
+ the flags' getter and setter methods, to follow strict aliasing
+ rules.
+
+2010-12-25 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/Linear_Expression.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_System.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh: Dense_Row, Sparse_Row: remove the
+ construct() methods and add a constructor from Flags. Update client
+ code.
+
+2010-12-25 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.cc, src/Dense_Matrix.inlines.hh,
+ src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Dense_Row.types.hh: Dense_Row: simplify the internal
+ representation and implementation.
+
+2010-12-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Sparse_Row.defs.hh: Avoid a couple of doxygen warnings.
+
+2010-12-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh: Memory leaks fixed. (Patch by Marco
+ Poletti.)
+
+2010-12-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Updated.
+
+2010-12-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh: Added a
+ workaround to a space efficiency bug affecting MIP_Problem. The
+ baseline patch has been contributed by Marco Poletti. MIP_Problem now stores the input constraints as a sequence of
+ Constraint*. In this sequence, we distinguish between owned
+ constraints (whose resources are under control of the current
+ MIP_Problem object) and inherited constraints (whose resources are
+ shared with, and owned by, another MIP_Problem object). When
+ starting a branch-and-bound computation looking for an integral
+ feasible/optimal solution, we now inherit (rather than copy) the
+ input constraints. The workaround greatly improves space/time efficiency on (mixed)
+ integral problems, also providing a (simple and reasonable) partial
+ solution to https://www.cs.unipr.it/mantis/view.php?id=62 The solution is still partial: a complete solution requires the
+ implementation of a backtracking mechanism for incrementally added
+ constraints.
+
+2010-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_sicstus_prolog.m4: Obsolete comment removed.
+
+2010-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: No longer include BD_Shape<int8_t> among the
+ instantiations enabled by default.
+
+2010-12-19 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * m4/ac_check_sicstus_prolog.m4, m4/ac_check_xsb_prolog.m4: Replaced
+ $(cmd) with `cmd` in m4 autoconf files.
+
+2010-12-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox, instchk.hh, tests/Powerset/powerset1.cc:
+ Avoid using identifier PS, since Solaris has a macro with that name.
+
+2010-12-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.inlines.hh: Fixed a problem involving a missing
+ iostream inclusion.
+
+2010-12-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.inlines.hh: Added a proposed implementation for
+ ascii_dump() and ascii_load().
+
+2010-11-30 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/digitalfilters1.cc,
+ tests/Concrete_Expression/linearize.cc: Replaced
+ Integer_Interval_Type with Integer_Interval in tests.
+
+2010-11-30 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/linearize.hh: Fixed a few cut-and-paste errors in the
+ documentation.
+
+2010-11-30 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, src/Concrete_Expression.defs.hh,
+ src/Integer_Interval.hh, src/Makefile.am: Renamed
+ Integer_Interval_Type into Integer_Interval and moved it to
+ Integer_Interval.hh.
+
+2010-11-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.templates.hh, src/Linear_Form.templates.hh: Use ldexp
+ instead of ldexpl for portability reasons.
+
+2010-11-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.templates.hh, src/Linear_Form.templates.hh: Inclusions
+ of <cmath> fixed.
+
+2010-11-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 6ba7085042a9983395f1b15daa1bf88b68a48eff Author: Fabio
+ Bossi <bossi at cs.unipr.it> Date: Sat Oct 23 14:48:50 2010 +0200
+
+2010-10-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Properly quote the assignment
+ MAKE=$(MAKE). (Thanks to Volker Braun.)
+
+2010-10-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Properly quote the assignment
+ MAKE=$(MAKE). (Thanks to Volker Braun.)
+
+2010-10-19 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Concrete_Expression/octagonalshape1.cc: Reflect latest changes
+ to affine_image into affine_form_image.
+
+2010-10-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Updated list of bug fixes.
+
+2010-10-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * : commit 5c95fc0eab6a38442751ed16c6cfa9d538917f3f Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Tue Oct 19 08:15:12 2010
+ +0200
+
+2010-10-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Fixed a bug.
+
+2010-10-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+ the unused assign() method.
+
+2010-10-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh: Sparse_Matrix: add some methods, to be
+ fully compatible with Dense_Matrix.
+
+2010-10-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh: Sparse_Row: add some methods, to be fully
+ compatible with Dense_Row.
+
+2010-10-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add a
+ max_size() static method.
+
+2010-10-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit ff5b0796773b34ef9d1e26d2a40b4fdb8376dc8f Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Oct 16 09:11:15 2010 +0200
+
+2010-10-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.defs.hh: Documented precondition of method
+ Bit_Matrix::remove_trailing_columns().
+
+2010-10-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Matrix.cc: In method Bit_Matrix::OK(), do also check the
+ first Bit_Row.
+
+2010-10-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/linearize.hh: Added two FIXME notes.
+
+2010-10-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/linearize.hh: Never add a rounding error when casting 1.
+
+2010-10-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/linearize.hh: Never add a rounding error when casting the 0
+ value.
+
+2010-10-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc: Sparse_Row: optimize linear_combine(), avoiding
+ the insertion of too many elements.
+
+2010-10-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.defs.hh, src/Sparse_Matrix.defs.hh: Dense_Matrix,
+ Sparse_Matrix: remove useless typedefs for row_type.
+
+2010-10-01 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix comment.
+
+2010-09-29 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh:
+ Always use marked_empty() instead of is_empty() after a closure.
+
+2010-09-27 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/CO_Tree.templates.hh: CO_Tree: rename the size field into size_,
+ and add a size() method.
+
+2010-09-27 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: avoid shadowing a field with a local
+ variable, in external_memory_in_bytes().
+
+2010-09-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh: Dense_Row: mark the constructor from a
+ Sparse_Row as explicit.
+
+2010-09-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add an
+ assignment operator from a Dense_Row.
+
+2010-09-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc: Sparse_Row: copy flags too, in the constructor
+ from a Dense_Row.
+
+2010-09-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh: Dense_Row: add a
+ constructor and an assignment operator that take a Sparse_Row.
+
+2010-09-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Sparse_Row.cc:
+ CO_Tree: fix bug in the constructor from a sequence and remove its
+ second argument, it is used in assertions only.
+
+2010-09-29 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh: Added
+ generalized_refine_with_linear_form_inequality.
+
+2010-09-29 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Added missing emptiness checks.
+
+2010-09-29 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Implemented
+ export_interval_constraints.
+
+2010-09-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 0bb0a14d690bda10c0893e11b6019128b3c4908e Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Fri Sep 24 19:48:27 2010 +0200
+
+2010-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/libtool.m4, Watchdog/m4/ltversion.m4, m4/libtool.m4,
+ m4/ltversion.m4: Updated.
+
+2010-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, Watchdog/INSTALL, Watchdog/compile,
+ Watchdog/config.guess, Watchdog/config.sub, Watchdog/ltmain.sh,
+ compile, config.guess, config.sub, ltmain.sh: Updated.
+
+2010-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Temporarily pass a raw value
+ instead of a checked number for simplicity.
+
+2010-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Use is_empty instead of
+ marked_empty for maximum safety.
+
+2010-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Added method export_interval_constraints.
+
+2010-09-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit d8484a4794afafb978c01c718ea784465d835171 Author: Marco
+ Poletti <poletti.marco at gmail.com> Date: Mon Sep 20 20:20:16 2010
+ +0200
+
+2010-09-20 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Constraint_System.cc, src/Dense_Matrix.defs.hh,
+ src/Dense_Matrix.inlines.hh, src/Generator_System.cc,
+ src/Grid_chdims.cc, src/Grid_simplify.cc, src/Linear_System.cc,
+ src/MIP_Problem.cc, src/PIP_Tree.cc, src/Polyhedron.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh,
+ src/conversion.cc, src/simplify.cc: Dense_Matrix, Sparse_Matrix:
+ rename the erase_to_end() method into remove_trailing_rows(),
+ changing the argument's meaning.
+
+2010-09-20 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh: Grid_Generator_System: remove
+ unused erase_to_end() private method.
+
+2010-09-20 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.templates.hh: Fix comment.
+
+2010-09-20 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.inlines.hh: Sparse_Row: weaken the lower_bound()
+ requirements on the argument.
+
+2010-09-20 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc: Sparse_Row: make the constructor from a
+ Dense_Row work even when Coefficient_traits::const_reference is
+ Coefficient.
+
+2010-09-19 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: add a
+ linear_combine() method that takes a Dense_Row and a Sparse_Row, to
+ re-allow dense working costs with sparse matrices.
+
+2010-09-19 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: add assertion.
+
+2010-09-19 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: use working_cost_type instead of
+ using Row directly. Remove unnecessary specialized implementation
+ for sparse working costs.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/MIP_Problem.cc, src/PIP_Problem.cc, src/PIP_Tree.cc,
+ src/Sparse_Matrix.defs.hh, src/Sparse_Row.cc,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/Sparse_Row.templates.hh: Sparse_Row, Dense_Row: rename
+ find_create() methods into insert().
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row: add documentation.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/Sparse_Matrix/sparserow1.cc: test/Sparse_Matrix: add test
+ for the Sparse_Row's constructor from a Dense_Row.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add a
+ constructor from a Dense_Row.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Makefile.am:
+ CO_Tree: add a constructor from a sequence of elements.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Makefile.am: src/Makefile.am: remove duplicate filenames from
+ the list.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/Sparse_Matrix.defs.hh, src/Sparse_Row.defs.hh: Indentation
+ fixes, mainly to avoid line wraps.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.defs.hh: Fix typo in comment.
+
+2010-09-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-09-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * : Merge remote branch 'origin/master' into sparse_matrices Conflicts: src/MIP_Problem.cc
+
+2010-09-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/PIP_Tree.cc: Prefer neg_assign to the use
+ of unary minus on Coefficient objects. Use add_mul_assign even in
+ code only activated during debugging.
+
+2010-09-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention the correction of an efficiency bug in the C
+ interface.
+
+2010-09-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 90d9338c35f62fa89a86c3b7192b2fa8172d1b20 Merge: ff67a6b
+ d91c33b Author: Marco Poletti <poletti.marco at gmail.com> Date: Thu
+ Sep 16 21:08:52 2010 +0200
+
+2010-09-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix performance bug in
+ compute_generator().
+
+2010-09-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * interfaces/C/ppl_c_implementation_common.cc:
+ ppl_c_implementation_common: fix performance bug in
+ ppl_Linear_Expression_add_to_coefficient.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove useless reset() from
+ linear_conbine().
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: optimize
+ the linear_combine() method.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.templates.hh: Sparse_Row: don't create stored
+ zeroes in combine_needs_second().
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row: document that linear_combine()
+ parameters must not be 0.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: use Row::linear_combine() in
+ linear_combine().
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add a
+ linear_combine() method.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh: Dense_Row: add a
+ linear_combine() method.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove some optimizations meant
+ for dense matrices when using sparse matrices.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: remove useless code.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: remove unnecessary temporary variables.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Matrix.defs.hh, src/Matrix.types.hh, src/Row.defs.hh,
+ src/Row.types.hh: Row, Matrix: avoid inclusion of unnecessary files.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/Sparse_Matrix/sparsematrix1.cc,
+ tests/Sparse_Matrix/sparserow1.cc: tests/Sparse_Matrix: run the
+ tests only when using sparse matrices.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: CO_Tree: run tests only when using
+ sparse matrices, avoiding compiler errors.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: PIP_Tree: use Row and
+ Matrix, simplifying code.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: PIP_Problem: use Row
+ and Matrix, simplifying code.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree.defs.hh: include CO_Tree.types.hh.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Makefile.am,
+ src/Matrix.defs.hh, src/Matrix.types.hh, src/Row.defs.hh,
+ src/Row.types.hh: Declare typedefs for Row and Matrix, and use them
+ in MIP_Problem.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * : Merge remote branch 'origin/master' into sparse_matrices Conflicts: src/MIP_Problem.cc
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: return if there are no candidates, in
+ find_lexico_minimum_column().
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Problem.cc: PIP_Problem: declare iterators used in for
+ loops in the loop header.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: declare iterators used in for loops in
+ the loop header.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove non-necessary temporary
+ variables.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove out-dated comment.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: declare iterators used in for
+ loops in the loop header.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/globals.defs.hh: Make PPL_DIRTY_TEMP_COEFFICIENT work outside
+ the PPL namespace, too.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: add comment.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize further
+ steepest_edge_exact_entering_index() for sparse working_cost rows.
+
+2010-09-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: use a hint iterator for
+ insertions in working_cost, in process_pending_constraints().
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize further
+ steepest_edge_float_entering_index() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ process_pending_constraints() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+ sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix regression in
+ textbook_entering_index(), introduced in commit 6880A6.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+ sparse working_cost rows (#4).
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: avoid an unnecessary copy of the
+ working_cost row, in second_phase().
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+ sparse working_cost rows (#3).
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+ sparse working_cost rows (#2).
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+ sparse working_cost rows (#1).
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: little optimizations for sparse
+ working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ textbook_entering_index() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ steepest_edge_float_entering_index() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ steepest_edge_exact_entering_index() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ process_pending_constraints() for sparse working_cost rows.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.inlines.hh: Sparse_Row: add some assertions.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: use a
+ sparse working_cost when using sparse matrices.
+
+2010-09-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+ a constructor and two copy-constructors that take a capacity
+ parameter.
+
+2010-09-13 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/digitalfilters1.cc: Adapted tests on
+ digital filters to latest changes.
+
+2010-09-13 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.defs.hh, src/linearize.hh,
+ tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/linearize.cc: Do not fail automatically
+ when linearizing approximable references having more than one
+ associated dimension.
+
+2010-09-13 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Concrete_Expression.defs.hh, src/Float.defs.hh,
+ src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+ src/linearize.hh, tests/Concrete_Expression/C_Expr.defs.hh,
+ tests/Concrete_Expression/C_Expr.inlines.hh,
+ tests/Concrete_Expression/Makefile.am,
+ tests/Concrete_Expression/linearform1.cc,
+ tests/Concrete_Expression/linearize.cc: Use an oracle to obtain
+ information from an external analyzer in the linearization function. Temporarily disabled test digitalfilters.
+
+2010-09-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: improve a little bit the
+ get_exiting_base_index() performance.
+
+2010-09-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.alpha, tests/BD_Shape/disjoint1.cc,
+ tests/Box/congruences1.cc, tests/Box/max_min1.cc,
+ tests/Box/relations4.cc, tests/Grid/addcongruences1.cc,
+ tests/MIP_Problem/exceptions1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Polyhedron/exceptions2.cc: Reflected the changes in
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8966
+
+2010-09-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: don't copy Coefficient objects to
+ cache accesses, in steepest_edge_exact_entering_index().
+
+2010-09-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Mentioned the fix to Interval::Interval(const char*).
+
+2010-09-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 3e2fe287b4efd3b58127951793cc00ffe0ca21c0 Author: Abramo
+ Bagnara <abramo.bagnara at gmail.com> Date: Tue Sep 7 23:13:17 2010
+ +0200
+
+2010-09-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Announced a couple of new features and bugfixes.
+
+2010-09-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention the use of sparse matrices in MIP and PIP solvers.
+
+2010-09-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix some debug messages and
+ comments, in OK().
+
+2010-09-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix typos in some debug messages
+ and comments, in OK().
+
+2010-09-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 3c68d508caa260d4dc59b5f6922fe6a0079d6eef Author: Fabio
+ Bossi <bossi at cs.unipr.it> Date: Tue Sep 7 17:51:07 2010 +0200
+
+2010-09-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: test06 fails with 8-bit
+ coefficients.
+
+2010-09-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 384f089de7b9464efddf008a02d773af6ae213ea Author: Marco
+ Poletti <poletti.marco at gmail.com> Date: Sun Sep 5 19:33:59 2010
+ +0200
+
+2010-09-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/Sparse_Matrix/sparsematrix1.cc: tests/Sparse_Matrix: modify
+ the tests so that they pass even when using 8-bit coefficients.
+
+2010-09-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: use DO_TEST_F8 when a
+ test is expected to fail with 8-bit coefficients.
+
+2010-09-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: work when
+ Coefficient_traits::const_reference is just Coefficient, losing some
+ performance when it's not.
+
+2010-09-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: work when
+ Coefficient_traits::const_reference is just Coefficient, losing some
+ performance when it's not.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: work even when
+ data_type_const_reference is `data_type' instead of `const
+ data_type&'.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ dfs_index() methods.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: add data_type_const_reference typedef and use it instead of
+ const data_type&.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh: Sparse_Row: use
+ Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh:
+ Dense_Row: use Coefficient_traits::const_reference instead of const
+ Coefficient&.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: use Coefficient_traits::const_reference
+ instead of const Coefficient&.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Problem.cc: PIP_Problem: use
+ Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-04 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: use
+ Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix compilation when
+ Coefficient_traits::const_reference is not `const Coefficient&'.
+
+2010-09-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * : commit 7d4b9abcd12085a554123d1dda6efc7d09037896 Author: Marco
+ Poletti <poletti.marco at gmail.com> Date: Fri Sep 3 20:29:20 2010
+ +0200
+
+2010-09-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: rename index() method into dfs_index().
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_int8_a: Expected results updated.
+
+2010-09-03 Marco Poletti <poletti.marco at gmail.com>
+
+ * : commit 14c85a1607cf3ccfbf016ae5ea808dafffa37d04 Merge: 47946c5
+ bc0f52b Author: Marco Poletti <poletti.marco at gmail.com> Date: Fri
+ Sep 3 16:14:56 2010 +0200
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int8:
+ Updated expected results.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit c9b9ee534d533869f1c5951c9909b04eeb60325b Merge: 22520a5
+ 533049e Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Fri
+ Sep 3 15:36:02 2010 +0200
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number fixed.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Revised Marco Poletti's entry.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: By default, use sparse matrices both for
+ MIP_Problem and PIP_Problem.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/globals.defs.hh: Slight improvement to the selection mechanism
+ for sparse and dense matrices.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-09-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 22520a5a072e6b1641b6a94585eb20c6b1cec2e8 Author: Fabio
+ Bossi <bossi at cs.unipr.it> Date: Fri Sep 3 11:03:16 2010 +0200
+
+2010-09-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, tests/Polyhedron/numberinput1.cc:
+ Improved documentation for number input routine. Added another
+ couple of tests.
+
+2010-09-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.cc, tests/Polyhedron/numberinput1.cc: Let the input
+ routine accept floating-point syntax starting with ".".
+
+2010-08-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/checked.cc,
+ tests/Polyhedron/numberinput1.cc: Let the input routine for checked
+ numbers accepts C99 hexadecimal float syntax.
+
+2010-08-31 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: fix compilation with
+ --enable-assertions and without --enable-more-assertions.
+
+2010-08-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit eac65c875791c7ad6065a918cada3783f487f706 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Aug 30 09:20:53 2010 +0200
+
+2010-08-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit f078b9a6bcc0c1fa82d474e676e82a8e5dd8d319 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sun Aug 29 14:32:07 2010 +0200
+
+2010-08-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: For checking purposes, use the exact
+ LP solver of GLPK.
+
+2010-08-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c, doc/ppl-config.1: When the `--check'
+ option is used, input data is perturbed the same way as GLPK does.
+
+2010-08-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Do also read the inhomogeneous term
+ of the objective function. This should allow for a (almost) meaningful comparison with the
+ optimizied value computed by glpk when using command line option -c. Also corrected a minor bug in the output routine for the objective
+ function (an open parenthesis was sometimes missing).
+
+2010-08-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit f75832a600dfb6af890af3fb94cb99500d7e5de4 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Aug 28 14:31:18 2010 +0200
+
+2010-08-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 95a83d824c7ffd8f61f627fab3aa22dae3a65fcf Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Aug 28 14:11:34 2010 +0200
+
+2010-08-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 309c66893fcd97c6a648ef72cbc1b3fed07defe6 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Aug 28 14:05:20 2010 +0200
+
+2010-08-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Fixed the argument type of
+ limit_virtual_memory(): should be unsigned long.
+
+2010-08-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Augment the precision with which
+ floating point numbers are printed in error messages.
+
+2010-08-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve code in rebalance().
+
+2010-08-26 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh, src/Sparse_Matrix.inlines.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh: CO_Tree,
+ Sparse_Row, Sparse_Matrix: remove unnecessary includes.
+
+2010-08-25 Marco Poletti <poletti.marco at gmail.com>
+
+ * : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-08-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am: Added $(top_builddir)/src/libppl.la
+ to ppl_lpsol_LDADD.
+
+2010-08-25 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+ steepest_edge_float_entering_index().
+
+2010-08-25 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+ steepest_edge_exact_entering_index(), when using dense matrices.
+
+2010-08-24 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: tune density thresholds.
+
+2010-08-24 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: avoid
+ unnecessary typedefs.
+
+2010-08-24 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix performance regression in the
+ dense version of linear_combine().
+
+2010-08-24 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+ steepest_edge_float_entering_index(), when using dense matrices.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: document that
+ min_leaf_density_percent must be greater than zero.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row: document that hint iterators
+ must be valid and point to that row.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: be exception-safe.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: perform checks that need an ABI change only when
+ PPL_ABI_BREAKING_EXTRA_DEBUG is defined.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: rename
+ PPL_ROW_EXTRA_DEBUG macro into PPL_DENSE_ROW_EXTRA_DEBUG.
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/Sparse_Row.inlines.hh,
+ tests/CO_Tree/cotree1.cc: CO_Tree: rename increase_keys_after()
+ method into increase_keys_from().
+
+2010-08-22 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Dense_Row.defs.hh,
+ src/MIP_Problem.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh: Improve Doxygen documentation.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Matrix.inlines.hh: Sparse_Matrix:
+ do not inline complex methods.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh: Sparse_Matrix: reorder method
+ declarations and definitions.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row: fix documentation for
+ lower_bound() methods.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.inlines.hh: Sparse_Row: do not
+ inline complex methods.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh: Sparse_Row: reorder method declarations
+ and definitions.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.defs.hh: Sparse_Matrix: improve documentation,
+ adapting to changes in Sparse_Row methods' complexity.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row: improve documentation,
+ adapting to changes in CO_Tree methods' complexity.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: improve documentation, fixing the
+ complexities of insertions and deletions.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: remove
+ row_type typedef, to avoid confusion with matrix_type::row_type.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: do not use reset() on Dense_Row
+ object, to avoid confusion.
+
+2010-08-21 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix documentation of
+ min_density_percent.
+
+2010-08-19 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: simplify code in
+ steepest_edge_float_entering_index().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ steepest_edge_exact_entering_index().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ steepest_edge_float_entering_index().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: optimize count_used_in_subtree().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: optimize
+ compact_elements_in_the_rightmost_end().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: add comments about some optimizations.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: document the preconditions of
+ copy_data_from().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: add assertion in copy_data_from().
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ is_before_begin() methods.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: remove unnecessary include for
+ iostream.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.templates.hh, src/Makefile.am, src/PIP_Problem.cc,
+ src/PIP_Tree.cc, src/Row_Flags.cc, src/Row_Flags.defs.hh,
+ src/Row_Flags.inlines.hh, src/Row_Flags.types.hh,
+ src/Sparse_Row.defs.hh, tests/Sparse_Matrix/sparsematrix1.cc: Move
+ Dense_Row::Flags out of Row class, renaming it as Row_Flags.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ src/Bit_Matrix.cc, src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constraint.cc, src/{Matrix.cc => Dense_Matrix.cc},
+ src/{Matrix.defs.hh => Dense_Matrix.defs.hh},
+ src/{Matrix.inlines.hh => Dense_Matrix.inlines.hh},
+ src/{Row.types.hh => Dense_Matrix.types.hh}, src/{Row.cc =>
+ Dense_Row.cc}, src/{Row.defs.hh => Dense_Row.defs.hh},
+ src/{Row.inlines.hh => Dense_Row.inlines.hh}, src/{Row.templates.hh
+ => Dense_Row.templates.hh}, src/{Matrix.types.hh =>
+ Dense_Row.types.hh}, src/Generator.defs.hh, src/Grid.defs.hh,
+ src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.templates.hh, src/Makefile.am, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Sparse_Row.defs.hh, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/{matrix1.cc => densematrix1.cc},
+ tests/Polyhedron/memory2.cc, tests/Sparse_Matrix/sparsematrix1.cc:
+ Rename Row and Matrix into Dense_Row and Dense_Matrix.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ src/Makefile.am, src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+ src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh,
+ src/Unlimited_Sparse_Row.types.hh: Sparse_Row: merge with
+ Unlimited_Sparse_Row and remove the Unlimited_Sparse_Row class.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh: Sparse_Matrix:
+ remove remaining references to Unlimited_Sparse_Row.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+ src/Sparse_Row.types.hh: Remove the Sparse_Row_Reference class.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+ src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/Sparse_Matrix.defs.hh: Matrix, Sparse_Matrix: remove rendundant
+ typedefs. Don't use such typedefs in MIP_Problem, PIP_Problem and
+ PIP_Tree.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh: Sparse_Matrix: change the type of the
+ rows from Unlimited_Sparse_Row to Sparse_Row.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+ external_memory_in_bytes() method.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+ delete_element_and_shift() and add_zeroes_and_shift() methods.
+
+2010-08-18 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+ a reset() method that takes an index.
+
+2010-08-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+ src/Dense_Matrix.inlines.hh, src/Dense_Matrix.types.hh,
+ src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Dense_Row.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.templates.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh, src/Row.cc, src/Row.defs.hh,
+ src/Row.inlines.hh, src/{Dense_Row.templates.hh =>
+ Row.templates.hh}, src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh,
+ tests/Sparse_Matrix/sparsematrix1.cc: Many changes, mainly the merge
+ of Row with Dense_Row and Matrix with Dense_Matrix: * Merge Dense_Row into Row * Merge Dense_Matrix into Matrix * Handle flags in Unlimited_Sparse_Row and Sparse_Row
+
+2010-08-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Row.defs.hh: Row: remove friend declaration in Flags.
+
+2010-08-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Make
+ Doxygen process documentation of CO_Tree, Unlimited_Sparse_Row,
+ Sparse_Row, Sparse_Matrix, Dense_Row and Dense_Matrix.
+
+2010-08-17 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+ Unlimited_Sparse_Row, Sparse_Row, Sparse_Matrix: fix math
+ expressions in Doxygen comments.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.cc, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh: Dense_Row: derive from Row instead of
+ containing a private Row object.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.defs.hh: Use 'where * is' instead of 'with
+ *' when commenting math formulas in Doxygen comments.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: compute external
+ memory handled by Coefficient objects in external_memory_in_bytes().
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: remove
+ for_each_nonzero() methods.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh:
+ Sparse_Row_Reference: remove for_each_nonzero() methods.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh:
+ Sparse_Matrix: remove for_each_row() methods.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+ for_each_nonzero() methods.
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: don't use for_each_nonzero() in
+ process_pending_constraints()
+
+2010-08-16 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+ Unlimited_Sparse_Row, Sparse_Row, Sparse_Row_Reference,
+ Sparse_Matrix: document time complexity of all methods.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.defs.hh: CO_Tree, Sparse_Row,
+ Unlimited_Sparse_Row: document that hint iterators must be valid and
+ point to that object.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ the reset() method that takes two dimension_type arguments, it's
+ rendundant and unused.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh:
+ Sparse_Row_Reference: remove the reset() method that takes two
+ dimension_type arguments, it's rendundant and unused.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ unused and rendundant methods: assign() and assign_if_nonzero().
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: remove unused and rendundant methods: assign()
+ and assign_if_nonzero().
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/Sparse_Matrix/Makefile.am,
+ tests/Sparse_Matrix/sparserow1.cc: tests/Sparse_Matrix: add
+ sparserow1 test.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.defs.hh, src/Sparse_Matrix.defs.hh: Dense_Matrix,
+ Sparse_Matrix: update permute_columns() documentation to match the
+ one in Matrix.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.inlines.hh: Sparse_Matrix: allow passing a row
+ of the same matrix to add_row().
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh:
+ Sparse_Matrix::iterator: add operator=(), operator==() and
+ operator!=().
+
+2010-08-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.defs.hh: Improved doxygen docs for
+ Matrix::permute_columns().
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: add more tests.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: remove follow_{left,right}_childs() methods.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: remove comparison operators with an
+ iterator.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix style of Doxygen comment.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: remove before-beginning state from iterator and
+ const_iterator.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: add constructor from a tree and an index.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ is_before_begin() methods.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ before_begin() methods and update documentation.
+
+2010-08-15 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: remove before_begin() methods and update
+ documentation.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: add more tests.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: simplify the insert() method.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: make the
+ precondition of rebuild_smaller_tree() stronger.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the
+ precondition of redistribute_elements_in_subtree() stronger.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the
+ precondition of compact_elements_in_the_rightmost_end() stronger.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: make assertion stronger, in rebalance().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove
+ least_common_ancestor().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use least_common_ancestor() in
+ erase().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use clear() in erase().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: turn always-false condition into
+ assertion.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: CO_Tree: add some tests.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove the
+ constructor from an std::vector.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ the constructor from an std::vector.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row:
+ remove the constructor from an std::vector.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: avoid warning in release mode.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: avoid warnings in release mode.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row, Sparse_Row_Reference: make
+ OK() methods private.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: document return value of
+ bisect_near() when the tree is empty.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.cc: Unlimited_Sparse_Row: remove FIXME.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: optimize update_solution().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+ optimize code, in generate_cut() (#3).
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+ optimize code, in generate_cut() (#2).
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+ optimize code, in generate_cut().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: optimize generate_cut() (#2).
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: optimize generate_cut() (#1).
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: simplify code in solve().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: optimize the solve() method.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+ simplify code in solve() (#2).
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+ simplify code in solve().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: simplify code in solve().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef(s) and
+ simplify code, in update_tableau().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree_Node: improve indentation and code
+ readability in compatibility_check().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree_Node: remove unused #ifdef in
+ compatibility_check().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node::Tableau: optimize and simplify
+ code in is_better_pivot().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Solution_Node::Tableau: simplify code in
+ scale().
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: optimize
+ process_pending_constraints() for sparse matrices.
+
+2010-08-14 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove unused variable.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree_Node: turn always-true if condition into
+ assertion, in add_constraint().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: rename some types used in
+ compatibility_check_find_pivot().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: rename some types used in
+ compatibility_check_find_pivot_in_set().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: optimize
+ find_lexico_minimum_column() for sparse matrices.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: remove variable that is unused in
+ release mode, in find_lexico_minimum_column_in_set().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: call reset() when needed, in
+ complement_assign().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: add a
+ reset() method taking an iterator.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree.cc: optimize merge_assign() for sparse
+ matrices.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Problem.cc: PIP_Problem: optimize solve() for sparse
+ matrices.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: fix indentation.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove unused code.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: remove unneeded variable.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: allow
+ every value of (unused) hint iterators.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Matrix.defs.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ src/Sparse_Matrix.defs.hh: Move conditional typedefs from PIP_Tree,
+ PIP_Problem and MIP_Problem into Dense_Matrix and Sparse_Matrix.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc: Sparse_Matrix: use
+ Unlimited_Sparse_Row::clear() in the ascii_load() method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: add the clear() method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add the
+ clear() method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add the
+ clear() method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+ Sparse_Matrix, Sparse_Row, Sparse_Row_Reference,
+ Unlimited_Sparse_Row: change the Doxygen documentation to follow the
+ PPL coding standards.
+
+2010-08-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, src/Interval.templates.hh, tests/Box/cc76widening.cc:
+ Corrected a bug affecting Interval::CC76_widening_assign(const
+ From&, Iterator, Iterator). This, in turn, affected
+ Box::CC76_widening_assign(const T&, Iterator, Iterator): lower bound
+ would not be computed correctly when the two iterators specify an
+ empty list of stop points. Many thanks to Sagar Chaki and Arie
+ Gurfinkel.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.defs.hh: Sparse_Matrix: document all methods and
+ fields.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.inlines.hh: Sparse_Matrix: indentation fixes.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.inlines.hh: Sparse_Matrix: move some code.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc: Sparse_Matrix: optimize the OK() method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc: Sparse_Matrix: use iterators instead of
+ indexes in external_memory_in_bytes().
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc: Sparse_Matrix: improve code readability
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ typedef for This, fix indentation
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: add before_cbegin(), cbegin() and cend()
+ methods, return const& in before_begin() and end() methods, add
+ documentation.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add
+ before_cbegin(), cbegin() and cend() methods.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ before_cbegin(), cbegin() and cend() methods.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc: Sparse_Row, Sparse_Row_Reference: optimize OK()
+ methods.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row_Reference: add documentation of
+ the class itself.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.inlines.hh: Sparse_Row: optimize the resize()
+ method.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.cc, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: don't inline OK() methods.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh: Sparse_Row, Sparse_Row_Reference: document
+ all methods and fields.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: clarify
+ comments.
+
+2010-08-13 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: fix compiling error in release
+ mode.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.templates.hh: Sparse_Row: add unnecessary include,
+ to please KDevelop4.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row:
+ remove unnecessary code in combine().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: pass
+ a hint to find_create() in combine_needs_second().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row:
+ simplify code in the assign() method.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: add a little
+ optimization in reset().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row:
+ optimize the reset() method.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: make
+ code in all find() and lower_bound() methods similar.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: don't
+ using invalidated iterators in swap().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row:
+ indentation fixes.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: document
+ all methods and the tree field.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: remove
+ unnecessary include.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: add comment on maximum row size.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: clarify comments.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: add assertions.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree::const_iterator: fix assertion in
+ operator++().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: indentation fixes.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: simplify some
+ code.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: always increase the tree size in
+ insert_precise() instead of rebalance().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: improve some
+ comments.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: simplify code in rebuild_bigger_tree().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: simplify code in increase_keys_after().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: optimize erase_element_and_shift_left().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: simplify code in the insert() methods.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: fix bug in constructor.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: fix comment.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: optimize constructor.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: move some code.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree::iterator,
+ CO_Tree::const_iterator: add postfix ++ and postfix -- operators.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix comment.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: inline
+ insert_in_empty_tree(), un-inline least_common_ancestor().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: improve comments.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree, CO_Tree::const_iterator: change the
+ value_type definition.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: now go_down_searching_key() is a method of
+ CO_Tree::tree_iterator instead of CO_Tree.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: rename
+ redistribute_elements_in_subtree_helper() into
+ redistribute_elements_in_subtree().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve comment.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: update documentation with the new
+ constants' names.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: merge the
+ redistribute_elements_in_subtree() method into rebalance().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: simplify code in rebalance().
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the OK() method
+ private.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ the OK() method.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.inlines.hh: Sparse_Row, Sparse_Row_Reference: don't
+ call Unlimited_Sparse_Row::OK() in the OK() methods.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Matrix.cc: Sparse_Matrix: don't call
+ Unlimited_Sparse_Row::OK() in the OK() method.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: don't use float/double for densities, use exact
+ calculations instead.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: sort method
+ implementations in the same order as method declarations.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: fix typo in comment.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: remove
+ unnecessary includes.
+
+2010-08-12 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: add check on reserved_size in
+ structure_OK().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree::iterator: fix constructor
+ documentation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree::iterator, CO_Tree::const_iterator:
+ make Member_Access_Helper and Const_Member_Access_Helper private,
+ add documentation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: rewrite most of the documentation,
+ add documentation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree::const_iterator: make
+ Const_Member_Access_Helper private, add documentation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: add compile-time check for height_t.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve code readability and adjust stack
+ size in redistribute_elements_in_subtree_helper().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve readability of move_data_from().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve code readability and adjust stack
+ size, in the constructor from an std::vector.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: optimize increase_keys_after().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: fix bug in increase_keys_after().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: use
+ the new contract of end() to avoid calculations of end() at each
+ write operation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: clarify
+ code in reset() and reset_after().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ PPL_DIRTY_TEMP_COEFFICIENT when possible.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use the
+ same signature and contract used in CO_Tree for before_begin() and
+ end(). Add documentation for begin() methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add
+ before_begin() methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ bisect() instead of bisect_in() when needed.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.cc: Unlimited_Sparse_Row: fix
+ indentation.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: improve readability of bisect_near().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: improve documentation of bisect()
+ methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: remove always-true condition in
+ erase().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: improve readability of erase().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: fix external_memory_in_bytes().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: weaken the
+ requirements for bisect_near() methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add bisect()
+ methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: optimize
+ follow_{left,right}_childs_with_value() methods.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: remove get_left_child_value() and
+ get_right_child_value().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+ get_right_child_value().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+ get_right_child_value() in erase().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+ get_right_child_value() without a real need, in rebalance().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: remove assertion from
+ count_used_in_subtree(), weakening its precondition.
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add swap()
+ method to iterator and const_iterator, specialize std::swap().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: add assertion in move_data_from().
+
+2010-08-11 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: cache before_begin() and end() iterators, so users of
+ CO_Tree don't need to recalculate them at each write operation
+ anymore.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: move iterator's and const_iterator's
+ declarations inside the CO_Tree class declaration.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use Coefficient_zero() in erase(),
+ instead of declaring an equivalent static variable.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use the
+ value returned by CO_Tree::erase() when needed.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: add least_common_ancestor() method. Return an iterator to
+ the next element in erase().
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't check the value
+ returned by erase().
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: add debugging checks to iterator and const_iterator.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make
+ count_used_in_subtree() take an iterator parameter by value instead
+ of by reference.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make
+ redistribute_elements_in_subtree() take an iterator parameter by
+ value instead of by reference.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make rebalance()
+ return an iterator instead of taking an iterator parameter by
+ reference.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: make go_down_searching_key() return an iterator instead of
+ taking an iterator parameter by reference.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: make insert_precise return an iterator instead of taking an
+ iterator parameter by reference.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: replace has_parent() method with is_root().
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: keep a CO_Tree& instead of a CO_Tree* const.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: define height_t as unsigned.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: depth() now returns a height_t instead of an
+ unsigned.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: avoid compiler warning in release mode.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+ the get2() method.
+
+2010-08-10 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.inlines.hh: Sparse_Row: add include. It is needed
+ for release builds.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: un-inline
+ bisect_in() and bisect_near() methods.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: bisect_in() and
+ bisect_near() methods now take an index as argument instead of a
+ functor.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: un-inline some
+ methods.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: reorder
+ some method declarations and definitions.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ the wrappers for CO_Tree's iterator and const_iterator. They do not
+ add anything useful anymore.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: add STL-compliant typedefs in
+ iterator and const_iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: iterators no
+ longer allow changing an element's key.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: move
+ implementation of delete_element_and_shift() and
+ add_zeroes_and_shift() into CO_Tree.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree::const_iterator: remove the
+ get_tree() declaration.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: rewrite the
+ implementation of const_iterator and iterator to improve
+ performance.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: remove some calls to iterators'
+ is_before_begin() and is_at_end() methods.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: don't
+ use is_before_begin() and is_at_end() methods on CO_Tree iterators.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ get_tree() methods from iterator and const_iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: iterator needs not be friend of
+ tree_iterator anymore.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: don't access
+ iterators' fields directly.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree::tree_iterator: add a CO_Tree& argument in the constructor
+ from an iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: iterator and const_iterator need not
+ be friends of CO_Tree anymore.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: don't access iterator's and
+ const_iterator's fields directly.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ construct_before_begin() and construct_end() methods.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: don't use
+ construct_before_begin() and construct_end().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ two-argument constructors to const_iterator and iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: turn always-true if conditions in
+ iterator's and const_iterator's operator++() and operator--() into
+ an assertion.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.inlines.hh, tests/CO_Tree/cotree1.cc:
+ CO_Tree: rename iterator's and const_iterator's get_next_value()
+ into operator++() and get_previuos_value() into operator--().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ operator++() and operator--() from iterator and const_iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use CO_Tree::begin() instead of
+ CO_Tree::before_begin(), in OK() and structure_OK().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: avoid a (possibly dangerous)
+ conversion in the static initializer of unused_index.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::begin() instead of CO_Tree::before_begin().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't use
+ CO_Tree::before_begin().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: check the size in OK(), not in
+ structure_OK().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't use
+ CO_Tree::iterator::operator++().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: CO_Tree, Unlimited_Sparse_Row:
+ split the iterator and const_iterator main constructor. CO_Tree:
+ make the iterator and const_iterator constructor make the new
+ iterator point to the first value, and add the begin() methods to
+ CO_Tree.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: clarify signature of
+ redistribute_elements_in_subtree_helper() and
+ compact_elements_in_the_rightmost_end(). Remove obsolete assertions
+ from redistribute_elements_in_subtree().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove rendundant
+ arguments from redistribute_elements_in_subtree_helper(), remove
+ unreachable code in redistribute_elements_in_subtree().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: optimize
+ compact_elements_in_the_rightmost_end().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: use a dimension_type
+ instead of an iterator in redistribute_elements_in_subtree() and
+ compact_elements_in_the_rightmost_end().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: use a dimension_type
+ instead of an iterator in redistribute_elements_in_subtree_helper().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ depth() method from iterator and const_iterator.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: add assertions in
+ erase(iterator).
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: add assertion and comment in
+ go_down_searching_key().
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ unused insert(tree_iterator, dimension_type, const data_type&)
+ method.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: update documentation on requirements
+ of insert(iterator, dimension_type).
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: optimize insert(iterator,
+ dimension_type, const data_type&) and insert(iterator,
+ dimension_type) methods.
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: weaken the
+ preconditions to insert(iterator, dimension_type, const data_type&).
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: improve implementation of
+ insert(dimension_type, const data_type&).
+
+2010-08-09 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: avoid magic number in insert().
+
+2010-08-08 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use an iterator in
+ move_data_from().
+
+2010-08-08 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: simplify code in the init() method.
+
+2010-08-08 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: use new/delete
+ instead of malloc/free.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ tree-related methods from iterator and const_iterator.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree:: don't use follow_right_childs() in
+ redistribute_elements_in_subtree().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't visit the tree
+ using an iterator.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: many
+ changes, preparing removal of tree-related methods from iterator and
+ const_iterator.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+ iterator in insert(dimension_type, const data_type&).
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of a
+ const_iterator in structure_OK().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree:
+ dump_subtree() now takes a tree_iterator as argument, instead of an
+ iterator& or a const_iterator&.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: don't use
+ follow_right_childs_with_value() in
+ compact_elements_in_the_rightmost_end().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ go_down_searching_key() overloads for iterator and const_iterator
+ arguments.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+ iterator in insert_precise().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ lower_bound() methods.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ find() instead of go_down_searching_key() in get().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ bisect_in() instead of go_down_searching_key() in assign().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ bisect_in() instead of go_down_searching_key() in swap().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: rename
+ the helper class used as a functor and move it to the beginning of
+ the file.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ find2() and get2() methods.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+ Sparse_Row_Reference: remove get2() methods.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc: PIP_Tree: use two calls to get() instead of
+ get2().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.cc: MIP_Problem: use two calls to get() instead of
+ get2().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::bisect_near() in lower_bound() methods with a hint
+ iterator.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::bisect_near() in find() methods with a hint iterator.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ bisect_near() methods.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::bisect_in() in lower_bound().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ always-false conditions from find().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: fix bisect_in().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.inlines.hh: CO_Tree: remove obsolete comment.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::bisect_in() in the const version of find().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: fix the
+ non-const version of find().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: make the
+ private bisect_in() a const method, fix a bug in it and add a public
+ bisect_in() for const iterators.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: inline
+ bisect_in(), to allow optimizations.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+ CO_Tree::bisect_in() in find().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: add bisect_in() methods.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove the
+ const_iterator version of count_used_in_subtree().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: use tree_iterator instead of iterator when needed.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: split
+ insert_in_empty_tree() out of insert_precise().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+ iterator in move_data_from().
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+ iterator in the constructor from a vector.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+ tree_iterator inner class.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: split integer base-2 log out of init(), adding the
+ integer_log2() method.
+
+2010-08-07 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: remove unneeded include.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Sparse_Matrix.cc, src/Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Indentation and whitespace
+ fixes.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: remove duplicated
+ forward-declarations of iterator and const_iterator.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+ Unlimited_Sparse_Row: use names like i and j for index arguments,
+ rather that c, c1 and c2.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.cc, src/Dense_Row.defs.hh,
+ src/Dense_Row.inlines.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Matrix.inlines.hh, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+ Sparse_Matrix, Unlimited_Sparse_Row: Remove the useless const
+ qualifier from dimension_type arguments passsed by value.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/MIP_Problem.cc, src/PIP_Tree.cc, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row,
+ Sparse_Row, Dense_Row: reorder arguments in find(), lower_bound(),
+ find_create() as done in the STL.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: reorder arguments to
+ insert(), using the same order as in std::map<T>::insert().
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh, tests/CO_Tree/cotree1.cc:
+ CO_Tree: rename inorder_iterator and inorder_const_iterator into
+ iterator and const_iterator.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+ src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+ Unlimited_Sparse_Row, Sparse_Row, Sparse_Matrix: make some
+ constructors explicit.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh: CO_Tree: remove level_data struct.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+ unordered iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: remove
+ unordered iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row:
+ remove unordered iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+ unordered iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/MIP_Problem.defs.hh: MIP_Problem: don't use unordered
+ iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: PIP_Problem: don't
+ use unordered iterators.
+
+2010-08-06 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: PIP_Tree: don't use
+ unordered iterators.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: simplify some method
+ signatures, exploiting the fact that now iterators are always
+ lightweight.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh:
+ CO_Tree: remove the VeB and BFS layouts.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: merge
+ {find,lower_bound}_helper methods into the corresponding find and
+ lower_bound methods.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+ unused find_create_helper() methods.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/MIP_Problem.cc, src/PIP_Problem.cc, src/PIP_Tree.cc,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.templates.hh: Dense_Row, Sparse_Row,
+ Unlimited_Sparse_Row: drop
+ {find,find_create,lower_bound}_{assign,hint_assign} methods.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+ src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+ src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+ Unlimited_Sparse_Row: remove some method overloads that are no
+ longer needed.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Dense_Row.defs.hh, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+ src/Unlimited_Sparse_Row.inlines.hh: Remove dangerous_iterator: it
+ was needed only for compatibility with some old sparse
+ implementations.
+
+2010-08-05 Marco Poletti <poletti.marco at gmail.com>
+
+ * src/Makefile.am, src/Sparse_Row.defs.hh,
+ src/Sparse_Row.inlines.hh,
+ src/{Unlimited_Sparse_Row_Over_CO_Tree.cc =>
+ Unlimited_Sparse_Row.cc}, src/Unlimited_Sparse_Row.defs.hh,
+ src/{Unlimited_Sparse_Row_Over_CO_Tree.inlines.hh =>
+ Unlimited_Sparse_Row.inlines.hh},
+ src/{Unlimited_Sparse_Row_Over_CO_Tree.templates.hh =>
+ Unlimited_Sparse_Row.templates.hh},
+ src/Unlimited_Sparse_Row.types.hh,
+ src/Unlimited_Sparse_Row_Custom_Slist_Backend.cc,
+ src/Unlimited_Sparse_Row_Custom_Slist_Backend.defs.hh,
+ src/Unlimited_Sparse_Row_Custom_Slist_Backend.inlines.hh,
+ src/Unlimited_Sparse_Row_Custom_Slist_Backend.types.hh,
+ src/Unlimited_Sparse_Row_Over_CO_Tree.defs.hh,
+ src/Unlimited_Sparse_Row_Over_CO_Tree.types.hh,
+ src/Unlimited_Sparse_Row_Over_Linear_Sequence.cc,
+ src/Unlimited_Sparse_Row_Over_Linear_Sequence.defs.hh,
+ src/Unlimited_Sparse_Row_Over_Linear_Sequence.inlines.hh,
+ src/Unlimited_Sparse_Row_Over_Linear_Sequence.templates.hh,
+ src/Unlimited_Sparse_Row_Over_Linear_Sequence.types.hh,
+ src/Unlimited_Sparse_Row_Std_List_Backend.cc,
+ src/Unlimited_Sparse_Row_Std_List_Backend.defs.hh,
+ src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh,
+ src/Unlimited_Sparse_Row_Std_List_Backend.types.hh,
+ src/Unlimited_Sparse_Row_Std_Vector_Backend.cc,
+ src/Unlimited_Sparse_Row_Std_Vector_Backend.defs.hh,
+ src/Unlimited_Sparse_Row_Std_Vector_Backend.inlines.hh,
+ src/Unlimited_Sparse_Row_Std_Vector_Backend.types.hh: Drop sparse
+ implementations based on std::list, on std::vector and on the
+ custom-implemented single-linked list.
+
+2010-08-05 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.templates.hh: Invalid case option in map_space_dimensions
+ removed.
+
+2010-08-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.templates.hh: Small style improvement in the use of
+ iterators.
+
+2010-08-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4: Added a space after :: to avoid Doxygen
+ (incorrect) autolink generation.
+
+2010-08-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java:
+ Corrected mismatch in parameter name (for documentation purposes
+ only).
+
+2010-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit b68f8ff2bde57db64ec4439d8a2592da351742e4 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Aug 5 09:08:44 2010 +0200
+
+2010-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-08-03 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * CREDITS: Updated and typo fixed.
+
+2010-08-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+ src/Linear_Form.templates.hh: Do not use log2 to compute the base 2
+ logarithm of an integer.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh: Added missing conversions.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, README, Watchdog/Makefile.am, Watchdog/README:
+ Distribute all READMEs and ChangeLogs.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Announce the new wrapping operator used to approximate
+ machine arithmetic.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, NEWS, TODO, Watchdog/NEWS: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, Watchdog/README: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, doc/libppl.3, doc/libppl_c.3,
+ doc/ppl-config.1: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Missing sections added.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/config.guess, config.guess: Updated.
+
+2010-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh, src/Grid_public.cc: FIXMEs resolved.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/constraintsproduct1.cc: Commented
+ out code concerning affine spaces.
+
+2010-08-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc: Avoid variable length arrays: use a
+ std::vector instead.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc: Commented out code concerning affine spaces.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh: Commented out code concerning affine spaces.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, src/Affine_Space.defs.hh, src/Makefile.am: Set aside the
+ domain of affine spaces, for the time being.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh: Implemented the constructors from
+ generator systems.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh, src/Grid_public.cc: Inclusions fixed.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Useless assignment removed.
+
+2010-08-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.defs.hh: Comment fixed.
+
+2010-08-01 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval_Restriction.defs.hh: Removed spurious semicolon.
+
+2010-07-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh, src/Interval.templates.hh: Moved two methods
+ in the right place.
+
+2010-07-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh: Unwanted assertions removed.
+
+2010-07-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh: Fixed a bug in
+
+ DB_Row_Impl_Handler<T>::Impl::expand_within_capacity(dimension_type).This affected only compilers not supporting flexible arrays.
+
+2010-07-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh: Fixed a bug in
+ DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+ U&). This prevented compilation with compilers not supporting
+ flexible arrays.
+
+2010-07-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh: Added missing inclusion.
+
+2010-07-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-06-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Improved
+ specification and implementation of erase_artificials().
+
+2010-06-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Use PPL_ASSERT() instead of plain assert().
+
+2010-06-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Improved MIP_Problem
+ preprocessing phase and solved an efficiency bug. Rewritten private methods parse_constraints(),
+ merge_split_variable() and process_pending_constraints():
+ specification clarified and implementation improved to avoid
+ allocating more tableau rows and columns than needed. This results
+ in an overall speedup, in particular when solving problems
+ incrementally.
+
+2010-06-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/m4/libtool.m4,
+ Watchdog/m4/ltoptions.m4, Watchdog/m4/ltversion.m4,
+ Watchdog/m4/lt~obsolete.m4, config.guess, config.sub, install-sh,
+ ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4,
+ m4/lt~obsolete.m4: Updated from Libtool 2.2.10.
+
+2010-06-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh: Added missing argument names.
+
+2010-06-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac, doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/Box.defs.hh, src/Box.templates.hh,
+ src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Cast_Floating_Point_Expression.types.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constant_Floating_Point_Expression.types.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Difference_Floating_Point_Expression.types.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.types.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.types.hh, src/Linear_Form.cc,
+ src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+ src/Linear_Form.templates.hh, src/Linear_Form.types.hh,
+ src/Makefile.am,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.types.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.types.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.types.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.types.hh,
+ tests/Floating_Point_Expression/.gitignore,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape1.cc,
+ tests/Floating_Point_Expression/bdshape2.cc,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/linearform1.cc,
+ tests/Floating_Point_Expression/octagonalshape1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc,
+ tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc,
+ tests/Floating_Point_Expression/run_tests, tests/Makefile.am,
+ tests/ppl_test.hh: Put aside changes related to Floating_Point and
+ Linear_Form classes. These will not enter release 0.11.
+
+2010-05-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Moved Katy Dobson to the list of past contributors.
+
+2010-05-07 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/compiler.hh: Fixed comment.
+
+2010-05-07 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.inlines.hh: Removed current implementation of
+ PPL_{LT,GT}_SILENT: the cure was worse than the disease.
+
+2010-05-07 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh: Avoid
+ temporary in smod_2exp.
+
+2010-05-07 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/compiler.hh: Better/canonical way to avoid gcc warning.
+
+2010-05-04 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh: Revert "Optimized
+ smod_2exp_signed_int." This reverts commit 21d120a07448821720acd415213f9b08a9a14338.
+
+2010-05-04 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh: Optimized smod_2exp_signed_int.
+
+2010-04-17 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh: Refuse to compile on (very obsolete)
+ architectures that are not using two's complement.
+
+2010-04-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Partial_Function.cc, src/Partial_Function.defs.hh,
+ src/Partial_Function.inlines.hh, src/Partial_Function.types.hh: Put
+ under git control.
+
+2010-04-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl, src/Affine_Space.defs.hh,
+ src/Any_Pointset.defs.hh, src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Grid.defs.hh, src/Makefile.am, src/Octagonal_Shape.defs.hh,
+ src/Polyhedron.defs.hh, tests/Makefile.am,
+ tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh, tests/Partial_Function.types.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh: Added class Partial_Function
+ to the PPL library. Java, Prolog and OCaml interfaces now use an
+ object of this Partial_Function class when mapping the space
+ dimensions of teh vector space. Some of the consistency checks that
+ were performed by other variants of Partial_Function are now only
+ done when in debugging mode.
+
+2010-04-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc: Fixed expected results for
+ tests/Octagonal_Shape/writeoctagon1.cc
+
+2010-04-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Test_Partial_Function.java,
+ interfaces/Java/tests/ppl_java_tests_common: Use a C++ object to
+ encode a Partial_Function in the Java interface. Current
+ implementation is based on a copy of the Partial_Function type used
+ in C++ tests: we should consider whether or not it would be
+ appropriate to have this Partial_Function type as a first class PPL
+ object.
+
+2010-04-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-04-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/tests/Test_Partial_Function.java: Modified signature
+ of method maps() in Java Partial_Function interface. Modified test
+ implementation in tests/Test_Partial_Function.java accordingly (note
+ though that TreeMap still uses Long objects).
+
+2010-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Fixed
+ the printing of equality constraints.
+
+2010-04-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-04-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Added $(noinst_HEADERS) to BUILT_SOURCES so as to
+ build ppl.hh early when !BUILD_CXX_INTERFACE. (Thanks to Ralf
+ Wildenhues who identified the problem and to Sebastian Pop who
+ reported a parallel build failure due to it.)
+
+2010-04-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_sysindep_dox: Properly document
+ ppl_Coefficient_bits/1.
+
+2010-04-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P: Corrected a few typos.
+
+2010-04-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4: Corrected
+ typo causing a bug in the XSB Prolog interface.
+
+2010-04-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh:
+ Add method wrap_assign() to Pointset_Powerset.
+
+2010-04-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_public.cc: A minor stylistic improvement and a typo
+ corrected.
+
+2010-04-16 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/intervals.defs.hh: Silenced warnings.
+
+2010-04-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a: A Prolog PIP_Problem
+ test overflows positively for checked_int8
+
+2010-04-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Added tests in the Prolog interface for
+ ppl_all_affine_quasi_ranking_functions_MS_*
+
+2010-04-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P: Added PIP_Problem predicates
+ to list of predicates tested in pl_check.pl.
+
+2010-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Updated.
+
+2010-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit e17e80c8940b435d646eaac97bba591ee744ef34 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Apr 15 17:39:08 2010 +0200
+
+2010-04-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.defs.hh, src/termination.templates.hh,
+ tests/Polyhedron/termination2.cc: Minor improvements to
+ documentation. Deal with the special cse of an empty input pointset
+ for methods all_affine_*. Adapted and improved test10 in
+ termination2.cc.
+
+2010-04-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/test1.ml: Overflow is expected for
+ PIP_Problem tests with 8 bits coefficients.
+
+2010-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am: Increased GLOBALSZ for the
+ execution of the automatically generated test.
+
+2010-04-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/tests/PIP_Problem_test1.java,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Add
+ ppl_Coefficient_bits to Prolog and OCaml interfaces. Renamed
+ corresponding static method in Java interface.
+
+2010-04-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * instchk.hh, interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/ppl_interface_generator_common_dat.m4: Allow for the
+ Shape_Preserving_Product to be generated in the interfaces.
+
+2010-04-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Fixed a bug in the
+ all_affine_ranking_functions*_Grid* tests in Prolog interface.
+
+2010-04-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/termination2.cc: Some tests now succeed even on
+ initially empty polyhedra.
+
+2010-04-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Corrected typo in shift_unprimed_variables().
+
+2010-04-13 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/termination1.cc, tests/Polyhedron/termination2.cc:
+ Added further tests for the termination methods.
+
+2010-04-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Avoid assertion crash on universe polyhedra.
+
+2010-04-13 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Fixed some bugs in the tests for
+ drop_some_non_integer_points() and added a test for
+ termination_test_*.
+
+2010-04-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4, src/termination.cc, tests/Polyhedron/termination1.cc:
+ Added tests to the OCaml interface for new functions wrap_assign(),
+ drop_some_non_integer_points() and termination_test_*. Bug in
+ termination_test_*. fixed and test showing these added to
+ termination1.cc
+
+2010-04-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/PIP_Problem_test1.java: Added static method
+ Coefficient.ppl_bits() to Java interface. test04 in
+ PIP_Problem_test1.java overflows when using 8-bit checked integers.
+ Fixed method PIP_TREE_Node.toString().
+
+2010-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc:
+ test01() and test03() always succeed.
+
+2010-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Added an entry for the new functionality concerning the
+ synthesis of linear (quasi-) ranking functions.
+
+2010-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Worked around a Doxygen bug.
+
+2010-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.defs.hh: Cite BMPZ10.
+
+2010-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Bibliography updated.
+
+2010-04-10 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc: Added
+ drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity = ANY_COMPLEXITY)
+
+2010-04-10 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc: Added
+ drop_some_non_integer_points() to the product domain
+
+2010-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh: Trailing whitespace removed.
+
+2010-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Variable hiding avoided.
+
+2010-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Added a point about the new drop_some_non_integer_points()
+ methods.
+
+2010-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Tentative release date is May 8, 2010. Reorganized and
+ improved some news items.
+
+2010-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Man pages updated.
+
+2010-04-09 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Cast_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Fixed Documentation.
+
+2010-04-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.Solaris => README.solaris: Renamed.
+
+2010-04-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Pushed one item to PPL 0.12. We will not have 0.10.3
+ release.
+
+2010-04-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : Merge remote branch 'origin/master' Conflicts: TODO
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Added
+ ppl_PIP_Problem_has_big_parameter_dimension that returns true if and
+ only if the pip problem has a big parameter set.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox: Added documentation for
+ Prolog PPL_Problem
+
+2010-04-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO: Dealt with one of the items.
+
+2010-04-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh: Better documentation for the two
+ Row_Impl::Impl::operator delete(...).
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/OCaml_interface.dox: Added documentation in the
+ OCaml interface for the PIP_Problem.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc:
+ ppl_PIP_Problem_get_big_parameter_dimension() now throws an
+ exception if the big parameter has not been set.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * TODO: Removed a completed item: - Handle std::logic_error (now thrown in case watchdogs are not available) in all the interfaces.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Simplify function names in
+ PIP_Tree_Node, matching corresponding predicate names in Prolog
+ interface.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Simplified Prolog interface for
+ PIP_Tree_Node.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Removed
+ artificial_parameter_sequence type. Added to the PIP_Problem tests.
+
+2010-04-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Typo fixed.
+
+2010-04-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli: Restructured the OCaml
+ interface to PIP_Tree_Node C++ classes. Also corrected several bugs
+ related to object finalization.
+
+2010-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Added a couple of entries.
+
+2010-04-06 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl:
+ ...get_big_parameter_dimension/2 changed to
+ ...has_big_parameter_dimension/2 and now this fails if the "big
+ dimension" == not_a_dimension().
+
+2010-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README.Solaris: Solaris users should install GNU sed.
+
+2010-04-06 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Check if the Prolog system
+ supports unbounded integers before testing the big_parameter for
+ PIP_Problem.
+
+2010-04-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Added calls to WEIGHT macros.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Corrected PIP_Problem test04 to
+ properly call predicate ppl_*_artificials(). Applied a few
+ renamings to the implementation of the predicate.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Fixed Java interface
+ for PIP_Decision_Node::child_node(branch). New interface has a
+ (unboxed) boolean parameter.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/dropsomenonintegerpoints1.cc: Added known results
+ for a couple of tests.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc: Fixed bugs in
+ Octagonal_Shape:drop_some_on_integer_points().
+
+2010-04-05 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh: Uniformed code and get rid of a
+ warning.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Avoid useless boxing of builtins when
+ interfacing the wrap_assign(). Got rid of buggy j_boolean_to_bool()
+ helper. Helper bool_to_j_boolean() renamed to
+ bool_to_j_boolean_class() for clarity, as it builds a boxed Java
+ Boolean value.
+
+2010-04-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Corrected a couple of typos.
+
+2010-04-05 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Completed a draft implementation of
+ PIP_Problem OCaml interface. A few tests added.
+
+2010-04-02 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli: A start on the PIP_Problem
+ interface for OCaml.
+
+2010-04-02 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Completed a draft of the
+ PIP_Problem interface for Prolog. Added tests.
+
+2010-04-02 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java: Type fixed.
+
+2010-04-02 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Restored previously
+ removed method PIP_Problem_constraints().
+
+2010-04-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/dropsomenonintegerpoints1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/dropsomenonintegerpoints1.cc: Tests added.
+ Some tests marked as expected to fail indicating bug(s) in the code.
+
+2010-04-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Varios bug fixes and
+ small improvements. A clone of test02 in pipproblem1.cc added to
+ the Java tests. FIXME added to jni/ppl_java_common.cc
+
+2010-04-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4: Added "quasi ranking functions" generation procedures to OCaml
+ interface.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Interval.defs.hh: Drafted
+ drop_some_non_integer_points() for Interval and Box.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh:
+ Drafted drop_some_non_integer_points() for weakly relational shapes.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Fixed problems in the
+ Artificial_Parameter(_Sequence) interface.
+
+2010-03-31 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce_Iterator.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Several improvements
+ and bug fixes. Removed unwanted iterator class for
+ Artificial_Parameter_Sequence.
+
+2010-03-31 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Several improvements
+ and bug fixes. More tests for the Java inmterface added. Commented
+ lines in test indicate where code needs fixing.
+
+2010-03-31 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * NEWS, TODO: Updated with news of the new reduction operator for
+ partially reduced products and the new frequency operator. Removed
+ a TODO item concerning the interfaces and termination methods.
+
+2010-03-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Completed removal of
+ Constraint_System_Iterator.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Fixed
+ assign_all_inequalities_approximation for shapes.
+
+2010-03-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4: Interfaced
+ quasi_ranking procedures to C.
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+ java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/tests/PIP_Problem_test1.java: Fixed problem with
+ PIP_Problem constructor from a sequence of constraints. Added code
+ for testing this. As there is no need for the class
+ Constraint_System_Iterator, Constraint_System_Iterator.java is
+ removed.
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+ java, interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/PIP_Problem_test1.java: Some tests for some of
+ the new PIP_Problem methods added. Various bugs fixed.
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+ java: Completed draft Java interface for PIP_Problem (untested).
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4: Added Java interface tests for termination_test_MS,
+ termination_test_PR, termination_test_MS_2 and termination_test_PR_2
+
+2010-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/parma_polyhedra_library/Makefile.am: Enable Java
+ interface for termination procedures (and corrected bugs).
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc: Whitespace bug fixed.
+
+2010-03-30 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce.java,
+ interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+ ce_Iterator.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+ java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Name.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+ er_Value.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+ interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java: Almost
+ complete (but untested) Java interface to the PIP_Problem
+
+2010-03-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4: Corrected several errors in Java interface for termination test
+ procedures.
+
+2010-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-03-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4: Added to Prolog interface the predicates for quasi-ranking
+ functions.
+
+2010-03-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh: Added procedures computing all the
+ affine quasi-ranking functions. Corrected a few glitches in the
+ documentation and in exception messages.
+
+2010-03-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Factored away
+ common code in the MS-based termination procedures. Improved
+ PR-based termination procedures relying on MIP_Problem by mapping
+ optimizations to satisfiability testing.
+
+2010-03-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Grid_public.cc, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh: Avoid a few
+ annoying warnings for unused parameters. Indentation fixed. Avoid
+ using "return;" at the end of function body.
+
+2010-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Comma changed into full-stop.
+
+2010-03-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Other minor
+ improvements in assign_all_inequalities_approximation().
+
+2010-03-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Apply more memory allocation improvements.
+
+2010-03-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: A few optimizations applied to
+ fill_constraint_systems_MS().
+
+2010-03-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4: Rename Termination.cc in ppl_java_Termination.cc in Java
+ interface. Add the generated file to CLEANFILES.
+
+2010-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Fixed bugs leading to
+ warning messages.
+
+2010-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Avoid nonpositivity constraints in the
+ enhanced PR methods by changing sign. This is going to speed up the
+ MIP_Problem based methods.
+
+2010-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.templates.hh: Use original PR method if a single
+ pointset is provided. Prefer the enhanced method if two pointsets
+ (before/after) are provided.
+
+2010-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc: Avoid the creation of many temporary linear
+ expressions.
+
+2010-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/Linear_Expression.defs.hh: Added
+ helper function sub_mul_assign() to Linear_Expression interface.
+
+2010-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Grid/Makefile.am: Added missing sources line.
+
+2010-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl:
+ Expected test result corrected.
+
+2010-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid_public.cc, tests/Grid/wrap1.cc: Bug in
+ Grid::wrap_assign() fixed. Test that showed the bug added to
+ wrap1.cc.
+
+2010-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Fixed the all_affine_ranking_functions_PR*()
+ functions to correctly deal with the case where the system is
+ unsatisfiable.
+
+2010-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh:
+ Implemented methods
+ Pointset_Powerset::drop_some_non_integer_points().
+
+2010-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/dropsomenonintegerpoints1.cc,
+ tests/Polyhedron/dropsomenonintegerpoints2.cc: Test
+ Polyhedron::drop_some_non_integer_points().
+
+2010-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Fixed a couple of bugs in
+ drop_some_non_integer_points().
+
+2010-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Fixed a bug in
+ drop_some_non_integer_points().
+
+2010-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Enable *drop_some_non_integer_points* for Polyhedron; disable it for
+ Pointset_Powerset.
+
+2010-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Indentation corrected.
+
+2010-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron_nonpublic.cc: Drafted the implementation of methods
+ drop_some_non_integer_points().
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Enable the interfaces procedures for
+ Grid::drop_some_non_integer_points().
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid_public.cc, tests/Grid/Makefile.am,
+ tests/Grid/dropnonintegerpoints1.cc: Added a draft implementation
+ for Grid::drop_some_non_integer_points().
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am: Added the
+ generated Termination files to make clean.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4, src/Box.templates.hh, tests/BD_Shape/frequency1.cc,
+ tests/Box/frequency1.cc, tests/Octagonal_Shape/frequency1.cc: In
+ frequency(), deal properly with the case when a box is empty. Added
+ tests for this case. Re-enable frequency test in the Prolog
+ interface.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Test disabled while problem is investigated.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Added interface code for drop_some_non-integer_points() methods.
+ Note that these are only enabled for BD_Shapes, Octagonal_Shapes and
+ Boxes.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Added C interface for frequency(). Moved generator to language
+ independent file.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4: Added Java interface method for frequency().
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4: Added Ocaml interface function for frequency().
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl: Added
+ interface predicate for frequency(). Generated test added.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4: Typo
+ fixed.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/xsb_pl_check.P: Added stubs for 7 and 8
+ argument predicates. Missing predicate names added for pl_check
+ test.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4: Added
+ stubs for 7 and 8 argument predicates.
+
+2010-03-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Move the wrap_assign generator to the language independent file.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4: Added
+ documentation for prolog wrap_assign/8 predicate.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/OCaml_interface.dox: Added documentation for the
+ OCaml wrap_assign function.
+
+2010-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox, doc/ppl.sty: The `|' character cannot be used
+ to produce proper paired delimiters.
+
+2010-03-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Added
+ implementations for the original PR termination tests. These are
+ activated when the preprocessor flag USE_ORIGINAL_PR_METHOD is set.
+ The flag is now active.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox: Improved documentation for frequency.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4: Type
+ error fixed.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Added interface code for wrap_assign().
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox: Typo fixed.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox: Wrong latex fixed.
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: Added two new tests.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox: Several errors in the documentation for
+ frequency fixed.
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Fixed ill-positioned \f$.
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4, interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli: Added interface code for
+ wrap_assign().
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: Fixed the expected result for
+ test04().
+
+2010-03-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox, src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Grid.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/Partially_Reduced_Product.defs.hh, src/Polyhedron.defs.hh: Added
+ and improved documentation for the frequency operator.
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh: Debugging output switched off.
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed the
+ handling of Termination.java.
+
+2010-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit ef1ccd4fea5bed38e73c23cd9a6e5879e7f281b3 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Mon Mar 22 13:54:43 2010
+ +0100
+
+2010-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions1.cc: All test functions should be
+ declared in the anonymous namespace.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Revised exceptions that
+ can be thrown.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Added missing C++ exceptions.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Revised to allow for for
+ expected logic_error.
+
+2010-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frequency1.cc: Let test13 compile.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am: Code,
+ unintensionally added by previous commit, removed..
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Finished adding code for the java interface
+ to the termination methods.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+ .m4: Added OCaml interface code for the 6 new termination methods.
+
+2010-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Cut exponential execution paths by calls to
+ maybe_abandon().
+
+2010-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions1.cc: All test functions should be
+ declared in the anonymous namespace.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Revised exceptions that
+ can be thrown.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Added missing C++ exceptions.
+
+2010-03-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Revised to allow for for
+ expected logic_error.
+
+2010-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frequency1.cc: Let test13 compile.
+
+2010-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit b43d29400ddc9823f5d08d4148adb804dcc8e321 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sun Mar 21 07:32:40 2010 +0400
+
+2010-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 0f40cc8d92d033ab5c78cdd2d4661f395603e8b5 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Sat Mar 20 22:00:34 2010 +0000
+
+2010-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog_common.defs.hh,
+ tests/Grid/frequency1.cc, tests/Octagonal_Shape/frequency1.cc: Added
+ missing code for logic_error exception.
+
+2010-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc: Simplified OCaml code for
+ all_zero() and all_homogeneous_terms_are_zero()
+
+2010-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli: Added OCaml interface for
+ Linear_Expression::is_zero() and all_homogeneous_terms_are_zero().
+
+2010-03-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Added std::logic_error
+ to the list of exceptions caught.
+
+2010-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java:
+ Added Java interface for Linear_Expression::is_zero() and
+ Linear_Expression::all_homogeneous_terms_are_zero().
+
+2010-03-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ ,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Added some of the Java interface code needed
+ for the termination methods.
+
+2010-03-20 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a test generating a
+ solution node with two context constraints.
+
+2010-03-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-03-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 42a77adddb8e0a7223d6dd17b7b0916660411800 Merge: 367f75c
+ b831a0b Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Sat
+ Mar 20 08:27:47 2010 +0400
+
+2010-03-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Fixed a typo in the documentation.
+
+2010-03-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Improved the documentation with examples
+ for uses of the big parameter.
+
+2010-03-19 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a couple of tests using
+ the big parameter.
+
+2010-03-19 Marco Poletti <poletti.marco at gmail.com>
+
+ * STANDARDS: Added formatting conventions to the STANDARDS file.
+
+2010-03-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * TODO,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Updated the first item
+ for TODO and removed code for linear expression is_zero() and
+ all_homogeneous_terms_are_zero() from the Prolog interface.
+
+2010-03-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh: As in previous commit - ensure
+ initialization of variables.
+
+2010-03-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Octagonal_Shape.templates.hh: Missing variable initialization
+ added.
+
+2010-03-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Polyhedron.defs.hh: Improved documentation
+ for frequency().
+
+2010-03-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frequency1.cc: Corrected/improved a few tests in
+ BD_Shape/frequency1.cc.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/Makefile.am: Mention header file
+ partially_reduced_product_test.hh.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4:
+ Don't take the address of a temporary object.
+
+2010-03-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/ppl_interface_generator_common_dat.m4:
+ All_affine_ranking_functions_PR* functions, for the C and Prolog
+ interfaces now take an NNC polyhedron as the last argument and not a
+ C one. Interface Linear_Expression::is_zero() and
+ Linear_Expression::all_homogeneous_terms_are_zero() added to the C
+ and Prolog interfaces.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/Makefile.am: Fixed
+ tests/Partially_Reduced_Product/Makefile.am.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Threshold_Watcher.defs.hh: Avoid a broken reference
+ to another manual that is built later.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/Makefile.am: Define the SOURCES
+ for test concatenate1.
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, tests/Polyhedron/termination1.cc:
+ Completed the implementation of all_affine_ranking_functions_PR*().
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, TODO, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh: New Linear_Expression methods. Methods bool
+ Linear_Expression::is_zero() const and bool
+ Linear_Expression::all_homogeneous_terms_are_zero() const return
+ true if and only if `*this' is 0, and if and only if all the
+ homogeneous terms of `*this' are 0, respectively.
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4: Termination functions renamed in non-C++ interfaces.
+
+2010-03-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Avoid leakage when exiting a test.
+
+2010-03-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Revised code neede for wrap assign
+ wrap_assign in Java.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Let
+ ppl_*_linear_partition/4 register its outputs to the allocator
+ tracker.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc: Corrected typo: register
+ the C++ pointer, not the Prolog term.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+ demos/ppl_pips/expected_mpz: Corrected the expected results for test
+ fimmel.pip.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+ demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+ demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+ demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a,
+ demos/ppl_pips/expected_mpz: Corrected expected result for test
+ sor1d.pip.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frequency1.cc: Test 08 may does not overflow
+ when using exact Octagonal_Shapes.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/examples/sor1d.pip: Fixed input file sor1d.pip. A
+ line of blanks is not a valid comment line for the input reading
+ routine.
+
+2010-03-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/expected_mpz_a, demos/ppl_pips/ppl_pips.cc: Fixed
+ xpected result for sor1d.pip. Minor improvements to ppl_pips.cc.
+
+2010-03-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Delete objects before exiting
+ code.
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 7ededcd1147e0df879bdfaf92e9fa49c5482653d Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Mar 18 11:31:30 2010 +0400
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, tests/Polyhedron/termination1.cc: Fixed
+ one_affine_ranking_function_PR().
+
+2010-03-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_mpz_a,
+ demos/ppl_pips/ppl_pips.cc: Fixed a few memory allocation problems
+ in ppl_pips. Enabled the used of valgrind when running ppl_pips
+ tests. Corrected the expected result for test fimmel.pip
+ (unsatisfiable problem).
+
+2010-03-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Fixed a couple of resource allocation problems
+ (reported by Marco Poletti).
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4: Several
+ corrections.
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.defs.hh,
+ src/termination.templates.hh: Turn off debugging output.
+
+2010-03-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc: Fixed two bogus
+ invocations of PPL_WEAK_REGISTER.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl: Fixed several typos.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+ some invocations of PPL_CHECK.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.defs.hh: Define
+ PROLOG_TRACK_ALLOCATION to 1 to make a few bugs evident.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/tests/pl_check.pl: C and Prolog interfaces
+ for the termination utility functions renamed and fixed.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh: Kludge removed.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh,
+ tests/Polyhedron/termination1.cc: Completed
+ fill_constraint_system_PR().
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/termination.templates.hh,
+ tests/Polyhedron/termination1.cc: Kludge to allow the
+ proof-of-concept implementation of the PR functions to compile.
+
+2010-03-17 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed some
+ typos for code related to the wrap_assign java interface.
+
+2010-03-16 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4: Added implementation code for Java interface
+ for wrap_assign.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh, tests/Polyhedron/termination1.cc:
+ Temporarily implemented termination_test_PR() in terms of
+ termination_test_PR_2().
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh,
+ tests/Polyhedron/termination1.cc: Implemented and fixed termination
+ utilities with two input abstractions.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.hh: Code formatting fixed.
+
+2010-03-17 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl: Added a test (based on test10
+ in termination1.cc in the tests/Polyhedron directory) for
+ termination_test_MS/1 and termination_test_PR/1.
+
+2010-03-17 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4:
+ Added termination_test functions ending with "_2".
+
+2010-03-17 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+ some cut and paste typos.
+
+2010-03-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4: Arities fixed.
+
+2010-03-16 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Octagonal_Shape/frequency1.cc: Allow for the various numeric
+ types in frequency1.cc
+
+2010-03-16 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+ ow.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+ entation.java,
+ interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+ java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+ 4: Java interface for wrap asign added.
+
+2010-03-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh: Printing of debug information
+ suppressed.
+
+2010-03-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh,
+ tests/Polyhedron/termination1.cc: Implemented template
+ termination_test_PR_2().
+
+2010-03-16 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4: Added more termination_test predicates to the Prolog
+ interface.
+
+2010-03-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, tests/Polyhedron/termination1.cc: New
+ versions of the termination utility functions with two input
+ parameters. The PR ones are only stubs for the time being.
+
+2010-03-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Add BD_Shape<int8_t> to the instantiations enabled
+ by default. BD_Shape<int8_t> allows to efficiently encode
+ monotonicity constraints.
+
+2010-03-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+ tests/Box/frequency1.cc: Test changed so as to be meaningful for all
+ integer types. Comment typos fixed.
+
+2010-03-15 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+ tests/Box/frequency1.cc: Test changed so as to be meaningful for all
+ integer types. Comment typos fixed.
+
+2010-03-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 8760df47483200e17daf43df3c7ca4ec7aad9185 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Mon Mar 15 11:18:15 2010 +0000
+
+2010-03-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Documentation fixes. Added a paragraph
+ about optimizing a linear cost function.
+
+2010-03-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Improved checks in
+ PIP_Decision_Node::OK() method. There is no reason to have
+ Artificial_Parameter::OK() inlined. Added a couple of comments on
+ code that should be normally unreachable.
+
+2010-03-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Fixed documentation reference.
+
+2010-03-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Fixed
+ the value of INPUT doxygen configuration variable.
+
+2010-03-10 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4: Improved variable
+ names.
+
+2010-03-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: test10() and test11() witness a
+ bug in termination_test_PR().
+
+2010-03-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 65156364caa2da7235862998930736ca27c83236 Author:
+ François Galea <francois.galea at uvsq.fr> Date: Tue Mar 9 20:28:29
+ 2010 +0100
+
+2010-03-08 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Documentation fixes.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh,
+ tests/Polyhedron/termination1.cc: Implemented the improved Podelski
+ and Rybalchenko termination test.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Function
+ renamed. Unwanted stuff removed from comment.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: LaTeX code fixed.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 114f0e38474584e74743f67fd1203487241b60e8 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Mar 9 13:36:12 2010 +0400
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-latex.in: Missing files added.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Description of the PR method improved.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 4e2cacd9738634f10872d5e63f3fa9551d546a7e Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Mar 9 08:52:23 2010 +0400
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit f9fbde6765402ee509a03d952fdae02115c266fa Merge: 97bd553
+ a6b23fd Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Tue
+ Mar 9 07:04:15 2010 +0400
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-03-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh: Indentation fixed.
+
+2010-03-08 Roberto Amadini <r.amadini at virgilio.it>
+
+ * doc/definitions.dox, doc/devref.doxyconf-html.in: Fixed
+ documentation files.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 276bf49a11da0443cc5b284cf880858a8911b48a Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Mar 8 21:52:26 2010 +0400
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+ the implementation of the *_all_affine_ranking_functions_*
+ predicates.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh: Fixed
+ one_affine_ranking_function_MS(): it was not projecting the
+ generator onto the mu variables.
+
+2010-03-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4: Code
+ for Polyhedron_all_affine_ranking_functions_PR and similar revised -
+ but is buggy. m4 version needs fixing.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am, m4/ac_check_swi_prolog.m4:
+ Support newer versions of SWI-Prolog.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am, m4/ac_check_swi_prolog.m4:
+ Support newer versions of SWI-Prolog.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc, src/termination.templates.hh: Fixed some
+ copy-and-paste mistakes.
+
+2010-03-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4:
+ Added the rest of the termination functions to the C interface.
+
+2010-03-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4: Fixed some bugs in the Prolog interface termination code.
+
+2010-03-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/ppl_interface_generator_common_dat.m4: Added the
+ new termination functions to Prolog interface and the
+ termination_test_MS only to the C interface.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 54bf68f9ee93822f8792c0d89d45ebd0b5823aee Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Mar 8 16:24:38 2010 +0400
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Comments improved.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: Added a couple of missing
+ constraints.
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: Fixed the input polyhedra for
+ test01() and test02().
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.templates.hh: Added stub implementations for
+ one_affine_ranking_function_PR() and
+ all_affine_ranking_functions_PR().
+
+2010-03-08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 4684207ce34a88f9552f450faa6e019e475e4027 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Mar 8 13:35:33 2010 +0400
+
+2010-03-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Corrected an invalid reference bug in
+ PIP_Solution_Node::update_tableau(). The addition of tableau rows
+ invalidates previously computed references. Thanks to Marco Poletti
+ for reporting this.
+
+2010-03-07 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Eventually perform solution
+ tree simplifications after incremental addition of parameter
+ constraints.
+
+2010-03-07 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Moved the
+ compatibility_check static methods to PIP_Tree_Node.
+
+2010-03-07 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added one more test for
+ incremental solving.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Still working on specifications.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/termination.cc: Completed a couple of comment blocks.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ src/termination.cc, src/termination.defs.hh: Documented the
+ interfaces of the termination analysis functions.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: LaTeX inconsistency removed.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am, src/termination.cc, src/termination.defs.hh,
+ src/termination.templates.hh, tests/Polyhedron/termination1.cc:
+ Moved the utilities for termination analysis to their final
+ destination.
+
+2010-03-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/termination1.cc: Several improvements. Changed
+ the encoding of the input systems. Started drafting the
+ implementation of the method of Podelski and Rybalchenko.
+
+2010-03-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am, tests/Polyhedron/termination1.cc:
+ Added functions for termination analysis following the approach of
+ Mesnard and Serebrenik.
+
+2010-03-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint_System.cc, src/Constraint_System.defs.hh: Added
+ method bool Constraint_System::has_equalities() const.
+
+2010-03-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Corrected a couple of typos in the
+ documentation.
+
+2010-03-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Test 4 in
+ digitalfilers1.cc overflows with 64-bits if assertions are on.
+
+2010-03-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Tests 20, 21 and 22 overflow on
+ 8-bit coefficients (derived from test02).
+
+2010-03-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/ppl_test.hh: Encoded custom overflow conditions for
+ digitalfilters1.cc tests 5 and 6.
+
+2010-03-04 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a test for problem
+ feasibility when incrementally adding parameter constraints.
+
+2010-03-04 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added two tests for incremental
+ addition of parametric constraints. Even though correct, the
+ resulting solution trees can be simplified.
+
+2010-03-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: Replaced using directives by using
+ declarations.
+
+2010-03-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc: Apparently GNU Hurd only supports
+ ITIMER_REAL. (Thanks to Michael Tautschnig:
+ http://www.cs.unipr.it/pipermail/ppl-devel/2010-March/016072.html).
+
+2010-03-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc: Proper spacing added to
+ throw_syscall_error(). (Thanks to Michael Tautschnig.)
+
+2010-03-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Detected
+ several overflows in tests 5 and 6 of digitalfilters1.cc.
+
+2010-03-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh: Adopted a more flexible implementation for the
+ DO_TEST* macros. (Based on a set of macros provided by Abramo
+ Bagnara.)
+
+2010-03-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h, src/PIP_Problem.defs.hh: Made a pass
+ on the documentation of class PIP_Problem.
+
+2010-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Method
+ PIP_Tree_Node::solve() now checks context feasibility when needed.
+
+2010-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Corrected typo in test19().
+
+2010-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Several
+ minor improvements to the PIP_Problem resolution process.
+ Reorganized helper functions update_context() and
+ compatibility_check().
+
+2010-03-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ The wrap_assign has only been added to the C interface so the
+ procedure must be local to the C interface.
+
+2010-03-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.templates.hh: Completed removal of
+ support for circular intervals. Removed now ambiguous method CC76_narrowing_assign(). While at it,
+ also wrapped a few long lines.
+
+2010-03-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox, interfaces/C/C_interface.dox,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Added C interface for wrap_assign. Minor NELS improvements to
+ documentation describing Wrapping Operator (should be checked by the
+ author of these notes).
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Useless comma removed.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bool4.defs.hh, src/Box.defs.hh, src/Box.templates.hh,
+ src/Makefile.am: Removed stuff that will not be included in PPL
+ 0.11.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Missing comma added.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.templates.hh,
+ src/Circular_Interval.defs.hh, src/Makefile.am: Temporarily removed
+ the support for circular intervals.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 9005a4bc71b38b80205724ac2914731466e5b450 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Feb 27 17:02:19 2010 +0100
+
+2010-02-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Increase code coverage for
+ PIP_Tree_Node printing methods.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am: Force C++ linking for all the test
+ programs.
+
+2010-02-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/watchdog1.cc: Exception handling fixed.
+
+2010-02-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/tests/watchdog1.cc, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/tests/watchdog1.c, tests/Polyhedron/watchdog1.cc: Throw
+ std::logic_error in case the client asks for watchdogs on a system
+ not supporting them.
+
+2010-02-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Threshold_Watcher.defs.hh,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ tests/Polyhedron/weightwatch1.cc: Simplified initialization of
+ Threshold_Watcher<> static data member.
+
+2010-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Added printing
+ functions for PIP tree nodes and improved documentation.
+
+2010-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added
+ operator<<() for class PIP_Tree_Node, printing the subtree. The output operator is based on public (non-virtual) method print(),
+ which calls the protected (virtual) method print_tree() after
+ properly setting up the needed arguments.
+
+2010-02-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.defs.hh, src/Matrix.inlines.hh: Improve definition of
+ Matrix::const_iterator default constructor.
+
+2010-02-24 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+ return statements.
+
+2010-02-24 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Several
+ corrections in rate limiter tests.
+
+2010-02-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Tests 1-18 restored. Test 19 is
+ known to fail.
+
+2010-02-23 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a test illustrating a bug
+ when incrementally inserting a parameter constraint.
+
+2010-02-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed a test
+ on BDShape.
+
+2010-02-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/exceptions1.cc: Tests 14 and 15 are known to
+ overflow on 8-bit coefficients.
+
+2010-02-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Variable_Floating_Point_Expression.inlines.hh: Removed
+ whitespaces.
+
+2010-02-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Octagonal_Shape.templates.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed
+ indentation.
+
+2010-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/tests/pip_test.c: Fixed call to
+ ppl_PIP_Solution_Node_get_parametric_values().
+
+2010-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/pipproblem1.cc: Added tentative solution to bugs
+ shown by pipproblem1 tests 16, 17 and 18.
+
+2010-02-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+ digitalfilters1.cc
+
+2010-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, tests/PIP_Problem/exceptions1.cc,
+ tests/PIP_Problem/pipproblem2.cc: Do set the `solution_valid' flag
+ on exit from update_solution().
+
+2010-02-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 8ad05a7fa1293c23494ebd8c1a8222c8cc39dc0e Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Mon Feb 22 14:22:26 2010
+ +0100
+
+2010-02-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ tests/PIP_Problem/pipproblem1.cc: Changed interface for public
+ method PIP_Solution_Node::parametric_values(). The new interface no longer requires the set of problem parameters
+ as an input argument (which was error prone): rather, the set of
+ parameters of the PIP_Problem is now automatically retrieved. To this end, all PIP tree nodes are now provided by a pointer to the
+ owning PIP_Problem object. Method PIP_Problem::OK() modified to
+ check for well formedness of the solution tree and, in particular,
+ check that all its nodes are marked as owned by the right
+ PIP_Problem object. Removed the no longer useful method
+ PIP_Tree_Node::insert_artificials(). Corrected a typo in PIP_Problem::operator<<(). Simplified interface
+ of (internal) method PIP_Tree_Node::print_tree(). Added a FIXME regarding a potential exception safety issue.
+
+2010-02-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 537a4928e00e2b811822089da4cf12a1dd4344cf Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Feb 22 09:16:36 2010 +0100
+
+2010-02-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/pip_test.c: Avoid printing unless noisy or
+ very-noisy mode was requested.
+
+2010-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/watchdog1.cc: Be more informative in case
+ something goes wrong.
+
+2010-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac: Use the C++ compiler to perform the tests
+ meant for C++.
+
+2010-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh:
+ sigaction() is also needed, in addition to setitimer() in order to
+ support Watchdog objects. We could check if signal() is available
+ if there is request for such a feature.
+
+2010-02-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Watchdog.inlines.hh, interfaces/C/tests/watchdog1.c,
+ interfaces/C/tests/weightwatch1.c: If setitimer() is not available,
+ no initialization is necessary. This also works around a linking
+ bug in Mingw. C tests improved with error-handling code.
+
+2010-02-20 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Cast_Floating_Point_Expression.templates.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc:
+ Floating_Point_Expression::absolute_error is now a symmetric
+ interval.
+
+2010-02-20 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Cast_Floating_Point_Expression.templates.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Use build method
+ instead of join_assign to build convex intervals.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/ascii_dump_load1.cc: Improved code coverage.
+ Removed useless (and not accessible by user)
+ Tableau::total_memory_in_bytes().
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, tests/PIP_Problem/pipproblem3.cc: Invalidate
+ current solution at the start of PIP_Solution_Node::solve(). This
+ fixes the bug in pipproblem3 test03.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, tests/PIP_Problem/pipproblem2.cc: Adding no
+ space dims should not invalidate previously computed solution.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Got rid
+ of non-const PIP_Tree_Node as_decision() and as_solution() methods.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem2.cc: Achieve full code coverage for
+ the output operator.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ tests/PIP_Problem/exceptions1.cc: Document and test exception thrown
+ by PIP_Problem::print_solution().
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/ascii_dump_load1.cc: Test 09 overflows when
+ using 8-bit coefficients.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: A couple of tests marked as
+ known to fail. These shows a bug in the solver, which fails to
+ detect an unfeasible initial context.
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem3.cc: Put under git control. These
+ test exercise the incremental PIP solver (still buggy).
+
+2010-02-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Check fir and avoid space dimension mismatches in
+ merge_assign().
+
+2010-02-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/Makefile.am: Started working on incrementality.
+ Dealt with a FIXME in PIP_Solution_Node::update_tableau(): when
+ adding new problem variables and parameters, the columns of the
+ existing artificial parameters are moved to the right of the
+ tableau.t matrix.
+
+2010-02-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/pipproblem2.cc: Little code coverage improvement.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ tests/PIP_Problem/pipproblem1.cc, tests/PIP_Problem/pipproblem2.cc:
+ Prefer denominator() to get_denominator(). In pipproblem1 test02(),
+ add a lenghty check of the expected solution.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Simplified C interface
+ to Artificial_Parameter.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Removed two PIP_Problem
+ enum values that need not be interfaced.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Avoid parameter name
+ hiding; mark unreachable code.
+
+2010-02-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/pip_test.c: Added some missing C interface
+ methods and enum values for the new PIP classes.
+
+2010-02-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Changed
+ linearize method interface for Floating Point Expressions. Now, it
+ has a bool return type which indicates if the linearization
+ succeeded (or not). Thus, Linearization_Failed exception class has
+ been removed.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc,
+ tests/PIP_Problem/pipproblem1.cc: Corrected bug in th ehandling of
+ trivially satisfiable PIP problems. Test 16 in pipproblem1.cc
+ (currently disabled) shows a bug in the handling of trivially
+ unfeasible PIP problems.
+
+2010-02-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Dealt with a FIXME in PIP_Solution_Node::solve().
+
+2010-02-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/pip_test.c: Added total_memory_in_bytes() and
+ external_memory_in_bytes() to MIP_Problem and PIP_Problem in the C
+ interface.
+
+2010-02-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Multiplication_Floating_Point_Expression.templates.hh: Fixed
+ comments.
+
+2010-02-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Multiplication_Floating_Point_Expression.templates.hh:
+ Improved comments.
+
+2010-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips_extra_man_text:
+ Described the input formats.
+
+2010-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips.cc: Cosmetic improvements.
+
+2010-02-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Variable_Floating_Point_Expression.defs.hh: Added and fixed
+ documentation for Var_FP_Expression.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+ demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+ demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+ demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a:
+ Updated expected results.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_mpz,
+ demos/ppl_pips/expected_mpz_a: Test with all the examples.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/examples/README, demos/ppl_pips/examples/big.pip,
+ demos/ppl_pips/examples/brisebarre.pip,
+ demos/ppl_pips/examples/cg1.pip, demos/ppl_pips/examples/esced.pip,
+ demos/ppl_pips/examples/ex2.pip,
+ demos/ppl_pips/examples/fimmel.pip,
+ demos/ppl_pips/examples/invert.dat,
+ demos/ppl_pips/examples/linear.dat,
+ demos/ppl_pips/examples/lineri.dat,
+ demos/ppl_pips/examples/loz.dat, demos/ppl_pips/examples/max.dat,
+ demos/ppl_pips/examples/max.pip, demos/ppl_pips/examples/maxb.dat,
+ demos/ppl_pips/examples/pairi.dat,
+ demos/ppl_pips/examples/petit.dat,
+ demos/ppl_pips/examples/rairoi.dat,
+ demos/ppl_pips/examples/sor1d.pip,
+ demos/ppl_pips/examples/square.pip,
+ demos/ppl_pips/examples/test12i.dat: Added examples from PipLib
+ 1.4.0.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox: Typo fixed: we require
+ SICStus at least version 3.9.1.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am, Watchdog/tests/{simple1.cc =>
+ watchdog1.cc}: Test program renamed.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/watchdog1.cc, tests/Polyhedron/weightwatch1.cc:
+ Cosmetic changes.
+
+2010-02-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox, src/Polyhedron.defs.hh: Added "affine from
+ relation" section into definitions.dox. Fixed a reference to
+ "affine from relation".
+
+2010-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/PIP_Problem.cc: Drafted implementation for
+ PIP_Problem's operator<<.
+
+2010-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Tests adapted to use the new
+ method for printing a PIP problem solution.
+
+2010-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh: Added method PIP_Problem::print_solution().
+ The new method exploits added virtual method
+ PIP_Tree_Node::print_tree(). Implementation is based on code from
+ the many display_solution() helper functions that are currently
+ spread in the tests.
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/pwl_header.hh, Watchdog/tests/simple1.cc: Cater for
+ systems where setitimer() is not provided (part 4).
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.inlines.hh: Cater
+ for systems where setitimer() is not provided (part 3).
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, Watchdog/pwl-config.sed, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh:
+ Cater for systems where setitimer() is not provided (part 2).
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh:
+ Cater for systems where setitimer() is not provided (part 1).
+
+2010-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac: Build the PWL unless not
+ explicitly disabled at configuration time.
+
+2010-02-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * : commit 3c3188f08c10a1914cd545f35ba10a6ee464c3b9 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Wed Feb 17 10:16:43 2010 +0100
+
+2010-02-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Tests 2, 5, 7, 8, 9 and 10 do
+ not overflow on 16 bit coefficients.
+
+2010-02-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.inlines.hh: Fixed a type error.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Solved other instances of
+ test02, but using different cutting strategies.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Fixed bug introduced when improving coding style
+ in PIP_Solution_Node::solve. Corrected wrong assertion in
+ PIP_Solution_Node::generate_cut.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Important item added.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc: Unwanted inclusion
+ removed.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Use the right
+ preprocessor conditionals for PPL_HAVE_DECL_SIGACTION.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc: Warnings avoided.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Corrected several
+ problems.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/upperboundifexact1.cc: Enable test12.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: A few improvements to
+ PIP_Problem documentation.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/pip_test.c: Make the test trivially succeed
+ when coefficients are not large enough.
+
+2010-02-16 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Cast_Floating_Point_Expression.inlines.hh, src/Makefile.am,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/ppl_test.hh: Fixed Cast_Floating_Point_Expression.inlines.hh
+ and added a test.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/pip_test.c: Improved error handling. Cosmetic
+ improvements.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem2.cc:
+ Added unit tests for inner class
+ PIP_Tree_Node::Artificial_Parameter. Added operator!=() and swap()
+ methods: the last was necessary as we were inheriting it from
+ Linear_Expression.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem2.cc: Added another test for code
+ coverage purposes.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh: Got rid of
+ unused Boolean flag PIP_Problem::initialized.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips_extra_man_text: Avoid non-ASCII
+ characters.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips_extra_man_text: Trailing whitespace
+ removed.
+
+2010-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am: Install also ppl_pips.1.
+
+2010-02-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem2.cc: Added a couple of tests to
+ improve code coverage.
+
+2010-02-15 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Cast_Floating_Point_Expression.defs.hh,
+ src/Cast_Floating_Point_Expression.inlines.hh,
+ src/Cast_Floating_Point_Expression.templates.hh,
+ src/Cast_Floating_Point_Expression.types.hh: Added classes.
+
+2010-02-15 Roberto Amadini <r.amadini at virgilio.it>
+
+ * doc/devref.doxyconf-html.in: Added a first implementation of
+ Cast_Floating_Point_Expression classes.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/ppl_pips_extra_man_text: Put under Git control.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Avoid non-ASCII characters.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_pips/ppl_pips.1, devtools/generate_man_pages,
+ doc/ppl-config.1: Added a draft man page for `ppl_pips'. Other man
+ pages updated.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am: Missing backslash added.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_int16,
+ demos/ppl_pips/expected_int16_a, demos/ppl_pips/expected_int32,
+ demos/ppl_pips/expected_int32_a, demos/ppl_pips/expected_int64,
+ demos/ppl_pips/expected_int64_a, demos/ppl_pips/expected_int8,
+ demos/ppl_pips/expected_int8_a, demos/ppl_pips/expected_mpz_a: Added
+ missing expected results.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, Watchdog/src/pwl_header.hh: Improved the
+ NDEBUG machinery.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Mark expected overflows.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, Watchdog/pwl-config.sed,
+ Watchdog/tests/pwl_test.cc, configure.ac, ppl-config.sed,
+ tests/ppl_test.cc: Improve portability to systems that do not
+ (fully) support Posix signal handling.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2010-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 05cdf3ade39391ba25dc992cabe93a7758e23dac Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Mon Feb 15 11:18:23 2010
+ +0100
+
+2010-02-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh, tests/PIP_Problem/ascii_dump_load1.cc: Drafted
+ PIP_Problem methods {total,external}_memory_in_bytes().
+
+2010-02-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/pipproblem1.cc: PIP_Problem ascii dump&load
+ methods now also dump/load problem solution. Fixed error in
+ PIP_Tree_Node::ascii_load(). Added ascii dump&load methods to
+ PIP_Decision_Node.
+
+2010-02-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, tests/PIP_Problem/ascii_dump_load1.cc: In
+ ascii dump and load methods, also print pivot row strategy info.
+
+2010-02-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc:
+ Improving test coverage ratio.
+
+2010-02-06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved exception safety in method
+ PIP_Solution_Node::solve().
+
+2010-02-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Clarified proper usage of
+ PIP_Solution_Node alternative copy constructor. The Boolean
+ argument replaced by a tag struct type, since it was only used for
+ overloading resolution purposes.
+
+2010-02-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/PIP_Tree.cc: Add new friend function add_mul_assign() for
+ Linear_Expression. Used new function to optimize a couple of
+ computations in PIP_Tree.cc.
+
+2010-02-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Helper function negate_assign() rnamed as
+ complement_assign().
+
+2010-02-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Simplified interface for virtual method PIP_Tree_Node::solve(). No
+ longer using the PIP_Tree_Node*& parent_ref argument and direclty
+ returning the solution PIP_Tree_Node* instead of a status flag.
+
+2010-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Improved class PIP_Tree_Node::Artificial_Parameter.
+
+2010-02-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc: Some improvements to method
+ PIP_Problem::solve().
+
+2010-02-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved the last part of method
+ PIP_Solution_Node::solve().
+
+2010-02-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: More progress on PIP_Solution_Node::solve().
+ Identified places where the current implementation is not exception
+ safe.
+
+2010-02-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Further improved (huge) method
+ PIP_Solution_Node::solve(). Added a couple of comments regarding
+ parts where comments or code in unclear.
+
+2010-02-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved method Tableau::is_better_pivot().
+
+2010-02-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Started improving method
+ PIP_Solution_Node::solve(): - limit scope of variables; - try to use meaningful variable names.
+
+2010-02-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Minor improvements to PIP_Problem documentation and C interface.
+
+2010-02-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: Got rid of
+ error-prone Tableau::s_capacity() and Tableau::t_capacity().
+
+2010-02-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved method
+ PIP_Solution_Node::update_tableau().
+
+2010-02-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved implementation of
+ PIP_Solution_Node::compatibility_check(). Besides readability and
+ stylistic changes, the change should also immprove robustness and
+ (to a lesser extent) performance.
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved method
+ PIP_Solution_Node::::parametric_values().
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Stylistic improvements to Tableau methods
+ normalize() and scale().
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: A few more stylistic improvements.
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Several improvements to PIP_Solution_Node::generate_cut(). Added
+ method OK() to Artificial_Parameter.
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Further optimization to helper function
+ column_lower().
+
+2010-01-31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Several minor stylistic
+ improvements.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Prefer C++ named casts to C style casts.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Minor readability improvements to row_normalize.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Optimized some computation in helper function
+ column_lower().
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Improved helper function
+ merge_assign(): add all new rows at once.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Corrected capacity mismatch bug in
+ PIP_Solution_Node::solve().
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved consistency checks in method
+ PIP_Decision_Node::OK().
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Improved consistency checks in method
+ PIP_Solution_Node::Tableau::OK(). Prefer using
+ Coefficient_traits::const_reference in parameter passing.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: The Pip_Tree_Node:OK() method is now
+ virtual. When overriding a virtual method in derived classes,
+ prefer repeating the virtual keyword for clarity.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh: Typedef for PIP_Tree
+ moved to PIP_Tree.types.hh.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.inlines.hh: Everyting else equal, prefer downward
+ iteration in for loop.
+
+2010-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc: No need to check for null pointers before
+ deleting them.
+
+2010-01-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence_System.defs.hh, src/Generator_System.defs.hh,
+ src/Grid_Generator_System.defs.hh: Forward declare classes before
+ making them friends. Included Grid.types.hh in Congruence_/Grid_Generator_
+ System.defs.hh. Do not uselessly include Grid.types.hh in
+ Generator_system.defs.hh.
+
+2010-01-22 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a not working incremental
+ solve test.
+
+2010-01-20 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Fixed bugs. Now test07 in
+ pipproblem2.cc is successful.
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P: Fixed the omissions of
+ ppl_Polyhedron_is_empty/1 and ppl_Polyhedron_add_constraints/2.
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P: Fixed the omission of
+ ppl_set_irrational_precision/1 and ppl_irrational_precision/1.
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 9c19bc2b318a35016e0189f9552c98910be37f53 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Jan 9 16:32:08 2010 +0100
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 56ee86b9ccf001c8dc2ab1558332e9691b2eff3f Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Jan 9 14:38:37 2010 +0100
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Temp.inlines.hh: Generate nicer identifiers for the
+ temporaries.
+
+2010-01-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex1.mps: Adapted to follow the IBM OSL
+ conventions for the MPS format.
+
+2010-01-05 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed a bug. Now test08 and test09 in
+ pipproblem2.cc are successful.
+
+2010-01-04 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Implemented an optional pivot row strategy for difficult problems.
+ It is deactivated by default as it is more compute intensive.
+
+2009-12-16 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Tree.cc: Added a more aggressive
+ cutting strategy which generates all possible cuts.
+
+2009-12-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Moved out the cut
+ generation code into a separate method.
+
+2009-12-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Moved huge block of code out of useless 'else'
+ block. Code reindentation.
+
+2010-01-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Do not include <iostream> if PPL_NOISY_SIMPLEX
+ is defined to 0.
+
+2010-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/bump_copyright_years: Extended copyright years.
+
+2010-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 4d6c6db0470eb60cecbbed0a43a2b08d8539e95f Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Fri Jan 1 16:36:10 2010 +0100
+
+2010-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/ppl_pips.cc, devtools/bump_copyright_years,
+ interfaces/C/tests/pip_test.c, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+ src/PIP_Problem.templates.hh, src/PIP_Problem.types.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ src/PIP_Tree.types.hh, tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc,
+ tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+ tests/PIP_Problem/pipproblem2.cc: Extended copyright years.
+
+2010-01-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 488f55fbe874c4f3a85c0c0db8c59f7e83d615e0 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Fri Jan 1 16:28:45 2010 +0100
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 99a040ae53ddf2e369340274eb34d5211b1c642a Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Wed Dec 30 17:43:41 2009 +0100
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am: Support building the Java
+ interface on MinGW.
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Document conditionals.
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Restore the use of the `win32-dll' Libtool option.
+ Use -no-undefined on all variants of Cygwin and MinGW.
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/Makefile.am: Correction for
+ platforms where not all floating point types are supported.
+
+2009-12-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Use the right
+ assignment operator.
+
+2009-12-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Expected failures
+ revised.
+
+2009-12-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Expected failured
+ revised.
+
+2009-12-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Typo fixed.
+
+2009-12-29 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+ src/Box.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/octagonalshape1.cc,
+ tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Renamed affine_image
+ on Linear Forms into affine_form_image.
+
+2009-12-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Use the
+ general assignment and comparison functions.
+
+2009-12-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit e86e2471429982e8141789e4adeb6ddd0cc1e326 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Dec 28 20:26:04 2009 +0100
+
+2009-12-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Multiplication_Floating_Point_Expression.templates.hh:
+ Improved Multiplication_Floating_Point_Expression::linearize.
+
+2009-12-26 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Box.defs.hh, src/Box.templates.hh,
+ src/Octagonal_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Implemented
+ Box<ITV>::affine_image on Interval Linear Forms. Tests in
+ tests/Floating_Point_Expression actually use only IEEE754 floating
+ point format.
+
+2009-12-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-12-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, Watchdog/INSTALL, Watchdog/compile,
+ Watchdog/config.guess, Watchdog/config.sub, compile, config.guess,
+ config.sub: Updated.
+
+2009-12-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 4e2145f8d498bc3ea055a06a1244de677b7bbab5 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Dec 22 09:30:55 2009 +0100
+
+2009-12-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Boundary.defs.hh,
+ src/Circular_Interval.defs.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/checked_float.inlines.hh, src/globals.defs.hh: Never leave
+ operators at end of line.
+
+2009-12-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh, src/Circular_Interval.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.templates.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/MIP_Problem.cc,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/checked_float.inlines.hh, src/wrap_assign.hh: Never leave
+ operators at end of line.
+
+2009-12-20 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Float.defs.hh, src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape1.cc,
+ tests/Floating_Point_Expression/bdshape2.cc,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/linearform1.cc,
+ tests/Floating_Point_Expression/octagonalshape1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc,
+ tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Several corrections
+ in tests and source code. Now, in all tests of
+ tests/Floating_Point_Expression/ we assume that analyzer format must
+ be less precise or equal than analyzed format.
+
+2009-12-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 9784b8165b6cb1dea5eb6d20b4cebca7ecc780fd Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Dec 19 11:46:22 2009 +0100
+
+2009-12-14 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Added Linear
+ Form Intervalization on rate limiter test.
+
+2009-12-11 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Improved
+ test01, ..., test04.
+
+2009-12-07 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/ratelimiter.cc: Removed redundant
+ code.
+
+2009-12-02 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+ comments.
+
+2009-11-30 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Improved the documentation of the PIP
+ solver.
+
+2009-11-30 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/pip_test.c, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh, tests/PIP_Problem/pipproblem1.cc: Simplified
+ the solution tree exploration method. Including, the
+ PIP_Tree_Node::insert_artificials method has been removed.
+
+2009-11-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * tests/Floating_Point_Expression/Makefile.am: Fixed a typo.
+
+2009-11-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/ratelimiter.cc: Added a rate limiter
+ test that pass without intersection between the two domain.
+
+2009-11-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Improved tests
+ on rate limiter. They all pass now.
+
+2009-11-27 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.defs.hh: Modified the documentation of the
+ PIP_Problem class.
+
+2009-11-27 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed a regression.
+
+2009-11-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem2.cc: Test test10() in pipproblem2.cc
+ seems to show another bug.
+
+2009-11-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/ascii_dump_load1.cc: Added a few tests for the
+ PIP_Problem ascii_dump/load methods.
+
+2009-11-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc: Properly set status flags when solving a
+ PIP_Problem having no constraints. Minor correction to ascii_dump
+ method.
+
+2009-11-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: One item added.
+
+2009-11-26 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Changed the cut generation strategy in
+ compatibility_check. Now several cuts may be generated in a single
+ pass.
+
+2009-11-26 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Changed the pivot row selection algorithm in
+ compatibility_check. It now selects the row which maximizes the
+ lexico-minimal pivot column.
+
+2009-11-26 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Minor cosmetic code fixes.
+
+2009-11-26 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Moved the lexico-minimum column search algorithm
+ to a separate function.
+
+2009-11-25 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Removed useless utility function.
+
+2009-11-26 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc: Fixed a regression.
+
+2009-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.templates.hh, tests/PIP_Problem/exceptions1.cc,
+ tests/PIP_Problem/pipproblem2.cc: PIP_Problem can handle strict
+ inequalities: corresponding checks removed. Got rid of internal
+ status SATISFIABLE, which was unused. Corrected several minor typos
+ (missing spaces) in exception messages. Added a new test
+ (pipproblem2.cc, test09) showing what seems to be a bug.
+
+2009-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem2.cc: Test test07() in pipproblem2.cc
+ shows a bug in PIP_Problem. Apparently, we cannot incrementally add
+ new constraints to a PIP_Problem taht was already solved.
+
+2009-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/pipproblem2.cc: Prefer not_a_dimension() as a
+ marker if the big parameter is not set.
+
+2009-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am, tests/PIP_Problem/exceptions1.cc:
+ Started adding tests checking for the right PIP_Problem exceptions
+ are thrown.
+
+2009-11-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/Makefile.am, tests/PIP_Problem/pipproblem2.cc:
+ Started adding tests to increase coverage.
+
+2009-11-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem1.cc: Minor improvements to avoid
+ assertion failures on iterators.
+
+2009-11-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Started drafting a
+ Prolog interface for PIP_Problem.
+
+2009-11-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc: In
+ PIP_Problem::clear(), do also reset the big parameter dimension.
+ Added C language functions for getting/setting the big parameter
+ dimension.
+
+2009-11-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am, demos/ppl_pips/ppl_pips.cc,
+ interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+ src/PIP_Problem.types.hh, src/PIP_Tree.cc: Enumerations for control
+ parameters put inside class PIP_Problem. Interfaced methods for
+ getting/setting control parameters (in C). Other minor stylistic
+ improvements here and there.
+
+2009-11-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.inlines.hh,
+ src/PIP_Problem.templates.hh, src/PIP_Problem.types.hh: Corrected a
+ bug in method swap. Several minor stylistic improvements.
+
+2009-11-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Item added.
+
+2009-11-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Variable_Floating_Point_Expression.inlines.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Modified tests
+ on rate limiter. Removed useless comments.
+
+2009-11-20 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Optimized the solver main loop using
+ PPL_DIRTY_TEMP_COEFFICIENT's.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Added a rule to the cut methods to always choose
+ the simplest parametric part. This tends to provide simpler solution trees on some problems.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added a mechanism to avoid
+ generating the same Artificial_Parameter twice.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Added a pointer to parent node in PIP_Tree_Node.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Improved the deepest row selection cut strategy.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Correctly rewrote ascii_dump/ascii_load methods
+ for PIP_Solution_Node.
+
+2009-11-19 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Removed useless debugging display code.
+
+2009-11-16 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Added an option in PIP standalone
+ solver to solve the problem several times. This may be convenient for benchmarking purposes.
+
+2009-11-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc: Fixed a bug in PIP_Problem copy constructor.
+
+2009-11-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Updated the deepest cut strategy; now only
+ selects rows associated to initial variables. This results in performance increase in most problems.
+
+2009-11-16 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Minor fix fixes in standalone solver.
+
+2009-11-16 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Fixed a bug in standalone solver when
+ using PIPlib files with a big parameter.
+
+2009-11-13 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+ src/PIP_Problem.templates.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Added support for an arbitrarily big parameter.
+
+2009-11-13 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc: Switched the
+ default cut generation strategy to first row.
+
+2009-11-13 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc: Fixed a bug.
+
+2009-11-13 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh, src/PIP_Tree.cc:
+ Added a control parameter for cut generation strategy.
+
+2009-11-10 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Added a mechanism for setting/getting control parameter values.
+
+2009-11-10 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Made use of virtual methods
+ in PIP_Tree_Node::clone().
+
+2009-11-05 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed a bug.
+
+2009-11-05 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Removed temporary debug code.
+
+2009-11-05 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved the support for
+ equality constraints.
+
+2009-11-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Improved basis handling in compatibility_check.
+
+2009-11-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Added coherency checks in PIP_Solution_Node.
+
+2009-11-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved basis handling
+ with support for slack variables and bijective variable mapping.
+
+2009-11-03 François Galea <francois.galea at uvsq.fr>
+
+ * interfaces/C/tests/pip_test.c: Implemented an example of solution
+ tree spanning and display using the C interface.
+
+2009-11-03 François Galea <francois.galea at uvsq.fr>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.defs.hh,
+ src/PIP_Tree.inlines.hh: Implemented the art_parameter_count method;
+ updated the C interface.
+
+2009-11-02 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Implemented Bland's anti-cycling rule in
+ compatibility_check.
+
+2009-11-02 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Proper scaling of cuts in compatiblity_check.
+
+2009-10-30 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Minor fix in PIP standalone solver.
+
+2009-10-29 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Fixed a bug in PIP standalone solver.
+
+2009-10-28 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Fixed one bug in standalone PIP
+ solver.
+
+2009-10-28 François Galea <francois.galea at uvsq.fr>
+
+ * demos/ppl_pips/ppl_pips.cc: Added support for Polylib-formatted
+ files in standalone solver.
+
+2009-10-27 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc,
+ tests/PIP_Problem/pipproblem1.cc: Added support for equality
+ constraints; fixed a bug for strict inequalities.
+
+2009-10-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-10-27 François Galea <francois.galea at uvsq.fr>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.defs.hh:
+ Fixed the C interface and the documentation for PIP_Tree_Node
+ methods. The concerned methods are insert_artificials and
+ get_parametric_values.
+
+2009-10-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Another pass on the C
+ interface for PIP_Problem related classes. Removed a few useless
+ functions and added a few missing ones, including input/output
+ utilities; also slightly improved the documentation.
+
+2009-10-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ src/PIP_Problem.defs.hh: Interfaced constructor/destructor for
+ Artificial_Parameter_Sequence iterators. These iterators should be
+ used similarly to the ones defined on systems of constraints or
+ generators. Corrected a couple of bugs in the documentation.
+
+2009-10-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/pip_test.c: Added increment, dereference and
+ equal functions for
+ ppl_Artificial_Parameter_Sequence_const_iterator_t's Fixed a couple of bugs.
+
+2009-10-23 François Galea <francois.galea at uvsq.fr>
+
+ * interfaces/C/tests/Makefile.am, interfaces/C/tests/pip_test.c:
+ Added test program for PIP C interface.
+
+2009-10-23 François Galea <francois.galea at uvsq.fr>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+ src/PIP_Problem.defs.hh: New parameter choice method. Updated the C
+ interface.
+
+2009-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README: Refer to PPL 0.11, not 0.10.
+
+2009-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Ditribute also MIP_Problem.types.hh,
+ PIP_Tree.types.hh and PIP_Problem.types.hh.
+
+2009-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/Makefile.am: Adapted to the checking of ppl_pips.
+
+2009-10-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_pips/expected_mpz: Put under Git control.
+
+2009-10-22 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Removed invalid optimization in context
+ compatibility check.
+
+2009-10-21 François Galea <francois.galea at uvsq.fr>
+
+ * configure.ac, demos/Makefile.am, demos/ppl_pips/Makefile.am,
+ demos/ppl_pips/examples/Makefile.am,
+ demos/ppl_pips/examples/test02.dat, demos/ppl_pips/ppl_pips.cc:
+ Added a standalone PIP solver demo program.
+
+2009-10-21 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/pipproblem1.cc: Context compatibility check now
+ searches for valid integer solutions.
+
+2009-10-20 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Parameter compatibility
+ check now applies a revised dual simplex method.
+
+2009-10-20 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Added display of computed row parameter signs in
+ noisy PIP mode.
+
+2009-10-20 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added new test, which should
+ return an empty solution.
+
+2009-10-20 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/definitions.dox, doc/ppl.sty,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Documentation
+ updates. Fixed parenthesis in ppl.sty as suggested. Fixed few
+ typos.
+
+2009-10-20 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Always stop compatibility check at first negative
+ row.
+
+2009-10-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Added FIXME
+ notes.
+
+2009-10-16 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Added a test
+ on BD_Shape, improved a test on Polyhedra.
+
+2009-10-16 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Float.defs.hh, src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Added BASE
+ field to floating point struct. Modified absolute/relative error
+ definition using FP_Format::BASE. Modified tests using
+ FP_Format::BASE.
+
+2009-10-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Improved the heuristic for the choice of the
+ deepest cut.
+
+2009-10-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Better use of scaling and normalization to keep
+ low coefficient values where possible.
+
+2009-10-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, tests/PIP_Problem/pipproblem1.cc: Corrected
+ invalid compatibility check algorithm.
+
+2009-10-15 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Float.defs.hh: Added float_ibm_single declaration into class
+ Float<T>.
+
+2009-10-14 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/devref.doxyconf-html.in: Added
+ Floating_Point_Expression.templates.hh into documentation.
+
+2009-10-14 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added a test case illustrating
+ an instability in the PIP solver.
+
+2009-10-13 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+ widening in test05 and test06.
+
+2009-10-13 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Integrality check only on the original variables
+ (not slack ones).
+
+2009-10-13 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Optimized pivot operation.
+
+2009-10-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc: Uncommented C
+ interface code for PIP_Problem assignment.
+
+2009-10-09 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: More functions for the
+ C interface to the PIP Tree class - in particular, corresponding to the PIP_Solution_Node and
+ PIP_Decision_Node C++ methods. Various small bugs fixed in the PIP_Problem C interface code.
+
+2009-10-09 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc: Fixed various bugs in
+ the C interface for PIP_Problem methods.
+
+2009-10-09 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Improved best pivot row selection heuristic.
+
+2009-10-09 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.inlines.hh: Added several C
+ functions for PIP_Tree_Node and Artificial_Parameter*.
+
+2009-10-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.inlines.hh: Added the c
+ interface for as_decision() and as_solution().
+
+2009-10-09 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/pipproblem1.cc: Fixed memory managment issue in
+ copy constructor of PIP_Problem.
+
+2009-10-09 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc: Added call to the solver to check problem
+ satisfiability.
+
+2009-10-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, tests/PIP_Problem/pipproblem1.cc: Added
+ implementations for PIP_Problem swap and operator= methods. Added a
+ few consistency checks in method OK(). Pointed out a resource
+ management bug in copy constructor that can result in memory
+ corruption. Added test04() to pipproblem1.cc (currently commented
+ out) showing that a segmentation fault can be obtained when copying
+ a PIP_Problem object having a non-null solution tree.
+
+2009-10-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h: Added missing headers for
+ ppl_PIP_Problem_solve and ppl_PIP_Problem_optimizing_solution. Variable names made consistent with the domain. Documentation for ppl_PPI_Problem_is_satisfiable() improved.
+
+2009-10-08 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Removed trailing
+ whitespaces.
+
+2009-10-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_implementation_common.cc: Uncommented methods
+ for the C interface for the PIP_Problem.
+
+2009-10-08 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc: Implemeted missing methods.
+
+2009-10-08 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_implementation_common.cc: Uncommented C
+ interface code for add_constraint(), add_constraints() and
+ operator=().
+
+2009-10-07 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Implemented missing methods.
+
+2009-10-07 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.inlines.hh: Fixed memory leak.
+
+2009-10-07 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Float.inlines.hh: Removed a comment.
+
+2009-10-07 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h: Commented PIP_Problem code in
+ the C interface that requires methods in the C++ interface that are
+ not yet implemented. Added declarations for printing the PIP_Problem and PIP_Tree in the
+ tests.
+
+2009-10-07 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_implementation_common.cc: More consistent
+ naming of variables.
+
+2009-10-07 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.inlines.hh: Added 2 more
+ functions for the C interface to the PIP_Problem class.
+
+2009-10-07 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed test05.
+
+2009-10-07 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.inlines.hh: Added a very
+ basic interface for C to the PIP_Problem class. Note this is incomplete and does not support methods with PIP_Tree.
+
+2009-10-06 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Float.defs.hh, src/Float.inlines.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Using uint16_t
+ instead of uint32_t in float_ieee754_half. Extended
+ float_ibm_single.
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Removed
+ useless pointer to problem object in PIP_Tree_Node.
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.defs.hh: Minor fixes in Doxygen documentation.
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Improved accuracy of context compatibility
+ checks.
+
+2009-10-06 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Changed
+ loop-guards in the first four test of digitalfilters1.cc
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Added generation of non-parametric cuts.
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved display in noisy
+ mode.
+
+2009-10-06 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed bug in compatiblity_check().
+
+2009-10-06 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed test03.
+
+2009-10-06 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Float.defs.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Computed the
+ largest non-infinity number in digitalfilters1.cc Fixed a bug in
+ Float.defs.hh
+
+2009-10-05 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Removed
+ comments.
+
+2009-10-05 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Minor changes.
+
+2009-10-05 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Float.defs.hh, src/Float.inlines.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Extended
+ float_ieee754_half format. Fixed a function call in test06 with a
+ possible solution.
+
+2009-10-04 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh: Removed few comments.
+
+2009-10-05 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Polyhedron.templates.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Fixed
+ Polyhedron::refine_with_linear_form_inequality. Adapted tests on
+ polyhedra.
+
+2009-10-05 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Removed
+ abstract_store parameter of Polyhedron::affine_image and
+ Polyhedron::refine_with_linear_form_inequality in digitalfilters1.cc
+
+2009-10-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Fixed a few
+ typos.
+
+2009-10-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh: Do not use an abstract store: extract
+ lower and upper bounds of variables from the polyhedron itself
+ instead. Fixed a bug in refine_with_linear_form_inequality that was
+ triggered when both parameters left and right were bounded but left
+ - right was not bounded.
+
+2009-10-05 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Modified test03,
+ test05 and test06.
+
+2009-10-05 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Added code for selection of the deepest cut.
+
+2009-10-04 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+ test01, test02, test03 and test04.
+
+2009-10-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+ tests/PIP_Problem/pipproblem1.cc: Implemented cut generation. Not
+ stable yet.
+
+2009-10-04 François Galea <francois.galea at uvsq.fr>
+
+ * tests/PIP_Problem/pipproblem1.cc: Added test problem.
+
+2009-10-03 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Added widening
+ and extrapolation operators in test01, test02, test03 and test04.
+
+2009-10-03 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+ comments.
+
+2009-10-02 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Implemented a
+ test on polyhedra abstract domain with linearization of floating
+ point expressions.
+
+2009-10-02 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Implemented a
+ test on rate limiter which uses octagons abstract domain and
+ linearization of floating point expressions.
+
+2009-10-02 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Unified the common denominator between both matrices of the tableau.
+
+2009-10-01 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape2.cc,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Improved
+ BD_Shape<T>::refine_with_linear_form_inequality. Corrected
+ BD_Shape<T>::affine_image. Adapted tests in bshape2.cc and finished
+ test02 in digitalfilters1.cc
+
+2009-10-01 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Fixed bug in
+ BD_Shape<T>::two_variables_affine_image. Added a first
+ implementation of test02.
+
+2009-10-01 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Implemented
+ test of rate limiter using polyhedra abstract domain.
+
+2009-10-01 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Modified test03
+ and test04.
+
+2009-10-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh: Fixed a few assertions.
+
+2009-10-01 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.inlines.hh,
+ tests/PIP_Problem/pipproblem1.cc: Fixed bugs.
+
+2009-10-01 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc: Corrected tests
+ with Intervals and Octagons in digitalfilters1.cc. Temporarily
+ modified tests/Floating_Point_Expression/Makefile.am Implemented
+ Variable_Floating_Point_Expression::linear_form_assign. Inserted
+ invariant assertions in Octagonal_Shape<T>::affine_image.
+
+2009-10-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh, src/Polyhedron.inlines.hh: Added
+ two TODO notes.
+
+2009-09-30 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Implemented handling of artificial parameters, preparing cut
+ generation.
+
+2009-09-30 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Removed ad
+ useless parameter in linear_form_upperbound();
+
+2009-09-30 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape2.cc: Few tests added; Fixed
+ refine_with_linear_form_inequality();
+
+2009-09-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape2.cc: Added few tests; Fixed
+ refine_with_linear_form_inequality() and auxiliary functions;
+ Implemented inline void refine_fp_interval_abstract_store();
+
+2009-09-29 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.templates.hh, src/PIP_Tree.cc,
+ tests/PIP_Problem/pipproblem1.cc: Added support for adding
+ constraints in initial context.
+
+2009-09-29 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc: Proper update of internal
+ state of PIP_Problem object.
+
+2009-09-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape2.cc: Added a test. Fixed a
+ bug in left_one_var_refine().
+
+2009-09-29 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed regression due to change in index ordering
+ in parameter constraints.
+
+2009-09-29 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Added a
+ preliminary version of test05. Edited previous tests.
+
+2009-09-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape2.cc: Added two tests; Fixed
+ a bug in left_one_var_refine() function.
+
+2009-09-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/digitalfilters1.cc: Added a first
+ implementation of tests on Octagon and Polyhedra.
+
+2009-09-29 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * tests/Floating_Point_Expression/refinebdshape1.cc: Deleted a
+ useless tests file.
+
+2009-09-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/digitalfilters1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc: Started to test
+ analysis on digital filters. Temporarily modified
+ tests/Floating_Point_Expression/Makefile.am
+
+2009-09-28 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape2.cc,
+ tests/Floating_Point_Expression/refinebdshape1.cc: Fixed few bugs in
+ inhomogeneous_refine();
+
+2009-09-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Improved test05
+
+2009-09-28 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Fixed test05.
+
+2009-09-28 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Modified test04
+ and test05.
+
+2009-09-26 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Modified
+ poyhedron2.cc in order to test NNC_Polyhedron and
+ Polyhedron::generalized_refine_with_linear_form_inequality.
+
+2009-09-26 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am: Temporarily edited
+ tests/Floating_Point_Expression/Makefile.am
+
+2009-09-26 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Added another
+ test.
+
+2009-09-26 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron2.cc: Added a test in
+ polyhedron2.cc
+
+2009-09-26 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh: Added missing const qualifiers.
+
+2009-09-25 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh: Implemented
+ generalized_refine_with_linear_form_inequality. Adapted
+ refine_with_linear_form_inequality to accept strict inequalities on
+ not necessarily closed polyhedra.
+
+2009-09-25 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh: Added
+ a trivial implementation of
+ generalized_refine_with_linear_form_inequality.
+
+2009-09-25 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc: Finished to test
+ Polyhedron::affine_image.
+
+2009-09-25 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc: Fixed test04: do
+ not perform floating point operations outside of the interval domain
+ unless the result can be exactly represented.
+
+2009-09-25 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/polyhedron2.cc: Added a couple of
+ simple tests. Makefile fixed.
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 8ca4f6890910a146f573d7a45d135aa6a07b6ece Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Sep 24 20:48:16 2009 +0200
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/{pipproblem.cc => pipproblem1.cc}: Renamed to
+ follow the PPL convention on test file naming.
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PIP_Problem/pipproblem.cc: Added test02().
+
+2009-09-24 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc,
+ tests/Floating_Point_Expression/polyhedron2.cc: Fixed test05. Added
+ a new test file.
+
+2009-09-24 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc: Added two tests.
+
+2009-09-24 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Removed two
+ unused parameters; Fixed two function calls.
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh: Fixed operator>>(std::istream&,
+ Interval<Boundary, Info>&).
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh: Spurious print statement removed.
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh: Fixed operator>>(std::istream&,
+ Interval<Boundary, Info>&).
+
+2009-09-24 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh: Added the
+ constructor Constant_Floating_Point_Expression(const char*).
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh: Spurious print statement removed.
+
+2009-09-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit e61defee29d0688a72fbe707157351a85c9a35a1 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Sep 24 16:23:44 2009 +0200
+
+2009-09-24 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh: Added a couple of assertions.
+
+2009-09-24 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/polyhedron1.cc: Added some tests
+ in tests/Floating_Point_Expression/polyhedron1.cc
+
+2009-09-24 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Forgot to
+ pass the common denominator to bounded_affine_image.
+
+2009-09-24 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Completed the
+ method refine_with_linear_form_inequality(); added the auxiliary
+ function left_two_var_refine().
+
+2009-09-24 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, tests/PIP_Problem/pipproblem.cc: Added additional
+ check in simplex, leading to simpler decision trees.
+
+2009-09-24 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Always assert
+ that all variables in the abstract store are bounded. Corrected the
+ documentation accordingly.
+
+2009-09-24 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Polyhedron.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am: Started to test
+ Polyhedron::affine_image on FP_Linear_Form.
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Removed
+ commented code in floatingpointexpr1.cc
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc: Improved tests.
+ Now they all pass and reach the maximum coverage.
+
+2009-09-23 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Partial
+ implementation of refine_with_linear_form_inequality(); Two
+ auxiliary function added.
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed
+ indentation.
+
+2009-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/octagonalshape1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc: Parametrized
+ tests for Octagonal_Shape.
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/bdshape1.cc,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/linearform1.cc: Parametrized
+ linearform1.cc and bdshape1.cc Fixed indentation and removed an
+ useless test in floatingpointexpr1.cc
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc,
+ tests/ppl_test.hh: Added several corrections in order to parametrize
+ floatingpointexpr1.cc
+
+2009-09-23 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/octagonalshape1.cc,
+ tests/ppl_test.hh: Parametrized floatingpointexpr1.cc
+
+2009-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh: Made the
+ refine_fp_interval_abstract_store methods inline.
+
+2009-09-23 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Always use Box
+ instead of map for interval abstract stores.
+
+2009-09-23 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Removed
+ useless parameter in PIP_Tree_Node::update_tableau method.
+
+2009-09-23 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+ tests/PIP_Problem/pipproblem.cc: Implemented display of solution
+ trees.
+
+2009-09-23 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixed bugs.
+
+2009-09-23 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Changed index ordering in
+ parameter constraints.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/ppl_test.hh: Fixed another typo that prevented compilation
+ of tests.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/ppl_test.hh: Fixed a typo that prevented compilation of
+ tests.
+
+2009-09-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.defs.hh: Renamed float_IBM_single and float_IBM_double
+ lowering the case for IBM.
+
+2009-09-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/.gitignore,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/run_tests: Added some infrastructure
+ to perform parametric tests.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Float.defs.hh: Added a few details about other floating point
+ formats.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox, src/Polyhedron.defs.hh: Small documentation
+ corrections.
+
+2009-09-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc: Adapted test
+ files to new representation of interval abstract stores.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh: Added missing static
+ casts so that tests now pass again.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Use Box to
+ represent an interval abstract store.
+
+2009-09-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/octagonalshape2.cc: Replaced
+ typedefs according to the new policies.
+
+2009-09-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am, tests/{Polyhedron =>
+ Floating_Point_Expression}/linearform1.cc,
+ tests/Floating_Point_Expression/{affineimage3.cc =>
+ octagonalshape1.cc}, tests/Floating_Point_Expression/{refinelf1.cc
+ => octagonalshape2.cc}, tests/Polyhedron/Makefile.am: Refactoring of
+ test files into test/Floating_Point_Expression.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh: Adapted the class to the
+ policies defined in Float.defs.hh.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Pass variables
+ to affine_image by copy.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Written
+ Polyhedron::refine_fp_interval_abstract_store. Various other
+ corrections.
+
+2009-09-22 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh: Little correction in
+ two_variables_affine_image method.
+
+2009-09-22 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Octagonal_Shape.defs.hh, src/Polyhedron.templates.hh: Fixed one
+ cut-&-paste error. Use a single call of bounded_affine_image
+ instead of calling generalized_affine_image twice. Added two FIXME
+ notes.
+
+2009-09-22 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added mechanism for
+ fetching parametric values for variables.
+
+2009-09-22 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh: Added reference to the Problem object in
+ solution tree Nodes.
+
+2009-09-21 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/affineimage3.cc,
+ tests/Floating_Point_Expression/bdshape1.cc: Added another test for
+ the general case of affine_image.
+
+2009-09-21 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+ affine_image and modified one_variable_affine_image. Added a new
+ test for the general case.
+
+2009-09-21 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc: Implemented a
+ preliminary (yet untested) version of methods
+ BD_Shape::linear_form_upper_bound and
+ BD_Shape::two_variables_affine_image.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh, tests/ppl_test.hh: Added
+ more floating point formats. Added some parametric typedefs for
+ tests.
+
+2009-09-21 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Bug fixes.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Added a few lines of documentation
+ that were previously forgotten.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh: Added some more documentation.
+
+2009-09-21 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+ affine_image and implemented three new tests.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh: Added some
+ (and corrected some of the) documentation.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Wrote a first
+ implementation of refine_with_linear_form_inequality.
+
+2009-09-21 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+ BD_Shape<T>::affine_image and added more tests for this method.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc: Use the
+ proper exception thrower. Moved the new exception thrower.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc: Various
+ corrections.
+
+2009-09-21 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh: Finished writing a first version of
+ our affine_image variant.
+
+2009-09-20 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.templates.hh: Removed a temporary using sub_assign_r
+ instead of add_assign_r
+
+2009-09-20 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/bdshape1.cc: Bugs fixes
+
+2009-09-19 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Finished
+ writing a first implementation of convert_to_integer_expression and
+ convert_to_integer_expressions.
+
+2009-09-19 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh: Small progress in writing
+ convert_to_integer_expressions.
+
+2009-09-19 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Sterted
+ writing the functions that are used to convert floating point
+ constraints to integer ones.
+
+2009-09-19 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ src/Octagonal_Shape.templates.hh: Implemented methods
+ BD_Shape<T>::inhomogeneous_affine_image and
+ BD_Shape<T>::one_variable_affine_image.
+
+2009-09-19 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/math_utilities.defs.hh, src/math_utilities.inlines.hh:
+ Converted helpers to work also for native numbers.
+
+2009-09-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh: Make sure the latest changes to NDEBUG
+ effective.
+
+2009-09-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/affineimage3.cc,
+ tests/Floating_Point_Expression/bdshape1.cc,
+ tests/Floating_Point_Expression/refinelf1.cc: Added a test for
+ trivial cases of BD_Shape::affine_image.
+
+2009-09-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_nonpublic.cc: Started the implementation of our
+ affine_image variant.
+
+2009-09-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Floating_Point_Expression/refinelf1.cc: Added test for
+ Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+
+2009-09-18 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/bdshape1.cc: Added function
+ BD_Shape::affine_image(const Variable& var, const Linear_Form<
+ Interval<T, Interval_Info> >& lf); Added interfaces for auxiliary
+ functions: BD_Shape::inhomogeneous_affine_image(...); BD_Shape::one_variable_affine_image(...); BD_Shape::two_variable_affine_image(...); Added a preliminary test.
+
+2009-09-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Added a first
+ implementation of overapproximate_linear_form.
+
+2009-09-18 Francois GALEA <fgalea at verlaine.prism.uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Fixed ASCII dump/load
+ methods, solving compilation issues.
+
+2009-09-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Coverage of 100%
+ reached for refine_with_linear_form_inequality.
+
+2009-09-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added a test.
+
+2009-09-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Floating_Point_Expression/refinelf1.cc: Added missing
+ multiplications by 2. All tests now pass.
+
+2009-09-18 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Added
+ interfaces (and empty body) of two new methods.
+
+2009-09-18 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/affineimage3.cc,
+ tests/Floating_Point_Expression/refinelf1.cc: Added two more tests
+ in refinelf1.cc Improved a test in affineimage3.cc
+
+2009-09-18 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Finished parametric simplex algorithm. No cut
+ generation yet.
+
+2009-09-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Added Roberto Amadini to the list of current
+ contributors.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Pass variables to affine_image as const references.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Removed the check on
+ empty octagons in function test01.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Removed useless emptiness check.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Assert that the octagon is not
+ empty when refining, since the analyzer should not try to apply
+ filters in an unreachable state.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Do not reset strong closure
+ manually since add_octagonal_constraint already does it
+ automatically.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Always use
+ add_octagon_constraint to update contraints in
+ refine_with_linear_form_inequality instead of overwriting blindly.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Removed a bug in
+ test functions. Added a test for general case.
+
+2009-09-17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed several rounding modes in
+ Octagonal_Shape methods.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added two tests.
+ Particular cases totally covered.
+
+2009-09-17 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Temp.defs.hh, src/Temp.inlines.hh: Fixed and simplified
+ DIRTY_TEMP for use with -fno-elide-constructors.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Removed comments.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added another test.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed one nasty cut & paste
+ error.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added a test.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Use references instead of
+ pointers whenever possible.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added and modified
+ tests.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Optimized
+ refine_with_linear_form_inequality, removing six temporaries in the
+ process.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/refinelf1.cc: Added two tests.
+
+2009-09-17 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am: Start to test
+ Octagonal_Shape::refine_with_linear_form_inequality.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Removed unnecessary temporaries
+ from affine_image.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Optimized
+ linear_form_upper_bound: got rid of two unnecessary temporaries.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Definitively removed
+ counterproductive checks in linear_form_upper_bound, since we have
+ confirmed that comparing with -infinity is legitimate.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Use ROUND_DOWN instead of
+ ROUND_UP to compute the negation of the upper bound of -var.
+
+2009-09-17 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Use ROUND_UP (or, in one case
+ where intervals are involved, ROUND_DOWN) whenever appropriate.
+
+2009-09-16 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Floating_Point_Expression/affineimage3.cc: Added another test.
+ Coverage of 100% reached for affine_image and
+ linear_form_upper_bound methods. Temporarily(?) removed some checks
+ in linear_form_upper_bound.
+
+2009-09-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Fixes to avoid some useless Coefficient
+ duplicates.
+
+2009-09-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Implemented the Rational_Matrix normalize method.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox, src/Octagonal_Shape.defs.hh: Small
+ documentation improvements.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Added some comments.
+
+2009-09-16 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/affineimage3.cc: Implemented tests
+ (from test04 to test08).
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed a couple of syntax errors.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Many corrections.
+
+2009-09-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented additional
+ steps of the simplex algorithm. - handling of simplex rows with mixed parameter sign; - handling of tautology expressions; - handling of splitting a solution according to a test parametric
+ expression.
+
+2009-09-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Modified prototype for solve method in PIP_Tree_Node and derivates.
+
+2009-09-16 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Redefined and implemented
+ the tree node constructors.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Use PPL_COMPILE_TIME_CHECK
+ insteas of PPL_ASSERT whenever possible.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed one typo.
+
+2009-09-16 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Added more cases for
+ refine_linear_form_inequality.
+
+2009-09-16 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Linear_Form.templates.hh, src/Octagonal_Shape.templates.hh,
+ tests/Floating_Point_Expression/affineimage3.cc: Fixed a bug in
+ Linear_Form::operator<<() Fixed a bug in
+ Octagonal_Shape::linear_form_upper_bound() Added a test
+
+2009-09-14 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Removed garbage
+
+2009-09-16 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/affineimage3.cc: Added some tests.
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Added a first, untested implementation of
+ refine_fp_interval_abstract_store.
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: For consistency, use
+ std::numeric_limits<T>::is_exact in order to check if T is a
+ floating point type.
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Added a first implementation of
+ refine_with_linear_form_inequality. Two small optimizations for
+ affine_image.
+
+2009-09-15 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/affineimage3.cc: Added new test.
+
+2009-09-15 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented simplex pivot
+ on rational matrices.
+
+2009-09-15 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/affineimage3.cc: Added a test for
+ Octagonal_Shape::affine_image in
+ tests/Floating_Point_Expression/affineimage3.cc
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed a few typos preventing
+ compilation.
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Added missing assertion and FIXME note. Started the implementation
+ of refine_with_linear_form_inequality.
+
+2009-09-15 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: It is NECESSARY to delay the
+ update of unary constraints on var.
+
+2009-09-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/c_streambuf.defs.hh: Added missing comment.
+
+2009-09-14 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Fixed two serious bugs in
+ linear_form_upper_bound.
+
+2009-09-14 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc: Implemented the first steps of the parametric
+ simplex algorithm.
+
+2009-09-14 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh: Fixed an error introduced by
+ previous commit.
+
+2009-09-14 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.templates.hh: Added missing static_casts in
+ Linear_Form. Fixed one bug in linear_form_upper_bound. Added a
+ first complete implementation of affine_image.
+
+2009-09-14 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Changed
+ modelization of contexts from Constraint_System to Matrix.
+
+2009-09-14 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Added another helper function. Removed garbage code.
+
+2009-09-13 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Added an auxiliary method. Sorry for the huge amount of commented
+ code: it will be fixed soon.
+
+2009-09-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/marked_pointers.hh: Do not include <stdint.h>. The
+ header files <stdint.h> and/or <inttypes.h> are included by
+ ppl-config.h.
+
+2009-09-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Make sure uintptr_t is defined, if at all possible.
+
+2009-09-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: Moved the
+ constraint() method to PIP_Tree_Node class.
+
+2009-09-11 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Removed outdated FIXME note.
+
+2009-09-11 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Added other simple cases of
+ affine_image.
+
+2009-09-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added first tests in OK()
+ methods of PIP_Tree classes.
+
+2009-09-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented integer context
+ compatibility check.
+
+2009-09-11 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Implemented another case for
+ affine_image.
+
+2009-09-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented row sign
+ detection.
+
+2009-09-11 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Implemented constraint negation, plus minor fixes.
+
+2009-09-11 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Added a skeleton for the rest of
+ the affine_image implementation.
+
+2009-09-11 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Now the trivial case of
+ affine_image works.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Written a preliminary, non
+ working first part of our variant of affine_image.
+
+2009-09-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc: Improved recently added helper functions. - avoid recomputing loop bounds at each iteration; - delay object definitions until actually needed and, if possible, provide them with an initializer.
+
+2009-09-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Fix compilation problems
+ when assertions are turned on.
+
+2009-09-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Identifiers starting with
+ an underscore are reserved: avoid them.
+
+2009-09-10 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented some helper
+ functions for the PIP solver.
+
+2009-09-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS: Suggest using -fno-elide-constructors when configuring
+ for coverage.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Variable_Floating_Point_Expression.defs.hh: Fixed another
+ small documentation inconsistency.
+
+2009-09-10 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+ src/PIP_Tree.defs.hh: Integrated the solve method in the different
+ PIP_Tree node classes.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Division_Floating_Point_Expression.defs.hh: Fixed another
+ small error in the documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh: Other small
+ corrections to the documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Multiplication_Floating_Point_Expression.defs.hh: Fixed one
+ small typo.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/ppl.sty: Remove all references to floating point format f.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: More additions and
+ corrections to the documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Grammar fix in the
+ documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Fixed one small error.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Sum_Floating_Point_Expression.defs.hh: Fixed another
+ inconsistency in the documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Fixed conflicts.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Fixed an inconsistency with the rest of the
+ documentation.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Fixed a few errors.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Added missing \brief
+ marker.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Multiplication_Floating_Point_Expression.defs.hh: Use \otimes
+ only in math environment.
+
+2009-09-10 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Revised and
+ corrected the whole documentation.
+
+2009-09-10 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/linearform1.cc,
+ tests/Polyhedron/linearform1.cc: Moved linearform1.cc into
+ tests/Polyhedron.
+
+2009-09-10 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh: Updated intervalize
+ documentation; Updated Opposite_Floating_Point_Expression
+ documentation;
+
+2009-09-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh: Removed spurious
+ occurrence of a closing comment, preventing compilation.
+
+2009-09-09 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/linearform1.cc: Improved test for
+ class Linear_Form.
+
+2009-09-09 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/ppl.sty, src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh: Fixed few typo
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Division_Floating_Point_Expression.defs.hh: Fixed typo.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh: Use \infty instead
+ of \infinity.
+
+2009-09-09 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Updated
+ documentation
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh:
+ Predisposed everything to start implementing our own customized
+ version of method affine_image.
+
+2009-09-09 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Linear_Form.templates.hh,
+ tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/linearform1.cc: Fixed bug in
+ Linear_Form. Copied linearform1.cc in
+ tests/Floating_Point_Expression and improved its tests.
+
+2009-09-09 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented proper handling
+ of nonbasic variables when adding rows.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Use \defeq instead of = for definitions.
+ Fixed an error concerning frames.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Use new linearization macro.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Removed trailing whitespace.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: More documentation.
+
+2009-09-09 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh: Fixed a bug in operator==.
+
+2009-09-09 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/ppl.sty: Added new macros into doc/ppl.sty
+
+2009-09-08 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/devref.doxyconf-html.in, src/Linear_Form.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: Added Linear_Form into
+ doxyconf file Fixed few typos in Linear_Form Minor Documentations
+ updates
+
+2009-09-08 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added and
+ modified tests in order to reach the coverage of 100% in
+ Floating_Point_Expression class and its derived classes.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Fixed pedix.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox: Fixed an error in command invocation.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * doc/definitions.dox, doc/ppl.sty: Added some documentation.
+
+2009-09-08 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Update variale and
+ constant documentations
+
+2009-09-08 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/ppl.sty: Added Latex macro for abstract division.
+
+2009-09-08 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Removed
+ useless comments.
+
+2009-09-08 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added test
+ for unary minus and multiplication by constant.
+
+2009-09-08 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/ppl.sty, src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: Updated linearization
+ documentation; Added formulas to class descriptions;
+
+2009-09-08 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/ppl.sty, src/Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: Fixed documentation
+
+2009-09-08 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Moved the simplex tableau from PIP_Problem to PIP_Solution_Node.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Notify that open intervals
+ should not be allowed.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Documentation improved.
+
+2009-09-08 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Deleted
+ FIXME note.
+
+2009-09-08 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added and
+ modified some tests.
+
+2009-09-07 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Update documentation
+
+2009-09-07 Roberto Amadini <r.amadini at virgilio.it>
+
+ * src/Floating_Point_Expression.templates.hh,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed a bug
+ in method relative_error. Edited test06 to cope with the new
+ interface of method linearize.
+
+2009-09-07 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added one
+ test.
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Extended
+ method linearize to also accept a linear form abstract store.
+ Adjusted tests (but NOT YET THE DOCUMENTATION) accordingly.
+
+2009-09-07 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Documentation
+ updates
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.templates.hh: Do not ignore
+ undefined variables while intervalizing: assert that they are
+ defined instead.
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Linear_Form.templates.hh,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed a bug
+ in Linar_Form::operator== where zero coefficients were not treated
+ properly. Added a few simple tests for class
+ Floating_Point_Expression.
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added more
+ typedefs and one test.
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added two
+ simple tests.
+
+2009-09-07 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Fixed comments and
+ documentation
+
+2009-09-07 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Made absolute_error
+ constant.
+
+2009-09-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/Makefile.am: Fixed missing make dependency for recently added
+ header file.
+
+2009-09-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.templates.hh: Fixed erroneous use of
+ const&.
+
+2009-09-05 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh: Added operator/=
+ and method negate for class Linear_Form. Refactored code of class
+ Floating_Point_Exception and its derivate classes in order to avoid
+ creating unnecessary temporaries.
+
+2009-09-04 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Added more
+ documentation
+
+2009-09-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc: Corrected bug in
+ PIP_Problem::add_space_dimensions_and_embed().
+
+2009-09-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh: Corrected a couple of typos in
+ documentation of Variables_Set.
+
+2009-09-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.inlines.hh: Implemented
+ methods querying/adding space dimensions and parameters.
+
+2009-09-04 Fabio Bossi <bossi at cs.unipr.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Added
+ necessary typedefs for tests. Removed garbage.
+
+2009-09-04 François Galea <francois.galea at uvsq.fr>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh:
+ Implemented simplex basis and tableau initialization in PIP solver.
+
+2009-09-04 François Galea <francois.galea at uvsq.fr>
+
+ * doc/devref.doxyconf-html.in: Included the PIP_Problem and PIP_Tree
+ classes in the devref documentation.
+
+2009-09-04 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Division_Floating_Point_Expression.templates.hh: Added a
+ workaround for the fact that we don't have an explicit way to divide
+ a Linear_Form by an Interval.
+
+2009-09-04 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh: Fixed
+ various errors.
+
+2009-09-04 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Variable_Floating_Point_Expression.inlines.hh: Fixed bad use
+ of constructor.
+
+2009-09-04 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.templates.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh: Style
+ improvements.
+
+2009-09-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Listed François Galea among the current contributors.
+
+2009-09-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Drafted
+ implementation for ascii_dump and ascii_load methods.
+
+2009-09-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Makefile.am, tests/PIP_Problem/pipproblem.cc: Do perform
+ PIP_Problem tests first.
+
+2009-09-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh: Minor coding style improvements.
+
+2009-09-02 François Galea <francois.galea at uvsq.fr>
+
+ * configure.ac, src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+ tests/Makefile.am, tests/PIP_Problem/Makefile.am,
+ tests/PIP_Problem/pipproblem.cc: Started the implementation of the
+ PIP_Problem class. In particular: - defined the PIP_Problem constructors; - added the definition of the rational matrix class; - added the definition of simplex tableau; - created a test program.
+
+2009-09-03 Roberto Amadini <r.amadini at virgilio.it>
+
+ * tests/Floating_Point_Expression/floatingpointexpr1.cc: Deleted a
+ superfluous test.
+
+2009-09-03 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * doc/devref.doxyconf-html.in,
+ src/Constant_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Added some
+ documentation.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh: Use 0 instead of NULL.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.templates.hh: Fixed an error in
+ relative_error.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: Fixed erroneous
+ declarations of namespace std inside namespace
+ Parma_Polyhedra_Library.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh: Fixed many errors.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.templates.hh: Fixed a few typos.
+
+2009-09-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac, tests/Floating_Point_Expression/Makefile.am,
+ tests/Floating_Point_Expression/floatingpointexpr1.cc,
+ tests/Makefile.am: Added a test directory (and a dummy test file).
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Interval.defs.hh, src/Interval.inlines.hh: Added a temporary
+ implementation for external method neg_assign.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.defs.hh: Fixed inclusions.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.types.hh,
+ src/Sum_Floating_Point_Expression.types.hh: Fixed inclusion guards.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Added necessary static_cast
+ when computing absolute error.
+
+2009-09-03 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.templates.hh,
+ src/Makefile.am,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Sum_Floating_Point_Expression.templates.hh: Implemented
+ linearization operator for Division_Floating_Point_Expression.
+ Fixed several typos.
+
+2009-09-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Added Fabio Biselli to the list of current contributors.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.templates.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.templates.hh, src/Makefile.am,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.templates.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh: Added linearization
+ operator for Multiplication_Floating_Point_Expression. Several
+ other corrections and improvements.
+
+2009-09-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Added Fabio Bossi to the list of current contributors.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Division_Floating_Point_Expression.inlines.hh,
+ src/Makefile.am,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh: Removed dummy
+ linearization operators. Implemented the linearization operator for
+ Opposite_Floating_Point_Expression.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.templates.hh,
+ src/Makefile.am, src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.templates.hh: Added a few more
+ implementations of the linearization operator.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.templates.hh, src/Makefile.am: Added a
+ first implementation of the relative_error and intervalize methods.
+ Fixed a mistake with loops over linear forms. Several style
+ improvements.
+
+2009-09-02 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh: Rewritten according to
+ Enea's indications.
+
+2009-09-01 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh: Added swap functions
+ and inhibited assignment and copy constructor.
+
+2009-09-01 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh: Removed
+ trailing whitespaces.
+
+2009-09-01 Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+ * src/Difference_Floating_Point_Expression.defs.hh,
+ src/Difference_Floating_Point_Expression.inlines.hh,
+ src/Difference_Floating_Point_Expression.types.hh,
+ src/Division_Floating_Point_Expression.defs.hh,
+ src/Division_Floating_Point_Expression.inlines.hh,
+ src/Division_Floating_Point_Expression.types.hh,
+ src/Multiplication_Floating_Point_Expression.defs.hh,
+ src/Multiplication_Floating_Point_Expression.inlines.hh,
+ src/Multiplication_Floating_Point_Expression.types.hh,
+ src/Sum_Floating_Point_Expression.defs.hh,
+ src/Sum_Floating_Point_Expression.inlines.hh,
+ src/Sum_Floating_Point_Expression.types.hh: Added a few more classes
+ for floating point expressions.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh: Corrected absolute error
+ calculation to account for underflows.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh: Added static helper
+ methods and a few policy classes.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.defs.hh: Made constructors
+ explicit.
+
+2009-09-02 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh: Fixed code
+ according to Enea's indications.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Opposite_Floating_Point_Expression.inlines.hh: Added
+ destructor implementation.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Opposite_Floating_Point_Expression.inlines.hh: Fixed a typo.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh: Added swapping
+ functions.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Opposite_Floating_Point_Expression.defs.hh,
+ src/Opposite_Floating_Point_Expression.inlines.hh,
+ src/Opposite_Floating_Point_Expression.types.hh: Added the files for
+ the first (incomplete) version of class
+ Opposite_Floating_Point_Expression
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.inlines.hh: Fixed an error
+ in method linearize.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Makefile.am, src/Variable_Floating_Point_Expression.defs.hh,
+ src/Variable_Floating_Point_Expression.inlines.hh,
+ src/Variable_Floating_Point_Expression.types.hh: Added a first
+ version of class Variable_Floating_Point_Expression.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh: Corrected the
+ interface of the two-argument constructor.
+
+2009-09-01 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.defs.hh: Corrected the interface of
+ method linearize.
+
+2009-08-31 Fabio Bossi <bossi at cs.unipr.it>
+
+ * src/Constant_Floating_Point_Expression.defs.hh,
+ src/Constant_Floating_Point_Expression.inlines.hh,
+ src/Constant_Floating_Point_Expression.types.hh,
+ src/Floating_Point_Expression.defs.hh,
+ src/Floating_Point_Expression.inlines.hh,
+ src/Floating_Point_Expression.types.hh, src/Makefile.am: Added a few
+ classes that represent floating point expressions.
+
+2009-08-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: Typo fixed.
+
+2009-08-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit c9ec5bc2cb674fd20a8cdc4c85b93361428ed8e2 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Aug 18 09:57:45 2009 +0200
+
+2009-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.defs.hh: Started adjusting the documentation.
+
+2009-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+ src/Linear_Form.templates.hh: Implemented
+ Linear_Form::external_memory_in_bytes() and
+ Linear_Form::external_memory_in_bytes(). Other minor improvements.
+
+2009-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc: Do not use std::swap(): use
+ Linear_Expression::swap() instead.
+
+2009-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Form.cc, src/Linear_Form.defs.hh,
+ src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+ src/Linear_Form.types.hh, src/Makefile.am,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/linearform1.cc: Added
+ a preliminary implementation of class Linear_Form.
+
+2009-08-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc: Added missing inclusion of <iostream>.
+
+2009-08-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention correction of bug in Pointset_Powerset
+ maximize/minimize methods.
+
+2009-08-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh: Indentation fixed.
+
+2009-08-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh: Corrected a bug in
+ Pointset_Powerset methods minimize() and maximize(). We now return
+ false if the powerset is found to be empty.
+
+2009-08-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min1.cc, tests/Polyhedron/max_min1.cc,
+ tests/Powerset/maxmin1.cc: Corrected a few expected results in
+ Powerset/maxmin1.cc. This uncovered a bug in Pointset_Powerset
+ methods maximize() and minimize(), whereby we are returning true
+ even for empty powersets.
+
+2009-08-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-08-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4:
+ Useless, commented-out inclusion removed.
+
+2009-08-07 Abramo Bagnara <abramo at localhost.localdomain>
+
+ * interfaces/C/Makefile.am,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+ 4, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl.m4, utils/cm_cleaner.sh, utils/cm_splitter.sh: Modified
+ cm_splitter machinery to avoid use of 'read' shell builtin.
+
+2009-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention a bug that was recently corrected.
+
+2009-08-07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc, tests/Polyhedron/polyhullifexact2.cc:
+ Corrected implementation of
+ NNC_Polyhedron::upper_bound_assign_if_exact(). Added a few tests
+ for regression checking.
+
+2009-08-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_prolog_generated_test.pl: Make sure a
+ definition for member/2 and append/3 is available.
+
+2009-08-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4: Removed useless, temporary addition of
+ -lm to LIBS. (Thanks to Joseph Prostko.)
+
+2009-08-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Checks reordered.
+
+2009-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Use AC_SEARCH_LIBS to detect whether -lm must be
+ provided to the linker. (Thanks to Joseph Prostko.)
+
+2009-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am: Do not add -lm to LDADD for
+ *randphull1.
+
+2009-08-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am: Do not link with -lm here.
+
+2009-07-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, interfaces/Prolog/YAP/Makefile.am,
+ m4/ac_check_yap.m4: Improved and generalized the detection of YAP.
+
+2009-07-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, Watchdog/INSTALL: Updated from Autoconf 2.64.
+
+2009-07-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-07-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4: On Windows, the console version of
+ SWI-Prolog is called `plcon'.
+
+2009-07-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/weightwatch1.cc: Adjusted weight thresholds.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Debugging prints improved.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Weights adjusted. Added more debugging
+ prints.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc: More weights adjusted. Added a couple of
+ debugging prints.
+
+2009-07-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Added printing of MIP solver recursion level
+ for (noisy) debugging.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh, src/MIP_Problem.cc: Added some weights.
+ Added some debugging prints.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Todo items reorganized. Removed the one about NOT_EQUAL.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-07-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P: The *_and_minimize/N
+ predicates have gone: remove residual references to them.
+
+2009-07-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Added WEIGHT_BEGIN and corrected
+ WEIGHT_ADD_MUL macro.
+
+2009-07-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Added WEIGHT_BEGIN() macros and reset a few
+ weights.
+
+2009-07-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/conversion.cc, src/globals.defs.hh: Added profiled weights.
+
+2009-07-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Modified computational weight for
+ propagate_constraints.
+
+2009-07-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Added tentative computational weights to
+ MIP_Problem.
+
+2009-07-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/conversion.cc: Fixed WEIGHT_ADD use.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc: WEIGHT_ADD moved.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/globals.inlines.hh: Removed forgotten WEIGHT_ADD.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Weight_Profiler.cc: Don't compile Weight_Profiler if it's not
+ used.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Weight_Profiler.defs.hh: Minor formatting improvements.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc: Use less simplistic weights.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assert.hh: Comment improved.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Threshold_Watcher.defs.hh: Added additional info
+ about Traits template parameter.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Weight_Profiler.defs.hh, src/globals.defs.hh,
+ src/globals.inlines.hh: Converted weight threshold to unsigned long
+ long.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Box.templates.hh, src/MIP_Problem.cc, src/Makefile.am,
+ src/Weight_Profiler.cc, src/Weight_Profiler.defs.hh, src/assert.hh,
+ src/conversion.cc, src/globals.defs.hh, src/globals.inlines.hh:
+ Added weight profiler
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/test1.ml: In the Ocaml tests, timeouts are
+ now reset unconditionally.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh: Drafted a few missing comments. To
+ be completed (by the author).
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Box.defs.hh,
+ src/Octagonal_Shape.defs.hh: Added the documentation of some
+ parameters.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh: Doxygen reference fixed.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh, src/Grid.defs.hh,
+ src/Polyhedron.defs.hh: Fixed several documentation bugs signalled
+ by Doxygen.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/assert.hh: Removed repeated declaration.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/assert.hh, src/globals.cc, src/globals.inlines.hh: Moved
+ in_assert in Implementation namespace.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Warnings avoided.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh: Warnings avoided.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc: Spurious parenthesis removed.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Announced availability of the deterministic timeout
+ facilities.
+
+2009-07-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Affine_Space.cc, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+ src/Bit_Row.inlines.hh, src/Bool4.defs.hh, src/Boundary.defs.hh,
+ src/Box.cc, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Box_Status.inlines.hh, src/C_Polyhedron.cc,
+ src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+ src/Circular_Interval.defs.hh, src/Coefficient.cc,
+ src/Coefficient.inlines.hh, src/Congruence.cc,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.inlines.hh, src/Constraint.cc,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Float.defs.hh,
+ src/GMP_Integer.inlines.hh, src/Generator.cc,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Generator_System.inlines.hh, src/Grid.inlines.hh,
+ src/Grid.templates.hh, src/Grid_Certificate.cc,
+ src/Grid_Certificate.defs.hh, src/Grid_Certificate.inlines.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.inlines.hh,
+ src/Grid_Status.cc, src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.templates.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.inlines.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.inlines.hh,
+ src/NNC_Polyhedron.cc, src/OR_Matrix.inlines.hh,
+ src/OR_Matrix.templates.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.inlines.hh, src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Gen_Relation.cc, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Ptr_Iterator.inlines.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+ src/Row.inlines.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.inlines.hh, src/Widening_Function.inlines.hh,
+ src/algorithms.hh, src/assert.hh, src/checked.inlines.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/conversion.cc, src/globals.cc,
+ src/globals.inlines.hh, src/initializer.hh, src/intervals.defs.hh,
+ src/math_utilities.inlines.hh, src/minimize.cc, src/ppl_header.hh,
+ src/simplify.cc, src/wrap_assign.hh: Converted assert in PPL_ASSERT.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh, src/Octagonal_Shape.inlines.hh: A couple
+ of minor doxygen documentation corrections.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Added determinisitc timeout
+ functionality to the Ocaml interface.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java: Added
+ deterministic timeout functionality to the Java language interface.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/weightwatch1.cc: Weightwatch test fixed so as to
+ behave properly under arithmetic overflows.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh: Added deterministic
+ timeout predicates to the Prolog language interface.
+
+2009-07-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh: Now we
+ throw/catch ad hoc exceptions for deterministic timeouts.
+
+2009-07-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/weightwatch1.cc: These tests fail also with
+ 32-bit coefficients.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README.configure, TODO, m4/ac_check_gmp.m4: New configure
+ option --with-gmp-prefix supersedes the (now removed) options
+ --with-libgmp-prefix and --with-libgmpxx-prefix.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/weightwatch1.cc: These tests fail also with
+ 16-bit coefficients.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh: Private typedef
+ renamed.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh: Removed spurious blank line.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh: Comment improved.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/NEWS: Drafted the news for PWL 0.8.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Unused temp removed.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc: Warnings avoided.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in: Fixed INPUT variable in
+ Doxygen configuration for devref.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/README, Watchdog/configure.ac, Watchdog/src/Makefile.am:
+ Updated for PWL 0.8.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/weightwatch1.cc: These tests fail with 8-bit
+ coefficients.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am, interfaces/C/tests/weightwatch1.c:
+ Added a test for deterministic timeouts in the C language interface.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc, src/globals.types.hh:
+ The deterministic timeout facilities are in the C language
+ interface.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc: Got rid of the REACTIVE_ABANDONING macro. It
+ was controlling tests whose cost is negligible, and defining it to 0
+ we would not honor what we promise in the documentation of
+ abandon_expensive_computations.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Force rebuild.
+
+2009-07-12 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * TODO, Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Watchdog.inlines.hh: Converted watchdog time argument
+ to unsigned.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Item improved.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Synchronized with the current reality.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/lib-link.m4, m4/lib-link.m4: Updated.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac: Require Automake 1.11, enable lzma tar
+ archives and silent rules.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh,
+ tests/Polyhedron/weightwatch1.cc: Avoid dummy parameter in
+ constructor for Threshold_Watcher::Initialize. Renamed `initialize'
+ to `init' to avoid visual clash with `Initialize'.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, Watchdog/INSTALL, Watchdog/compile,
+ Watchdog/config.guess, Watchdog/config.sub, Watchdog/depcomp,
+ Watchdog/install-sh, Watchdog/missing, Watchdog/mkinstalldirs,
+ compile, config.guess, config.sub, depcomp, install-sh, missing,
+ mkinstalldirs: Updated.
+
+2009-07-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Require Automake 1.11, enable lzma tar archives and
+ silent rules.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am, tests/Polyhedron/weightwatch1.cc:
+ Added a first test for the deterministic timeout.
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh: Added
+ Weightwatch_Traits class (from Abramo). Modified maybe_abandon().
+
+2009-07-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/EList.defs.hh, Watchdog/src/Threshold_Watcher.cc,
+ Watchdog/src/Threshold_Watcher.defs.hh,
+ Watchdog/src/Threshold_Watcher.templates.hh,
+ Watchdog/src/Threshold_Watcher.types.hh: Minor improvements: prefer
+ direct header file inclusions to indirect ones. Avoid unnecessarily
+ long lines.
+
+2009-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Makefile.am, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/{Weightwatch.cc =>
+ Threshold_Watcher.cc}, Watchdog/src/{Weightwatch.defs.hh =>
+ Threshold_Watcher.defs.hh}, Watchdog/src/{Weightwatch.inlines.hh =>
+ Threshold_Watcher.inlines.hh},
+ Watchdog/src/{Weightwatch.templates.hh =>
+ Threshold_Watcher.templates.hh}, Watchdog/src/{Weightwatch.types.hh
+ => Threshold_Watcher.types.hh}, Watchdog/src/Watchdog.defs.hh:
+ Converted Weightwatch in more generic Threshold_Watcher.
+
+2009-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Weightwatch.inlines.hh: Fixed typo.
+
+2009-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Weightwatch.cc: Forgotten file.
+
+2009-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Makefile.am, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.templates.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+ Watchdog/src/Weightwatch.inlines.hh,
+ Watchdog/src/Weightwatch.templates.hh,
+ Watchdog/src/Weightwatch.types.hh: Weightwatch are now generic
+ threshold watchdog.
+
+2009-07-11 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+ Watchdog/src/Weightwatch.inlines.hh: Weightwatch are now independent
+ from client code.
+
+2009-07-10 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * Watchdog/src/EList.inlines.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh, Watchdog/src/{Pending_List.cc
+ => Pending_List.templates.hh}, Watchdog/src/Pending_List.types.hh,
+ Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+ Watchdog/src/Weightwatch.inlines.hh,
+ Watchdog/src/Weightwatch.types.hh: Added Weightwatch.
+
+2009-07-10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Fixed a (potential)
+ exception safety bug in class MIP_Problem. Added an helper class
+ (implementing RAII technique) to safely relax a MIP problem into an
+ LP problem and ensure that integer variables are restored even in
+ the presence of exceptional execution paths. Improved interface
+ (and a few comments) for private methods dealing with MIP
+ optimization and satisfiability.
+
+2009-07-09 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Box/congruences1.cc: Corrected test as already corrected in
+ the master branch.
+
+2009-06-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.defs.hh: Space dimensions cannot change status:
+ they are either vars or parameters.
+
+2009-06-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: The `gprolog' and `yap' packages are not
+ available on the sparc64 and sparcv9 architectures: so do
+ `ppl-gprolog', `ppl-gprolog-static' and `ppl-yap'.
+
+2009-06-18 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py: Added
+ proof of concept for Python interface.
+
+2009-06-19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: The `gprolog' and `yap' packages are not
+ available on the sparc64 and sparcv9 architectures: so do
+ `ppl-gprolog', `ppl-gprolog-static' and `ppl-yap'.
+
+2009-06-18 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py: Added
+ proof of concept for Python interface.
+
+2009-06-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/PIP_Tree.inlines.hh: Added implementation of child accessors.
+
+2009-06-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/PIP_Tree.defs.hh: Fixed typo.
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: Added accessors of PIP_Solution_Node. Other
+ improvements.
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.defs.hh: Include "globals.defs.hh"
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Problem.defs.hh: Include "PIP_Tree.defs.hh".
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am, src/PIP_Problem.defs.hh,
+ src/PIP_Problem.inlines.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh:
+ Added constructors and comments.
+
+2009-06-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh,
+ src/PIP_Tree.defs.hh: Initial draft fo rinterface improved. Removed
+ control parameters; removed UNBOUND status; renamed a few methods;
+ let PIP_Tree be an alias for a pointer to a _const_ PIP_Tree_Node.
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh: More comments added. Some
+ fields renamed.
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am, src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+ src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh: Added
+ comments and more infrastructure.
+
+2009-06-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh:
+ Added draft PIP_Tree implementation.
+
+2009-06-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PIP_Problem.defs.hh: Got rid of objective function and
+ optimization mode.
+
+2009-06-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh: Blatantly
+ ripped from MIP_Problem.*.hh.
+
+2009-06-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS: Using the bug tracking system is now the recommended way to
+ report PPL issues.
+
+2009-05-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog_sysindep_dox: Typos fixed.
+
+2009-06-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS: Added explanation on the use of lcov to produce
+ coverage information.
+
+2009-06-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac: Add -lgcov to extra_libraries when configuring with
+ coverage enabled. Fixes a link bug when trying to compute coverage
+ for the OCaml interface tests.
+
+2009-06-10 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Box.templates.hh: Avoid unused variable warning when
+ assertions are not enabled.
+
+2009-06-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4: In the Java tests, be more systematic in the use of method
+ free().
+
+2009-06-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a: Interface for Java class Linear_Expression_Times improved. The
+ misleading methods left_hand_side() and right_hand_side() replaced
+ by: public Coefficient coefficient(); and public Linear_Expression linear_expression(); returing the two
+ object factors using clearer naming.
+
+2009-05-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh, src/Box.templates.hh,
+ src/Octagonal_Shape.templates.hh: Further improvements to
+ frequency() code.
+
+2009-05-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Code
+ for frequency() improved.
+
+2009-05-24 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/shapepreservingproduct1.cc: A new
+ product called Shape_Preserving_Product added.
+
+2009-05-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Affine_Space.defs.hh, src/Affine_Space.inlines.hh: The method
+ frequency() added to the Affine_Space domain.
+
+2009-05-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/Octagonal_Shape/frequency1.cc: Bug in frequency() for
+ Octagonal shapes fixed.
+
+2009-05-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Box.defs.hh, src/Box.templates.hh, tests/Box/Makefile.am,
+ tests/Box/frequency1.cc: Added the method frequency() to the Box
+ domain.
+
+2009-05-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.templates.hh,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/frequency1.cc: Added the method frequency() to
+ the Octagonal shape domain. Improved the code for the same method for BD shapes. Corrected some typos in comments in these files.
+
+2009-05-21 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/frequency1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/frequency1.cc: Added
+ method frequency() to the Polyhedron and BD Shape domains. This corresponds to the method frequency() already added to the Grid
+ domain. For these domains it checks if the expression has a constant value
+ and if so, returns true and gives the value (with frequency 0).
+ Otherwise it returns false.
+
+2009-05-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/wrap2.cc: Test test02() overflows with 16 bit
+ checked integers.
+
+2009-05-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh: Added a warning about non-integrality for
+ wrap_assign(). Previous reverted commit which had the same message was wrongly done
+ in the products branch.
+
+2009-05-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh: Revert "Added a warning about non-integrality
+ for wrap_assign()." This reverts commit 6b9f28ad503f1d43da7a876c4bee7eae9eba185a.
+
+2009-05-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh: Added a warning about non-integrality for
+ wrap_assign().
+
+2009-05-20 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc: Some tests are
+ expected to fail with 8-bit integers.
+
+2009-05-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Result.defs.hh, src/globals.types.hh: Non-standard commas
+ removed.
+
+2009-05-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc: Removed
+ redundant test files.
+
+2009-05-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/addcongruences1.cc,
+ tests/Partially_Reduced_Product/addconstraints1.cc,
+ tests/Partially_Reduced_Product/affineimage1.cc,
+ tests/Partially_Reduced_Product/bounded1.cc,
+ tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+ tests/Partially_Reduced_Product/bounds1.cc,
+ tests/Partially_Reduced_Product/concatenate1.cc,
+ tests/Partially_Reduced_Product/congruences1.cc,
+ tests/Partially_Reduced_Product/constraints1.cc,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/contains1.cc,
+ tests/Partially_Reduced_Product/difference1.cc,
+ tests/Partially_Reduced_Product/dimension1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/discrete1.cc,
+ tests/Partially_Reduced_Product/disjoint1.cc,
+ tests/Partially_Reduced_Product/equals1.cc,
+ tests/Partially_Reduced_Product/frombdshape1.cc,
+ tests/Partially_Reduced_Product/frombox1.cc,
+ tests/Partially_Reduced_Product/fromgrid1.cc,
+ tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+ tests/Partially_Reduced_Product/frompolyhedron1.cc,
+ tests/Partially_Reduced_Product/fromproduct1.cc,
+ tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+ tests/Partially_Reduced_Product/intersection1.cc,
+ tests/Partially_Reduced_Product/isempty1.cc,
+ tests/Partially_Reduced_Product/isuniverse1.cc,
+ tests/Partially_Reduced_Product/maxmin1.cc,
+ tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+ tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+ tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+ tests/Partially_Reduced_Product/relations1.cc,
+ tests/Partially_Reduced_Product/smashproduct1.cc,
+ tests/Partially_Reduced_Product/spacedims1.cc,
+ tests/Partially_Reduced_Product/timeelapse1.cc,
+ tests/Partially_Reduced_Product/topclosed1.cc,
+ tests/Partially_Reduced_Product/topclosure1.cc,
+ tests/Partially_Reduced_Product/upperbound1.cc,
+ tests/Partially_Reduced_Product/widening1.cc: Revised the tests so
+ as to follow the organization for other domains. Apart from the operation tests, there are specific tests for each
+ reduction operator. Selected tests (in the Makefile) can be checked with the given
+ component order and with the component domains reversed.
+
+2009-05-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: Corrected a typo in the known result of
+ a wrap_assign test. (Please, double check that it was indeed a typo.)
+
+2009-05-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * : commit f184d82d2e3105d671a089a1302ed6dff993a395 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Tue May 19 07:40:39 2009 +0100
+
+2009-05-18 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_float.inlines.hh: Fixed omitted renaming.
+
+2009-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+ 4, interfaces/Java/tests/ppl_java_tests_common: The generated Java
+ tests now exploit the Test_Executor class functionality. Added an
+ helper function to set global success flag and report success or
+ failure if in noisy mode. NOTE: we are still (just) checking for
+ the well formedness of the object (using method OK()), rather than
+ checking if the computed result is actually the same of th expected
+ one. However, due to genericity, it is quite difficult to precisely
+ state expectations in these tests.
+
+2009-05-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Box/congruences1.cc: When the congruences have inconsistent
+ equalities, the box is set empty.
+
+2009-05-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Box/congruences1.cc: The refine_with_congrueces() detects
+ inconsistent equalities.
+
+2009-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+ interfaces/Java/tests/Test_Executor.java: Started adapting the Java
+ tests to make better use of class Test_Executor.
+
+2009-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit badd595a0c22e91f4f1653ff8c7d53a3bf15ec50 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Mon May 18 12:05:10 2009 +0100
+
+2009-05-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh:
+ Improved the relation_with(Congruence) implementation for the weakly
+ relational domains.
+
+2009-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am, tests/Polyhedron/wrap1.cc,
+ tests/Polyhedron/wrap2.cc: New tests for Polyhedron::wrap_assign().
+
+2009-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/wrap1.cc: Known result for test03() corrected; test now
+ marked to succeed.
+
+2009-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, tests/Box/wrap1.cc: First draft of
+ Box::wrap_assign() is now operational. Added a few tests.
+
+2009-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Fixed a bug in
+ wrap_assign_col().
+
+2009-05-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: Added a test showing a bug in
+ wrap_assign when wrap_individually == false. Test is test20(),
+ temporarily marked as an expected failure.
+
+2009-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: 8-bit coefficients are now enough for
+ test07().
+
+2009-05-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Box.defs.hh, src/Box.templates.hh,
+ src/Grid.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh: Added declarations and stub implementations
+ for drop_some_non_integer_points().
+
+2009-05-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox, src/globals.types.hh: Finished the
+ documentation about the wrapping operator.
+
+2009-05-17 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/wrap_assign.hh: Rounding direction is not relevant here.
+
+2009-05-17 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.inlines.hh, src/checked_float.inlines.hh: Get rid of a
+ comparison warning.
+
+2009-05-17 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/wrap_assign.hh: Simplified code.
+
+2009-05-17 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc: After the
+ affine (pre)image operations, unset the reduced flag.
+
+2009-05-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Added more in the section about the wrapping
+ operator.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox, src/globals.types.hh: More work on the
+ documentation of approximations for bounded integer arithmetic.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+ src/Box.templates.hh, src/Grid.defs.hh, src/Grid_public.cc,
+ src/Interval.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_public.cc, src/globals.types.hh, src/wrap_assign.hh:
+ Bounded_Integer_Type_Signedness renamed
+ Bounded_Integer_Type_Representation.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh: Comments improved.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Started writing the section on approximating
+ bounded arithmetic.
+
+2009-05-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron_public.cc: Further cleaning of
+ relation_with(Congruence) implementations.
+
+2009-05-16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl: Improved a few timeout and
+ exception tests. Make sure an out_of_memory exception is thrown as
+ expected even when a large amount of memory is available. Do not set
+ timeouts out of catch constructs.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: test19() must fail with 8-bit
+ coefficients.
+
+2009-05-16 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/Box/propagateconstraints2.cc: These tests fails with 16 bit
+ coefficients.
+
+2009-05-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Item removed: no big deal.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/closure1.cc: The test fails also with 32 bit
+ coefficients.
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh: FIXME resolved.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/Box/propagateconstraints2.cc: The test fails also with 32
+ bit coefficients.
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh, tests/Box/wrap1.cc, tests/Polyhedron/wrap1.cc:
+ Fixed the generic implementation of wrap_assign().
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/math_utilities.inlines.hh: A strict relation info is required
+ here too.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Octagonal_Shape.templates.hh: A strict relation info is
+ required here.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_float.inlines.hh: Fixed a typo.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Added an
+ assert(false) for unreachable code.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.inlines.hh: Avoid two warnings.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Boundary.defs.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/checked.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_mpz.inlines.hh,
+ src/intervals.defs.hh: Renamed and commented ROUND_STRICT_RELATION.
+ Added some use of it. Added some optimizations when ROUND_NOT_NEEDED
+ is specified.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Improved method
+ Polyhedron::relation_with(const Congruence&) const. Avoided several
+ temporary objects; added a FIXME asking for the rounding mode.
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh: Fixed the invocation of the generic
+ implementation of wrap_assign().
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh: Check that all variables upon which `*pcs'
+ depends are in `vars'. An assertion is violated otherwise.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Several improvements to
+ Octagonal_Shape<T>::relation_with(const Congruence&). Alaso added a
+ couple of FIXME regarding missing comments and rounding modes.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc: Corrected typo in
+ explanatory output.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox: Minor improvement.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Fixed
+ rounding.
+
+2009-05-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+ src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Changed the
+ specification of wrap_assign(). If `*pcs' depends on variables not
+ in `vars', the behavior is undefined. We perform only the quick
+ test on space dimensions. In debugging mode we will check the
+ condition thoroughly.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Octagonal_Shape.templates.hh: Simplified a rounded assignment.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.inlines.hh, src/Rounding_Dir.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Permits to
+ low level code to take benefits from knowing that result will be
+ exact.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/closure1.cc: Test fails with an overflow using 8
+ bit coefficients.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.inlines.hh: Enable DEBUG_ROUND_NOT_NEEDED when
+ assertions are enabled.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/Box/propagateconstraints2.cc: Two tests fail with an
+ overflow using 8 bit coefficients.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Rounding_Dir.defs.hh: Improved comment for ROUND_NOT_NEEDED.
+
+2009-05-15 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ src/Checked_Number.inlines.hh: Fixed DEBUG_ROUND_NOT_NEEDED.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/wrap1.cc: Let the wrap_assign tests succeed until the
+ specification is clarified.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Added a note about the use of `assign' helper
+ functions.
+
+2009-05-15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: When wrapping no variable, do not ignore the
+ optional constraint system.
+
+2009-05-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java: Added a
+ few missing accessor methods to Java interface classes. Affected
+ classes are Congruence, Generator and Grid_Generator.
+
+2009-05-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/ppl_test.cc, tests/ppl_test.hh: Added two tests based on the
+ examples 5(a), 5(b) in SenS07. Added print_constraints(const Affine_Space&) to ppl_test.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Fixed the bug
+ witnessed by test15().
+
+2009-05-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO, src/MIP_Problem.cc: Partially reverted changes
+ 71e9992afa9bc049b93d0b29fd9dbe52ead850cf. The changes were not
+ working on platforms where floating point rounding mode could not be
+ set (e.g., ARM), even though rounding control is not actually
+ needed.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: Temporarily marked test15() and
+ test16() as expected to fail.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh: Last commit partly undone.
+
+2009-05-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/wrap_assign.hh, tests/Box/wrap1.cc, tests/Polyhedron/wrap1.cc:
+ Adapted generic implementation of wrap_assign to model the rational
+ case. Also added a couple of tests showing problems in the current
+ implementation.
+
+2009-05-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh, src/Box.templates.hh: Use PPL_DIRTY_TEMP for
+ temporary objects. Also corrected a type causing an assertion
+ failure.
+
+2009-05-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh: Added missing clear.
+
+2009-05-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Boundary.defs.hh: Fixed typo.
+
+2009-05-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh, src/Box.templates.hh, src/Interval.defs.hh:
+ Some progress on Box::wrap_assign(). Corrected a couple of typos in
+ Interval::wrap_assign(). Silenced an annoying GCC warning.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/WRD_coefficient_types.defs.hh, src/checked.inlines.hh: Commits
+ improved.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 6c8a266be0f01266599542b7cdc3d3c2a47e62d2 Author: Abramo
+ Bagnara <abramo.bagnara at gmail.com> Date: Thu May 14 09:41:30 2009
+ +0200
+
+2009-05-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/Box/frombox1.cc: Added missing policy.
+
+2009-05-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Grid/frequency1.cc: Added new method frequency() for Grids.
+
+2009-05-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.cc, src/Checked_Number.inlines.hh,
+ src/Result.defs.hh: Added missing Result values.
+
+2009-05-14 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh: Fixed some typos.
+
+2009-05-14 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/Makefile.am:
+ Added new method frequency() for Grids.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh: New policy
+ Debug_WRD_Extended_Number_Policy. This is the debugging policy for
+ checked numbers used in weakly-relational domains.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/WRD_coefficient_types.defs.hh: WRD_Extended_Number_Policy
+ properly commented.
+
+2009-05-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/wrap1.cc: Marked tests that are expected to fail with
+ 8-bit coefficients.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh: Added wrap_assign.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/checked.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh: Added
+ add_2exp and sub_2exp.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh: Added missing info clearing.
+
+2009-05-13 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox, src/Determinate.defs.hh, src/Grid.defs.hh,
+ src/Partially_Reduced_Product.defs.hh: Removed repeated
+ specification of operators in the grids section. Ensure cross-references to these sections now refer to the
+ equivalent sections for polyhedra. Fixed a typo in src/Determinate.defs.hh that caused a warning when
+ compiling the documentation.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Makefile.am,
+ src/Octagonal_Shape.defs.hh, src/WRD_coefficient_types.defs.hh,
+ src/WRD_coefficient_types.inlines.hh: Coefficient types of
+ weakly-relational domains moved to new source files.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.types.hh: Comment fixed.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.types.hh: Got rid of
+ Checked_Number_Default_Policy.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.inlines.hh:
+ Bounded_Integer_Coefficient_Policy::handle_result() commented.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.inlines.hh: Also check for NaN in
+ Bounded_Integer_Coefficient_Policy::handle_result().
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh, src/Coefficient.types.hh,
+ src/checked.defs.hh, src/checked_float.inlines.hh: Checked number
+ policy parameter `check_nan_result' renamed `fpu_check_nan_result'.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.defs.hh: Fixed return type.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Use Bounded_Integer_Coefficient_Policy as the policy
+ for checked coefficients.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.inlines.hh, src/Coefficient.types.hh: Added
+ Bounded_Integer_Coefficient_Policy.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.defs.hh: Checked_Number_Transparent_Policy properly
+ commented.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.defs.hh: Fixed topological closure for unbounded
+ intervals.
+
+2009-05-13 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Boundary.defs.hh, src/Box.templates.hh,
+ src/Checked_Number.cc, src/Checked_Number.inlines.hh,
+ src/Circular_Interval.defs.hh, src/DB_Matrix.templates.hh,
+ src/Interval.defs.hh, src/Interval.templates.hh,
+ src/OR_Matrix.templates.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/intervals.defs.hh, tests/Polyhedron/numberinput1.cc: Reorganized
+ and separated Result classes to be more informative.
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit c8cbb00f29ac4c0d48daf14a9a9d3b93e559e207 Author: Patricia
+ Hill <p.m.hill at leeds.ac.uk> Date: Wed May 13 09:21:47 2009 +0100
+
+2009-05-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: AC_CHECK_GMP fixed.
+
+2009-05-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Added a commit to consider should we release PPL 0.10.3.
+
+2009-05-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README.configure, m4/ac_check_gmp.m4: New configuration
+ option `--with-gmp-build=DIR'. This allows to use a non-installed
+ build of GMP in DIR.
+
+2009-05-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct6.cc: Known result
+ adapted to increased Box constructor precision.
+
+2009-05-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO, tests/Box/frompolyhedron1.cc: Another TODO item dealt with.
+ Adapted another few known results according to increased precision.
+
+2009-05-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Added a section on commits to consider should we release PPL
+ 0.10.3.
+
+2009-05-12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ tests/Box/frompolyhedron2.cc, tests/Box/refinewithconstraint1.cc,
+ tests/Powerset/frompolyhedron1.cc: Method Box::refine_with is now
+ based on (single step) constraint propagation. Method
+ Box::propagate_constraints now also take as input a parameter for
+ specifying the maximum number of iterations (default value 0). The
+ constructor of a Box from a Polyhedron in polynomial time sets this
+ parameter to a constant. The known result of several tests adapted
+ to match the increased precision.
+
+2009-05-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox, src/Grid_public.cc: Improved documentation
+ and small efficiency improvement to the code.
+
+2009-05-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am: We cannot test the Java
+ interface unless ENABLE_SHARED.
+
+2009-05-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid_public.cc: Another efficiency improvement to
+ wrap_assign().
+
+2009-05-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid_public.cc: Some efficiency improvements. Comments
+ improved.
+
+2009-05-12 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Boundary.defs.hh: Added smod_2exp and umod_2exp for boundary.
+
+2009-05-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: Updated from
+ Gnulib.
+
+2009-05-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc:
+ Simplification and improvement of code for wrap_assign(). The bounds_no_check() and frequency_no_check() assume the generators
+ are minimized and the grid is not empty.
+
+2009-05-12 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox, src/Grid_public.cc: Several improvements for
+ the wrap_assign() operator for grids.
+
+2009-05-11 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/wrap1.cc:
+ Improved code for wrap_assign() for grids for constant values. If the value for a variable is already constant, and the constant is
+ outside the range for the bounded integr type, then the outcome
+ depends on the kind of overflow: - if `impossible', then the grid is set empty; - if `undefined', then the variable is set to take any integral
+ value; - if `wraps', then the value is wrapped by the wrap_frequency to a value in the range for the bounded integer type. Comments improved.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO: Another item dealt with.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/tests/pl_check.pl: Parameter irrational_precision
+ made available in all language interfaces.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Init.cc, src/checked.cc, src/checked_mpq.inlines.hh: Renamed
+ rational_sqrt_precision_parameter to irrational_precision.
+
+2009-05-11 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Grid/wrap1.cc: Several tests are expected to fail for
+ checked-in8.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc: Do not test for result dependent
+ on floating point steepest edge heuristics.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Avoid unnecessary unbounded precision value in
+ floating point steepest edge.
+
+2009-05-11 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * doc/definitions.dox: Added a _draft_ description of the wrap
+ operator for grids.
+
+2009-05-11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO, src/MIP_Problem.cc: Got rid of a TODO item. Also avoid an
+ annoying warning about an uninitialized variable.
+
+2009-05-11 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc: Redid
+ the intended changes for the last commit for wrap_assign().
+
+2009-05-11 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc,
+ tests/Grid/wrap1.cc: Improved wrap_assign() for grids. Added private methods bounds_no_check() and frequency_no_check().
+
+2009-05-10 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Rounding_Dir.inlines.hh, src/checked.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh: Added umod_2exp and smod_2exp to checked
+ numbers. Fixed rem for mpq to work similarly to other numeric types.
+
+2009-05-09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/wrap_assign.hh, tests/Box/Makefile.am, tests/Box/wrap1.cc:
+ Drafted specialized implementation for Box<ITV>::wrap_assign. Code
+ still commented out as it relies on a missing Interval method.
+
+2009-05-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Use the appropriate
+ throw_dimension_incompatible() method in wrap_assign().
+
+2009-05-07 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/Makefile.am,
+ tests/Grid/wrap1.cc: Added draft implementation for wrap_assign()
+ for the grid domain.
+
+2009-05-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS, interfaces/C/ppl_c_header.h,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test2.java: Added
+ basic timeout support to the Java library interface.
+
+2009-05-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh: Fixed result check for
+ ThrowNew.
+
+2009-05-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: test03() fails also with 16-bit
+ coefficients when assertions are enabled.
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: test07() only fails if assertions are
+ enabled.
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.cc, src/BD_Shape.templates.hh,
+ src/Checked_Number.templates.hh, src/Grid_public.cc,
+ src/Interval_Info.defs.hh, src/MIP_Problem.cc,
+ src/OR_Matrix.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/Box/affinedimension1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Polyhedron/dualhypercubes.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/relations1.cc:
+ Spurious parentheses removed.
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 317f48d0d55391b07624e0f55a6228e3b2d39d6f Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue May 5 19:20:33 2009 +0200
+
+2009-05-05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/tests/Makefile.am, interfaces/C/tests/watchdog1.c:
+ Added basic timeout support to the C library interface.
+
+2009-05-05 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Box.templates.hh: Fixed typo on assertion.
+
+2009-05-05 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Prolog/ppl_prolog_common.cc, src/Bool4.defs.hh,
+ src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Circular_Interval.defs.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval_Info.defs.hh,
+ src/Makefile.am, src/Rational_Interval.hh, src/Result.defs.hh,
+ src/globals.types.hh, src/intervals.defs.hh: Added Circular Integer
+ intervals.
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/COW_Pointset.defs.hh, tests/Grid/approximatepartition1.cc,
+ tests/Grid/powersetdifference1.cc: Method COW_Pointset::element()
+ renamed pointset().
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linearpartition1.cc: Method
+ COW_Pointset::element() renamed pointset().
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc: Indentation and comments fixed.
+
+2009-05-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc: Method COW_Pointset::element() renamed
+ pointset().
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ src/COW_Pointset.defs.hh, src/COW_Pointset.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.templates.hh,
+ src/algorithms.hh, tests/Powerset/affinedimension1.cc,
+ tests/Powerset/affineimage1.cc, tests/Powerset/affinepreimage1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/frombdshape1.cc, tests/Powerset/frombox1.cc,
+ tests/Powerset/fromgrid1.cc, tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc, tests/Powerset/refinewith1.cc,
+ tests/Powerset/simplifyusingcontext1.cc: Method
+ COW_Pointset::element() renamed pointset(). Comments improved.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: test02() and test09() fail also with
+ 16-bit coefficients.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh, src/Any_Pointset.defs.hh,
+ src/BD_Shape.defs.hh, src/Bit_Matrix.defs.hh, src/Bit_Row.defs.hh,
+ src/Box.defs.hh, src/Box_Status.idefs.hh, src/C_Polyhedron.defs.hh,
+ src/Checked_Number.defs.hh, src/Congruence.defs.hh,
+ src/Congruence_System.defs.hh, src/Constraint.defs.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/DB_Matrix.defs.hh, src/Generator.defs.hh,
+ src/Generator_System.defs.hh, src/Grid.defs.hh,
+ src/Grid_Generator.defs.hh, src/Grid_Generator_System.defs.hh,
+ src/Linear_Expression.defs.hh, src/Linear_System.defs.hh,
+ src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+ src/NNC_Polyhedron.defs.hh, src/OR_Matrix.defs.hh,
+ src/Octagonal_Shape.defs.hh, src/Partially_Reduced_Product.defs.hh,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.defs.hh,
+ src/Polyhedron.defs.hh, src/Ptr_Iterator.defs.hh: Systematically
+ write "copy constructor" instead of "copy-constructor." (The verb is
+ "to copy-construct" though.)
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, src/{Determinate.defs.hh => COW_Pointset.defs.hh},
+ src/{Determinate.inlines.hh => COW_Pointset.inlines.hh},
+ src/{Determinate.types.hh => COW_Pointset.types.hh},
+ src/Makefile.am, src/Pointset_Ask_Tell.cc,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, tests/BD_Shape/membytes1.cc,
+ tests/Grid/membytes1.cc, tests/Octagonal_Shape/membytes1.cc,
+ tests/Polyhedron/membytes1.cc: The `Determinate' class has been
+ renamed `COW_Pointset'.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh,
+ src/Polyhedron.defs.hh: Completed the \exception section of the
+ documentation for wrap_assign().
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Added a section on "Approximating Bounded
+ Arithmetic", to be written.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Makefile.am,
+ src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+ src/wrap_assign.hh: Documentation of the wrapping methods improved.
+ Typos fixed.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Two new items added.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh: Further steps in the definition of the
+ interface of Affine_Space. The widening and extrapolation methods
+ do nothing (except for testing dimension-compatibility). Several
+ comments revised.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh: Added missing full stops.
+
+2009-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS, interfaces/Java/README.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a: Documented recent changes in the Java interface.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh: Removed obsolete comments about
+ minimization.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh: Fixed some comments.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/wrap1.cc: Marked the tests that are expected to
+ fail with 8-bit coefficients.
+
+2009-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: Documented a systematic assumption
+ about the C interface opaque pointers.
+
+2009-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh: Fixed a couple
+ of comments for BD and octagonal shapes. When adding
+ constraints/congruences, an exception is thrown if they cannot be
+ accurately represented.
+
+2009-05-04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Pair.java: Cached Java
+ method IDs for class parma_polyhedra_library/Pair.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/wrap1.cc, tests/Octagonal_Shape/wrap1.cc,
+ tests/Polyhedron/wrap1.cc: Expected behavior made dependent on the
+ range of Coefficient.
+
+2009-05-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am, tests/BD_Shape/wrap1.cc: Test
+ BD_Shape::wrap_assign().
+
+2009-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh: Check for NaNs only when debugging.
+
+2009-05-03 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/congruencesproduct1.cc,
+ tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: Renamed
+ reduction Shrink_Using_Congruences_Reduction to
+ Congruences_Reduction.
+
+2009-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/wrap1.cc: Fixed computation of known results
+ for test01() and test02().
+
+2009-05-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_numeric_limits.hh: Avoid use of constructors in
+ numeric_limits.
+
+2009-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/wrap1.cc: Expected result adapted to the
+ different types of coefficients.
+
+2009-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh: Fixed PPL_SPECIALIZE_LIMITS_INT.
+
+2009-05-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/wrap1.cc: Debugging print statement added.
+
+2009-05-03 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.cc, src/checked.defs.hh, src/checked_int.inlines.hh:
+ Fixed assignment to int.
+
+2009-05-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am, src/{wrap.cc => wrap_string.cc}, src/{wrap.hh =>
+ wrap_string.hh}: Files renamed to avoid ambiguity with respect to
+ numerical wrapping.
+
+2009-05-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Determinate.types.hh, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+ src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+ src/Widening_Function.types.hh, src/wrap_assign.hh: No longer use CS
+ and PS as template parameter names.
+
+2009-05-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/wrap_assign.hh: Unused variable removed.
+
+2009-05-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load3.cc: Bad spacing fixed.
+
+2009-05-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 099c11d215bf8bf113bec36fbe1b802d939bf92b Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat May 2 18:16:44 2009 +0200
+
+2009-05-02 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.templates.hh,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/constraintsproduct1.cc,
+ tests/Partially_Reduced_Product/shrinkusingcongruences1.cc:
+ Reduction methods (Constraints and Shrink_Using_Congruences)
+ improved. Tests specific to the Constraints_Reduction added.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc: Obsolete test programs removed.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 02e818f7cd915af0e99ac755e1567932ec164992 Merge: abefc45
+ 54b3668 Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Fri
+ May 1 14:25:03 2009 +0200
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ ,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4, src/Any_Pointset.defs.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+ src/Box.templates.hh, src/Grid.defs.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_chdims.cc, src/Grid_public.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_public.cc: Renamed some pleonastic identifiers.
+ Fixed some comments.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/.gitignore: Added missing patterns.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.defs.hh: Renamed some pleonastic identifiers.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Affine_Space.cc, src/Affine_Space.defs.hh,
+ src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+ src/Makefile.am: Added a proof-of-concept implementation of affine
+ spaces. The implementation is based on rational grids.
+
+2009-05-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/shrinkusingcongruences1.cc:
+ Unwanted changes to test01() undone.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh: Fixed copy-and-paste mistakes.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh: Indentation fixed.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh, src/Grid.inlines.hh,
+ src/Octagonal_Shape.inlines.hh: Useless returns removed.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc: Fixed two code formatting glitches.
+
+2009-05-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh: Previous change reverted.
+
+2009-04-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh: Useless friend declaration removed.
+
+2009-04-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 9ce7c8bdce348315c574891ecb60cc0dc4cb3720 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Thu Apr 30 19:30:47 2009 +0200
+
+2009-04-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a, interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_java_tests_common: Fixed initialization
+ for Java interface (explicit initialization required). Java class
+ Parma_Polyhedra_Library now has two new static methods:
+ initialize_library() and finalize_library(). The first one, to be
+ called after loading the library and before calling any other
+ library method, will provide proper initialization of both the C++
+ data structures and the Java class and field/method ID caches. The
+ second one, to be called when no longer using the library, will
+ clear the cache, deleting all stored global references, thereby
+ allowing for the PPL Java classes to be garbage collected.
+
+2009-04-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 6431f35e4360c7c8385635f1e262c2f984cf07b1 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Apr 28 19:19:04 2009 +0200
+
+2009-04-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed a typo
+ causing improper cleaning of Java interface files.
+
+2009-04-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc, tests/Polyhedron/wrap1.cc: In
+ Polyhedron::wrap_assign() handled the case `o ==
+ OVERFLOW_UNDEFINED'.
+
+2009-04-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+ tests/Polyhedron/wrap1.cc: Added a new parameter `pcs' to
+ Polyhedron::wrap_assign(). Other parameters reordered. The tests
+ now check for the expected result.
+
+2009-04-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Use LT_PREREQ to ensure a recent-enough version of
+ Libtool is used.
+
+2009-04-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc: Fixed a few residual issue
+ in Java interface method ID caching. Factored away common code in
+ helper functions build_cxx_*_system. Inlined a few helper
+ functions.
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc, tests/Polyhedron/wrap1.cc: Started the
+ implementation of Polyhedron::wrap_assign().
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/.gitignore: Added missing pattern.
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpq.inlines.hh: Unused parameter name omitted.
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/.gitignore, tests/Polyhedron/.gitignore: Added
+ missing patterns.
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/checked.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/math_utilities.inlines.hh: The `mul2exp' and `div2exp' functions
+ are now called `mul_2exp' and `div_2exp'. They have also been
+ changed so as to take an unsigned int parameter.
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh: Added void
+ div_2exp_assign(GMP_Integer&, const GMP_Integer&, unsigned int).
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh: Added void
+ mul_2exp_assign(GMP_Integer&, const GMP_Integer&, unsigned int).
+
+2009-04-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 79dac5cc0b03dec162bdcca40e01828a52371765 Author: Enea
+ Zaffanella <zaffanella at cs.unipr.it> Date: Sat Apr 25 16:34:17 2009
+ +0200
+
+2009-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/tests/Makefile.am: Use the macros OCAMLC, OCAMLOPT
+ and OCAMLLIB.
+
+2009-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: One obsolete item removed. Other items partially scheduled.
+
+2009-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, tests/ppl_test.hh: DO_TEST_F now produces a more sensible
+ output.
+
+2009-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am, interfaces/OCaml/Makefile.am: Use the macros
+ OCAMLC, OCAMLOPT and OCAMLDOC instead of hardcoded names.
+
+2009-04-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO, configure.ac, m4/ocaml.m4: Use the ocaml-autoconf macros for
+ configuration of the OCaml interface.
+
+2009-04-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java: Improved jni
+ helper functions set_coefficient, set_generator, set_by_reference.
+ Cached anther few Java method IDs.
+
+2009-04-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java: In Java, avoid useless repeated copies in Coefficient and
+ Linear_Expression.
+
+2009-04-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+ e.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+ a,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+ us.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+ java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java: Caching other
+ Java field/method IDs. Also corrected a latent bug in helper
+ function j_long_to_j_long_class.
+
+2009-04-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+ nt.java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java:
+ Started caching Java field/method IDs for jni callbacks. Improved
+ the translation from Java Coefficient to PPL Coefficient objects by
+ providing the former with a toString method.
+
+2009-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/parma_polyhedra_library/Generator.java: Corrected
+ Java Generator private method void set(Generator). We were not
+ correctly setting the divisor for the generator. Also got rid of
+ unused jni method set_grid_generator().
+
+2009-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/parma_polyhedra_library/By_Reference.java: Got rid
+ of (unnecessarily involved) method is_null.
+
+2009-04-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh: Prefer passing
+ jobject, jint and jlong by value.
+
+2009-04-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc: Added missing checks.
+
+2009-04-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/C_Integer.hh, src/checked.cc, src/meta_programming.hh: Avoid
+ use of anonymous enum.
+
+2009-04-23 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Powerset/fromgrid1.cc: Avoid unused variable warning.
+
+2009-04-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh: Warnings avoided.
+
+2009-04-22 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Grid/affineimage2.cc: Tests 11 fails with checked-int32
+ coefficients.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, TODO, src/Init.cc: Use of PPL_ARM_CAN_CONTROL_FPU made
+ safer. When the PPL has been configured with
+ CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1", the library initialization
+ procedure checks that the FPU can indeed be controlled and fails if
+ that is not the case.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4: Formatting improved.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4: Made the checks for HAVE_FENV_H
+ systems more robust.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am, tests/Polyhedron/wrap1.cc: New file
+ wrap1.cc will contain tests for method Polyhedron::wrap_assign().
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, src/Polyhedron_public.cc: Added the
+ declaration and a stub implementation of new method
+ Polyhedron::wrap_assign().
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh: New enumerations Bounded_Integer_Type_Width,
+ Bounded_Integer_Type_Signedness and Bounded_Integer_Type_Overflow to
+ encode the width, signedness and overflow behavior of bounded
+ integer types, respectively.
+
+2009-04-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Corrected silly typo in compile-time
+ check.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc: Typos fixed.
+
+2009-04-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh: Typos fixed.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Mentioned the speed improvements committed today.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, Watchdog/src/Makefile.am, configure.ac,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text, interfaces/C/Makefile.am,
+ src/Makefile.am: Version number bumped.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit d0e5a4edbf54e3a14ba44b27d34ab24f101cb118 Merge: 0dbad6c
+ 45e1e7e Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Mon
+ Apr 20 22:10:48 2009 +0200
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh:
+ Bit_Row iterators reimplemented more efficiently.
+
+2009-04-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/integerupperboundifexact1.cc,
+ tests/Octagonal_Shape/upperboundifexact1.cc: The exact integer upper
+ bound methods for shapes are now under Git control. The methods are
+ named integer_upper_bound_assign_if_exact; they can only be
+ instantiated if the template parameter T is an integer datatype.
+
+2009-04-20 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.inlines.hh: Added assert to check for possible
+ overflow.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 12dc53fb2a829b9ae88c49c5a5dd796df4cc8ced Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Apr 20 16:15:22 2009 +0200
+
+2009-04-20 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Bit_Row.inlines.hh: Size has to be specified in bits.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh: New
+ constructor Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z).
+ Constructs an object containing the set-union of y and z.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc: Further improved subset_or_equal(const Bit_Row&,
+ const Bit_Row&, bool&).
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh, src/conversion.cc:
+ Avoid useless allocations by only adding recycled rows to
+ Bit_Matrix.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc: Significantly speeded up the construction of
+ `new_satrow'.
+
+2009-04-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc: Improved subset_or_equal(const Bit_Row&, const
+ Bit_Row&, bool&).
+
+2009-04-19 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+ st_pl_code.m4: Removed tests for the deprecated *and_minimize()
+ predicates.
+
+2009-04-18 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/bounded1.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+ tests/Grid/generators1.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/intersection1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/partition1.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc,
+ tests/Grid/simplifyusingcontext1.cc, tests/Grid/topclosed1.cc:
+ Removed deprecated methods *and_minimize().
+
+2009-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Mark package ppl-yap as obsoleting
+ ppl-yap-static.
+
+2009-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Update version.
+
+2009-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog: Mark ChangeLog.
+
+2009-04-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Mark ChangeLog.
+
+2009-04-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl:
+ No longer use ppl_Polyhedron_add_constraints_and_minimize/2.
+
+2009-04-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+ tests/Powerset/intersection1.cc: More changes related to the removal
+ of the *_and_minimize() methods.
+
+2009-04-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/topclosed1.cc, tests/Powerset/addconstraints1.cc:
+ Tests adapted to check the "non-and_minimize" versions. Several
+ comments and one bug fixed in the process.
+
+2009-04-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 5d9dccfb35624f7a3efd99cfea738306b147a473 Merge: 083f3ea
+ 205889d Author: Roberto Bagnara <bagnara at cs.unipr.it> Date: Fri
+ Apr 17 12:55:06 2009 +0200
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc: Changed `__s390x' to `__s390x__' in
+ conditional exclusion of this test.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog: Updated.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/{ppl-0.10.1-Makefile.patch => ppl-0.10.2-Makefile.patch},
+ fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, fedora/pwl.hh:
+ Updated for PPL 0.10.2.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3, doc/libppl_c.3: Version numbers fixed.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+ doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text: Updated for PPL 0.10.2.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am, doc/Makefile.am: Added targets to have
+ `make -n dist' work as expected.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc: Usage string fixed: ppl_lcdd accepts
+ at most one input file.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am, Watchdog/tests/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ interfaces/C/Makefile.am, interfaces/C/tests/Makefile.am,
+ interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/tests/Makefile.am, src/Makefile.am,
+ tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Grid/Makefile.am, tests/MIP_Problem/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am: Added
+ rules so that `make -n' and `make -n check' work.
+
+2009-04-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox: Updated BHZ09b.
+
+2009-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, tests/Polyhedron/memory1.cc: Test program
+ tests/Polyhedron/memory1 disabled on the zSeries s390x platform.
+
+2009-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README, TODO, configure.ac: Updated for PPL 0.10.2.
+
+2009-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am, interfaces/C/Makefile.am,
+ src/Makefile.am: Libtool -version-info updated for PPL 0.10.2.
+
+2009-04-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4: Accommodate version 4.3.0 of GMP. Starting from GMP version 4.3.0 (released a few hours after PPL
+ 0.10.1), the gmp_version variable always contains three parts. In
+ previous versions the patchlevel was omitted if it was 0. This
+ change broke our GMP detection procedure.
+
+2009-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/ppl_interface_generator_common_dat.m4,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid_public.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_public.cc,
+ tests/Powerset/addconstraints1.cc, tests/Powerset/intersection1.cc:
+ Initiated the removal of the methods deprecated in PPL 0.10.
+
+2009-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc: Improved.
+
+2009-04-14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/README.doc: Updated to refer to git and to mention possible
+ names of TeX config files.
+
+2009-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Update version.
+
+2009-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog: Mark ChangeLog.
+
+2009-04-14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog: Mark ChangeLog.
+
+2009-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit d3f29a9c56e680f46428916490d4ec2c00210c66 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Apr 13 16:41:28 2009 +0200
+
+2009-04-13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc: Disabled test10() on the
+ Alpha.
+
+2009-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 64d70efe40c253409d12f0159eadb4b95a1f105f Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sun Apr 12 10:39:55 2009 +0200
+
+2009-04-12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio.sed, doc/definitions.dox:
+ Bibliography updated. The generated bibliography required manual intervention in a few
+ places, also because of a couple of Doxygen bugs and limitations
+ (see http://bugzilla.gnome.org/show_bug.cgi?id=578739 and
+ http://bugzilla.gnome.org/show_bug.cgi?id=578740).
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/.gitignore, interfaces/Prolog/XSB/.gitignore,
+ interfaces/Prolog/YAP/.gitignore: Added missing patterns. Removed
+ obsolete ones.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .gitignore, Watchdog/doc/.gitignore, doc/.gitignore,
+ interfaces/Prolog/XSB/.gitignore: Added missing patterns.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl-0.10-bigendian.patch, fedora/ppl-0.10-configure.patch,
+ fedora/ppl-0.10.1-Makefile.patch, fedora/ppl.spec: Updated for PPL
+ 0.10.1.
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 8707f62b598769d6802282c5f762b63b607ed109 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Sat Apr 11 08:37:36 2009 +0200
+
+2009-04-11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am: Fixed reference to CLPQ_TESTS.
+
+2009-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 8e9f007fa2a5491ee1810e83fc24a6daa2829516 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Fri Apr 10 22:32:54 2009 +0200
+
+2009-04-10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh: Only use fmaf(), fma() and fmal() if
+ they are fast.
+
+2009-04-10 Roberto Bagnara <roberto at freebsd.homenet.telecomitalia.it>
+
+ * configure.ac: Version number bumped.
+
+2009-04-10 Roberto Bagnara <roberto at freebsd.homenet.telecomitalia.it>
+
+ * src/checked_float.inlines.hh: Do not use fma(), fmaf() and fmal()
+ on FreeBSD. fma() does not respect rounding, fmaf() and fmal() may
+ have the same problem.
+
+2009-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Mentioned the AIDA 2007 project.
+
+2009-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Acknowledge the contribution of HiPEAC.
+
+2009-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Acknowledge the contribution of INRIA.
+
+2009-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Acknowledge the contribution of AMD. Fixed mistaked of
+ previous commit.
+
+2009-04-09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS: Acknowledge the contribution of Kenneth MacKenzie.
+
+2009-04-07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/unconstrain1.cc: Disabled test07() on the
+ Alpha.
+
+2009-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit 52d769bff2e50c45330bdca9a955e33c9526337e Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Mon Apr 6 20:21:25 2009 +0200
+
+2009-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/cvs2cl.pl, devtools/git2cl, devtools/update_ChangeLog:
+ Machinery to generate ChangeLog adapted to Git. This is still
+ highly unsatisfactory, as it requires manual intervention.
+
+2009-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-04-06 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * demos/ppl_lcdd/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ devtools/print_nonascii_lines: Avoid differences generated by
+ locale.
+
+2009-04-06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am: Set LC_COLLATE=C in addition to
+ LANG=C.
+
+2009-04-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage3.cc: Disabled
+ test04() on the Alpha.
+
+2009-04-05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/disjoint1.cc: Disabled a couple of tests on
+ the Alpha.
+
+2009-04-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/NEWS, Watchdog/README, Watchdog/configure.ac,
+ Watchdog/src/Makefile.am: Updated for PWL 0.7.
+
+2009-04-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README: Updated for PPL 0.10.1.
+
+2009-04-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: More NEWS items added. Tentative release date set to April
+ 14, 2009.
+
+2009-04-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc: Do not use the same object to play
+ different roles in the same method call. In calls to methods
+ Box::difference_assign and Box::concatenate_assign we were binding
+ the very same Box object both to the (modifiable) implicit argument
+ *this and to the (const) explicit argument y.
+
+2009-04-03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Fixed a missing initialization bug in
+ Box::concatenate_assign. Also improved methods
+ add_space_dimensions*: instead of adding new uninitialized intervals
+ and later initialize them, we now directly add properly initialized
+ intervals.
+
+2009-04-03 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Box.templates.hh: Avoid warning of unused variable space_dim.
+
+2009-04-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/ppl_c_test.cc: Work around a bug affecting some
+ versions of <stdio.h>.
+
+2009-04-02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4,
+ m4/ac_cxx_long_double_binary_format.m4: Added missing uses of
+ AC_REQUIRE; removed a spurious one. Version number bumped.
+
+2009-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am, interfaces/OCaml/tests/Makefile.am: Use
+ @mlgmp_dir@ instead of +gmp for the -I option of ocamldoc.
+
+2009-04-02 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am: Fixed parallel make.
+
+2009-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Added a couple of items.
+
+2009-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO: We no longer have FIXME's for 0.10.1.
+
+2009-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.templates.hh: Another FIXME postponed to 0.11.
+
+2009-04-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh, tests/Box/refinewithconstraint1.cc: A couple
+ of FIXME postponed to 0.11.
+
+2009-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh: Code duplication and useless bitwise
+ manipulation avoided.
+
+2009-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh: FIXME resolved.
+
+2009-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions2.cc: Disabled test19() on the Alpha.
+
+2009-04-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc: Adapted test
+ Box/ascii_dump_load1.cc and FIXME removed.
+
+2009-04-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Box.templates.hh: Typo fixed.
+
+2009-04-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Box.defs.hh, src/Box.templates.hh, tests/Box/Makefile.am,
+ tests/Box/limitedcc76extrapolation1.cc: Revised the implementation
+ for Box<ITV>::limited_cc76_extrapolation_assign() so as to use the
+ limiting constraint system to limit the widened box. The
+ FIXME(0.10.1) there is now removed.
+
+2009-04-01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/empty1.cc: Test adapted and fixme removed.
+
+2009-04-01 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.templates.hh, tests/Powerset/fromgrid1.cc:
+ Changes to deal with //FIXME(0.10.1): the following is a bug! in
+ src/Pointset_Powerset.templates.hh As Grids are non-convex, the constructor for a powerset of nnc
+ polyhedra from a powerset of grids has been implemented separately
+ from the generic case. A test added to show that there was a bug
+ which is now fixed. The "//FIXME(0.10.1): ..." has been removed but a new FIXME added
+ indicating this code will break if other non-convex or non-linear
+ domains are added
+
+2009-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README, src/Makefile.am: Updated for PPL 0.10.1.
+
+2009-04-01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: New items for PPL 0.11 added. Other items scheduled for PPL
+ 0.11.
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/DB_Matrix.templates.hh, src/OR_Matrix.templates.hh: Made
+ ascii_load more restrictive.
+
+2009-03-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Indentation fixed.
+
+2009-03-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit ccc5ce00a303af09a7e37d120695a2c1cbb37834 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Tue Mar 31 17:37:40 2009 +0000
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Box.inlines.hh: Postponed FIXME.
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Init.cc: Removed FIXME and documented the default value.
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * TODO: Added TODO item.
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Polyhedron_nonpublic.cc: Postponed FIXME.
+
+2009-03-31 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Fixed run_tests make.
+
+2009-03-31 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * src/Pointset_Powerset.templates.hh: Removed two FIXME(0.10.1)s
+ which have been checked and for which nothing needs to be done.
+
+2009-03-31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/difference1.cc: Disabled some tests on the
+ Alpha.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac: Version number bumped. The
+ name of the program is Autoconf.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/tests/test1.ml: Register OCaml interface
+ exceptions; added a few tests. The interface exceptions should be
+ registered both in the .ml and .mli files. Added a test for the
+ invalid argument exception (negative space dimension) and for the
+ set/reset timeout functions.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Added one item for PPL 0.11.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/relations4.cc: Disable test19() on the Alpha.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am: Fixed *_CPPFLAGS variables.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/formatted_output.c: Include "ppl_c_test.h"
+ instead of "ppl_c.h".
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/ppl_c_test.h: Include "ppl_c.h".
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Avoid redefining NDEBUG.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/tests/Makefile.am, interfaces/OCaml/tests/test1.ml:
+ Register PPL_timeout_exception in the OCaml interface. Avoid flood
+ of warnings by directly thowing CAML exceptions in CATCH_ALL. Still
+ debugging the handling of timeouts.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh: Removed the tag "(0.10.1)"
+ from a FIXME unrelated to with PPL 0.10.1.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh: Obsolete FIXME removed: methods Box::refine_*
+ were fixed long ago.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.inlines.hh, src/globals.defs.hh:
+ Decided that it is not worth renaming
+ PPL_OUTPUT_TEMPLATE_DEFINITIONS. Calling it
+ PPL_OUTPUT_1_PARAM_TEMPLATE_DEFINITIONS would not buy us anything:
+ FIXMEs removed.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/test1.ml: Let OCaml tests also link with the
+ pwl library, if configured.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.alpha: Warn about the GCC bug affecting exception handling
+ on the Alpha.
+
+2009-03-30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Consider switching to MLGMPIDL for the OCaml interface.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/tests/MIP_Problem_test1.java: Added wrap_string to
+ java interface.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/tests/MIP_Problem_test1.java: Reverted bogus
+ commits.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Added file.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am: Added file.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/tests/MIP_Problem_test1.java: Added test.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/parma_polyhedra_library/IO.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am: Added java.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Fix2.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Fix.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/Java/jni/ppl_java_globals.cc: Added wrap_string.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh: Helper OCaml interface
+ function renamed for consistency. value_to_unsigned_native -->
+ value_to_unsigned (to be consistent with similar functions in the
+ Java and Prolog interfaces).
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO, Watchdog/src/Watchdog.defs.hh: Moved TODO items to their
+ place.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/Prolog/ppl_prolog_common.cc: Added timeout functions to
+ the OCaml interface. Also removed duplicate CATCH_ALL macro
+ definitions in the Prolog and OCaml interfaces.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox,
+ interfaces/Prolog/Prolog_interface.dox: Improvements to the OCaml
+ and Prolog interface documentation.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/.gitignore, tests/BD_Shape/Makefile.am,
+ tests/Box/.gitignore, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/.gitignore, tests/Octagonal_Shape/Makefile.am:
+ Fixed restore of parallelized tests.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Revert "Restore parallelized
+ tests." This reverts commit b163fee3b048fe3dd07be912850ec042f4d24b2d.
+
+2009-03-30 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/Makefile.am: Restore parallelized tests.
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4: Minor
+ improvement to documentation. In the documentation block for
+ \defgroup, do not use \brief if there does not also exist a detailed
+ documentation section (otherwise, doxygen will insert a spurious
+ "More..." link pointing to the same page).
+
+2009-03-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ , interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+ a: Avoid spurious vertical space in the documentation. When adding
+ a member group using doxygen commmand \name and the multiline style
+ special comments, also add a \brief command if there is no detailed
+ documentation for the group.
+
+2009-03-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli: Added string wrapping helper
+ function to OCaml interface.
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Moved changelogs and PostScript and PDF versions
+ of the GPL to the `docs' subpackages. This saves considerable space
+ on the live media.
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am: Temporary workaround to force
+ linking with C++.
+
+2009-03-29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/tests/test1.ml: Improved the OCaml interfacing of
+ PPL dimensions and coefficients. Added new helper functions: - value_to_unsigned_native<U_Int> - ppl_dimension_to_value - value_to_ppl_dimension - mpz_ptr_val and mpz_class_val - build_ppl_Variable. Prefer using Val_emptylist to Val_int(0).
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/exceptions1.cc: Disable these tests on the
+ Alpha.
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-03-29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ src/ppl-config.cc.in: Try to accommodate more non-GNU
+ implementations of `getopt()'.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.inlines.hh: Remove unimplemented and unused
+ functions.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ src/ppl-config.cc.in: Try to accommodate non-GNU implementations of
+ `getopt()'.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Bit_Row.inlines.hh: Some systems do not have
+ <strings.h>. On such systems ffs(3) may be defined in <string.h>.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Done item removed.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, ChangeLog-2001-2008 => ChangeLog_2001-2008,
+ Watchdog/ChangeLog, Watchdog/{ChangeLog-2001-2008 =>
+ ChangeLog_2001-2008}: Change logs updated.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac: Improved the semantics of the
+ --enable-watchdog configure option.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Interval.inlines.hh: Removed useless functions.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frombox1.cc: Fixed and reactivated test05().
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frombox1.cc: Parameterized test05().
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh: Fixed indentation.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked.inlines.hh: These efficiency related FIXME's are not
+ scheduled for 0.10.1
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Checked_Number.inlines.hh: Documented ROUND_NOT_NEEDED FIXME.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * TODO, src/Init.cc, src/checked_mpq.inlines.hh: Documented rational
+ sqrt precision and implemented a more precise variant for numbers <
+ 1.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_mpz.inlines.hh: Avoid unrequested call to
+ mpz_divisible_p.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_exact_output.m4,
+ m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_long_double_exact_output.m4: Uuse the
+ PPL_CXX_*_BINARY_FORMAT macros.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/Box/frombox1.cc: Disabled failing test.
+
+2009-03-28 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/checked_mpz.inlines.hh: Avoid abuse of mpz_divexact.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am: Tweak for MinGW. Force the use of
+ the C++ compiler for linking.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.c: Include <stdlib.h> instead
+ of <malloc.h>.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am: Allow testing under MinGW.
+
+2009-03-28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Detect MinGW, defining the HOST_OS_MINGW Automake
+ conditional.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/ppl_lpsol.1,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text: The `ppl_lpsol' program
+ can now be built and checked with cross-compilation.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc: Minor code readability improvements.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h, src/wrap.hh: Comments improved.
+
+2009-03-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h: A couple of minor corrections.
+
+2009-03-27 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_header.h: Fixed parameter name.
+
+2009-03-27 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_header.h: Moved ppl_io_wrap_string
+ documentation.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.1, doc/ppl-config.1: Man pages updated.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.1,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/ppl_lcdd_extra_man_text:
+ The `ppl_lcdd' program can now be built and checked with
+ cross-compilation.
+
+2009-03-27 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_stream.cc, interfaces/C/ppl_c_stream.defs.hh,
+ interfaces/C/ppl_c_stream.h, interfaces/C/ppl_c_stream.inlines.hh,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4, interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ src/Makefile.am, src/c_streambuf_format.cc,
+ src/c_streambuf_format.defs.hh, src/c_streambuf_format.types.hh,
+ src/c_streambuf_format_settings.h, src/pretty_print.cc,
+ src/pretty_print.hh, src/pretty_print.inlines.hh, src/wrap.cc,
+ src/{c_streambuf_format.inlines.hh => wrap.hh}: Get rid of
+ pretty_printing stuff. A string wrapping function is made available.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog: Change logs covering the changes
+ made in the CVS repository in 2009. They will be replaced by
+ up-to-date change logs obtained from git.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog => ChangeLog-2001-2008, Watchdog/{ChangeLog =>
+ ChangeLog-2001-2008}: Renamed and frozen: the ChangeLog-2001-2008
+ should never be changed again.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog: Updated to 2008-12-31.
+
+2009-03-27 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/Makefile.am, tests/BD_Shape/run_tests,
+ tests/Box/Makefile.am, tests/Box/run_tests,
+ tests/Octagonal_Shape/Makefile.am, tests/Octagonal_Shape/run_tests:
+ Fixed make check.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint_System.cc: Missing else branch added.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc, src/Congruence.cc, src/Congruence_System.cc,
+ src/Constraint_System.cc, src/Generator_System.cc,
+ src/Grid_Generator_System.cc, src/Linear_Row.cc,
+ src/Linear_System.cc, src/Matrix.cc, src/Row.cc: ascii_load()
+ methods now perform more stringent checks on the input.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/ascii_dump_load1.cc: Spurious spaces removed.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload2.cc: Spurious spaces removed.
+
+2009-03-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc, tests/Polyhedron/watchdog1.cc: Fixed
+ the formatting of do-while loops.
+
+2009-03-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/Prolog/.gitignore,
+ interfaces/Prolog/Prolog_interface.dox: Added several missing
+ functions to the OCaml interface. Minor corrections to the
+ documentation.
+
+2009-03-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc: Fixed several garbage
+ collecting issues in the OCaml interface. - Helper functions returning OCaml value types that have not been
+ registered yet with the garbage collector are now named
+ unregistered_value_p_*; - Added appropriate calls to CAMLlocal* macros where appropriate; - Use the safe Store_field(a, b, c) instead of the unsafe Field(a,
+ b) = c.
+
+2009-03-26 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * tests/BD_Shape/.gitignore, tests/BD_Shape/Makefile.am,
+ tests/Box/.gitignore, tests/Box/Makefile.am,
+ tests/Octagonal_Shape/.gitignore, tests/Octagonal_Shape/Makefile.am:
+ Tests have to be done unconditionally.
+
+2009-03-26 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * NEWS: Report on two bugs fixed in the OCaml interface.
+
+2009-03-26 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/tests/test1.ml: Fixed a bug where the tokens for
+ widening were not being updated.
+
+2009-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Support systems
+ that do not define `siginfo_t'.
+
+2009-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac: Added checks for the
+ availability of `siginfo_t'.
+
+2009-03-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4: We can infer the possibility to
+ control the CPU even when cross-compiling. This happens (at least)
+ on i386 and sparc (provided we have <ieeefp.h>).
+
+2009-03-25 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_stream.cc,
+ interfaces/C/tests/print_to_buffer.c, src/c_streambuf_format.cc,
+ src/c_streambuf_format.defs.hh, src/c_streambuf_format.inlines.hh,
+ src/c_streambuf_format_settings.h: Better parameters for formatted
+ output.
+
+2009-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh: Properly use PPL_FPMATH_MAY_USE_387 and
+ PPL_FPMATH_MAY_USE_SSE.
+
+2009-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc: Depend on PPL_CAN_CONTROL_FPU.
+
+2009-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Typo fixed.
+
+2009-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * : commit b5d7b09c10aea7c95b9d2693986e2e4e549d3a12 Author: Roberto
+ Bagnara <bagnara at cs.unipr.it> Date: Wed Mar 25 21:06:01 2009 +0100
+
+2009-03-25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/congruences1.cc, tests/Box/max_min1.cc: Disable more
+ tests that fail on the Alpha due to a GCC bug.
+
+2009-03-25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh,
+ tests/BD_Shape/simplifyusingcontext1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/simplifyusingcontext1.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc: Implemented
+ Octagonal_Shape::simplify_using_context_assign(). The efficiency of
+ the method needs improving. Added a few tests.
+
+2009-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * TODO: TODO item - Check the configuration dependent documentation for Prolog, done
+ and removed.
+
+2009-03-25 Patricia Hill <p.m.hill at leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/OCaml/tests/test1.ml: Where the result type is unit,
+ the type returned by C++ must be a CAMLprim value type and not a
+ void.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addcongruences1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc: Exception
+ handling is broken in GCC on the Alpha: commented out some tests.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/formatted_output.c: Reduced DIMENSION to 100.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, interfaces/C/tests/formatted_output.c,
+ m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+ m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4:
+ Improved the actions of AC_RUN_IFELSE when cross-compiling.
+
+2009-03-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/Makefile.am: Fixed file names.
+
+2009-03-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention the bug corrected for method
+ Octagonal_Shape<T>::affine_image().
+
+2009-03-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_header.h: Fixed comment.
+
+2009-03-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/ppl_c_header.h: Fixed indentation.
+
+2009-03-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Corrected bug affecting method
+ Octagonal_Shape::affine_image().
+
+2009-03-24 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh, src/c_stream.cc
+ => interfaces/C/ppl_c_stream.cc, interfaces/C/ppl_c_stream.defs.hh,
+ interfaces/C/ppl_c_stream.h, interfaces/C/ppl_c_stream.inlines.hh,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h, src/Makefile.am,
+ src/c_stream.h, src/c_streambuf.inlines.hh,
+ src/c_streambuf_format.cc, src/c_streambuf_format.defs.hh,
+ src/c_streambuf_format.inlines.hh,
+ src/c_streambuf_format_settings.h: Cleaned C streams implementation.
+
+2009-03-24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc: Test test17() shows a bug
+ in method Octagonal_Shape::affine_image(). The bug is triggered
+ when the affine image is of the form var -> var + n and the
+ octagonal shape has constraints relating var with another space
+ dimension having index smaller than var.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure, TODO: Explained the `--disable-ppl_lcdd' and
+ `--disable-ppl_lcdd' configure options.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: There are no GNU Prolog packages available on
+ ia64: disable the GNU Prolog interface also on those platforms
+ (besides ppc64, s390 and s390x).
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Synchronized with the Fedora repository.
+
+2009-03-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h,
+ interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Added some
+ more infrastructure. Variables renamed.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/formatted_output.c,
+ interfaces/C/tests/print_to_buffer.c: Build restored.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/tests/print_to_buffer.c, src/c_stream.cc,
+ src/c_stream.h, src/c_streambuf_format.cc: Added repeated char for
+ left and right margin.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Some fixes.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am, interfaces/C/tests/{cxxoutput.c
+ => formatted_output.c}, interfaces/C/tests/print_to_buffer.cc: Done
+ some cleaning.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+ interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/print_to_buffer.c,
+ interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Started the
+ installation of the new formatted output machinery.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Better
+ name.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Bug
+ fix: ostringstream.str() returns a temporary.
+
+2009-03-23 Enea Zaffanella <zaffanella at spartacus.cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc: Added a test.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/c_stream.cc, src/c_stream.h, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf_format.cc,
+ src/c_streambuf_format.defs.hh: Separated wrap before from wrap
+ after. Bug fixes.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh: Readability improvements.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh: Fixed a bug (that is inconsequential for
+ the current code base). We were using `m % 2 == 1' instead of `m %
+ 2 != 0', with `m' a signed number that could be negative.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/c_stream.cc, src/c_stream.h: Added ppl_io_ostream_buffer_clear
+ function.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/c_stream.cc, src/c_stream.h: Added write functions for native
+ types.
+
+2009-03-23 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Makefile.am, src/c_stream.cc, src/c_stream.h,
+ src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf_format.cc,
+ src/c_streambuf_format.defs.hh, src/c_streambuf_format.inlines.hh,
+ src/c_streambuf_format.types.hh: Added filtered streams. Implemented
+ format filter.
+
+2009-03-23 Enea Zaffanella <zaffanella at spartacus.cs.unipr.it>
+
+ * doc/Makefile.am: Add dependencies between HTML manuals for
+ parallel builds. The distributed built HTML manuals logically
+ depend on the built tag file, which is not distributed; hence a
+ direct dependency cannot be added (it would break a `make distcheck'
+ check). As a workaround, they now depend on the core HTML manual,
+ which is built _and_ distributed.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh: Obsolete FIXME removed.
+
+2009-03-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Little formatting improvement.
+
+2009-03-23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/pretty_print.cc, src/pretty_print.hh: Use consistent parameter
+ names in helper function wrap.
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz_a: Updated to reflect the new way
+ `ppl_lpsol' is invoked.
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, Watchdog/Makefile.am, Watchdog/pwl-config.sed,
+ ppl-config.sed: Tightened the machinery used to generate the
+ configuration headers.
+
+2009-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/linearexpression1.cc: Added a test for
+ operator-(var, expr) and operator-(expr, var).
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/Linear_Expression.inlines.hh:
+ Improved functions and methods to build linear expressions. Avoid
+ complex inline functions and methods.
+
+2009-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh: Three FIXMEs related to
+ Linear_Expression resolved. The three operators are now friend of
+ Linear_Expression: hence they can use the sizing constructors and
+ limit the use of short-lived temporaries.
+
+2009-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: Dealt with a FIXME related to
+ variable names.
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, tests/Polyhedron/.gitignore,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/linearexpression1.cc:
+ FIXME resolved. Fixed a bug in Linear_Expression(Variable v,
+ Variable w). The bug would cause a wrong result to be computed when
+ v == w.
+
+2009-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS: Mention the bug fixed with Commit:
+ 6a6734db48e2ca605dfc27ce5f1a923eb867ed25
+
+2009-03-22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+ 4, interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4:
+ Corrected a bug in the interfacing of drop_disjunct for Java, Ocaml
+ and Prolog. Also corrected a wrong test in the automatically
+ generated test suite for the OCaml interface: we were trying to
+ decrement an iterator pointing to the start of the sequence of
+ disjuncts.
+
+2009-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh: Reworded misleading comment.
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/{linexpression1.cc => linearexpression1.cc}: Test
+ program renamed.
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linexpression1.cc: Rewritted test01(). Added
+ test02().
+
+2009-03-22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .gitignore, Makefile.am, Watchdog/Makefile.am,
+ Watchdog/configure.ac, Watchdog/pwl-config.sed, configure.ac,
+ ppl-config.sed: New machinery to create ppl-config.h and
+ pwl-config.h.
+
+2009-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/pretty_print.hh, src/pretty_print.inlines.hh: Destructor of
+ abstract class Write_Function has to be virtual.
+
+2009-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ , interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+ a_classes_java_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+ rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4:
+ Added the new pretty print functionality to Java, OCaml and Prolog
+ interfaces. The predicate takes 3 arguments for specifying
+ preferred wrapping behavior. For Prolog, new predicate is called
+ ppl_CLASS_pretty_print_to_atom/5 and put the result in the last
+ argument as an atom. For Java, method takes a Writer as the first
+ argument. For Caml, function ppl_CLASS_pretty_print returns a caml
+ string. While at it, also added missing ascii_dump method to Caml and Java
+ interfaces, as well as for the MIP_Problem Prolog interface.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/pretty_print.cc, src/pretty_print.hh: Added a new helper
+ function for the wrapping of lines.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Typo fixed.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh: The C interface
+ now provides functions of the form int ppl_io_asprint_Polyhedron(char** strp, P x) where `P' is any opaque pointer to a const PPL object. These
+ functions print `x' to a malloc-allocated string, a pointer to which
+ is returned via `strp'.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Selected the items that should be done for 0.10.1: postponed
+ the others.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh: Two non-urgent FIXMEs better
+ documented.
+
+2009-03-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/Makefile.am, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+ src/c_streambuf.inlines.hh, src/c_streambuf.types.hh: Added callback
+ based streambufs.
+
+2009-03-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * src/stdiobuf.cc: Fixed typo.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac: Minimum Autoconf version
+ brought back to 2.61.
+
+2009-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am: Added files pretty_print.*.
+
+2009-03-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/pretty_print.cc, src/pretty_print.hh,
+ src/pretty_print.inlines.hh: pretty_print.* contain helper datatypes
+ and functions for pretty printing. Template functions pretty_print
+ and c_pretty_print provide wrapped output using a Write_Function
+ object to write to destination.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-03-21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .gitignore, NEWS, Watchdog/.gitignore, Watchdog/configure.ac,
+ Watchdog/m4/Makefile.am, Watchdog/m4/ax_prefix_config_h.m4,
+ Watchdog/src/Makefile.am, configure.ac, instchk.hh, m4/Makefile.am,
+ m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+ m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+ m4/ax_prefix_config_h.m4: Got rid of AX_PREFIX_CONFIG_H.
+
+2009-03-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .gitignore: Pattern `*~' added. Patterns sorted.
+
+2009-03-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac, configure.ac, m4/ac_prog_java.m4,
+ m4/ac_prog_javac.m4: Avoid using obsolete Autoconf macros.
+
+2009-03-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_exact_output.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4: AC_RUN_IFELSE invocations now
+ have a safe action for cross-compiling.
+
+2009-02-22 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * .cvsignore => .gitignore, Watchdog/.cvsignore,
+ Watchdog/.gitignore, Watchdog/doc/{.cvsignore => .gitignore},
+ Watchdog/m4/.cvsignore, Watchdog/m4/.gitignore,
+ Watchdog/src/.cvsignore, Watchdog/src/.gitignore,
+ Watchdog/tests/.cvsignore, Watchdog/tests/.gitignore,
+ Watchdog/utils/.cvsignore, Watchdog/utils/.gitignore,
+ debian/.cvsignore, debian/.gitignore, demos/.cvsignore,
+ demos/.gitignore, demos/ppl_lcdd/.cvsignore,
+ demos/ppl_lcdd/.gitignore, demos/ppl_lcdd/examples/.cvsignore,
+ demos/ppl_lcdd/examples/.gitignore, demos/ppl_lpsol/{.cvsignore =>
+ .gitignore}, demos/ppl_lpsol/examples/.cvsignore,
+ demos/ppl_lpsol/examples/.gitignore, devtools/{.cvsignore =>
+ .gitignore}, doc/{.cvsignore => .gitignore}, fedora/.cvsignore,
+ fedora/.gitignore, interfaces/.cvsignore, interfaces/.gitignore,
+ interfaces/C/{.cvsignore => .gitignore},
+ interfaces/C/tests/.cvsignore, interfaces/C/tests/.gitignore,
+ interfaces/Java/.cvsignore, interfaces/Java/.gitignore,
+ interfaces/Java/jni/.cvsignore, interfaces/Java/jni/.gitignore,
+ interfaces/Java/parma_polyhedra_library/{.cvsignore => .gitignore},
+ interfaces/Java/tests/{.cvsignore => .gitignore},
+ interfaces/OCaml/{.cvsignore => .gitignore},
+ interfaces/OCaml/tests/.cvsignore,
+ interfaces/OCaml/tests/.gitignore, interfaces/Prolog/{.cvsignore =>
+ .gitignore}, interfaces/Prolog/Ciao/{.cvsignore => .gitignore},
+ interfaces/Prolog/GNU/{.cvsignore => .gitignore},
+ interfaces/Prolog/SICStus/.cvsignore,
+ interfaces/Prolog/SICStus/.gitignore,
+ interfaces/Prolog/SWI/{.cvsignore => .gitignore},
+ interfaces/Prolog/XSB/{.cvsignore => .gitignore},
+ interfaces/Prolog/YAP/{.cvsignore => .gitignore},
+ interfaces/Prolog/tests/{.cvsignore => .gitignore}, m4/.cvsignore,
+ m4/.gitignore, src/{.cvsignore => .gitignore}, tests/.cvsignore,
+ tests/.gitignore, tests/Ask_Tell/.cvsignore,
+ tests/Ask_Tell/.gitignore, tests/BD_Shape/{.cvsignore =>
+ .gitignore}, tests/Box/{.cvsignore => .gitignore},
+ tests/Grid/{.cvsignore => .gitignore},
+ tests/MIP_Problem/{.cvsignore => .gitignore},
+ tests/Octagonal_Shape/{.cvsignore => .gitignore},
+ tests/Partially_Reduced_Product/{.cvsignore => .gitignore},
+ tests/Polyhedron/{.cvsignore => .gitignore},
+ tests/Powerset/{.cvsignore => .gitignore}, utils/.cvsignore,
+ utils/.gitignore: Replaced .cvsignore with .gitignore.
+
+2009-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * interfaces/C/.cvsignore, interfaces/Java/jni/.cvsignore,
+ interfaces/OCaml/.cvsignore, interfaces/OCaml/tests/.cvsignore,
+ interfaces/Prolog/.cvsignore, interfaces/Prolog/SWI/.cvsignore,
+ interfaces/Prolog/tests/.cvsignore, tests/Grid/.cvsignore,
+ tests/Partially_Reduced_Product/.cvsignore,
+ tests/Polyhedron/.cvsignore, tests/Powerset/.cvsignore: Added
+ missing files.
+
+2009-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * .cvsignore, doc/.cvsignore, interfaces/C/.cvsignore,
+ interfaces/Java/jni/.cvsignore,
+ interfaces/Java/parma_polyhedra_library/.cvsignore,
+ interfaces/OCaml/.cvsignore, interfaces/Prolog/.cvsignore,
+ interfaces/Prolog/tests/.cvsignore: Added other patterns.
+
+2009-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * .cvsignore: Added common ignored patterns.
+
+2009-02-21 Abramo Bagnara <abramo.bagnara at gmail.com>
+
+ * .cvsignore, interfaces/Prolog/.cvsignore: Commented out dangerous
+ entries.
+
+2009-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl-0.10-configure.patch, fedora/ppl.spec: Install the
+ documentation according to the Fedora packaging conventions.
+
+2009-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl-0.10-bigendian.patch: Put under CVS control.
+
+2009-02-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Implemented a better workaround for the bug
+ affecting PPL 0.10 on big-endian architectures. There are no GNU Prolog packages available on s390 and s390: disable
+ the GNU Prolog interface also on those platforms (besides ppc64).
+
+2009-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: Avoid using GNU Make extensions.
+
+2009-02-17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc: Two FIXMEs resolved.
+
+2009-02-16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am, tests/Polyhedron/Makefile.am,
+ tests/ppl_test.hh: Include "ppl_header.hh" instead of "ppl.hh": this
+ greatly facilitates debugging of test programs.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am: In ppl_include_files.hh only list the include
+ files that are not included by any other include file.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.defs.hh, src/DB_Row.templates.hh,
+ src/GMP_Integer.inlines.hh, src/Interval_Restriction.defs.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh, src/Powerset.defs.hh,
+ src/Powerset.templates.hh, src/checked_float.inlines.hh,
+ src/iterator_to_const.defs.hh: Added missing inclusions.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh, src/fpu.defs.hh: Include "compiler.hh" in
+ fpu.defs.hh, not in fpu-ia32.inlines.hh. As a general rule, do not
+ include general-purpose include files in files that are only
+ conditionally included.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Added missing control operator.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh: Indentation fixed.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.defs.hh: Include
+ "Partially_Reduced_Product.templates.hh".
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lpsol/Makefile.am: Check for the availability of `fgrep'
+ or its Posix replacement `grep -F'. Always use $(FGREP) or $(EGREP)
+ in makefiles.
+
+2009-02-15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh, src/checked_ext.inlines.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh: Added guards
+ against multiple inclusion.
+
+2009-02-04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.defs.hh: Work around the bug affecting the library on
+ big-endian architectures.
+
+2009-02-03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec: Work around the bug affecting PPL 0.10 on
+ big-endian architectures.
+
+2009-02-02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc, tests/Grid/simplifyusingcontext1.cc: Improved
+ the code for handling 0-dim empty polyhedra for
+ Grid::simplify_using_context_assign(). Added a further test for the
+ 0-dim polyhedra.
+
+2009-02-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc: Corrected a bug in methods
+ add(_recycled)_generator(s) and simplify_using_context_assign
+ whereby an assertion could have failed under very specific
+ conditions (zero-dim empty polyhedron with a computed inconsistent
+ constraint system becoming a zero-dim universe polyhedron).
+
+2009-02-02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerators1.cc: New tests show an assertion
+ failure when adding the vector space origin to an empty zero-dim
+ space polyhedron, thereby turning it into a zero-dim universe
+ polyhedron. The assertion only fails if the inconsistent constraint
+ system of the empty polyhedron was previously generated.
+
+2009-02-02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc: Added three further
+ tests to cover all 0-dim cases. Reordered tests so that all the
+ 0-dim tests are consecutive (11-15).
+
+2009-02-02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc: Added test that has an
+ assertion failure for 0-dim empty polyhedra.
+
+2009-02-01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am, tests/Grid/simplifyusingcontext1.cc: Tests
+ for simplify_using_context_assign() for Grids.
+
+2009-02-01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc: Added code for simplify_using_context_assign()
+ for Grids. Some other bugs in the comments fixed.
+
+2009-01-30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am: The parallel build problem should
+ now be solved.
+
+2009-01-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am, tests/Box/simplifyusingcontext1.cc: Added
+ test file for method Box::simplify_using_cntext_assign(). Tests
+ test01() and test02() marked as failing, since they depend on method
+ Interval::empty_intersection_assign(), currently provided with a
+ dummy implementation.
+
+2009-01-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh: Drafted an implementation for
+ Box::simplify_using_context_assign().
+
+2009-01-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.templates.hh: Added dummy implementation for method
+ empty_intersection_assign(); corrected partial implementation of
+ method simplify_using_context_assign().
+
+2009-01-28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh: Added specification for new Interval method template <typename From> typename Enable_If<Is_Interval<From>::value, void>::type empty_intersection_assign(const From& y); to be used in the
+ implementation of Box::simplify_using_context_assign.
+
+2009-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Partially work around a bug of AX_PREFIX_CONFIG_H
+ whereby WORDS_BIGENDIAN is not prefixed. Version number bumped.
+
+2009-01-27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.templates.hh: Drafted a partial implementation for
+ simplify_using_context_assign(); it assumes that the interval is
+ toplogically closed and with no restrictions.
+
+2009-01-27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Added one urgent item.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc: Test 01 overflows when
+ using 8bit coefficients and assertions are turned on.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.cc, src/NNC_Polyhedron.cc: Switch to new
+ implementation of poly_hull_assign_if_exact(), based on the results
+ stated in BagnaraHZ09.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Version number bumped.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Support more versions of GLPK.
+
+2009-01-26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac: Fixed copy-and-paste mistake.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact2.cc: Added tests corresponding to
+ examples in BHZ09.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact1.cc: Added a new test.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc: Added implementation of the BHZ09
+ exact upper bound test for NNC polyhedra; Factored out those parts
+ that are common to the C polyhedron case.
+
+2009-01-26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh: Added declarations for two non-public
+ methods (one for the C and another for the NNC case) implementing
+ exact upper bound tests using BHZ09.
+
+2009-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS: Wording improved.
+
+2009-01-24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README.configure, configure.ac, interfaces/C/Makefile.am,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/tests/Makefile.am, m4/m4.m4: The configuration
+ script now explicitly checks that a recent enough version of GNU M4
+ is available if at least one non-C++ interface is enabled (in
+ previous versions this check was not performed and building the
+ library could fail in a mysterious way). That version is then used
+ in all makefiles. (Thanks to Tobias Grosser.) Improved configure.ac
+ in various places.
+
+2009-01-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README.configure, configure.ac,
+ interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am:
+ New configuration option `--with-mlgmp=DIR' allows to specify the
+ installation directory of the ML GMP package.
+
+2009-01-23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Added missing const qualifier.
+
+2009-01-21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am: Corrected so as to behave correctly
+ when using parallel builds: the build of <file>.cmx also generates
+ <file>.o, which is a dependency for the generation of *.a.
+
+2009-01-20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c: Fixed glpk_message_interceptor()
+ (thanks to Kenneth MacKenzie).
+
+2009-01-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/upperboundifexact1.cc: Added test on (higher
+ dimensional) hypercubes.
+
+2009-01-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh: The code fo rthe detection of
+ non-redundant octagonal constraints factored out of the strong
+ reduction assign method into the new private method
+ non_redundant_matrix_entries(), so that it can be reused in other
+ contexts. In particular, now we also use it in the implementation of
+ upper_bound_assign_if_exact().
+
+2009-01-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh: Declared a new (private) method that
+ is meant to identify the non-redundant octagonal constraints without
+ actually computing a strongly reduced matrix.
+
+2009-01-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/upperboundifexact1.cc: Added a test on hypercubes.
+
+2009-01-20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Method
+ BHZ09_upper_bound_assign_if_exact() improved by exploiting shortest
+ path reduction so as to avoid checks on redundant constraints.
+
+2009-01-19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/upperboundifexact1.cc: Added another test.
+
+2009-01-18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO: Added one important item for next release.
+
+2009-01-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/upperboundifexact1.cc: Tests 1, 3, 4, 9 and
+ 10 now succeeds.
+
+2009-01-18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh: Drafted an implementation of
+ Octagonal_Shape::upper_bound_assign_if_exact() based on the
+ corresponding theorem in BagnaraHZ09.
+
+2009-01-16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/upperboundifexact1.cc: test10() revised.
+
+2009-01-16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/upperboundifexact1.cc: Added a test file for
+ the upper_bound_if_exact() method - copied (with obvious edits) from the BD_Shape test directory. As the current implementation just returns false, tests that would
+ be expected to succeed have the "_F" tag. An additional test10 is an example showing that more conditions are
+ needed for octagonal shapes compared to the bd shapes.
+
+2009-01-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/upperboundifexact1.cc: Test test09 no longer fails.
+
+2009-01-13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh: Corrected implementation of
+ BHZ09_upper_bound_assign_if_exact().
+
+2009-01-12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/upperboundifexact1.cc: Added a test showing a bug
+ in the new algorithm.
+
+2009-01-08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh: Drafted an implementation for
+ BHZ09_upper_bound_assign_if_exact(); the public method
+ upper_bound_assign_if_exact() is now based on this new (private)
+ method.
+
+2009-01-05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: Added a
+ reduction method Shrink_Using_Congruences_Reduction<> and the
+ product Shrink_Using_Congruences_Product<> that assumes this
+ reduction. Several "FIXME"s dealt with.
diff --git a/ChangeLog_2001-2008 b/ChangeLog_2001-2008
new file mode 100644
index 0000000..5c39a8b
--- /dev/null
+++ b/ChangeLog_2001-2008
@@ -0,0 +1,96130 @@
+2008-12-31 Wednesday 23:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.51), README (1.57), README.configure (1.43),
+ configure.ac (1.413), instchk.hh (1.19), Watchdog/Makefile.am
+ (1.37), Watchdog/README (1.21), Watchdog/configure.ac (1.58),
+ Watchdog/doc/Makefile.am (1.9), Watchdog/doc/README.doc (1.4),
+ Watchdog/doc/devref.tex (1.6), Watchdog/doc/pwl.sty (1.4),
+ Watchdog/doc/user.tex (1.6), Watchdog/m4/Makefile.am (1.6),
+ Watchdog/src/Doubly_Linked_Object.defs.hh (1.7),
+ Watchdog/src/Doubly_Linked_Object.inlines.hh (1.7),
+ Watchdog/src/Doubly_Linked_Object.types.hh (1.5),
+ Watchdog/src/EList.defs.hh (1.9), Watchdog/src/EList.inlines.hh
+ (1.7), Watchdog/src/EList.types.hh (1.5),
+ Watchdog/src/EList_Iterator.defs.hh (1.7),
+ Watchdog/src/EList_Iterator.inlines.hh (1.7),
+ Watchdog/src/EList_Iterator.types.hh (1.5),
+ Watchdog/src/Handler.defs.hh (1.8),
+ Watchdog/src/Handler.inlines.hh (1.7),
+ Watchdog/src/Handler.types.hh (1.5), Watchdog/src/Makefile.am
+ (1.19), Watchdog/src/Pending_Element.cc (1.8),
+ Watchdog/src/Pending_Element.defs.hh (1.8),
+ Watchdog/src/Pending_Element.inlines.hh (1.7),
+ Watchdog/src/Pending_Element.types.hh (1.5),
+ Watchdog/src/Pending_List.cc (1.8),
+ Watchdog/src/Pending_List.defs.hh (1.8),
+ Watchdog/src/Pending_List.inlines.hh (1.7),
+ Watchdog/src/Pending_List.types.hh (1.5), Watchdog/src/Time.cc
+ (1.8), Watchdog/src/Time.defs.hh (1.8),
+ Watchdog/src/Time.inlines.hh (1.7), Watchdog/src/Time.types.hh
+ (1.5), Watchdog/src/Watchdog.cc (1.10),
+ Watchdog/src/Watchdog.defs.hh (1.10),
+ Watchdog/src/Watchdog.inlines.hh (1.7),
+ Watchdog/src/Watchdog.types.hh (1.5), Watchdog/src/pwl_header.hh
+ (1.8), Watchdog/tests/Makefile.am (1.7),
+ Watchdog/tests/pwl_test.cc (1.4), Watchdog/tests/pwl_test.hh
+ (1.4), Watchdog/tests/simple1.cc (1.4),
+ Watchdog/utils/Makefile.am (1.13), Watchdog/utils/build_header.in
+ (1.7), debian/libppl-pwl.copyright.in (1.7),
+ debian/libppl.copyright.in (1.7), demos/Makefile.am (1.15),
+ demos/ppl_lcdd/Makefile.am (1.31), demos/ppl_lcdd/ppl_lcdd.1
+ (1.8), demos/ppl_lcdd/ppl_lcdd.cc (1.65),
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.4),
+ demos/ppl_lcdd/examples/Makefile.am (1.11),
+ demos/ppl_lpsol/Makefile.am (1.50), demos/ppl_lpsol/ppl_lpsol.1
+ (1.9), demos/ppl_lpsol/ppl_lpsol.c (1.92),
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.5),
+ demos/ppl_lpsol/examples/Makefile.am (1.12),
+ devtools/bump_copyright_years (1.2), doc/Makefile.am (1.101),
+ doc/README.doc (1.19), doc/definitions.dox (1.227),
+ doc/devref-language-interface.tex (1.2), doc/devref.tex (1.28),
+ doc/libppl.3 (1.15), doc/libppl_c.3 (1.5), doc/ppl-config.1
+ (1.15), doc/ppl-config_extra_man_text (1.6), doc/ppl.sty (1.30),
+ doc/user-language-interface.tex (1.2), doc/user.tex (1.29),
+ fedora/ppl.hh (1.2), fedora/ppl_c.h (1.2), fedora/pwl.hh (1.2),
+ interfaces/Makefile.am (1.37), interfaces/interfaced_boxes.hh
+ (1.6), interfaces/marked_pointers.hh (1.4),
+ interfaces/ppl_interface_generator_common.m4 (1.36),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.94),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.46), interfaces/ppl_interface_generator_copyright (1.8),
+ interfaces/C/C_interface.dox (1.16), interfaces/C/Makefile.am
+ (1.63), interfaces/C/ppl_c_header.h (1.9),
+ interfaces/C/ppl_c_implementation_common.cc (1.5),
+ interfaces/C/ppl_c_implementation_common.defs.hh (1.8),
+ interfaces/C/ppl_c_implementation_common.inlines.hh (1.5),
+ interfaces/C/ppl_c_version.h.in (1.10),
+ interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.56),
+ interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.15),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.27),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.49),
+ interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.11),
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.15), interfaces/C/tests/Makefile.am (1.7),
+ interfaces/C/tests/cxxoutput.c (1.7),
+ interfaces/C/tests/ppl_c_test.cc (1.2),
+ interfaces/C/tests/ppl_c_test.h (1.3),
+ interfaces/C/tests/print_to_buffer.cc (1.6),
+ interfaces/C/tests/print_to_buffer.h (1.6),
+ interfaces/Java/Makefile.am (1.26),
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+ (1.13), interfaces/Java/jni/Makefile.am (1.35),
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.34),
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+ (1.9), interfaces/Java/jni/ppl_java_common.cc (1.55),
+ interfaces/Java/jni/ppl_java_common.defs.hh (1.8),
+ interfaces/Java/jni/ppl_java_common.inlines.hh (1.6),
+ interfaces/Java/jni/ppl_java_globals.cc (1.27),
+ interfaces/Java/parma_polyhedra_library/By_Reference.java (1.4),
+ interfaces/Java/parma_polyhedra_library/Coefficient.java (1.4),
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Congruence.java
+ (1.3),
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java
+ (1.4), interfaces/Java/parma_polyhedra_library/Constraint.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ (1.3),
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
+ (1.3),
+ interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (1.5), interfaces/Java/parma_polyhedra_library/Generator.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Generator_System.java
+ (1.3),
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+ (1.5),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+ (1.4), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+ (1.6),
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+ (1.3), interfaces/Java/parma_polyhedra_library/Makefile.am
+ (1.12),
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+ (1.4), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+ (1.6), interfaces/Java/parma_polyhedra_library/Pair.java (1.4),
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+ (1.5),
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+ (1.4),
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+ (1.4), interfaces/Java/parma_polyhedra_library/Variable.java
+ (1.4), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+ (1.3),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.8),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.18), interfaces/Java/tests/C_Polyhedron_test1.java (1.18),
+ interfaces/Java/tests/MIP_Problem_test1.java (1.4),
+ interfaces/Java/tests/Makefile.am (1.27),
+ interfaces/Java/tests/NNC_Polyhedron_test1.java (1.5),
+ interfaces/Java/tests/PPL_Test.java (1.2),
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java (1.3),
+ interfaces/Java/tests/Test_Executor.java (1.4),
+ interfaces/Java/tests/Test_Partial_Function.java (1.6),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.22),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.52), interfaces/Java/tests/ppl_java_tests_common (1.19),
+ interfaces/OCaml/Makefile.am (1.66),
+ interfaces/OCaml/OCaml_interface.dox (1.8),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.63),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 (1.5),
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 (1.5),
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.5),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.21),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.53),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.25),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (1.43),
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.7), interfaces/OCaml/ppl_ocaml_common.cc (1.8),
+ interfaces/OCaml/ppl_ocaml_common.defs.hh (1.3),
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh (1.2),
+ interfaces/OCaml/ppl_ocaml_globals.ml (1.15),
+ interfaces/OCaml/ppl_ocaml_globals.mli (1.2),
+ interfaces/OCaml/tests/Makefile.am (1.28),
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+ (1.5),
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (1.22), interfaces/OCaml/tests/ppl_ocaml_tests_common (1.7),
+ interfaces/OCaml/tests/test1.ml (1.17),
+ interfaces/Prolog/Makefile.am (1.69),
+ interfaces/Prolog/Prolog_interface.dox (1.182),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.22),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.12), interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+ (1.13),
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+ (1.15),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.16),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+ (1.11),
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.8),
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (1.15), interfaces/Prolog/ppl_prolog_common.cc (1.14),
+ interfaces/Prolog/ppl_prolog_common.defs.hh (1.12),
+ interfaces/Prolog/ppl_prolog_common.inlines.hh (1.3),
+ interfaces/Prolog/Ciao/Makefile.am (1.89),
+ interfaces/Prolog/Ciao/ciao_cfli.hh (1.8),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.21),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.17),
+ interfaces/Prolog/Ciao/ciao_efli.cc (1.7),
+ interfaces/Prolog/Ciao/ciao_efli.hh (1.4),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.31),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.11),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+ (1.4), interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/GNU/Makefile.am (1.88),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.13),
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl (1.2),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.14),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.12),
+ interfaces/Prolog/GNU/gprolog_efli.cc (1.5),
+ interfaces/Prolog/GNU/gprolog_efli.hh (1.3),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.10), interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/SICStus/Makefile.am (1.102),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.16), interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.30),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.10),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.12),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.21),
+ interfaces/Prolog/SICStus/sicstus_efli.cc (1.5),
+ interfaces/Prolog/SICStus/sicstus_efli.hh (1.3),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.21),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.15),
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl (1.2),
+ interfaces/Prolog/SWI/Makefile.am (1.106),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.15),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.13),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.21), interfaces/Prolog/SWI/ppl_pl.cc (1.15),
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.4),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.10),
+ interfaces/Prolog/SWI/swi_cfli.hh (1.11),
+ interfaces/Prolog/SWI/swi_efli.cc (1.6),
+ interfaces/Prolog/SWI/swi_efli.hh (1.6),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.13),
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.5),
+ interfaces/Prolog/XSB/Makefile.am (1.82),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.12),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.18),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 (1.3),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ (1.5), interfaces/Prolog/XSB/ppl_prolog_sysdep.hh (1.4),
+ interfaces/Prolog/XSB/xsb_cfli.hh (1.7),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.20),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.18),
+ interfaces/Prolog/XSB/xsb_efli.cc (1.6),
+ interfaces/Prolog/XSB/xsb_efli.hh (1.3),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.36),
+ interfaces/Prolog/YAP/Makefile.am (1.72),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.13),
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.14),
+ interfaces/Prolog/YAP/yap_cfli.hh (1.7),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.15),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.11),
+ interfaces/Prolog/YAP/yap_efli.cc (1.3),
+ interfaces/Prolog/YAP/yap_efli.hh (1.3),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.15),
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl (1.2),
+ interfaces/Prolog/tests/Makefile.am (1.35),
+ interfaces/Prolog/tests/clpq.pl (1.12),
+ interfaces/Prolog/tests/clpq2.pl (1.14),
+ interfaces/Prolog/tests/expected_clpq2_int16 (1.6),
+ interfaces/Prolog/tests/expected_clpq2_int16_a (1.6),
+ interfaces/Prolog/tests/expected_clpq2_int32 (1.5),
+ interfaces/Prolog/tests/expected_clpq2_int32_a (1.7),
+ interfaces/Prolog/tests/expected_clpq2_int64 (1.5),
+ interfaces/Prolog/tests/expected_clpq2_int64_a (1.5),
+ interfaces/Prolog/tests/expected_clpq2_int8 (1.8),
+ interfaces/Prolog/tests/expected_clpq2_int8_a (1.8),
+ interfaces/Prolog/tests/expected_clpq2_mpz (1.5),
+ interfaces/Prolog/tests/expected_clpq2_mpz_a (1.5),
+ interfaces/Prolog/tests/expected_clpq_int16 (1.7),
+ interfaces/Prolog/tests/expected_clpq_int16_a (1.7),
+ interfaces/Prolog/tests/expected_clpq_int32 (1.5),
+ interfaces/Prolog/tests/expected_clpq_int32_a (1.5),
+ interfaces/Prolog/tests/expected_clpq_int64 (1.5),
+ interfaces/Prolog/tests/expected_clpq_int64_a (1.5),
+ interfaces/Prolog/tests/expected_clpq_int8 (1.5),
+ interfaces/Prolog/tests/expected_clpq_int8_a (1.5),
+ interfaces/Prolog/tests/expected_clpq_mpz (1.5),
+ interfaces/Prolog/tests/expected_clpq_mpz_a (1.5),
+ interfaces/Prolog/tests/pl_check.pl (1.70),
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+ (1.5),
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.12),
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+ (1.3), m4/Makefile.am (1.31), m4/ac_check_ciao.m4 (1.5),
+ m4/ac_check_fpu_control.m4 (1.16), m4/ac_check_gmp.m4 (1.33),
+ m4/ac_check_sicstus_prolog.m4 (1.9), m4/ac_check_swi_prolog.m4
+ (1.19), m4/ac_check_xsb_prolog.m4 (1.6),
+ m4/ac_cxx_attribute_weak.m4 (1.11),
+ m4/ac_cxx_double_binary_format.m4 (1.18),
+ m4/ac_cxx_double_exact_output.m4 (1.11),
+ m4/ac_cxx_flexible_arrays.m4 (1.17),
+ m4/ac_cxx_float_binary_format.m4 (1.15),
+ m4/ac_cxx_float_exact_output.m4 (1.9),
+ m4/ac_cxx_ieee_inexact_flag.m4 (1.6), m4/ac_cxx_limit_memory.m4
+ (1.3), m4/ac_cxx_long_double_binary_format.m4 (1.22),
+ m4/ac_cxx_long_double_exact_output.m4 (1.16),
+ m4/ac_cxx_proper_long_double.m4 (1.6), m4/ac_cxx_remainder_bug.m4
+ (1.7), m4/ac_prog_jar.m4 (1.4), m4/ac_prog_java.m4 (1.7),
+ m4/ac_prog_javac.m4 (1.8), m4/ac_prog_javah.m4 (1.10),
+ m4/ac_text_md5sum.m4 (1.5), m4/ppl.m4 (1.12), m4/ppl_c.m4 (1.5),
+ src/Any_Pointset.defs.hh (1.21), src/Any_Pointset.inlines.hh
+ (1.5), src/Any_Pointset.types.hh (1.4), src/Ask_Tell.defs.hh
+ (1.20), src/Ask_Tell.inlines.hh (1.19), src/Ask_Tell.templates.hh
+ (1.11), src/Ask_Tell.types.hh (1.8), src/BDS_Status.idefs.hh
+ (1.25), src/BDS_Status.inlines.hh (1.21), src/BD_Shape.cc (1.10),
+ src/BD_Shape.defs.hh (1.138), src/BD_Shape.inlines.hh (1.173),
+ src/BD_Shape.templates.hh (1.129), src/BD_Shape.types.hh (1.8),
+ src/BHRZ03_Certificate.cc (1.15), src/BHRZ03_Certificate.defs.hh
+ (1.20), src/BHRZ03_Certificate.inlines.hh (1.11),
+ src/BHRZ03_Certificate.types.hh (1.7), src/Bit_Matrix.cc (1.7),
+ src/Bit_Matrix.defs.hh (1.6), src/Bit_Matrix.inlines.hh (1.5),
+ src/Bit_Matrix.types.hh (1.4), src/Bit_Row.cc (1.8),
+ src/Bit_Row.defs.hh (1.12), src/Bit_Row.inlines.hh (1.11),
+ src/Bit_Row.types.hh (1.4), src/Boundary.defs.hh (1.17),
+ src/Box.cc (1.11), src/Box.defs.hh (1.68), src/Box.inlines.hh
+ (1.44), src/Box.templates.hh (1.140), src/Box.types.hh (1.5),
+ src/Box_Status.idefs.hh (1.4), src/Box_Status.inlines.hh (1.5),
+ src/C_Integer.hh (1.8), src/C_Polyhedron.cc (1.29),
+ src/C_Polyhedron.defs.hh (1.60), src/C_Polyhedron.inlines.hh
+ (1.44), src/C_Polyhedron.types.hh (1.13), src/Checked_Number.cc
+ (1.15), src/Checked_Number.defs.hh (1.103),
+ src/Checked_Number.inlines.hh (1.87),
+ src/Checked_Number.templates.hh (1.3),
+ src/Checked_Number.types.hh (1.12), src/Coefficient.cc (1.10),
+ src/Coefficient.defs.hh (1.12), src/Coefficient.inlines.hh
+ (1.11), src/Coefficient.types.hh (1.17),
+ src/Coefficient_traits_template.hh (1.10), src/Congruence.cc
+ (1.23), src/Congruence.defs.hh (1.27), src/Congruence.inlines.hh
+ (1.21), src/Congruence.types.hh (1.5), src/Congruence_System.cc
+ (1.32), src/Congruence_System.defs.hh (1.28),
+ src/Congruence_System.inlines.hh (1.13),
+ src/Congruence_System.types.hh (1.5), src/Constraint.cc (1.72),
+ src/Constraint.defs.hh (1.132), src/Constraint.inlines.hh (1.73),
+ src/Constraint.types.hh (1.13), src/Constraint_System.cc (1.31),
+ src/Constraint_System.defs.hh (1.42),
+ src/Constraint_System.inlines.hh (1.14),
+ src/Constraint_System.types.hh (1.7), src/DB_Matrix.defs.hh
+ (1.31), src/DB_Matrix.inlines.hh (1.35),
+ src/DB_Matrix.templates.hh (1.11), src/DB_Matrix.types.hh (1.8),
+ src/DB_Row.defs.hh (1.27), src/DB_Row.inlines.hh (1.26),
+ src/DB_Row.templates.hh (1.9), src/DB_Row.types.hh (1.10),
+ src/Determinate.defs.hh (1.69), src/Determinate.inlines.hh
+ (1.60), src/Determinate.types.hh (1.12), src/Float.cc (1.9),
+ src/Float.defs.hh (1.34), src/Float.inlines.hh (1.36),
+ src/GMP_Integer.defs.hh (1.30), src/GMP_Integer.inlines.hh
+ (1.25), src/GMP_Integer.types.hh (1.18), src/Generator.cc (1.79),
+ src/Generator.defs.hh (1.128), src/Generator.inlines.hh (1.66),
+ src/Generator.types.hh (1.13), src/Generator_System.cc (1.29),
+ src/Generator_System.defs.hh (1.30),
+ src/Generator_System.inlines.hh (1.13),
+ src/Generator_System.types.hh (1.7), src/Grid.defs.hh (1.87),
+ src/Grid.inlines.hh (1.31), src/Grid.templates.hh (1.41),
+ src/Grid.types.hh (1.5), src/Grid_Certificate.cc (1.12),
+ src/Grid_Certificate.defs.hh (1.8),
+ src/Grid_Certificate.inlines.hh (1.6),
+ src/Grid_Certificate.types.hh (1.5), src/Grid_Generator.cc
+ (1.25), src/Grid_Generator.defs.hh (1.37),
+ src/Grid_Generator.inlines.hh (1.17), src/Grid_Generator.types.hh
+ (1.5), src/Grid_Generator_System.cc (1.23),
+ src/Grid_Generator_System.defs.hh (1.31),
+ src/Grid_Generator_System.inlines.hh (1.19),
+ src/Grid_Generator_System.types.hh (1.5), src/Grid_Status.cc
+ (1.11), src/Grid_Status.idefs.hh (1.10),
+ src/Grid_Status.inlines.hh (1.6), src/Grid_chdims.cc (1.27),
+ src/Grid_conversion.cc (1.26), src/Grid_nonpublic.cc (1.41),
+ src/Grid_public.cc (1.91), src/Grid_simplify.cc (1.42),
+ src/Grid_widenings.cc (1.20), src/H79_Certificate.cc (1.14),
+ src/H79_Certificate.defs.hh (1.18),
+ src/H79_Certificate.inlines.hh (1.12),
+ src/H79_Certificate.types.hh (1.7), src/Has_Assign_Or_Swap.hh
+ (1.4), src/Init.cc (1.39), src/Init.defs.hh (1.23),
+ src/Init.inlines.hh (1.10), src/Init.types.hh (1.12),
+ src/Interval.defs.hh (1.65), src/Interval.inlines.hh (1.49),
+ src/Interval.templates.hh (1.5), src/Interval.types.hh (1.15),
+ src/Interval_Info.defs.hh (1.12), src/Interval_Info.inlines.hh
+ (1.10), src/Interval_Info.types.hh (1.5),
+ src/Interval_Restriction.defs.hh (1.17), src/Linear_Expression.cc
+ (1.22), src/Linear_Expression.defs.hh (1.41),
+ src/Linear_Expression.inlines.hh (1.16),
+ src/Linear_Expression.types.hh (1.7), src/Linear_Row.cc (1.27),
+ src/Linear_Row.defs.hh (1.27), src/Linear_Row.inlines.hh (1.15),
+ src/Linear_Row.types.hh (1.7), src/Linear_System.cc (1.52),
+ src/Linear_System.defs.hh (1.34), src/Linear_System.inlines.hh
+ (1.26), src/Linear_System.types.hh (1.7), src/MIP_Problem.cc
+ (1.80), src/MIP_Problem.defs.hh (1.41),
+ src/MIP_Problem.inlines.hh (1.20), src/MIP_Problem.templates.hh
+ (1.15), src/MIP_Problem.types.hh (1.4), src/Makefile.am (1.192),
+ src/Matrix.cc (1.100), src/Matrix.defs.hh (1.86),
+ src/Matrix.inlines.hh (1.55), src/Matrix.types.hh (1.13),
+ src/NNC_Polyhedron.cc (1.30), src/NNC_Polyhedron.defs.hh (1.62),
+ src/NNC_Polyhedron.inlines.hh (1.45), src/NNC_Polyhedron.types.hh
+ (1.13), src/Numeric_Format.defs.hh (1.9), src/OR_Matrix.defs.hh
+ (1.20), src/OR_Matrix.inlines.hh (1.15),
+ src/OR_Matrix.templates.hh (1.10), src/OR_Matrix.types.hh (1.5),
+ src/Octagonal_Shape.cc (1.9), src/Octagonal_Shape.defs.hh (1.64),
+ src/Octagonal_Shape.inlines.hh (1.43),
+ src/Octagonal_Shape.templates.hh (1.100),
+ src/Octagonal_Shape.types.hh (1.5), src/Og_Status.idefs.hh
+ (1.12), src/Og_Status.inlines.hh (1.8),
+ src/Partially_Reduced_Product.defs.hh (1.40),
+ src/Partially_Reduced_Product.inlines.hh (1.38),
+ src/Partially_Reduced_Product.templates.hh (1.17),
+ src/Partially_Reduced_Product.types.hh (1.6), src/Ph_Status.cc
+ (1.17), src/Ph_Status.idefs.hh (1.24), src/Ph_Status.inlines.hh
+ (1.11), src/Pointset_Ask_Tell.cc (1.9),
+ src/Pointset_Ask_Tell.defs.hh (1.19),
+ src/Pointset_Ask_Tell.inlines.hh (1.8),
+ src/Pointset_Ask_Tell.templates.hh (1.16),
+ src/Pointset_Ask_Tell.types.hh (1.5), src/Pointset_Powerset.cc
+ (1.26), src/Pointset_Powerset.defs.hh (1.57),
+ src/Pointset_Powerset.inlines.hh (1.18),
+ src/Pointset_Powerset.templates.hh (1.46),
+ src/Pointset_Powerset.types.hh (1.4), src/Poly_Con_Relation.cc
+ (1.18), src/Poly_Con_Relation.defs.hh (1.38),
+ src/Poly_Con_Relation.inlines.hh (1.18),
+ src/Poly_Con_Relation.types.hh (1.12), src/Poly_Gen_Relation.cc
+ (1.18), src/Poly_Gen_Relation.defs.hh (1.36),
+ src/Poly_Gen_Relation.inlines.hh (1.18),
+ src/Poly_Gen_Relation.types.hh (1.12), src/Polyhedron.defs.hh
+ (1.361), src/Polyhedron.inlines.hh (1.152),
+ src/Polyhedron.templates.hh (1.23), src/Polyhedron.types.hh
+ (1.19), src/Polyhedron_chdims.cc (1.51),
+ src/Polyhedron_nonpublic.cc (1.94), src/Polyhedron_public.cc
+ (1.150), src/Polyhedron_widenings.cc (1.70), src/Powerset.defs.hh
+ (1.33), src/Powerset.inlines.hh (1.23), src/Powerset.templates.hh
+ (1.7), src/Powerset.types.hh (1.8), src/Ptr_Iterator.defs.hh
+ (1.15), src/Ptr_Iterator.inlines.hh (1.10),
+ src/Ptr_Iterator.types.hh (1.8), src/Rational_Box.hh (1.9),
+ src/Rational_Interval.hh (1.2), src/Result.defs.hh (1.21),
+ src/Result.inlines.hh (1.13), src/Rounding_Dir.defs.hh (1.15),
+ src/Rounding_Dir.inlines.hh (1.11), src/Row.cc (1.107),
+ src/Row.defs.hh (1.114), src/Row.inlines.hh (1.70),
+ src/Row.types.hh (1.14), src/Scalar_Products.cc (1.12),
+ src/Scalar_Products.defs.hh (1.12),
+ src/Scalar_Products.inlines.hh (1.9),
+ src/Scalar_Products.types.hh (1.6), src/Slow_Copy.hh (1.4),
+ src/Temp.defs.hh (1.9), src/Temp.inlines.hh (1.7),
+ src/Temp.templates.hh (1.4), src/Topology.hh (1.16),
+ src/Variable.cc (1.26), src/Variable.defs.hh (1.56),
+ src/Variable.inlines.hh (1.27), src/Variable.types.hh (1.13),
+ src/Variables_Set.cc (1.8), src/Variables_Set.defs.hh (1.10),
+ src/Variables_Set.inlines.hh (1.7), src/Variables_Set.types.hh
+ (1.4), src/Widening_Function.defs.hh (1.20),
+ src/Widening_Function.inlines.hh (1.17),
+ src/Widening_Function.types.hh (1.8), src/algorithms.hh (1.51),
+ src/assign_or_swap.hh (1.3), src/checked.cc (1.26),
+ src/checked.defs.hh (1.52), src/checked.inlines.hh (1.53),
+ src/checked_ext.defs.hh (1.16), src/checked_ext.inlines.hh
+ (1.43), src/checked_float.inlines.hh (1.100),
+ src/checked_int.inlines.hh (1.74), src/checked_mpq.inlines.hh
+ (1.49), src/checked_mpz.inlines.hh (1.61),
+ src/checked_numeric_limits.hh (1.24), src/compiler.hh (1.17),
+ src/conversion.cc (1.89), src/distances.defs.hh (1.6),
+ src/distances.inlines.hh (1.7), src/distances.types.hh (1.5),
+ src/fpu-c99.inlines.hh (1.23), src/fpu-ia32.cc (1.4),
+ src/fpu-ia32.inlines.hh (1.23), src/fpu-none.inlines.hh (1.11),
+ src/fpu-sparc.inlines.hh (1.13), src/fpu.defs.hh (1.22),
+ src/fpu.types.hh (1.7), src/globals.cc (1.34),
+ src/globals.defs.hh (1.63), src/globals.inlines.hh (1.26),
+ src/globals.types.hh (1.13), src/initializer.hh (1.17),
+ src/iterator_to_const.defs.hh (1.9),
+ src/iterator_to_const.inlines.hh (1.6),
+ src/iterator_to_const.types.hh (1.4), src/math_utilities.defs.hh
+ (1.2), src/math_utilities.inlines.hh (1.5),
+ src/max_space_dimension.hh (1.15), src/meta_programming.hh
+ (1.13), src/minimize.cc (1.51), src/mp_std_bits.cc (1.7),
+ src/mp_std_bits.defs.hh (1.7), src/mp_std_bits.inlines.hh (1.6),
+ src/namespaces.hh (1.18), src/ppl-config.cc.in (1.26),
+ src/ppl_header.hh (1.14), src/simplify.cc (1.56), src/stdiobuf.cc
+ (1.3), src/stdiobuf.defs.hh (1.4), src/stdiobuf.inlines.hh (1.3),
+ src/stdiobuf.types.hh (1.2), src/swapping_sort.icc (1.15),
+ src/version.cc (1.16), src/version.hh.in (1.18),
+ tests/Makefile.am (1.275), tests/Partial_Function.cc (1.9),
+ tests/Partial_Function.defs.hh (1.7),
+ tests/Partial_Function.inlines.hh (1.6),
+ tests/Partial_Function.types.hh (1.5), tests/README (1.5),
+ tests/Random_Number_Generator.defs.hh (1.7),
+ tests/Random_Number_Generator.inlines.hh (1.13),
+ tests/Random_Number_Generator.types.hh (1.5), tests/files.cc
+ (1.13), tests/files.hh (1.13), tests/ppl_test.cc (1.20),
+ tests/ppl_test.hh (1.80), tests/Ask_Tell/Makefile.am (1.8),
+ tests/Ask_Tell/append1.cc (1.9), tests/BD_Shape/Makefile.am
+ (1.86), tests/BD_Shape/addconstraints1.cc (1.23),
+ tests/BD_Shape/addspacedims1.cc (1.20),
+ tests/BD_Shape/affinedimension1.cc (1.15),
+ tests/BD_Shape/affineimage1.cc (1.24),
+ tests/BD_Shape/affineimage2.cc (1.17),
+ tests/BD_Shape/affinepreimage1.cc (1.26),
+ tests/BD_Shape/ascii_dump_load1.cc (1.19),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.12),
+ tests/BD_Shape/bhmz05widening1.cc (1.20),
+ tests/BD_Shape/bhz03widening1.cc (1.12),
+ tests/BD_Shape/bounded1.cc (1.6),
+ tests/BD_Shape/boundedaffineimage1.cc (1.8),
+ tests/BD_Shape/boundedaffinepreimage1.cc (1.8),
+ tests/BD_Shape/bounds1.cc (1.6),
+ tests/BD_Shape/cc76extrapolation1.cc (1.25),
+ tests/BD_Shape/cc76narrowing1.cc (1.22),
+ tests/BD_Shape/closure1.cc (1.31), tests/BD_Shape/concatenate1.cc
+ (1.18), tests/BD_Shape/congruences1.cc (1.6),
+ tests/BD_Shape/constrains1.cc (1.2),
+ tests/BD_Shape/constraints1.cc (1.26),
+ tests/BD_Shape/contains1.cc (1.18),
+ tests/BD_Shape/containsintegerpoint1.cc (1.8),
+ tests/BD_Shape/difference1.cc (1.2), tests/BD_Shape/discrete1.cc
+ (1.6), tests/BD_Shape/disjoint1.cc (1.9),
+ tests/BD_Shape/empty1.cc (1.14), tests/BD_Shape/equality1.cc
+ (1.19), tests/BD_Shape/expandspacedim1.cc (1.8),
+ tests/BD_Shape/foldspacedims1.cc (1.10),
+ tests/BD_Shape/frombdshape1.cc (1.5), tests/BD_Shape/frombox1.cc
+ (1.4), tests/BD_Shape/fromgensys1.cc (1.19),
+ tests/BD_Shape/fromgrid1.cc (1.6),
+ tests/BD_Shape/fromoctagonalshape1.cc (1.5),
+ tests/BD_Shape/frompolyhedron1.cc (1.8),
+ tests/BD_Shape/fromspacedim1.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.23),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.26),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.20),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.21),
+ tests/BD_Shape/generalizedaffinepreimage3.cc (1.11),
+ tests/BD_Shape/geomcovers1.cc (1.13),
+ tests/BD_Shape/h79widening1.cc (1.17),
+ tests/BD_Shape/intersection1.cc (1.22),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.20),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.21),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.18),
+ tests/BD_Shape/mapspacedims1.cc (1.20),
+ tests/BD_Shape/max_min1.cc (1.6), tests/BD_Shape/max_min2.cc
+ (1.13), tests/BD_Shape/maxspacedim1.cc (1.7),
+ tests/BD_Shape/membytes1.cc (1.9),
+ tests/BD_Shape/minconstraints1.cc (1.16),
+ tests/BD_Shape/relations1.cc (1.21), tests/BD_Shape/relations2.cc
+ (1.26), tests/BD_Shape/relations3.cc (1.32),
+ tests/BD_Shape/relations4.cc (1.14),
+ tests/BD_Shape/removespacedims1.cc (1.25),
+ tests/BD_Shape/run_tests (1.21),
+ tests/BD_Shape/simplifyusingcontext1.cc (1.2),
+ tests/BD_Shape/timeelapse1.cc (1.27),
+ tests/BD_Shape/unconstrain1.cc (1.2), tests/BD_Shape/universe1.cc
+ (1.18), tests/BD_Shape/upperbound1.cc (1.3),
+ tests/BD_Shape/upperboundifexact1.cc (1.2),
+ tests/BD_Shape/writebdshape1.cc (1.14), tests/Box/Makefile.am
+ (1.80), tests/Box/addconstraints1.cc (1.15),
+ tests/Box/addspacedims1.cc (1.10), tests/Box/affinedimension1.cc
+ (1.8), tests/Box/affineimage1.cc (1.12),
+ tests/Box/affinepreimage1.cc (1.9), tests/Box/ascii_dump_load1.cc
+ (1.12), tests/Box/bgp99extrapolation1.cc (1.7),
+ tests/Box/bhz03widening1.cc (1.6), tests/Box/bounded1.cc (1.6),
+ tests/Box/boundedaffineimage1.cc (1.17),
+ tests/Box/boundedaffinepreimage1.cc (1.10),
+ tests/Box/cc76narrowing1.cc (1.9), tests/Box/cc76widening.cc
+ (1.9), tests/Box/concatenate1.cc (1.10),
+ tests/Box/congruences1.cc (1.6), tests/Box/constrains1.cc (1.2),
+ tests/Box/constraints1.cc (1.13), tests/Box/contains1.cc (1.8),
+ tests/Box/containsintegerpoint1.cc (1.8),
+ tests/Box/difference1.cc (1.9), tests/Box/discrete1.cc (1.8),
+ tests/Box/disjoint1.cc (1.8), tests/Box/empty1.cc (1.8),
+ tests/Box/equality1.cc (1.7), tests/Box/expandspacedim1.cc
+ (1.11), tests/Box/foldspacedims1.cc (1.11),
+ tests/Box/frombdshape1.cc (1.5), tests/Box/frombox1.cc (1.8),
+ tests/Box/fromgensys1.cc (1.7), tests/Box/fromgrid1.cc (1.9),
+ tests/Box/frompartiallyreducedproduct1.cc (1.4),
+ tests/Box/frompolyhedron1.cc (1.14), tests/Box/frompolyhedron2.cc
+ (1.11), tests/Box/fromspacedim1.cc (1.4),
+ tests/Box/generalizedaffineimage1.cc (1.18),
+ tests/Box/generalizedaffineimage2.cc (1.7),
+ tests/Box/generalizedaffinepreimage1.cc (1.17),
+ tests/Box/geomcovers1.cc (1.7), tests/Box/intersection1.cc
+ (1.12), tests/Box/interval1.cc (1.11), tests/Box/mapspacedims1.cc
+ (1.9), tests/Box/max_min1.cc (1.10), tests/Box/maxspacedim1.cc
+ (1.7), tests/Box/membytes1.cc (1.9), tests/Box/minconstraints1.cc
+ (1.8), tests/Box/propagateconstraints1.cc (1.2),
+ tests/Box/propagateconstraints2.cc (1.13),
+ tests/Box/refinewithcongruences1.cc (1.4),
+ tests/Box/refinewithconstraint1.cc (1.5),
+ tests/Box/refinewithconstraint2.cc (1.2),
+ tests/Box/refinewithconstraints1.cc (1.7),
+ tests/Box/refinewithconstraints2.cc (1.4),
+ tests/Box/relations1.cc (1.8), tests/Box/relations2.cc (1.7),
+ tests/Box/relations3.cc (1.6), tests/Box/relations4.cc (1.4),
+ tests/Box/removespacedims1.cc (1.12), tests/Box/run_tests (1.5),
+ tests/Box/timeelapse1.cc (1.11), tests/Box/topclosed1.cc (1.5),
+ tests/Box/unconstrain1.cc (1.3), tests/Box/universe1.cc (1.7),
+ tests/Box/upperbound1.cc (1.2), tests/Box/upperboundifexact1.cc
+ (1.4), tests/Box/writebox1.cc (1.7), tests/Grid/Makefile.am
+ (1.75), tests/Grid/addcongruence1.cc (1.16),
+ tests/Grid/addcongruences1.cc (1.19),
+ tests/Grid/addconstraint1.cc (1.19),
+ tests/Grid/addconstraints1.cc (1.21), tests/Grid/addgenerator1.cc
+ (1.18), tests/Grid/addgenerators1.cc (1.19),
+ tests/Grid/addspacedims1.cc (1.18), tests/Grid/affinedim1.cc
+ (1.15), tests/Grid/affineimage1.cc (1.16),
+ tests/Grid/affineimage2.cc (1.16), tests/Grid/affinepreimage1.cc
+ (1.17), tests/Grid/affinepreimage2.cc (1.11),
+ tests/Grid/approximatepartition1.cc (1.6),
+ tests/Grid/asciidumpload1.cc (1.17), tests/Grid/asciidumpload2.cc
+ (1.9), tests/Grid/asciidumpload3.cc (1.7),
+ tests/Grid/asciidumpload4.cc (1.7), tests/Grid/asciidumpload5.cc
+ (1.5), tests/Grid/asciidumpload6.cc (1.5),
+ tests/Grid/bhz03widening1.cc (1.15), tests/Grid/bounded1.cc
+ (1.17), tests/Grid/boundedaffineimage1.cc (1.6),
+ tests/Grid/boundedaffinepreimage1.cc (1.6),
+ tests/Grid/boundingbox1.cc (1.21), tests/Grid/bounds1.cc (1.19),
+ tests/Grid/certificate1.cc (1.17), tests/Grid/concatenate1.cc
+ (1.16), tests/Grid/congruence1.cc (1.21),
+ tests/Grid/congruences1.cc (1.15), tests/Grid/congruences2.cc
+ (1.8), tests/Grid/constraints1.cc (1.3), tests/Grid/contains1.cc
+ (1.14), tests/Grid/containsintegerpoint1.cc (1.7),
+ tests/Grid/coveringbox1.cc (1.19), tests/Grid/coveringbox2.cc
+ (1.16), tests/Grid/discrete1.cc (1.11), tests/Grid/disjoint1.cc
+ (1.15), tests/Grid/equals1.cc (1.16),
+ tests/Grid/expandspacedim1.cc (1.15),
+ tests/Grid/foldspacedims1.cc (1.15), tests/Grid/frombdshape1.cc
+ (1.5), tests/Grid/frombox1.cc (1.2), tests/Grid/fromgrid1.cc
+ (1.2), tests/Grid/fromoctagonalshape1.cc (1.5),
+ tests/Grid/frompolyhedron1.cc (1.3),
+ tests/Grid/generalizedaffineimage1.cc (1.17),
+ tests/Grid/generalizedaffineimage2.cc (1.16),
+ tests/Grid/generalizedaffineimage3.cc (1.8),
+ tests/Grid/generalizedaffinepreimage1.cc (1.19),
+ tests/Grid/generalizedaffinepreimage2.cc (1.19),
+ tests/Grid/generalizedaffinepreimage3.cc (1.8),
+ tests/Grid/generator1.cc (1.23), tests/Grid/generators1.cc
+ (1.16), tests/Grid/generators2.cc (1.5), tests/Grid/grid1.cc
+ (1.23), tests/Grid/grid2.cc (1.18), tests/Grid/grid3.cc (1.30),
+ tests/Grid/griddifference1.cc (1.16), tests/Grid/intersection1.cc
+ (1.14), tests/Grid/isempty1.cc (1.10), tests/Grid/isuniverse1.cc
+ (1.12), tests/Grid/limitedextrapolation1.cc (1.16),
+ tests/Grid/limitedextrapolation2.cc (1.10),
+ tests/Grid/limitedextrapolation3.cc (1.9),
+ tests/Grid/mapspacedims1.cc (1.13), tests/Grid/maxmin1.cc (1.17),
+ tests/Grid/membytes1.cc (1.14), tests/Grid/mincongruences1.cc
+ (1.14), tests/Grid/mingenerators1.cc (1.13),
+ tests/Grid/outputoperator1.cc (1.12),
+ tests/Grid/outputoperator2.cc (1.5),
+ tests/Grid/outputoperator3.cc (1.5), tests/Grid/partition1.cc
+ (1.10), tests/Grid/powersetdifference1.cc (1.8),
+ tests/Grid/powersetgeometricallycovers1.cc (1.6),
+ tests/Grid/powersetgeometricallyequals1.cc (1.5),
+ tests/Grid/refinewithcongruences1.cc (1.3),
+ tests/Grid/refinewithconstraints1.cc (1.3),
+ tests/Grid/relations1.cc (1.18), tests/Grid/relations2.cc (1.20),
+ tests/Grid/relations3.cc (1.11), tests/Grid/removespacedims1.cc
+ (1.17), tests/Grid/removespacedims2.cc (1.18),
+ tests/Grid/timeelapse1.cc (1.14), tests/Grid/topclosed1.cc
+ (1.15), tests/Grid/topclosure1.cc (1.10),
+ tests/Grid/unconstrain1.cc (1.2), tests/Grid/upperbound1.cc
+ (1.2), tests/Grid/upperbound2.cc (1.2), tests/Grid/widening1.cc
+ (1.19), tests/Grid/widening2.cc (1.13), tests/Grid/widening3.cc
+ (1.9), tests/Grid/writecongruencesystem.cc (1.10),
+ tests/MIP_Problem/Makefile.am (1.14),
+ tests/MIP_Problem/ascii_dump_load1.cc (1.6),
+ tests/MIP_Problem/exceptions1.cc (1.6),
+ tests/MIP_Problem/mipproblem1.cc (1.14),
+ tests/MIP_Problem/mipproblem2.cc (1.13),
+ tests/MIP_Problem/mipproblem3.cc (1.8),
+ tests/Octagonal_Shape/Makefile.am (1.38),
+ tests/Octagonal_Shape/addspacedims1.cc (1.6),
+ tests/Octagonal_Shape/affinedimension1.cc (1.7),
+ tests/Octagonal_Shape/affineimage1.cc (1.6),
+ tests/Octagonal_Shape/affineimage2.cc (1.5),
+ tests/Octagonal_Shape/affinepreimage1.cc (1.9),
+ tests/Octagonal_Shape/affinepreimage2.cc (1.6),
+ tests/Octagonal_Shape/ascii_dump_load1.cc (1.5),
+ tests/Octagonal_Shape/bhmz05widening1.cc (1.6),
+ tests/Octagonal_Shape/bhz03widening1.cc (1.5),
+ tests/Octagonal_Shape/bounded1.cc (1.5),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.13),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.7),
+ tests/Octagonal_Shape/bounds1.cc (1.6),
+ tests/Octagonal_Shape/cc76extrapolation1.cc (1.8),
+ tests/Octagonal_Shape/cc76narrowing1.cc (1.6),
+ tests/Octagonal_Shape/chinainit.cc (1.5),
+ tests/Octagonal_Shape/concatenate1.cc (1.5),
+ tests/Octagonal_Shape/congruences1.cc (1.7),
+ tests/Octagonal_Shape/constrains1.cc (1.2),
+ tests/Octagonal_Shape/constraints1.cc (1.8),
+ tests/Octagonal_Shape/contains1.cc (1.6),
+ tests/Octagonal_Shape/containsintegerpoint1.cc (1.9),
+ tests/Octagonal_Shape/difference1.cc (1.2),
+ tests/Octagonal_Shape/discrete1.cc (1.6),
+ tests/Octagonal_Shape/disjoint1.cc (1.9),
+ tests/Octagonal_Shape/empty1.cc (1.5),
+ tests/Octagonal_Shape/expandspacedim1.cc (1.8),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.7),
+ tests/Octagonal_Shape/frombdshape1.cc (1.3),
+ tests/Octagonal_Shape/frombox1.cc (1.2),
+ tests/Octagonal_Shape/fromgensys1.cc (1.5),
+ tests/Octagonal_Shape/fromgrid1.cc (1.4),
+ tests/Octagonal_Shape/fromoctagonalshape1.cc (1.3),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.7),
+ tests/Octagonal_Shape/fromspacedim1.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.12),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.8),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.12),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.8),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.7),
+ tests/Octagonal_Shape/intersection1.cc (1.7),
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.9),
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.9),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.7),
+ tests/Octagonal_Shape/max_min1.cc (1.7),
+ tests/Octagonal_Shape/max_min2.cc (1.8),
+ tests/Octagonal_Shape/maxspacedim1.cc (1.7),
+ tests/Octagonal_Shape/membytes1.cc (1.9),
+ tests/Octagonal_Shape/minconstraints1.cc (1.7),
+ tests/Octagonal_Shape/relatwithcons1.cc (1.6),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.11),
+ tests/Octagonal_Shape/relatwithcons3.cc (1.4),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.11),
+ tests/Octagonal_Shape/removespacedims1.cc (1.6),
+ tests/Octagonal_Shape/run_tests (1.5),
+ tests/Octagonal_Shape/timeelapse1.cc (1.7),
+ tests/Octagonal_Shape/unconstrain1.cc (1.2),
+ tests/Octagonal_Shape/universe1.cc (1.5),
+ tests/Octagonal_Shape/upperbound1.cc (1.2),
+ tests/Octagonal_Shape/writeoctagon1.cc (1.7),
+ tests/Partially_Reduced_Product/Makefile.am (1.9),
+ tests/Partially_Reduced_Product/asciidumpload1.cc (1.4),
+ tests/Partially_Reduced_Product/directproduct1.cc (1.5),
+ tests/Partially_Reduced_Product/directproduct2.cc (1.4),
+ tests/Partially_Reduced_Product/directproduct3.cc (1.5),
+ tests/Partially_Reduced_Product/directproduct4.cc (1.3),
+ tests/Partially_Reduced_Product/directproduct5.cc (1.3),
+ tests/Partially_Reduced_Product/directproduct6.cc (1.5),
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.6),
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (1.5),
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+ (1.3),
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+ (1.3), tests/Polyhedron/Makefile.am (1.135),
+ tests/Polyhedron/addcongruence1.cc (1.12),
+ tests/Polyhedron/addcongruences1.cc (1.15),
+ tests/Polyhedron/addconstraint1.cc (1.13),
+ tests/Polyhedron/addconstraints1.cc (1.14),
+ tests/Polyhedron/addconstraints2.cc (1.13),
+ tests/Polyhedron/addgenerator1.cc (1.14),
+ tests/Polyhedron/addgenerator2.cc (1.14),
+ tests/Polyhedron/addgenerators1.cc (1.15),
+ tests/Polyhedron/addgenerators2.cc (1.14),
+ tests/Polyhedron/addspacedims1.cc (1.14),
+ tests/Polyhedron/addspacedims2.cc (1.14),
+ tests/Polyhedron/affineimage1.cc (1.14),
+ tests/Polyhedron/affineimage2.cc (1.15),
+ tests/Polyhedron/affinepreimage1.cc (1.13),
+ tests/Polyhedron/affinetrans.cc (1.13),
+ tests/Polyhedron/append1.cc (1.16), tests/Polyhedron/append2.cc
+ (1.15), tests/Polyhedron/ascii_dump_load1.cc (1.12),
+ tests/Polyhedron/ascii_dump_load2.cc (1.12),
+ tests/Polyhedron/ascii_dump_load3.cc (1.13),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.16),
+ tests/Polyhedron/bgp99extrapolation2.cc (1.10),
+ tests/Polyhedron/bhrz03widening1.cc (1.14),
+ tests/Polyhedron/bhrz03widening2.cc (1.13),
+ tests/Polyhedron/bhrz03widening3.cc (1.18),
+ tests/Polyhedron/bhz03widening1.cc (1.16),
+ tests/Polyhedron/bounded1.cc (1.13),
+ tests/Polyhedron/boundedaffineimage1.cc (1.17),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.11),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.14),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.14),
+ tests/Polyhedron/bounds1.cc (1.13),
+ tests/Polyhedron/cnncconversion1.cc (1.7),
+ tests/Polyhedron/concatenate1.cc (1.13),
+ tests/Polyhedron/congruences1.cc (1.16),
+ tests/Polyhedron/constrains1.cc (1.3),
+ tests/Polyhedron/constraints1.cc (1.13),
+ tests/Polyhedron/contains1.cc (1.12),
+ tests/Polyhedron/contains2.cc (1.12),
+ tests/Polyhedron/containsintegerpoint1.cc (1.6),
+ tests/Polyhedron/disjoint1.cc (1.12),
+ tests/Polyhedron/disjoint2.cc (1.14),
+ tests/Polyhedron/dualhypercubes.cc (1.18),
+ tests/Polyhedron/empty1.cc (1.13), tests/Polyhedron/equals1.cc
+ (1.12), tests/Polyhedron/exceptions1.cc (1.19),
+ tests/Polyhedron/exceptions2.cc (1.16),
+ tests/Polyhedron/exceptions3.cc (1.13),
+ tests/Polyhedron/expandspacedim1.cc (1.15),
+ tests/Polyhedron/expandspacedim2.cc (1.15),
+ tests/Polyhedron/foldspacedims1.cc (1.17),
+ tests/Polyhedron/foldspacedims2.cc (1.18),
+ tests/Polyhedron/frombdshape1.cc (1.3),
+ tests/Polyhedron/frombox1.cc (1.6), tests/Polyhedron/frombox2.cc
+ (1.6), tests/Polyhedron/fromgrid1.cc (1.3),
+ tests/Polyhedron/fromoctagonalshape1.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.15),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.15),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.12),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.11),
+ tests/Polyhedron/generators1.cc (1.13),
+ tests/Polyhedron/geomcovers1.cc (1.16),
+ tests/Polyhedron/h79widening1.cc (1.14),
+ tests/Polyhedron/h79widening2.cc (1.13),
+ tests/Polyhedron/hybrid.cc (1.10),
+ tests/Polyhedron/intersection1.cc (1.17),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.12),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.13),
+ tests/Polyhedron/linearpartition1.cc (1.17),
+ tests/Polyhedron/linearsystem1.cc (1.12),
+ tests/Polyhedron/linexpression1.cc (1.12),
+ tests/Polyhedron/mapspacedims1.cc (1.17),
+ tests/Polyhedron/matrix1.cc (1.12), tests/Polyhedron/max_min1.cc
+ (1.14), tests/Polyhedron/maxspacedim1.cc (1.20),
+ tests/Polyhedron/mc91.cc (1.17), tests/Polyhedron/membytes1.cc
+ (1.18), tests/Polyhedron/memory1.cc (1.21),
+ tests/Polyhedron/memory2.cc (1.20),
+ tests/Polyhedron/minconstraints1.cc (1.12),
+ tests/Polyhedron/minconstraints2.cc (1.14),
+ tests/Polyhedron/mingenerators1.cc (1.12),
+ tests/Polyhedron/mingenerators2.cc (1.13),
+ tests/Polyhedron/nncminimize1.cc (1.11),
+ tests/Polyhedron/nncminimize2.cc (1.9),
+ tests/Polyhedron/numberinput1.cc (1.34),
+ tests/Polyhedron/onepoint.cc (1.13), tests/Polyhedron/permute.cc
+ (1.13), tests/Polyhedron/polydifference1.cc (1.16),
+ tests/Polyhedron/polydifference2.cc (1.15),
+ tests/Polyhedron/polyhull1.cc (1.16),
+ tests/Polyhedron/polyhull2.cc (1.16),
+ tests/Polyhedron/polyhullifexact1.cc (1.5),
+ tests/Polyhedron/polyhullifexact2.cc (1.3),
+ tests/Polyhedron/randphull1.cc (1.17),
+ tests/Polyhedron/refinewithcongruence1.cc (1.2),
+ tests/Polyhedron/refinewithcongruences1.cc (1.3),
+ tests/Polyhedron/refinewithconstraint1.cc (1.2),
+ tests/Polyhedron/refinewithconstraints1.cc (1.2),
+ tests/Polyhedron/relations1.cc (1.13),
+ tests/Polyhedron/relations2.cc (1.14),
+ tests/Polyhedron/relations3.cc (1.13),
+ tests/Polyhedron/removespacedims1.cc (1.13),
+ tests/Polyhedron/removespacedims2.cc (1.13),
+ tests/Polyhedron/simplifyusingcontext1.cc (1.4),
+ tests/Polyhedron/smm1.cc (1.12), tests/Polyhedron/timeelapse1.cc
+ (1.14), tests/Polyhedron/timeelapse2.cc (1.14),
+ tests/Polyhedron/topclosed1.cc (1.13),
+ tests/Polyhedron/topclosure1.cc (1.13),
+ tests/Polyhedron/unconstrain1.cc (1.2),
+ tests/Polyhedron/universe1.cc (1.13),
+ tests/Polyhedron/universe2.cc (1.13),
+ tests/Polyhedron/variablesset1.cc (1.13),
+ tests/Polyhedron/watchdog1.cc (1.12),
+ tests/Polyhedron/writeconsys1.cc (1.13),
+ tests/Polyhedron/writegensys1.cc (1.13),
+ tests/Polyhedron/writepolyhedron1.cc (1.13),
+ tests/Polyhedron/writepolyhedron2.cc (1.13),
+ tests/Polyhedron/writerelation1.cc (1.15),
+ tests/Polyhedron/writevariable1.cc (1.10),
+ tests/Powerset/Makefile.am (1.13),
+ tests/Powerset/addcongruences1.cc (1.2),
+ tests/Powerset/addconstraints1.cc (1.2),
+ tests/Powerset/affinedimension1.cc (1.2),
+ tests/Powerset/affineimage1.cc (1.2),
+ tests/Powerset/affinepreimage1.cc (1.2),
+ tests/Powerset/bounded1.cc (1.2), tests/Powerset/bounds1.cc
+ (1.2), tests/Powerset/closed1.cc (1.2),
+ tests/Powerset/closure1.cc (1.2), tests/Powerset/collapse1.cc
+ (1.2), tests/Powerset/concatenate1.cc (1.2),
+ tests/Powerset/contains1.cc (1.2),
+ tests/Powerset/containsintegerpoint1.cc (1.2),
+ tests/Powerset/difference1.cc (1.3), tests/Powerset/discrete1.cc
+ (1.2), tests/Powerset/disjoint1.cc (1.2),
+ tests/Powerset/disjunct1.cc (1.2), tests/Powerset/empty1.cc
+ (1.2), tests/Powerset/entails1.cc (1.2),
+ tests/Powerset/equals1.cc (1.2), tests/Powerset/frombdshape1.cc
+ (1.2), tests/Powerset/frombox1.cc (1.2),
+ tests/Powerset/fromcongruences1.cc (1.2),
+ tests/Powerset/fromconstraints1.cc (1.3),
+ tests/Powerset/fromgrid1.cc (1.2),
+ tests/Powerset/fromoctagonalshape1.cc (1.2),
+ tests/Powerset/frompolyhedron1.cc (1.2),
+ tests/Powerset/fromspacedimension1.cc (1.3),
+ tests/Powerset/intersection1.cc (1.2), tests/Powerset/maxmin1.cc
+ (1.2), tests/Powerset/meet1.cc (1.2), tests/Powerset/membytes1.cc
+ (1.2), tests/Powerset/powerset1.cc (1.2),
+ tests/Powerset/reduce1.cc (1.2), tests/Powerset/refinewith1.cc
+ (1.2), tests/Powerset/relationwith1.cc (1.2),
+ tests/Powerset/simplifyusingcontext1.cc (1.8),
+ tests/Powerset/size1.cc (1.2), tests/Powerset/spacedims1.cc
+ (1.2), tests/Powerset/universe1.cc (1.2),
+ tests/Powerset/upperbound1.cc (1.2), utils/Makefile.am (1.20),
+ utils/build_header.in (1.8), utils/cm_cleaner.sh (1.6),
+ utils/cm_splitter.sh (1.6), utils/text2cxxarray.in (1.6),
+ utils/timings.cc (1.14), utils/timings.hh (1.8): Copyright years
+ extended.
+
+2008-12-29 Monday 14:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/upperboundifexact1.cc (1.3): New test added.
+
+2008-12-23 Tuesday 19:30 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.48): Fixed typo.
+
+2008-12-23 Tuesday 12:22 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.47): Fixed typo.
+
+2008-12-23 Tuesday 11:41 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.64): Added missing const_cast.
+
+2008-12-22 Monday 12:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.63): Added declarations for methods
+ lower_approximation_difference_assign() and
+ simplify_using_context_assign().
+
+2008-12-22 Monday 10:55 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.46): Simplified (and hopefully fixed)
+ can_be_exactly_joined logics.
+
+2008-12-22 Monday 10:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.139): Method
+ upper_bound_assign_if_exact() corrected and its efficiency
+ improved.
+
+2008-12-22 Monday 10:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/upperboundifexact1.cc (1.2): Adapted to test the method
+ on the Box domain.
+
+2008-12-21 Sunday 16:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh (1.16), src/Box.inlines.hh (1.43),
+ src/Box.templates.hh (1.138), src/Interval.defs.hh (1.62),
+ src/Interval.inlines.hh (1.45), src/Interval_Restriction.defs.hh
+ (1.16), tests/Box/Makefile.am (1.79),
+ tests/Box/upperboundifexact1.cc (1.1): New implementation of
+ method Box::upper_bound_assign_if_exact(const Box&).
+
+2008-12-18 Thursday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.412): Version number bumped.
+
+2008-12-18 Thursday 09:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.33): Added several missing try { ... } CATCH_ALL blocks. Now
+ all interfaced functions should be able to translate any C++
+ exception into a Java exception.
+
+2008-12-18 Thursday 09:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.defs.hh (1.7): The CATCH_ALL
+ macro should not end with a semicolon.
+
+2008-12-18 Thursday 09:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.54): Added a newline
+ for readability.
+
+2008-12-17 Wednesday 18:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.17): Corrected a typo in the naming of a parameter.
+
+2008-12-17 Wednesday 17:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.85), simplifyusingcontext1.cc
+ (1.1): Added test for method
+ BD_Shape<T>::simplify_using_context_assign().
+
+2008-12-17 Wednesday 17:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.128): Drafted an implementation for
+ simplify_using_context_assign().
+
+2008-12-17 Wednesday 13:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.93): Method
+ BFT00_poly_hull_assign_if_exact() is only correct for closed
+ polyhedra: added an assertion and adapted comments. Added draft
+ implementation for new method BHZ09_poly_hull_assign_if_exact().
+
+2008-12-17 Wednesday 12:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.79): Indentation fixed.
+
+2008-12-17 Wednesday 12:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.360): Corrected the specification of
+ method BFT00__poly_hull_assign_if_exact: the method is only
+ correct for closed polyhedra. Added declaration for another
+ (protected) method that will be based on an alternative algorithm
+ (named BHZ09_poly_hull_assign_if_exact).
+
+2008-12-17 Wednesday 12:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bit_Row.cc (1.7): Added a naive, inefficient implementation
+ for method set_until.
+
+2008-12-16 Tuesday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, ChangeLog, NEWS, README, README.arm, README.configure,
+ STANDARDS, TODO, configure.ac, Watchdog/ChangeLog,
+ Watchdog/README, Watchdog/config.rpath, Watchdog/configure.ac,
+ Watchdog/doc/Makefile.am, Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/Makefile.am,
+ Watchdog/m4/lib-ld.m4, Watchdog/m4/lib-link.m4,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_lpsol/ppl_lpsol.c,
+ devtools/print_nonascii_lines, doc/Makefile.am,
+ doc/definitions.dox,
+ doc/devref-foreign-language-interface.doxyconf.in,
+ doc/devref-foreign-language-interface.tex,
+ doc/devref-language-interface.doxyconf.in,
+ doc/devref-language-interface.tex, doc/libppl.3, doc/libppl_c.3,
+ doc/ppl-config.1, doc/ppl.sty,
+ doc/user-foreign-language-interface.doxyconf.in,
+ doc/user-foreign-language-interface.tex,
+ doc/user-language-interface.doxyconf.in,
+ doc/user-language-interface.tex, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, fedora/ppl.spec,
+ interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Java/Makefile.am, interfaces/Java/README.java,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/README.ocaml,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+ interfaces/OCaml/tests/test1.ml,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ m4/ac_check_swi_prolog.m4, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Row.inlines.hh,
+ src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+ src/Box.templates.hh, src/Box_Status.inlines.hh,
+ src/C_Polyhedron.cc, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Congruence.cc,
+ src/Congruence_System.cc, src/Constraint.cc,
+ src/DB_Matrix.templates.hh, src/DB_Row.inlines.hh,
+ src/Determinate.inlines.hh, src/Float.defs.hh, src/Generator.cc,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator_System.cc, src/Grid_Status.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Init.cc,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/MIP_Problem.cc, src/Makefile.am, src/Matrix.cc,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Og_Status.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.defs.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.inlines.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.inlines.hh, src/Temp.inlines.hh,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/conversion.cc,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/globals.defs.hh,
+ src/globals.inlines.hh, src/math_utilities.inlines.hh,
+ src/meta_programming.hh, src/namespaces.hh, src/ppl_header.hh,
+ src/simplify.cc, src/version.cc, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/pointsetpowerset1.cc,
+ tests/BD_Shape/upperboundifexact1.cc, tests/Box/Makefile.am,
+ tests/Box/ascii_dump_load1.cc, tests/Box/empty1.cc,
+ tests/Box/fromgrid1.cc, tests/Box/pointsetpowerset1.cc,
+ tests/Box/pointsetpowerset2.cc,
+ tests/Box/refinewithconstraint1.cc, tests/Grid/Makefile.am,
+ tests/Grid/bounds1.cc, tests/Grid/maxmin1.cc,
+ tests/Grid/partition1.cc, tests/Grid/pointsetpowerset1.cc,
+ tests/MIP_Problem/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/pointsetpowerset1.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polyhullifexact1.cc,
+ tests/Polyhedron/polyhullifexact2.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Powerset/Makefile.am, tests/Powerset/addcongruences1.cc,
+ tests/Powerset/addconstraints1.cc,
+ tests/Powerset/affinedimension1.cc,
+ tests/Powerset/affineimage1.cc,
+ tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+ tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+ tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+ tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+ tests/Powerset/containsintegerpoint1.cc,
+ tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+ tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+ tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+ tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+ tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+ tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+ tests/Powerset/fromoctagonalshape1.cc,
+ tests/Powerset/frompolyhedron1.cc,
+ tests/Powerset/fromspacedimension1.cc,
+ tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+ tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+ tests/Powerset/pointsetpowerset1.cc,
+ tests/Powerset/pointsetpowerset2.cc,
+ tests/Powerset/pointsetpowerset3.cc,
+ tests/Powerset/pointsetpowerset4.cc,
+ tests/Powerset/pointsetpowerset5.cc,
+ tests/Powerset/pointsetpowerset6.cc, tests/Powerset/product1.cc,
+ tests/Powerset/reduce1.cc, tests/Powerset/refinewith1.cc,
+ tests/Powerset/relationwith1.cc, tests/Powerset/size1.cc,
+ tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+ tests/Powerset/upperbound1.cc
+ (bounded_arithmetic.[2,3,3,2,3,2,2,3,3,3,2,2,3,3,3,3,2,2,2,3,2,3,3,2,3,3,3,3,2,2,4,3,3,1,3,3,2,2,3,3,2,1,4,2,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,2,3,3,4,2,3,3,3,2,3,3,3,3,4,4,4,4,3,4,4,4,4,4,4,3,4,4,3,2,3,3,2,1,3,2,3,2,2,4,3,2,2,3,3,3,2,3,3,3,2,1,3,3,3,2,2,3,3,3,1,1,3,3,2,3,1,2,1,1,3,1,1,2,3,2,2,1,2,1,1,1,3,3,2,3,3,3,2,1,2,1,3,3,1,2,2,3,2,3,1,3,2,2,1,1,3,3,3,1,1,4,2,3,4,3,2,1,1,1,1,1,2,2,3,3,2,3,1,2,3,2,2,2,1,1,1,2,2,2,2,3,2,2,3,2,1,2,2,2,2,3,2,2,2,2,2,3,1,3,3,4,1,2,1,2,2,2,2,2,3,4,2,2, [...]
+ Third merge of the trunk to the bounded_arithmetic branch.
+
+2008-12-13 Saturday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.64): Added missing inclusions.
+
+2008-12-05 Friday 07:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.29): Added `%dir %{_datadir}/doc/pwl' to the
+ `%files' section of the `ppl-pwl' package.
+
+2008-12-01 Monday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.inlines.hh (1.20), Box_Status.inlines.hh (1.4),
+ Grid_Status.cc (1.10), Og_Status.inlines.hh (1.7), Ph_Status.cc
+ (1.16): Dealt with several false-alarm warnings about possibly
+ uninitialized variables.
+
+2008-12-01 Monday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.411): Fixed the definition of
+ BUILD_OCAML_INTERFACE.
+
+2008-12-01 Monday 11:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.cc (1.29): Restored old implementation of
+ method poly_hull_assign_if_exact(), as the algorithm in BFT00TR
+ does not generalizes as is to the NNC case.
+
+2008-12-01 Monday 11:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact2.cc (1.2): Added another test,
+ showing that the algorithm in BFT00 can not be extented as is to
+ NNC polyhedra.
+
+2008-12-01 Monday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact2.cc (bounded_arithmetic.1): file
+ polyhullifexact2.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:36 +0000
+
+2008-11-30 Sunday 21:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.57): Postpone the AC_LIB_RPATH test.
+
+2008-11-30 Sunday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.410): Removed "AC_SUBST([docdir],
+ ['${datadir}/doc/ppl'])": given that we require Autoconf 2.60 or
+ later version, this was redundant. Moreover, it did not allow to
+ use the `--docdir' configure option. (Thanks to Mike Frysinger.)
+
+2008-11-27 Thursday 18:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.78): Indentation fixed.
+
+2008-11-26 Wednesday 18:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.92): Wrong comment deleted.
+
+2008-11-26 Wednesday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.cc (1.11): Indentation fixed.
+
+2008-11-25 Tuesday 20:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.134), bgp99extrapolation1.cc
+ (1.15), bgp99extrapolation2.cc (1.9): Test file
+ bgp99extrapolation1.cc splitted in two: old test02 goes in file
+ bgp99extrapoaltion2.cc and is now specialized to C and NNC cases,
+ so as to allow a finer control of the expected overflows.
+
+2008-11-25 Tuesday 20:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/bgp99extrapolation2.cc (bounded_arithmetic.1):
+ file bgp99extrapolation2.cc was added on branch
+ bounded_arithmetic on 2008-12-16 06:57:36 +0000
+
+2008-11-25 Tuesday 20:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact1.cc (1.4): test09() triggers an
+ overflow when using on 8-bit checked integers.
+
+2008-11-25 Tuesday 20:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact1.cc (bounded_arithmetic.1): file
+ polyhullifexact1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:36 +0000
+
+2008-11-25 Tuesday 15:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.137), BD_Shape.inlines.hh (1.172),
+ BD_Shape.templates.hh (1.127): Drafted an implementation of
+ method BD_Shape::upper_bound_assign_if_exact(), based on
+ Algorithm 4.1 in BemporadFT00TR (tailored to BD shapes).
+
+2008-11-25 Tuesday 15:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.84), upperboundifexact1.cc (1.1):
+ Added a few tests for BD_Shape::upper_bound_assign_if_exact().
+
+2008-11-25 Tuesday 15:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/upperboundifexact1.cc (bounded_arithmetic.1): file
+ upperboundifexact1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:34 +0000
+
+2008-11-25 Tuesday 09:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.91): Prefer Bit_Row::empty() to
+ Bit_Row::count_ones() when testing for emptiness.
+
+2008-11-25 Tuesday 09:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (1.67): Fixed comment for
+ Box::simplify_using_context_assign().
+
+2008-11-25 Tuesday 09:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (1.42): Indentation fixed.
+
+2008-11-25 Tuesday 09:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.126): Drafted implementation for
+ incremental_shortest_path_closure_assign().
+
+2008-11-25 Tuesday 09:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.99): Useless test for
+ zero-dim removed from incremental_strong_closure_assign().
+
+2008-11-25 Tuesday 09:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (1.63): Improved the documentation of
+ the incremental strong closure private method.
+
+2008-11-25 Tuesday 09:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.136): Declared a private method for
+ incremental shortest-path closure.
+
+2008-11-25 Tuesday 08:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/difference1.cc (1.2): test03() no longer overflows
+ on 8-bit checked integer coefficients.
+
+2008-11-25 Tuesday 08:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/difference1.cc (bounded_arithmetic.1): file
+ difference1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-24 Monday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh (1.10): Fixed Bit_Row::count_ones().
+
+2008-11-24 Monday 18:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.133), polyhullifexact1.cc
+ (1.3), polyhullifexact2.cc (1.1): Tests that are specific for
+ NNC_Polyhedron placed in a separate file, for which we do not
+ produce the derived nnc test.
+
+2008-11-24 Monday 18:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polyhullifexact1.cc (1.2): Added a few tests
+ that are specific for the NNC_Polyhedron case.
+
+2008-11-24 Monday 18:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.cc (1.28): Method
+ NNC_Polyhedron::poly_hull_assign_if_exact() is now implemented
+ using Polyhedron::BFT00_poly_hull_assign_if_exact().
+
+2008-11-24 Monday 17:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.359), Polyhedron_nonpublic.cc (1.90):
+ Implementation of BFT00_poly_hull_assign_if_exact() generalized
+ so as to correctly deal with the case of NNC polyhedra.
+
+2008-11-24 Monday 15:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.137): Unwanted code removed.
+
+2008-11-24 Monday 12:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.cc (1.28): Method
+ C_Polyhedron::poly_hull_assign_if_exact() is now implemented
+ using Polyhedron::BFT00_poly_hull_assign_if_exact().
+
+2008-11-24 Monday 12:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.358), Polyhedron_nonpublic.cc (1.89):
+ Added protected method BFT00_poly_hull_assign_if_exact(),
+ implementing (a variant of) an algorithm for the recognition of
+ convex unions originally proposed by Bemporad, Fukuda and Torrisi
+ in 2000.
+
+2008-11-24 Monday 11:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.132), polyhullifexact1.cc
+ (1.1): Added tests for method poly_hull_assign_if_exact().
+
+2008-11-24 Monday 10:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.136), src/Grid_Generator.defs.hh (1.36),
+ tests/Box/fromgrid1.cc (1.8): The implementation of the Box from
+ Grid constructor has been modified to use Grid::maximize() to
+ check if a dimension is bounded and no longer needs
+ Grid_Generator to declare the Box class as a friend. The
+ FIXME(0.10.1) wrt this has been removed.
+
+2008-11-24 Monday 09:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.281): Report bug fix corrected in previous commit.
+
+2008-11-24 Monday 09:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (1.40): Corrected private method bounds()
+ whereby it did not correctly deal with the case when the grid
+ generators were up-to-date but not minimized. This corrects the
+ bugs shown in the previous commit.
+
+2008-11-24 Monday 09:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: bounds1.cc (1.18), maxmin1.cc (1.16): Tests added
+ that show a bug in bounds_from_above(), bounds_from_below(),
+ maximize(), and minimize() in the Grids class.
+
+2008-11-22 Saturday 13:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.39),
+ src/Partially_Reduced_Product.inlines.hh (1.37),
+ src/Partially_Reduced_Product.templates.hh (1.16),
+ tests/Partially_Reduced_Product/directproduct6.cc (1.4): When
+ building from another product with different component domains
+ and/or reduction operator, allow for any component domains and in
+ any order.
+
+ When building a product always check the space dimensions are no
+ more than max_space_dimensions().
+
+ Correct some comments in the Partially_Reduced_Product.defs.hh.
+
+ A few tests added to test these code changes.
+
+2008-11-22 Saturday 10:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc (1.3): Removed some
+ commented out, useless code (it was the result of cut&paste from
+ another test). Added known result for test01 and check against
+ it. Renumbered tests.
+
+2008-11-21 Friday 22:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.27): Also set
+ nodist_ppl_ocaml_generated_test_opt_SOURCES.
+
+2008-11-21 Friday 10:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.65), tests/Makefile.am (1.26):
+ Let the stack size limit for native compilation be as generous as
+ that for bytecode compilation.
+
+2008-11-20 Thursday 22:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.280), TODO (1.295): The OCaml interface now supports
+ compilation to native code. Also mentioned in the NEWS the
+ correction of an OCaml interface bug.
+
+2008-11-20 Thursday 22:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (1.7): Added a few lines explaining
+ how to use the OCaml interface with the native compiler ocamlopt.
+
+2008-11-20 Thursday 22:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.64): List libppl_ocaml.a in
+ variable pkglib_LIBRARIES (removing it from variables
+ noinst_LIBRARIES and ocaml_DATA). When building the native OCaml
+ interface, do generate, install and clean the library file
+ ppl_ocaml.a.
+
+2008-11-20 Thursday 21:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.63), tests/Makefile.am (1.25):
+ Avoid using OCaml (bytecode/native) compiler option -g. Do also
+ clean *.o files generated by ocamlopt.
+
+2008-11-20 Thursday 17:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.171), Octagonal_Shape.inlines.hh
+ (1.42): Two bogus TODOs changed into (urgent) FIXMEs.
+
+2008-11-20 Thursday 14:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.24): Build and run the
+ bytecode/native OCaml tests depending on the availability of the
+ bytecode/native OCaml compilers.
+
+2008-11-20 Thursday 14:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.62): Build the bytecode/native
+ OCaml interfaces depending on the availability of the
+ bytecode/native OCaml compilers (and corresponding mlgmp
+ libraries).
+
+2008-11-20 Thursday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.62), ppl_interface_generator_ocaml_ml_code.m4 (1.52),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.21):
+ Corrected a bug in the code for the OCaml function
+ ppl_Grid_generalized_affine_(pre)image_with_congruence; also
+ corrected corresponding test.
+
+2008-11-20 Thursday 13:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.409): Check whether or not the OCaml native
+ compiler ocamlopt is available.
+
+2008-11-20 Thursday 13:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.templates.hh (1.15): Avoid reducing
+ the product where it is not essential.
+
+2008-11-20 Thursday 08:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.279): Added a note concerning the correction of a bug in
+ the Partially_Reduced_Product<>::time_elapse_assign().
+
+2008-11-20 Thursday 08:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.36),
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (1.4): In the time_elapse, both components must be reduced before
+ doing the operation. The clear_reduced_flag() after the operation
+ removed and the tagged FIXME removed.
+
+ Test added showing an example that is only correct if the second
+ component is also reduced.
+
+2008-11-19 Wednesday 22:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.294): Added several new items.
+
+2008-11-19 Wednesday 21:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.35): Restored the
+ clear_reduced_flag() for the time_elapse_assign. FIXME also
+ restored as this still needs checking.
+
+2008-11-19 Wednesday 20:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.149): Added missing verb in comment.
+
+2008-11-19 Wednesday 10:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.38),
+ Partially_Reduced_Product.inlines.hh (1.34): Several tagged
+ FIXME's removed. CHECKME Comment for the widening operation
+ modified to confirm that this _is_ a widening for the products as
+ provided here.
+
+2008-11-19 Wednesday 08:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/shrinkusingcongruences1.cc
+ (products.1): file shrinkusingcongruences1.cc was added on branch
+ products on 2009-01-05 13:54:39 +0000
+
+2008-11-19 Wednesday 08:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.37),
+ src/Partially_Reduced_Product.inlines.hh (1.33),
+ src/Partially_Reduced_Product.templates.hh (1.14),
+ src/Partially_Reduced_Product.types.hh (1.5),
+ tests/Partially_Reduced_Product/Makefile.am (1.8),
+ tests/Partially_Reduced_Product/shrinkusingcongruences1.cc (1.2):
+ Removed previously added reduction method.
+
+2008-11-18 Tuesday 15:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.36),
+ src/Partially_Reduced_Product.inlines.hh (1.32),
+ src/Partially_Reduced_Product.templates.hh (1.13),
+ src/Partially_Reduced_Product.types.hh (1.4),
+ tests/Partially_Reduced_Product/Makefile.am (1.7),
+ tests/Partially_Reduced_Product/shrinkusingcongruences1.cc (1.1):
+ Added a reduction method Shrink_Using_Congruences_Reduction<> and
+ the product Shrink_Using_Congruences_Product<> that assumes this
+ reduction.
+
+2008-11-18 Tuesday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.278): Mention bug fix for
+ Polyhedron::contains_integer_point().
+
+2008-11-18 Tuesday 14:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.148): Added a couple of comments
+ regarding the recently corrected bug in contains_integer_point().
+
+2008-11-18 Tuesday 13:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/containsintegerpoint1.cc (bounded_arithmetic.1):
+ file containsintegerpoint1.cc was added on branch
+ bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-18 Tuesday 13:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.11),
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+ (1.2), tests/Powerset/Makefile.am (1.12),
+ tests/Powerset/containsintegerpoint1.cc (1.1): Corrected some m4
+ code that resulted in wrongly named test predicates. Corrected
+ expected answers for tests that checked properties such as
+ "is_empty()". Added tests for the contains_integer_point() for
+ the Pointset_Powerset domain.
+
+2008-11-18 Tuesday 13:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/containsintegerpoint1.cc (1.5),
+ src/Polyhedron_public.cc (1.147): Several bugs in code for
+ contains_integer_point() fixed. Added new tests that showed the
+ bugs. Uncommented some tests.
+
+2008-11-18 Tuesday 08:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.146): Corrected typo in comment.
+
+2008-11-17 Monday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.277): Recorded the fix solving the `make check' problem
+ when the `--disable-watchdog' configure option is used.
+
+2008-11-17 Monday 17:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.131): The sources for test
+ memory1 should be distributed unconditionally (i.e., even when
+ valgrind tests are disabled).
+
+2008-11-17 Monday 17:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am (1.13): Test mipproblem2 should be
+ built iff the watchdog library is enabled.
+
+2008-11-16 Sunday 21:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Powerset/Makefile.am (1.11): Typo fixed.
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/addcongruences1.cc (bounded_arithmetic.1): file
+ addcongruences1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/addconstraints1.cc (bounded_arithmetic.1): file
+ addconstraints1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/affinedimension1.cc (bounded_arithmetic.1): file
+ affinedimension1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/affineimage1.cc (bounded_arithmetic.1): file
+ affineimage1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/affinepreimage1.cc (bounded_arithmetic.1): file
+ affinepreimage1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/bounded1.cc (bounded_arithmetic.1): file
+ bounded1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/bounds1.cc (bounded_arithmetic.1): file bounds1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/closed1.cc (bounded_arithmetic.1): file closed1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/closure1.cc (bounded_arithmetic.1): file
+ closure1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/collapse1.cc (bounded_arithmetic.1): file
+ collapse1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/concatenate1.cc (bounded_arithmetic.1): file
+ concatenate1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/contains1.cc (bounded_arithmetic.1): file
+ contains1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/discrete1.cc (bounded_arithmetic.1): file
+ discrete1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/disjoint1.cc (bounded_arithmetic.1): file
+ disjoint1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/disjunct1.cc (bounded_arithmetic.1): file
+ disjunct1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/empty1.cc (bounded_arithmetic.1): file empty1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/entails1.cc (bounded_arithmetic.1): file
+ entails1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/equals1.cc (bounded_arithmetic.1): file equals1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/fromconstraints1.cc (bounded_arithmetic.1): file
+ fromconstraints1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/fromspacedimension1.cc (bounded_arithmetic.1):
+ file fromspacedimension1.cc was added on branch
+ bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/intersection1.cc (bounded_arithmetic.1): file
+ intersection1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/maxmin1.cc (bounded_arithmetic.1): file maxmin1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/meet1.cc (bounded_arithmetic.1): file meet1.cc was
+ added on branch bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/membytes1.cc (bounded_arithmetic.1): file
+ membytes1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/reduce1.cc (bounded_arithmetic.1): file reduce1.cc
+ was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+ +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/refinewith1.cc (bounded_arithmetic.1): file
+ refinewith1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/relationwith1.cc (bounded_arithmetic.1): file
+ relationwith1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/size1.cc (bounded_arithmetic.1): file size1.cc was
+ added on branch bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/spacedims1.cc (bounded_arithmetic.1): file
+ spacedims1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/universe1.cc (bounded_arithmetic.1): file
+ universe1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/upperbound1.cc (bounded_arithmetic.1): file
+ upperbound1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Box/Makefile.am (1.78), Box/pointsetpowerset1.cc (1.9),
+ Polyhedron/polydifference1.cc (1.15), Powerset/Makefile.am
+ (1.10), Powerset/addcongruences1.cc (1.1),
+ Powerset/addconstraints1.cc (1.1), Powerset/affinedimension1.cc
+ (1.1), Powerset/affineimage1.cc (1.1),
+ Powerset/affinepreimage1.cc (1.1), Powerset/bounded1.cc (1.1),
+ Powerset/bounds1.cc (1.1), Powerset/closed1.cc (1.1),
+ Powerset/closure1.cc (1.1), Powerset/collapse1.cc (1.1),
+ Powerset/concatenate1.cc (1.1), Powerset/contains1.cc (1.1),
+ Powerset/difference1.cc (1.1), Powerset/discrete1.cc (1.1),
+ Powerset/disjoint1.cc (1.1), Powerset/disjunct1.cc (1.1),
+ Powerset/empty1.cc (1.1), Powerset/entails1.cc (1.1),
+ Powerset/equals1.cc (1.1), Powerset/fromconstraints1.cc (1.2),
+ Powerset/fromspacedimension1.cc (1.2), Powerset/intersection1.cc
+ (1.1), Powerset/maxmin1.cc (1.1), Powerset/meet1.cc (1.1),
+ Powerset/membytes1.cc (1.1), Powerset/pointsetpowerset1.cc (1.3),
+ Powerset/pointsetpowerset2.cc (1.3),
+ Powerset/pointsetpowerset3.cc (1.3),
+ Powerset/pointsetpowerset4.cc (1.3),
+ Powerset/pointsetpowerset5.cc (1.3), Powerset/product1.cc (1.2),
+ Powerset/reduce1.cc (1.1), Powerset/refinewith1.cc (1.1),
+ Powerset/relationwith1.cc (1.1), Powerset/size1.cc (1.1),
+ Powerset/spacedims1.cc (1.1), Powerset/universe1.cc (1.1),
+ Powerset/upperbound1.cc (1.1): Completed a reorganization of the
+ tests for the Powerset domains.
+
+2008-11-12 Wednesday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.34): On Darwin, avoid the
+ `-module' Libtool flag for building the `libppl_java' library.
+
+2008-11-12 Wednesday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/Makefile.am (1.9): Wrong file names fixed.
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/frombdshape1.cc (bounded_arithmetic.1): file
+ frombdshape1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/frombox1.cc (bounded_arithmetic.1): file
+ frombox1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/fromcongruences1.cc (bounded_arithmetic.1): file
+ fromcongruences1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/fromgrid1.cc (bounded_arithmetic.1): file
+ fromgrid1.cc was added on branch bounded_arithmetic on 2008-12-16
+ 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/fromoctagonalshape1.cc (bounded_arithmetic.1):
+ file fromoctagonalshape1.cc was added on branch
+ bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/frompolyhedron1.cc (bounded_arithmetic.1): file
+ frompolyhedron1.cc was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/Makefile.am (1.83),
+ BD_Shape/pointsetpowerset1.cc (1.6), Box/Makefile.am (1.77),
+ Box/pointsetpowerset2.cc (1.4), Grid/Makefile.am (1.74),
+ Grid/pointsetpowerset1.cc (1.5), Octagonal_Shape/Makefile.am
+ (1.37), Octagonal_Shape/pointsetpowerset1.cc (1.5),
+ Powerset/Makefile.am (1.8), Powerset/frombdshape1.cc (1.1),
+ Powerset/frombox1.cc (1.1), Powerset/fromcongruences1.cc (1.1),
+ Powerset/fromconstraints1.cc (1.1), Powerset/fromgrid1.cc (1.1),
+ Powerset/fromoctagonalshape1.cc (1.1),
+ Powerset/frompolyhedron1.cc (1.1),
+ Powerset/fromspacedimension1.cc (1.1),
+ Powerset/pointsetpowerset6.cc (1.2): Started reorganising the
+ tests for the powerset domains and moving all tests on the
+ powersets into the Powerset directory
+
+2008-11-11 Tuesday 18:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.18): Added a reference to a bug
+ report against Fedora's `pl' package.
+
+2008-11-11 Tuesday 09:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh (1.86), Grid.templates.hh (1.40),
+ Grid_conversion.cc (1.25), Grid_simplify.cc (1.41): Removed the
+ STRONG_REDUCTION macro and added comments where the code
+ implements the extra reduction needed for the strong minimal
+ form.
+
+2008-11-11 Tuesday 07:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.35),
+ ppl_interface_generator_common_dat.m4 (1.93),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.12),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.32),
+ Java/jni/ppl_interface_generator_java_classes_cc_files.m4 (1.8),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.7), OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.4),
+ OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 (1.4),
+ Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ (1.4),
+ Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+ (1.4): Improved handling of the patterns with a consequential
+ improvement to the speed of the m4 processing of the interface
+ files.
+
+2008-11-10 Monday 21:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_efli.cc (1.5), src/BD_Shape.inlines.hh
+ (1.170), src/BD_Shape.templates.hh (1.125),
+ src/Bit_Row.inlines.hh (1.9), src/Box.inlines.hh (1.41),
+ src/Box.templates.hh (1.135), src/Generator.inlines.hh (1.65),
+ src/Grid_public.cc (1.90), src/Interval.inlines.hh (1.44),
+ src/Interval_Restriction.defs.hh (1.15), src/MIP_Problem.cc
+ (1.77), src/Octagonal_Shape.inlines.hh (1.41),
+ src/Octagonal_Shape.templates.hh (1.98),
+ src/Polyhedron_nonpublic.cc (1.88), src/Polyhedron_public.cc
+ (1.145), src/Temp.inlines.hh (1.6), src/checked.inlines.hh
+ (1.52), src/checked_int.inlines.hh (1.73),
+ src/checked_mpz.inlines.hh (1.60), src/conversion.cc (1.88),
+ src/globals.defs.hh (1.62), src/math_utilities.inlines.hh (1.4):
+ DIRTY_TEMP* macros renamed with the "PPL_" prefix. A couple of
+ other improvements related to the proper use of Coefficient
+ objects.
+
+2008-11-10 Monday 19:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.templates.hh (1.12): Use
+ PPL_DIRTY_TEMP_COEFFICIENT whenever possible.
+
+2008-11-10 Monday 19:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.45): Use
+ PPL_DIRTY_TEMP_COEFFICIENT whenever possible.
+
+2008-11-10 Monday 19:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.45): Corrected typo in a comment.
+
+2008-11-10 Monday 19:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox (1.7): Small correction.
+
+2008-11-10 Monday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.276), src/globals.defs.hh (1.61): Macro
+ PPL_DIRTY_TEMP_COEFFICIENT properly commented. Notice that this
+ is now part of the C++ interface, hence its introduction is
+ mentioned in the NEWS file.
+
+2008-11-10 Monday 08:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.31), interfaces/Java/jni/ppl_java_common.cc (1.53),
+ interfaces/Java/jni/ppl_java_common.inlines.hh (1.5),
+ interfaces/Java/jni/ppl_java_globals.cc (1.26),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.61),
+ interfaces/OCaml/ppl_ocaml_common.cc (1.7),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.21), interfaces/Prolog/ppl_prolog_common.cc (1.13),
+ interfaces/Prolog/ppl_prolog_common.defs.hh (1.11),
+ src/BD_Shape.templates.hh (1.124), src/Box.templates.hh (1.134),
+ src/Congruence.cc (1.22), src/Congruence_System.cc (1.31),
+ src/Constraint.cc (1.71), src/Generator.cc (1.78),
+ src/Generator_System.cc (1.28), src/Grid.inlines.hh (1.30),
+ src/Grid.templates.hh (1.39), src/Grid_Generator.cc (1.24),
+ src/Grid_Generator_System.cc (1.22), src/Grid_conversion.cc
+ (1.24), src/Grid_nonpublic.cc (1.39), src/Grid_public.cc (1.89),
+ src/Grid_simplify.cc (1.40), src/Linear_Expression.cc (1.21),
+ src/Linear_Row.cc (1.26), src/MIP_Problem.cc (1.76),
+ src/Matrix.cc (1.99), src/Octagonal_Shape.templates.hh (1.97),
+ src/Pointset_Powerset.cc (1.25),
+ src/Pointset_Powerset.templates.hh (1.44),
+ src/Polyhedron.templates.hh (1.22), src/Polyhedron_nonpublic.cc
+ (1.87), src/Polyhedron_public.cc (1.144),
+ src/Polyhedron_widenings.cc (1.69), src/Row.cc (1.106),
+ src/Scalar_Products.inlines.hh (1.8), src/conversion.cc (1.87),
+ src/globals.defs.hh (1.60), src/math_utilities.inlines.hh (1.3),
+ tests/Grid/partition1.cc (1.9): Macro TEMP_INTEGER renamed
+ PPL_DIRTY_TEMP_COEFFICIENT.
+
+2008-11-10 Monday 07:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.51): Macro COPY_GMP renamed
+ PPL_MATCH_GMP_GCDEXT and undefined after use.
+
+2008-11-09 Sunday 21:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.86): COND* macros renamed with
+ the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 21:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.102), Float.defs.hh (1.33),
+ checked.defs.hh (1.51), checked_float.inlines.hh (1.99),
+ checked_numeric_limits.hh (1.23): NAN macro renamed with the
+ "PPL_" prefix and undefined after its use.
+
+2008-11-09 Sunday 20:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Boundary.defs.hh (1.15), Interval.defs.hh (1.61),
+ Interval_Restriction.defs.hh (1.14), globals.defs.hh (1.59),
+ meta_programming.hh (1.12), ppl_header.hh (1.13):
+ COMPILE_TIME_CHECK* macros renamed with the "PPL_" prefix and
+ undefined at the end of the library's C++ interface header file.
+
+2008-11-09 Sunday 19:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.defs.hh (1.50): The `nonconst' macro is now defined
+ and undefined in a completely safe way.
+
+2008-11-09 Sunday 18:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Rounding_Dir.inlines.hh (1.10), fpu-c99.inlines.hh (1.22),
+ fpu-ia32.inlines.hh (1.22), fpu-sparc.inlines.hh (1.12): Macros
+ FPU_DOWNWARD, FPU_TONEAREST, FPU_TOWARDZERO and FPU_UPWARD
+ renamed with the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 14:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.72): ASSIGN* macros renamed with
+ the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 14:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked.defs.hh (1.49), checked.inlines.hh (1.50):
+ FUNCTION_CLASS macro renamed with the "PPL_" prefix and undefined
+ after its use. Long source lines avoided.
+
+2008-11-09 Sunday 12:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.defs.hh (1.48): DEF_FUN* macros renamed with the
+ "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 12:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.85): DEF_ASSIGN_* macros renamed
+ with the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 12:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked.defs.hh (1.47), checked_float.inlines.hh (1.98),
+ checked_int.inlines.hh (1.71), checked_mpq.inlines.hh (1.48),
+ checked_mpz.inlines.hh (1.59), ppl_header.hh (1.12): SPECIALIZE_*
+ macros renamed with the "PPL_" prefix and undefined at the end of
+ the library's C++ interface header file.
+
+2008-11-09 Sunday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.49): Macro `safe_conversion' renamed
+ `PPL_SAFE_CONVERSION' and #undef'ined after its use.
+
+2008-11-09 Sunday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.275): Robustness has been improved.
+
+2008-11-09 Sunday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Row.inlines.hh (1.25), Row.inlines.hh (1.69): Use
+ std::numeric_limits<size_t>::max() instead of size_t(-1).
+
+2008-11-09 Sunday 09:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplify.cc (1.55): Took into account that no checks for
+ possible overflows are made in the implementation of new
+ expressions.
+
+2008-11-09 Sunday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (1.14): No longer use
+ compute_capacity(dimension_type requested_size).
+
+2008-11-08 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.58), globals.inlines.hh (1.25),
+ simplify.cc (1.54): No longer use compute_capacity(dimension_type
+ requested_size), now removed.
+
+2008-11-08 Saturday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: ascii_dump_load1.cc (1.11), empty1.cc (1.7),
+ refinewithconstraint1.cc (1.4): More FIXMEs tagged with
+ "(0.10.1)".
+
+2008-11-07 Friday 16:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.293), interfaces/ppl_interface_generator_common.m4
+ (1.34), interfaces/ppl_interface_generator_common_dat.m4 (1.92),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.44), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.55),
+ interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.14),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.48),
+ interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.10),
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.14),
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+ (1.11),
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.30),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.6),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.16),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.21),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.51), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+ (1.60),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 (1.4),
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.3),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.20),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.51),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.24),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (1.42),
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (1.20), interfaces/Prolog/Prolog_interface.dox (1.181),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.20),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.11), interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+ (1.12),
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+ (1.14),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.15),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+ (1.10),
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.7), interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+ (1.10),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+ (1.3),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.9),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.15),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.20), interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (1.11), interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+ (1.17), interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
+ (1.2),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ (1.3), interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+ (1.12),
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+ (1.3),
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.10): The core ppl_interface_generator_common.m4 file has been
+ completely reorganised, macros improved and comments revised and
+ added. Note that alternative patterns and replacements now have
+ a simple _a_ or _b_ extension instead of _alt_ or _cppx_. To
+ change the case of a word, use "!" instead of "L" or "U" before
+ the pattern.
+
+ The macros in the core file are organised into groups and a
+ comment summarises the call structure between the groups. Each
+ macro is labelled to indicate if it is used locally, just in this
+ file but by a macro in another group, or if it is public and may
+ be used by other code generating m4 files. Suggestions for
+ further improving the macro descriptions are welcome.
+
+ The complementary file ppl_interface_generator_common.m4_dat
+ file that contains the common data and some macros for generating
+ the basic class names, the patterns and their replacements is
+ improved and some redundant things removed. Commenting is not
+ improved but much of the structure here is simpler and existing
+ comments provide a lot of information already.
+
+ The changes to these files has meant that changes to all the m4
+ files in the interfaces directory was required.
+
+ These changes seem to make the m4 generation slightly more
+ efficient - but the improvement appears to be less that 10% and
+ disappointing.
+
+2008-11-06 Thursday 08:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.292), src/BD_Shape.templates.hh (1.123),
+ src/Box.inlines.hh (1.40), src/Box.templates.hh (1.133),
+ src/Checked_Number.inlines.hh (1.84), src/DB_Matrix.templates.hh
+ (1.10), src/Determinate.inlines.hh (1.59), src/Grid.templates.hh
+ (1.38), src/Grid_Generator.defs.hh (1.35), src/Grid_public.cc
+ (1.88), src/Init.cc (1.38), src/Interval.inlines.hh (1.43),
+ src/Interval_Restriction.defs.hh (1.13),
+ src/Linear_Expression.inlines.hh (1.15), src/MIP_Problem.cc
+ (1.75), src/OR_Matrix.inlines.hh (1.13),
+ src/OR_Matrix.templates.hh (1.9),
+ src/Octagonal_Shape.templates.hh (1.96),
+ src/Partially_Reduced_Product.inlines.hh (1.31),
+ src/Pointset_Ask_Tell.templates.hh (1.15),
+ src/Pointset_Powerset.templates.hh (1.43), src/checked.inlines.hh
+ (1.48), src/checked_mpz.inlines.hh (1.58), src/globals.defs.hh
+ (1.57), src/globals.inlines.hh (1.24): Tagged the FIXMEs that
+ should be fixed before the PPL 0.10.1 release.
+
+2008-11-06 Thursday 08:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.291), doc/libppl.3 (1.14), tests/Polyhedron/memory2.cc
+ (1.19): Use malloc(), realloc() and free() instead of operator
+ new() and operator delete() to implement the replacement GMP
+ allocation functions.
+
+2008-11-05 Wednesday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.20): Use malloc(), realloc() and
+ free() instead of operator new() and operator delete() to
+ implement the replacement GMP allocation functions.
+
+2008-11-05 Wednesday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.290), demos/ppl_lcdd/ppl_lcdd.1 (1.7),
+ demos/ppl_lpsol/ppl_lpsol.1 (1.8), demos/ppl_lpsol/ppl_lpsol.c
+ (1.91), doc/libppl.3 (1.13), doc/libppl_c.3 (1.4),
+ doc/ppl-config.1 (1.14): Made `ppl_lpsol --help' and `ppl_lcdd
+ --help' consistent. Man pages updated.
+
+2008-11-05 Wednesday 19:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.274): Added a section for 0.10.1.
+
+2008-11-05 Wednesday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.408): Version number bumped.
+
+2008-11-05 Wednesday 19:23 Abramo Bagnara
+
+ * devtools/print_nonascii_lines (1.3): Added \007 e \015.
+
+2008-11-05 Wednesday 19:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/print_nonascii_lines (bounded_arithmetic.1): file
+ print_nonascii_lines was added on branch bounded_arithmetic on
+ 2008-12-16 06:57:19 +0000
+
+2008-11-05 Wednesday 19:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.273), STANDARDS (1.42): Stick to ASCII.
+
+2008-11-05 Wednesday 19:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.82), Box/Makefile.am (1.76),
+ Octagonal_Shape/Makefile.am (1.36): Add dirty_marker to
+ DISTCLEANFILES. (Thanks to Michael Tautschnig for poiting this
+ out.)
+
+2008-11-05 Wednesday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/print_nonascii_lines (1.2): Print also the line number.
+
+2008-11-05 Wednesday 19:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (1.8), doc/Makefile.am (1.100): Doxygen
+ configuration files are generated by the configure script, so
+ that they don't have to be listed in EXTRA_DIST. (Thanks to
+ Michael Tautschnig for pointing this out.)
+
+2008-11-05 Wednesday 19:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.191): Source file ppl-config.cc is generated
+ by the configure script, hence it should not be distributed: list
+ it in nodist_ppl_config_SOURCES. (Thanks to Michael Tautschnig
+ for pointing out this problem.)
+
+2008-11-04 Tuesday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.28): Fixed the requirements of the `ppl-java'
+ package.
+
+2008-11-04 Tuesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/print_nonascii_lines (1.1): One-liner to print lines
+ containing non-ASCII characters.
+
+2008-11-04 Tuesday 14:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.27): Changelog updated. Added m4 >= 1.4.8 to
+ build requirements.
+
+2008-11-04 Tuesday 10:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_10-branch.1): Update version.
+
+2008-11-04 Tuesday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_10-branch.[1,1]): Mark
+ ChangeLog.
+
+2008-11-04 Tuesday 10:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (ppl-0_10-branch.1), TODO (1.289): Use ASCII only.
+
+2008-11-04 Tuesday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.34), Watchdog/ChangeLog (1.24): Updated.
+
+2008-11-03 Monday 21:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * CREDITS (1.41): Similar changes to those in credits.raw.
+
+2008-11-03 Monday 20:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README (1.56), configure.ac (1.407), doc/Makefile.am (1.99),
+ doc/definitions.dox (1.226),
+ doc/devref-foreign-language-interface.doxyconf.in (1.6),
+ doc/devref-foreign-language-interface.tex (1.4),
+ doc/devref-language-interface.doxyconf.in (1.1),
+ doc/devref-language-interface.tex (1.1),
+ doc/user-foreign-language-interface.doxyconf.in (1.7),
+ doc/user-foreign-language-interface.tex (1.4),
+ doc/user-language-interface.doxyconf.in (1.1),
+ doc/user-language-interface.tex (1.1): Renamed a few
+ documentation-related helper files.
+
+2008-11-03 Monday 19:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.272): Wording improved.
+
+2008-11-03 Monday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: interfaced_boxes.hh (1.5), marked_pointers.hh (1.3):
+ Comments improved.
+
+2008-11-03 Monday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.defs.hh (1.37), Poly_Gen_Relation.defs.hh
+ (1.35), namespaces.hh (1.17): Improved some comments.
+
+2008-11-03 Monday 18:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.40): Just list (without numbering them) supporting
+ projects and organizations.
+
+2008-11-03 Monday 18:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.39): A couple of fixes to indentation.
+
+2008-11-03 Monday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.38): Alphabetical ordering restored.
+
+2008-11-03 Monday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc (1.15): Jose Morales added to the "special thanks"
+ section.
+
+2008-11-03 Monday 16:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.98): Corrected the command for generating the
+ configuration-dependent HTML manuals for the OCaml interface:
+ HTML files generated by ocamldoc are now placed in the ocamldoc
+ subdir.
+
+2008-11-03 Monday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc (1.14): Synchronized with the CREDITS file.
+
+2008-11-03 Monday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.406): Version number bumped.
+
+2008-11-03 Monday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.37): Backported Enric's entry from the `polynomials'
+ branch.
+
+2008-11-03 Monday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.36): Finished harmonization with the Credits web page.
+
+2008-11-03 Monday 11:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.97): A couple of FIXME dealt with (i.e., just
+ removed): the INPUT Doxygen variable for the user foreing
+ language interface documentation seems to be OK as is.
+
+2008-11-03 Monday 11:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.defs.hh (1.85): Specify which constraints are optimally
+ supported by the grid domain.
+
+2008-11-03 Monday 10:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.66), Octagonal_Shape.defs.hh (1.62): In the
+ detailed documentation for class Box, explain which constraints
+ and congruences are optimally supported (some delegation to the
+ template argument class is required). Simplify the docs for teh
+ add_* methods.
+
+2008-11-03 Monday 10:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.135), Octagonal_Shape.defs.hh (1.61):
+ In the detailed documentation for Octagonal_Shape, say explicitly
+ which constraints/congruences are optimally supported. Exploiting
+ this, simplify the documentation for methods add_*.
+
+2008-11-03 Monday 10:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.134): Documentation improved: we now say
+ explicitly in the detailed class documentation which are the
+ constraints/congruences that are optimally supported; as a
+ consequence, the docs for the add_* methods can be simplified by
+ saying that an exception is thorwn if the argument is not
+ optimally supported.
+
+2008-11-03 Monday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.13), Watchdog/INSTALL (1.10): Previous commit
+ reverted.
+
+2008-11-03 Monday 09:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.35): Continued harmonization with the Credits web
+ page.
+
+2008-11-03 Monday 09:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.arm (1.2): Some nels changes.
+
+2008-11-03 Monday 08:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * Watchdog/INSTALL (1.9): Same changes as in previous commit for
+ the top-level ppl INSTALL file.
+
+2008-11-03 Monday 08:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * INSTALL (1.12): Removed a comma and an nels change from "not
+ widely useful" to "not often used".
+
+2008-11-03 Monday 08:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.configure (1.42): Spelling bugs fixed.
+
+2008-11-03 Monday 08:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.271): Added an item for the C interface wrt the change
+ for less_than* and greater_than* (and added a note wrt this for
+ the similar item for the C++ interface).
+
+2008-11-03 Monday 00:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.270): Wording improved.
+
+2008-11-02 Sunday 23:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/test1.ml (1.16): FIXME resolved.
+
+2008-11-02 Sunday 23:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.288): New item for PPL 0.10.1.
+
+2008-11-02 Sunday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.34): Started harmonization with the Credits web page.
+
+2008-11-02 Sunday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/README.gprolog (1.7): Unwanted slash
+ removed. Indentation changed so as to make the example
+ compilation command clearer.
+
+2008-11-02 Sunday 16:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/README.gprolog (1.6): Revised the example
+ compilation command so that the compiler knows where to look, at
+ run-time, for the libppl_gprolog library .
+
+2008-11-02 Sunday 16:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * CREDITS (1.33): A few small changes.
+
+2008-11-02 Sunday 15:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh (1.37): Comment improved.
+
+2008-11-02 Sunday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.sty (1.29): Comment indentation fixed.
+
+2008-11-02 Sunday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.87), README.gprolog (1.5):
+ Whenever possible, statically link `ppl_gprolog' with
+ `libppl_gprolog'.
+
+2008-11-02 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.105): Comment improved.
+
+2008-11-02 Sunday 08:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.104), README.swiprolog
+ (1.4): Made sure `ppl_pl' is as simple to use as possible by
+ linking it statically with `libppl_swiprolog', whenever possible.
+ Explained what to do in other cases.
+
+2008-11-01 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.32): This file must be ASCII.
+
+2008-11-01 Saturday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.26): Restored the default instantiations.
+
+2008-11-01 Saturday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.25): Reorganized the contents of the `ppl' and
+ `ppl-devel' packages.
+
+2008-11-01 Saturday 16:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.287): Added an item for PPL 0.10.1.
+
+2008-11-01 Saturday 16:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.96): Only install foreign language interface
+ manauls if they have been enabled. Also improved the uninstall
+ rule for PDF and PS docs.
+
+2008-11-01 Saturday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1 (1.6), demos/ppl_lpsol/ppl_lpsol.1
+ (1.7), doc/ppl-config.1 (1.13): Version number set to 0.10.
+
+2008-11-01 Saturday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.55), Watchdog/README (1.20): Updated.
+
+2008-11-01 Saturday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.24): Temporarily disabled the OCaml packages,
+ since there is no MLGMP package for Fedora.
+
+2008-11-01 Saturday 14:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.88), GNU/Makefile.am
+ (1.86), SICStus/Makefile.am (1.101), SWI/Makefile.am (1.103),
+ XSB/Makefile.am (1.81): List `-no-undefined' among the per-module
+ LDFLAGS when `NO_UNDEFINED_FLAG' is set.
+
+2008-11-01 Saturday 14:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.33): List `-no-undefined'
+ among the per-module LDFLAGS when `NO_UNDEFINED_FLAG' is set.
+
+2008-11-01 Saturday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.23): Removed the `yap-static' subpackage.
+
+2008-11-01 Saturday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.71): YAP only supports
+ dynamic loading of foreign modules: do not waste time building a
+ static library.
+
+2008-11-01 Saturday 12:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/: user.doxyconf-html.in (1.6),
+ user.doxyconf-latex.in (1.6): Do not produce the collaboration
+ graph in the user docs, as this graph contains implementation
+ info.
+
+2008-11-01 Saturday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.22): It is no longer necessary to remove empty
+ *.map files in the HTML documentation directories.
+
+2008-11-01 Saturday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.32): Avoid compiling any
+ source for the static version of `libppl_java' (which we do not
+ need).
+
+2008-11-01 Saturday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.21): New subpackage `java-javadoc', as per the
+ Fedora packaging guidelines.
+
+2008-11-01 Saturday 10:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user-foreign-language-interface.doxyconf.in (1.6),
+ user.doxyconf-html.in (1.45), user.doxyconf-latex.in (1.16): Do
+ not produce the collaboration graph in th euser docs, as this
+ graph contains implementation info.
+
+2008-11-01 Saturday 09:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1 (1.5), demos/ppl_lpsol/ppl_lpsol.1
+ (1.6), doc/ppl-config.1 (1.12): Regenerated so as to bump the
+ month.
+
+2008-11-01 Saturday 09:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.35),
+ Pointset_Powerset.defs.hh (1.56): In the documentation, corrected
+ several "brief" into "\brief".
+
+2008-11-01 Saturday 08:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.20): Remove the empty *.map files produced by
+ Doxygen.
+
+2008-10-31 Friday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.31): Added
+ `libppl_java_la_LIBTOOLFLAGS=--tag=disable-static'. This avoids
+ installing the (useless) static library `libppl_java.a', but not
+ the overhead for building it (see
+ http://lists.gnu.org/archive/html/libtool/2008-10/msg00079.html).
+
+2008-10-31 Friday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.19): Package the PWL documentation in the
+ `ppl-pwl-docs' subpackage. Package also the new man pages.
+
+2008-10-31 Friday 21:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.18): Files section for the `ppl-java'
+ subpackage tightened.
+
+2008-10-31 Friday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.30): Added `-module' and
+ `-avoid-version' to `libppl_java_la_LDFLAGS'.
+
+2008-10-31 Friday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.17): Package more documentation.
+
+2008-10-31 Friday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.16): Release field fixed.
+
+2008-10-31 Friday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.15): Version set to 0.10. Untabified.
+
+2008-10-31 Friday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.33), Watchdog/ChangeLog (1.23): Updated.
+
+2008-10-31 Friday 18:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.31): Use the UTF-8 encoding.
+
+2008-10-31 Friday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.14): Comment fixed. Package also `ppl_c.m4'.
+
+2008-10-31 Friday 17:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.13): Fixed the `ppl-java' file section.
+
+2008-10-31 Friday 17:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.12): Use `--enable-interfaces' so as to enable
+ the needed and only the needed interfaces.
+
+2008-10-31 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.25): Distribute also README.java.
+
+2008-10-31 Friday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.61): Distribute also
+ README.ocaml.
+
+2008-10-31 Friday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.11): Fixed the path of PWL's README.doc.
+
+2008-10-31 Friday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.10): Disable rpath completely also for the
+ PWL.
+
+2008-10-31 Friday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: config.rpath (1.1), configure.ac (1.56),
+ m4/Makefile.am (1.5), m4/lib-ld.m4 (1.1), m4/lib-link.m4 (1.1):
+ Added the `--disable-rpath' option to the configuration script.
+ The definition of `m4macros' in `Makefile.am' had several
+ omissions: fixed.
+
+2008-10-31 Friday 13:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.269): Reorganised, duplicate item removed, subheadings
+ added and the section on foreign language interfaces split into
+ separate items. A few other minor changes.
+
+2008-10-31 Friday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/README.java (1.2): Improved.
+
+2008-10-31 Friday 11:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.268): Added two items.
+
+2008-10-31 Friday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.9): Added a `%files' section for the `java'
+ subpackage.
+
+2008-10-31 Friday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.41), interfaces/Java/README.java (1.1): Added
+ a truly minimal README.java.
+
+2008-10-31 Friday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.29): List `libppl_java.la' in
+ `pkglib_LTLIBRARIES', not `lib_LTLIBRARIES'.
+
+2008-10-31 Friday 08:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.8): Added a java subpackage.
+
+2008-10-30 Thursday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.7): BuildRoot amended as per the Fedora
+ packaging guidelines.
+
+2008-10-30 Thursday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.6): Manual merge of the changes done in the
+ version stored in Fedora repository.
+
+2008-10-29 Wednesday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, ChangeLog, Makefile.am, NEWS, README, README.arm,
+ README.configure, STANDARDS, TODO, config.guess, config.sub,
+ configure.ac, instchk.hh, Watchdog/ChangeLog,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+ Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in,
+ Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/Makefile.am,
+ Watchdog/m4/ax_prefix_config_h.m4,
+ Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/tests/.cvsignore, Watchdog/tests/Makefile.am,
+ Watchdog/tests/pwl_test.cc, Watchdog/tests/pwl_test.hh,
+ Watchdog/tests/simple1.cc, Watchdog/tests/valgrind_suppressions,
+ Watchdog/utils/Makefile.am, debian/Makefile.am,
+ demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text, devtools/.cvsignore,
+ devtools/bump_copyright_years, devtools/cvs2cl.pl,
+ devtools/generate_dox_biblio, devtools/generate_dox_biblio.sed,
+ devtools/generate_dox_ci_prolog_manual,
+ devtools/generate_man_pages, devtools/update_ChangeLog,
+ doc/Makefile.am, doc/README.doc, doc/bib2dox, doc/bib2html1.sed,
+ doc/bib2html2.sed, doc/definitions.dox,
+ doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-c-interface.tex,
+ doc/devref-foreign-language-interface.doxyconf.in,
+ doc/devref-foreign-language-interface.tex,
+ doc/devref-java-interface.doxyconf-html.in,
+ doc/devref-java-interface.doxyconf-latex.in,
+ doc/devref-java-interface.tex,
+ doc/devref-ocaml-interface.doxyconf-html.in,
+ doc/devref-ocaml-interface.doxyconf-latex.in,
+ doc/devref-ocaml-interface.tex,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref-prolog-interface.tex, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/devref.tex,
+ doc/interfaces-html.sed, doc/interfaces-latex.sed, doc/libppl.3,
+ doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+ doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/prog2man,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+ doc/user-foreign-language-interface.doxyconf.in,
+ doc/user-foreign-language-interface.tex,
+ doc/user-java-interface.doxyconf-html.in,
+ doc/user-java-interface.doxyconf-latex.in,
+ doc/user-java-interface.tex,
+ doc/user-ocaml-interface.doxyconf-html.in,
+ doc/user-ocaml-interface.doxyconf-latex.in,
+ doc/user-ocaml-interface.tex,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, doc/user.tex, fedora/Makefile.am,
+ interfaces/Makefile.am, interfaces/README.interfaces,
+ interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_header.h,
+ interfaces/C/ppl_c_implementation_common.cc,
+ interfaces/C/ppl_c_implementation_common.defs.hh,
+ interfaces/C/ppl_c_implementation_common.inlines.hh,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_files.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/C/ppl_interface_generator_c_hh_files.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/C/tests/.cvsignore, interfaces/C/tests/Makefile.am,
+ interfaces/C/tests/cxxoutput.c, interfaces/C/tests/ppl_c_test.cc,
+ interfaces/C/tests/ppl_c_test.h,
+ interfaces/C/tests/print_to_buffer.cc,
+ interfaces/C/tests/print_to_buffer.h,
+ interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dox.m4,
+ interfaces/Java/ppl_interface_generator_java_dox_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+ interfaces/Java/ppl_java_common_dox,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.defs.hh,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/jni/ppl_java_common.inlines.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/parma_polyhedra_library/.cvsignore,
+ interfaces/Java/parma_polyhedra_library/By_Reference.java,
+ interfaces/Java/parma_polyhedra_library/Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+ interfaces/Java/parma_polyhedra_library/Congruence.java,
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+ interfaces/Java/parma_polyhedra_library/Constraint.java,
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java,
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java,
+ interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java,
+ interfaces/Java/parma_polyhedra_library/Generator.java,
+ interfaces/Java/parma_polyhedra_library/Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java,
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java,
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+ interfaces/Java/parma_polyhedra_library/Makefile.am,
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java,
+ interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+ interfaces/Java/parma_polyhedra_library/Pair.java,
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java,
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+ interfaces/Java/parma_polyhedra_library/Variable.java,
+ interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4,
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/MIP_Problem_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/PPL_Test.java,
+ interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/Test_Partial_Function.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/README.ocaml,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+ interfaces/OCaml/ppl_ocaml_common.cc,
+ interfaces/OCaml/ppl_ocaml_common.defs.hh,
+ interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+ interfaces/OCaml/ppl_ocaml_globals.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_globals.mli,
+ interfaces/OCaml/ppl_ocaml_types.ml,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+ interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/ppl_prolog_sysdep_dox,
+ interfaces/Prolog/ppl_prolog_sysindep_dox,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/README.ciao,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_efli.cc,
+ interfaces/Prolog/Ciao/ciao_efli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4,
+ interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SICStus/sp_predicate_check.pl,
+ interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4,
+ interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/expected_pgt,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4,
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+ interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+ m4/Makefile.am, m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+ m4/ac_check_gmp.m4, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+ m4/ac_cxx_limit_memory.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_exact_output.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+ m4/ax_prefix_config_h.m4, m4/lib-link.m4, m4/lib-prefix.m4,
+ m4/ppl.m4, m4/ppl_c.m4, src/Any_Pointset.defs.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Constraint.defs.hh, src/Constraint_System.defs.hh,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Generator.defs.hh,
+ src/Generator_System.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid_Generator.defs.hh,
+ src/Grid_Generator_System.defs.hh, src/Grid_chdims.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_widenings.cc,
+ src/Init.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Linear_Expression.defs.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/Makefile.am,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Og_Status.idefs.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Ptr_Iterator.defs.hh,
+ src/Rounding_Dir.inlines.hh, src/Variables_Set.defs.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/compiler.hh,
+ src/fpu-c99.inlines.hh, src/fpu-none.inlines.hh, src/fpu.defs.hh,
+ src/globals.defs.hh, src/namespaces.hh, src/ppl-config.cc.in,
+ src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+ src/stdiobuf.types.hh, src/version.cc, tests/FCAIBVP.cc,
+ tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+ tests/FCAIBVP.types.hh, tests/Makefile.am,
+ tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh,
+ tests/Partial_Function.types.hh, tests/README, tests/ppl_test.cc,
+ tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+ tests/valgrind_suppressions, tests/Ask_Tell/Makefile.am,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/difference1.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/pointsetpowerset1.cc,
+ tests/BD_Shape/upperbound1.cc, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+ tests/Box/bgp99extrapolation1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/boxdifference1.cc,
+ tests/Box/boxhull1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/closure1.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constraints1.cc,
+ tests/Box/contains1.cc, tests/Box/difference1.cc,
+ tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frombox1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc, tests/Box/intersection1.cc,
+ tests/Box/interval1.cc, tests/Box/interval2.cc,
+ tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+ tests/Box/membytes1.cc, tests/Box/pointsetpowerset1.cc,
+ tests/Box/pointsetpowerset2.cc,
+ tests/Box/propagateconstraints1.cc,
+ tests/Box/propagateconstraints2.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+ tests/Box/relations2.cc, tests/Box/removespacedims1.cc,
+ tests/Box/timeelapse1.cc, tests/Box/unconstrain1.cc,
+ tests/Box/universe1.cc, tests/Box/upperbound1.cc,
+ tests/Box/writebox1.cc, tests/Grid/Makefile.am,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/approximatepartition1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/generator1.cc, tests/Grid/griddifference1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/membytes1.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/upperbound1.cc,
+ tests/Grid/upperbound2.cc, tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc,
+ tests/MIP_Problem/mipproblem3.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/difference1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/upperbound1.cc,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/README,
+ tests/Polyhedron/affineimage2.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc, tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/dualhypercubes.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+ tests/Polyhedron/hybrid.cc, tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/permute.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Powerset/Makefile.am, tests/Powerset/pointsetpowerset1.cc,
+ tests/Powerset/pointsetpowerset2.cc,
+ tests/Powerset/simplifyusingcontext1.cc, utils/build_header.in
+ (bounded_arithmetic.[1,2,2,2,1,2,1,1,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,2,1,2,2,2,1,2,1,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,1,2,2,3,3,3,3,3,3,2,2,3,2,2,1,2,2,3,2,2,1,2,1,2,1,1,2,2,1,2,2,3,3,3,3,3,3,2,2,1,2,2,1,1,2,1,3,1,2,2,2,2,2,2,2,2,2,1,1,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,3,3,2,3,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,1,1, [...]
+ Second merge of the trunk to the bounded_arithmetic branch.
+
+2008-10-29 Wednesday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.405): Version number bumped.
+
+2008-10-29 Wednesday 20:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.11),
+ ppl_interface_generator_prolog_dox_code.m4 (1.13): Also revised -
+ bugs fixed and a few improvements.
+
+2008-10-29 Wednesday 20:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.180): Updated.
+
+2008-10-29 Wednesday 10:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.30): Spurious comma removed.
+
+2008-10-28 Tuesday 20:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: libppl.3 (1.12), libppl_c.3 (1.3): In the C interface man
+ page, mention the introduction and use of functions
+ ppl_restore_pre_PPL_rounding() and ppl_set_rounding_for_PPL().
+
+2008-10-28 Tuesday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl_c.3 (bounded_arithmetic.1): file libppl_c.3 was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-28 Tuesday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.267), doc/libppl.3 (1.11): Mention the introduction and
+ use of the functions restore_pre_PPL_rounding(),
+ set_rounding_for_PPL(), and of their counterparts in all the
+ language interfaces.
+
+2008-10-28 Tuesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.63), demos/ppl_lpsol/ppl_lpsol.c
+ (1.90), doc/libppl.3 (1.10), src/Init.cc (1.37),
+ tests/Polyhedron/memory1.cc (1.19), tests/Polyhedron/memory2.cc
+ (1.18): The C function name
+ `set_GMP_memory_allocation_functions()' was breaking our
+ namespace promise: renamed
+ `ppl_set_GMP_memory_allocation_functions()'.
+
+2008-10-28 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3 (1.9): Wording slightly improved.
+
+2008-10-28 Tuesday 12:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * CREDITS (1.29): Updated the sponsors to include recent projects
+ at Leeds.
+
+2008-10-27 Monday 21:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.266): Small improvement.
+
+2008-10-27 Monday 18:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.32), Watchdog/ChangeLog (1.22): Updated.
+
+2008-10-27 Monday 18:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.286): Adde 2 items for 0.10.1 and later.
+
+2008-10-27 Monday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.285): Added one item for PPL 0.10.1.
+
+2008-10-27 Monday 16:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.265): Avoid repetitive comments for the
+ Partially_Reduced_Product domains.
+
+2008-10-27 Monday 16:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/libppl.3 (1.8): Small nels improvement.
+
+2008-10-27 Monday 15:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.43): Changed the constrains/2, unconstrain/2 and
+ unconstrains/2 from simple to all.
+
+2008-10-27 Monday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.264): Three subitems on the foreign language interfaces,
+ all related to uniform naming, placed together and reorganized to
+ avoid repetitions.
+
+2008-10-27 Monday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.263): A couple of improvements on items regarding foreign
+ langauge interfaces.
+
+2008-10-27 Monday 14:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.262): Revised the items wrt add_integer_point(),
+ constrains() and unconstrain().
+
+2008-10-27 Monday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.261): Some consistency improvements.
+
+2008-10-27 Monday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.260): Several corrections and improvements.
+
+2008-10-27 Monday 13:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.259): Corrected a couple of typos.
+
+2008-10-27 Monday 13:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.258): Revised the item on bds_hull etc.
+
+2008-10-27 Monday 13:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.configure (1.40): Small nels improvements and similar.
+
+2008-10-27 Monday 13:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.257): Improved item about refine_with_* methods.
+
+2008-10-27 Monday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.256): The wronly placed item on deprecated methods moved
+ to a better place. Completed the item on the changes to the
+ documentation manuals.
+
+2008-10-27 Monday 12:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.255): Added an item on the new man pages libppl(3) and
+ libppl_c(3).
+
+2008-10-27 Monday 12:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.254): Dealt with items on constrains, unconstrain and
+ has_integer_point.
+
+2008-10-27 Monday 11:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.253): Revised the item concerning LP_Problem/MIP_Problem.
+
+2008-10-27 Monday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.252): Added an item mentioning the deprecation of
+ _and_minimize methods. Modified another item regarding the
+ recycling methods.
+
+2008-10-27 Monday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.251): Added an item concerning the enhancements made to
+ the configuration script.
+
+2008-10-27 Monday 11:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.250): Completed item concerning the default widening
+ operator.
+
+2008-10-27 Monday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.249): Finished the item concerning the Interval template
+ class.
+
+2008-10-27 Monday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.60): Missing comma added.
+
+2008-10-27 Monday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.59): Drafted the detailed information for
+ the Interval class.
+
+2008-10-27 Monday 10:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.248): Completed item on can_recycle... methods.
+
+2008-10-27 Monday 10:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.247): Merged the items on constructing from and shrinking
+ bounding boxes and completed this item.
+
+2008-10-27 Monday 10:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.246): Corrected (again) the item on covering boxes being
+ removed.
+
+2008-10-27 Monday 09:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.245): Corrected changes to item on covering boxes.
+
+2008-10-27 Monday 09:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.244): Completed an item on the Product domains.
+
+2008-10-27 Monday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.243): News item for class Box completed. News item for
+ class Octagonal_Shape moved up.
+
+2008-10-27 Monday 08:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.55): Spelling fixed.
+
+2008-10-27 Monday 08:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.242): News item that referred to the Polyhedron domain
+ and congruences now replaced by a more genral item on congruence
+ related methods.
+
+2008-10-27 Monday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.65): A Box is a smash product, not a Cartesian
+ product.
+
+2008-10-27 Monday 08:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.241): Completed an item on the pointset powerset domain.
+
+2008-10-27 Monday 08:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.240): Reordered items and started indicating where more
+ work is needed.
+
+2008-10-27 Monday 07:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.239): Written a section on changes to the foreign
+ language interfaces.
+
+2008-10-27 Monday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.284): Added one item for 0.10.1.
+
+2008-10-27 Monday 07:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.238): Two more reminders of news that needs adding: -
+ OCaml and Java interfaces; - changes to the configure options.
+
+2008-10-27 Monday 06:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.h (1.5): Comment fixed.
+
+2008-10-27 Monday 06:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.h (bounded_arithmetic.1): file
+ print_to_buffer.h was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:27 +0000
+
+2008-10-26 Sunday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Variable.java (1.3),
+ tests/Octagonal_Shape/affinedimension1.cc (1.6),
+ tests/Octagonal_Shape/discrete1.cc (1.5): Trailing blanks
+ removed.
+
+2008-10-26 Sunday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Variable.java
+ (bounded_arithmetic.1): file Variable.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-26 Sunday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.237): Made a start on updating this file: - update the
+ paragraph on the MIP problem to include MIP control parameters; -
+ added a bullet on total and external memory in bytes; - reminder
+ to add something about the removal of covering_box support; -
+ reminder to add a note about the partially reduced product; -
+ reminder to add something about changes to the documentation.
+
+2008-10-26 Sunday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_java_tests_common (1.18): Copyright
+ notice added. Indentation fixed.
+
+2008-10-26 Sunday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (1.6): Improved.
+
+2008-10-26 Sunday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 (1.4):
+ Copyright notice fixed.
+
+2008-10-26 Sunday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ocaml_hh_code.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-10-26 Sunday 21:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/: print_to_buffer.cc (1.5), print_to_buffer.h
+ (1.4): Added copyright notices and multiple inclusion guards.
+
+2008-10-26 Sunday 21:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.cc (bounded_arithmetic.1):
+ file print_to_buffer.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:27 +0000
+
+2008-10-26 Sunday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.54): Updated.
+
+2008-10-26 Sunday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.236), Watchdog/NEWS (1.12): The target release date is
+ November 4, 2008.
+
+2008-10-26 Sunday 20:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: README (1.19), ChangeLog (1.21): Updated.
+
+2008-10-26 Sunday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: configure.ac (1.55), src/Makefile.am (1.18): Version
+ number corrected.
+
+2008-10-26 Sunday 19:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.283): Removed section of enhancements for PPL 0.10.
+
+2008-10-26 Sunday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.282): Removed (last?) two items for PPL 0.10.
+
+2008-10-26 Sunday 19:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.225): Minor improvement.
+
+2008-10-26 Sunday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.28): Acknowledge the help received from Martin Guy.
+
+2008-10-26 Sunday 19:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.20), BD_Shape.defs.hh (1.133),
+ Congruence.defs.hh (1.26), Congruence_System.defs.hh (1.27),
+ Constraint.defs.hh (1.131), Constraint_System.defs.hh (1.41),
+ Generator.defs.hh (1.127), Generator_System.defs.hh (1.29),
+ Grid.defs.hh (1.84), Grid_Generator.defs.hh (1.34),
+ Grid_Generator_System.defs.hh (1.30), Linear_Expression.defs.hh
+ (1.40), MIP_Problem.defs.hh (1.40), Octagonal_Shape.defs.hh
+ (1.60), Og_Status.idefs.hh (1.11),
+ Partially_Reduced_Product.defs.hh (1.34),
+ Pointset_Ask_Tell.defs.hh (1.18), Pointset_Powerset.defs.hh
+ (1.54), Polyhedron.defs.hh (1.357), Variables_Set.defs.hh (1.9),
+ globals.defs.hh (1.56): Let the documentation for the
+ ascii_dump/load methods also appear in the user manuals, since
+ they may be useful for debugging purposes. In the user docs for
+ Polyhedron and Grid, avoid listing exception throwers.
+
+2008-10-26 Sunday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.281), doc/ppl-config.1 (1.11),
+ doc/ppl-config_extra_man_text (1.5), src/ppl-config.cc.in (1.25):
+ Improved the man page of ppl-config.
+
+2008-10-26 Sunday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.280), demos/ppl_lcdd/ppl_lcdd.1 (1.4),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.62),
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.3): Improved the man
+ page of ppl_lcdd.
+
+2008-10-26 Sunday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1 (bounded_arithmetic.1): file ppl_lcdd.1
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:23
+ +0000
+
+2008-10-26 Sunday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd_extra_man_text (bounded_arithmetic.1):
+ file ppl_lcdd_extra_man_text was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:23 +0000
+
+2008-10-26 Sunday 18:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.74): Indentation fixed.
+
+2008-10-26 Sunday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: ppl_lpsol.1 (1.5), ppl_lpsol.c (1.89),
+ ppl_lpsol_extra_man_text (1.4): Documentation improved.
+
+2008-10-26 Sunday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.1 (bounded_arithmetic.1): file
+ ppl_lpsol.1 was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:23 +0000
+
+2008-10-26 Sunday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol_extra_man_text (bounded_arithmetic.1):
+ file ppl_lpsol_extra_man_text was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:23 +0000
+
+2008-10-26 Sunday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.279), demos/ppl_lpsol/ppl_lpsol.1 (1.4),
+ demos/ppl_lpsol/ppl_lpsol.c (1.88),
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.3),
+ devtools/generate_man_pages (1.3): Completed the man page of
+ ppl_lpsol. Other minor improvements.
+
+2008-10-26 Sunday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_man_pages (bounded_arithmetic.1): file
+ generate_man_pages was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-26 Sunday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: libppl.3 (1.7), libppl_c.3 (1.2): The standard section name
+ is AUTHOR, not AUTHORS.
+
+2008-10-26 Sunday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1 (1.3),
+ demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.2),
+ demos/ppl_lpsol/ppl_lpsol.1 (1.3),
+ demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.2), doc/ppl-config.1
+ (1.10), doc/ppl-config_extra_man_text (1.4): Small improvements.
+
+2008-10-26 Sunday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.278): One item moved.
+
+2008-10-26 Sunday 14:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.277), doc/Makefile.am (1.95), doc/libppl.3 (1.6): Another
+ item dealt with.
+
+2008-10-26 Sunday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl_c.3 (1.1): Short overview on how to use the Parma
+ Polyhedra Library (PPL) in C programs.
+
+2008-10-26 Sunday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.276), doc/libppl.3 (1.5): One item dealt whith.
+
+2008-10-26 Sunday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: README (1.4), Polyhedron/README (1.9): Moved.
+
+2008-10-26 Sunday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/README (bounded_arithmetic.1): file README was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:37 +0000
+
+2008-10-26 Sunday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.275): Two items removed; one revised.
+
+2008-10-26 Sunday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3 (1.4): Completed.
+
+2008-10-26 Sunday 10:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.18): Make sure the GMP allocation
+ functions are set prior to the allocation of any GMP object.
+
+2008-10-26 Sunday 09:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.274), Watchdog/src/Makefile.am (1.17),
+ interfaces/OCaml/Makefile.am (1.60), src/Makefile.am (1.190),
+ tests/Makefile.am (1.274), tests/BD_Shape/Makefile.am (1.81),
+ tests/Box/Makefile.am (1.75), tests/Octagonal_Shape/Makefile.am
+ (1.35), tests/Powerset/Makefile.am (1.7): Ensure the clean and
+ mostlyclean comply with the 'STANDARDS' file and are used
+ sensibly.
+
+ Removed - Check all the Makefile.am's to make sure CLEANFILES,
+ MOSTLYCLEANFILES and DISTCLEANFILES are used in a sensible way.
+ from the TODO list for 0.10
+
+2008-10-26 Sunday 08:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3 (1.3): Some corrections. Started a new section on
+ implementing memory-guarded computations.
+
+2008-10-25 Saturday 22:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Makefile.am (1.50): Added alternative definition for variable
+ distcleancheck_listfiles, so that it is not an error if a
+ distributed file is left in the build tree after a `make
+ distclean' (see Section 14.4 of the Automake manual).
+
+2008-10-25 Saturday 22:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (1.7): Do clean .tag files generated by
+ Doxygen.
+
+2008-10-25 Saturday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3 (1.2): Some progress toward completion of this man
+ page.
+
+2008-10-25 Saturday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.94): The configuration dependent Prolog
+ manuals should depend on (generated)
+ Prolog_configured_interface.dox, rather than (fixed)
+ Prolog_interface.dox.
+
+2008-10-25 Saturday 16:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.68): When Prolog is enabled, do
+ make Prolog_configured_interface.dox.
+
+2008-10-25 Saturday 16:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.41): Typo corrected.
+
+2008-10-24 Friday 22:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (1.6), doc/Makefile.am (1.93): Avoid
+ cleaning distributed built files. Try to follow the rule stated
+ in Section 27.5 of the Automake manual: distributed files should
+ never depend upon non-distributed built files.
+
+2008-10-24 Friday 16:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.179),
+ ppl_prolog_sysindep_dox (1.7): Revised the grammar rules to bring
+ them up-to-date to include rules for congruences and grid
+ generators, also removed rules for intervals and boxes etc. which
+ are now not wanted.
+
+2008-10-24 Friday 15:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.178),
+ ppl_prolog_sysindep_dox (1.6): Corrected the list of weakly
+ relational domains available to the Prolog interface.
+
+2008-10-23 Thursday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/Makefile.am (1.14): Fixed copy-and-paste mistake.
+
+2008-10-23 Thursday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.27): Acknowledge the contribution of Hewlett Packard
+ as provider of the test cluster hosted by ESIEE.
+
+2008-10-23 Thursday 16:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: devref-foreign-language-interface.tex (1.3), devref.tex
+ (1.27), user-foreign-language-interface.tex (1.3), user.tex
+ (1.28): Added acknowledgements to EPSRC - two projects, one for
+ the grid domain and the current project.
+
+2008-10-23 Thursday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-foreign-language-interface.tex (bounded_arithmetic.1):
+ file devref-foreign-language-interface.tex was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-foreign-language-interface.tex (bounded_arithmetic.1):
+ file user-foreign-language-interface.tex was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 15:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.273), doc/definitions.dox (1.224), src/Polyhedron.defs.hh
+ (1.356): Improved the documentation for boxes, intervals and the
+ bounded extrapolations.
+
+ Replace the brief descriptions of the bounded extrapolations in
+ Polyhedron.defs.hh by shorter descriptions that ju st refer to
+ the relevant paragraphs in definitions.dox.
+
+ Removed the out-of-date paragraph about the domains in section
+ 1.1 of the main user's manual.
+
+ Removed a todo item.
+
+2008-10-23 Thursday 14:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * devtools/generate_dox_ci_prolog_manual (1.2): Paths changed so
+ that it can be used from the interfaces/Prolog directory.
+
+2008-10-23 Thursday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_ci_prolog_manual (bounded_arithmetic.1):
+ file generate_dox_ci_prolog_manual was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.92): When installing the OCaml user
+ documentation, do also install the ocamldoc subdir and its
+ contents.
+
+2008-10-23 Thursday 10:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.1 (1.2), demos/ppl_lpsol/ppl_lpsol.1
+ (1.2), doc/ppl-config.1 (1.9): Updated.
+
+2008-10-23 Thursday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.404), demos/Makefile.am (1.13),
+ demos/ppl_lcdd/Makefile.am (1.30), demos/ppl_lcdd/ppl_lcdd.1
+ (1.1), demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.1),
+ demos/ppl_lpsol/Makefile.am (1.49), demos/ppl_lpsol/ppl_lpsol.1
+ (1.1), demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.1),
+ devtools/generate_man_pages (1.2), doc/Makefile.am (1.91),
+ doc/ppl_lcdd.1 (1.7), doc/ppl_lcdd_extra_man_text (1.4),
+ doc/ppl_lpsol.1 (1.7), doc/ppl_lpsol_extra_man_text (1.4): The
+ `ppl_lcdd' and `ppl_lpsol' programs have been made optional (but
+ enabled by default) and subject to the `--enable-ppl_lcdd' and
+ `--enable-ppl_lpsol' configure options, respectively.
+
+2008-10-23 Thursday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.87): Made sure the program con be
+ compiled with -Wformat-security (and, for that matter, also
+ -Wformat-nonliteral).
+
+2008-10-22 Wednesday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.32): Test further strengthened.
+
+2008-10-22 Wednesday 12:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.31): Test strengthened to guard against
+ what can easily happen on a bi-arch system.
+
+2008-10-22 Wednesday 10:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.69): Comment improved.
+
+2008-10-22 Wednesday 09:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.68): Revised one of the
+ exception tests to allow for all possible exceptions that can
+ occur, depending on the machine and configuration.
+
+2008-10-21 Tuesday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.30): Make sure the version of GMP as define
+ by the GMP's header file matches the version reported by
+ gmp_version().
+
+2008-10-21 Tuesday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.85): GNU Prolog 1.3.1 needs
+ a higher value for GLOBALSZ.
+
+2008-10-21 Tuesday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_cfli.hh (1.11): Minimal changes to
+ support GNU Prolog 1.3.1 (to be released soon).
+
+2008-10-21 Tuesday 12:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.67): Corrected special
+ exception tests for Prolog systems (eg GNU Prolog) with bounded
+ integers.
+
+2008-10-20 Monday 23:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.90): The configured Prolog manuals depend on
+ generated file Prolog_configured_interface.dox.
+
+2008-10-20 Monday 22:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.66): Revised the timeout
+ test to ensure it is more consistent in its behavior for all
+ configurations and Prolog systems.
+
+2008-10-20 Monday 19:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.177),
+ ppl_interface_generator_prolog_dox_code.m4 (1.12): Small
+ correction and improvement to formatting.
+
+2008-10-20 Monday 17:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.87): Disabled the pl_check,
+ clpq and clpq2 tests as they can throw overflow exception errors
+ for certain configurations - and Ciao does not recognise these as
+ overflow errors.
+
+2008-10-20 Monday 17:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.19): Completed changes in last commit.
+
+2008-10-20 Monday 16:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.18): Revised code for the ..._if_exact predicates.
+
+2008-10-20 Monday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc (1.12): Added a missing
+ default switch case.
+
+2008-10-20 Monday 14:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.65): Corrected and
+ improved the testing of the exceptions thrown by the C++
+ interface.
+
+2008-10-20 Monday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/.cvsignore (1.1): Put under CVS control.
+
+2008-10-20 Monday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/.cvsignore (bounded_arithmetic.1): file .cvsignore was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-20 Monday 08:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_ci_prolog_manual (1.1): Script to generate
+ the Doxygen source for the configuration-independent Prolog
+ interface manual.
+
+2008-10-19 Sunday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.403): Version number bumped.
+
+2008-10-19 Sunday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.272): Added a list of things to do for PPL 0.10.1.
+
+2008-10-19 Sunday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.271), interfaces/OCaml/README.ocaml (1.5): README.ocaml
+ revised.
+
+2008-10-19 Sunday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.39): Added a couple of blank spaces.
+
+2008-10-19 Sunday 21:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.38), TODO (1.270): README.configure is now
+ complete.
+
+2008-10-19 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.402): Usage summary improved.
+
+2008-10-19 Sunday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.37): Written the section on "Configuring for
+ Debugging".
+
+2008-10-19 Sunday 16:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.223): Some improvements in the
+ specification of syntactic GDs: 1) the generic ones are those
+ that are supported (maybe minimally) by all semantic GDs;
+ the specific ones are not supported at all by some semantic
+ GDs; 2) listed subclasses of generic GDs (constraints and
+ congruences): explained that each semantic GD "optimally
+ supports" some of these subclasses; for optimally supported
+ subclasses, no exception is thrown and a best approximation
+ semantics is obtained; for the non-optimally supported ones,
+ exceptions or coarse approximations may be obtained. 3) noted
+ that the best approximation property applies to single
+ constraints or congruences, not to their systems.
+
+ Other changes: - not all OK methods support the optional
+ Boolean argument; - improved explanation of conversion
+ operators with a computational complexity argument.
+
+2008-10-19 Sunday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.36): Added a forward reference.
+
+2008-10-19 Sunday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.26): Express gratitude to ESIEE, Thibaut Varene, and
+ the PA-RISC Linux community.
+
+2008-10-19 Sunday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.25): One link added.
+
+2008-10-19 Sunday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.24): Express gratitude to the GCC Compile Farm
+ Project, FSF France, and Laurent Guerby.
+
+2008-10-19 Sunday 14:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.401): The header files of GLPK cannot be trusted:
+ do check for the presence of declarations.
+
+2008-10-19 Sunday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.86): Previous commit completed.
+
+2008-10-19 Sunday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.85): Fixed the guard controlling
+ the definition of glpk_message_interceptor().
+
+2008-10-19 Sunday 14:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.84): Make sure GLP_OFF is defined
+ before using it.
+
+2008-10-19 Sunday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.cc (1.3), tests/ppl_test.cc (1.19): Do
+ not rely on the definition of optional macros of <fenv.h>.
+
+2008-10-19 Sunday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.cc (bounded_arithmetic.1): file
+ pwl_test.cc was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:22 +0000
+
+2008-10-19 Sunday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.400): Enable the Java interface only if jlong can
+ contain data pointers.
+
+2008-10-19 Sunday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/: ppl_java_common.cc (1.52),
+ ppl_java_common.inlines.hh (1.4): Improved the conversions
+ between pointers and jlongs.
+
+2008-10-19 Sunday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.inlines.hh
+ (bounded_arithmetic.1): file ppl_java_common.inlines.hh was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-19 Sunday 09:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.91): The
+ get_represent pattern updated for all the domains to include both
+ constraints and congruences.
+
+2008-10-19 Sunday 08:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/marked_pointers.hh (1.2): Bitmask made portable.
+
+2008-10-18 Saturday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.86), README.ciao (1.1):
+ New file to explain which versions of Ciao Prolog are supported.
+
+2008-10-18 Saturday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/README.ciao (bounded_arithmetic.1): file
+ README.ciao was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:32 +0000
+
+2008-10-18 Saturday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/README.interfaces (1.2): Obsolete file removed.
+
+2008-10-18 Saturday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.23): Use `"$(CXX)"' instead
+ of `g++'.
+
+2008-10-18 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.hh (1.3), tests/ppl_test.hh (1.79):
+ Define the NOISY and VERY_NOISY macros before they are used.
+ Unused parameter warning avoided.
+
+2008-10-18 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/pwl_test.hh (bounded_arithmetic.1): file
+ pwl_test.hh was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:22 +0000
+
+2008-10-18 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am (1.6): Must link with -lm for
+ fetestexcept().
+
+2008-10-18 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am (bounded_arithmetic.1): file
+ Makefile.am was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:22 +0000
+
+2008-10-18 Saturday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.19): Previous commit had the
+ defined(__EDG__) and !defined(__EDG__) cases reversed: fixed now.
+
+2008-10-18 Saturday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.399): Blank line added for readability.
+
+2008-10-18 Saturday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.54): Improved and reorganized.
+
+2008-10-18 Saturday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.18): Use a couple of different friend
+ declarations when the compiler is EDG-based.
+
+2008-10-18 Saturday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.95): Removed another useless
+ variable definition.
+
+2008-10-18 Saturday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.94): Several FIXMEs resolved
+ and removed.
+
+2008-10-18 Saturday 17:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.93): Several useless variable
+ definitions commented out.
+
+2008-10-18 Saturday 13:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.59):
+ Statement with no effect removed.
+
+2008-10-18 Saturday 13:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (1.4): Updated and improved.
+
+2008-10-18 Saturday 12:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.35): Added material to the section on
+ "Configuring for Optimized Performance".
+
+2008-10-18 Saturday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.80): List
+ xsb_prolog_generated_test.P in CLEANFILES.
+
+2008-10-18 Saturday 11:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.22): Do not mention gmp.cma
+ when (ocaml-)linking; rather, directly pass options -lmlgmp and
+ -lmpfr to the underlying linker using -cclib. This seems to
+ solve an issue in some x86 systems (e.g., igor on tinderbox)
+ whereby -dlopen was not working as expected, in that it links the
+ installed ppl instead of the one in the build tree.
+
+2008-10-18 Saturday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (1.39): Work around a bug in the Intel C/C++
+ compiler version 10.1.x.
+
+2008-10-17 Friday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.34): Explained the use of the
+ `--with-java=DIR' configure option.
+
+2008-10-17 Friday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.33): Explained the use of the
+ `--enable-instantiations' configure option.
+
+2008-10-17 Friday 16:56 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.47): Added comment for future
+ improvement.
+
+2008-10-17 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.32): Started a rewrite of the section on
+ "Configuring the Language Interfaces". Added new sections on
+ "Configuring for Optimized Performance" and "Configuring for
+ Debugging".
+
+2008-10-17 Friday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.398), src/Makefile.am (1.189): If the C++
+ interface is not enabled, do not install <ppl.hh>.
+
+2008-10-17 Friday 14:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.397): Configuring with the option
+ `--enable-instantiations' (i.e., without specifying any
+ instantiation) now prints a list of available instantiations.
+
+2008-10-17 Friday 11:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: expected_pchk_int16_a (1.9),
+ expected_pchk_int8_a (1.9): As in previous commit - some
+ overflows that were expected do not occur now.
+
+2008-10-17 Friday 11:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: expected_pchk_int16 (1.9),
+ expected_pchk_int32 (1.8), expected_pchk_int32_a (1.8),
+ expected_pchk_int64_a (1.7), expected_pchk_int8 (1.9): Several
+ overflows no longer occur.
+
+2008-10-16 Thursday 18:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.396): Reordered so that the system-dependent
+ adjustments are done before the run-time tests.
+
+2008-10-16 Thursday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.15): Test strengthened to check
+ whether fesetround() actually does something.
+
+2008-10-16 Thursday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.21): Little improvement to
+ fpu_initialize_control_functions().
+
+2008-10-16 Thursday 12:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.10),
+ ppl_interface_generator_prolog_dox_code.m4 (1.11): Error in the
+ configured dox file wrt the widening of weakly relational shapes
+ fixed.
+
+2008-10-16 Thursday 08:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.64): Test for no timeout
+ made simpler to try and ensure results are as predicted. Added
+ the Prolog system being tested in the error message.
+
+2008-10-16 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_exact_output.m4 (1.10),
+ ac_cxx_float_exact_output.m4 (1.8),
+ ac_cxx_long_double_exact_output.m4 (1.15): Typos fixed.
+
+2008-10-16 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_exact_output.m4 (bounded_arithmetic.1): file
+ ac_cxx_double_exact_output.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-16 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float_exact_output.m4 (bounded_arithmetic.1): file
+ ac_cxx_float_exact_output.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-16 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (bounded_arithmetic.1):
+ file ac_cxx_long_double_exact_output.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-15 Wednesday 22:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.9),
+ ppl_interface_generator_prolog_dox_code.m4 (1.10),
+ ppl_prolog_sysdep_dox (1.3), ppl_prolog_sysindep_dox (1.5): As in
+ previous commit message - but with updated files.
+
+2008-10-15 Wednesday 21:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.8),
+ ppl_interface_generator_prolog_dox_code.m4 (1.9),
+ ppl_prolog_sysdep_dox (1.2), ppl_prolog_sysindep_dox (1.4): These
+ files have been rewritten so as to generate
+ Prolog_configured_interface.dox (with the command "make
+ Prolog_configured_interface.dox" in the interfaces/Prolog
+ directory) and the configured documentation for the Prolog
+ interface. With an appropriate script the same files will
+ generate the Prolog_interface.dox and hence the fixed
+ documentation for Prolog.
+
+2008-10-15 Wednesday 21:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.42): Predicate schema's reordered to maintain groups of
+ predicates with similar semantics/behaviour.
+
+2008-10-15 Wednesday 21:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.63): Decrease the timeout
+ expected for a timeout exception and increase the timeout when an
+ exception is not predicted. Unwanted comment removed.
+
+2008-10-15 Wednesday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.arm (1.1), m4/ac_check_fpu_control.m4 (1.14): Adopted a
+ compromise solution for the ARM: this allows to easily build
+ binary distributions, yet allowing those building from sources to
+ be in full control.
+
+2008-10-15 Wednesday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.arm (bounded_arithmetic.1): file README.arm was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:19 +0000
+
+2008-10-15 Wednesday 19:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.20): Fixed silly bug in
+ fpu_initialize_control_functions().
+
+2008-10-15 Wednesday 18:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.222), interfaces-latex.sed (1.4): The
+ Section names in the ps and pdf files for extrenal references are
+ in italics using <EM> and </EM> commands.
+
+ In definitions.dox, the section name for extrapolation operators
+ for the powerset now named Powerset Extrapolation Operators
+
+2008-10-15 Wednesday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/interfaces-latex.sed (bounded_arithmetic.1): file
+ interfaces-latex.sed was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-15 Wednesday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.19): At initialization time, check
+ whether fesetround() works as expected: if not, throw an
+ std::logic_error exception.
+
+2008-10-15 Wednesday 18:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.176): Small
+ improvements.
+
+2008-10-15 Wednesday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.13): Link with -lm.
+
+2008-10-15 Wednesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.12): Test strengthened to check the
+ return value of fesetround().
+
+2008-10-15 Wednesday 13:16 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.70): Repaired build reverting
+ temporarily correctness fix.
+
+2008-10-15 Wednesday 11:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.62): Fixme removed and
+ commented code uncommented.
+
+2008-10-15 Wednesday 10:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.269): Item removed.
+
+2008-10-15 Wednesday 10:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.85),
+ ppl_interface_generator_ciao_prolog_generated_test_pl.m4 (1.2):
+ Revised to enable the generated tests.
+
+2008-10-15 Wednesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ciao_prolog_generated_test_pl.m4 was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-10-15 Wednesday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_generated_test_pl.m4 was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-15 Wednesday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_generated_test_pl_code.m4 was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-15 Wednesday 10:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: pl_check.pl (1.61),
+ ppl_interface_generator_prolog_generated_test_pl.m4 (1.2),
+ ppl_interface_generator_prolog_generated_test_pl_code.m4 (1.9):
+ The code for testing the timeout predicates revised; it avoids
+ use of the deprecated predicates and is more robust with respect
+ to changes in computation times.
+
+ The generated test code also much improved and several bugs
+ fixed.
+
+2008-10-14 Tuesday 23:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.31): Old stuff removed.
+
+2008-10-14 Tuesday 23:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.268): One item postponed.
+
+2008-10-14 Tuesday 15:25 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.69): Comparison are now done taking
+ for granted C99 conformance.
+
+2008-10-14 Tuesday 15:24 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.46): Added missing assertions.
+
+2008-10-14 Tuesday 15:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.59), tests/Makefile.am (1.21):
+ Remove useless -I option from ocamlc commands.
+
+2008-10-14 Tuesday 11:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.20): Let the executable
+ tests also depend on ppl_ocaml.cma.
+
+2008-10-14 Tuesday 11:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.58): Let ppl_ocaml.cma also
+ depend on libppl_ocaml.a
+
+2008-10-13 Monday 18:57 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.97): Added const.
+
+2008-10-13 Monday 16:59 Abramo Bagnara
+
+ * src/: checked_float.inlines.hh (1.96), compiler.hh (1.16):
+ Optimized and fixed correctness.
+
+2008-10-13 Monday 15:23 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.95): Fixed conversion.
+
+2008-10-13 Monday 15:14 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.94): Reverted previous change.
+
+2008-10-13 Monday 15:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.175): All external
+ references are emphasized using italics.
+
+2008-10-13 Monday 14:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/randphull1.cc (1.16): Temporary workaround for
+ those machines (such as the ARM, possibly others) where we cannot
+ control the FPU.
+
+2008-10-13 Monday 14:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.12): Adjusted the euclidean
+ distance for test01.
+
+2008-10-13 Monday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/propagateconstraints2.cc (bounded_arithmetic.1): file
+ propagateconstraints2.cc was added on branch bounded_arithmetic
+ on 2008-10-29 20:45:38 +0000
+
+2008-10-13 Monday 13:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.174): Removed unwanted
+ </EM> in the widening of powersets documentation.
+
+2008-10-13 Monday 12:45 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.93): Added missing optimization.
+
+2008-10-13 Monday 11:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.11): Restore tests with
+ distances in the check_result() reset.
+
+2008-10-13 Monday 11:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.10): Disable tests while
+ problems causing failures are investigated.
+
+2008-10-13 Monday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.9): check_result for all
+ tests does not need parameters.
+
+2008-10-13 Monday 08:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.8): Tests 02 and 03 succeed
+ for all integer types.
+
+2008-10-13 Monday 08:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.7): Restore test01 to
+ testing the outcome of the test. Added two further simple
+ versions of this test; test02 showed the same bug indicated by
+ test01 while with the reversed bounds the symmetrically
+ equivalent test03 did not fail.
+
+2008-10-13 Monday 08:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.132): Fixed a bug in
+ propagate_constraint_no_check().
+
+2008-10-12 Sunday 20:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.11): Do this test using the C
+ language (the file installed in
+ $prefix/include/c++/VERSION/fenv.h by recent versions of GCC
+ causes problems).
+
+2008-10-12 Sunday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.395): The Ciao Prolog interface is not enabled by
+ default.
+
+2008-10-12 Sunday 10:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.173): All \extref in
+ the format \extref{<Ref>, <Name of section>}.
+
+2008-10-11 Saturday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.53): The PWL is now enabled by default
+ also on Cygwin.
+
+2008-10-11 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.10): Fixed a copy-and-paste
+ mistake.
+
+2008-10-11 Saturday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio.sed (1.3): Changed so as to generate
+ anchors based on the BibTeX keys, not on the labels obtained with
+ bibtex2html (which depend on the bibliography style).
+
+2008-10-11 Saturday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio.sed (bounded_arithmetic.1): file
+ generate_dox_biblio.sed was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-11 Saturday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked.inlines.hh (1.45), checked_float.inlines.hh (1.92):
+ Long source lines avoided.
+
+2008-10-11 Saturday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-none.inlines.hh (1.10): Fixed one bug and a few warnings.
+
+2008-10-11 Saturday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.inlines.hh (1.9): Do not define round_fpu_dir()
+ if !PPL_CAN_CONTROL_FPU.
+
+2008-10-11 Saturday 20:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.defs.hh (1.21): Use PPL_CAN_CONTROL_FPU to simplify the
+ logic here.
+
+2008-10-11 Saturday 20:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_binary_format.m4 (1.17),
+ ac_cxx_float_binary_format.m4 (1.14),
+ ac_cxx_long_double_binary_format.m4 (1.21): If we cannot control
+ the FPU, all floating point types are unsupported.
+
+2008-10-11 Saturday 18:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.89): Corrected a couple of file paths for
+ configured-ocaml LaTeX manuals.
+
+2008-10-11 Saturday 18:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.221): Corrected a few bibliographic
+ references.
+
+2008-10-11 Saturday 15:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.9): Cater for systems that have
+ <fenv.h> or <ieeefp.h> but fail to define FE_UPWARD or
+ FE_DOWNWARD.
+
+2008-10-11 Saturday 14:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.220): Bibliography updated.
+
+2008-10-11 Saturday 14:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio.sed (1.2): Fixed.
+
+2008-10-11 Saturday 13:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio (1.1),
+ devtools/generate_dox_biblio.sed (1.1), doc/bib2dox (1.4),
+ doc/bib2html1.sed (1.2), doc/bib2html2.sed (1.4): New version of
+ the tool to generate the Doxygen version of a bibliography in
+ BibTeX format. (New version of the sed script written by Abramo
+ Bagnara).
+
+2008-10-11 Saturday 13:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_dox_biblio (bounded_arithmetic.1): file
+ generate_dox_biblio was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-11 Saturday 11:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.88): Prefer $(srcdir) to @srcdir at .
+
+2008-10-11 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.repo (1.29), Watchdog/configure.repo (1.5): The
+ configure.repo files do not solve the problem they were meant to
+ solve.
+
+2008-10-11 Saturday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am (1.5): Avoid using $(builddir).
+
+2008-10-11 Saturday 10:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: ppl-config.1 (1.8), ppl_lcdd.1 (1.6), ppl_lpsol.1 (1.6):
+ Regenerated.
+
+2008-10-11 Saturday 10:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.87): Avoid annoying changes of directories
+ when building the OCaml docs.
+
+2008-10-11 Saturday 09:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.6): Previous change done to
+ identify bug, reverted.
+
+2008-10-11 Saturday 09:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.394), configure.repo (1.28): The PWL is now
+ enabled by default also on Cygwin.
+
+2008-10-10 Friday 22:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/propagateconstraints2.cc (1.5): Restore a proper test
+ result.
+
+2008-10-10 Friday 22:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/prog2man (1.2): This functionality is now provided by
+ `generate_man_pages' in the `devtools' directory.
+
+2008-10-10 Friday 22:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/generate_man_pages (1.1): Small script to generate the
+ manpages in the `doc' directory.
+
+2008-10-10 Friday 21:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/bump_copyright_years (1.1): A small script to update the
+ copyright years.
+
+2008-10-10 Friday 21:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/bump_copyright_years (bounded_arithmetic.1): file
+ bump_copyright_years was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/: cvs2cl.pl (1.1), update_ChangeLog (1.1): Machinery to
+ automatically update the ChangeLog files.
+
+2008-10-10 Friday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/cvs2cl.pl (bounded_arithmetic.1): file cvs2cl.pl was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * devtools/update_ChangeLog (bounded_arithmetic.1): file
+ update_ChangeLog was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.31), Watchdog/ChangeLog (1.20): Updated.
+
+2008-10-10 Friday 21:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.86): Modified to match recent changes in the
+ OCaml interface files.
+
+2008-10-10 Friday 21:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.57),
+ ppl_interface_generator_ocaml_ml.m4 (1.19),
+ ppl_interface_generator_ocaml_mli.m4 (1.23), ppl_ocaml_globals.ml
+ (1.14), ppl_ocaml_globals.mli (1.1), ppl_ocaml_types.ml (1.16):
+ The file ppl_ocaml_types.ml is now merged to
+ ppl_ocaml_globals.ml. Added the corresponding .mli file (instead
+ of generating it using m4; m4 now includes it).
+
+2008-10-10 Friday 21:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.mli (bounded_arithmetic.1):
+ file ppl_ocaml_globals.mli was added on branch bounded_arithmetic
+ on 2008-10-29 20:45:30 +0000
+
+2008-10-10 Friday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.49), configure.ac (1.393), configure.repo (1.27),
+ debian/Makefile.am (1.6), fedora/Makefile.am (1.4): The `fedora'
+ and `debian' directories are no longer distributed.
+
+2008-10-10 Friday 21:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox (1.6): The link for OCaml
+ generated documentation is now set to the index page.
+
+2008-10-10 Friday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.392), configure.repo (1.26): Version number
+ bumped.
+
+2008-10-10 Friday 15:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.172): Typo fixed.
+
+2008-10-10 Friday 11:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.171): Typos fixed. The
+ introduction to the manual revised. Structure/contents list for
+ the main section improved and moved to earlier in the document.
+ Links are now there to all the sections and subsections. Issues
+ relating to compilation and installation have been moved, where
+ necessary, to that section. Note about the stack size for GNU
+ Prolog added.
+
+2008-10-09 Thursday 21:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.391), configure.repo (1.25): n Fedora 9 systems,
+ the default path to (OpenJDK) java is /usr/lib/jvm/java.
+
+2008-10-09 Thursday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.4):
+ Previous change reverted: library(lists) may not be installed.
+
+2008-10-09 Thursday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_prolog_generated_test.pl
+ (bounded_arithmetic.1): file swi_prolog_generated_test.pl was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-09 Thursday 19:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.19): Optionally run the
+ tests under Valgrind.
+
+2008-10-09 Thursday 15:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/namespaces.hh (1.16): Foreign language interface namespaces
+ do not belong to the C++ interface group.
+
+2008-10-09 Thursday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/ppl_c_header.h (1.8),
+ Java/parma_polyhedra_library/Parma_Polyhedra_Library.java (1.4),
+ OCaml/OCaml_interface.dox (1.5), Prolog/Prolog_interface.dox
+ (1.170): Added missing \defgroup Doxygen command for the foreign
+ language interfaces.
+
+2008-10-09 Thursday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+ (bounded_arithmetic.1): file Parma_Polyhedra_Library.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-09 Thursday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h (bounded_arithmetic.1): file
+ ppl_c_header.h was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:26 +0000
+
+2008-10-09 Thursday 14:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.3): Include
+ the directive :- use_module(library(lists), [member/2,
+ append/2]).
+
+2008-10-09 Thursday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (1.59): Class Octagonal_Shape is in
+ the C++ interface documentation group.
+
+2008-10-09 Thursday 14:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.56), tests/Makefile.am (1.18):
+ When compiling using ocamlc, set the stack limit to 1 MB.
+
+2008-10-09 Thursday 14:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.84): Test
+ ppl_prolog_generated_test added to check-local.
+
+2008-10-09 Thursday 11:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.83): Include
+ ppl_prolog_generated_test in check-local
+
+2008-10-09 Thursday 08:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.70): Include
+ ppl_prolog_generated_test in check-local.
+
+2008-10-09 Thursday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/Makefile.am (1.34): Keep the expected
+ files together in EXTRA_DIST.
+
+2008-10-09 Thursday 08:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/Makefile.am (1.33): Distribute
+ expected_pgt
+
+2008-10-09 Thursday 07:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.8): add_disjuncts test corrected.
+
+2008-10-08 Wednesday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: SWI/Makefile.am (1.102), XSB/Makefile.am
+ (1.79): ppl_prolog_generated_test now included in check-local
+
+2008-10-08 Wednesday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_check_ciao.m4 (1.4), ac_check_fpu_control.m4 (1.8),
+ ac_check_gmp.m4 (1.29), ac_check_swi_prolog.m4 (1.17),
+ ac_cxx_double_binary_format.m4 (1.16),
+ ac_cxx_double_exact_output.m4 (1.9), ac_cxx_flexible_arrays.m4
+ (1.16), ac_cxx_float_binary_format.m4 (1.13),
+ ac_cxx_float_exact_output.m4 (1.7), ac_cxx_ieee_inexact_flag.m4
+ (1.5), ac_cxx_limit_memory.m4 (1.2),
+ ac_cxx_long_double_binary_format.m4 (1.20),
+ ac_cxx_long_double_exact_output.m4 (1.14),
+ ac_cxx_proper_long_double.m4 (1.5), ac_cxx_remainder_bug.m4
+ (1.6), ppl.m4 (1.11), ppl_c.m4 (1.4): Contrary to what was
+ recommended in
+ http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012736.html,
+ returning from main is non-portable only to the most ancient C
+ compilers. On the other hand, finding a suitable declaration for
+ exit() is more problematic. (Thanks to Ralf Wildenhues for
+ pointing out that.)
+
+2008-10-08 Wednesday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_ieee_inexact_flag.m4 (bounded_arithmetic.1): file
+ ac_cxx_ieee_inexact_flag.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-08 Wednesday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_limit_memory.m4 (bounded_arithmetic.1): file
+ ac_cxx_limit_memory.m4 was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:34 +0000
+
+2008-10-08 Wednesday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.100):
+ ppl_prolog_generated_test now included in check-local
+
+2008-10-08 Wednesday 21:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/: ppl_java_common.cc (1.51),
+ ppl_java_common.defs.hh (1.6), ppl_java_common.inlines.hh (1.3),
+ ppl_java_globals.cc (1.25): Added missing / fixed existing
+ documentation; also renamed a few functions.
+
+2008-10-08 Wednesday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.defs.hh
+ (bounded_arithmetic.1): file ppl_java_common.defs.hh was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-08 Wednesday 19:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.93), devref.doxyconf-latex.in
+ (1.32): Added files Variables_Set.* to the list of input files
+ for devref manuals.
+
+2008-10-08 Wednesday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.101): In a long command,
+ make sure no backslash is followed by something that could expand
+ to the null string.
+
+2008-10-08 Wednesday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_types.ml (1.15): Comment improved.
+
+2008-10-08 Wednesday 16:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.169): A number of small
+ improvements and typos fixed.
+
+2008-10-08 Wednesday 08:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.22),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.19):
+ Include the type declarations from ppl_ocaml_types.ml in the
+ generated ppl_ocaml.mli.
+
+ Fixed a bug in the generated tests file.
+
+2008-10-08 Wednesday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.100): Conditionally run
+ tests under Valgrind.
+
+2008-10-07 Tuesday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.390), configure.repo (1.24): Version number
+ bumped.
+
+2008-10-07 Tuesday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.17): Two FIXMEs added.
+
+2008-10-07 Tuesday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: lib-link.m4 (1.5), lib-prefix.m4 (1.6): Temporarily reverted
+ to the versions distributed with Gettext 0.14.6 (the new versions
+ from gnulib do not work for us... we are probably misusing them).
+
+2008-10-07 Tuesday 16:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.7),
+ ppl_interface_generator_prolog_dox_code.m4 (1.8),
+ ppl_prolog_sysindep_dox (1.3): Revert unintended changes.
+
+2008-10-07 Tuesday 16:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.67),
+ ppl_interface_generator_prolog_dox.m4 (1.6),
+ ppl_interface_generator_prolog_dox_code.m4 (1.7): Uninteded
+ change reverted.
+
+2008-10-07 Tuesday 16:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.168): More small
+ improvements and bugs fixed.
+
+2008-10-07 Tuesday 15:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.167): Small improvement
+ and a typo fixed.
+
+2008-10-07 Tuesday 15:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.219), src/Box.defs.hh (1.64): Avoid
+ explicit mention of bounding boxes. Change references to the
+ section on intervals and boxes to "intervals". All mention of
+ covering boxes removed.
+
+2008-10-07 Tuesday 15:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/C_interface.dox (1.15): Change "who" to "which.
+
+2008-10-07 Tuesday 15:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.66), Prolog_interface.dox
+ (1.166), ppl_interface_generator_prolog_dox.m4 (1.5),
+ ppl_interface_generator_prolog_dox_code.m4 (1.6),
+ ppl_prolog_sysindep_dox (1.2): typo fixed.
+
+2008-10-07 Tuesday 15:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.165): Corrected a few
+ bugs.
+
+2008-10-07 Tuesday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.58):
+ Corrected error in template for add_disjunct.
+
+2008-10-07 Tuesday 11:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.57):
+ Corrected an error in the template code for get_disjunct; avoid
+ useless copies in the template code for linear/approximate
+ partitions. Try to be more consistent with template indentation
+ and spacing.
+
+2008-10-07 Tuesday 11:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.164): A new _draft_
+ version of the configure independent documentation for Prolog.
+
+2008-10-07 Tuesday 06:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.389), configure.repo (1.23): Version number
+ bumped.
+
+2008-10-07 Tuesday 06:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.83): Fixed the guard controlling
+ the definition of glpk_message_interceptor().
+
+2008-10-06 Monday 23:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: Makefile.am (1.85),
+ devref-foreign-language-interface.doxyconf.in (1.5),
+ interfaces-html.sed (1.3), interfaces-latex.sed (1.3),
+ user-foreign-language-interface.doxyconf.in (1.5): Avoid warnings
+ related to tag files when building latex manuals.
+
+2008-10-06 Monday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-foreign-language-interface.doxyconf.in
+ (bounded_arithmetic.1): file
+ devref-foreign-language-interface.doxyconf.in was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/interfaces-html.sed (bounded_arithmetic.1): file
+ interfaces-html.sed was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-foreign-language-interface.doxyconf.in
+ (bounded_arithmetic.1): file
+ user-foreign-language-interface.doxyconf.in was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 21:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.36), configure.ac (1.52),
+ configure.repo (1.4), src/Makefile.am (1.16): Fixed the machinery
+ used to conditionalize the build of the PWL. The PWL is
+ currently disabled under Cygwin because of the bug reported in
+ http://www.cs.unipr.it/pipermail/ppl-devel/2008-October/013156.html.
+
+2008-10-06 Monday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/simple1.cc (bounded_arithmetic.1): file simple1.cc
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:22
+ +0000
+
+2008-10-06 Monday 15:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: configure.ac (1.51), configure.repo (1.3), Makefile.am
+ (1.35), README (1.18), m4/Makefile.am (1.4),
+ src/Doubly_Linked_Object.defs.hh (1.6),
+ src/Doubly_Linked_Object.inlines.hh (1.6), src/EList.defs.hh
+ (1.8), src/EList.inlines.hh (1.6), src/EList_Iterator.defs.hh
+ (1.6), src/EList_Iterator.inlines.hh (1.6), src/Handler.defs.hh
+ (1.7), src/Handler.inlines.hh (1.6), src/Makefile.am (1.15),
+ src/Pending_Element.cc (1.7), src/Pending_Element.defs.hh (1.7),
+ src/Pending_Element.inlines.hh (1.6), src/Pending_List.cc (1.7),
+ src/Pending_List.defs.hh (1.7), src/Pending_List.inlines.hh
+ (1.6), src/Time.cc (1.7), src/Time.defs.hh (1.7),
+ src/Time.inlines.hh (1.6), src/Watchdog.cc (1.9),
+ src/Watchdog.defs.hh (1.9), src/Watchdog.inlines.hh (1.6),
+ src/pwl_header.hh (1.7), tests/Makefile.am (1.4),
+ tests/pwl_test.cc (1.2), tests/pwl_test.hh (1.2),
+ tests/simple1.cc (1.3), utils/Makefile.am (1.12): Copyright
+ notices made consistent.
+
+2008-10-05 Sunday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-latex.in (1.4),
+ Watchdog/doc/user.doxyconf-html.in (1.5),
+ Watchdog/doc/user.doxyconf-latex.in (1.5),
+ doc/devref.doxyconf-html.in (1.92), doc/devref.doxyconf-latex.in
+ (1.31), doc/user-foreign-language-interface.doxyconf.in (1.4),
+ doc/user.doxyconf-html.in (1.44), doc/user.doxyconf-latex.in
+ (1.15): Updated for Doxygen 1.5.7.1.
+
+2008-10-05 Sunday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/Makefile.am (1.3): Spurious backslash removed.
+
+2008-10-05 Sunday 22:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/: Makefile.am (1.2), valgrind_suppressions (1.1):
+ Distribute also pwl_test.hh and valgrind_suppressions.
+
+2008-10-05 Sunday 22:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/valgrind_suppressions (bounded_arithmetic.1): file
+ valgrind_suppressions was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:22 +0000
+
+2008-10-05 Sunday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-html.in (1.4),
+ doc/devref-foreign-language-interface.doxyconf.in (1.4): Updated
+ for Doxygen 1.5.7.1.
+
+2008-10-05 Sunday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.388), configure.repo (1.22): Disable the PWL
+ under Cygwin. It is not yet clear whether Cygwin provides the
+ services required in order to make it work.
+
+2008-10-05 Sunday 19:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.5): A few improvement to the pre/post class code: we now add a
+ brief Doxygen comment with a link to the corresponding C++ class.
+ The links work fine (in the HTML manuals, exploiting the tag
+ file) as long as the C++ class names do not correspond to
+ template instances.
+
+2008-10-05 Sunday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_java_classes_java.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.84): Added more ad-hoc Doxygen commands for
+ the configured-java manuals: we need to exclude the fixed
+ documentation in Fake_Class_for_Doxygen.java (since otherwise
+ Doxygen gets confused by the repeated class definitions);
+ moreover, for the user manuals, we list undocumented members too.
+
+2008-10-05 Sunday 18:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (1.4): Small correction.
+
+2008-10-05 Sunday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (bounded_arithmetic.1): file Fake_Class_for_Doxygen.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 18:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/PPL_Object.java (1.5):
+ Class PPL_Object should only concern developers.
+
+2008-10-05 Sunday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/PPL_Object.java
+ (bounded_arithmetic.1): file PPL_Object.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.14): Corrected/improved
+ documentation for powerset iterators.
+
+2008-10-05 Sunday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/simple1.cc (1.2): Added some debug output.
+
+2008-10-05 Sunday 10:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.36), Prolog/Makefile.am (1.65),
+ Prolog/Ciao/Makefile.am (1.84), Prolog/GNU/Makefile.am (1.82),
+ Prolog/SICStus/Makefile.am (1.99), Prolog/SWI/Makefile.am (1.99),
+ Prolog/XSB/Makefile.am (1.78), Prolog/YAP/Makefile.am (1.69),
+ Prolog/tests/Makefile.am (1.32): No longer generating
+ documentation file Prolog_interface.dox; rather, we now generate
+ Prolog_configured_interface.dox. Completed the simplification of
+ conditional interface building: now the generation of Prolog
+ interfaces too is based on the conditional definition of variable
+ SUBDIRS.
+
+2008-10-05 Sunday 10:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.83): The Java devref manual is now also based
+ on generated Java source files to be found in
+ builddir/interfaces/Java/parma_polyhedra_library. The Prolog
+ user manaul now depends on the fixed Prolog_interface.dox file.
+
+2008-10-05 Sunday 10:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.163): Added fixed
+ version for Prolog_interface.dox: this will no longer be
+ generated by m4 scripts.
+
+2008-10-05 Sunday 09:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/tests/.cvsignore (bounded_arithmetic.1): file .cvsignore
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:22
+ +0000
+
+2008-10-05 Sunday 09:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.34), configure.ac (1.50),
+ configure.repo (1.2), tests/.cvsignore (1.1), tests/Makefile.am
+ (1.1), tests/pwl_test.cc (1.1), tests/pwl_test.hh (1.1),
+ tests/simple1.cc (1.1): Make some simple tests also with the
+ Parma Watchdog Library.
+
+2008-10-05 Sunday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.188): Readability improvement.
+
+2008-10-04 Saturday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.387), configure.repo (1.21): Under Cygwin,
+ SWI-Prolog does not work with foreign code. We thus disable that
+ interface on that architecture.
+
+2008-10-04 Saturday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.cc (1.6): Removed spurious
+ `inline' qualifiers.
+
+2008-10-04 Saturday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.cc (bounded_arithmetic.1): file
+ ciao_efli.cc was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:32 +0000
+
+2008-10-04 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_ciao.m4 (1.3): Adapted to the SVN HEAD version of
+ Ciao.
+
+2008-10-04 Saturday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.130): The program memory1 cannot
+ be used to test with Valgrind since it intentionally causes
+ out-of-memory conditions.
+
+2008-10-04 Saturday 19:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.30), TODO (1.267): One item dealt with.
+
+2008-10-04 Saturday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.repo (1.20), Watchdog/m4/ax_prefix_config_h.m4 (1.2),
+ m4/ax_prefix_config_h.m4 (1.3), m4/lib-link.m4 (1.4),
+ m4/lib-prefix.m4 (1.5): Updated.
+
+2008-10-04 Saturday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.43), config.sub (1.40), Watchdog/config.guess
+ (1.27), Watchdog/config.sub (1.25): Updated.
+
+2008-10-04 Saturday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (1.12): Removed one of the
+ initializations added in
+ http://www.cs.unipr.it/pipermail/ppl-devel/2006-June/009164.html
+
+2008-10-04 Saturday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.122), Octagonal_Shape.templates.hh
+ (1.92), Polyhedron_nonpublic.cc (1.86), checked.cc (1.25): Use
+ PPL_UNINITIALIZED instead of explicit initializations and
+ free-style comments.
+
+2008-10-04 Saturday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh (1.15): New macro PPL_UNINITIALIZED allows a
+ better markup and handling of those variables that are declared
+ uninitialized on purpose.
+
+2008-10-04 Saturday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc (1.13): Checks for compilers reordered.
+
+2008-10-04 Saturday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.16): Useless inclusion removed.
+
+2008-10-04 Saturday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ptr_Iterator.defs.hh (1.14): A friend declarations was
+ (wrongly) included only conditionally: fixed.
+
+2008-10-04 Saturday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.18),
+ Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.7): Added simple tests for the copy iterator procedures in the
+ interfaces.
+
+2008-10-04 Saturday 10:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.29): Removed spurious marker.
+
+2008-10-04 Saturday 10:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_java_classes_cc_code.m4 was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-04 Saturday 10:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.28): In the templates for native implementations, try to
+ follow a consistent indentation and line breaking style;
+ moreover, prefer standard (and shorter) variable names, rather
+ than variables names cluttered by (useless) m4-generated type
+ information (this change produces 10-25% smaller cc files).
+
+2008-10-04 Saturday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ptr_Iterator.defs.hh (1.13): Changed `#ifdef' into `#if
+ defined'.
+
+2008-10-04 Saturday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.24): Temporarily unused function
+ commented out.
+
+2008-10-04 Saturday 08:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.27): Implemented a better way of ignoring the jclass argument
+ in the native implementation of static methods, yet avoiding
+ compiler warnings.
+
+2008-10-04 Saturday 07:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.386), configure.repo (1.19): Disable more
+ warnings when using the Intel C/C++ compiler.
+
+2008-10-04 Saturday 03:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/ppl_c_test.h (1.2): Old-style declarations
+ avoided.
+
+2008-10-04 Saturday 03:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/ppl_c_test.h (bounded_arithmetic.1): file
+ ppl_c_test.h was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:27 +0000
+
+2008-10-04 Saturday 03:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.cc (1.4): Spurious semicolons
+ removed.
+
+2008-10-04 Saturday 03:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.42): Variable shadowing
+ avoided.
+
+2008-10-04 Saturday 03:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.inlines.hh (1.2): Avoided
+ redefinition of default argument.
+
+2008-10-04 Saturday 02:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (1.39): Trailing commas removed.
+
+2008-10-04 Saturday 02:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (1.24): Avoid a couple of compiler warnings.
+
+2008-10-04 Saturday 01:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+ (1.17), ppl_interface_generator_prolog_dox_code.m4 (1.5),
+ ppl_interface_generator_prolog_hh_code.m4 (1.14),
+ tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.6): Implemented schema ppl_new_ at CLASS@_iterator_from_iterator.
+
+2008-10-04 Saturday 01:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/: ppl_interface_generator_java_dox.m4 (1.4),
+ ppl_interface_generator_java_dox_code.m4 (1.5),
+ ppl_java_common_dox (1.6),
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.26),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.15), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.50): Implemented schema
+ ppl_new_ at CLASS@_iterator_from_iterator. Got rid of no longer
+ used m4 files for the generation of documentation.
+
+2008-10-04 Saturday 01:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_java_classes_java_code.m4 was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-04 Saturday 01:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.54),
+ C/ppl_interface_generator_c_h_code.m4 (1.47),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.56),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.50),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.41):
+ Implemented schema ppl_new_ at CLASS@_iterator_from_iterator.
+
+2008-10-04 Saturday 01:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.41): Added schema ppl_new_ at CLASS@_iterator_from_iterator/2;
+ renamed the schema for deleting iterators so as to follow common
+ pattern.
+
+2008-10-04 Saturday 00:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.82): Make sure
+ glpk_message_interceptor() is defined only when necessary.
+
+2008-10-03 Friday 23:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.385), configure.repo (1.18),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.10): Fixed the GNU
+ Prolog interface.
+
+2008-10-03 Friday 23:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.40),
+ C/ppl_interface_generator_c_cc_code.m4 (1.53),
+ C/ppl_interface_generator_c_h_code.m4 (1.46),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.10),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.25),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.14), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.55),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.49),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.40),
+ OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.17),
+ Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.16),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.13):
+ Procedure *drop_disjuncts has been added to all the interfaces.
+
+2008-10-03 Friday 23:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/membytes1.cc (1.8): Disable test02() in case doubles
+ are not supported.
+
+2008-10-03 Friday 22:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.18): Use raw_value() so that a comparison is
+ always defined, even if doubles are not supported.
+
+2008-10-03 Friday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.121): Debugging code removed.
+
+2008-10-03 Friday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.384), configure.repo (1.17),
+ m4/ac_cxx_double_binary_format.m4 (1.15),
+ m4/ac_cxx_double_exact_output.m4 (1.8),
+ m4/ac_cxx_float_binary_format.m4 (1.12),
+ m4/ac_cxx_float_exact_output.m4 (1.6),
+ m4/ac_cxx_long_double_binary_format.m4 (1.19),
+ m4/ac_cxx_long_double_exact_output.m4 (1.13): We currently miss a
+ "Plan B" for the case where exact output is not available. So,
+ in these cases, we declare the corresponding floating point type
+ as unsupported.
+
+2008-10-03 Friday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.91): Reference to the C99
+ standard fixed.
+
+2008-10-03 Friday 20:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.383), configure.repo (1.16): Restored java in the
+ set of interfaces enabled by default.
+
+2008-10-03 Friday 18:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/tests/: ppl_interface_generator_ocaml_test_ml.m4
+ (1.3), ppl_interface_generator_ocaml_test_ml_code.m4 (1.16),
+ ppl_ocaml_tests_common (1.6), test1.ml (1.15): The tests are now
+ quiet unless the PPL_NOISY_TESTS or PPL_VERY_NOISY_TESTS
+ environment variable is defined.
+
+2008-10-03 Friday 18:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.24),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.13), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.49): Ensure the code for drop_disjuncts is generated. Code
+ corrected and test added. Draft code for a copy constructor for
+ the iterators, but code from this is not generated yet.
+
+2008-10-03 Friday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.12): Expected text
+ fixed.
+
+2008-10-03 Friday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (1.18): Floating point
+ literal fixed.
+
+2008-10-03 Friday 17:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.382), configure.repo (1.15),
+ m4/ac_cxx_double_exact_output.m4 (1.7),
+ m4/ac_cxx_float_exact_output.m4 (1.5),
+ m4/ac_cxx_long_double_binary_format.m4 (1.17),
+ m4/ac_cxx_long_double_exact_output.m4 (1.11): Test also with long
+ double denormalized numbers.
+
+2008-10-03 Friday 16:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am (1.11): Added
+ a couple of notes to recall that Fake_Class_for_Doxygen.java is
+ only meant to be used when producing the documentation.
+
+2008-10-03 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am
+ (bounded_arithmetic.1): file Makefile.am was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 16:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (1.3): More documentation improvements.
+
+2008-10-03 Friday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (1.16): Added missing 'L'
+ suffix to floating point literal.
+
+2008-10-03 Friday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_long_double_binary_format.m4 (1.15),
+ ac_cxx_long_double_exact_output.m4 (1.10): Literals corrected.
+
+2008-10-03 Friday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.9): Expected text
+ updated.
+
+2008-10-03 Friday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (1.14): Floating point
+ literal fixed.
+
+2008-10-03 Friday 15:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.381), configure.repo (1.14),
+ m4/ac_cxx_double_binary_format.m4 (1.14),
+ m4/ac_cxx_double_exact_output.m4 (1.6),
+ m4/ac_cxx_float_binary_format.m4 (1.11),
+ m4/ac_cxx_float_exact_output.m4 (1.4),
+ m4/ac_cxx_long_double_binary_format.m4 (1.13),
+ m4/ac_cxx_long_double_exact_output.m4 (1.8), src/Float.defs.hh
+ (1.32): Fixed several macro names.
+
+2008-10-03 Friday 15:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+ (bounded_arithmetic.1): file MIP_Problem.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 15:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/: jni/ppl_java_globals.cc (1.24),
+ parma_polyhedra_library/MIP_Problem.java (1.5): Added copy
+ constructor, destructor and finalization to MIP_Problem.
+
+2008-10-03 Friday 14:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.23): Added code template for method drop_disjuncts.
+
+2008-10-03 Friday 14:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (1.2): Added further methods that should be documented in the
+ configuration-independent manuals for the Java interface.
+
+2008-10-03 Friday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.7): Preparation to test
+ also with long double denormalized numbers.
+
+2008-10-03 Friday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_binary_format.m4 (1.13),
+ ac_cxx_double_exact_output.m4 (1.5): Test also with double
+ denormalized numbers.
+
+2008-10-03 Friday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.81): Fixed copy-and-paste mistake.
+
+2008-10-03 Friday 12:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+ (1.4): Fixed indentation.
+
+2008-10-03 Friday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+ (bounded_arithmetic.1): file Linear_Expression_Sum.java was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_binary_format.m4 (1.12),
+ ac_cxx_long_double_binary_format.m4 (1.12): Floating point
+ literals fixed.
+
+2008-10-03 Friday 11:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.273): Spurious `-lppl' removed from LDADD.
+
+2008-10-03 Friday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am (1.6): We now use the convenience
+ library libppl_c_tests.a. When GCC is used, we compile C files
+ with -pedantic -std=c89 -Werror: this way it will be harder to
+ inadvertently pollute ppl_c.h with non-standard stuff.
+
+2008-10-03 Friday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am (bounded_arithmetic.1): file
+ Makefile.am was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:27 +0000
+
+2008-10-03 Friday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/cxxoutput.c (1.6): Include "ppl_c_test.h"
+ instead of "ppl_test.h".
+
+2008-10-03 Friday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/cxxoutput.c (bounded_arithmetic.1): file
+ cxxoutput.c was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:27 +0000
+
+2008-10-03 Friday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/: ppl_c_test.cc (1.1), ppl_c_test.h (1.1),
+ ppl_test.h (1.2): Header file renamed and reimplemented.
+
+2008-10-03 Friday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/ppl_c_test.cc (bounded_arithmetic.1): file
+ ppl_c_test.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:27 +0000
+
+2008-10-03 Friday 11:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.h (1.3): Spurious semicolons
+ removed.
+
+2008-10-03 Friday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.48): If we use GCC, compile with
+ -pedantic -std=gnu89 -Werror.
+
+2008-10-03 Friday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.80): Conform to ISO C90 plus GNU
+ extensions (because of the declaration of sigaction in
+ <signal.h>).
+
+2008-10-03 Friday 10:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.380), configure.repo (1.13): New AM_CONDITIONAL
+ GCC allows to write conditionals in Makefile.am that depend on
+ whether we are using GCC or another compiler.
+
+2008-10-03 Friday 09:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.379), configure.repo (1.12): Temporarily remove
+ java from the list of default interfaces.
+
+2008-10-03 Friday 09:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_exact_output.m4 (1.4),
+ ac_cxx_float_exact_output.m4 (1.3),
+ ac_cxx_long_double_exact_output.m4 (1.6): Use AC_DEFINE_UNQUOTED
+ instead of AC_DEFINE.
+
+2008-10-03 Friday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_h.m4 (1.26),
+ ppl_interface_generator_c_h_code.m4 (1.45): Avoid generating
+ spurious semicolons.
+
+2008-10-03 Friday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/build_header.in (1.7): Generate C-style comments instead of
+ C++-style ones.
+
+2008-10-03 Friday 08:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_exact_output.m4 (1.3),
+ ac_cxx_float_exact_output.m4 (1.2),
+ ac_cxx_long_double_exact_output.m4 (1.5): Typos fixed.
+
+2008-10-02 Thursday 23:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/Makefile.am (1.30): Updated.
+
+2008-10-02 Thursday 23:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.4): Expected value
+ fixed.
+
+2008-10-02 Thursday 22:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.3): Expected texts
+ corrected.
+
+2008-10-02 Thursday 22:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_exact_output.m4 (1.2): Missing parenthesis
+ added.
+
+2008-10-02 Thursday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_exact_output.m4 (1.2): Expected text fixed.
+
+2008-10-02 Thursday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.378), configure.repo (1.11),
+ m4/ac_cxx_double_binary_format.m4 (1.11),
+ m4/ac_cxx_float_binary_format.m4 (1.10),
+ m4/ac_cxx_long_double_binary_format.m4 (1.11), src/Float.defs.hh
+ (1.31): Detect whether the C++ run-time system supports the exact
+ output of floating point types.
+
+2008-10-02 Thursday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_exact_output.m4 (1.1),
+ ac_cxx_float_exact_output.m4 (1.1),
+ ac_cxx_long_double_exact_output.m4 (1.1): New functions to test
+ whether C++ provides exact output for the floating point types.
+
+2008-10-02 Thursday 21:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.35), C/Makefile.am (1.62),
+ Java/Makefile.am (1.24), Java/jni/Makefile.am (1.28),
+ Java/parma_polyhedra_library/Makefile.am (1.10),
+ Java/tests/Makefile.am (1.26), OCaml/Makefile.am (1.55),
+ OCaml/tests/Makefile.am (1.17): Simplified the handling of
+ conditionally built foreign language interfaces by defining the
+ SUBDIRS variable conditionally. Change is implemented for the C,
+ OCaml and Java interfaces; will be implemented in Prolog as soon
+ as Prolog_interface.dox will become a fixed source file (rather
+ than being generated on the fly by m4).
+
+2008-10-02 Thursday 21:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.13): Widenings moved to the
+ sections listing ad hoc polyhedron functions.
+
+2008-10-02 Thursday 21:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.7): Previous commit
+ was wrong: tests 5 and 9 will overflow on 8 bit coefficients,
+ *if* assertions are turned on.
+
+2008-10-02 Thursday 18:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.82): The generation of the Java interface
+ manuals is now based (among others) on the fixed file
+ Fake_Class_for_Doxygen.java; we no longer use the genrated file
+ Java_interface.dox.
+
+2008-10-02 Thursday 18:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+ (1.1): Put under CVS control. This will substitute
+ Java_interface.dox (currently still generated by m4).
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Coefficient.java
+ (bounded_arithmetic.1): file Coefficient.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Congruence_System.java
+ (bounded_arithmetic.1): file Congruence_System.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Constraint.java
+ (bounded_arithmetic.1): file Constraint.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Constraint_System.java
+ (bounded_arithmetic.1): file Constraint_System.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+ (bounded_arithmetic.1): file Control_Parameter_Name.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
+ (bounded_arithmetic.1): file Control_Parameter_Value.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+ (bounded_arithmetic.1): file Degenerate_Element.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ (bounded_arithmetic.1): file Domain_Error_Exception.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Generator.java
+ (bounded_arithmetic.1): file Generator.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Generator_Type.java
+ (bounded_arithmetic.1): file Generator_Type.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+ (bounded_arithmetic.1): file Grid_Generator.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+ (bounded_arithmetic.1): file Grid_Generator_System.java was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+ (bounded_arithmetic.1): file Grid_Generator_Type.java was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+ (bounded_arithmetic.1): file Invalid_Argument_Exception.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ (bounded_arithmetic.1): file Length_Error_Exception.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+ (bounded_arithmetic.1): file Linear_Expression.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+ (bounded_arithmetic.1): file Linear_Expression_Coefficient.java
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+ +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+ (bounded_arithmetic.1): file Linear_Expression_Difference.java
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+ +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+ (bounded_arithmetic.1): file Linear_Expression_Times.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+ (bounded_arithmetic.1): file Linear_Expression_Unary_Minus.java
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+ +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+ (bounded_arithmetic.1): file Linear_Expression_Variable.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+ (bounded_arithmetic.1): file Logic_Error_Exception.java was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+ (bounded_arithmetic.1): file Optimization_Mode.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+ (bounded_arithmetic.1): file Overflow_Error_Exception.java was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Pair.java
+ (bounded_arithmetic.1): file Pair.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Partial_Function.java
+ (bounded_arithmetic.1): file Partial_Function.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+ (bounded_arithmetic.1): file Poly_Con_Relation.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+ (bounded_arithmetic.1): file Poly_Gen_Relation.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+ (bounded_arithmetic.1): file Relation_Symbol.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/: By_Reference.java
+ (1.3), Coefficient.java (1.3), Congruence_System.java (1.3),
+ Constraint.java (1.3), Constraint_System.java (1.3),
+ Control_Parameter_Name.java (1.2), Control_Parameter_Value.java
+ (1.2), Degenerate_Element.java (1.3), Domain_Error_Exception.java
+ (1.3), Generator.java (1.3), Generator_Type.java (1.3),
+ Grid_Generator.java (1.3), Grid_Generator_System.java (1.3),
+ Grid_Generator_Type.java (1.3), Invalid_Argument_Exception.java
+ (1.3), Length_Error_Exception.java (1.3), Linear_Expression.java
+ (1.3), Linear_Expression_Coefficient.java (1.3),
+ Linear_Expression_Difference.java (1.3),
+ Linear_Expression_Sum.java (1.3), Linear_Expression_Times.java
+ (1.3), Linear_Expression_Unary_Minus.java (1.3),
+ Linear_Expression_Variable.java (1.3), Logic_Error_Exception.java
+ (1.3), MIP_Problem.java (1.4), Optimization_Mode.java (1.3),
+ Overflow_Error_Exception.java (1.3), PPL_Object.java (1.4),
+ Pair.java (1.3), Parma_Polyhedra_Library.java (1.3),
+ Partial_Function.java (1.3), Poly_Con_Relation.java (1.3),
+ Poly_Gen_Relation.java (1.3), Relation_Symbol.java (1.3): Several
+ improvements to the Doxygen documentation.
+
+2008-10-02 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/By_Reference.java
+ (bounded_arithmetic.1): file By_Reference.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (1.17): Fixed a bug whereby (besides
+ not being Valgrind-clean) we were violating the API of GMP.
+
+2008-10-02 Thursday 18:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+ (1.2): Formatting improved.
+
+2008-10-02 Thursday 16:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.120): Temporarily added debugging
+ code to the closure method.
+
+2008-10-02 Thursday 16:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+ (1.15), ppl_prolog_common.cc (1.11), ppl_prolog_common.defs.hh
+ (1.10), ppl_prolog_common.inlines.hh (1.2): New macro
+ NOISY_PROLOG_TRACK_ALLOCATION allows to conditionally track
+ allocation (as PROLOG_TRACK_ALLOCATION), but printing allocation
+ and deallocation messages on std::cerr (differently from
+ PROLOG_TRACK_ALLOCATION).
+
+ Class PFunc renamed Partial_Function.
+
+2008-10-02 Thursday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Ask_Tell/Makefile.am (1.7), BD_Shape/Makefile.am (1.80),
+ Box/Makefile.am (1.74), Grid/Makefile.am (1.73),
+ MIP_Problem/Makefile.am (1.12), Octagonal_Shape/Makefile.am
+ (1.34), Partially_Reduced_Product/Makefile.am (1.6),
+ Polyhedron/Makefile.am (1.129), Powerset/Makefile.am (1.6): Use
+ `$(VALGRIND)' instead of `valgrind' directly.
+
+2008-10-02 Thursday 11:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.377), configure.repo (1.10), tests/Makefile.am
+ (1.272), tests/valgrind_suppressions (1.6),
+ tests/Ask_Tell/Makefile.am (1.6), tests/BD_Shape/Makefile.am
+ (1.79), tests/Box/Makefile.am (1.73), tests/Grid/Makefile.am
+ (1.72), tests/MIP_Problem/Makefile.am (1.11),
+ tests/Octagonal_Shape/Makefile.am (1.33),
+ tests/Partially_Reduced_Product/Makefile.am (1.5),
+ tests/Polyhedron/Makefile.am (1.128), tests/Powerset/Makefile.am
+ (1.5): New configure option --enable-valgrind-tests causes (some)
+ library tests to be run under Valgrind.
+
+2008-10-02 Thursday 11:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/valgrind_suppressions (bounded_arithmetic.1): file
+ valgrind_suppressions was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:37 +0000
+
+2008-10-02 Thursday 11:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.17),
+ MIP_Problem_test1.java (1.3), Makefile.am (1.25),
+ NNC_Polyhedron_test1.java (1.4), PPL_Test.java (1.1),
+ Parma_Polyhedra_Library_test1.java (1.2), Test_Executor.java
+ (1.3), ppl_interface_generator_java_test_java.m4 (1.20),
+ ppl_interface_generator_java_test_java_code.m4 (1.48),
+ ppl_java_tests_common (1.17): Each test only outputs the results
+ of the subtests if the environment variable PPL_NOISY_TESTS or
+ PPL_VERY_NOISY_TESTS is defined.
+
+2008-10-02 Thursday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/MIP_Problem_test1.java
+ (bounded_arithmetic.1): file MIP_Problem_test1.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:29 +0000
+
+2008-10-02 Thursday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/PPL_Test.java (bounded_arithmetic.1): file
+ PPL_Test.java was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:29 +0000
+
+2008-10-02 Thursday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
+ (bounded_arithmetic.1): file Parma_Polyhedra_Library_test1.java
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:29
+ +0000
+
+2008-10-02 Thursday 10:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: Makefile.am (1.31), pl_grid_check.pl
+ (1.12): Removed pl_grid_check,pl as it is not being used or
+ maintained.
+
+2008-10-02 Thursday 10:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.71), addconstraints1.cc (1.20),
+ addgenerators1.cc (1.18), approximatepartition1.cc (1.5),
+ generator1.cc (1.22), partition1.cc (1.8), removespacedims2.cc
+ (1.17): Removed useless commented out tests that were mainly
+ testing methods that were private. Removed also some other
+ commented out code in tests. Tests renumbered to be consecutive.
+
+2008-10-02 Thursday 09:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.60): Removed tests for
+ exceptions for non-existent predicates. Modified the exception
+ testing so as to check for the kind of exception that is thrown.
+
+2008-10-02 Thursday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/ppl_ocaml_tests_common (1.5): Several
+ improvements.
+
+2008-10-02 Thursday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset2.cc (1.2): Comments fixed.
+ Commented-out code removed.
+
+2008-10-02 Thursday 08:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc (1.10): More commented-out
+ code removed.
+
+2008-10-02 Thursday 08:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.defs.hh (1.9): Commented-out
+ code removed.
+
+2008-10-02 Thursday 07:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog_common.cc (1.9),
+ ppl_prolog_common.defs.hh (1.8): PROLOG_TRACK_ALLOCATION revived.
+
+2008-10-02 Thursday 07:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: pl_check.pl (1.59), pl_grid_check.pl
+ (1.11): Typos fixed.
+
+2008-10-02 Thursday 06:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.119), Octagonal_Shape.templates.hh
+ (1.91): Fixed two instances where a TEMP_INTEGER was used
+ uninitialized.
+
+2008-10-01 Wednesday 22:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.defs.hh (1.5): Obsolete FIXME
+ removed.
+
+2008-10-01 Wednesday 22:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_classes_cc_code.m4 (1.22),
+ ppl_java_common.cc (1.50), ppl_java_common.defs.hh (1.4),
+ ppl_java_globals.cc (1.23): Renamed build_linear_expression() as
+ build_cxx_linear_expression().
+
+2008-10-01 Wednesday 21:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.30): Modified test03 so as to
+ systematically ignore overflow errors; after this change, the
+ test is meant to always succeed.
+
+2008-10-01 Wednesday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_classes_cc_code.m4 (1.21),
+ ppl_java_common.cc (1.49), ppl_java_common.defs.hh (1.3),
+ ppl_java_globals.cc (1.22): Begun fixing names and comments.
+
+2008-10-01 Wednesday 21:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.6): Due to the recent
+ change to simplify_using_context implementation, tests 05 and 09
+ no longer overflow when using 8 bit coefficients.
+
+2008-10-01 Wednesday 20:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_ocaml_globals.ml (1.13),
+ ppl_ocaml_types.ml (1.14): Two FIXMEs resolved.
+
+2008-10-01 Wednesday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc (1.6): Unused exception
+ throwers removed.
+
+2008-10-01 Wednesday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.cc (bounded_arithmetic.1): file
+ ppl_ocaml_common.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:30 +0000
+
+2008-10-01 Wednesday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/ppl_c_implementation_common.inlines.hh (1.4),
+ OCaml/ppl_ocaml_common.cc (1.5): Be consistent concerning
+ reinterpret_mpz_class().
+
+2008-10-01 Wednesday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.inlines.hh
+ (bounded_arithmetic.1): file
+ ppl_c_implementation_common.inlines.hh was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-10-01 Wednesday 15:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.83): Revised the diff
+ command for the generated test to use the relevant files.
+
+2008-10-01 Wednesday 15:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.10):
+ Improved formatting of the generated file ppl_xsb.H
+
+2008-10-01 Wednesday 15:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml.m4 (1.18),
+ ppl_interface_generator_ocaml_mli.m4 (1.21): Formatting
+ improvements to the generated files.
+
+2008-10-01 Wednesday 14:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/:
+ ppl_interface_generator_prolog_procedure_generators.m4 (1.6),
+ Ciao/ppl_interface_generator_ciao_pl.m4 (1.9): Fixed some
+ formatting bugs.
+
+2008-10-01 Wednesday 14:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_h.m4 (1.25),
+ ppl_interface_generator_c_hh_files.m4 (1.9): Formatting of
+ generated files improved.
+
+2008-10-01 Wednesday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_hh_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_c_hh_files.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-10-01 Wednesday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ciao_pl_check.pl (1.30): Added some
+ missing predicates to the list.
+
+2008-10-01 Wednesday 12:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.40): Added explanations for test macros
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT and
+ DO_TEST_F<XXX>_MAY_OVERFLOW_IF_INEXACT.
+
+2008-10-01 Wednesday 12:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.81): Removed unwanted
+ copying/removing of files in code for executing the generated
+ tests.
+
+2008-10-01 Wednesday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/print_to_buffer.h (1.2): Documentation
+ updated.
+
+2008-10-01 Wednesday 11:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.80): Further revisions - to
+ the code for the generated tests.
+
+2008-10-01 Wednesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pgt (bounded_arithmetic.1): file
+ expected_pgt was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:33 +0000
+
+2008-10-01 Wednesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_prolog_generated_test.pl
+ (bounded_arithmetic.1): file yap_prolog_generated_test.pl was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-01 Wednesday 11:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.79),
+ GNU/gnu_prolog_generated_test.pl (1.1), SICStus/Makefile.am
+ (1.98), SWI/Makefile.am (1.98), SWI/swi_prolog_generated_test.pl
+ (1.2), XSB/Makefile.am (1.77), YAP/Makefile.am (1.68),
+ YAP/yap_prolog_generated_test.pl (1.1), tests/expected_pgt (1.1),
+ tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.5): Revised the code for running the generated tests. The
+ expected result (OK) is in expected_pgt. Some coefficients in
+ the generated tests have been simplified to avoid unintended
+ overflows.
+
+2008-10-01 Wednesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
+ (bounded_arithmetic.1): file gnu_prolog_generated_test.pl was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-10-01 Wednesday 10:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.29): test02 will not overflow if
+ using exact BD instances; test03 will overflow on 8bit
+ configurations when using exact BD instances.
+
+2008-09-30 Tuesday 21:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.41): Minor improvements to
+ the simplify_using_context method: we now handle ad hoc the
+ frequent case when the context is a singleton powerset.
+
+2008-09-30 Tuesday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.28): test02() and test03() may
+ overflow also with 32 bits, if inexact coefficients are used.
+
+2008-09-30 Tuesday 20:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/stdiobuf.defs.hh (1.3): Documented.
+
+2008-09-30 Tuesday 20:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/stdiobuf.defs.hh (bounded_arithmetic.1): file
+ stdiobuf.defs.hh was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 19:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.91), devref.doxyconf-latex.in
+ (1.30): Added stdiobuf* files to Doxygen INPUT variable for
+ devref documentation.
+
+2008-09-30 Tuesday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.266): Typo fixed.
+
+2008-09-30 Tuesday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh (1.7): Use the
+ new system for all the I/O functions of the C interface.
+
+2008-09-30 Tuesday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh
+ (bounded_arithmetic.1): file ppl_c_implementation_common.defs.hh
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:26
+ +0000
+
+2008-09-30 Tuesday 18:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.73): In the ascii dump/load methods, do
+ also deal with private fields `initialized' and `pricing'.
+
+2008-09-30 Tuesday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: stdiobuf.cc (1.2), stdiobuf.defs.hh (1.2),
+ stdiobuf.inlines.hh (1.2): Interface separated from
+ implementation.
+
+2008-09-30 Tuesday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/stdiobuf.cc (bounded_arithmetic.1): file stdiobuf.cc was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/stdiobuf.inlines.hh (bounded_arithmetic.1): file
+ stdiobuf.inlines.hh was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh (1.6),
+ src/Makefile.am (1.187), src/stdiobuf.cc (1.1),
+ src/stdiobuf.defs.hh (1.1), src/stdiobuf.inlines.hh (1.1),
+ src/stdiobuf.types.hh (1.1): New standard solution for the
+ ppl_*_ascii_load() functions in the C interface. (The stdiobuf
+ class has been implemented by Abramo Bagnara.)
+
+2008-09-30 Tuesday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/stdiobuf.types.hh (bounded_arithmetic.1): file
+ stdiobuf.types.hh was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 17:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/README.gprolog (1.4): Revised the section
+ on configuring the PPL for building the GNU Prolog interface.
+
+2008-09-30 Tuesday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.27): Invoke test02() and test03()
+ with DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT.
+
+2008-09-30 Tuesday 13:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh, Determinate.inlines.hh, Makefile.am,
+ Partially_Reduced_Product.defs.hh,
+ Partially_Reduced_Product.templates.hh, Powerset.defs.hh,
+ Powerset.templates.hh, Variable.cc, Variable.defs.hh,
+ Variable.templates.hh
+ (generalized_streams.[2,2,2,2,2,2,2,1,2,1]): Templatization
+ continued.
+
+2008-09-30 Tuesday 12:56 Abramo Bagnara
+
+ * src/: Linear_Row.cc, MIP_Problem.cc, Ph_Status.cc,
+ Poly_Con_Relation.cc, Poly_Gen_Relation.cc, Polyhedron_public.cc,
+ Row.cc, Variables_Set.cc (generalized_streams.[1,1,1,1,1,1,1,1]):
+ Missing templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:48 Abramo Bagnara
+
+ * src/: Linear_System.cc, Matrix.cc (generalized_streams.[1,1]):
+ Missing templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:43 Abramo Bagnara
+
+ * src/Interval.defs.hh (generalized_streams.3): Added explicit
+ cast.
+
+2008-09-30 Tuesday 12:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: SICStus/Makefile.am (1.97), SWI/Makefile.am
+ (1.97), XSB/Makefile.am (1.76): the copying and removing of
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl is made
+ conditional on whether or not the build is in the source
+ directory.
+
+2008-09-30 Tuesday 12:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.templates.hh, Interval.defs.hh, Interval.inlines.hh,
+ Interval.templates.hh (generalized_streams.[2,2,2,2]): Fixed more
+ template parameter lists.
+
+2008-09-30 Tuesday 12:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh, BD_Shape.templates.hh, Box.defs.hh,
+ Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Checked_Number.templates.hh, DB_Matrix.defs.hh,
+ DB_Matrix.templates.hh, Interval_Info.defs.hh,
+ Interval_Restriction.defs.hh, OR_Matrix.defs.hh,
+ OR_Matrix.templates.hh, Octagonal_Shape.defs.hh,
+ Octagonal_Shape.templates.hh, checked_ext.inlines.hh
+ (generalized_streams.[2,2,2,2,2,2,2,2,2,2,2,3,2,2,2]): Fixed
+ several template parameter lists.
+
+2008-09-30 Tuesday 12:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.templates.hh (generalized_streams.2): Template
+ parameters lists reordered.
+
+2008-09-30 Tuesday 12:12 Abramo Bagnara
+
+ * src/: Any_Pointset.defs.hh, Ask_Tell.defs.hh,
+ Ask_Tell.inlines.hh, Ask_Tell.templates.hh, BDS_Status.idefs.hh,
+ BDS_Status.inlines.hh, BD_Shape.defs.hh, BD_Shape.inlines.hh,
+ BD_Shape.templates.hh, Bit_Matrix.cc, Bit_Matrix.defs.hh,
+ Bit_Row.defs.hh, Box.defs.hh, Box.templates.hh,
+ Box_Status.idefs.hh, Box_Status.inlines.hh,
+ Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Checked_Number.templates.hh, Coefficient.defs.hh, Congruence.cc,
+ Congruence.defs.hh, Congruence_System.cc,
+ Congruence_System.defs.hh, Constraint.cc, Constraint.defs.hh,
+ Constraint_System.cc, Constraint_System.defs.hh,
+ DB_Matrix.defs.hh, DB_Matrix.inlines.hh, DB_Matrix.templates.hh,
+ DB_Row.inlines.hh, Determinate.defs.hh, Determinate.inlines.hh,
+ Generator.cc, Generator.defs.hh, Generator.inlines.hh,
+ Generator_System.cc, Generator_System.defs.hh, Grid.defs.hh,
+ Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+ Grid_Status.cc, Grid_Status.idefs.hh, Grid_public.cc, checked.cc,
+ checked_ext.defs.hh, checked_ext.inlines.hh
+ (generalized_streams.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ More templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh, Interval.defs.hh, Interval.inlines.hh,
+ Interval.templates.hh, Interval_Info.defs.hh,
+ Interval_Info.inlines.hh, Interval_Restriction.defs.hh,
+ Linear_Row.defs.hh, Linear_System.defs.hh, MIP_Problem.defs.hh,
+ Matrix.defs.hh, OR_Matrix.defs.hh, OR_Matrix.templates.hh,
+ Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh,
+ Og_Status.idefs.hh, Og_Status.inlines.hh,
+ Partially_Reduced_Product.defs.hh,
+ Partially_Reduced_Product.inlines.hh,
+ Partially_Reduced_Product.templates.hh, Ph_Status.idefs.hh,
+ Pointset_Ask_Tell.defs.hh, Pointset_Ask_Tell.templates.hh,
+ Pointset_Powerset.defs.hh, Pointset_Powerset.templates.hh,
+ Poly_Con_Relation.defs.hh, Poly_Gen_Relation.defs.hh,
+ Polyhedron.defs.hh, Powerset.defs.hh, Powerset.templates.hh,
+ Row.defs.hh, Variable.defs.hh, Variables_Set.defs.hh
+ (generalized_streams.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ More templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh, Linear_Expression.cc,
+ Linear_Expression.defs.hh, Linear_Expression.inlines.hh,
+ Linear_Expression.templates.hh, Makefile.am, globals.defs.hh
+ (generalized_streams.[1,1,1,1,1,1,1]): Templatization of input
+ and output methods started.
+
+2008-09-30 Tuesday 11:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/: Makefile.am (1.24),
+ Parma_Polyhedra_Library_test1.java (1.1): Added tests for the
+ Parma Polyhedra Library methods.
+
+2008-09-30 Tuesday 11:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/README.gprolog (1.3): Added a (draft) note
+ on configuring for the GNU Prolog interface.
+
+2008-09-30 Tuesday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.17): On the Itanium, this test
+ fails because of the bug reported in //
+ http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012943.html
+
+2008-09-30 Tuesday 09:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.26): Expected results for test02()
+ and test03() fixed.
+
+2008-09-30 Tuesday 08:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.39),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.12): Re-enable the approximate_partition method.
+
+ Correct the m4 generating code for linear_partition and
+ approximate_partition so that the method is only generated when
+ the appropriate powerset domain is in the instantiations..
+
+2008-09-30 Tuesday 08:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/MIP_Problem_test1.java (1.2): Comment
+ corrected.
+
+2008-09-30 Tuesday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.25): Comments improved.
+
+2008-09-30 Tuesday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.19): Missing #else's added.
+
+2008-09-30 Tuesday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am (1.5): Fixed AM_CPPFLAGS.
+
+2008-09-30 Tuesday 00:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.38): Commented out line
+ ppl_ at CLASS@_approximate_ at PARTITION@/5 +grid, It was breaking the
+ buid in the Java interface, since it requires that
+ Pointset_Powerset_Grid is enabled too.
+
+2008-09-29 Monday 23:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/containsintegerpoint1.cc (1.7): Corrected expected
+ result.
+
+2008-09-29 Monday 23:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (1.8): Corrected
+ knwon result for test03.
+
+2008-09-29 Monday 22:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am (1.4): Unused definition commented
+ out.
+
+2008-09-29 Monday 22:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/Makefile.am (1.3): Trailing backslash removed.
+
+2008-09-29 Monday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/: Makefile.am (1.2), cxxoutput.c (1.5),
+ ppl_test.h (1.1): Adde ppl_test.h, now only providing some
+ facilities to control the noisiness of tests.
+
+2008-09-29 Monday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.78): Include <cstdlib> for getenv().
+
+2008-09-29 Monday 22:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.20),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.11), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.47): Updated the partition method headers and tests so that
+ the schema procedure name and code use the new pattern to match
+ that in the procedure schema list.
+
+2008-09-29 Monday 22:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: jni/ppl_java_common.cc (1.48),
+ jni/ppl_java_globals.cc (1.21), tests/MIP_Problem_test1.java
+ (1.1), tests/Makefile.am (1.23): Added tests for the MIP_Problem
+ class and methods.
+
+ Corrected some bugs in the same class.
+
+2008-09-29 Monday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh (1.5),
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.19), interfaces/Java/jni/ppl_java_common.cc (1.47),
+ interfaces/Java/jni/ppl_java_globals.cc (1.20),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.54),
+ interfaces/Prolog/ppl_prolog_common.cc (1.8),
+ interfaces/Prolog/Ciao/ciao_cfli.hh (1.7),
+ interfaces/Prolog/Ciao/ciao_efli.cc (1.5),
+ interfaces/Prolog/SICStus/sicstus_efli.cc (1.4),
+ src/Congruence.cc (1.21): The construct s.str().c_str(), where
+ `s' is an std::ostringstream, is extremely dangerous. In fact,
+ the compiler can (and does!) destruct the temporary std::string
+ object returned by str() as soon as c_str() returns, which
+ results into a dangling pointer. This construct is now avoided.
+
+2008-09-29 Monday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.61): Activated the `tests'
+ subdirectory.
+
+2008-09-29 Monday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/cxxoutput.c (1.4): DIMENSION and line lengths
+ increased.
+
+2008-09-29 Monday 21:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.28), src/Bit_Row.defs.hh (1.11): In order
+ to use GMP from C++, always include <gmpxx.h>, not <gmp.h>.
+
+2008-09-29 Monday 21:03 Abramo Bagnara
+
+ * interfaces/C/tests/: cxxoutput.c (1.3), print_to_buffer.cc (1.3):
+ Fixed c_str() use.
+
+2008-09-29 Monday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.defs.hh (1.4):
+ Temporarily inhibited DEFINE_ASCII_DUMP_LOAD_FUNCTIONS.
+
+2008-09-29 Monday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/cxxoutput.c (1.2): Test with a higher
+ dimension. Handle the case where malloc() returns 0.
+
+2008-09-29 Monday 18:30 Abramo Bagnara
+
+ * interfaces/C/tests/print_to_buffer.cc (1.2): Fixed corner case.
+
+2008-09-29 Monday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.376), configure.repo (1.9),
+ interfaces/C/tests/Makefile.am (1.1),
+ interfaces/C/tests/cxxoutput.c (1.1),
+ interfaces/C/tests/print_to_buffer.cc (1.1),
+ interfaces/C/tests/print_to_buffer.h (1.1): Drafted a new test
+ for the C interface, showing how to print a nice debugging output
+ onto a malloc-allocated buffer. (The wrap_to_buffer() routine in
+ print_to_buffer.cc has been written by Abramo Bagnara.)
+
+2008-09-29 Monday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/Makefile.am (1.30): Do create
+ ppl_prolog_generated_test.stamp.
+
+2008-09-29 Monday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/.cvsignore (1.1): Put under CVS control.
+
+2008-09-29 Monday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/tests/.cvsignore (bounded_arithmetic.1): file
+ .cvsignore was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:27 +0000
+
+2008-09-29 Monday 16:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.265): Item revised.
+
+2008-09-29 Monday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.264): Pushed an item to PPL 0.11 or later version.
+
+2008-09-29 Monday 15:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.16): The Alpha is no longer
+ special, as far as this test is concerned.
+
+2008-09-29 Monday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.15): Use
+ PPL_CXX_SUPPORTS_LIMITING_MEMORY.
+
+2008-09-29 Monday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.375), configure.repo (1.8): Use
+ AC_CXX_SUPPORTS_LIMITING_MEMORY.
+
+2008-09-29 Monday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_limit_memory.m4 (1.1): New function to check whether it
+ is possible to limit the memory available to processes using
+ setrlimit().
+
+2008-09-29 Monday 11:49 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (1.57): Fixed typo.
+
+2008-09-29 Monday 09:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.18): Avoid testing with non
+ supported floating point types.
+
+2008-09-29 Monday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/affinepreimage1.cc (1.25),
+ BD_Shape/containsintegerpoint1.cc (1.6), BD_Shape/maxspacedim1.cc
+ (1.6), Octagonal_Shape/affinepreimage1.cc (1.8),
+ Octagonal_Shape/containsintegerpoint1.cc (1.7),
+ Octagonal_Shape/maxspacedim1.cc (1.6): Avoid using non supported
+ floating point types.
+
+2008-09-29 Monday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.24): Generalized so as to avoid
+ using non supported floating point types.
+
+2008-09-29 Monday 09:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.33),
+ Java/jni/ppl_java_common.cc (1.46),
+ Java/jni/ppl_java_common.defs.hh (1.2),
+ Java/jni/ppl_java_globals.cc (1.19),
+ Java/parma_polyhedra_library/Control_Parameter_Name.java (1.1),
+ Java/parma_polyhedra_library/Control_Parameter_Value.java (1.1),
+ Java/parma_polyhedra_library/MIP_Problem.java (1.3),
+ Java/parma_polyhedra_library/Makefile.am (1.9),
+ OCaml/ppl_interface_generator_ocaml_mli.m4 (1.20),
+ OCaml/ppl_ocaml_common.cc (1.4), OCaml/ppl_ocaml_globals.ml
+ (1.12), OCaml/ppl_ocaml_types.ml (1.13), OCaml/tests/test1.ml
+ (1.14),
+ Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.5), Prolog/ppl_prolog_common.cc (1.7),
+ Prolog/ppl_prolog_common.defs.hh (1.7),
+ Prolog/Ciao/ciao_pl_check.pl (1.29), Prolog/XSB/xsb_pl_check.P
+ (1.35), Prolog/tests/pl_check.pl (1.58): The new methods for
+ MIP_Problem for the control_parameters now added to the Java,
+ OCaml and Prolog interfaces.
+
+ Tests for these methods for the OCaml and Prolog interfaces
+ added.
+
+ Added a new macro to ppl_interface_generator_common.m4 that finds
+ the difference of two sequences - as yet unused.
+
+2008-09-29 Monday 09:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.18): Corrected schema names for the partition methods and
+ fixed a bug in the code for approximate_partition.
+
+2008-09-29 Monday 08:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (1.7): Test 09 overflows with 64
+ bit integers too.
+
+2008-09-28 Sunday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.17): Improved check_distance().
+
+2008-09-28 Sunday 17:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (1.6): Modified known results of
+ tests 05 and 08; for test 05, modified feasible region so as to
+ have a unique optimal solution.
+
+2008-09-28 Sunday 17:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.13): Minor modification to
+ the feasible region for test06 so as to have a unique optimal
+ solution.
+
+2008-09-28 Sunday 17:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.16): Avoid a division-by-zero error when
+ printing +inf in check_distance.
+
+2008-09-28 Sunday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.72): The MIP solver no longer depends on
+ the set of floating point types that are fully supported by the
+ PPL.
+
+2008-09-28 Sunday 15:04 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.101), Checked_Number.inlines.hh
+ (1.83): Reverted operator/assign specializations removal.
+
+2008-09-28 Sunday 14:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (1.10): Work around
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661.
+
+2008-09-28 Sunday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.374), configure.repo (1.7): Avoid unsupported
+ instantiations.
+
+2008-09-28 Sunday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/user-foreign-language-interface.doxyconf.in (1.3): Corrected
+ value for configuration variable EXPAND_AS_DEFINED.
+
+2008-09-28 Sunday 12:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.81): Corrected dependencies for the C
+ documentation.
+
+2008-09-28 Sunday 12:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: C_interface.dox (1.12), ppl_c_header.h (1.7),
+ ppl_interface_generator_c_h.m4 (1.24),
+ ppl_interface_generator_c_h_code.m4 (1.44): Added brief
+ descriptions for the generated interfaces when building the
+ configuration-dependent documentation. Reorganized the
+ preprocessor macros for IO operators (they now come in two
+ version, with and without brief documentation).
+
+2008-09-28 Sunday 12:02 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.100), Checked_Number.inlines.hh
+ (1.82): Reverted illegal code simplification.
+
+2008-09-28 Sunday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (1.10): Test only with the supported
+ floating point types.
+
+2008-09-28 Sunday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: FCAIBVP.cc (1.7), FCAIBVP.defs.hh (1.7),
+ FCAIBVP.inlines.hh (1.7), FCAIBVP.types.hh (1.4), Makefile.am
+ (1.271), Partial_Function.cc (1.8), Partial_Function.defs.hh
+ (1.6), Partial_Function.inlines.hh (1.5),
+ Partial_Function.types.hh (1.4), ppl_test.cc (1.15), ppl_test.hh
+ (1.77), print.cc (1.30), print.hh (1.47): Test stuff reorganized.
+
+2008-09-28 Sunday 10:56 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.99), src/Checked_Number.inlines.hh
+ (1.81), src/Interval.defs.hh (1.58), src/checked.defs.hh (1.46),
+ src/checked.inlines.hh (1.44), src/checked_ext.inlines.hh (1.42),
+ src/checked_float.inlines.hh (1.90), src/checked_int.inlines.hh
+ (1.68), src/checked_mpq.inlines.hh (1.47),
+ src/checked_mpz.inlines.hh (1.56), tests/ppl_test.cc (1.14):
+ Abstracted special values to avoid use of native floating point
+ types when they are unuseable.
+
+2008-09-27 Saturday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (1.18): Reject instantiations using unsupported
+ floating point types.
+
+2008-09-27 Saturday 20:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.13): In the C interface, also enabled the @BINMINOP@ methods
+ (deprecated, but still here for backward compatibility with 0.9).
+
+2008-09-27 Saturday 19:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: Java/ppl_interface_generator_java_dox_code.m4 (1.4),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.17),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.10), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.53),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.48),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.39),
+ OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.15):
+ For the Java and OCaml interfaces, get rid of useless templates
+ for the add_ at REPRESENT@(s)_and_minimize and the @BINMINOP@
+ operators (these are deprecated and only kept for the C
+ interface).
+
+2008-09-27 Saturday 19:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.12): Re-enable the add_..._and_minimize methods for the C
+ interface.
+
+2008-09-27 Saturday 13:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.52): Bug
+ whereby the code for the BHZ03 widening for the powerset domains
+ was not being generated for the C interface fixed.
+
+2008-09-27 Saturday 12:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.37): Reenable the partition methods for the interfaces.
+
+2008-09-27 Saturday 12:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.80): More corrections for the clean targets.
+
+2008-09-27 Saturday 10:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.79): Corrected typo whereby the core user and
+ devref html docs were not cleaned up.
+
+2008-09-27 Saturday 09:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.90): Changes
+ that should have been included in previous commit.
+
+2008-09-27 Saturday 09:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.36): Disabled the generation of
+ [linear,approximated]_partition code, as it was breaking the
+ build.
+
+2008-09-27 Saturday 08:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.60): Reverted previous change, as it
+ breaks the build.
+
+2008-09-27 Saturday 00:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.35),
+ C/ppl_interface_generator_c_cc_code.m4 (1.51),
+ C/ppl_interface_generator_c_h_code.m4 (1.43),
+ Java/ppl_interface_generator_java_dox_code.m4 (1.3),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.16),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.9), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.46), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.52),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.47),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.38),
+ OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.14),
+ Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.14),
+ Prolog/ppl_interface_generator_prolog_dox_code.m4 (1.4),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.12),
+ Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.4): Fixed a problem in the code generation for
+ linear_partition and approximate_partition.
+
+ This problem occurred in the Prolog interfaces when the list of
+ instantiations did not include Pointset_Powerset<NNC_Polyhedron>
+ and/or Pointset_Powerset<Grid>.
+
+ Note that each of the Prolog systems generates
+ headers/declarations for every instance of every active schema in
+ the procedure list. Therefore if the code is not required
+ because the set of instantiations does not include
+ Pointset_Powerset<NNC_Polyhedron> (resp.,
+ Pointset_Powerset<Grid>) we have also to ensure that the
+ header/declaration is not generated.
+
+2008-09-26 Friday 23:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/Makefile.am (1.59): Corrected a file name and
+ removed unnecessary repetitions.
+
+2008-09-26 Friday 18:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (1.42): Added
+ \relates Doxygen commands to the function declaration templates.
+
+2008-09-26 Friday 18:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (1.23): Use m4 macro
+ m4_pre_extra_class_code to introduce the name of the interface in
+ the Doxygen configuration-dependent manuals.
+
+2008-09-26 Friday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.11): Documented conversion
+ constructors taking a complexity class as argument.
+
+2008-09-26 Friday 15:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: OCaml/ppl_ocaml_common.cc (1.3),
+ Prolog/ppl_prolog_common.cc (1.6),
+ Prolog/ppl_prolog_common.defs.hh (1.6): Added minimal explanation
+ for functions and variables that are commented out via (trivial)
+ preprocessing conditionals. Similar stuff grouped together, so as
+ to also minimize the number of conditionals.
+
+2008-09-26 Friday 13:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.templates.hh (1.131), MIP_Problem.cc (1.71),
+ OR_Matrix.inlines.hh (1.11), Octagonal_Shape.templates.hh (1.90),
+ Polyhedron_public.cc (1.143): Added a few missing comments to
+ preprocessing conditionals. Removed a few lines of (old, ad-hoc,
+ debugging related, no longer working) code that was already
+ filtered away by a preprocessing conditional.
+
+2008-09-26 Friday 12:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.3): Commented test, uncommented.
+
+2008-09-26 Friday 11:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.89): Enable
+ omega_reduce() in all the interfaces for the powerset domains.
+
+2008-09-26 Friday 11:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.15): When translating a C++ std::pair object into a Java Pair
+ object, avoid useless copies of the pair elements (use swaps
+ instead).
+
+2008-09-26 Friday 11:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/difference1.cc (1.8): Enabled test15 (that was
+ witnessing a bug, now corrected).
+
+2008-09-26 Friday 11:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/difference1.cc (bounded_arithmetic.1): file
+ difference1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:38 +0000
+
+2008-09-26 Friday 11:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.130): Corrected a bug (spotted by Pat) on
+ the difference_assign method.
+
+2008-09-26 Friday 11:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/difference1.cc (1.7): Added commented test that shows
+ an assertion failure.
+
+2008-09-26 Friday 10:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.10): Added hand-crafted
+ documentation for the ad-hoc types and functions provided by
+ Pointset_Powerset.
+
+2008-09-26 Friday 10:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.34),
+ C/ppl_interface_generator_c_cc_code.m4 (1.50),
+ C/ppl_interface_generator_c_h_code.m4 (1.41),
+ C/ppl_interface_generator_c_procedure_generators.m4 (1.11),
+ Java/ppl_interface_generator_java_dox_code.m4 (1.2),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.14),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.8), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.45), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.51),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.46),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.37),
+ OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.6), OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (1.13), Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.13),
+ Prolog/ppl_interface_generator_prolog_dox_code.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.11),
+ Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.2): Completed the code and main changes needed for
+ linear_partition and approximate_partition in all the interfaces.
+
+ Now the methods' classes are always simple and the partition is
+ always in the Pointset_Powerset<NNC_Polyhedron> (if the domain is
+ not Grid) or Pointset_Powerset<Grid> for the grid domain.
+
+ Simple tests for these new methods added for the different
+ interfaces.
+
+2008-09-26 Friday 00:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.33): Disable linear_partition methods again until the Prolog
+ tests have been adapted.
+
+2008-09-25 Thursday 23:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.32),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.13),
+ Java/tests/ppl_java_tests_common (1.16): Allow for changes to
+ linear_partition in Java. Simplified the coefficients in the
+ tests so as to avoid an unintended overflow exception.
+
+2008-09-25 Thursday 23:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.12): Implemented ppl_ at CLASS@_linear_partition/4,
+ distinguishing the polyhedron and the non-polyhedron cases.
+
+2008-09-25 Thursday 23:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.10): Added declaration for ppl_ at CLASS@_linear_partition/4.
+
+2008-09-25 Thursday 19:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.31): The method schema just added for linear_partiton,
+ commented out as this broke the build of the prolog interface.
+
+2008-09-25 Thursday 18:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.30),
+ C/ppl_interface_generator_c_cc_code.m4 (1.49),
+ C/ppl_interface_generator_c_h_code.m4 (1.40),
+ Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.12),
+ Java/jni/ppl_interface_generator_java_classes_cc_files.m4 (1.7),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.7), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.44), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.50),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.45),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.36),
+ Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.11),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.9): Started
+ changes for linear_partition in the interfaces so that its class
+ is that of its arguments and the 1st argument of the returned
+ pair. The schema for this is called ppl_ at CLASS@_linear_partition
+ to avoid confusion with the old schema ppl_ at CLASS@_ at PARTITION@.
+
+2008-09-25 Thursday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_java_classes_cc_files.m4 was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-09-25 Thursday 18:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h (1.6): Use alias \extref instead of
+ \ref when referring to external documentation (i.e., the core
+ manuals) so that tag files will work for HTML and no error is
+ obtained in LaTeX.
+
+2008-09-25 Thursday 18:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (1.22): Disabled
+ Doxygen grouping in the generated code.
+
+2008-09-25 Thursday 18:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.78): Added a few missing dependencies.
+ Restored a few calls to ocamldoc, so as to produce ocamldoc.sty
+ (to be re-checked).
+
+2008-09-25 Thursday 12:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.48),
+ ppl_interface_generator_c_h_code.m4 (1.39): Added more methods to
+ the C interface code.
+
+2008-09-25 Thursday 12:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: C_interface.dox (1.9), ppl_c_header.h (1.5),
+ ppl_c_version.h.in (1.9): Exploit the \interface Doxygen command
+ in combination with \relates so as to group related types and
+ functions in the C interface documentation. Striclty speaking,
+ an (opaque) C structure tag is not an interface ... but for our
+ purposes it behaves as if it was.
+
+2008-09-25 Thursday 10:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+ (1.19), ppl_interface_generator_java_test_java_code.m4 (1.43),
+ ppl_java_tests_common (1.15): Test generation improved,
+ simplified and comments added. Code for generating tests
+ improved and each test is independent from the others. For the
+ generated code, all but one method is now tested. Note that much
+ of the fixed code such as for the MIP domain is not yet tested.
+
+2008-09-25 Thursday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.77): The ocamldoc tool should be only invoked
+ when building the configuration-dependent documentation.
+
+2008-09-25 Thursday 00:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.29),
+ Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.4): Restore the "and_minimize" predicates disabled in the
+ previous commit for the Prolog interfaces as otherwise the tests
+ in pl_check.pl. clpq.pl and clpq2.pl will not compile.
+
+2008-09-25 Thursday 00:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.88),
+ ppl_interface_generator_common_procedure_generators.m4 (1.28),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.49),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.44),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.35): Disable
+ all the "and_minimize" methods in all the interfaces.
+
+ Ensure that linear_partition method is only used if the
+ Pointset_Powerset<NNC_Polyhedron> is one of the instantiations.
+
+ Add the OCaml code for "approximate_partition" in the Grid
+ domain.
+
+ Note that tests for both linear_partition and
+ approximate_partition still to be added.
+
+2008-09-24 Wednesday 22:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.76): Expanded and reorganized the set of
+ documentation targets. We now support targets whose name
+ specifies for whom to produce (user/devref) and the desired
+ format (html, pdf, ps). For instance, we have targets such as
+ `user-html', `user-pdf', `devref-ps', etc. Targets `user' and
+ `devref' produce all three formats. Adding the word `configured'
+ (e.g., user-configured-html or devref-configured) allows for
+ building configuration dependent docs for the foreign language
+ intefaces; targets user-all and devref-all produce both the
+ configuration dependent and the configuration-independent
+ manuals. Target `world' produces all kind of manuals (as
+ before).
+
+2008-09-24 Wednesday 21:26 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.48), ppl_interface_generator_ocaml_ml_code.m4 (1.43),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.34): Fixed the
+ return value in ppl_ at CLASS@_OK and
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign. Added code for
+ ppl_ at CLASS@_ at PARTITION@ but has still to be tested.
+
+2008-09-24 Wednesday 18:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.89): Spacing fixed.
+
+2008-09-24 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc (1.18): Typo fixed.
+
+2008-09-24 Wednesday 17:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ ppl_interface_generator_java_procedure_generators.m4 (1.9),
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.11),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.42),
+ tests/ppl_java_tests_common (1.14): Schematic tests in m4 will
+ generate tests for all Java interface methods. A couple of bugs
+ in the code generator file
+ jni/ppl_interface_generator_java_classes_cc_code.m4 fixed.
+
+2008-09-24 Wednesday 13:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.10),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.41),
+ tests/ppl_java_tests_common (1.13): Fixed a bug in the Java
+ interface cpde for the get_minimized methods. Added tests for
+ swap and get_minimized. Added the congruences2 variable to the
+ common code.
+
+2008-09-24 Wednesday 12:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.9),
+ tests/ppl_interface_generator_java_test_java.m4 (1.18),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.40):
+ Corrected a bug when building from a grid_generator_system.
+
+ Each method test has its own block, allowing for local variables.
+ Each method test outputs a message and after checking the main
+ domain element using OK(), outputs "success" if OK() succeeds.
+
+ Added a few tests for constructing a domain element.
+
+ Any procedure schemas not defined at all will now cause a warning
+ message on standard output. Hence dummy definitions have been
+ added for the procedure schemas that have no tests.
+
+2008-09-24 Wednesday 11:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/Makefile.am (1.29): Removed an unused
+ definition.
+
+2008-09-24 Wednesday 09:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.96): Corrected typo in name
+ of distributed file.
+
+2008-09-24 Wednesday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.35): Use the PPL_SUPPORTED_* macros in
+ order to check whether particular floating point types are
+ supported.
+
+2008-09-24 Wednesday 08:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.70): Temporarily, if doubles are
+ unavailable use floats, if floats are unavailable use long
+ doubles.
+
+2008-09-24 Wednesday 08:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.75): Added missing dependency and corrected
+ doxygen input file for Java devref.
+
+2008-09-24 Wednesday 08:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/Makefile.am (1.28): Corrected typo in
+ dependency name.
+
+2008-09-23 Tuesday 22:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/Makefile.am (1.27): Generated tests are
+ now removed by makeclean.
+
+2008-09-23 Tuesday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.263): Added one item for PPL 0.11.
+
+2008-09-23 Tuesday 21:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/difference1.cc (1.6): Completed a comment for test14.
+
+2008-09-23 Tuesday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float_binary_format.m4 (1.9): Test strengthened to
+ check also a couple of denormal values.
+
+2008-09-23 Tuesday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.373), configure.repo (1.6): New Autoconf variable
+ `required_instantiations_prolog_generated_test_sources'.
+
+2008-09-23 Tuesday 20:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/difference1.cc (1.5): Print statements improved.
+
+2008-09-23 Tuesday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_ieee_inexact_flag.m4 (1.4): Cater for the case where
+ the FE_INEXACT macro is undefined. This should fix the bug
+ described in
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=499746.
+
+2008-09-23 Tuesday 20:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.129): Box<ITV>::difference_assign(const
+ Box&) slightly optimized.
+
+2008-09-23 Tuesday 19:36 Abramo Bagnara
+
+ * tests/Box/difference1.cc (1.4): test14 does not fail now.
+
+2008-09-23 Tuesday 19:34 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.42): Added missing clear.
+
+2008-09-23 Tuesday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/difference1.cc (1.3): Print statements of test14()
+ revised.
+
+2008-09-23 Tuesday 18:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/Makefile.am (1.26): Corrected the name of
+ a test file.
+
+2008-09-23 Tuesday 18:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.82), GNU/Makefile.am
+ (1.78), SICStus/Makefile.am (1.96), SWI/Makefile.am (1.95),
+ XSB/Makefile.am (1.75),
+ XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 (1.2),
+ YAP/Makefile.am (1.67), tests/Makefile.am (1.25): Try to follow
+ the standards for the makefiles. Fixed a bug in
+ XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+2008-09-23 Tuesday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_xsb_prolog_generated_test_P.m4 was added
+ on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-09-23 Tuesday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+ (bounded_arithmetic.1): file ppl_prolog_generated_test_common.pl
+ was added on branch bounded_arithmetic on 2008-10-29 20:45:33
+ +0000
+
+2008-09-23 Tuesday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
+ (bounded_arithmetic.1): file sp_prolog_generated_test.pl was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-09-23 Tuesday 17:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.81),
+ Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.10),
+ Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+ (1.1), SICStus/Makefile.am (1.95), SICStus/sp_predicate_check.pl
+ (1.10), SICStus/sp_prolog_generated_test.pl (1.1),
+ SWI/Makefile.am (1.94), SWI/swi_predicate_check.pl (1.8),
+ SWI/swi_prolog_generated_test.pl (1.1), XSB/Makefile.am (1.74),
+ XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.11),
+ XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 (1.1),
+ tests/Makefile.am (1.24),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.83),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.37),
+ tests/ppl_interface_generator_prolog_generated_test_pl.m4 (1.1),
+ tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+ (1.1), tests/ppl_predicate_check_common.pl (1.13),
+ tests/ppl_prolog_generated_test_common.pl (1.1): Renamed the
+ predicate_check generated test files to have the form
+ ppl_prolog_generated_test_<...>.xx The generating files and
+ common files renamed similarly.
+
+2008-09-23 Tuesday 16:45 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.47), ppl_interface_generator_ocaml_ml_code.m4 (1.42),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.33),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.12):
+ 'ascii_dump' added to OCaml interface.
+
+2008-09-23 Tuesday 12:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/: directproduct1.cc (1.4),
+ directproduct2.cc (1.3), directproduct3.cc (1.4): Cleaned several
+ tests.
+
+2008-09-23 Tuesday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/difference1.cc (1.2): New test14 shows a bug in
+ difference_assign()
+
+2008-09-23 Tuesday 10:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.88): Corrected bug in
+ minimized_congruences, spotted by test09 in congruences1.cc.
+
+2008-09-23 Tuesday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/congruences1.cc (1.6): New test shows a bug
+ in minimized_congruences (spotted by Pat).
+
+2008-09-23 Tuesday 08:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-foreign-language-interface.doxyconf.in (1.3),
+ interfaces-html.sed (1.2), interfaces-latex.sed (1.2),
+ user-foreign-language-interface.doxyconf.in (1.2): Avoid a
+ Doxygen error for inexistent tagfile when building the LaTeX
+ docs.
+
+2008-09-22 Monday 21:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.64): Distribute all files needed
+ for the generation of Prolog_interface.dox.
+
+2008-09-22 Monday 20:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.74): Corrected a couple of typos.
+
+2008-09-22 Monday 20:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am (1.22): Call libtool when
+ compiling NNC_Polyhedron_test1.
+
+2008-09-22 Monday 20:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.27): CLEANFILES moved out of
+ conditional.
+
+2008-09-22 Monday 20:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.23): Target Java_interface.dox
+ placed out of #if BUILD_JAVA_INTERFACE conditional and listed in
+ dist_noinst_DATA.
+
+2008-09-22 Monday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.63): BUILT_SOURCES must contain
+ ppl_prolog_domains.cc.stamp.
+
+2008-09-22 Monday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.62): Actually build
+ ppl_prolog_domains.cc.stamp.
+
+2008-09-22 Monday 17:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.87),
+ Prolog/Makefile.am (1.61),
+ Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.10),
+ Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.9): The file
+ ppl_prolog_domains.cc is not needed. Ensure that in the
+ generated tests a powerset of grids is built by default from
+ congruences and not constraints. This fixes a bug when testing
+ ppl_predicate_check_test for the Pointset_Powerset_Grid domain.
+
+2008-09-22 Monday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_ieee_inexact_flag.m4 (1.3): Made consistent with our
+ code for controlling the FPUs.
+
+2008-09-22 Monday 16:07 Andrea Cimino
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.8): Apply the previous fix also in the jni directory. Now the
+ `make check' should pass.
+
+2008-09-22 Monday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.372), configure.repo (1.5),
+ interfaces/Prolog/Makefile.am (1.60): Avoid wildcard characters
+ in *CLEANFILES variables.
+
+2008-09-22 Monday 14:41 Andrea Cimino
+
+ * interfaces/Java/:
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.6), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.39): Use DISJUNCT instead of CPP_DISJUNCT where appropriate.
+ Now the Java interface compiles with --enable-instantiations=all
+
+2008-09-22 Monday 14:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Makefile.am (1.59): Revised the organisation of
+ the Makefile so that Prolog_interfaces.dox is built outside the
+ #if BUILD_* conditional. Removed Prolog_interfaces.dox from the
+ BUILT_SOURCES and included them with dist_noinst_DATA. Use
+ CLEANFILES instead of DISTCLEANFILES for all files built with
+ make all.
+
+2008-09-22 Monday 13:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.46), ppl_interface_generator_ocaml_ml_code.m4 (1.41),
+ ppl_interface_generator_ocaml_mli.m4 (1.19),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.32),
+ ppl_ocaml_common.cc (1.2), ppl_ocaml_common.defs.hh (1.2),
+ ppl_ocaml_types.ml (1.12),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.11): Added
+ functions:
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity,
+ ppl_ at CLASS@_widening_assign,
+ ppl_ at CLASS@_widening_assign_with_tokens.
+
+ Added the Complexity_Class type.
+
+ Added tests to test these. Also added tests to test the
+ unconstrain(s) methods.
+
+2008-09-22 Monday 13:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.defs.hh (bounded_arithmetic.1):
+ file ppl_ocaml_common.defs.hh was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-22 Monday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.7),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.5), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.38): Added/enabled methods:
+
+ unconstrain_space_dimension_code,
+ unconstrain_space_dimensions_code,
+ BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign,
+ BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign,
+ approximate_partition.
+
+ and the relevant tests.
+
+2008-09-22 Monday 11:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.73): ALso distribute interfaces-html.sed and
+ interfaces-latex.sed.
+
+2008-09-22 Monday 09:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Makefile.am (1.58): Restore
+ Prolog_interface.dox as a built source to ensure the file is
+ generated before building the documentation.
+
+2008-09-22 Monday 08:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_classes_cc_files.m4 (1.6),
+ ppl_java_globals.cc (1.18): Include "ppl_java_common.defs.hh"
+
+2008-09-22 Monday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/: Makefile.am (1.26),
+ ppl_interface_generator_java_classes_cc_code.m4 (1.6),
+ ppl_java_common.cc (1.45), ppl_java_common.defs.hh (1.1),
+ ppl_java_common.hh (1.41), ppl_java_common.inlines.hh (1.1):
+ Splitted ppl_java_common.hh. Made several improvements (but many
+ FIXMEs remain).
+
+2008-09-21 Sunday 23:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Makefile.am (1.57): Missing separator added.
+
+2008-09-21 Sunday 23:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.56),
+ ppl_interface_generator_prolog_dox.m4 (1.4): Changed so that
+ there are no unnecessary dependencies on the
+ ppl_interface_instantiations when generating the documentation.
+
+2008-09-21 Sunday 22:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.86): Revised
+ so as to allow for the documentation not to include
+ ppl_interface_instantiations.m4.
+
+2008-09-21 Sunday 22:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: Makefile.am (1.22),
+ ppl_interface_generator_java_dox.m4 (1.3): Avoid unnecessary
+ dependency on the generated ppl_interface_instantiations.m4
+
+2008-09-21 Sunday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.371), configure.repo (1.4): Fixed the
+ implementation of `--enable-instantiations=all'.
+
+2008-09-21 Sunday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.29): Improved the explanation on how to use
+ the `configure.repo' files.
+
+2008-09-21 Sunday 21:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.21): Java_interface.dox should not
+ belong to BUILT_SOURCES.
+
+2008-09-21 Sunday 17:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.72): Also clean LaTeX header files for
+ configurated interfaces.
+
+2008-09-21 Sunday 17:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: Makefile.am (1.71), devref-foreign-language-interface.tex
+ (1.2), user-foreign-language-interface.tex (1.2): Added missing
+ replacement targets for sed in the devref LaTeX header file.
+ Added a new replacement for \usepackage{ocamldoc}.
+
+2008-09-21 Sunday 17:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.70): Further targets added to build
+ configuration-dependent foreign language interface docs.
+
+2008-09-21 Sunday 15:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frombox1.cc (1.7): Print also the constraints of `src'
+ in test05().
+
+2008-09-21 Sunday 15:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-foreign-language-interface.doxyconf.in (1.2): The
+ latex header file is in the build dir, not in the source dir.
+
+2008-09-21 Sunday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.370), configure.repo (1.3), doc/Makefile.am
+ (1.69), doc/devref-c-interface.doxyconf-html.in (1.8),
+ doc/devref-c-interface.doxyconf-latex.in (1.8),
+ doc/devref-c-interface.tex (1.6),
+ doc/devref-foreign-language-interface.doxyconf.in (1.1),
+ doc/devref-foreign-language-interface.tex (1.1),
+ doc/devref-java-interface.doxyconf-html.in (1.5),
+ doc/devref-java-interface.doxyconf-latex.in (1.5),
+ doc/devref-java-interface.tex (1.3),
+ doc/devref-ocaml-interface.doxyconf-html.in (1.4),
+ doc/devref-ocaml-interface.doxyconf-latex.in (1.4),
+ doc/devref-ocaml-interface.tex (1.2),
+ doc/devref-prolog-interface.doxyconf-html.in (1.10),
+ doc/devref-prolog-interface.doxyconf-latex.in (1.10),
+ doc/devref-prolog-interface.tex (1.2), doc/interfaces-html.sed
+ (1.1), doc/interfaces-latex.sed (1.1),
+ doc/user-c-interface.doxyconf-html.in (1.9),
+ doc/user-c-interface.doxyconf-latex.in (1.9),
+ doc/user-c-interface.tex (1.6),
+ doc/user-foreign-language-interface.doxyconf.in (1.1),
+ doc/user-foreign-language-interface.tex (1.1),
+ doc/user-java-interface.doxyconf-html.in (1.5),
+ doc/user-java-interface.doxyconf-latex.in (1.5),
+ doc/user-java-interface.tex (1.3),
+ doc/user-ocaml-interface.doxyconf-html.in (1.3),
+ doc/user-ocaml-interface.doxyconf-latex.in (1.3),
+ doc/user-ocaml-interface.tex (1.2),
+ doc/user-prolog-interface.doxyconf-html.in (1.9),
+ doc/user-prolog-interface.doxyconf-latex.in (1.10),
+ doc/user-prolog-interface.tex (1.6): The doxygen configuration
+ files and LaTeX headers for the foreign language interface
+ manuals are now automatically generated from 4 template files and
+ 2 sed script files (plus Makefile.am machinery). The overall
+ infrastructure can be extended so as to generate both
+ configuration independent and configuration dependent manuals.
+
+2008-09-21 Sunday 12:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/ppl_java_tests_common (1.12): Change a
+ coefficient from 3 to 2 to avoid an unintended overflow.
+
+2008-09-21 Sunday 07:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.inlines.hh (1.3):
+ Indentation fixed.
+
+2008-09-21 Sunday 07:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.12): Fixed.
+
+2008-09-20 Saturday 23:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/ppl_java_tests_common (1.11): Coefficients
+ simplified to avoid unintended overflow errors.
+
+2008-09-20 Saturday 21:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.85): Comment
+ corrected.
+
+2008-09-20 Saturday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.28): Added a new section on "Using the CVS
+ Sources". In particular, explained how it is possible to
+ dispense with the use of Autoconf exploiting the presence of
+ `configure.repo' in the repository (suggestion by Basile
+ Starynkevitch).
+
+2008-09-20 Saturday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.369), configure.repo (1.2): Missing double quote
+ added.
+
+2008-09-20 Saturday 20:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.84),
+ Java/ppl_interface_generator_java_dox.m4 (1.2),
+ Prolog/ppl_interface_generator_prolog_dox.m4 (1.3): Ensure that
+ the documentation generators do not include the
+ ppl_interface_instantiations.m4 file.
+
+2008-09-20 Saturday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.368), configure.repo (1.1), Watchdog/configure.ac
+ (1.49), Watchdog/configure.repo (1.1): Capitalization fixed.
+
+2008-09-20 Saturday 20:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/NEWS (1.11): Set a tentative release date.
+
+2008-09-20 Saturday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.235): Set a tentative release date.
+
+2008-09-20 Saturday 20:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.48): We do not need the `win32-dll'
+ Libtool option.
+
+2008-09-20 Saturday 20:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.367): Long lines avoided.
+
+2008-09-20 Saturday 20:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.366): Computation of the set of all
+ instantiations made independent from the default instantiations.
+
+2008-09-20 Saturday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.365): Useless work avoided.
+
+2008-09-20 Saturday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.53): Updated.
+
+2008-09-20 Saturday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.364): Version number bumped.
+
+2008-09-20 Saturday 20:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.47): Punctuation improved. Require
+ Autoconf 2.60 or later.
+
+2008-09-20 Saturday 20:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.363): Comments improved.
+
+2008-09-20 Saturday 20:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.362): Punctuation fixed.
+
+2008-09-20 Saturday 19:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.30), Watchdog/ChangeLog (1.19): Updated.
+
+2008-09-20 Saturday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_check_ciao.m4 (1.2), ac_check_fpu_control.m4 (1.7),
+ ac_check_gmp.m4 (1.27), ac_check_swi_prolog.m4 (1.16),
+ ac_cxx_double_binary_format.m4 (1.10),
+ ac_cxx_float_binary_format.m4 (1.8),
+ ac_cxx_long_double_binary_format.m4 (1.9),
+ ac_cxx_proper_long_double.m4 (1.4), ac_cxx_remainder_bug.m4
+ (1.5), ppl.m4 (1.10), ppl_c.m4 (1.3): For portability, prefer
+ exit() to returns from main().
+
+2008-09-20 Saturday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_ieee_inexact_flag.m4 (1.2): Test improved: it did not
+ work with optimizations turned on, it did not test with doubles
+ and long doubles, and it triggered a compiler warning.
+
+2008-09-20 Saturday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.11): Now test01() must always
+ succeed, as it takes into account that an overflow can occur
+ before the timeout with 8-bit coefficients.
+
+2008-09-20 Saturday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_classes_cc_files.m4 (1.5),
+ ppl_java_common.cc (1.44), ppl_java_common.hh (1.40),
+ ppl_java_globals.cc (1.17): The Java interface implementation now
+ lives in its own namespace.
+
+2008-09-20 Saturday 12:55 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.45), ppl_interface_generator_ocaml_ml_code.m4 (1.40),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.31),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.10):
+ Restored ppl_ at CLASS@_ at UB_EXACT@.
+
+2008-09-20 Saturday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc (1.4),
+ interfaces/C/ppl_c_implementation_common.defs.hh (1.3),
+ interfaces/C/ppl_c_implementation_common.inlines.hh (1.2),
+ interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.13),
+ interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.8),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.10), interfaces/Prolog/ppl_prolog_common.cc (1.5),
+ interfaces/Prolog/ppl_prolog_common.defs.hh (1.5),
+ interfaces/Prolog/Ciao/ciao_efli.cc (1.4),
+ interfaces/Prolog/Ciao/ciao_efli.hh (1.3),
+ interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.2),
+ interfaces/Prolog/GNU/gprolog_efli.cc (1.4),
+ interfaces/Prolog/GNU/gprolog_efli.hh (1.2),
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.2),
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.2),
+ interfaces/Prolog/SICStus/sicstus_efli.cc (1.3),
+ interfaces/Prolog/SICStus/sicstus_efli.hh (1.2),
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/SWI/swi_efli.cc (1.4),
+ interfaces/Prolog/SWI/swi_efli.hh (1.5),
+ interfaces/Prolog/XSB/ppl_prolog_sysdep.hh (1.3),
+ interfaces/Prolog/XSB/xsb_efli.cc (1.5),
+ interfaces/Prolog/XSB/xsb_efli.hh (1.2),
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.2),
+ interfaces/Prolog/YAP/yap_efli.cc (1.2),
+ interfaces/Prolog/YAP/yap_efli.hh (1.2), src/namespaces.hh
+ (1.15): The Interfaces namespace is now structured.
+
+2008-09-20 Saturday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.hh (bounded_arithmetic.1): file
+ ciao_efli.hh was added on branch bounded_arithmetic on 2008-10-29
+ 20:45:32 +0000
+
+2008-09-20 Saturday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_implementation_common.cc
+ (bounded_arithmetic.1): file ppl_c_implementation_common.cc was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-09-20 Saturday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_c_cc_files.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-09-20 Saturday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-09-20 Saturday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.361): Conditionals improved.
+
+2008-09-20 Saturday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.18): When
+ PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG evaluates to false,
+ fpu_reset_inexact() does nothing and fpu_check_inexact() returns
+ -1 ("don't know").
+
+2008-09-20 Saturday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.58): Do not distribute ppl_c.h.
+
+2008-09-20 Saturday 09:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.360), interfaces/C/Makefile.am (1.57): The C
+ interface can only be enabled if Perl is available.
+
+2008-09-20 Saturday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am (1.8): Clean
+ also the class files.
+
+2008-09-20 Saturday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.359): New variable to collect the names of all
+ the instantiations-dependent Java class files. Several sed
+ patterns improved.
+
+2008-09-20 Saturday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/: Makefile.am (1.4),
+ asciidumpload1.cc (1.3): Write and clean ascii_dump_load1.dat.
+
+2008-09-20 Saturday 07:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (1.9): Let test01() depend on
+ PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG.
+
+2008-09-19 Friday 23:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.358): For testing purpose, we now accept also the
+ `--enable-instantiations=all' configure option. (Currently this
+ shows that our m4 code does not scale.)
+
+2008-09-19 Friday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (1.17): Accept also the native floating point types as
+ valid instances for bounded-difference and octagonal shapes.
+
+2008-09-19 Friday 22:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/Makefile.am (1.56), Java/jni/Makefile.am (1.25),
+ OCaml/Makefile.am (1.54), Prolog/Ciao/Makefile.am (1.80),
+ Prolog/GNU/Makefile.am (1.77), Prolog/SICStus/Makefile.am (1.94),
+ Prolog/SWI/Makefile.am (1.93), Prolog/XSB/Makefile.am (1.73),
+ Prolog/YAP/Makefile.am (1.66): Many more interface instantiations
+ are now allowed.
+
+2008-09-19 Friday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_cfli.hh (1.6): Added one missing
+ inline qualifier. Static variable avoided.
+
+2008-09-19 Friday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.357): Check whether the IEEE inexact flag is
+ supported in C++.
+
+2008-09-19 Friday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_ieee_inexact_flag.m4 (1.1): New function to check
+ whether the IEEE inexact flag is supported and available to C++
+ programs.
+
+2008-09-19 Friday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_remainder_bug.m4 (1.4): Indentation fixed.
+
+2008-09-19 Friday 20:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.356): The library now has file pathnames longer
+ than 99 characters, which implies we can no longer use the old V7
+ tar format. We thus pass the `tar-ustar' option to
+ AM_INIT_AUTOMAKE, which specifies using the ustar tar format
+ defined by POSIX 1003.1-1988. Consequently, we require Automake
+ at least version 1.9 (the `tar-ustar' option was not available in
+ previous releases).
+
+2008-09-19 Friday 19:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.55): Distribute also ppl_c_header.h.
+
+2008-09-19 Friday 19:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.5),
+ parma_polyhedra_library/Complexity_Class.java (1.1),
+ parma_polyhedra_library/Makefile.am (1.7),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.4), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.37): New Complexity_Class object that enumerates the different
+ complexities.
+
+ Added a method for building an object from another object
+ possibly from anothe class with the complexity specified.
+
+ Tests for this added.
+
+2008-09-19 Friday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Complexity_Class.java
+ (bounded_arithmetic.1): file Complexity_Class.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-19 Friday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.79): Define
+ libppl_ciao_la_DEPENDENCIES.
+
+2008-09-19 Friday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.78): Fixed the definition
+ of AM_CPPFLAGS.
+
+2008-09-19 Friday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.1): Put under CVS
+ control.
+
+2008-09-19 Friday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.cc (1.3): Include
+ "ppl_prolog_common.defs.hh".
+
+2008-09-19 Friday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.hh (1.2): Declaration fixed.
+
+2008-09-19 Friday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_efli.cc (1.2): Removed useless PPL::
+ qualifications.
+
+2008-09-19 Friday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: ciao_efli.cc (1.1), ciao_efli.hh (1.1),
+ ppl_ciao.cc (1.54): New files ciao_efli.hh and ciao_efli.cc
+ replace ppl_ciao.cc.
+
+2008-09-19 Friday 17:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: expected_clpq2_int16_a (1.5),
+ expected_clpq2_int8_a (1.7), expected_pchk_int16_a (1.8): Updated
+ expected results for 8 and 16 bit coefficients with assertions
+ enabled.
+
+2008-09-19 Friday 16:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: expected_clpq2_int16 (1.5),
+ expected_clpq2_int8 (1.7), expected_pchk_int16 (1.8): Fixed
+ expected results for 8 and 16 bit coefficient configurations.
+
+2008-09-19 Friday 16:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh (1.14): Fixed another
+ uninitialization error for the pricing method.
+
+2008-09-19 Friday 16:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+ (1.9), ppl_interface_generator_prolog_cc_files.m4 (1.9),
+ ppl_interface_generator_prolog_hh_files.m4 (1.8): Added debugging
+ macro to indicate if any predicate schematic code is missing.
+ Improved a cooment.
+
+2008-09-19 Friday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.355): Enabled all default instantiations.
+ Version number bumped.
+
+2008-09-19 Friday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (1.5): Use the exact
+ steepest-edge pricing rule on test06: this allows for obtaining
+ deterministic overflow behavior when configured to use 8-bit
+ checked integers.
+
+2008-09-19 Friday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.53),
+ ppl_interface_generator_ocaml_cc.m4 (1.12),
+ ppl_interface_generator_ocaml_cc_code.m4 (1.44),
+ ppl_interface_generator_ocaml_cc_files.m4 (1.3),
+ ppl_interface_generator_ocaml_hh_code.m4 (1.3),
+ ppl_interface_generator_ocaml_hh_files.m4 (1.2),
+ ppl_interface_generator_ocaml_ml.m4 (1.17), ppl_ocaml_globals.cc
+ (1.19): The OCaml interface now supports separate compilation.
+
+2008-09-19 Friday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ocaml_cc_files.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ocaml_hh_files.m4 was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 14:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc (1.9): No longer using deprecated
+ methods (*_and_minimize). Test 04, which before was known to
+ overflow when using 8 bit coefficients with assertions enabled,
+ now always succeeds.
+
+2008-09-19 Friday 14:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.inlines.hh (1.19): Avoid a warning when
+ assertions are disabled.
+
+2008-09-19 Friday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.354): Added new variables for the OCaml
+ interface.
+
+2008-09-19 Friday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_ocaml_common.cc (1.1),
+ ppl_ocaml_common.defs.hh (1.1), ppl_ocaml_common.inlines.hh
+ (1.1): New files implementing the domain-independent part of the
+ OCaml interface.
+
+2008-09-19 Friday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_common.inlines.hh
+ (bounded_arithmetic.1): file ppl_ocaml_common.inlines.hh was
+ added on branch bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 13:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16_a (1.10), expected_int32_a
+ (1.11), expected_int64_a (1.11), expected_int8_a (1.9): Updated
+ expected results for bounded integers and assertions enabled.
+
+2008-09-19 Friday 13:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/:
+ ppl_interface_generator_java_procedure_generators.m4 (1.8),
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.4),
+ jni/ppl_interface_generator_java_classes_cc_files.m4 (1.4),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.4),
+ parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.3), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.36), tests/ppl_java_tests_common (1.10): Added m4 debug code
+ so as to output a message if the definition of a schematic
+ procedure is missing.
+
+ Added code for several missing methods: add_disjunct
+ widening_assign @EXTRAPOLATION at _extrapolation_assign
+
+ Corrected a bug in the code for
+ @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign where the
+ arguments were inconsistently ordered.
+
+ Added several tests for the widening and extrapolation code.
+
+2008-09-19 Friday 12:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz (1.16): Expected results for
+ unbounded integers and assertions disabled.
+
+2008-09-19 Friday 12:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.47), expected_int16 (1.11),
+ expected_int32 (1.12), expected_int64 (1.12), expected_int8
+ (1.10): Modified the check command so as to solve test problems
+ using a deterministic pricing policy, as to obtain more
+ predictable results across architectures. Updated the expected
+ results for bounded-size coefficient configurations (with
+ assertions disabled).
+
+2008-09-19 Friday 10:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.79): Added new option -p,
+ controlling the selection of the pricing method for the simplex
+ computation.
+
+2008-09-19 Friday 10:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c_header.h (1.4),
+ ppl_c_implementation_common.cc (1.3): In the MIP_Problem section
+ of the interface, added values corresponding to the control
+ parameter setting and interfaced the new methods to get/set the
+ control parameters.
+
+2008-09-19 Friday 10:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: MIP_Problem.cc (1.69), MIP_Problem.defs.hh (1.38),
+ MIP_Problem.inlines.hh (1.18), MIP_Problem.templates.hh (1.13):
+ Added public enums Control_Parameter_Name and
+ Control_Parameter_Value: for the time being, the only control
+ parameter name is PRICING for the pricing method, which can be
+ set to three values. Added public methods for getting/setting a
+ control parameter value. Modified the implementation so as to
+ compute the simplex by using the pricing method specified by the
+ control parameter settings.
+
+ As for implementation, we temporarily use a
+ Control_Parameter_Value variable (named `pricing') to store the
+ singleton control parameter collection. It is planned that this
+ will be replaced by a bitset-based status word encoding, besides
+ possible other control parameters, also the values of `status',
+ `initialized' and `opt_mode'.
+
+2008-09-19 Friday 10:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.83): Fixed a
+ bug so as to avoid generating spurious blank lines.
+
+2008-09-18 Thursday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.3): Added missing copyright notices.
+
+2008-09-18 Thursday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am (1.6):
+ Several kludges removed.
+
+2008-09-18 Thursday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+ (1.3): Fixed the spacing in the generated files.
+
+2008-09-18 Thursday 21:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.43), ppl_interface_generator_ocaml_ml_code.m4 (1.39),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.30): Added dummy
+ code defining macro ppl_ at CLASS@_ at UB_EXACT@_code to all the
+ "_code" files to avoid a warning.
+
+2008-09-18 Thursday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Makefile.am (1.5):
+ Useless conditional removed.
+
+2008-09-18 Thursday 21:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc (1.16): Code formatting
+ improved.
+
+2008-09-18 Thursday 21:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+ (1.3): Removed spurious blank line.
+
+2008-09-18 Thursday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/Makefile.am (1.54), Java/jni/Makefile.am (1.24),
+ Java/parma_polyhedra_library/Makefile.am (1.4), OCaml/Makefile.am
+ (1.52): Standardize the handling of timestamps.
+
+2008-09-18 Thursday 18:21 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.42), ppl_interface_generator_ocaml_hh_code.m4 (1.2),
+ ppl_interface_generator_ocaml_ml.m4 (1.16),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.38),
+ ppl_interface_generator_ocaml_mli.m4 (1.18),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.29),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.9),
+ tests/test1.ml (1.13): Types `c_polyhedron' and `nnc_polyhedron'
+ are now merged in the new type `polyhedron' in the OCaml
+ interface. All the methods concerning c_polyhedron and
+ nnc_polyhedron has been renamed for consistency with the other
+ interfaces. ppl_ at CLASS@_ at UB_EXACT@_code disabled.
+
+2008-09-18 Thursday 17:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.5): Test 9 fails on 8
+ bit integers.
+
+2008-09-18 Thursday 16:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.78): Use maximize_with_point() and
+ minimize_with_point() when wanting the point returned.
+
+2008-09-18 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.89): FIXME text made more
+ precise.
+
+2008-09-18 Thursday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.353): On the Alpha, use the `-mieee-with-inexact'
+ GCC option (`-ieee_with_inexact' for other compilers) in order to
+ maintain the IEEE inexact-flag.
+
+2008-09-18 Thursday 13:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc.m4 (1.11),
+ ppl_interface_generator_ocaml_cc_code.m4 (1.41),
+ ppl_interface_generator_ocaml_cc_files.m4 (1.2),
+ ppl_interface_generator_ocaml_ml.m4 (1.15),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.37),
+ ppl_interface_generator_ocaml_mli.m4 (1.17),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.28): As for the C
+ interface, the m4 generating code outputs a warning message if
+ any code is missing for each schematic procedure that is not
+ defined.
+
+2008-09-18 Thursday 13:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (1.21): Outout the
+ copyright notice in ppl_c_domains.h.
+
+2008-09-18 Thursday 12:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.352), interfaces/Java/jni/Makefile.am (1.23),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.15),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.58), interfaces/Java/parma_polyhedra_library/Makefile.am
+ (1.3): The Java interface now uses separate compileation (some
+ file-renaming is still pending though).
+
+2008-09-18 Thursday 12:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.47),
+ ppl_interface_generator_c_cc_files.m4 (1.12),
+ ppl_interface_generator_c_h.m4 (1.20),
+ ppl_interface_generator_c_h_code.m4 (1.38),
+ ppl_interface_generator_c_procedure_generators.m4 (1.10): Added a
+ debugging macro that outputs a warning message if there are
+ undefined procedure code macros to each of the m4 generating
+ files. If a procedure macro is known to be missing or unwanted
+ for the C interface, then an empty definition must be included in
+ the code files to prevent the m4 debugging message.
+
+ Missing code and headers in the C interface for several
+ procedures has been added to the "_code" files.
+
+ Some comments improved.
+
+2008-09-18 Thursday 09:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/: Makefile.am (1.70), join1.cc (1.20), join2.cc
+ (1.16), upperbound1.cc (1.1), upperbound2.cc (1.1): Tests join1/2
+ renamed upperbound1/2.
+
+2008-09-18 Thursday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/upperbound1.cc (bounded_arithmetic.1): file
+ upperbound1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/upperbound2.cc (bounded_arithmetic.1): file
+ upperbound2.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 09:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/join2.cc (1.15): Avoid using
+ upper_bound_assign_and_minimize(); remove duplicated tests.
+
+2008-09-18 Thursday 09:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/upperbound1.cc (1.2): Avoid using
+ upper_bound_assign_and_minimize().
+
+2008-09-18 Thursday 09:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/upperbound1.cc (bounded_arithmetic.1): file
+ upperbound1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:37 +0000
+
+2008-09-18 Thursday 08:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: append1.cc (1.15), append2.cc (1.14),
+ exceptions1.cc (1.18), exceptions2.cc (1.15), nncminimize1.cc
+ (1.10), permute.cc (1.12), polyhull2.cc (1.15): Avoid using
+ upper_bound_assign_and_minimize().
+
+2008-09-18 Thursday 08:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c_header.h (1.3),
+ ppl_c_implementation_common.defs.hh (1.2): Added declaration and
+ (tentative) definition of ascii_load functions: implementation is
+ based on __gnu_cxx::stdio_sync_filebuf.
+
+2008-09-18 Thursday 08:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/affineimage2.cc (1.14): Do not use
+ upper_bound_assign_and_minimize.
+
+2008-09-18 Thursday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/difference1.cc (bounded_arithmetic.1): file
+ difference1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:39 +0000
+
+2008-09-18 Thursday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/upperbound1.cc (bounded_arithmetic.1): file
+ upperbound1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:39 +0000
+
+2008-09-18 Thursday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/upperbound1.cc (bounded_arithmetic.1): file
+ upperbound1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.78), BD_Shape/bdsdifference1.cc
+ (1.20), BD_Shape/bdshull1.cc (1.21), BD_Shape/difference1.cc
+ (1.1), BD_Shape/upperbound1.cc (1.1), Box/Makefile.am (1.72),
+ Box/boxdifference1.cc (1.12), Box/boxhull1.cc (1.10),
+ Box/difference1.cc (1.1), Box/upperbound1.cc (1.1),
+ Octagonal_Shape/Makefile.am (1.32),
+ Octagonal_Shape/difference1.cc (1.1),
+ Octagonal_Shape/octdifference1.cc (1.7),
+ Octagonal_Shape/octhull1.cc (1.9), Octagonal_Shape/upperbound1.cc
+ (1.1): Test programs renamed so as to match the name of the
+ tested method.
+
+2008-09-18 Thursday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/difference1.cc (bounded_arithmetic.1): file
+ difference1.cc was added on branch bounded_arithmetic on
+ 2008-10-29 20:45:37 +0000
+
+2008-09-17 Wednesday 17:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.355), src/Polyhedron.inlines.hh
+ (1.151), tests/Polyhedron/polyhull1.cc (1.15),
+ tests/Polyhedron/polyhull2.cc (1.14): Removed the method
+ upper_bound_assign_and_minimize().
+
+2008-09-17 Wednesday 17:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.354): The method topology() is no
+ longer public.
+
+2008-09-17 Wednesday 17:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.8): Use new function for interfaces to test if the Polyhedron
+ is necessarily closed in the code for
+ ppl_Polyhedron_upper_bound_assign_if_exact/2..
+
+2008-09-17 Wednesday 17:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.46),
+ ppl_interface_generator_c_h_code.m4 (1.37): The headers and the
+ code for upper_bound_assign_if_exact() are now generated and bugs
+ fixed so that they compile.
+
+2008-09-17 Wednesday 17:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.13): Modified
+ test01() so as to restore the original variables' output
+ function. Added test02().
+
+2008-09-17 Wednesday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.262): Added one item for PPL 0.10.
+
+2008-09-17 Wednesday 16:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.45): No
+ longer using Polyhedron::topology() to query for topology of a
+ Polyhedron; use new function
+ Interfaces::is_necessarily_closed_for_interfaces.
+
+2008-09-17 Wednesday 16:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.353): Temporarily let topology() be
+ public again.
+
+2008-09-17 Wednesday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.352), Polyhedron.inlines.hh (1.150):
+ Befriend new function
+ Interfaces::is_necessarily_closed_for_interfaces().
+
+2008-09-17 Wednesday 15:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/namespaces.hh (1.14): Added namespace for C++ functions
+ dedicated to foreign language interfaces.
+
+2008-09-17 Wednesday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.27): Updated the documentation about using
+ the Intel C/C++ compiler.
+
+2008-09-17 Wednesday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.4): Use better
+ variable names and avoid variable shadowing.
+
+2008-09-17 Wednesday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.149): Avoid unnecessary opening and
+ closing of namespaces.
+
+2008-09-17 Wednesday 13:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (1.8): Use refine_with rather than add for constructing domains.
+
+2008-09-17 Wednesday 13:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: Makefile.am (1.51),
+ ppl_interface_generator_ocaml_cc.m4 (1.10),
+ ppl_interface_generator_ocaml_cc_code.m4 (1.40),
+ ppl_interface_generator_ocaml_cc_files.m4 (1.1),
+ ppl_interface_generator_ocaml_hh_code.m4 (1.1),
+ ppl_interface_generator_ocaml_hh_files.m4 (1.1): Enable the
+ generation of files for separate compilation. The code in
+ ppl_interface_generator_ocaml_cc_code.m4 has been separated into
+ the access code that is now in
+ ppl_interface_generator_ocaml_hh_code.m4 and the rest that
+ defines the schematic methods for all the domains.
+
+2008-09-17 Wednesday 13:02 Andrea Cimino
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_classes_cc_code.m4 (1.2),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.57), jni/ppl_java_common.cc (1.43), jni/ppl_java_common.hh
+ (1.39), parma_polyhedra_library/PPL_Object.java (1.3),
+ tests/ppl_interface_generator_java_test_java.m4 (1.17),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.35): The
+ Java interfaces uses now marked pointers to detect if a C++
+ object should be deleted. Added some tests to test get_disjunct,
+ needed to check the code described above.
+
+2008-09-17 Wednesday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.3): Added new test
+ (the one showing a bug in current cloog-ppl implementation of
+ cloog_domain_simplify).
+
+2008-09-17 Wednesday 10:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.11): Added
+ the generation for the inclusion of "interfaced_boxes.hh".
+
+2008-09-17 Wednesday 10:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.10):
+ Redundant code removed.
+
+2008-09-17 Wednesday 10:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.82): The
+ pattern "box" for bounding and covering boxes was unused;
+ removed..
+
+2008-09-17 Wednesday 09:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.34): Added the dependency of
+ ppl_interface_instantiations.m4 from Makefile; the former listed
+ in CLEANFILES (not DISTCLEANFILES).
+
+2008-09-17 Wednesday 09:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh (1.29): Avoid unnecessary opening and closing
+ of namespaces.
+
+2008-09-17 Wednesday 09:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+ (1.2): Cut-and-paste typo fixed in names of generated files.
+
+2008-09-17 Wednesday 09:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/: Makefile.am (1.22),
+ ppl_interface_generator_java_classes_cc_code.m4 (1.1),
+ ppl_interface_generator_java_classes_cc_files.m4 (1.1): Build
+ separate implementation files for each domains.
+
+2008-09-17 Wednesday 07:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (1.8): Restored a test that was
+ temporarily commented out.
+
+2008-09-16 Tuesday 20:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.82): Ensure the generated tests work for C_Polyhedron x Grid
+ product domains (checked using constraints_reduction)..
+
+2008-09-16 Tuesday 18:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.9): The upper_bound_assign_if_exact methods are now
+ interfaced.
+
+2008-09-16 Tuesday 18:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.44),
+ ppl_interface_generator_c_h_code.m4 (1.36): Minor correction to
+ the declaration of the powerset object for begin/end
+ const_iterator methods.
+
+2008-09-16 Tuesday 14:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.81),
+ src/Pointset_Powerset.defs.hh (1.53): Corrected a comment in
+ Pointset_Powerset.defs.hh and simplified the generation of the
+ binary operator procedures in the interfaces.
+
+2008-09-16 Tuesday 13:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.80),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.7),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.8), interfaces/Prolog/SICStus/sp_predicate_check.pl (1.9),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.81), src/Grid.inlines.hh (1.28), src/Grid_public.cc (1.87):
+ Moved method add_constraints() from Grid.inlines.hh to
+ Grid_public.cc.
+
+ Removed the bop_assign and bop_assign_and_minimize from the
+ Prolog generated code and inlined the code.
+
+ Enable upper_bound_assign method for the Pointset_Powerset
+ domains in all the interfaces.
+
+ Adapted the tests in the predicate_check generated test file so
+ as to test correctly these changes.
+
+2008-09-16 Tuesday 10:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.43),
+ ppl_interface_generator_c_h_code.m4 (1.35),
+ ppl_interface_generator_c_procedure_generators.m4 (1.8): Separate
+ the new_iterator methods and the type declarations for iterators
+ from the method for checking for equality.
+
+2008-09-16 Tuesday 10:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.42),
+ ppl_interface_generator_c_h_code.m4 (1.34): Added declaration and
+ implementation of `new' functions for Pointset_Powerset
+ iterators.
+
+2008-09-16 Tuesday 09:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (1.27), src/Grid_nonpublic.cc (1.38),
+ src/Grid_public.cc (1.86), tests/Grid/addconstraint1.cc (1.18),
+ tests/Grid/addconstraints1.cc (1.19): Ensure the grid is not
+ marked empty before calling the *_no_check methods. Added tests
+ to check this. Code for several methods concerning adding
+ constraints and congruences moved to the Grid.inlines.cc file.
+
+2008-09-16 Tuesday 08:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.57): Avoid singleton
+ variable warning.
+
+2008-09-16 Tuesday 08:14 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.41): Fixed typo.
+
+2008-09-16 Tuesday 08:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.142): Minor simplification in the
+ control path.
+
+2008-09-16 Tuesday 08:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.169), Octagonal_Shape.inlines.hh
+ (1.40): Avoid a warning.
+
+2008-09-16 Tuesday 01:35 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_globals.cc (1.15): Avoid, when
+ possible, long lines to comply to STANDARDS.
+
+2008-09-16 Tuesday 01:27 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.56),
+ ppl_java_common.cc (1.42), ppl_java_common.hh (1.38),
+ ppl_java_globals.cc (1.14): Let `get_ptr' return a pointer
+ instead of a jlong in order to simplify the implementation of
+ marked pointers.
+
+2008-09-15 Monday 22:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * configure.ac (1.351): Removed a line added in previous commit so
+ as to enable the build.
+
+2008-09-15 Monday 21:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron_public.cc (1.141),
+ tests/Polyhedron/boundedaffineimage1.cc (1.16): Fixed bug shown
+ by test07 in tests/Polyhedron/boundedaffineimage1.cc
+
+2008-09-15 Monday 21:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/boundedaffineimage1.cc (1.15): test07 added that
+ shows an assertion failure in refine_no_check. The call to this
+ test temporarily commented out.
+
+2008-09-15 Monday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.350), interfaces/Prolog/SWI/Makefile.am (1.92):
+ Added missing -dlopen for target predicate_check_test.
+
+2008-09-15 Monday 17:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.55),
+ Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.2), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.34), OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (1.7): Completed changes reported in previous commit.
+
+2008-09-15 Monday 17:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.27), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.41),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.33),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.39),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.36),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (1.27),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.6),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.7),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.8), interfaces/Prolog/SICStus/sp_predicate_check.pl (1.8),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.34),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.80), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+ (1.12), src/Polyhedron.defs.hh (1.351): The method topology()
+ made public.
+
+ The code for upper_bound_assign_if_exact() added to the C
+ interface. The predicates for the same methods in the Prolog
+ interface now no longer need the topology (for the Polyhedron
+ class) in the name.
+
+ The schematic procedure name for these procedures also no longer
+ has the topology and therefore the use of these in the other
+ interfaces (Java and OCaml) has also been adapted.
+
+ Some updating of the Prolog interface files for other recent
+ changes.
+
+2008-09-15 Monday 11:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/propagateconstraints2.cc (1.4): Test known to overflow
+ whe using 16 bit integers. CVS-
+ ----------------------------------------------------------------------
+
+2008-09-15 Monday 10:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.28),
+ XSB/xsb_pl_check.P (1.33),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.79):
+ Ensure predicates such as ppl_set_rounding_for_PPL that are used
+ and tested in pl_check.pl are in the module/import lists for Ciao
+ and XSB. Remove the bounding box predicates that are no longer
+ generated from the same lists.
+
+2008-09-15 Monday 10:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.26),
+ C/ppl_c_implementation_common.cc (1.2),
+ C/ppl_interface_generator_c_cc_code.m4 (1.40),
+ C/ppl_interface_generator_c_h_code.m4 (1.32),
+ C/ppl_interface_generator_c_procedure_generators.m4 (1.7),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.35),
+ Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.5),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.7),
+ Prolog/tests/pl_check.pl (1.56): Remove the procedures
+ new_..._from_bounding_box, new_..._from_covering_box and the
+ get_bounding_box and get_covering_box from the interfaces.
+
+ Bug in the increment/decrement iterator method in the C interface
+ fixed.
+
+2008-09-15 Monday 09:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.39),
+ ppl_interface_generator_c_h_code.m4 (1.31): Fixed some more bugs
+ in the C interface code.
+
+2008-09-15 Monday 08:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.38),
+ ppl_interface_generator_c_h_code.m4 (1.30): Added code for
+ dereferencing the iterator for a pointset_powerset.
+
+2008-09-14 Sunday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.71): Previous changes reverted.
+
+2008-09-14 Sunday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/propagateconstraints2.cc (1.3): Temporarily make sure
+ the test always succeeds.
+
+2008-09-14 Sunday 20:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.70): Completing the change to disable
+ propagateconstraints2.
+
+2008-09-14 Sunday 20:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.69): Temporarily disable test
+ propagateconstraints2.
+
+2008-09-14 Sunday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/tests/ppl_ocaml_tests_common (1.4): Applied
+ minimal changes to let the tests succeed according to the new
+ semantics for constraint/congruence addition.
+
+2008-09-14 Sunday 18:35 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.16),
+ NNC_Polyhedron_test1.java (1.3): Load the library with the
+ correct name.
+
+2008-09-14 Sunday 18:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/tests/:
+ ppl_interface_generator_java_test_java_code.m4 (1.33),
+ ppl_java_tests_common (1.9): Tests adapted to the new semantics
+ of add_constraint(s). SOme variable renamings, so as to
+ "improve" readability.
+
+2008-09-14 Sunday 18:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/refinewithconstraints1.cc (1.6): Test 7 fails on 8 bit
+ integers.
+
+2008-09-14 Sunday 16:43 Andrea Cimino
+
+ * interfaces/Java/ppl_java_common_dox (1.5): The `ppl_' prefix is
+ not used in the name of the methods in the Java interface.
+
+2008-09-14 Sunday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Congruence.java
+ (bounded_arithmetic.1): file Congruence.java was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Generator_System.java
+ (bounded_arithmetic.1): file Generator_System.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+ (bounded_arithmetic.1): file MIP_Problem_Status.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/Variables_Set.java
+ (bounded_arithmetic.1): file Variables_Set.java was added on
+ branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24 Andrea Cimino
+
+ * configure.ac (1.349), interfaces/Java/Makefile.am (1.20),
+ interfaces/Java/jni/Makefile.am (1.21),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.14),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.54), interfaces/Java/jni/ppl_java_common.cc (1.41),
+ interfaces/Java/jni/ppl_java_common.hh (1.37),
+ interfaces/Java/jni/ppl_java_globals.cc (1.13),
+ interfaces/Java/parma_polyhedra_library/By_Reference.java (1.2),
+ interfaces/Java/parma_polyhedra_library/Coefficient.java (1.2),
+ interfaces/Java/parma_polyhedra_library/Congruence.java (1.2),
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Constraint.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Generator.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Generator_System.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+ (1.2), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Makefile.am (1.2),
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+ (1.2), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Pair.java (1.2),
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Variable.java
+ (1.2), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+ (1.2),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.2), interfaces/Java/tests/C_Polyhedron_test1.java (1.15),
+ interfaces/Java/tests/NNC_Polyhedron_test1.java (1.2),
+ interfaces/Java/tests/Test_Partial_Function.java (1.5),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.16): The name of the package of the Java Parma Polyhedra
+ Library interface is now `parma_polyhedra_library'.
+
+2008-09-14 Sunday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc (1.12): The banner now includes the names of all
+ those that appear in the CREDITS file.
+
+2008-09-14 Sunday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.23): Updated.
+
+2008-09-14 Sunday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/parma_polyhedra_library/.cvsignore
+ (bounded_arithmetic.1): file .cvsignore was added on branch
+ bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.348), interfaces/Java/Makefile.am (1.19),
+ interfaces/Java/parma_polyhedra_library/.cvsignore (1.1),
+ interfaces/Java/parma_polyhedra_library/By_Reference.java (1.1),
+ interfaces/Java/parma_polyhedra_library/Coefficient.java (1.1),
+ interfaces/Java/parma_polyhedra_library/Congruence.java (1.1),
+ interfaces/Java/parma_polyhedra_library/Congruence_System.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Constraint.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Constraint_System.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Generator.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Generator_System.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Generator_Type.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+ (1.1), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Makefile.am (1.1),
+ interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+ (1.1), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Pair.java (1.1),
+ interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Partial_Function.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Variable.java
+ (1.1), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+ (1.1),
+ interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+ (1.1): In order to implement the change of the Java package name
+ from `ppl_java' to `parma_polyhedra_library', the contents of
+ directory interfaces/Java/ppl_java has been moved to
+ interfaces/Java/parma_polyhedra_library.
+
+2008-09-14 Sunday 13:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.168): Avoid warning (that was only
+ showing up when assertions are not enabled).
+
+2008-09-14 Sunday 13:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh (1.39): Avoid a warning (that was
+ showing up only when assertions are disabled.
+
+2008-09-14 Sunday 12:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.234), TODO (1.261): Updated.
+
+2008-09-14 Sunday 12:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.79): No
+ longer interfacing methods bds_hull, oct_hull and (Grid) join.
+
+2008-09-14 Sunday 12:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.132), BD_Shape.inlines.hh (1.167),
+ BD_Shape.templates.hh (1.118), Box.defs.hh (1.63), Box.inlines.hh
+ (1.38), Box.templates.hh (1.128), Grid.defs.hh (1.83),
+ Grid.inlines.hh (1.26), Grid_chdims.cc (1.26), Grid_public.cc
+ (1.85), Octagonal_Shape.defs.hh (1.58),
+ Octagonal_Shape.inlines.hh (1.38), Octagonal_Shape.templates.hh
+ (1.87), Polyhedron.defs.hh (1.350), Polyhedron.inlines.hh
+ (1.148): Classes Box, BD_Shape, Octagonal_Shape and Grid no
+ longer provide methods such as bds_hull_*, join_*,
+ bds_difference_* and grid_difference*. The uniformly named
+ methods upper_bound_* and difference_assign should be used
+ instead. For (C and NNC) polyhedra, the poly_hull_* and
+ poly_difference_assign methods have been kept for backward
+ compatibility.
+
+2008-09-14 Sunday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/propagateconstraints2.cc (1.2): Use check_result().
+
+2008-09-14 Sunday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.68), closure1.cc (1.9),
+ propagateconstraints2.cc (1.1): Renamed.
+
+2008-09-14 Sunday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/closure1.cc (1.8): Test program completed and
+ corrected.
+
+2008-09-14 Sunday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc (1.8): Query-replace bug corrected.
+
+2008-09-14 Sunday 11:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boxhull1.cc (1.9): Tests from 1 to 7 re-commented out.
+
+2008-09-14 Sunday 11:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/bdsdifference1.cc (1.19), BD_Shape/bdshull1.cc
+ (1.20), BD_Shape/bhmz05widening1.cc (1.19),
+ BD_Shape/cc76extrapolation1.cc (1.24), BD_Shape/membytes1.cc
+ (1.8), Box/boxdifference1.cc (1.11), Box/boxhull1.cc (1.8),
+ Box/pointsetpowerset1.cc (1.8), Grid/affineimage2.cc (1.15),
+ Grid/griddifference1.cc (1.15), Grid/join1.cc (1.19),
+ Grid/join2.cc (1.14), Grid/membytes1.cc (1.13),
+ Grid/powersetdifference1.cc (1.7), Octagonal_Shape/membytes1.cc
+ (1.8), Octagonal_Shape/octdifference1.cc (1.6),
+ Octagonal_Shape/octhull1.cc (1.8), Polyhedron/affineimage2.cc
+ (1.13), Polyhedron/append1.cc (1.14), Polyhedron/append2.cc
+ (1.13), Polyhedron/bhrz03widening1.cc (1.13),
+ Polyhedron/bhrz03widening3.cc (1.17),
+ Polyhedron/boundedbhrz03extrapolation1.cc (1.12),
+ Polyhedron/dualhypercubes.cc (1.17), Polyhedron/exceptions1.cc
+ (1.17), Polyhedron/exceptions2.cc (1.14), Polyhedron/hybrid.cc
+ (1.7), Polyhedron/linearpartition1.cc (1.16),
+ Polyhedron/membytes1.cc (1.17), Polyhedron/nncminimize1.cc (1.9),
+ Polyhedron/permute.cc (1.11), Polyhedron/polydifference1.cc
+ (1.14), Polyhedron/polydifference2.cc (1.14),
+ Polyhedron/polyhull1.cc (1.14), Polyhedron/polyhull2.cc (1.13),
+ Powerset/pointsetpowerset1.cc (1.2): Do not use
+ [box|bds|oct|poly]_hull_* or join_*; rather, systematically use
+ methods upper_bound_*. Similarly, do not use
+ [...]_difference_assign, prefer difference_assign.
+
+2008-09-14 Sunday 10:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (1.19): Type
+ declarations must be generated before the rest of the code.
+
+2008-09-14 Sunday 10:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.78): The
+ Pointset_Powerset domain does not provide poly_difference_assign.
+
+2008-09-14 Sunday 10:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.cc (1.24), Pointset_Powerset.defs.hh
+ (1.52), Pointset_Powerset.inlines.hh (1.17): The
+ Pointset_Powerset domain should *not* provide a
+ poly_difference_assign method (it provides the difference_assign
+ method).
+
+2008-09-14 Sunday 09:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (1.29): Fixed a
+ bug when building from a C or NNC Polyhedron.
+
+2008-09-14 Sunday 08:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (1.28): Another
+ bug in the schematic code for ppl_c_domains.h fixed.
+
+2008-09-13 Saturday 23:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (1.27): Fixed
+ some bugs in the schematic code.
+
+2008-09-13 Saturday 23:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/pointsetpowerset1.cc (1.5),
+ Octagonal_Shape/mapspacedims1.cc (1.6): Commented-out code
+ removed.
+
+2008-09-13 Saturday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.67), closure1.cc (1.7): Reactivated
+ the closure1.cc test program.
+
+2008-09-13 Saturday 22:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.68): Let the documentation of foreign language
+ interfaces also depend on the Doxygen GPL and GFDL licence files.
+
+2008-09-13 Saturday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.66), interval1.cc (1.7), interval2.cc
+ (1.7): Generalized and reactivated interval1.cc. Removed now
+ redundant interval2.cc.
+
+2008-09-13 Saturday 21:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (1.8): Avoid Doxygen error
+ (adding group "version" to itself).
+
+2008-09-13 Saturday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.65), propagateconstraints1.cc (1.1),
+ refinewithconstraints1.cc (1.5): Tests for
+ Box::propagate_constraints() moved from refinewithconstraints1.cc
+ to new file propagateconstraints1.cc.
+
+2008-09-13 Saturday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/propagateconstraints1.cc (bounded_arithmetic.1): file
+ propagateconstraints1.cc was added on branch bounded_arithmetic
+ on 2008-10-29 20:45:38 +0000
+
+2008-09-13 Saturday 21:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.62), Box.inlines.hh (1.37): Added methods
+ void propagate_constraint(const Constraint&) and void
+ propagate_constraints(const Constraint_System&).
+
+2008-09-13 Saturday 20:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/refinewithcongruences1.cc (1.2): Corrected the
+ expected result of test05: refining a polyhedron with a trivially
+ inconsistent proper congruence is no longer ignored, so that the
+ polyhedron becomes empty.
+
+2008-09-13 Saturday 20:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.349), Polyhedron_nonpublic.cc (1.85),
+ Polyhedron_public.cc (1.140): Private helper method
+ refine_no_check() moved to Polyhedron_nonpublic.cc; also, the
+ method now asserts !marked_empty() instead of checking it. In
+ method add_(recycled)_constraint(s), no longer throwing a
+ topology exception if the added strict inequalities are trivially
+ inconsistent. Removed TODO comments from deprecated methods.
+ Corrected several exception messages for the new refine_with_*
+ methods. In several places, prefer refine_no_check() to
+ add_constraint().
+
+2008-09-13 Saturday 20:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron_chdims.cc (1.50), Polyhedron_widenings.cc
+ (1.68): Prefer add_recycled_constraints() to add_constraints(),
+ when possible.
+
+2008-09-13 Saturday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h (1.2): Cosmetic improvements.
+
+2008-09-13 Saturday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_files.m4 (1.9),
+ ppl_interface_generator_c_h.m4 (1.18),
+ ppl_interface_generator_c_hh_files.m4 (1.7): Improved the
+ generated comments.
+
+2008-09-13 Saturday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.53): List ppl_c.h in BUILT_SOURCES.
+
+2008-09-13 Saturday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.52): Correctly use the *CLEANFILES
+ variables. Use a stamp to produce the domain-dependent C++
+ implementation files.
+
+2008-09-13 Saturday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_header.h (1.1): This is the main file used to
+ build ppl_c.h.
+
+2008-09-13 Saturday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.39): Added a section about "Standards for Writing
+ the Makefile.am Files".
+
+2008-09-13 Saturday 16:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.348), Polyhedron.inlines.hh (1.147):
+ Get rid of methods add_grid_generator(s).
+
+2008-09-13 Saturday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.186): The Any_Pointset class is not ready for
+ distribution: make sure we do not distribute it by mistake.
+
+2008-09-13 Saturday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.347), interfaces/C/Makefile.am (1.51),
+ interfaces/C/ppl_c_implementation.cc (1.4),
+ interfaces/C/ppl_c_implementation.defs.hh (1.5),
+ interfaces/C/ppl_c_implementation.inlines.hh (1.4),
+ interfaces/C/ppl_c_implementation_common.cc (1.1),
+ interfaces/C/ppl_c_implementation_common.defs.hh (1.1),
+ interfaces/C/ppl_c_implementation_common.inlines.hh (1.1),
+ interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.8),
+ interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.6): More
+ code reorganization in the C interface.
+
+2008-09-13 Saturday 15:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/: addconstraint1.cc (1.17), addconstraints1.cc (1.18):
+ Corrected a couple of tests to comply with the new specification
+ of add_constraint(s).
+
+2008-09-13 Saturday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.82), Grid.inlines.hh (1.25),
+ Grid_nonpublic.cc (1.37), Grid_public.cc (1.84): Added private
+ helper methods add_constraint/congruence_no_check and
+ refine_no_check. Adapted to new semantics whereby refining will
+ ignore nontrivial inequalities, whereas adding will throw.
+
+2008-09-13 Saturday 15:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_chdims.cc (1.25): Prefer add_recycle_* to simple add_*.
+
+2008-09-13 Saturday 15:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_widenings.cc (1.19): When possible, prefer
+ add_recycled_congruences to add_congruences.
+
+2008-09-13 Saturday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c_implementation.defs.hh (1.4),
+ ppl_c_implementation.inlines.hh (1.3),
+ ppl_interface_generator_c_cc_code.m4 (1.37): Some code
+ reorganized and comments added.
+
+2008-09-13 Saturday 15:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (1.57): Typo corrected.
+
+2008-09-13 Saturday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.78): Obsolete file removed.
+
+2008-09-13 Saturday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.50),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.16),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.17),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.12),
+ src/Makefile.am (1.185): Use a better machinery to generate
+ ppl_c.h.
+
+2008-09-13 Saturday 11:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: refinewithconstraint1.cc (1.3),
+ refinewithconstraints1.cc (1.4), refinewithconstraints2.cc (1.3):
+ Those tests that were written to check constraint propagation
+ (rather than syntactical refinement) temporarily disabled.
+
+2008-09-13 Saturday 11:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.7): Cleaned
+ generator so that ppl_c_fixed.cc is not generated.
+
+2008-09-13 Saturday 09:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: Makefile.am (1.49),
+ ppl_interface_generator_c_cc.m4 (1.19): We no longer need to
+ generate the file ppl_c.cc.
+
+2008-09-13 Saturday 08:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.346), interfaces/C/Makefile.am (1.48),
+ interfaces/C/ppl_c_implementation.cc (1.3),
+ interfaces/C/ppl_c_implementation.defs.hh (1.3): The C interface
+ is operational again.
+
+2008-09-13 Saturday 07:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.5):
+ Simplified the generation of the files and added extra fixed code
+ to the generated domain files.
+
+2008-09-13 Saturday 07:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.4): More
+ unwanted code in the generated files removed.
+
+2008-09-13 Saturday 07:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.3): Doxygen
+ commenting removed from generated .hh files.
+
+2008-09-13 Saturday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc (1.6): Little adaptation for the systems where
+ mp_limb_t is not a long.
+
+2008-09-12 Friday 23:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.56), Octagonal_Shape.inlines.hh
+ (1.37), Octagonal_Shape.templates.hh (1.86): Added private helper
+ methods refine_no_check() for constraint and congruence.
+
+2008-09-12 Friday 22:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.131), BD_Shape.inlines.hh (1.166),
+ BD_Shape.templates.hh (1.117): Added private helper methods
+ refine_no_check() for constraint and congruence.
+
+2008-09-12 Friday 22:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.6): Revised
+ the domain specific generated files.
+
+2008-09-12 Friday 22:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.2): Removed
+ the preamble from the ppl_c_domains.hh generated file.
+
+2008-09-12 Friday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.345): C interface temporarily removed from the
+ ones built by default.
+
+2008-09-12 Friday 22:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: Makefile.am (1.47),
+ ppl_interface_generator_c_hh_files.m4 (1.1): Generate the header
+ files for the C interface.
+
+2008-09-12 Friday 18:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.344): Define variables for the C interface.
+
+2008-09-12 Friday 18:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: Makefile.am (1.46), ppl_c_implementation.cc (1.2),
+ ppl_c_implementation.defs.hh (1.2),
+ ppl_c_implementation.inlines.hh (1.2): Code reorganized.
+
+2008-09-12 Friday 17:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.55), Octagonal_Shape.inlines.hh
+ (1.36), Octagonal_Shape.templates.hh (1.85): Adapted methods
+ add_constraint/congruences and constructors so as to throw
+ exceptions if faced with something that is nontrivial and not
+ octagonal. Also improved the precision of conversion
+ constructors.
+
+2008-09-12 Friday 17:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.127): Simplified implementation of teh
+ constructor of a Box from a product domain.
+
+2008-09-12 Friday 17:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: congruences1.cc (1.5), membytes1.cc
+ (1.7), octhull1.cc (1.7): Adapted to the new specification of
+ add_constraint/congruence.
+
+2008-09-12 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.5): Amended
+ to include "ppl_c_implementation.defs.hh".
+
+2008-09-12 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.45): Updated the libppl_c_la_*
+ variables.
+
+2008-09-12 Friday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c_implementation.cc (1.1),
+ ppl_c_implementation.defs.hh (1.1),
+ ppl_c_implementation.inlines.hh (1.1): New files containing the
+ domain-independent part of the C interface implementation.
+
+2008-09-12 Friday 14:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: pointsetpowerset2.cc (1.3), unconstrain1.cc (1.2):
+ Fixed a couple of tests.
+
+2008-09-12 Friday 13:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.126): Old implementation for
+ refine_no_check renamed propagate_constraint_no_check. Provided
+ new implementation that just does a syntactic refinement. Avoid
+ code repetitions by calling add_interval_constraint_no_check.
+ When building a Box from a Polyhedron in polynomial time, use the
+ method refine_with_constraints() applied to a simplified copy of
+ the constraints of the polyhedron.
+
+2008-09-12 Friday 13:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.61), Box.inlines.hh (1.36): Added new
+ (private) method add_interval_constraint_no_check, to be used
+ when adding or refining after having checked that the constraint
+ is a non-trivial interval constraint. Removed the comments for
+ several private methods: they had a FIXME, but were anyway
+ misleading; they now have a WRITE ME.
+
+2008-09-12 Friday 13:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.4): Include
+ "#include"'s in all the files.
+
+2008-09-12 Friday 12:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.3): Comment
+ bug fixed.
+
+2008-09-12 Friday 11:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.2): Files
+ names should include "c_".
+
+2008-09-12 Friday 11:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (1.18): Revert
+ previous (unintended) change.
+
+2008-09-12 Friday 11:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: Makefile.am (1.44),
+ ppl_interface_generator_c_cc.m4 (1.17),
+ ppl_interface_generator_c_cc_files.m4 (1.1): New file that
+ generates code that can be split into separate files.
+
+2008-09-12 Friday 10:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.83), tests/Grid/addconstraint1.cc (1.16),
+ tests/Grid/addconstraints1.cc (1.17),
+ tests/Grid/refinewithcongruences1.cc (1.2),
+ tests/Grid/refinewithconstraints1.cc (1.2): When the constraint
+ is an inequality and inconsistent, then adding it to a grid or
+ using it to refine the grid will result in the empty grid.
+
+ Tests added to check this.
+
+2008-09-12 Friday 10:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.233): Mention the renaming of
+ Congruence::is_trivial_true/false methods.
+
+2008-09-12 Friday 10:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.116), src/Box.templates.hh (1.125),
+ src/Congruence.cc (1.20), src/Congruence.defs.hh (1.25),
+ src/Congruence_System.cc (1.30), src/Grid_nonpublic.cc (1.36),
+ src/Grid_public.cc (1.82), src/Octagonal_Shape.templates.hh
+ (1.84), src/Polyhedron_public.cc (1.139),
+ tests/Grid/congruence1.cc (1.20): Methods
+ Congruence::is_trivial_true() and Congruence::is:trivial_false()
+ renamed as Congruence::is_tautological() and
+ Congruence::is_inconsistent(), so as to have a more similar
+ interface wrt class Constraint.
+
+2008-09-12 Friday 08:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.124): Corrected method
+ refine_no_check(const Congruence&) to also consider the case of
+ trivailly true/false congruences. Added a FIXME regarding the
+ handling of proper congruences in the case of bozes based on
+ intervals supportng restrictins.
+
+2008-09-12 Friday 08:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/refinewithcongruences1.cc (1.3): New test04 check for
+ the refinement of a Box using a trivially false congruence.
+
+2008-09-12 Friday 08:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.123): Corrected refine_no_check(const
+ Constraint&) so as to also deal with the case of trivially
+ true/false constraints.
+
+2008-09-12 Friday 01:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: generalizedaffineimage1.cc (1.17),
+ generalizedaffineimage2.cc (1.6): test20 in
+ generalizedaffineimage1.cc removed, as it was identical to test17
+ in generalizedaffineimage2.cc.
+
+2008-09-12 Friday 01:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh (1.35), Box.templates.hh (1.122): Modified
+ methods add_constraint(s) and add_congruence(s) so as to throw
+ exceptions if a non-interval constraint/congruence is being
+ added. Modified the (generalized_)affine_(pre)image methods so
+ as to use refine_with_constraint() instead of add_constraint()
+ method. Added a couple of FIXME/CHECKME.
+
+2008-09-12 Friday 01:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.130), BD_Shape.templates.hh (1.115):
+ Avoid definition and use of duplicated exception thrower
+ function. Added a fixme regarding exceptions thrown by
+ add_constraint for strict inequalities.
+
+2008-09-12 Friday 01:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: addconstraints1.cc (1.14), addspacedims1.cc (1.9),
+ affineimage1.cc (1.11), affinepreimage1.cc (1.8),
+ bgp99extrapolation1.cc (1.6), boundedaffinepreimage1.cc (1.9),
+ cc76narrowing1.cc (1.8), concatenate1.cc (1.9), congruences1.cc
+ (1.5), constraints1.cc (1.12), contains1.cc (1.7), discrete1.cc
+ (1.7), disjoint1.cc (1.7), expandspacedim1.cc (1.10),
+ foldspacedims1.cc (1.10), generalizedaffineimage1.cc (1.16),
+ intersection1.cc (1.11), mapspacedims1.cc (1.8), max_min1.cc
+ (1.9), pointsetpowerset1.cc (1.7), refinewithcongruences1.cc
+ (1.2), relations1.cc (1.7), relations2.cc (1.6),
+ removespacedims1.cc (1.11), timeelapse1.cc (1.10), universe1.cc
+ (1.6), writebox1.cc (1.6): Avoid exceptions when adding
+ (non-interval) constraints to boxes.
+
+2008-09-12 Friday 00:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/refinewithconstraint1.cc (1.2): New test04 shows a bug
+ in Box::refine_with_constraint() related to the handling of
+ trivially false constraints.
+
+2008-09-11 Thursday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.77): Typo fixed.
+
+2008-09-11 Thursday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.76): First
+ separate-compilation changes.
+
+2008-09-11 Thursday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore, ChangeLog, INSTALL, Makefile.am, NEWS, TODO,
+ config.guess, config.rpath, config.sub, configure.ac, instchk.hh,
+ ltmain.sh, Watchdog/ChangeLog, Watchdog/INSTALL,
+ Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/ltmain.sh,
+ Watchdog/doc/Makefile.am, Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in,
+ Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/libtool.m4,
+ Watchdog/m4/ltoptions.m4, Watchdog/m4/ltsugar.m4,
+ Watchdog/m4/ltversion.m4, Watchdog/src/Makefile.am,
+ Watchdog/utils/Makefile.am, demos/ppl_lpsol/.cvsignore,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-java-interface.doxyconf-html.in,
+ doc/devref-java-interface.doxyconf-latex.in,
+ doc/devref-java-interface.tex,
+ doc/devref-ocaml-interface.doxyconf-html.in,
+ doc/devref-ocaml-interface.doxyconf-latex.in,
+ doc/devref-ocaml-interface.tex,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref-prolog-interface.tex, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/libppl.3, doc/ppl-config.1,
+ doc/ppl_lcdd.1, doc/ppl_lpsol.1,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in,
+ doc/user-java-interface.doxyconf-html.in,
+ doc/user-java-interface.doxyconf-latex.in,
+ doc/user-java-interface.tex,
+ doc/user-ocaml-interface.doxyconf-html.in,
+ doc/user-ocaml-interface.doxyconf-latex.in,
+ doc/user-ocaml-interface.tex,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ fedora/ppl.spec, interfaces/Makefile.am,
+ interfaces/marked_pointers.hh,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/ppl_interface_generator_copyright,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.h.in,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dox.m4,
+ interfaces/Java/ppl_interface_generator_java_dox_code.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+ interfaces/Java/ppl_java_common_dox,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/NNC_Polyhedron_test1.java,
+ interfaces/Java/tests/Test_Executor.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/.cvsignore, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/OCaml_interface.dox,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+ interfaces/OCaml/ppl_ocaml_globals.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml, interfaces/OCaml/test1.ml,
+ interfaces/OCaml/tests/.cvsignore,
+ interfaces/OCaml/tests/Makefile.am,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+ interfaces/OCaml/tests/ppl_ocaml_tests_common,
+ interfaces/OCaml/tests/test1.ml, interfaces/Prolog/.cvsignore,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+ interfaces/Prolog/ppl_prolog_common.cc,
+ interfaces/Prolog/ppl_prolog_common.defs.hh,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/ppl_prolog_common.inlines.hh,
+ interfaces/Prolog/ppl_prolog_sysdep_dox,
+ interfaces/Prolog/ppl_prolog_sysindep_dox,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/gprolog_efli.cc,
+ interfaces/Prolog/GNU/gprolog_efli.hh,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sicstus_efli.cc,
+ interfaces/Prolog/SICStus/sicstus_efli.hh,
+ interfaces/Prolog/SWI/.cvsignore,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_efli.cc,
+ interfaces/Prolog/SWI/swi_efli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/XSB/.cvsignore,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+ interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_efli.cc,
+ interfaces/Prolog/XSB/xsb_efli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_efli.cc,
+ interfaces/Prolog/YAP/yap_efli.hh,
+ interfaces/Prolog/tests/.cvsignore,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_long_double_binary_format.m4, m4/ax_prefix_config_h.m4,
+ m4/lib-link.m4, m4/lib-prefix.m4, m4/libtool.m4, m4/ltoptions.m4,
+ m4/ltsugar.m4, m4/ltversion.m4, src/.cvsignore,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Matrix.cc,
+ src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.defs.hh,
+ src/Box.inlines.hh, src/Box.templates.hh,
+ src/C_Polyhedron.defs.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+ src/Congruence.defs.hh, src/Congruence_System.cc,
+ src/Congruence_System.inlines.hh, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.templates.hh,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Grid.defs.hh, src/Grid.templates.hh, src/Grid_chdims.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/Init.cc, src/Init.defs.hh,
+ src/Init.inlines.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval_Info.defs.hh,
+ src/Interval_Info.inlines.hh, src/Interval_Restriction.defs.hh,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_System.cc, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/Makefile.am, src/Matrix.defs.hh,
+ src/Matrix.inlines.hh, src/NNC_Polyhedron.defs.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.templates.hh,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/checked.cc,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpz.inlines.hh, src/conversion.cc,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.cc, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+ src/fpu.defs.hh, src/iterator_to_const.defs.hh, src/minimize.cc,
+ src/ppl_header.hh, src/simplify.cc, tests/Makefile.am,
+ tests/print.hh, tests/BD_Shape/.cvsignore,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+ tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/timeelapse1.cc,
+ tests/Box/.cvsignore, tests/Box/Makefile.am,
+ tests/Box/ascii_dump_load1.cc, tests/Box/boxdifference1.cc,
+ tests/Box/constrains1.cc, tests/Box/fromgrid1.cc,
+ tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/topclosed1.cc,
+ tests/Grid/.cvsignore, tests/Grid/Makefile.am,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload7.cc, tests/Grid/bounded1.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/directproduct1.cc, tests/Grid/directproduct2.cc,
+ tests/Grid/directproduct3.cc, tests/Grid/directproduct4.cc,
+ tests/Grid/directproduct5.cc, tests/Grid/directproduct6.cc,
+ tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc, tests/Grid/frombdshape1.cc,
+ tests/Grid/frombox1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/frompolyhedron1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc,
+ tests/Grid/generators1.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/join1.cc,
+ tests/Grid/join2.cc, tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/maxmin1.cc,
+ tests/Grid/membytes1.cc, tests/Grid/mincongruences1.cc,
+ tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+ tests/Grid/partiallyreducedproduct1.cc,
+ tests/Grid/partiallyreducedproduct2.cc,
+ tests/Grid/partiallyreducedproduct3.cc,
+ tests/Grid/partiallyreducedproduct4.cc,
+ tests/Grid/pointsetpowerset1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening3.cc, tests/MIP_Problem/.cvsignore,
+ tests/Octagonal_Shape/.cvsignore,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/constrains1.cc,
+ tests/Partially_Reduced_Product/.cvsignore,
+ tests/Partially_Reduced_Product/Makefile.am,
+ tests/Partially_Reduced_Product/asciidumpload1.cc,
+ tests/Partially_Reduced_Product/directproduct1.cc,
+ tests/Partially_Reduced_Product/directproduct2.cc,
+ tests/Partially_Reduced_Product/directproduct3.cc,
+ tests/Partially_Reduced_Product/directproduct4.cc,
+ tests/Partially_Reduced_Product/directproduct5.cc,
+ tests/Partially_Reduced_Product/directproduct6.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+ tests/Polyhedron/.cvsignore, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/pointsetpowerset2.cc,
+ tests/Polyhedron/pointsetpowerset3.cc,
+ tests/Polyhedron/pointsetpowerset4.cc,
+ tests/Polyhedron/pointsetpowerset5.cc,
+ tests/Polyhedron/pointsetpowerset6.cc,
+ tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/simplifyusingcontext1.cc,
+ tests/Powerset/.cvsignore, tests/Powerset/Makefile.am,
+ tests/Powerset/pointsetpowerset1.cc,
+ tests/Powerset/pointsetpowerset2.cc,
+ tests/Powerset/pointsetpowerset3.cc,
+ tests/Powerset/pointsetpowerset4.cc,
+ tests/Powerset/pointsetpowerset5.cc,
+ tests/Powerset/pointsetpowerset6.cc, tests/Powerset/powerset1.cc,
+ tests/Powerset/product1.cc,
+ tests/Powerset/simplifyusingcontext1.cc, utils/Makefile.am
+ (bounded_arithmetic.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,2,1,1,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,1,1,1,1,1,1,1,2,2,1,1,1,1,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,2,2,1,2,2,2,1,1,1,1,1,2,2,1,2,1,1,2,1,2,2,1,1,1,1,2,1,2,2,1,1,1,1,1,2,2,1,2,2,1,1,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1, [...]
+ First merge of the trunk to the bounded_arithmetic branch.
+
+2008-09-11 Thursday 22:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.81): Improved comments for the
+ add_constraint(s) methods.
+
+2008-09-11 Thursday 20:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.11), Watchdog/INSTALL (1.8): Updated from Autoconf
+ 2.63.
+
+2008-09-11 Thursday 19:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/frompartiallyreducedproduct1.cc (1.3): Prefer
+ refine_with_* to add_* when stating properties of products
+ elements.
+
+2008-09-11 Thursday 17:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.5): Typo corrected.
+
+2008-09-11 Thursday 17:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (bounded_arithmetic.1): file partiallyreducedproduct1.cc was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 17:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/frombox1.cc (1.6): Undone unintended change.
+
+2008-09-11 Thursday 16:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frombox1.cc (1.3): Corrected expected result for
+ test11.
+
+2008-09-11 Thursday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/frombox1.cc (bounded_arithmetic.1): file frombox1.cc
+ was added on branch bounded_arithmetic on 2008-09-11 20:37:53
+ +0000
+
+2008-09-11 Thursday 16:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Box/frombox1.cc (1.5), Grid/Makefile.am (1.69),
+ Grid/frombox1.cc (1.1): Tests added for building a grid from a
+ box.
+
+2008-09-11 Thursday 16:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: frombdshape1.cc (1.4), fromoctagonalshape1.cc (1.4),
+ grid3.cc (1.29): Added tests in the case that the bd/octagonal
+ shape is not shortest path closed. Fixed a comment in
+ tests/Grid/grid3.cc.
+
+2008-09-11 Thursday 16:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/fromgrid1.cc (1.7): Revised for changes to the grid
+ domain.
+
+2008-09-11 Thursday 16:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.114): Prefer refine_with_* wrt add_*
+ in the implementation of generalized affine images and preimages.
+
+2008-09-11 Thursday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: generalizedaffineimage1.cc (1.22), membytes1.cc
+ (1.7), timeelapse1.cc (1.26): A few test corrected (no longer
+ adding constraints that are not BD).
+
+2008-09-11 Thursday 15:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: congruences1.cc (1.5), constraints1.cc (1.25):
+ Corrected according to hte new semantics of
+ add_constraints/congruences.
+
+2008-09-11 Thursday 15:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.4): Improved a test.
+
+2008-09-11 Thursday 15:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.113): Corrected a couple of bugs in
+ the new add_congruence implementation.
+
+2008-09-11 Thursday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.165): When converting differently
+ typed BD_Shape objects, for maximum precision, do enforce
+ shortest-path closure of the source bds.
+
+2008-09-11 Thursday 15:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frombdshape1.cc (1.4): Avoid exceptions in tests
+ 1--4.
+
+2008-09-11 Thursday 15:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/Makefile.am (1.3): Enable test
+ asciidumpload1.cc.
+
+2008-09-11 Thursday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/Makefile.am
+ (bounded_arithmetic.1): file Makefile.am was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 15:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frombdshape1.cc (1.3): Added a test for the
+ conversion from a bds to a differently typed bds.
+
+2008-09-11 Thursday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.inlines.hh (1.30),
+ Partially_Reduced_Product.templates.hh (1.11): Also dump/load the
+ reduction Bolean flag.
+
+2008-09-11 Thursday 14:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/asciidumpload1.cc (1.2): When
+ using products, always prefer refine_with_* instead of add_*.
+
+2008-09-11 Thursday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/asciidumpload1.cc
+ (bounded_arithmetic.1): file asciidumpload1.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Grid/asciidumpload7.cc (1.6),
+ Partially_Reduced_Product/asciidumpload1.cc (1.1): Move test for
+ the product domain into the appropriate directory. Test
+ temporarily disabled.
+
+2008-09-11 Thursday 14:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.80), src/Grid_public.cc (1.81),
+ tests/Grid/Makefile.am (1.68), tests/Grid/frombdshape1.cc (1.3),
+ tests/Grid/fromoctagonalshape1.cc (1.3), tests/Grid/grid3.cc
+ (1.28), tests/Grid/membytes1.cc (1.12),
+ tests/Partially_Reduced_Product/Makefile.am (1.2),
+ tests/Partially_Reduced_Product/directproduct1.cc (1.3),
+ tests/Partially_Reduced_Product/directproduct3.cc (1.3),
+ tests/Partially_Reduced_Product/directproduct6.cc (1.3),
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (1.3): If a constraint system is not all equalities, then
+ building a grid from the system will now throw an exception.
+ Tests adapted for this change.
+
+ In tests/Grid the asciidumpload7.cc tested ascii_dump and
+ ascii_load for the product domain. This test fails with the
+ current changes and has been disabled. When these problems have
+ been fixed, the test will be moved and enabled in the
+ tests/Partially_Reduced_Product directory.
+
+2008-09-11 Thursday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct1.cc
+ (bounded_arithmetic.1): file directproduct1.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct3.cc
+ (bounded_arithmetic.1): file directproduct3.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct6.cc
+ (bounded_arithmetic.1): file directproduct6.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (bounded_arithmetic.1): file partiallyreducedproduct2.cc was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frombox1.cc (1.2): Another test.
+
+2008-09-11 Thursday 14:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/fromgrid1.cc (1.5): New test to check that the
+ appropriate precision is obtained when converting from a grid to
+ a bd shape.
+
+2008-09-11 Thursday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.3): Only build from equality constraints and congruences -
+ otherwise build the universe and use the refine_with* methods.
+
+2008-09-11 Thursday 13:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.129), BD_Shape.inlines.hh (1.164),
+ BD_Shape.templates.hh (1.112): Now methods constructing a
+ BD_Shape from a constraint system and adding constraints throw
+ exceptions if an illegal constraint is added. Also corrected the
+ conversion constructors from Box and Octagonal_Shape so as to
+ force an emptiness check, so as to build a precise approximation.
+
+2008-09-11 Thursday 13:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Congruence.defs.hh (1.24): Documentation clarified.
+
+2008-09-11 Thursday 13:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.138): Remove a TODO comment inside a
+ now deprecated method.
+
+2008-09-11 Thursday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/fromoctagonalshape1.cc (1.4): New test shows that
+ current implementation of conversion operator is not precise
+ enough.
+
+2008-09-11 Thursday 12:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.79), src/Grid_public.cc (1.80),
+ tests/Grid/Makefile.am (1.67), tests/Grid/addconstraint1.cc
+ (1.15), tests/Grid/addconstraints1.cc (1.16),
+ tests/Grid/addspacedims1.cc (1.17), tests/Grid/affinedim1.cc
+ (1.14), tests/Grid/affineimage2.cc (1.14),
+ tests/Grid/affinepreimage2.cc (1.10),
+ tests/Grid/asciidumpload1.cc (1.16), tests/Grid/asciidumpload2.cc
+ (1.8), tests/Grid/bounded1.cc (1.16), tests/Grid/bounds1.cc
+ (1.17), tests/Grid/certificate1.cc (1.16),
+ tests/Grid/containsintegerpoint1.cc (1.6),
+ tests/Grid/coveringbox1.cc (1.18), tests/Grid/discrete1.cc
+ (1.10), tests/Grid/disjoint1.cc (1.14), tests/Grid/equals1.cc
+ (1.15), tests/Grid/expandspacedim1.cc (1.14),
+ tests/Grid/foldspacedims1.cc (1.14),
+ tests/Grid/frompolyhedron1.cc (1.2),
+ tests/Grid/generalizedaffineimage1.cc (1.16),
+ tests/Grid/generalizedaffineimage2.cc (1.15),
+ tests/Grid/generalizedaffineimage3.cc (1.7),
+ tests/Grid/generalizedaffinepreimage1.cc (1.18),
+ tests/Grid/generalizedaffinepreimage2.cc (1.18),
+ tests/Grid/generalizedaffinepreimage3.cc (1.7),
+ tests/Grid/generators1.cc (1.15), tests/Grid/grid3.cc (1.27),
+ tests/Grid/griddifference1.cc (1.14), tests/Grid/join1.cc (1.18),
+ tests/Grid/join2.cc (1.13), tests/Grid/limitedextrapolation1.cc
+ (1.15), tests/Grid/limitedextrapolation2.cc (1.9),
+ tests/Grid/limitedextrapolation3.cc (1.8), tests/Grid/maxmin1.cc
+ (1.15), tests/Grid/mincongruences1.cc (1.13),
+ tests/Grid/mingenerators1.cc (1.12),
+ tests/Grid/outputoperator1.cc (1.11),
+ tests/Grid/pointsetpowerset1.cc (1.4),
+ tests/Grid/powersetdifference1.cc (1.6),
+ tests/Grid/powersetgeometricallycovers1.cc (1.5),
+ tests/Grid/relations1.cc (1.17), tests/Grid/relations2.cc (1.19),
+ tests/Grid/relations3.cc (1.10), tests/Grid/removespacedims1.cc
+ (1.16), tests/Grid/removespacedims2.cc (1.16),
+ tests/Grid/timeelapse1.cc (1.13), tests/Grid/topclosed1.cc
+ (1.14), tests/Grid/widening1.cc (1.18), tests/Grid/widening3.cc
+ (1.8): Removed the add congruence methods where the parameter is
+ a constraint. This means that, for example, "A == 0" can only be
+ added using add_constraint. To add it as a congruence it should
+ be written as "(A %= 0) / 0)". Tests adapted for this change.
+
+2008-09-11 Thursday 10:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.137): Redone change (temporarily
+ reverted a week ago): now add_congruence(s) method throws an
+ exception when adding a proper and non-trivial congruence.
+
+2008-09-11 Thursday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.218): Minor improvements to the
+ documentation for simplify_using_context.
+
+2008-09-11 Thursday 10:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.347): Minor improvement to the
+ documentation for refine methods.
+
+2008-09-11 Thursday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.8): Another few minor
+ improvements.
+
+2008-09-11 Thursday 09:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.templates.hh (1.10): When recycling
+ in the product domains, use refine_with_* for the sub-domain that
+ cannot recycle.
+
+2008-09-11 Thursday 09:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.7): Added documentation for the
+ refine, constrains and unconstrain functions.
+
+2008-09-11 Thursday 08:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.29),
+ tests/Partially_Reduced_Product/directproduct1.cc (1.2),
+ tests/Partially_Reduced_Product/directproduct2.cc (1.2),
+ tests/Partially_Reduced_Product/directproduct3.cc (1.2),
+ tests/Partially_Reduced_Product/directproduct4.cc (1.2),
+ tests/Partially_Reduced_Product/directproduct5.cc (1.2),
+ tests/Partially_Reduced_Product/directproduct6.cc (1.2),
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.2),
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (1.2),
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+ (1.2),
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+ (1.2): Use refine_with_* when adding constraints or congruences
+ to a product. Note that this also applies to the
+ constraints_reduction which needs to share the constraints and
+ congruences.
+
+2008-09-11 Thursday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct2.cc
+ (bounded_arithmetic.1): file directproduct2.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct4.cc
+ (bounded_arithmetic.1): file directproduct4.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/directproduct5.cc
+ (bounded_arithmetic.1): file directproduct5.cc was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+ (bounded_arithmetic.1): file partiallyreducedproduct3.cc was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+ (bounded_arithmetic.1): file partiallyreducedproduct4.cc was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.6): Remove documentation for
+ constructors from generic boudning boxes, which have been
+ replaced by PPL Box instantiations.
+
+2008-09-10 Wednesday 21:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.78), src/Grid_nonpublic.cc (1.35),
+ src/Grid_public.cc (1.79), tests/Grid/addconstraint1.cc (1.14),
+ tests/Grid/addconstraints1.cc (1.15): Modified methods
+ add_(recycled_)constraint(s) in the Grid domain to reflect what
+ is said in definitions.dox wrt the throwing of exceptions.
+ Modified tests and added tests to check the new exceptions. The
+ *_and_minimize" methods are untouched.
+
+2008-09-10 Wednesday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc (1.17): Account for the differences between teTeX
+ and TeX Live.
+
+2008-09-10 Wednesday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc (1.16): Numbers fixed.
+
+2008-09-10 Wednesday 15:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.260): Removed 2 items that have already been dealt with.
+
+2008-09-10 Wednesday 13:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/ppl_java_common_dox (1.4): Typo fixed.
+
+2008-09-10 Wednesday 13:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_java_common_dox (bounded_arithmetic.1): file
+ ppl_java_common_dox was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:44 +0000
+
+2008-09-10 Wednesday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/ppl_java_common_dox (1.3): Further small
+ improvements to the documention for the widening operators
+ documentation..
+
+2008-09-10 Wednesday 13:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/ppl_java_common_dox (1.2): Several cut-and-paste
+ and similar errors fixed.
+
+2008-09-10 Wednesday 12:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+ (1.4), ppl_interface_generator_prolog_cc_files.m4 (1.6),
+ ppl_interface_generator_prolog_dox.m4 (1.2),
+ ppl_interface_generator_prolog_dox_code.m4 (1.2),
+ ppl_interface_generator_prolog_hh_code.m4 (1.6),
+ ppl_interface_generator_prolog_hh_files.m4 (1.7): Comments
+ describing the function of the m4 files corrected.
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_cc_code.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_cc_files.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_dox.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_dox_code.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_hh_code.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_prolog_hh_files.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 11:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/README.doc (1.15): Minor improvements.
+
+2008-09-10 Wednesday 10:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/test1.ml (bounded_arithmetic.1): file
+ test1.ml was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:45 +0000
+
+2008-09-10 Wednesday 10:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.16),
+ ppl_ocaml_globals.cc (1.18), ppl_ocaml_globals.ml (1.11),
+ tests/test1.ml (1.12): Added code for ppl_version() and similar
+ functions. Fixed a warning (ppl_ocaml_globals.cc) - caused by
+ using CAMLparam(0) instead of CAMLparam1(unit) that declares the
+ dummy parameter "unit". Fixed a cut-and-paste typo in the mli
+ fixed code.
+
+2008-09-10 Wednesday 08:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README.doc (1.14): Added advice on how to deal with "TeX
+ capacity exceeded" errors.
+
+2008-09-09 Tuesday 22:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int32 (1.11): Adapted to the recent
+ changes in ppl_lpsol.
+
+2008-09-09 Tuesday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (bounded_arithmetic.1): file
+ Makefile.am was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:45 +0000
+
+2008-09-09 Tuesday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.50), tests/Makefile.am (1.16):
+ Link with the PPL just built, not with the one that may already
+ been installed in the system.
+
+2008-09-09 Tuesday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.343): Make LIBEXT and SHREXT available to
+ makefiles.
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_interface_generator_java_dox.m4
+ (bounded_arithmetic.1): file ppl_interface_generator_java_dox.m4
+ was added on branch bounded_arithmetic on 2008-09-11 20:37:44
+ +0000
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_interface_generator_java_dox_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_java_dox_code.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:44 +0000
+
+2008-09-09 Tuesday 15:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/Makefile.am (1.67),
+ doc/devref-java-interface.doxyconf-html.in (1.4),
+ doc/devref-java-interface.doxyconf-latex.in (1.4),
+ doc/user-java-interface.doxyconf-html.in (1.4),
+ doc/user-java-interface.doxyconf-latex.in (1.4),
+ interfaces/Java/Java_interface.dox (1.3),
+ interfaces/Java/Makefile.am (1.18),
+ interfaces/Java/ppl_interface_generator_java_dox.m4 (1.1),
+ interfaces/Java/ppl_interface_generator_java_dox_code.m4 (1.1),
+ interfaces/Java/ppl_java_common_dox (1.1): Revised the Java
+ documentation.
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-java-interface.doxyconf-html.in
+ (bounded_arithmetic.1): file
+ devref-java-interface.doxyconf-html.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-java-interface.doxyconf-latex.in
+ (bounded_arithmetic.1): file
+ devref-java-interface.doxyconf-latex.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-java-interface.doxyconf-html.in (bounded_arithmetic.1):
+ file user-java-interface.doxyconf-html.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-java-interface.doxyconf-latex.in (bounded_arithmetic.1):
+ file user-java-interface.doxyconf-latex.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/OCaml_interface.dox (1.4): Some typos fixed.
+
+2008-09-09 Tuesday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox (bounded_arithmetic.1): file
+ OCaml_interface.dox was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:45 +0000
+
+2008-09-09 Tuesday 10:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.259), interfaces/Prolog/tests/pl_check.pl (1.55): Removed
+ another item from the TODO. Added a test for the set and restore
+ rounding predicates.
+
+2008-09-09 Tuesday 10:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.258): Removed an item.
+
+2008-09-09 Tuesday 10:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.217): Revised documentation for the
+ Pointset Powerset domain. Reordered sections so that the Grid
+ documentation comes before the Powerset documentation.
+
+2008-09-09 Tuesday 05:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int16 (1.10): Adapted to the recent
+ changes in ppl_lpsol.
+
+2008-09-09 Tuesday 05:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/.cvsignore (1.13), tests/Box/.cvsignore (1.4): Updated.
+
+2008-09-08 Monday 22:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/Makefile.am (1.66),
+ doc/devref-ocaml-interface.doxyconf-html.in (1.3),
+ doc/devref-ocaml-interface.doxyconf-latex.in (1.3),
+ interfaces/OCaml/OCaml_interface.dox (1.3): Revised OCaml
+ documentation.
+
+2008-09-08 Monday 22:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-ocaml-interface.doxyconf-html.in
+ (bounded_arithmetic.1): file
+ devref-ocaml-interface.doxyconf-html.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-08 Monday 22:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-ocaml-interface.doxyconf-latex.in
+ (bounded_arithmetic.1): file
+ devref-ocaml-interface.doxyconf-latex.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-08 Monday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.270): Previous change reverted, since only
+ one precompiled header can be used in a particular compilation.
+
+2008-09-08 Monday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.46): Some readability
+ improvements.
+
+2008-09-08 Monday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/.cvsignore (bounded_arithmetic.1): file
+ .cvsignore was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:45 +0000
+
+2008-09-08 Monday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/.cvsignore (1.2),
+ interfaces/OCaml/tests/.cvsignore (1.2),
+ interfaces/Prolog/SWI/.cvsignore (1.9),
+ interfaces/Prolog/tests/.cvsignore (1.3): Updated.
+
+2008-09-08 Monday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Polyhedron/.cvsignore (1.7), Grid/.cvsignore (1.3):
+ Updated.
+
+2008-09-08 Monday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/.cvsignore (1.4): Updated.
+
+2008-09-08 Monday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.269): Precompile ppl_test.hh, if precompiled
+ headers are requested.
+
+2008-09-08 Monday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.9): Updated.
+
+2008-09-08 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.342): New Automake flag DEBUGGING_ENABLED is true
+ if we have to compile with debug info.
+
+2008-09-08 Monday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.55): Erased rule to build
+ obsolete ppl_prolog_main.icc.
+
+2008-09-08 Monday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Partially_Reduced_Product/.cvsignore, Powerset/.cvsignore
+ (bounded_arithmetic.[1,1]): file .cvsignore was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-08 Monday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Box/.cvsignore (1.3), MIP_Problem/.cvsignore (1.2),
+ Octagonal_Shape/.cvsignore (1.2),
+ Partially_Reduced_Product/.cvsignore (1.2), Powerset/.cvsignore
+ (1.2): Updated.
+
+2008-09-08 Monday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.257), interfaces/Prolog/tests/Makefile.am (1.23): Source
+ file interfaces/Prolog/tests/ppl_predicate_check_common.pl is no
+ longer deleted from the source directory.
+
+2008-09-08 Monday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: OCaml/.cvsignore (1.5), Prolog/.cvsignore (1.3),
+ Prolog/XSB/.cvsignore (1.7): Updated.
+
+2008-09-08 Monday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.15): In Fedora, SWI-Prolog.h is
+ installed in /usr/include/pl.
+
+2008-09-08 Monday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.48), configure.ac (1.341), Watchdog/configure.ac
+ (1.46), Watchdog/utils/Makefile.am (1.11),
+ demos/ppl_lpsol/Makefile.am (1.45), interfaces/OCaml/Makefile.am
+ (1.49), interfaces/OCaml/tests/Makefile.am (1.15),
+ interfaces/Prolog/SICStus/Makefile.am (1.93), utils/Makefile.am
+ (1.19): Use AC_PROG_SED in configure.ac's and $(SED), instead of
+ plain `sed', in Makefile.am's.
+
+2008-09-08 Monday 14:54 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.15),
+ ppl_ocaml_globals.cc (1.17), ppl_ocaml_globals.ml (1.10),
+ tests/test1.ml (1.11): Added - ppl_set_rounding_for_PPL -
+ ppl_restore_pre_PPL_rounding to the OCaml interface.
+
+2008-09-08 Monday 14:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.3): Include the new predicates ppl_set_rounding_for_PPL and
+ ppl_restore_pre_rounding_for_PPL in the list of fixed
+ predicates.
+
+2008-09-08 Monday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.77), Grid.templates.hh (1.36),
+ Grid_simplify.cc (1.39): Code controlled by STRONG_REDUCTION
+ moved to the appropriate place.
+
+2008-09-08 Monday 14:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.25): Commet improved.
+
+2008-09-08 Monday 14:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/Makefile.am (1.65),
+ doc/devref-prolog-interface.doxyconf-html.in (1.9),
+ doc/devref-prolog-interface.doxyconf-latex.in (1.9),
+ doc/user-prolog-interface.doxyconf-html.in (1.8),
+ doc/user-prolog-interface.doxyconf-latex.in (1.9),
+ interfaces/Prolog/Makefile.am (1.54),
+ interfaces/Prolog/Prolog_interface.dox (1.162),
+ interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 (1.1),
+ interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+ (1.1), interfaces/Prolog/ppl_prolog_sysdep_dox (1.1),
+ interfaces/Prolog/ppl_prolog_sysindep_dox (1.1): Prolog
+ documentation revised.
+
+2008-09-08 Monday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_sysdep_dox (bounded_arithmetic.1):
+ file ppl_prolog_sysdep_dox was added on branch bounded_arithmetic
+ on 2008-09-11 20:37:45 +0000
+
+2008-09-08 Monday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_sysindep_dox (bounded_arithmetic.1):
+ file ppl_prolog_sysindep_dox was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-08 Monday 09:17 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_globals.cc (1.12): Avoid `ppl_'
+ prefix in the definitions of the methods in the Java interface.
+
+2008-09-08 Monday 09:06 Andrea Cimino
+
+ * configure.ac (1.340): No longer check for libmlgmp.a when
+ detecting if we are able to compile the OCaml interface.
+
+2008-09-08 Monday 08:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.47): Use `mv -f' instead of `mv'.
+
+2008-09-08 Monday 08:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int64 (1.11): Adapted to the recent
+ changed in ppl_lpsol.
+
+2008-09-07 Sunday 23:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.48), tests/Makefile.am (1.14):
+ Improved the definition of OCAMLC_LINK_FLAGS.
+
+2008-09-07 Sunday 21:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_mpz (1.15), ppl_lpsol.c (1.77): Let
+ GLPK work with the system's default rounding mode.
+
+2008-09-07 Sunday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.91): Work around a plld bug
+ under Cygwin.
+
+2008-09-07 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.13): Definitions of
+ OCAMLC_LINK_FLAGS made equal.
+
+2008-09-07 Sunday 16:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.47): Fixed ocamlc compilation and
+ link flags.
+
+2008-09-07 Sunday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.12): Typo fixed.
+
+2008-09-07 Sunday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.11): Fixed ocamlc
+ compilation and link flags.
+
+2008-09-07 Sunday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.339): Restore LIBS after checking for GLPK.
+
+2008-09-07 Sunday 14:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: devref.doxyconf-html.in (1.90), devref.doxyconf-latex.in
+ (1.29): Include the Partially_Reduced_Product.* src files for
+ INPUT.
+
+2008-09-07 Sunday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (1.5), doc/Makefile.am (1.64),
+ interfaces/Prolog/Ciao/Makefile.am (1.75),
+ interfaces/Prolog/XSB/Makefile.am (1.72): `abs_srcdir' is
+ automatically set by Automake: removed redundant definitions.
+
+2008-09-07 Sunday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.42), config.sub (1.39), Watchdog/config.guess
+ (1.26), Watchdog/config.sub (1.24): Updated.
+
+2008-09-07 Sunday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.46): Removed useless definition
+ of `abs_srcdir'.
+
+2008-09-07 Sunday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (1.14), Watchdog/utils/Makefile.am
+ (1.10), interfaces/C/Makefile.am (1.43),
+ interfaces/Java/jni/Makefile.am (1.20),
+ interfaces/Prolog/Makefile.am (1.53),
+ interfaces/Prolog/Ciao/Makefile.am (1.74),
+ interfaces/Prolog/GNU/Makefile.am (1.76),
+ interfaces/Prolog/YAP/Makefile.am (1.65),
+ interfaces/Prolog/tests/Makefile.am (1.22), utils/Makefile.am
+ (1.18): Removed useless dependencies from Makefile.
+
+2008-09-07 Sunday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.35), Watchdog/ltmain.sh (1.24), m4/libtool.m4 (1.6),
+ m4/ltoptions.m4 (1.4), m4/ltsugar.m4 (1.2), m4/ltversion.m4
+ (1.5), Watchdog/m4/libtool.m4 (1.6), Watchdog/m4/ltoptions.m4
+ (1.4), Watchdog/m4/ltsugar.m4 (1.2), Watchdog/m4/ltversion.m4
+ (1.5): Updated from Libtool 2.2.6.
+
+2008-09-07 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-prolog-interface.doxyconf-html.in (1.8),
+ devref-prolog-interface.doxyconf-latex.in (1.8): Fixed the
+ definition of INPUT.
+
+2008-09-07 Sunday 11:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.cc (bounded_arithmetic.1):
+ file ppl_prolog_common.cc was added on branch bounded_arithmetic
+ on 2008-09-11 20:37:45 +0000
+
+2008-09-07 Sunday 11:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.defs.hh
+ (bounded_arithmetic.1): file ppl_prolog_common.defs.hh was added
+ on branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-07 Sunday 11:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: Java/jni/ppl_java_globals.cc (1.11),
+ Prolog/ppl_prolog_common.cc (1.4),
+ Prolog/ppl_prolog_common.defs.hh (1.4): Added support for new
+ methods: void Parma_Polyhedra_Library::set_rounding_for_PPL()
+ void Parma_Polyhedra_Library::restore_pre_PPL_rounding() for
+ Prolog and Java.
+
+2008-09-07 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.184): Vertical space adjusted.
+
+2008-09-07 Sunday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.42): When necessary list
+ `-no-undefined' among the `libppl_c_la_LDFLAGS'.
+
+2008-09-07 Sunday 09:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.51): Corrected cross-reference
+ wrt meet-preserving enlargement for the devref manuals.
+
+2008-09-07 Sunday 09:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/Makefile.am (1.63): Corrected paths for Prolog files used for
+ the devref Prolog manuals.
+
+2008-09-07 Sunday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.71): Added ppl_xsb.hh to
+ DISTCLEANFILES.
+
+2008-09-07 Sunday 08:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.45): More dependency problems
+ fixed.
+
+2008-09-06 Saturday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.h.in (1.77),
+ ppl_interface_generator_c_cc_preamble (1.15),
+ ppl_interface_generator_c_h_preamble (1.11): Added
+
+ int ppl_set_rounding_for_PPL(void)
+
+ and
+
+ int ppl_restore_pre_PPL_rounding(void)
+
+ to the C interface.
+
+2008-09-06 Saturday 22:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.defs.hh (1.22): Comments revised.
+
+2008-09-06 Saturday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.70): BUILT_SOURCES must
+ include ppl_xsb.hh.
+
+2008-09-06 Saturday 20:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.338): Version number bumped.
+
+2008-09-06 Saturday 20:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.256), interfaces/OCaml/Makefile.am (1.44),
+ interfaces/OCaml/tests/Makefile.am (1.10): Fixed the dependency
+ problems.
+
+2008-09-06 Saturday 18:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.46): Commands for dist-hook fixed.
+
+2008-09-06 Saturday 18:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.9): Do not distribute
+ generated sources.
+
+2008-09-06 Saturday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/: devref.doxyconf-html.in (1.3),
+ devref.doxyconf-latex.in (1.3), user.doxyconf-html.in (1.4),
+ user.doxyconf-latex.in (1.4): Updated.
+
+2008-09-06 Saturday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.33), Java/jni/Makefile.am (1.19),
+ Java/tests/Makefile.am (1.21), OCaml/Makefile.am (1.43),
+ Prolog/GNU/Makefile.am (1.75), Prolog/SICStus/Makefile.am (1.92),
+ Prolog/SWI/Makefile.am (1.90), Prolog/XSB/Makefile.am (1.69),
+ Prolog/YAP/Makefile.am (1.64), Prolog/tests/Makefile.am (1.21):
+ Removed several misuses of BUILT_SOURCES.
+
+2008-09-06 Saturday 16:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.8): Fixed several problems.
+
+2008-09-06 Saturday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.337): Only enable sicstus_prolog, swi_prolog and
+ xsb_prolog by default.
+
+2008-09-06 Saturday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.74), SICStus/Makefile.am
+ (1.91), SWI/Makefile.am (1.89), XSB/Makefile.am (1.68),
+ YAP/Makefile.am (1.63): Do not distribute generated files.
+
+2008-09-06 Saturday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.7),
+ devref-c-interface.doxyconf-latex.in (1.7),
+ devref-java-interface.doxyconf-html.in (1.3),
+ devref-java-interface.doxyconf-latex.in (1.3),
+ devref-ocaml-interface.doxyconf-html.in (1.2),
+ devref-ocaml-interface.doxyconf-latex.in (1.2),
+ devref-prolog-interface.doxyconf-html.in (1.7),
+ devref-prolog-interface.doxyconf-latex.in (1.7),
+ devref.doxyconf-html.in (1.89), devref.doxyconf-latex.in (1.28),
+ user-c-interface.doxyconf-html.in (1.8),
+ user-c-interface.doxyconf-latex.in (1.8),
+ user-java-interface.doxyconf-html.in (1.3),
+ user-java-interface.doxyconf-latex.in (1.3),
+ user-ocaml-interface.doxyconf-html.in (1.2),
+ user-ocaml-interface.doxyconf-latex.in (1.2),
+ user-prolog-interface.doxyconf-html.in (1.7),
+ user-prolog-interface.doxyconf-latex.in (1.8),
+ user.doxyconf-html.in (1.43), user.doxyconf-latex.in (1.14):
+ Updated.
+
+2008-09-06 Saturday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-ocaml-interface.doxyconf-html.in (bounded_arithmetic.1):
+ file user-ocaml-interface.doxyconf-html.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-06 Saturday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-ocaml-interface.doxyconf-latex.in
+ (bounded_arithmetic.1): file
+ user-ocaml-interface.doxyconf-latex.in was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-06 Saturday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.255): Remember to make
+
+ void set_rounding_for_PPL()
+ void restore_pre_PPL_rounding()
+
+ available in all the interfaces.
+
+2008-09-06 Saturday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/randphull1.cc (1.15): Reset the rounding mode to
+ its pre-PPL state before doing any non-PPL floating point
+ computation. This is to avoid bugs as
+ http://sources.redhat.com/bugzilla/show_bug.cgi?id=6869 and also
+ to test the rounding-mode setting/resetting functions. When
+ NDEBUG is not defined, limit the maximum space dimension tested
+ by test02() to 4 (instead of 6).
+
+2008-09-06 Saturday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in (1.88), doc/devref.doxyconf-latex.in
+ (1.27), src/Init.cc (1.36), src/Init.defs.hh (1.21),
+ src/Init.inlines.hh (1.9), src/Makefile.am (1.183): New functions
+
+ void set_rounding_for_PPL()
+ void restore_pre_PPL_rounding()
+
+ sets the FPU rounding mode as it was before initialization of the
+ PPL, and sets it so that the PPL abstractions based on floating
+ point numbers work correctly, respectively.
+
+2008-09-06 Saturday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.inlines.hh (bounded_arithmetic.1): file Init.inlines.hh
+ was added on branch bounded_arithmetic on 2008-09-11 20:37:49
+ +0000
+
+2008-09-06 Saturday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/gprolog_efli.cc (1.3), XSB/xsb_efli.cc
+ (1.4): Two FIXMEs resolved.
+
+2008-09-06 Saturday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_efli.cc (bounded_arithmetic.1):
+ file gprolog_efli.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:47 +0000
+
+2008-09-06 Saturday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_efli.cc (bounded_arithmetic.1): file
+ xsb_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-09-05 Friday 22:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.32): Add the predicates:
+ ppl_Polyhedron_constrains/2,
+ ppl_Polyhedron_unconstrain_space_dimension/2,
+ ppl_Polyhedron_unconstrain_space_dimensions/2, to the "import"
+ list.
+
+2008-09-05 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.62), libppl.3 (1.1): Started drafting a
+ libppl(3) man page.
+
+2008-09-05 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/libppl.3 (bounded_arithmetic.1): file libppl.3 was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-05 Friday 19:27 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.53),
+ ppl_java_common.cc (1.40), ppl_java_common.hh (1.36),
+ ppl_java_globals.cc (1.10): Use always `set_ptr' to set the value
+ of the C++ object pointer in the Java world, this makes the code
+ cleaner. This was made also to implement (in a near future)
+ de-allocation with the recently added functions in
+ `marked_pointers.hh' Changed the `set_ptr' definition to avoid
+ casts in the code.
+
+2008-09-05 Friday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.67), ppl_prolog_sysdep.hh
+ (1.2), xsb_efli.cc (1.3): The XSB interface now supports separate
+ compilation.
+
+2008-09-05 Friday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-09-05 Friday 15:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.66): Added code for
+ generating ppl_xsb.hh.
+
+2008-09-05 Friday 15:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/: ppl_interface_generator_xsb_cc.m4 (1.16),
+ ppl_interface_generator_xsb_hh.m4 (1.1): Split the generating
+ file so as to generate 2 C++ files, ppl_xsb.hh (containing only
+ the "defines") and ppl_xsb.cc for the rest.
+
+2008-09-05 Friday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
+ (bounded_arithmetic.1): file ppl_interface_generator_xsb_hh.m4
+ was added on branch bounded_arithmetic on 2008-09-11 20:37:48
+ +0000
+
+2008-09-05 Friday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_cfli.hh (1.6): Added a missing `inline'
+ qualifier.
+
+2008-09-05 Friday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.61): Updated the definition of
+ DEVREF_PROLOG_INTERFACE_STUFF.
+
+2008-09-05 Friday 13:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.15):
+ Reorder the lines for the divert(1) and divert(2) and #include
+ ...
+
+2008-09-05 Friday 13:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bit_Matrix.cc (1.6), checked.cc (1.23), conversion.cc
+ (1.86): Added missing inclusions of <climits>.
+
+2008-09-05 Friday 13:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_efli.cc (1.2): Removed some unwanted
+ PPL:: qualifications.
+
+2008-09-05 Friday 10:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.14):
+ Restored some divert(n)'s.
+
+2008-09-05 Friday 10:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc (1.10): Corrected test04.
+
+2008-09-05 Friday 10:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.254), src/Polyhedron_public.cc (1.136): (Temporarily)
+ Reverted previous change, as it was causing too many troubles in
+ the tests for the Partially_Reduced_Product.
+
+2008-09-05 Friday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.inlines.hh (1.72): Fixed Constraint
+ operator==(Variable, Variable).
+
+2008-09-05 Friday 08:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/congruences1.cc (1.15): Update test according to
+ new specification for addition of congruences.
+
+2008-09-04 Thursday 22:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset4.cc (1.2): Fixed tests 13 and 15,
+ which were still assuming the old specification of
+ add_congruence(s).
+
+2008-09-04 Thursday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset4.cc (bounded_arithmetic.1): file
+ pointsetpowerset4.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-09-04 Thursday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.34): Include <climits>.
+
+2008-09-04 Thursday 21:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.253): Moved one item to the section "PPL 0.11 or later".
+
+2008-09-04 Thursday 21:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.45), configure.ac (1.336): Added a new configure
+ option `--enable-check' accepting the values `thorough', for the
+ ordinary lengthy process, and `quick', for a quicker process yet
+ to be defined. The default for the CVS distribution is
+ `thorough', whereas tar and zip packages built with `make dist'
+ default to `quick'.
+
+2008-09-04 Thursday 19:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: ppl-config.1 (1.7), ppl_lcdd.1 (1.5), ppl_lpsol.1 (1.5):
+ Updated.
+
+2008-09-04 Thursday 17:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.130), Constraint.inlines.hh (1.71):
+ Resolved a couple of TODOs: now Constraint operator>=(Variable,
+ Variable) and Constraint operator>(Variable, Variable) have
+ optimal implementations.
+
+2008-09-04 Thursday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.80): Comments improved.
+
+2008-09-04 Thursday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.129), Constraint.inlines.hh (1.70):
+ TODO resolved: Constraint operator==(Variable, Variable) has now
+ an optimal implementation.
+
+2008-09-04 Thursday 16:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_Expression.defs.hh (1.39),
+ Linear_Expression.inlines.hh (1.14): Spurious \relates command
+ removed. New private constructor Linear_Expression(Variable v,
+ Variable w) builds the linear expression corresponding to the
+ difference of `v' and `w'. FIXME resolved: Linear_Expression
+ operator-(Variable, Variable) has now an optimal implementation.
+
+2008-09-04 Thursday 15:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: addcongruence1.cc (1.11), addcongruences1.cc
+ (1.14): Adapted tests for addcongruence(s) so as to meet the new
+ specification.
+
+2008-09-04 Thursday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.135): Adapted implementation of
+ methods add_congruence(s) so as to meet their specification.
+
+2008-09-04 Thursday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.346), Polyhedron.templates.hh (1.21):
+ The templatic constructor of a Polyhedron from a box now requires
+ that the box is indeed an instantiation of the Box class
+ template; documentation simplified accordingly. Fixed
+ documentation regarding the addition of congruences, so as to
+ better specify when an exception is thrown.
+
+2008-09-04 Thursday 13:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.59), NNC_Polyhedron.defs.hh (1.61):
+ Fixed minor problems in the documentation of constructors.
+
+2008-09-04 Thursday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Matrix.templates.hh (1.9), OR_Matrix.templates.hh (1.8):
+ Two FIXMEs resolved.
+
+2008-09-04 Thursday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval_Info.defs.hh (1.11), Interval_Restriction.defs.hh
+ (1.12): Comments improved.
+
+2008-09-04 Thursday 08:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: ascii_dump_load1.cc (1.9), refinewithconstraints2.cc
+ (1.2): Corrected test04 of ascii_dump_load1.cc. Temporarily
+ disabled test02 of refinewithconstraints2.cc.
+
+2008-09-04 Thursday 00:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.templates.hh (1.2): Avoid assertions in the
+ ascii_load method: return false instead.
+
+2008-09-04 Thursday 00:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.templates.hh (bounded_arithmetic.1): file
+ Checked_Number.templates.hh was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:49 +0000
+
+2008-09-04 Thursday 00:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.inlines.hh (1.40): Interval's ascii_dump/load
+ methods are now based on corresponding functions for the boundary
+ datatype.
+
+2008-09-04 Thursday 00:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.98), Checked_Number.templates.hh
+ (1.1), Makefile.am (1.182): Drafted ascii_dump/load functions for
+ native and checked numbers: inexact numbers dump both hexadecimal
+ and pretty printed representations.
+
+2008-09-03 Wednesday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh (1.11): Corrected the handling of
+ __STDC_LIMIT_MACROS.
+
+2008-09-03 Wednesday 22:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (1.23): Changed #if to #ifdef.
+
+2008-09-03 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.345): Little improvement to a comment.
+
+2008-09-03 Wednesday 20:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.344): Dealt with a couple of FIXME's
+ related to documentation.
+
+2008-09-03 Wednesday 19:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc (1.8): Some improvements to the
+ ascii_dump test.
+
+2008-09-03 Wednesday 18:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Interval_Info.defs.hh (1.10), Interval_Info.inlines.hh
+ (1.9): When ascii_dumping interval info, do set/reset hexadecimal
+ output before/after dumping a bitset.
+
+2008-09-03 Wednesday 18:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh (1.9): Do not define ascii_dump/load
+ twice.
+
+2008-09-03 Wednesday 18:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.57), Interval.inlines.hh (1.39),
+ Interval_Info.defs.hh (1.8), Interval_Info.inlines.hh (1.8):
+ Started drafting appropriate ascii_dump/load methods for
+ Interval.
+
+2008-09-03 Wednesday 18:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Boundary.defs.hh (1.14): Tell which namespace is being
+ closed.
+
+2008-09-03 Wednesday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc (1.7): Temporarily commented out
+ the invocation of test07().
+
+2008-09-03 Wednesday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.335), interfaces/Prolog/GNU/Makefile.am (1.73),
+ interfaces/Prolog/SICStus/Makefile.am (1.90),
+ interfaces/Prolog/SWI/Makefile.am (1.88),
+ interfaces/Prolog/XSB/Makefile.am (1.65),
+ interfaces/Prolog/YAP/Makefile.am (1.62): Fixed several
+ distribution issues.
+
+2008-09-03 Wednesday 15:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.52), GNU/Makefile.am (1.72),
+ SICStus/Makefile.am (1.89), SWI/Makefile.am (1.87),
+ XSB/Makefile.am (1.64), YAP/Makefile.am (1.61): Corrected several
+ variable's definitions.
+
+2008-09-03 Wednesday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.64), ascii_dump_load1.cc (1.6): Added
+ test07(), which fails. Commented out the invocation of several
+ other tests that are waiting for adaptation to boxes.
+
+2008-09-03 Wednesday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.63),
+ ppl_interface_generator_xsb_cc.m4 (1.13), ppl_prolog_sysdep.hh
+ (1.1), xsb_efli.cc (1.1), xsb_efli.hh (1.1): Started adapting the
+ XSB interface in order to support separate compilation.
+
+2008-09-03 Wednesday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_efli.hh (bounded_arithmetic.1): file
+ xsb_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-09-03 Wednesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_efli.cc (bounded_arithmetic.1):
+ file sicstus_efli.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:47 +0000
+
+2008-09-03 Wednesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/gprolog_efli.cc (1.2), SWI/swi_efli.cc
+ (1.3), SICStus/sicstus_efli.cc (1.2): Comments belong to the
+ header files: removed from the implementation files.
+
+2008-09-03 Wednesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_efli.cc (bounded_arithmetic.1): file
+ swi_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-09-02 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:47 +0000
+
+2008-09-02 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_efli.hh (bounded_arithmetic.1):
+ file sicstus_efli.hh was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:47 +0000
+
+2008-09-02 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.334), interfaces/Prolog/SICStus/Makefile.am
+ (1.88),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.14), interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.1),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.20),
+ interfaces/Prolog/SICStus/sicstus_efli.cc (1.1),
+ interfaces/Prolog/SICStus/sicstus_efli.hh (1.1): The SICStus
+ Prolog interface now uses separate compilation.
+
+2008-09-02 Tuesday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog_common.cc (1.3),
+ ppl_prolog_common.defs.hh (1.3): Fixed the declaration of
+ `prolog_interface_atoms'.
+
+2008-09-01 Monday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.333), interfaces/Prolog/YAP/Makefile.am (1.60),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.11),
+ interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.1),
+ interfaces/Prolog/YAP/yap_cfli.hh (1.6),
+ interfaces/Prolog/YAP/yap_efli.cc (1.1),
+ interfaces/Prolog/YAP/yap_efli.hh (1.1): Enabled separate
+ compilation in the YAP interface.
+
+2008-09-01 Monday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-09-01 Monday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_efli.cc (bounded_arithmetic.1): file
+ yap_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-09-01 Monday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_efli.hh (bounded_arithmetic.1): file
+ yap_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-09-01 Monday 11:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.5): Started adjusting the
+ polyehdra domain documentation for the C language interface;
+ function categorized as either generic domain functions or ad hoc
+ functions for the domain of polyhedra, so as to clarify which
+ ones are also available for other domain instantiations.
+
+2008-08-31 Sunday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_efli.hh (bounded_arithmetic.1):
+ file gprolog_efli.hh was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:47 +0000
+
+2008-08-31 Sunday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:47 +0000
+
+2008-08-31 Sunday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.332), interfaces/Prolog/ppl_prolog_common.defs.hh
+ (1.2), interfaces/Prolog/GNU/Makefile.am (1.71),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.9),
+ interfaces/Prolog/GNU/gprolog_efli.cc (1.1),
+ interfaces/Prolog/GNU/gprolog_efli.hh (1.1),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.47),
+ interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.1),
+ interfaces/Prolog/SICStus/Makefile.am (1.87): The GNU Prolog
+ interface now supports separate compilation.
+
+2008-08-31 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.86), ppl_prolog_sysdep.hh
+ (1.2), swi_efli.hh (1.4): Some cosmetic changes. Some FIXMEs
+ added.
+
+2008-08-31 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
+ (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-08-31 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_efli.hh (bounded_arithmetic.1): file
+ swi_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:48 +0000
+
+2008-08-31 Sunday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.331): Added checks required to validate an
+ horrible kludge working around an horrible bug in <gprolog.h>
+ (see
+ http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+
+2008-08-30 Saturday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_efli.hh (1.3): Exploit the inclusion of
+ "ppl.hh" in order to have <stdint.h> and/or <inttypes.h> already
+ included the proper way.
+
+2008-08-30 Saturday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (1.10): Include <stdint.h> nor
+ <inttypes.h>.
+
+2008-08-30 Saturday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Float.defs.hh (1.30), Float.inlines.hh (1.33),
+ checked_int.inlines.hh (1.67): Do not include <stdint.h> and/or
+ <inttypes.h>: these are included by "ppl-config.h".
+
+2008-08-30 Saturday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh (1.10): Make sure __STDC_LIMIT_MACROS is
+ restored at the end of <ppl.hh>. Similarly, make sure NDEBUG is
+ restored exactly to its original definition.
+
+2008-08-30 Saturday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.330): Make sure __STDC_LIMIT_MACROS is defined
+ before including <stdint.h>. For this and other reasons,
+ <stdint.h> should be only included from "ppl-config.h".
+
+2008-08-30 Saturday 17:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_double_binary_format.m4 (1.9),
+ ac_cxx_float_binary_format.m4 (1.7),
+ ac_cxx_long_double_binary_format.m4 (1.8): Make sure
+ __STDC_LIMIT_MACROS is defined before including <stdint.h>.
+
+2008-08-30 Saturday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ax_prefix_config_h.m4 (1.2): Updated.
+
+2008-08-29 Friday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.85): Dependencies fixed.
+
+2008-08-29 Friday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.cc (1.16): Use the new
+ implementation of marked pointers.
+
+2008-08-29 Friday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.32), marked_pointers.hh (1.1):
+ Implementation of marked pointers for use in the PPL foreign
+ interfaces.
+
+2008-08-29 Friday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/marked_pointers.hh (bounded_arithmetic.1): file
+ marked_pointers.hh was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:41 +0000
+
+2008-08-28 Thursday 20:56 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.38), ppl_ocaml_globals.cc (1.15): Added three functions to
+ deal with the last bit of a pointer. These are added and used in
+ the interface to avoid unwanted `delete' calls on iterated
+ objects: e.g. object get by `get_disjunct'.
+
+2008-08-28 Thursday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.88): Typo fixed.
+
+2008-08-27 Wednesday 22:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.87): Added missing `inline'
+ qualifier.
+
+2008-08-27 Wednesday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.86): Work around a limitation of
+ Cygwin, which has proper long doubles but does not provide
+ rintl().
+
+2008-08-27 Wednesday 21:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh (1.13): Work around a bug of GCC 4.0.x.
+
+2008-08-26 Tuesday 19:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.inlines.hh (1.38): (Temporarily?) Commented out call
+ to method OK() in operator<<(), which is also used by method
+ ascii_dump().
+
+2008-08-26 Tuesday 19:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.56): Avoid long lines in method OK();
+ when doing output on std::cerr, prefer "\n" to std::endl.
+
+2008-08-26 Tuesday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.121): Corrected spelling typo in comment.
+
+2008-08-26 Tuesday 12:56 Andrea Cimino
+
+ * interfaces/Java/:
+ ppl_interface_generator_java_procedure_generators.m4 (1.7),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.52), jni/ppl_java_common.cc (1.39), jni/ppl_java_common.hh
+ (1.35), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.32): Implemened the following methods in the Java interface:
+ ppl_ at CLASS@_ascii_dump/1
+ ppl_ at CLASS@_ at PARTITION@/4 +pointset_powerset \grid
+
+ To do so, a new Pair class has been introduced to
+ wrap the result of a CXX std::pair class.
+
+2008-08-25 Monday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.252), interfaces/Prolog/SWI/README.swiprolog (1.3): In
+ the SWI-Prolog documentation, the command to dynamically load the
+ library has been modified so as to specify the `.so' extension:
+ this seems to be required under Mac OS X and seems not to do any
+ harm under GNU/Linux.
+
+2008-08-25 Monday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.232), configure.ac (1.329), fedora/ppl.spec (1.5),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.19), interfaces/Prolog/SWI/swi_cfli.hh (1.9),
+ interfaces/Prolog/SWI/swi_efli.cc (1.2),
+ interfaces/Prolog/SWI/swi_efli.hh (1.2): The preferred spelling
+ is `SWI-Prolog', not `SWI Prolog'.
+
+2008-08-25 Monday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: ppl_interface_generator_copyright (1.7),
+ Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.5),
+ Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.6),
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.18),
+ Prolog/SWI/swi_pl_check.pl (1.12),
+ Prolog/SWI/swi_predicate_check.pl (1.7): Fixed several comments
+ and meta-comments.
+
+2008-08-25 Monday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.inlines.hh
+ (bounded_arithmetic.1): file ppl_prolog_common.inlines.hh was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-25 Monday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.328), interfaces/Prolog/Makefile.am (1.51),
+ interfaces/Prolog/exceptions.hh (1.27),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+ (1.3),
+ interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.4),
+ interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+ (1.5),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.69),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_files.m4
+ (1.2), interfaces/Prolog/ppl_prolog_common.cc (1.2),
+ interfaces/Prolog/ppl_prolog_common.defs.hh (1.1),
+ interfaces/Prolog/ppl_prolog_common.icc (1.16),
+ interfaces/Prolog/ppl_prolog_common.inlines.hh (1.1),
+ interfaces/Prolog/track_allocation.hh (1.25),
+ interfaces/Prolog/SWI/Makefile.am (1.84),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.17), interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.1),
+ interfaces/Prolog/SWI/swi_efli.cc (1.1),
+ interfaces/Prolog/SWI/swi_efli.hh (1.1): Prolog interfaces
+ reorganized. Only the interface for SWI Prolog is operational;
+ the others will follow.
+
+2008-08-24 Sunday 12:55 Andrea Cimino
+
+ * interfaces/OCaml/tests/test1.ml (1.10): Test if the number of
+ constraints of a Constraint_System get by calling
+ `minimized_constraints' on a Polyhedron built from Universe and
+ with dimension greater than zero is zero.
+
+2008-08-24 Sunday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc (bounded_arithmetic.1):
+ file simplifyusingcontext1.cc was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-08-24 Sunday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/simplifyusingcontext1.cc (1.2): test02() must
+ fail with 8-bit coefficients.
+
+2008-08-23 Saturday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (bounded_arithmetic.1):
+ file simplifyusingcontext1.cc was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:56 +0000
+
+2008-08-23 Saturday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/simplifyusingcontext1.cc (1.2): test05() must fail
+ with 8-bit coefficients.
+
+2008-08-23 Saturday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/Makefile.am (bounded_arithmetic.1): file
+ Makefile.am was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:55 +0000
+
+2008-08-23 Saturday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Polyhedron/Makefile.am (1.127),
+ Polyhedron/interspreservenlarge1.cc (1.10),
+ Polyhedron/simplifyusingcontext1.cc (1.1), Powerset/Makefile.am
+ (1.4), Powerset/interspreservenlarge1.cc (1.6),
+ Powerset/simplifyusingcontext1.cc (1.1): Test program renamed.
+
+2008-08-23 Saturday 17:39 Andrea Cimino
+
+ * interfaces/Java/tests/Test_Executor.java (1.2): Starting from JDK
+ 1.5 there is no need to convert Boolean (class) to boolean
+ (simple types) when using if statements. Simplified.
+
+2008-08-23 Saturday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Test_Executor.java (bounded_arithmetic.1):
+ file Test_Executor.java was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:44 +0000
+
+2008-08-23 Saturday 17:33 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.14),
+ Makefile.am (1.20), NNC_Polyhedron_test1.java (1.1),
+ Test_Executor.java (1.1): Non generated tests have been split in
+ two separated files, one related to NNC_Polyhedron, another one
+ to C_Polyhedron. Added a new class (Text_Executor) that executes
+ all the tests found in a class.
+
+2008-08-23 Saturday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/NNC_Polyhedron_test1.java
+ (bounded_arithmetic.1): file NNC_Polyhedron_test1.java was added
+ on branch bounded_arithmetic on 2008-09-11 20:37:44 +0000
+
+2008-08-22 Friday 17:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.327): Fixed the generation of the file names for
+ the Prolog and Java interfaces. Version number bumped.
+
+2008-08-22 Friday 16:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.37), ppl_interface_generator_ocaml_ml_code.m4 (1.34),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.26),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.6): The
+ same as in the previous commit - but for the OCaml interface.
+
+2008-08-22 Friday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ocaml_test_ml_code.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-22 Friday 16:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.77),
+ ppl_interface_generator_common_procedure_generators.m4 (1.24),
+ C/C_interface.dox (1.4), C/ppl_interface_generator_c_cc_code.m4
+ (1.36), C/ppl_interface_generator_c_h_code.m4 (1.26),
+ Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.2),
+ Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.5),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.68),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.78), Java/Java_interface.dox (1.2),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.51), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.31): The Prolog predicate simplify_using_context_assign has 3
+ arguments the third for the Boolean result.
+
+ As a result, special schematic code for all the interfaces needed
+ to be provided just for this method (previously it had used the
+ schematic code for the binary operators with the "and_minimize"
+ option).
+
+ The documentation for C and Java updated for this method.
+
+2008-08-22 Friday 16:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.134): Modified method
+ simplify_using_context_assign(): more simplifications detected
+ (now test06 in test/Polyhedron/interpreservenlarge1.cc succeeds).
+
+2008-08-22 Friday 13:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.133): Solved the problem causing an
+ assertion to fail in test06. Correction still incomplete, since
+ simplification fails to detect some redundant inequalities as
+ such.
+
+2008-08-22 Friday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.9): Fixed test
+ showing bug.
+
+2008-08-22 Friday 12:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.132): Previous change reverted: it
+ wasn't the proper fix.
+
+2008-08-22 Friday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.131): Corrected variable naming typo
+ causing an assertion failure (as witnessed by test06 in
+ test/Polyhedron/interspreservenlarge1.cc).
+
+2008-08-22 Friday 11:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.8): New test
+ (test06) shows a bug in simplify_using_context_assign().
+
+2008-08-21 Thursday 22:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.128), Box.defs.hh (1.60), Grid.defs.hh
+ (1.76), Octagonal_Shape.defs.hh (1.54), Pointset_Powerset.defs.hh
+ (1.50), Polyhedron.defs.hh (1.343): Fixed doxygen
+ cross-references for simplify_using_context_assign.
+
+2008-08-21 Thursday 22:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.216): Drafted an improved specification
+ for the operator providing simplification using a given context;
+ also specified for the case of a powerset domain. (To be double
+ checked).
+
+2008-08-21 Thursday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.85): FIXME added.
+
+2008-08-21 Thursday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_binary_format.m4 (1.8):
+ AC_CXX_DOUBLE_BINARY_FORMAT depends on AC_C_BIGENDIAN: enforce
+ this with AC_REQUIRE.
+
+2008-08-21 Thursday 17:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.76),
+ OCaml/tests/test1.ml (1.9): Changed the name of the new method in
+ the interfaces.
+
+2008-08-21 Thursday 16:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.127), BD_Shape.templates.hh (1.111),
+ Box.defs.hh (1.59), Box.templates.hh (1.120), Grid.defs.hh
+ (1.75), Grid_public.cc (1.78), Octagonal_Shape.defs.hh (1.53),
+ Octagonal_Shape.templates.hh (1.83), Pointset_Powerset.defs.hh
+ (1.49), Pointset_Powerset.templates.hh (1.40), Polyhedron.defs.hh
+ (1.342), Polyhedron_public.cc (1.130): Method
+ intersection_preserving_enlarge_assign() renamed as
+ simplify_using_context_assign().
+
+2008-08-21 Thursday 16:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Polyhedron/interspreservenlarge1.cc (1.7),
+ Powerset/interspreservenlarge1.cc (1.5): Test changed to use new
+ method name.
+
+2008-08-21 Thursday 16:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.75),
+ ppl_interface_generator_common_procedure_generators.m4 (1.23):
+ Ensure the new method is generated for all the domains that
+ support it. Name still needs revising.
+
+2008-08-21 Thursday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.110), Box.inlines.hh (1.34),
+ Box.templates.hh (1.119), Octagonal_Shape.templates.hh (1.82): In
+ several comments, correct typo (emptyness ==> emptiness).
+
+2008-08-21 Thursday 16:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_copyright (1.6),
+ Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.4): Include
+ the copyright notice in the generated files.
+
+2008-08-21 Thursday 16:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+ (1.2): Added an #include "sysdep.hh" line to each generated cc
+ file.
+
+2008-08-21 Thursday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.326): We don't need the `win32-dll' option of
+ `LT_INIT'.
+
+2008-08-21 Thursday 13:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/interspreservenlarge1.cc (1.4): Test test08() no
+ longer fails.
+
+2008-08-21 Thursday 13:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.129): Corrected the method for
+ simplification of polyhedra wrt context so that to avoid
+ converting a masked equality (i.e., an inequality that implies an
+ equality in the given context) to a proper equality; for
+ instance, now simplifying PH1 = { A >= 0 } in the context of PH2
+ = { A <= 0 } returns PH1, instead of PH3 = { A == 0 }. The
+ correction ensures that the method is extensive on the polyhedra
+ domain and hence solves the corresponding bug in the
+ Pointset_Powerset domain.
+
+2008-08-21 Thursday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.325): Temporarily removed all the Prolog
+ interfaces from the ones that are built by default (this is not
+ to disturb the work of people not interested in them).
+
+2008-08-21 Thursday 11:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.4): Add header for the binary operations.
+
+2008-08-21 Thursday 11:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.3): Missing ";" added.
+
+2008-08-21 Thursday 11:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+ (1.3): Fixed a typo.
+
+2008-08-21 Thursday 11:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+ (1.2): Removed some unwanted code.
+
+2008-08-21 Thursday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.68): Allow the PPL to be compiled and used
+ even on platforms where we are unable to detect the binary format
+ used by doubles.
+
+2008-08-21 Thursday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.83): Separately compile the
+ C++ sources of the interface.
+
+2008-08-21 Thursday 10:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_hh_files.m4
+ (1.2), ppl_prolog_common.cc (1.1): Removed redundant code from
+ the m4 file and renaming the common code file.
+
+2008-08-21 Thursday 10:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.324): Compute the names of C++ domain-specific
+ files for the Prolog interfaces: headers, sources and objects.
+
+2008-08-21 Thursday 09:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.50),
+ ppl_interface_generator_prolog_cc_code.m4 (1.1),
+ ppl_interface_generator_prolog_cc_files.m4 (1.1),
+ ppl_interface_generator_prolog_hh_code.m4 (1.1),
+ ppl_interface_generator_prolog_hh_files.m4 (1.1): New files to
+ enable separate compilation of the Prolog interface code.
+
+2008-08-21 Thursday 09:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.74): The new
+ method intersection_preserving_enlarge_assign now returns a
+ Boolean. At the moment the new version is only enabled for
+ Polyhedra, but this will be fixed later.
+
+2008-08-21 Thursday 00:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/interspreservenlarge1.cc (1.3): Test test05() now
+ succeeds. New test test08() shows a bug due to the uncorrect
+ handling of inequalities that happen to imply equalities in parts
+ of the given powerset context.
+
+2008-08-20 Wednesday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.128): Implemented the announced
+ heuristics in
+ Polyhedron::intersection_preserving_enlarge_assign(const
+ Polyhedron&).
+
+2008-08-20 Wednesday 17:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh (1.8): For the declaration of ffs(3),
+ include <strings.h> and not <cstring> (note that in configure.ac
+ we correctly have AC_CHECK_DECLS([ffs], , , [#include
+ <strings.h>]).
+
+2008-08-20 Wednesday 12:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/interspreservenlarge1.cc (1.2): Added three more
+ tests, one (temporarily) known to fail.
+
+2008-08-20 Wednesday 12:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.6): Added another
+ test (test05).
+
+2008-08-20 Wednesday 12:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.126), BD_Shape.templates.hh (1.109),
+ Box.defs.hh (1.58), Box.templates.hh (1.118), Grid.defs.hh
+ (1.74), Grid_public.cc (1.77), Octagonal_Shape.defs.hh (1.52),
+ Octagonal_Shape.templates.hh (1.81), Pointset_Powerset.defs.hh
+ (1.48), Pointset_Powerset.templates.hh (1.39), Polyhedron.defs.hh
+ (1.341), Polyhedron_public.cc (1.127): The method
+ intersection_preserving_enlarge_assign() now returns a boolean:
+ if false is returned the intersection is empty. Using the new
+ return value, improved the implementation for Pointset_Powerset
+ by dropping those disjuncts that have empty intersection with all
+ of the disjunct of the context. Corrected a bug in the
+ Polyhedron method regarding the correct handling of equality
+ constraints.
+
+2008-08-19 Tuesday 19:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/: Makefile.am (1.3), interspreservenlarge1.cc
+ (1.1): Added a few tests for method
+ intersection_preserving_enlarge_assign().
+
+2008-08-19 Tuesday 19:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.5): Added new test.
+
+2008-08-19 Tuesday 19:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.47),
+ Pointset_Powerset.templates.hh (1.38): Drafted a generic
+ implementation (better, an executable specification) for method
+ intersection_preserving_enlarge_assign(const Pointset_Powerset&);
+ the code is based on an auxiliary method void
+ intersection_preserving_enlarge(PS& y) const; that enlarges
+ argument y wrt context *this.
+
+2008-08-19 Tuesday 19:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.126): Corrected an error in method
+ intersection_preserving_enlarge_assign() and applied a few
+ efficiency enhancements.
+
+2008-08-19 Tuesday 15:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.5): Updated the list of missing procedures for the OCaml
+ interface.
+
+2008-08-19 Tuesday 15:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.36), ppl_interface_generator_ocaml_ml_code.m4 (1.33),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.25),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.5): More
+ bugs fixed in the specialized code for the powerset domains and
+ more tests added.
+
+2008-08-19 Tuesday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/ppl_ocaml_tests_common
+ (bounded_arithmetic.1): file ppl_ocaml_tests_common was added on
+ branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-19 Tuesday 15:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.35), ppl_interface_generator_ocaml_ml_code.m4 (1.32),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.24),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.4),
+ tests/ppl_ocaml_tests_common (1.3), tests/test1.ml (1.8): Added
+ code for generating some missing methods; fixed some bugs in the
+ ocaml interface code; extended the generated tests to cover most
+ methods: tests for special methods for the powerset domains still
+ missing.
+
+2008-08-19 Tuesday 11:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.34), ppl_interface_generator_ocaml_ml_code.m4 (1.31),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.23),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.3):
+ Several tests added and code for some missing methods added.
+ Every test now checks after the operation that the domain
+ element(s) are ok and prints "success" if it is and "failed"
+ otherwise.
+
+2008-08-19 Tuesday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+ (1.30), ppl_interface_generator_ocaml_mli_code.m4 (1.22),
+ tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.2),
+ tests/ppl_ocaml_tests_common (1.2): Improved the code for
+ generating tests. Fixed a bug in the code generation for OCaml
+ for the limited_..._extrapolation_assign method.
+
+2008-08-18 Monday 23:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/tests/: Makefile.am (1.7),
+ ppl_interface_generator_ocaml_test_ml.m4 (1.1),
+ ppl_interface_generator_ocaml_test_ml_code.m4 (1.1),
+ ppl_ocaml_tests_common (1.1): Code for generating tests for the
+ OCaml interface. This is an initial series of generic tests; to
+ be improved and extended to include all the ppl user methods.
+
+2008-08-18 Monday 23:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+ (bounded_arithmetic.1): file
+ ppl_interface_generator_ocaml_test_ml.m4 was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-18 Monday 22:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.125),
+ tests/Polyhedron/interspreservenlarge1.cc (1.4): Drafted some
+ code (to be completed with the implementation of the indicated
+ heuristics) to handle the case of the empty intersection in
+ Polyhedron::intersection_preserving_enlarge_assign(const
+ Polyhedron& y).
+
+2008-08-18 Monday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.124): For method
+ intersection_preserving_enlarge_assign(), reverted to a simpler
+ implementation that does not change this until time of return.
+
+2008-08-18 Monday 13:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.3): Added another
+ test for intersection_preserving_enlarge_assign().
+
+2008-08-18 Monday 13:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.51): In method back_substitute(), avoid
+ assuming that x.num_rows() >= 1.
+
+2008-08-18 Monday 12:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/interspreservenlarge1.cc (1.2): Added new test
+ for zero-dim polyhedra.
+
+2008-08-18 Monday 12:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.123): Corrected new method
+ intersection_preserving_enlarge_assign wrt the handling of
+ zero-dimensional polyhedra.
+
+2008-08-18 Monday 11:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.73),
+ OCaml/tests/test1.ml (1.7): Enable the new method
+ intersection_preserving_enlarge_assign(y) in all the interfaces
+ for all domains except the products. Token test added to
+ OCaml/tests/test1.ml for this method.
+
+2008-08-18 Monday 10:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.49),
+ ppl_interface_generator_prolog_icc.m4 (1.17),
+ ppl_interface_generator_prolog_icc_files.m4 (1.1),
+ Ciao/ppl_ciao.cc (1.53), GNU/ppl_gprolog_sd.cc (1.46),
+ SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.13),
+ SWI/ppl_interface_generator_swiprolog_cc.m4 (1.16),
+ XSB/ppl_interface_generator_xsb_cc.m4 (1.12),
+ YAP/ppl_interface_generator_yap_cc.m4 (1.10): Instead of
+ generating the Prolog interface C++ file ppl_prolog.icc we now
+ generate ppl_prolog_main.icc and a separate file for each
+ generated domain.
+
+2008-08-18 Monday 10:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.125), BD_Shape.templates.hh (1.108),
+ Box.defs.hh (1.57), Box.templates.hh (1.117), Grid.defs.hh
+ (1.73), Grid_public.cc (1.76), Octagonal_Shape.defs.hh (1.51),
+ Octagonal_Shape.templates.hh (1.80), Pointset_Powerset.defs.hh
+ (1.46), Pointset_Powerset.templates.hh (1.37): Added trivial
+ implementations of method
+ intersection_preserving_enlarge_assign().
+
+2008-08-18 Monday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.126): Removed
+ interspreservenlarge1 and nnc_interspreservenlarge1 from
+ XFAIL_TESTS.
+
+2008-08-18 Monday 09:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.122): Fixed sortedness and low-level
+ constraints issues in method
+ intersection_preserving_enlarge_assign.
+
+2008-08-18 Monday 08:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.72),
+ OCaml/tests/test1.ml (1.6),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.77): Enabled affine_dimension() and is_topologically_closed()
+ for all domains including the powerset and product domains.
+
+ Minor change to OCaml/tests/test1.ml in preparation for
+ generating the file.
+
+2008-08-18 Monday 08:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/topclosed1.cc (1.4): Improved tests - better coverage
+ and comments.
+
+2008-08-18 Monday 08:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/topclosed1.cc (bounded_arithmetic.1): file
+ topclosed1.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:51 +0000
+
+2008-08-17 Sunday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.121), tests/Polyhedron/Makefile.am
+ (1.125): A more optimized version of
+ Polyhedron::intersection_preserving_enlarge_assign(const
+ Polyhedron&), currently causing assertion violations.
+
+2008-08-17 Sunday 16:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.124), interspreservenlarge1.cc
+ (1.1): New test program for
+ Polyhedron::intersection_preserving_enlarge_assign().
+
+2008-08-17 Sunday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.120): Continued drafting a prototype
+ for Polyhedron::intersection_preserving_enlarge_assign(const
+ Polyhedron&).
+
+2008-08-17 Sunday 16:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.340): Indentation fixed.
+
+2008-08-17 Sunday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplify.cc (1.53): Polyhedron::simplify(Linear_System& sys,
+ Bit_Matrix& sat) assumes `sys' has a nonzero number of columns:
+ added assertion.
+
+2008-08-17 Sunday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.50):
+ Linear_System::back_substitute(dimension_type
+ n_lines_or_equalities) assumes *this has nonzero numbers of rows
+ and of columns: added assertions checking these conditions.
+
+2008-08-17 Sunday 13:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.116): Corrected error: Box has no access
+ to Grid_Generator_System internals.
+
+2008-08-17 Sunday 12:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.templates.hh (1.115), Congruence_System.cc (1.29),
+ Generator_System.cc (1.27), Generator_System.defs.hh (1.28),
+ Generator_System.inlines.hh (1.12), Grid.templates.hh (1.35),
+ Grid_nonpublic.cc (1.34), Grid_public.cc (1.75), Grid_simplify.cc
+ (1.38), Grid_widenings.cc (1.18), Linear_System.cc (1.49),
+ Linear_System.inlines.hh (1.25), Matrix.defs.hh (1.85),
+ Matrix.inlines.hh (1.54), Polyhedron.templates.hh (1.20),
+ Polyhedron_chdims.cc (1.49), Polyhedron_nonpublic.cc (1.84),
+ Polyhedron_public.cc (1.119), Polyhedron_widenings.cc (1.67),
+ minimize.cc (1.50): Method Matrix::empty() renamed as
+ Matrix::has_no_rows() to avoid error prone name clashes with the
+ corresponding method in Constraint_System and Congruence_System.
+
+2008-08-17 Sunday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.339), simplify.cc (1.52): Let
+ Polyhedron::simplify(Linear_System&, Bit_Matrix&) return
+ dimension_type instead of int.
+
+2008-08-17 Sunday 00:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.30): In private method
+ adjust_topology_and_space_dimension, do not call recently
+ modified method empty(), as it disregards trivial constraints,
+ whereas here we want to know the internal structure of the
+ matrix.
+
+2008-08-16 Saturday 22:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/: Makefile.am (1.63), topclosed1.cc (1.3):
+ topclosed1.cc which tests is_topologically_closed(), has a typo
+ fixed and now enabled in the Makefile.
+
+2008-08-16 Saturday 22:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.templates.hh (1.36): A typo fixed.
+
+2008-08-16 Saturday 19:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.45),
+ Pointset_Powerset.templates.hh (1.35): Added a note to the
+ documentation of method constrains() regarding its intended
+ semantics, which may be different from the geometric intuition.
+ Improved the implementation of is_universe() so as to exploit/set
+ omega reduction if that is already available or easily provable.
+
+2008-08-16 Saturday 17:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.34): Corrected a bug in
+ affine_dimension().
+
+2008-08-16 Saturday 17:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset5.cc (1.2): Additional test shows
+ a bug in the implementation of affine_dimension() for
+ Pointset_Powerset<Rational_Interval>.
+
+2008-08-16 Saturday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset5.cc (bounded_arithmetic.1): file
+ pointsetpowerset5.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-08-16 Saturday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.118): Added an initial, untested and
+ incomplete implementation of
+ Polyhedron::intersection_preserving_enlarge_assign(const
+ Polyhedron&).
+
+2008-08-16 Saturday 16:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence_System.inlines.hh (1.12),
+ Constraint_System.inlines.hh (1.13): Corrected the implementation
+ of method empty(), which was not disregarding trivial
+ constraints/congruences.
+
+2008-08-16 Saturday 15:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.114): Typo corrected.
+
+2008-08-16 Saturday 14:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/Makefile.am (1.62): Typo fixed.
+
+2008-08-16 Saturday 14:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/topclosed1.cc (1.2): Typos fixed.
+
+2008-08-16 Saturday 14:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/: Makefile.am (1.61), topclosed1.cc (1.1): Added a test
+ file for is_toplogically_closed() for the Box domain. This is
+ not enabled as this does not compile.
+
+2008-08-16 Saturday 13:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.cc (1.22), Pointset_Powerset.defs.hh
+ (1.44), Pointset_Powerset.templates.hh (1.33): Reimplemented
+ method is_universe() so as to be faithful to the intended
+ specification (also removed the no longer useful specialization
+ for grids). Implemented method constrains().
+
+2008-08-16 Saturday 12:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.231), configure.ac (1.323), doc/devref.doxyconf-html.in
+ (1.87), doc/devref.doxyconf-latex.in (1.26), src/Makefile.am
+ (1.181), src/iterator_to_const.defs.hh (1.8), tests/Makefile.am
+ (1.268), tests/print.hh (1.46), tests/Polyhedron/maxspacedim1.cc
+ (1.17): The ask-and-tell classes are not ready for release: make
+ sure we do not release them (again) by mistake.
+
+2008-08-16 Saturday 12:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/tests/test1.ml (1.5): More small changes for its
+ future generation.
+
+2008-08-16 Saturday 11:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.322): Added a tentative set of default foreign
+ interface instantiations: most of it is commented out until we
+ implement separate compilation in the interfaces.
+
+2008-08-16 Saturday 11:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/tests/test1.ml (1.4): Small changes in
+ preparation for generating the tests.
+
+2008-08-16 Saturday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.251): Added an important item for PPL 0.10.
+
+2008-08-16 Saturday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.338): Drafted the declaration of new
+ method void intersection_preserving_enlarge_assign(const
+ Polyhedron& y).
+
+2008-08-16 Saturday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.215): Drafted a section about
+ intersection-preserving enlargements.
+
+2008-08-16 Saturday 10:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.48): Minor improvement to a comment.
+
+2008-08-16 Saturday 09:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.defs.hh (1.33): Fixed typo in
+ documentation.
+
+2008-08-16 Saturday 09:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.214),
+ src/Partially_Reduced_Product.defs.hh (1.32),
+ src/Pointset_Powerset.defs.hh (1.43): Added warnings that the
+ product and powerset domains should only be used with simple
+ (non-compound) domains for the disjunct of the powerset or
+ components of the product.
+
+2008-08-15 Friday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.321): Added Pointset_Powerset<C_Polyhedron> and
+ Pointset_Powerset<NNC_Polyhedron> to the set of default domain
+ instantiations.
+
+2008-08-15 Friday 17:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.250): Added an item for 0.11
+
+2008-08-15 Friday 17:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.249): New item added for PPL 0.11 or later version.
+
+2008-08-15 Friday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/product1.cc (bounded_arithmetic.1): file
+ product1.cc was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:56 +0000
+
+2008-08-15 Friday 16:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.42),
+ src/Pointset_Powerset.inlines.hh (1.16), tests/Makefile.am
+ (1.267), tests/Powerset/Makefile.am (1.2),
+ tests/Powerset/product1.cc (1.1): Allow for a powerset to be
+ built from a product.
+
+2008-08-15 Friday 16:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_preamble (1.14),
+ ppl_interface_generator_c_h_preamble (1.10): Added functions that
+ test for emptyness of constraint/generator/... systems.
+
+2008-08-15 Friday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.248): One new item added.
+
+2008-08-15 Friday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.230): Mention a name-change in the interfaces.
+
+2008-08-15 Friday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.229): A little bit of reorganization. Duplicate items
+ removed.
+
+2008-08-15 Friday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.29), Watchdog/ChangeLog (1.18): Updated.
+
+2008-08-15 Friday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.320), src/checked_mpz.inlines.hh (1.55): FIXME
+ resolved. We now require (for developers) Autoconf 2.60 or later
+ version.
+
+2008-08-15 Friday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset3.cc (1.2): Testing Grid
+ specialization for is_universe().
+
+2008-08-15 Friday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset3.cc (bounded_arithmetic.1): file
+ pointsetpowerset3.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-08-15 Friday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.cc (1.21), Pointset_Powerset.defs.hh
+ (1.41): Added specialization of method is_universe() for
+ powersets of grids.
+
+2008-08-15 Friday 10:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/test1.ml (1.3): Obsolete code removed.
+
+2008-08-15 Friday 10:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Powerset.defs.hh (1.32), Powerset.inlines.hh (1.22): Added
+ method upper_bound_assign_if_exact().
+
+2008-08-15 Friday 09:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.31),
+ Partially_Reduced_Product.inlines.hh (1.28): Drafted
+ implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 21:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.22): Disable constrains/2 for the powersets in the interfaces.
+
+2008-08-14 Thursday 20:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+ (1.29), ppl_interface_generator_ocaml_mli.m4 (1.14),
+ ppl_ocaml_globals.ml (1.9): More test code removed.
+
+2008-08-14 Thursday 20:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.33), ppl_ocaml_globals.cc (1.14), tests/Makefile.am (1.6):
+ Removed forgotten debug print statements. Removed useless file
+ inclusions, namespace directives, and test functions.
+
+2008-08-14 Thursday 20:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.319): Version number bumped.
+
+2008-08-14 Thursday 20:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.5): Link options fixed.
+
+2008-08-14 Thursday 19:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.21),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.76): Now enabled constrains, unconstrain_space_dimension and
+ unconstrain_space_dimensions for all simple domains ie Polyhedra,
+ Grids, Octagonal_Shapes, BD_Shapes, and Boxes
+
+ M4 code for generating tests for the different domains added to
+ the Prolog tests directory.
+
+2008-08-14 Thursday 16:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.72), Grid_public.cc (1.74): Drafted
+ implementation of method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 16:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.20),
+ C/ppl_interface_generator_c_cc_code.m4 (1.35),
+ C/ppl_interface_generator_c_h_code.m4 (1.25),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.50), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.30), Java/tests/ppl_java_tests_common (1.8),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.32),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.28),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.21),
+ OCaml/tests/test1.ml (1.2),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.67),
+ Prolog/tests/pl_check.pl (1.54): Added constrains,
+ unconstrain_space_dimension and unconstrain_space_dimensions for
+ the Polyhedron domain to all the interfaces.
+
+ Tests added for OCaml, Java and Prolog.
+
+2008-08-14 Thursday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.60), constrains1.cc (1.1): Added test
+ for method constrains().
+
+2008-08-14 Thursday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/constrains1.cc (bounded_arithmetic.1): file
+ constrains1.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:51 +0000
+
+2008-08-14 Thursday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.56), Box.templates.hh (1.113): Drfated
+ implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: Makefile.am (1.31), constrains1.cc (1.1):
+ Added test for new method constrains().
+
+2008-08-14 Thursday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/constrains1.cc (bounded_arithmetic.1): file
+ constrains1.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:55 +0000
+
+2008-08-14 Thursday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.50),
+ Octagonal_Shape.templates.hh (1.79): Drafted implementation for
+ method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 14:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.77), constrains1.cc (1.1): Added
+ test for new method constrains(). Corrected a bug in the tests
+ whereby the test congruences1 was using the sources for
+ constraints1.
+
+2008-08-14 Thursday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/constrains1.cc (bounded_arithmetic.1): file
+ constrains1.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:51 +0000
+
+2008-08-14 Thursday 14:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.124), BD_Shape.inlines.hh (1.163),
+ BD_Shape.templates.hh (1.107): Drafted implementation of method
+ bool constrains() const;
+
+2008-08-14 Thursday 00:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.4): Use the -o option of
+ `ocamlc'.
+
+2008-08-13 Wednesday 13:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.34),
+ ppl_interface_generator_c_h_code.m4 (1.24): Fixed a bug(s) that
+ was preventing the generation of code for
+ get_[minimized_]_[constraints,generators,congruences] methods.
+
+2008-08-13 Wednesday 12:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/tests/Makefile.am (1.3): Define test1_SOURCES.
+
+2008-08-13 Wednesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.42): Use the -o option of
+ `ocamlc'. Note: it should be specified before the source file.
+
+2008-08-12 Tuesday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.247): Added one item for PPL 0.10.
+
+2008-08-12 Tuesday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.60),
+ doc/devref-java-interface.doxyconf-html.in (1.2),
+ doc/devref-java-interface.doxyconf-latex.in (1.2),
+ doc/devref-java-interface.tex (1.2),
+ doc/user-java-interface.doxyconf-html.in (1.2),
+ doc/user-java-interface.doxyconf-latex.in (1.2),
+ doc/user-java-interface.tex (1.2),
+ interfaces/Java/Java_interface.dox (1.1),
+ interfaces/Java/Makefile.am (1.17): Added the required machinery
+ to generate the documentation for the Java interface.
+
+2008-08-12 Tuesday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-java-interface.tex (bounded_arithmetic.1): file
+ devref-java-interface.tex was added on branch bounded_arithmetic
+ on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-java-interface.tex (bounded_arithmetic.1): file
+ user-java-interface.tex was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.41): Distribute also
+ OCaml_interface.dox.
+
+2008-08-12 Tuesday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.48): Distribute also
+ Prolog_interface.dox.
+
+2008-08-12 Tuesday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-java-interface.doxyconf-html.in (1.1),
+ devref-java-interface.doxyconf-latex.in (1.1),
+ devref-java-interface.tex (1.1),
+ user-java-interface.doxyconf-html.in (1.1),
+ user-java-interface.doxyconf-latex.in (1.1),
+ user-java-interface.tex (1.1): New files for the Java interface
+ documentation.
+
+2008-08-12 Tuesday 16:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.318), interfaces/C/Makefile.am (1.41): Distribute
+ also C_interface.dox.
+
+2008-08-12 Tuesday 12:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.317), doc/devref-ocaml-interface.doxyconf-html.in
+ (1.1), doc/devref-ocaml-interface.doxyconf-latex.in (1.1),
+ doc/devref-prolog-interface.doxyconf-html.in (1.6): The machinery
+ to generate the OCaml documentation should now be in place. (The
+ documentation itself still needs a lot of work.)
+
+2008-08-12 Tuesday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-ocaml-interface.tex (bounded_arithmetic.1): file
+ devref-ocaml-interface.tex was added on branch bounded_arithmetic
+ on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.tex (bounded_arithmetic.1): file
+ devref-prolog-interface.tex was added on branch
+ bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.316), doc/Makefile.am (1.59),
+ doc/devref-ocaml-interface.tex (1.1),
+ doc/devref-prolog-interface.doxyconf-latex.in (1.6),
+ doc/devref-prolog-interface.tex (1.1): Added machinery to
+ generate the LaTeX developer's manual for the OCaml interface.
+ Fixed the generation of the same kind of documentation for the
+ Prolog interface.
+
+2008-08-12 Tuesday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.315), doc/Makefile.am (1.58),
+ doc/user-ocaml-interface.doxyconf-html.in (1.1),
+ interfaces/OCaml/OCaml_interface.dox (1.2): Added machinery to
+ generate the HTML documentation for the OCaml interface.
+
+2008-08-11 Monday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.314): Configure the interfaces/OCaml/tests
+ directory.
+
+2008-08-11 Monday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-latex.in (1.7): File
+ ppl_prolog.icc plays no role in the generation of the user's
+ manual.
+
+2008-08-11 Monday 18:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.40), tests/Makefile.am (1.2):
+ Got rid of some old kludges.
+
+2008-08-11 Monday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.39), test1.ml (1.32),
+ tests/.cvsignore (1.1), tests/Makefile.am (1.1), tests/test1.ml
+ (1.1): The OCaml test programs now have their own directory. Do
+ not install .cmo files: now everything is packed into
+ ppl_ocaml.cma.
+
+2008-08-11 Monday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.27):
+ Erroneous double underscore changed to single.
+
+2008-08-11 Monday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.313), doc/Makefile.am (1.57),
+ doc/user-ocaml-interface.doxyconf-latex.in (1.1),
+ doc/user-ocaml-interface.tex (1.1): New machinery to generate the
+ user's manual of the OCaml interface.
+
+2008-08-11 Monday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-ocaml-interface.tex (bounded_arithmetic.1): file
+ user-ocaml-interface.tex was added on branch bounded_arithmetic
+ on 2008-09-11 20:37:40 +0000
+
+2008-08-11 Monday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/OCaml_interface.dox (1.1): This will contain the
+ OCaml interface documentation that is not automatically
+ generated.
+
+2008-08-11 Monday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.15): Work around a bug of GCC 4.0.x.
+
+2008-08-10 Sunday 12:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.13):
+ Started the adaptation required to produce the OCaml interface
+ documentation using ocamldoc.
+
+2008-08-09 Saturday 22:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.246): Some items dealt with; others reconsidered.
+
+2008-08-09 Saturday 20:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.245), doc/definitions.dox (1.213): Added a section on
+ upward approximation to the library's documentation.
+
+2008-08-09 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset1.cc (bounded_arithmetic.1): file
+ pointsetpowerset1.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset2.cc (bounded_arithmetic.1): file
+ pointsetpowerset2.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/pointsetpowerset6.cc (bounded_arithmetic.1): file
+ pointsetpowerset6.cc was added on branch bounded_arithmetic on
+ 2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Powerset/powerset1.cc (bounded_arithmetic.1): file
+ powerset1.cc was added on branch bounded_arithmetic on 2008-09-11
+ 20:37:56 +0000
+
+2008-08-09 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.312), tests/Makefile.am (1.266),
+ tests/Polyhedron/Makefile.am (1.123),
+ tests/Polyhedron/pointsetpowerset1.cc (1.11),
+ tests/Polyhedron/pointsetpowerset2.cc (1.5),
+ tests/Polyhedron/pointsetpowerset3.cc (1.3),
+ tests/Polyhedron/pointsetpowerset4.cc (1.7),
+ tests/Polyhedron/pointsetpowerset5.cc (1.5),
+ tests/Polyhedron/pointsetpowerset6.cc (1.3),
+ tests/Polyhedron/powerset1.cc (1.23), tests/Powerset/.cvsignore
+ (1.1), tests/Powerset/Makefile.am (1.1),
+ tests/Powerset/pointsetpowerset1.cc (1.1),
+ tests/Powerset/pointsetpowerset2.cc (1.1),
+ tests/Powerset/pointsetpowerset3.cc (1.1),
+ tests/Powerset/pointsetpowerset4.cc (1.1),
+ tests/Powerset/pointsetpowerset5.cc (1.1),
+ tests/Powerset/pointsetpowerset6.cc (1.1),
+ tests/Powerset/powerset1.cc (1.1): Tests for the Powerset class
+ have now their own directory.
+
+2008-08-09 Saturday 19:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.311), tests/Makefile.am (1.265),
+ tests/Grid/Makefile.am (1.66), tests/Grid/directproduct1.cc
+ (1.49), tests/Grid/directproduct2.cc (1.16),
+ tests/Grid/directproduct3.cc (1.19), tests/Grid/directproduct4.cc
+ (1.15), tests/Grid/directproduct5.cc (1.11),
+ tests/Grid/directproduct6.cc (1.15),
+ tests/Grid/partiallyreducedproduct1.cc (1.12),
+ tests/Grid/partiallyreducedproduct2.cc (1.6),
+ tests/Grid/partiallyreducedproduct3.cc (1.5),
+ tests/Grid/partiallyreducedproduct4.cc (1.5),
+ tests/Partially_Reduced_Product/.cvsignore (1.1),
+ tests/Partially_Reduced_Product/Makefile.am (1.1),
+ tests/Partially_Reduced_Product/directproduct1.cc (1.1),
+ tests/Partially_Reduced_Product/directproduct2.cc (1.1),
+ tests/Partially_Reduced_Product/directproduct3.cc (1.1),
+ tests/Partially_Reduced_Product/directproduct4.cc (1.1),
+ tests/Partially_Reduced_Product/directproduct5.cc (1.1),
+ tests/Partially_Reduced_Product/directproduct6.cc (1.1),
+ tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+ (1.1),
+ tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+ (1.1),
+ tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+ (1.1),
+ tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+ (1.1): Tests for the Partially_Reduced_Product class have now
+ their own directory.
+
+2008-08-09 Saturday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (1.16): Use consistent template parameters.
+ Indentation fixed.
+
+2008-08-09 Saturday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.212): Improved the section on semantic
+ geometric descriptors.
+
+2008-08-09 Saturday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.244), doc/definitions.dox (1.211): Started working on the
+ completion and integration into the PPL manuals of the section
+ about the different kinds of geometric descriptors implemented by
+ the library.
+
+2008-08-09 Saturday 13:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc (1.3): Added missing inclusion of <ppl-config.h>.
+
+2008-08-09 Saturday 13:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc (bounded_arithmetic.1): file fpu-ia32.cc was
+ added on branch bounded_arithmetic on 2008-09-11 20:37:49 +0000
+
+2008-08-09 Saturday 12:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc (1.2): Added missing namespace qualification.
+
+2008-08-09 Saturday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.180), fpu-ia32.inlines.hh (1.21): Drafted
+ code to autodetect the presence of an SSE unit.
+
+2008-08-09 Saturday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.cc (1.1): New source file containing IA-32 floating
+ point unit non-inline related functions.
+
+2008-08-09 Saturday 11:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh (1.20): Starting from the 2.18.50.0.4
+ release of binutils, the x86 assembler no longer accepts `fnstsw
+ %eax': `fnstsw %ax' should be used instead.
+
+2008-08-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.310): The Ciao-Prolog interface is no longer
+ enabled by default. Version number bumped.
+
+2008-08-08 Friday 19:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.35), fpu-c99.inlines.hh (1.17),
+ fpu-ia32.inlines.hh (1.19), fpu-none.inlines.hh (1.9),
+ fpu-sparc.inlines.hh (1.11), fpu.defs.hh (1.20): Added stubs for
+ fpu_initialize_control_functions(): this will allow, e.g.,
+ detecting the presence of SSE support at run-time.
+
+2008-07-21 Monday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linearsystem1.cc (1.11): Unused variable
+ removed.
+
+2008-07-06 Sunday 08:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boxdifference1.cc (1.10): Fixed a couple of comments.
+
+2008-07-05 Saturday 21:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/boxdifference1.cc (1.9): More tests added. Comments
+ added to indicate what is being tested.
+
+2008-06-24 Tuesday 20:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.48): In methods normalize(),
+ sign_normalize() and strong_normalize(), do not reset the
+ sortedness flag if the number of rows is less than or equal to
+ one.
+
+2008-06-14 Saturday 23:25 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.37): Fixed typo.
+
+2008-06-14 Saturday 16:41 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.36): Forgotten fixes.
+
+2008-06-14 Saturday 16:17 Abramo Bagnara
+
+ * src/Boundary.defs.hh (1.12): Added boundary complement.
+
+2008-06-14 Saturday 16:17 Abramo Bagnara
+
+ * src/Interval.inlines.hh (1.35): Untested attempt to implement
+ interval difference.
+
+2008-06-10 Tuesday 11:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid_public.cc (1.73), Pointset_Powerset.cc (1.20),
+ Pointset_Powerset.defs.hh (1.40): In
+ Grid::join_assign_if_exact(), added an assertion.
+
+ In Pointset_Powerset.defs.hh corrected and improved brief
+ description for approximate_partition().
+
+ In Pointset_Powerset.cc, in approximate_partition(), ensure
+ congruence system of grid q is minimized before copying;
+
+ in approximate_partition_aux(), now there is no need to minimize
+ the congruence system here.
+
+2008-06-10 Tuesday 09:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (1.24): In Grid::fold_space_dimensions(),
+ emphasize the fact tha Grid::generators() is only called for its
+ side-effects.
+
+2008-06-10 Tuesday 09:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (1.23): Efficiency bug fixed in
+ fold_space_dimensions().
+
+2008-06-08 Sunday 20:44 Andrea Cimino
+
+ * src/MIP_Problem_GLPK.icc (simplex.4): Solved a bug when computing
+ the bounds to pass to the GLPK exact solver. This commit makes
+ 'mippproblem3' test pass.
+
+2008-06-08 Sunday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.47): In
+ Polyhedron::fold_space_dimensions(), emphasize the fact that
+ Polyhedron::generators() is only called for its side-effects.
+
+2008-06-08 Sunday 18:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.78): Spurious indentation
+ fixed.
+
+2008-06-08 Sunday 18:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.46): Improved the efficiency of
+ method fold_space_dimensions() by making sure that we compute at
+ most one conversion from the constraint to the generator
+ representation.
+
+2008-06-07 Saturday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem_GLPK.icc (simplex.3): Previous commit corrected
+ and completed. Code formatting fixed.
+
+2008-06-07 Saturday 15:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem_GLPK.icc (simplex.2): Declaration and uses of the
+ `statuses' write-only variable have been removed.
+
+2008-06-07 Saturday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: MIP_Problem.cc, MIP_Problem_GLPK.icc, MIP_Problem_PPL.icc,
+ Makefile.am (simplex.[9,1,1,7]): Not the code for the PPL's MIP
+ native solver and the code for the GLPK interface are completely
+ separated.
+
+2008-06-07 Saturday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.8): Indentation fixed. In many
+ places, throw std::run_time_error instead of
+ std::invalid_argument.
+
+2008-06-07 Saturday 14:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.7): The code controlled by
+ PPL_NOISY_SIMPLEX now systematically prints on std:cerr. That
+ macro has also been documented.
+
+2008-06-07 Saturday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.6): Properly commented long-scope
+ #if's, #else's and #endif's.
+
+2008-06-07 Saturday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (simplex.2): Updated the text concerning Andrea Cimino.
+
+2008-06-07 Saturday 07:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.rpath (1.5), m4/lib-link.m4 (1.3), m4/lib-prefix.m4 (1.4):
+ Updated from Gettext 0.17.
+
+2008-06-06 Friday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (simplex.5): New configure options: `--with-glpk'
+ checks whether the PPL should use the GLPK MIP solver, if
+ available (the default is not to use it); `--with-glpk-glpssx'
+ allows to specify the path where GLPK's glpssx.h can be found.
+
+2008-06-06 Friday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.5): Use the `PPL_USE_GLPK_MIP_SOLVER'
+ symbol instead of `PPL_USE_GLPK'. Define HAVE_GMP before
+ including <glpssx.h> and <glpk.h>, undefining it after these
+ inclusions. The ulset() function does not exist in GLPK 4.28:
+ use xlset() instead.
+
+2008-06-06 Friday 16:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore, ChangeLog, INSTALL, NEWS, README.configure, TODO,
+ config.guess, config.sub, configure.ac, depcomp, install-sh,
+ instchk.hh, ltmain.sh, Watchdog/.cvsignore, Watchdog/ChangeLog,
+ Watchdog/INSTALL, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+ Watchdog/doc/fdl.dox, Watchdog/doc/gpl.dox,
+ Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+ Watchdog/m4/libtool.m4, Watchdog/m4/ltoptions.m4,
+ Watchdog/m4/ltsugar.m4, Watchdog/m4/ltversion.m4,
+ Watchdog/m4/lt~obsolete.m4, Watchdog/src/.cvsignore,
+ doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-c-interface.tex,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/devref.tex, doc/fdl.dox, doc/gpl.dox,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, doc/user.tex, fedora/Makefile.am,
+ fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, fedora/pwl.hh,
+ interfaces/.cvsignore, interfaces/Makefile.am,
+ interfaces/README.interfaces, interfaces/interfaced_boxes.hh,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_common_procedure_generators.m4,
+ interfaces/C/.cvsignore, interfaces/C/Makefile.am,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+ interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dat.m4,
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+ interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/tests/.cvsignore,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/OCaml/.cvsignore, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/README.ocaml,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+ interfaces/OCaml/ppl_ocaml_globals.cc,
+ interfaces/Prolog/.cvsignore, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/Ciao/.cvsignore,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/GNU/.cvsignore,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/.cvsignore,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/sp_predicate_check.pl,
+ interfaces/Prolog/SWI/.cvsignore,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/XSB/.cvsignore,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/YAP/.cvsignore,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/tests/.cvsignore,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+ m4/ac_check_ciao.m4, m4/libtool.m4, m4/ltoptions.m4,
+ m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4,
+ src/.cvsignore, src/Any_Pointset.defs.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.defs.hh,
+ src/Box.inlines.hh, src/Box.templates.hh,
+ src/Box_Status.idefs.hh, src/Box_Status.inlines.hh,
+ src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Congruence.inlines.hh,
+ src/Float.defs.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Grid.defs.hh, src/Grid.inlines.hh,
+ src/Grid.templates.hh, src/Grid_Generator_System.inlines.hh,
+ src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Init.cc,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval_Info.defs.hh, src/Makefile.am,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.idefs.hh, src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Rational_Box.hh,
+ src/Rational_Interval.hh, src/Row.inlines.hh,
+ src/Temp.inlines.hh, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/compiler.hh, src/fpu.defs.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+ src/meta_programming.hh, src/ppl_header.hh, src/simplify.cc,
+ tests/Random_Number_Generator.inlines.hh, tests/ppl_test.cc,
+ tests/ppl_test.hh, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frombdshape1.cc,
+ tests/BD_Shape/frombox1.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/membytes1.cc,
+ tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/pointsetpowerset1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+ tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+ tests/Box/addspacedims1.cc, tests/Box/affineimage1.cc,
+ tests/Box/affinepreimage1.cc, tests/Box/bdsdifference1.cc,
+ tests/Box/boundedaffineimage1.cc,
+ tests/Box/boundedaffinepreimage1.cc, tests/Box/boxdifference1.cc,
+ tests/Box/boxhull.cc, tests/Box/boxhull1.cc,
+ tests/Box/cc76narrowing1.cc, tests/Box/cc76widening.cc,
+ tests/Box/closure1.cc, tests/Box/concatenate1.cc,
+ tests/Box/congruences1.cc, tests/Box/constraints1.cc,
+ tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+ tests/Box/frombdshape1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/frompolyhedron1.cc,
+ tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffineimage2.cc,
+ tests/Box/generalizedaffinepreimage1.cc,
+ tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+ tests/Box/interval1.cc, tests/Box/interval2.cc,
+ tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+ tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+ tests/Box/pointsetpowerset1.cc, tests/Box/pointsetpowerset2.cc,
+ tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+ tests/Box/refinewithcongruences1.cc,
+ tests/Box/refinewithconstraint1.cc,
+ tests/Box/refinewithconstraint2.cc,
+ tests/Box/refinewithconstraints1.cc,
+ tests/Box/refinewithconstraints2.cc, tests/Box/relations2.cc,
+ tests/Box/relations3.cc, tests/Box/relations4.cc,
+ tests/Box/removespacedims1.cc, tests/Box/timeelapse1.cc,
+ tests/Box/unconstrain1.cc, tests/Grid/Makefile.am,
+ tests/Grid/congruences1.cc, tests/Grid/copyconstruct1.cc,
+ tests/Grid/directproduct3.cc, tests/Grid/directproduct5.cc,
+ tests/Grid/directproduct6.cc, tests/Grid/fromgrid1.cc,
+ tests/Grid/frompolyhedron1.cc, tests/Grid/grid3.cc,
+ tests/Grid/mincongruences1.cc,
+ tests/Grid/partiallyreducedproduct1.cc,
+ tests/Grid/partiallyreducedproduct2.cc,
+ tests/Grid/partiallyreducedproduct3.cc,
+ tests/Grid/partiallyreducedproduct4.cc,
+ tests/Grid/pointsetpowerset1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/refinewithcongruences1.cc,
+ tests/Grid/refinewithconstraints1.cc, tests/Grid/unconstrain1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/congruences1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/frombox1.cc,
+ tests/Octagonal_Shape/fromoctagonalshape1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/pointsetpowerset1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithcons3.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/unconstrain1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/hybrid.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/pointsetpowerset2.cc,
+ tests/Polyhedron/pointsetpowerset3.cc,
+ tests/Polyhedron/pointsetpowerset4.cc,
+ tests/Polyhedron/pointsetpowerset5.cc,
+ tests/Polyhedron/pointsetpowerset6.cc,
+ tests/Polyhedron/refinewithcongruence1.cc,
+ tests/Polyhedron/refinewithcongruences1.cc,
+ tests/Polyhedron/refinewithconstraint1.cc,
+ tests/Polyhedron/refinewithconstraints1.cc,
+ tests/Polyhedron/unconstrain1.cc, utils/cm_cleaner.sh,
+ utils/cm_splitter.sh
+ (simplex.[1,4,3,4,4,7,5,5,4,2,4,4,3,1,4,3,5,5,3,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,3,3,3,3,5,4,4,1,2,3,3,3,3,3,3,4,4,4,3,2,3,2,2,1,4,2,2,3,3,2,1,4,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,1,4,3,3,3,3,3,3,3,3,2,3,1,4,3,3,3,2,3,3,1,4,3,3,1,4,3,2,4,3,3,1,4,3,3,1,4,3,3,3,1,4,3,1,4,3,3,3,3,2,2,2,2,2,2,2,3,4,4,5,6,5,3,3,3,3,3,3,2,2,3,4,5,5,5,5,5,4,5,5,7,4,5,5,5,5,4,5,5,5,4,4,3,3,6,4,5,5,3,3,3,3,3,3,3,4,3,3,3,3,3,3,5,5,4,5,5,3,3,2,3,3,4,4,4,5,4,4,4,4,3,5,3,2,2,3,3,3,4,5,5,3,5,5,4,4,5,4,5,4 [...]
+ Fifth merge of the trunk to the `simplex' branch.
+
+2008-06-06 Friday 16:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.4): Extended the scope of an #ifdef
+ PPL_USE_GLPK.
+
+2008-06-06 Friday 14:10 Andrea Cimino
+
+ * src/: MIP_Problem.cc, MIP_Problem.defs.hh (simplex.[3,3]): As an
+ option, now the PPL can use the exact simplex solver of GLPK.
+
+2008-06-05 Thursday 15:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am, wrap1.cc
+ (bounded_arithmetic.[1,1]): New file wrap1.cc will contain tests
+ for method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh, Polyhedron_public.cc
+ (bounded_arithmetic.[1,1]): Added the declaration and a stub
+ implementation of new method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh (bounded_arithmetic.1): New enumerations
+ Bounded_Integer_Type_Width, Bounded_Integer_Type_Signedness and
+ Bounded_Integer_Type_Overflow to encode the width, signedness and
+ overflow behavior of bounded integer types, respectively.
+
+2008-05-26 Monday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/max_min1.cc (1.8): Capitalization fixed.
+
+2008-05-25 Sunday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_ciao.m4 (simplex.1): file ac_check_ciao.m4 was added
+ on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-25 Sunday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.309), interfaces/Prolog/Ciao/Makefile.am (1.73),
+ m4/ac_check_ciao.m4 (1.1): Added machinery to automatically find
+ the header files of the Ciao Prolog foreign language interface.
+
+2008-05-24 Saturday 14:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.308): Version number bumped.
+
+2008-05-24 Saturday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.26): Updated.
+
+2008-05-12 Monday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.inlines.hh (1.43), Congruence.inlines.hh
+ (1.20), Grid_Generator_System.inlines.hh (1.18),
+ NNC_Polyhedron.inlines.hh (1.44): Define inline methods before
+ their first invocation.
+
+2008-05-12 Monday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.123), Octagonal_Shape.defs.hh (1.49):
+ Obsolete workarounds removed.
+
+2008-05-12 Monday 08:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.55): Obsolete workarounds removed.
+
+2008-05-12 Monday 08:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: compiler.hh (1.14), fpu.defs.hh (1.19): The Intel C/C++
+ compilers accept the same asm() syntax as GCC.
+
+2008-05-11 Sunday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.54), Box.inlines.hh (1.33), Box.templates.hh
+ (1.112), Box_Status.idefs.hh (1.3), Box_Status.inlines.hh (1.3):
+ Avoid name clashes between the parameter of class Box and class
+ Interval.
+
+2008-05-11 Sunday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box_Status.idefs.hh (simplex.1): file Box_Status.idefs.hh was
+ added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box_Status.inlines.hh (simplex.1): file Box_Status.inlines.hh
+ was added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 22:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.111): Dead code removed.
+
+2008-05-11 Sunday 22:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.53): Useless inclusion removed.
+
+2008-05-11 Sunday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.106), Octagonal_Shape.templates.hh
+ (1.77): Unreachable breaks removed.
+
+2008-05-11 Sunday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (1.17): Inclusions fixed.
+
+2008-05-11 Sunday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: MIP_Problem.cc (1.67), Polyhedron_public.cc (1.117):
+ Unreachable breaks removed.
+
+2008-05-11 Sunday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (1.39): Inclusions fixed.
+
+2008-05-11 Sunday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: compiler.hh (1.13), fpu.defs.hh (1.18): Do not try to use
+ asm() statements unless defined(__GNUC__).
+
+2008-05-11 Sunday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.54): Warning avoided.
+
+2008-05-11 Sunday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.110): Code formatting improved.
+
+2008-05-11 Sunday 21:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.105), Octagonal_Shape.templates.hh
+ (1.76): Avoid shadowing and repeated computations.
+
+2008-05-10 Saturday 10:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.307): When the --enable-more-assertions option is
+ given, we define both _GLIBCXX_DEBUG and _GLIBCXX_DEBUG_PEDANTIC;
+ this way, when libstdc++ is used, it is used in pedantic debug
+ mode.
+
+2008-05-10 Saturday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.34), Polyhedron.defs.hh (1.337),
+ Polyhedron_public.cc (1.116), simplify.cc (1.51): Fixed an (until
+ now) inconsequential problem whereby we were using the STL
+ outside its specifications (problem spotted by Stefano Soffia and
+ further analyzed by Enea Zaffanella).
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/libtool.m4 (simplex.1): file libtool.m4 was added on branch
+ simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added on
+ branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ltversion.m4 (simplex.1): file ltversion.m4 was added on
+ branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was added on
+ branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/libtool.m4 (simplex.1): file libtool.m4 was added on
+ branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added
+ on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/ltversion.m4 (simplex.1): file ltversion.m4 was added
+ on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was
+ added on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.306), ltmain.sh (1.34), Watchdog/configure.ac
+ (1.45), Watchdog/ltmain.sh (1.23), Watchdog/m4/libtool.m4 (1.5),
+ Watchdog/m4/ltoptions.m4 (1.3), Watchdog/m4/ltversion.m4 (1.4),
+ Watchdog/m4/lt~obsolete.m4 (1.2), m4/libtool.m4 (1.5),
+ m4/ltoptions.m4 (1.3), m4/ltversion.m4 (1.4), m4/lt~obsolete.m4
+ (1.2): Updated to Libtool 2.2.4.
+
+2008-05-04 Sunday 09:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.13): Temporarily work around a problem
+ whereby testing for the existence of <fenv.h> is no longer enough
+ for our purposes.
+
+2008-05-04 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Random_Number_Generator.inlines.hh (1.12): Include <ctime>.
+
+2008-05-04 Sunday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.104): Use explicit braces to avoid
+ ambiguous `else'.
+
+2008-04-30 Wednesday 12:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-c-interface.tex (1.5), devref.tex (1.26),
+ user-c-interface.tex (1.5), user-prolog-interface.tex (1.5),
+ user.tex (1.27): Package inclusions updated. We now set the
+ `tocdepth' counter to 2 in order to obtain a more useful index.
+
+2008-04-29 Tuesday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.103): Avoid useless computation in
+ minimized_congruences(), thereby also silencing a compiler
+ warning.
+
+2008-04-29 Tuesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/pointsetpowerset1.cc (1.3): Test 15 is no longer
+ failing.
+
+2008-04-29 Tuesday 14:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/pointsetpowerset1.cc (simplex.1): file
+ pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+ 14:22:11 +0000
+
+2008-04-28 Monday 16:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.inlines.hh (1.35),
+ Octagonal_Shape.templates.hh (1.75): Corrected an efficiency bug
+ in methods minimized_congruences() and congruences(). In method
+ OK(), do not check for closure if the shape is based on non-exact
+ (i.e., floating point) coefficients.
+
+2008-04-28 Monday 15:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.162), BD_Shape.templates.hh (1.102):
+ Corrected an efficiency bug in methods minimized_congruences()
+ and congruences().
+
+2008-04-28 Monday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Float.defs.hh (1.29): Added missing inclusion of
+ meta_programming.hh.
+
+2008-04-27 Sunday 16:28 Abramo Bagnara
+
+ * src/Temp.inlines.hh (1.5): Added missing inline.
+
+2008-04-27 Sunday 16:28 Abramo Bagnara
+
+ * src/Float.defs.hh (1.28): Added True/False helper.
+
+2008-04-24 Thursday 08:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.48), Polyhedron.defs.hh (1.336):
+ Do not refer to the undefined concept `reduced' for congruence
+ systems.
+
+2008-04-24 Thursday 08:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.defs.hh (1.71): Minor improvements in documentation: do
+ not refer to `reduced' congruence systems since it is undefined
+ terminology at the user level.
+
+2008-04-24 Thursday 08:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.122): Minor fix in the indentation of the
+ documentation.
+
+2008-04-23 Wednesday 16:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.19),
+ C/ppl_interface_generator_c_cc_code.m4 (1.33),
+ C/ppl_interface_generator_c_h_code.m4 (1.23),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.49), Java/jni/ppl_java_common.cc (1.38),
+ Java/tests/ppl_interface_generator_java_test_java_code.m4 (1.29),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.31),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.26),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.20),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.66),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.75), Prolog/tests/ppl_predicate_check_common.pl (1.11): Added
+ to all the interfaces the unconstrain() procedure.
+
+ Added (except to the C interface which already had it) the
+ constrains() procedure.
+
+ Added to the Prolog interface the option of building from a
+ friend with complexity specified.
+
+ Tests added for all new code in the Prolog and Java interfaces.
+
+2008-04-23 Wednesday 16:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (simplex.1): file
+ ppl_interface_generator_common_procedure_generators.m4 was added
+ on branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-04-23 Wednesday 12:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/pointsetpowerset1.cc (1.4),
+ Octagonal_Shape/pointsetpowerset1.cc (1.4): Revised the distances
+ from the exact values in test 03.
+
+2008-04-23 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/pointsetpowerset1.cc (simplex.1): file
+ pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+ 14:22:09 +0000
+
+2008-04-23 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/pointsetpowerset1.cc (simplex.1): file
+ pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+ 14:22:12 +0000
+
+2008-04-23 Wednesday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset5.cc (simplex.1): file
+ pointsetpowerset5.cc was added on branch simplex on 2008-06-06
+ 14:22:13 +0000
+
+2008-04-23 Wednesday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset6.cc (simplex.1): file
+ pointsetpowerset6.cc was added on branch simplex on 2008-06-06
+ 14:22:13 +0000
+
+2008-04-23 Wednesday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/pointsetpowerset2.cc (simplex.1): file
+ pointsetpowerset2.cc was added on branch simplex on 2008-06-06
+ 14:22:10 +0000
+
+2008-04-23 Wednesday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/pointsetpowerset1.cc (1.3),
+ Box/pointsetpowerset1.cc (1.6), Box/pointsetpowerset2.cc (1.2),
+ Grid/pointsetpowerset1.cc (1.2),
+ Octagonal_Shape/pointsetpowerset1.cc (1.3), Polyhedron/hybrid.cc
+ (1.6), Polyhedron/pointsetpowerset1.cc (1.10),
+ Polyhedron/pointsetpowerset2.cc (1.4),
+ Polyhedron/pointsetpowerset5.cc (1.4),
+ Polyhedron/pointsetpowerset6.cc (1.2): Do not put spaces around
+ operator->().
+
+2008-04-22 Tuesday 19:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/Makefile.am (1.30): Type corrected.
+
+2008-04-22 Tuesday 17:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/pointsetpowerset1.cc (1.2): Allow for non-integral
+ numbers using check_result().
+
+2008-04-22 Tuesday 17:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/pointsetpowerset1.cc (1.2): Allow for non
+ integral results using check_results() on the disjuncts.
+
+2008-04-22 Tuesday 11:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.228), src/Pointset_Powerset.cc (1.19),
+ src/Pointset_Powerset.defs.hh (1.38),
+ src/Pointset_Powerset.inlines.hh (1.15),
+ src/Pointset_Powerset.templates.hh (1.32),
+ tests/BD_Shape/Makefile.am (1.76),
+ tests/BD_Shape/pointsetpowerset1.cc (1.1), tests/Box/Makefile.am
+ (1.59), tests/Box/pointsetpowerset2.cc (1.1),
+ tests/Grid/Makefile.am (1.65), tests/Grid/pointsetpowerset1.cc
+ (1.1), tests/Octagonal_Shape/Makefile.am (1.29),
+ tests/Octagonal_Shape/pointsetpowerset1.cc (1.1),
+ tests/Polyhedron/Makefile.am (1.122),
+ tests/Polyhedron/pointsetpowerset6.cc (1.1): Added constructors
+ for the pointset powerset domain from other domains that are not
+ products or powersets.
+
+ Added to all the constructors for the pointset powerset domain
+ from other sematic domains an optional complexity argument.
+
+ Tests for these new constructors added. A note added in the NEWS
+ file on these additions
+
+2008-04-22 Tuesday 11:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.defs.hh (1.60): Properly order the list of
+ parameters of NNC_Polyhedron(grid, complexity) in the doxygen
+ documentation.
+
+2008-04-22 Tuesday 11:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.227): Mention the new unconstrain() methods.
+
+2008-04-22 Tuesday 09:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/pointsetpowerset1.cc (1.5): Tests 4 to 19 uncommented
+ and adapted to use the box domain.
+
+2008-04-22 Tuesday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.43): Added a note on the implementation
+ of gcdext_exact().
+
+2008-04-21 Monday 22:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/NNC_Polyhedron.defs.hh (1.59): Document the parameter
+ complexity in: NNC_Polyhedron(const Grid &grid,
+ Complexity_Class complexity=ANY_COMPLEXITY)
+
+2008-04-21 Monday 12:13 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.101): Corrected the private method
+ `get_limiting_shape' when `cs' contains an equality.
+
+2008-04-18 Friday 14:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.30),
+ Partially_Reduced_Product.inlines.hh (1.27): Added methods
+ unconstrain() to class Partially_Reduced_Product.
+
+2008-04-18 Friday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromoctagonalshape1.cc (simplex.1): file
+ fromoctagonalshape1.cc was added on branch simplex on 2008-06-06
+ 14:22:12 +0000
+
+2008-04-18 Friday 14:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/frombdshape1.cc (1.2),
+ Octagonal_Shape/fromoctagonalshape1.cc (1.2): Corrected typos:
+ the assignment operator is not meant to implement a conversion
+ between different kinds of BD_ or Octagonal_ shapes.
+
+2008-04-18 Friday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frombdshape1.cc (simplex.1): file frombdshape1.cc
+ was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-18 Friday 11:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.29),
+ src/Partially_Reduced_Product.inlines.hh (1.26),
+ tests/Grid/directproduct6.cc (1.14): Added a constructor for a
+ product from another product but with possibly different
+ templatic parameters.
+
+2008-04-18 Friday 10:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.28),
+ src/Partially_Reduced_Product.inlines.hh (1.25),
+ tests/Grid/directproduct6.cc (1.13): Added the complexity class
+ parameter for the copy constructor for the product domain.
+
+2008-04-18 Friday 10:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+ on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partiallyreducedproduct4.cc (simplex.1): file
+ partiallyreducedproduct4.cc was added on branch simplex on
+ 2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.121), src/BD_Shape.inlines.hh (1.161),
+ src/Box.defs.hh (1.52), src/Box.inlines.hh (1.32),
+ src/Box.templates.hh (1.109), src/C_Polyhedron.defs.hh (1.58),
+ src/C_Polyhedron.inlines.hh (1.42), src/Grid.defs.hh (1.70),
+ src/Grid_public.cc (1.72), src/NNC_Polyhedron.defs.hh (1.58),
+ src/NNC_Polyhedron.inlines.hh (1.43), src/Octagonal_Shape.defs.hh
+ (1.47), src/Octagonal_Shape.inlines.hh (1.34),
+ src/Partially_Reduced_Product.defs.hh (1.27),
+ src/Partially_Reduced_Product.inlines.hh (1.24),
+ src/Polyhedron.defs.hh (1.335), src/Polyhedron_nonpublic.cc
+ (1.83), tests/BD_Shape/Makefile.am (1.75),
+ tests/BD_Shape/frombdshape1.cc (1.1), tests/Grid/Makefile.am
+ (1.64), tests/Grid/copyconstruct1.cc (1.10),
+ tests/Grid/directproduct6.cc (1.12), tests/Grid/fromgrid1.cc
+ (1.1), tests/Grid/partiallyreducedproduct1.cc (1.11),
+ tests/Grid/partiallyreducedproduct2.cc (1.5),
+ tests/Grid/partiallyreducedproduct3.cc (1.4),
+ tests/Grid/partiallyreducedproduct4.cc (1.4),
+ tests/Octagonal_Shape/Makefile.am (1.28),
+ tests/Octagonal_Shape/fromoctagonalshape1.cc (1.1): Added to the
+ Partially_Reduced_Product<> class in the semantic GD constructors
+ from other classes a complexity parameter.
+
+ Tests for this have been added as needed. Also some comments wrt
+ the tests for the product domain have been corrected.
+
+ In the Grid, Box, BD_Shape and Octagonal_Shape added a complexity
+ class parameter to the copy constructor and to the constructor
+ from the same class but with a different numeric class (where
+ applicable).
+
+ Test files added where no obvious test for the copy constructor
+ could be found. For the grid tests, the test file
+ copyconstruct1.cc has been renamed for uniformity with other
+ tests and the other classes.
+
+2008-04-18 Friday 09:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.19), Pointset_Ask_Tell.defs.hh
+ (1.16), Pointset_Ask_Tell.templates.hh (1.14): Added the
+ unconstrain() methods to Any_Pointset and Pointset_Ask_Tell.
+
+2008-04-18 Friday 09:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.58), unconstrain1.cc (1.1): Added a
+ test for the new Box::unconstrain() methods.
+
+2008-04-18 Friday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+ added on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-04-18 Friday 09:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.51), Box.inlines.hh (1.31), Box.templates.hh
+ (1.108): Added methods unconstrain().
+
+2008-04-17 Thursday 18:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/C_Polyhedron.cc (1.27), src/C_Polyhedron.defs.hh (1.57),
+ src/NNC_Polyhedron.cc (1.27), src/NNC_Polyhedron.defs.hh (1.57),
+ tests/Polyhedron/cnncconversion1.cc (1.6): Added a complexity
+ parameter for converting between C and NNC polyhedra. This is
+ ignored.
+
+ A couple of tests added to cnncconversion1.cc.
+
+2008-04-17 Thursday 17:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.63), unconstrain1.cc (1.1): Added
+ tests for unconstrain() for the grids.
+
+2008-04-17 Thursday 17:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+ added on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-17 Thursday 17:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.69), Grid_public.cc (1.71): Added methods
+ unconstrain().
+
+2008-04-17 Thursday 17:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.26), C_Polyhedron.defs.hh (1.56),
+ C_Polyhedron.inlines.hh (1.41), NNC_Polyhedron.cc (1.26),
+ NNC_Polyhedron.defs.hh (1.56), NNC_Polyhedron.inlines.hh (1.42),
+ Polyhedron.templates.hh (1.19): Fixed indentation.
+
+2008-04-17 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frombox1.cc (simplex.1): file frombox1.cc was
+ added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frombox1.cc (simplex.1): file frombox1.cc
+ was added on branch simplex on 2008-06-06 14:22:12 +0000
+
+2008-04-17 Thursday 16:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.120), src/BD_Shape.inlines.hh (1.160),
+ src/Grid.defs.hh (1.68), src/Grid.inlines.hh (1.24),
+ src/Grid.templates.hh (1.34), src/Octagonal_Shape.defs.hh (1.46),
+ src/Octagonal_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am
+ (1.74), tests/BD_Shape/boundingbox1.cc (1.4),
+ tests/BD_Shape/frombox1.cc (1.1),
+ tests/Octagonal_Shape/Makefile.am (1.27),
+ tests/Octagonal_Shape/frombox1.cc (1.1): Added a complexity
+ parameter for the constructors for the grid, bd_shape and
+ octagonal_shape from the other semantic GD's. In all cases the
+ parameter is ignored.
+
+ Added tests for the Octagonal_Shape domain for building from a
+ box. This file is a clone (with only trivial changes for the
+ change of domain) of the old boundingbox1.cc (renamed for
+ consistency as frombox1.cc) in BD_Shape tests directory.
+
+2008-04-17 Thursday 16:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: C_Polyhedron.cc (1.25), C_Polyhedron.defs.hh (1.55),
+ C_Polyhedron.inlines.hh (1.40), NNC_Polyhedron.cc (1.25),
+ NNC_Polyhedron.defs.hh (1.55), NNC_Polyhedron.inlines.hh (1.41):
+ Added an extra complexity parameter for building polyhedra from a
+ box, bd shape, octagonal shape, and a grid. In all cases the
+ parameter is ignored.
+
+2008-04-17 Thursday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.31): Fixed indentation;
+ added implementation of methods unconstrain().
+
+2008-04-17 Thursday 15:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (1.37): Fixed indentation and
+ grouping of methods. Declared new methods unconstrain().
+
+2008-04-17 Thursday 15:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.210): Added bibligraphic entry HMT71.
+
+2008-04-17 Thursday 15:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.209): Added a subsection about
+ cylindrification of polyhedra.
+
+2008-04-17 Thursday 13:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.115): In the implementation of affine
+ images/preimages, use new methods unconstrain() when appropriate.
+
+2008-04-17 Thursday 13:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/unconstrain1.cc (simplex.1): file
+ unconstrain1.cc was added on branch simplex on 2008-06-06
+ 14:22:12 +0000
+
+2008-04-17 Thursday 13:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.73), BD_Shape/unconstrain1.cc
+ (1.1), Octagonal_Shape/Makefile.am (1.26),
+ Octagonal_Shape/unconstrain1.cc (1.1): Added tests for the
+ unconstrain() methods for BD_Shape and Octagonal_Shape.
+
+2008-04-17 Thursday 13:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/unconstrain1.cc (simplex.1): file unconstrain1.cc
+ was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 13:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.119), BD_Shape.templates.hh (1.100),
+ Octagonal_Shape.defs.hh (1.45), Octagonal_Shape.templates.hh
+ (1.74): Added methods unconstrain() for BD_Shape and
+ Octagonal_Shape.
+
+2008-04-17 Thursday 13:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Polyhedron.defs.hh (1.334), Polyhedron.templates.hh (1.18),
+ Polyhedron_public.cc (1.114): Replaced common code in
+ add_constraint() and refine_with_constraint() with a call to a
+ private method refine_no_check() that does the same thing as the
+ common code.
+
+ Added an extra complexity parameter for the constructor of a
+ polyhedron from a box. This is ignored (as algorithm is
+ polynomial).
+
+2008-04-17 Thursday 12:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.121), unconstrain1.cc (1.1):
+ Added some tests for new methods unconstrain().
+
+2008-04-17 Thursday 12:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/unconstrain1.cc (simplex.1): file
+ unconstrain1.cc was added on branch simplex on 2008-06-06
+ 14:22:13 +0000
+
+2008-04-17 Thursday 11:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.113): Corrected cut&paste error in
+ the implementation of unconstrain(vs).
+
+2008-04-17 Thursday 11:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.333), Polyhedron_public.cc (1.112):
+ Added new methods void unconstrain(Variable var); void
+ unconstrain(const Variable_Set& to_be_unconstrained); that modify
+ the polyhedron by computing the cylindrification on the specified
+ space dimensions. In the documentation, moved the static methods
+ can_recycle_constraints and can_recycle_congruences to a better
+ place.
+
+2008-04-17 Thursday 09:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.243): Added (partial) lists of the semantic GDs (simple
+ and the constructors) in the section on Semantic geometric
+ descriptors.
+
+2008-04-12 Saturday 22:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.70), tests/Grid/Makefile.am (1.62),
+ tests/Grid/frompolyhedron1.cc (1.1), tests/Grid/grid3.cc (1.26):
+ Corrected two bugs in the revised code for constructing a grid
+ from a polyhedron with complexity class:
+
+ The space dimension of the generator system must be set to be
+ that of the polyhedron.
+
+ After minimizing the polyhedron (in the case that the complexity
+ is ANY_COMPLEXITY), we must check if the polyhedron is empty, and
+ if it is return the empty grid.
+
+ Added a new test file for checking this constructor, moved
+ existing tests for it that were in grid3.cc to the new test file,
+ and added a few extra tests to check the use of complexity
+ classes.
+
+2008-04-12 Saturday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/frompolyhedron1.cc (simplex.1): file
+ frompolyhedron1.cc was added on branch simplex on 2008-06-06
+ 14:22:11 +0000
+
+2008-04-12 Saturday 12:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.67), Grid_public.cc (1.69): The constructor
+ of a grid from a polyhedron now takes an optional argument
+ specifying an upper bound to the complexity of the conversion to
+ be applied.
+
+2008-04-10 Thursday 17:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.242): Small improvements to the description of
+ syntactic/semantics GDs.
+
+2008-04-02 Wednesday 08:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.33), Watchdog/ltmain.sh (1.22),
+ Watchdog/m4/libtool.m4 (1.4), Watchdog/m4/ltoptions.m4 (1.2),
+ Watchdog/m4/ltversion.m4 (1.3), m4/libtool.m4 (1.4),
+ m4/ltoptions.m4 (1.2), m4/ltversion.m4 (1.3): Updated from
+ Libtool 2.2.2.
+
+2008-03-29 Saturday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.305): Version number bumped.
+
+2008-03-25 Tuesday 10:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.cc (1.18), src/Pointset_Powerset.defs.hh
+ (1.36), src/Pointset_Powerset.inlines.hh (1.14),
+ src/Pointset_Powerset.templates.hh (1.30),
+ tests/Grid/powersetdifference1.cc (1.5),
+ tests/Polyhedron/pointsetpowerset1.cc (1.9): Changes mainly
+ affect poly_difference_assign().
+
+ Added difference_assign() to be a clone of
+ poly_difference_assign(). Added a couple of tests and improved
+ an existing test.
+
+ Replaced all lines: // FIXME: this is buggy when PS is not an
+ abstraction of NNC_Polyhedron. by // This code is only used when
+ PS is an abstraction of NNC_Polyhedron. since the Grid domains
+ are specialised separately.
+
+ Corrected a bug in poly_difference_assign() for Grids where some
+ precision was wrongly lost (when a remainder was negative and had
+ been assumed to be positive).
+
+2008-03-22 Saturday 10:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/: devref.tex (1.5), fdl.dox (1.2), gpl.dox (1.3),
+ user.tex (1.5): Properly named page anchors so as to avoid
+ undefined references in the LaTeX documentation.
+
+2008-03-22 Saturday 10:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/doc/: devref.doxyconf-html.in (1.2),
+ devref.doxyconf-latex.in (1.2), user.doxyconf-html.in (1.3),
+ user.doxyconf-latex.in (1.3): Doxygen configuration files
+ upgraded.
+
+2008-03-21 Friday 10:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.32),
+ ppl_interface_generator_c_h_code.m4 (1.22): Removed the now
+ redundant code for add_recycled_..._and_minimize procedures.
+
+2008-03-21 Friday 10:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (1.6): Removed the
+ add_recycled_constraints/congruences_and_minimize from the list
+ of procedures to build.
+
+2008-03-21 Friday 10:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+ (simplex.1): file
+ ppl_interface_generator_c_procedure_generators.m4 was added on
+ branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-03-21 Friday 09:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.26),
+ Pointset_Powerset.defs.hh (1.35): Corrected a couple of typos in
+ the documentation resulting in Doxygen warnings.
+
+2008-03-21 Friday 09:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.44), Octagonal_Shape.inlines.hh
+ (1.32), Octagonal_Shape.templates.hh (1.73): Removed eager
+ methods for the addition of constraints/congruences.
+
+2008-03-21 Friday 09:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: limitedbhmz05extrapolation1.cc (1.8),
+ limitedcc76extrapolation1.cc (1.8), intersection1.cc (1.6): No
+ longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: congruences1.cc (1.4),
+ containsintegerpoint1.cc (1.6), octhull1.cc (1.6): No longer
+ using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/congruences1.cc (simplex.1): file
+ congruences1.cc was added on branch simplex on 2008-06-06
+ 14:22:12 +0000
+
+2008-03-21 Friday 08:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/: directproduct3.cc (1.18), directproduct5.cc (1.10):
+ No longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/partiallyreducedproduct1.cc (1.10): No longer using
+ eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.25),
+ Partially_Reduced_Product.inlines.hh (1.23),
+ Partially_Reduced_Product.templates.hh (1.9): Removed eager
+ versions of methods adding constraints/congruences.
+
+2008-03-21 Friday 08:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Ask_Tell.defs.hh (1.15),
+ Pointset_Ask_Tell.templates.hh (1.13): Removed eager methods of
+ methods adding constraints/congruences.
+
+2008-03-21 Friday 08:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Ask_Tell/append1.cc (1.8): Corrected typo in the noisy
+ output.
+
+2008-03-21 Friday 08:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: addconstraints1.cc (1.13), congruences1.cc (1.4),
+ intersection1.cc (1.10): No longer using eager methods for adding
+ constraints/congruences.
+
+2008-03-21 Friday 08:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.50), Box.inlines.hh (1.30): Removed eager
+ versions of methods adding constraints and congruences.
+
+2008-03-20 Thursday 17:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/C_Polyhedron.defs.hh (1.54): Comment corrected.
+
+2008-03-20 Thursday 16:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron_public.cc (1.111), Polyhedron_widenings.cc
+ (1.66): Avoid using deprecated methods.
+
+2008-03-20 Thursday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.99): Avoid using deprecated methods;
+ while at it, slightly simplified a few lines.
+
+2008-03-20 Thursday 15:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.templates.hh (1.29), Pointset_Powerset.cc
+ (1.17), Grid_public.cc (1.68): Avoid using deprecated method.
+
+2008-03-20 Thursday 15:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.31),
+ C/ppl_interface_generator_c_h_code.m4 (1.21),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.48), Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.28), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.30),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.25),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.19): Added the
+ code for the refine_with methods to the C, Java and Ocaml
+ interfaces. All the refine_with methods in all the interfaces
+ enabled.
+
+2008-03-20 Thursday 15:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.332), BD_Shape.defs.hh (1.118),
+ Pointset_Powerset.defs.hh (1.34), Grid.defs.hh (1.66):
+ Documentation of the eager versions of some methods now states
+ that their usage is deprecated (linking to the manual for an
+ explanation).
+
+2008-03-20 Thursday 14:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.208): In the section of the manual
+ discussing lazy and eager version of some of the operators, added
+ a paragraph stressing that the use of the eager versions is
+ deprecated starting from PPL 0.10 and will be removed starting
+ from PPL 0.11.
+
+2008-03-20 Thursday 12:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.71),
+ ppl_interface_generator_common_procedure_generators.m4 (1.18),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.65): Added
+ code in the Prolog interface for the refine_with methods.
+
+2008-03-20 Thursday 10:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.24),
+ src/Partially_Reduced_Product.inlines.hh (1.22),
+ tests/Grid/partiallyreducedproduct4.cc (1.3): Added refine_with
+ methods to the product domains.
+
+2008-03-20 Thursday 09:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.33),
+ src/Pointset_Powerset.templates.hh (1.28),
+ tests/Polyhedron/pointsetpowerset5.cc (1.3): Added
+ refine_with_congruence() and refine_with_congruences(). Tests
+ added for all the refine_with methods for pointset powersets of
+ polyhedra.
+
+2008-03-19 Wednesday 14:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/:
+ ppl_interface_generator_common_procedure_generators.m4 (1.17),
+ Prolog/tests/pl_grid_check.pl (1.10): Disabled the and_minimize
+ methods for all domains except for the Polyhedron domains.
+ Removed all tests for the and_minimize methods from
+ Prolog/tests/pl_grid_check.pl.
+
+2008-03-19 Wednesday 14:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.331), src/Polyhedron_public.cc (1.110),
+ tests/Polyhedron/Makefile.am (1.120),
+ tests/Polyhedron/exceptions1.cc (1.16),
+ tests/Polyhedron/refinewithcongruence1.cc (1.1),
+ tests/Polyhedron/refinewithcongruences1.cc (1.1),
+ tests/Polyhedron/refinewithconstraint1.cc (1.1),
+ tests/Polyhedron/refinewithconstraints1.cc (1.1): Added
+ refine_with methods for constraint(s) and congruence(s).
+
+2008-03-19 Wednesday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/refinewithcongruence1.cc (simplex.1): file
+ refinewithcongruence1.cc was added on branch simplex on
+ 2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/refinewithcongruences1.cc (simplex.1): file
+ refinewithcongruences1.cc was added on branch simplex on
+ 2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/refinewithconstraint1.cc (simplex.1): file
+ refinewithconstraint1.cc was added on branch simplex on
+ 2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/refinewithconstraints1.cc (simplex.1): file
+ refinewithconstraints1.cc was added on branch simplex on
+ 2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 08:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.241): Revised the geometric descriptors draft
+ documentation for the add and refine_with methods for constraints
+ and congruences.
+
+2008-03-19 Wednesday 08:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/refinewithconstraints1.cc (1.3): tests 08 and 09 fail
+ with checked-int8
+
+2008-03-19 Wednesday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithconstraints1.cc (simplex.1): file
+ refinewithconstraints1.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-19 Wednesday 07:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.67): Restored implementation of
+ add_constraints().
+
+2008-03-18 Tuesday 22:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.65), src/Grid.inlines.hh (1.23),
+ src/Grid_public.cc (1.66), tests/Grid/Makefile.am (1.61),
+ tests/Grid/congruences1.cc (1.14),
+ tests/Grid/refinewithcongruences1.cc (1.1),
+ tests/Grid/refinewithconstraints1.cc (1.1): Added methods
+ refine_with_congruence(), refine_with_congruences(),
+ refine_with_constraint(), refine_with_constraints().
+
+ Removed some old redundant (commented out) tests in
+ tests/Grid/congruences1.cc
+
+2008-03-18 Tuesday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/refinewithcongruences1.cc (simplex.1): file
+ refinewithcongruences1.cc was added on branch simplex on
+ 2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/refinewithconstraints1.cc (simplex.1): file
+ refinewithconstraints1.cc was added on branch simplex on
+ 2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 20:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.28), Watchdog/ChangeLog (1.17): Updated.
+
+2008-03-18 Tuesday 20:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.inlines.hh (1.29), tests/Box/Makefile.am (1.57): Restored
+ code revoved in error. Restored congruences1 test.
+
+2008-03-18 Tuesday 20:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (1.32): Two FIXMEs resolved.
+
+2008-03-18 Tuesday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.31),
+ Pointset_Powerset.templates.hh (1.27): Methods
+ Pointset_Powerset<PS>::refine(const Constraint&) and
+ Pointset_Powerset<PS>::refine(const Constraint_System&) renamed
+ Pointset_Powerset<PS>::refine_with_constraint(const Constraint&)
+ and Pointset_Powerset<PS>::refine_with_constraints(const
+ Constraint_System&), respectively.
+
+2008-03-18 Tuesday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.56): Disabled test program congruences1.
+
+2008-03-18 Tuesday 20:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/membytes1.cc (1.7): Invoke refine_with_constraint()
+ instead of the no longer existing refine().
+
+2008-03-18 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.49), src/Box.inlines.hh (1.28),
+ tests/Box/Makefile.am (1.55), tests/Box/refine1.cc (1.13),
+ tests/Box/refine2.cc (1.13), tests/Box/refine3.cc (1.6),
+ tests/Box/refinewithconstraint1.cc (1.1),
+ tests/Box/refinewithconstraint2.cc (1.1),
+ tests/Box/refinewithconstraints1.cc (1.2),
+ tests/Box/refinewithconstraints2.cc (1.1): Duplicate code
+ avoided. Fixed some comments. Test programs reorganized.
+
+2008-03-18 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithconstraint1.cc (simplex.1): file
+ refinewithconstraint1.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithconstraint2.cc (simplex.1): file
+ refinewithconstraint2.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithconstraints2.cc (simplex.1): file
+ refinewithconstraints2.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.defs.hh (1.48), src/Box.inlines.hh (1.27),
+ src/Box.templates.hh (1.107), tests/Box/Makefile.am (1.54),
+ tests/Box/refinewithcongruences1.cc (1.1),
+ tests/Box/refinewithconstraints1.cc (1.1): Added
+ refine_with_constraint(), refine_with_constraints(),
+ refine_with_congruence(), refine_with_congruences() methods to
+ the Box domain.
+
+2008-03-18 Tuesday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refinewithcongruences1.cc (simplex.1): file
+ refinewithcongruences1.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.240): All the method names in the temporary documentation
+ now preceded by the \p for use in doxygen code. Also, all code
+ here has been enclosed in the \code \endcode environment.
+
+2008-03-18 Tuesday 14:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.117), src/BD_Shape.inlines.hh (1.159),
+ src/Octagonal_Shape.defs.hh (1.43),
+ src/Octagonal_Shape.inlines.hh (1.31),
+ src/Octagonal_Shape.templates.hh (1.72),
+ tests/BD_Shape/congruences1.cc (1.4),
+ tests/BD_Shape/constraints1.cc (1.24),
+ tests/Octagonal_Shape/congruences1.cc (1.3),
+ tests/Octagonal_Shape/constraints1.cc (1.7): Removed the
+ and_minimize versions of the new refine_with methods.
+
+2008-03-18 Tuesday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/congruences1.cc (simplex.1): file congruences1.cc
+ was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-03-18 Tuesday 13:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.239): Completed what I can of the documentation for the
+ geometric descriptors.
+
+2008-03-18 Tuesday 12:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.238): Added to the draft documentation on geometric
+ descrptors.
+
+2008-03-18 Tuesday 10:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.116), src/BD_Shape.inlines.hh (1.158),
+ src/BD_Shape.templates.hh (1.98), src/Octagonal_Shape.defs.hh
+ (1.42), src/Octagonal_Shape.inlines.hh (1.30),
+ src/Octagonal_Shape.templates.hh (1.71),
+ tests/BD_Shape/congruences1.cc (1.3),
+ tests/BD_Shape/constraints1.cc (1.23),
+ tests/Octagonal_Shape/congruences1.cc (1.2),
+ tests/Octagonal_Shape/constraints1.cc (1.6): Added
+ refine_with_[constraint GD] both with and without "and_minimize".
+ A few tests added. Small corrections to documentation for the
+ add_[constraint GD] methods.
+
+2008-03-14 Friday 09:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (1.16): test07 definitely
+ fails when using 8-bit coefficients and checking assertions.
+
+2008-03-14 Friday 09:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.76): Added macros
+ DO_TEST_F<size><assertions>_MAY_OVERFLOW_IF_INEXACT for all
+ possible bounded coefficient types.
+
+2008-03-14 Friday 08:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.75), BD_Shape/max_min2.cc (1.12): Modified
+ the check_result helper function so as to take as input two
+ _checked_ mpq_class numbers, rather than bare mpq_class. Adapted
+ test10 of max_min2.cc accordingly.
+
+2008-03-11 Tuesday 08:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.237): Added a note on upward and downward approximations.
+
+2008-03-10 Monday 15:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (1.11): Corrected silly initialization
+ error of an mpq_class object from bounded numerator and
+ denumrators.
+
+2008-03-10 Monday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (1.10): test10 modified so as to check
+ its result using helper functions computing distances, thereby
+ allowing for approximations.
+
+2008-03-10 Monday 12:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.74): Added overloading for helper function
+ check_result that allows for computing the rectilinear distance
+ between two mpq_class numbers.
+
+2008-03-10 Monday 12:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.236): Started drafting a text that, properly elaborated,
+ should constitute the "philosophy" of our user interfaces.
+
+2008-03-10 Monday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.73): Added overloading for function
+ check_result to compute and check distances between a pair of
+ (closure) points.
+
+2008-03-10 Monday 11:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.126), Generator.inlines.hh (1.64):
+ Added functions to compute the (rectilinear, euclidean or
+ l-infinify) distance between a pair of (closure) points.
+
+2008-03-10 Monday 07:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Octagonal_Shape.inlines.hh (1.29): Corrected a couple of
+ comments.
+
+ When building from a congruence system, for a non-zero dimension
+ universe octagon, first set the stongly closed flag (as is
+ already done for building from other systems).
+
+2008-03-09 Sunday 23:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.106): Braces added to avoid ambiguous
+ `else'.
+
+2008-03-08 Saturday 11:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.32), Watchdog/ltmain.sh (1.21),
+ Watchdog/m4/libtool.m4 (1.3), Watchdog/m4/ltversion.m4 (1.2),
+ m4/libtool.m4 (1.3), m4/ltversion.m4 (1.2): Updated from Libtool
+ 2.3a.
+
+2008-03-07 Friday 22:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/max_min2.cc (1.7): The bug shown by test07
+ is now corrected.
+
+2008-03-07 Friday 21:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (1.9): The bug shown by test10 is now
+ corrected.
+
+2008-03-07 Friday 21:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.97), MIP_Problem.cc (1.66):
+ Corrected a bug in the evaluation of objective function whereby a
+ wrong result could have been obtained if the objective function
+ had a non-zero inhomogeneous term and the evaluating point was
+ non-integral.
+
+2008-03-07 Friday 16:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/max_min2.cc (1.8), Octagonal_Shape/max_min2.cc
+ (1.6): test07 in Octagonal_Shape/max_min2.cc and test10 in
+ BD_Shape/max_min2.cc show a bug in having an inhomogeneous term
+ in the linear expression for maximize() and minimize() when the
+ denominator is different from 1.
+
+2008-03-07 Friday 11:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh (1.96),
+ src/Octagonal_Shape.templates.hh (1.70),
+ tests/BD_Shape/relations3.cc (1.31), tests/BD_Shape/relations4.cc
+ (1.13), tests/Octagonal_Shape/relatwithcons3.cc (1.3): Improved
+ the code again for the relations_with() for constraints for both
+ the Octagons and BD_Shapes. Tests also improved.
+
+ The BD_Shape relation_with() for congruences now uses the
+ relation_with() for constraints instead of the temporary
+ implementation that converted to polyhedra to compute the
+ relations.
+
+2008-03-07 Friday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons3.cc (simplex.1): file
+ relatwithcons3.cc was added on branch simplex on 2008-06-06
+ 14:22:12 +0000
+
+2008-03-07 Friday 09:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Octagonal_Shape/relatwithcons3.cc (1.2),
+ src/Octagonal_Shape.templates.hh (1.69): Revised relation_with()
+ for a congruence so as to use the relation_with() for a
+ constraint instead of the temporary implementation which was
+ coverting the octagon to a polyhedron and using the method there.
+
+ Fixed a bug in relation_with() for a (non-octagonal) constraint
+ due to the inclusion of the inhomogeneous term in the linear
+ expression when calling maximize() and minimize().
+
+2008-03-07 Friday 07:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/relations3.cc (simplex.1): file relations3.cc was added
+ on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-03-07 Friday 07:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.105), tests/Box/relations3.cc (1.5):
+ Redone the previous correction for the interval_relation() when
+ the relation symbol is an equality as it did not correct the case
+ when the interval was fully bounded. A further test added for
+ bounded intervals and equality.
+
+2008-03-06 Thursday 22:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.104), tests/Box/relations3.cc (1.4):
+ Fixed a bug in the interval_relation() when the relation is an
+ equality. Test added that showed this bug.
+
+2008-03-06 Thursday 16:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Octagonal_Shape.defs.hh (1.41),
+ src/Octagonal_Shape.templates.hh (1.68),
+ tests/BD_Shape/relations4.cc (1.12),
+ tests/Octagonal_Shape/Makefile.am (1.25),
+ tests/Octagonal_Shape/relatwithcons3.cc (1.1): In the Octagon
+ domain, the relation_with() for a constraint now finds the
+ relation with a non-octagonal difference constraint.
+
+ Comment in Octagonal.defs.hh for relation_with() wrt this
+ updated.
+
+ Tests add to test this change.
+
+ All tabs replaced by spaces in Octagonal.defs.hh and
+ Octagonal_Shape.templates.hh
+
+ The (if noisy) generated output in tests/BD_Shape/relations4.cc
+ corrected.
+
+2008-03-06 Thursday 15:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: BD_Shape.defs.hh (1.115), BD_Shape.templates.hh (1.95):
+ Removed/replaced all tabs.
+
+2008-03-06 Thursday 14:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.templates.hh (1.94): Two comment lines added.
+
+2008-03-06 Thursday 13:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.114), src/BD_Shape.templates.hh (1.93),
+ tests/BD_Shape/Makefile.am (1.72), tests/BD_Shape/relations2.cc
+ (1.25), tests/BD_Shape/relations3.cc (1.30),
+ tests/BD_Shape/relations4.cc (1.11): relation_with() for a
+ constraint can now handle any constraint even if it is not a
+ bounded difference.
+
+ Comment in BD_Shape.defs.hh for this method updated.
+
+ Tests added to check this (and existing tests to check exceptions
+ revised).
+
+2008-03-06 Thursday 08:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.16): Enabled intersection_assign_and_minimize for all the Box
+ domains, powersets with a Box domain as a disjunct and products
+ with a Box domain as a component.
+
+2008-03-06 Thursday 08:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.15): In all the interfaces, the bounded_affine_image,
+ generalized_affine_image, generalized_affine_image_lhs_rhs
+ procedures are enabled now for: all the Box domains, powersets
+ with a Box domain as its disjunct and products with a Box domain
+ as a component.
+
+2008-03-05 Wednesday 22:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.304), Watchdog/configure.ac (1.44): Use the new
+ style macro to initialize Libtool.
+
+2008-03-05 Wednesday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.31), Watchdog/ltmain.sh (1.20),
+ Watchdog/m4/libtool.m4 (1.2), m4/libtool.m4 (1.2): Updated to the
+ CVS HEAD version of Libtool: this seems to solve the problems we
+ experienced since the switch to Libtool 2.2.
+
+2008-03-03 Monday 13:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.defs.hh (1.47), src/Box.inlines.hh (1.26),
+ tests/Box/intersection1.cc (1.9): Added method
+ intersection_assign_and_minimize() needed for uniformity with
+ other domains in the PPL.
+
+2008-03-03 Monday 08:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.103), tests/Box/boundedaffineimage1.cc
+ (1.16), tests/Box/generalizedaffineimage1.cc (1.15),
+ tests/Box/generalizedaffineimage2.cc (1.5): Corrected two bugs,
+ one in bounded_affine_image() when setting an interval to be
+ unbounded caused an exception to be thrown and the other in
+ generalized_affine_image/4 where the bounds were set when they
+ should have been left unbounded.
+
+ The first bug was illustrated by the extra test17 in
+ boundedaffineimage1.cc
+
+ The second bug by a modified form of test04 in
+ generalizedaffineimage2.cc (previously the test did not test
+ anything that is not tested elsewhere).
+
+ Some tests in generalizedaffineimage1.cc used constraints that
+ were not non-relational. Corrected.
+
+2008-03-03 Monday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/generalizedaffineimage2.cc (simplex.1): file
+ generalizedaffineimage2.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-02 Sunday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on branch
+ simplex on 2008-06-06 14:22:04 +0000
+
+2008-03-02 Sunday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on
+ branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-03-02 Sunday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.41), ltmain.sh (1.30), Watchdog/config.guess
+ (1.25), Watchdog/ltmain.sh (1.19), Watchdog/m4/libtool.m4 (1.1),
+ Watchdog/m4/ltoptions.m4 (1.1), Watchdog/m4/ltsugar.m4 (1.1),
+ Watchdog/m4/ltversion.m4 (1.1), Watchdog/m4/lt~obsolete.m4 (1.1),
+ m4/libtool.m4 (1.1), m4/ltoptions.m4 (1.1), m4/ltsugar.m4 (1.1),
+ m4/ltversion.m4 (1.1), m4/lt~obsolete.m4 (1.1): Switched to
+ Libtool 2.2.
+
+2008-03-02 Sunday 09:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.72), Box/generalizedaffinepreimage1.cc
+ (1.15): A couple of the test (11 and 15): - definitely overflow
+ when using 8 bit integers; - may overflow when using bigger
+ bounded integers and inexact intervals boundary types. Added
+ new macro DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT to deal with these
+ cases ... this is a tentative approach, have to decide if it is
+ the way to go.
+
+2008-03-02 Sunday 08:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.71): Added a couple of using declaration for
+ the IO_Operators namespace.
+
+2008-03-01 Saturday 23:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: boundedaffineimage1.cc (1.15),
+ boundedaffinepreimage1.cc (1.8), generalizedaffinepreimage1.cc
+ (1.14): A few tests may overflow if bounded integers coefficients
+ *and* inexact interval boundary types are used together.
+
+2008-03-01 Saturday 23:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boundedaffinepreimage1.cc (simplex.1): file
+ boundedaffinepreimage1.cc was added on branch simplex on
+ 2008-06-06 14:22:10 +0000
+
+2008-03-01 Saturday 21:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (1.13): One of the
+ previous changes reverted: test 7 needs an NNC polyhedron when
+ checking for the known result.
+
+2008-03-01 Saturday 19:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (1.12): Test 7 overflows
+ when using 8 bit integers with assertions turned on; tests 11 and
+ 15 overflow with 8 bit integers independently from assertions.
+
+2008-03-01 Saturday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boundedaffineimage1.cc (1.14): Tests 9 and 10 always
+ succeed.
+
+2008-03-01 Saturday 16:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.102): Fixed several issues in method
+ bounded_affine_preimage that were preventing compilation when
+ using bounded coefficient types; also corrected several
+ efficiency bugs.
+
+2008-03-01 Saturday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (1.11): Fixed a bunch of
+ known results by computing distances or requiring comparison with
+ an NNC polyhedron if the exact boundaries are open.
+
+2008-03-01 Saturday 14:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (1.17): Modified implementation of
+ templatic constructor taking a Box: open bounds are now
+ approximated using topologically closed halfspaces if the
+ polyhedron being built is necessarily closed.
+
+2008-03-01 Saturday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.7): In test09() a
+ C_Polyhedron is enough to check the result obtained.
+
+2008-03-01 Saturday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.70): Improved check_result() functions.
+
+2008-03-01 Saturday 09:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (1.10): Indentation
+ fixed.
+
+2008-03-01 Saturday 09:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.6): Temporarily patched
+ test09(); FIXME added.
+
+2008-03-01 Saturday 08:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.5): Indentation fixed.
+ Please do insert the lines
+
+ ;; Do not use tabs for indentation. (setq-default
+ indent-tabs-mode nil)
+
+ into your .emacs file.
+
+2008-03-01 Saturday 08:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.4): Revised check_result
+ expected results for test12.
+
+2008-02-29 Friday 23:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.3): Corrected title line
+ of file.
+
+2008-02-29 Friday 22:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: addspacedims1.cc (1.5),
+ affinepreimage1.cc (1.7), affinepreimage2.cc (1.5),
+ boundedaffineimage1.cc (1.12), boundedaffinepreimage1.cc (1.6),
+ cc76extrapolation1.cc (1.7), expandspacedim1.cc (1.7),
+ frompolyhedron1.cc (1.6), generalizedaffineimage1.cc (1.6),
+ generalizedaffineimage2.cc (1.6), generalizedaffineimage3.cc
+ (1.11), generalizedaffineimage4.cc (1.6),
+ generalizedaffineimage5.cc (1.6), generalizedaffinepreimage1.cc
+ (1.7), generalizedaffinepreimage2.cc (1.11),
+ generalizedaffinepreimage3.cc (1.7),
+ generalizedaffinepreimage4.cc (1.6),
+ limitedbhmz05extrapolation1.cc (1.7),
+ limitedcc76extrapolation1.cc (1.7), membytes1.cc (1.6),
+ minconstraints1.cc (1.6), relatwithgen1.cc (1.10): Untabified.
+
+2008-02-29 Friday 22:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/congruences1.cc (1.2): This was ripped from the
+ Octagonal_Shape directory without even renaming variables or
+ adapting comments: fixed.
+
+2008-02-29 Friday 22:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.69), BD_Shape/addconstraints1.cc (1.22),
+ BD_Shape/addspacedims1.cc (1.19), BD_Shape/affineimage1.cc
+ (1.23), BD_Shape/affineimage2.cc (1.16),
+ BD_Shape/affinepreimage1.cc (1.24), BD_Shape/bdsdifference1.cc
+ (1.18), BD_Shape/bdshull1.cc (1.19), BD_Shape/bhmz05widening1.cc
+ (1.18), BD_Shape/boundedaffineimage1.cc (1.7),
+ BD_Shape/boundedaffinepreimage1.cc (1.7),
+ BD_Shape/cc76extrapolation1.cc (1.23), BD_Shape/cc76narrowing1.cc
+ (1.21), BD_Shape/concatenate1.cc (1.17), BD_Shape/constraints1.cc
+ (1.22), BD_Shape/expandspacedim1.cc (1.7),
+ BD_Shape/foldspacedims1.cc (1.9), BD_Shape/fromgensys1.cc (1.18),
+ BD_Shape/generalizedaffineimage1.cc (1.21),
+ BD_Shape/generalizedaffineimage2.cc (1.25),
+ BD_Shape/generalizedaffinepreimage1.cc (1.19),
+ BD_Shape/generalizedaffinepreimage2.cc (1.20),
+ BD_Shape/generalizedaffinepreimage3.cc (1.10),
+ BD_Shape/h79widening1.cc (1.16), BD_Shape/intersection1.cc
+ (1.21), BD_Shape/limitedbhmz05extrapolation1.cc (1.19),
+ BD_Shape/limitedcc76extrapolation1.cc (1.20),
+ BD_Shape/limitedh79extrapolation1.cc (1.17),
+ BD_Shape/mapspacedims1.cc (1.19), BD_Shape/minconstraints1.cc
+ (1.15), BD_Shape/removespacedims1.cc (1.24),
+ BD_Shape/timeelapse1.cc (1.25): Always use the check_result()
+ functions to check computed results against the known ones.
+
+2008-02-29 Friday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: addconstraints1.cc (1.21), addspacedims1.cc
+ (1.18), affinedimension1.cc (1.14), affineimage1.cc (1.22),
+ affineimage2.cc (1.15), ascii_dump_load1.cc (1.18), bounded1.cc
+ (1.5), boundedaffinepreimage1.cc (1.6), boundingbox1.cc (1.3),
+ cc76extrapolation1.cc (1.22), closure1.cc (1.23),
+ containsintegerpoint1.cc (1.5), discrete1.cc (1.5),
+ fromgensys1.cc (1.17), fromgrid1.cc (1.4), fromoctagonalshape1.cc
+ (1.3), fromspacedim1.cc (1.4), generalizedaffineimage1.cc (1.20),
+ generalizedaffineimage2.cc (1.24), generalizedaffinepreimage1.cc
+ (1.18), generalizedaffinepreimage2.cc (1.19),
+ generalizedaffinepreimage3.cc (1.9),
+ limitedbhmz05extrapolation1.cc (1.18),
+ limitedcc76extrapolation1.cc (1.19), mapspacedims1.cc (1.18),
+ max_min1.cc (1.5), max_min2.cc (1.7), membytes1.cc (1.6),
+ minconstraints1.cc (1.14), relations1.cc (1.20), relations2.cc
+ (1.24), relations3.cc (1.29), removespacedims1.cc (1.23),
+ timeelapse1.cc (1.24), universe1.cc (1.17), writebdshape1.cc
+ (1.13): More variables renamed.
+
+2008-02-29 Friday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: h79widening1.cc (1.15), intersection1.cc (1.20),
+ limitedbhmz05extrapolation1.cc (1.17),
+ limitedcc76extrapolation1.cc (1.18), limitedh79extrapolation1.cc
+ (1.16), mapspacedims1.cc (1.17), timeelapse1.cc (1.23),
+ writebdshape1.cc (1.12): Variable renaming completed.
+
+2008-02-29 Friday 16:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/boundedaffinepreimage1.cc (1.2): In test03, result
+ checked using check_result.
+
+2008-02-29 Friday 15:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.101), tests/Box/Makefile.am (1.53),
+ tests/Box/boundedaffinepreimage1.cc (1.1),
+ tests/Box/generalizedaffinepreimage1.cc (1.9): Added code for
+ generalized_affine_preimage (both versions) and
+ bounded_affine_preimage. Minor improvement to
+ bounded_affine_image where we add the constraint that the lower
+ bound expression must be less than the upper bound expression (or
+ vice versa if the denominator is negative).
+
+ Some tests added or revised.
+
+2008-02-29 Friday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boundedaffineimage1.cc (1.13): test09() and test10()
+ provoke an overflow only with assertions enabled.
+
+2008-02-29 Friday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: addspacedims1.cc (1.8), boundedaffineimage1.cc
+ (1.12), closure1.cc (1.6), expandspacedim1.cc (1.9),
+ frompolyhedron1.cc (1.13), generalizedaffineimage1.cc (1.14),
+ generalizedaffineimage2.cc (1.4), generalizedaffinepreimage1.cc
+ (1.8), interval1.cc (1.6), interval2.cc (1.6), minconstraints1.cc
+ (1.7), refine2.cc (1.12), refine3.cc (1.5), removespacedims1.cc
+ (1.10), timeelapse1.cc (1.9): Untabified.
+
+2008-02-29 Friday 09:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.11): Adapted test02() to the new dump
+ format.
+
+2008-02-29 Friday 09:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.100): Spurious separator avoided in
+ ascii_dump().
+
+2008-02-29 Friday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: addconstraints1.cc (1.20), addspacedims1.cc
+ (1.17), affineimage1.cc (1.21), affinepreimage1.cc (1.23),
+ ascii_dump_load1.cc (1.17), bdsdifference1.cc (1.17), bdshull1.cc
+ (1.18), bhmz05widening1.cc (1.17), boundedaffineimage1.cc (1.6),
+ boundedaffinepreimage1.cc (1.5), bounds1.cc (1.5),
+ cc76extrapolation1.cc (1.21), cc76narrowing1.cc (1.20),
+ closure1.cc (1.22), concatenate1.cc (1.16), constraints1.cc
+ (1.21), contains1.cc (1.17), disjoint1.cc (1.8), empty1.cc
+ (1.13), equality1.cc (1.18), expandspacedim1.cc (1.6),
+ foldspacedims1.cc (1.8), frompolyhedron1.cc (1.7),
+ generalizedaffineimage1.cc (1.19), generalizedaffineimage2.cc
+ (1.23), generalizedaffinepreimage1.cc (1.17),
+ generalizedaffinepreimage2.cc (1.18),
+ generalizedaffinepreimage3.cc (1.8), geomcovers1.cc (1.12),
+ limitedbhmz05extrapolation1.cc (1.16),
+ limitedcc76extrapolation1.cc (1.17), membytes1.cc (1.5),
+ minconstraints1.cc (1.13), removespacedims1.cc (1.22),
+ timeelapse1.cc (1.22): A first go at naming variables properly.
+
+2008-02-29 Friday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: generalizedaffineimage1.cc (1.13),
+ generalizedaffineimage2.cc (1.3): Always the check_result()
+ function to check results.
+
+2008-02-29 Friday 07:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boundedaffineimage1.cc (1.11): test09() and test10()
+ cause overflows with 32-bit or narrower coefficients.
+
+2008-02-28 Thursday 23:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: addconstraints1.cc (1.12), addspacedims1.cc (1.7),
+ affineimage1.cc (1.10), affinepreimage1.cc (1.7),
+ boundedaffineimage1.cc (1.10), boxdifference1.cc (1.8),
+ boxhull1.cc (1.7), cc76narrowing1.cc (1.7), cc76widening.cc
+ (1.8), concatenate1.cc (1.8), congruences1.cc (1.3),
+ constraints1.cc (1.11), frombdshape1.cc (1.4), fromgensys1.cc
+ (1.6), generalizedaffineimage1.cc (1.12),
+ generalizedaffineimage2.cc (1.2), generalizedaffinepreimage1.cc
+ (1.7), intersection1.cc (1.8), mapspacedims1.cc (1.7), refine1.cc
+ (1.12), refine3.cc (1.4), removespacedims1.cc (1.9),
+ timeelapse1.cc (1.8): Always use check_result() to check for
+ correctness of the results.
+
+2008-02-28 Thursday 22:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: bdsdifference1.cc (1.7), boxhull.cc (1.6): Unwanted
+ file removed.
+
+2008-02-28 Thursday 22:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/timeelapse1.cc (1.7): Comments fixed.
+
+2008-02-28 Thursday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: addconstraints1.cc (1.11), addspacedims1.cc (1.6),
+ affineimage1.cc (1.9), affinepreimage1.cc (1.6),
+ expandspacedim1.cc (1.8), foldspacedims1.cc (1.9), geomcovers1.cc
+ (1.6), mapspacedims1.cc (1.6), removespacedims1.cc (1.8): Do not
+ name something `box1' if there is no `box2' in sight.
+
+2008-02-28 Thursday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.99): All other things being equal, always
+ prefer preincrement and predecrement to postincrement and
+ postdecrement.
+
+2008-02-28 Thursday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.defs.hh (1.23): Spurious semicolon
+ removed.
+
+2008-02-28 Thursday 21:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.46), Box.templates.hh (1.98): Meaningless
+ type qualifiers removed.
+
+2008-02-28 Thursday 21:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.45): Indentation fixed. Spurious semicolon
+ and useless namespace enclosure removed.
+
+2008-02-28 Thursday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.44), Box.inlines.hh (1.25), Box.templates.hh
+ (1.97), Box_Status.idefs.hh (1.2), Box_Status.inlines.hh (1.2):
+ The Box class now uses (badly) the new Status member instead of
+ the old two booleans.
+
+2008-02-28 Thursday 17:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.96): Initialize a local variable in
+ generalized_affine_image so as to avoid an annoying warning.
+
+2008-02-28 Thursday 17:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/generalizedaffineimage1.cc (1.11): Avoid long lines.
+
+2008-02-28 Thursday 17:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boundedaffineimage1.cc (1.9): Corrected known result
+ for test03: no approximation is needed in this case. Computed
+ distances between known and computed result for test10.
+
+2008-02-28 Thursday 17:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.95): Fixed an error in
+ l_m_distance_assign.
+
+2008-02-28 Thursday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: boundedaffineimage1.cc (1.8),
+ generalizedaffineimage1.cc (1.10): Expected results revised.
+ Notive that test10() in boundedaffineimage1.cc shows there is a
+ bug in check_result().
+
+2008-02-28 Thursday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.86), devref.doxyconf-latex.in
+ (1.25): Mention input files math_utilities.*.
+
+2008-02-28 Thursday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: globals.cc (1.33), math_utilities.inlines.hh (1.2):
+ Implementation of function is_canonical() is now inlines and in a
+ proper place.
+
+2008-02-28 Thursday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/math_utilities.inlines.hh (simplex.1): file
+ math_utilities.inlines.hh was added on branch simplex on
+ 2008-06-06 14:22:05 +0000
+
+2008-02-28 Thursday 11:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.207): Reference CC79 added.
+
+2008-02-28 Thursday 10:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/: boundedaffineimage1.cc (1.7),
+ generalizedaffineimage1.cc (1.9): Revised expected results to
+ allow for inexact computations.
+
+2008-02-28 Thursday 10:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.18): Minor typo corrected in docs.
+
+2008-02-28 Thursday 10:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.67): Indentation fixed.
+
+2008-02-25 Monday 11:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.94), src/Polyhedron_public.cc (1.109),
+ tests/Box/Makefile.am (1.52),
+ tests/Box/generalizedaffineimage1.cc (1.8),
+ tests/Box/generalizedaffineimage2.cc (1.1): Added implementation
+ for generalized_affine_image/3 Tests added and existing tests
+ revised.
+
+ Indentation corrected in src/Polyhedron_public.cc.
+
+2008-02-22 Friday 23:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron_public.cc (1.108),
+ tests/Polyhedron/boundedaffineimage1.cc (1.14): Fixed bug
+ indicated in previous commit. Added two further tests to
+ tests/Polyhedron/boundedaffineimage1.cc to cover more cases of
+ positive and negative denominator.
+
+2008-02-22 Friday 13:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.93): Use temporaries more in the
+ bounded_affine_image/4 code..
+
+2008-02-22 Friday 12:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.92), tests/Box/Makefile.am (1.51),
+ tests/Box/boundedaffineimage1.cc (1.6),
+ tests/Box/generalizedaffineimage1.cc (1.7): First draft of code
+ for generalized_affine_image/4 and bounded_affine_image/4.
+
+ Tests revised and also enabled in Makefile.am.
+
+2008-02-22 Friday 12:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/boundedaffineimage1.cc (1.13): Added a test04
+ that shows a bug in bounded_affine_image().
+
+2008-02-21 Thursday 13:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.6),
+ devref-c-interface.doxyconf-latex.in (1.6),
+ devref-c-interface.tex (1.4),
+ devref-prolog-interface.doxyconf-html.in (1.5),
+ devref-prolog-interface.doxyconf-latex.in (1.5),
+ devref.doxyconf-html.in (1.85), devref.doxyconf-latex.in (1.24),
+ devref.tex (1.25), fdl.dox (1.8), gpl.dox (1.9),
+ user-c-interface.doxyconf-html.in (1.7),
+ user-c-interface.doxyconf-latex.in (1.7), user-c-interface.tex
+ (1.4), user-prolog-interface.doxyconf-html.in (1.6),
+ user-prolog-interface.doxyconf-latex.in (1.6),
+ user-prolog-interface.tex (1.4), user.doxyconf-html.in (1.42),
+ user.doxyconf-latex.in (1.13), user.tex (1.26): Modified
+ configuration files for the HTML versions of foreign language
+ interface manuals so that they will always include a new copy of
+ the GPL and GFDL licenses. Creating a documentation page in
+ Doxygen using command \page does not produces a referenceable
+ anchor: hence, explicitly added commands \anchor to gpl.dox and
+ fdl.dox; modified main *.tex pages so as to proper reference
+ these anchors (thereby solving a long standing issue). All
+ Doxygen configuration files upgraded to version 1.5.5.
+
+2008-02-19 Tuesday 22:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.29), ppl_interface_generator_ocaml_ml_code.m4 (1.24),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.18): Added the
+ Tuareg emacs mode at the start of the ml and mli files and the
+ C++ mode at the start of the cc file. These then used to help
+ improved some formatting.
+
+2008-02-19 Tuesday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.40), Octagonal_Shape.inlines.hh
+ (1.28), Octagonal_Shape.templates.hh (1.66), Og_Status.idefs.hh
+ (1.10): Added methods to operate on the status.
+
+2008-02-19 Tuesday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.113): Comment improved.
+
+2008-02-19 Tuesday 22:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.43), Box.templates.hh (1.91): Added a (still
+ unused) status member.
+
+2008-02-19 Tuesday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.112), BD_Shape.inlines.hh (1.157),
+ BD_Shape.templates.hh (1.92): Added methods to operate on the
+ status.
+
+2008-02-19 Tuesday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BDS_Status.idefs.hh (1.24): Comment improved.
+
+2008-02-19 Tuesday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box_Status.idefs.hh (1.1), Box_Status.inlines.hh (1.1),
+ Makefile.am (1.179): Declaration and definitions of the class
+ Box<Interval>::Status.
+
+2008-02-19 Tuesday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.23), BDS_Status.inlines.hh (1.19),
+ Grid_Status.idefs.hh (1.9), Og_Status.idefs.hh (1.9),
+ Ph_Status.idefs.hh (1.23): Multiple inclusion guards fixed.
+
+2008-02-19 Tuesday 13:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.42), Partially_Reduced_Product.defs.hh
+ (1.22): Fixed a bunch of Doxygen related errors and warnings.
+
+2008-02-17 Sunday 22:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron_public.cc (1.107): Small improvement to code for
+ relation_with(Congruence).
+
+2008-02-17 Sunday 00:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.70): Enable
+ relation_with() for a congruence for the weakly relational
+ domains in all the interfaces.
+
+2008-02-16 Saturday 23:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.90), tests/Box/relations4.cc (1.3):
+ Improved code changed for 0-dimensional box domains for
+ relation_with() for a congruence. Added a test to check this
+ change.
+
+2008-02-16 Saturday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/relations4.cc (simplex.1): file relations4.cc was added
+ on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-02-16 Saturday 23:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.69),
+ src/Box.templates.hh (1.89), tests/Box/relations4.cc (1.2):
+ Enabled the relation_with() for box domains in all the
+ interfaces.
+
+ The Prolog generated tests showed a bug in the code for the zero
+ dimensional empty Box - now tested in relations 4.cc.
+
+ The bug has been fixed.
+
+2008-02-16 Saturday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.inlines.hh (1.34), Interval_Info.defs.hh (1.7):
+ Properly comment the closing brace of namespaces. When used in
+ templates, Parma_Polyhedra_Library::used() should be fully
+ qualified.
+
+2008-02-16 Saturday 15:28 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.55): Some fixes to refine_universal.
+ Added unrepresentability_error check.
+
+2008-02-16 Saturday 15:04 Abramo Bagnara
+
+ * src/Boundary.defs.hh (1.11): Propagate unrepresentability error
+ insted of aborting.
+
+2008-02-16 Saturday 13:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.defs.hh (1.41), src/Box.templates.hh (1.88),
+ tests/Box/Makefile.am (1.50), tests/Box/relations4.cc (1.1):
+ Renamed private method interval_relation_no_check() as
+ interval_relation() as there is now nothing that is unchecked.
+ Added relation_with() for congruences for Boxes.
+
+2008-02-16 Saturday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/membytes1.cc (1.6): Test rewritten.
+
+2008-02-16 Saturday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.49): Do test also with membytes1.cc.
+
+2008-02-15 Friday 18:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.87): Corrected a bug in an assignment in
+ relation_with().
+
+2008-02-15 Friday 15:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.86), tests/Box/relations3.cc (1.3): Bug
+ identified in previous commit, fixed.
+
+2008-02-15 Friday 15:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/relations3.cc (1.2): Extra test shows a bug in the
+ relation_with() for congruences for a non-relational,
+ 1-dimensional box and constraint.
+
+2008-02-15 Friday 12:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.30),
+ C/ppl_interface_generator_c_h_code.m4 (1.20),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.47), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.64):
+ Include emacs mode at the top of the code files. A few minor
+ bugs fixed and for Prolog and C files, indentation improved using
+ emacs.
+
+2008-02-15 Friday 11:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.36): Missing change for uniformity of m4 files, related to the
+ previous two commits.
+
+2008-02-15 Friday 10:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.16):
+ Add a copyright notice to the generated file.
+
+2008-02-15 Friday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (simplex.1): file
+ ppl_interface_generator_ocaml_procedure_generators.m4 was added
+ on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (simplex.1): file
+ ppl_interface_generator_prolog_procedure_generators.m4 was added
+ on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+ (simplex.1): file
+ ppl_interface_generator_java_procedure_generators.m4 was added on
+ branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-02-15 Friday 10:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.32),
+ ppl_interface_generator_common_dat.m4 (1.68),
+ ppl_interface_generator_common_procedure_generators.m4 (1.14),
+ C/ppl_interface_generator_c_cc.m4 (1.16),
+ C/ppl_interface_generator_c_cc_code.m4 (1.29),
+ C/ppl_interface_generator_c_h.m4 (1.16),
+ C/ppl_interface_generator_c_h_code.m4 (1.19),
+ C/ppl_interface_generator_c_procedure_generators.m4 (1.5),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.6),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.13),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.46), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.9),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.28),
+ OCaml/ppl_interface_generator_ocaml_ml.m4 (1.14),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.23),
+ OCaml/ppl_interface_generator_ocaml_mli.m4 (1.12),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.17),
+ OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.4), Prolog/ppl_interface_generator_prolog_icc.m4 (1.15),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.63),
+ Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.2), Prolog/ppl_interface_generator_prolog_systems.m4 (1.14),
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.8),
+ Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.9), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.8),
+ Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.12),
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.15),
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.9),
+ Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.11),
+ Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.10), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.9),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.74),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.35): Include a description of what the m4 code is for in each
+ file. Improved other details to make the code more uniform
+ across all interfaces and all the different m4 file generators.
+
+ Included the copyright notice in more of the generated files.
+
+2008-02-14 Thursday 22:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Box.defs.hh (1.40), Box.templates.hh (1.85): The
+ Constraint::Type is passed as a parameter to
+ interval_relation_no_check() instead of the Relation_Symbol.
+
+2008-02-14 Thursday 18:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Box.defs.hh (1.39), Box.templates.hh (1.84): In the code
+ for relation_with() for constraints, avoid reconstructing the
+ constraint only for the private method that implements the main
+ cases to have to deconstruct the constraint. Comments improved.
+
+2008-02-14 Thursday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.34): The out-of-range
+ test in
+
+ template <typename U, typename V> U jtype_to_unsigned(const V&)
+
+ was indeed necessary. Restored, but in a more efficient and
+ warning-free way.
+
+2008-02-14 Thursday 13:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.83): Parameter renamed. Avoid to declare
+ things that are only used in assertions, unless everything is
+ within #ifndef NDEBUG / #endif.
+
+2008-02-14 Thursday 12:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.defs.hh (1.38), src/Box.templates.hh (1.82),
+ tests/Box/Makefile.am (1.48), tests/Box/relations2.cc (1.5),
+ tests/Box/relations3.cc (1.1): Completed implementation for
+ relation_with(Constraint) for a Box when the constraint is not an
+ interval constraint. Tests added for this case.
+
+ The implementation is split between a private method that finds
+ the relation between an interval and a one dimensional constraint
+ and the public method for any box and any constraint.
+
+2008-02-14 Thursday 10:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.45),
+ ppl_java_common.hh (1.33): template <typename U, typename V> U
+ jtype_to_unsigned(const V&) was unnecessarily complex and
+ generated an annoying warning: fixed.
+
+2008-02-13 Wednesday 12:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.67): Spelling
+ corrected.
+
+ Previous commit change: removed redundant code and simplified
+ code for the disjunct replacement.
+
+2008-02-13 Wednesday 12:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.66),
+ src/Partially_Reduced_Product.inlines.hh (1.21),
+ tests/Grid/partiallyreducedproduct4.cc (1.2): Fixed the bug
+ indicated by the tests added in the previous commit. Ensure that
+ emptiness is always shared between the components for the
+ Constraints_Product product_reduce().
+
+2008-02-13 Wednesday 09:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.60), partiallyreducedproduct4.cc
+ (1.1): Two tests indicate bugs for Constraints_Product when a
+ component is a box.
+
+2008-02-13 Wednesday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Integer.hh (1.7), Makefile.am (1.178), Row.inlines.hh
+ (1.68), globals.defs.hh (1.55), globals.inlines.hh (1.23): Header
+ file reorganization consequent to the introduction of
+ math_utilities.*.
+
+2008-02-13 Wednesday 08:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.inlines.hh (1.79), checked.inlines.hh
+ (1.42): Redundant memory size inspection functions removed from
+ the Checked namespace.
+
+2008-02-13 Wednesday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: math_utilities.defs.hh (1.1), math_utilities.inlines.hh
+ (1.1): New sources containing some math utility functions
+ previously in globals.*.
+
+2008-02-13 Wednesday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/math_utilities.defs.hh (simplex.1): file
+ math_utilities.defs.hh was added on branch simplex on 2008-06-06
+ 14:22:05 +0000
+
+2008-02-12 Tuesday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.81): Several improvements in
+ Box<Interval>::relation_with(const Constraint&).
+
+2008-02-12 Tuesday 21:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.80): Drafted the first part of the code
+ required so that Box<Interval>::relation_with(const Constraint&
+ c) does the right thing whatever is the form of `c'.
+
+2008-02-12 Tuesday 21:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.inlines.hh (1.33): Silenced a warning.
+
+2008-02-12 Tuesday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.177), Rational_Box.hh (1.8): Rational_Box is
+ now Box<Rational_Interval>.
+
+2008-02-12 Tuesday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rational_Interval.hh (1.1): Rational_Interval is an internal
+ class implementing an interval with rational, possibly open
+ boundaries.
+
+2008-02-12 Tuesday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rational_Interval.hh (simplex.1): file Rational_Interval.hh
+ was added on branch simplex on 2008-06-06 14:22:05 +0000
+
+2008-02-12 Tuesday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked_mpq.inlines.hh (1.46), checked_mpz.inlines.hh
+ (1.53), meta_programming.hh (1.11): More Is_Native
+ specializations moved to meta_programming.hh.
+
+2008-02-12 Tuesday 18:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.73): Avoid some annoying warning messages.
+
+2008-02-12 Tuesday 18:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.65),
+ ppl_interface_generator_common_procedure_generators.m4 (1.13),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.72): Enable the memory_in_bytes methods for pointset_powersets
+ of boxes and for products with boxes as components.
+
+ The Prolog tests expected results have to allow for any
+ Uint*_Box.
+
+2008-02-12 Tuesday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.303): Allow digits in the computation of
+ `required_instantiations_java_sources'.
+
+2008-02-12 Tuesday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh (1.29): Previous commit completed.
+
+2008-02-12 Tuesday 12:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.inlines.hh (1.24), Interval.inlines.hh (1.32),
+ checked_mpq.inlines.hh (1.45), checked_mpz.inlines.hh (1.52),
+ globals.defs.hh (1.54), globals.inlines.hh (1.22): Moved all the
+ memory occupation inspection functions to globals.*. In
+ GMP_Integer.defs.hh we keep the declarations of memory_size_type
+ total_memory_in_bytes(const GMP_Integer& x) and memory_size_type
+ external_memory_in_bytes(const GMP_Integer& x), in order to obey
+ the rule "every public PPL object has memory inspection
+ functions." However, not to confuse Doxygen with (apparently)
+ duplicated documentation, the documentation of the declarations
+ in GMP_Integer.defs.hh is controlled by #ifndef
+ PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS.
+
+2008-02-12 Tuesday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.53), globals.inlines.hh (1.21): Added
+ template <typename T> memory_size_type
+ external_memory_in_bytes(const T&) enabled for all native types
+ T.
+
+2008-02-12 Tuesday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked.defs.hh (1.45), checked_float.inlines.hh (1.84),
+ checked_int.inlines.hh (1.66), meta_programming.hh (1.10): Moved
+ the definitions for Is_Native to meta_programming.hh.
+
+2008-02-12 Tuesday 09:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.64),
+ ppl_interface_generator_common_procedure_generators.m4 (1.12),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.71), Prolog/tests/ppl_predicate_check_common.pl (1.10): A
+ couple of bugs in the m4 code fixed Enabled the generation of a
+ few more procedures for certain domains.
+
+ A bug in the Prolog test files fixed.
+
+2008-02-11 Monday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.97): Let
+ external_memory_in_bytes(const Checked_Number<T, Policy>&) return
+ memory_size_type, not size_t.
+
+2008-02-11 Monday 12:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.37), Box.inlines.hh (1.24), Box.templates.hh
+ (1.79): Added Box<Interval>::total_memory_in_bytes() and
+ Box<Interval>::memory_size_type external_memory_in_bytes().
+
+2008-02-11 Monday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.54), Interval.inlines.hh (1.31): Added
+ Interval<Boundary, Info>::external_memory_in_bytes() and
+ Interval<Boundary, Info>::total_memory_in_bytes().
+
+2008-02-11 Monday 10:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.36), Box.templates.hh (1.78): Adde
+ Box<Interval>::topological_closure_assign().
+
+2008-02-11 Monday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.53): Added void Interval<Boundary,
+ Info>::topological_closure_assign().
+
+2008-02-11 Monday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.77): Optimized bool
+ Box<Interval>::is_topologically_closed() const: if
+ !Interval::info_type::store_open, then the box is certainly
+ topologically closed.
+
+2008-02-10 Sunday 22:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * instchk.hh (1.15),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.63),
+ interfaces/C/Makefile.am (1.40),
+ interfaces/C/ppl_interface_generator_c_cc.m4 (1.15),
+ interfaces/Java/jni/Makefile.am (1.18),
+ interfaces/Java/jni/ppl_java_common.hh (1.32),
+ interfaces/OCaml/Makefile.am (1.38),
+ interfaces/OCaml/ppl_ocaml_globals.cc (1.13),
+ interfaces/Prolog/ppl_prolog_common.icc (1.15): Enable all 13
+ types of boxes in interfaced_boxes.hh for all the interfaces, as
+ they are or as disjuncts to the powerset domain or as components
+ of the product domain.
+
+ instchk.hh allows for all of these boxes to be arguments to
+ "-instantiations" in the configuration.
+
+ Macro m4_get_class_index name changed to m4_get_class_counter so
+ that the word "counter" is used consistently for the number
+ associated to the class being generated.
+
+2008-02-08 Friday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/interfaced_boxes.hh (1.4): Added declarations for the
+ native integer boxes.
+
+2008-02-08 Friday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/interfaced_boxes.hh (simplex.1): file
+ interfaced_boxes.hh was added on branch simplex on 2008-06-06
+ 14:21:57 +0000
+
+2008-02-08 Friday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: interfaced_boxes.hh (1.3),
+ Prolog/ppl_prolog_common.icc (1.14), Prolog/Ciao/Makefile.am
+ (1.72), Prolog/GNU/Makefile.am (1.70), Prolog/SICStus/Makefile.am
+ (1.86), Prolog/SWI/Makefile.am (1.82), Prolog/XSB/Makefile.am
+ (1.62), Prolog/YAP/Makefile.am (1.59): Include
+ interfaced_boxes.hh into all Prolog interfaces.
+
+2008-02-08 Friday 14:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/interfaced_boxes.hh (1.2): Fixed a missing ">".
+
+2008-02-08 Friday 13:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.62): Minor
+ technical improvements to the m4 code.
+
+2008-02-08 Friday 13:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.31), interfaced_boxes.hh (1.1): New
+ header file (to be completed) providing declarations for the Box
+ instantiations offered by the foreign interfaces.
+
+2008-02-08 Friday 13:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.31),
+ ppl_interface_generator_common_dat.m4 (1.61): In the last commit,
+ the message said "the change has a "fixme" since this
+ indicates that the way the replacements for all patterns is
+ handled needs improving and that this local change should be
+ made more general." This is now fixed and the main replacement
+ macros now incorporate this improvement.
+
+ Improved the specification of the replacements for the binary
+ operators for the Pointset_Powerset domains.
+
+ A few minor improvements to avoid unnecessary computations.
+
+2008-02-08 Friday 11:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.30),
+ ppl_interface_generator_common_dat.m4 (1.60): The code for
+ intersecting sequences of comma separated strings improved so
+ that the same basic code is used for intersecting both 2
+ sequences and 3 sequences.
+
+ The last changes introduced a bug for some products (such as Grid
+ x BD_Shape<...> products. This is now fixed, but the change has a
+ "fixme" since this indicates that the way the replacements for
+ all patterns is handled needs improving and that this local
+ change should be made more general.
+
+2008-02-07 Thursday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.52): Added the documentation for the
+ difference_assign() methods.
+
+2008-02-07 Thursday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.templates.hh (1.76), Interval.defs.hh (1.51),
+ Interval.inlines.hh (1.30): Added declarations and empty
+ implementations for Interval<To_Boundary,
+ To_Info>::difference_assign(const From&) and
+ Interval<To_Boundary, To_Info>::difference_assign(const From1&,
+ const From2&).
+
+2008-02-07 Thursday 15:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bit_Row.defs.hh (1.10), Bit_Row.inlines.hh (1.7): Added
+ void set_difference(const Bit_Row&, const Bit_Row&, Bit_Row&).
+
+2008-02-07 Thursday 10:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.29),
+ ppl_interface_generator_common_dat.m4 (1.59),
+ ppl_interface_generator_common_procedure_generators.m4 (1.11):
+ Enabled the Pointset_Powerset domain to have a Rational_Box as
+ the disjunct and the Product domains to have a Rational_Box as
+ one of its component domains in all the interfaces.
+
+ To allow for a number of missing methods in the Box domain that
+ cannot therefore be provided in any product domain that has the
+ Box as a component, defined two generic macros in
+ ppl_interface_generator_common.m4 that intersect sequences of
+ comma-separated strings: one that intersects two sequences and
+ one that intersects three sequences.
+
+ Also now support a new notation in a procedure string - e.g.,
+ "?box" means don't include this procedure for any product that
+ has Box as one of its components. This option may be removed in
+ the future and its use avoided by using the sequence intersection
+ macros described above.
+
+2008-02-07 Thursday 07:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.35): Fixed the documentation of
+ set_interval(Variable, const Interval&).
+
+2008-02-05 Tuesday 15:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * instchk.hh (1.14): The instantiations configuration options now
+ include Rational_Box.
+
+2008-02-05 Tuesday 15:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.58),
+ ppl_interface_generator_common_procedure_generators.m4 (1.10),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.5):
+ The interfaces now support Rational_Box as a simple class for
+ most of the procedures. Powersets and Products with a Box as a
+ base domain still to be checked.
+
+2008-02-05 Tuesday 14:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.75): Fixed method
+ Box<I>::concatenate_assign(const Box&).
+
+2008-02-05 Tuesday 09:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/concatenate1.cc (1.7): Added test06 which shows an
+ assertion failure when executing concatenate_assign() in the Box
+ domain.
+
+2008-02-04 Monday 12:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.28),
+ ppl_interface_generator_common_dat.m4 (1.57): Fixed some bugs,
+ simplified and improved some code and improved the documentation
+ for new and changed the macros.
+
+ Now the interfaces compile and tests run ok with all
+ Pointset_Powersets of polyhedra, weakly relational domains and
+ grids. Also the interfaces compile and tests run ok with any
+ products of the same domains.
+
+2008-02-01 Friday 17:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.27),
+ ppl_interface_generator_common_dat.m4 (1.56),
+ ppl_interface_generator_common_procedure_generators.m4 (1.9),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.27),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.22),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.16),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.62):
+ Interface code revised so as to handle powersets of weakly
+ relational domain elements. More tests are still needed. The new
+ m4 code in ppl_interface_generator_common_dat.m4 will be
+ documentated later.
+
+2008-02-01 Friday 12:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (1.10): Tests uncommented
+ (apparently they were commented out by mistake on April 3, 2007).
+
+2008-02-01 Friday 10:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.235), src/BD_Shape.defs.hh (1.111),
+ src/BD_Shape.templates.hh (1.91), src/Octagonal_Shape.defs.hh
+ (1.39), src/Octagonal_Shape.templates.hh (1.65),
+ tests/BD_Shape/relations3.cc (1.28),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.9): Added methods
+ relation_with() for congruences to the Octagonal_Shape and
+ BD_Shape domains.
+
+ Added notes wrt these and the relation_with() for costraints in
+ the TODO file.
+
+ Exception throwers throw_dimension_incompatible() for congruences
+ added to both these domains.
+
+2008-01-31 Thursday 15:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.26),
+ ppl_interface_generator_common_dat.m4 (1.55),
+ ppl_interface_generator_common_procedure_generators.m4 (1.8),
+ C/ppl_interface_generator_c_procedure_generators.m4 (1.4),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.4),
+ OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.3), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.61),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.70): Now allow the list of procedure names for generation to
+ have an optional "\" before a group name "g" which is meant to be
+ used only in conjunction with the powerset domain, and to mean
+ -don't generate code if the powerset's disjunct is in "g"-. This
+ is needed to avoid generating linear_partition code when the
+ disjunct is Grid and similarly approximate_partition code when
+ the disjunct is C_ or NNC_Polyhedron.
+
+ The Powerset of Grids in all the interfaces now compiles and the
+ compiled code passes all the tests in Java and Prolog interfaces.
+
+ Added to the todo lists in the procedure_generator m4 files for
+ C, Java and Ocaml, the approximate_partition procedure for
+ powersets of grids.
+
+2008-01-31 Thursday 09:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.54),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.7), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.28),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.18),
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+ (1.3),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.44),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.27), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+ (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+ (1.21),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (1.15),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.60),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.69), src/Partially_Reduced_Product.defs.hh (1.21),
+ src/Partially_Reduced_Product.inlines.hh (1.20),
+ src/Pointset_Powerset.inlines.hh (1.13): Added hash_code() to the
+ pointset_powerset and partially_reduced_product domains. Enable
+ this in the Java interface for all the domains. Also enable in
+ the Java interface the string() method for all the domains, so as
+ to include the product domains.
+
+ Added methods for external/total_memory_in_bytes for all the
+ domains and to all the interfaces. Existing tests for size() for
+ prolog and java now use the MEMBYTES pattern instead so as to
+ test all the replacements for MEMBYTES.
+
+ These with the size() method (for the pointset_powerset domains)
+ are all generated from a single "pattern" "MEMBYTES", defined in
+ interfaces/ppl_interface_generator_common_dat.m4.
+
+ Added methods for external/total_memory_in_bytes for all the
+ domains and to all the interfaces.
+
+ Existing tests for size() for prolog and java now use the
+ MEMBYTES pattern instead so as to test all its replacements.
+
+ These with the size() method (for the pointset_powerset domains)
+ are all generated from a single "pattern" "MEMBYTES", defined in
+ interfaces/ppl_interface_generator_common_dat.m4.
+
+2008-01-30 Wednesday 18:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.226),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.6), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.27),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.17),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.43),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+ (1.25), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+ (1.20),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (1.14),
+ interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.2),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.59),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.68), src/Partially_Reduced_Product.inlines.hh (1.19):
+ Corrected a missing "+" in
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ which caused some interface predicates not to be generated.
+
+ Added add_constraint_and_minimize() and
+ add_constraint_and_minimize() to the Partially_Reduced_Product
+ domain.
+
+ In the interfaces, the interface procedures for
+ ppl_Grid_generalized_image_lhs_rhs/5 and
+ ppl_Grid_generalized_preimage_lhs_rhs/5
+ ppl_Grid_generalized_image/6 and
+ ppl_Grid_generalized_preimage/6 have been renamed as
+ ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+ ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+ ppl_Grid_generalized_image_with_congruence/6
+ ppl_Grid_generalized_preimage_with_congruence/6 so as to allow
+ for /4 and /5, resp., versions
+
+ (This change also reported in "News").
+
+ Tidied and commented the procedure list in
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ so that where not "+all" domains are implemented in the
+ interfaces, comments explain further.
+
+ A few remaining procedures that can be enabled for products
+ and/or powersets in the interfaces have been enabled.
+
+ Added two "todo" procedures to the OCaml list of procedure
+ generators.
+
+2008-01-30 Wednesday 12:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.5), src/Pointset_Powerset.defs.hh (1.30),
+ src/Pointset_Powerset.inlines.hh (1.12),
+ src/Pointset_Powerset.templates.hh (1.26),
+ tests/Polyhedron/pointsetpowerset5.cc (1.2): Added methods for
+ expand_space_dimension() and fold_space_dimensions() and
+ constructor from a box, for the pointset_powerset domain.
+
+ Added tests for add and remove (higher) space dimensions for the
+ powerset domain as well as tests for the new methods.
+
+ Enabled the corresponding procedures in all the interfaces.
+
+2008-01-30 Wednesday 09:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.53),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.4), src/Partially_Reduced_Product.defs.hh (1.20),
+ src/Partially_Reduced_Product.inlines.hh (1.18),
+ tests/Grid/directproduct3.cc (1.17): Enabled a few more
+ procedures in the interfaces for the product domain.
+
+ Added to all the interfaces (including C++) the
+ intersection_assign_and_minimize() procedure for the
+ partially_reduced_product domains for uniformity with the other
+ domains.
+
+2008-01-30 Wednesday 08:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.67): Bug in generated test file for the product domain fixed.
+
+2008-01-29 Tuesday 22:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.25),
+ ppl_interface_generator_common_dat.m4 (1.52),
+ ppl_interface_generator_common_procedure_generators.m4 (1.3),
+ C/ppl_interface_generator_c_cc.m4 (1.14),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.66): Improved the definitions of the product domains so that
+ the list of different product domains occurs just once in the m4
+ code.
+
+ Almost all the methods/procedures appropriate for the product
+ domains are now enabled in all the interfaces.
+
+ Bug in the generated tests in ppl_predicate_check_test.pl for the
+ product domain still to be checked and fixed.
+
+2008-01-29 Tuesday 11:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * instchk.hh (1.13),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.51),
+ interfaces/ppl_interface_generator_common_procedure_generators.m4
+ (1.2), interfaces/C/ppl_interface_generator_c_cc.m4 (1.13),
+ interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+ (1.2): Enabled the product domains; building from space
+ dimensions, other products, constraints and congruences. Enable
+ the OK check and the free() method for Java.
+
+ Allow the configuration to include instantiations for the
+ Direct_Product, Smash_Product and Constraints_Product domains
+ with simple arguments.
+
+ Every interface tested for just the instantiation
+ Direct_Product<C_Polyhedron,Grid>
+
+2008-01-29 Tuesday 08:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_c.h.in (1.76): Previous change unintended -
+ revert to previous version.
+
+2008-01-28 Monday 15:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.26),
+ ppl_interface_generator_c_h_code.m4 (1.16),
+ ppl_interface_generator_c_procedure_generators.m4 (1.3): In the C
+ interface, added (m4) implementation code for add_disjunct.
+ Remove done items from "todo" list.
+
+2008-01-28 Monday 14:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.25),
+ ppl_interface_generator_c_h_code.m4 (1.15),
+ ppl_interface_generator_c_procedure_generators.m4 (1.2): Added to
+ the C interface the m4 code for drop_disjuncts.
+
+2008-01-28 Monday 14:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.24),
+ ppl_interface_generator_c_h_code.m4 (1.14): Added to the C
+ interface procedures for Pointset_Powerset (const) iterators:
+ increment, decrement, equals, begin and end.
+
+2008-01-28 Monday 12:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.23),
+ ppl_interface_generator_c_h_code.m4 (1.13): Added to the C
+ interface the ppl_ at CLASS@_size method.
+
+2008-01-28 Monday 12:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: Makefile.am (1.30),
+ ppl_interface_generator_common_procedure_generators.m4 (1.1),
+ ppl_interface_generator_common_procedure_list.m4 (1.5),
+ C/Makefile.am (1.39), C/ppl_c.h.in (1.75),
+ C/ppl_interface_generator_c_all_dat.m4 (1.2),
+ C/ppl_interface_generator_c_cc.m4 (1.12),
+ C/ppl_interface_generator_c_h.m4 (1.15),
+ C/ppl_interface_generator_c_procedure_generators.m4 (1.1),
+ Java/Makefile.am (1.16),
+ Java/ppl_interface_generator_java_all_dat.m4 (1.3),
+ Java/ppl_interface_generator_java_procedure_generators.m4 (1.1),
+ Java/jni/Makefile.am (1.17),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.12), Java/tests/Makefile.am (1.19),
+ Java/tests/ppl_interface_generator_java_test_java.m4 (1.15),
+ OCaml/Makefile.am (1.37),
+ OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.2),
+ OCaml/ppl_interface_generator_ocaml_cc.m4 (1.8),
+ OCaml/ppl_interface_generator_ocaml_ml.m4 (1.13),
+ OCaml/ppl_interface_generator_ocaml_mli.m4 (1.11),
+ OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+ (1.1), Prolog/Makefile.am (1.47),
+ Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.2),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.14),
+ Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+ (1.1), Prolog/ppl_interface_generator_prolog_systems.m4 (1.13),
+ Prolog/Ciao/Makefile.am (1.71), Prolog/GNU/Makefile.am (1.69),
+ Prolog/SICStus/Makefile.am (1.85), Prolog/SWI/Makefile.am (1.81),
+ Prolog/XSB/Makefile.am (1.61), Prolog/YAP/Makefile.am (1.58),
+ Prolog/tests/Makefile.am (1.20),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.34): Renamed the files containing the schematic lists of
+ procedures so that the common tail is "procedure_generators.m4".
+
+2008-01-28 Monday 11:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_procedure_list.m4
+ (1.4), Java/ppl_interface_generator_java_dat.m4 (1.15),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.42), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.24),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.19),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.13): Fixed
+ bugs wrt the pointset powerset caused by the previous commit
+ domain in the OCaml and Java interfaces.
+
+2008-01-27 Sunday 21:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.50),
+ ppl_interface_generator_common_procedure_list.m4 (1.3),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.41), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.23),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.18),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.12),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.58),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.65): By defining a new pattern "incdec" and its replacement,
+ made the increment and decrement iterator methods use common
+ code. Similarly the begin_iterator and end_iterator now use
+ common code.
+
+2008-01-26 Saturday 10:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.84): Use AM_CPPFLAGS for
+ `splfr' and `spld', not CPPFLAGS.
+
+2008-01-25 Friday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.83): Support
+ installation of SICStus in non-standard places.
+
+2008-01-25 Friday 19:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.302): Version number bumped.
+
+2008-01-25 Friday 12:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.49),
+ ppl_interface_generator_common_procedure_list.m4 (1.2),
+ C/Makefile.am (1.38), C/ppl_interface_generator_c_all_dat.m4
+ (1.1), C/ppl_interface_generator_c_cc.m4 (1.11),
+ C/ppl_interface_generator_c_cc_code.m4 (1.22),
+ C/ppl_interface_generator_c_dat.m4 (1.15),
+ C/ppl_interface_generator_c_h.m4 (1.14),
+ C/ppl_interface_generator_c_h_code.m4 (1.12): Synchronizing the C
+ interface with the other interfaces. Several missing methods for
+ the C interface are listed in a comment at the end of
+ ppl_interface_generator_c_all_dat.m4
+
+2008-01-25 Friday 08:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/Makefile.am (1.36): Fixed a bug. The interface
+ no longer uses ppl_interface_generator_prolog_dat.m4
+
+2008-01-24 Thursday 22:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.14), OCaml/Makefile.am (1.35),
+ OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.1),
+ OCaml/ppl_interface_generator_ocaml_cc.m4 (1.7),
+ OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.22),
+ OCaml/ppl_interface_generator_ocaml_dat.m4 (1.9),
+ OCaml/ppl_interface_generator_ocaml_ml.m4 (1.12),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.17),
+ OCaml/ppl_interface_generator_ocaml_mli.m4 (1.10),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.11): OCaml
+ interface now synchronized with the Java and Prolog interfaces.
+ A few missing methods listed as a comment at the end of
+ OCaml/ppl_interface_generator_ocaml_all_dat.m4
+
+ Trivial layout improvement to
+ Java/tests/ppl_interface_generator_java_test_java.m4
+
+2008-01-24 Thursday 16:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/ppl_interface_generator_java_all_dat.m4 (1.2):
+ Comment corrected.
+
+2008-01-24 Thursday 16:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.48),
+ Java/Makefile.am (1.15),
+ Java/ppl_interface_generator_java_all_dat.m4 (1.1),
+ Java/jni/Makefile.am (1.16),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.11),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.40), Java/tests/Makefile.am (1.18),
+ Java/tests/ppl_interface_generator_java_test_java.m4 (1.13):
+ Synchronizing the Java interface with the Prolog interface. A
+ few methods not yet implemented are listed as a comment in the
+ added file Java/ppl_interface_generator_java_all_dat.m4 which
+ also contains a few methods special to the Java interface.
+
+2008-01-24 Thursday 13:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.47),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.39), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.21),
+ OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.16),
+ OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.10),
+ Prolog/Makefile.am (1.46),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.45),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.57),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.12),
+ Prolog/Ciao/Makefile.am (1.70), Prolog/GNU/Makefile.am (1.68),
+ Prolog/SWI/Makefile.am (1.80), Prolog/XSB/Makefile.am (1.60),
+ Prolog/YAP/Makefile.am (1.57),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.64),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.33): For the pointset_powerset domain, the way the disjunct
+ classes are handled changed so that the topology is replaced
+ separately.
+
+ Completed, for the Prolog interface, the separation between the
+ system procedure list and the list of the procedures to be
+ generated.
+
+2008-01-24 Thursday 09:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: Makefile.am (1.29), Prolog/Makefile.am (1.45),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.13): Fixed a bug
+ in the makefile dependencies for Prolog due to the new dependent
+ common file ppl_interface_generator_common_procedure_list.m4
+
+2008-01-23 Wednesday 19:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.46): Change
+ needed for the pointset_powerset domains and their C++ friend
+ names.
+
+2008-01-23 Wednesday 18:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.24),
+ ppl_interface_generator_common_procedure_list.m4 (1.1),
+ Prolog/Makefile.am (1.44),
+ Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.1),
+ Prolog/SICStus/Makefile.am (1.82), Prolog/tests/Makefile.am
+ (1.19): A start on merging the procedure lists for the different
+ interfaces to ensure the interface systems are fully
+ synchronized. Currently the new lists only used and tested in
+ SICStus Prolog.
+
+2008-01-23 Wednesday 18:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.23),
+ ppl_interface_generator_common_dat.m4 (1.45),
+ C/ppl_interface_generator_c_cc_code.m4 (1.21),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.38), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.20),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.56): Fixed a
+ bug introduced in teh previous commit due to the overloading of
+ the prefix "cpp_" in the patterns. New prefix temporarily
+ changed to "cppx_". Further work on simplifying this code may
+ allow the merge of the different uses of the "cpp_"/"cppx_"
+ prefix into 1.
+
+2008-01-23 Wednesday 17:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.22),
+ ppl_interface_generator_common_dat.m4 (1.44),
+ C/ppl_interface_generator_c_cc.m4 (1.10),
+ C/ppl_interface_generator_c_cc_code.m4 (1.20),
+ C/ppl_interface_generator_c_dat.m4 (1.14),
+ C/ppl_interface_generator_c_h_code.m4 (1.11),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.37), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.19),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.55): Allow
+ the C interface to build from a "friend" as we can already do in
+ the other interfaces.
+
+ Revised the "friend" pattern replacements. To generate the new
+ code for the C interface, an extra option has been added that
+ allows for replacing friend classes C_Polyhedron and
+ NNC_Polyhedron without their topology.
+
+ cpp_friend now gives the C++ name while alt_friend has been
+ changed to give the interface name without the topology (ie only
+ in the case that the friend is a polyhedron).
+
+ As we already used the alt_friend for the C++ version of the
+ friend class name (now called cpp_friend), this change affected
+ several files.
+
+2008-01-23 Wednesday 11:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/pointsetpowerset4.cc (1.6): Tests 5, 6 and 9
+ fail for check-int8.
+
+2008-01-23 Wednesday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset4.cc (simplex.1): file
+ pointsetpowerset4.cc was added on branch simplex on 2008-06-06
+ 14:22:13 +0000
+
+2008-01-23 Wednesday 07:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.59): Fixed two bugs
+ introduced in previous changes here.
+
+2008-01-22 Tuesday 21:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.14),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.36), tests/ppl_interface_generator_java_test_java.m4 (1.12),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.25): Just
+ as is already the case for the Prolog interfaces, Java can build
+ a class from a "friend" of that class. E.g., a C_Polyhedron can
+ be built from an NNC_Polyhedron, a Grid, a BD_Shape etc, provided
+ the "friend" exists as one of the instantiations in the
+ configuration.
+
+2008-01-22 Tuesday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.10), config.guess (1.40), config.sub (1.38), depcomp
+ (1.13), install-sh (1.19), Watchdog/INSTALL (1.7),
+ Watchdog/config.guess (1.24), Watchdog/config.sub (1.23),
+ Watchdog/depcomp (1.10), Watchdog/install-sh (1.15): Updated from
+ Automake 1.10.1.
+
+2008-01-21 Monday 22:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.21),
+ ppl_interface_generator_common_dat.m4 (1.43),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.44),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.63),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.32): A start on cleaning/tidying some of the m4 code -
+ avoiding generating unwanted whitespace.
+
+2008-01-21 Monday 22:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.20),
+ Prolog/Ciao/Makefile.am (1.69),
+ Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.8), Prolog/SICStus/Makefile.am (1.81),
+ Prolog/SICStus/sp_predicate_check.pl (1.7),
+ Prolog/SWI/Makefile.am (1.79), Prolog/SWI/swi_predicate_check.pl
+ (1.6), Prolog/XSB/Makefile.am (1.58),
+ Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.9), Prolog/tests/Makefile.am (1.18),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.62),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.31), Prolog/tests/ppl_predicate_check_common.pl (1.9): The
+ tests for all the interfaces predicates that are generated and
+ were placed in ppl_predicate_check.pl are now generated and split
+ into a number of files; the top-level one is
+ ppl_predicate_test_main.pl and the rest have a name of the form
+
+ ppl_predicate_test_CLASS.pl
+
+ where CLASS is the name of an interface class (there is just one
+ file
+ "ppl_predicate_test_Polyhedron.pl" for both the C_Polyhedron and
+ NNC_Polyhedron domains.
+
+ This resolves a problem when checking the interface predicates
+ for XSB with more than 3 classes where the large generated file
+ caused an error to be thrown.
+
+ This change has been tested on SWI Prolog, SICStus, XSB and Ciao
+ Prolog with up to 4 (5 if we count C_Polyhedron and
+ NNC_Polyhedron separately) different interface classes.
+
+2008-01-21 Monday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/: cm_cleaner.sh (1.5), cm_splitter.sh (1.5): Use `IFS= read
+ -r' instead of a simple `read'. This means that leading blanks
+ and backslashes will no longer be eaten.
+
+2008-01-21 Monday 15:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc.m4 (1.6),
+ ppl_interface_generator_ocaml_ml.m4 (1.11),
+ ppl_interface_generator_ocaml_mli.m4 (1.9): Revised the
+ generation of these files so that all type and other class
+ methods are added before the main part of the code so that one
+ class can refer to elements of another class.
+
+2008-01-21 Monday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (1.3): Added some notes on the
+ configuration of MLGMP, since the information contained in the
+ package itself is rather terse.
+
+2008-01-21 Monday 14:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (1.2): Explained the requirements
+ for the OCaml interface. Note that the Caml Hump page for MLGMP
+ is out of date (bug already reported): while they fix it, MLGMP
+ can be found at
+ http://www-verimag.imag.fr/~monniaux/programmes.html.fr.
+
+2008-01-21 Monday 12:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.18), ppl_interface_generator_ocaml_dat.m4 (1.8),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.15),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.9): Removed the
+ pattern "@INTOPOLOGY@" which preceded "@FRIEND@" since the
+ topology is now part of the replacement for "@FRIEND@".
+
+2008-01-19 Saturday 18:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.42): Fixed a
+ bug which showed in the Java generated code for the relation_with
+ methods.
+
+2008-01-19 Saturday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh (1.9): At the end of the C++ PPL header file,
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION if it is defined.
+
+2008-01-18 Friday 20:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/Makefile.am (1.3): Distribute also ppl.hh, ppl_c.h, and
+ pwl.hh.
+
+2008-01-18 Friday 20:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.301): Version number bumped.
+
+2008-01-18 Friday 15:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.configure (1.25), interfaces/README.interfaces (1.1):
+ Brief notes on how to generate and use code for a choice of
+ domains in the (mainly Prolog) interfaces.
+
+2008-01-18 Friday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/README.interfaces (simplex.1): file README.interfaces
+ was added on branch simplex on 2008-06-06 14:21:57 +0000
+
+2008-01-18 Friday 13:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.61): Fixed some bugs in the test file that caused some warning
+ messages when testing the code in the Ciao interface.
+
+2008-01-18 Friday 12:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.60): A bug fixed.
+
+2008-01-18 Friday 12:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.68),
+ SICStus/sp_predicate_check.pl (1.6), SWI/swi_predicate_check.pl
+ (1.5), XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.8), tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.30): Enable make predicate_check_test for Ciao. To do this,
+ the ":- include ppl_predicate_check_common." directive has to be
+ in the generated file ppl_predicate_check.pl
+
+ For this reason, the corresponding directives in
+ swi_predicate_check.pl and SICStus/sp_predicate_check.pl have
+ been removed.
+
+ For XSB, the include directive is not supported as is and instead
+ a "#include" must be used. Changes made for XSB to handle this.
+
+ Warning messages given by the Ciao system when compiling the
+ generated file ppl_predicate_check.pl need further investigation
+ but the test in Ciao succeeds.
+
+2008-01-18 Friday 11:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * instchk.hh (1.12): The instantiation options "C_Polyhedron" and
+ "NNC_Polyhedron" made invalid.
+
+2008-01-18 Friday 10:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: SICStus/Makefile.am (1.80),
+ SICStus/sp_predicate_check.pl (1.5), SWI/Makefile.am (1.78),
+ XSB/Makefile.am (1.57),
+ XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.7): The
+ Prolog systems SWI, SICStus and XSB all allow for the toplevel
+ command "make predicate_check_test" to check the generated
+ ppl_prolog.icc code for the chosen set of instantiations.
+
+ Note that XSB cannot manage more than three instantiations (eg
+ "Polyhedron at Grid@Pointset_Powerset<C_Polyhedron>") at any one
+ time.
+
+2008-01-18 Friday 10:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * instchk.hh (1.11),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.41): The
+ instantiations for the powerset domains when the disjunct is a
+ polyhedron is changed and now the topology must be explicit.
+ Ie., the configuration instantiations option
+ Pointset_Powerset<Polyhedron> is disabled but instead
+ Pointset_Powerset<C_Polyhedron> and
+ Pointset_Powerset<NNC_Polyhedron> are both enabled.
+
+2008-01-17 Thursday 16:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.40),
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.43),
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl (1.8),
+ src/Pointset_Powerset.defs.hh (1.29),
+ src/Pointset_Powerset.templates.hh (1.25),
+ tests/Polyhedron/Makefile.am (1.119),
+ tests/Polyhedron/pointsetpowerset5.cc (1.1): For the powerset
+ domains, added methods for relation_with() for constraint,
+ congruence and generator to all the interfaces.
+
+ In the interfaces, also enable the grids to have relation_with()
+ for a generator.
+
+2008-01-17 Thursday 13:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.39),
+ src/Pointset_Powerset.defs.hh (1.28),
+ src/Pointset_Powerset.templates.hh (1.24),
+ tests/Polyhedron/pointsetpowerset4.cc (1.5): For the powerset
+ domain, the method topological_closure_assign() added to all the
+ interfaces.
+
+2008-01-17 Thursday 12:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.38),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.42),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.59): Now allow for several more predicates for the powerset
+ domain. In particular all the recent additions in the main C++
+ interface are now included in the Prolog interface.
+
+2008-01-17 Thursday 11:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.27),
+ src/Pointset_Powerset.inlines.hh (1.11),
+ src/Pointset_Powerset.templates.hh (1.23),
+ tests/Polyhedron/pointsetpowerset4.cc (1.4): For the powerset
+ domain, added methods intersection_assign_and_minimize(),
+ contains() and strictly_contains() with appropriate tests.
+
+2008-01-17 Thursday 09:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.26),
+ src/Pointset_Powerset.templates.hh (1.22),
+ tests/Polyhedron/pointsetpowerset4.cc (1.3): For the powerset
+ domain, added methods add_congruence(),
+ add_congruence_and_minimize(), add_congruences() and
+ add_congruences_and_minimize() with tests.
+
+2008-01-17 Thursday 08:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.templates.hh (1.21),
+ tests/Polyhedron/pointsetpowerset4.cc (1.2): Fixed some bugs in
+ code for maximize() and minimize() for the powerset domains and
+ improved the tests.
+
+2008-01-16 Wednesday 21:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.41),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.58): Now
+ allow for
+ ppl_Pointset_Powerset_..._equals_ppl_Pointset_Powerset_..._ in
+ the Prolog interface.
+
+2008-01-16 Wednesday 21:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.40):
+ Now the interfaces can support bounds_from_above/below() and
+ maximize/minimize for the powerset domain. Also added support
+ for bounds_from_above/below() for bd shapes and octagonal shapes
+ in Prolog.
+
+2008-01-16 Wednesday 17:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.25),
+ src/Pointset_Powerset.templates.hh (1.20),
+ tests/Polyhedron/Makefile.am (1.118),
+ tests/Polyhedron/pointsetpowerset4.cc (1.1): For the powerset
+ domains, added methods: bounds_from_above(), bounds_from_below(),
+ maximize() and minimize() - both with and without returning the
+ point. Tests added to check these.
+
+2008-01-16 Wednesday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset3.cc (simplex.1): file
+ pointsetpowerset3.cc was added on branch simplex on 2008-06-06
+ 14:22:13 +0000
+
+2008-01-16 Wednesday 09:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.24),
+ src/Pointset_Powerset.templates.hh (1.19),
+ tests/Polyhedron/pointsetpowerset3.cc (1.2): Added to the
+ powerset domain methods is_discrete() and is_disjoint_from().
+
+2008-01-15 Tuesday 17:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.37),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.39): Added the
+ is_empty(), is_universe(), is_topologically_closed() and
+ is_bounded() for powersets to the Prolog interfaces.
+
+2008-01-15 Tuesday 15:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.23),
+ src/Pointset_Powerset.templates.hh (1.18),
+ tests/Polyhedron/Makefile.am (1.117),
+ tests/Polyhedron/pointsetpowerset3.cc (1.1): Added to the
+ pointset powerset domain tests is_empty() is_universe()
+ is_topologically_closed() and is_bounded(). Tests for these also
+ added.
+
+ Note: in the code for is_universe() there are the 2 FIXME
+ comments: // FIXME: this is not the most efficient
+ implementation. // FIXME: this is buggy when PS is not an
+ abstraction of NNC_Polyhedron.
+
+2008-01-15 Tuesday 13:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh (1.64), Grid_chdims.cc (1.22),
+ Grid_nonpublic.cc (1.33), Grid_public.cc (1.65): Replaced bad
+ coding style in Boolean expressions by a more readable style.
+ Also update_congruences() now returns void and not bool.
+
+2008-01-15 Tuesday 10:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.36),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.57): Support for minimized representations added.
+
+2008-01-15 Tuesday 10:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.64): Change to correct the bug in
+ minimized_congruences().
+
+2008-01-15 Tuesday 09:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/mincongruences1.cc (1.12): Changed test04 to show a
+ bug: an extra OK() test shows that after minimized_congruences(),
+ the grid is not ok.
+
+2008-01-15 Tuesday 08:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.38):
+ Undone a change yesterday, that affected the compilation of
+ SICStus and Ciao, for the generalized image for grids which needs
+ a different arity to that for the other domains.
+
+2008-01-14 Monday 18:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.110), src/BD_Shape.inlines.hh (1.156),
+ src/Octagonal_Shape.defs.hh (1.38),
+ src/Octagonal_Shape.inlines.hh (1.27), src/Polyhedron.defs.hh
+ (1.330), src/Polyhedron.inlines.hh (1.146),
+ tests/BD_Shape/Makefile.am (1.71), tests/BD_Shape/congruences1.cc
+ (1.1), tests/Octagonal_Shape/Makefile.am (1.24),
+ tests/Octagonal_Shape/congruences1.cc (1.1),
+ tests/Polyhedron/addcongruence1.cc (1.10): Added methods for
+ add_congruence_and_minimize in order that we have a uniform set
+ of methods across all simple classes.
+
+ Also corrected congruences() and minimized_congruences() in the
+ BD_Shape and Octagonal_Shape domains which were wrong for empty
+ elements.
+
+ Added tests for all these methods which were untested.
+
+2008-01-14 Monday 16:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.7): Wrong file name corrected.
+
+2008-01-14 Monday 16:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.56),
+ ppl_interface_generator_predicate_check_pl.m4 (1.29),
+ ppl_predicate_check_common.pl (1.7): Some of the changes needed
+ to get the interfaces working in Ciao Prolog. For instance /= is
+ changed to /==. Also all the generated test predicates are
+ declared as dynamic as some are never defined in the test code.
+
+2008-01-14 Monday 11:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.35):
+ Improvements to layout and similar to the m4 code.
+
+2008-01-14 Monday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.34): Added
+ support for building from congruences for all the domains. Added
+ support for contains_integer_point for the powerset domain.
+
+2008-01-13 Sunday 22:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.37),
+ ppl_interface_generator_prolog_icc_code.m4 (1.54),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.55):
+ Expanded the number of predicates generated for classes such as
+ Octagonal_Shape<...> and Pointset_Powerset<...>.
+
+ Fixed a bug in the m4 code for generating ppl_prolog.icc when
+ building a class from a box. Note that the bug only was apparent
+ for classes with a templatic argument such as
+ Octagonal_Shape<...>.
+
+ In the m4 code for generating ppl_predicate_check.pl tests
+ modified to allow for the larger set of classes.
+
+2008-01-13 Sunday 17:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.33),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.36),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.53):
+ Upgraded the friend replacement code to allow for the simple
+ classes (eg polyhedra, bd shapes, grids) to build from other
+ simple classes that are in the list of instantiations.
+
+2008-01-13 Sunday 13:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.52), tests/ppl_interface_generator_predicate_check_code.m4
+ (1.54): Corrected bug in m4 generating code for ppl_prolog.icc
+ for the powersets linear_partition predicate.
+
+ Also corrected test for linear_partition in m4 generating code
+ for ppl_predicate_check.pl
+
+2008-01-13 Sunday 11:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.13),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.35): The string "@FRINED@" was wrongly used. As the
+ definition of FRIEND in m4 is being revised to allow more classes
+ to be built from other classes, this wrong use will become a bug
+ if it is not corrected.
+
+2008-01-12 Saturday 23:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.53),
+ ppl_predicate_check_common.pl (1.6): In
+ ppl_interface_generator_predicate_check_code.m4 corrected syntax
+ error.
+
+ In ppl_predicate_check_common.pl revised expected relations for
+ grids to match changes in src code.
+
+2008-01-09 Wednesday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Java/jni/.cvsignore (1.4), Prolog/Ciao/.cvsignore
+ (1.7), Prolog/GNU/.cvsignore (1.7), Prolog/SICStus/.cvsignore
+ (1.8), Prolog/SWI/.cvsignore (1.8), Prolog/XSB/.cvsignore (1.6),
+ Prolog/YAP/.cvsignore (1.7): Updated.
+
+2008-01-09 Wednesday 22:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Java/.cvsignore (1.2), Java/jni/.cvsignore (1.3),
+ Java/tests/.cvsignore (1.2), Prolog/.cvsignore (1.2),
+ Prolog/tests/.cvsignore (1.2): Updated.
+
+2008-01-09 Wednesday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/.cvsignore (1.7), Watchdog/src/.cvsignore (1.3),
+ interfaces/OCaml/.cvsignore (1.4),
+ interfaces/Prolog/Ciao/.cvsignore (1.6),
+ interfaces/Prolog/GNU/.cvsignore (1.6),
+ interfaces/Prolog/SICStus/.cvsignore (1.7),
+ interfaces/Prolog/SWI/.cvsignore (1.7),
+ interfaces/Prolog/XSB/.cvsignore (1.5),
+ interfaces/Prolog/YAP/.cvsignore (1.6), src/.cvsignore (1.12):
+ Ignore *.loT files.
+
+2008-01-09 Wednesday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.8), Watchdog/.cvsignore (1.6),
+ interfaces/.cvsignore (1.2), interfaces/C/.cvsignore (1.4),
+ interfaces/Java/jni/.cvsignore (1.2), src/.cvsignore (1.11):
+ Updated.
+
+2008-01-09 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.4): Avoid multiarch conflicts when installed
+ for multiple architectures.
+
+2008-01-09 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/: ppl.hh (1.1), ppl_c.h (1.1), pwl.hh (1.1): Header file
+ switchers to avoid multiarch conflicts when the PPL and PWL are
+ installed for multiple architectures (e.g., i386 and x86_64).
+
+2008-01-09 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.hh (simplex.1): file ppl.hh was added on branch
+ simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl_c.h (simplex.1): file ppl_c.h was added on branch
+ simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/pwl.hh (simplex.1): file pwl.hh was added on branch
+ simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-07 Monday 12:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS, README,
+ README.configure, STANDARDS, TODO, compile, config.guess,
+ config.sub, configure.ac, depcomp, install-sh, instchk.hh,
+ ltmain.sh, ppl.spec.in, Watchdog/COPYING, Watchdog/ChangeLog,
+ Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+ Watchdog/README, Watchdog/compile, Watchdog/config.guess,
+ Watchdog/config.sub, Watchdog/configure.ac, Watchdog/ltmain.sh,
+ Watchdog/doc/.cvsignore, Watchdog/doc/Makefile.am,
+ Watchdog/doc/README.doc, Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+ Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+ Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+ Watchdog/m4/.cvsignore, Watchdog/m4/Makefile.am,
+ Watchdog/m4/ax_prefix_config_h.m4,
+ Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ debian/Makefile.am, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/examples/README,
+ demos/ppl_lpsol/examples/egout.mps,
+ demos/ppl_lpsol/examples/ex12.mps,
+ demos/ppl_lpsol/examples/lseu.mps,
+ demos/ppl_lpsol/examples/markshare1.mps,
+ demos/ppl_lpsol/examples/markshare2.mps,
+ demos/ppl_lpsol/examples/mas74.mps,
+ demos/ppl_lpsol/examples/mas76.mps,
+ demos/ppl_lpsol/examples/modglob.mps,
+ demos/ppl_lpsol/examples/noswot.mps,
+ demos/ppl_lpsol/examples/opt1217.mps,
+ demos/ppl_lpsol/examples/p0033.mps,
+ demos/ppl_lpsol/examples/pk1.mps,
+ demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+ doc/README.doc, doc/definitions.dox,
+ doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-c-interface.tex,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/devref.tex, doc/gpl.dox, doc/gpl.tex, doc/gpl.txt,
+ doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+ doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/prog2man,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, doc/user.tex, fedora/.cvsignore,
+ fedora/Makefile.am, fedora/ppl.spec, interfaces/Makefile.am,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_copyright,
+ interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dat.m4,
+ interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/tests/.cvsignore,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Test_Partial_Function.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/Makefile.am, interfaces/OCaml/README.ocaml,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_ocaml_globals.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_predicate_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int64,
+ interfaces/Prolog/XSB/expected_pchk_int64_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/expected_pchk_mpz,
+ interfaces/Prolog/XSB/expected_pchk_mpz_a,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/README.yap,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+ m4/Makefile.am, m4/ac_check_classpath.m4,
+ m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+ m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+ m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+ m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4,
+ m4/ax_prefix_config_h.m4, m4/ppl.m4, m4/ppl_c.m4,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+ src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+ src/Boundary.defs.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/Bounding_Box.types.hh, src/Box.cc, src/Box.defs.hh,
+ src/Box.inlines.hh, src/Box.templates.hh, src/Box.types.hh,
+ src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+ src/Checked_Number.cc, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence.types.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Congruence_System.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/DB_Row.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh,
+ src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+ src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+ src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/GMP_Integer.types.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator.types.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/H79_Certificate.types.hh, src/Has_Assign_Or_Swap.hh,
+ src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+ src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.templates.hh, src/Interval.types.hh,
+ src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+ src/Interval_Info.types.hh, src/Interval_Restriction.defs.hh,
+ src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+ src/Limits.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/Partially_Reduced_Product.defs.hh,
+ src/Partially_Reduced_Product.inlines.hh,
+ src/Partially_Reduced_Product.templates.hh,
+ src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.templates.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/Powerset.templates.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+ src/Rational_Box.hh, src/Result.defs.hh, src/Result.inlines.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/Row.types.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Slow_Copy.hh, src/Temp.defs.hh,
+ src/Temp.inlines.hh, src/Temp.templates.hh, src/Topology.hh,
+ src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/assign_or_swap.hh, src/checked.cc,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh,
+ src/conversion.cc, src/distances.defs.hh,
+ src/distances.inlines.hh, src/distances.types.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+ src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+ src/meta_programming.hh, src/minimize.cc,
+ src/mp_numeric_limits.hh, src/mp_std_bits.cc,
+ src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+ src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+ src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+ src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+ tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+ tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+ tests/Makefile.am, tests/Partial_Function.cc,
+ tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh,
+ tests/Partial_Function.types.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/files.cc,
+ tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+ tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+ tests/Ask_Tell/.cvsignore, tests/Ask_Tell/Makefile.am,
+ tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/fromgrid1.cc,
+ tests/BD_Shape/fromoctagonalshape1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/fromspacedim1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+ tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+ tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Box/.cvsignore,
+ tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+ tests/Box/addspacedims1.cc, tests/Box/affinedimension1.cc,
+ tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+ tests/Box/ascii_dump_load1.cc, tests/Box/bdsdifference1.cc,
+ tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+ tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boxdifference1.cc, tests/Box/boxhull.cc,
+ tests/Box/boxhull1.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+ tests/Box/concatenate1.cc, tests/Box/congruences1.cc,
+ tests/Box/constraints1.cc, tests/Box/contains1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/discrete1.cc,
+ tests/Box/disjoint1.cc, tests/Box/empty1.cc,
+ tests/Box/equality1.cc, tests/Box/expandspacedim1.cc,
+ tests/Box/foldspacedims1.cc, tests/Box/frombdshape1.cc,
+ tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/fromgrid1.cc,
+ tests/Box/frompartiallyreducedproduct1.cc,
+ tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+ tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffinepreimage1.cc,
+ tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+ tests/Box/interval1.cc, tests/Box/interval2.cc,
+ tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+ tests/Box/maxspacedim1.cc, tests/Box/membytes1.cc,
+ tests/Box/minconstraints1.cc, tests/Box/pointsetpowerset1.cc,
+ tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+ tests/Box/relations1.cc, tests/Box/relations2.cc,
+ tests/Box/removespacedims1.cc, tests/Box/run_tests,
+ tests/Box/timeelapse1.cc, tests/Box/universe1.cc,
+ tests/Box/writebox1.cc, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/approximatepartition1.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+ tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+ tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/congruences2.cc, tests/Grid/constraints1.cc,
+ tests/Grid/contains1.cc, tests/Grid/containsintegerpoint1.cc,
+ tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/directproduct2.cc, tests/Grid/directproduct3.cc,
+ tests/Grid/directproduct4.cc, tests/Grid/directproduct5.cc,
+ tests/Grid/directproduct6.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+ tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+ tests/Grid/frombdshape1.cc, tests/Grid/fromoctagonalshape1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc,
+ tests/Grid/partiallyreducedproduct1.cc,
+ tests/Grid/partiallyreducedproduct2.cc,
+ tests/Grid/partiallyreducedproduct3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc,
+ tests/MIP_Problem/mipproblem1.cc,
+ tests/MIP_Problem/mipproblem2.cc,
+ tests/MIP_Problem/mipproblem3.cc,
+ tests/Octagonal_Shape/.cvsignore,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/frombdshape1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/fromgrid1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/fromspacedim1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/Polyhedron/.cvsignore, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/README, tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constrains1.cc,
+ tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+ tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+ tests/Polyhedron/fromoctagonalshape1.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+ tests/Polyhedron/lpproblem3.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc,
+ tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/pointsetpowerset2.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+ (simplex.[1,1,3,2,3,3,3,3,3,6,1,4,4,3,1,3,3,2,2,1,3,2,3,2,3,1,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,15,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,4,3,3,1,1,1,3,2,3,3,2,3,2,2,2,2,2,2,2,2,3,3,3,2,2,2,3,2,2,2,2,3,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,5,3,2,2,2,2,6,2,2,3,2,3,3,3,3,3,2,2,3,2,2,3,2,2,3,3,2,3,2,2,3,2,2,2,2,3,2,3,2,2,2,2,2, [...]
+ Fourth merge of the trunk to the `simplex' branch. The `simplex'
+ branch is open again.
+
+2008-01-02 Wednesday 18:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (1.9): Added comment in
+ code for grid exceptions to explain change in previous commit:
+
+ /* XSB does not throw catchable exceptions for integers out
+ of range;
+ so call to exception_sys_prolog is not made when testing
+ XSB.
+ The same exclusion for XSB and exception_sys_prolog/1
+ test is also
+ made in pl_check.pl (See log message 2007-09-19 10:29:08)
+ */
+
+2008-01-02 Wednesday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (simplex.1): file
+ pl_grid_check.pl was added on branch simplex on 2008-01-07
+ 11:15:31 +0000
+
+2008-01-02 Wednesday 13:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (1.8): Updated handling
+ of exceptions so that the test file runs ok with XSB.
+
+2008-01-02 Wednesday 11:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.51): Corrected code for covering boxes (for Grids).
+
+2008-01-02 Wednesday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (simplex.1): file ppl_interface_generator_prolog_icc_code.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-02 Wednesday 11:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (1.7): Updated tests to
+ match changes in the Grid class.
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_cleaner.sh (simplex.1): file cm_cleaner.sh was added on
+ branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_splitter.sh (simplex.1): file cm_splitter.sh was added
+ on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/constrains1.cc (simplex.1): file constrains1.cc
+ was added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/containsintegerpoint1.cc (simplex.1): file
+ containsintegerpoint1.cc was added on branch simplex on
+ 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/frombdshape1.cc (simplex.1): file
+ frombdshape1.cc was added on branch simplex on 2008-01-07
+ 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/frombox1.cc (simplex.1): file frombox1.cc was
+ added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/frombox2.cc (simplex.1): file frombox2.cc was
+ added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+ added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/fromoctagonalshape1.cc (simplex.1): file
+ fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+ 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc (simplex.1): file hybrid.cc was added
+ on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (simplex.1): file
+ pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+ 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset2.cc (simplex.1): file
+ pointsetpowerset2.cc was added on branch simplex on 2008-01-07
+ 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (simplex.1): file
+ variablesset1.cc was added on branch simplex on 2008-01-07
+ 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/addspacedims1.cc (simplex.1): file
+ addspacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinedimension1.cc (simplex.1): file
+ affinedimension1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc (simplex.1): file
+ affineimage1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage2.cc (simplex.1): file
+ affineimage2.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage1.cc (simplex.1): file
+ affinepreimage1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage2.cc (simplex.1): file
+ affinepreimage2.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhmz05widening1.cc (simplex.1): file
+ bhmz05widening1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhz03widening1.cc (simplex.1): file
+ bhz03widening1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounded1.cc (simplex.1): file bounded1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffineimage1.cc (simplex.1): file
+ boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffinepreimage1.cc (simplex.1): file
+ boundedaffinepreimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounds1.cc (simplex.1): file bounds1.cc was
+ added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76extrapolation1.cc (simplex.1): file
+ cc76extrapolation1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76narrowing1.cc (simplex.1): file
+ cc76narrowing1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/chinainit.cc (simplex.1): file chinainit.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/concatenate1.cc (simplex.1): file
+ concatenate1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/constraints1.cc (simplex.1): file
+ constraints1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/contains1.cc (simplex.1): file contains1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (simplex.1): file
+ containsintegerpoint1.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/discrete1.cc (simplex.1): file discrete1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/disjoint1.cc (simplex.1): file disjoint1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/empty1.cc (simplex.1): file empty1.cc was
+ added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/expandspacedim1.cc (simplex.1): file
+ expandspacedim1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/foldspacedims1.cc (simplex.1): file
+ foldspacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frombdshape1.cc (simplex.1): file
+ frombdshape1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromgensys1.cc (simplex.1): file
+ fromgensys1.cc was added on branch simplex on 2008-01-07 11:15:37
+ +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frompolyhedron1.cc (simplex.1): file
+ frompolyhedron1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromspacedim1.cc (simplex.1): file
+ fromspacedim1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage1.cc (simplex.1):
+ file generalizedaffineimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage2.cc (simplex.1):
+ file generalizedaffineimage2.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage3.cc (simplex.1):
+ file generalizedaffineimage3.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage4.cc (simplex.1):
+ file generalizedaffineimage4.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage5.cc (simplex.1):
+ file generalizedaffineimage5.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage1.cc (simplex.1):
+ file generalizedaffinepreimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage2.cc (simplex.1):
+ file generalizedaffinepreimage2.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage3.cc (simplex.1):
+ file generalizedaffinepreimage3.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage4.cc (simplex.1):
+ file generalizedaffinepreimage4.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/intersection1.cc (simplex.1): file
+ intersection1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (simplex.1):
+ file limitedbhmz05extrapolation1.cc was added on branch simplex
+ on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedcc76extrapolation1.cc (simplex.1):
+ file limitedcc76extrapolation1.cc was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/mapspacedims1.cc (simplex.1): file
+ mapspacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min1.cc (simplex.1): file max_min1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min2.cc (simplex.1): file max_min2.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim1.cc (simplex.1): file
+ maxspacedim1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/membytes1.cc (simplex.1): file membytes1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/minconstraints1.cc (simplex.1): file
+ minconstraints1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octdifference1.cc (simplex.1): file
+ octdifference1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octhull1.cc (simplex.1): file octhull1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons1.cc (simplex.1): file
+ relatwithcons1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (simplex.1): file
+ relatwithcons2.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithgen1.cc (simplex.1): file
+ relatwithgen1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/removespacedims1.cc (simplex.1): file
+ removespacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/run_tests (simplex.1): file run_tests was
+ added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/timeelapse1.cc (simplex.1): file
+ timeelapse1.cc was added on branch simplex on 2008-01-07 11:15:37
+ +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/universe1.cc (simplex.1): file universe1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (simplex.1): file
+ writeoctagon1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: MIP_Problem/Makefile.am, Octagonal_Shape/Makefile.am
+ (simplex.[1,1]): file Makefile.am was added on branch simplex on
+ 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: MIP_Problem/ascii_dump_load1.cc,
+ Octagonal_Shape/ascii_dump_load1.cc (simplex.[1,1]): file
+ ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+ 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/exceptions1.cc (simplex.1): file exceptions1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (simplex.1): file mipproblem1.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (simplex.1): file mipproblem2.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (simplex.1): file mipproblem3.cc
+ was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/approximatepartition1.cc (simplex.1): file
+ approximatepartition1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffinepreimage1.cc (simplex.1): file
+ boundedaffinepreimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct3.cc (simplex.1): file directproduct3.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct4.cc (simplex.1): file directproduct4.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct5.cc (simplex.1): file directproduct5.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct6.cc (simplex.1): file directproduct6.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/fromoctagonalshape1.cc (simplex.1): file
+ fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage3.cc (simplex.1): file
+ generalizedaffineimage3.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage3.cc (simplex.1): file
+ generalizedaffinepreimage3.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partiallyreducedproduct1.cc (simplex.1): file
+ partiallyreducedproduct1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partiallyreducedproduct2.cc (simplex.1): file
+ partiallyreducedproduct2.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partiallyreducedproduct3.cc (simplex.1): file
+ partiallyreducedproduct3.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partition1.cc (simplex.1): file partition1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetdifference1.cc (simplex.1): file
+ powersetdifference1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetgeometricallycovers1.cc (simplex.1): file
+ powersetgeometricallycovers1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetgeometricallyequals1.cc (simplex.1): file
+ powersetgeometricallyequals1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (simplex.1): file Makefile.am was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/addconstraints1.cc (simplex.1): file addconstraints1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/addspacedims1.cc (simplex.1): file addspacedims1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/affinedimension1.cc (simplex.1): file
+ affinedimension1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/affineimage1.cc (simplex.1): file affineimage1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/affinepreimage1.cc (simplex.1): file affinepreimage1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/ascii_dump_load1.cc (simplex.1): file
+ ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/bdsdifference1.cc (simplex.1): file bdsdifference1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/bgp99extrapolation1.cc (simplex.1): file
+ bgp99extrapolation1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/bounded1.cc (simplex.1): file bounded1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Box/boundedaffineimage1.cc, Grid/boundedaffineimage1.cc
+ (simplex.[1,1]): file boundedaffineimage1.cc was added on branch
+ simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boxdifference1.cc (simplex.1): file boxdifference1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boxhull.cc (simplex.1): file boxhull.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/boxhull1.cc (simplex.1): file boxhull1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/cc76narrowing1.cc (simplex.1): file cc76narrowing1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/cc76widening.cc (simplex.1): file cc76widening.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/closure1.cc (simplex.1): file closure1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/concatenate1.cc (simplex.1): file concatenate1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/congruences1.cc (simplex.1): file congruences1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Box/constraints1.cc, Grid/constraints1.cc
+ (simplex.[1,1]): file constraints1.cc was added on branch simplex
+ on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/contains1.cc (simplex.1): file contains1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Box/containsintegerpoint1.cc,
+ Grid/containsintegerpoint1.cc (simplex.[1,1]): file
+ containsintegerpoint1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/discrete1.cc (simplex.1): file discrete1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/disjoint1.cc (simplex.1): file disjoint1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/empty1.cc (simplex.1): file empty1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/equality1.cc (simplex.1): file equality1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/expandspacedim1.cc (simplex.1): file expandspacedim1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Box/frombdshape1.cc, Grid/frombdshape1.cc
+ (simplex.[1,1]): file frombdshape1.cc was added on branch simplex
+ on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frombox1.cc (simplex.1): file frombox1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/fromgensys1.cc (simplex.1): file fromgensys1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompartiallyreducedproduct1.cc (simplex.1): file
+ frompartiallyreducedproduct1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompolyhedron1.cc (simplex.1): file frompolyhedron1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompolyhedron2.cc (simplex.1): file frompolyhedron2.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/fromspacedim1.cc (simplex.1): file fromspacedim1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/generalizedaffineimage1.cc (simplex.1): file
+ generalizedaffineimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/generalizedaffinepreimage1.cc (simplex.1): file
+ generalizedaffinepreimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/geomcovers1.cc (simplex.1): file geomcovers1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/intersection1.cc (simplex.1): file intersection1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (simplex.1): file interval1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval2.cc (simplex.1): file interval2.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/mapspacedims1.cc (simplex.1): file mapspacedims1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/max_min1.cc (simplex.1): file max_min1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/maxspacedim1.cc (simplex.1): file maxspacedim1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/membytes1.cc (simplex.1): file membytes1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/minconstraints1.cc (simplex.1): file minconstraints1.cc
+ was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/pointsetpowerset1.cc (simplex.1): file
+ pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (simplex.1): file refine1.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (simplex.1): file refine2.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine3.cc (simplex.1): file refine3.cc was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/relations1.cc (simplex.1): file relations1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/relations2.cc (simplex.1): file relations2.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/removespacedims1.cc (simplex.1): file
+ removespacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/run_tests (simplex.1): file run_tests was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+ added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/universe1.cc (simplex.1): file universe1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/writebox1.cc (simplex.1): file writebox1.cc was added
+ on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/Makefile.am (simplex.1): file Makefile.am was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/append1.cc (simplex.1): file append1.cc was added
+ on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffineimage1.cc (simplex.1): file
+ boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffinepreimage1.cc (simplex.1): file
+ boundedaffinepreimage1.cc was added on branch simplex on
+ 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundingbox1.cc (simplex.1): file boundingbox1.cc
+ was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounds1.cc (simplex.1): file bounds1.cc was added
+ on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/containsintegerpoint1.cc (simplex.1): file
+ containsintegerpoint1.cc was added on branch simplex on
+ 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/discrete1.cc (simplex.1): file discrete1.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/disjoint1.cc (simplex.1): file disjoint1.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/expandspacedim1.cc (simplex.1): file
+ expandspacedim1.cc was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/foldspacedims1.cc (simplex.1): file
+ foldspacedims1.cc was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/fromoctagonalshape1.cc (simplex.1): file
+ fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/fromspacedim1.cc (simplex.1): file
+ fromspacedim1.cc was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min1.cc (simplex.1): file max_min1.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (simplex.1): file max_min2.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim1.cc (simplex.1): file maxspacedim1.cc
+ was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/membytes1.cc (simplex.1): file membytes1.cc was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.cc (simplex.1): file FCAIBVP.cc was added on branch
+ simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.defs.hh (simplex.1): file FCAIBVP.defs.hh was added
+ on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.inlines.hh (simplex.1): file FCAIBVP.inlines.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.types.hh (simplex.1): file FCAIBVP.types.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh (simplex.1): file Variables_Set.defs.hh
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.inlines.hh (simplex.1): file
+ Variables_Set.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.types.hh (simplex.1): file
+ Variables_Set.types.hh was added on branch simplex on 2008-01-07
+ 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assign_or_swap.hh (simplex.1): file assign_or_swap.hh was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.defs.hh (simplex.1): file distances.defs.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.inlines.hh (simplex.1): file distances.inlines.hh
+ was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.types.hh (simplex.1): file distances.types.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (simplex.1): file
+ iterator_to_const.defs.hh was added on branch simplex on
+ 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.inlines.hh (simplex.1): file
+ iterator_to_const.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.types.hh (simplex.1): file
+ iterator_to_const.types.hh was added on branch simplex on
+ 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh (simplex.1): file meta_programming.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_std_bits.cc (simplex.1): file mp_std_bits.cc was added on
+ branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_std_bits.defs.hh (simplex.1): file mp_std_bits.defs.hh was
+ added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_std_bits.inlines.hh (simplex.1): file
+ mp_std_bits.inlines.hh was added on branch simplex on 2008-01-07
+ 11:15:35 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (simplex.1): file Any_Pointset.defs.hh
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.inlines.hh (simplex.1): file
+ Any_Pointset.inlines.hh was added on branch simplex on 2008-01-07
+ 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.types.hh (simplex.1): file Any_Pointset.types.hh
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.templates.hh (simplex.1): file Ask_Tell.templates.hh
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc (simplex.1): file Bit_Matrix.cc was added on
+ branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.defs.hh (simplex.1): file Bit_Matrix.defs.hh was
+ added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.inlines.hh (simplex.1): file Bit_Matrix.inlines.hh
+ was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.types.hh (simplex.1): file Bit_Matrix.types.hh was
+ added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc (simplex.1): file Bit_Row.cc was added on branch
+ simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh (simplex.1): file Bit_Row.defs.hh was added
+ on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh (simplex.1): file Bit_Row.inlines.hh was
+ added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.types.hh (simplex.1): file Bit_Row.types.hh was added
+ on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh (simplex.1): file Boundary.defs.hh was added
+ on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.cc (simplex.1): file Box.cc was added on branch simplex
+ on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (simplex.1): file Box.defs.hh was added on branch
+ simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (simplex.1): file Box.inlines.hh was added on
+ branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (simplex.1): file Box.templates.hh was added
+ on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.types.hh (simplex.1): file Box.types.hh was added on
+ branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Integer.hh (simplex.1): file C_Integer.hh was added on
+ branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Has_Assign_Or_Swap.hh (simplex.1): file Has_Assign_Or_Swap.hh
+ was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.templates.hh (simplex.1): file Interval.templates.hh
+ was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh (simplex.1): file Interval_Info.defs.hh
+ was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval_Info.inlines.hh (simplex.1): file
+ Interval_Info.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval_Info.types.hh (simplex.1): file
+ Interval_Info.types.hh was added on branch simplex on 2008-01-07
+ 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval_Restriction.defs.hh (simplex.1): file
+ Interval_Restriction.defs.hh was added on branch simplex on
+ 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (simplex.1): file MIP_Problem.cc was added on
+ branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (simplex.1): file MIP_Problem.defs.hh was
+ added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.inlines.hh (simplex.1): file
+ MIP_Problem.inlines.hh was added on branch simplex on 2008-01-07
+ 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh (simplex.1): file
+ MIP_Problem.templates.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.types.hh (simplex.1): file MIP_Problem.types.hh
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (simplex.1): file OR_Matrix.defs.hh was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (simplex.1): file OR_Matrix.inlines.hh
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.templates.hh (simplex.1): file
+ OR_Matrix.templates.hh was added on branch simplex on 2008-01-07
+ 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.types.hh (simplex.1): file OR_Matrix.types.hh was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.cc (simplex.1): file Octagonal_Shape.cc was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (simplex.1): file
+ Octagonal_Shape.defs.hh was added on branch simplex on 2008-01-07
+ 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh (simplex.1): file
+ Octagonal_Shape.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (simplex.1): file
+ Octagonal_Shape.templates.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.types.hh (simplex.1): file
+ Octagonal_Shape.types.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.idefs.hh (simplex.1): file Og_Status.idefs.hh was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.inlines.hh (simplex.1): file Og_Status.inlines.hh
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.defs.hh (simplex.1): file
+ Partially_Reduced_Product.defs.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.inlines.hh (simplex.1): file
+ Partially_Reduced_Product.inlines.hh was added on branch simplex
+ on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.templates.hh (simplex.1): file
+ Partially_Reduced_Product.templates.hh was added on branch
+ simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.types.hh (simplex.1): file
+ Partially_Reduced_Product.types.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.cc (simplex.1): file Pointset_Ask_Tell.cc
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (simplex.1): file
+ Pointset_Ask_Tell.defs.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.inlines.hh (simplex.1): file
+ Pointset_Ask_Tell.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh (simplex.1): file
+ Pointset_Ask_Tell.templates.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.types.hh (simplex.1): file
+ Pointset_Ask_Tell.types.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (simplex.1): file Pointset_Powerset.cc
+ was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (simplex.1): file
+ Pointset_Powerset.defs.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh (simplex.1): file
+ Pointset_Powerset.inlines.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (simplex.1): file
+ Pointset_Powerset.templates.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.types.hh (simplex.1): file
+ Pointset_Powerset.types.hh was added on branch simplex on
+ 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rational_Box.hh (simplex.1): file Rational_Box.hh was added
+ on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Slow_Copy.hh (simplex.1): file Slow_Copy.hh was added on
+ branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Temp.defs.hh (simplex.1): file Temp.defs.hh was added on
+ branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Temp.inlines.hh (simplex.1): file Temp.inlines.hh was added
+ on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Temp.templates.hh (simplex.1): file Temp.templates.hh was
+ added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.cc (simplex.1): file Variables_Set.cc was added
+ on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_proper_long_double.m4 (simplex.1): file
+ ac_cxx_proper_long_double.m4 was added on branch simplex on
+ 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_remainder_bug.m4 (simplex.1): file
+ ac_cxx_remainder_bug.m4 was added on branch simplex on 2008-01-07
+ 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_jar.m4 (simplex.1): file ac_prog_jar.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_java.m4 (simplex.1): file ac_prog_java.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javac.m4 (simplex.1): file ac_prog_javac.m4 was added
+ on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javah.m4 (simplex.1): file ac_prog_javah.m4 was added
+ on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl_c.m4 (simplex.1): file ppl_c.m4 was added on branch
+ simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (simplex.1): file ppl_interface_generator_predicate_check_code.m4
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (simplex.1): file ppl_interface_generator_predicate_check_pl.m4
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+ (simplex.1): file ppl_interface_generator_yap_cc.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/ppl_predicate_check_common.pl
+ (simplex.1): file ppl_predicate_check_common.pl was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_cfli.hh (simplex.1): file yap_cfli.hh
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (simplex.1): file ppl_interface_generator_swiprolog_cc.m4 was
+ added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (simplex.1): file ppl_interface_generator_xsb_H.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+ (simplex.1): file ppl_interface_generator_xsb_cc.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (simplex.1): file
+ ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+ branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (simplex.1): file swi_cfli.hh
+ was added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_predicate_check.pl (simplex.1): file
+ swi_predicate_check.pl was added on branch simplex on 2008-01-07
+ 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_cfli.hh (simplex.1): file xsb_cfli.hh
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_cfli.hh (simplex.1): file
+ gprolog_cfli.hh was added on branch simplex on 2008-01-07
+ 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (simplex.1): file ppl_interface_generator_gprolog_pl.m4 was added
+ on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (simplex.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+ added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sp_predicate_check.pl (simplex.1): file
+ sp_predicate_check.pl was added on branch simplex on 2008-01-07
+ 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_cfli.hh (simplex.1): file
+ ciao_cfli.hh was added on branch simplex on 2008-01-07 11:15:30
+ +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+ (simplex.1): file ppl_interface_generator_ciao_pl.m4 was added on
+ branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (simplex.1): file
+ ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+ branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+ (simplex.1): file ppl_interface_generator_prolog_dat.m4 was added
+ on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+ (simplex.1): file ppl_interface_generator_prolog_icc.m4 was added
+ on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (simplex.1): file ppl_interface_generator_prolog_systems.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (simplex.1): file
+ ppl_prolog_common.icc was added on branch simplex on 2008-01-07
+ 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java (simplex.1): file
+ C_Polyhedron_test1.java was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Test_Partial_Function.java (simplex.1):
+ file Test_Partial_Function.java was added on branch simplex on
+ 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (simplex.1): file ppl_interface_generator_java_test_java.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (simplex.1): file ppl_interface_generator_java_test_java_code.m4
+ was added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (simplex.1):
+ file ppl_interface_generator_ocaml_cc.m4 was added on branch
+ simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+ (simplex.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4
+ (simplex.1): file ppl_interface_generator_ocaml_dat.m4 was added
+ on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (simplex.1):
+ file ppl_interface_generator_ocaml_ml.m4 was added on branch
+ simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+ (simplex.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
+ (simplex.1): file ppl_interface_generator_ocaml_mli.m4 was added
+ on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (simplex.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.cc (simplex.1): file
+ ppl_ocaml_globals.cc was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.ml (simplex.1): file
+ ppl_ocaml_globals.ml was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_types.ml (simplex.1): file
+ ppl_ocaml_types.ml was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/test1.ml (simplex.1): file test1.ml was added on
+ branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (simplex.1): file C_interface.dox
+ was added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/Makefile.am (simplex.1): file Makefile.am was added on
+ branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (simplex.1): file Makefile.am was
+ added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/: jni/Makefile.am, tests/Makefile.am
+ (simplex.[1,1]): file Makefile.am was added on branch simplex on
+ 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (simplex.1): file
+ ppl_c_version.h.in was added on branch simplex on 2008-01-07
+ 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (simplex.1): file
+ ppl_interface_generator_c_cc.m4 was added on branch simplex on
+ 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (simplex.1):
+ file ppl_interface_generator_c_cc_code.m4 was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble (simplex.1):
+ file ppl_interface_generator_c_cc_preamble was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (simplex.1): file
+ ppl_interface_generator_c_dat.m4 was added on branch simplex on
+ 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (simplex.1): file
+ ppl_interface_generator_c_h.m4 was added on branch simplex on
+ 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (simplex.1):
+ file ppl_interface_generator_c_h_code.m4 was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (simplex.1):
+ file ppl_interface_generator_c_h_preamble was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (simplex.1): file
+ ppl_interface_generator_common.m4 was added on branch simplex on
+ 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (simplex.1):
+ file ppl_interface_generator_common_dat.m4 was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_copyright (simplex.1): file
+ ppl_interface_generator_copyright was added on branch simplex on
+ 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_interface_generator_java_dat.m4 (simplex.1):
+ file ppl_interface_generator_java_dat.m4 was added on branch
+ simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (simplex.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+ branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (simplex.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (simplex.1): file
+ ppl_java_common.cc was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (simplex.1): file
+ ppl_java_common.hh was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc (simplex.1): file
+ ppl_java_globals.cc was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.tex (simplex.1): file
+ devref-c-interface.tex was added on branch simplex on 2008-01-07
+ 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config_extra_man_text (simplex.1): file
+ ppl-config_extra_man_text was added on branch simplex on
+ 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd_extra_man_text (simplex.1): file
+ ppl_lcdd_extra_man_text was added on branch simplex on 2008-01-07
+ 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol_extra_man_text (simplex.1): file
+ ppl_lpsol_extra_man_text was added on branch simplex on
+ 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.tex (simplex.1): file user-c-interface.tex
+ was added on branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.tex (simplex.1): file
+ user-prolog-interface.tex was added on branch simplex on
+ 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: doc/Makefile.am, m4/Makefile.am (simplex.[1,1]): file
+ Makefile.am was added on branch simplex on 2008-01-07 11:15:25
+ +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/README.doc (simplex.1): file README.doc was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.tex (simplex.1): file devref.tex was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/pwl.sty (simplex.1): file pwl.sty was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.tex (simplex.1): file user.tex was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.44), README (1.52), README.configure (1.24),
+ configure.ac (1.300), instchk.hh (1.10), Watchdog/Makefile.am
+ (1.33), Watchdog/README (1.17), Watchdog/configure.ac (1.43),
+ Watchdog/doc/Makefile.am (1.4), Watchdog/doc/README.doc (1.3),
+ Watchdog/doc/devref.tex (1.4), Watchdog/doc/pwl.sty (1.3),
+ Watchdog/doc/user.tex (1.4), Watchdog/m4/Makefile.am (1.3),
+ Watchdog/src/Doubly_Linked_Object.defs.hh (1.5),
+ Watchdog/src/Doubly_Linked_Object.inlines.hh (1.5),
+ Watchdog/src/Doubly_Linked_Object.types.hh (1.4),
+ Watchdog/src/EList.defs.hh (1.7), Watchdog/src/EList.inlines.hh
+ (1.5), Watchdog/src/EList.types.hh (1.4),
+ Watchdog/src/EList_Iterator.defs.hh (1.5),
+ Watchdog/src/EList_Iterator.inlines.hh (1.5),
+ Watchdog/src/EList_Iterator.types.hh (1.4),
+ Watchdog/src/Handler.defs.hh (1.6),
+ Watchdog/src/Handler.inlines.hh (1.5),
+ Watchdog/src/Handler.types.hh (1.4), Watchdog/src/Makefile.am
+ (1.13), Watchdog/src/Pending_Element.cc (1.6),
+ Watchdog/src/Pending_Element.defs.hh (1.6),
+ Watchdog/src/Pending_Element.inlines.hh (1.5),
+ Watchdog/src/Pending_Element.types.hh (1.4),
+ Watchdog/src/Pending_List.cc (1.6),
+ Watchdog/src/Pending_List.defs.hh (1.6),
+ Watchdog/src/Pending_List.inlines.hh (1.5),
+ Watchdog/src/Pending_List.types.hh (1.4), Watchdog/src/Time.cc
+ (1.6), Watchdog/src/Time.defs.hh (1.6),
+ Watchdog/src/Time.inlines.hh (1.5), Watchdog/src/Time.types.hh
+ (1.4), Watchdog/src/Watchdog.cc (1.8),
+ Watchdog/src/Watchdog.defs.hh (1.8),
+ Watchdog/src/Watchdog.inlines.hh (1.5),
+ Watchdog/src/Watchdog.types.hh (1.4), Watchdog/src/pwl_header.hh
+ (1.6), Watchdog/utils/Makefile.am (1.9),
+ Watchdog/utils/build_header.in (1.6), debian/Makefile.am (1.5),
+ debian/libppl-pwl.copyright.in (1.6), debian/libppl.copyright.in
+ (1.6), demos/Makefile.am (1.12), demos/ppl_lcdd/Makefile.am
+ (1.29), demos/ppl_lcdd/ppl_lcdd.cc (1.61),
+ demos/ppl_lcdd/examples/Makefile.am (1.10),
+ demos/ppl_lpsol/Makefile.am (1.44), demos/ppl_lpsol/ppl_lpsol.c
+ (1.76), demos/ppl_lpsol/examples/Makefile.am (1.11),
+ doc/Makefile.am (1.56), doc/README.doc (1.13),
+ doc/definitions.dox (1.206), doc/devref-c-interface.tex (1.3),
+ doc/devref.tex (1.24), doc/ppl-config.1 (1.6),
+ doc/ppl-config_extra_man_text (1.3), doc/ppl.sty (1.28),
+ doc/ppl_lcdd.1 (1.4), doc/ppl_lcdd_extra_man_text (1.3),
+ doc/ppl_lpsol.1 (1.4), doc/ppl_lpsol_extra_man_text (1.3),
+ doc/user-c-interface.tex (1.3), doc/user-prolog-interface.tex
+ (1.3), doc/user.tex (1.25), fedora/Makefile.am (1.2),
+ interfaces/Makefile.am (1.28),
+ interfaces/ppl_interface_generator_common.m4 (1.19),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.32),
+ interfaces/ppl_interface_generator_copyright (1.5),
+ interfaces/C/C_interface.dox (1.3), interfaces/C/Makefile.am
+ (1.37), interfaces/C/ppl_c.h.in (1.74),
+ interfaces/C/ppl_c_version.h.in (1.7),
+ interfaces/C/ppl_interface_generator_c_cc.m4 (1.9),
+ interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.19),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.13),
+ interfaces/C/ppl_interface_generator_c_dat.m4 (1.13),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.13),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.10),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.9),
+ interfaces/Java/Makefile.am (1.14),
+ interfaces/Java/ppl_interface_generator_java_dat.m4 (1.12),
+ interfaces/Java/jni/Makefile.am (1.15),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.10),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.34), interfaces/Java/jni/ppl_java_common.cc (1.37),
+ interfaces/Java/jni/ppl_java_common.hh (1.31),
+ interfaces/Java/jni/ppl_java_globals.cc (1.9),
+ interfaces/Java/tests/C_Polyhedron_test1.java (1.13),
+ interfaces/Java/tests/Makefile.am (1.17),
+ interfaces/Java/tests/Test_Partial_Function.java (1.4),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.11),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.24), interfaces/OCaml/Makefile.am (1.34),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.5),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.17),
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.7),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.10),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.14),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.8),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.8),
+ interfaces/OCaml/ppl_ocaml_globals.cc (1.12),
+ interfaces/OCaml/ppl_ocaml_globals.ml (1.8),
+ interfaces/OCaml/ppl_ocaml_types.ml (1.11),
+ interfaces/OCaml/test1.ml (1.31), interfaces/Prolog/Makefile.am
+ (1.43), interfaces/Prolog/Prolog_interface.dox (1.161),
+ interfaces/Prolog/exceptions.hh (1.26),
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.35),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.12),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.50),
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (1.11), interfaces/Prolog/ppl_prolog_common.icc (1.13),
+ interfaces/Prolog/track_allocation.hh (1.24),
+ interfaces/Prolog/Ciao/Makefile.am (1.67),
+ interfaces/Prolog/Ciao/ciao_cfli.hh (1.5),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.20),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.16),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.27),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.52),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.7),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.6), interfaces/Prolog/GNU/Makefile.am (1.67),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.12),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.13),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.8),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.45),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.7), interfaces/Prolog/SICStus/Makefile.am (1.79),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.11), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.29),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.9),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.11),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.19),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.20),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.14),
+ interfaces/Prolog/SICStus/sp_predicate_check.pl (1.4),
+ interfaces/Prolog/SWI/Makefile.am (1.77),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.14),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.12),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.14), interfaces/Prolog/SWI/ppl_pl.cc (1.14),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.9),
+ interfaces/Prolog/SWI/swi_cfli.hh (1.8),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.11),
+ interfaces/Prolog/SWI/swi_predicate_check.pl (1.4),
+ interfaces/Prolog/XSB/Makefile.am (1.56),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.8),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.10),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.6), interfaces/Prolog/XSB/xsb_cfli.hh (1.5),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.19),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.17),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.31),
+ interfaces/Prolog/YAP/Makefile.am (1.56),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.8),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.13),
+ interfaces/Prolog/YAP/yap_cfli.hh (1.5),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.14),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.10),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.14),
+ interfaces/Prolog/tests/Makefile.am (1.17),
+ interfaces/Prolog/tests/clpq.pl (1.11),
+ interfaces/Prolog/tests/clpq2.pl (1.13),
+ interfaces/Prolog/tests/expected_clpq2_int16 (1.4),
+ interfaces/Prolog/tests/expected_clpq2_int16_a (1.4),
+ interfaces/Prolog/tests/expected_clpq2_int32 (1.4),
+ interfaces/Prolog/tests/expected_clpq2_int32_a (1.6),
+ interfaces/Prolog/tests/expected_clpq2_int64 (1.4),
+ interfaces/Prolog/tests/expected_clpq2_int64_a (1.4),
+ interfaces/Prolog/tests/expected_clpq2_int8 (1.6),
+ interfaces/Prolog/tests/expected_clpq2_int8_a (1.6),
+ interfaces/Prolog/tests/expected_clpq2_mpz (1.4),
+ interfaces/Prolog/tests/expected_clpq2_mpz_a (1.4),
+ interfaces/Prolog/tests/expected_clpq_int16 (1.6),
+ interfaces/Prolog/tests/expected_clpq_int16_a (1.6),
+ interfaces/Prolog/tests/expected_clpq_int32 (1.4),
+ interfaces/Prolog/tests/expected_clpq_int32_a (1.4),
+ interfaces/Prolog/tests/expected_clpq_int64 (1.4),
+ interfaces/Prolog/tests/expected_clpq_int64_a (1.4),
+ interfaces/Prolog/tests/expected_clpq_int8 (1.4),
+ interfaces/Prolog/tests/expected_clpq_int8_a (1.4),
+ interfaces/Prolog/tests/expected_clpq_mpz (1.4),
+ interfaces/Prolog/tests/expected_clpq_mpz_a (1.4),
+ interfaces/Prolog/tests/pl_check.pl (1.53),
+ interfaces/Prolog/tests/pl_grid_check.pl (1.6),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.52),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.28), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+ (1.5), m4/Makefile.am (1.29), m4/ac_check_fpu_control.m4 (1.6),
+ m4/ac_check_gmp.m4 (1.26), m4/ac_check_sicstus_prolog.m4 (1.8),
+ m4/ac_check_swi_prolog.m4 (1.14), m4/ac_check_xsb_prolog.m4
+ (1.5), m4/ac_cxx_attribute_weak.m4 (1.10),
+ m4/ac_cxx_double_binary_format.m4 (1.7),
+ m4/ac_cxx_flexible_arrays.m4 (1.15),
+ m4/ac_cxx_float_binary_format.m4 (1.6),
+ m4/ac_cxx_long_double_binary_format.m4 (1.7),
+ m4/ac_cxx_proper_long_double.m4 (1.3), m4/ac_cxx_remainder_bug.m4
+ (1.3), m4/ac_prog_jar.m4 (1.3), m4/ac_prog_java.m4 (1.6),
+ m4/ac_prog_javac.m4 (1.7), m4/ac_prog_javah.m4 (1.9),
+ m4/ac_text_md5sum.m4 (1.4), m4/ppl.m4 (1.9), m4/ppl_c.m4 (1.2),
+ src/Any_Pointset.defs.hh (1.17), src/Any_Pointset.inlines.hh
+ (1.4), src/Any_Pointset.types.hh (1.3), src/Ask_Tell.defs.hh
+ (1.19), src/Ask_Tell.inlines.hh (1.18), src/Ask_Tell.templates.hh
+ (1.10), src/Ask_Tell.types.hh (1.7), src/BDS_Status.idefs.hh
+ (1.22), src/BDS_Status.inlines.hh (1.18), src/BD_Shape.cc (1.9),
+ src/BD_Shape.defs.hh (1.109), src/BD_Shape.inlines.hh (1.155),
+ src/BD_Shape.templates.hh (1.90), src/BD_Shape.types.hh (1.7),
+ src/BHRZ03_Certificate.cc (1.14), src/BHRZ03_Certificate.defs.hh
+ (1.19), src/BHRZ03_Certificate.inlines.hh (1.10),
+ src/BHRZ03_Certificate.types.hh (1.6), src/Bit_Matrix.cc (1.5),
+ src/Bit_Matrix.defs.hh (1.5), src/Bit_Matrix.inlines.hh (1.4),
+ src/Bit_Matrix.types.hh (1.3), src/Bit_Row.cc (1.5),
+ src/Bit_Row.defs.hh (1.9), src/Bit_Row.inlines.hh (1.6),
+ src/Bit_Row.types.hh (1.3), src/Boundary.defs.hh (1.10),
+ src/Box.cc (1.10), src/Box.defs.hh (1.34), src/Box.inlines.hh
+ (1.23), src/Box.templates.hh (1.74), src/Box.types.hh (1.4),
+ src/C_Integer.hh (1.6), src/C_Polyhedron.cc (1.24),
+ src/C_Polyhedron.defs.hh (1.53), src/C_Polyhedron.inlines.hh
+ (1.39), src/C_Polyhedron.types.hh (1.12), src/Checked_Number.cc
+ (1.14), src/Checked_Number.defs.hh (1.96),
+ src/Checked_Number.inlines.hh (1.78), src/Checked_Number.types.hh
+ (1.11), src/Coefficient.cc (1.9), src/Coefficient.defs.hh (1.11),
+ src/Coefficient.inlines.hh (1.10), src/Coefficient.types.hh
+ (1.16), src/Coefficient_traits_template.hh (1.9),
+ src/Congruence.cc (1.19), src/Congruence.defs.hh (1.23),
+ src/Congruence.inlines.hh (1.19), src/Congruence.types.hh (1.4),
+ src/Congruence_System.cc (1.28), src/Congruence_System.defs.hh
+ (1.26), src/Congruence_System.inlines.hh (1.11),
+ src/Congruence_System.types.hh (1.4), src/Constraint.cc (1.70),
+ src/Constraint.defs.hh (1.128), src/Constraint.inlines.hh (1.69),
+ src/Constraint.types.hh (1.12), src/Constraint_System.cc (1.29),
+ src/Constraint_System.defs.hh (1.40),
+ src/Constraint_System.inlines.hh (1.12),
+ src/Constraint_System.types.hh (1.6), src/DB_Matrix.defs.hh
+ (1.30), src/DB_Matrix.inlines.hh (1.34),
+ src/DB_Matrix.templates.hh (1.8), src/DB_Matrix.types.hh (1.7),
+ src/DB_Row.defs.hh (1.26), src/DB_Row.inlines.hh (1.24),
+ src/DB_Row.templates.hh (1.8), src/DB_Row.types.hh (1.9),
+ src/Determinate.defs.hh (1.68), src/Determinate.inlines.hh
+ (1.58), src/Determinate.types.hh (1.11), src/Float.cc (1.8),
+ src/Float.defs.hh (1.27), src/Float.inlines.hh (1.32),
+ src/GMP_Integer.defs.hh (1.28), src/GMP_Integer.inlines.hh
+ (1.23), src/GMP_Integer.types.hh (1.17), src/Generator.cc (1.77),
+ src/Generator.defs.hh (1.125), src/Generator.inlines.hh (1.63),
+ src/Generator.types.hh (1.12), src/Generator_System.cc (1.26),
+ src/Generator_System.defs.hh (1.27),
+ src/Generator_System.inlines.hh (1.11),
+ src/Generator_System.types.hh (1.6), src/Grid.defs.hh (1.63),
+ src/Grid.inlines.hh (1.22), src/Grid.templates.hh (1.33),
+ src/Grid.types.hh (1.4), src/Grid_Certificate.cc (1.11),
+ src/Grid_Certificate.defs.hh (1.7),
+ src/Grid_Certificate.inlines.hh (1.5),
+ src/Grid_Certificate.types.hh (1.4), src/Grid_Generator.cc
+ (1.23), src/Grid_Generator.defs.hh (1.33),
+ src/Grid_Generator.inlines.hh (1.16), src/Grid_Generator.types.hh
+ (1.4), src/Grid_Generator_System.cc (1.21),
+ src/Grid_Generator_System.defs.hh (1.29),
+ src/Grid_Generator_System.inlines.hh (1.17),
+ src/Grid_Generator_System.types.hh (1.4), src/Grid_Status.cc
+ (1.9), src/Grid_Status.idefs.hh (1.8), src/Grid_Status.inlines.hh
+ (1.5), src/Grid_chdims.cc (1.21), src/Grid_conversion.cc (1.23),
+ src/Grid_nonpublic.cc (1.32), src/Grid_public.cc (1.63),
+ src/Grid_simplify.cc (1.37), src/Grid_widenings.cc (1.17),
+ src/H79_Certificate.cc (1.13), src/H79_Certificate.defs.hh
+ (1.17), src/H79_Certificate.inlines.hh (1.11),
+ src/H79_Certificate.types.hh (1.6), src/Has_Assign_Or_Swap.hh
+ (1.3), src/Init.cc (1.33), src/Init.defs.hh (1.20),
+ src/Init.types.hh (1.11), src/Interval.defs.hh (1.50),
+ src/Interval.inlines.hh (1.29), src/Interval.templates.hh (1.4),
+ src/Interval.types.hh (1.14), src/Interval_Info.defs.hh (1.6),
+ src/Interval_Info.inlines.hh (1.7), src/Interval_Info.types.hh
+ (1.4), src/Interval_Restriction.defs.hh (1.11),
+ src/Linear_Expression.cc (1.20), src/Linear_Expression.defs.hh
+ (1.38), src/Linear_Expression.inlines.hh (1.13),
+ src/Linear_Expression.types.hh (1.6), src/Linear_Row.cc (1.25),
+ src/Linear_Row.defs.hh (1.26), src/Linear_Row.inlines.hh (1.14),
+ src/Linear_Row.types.hh (1.6), src/Linear_System.cc (1.47),
+ src/Linear_System.defs.hh (1.33), src/Linear_System.inlines.hh
+ (1.24), src/Linear_System.types.hh (1.6), src/MIP_Problem.cc
+ (1.65), src/MIP_Problem.defs.hh (1.37),
+ src/MIP_Problem.inlines.hh (1.17), src/MIP_Problem.templates.hh
+ (1.12), src/MIP_Problem.types.hh (1.3), src/Makefile.am (1.176),
+ src/Matrix.cc (1.98), src/Matrix.defs.hh (1.84),
+ src/Matrix.inlines.hh (1.53), src/Matrix.types.hh (1.12),
+ src/NNC_Polyhedron.cc (1.24), src/NNC_Polyhedron.defs.hh (1.54),
+ src/NNC_Polyhedron.inlines.hh (1.40), src/NNC_Polyhedron.types.hh
+ (1.12), src/Numeric_Format.defs.hh (1.8), src/OR_Matrix.defs.hh
+ (1.14), src/OR_Matrix.inlines.hh (1.10),
+ src/OR_Matrix.templates.hh (1.7), src/OR_Matrix.types.hh (1.4),
+ src/Octagonal_Shape.cc (1.8), src/Octagonal_Shape.defs.hh (1.37),
+ src/Octagonal_Shape.inlines.hh (1.26),
+ src/Octagonal_Shape.templates.hh (1.64),
+ src/Octagonal_Shape.types.hh (1.4), src/Og_Status.idefs.hh (1.8),
+ src/Og_Status.inlines.hh (1.6),
+ src/Partially_Reduced_Product.defs.hh (1.19),
+ src/Partially_Reduced_Product.inlines.hh (1.17),
+ src/Partially_Reduced_Product.templates.hh (1.8),
+ src/Partially_Reduced_Product.types.hh (1.3), src/Ph_Status.cc
+ (1.15), src/Ph_Status.idefs.hh (1.22), src/Ph_Status.inlines.hh
+ (1.10), src/Pointset_Ask_Tell.cc (1.8),
+ src/Pointset_Ask_Tell.defs.hh (1.14),
+ src/Pointset_Ask_Tell.inlines.hh (1.7),
+ src/Pointset_Ask_Tell.templates.hh (1.12),
+ src/Pointset_Ask_Tell.types.hh (1.4), src/Pointset_Powerset.cc
+ (1.16), src/Pointset_Powerset.defs.hh (1.22),
+ src/Pointset_Powerset.inlines.hh (1.10),
+ src/Pointset_Powerset.templates.hh (1.17),
+ src/Pointset_Powerset.types.hh (1.3), src/Poly_Con_Relation.cc
+ (1.17), src/Poly_Con_Relation.defs.hh (1.36),
+ src/Poly_Con_Relation.inlines.hh (1.17),
+ src/Poly_Con_Relation.types.hh (1.11), src/Poly_Gen_Relation.cc
+ (1.17), src/Poly_Gen_Relation.defs.hh (1.34),
+ src/Poly_Gen_Relation.inlines.hh (1.17),
+ src/Poly_Gen_Relation.types.hh (1.11), src/Polyhedron.defs.hh
+ (1.329), src/Polyhedron.inlines.hh (1.145),
+ src/Polyhedron.templates.hh (1.16), src/Polyhedron.types.hh
+ (1.18), src/Polyhedron_chdims.cc (1.45),
+ src/Polyhedron_nonpublic.cc (1.82), src/Polyhedron_public.cc
+ (1.106), src/Polyhedron_widenings.cc (1.65), src/Powerset.defs.hh
+ (1.31), src/Powerset.inlines.hh (1.21), src/Powerset.templates.hh
+ (1.6), src/Powerset.types.hh (1.7), src/Ptr_Iterator.defs.hh
+ (1.12), src/Ptr_Iterator.inlines.hh (1.9),
+ src/Ptr_Iterator.types.hh (1.7), src/Rational_Box.hh (1.7),
+ src/Result.defs.hh (1.20), src/Result.inlines.hh (1.12),
+ src/Rounding_Dir.defs.hh (1.14), src/Rounding_Dir.inlines.hh
+ (1.8), src/Row.cc (1.105), src/Row.defs.hh (1.113),
+ src/Row.inlines.hh (1.67), src/Row.types.hh (1.13),
+ src/Scalar_Products.cc (1.10), src/Scalar_Products.defs.hh
+ (1.11), src/Scalar_Products.inlines.hh (1.7),
+ src/Scalar_Products.types.hh (1.5), src/Slow_Copy.hh (1.3),
+ src/Temp.defs.hh (1.8), src/Temp.inlines.hh (1.4),
+ src/Temp.templates.hh (1.3), src/Topology.hh (1.15),
+ src/Variable.cc (1.25), src/Variable.defs.hh (1.55),
+ src/Variable.inlines.hh (1.26), src/Variable.types.hh (1.12),
+ src/Variables_Set.cc (1.7), src/Variables_Set.defs.hh (1.8),
+ src/Variables_Set.inlines.hh (1.6), src/Variables_Set.types.hh
+ (1.3), src/Widening_Function.defs.hh (1.19),
+ src/Widening_Function.inlines.hh (1.16),
+ src/Widening_Function.types.hh (1.7), src/algorithms.hh (1.50),
+ src/assign_or_swap.hh (1.2), src/checked.cc (1.22),
+ src/checked.defs.hh (1.44), src/checked.inlines.hh (1.41),
+ src/checked_ext.defs.hh (1.15), src/checked_ext.inlines.hh
+ (1.41), src/checked_float.inlines.hh (1.83),
+ src/checked_int.inlines.hh (1.65), src/checked_mpq.inlines.hh
+ (1.44), src/checked_mpz.inlines.hh (1.51),
+ src/checked_numeric_limits.hh (1.22), src/compiler.hh (1.12),
+ src/conversion.cc (1.85), src/distances.defs.hh (1.5),
+ src/distances.inlines.hh (1.6), src/distances.types.hh (1.4),
+ src/fpu-c99.inlines.hh (1.16), src/fpu-ia32.inlines.hh (1.18),
+ src/fpu-none.inlines.hh (1.8), src/fpu-sparc.inlines.hh (1.10),
+ src/fpu.defs.hh (1.17), src/fpu.types.hh (1.6), src/globals.cc
+ (1.32), src/globals.defs.hh (1.52), src/globals.inlines.hh
+ (1.20), src/globals.types.hh (1.12), src/initializer.hh (1.16),
+ src/iterator_to_const.defs.hh (1.7),
+ src/iterator_to_const.inlines.hh (1.5),
+ src/iterator_to_const.types.hh (1.3), src/max_space_dimension.hh
+ (1.14), src/meta_programming.hh (1.9), src/minimize.cc (1.49),
+ src/mp_std_bits.cc (1.6), src/mp_std_bits.defs.hh (1.6),
+ src/mp_std_bits.inlines.hh (1.5), src/namespaces.hh (1.13),
+ src/ppl-config.cc.in (1.23), src/ppl_header.hh (1.8),
+ src/simplify.cc (1.50), src/swapping_sort.icc (1.14),
+ src/version.cc (1.11), src/version.hh.in (1.17), tests/FCAIBVP.cc
+ (1.6), tests/FCAIBVP.defs.hh (1.6), tests/FCAIBVP.inlines.hh
+ (1.6), tests/FCAIBVP.types.hh (1.3), tests/Makefile.am (1.264),
+ tests/Partial_Function.cc (1.7), tests/Partial_Function.defs.hh
+ (1.5), tests/Partial_Function.inlines.hh (1.4),
+ tests/Partial_Function.types.hh (1.3),
+ tests/Random_Number_Generator.defs.hh (1.6),
+ tests/Random_Number_Generator.inlines.hh (1.11),
+ tests/Random_Number_Generator.types.hh (1.4), tests/files.cc
+ (1.12), tests/files.hh (1.12), tests/ppl_test.cc (1.12),
+ tests/ppl_test.hh (1.68), tests/print.cc (1.29), tests/print.hh
+ (1.45), tests/Ask_Tell/Makefile.am (1.5),
+ tests/Ask_Tell/append1.cc (1.7), tests/BD_Shape/Makefile.am
+ (1.70), tests/BD_Shape/addconstraints1.cc (1.19),
+ tests/BD_Shape/addspacedims1.cc (1.16),
+ tests/BD_Shape/affinedimension1.cc (1.13),
+ tests/BD_Shape/affineimage1.cc (1.20),
+ tests/BD_Shape/affineimage2.cc (1.14),
+ tests/BD_Shape/affinepreimage1.cc (1.22),
+ tests/BD_Shape/ascii_dump_load1.cc (1.16),
+ tests/BD_Shape/bdsdifference1.cc (1.16),
+ tests/BD_Shape/bdshull1.cc (1.17),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.11),
+ tests/BD_Shape/bhmz05widening1.cc (1.16),
+ tests/BD_Shape/bhz03widening1.cc (1.11),
+ tests/BD_Shape/bounded1.cc (1.4),
+ tests/BD_Shape/boundedaffineimage1.cc (1.5),
+ tests/BD_Shape/boundedaffinepreimage1.cc (1.4),
+ tests/BD_Shape/boundingbox1.cc (1.2), tests/BD_Shape/bounds1.cc
+ (1.4), tests/BD_Shape/cc76extrapolation1.cc (1.20),
+ tests/BD_Shape/cc76narrowing1.cc (1.19),
+ tests/BD_Shape/closure1.cc (1.21), tests/BD_Shape/concatenate1.cc
+ (1.15), tests/BD_Shape/constraints1.cc (1.20),
+ tests/BD_Shape/contains1.cc (1.16),
+ tests/BD_Shape/containsintegerpoint1.cc (1.4),
+ tests/BD_Shape/discrete1.cc (1.4), tests/BD_Shape/disjoint1.cc
+ (1.7), tests/BD_Shape/empty1.cc (1.12),
+ tests/BD_Shape/equality1.cc (1.17),
+ tests/BD_Shape/expandspacedim1.cc (1.5),
+ tests/BD_Shape/foldspacedims1.cc (1.7),
+ tests/BD_Shape/fromgensys1.cc (1.16), tests/BD_Shape/fromgrid1.cc
+ (1.3), tests/BD_Shape/fromoctagonalshape1.cc (1.2),
+ tests/BD_Shape/frompolyhedron1.cc (1.6),
+ tests/BD_Shape/fromspacedim1.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.18),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.22),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.16),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.17),
+ tests/BD_Shape/generalizedaffinepreimage3.cc (1.7),
+ tests/BD_Shape/geomcovers1.cc (1.11),
+ tests/BD_Shape/h79widening1.cc (1.14),
+ tests/BD_Shape/intersection1.cc (1.19),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.15),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.16),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.15),
+ tests/BD_Shape/mapspacedims1.cc (1.16),
+ tests/BD_Shape/max_min1.cc (1.4), tests/BD_Shape/max_min2.cc
+ (1.6), tests/BD_Shape/maxspacedim1.cc (1.5),
+ tests/BD_Shape/membytes1.cc (1.4),
+ tests/BD_Shape/minconstraints1.cc (1.12),
+ tests/BD_Shape/relations1.cc (1.19), tests/BD_Shape/relations2.cc
+ (1.23), tests/BD_Shape/relations3.cc (1.27),
+ tests/BD_Shape/removespacedims1.cc (1.21),
+ tests/BD_Shape/run_tests (1.20), tests/BD_Shape/timeelapse1.cc
+ (1.21), tests/BD_Shape/universe1.cc (1.16),
+ tests/BD_Shape/writebdshape1.cc (1.11), tests/Box/Makefile.am
+ (1.47), tests/Box/addconstraints1.cc (1.10),
+ tests/Box/addspacedims1.cc (1.5), tests/Box/affinedimension1.cc
+ (1.7), tests/Box/affineimage1.cc (1.8),
+ tests/Box/affinepreimage1.cc (1.5), tests/Box/ascii_dump_load1.cc
+ (1.5), tests/Box/bdsdifference1.cc (1.6),
+ tests/Box/bgp99extrapolation1.cc (1.5),
+ tests/Box/bhz03widening1.cc (1.5), tests/Box/bounded1.cc (1.5),
+ tests/Box/boundedaffineimage1.cc (1.5),
+ tests/Box/boxdifference1.cc (1.7), tests/Box/boxhull.cc (1.5),
+ tests/Box/boxhull1.cc (1.6), tests/Box/cc76narrowing1.cc (1.6),
+ tests/Box/cc76widening.cc (1.7), tests/Box/closure1.cc (1.5),
+ tests/Box/concatenate1.cc (1.6), tests/Box/congruences1.cc (1.2),
+ tests/Box/constraints1.cc (1.10), tests/Box/contains1.cc (1.6),
+ tests/Box/containsintegerpoint1.cc (1.7), tests/Box/discrete1.cc
+ (1.6), tests/Box/disjoint1.cc (1.6), tests/Box/empty1.cc (1.6),
+ tests/Box/equality1.cc (1.6), tests/Box/expandspacedim1.cc (1.7),
+ tests/Box/foldspacedims1.cc (1.8), tests/Box/frombdshape1.cc
+ (1.3), tests/Box/frombox1.cc (1.4), tests/Box/fromgensys1.cc
+ (1.5), tests/Box/fromgrid1.cc (1.6),
+ tests/Box/frompartiallyreducedproduct1.cc (1.2),
+ tests/Box/frompolyhedron1.cc (1.12), tests/Box/frompolyhedron2.cc
+ (1.10), tests/Box/fromspacedim1.cc (1.3),
+ tests/Box/generalizedaffineimage1.cc (1.6),
+ tests/Box/generalizedaffinepreimage1.cc (1.6),
+ tests/Box/geomcovers1.cc (1.5), tests/Box/intersection1.cc (1.7),
+ tests/Box/interval1.cc (1.5), tests/Box/interval2.cc (1.5),
+ tests/Box/mapspacedims1.cc (1.5), tests/Box/max_min1.cc (1.7),
+ tests/Box/maxspacedim1.cc (1.6), tests/Box/membytes1.cc (1.5),
+ tests/Box/minconstraints1.cc (1.6),
+ tests/Box/pointsetpowerset1.cc (1.4), tests/Box/refine1.cc
+ (1.11), tests/Box/refine2.cc (1.10), tests/Box/refine3.cc (1.3),
+ tests/Box/relations1.cc (1.6), tests/Box/relations2.cc (1.4),
+ tests/Box/removespacedims1.cc (1.7), tests/Box/run_tests (1.4),
+ tests/Box/timeelapse1.cc (1.6), tests/Box/universe1.cc (1.5),
+ tests/Box/writebox1.cc (1.5), tests/Grid/Makefile.am (1.59),
+ tests/Grid/addcongruence1.cc (1.15),
+ tests/Grid/addcongruences1.cc (1.18),
+ tests/Grid/addconstraint1.cc (1.13),
+ tests/Grid/addconstraints1.cc (1.14), tests/Grid/addgenerator1.cc
+ (1.17), tests/Grid/addgenerators1.cc (1.17),
+ tests/Grid/addspacedims1.cc (1.16), tests/Grid/affinedim1.cc
+ (1.13), tests/Grid/affineimage1.cc (1.15),
+ tests/Grid/affineimage2.cc (1.13), tests/Grid/affinepreimage1.cc
+ (1.16), tests/Grid/affinepreimage2.cc (1.9),
+ tests/Grid/approximatepartition1.cc (1.4),
+ tests/Grid/asciidumpload1.cc (1.15), tests/Grid/asciidumpload2.cc
+ (1.7), tests/Grid/asciidumpload3.cc (1.6),
+ tests/Grid/asciidumpload4.cc (1.6), tests/Grid/asciidumpload5.cc
+ (1.4), tests/Grid/asciidumpload6.cc (1.4),
+ tests/Grid/asciidumpload7.cc (1.5), tests/Grid/bhz03widening1.cc
+ (1.14), tests/Grid/bounded1.cc (1.15),
+ tests/Grid/boundedaffineimage1.cc (1.5),
+ tests/Grid/boundedaffinepreimage1.cc (1.5),
+ tests/Grid/boundingbox1.cc (1.20), tests/Grid/bounds1.cc (1.16),
+ tests/Grid/certificate1.cc (1.15), tests/Grid/concatenate1.cc
+ (1.15), tests/Grid/congruence1.cc (1.19),
+ tests/Grid/congruences1.cc (1.13), tests/Grid/congruences2.cc
+ (1.7), tests/Grid/constraints1.cc (1.2), tests/Grid/contains1.cc
+ (1.13), tests/Grid/containsintegerpoint1.cc (1.5),
+ tests/Grid/copyconstruct1.cc (1.9), tests/Grid/coveringbox1.cc
+ (1.17), tests/Grid/coveringbox2.cc (1.15),
+ tests/Grid/directproduct1.cc (1.48), tests/Grid/directproduct2.cc
+ (1.15), tests/Grid/directproduct3.cc (1.16),
+ tests/Grid/directproduct4.cc (1.14), tests/Grid/directproduct5.cc
+ (1.9), tests/Grid/directproduct6.cc (1.11),
+ tests/Grid/discrete1.cc (1.9), tests/Grid/disjoint1.cc (1.13),
+ tests/Grid/equals1.cc (1.14), tests/Grid/expandspacedim1.cc
+ (1.13), tests/Grid/foldspacedims1.cc (1.13),
+ tests/Grid/frombdshape1.cc (1.2),
+ tests/Grid/fromoctagonalshape1.cc (1.2),
+ tests/Grid/generalizedaffineimage1.cc (1.15),
+ tests/Grid/generalizedaffineimage2.cc (1.14),
+ tests/Grid/generalizedaffineimage3.cc (1.6),
+ tests/Grid/generalizedaffinepreimage1.cc (1.17),
+ tests/Grid/generalizedaffinepreimage2.cc (1.17),
+ tests/Grid/generalizedaffinepreimage3.cc (1.6),
+ tests/Grid/generator1.cc (1.21), tests/Grid/generators1.cc
+ (1.14), tests/Grid/generators2.cc (1.4), tests/Grid/grid1.cc
+ (1.22), tests/Grid/grid2.cc (1.17), tests/Grid/grid3.cc (1.25),
+ tests/Grid/griddifference1.cc (1.13), tests/Grid/intersection1.cc
+ (1.13), tests/Grid/isempty1.cc (1.9), tests/Grid/isuniverse1.cc
+ (1.11), tests/Grid/join1.cc (1.17), tests/Grid/join2.cc (1.12),
+ tests/Grid/limitedextrapolation1.cc (1.14),
+ tests/Grid/limitedextrapolation2.cc (1.8),
+ tests/Grid/limitedextrapolation3.cc (1.7),
+ tests/Grid/mapspacedims1.cc (1.12), tests/Grid/maxmin1.cc (1.14),
+ tests/Grid/membytes1.cc (1.11), tests/Grid/mincongruences1.cc
+ (1.11), tests/Grid/mingenerators1.cc (1.11),
+ tests/Grid/outputoperator1.cc (1.10),
+ tests/Grid/outputoperator2.cc (1.4),
+ tests/Grid/outputoperator3.cc (1.4),
+ tests/Grid/partiallyreducedproduct1.cc (1.9),
+ tests/Grid/partiallyreducedproduct2.cc (1.4),
+ tests/Grid/partiallyreducedproduct3.cc (1.3),
+ tests/Grid/partition1.cc (1.7), tests/Grid/powersetdifference1.cc
+ (1.4), tests/Grid/powersetgeometricallycovers1.cc (1.4),
+ tests/Grid/powersetgeometricallyequals1.cc (1.4),
+ tests/Grid/relations1.cc (1.16), tests/Grid/relations2.cc (1.18),
+ tests/Grid/relations3.cc (1.9), tests/Grid/removespacedims1.cc
+ (1.15), tests/Grid/removespacedims2.cc (1.15),
+ tests/Grid/timeelapse1.cc (1.12), tests/Grid/topclosed1.cc
+ (1.13), tests/Grid/topclosure1.cc (1.9), tests/Grid/widening1.cc
+ (1.17), tests/Grid/widening2.cc (1.12), tests/Grid/widening3.cc
+ (1.7), tests/Grid/writecongruencesystem.cc (1.9),
+ tests/MIP_Problem/Makefile.am (1.10),
+ tests/MIP_Problem/ascii_dump_load1.cc (1.5),
+ tests/MIP_Problem/exceptions1.cc (1.5),
+ tests/MIP_Problem/mipproblem1.cc (1.12),
+ tests/MIP_Problem/mipproblem2.cc (1.10),
+ tests/MIP_Problem/mipproblem3.cc (1.4),
+ tests/Octagonal_Shape/Makefile.am (1.23),
+ tests/Octagonal_Shape/addspacedims1.cc (1.4),
+ tests/Octagonal_Shape/affinedimension1.cc (1.5),
+ tests/Octagonal_Shape/affineimage1.cc (1.5),
+ tests/Octagonal_Shape/affineimage2.cc (1.4),
+ tests/Octagonal_Shape/affinepreimage1.cc (1.6),
+ tests/Octagonal_Shape/affinepreimage2.cc (1.4),
+ tests/Octagonal_Shape/ascii_dump_load1.cc (1.4),
+ tests/Octagonal_Shape/bhmz05widening1.cc (1.5),
+ tests/Octagonal_Shape/bhz03widening1.cc (1.4),
+ tests/Octagonal_Shape/bounded1.cc (1.4),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.11),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.5),
+ tests/Octagonal_Shape/bounds1.cc (1.5),
+ tests/Octagonal_Shape/cc76extrapolation1.cc (1.6),
+ tests/Octagonal_Shape/cc76narrowing1.cc (1.5),
+ tests/Octagonal_Shape/chinainit.cc (1.4),
+ tests/Octagonal_Shape/concatenate1.cc (1.4),
+ tests/Octagonal_Shape/constraints1.cc (1.5),
+ tests/Octagonal_Shape/contains1.cc (1.5),
+ tests/Octagonal_Shape/containsintegerpoint1.cc (1.5),
+ tests/Octagonal_Shape/discrete1.cc (1.4),
+ tests/Octagonal_Shape/disjoint1.cc (1.8),
+ tests/Octagonal_Shape/empty1.cc (1.4),
+ tests/Octagonal_Shape/expandspacedim1.cc (1.6),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.6),
+ tests/Octagonal_Shape/frombdshape1.cc (1.2),
+ tests/Octagonal_Shape/fromgensys1.cc (1.4),
+ tests/Octagonal_Shape/fromgrid1.cc (1.3),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.5),
+ tests/Octagonal_Shape/fromspacedim1.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.10),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.6),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.10),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.6),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.5),
+ tests/Octagonal_Shape/intersection1.cc (1.5),
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.6),
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.6),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.5),
+ tests/Octagonal_Shape/max_min1.cc (1.6),
+ tests/Octagonal_Shape/max_min2.cc (1.5),
+ tests/Octagonal_Shape/maxspacedim1.cc (1.5),
+ tests/Octagonal_Shape/membytes1.cc (1.5),
+ tests/Octagonal_Shape/minconstraints1.cc (1.5),
+ tests/Octagonal_Shape/octdifference1.cc (1.5),
+ tests/Octagonal_Shape/octhull1.cc (1.5),
+ tests/Octagonal_Shape/relatwithcons1.cc (1.5),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.8),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.9),
+ tests/Octagonal_Shape/removespacedims1.cc (1.5),
+ tests/Octagonal_Shape/run_tests (1.4),
+ tests/Octagonal_Shape/timeelapse1.cc (1.6),
+ tests/Octagonal_Shape/universe1.cc (1.4),
+ tests/Octagonal_Shape/writeoctagon1.cc (1.6),
+ tests/Polyhedron/Makefile.am (1.116), tests/Polyhedron/README
+ (1.8), tests/Polyhedron/addcongruence1.cc (1.9),
+ tests/Polyhedron/addcongruences1.cc (1.13),
+ tests/Polyhedron/addconstraint1.cc (1.12),
+ tests/Polyhedron/addconstraints1.cc (1.13),
+ tests/Polyhedron/addconstraints2.cc (1.12),
+ tests/Polyhedron/addgenerator1.cc (1.13),
+ tests/Polyhedron/addgenerator2.cc (1.13),
+ tests/Polyhedron/addgenerators1.cc (1.14),
+ tests/Polyhedron/addgenerators2.cc (1.13),
+ tests/Polyhedron/addspacedims1.cc (1.13),
+ tests/Polyhedron/addspacedims2.cc (1.13),
+ tests/Polyhedron/affineimage1.cc (1.13),
+ tests/Polyhedron/affineimage2.cc (1.12),
+ tests/Polyhedron/affinepreimage1.cc (1.12),
+ tests/Polyhedron/affinetrans.cc (1.12),
+ tests/Polyhedron/append1.cc (1.13), tests/Polyhedron/append2.cc
+ (1.12), tests/Polyhedron/ascii_dump_load1.cc (1.11),
+ tests/Polyhedron/ascii_dump_load2.cc (1.11),
+ tests/Polyhedron/ascii_dump_load3.cc (1.12),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.14),
+ tests/Polyhedron/bhrz03widening1.cc (1.12),
+ tests/Polyhedron/bhrz03widening2.cc (1.12),
+ tests/Polyhedron/bhrz03widening3.cc (1.16),
+ tests/Polyhedron/bhz03widening1.cc (1.15),
+ tests/Polyhedron/bounded1.cc (1.12),
+ tests/Polyhedron/boundedaffineimage1.cc (1.12),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.10),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.11),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.13),
+ tests/Polyhedron/bounds1.cc (1.12),
+ tests/Polyhedron/cnncconversion1.cc (1.5),
+ tests/Polyhedron/concatenate1.cc (1.12),
+ tests/Polyhedron/congruences1.cc (1.14),
+ tests/Polyhedron/constrains1.cc (1.2),
+ tests/Polyhedron/constraints1.cc (1.12),
+ tests/Polyhedron/contains1.cc (1.11),
+ tests/Polyhedron/contains2.cc (1.11),
+ tests/Polyhedron/containsintegerpoint1.cc (1.4),
+ tests/Polyhedron/disjoint1.cc (1.11),
+ tests/Polyhedron/disjoint2.cc (1.13),
+ tests/Polyhedron/dualhypercubes.cc (1.16),
+ tests/Polyhedron/empty1.cc (1.12), tests/Polyhedron/equals1.cc
+ (1.11), tests/Polyhedron/exceptions1.cc (1.15),
+ tests/Polyhedron/exceptions2.cc (1.13),
+ tests/Polyhedron/exceptions3.cc (1.12),
+ tests/Polyhedron/expandspacedim1.cc (1.14),
+ tests/Polyhedron/expandspacedim2.cc (1.14),
+ tests/Polyhedron/foldspacedims1.cc (1.16),
+ tests/Polyhedron/foldspacedims2.cc (1.17),
+ tests/Polyhedron/frombdshape1.cc (1.2),
+ tests/Polyhedron/frombox1.cc (1.5), tests/Polyhedron/frombox2.cc
+ (1.5), tests/Polyhedron/fromgrid1.cc (1.2),
+ tests/Polyhedron/fromoctagonalshape1.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.14),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.14),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.11),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.10),
+ tests/Polyhedron/generators1.cc (1.12),
+ tests/Polyhedron/geomcovers1.cc (1.15),
+ tests/Polyhedron/h79widening1.cc (1.13),
+ tests/Polyhedron/h79widening2.cc (1.12),
+ tests/Polyhedron/hybrid.cc (1.5),
+ tests/Polyhedron/intersection1.cc (1.16),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.11),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.12),
+ tests/Polyhedron/linearpartition1.cc (1.15),
+ tests/Polyhedron/linearsystem1.cc (1.10),
+ tests/Polyhedron/linexpression1.cc (1.11),
+ tests/Polyhedron/mapspacedims1.cc (1.16),
+ tests/Polyhedron/matrix1.cc (1.11), tests/Polyhedron/max_min1.cc
+ (1.13), tests/Polyhedron/maxspacedim1.cc (1.16),
+ tests/Polyhedron/mc91.cc (1.16), tests/Polyhedron/membytes1.cc
+ (1.16), tests/Polyhedron/memory1.cc (1.14),
+ tests/Polyhedron/memory2.cc (1.16),
+ tests/Polyhedron/minconstraints1.cc (1.11),
+ tests/Polyhedron/minconstraints2.cc (1.13),
+ tests/Polyhedron/mingenerators1.cc (1.11),
+ tests/Polyhedron/mingenerators2.cc (1.12),
+ tests/Polyhedron/nncminimize1.cc (1.8),
+ tests/Polyhedron/nncminimize2.cc (1.8),
+ tests/Polyhedron/numberinput1.cc (1.33),
+ tests/Polyhedron/onepoint.cc (1.12), tests/Polyhedron/permute.cc
+ (1.10), tests/Polyhedron/pointsetpowerset1.cc (1.8),
+ tests/Polyhedron/pointsetpowerset2.cc (1.3),
+ tests/Polyhedron/polydifference1.cc (1.13),
+ tests/Polyhedron/polydifference2.cc (1.13),
+ tests/Polyhedron/polyhull1.cc (1.13),
+ tests/Polyhedron/polyhull2.cc (1.12),
+ tests/Polyhedron/powerset1.cc (1.22),
+ tests/Polyhedron/randphull1.cc (1.14),
+ tests/Polyhedron/relations1.cc (1.12),
+ tests/Polyhedron/relations2.cc (1.13),
+ tests/Polyhedron/relations3.cc (1.12),
+ tests/Polyhedron/removespacedims1.cc (1.12),
+ tests/Polyhedron/removespacedims2.cc (1.12),
+ tests/Polyhedron/smm1.cc (1.11), tests/Polyhedron/timeelapse1.cc
+ (1.13), tests/Polyhedron/timeelapse2.cc (1.13),
+ tests/Polyhedron/topclosed1.cc (1.12),
+ tests/Polyhedron/topclosure1.cc (1.12),
+ tests/Polyhedron/universe1.cc (1.12),
+ tests/Polyhedron/universe2.cc (1.12),
+ tests/Polyhedron/variablesset1.cc (1.12),
+ tests/Polyhedron/watchdog1.cc (1.11),
+ tests/Polyhedron/writeconsys1.cc (1.12),
+ tests/Polyhedron/writegensys1.cc (1.12),
+ tests/Polyhedron/writepolyhedron1.cc (1.12),
+ tests/Polyhedron/writepolyhedron2.cc (1.12),
+ tests/Polyhedron/writerelation1.cc (1.14),
+ tests/Polyhedron/writevariable1.cc (1.9), utils/Makefile.am
+ (1.17), utils/build_header.in (1.6), utils/cm_cleaner.sh (1.4),
+ utils/cm_splitter.sh (1.4), utils/text2cxxarray.in (1.5),
+ utils/timings.cc (1.13), utils/timings.hh (1.7): Copyright years
+ extended.
+
+2007-12-29 Saturday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.67): Include <typeinfo> for typeid().
+
+2007-12-29 Saturday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/files.cc (1.11): Include <cstdlib> for exit(). Use extra
+ parentheses to disambiguate a comparison.
+
+2007-12-29 Saturday 19:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (1.12),
+ src/BDS_Status.inlines.hh (1.17), src/BD_Shape.cc (1.8),
+ src/BD_Shape.inlines.hh (1.154), src/BD_Shape.templates.hh
+ (1.89), src/Box.cc (1.9), src/Box.templates.hh (1.73),
+ src/Congruence_System.cc (1.27), src/Constraint_System.cc (1.28),
+ src/Generator_System.cc (1.25), src/Grid_Certificate.cc (1.10),
+ src/Grid_nonpublic.cc (1.31), src/Grid_public.cc (1.62),
+ src/Interval.templates.hh (1.3), src/Linear_System.cc (1.46),
+ src/MIP_Problem.cc (1.64), src/Octagonal_Shape.cc (1.7),
+ src/Octagonal_Shape.inlines.hh (1.25),
+ src/Octagonal_Shape.templates.hh (1.63),
+ src/Polyhedron_nonpublic.cc (1.81), src/Polyhedron_public.cc
+ (1.105), src/Polyhedron_widenings.cc (1.64): Use explicit braces
+ to avoid ambiguous else's.
+
+2007-12-29 Saturday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Row.cc (1.24): Added a pair of extra parentheses to
+ disambiguate an addition within a shift.
+
+2007-12-29 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc (1.12): Include <cstdlib> for exit().
+
+2007-12-29 Saturday 10:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.72): Implemented template
+
+ <typename Interval> template <typename Iterator> void
+ Box<Interval>::CC76_widening_assign(const Box& y,
+ Iterator first, Iterator last)
+
+ in terms of the new Interval's widening.
+
+2007-12-29 Saturday 10:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.49), Interval.inlines.hh (1.28),
+ Interval.templates.hh (1.2): Moved several implemementations from
+ Interval.defs.hh to Interval.inlines.hh. Added the new method
+ template
+
+ <typename Boundary, typename Info> template <typename From,
+ typename Iterator> typename Enable_If<Is_Interval<From>::value,
+ void>::type Interval<Boundary, Info>::CC76_widening_assign(const
+ From& y, Iterator first,
+ Iterator last).
+
+2007-12-28 Friday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.234): Two new items added.
+
+2007-12-28 Friday 08:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bit_Row.defs.hh (1.8), Bit_Row.inlines.hh (1.5): Added
+ inline void set_intersection(const Bit_Row& x, const Bit_Row& y,
+ Bit_Row& z).
+
+2007-12-28 Friday 08:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.11): Include <exception> and <iostream>.
+
+2007-12-28 Friday 08:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.66): Added missing std:: qualification.
+
+2007-12-28 Friday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.44): Must include <cstdlib> for getenv().
+
+2007-12-10 Monday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.299): Version number bumped.
+
+2007-12-10 Monday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.225): Three items improved and merged.
+
+2007-12-10 Monday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.52), Grid.defs.hh (1.62): Comments
+ improved for consistency (the abbreviation we use for
+ `bounded-difference shape' is `BDS').
+
+2007-12-05 Wednesday 14:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.33): Corrected code for free() as suggested by Andrea Cimino.
+
+2007-12-05 Wednesday 10:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.224), src/BD_Shape.defs.hh (1.108),
+ src/BD_Shape.inlines.hh (1.153), src/C_Polyhedron.defs.hh (1.51),
+ src/C_Polyhedron.inlines.hh (1.38), src/Grid.defs.hh (1.61),
+ src/Grid.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh (1.53),
+ src/NNC_Polyhedron.inlines.hh (1.39), src/Octagonal_Shape.defs.hh
+ (1.36), src/Octagonal_Shape.inlines.hh (1.24),
+ src/Partially_Reduced_Product.defs.hh (1.18),
+ src/Partially_Reduced_Product.inlines.hh (1.16),
+ tests/BD_Shape/Makefile.am (1.69),
+ tests/BD_Shape/fromoctagonalshape1.cc (1.1),
+ tests/Grid/Makefile.am (1.58), tests/Grid/directproduct1.cc
+ (1.47), tests/Grid/frombdshape1.cc (1.1),
+ tests/Grid/fromoctagonalshape1.cc (1.1),
+ tests/Octagonal_Shape/Makefile.am (1.22),
+ tests/Octagonal_Shape/frombdshape1.cc (1.1),
+ tests/Polyhedron/Makefile.am (1.115),
+ tests/Polyhedron/frombdshape1.cc (1.1),
+ tests/Polyhedron/fromoctagonalshape1.cc (1.1): Added methods to
+ the Polyhedra classes, and the Grid, BD_Shape, Octagonal_Shape
+ classes that construct an element from a BD_Shape and from an
+ Octagonal_Shape. Added also similar methods to the partially
+ reduced product class Added tests to check these new methods.
+ Updated the NEWS with this information.
+
+2007-12-04 Tuesday 15:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/fromgrid1.cc (1.2), Octagonal_Shape/fromgrid1.cc
+ (1.2): Fixed a bug in the tests. The "==" was being used for
+ different objects.
+
+2007-12-04 Tuesday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.23): Test the finalize() methods by explicitly calling
+ System.gc().
+
+2007-12-04 Tuesday 09:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.298): Version number bumped.
+
+2007-12-04 Tuesday 09:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/fromgrid1.cc (1.1), Octagonal_Shape/fromgrid1.cc
+ (1.1): Missing test files added.
+
+2007-12-04 Tuesday 08:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.22): Reverted finalize() to being protected.
+
+2007-12-03 Monday 22:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.17),
+ src/Partially_Reduced_Product.inlines.hh (1.15),
+ tests/Grid/directproduct1.cc (1.46): A partially reduced product
+ can now be constructed directly from a closed polyhedron, a not
+ necessarily closed polyhedron, a grid or a box.
+
+2007-12-03 Monday 21:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.11),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.32), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.21): Added the method free() to delete the C++ class allowing
+ Java garbage collection to reclaim the wrapper.
+
+2007-12-03 Monday 12:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.223), src/BD_Shape.defs.hh (1.107),
+ src/BD_Shape.inlines.hh (1.152), src/Octagonal_Shape.defs.hh
+ (1.35), src/Octagonal_Shape.inlines.hh (1.23),
+ src/Polyhedron_public.cc (1.104), tests/BD_Shape/Makefile.am
+ (1.68), tests/Octagonal_Shape/Makefile.am (1.21): Added
+ constructors fro BD_Shape and Octagonal_Shape fro a Grid. Added
+ tests for the new constructors.
+
+ Undone an unintended change to src/Polyhedron_public.cc in
+ previous commit (assertion that was added, removed).
+
+2007-12-03 Monday 12:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.222), src/C_Polyhedron.cc (1.23),
+ src/C_Polyhedron.defs.hh (1.50), src/NNC_Polyhedron.cc (1.23),
+ src/NNC_Polyhedron.defs.hh (1.52), src/Polyhedron_public.cc
+ (1.103), tests/Grid/directproduct3.cc (1.15),
+ tests/Polyhedron/Makefile.am (1.114),
+ tests/Polyhedron/fromgrid1.cc (1.1): Added constructors for
+ NNC_Polyhedron and C_Polyhedron from a Grid. Test file
+ fromgrid1.cc and its nnc version tests these constructors.
+
+ The test19 in Grid/directproduct3.cc now checks
+ is_topologically_closed() for Box x Grid products.
+
+2007-12-03 Monday 11:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.221): Mentioned the bug fixed today.
+
+2007-12-03 Monday 11:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.45): Fixed a bug in method insert()
+ whereby a wrong result could have been obtained when inserting an
+ NNC linear row into an empty linear system having a higher space
+ dimension. This was the bug shown by test14() in
+ tests/Polyhedron/congruences1.cc.
+
+2007-12-03 Monday 11:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/congruences1.cc (1.13): test14 is no longer
+ expected to fail (bug corrected).
+
+2007-12-03 Monday 08:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/congruences1.cc (1.12): Test14 shows a bug when
+ converting a congruence system to a constraint system.
+
+2007-11-30 Friday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: sp_clpq.pl (1.19), sp_pl_check.pl
+ (1.13): Little cosmetic improvements.
+
+2007-11-30 Friday 16:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/: sp_clpq.pl (1.18), sp_pl_check.pl
+ (1.12): Allow for different versions of SICStus.
+
+2007-11-30 Friday 10:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/: sp_clpq.pl (1.17), sp_pl_check.pl
+ (1.11): Changes to allow support for SICStus version 4. FIXME
+ notes added.
+
+2007-11-29 Thursday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_cfli.hh (1.7): Include <gprolog.h>
+ unconditionally.
+
+2007-11-28 Wednesday 16:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.220): Revised reference to Box domain.
+
+2007-11-28 Wednesday 15:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/congruences1.cc (1.1): Tests all the congruence methods
+ for the Box domain.
+
+2007-11-28 Wednesday 15:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.219), tests/Box/Makefile.am (1.46),
+ tests/Box/addconstraints1.cc (1.9), tests/Box/cc76widening.cc
+ (1.6), tests/Grid/directproduct1.cc (1.45),
+ tests/Grid/directproduct2.cc (1.14), tests/Grid/directproduct3.cc
+ (1.14), tests/Grid/directproduct4.cc (1.13),
+ tests/Grid/directproduct5.cc (1.8), tests/Grid/directproduct6.cc
+ (1.10):
+ Tests for new methods just committed added to appropriate files
+ in tests/Box.
+
+ Tests for directproduct now have the Box domain for one of the
+ product's components as an optional directive although the
+ products are currently set with directives for testing
+ NNC_Polyhedron with the Grid.
+
+2007-11-28 Wednesday 15:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Box.cc (1.8), Box.defs.hh (1.33), Box.inlines.hh (1.22),
+ Box.templates.hh (1.71): Enabled the product of a Box and a Grid.
+ To do this, for compatibility with the other classes, the
+ following methods have been added: Box(Congruence_System cgs)
+
+ add_constraint_and_minimize(Constraint c)
+ add_constraints_and_minimize(Constraint_System cs)
+ add_recycled_constraints(Constraint_System cs)
+ add_recycled_constraints_and_minimize(Constraint_System& cs)
+
+ add_congruence(Congruence cg)
+ add_congruence_and_minimize(Congruence_System cgs)
+ add_congruences(Congruence_System cgs)
+ add_congruences_and_minimize(Congruence_System cgs)
+ add_recycled_congruences(Congruence_System cgs)
+ add_recycled_congruences_and_minimize(Congruence_System& cgs)
+
+ widening_assign
+
+ congruences()
+ minimized_congruences()
+
+ can_recycle_constraint_systems()
+ can_recycle_congruence_systems()
+
+ throw_dimension_incompatible(char* method, Congruence cg)
+ throw_dimension_incompatible(char* method, Congruence_System
+ cgs)
+
+ Also private methods added:
+
+ extract_interval_congruence(Congruence cg, ...)
+ add_congruence_no_check(Congruence cg)
+ add_congruences_no_check(Congruence_System cgs)
+
+2007-11-28 Wednesday 06:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.297), interfaces/Prolog/GNU/gprolog_cfli.hh
+ (1.6): No two distributions install gprolog.h in the same place:
+ the only reliable way for the users of the GNU Prolog interface
+ is to define CPPFLAGS.
+
+2007-11-27 Tuesday 12:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: BD_Shape.templates.hh (1.88), Octagonal_Shape.templates.hh
+ (1.62): Missing "const" added.
+
+2007-11-27 Tuesday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/constraints1.cc (1.9): test06 succeeds.
+
+2007-11-27 Tuesday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.32), Box.templates.hh (1.70):
+ Box<Interval>::add_constraint_no_check() assumes (and assumed)
+ that the box was not marked empty: assertion added. This
+ invariant was ensured by Box<Interval>::add_constraint() but not
+ by Box<Interval>::add_constraints_no_check(const
+ Constraint_System&): the latter has been fixed accordingly.
+
+2007-11-27 Tuesday 10:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/constraints1.cc (1.8): test05 succeeds.
+
+2007-11-27 Tuesday 10:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.69): Spurious comment removed.
+
+2007-11-27 Tuesday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.68), tests/Box/constraints1.cc (1.7):
+ Last change undone and a change in the commit before this also
+ undone.
+
+2007-11-27 Tuesday 10:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.67): Check for emptiness moved from
+ add_constraints_no_check() to add_constraint_no_check(). Also do
+ the empty check by just checking marked_empty() instead of
+ is_empty().
+
+2007-11-27 Tuesday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.66): Duplicate code avoided in
+ Box<Interval>::add_constraint_no_check().
+
+2007-11-27 Tuesday 09:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.templates.hh (1.65), tests/Box/constraints1.cc (1.6):
+ Added corrections for bugs in identified by previous commit.
+
+2007-11-27 Tuesday 08:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Box/constraints1.cc (1.5): test05 and test06 show bugs in
+ add_constraint_no_check() and add_constraints_no_check().
+
+2007-11-26 Monday 08:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.296), interfaces/Prolog/GNU/gprolog_cfli.hh
+ (1.5): Find gprolog.h also under Ubuntu 7.10.
+
+2007-11-23 Friday 10:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct3.cc (1.13): Test07 fails only when the
+ assertions are enabled with 8 bit integers.
+
+2007-11-22 Thursday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.295): Version number bumped.
+
+2007-11-22 Thursday 08:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct3.cc (1.12): Test07 is set to fail for 8
+ bit integers when one of the domain components is C_Polyhedron.
+
+2007-11-21 Wednesday 11:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct1.cc (1.44): Test is now reset to test
+ product Grid x NNC_Polyhedron
+
+2007-11-21 Wednesday 11:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.218), src/Octagonal_Shape.defs.hh (1.34),
+ src/Octagonal_Shape.inlines.hh (1.22),
+ tests/Grid/directproduct1.cc (1.43): Octagonal domain now has a
+ constructor from a box.
+
+2007-11-21 Wednesday 11:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.217), src/Octagonal_Shape.defs.hh (1.33),
+ src/Octagonal_Shape.inlines.hh (1.21),
+ src/Octagonal_Shape.templates.hh (1.61),
+ tests/Grid/directproduct1.cc (1.42), tests/Grid/directproduct2.cc
+ (1.13), tests/Grid/directproduct3.cc (1.11),
+ tests/Grid/directproduct4.cc (1.12), tests/Grid/directproduct5.cc
+ (1.7), tests/Grid/directproduct6.cc (1.9): The
+ Partially_Reduced_Product now works for products with
+ Octagonal_Shape domain elements.
+
+ Tests now have an option to test with a product of
+ Octagonal_Shape and Grid, but all tests are currently set to test
+ C_ or NNC_Polyhedron x Grid (or vice versa) combinations.
+
+2007-11-21 Wednesday 08:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Direct_Product.defs.hh (1.48), Direct_Product.inlines.hh
+ (1.46), Direct_Product.templates.hh (1.24),
+ Direct_Product.types.hh (1.7), Makefile.am (1.175): The old
+ implentation for Direct_Product removed as this is replaced by an
+ instance of the Partially_Reduced_Product class.
+
+2007-11-20 Tuesday 22:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Box.defs.hh (1.31), src/Box.templates.hh (1.64),
+ tests/Box/Makefile.am (1.45), tests/Box/fromdirectproduct1.cc
+ (1.6), tests/Box/frompartiallyreducedproduct1.cc (1.1): Changed
+ the construction of a box from a direct product class to the
+ construction of a box from a partially reduced product class.
+
+ Test file updated and renamed to test this change.
+
+2007-11-20 Tuesday 15:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.106), src/BD_Shape.inlines.hh (1.151),
+ tests/BD_Shape/Makefile.am (1.67), tests/BD_Shape/boundingbox1.cc
+ (1.1), tests/Grid/directproduct1.cc (1.41): Added method for
+ constructing a BD_Shape from a box.
+
+ Test file for building from a box added for the BD_Shape.
+
+ Test for building a product from a box is now enabled when a
+ component of the product is a BD_Shape.
+
+2007-11-20 Tuesday 13:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.105), src/BD_Shape.inlines.hh (1.150),
+ tests/Grid/directproduct3.cc (1.10): Added widening_assign()
+ using the H79_widening_assign() as the default widening. Test for
+ widening_assign uncommented for products using the BD_Shape
+ class.
+
+2007-11-20 Tuesday 08:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/partiallyreducedproduct2.cc (1.3): Tests 08 and 18
+ fail for 8-bit integers.
+
+2007-11-19 Monday 18:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.inlines.hh (1.149), tests/Grid/directproduct1.cc
+ (1.40), tests/Grid/directproduct2.cc (1.12),
+ tests/Grid/directproduct3.cc (1.9), tests/Grid/directproduct4.cc
+ (1.11), tests/Grid/directproduct5.cc (1.6),
+ tests/Grid/directproduct6.cc (1.8): Corrected code for
+ BD_Shape<T>::add_congruences_and_minimize(const
+ Congruence_System& cgs)
+
+ All the tests for directproduct?.cc have an option to run using
+ the BD_Shape x Grid domain, apart from a few tests that are
+ commented out due to missing methods in the BD_Shape class.
+
+ Note that these tests are currently set to run using
+ NNC_Polyhedron x Grid or Grid x.NNC_Polyhedron.
+
+2007-11-19 Monday 14:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.104), src/BD_Shape.inlines.hh (1.148),
+ src/BD_Shape.templates.hh (1.87), src/Polyhedron.inlines.hh
+ (1.144), src/Polyhedron_public.cc (1.102),
+ tests/Grid/directproduct1.cc (1.39): Added methods for adding
+ congruences and for obtaining the set of equality congruences
+ from a BD_Shape.
+
+ Methods in Polyhedron_public.cc for adding congruences moved to
+ Polyhedron.inlines.hh.
+
+2007-11-19 Monday 11:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.16),
+ src/Partially_Reduced_Product.templates.hh (1.7),
+ tests/Grid/directproduct5.cc (1.5),
+ tests/Grid/partiallyreducedproduct3.cc (1.2): Added
+ relation_with(Congruences) to the Partially_Reduced_Product
+ class.
+
+2007-11-19 Monday 10:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.216): Added item
+
+ o The method relations_with(Congruence) has been added to the
+ Polyhedron class for compatibility with the Grid class
+ methods.
+
+2007-11-19 Monday 09:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.328), src/Polyhedron_public.cc (1.101),
+ tests/Polyhedron/relations2.cc (1.12): Added method
+ relation_with(Congruence) to Polyhedron class.
+
+2007-11-19 Monday 08:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.100): A couple of small improvements
+ to the implementation of constrains(): - avoid counting lines
+ if the generator system is not minimized (no matter if it has
+ pending generators or not); - prefer efficient methods
+ g.is_line_or_ray() and g.is_line() with respect to g.type()
+ when checking for lines and rays.
+
+2007-11-18 Sunday 13:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.10),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.31), tests/ppl_interface_generator_java_test_java.m4 (1.10),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.20):
+ Added Java interface for constraints().
+
+ In Java/tests/ppl_interface_generator_java_test_java.m4, just a
+ spelling correction.
+
+2007-11-17 Saturday 22:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.215), src/Grid.defs.hh (1.60), src/Grid.inlines.hh
+ (1.20), src/Partially_Reduced_Product.defs.hh (1.15),
+ src/Partially_Reduced_Product.inlines.hh (1.14),
+ src/Partially_Reduced_Product.templates.hh (1.6),
+ src/Polyhedron.defs.hh (1.327), src/Polyhedron.inlines.hh
+ (1.143), src/Polyhedron_public.cc (1.99),
+ tests/Grid/directproduct1.cc (1.38), tests/Grid/directproduct4.cc
+ (1.10), tests/Grid/directproduct5.cc (1.4),
+ tests/Grid/partiallyreducedproduct1.cc (1.8),
+ tests/Polyhedron/addcongruences1.cc (1.12): Added methods
+ add_congruences_and_minimize(Congruence_System),
+ add_recycled_congruences(Congruence_System), and
+ add_recycled_congruences_and_minimize(Congruence_System) to
+ Polyhedron class. Added static methods
+ can_recycle_constraint_systems() and
+ can_recycle_congruence_systems() to Polyhedron and Grid classes.
+ Added methods add_congruences_and_minimize(Congruence_System),
+ add_recycled_congruences(Congruence_System), and
+ add_recycled_congruences_and_minimize(Congruence_System) to the
+ Partially_Reduced_Product class.
+
+ Some simple tests added to check these.
+
+2007-11-17 Saturday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.214), src/Polyhedron.defs.hh (1.326),
+ src/Polyhedron_public.cc (1.98), tests/Polyhedron/Makefile.am
+ (1.113), tests/Polyhedron/constrains1.cc (1.1),
+ tests/Polyhedron/constraints1.cc (1.11): New method bool
+ Polyhedron::constrains(Variable var) const returns `true' if and
+ only if `var' is constrained in `*this'.
+
+2007-11-17 Saturday 19:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/relations3.cc (1.11): New test.
+
+2007-11-17 Saturday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.defs.hh (1.14): Friend declaration
+ fixed and uncommented.
+
+2007-11-16 Friday 14:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.13): A couple of FIXME's
+ added.
+
+2007-11-16 Friday 14:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.59), src/Partially_Reduced_Product.defs.hh
+ (1.12), src/Partially_Reduced_Product.inlines.hh (1.13),
+ tests/Grid/directproduct1.cc (1.37), tests/Grid/directproduct3.cc
+ (1.8), tests/Grid/partiallyreducedproduct3.cc (1.1): Test file
+ added for partially reduced products (which should have been
+ added before).
+
+ Many doxygen comments in the defs file improved and corrected.
+ The setting/clearing of the reduced flag also revised for some
+ methods.
+
+2007-11-16 Friday 12:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.11),
+ src/Partially_Reduced_Product.inlines.hh (1.12),
+ tests/Grid/directproduct4.cc (1.9): Added an implementation of
+ add_congruences_and_minimize().
+
+ Removed some redundant code in
+ src/Partially_Reduced_Product.defs.hh.
+
+2007-11-16 Friday 11:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct4.cc (1.8): Tests for
+ generalized_affine_(pre)image() methods that were commented out
+ now have now been revised to test the defined methods and
+ un-commented.
+
+2007-11-16 Friday 10:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.58), src/Grid.inlines.hh (1.19),
+ src/Partially_Reduced_Product.defs.hh (1.10),
+ src/Partially_Reduced_Product.inlines.hh (1.11),
+ tests/Grid/directproduct1.cc (1.36), tests/Grid/directproduct2.cc
+ (1.11): Methods in the Grid domain that build a grid from
+ generators, add generators to a grid and get the generators
+ defining a grid are no longer supported. (Note: this change only
+ affects methods wrt "generators" and _not_ wrt
+ "grid_generators".)
+
+ In the Partially_Reduced_Product domain all methods that build a
+ product from generators or grid generators, add generators or
+ grid generators to a product and get the generators or grid
+ generators defining a product are no longer supported.
+
+ Changes to the tests reflect this change.
+
+2007-11-15 Thursday 14:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.9),
+ src/Partially_Reduced_Product.inlines.hh (1.10),
+ src/Partially_Reduced_Product.templates.hh (1.5),
+ tests/Grid/partiallyreducedproduct1.cc (1.7): Corrected the
+ set_reduced_flag() to clear_reduced_flag() when building a new
+ product from constraints or congruences.
+
+ Made 2 additional tests for OK() that checks products after using
+ these constructors.
+
+ The code implementing OK() now forces reduced() to reduce the
+ copy of *this by setting its "reduced" flag to false. The code
+ for OK() now moved to *.templates.hh
+
+ Some formatting improvements mainly in *.inlines.hh.
+
+2007-11-15 Thursday 10:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.templates.hh (1.4),
+ tests/Grid/Makefile.am (1.57): More tests added for smash and
+ constraints product.. Formatting improvements to
+ /Partially_Reduced_Product.templates.hh.
+
+2007-11-13 Tuesday 10:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.9),
+ tests/Grid/partiallyreducedproduct1.cc (1.6),
+ tests/Grid/partiallyreducedproduct2.cc (1.2): Many corrections to
+ the product domain implementation mainly wrt when reduction must
+ be done and setting the reduced Boolean. Tests added and
+ improved. Some useless tests removed.
+
+2007-11-12 Monday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.43): Useless @SET_MAKE@ removed.
+
+2007-11-12 Monday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.294): New versions of GCC on Darwin no longer
+ support -Wno-long-double: we no longer use this option on that
+ platform (people using older versions will simply get lots of
+ warnings they can ignore).
+
+2007-11-09 Friday 11:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct3.cc (1.7): Test18 fails for 8-bit
+ coefficients.
+
+2007-11-07 Wednesday 14:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: directproduct1.cc (1.35), directproduct3.cc (1.6):
+ Tests corrected.
+
+2007-11-07 Wednesday 09:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/: directproduct1.cc (1.34), directproduct3.cc (1.5):
+ Temporarily disabled test14 and test19 in directproduct1 and
+ directproduct3, respectively, which are known to fail.
+
+2007-11-05 Monday 21:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.inlines.hh (1.142),
+ tests/Polyhedron/congruences1.cc (1.11): The method congruences()
+ for the Polyhedron classes must return all equalities including
+ the implied equalities.
+
+2007-11-05 Monday 17:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.56), partiallyreducedproduct1.cc
+ (1.5), partiallyreducedproduct2.cc (1.1):
+ partiallyreducedproduct1.cc no longer tests the direct product
+ domain. More tests for the Smash_Product and Constraints_Product
+ domains added in partiallyreducedproduct2.cc
+
+2007-11-05 Monday 15:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: directproduct1.cc (1.33), directproduct2.cc (1.10),
+ directproduct3.cc (1.4), directproduct4.cc (1.7),
+ directproduct5.cc (1.3): Revised the directproduct tests so as
+ not to build or enlarge a product using the generators or grid
+ generators.
+
+2007-11-05 Monday 14:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.8),
+ src/Partially_Reduced_Product.inlines.hh (1.8),
+ src/Polyhedron.defs.hh (1.325), src/Polyhedron_public.cc (1.97),
+ tests/Grid/directproduct4.cc (1.6): Undone the change to
+ generalized_affine_image in previous commit so these methods are,
+ again, unsupported by the Partially_Reduced_Product domains.
+
+2007-11-05 Monday 12:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/directproduct1.cc (1.32): Revised test so as not to
+ use the generators or grid_generators constructors
+
+2007-11-05 Monday 11:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.7),
+ src/Partially_Reduced_Product.inlines.hh (1.7),
+ src/Polyhedron.defs.hh (1.324), src/Polyhedron_public.cc (1.96),
+ tests/Grid/directproduct4.cc (1.5): Revised the methods
+ generalized_affine_image() so as to allow for a modulus as the
+ fourth argument. Note that for the Polyhedron domains the
+ modulus is ignored and the transformation is treated as if it was
+ 0 (equality). Enabled the tests in directproduct4.cc that test
+ this.
+
+2007-11-05 Monday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Polyhedron.defs.hh (1.49), src/C_Polyhedron.inlines.hh
+ (1.37), src/NNC_Polyhedron.defs.hh (1.51),
+ src/NNC_Polyhedron.inlines.hh (1.38),
+ src/Partially_Reduced_Product.defs.hh (1.6),
+ src/Partially_Reduced_Product.inlines.hh (1.6),
+ tests/Grid/partiallyreducedproduct1.cc (1.4): Removed
+ C_Polyhedron::C_Polyhedron(const Grid_Generator_System&),
+ NNC_Polyhedron::NNC_Polyhedron(const Grid_Generator_System&) and
+ similar constructors.
+
+2007-11-05 Monday 09:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.5), tests/print.hh
+ (1.43), tests/Grid/Makefile.am (1.55),
+ tests/Grid/directproduct1.cc (1.31), tests/Grid/directproduct2.cc
+ (1.9), tests/Grid/directproduct3.cc (1.3),
+ tests/Grid/directproduct4.cc (1.4), tests/Grid/directproduct5.cc
+ (1.2), tests/Grid/directproduct6.cc (1.7),
+ tests/Grid/directproduct7.cc (1.5): Completely revised the test
+ files directproduct?.cc
+
+ In tests/print.hh, added to the print options for the tests:
+
+ print_constraints(const
+ Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+ pd, print_congruences(const
+ Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+ pd,
+
+ Corrected the implementation of strictly_contains() for
+ Partially_Reduced_Product domains.
+
+2007-11-03 Saturday 08:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.4),
+ src/globals.defs.hh (1.51), tests/Grid/Makefile.am (1.54),
+ tests/Grid/asciidumpload7.cc (1.4),
+ tests/Grid/partiallyreducedproduct1.cc (1.3): Added code for
+ ascii_dump() for Partially_Reduced_Product class.
+
+2007-11-02 Friday 19:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.13): FIXME resolved.
+
+2007-11-02 Friday 19:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.templates.hh (1.3): Comments
+ revised so as to adhere to our standards.
+
+2007-11-02 Friday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.templates.hh (1.2): Simplified the
+ logic of Smash_Reduction<D1, D2>::product_reduce() so as to
+ remove all explicit returns.
+
+2007-11-02 Friday 16:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.5),
+ Partially_Reduced_Product.inlines.hh (1.3): Revised comments for
+ the product domain. Removed a useless return.
+
+2007-11-02 Friday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Partially_Reduced_Product.inlines.hh (1.2): Do not name
+ unused parameters (this avoids the compiler warnings). Avoid
+ useless returns.
+
+2007-11-02 Friday 16:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.4): Added comments for
+ the new reduction classes and their methods. Corrected another
+ comment.
+
+2007-11-02 Friday 14:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Partially_Reduced_Product.defs.hh (1.3),
+ tests/Grid/partiallyreducedproduct1.cc (1.2): Removed redundant
+ typedef declarations and revised the tests to use the more
+ generic types for products.
+
+2007-11-02 Friday 14:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Partially_Reduced_Product.defs.hh (1.2),
+ Partially_Reduced_Product.types.hh (1.2): Temporarily added the
+ Domain_Product class: it will be removed when template typedefs
+ will be supported by C++.
+
+2007-11-02 Friday 11:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Makefile.am (1.174), src/Partially_Reduced_Product.defs.hh
+ (1.1), src/Partially_Reduced_Product.inlines.hh (1.1),
+ src/Partially_Reduced_Product.templates.hh (1.1),
+ src/Partially_Reduced_Product.types.hh (1.1),
+ tests/Grid/Makefile.am (1.53),
+ tests/Grid/partiallyreducedproduct1.cc (1.1): First revision for
+ implementing Partially_Reduced_Product classes that is intended
+ to replace the Direct_Product and Open_Product classes.
+
+2007-11-01 Thursday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (1.30): Avoid abusing logical operators.
+
+2007-10-29 Monday 11:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.15): Test corrected so as to
+ take into proper account 32bit architectures.
+
+2007-10-27 Saturday 14:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/h79widening1.cc (1.12): Simplified the logic
+ underlying test01.
+
+2007-10-27 Saturday 13:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/affinepreimage1.cc (1.15): Removed TODO comment and
+ uncommented gr.add_congruence((3*A - 6*B %= 3) / 9);
+
+2007-10-27 Saturday 12:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/dualhypercubes.cc (1.15): Modified to compute
+ (and print in noisy mode) information on the cardinality of the
+ intermediate results, as well as checking the cardinalities of
+ the final results to match those reported in the FAC 2005 paper.
+
+2007-10-27 Saturday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (1.5): Tests extended and
+ FIXMEs resolved.
+
+2007-10-27 Saturday 07:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinepreimage1.cc (1.14): Avoid abusing logical
+ operators.
+
+2007-10-27 Saturday 06:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/membytes1.cc (1.10): TODO dealt with.
+
+2007-10-27 Saturday 06:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.14): One FIXME resolved,
+ another one added.
+
+2007-10-26 Friday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: .cvsignore (1.6), writegensys1.cc (1.11),
+ writepolyhedron1.cc (1.11), writepolyhedron2.cc (1.11): Several
+ FIXMEs resolved.
+
+2007-10-26 Friday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linearpartition1.cc (1.14): FIXME resolved: now
+ test04() checks all the results.
+
+2007-10-26 Friday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/dualhypercubes.cc (1.14): Variable renamed.
+
+2007-10-26 Friday 12:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Direct_Product.inlines.hh (1.45),
+ Direct_Product.templates.hh (1.23): Non-inline code moved from
+ Direct_Product.inlines.hh to Direct_Product.templates.hh
+
+2007-10-25 Thursday 22:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.21),
+ src/Pointset_Powerset.templates.hh (1.16),
+ tests/Polyhedron/pointsetpowerset2.cc (1.2): Added
+ affine_dimension() to the Pointset_Powerset.
+
+2007-10-25 Thursday 21:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.13): Define also
+ SWI_PROLOG_LD_OPTIONS.
+
+2007-10-24 Wednesday 15:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.defs.hh (1.20),
+ src/Pointset_Powerset.templates.hh (1.15),
+ tests/Polyhedron/Makefile.am (1.112),
+ tests/Polyhedron/pointsetpowerset2.cc (1.1): Added
+ generalized_*image() and bounded_*image() to the Pointset
+ Powerset domain.
+
+ Added tests for these and for the affine_image() and
+ affine_preimage() methods.
+
+2007-10-22 Monday 21:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.inlines.hh (1.44),
+ tests/Grid/directproduct6.cc (1.6): Revised code for
+ relation_with(Constraint). Added one extra test for this.
+
+2007-10-22 Monday 14:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.inlines.hh (1.43),
+ tests/Grid/directproduct1.cc (1.30), tests/Grid/directproduct2.cc
+ (1.8), tests/Grid/directproduct3.cc (1.2),
+ tests/Grid/directproduct4.cc (1.3), tests/Grid/directproduct6.cc
+ (1.5), tests/Grid/directproduct7.cc (1.4): Bug fixed for
+ congruences() and minimized_congruences(). Tests changed so as
+ to test the Direct_Product class rather than the Open_Product
+ class.
+
+2007-10-22 Monday 13:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.205), src/Direct_Product.defs.hh (1.47),
+ src/Direct_Product.inlines.hh (1.42): Documentation revised for
+ grids, bibliographic cross-reference corrected and some missing
+ code for the direct product domain added.
+
+2007-10-22 Monday 11:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.46), src/Direct_Product.inlines.hh
+ (1.41), tests/Grid/directproduct6.cc (1.4): Revised the returned
+ result for relation_with(Constraint).
+
+2007-10-22 Monday 09:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.45), src/Direct_Product.inlines.hh
+ (1.40), tests/Grid/directproduct6.cc (1.3): Added the
+ relation_with(Constraint) and relation_with(Generator) method for
+ the direct product.
+
+2007-10-20 Saturday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.76): Use the `-pl' option of
+ `plld' to make sure the right Prolog interpreter is used.
+
+2007-10-20 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.12): Set and substitute the
+ `SWI_PROLOG' variables: it contains the complete path of the
+ SWI-Prolog interpreter.
+
+2007-10-20 Saturday 18:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.57), src/Grid_nonpublic.cc (1.29),
+ src/Grid_public.cc (1.61), tests/Grid/relations1.cc (1.15),
+ tests/Grid/relations2.cc (1.17), tests/Grid/relations3.cc (1.8):
+ Revised the grid relation_with() methods for congruences and
+ constraints so that saturates() is included in the result
+ whenever the congruence or constraint is an equality and every
+ point of the grid satisfies the equality.
+
+ Added grid relation_with() methods for a generator so that a
+ point or closure point has the same relation with the grid as the
+ corresponding grid point, and a ray or line has the same relation
+ with the grid as a grid line.
+
+ Expected results revised and new tests for the grid
+ relation_with() methods for a generator added to relations1.cc.
+
+2007-10-19 Friday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.293): Version number bumped.
+
+2007-10-19 Friday 15:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.60): In code for building a grid from a
+ polyhedron, bug that was causing an assertion to fail corrected.
+
+2007-10-19 Friday 10:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.36): Spelling of file
+ name corrected.
+
+2007-10-19 Friday 08:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (1.24): test19 expected to fail with an
+ overflow exception with checked_int8 configuration.
+
+2007-10-18 Thursday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.292): For a change, test with
+ Octagonal_Shape<double> instead of BD_Shape<int8_t>.
+
+2007-10-18 Thursday 11:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.44), src/Direct_Product.inlines.hh
+ (1.39), tests/Grid/directproduct7.cc (1.3): Added maximize/5 and
+ minimize/5 for the direct product. Comments improved. Tests
+ added for these methods.
+
+2007-10-18 Thursday 08:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.59): TEMP_INTEGER taken outside loops.
+
+2007-10-18 Thursday 08:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.16):
+ Additional change made so as to deal with change to maximize/5
+ and minimize/5 for the grid domain.
+
+2007-10-18 Thursday 08:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.58), tests/Grid/grid3.cc (1.23): Bug shown
+ in previous commit now corrected.
+
+2007-10-18 Thursday 07:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (1.22): test18 shows a bug in the code added
+ for building a grid using the generators of a polyhedron.
+
+2007-10-17 Wednesday 22:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.57): Code for constructing a grid from a
+ polyhedron improved.
+
+2007-10-17 Wednesday 21:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.15):
+ Changed the OCaml interface so as to match the change to
+ maximize/5 and minimize/5 for the grid domain.
+
+2007-10-17 Wednesday 18:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.18),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.30),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.19),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.49),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.51), src/Grid.defs.hh (1.56), src/Grid.inlines.hh (1.18),
+ src/Grid_nonpublic.cc (1.28), tests/Grid/maxmin1.cc (1.13):
+ Changed the methods maximize/5 and minimize/5 for the Grid class
+ so that a Generator point, the maximum point of the grid, is the
+ 5th argument.
+
+2007-10-17 Wednesday 14:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.55), src/Grid_public.cc (1.56),
+ tests/Grid/grid3.cc (1.21): Added a constructor for a grid from a
+ polyhedron.
+
+2007-10-17 Wednesday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.323): Grid befriended to allow for the
+ efficient implementation of a Grid constructor from a Polyhedron.
+
+2007-10-16 Tuesday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.defs.hh (1.25): FIXME resolved.
+
+2007-10-16 Tuesday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.types.hh (1.8): Template parameters renamed.
+
+2007-10-16 Tuesday 17:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.43), src/Direct_Product.inlines.hh
+ (1.38), tests/Grid/directproduct7.cc (1.2): Added
+ bounded_affine_image() and bounded_affine_preimage() for the
+ direct product domain with some simple tests in
+ directproduct7.cc.
+
+ Improved a few comments in Direct_Product.defs.hh.
+
+2007-10-16 Tuesday 15:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.42), src/Direct_Product.inlines.hh
+ (1.37), tests/Grid/Makefile.am (1.52),
+ tests/Grid/directproduct7.cc (1.1): Revised several comments in
+ Direct_Product.defs.hh. Added bounds_from_above/1,
+ bounds_from_below/1, maximize/4 and minimize/4 for direct product
+ domain. Added tests for these in directproduct7.cc.
+
+2007-10-16 Tuesday 12:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.inlines.hh (1.36): Useless copies avoided.
+
+2007-10-16 Tuesday 12:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.inlines.hh (1.35): Implementation of
+ constraints(), minimized_constraints(), congruences() and
+ minimized_congruences() improved.
+
+2007-10-16 Tuesday 10:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.41), src/Direct_Product.inlines.hh
+ (1.34), tests/Grid/directproduct4.cc (1.2): Added affime_*image
+ and versions of generalized_..._*image that are supported by both
+ the grids and polyhedra classes. Tests for these have been
+ enabled.
+
+2007-10-16 Tuesday 09:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.inlines.hh (1.33),
+ tests/Grid/directproduct6.cc (1.2): Improved code in previous
+ commit for add_constraints() and constraints() and similar
+ methods with the recycle and minimize options. Similarly for
+ congruences. Testing of these improved.
+
+2007-10-15 Monday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.16): Added the `Box_Pointset' derived
+ class. Provide the constructors from boxes, bounded-difference
+ and octagonal shapes.
+
+2007-10-15 Monday 19:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Ask_Tell.defs.hh (1.18): Add class Ask_Tell to the C++
+ interface documentation.
+
+2007-10-15 Monday 19:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (1.40): Add class Direct_Product to
+ the C++ interface documentation. Use properly the math
+ environment delimiters in docs. Fix indentation.
+
+2007-10-15 Monday 19:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.15): Add class Any_Pointset to the
+ C++ interface documentation. Do properly group documented
+ methods.
+
+2007-10-15 Monday 15:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.51), directproduct1.cc (1.29),
+ directproduct2.cc (1.7), directproduct3.cc (1.1),
+ directproduct4.cc (1.1), directproduct5.cc (1.1),
+ directproduct6.cc (1.1): directproduct1.c split into 4 files
+ directproduct2.cc now named directproduct5.cc directproduct6.cc
+ is some additional tests..
+
+2007-10-15 Monday 15:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Direct_Product.defs.hh (1.39), Direct_Product.inlines.hh
+ (1.32): Added a short description of a direct product.
+
+ Modified the code for constraints(), congruences() so as to
+ return all the constraints or congruences in the components.
+ Similarly for minimized_constraints() and the recycled versions.
+
+2007-10-15 Monday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Term.defs.hh (polynomials.3): `Checked_Exponent_Type_Policy'
+ now sets `has_nan' to false.
+
+2007-10-15 Monday 12:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/congruence1.cc (1.18): Added tests for == and != for
+ congruences when they have not been normalised or strongly
+ normalised.
+
+2007-10-15 Monday 12:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence_System.defs.hh (1.25): Removed operator==(const
+ Congruence_System& x, const Congruence_System& y);
+
+2007-10-15 Monday 09:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Term.cc (polynomials.3): Reimplemented method
+ Term::shift_space_dimensions(const Variables_Set&) so as to use a
+ single loop instead of two.
+
+2007-10-15 Monday 09:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polynomial_Space.templates.hh (polynomials.3): Prefer
+ const_iterator to iterator when accessing a Variables_Set. When
+ creating a Variables_Set, prefer adding a variable index instead
+ of a proper Variable, if it is known that the index is less than
+ the maximum allowed space dimension.
+
+2007-10-15 Monday 09:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polynomial.cc (polynomials.3): Fixed a typo in a comment.
+
+2007-10-14 Sunday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Monomial.cc, Monomial.defs.hh, Monomial.inlines.hh,
+ Polynomial.cc, Polynomial.defs.hh, Polynomial.inlines.hh,
+ Polynomial_Cone.defs.hh, Polynomial_Constraint.defs.hh,
+ Polynomial_Space.cc, Polynomial_Space.defs.hh,
+ Polynomial_Space.templates.hh, Term.cc, Term.defs.hh,
+ Term.inlines.hh (polynomials.[2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+ Non-standard qualifications removed. Spurious semicolons
+ removed. Variable shadowing avoided.
+
+2007-10-14 Sunday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh (1.7): Non-standard qualification
+ removed.
+
+2007-10-14 Sunday 10:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, configure.ac, src/Makefile.am, src/Monomial.cc,
+ src/Monomial.defs.hh, src/Monomial.inlines.hh,
+ src/Monomial.types.hh, src/Polynomial.cc, src/Polynomial.defs.hh,
+ src/Polynomial.inlines.hh, src/Polynomial.types.hh,
+ src/Polynomial_Cone.cc, src/Polynomial_Cone.defs.hh,
+ src/Polynomial_Cone.inlines.hh, src/Polynomial_Cone.types.hh,
+ src/Polynomial_Constraint.cc, src/Polynomial_Constraint.defs.hh,
+ src/Polynomial_Constraint.inlines.hh,
+ src/Polynomial_Constraint.types.hh,
+ src/Polynomial_Constraint_System.cc,
+ src/Polynomial_Constraint_System.defs.hh,
+ src/Polynomial_Constraint_System.inlines.hh,
+ src/Polynomial_Constraint_System.types.hh,
+ src/Polynomial_Space.cc, src/Polynomial_Space.defs.hh,
+ src/Polynomial_Space.inlines.hh,
+ src/Polynomial_Space.templates.hh, src/Polynomial_Space.types.hh,
+ src/Term.cc, src/Term.defs.hh, src/Term.inlines.hh,
+ src/Term.types.hh, src/globals.types.hh, tests/Makefile.am
+ (polynomials.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Initial implementation of polynomial spaces (joint work with
+ Enric Rodriguez Carbonell and Enea Zaffanella).
+
+2007-10-13 Saturday 19:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Ask_Tell.cc (1.7), Pointset_Ask_Tell.defs.hh
+ (1.13), Pointset_Ask_Tell.templates.hh (1.11): A few FIXMEs have
+ been resolved by adding a private typedef.
+
+2007-10-13 Saturday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Pointset_Ask_Tell.cc (1.6), Pointset_Ask_Tell.templates.hh
+ (1.10): Compilation errors fixed, with FIXMEs added.
+
+2007-10-13 Saturday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (1.38): Non-standard qualification
+ removed.
+
+2007-10-13 Saturday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.103), Bit_Row.defs.hh (1.7),
+ Box.defs.hh (1.30), Congruence.defs.hh (1.22),
+ Congruence_System.defs.hh (1.24), Constraint.defs.hh (1.127),
+ Constraint_System.defs.hh (1.39), Generator_System.defs.hh
+ (1.26), Grid.defs.hh (1.54), Grid_Generator_System.defs.hh
+ (1.28), Linear_Expression.defs.hh (1.37), OR_Matrix.defs.hh
+ (1.12), Octagonal_Shape.defs.hh (1.32), Poly_Con_Relation.defs.hh
+ (1.35), Poly_Gen_Relation.defs.hh (1.33), Polyhedron.defs.hh
+ (1.322), Ptr_Iterator.defs.hh (1.11): Non-standard qualifications
+ removed.
+
+2007-10-13 Saturday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval_Info.inlines.hh (1.6): Avoid naming an unused
+ parameter.
+
+2007-10-13 Saturday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.55), src/Pointset_Ask_Tell.cc (1.5),
+ src/Pointset_Ask_Tell.defs.hh (1.12),
+ src/Pointset_Ask_Tell.inlines.hh (1.6), src/Pointset_Powerset.cc
+ (1.15), src/Pointset_Powerset.defs.hh (1.19),
+ src/Pointset_Powerset.inlines.hh (1.9),
+ src/checked_float.inlines.hh (1.82),
+ tests/Polyhedron/powerset1.cc (1.21): Due to compiler bugs, there
+ is no way to compile the PPL with GCC versions up to and
+ including 3.4.6: old kludges removed.
+
+2007-10-13 Saturday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.48): Work around a bug in version 10.0 of
+ the Intel C/C++ compiler.
+
+2007-10-13 Saturday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh (1.9): Compiler warning avoided.
+
+2007-10-11 Thursday 08:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.templates.hh (1.32): In the constructor of grids from
+ boxes, avoid meaningless implicit conversions in the calls to
+ constructors for Grid_Generator_System. Don't use function
+ `used' to suppress a compiler warning when it is enough to avoid
+ naming an unused parameter.
+
+2007-10-10 Wednesday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.inlines.hh (1.9): Coefficient_zero() and
+ Coefficient_one() temporarily restored to the old definition.
+
+2007-10-10 Wednesday 14:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.213): Added that a bug has been fixed for the grid
+ domain.
+
+2007-10-10 Wednesday 11:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh (1.53), Polyhedron.defs.hh (1.321): Comments
+ for constraints() and minimized_constraints() in Grid.defs.hh
+ improved; similar improvements for congruences in
+ Polyhedron.defs.hh.
+
+2007-10-09 Tuesday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.9), TODO (1.233), Watchdog/INSTALL (1.6): The `make
+ uninstall' command is now mentioned in the INSTALL file.
+
+2007-10-09 Tuesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.23): Example simplified.
+
+2007-10-09 Tuesday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.291): Provide the Intel C/C++ compiler with
+ adequate warning flags.
+
+2007-10-09 Tuesday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.290): The Intel C/C++ equivalent of GCC's
+ -frounding-math should be -fp-model strict -fp-speculation off.
+
+2007-10-09 Tuesday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.289): Detect the Intel C/C++ compiler.
+
+2007-10-09 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.212), interfaces/C/ppl_c.h.in (1.73): In the C interface
+ it is no longer an error to call ppl_initialize() or
+ ppl_finalize() multiple times (this matches the behavior of the
+ other interfaces).
+
+2007-10-09 Tuesday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble (1.12): Teach
+ emacs that this is a C++ file. Disable automatic initialization.
+ Use the new Parma_Polyhedra_Library::initialize() and
+ Parma_Polyhedra_Library::finalize() instead of something ad hoc.
+
+2007-10-09 Tuesday 15:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.13): Do not rely on automatic initialization of the PPL.
+
+2007-10-09 Tuesday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (1.11): No longer rely on
+ automatic initialization.
+
+2007-10-09 Tuesday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.211), src/initializer.hh (1.15): Users of the C++
+ interface of the library can now decide to disable the automatic
+ initialization mechanism of the PPL. To do so, the preprocessor
+ symbol PPL_NO_AUTOMATIC_INITIALIZATION should be defined before
+ including the `ppl.hh' header file. When automatic
+ initialization is disabled it is imperative to explicitly call
+ the new function
+
+ void Parma_Polyhedra_Library::initialize()
+
+ before using the library. The new function
+
+ void Parma_Polyhedra_Library::finalize() and
+
+ should also be called (to release a small amount of memory) when
+ done with the library.
+
+2007-10-08 Monday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.147), Box.inlines.hh (1.21),
+ Octagonal_Shape.inlines.hh (1.20): Use DIRTY_TEMP instead of
+ static variables.
+
+2007-10-08 Monday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.12): Use DIRTY_TEMP0 for temporaries.
+
+2007-10-08 Monday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Coefficient.cc (1.8), Coefficient.defs.hh (1.10),
+ Coefficient.inlines.hh (1.8), Congruence.cc (1.18),
+ Congruence.defs.hh (1.21), Congruence.inlines.hh (1.18),
+ Congruence_System.cc (1.26), Congruence_System.defs.hh (1.23),
+ Congruence_System.inlines.hh (1.10), Constraint.cc (1.69),
+ Constraint.defs.hh (1.126), Constraint.inlines.hh (1.68),
+ Constraint_System.cc (1.27), Constraint_System.defs.hh (1.38),
+ Constraint_System.inlines.hh (1.11), Generator.cc (1.76),
+ Generator.defs.hh (1.124), Generator.inlines.hh (1.62),
+ Generator_System.cc (1.24), Generator_System.defs.hh (1.25),
+ Generator_System.inlines.hh (1.10), Grid_Generator.cc (1.22),
+ Grid_Generator.defs.hh (1.32), Grid_Generator.inlines.hh (1.15),
+ Grid_Generator_System.cc (1.20), Grid_Generator_System.defs.hh
+ (1.27), Grid_Generator_System.inlines.hh (1.16), Init.cc (1.32),
+ Linear_Expression.cc (1.19), Linear_Expression.defs.hh (1.36),
+ Linear_Expression.inlines.hh (1.12): First go at getting rid of
+ all non-POD static variables.
+
+2007-10-08 Monday 15:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Temp.inlines.hh (1.3): Allow the use of DIRTY_TEMP and
+ DIRTY_TEMP0 also outside the Parma_Polyhedra_Library namespace.
+
+2007-10-08 Monday 14:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/congruences1.cc (1.10): Added some tests for
+ congruences() and minimized_congruences(). test06 shows that
+ implied equalities (eg A + B >= 3, A + B <= 3) are ignored (at
+ the moment) for congruences().
+
+2007-10-08 Monday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.84): Use DIRTY_TEMP0 instead of a static
+ variable.
+
+2007-10-08 Monday 14:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.26): When building a
+ Constraint_System from a Congruence_System, do properly set the
+ topology and the space dimension; adding the positivity
+ constraint is not needed.
+
+2007-10-08 Monday 14:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.cc (1.68): When building a constraint from a
+ congruence, do not require a non-zero space dimension; also,
+ avoid building a NOT_NECESSARILY_CLOSED constraint.
+
+2007-10-08 Monday 13:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.cc (1.17), Congruence.inlines.hh (1.17): An
+ assertion made stronger and a new one added.
+
+2007-10-08 Monday 13:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.52): Simplified the
+ handling of error messages and ppl finalization, removing a few
+ dead code and useless cuts.
+
+2007-10-08 Monday 11:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Constraint_System.cc (1.25), Grid.inlines.hh (1.17): Undone
+ change to Grid.inlines.hh in last commit and made a corresponding
+ change to the Constraint_System() code.
+
+2007-10-08 Monday 11:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (1.16): Fixed the bug shown in test03 and
+ test10 in constraints1.cc
+
+2007-10-08 Monday 11:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.50), constraints1.cc (1.1):
+ constraints1.cc has tests for constraints() and
+ minimized_constraints(). test03 and tests10 show a bug - cause
+ an assertion to fail - when getting the constraints from an empty
+ grid with 0 space dimensions.
+
+2007-10-08 Monday 11:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.51): Removed a spurious
+ occurrence of ppl_finalize/0 in time_out/1, which was causing a
+ bug.
+
+2007-10-07 Sunday 18:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.38): Added an explanation of how to use the
+ test-coverage facilities provided by GCC.
+
+2007-10-07 Sunday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: pl_clpq.cc (1.13), ppl_pl.cc (1.13): With
+ versions of SWI-Prolog after 5.6.43, ask SWI-Prolog not to fiddle
+ with GMP allocation functions.
+
+2007-10-07 Sunday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.11): No longer use global variables of kind mpz_class, since
+ that does not allow to precisely control construction and
+ destruction time. This triggers a bug in pl_check.pl: apparently
+ it tries to use the PPL interface after having called
+ ppl_finalize/0 without an intervening invocation of
+ ppl_initialize/0.
+
+2007-10-07 Sunday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/exceptions1.cc (1.4): Comment improved.
+
+2007-10-07 Sunday 10:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.30): Comments and
+ formatting improved.
+
+2007-10-07 Sunday 09:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.232): Item dealt with and removed.
+
+2007-10-06 Saturday 22:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.231): Removed item - Revise the documentation for all the
+ congruences() and minimized_congruences() methods.
+
+2007-10-06 Saturday 22:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Direct_Product.defs.hh (1.37), Grid.defs.hh (1.52),
+ Polyhedron.defs.hh (1.320): Revised comments for some
+ congruences() and minimized_congruences() methods and also
+ similarly for some constraints() and minimized_constraints()
+ methods. A couple of other typos fixed in comments in
+ Grid.defs.hh
+
+2007-10-06 Saturday 21:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.22), TODO (1.230): Mentioned that the
+ mechanisms to specify additional compilation flags may be used to
+ request extra optimizations. Corresponding to-do item removed.
+
+2007-10-06 Saturday 15:03 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.81): Replaced volatile with
+ avoid_cse.
+
+2007-10-06 Saturday 12:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.21): Revised the example with the Intel C/C++
+ compiler. Other minor improvements.
+
+2007-10-06 Saturday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (1.7): Unwanted change undone.
+
+2007-10-06 Saturday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ciao_cfli.hh (1.4), GNU/gprolog_cfli.hh
+ (1.4), SICStus/sicstus_cfli.ic (1.18), SWI/swi_cfli.hh (1.6),
+ XSB/xsb_cfli.hh (1.4), YAP/yap_cfli.hh (1.4): Comments improved.
+
+2007-10-05 Friday 18:43 Abramo Bagnara
+
+ * src/Interval_Restriction.defs.hh (1.10): Avoid naming unused
+ parameter.
+
+2007-10-05 Friday 18:35 Abramo Bagnara
+
+ * src/Grid_simplify.cc (1.36): Fixed gcdext_assign call.
+
+2007-10-05 Friday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.29): Work around bug of the Intel compiler.
+
+2007-10-05 Friday 14:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval_Restriction.defs.hh (1.9), checked_int.inlines.hh
+ (1.64), checked_mpz.inlines.hh (1.50): Avoid naming unused
+ parameters. Avoid long source lines.
+
+2007-10-05 Friday 12:24 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.95), Checked_Number.inlines.hh
+ (1.77), GMP_Integer.defs.hh (1.27), GMP_Integer.inlines.hh
+ (1.22), checked.defs.hh (1.43), checked.inlines.hh (1.40),
+ checked_ext.defs.hh (1.14), checked_ext.inlines.hh (1.40),
+ checked_mpz.inlines.hh (1.49): Fixed prototype for gcdext.
+
+2007-10-04 Thursday 21:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.229): Reorganized: some things will definitely not be
+ ready for PPL 0.10.
+
+2007-10-04 Thursday 12:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.288): Version number bumped.
+
+2007-10-04 Thursday 08:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_sicstus_prolog.m4 (1.7): Comment fixed.
+
+2007-10-03 Wednesday 19:16 Andrea Cimino
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.9),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.29), jni/ppl_java_globals.cc (1.8),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.18):
+ Implemented `total_memory_in_bytes' for the PPL objects. At the
+ moment the method returns only the memory used by the C++
+ objects.
+
+2007-10-02 Tuesday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.9): test01 always fails with
+ 8-bit coefficients, provided the timeout is long enough.
+
+2007-10-02 Tuesday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.8): Timeout increased to 2
+ seconds.
+
+2007-10-01 Monday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.22): Option `--licence' fixed: the PPL is
+ now released under GPL version 3.
+
+2007-09-30 Sunday 23:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.7): Timeout increased to 1
+ second.
+
+2007-09-30 Sunday 11:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.210), configure.ac (1.287),
+ interfaces/Prolog/Ciao/Makefile.am (1.66),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.51),
+ interfaces/Prolog/GNU/Makefile.am (1.66),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.44),
+ interfaces/Prolog/SICStus/Makefile.am (1.78),
+ interfaces/Prolog/SWI/Makefile.am (1.75),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.10), interfaces/Prolog/XSB/Makefile.am (1.55),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.9),
+ interfaces/Prolog/YAP/Makefile.am (1.55): Fixed bugs that
+ prevented building the library on systems not supported by the
+ Parma Watchdog Library or when the `--disable-watchdog' configure
+ was used. There is still a pending issue concerning the XSB
+ Prolog interface.
+
+2007-09-29 Saturday 19:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.6): test01 does not fail
+ unless assertions are enabled.
+
+2007-09-29 Saturday 13:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.3): The value of the `License' tag is now
+ `GPLv3+'.
+ `ppl-swiprolog' dependency on `readline-devel' removed (again).
+
+2007-09-29 Saturday 13:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (simplex.1): file ppl.spec was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-27 Thursday 08:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.43): List file
+ do_not_output_location in MOSTLYCLEANFILES.
+
+2007-09-26 Wednesday 21:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.42), expected_mpz (1.14),
+ expected_mpz_a (1.13): Do not output the optimum location for
+ tests adlittle, boeing1, boeing2 and rout, since these may vary
+ (without affecting the optimum value itself) depending on the
+ computing platform. Expected results for mpz (with and without
+ assertions) updated accordingly.
+
+2007-09-26 Wednesday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.10): There is no need to include "pwl.hh" here.
+
+2007-09-26 Wednesday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (1.10): Support for
+ systems where the Parma Watchdog Library is not available: on
+ these systems, both ppl_set_timeout/1 and ppl_reset_timeout/0
+ fail.
+
+2007-09-26 Wednesday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.286): The preprocessor symbol
+ WATCHDOG_LIBRARY_ENABLED is defined if and only if the Parma
+ Watchdog Library is enabled.
+
+2007-09-26 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.77): Initial support for
+ systems where the Parma Watchdog Library is not available.
+
+2007-09-26 Wednesday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc (1.11): Cater for systems with no clocks.
+
+2007-09-26 Wednesday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.285): Added checks for the `timeval' type and for
+ the `getrusage' function.
+
+2007-09-26 Wednesday 13:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.75): If the problem is
+ optimizable, then the output of the problem state is subsumed by
+ the output of the optimum value; hence, do output the problem
+ state only if verbosity == 1.
+
+2007-09-26 Wednesday 13:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.74): A couple of minor corrections
+ in the usage string. Option --version replaced by option
+ --verbosity=LEVEL, taking as argument an integer between 0 and 4
+ (default 3). The verbosity level is systematically checked before
+ producing output (except for error messages).
+
+2007-09-26 Wednesday 13:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.41): Cleanup should not depend on
+ configuration.
+
+2007-09-25 Tuesday 19:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/: Makefile.am (1.9), bug1.cc (1.2), bug2.cc
+ (1.2), mipproblem2.cc (1.5): Tests bug1.cc and bug2.cc were not
+ showing real bugs. Test test01 in miproblem2.cc may also fail
+ with 8bit integer coefficient and assertions disabled.
+
+2007-09-24 Monday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.54): The special expected_*
+ files for XSB has been removed, so they are no longer
+ distributed. Also cut away the corresponding FIXME comment.
+
+2007-09-23 Sunday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_clpq2_int16 (1.4),
+ XSB/expected_clpq2_int16_a (1.4), XSB/expected_clpq2_int32 (1.4),
+ XSB/expected_clpq2_int32_a (1.6), XSB/expected_clpq2_int64 (1.4),
+ XSB/expected_clpq2_int64_a (1.4), XSB/expected_clpq2_int8 (1.5),
+ XSB/expected_clpq2_int8_a (1.6), XSB/expected_clpq2_mpz (1.4),
+ XSB/expected_clpq2_mpz_a (1.4), XSB/expected_clpq_int16 (1.6),
+ XSB/expected_clpq_int16_a (1.6), XSB/expected_clpq_int32 (1.4),
+ XSB/expected_clpq_int32_a (1.4), XSB/expected_clpq_int64 (1.4),
+ XSB/expected_clpq_int64_a (1.4), XSB/expected_clpq_int8 (1.4),
+ XSB/expected_clpq_int8_a (1.4), XSB/expected_clpq_mpz (1.4),
+ XSB/expected_clpq_mpz_a (1.4), XSB/expected_pchk_int16 (1.5),
+ XSB/expected_pchk_int16_a (1.5), XSB/expected_pchk_int32 (1.5),
+ XSB/expected_pchk_int32_a (1.5), XSB/expected_pchk_int64 (1.2),
+ XSB/expected_pchk_int64_a (1.4), XSB/expected_pchk_int8 (1.5),
+ XSB/expected_pchk_int8_a (1.6), XSB/expected_pchk_mpz (1.2),
+ XSB/expected_pchk_mpz_a (1.2), tests/clpq2.pl (1.12): Applied the
+ workaround suggested by Paul Broome to the XSB bug described in
+ http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html.
+ The special expect-files for XSB are no longer needed.
+
+2007-09-23 Sunday 14:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (1.6): The typedef defined in
+ this file are now added to the documentation group related to
+ version checking. (As a side effect, by no longer using \file, we
+ also avoid a couple of dangling references in the produced docs.)
+
+2007-09-22 Saturday 19:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.53): Apparently, XSB now
+ implements more of the ISO standard. This could make the
+ XSB-specific expect-file useless: they are now still present but
+ disabled.
+
+2007-09-22 Saturday 09:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.4): Use DO_TEST_F8A to invoke
+ test01().
+
+2007-09-20 Thursday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (1.3): Expected results for
+ test10() fixed.
+
+2007-09-20 Thursday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem3.cc (1.2): Wrap big integer
+ constants within Coefficient("...").
+
+2007-09-20 Thursday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/Makefile.am (1.10): File ex11.mps has
+ gone.
+
+2007-09-19 Wednesday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.40),
+ demos/ppl_lpsol/examples/ex11.mps (1.4),
+ tests/MIP_Problem/Makefile.am (1.8),
+ tests/MIP_Problem/mipproblem1.cc (1.11),
+ tests/MIP_Problem/mipproblem3.cc (1.1): Test program
+ mipproblem3.cc forked off mipproblem1.cc. Example MIP problem
+ ex11.mps removed and used to write test10() of mipproblem3.cc.
+
+2007-09-19 Wednesday 10:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.50): XSB does not throw
+ catchable exceptions for integers out of range; so call to
+ exception_sys_prolog is not made when testing XSB.
+
+2007-09-18 Tuesday 15:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (1.9): Exploit assign_or_swap in the
+ implementation of grow. Avoid useless copies/swaps (via grow) in
+ the implementation of resize_no_copy.
+
+2007-09-18 Tuesday 15:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (1.11): Corrected detailed documentation
+ for resize_no_copy: it was promising to preserve the old contents
+ of the matrix.
+
+2007-09-18 Tuesday 15:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.86), Octagonal_Shape.templates.hh
+ (1.60): Exploit assign_or_swap in the implementation of
+ remove_space_dimensions and map_space_dimensions.
+
+2007-09-18 Tuesday 15:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/DB_Matrix.templates.hh (1.7): Added a couple of FIXME's for
+ places where (sometimes) we could replace expensive copies with
+ cheaper swaps.
+
+2007-09-18 Tuesday 09:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.59): Removed a few useless
+ initializations. Prefer neg_assign(x, y) to x = -y; prefer
+ neg_assign(x) to beg_assign(x, x). Move allocation of
+ temporaries out of loop bodies; reduce the number of temporaries
+ when the change does not affect code readability.
+
+2007-09-18 Tuesday 08:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.85): Added a comment in a few places
+ where we use a temporary named `coeff_i' to actually store the
+ negation of coeff_i (so as to avoid an allocation).
+
+2007-09-17 Monday 11:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.84): For readability, prefer
+ neg_assign(x) to neg_assign(x, x).
+
+2007-09-17 Monday 10:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am (1.7): Typo corrected.
+
+2007-09-16 Sunday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/: Makefile.am (1.6), bug1.cc (1.1), bug2.cc
+ (1.1): Two programs exhibiting strange behavior on some systems.
+
+2007-09-16 Sunday 18:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: randphull1.cc (1.13), smm1.cc (1.10): Minor
+ stylistic changes.
+
+2007-09-15 Saturday 19:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/:
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.28), Java/jni/ppl_java_common.cc (1.35),
+ Java/jni/ppl_java_common.hh (1.29), Java/jni/ppl_java_globals.cc
+ (1.7), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.14),
+ OCaml/ppl_ocaml_globals.cc (1.11),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.48),
+ Prolog/ppl_prolog_common.icc (1.9): Prefer TEMP_INTEGER to
+ Coefficient when allocating temporary coefficients.
+
+2007-09-15 Saturday 18:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (1.12): Made clean up independent from
+ configuration.
+
+2007-09-15 Saturday 16:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (1.15): Definition of temporary
+ coefficients moved out of loop.
+
+2007-09-15 Saturday 16:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.63): Indentation fixed. Definition of
+ temporaries factored out of loop.
+
+2007-09-15 Saturday 15:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.83): Temporary definition factored
+ out of a loop body.
+
+2007-09-15 Saturday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.82): Try to improve the management
+ of temporary coefficients: - prefer neg_assign(x, x) to x = -x;
+ - avoid useless temporaries; - factor out common temporary
+ definitions; in particular, speculatively move temporary
+ definitions out of loop bodies.
+
+2007-09-15 Saturday 15:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Ask_Tell.inlines.hh (1.17), Octagonal_Shape.templates.hh
+ (1.58): Added a couple of missing spaces.
+
+2007-09-15 Saturday 15:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.62): Added a missing space.
+
+2007-09-15 Saturday 13:38 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.61): FIXME dealt with. A feasible point is
+ returned correctly if the status of the problem is
+ `UNBOUNDED_MIP_PROBLEM'. When the status `UNBOUNDED_MIP_PROBLEM'
+ is detected in `solve_mip', a feasible point is set.
+
+2007-09-15 Saturday 13:19 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.60): Comment fixed.
+
+2007-09-14 Friday 22:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.111): Test randphull2 is no
+ longer built.
+
+2007-09-14 Friday 22:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Ask_Tell/Makefile.am (1.4), Grid/Makefile.am (1.49),
+ MIP_Problem/Makefile.am (1.5): Removed old style handling of
+ tests that are known to fail on some configurations.
+
+2007-09-14 Friday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.54): FIXME resolved.
+
+2007-09-14 Friday 18:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.110), randphull1.cc (1.12),
+ randphull2.cc (1.11), smm1.cc (1.9): Tests randphull[12] and smm1
+ now conforms to the STANDARDS for test programs; randphull2
+ merged into randphull1; the old machinery in Makefile.am for
+ tests failing with bounded coefficients is no longer needed.
+
+2007-09-14 Friday 16:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.65), GNU/Makefile.am
+ (1.65), SICStus/Makefile.am (1.76), SWI/Makefile.am (1.74),
+ XSB/Makefile.am (1.52), YAP/Makefile.am (1.54): Cleanup made
+ independent from the configuration chosen by the user.
+
+2007-09-14 Friday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/Makefile.am (1.16): Build source file
+ ppl_predicate_check.pl is only required when the user asks for
+ some Prolog interface.
+
+2007-09-14 Friday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.42): Built source file
+ ppl_prolog.icc is only required when the user asks for some
+ Prolog interface.
+
+2007-09-14 Friday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: Java/Makefile.am (1.13), Java/tests/Makefile.am
+ (1.16), OCaml/Makefile.am (1.33): Distribution and cleanup made
+ independent from the configuration chosen by the user.
+
+2007-09-14 Friday 15:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.36): Cleanup should be independent
+ from the configuration chosen by the user.
+
+2007-09-14 Friday 15:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.44), bug1.cc (1.2), bug2.cc (1.2): The
+ bug exhibited by bug1.cc and bug2.cc has been fixed.
+
+2007-09-14 Friday 10:10 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.80): Fixed float rounding on
+ inexact conversion.
+
+2007-09-14 Friday 09:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.43): Restore refine[12].cc.
+
+2007-09-14 Friday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.10): Wrap big integer
+ constants within Coefficient("...").
+
+2007-09-14 Friday 08:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.9): test18 fails with all
+ bounded integer coefficient types; test19 fails if less than 64
+ bit coefficients are used.
+
+2007-09-13 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.42): Temporarily disable also
+ refine2.cc.
+
+2007-09-13 Thursday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.8): Added test18() and
+ test19().
+
+2007-09-13 Thursday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.7): Always test the return
+ value of MIP_Problem::solve(). Added test17().
+
+2007-09-13 Thursday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (1.6): Added test15() and
+ test16().
+
+2007-09-13 Thursday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.47), Interval.templates.hh (1.1),
+ Makefile.am (1.173): Interval.templates.hh should contain the
+ non-inline template functions of the Interval class
+ implementation.
+
+2007-09-13 Thursday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.41): Do not test with bug*.cc.
+
+2007-09-13 Thursday 19:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.209), debian/libppl-pwl.copyright.in (1.5),
+ debian/libppl.copyright.in (1.5), doc/definitions.dox (1.204),
+ doc/devref-c-interface.tex (1.2), doc/devref.tex (1.23),
+ doc/gpl.dox (1.8), doc/gpl.tex (1.4), doc/gpl.txt (1.4),
+ doc/user-c-interface.tex (1.2), doc/user-prolog-interface.tex
+ (1.2), doc/user.tex (1.24), m4/ac_cxx_proper_long_double.m4
+ (1.2): The Parma Polyhedra Library is now released under the
+ terms of the version 3 (or later) of the GNU General Public
+ License.
+
+2007-09-13 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: NEWS (1.10), doc/devref.tex (1.3), doc/gpl.dox (1.2),
+ doc/gpl.tex (1.2), doc/gpl.txt (1.2), doc/user.tex (1.3): The
+ Parma Watchdog Library is now released under the terms of the
+ version 3 (or later) of the GNU General Public License.
+
+2007-09-13 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.dox (simplex.1): file gpl.dox was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.tex (simplex.1): file gpl.tex was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.txt (simplex.1): file gpl.txt was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.59): Comment fixed.
+
+2007-09-13 Thursday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/.cvsignore (1.1): Put under CVS control.
+
+2007-09-13 Thursday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/.cvsignore (simplex.1): file .cvsignore was added on
+ branch simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-13 Thursday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.40): Temporarily disable the tests that
+ are known to fail.
+
+2007-09-13 Thursday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz (1.13), src/MIP_Problem.cc (1.58):
+ FIXME resolved. This also makes the PPL independent from the bug
+ of mpq_get_d() in GMP 4.1.4.
+
+2007-09-13 Thursday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_chdims.cc (1.20): Definition of unused macro removed.
+
+2007-09-13 Thursday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid_chdims.cc (1.19), Grid_conversion.cc (1.22),
+ Grid_simplify.cc (1.35): Pointless inline directives removed.
+
+2007-09-13 Thursday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.51), Grid_nonpublic.cc (1.27): The second
+ argument of Grid::max_min() was erroneously `char *': it is
+ `const char*' now.
+
+2007-09-13 Thursday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.57): Simplified the implementation of the
+ steepest-edge heuristics.
+
+2007-09-13 Thursday 15:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.228): The handling of temporary coefficients has been
+ redone and the C and Prolog cover all the supported domains.
+
+2007-09-12 Wednesday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.39), bug2.cc (1.1): A simplified
+ version of bug1.cc.
+
+2007-09-12 Wednesday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.38), bug1.cc (1.1): Test program
+ exhibiting a bug somewhere.
+
+2007-09-12 Wednesday 09:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.284), Watchdog/configure.ac (1.42): Do not allow
+ AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+
+2007-09-12 Wednesday 00:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.81), MIP_Problem.cc (1.56),
+ Octagonal_Shape.templates.hh (1.57): Several temporary
+ Coefficient variables are now allocated via TEMP_INTEGER.
+
+2007-09-11 Tuesday 23:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.cc (1.31): Typo fixed.
+
+2007-09-11 Tuesday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.80), Box.inlines.hh (1.20),
+ Box.templates.hh (1.63), Interval_Restriction.defs.hh (1.8),
+ MIP_Problem.cc (1.55), Octagonal_Shape.templates.hh (1.56),
+ Polyhedron_nonpublic.cc (1.80), Polyhedron_public.cc (1.95),
+ checked.inlines.hh (1.39), checked_int.inlines.hh (1.63),
+ checked_mpz.inlines.hh (1.48), globals.cc (1.30),
+ globals.inlines.hh (1.19): For temporaries of type mpz_class or
+ mpq_class, use DIRTY_TEMP0 instead of local variables.
+
+2007-09-11 Tuesday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.79), Octagonal_Shape.templates.hh
+ (1.55): Useless initializations removed. For temporaries, use
+ DIRTY_TEMP instead of local variables. Code formatting fixes.
+
+2007-09-11 Tuesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Octagonal_Shape.inlines.hh (1.19),
+ Octagonal_Shape.templates.hh (1.54): For temporaries, use
+ DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid_Generator_System.defs.hh (1.26),
+ Grid_Generator_System.inlines.hh (1.15): Method
+ is_equal_to(Grid_Generator_System) replaced by is_equal_to(const
+ Grid_Generator_System&).
+
+2007-09-11 Tuesday 19:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.14), BD_Shape.defs.hh (1.102),
+ Box.defs.hh (1.28), Checked_Number.defs.hh (1.94),
+ Congruence_System.defs.hh (1.22), DB_Matrix.defs.hh (1.29),
+ Direct_Product.defs.hh (1.36), Grid.defs.hh (1.50),
+ Grid_Generator_System.defs.hh (1.25), MIP_Problem.defs.hh (1.36),
+ OR_Matrix.defs.hh (1.10), Octagonal_Shape.defs.hh (1.31),
+ Polyhedron.defs.hh (1.319): Useless const qualifications removed.
+
+2007-09-11 Tuesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.30), Octagonal_Shape.inlines.hh
+ (1.18): Method add_octagonal_constraint(dimension_type,
+ dimension_type j, N) replaced by
+ add_octagonal_constraint(dimension_type, dimension_type j, const
+ N&).
+
+2007-09-11 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.101), BD_Shape.inlines.hh (1.146):
+ Method add_dbm_constraint(dimension_type, dimension_type, N)
+ replaced by add_dbm_constraint(dimension_type, dimension_type,
+ const N&).
+
+2007-09-11 Tuesday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.145), BD_Shape.templates.hh (1.78):
+ For temporaries, use DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh (1.50): Comment revised and turned into a
+ Doxygen comment.
+
+2007-09-11 Tuesday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Temp.defs.hh (1.7), Temp.inlines.hh (1.2),
+ Temp.templates.hh (1.2): Comments added.
+
+2007-09-11 Tuesday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.172): New files added to INCLUDE_FILES.
+
+2007-09-11 Tuesday 13:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.cc (1.29), globals.defs.hh (1.49): Switch to the
+ new technology for the handling of temporaries.
+
+2007-09-11 Tuesday 13:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Temp.defs.hh (1.6), Temp.inlines.hh (1.1),
+ Temp.templates.hh (1.1): Started the reorganization of the Temp_*
+ classes.
+
+2007-09-11 Tuesday 11:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.93): Include Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked_mpq.inlines.hh (1.43), checked_mpz.inlines.hh
+ (1.47): Leave the definition of Slow_Copy for the basic types to
+ Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.46), Interval_Restriction.defs.hh
+ (1.7): Include the new files.
+
+2007-09-11 Tuesday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/assign_or_swap.hh (1.1): The assign_or_swap() utility
+ functions.
+
+2007-09-11 Tuesday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Has_Assign_Or_Swap.hh (1.2): Spurious code removed.
+
+2007-09-11 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Has_Assign_Or_Swap.hh (1.1): Has_Assign_Or_Swap classes
+ declarations.
+
+2007-09-11 Tuesday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Slow_Copy.hh (1.2): Multiple-inclusion guards renamed.
+
+2007-09-11 Tuesday 10:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Slow_Copy.hh (1.1): Basic Slow_Copy classes declarations.
+
+2007-09-10 Monday 21:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.73): Use va_start() and va_end()
+ properly around calls to vfprintf().
+
+2007-09-10 Monday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.283): With GCC, use -frounding-math to disable
+ transformations and optimizations that assume default floating
+ point rounding behavior.
+
+2007-09-10 Monday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.41): Added a comment about the
+ positioning of AC_PROG_CC and AC_PROG_CXX.
+
+2007-09-10 Monday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.282): Useless quotes removed.
+
+2007-09-10 Monday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.281), Watchdog/configure.ac (1.40): Pass the
+ no-define option to AM_INIT_AUTOMAKE.
+
+2007-09-10 Monday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.7), config.guess (1.39), config.sub (1.37), depcomp
+ (1.12), install-sh (1.18), Watchdog/compile (1.7),
+ Watchdog/config.guess (1.23), Watchdog/config.sub (1.22):
+ Updated.
+
+2007-09-10 Monday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.280), Watchdog/configure.ac (1.39): Corrections
+ to the handling of compilation flags.
+
+2007-09-06 Thursday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz_a (1.12): Updated to reflect changes
+ in the ordering of the input (caused by upgrade of glpk).
+
+2007-09-06 Thursday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz (1.12): Updated: sometimes the
+ location of the optimum changes (the optimum staying teh same)
+ due to the upgrade of glpk, which is used by ppl_lpsol to read in
+ the lp problems and sometimes reorders the input wrt previous
+ versions.
+
+2007-09-02 Sunday 17:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.35): Header files ppl_c.h and
+ ppl_c_version.h should be installed, but they should not be
+ distributed (since they are generated on-demand): list them in
+ variable nodist_include_HEADERS, instead of include_HEADERS.
+
+2007-09-01 Saturday 16:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence_System.defs.hh (1.21),
+ Grid_Generator_System.defs.hh (1.24), Matrix.defs.hh (1.83): In
+ the Doxygen documentation, don't use \atop and \choose, which
+ cause problems. Use \genfrac instead.
+
+2007-09-01 Saturday 13:06 Andrea Cimino
+
+ * configure.ac (1.279): The Java interface was unconditionally
+ built even if not requested by the user with the
+ `--enable-interface' option: fixed.
+
+2007-09-01 Saturday 10:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.73): When compiling
+ pl_clpq*, fixed paths for finding pl_clpq*.pl. (temporary patch;
+ provide the right path option to the compilation command).
+
+2007-08-31 Friday 16:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.160): Using new doxygen
+ alias \extref for references to the main manual.
+
+2007-08-31 Friday 16:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-prolog-interface.doxyconf-html.in (1.4),
+ devref-prolog-interface.doxyconf-latex.in (1.4),
+ user-prolog-interface.doxyconf-html.in (1.5),
+ user-prolog-interface.doxyconf-latex.in (1.5): Added command
+ alias \extref.
+
+2007-08-31 Friday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-html.in (simplex.1): file
+ devref-prolog-interface.doxyconf-html.in was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-latex.in (simplex.1): file
+ devref-prolog-interface.doxyconf-latex.in was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-html.in (simplex.1): file
+ user-prolog-interface.doxyconf-html.in was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-latex.in (simplex.1): file
+ user-prolog-interface.doxyconf-latex.in was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.227): Spurious characters removed.
+
+2007-08-31 Friday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * fedora/ppl.spec (1.2): New packages `ppl-ocaml' and
+ `ppl-ocaml-devel' contain the OCaml interface.
+
+2007-08-31 Friday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.278), demos/ppl_lpsol/ppl_lpsol.c (1.72): Should
+ support all versions of GLPK now. Diagnostics of ppl_lpsol
+ improved.
+
+2007-08-31 Friday 12:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.55): Remove spurious line continuation
+ character that was preventing distribution of the core PS
+ manuals.
+
+2007-08-31 Friday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/README.ocaml (simplex.1): file README.ocaml was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2007-08-31 Friday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.226), interfaces/OCaml/README.ocaml (1.1): New file
+ README.ocaml, still to be written properly.
+
+2007-08-31 Friday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.72): Dependencies fixed.
+
+2007-08-31 Friday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.277), demos/ppl_lpsol/ppl_lpsol.c (1.71): Support
+ GLPK versions up to 4.15, both installed from a source package or
+ from Fedora RPM packages.
+
+2007-08-31 Friday 08:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.27): Directory interfaces has to be
+ processed before its subdirs.
+
+2007-08-30 Thursday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.42), configure.ac (1.276), ppl.spec.in (1.31),
+ fedora/Makefile.am (1.1), fedora/ppl.spec (1.1): New placement
+ for the Fedora PPL spec file. It did not make much sense to have
+ the PPL version number be filled in automatically.
+
+2007-08-30 Thursday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.54): Install (and uninstall) also the TODO
+ file.
+
+2007-08-30 Thursday 18:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.51): Always use the -fPIC
+ option when compiling the C/C++ foreign modules.
+
+2007-08-30 Thursday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.53): Distribute README.yap.
+
+2007-08-30 Thursday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.71): Distribute
+ README.swiprolog.
+
+2007-08-30 Thursday 18:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.64): Distribute
+ README.gprolog.
+
+2007-08-30 Thursday 18:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/README (1.3): Obsolete file removed.
+
+2007-08-30 Thursday 15:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.2): Made consistent with respect
+ to the currently generated C interface. Using new Doxygen alias
+ \extref when referring to the main manual.
+
+2007-08-30 Thursday 15:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.5),
+ devref-c-interface.doxyconf-latex.in (1.5),
+ devref-c-interface.tex (1.1), user-c-interface.doxyconf-html.in
+ (1.6), user-c-interface.doxyconf-latex.in (1.6): Added main title
+ page for the LaTeX version of the C interface devref. Added
+ Doxygen alias \extref for references to external documentation:
+ it behaves as \ref for the HTML documentation (exploiting TAG
+ files), it simply prints the second argument for the LaTeX
+ documentation (since these seems not to be able to exploit TAG
+ files). By using \extref we should be able to avoid dozens of
+ annoying Doxygen warnings when producing the manuals for foreign
+ language interfaces.
+
+2007-08-30 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-html.in (simplex.1): file
+ devref-c-interface.doxyconf-html.in was added on branch simplex
+ on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-latex.in (simplex.1): file
+ devref-c-interface.doxyconf-latex.in was added on branch simplex
+ on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-html.in (simplex.1): file
+ user-c-interface.doxyconf-html.in was added on branch simplex on
+ 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-latex.in (simplex.1): file
+ user-c-interface.doxyconf-latex.in was added on branch simplex on
+ 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 12:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user-prolog-interface.doxyconf-html.in (1.4),
+ user-prolog-interface.doxyconf-latex.in (1.4): Updated to Doxygen
+ 1.5.3. Use user-prolog-interface.tex for the LaTeX version.
+
+2007-08-30 Thursday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/user-prolog-interface.tex (1.1): Put under CVS control.
+
+2007-08-30 Thursday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.4),
+ devref-c-interface.doxyconf-latex.in (1.4),
+ user-c-interface.doxyconf-html.in (1.5),
+ user-c-interface.doxyconf-latex.in (1.5): Added C_interface.dox
+ to the documentation INPUT files.
+
+2007-08-30 Thursday 11:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.53): C interface docs depends on
+ interfaces/C/C_interface.dox.
+
+2007-08-30 Thursday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/C_interface.dox (1.1): Recovered documentation for
+ the C interface types and functions related to convex polyhedra.
+ This file will not be compiled (since the functions will be
+ automatically generated), it just serve as a template
+ documentation for all kind of domains. To be checked for
+ completeness wrt the actually generated code.
+
+2007-08-28 Tuesday 15:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: Makefile.am (1.28), ppl_c.m4 (1.1): Initial implementation
+ of the new function AM_PATH_PPL_C to to test for the existence
+ and usability of particular versions of the C interface of the
+ PPL, defining macros containing the required paths.
+
+2007-08-28 Tuesday 15:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl.m4 (1.8): Several bugs fixed.
+
+2007-08-28 Tuesday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.275): Version number bumped.
+
+2007-08-27 Monday 20:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl.m4 (1.7): Trailing whitespace removed.
+
+2007-08-27 Monday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.34): Install also ppl_c.h.
+
+2007-08-27 Monday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/: user.doxyconf-html.in (1.2),
+ user.doxyconf-latex.in (1.2): Updated to Doxygen 1.5.3-20070815.
+
+2007-08-27 Monday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.doxyconf-html.in (simplex.1): file
+ user.doxyconf-html.in was added on branch simplex on 2008-01-07
+ 11:15:25 +0000
+
+2007-08-27 Monday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.doxyconf-latex.in (simplex.1): file
+ user.doxyconf-latex.in was added on branch simplex on 2008-01-07
+ 11:15:25 +0000
+
+2007-08-26 Sunday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.225): Noted that it would be nice to have an
+ implementation of Minkowski addition.
+
+2007-08-26 Sunday 17:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.224): Added a note about the work of Kent Andersen and
+ Gerard Cornuejols.
+
+2007-08-03 Friday 15:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.203): Avoid duplicated section label.
+
+2007-08-02 Thursday 13:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user-c-interface.doxyconf-html.in (1.4),
+ user-c-interface.doxyconf-latex.in (1.4), user-c-interface.tex
+ (1.1): Upgraded to doxygen version 1.5.3. Changed LATEX_HEADER
+ so as to be specific for the C interface.
+
+2007-08-02 Thursday 13:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.17): Do
+ initialize a local Boolean variable passed by reference, so as to
+ avoid 4 annoying warnings.
+
+2007-08-02 Thursday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/meta_programming.hh (1.8): Do hide documentation of inner
+ class Is_Same_Or_Derived::Any.
+
+2007-08-02 Thursday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.84), devref.doxyconf-latex.in
+ (1.23): Upgraded to doxygen version 1.5.3. Added
+ Interval_Restriction.defs.hh and Interval_Info.* to INPUT.
+
+2007-08-02 Thursday 09:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user.doxyconf-html.in (1.41), user.doxyconf-latex.in
+ (1.12): Upgraded to doxygen version 1.5.3.
+
+2007-08-02 Thursday 09:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/meta_programming.hh (1.7): Added \ingroup doxygen command to
+ several class definitions.
+
+2007-08-02 Thursday 09:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.92), Checked_Number.inlines.hh
+ (1.76): Minor formatting improvements, as well as the addition of
+ some doxygen commands.
+
+2007-08-02 Thursday 09:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.inlines.hh (1.5): Fixed a couple of \relates
+ commands.
+
+2007-07-30 Monday 13:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.45): Doxygen documentation should be
+ associated to members' declarations, rather than members'
+ implementation. Also removed a couple of inappropriate \relates
+ commands (which should only be used for functions that are NOT
+ members of a class).
+
+2007-07-30 Monday 13:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (1.14): Added a couple of missing
+ \relates Doxygen commands.
+
+2007-07-30 Monday 13:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.62): Removed optional (and usually
+ omitted) template instantiations, which were also causing a
+ Doxygen warning.
+
+2007-07-30 Monday 13:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (1.19): Removed optional (and usually omitted)
+ template instantiation, which was also causing a Doxygen warning.
+
+2007-07-30 Monday 13:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.83), devref.doxyconf-latex.in
+ (1.22): Add meta_programming.hh to variable INPUT.
+
+2007-07-30 Monday 13:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Makefile.am (1.41), Watchdog/Makefile.am (1.32): Added a comment
+ on the need to explicitly clean files generated by macro
+ AX_PREFIX_CONFIG_H.
+
+2007-07-29 Sunday 16:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Makefile.am (1.40), Watchdog/Makefile.am (1.31): The prefixed
+ configuration header and _config.sed added to DESTCLEANFILES.
+
+2007-07-17 Tuesday 08:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.223): Remember to have a look at
+
+
+ http://www.inf.ethz.ch/personal/gonnet/FPAccuracy/Analysis.html
+
+ especially at the "Surprises" section, where it talks about
+ rounding problems for division and multiplication on Pentium/AMD.
+
+2007-07-13 Friday 15:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/Makefile.am (1.52): The foreign language interface manuals in
+ HTML format depend on the corresponding core manuals (due to the
+ use of Doxygen generated tag files).
+
+2007-07-12 Thursday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING (1.4), Makefile.am (1.39), README (1.51),
+ README.configure (1.20), configure.ac (1.274), instchk.hh (1.9),
+ Watchdog/COPYING (1.4), Watchdog/Makefile.am (1.30),
+ Watchdog/README (1.16), Watchdog/configure.ac (1.38),
+ Watchdog/doc/Makefile.am (1.3), Watchdog/doc/README.doc (1.2),
+ Watchdog/doc/devref.tex (1.2), Watchdog/doc/pwl.sty (1.2),
+ Watchdog/doc/user.tex (1.2), Watchdog/m4/Makefile.am (1.2),
+ Watchdog/src/Doubly_Linked_Object.defs.hh (1.4),
+ Watchdog/src/Doubly_Linked_Object.inlines.hh (1.4),
+ Watchdog/src/EList.defs.hh (1.6), Watchdog/src/EList.inlines.hh
+ (1.4), Watchdog/src/EList_Iterator.defs.hh (1.4),
+ Watchdog/src/EList_Iterator.inlines.hh (1.4),
+ Watchdog/src/Handler.defs.hh (1.5),
+ Watchdog/src/Handler.inlines.hh (1.4), Watchdog/src/Makefile.am
+ (1.11), Watchdog/src/Pending_Element.cc (1.5),
+ Watchdog/src/Pending_Element.defs.hh (1.5),
+ Watchdog/src/Pending_Element.inlines.hh (1.4),
+ Watchdog/src/Pending_List.cc (1.5),
+ Watchdog/src/Pending_List.defs.hh (1.5),
+ Watchdog/src/Pending_List.inlines.hh (1.4), Watchdog/src/Time.cc
+ (1.5), Watchdog/src/Time.defs.hh (1.5),
+ Watchdog/src/Time.inlines.hh (1.4), Watchdog/src/Watchdog.cc
+ (1.7), Watchdog/src/Watchdog.defs.hh (1.6),
+ Watchdog/src/Watchdog.inlines.hh (1.4),
+ Watchdog/src/pwl_header.hh (1.5), Watchdog/utils/Makefile.am
+ (1.8), Watchdog/utils/build_header.in (1.5), debian/Makefile.am
+ (1.4), demos/Makefile.am (1.11), demos/ppl_lcdd/Makefile.am
+ (1.28), demos/ppl_lcdd/ppl_lcdd.cc (1.60),
+ demos/ppl_lcdd/examples/Makefile.am (1.9),
+ demos/ppl_lpsol/Makefile.am (1.39), demos/ppl_lpsol/ppl_lpsol.c
+ (1.70), demos/ppl_lpsol/examples/Makefile.am (1.9),
+ doc/Makefile.am (1.51), doc/README.doc (1.12), doc/devref.tex
+ (1.22), doc/ppl.sty (1.27), doc/user.tex (1.23),
+ interfaces/Makefile.am (1.26),
+ interfaces/ppl_interface_generator_common.m4 (1.18),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.31),
+ interfaces/ppl_interface_generator_copyright (1.4),
+ interfaces/C/Makefile.am (1.33), interfaces/C/ppl_c.h.in (1.72),
+ interfaces/C/ppl_c_version.h.in (1.5),
+ interfaces/C/ppl_interface_generator_c_cc.m4 (1.8),
+ interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.16),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.11),
+ interfaces/C/ppl_interface_generator_c_dat.m4 (1.12),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.12),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.9),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.8),
+ interfaces/Java/Makefile.am (1.12),
+ interfaces/Java/ppl_interface_generator_java_dat.m4 (1.8),
+ interfaces/Java/jni/Makefile.am (1.14),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.9),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.27), interfaces/Java/jni/ppl_java_common.cc (1.34),
+ interfaces/Java/jni/ppl_java_common.hh (1.28),
+ interfaces/Java/jni/ppl_java_globals.cc (1.6),
+ interfaces/Java/tests/C_Polyhedron_test1.java (1.12),
+ interfaces/Java/tests/Makefile.am (1.15),
+ interfaces/Java/tests/Test_Partial_Function.java (1.3),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.9),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.17), interfaces/OCaml/Makefile.am (1.32),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.4),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.13),
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.6),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.9),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.13),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.7),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.7),
+ interfaces/OCaml/ppl_ocaml_globals.cc (1.10),
+ interfaces/OCaml/ppl_ocaml_globals.ml (1.7),
+ interfaces/OCaml/ppl_ocaml_types.ml (1.10),
+ interfaces/OCaml/test1.ml (1.30), interfaces/Prolog/Makefile.am
+ (1.41), interfaces/Prolog/Prolog_interface.dox (1.159),
+ interfaces/Prolog/exceptions.hh (1.25),
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.34),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.11),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.47),
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (1.10), interfaces/Prolog/ppl_prolog_common.icc (1.8),
+ interfaces/Prolog/track_allocation.hh (1.23),
+ interfaces/Prolog/Ciao/Makefile.am (1.64),
+ interfaces/Prolog/Ciao/ciao_cfli.hh (1.3),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.19),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.15),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.26),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.50),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.6),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.5), interfaces/Prolog/GNU/Makefile.am (1.63),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.11),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.12),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.3),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.43),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.6), interfaces/Prolog/SICStus/Makefile.am (1.75),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.9), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.28),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.8),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.10),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.17),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.16),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.10),
+ interfaces/Prolog/SICStus/sp_predicate_check.pl (1.3),
+ interfaces/Prolog/SWI/Makefile.am (1.70),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.12),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.11),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.9), interfaces/Prolog/SWI/ppl_pl.cc (1.12),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.8),
+ interfaces/Prolog/SWI/swi_cfli.hh (1.5),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.10),
+ interfaces/Prolog/SWI/swi_predicate_check.pl (1.3),
+ interfaces/Prolog/XSB/Makefile.am (1.50),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.7),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.8),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.5), interfaces/Prolog/XSB/xsb_cfli.hh (1.3),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.18),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.16),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.30),
+ interfaces/Prolog/YAP/Makefile.am (1.52),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.7),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.12),
+ interfaces/Prolog/YAP/yap_cfli.hh (1.3),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.13),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.9),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.13),
+ interfaces/Prolog/tests/Makefile.am (1.15),
+ interfaces/Prolog/tests/clpq.pl (1.10),
+ interfaces/Prolog/tests/clpq2.pl (1.11),
+ interfaces/Prolog/tests/pl_check.pl (1.49),
+ interfaces/Prolog/tests/pl_grid_check.pl (1.5),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.50),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.27), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+ (1.4), m4/Makefile.am (1.27), m4/ac_check_fpu_control.m4 (1.5),
+ m4/ac_check_gmp.m4 (1.25), m4/ac_check_sicstus_prolog.m4 (1.6),
+ m4/ac_check_swi_prolog.m4 (1.11), m4/ac_check_xsb_prolog.m4
+ (1.4), m4/ac_cxx_attribute_weak.m4 (1.9),
+ m4/ac_cxx_double_binary_format.m4 (1.6),
+ m4/ac_cxx_flexible_arrays.m4 (1.14),
+ m4/ac_cxx_float_binary_format.m4 (1.5),
+ m4/ac_cxx_long_double_binary_format.m4 (1.6),
+ m4/ac_cxx_remainder_bug.m4 (1.2), m4/ac_prog_javac.m4 (1.6),
+ m4/ac_text_md5sum.m4 (1.3), m4/ppl.m4 (1.6),
+ src/Any_Pointset.defs.hh (1.13), src/Any_Pointset.inlines.hh
+ (1.3), src/Ask_Tell.defs.hh (1.17), src/Ask_Tell.inlines.hh
+ (1.16), src/Ask_Tell.templates.hh (1.9), src/BDS_Status.idefs.hh
+ (1.21), src/BDS_Status.inlines.hh (1.16), src/BD_Shape.cc (1.7),
+ src/BD_Shape.defs.hh (1.100), src/BD_Shape.inlines.hh (1.144),
+ src/BD_Shape.templates.hh (1.77), src/BHRZ03_Certificate.cc
+ (1.13), src/BHRZ03_Certificate.defs.hh (1.18),
+ src/BHRZ03_Certificate.inlines.hh (1.9), src/Bit_Matrix.cc (1.4),
+ src/Bit_Matrix.defs.hh (1.4), src/Bit_Matrix.inlines.hh (1.3),
+ src/Bit_Row.cc (1.4), src/Bit_Row.defs.hh (1.6),
+ src/Bit_Row.inlines.hh (1.4), src/Boundary.defs.hh (1.8),
+ src/Box.cc (1.7), src/Box.defs.hh (1.27), src/Box.inlines.hh
+ (1.18), src/Box.templates.hh (1.61), src/C_Integer.hh (1.5),
+ src/C_Polyhedron.cc (1.22), src/C_Polyhedron.defs.hh (1.48),
+ src/C_Polyhedron.inlines.hh (1.36), src/Checked_Number.cc (1.13),
+ src/Checked_Number.defs.hh (1.91), src/Checked_Number.inlines.hh
+ (1.75), src/Coefficient.cc (1.7), src/Coefficient.defs.hh (1.9),
+ src/Coefficient.inlines.hh (1.7), src/Congruence.cc (1.16),
+ src/Congruence.defs.hh (1.20), src/Congruence.inlines.hh (1.16),
+ src/Congruence_System.cc (1.25), src/Congruence_System.defs.hh
+ (1.20), src/Congruence_System.inlines.hh (1.9), src/Constraint.cc
+ (1.67), src/Constraint.defs.hh (1.125), src/Constraint.inlines.hh
+ (1.67), src/Constraint_System.cc (1.24),
+ src/Constraint_System.defs.hh (1.37),
+ src/Constraint_System.inlines.hh (1.10), src/DB_Matrix.defs.hh
+ (1.28), src/DB_Matrix.inlines.hh (1.33),
+ src/DB_Matrix.templates.hh (1.6), src/DB_Row.defs.hh (1.24),
+ src/DB_Row.inlines.hh (1.23), src/DB_Row.templates.hh (1.7),
+ src/Determinate.defs.hh (1.67), src/Determinate.inlines.hh
+ (1.57), src/Direct_Product.defs.hh (1.35),
+ src/Direct_Product.inlines.hh (1.31),
+ src/Direct_Product.templates.hh (1.22), src/Float.cc (1.7),
+ src/Float.defs.hh (1.26), src/Float.inlines.hh (1.31),
+ src/GMP_Integer.defs.hh (1.26), src/GMP_Integer.inlines.hh
+ (1.21), src/Generator.cc (1.75), src/Generator.defs.hh (1.123),
+ src/Generator.inlines.hh (1.61), src/Generator_System.cc (1.23),
+ src/Generator_System.defs.hh (1.24),
+ src/Generator_System.inlines.hh (1.9), src/Grid.defs.hh (1.49),
+ src/Grid.inlines.hh (1.15), src/Grid.templates.hh (1.31),
+ src/Grid_Certificate.cc (1.9), src/Grid_Certificate.defs.hh
+ (1.6), src/Grid_Certificate.inlines.hh (1.4),
+ src/Grid_Generator.cc (1.21), src/Grid_Generator.defs.hh (1.31),
+ src/Grid_Generator.inlines.hh (1.14),
+ src/Grid_Generator_System.cc (1.19),
+ src/Grid_Generator_System.defs.hh (1.23),
+ src/Grid_Generator_System.inlines.hh (1.14), src/Grid_Status.cc
+ (1.8), src/Grid_Status.idefs.hh (1.7), src/Grid_Status.inlines.hh
+ (1.4), src/Grid_chdims.cc (1.18), src/Grid_conversion.cc (1.21),
+ src/Grid_nonpublic.cc (1.26), src/Grid_public.cc (1.53),
+ src/Grid_simplify.cc (1.34), src/Grid_widenings.cc (1.16),
+ src/H79_Certificate.cc (1.12), src/H79_Certificate.defs.hh
+ (1.16), src/H79_Certificate.inlines.hh (1.10), src/Init.cc
+ (1.31), src/Init.defs.hh (1.19), src/Interval.defs.hh (1.44),
+ src/Interval.inlines.hh (1.27), src/Interval_Info.defs.hh (1.5),
+ src/Interval_Info.inlines.hh (1.4),
+ src/Interval_Restriction.defs.hh (1.6), src/Linear_Expression.cc
+ (1.18), src/Linear_Expression.defs.hh (1.35),
+ src/Linear_Expression.inlines.hh (1.11), src/Linear_Row.cc
+ (1.23), src/Linear_Row.defs.hh (1.25), src/Linear_Row.inlines.hh
+ (1.13), src/Linear_System.cc (1.44), src/Linear_System.defs.hh
+ (1.32), src/Linear_System.inlines.hh (1.23), src/MIP_Problem.cc
+ (1.54), src/MIP_Problem.defs.hh (1.35),
+ src/MIP_Problem.inlines.hh (1.16), src/MIP_Problem.templates.hh
+ (1.11), src/Makefile.am (1.171), src/Matrix.cc (1.97),
+ src/Matrix.defs.hh (1.82), src/Matrix.inlines.hh (1.52),
+ src/NNC_Polyhedron.cc (1.22), src/NNC_Polyhedron.defs.hh (1.50),
+ src/NNC_Polyhedron.inlines.hh (1.37), src/Numeric_Format.defs.hh
+ (1.7), src/OR_Matrix.defs.hh (1.9), src/OR_Matrix.inlines.hh
+ (1.8), src/OR_Matrix.templates.hh (1.6), src/Octagonal_Shape.cc
+ (1.6), src/Octagonal_Shape.defs.hh (1.29),
+ src/Octagonal_Shape.inlines.hh (1.17),
+ src/Octagonal_Shape.templates.hh (1.53), src/Og_Status.idefs.hh
+ (1.7), src/Og_Status.inlines.hh (1.5), src/Ph_Status.cc (1.14),
+ src/Ph_Status.idefs.hh (1.21), src/Ph_Status.inlines.hh (1.9),
+ src/Pointset_Ask_Tell.cc (1.4), src/Pointset_Ask_Tell.defs.hh
+ (1.11), src/Pointset_Ask_Tell.inlines.hh (1.5),
+ src/Pointset_Ask_Tell.templates.hh (1.9),
+ src/Pointset_Powerset.cc (1.13), src/Pointset_Powerset.defs.hh
+ (1.18), src/Pointset_Powerset.inlines.hh (1.8),
+ src/Pointset_Powerset.templates.hh (1.14),
+ src/Poly_Con_Relation.cc (1.16), src/Poly_Con_Relation.defs.hh
+ (1.34), src/Poly_Con_Relation.inlines.hh (1.16),
+ src/Poly_Gen_Relation.cc (1.16), src/Poly_Gen_Relation.defs.hh
+ (1.32), src/Poly_Gen_Relation.inlines.hh (1.16),
+ src/Polyhedron.defs.hh (1.318), src/Polyhedron.inlines.hh
+ (1.141), src/Polyhedron.templates.hh (1.14),
+ src/Polyhedron_chdims.cc (1.44), src/Polyhedron_nonpublic.cc
+ (1.79), src/Polyhedron_public.cc (1.94),
+ src/Polyhedron_widenings.cc (1.63), src/Powerset.defs.hh (1.30),
+ src/Powerset.inlines.hh (1.20), src/Powerset.templates.hh (1.5),
+ src/Ptr_Iterator.defs.hh (1.10), src/Ptr_Iterator.inlines.hh
+ (1.8), src/Rational_Box.hh (1.6), src/Result.defs.hh (1.19),
+ src/Result.inlines.hh (1.11), src/Rounding_Dir.defs.hh (1.13),
+ src/Rounding_Dir.inlines.hh (1.7), src/Row.cc (1.104),
+ src/Row.defs.hh (1.112), src/Row.inlines.hh (1.66),
+ src/Scalar_Products.cc (1.9), src/Scalar_Products.defs.hh (1.10),
+ src/Scalar_Products.inlines.hh (1.6), src/Temp.defs.hh (1.5),
+ src/Variable.cc (1.24), src/Variable.defs.hh (1.54),
+ src/Variable.inlines.hh (1.25), src/Variables_Set.cc (1.6),
+ src/Variables_Set.defs.hh (1.7), src/Variables_Set.inlines.hh
+ (1.5), src/Widening_Function.defs.hh (1.18),
+ src/Widening_Function.inlines.hh (1.15), src/algorithms.hh
+ (1.49), src/checked.cc (1.21), src/checked.defs.hh (1.42),
+ src/checked.inlines.hh (1.38), src/checked_ext.defs.hh (1.13),
+ src/checked_ext.inlines.hh (1.39), src/checked_float.inlines.hh
+ (1.79), src/checked_int.inlines.hh (1.62),
+ src/checked_mpq.inlines.hh (1.42), src/checked_mpz.inlines.hh
+ (1.46), src/checked_numeric_limits.hh (1.21), src/compiler.hh
+ (1.11), src/conversion.cc (1.83), src/distances.defs.hh (1.4),
+ src/distances.inlines.hh (1.5), src/fpu-c99.inlines.hh (1.15),
+ src/fpu-ia32.inlines.hh (1.17), src/fpu-none.inlines.hh (1.7),
+ src/fpu-sparc.inlines.hh (1.9), src/fpu.defs.hh (1.16),
+ src/globals.cc (1.28), src/globals.defs.hh (1.48),
+ src/globals.inlines.hh (1.18), src/initializer.hh (1.14),
+ src/iterator_to_const.defs.hh (1.6),
+ src/iterator_to_const.inlines.hh (1.4),
+ src/max_space_dimension.hh (1.13), src/meta_programming.hh (1.6),
+ src/minimize.cc (1.48), src/mp_std_bits.cc (1.5),
+ src/mp_std_bits.defs.hh (1.5), src/mp_std_bits.inlines.hh (1.4),
+ src/namespaces.hh (1.12), src/ppl-config.cc.in (1.21),
+ src/ppl_header.hh (1.7), src/simplify.cc (1.49),
+ src/swapping_sort.icc (1.13), src/version.cc (1.10),
+ src/version.hh.in (1.16), tests/FCAIBVP.cc (1.5),
+ tests/FCAIBVP.defs.hh (1.5), tests/FCAIBVP.inlines.hh (1.5),
+ tests/Makefile.am (1.263), tests/Partial_Function.cc (1.6),
+ tests/Partial_Function.defs.hh (1.4),
+ tests/Partial_Function.inlines.hh (1.3),
+ tests/Random_Number_Generator.defs.hh (1.5),
+ tests/Random_Number_Generator.inlines.hh (1.10), tests/files.cc
+ (1.10), tests/files.hh (1.11), tests/ppl_test.cc (1.10),
+ tests/ppl_test.hh (1.65), tests/print.cc (1.28), tests/print.hh
+ (1.42), tests/Ask_Tell/Makefile.am (1.3),
+ tests/Ask_Tell/append1.cc (1.6), tests/BD_Shape/Makefile.am
+ (1.66), tests/BD_Shape/addconstraints1.cc (1.18),
+ tests/BD_Shape/addspacedims1.cc (1.15),
+ tests/BD_Shape/affinedimension1.cc (1.12),
+ tests/BD_Shape/affineimage1.cc (1.19),
+ tests/BD_Shape/affineimage2.cc (1.13),
+ tests/BD_Shape/affinepreimage1.cc (1.21),
+ tests/BD_Shape/ascii_dump_load1.cc (1.15),
+ tests/BD_Shape/bdsdifference1.cc (1.15),
+ tests/BD_Shape/bdshull1.cc (1.16),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.10),
+ tests/BD_Shape/bhmz05widening1.cc (1.15),
+ tests/BD_Shape/bhz03widening1.cc (1.10),
+ tests/BD_Shape/bounded1.cc (1.3),
+ tests/BD_Shape/boundedaffineimage1.cc (1.4),
+ tests/BD_Shape/boundedaffinepreimage1.cc (1.3),
+ tests/BD_Shape/bounds1.cc (1.3),
+ tests/BD_Shape/cc76extrapolation1.cc (1.19),
+ tests/BD_Shape/cc76narrowing1.cc (1.18),
+ tests/BD_Shape/closure1.cc (1.20), tests/BD_Shape/concatenate1.cc
+ (1.14), tests/BD_Shape/constraints1.cc (1.19),
+ tests/BD_Shape/contains1.cc (1.15),
+ tests/BD_Shape/containsintegerpoint1.cc (1.3),
+ tests/BD_Shape/discrete1.cc (1.3), tests/BD_Shape/disjoint1.cc
+ (1.6), tests/BD_Shape/empty1.cc (1.11),
+ tests/BD_Shape/equality1.cc (1.16),
+ tests/BD_Shape/expandspacedim1.cc (1.4),
+ tests/BD_Shape/foldspacedims1.cc (1.6),
+ tests/BD_Shape/fromgensys1.cc (1.15),
+ tests/BD_Shape/frompolyhedron1.cc (1.5),
+ tests/BD_Shape/fromspacedim1.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.17),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.21),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.15),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.16),
+ tests/BD_Shape/generalizedaffinepreimage3.cc (1.6),
+ tests/BD_Shape/geomcovers1.cc (1.10),
+ tests/BD_Shape/h79widening1.cc (1.13),
+ tests/BD_Shape/intersection1.cc (1.18),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.14),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.15),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.14),
+ tests/BD_Shape/mapspacedims1.cc (1.15),
+ tests/BD_Shape/max_min1.cc (1.3), tests/BD_Shape/max_min2.cc
+ (1.5), tests/BD_Shape/maxspacedim1.cc (1.4),
+ tests/BD_Shape/membytes1.cc (1.3),
+ tests/BD_Shape/minconstraints1.cc (1.11),
+ tests/BD_Shape/relations1.cc (1.18), tests/BD_Shape/relations2.cc
+ (1.22), tests/BD_Shape/relations3.cc (1.26),
+ tests/BD_Shape/removespacedims1.cc (1.20),
+ tests/BD_Shape/run_tests (1.19), tests/BD_Shape/timeelapse1.cc
+ (1.20), tests/BD_Shape/universe1.cc (1.15),
+ tests/BD_Shape/writebdshape1.cc (1.10), tests/Box/Makefile.am
+ (1.37), tests/Box/addconstraints1.cc (1.8),
+ tests/Box/addspacedims1.cc (1.4), tests/Box/affinedimension1.cc
+ (1.6), tests/Box/affineimage1.cc (1.7),
+ tests/Box/affinepreimage1.cc (1.4), tests/Box/ascii_dump_load1.cc
+ (1.4), tests/Box/bdsdifference1.cc (1.5),
+ tests/Box/bgp99extrapolation1.cc (1.4),
+ tests/Box/bhz03widening1.cc (1.4), tests/Box/bounded1.cc (1.4),
+ tests/Box/boundedaffineimage1.cc (1.4),
+ tests/Box/boxdifference1.cc (1.6), tests/Box/boxhull.cc (1.4),
+ tests/Box/boxhull1.cc (1.5), tests/Box/cc76narrowing1.cc (1.5),
+ tests/Box/cc76widening.cc (1.5), tests/Box/closure1.cc (1.4),
+ tests/Box/concatenate1.cc (1.5), tests/Box/constraints1.cc (1.4),
+ tests/Box/contains1.cc (1.5), tests/Box/containsintegerpoint1.cc
+ (1.6), tests/Box/discrete1.cc (1.5), tests/Box/disjoint1.cc
+ (1.5), tests/Box/empty1.cc (1.5), tests/Box/equality1.cc (1.5),
+ tests/Box/expandspacedim1.cc (1.6), tests/Box/foldspacedims1.cc
+ (1.7), tests/Box/frombdshape1.cc (1.2), tests/Box/frombox1.cc
+ (1.3), tests/Box/fromdirectproduct1.cc (1.5),
+ tests/Box/fromgensys1.cc (1.4), tests/Box/fromgrid1.cc (1.5),
+ tests/Box/frompolyhedron1.cc (1.11), tests/Box/frompolyhedron2.cc
+ (1.9), tests/Box/fromspacedim1.cc (1.2),
+ tests/Box/generalizedaffineimage1.cc (1.5),
+ tests/Box/generalizedaffinepreimage1.cc (1.5),
+ tests/Box/geomcovers1.cc (1.4), tests/Box/intersection1.cc (1.6),
+ tests/Box/interval1.cc (1.4), tests/Box/interval2.cc (1.4),
+ tests/Box/mapspacedims1.cc (1.4), tests/Box/max_min1.cc (1.6),
+ tests/Box/maxspacedim1.cc (1.5), tests/Box/membytes1.cc (1.4),
+ tests/Box/minconstraints1.cc (1.5),
+ tests/Box/pointsetpowerset1.cc (1.3), tests/Box/refine1.cc
+ (1.10), tests/Box/refine2.cc (1.9), tests/Box/refine3.cc (1.2),
+ tests/Box/relations1.cc (1.5), tests/Box/relations2.cc (1.3),
+ tests/Box/removespacedims1.cc (1.6), tests/Box/run_tests (1.3),
+ tests/Box/timeelapse1.cc (1.5), tests/Box/universe1.cc (1.4),
+ tests/Box/writebox1.cc (1.4), tests/Grid/Makefile.am (1.48),
+ tests/Grid/addcongruence1.cc (1.14),
+ tests/Grid/addcongruences1.cc (1.17),
+ tests/Grid/addconstraint1.cc (1.12),
+ tests/Grid/addconstraints1.cc (1.13), tests/Grid/addgenerator1.cc
+ (1.16), tests/Grid/addgenerators1.cc (1.16),
+ tests/Grid/addspacedims1.cc (1.15), tests/Grid/affinedim1.cc
+ (1.12), tests/Grid/affineimage1.cc (1.14),
+ tests/Grid/affineimage2.cc (1.12), tests/Grid/affinepreimage1.cc
+ (1.13), tests/Grid/affinepreimage2.cc (1.8),
+ tests/Grid/approximatepartition1.cc (1.3),
+ tests/Grid/asciidumpload1.cc (1.14), tests/Grid/asciidumpload2.cc
+ (1.6), tests/Grid/asciidumpload3.cc (1.5),
+ tests/Grid/asciidumpload4.cc (1.5), tests/Grid/asciidumpload5.cc
+ (1.3), tests/Grid/asciidumpload6.cc (1.3),
+ tests/Grid/asciidumpload7.cc (1.3), tests/Grid/bhz03widening1.cc
+ (1.13), tests/Grid/bounded1.cc (1.14),
+ tests/Grid/boundedaffineimage1.cc (1.4),
+ tests/Grid/boundedaffinepreimage1.cc (1.4),
+ tests/Grid/boundingbox1.cc (1.19), tests/Grid/bounds1.cc (1.15),
+ tests/Grid/certificate1.cc (1.14), tests/Grid/concatenate1.cc
+ (1.14), tests/Grid/congruence1.cc (1.17),
+ tests/Grid/congruences1.cc (1.12), tests/Grid/congruences2.cc
+ (1.6), tests/Grid/contains1.cc (1.12),
+ tests/Grid/containsintegerpoint1.cc (1.4),
+ tests/Grid/copyconstruct1.cc (1.8), tests/Grid/coveringbox1.cc
+ (1.16), tests/Grid/coveringbox2.cc (1.14),
+ tests/Grid/directproduct1.cc (1.28), tests/Grid/directproduct2.cc
+ (1.6), tests/Grid/discrete1.cc (1.8), tests/Grid/disjoint1.cc
+ (1.12), tests/Grid/equals1.cc (1.13),
+ tests/Grid/expandspacedim1.cc (1.12),
+ tests/Grid/foldspacedims1.cc (1.12),
+ tests/Grid/generalizedaffineimage1.cc (1.14),
+ tests/Grid/generalizedaffineimage2.cc (1.13),
+ tests/Grid/generalizedaffineimage3.cc (1.5),
+ tests/Grid/generalizedaffinepreimage1.cc (1.16),
+ tests/Grid/generalizedaffinepreimage2.cc (1.16),
+ tests/Grid/generalizedaffinepreimage3.cc (1.5),
+ tests/Grid/generator1.cc (1.20), tests/Grid/generators1.cc
+ (1.13), tests/Grid/generators2.cc (1.3), tests/Grid/grid1.cc
+ (1.21), tests/Grid/grid2.cc (1.16), tests/Grid/grid3.cc (1.20),
+ tests/Grid/griddifference1.cc (1.12), tests/Grid/intersection1.cc
+ (1.12), tests/Grid/isempty1.cc (1.8), tests/Grid/isuniverse1.cc
+ (1.10), tests/Grid/join1.cc (1.16), tests/Grid/join2.cc (1.11),
+ tests/Grid/limitedextrapolation1.cc (1.13),
+ tests/Grid/limitedextrapolation2.cc (1.7),
+ tests/Grid/limitedextrapolation3.cc (1.6),
+ tests/Grid/mapspacedims1.cc (1.11), tests/Grid/maxmin1.cc (1.12),
+ tests/Grid/membytes1.cc (1.9), tests/Grid/mincongruences1.cc
+ (1.10), tests/Grid/mingenerators1.cc (1.10),
+ tests/Grid/outputoperator1.cc (1.9),
+ tests/Grid/outputoperator2.cc (1.3),
+ tests/Grid/outputoperator3.cc (1.3), tests/Grid/partition1.cc
+ (1.6), tests/Grid/powersetdifference1.cc (1.3),
+ tests/Grid/powersetgeometricallycovers1.cc (1.3),
+ tests/Grid/powersetgeometricallyequals1.cc (1.3),
+ tests/Grid/relations1.cc (1.14), tests/Grid/relations2.cc (1.16),
+ tests/Grid/relations3.cc (1.7), tests/Grid/removespacedims1.cc
+ (1.14), tests/Grid/removespacedims2.cc (1.14),
+ tests/Grid/timeelapse1.cc (1.11), tests/Grid/topclosed1.cc
+ (1.12), tests/Grid/topclosure1.cc (1.8), tests/Grid/widening1.cc
+ (1.16), tests/Grid/widening2.cc (1.11), tests/Grid/widening3.cc
+ (1.6), tests/Grid/writecongruencesystem.cc (1.8),
+ tests/MIP_Problem/Makefile.am (1.4),
+ tests/MIP_Problem/ascii_dump_load1.cc (1.4),
+ tests/MIP_Problem/exceptions1.cc (1.3),
+ tests/MIP_Problem/mipproblem1.cc (1.5),
+ tests/MIP_Problem/mipproblem2.cc (1.3),
+ tests/Octagonal_Shape/Makefile.am (1.20),
+ tests/Octagonal_Shape/addspacedims1.cc (1.3),
+ tests/Octagonal_Shape/affinedimension1.cc (1.4),
+ tests/Octagonal_Shape/affineimage1.cc (1.4),
+ tests/Octagonal_Shape/affineimage2.cc (1.3),
+ tests/Octagonal_Shape/affinepreimage1.cc (1.5),
+ tests/Octagonal_Shape/affinepreimage2.cc (1.3),
+ tests/Octagonal_Shape/ascii_dump_load1.cc (1.3),
+ tests/Octagonal_Shape/bhmz05widening1.cc (1.4),
+ tests/Octagonal_Shape/bhz03widening1.cc (1.3),
+ tests/Octagonal_Shape/bounded1.cc (1.3),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.10),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.4),
+ tests/Octagonal_Shape/bounds1.cc (1.4),
+ tests/Octagonal_Shape/cc76extrapolation1.cc (1.5),
+ tests/Octagonal_Shape/cc76narrowing1.cc (1.4),
+ tests/Octagonal_Shape/chinainit.cc (1.3),
+ tests/Octagonal_Shape/concatenate1.cc (1.3),
+ tests/Octagonal_Shape/constraints1.cc (1.4),
+ tests/Octagonal_Shape/contains1.cc (1.4),
+ tests/Octagonal_Shape/containsintegerpoint1.cc (1.4),
+ tests/Octagonal_Shape/discrete1.cc (1.3),
+ tests/Octagonal_Shape/disjoint1.cc (1.7),
+ tests/Octagonal_Shape/empty1.cc (1.3),
+ tests/Octagonal_Shape/expandspacedim1.cc (1.5),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.5),
+ tests/Octagonal_Shape/fromgensys1.cc (1.3),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.4),
+ tests/Octagonal_Shape/fromspacedim1.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.9),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.9),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.5),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.4),
+ tests/Octagonal_Shape/intersection1.cc (1.4),
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.5),
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.5),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.4),
+ tests/Octagonal_Shape/max_min1.cc (1.5),
+ tests/Octagonal_Shape/max_min2.cc (1.4),
+ tests/Octagonal_Shape/maxspacedim1.cc (1.4),
+ tests/Octagonal_Shape/membytes1.cc (1.4),
+ tests/Octagonal_Shape/minconstraints1.cc (1.4),
+ tests/Octagonal_Shape/octdifference1.cc (1.4),
+ tests/Octagonal_Shape/octhull1.cc (1.4),
+ tests/Octagonal_Shape/relatwithcons1.cc (1.4),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.7),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.8),
+ tests/Octagonal_Shape/removespacedims1.cc (1.4),
+ tests/Octagonal_Shape/run_tests (1.3),
+ tests/Octagonal_Shape/timeelapse1.cc (1.5),
+ tests/Octagonal_Shape/universe1.cc (1.3),
+ tests/Octagonal_Shape/writeoctagon1.cc (1.4),
+ tests/Polyhedron/Makefile.am (1.109), tests/Polyhedron/README
+ (1.7), tests/Polyhedron/addcongruence1.cc (1.8),
+ tests/Polyhedron/addcongruences1.cc (1.11),
+ tests/Polyhedron/addconstraint1.cc (1.11),
+ tests/Polyhedron/addconstraints1.cc (1.12),
+ tests/Polyhedron/addconstraints2.cc (1.11),
+ tests/Polyhedron/addgenerator1.cc (1.12),
+ tests/Polyhedron/addgenerator2.cc (1.12),
+ tests/Polyhedron/addgenerators1.cc (1.13),
+ tests/Polyhedron/addgenerators2.cc (1.12),
+ tests/Polyhedron/addspacedims1.cc (1.12),
+ tests/Polyhedron/addspacedims2.cc (1.12),
+ tests/Polyhedron/affineimage1.cc (1.12),
+ tests/Polyhedron/affineimage2.cc (1.11),
+ tests/Polyhedron/affinepreimage1.cc (1.11),
+ tests/Polyhedron/affinetrans.cc (1.11),
+ tests/Polyhedron/append1.cc (1.12), tests/Polyhedron/append2.cc
+ (1.11), tests/Polyhedron/ascii_dump_load1.cc (1.10),
+ tests/Polyhedron/ascii_dump_load2.cc (1.10),
+ tests/Polyhedron/ascii_dump_load3.cc (1.11),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.13),
+ tests/Polyhedron/bhrz03widening1.cc (1.11),
+ tests/Polyhedron/bhrz03widening2.cc (1.11),
+ tests/Polyhedron/bhrz03widening3.cc (1.15),
+ tests/Polyhedron/bhz03widening1.cc (1.14),
+ tests/Polyhedron/bounded1.cc (1.11),
+ tests/Polyhedron/boundedaffineimage1.cc (1.11),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.9),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.10),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.12),
+ tests/Polyhedron/bounds1.cc (1.11),
+ tests/Polyhedron/cnncconversion1.cc (1.4),
+ tests/Polyhedron/concatenate1.cc (1.11),
+ tests/Polyhedron/congruences1.cc (1.9),
+ tests/Polyhedron/constraints1.cc (1.10),
+ tests/Polyhedron/contains1.cc (1.10),
+ tests/Polyhedron/contains2.cc (1.10),
+ tests/Polyhedron/containsintegerpoint1.cc (1.3),
+ tests/Polyhedron/disjoint1.cc (1.10),
+ tests/Polyhedron/disjoint2.cc (1.12),
+ tests/Polyhedron/dualhypercubes.cc (1.13),
+ tests/Polyhedron/empty1.cc (1.11), tests/Polyhedron/equals1.cc
+ (1.10), tests/Polyhedron/exceptions1.cc (1.14),
+ tests/Polyhedron/exceptions2.cc (1.12),
+ tests/Polyhedron/exceptions3.cc (1.11),
+ tests/Polyhedron/expandspacedim1.cc (1.13),
+ tests/Polyhedron/expandspacedim2.cc (1.13),
+ tests/Polyhedron/foldspacedims1.cc (1.15),
+ tests/Polyhedron/foldspacedims2.cc (1.16),
+ tests/Polyhedron/frombox1.cc (1.4), tests/Polyhedron/frombox2.cc
+ (1.4), tests/Polyhedron/generalizedaffineimage1.cc (1.13),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.13),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.10),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.9),
+ tests/Polyhedron/generators1.cc (1.11),
+ tests/Polyhedron/geomcovers1.cc (1.14),
+ tests/Polyhedron/h79widening1.cc (1.11),
+ tests/Polyhedron/h79widening2.cc (1.11),
+ tests/Polyhedron/hybrid.cc (1.4),
+ tests/Polyhedron/intersection1.cc (1.15),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.10),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.11),
+ tests/Polyhedron/linearpartition1.cc (1.13),
+ tests/Polyhedron/linearsystem1.cc (1.9),
+ tests/Polyhedron/linexpression1.cc (1.10),
+ tests/Polyhedron/mapspacedims1.cc (1.15),
+ tests/Polyhedron/matrix1.cc (1.10), tests/Polyhedron/max_min1.cc
+ (1.12), tests/Polyhedron/maxspacedim1.cc (1.13),
+ tests/Polyhedron/mc91.cc (1.15), tests/Polyhedron/membytes1.cc
+ (1.15), tests/Polyhedron/memory1.cc (1.13),
+ tests/Polyhedron/memory2.cc (1.15),
+ tests/Polyhedron/minconstraints1.cc (1.10),
+ tests/Polyhedron/minconstraints2.cc (1.12),
+ tests/Polyhedron/mingenerators1.cc (1.10),
+ tests/Polyhedron/mingenerators2.cc (1.11),
+ tests/Polyhedron/nncminimize1.cc (1.7),
+ tests/Polyhedron/nncminimize2.cc (1.7),
+ tests/Polyhedron/numberinput1.cc (1.32),
+ tests/Polyhedron/onepoint.cc (1.11), tests/Polyhedron/permute.cc
+ (1.9), tests/Polyhedron/pointsetpowerset1.cc (1.7),
+ tests/Polyhedron/polydifference1.cc (1.12),
+ tests/Polyhedron/polydifference2.cc (1.12),
+ tests/Polyhedron/polyhull1.cc (1.12),
+ tests/Polyhedron/polyhull2.cc (1.11),
+ tests/Polyhedron/powerset1.cc (1.20),
+ tests/Polyhedron/randphull1.cc (1.11),
+ tests/Polyhedron/randphull2.cc (1.10),
+ tests/Polyhedron/relations1.cc (1.11),
+ tests/Polyhedron/relations2.cc (1.11),
+ tests/Polyhedron/relations3.cc (1.10),
+ tests/Polyhedron/removespacedims1.cc (1.11),
+ tests/Polyhedron/removespacedims2.cc (1.11),
+ tests/Polyhedron/smm1.cc (1.8), tests/Polyhedron/timeelapse1.cc
+ (1.12), tests/Polyhedron/timeelapse2.cc (1.12),
+ tests/Polyhedron/topclosed1.cc (1.11),
+ tests/Polyhedron/topclosure1.cc (1.11),
+ tests/Polyhedron/universe1.cc (1.11),
+ tests/Polyhedron/universe2.cc (1.11),
+ tests/Polyhedron/variablesset1.cc (1.11),
+ tests/Polyhedron/watchdog1.cc (1.10),
+ tests/Polyhedron/writeconsys1.cc (1.11),
+ tests/Polyhedron/writegensys1.cc (1.10),
+ tests/Polyhedron/writepolyhedron1.cc (1.10),
+ tests/Polyhedron/writepolyhedron2.cc (1.10),
+ tests/Polyhedron/writerelation1.cc (1.13),
+ tests/Polyhedron/writevariable1.cc (1.8), utils/Makefile.am
+ (1.16), utils/build_header.in (1.5), utils/cm_cleaner.sh (1.3),
+ utils/cm_splitter.sh (1.3), utils/text2cxxarray.in (1.4),
+ utils/timings.cc (1.10), utils/timings.hh (1.6): Started the
+ upgrade to GPL version 3 or later.
+
+2007-07-11 Wednesday 16:16 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.43): Fixed typo. Removed
+ Is_Singleton_Or_Interval. Added Is_Singleton and Is_Interva.
+
+2007-07-10 Tuesday 17:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.3),
+ devref-c-interface.doxyconf-latex.in (1.3),
+ devref-prolog-interface.doxyconf-html.in (1.3),
+ devref-prolog-interface.doxyconf-latex.in (1.3),
+ devref.doxyconf-html.in (1.82), devref.doxyconf-latex.in (1.21),
+ user-c-interface.doxyconf-html.in (1.3),
+ user-c-interface.doxyconf-latex.in (1.3),
+ user-prolog-interface.doxyconf-html.in (1.3),
+ user-prolog-interface.doxyconf-latex.in (1.3),
+ user.doxyconf-html.in (1.40), user.doxyconf-latex.in (1.11):
+ Updated configuration files to version 1.5.2 of Doxygen.
+
+2007-07-10 Tuesday 16:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (1.26): Documentation link fixed.
+
+2007-07-10 Tuesday 16:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (1.10): Cut-and-paste documentation
+ typo fixed.
+
+2007-07-10 Tuesday 16:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.65), Box/Makefile.am (1.36),
+ Octagonal_Shape/Makefile.am (1.19): List run_tests.stamp in
+ DISTCLEANFILES.
+
+2007-07-09 Monday 10:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.31): Partially undone last
+ commit, as it was again causing dependency problems in parallel
+ builds.
+
+2007-07-08 Sunday 13:41 Andrea Cimino
+
+ * interfaces/: Java/Makefile.am (1.11), OCaml/Makefile.am (1.30):
+ Use `pkglibdir' instead of hardcoding destination paths. Install
+ the OCaml interface in `pkglibdir', honoring the `--prefix'
+ option. Avoided a useless directive in the OCaml's Makefile.am:
+ the serialization of the build is done correctly now thanks to
+ the previous commit.
+
+2007-07-07 Saturday 15:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.273): New Automake conditional HOST_CPU_X86_64.
+
+2007-07-07 Saturday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.272): Version number bumped.
+
+2007-07-07 Saturday 00:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.29): Try to fix Makefile.am so as
+ to enforce the right dependencies even in the presence of
+ parallel builds. To be checked.
+
+2007-07-06 Friday 15:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.28): Added option -f to cp and rm
+ commands.
+
+2007-07-06 Friday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.13): File ppl_java_classes.cc
+ is generated, hence should not be distributed.
+
+2007-07-06 Friday 11:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/Makefile.am (1.32), Java/jni/Makefile.am (1.12),
+ OCaml/Makefile.am (1.27), Prolog/Makefile.am (1.40),
+ Java/tests/Makefile.am (1.14), Prolog/Ciao/Makefile.am (1.63),
+ Prolog/GNU/Makefile.am (1.62), Prolog/SICStus/Makefile.am (1.74),
+ Prolog/SWI/Makefile.am (1.69), Prolog/XSB/Makefile.am (1.49),
+ Prolog/tests/Makefile.am (1.14), Prolog/YAP/Makefile.am (1.51):
+ File ppl_interface_instatiations.m4 is a generated file, so it
+ must be found in the build directory.
+
+2007-07-06 Friday 10:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.24): Bug 246815 had been fixed: YAP
+ support enabled again.
+
+2007-07-06 Friday 09:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.48): Small improvements -
+ mainly to comments.
+
+2007-07-06 Friday 08:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.47): Improved the code
+ testing large integers.
+
+2007-07-05 Thursday 22:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.46): Modified the test for
+ large integers in the case that current_prolog_flag(bounded,
+ true) holds.
+
+ In this case, the generated large integer may wrap and any
+ comparison with Max_int - obtained with
+ current_prolog_flag(max_integer, Max_int) meaningless.
+
+ So we also compare the generated integer with another number that
+ is generated to be about half its size (and therefore already
+ tested).
+
+2007-07-05 Thursday 14:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.23): Disable YAP support until bug
+ 246815 is fixed. Bug 243084 has been fixed: `ppl-swiprolog'
+ dependency on `readline-devel' removed.
+
+2007-07-05 Thursday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.39): Distribute also
+ ppl_prolog_common.icc.
+
+2007-07-05 Thursday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.22): The `gprolog' package is not
+ available on ppc64: the GNU Prolog interface must thus be
+ disabled for that architecture.
+
+2007-07-04 Wednesday 21:39 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.33): Removed some non
+ used variables in the C++ side of the Java interface.
+
+2007-07-04 Wednesday 21:38 Andrea Cimino
+
+ * interfaces/: OCaml/Makefile.am (1.26), Java/tests/Makefile.am
+ (1.13): Fixed the `dist' target in the OCaml and Java/test
+ interfaces: included all the m4 generator interface files in
+ EXTRA_DIST. Do not distribute `ppl_ocaml.cc' because it's a
+ generated source.
+
+2007-07-04 Wednesday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.29): Added `m4' to `SUBDIRS'.
+
+2007-07-04 Wednesday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.271): Version number bumped.
+
+2007-07-03 Tuesday 16:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[4,21]): Use
+ `%{buildroot}' consistently, instead of `$RPM_BUILD_ROOT'.
+
+2007-07-02 Monday 14:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.208), TODO (1.222), doc/definitions.dox (1.202): Use the
+ UTF-8 encoding instead of ISO-8859.
+
+2007-07-01 Sunday 20:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.221): Added an item concerning additional documentation.
+
+2007-07-01 Sunday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.220): Remember to pProvide PPL-specific documentation on
+ the use of `make check' and `make uninstall'.
+
+2007-07-01 Sunday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.219): The Java interface has been improved: corresponding
+ item removed.
+
+2007-06-30 Saturday 10:41 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.64): Use method instead of function.
+
+2007-06-29 Friday 22:25 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.42): Converted many Interval functions in
+ methods.
+
+2007-06-29 Friday 22:20 Abramo Bagnara
+
+ * src/: Box.templates.hh (1.60), Interval.defs.hh (1.41): Converted
+ many Interval functions in methods.
+
+2007-06-28 Thursday 12:18 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.40): Removed duplicate definition.
+
+2007-06-28 Thursday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.29), Watchdog/ltmain.sh (1.18): Updated from Libtool
+ 1.5.24.
+
+2007-06-13 Wednesday 18:31 Andrea Cimino
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.26): Call the appropriate destructor if the underlined C++
+ object is a NNC_Polyhedron or a C_Polyhedron.
+
+2007-06-12 Tuesday 21:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.20): `%%check' removed.
+
+2007-06-12 Tuesday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[3,19]):
+ `%%check' added. Revised the description of the `devel' package.
+ Include also the `TODO' file in the documentation of the main
+ package.
+
+2007-06-12 Tuesday 20:25 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.32): Removed some
+ useless calls in the Java interface.
+
+2007-06-12 Tuesday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.18): Patch the `libtool' script after
+ `%%configure' so as to fix the rpath issue.
+
+2007-06-08 Friday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/README.swiprolog (simplex.1): file
+ README.swiprolog was added on branch simplex on 2008-01-07
+ 11:15:30 +0000
+
+2007-06-08 Friday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/README.yap (simplex.1): file README.yap was
+ added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/README.gprolog (1.2),
+ SWI/README.swiprolog (1.2), YAP/README.yap (1.2): New
+ documentation files.
+
+2007-06-08 Friday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/README.gprolog (simplex.1): file
+ README.gprolog was added on branch simplex on 2008-01-07 11:15:30
+ +0000
+
+2007-06-08 Friday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.17): %install commands revised.
+
+2007-06-08 Friday 18:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.270), Watchdog/configure.ac (1.37): Do not
+ override the externally-provided CFLAGS and CXXFLAGS.
+
+2007-06-08 Friday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ax_prefix_config_h.m4 (simplex.1): file ax_prefix_config_h.m4
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.207), configure.ac (1.269), demos/ppl_lcdd/ppl_lcdd.cc
+ (1.59), demos/ppl_lpsol/ppl_lpsol.c (1.69),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.10),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.16),
+ interfaces/Prolog/SWI/swi_cfli.hh (1.4), m4/Makefile.am (1.26),
+ m4/ac_check_fpu_control.m4 (1.4),
+ m4/ac_cxx_double_binary_format.m4 (1.5),
+ m4/ac_cxx_float_binary_format.m4 (1.4),
+ m4/ac_cxx_long_double_binary_format.m4 (1.5),
+ m4/ax_prefix_config_h.m4 (1.1), src/BD_Shape.cc (1.6),
+ src/BHRZ03_Certificate.cc (1.12), src/Bit_Matrix.cc (1.3),
+ src/Bit_Row.cc (1.3), src/Bit_Row.inlines.hh (1.3), src/Box.cc
+ (1.6), src/C_Integer.hh (1.4), src/C_Polyhedron.cc (1.21),
+ src/Checked_Number.cc (1.12), src/Coefficient.cc (1.6),
+ src/Coefficient.defs.hh (1.8), src/Coefficient.types.hh (1.15),
+ src/Congruence.cc (1.15), src/Congruence_System.cc (1.24),
+ src/Constraint.cc (1.66), src/Constraint_System.cc (1.23),
+ src/DB_Row.defs.hh (1.23), src/DB_Row.inlines.hh (1.22),
+ src/DB_Row.templates.hh (1.6), src/Float.cc (1.6),
+ src/Float.defs.hh (1.25), src/Float.inlines.hh (1.30),
+ src/GMP_Integer.inlines.hh (1.20), src/Generator.cc (1.74),
+ src/Generator_System.cc (1.22), src/Grid_Certificate.cc (1.8),
+ src/Grid_Generator.cc (1.20), src/Grid_Generator_System.cc
+ (1.18), src/Grid_Status.cc (1.7), src/Grid_chdims.cc (1.17),
+ src/Grid_conversion.cc (1.20), src/Grid_nonpublic.cc (1.25),
+ src/Grid_public.cc (1.52), src/Grid_simplify.cc (1.33),
+ src/Grid_widenings.cc (1.15), src/H79_Certificate.cc (1.11),
+ src/Init.cc (1.30), src/Linear_Expression.cc (1.17),
+ src/Linear_Row.cc (1.22), src/Linear_System.cc (1.43),
+ src/MIP_Problem.cc (1.53), src/Matrix.cc (1.96),
+ src/NNC_Polyhedron.cc (1.21), src/Octagonal_Shape.cc (1.5),
+ src/Ph_Status.cc (1.13), src/Pointset_Ask_Tell.cc (1.3),
+ src/Pointset_Powerset.cc (1.12), src/Poly_Con_Relation.cc (1.15),
+ src/Poly_Gen_Relation.cc (1.15), src/Polyhedron_chdims.cc (1.43),
+ src/Polyhedron_nonpublic.cc (1.78), src/Polyhedron_public.cc
+ (1.93), src/Polyhedron_widenings.cc (1.62), src/Row.cc (1.103),
+ src/Row.defs.hh (1.111), src/Row.inlines.hh (1.65),
+ src/Scalar_Products.cc (1.8), src/Variable.cc (1.23),
+ src/Variables_Set.cc (1.5), src/checked.cc (1.20),
+ src/checked.inlines.hh (1.37), src/checked_float.inlines.hh
+ (1.78), src/checked_int.inlines.hh (1.61),
+ src/checked_mpz.inlines.hh (1.45), src/conversion.cc (1.82),
+ src/fpu-c99.inlines.hh (1.14), src/fpu-sparc.inlines.hh (1.8),
+ src/fpu.defs.hh (1.15), src/fpu.types.hh (1.5), src/globals.cc
+ (1.27), src/minimize.cc (1.47), src/mp_std_bits.cc (1.4),
+ src/ppl-config.cc.in (1.20), src/ppl_header.hh (1.6),
+ src/simplify.cc (1.48), src/version.cc (1.9), tests/FCAIBVP.cc
+ (1.4), tests/Partial_Function.cc (1.5), tests/ppl_test.cc (1.9),
+ tests/ppl_test.hh (1.63), tests/print.hh (1.41),
+ tests/Polyhedron/memory1.cc (1.12), tests/Polyhedron/memory2.cc
+ (1.14), utils/timings.cc (1.9): The `ppl.hh' header file no
+ longer defines macros not prefixed by "PPL_".
+
+2007-06-08 Friday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/.cvsignore (simplex.1): file .cvsignore was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-06-08 Friday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/m4/ax_prefix_config_h.m4 (simplex.1): file
+ ax_prefix_config_h.m4 was added on branch simplex on 2008-01-07
+ 11:15:25 +0000
+
+2007-06-08 Friday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.28), NEWS (1.9), configure.ac (1.36),
+ m4/.cvsignore (1.1), m4/Makefile.am (1.1),
+ m4/ax_prefix_config_h.m4 (1.1), src/Makefile.am (1.10),
+ src/Pending_Element.cc (1.4), src/Pending_List.cc (1.4),
+ src/Time.cc (1.4), src/Watchdog.cc (1.6), src/Watchdog.defs.hh
+ (1.5), src/pwl_header.hh (1.4): The `pwl.hh' header file no
+ longer defines macros not prefixed by "PWL_".
+
+2007-06-07 Thursday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.16): Apply both patches.
+
+2007-06-07 Thursday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.15): Fixed the command to remove all
+ installed *.la files.
+
+2007-06-07 Thursday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.14): Remove installed *.la files.
+ Added a `ppl-0.9-configure.patch' to avoid overriding CFLAGS and
+ CXXFLAGS.
+
+2007-06-07 Thursday 12:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.13): All the static archives are now
+ in `*-static' packages. Packages `ppl-gprolog-devel',
+ `ppl-swiprolog-devel' and `ppl-yap-devel' renamed `ppl-gprolog',
+ `ppl-swiprolog' and `ppl-yap', respectively. As a workaround for
+ a bug in the `pl' package (Bugzilla Bug 243084) `ppl-swiprolog'
+ is now dependent on `readline-devel'. Added `%%dir
+ %%{_datadir}/doc/%%{name}'. The `ppl-user-0.9-html'
+ documentation directory is now properly listed.
+
+2007-06-06 Wednesday 22:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.12): Use `%{_includedir}' and
+ `%{_libdir}' instead of `/usr/include' and `/usr/lib',
+ respectively. Use `%{_datadir}/doc/%{name}' instead of
+ `/usr/share/doc/ppl'. Replaced `%defattr(-,root,root)' with
+ `%defattr(-,root,root,-)'. (Thanks to Mamoru Tasaka.)
+
+2007-06-05 Tuesday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.27): Shadowing avoided.
+
+2007-06-05 Tuesday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.31): Useless break's
+ and braces removed. Indentation fixed in several places.
+
+2007-06-05 Tuesday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.140): Make sure
+ Polyhedron::space_dimension() is defined before being used.
+
+2007-05-29 Tuesday 08:05 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.16): In the generated Java tests, for each method that returns
+ a non void type, a corresponding variable of the appropriate type
+ is declared and assigned to the value that the method returns.
+ Removed a redundant `ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code
+ section.
+
+2007-05-28 Monday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.206): Updated.
+
+2007-05-28 Monday 06:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: MIP_Problem.defs.hh (1.34), MIP_Problem.inlines.hh (1.15):
+ Removed method hash_code().
+
+2007-05-24 Thursday 07:56 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.15): Using `hashcode' instead of `hash'. Spurious blank space
+ removed.
+
+2007-05-23 Wednesday 23:11 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.14): Fixed a typo.
+
+2007-05-23 Wednesday 23:07 Andrea Cimino
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.7),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.25), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.13): In the Java interface provided, for most of the PPL
+ classes, the methods `equals(Object y)' and `hashCode()'.
+
+2007-05-23 Wednesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.12), Ask_Tell.defs.hh (1.16),
+ BD_Shape.defs.hh (1.99), BD_Shape.inlines.hh (1.143),
+ Grid.defs.hh (1.48), Grid.inlines.hh (1.14), MIP_Problem.defs.hh
+ (1.33), MIP_Problem.inlines.hh (1.14), Octagonal_Shape.defs.hh
+ (1.28), Octagonal_Shape.inlines.hh (1.16),
+ Pointset_Ask_Tell.defs.hh (1.9), Pointset_Ask_Tell.inlines.hh
+ (1.4), Pointset_Powerset.defs.hh (1.17), Polyhedron.defs.hh
+ (1.317), Polyhedron.inlines.hh (1.139): All PPL semantic objects
+ now provide the method
+
+ int32_t hash_code() const
+
+ returning a 32-bit hash code for *this. If x and y are such that
+ x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+2007-05-21 Monday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.170): Distribute also meta_programming.hh and
+ Temp.defs.hh.
+
+2007-05-21 Monday 15:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.28), Watchdog/ltmain.sh (1.17): Updated from Libtool
+ 1.5.23b.
+
+2007-05-21 Monday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.218): Added one item concerning the Java interface.
+ (Thanks to Fausto Spoto.)
+
+2007-05-18 Friday 07:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/mapspacedims1.cc (1.14): New test added.
+
+2007-05-15 Tuesday 09:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.268): Version number bumped.
+
+2007-05-10 Thursday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.8): The former `prolog_atoms' array is now called
+ `prolog_interface_atoms'.
+
+2007-04-11 Wednesday 06:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/Makefile.am (1.15): List cm_cleaner.sh and cm_splitter.sh
+ in dist_noinst_SCRIPTS, not noinst_SCRIPTS (problem reported by
+ Stefano Soffia).
+
+2007-04-03 Tuesday 18:04 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.90), Checked_Number.inlines.hh
+ (1.74), checked.defs.hh (1.41), checked_ext.inlines.hh (1.38),
+ checked_float.inlines.hh (1.77), checked_int.inlines.hh (1.60),
+ checked_mpq.inlines.hh (1.41), checked_mpz.inlines.hh (1.44):
+ Added idiv.
+
+2007-04-03 Tuesday 14:47 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (1.52): Corrected the method
+ Octagonal_Shape::relation_with(c) when the Octagonal_Shape is
+ based on integer coefficients and when the constraint `c' is `1
+ == 0'.
+
+2007-04-03 Tuesday 14:43 Elena Mazzi
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (1.6): Added two new
+ tests on `Octagonal_Shape::relation_with(c)'. Test18() shows a
+ bug in relation_with(const Constraint& c) when the constraint `c'
+ is `1 == 0'.
+
+2007-04-03 Tuesday 12:17 Elena Mazzi
+
+ * tests/Octagonal_Shape/: Makefile.am (1.18), fromspacedim1.cc
+ (1.1): New test program fromspacedim1.cc tests
+ Octagonal_Shape<N>::Octagonal_Shape(dimension_type,
+ Degenerate_Element).
+
+2007-04-03 Tuesday 11:44 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.64), fromspacedim1.cc (1.1): New
+ test program fromspacedim1.cc tests
+ BD_Shape<N>::BD_Shape(dimension_type, Degenerate_Element).
+
+2007-04-01 Sunday 18:57 Abramo Bagnara
+
+ * TODO (1.217): Fixed and cleaned TODO description.
+
+2007-04-01 Sunday 16:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.216): Added a new item concerning possible aliasing in
+ the arguments of a function.
+
+2007-04-01 Sunday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.215): Added new item concerning rem() and remp().
+
+2007-04-01 Sunday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.46), ppl_prolog_common.icc (1.7), track_allocation.hh (1.22):
+ Avoided conflicts with symbols defined in the new versions of
+ CiaoDE.
+
+2007-03-31 Saturday 19:27 Abramo Bagnara
+
+ * src/fpu.defs.hh (1.14): Give priority to faster architecture
+ dependent fpu control.
+
+2007-03-26 Monday 21:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.76): On platforms not providing
+ rintl() and not providing proper long doubles, make the
+ assumption that long double and double are the same type and use
+ rint() instead of rintl().
+
+2007-03-25 Sunday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.201): Corrected a wrong sign in the
+ paragraph about "Images and Preimages of Affine Transfer
+ Relations."
+
+2007-03-25 Sunday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.267), m4/Makefile.am (1.25),
+ m4/ac_cxx_proper_long_double.m4 (1.1): Check whether the C++
+ compiler provides proper long doubles.
+
+2007-03-24 Saturday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (1.6): Fixed test18() and
+ test19(). Drafted test20().
+
+2007-03-21 Wednesday 11:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem2.cc (1.2): Test modified so as to
+ propagate overflows and therefore interact correctly with macro
+ DO_TEST_OVERFLOW. The test overflows when using 8-bit
+ coefficients.
+
+2007-03-21 Wednesday 10:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.8): Test test02() does not overflow with
+ 64 bits integers.
+
+2007-03-20 Tuesday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/frombox1.cc (1.2): Test test05() overflows with all
+ bounded coefficients.
+
+2007-03-20 Tuesday 09:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.59): Use DIRTY_TEMP when allocating a
+ temporary Coefficient or mpq_class object. Use properly typed
+ temporaries in max_min(), so as to avoid errors when configured
+ to used bounded integer coefficients.
+
+2007-03-19 Monday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.58): Excessively optimistic assertions
+ just introduced replaced by canonicalization, which is required.
+ In the constructor of a Box from a polyhedron, do use Coefficient
+ temporaries when invoking the MIP solver.
+
+2007-03-19 Monday 16:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.52): The excessively optimistic assertions
+ just introduced replaced by canonicalization, which is indeed
+ required.
+
+2007-03-19 Monday 16:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.57): Useless canonnicalizations of mpq
+ rationals replaced by assertions. Simplified part of the code
+ for the construction of a Box starting from a generator system.
+ Avoid a couple of useless temporaries.
+
+2007-03-19 Monday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.92): A comment about the canonical
+ form of an mpq rational supported by corresponding assertion.
+
+2007-03-19 Monday 15:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.51): A few useless canonicalizations of mpq
+ rationals replaced by assertions.
+
+2007-03-19 Monday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.35), frombdshape1.cc (1.1): Test
+ Box::Box(const BD_Shape&, Complexity_Class).
+
+2007-03-19 Monday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: globals.cc (1.26), globals.defs.hh (1.47): Removed useless
+ inline directives in function declarations that are not
+ definitions. Added helper function bool is_canonical(const
+ mpq_class& ); to be used in assertions.
+
+2007-03-19 Monday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh (1.47): Grid::Grid(const Box<Interval>&) made
+ explicit.
+
+2007-03-19 Monday 13:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.56): Fixed Box<Interval>::Box(const
+ BD_Shape<T>&, Complexity_Class).
+
+2007-03-19 Monday 13:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.55): We were using Interval::lower_set()
+ instead of Interval::lower_set_uninit() in
+ Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class).
+ Several assert(OK()) were missing.
+
+2007-03-18 Sunday 17:26 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (1.40): Removed unused formal
+ argument.
+
+2007-03-18 Sunday 16:53 Abramo Bagnara
+
+ * src/: checked_int.inlines.hh (1.59), checked_mpq.inlines.hh
+ (1.39), checked_mpz.inlines.hh (1.43): Fixed construct from
+ special value.
+
+2007-03-18 Sunday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.34), frombox1.cc (1.1): Test
+ Box<Interval>::Box(const Box<Other_Interval>&).
+
+2007-03-18 Sunday 14:01 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (1.38): Removed unused argument.
+
+2007-03-18 Sunday 13:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.54): Added tests against exceeding the
+ maximum space dimension. Optimized
+ Box<Interval>::add_space_dimensions_and_project(dimension_type).
+
+2007-03-18 Sunday 12:21 Abramo Bagnara
+
+ * src/Box.templates.hh (1.53): Fixed typo.
+
+2007-03-18 Sunday 12:13 Abramo Bagnara
+
+ * src/Box.templates.hh (1.52): Cleaned Box constructor from Grid.
+
+2007-03-18 Sunday 12:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.51): Added tests against exceeding the
+ maximum space dimension.
+
+2007-03-18 Sunday 12:02 Abramo Bagnara
+
+ * src/Box.templates.hh (1.50): Cleaned Box constructor from
+ Octagon.
+
+2007-03-18 Sunday 11:59 Abramo Bagnara
+
+ * src/Box.templates.hh (1.49): Cleaned Box constructor from
+ Polyhedron.
+
+2007-03-18 Sunday 11:41 Abramo Bagnara
+
+ * src/Box.templates.hh (1.48): Substituted refine with narrow in
+ refine_no_check.
+
+2007-03-18 Sunday 11:34 Abramo Bagnara
+
+ * src/: Box.templates.hh (1.47), Checked_Number.defs.hh (1.89),
+ Checked_Number.inlines.hh (1.73), checked_ext.inlines.hh (1.37),
+ checked_float.inlines.hh (1.75): Added support for inexact
+ checking.
+
+2007-03-18 Sunday 11:05 Abramo Bagnara
+
+ * src/Box.templates.hh (1.46): Fixed comparison.
+
+2007-03-18 Sunday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.45): Marked the places in
+ Box<Interval>::refine_no_check(const Constraint&) where the
+ inexact flag must be reset.
+
+2007-03-18 Sunday 11:01 Abramo Bagnara
+
+ * src/Box.templates.hh (1.44): Undone last commit.
+
+2007-03-18 Sunday 10:54 Abramo Bagnara
+
+ * src/Box.templates.hh (1.43): Fixed comparison.
+
+2007-03-18 Sunday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.42): Box<Interval>::Box(const
+ Generator_System&) simplified and adorned with FIXMEs.
+
+2007-03-18 Sunday 10:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.41): Box<Interval>::Box(const
+ Box<Other_Interval>&) simplified.
+
+2007-03-18 Sunday 09:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.25), src/Box.templates.hh (1.40),
+ tests/Box/Makefile.am (1.33), tests/Box/fromspacedim1.cc (1.1):
+ Box<Interval>::Box(dimension_type, Degenerate_Element) rewritten
+ exploiting the fact that marked empty boxes do not impose any
+ constraint on the intervals apart from the fact that their memory
+ has been allocated. Box<Interval>::OK() has been changed
+ accordingly. New test program fromspacedim1.cc tests
+ Box<Interval>::Box(dimension_type, Degenerate_Element).
+ Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class) modified
+ to exploit the new interval construction mechanisms.
+
+2007-03-18 Sunday 08:40 Abramo Bagnara
+
+ * src/: BD_Shape.inlines.hh (1.142), BD_Shape.templates.hh (1.76),
+ Boundary.defs.hh (1.7), Box.inlines.hh (1.17), Box.templates.hh
+ (1.39), Checked_Number.cc (1.11), Checked_Number.defs.hh (1.88),
+ Checked_Number.inlines.hh (1.72), DB_Matrix.inlines.hh (1.32),
+ DB_Row.templates.hh (1.5), Interval.defs.hh (1.39),
+ Interval_Info.defs.hh (1.4), Interval_Restriction.defs.hh (1.5),
+ OR_Matrix.inlines.hh (1.7), Octagonal_Shape.inlines.hh (1.15),
+ Octagonal_Shape.templates.hh (1.51), Temp.defs.hh (1.4),
+ checked.defs.hh (1.40), checked.inlines.hh (1.36),
+ checked_ext.inlines.hh (1.36), checked_float.inlines.hh (1.74),
+ checked_int.inlines.hh (1.58), checked_mpq.inlines.hh (1.37),
+ checked_mpz.inlines.hh (1.42), checked_numeric_limits.hh (1.20),
+ globals.defs.hh (1.46), meta_programming.hh (1.5): Removed
+ special values classes. Changed interface to interval
+ construction and modify.
+
+2007-03-17 Saturday 12:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.9): test01(), test03() and test04() will
+ fail with 8-bit coefficients.
+
+2007-03-16 Friday 21:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.7): Restored test02().
+
+2007-03-16 Friday 20:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.8): Completed test07().
+
+2007-03-16 Friday 20:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.38): Removed spurious assignment `t_bound
+ = 0' from Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-16 Friday 19:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.7): Test test07() shows a bug in refine()
+ when handling an equality constraint.
+
+2007-03-16 Friday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.6): Fixed test06().
+
+2007-03-16 Friday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.81), devref.doxyconf-latex.in
+ (1.20): Updated the list of files from which to harvest the
+ documentation for developers.
+
+2007-03-16 Friday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.5): New test added.
+
+2007-03-16 Friday 15:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.24), Box.templates.hh (1.37): Comment with
+ the implementation details of
+ Box<Interval>::refine_no_check(const Constraint&) adapted to
+ Doxygen and moved before the declaration in Box.defs.hh.
+
+2007-03-16 Friday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (1.27): Fixed some Doxygen
+ references.
+
+2007-03-16 Friday 14:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-c-interface.doxyconf-html.in (1.2),
+ devref-c-interface.doxyconf-latex.in (1.2),
+ devref-prolog-interface.doxyconf-html.in (1.2),
+ devref-prolog-interface.doxyconf-latex.in (1.2),
+ devref.doxyconf-html.in (1.80), devref.doxyconf-latex.in (1.19),
+ user-c-interface.doxyconf-html.in (1.2),
+ user-c-interface.doxyconf-latex.in (1.2),
+ user-prolog-interface.doxyconf-html.in (1.2),
+ user-prolog-interface.doxyconf-latex.in (1.2),
+ user.doxyconf-html.in (1.39), user.doxyconf-latex.in (1.10):
+ Updated for the new versions of Doxygen.
+
+2007-03-13 Tuesday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.23), Box.templates.hh (1.36): New
+ implementation of Box<Interval>::refine_no_check(const
+ Constraint&). Added declaration and fake definition for
+ Box<Interval>::limited_CC76_extrapolation_assign(const Box&,
+ const Constraint_System&, unsigned).
+
+2007-03-13 Tuesday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.38): New template <typename
+ Interval_Boundary_Type> struct Select_Temp_Boundary_Type is an
+ helper class to select the appropriate numerical type to perform
+ boundary computations so as to reduce the chances of overflow
+ without incurring too much overhead.
+
+2007-03-13 Tuesday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.6): Temporarily disabled test02().
+
+2007-03-13 Tuesday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.4): Improved test01().
+
+2007-03-13 Tuesday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/relations1.cc (1.17), BD_Shape/relations2.cc
+ (1.21), BD_Shape/relations3.cc (1.25),
+ Octagonal_Shape/relatwithcons1.cc (1.3),
+ Octagonal_Shape/relatwithcons2.cc (1.5),
+ Octagonal_Shape/relatwithgen1.cc (1.7): Output made consistent
+ with the rest of the testsuite.
+
+2007-03-13 Tuesday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.16),
+ Pointset_Powerset.templates.hh (1.13): Added void
+ Pointset_Powerset<PS>::refine(const Constraint&) and void
+ Pointset_Powerset<PS>::refine(const Constraint_System&).
+
+2007-03-13 Tuesday 15:52 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.75): Corrected the method
+ BD_Shape::relation_with(c) when the BD_Shape is based on integer
+ coefficients and when the constraint `c' is `1 == 0'.
+
+2007-03-13 Tuesday 15:49 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.63), relations3.cc (1.24): Test
+ relations3 abled. Added test17() that shows a bug in
+ BD_Shape::relation_with(const Constraint& c) when the constraint
+ `c' is `1 == 0'.
+
+2007-03-13 Tuesday 14:57 quartieri
+
+ * src/Octagonal_Shape_strong_closure4.hh (octagons.3): Removed a
+ useless code line.
+
+2007-03-13 Tuesday 14:55 quartieri
+
+ * tests/Octagonal_Shape/: Makefile.am, universal_incremental.cc,
+ universal_strong.cc (octagons.[4,1,1]): Added new tests on
+ strong_closure() and incremental_strong_closure().
+
+2007-03-13 Tuesday 12:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/bhrz03widening3.cc (1.14): Test test10()
+ completed and restored.
+
+2007-03-13 Tuesday 12:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.61): Applied a workaround in
+ private method select_H79_constraints() so as to correctly deal
+ with NNC polyhedra. A too strong assertion made weaker: due to
+ the value of the epsilon coordinate, the sign of the scalar
+ product can be anything when the polyhedra are NNC, the
+ constraint from x is strict and the generator from y is a point.
+
+2007-03-13 Tuesday 09:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Scalar_Products.cc (1.7): Added the definition of a
+ Scalar_Product::assign() variant that was declared but not
+ implemented.
+
+2007-03-12 Monday 20:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/bhrz03widening3.cc (1.13): Test test10() greatly
+ simplified, while still showing the assertion violation.
+
+2007-03-12 Monday 16:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/bhrz03widening3.cc (1.12): Added a test showing
+ an assertion violation for the BHRZ03 widening.
+
+2007-03-12 Monday 14:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.35): Th eimplementation of affine_image
+ and affine_preimage changed so as to use Tmp_Interval_Type. Also
+ corrected a type in affine_preimage.
+
+2007-03-12 Monday 14:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (1.22): Added typedef Tmp_Interval_Type for the
+ interval datatype that has to be used when performing internal
+ computations and trying to avoid the accumulation of rounding
+ errors. As for now, this is defined to be the same as Interval.
+
+2007-03-11 Sunday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.15),
+ Pointset_Powerset.templates.hh (1.12): Added method bool
+ contains_integer_point() const.
+
+2007-03-11 Sunday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (1.2): No longer mention
+ README.configure.
+
+2007-03-10 Saturday 23:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.3): Expected results fixed.
+
+2007-03-10 Saturday 23:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.32), refine3.cc (1.1): New test that
+ triggers a bug in the Box class.
+
+2007-03-10 Saturday 21:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.5): test02() fails with 64-bit or smaller
+ coefficients.
+
+2007-03-10 Saturday 16:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.21), Box.inlines.hh (1.16): Assignment
+ operator added.
+
+2007-03-10 Saturday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.81): Fixed a couple of comments.
+
+2007-03-10 Saturday 12:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.62): For boxes, check_result_i() prints now
+ more information in case containment does not hold.
+
+2007-03-10 Saturday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.4): Tests that do not require a watchdog
+ timer moved to refine1.cc. Remaining tests improved:
+ known_result computed precisely and reduced the compilation time
+ by resorting to ascii_load() methods.
+
+2007-03-10 Saturday 12:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine1.cc (1.2): Tests that do not require a watchdog
+ timer moved from refine1.cc.
+
+2007-03-10 Saturday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.37): Drafted bool
+ ascii_load(std::istream&) and template <typename Boundary,
+ typename Info> std::istream& operator>>(std::istream&
+ Interval<Boundary, Info>&).
+
+2007-03-09 Friday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.34): Fixed Box<Interval>::Box(const
+ Box<Other_Interval>&).
+
+2007-03-09 Friday 19:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.33): Improved
+ Box<Interval>::ascii_dump(std::ostream&).
+
+2007-03-09 Friday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.36): Interval::ascii_dump(ostream&)
+ correctly (and simply) implemented.
+
+2007-03-09 Friday 19:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/: Makefile.am (1.3), mipproblem1.cc (1.4),
+ mipproblem2.cc (1.1): New program mipproblem2.cc to test the
+ MIP_Problem class with instances that require a watchdog timer.
+ Test from mipproblem1.cc adapted and moved here.
+
+2007-03-09 Friday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.50): The maybe_abandon() function is now
+ called in the right places.
+
+2007-03-09 Friday 18:07 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.49): Call `maybe_abandon()' each time a new
+ vertex is explored.
+
+2007-03-09 Friday 18:02 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.48): Call `maybe_abandon()' each time the
+ simplex algorithm is involved.
+
+2007-03-09 Friday 16:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.3): Completed test01(). Four more tests
+ added (one of them is currently disabled, as it seems to trigger
+ a bug somewhere).
+
+2007-03-09 Friday 15:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.31), cc76narrowing1.cc (1.4): Restored
+ test cc76narrowing1.
+
+2007-03-09 Friday 15:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.20), Box.templates.hh (1.32): Drafted
+ implementation of CC76_narrowing_assign().
+
+2007-03-09 Friday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.30): Restored bgp99extrapolation1 and
+ bhz03widening1.
+
+2007-03-09 Friday 14:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.29), maxspacedim1.cc (1.4): Restored
+ test maxspacedim1.cc.
+
+2007-03-09 Friday 14:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.28): Restored test affinepreimage1.cc.
+
+2007-03-09 Friday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/affineimage1.cc (1.6): Distances recomputed for test08.
+
+2007-03-09 Friday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/cc76extrapolation1.cc (1.18),
+ Octagonal_Shape/cc76extrapolation1.cc (1.4): Use the new typedef
+ coefficient_type_base.
+
+2007-03-09 Friday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.98), Grid.defs.hh (1.46),
+ Octagonal_Shape.defs.hh (1.26), Polyhedron.defs.hh (1.316): Added
+ public typedef coefficient_type to Polyhedron and Grid. Typedef
+ base_type renamed as coefficient_base_type for BDSs and OSs.
+
+2007-03-09 Friday 12:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.27), affineimage1.cc (1.5): Test
+ affineimage1.cc restored.
+
+2007-03-09 Friday 12:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/max_min1.cc (1.5): Use new macro.
+
+2007-03-09 Friday 12:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.61): Filled in the stub implementation of
+ check_result for Box. Macro DO_TEST_MAY_OVERFLOW_IF_FLOAT
+ improved and renamed as DO_TEST_MAY_OVERFLOW_IF_INEXACT.
+
+2007-03-09 Friday 12:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh (1.15), Box.templates.hh (1.31): Added
+ implementations of functions computing distances between boxes.
+
+2007-03-09 Friday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (1.19): Added declarations for functions that
+ compute distances between boxes.
+
+2007-03-09 Friday 08:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.37): Added a paragraph describing DO_TEST_Fxxx
+ macros.
+
+2007-03-08 Thursday 19:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.73): Removed trailing whitespace.
+
+2007-03-08 Thursday 16:30 quartieri
+
+ * tests/Octagonal_Shape/incremental1.cc (octagons.3): Removed debug
+ informations.
+
+2007-03-08 Thursday 15:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/max_min1.cc (1.4): Tests test07() and test08() may
+ overflow when TBox has been instantiated with a floating point
+ datatype.
+
+2007-03-08 Thursday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.60): Added macro DO_TEST_OVERFLOW which
+ checks that a failure in a test is actually motivated by an
+ overflow. The new macro used instead of DO_TEST_F (which was
+ accepting any kind of failure) when defining macros DO_TEST_Fxx.
+
+ Added new macro DO_TEST_MAY_OVERFLOW_WITH_FLOAT to be used when a
+ test may cause an overflow only when one of the domains
+ supporting floating points (i.e., Box, BD_Shape and
+ Octagonal_Shape) is actually instantiated with a floating point
+ datatype.
+
+2007-03-08 Thursday 14:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: relations1.cc (1.4), relations2.cc (1.2): Noisy
+ output standardized.
+
+2007-03-08 Thursday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/refine2.cc (1.2): Fixed test01().
+
+2007-03-08 Thursday 14:11 quartieri
+
+ * tests/Octagonal_Shape/incremental1.cc (octagons.2): Truncate
+ random coefficients to 1000.
+
+2007-03-08 Thursday 13:41 quartieri
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+ (octagons.[18,57]): Unused function removed.
+
+2007-03-08 Thursday 13:39 quartieri
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+ (octagons.[17,56]): Added a temporary function to count the
+ infinities in the Octagonal_Shape.
+
+2007-03-08 Thursday 13:03 quartieri
+
+ * src/: Octagonal_Shape.templates.hh,
+ Octagonal_Shape_incremental_strong_closure1.hh,
+ Octagonal_Shape_incremental_strong_closure10.hh,
+ Octagonal_Shape_incremental_strong_closure4.hh,
+ Octagonal_Shape_incremental_strong_closure5.hh,
+ Octagonal_Shape_incremental_strong_closure6.hh,
+ Octagonal_Shape_incremental_strong_closure7.hh,
+ Octagonal_Shape_incremental_strong_closure8.hh,
+ Octagonal_Shape_incremental_strong_closure9.hh,
+ Octagonal_Shape_strong_closure1.hh,
+ Octagonal_Shape_strong_closure2.hh,
+ Octagonal_Shape_strong_closure4.hh, script_flags.hh
+ (octagons.[55,4,5,4,4,4,4,4,4,2,3,2,2]): Added possibility to
+ count operations.
+
+2007-03-08 Thursday 13:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rational_Box.hh (1.5), tests/ppl_test.hh (1.59): Intervals
+ used in the Box class can be empty.
+
+2007-03-08 Thursday 13:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.214): Adde another entry.
+
+2007-03-08 Thursday 13:02 quartieri
+
+ * src/: Octagonal_Shape_incremental_strong_closure2.hh,
+ Octagonal_Shape_incremental_strong_closure3.hh (octagons.[4,4]):
+ Corrected both incomplete algorithms.
+
+2007-03-08 Thursday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.108): Use special flags only for
+ the compilation of Watchdog1.
+
+2007-03-08 Thursday 08:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (1.14), src/Box.templates.hh (1.30),
+ tests/Box/Makefile.am (1.26), tests/Box/addconstraints1.cc (1.7),
+ tests/Box/refine1.cc (1.1), tests/Box/refine2.cc (1.1): Drafted a
+ first version of Box<Interval>::refine_no_check(const
+ Constraint_System&). New test programs refine1.cc and
+ refine2.cc: the latter is for tests possibly requiring a watchdog
+ timer.
+
+2007-03-07 Wednesday 17:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.141), BD_Shape.templates.hh (1.74):
+ Reverted previous change (i.e., restored implementation of
+ time_elapse exploiting polyhedra).
+
+2007-03-07 Wednesday 17:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/timeelapse1.cc (1.19): New test shows a bug in the
+ (just added) direct implementation of
+ BD_Shape<T>::time_elapse_assign().
+
+2007-03-07 Wednesday 15:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.140), BD_Shape.templates.hh (1.73):
+ The implementation of method BD_Shape<T>::time_elapse_assign() no
+ longer relies on the corresponding method of class Polyhedron.
+
+2007-03-07 Wednesday 09:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.cc (1.5), Box.defs.hh (1.18), Box.templates.hh (1.29):
+ Interface of private method extract_interval_constraint() made
+ more intuitive. Consequently adapted methods
+ add_constraint_no_check() and relation_with().
+
+2007-03-06 Tuesday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.28), tests/Box/addconstraints1.cc (1.6):
+ Revised Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 21:15 Abramo Bagnara
+
+ * src/Boundary.defs.hh (1.6): Moved assert to right place.
+
+2007-03-06 Tuesday 19:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.27): Revised void
+ Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.17), src/Box.inlines.hh (1.13),
+ src/Box.templates.hh (1.26), tests/Box/addconstraints1.cc (1.5):
+ Added the declarations for void Box<Interval>::refine(const
+ Constraint&) and void Box<Interval>::refine(const
+ Constraint_System&). Drafted an implementation for the former.
+ Commented-out test06() in tests/Box/addconstraints1.cc is meant
+ to test it (will be moved elsewhere when the final name of the
+ method is decided).
+
+2007-03-06 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/pointsetpowerset1.cc (1.2): Started drafting a couple
+ of new tests.
+
+2007-03-06 Tuesday 12:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.25): Restored test timeelapse1.cc.
+
+2007-03-06 Tuesday 12:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.16), Box.templates.hh (1.25): Drafted
+ implementation for time_elapse_assign().
+
+2007-03-06 Tuesday 11:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.12): Call
+ Parma_Polyhedra_Library::max_space_dimension().
+
+2007-03-06 Tuesday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/max_space_dimension.hh (1.12): Take boxes into account (with
+ FIXME).
+
+2007-03-06 Tuesday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (octagons.14): If EXTRA_ROW_DEBUG is not
+ defined, define it to 0, not 1.
+
+2007-03-06 Tuesday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.107), writeconsys1.cc (1.10):
+ Test completed and FIXME resolved.
+
+2007-03-06 Tuesday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (1.10): FIXME resolved.
+
+2007-03-06 Tuesday 07:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/writerelation1.cc (1.12): This test program was
+ not testing anything: fixed.
+
+2007-03-05 Monday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim1.cc (1.3): This test program
+ was not testing anything: fixed.
+
+2007-03-05 Monday 21:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim1.cc (1.3): This test program was not
+ testing anything: fixed.
+
+2007-03-05 Monday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/writebdshape1.cc (1.9): This test program was not
+ testing anything: fixed.
+
+2007-03-05 Monday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Direct_Product.inlines.hh (1.30), Grid.defs.hh (1.45),
+ Grid.templates.hh (1.30): Method Grid::get_covering_box() now
+ takes as parameter a reference to an object of class
+ Parma_Polyhedra_Library::Box.
+
+2007-03-05 Monday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.45): No longer use private Box methods.
+
+2007-03-05 Monday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.15), Box.inlines.hh (1.12), Grid.defs.hh
+ (1.44): Got rid of methods Box::raise_lower_bound() and
+ Box::lower_upper_bound().
+
+2007-03-05 Monday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.14), Box.inlines.hh (1.11): Privatized const
+ Interval& Box<Interval>::operator[](dimension_type k) const.
+ Drafted const Interval& Box<Interval>::get_interval(Variable)
+ const and void Box<Interval>::set_interval(Variable, const
+ Interval&).
+
+2007-03-05 Monday 17:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: coveringbox1.cc (1.15), coveringbox2.cc (1.13),
+ directproduct1.cc (1.27): Removed raise_lower_bound and
+ lower_upper_bound
+
+2007-03-05 Monday 10:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.13), Box.inlines.hh (1.10): Added
+ declaration and fake definitions for bool
+ Box<Interval>::box_hull_assign_if_exact(const Box&) and bool
+ Box<Interval>::upper_bound_assign_if_exact(const Box&).
+
+2007-03-05 Monday 09:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.24), fromdirectproduct1.cc (1.4):
+ Program fromdirectproduct1.cc revised (with one FIXME) and
+ activated.
+
+2007-03-04 Sunday 23:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.19): Even test03() overflows when
+ using 16 bit checked integers.
+
+2007-03-04 Sunday 23:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.18): Another test showing that even
+ two applications of Floyd-Warshall may not be enough to obtain
+ shortest path closure when using floating points.
+
+2007-03-04 Sunday 23:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.17): Test test02() overflows when
+ using 16bit checked integers.
+
+2007-03-04 Sunday 23:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.16): Test test02() shows a simple
+ example where the Floyd-Warshall algorithm fails to compute
+ shortest path closure due to floating point approximations.
+
+2007-03-04 Sunday 22:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.30): Remove
+ unwanted previously commented m4 code.
+
+2007-03-04 Sunday 22:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.44): Remove temporarily commented old code.
+
+2007-03-04 Sunday 22:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.43): Avoid generating code "From_Bounding_Box" Also avoid
+ using raise_lower_bound and lower_upper_bound.
+
+2007-03-04 Sunday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.205), interfaces/C/ppl_interface_generator_c_cc_code.m4
+ (1.15), interfaces/C/ppl_interface_generator_c_cc_preamble (1.9),
+ src/C_Polyhedron.defs.hh (1.47), src/C_Polyhedron.inlines.hh
+ (1.35), src/Direct_Product.defs.hh (1.34),
+ src/Direct_Product.inlines.hh (1.29), src/Grid.defs.hh (1.43),
+ src/Grid.templates.hh (1.29), src/NNC_Polyhedron.defs.hh (1.49),
+ src/NNC_Polyhedron.inlines.hh (1.36), src/globals.defs.hh (1.45),
+ tests/ppl_test.hh (1.58), tests/Box/fromgrid1.cc (1.4),
+ tests/Box/frompolyhedron2.cc (1.8), tests/Grid/boundingbox1.cc
+ (1.18), tests/Grid/directproduct1.cc (1.26),
+ tests/Polyhedron/frombox1.cc (1.3), tests/Polyhedron/frombox2.cc
+ (1.3): The constructors
+
+ template <typename Box> C_Polyhedron(const Box&,
+ From_Bounding_Box),
+ template <typename Box> NNC_Polyhedron(const Box&,
+ From_Bounding_Box) and
+ template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+ have been removed in favor of
+
+ template <typename Interval> C_Polyhedron(const
+ Box<Interval>&),
+ template <typename Interval> NNC_Polyhedron(const
+ Box<Interval>&) and
+ template <typename Interval> Grid(const Box<Interval>&).
+
+2007-03-04 Sunday 18:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.templates.hh (1.28), tests/Grid/boundingbox1.cc (1.17):
+ Use add_constraint() instead of raise_lower_bound() and
+ lower_upper_bound()
+
+2007-03-04 Sunday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.23): Testing with intervals with long
+ double boundaries enabled again.
+
+2007-03-04 Sunday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.24): Fixed Box<Interval>::max_min().
+
+2007-03-04 Sunday 17:43 Abramo Bagnara
+
+ * src/: Boundary.defs.hh (1.5), Checked_Number.defs.hh (1.87),
+ Checked_Number.inlines.hh (1.71): Added more versatile comparison
+ functions.
+
+2007-03-04 Sunday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (1.33): Removed declaration for void
+ get_covering_box(Box&) const.
+
+2007-03-04 Sunday 17:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/frombox2.cc (1.2): No longer use
+ Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: empty1.cc (1.4), fromdirectproduct1.cc (1.3),
+ fromgrid1.cc (1.3), frompolyhedron2.cc (1.7): No longer use
+ Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/frombox1.cc (1.2): No longer use
+ Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.66), Determinate.inlines.hh (1.56),
+ Determinate.types.hh (1.10), Pointset_Ask_Tell.defs.hh (1.8),
+ Pointset_Ask_Tell.inlines.hh (1.3),
+ Pointset_Ask_Tell.templates.hh (1.8), Pointset_Ask_Tell.types.hh
+ (1.3), Pointset_Powerset.defs.hh (1.14),
+ Pointset_Powerset.inlines.hh (1.7),
+ Pointset_Powerset.templates.hh (1.11): Type variable `PH' renamed
+ `PS'.
+
+2007-03-04 Sunday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.22), pointsetpowerset1.cc (1.1): New
+ program to test Pointset_Powerset<PH> with boxes. Temporarily
+ disable testing with intervals with long double boundaries.
+
+2007-03-04 Sunday 10:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.213), src/Pointset_Powerset.defs.hh (1.13),
+ src/Pointset_Powerset.templates.hh (1.10): Added
+ Pointset_Powerset<PH>::affine_image(Variable, const
+ Linear_Expression&, Coefficient_traits::const_reference). Many
+ other methods of Pointset_Powerset are missing.
+
+2007-03-04 Sunday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.23), tests/Box/intersection1.cc (1.5):
+ Fixed Box<Interval>::intersection_assign(const Box&): it was not
+ dealing properly with the emptiness flags.
+
+2007-03-03 Saturday 23:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/frompolyhedron1.cc (1.10): Test test14() fails with all
+ bounded integer types.
+
+2007-03-03 Saturday 22:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.21), max_min1.cc (1.3): Restored
+ max_min1.cc after disabling some of the tests that necessarily
+ fail on floating point datatypes (to be improved so as to allow
+ for approximations).
+
+2007-03-03 Saturday 22:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.22): Corrected method is_universe().
+
+2007-03-03 Saturday 21:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.21): Added a few missing interval
+ initializations; marked by FIXMEs so as to be improved when we
+ will have a richer set of intervals' constructors.
+
+2007-03-03 Saturday 21:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.20), relations2.cc (1.1): Testing
+ methods relation_with().
+
+2007-03-03 Saturday 21:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.12), Box.templates.hh (1.20): Drafted
+ implementations of methods relation_with().
+
+2007-03-03 Saturday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.212): New item added.
+
+2007-03-03 Saturday 20:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.19): Support parallel builds.
+
+2007-03-03 Saturday 18:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.211): New item added.
+
+2007-03-03 Saturday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompolyhedron1.cc (1.9): Drafted a more complex test.
+
+2007-03-03 Saturday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompolyhedron2.cc (1.6): Comment revised.
+
+2007-03-03 Saturday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/frompolyhedron2.cc (1.5): Test Box::Box(const
+ NNC_Polyhedron&, Complexity_Class).
+
+2007-03-03 Saturday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.106), frombox2.cc (1.1): Test
+ NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.18): Check Box::Box(const Polyhedron&,
+ Complexity_Class) also with NNC polyhedra.
+
+2007-03-03 Saturday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: frompolyhedron1.cc (1.8), frompolyhedron2.cc (1.4),
+ frompolyhedron4.cc (1.3): Tests for Box::Box(const Polyhedron&,
+ Complexity_Class) reorganized.
+
+2007-03-03 Saturday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.105), frombox1.cc (1.1): Test
+ C_Polyhedron(const Box&, From_Bounding_Box) and
+ NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.57): Define BOX_INSTANCE if it is not
+ already defined.
+
+2007-03-03 Saturday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.17), frompolyhedron1.cc (1.7),
+ frompolyhedron2.cc (1.3): Adapted tests in frompolyhedron2.cc.
+ Program max_min1 temporarily disabled (it fails).
+
+2007-03-03 Saturday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.56), Box/Makefile.am (1.16), Box/run_tests
+ (1.2): Test class Box with multiple instantiations of the
+ Interval parameter.
+
+2007-03-03 Saturday 15:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: frompolyhedron1.cc (1.6), frompolyhedron3.cc (1.3):
+ Test in frompolyhedron3.cc is now included in frompolyhedron1.cc.
+
+2007-03-03 Saturday 12:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/bdsdifference1.cc (1.14),
+ BD_Shape/bhmz05widening1.cc (1.14), BD_Shape/expandspacedim1.cc
+ (1.3), BD_Shape/foldspacedims1.cc (1.5),
+ BD_Shape/limitedbhmz05extrapolation1.cc (1.13),
+ BD_Shape/limitedcc76extrapolation1.cc (1.14),
+ BD_Shape/limitedh79extrapolation1.cc (1.13),
+ BD_Shape/timeelapse1.cc (1.18), Box/bdsdifference1.cc (1.4),
+ Box/boxdifference1.cc (1.5), Box/expandspacedim1.cc (1.5),
+ Box/foldspacedims1.cc (1.6), Box/timeelapse1.cc (1.4),
+ Octagonal_Shape/expandspacedim1.cc (1.4),
+ Octagonal_Shape/foldspacedims1.cc (1.4),
+ Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.4),
+ Octagonal_Shape/limitedcc76extrapolation1.cc (1.4),
+ Octagonal_Shape/timeelapse1.cc (1.4): Noisy output improved.
+
+2007-03-03 Saturday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: addcongruences1.cc (1.10), addconstraint1.cc
+ (1.10), addconstraints1.cc (1.11), addconstraints2.cc (1.10),
+ addgenerator1.cc (1.11), addgenerator2.cc (1.11),
+ addgenerators1.cc (1.12), addgenerators2.cc (1.11),
+ addspacedims1.cc (1.11), addspacedims2.cc (1.11), affineimage1.cc
+ (1.11), affinepreimage1.cc (1.10), append1.cc (1.11), append2.cc
+ (1.10), bhrz03widening1.cc (1.10), bhrz03widening2.cc (1.10),
+ bhrz03widening3.cc (1.11), boundedaffineimage1.cc (1.10),
+ boundedaffinepreimage1.cc (1.8), boundedh79extrapolation1.cc
+ (1.11), concatenate1.cc (1.10), congruences1.cc (1.8),
+ dualhypercubes.cc (1.12), expandspacedim1.cc (1.12),
+ expandspacedim2.cc (1.12), foldspacedims1.cc (1.14),
+ foldspacedims2.cc (1.15), generalizedaffineimage1.cc (1.12),
+ generalizedaffineimage2.cc (1.12), generalizedaffinepreimage1.cc
+ (1.9), generalizedaffinepreimage2.cc (1.8), h79widening1.cc
+ (1.10), h79widening2.cc (1.10), intersection1.cc (1.14),
+ limitedbhrz03extrapolation1.cc (1.9), limitedh79extrapolation1.cc
+ (1.10), linearpartition1.cc (1.12), mapspacedims1.cc (1.13),
+ nncminimize1.cc (1.6), numberinput1.cc (1.31), permute.cc (1.8),
+ polydifference1.cc (1.11), polydifference2.cc (1.11),
+ polyhull1.cc (1.11), relations1.cc (1.10), removespacedims1.cc
+ (1.10), removespacedims2.cc (1.10), timeelapse1.cc (1.11),
+ timeelapse2.cc (1.11), topclosure1.cc (1.10), universe1.cc
+ (1.10), universe2.cc (1.10): Noisy output improved.
+
+2007-03-03 Saturday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: addcongruence1.cc (1.13), addcongruences1.cc (1.16),
+ addconstraint1.cc (1.11), addconstraints1.cc (1.12),
+ addgenerator1.cc (1.15), addgenerators1.cc (1.15),
+ addspacedims1.cc (1.14), affineimage1.cc (1.13), affineimage2.cc
+ (1.11), affinepreimage1.cc (1.12), affinepreimage2.cc (1.7),
+ bounded1.cc (1.13), boundedaffineimage1.cc (1.3),
+ boundedaffinepreimage1.cc (1.3), boundingbox1.cc (1.16),
+ generalizedaffineimage1.cc (1.13), generalizedaffineimage2.cc
+ (1.12), generalizedaffineimage3.cc (1.4),
+ generalizedaffinepreimage1.cc (1.15),
+ generalizedaffinepreimage2.cc (1.15),
+ generalizedaffinepreimage3.cc (1.4), grid1.cc (1.20),
+ limitedextrapolation1.cc (1.12), limitedextrapolation2.cc (1.6),
+ limitedextrapolation3.cc (1.5), partition1.cc (1.5), widening1.cc
+ (1.15), widening2.cc (1.10), widening3.cc (1.5): Enforced
+ consistency with the other tests.
+
+2007-03-02 Friday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.204), interfaces/C/ppl_c.h.in (1.71), src/Grid.defs.hh
+ (1.42): Last steps in the removal of the shrink_bounding_box()
+ methods.
+
+2007-03-02 Friday 21:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BBox.cc (1.14), BBox.hh (1.12), Makefile.am (1.262),
+ Box/frompolyhedron2.cc (1.2), Box/frompolyhedron3.cc (1.2),
+ Box/frompolyhedron4.cc (1.2): Class BBox phased out.
+
+2007-03-02 Friday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.11), Box.templates.hh (1.19): New private
+ methods void Box::add_constraint_no_check(const Constraint&) and
+ void Box::add_constraints_no_check(const Constraint_System&)
+ allow to optimize the addition of constraints to a box.
+
+2007-03-02 Friday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.10), src/Box.inlines.hh (1.9),
+ src/Box.templates.hh (1.18), src/Direct_Product.defs.hh (1.32),
+ src/Direct_Product.inlines.hh (1.28), tests/ppl_test.hh (1.55),
+ tests/Box/fromdirectproduct1.cc (1.2): Got rid of
+ Direct_Product::shrink_bounding_box() in favor of the constructor
+ Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+ Removed lots of x's.
+
+2007-03-02 Friday 18:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.266), src/Any_Pointset.defs.hh (1.11),
+ src/BD_Shape.cc (1.5), src/BD_Shape.defs.hh (1.97),
+ src/BHRZ03_Certificate.defs.hh (1.17), src/Bit_Matrix.defs.hh
+ (1.3), src/Bit_Row.defs.hh (1.5), src/Box.cc (1.4),
+ src/Box.defs.hh (1.9), src/Checked_Number.defs.hh (1.86),
+ src/Coefficient.types.hh (1.14),
+ src/Coefficient_traits_template.hh (1.8), src/Congruence.defs.hh
+ (1.19), src/Congruence_System.defs.hh (1.19),
+ src/Constraint_System.defs.hh (1.36), src/DB_Matrix.defs.hh
+ (1.27), src/DB_Matrix.inlines.hh (1.31),
+ src/DB_Matrix.templates.hh (1.5), src/DB_Row.defs.hh (1.22),
+ src/DB_Row.inlines.hh (1.21), src/DB_Row.templates.hh (1.4),
+ src/Determinate.defs.hh (1.65), src/Direct_Product.defs.hh
+ (1.31), src/Float.defs.hh (1.24), src/GMP_Integer.types.hh
+ (1.16), src/Generator.defs.hh (1.122),
+ src/Generator_System.defs.hh (1.23), src/Grid.defs.hh (1.41),
+ src/Grid_Certificate.defs.hh (1.5), src/Grid_Generator.defs.hh
+ (1.30), src/Grid_Generator_System.defs.hh (1.22),
+ src/Grid_nonpublic.cc (1.24), src/Init.defs.hh (1.18),
+ src/Linear_Row.defs.hh (1.24), src/Linear_System.defs.hh (1.31),
+ src/Linear_System.inlines.hh (1.22), src/MIP_Problem.defs.hh
+ (1.32), src/Matrix.defs.hh (1.81), src/OR_Matrix.defs.hh (1.8),
+ src/OR_Matrix.inlines.hh (1.6), src/Octagonal_Shape.cc (1.4),
+ src/Octagonal_Shape.defs.hh (1.25), src/Pointset_Ask_Tell.defs.hh
+ (1.7), src/Pointset_Powerset.cc (1.11),
+ src/Pointset_Powerset.defs.hh (1.12),
+ src/Pointset_Powerset.templates.hh (1.9), src/Polyhedron.defs.hh
+ (1.315), src/Polyhedron_nonpublic.cc (1.77),
+ src/Ptr_Iterator.defs.hh (1.9), src/Rational_Box.hh (1.4),
+ src/Row.cc (1.102), src/Row.defs.hh (1.110), src/Row.inlines.hh
+ (1.64), src/Scalar_Products.defs.hh (1.9), src/Topology.hh
+ (1.14), src/Variables_Set.defs.hh (1.6),
+ src/Widening_Function.defs.hh (1.17), src/algorithms.hh (1.48),
+ src/checked_numeric_limits.hh (1.19), src/compiler.hh (1.10),
+ src/distances.inlines.hh (1.4), src/globals.defs.hh (1.44),
+ src/iterator_to_const.defs.hh (1.5), src/meta_programming.hh
+ (1.4), src/mp_std_bits.defs.hh (1.4), src/namespaces.hh (1.11):
+ The `--enable-more-assertions' configure option can now be used
+ to enable all sorts of ABI-breaking extra assertion checking.
+ The `EXTRA_ROW_DEBUG' that was used in several places with
+ different meaning has now gone in favor of new symbols, all
+ characterized by the `PPL_' prefix. Commends of several #endif's
+ fixed.
+
+2007-03-02 Friday 18:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.62): Test relations3 temporarily
+ disabled.
+
+2007-03-02 Friday 17:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/relations3.cc (1.23): Test test16() shows a bug in
+ BD_Shape::relation_with(const Constraint& c) when the BD_Shape is
+ based on integer coefficients.
+
+2007-03-02 Friday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.8), Box.templates.hh (1.17),
+ Octagonal_Shape.defs.hh (1.24), Octagonal_Shape.templates.hh
+ (1.50): Got rid of Octagonal_Shape::shrink_bounding_box() in
+ favor of the constructor Box::Box(const Octagonal_Shape<T>&,
+ Complexity_Class).
+
+2007-03-02 Friday 17:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.16): Solved a few FIXMEs. Corrected
+ implementation of max_min().
+
+2007-03-02 Friday 16:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.15), addconstraints1.cc (1.4): Test
+ addconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.14), discrete1.cc (1.4): Test
+ discrete1 corrected and restored.
+
+2007-03-02 Friday 16:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh (1.8), Box.templates.hh (1.15): Method
+ constraints() no longer forces an emptyness check. Method
+ minimized_constraints() forces an emptyness check and also
+ detects equality constraints.
+
+2007-03-02 Friday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.13), minconstraints1.cc (1.4): Test
+ minconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 15:35 Abramo Bagnara
+
+ * src/Boundary.defs.hh (1.4): Added missing argument.
+
+2007-03-02 Friday 15:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.12), expandspacedim1.cc (1.4): Test
+ expandspacedim1.cc corrected and restored.
+
+2007-03-02 Friday 15:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.35): Drafted Interval::ascii_dump() to
+ help in debugging.
+
+2007-03-02 Friday 15:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh (1.7), Box.templates.hh (1.14): Corrected a
+ bug in Box::add_constraint() whereby a Box flagged as empty had
+ the flag removed after adding a new constraint.
+
+2007-03-02 Friday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (1.13), tests/Box/Makefile.am (1.11),
+ tests/Box/fromgrid1.cc (1.2): Constructor
+ Box<Interval>::Box(const Grid&, Complexity_Class) corrected.
+ Notice that this constructor is much less precise than it could
+ be in case the box is made of modulo intervals. Test program
+ fromgrid1.cc revised and activated.
+
+2007-03-02 Friday 14:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.10), equality1.cc (1.4): Test
+ equality1.cc corrected and restored.
+
+2007-03-02 Friday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boxhull1.cc (1.4): Test test08() shows a bug when
+ calling join_assign() on Interval.
+
+2007-03-02 Friday 14:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.9), intersection1.cc (1.4): Test
+ intersection1.cc corrected and restored.
+
+2007-03-02 Friday 14:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.8), max_min1.cc (1.2): Test
+ max_min1.cc corrected and restored.
+
+2007-03-02 Friday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.7), containsintegerpoint1.cc (1.5):
+ Improved and restored test on Box::contains_integer_points().
+
+2007-03-02 Friday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (1.34): Fixed
+ Interval::contains_integer_points() so as to correctly handle the
+ case of unbounded intervals.
+
+2007-03-02 Friday 12:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.12): Added a fast-fail test to
+ Box::contains_integer_point().
+
+2007-03-02 Friday 12:44 Abramo Bagnara
+
+ * src/Interval.defs.hh (1.33): Fixed typos.
+
+2007-03-02 Friday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.14),
+ interfaces/C/ppl_interface_generator_c_dat.m4 (1.11),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.8),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.42), src/BD_Shape.defs.hh (1.96), src/BD_Shape.templates.hh
+ (1.72), src/Box.defs.hh (1.7), src/Box.templates.hh (1.11),
+ src/Grid.defs.hh (1.40), src/Grid.templates.hh (1.27),
+ src/Grid_Generator.defs.hh (1.29), src/Polyhedron.defs.hh
+ (1.314), src/Polyhedron.templates.hh (1.13),
+ tests/Box/fromdirectproduct1.cc (1.1), tests/Box/fromgrid1.cc
+ (1.1), tests/Box/frompolyhedron1.cc (1.5),
+ tests/Box/frompolyhedron2.cc (1.1), tests/Box/frompolyhedron3.cc
+ (1.1), tests/Box/frompolyhedron4.cc (1.1), tests/Grid/Makefile.am
+ (1.47), tests/Grid/boundingbox2.cc (1.14),
+ tests/Grid/directproduct1.cc (1.25), tests/Polyhedron/Makefile.am
+ (1.104), tests/Polyhedron/boundingbox1.cc (1.15),
+ tests/Polyhedron/boundingbox2.cc (1.14),
+ tests/Polyhedron/boundingbox3.cc (1.15): Started getting rid of
+ BD_Shape::shrink_bounding_box() and Grid::shrink_bounding_box().
+
+2007-03-02 Friday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/containsintegerpoint1.cc (1.4): Test test04() shows a
+ bug in Interval::contains_integer_point().
+
+2007-03-02 Friday 10:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.6), affinedimension1.cc (1.5):
+ Restored test affinedimension1.
+
+2007-03-02 Friday 10:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/Makefile.am (1.5): Disabled some tests.
+
+2007-03-02 Friday 10:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boxdifference1.cc (1.4): Temporarily commented out
+ test07.
+
+2007-03-02 Friday 09:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Makefile.am (1.261): Enable checks in the Box directory.
+
+2007-03-02 Friday 09:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am (1.4), affinedimension1.cc (1.4),
+ max_min1.cc (1.1), run_tests (1.1): A first attempt at
+ distinguishing tests that compile, fail and succeed so as to
+ enable automatic checks. Work still in progress.
+
+2007-03-01 Thursday 14:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.9): Test no
+ longer fails with 8-bit checked integers and assertions disabled.
+
+2007-03-01 Thursday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.10), Polyhedron_widenings.cc
+ (1.60): Started getting rid of Polyhedron::shrink_bounding_box().
+
+2007-02-28 Wednesday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.19), TODO (1.210): Mention the fact that GCC
+ version 3.4.x are known to miscompile at least one of the
+ development snapshots that led to PPL 0.10. Mention also the
+ fact that GCC 3.3.3 segfaults on such a snapshot (CVS HEAD, at
+ least on x86_64).
+
+2007-02-28 Wednesday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_java_tests_common (simplex.1): file
+ ppl_java_tests_common was added on branch simplex on 2008-01-07
+ 11:15:29 +0000
+
+2007-02-28 Wednesday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.203), TODO (1.209), demos/ppl_lpsol/ppl_lpsol.c (1.68),
+ interfaces/C/ppl_c.h.in (1.70),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.8),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.7),
+ interfaces/Java/jni/ppl_java_common.cc (1.30),
+ interfaces/Java/tests/C_Polyhedron_test1.java (1.11),
+ interfaces/Java/tests/ppl_java_tests_common (1.7),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.6),
+ interfaces/OCaml/ppl_ocaml_globals.cc (1.9),
+ interfaces/OCaml/ppl_ocaml_types.ml (1.9),
+ interfaces/OCaml/test1.ml (1.29),
+ interfaces/Prolog/ppl_prolog_common.icc (1.6),
+ m4/ac_prog_javac.m4 (1.5), src/BD_Shape.templates.hh (1.71),
+ src/Box.inlines.hh (1.6), src/Box.templates.hh (1.10),
+ src/Grid_public.cc (1.51), src/Grid_simplify.cc (1.32),
+ src/Interval.defs.hh (1.32), src/MIP_Problem.cc (1.47),
+ src/Octagonal_Shape.templates.hh (1.49), src/Polyhedron_public.cc
+ (1.91), src/globals.types.hh (1.11),
+ tests/BD_Shape/affineimage1.cc (1.18),
+ tests/BD_Shape/foldspacedims1.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.16),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.20),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.14),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.15),
+ tests/BD_Shape/generalizedaffinepreimage3.cc (1.5),
+ tests/BD_Shape/removespacedims1.cc (1.19),
+ tests/Box/affineimage1.cc (1.4), tests/Box/foldspacedims1.cc
+ (1.5), tests/Box/generalizedaffineimage1.cc (1.4),
+ tests/Box/generalizedaffinepreimage1.cc (1.4),
+ tests/Box/removespacedims1.cc (1.5), tests/Grid/addgenerators1.cc
+ (1.14), tests/Grid/directproduct1.cc (1.24),
+ tests/Grid/generalizedaffineimage3.cc (1.3),
+ tests/Grid/generalizedaffinepreimage3.cc (1.3),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.9),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.3),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.8),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.8),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.4),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.3),
+ tests/Polyhedron/boundedaffineimage1.cc (1.9),
+ tests/Polyhedron/exceptions1.cc (1.13),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.11),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.11),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.8): All
+ identifiers containing the strings `less_than_or_equal' or
+ `greater_than_or_equal', any case, have been renamed so as to
+ contain `less_or_equal' or `greater_or_equal', respectively.
+
+2007-02-28 Wednesday 15:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh (1.5), Box.templates.hh (1.9): Drafted
+ implementations for provate helper functions bounds and max_min.
+ Added inline implementations of bounds_from_above/below and
+ maximize/minimize expliting the private helper functions.
+
+2007-02-28 Wednesday 15:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (1.6): Added methods bounds_from_above,
+ bounds_from_below, maximize and minimize, with versions computing
+ a generator; also added private helper functions.
+
+2007-02-28 Wednesday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.208), tests/Polyhedron/memory2.cc (1.13): All tests have
+ been converted to the new standards.
+
+2007-02-28 Wednesday 11:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affinepreimage1.cc (1.20): New test added.
+
+2007-02-28 Wednesday 10:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: Makefile.am (1.17), affinepreimage1.cc
+ (1.4), bug1.cc (1.4): Test program bug1.cc integrated into
+ affinepreimage1.cc.
+
+2007-02-28 Wednesday 10:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.61): Previous change completed.
+
+2007-02-28 Wednesday 10:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.60), affinepreimage1.cc (1.19),
+ affinepreimage2.cc (1.14): Test program affinepreimage2.cc merged
+ into affinepreimage1.cc.
+
+2007-02-28 Wednesday 09:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.202), src/Congruence_System.cc (1.23),
+ src/Congruence_System.defs.hh (1.18),
+ src/Congruence_System.inlines.hh (1.8), src/Constraint_System.cc
+ (1.22), src/Generator_System.cc (1.21), src/Grid.templates.hh
+ (1.26), src/Grid_Certificate.cc (1.7),
+ src/Grid_Generator_System.defs.hh (1.21),
+ src/Grid_Generator_System.inlines.hh (1.13), src/Grid_chdims.cc
+ (1.16), src/Grid_conversion.cc (1.19), src/Grid_nonpublic.cc
+ (1.23), src/Grid_public.cc (1.50), src/Grid_simplify.cc (1.31),
+ src/Grid_widenings.cc (1.14), src/Linear_System.cc (1.42),
+ src/Linear_System.inlines.hh (1.21), src/Polyhedron.templates.hh
+ (1.12), src/Polyhedron_chdims.cc (1.42),
+ src/Polyhedron_nonpublic.cc (1.76), src/Polyhedron_public.cc
+ (1.90), src/Polyhedron_widenings.cc (1.59), src/minimize.cc
+ (1.46): The new methods `bool Congruence_System::empty() const'
+ and `bool Grid_Generator_System::empty() const' return true if
+ and only if the system in question is empty. Method
+ Grid_Generator_System::num_generators() renamed num_rows(). All
+ these methods are now used consistently throughout the library.
+
+2007-02-27 Tuesday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.templates.hh (1.8), Polyhedron.templates.hh (1.11):
+ Fixed Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 19:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (1.7): Constructor taking a Polyhedron
+ rewritten from scratch.
+
+2007-02-27 Tuesday 19:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/frompolyhedron1.cc (1.4): Adjusted the known result.
+
+2007-02-27 Tuesday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (1.5), src/Box.inlines.hh (1.4),
+ src/Box.templates.hh (1.6), src/Interval.defs.hh (1.31),
+ tests/Box/cc76widening.cc (1.4), tests/Box/concatenate1.cc (1.4),
+ tests/Box/contains1.cc (1.4), tests/Box/disjoint1.cc (1.4),
+ tests/Box/foldspacedims1.cc (1.4), tests/Box/removespacedims1.cc
+ (1.4): Fourth merge from the `altnum' branch.
+
+2007-02-27 Tuesday 17:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/Box.defs.hh, src/Box.templates.hh,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Interval.defs.hh, src/Interval_Restriction.defs.hh,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.templates.hh, src/globals.defs.hh,
+ src/globals.inlines.hh
+ (altnum.[9,7,8,25,39,4,4,5,4,94,10,8,6,5,9,12,11,5,15,7]):
+ Eleventh merge of the main trunk to the `altnum' branch.
+
+2007-02-27 Tuesday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh (1.4), Box.templates.hh (1.5),
+ Polyhedron.templates.hh (1.10): New constructor `explicit
+ Box(const Polyhedron& ph, Complexity_Class complexity =
+ ANY_COMPLEXITY)' builds a box from the polyhedron `ph' taking
+ into account `complexity'. This is the beginning of the end of
+ Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.313), Polyhedron.inlines.hh (1.138):
+ New private method `Constraint_System simplified_constraints()
+ const' returns, if constraints are up-to-date, a simplified copy
+ of them. Class Polyhedron now befriends Box.
+
+2007-02-27 Tuesday 16:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.201), src/Constraint_System.defs.hh (1.35),
+ src/Constraint_System.inlines.hh (1.9),
+ src/Generator_System.defs.hh (1.22),
+ src/Generator_System.inlines.hh (1.8): The new methods `bool
+ Constraint_System::empty() const' and `bool
+ Generator_System::empty() const' return true if and only if the
+ constraint (resp., generator) system has no constraints (resp.,
+ generators).
+
+2007-02-27 Tuesday 16:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.80), Matrix.inlines.hh (1.51): New method
+ bool Matrix empty() const returns true if and only if *this has
+ no rows.
+
+2007-02-27 Tuesday 15:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: cc76widening.cc, foldspacedims1.cc,
+ removespacedims1.cc (altnum.[4,2,3]): Minor corrections to the
+ known results.
+
+2007-02-27 Tuesday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.38): Corrected a bug in
+ remove_space_dimensions(). Do not forget to handle the case of
+ an empty Box in CC76_widening_assign(). Drafted implementation
+ for fold_space_dimensions().
+
+2007-02-27 Tuesday 15:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.27): Drafted implementations for
+ max_space_dimension() and expand_space_dimension().
+
+2007-02-27 Tuesday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (altnum.24): Added declaration for
+ max_space_dimension().
+
+2007-02-27 Tuesday 14:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.37): Fixed an error in
+ CC76_widening_assign().
+
+2007-02-27 Tuesday 11:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: concatenate1.cc, cc76widening.cc (altnum.[3,3]): Let
+ it compile.
+
+2007-02-27 Tuesday 11:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: contains1.cc, disjoint1.cc (altnum.[2,2]): Adapted to
+ the Box domain.
+
+2007-02-27 Tuesday 11:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.36): Corrected method contains(): it
+ was not checking for emptyness of the first argument. Drafted
+ implementation for is_disjoint_from().
+
+2007-02-27 Tuesday 11:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.26): Added implementation for
+ strictly_contains().
+
+2007-02-27 Tuesday 10:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (altnum.23): Declared methods strictly_contains()
+ and is_disjoint_from(). Slightly improved the documentation for
+ method contains().
+
+2007-02-27 Tuesday 10:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.93): Drafted method
+ is_disjoint_from(). To be carefully checked.
+
+2007-02-27 Tuesday 09:46 Abramo Bagnara
+
+ * src/: Interval.defs.hh (1.30), Interval_Restriction.defs.hh
+ (1.4): Functions on restrictions need to return a state.
+
+2007-02-26 Monday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.139), BD_Shape.templates.hh (1.70),
+ Box.templates.hh (1.4), Makefile.am (1.169),
+ Octagonal_Shape.inlines.hh (1.14), Octagonal_Shape.templates.hh
+ (1.48), Old_Interval.cc (1.4), Old_Interval.defs.hh (1.4),
+ Old_Interval.inlines.hh (1.4), Old_Interval.types.hh (1.4),
+ Polyhedron.templates.hh (1.9), globals.defs.hh (1.43),
+ globals.inlines.hh (1.17): Got rid of Old_Interval and related
+ classes. Functions div_round_up(), is_additive_inverse(),
+ is_even(), max_assign(), min_assign() and numer_denom() moved to
+ globals.defs.hh and globals.inlines.hh. The method
+ Polyhedron::shrink_bounding_box() is now based on Box
+ constructors.
+
+2007-02-26 Monday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (1.8): Previous change reverted.
+
+2007-02-26 Monday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (1.7): Started getting rid of
+ Old_Interval.
+
+2007-02-26 Monday 11:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Boundary.defs.hh (1.3), src/Box.cc (1.3), src/Box.defs.hh
+ (1.3), src/Box.inlines.hh (1.3), src/Box.templates.hh (1.3),
+ src/Box.types.hh (1.3), src/C_Integer.hh (1.3),
+ src/Interval_Info.defs.hh (1.3), src/Interval_Info.inlines.hh
+ (1.3), src/Interval_Info.types.hh (1.3),
+ src/Interval_Restriction.defs.hh (1.3), src/Old_Interval.cc
+ (1.3), src/Old_Interval.defs.hh (1.3),
+ src/Old_Interval.inlines.hh (1.3), src/Old_Interval.types.hh
+ (1.3), src/Rational_Box.hh (1.3), src/Temp.defs.hh (1.3),
+ src/meta_programming.hh (1.3), src/mp_std_bits.cc (1.3),
+ src/mp_std_bits.defs.hh (1.3), src/mp_std_bits.inlines.hh (1.3),
+ tests/Box/Makefile.am (1.3), tests/Box/addconstraints1.cc (1.3),
+ tests/Box/addspacedims1.cc (1.3), tests/Box/affinedimension1.cc
+ (1.3), tests/Box/affineimage1.cc (1.3),
+ tests/Box/affinepreimage1.cc (1.3), tests/Box/ascii_dump_load1.cc
+ (1.3), tests/Box/bdsdifference1.cc (1.3),
+ tests/Box/bgp99extrapolation1.cc (1.3),
+ tests/Box/bhz03widening1.cc (1.3), tests/Box/bounded1.cc (1.3),
+ tests/Box/boundedaffineimage1.cc (1.3),
+ tests/Box/boxdifference1.cc (1.3), tests/Box/boxhull.cc (1.3),
+ tests/Box/boxhull1.cc (1.3), tests/Box/cc76narrowing1.cc (1.3),
+ tests/Box/cc76widening.cc (1.3), tests/Box/closure1.cc (1.3),
+ tests/Box/concatenate1.cc (1.3), tests/Box/constraints1.cc (1.3),
+ tests/Box/contains1.cc (1.3), tests/Box/containsintegerpoint1.cc
+ (1.3), tests/Box/discrete1.cc (1.3), tests/Box/disjoint1.cc
+ (1.3), tests/Box/empty1.cc (1.3), tests/Box/equality1.cc (1.3),
+ tests/Box/expandspacedim1.cc (1.3), tests/Box/foldspacedims1.cc
+ (1.3), tests/Box/fromgensys1.cc (1.3),
+ tests/Box/frompolyhedron1.cc (1.3),
+ tests/Box/generalizedaffineimage1.cc (1.3),
+ tests/Box/generalizedaffinepreimage1.cc (1.3),
+ tests/Box/geomcovers1.cc (1.3), tests/Box/intersection1.cc (1.3),
+ tests/Box/interval1.cc (1.3), tests/Box/interval2.cc (1.3),
+ tests/Box/mapspacedims1.cc (1.3), tests/Box/maxspacedim1.cc
+ (1.3), tests/Box/membytes1.cc (1.3), tests/Box/minconstraints1.cc
+ (1.3), tests/Box/relations1.cc (1.3),
+ tests/Box/removespacedims1.cc (1.3), tests/Box/timeelapse1.cc
+ (1.3), tests/Box/universe1.cc (1.3), tests/Box/writebox1.cc
+ (1.3): Copyright years extended.
+
+2007-02-26 Monday 10:38 Abramo Bagnara
+
+ * src/: checked.inlines.hh (1.35), checked_ext.inlines.hh (1.35):
+ Use different function names.
+
+2007-02-26 Monday 10:24 Abramo Bagnara
+
+ * src/: checked.inlines.hh, checked_ext.inlines.hh
+ (altnum.[33,15]): Use different function names.
+
+2007-02-25 Sunday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/.cvsignore (simplex.1): file .cvsignore was added on
+ branch simplex on 2008-01-07 11:15:36 +0000
+
+2007-02-25 Sunday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.265),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.7),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.41), interfaces/Prolog/ppl_prolog_common.icc (1.5),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.15),
+ interfaces/Prolog/SWI/Makefile.am (1.68),
+ interfaces/Prolog/tests/pl_check.pl (1.45),
+ src/BD_Shape.templates.hh (1.69), src/Boundary.defs.hh (1.2),
+ src/Bounding_Box.cc (1.15), src/Bounding_Box.defs.hh (1.17),
+ src/Bounding_Box.inlines.hh (1.16), src/Bounding_Box.types.hh
+ (1.6), src/Box.cc (1.2), src/Box.defs.hh (1.2),
+ src/Box.inlines.hh (1.2), src/Box.templates.hh (1.2),
+ src/Box.types.hh (1.2), src/C_Integer.hh (1.2),
+ src/Checked_Number.defs.hh (1.85), src/Checked_Number.inlines.hh
+ (1.70), src/DB_Matrix.inlines.hh (1.30),
+ src/Direct_Product.templates.hh (1.21), src/Float.defs.hh (1.23),
+ src/GMP_Integer.defs.hh (1.25), src/GMP_Integer.inlines.hh
+ (1.19), src/GMP_Integer.types.hh (1.15), src/Grid.templates.hh
+ (1.25), src/Init.cc (1.29), src/Interval.cc (1.15),
+ src/Interval.defs.hh (1.29), src/Interval.inlines.hh (1.26),
+ src/Interval.types.hh (1.13), src/Interval_Info.defs.hh (1.2),
+ src/Interval_Info.inlines.hh (1.2), src/Interval_Info.types.hh
+ (1.2), src/Interval_Restriction.defs.hh (1.2), src/Limits.hh
+ (1.11), src/Makefile.am (1.168), src/OR_Matrix.inlines.hh (1.5),
+ src/Octagonal_Shape.templates.hh (1.47), src/Old_Interval.cc
+ (1.2), src/Old_Interval.defs.hh (1.2),
+ src/Old_Interval.inlines.hh (1.2), src/Old_Interval.types.hh
+ (1.2), src/Polyhedron.inlines.hh (1.137),
+ src/Polyhedron.templates.hh (1.6), src/Polyhedron_public.cc
+ (1.89), src/Polyhedron_widenings.cc (1.58), src/Rational_Box.hh
+ (1.2), src/Result.defs.hh (1.18), src/Rounding_Dir.defs.hh
+ (1.12), src/Rounding_Dir.inlines.hh (1.6), src/Temp.defs.hh
+ (1.2), src/checked.defs.hh (1.39), src/checked.inlines.hh (1.34),
+ src/checked_ext.inlines.hh (1.34), src/checked_float.inlines.hh
+ (1.72), src/checked_int.inlines.hh (1.57),
+ src/checked_mpq.inlines.hh (1.36), src/checked_mpz.inlines.hh
+ (1.41), src/checked_numeric_limits.hh (1.18), src/compiler.hh
+ (1.9), src/fpu-c99.inlines.hh (1.13), src/fpu-ia32.inlines.hh
+ (1.16), src/fpu-none.inlines.hh (1.6), src/fpu-sparc.inlines.hh
+ (1.7), src/fpu.types.hh (1.4), src/globals.defs.hh (1.42),
+ src/globals.types.hh (1.10), src/meta_programming.hh (1.2),
+ src/mp_numeric_limits.cc (1.3), src/mp_numeric_limits.hh (1.11),
+ src/mp_std_bits.cc (1.2), src/mp_std_bits.defs.hh (1.2),
+ src/mp_std_bits.inlines.hh (1.2), tests/ppl_test.cc (1.8),
+ tests/ppl_test.hh (1.54), tests/print.hh (1.40),
+ tests/valgrind_suppressions (1.5), tests/BD_Shape/Makefile.am
+ (1.59), tests/Box/.cvsignore (1.2), tests/Box/Makefile.am (1.2),
+ tests/Box/addconstraints1.cc (1.2), tests/Box/addspacedims1.cc
+ (1.2), tests/Box/affinedimension1.cc (1.2),
+ tests/Box/affineimage1.cc (1.2), tests/Box/affinepreimage1.cc
+ (1.2), tests/Box/ascii_dump_load1.cc (1.2),
+ tests/Box/bdsdifference1.cc (1.2),
+ tests/Box/bgp99extrapolation1.cc (1.2),
+ tests/Box/bhz03widening1.cc (1.2), tests/Box/bounded1.cc (1.2),
+ tests/Box/boundedaffineimage1.cc (1.2),
+ tests/Box/boxdifference1.cc (1.2), tests/Box/boxhull.cc (1.2),
+ tests/Box/boxhull1.cc (1.2), tests/Box/cc76narrowing1.cc (1.2),
+ tests/Box/cc76widening.cc (1.2), tests/Box/closure1.cc (1.2),
+ tests/Box/concatenate1.cc (1.2), tests/Box/constraints1.cc (1.2),
+ tests/Box/contains1.cc (1.2), tests/Box/containsintegerpoint1.cc
+ (1.2), tests/Box/discrete1.cc (1.2), tests/Box/disjoint1.cc
+ (1.2), tests/Box/empty1.cc (1.2), tests/Box/equality1.cc (1.2),
+ tests/Box/expandspacedim1.cc (1.2), tests/Box/foldspacedims1.cc
+ (1.2), tests/Box/fromgensys1.cc (1.2),
+ tests/Box/frompolyhedron1.cc (1.2),
+ tests/Box/generalizedaffineimage1.cc (1.2),
+ tests/Box/generalizedaffinepreimage1.cc (1.2),
+ tests/Box/geomcovers1.cc (1.2), tests/Box/intersection1.cc (1.2),
+ tests/Box/interval1.cc (1.2), tests/Box/interval2.cc (1.2),
+ tests/Box/mapspacedims1.cc (1.2), tests/Box/maxspacedim1.cc
+ (1.2), tests/Box/membytes1.cc (1.2), tests/Box/minconstraints1.cc
+ (1.2), tests/Box/relations1.cc (1.2),
+ tests/Box/removespacedims1.cc (1.2), tests/Box/timeelapse1.cc
+ (1.2), tests/Box/universe1.cc (1.2), tests/Box/writebox1.cc
+ (1.2), tests/Grid/boundingbox1.cc (1.15),
+ tests/Grid/boundingbox2.cc (1.13), tests/Grid/coveringbox1.cc
+ (1.14), tests/Grid/coveringbox2.cc (1.12),
+ tests/Grid/directproduct1.cc (1.23),
+ tests/Octagonal_Shape/Makefile.am (1.16),
+ tests/Polyhedron/boundingbox1.cc (1.14),
+ tests/Polyhedron/boundingbox2.cc (1.13),
+ tests/Polyhedron/boundingbox3.cc (1.14),
+ tests/Polyhedron/numberinput1.cc (1.30): Third merge from the
+ `altnum' branch.
+
+2007-02-25 Sunday 19:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, README, README.configure, TODO, configure.ac,
+ instchk.hh, Watchdog/Makefile.am, Watchdog/README,
+ Watchdog/configure.ac, Watchdog/doc/.cvsignore,
+ Watchdog/doc/Makefile.am, Watchdog/doc/README.doc,
+ Watchdog/doc/devref.doxyconf-html.in,
+ Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+ Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+ Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+ Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+ Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+ Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ debian/Makefile.am, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+ doc/README.doc, doc/definitions.dox, doc/devref.tex,
+ doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+ doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/user.tex,
+ interfaces/Makefile.am,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_copyright,
+ interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+ interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dat.m4,
+ interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Test_Partial_Function.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+ interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+ interfaces/OCaml/ppl_ocaml_globals.cc,
+ interfaces/OCaml/ppl_ocaml_globals.ml,
+ interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_predicate_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+ m4/Makefile.am, m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+ m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_remainder_bug.m4, m4/ac_prog_jar.m4,
+ m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+ m4/ac_text_md5sum.m4, m4/ppl.m4, src/Any_Pointset.defs.hh,
+ src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+ src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BD_Shape.types.hh,
+ src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+ src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+ src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+ src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+ src/Checked_Number.cc, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence.types.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Congruence_System.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/DB_Row.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh,
+ src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+ src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+ src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/GMP_Integer.types.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator.types.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.types.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.types.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+ src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+ src/Ph_Status.inlines.hh, src/Pointset_Ask_Tell.cc,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/Powerset.templates.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+ src/Result.defs.hh, src/Result.inlines.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+ src/distances.inlines.hh, src/distances.types.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+ src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+ src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+ src/ppl_header.hh, src/simplify.cc, src/swapping_sort.icc,
+ src/version.cc, src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+ tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+ tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+ tests/Makefile.am, tests/Partial_Function.cc,
+ tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh,
+ tests/Partial_Function.types.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/files.cc,
+ tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+ tests/print.cc, tests/print.hh, tests/Ask_Tell/Makefile.am,
+ tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+ tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/run_tests, tests/BD_Shape/timeelapse1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+ tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/affinepreimage2.cc,
+ tests/Grid/approximatepartition1.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+ tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+ tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc,
+ tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+ tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc,
+ tests/MIP_Problem/mipproblem1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc, tests/Octagonal_Shape/bug1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/README,
+ tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/nncminimize1.cc,
+ tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+ tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+ utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+ utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+ (altnum.[6,5,5,10,28,4,7,4,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,8,13,4,7,8,4,6,3,10,5,3,3,5,3,3,3,3,5,5,4,4,3,4,7,3,3,4,5,4,3,4,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,4,4,2,2,2,4,4,9,4,4,4,8,3,5,4,8,3,4,5,5,8,3,3,7,3,2,3,6,3,8,4,2,2,2,4,4,3,3,9,2,3,3,2,2,3,3,3,7,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,5,7,3,2,3,3,3,3,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,3,4,4,3,4,3,3,3,3,3,2,3,2,3,3, [...]
+ Tenth merge of the main trunk to the `altnum' branch.
+
+2007-02-25 Sunday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (altnum.27): Two corrections to the code
+ implementing the `--enable-fpmath' option.
+
+2007-02-25 Sunday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/fpu-ia32.inlines.hh (altnum.[26,8]): The
+ `--enable-fpmath' configure option now causes the possible
+ definition of macros PPL_FPMATH_MAY_USE_387 and
+ PPL_FPMATH_MAY_USE_SSE.
+
+2007-02-24 Saturday 20:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (altnum.25): New option `--enable-fpmath' allows to
+ select specific floating point arithmetics. Possible values are
+ sse, sse2, 387, sse+387, sse2+387, default or no (equivalent to
+ --disable-fpmath).
+
+2007-02-24 Saturday 20:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (altnum.8): No longer use the
+ comma as the separator for plld's -ld-options (since commas can
+ occur in the arguments, e.g., in -mfpmath=sse,387): use the slash
+ instead.
+
+2007-02-23 Friday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.11): The user manual (in various
+ formats) is now in the `docs' package.
+
+2007-02-23 Friday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.207): New entry added.
+
+2007-02-22 Thursday 21:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (altnum.24): Drafted new configure options
+ --enable-sse and --enable-sse2.
+
+2007-02-22 Thursday 12:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.10): Percent signs quoted in the
+ change log.
+
+2007-02-22 Thursday 11:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.9): Version bumped.
+
+2007-02-22 Thursday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.8): Dependencies for YAP fixed. Make
+ sure the header files of GNU Prolog and YAP are found.
+
+2007-02-22 Thursday 08:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.7): Added missing dependencies.
+
+2007-02-19 Monday 17:23 Abramo Bagnara
+
+ * src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh,
+ fpu-none.inlines.hh, fpu-sparc.inlines.hh (altnum.[4,7,3,4]): Add
+ support for SSE. Removed unused function.
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/.cvsignore (altnum.1): file .cvsignore was added on
+ branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/.cvsignore (simplex.1): file .cvsignore was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/Makefile.am (altnum.1): file Makefile.am was added
+ on branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/README.doc (altnum.1): file README.doc was added on
+ branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-html.in (altnum.1): file
+ devref.doxyconf-html.in was added on branch altnum on 2007-02-25
+ 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-html.in (simplex.1): file
+ devref.doxyconf-html.in was added on branch simplex on 2008-01-07
+ 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-latex.in (altnum.1): file
+ devref.doxyconf-latex.in was added on branch altnum on 2007-02-25
+ 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.doxyconf-latex.in (simplex.1): file
+ devref.doxyconf-latex.in was added on branch simplex on
+ 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/devref.tex (altnum.1): file devref.tex was added on
+ branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.dox (altnum.1): file fdl.dox was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.dox (simplex.1): file fdl.dox was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.tex (altnum.1): file fdl.tex was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.tex (simplex.1): file fdl.tex was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.txt (altnum.1): file fdl.txt was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/fdl.txt (simplex.1): file fdl.txt was added on
+ branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.dox (altnum.1): file gpl.dox was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.tex (altnum.1): file gpl.tex was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/gpl.txt (altnum.1): file gpl.txt was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/pwl.sty (altnum.1): file pwl.sty was added on branch
+ altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.doxyconf-html.in (altnum.1): file
+ user.doxyconf-html.in was added on branch altnum on 2007-02-25
+ 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.doxyconf-latex.in (altnum.1): file
+ user.doxyconf-latex.in was added on branch altnum on 2007-02-25
+ 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/doc/user.tex (altnum.1): file user.tex was added on
+ branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.27), configure.ac (1.35),
+ doc/.cvsignore (1.1), doc/Makefile.am (1.1), doc/README.doc
+ (1.1), doc/devref.doxyconf-html.in (1.1),
+ doc/devref.doxyconf-latex.in (1.1), doc/devref.tex (1.1),
+ doc/fdl.dox (1.1), doc/fdl.tex (1.1), doc/fdl.txt (1.1),
+ doc/gpl.dox (1.1), doc/gpl.tex (1.1), doc/gpl.txt (1.1),
+ doc/pwl.sty (1.1), doc/user.doxyconf-html.in (1.1),
+ doc/user.doxyconf-latex.in (1.1), doc/user.tex (1.1):
+ Documentation for the Parma Watchdog Library.
+
+2007-02-18 Sunday 13:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.6): %doc tags corrected for the
+ Prolog interfaces. Tabs used consistently instead of spaces.
+
+2007-02-18 Sunday 12:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl-0.9-docfiles.patch (ppl-0_9-branch.2): Revised.
+
+2007-02-18 Sunday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/README.doc (ppl-0_9-branch.1): Explains where to find
+ the documentation.
+
+2007-02-18 Sunday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/README.gprolog, SWI/README.swiprolog,
+ YAP/README.yap (ppl-0_9-branch.[2,2,2]): Revised for clarity.
+
+2007-02-17 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl-0.9-docfiles.patch, ppl.spec.in,
+ interfaces/Prolog/GNU/README.gprolog,
+ interfaces/Prolog/SWI/README.swiprolog,
+ interfaces/Prolog/YAP/README.yap (ppl-0_9-branch.[1,5,1,1,1]):
+ Make `swiprolog-devel' depend on `pl' (at leat 5.6);
+ documentation added. The `yap' package has been renamed
+ `yap-devel' and completed. The `gprolog' package has been
+ renamed `gprolog-devel' and completed. The `ppl_lcdd' and
+ `ppl_lpsol' programs are now in a new `utils' package. The
+ `ppl-config' program is now in the `devel' package. Modified the
+ configuration command so that the `glpk-devel' include files are
+ found.
+
+2007-02-13 Tuesday 14:48 quartieri
+
+ * src/Octagonal_Shape_incremental_strong_closure10.hh (octagons.4):
+ Corrected some errors.
+
+2007-02-11 Sunday 21:09 Andrea Cimino
+
+ * DarwinPorts_Portfile (ppl-0_9-branch.3): Variant sections
+ removed.
+
+2007-02-11 Sunday 14:26 Andrea Cimino
+
+ * DarwinPorts_Portfile (ppl-0_9-branch.2): Don't require the
+ development snapshots of the Prolog systems, use the stable
+ versions instead.
+
+2007-02-10 Saturday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.4): Summaries improved. Started
+ splitting packages into "run-time" and "devel" packages.
+
+2007-02-10 Saturday 20:57 Andrea Cimino
+
+ * DarwinPorts_Portfile (ppl-0_9-branch.1): Initial revision of a
+ DarwinPort's Portfile.
+
+2007-02-10 Saturday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.3): Do configure with the
+ --disable-rpath option so as to avoid hardcoding the path to
+ search libraries. Do not include libtool archive files.
+ Packages reorganized: we now have `ppl' and `ppl-devel'; `ppl-c'
+ has gone.
+
+2007-02-10 Saturday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.2): Added the `%%changelog' section.
+ `Release' set to 2. `Packager' and `Vendor' tags removed.
+ `Summary' fields are no longer ended with a dot. The value of
+ the `License' tag is now `GPL'. Removed unused definition of
+ `builddir'. The `Name', `Version' and `Release' tags are now
+ directly defined. Commented out the efinitions of the `Require'
+ and `Prefix' tags. Set the `BuildRequires' tag to `gmp-devel'.
+ Exploit the features of `%%setup', `%%configure', `%%install',
+ `%%post' and `%%postun'. Mixed use of spaces and tabs avoided.
+
+2007-02-10 Saturday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_9-branch.1): Added the `%changelog' section.
+
+2007-02-09 Friday 14:56 Abramo Bagnara
+
+ * src/fpu-ia32.inlines.hh (altnum.6): First attempt to support SSE
+ floating point rounding.
+
+2007-02-08 Thursday 19:20 Andrea Cimino
+
+ * interfaces/Java/: jni/Makefile.am (1.11),
+ tests/C_Polyhedron_test1.java (1.10),
+ tests/ppl_interface_generator_java_test_java.m4 (1.8): In Darwin
+ force libtool to generate a .jnilib instead of a .dylib if we
+ have to deal with a JNI library.
+
+2007-02-08 Thursday 18:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.264): On Fedora Core systems we can now find the
+ JDK even if the --with-java option is not specified.
+
+2007-02-08 Thursday 17:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.263), m4/Makefile.am (1.24): Improved the
+ detection of Darwin.
+
+2007-02-08 Thursday 17:03 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.9),
+ ppl_interface_generator_java_test_java.m4 (1.7): Load the right
+ interface library appropriately.
+
+2007-02-08 Thursday 16:15 Andrea Cimino
+
+ * configure.ac (1.262): Try to detect if we are building the PPL on
+ a MacOSX: if so, set the the default JDK path to
+ /Library/Java/Home.
+
+2007-02-08 Thursday 15:27 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.8),
+ Makefile.am (1.12), ppl_interface_generator_java_test_java.m4
+ (1.6): Made some changes to correctly load the Java PPL bindings
+ if the running OS is Darwin.
+
+2007-02-07 Wednesday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.defs.hh (1.13): Prefer standard C99 floating point
+ rounding and exception handling on all systems that support it.
+
+2007-02-06 Tuesday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bug1.cc (1.3): Further reduced.
+
+2007-02-06 Tuesday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bug1.cc (altnum.1): file bug1.cc was added
+ on branch altnum on 2007-02-25 18:27:11 +0000
+
+2007-02-06 Tuesday 15:38 Andrea Cimino
+
+ * tests/Octagonal_Shape/bug1.cc (1.2): Removed some constraints
+ from the test case to simplify the debugging process.
+
+2007-02-06 Tuesday 12:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: Makefile.am (1.15), bug1.cc (1.1): Small
+ program showing a (compiler?) bug that manifests itself on
+ iMac's.
+
+2007-02-03 Saturday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_remainder_bug.m4 (altnum.1): file
+ ac_cxx_remainder_bug.m4 was added on branch altnum on 2007-02-25
+ 18:27:02 +0000
+
+2007-02-03 Saturday 11:57 Andrea Cimino
+
+ * configure.ac (1.261), m4/Makefile.am (1.23),
+ m4/ac_cxx_remainder_bug.m4 (1.1): Definition of an M4 macro that
+ checks if INT_MIN / -1 is correctly compiled by the C++ compiler.
+
+2007-02-02 Friday 11:06 quartieri
+
+ * src/: Octagonal_Shape_incremental_strong_closure1.hh,
+ Octagonal_Shape_incremental_strong_closure10.hh,
+ Octagonal_Shape_incremental_strong_closure2.hh,
+ Octagonal_Shape_incremental_strong_closure3.hh,
+ Octagonal_Shape_incremental_strong_closure4.hh,
+ Octagonal_Shape_incremental_strong_closure5.hh,
+ Octagonal_Shape_incremental_strong_closure6.hh,
+ Octagonal_Shape_incremental_strong_closure7.hh,
+ Octagonal_Shape_incremental_strong_closure8.hh,
+ Octagonal_Shape_incremental_strong_closure9.hh
+ (octagons.[3,3,3,3,3,3,3,3,3,3]): Removed some useless operation
+ counters.
+
+2007-01-31 Wednesday 13:48 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.54): Removed
+ 'plus_infinity' test from strong_coherence_assign().
+
+2007-01-24 Wednesday 08:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.46): Code for debugging improved.
+
+2007-01-19 Friday 12:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.206): Removed item: - Add tests for
+ ppl_Polyhedron_contains_integer_point/1 in pl_check.pl.
+
+2007-01-19 Friday 12:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.29),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.33),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.40),
+ Prolog/tests/pl_check.pl (1.44),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.49): Added a test to pl_check.pl for
+ ppl_Polyhedron_contains_integer_point/2
+
+ Also added m4 code to generate interface predicates such as
+ ppl_Pointset_Powerset_C_Polyhedron_linear_partition/4 and
+ ppl_Pointset_Powerset_Grid_approximate_partition/4
+
+ Added m4 code for generating tests for these.
+
+2007-01-15 Monday 13:01 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.5),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.6),
+ ppl_ocaml_types.ml (1.8): Removed some commented and non used
+ declarations.
+
+2007-01-15 Monday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (altnum.1):
+ file ppl_interface_generator_ocaml_mli.m4 was added on branch
+ altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+ (altnum.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+ added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_types.ml (altnum.1): file
+ ppl_ocaml_types.ml was added on branch altnum on 2007-02-25
+ 18:26:59 +0000
+
+2007-01-13 Saturday 20:17 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.12), ppl_interface_generator_ocaml_ml_code.m4 (1.12),
+ ppl_interface_generator_ocaml_mli.m4 (1.4),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.5),
+ ppl_ocaml_globals.cc (1.8), ppl_ocaml_types.ml (1.7), test1.ml
+ (1.28): Corrected the constructors `from space_dimension' that
+ until now allowed to build types just from UNIVERSE. Created the
+ type `degenerate_element' for that purposes.
+
+2007-01-13 Saturday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+ (altnum.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+ added on branch altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-13 Saturday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+ (altnum.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+ added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-13 Saturday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.cc (altnum.1): file
+ ppl_ocaml_globals.cc was added on branch altnum on 2007-02-25
+ 18:26:59 +0000
+
+2007-01-11 Thursday 16:00 quartieri
+
+ * src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh,
+ src/Octagonal_Shape_incremental_strong_closure1.hh,
+ src/Octagonal_Shape_incremental_strong_closure10.hh,
+ src/Octagonal_Shape_incremental_strong_closure2.hh,
+ src/Octagonal_Shape_incremental_strong_closure3.hh,
+ src/Octagonal_Shape_incremental_strong_closure4.hh,
+ src/Octagonal_Shape_incremental_strong_closure5.hh,
+ src/Octagonal_Shape_incremental_strong_closure6.hh,
+ src/Octagonal_Shape_incremental_strong_closure7.hh,
+ src/Octagonal_Shape_incremental_strong_closure8.hh,
+ src/Octagonal_Shape_incremental_strong_closure9.hh,
+ src/Octagonal_Shape_strong_closure2.hh, src/script_flags.hh,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/incremental1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/incremental1.cc
+ (octagons.[3,3,3,53,2,2,2,2,2,2,2,2,2,2,2,1,3,1,3,1]): Changed
+ some files to improve the tests on closure and incremental
+ closure.
+
+2007-01-08 Monday 15:31 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.24),
+ ppl_java_common.cc (1.29), ppl_java_common.hh (1.26): Written
+ support for Pointset_Powerset iterators.
+
+2007-01-07 Sunday 13:20 Andrea Cimino
+
+ * configure.ac (1.260),
+ interfaces/Java/ppl_interface_generator_java_dat.m4 (1.6):
+ Written the Java code to handle Powereset_Iterators. Still the
+ C++ code that really intefaces with the PPL must be written.
+ Modified the Makefile.am to delete all the generated files if the
+ target `clean' is requested.
+
+2007-01-04 Thursday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (altnum.1):
+ file ppl_interface_generator_ocaml_cc.m4 was added on branch
+ altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-04 Thursday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (altnum.1):
+ file ppl_interface_generator_ocaml_dat.m4 was added on branch
+ altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (altnum.1):
+ file ppl_interface_generator_ocaml_ml.m4 was added on branch
+ altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.28),
+ C/ppl_interface_generator_c_cc.m4 (1.7),
+ C/ppl_interface_generator_c_h.m4 (1.11),
+ Java/ppl_interface_generator_java_dat.m4 (1.5),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.8), Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.5), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.3),
+ OCaml/ppl_interface_generator_ocaml_dat.m4 (1.5),
+ OCaml/ppl_interface_generator_ocaml_ml.m4 (1.8),
+ OCaml/ppl_interface_generator_ocaml_mli.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.32),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.10),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.39),
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.5),
+ Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.4), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.5),
+ Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.7),
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.8),
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.6),
+ Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.7),
+ Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.4), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.6),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.48),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.26): Copyright notices fixed.
+
+2007-01-01 Monday 01:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc (altnum.1): file hybrid.cc was added
+ on branch altnum on 2007-02-25 18:27:12 +0000
+
+2007-01-01 Monday 01:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml_globals.ml (altnum.1): file
+ ppl_ocaml_globals.ml was added on branch altnum on 2007-02-25
+ 18:26:59 +0000
+
+2007-01-01 Monday 01:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.38), README (1.50), README.configure (1.18),
+ configure.ac (1.259), instchk.hh (1.8), Watchdog/Makefile.am
+ (1.26), Watchdog/README (1.15), Watchdog/configure.ac (1.34),
+ Watchdog/src/Doubly_Linked_Object.defs.hh (1.3),
+ Watchdog/src/Doubly_Linked_Object.inlines.hh (1.3),
+ Watchdog/src/Doubly_Linked_Object.types.hh (1.3),
+ Watchdog/src/EList.defs.hh (1.5), Watchdog/src/EList.inlines.hh
+ (1.3), Watchdog/src/EList.types.hh (1.3),
+ Watchdog/src/EList_Iterator.defs.hh (1.3),
+ Watchdog/src/EList_Iterator.inlines.hh (1.3),
+ Watchdog/src/EList_Iterator.types.hh (1.3),
+ Watchdog/src/Handler.defs.hh (1.4),
+ Watchdog/src/Handler.inlines.hh (1.3),
+ Watchdog/src/Handler.types.hh (1.3), Watchdog/src/Makefile.am
+ (1.9), Watchdog/src/Pending_Element.cc (1.3),
+ Watchdog/src/Pending_Element.defs.hh (1.4),
+ Watchdog/src/Pending_Element.inlines.hh (1.3),
+ Watchdog/src/Pending_Element.types.hh (1.3),
+ Watchdog/src/Pending_List.cc (1.3),
+ Watchdog/src/Pending_List.defs.hh (1.4),
+ Watchdog/src/Pending_List.inlines.hh (1.3),
+ Watchdog/src/Pending_List.types.hh (1.3), Watchdog/src/Time.cc
+ (1.3), Watchdog/src/Time.defs.hh (1.4),
+ Watchdog/src/Time.inlines.hh (1.3), Watchdog/src/Time.types.hh
+ (1.3), Watchdog/src/Watchdog.cc (1.5),
+ Watchdog/src/Watchdog.defs.hh (1.4),
+ Watchdog/src/Watchdog.inlines.hh (1.3),
+ Watchdog/src/Watchdog.types.hh (1.3), Watchdog/src/pwl_header.hh
+ (1.3), Watchdog/utils/Makefile.am (1.7),
+ Watchdog/utils/build_header.in (1.4), debian/Makefile.am (1.3),
+ debian/libppl-pwl.copyright.in (1.4), debian/libppl.copyright.in
+ (1.4), demos/Makefile.am (1.10), demos/ppl_lcdd/Makefile.am
+ (1.27), demos/ppl_lcdd/ppl_lcdd.cc (1.58),
+ demos/ppl_lcdd/examples/Makefile.am (1.8),
+ demos/ppl_lpsol/Makefile.am (1.38), demos/ppl_lpsol/ppl_lpsol.c
+ (1.67), demos/ppl_lpsol/examples/Makefile.am (1.8),
+ doc/Makefile.am (1.50), doc/README.doc (1.11),
+ doc/definitions.dox (1.200), doc/devref.tex (1.21),
+ doc/ppl-config.1 (1.5), doc/ppl-config_extra_man_text (1.2),
+ doc/ppl.sty (1.26), doc/ppl_lcdd.1 (1.3),
+ doc/ppl_lcdd_extra_man_text (1.2), doc/ppl_lpsol.1 (1.3),
+ doc/ppl_lpsol_extra_man_text (1.2), doc/user.tex (1.22),
+ interfaces/Makefile.am (1.25),
+ interfaces/ppl_interface_generator_common.m4 (1.17),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.27),
+ interfaces/ppl_interface_generator_copyright (1.3),
+ interfaces/C/Makefile.am (1.31), interfaces/C/ppl_c.h.in (1.69),
+ interfaces/C/ppl_c_version.h.in (1.4),
+ interfaces/C/ppl_interface_generator_c_cc.m4 (1.6),
+ interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.13),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.6),
+ interfaces/C/ppl_interface_generator_c_dat.m4 (1.10),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.10),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.7),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.6),
+ interfaces/Java/Makefile.am (1.10),
+ interfaces/Java/ppl_interface_generator_java_dat.m4 (1.4),
+ interfaces/Java/jni/Makefile.am (1.10),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.7),
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.23), interfaces/Java/jni/ppl_java_common.cc (1.28),
+ interfaces/Java/jni/ppl_java_common.hh (1.25),
+ interfaces/Java/jni/ppl_java_globals.cc (1.5),
+ interfaces/Java/tests/C_Polyhedron_test1.java (1.7),
+ interfaces/Java/tests/Makefile.am (1.11),
+ interfaces/Java/tests/Test_Partial_Function.java (1.2),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (1.4),
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.12), interfaces/OCaml/Makefile.am (1.25),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.2),
+ interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.11),
+ interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.4),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.7),
+ interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.11),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.2),
+ interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.4),
+ interfaces/OCaml/ppl_ocaml_globals.cc (1.7),
+ interfaces/OCaml/ppl_ocaml_globals.ml (1.6),
+ interfaces/OCaml/ppl_ocaml_types.ml (1.6),
+ interfaces/OCaml/test1.ml (1.27), interfaces/Prolog/Makefile.am
+ (1.38), interfaces/Prolog/Prolog_interface.dox (1.158),
+ interfaces/Prolog/exceptions.hh (1.24),
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.31),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.9),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.38),
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (1.9), interfaces/Prolog/ppl_prolog_common.icc (1.4),
+ interfaces/Prolog/track_allocation.hh (1.21),
+ interfaces/Prolog/Ciao/Makefile.am (1.62),
+ interfaces/Prolog/Ciao/ciao_cfli.hh (1.2),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.18),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.14),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.25),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.49),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.4),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (1.3), interfaces/Prolog/GNU/Makefile.am (1.61),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.10),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.11),
+ interfaces/Prolog/GNU/gprolog_cfli.hh (1.2),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.42),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.4), interfaces/Prolog/SICStus/Makefile.am (1.73),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.6), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.27),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.7),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.9),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.14),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.15),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.9),
+ interfaces/Prolog/SICStus/sp_predicate_check.pl (1.2),
+ interfaces/Prolog/SWI/Makefile.am (1.67),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.11),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.10),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.7), interfaces/Prolog/SWI/ppl_pl.cc (1.11),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.7),
+ interfaces/Prolog/SWI/swi_cfli.hh (1.3),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.9),
+ interfaces/Prolog/SWI/swi_predicate_check.pl (1.2),
+ interfaces/Prolog/XSB/Makefile.am (1.48),
+ interfaces/Prolog/XSB/expected_clpq2_int16 (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int16_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int32 (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int32_a (1.5),
+ interfaces/Prolog/XSB/expected_clpq2_int64 (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int64_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int8 (1.4),
+ interfaces/Prolog/XSB/expected_clpq2_int8_a (1.5),
+ interfaces/Prolog/XSB/expected_clpq2_mpz (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int16 (1.5),
+ interfaces/Prolog/XSB/expected_clpq_int16_a (1.5),
+ interfaces/Prolog/XSB/expected_clpq_int32 (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int32_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int64 (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int64_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int8 (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int8_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq_mpz (1.3),
+ interfaces/Prolog/XSB/expected_clpq_mpz_a (1.3),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.5),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.6),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.3), interfaces/Prolog/XSB/xsb_cfli.hh (1.2),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.17),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.15),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.29),
+ interfaces/Prolog/YAP/Makefile.am (1.50),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.5),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.11),
+ interfaces/Prolog/YAP/yap_cfli.hh (1.2),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.12),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.8),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.12),
+ interfaces/Prolog/tests/Makefile.am (1.13),
+ interfaces/Prolog/tests/clpq.pl (1.9),
+ interfaces/Prolog/tests/clpq2.pl (1.10),
+ interfaces/Prolog/tests/expected_clpq2_int16 (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int16_a (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int32 (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int32_a (1.5),
+ interfaces/Prolog/tests/expected_clpq2_int64 (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int64_a (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int8 (1.5),
+ interfaces/Prolog/tests/expected_clpq2_int8_a (1.5),
+ interfaces/Prolog/tests/expected_clpq2_mpz (1.3),
+ interfaces/Prolog/tests/expected_clpq2_mpz_a (1.3),
+ interfaces/Prolog/tests/expected_clpq_int16 (1.5),
+ interfaces/Prolog/tests/expected_clpq_int16_a (1.5),
+ interfaces/Prolog/tests/expected_clpq_int32 (1.3),
+ interfaces/Prolog/tests/expected_clpq_int32_a (1.3),
+ interfaces/Prolog/tests/expected_clpq_int64 (1.3),
+ interfaces/Prolog/tests/expected_clpq_int64_a (1.3),
+ interfaces/Prolog/tests/expected_clpq_int8 (1.3),
+ interfaces/Prolog/tests/expected_clpq_int8_a (1.3),
+ interfaces/Prolog/tests/expected_clpq_mpz (1.3),
+ interfaces/Prolog/tests/expected_clpq_mpz_a (1.3),
+ interfaces/Prolog/tests/pl_check.pl (1.43),
+ interfaces/Prolog/tests/pl_grid_check.pl (1.4),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.47),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.25), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+ (1.3), m4/Makefile.am (1.22), m4/ac_check_fpu_control.m4 (1.3),
+ m4/ac_check_gmp.m4 (1.24), m4/ac_check_sicstus_prolog.m4 (1.5),
+ m4/ac_check_swi_prolog.m4 (1.10), m4/ac_check_xsb_prolog.m4
+ (1.3), m4/ac_cxx_attribute_weak.m4 (1.8),
+ m4/ac_cxx_double_binary_format.m4 (1.4),
+ m4/ac_cxx_flexible_arrays.m4 (1.13),
+ m4/ac_cxx_float_binary_format.m4 (1.3),
+ m4/ac_cxx_long_double_binary_format.m4 (1.4), m4/ac_prog_jar.m4
+ (1.2), m4/ac_prog_java.m4 (1.5), m4/ac_prog_javac.m4 (1.4),
+ m4/ac_prog_javah.m4 (1.8), m4/ac_text_md5sum.m4 (1.2), m4/ppl.m4
+ (1.5), src/Any_Pointset.defs.hh (1.9),
+ src/Any_Pointset.inlines.hh (1.2), src/Any_Pointset.types.hh
+ (1.2), src/Ask_Tell.defs.hh (1.15), src/Ask_Tell.inlines.hh
+ (1.15), src/Ask_Tell.templates.hh (1.8), src/Ask_Tell.types.hh
+ (1.6), src/BDS_Status.idefs.hh (1.20), src/BDS_Status.inlines.hh
+ (1.15), src/BD_Shape.cc (1.4), src/BD_Shape.defs.hh (1.95),
+ src/BD_Shape.inlines.hh (1.138), src/BD_Shape.templates.hh
+ (1.68), src/BD_Shape.types.hh (1.6), src/BHRZ03_Certificate.cc
+ (1.11), src/BHRZ03_Certificate.defs.hh (1.16),
+ src/BHRZ03_Certificate.inlines.hh (1.8),
+ src/BHRZ03_Certificate.types.hh (1.5), src/Bit_Matrix.cc (1.2),
+ src/Bit_Matrix.defs.hh (1.2), src/Bit_Matrix.inlines.hh (1.2),
+ src/Bit_Matrix.types.hh (1.2), src/Bit_Row.cc (1.2),
+ src/Bit_Row.defs.hh (1.4), src/Bit_Row.inlines.hh (1.2),
+ src/Bit_Row.types.hh (1.2), src/Bounding_Box.cc (1.14),
+ src/Bounding_Box.defs.hh (1.16), src/Bounding_Box.inlines.hh
+ (1.15), src/Bounding_Box.types.hh (1.5), src/C_Polyhedron.cc
+ (1.20), src/C_Polyhedron.defs.hh (1.46),
+ src/C_Polyhedron.inlines.hh (1.34), src/C_Polyhedron.types.hh
+ (1.11), src/Checked_Number.cc (1.10), src/Checked_Number.defs.hh
+ (1.84), src/Checked_Number.inlines.hh (1.69),
+ src/Checked_Number.types.hh (1.10), src/Coefficient.cc (1.5),
+ src/Coefficient.defs.hh (1.7), src/Coefficient.inlines.hh (1.6),
+ src/Coefficient.types.hh (1.13),
+ src/Coefficient_traits_template.hh (1.7), src/Congruence.cc
+ (1.14), src/Congruence.defs.hh (1.18), src/Congruence.inlines.hh
+ (1.15), src/Congruence.types.hh (1.3), src/Congruence_System.cc
+ (1.22), src/Congruence_System.defs.hh (1.17),
+ src/Congruence_System.inlines.hh (1.7),
+ src/Congruence_System.types.hh (1.3), src/Constraint.cc (1.65),
+ src/Constraint.defs.hh (1.124), src/Constraint.inlines.hh (1.66),
+ src/Constraint.types.hh (1.11), src/Constraint_System.cc (1.21),
+ src/Constraint_System.defs.hh (1.34),
+ src/Constraint_System.inlines.hh (1.8),
+ src/Constraint_System.types.hh (1.5), src/DB_Matrix.defs.hh
+ (1.26), src/DB_Matrix.inlines.hh (1.29),
+ src/DB_Matrix.templates.hh (1.4), src/DB_Matrix.types.hh (1.6),
+ src/DB_Row.defs.hh (1.21), src/DB_Row.inlines.hh (1.20),
+ src/DB_Row.templates.hh (1.3), src/DB_Row.types.hh (1.7),
+ src/Determinate.defs.hh (1.64), src/Determinate.inlines.hh
+ (1.55), src/Determinate.types.hh (1.9),
+ src/Direct_Product.defs.hh (1.30), src/Direct_Product.inlines.hh
+ (1.27), src/Direct_Product.templates.hh (1.20),
+ src/Direct_Product.types.hh (1.6), src/Float.cc (1.5),
+ src/Float.defs.hh (1.22), src/Float.inlines.hh (1.29),
+ src/GMP_Integer.defs.hh (1.24), src/GMP_Integer.inlines.hh
+ (1.18), src/GMP_Integer.types.hh (1.14), src/Generator.cc (1.73),
+ src/Generator.defs.hh (1.121), src/Generator.inlines.hh (1.60),
+ src/Generator.types.hh (1.11), src/Generator_System.cc (1.20),
+ src/Generator_System.defs.hh (1.21),
+ src/Generator_System.inlines.hh (1.7),
+ src/Generator_System.types.hh (1.5), src/Grid.defs.hh (1.39),
+ src/Grid.inlines.hh (1.13), src/Grid.templates.hh (1.24),
+ src/Grid.types.hh (1.3), src/Grid_Certificate.cc (1.6),
+ src/Grid_Certificate.defs.hh (1.4),
+ src/Grid_Certificate.inlines.hh (1.3),
+ src/Grid_Certificate.types.hh (1.3), src/Grid_Generator.cc
+ (1.19), src/Grid_Generator.defs.hh (1.28),
+ src/Grid_Generator.inlines.hh (1.13), src/Grid_Generator.types.hh
+ (1.3), src/Grid_Generator_System.cc (1.17),
+ src/Grid_Generator_System.defs.hh (1.20),
+ src/Grid_Generator_System.inlines.hh (1.12),
+ src/Grid_Generator_System.types.hh (1.3), src/Grid_Status.cc
+ (1.6), src/Grid_Status.idefs.hh (1.6), src/Grid_Status.inlines.hh
+ (1.3), src/Grid_chdims.cc (1.15), src/Grid_conversion.cc (1.18),
+ src/Grid_nonpublic.cc (1.22), src/Grid_public.cc (1.49),
+ src/Grid_simplify.cc (1.30), src/Grid_widenings.cc (1.13),
+ src/H79_Certificate.cc (1.10), src/H79_Certificate.defs.hh
+ (1.15), src/H79_Certificate.inlines.hh (1.9),
+ src/H79_Certificate.types.hh (1.5), src/Init.cc (1.28),
+ src/Init.defs.hh (1.17), src/Init.types.hh (1.10),
+ src/Interval.cc (1.14), src/Interval.defs.hh (1.28),
+ src/Interval.inlines.hh (1.25), src/Interval.types.hh (1.12),
+ src/Limits.hh (1.10), src/Linear_Expression.cc (1.16),
+ src/Linear_Expression.defs.hh (1.34),
+ src/Linear_Expression.inlines.hh (1.10),
+ src/Linear_Expression.types.hh (1.5), src/Linear_Row.cc (1.21),
+ src/Linear_Row.defs.hh (1.23), src/Linear_Row.inlines.hh (1.12),
+ src/Linear_Row.types.hh (1.5), src/Linear_System.cc (1.41),
+ src/Linear_System.defs.hh (1.30), src/Linear_System.inlines.hh
+ (1.20), src/Linear_System.types.hh (1.5), src/MIP_Problem.cc
+ (1.45), src/MIP_Problem.defs.hh (1.31),
+ src/MIP_Problem.inlines.hh (1.13), src/MIP_Problem.templates.hh
+ (1.10), src/MIP_Problem.types.hh (1.2), src/Makefile.am (1.167),
+ src/Matrix.cc (1.95), src/Matrix.defs.hh (1.79),
+ src/Matrix.inlines.hh (1.50), src/Matrix.types.hh (1.11),
+ src/NNC_Polyhedron.cc (1.20), src/NNC_Polyhedron.defs.hh (1.48),
+ src/NNC_Polyhedron.inlines.hh (1.35), src/NNC_Polyhedron.types.hh
+ (1.11), src/Numeric_Format.defs.hh (1.6), src/OR_Matrix.defs.hh
+ (1.7), src/OR_Matrix.inlines.hh (1.4), src/OR_Matrix.templates.hh
+ (1.5), src/OR_Matrix.types.hh (1.3), src/Octagonal_Shape.cc
+ (1.3), src/Octagonal_Shape.defs.hh (1.23),
+ src/Octagonal_Shape.inlines.hh (1.13),
+ src/Octagonal_Shape.templates.hh (1.46),
+ src/Octagonal_Shape.types.hh (1.3), src/Og_Status.idefs.hh (1.6),
+ src/Og_Status.inlines.hh (1.4), src/Ph_Status.cc (1.12),
+ src/Ph_Status.idefs.hh (1.20), src/Ph_Status.inlines.hh (1.8),
+ src/Pointset_Ask_Tell.cc (1.2), src/Pointset_Ask_Tell.defs.hh
+ (1.6), src/Pointset_Ask_Tell.inlines.hh (1.2),
+ src/Pointset_Ask_Tell.templates.hh (1.7),
+ src/Pointset_Ask_Tell.types.hh (1.2), src/Pointset_Powerset.cc
+ (1.10), src/Pointset_Powerset.defs.hh (1.11),
+ src/Pointset_Powerset.inlines.hh (1.6),
+ src/Pointset_Powerset.templates.hh (1.8),
+ src/Pointset_Powerset.types.hh (1.2), src/Poly_Con_Relation.cc
+ (1.14), src/Poly_Con_Relation.defs.hh (1.33),
+ src/Poly_Con_Relation.inlines.hh (1.15),
+ src/Poly_Con_Relation.types.hh (1.10), src/Poly_Gen_Relation.cc
+ (1.14), src/Poly_Gen_Relation.defs.hh (1.31),
+ src/Poly_Gen_Relation.inlines.hh (1.15),
+ src/Poly_Gen_Relation.types.hh (1.10), src/Polyhedron.defs.hh
+ (1.312), src/Polyhedron.inlines.hh (1.136),
+ src/Polyhedron.templates.hh (1.5), src/Polyhedron.types.hh
+ (1.17), src/Polyhedron_chdims.cc (1.41),
+ src/Polyhedron_nonpublic.cc (1.75), src/Polyhedron_public.cc
+ (1.88), src/Polyhedron_widenings.cc (1.57), src/Powerset.defs.hh
+ (1.29), src/Powerset.inlines.hh (1.19), src/Powerset.templates.hh
+ (1.4), src/Powerset.types.hh (1.6), src/Ptr_Iterator.defs.hh
+ (1.8), src/Ptr_Iterator.inlines.hh (1.7),
+ src/Ptr_Iterator.types.hh (1.6), src/Result.defs.hh (1.17),
+ src/Result.inlines.hh (1.10), src/Rounding_Dir.defs.hh (1.11),
+ src/Rounding_Dir.inlines.hh (1.5), src/Row.cc (1.101),
+ src/Row.defs.hh (1.109), src/Row.inlines.hh (1.63),
+ src/Row.types.hh (1.12), src/Scalar_Products.cc (1.6),
+ src/Scalar_Products.defs.hh (1.8), src/Scalar_Products.inlines.hh
+ (1.5), src/Scalar_Products.types.hh (1.4), src/Topology.hh
+ (1.13), src/Variable.cc (1.22), src/Variable.defs.hh (1.53),
+ src/Variable.inlines.hh (1.24), src/Variable.types.hh (1.11),
+ src/Variables_Set.cc (1.4), src/Variables_Set.defs.hh (1.5),
+ src/Variables_Set.inlines.hh (1.4), src/Variables_Set.types.hh
+ (1.2), src/Widening_Function.defs.hh (1.16),
+ src/Widening_Function.inlines.hh (1.14),
+ src/Widening_Function.types.hh (1.6), src/algorithms.hh (1.47),
+ src/checked.cc (1.19), src/checked.defs.hh (1.38),
+ src/checked.inlines.hh (1.33), src/checked_ext.defs.hh (1.12),
+ src/checked_ext.inlines.hh (1.33), src/checked_float.inlines.hh
+ (1.71), src/checked_int.inlines.hh (1.56),
+ src/checked_mpq.inlines.hh (1.35), src/checked_mpz.inlines.hh
+ (1.40), src/checked_numeric_limits.hh (1.17), src/compiler.hh
+ (1.8), src/conversion.cc (1.80), src/distances.defs.hh (1.3),
+ src/distances.inlines.hh (1.3), src/distances.types.hh (1.3),
+ src/fpu-c99.inlines.hh (1.12), src/fpu-ia32.inlines.hh (1.15),
+ src/fpu-none.inlines.hh (1.5), src/fpu-sparc.inlines.hh (1.6),
+ src/fpu.defs.hh (1.12), src/fpu.types.hh (1.3), src/globals.cc
+ (1.25), src/globals.defs.hh (1.41), src/globals.inlines.hh
+ (1.16), src/globals.types.hh (1.9), src/initializer.hh (1.13),
+ src/iterator_to_const.defs.hh (1.4),
+ src/iterator_to_const.inlines.hh (1.3),
+ src/iterator_to_const.types.hh (1.2), src/max_space_dimension.hh
+ (1.11), src/minimize.cc (1.45), src/mp_numeric_limits.cc (1.2),
+ src/mp_numeric_limits.hh (1.10), src/namespaces.hh (1.10),
+ src/ppl-config.cc.in (1.19), src/ppl_header.hh (1.5),
+ src/simplify.cc (1.47), src/swapping_sort.icc (1.12),
+ src/version.cc (1.8), src/version.hh.in (1.15), tests/BBox.cc
+ (1.13), tests/BBox.hh (1.11), tests/FCAIBVP.cc (1.3),
+ tests/FCAIBVP.defs.hh (1.4), tests/FCAIBVP.inlines.hh (1.4),
+ tests/FCAIBVP.types.hh (1.2), tests/Makefile.am (1.260),
+ tests/Partial_Function.cc (1.4), tests/Partial_Function.defs.hh
+ (1.3), tests/Partial_Function.inlines.hh (1.2),
+ tests/Partial_Function.types.hh (1.2),
+ tests/Random_Number_Generator.defs.hh (1.4),
+ tests/Random_Number_Generator.inlines.hh (1.9),
+ tests/Random_Number_Generator.types.hh (1.3), tests/files.cc
+ (1.9), tests/files.hh (1.10), tests/ppl_test.cc (1.7),
+ tests/ppl_test.hh (1.53), tests/print.cc (1.27), tests/print.hh
+ (1.39), tests/Ask_Tell/Makefile.am (1.2),
+ tests/Ask_Tell/append1.cc (1.5), tests/BD_Shape/Makefile.am
+ (1.58), tests/BD_Shape/addconstraints1.cc (1.17),
+ tests/BD_Shape/addspacedims1.cc (1.14),
+ tests/BD_Shape/affinedimension1.cc (1.11),
+ tests/BD_Shape/affineimage1.cc (1.17),
+ tests/BD_Shape/affineimage2.cc (1.12),
+ tests/BD_Shape/affinepreimage1.cc (1.18),
+ tests/BD_Shape/affinepreimage2.cc (1.13),
+ tests/BD_Shape/ascii_dump_load1.cc (1.14),
+ tests/BD_Shape/bdsdifference1.cc (1.13),
+ tests/BD_Shape/bdshull1.cc (1.15),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.9),
+ tests/BD_Shape/bhmz05widening1.cc (1.13),
+ tests/BD_Shape/bhz03widening1.cc (1.9),
+ tests/BD_Shape/bounded1.cc (1.2),
+ tests/BD_Shape/boundedaffineimage1.cc (1.3),
+ tests/BD_Shape/boundedaffinepreimage1.cc (1.2),
+ tests/BD_Shape/bounds1.cc (1.2),
+ tests/BD_Shape/cc76extrapolation1.cc (1.17),
+ tests/BD_Shape/cc76narrowing1.cc (1.17),
+ tests/BD_Shape/closure1.cc (1.15), tests/BD_Shape/concatenate1.cc
+ (1.13), tests/BD_Shape/constraints1.cc (1.18),
+ tests/BD_Shape/contains1.cc (1.14),
+ tests/BD_Shape/containsintegerpoint1.cc (1.2),
+ tests/BD_Shape/discrete1.cc (1.2), tests/BD_Shape/disjoint1.cc
+ (1.5), tests/BD_Shape/empty1.cc (1.10),
+ tests/BD_Shape/equality1.cc (1.15),
+ tests/BD_Shape/expandspacedim1.cc (1.2),
+ tests/BD_Shape/foldspacedims1.cc (1.3),
+ tests/BD_Shape/fromgensys1.cc (1.14),
+ tests/BD_Shape/frompolyhedron1.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.15),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.19),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.13),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.14),
+ tests/BD_Shape/generalizedaffinepreimage3.cc (1.4),
+ tests/BD_Shape/geomcovers1.cc (1.9),
+ tests/BD_Shape/h79widening1.cc (1.12),
+ tests/BD_Shape/intersection1.cc (1.17),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.12),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.13),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.12),
+ tests/BD_Shape/mapspacedims1.cc (1.14),
+ tests/BD_Shape/max_min1.cc (1.2), tests/BD_Shape/max_min2.cc
+ (1.4), tests/BD_Shape/maxspacedim1.cc (1.2),
+ tests/BD_Shape/membytes1.cc (1.2),
+ tests/BD_Shape/minconstraints1.cc (1.10),
+ tests/BD_Shape/relations1.cc (1.16), tests/BD_Shape/relations2.cc
+ (1.20), tests/BD_Shape/relations3.cc (1.22),
+ tests/BD_Shape/removespacedims1.cc (1.18),
+ tests/BD_Shape/run_tests (1.18), tests/BD_Shape/timeelapse1.cc
+ (1.17), tests/BD_Shape/universe1.cc (1.14),
+ tests/BD_Shape/writebdshape1.cc (1.8), tests/Grid/Makefile.am
+ (1.46), tests/Grid/addcongruence1.cc (1.12),
+ tests/Grid/addcongruences1.cc (1.15),
+ tests/Grid/addconstraint1.cc (1.10),
+ tests/Grid/addconstraints1.cc (1.11), tests/Grid/addgenerator1.cc
+ (1.14), tests/Grid/addgenerators1.cc (1.13),
+ tests/Grid/addspacedims1.cc (1.13), tests/Grid/affinedim1.cc
+ (1.11), tests/Grid/affineimage1.cc (1.12),
+ tests/Grid/affineimage2.cc (1.10), tests/Grid/affinepreimage1.cc
+ (1.11), tests/Grid/affinepreimage2.cc (1.6),
+ tests/Grid/approximatepartition1.cc (1.2),
+ tests/Grid/asciidumpload1.cc (1.13), tests/Grid/asciidumpload2.cc
+ (1.5), tests/Grid/asciidumpload3.cc (1.4),
+ tests/Grid/asciidumpload4.cc (1.4), tests/Grid/asciidumpload5.cc
+ (1.2), tests/Grid/asciidumpload6.cc (1.2),
+ tests/Grid/asciidumpload7.cc (1.2), tests/Grid/bhz03widening1.cc
+ (1.12), tests/Grid/bounded1.cc (1.12),
+ tests/Grid/boundedaffineimage1.cc (1.2),
+ tests/Grid/boundedaffinepreimage1.cc (1.2),
+ tests/Grid/boundingbox1.cc (1.14), tests/Grid/boundingbox2.cc
+ (1.12), tests/Grid/bounds1.cc (1.14), tests/Grid/certificate1.cc
+ (1.13), tests/Grid/concatenate1.cc (1.13),
+ tests/Grid/congruence1.cc (1.16), tests/Grid/congruences1.cc
+ (1.11), tests/Grid/congruences2.cc (1.5), tests/Grid/contains1.cc
+ (1.11), tests/Grid/containsintegerpoint1.cc (1.3),
+ tests/Grid/copyconstruct1.cc (1.7), tests/Grid/coveringbox1.cc
+ (1.13), tests/Grid/coveringbox2.cc (1.11),
+ tests/Grid/directproduct1.cc (1.22), tests/Grid/directproduct2.cc
+ (1.5), tests/Grid/discrete1.cc (1.7), tests/Grid/disjoint1.cc
+ (1.11), tests/Grid/equals1.cc (1.12),
+ tests/Grid/expandspacedim1.cc (1.11),
+ tests/Grid/foldspacedims1.cc (1.11),
+ tests/Grid/generalizedaffineimage1.cc (1.12),
+ tests/Grid/generalizedaffineimage2.cc (1.11),
+ tests/Grid/generalizedaffineimage3.cc (1.2),
+ tests/Grid/generalizedaffinepreimage1.cc (1.14),
+ tests/Grid/generalizedaffinepreimage2.cc (1.14),
+ tests/Grid/generalizedaffinepreimage3.cc (1.2),
+ tests/Grid/generator1.cc (1.19), tests/Grid/generators1.cc
+ (1.12), tests/Grid/generators2.cc (1.2), tests/Grid/grid1.cc
+ (1.19), tests/Grid/grid2.cc (1.15), tests/Grid/grid3.cc (1.19),
+ tests/Grid/griddifference1.cc (1.11), tests/Grid/intersection1.cc
+ (1.11), tests/Grid/isempty1.cc (1.7), tests/Grid/isuniverse1.cc
+ (1.9), tests/Grid/join1.cc (1.15), tests/Grid/join2.cc (1.10),
+ tests/Grid/limitedextrapolation1.cc (1.11),
+ tests/Grid/limitedextrapolation2.cc (1.5),
+ tests/Grid/limitedextrapolation3.cc (1.4),
+ tests/Grid/mapspacedims1.cc (1.10), tests/Grid/maxmin1.cc (1.11),
+ tests/Grid/membytes1.cc (1.8), tests/Grid/mincongruences1.cc
+ (1.9), tests/Grid/mingenerators1.cc (1.9),
+ tests/Grid/outputoperator1.cc (1.8),
+ tests/Grid/outputoperator2.cc (1.2),
+ tests/Grid/outputoperator3.cc (1.2), tests/Grid/partition1.cc
+ (1.4), tests/Grid/powersetdifference1.cc (1.2),
+ tests/Grid/powersetgeometricallycovers1.cc (1.2),
+ tests/Grid/powersetgeometricallyequals1.cc (1.2),
+ tests/Grid/relations1.cc (1.13), tests/Grid/relations2.cc (1.15),
+ tests/Grid/relations3.cc (1.6), tests/Grid/removespacedims1.cc
+ (1.13), tests/Grid/removespacedims2.cc (1.13),
+ tests/Grid/timeelapse1.cc (1.10), tests/Grid/topclosed1.cc
+ (1.11), tests/Grid/topclosure1.cc (1.7), tests/Grid/widening1.cc
+ (1.14), tests/Grid/widening2.cc (1.9), tests/Grid/widening3.cc
+ (1.4), tests/Grid/writecongruencesystem.cc (1.7),
+ tests/MIP_Problem/Makefile.am (1.2),
+ tests/MIP_Problem/ascii_dump_load1.cc (1.3),
+ tests/MIP_Problem/exceptions1.cc (1.2),
+ tests/MIP_Problem/mipproblem1.cc (1.3),
+ tests/Octagonal_Shape/Makefile.am (1.14),
+ tests/Octagonal_Shape/addspacedims1.cc (1.2),
+ tests/Octagonal_Shape/affinedimension1.cc (1.3),
+ tests/Octagonal_Shape/affineimage1.cc (1.3),
+ tests/Octagonal_Shape/affineimage2.cc (1.2),
+ tests/Octagonal_Shape/affinepreimage1.cc (1.3),
+ tests/Octagonal_Shape/affinepreimage2.cc (1.2),
+ tests/Octagonal_Shape/ascii_dump_load1.cc (1.2),
+ tests/Octagonal_Shape/bhmz05widening1.cc (1.3),
+ tests/Octagonal_Shape/bhz03widening1.cc (1.2),
+ tests/Octagonal_Shape/bounded1.cc (1.2),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.8),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.3),
+ tests/Octagonal_Shape/bounds1.cc (1.3),
+ tests/Octagonal_Shape/cc76extrapolation1.cc (1.3),
+ tests/Octagonal_Shape/cc76narrowing1.cc (1.3),
+ tests/Octagonal_Shape/chinainit.cc (1.2),
+ tests/Octagonal_Shape/concatenate1.cc (1.2),
+ tests/Octagonal_Shape/constraints1.cc (1.3),
+ tests/Octagonal_Shape/contains1.cc (1.3),
+ tests/Octagonal_Shape/containsintegerpoint1.cc (1.3),
+ tests/Octagonal_Shape/discrete1.cc (1.2),
+ tests/Octagonal_Shape/disjoint1.cc (1.6),
+ tests/Octagonal_Shape/empty1.cc (1.2),
+ tests/Octagonal_Shape/expandspacedim1.cc (1.3),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.2),
+ tests/Octagonal_Shape/fromgensys1.cc (1.2),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.7),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.3),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.2),
+ tests/Octagonal_Shape/intersection1.cc (1.3),
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.3),
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.3),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.3),
+ tests/Octagonal_Shape/max_min1.cc (1.4),
+ tests/Octagonal_Shape/max_min2.cc (1.3),
+ tests/Octagonal_Shape/maxspacedim1.cc (1.2),
+ tests/Octagonal_Shape/membytes1.cc (1.3),
+ tests/Octagonal_Shape/minconstraints1.cc (1.3),
+ tests/Octagonal_Shape/octdifference1.cc (1.3),
+ tests/Octagonal_Shape/octhull1.cc (1.3),
+ tests/Octagonal_Shape/relatwithcons1.cc (1.2),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.4),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.6),
+ tests/Octagonal_Shape/removespacedims1.cc (1.3),
+ tests/Octagonal_Shape/run_tests (1.2),
+ tests/Octagonal_Shape/timeelapse1.cc (1.3),
+ tests/Octagonal_Shape/universe1.cc (1.2),
+ tests/Octagonal_Shape/writeoctagon1.cc (1.3),
+ tests/Polyhedron/Makefile.am (1.103), tests/Polyhedron/README
+ (1.6), tests/Polyhedron/addcongruence1.cc (1.7),
+ tests/Polyhedron/addcongruences1.cc (1.9),
+ tests/Polyhedron/addconstraint1.cc (1.9),
+ tests/Polyhedron/addconstraints1.cc (1.10),
+ tests/Polyhedron/addconstraints2.cc (1.9),
+ tests/Polyhedron/addgenerator1.cc (1.10),
+ tests/Polyhedron/addgenerator2.cc (1.10),
+ tests/Polyhedron/addgenerators1.cc (1.11),
+ tests/Polyhedron/addgenerators2.cc (1.10),
+ tests/Polyhedron/addspacedims1.cc (1.10),
+ tests/Polyhedron/addspacedims2.cc (1.10),
+ tests/Polyhedron/affineimage1.cc (1.10),
+ tests/Polyhedron/affineimage2.cc (1.10),
+ tests/Polyhedron/affinepreimage1.cc (1.9),
+ tests/Polyhedron/affinetrans.cc (1.10),
+ tests/Polyhedron/append1.cc (1.10), tests/Polyhedron/append2.cc
+ (1.9), tests/Polyhedron/ascii_dump_load1.cc (1.9),
+ tests/Polyhedron/ascii_dump_load2.cc (1.9),
+ tests/Polyhedron/ascii_dump_load3.cc (1.10),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.12),
+ tests/Polyhedron/bhrz03widening1.cc (1.9),
+ tests/Polyhedron/bhrz03widening2.cc (1.9),
+ tests/Polyhedron/bhrz03widening3.cc (1.10),
+ tests/Polyhedron/bhz03widening1.cc (1.13),
+ tests/Polyhedron/bounded1.cc (1.10),
+ tests/Polyhedron/boundedaffineimage1.cc (1.8),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.7),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.8),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.10),
+ tests/Polyhedron/boundingbox1.cc (1.13),
+ tests/Polyhedron/boundingbox2.cc (1.12),
+ tests/Polyhedron/boundingbox3.cc (1.13),
+ tests/Polyhedron/bounds1.cc (1.10),
+ tests/Polyhedron/cnncconversion1.cc (1.3),
+ tests/Polyhedron/concatenate1.cc (1.9),
+ tests/Polyhedron/congruences1.cc (1.7),
+ tests/Polyhedron/constraints1.cc (1.9),
+ tests/Polyhedron/contains1.cc (1.9),
+ tests/Polyhedron/contains2.cc (1.9),
+ tests/Polyhedron/containsintegerpoint1.cc (1.2),
+ tests/Polyhedron/disjoint1.cc (1.9),
+ tests/Polyhedron/disjoint2.cc (1.11),
+ tests/Polyhedron/dualhypercubes.cc (1.11),
+ tests/Polyhedron/empty1.cc (1.10), tests/Polyhedron/equals1.cc
+ (1.9), tests/Polyhedron/exceptions1.cc (1.12),
+ tests/Polyhedron/exceptions2.cc (1.11),
+ tests/Polyhedron/exceptions3.cc (1.10),
+ tests/Polyhedron/expandspacedim1.cc (1.11),
+ tests/Polyhedron/expandspacedim2.cc (1.11),
+ tests/Polyhedron/foldspacedims1.cc (1.13),
+ tests/Polyhedron/foldspacedims2.cc (1.14),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.10),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.10),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.7),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.7),
+ tests/Polyhedron/generators1.cc (1.10),
+ tests/Polyhedron/geomcovers1.cc (1.13),
+ tests/Polyhedron/h79widening1.cc (1.9),
+ tests/Polyhedron/h79widening2.cc (1.9),
+ tests/Polyhedron/hybrid.cc (1.3),
+ tests/Polyhedron/intersection1.cc (1.13),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.8),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.9),
+ tests/Polyhedron/linearpartition1.cc (1.11),
+ tests/Polyhedron/linearsystem1.cc (1.8),
+ tests/Polyhedron/linexpression1.cc (1.9),
+ tests/Polyhedron/mapspacedims1.cc (1.12),
+ tests/Polyhedron/matrix1.cc (1.9), tests/Polyhedron/max_min1.cc
+ (1.11), tests/Polyhedron/maxspacedim1.cc (1.11),
+ tests/Polyhedron/mc91.cc (1.14), tests/Polyhedron/membytes1.cc
+ (1.14), tests/Polyhedron/memory1.cc (1.11),
+ tests/Polyhedron/memory2.cc (1.12),
+ tests/Polyhedron/minconstraints1.cc (1.9),
+ tests/Polyhedron/minconstraints2.cc (1.11),
+ tests/Polyhedron/mingenerators1.cc (1.9),
+ tests/Polyhedron/mingenerators2.cc (1.10),
+ tests/Polyhedron/nncminimize1.cc (1.5),
+ tests/Polyhedron/nncminimize2.cc (1.6),
+ tests/Polyhedron/numberinput1.cc (1.29),
+ tests/Polyhedron/onepoint.cc (1.10), tests/Polyhedron/permute.cc
+ (1.7), tests/Polyhedron/pointsetpowerset1.cc (1.5),
+ tests/Polyhedron/polydifference1.cc (1.10),
+ tests/Polyhedron/polydifference2.cc (1.10),
+ tests/Polyhedron/polyhull1.cc (1.10),
+ tests/Polyhedron/polyhull2.cc (1.10),
+ tests/Polyhedron/powerset1.cc (1.19),
+ tests/Polyhedron/randphull1.cc (1.10),
+ tests/Polyhedron/randphull2.cc (1.9),
+ tests/Polyhedron/relations1.cc (1.9),
+ tests/Polyhedron/relations2.cc (1.10),
+ tests/Polyhedron/relations3.cc (1.9),
+ tests/Polyhedron/removespacedims1.cc (1.9),
+ tests/Polyhedron/removespacedims2.cc (1.9),
+ tests/Polyhedron/smm1.cc (1.7), tests/Polyhedron/timeelapse1.cc
+ (1.10), tests/Polyhedron/timeelapse2.cc (1.10),
+ tests/Polyhedron/topclosed1.cc (1.10),
+ tests/Polyhedron/topclosure1.cc (1.9),
+ tests/Polyhedron/universe1.cc (1.9),
+ tests/Polyhedron/universe2.cc (1.9),
+ tests/Polyhedron/variablesset1.cc (1.9),
+ tests/Polyhedron/watchdog1.cc (1.9),
+ tests/Polyhedron/writeconsys1.cc (1.9),
+ tests/Polyhedron/writegensys1.cc (1.9),
+ tests/Polyhedron/writepolyhedron1.cc (1.9),
+ tests/Polyhedron/writepolyhedron2.cc (1.9),
+ tests/Polyhedron/writerelation1.cc (1.11),
+ tests/Polyhedron/writevariable1.cc (1.7), utils/Makefile.am
+ (1.14), utils/build_header.in (1.4), utils/cm_cleaner.sh (1.2),
+ utils/cm_splitter.sh (1.2), utils/text2cxxarray.in (1.3),
+ utils/timings.cc (1.8), utils/timings.hh (1.5): Copyright years
+ extended.
+
+2006-12-30 Saturday 21:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.30):
+ Fixed a bug for Pointset_Powerset BHZ03 extrapolation predicates.
+
+2006-12-30 Saturday 14:03 Andrea Cimino
+
+ * configure.ac (1.258): Removed an extra (previously added) `@'.
+
+2006-12-30 Saturday 13:55 Andrea Cimino
+
+ * configure.ac (1.257): Fixed to allow compiling the Java interface
+ when the instantiation Pointset_Powerset<Polyhedron> is
+ requested.
+
+2006-12-28 Thursday 16:57 Andrea Cimino
+
+ * m4/ac_prog_java.m4 (1.4): Fixed a `test' statement in a m4 macro.
+
+2006-12-27 Wednesday 14:25 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.10), ppl_interface_generator_ocaml_dat.m4 (1.3),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.10),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.3), test1.ml (1.26):
+ Written initial support for OCaml Pointset_Powerset.
+
+2006-12-26 Tuesday 14:48 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.9), ppl_interface_generator_ocaml_dat.m4 (1.2),
+ ppl_interface_generator_ocaml_ml.m4 (1.6), ppl_ocaml_globals.cc
+ (1.6): Launch an OCaml exception if a PPL method requires an
+ unsigned integer and the input is a negative number. Fixed some
+ bugs in the interface.
+
+2006-12-26 Tuesday 12:40 Andrea Cimino
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.8):
+ Fixed a wrong m4 replacement.
+
+2006-12-25 Monday 17:02 Andrea Cimino
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.22), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.11): Added CC76_narrowing_assign in the Java interface.
+
+2006-12-24 Sunday 14:56 Andrea Cimino
+
+ * m4/ac_prog_javac.m4 (1.3): Put an extra space between `whether'
+ and `$JAVAC' in a `configure' message.
+
+2006-12-24 Sunday 11:59 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.7), ppl_interface_generator_ocaml_ml_code.m4 (1.9),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.2), test1.ml (1.25):
+ Widening OCaml function are split in versions with and without
+ tokens.
+
+2006-12-23 Saturday 19:00 Andrea Cimino
+
+ * interfaces/OCaml/: Makefile.am (1.24),
+ ppl_interface_generator_ocaml_cc_code.m4 (1.6),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.8),
+ ppl_interface_generator_ocaml_mli.m4 (1.1),
+ ppl_interface_generator_ocaml_mli_code.m4 (1.1), ppl_ocaml.mli
+ (1.18), ppl_ocaml_globals.ml (1.5): Now the interface file .mli
+ is automatically generated. Added support for compilation with
+ srcdir != builddir. Added support for parallel builds.
+
+2006-12-23 Saturday 15:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.91): Revised the documentation for
+ refine_existential() and refine_universal().
+
+2006-12-22 Friday 17:20 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.5), ppl_interface_generator_ocaml_ml_code.m4 (1.7): Interfaced
+ other functions in the OCaml interface.
+
+2006-12-22 Friday 16:14 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.8),
+ ppl_java_Polyhedron.cc (1.20): Removed previously non generated
+ source files.
+
+2006-12-22 Friday 16:11 Andrea Cimino
+
+ * interfaces/OCaml/Makefile.am (1.23): Modified dependencies for
+ source files in Makefile.am.
+
+2006-12-22 Friday 16:01 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.ml (1.5): Removed the non generated
+ `ppl_ocaml.ml' from the repository.
+
+2006-12-22 Friday 15:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.9): Make sure the current
+ directory is made before `tests'.
+
+2006-12-22 Friday 15:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am (1.10): Compile against
+ ../ppl_java.jar.
+
+2006-12-22 Friday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am (1.9): Do not distribute
+ generated files. Use `check_JAVA' instead of `EXTRA_DIST'.
+ Notice that, due to a bug in Automake (at least until version
+ 1.9.6) check_JAVA targes are always compiled. That bug has
+ already been reported.
+
+2006-12-22 Friday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.32): Generated file should not
+ be under CVS.
+
+2006-12-22 Friday 14:05 Andrea Cimino
+
+ * interfaces/Java/tests/Makefile.am (1.8): Java tests restored.
+
+2006-12-22 Friday 11:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (1.2): Make sure
+ __STDC_LIMIT_MACROS is defined before the first inclusion of
+ <stdint.h>.
+
+2006-12-22 Friday 11:09 Andrea Cimino
+
+ * interfaces/Java/tests/Makefile.am (1.7): Use always
+ `ppl_java.jar' archive to build and run the tests.
+
+2006-12-22 Friday 10:33 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.24): Written a Doxygen
+ comment for function `jtype_to_unsigned'.
+
+2006-12-21 Thursday 17:28 Andrea Cimino
+
+ * interfaces/OCaml/test1.ml (1.24): Restored the
+ `map_space_dimensions' call.
+
+2006-12-21 Thursday 17:02 Andrea Cimino
+
+ * interfaces/OCaml/test1.ml (1.23): Modified the partial function
+ to be valid and so the C++ world doesn't throw exceptions
+
+2006-12-21 Thursday 16:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.5):
+ Correctly generate the type c_polyhedron and nnc_polyhedron as
+ well as any other class type.
+
+2006-12-21 Thursday 16:20 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.4), ppl_interface_generator_ocaml_ml.m4 (1.4),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.6), test1.ml (1.22):
+ Split Polyhedron in C_Polyhedron and NNC_Polyhedron.
+
+2006-12-21 Thursday 13:00 Andrea Cimino
+
+ * interfaces/OCaml/Makefile.am (1.22): Now it's possible to use the
+ PPL using the module installed in the OCaml library directory.
+
+2006-12-21 Thursday 09:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.29),
+ ppl_interface_generator_prolog_icc_code.m4 (1.37),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.46):
+ Added predicates for ..._upper_bound_if_exact and
+ poly_hull_if_exact. Tests for them also added.
+
+2006-12-20 Wednesday 16:48 Andrea Cimino
+
+ * interfaces/OCaml/Makefile.am (1.21): Install ppl module in OCaml
+ library directory if requested.
+
+2006-12-20 Wednesday 15:47 Andrea Cimino
+
+ * interfaces/Java/jni/Makefile.am (1.9), m4/ac_prog_javah.m4 (1.7):
+ Include JDK Path during C++ compilation just when the Java
+ interface is compiled. Avoid using obsolete Autoconf macros.
+
+2006-12-20 Wednesday 14:56 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.27): Fixed a bug in the
+ Java interface: Java grid parameters where not properly
+ generated.
+
+2006-12-20 Wednesday 13:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+ (1.5), test1.ml (1.21): A bug in the code for generalized affine
+ image fixed. Improved the printing layout by test1.ml. Other
+ small additions to the tests in test1.ml.
+
+2006-12-20 Wednesday 12:35 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+ (1.4), ppl_ocaml_types.ml (1.5), test1.ml (1.20): Uniformed name
+ types. Little corrections to allow test code to compile.
+
+2006-12-20 Wednesday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+ (1.3), ppl_ocaml_types.ml (1.4): Some bugs corrected.
+
+2006-12-20 Wednesday 11:46 Andrea Cimino
+
+ * interfaces/OCaml/Makefile.am (1.20): Never remove generated
+ files.
+
+2006-12-20 Wednesday 11:32 Andrea Cimino
+
+ * interfaces/OCaml/Makefile.am (1.19): Patched the Makefile.am to
+ give priority to generated .ml files when compiling.
+
+2006-12-20 Wednesday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.3), ppl_interface_generator_ocaml_ml.m4 (1.3),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.2),
+ ppl_ocaml_types.ml (1.3): Added ppl_ at CLASS@_equals_ at CLASS@ to the
+ interface. Corrected bugs in code for
+ ppl_ at CLASS@_ at COMPARISON@_ at CLASS@ Added a type
+ "relation_with_grid_generator" and corrected some typos that
+ prevented the generated ppl_ocaml.ml compiling.
+
+2006-12-19 Tuesday 18:07 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml_globals.cc (1.5): Don't forget the
+ denominator when building PPL grid parameters.
+
+2006-12-19 Tuesday 18:04 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml_globals.cc (1.4), ppl_ocaml_types.ml
+ (1.2): Implemented support for grid_generator and
+ grid_generator_system. No more noisy warnings.
+
+2006-12-19 Tuesday 15:56 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+ (1.2), ppl_ocaml_globals.cc (1.3): Compilation restored but still
+ some work needed to let work things properly.
+
+2006-12-19 Tuesday 14:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.31): Restore file that should
+ not have been revised in previous commit.
+
+2006-12-19 Tuesday 14:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: Makefile.am (1.18),
+ ppl_interface_generator_ocaml_cc.m4 (1.1),
+ ppl_interface_generator_ocaml_cc_code.m4 (1.1), ppl_ocaml.cc
+ (1.30), ppl_ocaml_globals.cc (1.2), test1.ml (1.19): Adding code
+ for generating the ppl_ocaml.cc file.
+
+2006-12-19 Tuesday 10:44 Andrea Cimino
+
+ * interfaces/Java/Makefile.am (1.8): Install ppl_java.jar in
+ $prefix/lib/ppl when a `make install' is invoked.
+
+2006-12-19 Tuesday 09:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: ppl_interface_generator_ocaml_ml.m4 (1.2),
+ ppl_ocaml.cc (1.29), ppl_ocaml_globals.cc (1.1),
+ ppl_ocaml_globals.ml (1.4): Separated the ppl_ocaml.cc code into
+ a fixed part and a part to be generated. Moved more code from
+ the generated part of ppl_ocaml.ml to the fixed part.
+
+2006-12-19 Tuesday 09:30 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.6),
+ Makefile.am (1.6): Added a simple test for the Java interface.
+ Modified Makefile.am to avoid possible problems when `make check'
+ is called more than one time.
+
+2006-12-18 Monday 23:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/OCaml/: Makefile.am (1.17),
+ ppl_interface_generator_ocaml_dat.m4 (1.1),
+ ppl_interface_generator_ocaml_ml.m4 (1.1),
+ ppl_interface_generator_ocaml_ml_code.m4 (1.1), ppl_ocaml.cc
+ (1.28), ppl_ocaml.ml (1.4), ppl_ocaml.mli (1.17), test1.ml
+ (1.18): Revised names of functions to match the rest of the
+ interfaces. Now ppl_ocaml.ml is generated using m4 (but only
+ checked for the Polyhedron class).
+
+2006-12-15 Friday 14:26 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.27), ppl_ocaml_globals.ml
+ (1.3), test1.ml (1.17): Implemented
+ `ppl_MIP_Problem_objective_function'.
+
+2006-12-14 Thursday 16:13 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.44), src/Variables_Set.cc (1.3),
+ src/Variables_Set.defs.hh (1.4),
+ tests/MIP_Problem/ascii_dump_load1.cc (1.2): Added `ascii_load'
+ and `ascii_dump' for Variables_Set. MIP problem now correctly
+ loads and dumps problems with declared integer variables.
+
+2006-12-14 Thursday 12:25 Andrea Cimino
+
+ * interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.3),
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.21), jni/ppl_java_globals.cc (1.4),
+ tests/ppl_interface_generator_java_test_java_code.m4 (1.10),
+ tests/ppl_java_tests_common (1.6): All the Java classes now have
+ the `toString' method that returns a string representation of
+ each PPL object.
+
+2006-12-14 Thursday 10:50 Andrea Cimino
+
+ * interfaces/Java/: jni/ppl_java_globals.cc (1.3),
+ tests/ppl_java_tests_common (1.5): Added the method `toString'
+ the returns a string representation of a linear expression.
+
+2006-12-13 Wednesday 19:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am, interval2.cc (altnum.[5,1]): A test
+ derived from interval1.cc that exhibits an interesting behavior.
+
+2006-12-13 Wednesday 18:38 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.90): Fixed typo.
+
+2006-12-13 Wednesday 18:31 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.26): Removed previously
+ commented code (now useless).
+
+2006-12-13 Wednesday 18:27 Andrea Cimino
+
+ * interfaces/OCaml/: Makefile.am (1.16), ppl_ocaml.cc (1.25),
+ ppl_ocaml.ml (1.3), ppl_ocaml.mli (1.16), ppl_ocaml_globals.ml
+ (1.2), ppl_ocaml_types.ml (1.1), test1.ml (1.16): Defined the
+ data structures used in `ppl_ocaml_types.ml'. MIP_Problem
+ interface almost completed.
+
+2006-12-13 Wednesday 14:46 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.30): Added missing fixme comment.
+
+2006-12-13 Wednesday 14:42 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Checked_Number.defs.hh,
+ Checked_Number.inlines.hh, Interval.defs.hh
+ (altnum.[29,42,36,89]): Completed division implementation.
+
+2006-12-12 Tuesday 19:57 Andrea Cimino
+
+ * interfaces/OCaml/: Makefile.am (1.15), ppl_ocaml.cc (1.24),
+ ppl_ocaml.ml (1.2), ppl_ocaml_globals.ml (1.1), test1.ml (1.15):
+ Added the file `ppl_ocaml_globals.ml' that should contain the
+ fixed code after the migration to m4.
+
+2006-12-12 Tuesday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (altnum.6): Useless code removed.
+
+2006-12-12 Tuesday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (altnum.5): Revised so as to perform more
+ interesting tests.
+
+2006-12-12 Tuesday 18:29 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh (altnum.[28,88]): New
+ implementation for intervals add, sub and mul.
+
+2006-12-11 Monday 16:30 Andrea Cimino
+
+ * configure.ac (1.256), interfaces/OCaml/Makefile.am (1.14),
+ interfaces/OCaml/ppl_ocaml.ml (1.1),
+ interfaces/OCaml/ppl_ocaml.mli (1.15): Separated declaration and
+ implementation of the OCaml interface. Added some kinds of
+ exceptions that relates to PPL. Added a piece of code in
+ `configure.ac' that tries to detect the presence of the GMP-OCaml
+ module.
+
+2006-12-10 Sunday 16:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/hybrid.cc (1.2): Tests 01 and 02 fail with 8-bit
+ coefficients; the same for test 04, but only when assertions are
+ enabled.
+
+2006-12-08 Friday 23:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/: Makefile.am (1.102), hybrid.cc (1.1): The
+ hybrid.cc tests three examples adapted from the papers by
+ Halbwachs, Proy and Roumanoff on linear hybrid systems (1994 and
+ 1997).
+
+2006-12-08 Friday 14:58 Andrea Cimino
+
+ * tests/Polyhedron/: Makefile.am, serialize1.cc (serial.[1,1]):
+ Added some tests for the Serializer class.
+
+2006-12-08 Friday 12:54 Andrea Cimino
+
+ * configure.ac, m4/ac_check_bz2lib.m4, m4/ac_check_zlib.m4,
+ src/Bit_Matrix.defs.hh, src/Bit_Row.defs.hh,
+ src/Constraint_System.defs.hh, src/Generator_System.defs.hh,
+ src/Linear_System.defs.hh, src/Makefile.am,
+ src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh, src/Row.defs.hh,
+ src/Serializer.cc, src/Serializer.defs.hh,
+ src/Serializer.inlines.hh, src/Serializer.types.hh
+ (serial.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Put the Serializer
+ class under CVS control. Added some friend declaration to let
+ the Serializer compile. Added a couple of macros to detect if
+ `bz2' and `gzlib' are installed.
+
+2006-12-07 Thursday 11:05 Andrea Cimino
+
+ * src/Polyhedron_nonpublic.cc (1.74): Use `gen_sys_i' instead of
+ `g' whenever is appropriate to avoid wrong computations.
+
+2006-12-07 Thursday 10:00 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.67): Removed an useless variable and
+ added const to a variable in BD_Shape::refine.
+
+2006-12-06 Wednesday 19:58 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh (altnum.[27,87]): Fixed
+ some compilation errors.
+
+2006-12-06 Wednesday 18:20 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.86): Commented out empty check in
+ OK().
+
+2006-12-06 Wednesday 18:17 Abramo Bagnara
+
+ * src/: Box.inlines.hh, Box.templates.hh, Interval.defs.hh
+ (altnum.[25,35,85]): Added non working implementation of
+ refine_universal. Renamed refine in refine_existential.
+
+2006-12-06 Wednesday 16:38 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, checked_ext.inlines.hh
+ (altnum.[26,84,13]): Some name cleaning. Fixed comparison.
+
+2006-12-06 Wednesday 16:24 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.23), ppl_ocaml.mli (1.14),
+ test1.ml (1.14): Implemented `map_space_dimension' function in
+ the OCaml interface.
+
+2006-12-06 Wednesday 15:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/: Makefile.am, boxdifference1.cc (altnum.[4,1]): Added
+ a test file for the box_difference_assign() method.
+
+2006-12-06 Wednesday 15:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[22,24,34]): Added declarations and drafted
+ implementations for methods box_difference_assign() and
+ difference_assign(). Added an assertion inside add_constraint(),
+ showing a bug in function refine working on Interval objects.
+
+2006-12-06 Wednesday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (altnum.41): Added missing access
+ control specification.
+
+2006-12-06 Wednesday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.39): Compiler warnings avoided.
+
+2006-12-06 Wednesday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.20): Missing inclusions added.
+
+2006-12-06 Wednesday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.cc (1.21): Shadowing avoided.
+
+2006-12-06 Wednesday 09:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (altnum.7): Now the empty box
+ (for any number of dimensions) is represented by the singleton
+ list [empty], the test data has to be updated to match.
+
+2006-12-06 Wednesday 08:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+ ppl_prolog_common.icc, tests/pl_check.pl (altnum.[7,4,6]): In
+ tests/pl_check.pl, spelling correction done that has already been
+ done in the main branch.
+
+ In ppl_prolog_common.icc, in interval_term(), the upper bound
+ when unbounded has to be "pinf" and not "minf".
+
+ In the ppl_prolog.icc code for get_bounding_box, we must cater
+ specially for the empty box.
+
+2006-12-05 Tuesday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh (1.3): Old compilers cannot cope with the
+ change of the previous commit: reverted.
+
+2006-12-05 Tuesday 21:53 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.22): Avoid to hide previously
+ declared variables if there is no need.
+
+2006-12-05 Tuesday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh (1.2): Useless qualifications (tentatively)
+ removed.
+
+2006-12-05 Tuesday 20:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh (1.23): Spurious declaration removed.
+
+2006-12-05 Tuesday 20:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.21): Useless breaks removed.
+ Added a FIXME.
+
+2006-12-05 Tuesday 19:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.12):
+ Duplicate return statement removed.
+
+2006-12-05 Tuesday 19:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.11):
+ Spurious semicolon removed.
+
+2006-12-05 Tuesday 19:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.73): Avoid shadowing parameters.
+
+2006-12-05 Tuesday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.defs.hh (1.17), Congruence.inlines.hh (1.14),
+ Constraint.cc (1.64), Constraint.inlines.hh (1.65),
+ Grid.inlines.hh (1.12), Grid_Generator.defs.hh (1.27),
+ Grid_Generator.inlines.hh (1.12),
+ Grid_Generator_System.inlines.hh (1.11), Makefile.am (1.166),
+ Polyhedron.inlines.hh (1.135): Inclusions fixed. A couple of
+ constructors (with loops) made non-inline. Made sure inlines are
+ defined before being called.
+
+2006-12-05 Tuesday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/max_space_dimension.hh (1.10): Fixed max_space_dimension().
+
+2006-12-05 Tuesday 17:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/fromgensys1.cc (altnum.3): Adapted to the Box
+ abstraction; also test the case of closure points.
+
+2006-12-05 Tuesday 17:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.33): Implemented constructor
+ Box(const Generator_System& gs).
+
+2006-12-05 Tuesday 17:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.42): Spelling corrected.
+
+2006-12-05 Tuesday 17:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh (altnum.[21,23]): Added
+ recycling constructors from systems of constraints/generators.
+ Prefer Interval::set_universe() where appropriate.
+
+2006-12-05 Tuesday 11:35 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.20), ppl_ocaml.mli (1.13),
+ test1.ml (1.13): Implemented `fold_space_dimensions' and
+ `remove_space_dimensions'.
+
+2006-12-05 Tuesday 09:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/mapspacedims1.cc (altnum.3): Fixed known results.
+
+2006-12-05 Tuesday 09:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.22): Temporarily patched constructor
+ taking a Constraint_System.
+
+2006-12-04 Monday 23:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.32): Do not assume the underlying
+ interval type can handle empty intervals (apart from answering
+ the is_empty() query).
+
+2006-12-04 Monday 23:11 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.83): Invalidate cardinality cache
+ when needed.
+
+2006-12-04 Monday 22:54 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.82): Added missing return.
+
+2006-12-04 Monday 22:49 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.81): Call normalize() only on
+ restricted intervals.
+
+2006-12-04 Monday 22:33 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Result.defs.hh, checked.defs.hh
+ (altnum.[40,3,41]): Made Check_Overflow_Policy more transparent.
+
+2006-12-04 Monday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/empty1.cc (altnum.2): New function test06() exhibits a
+ bug in Box::is_empty(). The other tests are currently not
+ executed since they are waiting for conversion.
+
+2006-12-04 Monday 22:06 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.80): Added OK() calls.
+
+2006-12-04 Monday 21:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[20,21,31]): Drafted implementation of methods swap and
+ map_space_dimensions.
+
+2006-12-04 Monday 21:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.30): Corrected method is_bounded().
+
+2006-12-04 Monday 21:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/bhz03widening1.cc (altnum.2): Disambiguate pointer to
+ widening method. Added a FIXME to remember that we need to define
+ a widening certificate for CC76.
+
+2006-12-04 Monday 21:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/boxhull1.cc (altnum.1): Put under CVS control.
+
+2006-12-04 Monday 21:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Box/bgp99extrapolation1.cc (altnum.2): Avoid ambiguity when
+ taking the address of method CC76_widening_assign.
+
+2006-12-04 Monday 20:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.templates.hh (altnum.[19,29]): Added
+ (optional) tokens support to CC76 widening method.
+
+2006-12-04 Monday 20:03 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.79): Fixed singleton output.
+
+2006-12-04 Monday 19:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (altnum.4): Do not rely on default
+ parameters of std::complex constructors.
+
+2006-12-04 Monday 19:43 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.78): Added explicit.
+
+2006-12-04 Monday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/interval1.cc (altnum.3): First rough bits of a new test
+ shows some interesting things.
+
+2006-12-04 Monday 19:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.templates.hh, Interval.defs.hh
+ (altnum.[18,28,77]): Drafted implementations for
+ Box::ascii_dump() and Box::ascii_load(), currently depending on
+ stub implementations of the corresponding methods of class
+ Interval.
+
+2006-12-04 Monday 18:56 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.76): Added return value.
+
+2006-12-04 Monday 18:52 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.75): Fixed info for singleton.
+
+2006-12-04 Monday 18:46 Abramo Bagnara
+
+ * src/: Box.inlines.hh, Interval.defs.hh (altnum.[20,74]): Fixed
+ division.
+
+2006-12-04 Monday 18:36 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.73): Fixed return type.
+
+2006-12-04 Monday 18:25 Abramo Bagnara
+
+ * src/: Interval.defs.hh, Interval_Restriction.defs.hh
+ (altnum.[72,9]): Added operators.
+
+2006-12-04 Monday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.71): Added naive version of
+ Interval::Interval(const Boundary&).
+
+2006-12-04 Monday 17:57 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (altnum.35): Fixed typo.
+
+2006-12-04 Monday 16:50 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.70): Fixed signatures.
+
+2006-12-04 Monday 16:24 Abramo Bagnara
+
+ * tests/Box/interval1.cc (altnum.2): Fixed policy.
+
+2006-12-04 Monday 15:49 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.19): Simplified the code to
+ build constraint systems, generator systems and congruence
+ systems.
+
+2006-12-04 Monday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/boundingbox3.cc (altnum.5): Print constraints
+ whenever printing generators does not give any advantage. Always
+ print after having determined the result of the test.
+
+2006-12-04 Monday 15:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.31): Missing dependency added.
+
+2006-12-04 Monday 15:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.27): Corrected a bug in
+ CC76_widening_assign().
+
+2006-12-04 Monday 15:22 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.18), ppl_ocaml.mli (1.12):
+ Drafted a first implementation of `relation_with' methods. In
+ OCaml the value returned is a list with the relations between a
+ Constraint/Generator and the Polyhedron.
+
+2006-12-04 Monday 14:48 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.69): Use checked I/O.
+
+2006-12-04 Monday 14:47 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[39,34]): Added I/O for native.
+
+2006-12-04 Monday 14:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: boundingbox1.cc, boundingbox2.cc
+ (altnum.[5,4]): Print constraints whenever printing generators
+ does not give any advantage. Always print after having
+ determined the result of the test.
+
+2006-12-04 Monday 14:15 Abramo Bagnara
+
+ * src/Interval_Restriction.defs.hh (altnum.8): Fixed restrict()
+ return value.
+
+2006-12-04 Monday 13:56 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.25): Fixed typo.
+
+2006-12-04 Monday 12:44 Abramo Bagnara
+
+ * src/: Interval_Info.defs.hh, Interval_Restriction.defs.hh
+ (altnum.[16,7]): Clear info in constructors.
+
+2006-12-04 Monday 12:43 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.68): Added I_MAYBE_EMPTY.
+
+2006-12-04 Monday 12:43 Abramo Bagnara
+
+ * src/Box.inlines.hh (altnum.19): Fixed use of I_Result.
+
+2006-12-04 Monday 12:42 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.24): Fixed boundary comparison.
+
+2006-12-04 Monday 10:42 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.17), ppl_ocaml.mli (1.11),
+ test1.ml (1.12): Implemented the swap operation between two
+ polyhedrons.
+
+2006-12-03 Sunday 22:30 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Interval_Restriction.defs.hh,
+ Temp.defs.hh, checked.inlines.hh (altnum.[38,6,9,31]): Removed
+ optional parameter in Enable_If when it's useless and confusing.
+
+2006-12-03 Sunday 22:22 Abramo Bagnara
+
+ * src/Temp.defs.hh (altnum.8): Added option type parameter.
+
+2006-12-03 Sunday 20:29 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh, Temp.defs.hh (altnum.[33,7]):
+ Fixed swap calls.
+
+2006-12-03 Sunday 20:20 Abramo Bagnara
+
+ * src/Temp.defs.hh (altnum.6): Cleaned namespace mess.
+
+2006-12-03 Sunday 19:56 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Temp.defs.hh, mp_std_bits.defs.hh, mp_std_bits.inlines.hh,
+ Checked_Number.defs.hh, mp_std_bits.defs.hh
+ (altnum.[36,32,5,3,2,37,4]): Moved swap in the same namespace of
+ type of its arguments.
+
+2006-12-03 Sunday 17:57 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+ Rational_Box.hh (altnum.[23,67,15,11]): Removed policy flag
+ infinity_is_open and fixed the related mess.
+
+2006-12-03 Sunday 17:20 Abramo Bagnara
+
+ * src/Rational_Box.hh (altnum.10): Fixed policy.
+
+2006-12-03 Sunday 17:17 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.66): Fixed OK check.
+
+2006-12-03 Sunday 16:00 Abramo Bagnara
+
+ * src/globals.defs.hh (altnum.13): Much more elegant definitions
+ for Constant.
+
+2006-12-03 Sunday 14:48 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.16), ppl_ocaml.mli (1.10),
+ test1.ml (1.11): Implemented `maximize', `minimize' and
+ `expand_space_dimension'.
+
+2006-12-03 Sunday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (altnum.3): Restored some
+ of the code lost during the ninth merge from the main trunk.
+
+2006-12-03 Sunday 00:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (altnum.7): Avoid comparing a
+ Checked_Number with the integer constant 1.
+
+2006-12-02 Saturday 23:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS, TODO, config.guess, config.sub, configure.ac,
+ instchk.hh, Watchdog/config.guess, Watchdog/config.sub,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+ doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, interfaces/Makefile.am,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/C/Makefile.am,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dat.m4,
+ interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/jni/ppl_java_globals.cc,
+ interfaces/Java/tests/.cvsignore,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am,
+ interfaces/Java/tests/Test_Partial_Function.java,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+ interfaces/Java/tests/ppl_java_tests_common,
+ interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+ interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SICStus/sp_predicate_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/swi_predicate_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+ m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+ m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+ src/Any_Pointset.defs.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+ src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+ src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+ src/Bit_Row.types.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid_Generator_System.cc,
+ src/Grid_chdims.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+ src/Grid_widenings.cc, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Makefile.am,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+ src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+ src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+ src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+ src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+ src/Variables_Set.cc, src/Variables_Set.defs.hh,
+ src/Variables_Set.inlines.hh, src/conversion.cc,
+ src/globals.defs.hh, src/minimize.cc, src/mp_std_bits.cc,
+ src/mp_std_bits.defs.hh, src/simplify.cc, src/swapping_sort.icc,
+ tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+ tests/FCAIBVP.inlines.hh, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+ tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/relations3.cc,
+ tests/Grid/Makefile.am, tests/Grid/approximatepartition1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/partition1.cc, tests/Grid/powersetdifference1.cc,
+ tests/Grid/powersetgeometricallycovers1.cc,
+ tests/Grid/powersetgeometricallyequals1.cc,
+ tests/Grid/widening2.cc, tests/MIP_Problem/mipproblem1.cc,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+ utils/cm_cleaner.sh, utils/cm_splitter.sh
+ (altnum.[5,9,6,5,23,3,6,5,12,6,7,3,5,9,7,3,4,3,3,3,3,4,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,6,7,2,3,7,6,7,3,3,2,2,7,2,6,3,6,3,3,5,3,3,3,2,3,2,2,2,2,2,3,5,5,6,2,2,2,2,2,2,2,2,26,5,7,6,35,3,3,3,3,3,3,3,6,6,6,3,3,30,2,6,6,3,3,6,3,3,3,3,10,7,14,11,9,3,3,3,3,4,3,4,3,3,3,3,8,12,6,1,2,7,5,3,3,3,6,3,2,2,4,3,2,2,4,2,4,3,2,3,3,3,2,2,2,3,3,6,3,3,2,3,3,2,3,2,2,3,2,3,4,3,3,3,3,2,2]):
+ Ninth merge of the trunk to the `altnum' branch.
+
+2006-12-02 Saturday 18:01 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[34,31]): Adjusted prototype for arithmetic operators.
+
+2006-12-02 Saturday 17:27 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh (altnum.[22,65]):
+ Adjusted prototype for interval == and !=.
+
+2006-12-02 Saturday 16:48 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ checked.defs.hh, checked_float.inlines.hh,
+ checked_int.inlines.hh, checked_mpq.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[33,30,40,31,40,36,39]): Made
+ relational operators on Checked_Numbers less invasive.
+
+2006-12-02 Saturday 16:22 Abramo Bagnara
+
+ * src/C_Integer.hh (altnum.1): Added support for Constants. Use
+ only a template for all C integers info.
+
+2006-12-02 Saturday 16:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh (altnum.5): Drafted the documentation for
+ template <bool b> struct Compile_Time_Check.
+
+2006-12-02 Saturday 16:12 Abramo Bagnara
+
+ * src/: Limits.hh, Makefile.am, checked.inlines.hh,
+ checked_int.inlines.hh, checked_mpz.inlines.hh, globals.defs.hh
+ (altnum.[7,29,30,39,38,11]): Added support for Constants. Use
+ only a template for all C integers info.
+
+2006-12-02 Saturday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh (altnum.4): Added an example showing how
+ to use Enable_If.
+
+2006-12-02 Saturday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+ (altnum.[5,5]): Temporary kludge to allow parallel builds to
+ work.
+
+2006-12-02 Saturday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh (altnum.3): Drafted the documentation of
+ template <bool b, typename T> struct Enable_If.
+
+2006-12-02 Saturday 12:44 Andrea Cimino
+
+ * interfaces/: Java/jni/ppl_java_common.cc (1.26),
+ OCaml/ppl_ocaml.cc (1.15), OCaml/ppl_ocaml.mli (1.9),
+ OCaml/test1.ml (1.10): Interfaced other methods that relate to
+ Polyhedron. Avoid useless checks in the Java interface.
+
+2006-12-02 Saturday 12:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (altnum.1): file
+ ppl_java_common.cc was added on branch altnum on 2006-12-02
+ 22:35:27 +0000
+
+2006-12-02 Saturday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+ (altnum.[4,4]): Previous change completed.
+
+2006-12-02 Saturday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpq.inlines.hh (altnum.35): Fixed copy and paste
+ mistake.
+
+2006-12-02 Saturday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/meta_programming.hh (altnum.2): Changed an instance of
+ `class' to `typename'.
+
+2006-12-02 Saturday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Interval.defs.hh, Interval_Restriction.defs.hh, Temp.defs.hh,
+ checked.inlines.hh, compiler.hh, meta_programming.hh
+ (altnum.[32,29,64,5,4,29,18,1]): New source `meta_programming.hh'
+ will contain all our metaprogramming utilities.
+
+2006-12-02 Saturday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+ (altnum.[3,3]): Allow parallel builds in tests/BD_Shape and
+ tests/Octagonal_Shape.
+
+2006-12-02 Saturday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (altnum.37): Spurious comment removed.
+
+2006-12-02 Saturday 11:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Grid/boundingbox1.cc, Grid/boundingbox2.cc,
+ Grid/coveringbox1.cc, Grid/coveringbox2.cc,
+ Grid/directproduct1.cc, Polyhedron/boundingbox1.cc,
+ Polyhedron/boundingbox3.cc (altnum.[3,3,3,3,3,4,4]): No longer
+ use Bounding_Box: use Rational_Box instead.
+
+2006-12-02 Saturday 10:58 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.28): Fixed comparison.
+
+2006-12-02 Saturday 10:58 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (altnum.36): Added missing #include.
+
+2006-12-02 Saturday 10:32 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.14): Solved a bug that was
+ causing segmentation faults.
+
+2006-12-02 Saturday 10:13 Abramo Bagnara
+
+ * src/: checked.inlines.hh, checked_mpq.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[27,34,35]): Implemented universal
+ comparisons.
+
+2006-12-02 Saturday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh (altnum.17): Drafted the documentation for
+ template <typename Base, typename Derived> struct
+ Is_Same_Or_Derived.
+
+2006-12-02 Saturday 08:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Temp.defs.hh, compiler.hh (altnum.[3,16]): Drafted the
+ documentation for template <bool b> struct Bool, struct True,
+ struct False, and template <typename T1, typename T2> struct
+ Is_Same.
+
+2006-12-02 Saturday 07:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh,
+ GMP_Integer.types.hh, Makefile.am, Old_Interval.defs.hh,
+ checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+ checked_numeric_limits.hh, mp_numeric_limits.hh,
+ mp_std_bits.defs.hh, mp_std_bits.inlines.hh
+ (altnum.[9,8,6,28,3,39,33,34,7,3,1,1]): New sources
+ `mp_std_bits.defs.hh' and `mp_std_bits.inlines.hh' contain the
+ specializations of std:: objects that are not defined by GMP and
+ MPFR (presently these include std::swap() and
+ std::numeric_limits). The policy is to include
+ mp_std_bits.defs.hh immediately after each inclusion of gmpxx.h.
+ File `mp_numeric_limits.hh' phased out.
+
+2006-12-01 Friday 18:00 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+ Interval_Restriction.defs.hh, checked_float.inlines.hh,
+ checked_int.inlines.hh, compiler.hh, fpu-ia32.inlines.hh
+ (altnum.[21,63,14,4,30,38,15,5]): Silenced some warnings.
+
+2006-12-01 Friday 17:59 Abramo Bagnara
+
+ * src/Temp.defs.hh (altnum.2): Commented out missing specialization
+ check.
+
+2006-12-01 Friday 16:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.16),
+ ppl_interface_generator_common_dat.m4 (1.26),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.28),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.36),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.45): Use the H79 certificate for more widenings. Provided
+ code for extrapolation operators for the disjuncts for the BGP99
+ extrapolation. However this is not enabled as the C++ code does
+ not support this yet.
+
+ Allow for the replacement to be "NONE" as well as the
+ alternative. If either are "NONE" then the code is not
+ generated.
+
+2006-12-01 Friday 15:55 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.20): Commented out two
+ COMPILE_TIME_CHECK.
+
+2006-12-01 Friday 15:54 Abramo Bagnara
+
+ * src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[32,33]): Added missing swap.
+
+2006-12-01 Friday 15:36 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Interval.defs.hh,
+ Interval_Restriction.defs.hh, Rounding_Dir.defs.hh, Temp.defs.hh,
+ checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+ compiler.hh (altnum.[31,62,3,5,1,38,31,32,14]): Added support for
+ fast (dirty) temporary.
+
+2006-12-01 Friday 14:43 Andrea Cimino
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.13): Use a more appropriate way
+ to return PPL coefficients to the OCaml world.
+
+2006-12-01 Friday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.inlines.hh, OR_Matrix.inlines.hh (altnum.[3,3]):
+ Use the function sgn() when comparing a Checked_Number with the
+ constant 0.
+
+2006-12-01 Friday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+ (altnum.[5,5]): Avoid comparing a checked number with the integer
+ constant 1.
+
+2006-12-01 Friday 11:58 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.12), test1.ml (1.9): The code
+ now compiles also with non GMP types. Still some problems to
+ solve in the lookup phase at runtime.
+
+2006-12-01 Friday 10:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.25):
+ Redundant code removed and a "FIXME" comment added.
+
+2006-12-01 Friday 10:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.15),
+ ppl_interface_generator_common_dat.m4 (1.24): Further
+ modifications to the code for generating the pattern replacements
+ means that we can also generate the code for the
+ Pointset_Powerset<BD_Shape<int8_t> > (and similarly
+ Octagonal_Shape) for the widening and extrapolation operators.
+
+ One new feature introduced in the m4 code is: if the alternative
+ replacement is defined to be "NONE", no code is generated. This
+ caters for the case when the BD_Shape widening does not come with
+ a certificate and, so, cannot be used for the pointset powerset
+ certificate widening.
+
+2006-12-01 Friday 09:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.23): In the
+ widening/extrapolation of Pointset_Powerset domains, when the
+ disjunct domain is C_Polyhedron or NNC_Polyhedron, we must remove
+ the topology before looking for the pattern replacement for the
+ disjunct widening.
+
+2006-12-01 Friday 08:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.27),
+ ppl_interface_generator_prolog_icc_code.m4 (1.35),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.44):
+ Added m4 code for generating the BGP99 extrapolation assign
+ predicate. A simple check for this extrapolation predicate added
+ to the tests.
+
+ Also added draft code for a "with_tokens" version of the BHZ03
+ certificate widening (but not enabled as there is no
+ "with_tokens" option in the C++ BHZ03 widening).
+
+2006-12-01 Friday 07:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.34): Correction to Pointset_Powerset certificate widening
+ code.
+
+2006-11-30 Thursday 23:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.22),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.26),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.33): Added
+ Prolog predicates for widening pointset_powerset domains using
+ certificate-based widenings. Code is incomplete and not working.
+
+2006-11-30 Thursday 23:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.templates.hh, Interval.defs.hh (altnum.[25,61]): Fixed
+ implementation of contains() for intervals. Corrected a bug in
+ the implementation of Box::contains(). Pointed out a name hiding
+ issue.
+
+2006-11-30 Thursday 22:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.templates.hh (altnum.[17,24]): Implemented
+ method Box::contains().
+
+2006-11-30 Thursday 18:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+ (altnum.[4,4]): Use the sign function when comparing a checked
+ coefficient with the integer constant 0.
+
+2006-11-30 Thursday 18:43 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.11), ppl_ocaml.mli (1.8),
+ test1.ml (1.8): Defined and implemented other methods that belong
+ to Polyhedron.
+
+2006-11-30 Thursday 17:09 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[30,28]): Added implementation of sgn and cmp for native
+ types.
+
+2006-11-30 Thursday 16:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (altnum.5): Added dummy definitions for
+ Test_Box_Interval_Info and for check_result() on Box objects.
+
+2006-11-30 Thursday 14:36 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.10), ppl_ocaml.mli (1.7),
+ test1.ml (1.7): Added support to return congruence systems.
+
+2006-11-30 Thursday 14:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.60): Typo corrected.
+
+2006-11-30 Thursday 13:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Info.defs.hh (altnum.13): Added copyright preamble.
+
+2006-11-30 Thursday 13:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Rational_Box.hh (altnum.9): Use Interval_Restriction_None
+ instead of Interval_No_Restrictions.
+
+2006-11-30 Thursday 09:48 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.9), ppl_ocaml.mli (1.6),
+ test1.ml (1.6): Written the code to return constraints,
+ generators, generator systems and constraints system.
+
+2006-11-30 Thursday 09:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.59): Use function info to access
+ private base class.
+
+2006-11-30 Thursday 09:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval_Restriction.defs.hh (altnum.2): Corrected a typo (EQ
+ --> V_EQ).
+
+2006-11-30 Thursday 09:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (altnum.4): Inserted a few comppile-time
+ boolean constants in Test_Box_Interval_Info_Policy; the policy
+ still misses members.
+
+2006-11-30 Thursday 09:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.58): Added inline definition for
+ operator!=.
+
+2006-11-30 Thursday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_mpq.inlines.hh (altnum.30): Added a missing template
+ argument to a div call in the sqrt implementation.
+
+2006-11-29 Wednesday 17:46 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Box.templates.hh, Interval.defs.hh,
+ Interval_Info.defs.hh, Interval_Restriction.defs.hh,
+ Rational_Box.hh, checked_float.inlines.hh, checked_int.inlines.hh
+ (altnum.[19,23,57,12,1,8,29,37]): First working version of
+ Interval_Restriction_Integer_Modulo.
+
+2006-11-29 Wednesday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/approximatepartition1.cc (altnum.1): file
+ approximatepartition1.cc was added on branch altnum on 2006-12-02
+ 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetdifference1.cc (altnum.1): file
+ powersetdifference1.cc was added on branch altnum on 2006-12-02
+ 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetgeometricallycovers1.cc (altnum.1): file
+ powersetgeometricallycovers1.cc was added on branch altnum on
+ 2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/powersetgeometricallyequals1.cc (altnum.1): file
+ powersetgeometricallyequals1.cc was added on branch altnum on
+ 2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.cc (1.9), src/Pointset_Powerset.defs.hh
+ (1.10), tests/Grid/Makefile.am (1.45),
+ tests/Grid/approximatepartition1.cc (1.1),
+ tests/Grid/partition1.cc (1.3), tests/Grid/powerset1.cc (1.4),
+ tests/Grid/powersetdifference1.cc (1.1),
+ tests/Grid/powersetgeometricallycovers1.cc (1.1),
+ tests/Grid/powersetgeometricallyequals1.cc (1.1): Corrected and
+ improved the code for approximate_partition() The test file
+ approximatepartition1.cc now tests this. Restored partition1.cc
+ to just test the algorithm partition() defined there. Replaced
+ powerset1.cc by three test files, one for each operation and
+ added some extra tests.
+
+2006-11-29 Wednesday 06:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/:
+ ppl_interface_generator_sicstus_sd_cc.m4 (1.5), sp_clpq.pl
+ (1.14), sp_pl_check.pl (1.8): Added support for SICStus 4.
+
+2006-11-28 Tuesday 18:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.cc (1.8), src/Pointset_Powerset.defs.hh
+ (1.9), tests/Grid/partition1.cc (1.2), tests/Grid/powerset1.cc
+ (1.3): Boolean flag name changed from exact to finite_partition.
+
+ Added another test to powerset1.cc Changed partition1.cc test to
+ use approximate_partition()
+
+ Revised/added a couple of comments.
+
+2006-11-28 Tuesday 17:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.cc (1.7), Pointset_Powerset.defs.hh
+ (1.8): Functions approximate_partition() and check_containment()
+ working on (powersets of) grids are now publicly available.
+ Corrected the handling of the boolean argument encoding exactness
+ of the partition.
+
+2006-11-28 Tuesday 17:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.7): Use std::make_pair()
+ where appropriate.
+
+2006-11-28 Tuesday 09:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.21): Enable
+ ..._geometrically_covers/2 and ..._geometrically_equals/2 for
+ powersets of Grids.
+
+2006-11-28 Tuesday 09:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Pointset_Powerset.cc (1.6), src/Pointset_Powerset.inlines.hh
+ (1.5), tests/Grid/powerset1.cc (1.2): Added
+ geometrically_covers() and geometrically_equals() for Grids. A
+ few basic tests for them also added.
+
+2006-11-28 Tuesday 08:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (1.44), tests/Grid/powerset1.cc (1.1),
+ src/Pointset_Powerset.cc (1.5): Added poly_difference_assign()
+ for powersets of grids.
+
+ Tests added to check this.
+
+ Also added approximate_partition() for two grids that sets a
+ Boolean flag depending on whether or not the partition is exact.
+
+2006-11-27 Monday 18:29 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.56): Readded
+ set_{lower,upper}_unbounded.
+
+2006-11-27 Monday 17:07 Andrea Cimino
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.8), ppl_ocaml.mli (1.5),
+ test1.ml (1.5): Defined and implemented some constructors and
+ methods that relates to Polyhedron.
+
+2006-11-27 Monday 16:31 Abramo Bagnara
+
+ * src/: Interval.defs.hh, Interval_Info.defs.hh (altnum.[55,11]):
+ Fixed some constness.
+
+2006-11-27 Monday 15:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (1.4): Added stub implementations for a
+ couple of fully specialized members.
+
+2006-11-27 Monday 15:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (1.7): Little adjustments to the
+ documentation: prefer "disjuncts" to "polyhedra" when talking
+ about elements of a Pointset_Powerset. Added declarations for
+ the Pointset_Powerset<Grid> specializations of methods
+ poly_difference_assign() and geometrically_covers().
+
+2006-11-27 Monday 15:11 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked.inlines.hh (altnum.[37,26]): Moved
+ #include compiler.hh.
+
+2006-11-27 Monday 15:04 Abramo Bagnara
+
+ * src/Rational_Box.hh (altnum.7): Some fixes to conform to new
+ implementation.
+
+2006-11-27 Monday 14:23 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[18,54,10]): Shiny new implementation of intervals with
+ support for generic restrictions.
+
+2006-11-27 Monday 14:22 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[36,25,28,36,29,31]): Added Checked_Supports template.
+ Some name cleaning according to STANDARDS.
+
+2006-11-27 Monday 14:21 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[29,27]): Added some missing Enable_If.
+
+2006-11-27 Monday 14:20 Abramo Bagnara
+
+ * src/compiler.hh (altnum.13): Removed some macros.
+
+2006-11-27 Monday 13:52 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.45),
+ tests/Octagonal_Shape/constraints1.cc (1.2),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.5): Corrected two bugs:
+ one in relation_with() and another in add_constraint().
+
+2006-11-27 Monday 13:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.20),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.43): Temporarily disable poly_difference for powersets where
+ the elements are not Polyhedra.
+
+ Corrected a bug in the test code..
+
+2006-11-27 Monday 12:42 quartieri
+
+ * tests/BD_Shape/constraints1.cc (1.17), src/BD_Shape.templates.hh
+ (1.66): Corrected an error in add_constraint() when adding an
+ inconsistent constraint.
+
+2006-11-27 Monday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.36): In the section about "Names", added (surely
+ partial) guidelines about when to use lower, upper and mixed case
+ identifiers.
+
+2006-11-27 Monday 11:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/constraints1.cc (1.16): Added test05 which shows
+ an error when adding an inconsistent constraint.
+
+2006-11-27 Monday 09:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.32): Corrected ...add_disjuncts code - we must use the C++
+ name and not the interface name.
+
+2006-11-25 Saturday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.31): When calling predicate ppl_*_get_disjunct/2, the
+ resulting PPL object handle is now registered in the track
+ allocation system by calling macro WEAK_REGISTER. These handles
+ should not be deleted by the Prolog programmer.
+
+2006-11-25 Saturday 14:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/track_allocation.hh (1.20): Added a new set of
+ registered objects whose deletion is under the PPL library
+ responsibility. Added a new method weak_insert() to register
+ addresses to such objects. Added shorthand macro WEAK_REGISTER.
+ When destroying the allocation tracker, the memory leak error
+ message is displayed only when there still are REGISTERed objects
+ (i.e., disregarding WEAK_REGISTERed objects).
+
+2006-11-25 Saturday 14:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.42): Corrected a few bugs leading to memory leaks when
+ checking Pointset_Powerset instantiations.
+
+2006-11-24 Friday 17:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.30), tests/ppl_interface_generator_predicate_check_code.m4
+ (1.41), tests/ppl_predicate_check_common.pl (1.2): Removed some
+ redundant code and an erroneous assignment.
+
+ Improved the definition of all the test data.
+
+ Improved the tests of predicates for the pointset_powerset
+ domain.
+
+2006-11-24 Friday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/ppl_predicate_check_common.pl (altnum.1):
+ file ppl_predicate_check_common.pl was added on branch altnum on
+ 2006-12-02 22:35:30 +0000
+
+2006-11-24 Friday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+ (altnum.1): file ppl_interface_generator_java_test_java.m4 was
+ added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41 Andrea Cimino
+
+ * interfaces/Java/: jni/ppl_java_common.cc (1.25),
+ jni/ppl_java_common.hh (1.23),
+ tests/ppl_interface_generator_java_test_java.m4 (1.3): Use
+ appropriate classes to handle various kinds of exceptions coming
+ from the C++ world.
+
+2006-11-24 Friday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (altnum.1): file
+ ppl_java_common.hh was added on branch altnum on 2006-12-02
+ 22:35:27 +0000
+
+2006-11-24 Friday 14:20 Andrea Cimino
+
+ * interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+ (1.2), ppl_interface_generator_java_test_java_code.m4 (1.9):
+ Avoid to continue the test if an overflow is detected.
+
+2006-11-24 Friday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (altnum.1): file ppl_interface_generator_java_test_java_code.m4
+ was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 13:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.40): Improved and added tests for the Pointset_Powerset
+ classes.
+
+2006-11-24 Friday 11:16 Andrea Cimino
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java (1.5): Removed an
+ useless call.
+
+2006-11-24 Friday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java (altnum.1): file
+ C_Polyhedron_test1.java was added on branch altnum on 2006-12-02
+ 22:35:28 +0000
+
+2006-11-24 Friday 11:00 Andrea Cimino
+
+ * interfaces/Java/tests/: C_Polyhedron_test1.java (1.4),
+ Makefile.am (1.5), Test_Partial_Function.java (1.1): Added a new
+ test that relates to Partial_Function implementation in the Java
+ interface. The written test is based on test03() of
+ mapspacedims1.cc in the test/Polyhedron directory.
+
+2006-11-24 Friday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am (altnum.1): file Makefile.am
+ was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Test_Partial_Function.java (altnum.1): file
+ Test_Partial_Function.java was added on branch altnum on
+ 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 10:27 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_common.cc (1.24),
+ ppl_java_common.hh (1.22): Fixed other little errors in
+ Partial_Function caused by a wrong cut and paste.
+
+2006-11-24 Friday 09:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.25),
+ ppl_interface_generator_prolog_icc_code.m4 (1.29),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.39):
+ Added two predicates for the pointset_powerset domains.
+ ppl_ at CLASS@_size/2 and ppl_ at CLASS@_iterator_equals_iterator/2.
+ Some tests added to check them.
+
+2006-11-24 Friday 08:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.38): Corrected and added extra tests for the pointset_powerset
+ predicates.
+
+2006-11-24 Friday 00:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.28): Corrected another typo in ppl_*_begin_iterator and
+ ppl_*_end_iterator.
+
+2006-11-23 Thursday 21:32 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_common.cc (1.23),
+ ppl_java_common.hh (1.21): Fixed code related to Partial
+ Function.
+
+2006-11-23 Thursday 19:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.24),
+ ppl_interface_generator_prolog_icc_code.m4 (1.27): Further
+ corrected a typo in ppl_*_get_disjunct/2 (test reactivated).
+ Removed now useless code for ppl_*_get_disjuncts/2.
+
+2006-11-23 Thursday 19:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.23),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.37):
+ Disabled *_get_disjunct as it still is buggy.
+
+ Changed several tests so that they first check the existence of
+ ppl predicates before using them to test the results. These
+ checks now have to be in the generated code as the m4 generation
+ no longer does similar checks.
+
+2006-11-23 Thursday 17:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.22):
+ Enabled *_get_disjunct
+
+2006-11-23 Thursday 17:51 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.65), tests/BD_Shape/relations3.cc
+ (1.21): Corrected bugs found in BD_Shape::relation_with(g).
+
+2006-11-23 Thursday 17:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.21),
+ ppl_interface_generator_prolog_icc_code.m4 (1.26): Corrected the
+ interfacing of Pointset_Powerset iterators: - the predicates
+ *_begin_iterator and *_end_iterator now construct new objects
+ of class iterator (note: not const_iterator) that are registered
+ to the track allocation system; - added a new predicate
+ ppl_ at CLASS@_delete_iterator to deallocate an iterator (which
+ is then unregistered); - added implementations for
+ *_increment_iterator and *_decrement_iterator; - corrected
+ *_get_disjunct so as to check the allocation of the iterator; -
+ corrected method *_drop_disjunct so as to update the iterator to
+ point to the next disjunct.
+
+2006-11-23 Thursday 15:36 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.8): Use try-catch blocks to allow `make check' pass when
+ coefficients used are not the GMP ones.
+
+2006-11-23 Thursday 15:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.41): Reactivated check on
+ ppl_MIP_Problem_objective_function.
+
+2006-11-23 Thursday 15:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (1.3): Corrected method
+ get_linear_expression. Also made it non-templatic, as it shoudl
+ be applied to Linear_Expression objects only.
+
+2006-11-23 Thursday 15:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (altnum.1): file
+ ppl_prolog_common.icc was added on branch altnum on 2006-12-02
+ 22:35:29 +0000
+
+2006-11-23 Thursday 10:50 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, checked.defs.hh,
+ checked_float.inlines.hh, checked_numeric_limits.hh
+ (altnum.[28,35,27,6]): Removed force_integer.
+
+2006-11-23 Thursday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog_common.icc (1.2),
+ tests/pl_check.pl (1.40): Renamed get_linear_expression() to
+ get_homogeneous_expression() as this ignored the inhomogeneous
+ part (needed when getting the objective function for an
+ MIP_Problem).
+
+ Added get_linear_expression() although tests show a bug in this.
+
+ Extended the test predicate mip_get..
+
+2006-11-22 Wednesday 20:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.24): Java interface enabled.
+
+2006-11-22 Wednesday 18:27 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.20),
+ ppl_java_globals.cc (1.2): Fixed some constructors of Polyhedron.
+ Added the method `constraints()' to the Java version of
+ MIP_Problem.
+
+2006-11-22 Wednesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (altnum.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+ added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-22 Wednesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_globals.cc (altnum.1): file
+ ppl_java_globals.cc was added on branch altnum on 2006-12-02
+ 22:35:27 +0000
+
+2006-11-22 Wednesday 15:44 Abramo Bagnara
+
+ * src/: checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[26,35,28,30]): Make wider use of assign_exact. Fixed
+ floor, ceil, trunc for int.
+
+2006-11-22 Wednesday 15:42 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.24): Cleaned Safe_Comparison.
+
+2006-11-22 Wednesday 13:49 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.7): Some small changes to let the generated test be more
+ readable.
+
+2006-11-22 Wednesday 12:49 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/checked.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, tests/Polyhedron/numberinput1.cc
+ (altnum.[27,26,34,12,25,34,27,29,5,4]): Renamed may_be_ in has_.
+
+2006-11-22 Wednesday 12:28 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh, src/checked.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ tests/Polyhedron/numberinput1.cc
+ (altnum.[26,33,11,24,33,26,28,4,3]): Renamed misleading
+ handle_nan and handle_infinity in may_be_nan and may_be_infinity.
+
+2006-11-22 Wednesday 11:57 Andrea Cimino
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.19), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.6), tests/ppl_java_tests_common (1.4): Fixed some small bugs
+ in the Java interface. Extended the generated test.
+
+2006-11-22 Wednesday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/ppl_java_tests_common (altnum.1): file
+ ppl_java_tests_common was added on branch altnum on 2006-12-02
+ 22:35:28 +0000
+
+2006-11-22 Wednesday 11:56 Abramo Bagnara
+
+ * src/: checked.inlines.hh, checked_float.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[23,23,25,27]): Added force_integer implementation.
+
+2006-11-22 Wednesday 11:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.25),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.36),
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.24), src/Grid.defs.hh (1.38), tests/BD_Shape/relations3.cc
+ (1.20), tests/Octagonal_Shape/relatwithgen1.cc (1.4): Comment
+ corrected in src/Grid.defs.hh
+
+ Redundant code removed in added tests in
+ tests/Octagonal_Shape/relatwithgen1.cc and
+ tests/BD_Shape/relations3.cc
+
+ Bug corrected in
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+
+ Generation of tests simplified (and made faster) in
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+ Temporarily suppressed failing tests in
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+
+2006-11-22 Wednesday 10:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/relations3.cc (1.19),
+ Octagonal_Shape/relatwithgen1.cc (1.3): Added 2 tests to each of
+ these test files.
+
+ The first of these (13 in BD_Shape/relations3.cc and 20 in
+ Octagonal_Shape/relatwithgen1.cc) throw an exception but the call
+ to these is commented for now.
+
+ The second of these (14 in BD_Shape/relations3.cc and 21 in
+ Octagonal_Shape/relatwithgen1.cc) fail indicating a possible bug.
+
+2006-11-21 Tuesday 22:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: SICStus/sp_predicate_check.pl (1.1),
+ SWI/swi_predicate_check.pl (1.1), tests/Makefile.am (1.12),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.35),
+ tests/ppl_interface_generator_predicate_check_extra_code (1.23),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.23),
+ tests/ppl_predicate_check_common.pl (1.1): The fixed part of the
+ code containing the test data is now a separate Prolog file
+ called tests/ppl_predicate_check_common.pl
+
+ This is included with the generated code by the top-level test
+ files: SICStus/sp_predicate_check.pl and
+ SWI/swi_predicate_check.pl. Similar files will be needed by the
+ other Prolog systems before they can run these generated tests.
+
+ The code generator no longer attempts to generate tests for the
+ fixed MIP and version predicates.
+
+ The file tests/ppl_interface_generator_predicate_check_extra_code
+ which contained the fixed data is now replaced by
+ ppl_predicate_check_common.pl.
+
+2006-11-21 Tuesday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sp_predicate_check.pl (altnum.1): file
+ sp_predicate_check.pl was added on branch altnum on 2006-12-02
+ 22:35:29 +0000
+
+2006-11-21 Tuesday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_predicate_check.pl (altnum.1): file
+ swi_predicate_check.pl was added on branch altnum on 2006-12-02
+ 22:35:30 +0000
+
+2006-11-21 Tuesday 18:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.19): It is
+ upper_bound_assign_if_exact and not as I had it:
+ upper_bound_if_exact.
+
+2006-11-21 Tuesday 18:37 Andrea Cimino
+
+ * interfaces/Java/:
+ jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.18), tests/ppl_interface_generator_java_test_java_code.m4
+ (1.5), tests/ppl_java_tests_common (1.3): Some fixes to the
+ interface. Extended the m4 generated test.
+
+2006-11-21 Tuesday 16:16 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.64): Removed an useless variable
+ `space_dim' in refine().
+
+2006-11-21 Tuesday 15:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.18): Allow
+ the relation_with_generator procedrure for BD_Shape.
+
+2006-11-21 Tuesday 11:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/: Makefile.am (1.4),
+ ppl_interface_generator_java_test_java_code.m4 (1.4): Added a
+ test for affine and space dimension. Changed the Makefile.am so
+ that make check runs the generated test.
+
+2006-11-21 Tuesday 11:28 Andrea Cimino
+
+ * interfaces/Java/tests/: Makefile.am (1.3),
+ ppl_interface_generator_java_test_java_code.m4 (1.3),
+ ppl_java_tests_common (1.2): Fixed test generation. Allow
+ Makefile to compile the generated Java source.
+
+2006-11-21 Tuesday 10:48 Andrea Cimino
+
+ *
+ interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+ (1.2): Fixed the m4 to build the test correctly.
+
+2006-11-21 Tuesday 10:04 Andrea Cimino
+
+ * interfaces/Java/jni/: Makefile.am (1.8), ppl_java_common.cc
+ (1.22), ppl_java_common.hh (1.20), ppl_java_globals.cc (1.1):
+ Written an almost complete support for MIP_Problem. Written the
+ class Parma_Polyhedra_Library to obtain version information about
+ the library.
+
+2006-11-21 Tuesday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (altnum.1): file Makefile.am was
+ added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-21 Tuesday 09:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+ (1.1), ppl_interface_generator_java_test_java_code.m4 (1.1),
+ ppl_java_tests_common (1.1): New files for generating the tests
+ for the Java interface.
+
+2006-11-20 Monday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Octagonal_Shape.templates.hh,
+ Octagonal_Shape_incremental_strong_closure1.hh,
+ Octagonal_Shape_incremental_strong_closure10.hh,
+ Octagonal_Shape_incremental_strong_closure2.hh,
+ Octagonal_Shape_incremental_strong_closure3.hh,
+ Octagonal_Shape_incremental_strong_closure4.hh,
+ Octagonal_Shape_incremental_strong_closure5.hh,
+ Octagonal_Shape_incremental_strong_closure6.hh,
+ Octagonal_Shape_incremental_strong_closure7.hh,
+ Octagonal_Shape_incremental_strong_closure8.hh,
+ Octagonal_Shape_incremental_strong_closure9.hh,
+ Octagonal_Shape_strong_closure1.hh,
+ Octagonal_Shape_strong_closure2.hh,
+ Octagonal_Shape_strong_closure4.hh
+ (octagons.[52,1,1,1,1,1,1,1,1,1,1,1,1,1]): Alternate versions of
+ Octagonal_Shape<T>::strong_closure_assign() and
+ Octagonal_Shape<T>::incremental_strong_closure_assign(Variable).
+ They can be selected at configure time by setting CPPFLAGS in the
+ appropriate way.
+
+2006-11-20 Monday 12:23 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.17),
+ ppl_java_common.hh (1.19): In widening methods, ensure that the
+ Java token can fit in a C++ unsigned integer.
+
+2006-11-19 Sunday 23:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.20),
+ ppl_interface_generator_prolog_icc_code.m4 (1.24): Prolog
+ interface predicates ppl_..._get_disjunct and
+ ppl_..._drop_disjunct draft code added.
+
+2006-11-19 Sunday 11:27 Abramo Bagnara
+
+ * src/: Interval.defs.hh, Interval_Info.defs.hh, Rational_Box.hh
+ (altnum.[53,9,6]): Allow Interval inheritance. Removed
+ check_empty_args policy.
+
+2006-11-19 Sunday 11:26 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ checked.defs.hh, checked.inlines.hh, checked_ext.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[25,25,32,22,10,22,32,24,26]): Use separate policies also
+ for checked lowlevel. Added trunc. Converted check_nan_args into
+ check_nan_result. Use full function names in SPECIALIZE_ macros.
+
+2006-11-19 Sunday 11:22 Abramo Bagnara
+
+ * src/compiler.hh (altnum.12): Added ENABLE_IF macro.
+
+2006-11-18 Saturday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+ config.sub, configure.ac, install-sh, instchk.hh, missing,
+ mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+ Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+ Watchdog/missing, Watchdog/mkinstalldirs,
+ Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/examples/README,
+ demos/ppl_lpsol/examples/egout.mps,
+ demos/ppl_lpsol/examples/ex11.mps,
+ demos/ppl_lpsol/examples/ex12.mps,
+ demos/ppl_lpsol/examples/lseu.mps,
+ demos/ppl_lpsol/examples/markshare1.mps,
+ demos/ppl_lpsol/examples/markshare2.mps,
+ demos/ppl_lpsol/examples/mas74.mps,
+ demos/ppl_lpsol/examples/mas76.mps,
+ demos/ppl_lpsol/examples/modglob.mps,
+ demos/ppl_lpsol/examples/noswot.mps,
+ demos/ppl_lpsol/examples/opt1217.mps,
+ demos/ppl_lpsol/examples/p0033.mps,
+ demos/ppl_lpsol/examples/pk1.mps,
+ demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+ doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+ doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/prog2man,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ interfaces/Makefile.am,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_copyright,
+ interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+ interfaces/Java/ppl_interface_generator_java_dat.m4,
+ interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+ interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_Polyhedron.cc,
+ interfaces/Java/jni/ppl_java_common.cc,
+ interfaces/Java/jni/ppl_java_common.hh,
+ interfaces/Java/tests/.cvsignore,
+ interfaces/Java/tests/C_Polyhedron_test1.java,
+ interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+ interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+ interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/ppl_prolog_common.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+ m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+ src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+ src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+ src/Bit_Row.types.hh, src/Bounding_Box.defs.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Congruence_System.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+ src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+ src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+ src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/NNC_Polyhedron.cc,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/OR_Matrix.templates.hh, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.templates.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Variable.cc, src/Variable.defs.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/algorithms.hh,
+ src/checked.cc, src/checked.inlines.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/conversion.cc,
+ src/fpu-ia32.inlines.hh, src/globals.defs.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+ src/minimize.cc, src/mp_numeric_limits.cc,
+ src/mp_numeric_limits.hh, src/namespaces.hh, src/simplify.cc,
+ src/swapping_sort.icc, tests/BBox.cc, tests/FCAIBVP.cc,
+ tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+ tests/FCAIBVP.types.hh, tests/Makefile.am,
+ tests/Partial_Function.cc, tests/ppl_test.cc, tests/ppl_test.hh,
+ tests/print.cc, tests/print.hh, tests/Ask_Tell/.cvsignore,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/boundedaffinepreimage1.cc,
+ tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+ tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+ tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+ tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+ tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+ tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+ tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+ tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+ tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+ tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+ tests/Grid/partition1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc, tests/MIP_Problem/.cvsignore,
+ tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc,
+ tests/MIP_Problem/mipproblem1.cc,
+ tests/Octagonal_Shape/.cvsignore,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/bounds1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/foldspacedims1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/max_min1.cc,
+ tests/Octagonal_Shape/max_min2.cc,
+ tests/Octagonal_Shape/maxspacedim1.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/append1.cc, tests/Polyhedron/append2.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/bug2.dat,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/dualhypercubes.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+ tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/membytes2.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+ tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+ utils/cm_cleaner.sh, utils/cm_splitter.sh, utils/timings.cc
+ (octagons.[1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,4,4,1,2,1,2,1,2,2,2,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,1,1,2,2,1,2,1,1,2,1,2,1,1,1,2,1,2,1,1,1,2,2,2,1,1,2,1,1,2,1,2,1,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,2,3,3,3,2,3,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,1,2,2,1,2,1,2,2,1,1,2, [...]
+ Second merge to octagons.
+
+2006-11-18 Saturday 16:50 Andrea Cimino
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.16): A couple of bugs fixed in the generation of the C++ code.
+
+2006-11-18 Saturday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (octagons.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+ added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-18 Saturday 16:02 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.15),
+ ppl_java_common.hh (1.18): Ensure that a jlong fits in a unsigned
+ type for methods that need that check. Some m4 code fixes.
+
+2006-11-18 Saturday 16:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.hh (octagons.1): file
+ ppl_java_common.hh was added on branch octagons on 2006-11-18
+ 20:36:45 +0000
+
+2006-11-18 Saturday 12:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.205): Commit test.
+
+2006-11-18 Saturday 11:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.204): Test commit.
+
+2006-11-18 Saturday 11:26 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, checked.defs.hh,
+ checked_numeric_limits.hh (altnum.[24,31,3]): Added force_integer
+ policy flag.
+
+2006-11-18 Saturday 11:25 Abramo Bagnara
+
+ * src/compiler.hh (altnum.11): Added some useful functions for
+ static expressions.
+
+2006-11-18 Saturday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (octagons.1): file
+ ppl_interface_generator_predicate_check_code.m4 was added on
+ branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-18 Saturday 09:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.19),
+ ppl_interface_generator_prolog_icc_code.m4 (1.23),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.34):
+ Added predicates ppl_ at CLASS@_begin_iterator\2 and
+ ppl_ at CLASS@_end_iterator\2.
+
+ Temporarily disabled check for geometrically_equals predicate.
+
+2006-11-18 Saturday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+ (octagons.1): file ppl_interface_generator_prolog_dat.m4 was
+ added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-18 Saturday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (octagons.1): file ppl_interface_generator_prolog_icc_code.m4 was
+ added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 16:58 Andrea Cimino
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.14): Specialized generalized_affine_image and
+ generalized_affine_preimage for Grids.
+
+2006-11-17 Friday 16:53 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.94), Octagonal_Shape.defs.hh (1.22):
+ Added a note to the documentation of refine().
+
+2006-11-17 Friday 15:59 Elena Mazzi
+
+ * src/: Octagonal_Shape.defs.hh (1.21),
+ Octagonal_Shape.templates.hh (1.44): Added an helper function for
+ the computation of affine relations Octagonal_Shape::refine() and
+ used it on the methods
+ Octagonal_Shape::generalized_affine_preimage() and
+ Octagonal_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 15:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Makefile.am (1.37),
+ ppl_interface_generator_prolog_icc.m4 (1.8),
+ ppl_interface_generator_prolog_icc_code.m4 (1.22),
+ ppl_interface_generator_prolog_icc_preamble (1.16),
+ ppl_prolog_common.icc (1.1): The
+ ppl_interface_generator_prolog_icc_preamble is now renamed as
+ ppl_prolog_common.icc and included by the generated
+ ppl_prolog.icc.
+
+ The term_to_classname_handle() methods are now defined
+ term_to_handle<T>() where T is the C++ class name.
+
+2006-11-17 Friday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+ (octagons.1): file ppl_interface_generator_prolog_icc.m4 was
+ added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog_common.icc (octagons.1): file
+ ppl_prolog_common.icc was added on branch octagons on 2006-11-18
+ 20:36:46 +0000
+
+2006-11-17 Friday 12:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.15): Misplaced angle bracket fixed.
+
+2006-11-17 Friday 11:59 Andrea Cimino
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.13),
+ ppl_java_common.cc (1.21), ppl_java_common.hh (1.17): Implemented
+ JNI functions for Grids_Generator and Grid Generator_System.
+ Solved other little bugs. The Java test now works.
+
+2006-11-17 Friday 11:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (octagons.1): file
+ ppl_java_common.cc was added on branch octagons on 2006-11-18
+ 20:36:45 +0000
+
+2006-11-17 Friday 11:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.6): For the Polyhedron class, add include statements for
+ ppl_java_C_Polyhedron.h and ppl_java_NNC_Polyhedron.h.
+
+2006-11-17 Friday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (altnum.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+ branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-17 Friday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (octagons.1): file
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+ branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-17 Friday 11:31 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.93), BD_Shape.templates.hh (1.63),
+ Octagonal_Shape.defs.hh (1.20), Polyhedron.defs.hh (1.311): Used
+ consistent parameter's name for max_min().
+
+2006-11-17 Friday 10:34 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.92), BD_Shape.templates.hh (1.62):
+ Added an helper function for the computation of affine relations
+ BD_Shape::refine() and used it on the methods
+ BD_Shape::generalized_affine_preimage() and
+ BD_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 10:22 Andrea Cimino
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.12): Avoid compiler warning messages.
+
+2006-11-17 Friday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.14): Added <template typename T> T*
+ term_to_handle(Prolog_term_ref, const char*).
+
+2006-11-17 Friday 10:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.11): Correct reference to point to be generic.
+
+2006-11-17 Friday 09:57 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.16): Written the
+ prototypes for three missing function to allow compiling.
+
+2006-11-17 Friday 09:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.10): Corrected code for intersection_assign_and_minimize (and
+ similar binary operations that return a Boolean).
+
+2006-11-17 Friday 09:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.9): Corrected the bug in the OK() method.
+
+2006-11-17 Friday 09:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.5),
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.8):
+ Only have "Recycle_Intput" for Polyhedron class. The include
+ statement for "ppl_java_common.hh" should occur only once.
+
+2006-11-17 Friday 09:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.21): Unused schematic code for building a new iterator added.
+
+2006-11-17 Friday 09:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.7):
+ Activated the term_to_iterator_handle code generator.
+
+2006-11-17 Friday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.20): Added `m4_term_to_iterator_handle_code'.
+
+2006-11-17 Friday 08:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.7): Where the class name should be the C++ name, the pattern
+ is now correct and is replaced by the right form of the name..
+
+2006-11-17 Friday 08:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.17):
+ Reinstated a lost comma.
+
+2006-11-17 Friday 08:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (octagons.1):
+ file ppl_interface_generator_common_dat.m4 was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 19:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.4),
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.6):
+ REmoved cutting marks and added "try/catch" everywhere.
+
+2006-11-16 Thursday 18:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (1.7): Compile only one C++ file
+ for all the required instantiations of the Java interface.
+
+2006-11-16 Thursday 18:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/Makefile.am (octagons.1): file Makefile.am
+ was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-16 Thursday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.255), interfaces/Java/jni/Makefile.am (1.6):
+ Automatically generated all the header files required by the Java
+ interface.
+
+2006-11-16 Thursday 18:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/ppl_java_common.hh (1.15): Corrected the type
+ of "add_..._and_minimize to be Boolean. Typo in comment fixed.
+
+2006-11-16 Thursday 18:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.5): Bug in the relation with code fixed.
+
+2006-11-16 Thursday 18:05 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_common.cc (1.20),
+ ppl_java_common.hh (1.14): Renamed an internal routine.
+
+2006-11-16 Thursday 17:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.16),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.4): Some but not all bugs fixed.
+
+2006-11-16 Thursday 16:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.254): Make sure
+ `required_instantiations_java_sources' really contains all the
+ required Java sources.
+
+2006-11-16 Thursday 16:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.7): Ensure ppl_java.jar has the
+ right structure.
+
+2006-11-16 Thursday 16:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (octagons.1): file Makefile.am was
+ added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 14:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.6): Machinery to build the Java
+ interface revised.
+
+2006-11-16 Thursday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (octagons.1): file
+ mipproblem1.cc was added on branch octagons on 2006-11-18
+ 20:36:58 +0000
+
+2006-11-16 Thursday 14:04 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.43), tests/MIP_Problem/mipproblem1.cc
+ (1.2): Fixed MIP_Problem when it has to deal with
+ zero-dimensional problems.
+
+2006-11-16 Thursday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (octagons.1): file MIP_Problem.cc was added on
+ branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-16 Thursday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/: Makefile.am (1.5),
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.3):
+ Enabled the splitting of the generated code for the ".cc".
+
+2006-11-16 Thursday 11:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/jni/:
+ ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.2),
+ ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.3):
+ Corrected the preamble for the ".cc" generated files. Redundant
+ space removed.
+
+2006-11-16 Thursday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.253): Added a mechanism to build the
+ automatically generated Java sources.
+
+2006-11-16 Thursday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.23): Installed the mechanism for the
+ automatic generation of the .java sources for the semantic object
+ classes. The interfaces/Java directory is temporarily disabled
+ in order to avoid failures.
+
+2006-11-16 Thursday 09:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.2): Added missing swap() and OK() methods and fixed a few
+ bugs.
+
+2006-11-16 Thursday 08:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.14),
+ ppl_interface_generator_common_dat.m4 (1.15),
+ Java/ppl_interface_generator_java_dat.m4 (1.2),
+ Java/jni/Makefile.am (1.4),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+ (1.1),
+ Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+ (1.1): Added files for generating the ".cc" files for the
+ classes. This needed modifications to the main replacement m4
+ code to allow for inserting "1" after embedded "_"s.
+
+ Java/jni/Makefile.am includes necessary code for building the
+ combined files (temporarily named ppl_java_Polyhedron1.cc).
+
+2006-11-16 Thursday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (octagons.1): file
+ ppl_interface_generator_common.m4 was added on branch octagons on
+ 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_interface_generator_java_dat.m4 (altnum.1):
+ file ppl_interface_generator_java_dat.m4 was added on branch
+ altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-16 Thursday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/ppl_interface_generator_java_dat.m4 (octagons.1):
+ file ppl_interface_generator_java_dat.m4 was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 18:41 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.7): Implemented
+ the ordinary copy constructor of C_Polyhedron.
+
+2006-11-15 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_C_Polyhedron.cc (altnum.1): file
+ ppl_java_C_Polyhedron.cc was added on branch altnum on 2006-12-02
+ 22:35:27 +0000
+
+2006-11-15 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_C_Polyhedron.cc (octagons.1): file
+ ppl_java_C_Polyhedron.cc was added on branch octagons on
+ 2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 17:19 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (1.19): Added the
+ `try' and `catch' blocks to every method of Polyhedron.
+
+2006-11-15 Wednesday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (altnum.1): file
+ ppl_java_Polyhedron.cc was added on branch altnum on 2006-12-02
+ 22:35:27 +0000
+
+2006-11-15 Wednesday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (octagons.1): file
+ ppl_java_Polyhedron.cc was added on branch octagons on 2006-11-18
+ 20:36:45 +0000
+
+2006-11-15 Wednesday 16:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.10): Add the
+ recycle pattern to the procedure that builds from a recycled
+ representation.
+
+2006-11-15 Wednesday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (octagons.1):
+ file ppl_interface_generator_c_cc_code.m4 was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 16:23 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.6),
+ ppl_java_Polyhedron.cc (1.18), ppl_java_common.cc (1.19),
+ ppl_java_common.hh (1.13): Fixed a C_Polyhedron constructor.
+ Added the infractructure for handling the exceptions. Defined
+ and implemented the native methods `swap(Polyhedron)' and
+ `OK(boolean)'.
+
+2006-11-15 Wednesday 16:11 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.91), BD_Shape.templates.hh (1.61),
+ Octagonal_Shape.defs.hh (1.19), Octagonal_Shape.templates.hh
+ (1.43), Polyhedron.defs.hh (1.310), Polyhedron_nonpublic.cc
+ (1.72): Used consistent parameter's name for max_min(),
+ maximize() and minimize().
+
+2006-11-15 Wednesday 15:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.19): Added the recycle argument to the build from a
+ representation.
+
+2006-11-15 Wednesday 15:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.14): Add a
+ replacement for the extra recycle argument.
+
+2006-11-15 Wednesday 15:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.66): Do recycle data structures
+ when possible.
+
+2006-11-15 Wednesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/: Makefile.am (1.13), cm_cleaner.sh (1.1), cm_splitter.sh
+ (1.1): cm_splitter.sh splits stdin according to cutting markers.
+ cm_cleaner.sh erases all files listed in the cutting markers
+ found on stdin.
+
+2006-11-15 Wednesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_cleaner.sh (altnum.1): file cm_cleaner.sh was added on
+ branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_cleaner.sh (octagons.1): file cm_cleaner.sh was added on
+ branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_splitter.sh (altnum.1): file cm_splitter.sh was added on
+ branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/cm_splitter.sh (octagons.1): file cm_splitter.sh was added
+ on branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.57): Do recycle data structures
+ when possible.
+
+2006-11-15 Wednesday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.5),
+ ppl_java_Polyhedron.cc (1.17): Do recycle the input data
+ structures when possible.
+
+2006-11-15 Wednesday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.37), Grid.inlines.hh (1.11),
+ Grid_nonpublic.cc (1.21), Grid_public.cc (1.48): Disambiguate the
+ constructors of grids by adding a dummy argument to those that
+ can recycle the data structures of their arguments. Added
+ support for actually recycling the data structures when this is
+ allowed. Removed a non-implemented (private) method.
+
+2006-11-15 Wednesday 15:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.19), C_Polyhedron.defs.hh (1.45),
+ C_Polyhedron.inlines.hh (1.33), NNC_Polyhedron.cc (1.19),
+ NNC_Polyhedron.defs.hh (1.47), NNC_Polyhedron.inlines.hh (1.34),
+ Polyhedron.defs.hh (1.309), Polyhedron_nonpublic.cc (1.71):
+ Disambiguate the constructors of polyhedra by adding a dummy
+ argument to those that may recycle the data structures of their
+ arguments.
+
+2006-11-15 Wednesday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh (1.40): Added tag class Recycle_Input() to
+ help differentiating overloaded functions (in particular,
+ constructors) that may destructively recycle the data structures
+ of their arguments instead of taking a copy.
+
+2006-11-15 Wednesday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (1.4): Corrected a typo in
+ test19().
+
+2006-11-15 Wednesday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (octagons.1): file
+ pointsetpowerset1.cc was added on branch octagons on 2006-11-18
+ 20:37:00 +0000
+
+2006-11-15 Wednesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (1.3): Corrected the bug uncovered by
+ test18() in pointsetpowerset1.cc.
+
+2006-11-15 Wednesday 14:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (octagons.1): file Pointset_Powerset.cc
+ was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-15 Wednesday 12:30 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.4): Implemented
+ the native methods
+ C_Polyhedron::poly_hull_assign_if_exact(C_Polyhedron y) and
+ C_Polyhedron::upper_bound_assign_if_exact(C_Polyhedron y).
+
+2006-11-15 Wednesday 11:33 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.3): Added the
+ Degenerate_Element enum to the Java interface. Defined and
+ implemented the constructor C_Polyhedron(long dim,
+ Degenerate_Element kind).
+
+2006-11-15 Wednesday 10:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.33),
+ ppl_interface_generator_predicate_check_extra_code (1.22):
+ Revised and corrected some tests.
+
+2006-11-15 Wednesday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (octagons.1): file
+ ppl_interface_generator_predicate_check_extra_code was added on
+ branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-15 Wednesday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid_public.cc (1.47), Grid_widenings.cc (1.12): Corrected
+ bugs found in is_disjoint(), intersection_assign() and
+ generator_widening_assign().
+
+2006-11-15 Wednesday 10:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: disjoint1.cc (1.10), intersection1.cc (1.10),
+ widening2.cc (1.8): Added tests showing bugs in the is_disjoint()
+ intersection_assign() and generator_widening_assign().
+
+2006-11-15 Wednesday 10:12 Andrea Cimino
+
+ * m4/ac_prog_java.m4 (1.3): Avoid configure warnings during Java
+ environment checking.
+
+2006-11-15 Wednesday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_java.m4 (altnum.1): file ac_prog_java.m4 was added on
+ branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-15 Wednesday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_java.m4 (octagons.1): file ac_prog_java.m4 was added
+ on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-15 Wednesday 09:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (1.3): Last 2 tests added
+ in previous commit are known to fail.
+
+2006-11-15 Wednesday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (1.5): Distribute
+ ppl_interface_generator_java_dat.m4.
+
+2006-11-15 Wednesday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/.cvsignore (1.1): Put under CVS control.
+
+2006-11-15 Wednesday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/.cvsignore (altnum.1): file .cvsignore was
+ added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-15 Wednesday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/.cvsignore (octagons.1): file .cvsignore
+ was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/.cvsignore (simplex.1): file .cvsignore was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-15 Wednesday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.36): Make the `tests' directory
+ before making the directories of the individual Prolog systems.
+
+2006-11-15 Wednesday 07:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (1.2): Added test to show
+ bug in geometrically_equals and geometrically_covers when one of
+ the powersets contains a polyhedron which is not in minimal form
+ and the other is.
+
+2006-11-14 Tuesday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.37), interfaces/C/Makefile.am
+ (1.30), src/Makefile.am (1.165): Define and exploit the right
+ inter-library dependencies.
+
+2006-11-14 Tuesday 18:35 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.16),
+ ppl_java_common.cc (1.18), ppl_java_common.hh (1.12): First draft
+ implementation for Partial_Function. Implemented the method
+ `map_space_dimension'.
+
+2006-11-14 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.29): Ensure that the dependency of
+ libppl_c on libppl is encoded into libppl.
+
+2006-11-14 Tuesday 18:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.13): Revised
+ for disjuncts.
+
+2006-11-14 Tuesday 17:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.18),
+ ppl_interface_generator_prolog_icc_code.m4 (1.18),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.32),
+ tests/ppl_interface_generator_predicate_check_extra_code (1.21):
+ Corrected get_disjuncts code in the prolog interface. Added
+ procedure in the prolog interface to call ascii_dump(). Added an
+ extra test (a bounded interval in 1 dimension) to the prolog
+ schematic tests.
+
+2006-11-14 Tuesday 15:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java (octagons.1): file
+ C_Polyhedron_test1.java was added on branch octagons on
+ 2006-11-18 20:36:45 +0000
+
+2006-11-14 Tuesday 15:29 Andrea Cimino
+
+ * interfaces/Java/: jni/ppl_java_common.cc (1.17),
+ tests/C_Polyhedron_test1.java (1.3): Modified the test to avoid
+ overflows. Modified the constructor of Constraint.
+
+2006-11-14 Tuesday 14:34 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.42): Corrected the bug on
+ Octagonal_Shape::max_min() when the inhomogeneous term of
+ expression is null.
+
+2006-11-14 Tuesday 14:33 quartieri
+
+ * tests/Octagonal_Shape/max_min1.cc (1.3): Added two tests that
+ show a bug on Octagonal_Shape::max_min() when the inhomogeneous
+ term of expression is null.
+
+2006-11-14 Tuesday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min1.cc (altnum.1): file max_min1.cc
+ was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-14 Tuesday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min1.cc (octagons.1): file max_min1.cc
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-14 Tuesday 14:30 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.60): Corrected the bug on
+ BD_Shape::max_min() when the inhomogeneous term of expression is
+ null.
+
+2006-11-14 Tuesday 14:29 Elena Mazzi
+
+ * tests/BD_Shape/max_min2.cc (1.3): Added two tests that show a bug
+ on BD_Shape::maximize() when the inhomogeneous term of expression
+ is null.
+
+2006-11-14 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (altnum.1): file max_min2.cc was added
+ on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-14 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min2.cc (octagons.1): file max_min2.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-14 Tuesday 12:02 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.15),
+ ppl_java_common.cc (1.16), ppl_java_common.hh (1.11): Implemented
+ all the widening methods in the Java interface.
+
+2006-11-14 Tuesday 09:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Java/ppl_interface_generator_java_dat.m4 (1.1): Files
+ needed for generating Polyhedron.java
+
+2006-11-13 Monday 21:47 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.14),
+ ppl_java_common.cc (1.15), ppl_java_common.hh (1.10): Implemented
+ the other two missing versions of `minimize()' and `maximize()'.
+
+2006-11-13 Monday 19:35 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, compiler.hh
+ (altnum.[17,52,10]): Added some compile time check.
+
+2006-11-13 Monday 19:06 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.13),
+ ppl_java_common.cc (1.14), ppl_java_common.hh (1.9): Implemented
+ By_Reference class that allows to pass object by reference in
+ Java world. Implemented one version of `maximize' and `minimize'.
+ Implemented `equals'.
+
+2006-11-13 Monday 16:26 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (1.12): Added the
+ methods space_dimension() and affine_dimension() to Polyhedron.
+
+2006-11-13 Monday 12:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (1.6): Fixed a Doxygen comment to
+ use the brief style.
+
+2006-11-13 Monday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (octagons.1): file
+ Pointset_Powerset.defs.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-11-13 Monday 12:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.90), Octagonal_Shape.defs.hh (1.18):
+ Modified the documentation of concatenate_assign() to link to the
+ general description of the concatenation operator.
+
+2006-11-13 Monday 09:08 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.16): Fixed typo. Implemented
+ set_unbounded() correctly.
+
+2006-11-13 Monday 09:07 Abramo Bagnara
+
+ * src/compiler.hh (altnum.9): Now COMPILE_TIME_CHECK() works as
+ expected.
+
+2006-11-12 Sunday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.164), mp_numeric_limits.cc (1.1),
+ mp_numeric_limits.hh (1.9): Define the static constants declared
+ in mp_numeric_limits.hh, as mandated by Section 9.4.2/4 of the
+ C++ standard.
+
+2006-11-12 Sunday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.cc (octagons.1): file mp_numeric_limits.cc
+ was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-12 Sunday 16:32 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.2),
+ ppl_java_Polyhedron.cc (1.11), ppl_java_common.cc (1.13),
+ ppl_java_common.hh (1.8): Added support for Grid_Generator and
+ Grid_Generator_System. Added other constructors to C_Polyhedron.
+ Renamed routine methods for consistency.
+
+2006-11-12 Sunday 16:21 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Rational_Box.hh
+ (altnum.[15,51,5]): Compilation fixes.
+
+2006-11-12 Sunday 15:48 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Rational_Box.hh, checked.defs.hh,
+ checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+ (altnum.[23,4,30,21,31,8]): Renamed const_bool and const_int.
+
+2006-11-12 Sunday 15:48 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.21): is_inf_float return
+ value is now more useful.
+
+2006-11-12 Sunday 15:47 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[14,50,8]): Commited incomplete new boundary
+ implementation.
+
+2006-11-12 Sunday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.38), config.sub (1.36), Watchdog/config.guess
+ (1.22), Watchdog/config.sub (1.21): Updated.
+
+2006-11-12 Sunday 12:33 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.10),
+ ppl_java_common.cc (1.12), ppl_java_common.hh (1.7): Added the
+ class Poly_Gen_Relation. Implemented the method
+ Polyhedron::relation_with(Generator g).
+
+2006-11-12 Sunday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh (altnum.7): Comments revised.
+
+2006-11-12 Sunday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh (altnum.6): Added new macros for per-class
+ constants that need no further definition.
+
+2006-11-12 Sunday 11:57 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.9),
+ ppl_java_common.cc (1.11), ppl_java_common.hh (1.6): Added the
+ class Poly_Con_Relation. Implemented the method
+ Polyhedron::relation_with(Constraint c).
+
+2006-11-12 Sunday 11:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int8_a (1.5): Reflect recent
+ changes in the Prolog tests.
+
+2006-11-12 Sunday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int8_a (1.8): Reflect
+ recent changes in the Prolog tests.
+
+2006-11-11 Saturday 22:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.31): Bugs in test code fixed.
+
+2006-11-11 Saturday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/compiler.hh (altnum.5): COMPILE_TIME_CHECK macro added, as
+ well as several comments.
+
+2006-11-11 Saturday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.203): Added a new item.
+
+2006-11-11 Saturday 15:27 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.8),
+ ppl_java_common.cc (1.10), ppl_java_common.hh (1.5): Now the PPL
+ can return to Java objects like generators, constraints and
+ congruences and their systems. Written a lot of native methods
+ that return objects built by the PPL.
+
+2006-11-11 Saturday 13:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.252): Improved the checking of required
+ instantiations; now also managing the generation of canonical
+ names for templates having multiple parameters.
+
+2006-11-10 Friday 20:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: Makefile.am, interval1.cc (altnum.[3,1]): New tests
+ for the Interval class.
+
+2006-11-10 Friday 17:46 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.9): In the Java
+ interface congruences are built just from linear expressions.
+
+2006-11-10 Friday 14:56 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.7),
+ ppl_java_common.cc (1.8), ppl_java_common.hh (1.4): Initial
+ support for the Congruence/Grid classes. Added other methods to
+ the Polyhedron Java interface, but some of them must be
+ implemented.
+
+2006-11-10 Friday 12:50 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Interval.defs.hh,
+ Interval_Info.defs.hh, Rational_Box.hh, checked.defs.hh,
+ checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+ (altnum.[22,49,7,3,29,20,30,4]): Fixed compilation without
+ optimization.
+
+2006-11-10 Friday 12:35 Abramo Bagnara
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.3):
+ C99 mandates that sizeof unsigned is always the same of
+ corresponding signed type.
+
+2006-11-10 Friday 07:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.251): Version number bumped.
+
+2006-11-10 Friday 00:00 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.13): Fixed return value.
+
+2006-11-09 Thursday 23:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.22): Methods computing affine (pre-)
+ images now also deal with the case of denominators different from
+ 1.
+
+2006-11-09 Thursday 22:59 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.48): Adjust flags on set_unbounded.
+ A little more work on div_assign. Splitted normalize_integer to
+ help the compiler in its inlining job.
+
+2006-11-09 Thursday 18:28 Abramo Bagnara
+
+ * interfaces/Prolog/SICStus/sicstus_cfli.ic, src/Limits.hh,
+ configure.ac (altnum.[3,6,22]): C99 mandates that sizeof unsigned
+ is always the same of corresponding signed type.
+
+2006-11-09 Thursday 17:24 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.12): set_unbounded returns a
+ feedback.
+
+2006-11-09 Thursday 17:17 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (altnum.24): Substituted
+ specializations with templates.
+
+2006-11-09 Thursday 16:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Box.inlines.hh, Box.templates.hh (altnum.[18,21]): Be
+ explicit when invoking methods of a class template.
+
+2006-11-09 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.61), GNU/Makefile.am
+ (1.60): Ensure `make distclean' does the right thing.
+
+2006-11-09 Thursday 15:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.20): Corrected method OK(): even if
+ the box is marked empty, this does not imply that there should be
+ empty intervals in it. Drafted (partial) implementation of
+ affine_preimage().
+
+2006-11-09 Thursday 14:31 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.42): MIP_Problem fixed.
+
+2006-11-09 Thursday 13:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.19): Drafted (partial)
+ implementation of the affine_image() method.
+
+2006-11-09 Thursday 13:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.defs.hh (altnum.16): Added declarations for all the
+ affine image/preimage methods.
+
+2006-11-09 Thursday 13:42 quartieri
+
+ * tests/Octagonal_Shape/bounds1.cc (1.2): Added some tests on
+ bounds_from_above() and bounds_from_below() checking universal
+ octagons.
+
+2006-11-09 Thursday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounds1.cc (altnum.1): file bounds1.cc was
+ added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounds1.cc (octagons.1): file bounds1.cc
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 13:37 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.41): The previous correction didn't work as
+ expected. Now MIP_Problem should work also when the tableau is
+ empty.
+
+2006-11-09 Thursday 12:30 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.7): Removed some prints
+ used for debugging purposes.
+
+2006-11-09 Thursday 12:27 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.6),
+ ppl_java_common.cc (1.6), ppl_java_common.hh (1.3): Added the
+ Variables_Set class to the repository. Implemented other native
+ methods that belongs to Polyhedron. Added other routine
+ functions.
+
+2006-11-09 Thursday 12:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.87): Corrected a bug in
+ poly_difference_assign(): an assertion was failing when the
+ argument polyhedron was represented by an inconsistent constraint
+ system, but emptiness was not detected yet.
+
+2006-11-09 Thursday 11:47 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.41): Removed the control on
+ the universal Octagonal_Shape cause MIP_Problem handles this case
+ properly.
+
+2006-11-09 Thursday 10:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.30),
+ ppl_interface_generator_predicate_check_extra_code (1.20):
+ Several bugs in the testing framework fixed. Added test07 to the
+ test data.
+
+2006-11-09 Thursday 10:36 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.40): Fixed another bug in MIP_Problem. A
+ wrong status was computed if minimization was requested and the
+ internal tableau was empty.
+
+2006-11-09 Thursday 10:26 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.47): Avoid comparisons statically
+ unsafe.
+
+2006-11-09 Thursday 10:24 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.19): Added support for safe
+ comparisons.
+
+2006-11-09 Thursday 10:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/polydifference2.cc (1.9): Added test shows a bug
+ in poly_difference_assign() when the polyhedron to be subtracted
+ is empty and not in minimal form.
+
+2006-11-09 Thursday 08:39 Abramo Bagnara
+
+ * configure.ac (altnum.21): Added two more SIZEOF.
+
+2006-11-09 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min2.cc (altnum.1): file max_min2.cc
+ was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min2.cc (octagons.1): file max_min2.cc
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 08:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: BD_Shape/max_min2.cc (1.2), Octagonal_Shape/max_min2.cc
+ (1.2): Added 2 tests to both test files showing a bug in
+ minimize() (with point) for both BD_Shape and Octagonal_Shape.
+
+ One of these tests shows the bug (the denominator is 0) while the
+ second shows that a similar bug does not occur with maximize()
+ (with point).
+
+2006-11-09 Thursday 08:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.202), doc/Makefile.am (1.49), interfaces/Makefile.am
+ (1.22), interfaces/C/Makefile.am (1.28),
+ interfaces/Prolog/Makefile.am (1.35),
+ interfaces/Prolog/SICStus/Makefile.am (1.72),
+ interfaces/Prolog/SWI/Makefile.am (1.66),
+ interfaces/Prolog/XSB/Makefile.am (1.47),
+ interfaces/Prolog/YAP/Makefile.am (1.49),
+ interfaces/Prolog/tests/Makefile.am (1.11): Clean automatically
+ generated files.
+
+2006-11-09 Thursday 07:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/Makefile.am (1.7): Distribute all
+ examples.
+
+2006-11-08 Wednesday 18:24 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.59): Removed some lines
+ not-necessary in the following methods: - bounds(); - max_min().
+
+2006-11-08 Wednesday 18:13 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.39): Fixed a bug: return the origin with
+ the right space dimension if the input Constraint_System is
+ universal and the problem is unbounded.
+
+2006-11-08 Wednesday 17:52 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.58): Corrected the method max_min().
+
+2006-11-08 Wednesday 17:51 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.40),
+ tests/Octagonal_Shape/Makefile.am (1.13),
+ tests/Octagonal_Shape/max_min2.cc (1.1): Corrected a bug in the
+ method max_min() and added some tests.
+
+2006-11-08 Wednesday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/Makefile.am (octagons.1): file Makefile.am
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-08 Wednesday 17:44 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.57), tests/BD_Shape/Makefile.am
+ (1.57), tests/BD_Shape/max_min2.cc (1.1): Corrected the method
+ max_min() and added some tests on it.
+
+2006-11-08 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.60): ppl_ciao.cc is not
+ built.
+
+2006-11-08 Wednesday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh,
+ Polyhedron_public.cc (altnum.[3,3,10]): (Generalized) Affine
+ (pre-) image methods changed so as to throw an exception when the
+ relation symbol is NOT_EQUAL. Switchs on Relation_Symbol changed
+ to take into proper account the new value.
+
+2006-11-08 Wednesday 16:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.18): Method OK() now also checks
+ that a box declared to be (non) empty is actually (non) empty.
+ Typo fixed in is_topologically_closed(). Added implementation
+ for method is_discrete(). Do check for emptyness in method
+ is_bounded().
+
+2006-11-08 Wednesday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.8): More methods activated.
+
+2006-11-08 Wednesday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (octagons.1): file Any_Pointset.defs.hh
+ was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.21): Java directory activated.
+
+2006-11-08 Wednesday 15:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/max_min1.cc (1.2): Tests 3 and 4 fail with
+ 8-bit integers.
+
+2006-11-08 Wednesday 15:33 Andrea Cimino
+
+ * interfaces/Java/tests/C_Polyhedron_test1.java (1.2): Added some
+ new calls to the test reflecting the last changes to the Java
+ interface.
+
+2006-11-08 Wednesday 15:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.17): Indentation fixed.
+
+2006-11-08 Wednesday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.250): Version number bumped.
+
+2006-11-08 Wednesday 15:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.17): Temporarily patched the default
+ constructor and method add_space_dimensions_and_embed() so as to
+ match tehir specification.
+
+2006-11-08 Wednesday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.48), interfaces/C/Makefile.am (1.27),
+ interfaces/Prolog/Makefile.am (1.34),
+ interfaces/Prolog/Ciao/Makefile.am (1.59),
+ interfaces/Prolog/GNU/Makefile.am (1.59),
+ interfaces/Prolog/SICStus/Makefile.am (1.71),
+ interfaces/Prolog/SWI/Makefile.am (1.65),
+ interfaces/Prolog/XSB/Makefile.am (1.46),
+ interfaces/Prolog/YAP/Makefile.am (1.48),
+ interfaces/Prolog/tests/Makefile.am (1.10): Fixed several
+ packaging glitches.
+
+2006-11-08 Wednesday 14:47 Andrea Cimino
+
+ * interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.5),
+ ppl_java_common.cc (1.5), ppl_java_common.hh (1.2): Added other
+ methods to the Java C_Polyhedron inteface. Added new routine
+ methods. Revised several comments.
+
+2006-11-08 Wednesday 13:57 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (altnum.23): Reverted changed
+ commited by mistake.
+
+2006-11-08 Wednesday 13:55 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh, Interval.defs.hh
+ (altnum.[22,46]): Added missing signatures for operator==.
+
+2006-11-08 Wednesday 13:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (1.30): Minor change in the
+ documentation: name the set of integer variables in the brief
+ description of a constructor.
+
+2006-11-08 Wednesday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (octagons.1): file MIP_Problem.defs.hh
+ was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linearpartition1.cc (1.10): Refer to
+ Pointset_Powerset<PH> instead of Powerset<Determinate<PH> >.
+
+2006-11-08 Wednesday 12:01 Abramo Bagnara
+
+ * src/: checked_ext.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[9,29,23,25]): Pushed native extended handling to lowest
+ level.
+
+2006-11-08 Wednesday 11:37 quartieri
+
+ * src/Octagonal_Shape.defs.hh (1.17),
+ src/Octagonal_Shape.inlines.hh (1.12),
+ src/Octagonal_Shape.templates.hh (1.39),
+ tests/Octagonal_Shape/Makefile.am (1.12),
+ tests/Octagonal_Shape/bounds1.cc (1.1),
+ tests/Octagonal_Shape/max_min1.cc (1.1): Defined the methods: -
+ bounds(); - bounds_from_above(); - bounds_from_below(); -
+ max_min(); - maximize(); - minimize(); and added some tests on
+ them.
+
+2006-11-08 Wednesday 11:12 Abramo Bagnara
+
+ * src/: Float.defs.hh, checked_ext.inlines.hh (altnum.[3,8]):
+ Converted handle_ext_natively in a function.
+
+2006-11-08 Wednesday 09:54 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (altnum.22): Removed useless function.
+
+2006-11-08 Wednesday 09:54 Abramo Bagnara
+
+ * src/checked_ext.inlines.hh (altnum.7): Added extended constants
+ printing.
+
+2006-11-08 Wednesday 09:17 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.45): Added multiplication.
+
+2006-11-08 Wednesday 09:17 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.11): Renamed sign into sgn for
+ conformity to other places.
+
+2006-11-08 Wednesday 00:58 Andrea Cimino
+
+ * interfaces/Java/jni/Makefile.am (1.3): If a `make clean' is
+ called, delete all the headers generated by javah.
+
+2006-11-08 Wednesday 00:01 Andrea Cimino
+
+ * m4/ac_prog_javah.m4 (1.6): Avoid to compile the Java interface if
+ javah is found but the jni.h header is not found.
+
+2006-11-08 Wednesday 00:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javah.m4 (altnum.1): file ac_prog_javah.m4 was added
+ on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-08 Wednesday 00:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javah.m4 (octagons.1): file ac_prog_javah.m4 was added
+ on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 22:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.16): Drafted an implementation of
+ add_constraint().
+
+2006-11-07 Tuesday 20:08 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (1.4): Added other
+ Polyhedron methods to the Java interface.
+
+2006-11-07 Tuesday 19:22 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_Polyhedron.cc (1.3): Added some
+ Polyhedron related methods to the Java interface.
+
+2006-11-07 Tuesday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.56): Useless parentheses removed.
+
+2006-11-07 Tuesday 17:04 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.18): Added temporary kludge to fix
+ compiling.
+
+2006-11-07 Tuesday 16:24 Abramo Bagnara
+
+ * src/: checked.inlines.hh, checked_ext.inlines.hh (altnum.[17,6]):
+ Removed unsafe comparisons.
+
+2006-11-07 Tuesday 16:20 Elena Mazzi
+
+ * src/BD_Shape.defs.hh (1.89), src/BD_Shape.inlines.hh (1.137),
+ src/BD_Shape.templates.hh (1.55), tests/BD_Shape/Makefile.am
+ (1.56), tests/BD_Shape/bounds1.cc (1.1),
+ tests/BD_Shape/max_min1.cc (1.1): Defined the following methods:
+ - bounds_from_above(); - bounds_from_below(); - bounds(); -
+ max_min(); - maximize(); - minimize(). Added some tests on them.
+
+2006-11-07 Tuesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounds1.cc (altnum.1): file bounds1.cc was added
+ on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounds1.cc (octagons.1): file bounds1.cc was added
+ on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min1.cc (altnum.1): file max_min1.cc was added
+ on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/max_min1.cc (octagons.1): file max_min1.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 15:48 Abramo Bagnara
+
+ * src/Rounding_Dir.inlines.hh (altnum.5): Moved a definition to
+ permit inlining.
+
+2006-11-07 Tuesday 15:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.templates.hh, Interval.inlines.hh,
+ Interval_Info.defs.hh, Interval_Info.inlines.hh,
+ Interval_Info.types.hh, Makefile.am (altnum.[15,14,6,1,1,27]):
+ swap() functions and methods for the Interval_Info classes
+ revised. Rewritten Box<Interval>::operator(ostream&).
+
+2006-11-07 Tuesday 15:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.39): Fixed a couple of
+ memory leaks in exception_prolog.
+
+2006-11-07 Tuesday 15:20 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.54): Fixed a comment on
+ BD_Shape::remove_space_dimensions().
+
+2006-11-07 Tuesday 15:18 Andrea Cimino
+
+ * configure.ac (1.249), m4/Makefile.am (1.21), m4/ac_prog_java.m4
+ (1.2), m4/ac_prog_java_works.m4 (1.3), m4/ac_prog_javac.m4 (1.2),
+ m4/ac_prog_javac_works.m4 (1.2): Java environment detection
+ improved. Moved all the *_works stuff in the ac_prog_java* files.
+
+2006-11-07 Tuesday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javac.m4 (altnum.1): file ac_prog_javac.m4 was added
+ on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-07 Tuesday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_javac.m4 (octagons.1): file ac_prog_javac.m4 was added
+ on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 15:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.88), BD_Shape.inlines.hh (1.136),
+ BD_Shape.templates.hh (1.53), Octagonal_Shape.defs.hh (1.16),
+ Octagonal_Shape.inlines.hh (1.11), Octagonal_Shape.templates.hh
+ (1.38): Added (imprecise but safe) implementations of shapes
+ constructors taking a congruence system as input. Added a few
+ missing include files so as to avoid indirect dependencies.
+
+2006-11-07 Tuesday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh, Interval.inlines.hh (altnum.[44,13]):
+ Added Interval::swap(Interval& y) for consistency with the rest
+ of the library. The corresponding std::swap() function is now
+ implemented in terms of that one.
+
+2006-11-07 Tuesday 13:14 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[10,43,5]): Added swap. Moved adjust_boundary_info in
+ more appropriate file.
+
+2006-11-07 Tuesday 13:13 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[21,21]): Move swap in std namespace.
+
+2006-11-07 Tuesday 10:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.248), m4/ac_prog_javah.m4 (1.5):
+ AC_CANONICAL_SYSTEM is obsolete: use AC_CANONICAL_HOST instead.
+
+2006-11-07 Tuesday 10:00 Andrea Cimino
+
+ * configure.ac (1.247), m4/ac_prog_javah.m4 (1.4): Call
+ AC_CANONICAL_SYSTEM before AM_INIT_AUTOMAKE to avoid the previous
+ autoreconf messages. ac_prog_javah.m4 reverted to the previous
+ version.
+
+2006-11-07 Tuesday 09:23 Andrea Cimino
+
+ * m4/ac_prog_javah.m4 (1.3): Avoid autoreconf warnings.
+
+2006-11-07 Tuesday 08:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.16): Fixed Box<Interval>::is_empty().
+
+2006-11-07 Tuesday 08:34 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.42): Fixed typo.
+
+2006-11-06 Monday 23:48 Abramo Bagnara
+
+ * src/Interval_Info.defs.hh (altnum.4): Added static keyword.
+
+2006-11-06 Monday 23:46 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.41): Fixed typo.
+
+2006-11-06 Monday 23:44 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.40): Fixes to convex_hull and
+ intersect.
+
+2006-11-06 Monday 23:16 Andrea Cimino
+
+ * m4/ac_prog_java_works.m4 (1.2): Proceed configuring if a not
+ suitable JDK is found.
+
+2006-11-06 Monday 23:01 Andrea Cimino
+
+ * m4/ac_prog_javah.m4 (1.2): Fixed an autoconf call.
+
+2006-11-06 Monday 22:57 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[9,39,3]): Simplified Interval return values. Changed
+ integer properties.
+
+2006-11-06 Monday 22:25 Andrea Cimino
+
+ * m4/ac_prog_java.m4 (1.1): Added a missing macro to the `m4'
+ directory.
+
+2006-11-06 Monday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/tests/Makefile.am (octagons.1): file Makefile.am
+ was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-06 Monday 22:12 Andrea Cimino
+
+ * interfaces/Java/: Makefile.am (1.4), jni/Makefile.am (1.2),
+ tests/Makefile.am (1.2): Makefile.am's updated to take the
+ programs name from autoconf.
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_classpath.m4 (altnum.1): file ac_check_classpath.m4
+ was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_classpath.m4 (octagons.1): file ac_check_classpath.m4
+ was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_classpath.m4 (simplex.1): file ac_check_classpath.m4
+ was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_jar.m4 (altnum.1): file ac_prog_jar.m4 was added on
+ branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_prog_jar.m4 (octagons.1): file ac_prog_jar.m4 was added on
+ branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.246), m4/Makefile.am (1.20),
+ m4/ac_check_classpath.m4 (1.1), m4/ac_prog_jar.m4 (1.1),
+ m4/ac_prog_java_works.m4 (1.1), m4/ac_prog_javac.m4 (1.1),
+ m4/ac_prog_javac_works.m4 (1.1), m4/ac_prog_javah.m4 (1.1):
+ Autodetect the availability of the required Java development
+ environment.
+
+2006-11-06 Monday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (altnum.6): Use the new implementation of intervals.
+
+2006-11-06 Monday 16:05 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.38): Added missing argument.
+
+2006-11-06 Monday 15:59 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.37): Fixed two typos hard to see.
+
+2006-11-06 Monday 15:58 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.36): Added two missing 'combine'.
+
+2006-11-06 Monday 15:56 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.35): Added two missing functions
+ invoking methods. Fixed typos.
+
+2006-11-06 Monday 15:46 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[8,34,2]): Modified properties handling for generic
+ property value. Added normalize_integer().
+
+2006-11-06 Monday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.15): Do not use low-level methods
+ (this seems to expose a bug in the Interval implementation).
+
+2006-11-06 Monday 12:57 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.37): Replaced some assign_r()
+ with the operator=().
+
+2006-11-06 Monday 12:06 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.52), tests/BD_Shape/Makefile.am
+ (1.55), tests/BD_Shape/boundedaffinepreimage1.cc (1.1): Defined a
+ new method: BD_Shape::bounded_affine_preimage() and added some
+ tests on it.
+
+2006-11-06 Monday 12:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffinepreimage1.cc (altnum.1): file
+ boundedaffinepreimage1.cc was added on branch altnum on
+ 2006-12-02 22:35:33 +0000
+
+2006-11-06 Monday 12:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffinepreimage1.cc (octagons.1): file
+ boundedaffinepreimage1.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-11-06 Monday 10:52 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.51): Corrected a bug on
+ bds_hull_assign() when a BDS is minimized.
+
+2006-11-06 Monday 10:51 Elena Mazzi
+
+ * tests/BD_Shape/bdshull1.cc (1.14): Added test 08 that shows a bug
+ in bds_hull_assign.
+
+2006-11-06 Monday 10:49 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.50): Replaced some assign_r() with
+ the operator=().
+
+2006-11-06 Monday 10:46 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.33): Modified strictly_contains
+ implementation.
+
+2006-11-06 Monday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+ ppl_interface_generator_prolog_icc_preamble (altnum.[5,5]):
+ References to Rational_Box fixed. Reference to Old_Interval
+ removed.
+
+2006-11-06 Monday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (altnum.15): Added new typename member
+ `interval_type'.
+
+2006-11-05 Sunday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.14): Exploit the information returned
+ by refine()
+
+2006-11-05 Sunday 22:30 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.7): Fixed typos.
+
+2006-11-05 Sunday 22:26 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.32): Added strictly_contains. Fixed
+ contains for empty intervals. NAN scalar is not a singleton.
+
+2006-11-05 Sunday 22:18 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.31): Added some FIXME's.
+
+2006-11-05 Sunday 22:11 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.30): Added an incorrect stub for
+ info_open to permit compilation.
+
+2006-11-05 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.inlines.hh (altnum.13): Two FIXMEs partially resolved.
+
+2006-11-05 Sunday 22:04 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.29): Added contains. Simplified
+ operator==.
+
+2006-11-05 Sunday 22:03 Abramo Bagnara
+
+ * src/Boundary.defs.hh (altnum.6): Modified implementation of
+ is_unbounded and extended its use.
+
+2006-11-05 Sunday 21:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.12),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.17),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.17),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.29): Added add_disjunct and get_disjuncts to the Prolog
+ interface. The generated tests show a bug, still to be fixed, in
+ get_disjuncts.
+
+2006-11-05 Sunday 21:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.templates.hh (altnum.[14,14]): Added
+ dimension_type Box<Interval>::affine_dimension() const.
+
+2006-11-05 Sunday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.inlines.hh, Box.templates.hh (altnum.[12,13]): Added
+ void Box<Interval>::add_space_dimensions_and_embed(const
+ dimension_type) and void
+ Box<Interval>::add_space_dimensions_and_project(const
+ dimension_type).
+
+2006-11-05 Sunday 19:12 Abramo Bagnara
+
+ * src/: Box.templates.hh, Interval.defs.hh (altnum.[12,28]):
+ Cosmetic fixes. Added contains_integer_point implementation.
+
+2006-11-05 Sunday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.49), Octagonal_Shape.templates.hh
+ (1.36): Exception throwers simplified.
+
+2006-11-05 Sunday 18:57 Andrea Cimino
+
+ * configure.ac (1.245), interfaces/Java/Makefile.am (1.3),
+ interfaces/Java/jni/Makefile.am (1.1),
+ interfaces/Java/jni/ppl_java_Polyhedron.cc (1.2),
+ interfaces/Java/tests/C_Polyhedron_test1.java (1.1),
+ interfaces/Java/tests/Makefile.am (1.1): The `ppl_java' library
+ is now built. Added the first test for the Java interface.
+ Solved some cut and paste bugs in ppl_java_Polyhedron.cc.
+
+2006-11-05 Sunday 18:35 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.27): Added missing ().
+
+2006-11-05 Sunday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.templates.hh, Interval.defs.hh (altnum.[11,26]): Added
+ template <typename Boundary, typename Info, typename T> inline
+ bool operator!=(const Interval<Boundary, Info>&, const T&).
+
+2006-11-05 Sunday 18:23 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.25): Added missing const.
+
+2006-11-05 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh (altnum.[13,11]): Addded
+ Constraint_System Box<Interval>::minimized_constraints() const.
+ Added missing friend declarations.
+
+2006-11-05 Sunday 17:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh (altnum.[12,10]): Added
+ explicit Box<Interval>::Box(const Constraint_System&).
+
+2006-11-05 Sunday 17:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[11,9,10]): Added Box<Interval>::Box(const Box&) and
+ template <typename Other_Interval> explicit
+ Box<Interval>::Box(const Box<Other_Interval>&).
+
+2006-11-05 Sunday 17:04 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.24): Added missing return.
+
+2006-11-05 Sunday 17:02 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.23): Improved version of operator==.
+
+2006-11-05 Sunday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh (altnum.[10,8]): Added explicit
+ Box<Interval>::Box(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE).
+
+2006-11-05 Sunday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, tests/ppl_test.cc, tests/ppl_test.hh,
+ tests/print.hh, tests/Box/Makefile.am,
+ tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+ tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+ tests/Box/bdsdifference1.cc, tests/Box/boundedaffineimage1.cc,
+ tests/Box/boxhull.cc, tests/Box/cc76narrowing1.cc,
+ tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+ tests/Box/concatenate1.cc, tests/Box/constraints1.cc,
+ tests/Box/containsintegerpoint1.cc, tests/Box/fromgensys1.cc,
+ tests/Box/frompolyhedron1.cc,
+ tests/Box/generalizedaffineimage1.cc,
+ tests/Box/generalizedaffinepreimage1.cc,
+ tests/Box/intersection1.cc, tests/Box/mapspacedims1.cc,
+ tests/Box/maxspacedim1.cc, tests/Box/removespacedims1.cc,
+ tests/Box/timeelapse1.cc
+ (altnum.[20,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+ Added some infrastructure to begin testing in tests/Box.
+
+2006-11-05 Sunday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_widenings.cc, Rational_Box.hh (altnum.[8,2]):
+ Rational_Box is now in the Parma_Polyhedra_Library namespace.
+
+2006-11-05 Sunday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.22): Added missing return statement.
+
+2006-11-05 Sunday 16:35 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.21): Better unbounded check.
+
+2006-11-05 Sunday 16:32 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh (altnum.[5,20]): Added
+ refine (still incomplete). Better name for is_integer applied to
+ intervals.
+
+2006-11-05 Sunday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[9,7,9]): Drafted bool operator==(const Box<Interval>&,
+ const Box<Interval>&) and bool operator!=(const Box<Interval>&,
+ const Box<Interval>&).
+
+2006-11-05 Sunday 16:04 Andrea Cimino
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.4): Fixed Makefile.am
+ to avoid some autoconf warnings. Fixed some interface bugs.
+
+2006-11-05 Sunday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[8,6,8]): Implementation of Box abstracted with respect
+ to the sequence employed in the representation. Drafted void
+ Box<Interval>::concatenate_assign(const Box&).
+
+2006-11-05 Sunday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.defs.hh (altnum.19): Added missing inclusions and
+ std:: qualifications.
+
+2006-11-05 Sunday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh (altnum.3): Added NOT_EQUAL to enum
+ Relation_Symbol.
+
+2006-11-05 Sunday 15:12 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.18): Added OK().
+
+2006-11-05 Sunday 15:11 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ checked.defs.hh, checked_ext.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[20,20,28,5,20,28,21,24]): Added ceil and floor.
+
+2006-11-05 Sunday 15:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.201): Note that in the OK() methods, instead of having
+ all those #ifndef NDEBUG, it is probably worthwhile to use a
+ suitable defined `barf' stream that does the right thing.
+
+2006-11-05 Sunday 15:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.200): Remember to add a "quick assign" function to
+ checked numbers that allows to efficiently assign small integer
+ constants (like those in the range [-2, 2]) that are guaranteed
+ not to cause any rounding or overflow problems.
+
+2006-11-05 Sunday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.defs.hh (altnum.7): Added declarations for the standard
+ member functions that may modify the dimension of the vector
+ space.
+
+2006-11-05 Sunday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Box/: .cvsignore, Makefile.am, addconstraints1.cc,
+ addspacedims1.cc, affinedimension1.cc, affineimage1.cc,
+ affinepreimage1.cc, ascii_dump_load1.cc, bdsdifference1.cc,
+ bgp99extrapolation1.cc, bhz03widening1.cc, bounded1.cc,
+ boundedaffineimage1.cc, boxhull.cc, cc76narrowing1.cc,
+ cc76widening.cc, closure1.cc, concatenate1.cc, constraints1.cc,
+ contains1.cc, containsintegerpoint1.cc, discrete1.cc,
+ disjoint1.cc, empty1.cc, equality1.cc, expandspacedim1.cc,
+ foldspacedims1.cc, fromgensys1.cc, frompolyhedron1.cc,
+ generalizedaffineimage1.cc, generalizedaffinepreimage1.cc,
+ geomcovers1.cc, intersection1.cc, mapspacedims1.cc,
+ maxspacedim1.cc, membytes1.cc, minconstraints1.cc, relations1.cc,
+ removespacedims1.cc, timeelapse1.cc, universe1.cc, writebox1.cc
+ (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Ripped from the tests/BD_Shape directory to serve as a basis for
+ building the Box testsuite.
+
+2006-11-05 Sunday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim1.cc (altnum.1): file
+ maxspacedim1.cc was added on branch altnum on 2006-12-02 22:35:34
+ +0000
+
+2006-11-05 Sunday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim1.cc (octagons.1): file
+ maxspacedim1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-11-05 Sunday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.54), BD_Shape/maxspacedim.cc
+ (1.14), BD_Shape/maxspacedim1.cc (1.1),
+ Octagonal_Shape/Makefile.am (1.11),
+ Octagonal_Shape/maxspacedim.cc (1.2),
+ Octagonal_Shape/maxspacedim1.cc (1.1): Renamed maxspacedim.cc to
+ maxspacedim1.cc.
+
+2006-11-05 Sunday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim1.cc (altnum.1): file maxspacedim1.cc
+ was added on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-05 Sunday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim1.cc (octagons.1): file maxspacedim1.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-05 Sunday 14:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.87): Missing blanks added.
+
+2006-11-05 Sunday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.cc, Box.defs.hh, Box.templates.hh (altnum.[2,6,7]):
+ Added void Box<Interval>::add_constraints(const
+ Constraint_System&) and bool Box<Interval>::OK() const. Started
+ drafting void Box<Interval>::add_constraint(const Constraint&).
+
+2006-11-05 Sunday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[5,5,6]): New methods void box_hull_assign(const Box&)
+ and void upper_bound_assign(const Box&).
+
+2006-11-05 Sunday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+ (altnum.[4,4,5]): New methods bool Box<Interval>::marked_empty()
+ const and void Box<Interval>::intersection_assign(const Box&).
+
+2006-11-05 Sunday 09:41 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh (altnum.[4,17]): Added
+ some methods.
+
+2006-11-05 Sunday 09:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Box.templates.hh (altnum.4): Two FIXMEs resolved by using
+ Interval::set_lower_unbounded() and
+ Interval::set_upper_unbounded().
+
+2006-11-05 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Boundary.defs.hh, Box.defs.hh, Box.inlines.hh,
+ Box.templates.hh (altnum.[3,3,3,3]): Method is_empty() revised.
+ Added methods bool is_universe() const, bool
+ is_topologically_closed() const, bool is_bounded() const, and
+ bool contains_integer_point() const.
+
+2006-11-05 Sunday 07:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.7): Activated the
+ bounded_affine_image() and bounded_affine_preimage() methods.
+
+2006-11-04 Saturday 21:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+ src/Bounding_Box.inlines.hh, src/Bounding_Box.types.hh,
+ src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+ src/Makefile.am, src/Polyhedron_widenings.cc, src/Rational_Box.hh
+ (altnum.[4,4,4,4,3,2,2,2,26,7,1]): New class Rational_Box to
+ replace the old Bounding_Box. Several corrections to the
+ definition of class Box.
+
+2006-11-04 Saturday 20:25 Andrea Cimino
+
+ * interfaces/Java/Makefile.am (1.2): If Java interface generation
+ is enabled, ppl_java.jar is automatically built. The java files
+ are now compiled always together.
+
+2006-11-04 Saturday 19:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Box.cc, Box.defs.hh, Box.inlines.hh, Box.templates.hh,
+ Box.types.hh, Interval.defs.hh, Makefile.am
+ (altnum.[1,1,1,1,1,16,25]): The new Box templatic class
+ efficiently represents not necessarily closed, iso-oriented
+ hyperrectangles.
+
+2006-11-04 Saturday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+ ppl_interface_generator_prolog_icc_preamble (altnum.[3,4]): Enum
+ value LOWER and UPPER renamed LOWER_BOUNDARY and UPPER_BOUNDARY,
+ respectively.
+
+2006-11-04 Saturday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval.inlines.hh,
+ Interval.types.hh, Makefile.am, Old_Interval.defs.hh,
+ Old_Interval.inlines.hh, Old_Interval.types.hh
+ (altnum.[2,15,12,3,24,2,2,2]): Old implementation of intervals
+ moved further out of the way. New interval implementation is now
+ included in ppl.hh.
+
+2006-11-04 Saturday 16:46 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.14): Added quick and dirty trick to
+ support interval construction from strings.
+
+2006-11-04 Saturday 16:39 Abramo Bagnara
+
+ * src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+ (altnum.[1,13,1]): Splitted and reorganized new intervals code.
+
+2006-11-04 Saturday 16:38 Abramo Bagnara
+
+ * src/fpu-ia32.inlines.hh (altnum.4): Added memory clobber
+ directive to avoid asm reordering.
+
+2006-11-04 Saturday 16:37 Abramo Bagnara
+
+ * src/compiler.hh (altnum.3): Added avoid_cse.
+
+2006-11-04 Saturday 16:36 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.19): Reinserted lost commit.
+ Added avoid_cse.
+
+2006-11-04 Saturday 16:35 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (altnum.19): Improved comment.
+
+2006-11-03 Friday 21:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.3): Use switches
+ whenever possible.
+
+2006-11-03 Friday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/ppl_java_common.cc (1.2): Avoid long lines.
+
+2006-11-03 Friday 16:41 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.12): More work on interval.
+
+2006-11-03 Friday 16:38 Andrea Cimino
+
+ * interfaces/Java/jni/: .cvsignore (1.1), ppl_java_C_Polyhedron.cc
+ (1.1), ppl_java_Polyhedron.cc (1.1), ppl_java_common.cc (1.1),
+ ppl_java_common.hh (1.1): Added the `jni' directory to the trunk.
+ Added some files that interface Java to C++ via JNI.
+
+2006-11-03 Friday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/.cvsignore (altnum.1): file .cvsignore was
+ added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-03 Friday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/.cvsignore (octagons.1): file .cvsignore was
+ added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-03 Friday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/jni/.cvsignore (simplex.1): file .cvsignore was
+ added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-03 Friday 15:24 quartieri
+
+ * tests/Octagonal_Shape/boundedaffineimage1.cc (1.7): Removed some
+ useless lines from test13().
+
+2006-11-03 Friday 15:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffineimage1.cc (octagons.1): file
+ boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-11-03 Friday 14:51 Andrea Cimino
+
+ * interfaces/Makefile.am (1.20): Temporarily disabled the Java
+ interface to be processed by Makefile.
+
+2006-11-03 Friday 10:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.11),
+ Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (1.19),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.22): Fixed some bugs. Tidied the handling of a "friend" class
+ replacement. Improved some comments.
+
+2006-11-03 Friday 10:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (octagons.1): file ppl_interface_generator_predicate_check_pl.m4
+ was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-02 Thursday 16:51 quartieri
+
+ * tests/Octagonal_Shape/expandspacedim1.cc (1.2): Added some tests.
+
+2006-11-02 Thursday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/expandspacedim1.cc (octagons.1): file
+ expandspacedim1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-11-02 Thursday 15:21 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.35),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.2): Corrected
+ the method bounded_affine_preimage() when `lb_expr' contains
+ `var'. Added some tests.
+
+2006-11-02 Thursday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffinepreimage1.cc (octagons.1):
+ file boundedaffinepreimage1.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-11-02 Thursday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.70): Unwanted changes withdrawn.
+
+2006-11-02 Thursday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[18,27]):
+ Enable inexact check when requested.
+
+2006-11-02 Thursday 11:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (altnum.18): Fixed missing round
+ direction extraction.
+
+2006-11-02 Thursday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.83), checked.defs.hh (1.37),
+ checked_float.inlines.hh (1.69): Previous changes reverted (they
+ were meant for the `altnum' branch only).
+
+2006-11-02 Thursday 10:03 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.11): Added more functions. Added
+ some notes to not forget.
+
+2006-11-01 Wednesday 23:00 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.68): Fixed missing round
+ direction extraction.
+
+2006-11-01 Wednesday 22:59 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.82), checked.defs.hh (1.36):
+ Enable inexact check when requested.
+
+2006-11-01 Wednesday 22:56 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.10): More work on new intervals.
+
+2006-11-01 Wednesday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.38): Block indentation corrected.
+
+2006-11-01 Wednesday 20:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.13),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.6),
+ Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (1.18),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.21): Further improvements to the generation of the code.
+
+2006-11-01 Wednesday 17:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common.m4 (1.12): Some ongoing
+ improvements - both to the comments and in making the arguments
+ to the macros more uniform.
+
+2006-11-01 Wednesday 15:42 Abramo Bagnara
+
+ * src/: Init.cc, Rounding_Dir.defs.hh, Rounding_Dir.inlines.hh,
+ fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu-sparc.inlines.hh,
+ fpu.types.hh (altnum.[4,4,4,3,3,3,3]), checked_float.inlines.hh
+ (1.67): Use specific types for fpu_rounding_direction_type and
+ fpu_rounding_control_word_type.
+
+2006-11-01 Wednesday 15:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.28),
+ ppl_interface_generator_predicate_check_extra_code (1.17),
+ ppl_interface_generator_predicate_check_pl.m4 (1.20): Several
+ improvements to the code - both the generated code and to the m4
+ itself.
+
+2006-11-01 Wednesday 13:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.16),
+ ppl_interface_generator_prolog_icc_code.m4 (1.16): Added code for
+ the Octagonal_Shape and BD_Shape narrowing procedures.
+
+2006-11-01 Wednesday 12:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.10),
+ C/ppl_interface_generator_c_cc_code.m4 (1.9),
+ C/ppl_interface_generator_c_dat.m4 (1.9),
+ C/ppl_interface_generator_c_h_code.m4 (1.6),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.15),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.15),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.27): Several improvements - mainly wrt the generation of code
+ for the widening and extrapolation operators. All extrapolations
+ (including the widenings) for all the simple domains are now
+ generated. The only missing procedure now is the narrowing.
+
+ Names of some of the patterns to be replaced have also been
+ revised.
+
+2006-11-01 Wednesday 12:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (octagons.1): file
+ ppl_interface_generator_c_dat.m4 was added on branch octagons on
+ 2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (octagons.1):
+ file ppl_interface_generator_c_h_code.m4 was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:24 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.9): More work on intervals.
+
+2006-11-01 Wednesday 08:13 Abramo Bagnara
+
+ * src/Interval.defs.hh (altnum.8): Put under CVS control.
+
+2006-10-31 Tuesday 23:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (1.7): Cater also for Octagonal_Shape. Methods
+ renamed so as to reflect that Polyhedra_Powerset has been renamed
+ Pointset_Powerset.
+
+2006-10-31 Tuesday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/: Constraint.java (1.2), Linear_Expression.java
+ (1.2), Linear_Expression_Coefficient.java (1.2),
+ Linear_Expression_Common.java (1.2),
+ Linear_Expression_Difference.java (1.2),
+ Linear_Expression_Sum.java (1.2), Linear_Expression_Times.java
+ (1.2), Linear_Expression_Unary_Minus.java (1.2),
+ Linear_Expression_Variable.java (1.2), Relation_Symbol.java
+ (1.2): Moved.
+
+2006-10-31 Tuesday 18:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.48): Corrected another occurrence of
+ the same problem identified in the previous commit (wrong
+ handling of capacities), again in remove_space_dimensions().
+
+2006-10-31 Tuesday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/: Constraint.java (1.1), Linear_Expression.java
+ (1.1), Linear_Expression_Coefficient.java (1.1),
+ Linear_Expression_Common.java (1.1),
+ Linear_Expression_Difference.java (1.1),
+ Linear_Expression_Sum.java (1.1), Linear_Expression_Times.java
+ (1.1), Linear_Expression_Unary_Minus.java (1.1),
+ Linear_Expression_Variable.java (1.1), Relation_Symbol.java
+ (1.1): Put under CVS control.
+
+2006-10-31 Tuesday 17:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.47): Corrected a bug (in the
+ handling of DB_Row capacities) in method
+ remove_space_dimension(). Avoid useless computations when the
+ BD_Shape is known to be empty.
+
+2006-10-31 Tuesday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/foldspacedims1.cc (altnum.1): file
+ foldspacedims1.cc was added on branch altnum on 2006-12-02
+ 22:35:34 +0000
+
+2006-10-31 Tuesday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/foldspacedims1.cc (octagons.1): file
+ foldspacedims1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-31 Tuesday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/mapspacedims1.cc (octagons.1): file
+ mapspacedims1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-31 Tuesday 16:35 quartieri
+
+ * src/Octagonal_Shape.defs.hh (1.15),
+ src/Octagonal_Shape.templates.hh (1.34),
+ tests/Octagonal_Shape/Makefile.am (1.10),
+ tests/Octagonal_Shape/foldspacedims1.cc (1.1),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.2): Defined the method
+ fold_space_dimensions() and added some tests about it. Removed
+ the trailing white spaces from mapspacedims1.
+
+2006-10-31 Tuesday 14:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.26),
+ ppl_interface_generator_predicate_check_extra_code (1.16),
+ ppl_interface_generator_predicate_check_pl.m4 (1.19): Added
+ generic tests for the remaining widening/extrapolation and change
+ dimensions procedures.
+
+2006-10-31 Tuesday 13:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/foldspacedims1.cc (1.2): Added two tests to show a
+ bug. Both test fold_space_dimensions() for an empty shape in 2
+ dimensions but where the initial shape is built in different
+ ways. One of these tests causes an exception to be thrown
+ whereas the other passes.
+
+2006-10-31 Tuesday 13:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/foldspacedims1.cc (octagons.1): file
+ foldspacedims1.cc was added on branch octagons on 2006-11-18
+ 20:36:56 +0000
+
+2006-10-31 Tuesday 09:30 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh, Rounding_Dir.defs.hh,
+ Rounding_Dir.inlines.hh, checked_int.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[19,3,3,27,23]),
+ Checked_Number.defs.hh (1.81): Check for FPU inexact result only
+ when explicitly requested by the individual functions/operators.
+
+2006-10-31 Tuesday 09:23 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (altnum.20): Fixed is_int_mpq().
+
+2006-10-31 Tuesday 08:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (1.29): Avoid a Doxygen warning about an
+ undocumented parameter.
+
+2006-10-30 Monday 18:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.25): Tests for the affine image and preimage predicates added.
+
+2006-10-30 Monday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Saturation_Matrix.cc (1.12), Saturation_Matrix.defs.hh
+ (1.12), Saturation_Matrix.inlines.hh (1.8),
+ Saturation_Matrix.types.hh (1.5), Saturation_Row.cc (1.12),
+ Saturation_Row.defs.hh (1.13), Saturation_Row.inlines.hh (1.9),
+ Saturation_Row.types.hh (1.5): Replaced by the corresponding
+ files Bit_*.
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc (altnum.1): file Bit_Matrix.cc was added on
+ branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.cc (octagons.1): file Bit_Matrix.cc was added on
+ branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.defs.hh (altnum.1): file Bit_Matrix.defs.hh was
+ added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.defs.hh (octagons.1): file Bit_Matrix.defs.hh was
+ added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.inlines.hh (altnum.1): file Bit_Matrix.inlines.hh
+ was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.inlines.hh (octagons.1): file
+ Bit_Matrix.inlines.hh was added on branch octagons on 2006-11-18
+ 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.types.hh (altnum.1): file Bit_Matrix.types.hh was
+ added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Matrix.types.hh (octagons.1): file Bit_Matrix.types.hh
+ was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc (altnum.1): file Bit_Row.cc was added on branch
+ altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.cc (octagons.1): file Bit_Row.cc was added on branch
+ octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh (altnum.1): file Bit_Row.defs.hh was added on
+ branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.defs.hh (octagons.1): file Bit_Row.defs.hh was added
+ on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh (altnum.1): file Bit_Row.inlines.hh was
+ added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.inlines.hh (octagons.1): file Bit_Row.inlines.hh was
+ added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.types.hh (altnum.1): file Bit_Row.types.hh was added
+ on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bit_Row.types.hh (octagons.1): file Bit_Row.types.hh was
+ added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.199), doc/devref.doxyconf-html.in (1.79),
+ doc/devref.doxyconf-latex.in (1.18), src/BD_Shape.defs.hh (1.86),
+ src/BD_Shape.templates.hh (1.46), src/Bit_Matrix.cc (1.1),
+ src/Bit_Matrix.defs.hh (1.1), src/Bit_Matrix.inlines.hh (1.1),
+ src/Bit_Matrix.types.hh (1.1), src/Bit_Row.cc (1.1),
+ src/Bit_Row.defs.hh (1.1), src/Bit_Row.inlines.hh (1.1),
+ src/Bit_Row.types.hh (1.1), src/Linear_System.cc (1.40),
+ src/Linear_System.defs.hh (1.29), src/Linear_System.inlines.hh
+ (1.19), src/Makefile.am (1.163), src/Polyhedron.defs.hh (1.308),
+ src/Polyhedron_chdims.cc (1.40), src/Polyhedron_nonpublic.cc
+ (1.70), src/Polyhedron_public.cc (1.86),
+ src/Polyhedron_widenings.cc (1.56), src/conversion.cc (1.79),
+ src/minimize.cc (1.44), src/simplify.cc (1.46),
+ src/swapping_sort.icc (1.11): Classes Saturation_Row and
+ Saturation_Matrix renamed as Bit_Row and Bit_Matrix,
+ respectively.
+
+2006-10-30 Monday 14:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Saturation_Row.defs.hh (1.12): Added specification for void
+ set_until(unsigned long k);
+
+2006-10-30 Monday 12:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.85), BD_Shape.templates.hh (1.45): The
+ redundancy_dbm private data member of BD_Shape is now implemented
+ by using a Saturation_Matrix (instead of a vector of deques of
+ Booleans).
+
+2006-10-30 Monday 12:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Saturation_Matrix.cc (1.11), Saturation_Matrix.defs.hh
+ (1.11), Saturation_Matrix.inlines.hh (1.7): Added comparison
+ operators for Saturation_Matrix.
+
+2006-10-30 Monday 12:23 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.33): Removed an old FIXME and
+ a provisional implementation of the method
+ external_memory_in_bytes().
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.cc (octagons.1): file FCAIBVP.cc was added on
+ branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.defs.hh (octagons.1): file FCAIBVP.defs.hh was
+ added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.inlines.hh (octagons.1): file FCAIBVP.inlines.hh
+ was added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (octagons.1): file
+ variablesset1.cc was added on branch octagons on 2006-11-18
+ 20:37:00 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.cc (octagons.1): file Variables_Set.cc was
+ added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh (octagons.1): file
+ Variables_Set.defs.hh was added on branch octagons on 2006-11-18
+ 20:36:51 +0000
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.inlines.hh (octagons.1): file
+ Variables_Set.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.8),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.5),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.14),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.13), src/BD_Shape.templates.hh (1.44),
+ src/Grid_Generator_System.cc (1.16), src/Grid_chdims.cc (1.14),
+ src/MIP_Problem.cc (1.37), src/MIP_Problem.defs.hh (1.28),
+ src/Octagonal_Shape.templates.hh (1.32), src/Polyhedron_chdims.cc
+ (1.39), src/Variables_Set.cc (1.2), src/Variables_Set.defs.hh
+ (1.3), src/Variables_Set.inlines.hh (1.3), tests/FCAIBVP.cc
+ (1.2), tests/FCAIBVP.defs.hh (1.3), tests/FCAIBVP.inlines.hh
+ (1.3), tests/Polyhedron/variablesset1.cc (1.8): Variables_Set is
+ now an std::set of variables' indexes (instead of Variable).
+
+2006-10-30 Monday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble (octagons.1):
+ file ppl_interface_generator_c_cc_preamble was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-30 Monday 09:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+ src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+ src/Bounding_Box.inlines.hh, src/Direct_Product.templates.hh,
+ src/Grid.templates.hh, src/Interval.cc, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.types.hh, src/Makefile.am,
+ src/Old_Interval.cc, src/Old_Interval.defs.hh,
+ src/Old_Interval.inlines.hh, src/Old_Interval.types.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh
+ (altnum.[3,3,3,3,3,3,2,7,11,2,23,1,1,1,1,9,3]): Old interval
+ implementation moved out of the way.
+
+2006-10-29 Sunday 22:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.24),
+ ppl_interface_generator_predicate_check_extra_code (1.15): Added
+ generic tests for the binary operators.
+
+2006-10-29 Sunday 20:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS, COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS,
+ README, README.configure, STANDARDS, TODO, compile, config.guess,
+ config.rpath, config.sub, configure.ac, depcomp, install-sh,
+ instchk.hh, ltmain.sh, missing, mkinstalldirs, ppl.lsm.in,
+ ppl.spec.in, Watchdog/.cvsignore, Watchdog/COPYING,
+ Watchdog/CREDITS, Watchdog/ChangeLog,
+ Watchdog/Doubly_Linked_Object.defs.hh,
+ Watchdog/Doubly_Linked_Object.inlines.hh,
+ Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+ Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+ Watchdog/EList_Iterator.defs.hh,
+ Watchdog/EList_Iterator.inlines.hh,
+ Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+ Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+ Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+ Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+ Watchdog/Pending_Element.inlines.hh,
+ Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+ Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+ Watchdog/Pending_List.types.hh, Watchdog/README,
+ Watchdog/Time.cc, Watchdog/Time.defs.hh,
+ Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+ Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+ Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+ Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+ Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+ Watchdog/pwl_header.top, Watchdog/src/.cvsignore,
+ Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+ Watchdog/utils/build_header.in, debian/.cvsignore,
+ debian/Makefile.am, debian/README, debian/changelog,
+ debian/compat, debian/control, debian/libppl-c.dirs,
+ debian/libppl-c.install, debian/libppl-c.links,
+ debian/libppl-dev.dirs, debian/libppl-dev.doc-base,
+ debian/libppl-dev.doc-base.user, debian/libppl-dev.docs,
+ debian/libppl-dev.install, debian/libppl-dev.links,
+ debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+ debian/libppl-pwl.docs, debian/libppl-pwl.install,
+ debian/libppl.copyright.in, debian/libppl.dirs,
+ debian/libppl.docs, debian/libppl.install, debian/rules,
+ demos/Makefile.am, demos/ppl_lcdd/.cvsignore,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/examples/README, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/examples/README,
+ demos/ppl_lpsol/examples/adlittle.mps,
+ demos/ppl_lpsol/examples/blend.mps,
+ demos/ppl_lpsol/examples/boeing1.mps,
+ demos/ppl_lpsol/examples/boeing2.mps,
+ demos/ppl_lpsol/examples/egout.mps,
+ demos/ppl_lpsol/examples/ex11.mps,
+ demos/ppl_lpsol/examples/ex12.mps,
+ demos/ppl_lpsol/examples/kb2.mps,
+ demos/ppl_lpsol/examples/lseu.mps,
+ demos/ppl_lpsol/examples/markshare1.mps,
+ demos/ppl_lpsol/examples/markshare2.mps,
+ demos/ppl_lpsol/examples/mas74.mps,
+ demos/ppl_lpsol/examples/mas76.mps,
+ demos/ppl_lpsol/examples/mip.mps,
+ demos/ppl_lpsol/examples/modglob.mps,
+ demos/ppl_lpsol/examples/noswot.mps,
+ demos/ppl_lpsol/examples/opt1217.mps,
+ demos/ppl_lpsol/examples/p0033.mps,
+ demos/ppl_lpsol/examples/pk1.mps,
+ demos/ppl_lpsol/examples/rout.mps,
+ demos/ppl_lpsol/examples/sc105.mps,
+ demos/ppl_lpsol/examples/sc50a.mps,
+ demos/ppl_lpsol/examples/sc50b.mps,
+ demos/ppl_lpsol/examples/ship08l.mps, doc/.cvsignore,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-c-interface.doxyconf-html.in,
+ doc/devref-c-interface.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in,
+ doc/devref-prolog-interface.doxyconf-html.in,
+ doc/devref-prolog-interface.doxyconf-latex.in,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/devref.tex, doc/fdl.dox, doc/fdl.tex, doc/fdl.txt,
+ doc/gpl.dox, doc/gpl.tex, doc/gpl.txt, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text, doc/ppl.sty, doc/ppl_lcdd.1,
+ doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/prog2man,
+ doc/user-browse.doxyconf-latex.in,
+ doc/user-c-interface.doxyconf-html.in,
+ doc/user-c-interface.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in,
+ doc/user-prolog-interface.doxyconf-html.in,
+ doc/user-prolog-interface.doxyconf-latex.in,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ doc/user.tex, interfaces/Makefile.am,
+ interfaces/ppl_interface_generator_common.m4,
+ interfaces/ppl_interface_generator_common_dat.m4,
+ interfaces/ppl_interface_generator_copyright,
+ interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+ interfaces/C/ppl_interface_generator_c_cc.m4,
+ interfaces/C/ppl_interface_generator_c_cc_code.m4,
+ interfaces/C/ppl_interface_generator_c_cc_preamble,
+ interfaces/C/ppl_interface_generator_c_dat.m4,
+ interfaces/C/ppl_interface_generator_c_h.m4,
+ interfaces/C/ppl_interface_generator_c_h_code.m4,
+ interfaces/C/ppl_interface_generator_c_h_preamble,
+ interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+ interfaces/OCaml/Makefile.am, interfaces/OCaml/ppl_ocaml.cc,
+ interfaces/OCaml/ppl_ocaml.mli, interfaces/OCaml/test1.ml,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_cfli.hh,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/gprolog_cfli.hh,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ interfaces/Prolog/SICStus/.cvsignore,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_cfli.hh,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected2_int16,
+ interfaces/Prolog/XSB/expected2_int16_a,
+ interfaces/Prolog/XSB/expected2_int32,
+ interfaces/Prolog/XSB/expected2_int32_a,
+ interfaces/Prolog/XSB/expected2_int64,
+ interfaces/Prolog/XSB/expected2_int64_a,
+ interfaces/Prolog/XSB/expected2_int8,
+ interfaces/Prolog/XSB/expected2_int8_a,
+ interfaces/Prolog/XSB/expected2_mpz,
+ interfaces/Prolog/XSB/expected2_mpz_a,
+ interfaces/Prolog/XSB/expected3_int16,
+ interfaces/Prolog/XSB/expected3_int16_a,
+ interfaces/Prolog/XSB/expected3_int32,
+ interfaces/Prolog/XSB/expected3_int32_a,
+ interfaces/Prolog/XSB/expected3_int64,
+ interfaces/Prolog/XSB/expected3_int64_a,
+ interfaces/Prolog/XSB/expected3_int8,
+ interfaces/Prolog/XSB/expected3_int8_a,
+ interfaces/Prolog/XSB/expected3_mpz,
+ interfaces/Prolog/XSB/expected3_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/expected_int16,
+ interfaces/Prolog/XSB/expected_int16_a,
+ interfaces/Prolog/XSB/expected_int32,
+ interfaces/Prolog/XSB/expected_int32_a,
+ interfaces/Prolog/XSB/expected_int64,
+ interfaces/Prolog/XSB/expected_int64_a,
+ interfaces/Prolog/XSB/expected_int8,
+ interfaces/Prolog/XSB/expected_int8_a,
+ interfaces/Prolog/XSB/expected_mpz,
+ interfaces/Prolog/XSB/expected_mpz_a,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int64,
+ interfaces/Prolog/XSB/expected_pchk_int64_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/expected_pchk_mpz,
+ interfaces/Prolog/XSB/expected_pchk_mpz_a,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_cfli.hh,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_cfli.hh,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/check_script,
+ interfaces/Prolog/tests/check_script2,
+ interfaces/Prolog/tests/check_script2_int8,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected2_int16,
+ interfaces/Prolog/tests/expected2_int16_a,
+ interfaces/Prolog/tests/expected2_int32,
+ interfaces/Prolog/tests/expected2_int32_a,
+ interfaces/Prolog/tests/expected2_int64,
+ interfaces/Prolog/tests/expected2_int64_a,
+ interfaces/Prolog/tests/expected2_int8,
+ interfaces/Prolog/tests/expected2_int8_a,
+ interfaces/Prolog/tests/expected2_mpz,
+ interfaces/Prolog/tests/expected2_mpz_a,
+ interfaces/Prolog/tests/expected3_int16,
+ interfaces/Prolog/tests/expected3_int16_a,
+ interfaces/Prolog/tests/expected3_int32,
+ interfaces/Prolog/tests/expected3_int32_a,
+ interfaces/Prolog/tests/expected3_int64,
+ interfaces/Prolog/tests/expected3_int64_a,
+ interfaces/Prolog/tests/expected3_int8,
+ interfaces/Prolog/tests/expected3_int8_a,
+ interfaces/Prolog/tests/expected3_mpz,
+ interfaces/Prolog/tests/expected3_mpz_a,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/expected_int16,
+ interfaces/Prolog/tests/expected_int16_a,
+ interfaces/Prolog/tests/expected_int32,
+ interfaces/Prolog/tests/expected_int32_a,
+ interfaces/Prolog/tests/expected_int64,
+ interfaces/Prolog/tests/expected_int64_a,
+ interfaces/Prolog/tests/expected_int8,
+ interfaces/Prolog/tests/expected_int8_a,
+ interfaces/Prolog/tests/expected_mpz,
+ interfaces/Prolog/tests/expected_mpz_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/expected_pchk_mpz,
+ interfaces/Prolog/tests/expected_pchk_mpz_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/pl_grid_check.pl,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+ interfaces/Prolog/tests/script_clpq,
+ interfaces/Prolog/tests/script_clpq2,
+ interfaces/Prolog/tests/script_clpq2_int8, m4/Makefile.am,
+ m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+ m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_flexible_arrays.m4,
+ m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_is_iec_559.m4,
+ m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+ m4/ac_text_md5sum.m4, m4/lib-ld.m4, m4/lib-link.m4,
+ m4/lib-prefix.m4, m4/ppl.m4, src/.cvsignore,
+ src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+ src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+ src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.types.hh, src/Coefficient.cc,
+ src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+ src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence.types.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint.types.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Matrix.types.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/DB_Row.types.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Determinate.types.hh, src/Direct_Product.defs.hh,
+ src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+ src/Direct_Product.types.hh, src/E_NIT.defs.hh,
+ src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+ src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+ src/Extended_Number.defs.hh, src/Extended_Number.inlines.hh,
+ src/Extended_Number.types.hh, src/Float.cc, src/Float.defs.hh,
+ src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator.types.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+ src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid.types.hh, src/Grid_Certificate.cc,
+ src/Grid_Certificate.defs.hh, src/Grid_Certificate.inlines.hh,
+ src/Grid_Certificate.types.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.types.hh, src/Limits.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+ src/Linear_System.cc, src/Linear_System.defs.hh,
+ src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+ src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+ src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+ src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+ src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+ src/Og_Status.inlines.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+ src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/Powerset.templates.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+ src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+ src/Rounding.inlines.hh, src/Rounding.types.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/Row.types.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+ src/distances.inlines.hh, src/distances.types.hh,
+ src/float.types.hh, src/fpu-c99.inlines.hh,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+ src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+ src/minimize.cc, src/mp_numeric_limits.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.bottom, src/ppl_header.hh,
+ src/ppl_header.middle, src/ppl_header.top, src/simplify.cc,
+ src/swapping_sort.icc, src/version.cc, src/version.hh.in,
+ tests/BBox.cc, tests/BBox.hh, tests/FCAIBVP.cc,
+ tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+ tests/FCAIBVP.types.hh, tests/Makefile.am, tests/PFunction.cc,
+ tests/PFunction.hh, tests/Partial_Function.cc,
+ tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh,
+ tests/Partial_Function.types.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+ tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+ tests/ppl_test.cc, tests/ppl_test.hh, tests/print.cc,
+ tests/print.hh, tests/Ask_Tell/.cvsignore,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/.cvsignore, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+ tests/BD_Shape/affineimage3.cc, tests/BD_Shape/affineimage4.cc,
+ tests/BD_Shape/affineimage5.cc, tests/BD_Shape/affineimage6.cc,
+ tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/boundedaffineimage1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc,
+ tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+ tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+ tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+ tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+ tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+ tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+ tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+ tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+ tests/BD_Shape/contains3.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+ tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+ tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/expandspacedim1.cc,
+ tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+ tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+ tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+ tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedCC76extrapolation1.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation1.cc,
+ tests/BD_Shape/limitedCH78extrapolation2.cc,
+ tests/BD_Shape/limitedCH78extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation4.cc,
+ tests/BD_Shape/limitedCH78extrapolation5.cc,
+ tests/BD_Shape/limitedCH78extrapolation6.cc,
+ tests/BD_Shape/limitedCH78extrapolation7.cc,
+ tests/BD_Shape/limitedCH78extrapolation8.cc,
+ tests/BD_Shape/limitedCH78extrapolation9.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/membytes1.cc,
+ tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/polydifference1.cc,
+ tests/BD_Shape/polydifference2.cc,
+ tests/BD_Shape/polydifference3.cc,
+ tests/BD_Shape/polydifference4.cc,
+ tests/BD_Shape/polydifference5.cc,
+ tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+ tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+ tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+ tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+ tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdiffs1.cc, tests/BD_Shape/writebdiffs2.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/Grid/.cvsignore,
+ tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+ tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+ tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+ tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+ tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+ tests/Grid/containsintegerpoint1.cc,
+ tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+ tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+ tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+ tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+ tests/MIP_Problem/ascii_dump_load1.cc,
+ tests/MIP_Problem/exceptions1.cc,
+ tests/MIP_Problem/mipproblem1.cc,
+ tests/Octagonal_Shape/.cvsignore,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/boundedaffineimage1.cc,
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/discrete1.cc,
+ tests/Octagonal_Shape/disjoint1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/expandspacedim1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/maxspacedim.cc,
+ tests/Octagonal_Shape/membytes1.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/Polyhedron/.cvsignore, tests/Polyhedron/CbecomesNNC1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+ tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/containsintegerpoint1.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc,
+ tests/Polyhedron/nncminimize1.cc,
+ tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+ tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+ tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+ tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+ tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+ tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+ tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+ tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+ tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+ tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+ tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+ tests/Polyhedron/universe7.cc,
+ tests/Polyhedron/valgrind_suppressions,
+ tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/.cvsignore,
+ utils/Makefile.am, utils/build_header.in, utils/text2cxxarray.in,
+ utils/timings.cc, utils/timings.hh
+ (altnum.[2,1,6,3,2,5,8,4,4,4,8,3,5,2,4,19,2,5,2,3,2,1,3,3,1,1,1,3,2,2,2,2,2,2,2,3,2,3,2,2,2,6,3,2,2,2,2,2,2,2,2,3,2,2,2,2,3,3,2,1,3,5,4,4,2,5,3,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1,7,11,3,3,5,3,2,3,3,3,3,2,2,3,3,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,4,2,8,6,2,2,6,2,2,6,2,4,1,2,2,1,1,2,2,2,4,2,2,2,2,2,4,2,2,4,2,2,4,2,4,3,2,2,2,2,9,6,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,8,3,2,2,2,2,2, [...]
+ Eighth merge from the main trunk.
+
+2006-10-28 Saturday 10:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.23),
+ ppl_interface_generator_predicate_check_extra_code (1.14): Added
+ generic tests for adding a representation or elements of a
+ representation (with and without minimize).
+
+2006-10-28 Saturday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (altnum.1): file ppl_interface_generator_predicate_check_code.m4
+ was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-28 Saturday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (altnum.1): file
+ ppl_interface_generator_predicate_check_extra_code was added on
+ branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/Makefile.am (altnum.1): file Makefile.am
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffineimage1.cc (altnum.1): file
+ boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/boundedaffinepreimage1.cc (altnum.1): file
+ boundedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/disjoint1.cc (altnum.1): file disjoint1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/disjoint1.cc (octagons.1): file
+ disjoint1.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/expandspacedim1.cc (altnum.1): file
+ expandspacedim1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (altnum.1): file
+ relatwithcons2.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (octagons.1): file
+ relatwithcons2.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-27 Friday 17:42 quartieri
+
+ * src/Octagonal_Shape.defs.hh (1.14),
+ src/Octagonal_Shape.templates.hh (1.31),
+ tests/Octagonal_Shape/Makefile.am (1.9),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.6),
+ tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.1),
+ tests/Octagonal_Shape/disjoint1.cc (1.5),
+ tests/Octagonal_Shape/expandspacedim1.cc (1.1),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.3): Corrected a bug in
+ the method relation_with(). Added some tests on the methods
+ relation_with() and is_disjoint_from(). Defined the methods
+ bounded_affine_preimage() and expand_space_dimension() and added
+ some tests on them.
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (altnum.1): file
+ Octagonal_Shape.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-10-27 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (altnum.1): file
+ Octagonal_Shape.templates.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-10-27 Friday 16:00 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.53), membytes1.cc (1.1): Added
+ new tests on on the methods external_memoty_in_bytes() and
+ total_memory_in_bytes().
+
+2006-10-27 Friday 16:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/membytes1.cc (altnum.1): file membytes1.cc was
+ added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-27 Friday 16:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/membytes1.cc (octagons.1): file membytes1.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-27 Friday 12:41 Elena Mazzi
+
+ * tests/BD_Shape/relations3.cc (1.18): Added some new tests on
+ BD_Shape::relation_with(Constraint).
+
+2006-10-27 Friday 12:40 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.43): Corrected a bug in
+ BD_Shape::relation_with(const Constraint& c) when the constraint
+ is an equality and is disjoint from BDS.
+
+2006-10-27 Friday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (altnum.1): file BD_Shape.templates.hh
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-27 Friday 11:41 quartieri
+
+ * tests/Octagonal_Shape/membytes1.cc (1.2): Removed an annotation
+ indicating an expected failure with 8 bits coefficients.
+
+2006-10-27 Friday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/membytes1.cc (altnum.1): file membytes1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/membytes1.cc (octagons.1): file
+ membytes1.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-10-27 Friday 10:55 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.42): Corrected a bug in
+ BD_Shape::is_disjoint_from() when the two BD_Shapes consist of
+ single but different points in 1D.
+
+2006-10-27 Friday 10:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.22),
+ ppl_interface_generator_predicate_check_extra_code (1.13),
+ ppl_interface_generator_predicate_check_pl.m4 (1.18): Added tests
+ for comparing the class objects.
+
+ General improvements to the test system including:
+
+ Changing the test_data identifiers to be "test0n". Using a list
+ to give all the required tests and the member predicate to select
+ the tests. Generating code for building the test object for any
+ given test id and use this instead of coding it in the actual
+ tests. The space_dimension and affine_dimension are now defined
+ by an auxiliary predicate for each test id.
+
+2006-10-27 Friday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (altnum.1): file ppl_interface_generator_predicate_check_pl.m4
+ was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-26 Thursday 22:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/disjoint1.cc (1.4): Added test07 which shows a bug
+ when the two BD_Shapes consist of single but different points in
+ 1D.
+
+2006-10-26 Thursday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/disjoint1.cc (altnum.1): file disjoint1.cc was
+ added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-26 Thursday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/disjoint1.cc (octagons.1): file disjoint1.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-26 Thursday 17:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/relations3.cc (1.17): Added a test showing a bug
+ in the relation_with() method. Test04 fails as the relation
+ returned is "strictly_intersects" and not, as expected,
+ "is_disjoint".
+
+2006-10-26 Thursday 15:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.21),
+ ppl_interface_generator_predicate_check_extra_code (1.12): Added
+ generic tests for maximize, minimize, maximize_with_point and
+ minimize_with_point.
+
+2006-10-26 Thursday 11:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.69): Corrected a bug in method
+ max_min() whereby an assertion was failing when maximizing or
+ minimizing an expression on a zero-dimensional polyhedron.
+
+2006-10-26 Thursday 11:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/max_min1.cc (1.10): Test 03 causes an assertion
+ failure for the universe polyhedron with 0 dimensions.
+
+2006-10-25 Wednesday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/foldspacedims1.cc (altnum.1): file
+ foldspacedims1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-25 Wednesday 15:58 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.52), expandspacedim1.cc (1.1),
+ foldspacedims1.cc (1.1): Added new tests on methods: -
+ BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+ m); - BD_Shape<T>::fold_space_dimensions(Variables_Set&
+ to_be_folded, Variable var).
+
+2006-10-25 Wednesday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/expandspacedim1.cc (altnum.1): file
+ expandspacedim1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-25 Wednesday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/expandspacedim1.cc (octagons.1): file
+ expandspacedim1.cc was added on branch octagons on 2006-11-18
+ 20:36:56 +0000
+
+2006-10-25 Wednesday 15:55 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.84), BD_Shape.templates.hh (1.41):
+ Defined two new methods:
+ BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+ m); BD_Shape<T>::fold_space_dimensions(Variables_Set&
+ to_be_folded, Variable var).
+
+2006-10-25 Wednesday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (1.6): Avoided a couple of
+ copies.
+
+2006-10-25 Wednesday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (altnum.1): file
+ Pointset_Powerset.templates.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-10-25 Wednesday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (octagons.1): file
+ Pointset_Powerset.templates.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-10-25 Wednesday 13:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.6): Uncommented code that was
+ temporarily disabled due to missing method in some pointset
+ classes.
+
+2006-10-25 Wednesday 13:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (altnum.1): file Any_Pointset.defs.hh
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-25 Wednesday 11:09 quartieri
+
+ * tests/Octagonal_Shape/Makefile.am (1.8): Added the test
+ membytes1.cc.
+
+2006-10-25 Wednesday 09:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.14):
+ The Prolog predicate for BD_Shape_..._bounded_affine_image must
+ not be built.
+
+2006-10-25 Wednesday 09:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+ (altnum.1): file ppl_interface_generator_prolog_dat.m4 was added
+ on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 18:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.9),
+ C/ppl_interface_generator_c_dat.m4 (1.8),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.13),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.13),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.20),
+ Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (1.11): In the ppl/interfaces:
+
+ The @BOX@ replacement is now only used for building from a box
+ (bounding_box or covering_box).
+
+ The "get" or "shrink" bounding_box or covering_box" procedures,
+ do not use any pattern. As the Grid has the same aruments as the
+ Polyhedron for shrink_bounding_box, we can combine all the
+ classes for this procedure into one schema. On the other hand,
+ although the covering box is only available at present for the
+ Grid domain, it is provided as a generic schema.
+
+ The property "is_topologically_closed" is now enabled for
+ BD_Shape and Octagons Prolog interfaces. Similarly the
+ "topological_closure_assign" procedure is now enabled for
+ BD_Shape and Octagons Prolog interfaces.
+
+ Generic tests for all the properties using schema
+ ppl_ at CLASS@_ at HAS_PROPERTY@ have been added. Generic tests for
+ ppl_ at CLASS@_ at SIMPLIFY@ have been added (for the domains under
+ consideration, this is just the ."topological_closure_assign"
+ procedure).
+
+ The test data for the generic tests has again been reorganised
+ and restructured making it easier to extend and maintain.
+
+2006-10-24 Tuesday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (altnum.1): file
+ ppl_interface_generator_c_dat.m4 was added on branch altnum on
+ 2006-10-29 19:26:58 +0000
+
+2006-10-24 Tuesday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (altnum.1): file
+ ppl_interface_generator_common_dat.m4 was added on branch altnum
+ on 2006-10-29 19:26:57 +0000
+
+2006-10-24 Tuesday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (altnum.1): file ppl_interface_generator_prolog_icc_code.m4 was
+ added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 17:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.36), src/Grid.templates.hh (1.22),
+ tests/Grid/boundingbox1.cc (1.13), tests/Grid/boundingbox2.cc
+ (1.11): In ppl/src:
+
+ The grid can now be built from boxes which may have different
+ finite values for the upper and lower bounds or have only the
+ upper or the lower bound bounded or have open finite bounds.
+ Before when this happened an exception was thrown. Now we compute
+ an approximation.
+
+ Also, now the Grid domain requires the complexity as an argument
+ for shrink_bounding_box so as to be compatible with the
+ Polyhedron_shrink_bounding_box. This argument is not used.
+
+ The tests/Grid/boundingbox1.cc and tests/Grid/boundingbox2.cc
+ have been revised to match.
+
+2006-10-24 Tuesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh (altnum.1): file Grid.defs.hh was added on
+ branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-24 Tuesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh (altnum.1): file Grid.templates.hh was
+ added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-24 Tuesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundingbox1.cc (altnum.1): file boundingbox1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundingbox2.cc (altnum.1): file boundingbox2.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.19): Recursively process the Java
+ directory.
+
+2006-10-24 Tuesday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/.cvsignore (altnum.1): file .cvsignore was added
+ on branch altnum on 2006-10-29 19:26:59 +0000
+
+2006-10-24 Tuesday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/.cvsignore (octagons.1): file .cvsignore was
+ added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-24 Tuesday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/.cvsignore (simplex.1): file .cvsignore was added
+ on branch simplex on 2008-01-07 11:15:28 +0000
+
+2006-10-24 Tuesday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Makefile.am (altnum.1): file Makefile.am was
+ added on branch altnum on 2006-10-29 19:26:59 +0000
+
+2006-10-24 Tuesday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.244), interfaces/Java/.cvsignore (1.1),
+ interfaces/Java/Makefile.am (1.1): Java directories activated.
+
+2006-10-24 Tuesday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/: Coefficient.java (1.3), Variable.java (1.3):
+ Moved into the package's directory.
+
+2006-10-24 Tuesday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Coefficient.java (1.2): Comments and identifiers
+ names revised.
+
+2006-10-24 Tuesday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Variable.java (1.2): Cosmetic changes.
+
+2006-10-24 Tuesday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Variable.java (1.1): Coefficient Java class
+ declaration and implementation.
+
+2006-10-24 Tuesday 16:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Java/Coefficient.java (1.1): Coefficient Java class
+ declaration and implementation.
+
+2006-10-23 Monday 14:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh (1.4): Added FIXMEs to remember
+ when the generalization to Powerset's of arbitrary stuff is going
+ to be buggy.
+
+2006-10-23 Monday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh (altnum.1): file
+ Pointset_Powerset.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh (octagons.1): file
+ Pointset_Powerset.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-10-23 Monday 11:52 quartieri
+
+ * tests/Octagonal_Shape/membytes1.cc (1.1): Added some tests on the
+ methods external_memoty_in_bytes() and
+ total_memory_in_bytes().
+
+2006-10-23 Monday 11:51 quartieri
+
+ * src/: OR_Matrix.defs.hh (1.6), OR_Matrix.inlines.hh (1.3),
+ OR_Matrix.templates.hh (1.4), Octagonal_Shape.templates.hh
+ (1.30): Defined the methods external_memory_in_bytes() and
+ total_memory_in_bytes().
+
+2006-10-23 Monday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (altnum.1): file OR_Matrix.defs.hh was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (altnum.1): file OR_Matrix.inlines.hh
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.templates.hh (altnum.1): file
+ OR_Matrix.templates.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-10-23 Monday 10:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Pointset_Powerset.defs.hh (1.5),
+ Pointset_Powerset.inlines.hh (1.3),
+ Pointset_Powerset.templates.hh (1.5): No longer defining the
+ specialized constructor: Pointset_Powerset<C_Polyhedron>(const
+ Pointset_Powerset<QH>&); defining the generic constructor
+ Pointset_Powerset<PH>(const Pointset_Powerset<QH>&); instead.
+ Similarly, generalized the specialized method:
+ poly_difference_assign<C_Polyhedron>(...) to (temporarily) work
+ on arbitrary instances.
+
+2006-10-23 Monday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (altnum.1): file
+ Pointset_Powerset.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 09:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.83), Octagonal_Shape.defs.hh (1.13):
+ Unary constructors made explicit so as to avoid unexpected
+ conversions.
+
+2006-10-23 Monday 08:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.40), Grid_public.cc (1.46),
+ Octagonal_Shape.templates.hh (1.29), Polyhedron_public.cc (1.85):
+ Prefer "existential quantification" to "cylindrification" in
+ comments.
+
+2006-10-23 Monday 08:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (altnum.1): file Grid_public.cc was added on
+ branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-22 Sunday 02:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.45): Make sure XSB finds
+ libppl and libpwl in the current build tree.
+
+2006-10-21 Saturday 23:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.12),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.19),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.17): Added
+ tests for get_bounding_box and get_covering_box.
+
+ Removed unnecessary code and simplified the code in
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+ Added the arity of the predicate under test to the test name.
+
+ In Prolog/ppl_interface_generator_prolog_dat.m4 : now allow the
+ interface code to be generated for get_bounding_box/3 for
+ BD_Shape.
+
+2006-10-21 Saturday 13:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.45): Indentation fixed. Redundant
+ parentheses avoided.
+
+2006-10-21 Saturday 13:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.44): Fixed spelling error introduced with
+ last commit.
+
+2006-10-21 Saturday 12:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.11),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.18),
+ tests/ppl_interface_generator_predicate_check_extra_code (1.10),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.16): In
+ ...prolog_dat.m4, moved the delete predicate schema first This is
+ a work-around to a problem in generating a list of predicates in
+ m4.
+
+ In the Prolog/tests m4 files, a number of bugs fixed and added a
+ test for the relation_with predicates.
+
+2006-10-21 Saturday 10:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.43): Corrected error indicated in the
+ previous commit for tests/Grid/relations.cc.
+
+2006-10-21 Saturday 10:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/relations2.cc (1.14): Test 20 shows a bug in the code
+ for PPL::Grid::relation_with(const Congruence& cg)
+
+2006-10-21 Saturday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations2.cc (altnum.1): file relations2.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-19 Thursday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: boundedaffineimage1.cc (1.5),
+ generalizedaffineimage3.cc (1.6), generalizedaffinepreimage2.cc
+ (1.6): Several wicked whiches replaced by thats.
+
+2006-10-19 Thursday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage3.cc (altnum.1): file
+ generalizedaffineimage3.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage3.cc (octagons.1):
+ file generalizedaffineimage3.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-10-19 Thursday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage2.cc (altnum.1):
+ file generalizedaffinepreimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage2.cc (octagons.1):
+ file generalizedaffinepreimage2.cc was added on branch octagons
+ on 2006-11-18 20:36:59 +0000
+
+2006-10-18 Wednesday 17:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.17),
+ ppl_interface_generator_predicate_check_extra_code (1.9): Further
+ additions and reorganisation of test data. Added tests for
+ get_ at GET_REPRESENT@ and get_minimized_ at GET_REPRESENT@ predicates.
+
+2006-10-18 Wednesday 11:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.8),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.16),
+ Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (1.8): Improved organisation of test data. Use "alt_replacement"
+ to get an alternative build representation. Added test data 3
+ for some tests. Other minor improvements.
+
+2006-10-17 Tuesday 20:56 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.36), MIP_Problem.templates.hh (1.9): Be
+ more verbose when throwing exceptions. Indentation fixed.
+
+2006-10-17 Tuesday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (altnum.1): file MIP_Problem.cc was added on
+ branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-17 Tuesday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh (altnum.1): file
+ MIP_Problem.templates.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-10-17 Tuesday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh (octagons.1): file
+ MIP_Problem.templates.hh was added on branch octagons on
+ 2006-11-18 20:36:50 +0000
+
+2006-10-17 Tuesday 15:37 quartieri
+
+ * tests/Octagonal_Shape/: boundedaffineimage1.cc (1.4),
+ generalizedaffineimage3.cc (1.5), generalizedaffinepreimage2.cc
+ (1.5): Improved some comments.
+
+2006-10-17 Tuesday 14:05 quartieri
+
+ * tests/Octagonal_Shape/: boundedaffineimage1.cc (1.3),
+ generalizedaffineimage3.cc (1.4), generalizedaffinepreimage2.cc
+ (1.4): Corrected some inaccurate comments.
+
+2006-10-17 Tuesday 11:26 Elena Mazzi
+
+ * tests/Octagonal_Shape/: affineimage1.cc (1.2), affinepreimage1.cc
+ (1.2), bhmz05widening1.cc (1.2), boundedaffineimage1.cc (1.2),
+ cc76extrapolation1.cc (1.2), cc76narrowing1.cc (1.2),
+ disjoint1.cc (1.4), generalizedaffineimage3.cc (1.3),
+ generalizedaffinepreimage2.cc (1.3),
+ generalizedaffinepreimage3.cc (1.2), intersection1.cc (1.2),
+ limitedbhmz05extrapolation1.cc (1.2),
+ limitedcc76extrapolation1.cc (1.2), octdifference1.cc (1.2),
+ octhull1.cc (1.2), relatwithcons2.cc (1.2), relatwithgen1.cc
+ (1.2), removespacedims1.cc (1.2), timeelapse1.cc (1.2): Fixed
+ lots of spelling mistakes in many tests.
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc (altnum.1): file
+ affineimage1.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc (octagons.1): file
+ affineimage1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage1.cc (altnum.1): file
+ affinepreimage1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage1.cc (octagons.1): file
+ affinepreimage1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhmz05widening1.cc (altnum.1): file
+ bhmz05widening1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhmz05widening1.cc (octagons.1): file
+ bhmz05widening1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76extrapolation1.cc (altnum.1): file
+ cc76extrapolation1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76extrapolation1.cc (octagons.1): file
+ cc76extrapolation1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76narrowing1.cc (altnum.1): file
+ cc76narrowing1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76narrowing1.cc (octagons.1): file
+ cc76narrowing1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage3.cc (altnum.1):
+ file generalizedaffinepreimage3.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage3.cc (octagons.1):
+ file generalizedaffinepreimage3.cc was added on branch octagons
+ on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/intersection1.cc (altnum.1): file
+ intersection1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/intersection1.cc (octagons.1): file
+ intersection1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (altnum.1):
+ file limitedbhmz05extrapolation1.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+ (octagons.1): file limitedbhmz05extrapolation1.cc was added on
+ branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedcc76extrapolation1.cc (altnum.1):
+ file limitedcc76extrapolation1.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedcc76extrapolation1.cc (octagons.1):
+ file limitedcc76extrapolation1.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octdifference1.cc (altnum.1): file
+ octdifference1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octdifference1.cc (octagons.1): file
+ octdifference1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octhull1.cc (altnum.1): file octhull1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octhull1.cc (octagons.1): file octhull1.cc
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithgen1.cc (altnum.1): file
+ relatwithgen1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithgen1.cc (octagons.1): file
+ relatwithgen1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/removespacedims1.cc (altnum.1): file
+ removespacedims1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/removespacedims1.cc (octagons.1): file
+ removespacedims1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/timeelapse1.cc (altnum.1): file
+ timeelapse1.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-10-17 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/timeelapse1.cc (octagons.1): file
+ timeelapse1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 10:52 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (1.28): Corrected a bug in
+ strong_reduction_assign().
+
+2006-10-17 Tuesday 10:52 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.39): Corrected a bug in
+ shortest_path_reduction_assign().
+
+2006-10-17 Tuesday 10:40 Elena Mazzi
+
+ * tests/Octagonal_Shape/minconstraints1.cc (1.2): Test 3 shows a
+ bug in minimized_constraints() when the Octagonal Shape is
+ zero-dimensional and universe.
+
+2006-10-17 Tuesday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/minconstraints1.cc (altnum.1): file
+ minconstraints1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-17 Tuesday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/minconstraints1.cc (octagons.1): file
+ minconstraints1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-17 Tuesday 10:38 Elena Mazzi
+
+ * tests/BD_Shape/minconstraints1.cc (1.9): Test 2 shows a bug in
+ minimized_constraints() when the BD_Shape is zero-dimensional and
+ universe.
+
+2006-10-17 Tuesday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/minconstraints1.cc (altnum.1): file
+ minconstraints1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Elena Mazzi
+
+ * tests/BD_Shape/: addconstraints1.cc (1.16), affineimage1.cc
+ (1.16), affinepreimage1.cc (1.17), bdsdifference1.cc (1.12),
+ bdshull1.cc (1.13), bhmz05widening1.cc (1.12),
+ boundedaffineimage1.cc (1.2), cc76extrapolation1.cc (1.16),
+ cc76narrowing1.cc (1.16), disjoint1.cc (1.3),
+ generalizedaffineimage2.cc (1.18), generalizedaffinepreimage3.cc
+ (1.3), intersection1.cc (1.16), limitedbhmz05extrapolation1.cc
+ (1.11), limitedcc76extrapolation1.cc (1.12), relations2.cc
+ (1.19), relations3.cc (1.16), removespacedims1.cc (1.17),
+ timeelapse1.cc (1.16): Fixed lots of spelling mistakes in many
+ tests.
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference1.cc (altnum.1): file
+ bdsdifference1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdshull1.cc (altnum.1): file bdshull1.cc was added
+ on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening1.cc (altnum.1): file
+ bhmz05widening1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffineimage1.cc (altnum.1): file
+ boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/boundedaffineimage1.cc (octagons.1): file
+ boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+ 20:36:56 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage3.cc (altnum.1): file
+ generalizedaffinepreimage3.cc was added on branch altnum on
+ 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage3.cc (octagons.1): file
+ generalizedaffinepreimage3.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation1.cc (altnum.1): file
+ limitedbhmz05extrapolation1.cc was added on branch altnum on
+ 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/limitedcc76extrapolation1.cc (altnum.1): file
+ limitedcc76extrapolation1.cc was added on branch altnum on
+ 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 09:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.15),
+ ppl_interface_generator_predicate_check_extra_code (1.7),
+ ppl_interface_generator_predicate_check_pl.m4 (1.15): Error in
+ the swap code corrected.
+
+ Tests for space_dimension and affine_dimension added.
+
+ Now, for check_noisy, a list of all successful tests is output.
+ For check_all and check_noisy, a list of all failed tests is
+ output. For check_noisy, the constraint and generator (or
+ similar) systems of the failing object are output.
+
+2006-10-16 Monday 15:10 quartieri
+
+ * src/Octagonal_Shape.defs.hh (1.12),
+ src/Octagonal_Shape.inlines.hh (1.10),
+ src/Octagonal_Shape.templates.hh (1.27),
+ tests/Octagonal_Shape/Makefile.am (1.7),
+ tests/Octagonal_Shape/boundedaffineimage1.cc (1.1): Defined the
+ method Octagonal_Shape<T>::bounded_affine_image()
+ and added some tests on it.
+
+2006-10-16 Monday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh (altnum.1): file
+ Octagonal_Shape.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-10-16 Monday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.200): The entry for LP_Problem rewritten so as to
+ introduce the generalization to MIP_Problem.
+
+2006-10-16 Monday 15:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.199): We no longer have class LP_Problem: the TODO items
+ now refer to MIP_Problem.
+
+2006-10-16 Monday 15:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc (1.37), LP_Problem.defs.hh (1.27),
+ LP_Problem.inlines.hh (1.12), LP_Problem.templates.hh (1.2),
+ LP_Problem.types.hh (1.6), Makefile.am (1.162): No longer build
+ LP_Problem; corresponding source files removed.
+
+2006-10-16 Monday 14:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.243), tests/Makefile.am (1.259): Do perform tests
+ for class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/MIP_Problem/: .cvsignore (1.1), Makefile.am (1.1),
+ ascii_dump_load1.cc (1.1), exceptions1.cc (1.1), mipproblem1.cc
+ (1.1): Put under CVS control.
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/.cvsignore (altnum.1): file .cvsignore was
+ added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/.cvsignore (octagons.1): file .cvsignore was
+ added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/.cvsignore (simplex.1): file .cvsignore was
+ added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am (altnum.1): file Makefile.am was
+ added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/Makefile.am (octagons.1): file Makefile.am was
+ added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/ascii_dump_load1.cc (altnum.1): file
+ ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+ 19:27:30 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/ascii_dump_load1.cc (octagons.1): file
+ ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+ 20:36:58 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/exceptions1.cc (altnum.1): file exceptions1.cc
+ was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/exceptions1.cc (octagons.1): file
+ exceptions1.cc was added on branch octagons on 2006-11-18
+ 20:36:58 +0000
+
+2006-10-16 Monday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/MIP_Problem/mipproblem1.cc (altnum.1): file mipproblem1.cc
+ was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.65): Correct the name of a
+ constructor for MIP_Problem.
+
+2006-10-16 Monday 14:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c_version.h.in (1.3),
+ ppl_interface_generator_c_cc_preamble (1.4),
+ ppl_interface_generator_c_h_preamble (1.5): Interface class
+ MIP_Problem, not LP_Problem. Constructor
+ new_MIP_Problem_from_dimension() renamed as
+ new_MIP_Problem_from_space_dimension() for consistency. Started
+ reorganizing the documentation of the C interface.
+
+2006-10-16 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (altnum.1): file
+ ppl_c_version.h.in was added on branch altnum on 2006-10-29
+ 19:26:58 +0000
+
+2006-10-16 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (octagons.1): file
+ ppl_c_version.h.in was added on branch octagons on 2006-11-18
+ 20:36:44 +0000
+
+2006-10-16 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.1):
+ file ppl_interface_generator_c_cc_preamble was added on branch
+ altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (altnum.1):
+ file ppl_interface_generator_c_h_preamble was added on branch
+ altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (octagons.1):
+ file ppl_interface_generator_c_h_preamble was added on branch
+ octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-16 Monday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (altnum.1): file
+ pl_grid_check.pl was added on branch altnum on 2006-10-29
+ 19:27:09 +0000
+
+2006-10-16 Monday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_grid_check.pl (octagons.1): file
+ pl_grid_check.pl was added on branch octagons on 2006-11-18
+ 20:36:49 +0000
+
+2006-10-16 Monday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.157),
+ ppl_interface_generator_prolog_dat.m4 (1.10),
+ ppl_interface_generator_prolog_icc_preamble (1.12),
+ Ciao/ciao_pl_check.pl (1.24), XSB/xsb_pl_check.P (1.28),
+ tests/pl_check.pl (1.38), tests/pl_grid_check.pl (1.3): Interface
+ class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (altnum.1): file ppl_interface_generator_prolog_icc_preamble was
+ added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 14:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/README (1.3): Minor improvements and
+ corrections to links.
+
+2006-10-16 Monday 14:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/README (altnum.1): file README was added
+ on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-16 Monday 14:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.78), devref.doxyconf-latex.in
+ (1.17): Generate documentation of MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-latex.in (altnum.1): file
+ devref.doxyconf-latex.in was added on branch altnum on 2006-10-29
+ 19:26:56 +0000
+
+2006-10-16 Monday 14:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid.templates.hh (1.21): Do silence an annoying compiler
+ warning.
+
+2006-10-16 Monday 14:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.templates.hh (1.4), Polyhedron_nonpublic.cc
+ (1.68): Use MIP_Problem instead of LP_Problem.
+
+2006-10-16 Monday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (altnum.1): file
+ Polyhedron.templates.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-10-16 Monday 14:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.134): Removed useless inclusion.
+
+2006-10-16 Monday 14:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.38): Corrected a bug in
+ affine_dimension(). Do use class MIP_Problem instead of
+ LP_Problem.
+
+2006-10-16 Monday 14:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.26): Correct a bug in
+ affine_dimension(). Do use class MIP_Problem instead of
+ LP_Problem.
+
+2006-10-16 Monday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinedimension1.cc (altnum.1): file
+ affinedimension1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-10-16 Monday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinedimension1.cc (octagons.1): file
+ affinedimension1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-10-16 Monday 14:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/affinedimension1.cc (1.10),
+ Octagonal_Shape/affinedimension1.cc (1.2): A bug in
+ affine_dimension() is affecting both BD_Shape and
+ Octagonal_Shape. The bug causes an assertion to be violated when
+ the shape is zero-dimensional and universe.
+
+2006-10-16 Monday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affinedimension1.cc (altnum.1): file
+ affinedimension1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-10-16 Monday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.7): Invocations of Coefficient
+ constructors fixed.
+
+2006-10-16 Monday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (altnum.1): file ppl_ocaml.cc was
+ added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (octagons.1): file ppl_ocaml.cc was
+ added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-16 Monday 09:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/affinedimension1.cc (1.9): Test 11 shows a bug in
+ affine_dimension() when the BD_Shape object is constructed from
+ an empty constraint system.
+
+2006-10-13 Friday 15:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.14),
+ ppl_interface_generator_predicate_check_extra_code (1.6),
+ ppl_interface_generator_predicate_check_pl.m4 (1.14): Added code
+ for producing noisy output when tests fail.
+
+2006-10-13 Friday 11:56 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.51), boundedaffineimage1.cc
+ (1.1): Added new tests on the method
+ BD_Shape::bounded_affine_image().
+
+2006-10-13 Friday 11:53 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.82), BD_Shape.templates.hh (1.37):
+ Defined the new method: BD_Shape<T>::bounded_affine_image(var,
+ lb_expr, ub_expr, den).
+
+2006-10-13 Friday 09:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.13): Cut_and_paste error fixed.
+
+2006-10-13 Friday 09:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.12),
+ ppl_interface_generator_predicate_check_extra_code (1.5): Added
+ tests and test data for strict constraints and closure points for
+ NNC polyhedra. Extended test for building a bounding/covering
+ box.
+
+2006-10-12 Thursday 22:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.11),
+ ppl_interface_generator_predicate_check_extra_code (1.4),
+ ppl_interface_generator_predicate_check_pl.m4 (1.13): More
+ improvements to the test framework and added generic tests for
+ new_ at CLASS@_from_ at BOX@ and the swap procedure.
+
+2006-10-11 Wednesday 18:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.10),
+ ppl_interface_generator_predicate_check_pl.m4 (1.12): Added some
+ code for future use and development of the test code...
+
+2006-10-11 Wednesday 16:38 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.35): Removed a spurious line to allow
+ compiling if the heuristic is disabled.
+
+2006-10-11 Wednesday 14:13 Andrea Cimino
+
+ * demos/ppl_lpsol/: Makefile.am (1.36), expected_int16 (1.9),
+ expected_int16_a (1.9), expected_int32 (1.10), expected_int32_a
+ (1.10), expected_int64 (1.10), expected_int64_a (1.10),
+ expected_int8 (1.9), expected_int8_a (1.8), expected_mpz (1.11),
+ expected_mpz_a (1.11): Regenerated all the expected_* reflecting
+ the new changes in Makefile.am.
+
+2006-10-11 Wednesday 10:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.18): OCaml subdirectory enabled.
+
+2006-10-10 Tuesday 19:32 Andrea Cimino
+
+ * demos/ppl_lpsol/Makefile.am (1.35): Keep problems sorted.
+
+2006-10-10 Tuesday 19:30 Andrea Cimino
+
+ * demos/ppl_lpsol/: Makefile.am (1.34), examples/ex11.mps (1.3),
+ examples/ex12.mps (1.1): Renamed ex11.mps as ex12.mps and
+ restored the old ex11.mps. Modified Makefile.am to skip ex12.mps
+ checking.
+
+2006-10-10 Tuesday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex11.mps (altnum.1): file ex11.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex11.mps (octagons.1): file ex11.mps was
+ added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex12.mps (altnum.1): file ex12.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex12.mps (octagons.1): file ex12.mps was
+ added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ex12.mps (simplex.1): file ex12.mps was
+ added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 19:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/congruence1.cc (1.15),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.11): No longer rely on an operator recently removed.
+
+2006-10-10 Tuesday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruence1.cc (altnum.1): file congruence1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-10 Tuesday 19:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.defs.hh (1.16), Congruence.inlines.hh (1.13):
+ Removed operator building a Congruence object from a Coefficient
+ and a Linear_Expression (in that order) as it was clashing with a
+ template member of class Checked_Number.
+
+2006-10-10 Tuesday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.defs.hh (altnum.1): file Congruence.defs.hh was
+ added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.inlines.hh (altnum.1): file Congruence.inlines.hh
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.defs.hh (1.33): Removed redundant
+ declarations (with repeated documentation).
+
+2006-10-10 Tuesday 18:59 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.64): Typo fixed.
+
+2006-10-10 Tuesday 18:54 Andrea Cimino
+
+ * demos/ppl_lpsol/examples/ex11.mps (1.2): Modified for testing
+ purposes.
+
+2006-10-10 Tuesday 17:25 Andrea Cimino
+
+ * demos/ppl_lpsol/: Makefile.am (1.33), expected_int16 (1.8),
+ expected_int16_a (1.8), expected_int32 (1.9), expected_int32_a
+ (1.9), expected_int64 (1.9), expected_int64_a (1.9),
+ expected_int8 (1.8), expected_int8_a (1.7), expected_mpz (1.10),
+ expected_mpz_a (1.10), examples/README (1.2), examples/egout.mps
+ (1.1), examples/ex11.mps (1.1), examples/lseu.mps (1.1),
+ examples/markshare1.mps (1.1), examples/markshare2.mps (1.1),
+ examples/mas74.mps (1.1), examples/mas76.mps (1.1),
+ examples/modglob.mps (1.1), examples/noswot.mps (1.1),
+ examples/opt1217.mps (1.1), examples/p0033.mps (1.1),
+ examples/pk1.mps (1.1), examples/rout.mps (1.1): Added new test
+ for ppl_lpsol: now ppl_lsol checks satisfiability and optimality
+ of some MIP Problems. Added other .mps files to the testsuite.
+ README and obtained_* updated.
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/egout.mps (altnum.1): file egout.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/egout.mps (octagons.1): file egout.mps
+ was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/egout.mps (simplex.1): file egout.mps
+ was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/lseu.mps (altnum.1): file lseu.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/lseu.mps (octagons.1): file lseu.mps was
+ added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/lseu.mps (simplex.1): file lseu.mps was
+ added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare1.mps (altnum.1): file
+ markshare1.mps was added on branch altnum on 2006-10-29 19:26:55
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare1.mps (octagons.1): file
+ markshare1.mps was added on branch octagons on 2006-11-18
+ 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare1.mps (simplex.1): file
+ markshare1.mps was added on branch simplex on 2008-01-07 11:15:26
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare2.mps (altnum.1): file
+ markshare2.mps was added on branch altnum on 2006-10-29 19:26:55
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare2.mps (octagons.1): file
+ markshare2.mps was added on branch octagons on 2006-11-18
+ 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/markshare2.mps (simplex.1): file
+ markshare2.mps was added on branch simplex on 2008-01-07 11:15:26
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas74.mps (altnum.1): file mas74.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas74.mps (octagons.1): file mas74.mps
+ was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas74.mps (simplex.1): file mas74.mps
+ was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas76.mps (altnum.1): file mas76.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas76.mps (octagons.1): file mas76.mps
+ was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mas76.mps (simplex.1): file mas76.mps
+ was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/modglob.mps (altnum.1): file modglob.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/modglob.mps (octagons.1): file
+ modglob.mps was added on branch octagons on 2006-11-18 20:36:42
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/modglob.mps (simplex.1): file
+ modglob.mps was added on branch simplex on 2008-01-07 11:15:26
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/noswot.mps (altnum.1): file noswot.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/noswot.mps (octagons.1): file noswot.mps
+ was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/noswot.mps (simplex.1): file noswot.mps
+ was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/opt1217.mps (altnum.1): file opt1217.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/opt1217.mps (octagons.1): file
+ opt1217.mps was added on branch octagons on 2006-11-18 20:36:43
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/opt1217.mps (simplex.1): file
+ opt1217.mps was added on branch simplex on 2008-01-07 11:15:26
+ +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/p0033.mps (altnum.1): file p0033.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/p0033.mps (octagons.1): file p0033.mps
+ was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/p0033.mps (simplex.1): file p0033.mps
+ was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/pk1.mps (altnum.1): file pk1.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/pk1.mps (octagons.1): file pk1.mps was
+ added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/pk1.mps (simplex.1): file pk1.mps was
+ added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/rout.mps (altnum.1): file rout.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/rout.mps (octagons.1): file rout.mps was
+ added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/rout.mps (simplex.1): file rout.mps was
+ added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 14:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.9),
+ ppl_interface_generator_predicate_check_pl.m4 (1.11): Simplified
+ the testing framework.
+
+2006-10-10 Tuesday 14:01 Andrea Cimino
+
+ * tests/Polyhedron/variablesset1.cc (1.7): Use the method empty()
+ given by the STL instead of checking for a zero size.
+
+2006-10-10 Tuesday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (altnum.1): file
+ variablesset1.cc was added on branch altnum on 2006-10-29
+ 19:27:34 +0000
+
+2006-10-10 Tuesday 12:46 Andrea Cimino
+
+ * tests/Polyhedron/variablesset1.cc (1.6): Code cleaned. Added a
+ FIXME concerning the operator==.
+
+2006-10-10 Tuesday 11:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ *
+ interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.10): Avoid generating useless tests.
+
+2006-10-10 Tuesday 09:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_systems.m4
+ (1.8), tests/ppl_interface_generator_predicate_check_pl.m4 (1.9):
+ Comments and formatting improved.
+
+2006-10-10 Tuesday 09:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (altnum.1): file ppl_interface_generator_prolog_systems.m4 was
+ added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-10 Tuesday 09:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (octagons.1): file ppl_interface_generator_prolog_systems.m4 was
+ added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-10 Tuesday 09:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: Makefile.am (1.47), yap_cfli.cc (1.3):
+ Distribute yap_cfli.hh. Removed the obsolete yap_cfli.cc.
+
+2006-10-10 Tuesday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.44): Distribute also
+ xsb_cfli.hh.
+
+2006-10-10 Tuesday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.64),
+ ppl_interface_generator_swiprolog_cc.m4 (1.6), swi_cfli.cc (1.3),
+ swi_cfli.h (1.3), swi_cfli.hh (1.1), swi_cfli.ic (1.3):
+ Reorganized the SWI Prolog Common Foreign Language Interface.
+
+2006-10-10 Tuesday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (altnum.1): file ppl_interface_generator_swiprolog_cc.m4 was
+ added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (octagons.1): file ppl_interface_generator_swiprolog_cc.m4 was
+ added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-10 Tuesday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (altnum.1): file swi_cfli.hh
+ was added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/swi_cfli.hh (octagons.1): file swi_cfli.hh
+ was added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 20:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.58): Copy-and-paste mistake
+ fixed.
+
+2006-10-09 Monday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/membytes1.cc (1.13): test01() is expected to
+ result in underflow with 8-bit coefficients also with assertions
+ disabled.
+
+2006-10-09 Monday 16:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.11),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.8),
+ Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+ (1.3), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.8): [no log message]
+
+2006-10-09 Monday 16:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (altnum.1): file
+ ppl_interface_generator_common.m4 was added on branch altnum on
+ 2006-10-29 19:26:57 +0000
+
+2006-10-09 Monday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.33): YAP subdirectory
+ re-enabled.
+
+2006-10-09 Monday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.5):
+ Copy-and-paste mistake fixed.
+
+2006-10-09 Monday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+ (altnum.1): file ppl_interface_generator_xsb_cc.m4 was added on
+ branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+ (octagons.1): file ppl_interface_generator_xsb_cc.m4 was added on
+ branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 10:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (1.5): Work around a bug in GCC
+ 3.3.3.
+
+2006-10-09 Monday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_cfli.hh (1.1): New implementation of
+ the XSB Prolog Common Foreign Language Interface.
+
+2006-10-09 Monday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_cfli.hh (altnum.1): file xsb_cfli.hh
+ was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_cfli.hh (octagons.1): file xsb_cfli.hh
+ was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-09 Monday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.2):
+ Thresholds for test12() updated to reflect the precision
+ attainable on the Alpha processor.
+
+2006-10-09 Monday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage1.cc (altnum.1):
+ file generalizedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-10-09 Monday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage1.cc (octagons.1):
+ file generalizedaffinepreimage1.cc was added on branch octagons
+ on 2006-11-18 20:36:59 +0000
+
+2006-10-09 Monday 08:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/disjoint1.cc (1.3): Spurious ASCII-dumps
+ removed.
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (altnum.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+ added on branch altnum on 2006-10-29 19:27:03 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (octagons.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+ added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+ (altnum.1): file ppl_interface_generator_yap_cc.m4 was added on
+ branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+ (octagons.1): file ppl_interface_generator_yap_cc.m4 was added on
+ branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_cfli.hh (altnum.1): file yap_cfli.hh
+ was added on branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_cfli.hh (octagons.1): file yap_cfli.hh
+ was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.12), ppl_interface_generator_prolog_icc_preamble (1.10),
+ Ciao/Makefile.am (1.58), Ciao/ciao_cfli.hh (1.1),
+ Ciao/ppl_ciao.cc (1.48), GNU/Makefile.am (1.57),
+ GNU/gprolog_cfli.hh (1.1), GNU/ppl_gprolog_sd.cc (1.41),
+ SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.4),
+ SWI/ppl_interface_generator_swiprolog_cc.m4 (1.5),
+ XSB/ppl_interface_generator_xsb_cc.m4 (1.4),
+ YAP/ppl_interface_generator_yap_cc.m4 (1.4), YAP/yap_cfli.h
+ (1.3), YAP/yap_cfli.hh (1.1), YAP/yap_cfli.ic (1.3): Prolog
+ interfaces cleaned up.
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_cfli.hh (altnum.1): file ciao_cfli.hh
+ was added on branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_cfli.hh (octagons.1): file
+ ciao_cfli.hh was added on branch octagons on 2006-11-18 20:36:46
+ +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_cfli.hh (altnum.1): file
+ gprolog_cfli.hh was added on branch altnum on 2006-10-29 19:27:02
+ +0000
+
+2006-10-07 Saturday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/gprolog_cfli.hh (octagons.1): file
+ gprolog_cfli.hh was added on branch octagons on 2006-11-18
+ 20:36:47 +0000
+
+2006-10-07 Saturday 18:18 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.63): Useless code removed.
+
+2006-10-07 Saturday 18:16 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.62): maybe_check_results() fixed
+ when `no_optimization' flag is enabled.
+
+2006-10-07 Saturday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (1.27): Revised a couple of comments.
+
+2006-10-07 Saturday 16:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (altnum.1): file MIP_Problem.defs.hh was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-07 Saturday 15:47 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.34), MIP_Problem.defs.hh (1.26): Defined
+ and implemented the method `is_saturated()'.
+
+2006-10-07 Saturday 15:15 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.61),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.3),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.4),
+ src/MIP_Problem.cc (1.33), src/MIP_Problem.defs.hh (1.25),
+ src/MIP_Problem.templates.hh (1.8), src/Polyhedron_public.cc
+ (1.84): ppl_lpsol: restored the old threshold. MIP_Problem:
+ added the new constructor
+
+ template <typename In> MIP_Problem(dimension_type dim,
+ In first, In last, const Variables_Set&
+ int_vars, const Linear_Expression& obj =
+ Linear_Expression::zero(), Optimization_Mode mode =
+ MAXIMIZATION)
+
+ Renamed `set_integer_dimensions()' to
+ `add_to_integer_space_dimensions'. Check, if a variables_set is
+ passed to a constructor, if the set does not exceed the space
+ dimension of the MIP Problem.
+
+2006-10-07 Saturday 13:00 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.60): The -r option is now
+ compatible with -e. Throw an error if we want to solve a MIP with
+ -e. maybe_check_results() cleaned. Modified the default
+ threshold between GLPK and ppl_lpsol, this to prepare us for the
+ next commit that will change the testsuite.
+
+2006-10-06 Friday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.59): Spurious blanks removed.
+
+2006-10-06 Friday 20:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.58): At least version 0.10 is
+ required for the MIP solving functionality.
+
+2006-10-06 Friday 20:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.57): This is no longer a toy.
+
+2006-10-06 Friday 20:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.56): Fixed some comments and code
+ formatting.
+
+2006-10-06 Friday 19:37 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.55): Use "variables" instead of
+ "Variables" when printing verbose output.
+
+2006-10-06 Friday 19:30 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.54): Some changes: -r is
+ incompatible with -e. If a MIP problem is going to be solved,
+ print, if requested, the variables constrained to be integer.
+
+2006-10-06 Friday 14:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common.m4 (1.10): Another
+ change to name of a macro.
+
+2006-10-06 Friday 14:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.9),
+ C/ppl_interface_generator_c_cc.m4 (1.5),
+ C/ppl_interface_generator_c_h.m4 (1.9),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.5),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.7),
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4 (1.7):
+ Complete improvements to ppl_interface_generator_common.m4. The
+ top level macro used by the main generating files now m4_all_code
+ instead of m4_all_classes_code. The calls therefore adjusted
+ appropriately.
+
+2006-10-06 Friday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (altnum.1): file
+ ppl_interface_generator_c_cc.m4 was added on branch altnum on
+ 2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (octagons.1): file
+ ppl_interface_generator_c_cc.m4 was added on branch octagons on
+ 2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (altnum.1): file
+ ppl_interface_generator_c_h.m4 was added on branch altnum on
+ 2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (octagons.1): file
+ ppl_interface_generator_c_h.m4 was added on branch octagons on
+ 2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+ (altnum.1): file ppl_interface_generator_prolog_icc.m4 was added
+ on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-06 Friday 13:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.8),
+ C/ppl_interface_generator_c_cc_code.m4 (1.7): Revised
+ C/ppl_interface_generator_c_cc_code.m4 for the changes to the
+ pattern names.
+
+ General improvements to ppl_interface_generator_common.m4
+ including making some macro names more meaningful and improving
+ the comments.
+
+2006-10-06 Friday 13:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (altnum.1):
+ file ppl_interface_generator_c_cc_code.m4 was added on branch
+ altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 10:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.7),
+ C/ppl_interface_generator_c_h.m4 (1.8),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.9),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.4),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.6): Many
+ improvements to the m4 code and comments in
+ ppl_interface_generator_common.m4
+
+ Names of macros improved and hence some changes needed in other
+ interface_generator files that use these names.
+
+ Unwanted text removed from C/ppl_interface_generator_c_h.m4
+
+ Bug fixed in ppl_interface_generator_common.m4.
+
+2006-10-05 Thursday 15:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.7),
+ C/ppl_interface_generator_c_cc.m4 (1.4),
+ C/ppl_interface_generator_c_dat.m4 (1.7),
+ C/ppl_interface_generator_c_h.m4 (1.7),
+ C/ppl_interface_generator_c_h_code.m4 (1.5),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.8),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.11),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.5),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.7), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.6): Patterns "represent" and "describe" replaced by 4 patterns
+ "build_represent", "get_represent", "add_represent" and
+ "relation_represent", to more accurately relate to the sets of
+ methods and predicates for which they apply.
+
+ Before including the preamble, we first change the quote
+ characters ` and ' using m4_changequote/2. This avoids m4 eating
+ the quotes in the preamble text.
+
+2006-10-05 Thursday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (altnum.1): file
+ ppl_interface_generator_c_h_code.m4 was added on branch altnum on
+ 2006-10-29 19:26:58 +0000
+
+2006-10-05 Thursday 15:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.242): Adjusted to support the building of
+ separate documentations for the library and its foreign language
+ interfaces.
+
+2006-10-05 Thursday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: Makefile.am (1.47), devref-c-interface.doxyconf-html.in
+ (1.1), devref-c-interface.doxyconf-latex.in (1.1),
+ devref-prolog-interface.doxyconf-html.in (1.1),
+ devref-prolog-interface.doxyconf-latex.in (1.1),
+ devref.doxyconf-html.in (1.77), devref.doxyconf-latex.in (1.16),
+ user-c-interface.doxyconf-html.in (1.1),
+ user-c-interface.doxyconf-latex.in (1.1),
+ user-prolog-interface.doxyconf-html.in (1.1),
+ user-prolog-interface.doxyconf-latex.in (1.1),
+ user.doxyconf-html.in (1.38), user.doxyconf-latex.in (1.9): The
+ documentation of foreign languages interfaces is now separated
+ from the documentation of the main library. The actual
+ documentation will have to be changed accordingly to reflect this
+ new design choice.
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-html.in (altnum.1): file
+ devref-c-interface.doxyconf-html.in was added on branch altnum on
+ 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-html.in (octagons.1): file
+ devref-c-interface.doxyconf-html.in was added on branch octagons
+ on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-latex.in (altnum.1): file
+ devref-c-interface.doxyconf-latex.in was added on branch altnum
+ on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-c-interface.doxyconf-latex.in (octagons.1): file
+ devref-c-interface.doxyconf-latex.in was added on branch octagons
+ on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-html.in (altnum.1): file
+ devref-prolog-interface.doxyconf-html.in was added on branch
+ altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-html.in (octagons.1): file
+ devref-prolog-interface.doxyconf-html.in was added on branch
+ octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-latex.in (altnum.1): file
+ devref-prolog-interface.doxyconf-latex.in was added on branch
+ altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-prolog-interface.doxyconf-latex.in (octagons.1): file
+ devref-prolog-interface.doxyconf-latex.in was added on branch
+ octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-html.in (altnum.1): file
+ user-c-interface.doxyconf-html.in was added on branch altnum on
+ 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-html.in (octagons.1): file
+ user-c-interface.doxyconf-html.in was added on branch octagons on
+ 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-latex.in (altnum.1): file
+ user-c-interface.doxyconf-latex.in was added on branch altnum on
+ 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-c-interface.doxyconf-latex.in (octagons.1): file
+ user-c-interface.doxyconf-latex.in was added on branch octagons
+ on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-html.in (altnum.1): file
+ user-prolog-interface.doxyconf-html.in was added on branch altnum
+ on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-html.in (octagons.1): file
+ user-prolog-interface.doxyconf-html.in was added on branch
+ octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-latex.in (altnum.1): file
+ user-prolog-interface.doxyconf-latex.in was added on branch
+ altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-prolog-interface.doxyconf-latex.in (octagons.1): file
+ user-prolog-interface.doxyconf-latex.in was added on branch
+ octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user.doxyconf-latex.in (altnum.1): file
+ user.doxyconf-latex.in was added on branch altnum on 2006-10-29
+ 19:26:56 +0000
+
+2006-10-05 Thursday 14:57 Elena Mazzi
+
+ * src/: BD_Shape.templates.hh (1.36), DB_Matrix.defs.hh (1.25),
+ DB_Matrix.inlines.hh (1.28), DB_Matrix.templates.hh (1.3),
+ DB_Row.defs.hh (1.20), DB_Row.inlines.hh (1.19),
+ DB_Row.templates.hh (1.2): Added the definitions of methods
+ `memory_size_type total_memory_in_bytes() const' and
+ `memory_size_type external_memory_in_bytes() const' in the
+ following classes: DB_Row, DB_Matrix, BD_Shape.
+
+2006-10-05 Thursday 14:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.templates.hh (altnum.1): file
+ DB_Matrix.templates.hh was added on branch altnum on 2006-10-29
+ 19:27:12 +0000
+
+2006-10-05 Thursday 14:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh (altnum.1): file DB_Row.templates.hh was
+ added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-05 Thursday 12:19 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.35), tests/BD_Shape/disjoint1.cc
+ (1.2): Fixed the comment in the method
+ BD_Shape<T>::is_disjoint_from(). Added new tests on this method.
+ Replaced `system/s of bounded differences' with `bounded
+ difference shape/s'.
+
+2006-10-05 Thursday 11:34 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.32), MIP_Problem.defs.hh (1.24):
+ `recursion_depth' thrown away.
+
+2006-10-05 Thursday 11:14 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.31), MIP_Problem.defs.hh (1.23): Comments
+ revised. `recursion_depth' is an unsigned long.
+
+2006-10-05 Thursday 10:18 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.30), MIP_Problem.defs.hh (1.22),
+ MIP_Problem.inlines.hh (1.12), MIP_Problem.templates.hh (1.7):
+ The correctness of the solution found, if is involved a non-empty
+ integer Variables_Set, is now proofed without having a special
+ member in the class. Slightly modified is_mip_satisfiable(),
+ solve_mip and choose_branching_variable() intefaces for that
+ purpose.
+
+2006-10-05 Thursday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.inlines.hh (altnum.1): file
+ MIP_Problem.inlines.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-10-05 Thursday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.inlines.hh (octagons.1): file
+ MIP_Problem.inlines.hh was added on branch octagons on 2006-11-18
+ 20:36:50 +0000
+
+2006-10-05 Thursday 07:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.inlines.hh (1.68), GMP_Integer.defs.hh
+ (1.23), GMP_Integer.inlines.hh (1.17): Added void
+ rem_assign(GMP_Integer&, const GMP_Integer&, const GMP_Integer&).
+ Added void rem_assign(Checked_Number<T, Policy>&, const
+ Checked_Number<T, Policy>&, const Checked_Number<T, Policy>&).
+
+2006-10-04 Wednesday 23:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.6),
+ ppl_interface_generator_common_dat.m4 (1.6),
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+ (1.6), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ (1.5): ppl_interface_generator_common.m4
+ ppl_interface_generator_common_dat.m4: Redundant code removed,
+ spelling in comment corrected.
+
+ Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+ Prolog/tests/ppl_interface_generator_predicate_check_code.m4:
+ Extra predicate definition added to compensate for missing
+ topology in generated test code. A rather inelegant solution to
+ a problem caused by some code requiring the topology "C_" or
+ "NNC_" attached to "Polyhedron" and some not, depending on the
+ initiating class.
+
+2006-10-04 Wednesday 21:24 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.29), MIP_Problem.defs.hh (1.21): Typos
+ fixed. `recursion_depth' now is an unsigned long.
+
+2006-10-04 Wednesday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: Makefile.am (1.43), partition1.cc (1.1):
+ Proof-of-concept implementation of the generalization to grids of
+ the partition algorithm in [Srivastava93].
+
+2006-10-04 Wednesday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (altnum.1): file Makefile.am was added on
+ branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-04 Wednesday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partition1.cc (altnum.1): file partition1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-04 Wednesday 20:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/partition1.cc (octagons.1): file partition1.cc was
+ added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-10-04 Wednesday 16:01 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.28), MIP_Problem.defs.hh (1.20),
+ MIP_Problem.inlines.hh (1.11), MIP_Problem.templates.hh (1.6):
+ Check in method OK() that the solution, if found, satisfies the
+ Variables_Set that encodes all the Variables constrained to be
+ integer. Added a new member to the class for that purpose.
+
+2006-10-04 Wednesday 13:04 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.25),
+ tests/Octagonal_Shape/disjoint1.cc (1.2): Improved the method
+ is_disjoint_from() and added a new test on it.
+
+2006-10-03 Tuesday 20:02 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.27): Some missing parentheses added.
+
+2006-10-03 Tuesday 19:50 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.26), MIP_Problem.defs.hh (1.19): Fixed
+ some typos. Used more appropriate variable names.
+
+2006-10-03 Tuesday 19:24 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.25), MIP_Problem.defs.hh (1.18): Comments
+ revised. Variable type and name changed.
+
+2006-10-03 Tuesday 17:33 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.24): Moved a couple of variable
+ declarations in the right place.
+
+2006-10-03 Tuesday 17:29 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.23), MIP_Problem.defs.hh (1.17): Fixed a
+ bug in solve_mip(): if MAXIMIZATION was requested, the `branch
+ and bound' tree was cut too early, loosing optimal solutions.
+ Slightly modified solve_mip() interface to allow to print some
+ debugging information if requested.
+
+2006-10-03 Tuesday 16:16 Elena Mazzi
+
+ * src/: BD_Shape.inlines.hh (1.135), BD_Shape.templates.hh (1.34):
+ No longer inlined the following functions: -
+ BD_Shape::affine_dimension(); -
+ BD_Shape::forget_all_dbm_constraints(v); -
+ BD_Shape::forget_binary_dbm_constraints(v).
+
+2006-10-03 Tuesday 15:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/:
+ ppl_interface_generator_predicate_check_code.m4 (1.5),
+ ppl_interface_generator_predicate_check_extra_code (1.2),
+ ppl_interface_generator_predicate_check_pl.m4 (1.4): Some
+ improvements. Commented code in
+ ppl_interface_generator_predicate_check_code.m4 shows a bug in
+ the main m4 replacement code for friend classes.
+
+2006-10-03 Tuesday 15:35 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.33): The method
+ BD_Shape::is_disjoint_from(y) is now implemented without using a
+ copy of a BD_Shape.
+
+2006-10-03 Tuesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/discrete1.cc (altnum.1): file discrete1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-03 Tuesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/discrete1.cc (octagons.1): file
+ discrete1.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-10-03 Tuesday 14:25 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (1.9),
+ src/Octagonal_Shape.templates.hh (1.24),
+ tests/Octagonal_Shape/Makefile.am (1.6),
+ tests/Octagonal_Shape/discrete1.cc (1.1): Defined the method
+ is_discrete() and moved it from the file
+ Octagonal_Shape.templates.hh to the file
+ Octagonal_Shape.inlines.hh. Added some tests about it.
+
+2006-10-03 Tuesday 14:02 Elena Mazzi
+
+ * src/: BD_Shape.inlines.hh (1.134), BD_Shape.templates.hh (1.32):
+ Moved the method BD_Shape::is_discrete() from file
+ `BD_Shape.templates.hh' to `BD_Shape.inlines.hh'.
+
+2006-10-03 Tuesday 13:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.4): Bug
+ in code generator for XSB corrected.
+
+2006-10-03 Tuesday 13:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (altnum.1): file ppl_interface_generator_xsb_H.m4 was added on
+ branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-03 Tuesday 13:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (octagons.1): file ppl_interface_generator_xsb_H.m4 was added on
+ branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-03 Tuesday 13:04 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.31), tests/BD_Shape/Makefile.am
+ (1.50), tests/BD_Shape/discrete1.cc (1.1): Defined the method
+ BD_Shape::is_discrete() and added some tests on this method.
+
+2006-10-03 Tuesday 13:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/discrete1.cc (altnum.1): file discrete1.cc was
+ added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-03 Tuesday 13:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/discrete1.cc (octagons.1): file discrete1.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-03 Tuesday 11:49 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.22): In a MIP_Problem, if we exit with
+ status UNBOUNDED and we have found a feasible generator, store it
+ in `last_generator'.
+
+2006-10-03 Tuesday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: certificate1.cc (1.12), congruence1.cc (1.14),
+ discrete1.cc (1.6): Awful syntax avoided.
+
+2006-10-03 Tuesday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/certificate1.cc (altnum.1): file certificate1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-03 Tuesday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/discrete1.cc (altnum.1): file discrete1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-03 Tuesday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.32), expected_int16 (1.7),
+ expected_int16_a (1.7), expected_int32 (1.8), expected_int32_a
+ (1.8), expected_int64 (1.8), expected_int64_a (1.8),
+ expected_int8 (1.7), expected_int8_a (1.6), expected_mpz (1.9),
+ expected_mpz_a (1.9): Do not lie anymore: write on the expected*
+ files a faithful indication of the command being executed.
+
+2006-10-03 Tuesday 09:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: Makefile.am (1.9),
+ ppl_interface_generator_predicate_check_code.m4 (1.4),
+ ppl_interface_generator_predicate_check_extra_code (1.1),
+ ppl_interface_generator_predicate_check_pl.m4 (1.3): The extra
+ test code moved to a separate "extra_code" file. Before the
+ m4_include for this file, the quote characters are changed to
+ @<<@ and @>>@ and then restored back to the original ` and '
+ after the include. This allows the inclusion of quote characters
+ in the Prolog code in the "extra_code" file.
+
+ Makefile.am modified so that in the interfaces/Prolog/tests
+ directory "make" creates the Prolog test program
+ "ppl_predicate_check.pl".
+
+2006-10-03 Tuesday 00:20 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.21), MIP_Problem.defs.hh (1.16):
+ Performance of the heuristic method improved: an equality
+ constraint is an `active constraint' by definition.
+
+2006-10-02 Monday 21:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.37): Previous commit for
+ this file reversed and test file restored.
+
+2006-10-02 Monday 21:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: pl_check.pl (1.36),
+ ppl_interface_generator_predicate_check_code.m4 (1.3): Corrected
+ a few typos.
+
+2006-10-02 Monday 19:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (1.6): Corrected an
+ m4 macro call.
+
+2006-10-02 Monday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.20): Comments revised.
+
+2006-10-02 Monday 18:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: Makefile.am (1.17),
+ ppl_interface_generator_common.m4 (1.5): Two more changes made
+ for the change to the m4 builtins.
+
+2006-10-02 Monday 17:45 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.19), MIP_Problem.defs.hh (1.15): Added a
+ new heuristic that selects a branching variable when a
+ MIP_Problem feasibility has to be proofed. Modified the
+ prototype for `is_satisfied' to allow the checking of `active
+ constraints'. The new heuristic is turned on by default.
+
+2006-10-02 Monday 17:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.6),
+ ppl_interface_generator_c_h.m4 (1.6): Fixed a couple of bugs
+ where the m4 builtin had not been revised to m4_builtin.
+
+2006-10-02 Monday 17:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.16): Skip the OCaml directory, for the
+ time being.
+
+2006-10-02 Monday 17:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.52), Polyhedron/dualhypercubes.cc (1.10):
+ Test Polyhedron/dualhypercubes.cc fails on 64 bits checked
+ integers when assertions are turned on.
+
+2006-10-02 Monday 17:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: C/Makefile.am (1.26),
+ C/ppl_interface_generator_c_h.m4 (1.5), Prolog/Makefile.am
+ (1.32), Prolog/Ciao/Makefile.am (1.57), Prolog/GNU/Makefile.am
+ (1.56), Prolog/SICStus/Makefile.am (1.70), Prolog/SWI/Makefile.am
+ (1.63), Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.4),
+ Prolog/XSB/Makefile.am (1.43), Prolog/YAP/Makefile.am (1.46):
+ Corrections where some builtins for m4 were not changed as
+ required. The Makefile.am files now have m4 --prefix-builtin in
+ the m4 commands.
+
+2006-10-02 Monday 16:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/:
+ Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.2),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.2),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.2):
+ Changed these interface_generator files for the test code to
+ require the m4 command to include --prefix-builtin.
+
+2006-10-02 Monday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (altnum.1): file
+ ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+ branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+ (octagons.1): file
+ ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+ branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+ (altnum.1): file ppl_interface_generator_ciao_pl.m4 was added on
+ branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+ (octagons.1): file ppl_interface_generator_ciao_pl.m4 was added
+ on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (altnum.1): file ppl_interface_generator_gprolog_pl.m4 was added
+ on branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (octagons.1): file ppl_interface_generator_gprolog_pl.m4 was
+ added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (altnum.1): file ppl_interface_generator_xsb_predicate_check_P.m4
+ was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-02 Monday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ *
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (octagons.1): file
+ ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+ branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-02 Monday 16:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.4),
+ ppl_interface_generator_common_dat.m4 (1.5),
+ C/ppl_interface_generator_c_cc.m4 (1.3),
+ C/ppl_interface_generator_c_cc_code.m4 (1.5),
+ C/ppl_interface_generator_c_dat.m4 (1.5),
+ C/ppl_interface_generator_c_h.m4 (1.4),
+ C/ppl_interface_generator_c_h_code.m4 (1.4),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.7),
+ Prolog/ppl_interface_generator_prolog_icc.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.10),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.4),
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.3),
+ Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.3),
+ Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.3),
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.3),
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.3),
+ Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.3),
+ Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+ (1.2), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.3):
+ Changed all the built-ins for the m4 code for generating the
+ interfaces from builtin to m4_builtin. Note that the built-in
+ dnl is unchanged; instead, I have added define(`dnl', `m4_dnl')
+ at the start of the main files.
+
+2006-10-02 Monday 14:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/:
+ Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.1),
+ XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.1),
+ tests/pl_check.pl (1.35),
+ tests/ppl_interface_generator_predicate_check_code.m4 (1.1),
+ tests/ppl_interface_generator_predicate_check_pl.m4 (1.1):
+ interface generator code for generating a test file for all
+ predicates for all the required classes.
+
+2006-10-02 Monday 14:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_systems.m4 (1.3): Comments
+ corrected and allow for a default code that is needed for the
+ tests.
+
+2006-10-02 Monday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.241): Generate the Grid interfaces by default.
+
+2006-10-02 Monday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Makefile.am (1.15), OCaml/ppl_ocaml.cc (1.6),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.9): Fixed
+ the generalized image predicated for Grid.
+
+2006-10-02 Monday 11:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.6),
+ ppl_interface_generator_prolog_icc_code.m4 (1.8): Corrected the
+ interfacing of Grid::generalized_affine_[pre]image*.
+
+2006-10-02 Monday 10:56 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.30): Improved the method:
+ BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-10-02 Monday 09:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.7), ppl_interface_generator_prolog_icc_preamble (1.9):
+ term_to_relation_symbol() revised.
+
+2006-10-01 Sunday 22:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.8): Corrected order of arguments in
+ ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 22:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.34): Define aux predicate
+ clean_ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 20:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+ (1.6), ppl_interface_generator_prolog_icc_preamble (1.7): Severa
+ FIXMEs dealt with.
+
+2006-10-01 Sunday 20:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.23),
+ ppl_interface_generator_prolog_icc_code.m4 (1.5),
+ ppl_interface_generator_prolog_icc_preamble (1.6): Most
+ predicates now raise meaningful exceptions.
+
+2006-10-01 Sunday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.22),
+ ppl_interface_generator_prolog_icc_preamble (1.5): Class
+ PPL_integer_out_of_range revised.
+
+2006-10-01 Sunday 17:19 Andrea Cimino
+
+ * tests/Polyhedron/variablesset1.cc (1.4): Test also
+ `std::set_intersection' and `std::set_difference'.
+
+2006-10-01 Sunday 15:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.5),
+ ppl_interface_generator_prolog_icc_preamble (1.4): LP_Problem
+ interface updated.
+
+2006-10-01 Sunday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.21),
+ ppl_interface_generator_prolog_icc_code.m4 (1.4),
+ ppl_interface_generator_prolog_icc_preamble (1.3): Started
+ improving the Prolog interface error reporting mechanisms. Fixed
+ several copy-and-paste mistakes in the support for grids.
+
+2006-10-01 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.5), ppl_ocaml.mli (1.4),
+ test1.ml (1.4): Sample code to support building polyhedra from
+ OCaml.
+
+2006-10-01 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.mli (altnum.1): file ppl_ocaml.mli was
+ added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.mli (octagons.1): file ppl_ocaml.mli
+ was added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/test1.ml (altnum.1): file test1.ml was added on
+ branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/test1.ml (octagons.1): file test1.ml was added
+ on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.4), ppl_ocaml.mli (1.3),
+ test1.ml (1.3): build_Constraint_System() and
+ build_Generator_System() rewritten.
+
+2006-09-30 Saturday 21:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_ocaml.cc (1.3): Support the building of
+ constraint and generator systems.
+
+2006-09-30 Saturday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_ocaml.cc (1.2), ppl_ocaml.mli (1.2),
+ test1.ml (1.2): Support the building of constraints and
+ generators.
+
+2006-09-30 Saturday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: Makefile.am (1.13), ppl_ocaml.cc (1.1),
+ ppl_ocaml.mli (1.1), test1.ml (1.1): Initial steps for the OCaml
+ interface.
+
+2006-09-30 Saturday 16:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.4):
+ Corrected trivial bug (missing commas) whereby the C interface
+ code was not generated for several methods.
+
+2006-09-30 Saturday 16:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (1.4): Minor
+ improvements: methods not available for BDS are neither avaiable
+ for Octagonal shapes.
+
+2006-09-30 Saturday 16:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.11), Octagonal_Shape.inlines.hh
+ (1.8), Octagonal_Shape.templates.hh (1.23): Added methods
+ shrink_bounding_box() and topological_closure_assign().
+
+2006-09-30 Saturday 16:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.29): Corrected a bug in
+ shrink_bounding_box.
+
+2006-09-30 Saturday 15:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.4):
+ BD_Shape now have the generalized (pre-) images methods.
+
+2006-09-30 Saturday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.240): Do not invoke AM_PROG_GCJ.
+
+2006-09-30 Saturday 13:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (1.3):
+ Distribute the output functions in the corresponding group
+ depending on the interfaced PPL entity.
+
+2006-09-30 Saturday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (1.3): Corrected
+ simple bug in the generation of documentation grouping.
+
+2006-09-29 Friday 23:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4 (1.4),
+ C/ppl_interface_generator_c_cc_code.m4 (1.3),
+ C/ppl_interface_generator_c_dat.m4 (1.3),
+ C/ppl_interface_generator_c_h_code.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_dat.m4 (1.3),
+ Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.3): Replaced
+ pattern "is_ at STATE@ by "@HAS_PROPERTY@ and added replacement
+ "contains_integer_point" for this pattern. A comment corrected.
+
+2006-09-29 Friday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.239): Added the infrastructure required to enable
+ the Java interface.
+
+2006-09-29 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.238): Added the infrastructure required to enable
+ the OCaml interface.
+
+2006-09-29 Friday 18:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/variablesset1.cc (1.3): Show how
+ std::set_union() should be used.
+
+2006-09-29 Friday 18:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.101), containsintegerpoint1.cc
+ (1.1): Added a test for Polyhedron::contains_integer_point().
+
+2006-09-29 Friday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/containsintegerpoint1.cc (altnum.1): file
+ containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-09-29 Friday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/containsintegerpoint1.cc (octagons.1): file
+ containsintegerpoint1.cc was added on branch octagons on
+ 2006-11-18 20:37:00 +0000
+
+2006-09-29 Friday 18:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (1.3):
+ Polyhedra_Powerset renamed as Pointset_Powerset.
+
+2006-09-29 Friday 16:01 Andrea Cimino
+
+ * tests/Polyhedron/variablesset1.cc (1.2): Fixed a typo.
+
+2006-09-29 Friday 16:00 Andrea Cimino
+
+ * tests/Polyhedron/: Makefile.am (1.100), variablesset1.cc (1.1):
+ Added some tests for the Variables_Set class. Remeber also to
+ test set_union(), set_difference()...
+
+2006-09-29 Friday 14:19 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.22),
+ tests/Octagonal_Shape/Makefile.am (1.5),
+ tests/Octagonal_Shape/disjoint1.cc (1.1): Added the method
+ bool Octagonal_Shape<T>::is_disjoint_from() and some tests about
+ it.
+
+2006-09-29 Friday 14:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: foldspacedims2.cc (1.13), membytes1.cc (1.12):
+ Adjusted tests that no longer fail with 8-bit coefficients.
+
+2006-09-29 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.237), instchk.hh (1.6), interfaces/Makefile.am
+ (1.14), interfaces/ppl_interface_generator_common.m4 (1.2),
+ interfaces/ppl_interface_generator_common_dat.m4 (1.2),
+ interfaces/ppl_interface_generator_copyright (1.2),
+ interfaces/C/Makefile.am (1.25), interfaces/C/ppl_c.cc (1.158),
+ interfaces/C/ppl_c_version.h.in (1.2),
+ interfaces/C/ppl_interface_generator_c_cc.m4 (1.2),
+ interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.2),
+ interfaces/C/ppl_interface_generator_c_cc_preamble (1.2),
+ interfaces/C/ppl_interface_generator_c_dat.m4 (1.2),
+ interfaces/C/ppl_interface_generator_c_h.m4 (1.2),
+ interfaces/C/ppl_interface_generator_c_h_code.m4 (1.2),
+ interfaces/C/ppl_interface_generator_c_h_preamble (1.2),
+ interfaces/Prolog/Makefile.am (1.31),
+ interfaces/Prolog/exceptions.hh (1.20),
+ interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.2),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.2),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (1.2),
+ interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+ (1.2),
+ interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (1.2), interfaces/Prolog/ppl_prolog.icc (1.181),
+ interfaces/Prolog/Ciao/Makefile.am (1.56),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.93),
+ interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.2),
+ interfaces/Prolog/GNU/Makefile.am (1.55),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.62),
+ interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (1.2), interfaces/Prolog/SICStus/Makefile.am (1.69),
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (1.2), interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.97),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.8),
+ interfaces/Prolog/SWI/Makefile.am (1.62),
+ interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (1.2), interfaces/Prolog/SWI/ppl_swiprolog.cc (1.127),
+ interfaces/Prolog/SWI/swi_cfli.cc (1.2),
+ interfaces/Prolog/SWI/swi_cfli.h (1.2),
+ interfaces/Prolog/SWI/swi_cfli.ic (1.2),
+ interfaces/Prolog/XSB/Makefile.am (1.42),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.2),
+ interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.2),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.51),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.93),
+ interfaces/Prolog/YAP/Makefile.am (1.45),
+ interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.2),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.121),
+ interfaces/Prolog/YAP/yap_cfli.cc (1.2),
+ interfaces/Prolog/YAP/yap_cfli.h (1.2),
+ interfaces/Prolog/YAP/yap_cfli.ic (1.2),
+ interfaces/Prolog/tests/Makefile.am (1.8),
+ interfaces/Prolog/tests/pl_check.pl (1.33),
+ interfaces/Prolog/tests/pl_grid_check.pl (1.2),
+ src/BD_Shape.defs.hh (1.81), src/BD_Shape.inlines.hh (1.133),
+ src/BD_Shape.templates.hh (1.28): The `interfaces' branch has
+ been merged to the main trunk. The branch has now to be
+ considered closed.
+
+2006-09-29 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (altnum.1): file instchk.hh was added on branch altnum
+ on 2006-10-29 19:26:46 +0000
+
+2006-09-29 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_copyright (altnum.1): file
+ ppl_interface_generator_copyright was added on branch altnum on
+ 2006-10-29 19:26:57 +0000
+
+2006-09-29 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_copyright (octagons.1): file
+ ppl_interface_generator_copyright was added on branch octagons on
+ 2006-11-18 20:36:44 +0000
+
+2006-09-29 Friday 11:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (interfaces.5): Temporarily disable
+ the YAP interface.
+
+2006-09-29 Friday 11:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc.m4,
+ ppl_interface_generator_c_cc_preamble,
+ ppl_interface_generator_c_h.m4,
+ ppl_interface_generator_c_h_preamble (interfaces.[7,6,7,7]):
+ Added support for interfacing MIP_problem class and for
+ ascii_dump methods, as done in the main trunk.
+
+2006-09-29 Friday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_cfli.cc (interfaces.1): Put under CVS
+ control.
+
+2006-09-29 Friday 11:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.83): Added a workaround to the
+ implementation of contains_integer_point(), so as to correctly
+ handle the case of NNC polyhedra and also avoid a few trivial
+ cases where the polyhedron is known to be empty.
+
+2006-09-29 Friday 09:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: C/ppl_interface_generator_c_cc_preamble,
+ C/ppl_interface_generator_c_h_preamble,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_preamble,
+ Prolog/tests/pl_check.pl (interfaces.[5,6,31,5,2]): Updated for
+ changes from the Trunk. Now C and Prolog interfaces compile with
+ the "Polyhedron" for the --enable-instantiation. Only SICStus
+ and SWI Prolog interfaces tested.
+
+2006-09-29 Friday 00:42 Andrea Cimino
+
+ * src/: LP_Problem.defs.hh (1.26), MIP_Problem.defs.hh (1.14):
+ Other doxygen comments fixed.
+
+2006-09-28 Thursday 22:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+ config.sub, configure.ac, install-sh, instchk.hh, missing,
+ mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+ Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+ Watchdog/missing, Watchdog/mkinstalldirs,
+ Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+ Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/ppl-config.1,
+ doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+ doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+ doc/ppl_lpsol_extra_man_text, doc/prog2man,
+ interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/pl_check.pl, src/Any_Pointset.defs.hh,
+ src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+ src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+ src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Certificate.cc, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.defs.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, src/LP_Problem.templates.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/MIP_Problem.cc,
+ src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+ src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+ src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+ src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+ src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+ src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+ src/Og_Status.inlines.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.cc,
+ src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+ src/Pointset_Ask_Tell.templates.hh,
+ src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+ src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+ src/Pointset_Powerset.templates.hh,
+ src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.templates.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.templates.hh, src/Result.defs.hh,
+ src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variables_Set.cc,
+ src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+ src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/algorithms.hh,
+ src/checked.inlines.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_numeric_limits.hh, src/conversion.cc,
+ src/distances.defs.hh, src/distances.inlines.hh,
+ src/distances.types.hh, src/fpu-ia32.inlines.hh,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+ src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+ src/mp_numeric_limits.hh, src/namespaces.hh, tests/BBox.cc,
+ tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+ tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+ tests/Makefile.am, tests/Partial_Function.cc, tests/ppl_test.cc,
+ tests/ppl_test.hh, tests/print.hh, tests/Ask_Tell/.cvsignore,
+ tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhz03widening1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/concatenate1.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/containsintegerpoint1.cc,
+ tests/BD_Shape/disjoint1.cc, tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc,
+ tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+ tests/Grid/Makefile.am, tests/Grid/affineimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload3.cc,
+ tests/Grid/asciidumpload4.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/boundedaffineimage1.cc,
+ tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox2.cc,
+ tests/Grid/congruences2.cc, tests/Grid/containsintegerpoint1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/directproduct2.cc, tests/Grid/equals1.cc,
+ tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffineimage3.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/membytes1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/widening2.cc, tests/Octagonal_Shape/.cvsignore,
+ tests/Octagonal_Shape/Makefile.am,
+ tests/Octagonal_Shape/addspacedims1.cc,
+ tests/Octagonal_Shape/affinedimension1.cc,
+ tests/Octagonal_Shape/affineimage1.cc,
+ tests/Octagonal_Shape/affineimage2.cc,
+ tests/Octagonal_Shape/affinepreimage1.cc,
+ tests/Octagonal_Shape/affinepreimage2.cc,
+ tests/Octagonal_Shape/ascii_dump_load1.cc,
+ tests/Octagonal_Shape/bhmz05widening1.cc,
+ tests/Octagonal_Shape/bhz03widening1.cc,
+ tests/Octagonal_Shape/bounded1.cc,
+ tests/Octagonal_Shape/cc76extrapolation1.cc,
+ tests/Octagonal_Shape/cc76narrowing1.cc,
+ tests/Octagonal_Shape/chinainit.cc,
+ tests/Octagonal_Shape/concatenate1.cc,
+ tests/Octagonal_Shape/constraints1.cc,
+ tests/Octagonal_Shape/contains1.cc,
+ tests/Octagonal_Shape/containsintegerpoint1.cc,
+ tests/Octagonal_Shape/empty1.cc,
+ tests/Octagonal_Shape/fromgensys1.cc,
+ tests/Octagonal_Shape/frompolyhedron1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage1.cc,
+ tests/Octagonal_Shape/generalizedaffineimage2.cc,
+ tests/Octagonal_Shape/generalizedaffineimage3.cc,
+ tests/Octagonal_Shape/generalizedaffineimage4.cc,
+ tests/Octagonal_Shape/generalizedaffineimage5.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+ tests/Octagonal_Shape/intersection1.cc,
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+ tests/Octagonal_Shape/mapspacedims1.cc,
+ tests/Octagonal_Shape/maxspacedim.cc,
+ tests/Octagonal_Shape/minconstraints1.cc,
+ tests/Octagonal_Shape/octdifference1.cc,
+ tests/Octagonal_Shape/octhull1.cc,
+ tests/Octagonal_Shape/relatwithcons1.cc,
+ tests/Octagonal_Shape/relatwithcons2.cc,
+ tests/Octagonal_Shape/relatwithgen1.cc,
+ tests/Octagonal_Shape/removespacedims1.cc,
+ tests/Octagonal_Shape/run_tests,
+ tests/Octagonal_Shape/timeelapse1.cc,
+ tests/Octagonal_Shape/universe1.cc,
+ tests/Octagonal_Shape/writeoctagon1.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/bug2.dat, tests/Polyhedron/dualhypercubes.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+ tests/Polyhedron/exceptions3.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+ tests/Polyhedron/pointsetpowerset1.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+ utils/timings.cc
+ (interfaces.[1,1,1,1,1,1,1,1,5,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,2,5,1,1,1,1,1,1,5,1,1,1,1,1,2,2,2,1,1,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,1,1,2,2,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1, [...]
+ Second merge from main trunk (several compilation errors still to
+ be fixed).
+
+2006-09-28 Thursday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: ppl_interface_generator_yap_cc.m4,
+ yap_cfli.h, yap_cfli.ic (interfaces.[4,2,2]): Started a revision
+ of the YAP interface.
+
+2006-09-28 Thursday 21:06 Andrea Cimino
+
+ * src/LP_Problem.defs.hh (1.25): Other little English inaccuracy
+ fixed.
+
+2006-09-28 Thursday 21:03 Andrea Cimino
+
+ * src/: LP_Problem.cc (1.36), LP_Problem.defs.hh (1.24),
+ MIP_Problem.cc (1.18), MIP_Problem.defs.hh (1.13): Some English
+ inaccuracies fixed. Properly renamed also `unsplit()' to
+ `merge_split_variables()'.
+
+2006-09-28 Thursday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (interfaces.1): file MIP_Problem.cc was added
+ on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (interfaces.1): file MIP_Problem.defs.hh
+ was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 17:21 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.49), disjoint1.cc (1.1): Added
+ new tests on the method BD_Shape::is_disjoint_from(y).
+
+2006-09-28 Thursday 17:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/disjoint1.cc (interfaces.1): file disjoint1.cc was
+ added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 17:19 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.27): Defined the method:
+ BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-09-28 Thursday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/intersection1.cc (1.12): test01() never fails.
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffineimage1.cc (altnum.1): file
+ boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+ 19:27:27 +0000
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffineimage1.cc (interfaces.1): file
+ boundedaffineimage1.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffineimage1.cc (octagons.1): file
+ boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+ 20:36:56 +0000
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffinepreimage1.cc (altnum.1): file
+ boundedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:27 +0000
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffinepreimage1.cc (interfaces.1): file
+ boundedaffinepreimage1.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundedaffinepreimage1.cc (octagons.1): file
+ boundedaffinepreimage1.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-09-28 Thursday 14:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.35), src/Grid_public.cc (1.42),
+ tests/Grid/Makefile.am (1.42), tests/Grid/boundedaffineimage1.cc
+ (1.1), tests/Grid/boundedaffinepreimage1.cc (1.1): Added methods
+ bounded_affine_image() and bounded_affine_preimage() for Grids
+ and tests to test them.
+
+2006-09-28 Thursday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/intersection1.cc (1.11): Print also known_result
+ in test01().
+
+2006-09-28 Thursday 11:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.defs.hh (1.32): Removed annoying trailing
+ whitespace.
+
+2006-09-28 Thursday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/membytes1.cc (1.11): test02() should never fail.
+
+2006-09-28 Thursday 06:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/Makefile.am (1.4): Disable valgrind
+ checking.
+
+2006-09-28 Thursday 06:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/Makefile.am (interfaces.1): file
+ Makefile.am was added on branch interfaces on 2006-09-28 20:46:32
+ +0000
+
+2006-09-27 Wednesday 19:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.48): Disable valgrind checking.
+
+2006-09-27 Wednesday 18:45 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.17), MIP_Problem.defs.hh (1.12):
+ solve_mip() and is_mip_satisfiable() declared static. Avoided a
+ lot of copies involed when a mip problem has to be solved /
+ checked for satisfiability. Added a sketch of code in OK() that
+ has to proof the satisfiability of a solution found that is
+ constrained to have integer coefficients.
+
+2006-09-27 Wednesday 16:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.34), src/Grid_public.cc (1.41),
+ tests/Grid/Makefile.am (1.41),
+ tests/Grid/generalizedaffineimage3.cc (1.1),
+ tests/Grid/generalizedaffinepreimage3.cc (1.1): Added an
+ implementation for generalizedaffineimage() and
+ generalizedaffinepreimage() in the case that resym is not EQUAL.
+ Added tests to test this.
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage3.cc (altnum.1): file
+ generalizedaffineimage3.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage3.cc (interfaces.1): file
+ generalizedaffineimage3.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage3.cc (octagons.1): file
+ generalizedaffineimage3.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage3.cc (altnum.1): file
+ generalizedaffinepreimage3.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage3.cc (interfaces.1): file
+ generalizedaffinepreimage3.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage3.cc (octagons.1): file
+ generalizedaffinepreimage3.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-09-26 Tuesday 22:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (1.8), interfaces/C/Makefile.am (1.24),
+ interfaces/Prolog/SWI/Makefile.am (1.61),
+ tests/BD_Shape/Makefile.am (1.47),
+ tests/Octagonal_Shape/Makefile.am (1.3): Typos fixed.
+
+2006-09-26 Tuesday 22:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (altnum.1): file Makefile.am was added
+ on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/: EList.defs.hh (1.4), Handler.defs.hh (1.3),
+ Pending_Element.defs.hh (1.3), Watchdog.cc (1.4),
+ Watchdog.defs.hh (1.3): Comments improved.
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList.defs.hh (altnum.1): file EList.defs.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Handler.defs.hh (altnum.1): file Handler.defs.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_Element.defs.hh (altnum.1): file
+ Pending_Element.defs.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc (altnum.1): file Watchdog.cc was added
+ on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.defs.hh (altnum.1): file Watchdog.defs.hh
+ was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 19:07 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.53): Fixed a bug in
+ `maybe_check_results': no_optimization flag was not properly
+ handled.
+
+2006-09-26 Tuesday 18:56 Andrea Cimino
+
+ * src/MIP_Problem.inlines.hh (1.10): Copy operator fixed.
+
+2006-09-26 Tuesday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.inlines.hh (interfaces.1): file
+ MIP_Problem.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-26 Tuesday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.82): In method OK(), do not attempt
+ minimizing the constraint description, unless the constraints are
+ claimed to be already minimized (so as to check for the
+ correctness of the claim) or if explicitly required to check for
+ emptyness.
+
+2006-09-26 Tuesday 15:16 quartieri
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (1.2): Added some
+ tests on the method bool
+ Octagonal_Shape<T>::contains_integer_point() const.
+
+2006-09-26 Tuesday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (altnum.1): file
+ containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-26 Tuesday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (interfaces.1):
+ file containsintegerpoint1.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-26 Tuesday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/containsintegerpoint1.cc (octagons.1): file
+ containsintegerpoint1.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-09-26 Tuesday 10:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: affineimage2.cc (1.9), generalizedaffineimage1.cc
+ (1.11), generalizedaffineimage2.cc (1.10),
+ generalizedaffinepreimage1.cc (1.13),
+ generalizedaffinepreimage2.cc (1.13): Updated for the revisions
+ to the methods generalized_affine_image() and
+ generalized_affine_preimage().
+
+2006-09-26 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage2.cc (altnum.1): file affineimage2.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-26 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage1.cc (altnum.1): file
+ generalizedaffineimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage2.cc (altnum.1): file
+ generalizedaffineimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage1.cc (altnum.1): file
+ generalizedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage2.cc (altnum.1): file
+ generalizedaffinepreimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh (1.33), Grid_public.cc (1.40): Revised
+ generalized_affime_image() and generalized_affime_preimage() for
+ the Grid domain to include the relation symbol. Current version
+ only handles the case when this is EQUAL which also denotes a
+ congruence relation. The default value for the modulus is now
+ zero.
+
+2006-09-26 Tuesday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.5): Debugging declarations commented
+ out.
+
+2006-09-26 Tuesday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (interfaces.1): file
+ Any_Pointset.defs.hh was added on branch interfaces on 2006-09-28
+ 20:46:28 +0000
+
+2006-09-26 Tuesday 10:21 Andrea Cimino
+
+ * demos/ppl_lpsol/: Makefile.am (1.31), ppl_lpsol.c (1.52):
+ ppl_lpsol modified to use the MIP_Problem class instead of
+ LP_Problem. Now ppl_lpsol can handle also MIP problems optimizing
+ them and finding feasible points.
+
+2006-09-25 Monday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.4): More methods added.
+
+2006-09-25 Monday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.80), BD_Shape.inlines.hh (1.132),
+ Octagonal_Shape.defs.hh (1.10), Octagonal_Shape.inlines.hh (1.7):
+ Added BD_Shape::is_topologically_closed() and
+ Octagonal_Shape::is_topologically_closed().
+
+2006-09-25 Monday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (interfaces.1): file
+ Octagonal_Shape.defs.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh (interfaces.1): file
+ Octagonal_Shape.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.79), BD_Shape.templates.hh (1.26),
+ Octagonal_Shape.defs.hh (1.9), Octagonal_Shape.templates.hh
+ (1.21): Added declarations and fake implementations of
+ BD_Shape::is_disjoint_from(),
+ Octagonal_Shape::is_disjoint_from(), BD_Shape::is_discrete() and
+ Octagonal_Shape::is_discrete().
+
+2006-09-25 Monday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (interfaces.1): file
+ Octagonal_Shape.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 19:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.80): Comments revised.
+
+2006-09-25 Monday 19:45 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.16): Fixed a bug: if we are solving real
+ MIP problems, remember to always store a feasible point. This
+ avoids a bug shown if a problem is unbounded and we are asked for
+ a feasible point.
+
+2006-09-25 Monday 13:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.157), ppl_c.h.in (1.68): Added
+ ascii_dump functions to the C interface.
+
+2006-09-25 Monday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.51): Added 'r' to OPTION_LETTERS.
+
+2006-09-25 Monday 11:56 Elena Mazzi
+
+ * tests/BD_Shape/timeelapse1.cc (1.15): Renamed the variables `oc'
+ with `bd' in many tests.
+
+2006-09-25 Monday 11:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (1.3): Documentation of class
+ iterator_to_const revised.
+
+2006-09-25 Monday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (altnum.1): file
+ iterator_to_const.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:15 +0000
+
+2006-09-25 Monday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (interfaces.1): file
+ iterator_to_const.defs.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 11:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (octagons.1): file
+ iterator_to_const.defs.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 23:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.3): Debugging code commented out.
+
+2006-09-24 Sunday 23:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.defs.hh (1.2): Added more methods to
+ Any_Pointset and its subclasses.
+
+2006-09-24 Sunday 21:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/MIP_Problem.defs.hh (1.11): Declarations of integer variables
+ get/add methods moved to better places; drafted documentation for
+ the setting of integer variables.
+
+2006-09-24 Sunday 21:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.50): Optimization modes are
+ specified at library level, not inside LP_Problem class.
+
+2006-09-24 Sunday 21:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.156), ppl_c.h.in (1.67): First draft
+ at interfacing class MIP_Problem.
+
+2006-09-24 Sunday 18:07 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.15): If we add integer space dimensions to
+ an unsatisfiable problem, it remains unsatisfiable.
+
+2006-09-24 Sunday 18:00 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.14): set_integer_space_dimensions() now
+ throws a valid error message.
+
+2006-09-24 Sunday 17:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.20): Use
+ is_additive_inverse() to improve readability in several places.
+ Used is_even() in tight_coherence_would_make_empty(). Corrected
+ bug in the output operator whereby the output of an octagon
+ having integer coefficients could have been innacurate (but
+ correct).
+
+2006-09-24 Sunday 17:56 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.13), MIP_Problem.defs.hh (1.10): void
+ set_integer_space_dimensions(const Variables_Set& i_vars) defined
+ and implemented.
+
+2006-09-24 Sunday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.131): Fixed is_even() and
+ is_additive_inverse() (ROUND_IGNORE evaluates the returned Result
+ info lazily, that is, it will happily return V_LGE ---a.k.a.
+ "don't know"--- if returning something more precise costs one
+ extra clock cycle).
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Any_Pointset.defs.hh (1.1), Any_Pointset.inlines.hh (1.1),
+ Any_Pointset.types.hh (1.1), Makefile.am (1.161): Started writing
+ the new Any_Pointset class.
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.inlines.hh (altnum.1): file
+ Any_Pointset.inlines.hh was added on branch altnum on 2006-10-29
+ 19:27:12 +0000
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.inlines.hh (interfaces.1): file
+ Any_Pointset.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.inlines.hh (octagons.1): file
+ Any_Pointset.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:50 +0000
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.types.hh (altnum.1): file Any_Pointset.types.hh
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.types.hh (interfaces.1): file
+ Any_Pointset.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Any_Pointset.types.hh (octagons.1): file
+ Any_Pointset.types.hh was added on branch octagons on 2006-11-18
+ 20:36:50 +0000
+
+2006-09-24 Sunday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.198): Added one item.
+
+2006-09-24 Sunday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/max_space_dimension.hh (1.9): Fixed
+ Parma_Polyhedra_Library::max_space_dimension().
+
+2006-09-24 Sunday 17:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.78), BD_Shape.inlines.hh (1.130),
+ BD_Shape.templates.hh (1.25), Octagonal_Shape.defs.hh (1.8),
+ Octagonal_Shape.inlines.hh (1.6), Octagonal_Shape.templates.hh
+ (1.19): Added declarations and placeholder implementations of
+ methods total_memory_in_bytes() and external_memory_in_bytes().
+
+2006-09-24 Sunday 16:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.24): Exploited new utility function
+ is_additive_inverse() to improve readability.
+
+2006-09-24 Sunday 16:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.129): Added utility functions bool
+ is_even(m) and bool is_additive_inverse(m, n) to namespace
+ Implementation::BD_Shapes.
+
+2006-09-24 Sunday 14:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (1.11): [no log message]
+
+2006-09-24 Sunday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_widenings.cc (altnum.1): file Grid_widenings.cc was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.39), tests/Grid/containsintegerpoint1.cc
+ (1.2): Grid::contains_integer_point() fixed.
+
+2006-09-24 Sunday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/containsintegerpoint1.cc (altnum.1): file
+ containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+ 19:27:27 +0000
+
+2006-09-24 Sunday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/containsintegerpoint1.cc (interfaces.1): file
+ containsintegerpoint1.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/containsintegerpoint1.cc (octagons.1): file
+ containsintegerpoint1.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 13:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: Makefile.am (1.40), containsintegerpoint1.cc (1.1),
+ onepoint1.cc (1.2): Test program renamed. Comment revised.
+
+2006-09-24 Sunday 13:50 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.49): Some improvements when
+ `no-optimization' is involved. Now the enumeration solving
+ method accepts the `no-optimization' parameter. Some fixes in
+ maybe_check_result(): do not forget that the `no_optimization'
+ flag exists.
+
+2006-09-24 Sunday 12:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.32), src/Grid.templates.hh (1.20),
+ src/Grid_public.cc (1.38), tests/Grid/Makefile.am (1.39),
+ tests/Grid/onepoint1.cc (1.1): Revised comment in
+ src/Grid.templates.hh Added Grid::contains_integer_point()
+ method.
+
+2006-09-24 Sunday 12:24 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.12), MIP_Problem.defs.hh (1.9),
+ MIP_Problem.inlines.hh (1.9): Moved all throwing exceptions
+ methods from MIP_Problems.inlines.hh to MIP_Problems.cc, removing
+ the `inline' directive for each method. Added the method `const
+ Variables_Set& integer_space_dimensions() const'.
+
+2006-09-24 Sunday 11:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (1.2): New test test04()
+ shows an inaccuracy of the output procedure when dealing with
+ octagons having integer coefficients.
+
+2006-09-24 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (altnum.1): file
+ writeoctagon1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-24 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (interfaces.1): file
+ writeoctagon1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-24 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/writeoctagon1.cc (octagons.1): file
+ writeoctagon1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-24 Sunday 10:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: grid1.cc (1.18), grid2.cc (1.14), widening2.cc
+ (1.7): Revised comments.
+
+2006-09-24 Sunday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid1.cc (altnum.1): file grid1.cc was added on branch
+ altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid2.cc (altnum.1): file grid2.cc was added on branch
+ altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening2.cc (altnum.1): file widening2.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.197): The ask-and-tell generic construction has been
+ reimplemented.
+
+2006-09-24 Sunday 10:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.51): Useless template function
+ copy_compare() removed.
+
+2006-09-24 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Octagonal_Shape.templates.hh (1.18),
+ Pointset_Ask_Tell.defs.hh (1.5), Pointset_Powerset.defs.hh (1.4),
+ Polyhedron_public.cc (1.81), Polyhedron_widenings.cc (1.55):
+ Standardize on tags: CHECKME (with no space), FIXME, and TODO are
+ the only tags we use.
+
+2006-09-24 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (altnum.1): file
+ Pointset_Ask_Tell.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (interfaces.1): file
+ Pointset_Ask_Tell.defs.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.defs.hh (octagons.1): file
+ Pointset_Ask_Tell.defs.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.defs.hh (interfaces.1): file
+ Pointset_Powerset.defs.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/append1.cc (altnum.1): file append1.cc was added
+ on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/append1.cc (interfaces.1): file append1.cc was
+ added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/append1.cc (octagons.1): file append1.cc was added
+ on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.defs.hh (1.14), src/Ask_Tell.templates.hh (1.7),
+ src/Determinate.defs.hh (1.63), src/Determinate.inlines.hh
+ (1.54), tests/Ask_Tell/append1.cc (1.4):
+ Ask_Tell::upper_bound_assign() now uses a basic deabsorption
+ procedure.
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.templates.hh (altnum.1): file Ask_Tell.templates.hh
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.templates.hh (interfaces.1): file
+ Ask_Tell.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ask_Tell.templates.hh (octagons.1): file
+ Ask_Tell.templates.hh was added on branch octagons on 2006-11-18
+ 20:36:50 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/contains1.cc (altnum.1): file contains1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/contains1.cc (interfaces.1): file
+ contains1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/contains1.cc (octagons.1): file
+ contains1.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage3.cc (interfaces.1):
+ file generalizedaffineimage3.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage2.cc
+ (interfaces.1): file generalizedaffinepreimage2.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/linearsystem1.cc (altnum.1): file
+ linearsystem1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bhz03widening1.cc (altnum.1): file bhz03widening1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruences2.cc (altnum.1): file congruences2.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/equals1.cc (altnum.1): file equals1.cc was added on
+ branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/foldspacedims1.cc (altnum.1): file foldspacedims1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations3.cc (altnum.1): file relations3.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations3.cc (octagons.1): file relations3.cc was
+ added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-09-24 Sunday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/track_allocation.hh (1.19),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.47),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.40),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.96),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.126),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.120),
+ tests/Ask_Tell/append1.cc (1.3),
+ tests/BD_Shape/addconstraints1.cc (1.15),
+ tests/BD_Shape/affinepreimage1.cc (1.16),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.17),
+ tests/Grid/bhz03widening1.cc (1.11), tests/Grid/congruences2.cc
+ (1.4), tests/Grid/equals1.cc (1.11), tests/Grid/foldspacedims1.cc
+ (1.10), tests/Grid/grid1.cc (1.17), tests/Grid/relations2.cc
+ (1.13), tests/Grid/relations3.cc (1.5),
+ tests/Octagonal_Shape/contains1.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.2),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.2),
+ tests/Polyhedron/bhz03widening1.cc (1.12),
+ tests/Polyhedron/linearsystem1.cc (1.7),
+ tests/Polyhedron/polyhull1.cc (1.9): Spelling corrections.
+
+2006-09-24 Sunday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.38): Added template <typename PH> void
+ print_constraints(const Pointset_Ask_Tell<PH>&, const
+ std::string&, std::ostream&).
+
+2006-09-24 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: FCAIBVP.defs.hh (1.2), FCAIBVP.inlines.hh (1.2): Added
+ methods void weakening_assign(const FCAIBVP&) and static bool
+ has_nontrivial_weakening().
+
+2006-09-24 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.defs.hh (altnum.1): file FCAIBVP.defs.hh was added
+ on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.defs.hh (interfaces.1): file FCAIBVP.defs.hh was
+ added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-24 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.inlines.hh (altnum.1): file FCAIBVP.inlines.hh was
+ added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.inlines.hh (interfaces.1): file FCAIBVP.inlines.hh
+ was added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-23 Saturday 23:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Octagonal_Shape/: Makefile.am (1.2),
+ containsintegerpoint1.cc (1.1): Added new test for
+ Octagonal_Shape::contains_integer_points().
+
+2006-09-23 Saturday 23:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh (1.7), Octagonal_Shape.templates.hh
+ (1.17): Added new method bool
+ Octagonal_Shape::contains_integer_points() const.
+
+2006-09-23 Saturday 22:34 Andrea Cimino
+
+ * src/MIP_Problem.inlines.hh (1.8): Other little formatting
+ changes. Removed an useless comment.
+
+2006-09-23 Saturday 22:29 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.11), MIP_Problem.inlines.hh (1.7): Better
+ handled MIP_Problem `status' to avoid useless computations. Minor
+ stylistic changes.
+
+2006-09-23 Saturday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.198): Spelling corrections.
+
+2006-09-23 Saturday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.199), STANDARDS (1.35): Spelling corrections.
+
+2006-09-23 Saturday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_widenings.cc (1.54), checked_int.inlines.hh
+ (1.55): Identifiers improved.
+
+2006-09-23 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.23): Renamed a couple of
+ identifiers.
+
+2006-09-23 Saturday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.10): Revised the woring of a couple of
+ comments.
+
+2006-09-23 Saturday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.22): Updated.
+
+2006-09-23 Saturday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.31), Grid_conversion.cc (1.17),
+ Grid_simplify.cc (1.29): Got rid of tracing code that was
+ cluttering the sources.
+
+2006-09-23 Saturday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_conversion.cc (altnum.1): file Grid_conversion.cc was
+ added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_simplify.cc (altnum.1): file Grid_simplify.cc was added
+ on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 17:53 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.9): Fixed a couple of bugs in
+ is_mip_satisfiable() and solve_mip().
+
+2006-09-23 Saturday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.templates.hh (1.19), Grid_Generator.cc (1.18),
+ Grid_conversion.cc (1.16), Grid_public.cc (1.37): Use `tmp' to
+ denote a temporary: neither `tem' nor `temp'.
+
+2006-09-23 Saturday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.cc (altnum.1): file Grid_Generator.cc was
+ added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.53): Use square brackets for
+ literature citations.
+
+2006-09-23 Saturday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.48): The command parser now
+ recognizes the --no-mip (-r) option: this allows to consider
+ integer variables as real variables.
+
+2006-09-23 Saturday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.198), TODO (1.196), interfaces/C/ppl_c.cc (1.155),
+ interfaces/C/ppl_c.h.in (1.66),
+ interfaces/Prolog/Prolog_interface.dox (1.156),
+ interfaces/Prolog/ppl_prolog.icc (1.180),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.23),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.92),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.95),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.125),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.50),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.92),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.27),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.119), src/BD_Shape.defs.hh
+ (1.77), src/Polyhedron.defs.hh (1.307): Added C and Prolog
+ interfaces for Polyhedron::contains_integer_point().
+ Documentation improved. Added remainders to NEWS and TODO.
+
+2006-09-23 Saturday 16:01 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.8), MIP_Problem.defs.hh (1.8),
+ MIP_Problem.inlines.hh (1.6): Implemented is_satisfiable() for
+ real MIP Problems in a more efficient way.
+
+2006-09-23 Saturday 14:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.22): Minor readability improvements
+ to contains_integer_point(), as well as correcting a typo
+ resulting in a bug.
+
+2006-09-23 Saturday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.27), Watchdog/ChangeLog (1.16): Updated.
+
+2006-09-23 Saturday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LP_Problem.cc (1.35), MIP_Problem.cc (1.7),
+ Octagonal_Shape.templates.hh (1.16): Avoid unnecessary (and
+ silly) abbreviations.
+
+2006-09-23 Saturday 13:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.46), containsintegerpoint1.cc
+ (1.1): Added simple test for method contains_integer_point().
+
+2006-09-23 Saturday 13:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/containsintegerpoint1.cc (altnum.1): file
+ containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-09-23 Saturday 13:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/containsintegerpoint1.cc (interfaces.1): file
+ containsintegerpoint1.cc was added on branch interfaces on
+ 2006-09-28 20:46:31 +0000
+
+2006-09-23 Saturday 13:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/containsintegerpoint1.cc (octagons.1): file
+ containsintegerpoint1.cc was added on branch octagons on
+ 2006-11-18 20:36:56 +0000
+
+2006-09-23 Saturday 13:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.76), BD_Shape.templates.hh (1.21):
+ Added declaration and tentative implementation of method bool
+ BD_Shape<T>::contains_integer_point() const.
+
+2006-09-23 Saturday 13:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.15): Avoid pleonastic
+ comments.
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.cc (altnum.1): file Congruence.cc was added on
+ branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.cc (altnum.1): file Congruence_System.cc
+ was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.defs.hh (altnum.1): file
+ Congruence_System.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.inlines.hh (altnum.1): file
+ Direct_Product.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.inlines.hh (octagons.1): file
+ Direct_Product.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:50 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.cc (altnum.1): file Grid_Certificate.cc was
+ added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.cc (altnum.1): file
+ Grid_Generator_System.cc was added on branch altnum on 2006-10-29
+ 19:27:13 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.cc (altnum.1): file Grid_Status.cc was added on
+ branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_chdims.cc (altnum.1): file Grid_chdims.cc was added on
+ branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (altnum.1): file Grid_nonpublic.cc was
+ added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (interfaces.1): file OR_Matrix.defs.hh was
+ added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.templates.hh (interfaces.1): file
+ OR_Matrix.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.idefs.hh (altnum.1): file Og_Status.idefs.hh was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.idefs.hh (interfaces.1): file Og_Status.idefs.hh
+ was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.inlines.hh (altnum.1): file Og_Status.inlines.hh
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.inlines.hh (interfaces.1): file
+ Og_Status.inlines.hh was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh (altnum.1): file
+ Pointset_Ask_Tell.templates.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh (interfaces.1): file
+ Pointset_Ask_Tell.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.templates.hh (octagons.1): file
+ Pointset_Ask_Tell.templates.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.templates.hh (interfaces.1): file
+ Pointset_Powerset.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (altnum.1): file mp_numeric_limits.hh
+ was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/namespaces.hh (altnum.1): file namespaces.hh was added on
+ branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.inlines.hh (1.14), BD_Shape.cc (1.3),
+ BD_Shape.defs.hh (1.75), BD_Shape.inlines.hh (1.128),
+ BD_Shape.templates.hh (1.20), Bounding_Box.defs.hh (1.15),
+ Checked_Number.defs.hh (1.79), Congruence.cc (1.13),
+ Congruence.inlines.hh (1.12), Congruence_System.cc (1.20),
+ Congruence_System.defs.hh (1.16), Constraint_System.cc (1.19),
+ Constraint_System.defs.hh (1.33), DB_Matrix.defs.hh (1.24),
+ DB_Matrix.templates.hh (1.2), Direct_Product.inlines.hh (1.26),
+ Generator_System.cc (1.19), Generator_System.defs.hh (1.20),
+ Grid.defs.hh (1.30), Grid.templates.hh (1.18),
+ Grid_Certificate.cc (1.5), Grid_Generator_System.cc (1.15),
+ Grid_Status.cc (1.5), Grid_chdims.cc (1.13), Grid_conversion.cc
+ (1.15), Grid_nonpublic.cc (1.20), Grid_public.cc (1.36),
+ Grid_simplify.cc (1.28), Grid_widenings.cc (1.10), LP_Problem.cc
+ (1.34), LP_Problem.defs.hh (1.23), Linear_System.cc (1.39),
+ Linear_System.defs.hh (1.28), MIP_Problem.cc (1.6),
+ MIP_Problem.defs.hh (1.7), Matrix.cc (1.94), OR_Matrix.defs.hh
+ (1.5), OR_Matrix.templates.hh (1.3), Octagonal_Shape.defs.hh
+ (1.6), Octagonal_Shape.templates.hh (1.14), Og_Status.idefs.hh
+ (1.5), Og_Status.inlines.hh (1.3), Ph_Status.cc (1.11),
+ Pointset_Ask_Tell.defs.hh (1.4), Pointset_Ask_Tell.templates.hh
+ (1.6), Pointset_Powerset.defs.hh (1.3),
+ Pointset_Powerset.templates.hh (1.4), Polyhedron_nonpublic.cc
+ (1.67), Polyhedron_public.cc (1.80), Powerset.defs.hh (1.28),
+ Saturation_Matrix.cc (1.10), Saturation_Row.cc (1.11),
+ Saturation_Row.defs.hh (1.11), checked.inlines.hh (1.32),
+ checked_int.inlines.hh (1.54), conversion.cc (1.78),
+ fpu-ia32.inlines.hh (1.14), mp_numeric_limits.hh (1.8),
+ namespaces.hh (1.9): Fixed lots of spelling mistakes. Badly
+ named variables renamed. Long lines split. Code formatting
+ improvements.
+
+2006-09-23 Saturday 13:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.cc (altnum.1): file BD_Shape.cc was added on branch
+ altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 12:59 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.5), MIP_Problem.inlines.hh (1.5): Cleaned
+ solve() method. Removed a bit of useless code in solve_mip().
+
+2006-09-23 Saturday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.195), src/Polyhedron_public.cc (1.79): A few adjustments
+ to Polyhedron::contains_integer_point(); currently we cannot
+ handle the case of strict inequalities.
+
+2006-09-23 Saturday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/membytes1.cc (1.10): test02() fails with 8-bit
+ coefficients.
+
+2006-09-22 Friday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.inlines.hh (1.14), Ask_Tell.templates.hh (1.6),
+ Pointset_Ask_Tell.templates.hh (1.5):
+ Ask_Tell::upper_bound_assign() moved to Ask_Tell.templates.hh.
+ Restored commented out code in Ask_Tell::OK(). Fixed
+ Pointset_Ask_Tell::remove_space_dimensions().
+
+2006-09-22 Friday 20:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.306), Polyhedron_public.cc (1.78):
+ Added a first, tentative implementation of
+ Polyhedron::contains_integer_point().
+
+2006-09-22 Friday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.cc (1.4): Formatting fixed.
+
+2006-09-22 Friday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.templates.hh (1.19), Grid_chdims.cc (1.12),
+ Octagonal_Shape.templates.hh (1.13), Polyhedron_chdims.cc (1.38):
+ Use the services provided by Variables_Set.
+
+2006-09-22 Friday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh (1.2): Fixed the documentation of
+ Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh (altnum.1): file Variables_Set.defs.hh
+ was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.defs.hh (interfaces.1): file
+ Variables_Set.defs.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.inlines.hh (1.2): Fixed
+ Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.inlines.hh (altnum.1): file
+ Variables_Set.inlines.hh was added on branch altnum on 2006-10-29
+ 19:27:15 +0000
+
+2006-09-22 Friday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.inlines.hh (interfaces.1): file
+ Variables_Set.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 17:23 Andrea Cimino
+
+ * src/MIP_Problem.inlines.hh (1.4): Solved a bug in MIP_Problem.
+ Added some tests for MIP_Problem.
+
+2006-09-22 Friday 16:45 Andrea Cimino
+
+ * src/: MIP_Problem.cc (1.3), MIP_Problem.defs.hh (1.6),
+ MIP_Problem.inlines.hh (1.3): Implemented is_satisfiable for the
+ `MIP' case.
+
+2006-09-22 Friday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.34): Added a point covering tests programs that
+ require auxiliary functions.
+
+2006-09-22 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: MIP_Problem.defs.hh (1.5), MIP_Problem.templates.hh (1.5),
+ globals.types.hh (1.8): Redundant MIP_Problem constructor
+ removed. Removed also the Variables_Integrality enumeration.
+
+2006-09-22 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.templates.hh (interfaces.1): file
+ MIP_Problem.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh (altnum.1): file globals.types.hh was added
+ on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 15:41 Elena Mazzi
+
+ * tests/BD_Shape/mapspacedims1.cc (1.13): Rewritten test04 using
+ the method BD_Shape::minimized_constraints().
+
+2006-09-22 Friday 15:40 Elena Mazzi
+
+ * tests/BD_Shape/universe1.cc (1.13): Added two new tests on the
+ method BD_Shape::is_universe().
+
+2006-09-22 Friday 15:39 Elena Mazzi
+
+ * tests/BD_Shape/removespacedims1.cc (1.16): Added two new tests on
+ the method BD_Shape::remove_space_dimensions() and
+ BD_Shape::remove_higher_space_dimensions().
+
+2006-09-22 Friday 15:38 Elena Mazzi
+
+ * tests/BD_Shape/intersection1.cc (1.15): Added two new tests on
+ the method BD_Shape::intersection_assign().
+
+2006-09-22 Friday 15:36 Elena Mazzi
+
+ * tests/BD_Shape/contains1.cc (1.13): Added two new tests on the
+ method BD_Shape::contains().
+
+2006-09-22 Friday 15:34 Elena Mazzi
+
+ * tests/BD_Shape/bdshull1.cc (1.12): Added new test on the method
+ BD_Shape::bds_hull_assign_and_minimize().
+
+2006-09-22 Friday 15:33 Andrea Cimino
+
+ * src/MIP_Problem.cc (1.2): Added a first implementation that
+ handles MIP_Problems.
+
+2006-09-22 Friday 15:33 Elena Mazzi
+
+ * tests/BD_Shape/addspacedims1.cc (1.13): Added new two tests on
+ the methods BD_Shape::add_space_dimensions_and_project() and
+ BD_Shape::add_space_dimensions_and_embed().
+
+2006-09-22 Friday 15:28 Andrea Cimino
+
+ * src/: MIP_Problem.defs.hh (1.4), MIP_Problem.inlines.hh (1.2),
+ MIP_Problem.templates.hh (1.4): Added a first implementation that
+ handles MIP_Problems.
+
+2006-09-22 Friday 14:25 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (1.5): Removed a redundant
+ assertion 'assertion(OK())' in inline void
+ Octagonal_Shape<T>::add_constraints().
+
+2006-09-22 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.10): Useless stuff removed.
+ Test more classes.
+
+2006-09-22 Friday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/matrix1.cc (altnum.1): file matrix1.cc was added
+ on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-22 Friday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/matrix1.cc (1.8): test01() made self-contained.
+
+2006-09-22 Friday 13:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.99), membytes1.cc (1.9),
+ membytes2.cc (1.8): Made membytes1.cc conformant to the PPL
+ standards. The test formerly in membytes2.cc is now test02() in
+ membytes1.cc.
+
+2006-09-22 Friday 13:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/iterator_to_const.defs.hh (1.2): Restored a few access
+ restrictions; added corresponding friend declarations.
+
+2006-09-22 Friday 12:57 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (1.4): Removed a redundant
+ assertion 'assert(OK())' in the constructor inline
+ Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs).
+
+2006-09-22 Friday 12:06 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.12): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-09-22 Friday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: ciao_pl_check.pl (1.22), ppl_ciao.pl
+ (1.91): Corrected a few typos.
+
+2006-09-22 Friday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.98): XFAIL_WITH_INT8 no longer
+ includes membytes1.
+
+2006-09-22 Friday 11:16 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.11): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::generalized_affine_image().
+
+2006-09-22 Friday 08:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Ask_Tell.inlines.hh (1.13): Avoid redundant template
+ parameter specifications.
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.74), BD_Shape.templates.hh (1.18),
+ Direct_Product.defs.hh (1.29), Direct_Product.inlines.hh (1.25),
+ Grid.defs.hh (1.29), Grid_Generator_System.cc (1.14),
+ Grid_Generator_System.defs.hh (1.19), Grid_chdims.cc (1.11),
+ MIP_Problem.defs.hh (1.3), MIP_Problem.templates.hh (1.3),
+ Makefile.am (1.160), Octagonal_Shape.defs.hh (1.5),
+ Pointset_Ask_Tell.defs.hh (1.3), Pointset_Ask_Tell.templates.hh
+ (1.4), Pointset_Powerset.defs.hh (1.2),
+ Pointset_Powerset.templates.hh (1.3), Polyhedron.defs.hh (1.305),
+ Polyhedron_chdims.cc (1.37), Variable.cc (1.21), Variable.defs.hh
+ (1.52), Variables_Set.cc (1.1), Variables_Set.defs.hh (1.1),
+ Variables_Set.inlines.hh (1.1), Variables_Set.types.hh (1.1):
+ Variables_Set is now a fully fledged class.
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (altnum.1): file
+ Direct_Product.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:12 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (octagons.1): file
+ Direct_Product.defs.hh was added on branch octagons on 2006-11-18
+ 20:36:50 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.defs.hh (altnum.1): file
+ Grid_Generator_System.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.cc (altnum.1): file Variables_Set.cc was added
+ on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.cc (interfaces.1): file Variables_Set.cc was
+ added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.types.hh (altnum.1): file
+ Variables_Set.types.hh was added on branch altnum on 2006-10-29
+ 19:27:15 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.types.hh (interfaces.1): file
+ Variables_Set.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variables_Set.types.hh (octagons.1): file
+ Variables_Set.types.hh was added on branch octagons on 2006-11-18
+ 20:36:51 +0000
+
+2006-09-21 Thursday 17:48 Elena Mazzi
+
+ * src/: BD_Shape.inlines.hh (1.127), BD_Shape.templates.hh (1.17):
+ Moved some assertions 'assert(OK())' where they are really needed
+ in the methods: - void BD_Shape<T>::affine_preimage(); -
+ BD_Shape(const dimension_type num_dimensions, const
+ Degenerate_Element kind).
+
+2006-09-21 Thursday 16:34 Elena Mazzi
+
+ * src/BD_Shape.inlines.hh (1.126): Removed a useless assertion
+ 'assert(OK())' from the method inline void
+ BD_Shape<T>::add_dbm_constraint().
+
+2006-09-21 Thursday 16:05 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.10): Moved some assertions
+ 'assert(OK())' where they are needed in the method
+ void Octagonal_Shape<T>::affine_preimage().
+
+2006-09-21 Thursday 15:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: MIP_Problem.defs.hh (1.2), MIP_Problem.templates.hh (1.2):
+ Class documentation revised. Added two new constructors: one
+ takes a set of variables that are constrained to take an integer
+ value; the other takes a shorthand concerning the integrality of
+ all or no variables.
+
+2006-09-21 Thursday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.types.hh (1.7): New enumeration Variables_Integrality
+ encodes assertions concerning the integrality of a set of
+ variables.
+
+2006-09-21 Thursday 15:26 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (1.3): Removed a useless assertion
+ 'assert(OK())' from the method inline void
+ Octagonal_Shape<T>::add_octagonal_constraint().
+
+2006-09-21 Thursday 14:45 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.9): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::limited_BHMZ05_extrapolation_assign().
+
+2006-09-21 Thursday 14:04 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.8): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::limited_CC76_extrapolation_assign().
+
+2006-09-21 Thursday 13:50 Andrea Cimino
+
+ * tests/Polyhedron/membytes1.cc (1.8): Modified to be compliant to
+ the new standards.
+
+2006-09-21 Thursday 13:44 Andrea Cimino
+
+ * src/LP_Problem.defs.hh (1.22): Fixed some typos in the
+ documentation, thanks to Sebastian Pop.
+
+2006-09-21 Thursday 13:28 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.7): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::map_space_dimensions().
+
+2006-09-21 Thursday 13:19 Andrea Cimino
+
+ * tests/Polyhedron/maxspacedim1.cc (1.9): Modified to be compliant
+ to the new standards.
+
+2006-09-21 Thursday 13:16 Andrea Cimino
+
+ * tests/Polyhedron/matrix1.cc (1.7): Modified to be compliant to
+ the new standards.
+
+2006-09-21 Thursday 13:11 Andrea Cimino
+
+ * tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.7): Modified
+ to be compliant to the new standards.
+
+2006-09-21 Thursday 13:08 Andrea Cimino
+
+ * tests/Polyhedron/append2.cc (1.8): Modified to be compliant to
+ the new standards.
+
+2006-09-21 Thursday 13:04 Elena Mazzi
+
+ * src/: BD_Shape.inlines.hh (1.125), BD_Shape.templates.hh (1.16):
+ Removed some redundant assertions `assert(OK())' from: -
+ concatenate_assign(); - map_space_dimensions(); -
+ limited_CC76_extrapolation_assign(); -
+ limited_BHMZ05_extrapolation_assign(); -
+ generalized_affine_image(); - generalized_affine_preimage(); -
+ BD_Shape(const Generator_System& gs); - BD_Shape(const
+ Constraint_System& cs).
+
+2006-09-21 Thursday 12:55 Andrea Cimino
+
+ * tests/Polyhedron/append1.cc (1.9): Modified to be compliant to
+ the new standards.
+
+2006-09-21 Thursday 12:45 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.6): Removed a redundant
+ assertion 'assert(OK())' from the method void
+ Octagonal_Shape<T>::concatenate_assign().
+
+2006-09-21 Thursday 12:09 quartieri
+
+ * src/Octagonal_Shape.templates.hh (1.5): Removed a redundant
+ assertion 'assert(OK())' from the constructor
+ Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs).
+
+2006-09-21 Thursday 11:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: MIP_Problem.cc (1.1), MIP_Problem.defs.hh (1.1),
+ MIP_Problem.inlines.hh (1.1), MIP_Problem.templates.hh (1.1),
+ MIP_Problem.types.hh (1.1), Makefile.am (1.159): MIP_Problem
+ files put under CVS control.
+
+2006-09-21 Thursday 11:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.types.hh (altnum.1): file MIP_Problem.types.hh
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-21 Thursday 11:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.types.hh (interfaces.1): file
+ MIP_Problem.types.hh was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-21 Thursday 11:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/MIP_Problem.types.hh (octagons.1): file MIP_Problem.types.hh
+ was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-09-21 Thursday 11:24 Andrea Cimino
+
+ * tests/Polyhedron/exceptions3.cc (1.9): Made exceptions3.cc more
+ compliant to the new test policy.
+
+2006-09-21 Thursday 11:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.21): LP_Problem now only depends on the
+ name of class Constraint_System.
+
+2006-09-21 Thursday 11:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh (1.32): Removed useless friend
+ declaration.
+
+2006-09-21 Thursday 11:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/iterator_to_const.inlines.hh (1.2): Corrected a couple of
+ Doxygen \relates commands.
+
+2006-09-21 Thursday 11:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.inlines.hh (altnum.1): file
+ iterator_to_const.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 11:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.inlines.hh (interfaces.1): file
+ iterator_to_const.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 11:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.inlines.hh (octagons.1): file
+ iterator_to_const.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-21 Thursday 11:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_Expression.defs.hh (1.31): Avoid useless inclusion.
+
+2006-09-21 Thursday 11:12 Andrea Cimino
+
+ * tests/Polyhedron/exceptions2.cc (1.10): Made exceptions2.cc more
+ compliant to the new test policy.
+
+2006-09-21 Thursday 10:46 Andrea Cimino
+
+ * tests/Polyhedron/exceptions1.cc (1.11): The exceptions tests are
+ now more consistent to what defined in STANDARDS.
+
+2006-09-21 Thursday 10:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.76), devref.doxyconf-latex.in
+ (1.15): Let iterator_to_const.*, Ask_Tell.* and
+ Pointset_Ask_Tell.* files participate to the generation of the
+ devref manuals.
+
+2006-09-21 Thursday 10:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.20): A few further improvements to the
+ devref documentation.
+
+2006-09-21 Thursday 10:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.19): Do not let the user assume that we
+ solve the LP Problem by using a fixed algorithm (future releases
+ may use a different one).
+
+2006-09-21 Thursday 10:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.18): Corrected documentation for
+ add_constraints.
+
+2006-09-21 Thursday 09:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.17): A few improvements to the
+ documentation. Declare the std::swap specialization before
+ defining it.
+
+2006-09-21 Thursday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Pointset_Ask_Tell.defs.hh (1.2),
+ Pointset_Ask_Tell.templates.hh (1.3): Unwanted stuff removed.
+
+2006-09-21 Thursday 07:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (1.16): Dratfed some initial user
+ documentation for LP_Problem.
+
+2006-09-20 Wednesday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.inlines.hh (1.12), Ask_Tell.templates.hh (1.5),
+ Pointset_Ask_Tell.templates.hh (1.2): Implemented
+ Ask_Tell::empty(), Pointset_Ask_Tell::concatenate_assign(),
+ Pointset_Ask_Tell::remove_space_dimensions() and
+ Pointset_Ask_Tell::remove_higher_space_dimensions().
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (altnum.1): file powerset1.cc was
+ added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BBox.cc (1.12), FCAIBVP.cc (1.1), FCAIBVP.defs.hh (1.1),
+ FCAIBVP.inlines.hh (1.1), FCAIBVP.types.hh (1.1), Makefile.am
+ (1.258), Partial_Function.cc (1.3), ppl_test.hh (1.50),
+ Ask_Tell/append1.cc (1.2), Polyhedron/powerset1.cc (1.18): New
+ test class FCAIBVP used to factorize some common code. Missing
+ inclusions added.
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.cc (altnum.1): file FCAIBVP.cc was added on branch
+ altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.cc (interfaces.1): file FCAIBVP.cc was added on
+ branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.types.hh (altnum.1): file FCAIBVP.types.hh was
+ added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.types.hh (interfaces.1): file FCAIBVP.types.hh was
+ added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/FCAIBVP.types.hh (octagons.1): file FCAIBVP.types.hh was
+ added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-09-20 Wednesday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.cc (altnum.1): file Partial_Function.cc
+ was added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/.cvsignore (altnum.1): file .cvsignore was added
+ on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/.cvsignore (interfaces.1): file .cvsignore was
+ added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/.cvsignore (octagons.1): file .cvsignore was added
+ on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/.cvsignore (simplex.1): file .cvsignore was added
+ on branch simplex on 2008-01-07 11:15:35 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/Makefile.am (altnum.1): file Makefile.am was added
+ on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/Makefile.am (interfaces.1): file Makefile.am was
+ added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Ask_Tell/Makefile.am (octagons.1): file Makefile.am was
+ added on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.cc (altnum.1): file Pointset_Ask_Tell.cc
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.cc (interfaces.1): file
+ Pointset_Ask_Tell.cc was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.cc (octagons.1): file Pointset_Ask_Tell.cc
+ was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.inlines.hh (altnum.1): file
+ Pointset_Ask_Tell.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.inlines.hh (interfaces.1): file
+ Pointset_Ask_Tell.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.inlines.hh (octagons.1): file
+ Pointset_Ask_Tell.inlines.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.types.hh (altnum.1): file
+ Pointset_Ask_Tell.types.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.types.hh (interfaces.1): file
+ Pointset_Ask_Tell.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Ask_Tell.types.hh (octagons.1): file
+ Pointset_Ask_Tell.types.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (altnum.1): file Pointset_Powerset.cc
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.cc (interfaces.1): file
+ Pointset_Powerset.cc was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.inlines.hh (interfaces.1): file
+ Pointset_Powerset.inlines.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.types.hh (altnum.1): file
+ iterator_to_const.types.hh was added on branch altnum on
+ 2006-10-29 19:27:15 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.types.hh (interfaces.1): file
+ iterator_to_const.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/iterator_to_const.types.hh (octagons.1): file
+ iterator_to_const.types.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.197), configure.ac (1.236), src/Ask_Tell.defs.hh (1.13),
+ src/Ask_Tell.templates.hh (1.4), src/Makefile.am (1.158),
+ src/Pointset_Ask_Tell.cc (1.1), src/Pointset_Ask_Tell.defs.hh
+ (1.1), src/Pointset_Ask_Tell.inlines.hh (1.1),
+ src/Pointset_Ask_Tell.templates.hh (1.1),
+ src/Pointset_Ask_Tell.types.hh (1.1), src/Pointset_Powerset.cc
+ (1.2), src/Pointset_Powerset.inlines.hh (1.2),
+ src/Pointset_Powerset.templates.hh (1.2), src/Powerset.defs.hh
+ (1.27), src/Powerset.inlines.hh (1.18),
+ src/iterator_to_const.defs.hh (1.1),
+ src/iterator_to_const.inlines.hh (1.1),
+ src/iterator_to_const.types.hh (1.1), tests/Makefile.am (1.257),
+ tests/Ask_Tell/.cvsignore (1.1), tests/Ask_Tell/Makefile.am
+ (1.1), tests/Ask_Tell/append1.cc (1.1),
+ tests/Polyhedron/powerset1.cc (1.17): The classes
+ Powerset::omega_iterator and Powerset::omega_const_iterator have
+ been replaced by the classes template <typename Container>
+ iterator_to_const and template <typename Container> const
+ iterator_to_const. Implementation of the Ask_Tell class is
+ almost complete. Added a first sketch (mostly obtained by
+ copy-and-paste) of the new class Pointset_Ask_Tell.
+
+2006-09-20 Wednesday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: ppl_xsb.H (1.49), ppl_xsb.cc (1.91),
+ xsb_pl_check.P (1.26): Adapted to the chnages in the LP_Problem
+ interface.
+
+2006-09-20 Wednesday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc (1.7): Fixed a bug in print_clock().
+
+2006-09-20 Wednesday 09:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.196): Added a short description of the new features
+ provided by LP_Problem.
+
+2006-09-20 Wednesday 09:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.47): Adapted to the new LP_Problem
+ interface.
+
+2006-09-20 Wednesday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.15),
+ src/Octagonal_Shape.templates.hh (1.4),
+ src/Polyhedron.templates.hh (1.3), src/Polyhedron_nonpublic.cc
+ (1.66), interfaces/C/ppl_c.cc (1.154), interfaces/C/ppl_c.h.in
+ (1.65), interfaces/Prolog/Prolog_interface.dox (1.155),
+ interfaces/Prolog/ppl_prolog.icc (1.179),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.21),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.90),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.61),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.94),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.124),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.118),
+ interfaces/Prolog/tests/pl_check.pl (1.32): Adapted to the new
+ LP_Problem interface.
+
+2006-09-20 Wednesday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.157): Do consider new source file
+ LP_Problem.templates.hh.
+
+2006-09-20 Wednesday 09:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc (1.33), LP_Problem.defs.hh (1.15),
+ LP_Problem.inlines.hh (1.11), LP_Problem.templates.hh (1.1): The
+ constructors of LP_Problem now take the space dimension as an
+ explicit argument. Exception thrown if this exceeds the maximum
+ allowed space dim. Adding a constraint no longer automatically
+ adjusts space dimensions; exception thrown if the space dimension
+ of the constraint exceeds that of the LP_Problem; the latter can
+ be extended by new method add_space_dimensions_and_embed. Method
+ constraints() returning (a copy of) the constraint system
+ defining the feasible region replaced by const_iterator's
+ (constraints_begin() and constraints_end()). Also added a
+ templatic method that adds a sequence of constraints using
+ iterators.
+
+2006-09-20 Wednesday 09:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.templates.hh (interfaces.1): file
+ LP_Problem.templates.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 08:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.16): Work around bugs in GCC
+ 3.3.3.
+
+2006-09-19 Tuesday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.195): Introduce the new Octagonal_Shape class.
+
+2006-09-19 Tuesday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (1.3): Indentation fixes. Never
+ leave an operator at end of line. Useless inclusions removed.
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage1.cc (interfaces.1): file
+ affineimage1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage2.cc (altnum.1): file
+ affineimage2.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage2.cc (interfaces.1): file
+ affineimage2.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affineimage2.cc (octagons.1): file
+ affineimage2.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage1.cc (interfaces.1): file
+ affinepreimage1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage2.cc (altnum.1): file
+ affinepreimage2.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage2.cc (interfaces.1): file
+ affinepreimage2.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinepreimage2.cc (octagons.1): file
+ affinepreimage2.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/ascii_dump_load1.cc (altnum.1): file
+ ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/ascii_dump_load1.cc (interfaces.1): file
+ ascii_dump_load1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/ascii_dump_load1.cc (octagons.1): file
+ ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhmz05widening1.cc (interfaces.1): file
+ bhmz05widening1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhz03widening1.cc (altnum.1): file
+ bhz03widening1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhz03widening1.cc (interfaces.1): file
+ bhz03widening1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bhz03widening1.cc (octagons.1): file
+ bhz03widening1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounded1.cc (altnum.1): file bounded1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounded1.cc (interfaces.1): file
+ bounded1.cc was added on branch interfaces on 2006-09-28 20:46:32
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/bounded1.cc (octagons.1): file bounded1.cc
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76extrapolation1.cc (interfaces.1): file
+ cc76extrapolation1.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/cc76narrowing1.cc (interfaces.1): file
+ cc76narrowing1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/chinainit.cc (altnum.1): file chinainit.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/chinainit.cc (interfaces.1): file
+ chinainit.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/chinainit.cc (octagons.1): file
+ chinainit.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/concatenate1.cc (altnum.1): file
+ concatenate1.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/concatenate1.cc (interfaces.1): file
+ concatenate1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/concatenate1.cc (octagons.1): file
+ concatenate1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/constraints1.cc (altnum.1): file
+ constraints1.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/constraints1.cc (interfaces.1): file
+ constraints1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/constraints1.cc (octagons.1): file
+ constraints1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/empty1.cc (altnum.1): file empty1.cc was
+ added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/empty1.cc (interfaces.1): file empty1.cc
+ was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/empty1.cc (octagons.1): file empty1.cc was
+ added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromgensys1.cc (altnum.1): file
+ fromgensys1.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromgensys1.cc (interfaces.1): file
+ fromgensys1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/fromgensys1.cc (octagons.1): file
+ fromgensys1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frompolyhedron1.cc (altnum.1): file
+ frompolyhedron1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frompolyhedron1.cc (interfaces.1): file
+ frompolyhedron1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/frompolyhedron1.cc (octagons.1): file
+ frompolyhedron1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage1.cc (altnum.1): file
+ generalizedaffineimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage1.cc (interfaces.1):
+ file generalizedaffineimage1.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage1.cc (octagons.1):
+ file generalizedaffineimage1.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage2.cc (altnum.1): file
+ generalizedaffineimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage2.cc (interfaces.1):
+ file generalizedaffineimage2.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage2.cc (octagons.1):
+ file generalizedaffineimage2.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage4.cc (altnum.1): file
+ generalizedaffineimage4.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage4.cc (interfaces.1):
+ file generalizedaffineimage4.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage4.cc (octagons.1):
+ file generalizedaffineimage4.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage5.cc (altnum.1): file
+ generalizedaffineimage5.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage5.cc (interfaces.1):
+ file generalizedaffineimage5.cc was added on branch interfaces on
+ 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffineimage5.cc (octagons.1):
+ file generalizedaffineimage5.cc was added on branch octagons on
+ 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage1.cc
+ (interfaces.1): file generalizedaffinepreimage1.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage3.cc
+ (interfaces.1): file generalizedaffinepreimage3.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage4.cc (altnum.1):
+ file generalizedaffinepreimage4.cc was added on branch altnum on
+ 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage4.cc
+ (interfaces.1): file generalizedaffinepreimage4.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/generalizedaffinepreimage4.cc (octagons.1):
+ file generalizedaffinepreimage4.cc was added on branch octagons
+ on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/intersection1.cc (interfaces.1): file
+ intersection1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+ (interfaces.1): file limitedbhmz05extrapolation1.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/limitedcc76extrapolation1.cc
+ (interfaces.1): file limitedcc76extrapolation1.cc was added on
+ branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/mapspacedims1.cc (altnum.1): file
+ mapspacedims1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/mapspacedims1.cc (interfaces.1): file
+ mapspacedims1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim.cc (altnum.1): file
+ maxspacedim.cc was added on branch altnum on 2006-10-29 19:27:31
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/maxspacedim.cc (interfaces.1): file
+ maxspacedim.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/minconstraints1.cc (interfaces.1): file
+ minconstraints1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octdifference1.cc (interfaces.1): file
+ octdifference1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/octhull1.cc (interfaces.1): file
+ octhull1.cc was added on branch interfaces on 2006-09-28 20:46:32
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons1.cc (altnum.1): file
+ relatwithcons1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons1.cc (interfaces.1): file
+ relatwithcons1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons1.cc (octagons.1): file
+ relatwithcons1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithcons2.cc (interfaces.1): file
+ relatwithcons2.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/relatwithgen1.cc (interfaces.1): file
+ relatwithgen1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/removespacedims1.cc (interfaces.1): file
+ removespacedims1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/run_tests (altnum.1): file run_tests was
+ added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/run_tests (interfaces.1): file run_tests
+ was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/run_tests (octagons.1): file run_tests was
+ added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/timeelapse1.cc (interfaces.1): file
+ timeelapse1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/universe1.cc (altnum.1): file universe1.cc
+ was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/universe1.cc (interfaces.1): file
+ universe1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/universe1.cc (octagons.1): file
+ universe1.cc was added on branch octagons on 2006-11-18 20:36:59
+ +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/.cvsignore (altnum.1): file .cvsignore was
+ added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/.cvsignore (interfaces.1): file .cvsignore
+ was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/.cvsignore (octagons.1): file .cvsignore
+ was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/.cvsignore (simplex.1): file .cvsignore was
+ added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/addspacedims1.cc (altnum.1): file
+ addspacedims1.cc was added on branch altnum on 2006-10-29
+ 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/addspacedims1.cc (interfaces.1): file
+ addspacedims1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/addspacedims1.cc (octagons.1): file
+ addspacedims1.cc was added on branch octagons on 2006-11-18
+ 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Octagonal_Shape/affinedimension1.cc (interfaces.1): file
+ affinedimension1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.235), tests/Makefile.am (1.256),
+ tests/Octagonal_Shape/.cvsignore (1.1),
+ tests/Octagonal_Shape/Makefile.am (1.1),
+ tests/Octagonal_Shape/addspacedims1.cc (1.1),
+ tests/Octagonal_Shape/affinedimension1.cc (1.1),
+ tests/Octagonal_Shape/affineimage1.cc (1.1),
+ tests/Octagonal_Shape/affineimage2.cc (1.1),
+ tests/Octagonal_Shape/affinepreimage1.cc (1.1),
+ tests/Octagonal_Shape/affinepreimage2.cc (1.1),
+ tests/Octagonal_Shape/ascii_dump_load1.cc (1.1),
+ tests/Octagonal_Shape/bhmz05widening1.cc (1.1),
+ tests/Octagonal_Shape/bhz03widening1.cc (1.1),
+ tests/Octagonal_Shape/bounded1.cc (1.1),
+ tests/Octagonal_Shape/cc76extrapolation1.cc (1.1),
+ tests/Octagonal_Shape/cc76narrowing1.cc (1.1),
+ tests/Octagonal_Shape/chinainit.cc (1.1),
+ tests/Octagonal_Shape/concatenate1.cc (1.1),
+ tests/Octagonal_Shape/constraints1.cc (1.1),
+ tests/Octagonal_Shape/contains1.cc (1.1),
+ tests/Octagonal_Shape/empty1.cc (1.1),
+ tests/Octagonal_Shape/fromgensys1.cc (1.1),
+ tests/Octagonal_Shape/frompolyhedron1.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffineimage1.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffineimage2.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffineimage3.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffineimage4.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffineimage5.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.1),
+ tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.1),
+ tests/Octagonal_Shape/intersection1.cc (1.1),
+ tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.1),
+ tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.1),
+ tests/Octagonal_Shape/mapspacedims1.cc (1.1),
+ tests/Octagonal_Shape/maxspacedim.cc (1.1),
+ tests/Octagonal_Shape/minconstraints1.cc (1.1),
+ tests/Octagonal_Shape/octdifference1.cc (1.1),
+ tests/Octagonal_Shape/octhull1.cc (1.1),
+ tests/Octagonal_Shape/relatwithcons1.cc (1.1),
+ tests/Octagonal_Shape/relatwithcons2.cc (1.1),
+ tests/Octagonal_Shape/relatwithgen1.cc (1.1),
+ tests/Octagonal_Shape/removespacedims1.cc (1.1),
+ tests/Octagonal_Shape/run_tests (1.1),
+ tests/Octagonal_Shape/timeelapse1.cc (1.1),
+ tests/Octagonal_Shape/universe1.cc (1.1),
+ tests/Octagonal_Shape/writeoctagon1.cc (1.1): Directory
+ tests/Octagon renamed tests/Octagonal_Shape.
+
+2006-09-19 Tuesday 20:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.90): Reverted previous change
+ (it was only meant for XSB 3.0.1).
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bgp99extrapolation1.cc (altnum.1): file
+ bgp99extrapolation1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bhz03widening1.cc (altnum.1): file
+ bhz03widening1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/geomcovers1.cc (altnum.1): file geomcovers1.cc was
+ added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/membytes1.cc (altnum.1): file membytes1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (altnum.1): file
+ pointsetpowerset1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/pointsetpowerset1.cc (interfaces.1): file
+ pointsetpowerset1.cc was added on branch interfaces on 2006-09-28
+ 20:46:32 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.types.hh (altnum.1): file
+ Pointset_Powerset.types.hh was added on branch altnum on
+ 2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.types.hh (interfaces.1): file
+ Pointset_Powerset.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Pointset_Powerset.types.hh (octagons.1): file
+ Pointset_Powerset.types.hh was added on branch octagons on
+ 2006-11-18 20:36:51 +0000
+
+2006-09-19 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.194), instchk.hh (1.5), doc/devref.doxyconf-html.in
+ (1.75), doc/devref.doxyconf-latex.in (1.14),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.89), src/Makefile.am (1.156),
+ src/Pointset_Powerset.cc (1.1), src/Pointset_Powerset.defs.hh
+ (1.1), src/Pointset_Powerset.inlines.hh (1.1),
+ src/Pointset_Powerset.templates.hh (1.1),
+ src/Pointset_Powerset.types.hh (1.1), src/Polyhedra_Powerset.cc
+ (1.7), src/Polyhedra_Powerset.defs.hh (1.37),
+ src/Polyhedra_Powerset.inlines.hh (1.43),
+ src/Polyhedra_Powerset.templates.hh (1.5),
+ src/Polyhedra_Powerset.types.hh (1.5),
+ src/Widening_Function.defs.hh (1.15),
+ src/Widening_Function.inlines.hh (1.13), src/algorithms.hh
+ (1.46), src/max_space_dimension.hh (1.8), tests/print.hh (1.37),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.8),
+ tests/BD_Shape/bhz03widening1.cc (1.8),
+ tests/BD_Shape/geomcovers1.cc (1.8), tests/Grid/bhz03widening1.cc
+ (1.10), tests/Grid/membytes1.cc (1.7),
+ tests/Polyhedron/Makefile.am (1.97),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.11),
+ tests/Polyhedron/bhz03widening1.cc (1.11),
+ tests/Polyhedron/exceptions1.cc (1.10),
+ tests/Polyhedron/geomcovers1.cc (1.12),
+ tests/Polyhedron/linearpartition1.cc (1.9),
+ tests/Polyhedron/maxspacedim1.cc (1.8), tests/Polyhedron/mc91.cc
+ (1.13), tests/Polyhedron/membytes2.cc (1.7),
+ tests/Polyhedron/pointsetpowerset1.cc (1.1),
+ tests/Polyhedron/polydifference1.cc (1.9),
+ tests/Polyhedron/polypowerset1.cc (1.21),
+ tests/Polyhedron/timeelapse1.cc (1.9): The Polyhedra_Powerset
+ template class has been renamed Pointset_Powerset.
+
+2006-09-19 Tuesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.42),
+ src/Polyhedra_Powerset.templates.hh (1.4), src/Powerset.defs.hh
+ (1.26), src/Powerset.inlines.hh (1.17), src/Powerset.templates.hh
+ (1.3), tests/Polyhedron/powerset1.cc (1.15): Powerset
+ implementation made more lazy. Fixed a couple of FIXMEs.
+ Methods Powerset::add_non_bottom_disjunct() renamed
+ add_non_bottom_disjunct_preserve_reduction(), since the true
+ emphasis is on preserving reduction. This required the addition
+ of two FIXMEs concerning the implementation of
+ Polyhedra_Powerset, as it is not clear whether the preservation
+ of reduction was an issue there.
+
+2006-09-19 Tuesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.templates.hh (altnum.1): file Powerset.templates.hh
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.14): Adhere to the our standards
+ for test programs. Two more tests added. Added also a FIXME.
+
+2006-09-19 Tuesday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.defs.hh (altnum.1): file
+ Grid_Generator.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:13 +0000
+
+2006-09-19 Tuesday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.idefs.hh (altnum.1): file Grid_Status.idefs.hh
+ was added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-19 Tuesday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.19), BD_Shape.defs.hh (1.73),
+ Congruence_System.defs.hh (1.15), Constraint.defs.hh (1.123),
+ Constraint_System.defs.hh (1.31), DB_Matrix.defs.hh (1.23),
+ Direct_Product.defs.hh (1.28), Generator.defs.hh (1.120),
+ Generator_System.defs.hh (1.19), Grid.defs.hh (1.28),
+ Grid_Generator.defs.hh (1.26), Grid_Generator_System.defs.hh
+ (1.18), Grid_Status.idefs.hh (1.5), LP_Problem.defs.hh (1.14),
+ Linear_Expression.defs.hh (1.30), Linear_Row.defs.hh (1.22),
+ Linear_System.defs.hh (1.27), Matrix.defs.hh (1.78),
+ OR_Matrix.defs.hh (1.4), Octagonal_Shape.defs.hh (1.4),
+ Og_Status.idefs.hh (1.4), Ph_Status.idefs.hh (1.19),
+ Polyhedra_Powerset.defs.hh (1.36), Polyhedron.defs.hh (1.304),
+ Row.defs.hh (1.108), Saturation_Matrix.defs.hh (1.10): Fixed the
+ references (in the documentation) to the various
+ ascii_dump(std::ostream&) const methods.
+
+2006-09-19 Tuesday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.defs.hh (1.25): Use vertical spacing to improve
+ readability.
+
+2006-09-19 Tuesday 08:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.defs.hh (1.12), Ask_Tell.inlines.hh (1.11),
+ Ask_Tell.templates.hh (1.3): Started making normalization lazy.
+
+2006-09-18 Monday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.18), BD_Shape.defs.hh (1.72),
+ Congruence_System.defs.hh (1.14), Constraint.defs.hh (1.122),
+ Constraint_System.defs.hh (1.30), DB_Matrix.defs.hh (1.22),
+ Direct_Product.defs.hh (1.27), Generator.defs.hh (1.119),
+ Generator_System.defs.hh (1.18), Grid.defs.hh (1.27),
+ Grid_Generator.defs.hh (1.25), Grid_Generator_System.defs.hh
+ (1.17), Grid_Status.idefs.hh (1.4), LP_Problem.defs.hh (1.13),
+ Linear_Expression.defs.hh (1.29), Linear_Row.defs.hh (1.21),
+ Linear_System.defs.hh (1.26), Matrix.defs.hh (1.77),
+ OR_Matrix.defs.hh (1.3), Octagonal_Shape.defs.hh (1.3),
+ Og_Status.idefs.hh (1.3), Ph_Status.idefs.hh (1.18),
+ Polyhedra_Powerset.defs.hh (1.35), Polyhedron.defs.hh (1.303),
+ Row.defs.hh (1.107), Saturation_Matrix.defs.hh (1.9): Fixed
+ documentation references to the various ascii_dump(std::ostream&)
+ methods (this, unfortunately triggers a Doxygen bug, see
+ http://bugzilla.gnome.org/show_bug.cgi?id=356597). Other
+ documentation fixes.
+
+2006-09-18 Monday 20:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.defs.hh (1.11), Ask_Tell.inlines.hh (1.10),
+ Ask_Tell.templates.hh (1.2): The former engine() method is now
+ called normalize(). New method bool is_normalized() const.
+
+2006-09-18 Monday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.defs.hh (1.10), Ask_Tell.inlines.hh (1.9),
+ Ask_Tell.templates.hh (1.1): Halfway through the rewriting of the
+ Ask_Tell template class.
+
+2006-09-18 Monday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.templates.hh (1.2), tests/Polyhedron/append2.cc
+ (1.7): Indentation fixed.
+
+2006-09-17 Sunday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_pchk_int8 (1.4),
+ tests/expected_pchk_int8 (1.8): Updated to reflect the new
+ implementations of simplex.
+
+2006-09-17 Sunday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int8 (altnum.1): file
+ expected_pchk_int8 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-09-17 Sunday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int8 (altnum.1): file
+ expected_pchk_int8 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-09-17 Sunday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.13): Fixed the implementations
+ of Fcaibvp::upper_bound_assign(const Fcaibvp&) and
+ Fcaibvp::meet_assign(const Fcaibvp&) (they were swapped).
+
+2006-09-17 Sunday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.12): Fixed a bug in
+ operator<<(std::ostream&, const Fcaibvp&).
+
+2006-09-16 Saturday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.defs.hh (1.9), Ask_Tell.inlines.hh (1.8),
+ Ask_Tell.types.hh (1.5): Complete rewriting of the Ask_Tell
+ template class started.
+
+2006-09-15 Friday 16:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Grid_Generator.cc (1.17): Backtracking previous change as far
+ as Grid_Generator is concerned.
+
+2006-09-15 Friday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.194): Remember to advertise the failure of GCC 3.4.x to
+ compile the PPL correctly.
+
+2006-09-15 Friday 15:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.cc (1.12), Constraint.cc (1.63), Generator.cc
+ (1.72), Grid_Generator.cc (1.16): Added some missing sanity
+ checks to a few OK() methods: - Constraint::OK() and
+ Generator::OK() no also check that the corresponding object is
+ a valid Linear_Row; - Congruence::OK() checks that the object is
+ a valid Row; - Grid_Generator::OK() check that the object is a
+ valid Generator.
+
+2006-09-15 Friday 11:54 Andrea Cimino
+
+ * src/: LP_Problem.cc (1.32), LP_Problem.defs.hh (1.12): Minor
+ stylistic changes. Unused method definition removed.
+
+2006-09-14 Thursday 17:52 Andrea Cimino
+
+ * src/LP_Problem.cc (1.31): Fixed a bug in LP_Problem::ascii_load()
+
+2006-09-14 Thursday 11:34 Andrea Cimino
+
+ * src/LP_Problem.cc (1.30): Test that every member used in
+ LP_Problem is OK. Fixed a bug in ascii_load(). Added a test
+ concerning ascii_dump/ascii_load.
+
+2006-09-14 Thursday 10:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_Expression.cc (1.15), Linear_Row.cc (1.20),
+ Linear_Row.defs.hh (1.20), Row.cc (1.100), Row.defs.hh (1.106):
+ Added method OK(), taking no arguments, to classes Row and
+ Linear_Row. The OK() method for Linear_Expression modified
+ accordingly (previous implementation may have resulted in false
+ alarms, i.e., returning false even when the object was well
+ formed).
+
+2006-09-13 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.35): Every OK() methods must take care of
+ reporting its own failures: redundant prints avoided.
+
+2006-09-13 Wednesday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.46): Made C99 compliant (we were
+ using C++-style comments and declaring variables in the middle of
+ body functions).
+
+2006-09-13 Wednesday 16:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.45): Variables renamed to improve
+ readability.
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: ppl-config_extra_man_text (1.1), ppl_lcdd_extra_man_text
+ (1.1), ppl_lpsol_extra_man_text (1.1), prog2man (1.1):
+ Provisional machinery to automatically build the man pages put
+ under CVS control.
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config_extra_man_text (altnum.1): file
+ ppl-config_extra_man_text was added on branch altnum on
+ 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config_extra_man_text (interfaces.1): file
+ ppl-config_extra_man_text was added on branch interfaces on
+ 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config_extra_man_text (octagons.1): file
+ ppl-config_extra_man_text was added on branch octagons on
+ 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd_extra_man_text (altnum.1): file
+ ppl_lcdd_extra_man_text was added on branch altnum on 2006-10-29
+ 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd_extra_man_text (interfaces.1): file
+ ppl_lcdd_extra_man_text was added on branch interfaces on
+ 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd_extra_man_text (octagons.1): file
+ ppl_lcdd_extra_man_text was added on branch octagons on
+ 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol_extra_man_text (altnum.1): file
+ ppl_lpsol_extra_man_text was added on branch altnum on 2006-10-29
+ 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol_extra_man_text (interfaces.1): file
+ ppl_lpsol_extra_man_text was added on branch interfaces on
+ 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol_extra_man_text (octagons.1): file
+ ppl_lpsol_extra_man_text was added on branch octagons on
+ 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/prog2man (altnum.1): file prog2man was added on branch altnum
+ on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/prog2man (interfaces.1): file prog2man was added on branch
+ interfaces on 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/prog2man (octagons.1): file prog2man was added on branch
+ octagons on 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/prog2man (simplex.1): file prog2man was added on branch
+ simplex on 2008-01-07 11:15:27 +0000
+
+2006-09-13 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: ppl-config.1 (1.4), ppl_lcdd.1 (1.2), ppl_lpsol.1 (1.2):
+ Updated.
+
+2006-09-13 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config.1 (altnum.1): file ppl-config.1 was added on
+ branch altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd.1 (altnum.1): file ppl_lcdd.1 was added on branch
+ altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol.1 (altnum.1): file ppl_lpsol.1 was added on branch
+ altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.44): Added the --version (-V)
+ option. The brief version of the --max-memory option is now -R.
+ Help text revised. The --help (-h) option now prints to stdout,
+ as it should. Fixed a couple of error messages. Silenced a
+ couple of compiler warnings.
+
+2006-09-13 Wednesday 14:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.43): Now the --check option
+ accepts an option parameter specifying the threshold with which
+ optima are checked.
+
+2006-09-13 Wednesday 12:46 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.42): `check_threshold' is now set
+ to a proper value.
+
+2006-09-13 Wednesday 12:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.41): Fixed a bug whereby the abs()
+ function was used instead of fabs().
+
+2006-09-13 Wednesday 12:17 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.40): MIP problems now are treated
+ as LP ones.
+
+2006-09-13 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.193): New item added.
+
+2006-09-13 Wednesday 11:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.39): Redundant test avoided.
+
+2006-09-13 Wednesday 11:09 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.38): Deallocate `optimum' only if
+ an optimum is found.
+
+2006-09-13 Wednesday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.37): The `optimum' variable was
+ cleared too early. Make GLPK silent when NDEBUG is defined.
+
+2006-09-13 Wednesday 09:33 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.36): Modified ppl_lpsol.c to
+ compile. Properly checked if an LP Problem is MIP or not.
+
+2006-09-12 Tuesday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.35): Typo fixed. The --check
+ options is still not working, as the call to lpx_get_num_int()
+ aborts the program immediately.
+
+2006-09-12 Tuesday 21:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.34): New draft implementation of
+ the --check option.
+
+2006-09-12 Tuesday 18:14 Andrea Cimino
+
+ * src/LP_Problem.cc (1.29): Added some noisy output if something
+ fails in LP_Problem::OK(). Removed a previous redundant check.
+
+2006-09-12 Tuesday 18:04 Andrea Cimino
+
+ * src/LP_Problem.cc (1.28): Antoher little test added in
+ LP_Problem::OK(). Another FIXME dealt with.
+
+2006-09-12 Tuesday 17:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.192), src/Direct_Product.defs.hh (1.26),
+ src/Direct_Product.inlines.hh (1.24),
+ tests/Grid/directproduct1.cc (1.21): Restored previous
+ implementation of affine_relation() Improved several comments.
+
+2006-09-12 Tuesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct1.cc (altnum.1): file directproduct1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-12 Tuesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct1.cc (octagons.1): file directproduct1.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-12 Tuesday 12:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.234), tests/Makefile.am (1.255),
+ tests/Polyhedron/Makefile.am (1.96),
+ tests/Polyhedron/exceptions2.cc (1.9),
+ tests/Polyhedron/lpproblem1.cc (1.10): Tests concerning the
+ LP_Problem class have been moved into a separate directory.
+
+2006-09-11 Monday 21:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_mpz (1.8), expected_mpz_a (1.8):
+ Updated to reflect the new implementations of simplex and
+ ppl_lpsol.
+
+2006-09-11 Monday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.27): IO_Operators::operator<<(std::ostream&,
+ const LP_Problem&) now prints the correct optimization mode.
+ Useless redundancy avoided in the same function.
+
+2006-09-11 Monday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int8_a (1.5): Updated to reflect the new
+ implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 19:09 Andrea Cimino
+
+ * src/LP_Problem.cc (1.26): Removed a non wanted FIXME.
+
+2006-09-11 Monday 19:07 Andrea Cimino
+
+ * src/: LP_Problem.cc (1.25), LP_Problem.defs.hh (1.11):
+ Implemented an initial version of the << operator.
+
+2006-09-11 Monday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int16_a (1.6): Updated to reflect the
+ new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int32_a (1.7): Updated to reflect the
+ new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int64_a (1.7): Updated to reflect the
+ new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int64 (1.7): Updated to reflect the new
+ implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16 (1.6), expected_int32 (1.7):
+ Updated to reflect the new implementations of simplex and
+ ppl_lpsol.
+
+2006-09-11 Monday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_int8 (1.6): Updated to reflect the new
+ implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.33): Added a newline in the error
+ output.
+
+2006-09-11 Monday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.32): The error_handler() function
+ now prints the error also to the output file, if any.
+
+2006-09-11 Monday 13:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.25), src/Direct_Product.inlines.hh
+ (1.23), tests/Grid/directproduct1.cc (1.20): Changed
+ implementation of affine_dimension() for Direct_Product to assume
+ no reduction. Revised comment for affine_dimension(). Revised
+ test for affine_dimension().
+
+2006-09-10 Sunday 22:15 Andrea Cimino
+
+ * src/LP_Problem.cc (1.24): ascii_load() method implemented.
+ Slightly modified ascii_dump() to allow ascii_load() working.
+
+2006-09-10 Sunday 11:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.191): Removed a todo item for the grid widening as this
+ has been done. Added - Direct_Product: Check that all comments
+ and code are consistent with intended semantics.
+
+2006-09-10 Sunday 11:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Direct_Product.defs.hh (1.24): Some comments improved.
+
+2006-09-10 Sunday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.23):
+ LP_Problem::steepest_edge_entering_index() fixed.
+
+2006-09-09 Saturday 18:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Grid/: asciidumpload1.cc (1.12), asciidumpload3.cc (1.3),
+ asciidumpload4.cc (1.3): Adjusted to match the recent change in
+ ascii dump & load methods.
+
+2006-09-09 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload1.cc (altnum.1): file asciidumpload1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload3.cc (altnum.1): file asciidumpload3.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload3.cc (octagons.1): file asciidumpload3.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload4.cc (altnum.1): file asciidumpload4.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload4.cc (octagons.1): file asciidumpload4.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.cc (1.11), Grid_Generator.cc (1.15),
+ Linear_Row.cc (1.19), Row.cc (1.99): Patched methods for ascii
+ dump&load so as they also manage size information and perform any
+ required allocation/deallocation.
+
+2006-09-09 Saturday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.22): Removed another bug due to assuming
+ that Coefficient is a GMP integer.
+
+2006-09-09 Saturday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.67): Added missing \relates
+ commands. Long source lines avoided.
+
+2006-09-09 Saturday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid_chdims.cc (1.10), Grid_simplify.cc (1.27),
+ checked_ext.inlines.hh (1.32), checked_float.inlines.hh (1.66),
+ checked_int.inlines.hh (1.53): Little code formatting
+ improvements.
+
+2006-09-09 Saturday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.26), Grid_nonpublic.cc (1.19):
+ Const-correctness improved.
+
+2006-09-09 Saturday 14:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.21): assert(false) does not provide any real
+ protection and should only be used in efficiency-critical inline
+ functions. Use throw std::runtime_error("PPL internal error")
+ instead.
+
+2006-09-09 Saturday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (1.18): Simplified the logic of debugging
+ code in Grid::normalize_divisors(Grid_Generator_System&,
+ Grid_Generator_System&).
+
+2006-09-09 Saturday 13:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.20): Avoid creating temporaries.
+
+2006-09-09 Saturday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.19): Use floating point constants to
+ initialize floatin point values.
+
+2006-09-09 Saturday 13:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.18): Do not assume Coefficient is a GMP
+ integer. Must include <cmath> for fabs().
+ PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT re-enabled.
+
+2006-09-09 Saturday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.17): Replaced "can't", "don't", "doesn't",
+ "aren't" by "cannot", "do not", "does not" and "are not".
+
+2006-09-09 Saturday 13:10 Andrea Cimino
+
+ * TODO (1.190): Don't confuse operator with method.
+
+2006-09-09 Saturday 13:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frompolyhedron1.cc (altnum.1): file
+ frompolyhedron1.cc was added on branch altnum on 2006-10-29
+ 19:27:22 +0000
+
+2006-09-09 Saturday 13:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frompolyhedron1.cc (1.3): test01() fails with
+ 8-bit coefficients, but does not fail with 16-bit ones.
+
+2006-09-09 Saturday 13:07 Andrea Cimino
+
+ * TODO (1.189): Added a couple of items concering PPL::LP_Problem.
+
+2006-09-09 Saturday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Result.defs.hh (1.16), Result.inlines.hh (1.9): Functions
+ Result classify(Result) and bool is_special(Result) documented.
+ Useless inclusion removed.
+
+2006-09-09 Saturday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.inlines.hh (1.4): Include <cassert>.
+
+2006-09-09 Saturday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.inlines.hh (altnum.1): file
+ Rounding_Dir.inlines.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-09-09 Saturday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Result.defs.hh (1.15), Result.inlines.hh (1.8): Removed the
+ unused function Result sign(Result).
+
+2006-09-09 Saturday 09:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.95): Programs lpproblem2 and
+ lpproblem3 no longer exist.
+
+2006-09-09 Saturday 08:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/dualhypercubes.cc (1.9): test01() overflows with
+ 32-bit coefficients, but does not with 64-bit ones.
+
+2006-09-09 Saturday 08:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.188): Added an item concerning the covering of the
+ LP_Problem code.
+
+2006-09-09 Saturday 08:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.94), lpproblem1.cc (1.9),
+ lpproblem2.cc (1.7), lpproblem3.cc (1.5): Tests for the
+ LP_Problem class fixed and merged.
+
+2006-09-08 Friday 21:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.193): Added some items, not to forget them.
+
+2006-09-08 Friday 21:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.16): Avoid calling num_columns() on input_cs
+ and pending_input_cs, since these constraint systems may be NNC
+ and therefore have an extra column for the epsilon coefficient.
+ Do call space_dimension(), instead, taking care of the offset.
+ Adjusted some badly indented lines; adjusted some bad line
+ breaks.
+
+2006-09-08 Friday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.233): Version number bumped.
+
+2006-09-08 Friday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.15): Temporarily set
+ PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT to 0. This is to
+ avoid trying to the expression fabs(raw_value(cost_j).get_d()),
+ which only makes sense with GMP integer coefficients.
+
+2006-09-08 Friday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.187), demos/ppl_lpsol/ppl_lpsol.c (1.31),
+ doc/devref.doxyconf-html.in (1.74), src/LP_Problem.cc (1.14),
+ src/LP_Problem.defs.hh (1.10), src/LP_Problem.inlines.hh (1.10),
+ src/Linear_Expression.cc (1.14), src/Linear_Expression.defs.hh
+ (1.28), src/Linear_Expression.inlines.hh (1.9),
+ tests/Polyhedron/Makefile.am (1.93),
+ tests/Polyhedron/lpproblem1.cc (1.8),
+ tests/Polyhedron/lpproblem2.cc (1.6),
+ tests/Polyhedron/lpproblem3.cc (1.4): First (and, quite likely,
+ last) merge of the `simplex' branch to the main trunk.
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (interfaces.1): file
+ OR_Matrix.inlines.hh was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.types.hh (altnum.1): file OR_Matrix.types.hh was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.types.hh (interfaces.1): file OR_Matrix.types.hh
+ was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.cc (altnum.1): file Octagonal_Shape.cc was
+ added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.cc (interfaces.1): file Octagonal_Shape.cc
+ was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.types.hh (altnum.1): file
+ Octagonal_Shape.types.hh was added on branch altnum on 2006-10-29
+ 19:27:14 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagonal_Shape.types.hh (interfaces.1): file
+ Octagonal_Shape.types.hh was added on branch interfaces on
+ 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (altnum.1): file
+ checked_numeric_limits.hh was added on branch altnum on
+ 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.defs.hh (altnum.1): file distances.defs.hh was
+ added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.defs.hh (interfaces.1): file distances.defs.hh was
+ added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.inlines.hh (altnum.1): file distances.inlines.hh
+ was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.inlines.hh (interfaces.1): file
+ distances.inlines.hh was added on branch interfaces on 2006-09-28
+ 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.types.hh (altnum.1): file distances.types.hh was
+ added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/distances.types.hh (interfaces.1): file distances.types.hh
+ was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.232), doc/definitions.dox (1.197),
+ doc/devref.doxyconf-html.in (1.73), doc/devref.doxyconf-latex.in
+ (1.13), src/Checked_Number.defs.hh (1.78),
+ src/Checked_Number.inlines.hh (1.66), src/DB_Matrix.inlines.hh
+ (1.27), src/DB_Row.defs.hh (1.19), src/Makefile.am (1.155),
+ src/OR_Matrix.defs.hh (1.2), src/OR_Matrix.inlines.hh (1.2),
+ src/OR_Matrix.templates.hh (1.2), src/OR_Matrix.types.hh (1.2),
+ src/Octagonal_Shape.cc (1.2), src/Octagonal_Shape.defs.hh (1.2),
+ src/Octagonal_Shape.inlines.hh (1.2),
+ src/Octagonal_Shape.templates.hh (1.2),
+ src/Octagonal_Shape.types.hh (1.2), src/Og_Status.idefs.hh (1.2),
+ src/Og_Status.inlines.hh (1.2), src/Polyhedron.defs.hh (1.302),
+ src/checked_numeric_limits.hh (1.16), src/distances.defs.hh
+ (1.2), src/distances.inlines.hh (1.2), src/distances.types.hh
+ (1.2), src/globals.defs.hh (1.39), src/globals.inlines.hh (1.15),
+ tests/Makefile.am (1.254), tests/ppl_test.hh (1.49),
+ tests/print.hh (1.36), tests/BD_Shape/addconstraints1.cc (1.14),
+ tests/BD_Shape/addspacedims1.cc (1.12),
+ tests/BD_Shape/affineimage1.cc (1.15),
+ tests/BD_Shape/affinepreimage1.cc (1.15),
+ tests/BD_Shape/ascii_dump_load1.cc (1.13),
+ tests/BD_Shape/bdsdifference1.cc (1.11),
+ tests/BD_Shape/bdshull1.cc (1.11),
+ tests/BD_Shape/bhmz05widening1.cc (1.11),
+ tests/BD_Shape/cc76extrapolation1.cc (1.15),
+ tests/BD_Shape/cc76narrowing1.cc (1.15),
+ tests/BD_Shape/concatenate1.cc (1.12),
+ tests/BD_Shape/constraints1.cc (1.15),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.14),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.16),
+ tests/BD_Shape/h79widening1.cc (1.11),
+ tests/BD_Shape/intersection1.cc (1.14),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.10),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.11),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.11),
+ tests/BD_Shape/mapspacedims1.cc (1.12),
+ tests/BD_Shape/minconstraints1.cc (1.8),
+ tests/BD_Shape/removespacedims1.cc (1.15),
+ tests/BD_Shape/timeelapse1.cc (1.14), tests/BD_Shape/universe1.cc
+ (1.12): First (and, quite likely, last) merge of the `octagons'
+ branch to the main trunk.
+
+2006-09-08 Friday 17:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.50): Improved strong
+ closure implementation by better exploting data locality. Also,
+ avoid testing for +inf since it happens to slow down execution
+ (octagonal matrices tend to become dense quite quickly).
+
+2006-09-08 Friday 13:37 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[64,32,23]): `is_artificial' is no longer used. Now the
+ informations about artificial variables are handled just in the
+ first phase of the simplex algorithm.
+
+2006-09-08 Friday 11:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.14): Initial, partial
+ implementation of the `--check' option. What remains to be done
+ is specified in TODO comments. The variable `check_optimum' has
+ been renamed `check_results'.
+
+2006-09-08 Friday 10:21 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.13): Added a FIXME.
+
+2006-09-08 Friday 09:43 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.12): Added a white space.
+
+2006-09-08 Friday 09:40 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.11): Force `make check',
+ temporarly commented out a `fatal()' call.
+
+2006-09-08 Friday 09:12 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.10): Fixed an unwanted
+ carriage return.
+
+2006-09-07 Thursday 19:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.cc (1.10), Congruence.defs.hh (1.15),
+ Congruence_System.cc (1.19), Constraint.cc (1.62), Generator.cc
+ (1.71), Grid.templates.hh (1.17), Grid_Generator.cc (1.14),
+ Grid_conversion.cc (1.14), Grid_nonpublic.cc (1.17),
+ Grid_public.cc (1.34), Grid_simplify.cc (1.26),
+ Linear_Expression.cc (1.13), Linear_Expression.defs.hh (1.27),
+ Polyhedron.templates.hh (1.2), Polyhedron_public.cc (1.77):
+ Prefer using TEMP_INTEGER to Coefficient where declaring an
+ automatic variable. Do not use
+ Coefficient_traits::const_reference for automatic variable
+ declarations: only use it when declaring formal parameter types.
+
+2006-09-07 Thursday 19:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (simplex.63): Remember to generate auxiliary
+ output function definitions as soon as we have an implementation
+ of operator<<.
+
+2006-09-07 Thursday 19:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (simplex.31): Use macro
+ PPL_OUTPUT_DECLARATIONS.
+
+2006-09-07 Thursday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[62,30]):
+ Useless inclusions avoided.
+
+2006-09-07 Thursday 16:35 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.61): Prefer neg_assign(x, y) to x =
+ -y.
+
+2006-09-07 Thursday 16:18 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.60): Prefer `TEMP_INTEGER(x)' to
+ `Coefficient x'.
+
+2006-09-07 Thursday 15:11 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.59): Restored ascii_dump().
+ Indentation fixed.
+
+2006-09-07 Thursday 14:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_Expression.cc, Linear_Expression.defs.hh,
+ Linear_Expression.inlines.hh (simplex.[4,6,3]): Added ascii
+ dump/load methods.
+
+2006-09-07 Thursday 13:45 Andrea Cimino
+
+ * src/: LP_Problem.cc, Linear_Expression.defs.hh (simplex.[58,5]):
+ No more `friend' declarations. Added a FIXME:
+ ascii_dump(ostream) modified waiting for the
+ Linear_Epression::ascii_dump(ostream) method.
+
+2006-09-07 Thursday 12:32 Andrea Cimino
+
+ * src/: Generator.defs.hh, LP_Problem.cc (simplex.[5,57]): Minor
+ improvements. Avoided another `friend' declaration.
+
+2006-09-07 Thursday 10:37 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.56): Avoid using useless temporaries.
+
+2006-09-07 Thursday 10:25 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.55): A FIXME dealt with by using
+ Generator::ascii_dump(ostream).
+
+2006-09-07 Thursday 10:15 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.54): Use abs_assign(x) instead of
+ abs_assign(x, x).
+
+2006-09-07 Thursday 10:02 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.53): Specified what kind of macro we
+ are referring to in important #endif statements.
+
+2006-09-07 Thursday 09:49 Andrea Cimino
+
+ * src/: Constraint.defs.hh, LP_Problem.cc (simplex.[5,52]): Removed
+ the `friend' declaration from Constraint.defs.hh of the class
+ LP_Problem using the public methods of the class Constraint. Some
+ other little improvements.
+
+2006-09-06 Wednesday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.44), C_Polyhedron.inlines.hh
+ (1.32): Fixed the parameter names of
+ C_Polyhedron::C_Polyhedron(const Grid_Generator_System&) and
+ C_Polyhedron::C_Polyhedron(Grid_Generator_System&). Added 4
+ FIXMEs for the same constructors: their documentation seems
+ wrong, and their implementation seems incomplete.
+
+2006-09-06 Wednesday 20:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, config.guess, config.sub, install-sh, missing,
+ mkinstalldirs, Watchdog/INSTALL, Watchdog/config.guess,
+ Watchdog/config.sub, Watchdog/install-sh, Watchdog/missing,
+ Watchdog/mkinstalldirs, interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/tests/clpq2.pl, src/BD_Shape.defs.hh,
+ src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence_System.cc,
+ src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Direct_Product.defs.hh,
+ src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+ src/Direct_Product.types.hh, src/Float.inlines.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Generator.cc, src/Generator.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh, src/Grid_chdims.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Makefile.am, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_public.cc,
+ src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+ src/Scalar_Products.inlines.hh, src/checked.cc,
+ src/checked_ext.inlines.hh, src/checked_int.inlines.hh,
+ src/fpu-ia32.inlines.hh, src/globals.defs.hh, tests/ppl_test.cc,
+ tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage3.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+ tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+ tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+ tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+ tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+ tests/Grid/directproduct1.cc, tests/Grid/directproduct2.cc,
+ tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+ tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+ tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+ tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/widening1.cc,
+ tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat
+ (simplex.[1,3,3,2,1,1,1,3,3,2,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,6,2,2,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,29,22,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,4,2,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,2,3,3,3,3,3,3,3,7,3,3,1]):
+ Third merge from the main trunk.
+
+2006-09-06 Wednesday 09:19 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.51): Simplified the changes of the
+ last commit.
+
+2006-09-06 Wednesday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh (1.22), GMP_Integer.inlines.hh (1.16):
+ Added void abs_assign(GMP_Integer& x) and void
+ abs_assign(GMP_Integer& x, const GMP_Integer& y).
+
+2006-09-05 Tuesday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.33): Long lines avoided.
+
+2006-09-05 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.77), Checked_Number.inlines.hh
+ (1.65): Added template <typename T, typename Policy> void
+ abs_assign(Checked_Number<T, Policy>& x) and template <typename
+ T, typename Policy> void abs_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y).
+
+2006-09-05 Tuesday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.76): Added the declaration and
+ documentation for template <typename T, typename Policy> void
+ neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T,
+ Policy>& y).
+
+2006-09-05 Tuesday 16:18 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.50): Attempt to avoid explicit
+ products to improve performances by not using temporaries.
+
+2006-09-05 Tuesday 15:26 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.49): Don't use `dimension_type' if we
+ are not dealing with dimensions.
+
+2006-09-05 Tuesday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (1.16): Only define debugging variables
+ when NDEBUG is not defined.
+
+2006-09-05 Tuesday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/clpq2.pl (1.9): Fixed do_command/2.
+
+2006-09-04 Monday 17:43 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.48): Other little formatting changes.
+
+2006-09-04 Monday 16:14 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.47): Typo fixed.
+
+2006-09-04 Monday 16:11 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[46,28]):
+ Removed other useless code. Added a CHECKME.
+
+2006-09-04 Monday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.inlines.hh (simplex.21): Little formatting change.
+
+2006-09-04 Monday 11:41 Andrea Cimino
+
+ * src/LP_Problem.inlines.hh (simplex.20): Fixed the swap operator.
+
+2006-09-04 Monday 11:26 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[45,27,19]): Big changes. Now the Status `UNSOLVED' is
+ dropped because every LP_Problem, from the beginning, now is
+ treated like `PARTIALLY_SATISFIABLE', so all the redundant code
+ is dropped too. Other little, but important, bugfixes. This new
+ implementation must be heavily tested.
+
+2006-09-01 Friday 12:02 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.44): Fixed a bug in compute_simplex():
+ the test02 in lpproblem1.cc caused to fail the assertion
+ `assert(challenger >= current)'. Now the test seems to work.
+
+2006-07-20 Thursday 08:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.31):
+ Removed a duplicate macro definition, improved some comments,
+ reordered some macros.
+
+ Added macros to make the components of a "simple" open or direct
+ product cplusplus class available; these are now defined as:
+ m4_cplusplus_class`'i_j where "i" is the class counter and "j" =
+ 1 or 2 depending on whether it is the 1st or second argument. By
+ "simple", we mean that the product construct is not nested.
+
+2006-07-06 Thursday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (1.23): Temporarily commented out a
+ friend declaration that is rejected by GCC 3.3.x.
+
+2006-07-06 Thursday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.defs.hh (simplex.1): file
+ Direct_Product.defs.hh was added on branch simplex on 2006-09-06
+ 18:41:51 +0000
+
+2006-07-02 Sunday 13:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.30):
+ Some small improvements.
+
+2006-06-30 Friday 20:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.117): Repeated inclusion
+ removed. Useless declaration and initialization of `a_throw'
+ removed as well.
+
+2006-06-30 Friday 19:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[29,30,21,24]): Revised the code for widening so that
+ the supporting methods are not needed and removed. The limited
+ and bounded options for extrapolation are now coded as a single
+ pattern.
+
+ Changes for schematising the limited and bounded options still to
+ be done in the C interface.
+
+2006-06-30 Friday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: yap_cfli.h, yap_cfli.ic
+ (interfaces.[1,1]): Started drafting the YAP Prolog Common
+ Foreign Language Interface.
+
+2006-06-30 Friday 16:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: swi_cfli.cc, swi_cfli.h, swi_cfli.ic
+ (interfaces.[2,2,2]): Little improvements.
+
+2006-06-30 Friday 15:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_cc_code.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[28,14,22,29,23]): Separate patterns for widening and
+ extrapolation to give more flexibility.
+
+2006-06-29 Thursday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Direct_Product.templates.hh (1.19), Grid.inlines.hh (1.10),
+ Grid.templates.hh (1.16), Grid_Generator.defs.hh (1.24): Missing
+ inclusions added.
+
+2006-06-29 Thursday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.templates.hh (altnum.1): file
+ Direct_Product.templates.hh was added on branch altnum on
+ 2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.templates.hh (octagons.1): file
+ Direct_Product.templates.hh was added on branch octagons on
+ 2006-11-18 20:36:50 +0000
+
+2006-06-29 Thursday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.templates.hh (simplex.1): file
+ Direct_Product.templates.hh was added on branch simplex on
+ 2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 23:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh (altnum.1): file Grid.inlines.hh was added on
+ branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.defs.hh (1.14), Polyhedron.defs.hh (1.301):
+ Missing inclusions added.
+
+2006-06-29 Thursday 23:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: bug1.cc (1.4), bug1.dat (1.5): The situation
+ exhibited by bug1.cc and bug1.dat has been clarified (not a bug,
+ but Constraint::OK() needed improving).
+
+2006-06-29 Thursday 18:59 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.22), Direct_Product.inlines.hh
+ (1.22), Direct_Product.templates.hh (1.18), globals.defs.hh
+ (1.38): Improve some FIXMEs.
+
+2006-06-29 Thursday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.inlines.hh (simplex.1): file
+ Direct_Product.inlines.hh was added on branch simplex on
+ 2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 18:38 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.19): Add the ability to test with
+ C_Polyhedron as the Polyhedral component.
+
+2006-06-29 Thursday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct1.cc (simplex.1): file directproduct1.cc
+ was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-29 Thursday 17:47 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.18): Add a widening test.
+
+2006-06-29 Thursday 17:46 Matthew Mundell
+
+ * src/: Polyhedron.inlines.hh (1.133), Polyhedron.defs.hh (1.300):
+ Add widening_assign(ph, tp) which is equivalent to
+ H79_widening_assign(ph, tp).
+
+2006-06-29 Thursday 17:45 Matthew Mundell
+
+ * src/Direct_Product.defs.hh (1.21): Direct out the relation_with
+ declarations.
+
+2006-06-29 Thursday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.8), config.guess (1.37), config.sub (1.35), install-sh
+ (1.17), missing (1.13), mkinstalldirs (1.10), Watchdog/INSTALL
+ (1.5), Watchdog/config.guess (1.21), Watchdog/config.sub (1.20),
+ Watchdog/install-sh (1.14), Watchdog/missing (1.9),
+ Watchdog/mkinstalldirs (1.6): Updated from Autoconf 2.60.
+
+2006-06-29 Thursday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.92): The situation exhibited by
+ bug1.cc and bug1.dat has been clarified (not a bug, but
+ Constraint::OK() needed improving).
+
+2006-06-29 Thursday 16:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_cfli.h (interfaces.1): Spacing
+ changed.
+
+2006-06-29 Thursday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am,
+ ppl_interface_generator_swiprolog_cc.m4, swi_cfli.cc, swi_cfli.h,
+ swi_cfli.ic (interfaces.[4,6,1,1,1]): SWI-Prolog Common Foreign
+ Language Interface separated from the PPL stuff.
+
+2006-06-29 Thursday 16:17 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.17): Update to test only the
+ methods defined in Direct_Product. Update some expected values
+ for when Grid is the first component.
+
+2006-06-29 Thursday 16:14 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.20), Direct_Product.inlines.hh
+ (1.21), Direct_Product.templates.hh (1.17): Direct out the
+ covering box, bounds_from_*, maximize and minimize methods for
+ now. Convert the returns of the system-returning methods from
+ references to values. Reduce to a single widening method:
+ widening_assign(dp).
+
+ Convert both product classes to assume that every method is
+ implemented in both components.
+
+2006-06-29 Thursday 16:06 Matthew Mundell
+
+ * src/Congruence.defs.hh (1.13): Add Constraint friend declaration.
+
+2006-06-29 Thursday 16:06 Matthew Mundell
+
+ * src/: C_Polyhedron.defs.hh (1.43), C_Polyhedron.inlines.hh
+ (1.31): Add constructors that take Grid_Generator_Systems.
+
+2006-06-29 Thursday 16:05 Matthew Mundell
+
+ * src/: Polyhedron.defs.hh (1.299), Polyhedron.inlines.hh (1.132),
+ Polyhedron_public.cc (1.76): Add congruences(),
+ minimized_congruences(), grid_generators(),
+ minimized_grid_generators(), is_discrete(), add_grid_generator(g)
+ and add_grid_generator_and_minimize(g).
+
+2006-06-29 Thursday 16:01 Matthew Mundell
+
+ * src/: Grid_nonpublic.cc (1.15), Grid_public.cc (1.32),
+ Grid.defs.hh (1.25), Grid.inlines.hh (1.9): Add Grid(const gs),
+ Grid(gs), constraints(), minimized_constraints(), generators(),
+ minimized_generators(), add_generator(g) and
+ add_generator_and_minimize(g).
+
+2006-06-29 Thursday 15:56 Matthew Mundell
+
+ * src/: Constraint_System.cc (1.18), Constraint_System.defs.hh
+ (1.29): Add Constraint_System(cgs).
+
+2006-06-29 Thursday 15:55 Matthew Mundell
+
+ * src/: Constraint.cc (1.61), Constraint.defs.hh (1.121),
+ Constraint.inlines.hh (1.64): Add methods
+ throw_invalid_argument(method, msg), Constraint(cg) and
+ Constraint(cg, sz, capacity).
+
+2006-06-29 Thursday 15:53 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (1.13): Improve insert(c)
+ description slightly.
+
+2006-06-29 Thursday 15:52 Matthew Mundell
+
+ * src/: NNC_Polyhedron.defs.hh (1.46), NNC_Polyhedron.inlines.hh
+ (1.33), Congruence_System.cc (1.18): Update Congruence_System(cs)
+ to construct Matrix with the required space dimension.
+
+2006-06-29 Thursday 15:38 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.16): Convert test76 to fail with
+ int8.
+
+2006-06-29 Thursday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.cc (1.60): Constraint::OK() improved: it now
+ detects illegal "strict" equalities.
+
+2006-06-29 Thursday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.91), bug2.cc (1.7), bug2.dat
+ (1.2): The bug shown by bug2.cc and bug2.dat has been fixed long
+ ago.
+
+2006-06-29 Thursday 13:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/bug1.dat (1.4): Testcase simplified.
+
+2006-06-29 Thursday 12:42 Matthew Mundell
+
+ * tests/Polyhedron/bug1.dat (1.3): Add data file for bug1.
+
+2006-06-29 Thursday 12:39 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.90), bug1.cc (1.3): Add bug1.
+
+2006-06-29 Thursday 09:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.27):
+ Simplified code for defining the add_disjuncts replacement - this
+ uses the new macro m4_echo_unquoted added in the previous commit.
+
+2006-06-29 Thursday 08:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[42,26,22]): Added 3 new application-independent
+ macros to the common.m4 m4_echo_quoted, m4_echo_unquoted,
+ m4_arg_counter:
+
+ m4_echo_quoted and m4_echo_unquoted correspond to echo1 and echo2
+ in the m4 documentation. Neither used yet but I plan to use the
+ m4_echo_unquoted to expand terms.
+
+ m4_arg_counter takes a string and a sequence of arguments and
+ either expands to the first index of the argument sequence that
+ matches the string or to the empty string. m4_arg_counter is now
+ used instead of m4_check_if_class_in_group which is removed.
+
+ In common_dat.m4 added a dummy predicate for widening
+ Polyhedra_Powerset classes and in prolog_icc_code.m4 added unused
+ schematic code for developing the widening for powersets (this is
+ prefixed by a "FIXME" and should be ignored).
+
+2006-06-28 Wednesday 19:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+ ppl_interface_generator_prolog_icc_code.m4 (interfaces.[28,21]):
+ Added Polyhedra_Powerset schema predicate for "get_disjuncts"/2.
+ Removed some unwanted commented-out lines of code.
+
+2006-06-28 Wednesday 18:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (octagons.1): Adjusted spacing when
+ using \ to break lines in macro definitions.
+
+2006-06-28 Wednesday 18:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (octagons.18): Do initialize `i' when
+ constructing the past-the-end any_row_iterator, so as to avoid
+ the annoying compiler warning. Do initialize `size_' when
+ default constructing a Pseudo_Row (for the same reason as above).
+
+2006-06-28 Wednesday 16:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[25,27,20]): For the Polyhedra_Powerset classes, we
+ now allow for add_disjunct and pairwise_reduce in the interfaces
+ (currently these are only included in the Prolog interfaces).
+
+2006-06-28 Wednesday 12:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.24):
+ Avoid generating unwanted spaces.
+
+2006-06-28 Wednesday 12:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[23,20,19]): Revised the friend pattern replacement
+ macros. Added handles for C_Polyhedron and NNC_Polyhedron
+ whenever the Polyhedron class is generated.
+
+2006-06-27 Tuesday 20:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: Makefile.am, C/Makefile.am, Prolog/Makefile.am,
+ Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+ Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+ Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+ (interfaces.[2,4,4,4,5,3,3,3,3]): Added the specification of all
+ the dependencies concerning the generation of interfaces.
+
+2006-06-27 Tuesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (interfaces.3): Added
+ ../ppl_interface_generator_common_dat.m4 to
+ interface_generator_files.
+
+2006-06-27 Tuesday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (interfaces.3): Added
+ ../ppl_interface_generator_common_dat.m4 to
+ interface_generator_files.
+
+2006-06-27 Tuesday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (interfaces.2): This is now a generated
+ source.
+
+2006-06-27 Tuesday 13:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.22):
+ Now it does not remove spaces from the class names.
+
+2006-06-27 Tuesday 13:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.21):
+ Simplified the code for the replacements for pattern "friend" by
+ making a new more generic macro. Added friends for octagons and
+ polyhedra_powersets class kinds.
+
+2006-06-27 Tuesday 09:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.[41,20,19]): Added and redone existing code so that
+ any class of kind BD_Shape is a friend of any other class of kind
+ BD_Shape and also a friend of Polyhedron class.
+
+ Note that if a class is defined as a "friend" then the schema
+ name ppl_new_ at TOPOLOGY@@CLASS at _from_@INTOPOLOGY@@FRIEND@ is
+ instantiated to have this class and friend.
+
+ The Prolog C++ (ppl_prolog.icc) code needs the procedure
+ converting terms to class handles to come before use. With this
+ friend code, all these procedures must be defined before any
+ other generated code. Therefore a new macro
+ m4_pre_all_classes_code is called before generating the main
+ classes code. This has a default expansion of the empty string.
+
+2006-06-26 Monday 19:47 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.15): Add directive GRID_IS_D1,
+ for testing with Grid as the first component. In test15 and
+ test16 compare the congruence systems via temporary grids.
+
+2006-06-26 Monday 19:45 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.19), Direct_Product.inlines.hh
+ (1.20), Direct_Product.templates.hh (1.16): Add the
+ system-returning methods to Open_Product so that they reduce the
+ product before returning the system. Add C_Polyhedron
+ specialisation to any methods already specialised for
+ NNC_Polyhedron.
+
+2006-06-26 Monday 09:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[40,19,26,18]): Improved the processing of the
+ replacement lists for a pattern.
+
+ Added 2 new application independent helper macros: - m4_nargs
+ (definition taken from m4 documentation) - m4_arg (finds the
+ n+1'st argument in a list of arguments - where n is the 1st
+ argument)
+
+ The alternative replacement is now also defined via an
+ alternative list of replacements (the number and order must match
+ the usual list of replacements for the given class). This change
+ was triggered by the wish to have a "friend" pattern (see below).
+
+ Introduced a new pattern "friend" and use in in the Prolog
+ interface to use instead of the 2nd "class" in
+ ppl_new_ at CLASS@_from_ at INTOPOLOGY@@CLASS@ ie.,
+ ppl_new_ at CLASS@_from_ at INTOPOLOGY@@FRIEND at . That is, a friend is
+ a class that can be used to construct an element in the current
+ class. Every class is declared to be a friend of itself. The
+ intention is to add to more "friend"s for each class so that, for
+ instance, Polyhedron will be a friend of BD_Shape. Note that the
+ friend pattern is only used in the Prolog interface at the
+ moment.
+
+2006-06-22 Thursday 13:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (octagons.15): Using the new policy
+ WRD_Extendend_Number_Policy when assertions are turned off.
+
+2006-06-22 Thursday 13:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (octagons.[1,1]): Added new policy WRD_Extended_Number_Policy, to
+ be used by weakly-relational domains when assertions are turned
+ off.
+
+2006-06-22 Thursday 11:27 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.49): Corrected a bug
+ in Octagonal_Shape<T>::CC76_narrowing_assign().
+
+2006-06-21 Wednesday 19:49 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.14): Insert is_disjoint() test
+ test34 where the intersection of the products determines the
+ outcome. Add a directive to control the product used.
+
+2006-06-21 Wednesday 19:46 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.18), Direct_Product.inlines.hh
+ (1.19), Direct_Product.templates.hh (1.15): Convert the reduced
+ flag methods to const methods. Update the predicate methods
+ (is_empty(), etc) to first reduce the components. Update
+ is_disjoint_from to consider the intersection of the two
+ products.
+
+2006-06-21 Wednesday 14:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_cc_code.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[39,18,13,21,25,18,17]): Revised the way we handle
+ compound domains (is the powerset and product domains).
+
+ Where compound domains have Polyhedron as a component, the system
+ creates two domains, one where Polyhedron is prefixed by C and
+ the other where it is prefixed by NNC. Note that this change has
+ been made so as _not_ to affect the simple domain Polyhedron.
+
+ As requested, both the user name and the C++ name have the
+ topology C and NNC inserted just before the string "Polyhedron".
+ Note though this still assumes that every component = Polyhedron
+ has the same topology. Automatically generating different
+ topologies for these components will be difficult and not really
+ practical or useful.
+
+ Simplified the way class name patterns are replaced by the actual
+ name. The class patterns are now replaced as part of the main
+ list of replacements.
+
+2006-06-21 Wednesday 13:11 Matthew Mundell
+
+ * src/: Direct_Product.inlines.hh (1.18),
+ Direct_Product.templates.hh (1.14), Direct_Product.defs.hh
+ (1.17): Add a reduced flag to Open_Product. Add reduction
+ function propagate_constraints_reduce and update standard_reduce
+ to call it. Update Open_Product is_bounded to call reduce()
+ instead of propagating constraints directly.
+
+2006-06-21 Wednesday 12:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.48): Removed an
+ efficiency bug (repeated allocations) in the strong closure and
+ strong coherence methods.
+
+2006-06-20 Tuesday 15:30 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.16), Direct_Product.inlines.hh
+ (1.17), Direct_Product.templates.hh (1.13),
+ Direct_Product.types.hh (1.5): Replace the Open_Product reduction
+ methods with a single reduce() method and a reduction function
+ template parameter.
+
+2006-06-20 Tuesday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.types.hh (altnum.1): file
+ Direct_Product.types.hh was added on branch altnum on 2006-10-29
+ 19:27:12 +0000
+
+2006-06-20 Tuesday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.types.hh (octagons.1): file
+ Direct_Product.types.hh was added on branch octagons on
+ 2006-11-18 20:36:50 +0000
+
+2006-06-20 Tuesday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.types.hh (simplex.1): file
+ Direct_Product.types.hh was added on branch simplex on 2006-09-06
+ 18:41:51 +0000
+
+2006-06-18 Sunday 22:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4 (interfaces.[38,17]):
+ Comments improved and redundant code removed.
+
+2006-06-18 Sunday 11:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4 (interfaces.[37,16]):
+ Revised handling of C++ class names so that a product domain with
+ commas works. Basic approach is to immediately replace the ","
+ in the list of C++ names obtained from the instantiations.m4 file
+ by "@COMMA@" and then at the end of the code generation, restore
+ the ",".
+
+2006-06-17 Saturday 10:39 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.13): Add tests of
+ Direct_Product(covering_box), shrink_bounding_box(box) and
+ get_covering_box(box).
+
+2006-06-17 Saturday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/coveringbox2.cc (altnum.1): file coveringbox2.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-17 Saturday 10:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (altnum.1): file ppl_test.cc was added on
+ branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-06-17 Saturday 10:32 Matthew Mundell
+
+ * tests/: Grid/boundingbox2.cc (1.10), ppl_test.cc (1.6),
+ ppl_test.hh (1.48), Grid/coveringbox2.cc (1.10): Move the
+ temporary function operator==(box,box) to ppl_test.cc.
+
+2006-06-17 Saturday 10:31 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.15), Direct_Product.inlines.hh
+ (1.16), Direct_Product.templates.hh (1.12): Define
+ shrink_bounding_box(box) and get_covering_box(box).
+
+2006-06-16 Friday 18:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.15):
+ Previous simplification means that the replacement code here can
+ also be improved.
+
+2006-06-16 Friday 18:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4,
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (interfaces.[36,14,10,5]): Revised comments, Simplified some
+ macros and removed some multiple levels of quoting. Avoid
+ generating unwanted (and unintended) blank lines (by making sure
+ every line ending with "dnl" ends with "`'dnl").
+
+2006-06-16 Friday 16:48 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.12), tests/Grid/directproduct2.cc
+ (1.4), src/Direct_Product.templates.hh (1.11),
+ src/Direct_Product.types.hh (1.4): Add an Open_Product
+ is_bounded() NNC_Polyhedron-Grid specialization which propagates
+ equalities.
+
+2006-06-16 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct2.cc (altnum.1): file directproduct2.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-16 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct2.cc (interfaces.1): file
+ directproduct2.cc was added on branch interfaces on 2006-09-28
+ 20:46:31 +0000
+
+2006-06-16 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct2.cc (octagons.1): file directproduct2.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-16 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct2.cc (simplex.1): file directproduct2.cc
+ was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-16 Friday 16:47 Matthew Mundell
+
+ * src/Polyhedron_public.cc (1.75): Update add_congruences(cgs) and
+ add_congruence(cg) to strong normalize constructed constraints
+ before adding them.
+
+2006-06-16 Friday 15:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4
+ (interfaces.12): Revised C code for including topology in
+ compound C++ class names.
+
+2006-06-16 Friday 14:18 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.11): Add tests of contains() and
+ strictly_contains().
+
+2006-06-16 Friday 14:18 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.14), Direct_Product.inlines.hh
+ (1.15): Implement contains() and strictly_contains().
+
+2006-06-16 Friday 13:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4,
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4
+ (interfaces.[35,24,9,6,4]): Fixed an old bug affecting Ciao and
+ XSB interfaces. The bug was in the handling of the list
+ separator. Now a counter for the list is passed as as argument
+ and the separator is suppressed when the counter is 0.
+
+2006-06-16 Friday 09:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[34,13,23,16]): Completed basic changes for
+ Powerset_Polyhedron<...>. Compilation only tested (in the Prolog
+ interface) for Powerset_Polyhedron<Polyhedron> for the predicates
+ "ppl_new_C_Polyhedra_Powerset_Polyhedron_from_space_dimension"
+ and
+ "ppl_new_NNC_Polyhedra_Powerset_Polyhedron_from_space_dimension".
+
+2006-06-15 Thursday 23:29 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.10): Replace the use of
+ Direct_Product with a local typedef, Product. Add tests of the
+ remaining predicate methods (is_topologically_closed(), etc).
+ Ensure that each of the defined adding methods (add_congruence(),
+ etc) is used at least once in the file.
+
+2006-06-15 Thursday 23:29 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.13), Direct_Product.inlines.hh
+ (1.14), Direct_Product.templates.hh (1.10): Define more of the
+ adding methods (add_congruence(), etc). Take out the constraint
+ parameter congruence adding method declarations. Correct some of
+ the predicate methods.
+
+ Add to Open_Product the remaining constructors, ~Open_Product()
+ and operator=. Define Open_Product::is_universe().
+
+2006-06-15 Thursday 17:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[33,15]): Added provision for prefixing topology
+ wherever in the C++ class name the class "Polyhdedron". Only
+ tested for the basic Polyhedron class and only in the Prolog
+ interface code.
+
+2006-06-15 Thursday 16:16 Matthew Mundell
+
+ * tests/Grid/directproduct2.cc (1.3): Typedef Product to
+ Open_Product instead of Reduced_Product.
+
+2006-06-15 Thursday 16:08 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.12), Direct_Product.inlines.hh
+ (1.13), Direct_Product.templates.hh (1.9),
+ Direct_Product.types.hh (1.3): Rename Reduced_Product
+ Open_Product. Reorder sytem-returning method declarations. Move
+ empty-reduce methods into Open_Product. Define rest of predicate
+ methods (is_bounded(), etc).
+
+2006-06-15 Thursday 15:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.[32,17]): Some bugs fixed.
+
+2006-06-15 Thursday 10:36 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.47): Corrected a code
+ line in Octagonal_Shape<T>::generalized_affine_preimage().
+ Added some new tests on
+ Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-06-15 Thursday 09:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.[31,16]): Revised comments to match previous changes.
+ Improved a few macro names.
+
+2006-06-15 Thursday 09:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4
+ (interfaces.[30,12,15,8]): The m4_class (ie the interface name)
+ and the m4_cpp_name are
+ never passed as arguments now. Instead the number of the class
+ is passed (as well as the class_kind) and the names are found
+ from the definition generated in the initialisation phase.
+
+ The macro definitions for the initialisation of the class
+ names been moved from ppl_interface_generator_common.m4
+ to ppl_interface_generator_common_dat.m4 as these are then
+ used as fixed macros for the main code generation.
+
+ The order of generation has been changed. The @CLASS@ and
+ @CPP_CLASS@ are replaced by the actual class names immediately
+ after getting the code (or, for the Prolog systems, the
+ exntensions have been added)
+
+ In Prolog/ppl_interface_generator_prolog_systems.m4, the macros
+ for generating the Prolog system code for fixed library
+ predicates now uses code specific to these predicates.
+
+2006-06-14 Wednesday 19:20 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.9): Add tests of the rest of the
+ system-returning methods.
+
+2006-06-14 Wednesday 19:20 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.11), Direct_Product.inlines.hh
+ (1.12), Direct_Product.templates.hh (1.8): Add relation_with(g).
+ Define Direct_Product(gs), Direct_Product(cbox) and the rest of
+ the system-returning methods.
+
+2006-06-14 Wednesday 16:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_cc.m4,
+ C/ppl_interface_generator_c_h.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.[29,11,6,6,22,14]): Improved and corrected macro
+ definitions for m4_filter and m4_filter_all. Started passing the
+ class number instead of the m4_interface_class_name and
+ m4_cplusplus_class_name as arguments to macros.
+
+2006-06-12 Monday 19:00 Matthew Mundell
+
+ * src/Direct_Product.defs.hh (1.10), src/Direct_Product.inlines.hh
+ (1.11), src/Direct_Product.templates.hh (1.7),
+ src/Direct_Product.types.hh (1.2), tests/Grid/directproduct2.cc
+ (1.2): Introduce Reduced_Product. Move most Direct_Product
+ reduce methods into Reduced_Product.
+
+2006-06-12 Monday 18:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[28,10,21,13,14]): Revised the way the pattern
+ replacements are defined and revised the code for replacement.
+
+ Extended the prolog_dat.m4 list of predicates that can generate
+ code for BD_Shape to match that of the C interface (and removed a
+ bug that prevented BD_Shape widening compiling).
+
+2006-06-12 Monday 17:27 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.38), directproduct1.cc (1.8),
+ directproduct2.cc (1.1): Add tests of time_elapse_assign(dp) and
+ topological_closure_assign() to directproduct1. Add
+ directproduct2. Move directproduct1 reduce tests into
+ directproduct2.
+
+2006-06-12 Monday 17:26 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.9), Direct_Product.inlines.hh
+ (1.10): Declare Generator_System constructors. Implement
+ time_elapse_assign(dp) and topological_closure_assign().
+
+2006-06-12 Monday 16:03 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.7): Add tests of
+ difference_assign(y) and of the affine transformation methods.
+
+2006-06-12 Monday 16:03 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.8), Direct_Product.inlines.hh
+ (1.9), Direct_Product.templates.hh (1.6): Declare Generator
+ adding methods. Implement difference_assign(y) and the affine
+ transformation methods.
+
+2006-06-12 Monday 16:02 Matthew Mundell
+
+ * tests/Grid/: generalizedaffinepreimage1.cc (1.12),
+ generalizedaffinepreimage2.cc (1.12): Move
+ generalizedaffinepreimage2 test06 into
+ generalizedaffinepreimage1.
+
+2006-06-11 Sunday 10:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ C/ppl_interface_generator_c_cc_code.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[27,11,20,20,13]): Corrected a bug introduced for
+ formatting.
+
+ Revised the use of generator to grid_generator to match changes
+ due to merge from the trunk.
+
+ Removed the use of alt_box replacement for the grid
+ "get_covering_box" and "get_bounding_box", by providing the code
+ explicitly.
+
+ Now the "alt_" replacement is not used anymore and this option
+ for defining replacements will be removed later when other
+ improvements here are made..
+
+2006-06-11 Sunday 09:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence_System.cc, src/Direct_Product.defs.hh,
+ src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+ src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_public.cc,
+ src/Grid_simplify.cc, src/Grid_widenings.cc,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Makefile.am, src/Polyhedron.defs.hh, src/globals.defs.hh,
+ tests/print.cc, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/contains1.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+ tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+ tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+ tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+ tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc
+ (interfaces.[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ First merge from the main trunk.
+
+2006-06-10 Saturday 12:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.9):
+ Comment improved.
+
+2006-06-10 Saturday 12:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4
+ (interfaces.[26,8,19,19]): Bug fixed in
+ Prolog/ppl_interface_generator_prolog_dat.m4
+
+ Comments improved.
+
+ Improvements to formatting.
+
+2006-06-10 Saturday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+ ppl_interface_generator_prolog_icc_code.m4 (interfaces.[18,12]):
+ Now using `@' as a pattern delimiter.
+
+2006-06-10 Saturday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (interfaces.7): Changed macro m4_pattern_delimiter so as to use
+ `@' as a delimiter.
+
+2006-06-10 Saturday 10:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_dat.m4,
+ ppl_interface_generator_c_h_code.m4 (interfaces.[10,18,9]): Now
+ patterns are delimited by `@'.
+
+2006-06-10 Saturday 10:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.25):
+ Changed macros m4_extension and m4_pattern_delimiter so as to
+ allow for the use of `@' as a pattern delimiter.
+
+2006-06-09 Friday 23:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4
+ (interfaces.[24,7,17,17]): Revised the way the groups of classes
+ are defined and used. Thus the selection and deselection of a
+ procedure for a given group or class kind is clearer and easier
+ to extend. An initial list of groups and the classes they
+ include is provided in ppl_interface_generator_common_dat.m4.
+
+ Also, allow for arity and the attribute "nofail" to be optionally
+ defined and occur anywhere in the info text after the procedure
+ name.
+
+2006-06-09 Friday 16:07 Matthew Mundell
+
+ * tests/Grid/expandspacedim1.cc (1.10): Add the description to the
+ print message in test04.
+
+2006-06-09 Friday 16:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/expandspacedim1.cc (altnum.1): file expandspacedim1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-09 Friday 16:06 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.6): Add tests of the dimension
+ changing methods.
+
+2006-06-09 Friday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/directproduct1.cc (interfaces.1): file
+ directproduct1.cc was added on branch interfaces on 2006-06-11
+ 07:13:48 +0000
+
+2006-06-09 Friday 16:02 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.7), Direct_Product.inlines.hh
+ (1.8), Direct_Product.templates.hh (1.5): Rename methods,
+ replacing "generator" with "grid_generator". Add
+ grid_generators() and minimized_grid_generators(). Implement
+ congruences(), add_grid_generator(g),
+ add_grid_generator_and_minimize(g) and the dimension changing
+ methods.
+
+2006-06-09 Friday 16:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Direct_Product.templates.hh (interfaces.1): file
+ Direct_Product.templates.hh was added on branch interfaces on
+ 2006-06-11 07:13:47 +0000
+
+2006-06-09 Friday 14:06 Matthew Mundell
+
+ * tests/Grid/removespacedims2.cc (1.12): Add test12.
+
+2006-06-09 Friday 14:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/removespacedims2.cc (altnum.1): file
+ removespacedims2.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-06-09 Friday 14:05 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.9): Correct the dim_kinds to congruence
+ mapping assumed in the congruence case of
+ remove_higher_space_dimensions.
+
+2006-06-09 Friday 13:59 Matthew Mundell
+
+ * tests/Grid/concatenate1.cc (1.12): Order the known_cgs insertions
+ in test05 by dimension.
+
+2006-06-09 Friday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/concatenate1.cc (altnum.1): file concatenate1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 20:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ *
+ interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+ (interfaces.4): Added a few comments.
+
+2006-06-08 Thursday 20:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_common_dat.m4 (interfaces.[23,6]):
+ Updated so as to exploit the configuration-generated information
+ about the required instantiations.
+
+2006-06-08 Thursday 20:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/Makefile.am, Prolog/Makefile.am,
+ Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+ Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+ Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+ (interfaces.[2,2,3,4,2,2,2,2]): Updated so as to allow m4 to
+ include from $(top_buildir)/interfaces.
+
+2006-06-08 Thursday 19:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: SWI/ppl_interface_generator_swiprolog_cc.m4,
+ YAP/ppl_interface_generator_yap_cc.m4 (interfaces.[5,3]): Added
+ useful comments.
+
+2006-06-08 Thursday 19:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+ (interfaces.6): Adapted to new style of common macros. Also added
+ a few coments.
+
+2006-06-08 Thursday 19:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.11): Added a cople of newlines where needed.
+
+2006-06-08 Thursday 19:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/ppl_interface_generator_c_h.m4,
+ C/ppl_interface_generator_c_cc.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.[5,5,12]): Adapted to new style of global macros.
+ Also added a few comments.
+
+2006-06-08 Thursday 19:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.16):
+ Use commas to separate entries in m4_procedure_list.
+
+2006-06-08 Thursday 19:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_code.m4 (interfaces.8):
+ Added a few missing commas that were at the origina of a
+ debugging nightmare.
+
+2006-06-08 Thursday 19:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.22): The
+ common macros changed so as to prefer working with explicit
+ arguments rather than global macros. There still are global
+ macros, but these are restricted to be the ones defined in the
+ _dat files.
+
+2006-06-08 Thursday 12:05 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (1.11),
+ tests/Grid/addcongruences1.cc (1.14), tests/Grid/addgenerator1.cc
+ (1.13), tests/Grid/addgenerators1.cc (1.12),
+ tests/Grid/addspacedims1.cc (1.12), tests/Grid/affinedim1.cc
+ (1.10), tests/Grid/affineimage1.cc (1.11),
+ tests/Grid/affineimage2.cc (1.8), tests/Grid/affinepreimage1.cc
+ (1.10), tests/Grid/affinepreimage2.cc (1.5),
+ tests/Grid/asciidumpload1.cc (1.11), tests/Grid/asciidumpload2.cc
+ (1.4), tests/Grid/bounded1.cc (1.11), tests/Grid/boundingbox1.cc
+ (1.12), tests/Grid/boundingbox2.cc (1.9), tests/Grid/bounds1.cc
+ (1.13), tests/Grid/certificate1.cc (1.11),
+ tests/Grid/congruences1.cc (1.10), tests/Grid/contains1.cc
+ (1.10), tests/Grid/coveringbox1.cc (1.12),
+ tests/Grid/coveringbox2.cc (1.9), tests/Grid/directproduct1.cc
+ (1.5), tests/Grid/discrete1.cc (1.5), tests/Grid/disjoint1.cc
+ (1.9), tests/Grid/equals1.cc (1.10),
+ tests/Grid/expandspacedim1.cc (1.9), tests/Grid/foldspacedims1.cc
+ (1.9), tests/Grid/generalizedaffineimage1.cc (1.10),
+ tests/Grid/generalizedaffineimage2.cc (1.9),
+ tests/Grid/generalizedaffinepreimage1.cc (1.11),
+ tests/Grid/generalizedaffinepreimage2.cc (1.11),
+ tests/Grid/generators1.cc (1.11), tests/Grid/grid1.cc (1.16),
+ tests/Grid/griddifference1.cc (1.10), tests/Grid/intersection1.cc
+ (1.9), tests/Grid/isempty1.cc (1.6), tests/Grid/join1.cc (1.14),
+ tests/Grid/join2.cc (1.9), tests/Grid/limitedextrapolation1.cc
+ (1.10), tests/Grid/limitedextrapolation2.cc (1.4),
+ tests/Grid/limitedextrapolation3.cc (1.3),
+ tests/Grid/mapspacedims1.cc (1.9), tests/Grid/maxmin1.cc (1.10),
+ tests/Grid/membytes1.cc (1.6), tests/Grid/mingenerators1.cc
+ (1.8), tests/Grid/outputoperator1.cc (1.7),
+ tests/Grid/relations2.cc (1.12), tests/Grid/relations3.cc (1.4),
+ tests/Grid/removespacedims1.cc (1.12),
+ tests/Grid/removespacedims2.cc (1.11), tests/Grid/timeelapse1.cc
+ (1.9), tests/Grid/topclosed1.cc (1.10), tests/Grid/widening1.cc
+ (1.13), tests/Grid/widening2.cc (1.6), tests/Grid/widening3.cc
+ (1.3), src/Direct_Product.defs.hh (1.6),
+ src/Direct_Product.inlines.hh (1.7),
+ src/Direct_Product.templates.hh (1.4), src/Grid.defs.hh (1.24),
+ src/Grid.templates.hh (1.15), src/Grid_public.cc (1.31),
+ src/Grid_widenings.cc (1.9), tests/print.cc (1.26): Rename
+ Grid_Generator methods, replacing "generator" with
+ "grid_generator".
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addcongruence1.cc (altnum.1): file addcongruence1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addcongruences1.cc (altnum.1): file addcongruences1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addgenerator1.cc (altnum.1): file addgenerator1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addgenerators1.cc (altnum.1): file addgenerators1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addspacedims1.cc (altnum.1): file addspacedims1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinedim1.cc (altnum.1): file affinedim1.cc was added
+ on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage1.cc (altnum.1): file affineimage1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinepreimage1.cc (altnum.1): file affinepreimage1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinepreimage2.cc (altnum.1): file affinepreimage2.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload2.cc (altnum.1): file asciidumpload2.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bounded1.cc (altnum.1): file bounded1.cc was added on
+ branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bounds1.cc (altnum.1): file bounds1.cc was added on
+ branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruences1.cc (altnum.1): file congruences1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/contains1.cc (altnum.1): file contains1.cc was added
+ on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/coveringbox1.cc (altnum.1): file coveringbox1.cc was
+ added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/disjoint1.cc (altnum.1): file disjoint1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generators1.cc (altnum.1): file generators1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/griddifference1.cc (altnum.1): file griddifference1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/intersection1.cc (altnum.1): file intersection1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/isempty1.cc (altnum.1): file isempty1.cc was added on
+ branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/join1.cc (altnum.1): file join1.cc was added on branch
+ altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/join2.cc (altnum.1): file join2.cc was added on branch
+ altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation1.cc (altnum.1): file
+ limitedextrapolation1.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation2.cc (altnum.1): file
+ limitedextrapolation2.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation3.cc (altnum.1): file
+ limitedextrapolation3.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mapspacedims1.cc (altnum.1): file mapspacedims1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/maxmin1.cc (altnum.1): file maxmin1.cc was added on
+ branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mingenerators1.cc (altnum.1): file mingenerators1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator1.cc (altnum.1): file outputoperator1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations3.cc (simplex.1): file relations3.cc was
+ added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/removespacedims1.cc (altnum.1): file
+ removespacedims1.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/timeelapse1.cc (altnum.1): file timeelapse1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/topclosed1.cc (altnum.1): file topclosed1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening1.cc (altnum.1): file widening1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening3.cc (altnum.1): file widening3.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 08:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_icc.m4,
+ Ciao/ppl_interface_generator_ciao_pl.m4 (interfaces.[11,5]):
+ Corrected a bug in _ciao_pl.m4.
+
+ Corrected a bug in the addition of the extra widening code in
+ _icc.m4. Also removed code that checked the number of binop
+ replacements for that class: this is because, now LP_Problem is a
+ fixed class, all the classes denote domains with at least one
+ binary operator.
+
+2006-06-07 Wednesday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, interfaces/Makefile.am (interfaces.[4,1]): Finished
+ the support for the --enable-instantiations configuration option.
+
+2006-06-07 Wednesday 21:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.10): Fixed a bug in the expansion of num_binops for
+ generating the Prolog ppl_prolog.icc.
+
+2006-06-07 Wednesday 17:46 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.4): Add tests of
+ intersection_assign and upper_bound_assign. Enable the grid
+ generator constructor tests.
+
+2006-06-07 Wednesday 17:44 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.5), Direct_Product.inlines.hh
+ (1.6), Direct_Product.templates.hh (1.3): Add
+ empty_reduce_d1_with_d2() and empty_reduce_d2_with_d1(). Define
+ add_generator(). Add Grid Polyhedron specialisations off
+ add_generator() and of the grid generator constructors. Take out
+ grid methods intersection_assign_and_minimize,
+ join_assign_and_minimize and join_assign_if_exact.
+
+2006-06-07 Wednesday 15:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.5):
+ is_disjoint_from is also defined for BD shapes.
+
+2006-06-07 Wednesday 15:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.4):
+ Restored join_assign and join_assign_and minimize for Grids.
+
+2006-06-07 Wednesday 15:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.10): Added spaces at the end of function definitions
+ to improve readability of generated file. Try to avoid spurious
+ indentations in the definnition of parameter lists.
+
+2006-06-07 Wednesday 14:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.3):
+ The first 5 binary operators are common to all instantiations.
+ Polyhedra and BD_Shape have some *further* binary operators with
+ instantiation specific names. For simplicity, do NOT have
+ binminop's depend on binop's.
+
+2006-06-07 Wednesday 14:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_dat.m4,
+ ppl_interface_generator_c_h_code.m4 (interfaces.[9,15,7]): Method
+ concatenate_assign is now dealt with as all the other binary
+ operators.
+
+2006-06-07 Wednesday 14:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common_dat.m4,
+ C/ppl_interface_generator_c_cc_code.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ C/ppl_interface_generator_c_h_code.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[2,8,14,6,9]): Swap generator and grid generator in
+ replacement code.
+
+2006-06-07 Wednesday 14:16 Matthew Mundell
+
+ * tests/Grid/: join1.cc (1.13), join2.cc (1.8): Move join1 test12
+ to join2. Add join2 test13, to test
+ upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 14:14 Matthew Mundell
+
+ * src/: Grid.defs.hh (1.23), Grid.inlines.hh (1.8): Add
+ upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 13:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+ (interfaces.16): Include file
+ ppl_interface_generator_common_dat.m4 instead of repeating
+ language independent macros. Prefer dnl to # for m4 comments.
+
+2006-06-07 Wednesday 13:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.13):
+ Include ppl_interface_generator_common_dat.m4 instead of
+ repeating language independent macros. LP_Problem is always
+ interfaced. Dropped arities from name of procedures.
+
+2006-06-07 Wednesday 13:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_h_code.m4 (interfaces.[7,5]): Dropped
+ trailing underscore from patterns TOPOLOGY_ and INTOPOLOGY_.
+
+2006-06-07 Wednesday 13:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.21):
+ Simplified macro m4_replace_class_patterns.
+
+2006-06-07 Wednesday 13:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common_dat.m4 (interfaces.1):
+ The common (i.e., language indepedent) part of
+ ppl_interface_generator_<LANG>_dat.m4 moved here to avoid
+ inconsistencies.
+
+2006-06-07 Wednesday 12:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4
+ (interfaces.[20,5]): Added a macro "m4_pattern_delimiter". This
+ is defined in ppl_interface_generator_common.m4 as `4' and
+ Prolog/ppl_interface_generator_prolog_systems.m4 as `4'.
+
+ When the patterns in the procedure macro names have no
+ delimeters, and when the code has @ delimiter, these must be
+ changed, the common definition to `@' and the system definition
+ to `'.
+
+2006-06-07 Wednesday 10:33 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.3): Add is_universe() tests.
+
+2006-06-06 Tuesday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+ (interfaces.15): Bug corrected.
+
+2006-06-06 Tuesday 21:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+ ppl_interface_generator_prolog_icc_code.m4,
+ ppl_interface_generator_prolog_icc_preamble
+ (interfaces.[14,8,4]): term_to_polyhedron_handle and similar are
+ now with the class name (polyhedron) in capitals. Many of the
+ BD_Shape procedures are now compiling ok in the Prolog interface.
+
+2006-06-06 Tuesday 18:54 Matthew Mundell
+
+ * tests/Grid/directproduct1.cc (1.2): Add tests of is_empty() and
+ reduce().
+
+2006-06-06 Tuesday 18:52 Matthew Mundell
+
+ * tests/Grid/bhz03widening1.cc (1.9): Correct spacing.
+
+2006-06-06 Tuesday 18:52 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.4), Direct_Product.inlines.hh
+ (1.5), Direct_Product.templates.hh (1.2): Implement is_empty and
+ is_universe. Specialise the reduce methods for
+ Direct_Product<NNC_Polyhedron, Grid>.
+
+2006-06-06 Tuesday 17:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+ ppl_interface_generator_prolog_icc_code.m4,
+ ppl_interface_generator_prolog_icc_preamble
+ (interfaces.[13,7,3]): LP_Problem is no longer generated with the
+ other classes. In the dat.m4 file, all the LP_Problem procedures
+ are listed as "library procedures" for the system Prolog files.
+
+2006-06-06 Tuesday 16:05 Matthew Mundell
+
+ * src/: Congruence.defs.hh (1.12), Congruence.inlines.hh (1.11):
+ Take out the private version of modulus().
+
+2006-06-06 Tuesday 15:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/exceptions.hh,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ Prolog/ppl_interface_generator_prolog_icc_preamble
+ (interfaces.[19,2,12,9,6,2]): In
+ ppl_interface_generator_common.m4, revised `m4_get_code_schema'
+ to correct a bug.
+
+ In the Prolog directory Allow for exceptions for any user class
+ when using ppl class handles. There is one common exception
+ called ppl_handle_mismatch for all classes.
+
+ The code for term_to_polyhedron_handle and similar is now
+ replaced by a schema that generates this code for all the user
+ classes.
+
+ The procedure list has XBD_Shape everywhere and the user class
+ BD_Shape<int8_t> added to the list of classes being tested.
+
+2006-06-06 Tuesday 14:09 Matthew Mundell
+
+ * src/: Direct_Product.inlines.hh (1.4),
+ Direct_Product.templates.hh (1.1), Makefile.am (1.154): Add
+ Direct_Product.templates.hh. Move reduce() and ascii_load(s)
+ there. Add inline keyword to all inline methods definitions.
+
+2006-06-06 Tuesday 13:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.12):
+ Use @ instead of , to separate instances.
+
+2006-06-06 Tuesday 13:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.6):
+ Corrected code schemas using pattern DESCRIBE.
+
+2006-06-06 Tuesday 13:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh, BD_Shape.inlines.hh,
+ BD_Shape.templates.hh (interfaces.[1,1,1]): Added methods:
+ shrink_bounding_box is_topologically_closed
+ topologcal_closure_assign is_disjoint_from
+ add_recycled_constraints add_recycled_constraints_and_minimize.
+
+2006-06-06 Tuesday 12:33 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.37), asciidumpload7.cc (1.1),
+ directproduct1.cc (1.1): Add directproduct1 and asciidumpload7.
+
+2006-06-06 Tuesday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload7.cc (altnum.1): file asciidumpload7.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-06 Tuesday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload7.cc (interfaces.1): file
+ asciidumpload7.cc was added on branch interfaces on 2006-06-11
+ 07:13:48 +0000
+
+2006-06-06 Tuesday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload7.cc (octagons.1): file asciidumpload7.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-06 Tuesday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload7.cc (simplex.1): file asciidumpload7.cc
+ was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-06-05 Monday 19:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.18):
+ Fixed an old bug whereby "Polyhedron" could not be used to
+ indicate that that was the only class to be coded for the
+ schematic procedure name.
+
+2006-06-05 Monday 17:43 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.3), Direct_Product.inlines.hh
+ (1.3): Add Direct_Product(bbox).
+
+2006-06-05 Monday 17:41 Matthew Mundell
+
+ * src/Grid.defs.hh (1.22), src/Grid_public.cc (1.30),
+ tests/Grid/topclosed1.cc (1.9): Update is_topologically_closed to
+ return true always.
+
+2006-06-05 Monday 17:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4, C/ppl_c.cc,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[17,1,11,5]): Fixed a bug in the Prolog dat.m4 file.
+ Changed the separator in the input list to be an @ and not a ,.
+
+2006-06-05 Monday 17:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.11):
+ Temporarily disable the generation of a few functions in some
+ interfaces.
+
+2006-06-05 Monday 17:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+ (interfaces.4): Corrected comment in the first line.
+
+2006-06-05 Monday 17:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+ (interfaces.8): Prefer dnl to ifelse to have an m4 comment.
+
+2006-06-05 Monday 15:49 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.18): Add test23, which tests
+ Linear_Expression(const Grid_Generator&).
+
+2006-06-05 Monday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generator1.cc (altnum.1): file generator1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-05 Monday 15:48 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh (1.23), Linear_Expression.cc (1.12),
+ Linear_Expression.defs.hh (1.26): Add Linear_Expression(const
+ Grid_Generator&).
+
+2006-06-05 Monday 14:55 Matthew Mundell
+
+ * src/: Grid.defs.hh (1.21), Polyhedron.defs.hh (1.298): Correct
+ type of get_lower_bound and get_upper_bound `closed' arguments in
+ docs.
+
+2006-06-05 Monday 14:54 Matthew Mundell
+
+ * src/Grid.templates.hh (1.14): Add initialisation of box
+ constructor closed flag variables.
+
+2006-06-05 Monday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.10):
+ Octagon renamed Octagonal_Shape. join_assign renamed
+ upper_bound_assign.
+
+2006-06-05 Monday 12:11 Matthew Mundell
+
+ * src/: Direct_Product.defs.hh (1.2), Direct_Product.inlines.hh
+ (1.2): Add domain1(), domain2(), reduce_domain1_with_domain2(),
+ reduce_domain2_with_domain1(), reduce(), OK(), ascii methods and
+ operator<<. Implement some of the already defined methods.
+
+2006-06-05 Monday 12:09 Matthew Mundell
+
+ * src/globals.defs.hh (1.37): Add macro
+ PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS.
+
+2006-06-05 Monday 10:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.16): In
+ macro m4_replace_pattern, which gets called several times and
+ re-defines the same macros (PATTERN, num_strings, etc.) each
+ time, prefer using bultins pushdef and popdef instead of define.
+ Same change in m4_all_classes_loop. Prefer using pattern
+ 4CPP_CLASS4 to 4SYSCLASS4. Macro m4_replace_with_code renamed as
+ m4_get_code_schema. Macro m4_filter changed so as to perform
+ filtering by using m4_class_kind instead of m4_class.
+
+2006-06-05 Monday 10:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.5):
+ The CPP macro PPL_TYPE_DECLARATION made more readable by adding
+ line breaks.
+
+2006-06-05 Monday 10:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.5):
+ In the code schemas, using pattern 4CPP_CLASS4 instead of 4CLASS4
+ where appropriate.
+
+2006-06-05 Monday 10:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.4): The
+ class preamble changed to invoke DECLARE_CONVERSIONS with two
+ arguments.
+
+2006-06-05 Monday 10:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc_preamble
+ (interfaces.4): The CPP macro DEECLARE_CONVERSIONS changed to
+ take two arguments so as to also accomodate for the case of
+ templatic classes, where the interface class name is different
+ from the C++ class name in a nontrivial way.
+
+2006-06-05 Monday 10:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.4):
+ Prefer dnl to # for m4 comments.
+
+2006-06-05 Monday 10:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.9):
+ Prefer dnl to # to implement m4 comments. Let the macros
+ m4_class_group and m4_class_super_group take an argument instead
+ of having its value hard-wired in. The macro
+ m4_pattern_substitution_list renamed as m4_patter_list (because
+ it only list patterns and not their substitutions); dropped a
+ mismatched parenthesis at the end of the list.
+
+2006-06-05 Monday 09:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[15,7]):
+ Renamed and changed macro "m4_set_class" to
+ "m4_replace_class_patterns".
+
+ New version allows for different patterns for the class name so
+ as to differentiate between the different applications of the
+ pattern (user name, C++ name and the kind of class).
+
+2006-06-04 Sunday 22:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[14,8,10,4]): In ppl_interface_generator_common.m4,
+ changed the macro name set_schema_strings to
+ replace_all_patterns.
+
+ The same name change in C/ppl_interface_generator_c_dat.m4 and
+ Prolog/ppl_interface_generator_prolog_dat.m4 where this macro is
+ defined.
+
+ In the Prolog interface, the and_embed and and_project combined
+ into one schema as already done in the C interface.
+
+ In response to a FIXME comment in the C interface code, the
+ concatenate_assign is now included in the schema corresponding to
+ the binop pattern. This change has only been done in the Prolog
+ interface.
+
+2006-06-04 Sunday 22:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.13):
+ Added example for m4_get_name_components. Entended macro
+ m4_all_classes_loop to define more macros about the current class
+ name - its components and type. Added an example to show what is
+ defined.
+
+2006-06-04 Sunday 16:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ C/ppl_interface_generator_c_cc_code.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ C/ppl_interface_generator_c_h_code.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[12,4,7,4,9,6,3]): All the patterns have been changed
+ to 4PATTERN4 or 4UALT_PATTERN4 or 4UPATTERN4 or 4ALT_PATTERN4.
+ Several patterns have improved names. The pattern M4_CLASS is
+ replaced by 4CLASS4 everywhere.
+
+2006-06-03 Saturday 16:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.4):
+ Some formatting. Declare print functions for congruences, grid
+ generatorsand their systems.
+
+2006-06-03 Saturday 16:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.3):
+ Classes should be declared outside of the Doxygen documentation
+ block listing their functions.
+
+2006-06-03 Saturday 16:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.6):
+ Classes should be declared outside of the Doxygen comment block
+ listing their functions.
+
+2006-06-03 Saturday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_h_code.m4 (interfaces.[3,3]): We now
+ have a single ppl_new_<classname>_from_space_dimension() method,
+ also taking an integer (interpreted as a Boolean) dictating
+ whether or not the new object has to be empty or universe.
+
+2006-06-03 Saturday 14:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc_preamble,
+ ppl_interface_generator_c_h_preamble (interfaces.[3,3]): Added a
+ lot of (fixed, i.e., non m4-generated) interface code for the
+ handling of congruences, grid generators and their systems.
+
+2006-06-03 Saturday 11:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[11,5]):
+ Renamed m4_set_string by m4_replace_pattern.
+
+2006-06-03 Saturday 11:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/ppl_interface_generator_common.m4 (interfaces.10):
+ Prefer dnl to # when writing m4 comments.
+
+ In macro m4_set_string(), made the following substitutions for
+ readability: - ustring ==> PATTERN - actual_string
+ ==> replacement - alt_actual_string ==> alt_replacement
+ - Uactual_string ==> Replacement - Ualt_actual_string ==>
+ Alt_Replacement
+
+ Macros m4_init_*_classes() now take a single argument. The
+ counter is only used by the auxiliary macros
+ m4_init_*_classes_aux().
+
+2006-06-03 Saturday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc.m4,
+ ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_cc_preamble,
+ ppl_interface_generator_c_dat.m4, ppl_interface_generator_c_h.m4,
+ ppl_interface_generator_c_h_code.m4,
+ ppl_interface_generator_c_h_preamble
+ (interfaces.[3,2,2,5,2,2,2]): Corrected so as to use M4_CLASS and
+ the new common functions defined by Pat. Also made further steps
+ towards the generation of the Grid C interface.
+
+2006-06-02 Friday 11:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[9,8]):
+ Improved some comments. Removed the definition and use of the
+ short_class_name.
+
+2006-06-02 Friday 10:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[8,7]):
+ Revised the way the user list of classes is handled and now the
+ list of classes for both the interface names and the C++
+ procedures must be a comma separated sequence.
+
+2006-06-02 Friday 08:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[7,6]):
+ Changed the way the list of classes to be supported is given and
+ how these are handled. This aims to allow for automatic
+ generation of these lists by the configure file.
+
+ The current code will support the classes such as Polyhhedron,
+ LP_Problem, Grid and also those such as BD_Shape<int8_t> with a
+ numeric type.
+
+2006-06-01 Thursday 12:26 Matthew Mundell
+
+ * tests/Grid/coveringbox1.cc (1.11): Update test13 to DO_TEST_F16.
+
+2006-06-01 Thursday 11:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4,
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ Prolog/YAP/ppl_interface_generator_yap_cc.m4
+ (interfaces.[6,4,4,4,3,3,3,3,2]): The macro "m4_extension" is now
+ defined directly in the Prolog systems m4 files. The macro
+ "extension" is no more.
+
+ This change only affects the Prolog interface as the default
+ definition for "m4_extension" for the C++ and C files is in the
+ common.m4 file.
+
+ Also, in common.m4, the internal counters for calls to
+ m4_forloop, renamed as m4_i.
+
+2006-06-01 Thursday 10:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4
+ (interfaces.[5,5,4,2]): The dynamically created macro "class" is
+ now "m4_class". The fixed list of classes "Class`'i is now
+ m4_Class`'i The pattern CLASS is now M4_CLASS The pattern cLASS
+ is now M4_lCLASS (l = lower case) Note that these changes need
+ propagating in the C interface files.
+
+2006-06-01 Thursday 08:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4
+ (interfaces.[4,4,4]): The dat.m4 file for the C interface is
+ updated with changes to that in the prolog interface.
+
+ Comments in the Prolog interface dat.m4 file improved.
+
+ The arity "/" symbol is now optional for the procedure schema
+ names - but this needs testing in the C interface.
+
+2006-05-31 Wednesday 23:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4
+ (interfaces.[3,3,3,3]): Redone some code so that more is common -
+ ie avoid having similar definitions in different files. Changes
+ to macro names will break the C interface m4 code and the
+ "_dat.m4" will need revising.
+
+2006-05-31 Wednesday 22:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (interfaces.3): We now have to configure file
+ ppl_c_version.h.in (not ppl_c.h.in).
+
+2006-05-31 Wednesday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, instchk.hh (interfaces.[2,2]): Correctly check for
+ valid instantiations.
+
+2006-05-31 Wednesday 18:04 Matthew Mundell
+
+ * tests/Grid/congruences2.cc (1.3): Rename helper function
+ `fulfils' to `satisfies'. Correct test08.
+
+2006-05-31 Wednesday 17:16 Matthew Mundell
+
+ * tests/Grid/congruences2.cc (1.2): Convert the fulfils generator
+ system parameter into a generator.
+
+2006-05-31 Wednesday 17:15 Matthew Mundell
+
+ * tests/Grid/affinepreimage1.cc (1.9): Convert test12 FIXME into a
+ TODO.
+
+2006-05-31 Wednesday 17:14 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (1.12): Correct indentation of
+ messages. Turn test04 into a divisor test.
+
+2006-05-31 Wednesday 16:18 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (1.13): Leave the
+ remove_space_dimensions swap_columns Matrix qualifiers as they
+ are.
+
+2006-05-31 Wednesday 16:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (interfaces.1): A first attempt at
+ generating automatically ppl_c.h.
+
+2006-05-31 Wednesday 16:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c_version.h.in (interfaces.1): Factored out the
+ tiny part of ppl_c.h depending on PPL version number.
+
+2006-05-31 Wednesday 16:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_h.m4,
+ ppl_interface_generator_c_h_code.m4,
+ ppl_interface_generator_c_h_preamble (interfaces.[1,1,1]): First
+ attempt at generating file ppl_c.h.
+
+2006-05-31 Wednesday 16:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.3):
+ Dropping useless nofail attributes.
+
+2006-05-31 Wednesday 16:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.2):
+ Using new common macro names.
+
+2006-05-31 Wednesday 16:05 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.8): Covert FIXMEs in expand_space_dimension
+ and fold_space_dimensions to TODOs.
+
+2006-05-31 Wednesday 16:04 Matthew Mundell
+
+ * src/Grid_public.cc (1.29): Take FIXME out of
+ generalized_affine_preimage/3.
+
+2006-05-31 Wednesday 15:17 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (1.16): Add namespace to
+ operator== friend declaration.
+
+2006-05-31 Wednesday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (interfaces.1): Allow instantiation with Grid of the
+ non-C++ interfaces.
+
+2006-05-31 Wednesday 15:15 Matthew Mundell
+
+ * tests/Grid/boundingbox1.cc (1.11): Add int8 failure to test13
+ invocation.
+
+2006-05-31 Wednesday 15:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (interfaces.1): Restore the code for the
+ --enable-instantiations configure option.
+
+2006-05-31 Wednesday 14:13 Matthew Mundell
+
+ * tests/Grid/coveringbox1.cc (1.10): Add int8 failure to test13
+ invocation.
+
+2006-05-31 Wednesday 14:12 Matthew Mundell
+
+ * src/Grid.templates.hh (1.13): Move the Grid box constructor
+ point_divisor declarations into the blocks that use them.
+
+2006-05-31 Wednesday 13:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (interfaces.3): Let also GNU
+ Prolog compile.
+
+2006-05-31 Wednesday 13:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc, GNU/Makefile.am,
+ GNU/ppl_gprolog.pl, GNU/ppl_interface_generator_gprolog_pl.m4,
+ SWI/ppl_interface_generator_swiprolog_cc.m4,
+ SWI/ppl_swiprolog.cc, XSB/ppl_interface_generator_xsb_H.m4,
+ XSB/ppl_interface_generator_xsb_cc.m4, XSB/ppl_xsb.H,
+ XSB/ppl_xsb.cc, YAP/ppl_yap.cc
+ (interfaces.[1,2,1,3,2,1,2,2,1,1,1]): Got rid of automatically
+ generated files.
+
+2006-05-31 Wednesday 13:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/:
+ ppl_interface_generator_sicstus_sd_cc.m4, ppl_sicstus_sd.cc
+ (interfaces.[2,1]): Get rid of the ppl_sicstus_sd.cc (which is
+ now generated automatically).
+
+2006-05-31 Wednesday 13:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am, ppl_ciao.pl,
+ ppl_interface_generator_ciao_pl.m4 (interfaces.[2,1,3]): Let the
+ automatically generated Ciao Prolog interface compile.
+
+2006-05-30 Tuesday 22:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ C/ppl_interface_generator_c_dat.m4,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_systems.m4,
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+ (interfaces.[2,2,2,2,2,2,2]): Many of the fixed macro names are
+ now prefixed by m4_. Some internal codes improved. The macros
+ for generating the extensions for the Prolog systems moved to the
+ prolog_systems.m4 file from the common.m4 file.
+
+2006-05-30 Tuesday 16:32 Matthew Mundell
+
+ * src/Grid.templates.hh (1.12): Use const references for
+ point_divisor in the box constructors.
+
+2006-05-30 Tuesday 15:22 Matthew Mundell
+
+ * src/Grid.templates.hh (1.11): Update map_space_dimensions to
+ throw an exception if the pfunc::maps call fails.
+
+2006-05-30 Tuesday 14:41 Matthew Mundell
+
+ * tests/Grid/grid3.cc (1.18): Correct DO_TEST invocations for
+ test09 and test10.
+
+2006-05-30 Tuesday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid3.cc (altnum.1): file grid3.cc was added on branch
+ altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-30 Tuesday 14:32 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.17), src/Congruence_System.cc (1.17),
+ src/Grid_Generator.cc (1.13), src/Grid_Generator.defs.hh (1.22):
+ Convert division operations to exact_div_assign calls. Move
+ Grid_Generator::scale_to_divisor to the private section.
+
+2006-05-30 Tuesday 13:57 Matthew Mundell
+
+ * src/Grid_public.cc (1.28): Move the modulus negation check back
+ out of the congruence creation in generalized_affine_image/3 and
+ generalized_affine_preimage/3.
+
+2006-05-30 Tuesday 13:46 Matthew Mundell
+
+ * src/Grid_conversion.cc (1.13): Convert division operations to
+ exact_div_assign calls.
+
+2006-05-30 Tuesday 13:34 Matthew Mundell
+
+ * tests/Grid/: widening1.cc (1.12), widening2.cc (1.5): Correct
+ indentation of messages.
+
+2006-05-30 Tuesday 13:33 Matthew Mundell
+
+ * tests/Grid/: boundingbox1.cc (1.10), coveringbox1.cc (1.9): Add
+ tests with boxes of larger dimensions.
+
+2006-05-30 Tuesday 13:32 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.25): Update the reduce methods to create
+ fewer temporaries explicitly and to use references to row[column]
+ and pivot[column].
+
+2006-05-30 Tuesday 13:29 Matthew Mundell
+
+ * src/: Grid.templates.hh (1.10), Grid_Generator.defs.hh (1.21):
+ Update the box constructors to create both systems.
+
+2006-05-29 Monday 16:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_interface_generator_c_cc.m4,
+ ppl_interface_generator_c_cc_code.m4,
+ ppl_interface_generator_c_cc_preamble,
+ ppl_interface_generator_c_dat.m4 (interfaces.[1,1,1,1]): Drafted
+ a first attempt at generating one of the files (definitions) for
+ interfacing polyhedra using C.
+
+2006-05-29 Monday 09:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: ppl_interface_generator_common.m4,
+ ppl_interface_generator_copyright, Prolog/Makefile.am,
+ Prolog/exceptions.hh,
+ Prolog/ppl_interface_generator_prolog_dat.m4,
+ Prolog/ppl_interface_generator_prolog_icc.m4,
+ Prolog/ppl_interface_generator_prolog_icc_code.m4,
+ Prolog/ppl_interface_generator_prolog_icc_preamble,
+ Prolog/ppl_interface_generator_prolog_systems.m4,
+ Prolog/Ciao/Makefile.am,
+ Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+ Prolog/GNU/Makefile.am,
+ Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+ Prolog/SICStus/Makefile.am,
+ Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+ Prolog/SWI/Makefile.am,
+ Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+ Prolog/XSB/Makefile.am,
+ Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+ Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+ Prolog/YAP/Makefile.am,
+ Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+ Prolog/tests/Makefile.am, Prolog/tests/pl_grid_check.pl
+ (interfaces.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Added m4 files for the generation of the Prolog interfaces.
+ Modified makefiles so as to do their job in the new framework.
+ (Tested only the SWI and YAP interfaces up to now).
+
+2006-05-26 Friday 07:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.178): Always use CHECK as
+ early as possible.
+
+2006-05-25 Thursday 13:32 Matthew Mundell
+
+ * src/Grid_public.cc (1.27): Update affine_dimension() to use the
+ minimized form of either system, preferring the generators.
+
+2006-05-25 Thursday 11:44 Matthew Mundell
+
+ * tests/Grid/relations3.cc (1.3): Print the congruences instead of
+ the generators in test12.
+
+2006-05-25 Thursday 11:43 Matthew Mundell
+
+ * tests/Grid/grid2.cc (1.13): Correct DO_TEST invocations.
+
+2006-05-24 Wednesday 18:47 Matthew Mundell
+
+ * tests/Grid/: grid1.cc (1.15), grid3.cc (1.17): Update DO_TEST
+ calls to reflect moved tests.
+
+2006-05-24 Wednesday 18:45 Matthew Mundell
+
+ * tests/Grid/grid2.cc (1.12): Correct comment about cong_test4.
+
+2006-05-24 Wednesday 18:45 Matthew Mundell
+
+ * tests/Grid/addgenerators1.cc (1.11): Take out tracing calls to
+ ascii_dump.
+
+2006-05-24 Wednesday 18:24 Matthew Mundell
+
+ * src/: Congruence_System.defs.hh (1.12),
+ Congruence_System.inlines.hh (1.6), Grid.inlines.hh (1.7),
+ Grid_nonpublic.cc (1.14), Grid_public.cc (1.26): Add private
+ method Congruence_System::Congruence_System(d). Update
+ Grid::construct(const_gs) to only copy the given gs when needed.
+ Update both Grid construct methods and their callers so that the
+ initially constructed versions of con_sys and gen_sys are used
+ when the grid is empty.
+
+2006-05-24 Wednesday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.inlines.hh (altnum.1): file
+ Congruence_System.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:12 +0000
+
+2006-05-24 Wednesday 18:18 Matthew Mundell
+
+ * src/Congruence.inlines.hh (1.10): Update zero_dim_false so that
+ the inhomogeneous term of zdf is positive.
+
+2006-05-24 Wednesday 15:48 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (1.20): Update list of Grid friend
+ declaration dependencies.
+
+2006-05-24 Wednesday 15:47 Matthew Mundell
+
+ * tests/Grid/relations3.cc (1.2): Add tests to cover the rest of
+ relation_with(c).
+
+2006-05-24 Wednesday 15:46 Matthew Mundell
+
+ * src/Grid_public.cc (1.25): Complete relation_with(c).
+
+2006-05-24 Wednesday 14:10 Matthew Mundell
+
+ * src/: Scalar_Products.cc (1.5), Scalar_Products.defs.hh (1.7),
+ Scalar_Products.inlines.hh (1.4): Add to Scalar_Product assign(z,
+ c, gg), sign(c, gg), homogeneous_assign(z, gg, c) and
+ homogeneous_sign(gg, c).
+
+2006-05-24 Wednesday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.cc (altnum.1): file Scalar_Products.cc was
+ added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.defs.hh (altnum.1): file
+ Scalar_Products.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:15 +0000
+
+2006-05-24 Wednesday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.inlines.hh (altnum.1): file
+ Scalar_Products.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 13:22 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.46): Improved the
+ readability of
+ Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-05-24 Wednesday 12:06 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.45): Improved the
+ readability of Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-23 Tuesday 16:27 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.44): Improved the
+ readability of Octagonal_Shape<T>::affine_image().
+
+2006-05-23 Tuesday 14:07 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.7): Update remove_higher_space_dimensions
+ to also clear and resize the out-of-date system.
+
+2006-05-23 Tuesday 13:44 Matthew Mundell
+
+ * tests/Grid/removespacedims2.cc (1.10): Add test10 and test11
+ which test removal via congruences.
+
+2006-05-23 Tuesday 13:38 Matthew Mundell
+
+ * src/Grid.defs.hh (1.20), src/Grid_Generator_System.cc (1.12),
+ src/Grid_Generator_System.defs.hh (1.15), src/Grid_chdims.cc
+ (1.6), tests/Grid/removespacedims1.cc (1.11): Correct
+ print_generator and print_congruence messages. Add system
+ printing to some tests.
+
+2006-05-23 Tuesday 13:28 Matthew Mundell
+
+ * src/: Congruence_System.cc (1.16), Congruence_System.defs.hh
+ (1.11): Add remove_higher_space_dimensions(new_dimension).
+
+2006-05-23 Tuesday 11:57 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.43): Corrected a wrong
+ parameter in the exeption throw in
+ Octagonal_Shape<T>::remove_space_dimensions() and in the affine
+ images and preimages.
+
+2006-05-19 Friday 13:57 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.36), relations3.cc (1.1): Add
+ relations3, which tests Grid::relation_with(const Constraint&).
+
+2006-05-19 Friday 13:55 Matthew Mundell
+
+ * tests/Grid/: relations1.cc (1.12), relations2.cc (1.11): Correct
+ indentation. Improve a comment.
+
+2006-05-19 Friday 13:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations1.cc (altnum.1): file relations1.cc was added
+ on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-19 Friday 13:55 Matthew Mundell
+
+ * src/: Grid.defs.hh (1.19), Grid_public.cc (1.24): Add
+ relation_with(const Constraint& c).
+
+2006-05-18 Thursday 19:34 Matthew Mundell
+
+ * src/: C_Polyhedron.defs.hh (1.42), Grid.defs.hh (1.18),
+ NNC_Polyhedron.defs.hh (1.45), Polyhedron.defs.hh (1.297):
+ Replace phrases like "will be recycled" with phrases like "may be
+ recycled".
+
+2006-05-18 Thursday 16:53 Matthew Mundell
+
+ * tests/Grid/Makefile.am (1.35): Drop writecongruencesystem1.dat
+ from MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 15:30 Matthew Mundell
+
+ * tests/BD_Shape/: addconstraints1.cc (1.13), affineimage1.cc
+ (1.14), affinepreimage1.cc (1.14), bdsdifference1.cc (1.10),
+ bdshull1.cc (1.10), bhmz05widening1.cc (1.10),
+ cc76extrapolation1.cc (1.14), cc76narrowing1.cc (1.14),
+ contains1.cc (1.12), fromgensys1.cc (1.13),
+ generalizedaffineimage2.cc (1.15), generalizedaffinepreimage3.cc
+ (1.2), intersection1.cc (1.13), limitedbhmz05extrapolation1.cc
+ (1.9), limitedcc76extrapolation1.cc (1.10), relations2.cc (1.18),
+ relations3.cc (1.15), removespacedims1.cc (1.14), timeelapse1.cc
+ (1.13): Correct return values in exception tests. As a result
+ convert the value of d in affineimage1 test15 to 0 and do away
+ with addconstraints1 test04 and test05 and affineimage1 test16.
+
+2006-05-18 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/fromgensys1.cc (altnum.1): file fromgensys1.cc was
+ added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-18 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage3.cc (simplex.1): file
+ generalizedaffinepreimage3.cc was added on branch simplex on
+ 2006-09-06 18:41:54 +0000
+
+2006-05-18 Thursday 14:52 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.42): Improved the
+ readability of Octagonal_Shape(const Generator_System& gs)
+ using type aliases.
+
+2006-05-18 Thursday 12:24 Matthew Mundell
+
+ * tests/Grid/: addcongruence1.cc (1.10), addcongruences1.cc (1.13),
+ addconstraint1.cc (1.9), addconstraints1.cc (1.10),
+ addgenerator1.cc (1.11), addgenerators1.cc (1.10),
+ addspacedims1.cc (1.11), affineimage2.cc (1.7),
+ affinepreimage2.cc (1.4), boundingbox1.cc (1.9), boundingbox2.cc
+ (1.8), bounds1.cc (1.12), concatenate1.cc (1.11), congruence1.cc
+ (1.13), contains1.cc (1.9), coveringbox1.cc (1.8), disjoint1.cc
+ (1.8), expandspacedim1.cc (1.8), foldspacedims1.cc (1.8),
+ generalizedaffineimage1.cc (1.9), generalizedaffinepreimage1.cc
+ (1.10), generalizedaffinepreimage2.cc (1.10), generator1.cc
+ (1.16), grid1.cc (1.14), grid3.cc (1.16), griddifference1.cc
+ (1.9), intersection1.cc (1.8), join1.cc (1.12), join2.cc (1.7),
+ limitedextrapolation1.cc (1.9), limitedextrapolation2.cc (1.3),
+ limitedextrapolation3.cc (1.2), relations1.cc (1.11),
+ relations2.cc (1.10), removespacedims1.cc (1.10),
+ removespacedims2.cc (1.9), timeelapse1.cc (1.8), widening1.cc
+ (1.11), widening2.cc (1.4), widening3.cc (1.2): Correct return
+ values in exception tests.
+
+2006-05-18 Thursday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addconstraint1.cc (altnum.1): file addconstraint1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addconstraints1.cc (altnum.1): file addconstraints1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:19 Matthew Mundell
+
+ * tests/Grid/Makefile.am (1.34): Add many ascii_dump_load*.dat
+ files to MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 11:53 Matthew Mundell
+
+ * tests/Grid/: grid1.cc (1.13), grid2.cc (1.11), grid3.cc (1.15):
+ From grid3 move generator tests into grid1 and congruence tests
+ into grid2.
+
+2006-05-18 Thursday 11:16 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.15): Add test22 which tries to get
+ the divisor of a line.
+
+2006-05-18 Thursday 11:07 Matthew Mundell
+
+ * tests/Grid/asciidumpload1.cc (1.10): Add Grid_Status ascii_load
+ tests.
+
+2006-05-17 Wednesday 21:39 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.33), asciidumpload5.cc (1.1),
+ asciidumpload6.cc (1.1): Add asciidumpload5 and asciidumpload6
+ which test Congruence and Congruence_System.
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload5.cc (altnum.1): file asciidumpload5.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload5.cc (octagons.1): file asciidumpload5.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload5.cc (simplex.1): file asciidumpload5.cc
+ was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload6.cc (altnum.1): file asciidumpload6.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload6.cc (octagons.1): file asciidumpload6.cc
+ was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload6.cc (simplex.1): file asciidumpload6.cc
+ was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38 Matthew Mundell
+
+ * tests/Grid/: asciidumpload1.cc (1.9), asciidumpload3.cc (1.2),
+ asciidumpload4.cc (1.2): Add tests of ascii_load failure.
+
+2006-05-17 Wednesday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload3.cc (simplex.1): file asciidumpload3.cc
+ was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload4.cc (simplex.1): file asciidumpload4.cc
+ was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:36 Matthew Mundell
+
+ * src/Congruence_System.cc (1.15): Update ascii_load to return
+ false if a congruence load fails.
+
+2006-05-17 Wednesday 16:37 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.41): Improved the
+ readability of Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-17 Wednesday 15:09 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.40): Improved the
+ readability of Poly_Gen_Relation
+ Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 14:40 Matthew Mundell
+
+ * tests/Grid/asciidumpload2.cc (1.3): Add zero dimension tests
+ test15 and test16.
+
+2006-05-17 Wednesday 14:39 Matthew Mundell
+
+ * tests/Grid/addgenerators1.cc (1.9): Add test13 which adds to a
+ zero dim universe. Correct returns in exception tests.
+
+2006-05-17 Wednesday 14:37 Matthew Mundell
+
+ * src/: Grid.defs.hh (1.17), Grid_public.cc (1.23): Add an
+ assertion that the given system has points in the zero dim case
+ of add_recycled_generators. Convert the exception in the zero
+ dim case of add_recycled_generators_and_minimize to an assertion.
+
+2006-05-17 Wednesday 13:45 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.39): Changed the name
+ of an index in Octagonal_Shape<T>::add_constraint().
+ Improved the readability of Poly_Con_Relation
+ Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 13:12 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.32), generators2.cc (1.1),
+ outputoperator3.cc (1.1): Add outputoperator3 which tests
+ Grid_Generator_System IO operators. Add generators2 which tests
+ class Grid_Generator_System.
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generators2.cc (altnum.1): file generators2.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generators2.cc (octagons.1): file generators2.cc was
+ added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generators2.cc (simplex.1): file generators2.cc was
+ added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator3.cc (altnum.1): file outputoperator3.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator3.cc (octagons.1): file
+ outputoperator3.cc was added on branch octagons on 2006-11-18
+ 20:36:57 +0000
+
+2006-05-17 Wednesday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator3.cc (simplex.1): file
+ outputoperator3.cc was added on branch simplex on 2006-09-06
+ 18:41:55 +0000
+
+2006-05-17 Wednesday 13:09 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc (1.11),
+ Grid_Generator_System.defs.hh (1.14): Convert the exceptions in
+ remove_space_dimensions and remove_higher_space_dimensions into
+ assertions.
+
+2006-05-17 Wednesday 12:07 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.38): Improved the
+ readability of Octagonal_Shape<T>::add_constraint().
+
+2006-05-17 Wednesday 11:02 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (octagons.9): Moved
+ Octagonal_Shape<T>::is_empty() to the right place. Corrected
+ some wrong comments in the distances' code.
+
+2006-05-16 Tuesday 22:43 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.31), outputoperator2.cc (1.1): Add
+ outputoperator2, to test Grid_Generator IO operators.
+
+2006-05-16 Tuesday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator2.cc (altnum.1): file outputoperator2.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-16 Tuesday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator2.cc (octagons.1): file
+ outputoperator2.cc was added on branch octagons on 2006-11-18
+ 20:36:57 +0000
+
+2006-05-16 Tuesday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator2.cc (simplex.1): file
+ outputoperator2.cc was added on branch simplex on 2006-09-06
+ 18:41:55 +0000
+
+2006-05-16 Tuesday 22:38 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.14): Add test20 to test type() and
+ test21 to test scale_to_divisor().
+
+2006-05-16 Tuesday 22:37 Matthew Mundell
+
+ * src/Grid_Generator.cc (1.12): Update set_is_parameter to convert
+ the generator from a point only when it is a point.
+
+2006-05-16 Tuesday 22:35 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (1.19): Improve coefficient_swap
+ description slightly.
+
+2006-05-16 Tuesday 15:54 Matthew Mundell
+
+ * tests/Grid/addcongruences1.cc (1.12): Correct comment in test15.
+
+2006-05-16 Tuesday 15:48 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.30), asciidumpload3.cc (1.1),
+ asciidumpload4.cc (1.1): Add asciidumpload3 and asciidumpload4
+ for Congruence and Congruence_System.
+
+2006-05-16 Tuesday 15:46 Matthew Mundell
+
+ * tests/Grid/congruences1.cc (1.9): Turn off test09 and test18, as
+ Congruence_System::concatenate is now private.
+
+2006-05-16 Tuesday 15:44 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (1.12): Move test15 to addcongruence1
+ (test05). Add exception tests test15 and test16.
+
+2006-05-16 Tuesday 15:40 Matthew Mundell
+
+ * tests/Grid/addcongruences1.cc (1.11): Add test15 which minimizes
+ a grid with minimized congruences and up to date generators.
+ Correct return values in exception tests.
+
+2006-05-16 Tuesday 15:38 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (1.9): Add space dimension test
+ test05.
+
+2006-05-16 Tuesday 15:37 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (1.13): Add a comment in the max_min
+ method.
+
+2006-05-16 Tuesday 15:36 Matthew Mundell
+
+ * src/: Congruence_System.cc (1.14), Congruence_System.defs.hh
+ (1.10): Move concatenate(cgs) into the private section, adding
+ the requirement that cgs must contain rows.
+
+2006-05-16 Tuesday 12:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Og_Status.idefs.hh (octagons.4): Avoid useless white space.
+
+2006-05-16 Tuesday 12:20 quartieri
+
+ * src/Og_Status.idefs.hh (octagons.3): Indentation fixed.
+
+2006-05-16 Tuesday 12:19 quartieri
+
+ * src/Octagonal_Shape.inlines.hh (octagons.8): Moved some methods
+ in the right place.
+
+2006-05-16 Tuesday 12:16 quartieri
+
+ * src/Octagonal_Shape.defs.hh (octagons.14): Corrected a wrong
+ comment.
+
+2006-05-15 Monday 19:54 Matthew Mundell
+
+ * src/: Congruence.cc (1.9), Congruence.defs.hh (1.11),
+ Congruence.inlines.hh (1.9): Convert Congruence(le,m,capacity) to
+ Congruence(le,m), adding the requirement that m >= 0.
+
+2006-05-15 Monday 14:07 Matthew Mundell
+
+ * tests/Grid/grid3.cc (1.14): Add test22 and test23 which construct
+ grids from constant zero dimension contraint systems.
+
+2006-05-15 Monday 14:06 Matthew Mundell
+
+ * tests/Grid/asciidumpload2.cc (1.2): Add test14 where the grid has
+ a virtual generator.
+
+2006-05-15 Monday 14:05 Matthew Mundell
+
+ * tests/print.hh (1.35): Take out macro dump_grids.
+
+2006-05-15 Monday 14:05 Matthew Mundell
+
+ * src/Grid_public.cc (1.22): Update add_recycled_generators(gs) to
+ assume that zero-dimension generator systems that contain
+ generators always contain a point.
+
+2006-05-15 Monday 12:18 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.37): Renamed the
+ iterator on the constraints system to avoid a shadowing problem
+ in Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-12 Friday 19:55 Matthew Mundell
+
+ * tests/Grid/grid3.cc (1.13): Add test20 and test21, which test
+ adding zero dimension systems.
+
+2006-05-12 Friday 19:55 Matthew Mundell
+
+ * src/Grid_public.cc (1.21): Update Grid(cs) and Grid(ccs) to set
+ the space dimension. Rename ccs to cs in Grid(cs).
+
+2006-05-12 Friday 19:55 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (1.12): Update construct(ccgs) to use the
+ given system when the space dimension is zero.
+
+2006-05-12 Friday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Direct_Product.defs.hh (1.1), Direct_Product.inlines.hh
+ (1.1), Direct_Product.types.hh (1.1), Makefile.am (1.153):
+ Started an implementation of the direct product construction for
+ the "semantic" domains.
+
+2006-05-12 Friday 15:58 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (1.11): Convert the runtime exception in
+ normalize_divisors(gs,gs) to an assertion.
+
+2006-05-12 Friday 15:56 Matthew Mundell
+
+ * src/Grid.defs.hh (1.16): Correct parameter indentation.
+
+2006-05-12 Friday 15:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh (1.6): Avoid any kind of using declaration in
+ header files.
+
+2006-05-12 Friday 14:37 Matthew Mundell
+
+ * tests/Grid/addgenerators1.cc (1.8): Correct the print_generators
+ message in test11. Add test12 to test the point-finding loop in
+ Grid::normalize_divisors(gs,gs).
+
+2006-05-12 Friday 12:03 Matthew Mundell
+
+ * src/Grid.templates.hh (1.9): Improve comments in bounding box
+ methods.
+
+2006-05-11 Thursday 17:52 Matthew Mundell
+
+ * tests/Polyhedron/addgenerators1.cc (1.10): Correct indentation.
+
+2006-05-11 Thursday 17:52 Matthew Mundell
+
+ * tests/Grid/removespacedims2.cc (1.8): Turn off test05 and test06
+ (remove_higher_space_dimensions is now private).
+
+2006-05-11 Thursday 17:51 Matthew Mundell
+
+ * tests/Grid/addgenerators1.cc (1.7): Correct indenting. Turn off
+ test05 and test06. Add test11 to test zero_dim_univ().
+
+2006-05-11 Thursday 17:49 Matthew Mundell
+
+ * src/: Grid_Generator_System.defs.hh (1.13),
+ Grid_Generator_System.inlines.hh (1.10): Add destructor,
+ assignment operator and method zero_dim_univ. Order declarations
+ and inline definitions as in Generator. Move [] operators,
+ affine_image, add_universe_rows_and_columns,
+ remove_space_dimensions and remove_higher_space_dimensions to the
+ private section.
+
+2006-05-11 Thursday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.inlines.hh (altnum.1): file
+ Grid_Generator_System.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-05-11 Thursday 14:57 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.24): Rework the post-reduction part of
+ simplify(cgs) to better handle the case when the given system is
+ empty or all zeroes, and to save the check on reduced_num_rows in
+ the zero row clipping block.
+
+2006-05-11 Thursday 13:44 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.23): Add const to some variable types.
+
+2006-05-11 Thursday 12:32 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.13): Convert the type of the
+ dimension variable in test17 from int to dimension_type.
+
+2006-05-11 Thursday 12:26 Matthew Mundell
+
+ * src/: Congruence.cc (1.8), Congruence.defs.hh (1.10),
+ Constraint.cc (1.59), Constraint.defs.hh (1.120), Generator.cc
+ (1.70), Generator.defs.hh (1.118), Grid_Generator.cc (1.11),
+ Grid_Generator.defs.hh (1.18), Grid_widenings.cc (1.8),
+ Linear_Expression.cc (1.11): Convert the types of dimension
+ variable from int to dimension_type in class documentation
+ examples, "<<" operators and Grid::select_wider_generators.
+
+2006-05-10 Wednesday 19:31 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.22): Convert variable pivot_dim in
+ reduce_reduced to a reference.
+
+2006-05-10 Wednesday 19:14 Matthew Mundell
+
+ * src/Grid_public.cc (1.20): Move temporary sp out of the loop in
+ method relation_with. In generalized_affine_image/3 and
+ generalized_affine_preimage/3 move the modulus negation check
+ into the creation of the congruence to save the use of a
+ temporary.
+
+2006-05-10 Wednesday 18:27 Matthew Mundell
+
+ * src/Grid_conversion.cc (1.12): In both conversion methods move
+ temp integers out of loops and convert `source_dim' temp integers
+ to references.
+
+2006-05-10 Wednesday 18:04 Matthew Mundell
+
+ * src/Grid.templates.hh (1.8): In get_covering_box replace the use
+ of l_n and l_d with the use of `temp' and convert temp integer
+ `divisor' into a reference.
+
+2006-05-10 Wednesday 17:19 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.12): Correct indentation in test17.
+
+2006-05-10 Wednesday 17:19 Matthew Mundell
+
+ * src/: Congruence_System.cc (1.13), Congruence_System.defs.hh
+ (1.9), Congruence_System.inlines.hh (1.5),
+ Grid_Generator_System.cc (1.10), Grid_Generator_System.defs.hh
+ (1.12), Grid_Generator_System.inlines.hh (1.9),
+ Grid_conversion.cc (1.11), Grid_simplify.cc (1.21): Update grid
+ row and column counter variable names to *num_rows and
+ *num_columns.
+
+2006-05-10 Wednesday 16:21 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.36): Improved the
+ readability of the method
+ Octagonal_Shape<T>::map_space_dimensions().
+
+2006-05-10 Wednesday 15:41 Matthew Mundell
+
+ * src/Congruence_System.cc (1.12): Add const to a few variable
+ declarations. In normalize_moduli convert the `modulus'
+ variables to references and move temp integer `factor' out of the
+ for loop.
+
+2006-05-10 Wednesday 15:21 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.35): Indented
+ correctly a comment.
+
+2006-05-10 Wednesday 14:33 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.14): Renamed iterators in
+ BD_Shape::get_limiting_shape() so as to avoid misleading name
+ clash with space dimension indices Corrected a couple of typos in
+ the (optional) output produced by OK() when invarinats are
+ violated.
+
+2006-05-10 Wednesday 14:22 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.34): Corrected some
+ comments in Octagonal_Shape<T>::generalized_affine_image().
+ Added the definition for Octagonal_Shape<T>
+ ::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol
+ relsym, const
+ Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:19 quartieri
+
+ * src/Octagonal_Shape.defs.hh (octagons.13): Added the declaration
+ for void generalized_affine_preimage(const
+ Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:18 Matthew Mundell
+
+ * src/Grid_widenings.cc (1.7): Correct parameter indentation. Add
+ const to some variable declarations.
+
+2006-05-10 Wednesday 13:57 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.20): Move temp integers out of the loop
+ in reduce_reduced.
+
+2006-05-10 Wednesday 13:29 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.19): Replace semicolons in tracing
+ statements.
+
+2006-05-10 Wednesday 13:08 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.13): Avoid almost useless uses of
+ reference DB_Row (prefer the direct dbm accessors' operators if a
+ single access to the row has to be done).
+
+2006-05-10 Wednesday 13:00 Matthew Mundell
+
+ * src/Grid_public.cc (1.19): Update relation_with(cg) to use a
+ reference instead of a temporary integer for variable `modulus'.
+
+2006-05-10 Wednesday 12:22 Matthew Mundell
+
+ * src/Congruence.defs.hh (1.9): Convert use of namespace alias PPL
+ to use of full name.
+
+2006-05-10 Wednesday 11:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh (1.13): Avoid compiler warnings.
+
+2006-05-10 Wednesday 11:29 Elena Mazzi
+
+ * tests/BD_Shape/: Makefile.am (1.45),
+ generalizedaffinepreimage2.cc (1.13),
+ generalizedaffinepreimage3.cc (1.1): Added some tests for
+ generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (altnum.1): file
+ generalizedaffinepreimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:22 +0000
+
+2006-05-10 Wednesday 11:27 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.71), BD_Shape.templates.hh (1.12):
+ Defined a new method: BD_Shape::generalized_affine_preimage(const
+ Linear_Expression& lhs,
+ Relation_Symbol relsym, const
+ Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.cc (1.7), Float.inlines.hh (1.28),
+ Grid_simplify.cc (1.18), checked.cc (1.18),
+ checked_int.inlines.hh (1.52): Prefer predecrement and
+ preincrement to postdecrement and postincrement.
+
+2006-05-10 Wednesday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (altnum.1): file checked.cc was added on branch
+ altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-10 Wednesday 11:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_ext.inlines.hh (1.31): Spurious goto removed.
+
+2006-05-10 Wednesday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_conversion.cc (1.10): Compiler warning avoided.
+
+2006-05-10 Wednesday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bounding_Box.defs.hh (1.14), LP_Problem.defs.hh (1.9),
+ LP_Problem.inlines.hh (1.9): Header file inclusions adjusted.
+
+2006-05-09 Tuesday 21:17 Matthew Mundell
+
+ * src/: Grid.defs.hh (1.15), Grid.inlines.hh (1.5),
+ Grid_nonpublic.cc (1.10): Improve the descriptions of the
+ normalize_divisors functions. Add normalize_divisors(sys).
+ Replace the second parameter of normalize_divisors(sys,divisor,f)
+ with a writable reference and move the temporary in this method
+ into the callers of the method.
+
+2006-05-09 Tuesday 17:04 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.5): Rename variable `tem' in
+ add_space_dimensions(cgs,gs,d) to `old_modulus_index'.
+
+2006-05-09 Tuesday 16:47 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (1.9): Rename all row and column
+ count variables to `num_rows' and `num_cols'.
+
+2006-05-09 Tuesday 16:44 Matthew Mundell
+
+ * src/Grid.templates.hh (1.7): In shrink_bounding_box replace the
+ temporary `divisor' with a coefficient reference and the two
+ temporaries `gcd' and `reduced_divisor' with a single temporary.
+
+2006-05-09 Tuesday 14:31 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.17): In reduce_pc_with_pc rename
+ pivot_col to old_pivot_col and convert multiple array accesses to
+ use references.
+
+2006-05-09 Tuesday 13:16 Matthew Mundell
+
+ * src/: Grid_conversion.cc (1.9), Grid_simplify.cc (1.16): Replace
+ "red_" variable name prefixes with "reduced_".
+
+2006-05-09 Tuesday 12:25 Matthew Mundell
+
+ * tests/Grid/generator1.cc (1.11): Add tests of copy constructor
+ and zero_dim_point().
+
+2006-05-09 Tuesday 12:24 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh (1.17), Grid_Generator.inlines.hh
+ (1.11): Add copy constructor, destructor, max_space_dimension()
+ and zero_dim_point(). Order declarations as in Generator.
+
+2006-05-09 Tuesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.inlines.hh (altnum.1): file
+ Grid_Generator.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-05-09 Tuesday 10:32 Matthew Mundell
+
+ * src/: Grid_conversion.cc (1.8), Grid_simplify.cc (1.15): Replace
+ statements using addition/subtraction and multiplication
+ operators with calls to sub_mul_assign and add_mul_assign.
+
+2006-05-09 Tuesday 10:25 Matthew Mundell
+
+ * src/: Grid_Generator.cc (1.10), Grid_Generator.inlines.hh (1.10),
+ Grid_Generator_System.cc (1.8): Tailor the Grid_Generator
+ ascii_dump and ascii_load methods for grids. Use these methods
+ in Grid_Generator_System ascii_dump and ascii_load.
+
+2006-05-09 Tuesday 01:22 Andrea Cimino
+
+ * tests/Polyhedron/Makefile.am (simplex.6): Re-enabled lpproblem2.
+
+2006-05-09 Tuesday 01:13 Andrea Cimino
+
+ * tests/Polyhedron/: LP_Problem1.cc, LP_Problem2.cc, lpproblem2.cc
+ (simplex.[6,3,4]): Fixed the tests: removed the old stuff and
+ added lpproblem2, (probably) lost during the last merge.
+
+2006-05-08 Monday 19:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+ STANDARDS, TODO, config.guess, config.sub, configure.ac,
+ instchk.hh, ppl.lsm.in, ppl.spec.in, Watchdog/CREDITS,
+ Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+ Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/src/.cvsignore, Watchdog/src/Makefile.am,
+ Watchdog/src/Watchdog.cc, Watchdog/utils/.cvsignore,
+ Watchdog/utils/Makefile.am, debian/.cvsignore,
+ debian/Makefile.am, debian/README, debian/changelog,
+ debian/control, debian/libppl-dev.install,
+ debian/libppl-gprolog.links, debian/libppl-pwl.copyright.in,
+ debian/libppl-pwl.install, debian/libppl-sicstus.links,
+ debian/libppl-swi.links, debian/libppl-yap.links,
+ debian/libppl.copyright.in, debian/libppl.dirs,
+ debian/libppl.install, debian/rules, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+ demos/ppl_lpsol/examples/Makefile.am, doc/.cvsignore,
+ doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ doc/devref.tex, doc/ppl-config.1, doc/ppl.sty, doc/ppl_lcdd.1,
+ doc/ppl_lpsol.1, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, doc/user.tex, interfaces/Makefile.am,
+ interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/OCaml/Makefile.am,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/.cvsignore,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int64_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+ m4/ac_check_fpu_control.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_cxx_double_binary_format.m4,
+ m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_binary_format.m4,
+ m4/ac_cxx_float_is_iec_559.m4, m4/ac_cxx_long_double.m4,
+ m4/ac_cxx_long_double_binary_format.m4,
+ m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+ m4/ac_text_md5sum.m4, m4/ppl.m4, src/.cvsignore,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/BHRZ03_Certificate.defs.hh,
+ src/Bounding_Box.defs.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Congruence.types.hh,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Float.cc, src/Float.defs.hh,
+ src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Grid.defs.hh,
+ src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+ src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+ src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+ src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+ src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+ src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Grid_widenings.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Init.cc, src/Init.defs.hh,
+ src/Interval.defs.hh, src/LP_Problem.cc, src/LP_Problem.types.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+ src/Matrix.cc, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.templates.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/Powerset.templates.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Result.defs.hh,
+ src/Rounding_Dir.defs.hh, src/Row.cc, src/Row.defs.hh,
+ src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+ src/Saturation_Matrix.inlines.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Topology.hh,
+ src/Variable.defs.hh, src/Widening_Function.defs.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+ src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh,
+ src/float.types.hh, src/fpu-c99.inlines.hh,
+ src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+ src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+ src/globals.defs.hh, src/globals.types.hh,
+ src/mp_numeric_limits.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/version.hh.in, tests/Makefile.am,
+ tests/PFunction.cc, tests/PFunction.hh,
+ tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+ tests/Partial_Function.inlines.hh,
+ tests/Partial_Function.types.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh, tests/ehandlers.cc,
+ tests/ehandlers.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+ tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/bdsdifference1.cc,
+ tests/BD_Shape/bdsdifference2.cc,
+ tests/BD_Shape/bdsdifference3.cc,
+ tests/BD_Shape/bdsdifference4.cc,
+ tests/BD_Shape/bdsdifference5.cc,
+ tests/BD_Shape/bdsdifference6.cc,
+ tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+ tests/BD_Shape/bdshull4.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhmz05widening2.cc,
+ tests/BD_Shape/bhmz05widening3.cc,
+ tests/BD_Shape/bhmz05widening4.cc,
+ tests/BD_Shape/bhmz05widening5.cc,
+ tests/BD_Shape/bhmz05widening6.cc,
+ tests/BD_Shape/bhmz05widening7.cc,
+ tests/BD_Shape/bhmz05widening8.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+ tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+ tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+ tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+ tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+ tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+ tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+ tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+ tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation2.cc,
+ tests/BD_Shape/limitedcc76extrapolation3.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+ tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+ tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+ tests/Grid/.cvsignore, tests/Grid/Makefile.am,
+ tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+ tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+ tests/Grid/boundingbox1.cc, tests/Grid/boundingbox2.cc,
+ tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+ tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+ tests/Grid/contains1.cc, tests/Grid/copyconstruct1.cc,
+ tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+ tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc,
+ tests/Grid/limitedextrapolation1.cc,
+ tests/Grid/limitedextrapolation2.cc,
+ tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/outputoperator1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+ tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+ tests/Polyhedron/CbecomesNNC1.cc,
+ tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc,
+ tests/Polyhedron/addcongruence1.cc,
+ tests/Polyhedron/addcongruences1.cc,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage11.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffineimage2.cc,
+ tests/Polyhedron/boundedaffineimage3.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage2.cc,
+ tests/Polyhedron/boundedaffinepreimage3.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/cnncconversion1.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/concatenate7.cc,
+ tests/Polyhedron/congruences1.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc,
+ tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage13.cc,
+ tests/Polyhedron/generalizedaffineimage14.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage3.cc,
+ tests/Polyhedron/generalizedaffinepreimage4.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/gramschmidt1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc,
+ tests/Polyhedron/nncminimize1.cc,
+ tests/Polyhedron/nncminimize2.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+ tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+ tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+ tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+ tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+ tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+ tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+ tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+ tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+ tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+ tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+ tests/Polyhedron/universe7.cc,
+ tests/Polyhedron/valgrind_suppressions,
+ tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc, utils/.cvsignore,
+ utils/Makefile.am
+ (simplex.[1,2,2,2,2,2,2,5,2,2,2,2,1,1,1,2,2,1,2,2,2,1,2,2,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,5,5,2,2,4,4,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,3,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,4,2,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2, [...]
+ Second merge from main trunk.
+
+2006-05-08 Monday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, interfaces/Prolog/ppl_prolog.icc,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.templates.hh, src/Congruence.cc,
+ src/Congruence.defs.hh, src/Congruence.inlines.hh,
+ src/Congruence_System.cc, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+ src/DB_Row.templates.hh, src/Grid.templates.hh,
+ src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+ src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Linear_Expression.defs.hh, src/Makefile.am,
+ tests/ppl_test.cc, tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/frompolyhedron1.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/Grid/affineimage2.cc,
+ tests/Grid/asciidumpload1.cc, tests/Grid/join1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/outputoperator1.cc,
+ tests/Grid/writecongruencesystem.cc, tests/Polyhedron/Makefile.am
+ (octagons.[1,3,3,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,6,1,4,1,2,1,2,2,1,2,2,2,2,2,2,1,1,2,2,1,2,2,2,1,1,2,2,1,1,1,1,1,1,1]):
+ First merge from main trunk.
+
+2006-05-08 Monday 16:09 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.33): Corrected a
+ comment in Octagonal_Shape<T>::affine_preimage() and
+ changed `Coefficient b = expr.inhomogeneous_term();' in
+ `const Coefficient& b = expr.inhomogeneous_term();'.
+
+2006-05-08 Monday 15:56 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.14): Reduce the number of implicit
+ temporaries in the loop in reduce_pc_with_pc. Move the explicit
+ creation of temporary integers outside the same loop.
+
+2006-05-08 Monday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_simplify.cc (simplex.1): file Grid_simplify.cc was added
+ on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:32 Matthew Mundell
+
+ * src/Grid_Status.cc (1.4): Drop the printing of the final trailing
+ space from method ascii_dump.
+
+2006-05-08 Monday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.cc (simplex.1): file Grid_Status.cc was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:30 Matthew Mundell
+
+ * src/Grid_public.cc (1.18): Update time_elapse_assign to use
+ Grid_Generator::set_is_parameter() instead of multiple calls to
+ Grid_Generator::set_divisor.
+
+2006-05-08 Monday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (simplex.1): file Grid_public.cc was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28 Matthew Mundell
+
+ * src/: Grid_Generator.cc (1.9), Grid_Generator.defs.hh (1.16): Add
+ set_is_parameter().
+
+2006-05-08 Monday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.cc (simplex.1): file Grid_Generator.cc was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.defs.hh (simplex.1): file
+ Grid_Generator.defs.hh was added on branch simplex on 2006-05-08
+ 17:15:49 +0000
+
+2006-05-08 Monday 15:27 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc (1.7),
+ Grid_Generator_System.inlines.hh (1.8): Tailor the ascii_dump and
+ ascii_load methods for grids.
+
+2006-05-08 Monday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.cc (simplex.1): file
+ Grid_Generator_System.cc was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.inlines.hh (simplex.1): file
+ Grid_Generator_System.inlines.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 14:05 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.32): Avoid repeated
+ computations in
+ Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-08 Monday 13:28 Matthew Mundell
+
+ * src/: Congruence.cc (1.6), Congruence.defs.hh (1.8),
+ Congruence.inlines.hh (1.8), Linear_Expression.defs.hh (1.25):
+ Add create(le,le), create(le,n) and create(n,le) to Congruence.
+ Update the Congruence-returning %= operators to use the new
+ create methods instead of requiring the friend relations between
+ these operators and the Congruence and Linear_Expression classes.
+
+2006-05-08 Monday 13:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.cc (simplex.1): file Congruence.cc was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.defs.hh (simplex.1): file Congruence.defs.hh was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.inlines.hh (simplex.1): file Congruence.inlines.hh
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46 Matthew Mundell
+
+ * src/: Congruence.cc (1.5), Congruence_System.cc (1.11),
+ Grid.templates.hh (1.6), Grid_conversion.cc (1.7),
+ Grid_nonpublic.cc (1.9), Grid_public.cc (1.17), Grid_simplify.cc
+ (1.13): Update many loops to loop down towards a constant instead
+ of up towards a value in a variable.
+
+2006-05-05 Friday 19:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.cc (simplex.1): file Congruence_System.cc
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh (simplex.1): file Grid.templates.hh was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_conversion.cc (simplex.1): file Grid_conversion.cc was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (simplex.1): file Grid_nonpublic.cc was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 16:51 quartieri
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+ Octagonal_Shape.templates.hh (octagons.[12,7,31]): Renamed the
+ parameter `v' to `v_id' in
+ Octagonal_Shape<T>::forget_binary_octagonal_constraints().
+ `v_id' is the index of variable whose constraints are forgotten,
+ `v' was the index of rows/columns on `v_id' in the octagon,
+ instead.
+
+2006-05-05 Friday 16:26 quartieri
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+ Octagonal_Shape.templates.hh (octagons.[11,6,30]): Renamed the
+ parameter `v' to `v_id' in
+ Octagonal_Shape<T>::forget_all_octagonal_constraints(). `v_id'
+ is the index of variable whose constraints are forgotten, `v' was
+ the index of rows/columns on `v_id' in the octagon, instead.
+
+2006-05-05 Friday 16:21 Elena Mazzi
+
+ * src/: BD_Shape.defs.hh (1.70), BD_Shape.templates.hh (1.11):
+ Renamed some parameters in helper functions for the computation
+ of affine relations: `pos_sum' and `neg_sum' renamed as `ub_v'
+ and minus_lb_v'.
+
+ Added some assertions in these helper funcions: - `sc_den' should
+ be positive; - `ub_v' and `minus_lb_v' shouldn't be equal to
+ plus infinity.
+
+2006-05-05 Friday 16:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (simplex.1): file BD_Shape.templates.hh
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 15:42 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.29): Added some
+ comments in Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 15:39 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.28): Added some
+ comments in Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+
+2006-05-05 Friday 15:28 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.27): Added the
+ assertion assert(!is_plus_infinity(minus_lb_v)); in
+ Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to ensure that
+ `minus_lb_v' is a meaningful parameter.
+
+2006-05-05 Friday 15:23 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.26): Added the
+ assertion assert(!is_plus_infinity(ub_v)); in
+ Octagonal_Shape<T>::deduce_v_pm_u_bounds() to ensure that `ub_v'
+ is a meaningful parameter.
+
+2006-05-05 Friday 15:09 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.25): Added the
+ assertion assert(sc_den > 0); in
+ Octagonal_Shape<T>::deduce_v_pm_u_bounds() and in
+ Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds(). `sc_den' is
+ always positive.
+
+2006-05-05 Friday 14:27 quartieri
+
+ * src/Octagonal_Shape.defs.hh (octagons.10): Corrected the
+ documentation for void deduce_v_pm_u_bounds() and void
+ deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 14:01 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.24): Corrected some
+ comments in Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+ Corrected some comments and renamed `minus_q' in `q' in
+ Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to improve
+ readability.
+
+2006-05-05 Friday 13:48 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.23): Corrected some
+ comments and renamed `q' in `minus_q' in
+ Octagonal_Shape<T>::deduce_v_pm_u_bounds() to improve
+ readability.
+
+2006-05-05 Friday 13:14 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.22): Corrected two
+ bugs in Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-04 Thursday 21:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.124), BD_Shape.defs.hh (1.69): Added
+ a couple of missing \relates Doxygen commands.
+
+2006-05-04 Thursday 21:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in, devref.doxyconf-latex.in
+ (octagons.[2,2]): Also consider files distances.* when producing
+ the devref manual.
+
+2006-05-04 Thursday 21:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[12,17]):
+ Added a few missing \relates Doxygen commands. Corrected the
+ name of a macro (error probably caused by uncareful query
+ replace). Reordered definitions of inline functions so as to
+ alow inlining.
+
+2006-05-04 Thursday 21:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+ (octagons.[9,5]): Added a few missing \relates Doxygen commands.
+
+2006-05-04 Thursday 16:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+ (octagons.[8,21]): Helper functions for the computation of affine
+ relations rewritten and reorganized: - deduce_v_pm_u_bounds()
+ now replaces the two functions deduce_v_minus_u_bounds() and
+ deduce_v_plus_u_bounds(), since these were always called one
+ after the other and they were going through the same loop; -
+ similarly done for deduce_minus_v_pm_u_bounds(); - pos_sum and
+ neg_sum parameters renamed as ub_v and minus_lb_v; - code
+ improved a lot for readability (and maybe also efficiency); -
+ avoided use of ROND_UP when dealing with mpq_class objects
+ (prefer using ROUND_NOT_NEEDED); - removed inline directive
+ from is_bounded().
+
+2006-05-04 Thursday 16:31 Matthew Mundell
+
+ * tests/Grid/maxmin1.cc (1.9): In check_both, check_minimize and
+ check_maximize add parameter const qualifiers and convert all
+ parameters to references.
+
+2006-05-04 Thursday 16:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/maxmin1.cc (simplex.1): file maxmin1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 16:20 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (octagons.20): Reversed some
+ loops.
+
+2006-05-04 Thursday 16:12 Matthew Mundell
+
+ * src/Grid_Generator.cc (1.8): Update the output operator to denote
+ parameters with a `q'.
+
+2006-05-04 Thursday 15:56 Matthew Mundell
+
+ * src/Grid_simplify.cc (1.12): Improve variable names in
+ reduce_parameter_with_line and reduce_congruence_with_equality.
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload1.cc (simplex.1): file asciidumpload1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/outputoperator1.cc (simplex.1): file
+ outputoperator1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/writecongruencesystem.cc (altnum.1): file
+ writecongruencesystem.cc was added on branch altnum on 2006-10-29
+ 19:27:28 +0000
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/writecongruencesystem.cc (simplex.1): file
+ writecongruencesystem.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.cc (1.5), ppl_test.hh (1.47),
+ BD_Shape/addconstraints1.cc (1.12), BD_Shape/affineimage1.cc
+ (1.13), BD_Shape/affinepreimage1.cc (1.13),
+ BD_Shape/bdsdifference1.cc (1.9), BD_Shape/bdshull1.cc (1.9),
+ BD_Shape/bhmz05widening1.cc (1.9), BD_Shape/cc76extrapolation1.cc
+ (1.13), BD_Shape/cc76narrowing1.cc (1.13), BD_Shape/contains1.cc
+ (1.11), BD_Shape/fromgensys1.cc (1.12),
+ BD_Shape/generalizedaffineimage2.cc (1.14),
+ BD_Shape/intersection1.cc (1.12),
+ BD_Shape/limitedbhmz05extrapolation1.cc (1.8),
+ BD_Shape/limitedcc76extrapolation1.cc (1.9),
+ BD_Shape/relations2.cc (1.17), BD_Shape/relations3.cc (1.14),
+ BD_Shape/removespacedims1.cc (1.13), BD_Shape/timeelapse1.cc
+ (1.12), Grid/asciidumpload1.cc (1.8), Grid/maxmin1.cc (1.8),
+ Grid/outputoperator1.cc (1.6), Grid/writecongruencesystem.cc
+ (1.6): Repeated using directives removed; others avoided. Added
+ missing inclusions and missing std:: qualifications.
+
+2006-05-04 Thursday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (simplex.1): file ppl_test.cc was added on
+ branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-04 Thursday 14:49 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.19): Improved
+ generalized_affine_preimage().
+
+2006-05-04 Thursday 14:17 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (octagons.18): Several (mainly
+ readability) improvements to the implementation of method
+ generalized_affine_image().
+
+2006-05-04 Thursday 13:47 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.17): Another pass
+ through the code of generalized_affine_preimage(), to improve
+ readability and thus maintainability. - in the general case,
+ the references inside the matrix are named m_*, e.g.,
+ m_i, m_ci, m_v, etc. Avoid almost useless uses of row_iterator
+ (prefer the direct matrix accessors' operators if a single access
+ to the row has to be done).
+
+2006-05-04 Thursday 13:09 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.16): Another pass
+ through the code of generalized_affine_preimage(), to improve
+ readability and thus maintainability. - moved the definition
+ of minus_den to avoid repeated computations; - in the case
+ t==0, removed an unneccesary row_iterator and defined
+ two_b; - in the case t==1, coeff renamed as w_coeff and
+ lv_index renamed as n_w.
+
+2006-05-04 Thursday 13:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/Makefile.am (1.44), Polyhedron/Makefile.am
+ (1.89): Unwanted indentation removed.
+
+2006-05-04 Thursday 12:16 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (octagons.15): Improved
+ readability and thus maintainability in the methods of affine
+ trasformations: - in the case t==1, the coefficient a renamed as
+ w_coeff.
+
+ Corrected a bug in the method affine_image().
+
+2006-05-04 Thursday 10:46 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (octagons.14): Improved
+ readability and thus maintainability in the methods of affine
+ trasformations: - last_var_id renamed as w_id; - num_var renamed
+ as var_id.
+
+2006-05-04 Thursday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.13): Another pass
+ through the code of affine_image(), to improve readability and
+ thus maintainability. - last_var_id renamed as w_id; - in the
+ case t==1, coeff renamed as w_coeff; - variable indices should
+ be called *_id; the indices used to access the matrix should
+ be named n_*, e.g., var and n_w; - the references inside the
+ matrix are named m_*, e.g., m_i, m_ci, m_v, etc. Avoid repeated
+ testing of known conditionals; avoid almost useless uses of
+ row_iterator (prefer the direct matrix accessors' operators if a
+ single access to the row has to be done).
+
+2006-05-04 Thursday 10:05 Elena Mazzi
+
+ * src/Octagonal_Shape.templates.hh (octagons.12): Some (mainly
+ readability) improvements to the implementation of method
+ affine_preimage(). Indented region in some methods.
+
+2006-05-03 Wednesday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.11): Several (mainly
+ readability) improvements to the implementation of method
+ affine_image() for the case when t == 1.
+
+2006-05-03 Wednesday 14:43 Elena Mazzi
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+ (octagons.[7,10]): Added a new method
+ Octagonal_Shape::is_bounded().
+
+2006-05-03 Wednesday 14:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.9): A few improvements
+ in method constraints() and operator <<.
+
+2006-05-03 Wednesday 09:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.8): Added (macro for)
+ definitions of output functions.
+
+2006-05-02 Tuesday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounded1.cc (altnum.1): file bounded1.cc was added
+ on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-02 Tuesday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounded1.cc (octagons.1): file bounded1.cc was
+ added on branch octagons on 2006-05-08 16:16:44 +0000
+
+2006-05-02 Tuesday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bounded1.cc (simplex.1): file bounded1.cc was
+ added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-02 Tuesday 17:48 Elena Mazzi
+
+ * src/BD_Shape.defs.hh (1.68), src/BD_Shape.templates.hh (1.10),
+ tests/BD_Shape/Makefile.am (1.43), tests/BD_Shape/bounded1.cc
+ (1.1): Defined a new method BD_Shape::is_bounded(). Added some
+ tests for this method.
+
+2006-05-02 Tuesday 16:39 Elena Mazzi
+
+ * tests/BD_Shape/affinedimension1.cc (1.8): Rewrited and added some
+ tests for affine_dimension().
+
+2006-05-02 Tuesday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/frompolyhedron1.cc (1.2): test01() in
+ frompolyhedron1.cc overflows when using 8-bit and 16-bit
+ integers.
+
+2006-05-02 Tuesday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frompolyhedron1.cc (octagons.1): file
+ frompolyhedron1.cc was added on branch octagons on 2006-05-08
+ 16:16:44 +0000
+
+2006-05-02 Tuesday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/frompolyhedron1.cc (simplex.1): file
+ frompolyhedron1.cc was added on branch simplex on 2006-05-08
+ 17:15:53 +0000
+
+2006-05-02 Tuesday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (octagons.3): Added support for checking the
+ results of approximated Octagonal_Shape computations.
+
+2006-05-02 Tuesday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[11,16]):
+ All instances of OR_Matrix are now friends of each other. Added
+ constructor building an overapproximation of an OR_Matrix of a
+ different coefficient type.
+
+2006-05-02 Tuesday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+ (octagons.[6,4]): Added declarations and definitions of fucntions
+ computing distances. Added constructor converting from another
+ Octagonal_Shape. All instances of Octagonal_Shape are now
+ friends of each other.
+
+2006-05-02 Tuesday 15:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[10,15]):
+ Added declarations and definitions of helper functions for
+ computing distances.
+
+2006-05-02 Tuesday 14:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.inlines.hh, Makefile.am, distances.defs.hh,
+ distances.inlines.hh, distances.types.hh (octagons.[1,5,1,1,1]):
+ Common code for computing distances put in files distances.*
+
+2006-05-02 Tuesday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.7): Restored previous
+ version of is_strongly_reduced(): the modified version was not
+ working as it was assumming that a strongly reduced matrix is
+ just strongly closed plus Booleans indicating redundancies (as
+ for BD shapes). Removed a few redundant template qualifications.
+
+2006-05-02 Tuesday 12:31 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.9): Don't confuse the class
+ used to solve the lp problems and the name of the program.
+
+2006-05-02 Tuesday 10:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+ Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+ (octagons.[9,14,5,3]): OR_Matrix should know nothing about
+ coherence. Methods at() moved in Octagonal_Shape and named
+ matrix_at().
+
+2006-05-02 Tuesday 10:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.6): Corrected a bug in
+ is_strongly_reduced().
+
+2006-05-02 Tuesday 09:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.5): A few improvements
+ to comments. Added some missing const qualifiers; removed
+ redundant parentheses. Some improvements to the incremental
+ strong closure procedure (mainly in readability). Corrected
+ strong_coherence_assign().
+
+2006-04-30 Sunday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (octagons.4): Removed declarations
+ for no longer used alternative implementations of (incremental)
+ strong closure.
+
+2006-04-30 Sunday 18:46 quartieri
+
+ * src/Octagonal_Shape.templates.hh (octagons.4): Corrected a bug in
+ Octagonal_Shape<T>::affine_preimage(). Erased some
+ duplicated code lines and corrected the insertion of constraints
+ in Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-04-30 Sunday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.inlines.hh (octagons.2): Avoid useless
+ inclusions of iostream, sstream and stdexcept. Avoid a few
+ useless braces. Deleted useless function
+ strong_coherence_local_step(). Deleted functions
+ get_matrix_element() (use OR_Matrix<T>::at() instead). Some
+ improvements (in particular, in assertion checking) in methods
+ add_octagonal_constraint() and forget_octagonal_constraints(). A
+ few documentation improvements.
+
+2006-04-30 Sunday 15:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[8,13]):
+ Added methods at(dimension_type, dimension_type) that provide
+ controlled access to the matrix as if it was a square matrix.
+ Corrected method clear().
+
+2006-04-30 Sunday 15:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.3): Corrected a bug in
+ affine_dimension() regarding the identification of the singular
+ zero-equivalence class.
+
+2006-04-30 Sunday 10:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (octagons.1): Drafted a common section for
+ describing both BDSs and OSs.
+
+2006-04-30 Sunday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (octagons.3): Corrected a LaTeX error
+ in the documentation.
+
+2006-04-30 Sunday 09:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (octagons.2): Added missing include
+ directive for friend declaration.
+
+2006-04-30 Sunday 09:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.42), frompolyhedron1.cc (1.1):
+ Added a test on the conversion from C_Polyhedron to BD_Shape
+ exploiting the simplex algorithm.
+
+2006-04-29 Saturday 22:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.9): Corrected the constructor taking
+ a polyhedron an SIMPLEX_COMPLEXITY.
+
+2006-04-29 Saturday 22:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.templates.hh (octagons.2): Implemented the
+ constructor building an OS from a Polyhedron. Removed redundant
+ template parameter in the argument of concatenate_assign().
+ Small correction in the output of method OK().
+
+2006-04-29 Saturday 22:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagonal_Shape.defs.hh (octagons.2): Corrected some comments
+ (in particular, references to Doxygen documentation).
+
+2006-04-29 Saturday 22:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (octagons.1): Octagonal_Shape is a friend
+ of Polyhedron (needed for conversion).
+
+2006-04-29 Saturday 22:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (octagons.12): Removed redundant
+ template parameter in the argument of operator-: it was confusing
+ Doxygen.
+
+2006-04-29 Saturday 22:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/OR_Matrix.defs.hh (octagons.7): Removed trailing whitespace.
+
+2006-04-29 Saturday 12:15 Andrea Cimino
+
+ * tests/Polyhedron/lpproblem1.cc (simplex.3): Fixed the test to
+ match the new expected result.
+
+2006-04-29 Saturday 11:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.8): Corrected the two bugs in
+ generalized_affine_preimage() shown by test04() and test05() in
+ generalizedaffinepreimage2.cc.
+
+2006-04-29 Saturday 11:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (1.12): test05()
+ shows a bug in BD_Shape::generalized_affine_preimage() that shows
+ up when using GREATER_THAN_OR_EQUAL.
+
+2006-04-29 Saturday 11:04 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.42): Turned on the steepest edge
+ floating point version.
+
+2006-04-29 Saturday 10:54 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.41): Removed redundant line.
+
+2006-04-29 Saturday 10:48 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.40): Turn off the steepest-edge
+ floating point version by default.
+
+2006-04-29 Saturday 10:40 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.39): Fixed a bug in the floating point
+ version: remember to initialize the values in the first loop
+ before comparing `current' and `challenger' values.
+
+2006-04-29 Saturday 09:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.7): In
+ BD_Shape<T>::affine_preimage(), corrected the bug shown by
+ test09() of affinepreimage2.cc.
+
+2006-04-29 Saturday 09:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/affinepreimage2.cc (1.12): test09() shows a bug in
+ the computation of BD_Shape<T>::affine_preimage() under somehow
+ specific conditions (expression is invertible and on a single
+ variable, denominator is equal to opposite of the coefficient of
+ the variable and the inhomogeneous term is non-zero).
+
+2006-04-28 Friday 23:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am, src/Octagon.cc, src/Octagon.defs.hh,
+ src/Octagon.inlines.hh, src/Octagon.templates.hh,
+ src/Octagon.types.hh, src/Octagonal_Shape.cc,
+ src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+ src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+ tests/ppl_test.hh, tests/print.hh
+ (octagons.[4,2,17,17,28,2,1,1,1,1,1,2,3,1,1,2,2]): Class template
+ Octagon renamed to Octagonal_Shape.
+
+2006-04-28 Friday 17:27 quartieri
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[16,16,27]): Improved the private methods
+ Octagon<T>::forget_all_octagonal_constraints() and
+ Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-28 Friday 16:46 quartieri
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[15,15,26]): Improved the private methods
+ Octagon<T>::add_octagonal_constraint().
+
+2006-04-28 Friday 16:18 quartieri
+
+ * src/Octagon.templates.hh (octagons.25): Corrected a bug in
+ Octagon<T>::generalized_affine_preimage() and added some tests
+ for it.
+
+2006-04-28 Friday 14:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.6): Corrected a couple of typos in
+ the (optional) output produced by OK() when invarinats are
+ violated. Renamed iterators in BD_Shape(const Generator_System&)
+ so as to avoid misleading name clash with space dimension
+ indices.
+
+2006-04-27 Thursday 17:08 quartieri
+
+ * src/Octagon.templates.hh (octagons.24): Corrected a bug in
+ Octagon::generalized_affine_preimage() and added a test for it.
+
+2006-04-27 Thursday 17:05 Elena Mazzi
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (1.11): Corrected an
+ error in `test04', but the bug remains.
+
+2006-04-27 Thursday 16:31 Elena Mazzi
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[6,11]):
+ Improved the comments about the class OR_Matrix.
+
+2006-04-27 Thursday 13:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagon.templates.hh (octagons.23): Corrected a few spelling
+ errors inside assertions.
+
+2006-04-27 Thursday 13:28 Elena Mazzi
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (1.10): Added a new
+ test that shows a bug in the method:
+ BD_Shape::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagon.templates.hh (octagons.22): Committed an improved
+ version of the inner loop of strong_closure_assign(), avoiding
+ repeated conditional tests and coherent indexes computations.
+
+2006-04-27 Thursday 12:23 quartieri
+
+ * src/Octagon.templates.hh (octagons.21): Corrected the functions
+ Octagon<T>::affine_image(),
+ Octagon<T>::affine_preimage(),
+ Octagon<T>::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression&
+ expr ,
+ Coefficient_traits::const_reference
+ denominator),
+ Octagon<T>::generalized_affine_image(const Linear_Expression&
+ lhs, const
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs). Added the function
+ Octagon<T>::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:04 quartieri
+
+ * src/Octagon.inlines.hh (octagons.14): Defined the function
+ Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-27 Thursday 12:00 quartieri
+
+ * src/Octagon.defs.hh (octagons.14): Added the new functions
+ void forget_binary_octagonal_constraints() and void
+ generalized_affine_preimage().
+
+2006-04-27 Thursday 10:38 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[13,20]):
+ Renamed `compute_nexts()' with `compute_successors()'. Replaced
+ the word `next' with `successor'. Removed an obsolete line in
+ Octagon::strong_reduction_assign().
+
+2006-04-26 Wednesday 14:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[5,10]):
+ Removed unused method OR_Matrix::erase_to_end().
+
+2006-04-26 Wednesday 14:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Octagon.templates.hh (octagons.19): Prefer
+ OR_Matrix::shrink() to OR_Matrix::resize_no_copy() when we
+ statically know that we are removing space dimensions.
+
+2006-04-26 Wednesday 14:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[12,13,18]): In Octagon.defs.hh: Small formatting and
+ documentation improvements (Use the multiline Doxygen comment
+ style for comments spanning more lines). Methods grouped into
+ classes (as done for other domains). Added declarations for
+ debugging-related output methods.
+
+ In Octagon.inlines.hh: Do not include useless file headers
+ (vector, deque, string). Avoid lines that are twoo long and
+ trailing whitespace. Use OR_Matrix::shrink() instead of
+ OR_Matrix::remove_rows().
+
+ In OR_Matrix.templates.hh: Do include header file for strings.
+ Several optimizations to strong_closure_assign(). Added
+ several missing const modifiers. Prefer using "\n" to
+ std::endl when printing on streams.
+
+2006-04-26 Wednesday 14:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am, OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+ OR_Matrix.templates.hh (octagons.[3,4,9,1]): In
+ OR_Matrix.defs.hh: Include globals.defs.hh; do not include
+ vector and deque. Small formatting and documentation
+ improvements (Use the multiline Doxygen comment style for
+ comments spanning more lines). Default constructor OR_Matrix()
+ is now private and not implemented. Added method
+ OR_Matrix::shrink() to remove some of the last dimensions from
+ the matrix; removed methods add_rows() and remove_rows().
+ Corrected documentation of method ascii_dump & load.
+
+ In OR_Matrix.inlines.hh: Do not include useless file headers
+ (vector, deque, string, iostream, sstream, stdexcept). Added
+ missing inline declarations to methods row_size() and
+ row_first_element_index(), as well as several const modifiers.
+ Avoid lines that are twoo long and trailing whitespace.
+ Removed (buggy) implementation of default constructor.
+ Implemented new method OR_Matrix::shrink() and used in the
+ implementation of resize_no_copy() (which still contains an
+ efficiency bug). Method that do not stand a chance of being
+ inlined moved into OR_Matrix.templates.hh (ascii_dump,
+ ascii_load, operator<<, OK).
+
+ In OR_Matrix.templates.hh: Improved implementation of method
+ OK() by printing the reasons of failures. Added
+ debugging-related output methods.
+
+2006-04-26 Wednesday 12:09 Elena Mazzi
+
+ * src/Octagon.inlines.hh (octagons.12): Removed a silly and
+ not-necessary function change(); renamed `position_cell()' with
+ `get_matrix_element()'.
+
+2006-04-26 Wednesday 09:52 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[11,17]):
+ Added a new constructor: Octagon(const Generator_System& gs).
+ Improved and adjust some comments in Octagon::constraints().
+ Improved the method Octagon::OK(): MINUS_INFINITY cannot occur at
+ all. Improved the method Octagon::is_strong_coherent(): removing
+ some not necessary lines.
+
+ Adjusted some comments in Octagon::map_space_dimensions(),
+ Octagon::remove_space_dimensions(). Renamed also some silly
+ variables.
+
+2006-04-20 Thursday 16:32 quartieri
+
+ * src/Octagon.templates.hh (octagons.16): Completed and corrected
+ affine_image(). Corrected operator<<(). Cleaned some lines in
+ affine_preimage().
+
+2006-04-20 Thursday 16:27 quartieri
+
+ * src/Octagon.inlines.hh (octagons.11): Corrected a wrong index in
+ forget_all_octagonal_constraints().
+
+2006-04-20 Thursday 16:23 quartieri
+
+ * src/Octagon.defs.hh (octagons.10): Eliminated the wrong method
+ `deduce_u_plus_v_bounds() and added the method
+ deduce_minus_v_minus_u_bounds().
+
+2006-04-20 Thursday 08:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.pl (1.89), GNU/ppl_gprolog.pl
+ (1.60), SICStus/ppl_sicstus_sd.cc (1.93), SWI/ppl_swiprolog.cc
+ (1.123), XSB/ppl_xsb.H (1.48), XSB/ppl_xsb.cc (1.88),
+ YAP/ppl_yap.cc (1.116): Restore previous versions of system
+ dependent files.
+
+2006-04-20 Thursday 07:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.177), Ciao/ppl_ciao.pl
+ (1.88), GNU/ppl_gprolog.pl (1.59), SICStus/ppl_sicstus_sd.cc
+ (1.92), SWI/ppl_swiprolog.cc (1.122), XSB/ppl_xsb.H (1.47),
+ XSB/ppl_xsb.cc (1.87), YAP/ppl_yap.cc (1.115): Redundant widening
+ code removed.
+
+2006-04-19 Wednesday 16:38 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[9,10,15]): Cleaned strong_reduction_assign(). Added a
+ new method: Octagon::minimized_constraints(). Added tests for
+ minimized_constraints().
+
+2006-04-19 Wednesday 15:02 Elena Mazzi
+
+ * src/Octagon.templates.hh (octagons.14): Fixed and added some
+ comments in Octagon::concatenate_assign() and
+ Octagon::is_strongly_reduced().
+
+2006-04-19 Wednesday 14:25 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[8,13]): No
+ longer disregard the optional tokens parameter in the
+ extrapolation and widening methods. Renamed CH78_widening and
+ limited_CH78_extrapolation respectly BHMZ05_widening and
+ limited_BHMZ05_extrapolation.
+
+ Tests for extrapolation and widening rewritten according to the
+ new guidelines.
+
+2006-04-19 Wednesday 13:21 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[7,9,12]): No longer disregard the optional tokens
+ parameter in the CC76_extrapolation_assign() methods. Tests for
+ Octagon::CC76_extrapolation_assign() rewritten according to the
+ new guidelines.
+
+2006-04-19 Wednesday 12:55 quartieri
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[6,8,11]): Fixed the constructors and some methods.
+ Defined the methods deduce_v_plus_u_bounds() and
+ deduce_u_plus_v_bounds() used by affine_image().
+
+2006-04-19 Wednesday 12:49 quartieri
+
+ * src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[3,8]):
+ Replaced the private field 'num_rows_' with the field
+ 'space_dim', that is
+ the dimension of the octagon represented by the OR_Matrix.
+
+2006-04-19 Wednesday 12:11 Elena Mazzi
+
+ * src/Octagon.templates.hh (octagons.10): Improved
+ Octagon::CC76_narrowing_assign(). Tests for
+ Octagon::CC76_narrowing_assign() rewritten according to the new
+ guidelines.
+
+2006-04-19 Wednesday 12:05 Elena Mazzi
+
+ * src/BD_Shape.templates.hh (1.5): Corrected
+ BD_Shape::get_limiting_shape(). Now there's no precision bug in
+ BD_Shape::limited_CC76_extrapolation_assign().
+
+2006-04-19 Wednesday 11:54 Elena Mazzi
+
+ * tests/BD_Shape/limitedcc76extrapolation1.cc (1.8): Corrected test
+ number `6', now it shows a precision bug.
+
+2006-04-19 Wednesday 11:31 Elena Mazzi
+
+ * src/Octagon.templates.hh (octagons.9): Cleaned
+ Octagon::add_constraint. Methods poly_hull_assign() and
+ poly_hull_assign_and_minimize() renamed as oct_hull_assign() and
+ oct_hull_assign_and_minimize(). Tests for
+ Octagon::oct_hull_assign() rewritten according to the new
+ guidelines.
+
+2006-04-18 Tuesday 23:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[5,7,8]): Corrected copyright year and address of the
+ FSF. Added method strictly_contains(). Methods
+ poly_hull_assign() and poly_hull_assign_and_minimize() renamed as
+ oct_hull_assign() and oct_hull_assign_and_minimize(). Added
+ method upper_bound_assign(). Added methods
+ oct_hull_assign_if_exact() and upper_bound_assign_if_exact(),
+ both with dummy implementations always returning false. Added
+ method difference_assign(). Added token parameter tp to
+ CH78_widening_assign(), temporarily ignored, so as to allow for
+ using this widening in widen_fun_ref(). Duplicated code for
+ numer_denom() and assign_min() removed: now using numer_denom()
+ and min_assign() as defined in Implementation::BD_Shapes.
+
+2006-04-18 Tuesday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (simplex.38): Improved
+ LP_Problem::steepest_edge_entering_index() by avoiding duplicate
+ computation and mitigating a problem (still present) whereby no
+ caution is taken with respect to the possibility that
+ mpq_class::get_d() (and, previously, also mpz_class::get_d())
+ give rise to undefined behavior. Added a FIXME not to forget
+ about this problem.
+
+2006-04-18 Tuesday 21:01 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.8): Be verbose only if
+ requested.
+
+2006-04-18 Tuesday 19:44 Andrea Cimino
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.7): Modified `ppl_lpsol' for
+ testing purposes: added the options --no-optimization (-n) and
+ --incremental (-i).
+
+2006-04-16 Sunday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/OR_Matrix.inlines.hh (octagons.7): Improved
+ OR_Matrix<T>::ascii_load(): useless reference avoided, variable
+ renamed, added a const qualifier.
+
+2006-04-16 Sunday 08:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.72), devref.doxyconf-latex.in
+ (1.12): Also generate devref docs from DB_Row.templates.hh and
+ DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.152): Take into account DB_Row.templates.hh
+ and DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.defs.hh (1.21), DB_Matrix.inlines.hh (1.26),
+ DB_Matrix.templates.hh (1.1): DB_Matrix non-inline methods moved
+ to DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.templates.hh (octagons.1): file
+ DB_Matrix.templates.hh was added on branch octagons on 2006-05-08
+ 16:16:43 +0000
+
+2006-04-16 Sunday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.templates.hh (simplex.1): file
+ DB_Matrix.templates.hh was added on branch simplex on 2006-05-08
+ 17:15:49 +0000
+
+2006-04-16 Sunday 08:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Row.defs.hh (1.18), DB_Row.inlines.hh (1.18),
+ DB_Row.templates.hh (1.1): DB_Row non-inline methods moved in
+ file DB_Row.templates.hh. Methods begin() and end() are now
+ declared inline.
+
+2006-04-16 Sunday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh (octagons.1): file DB_Row.templates.hh
+ was added on branch octagons on 2006-05-08 16:16:43 +0000
+
+2006-04-16 Sunday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.templates.hh (simplex.1): file DB_Row.templates.hh was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-04-14 Friday 18:25 quartieri
+
+ * src/OR_Matrix.inlines.hh (octagons.6): Improved
+ IO_Operators::operator<<().
+
+2006-04-14 Friday 17:29 quartieri
+
+ * src/OR_Matrix.inlines.hh (octagons.5): Improved the method
+ OR_Matrix<T>::ascii_load().
+
+2006-04-14 Friday 16:55 quartieri
+
+ * src/OR_Matrix.inlines.hh (octagons.4): Improved the method
+ OR_Matrix<T>::grow().
+
+2006-04-14 Friday 16:27 quartieri
+
+ * src/OR_Matrix.inlines.hh (octagons.3): Removed a wrong comment.
+
+2006-04-14 Friday 15:50 quartieri
+
+ * src/OR_Matrix.defs.hh (octagons.2): Corrected some wrong
+ comments.
+
+2006-04-13 Thursday 15:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: affineimage2.cc (1.6), join1.cc (1.11): Added extra
+ tests to match the running example in the Muller-Olm and Seidl
+ 2005 ESOP paper. Small improvements to the tests using the
+ example in the Muller-Olm and Seidl 2005 SAS paper
+
+2006-04-13 Thursday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage2.cc (simplex.1): file affineimage2.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-13 Thursday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/join1.cc (simplex.1): file join1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-12 Wednesday 13:05 quartieri
+
+ * src/Octagon.inlines.hh (octagons.6): Restored a missing '#ifdef'
+ line.
+
+2006-04-12 Wednesday 11:13 quartieri
+
+ * src/Octagon.inlines.hh (octagons.5): Removed the redundant
+ definition of div_round_up: it is already in BD_Shape.inlines.hh.
+
+2006-04-11 Tuesday 17:06 quartieri
+
+ * src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+ (octagons.[4,4,7]): Removed the unnecessary algorithms of strong
+ closure and incremental strong closure.
+
+2006-04-10 Monday 16:11 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[3,6]):
+ Added a new method `Octagon::affine_dimension()'. Defined a new
+ function `Octagon::compute_leaders(leader)' that the above method
+ uses.
+
+2006-04-10 Monday 13:57 Elena Mazzi
+
+ * src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[2,5]):
+ Method Octagon::poly_difference_assign() renamed
+ Octagon::oct_difference_assign(). Corrected a bug in
+ Octagon::oct_difference_assign().
+
+ Improved Octagon::transitive_reduction_assign() using two new
+ functions: Octagon::compute_nexts() and
+ Octagon::compute_leaders().
+
+2006-04-08 Saturday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.cc (1.3): Typo fixed in comment.
+
+2006-04-07 Friday 09:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (octagons.1): Added template <typename T> void
+ print_constraints(const Parma_Polyhedra_Library::Octagon<T>& oc,
+ const std::string& intro = "", std::ostream& s = nout).
+
+2006-04-07 Friday 07:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: addconstraints1.cc, addspacedims1.cc,
+ affineimage1.cc, affinepreimage1.cc, ascii_dump_load1.cc,
+ bdsdifference1.cc, bdshull1.cc, bhmz05widening1.cc,
+ cc76extrapolation1.cc, cc76narrowing1.cc, concatenate1.cc,
+ constraints1.cc, generalizedaffineimage1.cc,
+ generalizedaffineimage2.cc, h79widening1.cc, intersection1.cc,
+ limitedbhmz05extrapolation1.cc, limitedcc76extrapolation1.cc,
+ limitedh79extrapolation1.cc, mapspacedims1.cc,
+ minconstraints1.cc, removespacedims1.cc, timeelapse1.cc
+ (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Spurious blank spaces removed.
+
+2006-04-07 Friday 07:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/universe1.cc (octagons.1): This test was wrong:
+ fixed.
+
+2006-04-06 Thursday 21:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am, Octagon.templates.hh, Og_Status.inlines.hh
+ (octagons.[2,4,2]): Several corrections.
+
+2006-04-06 Thursday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Row.defs.hh, OR_Matrix.inlines.hh, Octagon.inlines.hh,
+ Octagon.templates.hh (octagons.[1,2,3,3]): More corrections. One
+ FIXME added to DB_Row.defs.hh concerning a "private" that was
+ temporarily turned into "public".
+
+2006-04-05 Wednesday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Octagon.inlines.hh, src/Octagon.templates.hh,
+ src/globals.defs.hh, src/globals.inlines.hh, tests/ppl_test.hh
+ (octagons.[2,2,1,1,1]): Lots of corrections.
+
+2006-04-05 Wednesday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Makefile.am, src/OR_Matrix.defs.hh,
+ src/OR_Matrix.inlines.hh, src/OR_Matrix.types.hh, src/Octagon.cc,
+ src/Octagon.defs.hh, src/Octagon.inlines.hh,
+ src/Octagon.templates.hh, src/Octagon.types.hh,
+ src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+ tests/Makefile.am (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Imported (with changes) from the private repository.
+
+2006-04-04 Tuesday 08:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.56): The `-V' option is only
+ available with the PPL version.
+
+2006-04-03 Monday 09:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (1.12): Revised failing tests for different
+ checked integer configurations.
+
+2006-04-03 Monday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid3.cc (simplex.1): file grid3.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-03 Monday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.119), Constraint.inlines.hh (1.63):
+ Added Constraint operator==(Variable v1, Variable v2), Constraint
+ operator<=(Variable v1, Variable v2), Constraint
+ operator>=(Variable v1, Variable v2), Constraint
+ operator<(Variable v1, Variable v2) and Constraint
+ operator>(Variable v1, Variable v2).
+
+2006-04-03 Monday 08:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.inlines.hh (1.13), BD_Shape.templates.hh (1.4),
+ DB_Matrix.inlines.hh (1.25): Drop spurious semicolons.
+
+2006-04-03 Monday 08:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.118): Use vertical spacing to separate
+ declarations from one another.
+
+2006-03-31 Friday 16:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid.templates.hh (1.5), Grid_Generator.cc (1.7),
+ Grid_Generator.defs.hh (1.15), Grid_Generator.inlines.hh (1.9),
+ Grid_nonpublic.cc (1.8), Grid_public.cc (1.16): A grid generator
+ is a "grid_line", "parameter" or "grid_point".
+
+2006-03-31 Friday 16:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.inlines.hh (simplex.1): file
+ Grid_Generator.inlines.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-03-31 Friday 14:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.15): Allow for the empty constraint system
+ when constructing a grid. This fixes a bug illustrated by test03
+ in grid3.cc
+
+2006-03-31 Friday 14:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (1.11): test03 inserted to show a bug in the
+ grids system when constructing a grid from an empty constraint
+ system.
+
+2006-03-28 Tuesday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.192), README (1.49), configure.ac (1.231),
+ src/Makefile.am (1.151): We are now in the 0.10 era.
+
+2006-03-28 Tuesday 11:19 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[37,26]):
+ Underline the difference betweeen the `steepest-edge' and
+ `textbook' techniques.
+
+2006-03-24 Friday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid_simplify.cc (1.11), Polyhedra_Powerset.templates.hh
+ (1.3): Spurious semicolons removed.
+
+2006-03-24 Friday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.templates.hh (simplex.1): file
+ Polyhedra_Powerset.templates.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_nonpublic.cc (1.7): Avoid variable re-declaration.
+
+2006-03-24 Friday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.inlines.hh (1.7), Congruence_System.inlines.hh
+ (1.4): Inline definitions moved before their first use.
+
+2006-03-24 Friday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.inlines.hh (simplex.1): file
+ Congruence_System.inlines.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generator1.cc (simplex.1): file generator1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.templates.hh (1.4), src/Grid_Generator.cc (1.6),
+ src/Grid_Generator.defs.hh (1.14), src/Grid_Generator.inlines.hh
+ (1.8), src/Grid_conversion.cc (1.6), src/Grid_public.cc (1.14),
+ src/Grid_simplify.cc (1.10), tests/Grid/generator1.cc (1.10):
+ Method Coefficient& Grid_Generator::divisor() removed. Method
+ void
+ Grid_Generator::set_divisor(Coefficient_traits::const_reference)
+ added.
+
+2006-03-24 Friday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence_System.inlines.hh (1.3),
+ Grid_Generator_System.inlines.hh (1.7): Inline definitions moved
+ before their first use.
+
+2006-03-24 Friday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generator1.cc (1.9): FIXME added.
+
+2006-03-24 Friday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.cc (1.10): Spurious variable re-declaration
+ removed.
+
+2006-03-24 Friday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.17), BD_Shape.defs.hh (1.67),
+ Congruence.cc (1.4), Congruence.defs.hh (1.7),
+ Congruence.inlines.hh (1.6), Congruence_System.cc (1.9),
+ Congruence_System.defs.hh (1.8), Constraint.cc (1.58),
+ Constraint.defs.hh (1.117), Constraint_System.cc (1.17),
+ Constraint_System.defs.hh (1.28), DB_Matrix.defs.hh (1.20),
+ Generator.cc (1.69), Generator.defs.hh (1.117),
+ Generator_System.cc (1.18), Generator_System.defs.hh (1.17),
+ Grid.defs.hh (1.14), Grid_Generator.cc (1.5),
+ Grid_Generator.defs.hh (1.13), Grid_Generator_System.cc (1.6),
+ Grid_Generator_System.defs.hh (1.11), Grid_Status.cc (1.3),
+ Grid_Status.idefs.hh (1.3), Grid_public.cc (1.13), LP_Problem.cc
+ (1.13), LP_Problem.defs.hh (1.8), Linear_Row.cc (1.18),
+ Linear_Row.defs.hh (1.19), Linear_System.cc (1.38),
+ Linear_System.defs.hh (1.25), Matrix.cc (1.93), Matrix.defs.hh
+ (1.76), Ph_Status.cc (1.10), Ph_Status.idefs.hh (1.17),
+ Poly_Con_Relation.cc (1.13), Poly_Con_Relation.defs.hh (1.32),
+ Poly_Gen_Relation.cc (1.13), Poly_Gen_Relation.defs.hh (1.30),
+ Polyhedra_Powerset.defs.hh (1.34), Polyhedron.defs.hh (1.296),
+ Polyhedron_public.cc (1.74), Row.cc (1.98), Row.defs.hh (1.105),
+ Saturation_Matrix.cc (1.9), Saturation_Matrix.defs.hh (1.8):
+ Unwanted semicolons removed.
+
+2006-03-24 Friday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.defs.hh (simplex.1): file
+ Congruence_System.defs.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.defs.hh (simplex.1): file Grid.defs.hh was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.defs.hh (simplex.1): file
+ Grid_Generator_System.defs.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.idefs.hh (simplex.1): file Grid_Status.idefs.hh
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 16:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.inlines.hh (1.7): Inline definitions moved
+ before their first use.
+
+2006-03-24 Friday 15:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: affinedim1.cc (1.9), bounded1.cc (1.10), bounds1.cc
+ (1.11), discrete1.cc (1.4), maxmin1.cc (1.7), topclosed1.cc
+ (1.8): Replaced assert(copy_compare(...)) with a comment.
+
+2006-03-24 Friday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinedim1.cc (simplex.1): file affinedim1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bounded1.cc (simplex.1): file bounded1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bounds1.cc (simplex.1): file bounds1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/discrete1.cc (simplex.1): file discrete1.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/topclosed1.cc (simplex.1): file topclosed1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.defs.hh (1.12), src/Grid_Generator.inlines.hh
+ (1.6), tests/Grid/generator1.cc (1.8): Added coefficient() to
+ Grid_Generator class.
+
+2006-03-24 Friday 11:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/widening2.cc (1.3): There is positive overflow for
+ tests 12 and 13 for checked 8.
+
+2006-03-24 Friday 11:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening2.cc (simplex.1): file widening2.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 11:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.defs.hh (1.6): Indentation fixed.
+
+2006-03-24 Friday 11:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.defs.hh (1.5), Congruence.inlines.hh (1.5),
+ Linear_Expression.defs.hh (1.24): Lots of bogus declarations
+ fixed.
+
+2006-03-23 Thursday 23:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (1.9): All comments on right of code moved
+ (and, as needed, reworded) to separate line(s) before code being
+ commented.
+
+2006-03-23 Thursday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.13), Grid_simplify.cc (1.8): Enforce a bit
+ of const-correctness.
+
+2006-03-23 Thursday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_simplify.cc (1.7): Avoid the creation of several
+ temporaries.
+
+2006-03-23 Thursday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.295), Polyhedron_chdims.cc (1.36),
+ Polyhedron_public.cc (1.73): Do not use `f(...)' to mean function
+ `f': use `f()' instead (the ellipsis indicates variable number of
+ arguments in C++). Puncutation fixes in comments.
+
+2006-03-22 Wednesday 13:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.196), src/Congruence.defs.hh (1.4),
+ src/Congruence.inlines.hh (1.4), src/Linear_Expression.defs.hh
+ (1.23), tests/Grid/congruence1.cc (1.11): Added n %= e to the
+ allowed set of congruence constructors. The current
+ implementation is temporary; an executable specification needing
+ friendship of Linear_Expression.
+
+2006-03-22 Wednesday 13:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruence1.cc (simplex.1): file congruence1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-22 Wednesday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.46): Removed find_variation(): it was plain
+ nonsense.
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation3.cc (simplex.1): file
+ limitedextrapolation3.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening1.cc (simplex.1): file widening1.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/widening3.cc (simplex.1): file widening3.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.195), src/Grid.defs.hh (1.12),
+ src/Grid_widenings.cc (1.6), tests/Grid/Makefile.am (1.29),
+ tests/Grid/limitedextrapolation1.cc (1.8),
+ tests/Grid/limitedextrapolation2.cc (1.2),
+ tests/Grid/limitedextrapolation3.cc (1.1),
+ tests/Grid/widening1.cc (1.10), tests/Grid/widening2.cc (1.2),
+ tests/Grid/widening3.cc (1.1): There are now three flavours of
+ grid widening.
+
+ The `generator_widening_assign()' is as commited previously
+ (using generators) and file `widening2.cc' tests this.
+
+ The `congruence_widening_assign()' is a renaming of the old
+ `widening_assign()' (using congruences) and `widening1.cc' tests
+ this.
+
+ The new `widening_assign()' uses either of the above two
+ widenings depending on which of the systems describing the grid
+ are up-to-date. The new test file `widening3.cc' tests this
+ widening.
+
+ There are, similarly, three flavours of a
+ `limited_*extrapolation_assign()' operator.
+
+ The documentation in `definitions.dox' on the grid widening has
+ been brought up to date and improved.
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_widenings.cc (simplex.1): file Grid_widenings.cc was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (simplex.1): file Makefile.am was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation1.cc (simplex.1): file
+ limitedextrapolation1.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/limitedextrapolation2.cc (simplex.1): file
+ limitedextrapolation2.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-14 Tuesday 11:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.11), src/Grid_Generator.defs.hh (1.11),
+ src/Grid_Generator.inlines.hh (1.5), src/Grid_widenings.cc (1.5),
+ tests/Grid/Makefile.am (1.28),
+ tests/Grid/limitedextrapolation2.cc (1.1),
+ tests/Grid/widening2.cc (1.1): Added new methods
+ generator_widening_assign() and
+ limited_generator_widening_assign() as defined in draft paper.
+
+ Added method is_equal_at_dimension() for grid generators which is
+ a clone of the existing method for congruences.
+
+ widening2.cc and limitedextrapolation2.cc check the new widening.
+
+2006-03-13 Monday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (1.27): Added ascii_dump_load1.dat to
+ MOSTLYCLEANFILES.
+
+2006-03-12 Sunday 20:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/congruencesystem1.cc (1.10): Tests in
+ congruencesystem1.cc now included in congruences2.cc.
+
+2006-03-12 Sunday 10:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (1.4): Typo in comment corrected.
+
+2006-03-12 Sunday 10:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.26), congruences1.cc (1.8),
+ congruences2.cc (1.1), congruencesystem1.cc (1.9), generator1.cc
+ (1.7), generators1.cc (1.10), grid3.cc (1.10),
+ removespacedims1.cc (1.9), removespacedims2.cc (1.7): To improve
+ coverage of testing added further tests.
+
+ Test program congruences1 split into congruences1 and
+ congruences2 to make room for extra tsets in congruences1.
+
+ Tests in removespacedims1 check remove_space_dimensions while
+ tests in removespacedims2 check remove_higher_space_dimensions.
+
+2006-03-12 Sunday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruences1.cc (simplex.1): file congruences1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/congruences2.cc (simplex.1): file congruences2.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generators1.cc (simplex.1): file generators1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/removespacedims1.cc (simplex.1): file
+ removespacedims1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-12 Sunday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/removespacedims2.cc (simplex.1): file
+ removespacedims2.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-12 Sunday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_9-branch.1): Update version.
+
+2006-03-12 Sunday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_9-branch.[1,1]): Mark
+ ChangeLog.
+
+2006-03-11 Saturday 12:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/asciidumpload2.cc (1.1): Further tests for
+ ascii_load() to improve coverage.
+
+2006-03-11 Saturday 12:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/asciidumpload2.cc (simplex.1): file asciidumpload2.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.25), addconstraints1.cc (1.9),
+ addspacedims1.cc (1.10), asciidumpload1.cc (1.7), concatenate1.cc
+ (1.10), congruence1.cc (1.10), congruencesystem1.cc (1.8),
+ equals1.cc (1.9), generators1.cc (1.9), grid2.cc (1.10), grid3.cc
+ (1.9), mincongruences1.cc (1.8), relations1.cc (1.10),
+ relations2.cc (1.9), removespacedims1.cc (1.8): Small changes o
+ existing tests. Several new tests (in the existing files added
+ to improve test coverage. A few of these extra tests showed up
+ bugs that are now fixed.
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addconstraints1.cc (simplex.1): file
+ addconstraints1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addspacedims1.cc (simplex.1): file addspacedims1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/concatenate1.cc (simplex.1): file concatenate1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/equals1.cc (simplex.1): file equals1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid2.cc (simplex.1): file grid2.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mincongruences1.cc (altnum.1): file mincongruences1.cc
+ was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mincongruences1.cc (simplex.1): file
+ mincongruences1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations1.cc (simplex.1): file relations1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/relations2.cc (simplex.1): file relations2.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 09:53 Andrea Cimino
+
+ * TODO (simplex.4): Removed the previously added item. In the
+ incremental implementation, the check that a slack variable can
+ avoid an artifical one is already implemented.
+
+2006-03-11 Saturday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.26): Updated.
+
+2006-03-11 Saturday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.8): Updated.
+
+2006-03-10 Friday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/README (1.2): Incomplete sentence removed.
+
+2006-03-10 Friday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/README (altnum.1): file README was added on branch altnum
+ on 2006-10-29 19:26:52 +0000
+
+2006-03-10 Friday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/README (simplex.1): file README was added on branch
+ simplex on 2006-05-08 17:15:45 +0000
+
+2006-03-10 Friday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/changelog (1.4): Updated for PPL 0.9.
+
+2006-03-10 Friday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/changelog (altnum.1): file changelog was added on branch
+ altnum on 2006-10-29 19:26:52 +0000
+
+2006-03-10 Friday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.25), Watchdog/ChangeLog (1.15): Updated.
+
+2006-03-10 Friday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: README.doc (1.10), devref.tex (1.20), user.tex (1.21):
+ Followed the advice of the people at FSF: it should now be
+ overwhelmingly clear that the documentation is distributed under
+ the terms of the GNU Free Documentation License, Version 1.2 or
+ any later version published by the Free Software Foundation.
+
+2006-03-10 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.48), Watchdog/README (1.14): Updated.
+
+2006-03-10 Friday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.47): Formatting improved.
+
+2006-03-10 Friday 10:47 Andrea Cimino
+
+ * TODO (simplex.3): Added one item.
+
+2006-03-10 Friday 10:40 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.36): Fixed a comment, due to the
+ change in the last commit.
+
+2006-03-10 Friday 10:36 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.35): Don't add artificial variables
+ also if the inhomogeneous term of an inequality is a zero. In
+ many problems this decreases the number of iterations involved,
+ specially in the satisfiability check.
+
+2006-03-10 Friday 10:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (1.6): Added a FIXME comment.
+
+2006-03-10 Friday 09:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (1.5): Fixed a bug in Grid simplify when
+ there are two all zero (trivially true) equalities.
+
+2006-03-09 Thursday 11:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/linearsystem1.cc (1.6): Added a workaround to
+ avoid trivial (but intermittent) positive overflows when
+ populating a Linear_Row with randomly generated values and using
+ a bounded integer datatype.
+
+2006-03-09 Thursday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Random_Number_Generator.defs.hh (1.3),
+ Random_Number_Generator.inlines.hh (1.8): Allow for the
+ specification of a fixed seed.
+
+2006-03-09 Thursday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Random_Number_Generator.defs.hh (altnum.1): file
+ Random_Number_Generator.defs.hh was added on branch altnum on
+ 2006-10-29 19:27:21 +0000
+
+2006-03-09 Thursday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Random_Number_Generator.inlines.hh (altnum.1): file
+ Random_Number_Generator.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:21 +0000
+
+2006-03-09 Thursday 08:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Grid_Generator.cc (1.4), Grid_Generator_System.inlines.hh
+ (1.6): Comments concerning the extra parameter divisor column
+ improved.
+
+2006-03-08 Wednesday 23:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.inlines.hh (1.5): Bug fixed for
+ clear().
+
+2006-03-08 Wednesday 21:43 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[34,25]): Major
+ improvement: check if a slack variable can avoid to insert an
+ (useless) artificial variable. Now (in the standard way, not
+ incremental) the simplex solves `boeing1.mps --max' in half the
+ time than before!
+
+2006-03-08 Wednesday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/Makefile.am (1.26), ppl_lpsol/Makefile.am
+ (1.30): Fixed the use of ECHO_N and ECHO_C.
+
+2006-03-08 Wednesday 08:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.cc (1.5): Fixed a bug in
+ remove_higher_space_dimensions().
+
+2006-03-08 Wednesday 07:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/Makefile.am (1.25), ppl_lpsol/Makefile.am
+ (1.29): No longer use `echo -n': it is non portable.
+
+2006-03-08 Wednesday 07:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.55): Enforce dependencies
+ in order to cater for parallel builds.
+
+2006-03-07 Tuesday 22:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.28): No longer use the
+ non-portable `-e' option of `grep'. On Solaris, optima are
+ compared only up to 8 digits of precision.
+
+2006-03-07 Tuesday 21:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.230): New Automake conditional HOST_OS_SOLARIS.
+
+2006-03-07 Tuesday 21:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.27): No longer use the
+ `--ignore-all-space' option of `diff'. Check the obtained optima
+ also under Darwin.
+
+2006-03-07 Tuesday 16:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (1.8): Code change in previous commit
+ revised and improved.
+
+2006-03-07 Tuesday 16:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (1.7): Bug fixed in
+ PPL::Congruence_System::insert(const Congruence_System& y)
+
+2006-03-07 Tuesday 13:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (1.6): Fixed a bug in is_equal-to():
+ Return false if the congruence systems do not have the same
+ number of rows.
+
+2006-03-07 Tuesday 08:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * STANDARDS (1.33): Typo corrected. Revised for new standards for
+ test programs.
+
+2006-03-07 Tuesday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.26): The `--ignore-all-space' of
+ `diff' is not portable.
+
+2006-03-07 Tuesday 07:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README (1.46): Added an item about grids.
+
+2006-03-06 Monday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.25): Check obtained optima on
+ Cygwin.
+
+2006-03-06 Monday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16 (1.5), expected_int16_a (1.5),
+ expected_int32 (1.6), expected_int32_a (1.6), expected_int64
+ (1.6), expected_int64_a (1.6), expected_int8 (1.5),
+ expected_int8_a (1.4), expected_mpz (1.7), expected_mpz_a (1.7),
+ ppl_lpsol.c (1.30): Use a different format to print the optimum
+ value.
+
+2006-03-06 Monday 13:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.88): The failing configurations
+ of dualhypercubes.cc are now recorded inside the test.
+
+2006-03-06 Monday 13:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.24): Invoke `ppl_lpsol' with the
+ `-c' option, when assertions are disabled.
+
+2006-03-06 Monday 13:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.29): Drafted a partial
+ implementation for option -c (check result). Currently, it only
+ tests for the feasibility of the computed optimal point.
+
+2006-03-06 Monday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.54): Dependencies fixed.
+
+2006-03-06 Monday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/dualhypercubes.cc (1.8): Started adapting it to
+ the new standards (but still checking nothing).
+
+2006-03-06 Monday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/maxspacedim1.cc (1.7): Added a fixme: the test
+ is only doing some compile-time type checking.
+
+2006-03-06 Monday 11:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: minconstraints2.cc (1.10), nncminimize1.cc
+ (1.4): Using std::distance() to compute the number of
+ constraints/generators and check their count is the expected one.
+
+2006-03-06 Monday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize1.cc (altnum.1): file nncminimize1.cc
+ was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize1.cc (simplex.1): file
+ nncminimize1.cc was added on branch simplex on 2006-05-08
+ 17:15:57 +0000
+
+2006-03-06 Monday 11:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence_System.defs.hh (1.7), Constraint_System.defs.hh
+ (1.27), Generator_System.defs.hh (1.16),
+ Grid_Generator_System.defs.hh (1.10): Let the const_iterator's of
+ systems of constraints, generators, congruences and
+ grid-genreators define the type alias difference_type, so as to
+ allow for their use in algorithm such as std::distance.
+ Corrected a bug in Grid_Generator_System, which was defining none
+ of the required type aliases.
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/addcongruence1.cc (altnum.1): file
+ addcongruence1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Grid/addcongruence1.cc, Polyhedron/addcongruence1.cc
+ (simplex.[1,1]): file addcongruence1.cc was added on branch
+ simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/addcongruences1.cc (altnum.1): file
+ addcongruences1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Grid/addcongruences1.cc, Polyhedron/addcongruences1.cc
+ (simplex.[1,1]): file addcongruences1.cc was added on branch
+ simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addconstraint1.cc (simplex.1): file addconstraint1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addgenerator1.cc (simplex.1): file addgenerator1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addgenerators1.cc (simplex.1): file addgenerators1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage1.cc (simplex.1): file affineimage1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinepreimage1.cc (simplex.1): file
+ affinepreimage1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affinepreimage2.cc (simplex.1): file
+ affinepreimage2.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/boundedaffineimage1.cc (altnum.1): file
+ boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/boundedaffinepreimage1.cc (altnum.1): file
+ boundedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/boundedbhrz03extrapolation1.cc (altnum.1): file
+ boundedbhrz03extrapolation1.cc was added on branch altnum on
+ 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundingbox1.cc (simplex.1): file boundingbox1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/boundingbox2.cc (simplex.1): file boundingbox2.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/certificate1.cc (simplex.1): file certificate1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/cnncconversion1.cc (altnum.1): file
+ cnncconversion1.cc was added on branch altnum on 2006-10-29
+ 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/cnncconversion1.cc (simplex.1): file
+ cnncconversion1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/congruences1.cc (altnum.1): file congruences1.cc
+ was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/congruences1.cc (simplex.1): file
+ congruences1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/contains1.cc (simplex.1): file contains1.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/copyconstruct1.cc (altnum.1): file copyconstruct1.cc
+ was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/copyconstruct1.cc (simplex.1): file copyconstruct1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/coveringbox1.cc (simplex.1): file coveringbox1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/coveringbox2.cc (simplex.1): file coveringbox2.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/disjoint1.cc (simplex.1): file disjoint1.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/expandspacedim1.cc (simplex.1): file
+ expandspacedim1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage1.cc (simplex.1): file
+ generalizedaffineimage1.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffineimage2.cc (simplex.1): file
+ generalizedaffineimage2.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/generalizedaffinepreimage1.cc (altnum.1): file
+ generalizedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage1.cc (simplex.1): file
+ generalizedaffinepreimage1.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/generalizedaffinepreimage2.cc (altnum.1): file
+ generalizedaffinepreimage2.cc was added on branch altnum on
+ 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/generalizedaffinepreimage2.cc (simplex.1): file
+ generalizedaffinepreimage2.cc was added on branch simplex on
+ 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/grid1.cc (simplex.1): file grid1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/griddifference1.cc (simplex.1): file
+ griddifference1.cc was added on branch simplex on 2006-05-08
+ 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/intersection1.cc (simplex.1): file intersection1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/isempty1.cc (simplex.1): file isempty1.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/isuniverse1.cc (altnum.1): file isuniverse1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/isuniverse1.cc (simplex.1): file isuniverse1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/join2.cc (simplex.1): file join2.cc was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mapspacedims1.cc (simplex.1): file mapspacedims1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/membytes1.cc (simplex.1): file membytes1.cc was added
+ on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mingenerators1.cc (simplex.1): file mingenerators1.cc
+ was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize2.cc (altnum.1): file nncminimize2.cc
+ was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize2.cc (simplex.1): file
+ nncminimize2.cc was added on branch simplex on 2006-05-08
+ 17:15:57 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (altnum.1): file numberinput1.cc
+ was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/topclosure1.cc (altnum.1): file topclosure1.cc was
+ added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/topclosure1.cc (simplex.1): file topclosure1.cc was
+ added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.45), BD_Shape/addconstraints1.cc (1.11),
+ BD_Shape/addspacedims1.cc (1.11), BD_Shape/affinedimension1.cc
+ (1.7), BD_Shape/affineimage1.cc (1.12), BD_Shape/affineimage2.cc
+ (1.11), BD_Shape/affinepreimage1.cc (1.12),
+ BD_Shape/affinepreimage2.cc (1.11), BD_Shape/ascii_dump_load1.cc
+ (1.12), BD_Shape/bdsdifference1.cc (1.8), BD_Shape/bdshull1.cc
+ (1.8), BD_Shape/bgp99extrapolation1.cc (1.7),
+ BD_Shape/bhmz05widening1.cc (1.8), BD_Shape/bhz03widening1.cc
+ (1.7), BD_Shape/cc76extrapolation1.cc (1.12),
+ BD_Shape/cc76narrowing1.cc (1.12), BD_Shape/closure1.cc (1.14),
+ BD_Shape/concatenate1.cc (1.11), BD_Shape/constraints1.cc (1.14),
+ BD_Shape/contains1.cc (1.10), BD_Shape/empty1.cc (1.9),
+ BD_Shape/equality1.cc (1.14), BD_Shape/fromgensys1.cc (1.11),
+ BD_Shape/generalizedaffineimage1.cc (1.13),
+ BD_Shape/generalizedaffineimage2.cc (1.13),
+ BD_Shape/generalizedaffinepreimage1.cc (1.12),
+ BD_Shape/generalizedaffinepreimage2.cc (1.9),
+ BD_Shape/geomcovers1.cc (1.7), BD_Shape/h79widening1.cc (1.10),
+ BD_Shape/intersection1.cc (1.11),
+ BD_Shape/limitedbhmz05extrapolation1.cc (1.7),
+ BD_Shape/limitedcc76extrapolation1.cc (1.7),
+ BD_Shape/limitedh79extrapolation1.cc (1.10),
+ BD_Shape/mapspacedims1.cc (1.11), BD_Shape/maxspacedim.cc (1.13),
+ BD_Shape/minconstraints1.cc (1.7), BD_Shape/relations1.cc (1.15),
+ BD_Shape/relations2.cc (1.16), BD_Shape/relations3.cc (1.13),
+ BD_Shape/removespacedims1.cc (1.12), BD_Shape/timeelapse1.cc
+ (1.11), BD_Shape/universe1.cc (1.11), BD_Shape/writebdshape1.cc
+ (1.7), Grid/addcongruence1.cc (1.8), Grid/addcongruences1.cc
+ (1.10), Grid/addconstraint1.cc (1.8), Grid/addconstraints1.cc
+ (1.8), Grid/addgenerator1.cc (1.10), Grid/addgenerators1.cc
+ (1.6), Grid/addspacedims1.cc (1.9), Grid/affinedim1.cc (1.8),
+ Grid/affineimage1.cc (1.10), Grid/affineimage2.cc (1.5),
+ Grid/affinepreimage1.cc (1.8), Grid/affinepreimage2.cc (1.3),
+ Grid/asciidumpload1.cc (1.6), Grid/bhz03widening1.cc (1.8),
+ Grid/bounded1.cc (1.9), Grid/boundingbox1.cc (1.8),
+ Grid/boundingbox2.cc (1.7), Grid/bounds1.cc (1.10),
+ Grid/certificate1.cc (1.10), Grid/concatenate1.cc (1.9),
+ Grid/congruence1.cc (1.9), Grid/congruences1.cc (1.7),
+ Grid/congruencesystem1.cc (1.7), Grid/contains1.cc (1.8),
+ Grid/copyconstruct1.cc (1.6), Grid/coveringbox1.cc (1.7),
+ Grid/coveringbox2.cc (1.8), Grid/discrete1.cc (1.3),
+ Grid/disjoint1.cc (1.7), Grid/equals1.cc (1.8),
+ Grid/expandspacedim1.cc (1.7), Grid/foldspacedims1.cc (1.7),
+ Grid/generalizedaffineimage1.cc (1.8),
+ Grid/generalizedaffineimage2.cc (1.8),
+ Grid/generalizedaffinepreimage1.cc (1.9),
+ Grid/generalizedaffinepreimage2.cc (1.9), Grid/generator1.cc
+ (1.6), Grid/generators1.cc (1.8), Grid/grid1.cc (1.12),
+ Grid/grid2.cc (1.9), Grid/grid3.cc (1.8), Grid/griddifference1.cc
+ (1.8), Grid/intersection1.cc (1.7), Grid/isempty1.cc (1.5),
+ Grid/isuniverse1.cc (1.8), Grid/join1.cc (1.10), Grid/join2.cc
+ (1.6), Grid/limitedextrapolation1.cc (1.7), Grid/mapspacedims1.cc
+ (1.8), Grid/maxmin1.cc (1.6), Grid/membytes1.cc (1.5),
+ Grid/mincongruences1.cc (1.7), Grid/mingenerators1.cc (1.7),
+ Grid/outputoperator1.cc (1.5), Grid/relations1.cc (1.9),
+ Grid/relations2.cc (1.8), Grid/removespacedims1.cc (1.7),
+ Grid/timeelapse1.cc (1.7), Grid/topclosed1.cc (1.7),
+ Grid/topclosure1.cc (1.6), Grid/widening1.cc (1.9),
+ Grid/writecongruencesystem.cc (1.5), Polyhedron/addcongruence1.cc
+ (1.6), Polyhedron/addcongruences1.cc (1.8),
+ Polyhedron/addconstraint1.cc (1.8), Polyhedron/addconstraints1.cc
+ (1.9), Polyhedron/addconstraints2.cc (1.8),
+ Polyhedron/addgenerator1.cc (1.9), Polyhedron/addgenerator2.cc
+ (1.9), Polyhedron/addgenerators1.cc (1.9),
+ Polyhedron/addgenerators2.cc (1.9), Polyhedron/addspacedims1.cc
+ (1.9), Polyhedron/addspacedims2.cc (1.9),
+ Polyhedron/affineimage1.cc (1.9), Polyhedron/affineimage2.cc
+ (1.9), Polyhedron/affinepreimage1.cc (1.8),
+ Polyhedron/affinetrans.cc (1.9), Polyhedron/ascii_dump_load1.cc
+ (1.8), Polyhedron/ascii_dump_load2.cc (1.8),
+ Polyhedron/ascii_dump_load3.cc (1.9),
+ Polyhedron/bgp99extrapolation1.cc (1.10),
+ Polyhedron/bhrz03widening1.cc (1.8),
+ Polyhedron/bhrz03widening2.cc (1.8),
+ Polyhedron/bhrz03widening3.cc (1.9), Polyhedron/bhz03widening1.cc
+ (1.10), Polyhedron/bounded1.cc (1.9),
+ Polyhedron/boundedaffineimage1.cc (1.7),
+ Polyhedron/boundedaffinepreimage1.cc (1.6),
+ Polyhedron/boundedbhrz03extrapolation1.cc (1.7),
+ Polyhedron/boundedh79extrapolation1.cc (1.9),
+ Polyhedron/boundingbox1.cc (1.12), Polyhedron/boundingbox2.cc
+ (1.11), Polyhedron/boundingbox3.cc (1.12), Polyhedron/bounds1.cc
+ (1.9), Polyhedron/cnncconversion1.cc (1.2),
+ Polyhedron/concatenate1.cc (1.8), Polyhedron/congruences1.cc
+ (1.6), Polyhedron/constraints1.cc (1.8), Polyhedron/contains1.cc
+ (1.8), Polyhedron/contains2.cc (1.8), Polyhedron/disjoint1.cc
+ (1.8), Polyhedron/disjoint2.cc (1.10), Polyhedron/empty1.cc
+ (1.9), Polyhedron/equals1.cc (1.8), Polyhedron/expandspacedim1.cc
+ (1.10), Polyhedron/expandspacedim2.cc (1.10),
+ Polyhedron/foldspacedims1.cc (1.12), Polyhedron/foldspacedims2.cc
+ (1.12), Polyhedron/generalizedaffineimage1.cc (1.9),
+ Polyhedron/generalizedaffineimage2.cc (1.9),
+ Polyhedron/generalizedaffinepreimage1.cc (1.6),
+ Polyhedron/generalizedaffinepreimage2.cc (1.6),
+ Polyhedron/generators1.cc (1.9), Polyhedron/geomcovers1.cc
+ (1.11), Polyhedron/h79widening1.cc (1.8),
+ Polyhedron/h79widening2.cc (1.8), Polyhedron/intersection1.cc
+ (1.10), Polyhedron/limitedh79extrapolation1.cc (1.8),
+ Polyhedron/linearpartition1.cc (1.8), Polyhedron/linearsystem1.cc
+ (1.5), Polyhedron/linexpression1.cc (1.8),
+ Polyhedron/lpproblem1.cc (1.7), Polyhedron/mapspacedims1.cc
+ (1.11), Polyhedron/max_min1.cc (1.9), Polyhedron/mc91.cc (1.12),
+ Polyhedron/minconstraints1.cc (1.8),
+ Polyhedron/minconstraints2.cc (1.9), Polyhedron/mingenerators1.cc
+ (1.8), Polyhedron/mingenerators2.cc (1.9),
+ Polyhedron/nncminimize1.cc (1.3), Polyhedron/nncminimize2.cc
+ (1.5), Polyhedron/numberinput1.cc (1.28), Polyhedron/onepoint.cc
+ (1.9), Polyhedron/polydifference1.cc (1.8),
+ Polyhedron/polydifference2.cc (1.8), Polyhedron/polyhull1.cc
+ (1.8), Polyhedron/polyhull2.cc (1.9), Polyhedron/polypowerset1.cc
+ (1.20), Polyhedron/relations1.cc (1.8), Polyhedron/relations2.cc
+ (1.9), Polyhedron/relations3.cc (1.8),
+ Polyhedron/removespacedims1.cc (1.8),
+ Polyhedron/removespacedims2.cc (1.8), Polyhedron/timeelapse1.cc
+ (1.8), Polyhedron/timeelapse2.cc (1.9), Polyhedron/topclosed1.cc
+ (1.9), Polyhedron/topclosure1.cc (1.8), Polyhedron/universe1.cc
+ (1.8), Polyhedron/universe2.cc (1.8), Polyhedron/writeconsys1.cc
+ (1.8), Polyhedron/writegensys1.cc (1.8),
+ Polyhedron/writepolyhedron1.cc (1.8),
+ Polyhedron/writepolyhedron2.cc (1.8),
+ Polyhedron/writerelation1.cc (1.10): Obsolete macro DO_TEST
+ removed. Macros NEW_TEST* renamed DO_TEST*.
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (altnum.1): file closure1.cc was added
+ on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (altnum.1): file
+ generalizedaffinepreimage1.cc was added on branch altnum on
+ 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/writebdshape1.cc (altnum.1): file writebdshape1.cc
+ was added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 08:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/topclosed1.cc (1.6): Renovation of topclosed1.cc done.
+
+2006-03-05 Sunday 23:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.87): Adapted removespacedims*.cc,
+ timeelapse*.cc, topclosed*.cc, topclosure*.cc, universe*.cc,
+ writegensys*.cc and writepolyhedron*.cc to new standards.
+
+2006-03-05 Sunday 23:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: writeconsys1.cc (1.7), writerelation1.cc
+ (1.9): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: topclosure1.cc (1.7), topclosure2.cc (1.8),
+ topclosure3.cc (1.7), topclosure4.cc (1.9), universe1.cc (1.7),
+ universe2.cc (1.7), universe3.cc (1.7), universe4.cc (1.7),
+ universe5.cc (1.7), universe6.cc (1.7), universe7.cc (1.7),
+ writepolyhedron1.cc (1.7), writepolyhedron2.cc (1.7),
+ writepolyhedron3.cc (1.8), writegensys1.cc (1.7), writegensys2.cc
+ (1.8), writegensys3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: removespacedims1.cc (1.7),
+ removespacedims10.cc (1.8), removespacedims2.cc (1.7),
+ removespacedims3.cc (1.8), removespacedims4.cc (1.7),
+ removespacedims5.cc (1.8), removespacedims6.cc (1.7),
+ removespacedims7.cc (1.7), removespacedims8.cc (1.7),
+ removespacedims9.cc (1.7), timeelapse1.cc (1.7), timeelapse2.cc
+ (1.8), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+ (1.8), timeelapse6.cc (1.7), timeelapse7.cc (1.8), timeelapse8.cc
+ (1.8), timeelapse9.cc (1.8), topclosed1.cc (1.8), topclosed2.cc
+ (1.8), topclosed3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 22:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.186): Added item to "Enhancements for PPL 0.10" - Add a
+ widening for grids using only generator representations.
+
+2006-03-05 Sunday 22:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (1.4): Changed name of variable "num_rows"
+ to more descriptive name. Added and improved comments wrt this
+ variable.
+
+2006-03-05 Sunday 22:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: print.hh (1.34), Grid/bhz03widening1.cc (1.7),
+ Grid/certificate1.cc (1.9): Removed redundant code from
+ Grid/certificate1.cc Added print_congruences for powersets in
+ print.hh and use it in Grid/bhz03widening1.cc
+
+2006-03-05 Sunday 21:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.24), boundingbox1.cc (1.7),
+ coveringbox2.cc (1.7), grid1.cc (1.11), limitedextrapolation1.cc
+ (1.6), mapspacedims1.cc (1.7), maxmin1.cc (1.5), membytes1.cc
+ (1.4), membytes2.cc (1.4), mincongruences1.cc (1.6),
+ mingenerators1.cc (1.6), outputoperator1.cc (1.4), relations1.cc
+ (1.8), relations2.cc (1.7), removespacedims1.cc (1.6),
+ removespacedims2.cc (1.6), timeelapse1.cc (1.6), timeelapse2.cc
+ (1.5), topclosure1.cc (1.5), widening1.cc (1.8),
+ writecongruencesystem.cc (1.4): Basic renovation of grids tests
+ completed.
+
+2006-03-05 Sunday 21:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/intersection1.cc (1.9): Invoke `test01' and
+ `test02' with NEW_TEST_F8A.
+
+2006-03-05 Sunday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.191): Added a brief description of the new Grid class.
+ Added a mention of the new possibility of building only static or
+ only shared libraries. Completed the section on bugfixes.
+ Tentative release date for PPL 0.9 is March 12, 2006.
+
+2006-03-05 Sunday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.185): Removed items that have already done. Pushed all
+ the others down to PPL 0.10.
+
+2006-03-05 Sunday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.36), config.sub (1.34), Watchdog/config.guess
+ (1.20), Watchdog/config.sub (1.19): Updated.
+
+2006-03-05 Sunday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.229), demos/ppl_lpsol/Makefile.am (1.23):
+ Automake conditional CYGWIN renamed HOST_OS_CYGWIN. New Automake
+ conditional HOST_OS_DARWIN. Refrain from literal comparison of
+ ppl_lpsol output also on Darwin.
+
+2006-03-05 Sunday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage2.cc (1.4): Use NEW_TEST_F16A to invoke
+ `test10'.
+
+2006-03-05 Sunday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.44): New macro NEW_TEST_F16A.
+
+2006-03-05 Sunday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/intersection1.cc (1.8): Tests `test01' and
+ `test02' succeed also with 8-bit coefficients.
+
+2006-03-05 Sunday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/mc91.cc (1.11): Actually, 16-bit coefficients
+ are enough for `test01'.
+
+2006-03-05 Sunday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.71), devref.doxyconf-latex.in
+ (1.11): Source file float.types.hh does not exist anymore.
+
+2006-03-05 Sunday 13:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.22): Do not use `diff' to check
+ the results under Cygwin.
+
+2006-03-05 Sunday 12:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.228): New AM_CONDITIONAL CYGWIN. Version number
+ bumped.
+
+2006-03-05 Sunday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/Makefile.am (1.19): Copy and paste mistake fixed.
+
+2006-03-05 Sunday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/mc91.cc (1.10): Test `test01' requires at least
+ 32-bit coefficients to succeed.
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (1.3): Support 64-bit long
+ doubles. Fixed several copy and paste mistakes.
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (altnum.1): file
+ ac_cxx_long_double_binary_format.m4 was added on branch altnum on
+ 2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_long_double_binary_format.m4 (simplex.1): file
+ ac_cxx_long_double_binary_format.m4 was added on branch simplex
+ on 2006-05-08 17:15:48 +0000
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_binary_format.m4 (1.3): Fixed a couple of
+ comments.
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_binary_format.m4 (altnum.1): file
+ ac_cxx_double_binary_format.m4 was added on branch altnum on
+ 2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_double_binary_format.m4 (simplex.1): file
+ ac_cxx_double_binary_format.m4 was added on branch simplex on
+ 2006-05-08 17:15:48 +0000
+
+2006-03-05 Sunday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.41), run_tests (1.17): Do not
+ test with unsupported floating point types.
+
+2006-03-05 Sunday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (altnum.1): file run_tests was added on
+ branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-04 Saturday 23:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.19): Adapted to the new
+ standards.
+
+2006-03-04 Saturday 23:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.86), relations1.cc (1.7),
+ relations10.cc (1.7), relations11.cc (1.7), relations12.cc (1.7),
+ relations13.cc (1.7), relations14.cc (1.7), relations15.cc (1.7),
+ relations16.cc (1.7), relations17.cc (1.9), relations18.cc (1.7),
+ relations19.cc (1.9), relations2.cc (1.8), relations3.cc (1.7),
+ relations4.cc (1.7), relations5.cc (1.7), relations6.cc (1.8),
+ relations7.cc (1.7), relations8.cc (1.7), relations9.cc (1.8):
+ Adapted relations*.cc to the new standards for tests.
+
+2006-03-04 Saturday 22:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/Makefile.am (1.18), m4/ac_cxx_double_binary_format.m4 (1.2),
+ m4/ac_cxx_float_binary_format.m4 (1.2),
+ m4/ac_cxx_long_double_binary_format.m4 (1.2),
+ src/Checked_Number.defs.hh (1.75), src/Checked_Number.inlines.hh
+ (1.64), src/Float.defs.hh (1.21), src/checked_float.inlines.hh
+ (1.65), src/checked_numeric_limits.hh (1.15): More improvements
+ concerning the detection of supported floating point numbers.
+
+2006-03-04 Saturday 22:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float_binary_format.m4 (altnum.1): file
+ ac_cxx_float_binary_format.m4 was added on branch altnum on
+ 2006-10-29 19:27:11 +0000
+
+2006-03-04 Saturday 22:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float_binary_format.m4 (simplex.1): file
+ ac_cxx_float_binary_format.m4 was added on branch simplex on
+ 2006-05-08 17:15:48 +0000
+
+2006-03-04 Saturday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.227), m4/ac_cxx_double_binary_format.m4 (1.1),
+ m4/ac_cxx_double_is_iec_559.m4 (1.6),
+ m4/ac_cxx_float128_binary_format.m4 (1.6),
+ m4/ac_cxx_float32_binary_format.m4 (1.4),
+ m4/ac_cxx_float64_binary_format.m4 (1.5),
+ m4/ac_cxx_float96_binary_format.m4 (1.5),
+ m4/ac_cxx_float_binary_format.m4 (1.1),
+ m4/ac_cxx_float_is_iec_559.m4 (1.6), m4/ac_cxx_long_double.m4
+ (1.7), m4/ac_cxx_long_double_binary_format.m4 (1.1),
+ m4/ac_cxx_long_double_is_iec_559.m4 (1.6), m4/ac_cxx_long_long.m4
+ (1.6), src/Float.defs.hh (1.20), src/Makefile.am (1.150),
+ src/checked_int.inlines.hh (1.51), src/float.types.hh (1.17):
+ Simplified the logic behind the detection of the relevant
+ properties of the available floating point numbers. Several
+ unused Autoconf functions have been removed.
+
+2006-03-04 Saturday 20:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.43), print.hh (1.33): Added template
+ <typename PH> void print_constraints(const
+ Polyhedra_Powerset<PH>&, const std::string, std::ostream& s).
+
+2006-03-04 Saturday 20:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: polyhull10.cc (1.7), polyhull11.cc (1.7),
+ polyhull3.cc (1.8), polyhull4.cc (1.7), polyhull5.cc (1.8),
+ polyhull6.cc (1.7), polyhull7.cc (1.7), polyhull8.cc (1.9),
+ polyhull9.cc (1.9): No longer needed.
+
+2006-03-04 Saturday 20:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.85), polyhull1.cc (1.7),
+ polyhull2.cc (1.8): Adapted polyhull*.cc to the new standards for
+ tests.
+
+2006-03-04 Saturday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.84): Corrected (was still
+ including referecnes to deleted polydifference*.cc tests).
+
+2006-03-04 Saturday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/append1.cc (1.8): Indentation fixed.
+
+2006-03-04 Saturday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/mc91.cc (1.9): Rewritten.
+
+2006-03-04 Saturday 14:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.83): Adapted mingenerators*.cc,
+ polydifference*.cc and onepoint.cc to new standards for tests.
+
+2006-03-04 Saturday 14:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.27): Started adapting this
+ test to the new standards for tests.
+
+2006-03-04 Saturday 14:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/mc91.cc (1.8): Adapted to new standards for
+ tests. Also added a FIXME as it currently tests nothing.
+
+2006-03-04 Saturday 13:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: mingenerators1.cc (1.7), mingenerators2.cc
+ (1.8), mingenerators3.cc (1.7), polydifference1.cc (1.7),
+ polydifference2.cc (1.7), polydifference3.cc (1.7),
+ polydifference4.cc (1.8), polydifference5.cc (1.7),
+ polydifference6.cc (1.7), polydifference7.cc (1.9),
+ polydifference8.cc (1.7), polydifference9.cc (1.8), onepoint.cc
+ (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.68): Dependencies fixed.
+
+2006-03-03 Friday 17:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.82): Adapted lpproblem*.cc,
+ mapspacedims*.cc, max_min*.cc and minconstraints*.cc to new
+ standards.
+
+2006-03-03 Friday 17:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: minconstraints1.cc (1.7), minconstraints2.cc
+ (1.8), minconstraints3.cc (1.7), minconstraints4.cc (1.7),
+ lpproblem1.cc (1.6), lpproblem2.cc (1.5), lpproblem3.cc (1.3),
+ max_min1.cc (1.8), max_min2.cc (1.8), mapspacedims1.cc (1.10),
+ mapspacedims2.cc (1.8), mapspacedims3.cc (1.8), mapspacedims4.cc
+ (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.81): Adapted ascii_dump_laod* to
+ new standards for tests.
+
+2006-03-03 Friday 09:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/foldspacedims1.cc (1.11): Test test06() will
+ only fail when using C_Polyhedron and 8 bit coefficients.
+
+2006-03-03 Friday 09:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: linearsystem1.cc (1.4), linexpression1.cc
+ (1.7): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: ascii_dump_load1.cc (1.7), ascii_dump_load2.cc
+ (1.7), ascii_dump_load3.cc (1.8), ascii_dump_load4.cc (1.8),
+ ascii_dump_load5.cc (1.8), ascii_dump_load6.cc (1.9),
+ ascii_dump_load7.cc (1.7): Adapted ascii_dump_load*.cc to new
+ standards for tests.
+
+2006-03-03 Friday 08:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.80), linearpartition1.cc (1.7),
+ linearpartition2.cc (1.7), linearpartition3.cc (1.7),
+ linearpartition4.cc (1.8): Adapted linearpartition*.cc and
+ limitedh79extrapolation*.cc to new standards for tests.
+
+2006-03-03 Friday 08:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: limitedh79extrapolation1.cc (1.7),
+ limitedh79extrapolation2.cc (1.7), limitedh79extrapolation3.cc
+ (1.7), limitedh79extrapolation4.cc (1.9): Adapted to new
+ standards for tests.
+
+2006-03-02 Thursday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.226): The only purpose of the `debug_flag'
+ variable is to hold "-DNDEBUG=1" when assertions are enabled.
+
+2006-03-02 Thursday 21:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/foldspacedims2.cc (1.11): With 8-bit
+ coefficients and assertions enabled test04 must fail.
+
+2006-03-02 Thursday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Polyhedron/Makefile.am (1.79), BD_Shape/Makefile.am
+ (1.40), Grid/Makefile.am (1.23): Added @debug_flag@ to
+ AM_CPPFLAGS.
+
+2006-03-02 Thursday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.78): Removing tests from XFAILS
+ if they have already been adapted to the new standards for
+ handling failures.
+
+2006-03-02 Thursday 11:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: foldspacedims1.cc (1.10), foldspacedims2.cc
+ (1.10): Mark tests that should fail with 8 bit coefficients.
+
+2006-03-02 Thursday 08:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/join3.cc (1.7): Tests in join3.cc now included in
+ join2.cc
+
+2006-03-02 Thursday 08:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.22), join1.cc (1.9), join1_16.cc
+ (1.4), join2.cc (1.5): Revised tests using new guidelines
+
+2006-03-02 Thursday 07:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/intersection2.cc (1.6): Tests now in intersection1.cc
+
+2006-03-02 Thursday 07:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.21), generalizedaffineimage1.cc
+ (1.7), generalizedaffineimage2.cc (1.7),
+ generalizedaffinepreimage1.cc (1.8),
+ generalizedaffinepreimage2.cc (1.8), generator1.cc (1.5),
+ generators1.cc (1.7), grid1.cc (1.10), grid1_16.cc (1.7),
+ grid1_64.cc (1.5), grid1_gmp.cc (1.5), grid2.cc (1.8),
+ grid2_16.cc (1.5), grid3.cc (1.7), griddifference1.cc (1.7),
+ intersection1.cc (1.6), intersection2.cc (1.5), isempty1.cc
+ (1.4), isuniverse1.cc (1.7): Revised tests for new guidelines.
+
+2006-03-01 Wednesday 22:05 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.33): Added a float-based version of
+ the steepest-edge technique (disabled by default).
+
+2006-03-01 Wednesday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: bgp99extrapolation1.cc (1.6), bhmz05widening1.cc
+ (1.7), bhz03widening1.cc (1.6), cc76extrapolation1.cc (1.11),
+ geomcovers1.cc (1.6), minconstraints1.cc (1.6), relations1.cc
+ (1.14), relations2.cc (1.15): Standardize the use of using
+ declarations: only local ones, without unnecessary
+ Parma_Polyhedra_Library:: qualifications, and with a scope
+ reduced as much as possible.
+
+2006-03-01 Wednesday 19:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/geomcovers1.cc (1.10): Do not require recent
+ versions of GCC just for printing something in test programs: use
+ `using namespace IO_Operators;' instead of more refined things.
+
+2006-03-01 Wednesday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.77): No longer needed XFAILs
+ removed.
+
+2006-03-01 Wednesday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.10): Temporarily disable this test
+ on Alpha machines.
+
+2006-03-01 Wednesday 16:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.76), intersection1.cc (1.7),
+ intersection10.cc (1.9), intersection11.cc (1.9),
+ intersection2.cc (1.7), intersection3.cc (1.7), intersection4.cc
+ (1.8), intersection5.cc (1.8), intersection6.cc (1.8),
+ intersection7.cc (1.7), intersection8.cc (1.8), intersection9.cc
+ (1.8): Adapted intersection*.cc to new standards for tests.
+
+2006-03-01 Wednesday 15:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.75), h79widening1.cc (1.7),
+ h79widening2.cc (1.7), h79widening3.cc (1.7), h79widening4.cc
+ (1.7), h79widening5.cc (1.8), h79widening6.cc (1.7),
+ h79widening7.cc (1.7), h79widening8.cc (1.7): Adapted
+ h79widening*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/geomcovers1.cc (1.9): Adapted to the new
+ standards for tests.
+
+2006-03-01 Wednesday 14:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.74), generators1.cc (1.8),
+ generators2.cc (1.8), generators3.cc (1.8), generators4.cc (1.8),
+ generators5.cc (1.7), generators6.cc (1.9), generators7.cc (1.7):
+ Adapted generators*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.73),
+ generalizedaffinepreimage1.cc (1.5),
+ generalizedaffinepreimage2.cc (1.5),
+ generalizedaffinepreimage3.cc (1.5),
+ generalizedaffinepreimage4.cc (1.5): Adapted
+ generalizedaffinepreimage*.cc to the new standards for tests.
+
+2006-03-01 Wednesday 13:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize2.cc (1.4): Fails with all bounded
+ integers.
+
+2006-03-01 Wednesday 12:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.72), generalizedaffineimage1.cc
+ (1.8), generalizedaffineimage10.cc (1.8),
+ generalizedaffineimage11.cc (1.9), generalizedaffineimage12.cc
+ (1.7), generalizedaffineimage13.cc (1.6),
+ generalizedaffineimage14.cc (1.6), generalizedaffineimage2.cc
+ (1.8), generalizedaffineimage3.cc (1.8),
+ generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+ (1.7), generalizedaffineimage6.cc (1.8),
+ generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+ (1.7), generalizedaffineimage9.cc (1.8): Adapted
+ generalizedaffineimage*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: foldspacedims1.cc (1.9), foldspacedims2.cc
+ (1.9): Adapted foldspacedims*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: expandspacedim1.cc (1.9), expandspacedim2.cc
+ (1.9): Adapted expandspacedim*.cc to new standards for tests.
+
+2006-03-01 Wednesday 11:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/equals1.cc (1.7): Adapted to new standards for
+ tests.
+
+2006-03-01 Wednesday 11:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/empty1.cc (1.8): Adapted empty*.cc to new
+ standards for tests.
+
+2006-03-01 Wednesday 11:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: boundedbhrz03extrapolation1.cc (1.6),
+ boundedh79extrapolation1.cc (1.8): Modified to work correclty
+ with failing coefficient configurations.
+
+2006-03-01 Wednesday 11:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.71), disjoint1.cc (1.7),
+ disjoint2.cc (1.9), disjoint3.cc (1.9): Adapted disjoint*.cc to
+ new standards for tests.
+
+2006-03-01 Wednesday 11:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.70), contains1.cc (1.7),
+ contains2.cc (1.7), contains3.cc (1.7), contains4.cc (1.7),
+ contains5.cc (1.8): Adapted contsains*.cc to new standards for
+ tests.
+
+2006-03-01 Wednesday 10:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.69), boundedaffineimage1.cc
+ (1.6), boundedaffineimage2.cc (1.5), boundedaffineimage3.cc
+ (1.5), boundedaffinepreimage1.cc (1.5), boundedaffinepreimage2.cc
+ (1.5), boundedaffinepreimage3.cc (1.5): Adapted
+ boundedaffine[pre]image*.cc to new standards for tests.
+
+2006-03-01 Wednesday 09:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.68), bhz03widening1.cc (1.9),
+ bhz03widening2.cc (1.9), bhz03widening3.cc (1.9),
+ bhz03widening4.cc (1.8), bhz03widening5.cc (1.8),
+ bhz03widening6.cc (1.10): Adapted bhz03widening*.cc to new
+ standards for tests files.
+
+2006-03-01 Wednesday 09:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/bgp99extrapolation1.cc (1.9): Correctly handling
+ with failing coefficient configurations.
+
+2006-03-01 Wednesday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.67), constraints1.cc (1.7),
+ constraints2.cc (1.8), constraints3.cc (1.7), constraints4.cc
+ (1.9), constraints5.cc (1.6): Translated constraints*.cc
+ according to new standards for tests.
+
+2006-03-01 Wednesday 09:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.66): Adapted for changes to
+ bounds*.cc.
+
+2006-03-01 Wednesday 09:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: bounds1.cc (1.8), bounds2.cc (1.7),
+ congruences1.cc (1.5): Adapted to new standards for tests.
+
+2006-03-01 Wednesday 09:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize1.cc (1.2): Using new macros for
+ handling with failing coefficent configurations.
+
+2006-03-01 Wednesday 09:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: CbecomesNNC1.cc (1.7), Makefile.am (1.65),
+ NNCbecomesC1.cc (1.8), cnncconversion1.cc (1.1): Tests
+ CbecomesNNC1 and NNCbecomesC1 translated according to new
+ standards.
+
+2006-03-01 Wednesday 09:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: boundingbox1.cc (1.11), boundingbox2.cc
+ (1.10), boundingbox3.cc (1.11): Removed useless parentheses in
+ return statement. Moved test descriptions in front of the tests.
+
+2006-03-01 Wednesday 09:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.42): Corrected macro NEW_TEST_F* to
+ correctly deal with failing tests.
+
+2006-02-28 Tuesday 23:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/equals1.cc (1.7): Test added to improve coverage.
+
+2006-02-28 Tuesday 12:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/addcongruences1.cc (1.7): Use
+ print_congruences() instead of print_constraints() when printing
+ a ystem of congruences.
+
+2006-02-28 Tuesday 10:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.20), affineimage1_16.cc (1.6): Test
+ in affineimage1_16.cc is now included in affineimage2.cc
+
+2006-02-28 Tuesday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/affineimage2.cc (1.3): Activated test10.
+
+2006-02-28 Tuesday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.41): NEW_TEST* macros fixed and completed.
+
+2006-02-28 Tuesday 09:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.templates.hh (1.3): Use more efficient iteration in
+ a couple of cases.
+
+2006-02-28 Tuesday 09:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.inlines.hh (1.17): Added more comments to explain the
+ order of construction/destruction.
+
+2006-02-28 Tuesday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: print.cc (1.25), print.hh (1.32): Two FIXMEs dealt with.
+
+2006-02-28 Tuesday 08:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: contains2.cc (1.5), discrete1.cc (1.2), disjoint1.cc
+ (1.6), equals1.cc (1.6), expandspacedim1.cc (1.6),
+ foldspacedims1.cc (1.6): Tests in contains2.cc already in
+ contains1.cc. Modified tests following new guidelines.
+
+2006-02-28 Tuesday 08:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: addcongruence1.cc (1.7), addcongruences1.cc (1.9),
+ addconstraint1.cc (1.7), addconstraints1.cc (1.7),
+ addgenerator1.cc (1.9), addgenerators1.cc (1.5), addspacedims1.cc
+ (1.8), affinedim1.cc (1.7), affineimage1.cc (1.9),
+ affineimage1_16.cc (1.5), affineimage2.cc (1.2),
+ affinepreimage1.cc (1.7), affinepreimage2.cc (1.2),
+ asciidumpload1.cc (1.5), bhz03widening1.cc (1.6), bounded1.cc
+ (1.8), boundingbox1.cc (1.6), boundingbox2.cc (1.6), bounds1.cc
+ (1.9), certificate1.cc (1.8), concatenate1.cc (1.8),
+ congruence1.cc (1.8), congruences1.cc (1.6), congruencesystem1.cc
+ (1.6), contains1.cc (1.7), coveringbox1.cc (1.6), coveringbox2.cc
+ (1.6): Blank line before test comment removed. A few missing
+ comments for tests added.
+
+2006-02-28 Tuesday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.184), src/Polyhedron_nonpublic.cc (1.65): TODO item
+ partly done: added some missing assert(OK()).
+
+2006-02-27 Monday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.46): Upon `make clean', erase also the
+ temporary directories (they will be there if the build did not
+ complete successfully).
+
+2006-02-27 Monday 18:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.45): Use two distinct rules for the user and
+ developer HTML documentation.
+
+2006-02-27 Monday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.70), user.doxyconf-html.in
+ (1.37): Set HTML_OUTPUT the right way.
+
+2006-02-27 Monday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.44): Allow parallel building of the user and
+ developer HTML documentation.
+
+2006-02-27 Monday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.40), Polyhedron/bhrz03widening3.cc (1.8),
+ Polyhedron/boundingbox3.cc (1.10): New macros NEW_TEST_F,
+ NEW_TEST_F64, NEW_TEST_F32, NEW_TEST_F16, NEW_TEST_F8 and
+ NEW_TEST_F8A to be used for tests that are known to fail always,
+ with bounded coefficients with number of bits less than or equal
+ to the indicated number, or with 8-bit coefficient and with
+ assertions enabled, respectively.
+
+2006-02-27 Monday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.225): Improved the selection of the type of
+ coefficients. New C++ macro COEFFICIENT_BITS holds the number of
+ bits of coefficients, 0 if they are unbounded.
+
+2006-02-27 Monday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.54): The GNU-Prolog
+ interface can now be built also with --disable-static and with
+ --disable-shared.
+
+2006-02-27 Monday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.44): The YAP-Prolog
+ interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.53): The Ciao-Prolog
+ interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.67): Work also if the
+ PPL was configure with --disable-shared. Moreover, unless the
+ PPL was configured with --disable-static, `ppl_sicstus' uses only
+ static modules.
+
+2006-02-27 Monday 13:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/affineimage2.cc (1.8): Helper function renamed
+ according to new standard.
+
+2006-02-27 Monday 13:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.64), concatenate1.cc (1.7),
+ concatenate2.cc (1.8), concatenate3.cc (1.7), concatenate4.cc
+ (1.7), concatenate5.cc (1.7), concatenate6.cc (1.9),
+ concatenate7.cc (1.6): Transformed according to new standards for
+ tests.
+
+2006-02-27 Monday 13:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/bounded1.cc (1.8): Tranformed according to new
+ standards for tests.
+
+2006-02-27 Monday 13:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.63), bhrz03widening1.cc (1.7),
+ bhrz03widening10.cc (1.8), bhrz03widening11.cc (1.7),
+ bhrz03widening12.cc (1.8), bhrz03widening13.cc (1.7),
+ bhrz03widening14.cc (1.7), bhrz03widening15.cc (1.8),
+ bhrz03widening16.cc (1.7), bhrz03widening17.cc (1.7),
+ bhrz03widening18.cc (1.7), bhrz03widening19.cc (1.7),
+ bhrz03widening2.cc (1.7), bhrz03widening3.cc (1.7),
+ bhrz03widening4.cc (1.7), bhrz03widening5.cc (1.7),
+ bhrz03widening6.cc (1.7), bhrz03widening7.cc (1.7),
+ bhrz03widening8.cc (1.7), bhrz03widening9.cc (1.7): Transformed
+ according to new standards for tests.
+
+2006-02-27 Monday 13:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: affinetrans.cc (1.8), Makefile.am (1.62),
+ bgp99extrapolation1.cc (1.8), bgp99extrapolation2.cc (1.8):
+ Transformed according to new standards for tests.
+
+2006-02-27 Monday 13:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.60), affineimage1.cc (1.8),
+ affineimage2.cc (1.7), affineimage3.cc (1.7), affineimage4.cc
+ (1.8), affineimage5.cc (1.9), affineimage6.cc (1.9),
+ affineimage7.cc (1.7), affineimage8.cc (1.8), affineimage9.cc
+ (1.7), Makefile.am (1.61), affinepreimage1.cc (1.7),
+ affinepreimage10.cc (1.8), affinepreimage11.cc (1.5),
+ affinepreimage12.cc (1.3), affinepreimage2.cc (1.7),
+ affinepreimage3.cc (1.8), affinepreimage4.cc (1.7),
+ affinepreimage5.cc (1.7), affinepreimage6.cc (1.7),
+ affinepreimage7.cc (1.7), affinepreimage8.cc (1.8),
+ affinepreimage9.cc (1.8): Transformed according to new standards
+ for tests.
+
+2006-02-27 Monday 12:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.59), addspacedims1.cc (1.8),
+ addspacedims10.cc (1.7), addspacedims11.cc (1.7),
+ addspacedims12.cc (1.7), addspacedims13.cc (1.8),
+ addspacedims2.cc (1.8), addspacedims3.cc (1.9), addspacedims4.cc
+ (1.7), addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+ addspacedims7.cc (1.7), addspacedims8.cc (1.8), addspacedims9.cc
+ (1.7): Transformed according to new standards for tests.
+
+2006-02-27 Monday 12:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.58), addgenerator1.cc (1.8),
+ addgenerator2.cc (1.8), addgenerator3.cc (1.8), addgenerator4.cc
+ (1.8), addgenerator5.cc (1.8), addgenerators1.cc (1.8),
+ addgenerators10.cc (1.8), addgenerators11.cc (1.8),
+ addgenerators12.cc (1.9), addgenerators13.cc (1.8),
+ addgenerators2.cc (1.8), addgenerators3.cc (1.7),
+ addgenerators4.cc (1.7), addgenerators5.cc (1.7),
+ addgenerators6.cc (1.8), addgenerators7.cc (1.7),
+ addgenerators8.cc (1.8), addgenerators9.cc (1.7): Transformed
+ according to new standards for tests.
+
+2006-02-27 Monday 12:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.57), addconstraint1.cc (1.7),
+ addconstraint2.cc (1.8), addconstraint3.cc (1.8),
+ addconstraints1.cc (1.8), addconstraints10.cc (1.8),
+ addconstraints11.cc (1.7), addconstraints12.cc (1.7),
+ addconstraints13.cc (1.9), addconstraints2.cc (1.7),
+ addconstraints3.cc (1.8), addconstraints4.cc (1.7),
+ addconstraints5.cc (1.8), addconstraints6.cc (1.8),
+ addconstraints7.cc (1.8), addconstraints8.cc (1.8),
+ addconstraints9.cc (1.7): Transformed according to new standards
+ for tests.
+
+2006-02-27 Monday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.56), addcongruences1.cc (1.6),
+ addcongruences2.cc (1.5), addcongruences3.cc (1.5),
+ addcongruences4.cc (1.5), addcongruences5.cc (1.5): Transformed
+ according to new standards for tests.
+
+2006-02-27 Monday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.55): Dealing with addcongruence.
+
+2006-02-27 Monday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: addcongruence1.cc (1.5), addcongruence2.cc
+ (1.5), addcongruence3.cc (1.5), addcongruence4.cc (1.5),
+ addcongruence5.cc (1.5): Transformed according to new standard
+ for tests.
+
+2006-02-27 Monday 12:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.54): Added nncminimize1.cc and
+ removed NNCminimize*.
+
+2006-02-27 Monday 12:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+ NNCminimize3.cc (1.7), NNCminimize4.cc (1.7), NNCminimize5.cc
+ (1.7), NNCminimize6.cc (1.7), nncminimize1.cc (1.1): Transformed
+ according to new standard for tests.
+
+2006-02-27 Monday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.190), src/Saturation_Row.cc (1.10): Fixed a long-standing
+ bug in Saturation_Row::prev().
+
+2006-02-26 Sunday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/bhz03widening1.cc (1.5): Revised test to guidelines.
+
+2006-02-26 Sunday 21:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.defs.hh (1.10): Documentation for ascii_load()
+ bug fixed. Comment made conditional on
+ PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS being defined.
+
+2006-02-26 Sunday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize2.cc (1.3): Make sure vnout is
+ flushed just after the dumps.
+
+2006-02-26 Sunday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/nncminimize2.cc (1.2): Dump the polyhedron
+ multiple times when very noisy.
+
+2006-02-26 Sunday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.53), nncminimize2.cc (1.1): New
+ test for NNC_Polyhedron::ph.minimized_generators().
+
+2006-02-26 Sunday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.66): Dependencies fixed.
+
+2006-02-26 Sunday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (1.19): Fixed the ordering in the
+ definition of LDADD.
+
+2006-02-26 Sunday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.43): Portability improvement: `tar zxf' is
+ non-portable; use `gunzip -c' and pipe the result to `tar xf'
+ instead.
+
+2006-02-26 Sunday 09:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/Makefile.am (1.24), ppl_lpsol/Makefile.am
+ (1.21): Portability improvement: instead of using `grep -q'
+ (which is non-portable) we redirect the standard output and
+ standard error to `/dev/null'.
+
+2006-02-26 Sunday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.74), Checked_Number.inlines.hh
+ (1.63), Float.inlines.hh (1.27), Grid_Certificate.cc (1.4),
+ Grid_Generator.defs.hh (1.9), Grid_Generator_System.cc (1.4),
+ Grid_Generator_System.inlines.hh (1.4), Grid_conversion.cc (1.5),
+ Grid_public.cc (1.12), Scalar_Products.defs.hh (1.6),
+ checked_ext.defs.hh (1.11), checked_ext.inlines.hh (1.30),
+ checked_int.inlines.hh (1.50): Try to avoid long source lines.
+
+2006-02-26 Sunday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.cc (simplex.1): file Grid_Certificate.cc was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-26 Sunday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.26): Do not leave operators ad end of
+ line.
+
+2006-02-26 Sunday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.57), H79_Certificate.inlines.hh (1.8),
+ Polyhedra_Powerset.templates.hh (1.2): Avoid useless parentheses.
+
+2006-02-26 Sunday 07:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.inlines.hh (1.3): Fix misplaced parenthesis.
+
+2006-02-26 Sunday 00:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid.templates.hh (1.3): Fixed a bug in get_covering_box().
+
+2006-02-26 Sunday 00:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: print.cc (1.24), print.hh (1.31), Grid/Makefile.am
+ (1.18), Grid/bounds1.cc (1.8), Grid/certificate1.cc (1.7),
+ Grid/concatenate1.cc (1.7), Grid/congruence1.cc (1.7),
+ Grid/congruences1.cc (1.5), Grid/congruencesystem1.cc (1.5),
+ Grid/congruencesystem2.cc (1.5), Grid/contains1.cc (1.6),
+ Grid/copyconstruct1.cc (1.5), Grid/coveringbox1.cc (1.5),
+ Grid/coveringbox2.cc (1.5): Revised tests following guidelines.
+ Added 2 tests to coveringbox2 for generator systems with
+ parameters.
+
+2006-02-25 Saturday 18:57 Abramo Bagnara
+
+ * src/: Float.inlines.hh (1.25), checked_int.inlines.hh (1.49):
+ Fixed mpz_export use.
+
+2006-02-25 Saturday 17:17 Abramo Bagnara
+
+ * src/: Float.inlines.hh (1.24), checked_float.inlines.hh (1.64),
+ checked_int.inlines.hh (1.48): Fixed mpz_export order argument.
+
+2006-02-25 Saturday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.153): Avoid an ambiguity problem
+ occurring, e.g., on Solaris 2.9.
+
+2006-02-25 Saturday 14:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: boundingbox4.cc (1.9), boundingbox5.cc (1.8):
+ Removed (incorporated in other tests).
+
+2006-02-25 Saturday 14:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.52), boundingbox1.cc (1.10),
+ boundingbox2.cc (1.9), boundingbox3.cc (1.9): Translated the
+ tests boundingbox* into the new style.
+
+2006-02-25 Saturday 14:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (1.11): Wrong inline qualifier removed.
+
+2006-02-25 Saturday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.26): Rename store_nan and
+ store_infinity to handle_nan and handle_infinity.
+
+2006-02-25 Saturday 10:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_Expression.defs.hh (1.22),
+ Linear_Expression.inlines.hh (1.8): Added operators so as to
+ obtain perfect matches and avoid ambiguities.
+
+2006-02-25 Saturday 09:58 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.62): Fixed typo.
+
+2006-02-25 Saturday 09:36 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.73), Checked_Number.inlines.hh
+ (1.61): Added is_non_a_number, is_minus_infinity and
+ is_plus_infinity.
+
+2006-02-25 Saturday 09:28 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.72), checked.defs.hh (1.35),
+ checked_int.inlines.hh (1.47), checked_mpq.inlines.hh (1.34),
+ checked_mpz.inlines.hh (1.38), checked_numeric_limits.hh (1.14):
+ Renamed store_{nan,infinity} to handle_{nan,infinity}
+
+2006-02-23 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_text_md5sum.m4 (altnum.1): file ac_text_md5sum.m4 was added
+ on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-02-23 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_text_md5sum.m4 (simplex.1): file ac_text_md5sum.m4 was
+ added on branch simplex on 2006-05-08 17:15:48 +0000
+
+2006-02-23 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.224), demos/ppl_lcdd/Makefile.am (1.23),
+ m4/ac_text_md5sum.m4 (1.1): New function to set the command for
+ computing the MD5 checksum of text files. Old (not working)
+ kludges to do the same thing have been removed.
+
+2006-02-23 Thursday 07:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: affinedim1.cc (1.6), bounded1.cc (1.7), bounds1.cc
+ (1.7): Never let an operator close a source line. Avoid useless
+ parentheses.
+
+2006-02-22 Wednesday 23:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: asciidumpload1.cc (1.4), bounded1.cc (1.6),
+ boundingbox1.cc (1.5), boundingbox2.cc (1.5), bounds1.cc (1.6):
+ Revised tests following new guidelines.
+
+2006-02-22 Wednesday 20:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.17), affineimage2.cc (1.1),
+ affinepreimage2.cc (1.1): Test files added due to reorganisation
+ of tests.
+
+2006-02-22 Wednesday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (1.16): The test program
+ affinepreimage2.cc does not exist anymore.
+
+2006-02-22 Wednesday 19:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (1.15): The test program affineimage2.cc
+ does not exist anymore.
+
+2006-02-22 Wednesday 12:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.14), addcongruences1.cc (1.8),
+ addconstraint1.cc (1.6), addconstraints1.cc (1.6),
+ addgenerator1.cc (1.8), addgenerators1.cc (1.4), addspacedims1.cc
+ (1.7), addspacedims2.cc (1.7), affinedim1.cc (1.5),
+ affineimage1.cc (1.8), affineimage1_16.cc (1.4),
+ affinepreimage1.cc (1.6), generalizedaffineimage1.cc (1.6),
+ generalizedaffineimage2.cc (1.6), generalizedaffinepreimage1.cc
+ (1.7), generalizedaffinepreimage2.cc (1.7), widening1.cc (1.7):
+ Revised tests following new guidelines.
+
+2006-02-22 Wednesday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.39), run_tests (1.16): Test with
+ valgrind also in the tests/BD_Shape directory.
+
+2006-02-22 Wednesday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/valgrind_suppressions (1.4): Ignore warnings originating
+ from /usr/bin/make.
+
+2006-02-22 Wednesday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/valgrind_suppressions (simplex.1): file
+ valgrind_suppressions was added on branch simplex on 2006-05-08
+ 17:15:53 +0000
+
+2006-02-22 Wednesday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.51): Path fixed.
+
+2006-02-22 Wednesday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.30): Removed wrong std:: qualification.
+
+2006-02-22 Wednesday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: valgrind_suppressions (1.3), Grid/Makefile.am (1.13),
+ Polyhedron/Makefile.am (1.50), Polyhedron/valgrind_suppressions
+ (1.3): Support valgrind testing also in the Grid directory.
+ Share a single copy of valgrind_suppressions.
+
+2006-02-22 Wednesday 07:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.29): Print to nout by default, not to cout.
+
+2006-02-21 Tuesday 21:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.am (1.12): Avoid doing what Automake does by
+ itself.
+
+2006-02-21 Tuesday 19:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.223): On the Alpha, use the appropriate compiler
+ options in order to obtain support for ANSI/IEEE 754-1985
+ floating point numbers.
+
+2006-02-21 Tuesday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.9): Exit immediately with error if
+ the impossible happens.
+
+2006-02-21 Tuesday 16:48 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[32,24]):
+ Documentation improved. Header's `parse_constraints' variables
+ modified to match the ones in LP_Problem.cc.
+
+2006-02-20 Monday 23:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.4): Try harder to be informative in case
+ SIGFPE is raised.
+
+2006-02-20 Monday 23:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh (1.12): Struct fenv_t renamed
+ ia32_fenv_t.
+
+2006-02-20 Monday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_Expression.defs.hh (1.21),
+ Linear_Expression.inlines.hh (1.7): Use vertical spacing to avoid
+ clutter. Do not expose implementation details. Improve
+ const-correctness.
+
+2006-02-20 Monday 14:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (1.5): Remove unwanted comment.
+
+2006-02-20 Monday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.cc (1.3): Be more informative when the signal code
+ is unknown.
+
+2006-02-20 Monday 14:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: print.cc (1.23), print.hh (1.28): Added
+ print_generators() for grids.
+
+2006-02-20 Monday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/addcongruence1.cc (1.6): Use spacing consistently.
+
+2006-02-20 Monday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.253), ehandlers.cc (1.9), ehandlers.hh
+ (1.14), ppl_test.cc (1.2), ppl_test.hh (1.39): Source files
+ ehandlers.* phased out. Drafted a new SIGFPE handler that every
+ test installs to help debugging.
+
+2006-02-20 Monday 13:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc (1.5): Added test that showed a bug
+ in add_congruence_and_minimize(), which is now fixed.
+
+ All tests here revised to be in the new format.
+
+2006-02-20 Monday 13:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Congruence_System.cc (1.4), Grid_public.cc (1.10): Changed
+ add_recycled_congruence_and_minimize() to use recycling_insert()
+ when adding a congruence.
+
+ Corrected insert() in Congruence_System.cc so as to correctly
+ deal with the case that the dimensions of the congruence system
+ to be added are less than that of *this.
+
+2006-02-19 Sunday 22:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.222): Added Automake conditionals to reflect the
+ status of shared and static libraries.
+
+2006-02-19 Sunday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.27), checked.cc (1.17), checked_mpq.inlines.hh
+ (1.33): Finished the implementation of rational square root
+ calculations. The precision parameter is now passed and returned
+ as an unsigned. The
+ set_rational_sqrt_precision_parameter(unsigned p) function throws
+ an exception if `p' is too big.
+
+2006-02-19 Sunday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.26), checked.cc (1.16), checked_mpq.inlines.hh
+ (1.32): New functions void
+ set_rational_sqrt_precision_parameter(const mpz_class& p) and
+ mpz_class rational_sqrt_precision_parameter() to set and obtain
+ the the precision parameter (to be) used for rational sqrt
+ calculations.
+
+2006-02-19 Sunday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.37): Avoid long source lines.
+ Prefer preincrement and predecrement to postincrement and
+ postdecrement.
+
+2006-02-19 Sunday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.36): No longer include <cmath>.
+
+2006-02-19 Sunday 13:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.63): Do not use the fma(), fmaf()
+ and fmal() library functions on Alphas, since we cannot guarantee
+ the library has been compiled with the flags that ensure
+ controlled rounding is working.
+
+2006-02-19 Sunday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.221): On Alpha chips, support for controlled
+ rounding is only available if code is compiled to use dynamic
+ rounding (/d) instructions. With GCC this can be achieved with
+ the `-mfp-rounding-mode=d' compiler options; other compilers are
+ said to require the `-fprm d' option.
+
+2006-02-19 Sunday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.defs.hh (1.11): Use more standard macros to implement the
+ switch on the architecture.
+
+2006-02-18 Saturday 07:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (1.7), src/Makefile.am (1.149): Do not
+ distribute ppl_include_files.hh and pwl_include_files.hh. Now
+ ppl.hh and pwl.hh installation can be completely delegated to
+ Automake.
+
+2006-02-17 Friday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (1.16): Fixed nested #if's.
+
+2006-02-15 Wednesday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: print.cc (1.22), print.hh (1.27): Added
+ print_congruences(const Congruence_System&, const string&,
+ ostream&) and print_congruences(const Grid&, const string&,
+ ostream&).
+
+2006-02-15 Wednesday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim.cc (1.12): Trailing blanks removed.
+
+2006-02-15 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.38), addconstraints1.cc (1.10),
+ affineimage1.cc (1.11), affinepreimage1.cc (1.11),
+ bdsdifference1.cc (1.7), bdshull1.cc (1.7), bhmz05widening1.cc
+ (1.6), cc76extrapolation1.cc (1.10), cc76narrowing1.cc (1.11),
+ contains1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc (1.12),
+ exceptions3.cc (1.13), generalizedaffineimage2.cc (1.12),
+ intersection1.cc (1.10), limitedbhmz05extrapolation1.cc (1.6),
+ limitedcc76extrapolation1.cc (1.6), relations2.cc (1.14),
+ relations3.cc (1.12), removespacedims1.cc (1.11), timeelapse1.cc
+ (1.10): Tests for exceptional cases moved to the appropriate test
+ programs.
+
+2006-02-15 Wednesday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.37), generalizedaffineimage1.cc
+ (1.12), generalizedaffineimage2.cc (1.11),
+ generalizedaffineimage3.cc (1.12): All the tests for
+ BD_Shape::generalized_affine_preimage() are now in
+ generalizedaffineimage1.cc and generalizedaffineimage2.cc.
+
+2006-02-15 Wednesday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/addspacedims2.cc (1.11): This is no longer
+ necessary (all its tests are now in addspacedims1.cc).
+
+2006-02-15 Wednesday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.15): Test also with long doubles.
+
+2006-02-15 Wednesday 12:16 Andrea Cimino
+
+ * TODO (simplex.2): Added one item. Provide a better
+ implementation of computing squares.
+
+2006-02-15 Wednesday 12:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: addconstraints1.cc (1.9), addspacedims1.cc
+ (1.10), addspacedims2.cc (1.10), affinedimension1.cc (1.6),
+ affineimage1.cc (1.10), affineimage2.cc (1.10),
+ affinepreimage1.cc (1.10), affinepreimage2.cc (1.10),
+ ascii_dump_load1.cc (1.11), bdsdifference1.cc (1.6), bdshull1.cc
+ (1.6), bgp99extrapolation1.cc (1.5), bhmz05widening1.cc (1.5),
+ bhz03widening1.cc (1.5), cc76extrapolation1.cc (1.9),
+ cc76narrowing1.cc (1.10), closure1.cc (1.13), concatenate1.cc
+ (1.10), constraints1.cc (1.13), contains1.cc (1.8), empty1.cc
+ (1.8), equality1.cc (1.13), exceptions1.cc (1.12), exceptions2.cc
+ (1.11), exceptions3.cc (1.12), fromgensys1.cc (1.10),
+ generalizedaffineimage1.cc (1.11), generalizedaffineimage2.cc
+ (1.10), generalizedaffineimage3.cc (1.11),
+ generalizedaffinepreimage1.cc (1.11),
+ generalizedaffinepreimage2.cc (1.8), geomcovers1.cc (1.5),
+ h79widening1.cc (1.9), intersection1.cc (1.9),
+ limitedbhmz05extrapolation1.cc (1.5),
+ limitedcc76extrapolation1.cc (1.5), limitedh79extrapolation1.cc
+ (1.9), mapspacedims1.cc (1.10), maxspacedim.cc (1.11),
+ minconstraints1.cc (1.5), relations1.cc (1.13), relations2.cc
+ (1.13), removespacedims1.cc (1.10), timeelapse1.cc (1.9),
+ universe1.cc (1.10), writebdshape1.cc (1.6): All test functions
+ have now a name matching `test[012][1234567890]'.
+
+2006-02-15 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.252), Partial_Function.cc (1.2),
+ Partial_Function.defs.hh (1.2), ppl_test.cc (1.1), ppl_test.hh
+ (1.38), print.cc (1.21), BD_Shape/Makefile.am (1.36),
+ BD_Shape/addconstraints1.cc (1.8), BD_Shape/addspacedims1.cc
+ (1.9), BD_Shape/addspacedims2.cc (1.9), BD_Shape/addspacedims3.cc
+ (1.9), BD_Shape/addspacedims4.cc (1.9), BD_Shape/addspacedims5.cc
+ (1.12), BD_Shape/addspacedims6.cc (1.12),
+ BD_Shape/addspacedims7.cc (1.8), BD_Shape/affinedimension1.cc
+ (1.5), BD_Shape/affineimage1.cc (1.9), BD_Shape/affineimage10.cc
+ (1.8), BD_Shape/affineimage2.cc (1.9), BD_Shape/affineimage3.cc
+ (1.9), BD_Shape/affineimage4.cc (1.9), BD_Shape/affineimage5.cc
+ (1.9), BD_Shape/affineimage6.cc (1.9), BD_Shape/affineimage7.cc
+ (1.9), BD_Shape/affineimage8.cc (1.15), BD_Shape/affineimage9.cc
+ (1.13), BD_Shape/affinepreimage1.cc (1.9),
+ BD_Shape/affinepreimage2.cc (1.9), BD_Shape/affinepreimage3.cc
+ (1.9), BD_Shape/affinepreimage4.cc (1.9),
+ BD_Shape/affinepreimage5.cc (1.10), BD_Shape/ascii_dump_load1.cc
+ (1.10), BD_Shape/ascii_dump_load2.cc (1.10),
+ BD_Shape/bdsdifference1.cc (1.5), BD_Shape/bdsdifference2.cc
+ (1.5), BD_Shape/bdsdifference3.cc (1.5),
+ BD_Shape/bdsdifference4.cc (1.5), BD_Shape/bdsdifference5.cc
+ (1.5), BD_Shape/bdsdifference6.cc (1.5),
+ BD_Shape/bdsdifference7.cc (1.5), BD_Shape/bdshull1.cc (1.5),
+ BD_Shape/bdshull2.cc (1.5), BD_Shape/bdshull3.cc (1.5),
+ BD_Shape/bdshull4.cc (1.5), BD_Shape/bgp99extrapolation1.cc
+ (1.4), BD_Shape/bhmz05widening1.cc (1.4),
+ BD_Shape/bhmz05widening2.cc (1.4), BD_Shape/bhmz05widening3.cc
+ (1.4), BD_Shape/bhmz05widening4.cc (1.4),
+ BD_Shape/bhmz05widening5.cc (1.4), BD_Shape/bhmz05widening6.cc
+ (1.4), BD_Shape/bhmz05widening7.cc (1.4),
+ BD_Shape/bhmz05widening8.cc (1.4), BD_Shape/bhz03widening1.cc
+ (1.4), BD_Shape/cc76extrapolation1.cc (1.8),
+ BD_Shape/cc76extrapolation2.cc (1.9),
+ BD_Shape/cc76extrapolation3.cc (1.8),
+ BD_Shape/cc76extrapolation4.cc (1.11),
+ BD_Shape/cc76extrapolation5.cc (1.8),
+ BD_Shape/cc76extrapolation6.cc (1.9), BD_Shape/cc76narrowing1.cc
+ (1.9), BD_Shape/cc76narrowing2.cc (1.9),
+ BD_Shape/cc76narrowing3.cc (1.9), BD_Shape/cc76narrowing4.cc
+ (1.10), BD_Shape/cc76narrowing5.cc (1.10), BD_Shape/closure1.cc
+ (1.12), BD_Shape/concatenate1.cc (1.9), BD_Shape/concatenate2.cc
+ (1.9), BD_Shape/concatenate3.cc (1.8), BD_Shape/concatenate4.cc
+ (1.8), BD_Shape/concatenate5.cc (1.9), BD_Shape/constraints1.cc
+ (1.12), BD_Shape/constraints2.cc (1.9), BD_Shape/contains1.cc
+ (1.7), BD_Shape/contains2.cc (1.9), BD_Shape/contains3.cc (1.9),
+ BD_Shape/empty1.cc (1.7), BD_Shape/empty2.cc (1.7),
+ BD_Shape/empty3.cc (1.8), BD_Shape/empty4.cc (1.7),
+ BD_Shape/empty5.cc (1.7), BD_Shape/equality1.cc (1.12),
+ BD_Shape/exceptions1.cc (1.11), BD_Shape/exceptions2.cc (1.10),
+ BD_Shape/exceptions3.cc (1.11), BD_Shape/fromgensys1.cc (1.9),
+ BD_Shape/generalizedaffineimage1.cc (1.10),
+ BD_Shape/generalizedaffineimage10.cc (1.9),
+ BD_Shape/generalizedaffineimage11.cc (1.8),
+ BD_Shape/generalizedaffineimage12.cc (1.8),
+ BD_Shape/generalizedaffineimage13.cc (1.9),
+ BD_Shape/generalizedaffineimage14.cc (1.13),
+ BD_Shape/generalizedaffineimage2.cc (1.9),
+ BD_Shape/generalizedaffineimage3.cc (1.10),
+ BD_Shape/generalizedaffineimage4.cc (1.9),
+ BD_Shape/generalizedaffineimage5.cc (1.9),
+ BD_Shape/generalizedaffineimage6.cc (1.9),
+ BD_Shape/generalizedaffineimage7.cc (1.9),
+ BD_Shape/generalizedaffineimage8.cc (1.9),
+ BD_Shape/generalizedaffineimage9.cc (1.8),
+ BD_Shape/generalizedaffinepreimage1.cc (1.10),
+ BD_Shape/generalizedaffinepreimage2.cc (1.7),
+ BD_Shape/geomcovers1.cc (1.4), BD_Shape/h79widening1.cc (1.8),
+ BD_Shape/intersection1.cc (1.8), BD_Shape/intersection2.cc (1.8),
+ BD_Shape/intersection3.cc (1.9), BD_Shape/intersection4.cc
+ (1.10), BD_Shape/intersection5.cc (1.10),
+ BD_Shape/intersection6.cc (1.9), BD_Shape/intersection7.cc (1.9),
+ BD_Shape/intersection8.cc (1.9),
+ BD_Shape/limitedbhmz05extrapolation1.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation2.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation3.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation4.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation5.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation6.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation7.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation8.cc (1.4),
+ BD_Shape/limitedbhmz05extrapolation9.cc (1.4),
+ BD_Shape/limitedcc76extrapolation1.cc (1.4),
+ BD_Shape/limitedcc76extrapolation2.cc (1.5),
+ BD_Shape/limitedcc76extrapolation3.cc (1.5),
+ BD_Shape/limitedh79extrapolation1.cc (1.8),
+ BD_Shape/mapspacedims1.cc (1.9), BD_Shape/mapspacedims2.cc
+ (1.12), BD_Shape/mapspacedims3.cc (1.10),
+ BD_Shape/mapspacedims4.cc (1.10), BD_Shape/maxspacedim.cc (1.10),
+ BD_Shape/minconstraints1.cc (1.4), BD_Shape/relations1.cc (1.12),
+ BD_Shape/relations2.cc (1.12), BD_Shape/relations3.cc (1.11),
+ BD_Shape/relations4.cc (1.10), BD_Shape/relations5.cc (1.12),
+ BD_Shape/removespacedims1.cc (1.9), BD_Shape/removespacedims2.cc
+ (1.11), BD_Shape/removespacedims3.cc (1.11),
+ BD_Shape/timeelapse1.cc (1.8), BD_Shape/timeelapse2.cc (1.8),
+ BD_Shape/timeelapse3.cc (1.8), BD_Shape/timeelapse4.cc (1.8),
+ BD_Shape/timeelapse5.cc (1.9), BD_Shape/universe1.cc (1.9),
+ BD_Shape/writebdshape1.cc (1.5), BD_Shape/writebdshape2.cc (1.6):
+ Started renovation of the testsuite: number of test programs
+ drastically reduced; all programs have now the very same
+ structure; non-exceptions failure of one test does prevent the
+ other tests to be run. Several tests have also been fixed.
+
+2006-02-15 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.cc (simplex.1): file Partial_Function.cc
+ was added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-02-15 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.defs.hh (altnum.1): file
+ Partial_Function.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:21 +0000
+
+2006-02-15 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.defs.hh (simplex.1): file
+ Partial_Function.defs.hh was added on branch simplex on
+ 2006-05-08 17:15:53 +0000
+
+2006-02-15 Wednesday 09:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.49): dualhypercubes also fails
+ (due to overflow) for checked 64 bits integers, due to the
+ steepest-edge implementation in the primal simplex.
+
+2006-02-15 Wednesday 09:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.41): Spcialization of
+ poly_difference_assign() and check_containment() are now placed
+ in the same namespace as their declarations.
+
+2006-02-14 Tuesday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (1.9): Adapted the
+ expected result of test12() to the precision obtained on the
+ SPARC.
+
+2006-02-14 Tuesday 15:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: ppl_test.hh (1.37), Grid/Makefile.am (1.11): Tests in
+ Makefile.am are ordered alphabetically. Added "const" to the
+ parameters in copy_compare() in ppl_test.hh.
+
+2006-02-14 Tuesday 15:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Congruence_System.cc (1.3), Grid_Generator_System.cc (1.3),
+ Grid_Generator_System.defs.hh (1.9): Added assert(OK()) to four
+ methods in Congruence_System.cc Corrected a cut-and-paste error
+ in Grid_Generator_System.cc Improved a comment in
+ Grid_Generator_System.defs.hh.
+
+2006-02-14 Tuesday 13:40 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.60): More correct implementation
+ for exact_div.
+
+2006-02-14 Tuesday 13:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.71), GMP_Integer.defs.hh (1.21),
+ GMP_Integer.inlines.hh (1.15): Specify that the behavior of
+ exact_div_assign(x, y, z) is undefined if `z' does not divide
+ `y'. This condition is asserted in the GMP_Integer
+ implementation.
+
+2006-02-14 Tuesday 09:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (1.6): Corrected.
+
+2006-02-13 Monday 21:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffineimage6.cc (1.8): Corrected a
+ known result.
+
+2006-02-13 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.251), PFunction.cc (1.9), PFunction.hh
+ (1.9), Partial_Function.cc (1.1), Partial_Function.defs.hh (1.1),
+ Partial_Function.inlines.hh (1.1), Partial_Function.types.hh
+ (1.1), ppl_test.hh (1.36), print.cc (1.20), print.hh (1.26),
+ BD_Shape/mapspacedims1.cc (1.8), BD_Shape/mapspacedims2.cc
+ (1.11), BD_Shape/mapspacedims3.cc (1.9),
+ BD_Shape/mapspacedims4.cc (1.9), Grid/mapspacedims1.cc (1.6),
+ Polyhedron/mapspacedims1.cc (1.9), Polyhedron/mapspacedims2.cc
+ (1.7), Polyhedron/mapspacedims3.cc (1.7),
+ Polyhedron/mapspacedims4.cc (1.7): Class PFunction renamed
+ Partial_Function and implemented consistently. Avoided code
+ duplication for print_function().
+
+2006-02-13 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.inlines.hh (altnum.1): file
+ Partial_Function.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.inlines.hh (simplex.1): file
+ Partial_Function.inlines.hh was added on branch simplex on
+ 2006-05-08 17:15:53 +0000
+
+2006-02-13 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.types.hh (altnum.1): file
+ Partial_Function.types.hh was added on branch altnum on
+ 2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Partial_Function.types.hh (simplex.1): file
+ Partial_Function.types.hh was added on branch simplex on
+ 2006-05-08 17:15:53 +0000
+
+2006-02-13 Monday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-sparc.inlines.hh (1.5): Definitions of FPU_UPWARD and
+ FPU_DOWNWARD fixed.
+
+2006-02-13 Monday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-sparc.inlines.hh (altnum.1): file fpu-sparc.inlines.hh
+ was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-13 Monday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-sparc.inlines.hh (simplex.1): file fpu-sparc.inlines.hh
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-13 Monday 19:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: addconstraints1.cc (1.7), addspacedims1.cc
+ (1.8), addspacedims2.cc (1.8), addspacedims5.cc (1.11),
+ addspacedims6.cc (1.11), affineimage1.cc (1.8), affineimage10.cc
+ (1.7), affineimage2.cc (1.8), affineimage3.cc (1.8),
+ affineimage4.cc (1.8), affineimage5.cc (1.8), affineimage6.cc
+ (1.8), affineimage7.cc (1.8), affinepreimage1.cc (1.8),
+ affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+ affinepreimage4.cc (1.8), bdsdifference1.cc (1.4),
+ bdsdifference2.cc (1.4), bdsdifference3.cc (1.4),
+ bdsdifference4.cc (1.4), bdsdifference5.cc (1.4),
+ bdsdifference6.cc (1.4), bdsdifference7.cc (1.4), bdshull1.cc
+ (1.4), bdshull2.cc (1.4), bdshull3.cc (1.4), bdshull4.cc (1.4),
+ bhmz05widening1.cc (1.3), bhmz05widening2.cc (1.3),
+ bhmz05widening3.cc (1.3), bhmz05widening4.cc (1.3),
+ bhmz05widening5.cc (1.3), bhmz05widening6.cc (1.3),
+ bhmz05widening7.cc (1.3), bhmz05widening8.cc (1.3),
+ cc76extrapolation1.cc (1.7), cc76extrapolation2.cc (1.8),
+ cc76extrapolation3.cc (1.7), cc76extrapolation4.cc (1.10),
+ cc76extrapolation5.cc (1.7), cc76narrowing1.cc (1.8),
+ cc76narrowing2.cc (1.8), cc76narrowing3.cc (1.8),
+ cc76narrowing4.cc (1.9), cc76narrowing5.cc (1.9), concatenate1.cc
+ (1.8), concatenate2.cc (1.8), concatenate3.cc (1.7),
+ concatenate4.cc (1.7), concatenate5.cc (1.8), constraints1.cc
+ (1.11), constraints2.cc (1.8), equality1.cc (1.11),
+ fromgensys1.cc (1.8), generalizedaffineimage1.cc (1.9),
+ generalizedaffineimage10.cc (1.8), generalizedaffineimage11.cc
+ (1.7), generalizedaffineimage12.cc (1.7),
+ generalizedaffineimage14.cc (1.12), generalizedaffineimage2.cc
+ (1.8), generalizedaffineimage3.cc (1.9),
+ generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+ (1.8), generalizedaffineimage6.cc (1.7),
+ generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+ (1.8), generalizedaffineimage9.cc (1.7),
+ generalizedaffinepreimage2.cc (1.5), h79widening1.cc (1.7),
+ intersection1.cc (1.7), intersection2.cc (1.7), intersection3.cc
+ (1.8), intersection4.cc (1.9), intersection5.cc (1.9),
+ intersection6.cc (1.8), intersection7.cc (1.8), intersection8.cc
+ (1.8), limitedbhmz05extrapolation1.cc (1.3),
+ limitedbhmz05extrapolation2.cc (1.3),
+ limitedbhmz05extrapolation3.cc (1.3),
+ limitedbhmz05extrapolation4.cc (1.3),
+ limitedbhmz05extrapolation5.cc (1.3),
+ limitedbhmz05extrapolation6.cc (1.3),
+ limitedbhmz05extrapolation7.cc (1.3),
+ limitedbhmz05extrapolation8.cc (1.3),
+ limitedbhmz05extrapolation9.cc (1.3),
+ limitedcc76extrapolation1.cc (1.3), limitedcc76extrapolation2.cc
+ (1.4), limitedcc76extrapolation3.cc (1.4),
+ limitedh79extrapolation1.cc (1.7), mapspacedims1.cc (1.7),
+ mapspacedims2.cc (1.10), mapspacedims3.cc (1.8), mapspacedims4.cc
+ (1.8), removespacedims1.cc (1.8), removespacedims2.cc (1.10),
+ removespacedims3.cc (1.10), timeelapse2.cc (1.7), timeelapse3.cc
+ (1.7), timeelapse4.cc (1.7), timeelapse5.cc (1.8): Use
+ BD_Shape<mpq_class> to encode the known results. Use
+ check_result() to compare the known result with computed ones
+ when there might be approximations due to rounding.
+
+2006-02-13 Monday 19:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.66), BD_Shape.templates.hh (1.2): When
+ building a BD_Shape from a generator system, we should throw an
+ exception if the system is non-empty but has no points.
+
+2006-02-13 Monday 14:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.220): Version number bumped.
+
+2006-02-13 Monday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.65): Instruct spld to
+ pass the right options to the linker.
+
+2006-02-13 Monday 14:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.53): Instruct gplc to pass
+ the right options to the linker.
+
+2006-02-13 Monday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.60): Instruct plld to pass
+ the right options to the linker (that is, to the C++ compiler).
+
+2006-02-13 Monday 14:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.14), affineimage9.cc (1.12),
+ affinepreimage5.cc (1.9), generalizedaffineimage13.cc (1.8),
+ generalizedaffinepreimage1.cc (1.8): Corrected and standardized
+ as suggested by Roberto the way we compare the computed and known
+ results.
+
+2006-02-13 Monday 13:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.183), src/Grid.defs.hh (1.10), src/Grid_public.cc (1.9),
+ tests/Grid/Makefile.am (1.10), tests/Grid/discrete1.cc (1.1),
+ tests/Grid/pointed1.cc (1.6): Removed a todo item regarding
+ missing operators for grids. Renamed method is_pointed() by
+ is_discrete(). Changed name of test for this method to match
+ change of name.
+
+2006-02-13 Monday 11:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/LP_Problem3.cc (1.7): Removed.
+
+2006-02-13 Monday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.32): Explain the new mechanism to obtain noisy
+ and/or very noisy behavior from test programs.
+
+2006-02-13 Monday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.templates.hh (simplex.1): file
+ Polyhedron.templates.hh was added on branch simplex on 2006-05-08
+ 17:15:49 +0000
+
+2006-02-13 Monday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in (1.69), doc/devref.doxyconf-latex.in
+ (1.10), src/Makefile.am (1.148), src/Polyhedron.defs.hh (1.294),
+ src/Polyhedron.inlines.hh (1.131), src/Polyhedron.templates.hh
+ (1.1): New file Polyhedron.templates.hh contains non-inline
+ template functions of the implementation of class Polyhedron.
+
+2006-02-13 Monday 10:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: addconstraint3.cc (1.7), addgenerator3.cc
+ (1.7), addspacedims13.cc (1.7), affineimage5.cc (1.8), append1.cc
+ (1.7), generators1.cc (1.7), generators2.cc (1.7), powerset1.cc
+ (1.11), writerelation1.cc (1.8): Removed useless invocations to
+ the OK() methods.
+
+2006-02-13 Monday 10:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.182): Added one item for PPL 0.9.
+
+2006-02-13 Monday 10:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.181): Added an (urgent) item concerning the use of OK()
+ methods.
+
+2006-02-13 Monday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.180): Pushed several items to PPL 0.10.
+
+2006-02-13 Monday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-pwl.copyright.in (1.3), debian/libppl.copyright.in
+ (1.3), src/Grid_Generator.cc (1.3), tests/Grid/Makefile.am (1.9),
+ tests/Grid/addcongruence1.cc (1.4), tests/Grid/addcongruences1.cc
+ (1.7), tests/Grid/addconstraint1.cc (1.5),
+ tests/Grid/addconstraints1.cc (1.5), tests/Grid/addgenerator1.cc
+ (1.7), tests/Grid/addgenerators1.cc (1.3),
+ tests/Grid/addspacedims1.cc (1.6), tests/Grid/addspacedims2.cc
+ (1.6), tests/Grid/affinedim1.cc (1.4), tests/Grid/affineimage1.cc
+ (1.7), tests/Grid/affineimage1_16.cc (1.3),
+ tests/Grid/affinepreimage1.cc (1.5), tests/Grid/asciidumpload1.cc
+ (1.3), tests/Grid/bhz03widening1.cc (1.4), tests/Grid/bounded1.cc
+ (1.5), tests/Grid/boundingbox1.cc (1.4),
+ tests/Grid/boundingbox2.cc (1.4), tests/Grid/bounds1.cc (1.5),
+ tests/Grid/certificate1.cc (1.6), tests/Grid/concatenate1.cc
+ (1.6), tests/Grid/congruence1.cc (1.6),
+ tests/Grid/congruences1.cc (1.4), tests/Grid/congruencesystem1.cc
+ (1.4), tests/Grid/congruencesystem2.cc (1.4),
+ tests/Grid/contains1.cc (1.5), tests/Grid/contains2.cc (1.4),
+ tests/Grid/copyconstruct1.cc (1.4), tests/Grid/coveringbox1.cc
+ (1.4), tests/Grid/coveringbox2.cc (1.4), tests/Grid/disjoint1.cc
+ (1.5), tests/Grid/equals1.cc (1.5), tests/Grid/expandspacedim1.cc
+ (1.5), tests/Grid/foldspacedims1.cc (1.5),
+ tests/Grid/generalizedaffineimage1.cc (1.5),
+ tests/Grid/generalizedaffineimage2.cc (1.5),
+ tests/Grid/generalizedaffinepreimage1.cc (1.6),
+ tests/Grid/generalizedaffinepreimage2.cc (1.6),
+ tests/Grid/generator1.cc (1.4), tests/Grid/generators1.cc (1.6),
+ tests/Grid/grid1.cc (1.9), tests/Grid/grid1_16.cc (1.6),
+ tests/Grid/grid1_64.cc (1.4), tests/Grid/grid1_gmp.cc (1.4),
+ tests/Grid/grid2.cc (1.7), tests/Grid/grid2_16.cc (1.4),
+ tests/Grid/grid3.cc (1.6), tests/Grid/griddifference1.cc (1.6),
+ tests/Grid/intersection1.cc (1.5), tests/Grid/intersection2.cc
+ (1.4), tests/Grid/isempty1.cc (1.3), tests/Grid/isuniverse1.cc
+ (1.6), tests/Grid/join1.cc (1.8), tests/Grid/join1_16.cc (1.3),
+ tests/Grid/join2.cc (1.4), tests/Grid/join3.cc (1.6),
+ tests/Grid/limitedextrapolation1.cc (1.5),
+ tests/Grid/mapspacedims1.cc (1.5), tests/Grid/maxmin1.cc (1.4),
+ tests/Grid/membytes1.cc (1.3), tests/Grid/membytes2.cc (1.3),
+ tests/Grid/mincongruences1.cc (1.5), tests/Grid/mingenerators1.cc
+ (1.5), tests/Grid/outputoperator1.cc (1.3),
+ tests/Grid/pointed1.cc (1.5), tests/Grid/relations1.cc (1.7),
+ tests/Grid/relations2.cc (1.6), tests/Grid/removespacedims1.cc
+ (1.5), tests/Grid/removespacedims2.cc (1.5),
+ tests/Grid/timeelapse1.cc (1.5), tests/Grid/timeelapse2.cc (1.4),
+ tests/Grid/topclosed1.cc (1.5), tests/Grid/topclosure1.cc (1.4),
+ tests/Grid/widening1.cc (1.6),
+ tests/Grid/writecongruencesystem.cc (1.3),
+ tests/Polyhedron/addcongruence1.cc (1.4),
+ tests/Polyhedron/addcongruence2.cc (1.4),
+ tests/Polyhedron/addcongruence3.cc (1.4),
+ tests/Polyhedron/addcongruence4.cc (1.4),
+ tests/Polyhedron/addcongruence5.cc (1.4),
+ tests/Polyhedron/addcongruences1.cc (1.5),
+ tests/Polyhedron/addcongruences2.cc (1.4),
+ tests/Polyhedron/addcongruences3.cc (1.4),
+ tests/Polyhedron/addcongruences4.cc (1.4),
+ tests/Polyhedron/addcongruences5.cc (1.4),
+ tests/Polyhedron/congruences1.cc (1.4): Copyright years made
+ consistent across the entire library.
+
+2006-02-13 Monday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-pwl.copyright.in (altnum.1): file
+ libppl-pwl.copyright.in was added on branch altnum on 2006-10-29
+ 19:26:52 +0000
+
+2006-02-13 Monday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl.copyright.in (altnum.1): file libppl.copyright.in
+ was added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-02-13 Monday 08:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/ppl_test.hh (1.35): "const" added in copy_compare().
+
+2006-02-13 Monday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/randphull1.cc (1.9): Added missing semicolons.
+
+2006-02-13 Monday 07:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.sty (1.25): Added new command \Sset.
+
+2006-02-13 Monday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/addcongruences1.cc (1.4): Old bug fixed.
+
+2006-02-12 Sunday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/mapspacedims1.cc (1.4): No longer use the NOISY macro.
+
+2006-02-12 Sunday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: LP_Problem3.cc (1.6), lpproblem1.cc (1.5),
+ lpproblem2.cc (1.4): Comments improved. Copyright notice fixed.
+
+2006-02-12 Sunday 22:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: LP_Problem3.cc (1.5), addcongruence1.cc (1.3),
+ addcongruence2.cc (1.3), addcongruence3.cc (1.3),
+ addcongruence4.cc (1.3), addcongruence5.cc (1.3),
+ addcongruences1.cc (1.3), addcongruences2.cc (1.3),
+ addcongruences3.cc (1.3), addcongruences4.cc (1.3),
+ addcongruences5.cc (1.3), bug2.cc (1.6), congruences1.cc (1.3),
+ dualhypercubes.cc (1.7), numberinput1.cc (1.25), randphull1.cc
+ (1.8): No longer use the NOISY or VERY_NOISY macro in test
+ programs.
+
+2006-02-12 Sunday 22:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.25): check_noisy() is now (temporarily)
+ declared static.
+
+2006-02-12 Sunday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.24): Noisy and very noisy test output properly
+ implemented: now the `nout' and `vnout' ostream are controlled by
+ the `PPL_NOISY_TESTS' and `PPL_VERY_NOISY_TESTS' environment
+ variables.
+
+2006-02-12 Sunday 20:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/addspacedims5.cc (1.10),
+ BD_Shape/addspacedims6.cc (1.10), BD_Shape/affinedimension1.cc
+ (1.4), BD_Shape/affineimage10.cc (1.6), BD_Shape/affineimage9.cc
+ (1.11), BD_Shape/affinepreimage5.cc (1.8),
+ BD_Shape/ascii_dump_load2.cc (1.9),
+ BD_Shape/cc76extrapolation4.cc (1.9), BD_Shape/constraints1.cc
+ (1.10), BD_Shape/equality1.cc (1.10), BD_Shape/fromgensys1.cc
+ (1.7), BD_Shape/generalizedaffineimage13.cc (1.7),
+ BD_Shape/generalizedaffineimage14.cc (1.11),
+ BD_Shape/generalizedaffinepreimage1.cc (1.7),
+ BD_Shape/generalizedaffinepreimage2.cc (1.4),
+ BD_Shape/limitedcc76extrapolation2.cc (1.3),
+ BD_Shape/limitedcc76extrapolation3.cc (1.3),
+ BD_Shape/mapspacedims2.cc (1.9), BD_Shape/relations1.cc (1.11),
+ BD_Shape/relations2.cc (1.11), BD_Shape/relations3.cc (1.10),
+ BD_Shape/relations4.cc (1.9), BD_Shape/relations5.cc (1.11),
+ BD_Shape/removespacedims2.cc (1.9), BD_Shape/removespacedims3.cc
+ (1.9), Grid/addcongruence1.cc (1.3), Grid/addcongruences1.cc
+ (1.6), Grid/addconstraint1.cc (1.4), Grid/addconstraints1.cc
+ (1.4), Grid/addgenerator1.cc (1.6), Grid/addgenerators1.cc (1.2),
+ Grid/addspacedims1.cc (1.5), Grid/addspacedims2.cc (1.5),
+ Grid/affinedim1.cc (1.3), Grid/affineimage1.cc (1.6),
+ Grid/affineimage1_16.cc (1.2), Grid/affinepreimage1.cc (1.4),
+ Grid/asciidumpload1.cc (1.2), Grid/bhz03widening1.cc (1.3),
+ Grid/bounded1.cc (1.4), Grid/boundingbox1.cc (1.3),
+ Grid/boundingbox2.cc (1.3), Grid/bounds1.cc (1.4),
+ Grid/certificate1.cc (1.5), Grid/concatenate1.cc (1.5),
+ Grid/congruence1.cc (1.5), Grid/congruences1.cc (1.3),
+ Grid/congruencesystem1.cc (1.3), Grid/congruencesystem2.cc (1.3),
+ Grid/contains1.cc (1.4), Grid/contains2.cc (1.3),
+ Grid/copyconstruct1.cc (1.3), Grid/coveringbox1.cc (1.3),
+ Grid/coveringbox2.cc (1.3), Grid/disjoint1.cc (1.4),
+ Grid/equals1.cc (1.4), Grid/expandspacedim1.cc (1.4),
+ Grid/foldspacedims1.cc (1.4), Grid/generalizedaffineimage1.cc
+ (1.4), Grid/generalizedaffineimage2.cc (1.4),
+ Grid/generalizedaffinepreimage1.cc (1.5),
+ Grid/generalizedaffinepreimage2.cc (1.5), Grid/generator1.cc
+ (1.3), Grid/generators1.cc (1.5), Grid/grid1.cc (1.8),
+ Grid/grid1_16.cc (1.5), Grid/grid1_64.cc (1.3), Grid/grid1_gmp.cc
+ (1.3), Grid/grid2.cc (1.6), Grid/grid2_16.cc (1.3), Grid/grid3.cc
+ (1.5), Grid/griddifference1.cc (1.5), Grid/intersection1.cc
+ (1.4), Grid/intersection2.cc (1.3), Grid/isempty1.cc (1.2),
+ Grid/isuniverse1.cc (1.5), Grid/join1.cc (1.7), Grid/join1_16.cc
+ (1.2), Grid/join2.cc (1.3), Grid/join3.cc (1.5),
+ Grid/limitedextrapolation1.cc (1.4), Grid/mapspacedims1.cc (1.3),
+ Grid/maxmin1.cc (1.3), Grid/mincongruences1.cc (1.4),
+ Grid/mingenerators1.cc (1.4), Grid/outputoperator1.cc (1.2),
+ Grid/pointed1.cc (1.4), Grid/relations1.cc (1.6),
+ Grid/relations2.cc (1.5), Grid/removespacedims1.cc (1.4),
+ Grid/removespacedims2.cc (1.4), Grid/timeelapse1.cc (1.4),
+ Grid/timeelapse2.cc (1.3), Grid/topclosed1.cc (1.4),
+ Grid/topclosure1.cc (1.3), Grid/widening1.cc (1.5),
+ Polyhedron/NNCbecomesC1.cc (1.7), Polyhedron/addconstraints13.cc
+ (1.8), Polyhedron/addgenerators12.cc (1.8),
+ Polyhedron/affineimage8.cc (1.7), Polyhedron/affinepreimage10.cc
+ (1.7), Polyhedron/affinepreimage12.cc (1.2),
+ Polyhedron/affinepreimage9.cc (1.7),
+ Polyhedron/ascii_dump_load3.cc (1.7),
+ Polyhedron/ascii_dump_load4.cc (1.7),
+ Polyhedron/ascii_dump_load5.cc (1.7),
+ Polyhedron/ascii_dump_load6.cc (1.8),
+ Polyhedron/bhrz03widening12.cc (1.7),
+ Polyhedron/bhz03widening6.cc (1.9), Polyhedron/boundingbox1.cc
+ (1.9), Polyhedron/boundingbox2.cc (1.8),
+ Polyhedron/boundingbox3.cc (1.8), Polyhedron/boundingbox4.cc
+ (1.8), Polyhedron/concatenate6.cc (1.8),
+ Polyhedron/constraints4.cc (1.8), Polyhedron/contains5.cc (1.7),
+ Polyhedron/disjoint2.cc (1.8), Polyhedron/disjoint3.cc (1.8),
+ Polyhedron/expandspacedim1.cc (1.8),
+ Polyhedron/expandspacedim2.cc (1.8), Polyhedron/foldspacedims1.cc
+ (1.8), Polyhedron/foldspacedims2.cc (1.8),
+ Polyhedron/generalizedaffineimage10.cc (1.7),
+ Polyhedron/generalizedaffineimage11.cc (1.8),
+ Polyhedron/generalizedaffineimage9.cc (1.7),
+ Polyhedron/generators6.cc (1.8), Polyhedron/intersection10.cc
+ (1.8), Polyhedron/intersection11.cc (1.8),
+ Polyhedron/limitedh79extrapolation4.cc (1.8),
+ Polyhedron/mapspacedims1.cc (1.8), Polyhedron/polydifference7.cc
+ (1.8), Polyhedron/polyhull8.cc (1.8), Polyhedron/polyhull9.cc
+ (1.8), Polyhedron/polypowerset1.cc (1.18),
+ Polyhedron/relations17.cc (1.8), Polyhedron/relations19.cc (1.8),
+ Polyhedron/relations9.cc (1.7), Polyhedron/topclosure4.cc (1.8),
+ Polyhedron/writerelation1.cc (1.7): Use the DO_TEST macro in
+ multiple tests.
+
+2006-02-12 Sunday 18:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/generators1.cc (1.4): Added three tests; for a
+ generator system with parameters, one where the parameter is
+ integral, and two which have divisors.
+
+2006-02-12 Sunday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.219): Check whether getenv() is declared.
+
+2006-02-12 Sunday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affineimage8.cc (1.13): Changed so as to do
+ sensible tests.
+
+2006-02-12 Sunday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.34): Added a macro DO_TEST to be used when
+ implementing more than one test in a test program. Added all the
+ infrastructure required to write decent tests for BD_Shape.
+
+2006-02-12 Sunday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpq.inlines.hh (1.31): It is now possible to (very
+ inefficiently) build and assign an mpq_class checked number from
+ a long double.
+
+2006-02-12 Sunday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.62): The output_float() function
+ now takes its `from' parameter as `const Type', not `Type&'.
+
+2006-02-12 Sunday 14:22 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.70), Checked_Number.inlines.hh
+ (1.59): Added constructor with rounding direction.
+
+2006-02-12 Sunday 12:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: generalizedaffinepreimage1.cc (1.4),
+ generalizedaffinepreimage2.cc (1.4), grid1_16.cc (1.4): Removed
+ 'FIX check' comments (and similar) as tests now checked.
+ Renumbered tests in generalizedaffinepreimage2.cc so that they
+ start from 1. Added test 6 in generalizedaffinepreimage2.cc.
+
+2006-02-12 Sunday 11:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (1.6): Correct bug in use of NDEBUG.
+
+2006-02-12 Sunday 10:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.194): Improved the section on grids.
+
+2006-02-12 Sunday 09:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/.cvsignore (1.6): File ppl_sicstus.pl
+ was erroneously ignored.
+
+2006-02-11 Saturday 20:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh (1.20): Added a missing \relates Doxygen
+ command for gdcext_assign().
+
+2006-02-11 Saturday 20:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Congruence.defs.hh (1.3), Congruence_System.defs.hh (1.6),
+ Grid.defs.hh (1.9), Grid_Certificate.defs.hh (1.3),
+ Grid_Generator.defs.hh (1.8), Grid_Generator_System.defs.hh
+ (1.8), globals.defs.hh (1.36): Inserting the Grid classes in the
+ C++ interface documentation group.
+
+2006-02-11 Saturday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.defs.hh (altnum.1): file
+ Grid_Certificate.defs.hh was added on branch altnum on 2006-10-29
+ 19:27:13 +0000
+
+2006-02-11 Saturday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.defs.hh (simplex.1): file
+ Grid_Certificate.defs.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-02-11 Saturday 15:51 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[31,23]):
+ Removed redundant code where possible. Properly renamed some
+ variables and methods. Try to avoid memory reallocations and to
+ keep the internal data structures always consistent.
+
+2006-02-11 Saturday 13:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.147), tests/BD_Shape/Makefile.am (1.35),
+ tests/Grid/Makefile.am (1.8), tests/Polyhedron/Makefile.am
+ (1.48): Use precompiled headers, if requested to do so.
+
+2006-02-11 Saturday 13:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.193), src/Grid.defs.hh (1.8): Corrected
+ doxygen references.
+
+2006-02-11 Saturday 12:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.218): Added an initial version of the new
+ --enable-pch configure option: this will allow to enable
+ precompiled headers when they are made available by the C/C++
+ compilers.
+
+2006-02-11 Saturday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/.cvsignore (1.2), Watchdog/src/Makefile.am (1.6),
+ interfaces/Prolog/ppl_prolog.icc (1.176),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.46),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.39),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.91),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.121),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.86),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.114),
+ tests/Polyhedron/watchdog1.cc (1.8): We now directly create
+ `pwl.hh': `pwl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/.cvsignore (altnum.1): file .cvsignore was added on
+ branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-02-11 Saturday 11:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.40): Added a couple of
+ missing namespace qualifications in \relates Doxygen commands.
+
+2006-02-11 Saturday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/utils/.cvsignore (1.2), debian/.cvsignore (1.2),
+ doc/.cvsignore (1.3), src/.cvsignore (1.10), utils/.cvsignore
+ (1.2): Ignore more built files and directories.
+
+2006-02-11 Saturday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/utils/.cvsignore (altnum.1): file .cvsignore was added
+ on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-02-11 Saturday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/.cvsignore (altnum.1): file .cvsignore was added on branch
+ altnum on 2006-10-29 19:26:52 +0000
+
+2006-02-11 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (altnum.1): file ppl-config.cc.in was added
+ on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-11 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.55), interfaces/C/ppl_c.cc (1.152),
+ interfaces/Prolog/ppl_prolog.icc (1.175),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.45),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.38),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.90),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.120),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.85),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.113), src/.cvsignore (1.9),
+ src/Makefile.am (1.146), src/ppl-config.cc.in (1.18),
+ tests/ppl_test.hh (1.33): We now directly create `ppl.hh':
+ `ppl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 10:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.14): The `$(COMMANDS)' construct is
+ not portable: use ``COMMANDS`' instead.
+
+2006-02-10 Friday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-sparc.inlines.hh (1.4): Added missing type casts.
+
+2006-02-10 Friday 20:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: fpu-sparc.inlines.hh (1.3), fpu.types.hh (1.2): Now both
+ fpu_rounding_direction_type and fpu_rounding_control_word_type
+ are unconditionally defined to be the int type.
+
+2006-02-10 Friday 20:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.types.hh (altnum.1): file fpu.types.hh was added on
+ branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-10 Friday 20:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.types.hh (simplex.1): file fpu.types.hh was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-10 Friday 20:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.61): Avoid long lines.
+
+2006-02-10 Friday 19:58 Abramo Bagnara
+
+ * src/fpu-ia32.inlines.hh (1.11): God rid of HIJACK_FPU (now it's
+ the normal behaviour).
+
+2006-02-10 Friday 15:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.cc (1.25): Initialize the library with
+ fpu_set_rounding_direction(ROUND_DIRECT) instead of
+ fpu_set_rounding_direction(FPU_UPWARD).
+
+2006-02-10 Friday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.defs.hh (1.10): Copy and paste mistake fixed.
+
+2006-02-10 Friday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.2): Use AC_LANG_SOURCE to obtain
+ the test program source.
+
+2006-02-10 Friday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (altnum.1): file
+ ac_check_fpu_control.m4 was added on branch altnum on 2006-10-29
+ 19:27:11 +0000
+
+2006-02-10 Friday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (simplex.1): file
+ ac_check_fpu_control.m4 was added on branch simplex on 2006-05-08
+ 17:15:48 +0000
+
+2006-02-10 Friday 13:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-none.inlines.hh (altnum.1): file fpu-none.inlines.hh was
+ added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-10 Friday 13:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.217), src/Init.cc (1.24), src/fpu-none.inlines.hh
+ (1.4), src/fpu.defs.hh (1.9): Check for the possibility to
+ control the FPU. If FPU control is not available, do not try to
+ use it in Init::Init(); any attempt to use it from elsewhere
+ will result in an std::logic_error exception being thrown.
+
+2006-02-10 Friday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/Makefile.am (1.17): Updated.
+
+2006-02-10 Friday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_fpu_control.m4 (1.1): New function to check for the
+ possibility to control the FPU.
+
+2006-02-10 Friday 07:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.60): Use the new interfaces
+ offered by the FPU control/query functions.
+
+2006-02-09 Thursday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.189): Mention the portability improvements.
+
+2006-02-09 Thursday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.46): Be functional also if the
+ "fast" integral types are missing.
+
+2006-02-09 Thursday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.216): Check for the availability of "fast"
+ integral types.
+
+2006-02-09 Thursday 20:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.23), Init.defs.hh (1.16): Adapted to the recent
+ changes concerning FPU control. Init::Init() was probably broken
+ on some architectures.
+
+2006-02-09 Thursday 20:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.11): Mac OS X 10.4 has fixed <fenv.h>:
+ now the FE_* constants are defined by means of macros.
+
+2006-02-09 Thursday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.145), fpu-c99.inlines.hh (1.10),
+ fpu-ia32.inlines.hh (1.10), fpu-sparc.inlines.hh (1.2),
+ fpu.defs.hh (1.8), fpu.types.hh (1.1): FPU control functions
+ documented. They now use the new system-dependent types
+ fpu_rounding_direction_type and fpu_rounding_control_word_type.
+
+2006-02-09 Thursday 16:00 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.30): Fixed another bug. Keep
+ `last_generator' always updated even if the second phase fails.
+
+2006-02-09 Thursday 13:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c, src/LP_Problem.cc,
+ src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh
+ (simplex.[6,29,22,18]): Temporarily replaced method const
+ Constraint_System& constraints() const; by Constraint_System
+ constraints() const; Removed a fixme. Simplified the prototype
+ and the implementation of is_satisfied().
+
+2006-02-09 Thursday 08:46 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.59): Fixed cut and paste typo.
+
+2006-02-08 Wednesday 20:06 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.28): Fixed a bug in `is_satisfied()'.
+
+2006-02-08 Wednesday 12:28 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.69), Checked_Number.inlines.hh
+ (1.58), Float.cc (1.4), Float.defs.hh (1.19), Float.inlines.hh
+ (1.23), checked_ext.inlines.hh (1.29), checked_float.inlines.hh
+ (1.58), checked_numeric_limits.hh (1.13), float.types.hh (1.15):
+ Better abstraction for float binary format.
+
+2006-02-08 Wednesday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.cc (altnum.1): file Float.cc was added on branch altnum
+ on 2006-10-29 19:27:12 +0000
+
+2006-02-06 Monday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.144): Distribute also fpu-none.inlines.hh and
+ fpu-sparc.inlines.hh.
+
+2006-02-06 Monday 21:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.215): Check for the availability of fenv.h and
+ ieeefp.h.
+
+2006-02-06 Monday 21:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh (1.9): Typo fixed.
+
+2006-02-06 Monday 21:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.9): Do no harm if fenv.h is not
+ available.
+
+2006-02-06 Monday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu.defs.hh (1.7): Only include fpu-c99.inlines.hh if fenv.h
+ is available. Otherwise, if `sparc' evaluates to true, include
+ fpu-sparc.inlines.hh. Otherwise include fpu-none.inlines.hh.
+
+2006-02-06 Monday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-sparc.inlines.hh (1.1): SPARC floating point unit related
+ functions.
+
+2006-02-06 Monday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.47): Added NNCminimize1 to
+ XFAIL_WITH_INT8_A.
+
+2006-02-06 Monday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.214), src/checked_float.inlines.hh (1.57): Do not
+ use rintf() if it is not available.
+
+2006-02-06 Monday 07:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.34): Undo change erroneously merged
+ from the `grids' branch.
+
+2006-02-06 Monday 01:29 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.27): Removed redundant and useless
+ code.
+
+2006-02-05 Sunday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (1.14): New macros give the binary format of
+ each supported C++ floating point type: CXX_FLOAT_BINARY_FORMAT,
+ CXX_DOUBLE_BINARY_FORMAT and CXX_LONG_DOUBLE_BINARY_FORMAT. These
+ macros are undefined is the format has not been recognized.
+
+2006-02-05 Sunday 20:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float128_binary_format.m4 (1.5): Make sure the macro
+ CXX_FLOAT128_BINARY_FORMAT_IS_INTEL_DOUBLE_EXTENDED is always
+ defined.
+
+2006-02-05 Sunday 18:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.213), instchk.hh (1.4),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.119), src/Float.defs.hh
+ (1.18), src/Float.inlines.hh (1.22), src/checked_int.inlines.hh
+ (1.45): Cater for those systems providing inttypes.h instead of
+ stdint.h.
+
+2006-02-05 Sunday 18:38 Andrea Cimino
+
+ * src/: Generator.defs.hh, LP_Problem.cc, LP_Problem.defs.hh
+ (simplex.[2,26,21]): LP_Problem, during the incrementality
+ process, checks if an inequality is already satisfied by
+ `last_generator': this can save a lot of time. LP_Problem
+ declared friend of Generator to allow a right use of
+ Scalar_Products.
+
+2006-02-05 Sunday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_float32_binary_format.m4 (1.3),
+ ac_cxx_float64_binary_format.m4 (1.4),
+ ac_cxx_float96_binary_format.m4 (1.4): Be more concise.
+
+2006-02-05 Sunday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float128_binary_format.m4 (1.4): Constants fixed.
+
+2006-02-05 Sunday 17:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.7), affineimage1.cc (1.5),
+ affineimage1_16.cc (1.1), grid1.cc (1.7), grid1_16.cc (1.3),
+ join1.cc (1.6), join1_16.cc (1.1): Three tests added before to
+ grid1.cc join1.cc affineimage1.cc now removed and placed in
+ grid1_16.cc join1_16.cc affineimage1_16.cc. These last 3 tests
+ are expected to fail with 8 bit integers.
+
+2006-02-05 Sunday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float128_binary_format.m4 (1.3): Constant fixed.
+
+2006-02-05 Sunday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_float128_binary_format.m4 (1.2),
+ ac_cxx_float32_binary_format.m4 (1.2),
+ ac_cxx_float64_binary_format.m4 (1.3),
+ ac_cxx_float96_binary_format.m4 (1.3): Cater for those systems
+ providing inttypes.h instead of stdint.h.
+
+2006-02-05 Sunday 15:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.17): Spurious blank removed.
+
+2006-02-05 Sunday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.212): Detect the binary format used by 128-bit
+ floats.
+
+2006-02-05 Sunday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float128_binary_format.m4 (1.1): New function to detect
+ the binary format used by 128-bit floats.
+
+2006-02-05 Sunday 14:17 Matthew Mundell
+
+ * tests/Grid/: certificate1.cc (1.4), isuniverse1.cc (1.4): Take
+ out stray calls to ascii_dump.
+
+2006-02-05 Sunday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float64_binary_format.m4 (1.2): Cosmetic improvements.
+
+2006-02-05 Sunday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.211): Detect the binary format used by 32-bit
+ floats.
+
+2006-02-05 Sunday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float32_binary_format.m4 (1.1): New function to detect
+ the binary format used by 32-bit floats.
+
+2006-02-05 Sunday 10:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float96_binary_format.m4 (1.2): Correctly handle the
+ case where a 96-bit floating point format is not detected.
+
+2006-02-05 Sunday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.210): Detect the binary format used by 96-bit
+ floats.
+
+2006-02-05 Sunday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float96_binary_format.m4 (1.1): New function to detect
+ the binary format used by 96-bit floats.
+
+2006-02-04 Saturday 22:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.209): Detect the binary format used by 64-bit
+ floats.
+
+2006-02-04 Saturday 22:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_cxx_float64_binary_format.m4 (1.1): New function to detect
+ the binary format used by 64-bit floats.
+
+2006-02-03 Friday 03:25 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.25): A couple of fixes in OK(): Some
+ assertions were failing without a good reason.
+
+2006-02-01 Wednesday 23:27 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.24): The FIXME about incrementality
+ was already dealt with.
+
+2006-02-01 Wednesday 23:23 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.23): Other little improvements.
+
+2006-02-01 Wednesday 22:56 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[22,20]): Major
+ improvements to the class: now the incrementality process handles
+ a Constraint_System in one shot instead of a single Constraint.
+ Added other useful tests in OK(). Minor changes in the
+ documentation.
+
+2006-02-01 Wednesday 20:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.208): Version number bumped.
+
+2006-02-01 Wednesday 20:06 Abramo Bagnara
+
+ * src/Float.inlines.hh (1.21): Constant is 64 bit long.
+
+2006-02-01 Wednesday 19:35 Abramo Bagnara
+
+ * src/Float.inlines.hh (1.20): Clear most significant bit of the
+ mantissa.
+
+2006-02-01 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.19): Added missing semicolon.
+
+2006-02-01 Wednesday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.188): Added some items (to be filled in).
+
+2006-02-01 Wednesday 12:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Grid/: affineimage1.cc (1.4), grid1.cc (1.6), grid2.cc
+ (1.5), join1.cc (1.5), widening1.cc (1.4): Removed 3 "FIX "'s in
+ grid2.cc and widening1.cc. Added tests based on example in
+ Muller-Olm and Seidl SAS paper to grid1.cc, join1.cc and
+ affineimage1.cc. Added tests based on Example 8 in the technical
+ report on the grids domain in widening1.cc. Reordered tests in
+ widening1.cc so that those based on examples 8 and 9 are
+ together.
+
+2006-02-01 Wednesday 01:34 Matthew Mundell
+
+ * tests/Grid/Makefile.am (1.6): Take NOISY directive out of
+ AM_CPPFLAGS.
+
+2006-02-01 Wednesday 01:04 Matthew Mundell
+
+ * debian/README (1.1): Initial revision.
+
+2006-01-31 Tuesday 19:12 Matthew Mundell
+
+ * tests/Grid/grid2.cc (1.4): Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:12 Matthew Mundell
+
+ * tests/Grid/grid1.cc (1.5): Ensure that all exception tests emit
+ noisy messages. Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:11 Matthew Mundell
+
+ * tests/Grid/equals1.cc (1.3): Add tests to cover the rest of
+ Grid::quick_equivalence_test(). Move variables to a local
+ namespace.
+
+2006-01-31 Tuesday 19:09 Matthew Mundell
+
+ * tests/Grid/bounds1.cc (1.3): Add space dimension exception test.
+
+2006-01-31 Tuesday 19:08 Matthew Mundell
+
+ * tests/Grid/: addgenerator1.cc (1.5), addspacedims1.cc (1.4),
+ addspacedims2.cc (1.4), concatenate1.cc (1.4), congruence1.cc
+ (1.4), grid3.cc (1.4), griddifference1.cc (1.4), join1.cc (1.4),
+ join3.cc (1.4), relations1.cc (1.5): Ensure that all exception
+ tests emit noisy messages and exit correctly.
+
+2006-01-31 Tuesday 19:05 Matthew Mundell
+
+ * tests/Grid/addcongruences1.cc (1.5): Add tests that exercise the
+ case in minimize() where both systems are up-to-date.
+
+2006-01-31 Tuesday 19:03 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (1.5): Replace the empty check in the
+ minimize() case where both systems are up-to-date with an
+ assertion that the congruence system is empty.
+
+2006-01-31 Tuesday 13:20 Matthew Mundell
+
+ * tests/Grid/removespacedims2.cc (1.3): Add tests where: the
+ resulting grid is the zero dimension universe, the resulting grid
+ is the same, a space dimension exception is thrown.
+
+2006-01-31 Tuesday 13:18 Matthew Mundell
+
+ * tests/Grid/removespacedims1.cc (1.3): Add tests of: the exception
+ case, passing the empty variable set and an outcome of a zero
+ dimension universe.
+
+2006-01-31 Tuesday 13:16 Matthew Mundell
+
+ * tests/Grid/: expandspacedim1.cc (1.3), foldspacedims1.cc (1.3):
+ Add tests of exception cases.
+
+2006-01-31 Tuesday 13:10 Matthew Mundell
+
+ * tests/Grid/concatenate1.cc (1.3): Add possible space dimension
+ exception test.
+
+2006-01-31 Tuesday 13:09 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.4): Correct exception message in
+ expand_space_dimension.
+
+2006-01-31 Tuesday 13:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_chdims.cc (simplex.1): file Grid_chdims.cc was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-30 Monday 20:00 Matthew Mundell
+
+ * tests/Grid/: addspacedims1.cc (1.3), addspacedims2.cc (1.3):
+ Update tests to always call find_variation only once, directly
+ after the operation under test. Add tests with space dimension
+ exceptions, zero dimension universes, minimized congruences, and
+ out-of-date congruences with minimized generators.
+
+2006-01-30 Monday 19:54 Matthew Mundell
+
+ * src/Grid_chdims.cc (1.3): Update add_space_dimensions_and_project
+ to adjust dim_kinds when generators are out of date and
+ congruences are minimized.
+
+2006-01-30 Monday 18:06 Matthew Mundell
+
+ * tests/Grid/certificate1.cc (1.3): Add test7 where the minimized
+ generators are used for the Grid_Certificate construction.
+
+2006-01-30 Monday 18:04 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (1.7): Correct the Grid class friend
+ declaration comment.
+
+2006-01-30 Monday 13:26 Matthew Mundell
+
+ * src/Grid_conversion.cc (1.4): Update lower_triangular and
+ upper_triangular to check that the diagonal is positive and to
+ correctly check for squareness when there are virtual rows.
+
+2006-01-30 Monday 11:30 Matthew Mundell
+
+ * tests/Grid/widening1.cc (1.3): Add exception testing test test16.
+ Add test17 where minimizing the first congruence system finds
+ the grid empty.
+
+2006-01-30 Monday 11:29 Matthew Mundell
+
+ * tests/Grid/limitedextrapolation1.cc (1.3): Add exception tests.
+ Add test15, which limits with an empty congruence system.
+
+2006-01-30 Monday 11:27 Matthew Mundell
+
+ * src/Grid_widenings.cc (1.3): Correct the exception message in
+ method widening_assign.
+
+2006-01-30 Monday 10:03 Matthew Mundell
+
+ * tests/Grid/join3.cc (1.3): Add test of space dimension exception.
+
+2006-01-30 Monday 10:02 Matthew Mundell
+
+ * tests/Grid/join1.cc (1.3): Add test of space dimension exception.
+ Add test where updating the generators finds the grid empty.
+
+2006-01-30 Monday 10:01 Matthew Mundell
+
+ * tests/Grid/griddifference1.cc (1.3): Update some tests to call
+ difference_assign instead of grid_difference_assign. Add space
+ dimension exception test.
+
+2006-01-30 Monday 10:00 Matthew Mundell
+
+ * tests/Grid/: generalizedaffinepreimage1.cc (1.3),
+ generalizedaffinepreimage2.cc (1.3): Add tests with zero
+ denominator parameters, negative moduli and space dimension
+ exceptions.
+
+2006-01-30 Monday 09:59 Matthew Mundell
+
+ * tests/Grid/: affineimage1.cc (1.3), affinepreimage1.cc (1.3),
+ generalizedaffineimage1.cc (1.3), generalizedaffineimage2.cc
+ (1.3): Add tests with zero denominator parameters and space
+ dimension exceptions.
+
+2006-01-30 Monday 09:56 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (1.4): Add tests for adding to an
+ empty grid.
+
+2006-01-30 Monday 09:55 Matthew Mundell
+
+ * tests/Grid/addcongruences1.cc (1.4): Add tests for adding an
+ empty system and adding a trivial system to a zero dim grid.
+
+2006-01-30 Monday 09:54 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.5), addgenerators1.cc (1.1): Add
+ addgenerators1, which tests methods that can add multiple
+ generators to a grid.
+
+2006-01-30 Monday 09:52 Matthew Mundell
+
+ * src/Grid_public.cc (1.8): Update add_generator(g) to throw an
+ exception when a parameter is given and the grid is zero
+ dimension empty. Rework the generalized_affine_image(lhs,..) and
+ generalized_affine_preimage(lhs,..) lhs space dimension
+ calculation to aid coverage analysis.
+
+2006-01-30 Monday 09:40 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (1.4): Rename parameters in
+ throw_dimension_incompatible(char*, char*, Grid).
+
+2006-01-29 Sunday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.18): Fixed the build() method in
+ specializations ot template <typename T> struct TFloat.
+
+2006-01-29 Sunday 08:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (ppl-0_8-branch.1): Added missing
+ semicolons.
+
+2006-01-29 Sunday 08:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.17): Added missing semicolons.
+
+2006-01-28 Saturday 22:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Congruence_System.defs.hh (1.5), Grid.defs.hh (1.7),
+ Grid_Generator.defs.hh (1.6), Grid_Generator_System.defs.hh
+ (1.7), Polyhedron.defs.hh (1.293): Revised documentation so that
+ sample code has `grid_point' and `grid_line' instead of `point'
+ and `line'. Added an example to Grid_defs.hh showing use of a
+ parameter. Revised explanation of affine image and preimage.
+
+ Corrected some bugs in the explanation of affine image and
+ preimage in Polyhedron.defs.hh.
+
+2006-01-28 Saturday 18:23 Matthew Mundell
+
+ * tests/Grid/grid2.cc (1.3): Add more zero dimension tests.
+
+2006-01-28 Saturday 18:20 Matthew Mundell
+
+ * tests/Grid/: addconstraint1.cc (1.3), addconstraints1.cc (1.3),
+ contains1.cc (1.3), disjoint1.cc (1.3), grid1.cc (1.4), grid3.cc
+ (1.3), intersection1.cc (1.3), timeelapse1.cc (1.3): Add space
+ dimension exception tests.
+
+2006-01-28 Saturday 18:19 Matthew Mundell
+
+ * tests/Grid/addcongruences1.cc (1.3): Add space dimension
+ exception tests. Add test8 which adds to an empty grid.
+
+2006-01-28 Saturday 18:17 Matthew Mundell
+
+ * src/Grid_public.cc (1.7): Update
+ add_recycled_congruences_and_minimize and
+ add_recycled_congruences zero dimension grid cases to always
+ leave the empty grid empty.
+
+2006-01-27 Friday 19:26 Matthew Mundell
+
+ * tests/Grid/topclosed1.cc (1.3): Add test11 where minimizing the
+ congruence system finds the grid empty.
+
+2006-01-27 Friday 19:25 Matthew Mundell
+
+ * tests/Grid/pointed1.cc (1.3): Add a minimal congruence system
+ case to test5. Add test11 where minimizing the congruence system
+ finds the grid empty.
+
+2006-01-27 Friday 19:23 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (1.3): Add space dimension exception
+ test.
+
+2006-01-27 Friday 19:23 Matthew Mundell
+
+ * tests/Grid/bounded1.cc (1.3): Add test13, where a paramter comes
+ first in the system.
+
+2006-01-27 Friday 19:22 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (1.3): Add zero dimension and space
+ dimension exception tests.
+
+2006-01-27 Friday 19:21 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.4), asciidumpload1.cc (1.1),
+ outputoperator1.cc (1.1): Add asciidumpload1 and outputoperator1.
+
+2006-01-27 Friday 14:50 Matthew Mundell
+
+ * src/: Grid_simplify.cc (1.3), Grid.templates.hh (1.2),
+ Grid_Certificate.cc (1.3), Grid_Generator.defs.hh (1.5),
+ Grid_Generator.inlines.hh (1.4), Grid_Generator_System.defs.hh
+ (1.6), Grid_Generator_System.inlines.hh (1.3), Grid_conversion.cc
+ (1.3), Grid_nonpublic.cc (1.3), Grid_public.cc (1.6): Rename
+ Grid_Generator::set_is_parameter to
+ Grid_Generator::set_is_parameter_or_point. Rename
+ Grid_Generator_System methods: num_rows to num_generators,
+ num_rays to num_parameters. Correct a typo in the Grid_Generator
+ class doc.
+
+2006-01-27 Friday 14:43 Matthew Mundell
+
+ * src/Grid.inlines.hh (1.4): Drop the extra
+ topological_closure_assign and difference_assign PPL namespace
+ qualifiers.
+
+2006-01-27 Friday 14:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.inlines.hh (simplex.1): file Grid.inlines.hh was added
+ on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-27 Friday 14:43 Matthew Mundell
+
+ * src/Grid.defs.hh (1.6): Drop the extra rows_are_zero Grid
+ namespace qualifier.
+
+2006-01-27 Friday 14:42 Matthew Mundell
+
+ * doc/devref.doxyconf-latex.in (1.9): Clip trailing whitespace.
+ Add grid-related files.
+
+2006-01-27 Friday 14:41 Matthew Mundell
+
+ * doc/devref.doxyconf-html.in (1.68): Add missing Grid files to
+ INPUT.
+
+2006-01-27 Friday 12:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.192): Use \subsection and not \anchor in
+ grids section of the documentation. Avoid a multiply defined
+ label warning due to label in the powerset section.
+
+2006-01-27 Friday 11:48 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh (1.4), Grid_Generator.inlines.hh
+ (1.3): Take out method topology.
+
+2006-01-27 Friday 11:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh (1.5), Grid.inlines.hh (1.3),
+ Grid.templates.hh (1.1), Makefile.am (1.143): Grid.templates.hh
+ cut out from Grid.inlines.hh as per our standards.
+
+2006-01-27 Friday 10:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.179), src/Congruence_System.defs.hh (1.4),
+ src/Grid.defs.hh (1.4), src/Grid_Generator.defs.hh (1.3),
+ src/Grid_Generator_System.defs.hh (1.5):
+ src/Grid_Generator.defs.hh, src/Grid_Generator_System.defs.hh:
+ Documentation improved. src/Congruence_System.defs.hh: Fixed
+ a cross reference to point to Grid documentation.
+ src/Grid.defs.hh: Improved documentation for affine image.
+
+ TODO: Removed item concerning documentation for grids.
+
+2006-01-27 Friday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/NNC_Polyhedron.inlines.hh (1.32): Added an `inline' function
+ specifier.
+
+2006-01-27 Friday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.inlines.hh (1.30), Determinate.inlines.hh
+ (1.53), Ptr_Iterator.inlines.hh (1.6): Added several `inline'
+ function specifiers.
+
+2006-01-27 Friday 09:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.20),
+ GNU/gnu_pl_check.pl (1.9), SICStus/sp_pl_check.pl (1.7),
+ SWI/swi_pl_check.pl (1.8), XSB/xsb_pl_check.P (1.25),
+ YAP/yap_pl_check.pl (1.11), tests/pl_check.pl (1.31): In the
+ system files, the definition of predicate prolog_system/1
+ modified to return name capitalised to match system file names.
+
+ pl_check.pl: improved extra_noisy output for large numbers.
+ now we print the expression used to generate the large
+ number as well as the number itself.
+
+ When calling prolog_system/1 use capitalised names.
+
+2006-01-26 Thursday 23:26 Matthew Mundell
+
+ * tests/Grid/relations2.cc (1.4): Add test15, of an empty grid,
+ where updating finds the grid empty. Add test16 to test18 which
+ require the GCD calculation in relation_with.
+
+2006-01-26 Thursday 23:24 Matthew Mundell
+
+ * tests/Grid/relations1.cc (1.4): Add zero dim universe test test9.
+
+2006-01-26 Thursday 23:24 Matthew Mundell
+
+ * tests/Grid/isuniverse1.cc (1.3): Update test4 to actually test
+ the empty case. Scrap test10. Add test15 where use of a point
+ is required in is_universe.
+
+2006-01-26 Thursday 23:22 Matthew Mundell
+
+ * tests/Grid/: Makefile.am (1.3), isempty1.cc (1.1): Add isempty1,
+ which tests is_empty().
+
+2006-01-26 Thursday 23:20 Matthew Mundell
+
+ * src/Grid_public.cc (1.5): Simplify the satisfy check case in
+ is_universe.
+
+2006-01-26 Thursday 22:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.templates.hh (simplex.1): file Powerset.templates.hh
+ was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-26 Thursday 22:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.31), doc/devref.doxyconf-html.in (1.67),
+ doc/devref.doxyconf-latex.in (1.8), src/BD_Shape.defs.hh (1.65),
+ src/BD_Shape.inlines.hh (1.123), src/BD_Shape.templates.hh (1.1),
+ src/Makefile.am (1.142), src/Polyhedra_Powerset.defs.hh (1.33),
+ src/Polyhedra_Powerset.inlines.hh (1.39),
+ src/Polyhedra_Powerset.templates.hh (1.1), src/Powerset.defs.hh
+ (1.24), src/Powerset.inlines.hh (1.16), src/Powerset.templates.hh
+ (1.1): From now on we will use source files named *.templates.hh
+ for the non-inline definitions of all class template members and
+ all (member or non-member) function templates that are not fully
+ specialized.
+
+2006-01-26 Thursday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.31): Tests reordered so as to avoid a
+ compiler warning.
+
+2006-01-26 Thursday 21:32 Matthew Mundell
+
+ * tests/Grid/relations2.cc (1.3): Add test14, of the space
+ dimension exception. Add more complex false congruence cases to
+ test7.
+
+2006-01-26 Thursday 21:30 Matthew Mundell
+
+ * tests/Grid/relations1.cc (1.3): Add test8, of the space dimension
+ exception.
+
+2006-01-26 Thursday 21:29 Matthew Mundell
+
+ * tests/Grid/mincongruences1.cc (1.3): Add test8, of an empty grid
+ where updating the congruences finds the grid empty.
+
+2006-01-26 Thursday 21:29 Matthew Mundell
+
+ * tests/Grid/grid1.cc (1.3): Add test23, to test the assignment of
+ a zero dim universe grid.
+
+2006-01-26 Thursday 21:28 Matthew Mundell
+
+ * tests/Grid/: generators1.cc (1.3), mingenerators1.cc (1.3): Add
+ test9, of an empty grid where updating the generators finds the
+ grid empty.
+
+2006-01-26 Thursday 21:27 Matthew Mundell
+
+ * src/Grid_public.cc (1.4): Improve the relation_with(cg) zero dim
+ case a little.
+
+2006-01-26 Thursday 18:25 Matthew Mundell
+
+ * src/Grid_minimize.cc (1.3), src/Makefile.am (1.141),
+ doc/devref.doxyconf-html.in (1.66): Complete the integration of
+ the Grid minimize methods into their callers.
+
+2006-01-26 Thursday 16:00 Matthew Mundell
+
+ * src/Congruence.cc (1.3): Take old alternative code out of
+ ascii_load.
+
+2006-01-26 Thursday 14:50 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (1.4): Correct typo in
+ add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:58 Matthew Mundell
+
+ * doc/definitions.dox (1.191): Update anchor names in references in
+ the grids sections.
+
+2006-01-26 Thursday 13:56 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (1.3): Correct
+ add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:56 Matthew Mundell
+
+ * src/Grid.defs.hh (1.3): Neaten some doc formatting. Align the
+ class description as in Polyhedron. Update reference names in
+ docs. Improve docs related to covering boxes.
+
+2006-01-26 Thursday 13:52 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (1.3): Correct
+ add_unit_rows_and_columns doc. Correct ref in affine_preimage
+ doc.
+
+2006-01-26 Thursday 12:26 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.57): Added missing inline.
+
+2006-01-26 Thursday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.178): Old stuff removed or shortened.
+
+2006-01-25 Wednesday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.45), src/Makefile.am (1.140): Updated for PPL 0.9.
+
+2006-01-25 Wednesday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.207): Version number bumped.
+
+2006-01-25 Wednesday 21:57 Matthew Mundell
+
+ * TODO (1.177): Complete some grid items, move rest into section 1.
+
+2006-01-25 Wednesday 21:56 Matthew Mundell
+
+ * src/Grid_public.cc (1.3): Convert final FIX to a FIXME.
+
+2006-01-25 Wednesday 21:46 Matthew Mundell
+
+ * tests/Makefile.am (1.250): Reorder the directories in SUBDIRS.
+
+2006-01-25 Wednesday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.176): Done items removed. The need for C and Prolog
+ interfaces concerns all domains, not just grids.
+
+2006-01-25 Wednesday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.in (grids.4): Makefile.in is automatically
+ generated: it should not be under CVS.
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/.cvsignore (altnum.1): file .cvsignore was added on
+ branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/.cvsignore (simplex.1): file .cvsignore was added on
+ branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.types.hh (altnum.1): file Congruence.types.hh was
+ added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence.types.hh (simplex.1): file Congruence.types.hh was
+ added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.types.hh (altnum.1): file
+ Congruence_System.types.hh was added on branch altnum on
+ 2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Congruence_System.types.hh (simplex.1): file
+ Congruence_System.types.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.types.hh (altnum.1): file Grid.types.hh was added on
+ branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid.types.hh (simplex.1): file Grid.types.hh was added on
+ branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.inlines.hh (altnum.1): file
+ Grid_Certificate.inlines.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.inlines.hh (simplex.1): file
+ Grid_Certificate.inlines.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.types.hh (altnum.1): file
+ Grid_Certificate.types.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Certificate.types.hh (simplex.1): file
+ Grid_Certificate.types.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.types.hh (altnum.1): file
+ Grid_Generator.types.hh was added on branch altnum on 2006-10-29
+ 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator.types.hh (simplex.1): file
+ Grid_Generator.types.hh was added on branch simplex on 2006-05-08
+ 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.types.hh (altnum.1): file
+ Grid_Generator_System.types.hh was added on branch altnum on
+ 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Generator_System.types.hh (simplex.1): file
+ Grid_Generator_System.types.hh was added on branch simplex on
+ 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.inlines.hh (altnum.1): file
+ Grid_Status.inlines.hh was added on branch altnum on 2006-10-29
+ 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_Status.inlines.hh (simplex.1): file
+ Grid_Status.inlines.hh was added on branch simplex on 2006-05-08
+ 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.types.hh (altnum.1): file
+ Scalar_Products.types.hh was added on branch altnum on 2006-10-29
+ 19:27:15 +0000
+
+2006-01-25 Wednesday 21:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.175), configure.ac (1.206), doc/definitions.dox (1.190),
+ doc/devref.doxyconf-html.in (1.65), src/C_Polyhedron.cc (1.18),
+ src/C_Polyhedron.defs.hh (1.41), src/Congruence.cc (1.2),
+ src/Congruence.defs.hh (1.2), src/Congruence.inlines.hh (1.2),
+ src/Congruence.types.hh (1.2), src/Congruence_System.cc (1.2),
+ src/Congruence_System.defs.hh (1.2),
+ src/Congruence_System.inlines.hh (1.2),
+ src/Congruence_System.types.hh (1.2), src/Constraint.defs.hh
+ (1.116), src/Determinate.defs.hh (1.62),
+ src/Determinate.inlines.hh (1.52), src/Generator.defs.hh (1.116),
+ src/Generator_System.cc (1.17), src/Generator_System.defs.hh
+ (1.15), src/Grid.defs.hh (1.2), src/Grid.inlines.hh (1.2),
+ src/Grid.types.hh (1.2), src/Grid_Certificate.cc (1.2),
+ src/Grid_Certificate.defs.hh (1.2),
+ src/Grid_Certificate.inlines.hh (1.2),
+ src/Grid_Certificate.types.hh (1.2), src/Grid_Generator.cc (1.2),
+ src/Grid_Generator.defs.hh (1.2), src/Grid_Generator.inlines.hh
+ (1.2), src/Grid_Generator.types.hh (1.2),
+ src/Grid_Generator_System.cc (1.2),
+ src/Grid_Generator_System.defs.hh (1.2),
+ src/Grid_Generator_System.inlines.hh (1.2),
+ src/Grid_Generator_System.types.hh (1.2), src/Grid_Status.cc
+ (1.2), src/Grid_Status.idefs.hh (1.2), src/Grid_Status.inlines.hh
+ (1.2), src/Grid_chdims.cc (1.2), src/Grid_conversion.cc (1.2),
+ src/Grid_minimize.cc (1.2), src/Grid_nonpublic.cc (1.2),
+ src/Grid_public.cc (1.2), src/Grid_simplify.cc (1.2),
+ src/Grid_widenings.cc (1.2), src/Linear_Expression.cc (1.10),
+ src/Linear_Expression.defs.hh (1.20), src/Linear_Row.inlines.hh
+ (1.11), src/Makefile.am (1.139), src/NNC_Polyhedron.cc (1.18),
+ src/NNC_Polyhedron.defs.hh (1.44), src/Polyhedra_Powerset.defs.hh
+ (1.32), src/Polyhedra_Powerset.inlines.hh (1.38),
+ src/Polyhedron.defs.hh (1.292), src/Polyhedron_nonpublic.cc
+ (1.64), src/Polyhedron_public.cc (1.72), src/Scalar_Products.cc
+ (1.4), src/Scalar_Products.defs.hh (1.5),
+ src/Scalar_Products.inlines.hh (1.3),
+ src/Scalar_Products.types.hh (1.3), src/globals.defs.hh (1.35),
+ tests/Makefile.am (1.249), tests/ppl_test.hh (1.32),
+ tests/print.cc (1.19), tests/print.hh (1.23),
+ tests/BD_Shape/Makefile.am (1.33), tests/Grid/.cvsignore (1.2),
+ tests/Grid/Makefile.am (1.2), tests/Grid/addcongruence1.cc (1.2),
+ tests/Grid/addcongruences1.cc (1.2), tests/Grid/addconstraint1.cc
+ (1.2), tests/Grid/addconstraints1.cc (1.2),
+ tests/Grid/addgenerator1.cc (1.2), tests/Grid/addspacedims1.cc
+ (1.2), tests/Grid/addspacedims2.cc (1.2),
+ tests/Grid/affinedim1.cc (1.2), tests/Grid/affineimage1.cc (1.2),
+ tests/Grid/affinepreimage1.cc (1.2), tests/Grid/bhz03widening1.cc
+ (1.2), tests/Grid/bounded1.cc (1.2), tests/Grid/boundingbox1.cc
+ (1.2), tests/Grid/boundingbox2.cc (1.2), tests/Grid/bounds1.cc
+ (1.2), tests/Grid/certificate1.cc (1.2),
+ tests/Grid/concatenate1.cc (1.2), tests/Grid/congruence1.cc
+ (1.2), tests/Grid/congruences1.cc (1.2),
+ tests/Grid/congruencesystem1.cc (1.2),
+ tests/Grid/congruencesystem2.cc (1.2), tests/Grid/contains1.cc
+ (1.2), tests/Grid/contains2.cc (1.2),
+ tests/Grid/copyconstruct1.cc (1.2), tests/Grid/coveringbox1.cc
+ (1.2), tests/Grid/coveringbox2.cc (1.2), tests/Grid/disjoint1.cc
+ (1.2), tests/Grid/equals1.cc (1.2), tests/Grid/expandspacedim1.cc
+ (1.2), tests/Grid/foldspacedims1.cc (1.2),
+ tests/Grid/generalizedaffineimage1.cc (1.2),
+ tests/Grid/generalizedaffineimage2.cc (1.2),
+ tests/Grid/generalizedaffinepreimage1.cc (1.2),
+ tests/Grid/generalizedaffinepreimage2.cc (1.2),
+ tests/Grid/generator1.cc (1.2), tests/Grid/generators1.cc (1.2),
+ tests/Grid/grid1.cc (1.2), tests/Grid/grid1_16.cc (1.2),
+ tests/Grid/grid1_64.cc (1.2), tests/Grid/grid1_gmp.cc (1.2),
+ tests/Grid/grid2.cc (1.2), tests/Grid/grid2_16.cc (1.2),
+ tests/Grid/grid3.cc (1.2), tests/Grid/griddifference1.cc (1.2),
+ tests/Grid/intersection1.cc (1.2), tests/Grid/intersection2.cc
+ (1.2), tests/Grid/isuniverse1.cc (1.2), tests/Grid/join1.cc
+ (1.2), tests/Grid/join2.cc (1.2), tests/Grid/join3.cc (1.2),
+ tests/Grid/limitedextrapolation1.cc (1.2),
+ tests/Grid/mapspacedims1.cc (1.2), tests/Grid/maxmin1.cc (1.2),
+ tests/Grid/membytes1.cc (1.2), tests/Grid/membytes2.cc (1.2),
+ tests/Grid/mincongruences1.cc (1.2), tests/Grid/mingenerators1.cc
+ (1.2), tests/Grid/pointed1.cc (1.2), tests/Grid/relations1.cc
+ (1.2), tests/Grid/relations2.cc (1.2),
+ tests/Grid/removespacedims1.cc (1.2),
+ tests/Grid/removespacedims2.cc (1.2), tests/Grid/timeelapse1.cc
+ (1.2), tests/Grid/timeelapse2.cc (1.2), tests/Grid/topclosed1.cc
+ (1.2), tests/Grid/topclosure1.cc (1.2), tests/Grid/widening1.cc
+ (1.2), tests/Grid/writecongruencesystem.cc (1.2),
+ tests/Polyhedron/Makefile.am (1.46),
+ tests/Polyhedron/addcongruence1.cc (1.2),
+ tests/Polyhedron/addcongruence2.cc (1.2),
+ tests/Polyhedron/addcongruence3.cc (1.2),
+ tests/Polyhedron/addcongruence4.cc (1.2),
+ tests/Polyhedron/addcongruence5.cc (1.2),
+ tests/Polyhedron/addcongruences1.cc (1.2),
+ tests/Polyhedron/addcongruences2.cc (1.2),
+ tests/Polyhedron/addcongruences3.cc (1.2),
+ tests/Polyhedron/addcongruences4.cc (1.2),
+ tests/Polyhedron/addcongruences5.cc (1.2),
+ tests/Polyhedron/congruences1.cc (1.2): First (and, quite likely,
+ last) merge from the `grids' branch.
+
+2006-01-25 Wednesday 19:31 Matthew Mundell
+
+ * ChangeLog, Makefile.am, NEWS, README, README.configure, TODO,
+ configure.ac, ppl.spec.in, Watchdog/CREDITS, Watchdog/ChangeLog,
+ Watchdog/NEWS, Watchdog/README, debian/Makefile.am,
+ debian/changelog, debian/control, debian/control.prologs,
+ debian/libppl-gprolog.links, debian/libppl-sicstus.links,
+ debian/libppl-swi.links, debian/libppl-yap.links, debian/rules,
+ doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, interfaces/C/ppl_c.h.in,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ m4/ac_check_swi_prolog.m4, m4/ppl.m4, src/BDS_Status.idefs.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+ src/C_Polyhedron.defs.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint_System.defs.hh,
+ src/DB_Matrix.defs.hh, src/DB_Row.defs.hh,
+ src/Determinate.defs.hh, src/Float.defs.hh,
+ src/GMP_Integer.types.hh, src/Generator.defs.hh,
+ src/Generator_System.defs.hh, src/H79_Certificate.defs.hh,
+ src/Init.defs.hh, src/Interval.defs.hh, src/LP_Problem.defs.hh,
+ src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+ src/Linear_Row.defs.hh, src/Linear_System.defs.hh,
+ src/Makefile.am, src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+ src/Ph_Status.idefs.hh, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedron.defs.hh, src/Powerset.defs.hh,
+ src/Powerset.inlines.hh, src/Powerset.types.hh,
+ src/Ptr_Iterator.defs.hh, src/Result.defs.hh,
+ src/Rounding_Dir.defs.hh, src/Row.defs.hh,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Row.defs.hh,
+ src/Scalar_Products.defs.hh, src/Topology.hh,
+ src/Variable.defs.hh, src/Widening_Function.defs.hh,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+ src/checked_numeric_limits.hh, src/compiler.hh,
+ src/globals.defs.hh, src/globals.types.hh,
+ src/mp_numeric_limits.hh, src/namespaces.hh, src/version.hh.in,
+ tests/Makefile.am, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/universe1.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/writepolyhedron3.cc
+ (grids.[3,6,6,4,4,19,10,3,1,3,2,3,2,3,3,3,2,2,2,2,3,11,8,4,6,4,7,5,6,5,5,3,5,8,8,4,5,5,12,10,3,2,6,11,6,4,6,6,5,4,18,13,5,4,4,3,3,12,7,5,14,9,5,4,3,3,8,10,3,4,2,3,5,4,9,3,4,6,2,4,4,7,11,5,7,6,3,7,4,4,3,3,6,10,3,3,3,3,3,4,3,4,3,3]):
+ Eighth and last merge from the main trunk.
+
+2006-01-25 Wednesday 16:34 Matthew Mundell
+
+ * tests/Grid/generalizedaffinepreimage2.cc (grids.6): Correct the
+ expected results in test17, test18, test21 and test22.
+
+2006-01-25 Wednesday 16:33 Matthew Mundell
+
+ * tests/Grid/generalizedaffinepreimage1.cc (grids.7): Enable test6
+ and test7, and adjust their expected results.
+
+2006-01-25 Wednesday 16:32 Matthew Mundell
+
+ * tests/Grid/generalizedaffineimage2.cc (grids.7): Correct the
+ expected result in test18.
+
+2006-01-25 Wednesday 16:31 Matthew Mundell
+
+ * src/Grid_public.cc (grids.138): Correct the
+ generalized_affine_preimage(lhs,..) case where variables in lhs
+ also occur in rhs.
+
+2006-01-25 Wednesday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.64): Always link with
+ the PIC version of ppl_sicstus_sd.o.
+
+2006-01-25 Wednesday 12:57 Matthew Mundell
+
+ * src/Grid_public.cc (grids.137): Replace the first
+ generalized_affine_preimage(lhs,..) line-adding call to
+ add_recycled_generators with equivalent code, as in
+ generalized_affine_image(lhs,..). Neaten TODO comments.
+
+2006-01-25 Wednesday 12:48 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.42): Add a simple comment for the
+ invert-transpose loops in both conversions.
+
+2006-01-24 Tuesday 21:54 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.41): Improve the comments on the
+ destination initialization in the conversion methods.
+
+2006-01-24 Tuesday 21:33 Matthew Mundell
+
+ * src/: Checked_Number.defs.hh (1.68), Checked_Number.inlines.hh
+ (1.56), GMP_Integer.defs.hh (1.19), GMP_Integer.inlines.hh
+ (1.14), checked.defs.hh (1.34), checked.inlines.hh (1.30),
+ checked_ext.defs.hh (1.10), checked_ext.inlines.hh (1.28),
+ checked_float.inlines.hh (1.56), checked_int.inlines.hh (1.44),
+ checked_mpz.inlines.hh (1.35): Add function
+ gcdext_assign(to,x,y,s,t) to the GMP and checked integer types.
+
+2006-01-24 Tuesday 16:54 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.40): Slightly improve comments,
+ error messages and formatting.
+
+2006-01-24 Tuesday 13:33 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.39): Improve comments in both
+ conversion methods.
+
+2006-01-24 Tuesday 11:52 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.38): Correct the comment in both
+ conversions about the iteration of source_index and dest_index.
+
+2006-01-24 Tuesday 11:37 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.37): Leave variable name
+ tem_source_index as such.
+
+2006-01-24 Tuesday 00:20 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_simplify.cc (grids.[100,62]): Update
+ simplify(gs..) to expect the reduction to result in a system
+ containing a point.
+
+2006-01-23 Monday 23:38 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.61): Note a possible todo item in the
+ congruence simplify method.
+
+2006-01-23 Monday 23:35 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.60): Update
+ reduce_congruence_with_equality to set the `row' element at
+ `column' directly and to account for `row' elements known to be
+ zero. Improve variable names in same method.
+
+2006-01-23 Monday 23:28 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.59): Update
+ reduce_parameter_with_line to set the `row' element at `column'
+ directly and to account for `row' elements known to be zero.
+
+2006-01-23 Monday 22:52 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.58): Clean comments and improve
+ variable names in the reduce methods. Update these methods to
+ all subtract the pivot from the row (intead of the other way
+ around).
+
+2006-01-23 Monday 22:47 Matthew Mundell
+
+ * src/Grid_public.cc (grids.136): Update minimized_congruences and
+ Grid::Grid(n,k) to recover the congruence system minimal form
+ when inserting the zero dimension integrality.
+
+2006-01-23 Monday 22:41 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence.cc (grids.[44,23]):
+ Correct a comment in sign_normalize. Update normalize to always
+ normalize the constant term, even when all homogeneous terms are
+ zero.
+
+2006-01-23 Monday 17:44 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (grids.28): Move swap into the
+ public section. Improve the has_a_free_dimension doc a little.
+
+2006-01-23 Monday 16:21 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.99): Correct the description of
+ reduce_parameter_with_line.
+
+2006-01-23 Monday 15:04 Matthew Mundell
+
+ * TODO (grids.18): Complete the ascii_dump item.
+
+2006-01-23 Monday 12:33 Matthew Mundell
+
+ * src/Grid_public.cc (grids.135): Move the gs space dimension
+ adjustment in add_recycled_generators to the empty case.
+
+2006-01-23 Monday 12:31 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[16,25]):
+ Update coefficient_swap to account for the divisor element and
+ the sizes of the two generators.
+
+2006-01-22 Sunday 22:39 Matthew Mundell
+
+ * src/Generator_System.defs.hh (grids.12): Take out the Grid friend
+ declaration.
+
+2006-01-22 Sunday 22:38 Matthew Mundell
+
+ * tests/Grid/addconstraint1.cc (grids.3): Correct test name in
+ message.
+
+2006-01-22 Sunday 22:38 Matthew Mundell
+
+ * src/: Grid_simplify.cc, Grid.defs.hh, Grid_public.cc
+ (grids.[57,98,134]): Reduce dependence on the Congruence_System
+ (cgs) Grid friend declaration:
+
+ Update relation_with to use cgs::inhomogeneous_term, is_pointed
+ to
+ use cgs::has_a_free_dimension, add_recycled_congruences to use
+ cgs::recycling_insert, and
+ add_recycled_congruences_and_minimize to
+ use cgs::insert(cgs).
+
+ Reduce dependence on the Generator_System Grid friend
+ declaration: update OK to use is_equal_to and convert function
+ rows_are_zero to a static template method.
+
+ Correct the num_cols init in reduce_parameter_with_line.
+
+2006-01-22 Sunday 22:26 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.13): Update select_wider_congruences
+ to use Congruence::is_equal_at_dimension.
+
+2006-01-22 Sunday 22:25 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.31): Reduce dependence on
+ Congruence_System's Grid friend declaration: update both
+ add_space_dimension_and_project methods to use
+ Congruence_System::add_unit_rows_and_columns and update
+ concatenate_assign to use Congruence_System::concatenate.
+
+2006-01-22 Sunday 22:18 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.28): Declare old_num_rows in
+ recycling_insert const.
+
+2006-01-22 Sunday 22:18 Matthew Mundell
+
+ * src/: Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[22,13]): Add wrapper
+ methods for Linear_System and Matrix methods used in Grid:
+ permute_columns, erase_to_end, num_columns, resize_no_copy,
+ set_index_first_pending_row, and unset_pending_rows.
+
+2006-01-22 Sunday 22:15 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.23): Correct
+ is_equal_at_dimension.
+
+2006-01-22 Sunday 22:15 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[43,27]): Add methods is_equal_to(cgs),
+ recycling_insert(cgs), add_unit_rows_and_columns(k),
+ concatenate(cgs) and has_a_free_dimension(). Rename method
+ add_rows to insert, updating it to add columns as required and
+ moving it to the public section.
+
+2006-01-22 Sunday 22:01 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[40,22]):
+ Add is_equal_at_dimension. Improve Grid friend declaration
+ comment.
+
+2006-01-22 Sunday 21:34 Matthew Mundell
+
+ * src/Congruence.cc (grids.22): Update operator<< to use
+ Coefficient_zero() for zero.
+
+2006-01-22 Sunday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.cc (1.56): Print objects of class Coefficient as
+ such.
+
+2006-01-22 Sunday 15:29 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.56): Simplify the
+ reduce_line_with_line comment. Clean up a few comments the other
+ reduce_x_with_x methods.
+
+2006-01-22 Sunday 13:29 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.55): Update reduce_line_with_line and
+ reduce_equality_with_equality to set the column'th element of row
+ directly.
+
+2006-01-21 Saturday 20:49 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.54): Take out of
+ reduce_parameter_with_line a query about an existing improvement.
+
+2006-01-21 Saturday 20:45 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.53): Update
+ reduce_equality_with_equality and reduce_line_with_line to
+ account for columns that are known to be zero.
+
+2006-01-21 Saturday 20:33 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.97): Improve the description of the col
+ parameter in some of the reduction methods.
+
+2006-01-21 Saturday 19:50 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.96): Improve the description of
+ reduce_line_with_line a little.
+
+2006-01-21 Saturday 19:39 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_simplify.cc (grids.[95,52]): Update
+ reduce_pc_with_pc to take arguments `start' and `end' instead of
+ using a `parameters' argument to calculate the start and end of
+ the relevant portions of the rows.
+
+2006-01-21 Saturday 19:29 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.42): Improve a comment in
+ normalize_moduli.
+
+2006-01-21 Saturday 18:19 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.67), Checked_Number.inlines.hh
+ (1.55): Simplified Checked and Native mixing.
+
+2006-01-20 Friday 23:53 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.51): Update reduce_pc_with_pc to set
+ the column'th element of both row and pivot directly.
+
+2006-01-20 Friday 23:26 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.50): Correct a comment in the
+ generator system simplify.
+
+2006-01-20 Friday 23:21 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.49): Update reduce_pc_with_pc to skip
+ the trailing or leading columns that are known to be zero.
+
+2006-01-20 Friday 22:16 Matthew Mundell
+
+ * src/Grid_public.cc (grids.133): Inline the addition of the
+ congruence in the case where lhs is a constant.
+
+2006-01-20 Friday 18:44 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.48): Add a rough query to
+ reduce_pc_with_pc.
+
+2006-01-20 Friday 18:37 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, grid2_16.cc, grid4.cc (grids.[60,1,3]):
+ Rename grid4 to grid2_16.
+
+2006-01-20 Friday 18:34 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.22): Improve the comment about
+ cong_test4.
+
+2006-01-20 Friday 18:08 Matthew Mundell
+
+ * tests/Grid/: grid1.cc, grid1_16.cc (grids.[28,2]): Move grid1
+ test11 and test14 into grid1_16. Describe grid1_16 test1.
+
+2006-01-20 Friday 17:43 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, grid1.cc, grid1_16.cc
+ (grids.[59,27,1]): Add grid1_16, for tests that require integers
+ of at least 16 bits. Move grid1 test8 into grid1_16.
+
+2006-01-20 Friday 17:33 Matthew Mundell
+
+ * debian/: control (ppl-0_8-branch.1), control (1.13): Update
+ libppl-dev to depend on the system compiler.
+
+2006-01-20 Friday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/control (altnum.1): file control was added on branch
+ altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 14:23 Matthew Mundell
+
+ * debian/rules (ppl-0_8-branch.1): Correct version parsing sed
+ expression.
+
+2006-01-20 Friday 14:17 Matthew Mundell
+
+ * debian/rules (1.10): Correct version parsing sed expression.
+
+2006-01-20 Friday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/rules (altnum.1): file rules was added on branch altnum on
+ 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_8-branch.1): Update version.
+
+2006-01-20 Friday 09:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_8-branch.[2,2]): Mark
+ ChangeLog.
+
+2006-01-20 Friday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog (ppl-0_8-branch.[1,1]): Updated.
+
+2006-01-20 Friday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_8-branch.1): Reflected the fact that some files
+ have been deleted overnight.
+
+2006-01-20 Friday 06:17 Matthew Mundell
+
+ * debian/Makefile.am (grids.1): file Makefile.am was added on
+ branch grids on 2006-01-25 18:31:23 +0000
+
+2006-01-20 Friday 06:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/Makefile.am (1.2): Do not distribute no longer existent
+ files.
+
+2006-01-20 Friday 06:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/Makefile.am (altnum.1): file Makefile.am was added on
+ branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 06:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/Makefile.am (simplex.1): file Makefile.am was added on
+ branch simplex on 2006-05-08 17:15:45 +0000
+
+2006-01-20 Friday 01:06 Matthew Mundell
+
+ * debian/: control.prologs (1.2), libppl-gprolog.links (1.2),
+ libppl-sicstus.links (1.2), libppl-swi.links (1.2),
+ libppl-yap.links (1.2): Clear out Prolog configuration files.
+
+2006-01-20 Friday 01:00 Matthew Mundell
+
+ * debian/rules (1.9): Use the system C and C++ compilers.
+
+2006-01-20 Friday 01:00 Matthew Mundell
+
+ * debian/control (1.12): Revert to the stable distribution (sarge)
+ dependencies.
+
+2006-01-20 Friday 00:59 Matthew Mundell
+
+ * debian/changelog (1.3): Add entry for 0.8 release.
+
+2006-01-20 Friday 00:25 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (grids.21): Improve the
+ add_universe_rows_and_columns description.
+
+2006-01-20 Friday 00:24 Matthew Mundell
+
+ * doc/devref.doxyconf-html.in (grids.7): Add to INPUT classes
+ Grid_Generator, Grid_Generator_System, Grid_Certificate and file
+ Grid_widenings.cc.
+
+2006-01-19 Thursday 20:23 Matthew Mundell
+
+ * tests/Makefile.am (grids.5): Run the grid tests before the
+ others.
+
+2006-01-19 Thursday 18:24 Matthew Mundell
+
+ * tests/BD_Shape/Makefile.am (grids.9): Correct temporary
+ BD_SHAPE_INSTANCE values.
+
+2006-01-19 Thursday 16:59 Matthew Mundell
+
+ * tests/BD_Shape/Makefile.am (grids.8): Temporarily modify to run
+ the tests once, with BD_SHAPE_INSTANCE set according to
+ --enable-coefficients, to speed the build machine test cycle.
+
+2006-01-19 Thursday 13:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.64), src/BD_Shape.inlines.hh (1.122),
+ tests/BD_Shape/cc76narrowing1.cc (1.7),
+ tests/BD_Shape/cc76narrowing2.cc (1.7),
+ tests/BD_Shape/cc76narrowing3.cc (1.7),
+ tests/BD_Shape/cc76narrowing4.cc (1.8),
+ tests/BD_Shape/cc76narrowing5.cc (1.8): Corrected implementation
+ and documentation of CC76_narrowing_assign() so as to match the
+ order of arguments already used in all the widening and
+ extrapolation operators.
+
+2006-01-19 Thursday 12:45 Matthew Mundell
+
+ * tests/Grid/limitedextrapolation1.cc (grids.7): Insert a second
+ token test as test9.
+
+2006-01-19 Thursday 11:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.174): Added an item.
+
+2006-01-19 Thursday 11:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.154): Added a missing
+ full stop.
+
+2006-01-19 Thursday 11:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.defs.hh (1.43): Corrected a couple of
+ comments.
+
+2006-01-19 Thursday 11:11 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, grid1.cc, grid1_64.cc
+ (grids.[58,26,1]): Add grid1_64 for tests that require 64 bit or
+ GMP integers. Move grid1 test18 into grid1_64.
+
+2006-01-19 Thursday 10:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh (1.34): Removed spurious quote from the
+ documentation.
+
+2006-01-19 Thursday 10:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.66): Documentation typo fixed.
+
+2006-01-19 Thursday 10:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.63): Corrected several documentation
+ glitches reported by Andrea and David.
+
+2006-01-19 Thursday 10:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.51): "base blocks" --> "basic blocks".
+
+2006-01-18 Wednesday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.118): Avoid a compiler
+ warning.
+
+2006-01-18 Wednesday 18:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.189): Fixed anchor for LeVerge92.
+
+2006-01-18 Wednesday 16:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.9): Fixed the detection of
+ SWI-Prolog version 5.6.0 or later.
+
+2006-01-18 Wednesday 16:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (altnum.1): file ac_check_swi_prolog.m4
+ was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-18 Wednesday 16:25 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, grid1.cc, grid1_gmp.cc
+ (grids.[57,25,1]): Add grid1_gmp for tests expected to pass only
+ with GMP integers. Move grid1 test19 to grid1_gmp.
+
+2006-01-18 Wednesday 13:56 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.47): Add more tracing to
+ reduce_pc_with_pc.
+
+2006-01-18 Wednesday 13:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.153): Another typo
+ fixed.
+
+2006-01-18 Wednesday 13:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.64): Many small improvements to the
+ documentation of the C interface.
+
+2006-01-18 Wednesday 13:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.152): Several small
+ corrections pointed out by Andrea.
+
+2006-01-18 Wednesday 13:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/universe1.cc (1.8),
+ Polyhedron/addconstraints6.cc (1.7),
+ Polyhedron/writepolyhedron3.cc (1.7): "an universe" ==> "a
+ universe".
+
+2006-01-18 Wednesday 13:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.types.hh (1.6): Corrected a typo in the
+ documentation.
+
+2006-01-18 Wednesday 09:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.10): Some old compilers do not
+ fully understand using directives/declarations.
+
+2006-01-17 Tuesday 21:30 Matthew Mundell
+
+ * tests/Grid/congruencesystem1.cc (grids.10): Revert change made
+ during testing.
+
+2006-01-17 Tuesday 20:27 Matthew Mundell
+
+ * tests/Grid/grid4.cc (grids.2): Clear out tracing messages.
+
+2006-01-17 Tuesday 20:26 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, timeelapse1.cc, timeelapse2.cc
+ (grids.[56,7,1]): Add timeelapse2, where the tests are expected
+ to fail with checkedint8. Move timeelapse1 test9 into
+ timeelapse2.
+
+2006-01-17 Tuesday 20:07 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, grid2.cc, grid4.cc (grids.[55,21,1]):
+ Add grid4 for tests of grids created from congruences where the
+ tests are expected to fail with checkedint8. Move grid2 test10
+ into grid4.
+
+2006-01-17 Tuesday 18:24 Matthew Mundell
+
+ * src/Checked_Number.defs.hh (grids.11): Take out the four
+ parameter gcdext_assign declaration.
+
+2006-01-17 Tuesday 17:50 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[21,19]):
+ `incremetality' improved and simplified using by using the new
+ mapping system. Now the Constraint taken by `incrementality' is
+ passed by const reference.
+
+2006-01-17 Tuesday 17:03 Matthew Mundell
+
+ * tests/: ppl_test.hh, Grid/congruencesystem1.cc (grids.[18,9]):
+ Add macro PPL_TEST_STR. Rename macro stringify to PPL_TEST_XSTR,
+ correcting the expansion.
+
+2006-01-17 Tuesday 16:54 Matthew Mundell
+
+ * src/globals.defs.hh (1.33): Correct the macro names in the
+ PPL_STR and PPL_XSTR docs.
+
+2006-01-17 Tuesday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.37), README (1.44), configure.ac (1.205),
+ debian/Makefile.am (1.1): Distribute also the contents of the
+ `debian' subdirectory.
+
+2006-01-17 Tuesday 15:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * Watchdog/CREDITS (1.2): "inexistent" replaced by "non-existent".
+
+2006-01-17 Tuesday 15:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.9): Corrected a name lookup
+ problem for the output operator.
+
+2006-01-17 Tuesday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.43): Updated.
+
+2006-01-17 Tuesday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/README (1.13): Updated.
+
+2006-01-17 Tuesday 13:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.138): Removed no longer necessary definition
+ of DOC_FILES.
+
+2006-01-17 Tuesday 13:43 Matthew Mundell
+
+ * README (1.42): Change "source distributions" to "source
+ distribution".
+
+2006-01-17 Tuesday 12:58 Matthew Mundell
+
+ * README.configure (1.17): Clip trailing whitespace.
+
+2006-01-17 Tuesday 12:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.16), Bounding_Box.defs.hh (1.13),
+ Checked_Number.defs.hh (1.65), Coefficient_traits_template.hh
+ (1.6), DB_Matrix.defs.hh (1.19), DB_Row.defs.hh (1.17),
+ Float.defs.hh (1.17), GMP_Integer.types.hh (1.13), Init.defs.hh
+ (1.15), Interval.defs.hh (1.27), Linear_Row.defs.hh (1.18),
+ Linear_System.defs.hh (1.24), Matrix.defs.hh (1.75),
+ Ph_Status.idefs.hh (1.16), Row.defs.hh (1.104),
+ Saturation_Matrix.defs.hh (1.7), Saturation_Row.defs.hh (1.10),
+ Scalar_Products.defs.hh (1.4), Widening_Function.defs.hh (1.14),
+ checked.defs.hh (1.33), globals.defs.hh (1.32): Added \ingroup
+ Doxygen commands to the documentation of many
+ implementation-related C++ type declarations.
+
+2006-01-17 Tuesday 12:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Powerset.defs.hh (1.23): Do not include (useless) header file
+ <set>. Do directly include header file <iterator>.
+
+2006-01-17 Tuesday 12:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.h.in (1.63), Prolog/Prolog_interface.dox
+ (1.151): Mark the start/stop of \defgroup documentation blocks
+ for readability.
+
+2006-01-17 Tuesday 12:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.64), devref.doxyconf-latex.in
+ (1.7): File globals.types.hh was not considered when building the
+ devref manual.
+
+2006-01-17 Tuesday 12:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.188): Added Doxygen group
+ PPL_CXX_interface.
+
+2006-01-17 Tuesday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.8): Fixed the test of constant
+ reverse iterators.
+
+2006-01-17 Tuesday 10:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Powerset.defs.hh (1.22): Typo's fixed.
+
+2006-01-17 Tuesday 09:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.62), BHRZ03_Certificate.defs.hh (1.15),
+ C_Polyhedron.defs.hh (1.40), Checked_Number.defs.hh (1.64),
+ Coefficient.types.hh (1.12), Constraint.defs.hh (1.115),
+ Constraint_System.defs.hh (1.26), Determinate.defs.hh (1.61),
+ GMP_Integer.types.hh (1.12), Generator.defs.hh (1.115),
+ Generator_System.defs.hh (1.14), H79_Certificate.defs.hh (1.14),
+ LP_Problem.defs.hh (1.7), LP_Problem.types.hh (1.5),
+ Linear_Expression.defs.hh (1.19), NNC_Polyhedron.defs.hh (1.42),
+ Poly_Con_Relation.defs.hh (1.31), Poly_Gen_Relation.defs.hh
+ (1.29), Polyhedra_Powerset.defs.hh (1.31), Polyhedron.defs.hh
+ (1.291), Powerset.defs.hh (1.21), Rounding_Dir.defs.hh (1.10),
+ Topology.hh (1.12), Variable.defs.hh (1.50), globals.defs.hh
+ (1.31), globals.types.hh (1.5), namespaces.hh (1.8),
+ version.hh.in (1.14): Added Doxygen group PPL_CXX_interface.
+ Added all (user-level) C++ namespaces, classes, structs, defines,
+ typedefs and enumerations to the new group.
+
+2006-01-17 Tuesday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (altnum.1): file Rounding_Dir.defs.hh
+ was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-01-17 Tuesday 09:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Result.defs.hh (1.14): Hiding initializers of enumeration
+ Result. try to uniformize the documentation of enumeration
+ values.
+
+2006-01-17 Tuesday 07:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.204): Bump version number.
+
+2006-01-17 Tuesday 07:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.defs.hh (1.20): List the availability of bool
+ operator!=(const D& x, const D& y) among the requirements on D
+ set by the class Powerset<D>.
+
+2006-01-17 Tuesday 07:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.7): Corrected and almost
+ completed.
+
+2006-01-17 Tuesday 06:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.6): Removed spurious
+ redeclaration of ps3 (it broke the build).
+
+2006-01-17 Tuesday 01:35 Matthew Mundell
+
+ * src/Powerset.defs.hh (1.19): Document the requirements for
+ template parameter D.
+
+2006-01-17 Tuesday 01:13 Matthew Mundell
+
+ * tests/Polyhedron/powerset1.cc (1.5): Involve every method of
+ Fcaibvp in the test. Make std::set a private parent of Fcaibvp.
+ Add operator==(Fcaibvp&, Fcaibvp&).
+
+2006-01-16 Monday 22:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.24): Updated.
+
+2006-01-16 Monday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog (1.14): Updated.
+
+2006-01-16 Monday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.187): Revised a couple of items.
+
+2006-01-16 Monday 22:25 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.39): Comment the #endif of the
+ ascii_load doc directive.
+
+2006-01-16 Monday 22:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.186): Improved the paragraph on class BD_Shape<T>.
+
+2006-01-16 Monday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.185): Added some quotations marks.
+
+2006-01-16 Monday 20:55 Matthew Mundell
+
+ * NEWS (1.184): Change "all what is needed" to "all that is needed"
+ and "what is the relation" to "what the relation is".
+
+2006-01-16 Monday 20:50 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.38): Mark the ascii_load doc an
+ implementation detail.
+
+2006-01-16 Monday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.183): Drafted a news item concerning checked numbers.
+
+2006-01-16 Monday 20:00 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence_System.cc,
+ Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+ Grid_Generator.defs.hh, Grid_Generator_System.cc,
+ Grid_Generator_System.defs.hh, Grid_Status.cc,
+ Grid_Status.idefs.hh, Grid_public.cc
+ (grids.[21,37,41,26,94,15,24,27,20,6,7,132]): Convert all grid
+ classes to use the PPL_OUTPUT macros. Update
+ generalized_affine_preimage to prefer pre-decrement. Add a \ref
+ to the Grid_Generator::ascii_load doc.
+
+2006-01-16 Monday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.30): Install gzipped man pages.
+
+2006-01-16 Monday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.29): The `Copyright' tag is no longer supported:
+ use `License' instead.
+
+2006-01-16 Monday 15:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/polypowerset1.cc (1.17): Fixed tests 15 and 16.
+
+2006-01-16 Monday 15:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.16): Fixed test14().
+
+2006-01-16 Monday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.15): Fixed test13().
+
+2006-01-16 Monday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.14): Fixed test12().
+
+2006-01-16 Monday 15:14 Matthew Mundell
+
+ * src/: Checked_Number.defs.hh, Congruence_System.cc,
+ GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Grid_conversion.cc,
+ Grid_nonpublic.cc (grids.[10,40,9,6,36,69]): Clear out the
+ left-overs of the two parameter version of lcm_assign. Always
+ call the three parameter version.
+
+2006-01-16 Monday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: polypowerset1.cc (1.12), polypowerset1.cc
+ (1.13): Fixed test11().
+
+2006-01-16 Monday 15:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.11): Fixed test10().
+
+2006-01-16 Monday 15:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.10): Fixed test6(). Do not
+ use ints when bools are wanted.
+
+2006-01-16 Monday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.41): The PPL now also handles bounded-difference
+ shapes.
+
+2006-01-16 Monday 14:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/polypowerset1.cc (1.9): Tests added.
+
+2006-01-16 Monday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/NEWS (1.8): Release date decided.
+
+2006-01-16 Monday 14:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.182): The section "Integers Represented by Floating Point
+ Numbers" does not belong to the user's manual.
+
+2006-01-16 Monday 14:30 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+ Grid_conversion.cc, Grid_simplify.cc (grids.[23,18,35,46]): Move
+ negate(gg, start, end) to Grid_Generator::negate(start, end).
+
+2006-01-16 Monday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.181): News items reordered. Added a notice for the
+ exchange of unbounded numbers with YAP.
+
+2006-01-16 Monday 14:28 Matthew Mundell
+
+ * src/: Checked_Number.inlines.hh, GMP_Integer.defs.hh,
+ GMP_Integer.inlines.hh (grids.[9,8,5]): Rename the wrapped
+ gcdext_assign function to gcdext_assign_r. Take out the
+ four-parameter gcdext_assign function.
+
+2006-01-16 Monday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.180): Added an item for the new AM_PATH_PPL Autoconf
+ function.
+
+2006-01-16 Monday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl.m4 (1.4): Comparison fixed.
+
+2006-01-16 Monday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl.m4 (altnum.1): file ppl.m4 was added on branch altnum on
+ 2006-10-29 19:27:11 +0000
+
+2006-01-16 Monday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.150): Warn the user
+ about the fact that YAP's support for big numbers is still very
+ young.
+
+2006-01-16 Monday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ppl.m4 (1.3): Error message corrected.
+
+2006-01-16 Monday 12:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Result.defs.hh (1.13): Added brief description for
+ enumeration Result.
+
+2006-01-16 Monday 12:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/namespaces.hh (1.7): Document the Checked namespace (for the
+ devref manula only). Specify once and for all in the std
+ namespace documentation that we are specializing numeric_limits
+ and, in particular, we are temporarily doing it also for GMP
+ types.
+
+2006-01-16 Monday 12:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (1.7): Do not explicitly mention
+ numeric_limits specializations in the user manual.
+
+2006-01-16 Monday 12:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (1.9): Added brief description for
+ enumeration Rounding_Dir; hiding initializers.
+
+2006-01-16 Monday 12:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.12): Specializations of
+ numeric_limits should be explicitly mentioned in the devref
+ manual only.
+
+2006-01-16 Monday 12:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked.defs.hh (1.32): Namespaces should be documented in
+ namespaces.hh. Cut away another redundant documentation block.
+
+2006-01-16 Monday 12:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.74), compiler.hh (1.7): Filter away
+ implementation stuff from the user manual.
+
+2006-01-16 Monday 12:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh (1.30): Fixed documentation for
+ abandon_exponential_computations.
+
+2006-01-16 Monday 12:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Coefficient_traits_template.hh (1.5): The empty traits class
+ is documented in the devref manual only.
+
+2006-01-16 Monday 12:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user.doxyconf-html.in (1.36), user.doxyconf-latex.in (1.8):
+ No longer expanding macros related to specialization of
+ numeric_limits.
+
+2006-01-16 Monday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.63): Comments added/improved.
+
+2006-01-16 Monday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.179): Release date decided. Improved the entry
+ concerning ppl-config.
+
+2006-01-16 Monday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.173): To-do items for PPL 0.8 removed. Remember to
+ complete/write man pages for PPL 0.9.
+
+2006-01-16 Monday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.121): Comment improved.
+
+2006-01-16 Monday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.62): Obsolete comment removed.
+
+2006-01-16 Monday 09:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (1.8): Added brief documentation for
+ class Rounding_Dir.
+
+2006-01-16 Monday 09:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Powerset.defs.hh (1.18), Powerset.inlines.hh (1.15),
+ Powerset.types.hh (1.5): Renamed "Constraint System" as "Domain"
+ as in the definitions.dox. Replaced CS by D everywhere and cs by
+ d. Changed the section heading Member Functions for the Direct
+ Inspection of Disjuncts to Member Functions for the Direct
+ Manipulation of Disjuncts Moved the methods: add_disjunct()
+ drop_disjunct() drop_disjuncts() clear() into this section.
+
+2006-01-16 Monday 09:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.61): Improved the documentation for
+ function input().
+
+2006-01-16 Monday 09:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user.doxyconf-html.in (1.35), user.doxyconf-latex.in (1.7):
+ When producing the user manuals, do not warn for undocumented
+ members.
+
+2006-01-16 Monday 09:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_Row.defs.hh (1.17), Linear_System.defs.hh (1.23),
+ Ptr_Iterator.defs.hh (1.7), Row.defs.hh (1.103): Do not document
+ implementation-related classes in the user manual.
+
+2006-01-16 Monday 02:10 Matthew Mundell
+
+ * BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+ STANDARDS, TODO, config.guess, config.sub, configure.ac,
+ install-sh, instchk.hh, ltmain.sh, ppl.lsm.in, ppl.spec.in,
+ Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+ Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/install-sh, Watchdog/ltmain.sh,
+ Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Makefile.in, Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ debian/changelog, debian/control, debian/control.prologs,
+ debian/libppl-dev.install, debian/libppl-pwl.install,
+ debian/libppl.dirs, debian/libppl.install, debian/rules,
+ demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+ doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl-config.1,
+ doc/ppl.sty, doc/ppl_lcdd.1, doc/ppl_lpsol.1,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int64_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+ m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+ m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+ m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.types.hh, src/Coefficient.cc,
+ src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+ src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+ src/Congruence.cc, src/Congruence.defs.hh,
+ src/Congruence.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+ src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator.types.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+ src/Grid.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, src/Grid_simplify.cc, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.types.hh,
+ src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+ src/Limits.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+ src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+ src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+ src/Result.defs.hh, src/Result.inlines.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/Row.types.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/float.types.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh,
+ src/max_space_dimension.hh, src/minimize.cc,
+ src/mp_numeric_limits.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+ src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+ src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+ tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+ tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+ tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/bdsdifference1.cc,
+ tests/BD_Shape/bdsdifference2.cc,
+ tests/BD_Shape/bdsdifference3.cc,
+ tests/BD_Shape/bdsdifference4.cc,
+ tests/BD_Shape/bdsdifference5.cc,
+ tests/BD_Shape/bdsdifference6.cc,
+ tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+ tests/BD_Shape/bdshull4.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhmz05widening2.cc,
+ tests/BD_Shape/bhmz05widening3.cc,
+ tests/BD_Shape/bhmz05widening4.cc,
+ tests/BD_Shape/bhmz05widening5.cc,
+ tests/BD_Shape/bhmz05widening6.cc,
+ tests/BD_Shape/bhmz05widening7.cc,
+ tests/BD_Shape/bhmz05widening8.cc,
+ tests/BD_Shape/bhz03widening1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc,
+ tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+ tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+ tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+ tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+ tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+ tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+ tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+ tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+ tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+ tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+ tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+ tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+ tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+ tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+ tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedCC76extrapolation1.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation1.cc,
+ tests/BD_Shape/limitedCH78extrapolation2.cc,
+ tests/BD_Shape/limitedCH78extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation4.cc,
+ tests/BD_Shape/limitedCH78extrapolation5.cc,
+ tests/BD_Shape/limitedCH78extrapolation6.cc,
+ tests/BD_Shape/limitedCH78extrapolation7.cc,
+ tests/BD_Shape/limitedCH78extrapolation8.cc,
+ tests/BD_Shape/limitedCH78extrapolation9.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation2.cc,
+ tests/BD_Shape/limitedcc76extrapolation3.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+ tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+ tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+ tests/Polyhedron/CbecomesNNC1.cc,
+ tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage11.cc,
+ tests/Polyhedron/affinepreimage12.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffineimage2.cc,
+ tests/Polyhedron/boundedaffineimage3.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage2.cc,
+ tests/Polyhedron/boundedaffinepreimage3.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/concatenate7.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc,
+ tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage13.cc,
+ tests/Polyhedron/generalizedaffineimage14.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage3.cc,
+ tests/Polyhedron/generalizedaffinepreimage4.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/gramschmidt1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+ tests/Polyhedron/lpproblem3.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/primalsimplex1.cc,
+ tests/Polyhedron/primalsimplex2.cc,
+ tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+ tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+ tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+ tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+ tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+ tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+ tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+ tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+ tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+ tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+ tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+ tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+ utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+ utils/timings.hh
+ (grids.[1,2,5,5,3,3,9,17,4,3,9,3,2,3,1,2,2,3,1,2,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,5,2,3,2,2,2,2,2,2,2,2,2,2,5,2,6,3,10,6,3,2,2,5,2,2,5,3,2,2,2,6,6,2,2,4,3,5,2,5,2,2,3,3,3,4,2,3,2,3,3,5,2,4,2,2,2,2,3,7,2,2,2,4,2,3,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,3,3,4,4,5,2,2,2,2,3,2,2,2,2,2,3,2,2,3,3,2,2,3,3,2,2,2,2,2,2,2,2,4,4,4,4,3,4,4,4,2,2,3,4,3,2,2,2,2,2,2,2,2,3,2,1,4,4,2,7,7,1,3,3,2,1,4,4,4,1,4,4,3,1,3,9,8 [...]
+ Seventh (last but one?) merge of the main trunk to the grids
+ branch.
+
+2006-01-15 Sunday 22:22 Matthew Mundell
+
+ * src/Grid_Generator_System.inlines.hh (grids.12): Update method
+ clear to add the parameter divisor column after clearing. Add
+ notes that the size adjustments in the space dimension returning
+ methods are for the parameter divisor column.
+
+2006-01-15 Sunday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.203): Commented out the code for the
+ --enable-instantiations option (since it does not belong to this
+ release).
+
+2006-01-15 Sunday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.178): Also the C interface is controlled by
+ --enable-interfaces.
+
+2006-01-15 Sunday 22:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.202), demos/ppl_lpsol/Makefile.am (1.20),
+ interfaces/C/Makefile.am (1.23): Allow the C interface not to be
+ built using the --enable-interfaces configure option.
+
+2006-01-15 Sunday 21:57 Matthew Mundell
+
+ * src/checked.inlines.hh (grids.9): Update gcdext_exact to always
+ return errors from functions abs and neg. Describe the COPY_GMP
+ directive.
+
+2006-01-15 Sunday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.172): Powerset::meet_assign() will not be renamed.
+
+2006-01-15 Sunday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.60): Added several Doxygen comments
+ and some vertical space. Fixed a couple of comments.
+
+2006-01-15 Sunday 20:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/DB_Matrix.defs.hh (1.18): Let ascii_load documentation show
+ in the developers' manual only.
+
+2006-01-15 Sunday 20:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BDS_Status.inlines.hh (1.12): Fixed a \relates Doxygen
+ command.
+
+2006-01-15 Sunday 18:48 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.12): Only add the limiting
+ congruences if widening will changes the grid.
+
+2006-01-15 Sunday 17:42 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.45), affinepreimage12.cc (1.1):
+ Add affinepreimage12, which tests the examples from
+ definitions.dox.
+
+2006-01-15 Sunday 17:42 Matthew Mundell
+
+ * tests/Polyhedron/affinepreimage12.cc (grids.1): file
+ affinepreimage12.cc was added on branch grids on 2006-01-16
+ 01:10:40 +0000
+
+2006-01-15 Sunday 16:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/README.doc (1.9): Changed: "all you need is to find it" to
+ "all you need to do is to find it". "to build." to "to be
+ built." determined before"" to "already determined".
+
+2006-01-15 Sunday 16:53 Matthew Mundell
+
+ * src/Checked_Number.defs.hh (1.59): Change "proviso" to
+ "provisos".
+
+2006-01-15 Sunday 16:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/README.doc (1.8): Changed "willing" to "wishing".
+
+2006-01-15 Sunday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.149): Tried to specify
+ which versions of XSB can be expected to work and which not. It
+ is a disaster, but there is little we can do about that.
+
+2006-01-15 Sunday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.44), lpproblem1.cc (1.4),
+ lpproblem3.cc (1.2): Added another test for LP_Problem. Avoid
+ redundnat inclusion in lpproblem1.cc.
+
+2006-01-15 Sunday 14:27 Matthew Mundell
+
+ * tests/Polyhedron/lpproblem1.cc (grids.1): file lpproblem1.cc was
+ added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 14:27 Matthew Mundell
+
+ * tests/Polyhedron/lpproblem3.cc (grids.1): file lpproblem3.cc was
+ added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 13:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.84): Backtracking: XSB does
+ not support 32-bit integers.
+
+2006-01-15 Sunday 12:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.187): Corrected the result for the example
+ on affine preimages as well as a typo, both signaled by Matthew.
+
+2006-01-15 Sunday 11:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.30): Revised tests for
+ ppl_Coefficient_max/1 and ppl_Coefficient_min/1. Reduced the
+ maximum and minimum integer that can be handled by XSB to 2^28-1
+ and -2^28 respectively.
+
+2006-01-15 Sunday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.174): Predicates
+ ppl_Coefficient_min/1 and ppl_Coefficient_max/1 now fail if the
+ respective values are not representable as Prolog integers.
+ Avoid compiler warnings. Indentation fixed.
+
+2006-01-15 Sunday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: SICStus/ppl_sicstus_sd.cc (1.89),
+ YAP/ppl_yap.cc (1.112): Declare and initialize
+ Prolog_min_integer. Avoid a compiler warning.
+
+2006-01-15 Sunday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.117): Initialize
+ Prolog_min_integer and Prolog_max_integer.
+
+2006-01-15 Sunday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/ppl_gprolog_sd.cc (1.37), XSB/ppl_xsb.cc
+ (1.83): Avoid a compiler warning.
+
+2006-01-15 Sunday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.44): Define
+ Prolog_min_integer. Avoid a compiler warning.
+
+2006-01-15 Sunday 09:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.87): Implementation of
+ ppl_Coefficient_is_bounded/0 improved.
+
+2006-01-15 Sunday 03:29 Andrea Cimino
+
+ * tests/Polyhedron/: Makefile.am, lpproblem3.cc (simplex.[4,1]):
+ Added another test for LP_Problem.
+
+2006-01-14 Saturday 22:48 Matthew Mundell
+
+ * doc/definitions.dox (1.186): Revert last change.
+
+2006-01-14 Saturday 22:17 Matthew Mundell
+
+ * doc/definitions.dox (1.185): Replace "there exist a matrix" with
+ "there exists a matrix" in subsection "Images and Preimages of
+ Affine Transfer Relations".
+
+2006-01-14 Saturday 21:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.82): In XSB 2.7.1,
+ <cinterf.h> no longer pollutes the namespace with `min' and
+ `max'. However, in XSB 2.7.1, <error_xsb.h> still does not come
+ with the extern "C" wrapper.
+
+2006-01-14 Saturday 20:30 Matthew Mundell
+
+ * doc/definitions.dox (1.184): Change the first \leq in the affine
+ relation definition in subsection Generalized_Affine_Relations to
+ \relsym.
+
+2006-01-14 Saturday 20:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.148): Removed an
+ obsolete (and actually misleading) sentence about the XSB
+ interface.
+
+2006-01-14 Saturday 19:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.58): Two corrections to the
+ documentation of input(): acceptable bases are in the range 2-36;
+ bases (as well as exponents) are always written as plain base-10
+ integers.
+
+2006-01-14 Saturday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.81): Two FIXMEs turned into
+ TODOs: we can do nothing about them until the XSB people fix
+ their header file.
+
+2006-01-14 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.36): Two FIXMEs turned
+ into TODOs: we can do nothing about them until the GNU Prolog
+ people fix their header file.
+
+2006-01-14 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.43): Two FIXMEs turned into
+ TODOs: we can do nothing about them until the Ciao people fix
+ their header file.
+
+2006-01-14 Saturday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.111): Two FIXME's resolved.
+
+2006-01-14 Saturday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.42): Two FIXMEs resolved.
+
+2006-01-14 Saturday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.171): We are well under 40 FIXMEs. For PPL 0.9 the
+ objective is to go below 20.
+
+2006-01-14 Saturday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: user.doxyconf-html.in (1.34), user.doxyconf-latex.in (1.6):
+ Added PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT
+ to EXPAND_AS_DEFINED.
+
+2006-01-14 Saturday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.30): Extended the section on limiting the visibility
+ of everything. Some material that was in the section about
+ macros has been moved here.
+
+2006-01-14 Saturday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (1.6): Comments revised so as to avoid
+ redundancy.
+
+2006-01-14 Saturday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.11): Macros
+ SPECIALIZE_LIMITS_INT and SPECIALIZE_LIMITS_FLOAT renamed
+ PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT,
+ respectively. They are also undefined as soon as no longer
+ necessary. Partial specializations of std::numeric_limits
+ provided with a Doxygen comment.
+
+2006-01-14 Saturday 16:44 Matthew Mundell
+
+ * NEWS (1.177): Always indent code with two spaces. Convert tabs
+ to spaces.
+
+2006-01-14 Saturday 16:41 Matthew Mundell
+
+ * NEWS (1.176): Correct spelling of "publicly".
+
+2006-01-14 Saturday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.137): Generate ppl.hh simply as a copy of
+ ppl_install.hh. The old kludge to generate ppl.hh has simply
+ been comments out, in case the new method proves to yield worse
+ user documentation (via Doxygen).
+
+2006-01-14 Saturday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.151): FIXME resolved.
+
+2006-01-14 Saturday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/namespaces.hh (1.6): In the documentation of namespace std,
+ specify that we also specialize std::numeric_limits.
+
+2006-01-14 Saturday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (1.5): Specializations for
+ std::numeric_limits commented.
+
+2006-01-14 Saturday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.57): Improved the documentation for
+ input(std::istream&, Checked_Number<T, Policy>&, Rounding_Dir).
+
+2006-01-14 Saturday 15:48 Matthew Mundell
+
+ * Watchdog/NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37 Matthew Mundell
+
+ * Watchdog/NEWS (1.6): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.24): Added three new tests.
+
+2006-01-14 Saturday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.150): Two FIXMEs resolved. Be
+ consistent in the use of assign_r().
+
+2006-01-14 Saturday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.62): Typo fixed.
+
+2006-01-14 Saturday 14:12 Matthew Mundell
+
+ * NEWS (1.175): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 13:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Powerset.defs.hh (1.17), Powerset.inlines.hh (1.14):
+ Iterators for Powerset renamed as omega_iterator and
+ omega_const_iterator. Added corresponding typedefs for the
+ previous naming and documented the typedefs.
+
+2006-01-14 Saturday 13:48 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.56): Added empty fractional to
+ formal syntax.
+
+2006-01-14 Saturday 13:38 Abramo Bagnara
+
+ * src/checked.cc (1.15), tests/Polyhedron/numberinput1.cc (1.23):
+ Allow empty fractional part.
+
+2006-01-14 Saturday 12:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.55): Completed a draft
+ documentation for Result input(std::istream& is,
+ Checked_Number<T, Policy>& x, Rounding_Dir dir).
+
+2006-01-14 Saturday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.174), README (1.40): Reworded a couple of sentences.
+
+2006-01-14 Saturday 08:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.29): Corrected a test for
+ ppl_Coefficient_min/1.
+
+2006-01-13 Friday 22:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README (1.39): Added bullet about linear programming problem
+ solver. Minor language improvements.
+
+2006-01-13 Friday 21:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.10): Cosmetic changes.
+
+2006-01-13 Friday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (1.4): Fixed: all specializations of
+ std::numeric_limits must have the `is_specialized' field set to
+ true.
+
+2006-01-13 Friday 19:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.54): Include
+ "checked_numeric_limits.hh". Long line broken.
+
+2006-01-13 Friday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.173): Do not write
+ std::numeric_limits<const Coefficient>: write
+ std::numeric_limits<Coefficient> instead.
+
+2006-01-13 Friday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/Makefile.am (1.22), C/ppl_c.cc (1.149),
+ Prolog/ppl_prolog.icc (1.172), Prolog/Ciao/Makefile.am (1.52),
+ Prolog/Ciao/ppl_ciao.cc (1.41), Prolog/GNU/Makefile.am (1.52),
+ Prolog/GNU/ppl_gprolog_sd.cc (1.35), Prolog/SICStus/Makefile.am
+ (1.63), Prolog/SICStus/ppl_sicstus_sd.cc (1.88),
+ Prolog/SWI/Makefile.am (1.59), Prolog/SWI/ppl_swiprolog.cc
+ (1.116), Prolog/XSB/Makefile.am (1.41), Prolog/XSB/ppl_xsb.cc
+ (1.80), Prolog/YAP/Makefile.am (1.43), Prolog/YAP/ppl_yap.cc
+ (1.110): No longer include individual PPL header file: include
+ ppl_install.hh and pwl_install.hh instead.
+
+2006-01-13 Friday 18:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Powerset.defs.hh (1.16): Some comments revised.
+
+2006-01-13 Friday 14:52 Matthew Mundell
+
+ * TODO (1.170): Add Debian package TODO list.
+
+2006-01-13 Friday 14:19 Matthew Mundell
+
+ * debian/control.prologs (1.1): Initial revision.
+
+2006-01-13 Friday 14:19 Matthew Mundell
+
+ * debian/control.prologs (grids.1): file control.prologs was added
+ on branch grids on 2006-01-16 01:10:28 +0000
+
+2006-01-13 Friday 14:02 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.20): Some bugs in `incrementality'
+ (appear to be) fixed. `erase_artificials', modified for this
+ reason, now is used also by incrementality. Added some useful
+ checks in OK().
+
+2006-01-13 Friday 13:48 Matthew Mundell
+
+ * debian/control (1.11): Only build the packages for which Debian
+ provides the build requirements.
+
+2006-01-13 Friday 13:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.28): Improvements to tests
+ involving large numbers and coefficients. Part of test on
+ coefficients commented temporarily until problems with this are
+ fixed.
+
+2006-01-13 Friday 10:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.120): ascii_dump&load methods no
+ longer inlined (and moved away from other inlined methods).
+
+2006-01-13 Friday 10:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.61), BD_Shape.inlines.hh (1.119): No
+ longer disregard the optional tokens parameter in the widening
+ and extrapolation methods. A token parameter also added to CC76's
+ extrapolation operator. Removed a couple of misplaced OK()
+ assertions.
+
+2006-01-12 Thursday 22:43 Matthew Mundell
+
+ * interfaces/Prolog/GNU/README (1.2): Clip trailing whitespace.
+
+2006-01-12 Thursday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/README (altnum.1): file README was added on
+ branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-01-12 Thursday 22:42 Matthew Mundell
+
+ * debian/libppl-pwl.install (1.3): Add usr/lib/libpwl.so.
+
+2006-01-12 Thursday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-pwl.install (altnum.1): file libppl-pwl.install was
+ added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42 Matthew Mundell
+
+ * debian/: libppl-dev.install (1.3), libppl.install (1.5): Move
+ usr/lib/libppl.so from libppl-dev to libppl. Add
+ usr/bin/ppl-config to libppl.
+
+2006-01-12 Thursday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.install (altnum.1): file libppl-dev.install was
+ added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl.install (altnum.1): file libppl.install was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:39 Matthew Mundell
+
+ * debian/control (1.10): Drop the libppl-swi and libppl-gprolog
+ dependencies on swi-prolog and gprolog, resp.
+
+2006-01-12 Thursday 22:30 Matthew Mundell
+
+ * BUGS (1.5): Improve the known bugs statement.
+
+2006-01-12 Thursday 17:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.16): Fix misplaced semicolon.
+
+2006-01-12 Thursday 17:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.183): Small improvements to subsection 1.6
+ on the powerset domain.
+
+2006-01-12 Thursday 16:31 Matthew Mundell
+
+ * debian/rules (1.8): Correct the ppl-config source directory.
+ Improve two comments.
+
+2006-01-12 Thursday 16:31 Matthew Mundell
+
+ * debian/libppl.install (1.4): Add ppl_lpsol and the manual pages.
+
+2006-01-12 Thursday 16:30 Matthew Mundell
+
+ * debian/libppl.dirs (1.3): Add usr/share/man/man1.
+
+2006-01-12 Thursday 16:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl.dirs (altnum.1): file libppl.dirs was added on
+ branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 16:30 Matthew Mundell
+
+ * debian/libppl-pwl.install (1.2): Move pwl.hh to libppl-dev.
+
+2006-01-12 Thursday 16:29 Matthew Mundell
+
+ * debian/libppl-dev.install (1.2): Add the header files.
+
+2006-01-12 Thursday 16:28 Matthew Mundell
+
+ * debian/control (1.9): Add glpk to Build-Depends.
+
+2006-01-12 Thursday 13:29 Matthew Mundell
+
+ * debian/rules (1.7): Add ppl_lpsol and ppl-config to the programs
+ installed in install-arch.
+
+2006-01-12 Thursday 13:28 Matthew Mundell
+
+ * debian/control (1.8): Update to the new GMP package names. Add
+ libgmp3-doc to the libdevel suggested packages. Improve some
+ wording in the libppl-dev description.
+
+2006-01-12 Thursday 08:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.147),
+ Ciao/ciao_pl_check.pl (1.19), Ciao/ppl_ciao.cc (1.40),
+ Ciao/ppl_ciao.pl (1.86), GNU/ppl_gprolog.pl (1.58),
+ SICStus/ppl_sicstus_sd.cc (1.87), SWI/ppl_swiprolog.cc (1.115),
+ XSB/ppl_xsb.H (1.46), XSB/ppl_xsb.cc (1.79), XSB/xsb_pl_check.P
+ (1.24), YAP/ppl_yap.cc (1.109), tests/pl_check.pl (1.27): Added
+ predicates ppl_Coeffient_is_bounded/0, ppl_Coefficient_max and
+ ppl_Coefficient_min. A few small bugs fixed.
+
+2006-01-11 Wednesday 23:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.26): Obsolete hack
+ removed.
+
+2006-01-11 Wednesday 23:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.171): Fixed
+ ppl_Coefficient_min() and ppl_Coefficient_max().
+
+2006-01-11 Wednesday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.28): Include ppl-config in %{_bindir} and the man
+ pages in %{_mandir}/man1.
+
+2006-01-11 Wednesday 22:16 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[19,18]): *this
+ was not fully cleared if the problem was solved from scratch.
+ Typo fixed in the documentation.
+
+2006-01-11 Wednesday 20:34 Matthew Mundell
+
+ * debian/rules (1.6): Improve the comment about ppl_lcdd. Improve
+ the comments about the installation of the change logs. Merge
+ the copy commands of the merged browse and print documents.
+
+2006-01-11 Wednesday 19:21 Matthew Mundell
+
+ * debian/rules (1.5): Call autoreconf instead of each of the auto*
+ scripts. Leave the configuration of the Watchdog to the PPL
+ configure command.
+
+2006-01-11 Wednesday 18:35 Andrea Cimino
+
+ * src/LP_Problem.defs.hh (simplex.17): Minor documentation
+ improvements.
+
+2006-01-11 Wednesday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.170): New functions
+ ppl_Coefficient_is_bounded(), ppl_Coefficient_min(Prolog_term_ref
+ t_min) and ppl_Coefficient_max(Prolog_term_ref t_max) allow the
+ Prolog application to inspect the basic properties of the
+ `Coefficient' integer type.
+
+2006-01-11 Wednesday 17:52 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[18,16,17]): Totally rehandled the way of mapping the
+ `input_cs' columns with the `tableau' ones: `dim_map' is no
+ longer used. Renamed `swap_base' to `pivot'. `slack' and
+ `artificial' variables are better handled and documented.
+
+2006-01-11 Wednesday 15:23 Matthew Mundell
+
+ * src/Matrix.cc (1.92): Convert the add_recycled_row row size
+ assertion into an OK assertion on the given row.
+
+2006-01-11 Wednesday 13:46 Matthew Mundell
+
+ * debian/changelog (1.2): Clear dummy entry.
+
+2006-01-11 Wednesday 12:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.15), Ph_Status.idefs.hh (1.15):
+ Avoid include directives in files *.idefs.hh.
+
+2006-01-11 Wednesday 11:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.14), BD_Shape.defs.hh (1.60),
+ DB_Matrix.defs.hh (1.17), Linear_Row.defs.hh (1.16),
+ Ph_Status.idefs.hh (1.14), Polyhedra_Powerset.defs.hh (1.30),
+ Row.defs.hh (1.102): Added a few missing \ref doxygen commands.
+ Prefer direct vs indirect inclusion of globals.defs.hh.
+
+2006-01-11 Wednesday 11:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/DB_Row.defs.hh (1.16): Spurious dot in doxygen documentation
+ removed.
+
+2006-01-11 Wednesday 11:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.63), devref.doxyconf-latex.in
+ (1.6), user.doxyconf-html.in (1.33), user.doxyconf-latex.in
+ (1.5): Expanding as predefined the macro PPL_OUTPUT_DECLARATIONS,
+ so as to avoid warnings in the user manual and to see the
+ documentation in the devref manual.
+
+2006-01-11 Wednesday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh (1.29): The comments for output methods
+ marked as brief comments.
+
+2006-01-11 Wednesday 02:21 Matthew Mundell
+
+ * src/: Linear_System.cc (1.37), Matrix.cc (1.91), Matrix.defs.hh
+ (1.73), Matrix.inlines.hh (1.49): Add Matrix methods
+ add_row(const Row&) and add_recycled_row(Row&). Update
+ Linear_System::add_row to use Matrix::add_row.
+
+2006-01-10 Tuesday 21:08 Matthew Mundell
+
+ * doc/ppl-config.1 (grids.1): file ppl-config.1 was added on branch
+ grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config.1 (1.3): Improved.
+
+2006-01-10 Tuesday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config.1 (simplex.1): file ppl-config.1 was added on
+ branch simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 21:02 Matthew Mundell
+
+ * doc/ppl_lcdd.1 (grids.1): file ppl_lcdd.1 was added on branch
+ grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.42), ppl_lcdd.1 (1.1): Added a draft man
+ page for `ppl_lcdd'.
+
+2006-01-10 Tuesday 21:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lcdd.1 (simplex.1): file ppl_lcdd.1 was added on branch
+ simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.54): Changed again: option
+ --max-memory has now -R (and not -M) as its short counterpart.
+
+2006-01-10 Tuesday 20:59 Matthew Mundell
+
+ * doc/ppl_lpsol.1 (grids.1): file ppl_lpsol.1 was added on branch
+ grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.41), ppl_lpsol.1 (1.1): Added a draft man
+ page for `ppl_lpsol'.
+
+2006-01-10 Tuesday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl_lpsol.1 (simplex.1): file ppl_lpsol.1 was added on branch
+ simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.28): Option --max-memory has now
+ -R (and not -V) as its short counterpart. New option --version
+ (-V) prints version information on stdout. Fixed a couple of
+ error messages.
+
+2006-01-10 Tuesday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.53): Option --max-memory has now -M
+ (and not -V) as its short counterpart. New option --version (-V)
+ prints version information on stdout. Fixed a bug in the
+ definition of OPTION_LETTERS (-c is not available unless USE_PPL
+ is defined).
+
+2006-01-10 Tuesday 20:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl-config.1 (1.2), src/ppl-config.cc.in (1.15): In the
+ documentation for option --help (-h), specify that the output is
+ written on stdout.
+
+2006-01-10 Tuesday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.40), ppl-config.1 (1.1): Added a draft man
+ page for `ppl-config'.
+
+2006-01-10 Tuesday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/utils/Makefile.am (altnum.1): file Makefile.am was added
+ on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-10 Tuesday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.36), Watchdog/Makefile.am (1.25),
+ Watchdog/src/Makefile.am (1.5), Watchdog/utils/Makefile.am (1.6),
+ demos/Makefile.am (1.9), demos/ppl_lcdd/Makefile.am (1.22),
+ demos/ppl_lcdd/examples/Makefile.am (1.7),
+ demos/ppl_lpsol/Makefile.am (1.19),
+ demos/ppl_lpsol/examples/Makefile.am (1.6), doc/Makefile.am
+ (1.39), interfaces/Makefile.am (1.13), interfaces/C/Makefile.am
+ (1.21), interfaces/OCaml/Makefile.am (1.12),
+ interfaces/Prolog/Makefile.am (1.30),
+ interfaces/Prolog/Ciao/Makefile.am (1.51),
+ interfaces/Prolog/GNU/Makefile.am (1.51),
+ interfaces/Prolog/SICStus/Makefile.am (1.62),
+ interfaces/Prolog/SWI/Makefile.am (1.58),
+ interfaces/Prolog/XSB/Makefile.am (1.40),
+ interfaces/Prolog/YAP/Makefile.am (1.42),
+ interfaces/Prolog/tests/Makefile.am (1.7), m4/Makefile.am (1.16),
+ src/Makefile.am (1.136), tests/Makefile.am (1.248),
+ tests/BD_Shape/Makefile.am (1.32), tests/Polyhedron/Makefile.am
+ (1.43), utils/Makefile.am (1.12): Avoid providing default
+ information that Automake does figure out by itself.
+
+2006-01-10 Tuesday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.14): Option --interface (-I) fixed.
+
+2006-01-10 Tuesday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.13): The --all (-Z) option has been
+ removed.
+
+2006-01-10 Tuesday 18:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.12): Print usage information to stdout,
+ not stdin. Include information on reporting bugs in the usage
+ information.
+
+2006-01-10 Tuesday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.13): If "$MAKE" is empty, define it
+ to be "make".
+
+2006-01-10 Tuesday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.12): Exploit the now available ascii_dump()
+ method for Generator.
+
+2006-01-10 Tuesday 16:17 Matthew Mundell
+
+ * src/LP_Problem.cc (grids.1): file LP_Problem.cc was added on
+ branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.inlines.hh (1.8): Dealt with another FIXME.
+
+2006-01-10 Tuesday 16:12 Matthew Mundell
+
+ * src/LP_Problem.inlines.hh (grids.1): file LP_Problem.inlines.hh
+ was added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.11): When resizing the tableau, make sure we
+ never try to go beyond Matrix::max_num_columns().
+
+2006-01-10 Tuesday 16:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.12): Allow to override the `make'
+ command used: invoke "$MAKE" instead of "make".
+
+2006-01-10 Tuesday 15:58 Matthew Mundell
+
+ * src/: BD_Shape.inlines.hh (1.118), Constraint.cc (1.55),
+ Constraint.defs.hh (1.114), Constraint.inlines.hh (1.62),
+ Constraint_System.cc (1.16), Constraint_System.defs.hh (1.25),
+ DB_Matrix.defs.hh (1.16), DB_Matrix.inlines.hh (1.24),
+ Generator.cc (1.68), Generator.defs.hh (1.114),
+ Generator.inlines.hh (1.59), Generator_System.cc (1.16),
+ Generator_System.defs.hh (1.13), LP_Problem.cc (1.10),
+ LP_Problem.defs.hh (1.6), Linear_Row.cc (1.17),
+ Linear_Row.defs.hh (1.15), Linear_System.cc (1.36),
+ Linear_System.defs.hh (1.22), Matrix.cc (1.90), Matrix.defs.hh
+ (1.72), Ph_Status.cc (1.9), Ph_Status.idefs.hh (1.13),
+ Poly_Con_Relation.cc (1.12), Poly_Con_Relation.defs.hh (1.30),
+ Poly_Gen_Relation.cc (1.12), Poly_Gen_Relation.defs.hh (1.28),
+ Polyhedra_Powerset.defs.hh (1.29), Polyhedra_Powerset.inlines.hh
+ (1.37), Polyhedron.defs.hh (1.290), Polyhedron_public.cc (1.71),
+ Row.cc (1.97), Row.defs.hh (1.101), Saturation_Matrix.cc (1.8),
+ Saturation_Matrix.defs.hh (1.6), BDS_Status.idefs.hh (1.13),
+ BDS_Status.inlines.hh (1.11), BD_Shape.defs.hh (1.59): Add
+ ascii_load(istream&) and ascii_dump(ostream&) to Constraint and
+ to Generator. Add ascii_dump() and print() to all classes having
+ an ascii_dump(ostream&). Move the detailed section of the
+ Linear_System::ascii_dump doxygen doc into the method definition.
+ Declare Poly_Con_Relation::acsii_dump(ostream&) and
+ Poly_Gen_Relation::ascii_dump(ostream&) public.
+
+2006-01-10 Tuesday 15:58 Matthew Mundell
+
+ * src/LP_Problem.defs.hh (grids.1): file LP_Problem.defs.hh was
+ added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 15:46 Matthew Mundell
+
+ * src/globals.defs.hh (1.28): Add macros PPL_STR(s), PPL_XSTR(s),
+ PPL_OUTPUT_DECLARATIONS, PPL_OUTPUT_DEFINITIONS(class_name),
+ PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name),
+ PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix),
+ PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol,
+ class_prefix).
+
+2006-01-10 Tuesday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.108): Prolog_get_long()
+ fixed.
+
+2006-01-10 Tuesday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.173), interfaces/C/ppl_c.cc (1.148),
+ interfaces/C/ppl_c.h.in (1.61): New functions added to the C
+ interface:
+
+ int ppl_Coefficient_is_bounded(void),
+ int ppl_Coefficient_min(mpz_t min),
+ int ppl_Coefficient_max(mpz_t max)
+
+ allow C applications to obtain information about the Coefficient
+ integer numerical type.
+
+2006-01-10 Tuesday 13:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.9): An anonymous FIXME turned into a
+ meaningful comment.
+
+2006-01-10 Tuesday 12:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.25): The large integer
+ tests for Prolog systems with bounded integers improved so that
+ they check the maximum and minimum integers at the interface.
+
+ The exception testing for Prolog also improved and a bug fixed
+ when testing the Prolog_unsigned_out_of_range exception.
+
+ The exception testing for Prolog systems with bounded integers
+ improved. We explicitly exclude XSB from these tests as it does
+ not throw an exception when the numbers are out-of-range.
+
+2006-01-10 Tuesday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.7), ppl.spec.in (1.27): Updated.
+
+2006-01-10 Tuesday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.201): Version number bumped.
+
+2006-01-09 Monday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.35), config.sub (1.33), Watchdog/config.guess
+ (1.19), Watchdog/config.sub (1.18): Updated.
+
+2006-01-09 Monday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.23), Watchdog/ChangeLog (1.13): Updated.
+
+2006-01-09 Monday 21:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.78): XSB supports only 32-bit
+ integers: two FIXMEs resolved.
+
+2006-01-09 Monday 18:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.58): Removed a FIXME that was already
+ dealt with.
+
+2006-01-09 Monday 14:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.172), interfaces/Prolog/Prolog_interface.dox (1.146),
+ interfaces/Prolog/ppl_prolog.icc (1.169),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.17),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.13),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.18),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.85),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.57),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.86),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.114),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.45),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.77),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.16),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.14),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.23),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.107),
+ interfaces/Prolog/tests/clpq.pl (1.8),
+ interfaces/Prolog/tests/clpq2.pl (1.8),
+ interfaces/Prolog/tests/pl_check.pl (1.24): In the Prolog
+ interface, the names and arities of the predicates
+ that create handles for new polyhedra have been revised
+ to match more closely the corresponding C and C++ interface
+ operators.
+
+ That is, instead of having "c" and/or "nnc" as arguments to
+ indicate
+ the topology of the polyhedron, the topologies are now part of
+ the
+ names of the predicates.
+
+ In Prolog_interface.dox, add a link to a bug report
+ about handling large numbers in XSB.
+
+2006-01-09 Monday 14:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.inlines.hh (1.7): Definitions reordered for
+ clarity as well as to actually allow inlining.
+
+2006-01-09 Monday 14:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BDS_Status.inlines.hh (1.10): Methods OK(), ascii_dump() and
+ ascii_load() are no longer inlined.
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int16 (altnum.1): file
+ expected_pchk_int16 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int16 (altnum.1): file
+ expected_pchk_int16 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int16_a (altnum.1): file
+ expected_pchk_int16_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int16_a (altnum.1): file
+ expected_pchk_int16_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int32 (altnum.1): file
+ expected_pchk_int32 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int32 (altnum.1): file
+ expected_pchk_int32 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int32_a (altnum.1): file
+ expected_pchk_int32_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int32_a (altnum.1): file
+ expected_pchk_int32_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int64_a (altnum.1): file
+ expected_pchk_int64_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int64_a (altnum.1): file
+ expected_pchk_int64_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int8_a (altnum.1): file
+ expected_pchk_int8_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-09 Monday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int8_a (altnum.1): file
+ expected_pchk_int8_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-09 Monday 13:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.145),
+ XSB/expected_pchk_int16 (1.4), XSB/expected_pchk_int16_a (1.4),
+ XSB/expected_pchk_int32 (1.4), XSB/expected_pchk_int32_a (1.4),
+ XSB/expected_pchk_int64_a (1.3), XSB/expected_pchk_int8 (1.3),
+ XSB/expected_pchk_int8_a (1.4), tests/expected_pchk_int16 (1.7),
+ tests/expected_pchk_int16_a (1.7), tests/expected_pchk_int32
+ (1.7), tests/expected_pchk_int32_a (1.7),
+ tests/expected_pchk_int64_a (1.6), tests/expected_pchk_int8
+ (1.7), tests/expected_pchk_int8_a (1.7), tests/pl_check.pl
+ (1.23): The tests in pl_check.pl now continue when there is an
+ overflow exception. Also the tests are more careful to output in
+ 'quiet' mode as the default.
+
+ As a result of these changes, the expected_pchk files have to be
+ revised.
+
+ A type fixed in Prolog_definitions.dox.
+
+2006-01-08 Sunday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.35), src/Linear_System.defs.hh (1.21),
+ tests/Polyhedron/gramschmidt1.cc (1.4): Method
+ Linear_System::gram_schmidt() removed: it was buggy and not used.
+
+2006-01-08 Sunday 22:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.8): Dealt with a few FIXME's.
+
+2006-01-08 Sunday 21:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.inlines.hh (1.6): A couple of FIXME's properly
+ renamed as TODO's.
+
+2006-01-08 Sunday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.169), interfaces/Prolog/Prolog_interface.dox (1.144):
+ Improved the documentation about shared libraries and the Prolog
+ interfaces.
+
+2006-01-08 Sunday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Matrix.inlines.hh (1.23), Matrix.inlines.hh (1.48),
+ Saturation_Matrix.inlines.hh (1.6): Two FIXME's resolved and two
+ useless static variables removed: while it is not clear why
+ std::vector::max_size() is not static, GCC and the Intel C++
+ compiler do compile out all overhead (GCC starting from -O1, the
+ Intel compiler starting from -O2).
+
+2006-01-08 Sunday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.53), Checked_Number.inlines.hh
+ (1.54): Constructor to build a Checked_Number from a different
+ kind of Checked_Number marked "explicit" and made available (it
+ was commented out).
+
+2006-01-08 Sunday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.168): Parallel builds now work everywhere.
+
+2006-01-08 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.22): Added a test on
+ hexadecimal number syntax.
+
+2006-01-08 Sunday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.61): Temporarily force
+ serialization of the tests (see
+ http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html).
+
+2006-01-08 Sunday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.50), SICStus/Makefile.am
+ (1.60), SWI/Makefile.am (1.57): Renamed some variables.
+
+2006-01-08 Sunday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.49): Dependencies fixed.
+ Allow the test targets to be executed in parallel.
+
+2006-01-08 Sunday 14:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.48), SICStus/Makefile.am
+ (1.59), SWI/Makefile.am (1.56): Added missing prerequisites.
+
+2006-01-08 Sunday 11:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.52): Useless, commented-out
+ declaration removed.
+
+2006-01-08 Sunday 10:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.22): Added a test for
+ exception "notan_LP_Problem_handle".
+
+2006-01-08 Sunday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.96): Corrected use of exact_div_assign().
+
+2006-01-08 Sunday 08:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.34): Corrected uses of
+ exact_div_assign(). Repeated computation factorized.
+
+2006-01-08 Sunday 08:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LP_Problem.cc (1.7): Corrected the uses of lcm_assign().
+
+2006-01-08 Sunday 08:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh (1.18), GMP_Integer.inlines.hh (1.13):
+ Removed the following redundant functions void
+ gcd_assign(GMP_Integer& x, const GMP_Integer& y); void
+ lcm_assign(GMP_Integer& x, const GMP_Integer& y); void
+ exact_div_assign(GMP_Integer& x, const GMP_Integer& y); void
+ sqrt_assign(GMP_Integer& x).
+
+2006-01-08 Sunday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.51), Checked_Number.inlines.hh
+ (1.53): Restored function template <typename T, typename Policy>
+ void neg_assign(Checked_Number<T, Policy>& x) and macro
+ DEF_ASSIGN_FUN2_1.
+
+2006-01-07 Saturday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.50), Checked_Number.inlines.hh
+ (1.52): The following redundant functions have been removed:
+ template <typename T, typename Policy> void
+ neg_assign(Checked_Number<T, Policy>& x); template <typename T,
+ typename Policy> void gcd_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y); template <typename T,
+ typename Policy> void lcm_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y); template <typename T,
+ typename Policy> void exact_div_assign(Checked_Number<T, Policy>&
+ x, const Checked_Number<T, Policy>& y); template <typename T,
+ typename Policy> void sqrt_assign(Checked_Number<T, Policy>& x).
+ No longer used macros DEF_ASSIGN_FUN2_1 and DEF_ASSIGN_FUN3_2
+ removed as well.
+
+2006-01-06 Friday 21:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/lpproblem1.cc (simplex.2): Put under CVS
+ control.
+
+2006-01-06 Friday 21:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * ChangeLog, Makefile.am, NEWS, README, README.configure,
+ STANDARDS, TODO, config.guess, config.sub, configure.ac,
+ install-sh, instchk.hh, ltmain.sh, Watchdog/ChangeLog,
+ Watchdog/Makefile.am, Watchdog/README, Watchdog/config.guess,
+ Watchdog/config.sub, Watchdog/configure.ac, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/src/Doubly_Linked_Object.defs.hh,
+ Watchdog/src/Doubly_Linked_Object.inlines.hh,
+ Watchdog/src/Doubly_Linked_Object.types.hh,
+ Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+ Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+ Watchdog/src/EList_Iterator.inlines.hh,
+ Watchdog/src/EList_Iterator.types.hh,
+ Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+ Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+ Watchdog/src/Pending_Element.cc,
+ Watchdog/src/Pending_Element.defs.hh,
+ Watchdog/src/Pending_Element.inlines.hh,
+ Watchdog/src/Pending_Element.types.hh,
+ Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+ Watchdog/src/Pending_List.inlines.hh,
+ Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+ Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+ Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+ Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+ Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+ Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+ demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+ doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl.sty,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+ m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+ m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+ m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+ m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+ m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+ m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh,
+ src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.types.hh, src/Coefficient.cc,
+ src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+ src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint.types.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+ src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+ src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+ src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator.types.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+ src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+ src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.types.hh, src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+ src/Limits.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Expression.types.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_Row.types.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+ src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+ src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+ src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+ src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+ src/Result.defs.hh, src/Result.inlines.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/Row.types.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+ src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+ src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/float.types.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/initializer.hh,
+ src/max_space_dimension.hh, src/minimize.cc,
+ src/mp_numeric_limits.hh, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+ src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+ src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+ tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+ tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+ tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+ tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/bdsdifference1.cc,
+ tests/BD_Shape/bdsdifference2.cc,
+ tests/BD_Shape/bdsdifference3.cc,
+ tests/BD_Shape/bdsdifference4.cc,
+ tests/BD_Shape/bdsdifference5.cc,
+ tests/BD_Shape/bdsdifference6.cc,
+ tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+ tests/BD_Shape/bdshull4.cc,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhmz05widening1.cc,
+ tests/BD_Shape/bhmz05widening2.cc,
+ tests/BD_Shape/bhmz05widening3.cc,
+ tests/BD_Shape/bhmz05widening4.cc,
+ tests/BD_Shape/bhmz05widening5.cc,
+ tests/BD_Shape/bhmz05widening6.cc,
+ tests/BD_Shape/bhmz05widening7.cc,
+ tests/BD_Shape/bhmz05widening8.cc,
+ tests/BD_Shape/bhz03widening1.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc,
+ tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+ tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+ tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+ tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+ tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+ tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+ tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+ tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+ tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+ tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+ tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+ tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/generalizedaffinepreimage1.cc,
+ tests/BD_Shape/generalizedaffinepreimage2.cc,
+ tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+ tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+ tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+ tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+ tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedCC76extrapolation1.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation1.cc,
+ tests/BD_Shape/limitedCH78extrapolation2.cc,
+ tests/BD_Shape/limitedCH78extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation4.cc,
+ tests/BD_Shape/limitedCH78extrapolation5.cc,
+ tests/BD_Shape/limitedCH78extrapolation6.cc,
+ tests/BD_Shape/limitedCH78extrapolation7.cc,
+ tests/BD_Shape/limitedCH78extrapolation8.cc,
+ tests/BD_Shape/limitedCH78extrapolation9.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+ tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+ tests/BD_Shape/limitedcc76extrapolation1.cc,
+ tests/BD_Shape/limitedcc76extrapolation2.cc,
+ tests/BD_Shape/limitedcc76extrapolation3.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+ tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+ tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+ tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+ tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+ tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage11.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffineimage2.cc,
+ tests/Polyhedron/boundedaffineimage3.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage2.cc,
+ tests/Polyhedron/boundedaffinepreimage3.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/concatenate7.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc,
+ tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage13.cc,
+ tests/Polyhedron/generalizedaffineimage14.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage3.cc,
+ tests/Polyhedron/generalizedaffinepreimage4.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/gramschmidt1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linearsystem1.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/lpproblem2.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+ tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+ tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+ tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc,
+ tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/primalsimplex1.cc,
+ tests/Polyhedron/primalsimplex2.cc,
+ tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+ tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+ tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+ tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+ tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+ tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+ tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+ tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+ tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+ tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+ tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+ tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+ utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+ utils/timings.hh
+ (simplex.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,2,1,1,1,1,1,1,1,1,4,4,1,1,3,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,4,1,1,1,1,1,1 [...]
+ First merge from the main trunk.
+
+2006-01-06 Friday 19:20 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+ Congruence.types.hh, Congruence_System.cc,
+ Congruence_System.defs.hh, Congruence_System.inlines.hh,
+ Congruence_System.types.hh, Grid.defs.hh, Grid.inlines.hh,
+ Grid.types.hh, Grid_Certificate.cc, Grid_Certificate.defs.hh,
+ Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+ Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+ Grid_Generator.types.hh, Grid_Generator_System.cc,
+ Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+ Grid_Generator_System.types.hh, Grid_Status.cc,
+ Grid_Status.idefs.hh, Grid_Status.inlines.hh, Grid_chdims.cc,
+ Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+ Grid_public.cc, Grid_simplify.cc, Grid_widenings.cc
+ (grids.[19,35,20,2,39,25,13,2,93,52,2,9,3,2,2,21,16,2,26,19,11,2,5,6,4,30,33,25,67,130,44,11]):
+ Update copyright year.
+
+2006-01-06 Friday 18:44 Matthew Mundell
+
+ * src/Matrix.defs.hh (grids.7): Take out old grid includes and
+ declaration.
+
+2006-01-06 Friday 18:13 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence_System.defs.hh,
+ Grid.defs.hh, Grid_Certificate.defs.hh, Grid_Generator.defs.hh,
+ Grid_Generator_System.defs.hh, Grid_Status.idefs.hh
+ (grids.[34,24,92,2,20,18,5]): Update the format of brief comments
+ to the new standard.
+
+2006-01-06 Friday 08:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.21): Added a comment
+ explaining the large number tests. Revised the catch code for
+ the ppl_overflow_error exception. Reordered tests so that when
+ there is an expected overflow exception, more tests are done
+ before that.
+
+ Other minor changes.
+
+2006-01-05 Thursday 21:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/expected_pchk_int64_a (1.5): Restore
+ expected output.
+
+2006-01-05 Thursday 19:45 Matthew Mundell
+
+ * src/Grid_public.cc (grids.129): Leave the modulus handling as it
+ is in the inverse relation case of
+ generalized_affine_preimage(var..).
+
+2006-01-05 Thursday 18:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: expected_pchk_int16 (1.6),
+ expected_pchk_int16_a (1.6), expected_pchk_int32 (1.6),
+ expected_pchk_int32_a (1.6), expected_pchk_int64 (1.3),
+ expected_pchk_int64_a (1.4), expected_pchk_int8 (1.6),
+ expected_pchk_int8_a (1.6), pl_check.pl (1.20): Revised expected
+ files and avoid error message when there is an overflow exception
+ for the large numbers in the C++.
+
+2006-01-05 Thursday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int64 (altnum.1): file
+ expected_pchk_int64 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-05 Thursday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.106): Fixed
+ integer_term_to_Coefficient().
+
+2006-01-05 Thursday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.105): Prolog_is_integer()
+ updated to support the newest versions of YAP.
+
+2006-01-05 Thursday 13:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: expected_pchk_int16 (1.5),
+ expected_pchk_int16_a (1.5), expected_pchk_int32 (1.5),
+ expected_pchk_int32_a (1.5), expected_pchk_int64 (1.2),
+ expected_pchk_int64_a (1.3): Revised expected results for
+ pl_check to allow for tests for large numbers.
+
+2006-01-05 Thursday 11:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/: expected_pchk_int8 (1.5),
+ expected_pchk_int8_a (1.5): Updated expected results for the
+ large number tests.
+
+2006-01-05 Thursday 11:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.17),
+ GNU/gnu_pl_check.pl (1.8), SICStus/sp_pl_check.pl (1.6),
+ SWI/swi_pl_check.pl (1.7), XSB/xsb_pl_check.P (1.22),
+ YAP/yap_pl_check.pl (1.10), tests/pl_check.pl (1.19): Added to
+ the system dependent files prolog_system(...).
+
+ Added tests to pl_check.pl for testing large numbers. When
+ prolog_system(xsb) holds, these tests are omitted.
+
+ Bugs in maximize and minimize test code fixed. typo in exception
+ message fixed.
+
+2006-01-05 Thursday 10:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.143), YAP/ppl_yap.cc
+ (1.104): Use (and require) the new YAP interface for arbitrary
+ precision integers.
+
+2006-01-05 Thursday 00:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.cc (simplex.16): Added a few calls to ascii_dump()
+ in the OK method to help in debugging. Corrected a bug in
+ incremental() whereby an illegal dim_map was built. Corrected
+ another bug whereby last_generator was not updated.
+
+2006-01-04 Wednesday 22:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.103): Use a single temporary
+ mpz_class object. Added a missing test to
+ Coefficient_to_integer_term(). Use direct assignment instead of
+ assign_r() in integer_term_to_Coefficient().
+
+2006-01-04 Wednesday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.113): Removed an
+ inclusion and a using declaration probably left there after a
+ debugging session. Use a single temporary mpz_class object.
+
+2006-01-04 Wednesday 17:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Limits.hh (1.9): Fixed indentation of a line.
+
+2006-01-04 Wednesday 14:43 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[15,14,15]): Restored last changes made by Enea, were
+ removed by mistake. Added a FIXME about incrementality and the
+ default constructor.
+
+2006-01-04 Wednesday 12:57 Andrea Cimino
+
+ * src/: Constraint.defs.hh, LP_Problem.cc, LP_Problem.defs.hh,
+ LP_Problem.inlines.hh (simplex.[1,14,13,14]): Added experimental
+ code for incrementality. Backported some changes from the main
+ trunk. Added a modified version of `ascii_dump' for testing
+ purposes. LP_Problem made friend of Constraint to allow
+ compiling.
+
+2006-01-03 Tuesday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc (1.9): Print objects of type Coefficient
+ as such, not as objects of some other type.
+
+2006-01-03 Tuesday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.defs.hh (1.49): Added a draft input syntax to
+ the input function for checked numbers: template <typename T,
+ typename Policy> Result input(std::istream& is, Checked_Number<T,
+ Policy>& x, Rounding_Dir dir).
+
+2006-01-03 Tuesday 20:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh (1.24), Linear_Expression.defs.hh
+ (1.18): Comments improved.
+
+2006-01-03 Tuesday 18:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.112): Return directly
+ the temporary Coefficeint object.
+
+2006-01-03 Tuesday 18:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.142): Corrected a typo.
+
+2006-01-03 Tuesday 16:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.111): Tentative
+ correction of a bug in the conversion from SWI Prolog unbounded
+ coefficients to PPL's (checked bounded integers) Coefficient.
+
+2006-01-03 Tuesday 16:43 Matthew Mundell
+
+ * tests/Grid/intersection1.cc (grids.8): Replace the Variables in
+ the tests with common Variables in a local namespace.
+
+2006-01-03 Tuesday 16:40 Matthew Mundell
+
+ * tests/Grid/affinepreimage1.cc (grids.10): Add two simple tests.
+
+2006-01-03 Tuesday 16:36 Matthew Mundell
+
+ * src/Grid_public.cc (grids.128): Take the empty flag query out of
+ add_recycled_generators.
+
+2006-01-03 Tuesday 16:35 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.66): Note possible improvements to
+ the empty cases in the construct methods.
+
+2006-01-03 Tuesday 16:34 Matthew Mundell
+
+ * src/Grid_Generator_System.inlines.hh (grids.10): Add sortedness
+ and pending row settings to method `clear'.
+
+2006-01-03 Tuesday 16:32 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (grids.19): Move the
+ writable-reference-returning divisor method to the private
+ section. Improve the comment on the need for the Grid class
+ friend declaration.
+
+2006-01-03 Tuesday 16:29 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.51): Update map_space_dimensions to
+ create the point with the correct divisor when inserting a point,
+ instead of inserting the point and then adjusting the divisor.
+
+2006-01-03 Tuesday 16:27 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (grids.23): Add a note to consider
+ adding a recycling_insert method.
+
+2006-01-03 Tuesday 16:26 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.33): Move the
+ writable-reference-returning modulus method to the private
+ section. Improve two comments a little.
+
+2006-01-03 Tuesday 16:25 Matthew Mundell
+
+ * src/Congruence.cc (grids.18): Update strong_normalize to use
+ Row::normalize.
+
+2006-01-03 Tuesday 15:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.141): Added
+ documentation for the LP Problem predicates.
+
+2006-01-02 Monday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.167): Removed a couple of items that have been dealt
+ with.
+
+2006-01-02 Monday 14:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16 (1.4), expected_int16_a (1.4),
+ expected_int32 (1.5), expected_int32_a (1.5), expected_int64
+ (1.5), expected_int64_a (1.5), expected_int8 (1.4),
+ expected_int8_a (1.3), expected_mpz (1.6), expected_mpz_a (1.6):
+ Updated to take into account the addition of tests for the
+ simplex method and the removal of option -v.
+
+2006-01-02 Monday 14:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.18): Do explicitly use option -e
+ when requiring the enumeration method.
+
+2006-01-02 Monday 14:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.27): Let the option -e be working
+ as expected.
+
+2006-01-02 Monday 11:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (1.14): Function parse_number1() renamed
+ parse_number_part().
+
+2006-01-02 Monday 11:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions2.cc (1.8): Added tests for
+ excericising the exceptions generated by LP_Problem.
+
+2006-01-02 Monday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (1.13): Comments for parse_number() and
+ parse_number1() revised.
+
+2006-01-02 Monday 11:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.135): Added globals.types.hh to the
+ documentation files.
+
+2006-01-02 Monday 11:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc (1.6), LP_Problem.defs.hh (1.5): Added and
+ implemented exception specification for
+ evaluate_objective_function().
+
+2006-01-02 Monday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (1.12): Functions get_digit() and sum_sign()
+ properly commented.
+
+2006-01-02 Monday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.21): Got rid of (non-working
+ and too expensive) tests for large exponents.
+
+2006-01-02 Monday 09:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (simplex.1): file
+ generalizedaffinepreimage1.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-02 Monday 09:36 Matthew Mundell
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (grids.1): file
+ generalizedaffinepreimage1.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-02 Monday 09:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (1.6): If (and only
+ if) the Coefficient type is not wide enough, test10() does
+ nothing.
+
+2006-01-02 Monday 00:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc (1.5), LP_Problem.inlines.hh (1.5): Drafted
+ implementations for total_ and external_memory_in_bytes() and for
+ ascii_dump().
+
+2006-01-01 Sunday 23:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.18): Many improvements to
+ LP_Problem tests.
+
+2006-01-01 Sunday 22:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/src/EList.defs.hh (1.3),
+ Watchdog/src/Pending_List.defs.hh (1.3),
+ Watchdog/src/Time.defs.hh (1.3), src/version.hh.in (1.13): Do
+ adopt the new format for multiline brief doxygen documentation.
+
+2006-01-01 Sunday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.defs.hh (altnum.1): file
+ Pending_List.defs.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.defs.hh (altnum.1): file Time.defs.hh was added
+ on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 22:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (1.5): Temporarily
+ disabled test10().
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int32_a (altnum.1): file
+ expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int8 (altnum.1): file
+ expected_clpq2_int8 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int8_a (altnum.1): file
+ expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int16 (altnum.1): file
+ expected_clpq_int16 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int16_a (altnum.1): file
+ expected_clpq_int16_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.4),
+ XSB/expected_clpq2_int8 (1.3), XSB/expected_clpq2_int8_a (1.4),
+ XSB/expected_clpq_int16 (1.4), XSB/expected_clpq_int16_a (1.4),
+ XSB/expected_pchk_int16 (1.3), XSB/expected_pchk_int16_a (1.3),
+ XSB/expected_pchk_int32 (1.3), XSB/expected_pchk_int32_a (1.3),
+ XSB/expected_pchk_int8 (1.2), XSB/expected_pchk_int8_a (1.3),
+ tests/expected_clpq2_int32_a (1.4), tests/expected_clpq2_int8
+ (1.4), tests/expected_clpq2_int8_a (1.4),
+ tests/expected_clpq_int16 (1.4), tests/expected_clpq_int16_a
+ (1.4), tests/expected_pchk_int16 (1.4),
+ tests/expected_pchk_int16_a (1.4), tests/expected_pchk_int32
+ (1.4), tests/expected_pchk_int32_a (1.4),
+ tests/expected_pchk_int8 (1.4), tests/expected_pchk_int8_a (1.4):
+ Adapted to recent changes in the implementation of checked
+ numbers.
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int32_a (altnum.1): file
+ expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int8 (altnum.1): file
+ expected_clpq2_int8 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int8_a (altnum.1): file
+ expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int16 (altnum.1): file
+ expected_clpq_int16 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int16_a (altnum.1): file
+ expected_clpq_int16_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 19:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.166), src/Ask_Tell.defs.hh (1.8), src/BDS_Status.idefs.hh
+ (1.12), src/BHRZ03_Certificate.defs.hh (1.14),
+ src/Bounding_Box.defs.hh (1.12), src/C_Polyhedron.defs.hh (1.39),
+ src/Checked_Number.defs.hh (1.48), src/Constraint.defs.hh
+ (1.113), src/Constraint_System.defs.hh (1.23),
+ src/DB_Matrix.defs.hh (1.15), src/DB_Matrix.inlines.hh (1.22),
+ src/DB_Row.defs.hh (1.15), src/Determinate.defs.hh (1.60),
+ src/GMP_Integer.defs.hh (1.17), src/GMP_Integer.inlines.hh
+ (1.12), src/Generator.defs.hh (1.113),
+ src/Generator_System.defs.hh (1.12), src/Interval.defs.hh (1.26),
+ src/LP_Problem.defs.hh (1.4), src/Linear_Expression.defs.hh
+ (1.17), src/Linear_Row.defs.hh (1.14), src/Linear_System.defs.hh
+ (1.20), src/Matrix.defs.hh (1.71), src/NNC_Polyhedron.defs.hh
+ (1.41), src/Ph_Status.idefs.hh (1.12),
+ src/Poly_Con_Relation.defs.hh (1.29),
+ src/Poly_Gen_Relation.defs.hh (1.27),
+ src/Polyhedra_Powerset.defs.hh (1.28), src/Polyhedron.defs.hh
+ (1.289), src/Powerset.defs.hh (1.15), src/Ptr_Iterator.defs.hh
+ (1.6), src/Rounding_Dir.defs.hh (1.7), src/Row.defs.hh (1.100),
+ src/Saturation_Matrix.defs.hh (1.5), src/Saturation_Row.defs.hh
+ (1.9), src/Scalar_Products.defs.hh (1.3), src/Variable.defs.hh
+ (1.49), src/algorithms.hh (1.45), src/checked.defs.hh (1.31),
+ src/globals.defs.hh (1.27): Applying the new policy for multiline
+ brief Doxygen comments.
+
+2006-01-01 Sunday 19:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.57), BD_Shape.inlines.hh (1.117): A few
+ improvements in the code ofr affine images and preimages. Removed
+ a (never used) default-valued parameter form an helper function.
+
+2006-01-01 Sunday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.29): Established a new policy for the writing of
+ multiline *brief* comment in doxygen: besides easing a bit their
+ writing, this is also useful as a workaround for a long-standing
+ doxygen bug.
+
+2006-01-01 Sunday 18:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: GNU/ppl_gprolog.pl (1.56), tests/pl_check.pl
+ (1.17): Code wrongly removed in pl_check.pl replaced.
+
+ GNU Prolog system code for LP_Problem added.
+
+2006-01-01 Sunday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.42): The tests lpproblem1 and
+ lpproblem2 also fail with 64-bits coefficients.
+
+2006-01-01 Sunday 17:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.41): With 32-bits coefficients,
+ the tests lpproblem1 and lpproblem2 are known to fail because of
+ overflows.
+
+2006-01-01 Sunday 17:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/lpproblem1.cc (simplex.1): file lpproblem1.cc
+ was added on branch simplex on 2006-01-06 20:01:53 +0000
+
+2006-01-01 Sunday 17:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/lpproblem2.cc (simplex.1): file lpproblem2.cc
+ was added on branch simplex on 2006-01-06 20:00:58 +0000
+
+2006-01-01 Sunday 17:25 Matthew Mundell
+
+ * tests/Polyhedron/lpproblem2.cc (grids.1): file lpproblem2.cc was
+ added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-01 Sunday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: lpproblem1.cc (1.3), lpproblem2.cc (1.3):
+ Added missing try/catch blocks.
+
+2006-01-01 Sunday 14:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.16),
+ Ciao/ppl_ciao.pl (1.84), SICStus/ppl_sicstus_sd.cc (1.85),
+ XSB/ppl_xsb.H (1.44), XSB/ppl_xsb.cc (1.76), XSB/xsb_pl_check.P
+ (1.21), YAP/ppl_yap.cc (1.102), tests/pl_check.pl (1.16): Added
+ needed code for the LP_Problem predicates to the Prolog systems'
+ code.
+
+ Added tests to exercise all the LP_Problem predicates.
+
+2006-01-01 Sunday 10:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.15): Corrected and
+ improved maximize, maximize_with_point, minimize and
+ minimize_with_point tests.
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/build_header.in (altnum.1): file build_header.in was added
+ on branch altnum on 2006-10-29 19:27:45 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray.in (altnum.1): file text2cxxarray.in was
+ added on branch altnum on 2006-10-29 19:27:45 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/Polyhedron/LP_Problem3.cc (grids.1): file LP_Problem3.cc
+ was added on branch grids on 2006-01-16 01:10:40 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (altnum.1): file memory2.cc was added
+ on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation1.cc (simplex.1): file
+ limitedbhmz05extrapolation1.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation2.cc (simplex.1): file
+ limitedbhmz05extrapolation2.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation3.cc (simplex.1): file
+ limitedbhmz05extrapolation3.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation4.cc (simplex.1): file
+ limitedbhmz05extrapolation4.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation5.cc (simplex.1): file
+ limitedbhmz05extrapolation5.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation6.cc (simplex.1): file
+ limitedbhmz05extrapolation6.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation7.cc (simplex.1): file
+ limitedbhmz05extrapolation7.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation8.cc (simplex.1): file
+ limitedbhmz05extrapolation8.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedbhmz05extrapolation9.cc (simplex.1): file
+ limitedbhmz05extrapolation9.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedcc76extrapolation1.cc (simplex.1): file
+ limitedcc76extrapolation1.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedcc76extrapolation2.cc (simplex.1): file
+ limitedcc76extrapolation2.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedcc76extrapolation3.cc (simplex.1): file
+ limitedcc76extrapolation3.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation1.cc (grids.1): file
+ limitedbhmz05extrapolation1.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation2.cc (grids.1): file
+ limitedbhmz05extrapolation2.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation3.cc (grids.1): file
+ limitedbhmz05extrapolation3.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation4.cc (grids.1): file
+ limitedbhmz05extrapolation4.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation5.cc (grids.1): file
+ limitedbhmz05extrapolation5.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation6.cc (grids.1): file
+ limitedbhmz05extrapolation6.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation7.cc (grids.1): file
+ limitedbhmz05extrapolation7.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation8.cc (grids.1): file
+ limitedbhmz05extrapolation8.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedbhmz05extrapolation9.cc (grids.1): file
+ limitedbhmz05extrapolation9.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedcc76extrapolation1.cc (grids.1): file
+ limitedcc76extrapolation1.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedcc76extrapolation2.cc (grids.1): file
+ limitedcc76extrapolation2.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/limitedcc76extrapolation3.cc (grids.1): file
+ limitedcc76extrapolation3.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening1.cc (simplex.1): file
+ bhmz05widening1.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening2.cc (simplex.1): file
+ bhmz05widening2.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening3.cc (simplex.1): file
+ bhmz05widening3.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening4.cc (simplex.1): file
+ bhmz05widening4.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening5.cc (simplex.1): file
+ bhmz05widening5.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening6.cc (simplex.1): file
+ bhmz05widening6.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening7.cc (simplex.1): file
+ bhmz05widening7.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bhmz05widening8.cc (simplex.1): file
+ bhmz05widening8.cc was added on branch simplex on 2006-01-06
+ 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (simplex.1): file
+ generalizedaffinepreimage2.cc was added on branch simplex on
+ 2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening1.cc (grids.1): file
+ bhmz05widening1.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening2.cc (grids.1): file
+ bhmz05widening2.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening3.cc (grids.1): file
+ bhmz05widening3.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening4.cc (grids.1): file
+ bhmz05widening4.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening5.cc (grids.1): file
+ bhmz05widening5.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening6.cc (grids.1): file
+ bhmz05widening6.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening7.cc (grids.1): file
+ bhmz05widening7.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/bhmz05widening8.cc (grids.1): file
+ bhmz05widening8.cc was added on branch grids on 2006-01-16
+ 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * tests/BD_Shape/generalizedaffinepreimage2.cc (grids.1): file
+ generalizedaffinepreimage2.cc was added on branch grids on
+ 2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Random_Number_Generator.types.hh (altnum.1): file
+ Random_Number_Generator.types.hh was added on branch altnum on
+ 2006-10-29 19:27:21 +0000
+
+2006-01-01 Sunday 09:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.cc (simplex.1): file BD_Shape.cc was added on branch
+ simplex on 2006-01-06 20:00:51 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * src/BD_Shape.cc (grids.1): file BD_Shape.cc was added on branch
+ grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27 Matthew Mundell
+
+ * src/LP_Problem.types.hh (grids.1): file LP_Problem.types.hh was
+ added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh (altnum.1): file ppl_header.hh was added on
+ branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_sicstus_prolog.m4 (altnum.1): file
+ ac_check_sicstus_prolog.m4 was added on branch altnum on
+ 2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_xsb_prolog.m4 (altnum.1): file ac_check_xsb_prolog.m4
+ was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int16 (altnum.1): file
+ expected_clpq2_int16 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int16 (altnum.1): file
+ expected_clpq2_int16 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int16_a (altnum.1): file
+ expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int16_a (altnum.1): file
+ expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int32 (altnum.1): file
+ expected_clpq2_int32 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int32 (altnum.1): file
+ expected_clpq2_int32 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int64 (altnum.1): file
+ expected_clpq2_int64 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int64 (altnum.1): file
+ expected_clpq2_int64 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int64_a (altnum.1): file
+ expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_int64_a (altnum.1): file
+ expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_mpz (altnum.1): file
+ expected_clpq2_mpz was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_mpz (altnum.1): file
+ expected_clpq2_mpz was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_mpz_a (altnum.1): file
+ expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq2_mpz_a (altnum.1): file
+ expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int32 (altnum.1): file
+ expected_clpq_int32 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int32 (altnum.1): file
+ expected_clpq_int32 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int32_a (altnum.1): file
+ expected_clpq_int32_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int32_a (altnum.1): file
+ expected_clpq_int32_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int64 (altnum.1): file
+ expected_clpq_int64 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int64 (altnum.1): file
+ expected_clpq_int64 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int64_a (altnum.1): file
+ expected_clpq_int64_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int64_a (altnum.1): file
+ expected_clpq_int64_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int8 (altnum.1): file
+ expected_clpq_int8 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int8 (altnum.1): file
+ expected_clpq_int8 was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int8_a (altnum.1): file
+ expected_clpq_int8_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_int8_a (altnum.1): file
+ expected_clpq_int8_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_mpz (altnum.1): file
+ expected_clpq_mpz was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_mpz (altnum.1): file
+ expected_clpq_mpz was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_mpz_a (altnum.1): file
+ expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_clpq_mpz_a (altnum.1): file
+ expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:07 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/utils/build_header.in (altnum.1): file build_header.in
+ was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Doubly_Linked_Object.defs.hh (altnum.1): file
+ Doubly_Linked_Object.defs.hh was added on branch altnum on
+ 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Doubly_Linked_Object.inlines.hh (altnum.1): file
+ Doubly_Linked_Object.inlines.hh was added on branch altnum on
+ 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Doubly_Linked_Object.types.hh (altnum.1): file
+ Doubly_Linked_Object.types.hh was added on branch altnum on
+ 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList.inlines.hh (altnum.1): file EList.inlines.hh
+ was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList.types.hh (altnum.1): file EList.types.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList_Iterator.defs.hh (altnum.1): file
+ EList_Iterator.defs.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList_Iterator.inlines.hh (altnum.1): file
+ EList_Iterator.inlines.hh was added on branch altnum on
+ 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/EList_Iterator.types.hh (altnum.1): file
+ EList_Iterator.types.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Handler.inlines.hh (altnum.1): file
+ Handler.inlines.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Handler.types.hh (altnum.1): file Handler.types.hh
+ was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_Element.cc (altnum.1): file
+ Pending_Element.cc was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_Element.inlines.hh (altnum.1): file
+ Pending_Element.inlines.hh was added on branch altnum on
+ 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_Element.types.hh (altnum.1): file
+ Pending_Element.types.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.cc (altnum.1): file Pending_List.cc was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.inlines.hh (altnum.1): file
+ Pending_List.inlines.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Pending_List.types.hh (altnum.1): file
+ Pending_List.types.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.cc (altnum.1): file Time.cc was added on branch
+ altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.inlines.hh (altnum.1): file Time.inlines.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Time.types.hh (altnum.1): file Time.types.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.inlines.hh (altnum.1): file
+ Watchdog.inlines.hh was added on branch altnum on 2006-10-29
+ 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Watchdog.types.hh (altnum.1): file Watchdog.types.hh
+ was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/pwl_header.hh (altnum.1): file pwl_header.hh was
+ added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.35), README (1.38), README.configure (1.16),
+ configure.ac (1.200), instchk.hh (1.3), Watchdog/Makefile.am
+ (1.24), Watchdog/README (1.12), Watchdog/configure.ac (1.33),
+ Watchdog/src/Doubly_Linked_Object.defs.hh (1.2),
+ Watchdog/src/Doubly_Linked_Object.inlines.hh (1.2),
+ Watchdog/src/Doubly_Linked_Object.types.hh (1.2),
+ Watchdog/src/EList.defs.hh (1.2), Watchdog/src/EList.inlines.hh
+ (1.2), Watchdog/src/EList.types.hh (1.2),
+ Watchdog/src/EList_Iterator.defs.hh (1.2),
+ Watchdog/src/EList_Iterator.inlines.hh (1.2),
+ Watchdog/src/EList_Iterator.types.hh (1.2),
+ Watchdog/src/Handler.defs.hh (1.2),
+ Watchdog/src/Handler.inlines.hh (1.2),
+ Watchdog/src/Handler.types.hh (1.2), Watchdog/src/Makefile.am
+ (1.4), Watchdog/src/Pending_Element.cc (1.2),
+ Watchdog/src/Pending_Element.defs.hh (1.2),
+ Watchdog/src/Pending_Element.inlines.hh (1.2),
+ Watchdog/src/Pending_Element.types.hh (1.2),
+ Watchdog/src/Pending_List.cc (1.2),
+ Watchdog/src/Pending_List.defs.hh (1.2),
+ Watchdog/src/Pending_List.inlines.hh (1.2),
+ Watchdog/src/Pending_List.types.hh (1.2), Watchdog/src/Time.cc
+ (1.2), Watchdog/src/Time.defs.hh (1.2),
+ Watchdog/src/Time.inlines.hh (1.2), Watchdog/src/Time.types.hh
+ (1.2), Watchdog/src/Watchdog.cc (1.2),
+ Watchdog/src/Watchdog.defs.hh (1.2),
+ Watchdog/src/Watchdog.inlines.hh (1.2),
+ Watchdog/src/Watchdog.types.hh (1.2), Watchdog/src/pwl_header.hh
+ (1.2), Watchdog/utils/Makefile.am (1.5),
+ Watchdog/utils/build_header.in (1.3), demos/Makefile.am (1.8),
+ demos/ppl_lcdd/Makefile.am (1.21), demos/ppl_lcdd/ppl_lcdd.cc
+ (1.52), demos/ppl_lcdd/examples/Makefile.am (1.6),
+ demos/ppl_lpsol/Makefile.am (1.17), demos/ppl_lpsol/ppl_lpsol.c
+ (1.26), demos/ppl_lpsol/examples/Makefile.am (1.5),
+ doc/Makefile.am (1.38), doc/README.doc (1.7), doc/definitions.dox
+ (1.182), doc/devref.tex (1.19), doc/ppl.sty (1.24), doc/user.tex
+ (1.20), interfaces/Makefile.am (1.12), interfaces/C/Makefile.am
+ (1.20), interfaces/C/ppl_c.cc (1.147), interfaces/C/ppl_c.h.in
+ (1.60), interfaces/OCaml/Makefile.am (1.11),
+ interfaces/Prolog/Makefile.am (1.29),
+ interfaces/Prolog/Prolog_interface.dox (1.140),
+ interfaces/Prolog/exceptions.hh (1.19),
+ interfaces/Prolog/ppl_prolog.icc (1.168),
+ interfaces/Prolog/track_allocation.hh (1.18),
+ interfaces/Prolog/Ciao/Makefile.am (1.47),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.16),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.12),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.15),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.39),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.83),
+ interfaces/Prolog/GNU/Makefile.am (1.50),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.7),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.10),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.55),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.34),
+ interfaces/Prolog/SICStus/Makefile.am (1.58),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.26),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.84),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.6),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.7),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.13),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.13),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.5),
+ interfaces/Prolog/SWI/Makefile.am (1.55),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.10),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.9),
+ interfaces/Prolog/SWI/ppl_pl.cc (1.10),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.110),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.6),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.6),
+ interfaces/Prolog/XSB/Makefile.am (1.39),
+ interfaces/Prolog/XSB/expected_clpq2_int16 (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int16_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int32 (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int32_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_int64 (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int64_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int8 (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_int8_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq2_mpz (1.2),
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int16 (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int16_a (1.3),
+ interfaces/Prolog/XSB/expected_clpq_int32 (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int32_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int64 (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int64_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int8 (1.2),
+ interfaces/Prolog/XSB/expected_clpq_int8_a (1.2),
+ interfaces/Prolog/XSB/expected_clpq_mpz (1.2),
+ interfaces/Prolog/XSB/expected_clpq_mpz_a (1.2),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.43),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.75),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.15),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.13),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.20),
+ interfaces/Prolog/YAP/Makefile.am (1.41),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.101),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.10),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.11),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.7),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.9),
+ interfaces/Prolog/tests/Makefile.am (1.6),
+ interfaces/Prolog/tests/clpq.pl (1.7),
+ interfaces/Prolog/tests/clpq2.pl (1.7),
+ interfaces/Prolog/tests/expected_clpq2_int16 (1.2),
+ interfaces/Prolog/tests/expected_clpq2_int16_a (1.2),
+ interfaces/Prolog/tests/expected_clpq2_int32 (1.2),
+ interfaces/Prolog/tests/expected_clpq2_int32_a (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int64 (1.2),
+ interfaces/Prolog/tests/expected_clpq2_int64_a (1.2),
+ interfaces/Prolog/tests/expected_clpq2_int8 (1.3),
+ interfaces/Prolog/tests/expected_clpq2_int8_a (1.3),
+ interfaces/Prolog/tests/expected_clpq2_mpz (1.2),
+ interfaces/Prolog/tests/expected_clpq2_mpz_a (1.2),
+ interfaces/Prolog/tests/expected_clpq_int16 (1.3),
+ interfaces/Prolog/tests/expected_clpq_int16_a (1.3),
+ interfaces/Prolog/tests/expected_clpq_int32 (1.2),
+ interfaces/Prolog/tests/expected_clpq_int32_a (1.2),
+ interfaces/Prolog/tests/expected_clpq_int64 (1.2),
+ interfaces/Prolog/tests/expected_clpq_int64_a (1.2),
+ interfaces/Prolog/tests/expected_clpq_int8 (1.2),
+ interfaces/Prolog/tests/expected_clpq_int8_a (1.2),
+ interfaces/Prolog/tests/expected_clpq_mpz (1.2),
+ interfaces/Prolog/tests/expected_clpq_mpz_a (1.2),
+ interfaces/Prolog/tests/pl_check.pl (1.14), m4/Makefile.am
+ (1.15), m4/ac_check_gmp.m4 (1.23), m4/ac_check_sicstus_prolog.m4
+ (1.4), m4/ac_check_swi_prolog.m4 (1.8), m4/ac_check_xsb_prolog.m4
+ (1.2), m4/ac_cxx_attribute_weak.m4 (1.7),
+ m4/ac_cxx_double_is_iec_559.m4 (1.5),
+ m4/ac_cxx_flexible_arrays.m4 (1.12),
+ m4/ac_cxx_float_is_iec_559.m4 (1.5), m4/ac_cxx_long_double.m4
+ (1.6), m4/ac_cxx_long_double_is_iec_559.m4 (1.5),
+ m4/ac_cxx_long_long.m4 (1.5), m4/ppl.m4 (1.2),
+ src/Ask_Tell.defs.hh (1.7), src/Ask_Tell.inlines.hh (1.7),
+ src/Ask_Tell.types.hh (1.4), src/BDS_Status.idefs.hh (1.11),
+ src/BDS_Status.inlines.hh (1.9), src/BD_Shape.cc (1.2),
+ src/BD_Shape.defs.hh (1.56), src/BD_Shape.inlines.hh (1.116),
+ src/BD_Shape.types.hh (1.5), src/BHRZ03_Certificate.cc (1.10),
+ src/BHRZ03_Certificate.defs.hh (1.13),
+ src/BHRZ03_Certificate.inlines.hh (1.7),
+ src/BHRZ03_Certificate.types.hh (1.4), src/Bounding_Box.cc
+ (1.13), src/Bounding_Box.defs.hh (1.11),
+ src/Bounding_Box.inlines.hh (1.14), src/Bounding_Box.types.hh
+ (1.4), src/C_Polyhedron.cc (1.17), src/C_Polyhedron.defs.hh
+ (1.38), src/C_Polyhedron.inlines.hh (1.29),
+ src/C_Polyhedron.types.hh (1.10), src/Checked_Number.cc (1.9),
+ src/Checked_Number.defs.hh (1.47), src/Checked_Number.inlines.hh
+ (1.51), src/Checked_Number.types.hh (1.9), src/Coefficient.cc
+ (1.4), src/Coefficient.defs.hh (1.6), src/Coefficient.inlines.hh
+ (1.5), src/Coefficient.types.hh (1.11),
+ src/Coefficient_traits_template.hh (1.4), src/Constraint.cc
+ (1.54), src/Constraint.defs.hh (1.112), src/Constraint.inlines.hh
+ (1.61), src/Constraint.types.hh (1.10), src/Constraint_System.cc
+ (1.15), src/Constraint_System.defs.hh (1.22),
+ src/Constraint_System.inlines.hh (1.7),
+ src/Constraint_System.types.hh (1.4), src/DB_Matrix.defs.hh
+ (1.14), src/DB_Matrix.inlines.hh (1.21), src/DB_Matrix.types.hh
+ (1.5), src/DB_Row.defs.hh (1.14), src/DB_Row.inlines.hh (1.16),
+ src/DB_Row.types.hh (1.6), src/Determinate.defs.hh (1.59),
+ src/Determinate.inlines.hh (1.51), src/Determinate.types.hh
+ (1.8), src/Float.cc (1.3), src/Float.defs.hh (1.16),
+ src/Float.inlines.hh (1.16), src/GMP_Integer.defs.hh (1.16),
+ src/GMP_Integer.inlines.hh (1.11), src/GMP_Integer.types.hh
+ (1.11), src/Generator.cc (1.67), src/Generator.defs.hh (1.112),
+ src/Generator.inlines.hh (1.58), src/Generator.types.hh (1.10),
+ src/Generator_System.cc (1.15), src/Generator_System.defs.hh
+ (1.11), src/Generator_System.inlines.hh (1.6),
+ src/Generator_System.types.hh (1.4), src/H79_Certificate.cc
+ (1.9), src/H79_Certificate.defs.hh (1.13),
+ src/H79_Certificate.inlines.hh (1.7),
+ src/H79_Certificate.types.hh (1.4), src/Init.cc (1.22),
+ src/Init.defs.hh (1.14), src/Init.types.hh (1.9), src/Interval.cc
+ (1.13), src/Interval.defs.hh (1.25), src/Interval.inlines.hh
+ (1.24), src/Interval.types.hh (1.11), src/LP_Problem.cc (1.4),
+ src/LP_Problem.defs.hh (1.3), src/LP_Problem.inlines.hh (1.4),
+ src/LP_Problem.types.hh (1.4), src/Limits.hh (1.8),
+ src/Linear_Expression.cc (1.8), src/Linear_Expression.defs.hh
+ (1.16), src/Linear_Expression.inlines.hh (1.6),
+ src/Linear_Expression.types.hh (1.4), src/Linear_Row.cc (1.16),
+ src/Linear_Row.defs.hh (1.13), src/Linear_Row.inlines.hh (1.10),
+ src/Linear_Row.types.hh (1.4), src/Linear_System.cc (1.33),
+ src/Linear_System.defs.hh (1.19), src/Linear_System.inlines.hh
+ (1.18), src/Linear_System.types.hh (1.4), src/Makefile.am
+ (1.134), src/Matrix.cc (1.89), src/Matrix.defs.hh (1.70),
+ src/Matrix.inlines.hh (1.47), src/Matrix.types.hh (1.10),
+ src/NNC_Polyhedron.cc (1.17), src/NNC_Polyhedron.defs.hh (1.40),
+ src/NNC_Polyhedron.inlines.hh (1.31), src/NNC_Polyhedron.types.hh
+ (1.10), src/Numeric_Format.defs.hh (1.5), src/Ph_Status.cc (1.8),
+ src/Ph_Status.idefs.hh (1.11), src/Ph_Status.inlines.hh (1.7),
+ src/Poly_Con_Relation.cc (1.11), src/Poly_Con_Relation.defs.hh
+ (1.28), src/Poly_Con_Relation.inlines.hh (1.14),
+ src/Poly_Con_Relation.types.hh (1.9), src/Poly_Gen_Relation.cc
+ (1.11), src/Poly_Gen_Relation.defs.hh (1.26),
+ src/Poly_Gen_Relation.inlines.hh (1.14),
+ src/Poly_Gen_Relation.types.hh (1.9), src/Polyhedra_Powerset.cc
+ (1.6), src/Polyhedra_Powerset.defs.hh (1.27),
+ src/Polyhedra_Powerset.inlines.hh (1.36),
+ src/Polyhedra_Powerset.types.hh (1.4), src/Polyhedron.defs.hh
+ (1.288), src/Polyhedron.inlines.hh (1.130),
+ src/Polyhedron.types.hh (1.16), src/Polyhedron_chdims.cc (1.35),
+ src/Polyhedron_nonpublic.cc (1.63), src/Polyhedron_public.cc
+ (1.70), src/Polyhedron_widenings.cc (1.52), src/Powerset.defs.hh
+ (1.14), src/Powerset.inlines.hh (1.13), src/Powerset.types.hh
+ (1.4), src/Ptr_Iterator.defs.hh (1.5),
+ src/Ptr_Iterator.inlines.hh (1.5), src/Ptr_Iterator.types.hh
+ (1.5), src/Result.defs.hh (1.12), src/Result.inlines.hh (1.7),
+ src/Rounding_Dir.defs.hh (1.6), src/Rounding_Dir.inlines.hh
+ (1.3), src/Row.cc (1.95), src/Row.defs.hh (1.99),
+ src/Row.inlines.hh (1.62), src/Row.types.hh (1.11),
+ src/Saturation_Matrix.cc (1.7), src/Saturation_Matrix.defs.hh
+ (1.4), src/Saturation_Matrix.inlines.hh (1.5),
+ src/Saturation_Matrix.types.hh (1.4), src/Saturation_Row.cc
+ (1.9), src/Saturation_Row.defs.hh (1.8),
+ src/Saturation_Row.inlines.hh (1.8), src/Saturation_Row.types.hh
+ (1.4), src/Scalar_Products.cc (1.3), src/Scalar_Products.defs.hh
+ (1.2), src/Scalar_Products.inlines.hh (1.2),
+ src/Scalar_Products.types.hh (1.2), src/Topology.hh (1.11),
+ src/Variable.cc (1.20), src/Variable.defs.hh (1.48),
+ src/Variable.inlines.hh (1.23), src/Variable.types.hh (1.10),
+ src/Widening_Function.defs.hh (1.13),
+ src/Widening_Function.inlines.hh (1.12),
+ src/Widening_Function.types.hh (1.5), src/algorithms.hh (1.44),
+ src/checked.cc (1.11), src/checked.defs.hh (1.30),
+ src/checked.inlines.hh (1.29), src/checked_ext.defs.hh (1.9),
+ src/checked_ext.inlines.hh (1.27), src/checked_float.inlines.hh
+ (1.55), src/checked_int.inlines.hh (1.43),
+ src/checked_mpq.inlines.hh (1.30), src/checked_mpz.inlines.hh
+ (1.34), src/checked_numeric_limits.hh (1.9), src/compiler.hh
+ (1.6), src/conversion.cc (1.77), src/float.types.hh (1.13),
+ src/fpu-c99.inlines.hh (1.8), src/fpu-ia32.inlines.hh (1.8),
+ src/fpu-none.inlines.hh (1.3), src/fpu.defs.hh (1.6),
+ src/globals.cc (1.24), src/globals.defs.hh (1.26),
+ src/globals.inlines.hh (1.14), src/globals.types.hh (1.4),
+ src/initializer.hh (1.12), src/max_space_dimension.hh (1.7),
+ src/minimize.cc (1.43), src/mp_numeric_limits.hh (1.3),
+ src/namespaces.hh (1.5), src/ppl-config.cc.in (1.11),
+ src/ppl_header.hh (1.4), src/simplify.cc (1.45),
+ src/swapping_sort.icc (1.10), src/version.cc (1.7),
+ src/version.hh.in (1.12), tests/BBox.cc (1.11), tests/BBox.hh
+ (1.10), tests/Makefile.am (1.247), tests/PFunction.cc (1.8),
+ tests/PFunction.hh (1.8), tests/Random_Number_Generator.defs.hh
+ (1.2), tests/Random_Number_Generator.inlines.hh (1.7),
+ tests/Random_Number_Generator.types.hh (1.2), tests/ehandlers.cc
+ (1.8), tests/ehandlers.hh (1.13), tests/files.cc (1.8),
+ tests/files.hh (1.9), tests/ppl_test.hh (1.31), tests/print.cc
+ (1.18), tests/print.hh (1.22), tests/BD_Shape/Makefile.am (1.31),
+ tests/BD_Shape/addconstraints1.cc (1.6),
+ tests/BD_Shape/addspacedims1.cc (1.7),
+ tests/BD_Shape/addspacedims2.cc (1.7),
+ tests/BD_Shape/addspacedims3.cc (1.8),
+ tests/BD_Shape/addspacedims4.cc (1.8),
+ tests/BD_Shape/addspacedims5.cc (1.9),
+ tests/BD_Shape/addspacedims6.cc (1.9),
+ tests/BD_Shape/addspacedims7.cc (1.7),
+ tests/BD_Shape/affinedimension1.cc (1.3),
+ tests/BD_Shape/affineimage1.cc (1.7),
+ tests/BD_Shape/affineimage10.cc (1.5),
+ tests/BD_Shape/affineimage2.cc (1.7),
+ tests/BD_Shape/affineimage3.cc (1.7),
+ tests/BD_Shape/affineimage4.cc (1.7),
+ tests/BD_Shape/affineimage5.cc (1.7),
+ tests/BD_Shape/affineimage6.cc (1.7),
+ tests/BD_Shape/affineimage7.cc (1.7),
+ tests/BD_Shape/affineimage8.cc (1.12),
+ tests/BD_Shape/affineimage9.cc (1.10),
+ tests/BD_Shape/affinepreimage1.cc (1.7),
+ tests/BD_Shape/affinepreimage2.cc (1.7),
+ tests/BD_Shape/affinepreimage3.cc (1.7),
+ tests/BD_Shape/affinepreimage4.cc (1.7),
+ tests/BD_Shape/affinepreimage5.cc (1.7),
+ tests/BD_Shape/ascii_dump_load1.cc (1.9),
+ tests/BD_Shape/ascii_dump_load2.cc (1.8),
+ tests/BD_Shape/bdsdifference1.cc (1.3),
+ tests/BD_Shape/bdsdifference2.cc (1.3),
+ tests/BD_Shape/bdsdifference3.cc (1.3),
+ tests/BD_Shape/bdsdifference4.cc (1.3),
+ tests/BD_Shape/bdsdifference5.cc (1.3),
+ tests/BD_Shape/bdsdifference6.cc (1.3),
+ tests/BD_Shape/bdsdifference7.cc (1.3),
+ tests/BD_Shape/bdshull1.cc (1.3), tests/BD_Shape/bdshull2.cc
+ (1.3), tests/BD_Shape/bdshull3.cc (1.3),
+ tests/BD_Shape/bdshull4.cc (1.3),
+ tests/BD_Shape/bgp99extrapolation1.cc (1.3),
+ tests/BD_Shape/bhmz05widening1.cc (1.2),
+ tests/BD_Shape/bhmz05widening2.cc (1.2),
+ tests/BD_Shape/bhmz05widening3.cc (1.2),
+ tests/BD_Shape/bhmz05widening4.cc (1.2),
+ tests/BD_Shape/bhmz05widening5.cc (1.2),
+ tests/BD_Shape/bhmz05widening6.cc (1.2),
+ tests/BD_Shape/bhmz05widening7.cc (1.2),
+ tests/BD_Shape/bhmz05widening8.cc (1.2),
+ tests/BD_Shape/bhz03widening1.cc (1.3),
+ tests/BD_Shape/cc76extrapolation1.cc (1.6),
+ tests/BD_Shape/cc76extrapolation2.cc (1.7),
+ tests/BD_Shape/cc76extrapolation3.cc (1.6),
+ tests/BD_Shape/cc76extrapolation4.cc (1.8),
+ tests/BD_Shape/cc76extrapolation5.cc (1.6),
+ tests/BD_Shape/cc76extrapolation6.cc (1.8),
+ tests/BD_Shape/cc76narrowing1.cc (1.6),
+ tests/BD_Shape/cc76narrowing2.cc (1.6),
+ tests/BD_Shape/cc76narrowing3.cc (1.6),
+ tests/BD_Shape/cc76narrowing4.cc (1.7),
+ tests/BD_Shape/cc76narrowing5.cc (1.7),
+ tests/BD_Shape/closure1.cc (1.11), tests/BD_Shape/concatenate1.cc
+ (1.7), tests/BD_Shape/concatenate2.cc (1.7),
+ tests/BD_Shape/concatenate3.cc (1.6),
+ tests/BD_Shape/concatenate4.cc (1.6),
+ tests/BD_Shape/concatenate5.cc (1.7),
+ tests/BD_Shape/constraints1.cc (1.9),
+ tests/BD_Shape/constraints2.cc (1.7), tests/BD_Shape/contains1.cc
+ (1.6), tests/BD_Shape/contains2.cc (1.8),
+ tests/BD_Shape/contains3.cc (1.8), tests/BD_Shape/empty1.cc
+ (1.6), tests/BD_Shape/empty2.cc (1.6), tests/BD_Shape/empty3.cc
+ (1.7), tests/BD_Shape/empty4.cc (1.6), tests/BD_Shape/empty5.cc
+ (1.6), tests/BD_Shape/equality1.cc (1.9),
+ tests/BD_Shape/exceptions1.cc (1.10),
+ tests/BD_Shape/exceptions2.cc (1.9),
+ tests/BD_Shape/exceptions3.cc (1.10),
+ tests/BD_Shape/fromgensys1.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.8),
+ tests/BD_Shape/generalizedaffineimage10.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage11.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage12.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage13.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage14.cc (1.10),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage3.cc (1.8),
+ tests/BD_Shape/generalizedaffineimage4.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage5.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage6.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage7.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage8.cc (1.7),
+ tests/BD_Shape/generalizedaffineimage9.cc (1.6),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.4),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.3),
+ tests/BD_Shape/geomcovers1.cc (1.3),
+ tests/BD_Shape/h79widening1.cc (1.6),
+ tests/BD_Shape/intersection1.cc (1.6),
+ tests/BD_Shape/intersection2.cc (1.6),
+ tests/BD_Shape/intersection3.cc (1.7),
+ tests/BD_Shape/intersection4.cc (1.8),
+ tests/BD_Shape/intersection5.cc (1.8),
+ tests/BD_Shape/intersection6.cc (1.7),
+ tests/BD_Shape/intersection7.cc (1.7),
+ tests/BD_Shape/intersection8.cc (1.7),
+ tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation2.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation3.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation4.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation5.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation6.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation7.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation8.cc (1.2),
+ tests/BD_Shape/limitedbhmz05extrapolation9.cc (1.2),
+ tests/BD_Shape/limitedcc76extrapolation1.cc (1.2),
+ tests/BD_Shape/limitedcc76extrapolation2.cc (1.2),
+ tests/BD_Shape/limitedcc76extrapolation3.cc (1.2),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.6),
+ tests/BD_Shape/mapspacedims1.cc (1.6),
+ tests/BD_Shape/mapspacedims2.cc (1.8),
+ tests/BD_Shape/mapspacedims3.cc (1.7),
+ tests/BD_Shape/mapspacedims4.cc (1.7),
+ tests/BD_Shape/maxspacedim.cc (1.9),
+ tests/BD_Shape/minconstraints1.cc (1.3),
+ tests/BD_Shape/relations1.cc (1.10), tests/BD_Shape/relations2.cc
+ (1.10), tests/BD_Shape/relations3.cc (1.9),
+ tests/BD_Shape/relations4.cc (1.8), tests/BD_Shape/relations5.cc
+ (1.10), tests/BD_Shape/removespacedims1.cc (1.7),
+ tests/BD_Shape/removespacedims2.cc (1.8),
+ tests/BD_Shape/removespacedims3.cc (1.8),
+ tests/BD_Shape/timeelapse1.cc (1.7),
+ tests/BD_Shape/timeelapse2.cc (1.6),
+ tests/BD_Shape/timeelapse3.cc (1.6),
+ tests/BD_Shape/timeelapse4.cc (1.6),
+ tests/BD_Shape/timeelapse5.cc (1.7), tests/BD_Shape/universe1.cc
+ (1.7), tests/BD_Shape/writebdshape1.cc (1.4),
+ tests/BD_Shape/writebdshape2.cc (1.5),
+ tests/Polyhedron/CbecomesNNC1.cc (1.6),
+ tests/Polyhedron/LP_Problem3.cc (1.4),
+ tests/Polyhedron/Makefile.am (1.40),
+ tests/Polyhedron/NNCbecomesC1.cc (1.6),
+ tests/Polyhedron/NNCminimize1.cc (1.6),
+ tests/Polyhedron/NNCminimize2.cc (1.6),
+ tests/Polyhedron/NNCminimize3.cc (1.6),
+ tests/Polyhedron/NNCminimize4.cc (1.6),
+ tests/Polyhedron/NNCminimize5.cc (1.6),
+ tests/Polyhedron/NNCminimize6.cc (1.6), tests/Polyhedron/README
+ (1.5), tests/Polyhedron/addconstraint1.cc (1.6),
+ tests/Polyhedron/addconstraint2.cc (1.7),
+ tests/Polyhedron/addconstraint3.cc (1.6),
+ tests/Polyhedron/addconstraints1.cc (1.7),
+ tests/Polyhedron/addconstraints10.cc (1.7),
+ tests/Polyhedron/addconstraints11.cc (1.6),
+ tests/Polyhedron/addconstraints12.cc (1.6),
+ tests/Polyhedron/addconstraints13.cc (1.7),
+ tests/Polyhedron/addconstraints2.cc (1.6),
+ tests/Polyhedron/addconstraints3.cc (1.7),
+ tests/Polyhedron/addconstraints4.cc (1.6),
+ tests/Polyhedron/addconstraints5.cc (1.7),
+ tests/Polyhedron/addconstraints6.cc (1.6),
+ tests/Polyhedron/addconstraints7.cc (1.7),
+ tests/Polyhedron/addconstraints8.cc (1.7),
+ tests/Polyhedron/addconstraints9.cc (1.6),
+ tests/Polyhedron/addgenerator1.cc (1.7),
+ tests/Polyhedron/addgenerator2.cc (1.7),
+ tests/Polyhedron/addgenerator3.cc (1.6),
+ tests/Polyhedron/addgenerator4.cc (1.7),
+ tests/Polyhedron/addgenerator5.cc (1.7),
+ tests/Polyhedron/addgenerators1.cc (1.7),
+ tests/Polyhedron/addgenerators10.cc (1.7),
+ tests/Polyhedron/addgenerators11.cc (1.7),
+ tests/Polyhedron/addgenerators12.cc (1.7),
+ tests/Polyhedron/addgenerators13.cc (1.7),
+ tests/Polyhedron/addgenerators2.cc (1.7),
+ tests/Polyhedron/addgenerators3.cc (1.6),
+ tests/Polyhedron/addgenerators4.cc (1.6),
+ tests/Polyhedron/addgenerators5.cc (1.6),
+ tests/Polyhedron/addgenerators6.cc (1.7),
+ tests/Polyhedron/addgenerators7.cc (1.6),
+ tests/Polyhedron/addgenerators8.cc (1.7),
+ tests/Polyhedron/addgenerators9.cc (1.6),
+ tests/Polyhedron/addspacedims1.cc (1.7),
+ tests/Polyhedron/addspacedims10.cc (1.6),
+ tests/Polyhedron/addspacedims11.cc (1.6),
+ tests/Polyhedron/addspacedims12.cc (1.6),
+ tests/Polyhedron/addspacedims13.cc (1.6),
+ tests/Polyhedron/addspacedims2.cc (1.7),
+ tests/Polyhedron/addspacedims3.cc (1.8),
+ tests/Polyhedron/addspacedims4.cc (1.6),
+ tests/Polyhedron/addspacedims5.cc (1.6),
+ tests/Polyhedron/addspacedims6.cc (1.6),
+ tests/Polyhedron/addspacedims7.cc (1.6),
+ tests/Polyhedron/addspacedims8.cc (1.7),
+ tests/Polyhedron/addspacedims9.cc (1.6),
+ tests/Polyhedron/affineimage1.cc (1.7),
+ tests/Polyhedron/affineimage2.cc (1.6),
+ tests/Polyhedron/affineimage3.cc (1.6),
+ tests/Polyhedron/affineimage4.cc (1.7),
+ tests/Polyhedron/affineimage5.cc (1.7),
+ tests/Polyhedron/affineimage6.cc (1.8),
+ tests/Polyhedron/affineimage7.cc (1.6),
+ tests/Polyhedron/affineimage8.cc (1.6),
+ tests/Polyhedron/affineimage9.cc (1.6),
+ tests/Polyhedron/affinepreimage1.cc (1.6),
+ tests/Polyhedron/affinepreimage10.cc (1.6),
+ tests/Polyhedron/affinepreimage11.cc (1.4),
+ tests/Polyhedron/affinepreimage2.cc (1.6),
+ tests/Polyhedron/affinepreimage3.cc (1.7),
+ tests/Polyhedron/affinepreimage4.cc (1.6),
+ tests/Polyhedron/affinepreimage5.cc (1.6),
+ tests/Polyhedron/affinepreimage6.cc (1.6),
+ tests/Polyhedron/affinepreimage7.cc (1.6),
+ tests/Polyhedron/affinepreimage8.cc (1.7),
+ tests/Polyhedron/affinepreimage9.cc (1.6),
+ tests/Polyhedron/affinetrans.cc (1.7),
+ tests/Polyhedron/append1.cc (1.6), tests/Polyhedron/append2.cc
+ (1.6), tests/Polyhedron/ascii_dump_load1.cc (1.6),
+ tests/Polyhedron/ascii_dump_load2.cc (1.6),
+ tests/Polyhedron/ascii_dump_load3.cc (1.6),
+ tests/Polyhedron/ascii_dump_load4.cc (1.6),
+ tests/Polyhedron/ascii_dump_load5.cc (1.6),
+ tests/Polyhedron/ascii_dump_load6.cc (1.7),
+ tests/Polyhedron/ascii_dump_load7.cc (1.6),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.7),
+ tests/Polyhedron/bgp99extrapolation2.cc (1.7),
+ tests/Polyhedron/bhrz03widening1.cc (1.6),
+ tests/Polyhedron/bhrz03widening10.cc (1.7),
+ tests/Polyhedron/bhrz03widening11.cc (1.6),
+ tests/Polyhedron/bhrz03widening12.cc (1.6),
+ tests/Polyhedron/bhrz03widening13.cc (1.6),
+ tests/Polyhedron/bhrz03widening14.cc (1.6),
+ tests/Polyhedron/bhrz03widening15.cc (1.7),
+ tests/Polyhedron/bhrz03widening16.cc (1.6),
+ tests/Polyhedron/bhrz03widening17.cc (1.6),
+ tests/Polyhedron/bhrz03widening18.cc (1.6),
+ tests/Polyhedron/bhrz03widening19.cc (1.6),
+ tests/Polyhedron/bhrz03widening2.cc (1.6),
+ tests/Polyhedron/bhrz03widening3.cc (1.6),
+ tests/Polyhedron/bhrz03widening4.cc (1.6),
+ tests/Polyhedron/bhrz03widening5.cc (1.6),
+ tests/Polyhedron/bhrz03widening6.cc (1.6),
+ tests/Polyhedron/bhrz03widening7.cc (1.6),
+ tests/Polyhedron/bhrz03widening8.cc (1.6),
+ tests/Polyhedron/bhrz03widening9.cc (1.6),
+ tests/Polyhedron/bhz03widening1.cc (1.8),
+ tests/Polyhedron/bhz03widening2.cc (1.8),
+ tests/Polyhedron/bhz03widening3.cc (1.8),
+ tests/Polyhedron/bhz03widening4.cc (1.7),
+ tests/Polyhedron/bhz03widening5.cc (1.7),
+ tests/Polyhedron/bhz03widening6.cc (1.8),
+ tests/Polyhedron/bounded1.cc (1.7),
+ tests/Polyhedron/boundedaffineimage1.cc (1.5),
+ tests/Polyhedron/boundedaffineimage2.cc (1.4),
+ tests/Polyhedron/boundedaffineimage3.cc (1.4),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.4),
+ tests/Polyhedron/boundedaffinepreimage2.cc (1.4),
+ tests/Polyhedron/boundedaffinepreimage3.cc (1.4),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.5),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.7),
+ tests/Polyhedron/boundingbox1.cc (1.8),
+ tests/Polyhedron/boundingbox2.cc (1.7),
+ tests/Polyhedron/boundingbox3.cc (1.7),
+ tests/Polyhedron/boundingbox4.cc (1.7),
+ tests/Polyhedron/boundingbox5.cc (1.7),
+ tests/Polyhedron/bounds1.cc (1.7), tests/Polyhedron/bounds2.cc
+ (1.6), tests/Polyhedron/bug2.cc (1.5),
+ tests/Polyhedron/concatenate1.cc (1.6),
+ tests/Polyhedron/concatenate2.cc (1.7),
+ tests/Polyhedron/concatenate3.cc (1.6),
+ tests/Polyhedron/concatenate4.cc (1.6),
+ tests/Polyhedron/concatenate5.cc (1.6),
+ tests/Polyhedron/concatenate6.cc (1.7),
+ tests/Polyhedron/concatenate7.cc (1.5),
+ tests/Polyhedron/constraints1.cc (1.6),
+ tests/Polyhedron/constraints2.cc (1.7),
+ tests/Polyhedron/constraints3.cc (1.6),
+ tests/Polyhedron/constraints4.cc (1.7),
+ tests/Polyhedron/constraints5.cc (1.5),
+ tests/Polyhedron/contains1.cc (1.6),
+ tests/Polyhedron/contains2.cc (1.6),
+ tests/Polyhedron/contains3.cc (1.6),
+ tests/Polyhedron/contains4.cc (1.6),
+ tests/Polyhedron/contains5.cc (1.6),
+ tests/Polyhedron/disjoint1.cc (1.6),
+ tests/Polyhedron/disjoint2.cc (1.7),
+ tests/Polyhedron/disjoint3.cc (1.7),
+ tests/Polyhedron/dualhypercubes.cc (1.6),
+ tests/Polyhedron/empty1.cc (1.7), tests/Polyhedron/equals1.cc
+ (1.6), tests/Polyhedron/exceptions1.cc (1.9),
+ tests/Polyhedron/exceptions2.cc (1.7),
+ tests/Polyhedron/exceptions3.cc (1.8),
+ tests/Polyhedron/expandspacedim1.cc (1.7),
+ tests/Polyhedron/expandspacedim2.cc (1.7),
+ tests/Polyhedron/foldspacedims1.cc (1.7),
+ tests/Polyhedron/foldspacedims2.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage10.cc (1.6),
+ tests/Polyhedron/generalizedaffineimage11.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage12.cc (1.6),
+ tests/Polyhedron/generalizedaffineimage13.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage14.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage3.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage4.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage5.cc (1.6),
+ tests/Polyhedron/generalizedaffineimage6.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage7.cc (1.7),
+ tests/Polyhedron/generalizedaffineimage8.cc (1.6),
+ tests/Polyhedron/generalizedaffineimage9.cc (1.6),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.4),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.4),
+ tests/Polyhedron/generalizedaffinepreimage3.cc (1.4),
+ tests/Polyhedron/generalizedaffinepreimage4.cc (1.4),
+ tests/Polyhedron/generators1.cc (1.6),
+ tests/Polyhedron/generators2.cc (1.6),
+ tests/Polyhedron/generators3.cc (1.7),
+ tests/Polyhedron/generators4.cc (1.7),
+ tests/Polyhedron/generators5.cc (1.6),
+ tests/Polyhedron/generators6.cc (1.7),
+ tests/Polyhedron/generators7.cc (1.6),
+ tests/Polyhedron/geomcovers1.cc (1.8),
+ tests/Polyhedron/gramschmidt1.cc (1.3),
+ tests/Polyhedron/h79widening1.cc (1.6),
+ tests/Polyhedron/h79widening2.cc (1.6),
+ tests/Polyhedron/h79widening3.cc (1.6),
+ tests/Polyhedron/h79widening4.cc (1.6),
+ tests/Polyhedron/h79widening5.cc (1.7),
+ tests/Polyhedron/h79widening6.cc (1.6),
+ tests/Polyhedron/h79widening7.cc (1.6),
+ tests/Polyhedron/h79widening8.cc (1.6),
+ tests/Polyhedron/intersection1.cc (1.6),
+ tests/Polyhedron/intersection10.cc (1.7),
+ tests/Polyhedron/intersection11.cc (1.7),
+ tests/Polyhedron/intersection2.cc (1.6),
+ tests/Polyhedron/intersection3.cc (1.6),
+ tests/Polyhedron/intersection4.cc (1.7),
+ tests/Polyhedron/intersection5.cc (1.7),
+ tests/Polyhedron/intersection6.cc (1.7),
+ tests/Polyhedron/intersection7.cc (1.6),
+ tests/Polyhedron/intersection8.cc (1.7),
+ tests/Polyhedron/intersection9.cc (1.7),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.6),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.6),
+ tests/Polyhedron/limitedh79extrapolation2.cc (1.6),
+ tests/Polyhedron/limitedh79extrapolation3.cc (1.6),
+ tests/Polyhedron/limitedh79extrapolation4.cc (1.7),
+ tests/Polyhedron/linearpartition1.cc (1.6),
+ tests/Polyhedron/linearpartition2.cc (1.6),
+ tests/Polyhedron/linearpartition3.cc (1.6),
+ tests/Polyhedron/linearpartition4.cc (1.7),
+ tests/Polyhedron/linearsystem1.cc (1.3),
+ tests/Polyhedron/linexpression1.cc (1.6),
+ tests/Polyhedron/lpproblem1.cc (1.2),
+ tests/Polyhedron/lpproblem2.cc (1.2),
+ tests/Polyhedron/mapspacedims1.cc (1.7),
+ tests/Polyhedron/mapspacedims2.cc (1.6),
+ tests/Polyhedron/mapspacedims3.cc (1.6),
+ tests/Polyhedron/mapspacedims4.cc (1.6),
+ tests/Polyhedron/matrix1.cc (1.6), tests/Polyhedron/max_min1.cc
+ (1.7), tests/Polyhedron/max_min2.cc (1.7),
+ tests/Polyhedron/maxspacedim1.cc (1.6), tests/Polyhedron/mc91.cc
+ (1.7), tests/Polyhedron/membytes1.cc (1.7),
+ tests/Polyhedron/membytes2.cc (1.6), tests/Polyhedron/memory1.cc
+ (1.8), tests/Polyhedron/memory2.cc (1.11),
+ tests/Polyhedron/minconstraints1.cc (1.6),
+ tests/Polyhedron/minconstraints2.cc (1.7),
+ tests/Polyhedron/minconstraints3.cc (1.6),
+ tests/Polyhedron/minconstraints4.cc (1.6),
+ tests/Polyhedron/mingenerators1.cc (1.6),
+ tests/Polyhedron/mingenerators2.cc (1.7),
+ tests/Polyhedron/mingenerators3.cc (1.6),
+ tests/Polyhedron/numberinput1.cc (1.20),
+ tests/Polyhedron/onepoint.cc (1.7), tests/Polyhedron/permute.cc
+ (1.6), tests/Polyhedron/polydifference1.cc (1.6),
+ tests/Polyhedron/polydifference2.cc (1.6),
+ tests/Polyhedron/polydifference3.cc (1.6),
+ tests/Polyhedron/polydifference4.cc (1.7),
+ tests/Polyhedron/polydifference5.cc (1.6),
+ tests/Polyhedron/polydifference6.cc (1.6),
+ tests/Polyhedron/polydifference7.cc (1.7),
+ tests/Polyhedron/polydifference8.cc (1.6),
+ tests/Polyhedron/polydifference9.cc (1.7),
+ tests/Polyhedron/polyhull1.cc (1.6),
+ tests/Polyhedron/polyhull10.cc (1.6),
+ tests/Polyhedron/polyhull11.cc (1.6),
+ tests/Polyhedron/polyhull2.cc (1.7),
+ tests/Polyhedron/polyhull3.cc (1.7),
+ tests/Polyhedron/polyhull4.cc (1.6),
+ tests/Polyhedron/polyhull5.cc (1.7),
+ tests/Polyhedron/polyhull6.cc (1.6),
+ tests/Polyhedron/polyhull7.cc (1.6),
+ tests/Polyhedron/polyhull8.cc (1.7),
+ tests/Polyhedron/polyhull9.cc (1.7),
+ tests/Polyhedron/polypowerset1.cc (1.8),
+ tests/Polyhedron/powerset1.cc (1.4),
+ tests/Polyhedron/randphull1.cc (1.7),
+ tests/Polyhedron/randphull2.cc (1.8),
+ tests/Polyhedron/relations1.cc (1.6),
+ tests/Polyhedron/relations10.cc (1.6),
+ tests/Polyhedron/relations11.cc (1.6),
+ tests/Polyhedron/relations12.cc (1.6),
+ tests/Polyhedron/relations13.cc (1.6),
+ tests/Polyhedron/relations14.cc (1.6),
+ tests/Polyhedron/relations15.cc (1.6),
+ tests/Polyhedron/relations16.cc (1.6),
+ tests/Polyhedron/relations17.cc (1.7),
+ tests/Polyhedron/relations18.cc (1.6),
+ tests/Polyhedron/relations19.cc (1.7),
+ tests/Polyhedron/relations2.cc (1.7),
+ tests/Polyhedron/relations3.cc (1.6),
+ tests/Polyhedron/relations4.cc (1.6),
+ tests/Polyhedron/relations5.cc (1.6),
+ tests/Polyhedron/relations6.cc (1.7),
+ tests/Polyhedron/relations7.cc (1.6),
+ tests/Polyhedron/relations8.cc (1.6),
+ tests/Polyhedron/relations9.cc (1.6),
+ tests/Polyhedron/removespacedims1.cc (1.6),
+ tests/Polyhedron/removespacedims10.cc (1.7),
+ tests/Polyhedron/removespacedims2.cc (1.6),
+ tests/Polyhedron/removespacedims3.cc (1.7),
+ tests/Polyhedron/removespacedims4.cc (1.6),
+ tests/Polyhedron/removespacedims5.cc (1.7),
+ tests/Polyhedron/removespacedims6.cc (1.6),
+ tests/Polyhedron/removespacedims7.cc (1.6),
+ tests/Polyhedron/removespacedims8.cc (1.6),
+ tests/Polyhedron/removespacedims9.cc (1.6),
+ tests/Polyhedron/smm1.cc (1.6), tests/Polyhedron/timeelapse1.cc
+ (1.6), tests/Polyhedron/timeelapse2.cc (1.7),
+ tests/Polyhedron/timeelapse3.cc (1.6),
+ tests/Polyhedron/timeelapse4.cc (1.6),
+ tests/Polyhedron/timeelapse5.cc (1.7),
+ tests/Polyhedron/timeelapse6.cc (1.6),
+ tests/Polyhedron/timeelapse7.cc (1.7),
+ tests/Polyhedron/timeelapse8.cc (1.7),
+ tests/Polyhedron/timeelapse9.cc (1.7),
+ tests/Polyhedron/topclosed1.cc (1.7),
+ tests/Polyhedron/topclosed2.cc (1.7),
+ tests/Polyhedron/topclosed3.cc (1.6),
+ tests/Polyhedron/topclosure1.cc (1.6),
+ tests/Polyhedron/topclosure2.cc (1.7),
+ tests/Polyhedron/topclosure3.cc (1.6),
+ tests/Polyhedron/topclosure4.cc (1.7),
+ tests/Polyhedron/universe1.cc (1.6),
+ tests/Polyhedron/universe2.cc (1.6),
+ tests/Polyhedron/universe3.cc (1.6),
+ tests/Polyhedron/universe4.cc (1.6),
+ tests/Polyhedron/universe5.cc (1.6),
+ tests/Polyhedron/universe6.cc (1.6),
+ tests/Polyhedron/universe7.cc (1.6),
+ tests/Polyhedron/watchdog1.cc (1.7),
+ tests/Polyhedron/writeconsys1.cc (1.6),
+ tests/Polyhedron/writegensys1.cc (1.6),
+ tests/Polyhedron/writegensys2.cc (1.7),
+ tests/Polyhedron/writegensys3.cc (1.6),
+ tests/Polyhedron/writepolyhedron1.cc (1.6),
+ tests/Polyhedron/writepolyhedron2.cc (1.6),
+ tests/Polyhedron/writepolyhedron3.cc (1.6),
+ tests/Polyhedron/writerelation1.cc (1.6),
+ tests/Polyhedron/writevariable1.cc (1.6), utils/Makefile.am
+ (1.11), utils/build_header.in (1.3), utils/text2cxxarray.in
+ (1.2), utils/timings.cc (1.6), utils/timings.hh (1.4): Copyright
+ years extended.
+
+2005-12-31 Saturday 18:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: primalsimplex1.cc (1.5), primalsimplex2.cc
+ (1.5): No longer testing the primal_simplex method.
+
+2005-12-31 Saturday 18:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.171): Do not announce the primal_simplex() methods; do
+ announce the LP_Problem class instead.
+
+2005-12-31 Saturday 18:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.181): The widening on BD_Shape is now the
+ BHMZ05 widening.
+
+2005-12-31 Saturday 18:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.146), ppl_c.h.in (1.59): Got rid of
+ the old interfaces for the primal simplex algorithm.
+
+2005-12-31 Saturday 18:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: LP_Problem1.cc (1.3), LP_Problem2.cc (1.3),
+ Makefile.am (1.39), lpproblem1.cc (1.1), lpproblem2.cc (1.1):
+ Renamed (and basically rewritten) tests for class LP_Problem.
+
+2005-12-31 Saturday 18:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.30), bhmz05widening1.cc (1.1),
+ bhmz05widening2.cc (1.1), bhmz05widening3.cc (1.1),
+ bhmz05widening4.cc (1.1), bhmz05widening5.cc (1.1),
+ bhmz05widening6.cc (1.1), bhmz05widening7.cc (1.1),
+ bhmz05widening8.cc (1.1), ch78widening1.cc (1.6),
+ ch78widening2.cc (1.7), ch78widening3.cc (1.6), ch78widening4.cc
+ (1.7), ch78widening5.cc (1.7), ch78widening6.cc (1.9),
+ ch78widening7.cc (1.6), ch78widening8.cc (1.7), exceptions2.cc
+ (1.8), limitedCC76extrapolation1.cc (1.6),
+ limitedCC76extrapolation2.cc (1.8), limitedCC76extrapolation3.cc
+ (1.8), limitedCH78extrapolation1.cc (1.7),
+ limitedCH78extrapolation2.cc (1.6), limitedCH78extrapolation3.cc
+ (1.6), limitedCH78extrapolation4.cc (1.6),
+ limitedCH78extrapolation5.cc (1.6), limitedCH78extrapolation6.cc
+ (1.6), limitedCH78extrapolation7.cc (1.6),
+ limitedCH78extrapolation8.cc (1.6), limitedCH78extrapolation9.cc
+ (1.6), limitedbhmz05extrapolation1.cc (1.1),
+ limitedbhmz05extrapolation2.cc (1.1),
+ limitedbhmz05extrapolation3.cc (1.1),
+ limitedbhmz05extrapolation4.cc (1.1),
+ limitedbhmz05extrapolation5.cc (1.1),
+ limitedbhmz05extrapolation6.cc (1.1),
+ limitedbhmz05extrapolation7.cc (1.1),
+ limitedbhmz05extrapolation8.cc (1.1),
+ limitedbhmz05extrapolation9.cc (1.1),
+ limitedcc76extrapolation1.cc (1.1), limitedcc76extrapolation2.cc
+ (1.1), limitedcc76extrapolation3.cc (1.1): Renaming the CH78
+ widening into BHMZ05 widening. Avoid uppercases in the tests'
+ filenames.
+
+2005-12-31 Saturday 18:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.55), BD_Shape.inlines.hh (1.115):
+ Method CH78_widening_assign() renamed as
+ BHMZ05_widening_assign(). Fixed a few problems in the
+ documentation. Fixed several occurrences of a problem regarding
+ the checked approximation of the negation of a Coefficient.
+
+2005-12-31 Saturday 18:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.129): Exploit LP_Problem when
+ (efficiently) testing for emptyness of the Polyhedron in method
+ shrink_bounding_box().
+
+2005-12-31 Saturday 18:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.62): Exploit the new LP_Problem
+ class in the implementation of minimization for NNC polyhedra.
+
+2005-12-31 Saturday 18:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.inlines.hh (1.3): Properly initialize and copy the
+ private member working_cost.
+
+2005-12-31 Saturday 18:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am (1.133), simplex.cc (1.35): Got rid of the old
+ simplex implementation.
+
+2005-12-31 Saturday 18:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh (1.21): Got rid of the primal
+ simplex methods.
+
+2005-12-31 Saturday 18:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.111): Corrected documentation for
+ private method set_is_inequality().
+
+2005-12-31 Saturday 18:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.62), devref.doxyconf-latex.in
+ (1.5), user.doxyconf-html.in (1.32), user.doxyconf-latex.in
+ (1.4): Updated to the new version of doxygen (1.4.6). Completed
+ the list of input files for the devref manual.
+
+2005-12-31 Saturday 18:03 Abramo Bagnara
+
+ * src/checked.cc (1.10): Reverted to old version and fixed it.
+
+2005-12-31 Saturday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.19): Fixed another expected
+ result.
+
+2005-12-31 Saturday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.18): Fixed some expected
+ results.
+
+2005-12-31 Saturday 17:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.17): FIX comments removed:
+ some were OK, some were not.
+
+2005-12-31 Saturday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.cc (1.5): Added a missing \relates Doxygen
+ command.
+
+2005-12-31 Saturday 15:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh (1.15), GMP_Integer.inlines.hh (1.10):
+ Added binary version of neg_assign().
+
+2005-12-31 Saturday 12:23 Abramo Bagnara
+
+ * tests/Polyhedron/numberinput1.cc (1.16): Rewritten test function.
+
+2005-12-31 Saturday 12:17 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.50): Missing rename.
+
+2005-12-31 Saturday 11:40 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.51), interfaces/C/ppl_c.cc (1.145),
+ interfaces/Prolog/ppl_prolog.icc (1.167),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.38),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.33),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.83),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.109),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.74),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.100), src/BD_Shape.inlines.hh
+ (1.114), src/Bounding_Box.inlines.hh (1.13),
+ src/Checked_Number.defs.hh (1.46), src/Checked_Number.inlines.hh
+ (1.49), src/DB_Matrix.inlines.hh (1.20),
+ src/Polyhedron.inlines.hh (1.128), src/Polyhedron_nonpublic.cc
+ (1.61), tests/Random_Number_Generator.inlines.hh (1.6),
+ tests/BD_Shape/closure1.cc (1.10): Renamed assign in assign_r for
+ congruency.
+
+2005-12-30 Friday 23:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.180): Removed a repeated "the".
+
+2005-12-30 Friday 23:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.165): Removed two items:
+
+ - Improve the documentation of Polyhedron::shrink_bounding_box().
+ See
+ http://www.cs.unipr.it/pipermail/ppl-devel/2005-July/006191.html.
+ (documentation of Polyhedron::shrink_bounding_box() has been
+ improved.)
+
+ - The documentation has been read through but a more careful
+ check, particularly on the detailed descriptions, should be
+ done.
+
+2005-12-30 Friday 23:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.287): Added more explanation regarding
+ shrink_bounding_box.
+
+2005-12-30 Friday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Expression.cc (1.7): Removed excessive uses of
+ vertical space.
+
+2005-12-30 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_Expression.defs.hh (1.15), Polyhedron.defs.hh
+ (1.286): Removed excessive indentation in Doxygen comments.
+
+2005-12-30 Friday 21:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/LP_Problem3.cc (1.3): Avoid a space dimension
+ compatibility problem.
+
+2005-12-30 Friday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.50), interfaces/C/ppl_c.cc (1.144),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.37),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.32),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.82),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.108),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.73), src/BD_Shape.inlines.hh
+ (1.113), src/Bounding_Box.inlines.hh (1.12),
+ src/Polyhedron.inlines.hh (1.127), src/Polyhedron_nonpublic.cc
+ (1.60): Got rid of most uses of raw_value().
+
+2005-12-30 Friday 21:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.11): Delete trailing whitespace.
+
+2005-12-30 Friday 21:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.143): Added a couple of missing spaces.
+
+2005-12-30 Friday 21:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.58): Corrected the documentation for
+ the return value of ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.166): Fixed indentation in a
+ switch statement. Added the missing default case in another
+ switch statement.
+
+2005-12-30 Friday 21:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.16), expected_mpz (1.5),
+ expected_mpz_a (1.5): Make check now also perform many tests
+ using the simplex algorithm. Expected results for mpz
+ coefficients changed accordingly.
+
+2005-12-30 Friday 21:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.25): Check for all possible values
+ that can be returned by ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.35): Added namespace
+ qualification to a doxygen \relates command for a function that
+ is no longer in the anonymous namespace.
+
+2005-12-30 Friday 21:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GMP_Integer.types.hh (1.10): Let the brief doxygen
+ documentation be actually printed.
+
+2005-12-30 Friday 19:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ptr_Iterator.types.hh (1.4): Replaced a use of `class' with
+ `typename'.
+
+2005-12-30 Friday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.types.hh (1.3), BD_Shape.types.hh (1.4),
+ BHRZ03_Certificate.types.hh (1.3), Bounding_Box.types.hh (1.3),
+ C_Polyhedron.types.hh (1.9), Constraint.types.hh (1.9),
+ Constraint_System.types.hh (1.3), DB_Matrix.types.hh (1.4),
+ DB_Row.types.hh (1.5), Determinate.types.hh (1.7),
+ Generator.types.hh (1.9), Generator_System.types.hh (1.3),
+ H79_Certificate.types.hh (1.3), Init.types.hh (1.8),
+ Interval.types.hh (1.10), LP_Problem.types.hh (1.3),
+ Linear_Expression.types.hh (1.3), Linear_Row.types.hh (1.3),
+ Linear_System.types.hh (1.3), Matrix.types.hh (1.9),
+ NNC_Polyhedron.types.hh (1.9), Poly_Con_Relation.types.hh (1.8),
+ Poly_Gen_Relation.types.hh (1.8), Polyhedra_Powerset.types.hh
+ (1.3), Powerset.types.hh (1.3), Row.types.hh (1.10),
+ Saturation_Matrix.types.hh (1.3), Saturation_Row.types.hh (1.3),
+ Variable.types.hh (1.9), Widening_Function.types.hh (1.4):
+ Namespaces' closing brackets should always be commented.
+
+2005-12-30 Friday 19:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Coefficient.types.hh (1.10): Include "Checked_Number.defs.hh"
+ unconditionally.
+
+2005-12-30 Friday 19:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/namespaces.hh (1.4): Namespaces' closing brackets should
+ always be commented.
+
+2005-12-30 Friday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.170), demos/ppl_lpsol/Makefile.am (1.15): With the new
+ simplex implementation, ppl_lpsol is indeed a quite useful tool:
+ it is now installed in $(bindir) upon `make install'.
+
+2005-12-30 Friday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.24): New option --enumerate, dual
+ to --simplex.
+
+2005-12-30 Friday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Coefficient.defs.hh (1.5), Coefficient.types.hh (1.9),
+ Makefile.am (1.132), Native_Integer.defs.hh (1.17),
+ Native_Integer.inlines.hh (1.20), Native_Integer.types.hh (1.11):
+ Old implementation of native integer coefficients phased out:
+ checked numbers with the transparent policy are used instead.
+
+2005-12-30 Friday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.199): When native integers are requested, use
+ checked numbers with the transparent policy for the coefficients.
+ Version number bumped.
+
+2005-12-30 Friday 17:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.23): Require at least version 8 of
+ the PPL.
+
+2005-12-30 Friday 17:10 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.45), Checked_Number.inlines.hh
+ (1.48), checked.defs.hh (1.29): More visibility to
+ Checked_Number_Transparent_Policy.
+
+2005-12-30 Friday 16:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.22): Now also accepting the long
+ option --simplex. Avoid a duplicated timing output and do not
+ claim optimization (in the output) when the LP problem has been
+ found unfeasible or unbounded.
+
+2005-12-30 Friday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.inlines.hh (1.19): Implemented template
+ <typename T> Native_Integer<T>::operator T() const.
+
+2005-12-30 Friday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.88): Added an assertion on the parameter of
+ permute_columns().
+
+2005-12-30 Friday 10:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.112): Added a missing namespace
+ qualification in code expoiting the new simplex implementation.
+
+2005-12-30 Friday 09:36 Abramo Bagnara
+
+ * src/: BD_Shape.inlines.hh (1.111), Checked_Number.defs.hh (1.44),
+ Checked_Number.inlines.hh (1.47), Constraint.cc (1.53),
+ DB_Matrix.inlines.hh (1.19), GMP_Integer.defs.hh (1.14),
+ GMP_Integer.inlines.hh (1.9), Generator.cc (1.66), LP_Problem.cc
+ (1.3), Linear_Expression.cc (1.6), Linear_Row.cc (1.15),
+ Linear_System.cc (1.32), Native_Integer.defs.hh (1.16),
+ Native_Integer.inlines.hh (1.18), Polyhedron_public.cc (1.69),
+ Row.cc (1.94), conversion.cc (1.76), simplex.cc (1.34): Renamed
+ assign functors for congruency.
+
+2005-12-30 Friday 09:34 Abramo Bagnara
+
+ * src/: checked_int.inlines.hh (1.42), checked_numeric_limits.hh
+ (1.8): Cleaner implementation of limits.
+
+2005-12-29 Thursday 22:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.21), doc/devref.doxyconf-html.in
+ (1.61), interfaces/C/ppl_c.cc (1.142), interfaces/C/ppl_c.h.in
+ (1.57), interfaces/Prolog/Prolog_interface.dox (1.139),
+ interfaces/Prolog/exceptions.hh (1.18),
+ interfaces/Prolog/ppl_prolog.icc (1.165),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.107),
+ src/BD_Shape.inlines.hh (1.110), src/Constraint_System.defs.hh
+ (1.20), src/LP_Problem.cc (1.2), src/LP_Problem.defs.hh (1.2),
+ src/LP_Problem.inlines.hh (1.2), src/LP_Problem.types.hh (1.2),
+ src/Linear_Expression.defs.hh (1.14), src/Makefile.am (1.131),
+ src/Polyhedron_nonpublic.cc (1.59), src/globals.types.hh (1.3),
+ src/simplex.cc (1.33), tests/Polyhedron/LP_Problem1.cc (1.2),
+ tests/Polyhedron/LP_Problem2.cc (1.2),
+ tests/Polyhedron/LP_Problem3.cc (1.2),
+ tests/Polyhedron/Makefile.am (1.38),
+ tests/Polyhedron/primalsimplex1.cc (1.4),
+ tests/Polyhedron/primalsimplex2.cc (1.4): First merge of the
+ simplex branch to the main trunk.
+
+2005-12-29 Thursday 20:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.4): Stick to use the new
+ interface for the simplex algorithm.
+
+2005-12-29 Thursday 08:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.198): Check for egrep: we use it to perform some
+ version checks.
+
+2005-12-29 Thursday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.169), interfaces/Prolog/Prolog_interface.dox (1.138),
+ m4/ac_check_swi_prolog.m4 (1.7): We now require SWI-Prolog 5.6.0
+ or later version: the AC_CHECK_SWI_PROLOG macro checks that this
+ requirement is fulfilled.
+
+2005-12-29 Thursday 07:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.93): Avoid shadowing variables (and the consequent
+ compiler warnings).
+
+2005-12-28 Wednesday 17:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.168): Added an item regarding the implementation of the
+ domain of BD shapes.
+
+2005-12-28 Wednesday 17:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[13,13]):
+ Throwing the documented exceptions when appropriate. Method OK()
+ is no longer inlined and now performs some more accurate
+ consistency check.
+
+2005-12-28 Wednesday 17:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LP_Problem.defs.hh (simplex.12): Added documentation about
+ exceptions that should be thrown.
+
+2005-12-27 Tuesday 13:45 Andrea Cimino
+
+ * tests/Polyhedron/LP_Problem3.cc (simplex.3): Enabled by mistake
+ NOISY macro: now disabled.
+
+2005-12-27 Tuesday 13:44 Andrea Cimino
+
+ * tests/Polyhedron/LP_Problem3.cc (simplex.2): Inserted another
+ challenger: the problem is solved also adding `incrementally'
+ constraints to a Constraint_System and applying the simplex
+ algorithm.
+
+2005-12-25 Sunday 13:07 Andrea Cimino
+
+ * tests/Polyhedron/: LP_Problem1.cc, LP_Problem3.cc
+ (simplex.[5,1]): Added another test to check LP_Problem's
+ incrementality. Avoid useless inclusions.
+
+2005-12-24 Saturday 12:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.109), Checked_Number.defs.hh (1.43):
+ Two FIXME replaced by corresponding TODO. Minor variable name
+ improvements in generalized_affine_preimage. Splitted too long
+ lines in Checked_Number.defs.hh.
+
+2005-12-24 Saturday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.54): Indentation fixed.
+
+2005-12-24 Saturday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.164): A couple of items dealt with.
+
+2005-12-24 Saturday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.167), STANDARDS (1.28): A couple of minor improvements.
+
+2005-12-24 Saturday 12:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog.icc, src/BD_Shape.inlines.hh,
+ src/Constraint_System.defs.hh, src/LP_Problem.cc,
+ src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+ src/LP_Problem.types.hh, src/Polyhedron_nonpublic.cc,
+ src/globals.types.hh, src/simplex.cc,
+ tests/Polyhedron/LP_Problem1.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/primalsimplex1.cc,
+ tests/Polyhedron/primalsimplex2.cc
+ (simplex.[3,3,3,2,2,2,3,12,11,12,2,1,2,2,4,2,1,1]): The
+ enumeration Simplex_Status renamed as LP_Problem_Status. Its
+ definition moved into LP_Problem.types.hh.
+
+2005-12-23 Friday 17:03 Matthew Mundell
+
+ * src/Grid_public.cc (grids.127): Update the constraint system
+ adding methods to leave the check on the existence of rows in the
+ temporary congruence system to the method that will add that
+ congruence system.
+
+2005-12-23 Friday 16:51 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.inlines.hh
+ (grids.[38,12]): Ensure that all constructors create at least two
+ columns.
+
+2005-12-23 Friday 15:48 Matthew Mundell
+
+ * src/Grid_public.cc (grids.126): Enable the all-zero parameter OK
+ check.
+
+2005-12-23 Friday 15:48 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (grids.17): Add the all-zero
+ parameter behaviour to the insert(g) description.
+
+2005-12-23 Friday 15:41 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.25): Adding setting of the
+ first pending row index to the recycling_insert methods.
+
+2005-12-23 Friday 14:40 Matthew Mundell
+
+ * tests/Grid/isuniverse1.cc (grids.9): Add three tests where the
+ grid is defined by a minimized congruence system.
+
+2005-12-23 Friday 14:39 Matthew Mundell
+
+ * src/Grid_public.cc (grids.125): Leave the is_universe assumption
+ that the minimized universe congruence system always contains
+ exactly the integrality congruence.
+
+2005-12-23 Friday 14:38 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.29): Add a query about using the
+ congruence system in remove_space_dimensions.
+
+2005-12-23 Friday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.166): Our tentative release date for PPL 0.8 is January
+ 20, 2006.
+
+2005-12-23 Friday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.163): Two items moved from PPL 0.8 to PPL 0.9. Added one
+ more item to PPL 0.9.
+
+2005-12-23 Friday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: generalizedaffinepreimage1.cc (1.3),
+ generalizedaffinepreimage2.cc (1.2): Avoid using useless explicit
+ constructors for Linear_Expression. Maximum allowed distances
+ updated to reflect the approximations incurred by integer
+ coefficient types.
+
+2005-12-23 Friday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.108): Minor improvements in the
+ comments of generalized_affine_preimage.
+
+2005-12-23 Friday 09:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (simplex.1): Added the
+ list of predicates related to the new PPL object LP_Problem.
+
+2005-12-22 Thursday 20:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh, ppl_prolog.icc,
+ SWI/ppl_swiprolog.cc, tests/pl_check.pl (simplex.[1,1,1,1]):
+ Drafted the (SWI) Prolog interface for class LP_Problem.
+
+2005-12-22 Thursday 20:01 Matthew Mundell
+
+ * tests/Grid/relations2.cc (grids.7): Add test10 to test13, which
+ test grids with divisors that are greater than one.
+
+2005-12-22 Thursday 20:00 Matthew Mundell
+
+ * src/Grid_public.cc (grids.124): Account for the divisor in the
+ parameter case of relation_with(g) by modulating the scalar
+ product by the product of the parameter divisor and the modulus,
+ instead of by just the modulus.
+
+2005-12-22 Thursday 17:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[2,2]): Added the
+ encoding of domain_error. The changes in the LP_Problem
+ interface reflected here.
+
+2005-12-22 Thursday 17:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[11,10,11]): Methods is_satisfiable(), solve(),
+ feasible_point() and optimizing_point() are now declared const.
+ A few stylistic and doxygen comments improvements.
+
+2005-12-22 Thursday 17:41 Matthew Mundell
+
+ * src/Grid_public.cc (grids.123): Update OK to check that the
+ con_sys and grid space dimensions match when con_sys is empty.
+
+ Update add_recycled_generators_and_minimize to insert the
+ generators with Grid_Generator_System::recycling_insert.
+
+ Replace the add_recycled_generators call in
+ generalized_affine_image(l,r,m) with equivalent, quicker code.
+
+2005-12-22 Thursday 17:37 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[24,16]): Add recycling_insert(g).
+
+2005-12-22 Thursday 17:35 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.inlines.hh
+ (grids.[13,15]): Implement operator<< directly, adding divisor
+ output for parameters.
+
+2005-12-22 Thursday 17:33 Matthew Mundell
+
+ * src/Matrix.defs.hh (grids.6): Correct typo in add_recycled_row
+ description.
+
+2005-12-22 Thursday 13:21 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.23): Improve the insert query
+ about wrapping an NNC generator.
+
+2005-12-22 Thursday 13:08 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.22): Leave the tmp_row
+ allocation in insert alone (tmp_row is a stack variable so the
+ Linear_Row destructor will be called and it will free the memory
+ in tmp_row).
+
+2005-12-21 Wednesday 19:14 Matthew Mundell
+
+ * src/Grid_public.cc (grids.122): Add divisor normalization after
+ the parameter insertion in generalized_affine_image.
+
+ Update add_generator(g) to make one normalize_divisor call when
+ the grid originally contained points.
+
+2005-12-21 Wednesday 19:09 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.65): Include parameters in the
+ normalize_divisors(sys,d,f) LCM calculation.
+
+2005-12-21 Wednesday 19:07 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.28): Add divisor normalization after
+ inserting parameters in add_space_dimensions and
+ add_space_dimensions_and_project.
+
+2005-12-21 Wednesday 19:06 Matthew Mundell
+
+ * src/Grid_Generator.cc (grids.12): Update scale_to_divisor to
+ leave the divisor column out of the scaling.
+
+2005-12-21 Wednesday 19:03 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.21): Update affine_image to
+ use Grid_Generator and Grid_Generator_System instead of Generator
+ and Generator_System.
+
+2005-12-21 Wednesday 19:01 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.16): Make parens in find_variation
+ messages consistent.
+
+2005-12-21 Wednesday 17:10 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.20): Update method insert to
+ leave alone the divisors of inserted parameters (Grid will
+ normalize the divisors).
+
+2005-12-21 Wednesday 17:03 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.13): Revert to the actual
+ known grid in test3.
+
+2005-12-21 Wednesday 17:02 Elena Mazzi
+
+ * tests/BD_Shape/generalizedaffinepreimage1.cc (1.2): Try to use
+ the distance computation so as to detect when a computed result
+ is ok even if different from the known result.
+
+2005-12-21 Wednesday 16:17 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.50): Update map_space_dimensions to
+ call grid_line in place of line.
+
+2005-12-21 Wednesday 16:14 Matthew Mundell
+
+ * src/: Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[15,9]): Take out
+ insert(g).
+
+2005-12-21 Wednesday 16:14 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_Generator.inlines.hh (grids.[11,18,14]): Add
+ throw_invalid_argument. Update the divisor methods to throw
+ std::invalid_argument if the generator is a line.
+
+2005-12-21 Wednesday 16:14 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[91,64]): Take out
+ the throw_topology_incompatible methods.
+
+2005-12-21 Wednesday 15:41 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[10,17]):
+ Update scale_to_divisor to throw std::invalid_argument if the
+ given divisor is zero.
+
+2005-12-21 Wednesday 14:31 Matthew Mundell
+
+ * src/Grid_public.cc (grids.121): Update Grid(n,k) to trust the
+ divisor value of the trivially true point created by grid_point.
+
+2005-12-21 Wednesday 14:30 Elena Mazzi
+
+ * src/BD_Shape.defs.hh (1.53), src/BD_Shape.inlines.hh (1.107),
+ tests/BD_Shape/Makefile.am (1.29),
+ tests/BD_Shape/generalizedaffinepreimage1.cc (1.1),
+ tests/BD_Shape/generalizedaffinepreimage2.cc (1.1): Defined a new
+ method: BD_Shape::generalized_affine_preimage(var, relsym, expr,
+ den). Added some tests about this method.
+
+2005-12-21 Wednesday 14:28 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.32): Correct a comment in the
+ congruence to generator conversion.
+
+2005-12-21 Wednesday 14:27 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.19): Keep the
+ add_universe_rows_and_columns num_columns assertion.
+
+2005-12-21 Wednesday 14:24 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_nonpublic.cc (grids.[90,9,16,63]): Update
+ Grid::normalize_divisors(sys,d,f) to simply return zero when the
+ given divisor is zero. The previous special behaviour in the
+ zero case be accomplished by passing a divisor of one.
+
+ Rename Grid_Generator::multiply to
+ Grid_Generator::scale_to_divisor. Correct the description of
+ this method.
+
+ Leave the factor normalization in
+ Grid_Generator::is_equivalent_to as the only normalization, as
+ sign normalization would only be required if divisors could be
+ negative.
+
+2005-12-21 Wednesday 14:04 Matthew Mundell
+
+ * tests/Grid/generator1.cc (grids.4): Enable test5 (comparison of
+ parameters that have divisors > 1).
+
+2005-12-20 Tuesday 21:49 Matthew Mundell
+
+ * tests/Grid/relations1.cc (grids.6): Use parameter divisors in
+ test6 and test7.
+
+2005-12-20 Tuesday 21:48 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.12): Temporarily match the
+ expected result in test3 to the actual result.
+
+2005-12-20 Tuesday 21:48 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.12): Correct the expected result in
+ test4.
+
+2005-12-20 Tuesday 21:47 Matthew Mundell
+
+ * tests/Grid/isuniverse1.cc (grids.8): Correct the fail case in
+ test10.
+
+2005-12-20 Tuesday 21:46 Matthew Mundell
+
+ * tests/Grid/congruencesystem2.cc (grids.11): Use parameter
+ divisors.
+
+2005-12-20 Tuesday 21:45 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.27): Take some old code out of
+ add_space_dimensions_and_embed.
+
+2005-12-20 Tuesday 21:44 Matthew Mundell
+
+ * src/: Congruence_System.cc, Grid.inlines.hh,
+ Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+ Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+ (grids.[37,49,14,8,62,120,43]): [rest of previous commit]
+
+ Add parameter divisors, encoding the divisors in an extra
+ trailing Grid_Generator column:
+
+ - implement the Grid_Generator methods point, line,
+ is_equivalent_to
+ and all_homogeneous_terms_are_zero directly, instead of
+ wrapping
+ the Generator equivalents
+
+ - move Grid_Generator::strong_normalize to the private section
+
+ - update Grid_Generator_System to swap the divisor column any
+ time
+ the system size changes
+
+ - update methods Congruence_System::satisfies_all_congruences
+ and
+ Grid::relation_with(g) to use the given generator's divisor
+ instead
+ of a divisor passed in an extra argument
+
+ - update the generator reduction and congruence to generator
+ conversion to ensure that the parameter divisors match the
+ divisor
+ of the first point after the reduction or conversion
+
+ - adapt Grid and Scalar_Product to the extra generator column
+ (mostly
+ changes to loop indexing)
+
+ - add a Grid_Generator friend declaration to Linear_Expression.
+
+ Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 21:41 Matthew Mundell
+
+ * src/: Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+ Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+ Grid_Generator_System.cc, Grid_conversion.cc,
+ Linear_Expression.defs.hh, Scalar_Products.cc
+ (grids.[22,89,8,15,13,18,31,10,5]): Add parameter divisors,
+ encoding the divisors in an extra trailing Grid_Generator column:
+
+ - implement the Grid_Generator methods point, line,
+ is_equivalent_to
+ and all_homogeneous_terms_are_zero directly, instead of
+ wrapping
+ the Generator equivalents
+
+ - move Grid_Generator::strong_normalize to the private section
+
+ - update Grid_Generator_System to swap the divisor column any
+ time
+ the system size changes
+
+ - update methods Congruence_System::satisfies_all_congruences
+ and
+ Grid::relation_with(g) to use the given generator's divisor
+ instead
+ of a divisor passed in an extra argument
+
+ - update the generator reduction and congruence to generator
+ conversion to ensure that the parameter divisors match the
+ divisor
+ of the first point after the reduction or conversion
+
+ - adapt Grid and Scalar_Product to the extra generator column
+ (mostly
+ changes to loop indexing)
+
+ - add a Grid_Generator friend declaration to Linear_Expression.
+
+ Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 11:42 Andrea Cimino
+
+ * src/LP_Problem.defs.hh (simplex.9): Synchronized Doxygen stuff to
+ reflect last changes to LP_Problem interface.
+
+2005-12-20 Tuesday 08:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Random_Number_Generator.inlines.hh (1.5): Avoid anonymous
+ namespaces in files that are going to be included.
+
+2005-12-20 Tuesday 08:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BDS_Status.inlines.hh (1.8), BD_Shape.inlines.hh (1.106),
+ Native_Integer.inlines.hh (1.17), Polyhedra_Powerset.inlines.hh
+ (1.34), namespaces.hh (1.3): Avoid the use of anonymous
+ namespaces in files that are going to be included.
+
+2005-12-19 Monday 20:22 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, copyconstruct1.cc (grids.[54,1]): Add
+ copyconstruct1, to test Grid copy construction.
+
+2005-12-19 Monday 20:21 Matthew Mundell
+
+ * src/Grid_public.cc (grids.119): Update the copy constructor to
+ always copy the systems when the space dimension is zero.
+
+2005-12-19 Monday 07:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.34), config.sub (1.32), install-sh (1.16),
+ ltmain.sh (1.27), Watchdog/config.guess (1.18),
+ Watchdog/config.sub (1.17), Watchdog/install-sh (1.13),
+ Watchdog/ltmain.sh (1.16): Updated from Libtool 1.5.22.
+
+2005-12-18 Sunday 18:21 Andrea Cimino
+
+ * src/LP_Problem.cc (simplex.10): Improved swap_base(): now
+ directly handles `base'.
+
+2005-12-18 Sunday 16:56 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[9,8,10]): second_phase() declared void. Many inline
+ methods simplified: `status' cases during the real simplex
+ computations are now handled only by is_satisfiable() and
+ second_phase().
+
+2005-12-17 Saturday 01:31 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.61): Enable the system equality
+ checks in quick_equivalence_test.
+
+2005-12-17 Saturday 01:30 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.19): Negate the coefficient used
+ to create the zero_dim_integrality congruence (so that the
+ resulting constant term is positive).
+
+2005-12-17 Saturday 01:25 Matthew Mundell
+
+ * src/: Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[13,7]): Add
+ Grid_Generator_System::is_equal_to(ggs) and operator==(ggs,ggs).
+
+2005-12-16 Friday 23:38 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.48): Add note for map_space_dimensions
+ code awaiting parameter divisors.
+
+2005-12-16 Friday 23:26 Matthew Mundell
+
+ * src/Grid_public.cc (grids.118): Improve relation descriptions in
+ relation_with(cg).
+
+2005-12-16 Friday 23:01 Matthew Mundell
+
+ * src/: Grid_nonpublic.cc, Grid_simplify.cc (grids.[60,42]): Move
+ update_generators system column assertion into congruence
+ simplify.
+
+2005-12-16 Friday 21:13 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.36): Add Constraint_System
+ includes.
+
+2005-12-16 Friday 11:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.27): Avoid anonymous namespaces in header files.
+
+2005-12-15 Thursday 14:50 Matthew Mundell
+
+ * src/Grid_public.cc (grids.117): Update add_generator(g) to insert
+ the given generator, instead of inserting a copy, when the grid
+ contains points.
+
+2005-12-15 Thursday 14:25 Matthew Mundell
+
+ * src/Grid_public.cc (grids.116): Confirm that creation of the
+ universe systems in Grid(n,k) works. Slightly improve spacing
+ and a few comments in Grid(n,k).
+
+2005-12-15 Thursday 14:15 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (grids.14): Move Grid_Generator(g) to
+ the private section.
+
+2005-12-15 Thursday 14:14 Matthew Mundell
+
+ * src/Grid_Generator.cc (grids.7): Improve the note about
+ converting the Generator in function `parameter' to a
+ Grid_Generator.
+
+2005-12-15 Thursday 01:20 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[8,9]): Minor
+ stylistic and performance improvements.
+
+2005-12-14 Wednesday 22:13 Matthew Mundell
+
+ * src/checked_mpz.inlines.hh (grids.6): Update the mpz_gcd call in
+ gcdext_mpz to mpz_gcdext.
+
+2005-12-14 Wednesday 21:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.162): New to-do item.
+
+2005-12-14 Wednesday 21:02 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.59): Update set_zero_dim_univ to
+ leave the con_sys size adjustment to Congruence_System::clear.
+
+2005-12-14 Wednesday 20:24 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[17,12]): Update remove_higher_space_dimensions with a
+ dimension compatibility check, to return immediately if the
+ dimension will remain the same, and to clear the system if the
+ new dimension is 0.
+
+2005-12-14 Wednesday 19:37 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[16,11]): Update remove_space_dimensions to check the
+ space dim of the given set and to exit immediately if the set is
+ empty.
+
+2005-12-14 Wednesday 18:21 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[15,10]): Update recycling_insert to increase the system
+ space dimension if that of the system being inserted is bigger.
+
+2005-12-14 Wednesday 17:40 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.14): Leave it up to the
+ add_universe_rows_and_columns to ensure that the system will
+ contain a point.
+
+2005-12-14 Wednesday 17:10 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.47): Revert map_space_dimensions to
+ insert parameters via function point for now (as the given
+ expression already uses the system divisor).
+
+2005-12-14 Wednesday 16:56 Matthew Mundell
+
+ * tests/Grid/generalizedaffineimage1.cc (grids.6): Correct expected
+ values in test2, test4, test5 and test6 (now that parameter
+ divisors are adjusted at insertion).
+
+2005-12-14 Wednesday 16:38 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.13): Update method insert to
+ represent inserted parameters with the divisor of the first
+ point.
+
+2005-12-14 Wednesday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.26): Added a section about test programs.
+
+2005-12-14 Wednesday 12:44 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[7,7]): Better
+ handled namespaces. `PPL::LP_Problem::primal_simplex()' removed,
+ was unused. Fixed return types in
+ `PPL::LP_Problem::is_feasible()'.
+
+2005-12-14 Wednesday 12:10 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[6,6,8]): Internal enum `Status' fields renamed from
+ PROBLEM_* to *. Added a FIXME.
+
+2005-12-14 Wednesday 11:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/addconstraints1.cc (1.5),
+ BD_Shape/addspacedims1.cc (1.6), BD_Shape/addspacedims2.cc (1.6),
+ BD_Shape/addspacedims3.cc (1.7), BD_Shape/addspacedims4.cc (1.7),
+ BD_Shape/addspacedims5.cc (1.8), BD_Shape/addspacedims6.cc (1.8),
+ BD_Shape/addspacedims7.cc (1.6), BD_Shape/affinedimension1.cc
+ (1.2), BD_Shape/affineimage1.cc (1.6), BD_Shape/affineimage10.cc
+ (1.4), BD_Shape/affineimage2.cc (1.6), BD_Shape/affineimage3.cc
+ (1.6), BD_Shape/affineimage4.cc (1.6), BD_Shape/affineimage5.cc
+ (1.6), BD_Shape/affineimage6.cc (1.6), BD_Shape/affineimage7.cc
+ (1.6), BD_Shape/affineimage8.cc (1.11), BD_Shape/affineimage9.cc
+ (1.9), BD_Shape/affinepreimage1.cc (1.6),
+ BD_Shape/affinepreimage2.cc (1.6), BD_Shape/affinepreimage3.cc
+ (1.6), BD_Shape/affinepreimage4.cc (1.6),
+ BD_Shape/affinepreimage5.cc (1.6), BD_Shape/ascii_dump_load1.cc
+ (1.8), BD_Shape/ascii_dump_load2.cc (1.7),
+ BD_Shape/bdsdifference1.cc (1.2), BD_Shape/bdsdifference2.cc
+ (1.2), BD_Shape/bdsdifference3.cc (1.2),
+ BD_Shape/bdsdifference4.cc (1.2), BD_Shape/bdsdifference5.cc
+ (1.2), BD_Shape/bdsdifference6.cc (1.2),
+ BD_Shape/bdsdifference7.cc (1.2), BD_Shape/bdshull1.cc (1.2),
+ BD_Shape/bdshull2.cc (1.2), BD_Shape/bdshull3.cc (1.2),
+ BD_Shape/bdshull4.cc (1.2), BD_Shape/bgp99extrapolation1.cc
+ (1.2), BD_Shape/bhz03widening1.cc (1.2),
+ BD_Shape/cc76extrapolation1.cc (1.5),
+ BD_Shape/cc76extrapolation2.cc (1.6),
+ BD_Shape/cc76extrapolation3.cc (1.5),
+ BD_Shape/cc76extrapolation4.cc (1.7),
+ BD_Shape/cc76extrapolation5.cc (1.5),
+ BD_Shape/cc76extrapolation6.cc (1.7), BD_Shape/cc76narrowing1.cc
+ (1.5), BD_Shape/cc76narrowing2.cc (1.5),
+ BD_Shape/cc76narrowing3.cc (1.5), BD_Shape/cc76narrowing4.cc
+ (1.6), BD_Shape/cc76narrowing5.cc (1.6),
+ BD_Shape/ch78widening1.cc (1.5), BD_Shape/ch78widening2.cc (1.6),
+ BD_Shape/ch78widening3.cc (1.5), BD_Shape/ch78widening4.cc (1.6),
+ BD_Shape/ch78widening5.cc (1.6), BD_Shape/ch78widening6.cc (1.8),
+ BD_Shape/ch78widening7.cc (1.5), BD_Shape/ch78widening8.cc (1.6),
+ BD_Shape/closure1.cc (1.9), BD_Shape/concatenate1.cc (1.6),
+ BD_Shape/concatenate2.cc (1.6), BD_Shape/concatenate3.cc (1.5),
+ BD_Shape/concatenate4.cc (1.5), BD_Shape/concatenate5.cc (1.6),
+ BD_Shape/constraints1.cc (1.8), BD_Shape/constraints2.cc (1.6),
+ BD_Shape/contains1.cc (1.5), BD_Shape/contains2.cc (1.7),
+ BD_Shape/contains3.cc (1.7), BD_Shape/empty1.cc (1.5),
+ BD_Shape/empty2.cc (1.5), BD_Shape/empty3.cc (1.6),
+ BD_Shape/empty4.cc (1.5), BD_Shape/empty5.cc (1.5),
+ BD_Shape/equality1.cc (1.8), BD_Shape/exceptions1.cc (1.9),
+ BD_Shape/exceptions2.cc (1.7), BD_Shape/exceptions3.cc (1.9),
+ BD_Shape/fromgensys1.cc (1.5),
+ BD_Shape/generalizedaffineimage1.cc (1.7),
+ BD_Shape/generalizedaffineimage10.cc (1.6),
+ BD_Shape/generalizedaffineimage11.cc (1.5),
+ BD_Shape/generalizedaffineimage12.cc (1.5),
+ BD_Shape/generalizedaffineimage13.cc (1.5),
+ BD_Shape/generalizedaffineimage14.cc (1.9),
+ BD_Shape/generalizedaffineimage2.cc (1.6),
+ BD_Shape/generalizedaffineimage3.cc (1.7),
+ BD_Shape/generalizedaffineimage4.cc (1.6),
+ BD_Shape/generalizedaffineimage5.cc (1.6),
+ BD_Shape/generalizedaffineimage6.cc (1.5),
+ BD_Shape/generalizedaffineimage7.cc (1.6),
+ BD_Shape/generalizedaffineimage8.cc (1.6),
+ BD_Shape/generalizedaffineimage9.cc (1.5),
+ BD_Shape/geomcovers1.cc (1.2), BD_Shape/h79widening1.cc (1.5),
+ BD_Shape/intersection1.cc (1.5), BD_Shape/intersection2.cc (1.5),
+ BD_Shape/intersection3.cc (1.6), BD_Shape/intersection4.cc (1.7),
+ BD_Shape/intersection5.cc (1.7), BD_Shape/intersection6.cc (1.6),
+ BD_Shape/intersection7.cc (1.6), BD_Shape/intersection8.cc (1.6),
+ BD_Shape/limitedCC76extrapolation1.cc (1.5),
+ BD_Shape/limitedCC76extrapolation2.cc (1.7),
+ BD_Shape/limitedCC76extrapolation3.cc (1.7),
+ BD_Shape/limitedCH78extrapolation1.cc (1.6),
+ BD_Shape/limitedCH78extrapolation2.cc (1.5),
+ BD_Shape/limitedCH78extrapolation3.cc (1.5),
+ BD_Shape/limitedCH78extrapolation4.cc (1.5),
+ BD_Shape/limitedCH78extrapolation5.cc (1.5),
+ BD_Shape/limitedCH78extrapolation6.cc (1.5),
+ BD_Shape/limitedCH78extrapolation7.cc (1.5),
+ BD_Shape/limitedCH78extrapolation8.cc (1.5),
+ BD_Shape/limitedCH78extrapolation9.cc (1.5),
+ BD_Shape/limitedh79extrapolation1.cc (1.5),
+ BD_Shape/mapspacedims1.cc (1.5), BD_Shape/mapspacedims2.cc (1.7),
+ BD_Shape/mapspacedims3.cc (1.6), BD_Shape/mapspacedims4.cc (1.6),
+ BD_Shape/maxspacedim.cc (1.8), BD_Shape/minconstraints1.cc (1.2),
+ BD_Shape/relations1.cc (1.9), BD_Shape/relations2.cc (1.9),
+ BD_Shape/relations3.cc (1.8), BD_Shape/relations4.cc (1.7),
+ BD_Shape/relations5.cc (1.9), BD_Shape/removespacedims1.cc (1.6),
+ BD_Shape/removespacedims2.cc (1.7), BD_Shape/removespacedims3.cc
+ (1.7), BD_Shape/timeelapse1.cc (1.6), BD_Shape/timeelapse2.cc
+ (1.5), BD_Shape/timeelapse3.cc (1.5), BD_Shape/timeelapse4.cc
+ (1.5), BD_Shape/timeelapse5.cc (1.6), BD_Shape/universe1.cc
+ (1.6), BD_Shape/writebdshape1.cc (1.3), BD_Shape/writebdshape2.cc
+ (1.4), Polyhedron/CbecomesNNC1.cc (1.5),
+ Polyhedron/NNCbecomesC1.cc (1.5), Polyhedron/NNCminimize1.cc
+ (1.5), Polyhedron/NNCminimize2.cc (1.5),
+ Polyhedron/NNCminimize3.cc (1.5), Polyhedron/NNCminimize4.cc
+ (1.5), Polyhedron/NNCminimize5.cc (1.5),
+ Polyhedron/NNCminimize6.cc (1.5), Polyhedron/addconstraint1.cc
+ (1.5), Polyhedron/addconstraint2.cc (1.6),
+ Polyhedron/addconstraint3.cc (1.5), Polyhedron/addconstraints1.cc
+ (1.6), Polyhedron/addconstraints10.cc (1.6),
+ Polyhedron/addconstraints11.cc (1.5),
+ Polyhedron/addconstraints12.cc (1.5),
+ Polyhedron/addconstraints13.cc (1.6),
+ Polyhedron/addconstraints2.cc (1.5),
+ Polyhedron/addconstraints3.cc (1.6),
+ Polyhedron/addconstraints4.cc (1.5),
+ Polyhedron/addconstraints5.cc (1.6),
+ Polyhedron/addconstraints6.cc (1.5),
+ Polyhedron/addconstraints7.cc (1.6),
+ Polyhedron/addconstraints8.cc (1.6),
+ Polyhedron/addconstraints9.cc (1.5), Polyhedron/addgenerator1.cc
+ (1.6), Polyhedron/addgenerator2.cc (1.6),
+ Polyhedron/addgenerator3.cc (1.5), Polyhedron/addgenerator4.cc
+ (1.6), Polyhedron/addgenerator5.cc (1.6),
+ Polyhedron/addgenerators1.cc (1.6), Polyhedron/addgenerators10.cc
+ (1.6), Polyhedron/addgenerators11.cc (1.6),
+ Polyhedron/addgenerators12.cc (1.6),
+ Polyhedron/addgenerators13.cc (1.6), Polyhedron/addgenerators2.cc
+ (1.6), Polyhedron/addgenerators3.cc (1.5),
+ Polyhedron/addgenerators4.cc (1.5), Polyhedron/addgenerators5.cc
+ (1.5), Polyhedron/addgenerators6.cc (1.6),
+ Polyhedron/addgenerators7.cc (1.5), Polyhedron/addgenerators8.cc
+ (1.6), Polyhedron/addgenerators9.cc (1.5),
+ Polyhedron/addspacedims1.cc (1.6), Polyhedron/addspacedims10.cc
+ (1.5), Polyhedron/addspacedims11.cc (1.5),
+ Polyhedron/addspacedims12.cc (1.5), Polyhedron/addspacedims13.cc
+ (1.5), Polyhedron/addspacedims2.cc (1.6),
+ Polyhedron/addspacedims3.cc (1.7), Polyhedron/addspacedims4.cc
+ (1.5), Polyhedron/addspacedims5.cc (1.5),
+ Polyhedron/addspacedims6.cc (1.5), Polyhedron/addspacedims7.cc
+ (1.5), Polyhedron/addspacedims8.cc (1.6),
+ Polyhedron/addspacedims9.cc (1.5), Polyhedron/affineimage1.cc
+ (1.6), Polyhedron/affineimage2.cc (1.5),
+ Polyhedron/affineimage3.cc (1.5), Polyhedron/affineimage4.cc
+ (1.6), Polyhedron/affineimage5.cc (1.6),
+ Polyhedron/affineimage6.cc (1.7), Polyhedron/affineimage7.cc
+ (1.5), Polyhedron/affineimage8.cc (1.5),
+ Polyhedron/affineimage9.cc (1.5), Polyhedron/affinepreimage1.cc
+ (1.5), Polyhedron/affinepreimage10.cc (1.5),
+ Polyhedron/affinepreimage11.cc (1.3),
+ Polyhedron/affinepreimage2.cc (1.5),
+ Polyhedron/affinepreimage3.cc (1.6),
+ Polyhedron/affinepreimage4.cc (1.5),
+ Polyhedron/affinepreimage5.cc (1.5),
+ Polyhedron/affinepreimage6.cc (1.5),
+ Polyhedron/affinepreimage7.cc (1.5),
+ Polyhedron/affinepreimage8.cc (1.6),
+ Polyhedron/affinepreimage9.cc (1.5), Polyhedron/affinetrans.cc
+ (1.6), Polyhedron/append1.cc (1.5), Polyhedron/append2.cc (1.5),
+ Polyhedron/ascii_dump_load1.cc (1.5),
+ Polyhedron/ascii_dump_load2.cc (1.5),
+ Polyhedron/ascii_dump_load3.cc (1.5),
+ Polyhedron/ascii_dump_load4.cc (1.5),
+ Polyhedron/ascii_dump_load5.cc (1.5),
+ Polyhedron/ascii_dump_load6.cc (1.6),
+ Polyhedron/ascii_dump_load7.cc (1.5),
+ Polyhedron/bgp99extrapolation1.cc (1.6),
+ Polyhedron/bgp99extrapolation2.cc (1.6),
+ Polyhedron/bhrz03widening1.cc (1.5),
+ Polyhedron/bhrz03widening10.cc (1.6),
+ Polyhedron/bhrz03widening11.cc (1.5),
+ Polyhedron/bhrz03widening12.cc (1.5),
+ Polyhedron/bhrz03widening13.cc (1.5),
+ Polyhedron/bhrz03widening14.cc (1.5),
+ Polyhedron/bhrz03widening15.cc (1.6),
+ Polyhedron/bhrz03widening16.cc (1.5),
+ Polyhedron/bhrz03widening17.cc (1.5),
+ Polyhedron/bhrz03widening18.cc (1.5),
+ Polyhedron/bhrz03widening19.cc (1.5),
+ Polyhedron/bhrz03widening2.cc (1.5),
+ Polyhedron/bhrz03widening3.cc (1.5),
+ Polyhedron/bhrz03widening4.cc (1.5),
+ Polyhedron/bhrz03widening5.cc (1.5),
+ Polyhedron/bhrz03widening6.cc (1.5),
+ Polyhedron/bhrz03widening7.cc (1.5),
+ Polyhedron/bhrz03widening8.cc (1.5),
+ Polyhedron/bhrz03widening9.cc (1.5), Polyhedron/bhz03widening1.cc
+ (1.7), Polyhedron/bhz03widening2.cc (1.7),
+ Polyhedron/bhz03widening3.cc (1.7), Polyhedron/bhz03widening4.cc
+ (1.6), Polyhedron/bhz03widening5.cc (1.6),
+ Polyhedron/bhz03widening6.cc (1.7), Polyhedron/bounded1.cc (1.6),
+ Polyhedron/boundedaffineimage1.cc (1.4),
+ Polyhedron/boundedaffineimage2.cc (1.3),
+ Polyhedron/boundedaffineimage3.cc (1.3),
+ Polyhedron/boundedaffinepreimage1.cc (1.3),
+ Polyhedron/boundedaffinepreimage2.cc (1.3),
+ Polyhedron/boundedaffinepreimage3.cc (1.3),
+ Polyhedron/boundedbhrz03extrapolation1.cc (1.4),
+ Polyhedron/boundedh79extrapolation1.cc (1.6),
+ Polyhedron/boundingbox1.cc (1.7), Polyhedron/boundingbox2.cc
+ (1.6), Polyhedron/boundingbox3.cc (1.6),
+ Polyhedron/boundingbox4.cc (1.6), Polyhedron/boundingbox5.cc
+ (1.6), Polyhedron/bounds1.cc (1.6), Polyhedron/bounds2.cc (1.5),
+ Polyhedron/bug2.cc (1.4), Polyhedron/concatenate1.cc (1.5),
+ Polyhedron/concatenate2.cc (1.6), Polyhedron/concatenate3.cc
+ (1.5), Polyhedron/concatenate4.cc (1.5),
+ Polyhedron/concatenate5.cc (1.5), Polyhedron/concatenate6.cc
+ (1.6), Polyhedron/concatenate7.cc (1.4),
+ Polyhedron/constraints1.cc (1.5), Polyhedron/constraints2.cc
+ (1.6), Polyhedron/constraints3.cc (1.5),
+ Polyhedron/constraints4.cc (1.6), Polyhedron/constraints5.cc
+ (1.4), Polyhedron/contains1.cc (1.5), Polyhedron/contains2.cc
+ (1.5), Polyhedron/contains3.cc (1.5), Polyhedron/contains4.cc
+ (1.5), Polyhedron/contains5.cc (1.5), Polyhedron/disjoint1.cc
+ (1.5), Polyhedron/disjoint2.cc (1.6), Polyhedron/disjoint3.cc
+ (1.6), Polyhedron/dualhypercubes.cc (1.5), Polyhedron/empty1.cc
+ (1.6), Polyhedron/equals1.cc (1.5), Polyhedron/exceptions1.cc
+ (1.8), Polyhedron/exceptions2.cc (1.6), Polyhedron/exceptions3.cc
+ (1.7), Polyhedron/expandspacedim1.cc (1.6),
+ Polyhedron/expandspacedim2.cc (1.6), Polyhedron/foldspacedims1.cc
+ (1.6), Polyhedron/foldspacedims2.cc (1.6),
+ Polyhedron/generalizedaffineimage1.cc (1.6),
+ Polyhedron/generalizedaffineimage10.cc (1.5),
+ Polyhedron/generalizedaffineimage11.cc (1.6),
+ Polyhedron/generalizedaffineimage12.cc (1.5),
+ Polyhedron/generalizedaffineimage13.cc (1.4),
+ Polyhedron/generalizedaffineimage14.cc (1.4),
+ Polyhedron/generalizedaffineimage2.cc (1.6),
+ Polyhedron/generalizedaffineimage3.cc (1.6),
+ Polyhedron/generalizedaffineimage4.cc (1.6),
+ Polyhedron/generalizedaffineimage5.cc (1.5),
+ Polyhedron/generalizedaffineimage6.cc (1.6),
+ Polyhedron/generalizedaffineimage7.cc (1.6),
+ Polyhedron/generalizedaffineimage8.cc (1.5),
+ Polyhedron/generalizedaffineimage9.cc (1.5),
+ Polyhedron/generalizedaffinepreimage1.cc (1.3),
+ Polyhedron/generalizedaffinepreimage2.cc (1.3),
+ Polyhedron/generalizedaffinepreimage3.cc (1.3),
+ Polyhedron/generalizedaffinepreimage4.cc (1.3),
+ Polyhedron/generators1.cc (1.5), Polyhedron/generators2.cc (1.5),
+ Polyhedron/generators3.cc (1.6), Polyhedron/generators4.cc (1.6),
+ Polyhedron/generators5.cc (1.5), Polyhedron/generators6.cc (1.6),
+ Polyhedron/generators7.cc (1.5), Polyhedron/geomcovers1.cc (1.7),
+ Polyhedron/gramschmidt1.cc (1.2), Polyhedron/h79widening1.cc
+ (1.5), Polyhedron/h79widening2.cc (1.5),
+ Polyhedron/h79widening3.cc (1.5), Polyhedron/h79widening4.cc
+ (1.5), Polyhedron/h79widening5.cc (1.6),
+ Polyhedron/h79widening6.cc (1.5), Polyhedron/h79widening7.cc
+ (1.5), Polyhedron/h79widening8.cc (1.5),
+ Polyhedron/intersection1.cc (1.5), Polyhedron/intersection10.cc
+ (1.6), Polyhedron/intersection11.cc (1.6),
+ Polyhedron/intersection2.cc (1.5), Polyhedron/intersection3.cc
+ (1.5), Polyhedron/intersection4.cc (1.6),
+ Polyhedron/intersection5.cc (1.6), Polyhedron/intersection6.cc
+ (1.6), Polyhedron/intersection7.cc (1.5),
+ Polyhedron/intersection8.cc (1.6), Polyhedron/intersection9.cc
+ (1.6), Polyhedron/limitedbhrz03extrapolation1.cc (1.5),
+ Polyhedron/limitedh79extrapolation1.cc (1.5),
+ Polyhedron/limitedh79extrapolation2.cc (1.5),
+ Polyhedron/limitedh79extrapolation3.cc (1.5),
+ Polyhedron/limitedh79extrapolation4.cc (1.6),
+ Polyhedron/linearpartition1.cc (1.5),
+ Polyhedron/linearpartition2.cc (1.5),
+ Polyhedron/linearpartition3.cc (1.5),
+ Polyhedron/linearpartition4.cc (1.6), Polyhedron/linearsystem1.cc
+ (1.2), Polyhedron/linexpression1.cc (1.5),
+ Polyhedron/mapspacedims1.cc (1.6), Polyhedron/mapspacedims2.cc
+ (1.5), Polyhedron/mapspacedims3.cc (1.5),
+ Polyhedron/mapspacedims4.cc (1.5), Polyhedron/matrix1.cc (1.5),
+ Polyhedron/max_min1.cc (1.6), Polyhedron/max_min2.cc (1.6),
+ Polyhedron/maxspacedim1.cc (1.5), Polyhedron/mc91.cc (1.6),
+ Polyhedron/membytes1.cc (1.6), Polyhedron/membytes2.cc (1.5),
+ Polyhedron/memory1.cc (1.7), Polyhedron/memory2.cc (1.10),
+ Polyhedron/minconstraints1.cc (1.5),
+ Polyhedron/minconstraints2.cc (1.6),
+ Polyhedron/minconstraints3.cc (1.5),
+ Polyhedron/minconstraints4.cc (1.5), Polyhedron/mingenerators1.cc
+ (1.5), Polyhedron/mingenerators2.cc (1.6),
+ Polyhedron/mingenerators3.cc (1.5), Polyhedron/numberinput1.cc
+ (1.15), Polyhedron/onepoint.cc (1.6), Polyhedron/permute.cc
+ (1.5), Polyhedron/polydifference1.cc (1.5),
+ Polyhedron/polydifference2.cc (1.5),
+ Polyhedron/polydifference3.cc (1.5),
+ Polyhedron/polydifference4.cc (1.6),
+ Polyhedron/polydifference5.cc (1.5),
+ Polyhedron/polydifference6.cc (1.5),
+ Polyhedron/polydifference7.cc (1.6),
+ Polyhedron/polydifference8.cc (1.5),
+ Polyhedron/polydifference9.cc (1.6), Polyhedron/polyhull1.cc
+ (1.5), Polyhedron/polyhull10.cc (1.5), Polyhedron/polyhull11.cc
+ (1.5), Polyhedron/polyhull2.cc (1.6), Polyhedron/polyhull3.cc
+ (1.6), Polyhedron/polyhull4.cc (1.5), Polyhedron/polyhull5.cc
+ (1.6), Polyhedron/polyhull6.cc (1.5), Polyhedron/polyhull7.cc
+ (1.5), Polyhedron/polyhull8.cc (1.6), Polyhedron/polyhull9.cc
+ (1.6), Polyhedron/polypowerset1.cc (1.7), Polyhedron/powerset1.cc
+ (1.3), Polyhedron/primalsimplex1.cc (1.3),
+ Polyhedron/primalsimplex2.cc (1.3), Polyhedron/randphull1.cc
+ (1.6), Polyhedron/randphull2.cc (1.7), Polyhedron/relations1.cc
+ (1.5), Polyhedron/relations10.cc (1.5), Polyhedron/relations11.cc
+ (1.5), Polyhedron/relations12.cc (1.5), Polyhedron/relations13.cc
+ (1.5), Polyhedron/relations14.cc (1.5), Polyhedron/relations15.cc
+ (1.5), Polyhedron/relations16.cc (1.5), Polyhedron/relations17.cc
+ (1.6), Polyhedron/relations18.cc (1.5), Polyhedron/relations19.cc
+ (1.6), Polyhedron/relations2.cc (1.6), Polyhedron/relations3.cc
+ (1.5), Polyhedron/relations4.cc (1.5), Polyhedron/relations5.cc
+ (1.5), Polyhedron/relations6.cc (1.6), Polyhedron/relations7.cc
+ (1.5), Polyhedron/relations8.cc (1.5), Polyhedron/relations9.cc
+ (1.5), Polyhedron/removespacedims1.cc (1.5),
+ Polyhedron/removespacedims10.cc (1.6),
+ Polyhedron/removespacedims2.cc (1.5),
+ Polyhedron/removespacedims3.cc (1.6),
+ Polyhedron/removespacedims4.cc (1.5),
+ Polyhedron/removespacedims5.cc (1.6),
+ Polyhedron/removespacedims6.cc (1.5),
+ Polyhedron/removespacedims7.cc (1.5),
+ Polyhedron/removespacedims8.cc (1.5),
+ Polyhedron/removespacedims9.cc (1.5), Polyhedron/smm1.cc (1.5),
+ Polyhedron/timeelapse1.cc (1.5), Polyhedron/timeelapse2.cc (1.6),
+ Polyhedron/timeelapse3.cc (1.5), Polyhedron/timeelapse4.cc (1.5),
+ Polyhedron/timeelapse5.cc (1.6), Polyhedron/timeelapse6.cc (1.5),
+ Polyhedron/timeelapse7.cc (1.6), Polyhedron/timeelapse8.cc (1.6),
+ Polyhedron/timeelapse9.cc (1.6), Polyhedron/topclosed1.cc (1.6),
+ Polyhedron/topclosed2.cc (1.6), Polyhedron/topclosed3.cc (1.5),
+ Polyhedron/topclosure1.cc (1.5), Polyhedron/topclosure2.cc (1.6),
+ Polyhedron/topclosure3.cc (1.5), Polyhedron/topclosure4.cc (1.6),
+ Polyhedron/universe1.cc (1.5), Polyhedron/universe2.cc (1.5),
+ Polyhedron/universe3.cc (1.5), Polyhedron/universe4.cc (1.5),
+ Polyhedron/universe5.cc (1.5), Polyhedron/universe6.cc (1.5),
+ Polyhedron/universe7.cc (1.5), Polyhedron/watchdog1.cc (1.6),
+ Polyhedron/writeconsys1.cc (1.5), Polyhedron/writegensys1.cc
+ (1.5), Polyhedron/writegensys2.cc (1.6),
+ Polyhedron/writegensys3.cc (1.5), Polyhedron/writepolyhedron1.cc
+ (1.5), Polyhedron/writepolyhedron2.cc (1.5),
+ Polyhedron/writepolyhedron3.cc (1.5),
+ Polyhedron/writerelation1.cc (1.5), Polyhedron/writevariable1.cc
+ (1.5): All the test programs in Polyhedron and BD_Shape rewritten
+ so as to direct their output to nout and vnout without explicitly
+ checking preprocessor variables.
+
+2005-12-14 Wednesday 11:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.30), print.cc (1.17), print.hh (1.21):
+ Defined the output streams nout and vnout to help in the control
+ of the noisy level of test programs. By default, the helper print
+ functions now print on ostream nout. Also added in ppl_tests.hh
+ an using directive for the whole PPL namespace and a using
+ declaration for std::endl.
+
+2005-12-14 Wednesday 11:33 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[5,5,7]): Documentation stuff removed from
+ implementation file. Removed redundant parentheses.
+
+2005-12-13 Tuesday 14:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.49): Always add a space between
+ "catch" and "(".
+
+2005-12-13 Tuesday 14:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.10): Remove trailing whitespace; always
+ add a space between "catch" and "(".
+
+2005-12-13 Tuesday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.141): Always add a space between "catch"
+ and the following "(".
+
+2005-12-13 Tuesday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.13): Remove trailing
+ whitespace.
+
+2005-12-12 Monday 21:36 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_Generator.cc,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator_System.defs.hh, src/Grid_nonpublic.cc,
+ src/Grid_public.cc, tests/Grid/addcongruences1.cc,
+ tests/Grid/addgenerator1.cc, tests/Grid/addspacedims1.cc,
+ tests/Grid/addspacedims2.cc, tests/Grid/affinedim1.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/affinepreimage1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+ tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruences1.cc, tests/Grid/congruencesystem2.cc,
+ tests/Grid/contains1.cc, tests/Grid/contains2.cc,
+ tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+ tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+ tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+ tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/mingenerators1.cc,
+ tests/Grid/pointed1.cc, tests/Grid/relations1.cc,
+ tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+ tests/Grid/widening1.cc
+ (grids.[88,46,6,13,12,9,58,115,3,15,11,9,3,9,9,4,9,5,3,4,6,5,10,6,4,9,7,3,4,6,6,5,6,6,5,3,3,24,20,8,7,9,7,11,7,4,6,11,4,3,3,5,6,10,7,6,4,3,8]):
+ Update Grid::map_space_dimensions() to use set_empty. Make
+ Grid_Generator(Generator&) explicit. Enable insertion of
+ parameters directly into a Grid. Update Grid::is_universe,
+ Grid::map_space_dimensions() and all the tests to use the grid
+ generator creation functions. Correct the expected values of a
+ few tests that use parameters.
+
+2005-12-12 Monday 17:49 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[87,57,114]): Take out old parameter hiding.
+
+2005-12-12 Monday 16:21 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+ (simplex.[4,4,6]): Written some code in `PPL::LP_Problem::OK()'.
+ Properly renamed `opt_kind' to `opt_mode'.
+
+2005-12-12 Monday 13:49 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[12,8]): Implement operator<<(s,ggs).
+
+2005-12-12 Monday 13:27 Andrea Cimino
+
+ * src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+ tests/Polyhedron/LP_Problem1.cc (simplex.[3,5,3]): Added the
+ method `PPL::LP_Problem::optimal_value()'. Modified also
+ LP_Problem1.cc: all seems to work as expected.
+
+2005-12-10 Saturday 15:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (simplex.1): Exploiting the new
+ LP_Problem class to build a precise BD_Shape starting from the
+ constraints of a polyhedron when SIMPLEX_COMPLEXITY is allowed.
+
+2005-12-09 Friday 20:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.52): Some reorganization of the methods
+ in documentation sections.
+
+2005-12-08 Thursday 20:26 Andrea Cimino
+
+ * src/LP_Problem.inlines.hh (simplex.4): Fixed a bug showed by
+ `ppl_lpsol'.
+
+2005-12-08 Thursday 20:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.2): Corrected a bug in the
+ call of ppl_LP_Problem_optimizing_point().
+
+2005-12-08 Thursday 15:22 Andrea Cimino
+
+ * src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[3,3]):
+ Some switches fixed.
+
+2005-12-08 Thursday 07:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.165), interfaces/Prolog/Prolog_interface.dox (1.137),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.106): Added support for
+ SWI-Prolog's unbounded numbers. This requires Prolog version
+ 5.5.40 or later version.
+
+2005-12-07 Wednesday 17:31 Andrea Cimino
+
+ * src/LP_Problem.cc, src/LP_Problem.defs.hh,
+ src/LP_Problem.inlines.hh, tests/Polyhedron/LP_Problem1.cc,
+ tests/Polyhedron/LP_Problem2.cc (simplex.[2,2,2,2,2]):
+ LP_Problem prototypes modified to match the C interface.
+ Modified also the tests. The code needs to be hardly tested.
+
+2005-12-06 Tuesday 16:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (simplex.1): Using the new interface
+ to the LP_Problem class.
+
+2005-12-06 Tuesday 16:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[1,1]): Added
+ tentative interface for the LP_Problem class.
+
+2005-12-06 Tuesday 16:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh, globals.types.hh, simplex.cc
+ (simplex.[2,1,1]): Enumeration Optimization_Kind renamed as
+ Optimization_Mode.
+
+2005-12-06 Tuesday 13:24 Andrea Cimino
+
+ * doc/devref.doxyconf-html.in (simplex.1):
+ Modified to produce PPL::LP_Problem documentation.
+
+2005-12-05 Monday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.22), Watchdog/ChangeLog (1.12): Updated.
+
+2005-12-05 Monday 20:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/limitedCH78extrapolation1.cc (1.5): Changed so as
+ to rflect the improved precision of the widening.
+
+2005-12-05 Monday 19:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.105): Corrected trivial errors in
+ calls to function that became a method.
+
+2005-12-05 Monday 19:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.56): Corrected references to the
+ manual.
+
+2005-12-05 Monday 19:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: ch78widening6.cc (1.7), ch78widening8.cc (1.5):
+ The known results updated to reflect the increased precision of
+ the widening operator.
+
+2005-12-05 Monday 19:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.104): The operator
+ CH78_widening_assign() is now implemented as specified in the SAS
+ paper BHMZ05, returning immediately if there has been a change in
+ the affine dimension of the arguments, so that it is well-defined
+ on the domain of BDSs.
+
+2005-12-05 Monday 19:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.51): Corrected references to the
+ documentation. Do escape < and > when writing doxygen
+ documentation.
+
+2005-12-05 Monday 19:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.defs.hh (1.26), Polyhedron.defs.hh
+ (1.285): Corrected references to the documentation.
+
+2005-12-05 Monday 19:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bounding_Box.defs.hh (1.10): Formatted doxygen commands
+ according to STANDARDS. Corrected a couple of references to the
+ manual.
+
+2005-12-05 Monday 19:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Bounding_Box.cc (1.12): Removed duplicated doxygen comment.
+
+2005-12-05 Monday 19:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.179): Removed some redundant anchors
+ (prefer using the anchors automatically defined by sectioning
+ commands). Added subsection on the widening and extrapolation
+ operators for BDSs.
+
+2005-12-05 Monday 14:54 Andrea Cimino
+
+ * src/Constraint_System.defs.hh, src/LP_Problem.cc,
+ src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+ src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+ src/Makefile.am, tests/Polyhedron/LP_Problem1.cc,
+ tests/Polyhedron/LP_Problem2.cc, tests/Polyhedron/Makefile.am
+ (simplex.[1,1,1,1,1,1,1,1,1,1]):
+ Added the LP_Problem class to the branch, derived from the
+ simplex.cc code. The class is fully functional, but lacks of
+ some features like `incrementality': in this case the problem is
+ solved from scratch. Added also a couple of tests playing with
+ the class, but other tests are needed. For significant tests a
+ change to the C interface and to the `ppl_lpsol' tool is
+ required. LP_Problem declared `friend class' of
+ `Constraint_System' and `Linear_Expression' to allow compiling.
+
+2005-12-05 Monday 14:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.cc (1.1), BD_Shape.defs.hh (1.50),
+ BD_Shape.inlines.hh (1.103), Makefile.am (1.130): A couple of
+ non-inline and non-template functions placed in BD_Shape.cc. A
+ few functions have become private members of the BD_Shape class.
+ Some exception throwers are now declared static. A few methods
+ have been renamed for consistency.
+
+2005-12-05 Monday 14:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.defs.hh (1.13), DB_Matrix.inlines.hh (1.18):
+ Avoid indirect inclusion dependencies. Corrected a typo in a
+ preprocessor variable name.
+
+2005-12-05 Monday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.types.hh (1.8): Also declare the
+ Extended_Number_Policy type.
+
+2005-12-05 Monday 14:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.136): Corrected a few
+ typos and removed a repeated paragraph.
+
+2005-12-05 Monday 10:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Ask_Tell.inlines.hh (1.6), Bounding_Box.cc (1.11),
+ Constraint_System.cc (1.14), DB_Matrix.defs.hh (1.12),
+ DB_Matrix.inlines.hh (1.17), DB_Row.inlines.hh (1.15),
+ Generator_System.cc (1.14), Linear_Row.cc (1.14),
+ Linear_System.cc (1.31), Matrix.cc (1.87),
+ Polyhedra_Powerset.inlines.hh (1.33), Polyhedron_public.cc
+ (1.68), Row.cc (1.92), Saturation_Matrix.cc (1.6): Do not flush
+ too often the ostream buffer when performing normal output.
+
+2005-12-05 Monday 10:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.42), Checked_Number.inlines.hh
+ (1.46): Added a missing \relates doxygen command.
+
+2005-12-05 Monday 10:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.49), BD_Shape.inlines.hh (1.102):
+ Helper functions forget_*_constraints_on_var() are now provate
+ methods of class BD_Shape. Corrected the implementation of
+ method swap.
+
+2005-12-04 Sunday 10:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.178): Draftet a section on BD shapes.
+
+2005-12-03 Saturday 15:33 Matthew Mundell
+
+ * src/Grid_Generator_System.inlines.hh (grids.6): Update insert to
+ construct the generator directly into the constructor call.
+
+2005-12-03 Saturday 15:33 Matthew Mundell
+
+ * src/Grid_Generator_System.defs.hh (grids.7): Update the matrix
+ diagram in the add_universe_rows_and_columns description.
+
+2005-12-03 Saturday 15:31 Matthew Mundell
+
+ * src/Grid_Generator.inlines.hh (grids.11): Update
+ Grid_Generator(g) to swap with g instead of copying g. Clean
+ some comments. Move the equality operators to better positions.
+ Update line and point to use Grid_Generator(g).
+
+2005-12-03 Saturday 15:19 Matthew Mundell
+
+ * tests/Grid/generator1.cc (grids.2): Insert test8, to check
+ construction from a Generator reference.
+
+2005-12-03 Saturday 15:09 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (grids.12): Move Grid_Generator(g) to
+ the beginning of the public section. Improve the
+ Grid_Generator(g) description.
+
+2005-12-03 Saturday 12:55 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, generator1.cc (grids.[53,1]): Add
+ generator1, to test Grid_Generator.
+
+2005-12-03 Saturday 12:21 Matthew Mundell
+
+ * src/Generator_System.defs.hh (grids.10): Keep the Grid friend
+ declaration.
+
+2005-12-03 Saturday 12:13 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.11): Add a note that
+ ascii_load is a copy of Generator_System::ascii_load.
+
+2005-12-03 Saturday 12:12 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+ (grids.[11,10]): Add ascii_dump and ascii_load wrappers.
+
+2005-12-03 Saturday 12:04 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (grids.11): Update main to output the
+ test name. Convert variable names to A, B and C.
+
+2005-12-03 Saturday 00:38 Matthew Mundell
+
+ * src/: Generator.defs.hh, Grid.defs.hh, Grid_Generator.defs.hh,
+ Grid_Generator.inlines.hh, Grid_Generator_System.cc,
+ Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+ Grid_chdims.cc, Grid_conversion.cc, Grid_nonpublic.cc,
+ Grid_public.cc, Grid_simplify.cc
+ (grids.[16,86,10,9,10,6,5,26,30,56,113,41]): Stabilize the grid
+ friend declarations in Generator.
+
+ Hence, in Grid
+
+ - update the rest of the simplify methods to use Grid_Generator
+
+ - convert reduce_pc_with_pc to a template
+
+ - update to the Grid_Generator_System method names,
+
+ and in Grid_Generator
+
+ - add negate(gg,start,end)
+
+ - add private wrapper methods topology, size, set_is_line and
+ set_is_parameter,
+
+ and in Grid_Generator_System
+
+ - reduce insert, keeping only the relevant parts, and move
+ linear_system_insert into insert
+
+ - revert the affine image parameter list to the
+ Generator_System
+ form
+
+ - take out Grid_Generator_System(topology) and add_row(g)
+
+ Clean some comments. Add some comments. Take out the
+ directed-out Grid code left in in the last few commits.
+
+2005-12-02 Friday 22:16 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+ Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+ (grids.[85,25,29,55,112,40]): Reduce the dependency on the
+ Grid_Generator_System Grid friend declaration:
+
+ - declare function multiply_grid a static method
+
+ - replace ggs::num_columns calls with equivalents which use
+ ggs::space_dimension
+
+ - leave handling of topology, pending rows and the sorted flag
+ to
+ Grid_Generator_System
+
+ - replace add_zero_columns calls with insertions of all-zero
+ parameters
+
+ - replace private use of Grid_Generator_System and parents with
+ use
+ of remove_space_dimensions and recycling_insert
+
+ - update to the Grid_Generator_System method names
+
+ - replace direct resizing of gen_sys with sized system
+ construction,
+ or insertion of an all-zero parameter
+
+ - update time_elapse_assign to leave any origin point in the
+ resulting gen_sys
+
+ - update conversion and minimization methods to use
+ Grid_Generator_System instead of Linear_System.
+
+ Take the resizing of gen_sys out of the add_generator(g) empty
+ case, as the generator system is always the right size.
+
+ Add const to the add_space_dimensions `dims' argument
+ declarations.
+
+ Take the topology and sorted checks out of OK.
+
+2005-12-02 Friday 22:13 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.9): Update
+ add_universe_rows_and_columns to unset pending rows. Update
+ insert(gg) so that at most it adjusts the space dimension if an
+ all-zero parameter is given.
+
+2005-12-02 Friday 20:45 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+ (grids.[8,5]): Add recycling_insert, remove_space_dimensions,
+ remove_higher_space_dimensions and an OK sorted check. Move
+ add_row to the private section. Keep the Grid friend
+ declaration, for now.
+
+2005-12-02 Friday 20:41 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+ (grids.[9,8]): Add access operators.
+
+2005-12-02 Friday 17:38 Matthew Mundell
+
+ * src/Grid_public.cc (grids.111): Take the topology specification
+ out of the generator system construction in Grid(n,k).
+
+2005-12-02 Friday 17:36 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.54): Reduce dependency on the
+ Grid_Generator_System Grid friend declaration: let
+ Grid_Generator_System handle pending rows and the sorted flag,
+ define out the NNC handling in construct(gs,), replace manual
+ topology and dimension adjustment with calls to
+ Grid_Generator_System(dim) and replace a Grid_Generator_System
+ num_columns call with an equivalent which uses
+ Grid_Generator_System::space_dimension().
+
+2005-12-02 Friday 17:28 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[7,4,4]): Add a topology
+ check to OK. Update `insert' to clear the sorted flag after
+ inserting. Update constructors to set the sorted flag. Add
+ wrapper methods max_space_dimension, space_dimension and
+ num_lines. Add Grid_Generator_System(dim).
+
+2005-12-02 Friday 16:13 Matthew Mundell
+
+ * src/Grid_public.cc (grids.110): Update
+ generalized_affine_image(v,e,d,m) to insert the parameter via
+ function `parameter'.
+
+2005-12-02 Friday 16:12 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[6,3,3]): Add method
+ linear_system_insert, a slightly modified copy of
+ Linear_System::insert. Update insert to use linear_system_insert
+ instead of trying to handle parameters specially. Make
+ ascii_dump() a real (vs inline) method. Set the affine_image
+ grid parameter automatic value to true.
+
+2005-12-02 Friday 16:05 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.inlines.hh (grids.[5,7]):
+ Implement method parameter locally to work around the
+ normalization in Generator::ray.
+
+2005-12-02 Friday 16:04 Matthew Mundell
+
+ * src/Grid_Generator.defs.hh (grids.8): Keep the Grid friend
+ declaration.
+
+2005-12-01 Thursday 22:43 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.10): Turn off test4 (includes ray
+ insertion), for now.
+
+2005-12-01 Thursday 22:34 Matthew Mundell
+
+ * src/Grid_public.cc (grids.109): Update add_generator(g) to only
+ adjust the divisor for points, for now.
+
+2005-12-01 Thursday 22:23 Matthew Mundell
+
+ * src/Grid_public.cc (grids.108): Revert is_universe to create a
+ generator for each dimension.
+
+2005-12-01 Thursday 22:01 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.28): Improve a comment slightly.
+
+2005-12-01 Thursday 22:01 Matthew Mundell
+
+ * src/Grid_Generator.inlines.hh (grids.6): Add a temporary note.
+
+2005-12-01 Thursday 22:01 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.5): Update insert to work
+ around the Linear_System::insert normalization check when
+ inserting a parameter.
+
+2005-12-01 Thursday 21:46 Matthew Mundell
+
+ * src/Grid_public.cc (grids.107): Revert add_generator to multiply
+ the given point after it has been inserted.
+
+2005-12-01 Thursday 20:44 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_Generator.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[4,7,5,53,106]): Add a Grid_Generator::divisor method
+ which returns a writable reference. Update Grid to use this
+ method instead of casting. Revert
+ Grid::generalized_affine_image(v,e,d,m) to insert the parameter
+ in stages.
+
+2005-12-01 Thursday 20:00 Matthew Mundell
+
+ * tests/Grid/membytes1.cc (grids.3): Update function add_generator
+ to use Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 19:59 Matthew Mundell
+
+ * src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+ (grids.[6,4]): Add methods total_memory_in_bytes and
+ external_memory_in_bytes.
+
+2005-12-01 Thursday 19:35 Matthew Mundell
+
+ * tests/Grid/congruencesystem2.cc (grids.9): Update
+ satisfies_all_congruences to use Generator instead of
+ Grid_Generator.
+
+2005-12-01 Thursday 19:21 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.14): Update test4 to add all
+ generators.
+
+2005-12-01 Thursday 19:10 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[84,52,105]): Reduce the dependency on the Grid_Generator
+ Grid friend declaration: turn off hiding of parameters,
+ temporarily let rays be inserted as parameters, always get the
+ divisor via the divisor method, switch to use the
+ Generator_System wrapper methods, multiply generators via
+ Grid_Generator::multiply, construct grids by inserting rows
+ instead of modifying inserted rows, compare generator systems in
+ OK via is_equal_to, and swap entire rows via coefficient_swap.
+
+ Take out the OK NC check and the add_generator NC handling.
+
+2005-12-01 Thursday 18:56 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.27): Update upper_triangular to use
+ Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 18:56 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.24): In both add_space_dimensions
+ methods use add_universe_rows_and_columns instead of manually
+ adding the rows.
+
+2005-12-01 Thursday 18:55 Matthew Mundell
+
+ * src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+ Grid_Generator_System.inlines.hh (grids.[4,2,2]): Add
+ Generator_System wrappers Grid_Generator_System(gg) and
+ add_row(gg), and new method add_universe_rows_and_columns. Use
+ Generator instead of Grid_Generator in const_iterator.
+
+2005-12-01 Thursday 18:52 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_Generator.inlines.hh (grids.[3,5,3]): Add many Generator
+ wrapper methods, and new methods multiply and coefficient_swap.
+ Update OK to call methods directly, instead of via a reference.
+
+2005-12-01 Thursday 18:49 Matthew Mundell
+
+ * src/: Scalar_Products.cc, Scalar_Products.defs.hh,
+ Scalar_Products.inlines.hh (grids.[4,4,4]): Use Grid_Generator
+ instead of Generator in the Grid related methods. Add
+ Grid_Generator versions of homogeneous_sign(e,g) and
+ homogeneous_assign(z,e,g). Take out
+ Topology_Adjusted_Scalar_Product_Assign.
+
+2005-12-01 Thursday 18:45 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[35,21]): Use Grid_Generator instead of Generator.
+
+2005-12-01 Thursday 18:44 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.23): Turn of ray test for now.
+
+2005-11-30 Wednesday 20:09 Matthew Mundell
+
+ * src/: Generator.defs.hh, Generator_System.defs.hh,
+ Grid_Generator.defs.hh (grids.[15,9,4]): Comment inclusions above
+ the line instead of at the line end, to please
+ utils/build_header.
+
+2005-11-30 Wednesday 19:56 Matthew Mundell
+
+ * src/Grid_Generator_System.cc (grids.3): Update OK to call the
+ updated Grid_Generator::OK, and to use Grid_Generator_System for
+ the generator system type.
+
+2005-11-30 Wednesday 19:53 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[2,3]):
+ Add OK method.
+
+2005-11-30 Wednesday 19:53 Matthew Mundell
+
+ * src/: Generator.cc, Generator.defs.hh (grids.[6,14]): Take out
+ the OK method flag parameter hack.
+
+2005-11-30 Wednesday 19:52 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.13): Add only NC generators
+ for now.
+
+2005-11-30 Wednesday 17:49 Matthew Mundell
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+ Grid_Generator.inlines.hh, Grid_Generator_System.cc, Makefile.am
+ (grids.[1,2,2,2,12]): Inherit privately from Generator. Add enum
+ Type. Add methods is_equivalent_to and swap. Add
+ operator<<(s,g) friend declaration.
+
+2005-11-30 Wednesday 17:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.161): Testing the notification of commit messages.
+
+2005-11-30 Wednesday 17:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.160): Added an item.
+
+2005-11-30 Wednesday 16:55 Matthew Mundell
+
+ * src/Grid_public.cc, src/Grid_simplify.cc,
+ src/Linear_Expression.defs.hh, src/Makefile.am,
+ tests/ppl_test.hh, tests/Grid/addcongruence1.cc,
+ tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+ tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+ tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+ tests/Grid/affinepreimage1.cc, tests/Grid/bhz03widening1.cc,
+ tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+ tests/Grid/boundingbox2.cc, tests/Grid/concatenate1.cc,
+ tests/Grid/congruence1.cc, tests/Grid/congruencesystem1.cc,
+ tests/Grid/congruencesystem2.cc, tests/Grid/contains1.cc,
+ tests/Grid/contains2.cc, tests/Grid/coveringbox1.cc,
+ tests/Grid/coveringbox2.cc, tests/Grid/disjoint1.cc,
+ tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+ tests/Grid/foldspacedims1.cc,
+ tests/Grid/generalizedaffineimage1.cc,
+ tests/Grid/generalizedaffineimage2.cc,
+ tests/Grid/generalizedaffinepreimage1.cc,
+ tests/Grid/generalizedaffinepreimage2.cc,
+ tests/Grid/generators1.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+ tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+ tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+ tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+ tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+ tests/Grid/mingenerators1.cc, tests/Grid/pointed1.cc,
+ tests/Grid/relations1.cc, tests/Grid/removespacedims1.cc,
+ tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+ tests/Grid/topclosure1.cc, tests/Grid/widening1.cc,
+ tests/Grid/writecongruencesystem.cc, src/Generator.defs.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Grid.defs.hh, src/Grid.inlines.hh,
+ src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+ src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+ src/Grid_Generator_System.defs.hh,
+ src/Grid_Generator_System.inlines.hh,
+ src/Grid_Generator_System.types.hh, src/Grid_chdims.cc,
+ src/Grid_conversion.cc, src/Grid_nonpublic.cc
+ (grids.[104,39,9,11,15,7,2,2,11,12,10,8,2,8,8,3,3,8,4,5,10,8,8,5,3,8,6,2,3,5,5,4,5,5,4,2,22,19,6,7,6,8,6,9,6,3,5,10,3,2,2,2,4,9,6,5,2,7,6,13,18,8,83,45,1,1,1,1,1,1,1,23,26,51]):
+ Rename find_variation_template in ppl_test.hh to find_variation.
+ Update all tests to call find_variation directly instead of
+ calling a wrapped instantiation of find_varition. Update
+ find_variation to always use nout. Take the abort call out of
+ find_variation.
+
+ Add classes Grid_Generator and Grid_Generator_System. Update the
+ grid classes and all tests to use these instead of Generator and
+ Generator_System. Take the grid hacks out of Generator_System.
+
+ Update a comment in Grid_conversion.cc.
+
+2005-11-30 Wednesday 15:36 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.41), Checked_Number.inlines.hh
+ (1.45): Disabled ROUND_NOT_NEEDED debug check.
+
+2005-11-30 Wednesday 13:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.48): Removed trailing whitespace.
+
+2005-11-30 Wednesday 12:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.48): Removed trailing whitespace.
+
+2005-11-29 Tuesday 21:56 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.40): fpu_check_inexact is always
+ set to true with assertions enabled for debugging purpose.
+
+2005-11-29 Tuesday 18:55 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.47),
+ interfaces/Prolog/ppl_prolog.icc (1.164),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.36),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.31),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.81),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.105),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.72),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.99), src/BD_Shape.inlines.hh
+ (1.101), src/Bounding_Box.cc (1.10), src/Bounding_Box.inlines.hh
+ (1.11), src/Checked_Number.defs.hh (1.39),
+ src/Checked_Number.inlines.hh (1.44), src/DB_Matrix.inlines.hh
+ (1.16), src/Polyhedron.inlines.hh (1.126),
+ src/Polyhedron_nonpublic.cc (1.58), src/Rounding_Dir.defs.hh
+ (1.5), src/checked.inlines.hh (1.28),
+ tests/Random_Number_Generator.inlines.hh (1.4),
+ tests/BD_Shape/closure1.cc (1.8): Reorganized rounding modes.
+
+2005-11-29 Tuesday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.20): Removed trailing whitespace.
+
+2005-11-28 Monday 21:08 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.34): Compare to zero explicitly
+ in normalize_moduli.
+
+2005-11-28 Monday 21:04 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.22): Update
+ add_space_dimensions_and_embed and
+ add_space_dimensions_and_project to use set_empty to empty the
+ grid. Update concatenate_assign to handle empty congruence
+ systems.
+
+2005-11-28 Monday 21:01 Matthew Mundell
+
+ * src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_simplify.cc
+ (grids.[44,50,38]): Improve a trace message slightly. Improve a
+ few comments. Update the congruence system simplify method to
+ accept empty congruence systems.
+
+2005-11-28 Monday 20:54 Matthew Mundell
+
+ * src/Grid_public.cc (grids.103): Improve a few comments. Update
+ intersection_assign to add the `y' congruence system only if it
+ contains rows. Take the setting of the up-to-date flag out of
+ Grid(n,k).
+
+2005-11-28 Monday 20:50 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.10): Improve a comment slightly.
+
+2005-11-28 Monday 16:03 Matthew Mundell
+
+ * src/Grid_public.cc (grids.102): Update Grid(const Grid&) to
+ ensure that the out of date systems are the correct size.
+
+2005-11-28 Monday 15:59 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.21): Update remove_space_dimensions and
+ remove_higher_space_dimensions to call set_empty when the grid is
+ empty.
+
+2005-11-28 Monday 15:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.100): The more precise convex
+ combination is now also used in method
+ generalized_affine_image(). Common code factored out in a couple
+ of helper functions.
+
+2005-11-28 Monday 13:27 Matthew Mundell
+
+ * src/Congruence_System.inlines.hh (grids.11): Align comment.
+
+2005-11-28 Monday 13:27 Matthew Mundell
+
+ * src/Grid_public.cc (grids.101): Take out query (set_zero_dim_univ
+ will insert a point, which adjusts the space dimension).
+
+2005-11-28 Monday 11:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.sty (1.23): "newcommand"s needed for the documentation
+ for the grid domain added.
+
+2005-11-28 Monday 10:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.99): The computation of convex
+ combinations in the general case of affine images has been
+ simplified and properly commented.
+
+2005-11-27 Sunday 23:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/ppl.sty (grids.4): Improved comments.
+
+2005-11-27 Sunday 19:03 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.37): In the generator simplify method
+ also assert sys is OK in the empty case. In both cases pass
+ false to OK.
+
+2005-11-27 Sunday 18:54 Matthew Mundell
+
+ * src/Grid_public.cc (grids.100): Leave congruences as they are
+ (update_generators will simplify them).
+
+2005-11-27 Sunday 18:27 Matthew Mundell
+
+ * src/Grid_public.cc (grids.99): Assert false if relation_with(cg)
+ finds a closure point.
+
+2005-11-27 Sunday 18:05 Matthew Mundell
+
+ * src/Row.defs.hh (grids.7): Take out the Grid friend declaration.
+
+2005-11-27 Sunday 18:04 Matthew Mundell
+
+ * src/Polyhedron_public.cc (grids.9): Note a possible improvement
+ in add_congruences(cgs).
+
+2005-11-27 Sunday 18:02 Matthew Mundell
+
+ * src/Matrix.defs.hh (grids.5): Mention size and capacity in the
+ add_recycled_row parameter description.
+
+2005-11-27 Sunday 17:59 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.36): In the congruence simplify
+ method always erase rows with erase_to_end. Take out the
+ capacity setting after erases. Add three temporary comments.
+ Improve two comments. Compare to zero explicitly in two
+ assertions.
+
+2005-11-27 Sunday 17:53 Matthew Mundell
+
+ * src/Constraint.defs.hh (grids.9): Take out the Congruence_System
+ friend declaration.
+
+2005-11-27 Sunday 17:52 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.33): Update insert to use
+ Constraint::space_dimension instead of the Constraint::size and
+ Constraint::is_necessarily_closed.
+
+2005-11-27 Sunday 17:48 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+ Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+ (grids.[17,32,18,8,3]): Get the size in Congruence(c) via the
+ space_dimension(). Add flag `capacity' to Congruence(le,m). Use
+ Linear_Expression(le,sz) in the Congruence %= operators. Take
+ out Linear_Expression(le,sz,capacity).
+
+2005-11-27 Sunday 17:37 Matthew Mundell
+
+ * STANDARDS (grids.8): Take out section "Standards for the Test
+ Programs".
+
+2005-11-25 Friday 15:53 Matthew Mundell
+
+ * src/Row.defs.hh (grids.6): Take out the Congruence_System friend
+ declaration.
+
+2005-11-25 Friday 14:08 Matthew Mundell
+
+ * src/Polyhedron_public.cc (grids.8): Take out a query that relates
+ to the trunk.
+
+2005-11-25 Friday 14:04 Matthew Mundell
+
+ * tests/Grid/affinepreimage1.cc (grids.7): Simplify a congruence in
+ test8.
+
+2005-11-25 Friday 14:00 Matthew Mundell
+
+ * STANDARDS (grids.7): Mention that OK is called in
+ find_variation_template. Give an example of calling
+ find_variation_template.
+
+2005-11-25 Friday 13:57 Matthew Mundell
+
+ * src/Matrix.cc (grids.6): Improve a comment in add_recycled_row.
+
+2005-11-25 Friday 11:42 Matthew Mundell
+
+ * src/: Grid_chdims.cc, Grid_nonpublic.cc, Grid_public.cc,
+ Grid_widenings.cc (grids.[20,49,98,9]): In is_included_in merge
+ some BE_LAZY=0 code into the BE_LAZY=1 case, and check if `x' is
+ empty after minimization when BE_LAZY is 0. In minimize() call
+ simplify instead of update_generators and update_congruences,
+ where possible. Reduce all update_congruence calls to account
+ for the fact the resulting grid always contains at least one
+ point.
+
+2005-11-25 Friday 11:29 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.43): Keep the shrink_covering_box and
+ get_covering_box dimension compatibility checks.
+
+2005-11-25 Friday 11:28 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.82): Improve the update_congruences() and
+ minimize() descriptions.
+
+2005-11-24 Thursday 13:49 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.31): Take out Polyhedron friend
+ declaration.
+
+2005-11-24 Thursday 13:14 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.42): In the covering box grid
+ constructor return immediately after setting empty when a
+ universe interval is encountered.
+
+2005-11-24 Thursday 12:37 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.25): Move TRACE definition into the
+ PPL namespace. #undef TRACE afterwards.
+
+2005-11-24 Thursday 12:37 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.35): Replace the tracing stream with
+ cerr and a macro called TRACE.
+
+2005-11-24 Thursday 12:12 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.48): In bounds(expr,char*) use
+ Generator::is_line_or_ray.
+
+2005-11-24 Thursday 12:05 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.24): Replace the tracing stream
+ with cerr and macro TRACE.
+
+2005-11-23 Wednesday 20:53 Matthew Mundell
+
+ * src/Generator_System.cc (grids.17): Re-enable the OK assertion.
+
+2005-11-23 Wednesday 20:51 Matthew Mundell
+
+ * src/: Generator.cc, Generator.defs.hh (grids.[5,12]): Extend the
+ OK method check_normalization argument to other
+ polyhedron-specific checks.
+
+2005-11-23 Wednesday 19:12 Matthew Mundell
+
+ * src/Grid_public.cc (grids.97): In add_recycled_generators
+ minimize via update_generators instead of via minimize.
+
+2005-11-23 Wednesday 18:37 Matthew Mundell
+
+ * src/: Grid_public.cc, Grid_nonpublic.cc (grids.[96,47]): In
+ add_recycled_generators_and_minimize minimize via
+ update_generators and update_congruences instead of via minimize.
+
+2005-11-23 Wednesday 17:43 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (grids.20): Make
+ has_linear_equalities public.
+
+2005-11-23 Wednesday 17:41 Matthew Mundell
+
+ * src/Checked_Number.inlines.hh (grids.7): Update policy
+ ROUND_DEFAULT to ROUND_DEFAULT_FUNCTION.
+
+2005-11-23 Wednesday 17:33 Matthew Mundell
+
+ * src/: Grid_nonpublic.cc, Grid_public.cc (grids.[46,95]): Use
+ Generator::is_line_or_ray instead of Generator::is_point.
+
+2005-11-23 Wednesday 17:02 Matthew Mundell
+
+ * src/Linear_Expression.defs.hh (grids.7): Declare
+ Congruence_System a friend.
+
+2005-11-23 Wednesday 17:01 Matthew Mundell
+
+ * src/Generator_System.cc (grids.16): Include compiler.hh. Resolve
+ two merge conflicts.
+
+2005-11-23 Wednesday 17:00 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence_System.cc,
+ Generator.defs.hh, Grid_nonpublic.cc, Grid_public.cc,
+ Scalar_Products.cc, Scalar_Products.defs.hh,
+ Scalar_Products.inlines.hh, Scalar_Products.types.hh
+ (grids.[30,32,11,45,94,3,3,3,3]): Move the grid scalar product
+ functions into class Scalar_Products. Add class
+ Topology_Adjusted_Scalar_Product_Assign for
+ Congruence_System::satisfies_all_congruences(g).
+
+2005-11-23 Wednesday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, NEWS, README.configure, STANDARDS, TODO, configure.ac,
+ doc/definitions.dox, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/ppl.sty,
+ doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected2_int16,
+ interfaces/Prolog/XSB/expected2_int16_a,
+ interfaces/Prolog/XSB/expected2_int32,
+ interfaces/Prolog/XSB/expected2_int32_a,
+ interfaces/Prolog/XSB/expected2_int64,
+ interfaces/Prolog/XSB/expected2_int64_a,
+ interfaces/Prolog/XSB/expected2_int8,
+ interfaces/Prolog/XSB/expected2_int8_a,
+ interfaces/Prolog/XSB/expected2_mpz,
+ interfaces/Prolog/XSB/expected2_mpz_a,
+ interfaces/Prolog/XSB/expected3_int16,
+ interfaces/Prolog/XSB/expected3_int16_a,
+ interfaces/Prolog/XSB/expected3_int32,
+ interfaces/Prolog/XSB/expected3_int32_a,
+ interfaces/Prolog/XSB/expected3_int64,
+ interfaces/Prolog/XSB/expected3_int64_a,
+ interfaces/Prolog/XSB/expected3_int8,
+ interfaces/Prolog/XSB/expected3_int8_a,
+ interfaces/Prolog/XSB/expected3_mpz,
+ interfaces/Prolog/XSB/expected3_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq2_int16,
+ interfaces/Prolog/XSB/expected_clpq2_int16_a,
+ interfaces/Prolog/XSB/expected_clpq2_int32,
+ interfaces/Prolog/XSB/expected_clpq2_int32_a,
+ interfaces/Prolog/XSB/expected_clpq2_int64,
+ interfaces/Prolog/XSB/expected_clpq2_int64_a,
+ interfaces/Prolog/XSB/expected_clpq2_int8,
+ interfaces/Prolog/XSB/expected_clpq2_int8_a,
+ interfaces/Prolog/XSB/expected_clpq2_mpz,
+ interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+ interfaces/Prolog/XSB/expected_clpq_int16,
+ interfaces/Prolog/XSB/expected_clpq_int16_a,
+ interfaces/Prolog/XSB/expected_clpq_int32,
+ interfaces/Prolog/XSB/expected_clpq_int32_a,
+ interfaces/Prolog/XSB/expected_clpq_int64,
+ interfaces/Prolog/XSB/expected_clpq_int64_a,
+ interfaces/Prolog/XSB/expected_clpq_int8,
+ interfaces/Prolog/XSB/expected_clpq_int8_a,
+ interfaces/Prolog/XSB/expected_clpq_mpz,
+ interfaces/Prolog/XSB/expected_clpq_mpz_a,
+ interfaces/Prolog/XSB/expected_int16,
+ interfaces/Prolog/XSB/expected_int16_a,
+ interfaces/Prolog/XSB/expected_int32,
+ interfaces/Prolog/XSB/expected_int32_a,
+ interfaces/Prolog/XSB/expected_int64,
+ interfaces/Prolog/XSB/expected_int64_a,
+ interfaces/Prolog/XSB/expected_int8,
+ interfaces/Prolog/XSB/expected_int8_a,
+ interfaces/Prolog/XSB/expected_mpz,
+ interfaces/Prolog/XSB/expected_mpz_a,
+ interfaces/Prolog/XSB/expected_pchk_int16,
+ interfaces/Prolog/XSB/expected_pchk_int16_a,
+ interfaces/Prolog/XSB/expected_pchk_int32,
+ interfaces/Prolog/XSB/expected_pchk_int32_a,
+ interfaces/Prolog/XSB/expected_pchk_int64,
+ interfaces/Prolog/XSB/expected_pchk_int64_a,
+ interfaces/Prolog/XSB/expected_pchk_int8,
+ interfaces/Prolog/XSB/expected_pchk_int8_a,
+ interfaces/Prolog/XSB/expected_pchk_mpz,
+ interfaces/Prolog/XSB/expected_pchk_mpz_a,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl,
+ m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_check_xsb_prolog.m4, m4/lib-ld.m4, m4/lib-link.m4,
+ m4/lib-prefix.m4, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.inlines.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Congruence.defs.hh, src/Constraint.defs.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/Determinate.defs.hh, src/Float.cc,
+ src/Float.defs.hh, src/Float.inlines.hh, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Init.cc, src/Linear_Expression.defs.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+ src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Result.defs.hh,
+ src/Rounding.defs.hh, src/Rounding.types.hh,
+ src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+ src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+ src/Scalar_Products.inlines.hh, src/Scalar_Products.types.hh,
+ src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/conversion.cc, src/float.types.hh, src/globals.defs.hh,
+ src/globals.inlines.hh, src/globals.types.hh,
+ src/mp_numeric_limits.hh, src/ppl-config.cc.in,
+ src/scalar_products.cc, src/scalar_products.defs.hh,
+ src/scalar_products.inlines.hh, src/simplex.cc, src/simplify.cc,
+ tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/affinedimension1.cc,
+ tests/BD_Shape/affineimage10.cc, tests/BD_Shape/affineimage8.cc,
+ tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/bdsdifference1.cc,
+ tests/BD_Shape/bdsdifference2.cc,
+ tests/BD_Shape/bdsdifference3.cc,
+ tests/BD_Shape/bdsdifference4.cc,
+ tests/BD_Shape/bdsdifference5.cc,
+ tests/BD_Shape/bdsdifference6.cc,
+ tests/BD_Shape/bdsdifference7.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/ch78widening4.cc, tests/BD_Shape/closure1.cc,
+ tests/BD_Shape/constraints1.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+ tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/mapspacedims2.cc, tests/BD_Shape/mapspacedims3.cc,
+ tests/BD_Shape/minconstraints1.cc,
+ tests/BD_Shape/polydifference1.cc,
+ tests/BD_Shape/polydifference2.cc,
+ tests/BD_Shape/polydifference3.cc,
+ tests/BD_Shape/polydifference4.cc,
+ tests/BD_Shape/polydifference5.cc,
+ tests/BD_Shape/polydifference6.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/numberinput1.cc,
+ tests/Polyhedron/primalsimplex1.cc,
+ tests/Polyhedron/primalsimplex2.cc
+ (grids.[2,4,2,6,16,8,9,5,2,3,4,2,5,5,3,4,2,2,2,4,3,6,3,4,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,2,2,2,3,3,3,3,3,3,3,2,3,2,1,1,1,3,3,6,6,3,3,2,8,6,29,8,3,4,3,2,2,4,2,4,2,3,3,10,4,15,7,2,4,6,5,3,10,5,4,5,6,6,7,8,6,5,6,7,4,3,3,2,2,2,2,2,2,2,4,5,8,5,7,6,4,5,4,3,2,5,4,2,2,2,5,6,3,5,2,14,6,3,3,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,4,3,3,3,3,3,2,2,2,2,2,3,2,2,2,2,2,3,3,3,2,3,2,2,2,10,2,3,2,2]):
+ Sixth merge from main trunk. (Note: build is currently broken.)
+
+2005-11-23 Wednesday 12:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.98): Corrected an ambiguous call
+ problem when coefficients are checked_int64.
+
+2005-11-23 Wednesday 00:06 Matthew Mundell
+
+ * src/: Congruence_System.cc, Grid.defs.hh, Grid_minimize.cc,
+ Grid_nonpublic.cc, Grid_public.cc (grids.[31,81,24,44,93]): Move
+ the code in the static minimize methods into update_congruences
+ and update_generators. Call update_congruences and
+ update_generators instead of the static minimize methods in
+ methods add_recycled_congruences_and_minimize and
+ add_recycled_generators_and_minimize. In OK test congruence to
+ generator conversion via a temporary grid instead of a temporary
+ congruence system.
+
+2005-11-22 Tuesday 12:08 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.23): Improve two comments.
+
+2005-11-22 Tuesday 11:34 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_conversion.cc (grids.[80,22]): Make
+ conversion void of return.
+
+2005-11-22 Tuesday 11:21 Matthew Mundell
+
+ * src/Grid_public.cc (grids.92): Leave dim_kinds at the end of the
+ ASCII dump. Resign to reading dim_kind into a short temporary
+ int in ascii_load.
+
+2005-11-22 Tuesday 11:01 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (grids.9): Use a local namespace.
+ Merge test10 and test11. Add is_trivial_* tests of the form b %=
+ 0 mod m where b <> 0 mod m.
+
+2005-11-22 Tuesday 10:38 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[16,28]): Consider
+ b %= 0 mod m where b <> 0 mod m as false in is_trivial_false.
+ Leave the constant term be after factoring out the modulus in
+ normalize.
+
+2005-11-22 Tuesday 07:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (1.4): Added new rounding modes
+ ROUND_NOT_NEEDED and ROUND_DONT_CARE.
+
+2005-11-22 Tuesday 07:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (grids.1): file Rounding_Dir.defs.hh was
+ added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-22 Tuesday 07:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.defs.hh (1.3): Added a couple of comments.
+
+2005-11-21 Monday 16:29 Matthew Mundell
+
+ * tests/Grid/isuniverse1.cc (grids.5): Use a local namespace.
+ Insert test4, where the gird is zero dimension empty. Add tests
+ with the systems in various states of minimization and
+ up-to-date'ness.
+
+2005-11-21 Monday 16:02 Matthew Mundell
+
+ * src/Grid_public.cc (grids.91): In is_universe check for a single
+ integrality congruence if the congruences are minimized, use a
+ single temporary generator instead of creating a temporary grid,
+ and take out the gen_sys check.
+
+2005-11-21 Monday 15:58 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.27): Correct is_trivial_true doc.
+
+2005-11-21 Monday 15:48 Elena Mazzi
+
+ * src/BD_Shape.defs.hh (1.47), src/BD_Shape.inlines.hh (1.97),
+ tests/BD_Shape/Makefile.am (1.28),
+ tests/BD_Shape/bdsdifference1.cc (1.1),
+ tests/BD_Shape/bdsdifference2.cc (1.1),
+ tests/BD_Shape/bdsdifference3.cc (1.1),
+ tests/BD_Shape/bdsdifference4.cc (1.1),
+ tests/BD_Shape/bdsdifference5.cc (1.1),
+ tests/BD_Shape/bdsdifference6.cc (1.1),
+ tests/BD_Shape/bdsdifference7.cc (1.1),
+ tests/BD_Shape/exceptions1.cc (1.8),
+ tests/BD_Shape/polydifference1.cc (1.7),
+ tests/BD_Shape/polydifference2.cc (1.5),
+ tests/BD_Shape/polydifference3.cc (1.5),
+ tests/BD_Shape/polydifference4.cc (1.5),
+ tests/BD_Shape/polydifference5.cc (1.6),
+ tests/BD_Shape/polydifference6.cc (1.5),
+ tests/BD_Shape/polydifference7.cc (1.2), tests/BD_Shape/run_tests
+ (1.10): Method BD_Shape::poly_difference_assign() renamed
+ BD_Shape::bds_difference_assign(). Corrected a bug in
+ BD_Shape::bds_difference_assign().
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference1.cc (grids.1): file
+ bdsdifference1.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference2.cc (grids.1): file
+ bdsdifference2.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference3.cc (grids.1): file
+ bdsdifference3.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference4.cc (grids.1): file
+ bdsdifference4.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference5.cc (grids.1): file
+ bdsdifference5.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference6.cc (grids.1): file
+ bdsdifference6.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/bdsdifference7.cc (grids.1): file
+ bdsdifference7.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-21 Monday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (grids.1): file run_tests was added on
+ branch grids on 2005-11-23 13:24:08 +0000
+
+2005-11-21 Monday 15:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.96): Added a couple of missing inline
+ declarations. Let definitions of a few inline functions occur
+ before their first use.
+
+2005-11-21 Monday 11:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.10),
+ generalizedaffineimage14.cc (1.8): Removed the last CHECKME's
+ from the known results.
+
+2005-11-20 Sunday 19:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_pchk_int32 (1.2),
+ tests/expected_pchk_int32 (1.3): Updated.
+
+2005-11-20 Sunday 19:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int32 (grids.1): file
+ expected_pchk_int32 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_clpq_int16 (1.2),
+ XSB/expected_pchk_int16 (1.2), tests/expected_clpq_int16 (1.2),
+ tests/expected_pchk_int16 (1.3): Updated.
+
+2005-11-20 Sunday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int16 (grids.1): file
+ expected_clpq_int16 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int16 (grids.1): file
+ expected_pchk_int16 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.159): New to-do item.
+
+2005-11-20 Sunday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_clpq2_int8_a (1.2),
+ XSB/expected_pchk_int8_a (1.2), tests/expected_clpq2_int8_a
+ (1.2), tests/expected_pchk_int8_a (1.3): Updated.
+
+2005-11-20 Sunday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int8_a (grids.1): file
+ expected_clpq2_int8_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int8_a (grids.1): file
+ expected_pchk_int8_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.2),
+ XSB/expected_clpq_int16_a (1.2), XSB/expected_pchk_int16_a (1.2),
+ XSB/expected_pchk_int32_a (1.2), XSB/expected_pchk_int64_a (1.2),
+ tests/expected_clpq2_int32_a (1.2), tests/expected_clpq_int16_a
+ (1.2), tests/expected_pchk_int16_a (1.3),
+ tests/expected_pchk_int32_a (1.3): Updated.
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int32_a (grids.1): file
+ expected_clpq2_int32_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int16_a (grids.1): file
+ expected_clpq_int16_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int16_a (grids.1): file
+ expected_pchk_int16_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int32_a (grids.1): file
+ expected_pchk_int32_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int64_a (grids.1): file
+ expected_pchk_int64_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.38), expected2_int16
+ (1.5), expected2_int16_a (1.4), expected2_int32 (1.4),
+ expected2_int32_a (1.3), expected2_int64 (1.3), expected2_int64_a
+ (1.3), expected2_int8 (1.4), expected2_int8_a (1.3),
+ expected2_mpz (1.3), expected2_mpz_a (1.3), expected3_int16
+ (1.3), expected3_int16_a (1.3), expected3_int32 (1.3),
+ expected3_int32_a (1.2), expected3_int64 (1.2), expected3_int64_a
+ (1.2), expected3_int8 (1.4), expected3_int8_a (1.2),
+ expected3_mpz (1.2), expected3_mpz_a (1.2), expected_clpq2_int16
+ (1.1), expected_clpq2_int16_a (1.1), expected_clpq2_int32 (1.1),
+ expected_clpq2_int32_a (1.1), expected_clpq2_int64 (1.1),
+ expected_clpq2_int64_a (1.1), expected_clpq2_int8 (1.1),
+ expected_clpq2_int8_a (1.1), expected_clpq2_mpz (1.1),
+ expected_clpq2_mpz_a (1.1), expected_clpq_int16 (1.1),
+ expected_clpq_int16_a (1.1), expected_clpq_int32 (1.1),
+ expected_clpq_int32_a (1.1), expected_clpq_int64 (1.1),
+ expected_clpq_int64_a (1.1), expected_clpq_int8 (1.1),
+ expected_clpq_int8_a (1.1), expected_clpq_mpz (1.1),
+ expected_clpq_mpz_a (1.1), expected_int16 (1.3), expected_int16_a
+ (1.3), expected_int32 (1.3), expected_int32_a (1.3),
+ expected_int64 (1.3), expected_int64_a (1.3), expected_int8
+ (1.4), expected_int8_a (1.4), expected_mpz (1.3), expected_mpz_a
+ (1.3), expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+ expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+ expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+ expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+ expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1): Test files
+ are now named as for the other Prolog systems.
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int16 (grids.1): file
+ expected_clpq2_int16 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int16_a (grids.1): file
+ expected_clpq2_int16_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int32 (grids.1): file
+ expected_clpq2_int32 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int64 (grids.1): file
+ expected_clpq2_int64 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int64_a (grids.1): file
+ expected_clpq2_int64_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_int8 (grids.1): file
+ expected_clpq2_int8 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_mpz (grids.1): file
+ expected_clpq2_mpz was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq2_mpz_a (grids.1): file
+ expected_clpq2_mpz_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int32 (grids.1): file
+ expected_clpq_int32 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int32_a (grids.1): file
+ expected_clpq_int32_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int64 (grids.1): file
+ expected_clpq_int64 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int64_a (grids.1): file
+ expected_clpq_int64_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int8 (grids.1): file
+ expected_clpq_int8 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_int8_a (grids.1): file
+ expected_clpq_int8_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_mpz (grids.1): file
+ expected_clpq_mpz was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_clpq_mpz_a (grids.1): file
+ expected_clpq_mpz_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int64 (altnum.1): file
+ expected_pchk_int64 was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int64 (grids.1): file
+ expected_pchk_int64 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_int8 (grids.1): file
+ expected_pchk_int8 was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_mpz (altnum.1): file
+ expected_pchk_mpz was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_mpz (grids.1): file
+ expected_pchk_mpz was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_mpz_a (altnum.1): file
+ expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:05 +0000
+
+2005-11-20 Sunday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected_pchk_mpz_a (grids.1): file
+ expected_pchk_mpz_a was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-20 Sunday 16:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected2_int8 (1.3), XSB/expected3_int8
+ (1.3), tests/expected_clpq2_int8 (1.2), tests/expected_pchk_int8
+ (1.3): Updated.
+
+2005-11-20 Sunday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.14): Temporary hack to avoid
+ failure of `make check'.
+
+2005-11-20 Sunday 07:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/numberinput1.cc (1.13): Removed another instance
+ of undue reliance on default rounding mode.
+
+2005-11-20 Sunday 00:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.95): Use rounding up in the definition
+ of stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.inlines.hh (1.15): DB_Matrix<T>::ascii_load() was
+ not failing in case of a conversion error.
+
+2005-11-19 Saturday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Result.defs.hh (1.11): Added some full stops.
+
+2005-11-19 Saturday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.inlines.hh (1.14): DB_Row::OK() is now more
+ informative upon failure, unless NDEBUG is defined.
+
+2005-11-19 Saturday 20:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.94): Another correction in
+ BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.93): Fixed the definition of
+ stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.92), DB_Matrix.inlines.hh (1.14):
+ Fixed a copy and paste bug in the distance functions. No longer
+ rely on default rounding mode for extended numbers.
+
+2005-11-19 Saturday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh (1.13), GMP_Integer.inlines.hh (1.8):
+ Remove overloadings of raw_value() with an mpq_class argument.
+
+2005-11-19 Saturday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.9), affineimage9.cc (1.8):
+ Fixed ambiguous calls to rectilinear_distance_assign().
+
+2005-11-19 Saturday 20:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.27): XFAIL_TESTS should be empty
+ here.
+
+2005-11-19 Saturday 16:47 Abramo Bagnara
+
+ * src/: Bounding_Box.cc (1.9), Bounding_Box.inlines.hh (1.10),
+ Checked_Number.defs.hh (1.38), Checked_Number.inlines.hh (1.43),
+ Polyhedron.inlines.hh (1.125): Don't permit rounding direction
+ omission when it's relevant.
+
+2005-11-19 Saturday 11:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.9): Temporarily let polydifference7
+ be an XFAIL test, so as to allow systematic testing of all
+ incarnations of BD_Shape using tinderbox.
+
+2005-11-19 Saturday 11:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.8), affineimage9.cc (1.7):
+ Try to use the distance computation so as to detect when a
+ computed result is ok even if different from the known result
+ (not really sure this one was the intended use of these distance
+ functions).
+
+2005-11-19 Saturday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.91): Previous change reverted.
+
+2005-11-18 Friday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.90): Removed several useless
+ invocations of raw_value().
+
+2005-11-18 Friday 22:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh (1.12), GMP_Integer.inlines.hh (1.7):
+ Defined overloaded raw_value() functions that are the identity
+ functions on mpq_class& and const mpq_class&, respectively. This
+ avoids surprises when raw_value() is applied to an mpq_class
+ object. The problem is caused by the C++ interface of GMP, which
+ defines an implicit constructor for mpz_class from an object of
+ type mpq_class.
+
+2005-11-18 Friday 20:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.7), affineimage9.cc (1.6),
+ affinepreimage5.cc (1.5), generalizedaffineimage13.cc (1.4): The
+ expected results modified accoring to the new precision expected
+ from method affine_image().
+
+2005-11-18 Friday 20:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.89): The precision of affine_image()
+ improved further.
+
+2005-11-18 Friday 17:31 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.19): In concatenate_assign improve some
+ comments and split an assert into two.
+
+2005-11-18 Friday 17:30 Matthew Mundell
+
+ * tests/Grid/concatenate1.cc (grids.4): Define tests in a local
+ namespace. Add a test where the second grid is empty. Add tests
+ for zero dimension grids and grids that are empty due to the
+ congruence system. In all tests call find_variation only on the
+ grid under test and only after concatenating.
+
+2005-11-18 Friday 14:53 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.30): Add an extra loop to
+ satisfies_all_congruences so that the scalar product is
+ multiplied by the divisor only as required.
+
+2005-11-18 Friday 14:28 Matthew Mundell
+
+ * src/Grid_chdims.cc, tests/Grid/removespacedims1.cc
+ (grids.[18,8]): Add test6 (where the variable set includes the
+ first dim) and test7 (where the result contains an all-zero
+ parameter). Define the tests within a local namespace.
+
+2005-11-18 Friday 13:30 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.21): Reduce the number of known_gr
+ congruences in test15.
+
+2005-11-18 Friday 13:03 Matthew Mundell
+
+ * tests/Grid/removespacedims1.cc (grids.7): Enable test4. Rename
+ test1 test5. Add a simple test as test1.
+
+2005-11-18 Friday 12:46 Matthew Mundell
+
+ * tests/Grid/intersection2.cc (grids.7): Modify test7 slightly.
+
+2005-11-18 Friday 12:40 Matthew Mundell
+
+ * tests/Grid/congruencesystem1.cc (grids.7): Neaten formatting.
+ Take out list of methods that could be tested.
+
+2005-11-18 Friday 09:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.26), run_tests (1.8): Let
+ BD_Shape<mpq> be the first one to be tested.
+
+2005-11-17 Thursday 15:35 Matthew Mundell
+
+ * tests/Grid/foldspacedims1.cc (grids.4): Correct two comments.
+ Add test11, in which a relational grid becomes a grid that is
+ smaller than universe.
+
+2005-11-17 Thursday 15:20 Abramo Bagnara
+
+ * src/: Float.inlines.hh (1.15), checked_ext.inlines.hh (1.26),
+ checked_float.inlines.hh (1.54), checked_mpz.inlines.hh (1.33):
+ Removed traling whitespace.
+
+2005-11-17 Thursday 14:14 Matthew Mundell
+
+ * tests/Grid/congruencesystem2.cc (grids.7): Add a local namespace.
+ Fit fulfils to satisfies_all_congruence. Take out the closure
+ point tests. Add tests where the divisor is greater than one.
+
+2005-11-17 Thursday 13:33 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (grids.8): Resolve a query (the two
+ grids should be equal).
+
+2005-11-17 Thursday 13:19 Matthew Mundell
+
+ * tests/Grid/addspacedims2.cc (grids.7): Take out two simple
+ queries. Use equalities where possible to create the test5 known
+ congruence system.
+
+2005-11-17 Thursday 12:58 Matthew Mundell
+
+ * src/scalar_products.cc (grids.4): Clean a
+ reduced_scalar_product_assign comment.
+
+2005-11-17 Thursday 12:51 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.8): Format returns consistently.
+ Quote variables consistently in comments. Resign to creating a
+ temporary certificate in compare(gr).
+
+2005-11-17 Thursday 12:15 Matthew Mundell
+
+ * src/scalar_products.defs.hh (grids.5): Keep
+ homogeneous_scalar_product_sign, which is used in method
+ `bounds'.
+
+2005-11-17 Thursday 10:14 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (1.29): Fixed proper use of rounding
+ direction.
+
+2005-11-17 Thursday 09:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.25): Added a guideline regarding trailing
+ whitespace, as well as an hint for exploiting the power of emacs
+ in this respect (thanks to Matthew Mundell for pointing this
+ out).
+
+2005-11-17 Thursday 09:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.88), simplex.cc (1.32): Removed
+ trailing whitespace.
+
+2005-11-17 Thursday 07:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.7): Spurious line removed.
+
+2005-11-17 Thursday 07:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (grids.1): file closure1.cc was added
+ on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-16 Wednesday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.6): Distance computations enabled.
+
+2005-11-16 Wednesday 20:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpq.inlines.hh (1.28): Quick and dirty (very dirty)
+ hack to provide mpq-based checked numbers with some sqrt
+ capability.
+
+2005-11-16 Wednesday 20:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.inlines.hh (1.13): Fixed
+ Euclidean_Distance_Specialization. Avoided a compiler warning.
+ Factorized some common code.
+
+2005-11-16 Wednesday 18:12 Matthew Mundell
+
+ * src/scalar_products.defs.hh (grids.4): Keep
+ homogeneous_scalar_product_assign, which is used in max_min.
+
+2005-11-16 Wednesday 18:03 Matthew Mundell
+
+ * src/Matrix.defs.hh (grids.4): Take out old friends.
+
+2005-11-16 Wednesday 18:02 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.34): Correct typo in temporary
+ comment.
+
+2005-11-16 Wednesday 18:00 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.79): Mention only that expr in the
+ bounded methods are bounded (instead of mentioning bounding from
+ above or below. Note that the two "bound_from" methods are the
+ same.
+
+2005-11-16 Wednesday 16:59 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.8): Take out the inclusion of the
+ bounding box header.
+
+2005-11-16 Wednesday 13:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.5): Get ready to test with
+ Euclidean and L-infinity distances.
+
+2005-11-16 Wednesday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.46): Added missing friend declarations.
+ Removed superfluous friend declarations.
+
+2005-11-16 Wednesday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.45), BD_Shape.inlines.hh (1.87): Added
+ methods BD_Shape::euclidean_distance_assign() and
+ BD_Shape::l_infinity_distance_assign() along the lines of the
+ existing methods BD_Shape::rectilinear_distance_assign().
+
+2005-11-16 Wednesday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.defs.hh (1.11): Added the declaration of
+ DB_Matrix::euclidean_distance_assign().
+
+2005-11-16 Wednesday 13:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.25), polydifference7.cc (1.1):
+ News test shows a bug in BD_Shape::poly_difference_assign().
+
+2005-11-16 Wednesday 07:17 Abramo Bagnara
+
+ * src/DB_Matrix.inlines.hh (1.12): Fixed obnoxious typo. Added
+ missing qualifiers.
+
+2005-11-15 Tuesday 21:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Congruence.defs.hh, Grid.defs.hh (grids.[26,78]): Reverted
+ a previous change to the documentation in Congruence.defs.hh
+ Corrected line expression in example 2 in Grid.defs.hh.
+
+2005-11-15 Tuesday 20:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.4): Added (experimental, commented
+ out) invocations of the rectilinear_distance_assign() function.
+
+2005-11-15 Tuesday 19:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Matrix.defs.hh (1.10), DB_Matrix.inlines.hh (1.11): New
+ functions euclidean_distance_assign() and
+ l_infinity_distance_assign(). Along with
+ rectilinear_distance_assign() they are all implemented in terms
+ of the new, generalized function l_m_distance_assign().
+
+2005-11-15 Tuesday 18:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.inlines.hh (1.10): Several improvements to template
+ <typename Temp, typename To, typename T> inline bool
+ rectilinear_distance_assign(Checked_Number<To,
+ Extended_Number_Policy>& r, const DB_Matrix<T>& x, const
+ DB_Matrix<T>& y, const Rounding_Dir dir, Temp& tmp0, Temp& tmp1,
+ Temp& tmp2). (Joint work with Abramo Bagnara.)
+
+2005-11-15 Tuesday 18:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.31): The steepest-edge technique should be
+ enabled by default (it was disabled by error in the last commit).
+
+2005-11-15 Tuesday 17:35 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.inlines.hh (grids.[15,17]): Make
+ is_trivial_true and is_trivial_false real (vs inline) methods.
+
+2005-11-15 Tuesday 17:19 Matthew Mundell
+
+ * src/Generator_System.cc (grids.14): "Use" parameter
+ check_normalization in method `insert'.
+
+2005-11-15 Tuesday 17:17 Matthew Mundell
+
+ * src/: Grid_Certificate.cc, Grid_minimize.cc, Grid_public.cc,
+ Grid_simplify.cc, Grid_widenings.cc (grids.[7,23,90,33,7]):
+ Normalize moduli in the congruence system simplify method. Clean
+ a few comments. In the zero dimension cases in
+ add_recycled_generators and add_recycled_generators_and_minimize
+ only set zero dimension universe when the grid is empty.
+
+2005-11-15 Tuesday 17:10 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.77): Doc the minimized_generators()
+ parameter conversion.
+
+2005-11-15 Tuesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.86): Statically allocate temporaries
+ in template <typename Temp, typename To, typename T> bool
+ rectilinear_distance_assign(Checked_Number<To,
+ Extended_Number_Policy>& r, const BD_Shape<T>& x, const
+ BD_Shape<T>& y, const Rounding_Dir dir).
+
+2005-11-15 Tuesday 15:58 Abramo Bagnara
+
+ * src/checked_ext.inlines.hh (1.25): Added missing argument.
+
+2005-11-15 Tuesday 15:38 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, mingenerators1.cc (grids.[52,1]): Add
+ mingenerators1, which tests Grid::minimized_generators().
+
+2005-11-15 Tuesday 15:37 Matthew Mundell
+
+ * src/Grid_public.cc (grids.89): In generators() use
+ hide_parameters() and move the zero dim check to precede the
+ empty check. Implement minimized_generators() directly, instead
+ of calling generators().
+
+2005-11-15 Tuesday 15:31 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[76,43]): Add
+ hide_parameters().
+
+2005-11-15 Tuesday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.inlines.hh (1.13): Two FIXMEs removed.
+
+2005-11-15 Tuesday 14:54 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.42): In construct(gs,) move the
+ gen_sys sorted flag setting into the space_dim > 0 case.
+
+2005-11-15 Tuesday 14:46 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.37), Checked_Number.inlines.hh
+ (1.42), DB_Row.inlines.hh (1.12), checked.defs.hh (1.28),
+ checked.inlines.hh (1.27), checked_ext.inlines.hh (1.24),
+ checked_mpq.inlines.hh (1.27), checked_mpz.inlines.hh (1.32):
+ Added construct function to Checked_Number. Added specialization
+ for mpq and mpz.
+
+2005-11-15 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.44), BD_Shape.inlines.hh (1.85),
+ DB_Matrix.defs.hh (1.9), DB_Matrix.inlines.hh (1.9): Added a
+ first version of some functions computing the rectilinear (or
+ Manhattan) distance between BD_Shape objects.
+
+2005-11-15 Tuesday 14:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Rounding_Dir.defs.hh (1.2), Rounding_Dir.inlines.hh (1.2):
+ Added Rounding_Dir inverse(Rounding_Dir dir): returns the inverse
+ rounding mode of `dir', ROUND_IGNORE being the inverse of itself.
+
+2005-11-15 Tuesday 14:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Rounding_Dir.inlines.hh (grids.1): file
+ Rounding_Dir.inlines.hh was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-11-15 Tuesday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.21), Makefile.am (1.129), Native_Integer.defs.hh
+ (1.15), Rounding.defs.hh (1.14), Rounding.types.hh (1.5),
+ Rounding_Dir.defs.hh (1.1), Rounding_Dir.inlines.hh (1.1),
+ checked.defs.hh (1.27): Rounding.types.hh removed. Other
+ Rounding.defs.hh renamed Rounding_Dir.defs.hh. Comments revised.
+ New file Rounding_Dir.inlines.hh will contain inline functions
+ operating on enum Rounding_Dir values.
+
+2005-11-15 Tuesday 12:38 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, generators1.cc, mincongruences1.cc
+ (grids.[51,1,1]): Add generators1 and mincongruences1, which test
+ Grid::generators() and Grid::minimized_congruences().
+
+2005-11-15 Tuesday 12:36 Matthew Mundell
+
+ * tests/Grid/congruences1.cc (grids.4): Insert test6, where the
+ grid is defined by generators. In test8 (was test7) minimize
+ when adding congruence.
+
+2005-11-15 Tuesday 12:33 Matthew Mundell
+
+ * src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[41,41,88]): Always set zero dim universe via
+ set_zero_dim_univ(). Insert a point in set_zero_dim_univ().
+ Create a correctly sized gen_sys in set_empty().
+
+ In the bounding box grid constructor move the generator system
+ flag setting into the space_dim > 0 case. In the covering box
+ grid constructor jump over the sorted flag clearing when an empty
+ grid is produced.
+
+ In construct(gs,) set space_dim before the empty test and set
+ zero dim universe when required. In Grid(n,kind) set zero dim
+ universe when required. Handle the zero dimension case in
+ minimized_congruences().
+
+ In generators() just return gen_sys when the grid is marked
+ empty, return the actual gen_sys for zero dim universe, ensure
+ that gen_sys is up to date, and convert any parameters to points.
+
+ In the zero dim cases of add_recycled_congruences_and_minimize
+ and add_recycled_congruences set empty or zero dim universe only
+ if required.
+
+2005-11-15 Tuesday 11:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.84): Method is_empty() now computes
+ shortest-path closure instead of applying the Bellman-Ford
+ algorithm.
+
+2005-11-15 Tuesday 11:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.30): Some further improvements to the function
+ steepest(). Function get_exiting_base_index() now takes a
+ *const* reference to base.
+
+2005-11-15 Tuesday 11:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Scalar_Products.cc (1.2): Don't break comment lines without
+ reason.
+
+2005-11-15 Tuesday 11:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.cc (grids.1): file Scalar_Products.cc was
+ added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-15 Tuesday 10:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.25): Improvements to the
+ documentation about congruences and how to build them.
+
+2005-11-15 Tuesday 01:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh (1.19), simplex.cc (1.29): In the
+ primal simplex algorithm, better separated the first and second
+ phase of the algorithm. Added a preprocessing flag enabling the
+ steepest-edge technique: teh flag is enabled by default. Added a
+ new method bool Constraint_System::is_satisfiable(Generator&
+ feasible_point) const; that check the satisfiability of a
+ constraint system by the primal simplex algorithm, returning a
+ feasible point if satisfiable. All of the above based on
+ implementation work by Andrea Cimino.
+
+2005-11-14 Monday 18:19 Matthew Mundell
+
+ * tests/Grid/congruences1.cc (grids.3): Add test7, where a
+ congruence system reference is used after the zero dimension grid
+ from which it comes has been made empty.
+
+2005-11-14 Monday 17:55 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.18): Add zero dimension construction
+ tests.
+
+2005-11-14 Monday 17:55 Matthew Mundell
+
+ * tests/Grid/congruences1.cc (grids.2): Add test6, where a
+ congruence system reference is used after the grid from which it
+ comes has been made empty.
+
+2005-11-14 Monday 16:57 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, congruences1.cc (grids.[50,1]): Add
+ congrueces1, which tests Grid::congruences().
+
+2005-11-14 Monday 16:56 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.75): Note the covering box constructor
+ behaviour when the box is empty. Improve the get_covering_box
+ description. Add the set_empty method to the methods required of
+ the box class in the get_covering_box doc.
+
+2005-11-14 Monday 16:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/mp_numeric_limits.hh (1.2): Fixed
+ numeric_limits<mpz_class>::epsilon() and
+ numeric_limits<mpz_class>::round_error(): they now return 0.
+
+2005-11-14 Monday 16:47 Matthew Mundell
+
+ * tests/Grid/maxmin1.cc (grids.2): Use check_both in test2.
+ Implement the zero dimension universe test.
+
+2005-11-14 Monday 16:46 Matthew Mundell
+
+ * tests/Grid/coveringbox2.cc (grids.5): Add an empty fail check to
+ operator==. Update the boxes expected from empty grids. Add
+ zero dimension tests.
+
+2005-11-14 Monday 16:44 Matthew Mundell
+
+ * tests/Grid/boundingbox2.cc (grids.3): Add an empty fail check to
+ operator==. Add zero dimension tests.
+
+2005-11-14 Monday 16:42 Matthew Mundell
+
+ * src/Grid_public.cc (grids.87): In Grid(dims,kind),
+ add_recycled_congruences(cgs) and
+ add_recycled_congruences_and_minimize(cgs) call set_empty instead
+ of setting the empty flag directly.
+
+ In congruences() adjust the assertion on the number of cols for
+ the modulus and constant term columns.
+
+ Improve and correct some comments. Neaten the OK zero dimension
+ universe check.
+
+2005-11-14 Monday 16:32 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.22): In both minimize methods assert
+ that there are the minimum required number of columns.
+
+2005-11-14 Monday 16:30 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.6): Use gr instead of cgr, for
+ consistency.
+
+2005-11-14 Monday 16:29 Matthew Mundell
+
+ * src/: Grid.inlines.hh, Grid_nonpublic.cc (grids.[40,40]): In
+ set_empty make con_sys false.
+
+ Add a zero dimension universe case to max_min.
+
+ Take out an old topology comment.
+
+ In construct(ccgs) insert the integrality congruence when the
+ dimension is greater than zero, and only check for false
+ congruences in dimension zero when there are two or more columns
+ in the given congruence system.
+
+ In the box constructors and construct(const_gs,bool) call
+ set_empty instead of setting the empty flag directly.
+
+ In get_covering_box add a zero dimension check and set the box
+ empty when the grid is empty. In shrink_bounding_box add a zero
+ dimension check and take out a redundant check for rows in the
+ generator system.
+
+2005-11-14 Monday 16:08 Matthew Mundell
+
+ * src/Congruence_System.inlines.hh (grids.10): Ensure that the
+ modulus and constant term columns always exist.
+
+2005-11-14 Monday 16:05 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.29): Neaten formatting.
+
+2005-11-14 Monday 16:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.177): Special Doxygen commands such as
+ \subsection gets confused by line breaks.
+
+2005-11-14 Monday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.110): Corrected a typo in the
+ documentation.
+
+2005-11-14 Monday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.43): Class documentation improved a
+ little.
+
+2005-11-14 Monday 15:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.83): Helper functions min_assign() and
+ max_assign() renamed as assign_min() and assign_max() for
+ consistency with those defined in checked.defs.hh.
+
+2005-11-14 Monday 10:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.60), devref.doxyconf-latex.in
+ (1.4): Also consider BD shapes when building the developers'
+ manual.
+
+2005-11-14 Monday 10:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.42): A few documentation improvements.
+
+2005-11-14 Monday 10:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BDS_Status.idefs.hh (1.10): Typo corrected in the
+ documentation.
+
+2005-11-14 Monday 10:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.inlines.hh (1.41), Native_Integer.inlines.hh
+ (1.16): Avoid a few redundant template qualifications.
+
+2005-11-14 Monday 09:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.defs.hh (1.13): Unneeded friend declaration removed.
+
+2005-11-14 Monday 08:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/DB_Row.inlines.hh (1.11): In new method
+ DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+ U& y) using y's public indexing operator [] instead of accessing
+ the private member y.vec_.
+
+2005-11-13 Sunday 23:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.82), tests/BD_Shape/affineimage8.cc
+ (1.6): Further improvement in the coding as well as precision of
+ the general case of affineimage. The known result of
+ affineimage8.cc changed accordingly.
+
+2005-11-13 Sunday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.defs.hh (1.15): Compiler warnings avoided.
+
+2005-11-13 Sunday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.3): Completed.
+
+2005-11-13 Sunday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: DB_Row.defs.hh (1.12), DB_Row.inlines.hh (1.10): New
+ signature and definition of method void
+ DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+ U& y).
+
+2005-11-13 Sunday 18:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.25), globals.inlines.hh (1.13): Removed
+ no longer used function compute_capacity() using a single
+ argument; always use the function also taking the maximum
+ capacity as second argument.
+
+2005-11-13 Sunday 18:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.defs.hh (1.8), DB_Matrix.inlines.hh (1.8): Using
+ max_num_rows() and max_num_columns() where appropriate. Methods
+ ascii_dump and ascii_load and the destructor should not be
+ virtual.
+
+2005-11-13 Sunday 18:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.86), Matrix.inlines.hh (1.46): Using
+ max_num_columns() where appropriate.
+
+2005-11-13 Sunday 15:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.81): Added a first, tentative
+ implementation of template <typename T> template <typename U>
+ BD_Shape<T>::BD_Shape(const BD_Shape<U>& y).
+
+2005-11-13 Sunday 15:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.41): Deckared a new template constructor
+ template <typename U> explicit BD_Shape(const BD_Shape<U>& y): it
+ builds a conservative, upward approximation of `y'.
+
+2005-11-13 Sunday 15:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.inlines.hh (1.7): Added a first implementation of
+ template <typename T> template <typename U>
+ DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y). Added the
+ inclusion of checked.defs.hh, which is needed to get access to
+ the compute_capacity() functions.
+
+2005-11-13 Sunday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Matrix.defs.hh (1.7): Declared new template constructor
+ template <typename T> template <typename U> explicit
+ DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y): it constructs a
+ conservative approximation of `y'. All DB_Matrix classes are now
+ friends of each other.
+
+2005-11-13 Sunday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.inlines.hh (1.9): Added (not yet operational)
+ skeletons for the implementation of template <typename T>
+ template <typename U> void
+ DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+ dimension_type capacity) and template <typename T> template
+ <typename U> void
+ DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+ typename DB_Row_Impl_Handler<U>::Impl& y).
+
+2005-11-13 Sunday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/DB_Row.defs.hh (1.11): Declared new method template <typename
+ T> template <typename U> void
+ DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+ dimension_type capacity). Declared new method template <typename
+ T> template <typename U> void
+ DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+ typename DB_Row_Impl_Handler<U>::Impl& y). Comments improved.
+
+2005-11-12 Saturday 17:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+ affineimage10.cc (1.3), affineimage8.cc (1.5), affineimage9.cc
+ (1.5), affinepreimage5.cc (1.4), ascii_dump_load1.cc (1.7),
+ ascii_dump_load2.cc (1.6), cc76extrapolation4.cc (1.6),
+ constraints1.cc (1.7), equality1.cc (1.7), exceptions1.cc (1.7),
+ exceptions2.cc (1.6), exceptions3.cc (1.8),
+ generalizedaffineimage13.cc (1.3), generalizedaffineimage14.cc
+ (1.7), limitedCC76extrapolation2.cc (1.6),
+ limitedCC76extrapolation3.cc (1.6), mapspacedims2.cc (1.6),
+ mapspacedims3.cc (1.5), relations1.cc (1.8), relations2.cc (1.8),
+ relations3.cc (1.7), relations4.cc (1.6), relations5.cc (1.8),
+ removespacedims2.cc (1.6), removespacedims3.cc (1.6): Using the
+ anonymous namespace instead of declaring static functions.
+
+2005-11-12 Saturday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affineimage10.cc (grids.1): file affineimage10.cc
+ was added on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-12 Saturday 13:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: lib-ld.m4 (1.3), lib-link.m4 (1.2), lib-prefix.m4 (1.3):
+ Updated from Gettext 0.14.5.
+
+2005-11-12 Saturday 13:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.197): Consistently use uppercase letters to
+ specify (placeholders for) configuration options' arguments.
+ Systematically use AC_HELP_STRING to format help messages.
+
+2005-11-12 Saturday 13:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.21), NEWS (1.164): Corrected a typo.
+
+2005-11-12 Saturday 13:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README.configure (1.15): Corrected a couple of typos.
+
+2005-11-11 Friday 17:29 Matthew Mundell
+
+ * src/: Grid_public.cc, Grid.inlines.hh (grids.[86,39]): Inline
+ method is_empty. In is_empty add more fast-fail tests and
+ minimize only the congruence system in the last-resort test.
+
+2005-11-11 Friday 17:25 Matthew Mundell
+
+ * src/: Grid_Status.cc, Grid_Status.idefs.hh,
+ Grid_Status.inlines.hh (grids.[4,4,3]): Gridify the Grid_Status
+ comments.
+
+2005-11-11 Friday 17:23 Matthew Mundell
+
+ * doc/definitions.dox (grids.8): Add anchor grid_space_dimensions.
+ Refer to affine_function instead of affine_transformation.
+
+2005-11-11 Friday 17:03 Matthew Mundell
+
+ * tests/Grid/affinepreimage1.cc (grids.6): Correct expected result
+ in test16.
+
+2005-11-11 Friday 15:35 Matthew Mundell
+
+ * src/Congruence_System.inlines.hh (grids.9): Only qualify the
+ namespace of insert(cg) once.
+
+2005-11-11 Friday 15:32 Matthew Mundell
+
+ * src/Generator_System.defs.hh (grids.6): Document all parameters
+ in a method when some are documented.
+
+2005-11-11 Friday 15:29 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.74): Improve the class description.
+ Update to the newly named affine_function and
+ generalized_affine_relation anchors. Use \cL for grids instead
+ of \cP. Document the space dimension changing behaviour of
+ map_space_dimension. Document all parameters when some are
+ documented. Correct the return value documentation for the
+ simplify methods.
+
+2005-11-10 Thursday 21:28 Matthew Mundell
+
+ * src/Grid_public.cc (grids.85): Add colon between namespace and
+ class in comment.
+
+2005-11-10 Thursday 21:28 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.73): Convert the class doc examples into
+ grid examples. Correct a parameter name.
+
+2005-11-10 Thursday 21:26 Matthew Mundell
+
+ * src/Generator.defs.hh (grids.9): Keep Congruence_System as a
+ friend.
+
+2005-11-10 Thursday 21:21 Matthew Mundell
+
+ * tests/Grid/: affineimage1.cc, affinepreimage1.cc (grids.[7,5]):
+ Add three simple tests.
+
+2005-11-10 Thursday 19:14 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[14,24]): Add
+ method throw_invalid_argument. Use it in
+ throw_dimension_incompatible. In the constructors that take
+ constraints move the check that the constraint is an equality to
+ come before the construction of the underlying row.
+
+2005-11-10 Thursday 18:31 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh,
+ Congruence_System.inlines.hh, Constraint.defs.hh
+ (grids.[28,19,8,7]): In insert(cg) use add_recycled_row instead
+ of add_row when a resized copy of cg is created, and call
+ num_rows() in place instead of using a variable.
+
+ Inline insert(cg).
+
+ Doc the strong normalization of the insert methods.
+
+2005-11-10 Thursday 18:23 Matthew Mundell
+
+ * src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+ (grids.[4,3,3]): Add add_recycled_row(Row&). Move the bulk of
+ add_row to add_recycled_row. Call add_recycled_row from add_row.
+ Inline add_row.
+
+2005-11-10 Thursday 18:16 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[13,23]): Add
+ Congruence(c, sz, capacity).
+
+2005-11-10 Thursday 15:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.80): Corrected a bug in method
+ ascii_load().
+
+2005-11-10 Thursday 14:07 Matthew Mundell
+
+ * src/: Congruence.defs.hh, scalar_products.cc,
+ scalar_products.defs.hh (grids.[22,3,3]): Take out
+ scalar_product_assign(.., ref) and
+ reduced_scalar_product_assign(.., ref), which were required by an
+ older form of Congruence_System::satisfies_all_congruences.
+
+2005-11-10 Thursday 13:41 Matthew Mundell
+
+ * src/: Congruence_System.defs.hh, Congruence_System.inlines.hh
+ (grids.[18,7]): Make the ascii_dump and ascii_load documentation
+ implementation details. Take out
+ Congruence_System(n_rows,n_cols). Keep has_linear_equalities().
+
+2005-11-10 Thursday 12:31 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, topclosure1.cc (grids.[49,1]): Add
+ topclosure1, which tests Grid::topological_closure_assign().
+
+2005-11-10 Thursday 12:29 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+ (grids.[72,38,84]): Declare and implement
+ topological_closure_assign().
+
+2005-11-10 Thursday 11:57 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, membytes1.cc, membytes2.cc
+ (grids.[48,1,1]): Add membytes1 and membytes2, to exercise
+ Grid::total_memory_in_bytes() and
+ Grid::external_memory_in_bytes().
+
+2005-11-10 Thursday 11:56 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.6): Rename parameter selected_cgs as
+ cgs_selected.
+
+2005-11-10 Thursday 11:55 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_minimize.cc,
+ Grid_nonpublic.cc, Grid_public.cc (grids.[71,37,21,39,83]): Doc
+ param convert_rays_to_lines in Grid(gs, convert_rays_to_lines).
+ Neaten some comment widths. Make the add_space_dimensions
+ methods private. Note in docs where Grid maths symbols must be
+ used. Doc the return of ascii_load formally. Shorten the
+ convert_rays_to_lines param doc for construct(gs,
+ convert_rays_to_lines). Use "minimize" instead of "reduce" and
+ "generator system" instead of "parameter system". Improve a few
+ method descriptions.
+
+ Enable method total_memory_in_bytes. Take out the remaining
+ pending row methods, strongly_minimize_congruences and
+ strongly_minimize_generators.
+
+ Void the return from minimize(cgs,ls). Swap the return cases in
+ minimize(gs,cgs) to match the other methods that return an
+ indication of the grid's emptiness.
+
+2005-11-08 Tuesday 21:46 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.70): Correct and neaten comments.
+ Document the parameters in the shrink and get bounding box
+ methods. Document the return in
+ add_recycled_constraints_and_minimize. Move the
+ join_assign_and_minimize declaration to match the Polyhedron
+ ordering.
+
+2005-11-08 Tuesday 20:25 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, disjoint1.cc (grids.[47,1]): Add
+ disjoint1, which tests Grid::is_disjoint_from().
+
+2005-11-08 Tuesday 20:24 Matthew Mundell
+
+ * tests/Grid/contains1.cc (grids.4): Improve comments, messages and
+ a variable name.
+
+2005-11-08 Tuesday 20:22 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.5): In limited_extrapolation_assign
+ check dimension compatibility before falling back to the ordinary
+ widening.
+
+2005-11-08 Tuesday 20:16 Matthew Mundell
+
+ * src/Grid_public.cc (grids.82): Enable the is_disjoint_from
+ definition. In intersection_assign pass true only to y.OK, as x
+ can be empty. Update a temporary comment. In OK use
+ "unsatisfiable" instead fo "insoluble". Neaten a comment.
+
+2005-11-08 Tuesday 20:11 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.36): Take out is_necessarily_closed()
+ and topology().
+
+2005-11-08 Tuesday 20:10 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.69): Neaten and correct comments.
+
+2005-11-08 Tuesday 19:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.79), tests/BD_Shape/Makefile.am
+ (1.24), tests/BD_Shape/minconstraints1.cc (1.1): Corrected a few
+ bugs in minimized_constraints(); added a new test for it. The
+ ascii_dump() and ascii_load() methods now also write/read the
+ matrix encoding redundancy information.
+
+2005-11-08 Tuesday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/minconstraints1.cc (grids.1): file
+ minconstraints1.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-11-08 Tuesday 17:54 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.17): Align copyright line.
+
+2005-11-08 Tuesday 17:54 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.68): Document the length_error exceptions
+ that occur in many constructors. Mention copying the given
+ system in the brief descriptions for many constructors. Improve
+ formatting and correct typos in a few comments.
+
+2005-11-08 Tuesday 17:52 Matthew Mundell
+
+ * src/Grid_public.cc (grids.81): In the copy constructor create
+ gen_sys NECESSARILY_CLOSED and assert that the given gen_sys was
+ NECESSARILY_CLOSED. Move operator= to match the order of method
+ declarations.
+
+2005-11-08 Tuesday 17:50 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.35): Move box constructors to follow
+ other constructors.
+
+2005-11-08 Tuesday 17:41 Matthew Mundell
+
+ * TODO (grids.15): Complete upper_bound_assign_and_minimize item.
+
+2005-11-08 Tuesday 16:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.78): Corrected a couple of stupid bugs
+ in the copy constructor and assignment operator of BD_Shape. A
+ few useful functions related to the computation of leaders have
+ been extracted from shortest_path_reduction_assign(), so as to
+ factor common code in minimized_constraints() and
+ affine_dimension(). The method minimized_constraints() should
+ now return a constraint system in minimal form, exploiting
+ redundancy information. The method constraints() now invokes
+ minimized_constraints() if the BD_Shape is known to be reduced.
+
+2005-11-08 Tuesday 14:09 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, addcongruences1.cc (grids.[46,1]): Add
+ addcongruences1, to test methods which add multiple congruences
+ to a grid.
+
+2005-11-08 Tuesday 14:08 Matthew Mundell
+
+ * tests/Grid/grid3.cc (grids.5): Align copyright line.
+
+2005-11-08 Tuesday 14:07 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (grids.6): Improve title comment.
+ Add namespace with shared Variables.
+
+2005-11-08 Tuesday 13:41 Matthew Mundell
+
+ * tests/Grid/: grid3.cc, Makefile.am, addconstraint1.cc,
+ addconstraints1.cc (grids.[4,45,1,10]): Add grid3, which tests
+ construction of grids from constraints.
+
+ Add addconstraint1, which tests adding single constraints to
+ grids. Move the single-constraint adding tests from
+ addconstraints1 to addconstraint1.
+
+ Add tests for add_constraints_and_minimize(cs),
+ add_recycled_constraints(cs) and
+ add_recycled_constraints_and_minimize(cs) to addconstraints1.
+
+2005-11-08 Tuesday 13:32 Matthew Mundell
+
+ * TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[14,67,80]):
+ Add Grid(cs), add_constraint_and_minimize(c),
+ add_constraints_and_minimize(cs), add_recycled_constraints(cs)
+ and add_recycled_constraints_and_minimize(cs).
+
+ In all of the constraint adding methods allow the addition of any
+ kind of constraint (instead of only equalities). In
+ add_constraints(cs) use Congruence_System(cs) to add the
+ constraints.
+
+ Improve some method descriptions.
+
+2005-11-08 Tuesday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage8.cc (1.4), affineimage9.cc (1.4),
+ generalizedaffineimage14.cc (1.6): Some suspect constraints in
+ the known_results have been commented out. They have to be
+ carefully checked to see of they are really wanted.
+
+2005-11-08 Tuesday 12:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/affineimage10.cc (1.2): Do not be noisy.
+
+2005-11-08 Tuesday 12:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: ch78widening4.cc (1.5),
+ generalizedaffineimage1.cc (1.6): Avoid lines that are too long.
+ Removed a few (unnecessary) blank lines.
+
+2005-11-08 Tuesday 12:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.77): Corrected a bug in affine_image()
+ whereby incorrect bounds for binary constraints could have been
+ deduced. In the invariant-checking method OK(), we now also
+ check that no entry of the dbm has value MINUS_INFINITY; if the
+ dbm is marked as shortest-path reduced, then we check that the
+ dbm entry for a non-redundant constraint has a finite value.
+
+2005-11-08 Tuesday 11:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.76): Got rid of the wrong version of
+ div_round_up().
+
+2005-11-07 Monday 18:29 Matthew Mundell
+
+ * tests/Grid/griddifference1 (grids.2): Remove file added in error
+ earlier.
+
+2005-11-07 Monday 18:24 Matthew Mundell
+
+ * tests/Grid/maxmin1.cc (grids.1): Add maxmin1, which tests
+ Grid::maximize(le&, ...) and Grid::minimize(le&, ...).
+
+2005-11-07 Monday 18:20 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.9): Add test10, for
+ add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:20 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[66,79,13]):
+ Add add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:07 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.8): Add test9, for
+ add_recycled_congruences(cs).
+
+2005-11-07 Monday 18:07 Matthew Mundell
+
+ * TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[12,65,78]):
+ Add add_recycled_congruences(cs). Add a dimension compatibility
+ check to add_congruences(cgs).
+
+2005-11-07 Monday 17:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.23), affineimage10.cc (1.1): A
+ test that was showing a bug in the old implementation of affine
+ images.
+
+2005-11-07 Monday 17:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BDS_Status.idefs.hh (1.9), BDS_Status.inlines.hh (1.7),
+ BD_Shape.defs.hh (1.40), BD_Shape.inlines.hh (1.75): A BD_Shape
+ representation now also carries a dbm matrix of Boolean values,
+ indicating whether or not the corresponding dbm entry is
+ redundant. The new matrix is meaningful only if the BDS_Status
+ test marked_shortest_path_reduced() returns true, otherwise
+ it is meaningless. Note that a dbm can be shortest-path reduced
+ only if it is also shortest-path closed. The redundancy
+ information is established by shortest_path_reduction_assign()
+ and is lost as soon as we modify the representation of the
+ BD_Shape. That is, currently no effort is done to keep it
+ up-to-date. Moreover, when we reset the shortest-path closure
+ flag, then the reduction flag is reset too.
+
+ Added private helper methods add_dbm_constraint() that allow
+ for the addition of a difference bound constraint without
+ encoding it into a Constraint object. The method is particularly
+ used in the computation of affine images.
+
+ The methods computing affine images and preimages rewritten
+ (almost) from scratch. (The old implementations, were not
+ behaving correctly when the denominator was negative or when
+ considering generalized images).
+
+ Added a lot of const qualifications; avoided some dbm's
+ coefficient copies, preferring the use of references instead.
+
+2005-11-07 Monday 16:52 Matthew Mundell
+
+ * src/Grid_public.cc (grids.77): Implement add_congruences and
+ add_congruences_and_minimize via Congruence_System(cs).
+
+2005-11-07 Monday 16:52 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[27,17]): Add Congruence_System(Constraint_System&). Move
+ the normalize_moduli definition into order.
+
+2005-11-07 Monday 16:40 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.53): Don't add nothing to std
+ namespace.
+
+2005-11-07 Monday 16:30 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.52): Fixed argument order.
+
+2005-11-07 Monday 16:27 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (1.26): Added add_mul and sub_mul.
+
+2005-11-07 Monday 14:35 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.7): Add test8, for
+ add_congruences(cs).
+
+2005-11-07 Monday 14:35 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[64,76,11]):
+ Add add_congruences(cs). In add_congruences_and_minimize(cs) add
+ the congruences with add_recycled_congruences_and_minimize.
+
+2005-11-07 Monday 12:04 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (grids.16): Narrow a comment.
+
+2005-11-07 Monday 12:01 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, griddifference1 (grids.[44,1]): Add
+ maxmin1, which tests Grid::maximize(le&, ...) and
+ Grid::minimize(le&, ...).
+
+2005-11-07 Monday 11:59 Matthew Mundell
+
+ * tests/Grid/bounds1.cc (grids.2): Match expected values to updated
+ method behaviour.
+
+2005-11-07 Monday 11:58 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+ TODO (grids.[63,34,38,10]): Separate parameters with semicolons
+ in descriptions. Add minimize and maximize methods. Match the
+ behaviours of bounds_from_above and bounds_from_below to the
+ Polyhedron versions.
+
+2005-11-05 Saturday 17:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.176), interfaces/C/ppl_c.h.in (1.55),
+ interfaces/Prolog/Prolog_interface.dox (1.135),
+ src/BD_Shape.defs.hh (1.39), src/Constraint_System.defs.hh
+ (1.18), src/Determinate.defs.hh (1.58),
+ src/Polyhedra_Powerset.defs.hh (1.25), src/Polyhedron.defs.hh
+ (1.284): In definitions.doc we were bricolating our own
+ sectioning with <B> and </B> tags. Started using Doxygen's
+ \subsection command. Started using label names that are easily
+ obtained from the section or subsection title. This is less
+ likely to generate conflicts, but a better scheme must be devised
+ that can work across the entire library's documentation.
+
+2005-11-05 Saturday 08:59 Abramo Bagnara
+
+ * tests/BD_Shape/run_tests (1.7): Remove dirty marker only after
+ all is clean.
+
+2005-11-05 Saturday 08:30 Abramo Bagnara
+
+ * src/: Float.defs.hh (1.14), checked_float.inlines.hh (1.51):
+ *_BITS constants are unsigned.
+
+2005-11-04 Friday 22:22 Abramo Bagnara
+
+ * tests/BD_Shape/run_tests (1.6): Avoid initial make clean.
+
+2005-11-04 Friday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/closure1.cc (1.2): Fixed a copy and paste mistake.
+
+2005-11-04 Friday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ppl_test.hh (1.29), BD_Shape/run_tests (1.5): Do not
+ define TBD_Shape: define BD_SHAPE_INSTANCE instead.
+
+2005-11-04 Friday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.22), closure1.cc (1.1): Draft
+ test to check closure more seriously (it does not work as
+ expected at the moment).
+
+2005-11-04 Friday 14:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.74): Old code for div_round_up()
+ temporarily restored, since some (wrong) tests depend on it.
+
+2005-11-04 Friday 13:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.cc (grids.1): file Float.cc was added on branch grids
+ on 2005-11-23 13:24:06 +0000
+
+2005-11-04 Friday 13:58 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.36), Float.cc (1.2),
+ Float.defs.hh (1.13), Float.inlines.hh (1.14),
+ Native_Integer.defs.hh (1.14), Native_Integer.inlines.hh (1.15),
+ checked_ext.inlines.hh (1.23), checked_float.inlines.hh (1.50),
+ checked_int.inlines.hh (1.41), float.types.hh (1.12): Fixed use
+ of native types also when identical to others.
+
+2005-11-04 Friday 12:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.73): Reimplemented div_round_up().
+
+2005-11-04 Friday 11:16 Matthew Mundell
+
+ * tests/Grid/bounded1.cc (grids.2): Add test12, in which every
+ generator is the same point.
+
+2005-11-04 Friday 11:15 Matthew Mundell
+
+ * src/Grid_public.cc (grids.75): In is_bounded use the generator
+ system in any form.
+
+2005-11-04 Friday 11:13 Matthew Mundell
+
+ * tests/Grid/topclosed1.cc (grids.3): Take out the find_variation
+ directive.
+
+2005-11-04 Friday 11:12 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, bounds1.cc (grids.[43,1]): Add bounds1,
+ which tests Grid::bounds_from_above and Grid::bounds_from_below.
+
+2005-11-04 Friday 11:11 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+ TODO (grids.[62,33,37,9]): Add methods bounds, bounds_from_above
+ and bounds_from_below. Reorder a few method definitions.
+
+2005-11-04 Friday 07:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.175): Removed some spurious percent signs.
+
+2005-11-03 Thursday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.158): Begging for a coding guideline as far as the use of
+ (checked) arithmetic functions is concerned.
+
+2005-11-03 Thursday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: definitions.dox (1.174), ppl.sty (1.22): Added a draft new
+ section on "Integers Represented by Floating Point Numbers".
+ This contains results that are needed to prove the correctness of
+ our implementation of the GCD and LCM operations. (Joint work
+ with Alessandro Zaccagnini and Abramo Bagnara.)
+
+2005-11-03 Thursday 14:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.31): Be more robust in the
+ definition of mp_size_field_t.
+
+2005-11-03 Thursday 14:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.196): Added a safeguard against possible changes
+ in the implementation of GMP.
+
+2005-11-03 Thursday 10:58 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (1.30): mp_size_t is not the size of
+ size field.
+
+2005-11-03 Thursday 08:06 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.49): Avoid useless #if
+
+2005-11-02 Wednesday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.7): Added missing access control
+ specification.
+
+2005-11-02 Wednesday 22:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Float.defs.hh (1.12), Polyhedron_nonpublic.cc (1.57):
+ Spurious semicolons removed.
+
+2005-11-02 Wednesday 21:07 Matthew Mundell
+
+ * TODO (grids.8): Complete operation is_bounded.
+
+2005-11-02 Wednesday 21:06 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, bounded1.cc (grids.[42,1]): Add
+ bounded1, which tests Grid::is_bounded.
+
+2005-11-02 Wednesday 21:05 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[61,74]): Add method
+ is_bounded.
+
+2005-11-02 Wednesday 20:45 Matthew Mundell
+
+ * TODO (grids.7): Complete operation affine_dimension.
+
+2005-11-02 Wednesday 20:43 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[60,36]): To
+ normalize_divisors(gs,div) add third argument first_point, which
+ implies that all points in gs have the same divisor. Use this
+ argument in normalize_divisors(gs,gs).
+
+2005-11-02 Wednesday 19:49 Matthew Mundell
+
+ * src/Grid_public.cc (grids.73): In is_topologically_closed search
+ for a single parameter or proper congruence, instead of checking
+ the counts of these.
+
+2005-11-02 Wednesday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.4): The long double incarnation of
+ checked numbers is still not ready: do not test with it for the
+ time being.
+
+2005-11-02 Wednesday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Float.cc (1.1), Makefile.am (1.128): Obey verse 9.4.2.4 of
+ the C++ standard: "The [static const data] member shall still be
+ defined in a namespace scope if it is used in the program and the
+ namespace scope definition shall not contain an initializer."
+
+2005-11-02 Wednesday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (1.11): Do not define symbols in the global
+ namespace.
+
+2005-11-02 Wednesday 11:32 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, affinedim1.cc (grids.[41,1]): Add
+ affinedim1, which tests Grid::affine_dimension().
+
+2005-11-02 Wednesday 11:31 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.26): In increase_space_dimension
+ only add columns when more columns are requested (instead of
+ always ensuring that the modulus and constant term column exist).
+
+2005-11-02 Wednesday 11:28 Matthew Mundell
+
+ * src/Grid_public.cc (grids.72): Enable and implement method
+ affine_dimension. In minimized_congruences and
+ minimized_generators minimize only the required system. In
+ generators always set the topology to NECESSARILY_CLOSED.
+
+2005-11-02 Wednesday 11:22 Abramo Bagnara
+
+ * src/Float.defs.hh (1.11): Fixed typo.
+
+2005-11-01 Tuesday 18:45 Matthew Mundell
+
+ * TODO (grids.6): Complete operators is_topologally_closed and
+ shrink_bounding_box.
+
+2005-11-01 Tuesday 18:44 Matthew Mundell
+
+ * tests/Grid/topclosed1.cc (grids.2): Replace function
+ topclosed1_equal with copy_compare (in ppl_test.hh). Correct
+ error messages.
+
+2005-11-01 Tuesday 18:42 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.13): Add function copy_compare(Grid&,
+ Grid&).
+
+2005-11-01 Tuesday 18:41 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, pointed1.cc (grids.[40,1]): Add
+ pointed1, which tests Grid::is_pointed().
+
+2005-11-01 Tuesday 18:40 Matthew Mundell
+
+ * src/: Grid_public.cc, Grid.defs.hh (grids.[71,59]): Add the
+ definition and improve the doc description of is_pointed.
+
+2005-11-01 Tuesday 14:51 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, topclosed1.cc (grids.[39,1]): Add
+ topclosed1, which tests Grid::is_topologically_closed().
+
+2005-11-01 Tuesday 14:49 Matthew Mundell
+
+ * src/Grid_public.cc (grids.70): Implement method
+ is_topologically_closed.
+
+2005-11-01 Tuesday 14:26 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.11): Add test8, in which the
+ added generator has a divisor. Only call find_variation on the
+ grid under test.
+
+2005-11-01 Tuesday 14:24 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[58,35]): In
+ normalize_divisors(gs,coeff) read the initial divisor of gs into
+ a temporary before the divisor modifying loop. In the same loop
+ only multiply the generator when the factor is greater than one.
+ Improve the description of this method, and improve slightly the
+ descriptions of a few others.
+
+ In normalize_divisors(gs,gs) access the divisor via the array
+ operator instead of the divisor method.
+
+2005-11-01 Tuesday 14:03 Abramo Bagnara
+
+ * src/: Float.defs.hh (1.10), checked_float.inlines.hh (1.48):
+ Simpler overflow return.
+
+2005-11-01 Tuesday 14:02 Abramo Bagnara
+
+ * src/: checked_mpq.inlines.hh (1.25), checked_mpz.inlines.hh
+ (1.29): Simplified assign when available in lower level class.
+
+2005-11-01 Tuesday 01:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_ext.inlines.hh (1.22): Corrected a bug in sub_ext()
+ whereby subtracting any finite value from PLUS_INFINITY resulted
+ in MINUS_INFINITY (and vice versa).
+
+2005-11-01 Tuesday 01:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Checked_Number.cc (1.8): Minor improvements in the exception
+ messages.
+
+2005-10-31 Monday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.3): Test also with long doubles.
+
+2005-10-31 Monday 22:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.13): Spurious redeclaration removed.
+
+2005-10-31 Monday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.12): Spurious incomplete statement
+ removed.
+
+2005-10-31 Monday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.11): Wrong syntax for static_cast fixed.
+
+2005-10-31 Monday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.47): An instance of float127_t
+ changed to float128_t.
+
+2005-10-31 Monday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Float.defs.hh (1.9), Float.inlines.hh (1.10),
+ float.types.hh (1.10): The <stdint.h> header file was included
+ unnecessarily in float.types.hh and not included in Float.defs.hh
+ and Float.inlines.hh.
+
+2005-10-31 Monday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.28): Define the utility type `long_double'.
+
+2005-10-31 Monday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.127): Added the dependency of ppl_install.hh
+ on $(INCLUDE_FILES). Reformatted some rules for consistency.
+
+2005-10-31 Monday 20:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (1.9): Define FLOAT96_TYPE or FLOAT128_TYPE
+ depending on SIZEOF_LONG_DOUBLE. Definition of float128_t fixed.
+
+2005-10-31 Monday 17:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.21): Last change was only
+ half-made: completed.
+
+2005-10-31 Monday 13:59 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.35), Checked_Number.inlines.hh
+ (1.40): Added copy constructor and operator=.
+
+2005-10-31 Monday 13:58 Abramo Bagnara
+
+ * src/: checked.defs.hh (1.26), checked.inlines.hh (1.26),
+ checked_float.inlines.hh (1.46), checked_int.inlines.hh (1.40),
+ checked_mpq.inlines.hh (1.24), checked_mpz.inlines.hh (1.28):
+ Added copy function. Fixed float output.
+
+2005-10-31 Monday 07:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.20): The `run_tests' script is now
+ distributed.
+
+2005-10-30 Sunday 18:53 Matthew Mundell
+
+ * tests/Grid/: addconstraints1.cc, addspacedims1.cc,
+ addspacedims2.cc, concatenate1.cc, congruence1.cc, contains1.cc,
+ contains2.cc, coveringbox2.cc, griddifference1.cc,
+ intersection1.cc, intersection2.cc, isuniverse1.cc, join2.cc,
+ join3.cc, limitedextrapolation1.cc, removespacedims1.cc,
+ removespacedims2.cc, timeelapse1.cc, widening1.cc
+ (grids.[6,9,6,3,7,3,2,4,6,5,6,4,5,2,4,6,5,4,6]): Make the title
+ comments of the tests consistent.
+
+2005-10-30 Sunday 18:51 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[57,32]): Update
+ get_covering_box to work directly with any form of generator
+ system and to only ever attempt to set each bound once.
+
+2005-10-30 Sunday 00:44 Matthew Mundell
+
+ * tests/Grid/coveringbox2.cc (grids.3): Add test14 and test15, to
+ test that fractions are reduced before being assigned to
+ intervals.
+
+2005-10-30 Sunday 00:42 Matthew Mundell
+
+ * tests/Grid/boundingbox2.cc (grids.2): Improve comment slightly.
+
+2005-10-30 Sunday 00:42 Matthew Mundell
+
+ * src/: Grid.inlines.hh, Grid.defs.hh (grids.[31,56]): In
+ get_covering_box reduce the fraction before assigning it to the
+ interval.
+
+2005-10-29 Saturday 20:17 Matthew Mundell
+
+ * tests/Grid/coveringbox2.cc (grids.2): Name variables
+ consistently, improve some comments and add test13 (in which an
+ empty grid is defined by congruences).
+
+2005-10-29 Saturday 20:16 Matthew Mundell
+
+ * tests/Grid/boundingbox1.cc (grids.7): Note that boundingbox2 also
+ tests the constructor under test.
+
+2005-10-29 Saturday 20:15 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, boundingbox2.cc (grids.[38,1]): Add
+ boundingbox2, which tests shrink_bounding_box(Box&).
+
+2005-10-29 Saturday 20:11 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[55,30]): Add
+ shrink_bounding_box(Box&). Correct two comments in
+ get_covering_box. Declare method is_topologically_closed.
+
+2005-10-29 Saturday 14:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/run_tests (1.2): Several improvements.
+
+2005-10-29 Saturday 14:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.27): No longer define TBD_Shape.
+
+2005-10-29 Saturday 12:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.19), run_tests (1.1): A first
+ attempt at testing all the instantiations.
+
+2005-10-29 Saturday 09:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.38), BD_Shape.inlines.hh (1.72): In the
+ limited widening operators, we now avoid having to decode twice
+ the limiting constraints (joint work with E. Mazzi). In several
+ places, upward loop iteration replaced by a downward one.
+
+2005-10-28 Friday 15:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (grids.5): Added a list of TODO items for the grids branch.
+
+2005-10-28 Friday 12:38 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.29): Calculate the proper congruence
+ coefficients in the covering box constructor via the GCD of the
+ divisors, instead of getting the LCM of the divisors (with
+ lcm_assign) and then repeating parts of this LCM calculation.
+ Given that the divisors are known to be positive, this also saves
+ the absolute value calculations that would have been performed in
+ lcm_assign.
+
+2005-10-27 Thursday 18:10 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, boundingbox1.cc, coveringbox1.cc,
+ coveringbox2.cc (grids.[37,6,7,1]): Add coveringbox2. Move the
+ coveringbox1 tests into coveringbox2, and move the boundingbox1
+ tests into coveringbox1. Fill boundingbox1 with tests of the
+ bounding box constructor.
+
+2005-10-27 Thursday 18:04 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[54,28]): Add a
+ bounding box constructor. In the covering box constructor move
+ the closed bound checks to come before the empty test.
+
+2005-10-27 Thursday 12:31 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.53): Add the open bound behaviour to the
+ description of the covering box constructor.
+
+2005-10-27 Thursday 12:04 Matthew Mundell
+
+ * tests/Grid/boundingbox1.cc (grids.5): Add test11, in which a
+ bound in the box is open.
+
+2005-10-27 Thursday 12:03 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.27): In the covering box constructor
+ throw an exception if any bound is open.
+
+2005-10-26 Wednesday 17:47 Matthew Mundell
+
+ * src/Grid.defs.hh, src/Grid.inlines.hh,
+ tests/Grid/boundingbox1.cc, tests/Grid/coveringbox1.cc
+ (grids.[52,26,4,6]): Use From_Covering_Box instead of
+ From_Bounding_Box in the Grid from box constructor.
+
+2005-10-26 Wednesday 17:44 Matthew Mundell
+
+ * src/globals.defs.hh (grids.4): Add tag class From_Covering_Box.
+
+2005-10-26 Wednesday 16:21 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.51): Improve the covering box constructor
+ description. Add the methods required of the box class to the
+ get_covering_box description.
+
+2005-10-26 Wednesday 15:23 Matthew Mundell
+
+ * src/Grid_public.cc (grids.69): In OK, assert that the reduced
+ temporary generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 15:22 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.20): In the generator system minimize
+ method assert that, after being reduced, the generator system
+ defines a grid that contains points, instead of catering for an
+ empty resulting grid. Take out the Linear_Row.defs.hh include.
+ Correct the title comment.
+
+2005-10-26 Wednesday 15:19 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.25): In get_covering_box assert that,
+ after being reduced, the generator system defines a grid that
+ contains points, instead of catering for an empty resulting grid.
+
+2005-10-26 Wednesday 15:14 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.5): Simplify the
+ Grid_Certificate(cgr) assertion that after being reduced the
+ generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 12:48 Matthew Mundell
+
+ * tests/Grid/boundingbox1.cc (grids.3): Add test10, where the box
+ has a dimension open only from below.
+
+2005-10-26 Wednesday 12:47 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.50): Improve the descriptions of the box
+ constructor and method get_covering_box.
+
+2005-10-26 Wednesday 12:46 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.24): In the Grid covering box
+ constructor add an equality for each interval that is bounded
+ only from below.
+
+2005-10-26 Wednesday 11:38 Matthew Mundell
+
+ * tests/Grid/coveringbox1.cc (grids.5): Use Bounding_Box instead of
+ BBox. Add a temporary Bounding_Box operator==. Rename box to
+ box1. In every test add a further check which uses the Grid
+ covering box constructor. Always use closed bounds.
+
+2005-10-26 Wednesday 11:33 Matthew Mundell
+
+ * tests/Grid/boundingbox1.cc (grids.2): Match the expected values
+ to the updated behaviour of the covering box constructor.
+
+2005-10-26 Wednesday 11:32 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.23): Update the covering box
+ constructor to handle universe, empty and half open intervals in
+ ways that match the behaviour of get_covering_box. Always use
+ closed bounds.
+
+2005-10-25 Tuesday 17:23 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.49): In the get_covering_box description
+ note that the lower bounds are as close as possible to the
+ origin, and add information about the calling guarantees.
+
+2005-10-25 Tuesday 14:33 Matthew Mundell
+
+ * tests/Grid/coveringbox1.cc (grids.4): Add test12, in which all
+ the points have the same value in one of the dimensions. Update
+ the expected values in test2 so that the lower bounds are as
+ close as possible to the origin. Add the dimension in the test11
+ description.
+
+2005-10-25 Tuesday 14:21 Matthew Mundell
+
+ * configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Grid_conversion.cc, src/Grid_minimize.cc,
+ src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+ (grids.[7,5,7,3,3,21,19,34,32,6,3]): Revert files accidentally
+ included in last change.
+
+2005-10-25 Tuesday 13:53 Matthew Mundell
+
+ * configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh, src/Grid.inlines.hh,
+ src/Grid_conversion.cc, src/Grid_minimize.cc,
+ src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+ tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+ (grids.[6,4,6,2,2,22,20,18,33,31,5,2]): In get_covering_box
+ rename gcds to interval_sizes and update the algorithm to always
+ use the smallest possible absolute values for the lower bounds.
+
+2005-10-25 Tuesday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.71): Forgot to close namespace.
+
+2005-10-25 Tuesday 10:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.37), BD_Shape.inlines.hh (1.70): Added
+ a new function extract_bounded_difference() to factorize repeated
+ code for decoding a constraint. A lot of repeated code also
+ factorized in method relation_with(). Added a private method
+ BD_Shape<T>::get_limiting_constraints() to be used in the
+ implementations of limited widening operators. Prefer assign()
+ to the direct assignment operator when assigning zero. Removed a
+ couple of improper usages of the Coefficient_traits template.
+
+2005-10-24 Monday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affinedimension1.cc (grids.1): file
+ affinedimension1.cc was added on branch grids on 2005-11-23
+ 13:24:07 +0000
+
+2005-10-24 Monday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.36), src/BD_Shape.inlines.hh (1.69),
+ tests/BD_Shape/Makefile.am (1.18),
+ tests/BD_Shape/affinedimension1.cc (1.1): Added a first
+ implementation of new method dimension_type
+ BD_Shape<T>::affine_dimension() const. The new program
+ affinedimension1.cc containts some tests for it. (Joint work
+ with Elena Mazzi.)
+
+2005-10-24 Monday 14:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.35), BD_Shape.inlines.hh (1.68),
+ DB_Matrix.defs.hh (1.6), DB_Matrix.inlines.hh (1.6),
+ DB_Row.inlines.hh (1.8), checked.defs.hh (1.25): Removed a lot of
+ commented out stuff from DB_Row.inlines.hh. When creating DB_Row
+ and DB_Matrix objects, the coefficients are now initialized to
+ the value PLUS_INFINITY. DB_Matrix no longer has unused (and
+ unimplemented) methods space_dimensions() and
+ add_rows_and_columns(). BD_Shape no longer needs the method
+ init(). In the BD_Shape implementation, added a couple of
+ utility function that help in factoring common code. In methods
+ adding space dimensions, take into accoount that the newly added
+ coefficients are already initialized to PLUS_INFINITY. Added a
+ lot of missing const qualifications. The
+ shortest_path_reduction_assign() method has been almost
+ reimplemented from scratch: it should now be easier to move
+ towards an implementation where shortest-path closure is not
+ compromised by reduction. Several comments improved.
+
+2005-10-24 Monday 14:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/DB_Row.defs.hh (1.10): Some comments reworded. An unused
+ preprocessor variable removed.
+
+2005-10-24 Monday 14:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.140), src/Constraint_System.defs.hh
+ (1.17), src/globals.types.hh (1.2), src/simplex.cc (1.28),
+ tests/Polyhedron/primalsimplex1.cc (1.2),
+ tests/Polyhedron/primalsimplex2.cc (1.2): Using a new enumerated
+ type Optimization_Kind to specify whether the primal simplex
+ algorithm should maximize or minimize the object function.
+
+2005-10-24 Monday 12:39 Matthew Mundell
+
+ * configure.ac (1.195): Set text_md5sum, to complete last change.
+
+2005-10-24 Monday 11:30 Matthew Mundell
+
+ * configure.ac (1.194): Take out the attempt at checking for an
+ md5sum -t option.
+
+2005-10-22 Saturday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_sicstus_prolog.m4 (grids.1): file
+ ac_check_sicstus_prolog.m4 was added on branch grids on
+ 2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_xsb_prolog.m4 (grids.1): file ac_check_xsb_prolog.m4
+ was added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.193), interfaces/Prolog/SICStus/Makefile.am
+ (1.57), interfaces/Prolog/SWI/Makefile.am (1.54),
+ interfaces/Prolog/XSB/Makefile.am (1.37),
+ m4/ac_check_sicstus_prolog.m4 (1.3), m4/ac_check_swi_prolog.m4
+ (1.6), m4/ac_check_xsb_prolog.m4 (1.1): Treat SICStus, SWI and
+ XSB Prolog in a uniform way.
+
+2005-10-22 Saturday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.163): Added blank lines to help readability.
+
+2005-10-22 Saturday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_sicstus_prolog.m4 (1.2): Make sure things work even
+ if `sicstus' is a symbolic link.
+
+2005-10-21 Friday 21:27 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, coveringbox1.cc (grids.[36,1]): Add
+ coveringbox1, which tests get_covering_box.
+
+2005-10-21 Friday 21:25 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.4): Finalise calculation of number
+ of congruences from number of generators.
+
+2005-10-21 Friday 21:25 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[48,21]): Add template
+ get_covering_box.
+
+2005-10-21 Friday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.192), interfaces/Prolog/SICStus/Makefile.am
+ (1.56), m4/ac_check_sicstus_prolog.m4 (1.1): New machinery to
+ automatically detect the location where SICStus Prolog was
+ installed. Now, the only requirement imposed on the user is to
+ have `sicstus' reachable from the shell's PATH.
+
+2005-10-21 Friday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.191): Version number bumped.
+
+2005-10-21 Friday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.5): Comment fixed.
+
+2005-10-21 Friday 14:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.24): Added a couple of missing
+ declarations of template specializations, that were causing an
+ error to be reported by the Intel compiler.
+
+2005-10-20 Thursday 11:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.34): The Doxygen documentation is now
+ (almost) formatted according to STANDARDS.
+
+2005-10-20 Thursday 10:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BDS_Status.idefs.hh (1.8), src/BDS_Status.inlines.hh (1.6),
+ src/BD_Shape.defs.hh (1.33), src/BD_Shape.inlines.hh (1.67),
+ tests/BD_Shape/ascii_dump_load2.cc (1.5): Started cleaning up the
+ code for BD_Shape<T>. The entailment clsoure method ofr BDSs is
+ shortest-path closure (transitive closure is another thing):
+ method names and status flags changed accordingly. Now avoiding
+ the (almost) useless initialization of BDS in the constructor
+ BD_Shape(const Generator_System& gs); Source code in file
+ BD_Shape.inlines.hh reordered so that all inline
+ methods/functions come before the non-inline method/function
+ templates.
+
+2005-10-20 Thursday 10:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/boundingbox1.cc (1.6): Added another test for
+ shrinking a bounding box in polynomial time when there are
+ redundant constraints.
+
+2005-10-19 Wednesday 17:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.139), ppl_c.h.in (1.54): Public method
+ Constraint_System::has_strict_inequalities() is now accessible
+ even from the C interface.
+
+2005-10-19 Wednesday 16:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.162): Method Constraint_System::has_strict_inequalities()
+ is now public.
+
+2005-10-19 Wednesday 16:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.27): The primal_simplex() is now also
+ applicable to an NNC constraint system containing no strict
+ inequality constraints.
+
+2005-10-19 Wednesday 16:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh (1.16): Method
+ has_strict_inequalities() is no longer private.
+
+2005-10-19 Wednesday 16:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.32): Prefer qualified access
+ to class template member data and functions. Removed a wrong
+ const qualification is concatenate_assign().
+
+2005-10-19 Wednesday 12:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.13): Added a missing const qualifier.
+
+2005-10-18 Tuesday 23:32 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.12): Include cstdlib.
+
+2005-10-18 Tuesday 23:28 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.11): Add a test where the
+ parsing fails and whitespace follows the parsed number.
+
+2005-10-18 Tuesday 23:12 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.10): Check for expected
+ spaces in residuals. Always exit with 1 on error.
+
+2005-10-18 Tuesday 20:19 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.9): Add three tests with
+ trailing whitespace.
+
+2005-10-17 Monday 09:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.59), devref.doxyconf-latex.in
+ (1.3), user.doxyconf-html.in (1.31), user.doxyconf-latex.in
+ (1.3): In the devref manuals, also produce documentation for
+ Scalar_Products.
+
+2005-10-17 Monday 09:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.126): Do not forget Scalar_Products.types.hh.
+
+2005-10-16 Sunday 17:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.109), Constraint_System.cc (1.12),
+ Generator.defs.hh (1.111), Generator_System.cc (1.13),
+ Linear_Expression.defs.hh (1.13), Linear_System.cc (1.30),
+ Makefile.am (1.125), Polyhedron_nonpublic.cc (1.56),
+ Polyhedron_public.cc (1.67), Polyhedron_widenings.cc (1.51),
+ Scalar_Products.cc (1.1), Scalar_Products.defs.hh (1.1),
+ Scalar_Products.inlines.hh (1.1), Scalar_Products.types.hh (1.1),
+ conversion.cc (1.75), scalar_products.cc (1.3),
+ scalar_products.defs.hh (1.5), scalar_products.inlines.hh (1.6),
+ scalar_products.types.hh (1.2): Files "scalar_products.*" renamed
+ as "Scalar_Products.*".
+
+2005-10-16 Sunday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.defs.hh (grids.1): file
+ Scalar_Products.defs.hh was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-10-16 Sunday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.inlines.hh (grids.1): file
+ Scalar_Products.inlines.hh was added on branch grids on
+ 2005-11-23 13:24:06 +0000
+
+2005-10-16 Sunday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Scalar_Products.types.hh (grids.1): file
+ Scalar_Products.types.hh was added on branch grids on 2005-11-23
+ 13:24:06 +0000
+
+2005-10-15 Saturday 15:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.161): Provide better visual separation for "displayed"
+ material.
+
+2005-10-15 Saturday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.160): Ellipsis has a well-defined meaning in C++: avoid
+ using it to signify "parameters omitted".
+
+2005-10-15 Saturday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.20): Updated.
+
+2005-10-15 Saturday 09:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh (1.15),
+ Constraint_System.inlines.hh (1.6), Generator_System.defs.hh
+ (1.10), Generator_System.inlines.hh (1.5): Classes
+ Constraint_System and Generator_System now have a private method
+ simplify() that calls the new method of class Linear_System. In
+ the case of generators, the wrapper method also removes any
+ invalid rays or lines that may have been generated.
+
+2005-10-15 Saturday 09:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.inlines.hh (1.57), Generator_System.cc (1.12): Do
+ exploit new method Generator::is_line_or_ray().
+
+2005-10-15 Saturday 09:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.37): Corrected a dependency bug:
+ test nnc_boudningbox5 was compiling source file boundingbox3.cc.
+
+2005-10-14 Friday 19:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.29), Linear_System.defs.hh (1.18),
+ Polyhedron.inlines.hh (1.124), Polyhedron_public.cc (1.66),
+ simplify.cc (1.44): Linear_System methods gauss() and
+ back_substitute() modified so as to assert all the known
+ preconditions. Method gauss() also modified so as to receive as
+ input the number of lines/equalities on which it should be
+ applied. Added a new method Linear_System::simplify() that takes
+ care of appropriately combine the two methods above when needed,
+ so as to ensure that all preconditions are met. The new method is
+ now used in the implementation of
+ Polyhedron::shrink_bounding_box() and Polyhedron::OK().
+
+2005-10-14 Friday 13:09 Matthew Mundell
+
+ * src/checked.cc (1.9): Comment every function. Slightly improve
+ the formatting in parse_number and input_mpq.
+
+ In parse_number1
+
+ - move the error handling to the first error occurrence (this
+ ensures
+ that variables are always initialised at the destinations of
+ the
+ error jumps)
+
+ - capatilise the second 'n' in the "inf" check
+
+ - make the '+' case when parsing strings like "+inf" fall
+ through to
+ the "inf" parsing, instead of jumping to it
+
+ - after the initial sign-and-symbol-parsing switch statement,
+ split
+ the validity check on the current character into two checks,
+ one of
+ which is already present
+
+ - use only variable c when parsing a leading "0x", instead of
+ using a
+ second variable (d)
+
+ - convert the parsing state machine into a series of loops, to
+ save
+ the state interpretation overhead and to lower the number of
+ jumps
+ and the size of the code
+
+ - manually inline the small relevant portion of get_digit at the
+ digit validity checks which call get_digit with a base of ten.
+
+2005-10-14 Friday 11:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.65): Prefer "unsatisfiable" to
+ "insoluble".
+
+2005-10-14 Friday 09:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/scalar_products.types.hh (1.1): Put under CVS control.
+
+2005-10-13 Thursday 10:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.108), Constraint_System.cc (1.11),
+ Generator.defs.hh (1.110), Generator.inlines.hh (1.56),
+ Generator_System.cc (1.11), Generator_System.defs.hh (1.9),
+ Linear_Expression.defs.hh (1.12), Linear_System.cc (1.28),
+ Polyhedron_chdims.cc (1.34), Polyhedron_nonpublic.cc (1.55),
+ Polyhedron_public.cc (1.64), Polyhedron_widenings.cc (1.50),
+ conversion.cc (1.74), scalar_products.cc (1.2),
+ scalar_products.defs.hh (1.4), scalar_products.inlines.hh (1.5):
+ Added class Scalar_Products gathering all scalar product
+ functions defined so far. Also added class
+ Topology_Adjusted_Scalar_Product_Sign, implementing a function
+ object choosing the correct scalar product function for the given
+ context. Using these classes to simplify friend declarations and
+ to allow for the removal of some friend declarations. In
+ particular: - Constraint_System is no longer a friend of
+ Generator; - Generator_System is no longer a friend of
+ Constraint. Also added a few missing const qualifications to
+ local variables.
+
+2005-10-12 Wednesday 17:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.159), TODO (1.157): Updated for the with_token changes to
+ the Prolog interface.
+
+2005-10-12 Wednesday 17:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.134): Documentation for
+ the Prolog widening/extrapolation "with_tokens" predicates
+ revised to match the changes to the actual implementation.
+ General improvements to the descriptions of all the Prolog
+ widening/extrapolation predicates.
+
+2005-10-11 Tuesday 12:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.163), Ciao/ciao_pl_check.pl
+ (1.14), Ciao/ppl_ciao.pl (1.82), GNU/ppl_gprolog.pl (1.54),
+ SICStus/ppl_sicstus_sd.cc (1.80), SWI/ppl_swiprolog.cc (1.104),
+ XSB/ppl_xsb.H (1.42), XSB/ppl_xsb.cc (1.71), XSB/xsb_pl_check.P
+ (1.19), YAP/ppl_yap.cc (1.98), tests/pl_check.pl (1.12): Modified
+ the "with_token" widening and extrapolation predicates to be
+ "with_tokens" where each predicate has an extra argument (ie
+ there are two arguments for the token numbers).
+
+ All predicates require the number of available tokens as input in
+ the first token argument and unify the second of the token
+ arguments with the number of tokens available after the
+ widening/extrapolation operation.
+
+ pl_check.pl now tests the modified predicates and their possible
+ exceptions.
+
+2005-10-11 Tuesday 12:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.9): Help message now says something about
+ the available options.
+
+2005-10-11 Tuesday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, STANDARDS, TODO, config.guess, configure.ac,
+ Watchdog/config.guess, Watchdog/src/Makefile.am,
+ Watchdog/src/Makefile.in, Watchdog/utils/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/Makefile.am, doc/README.doc,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/devref.doxyconf-latex.in, doc/devref.tex,
+ doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ doc/user.doxyconf-latex.in, doc/user.tex,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.types.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/Linear_System.cc,
+ src/Makefile.am, src/Native_Integer.defs.hh,
+ src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.cc,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_public.cc, src/checked_float.inlines.hh,
+ src/minimize.cc, src/simplex.cc,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/bgp99extrapolation1.cc,
+ tests/BD_Shape/bhz03widening1.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/numberinput1.cc,
+ tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+ tests/Polyhedron/primalsimplex2.cc, utils/Makefile.am
+ (grids.[4,5,4,3,5,3,2,2,3,4,4,3,2,4,4,4,1,1,3,3,3,1,1,4,2,3,5,5,5,5,4,6,6,2,4,8,3,2,4,9,4,5,2,5,6,4,6,6,2,4,2,5,1,1,9,2,2,1,1,3]):
+ Fifth merge from main trunk.
+
+2005-10-11 Tuesday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.H (1.41): Reflect the
+ reorganization of the Watchdog directory.
+
+2005-10-10 Monday 17:11 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.8): Add two hexadecimal tests
+ where parsing will stop after the "0x". Use valid digits in the
+ exponent of "3^^e3" (i.e. use "3^^e2").
+
+2005-10-09 Sunday 08:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.97): Comparisons with
+ LONG_MAX fixed.
+
+2005-10-08 Saturday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.26): Avoid requesting the inlining of complex
+ functions.
+
+2005-10-08 Saturday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.96): YAP should now support
+ unlimited precision integers. Some FIXMEs dealt with, but had to
+ add one because of what looks like a bug in YAP.
+
+2005-10-08 Saturday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.63): Use
+ Constraint::inhomogeneous_term() instead of c[0] when
+ appropriate. Moved a useful comment outside assertion-like code,
+ because the comment is relevant even when assertions are
+ disabled. When invoking scalar_product_sign(), the first
+ argument should be the constraint and the second the generator
+ (not the other way round). Several occurrences of if
+ (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) {
+ replaced by the shorter (and as efficient as) if
+ (expr.coefficient(var) != 0) { One use of
+ Coefficient_traits::const_reference inside a function body
+ definition replaced by const Cefficient&.
+
+2005-10-08 Saturday 09:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.cc (1.4), Polyhedra_Powerset.inlines.hh
+ (1.31), checked_float.inlines.hh (1.45): Comments revised. Refer
+ to GCC's Bugzilla when talking about GCC bugs. GCC (the GNU
+ Compiler Collection) is written with all capitals.
+
+2005-10-08 Saturday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.23): To work around a bug in
+ GCC 3.3.3, we temporarily make all Polyhedra_Powerset's friends
+ of each other.
+
+2005-10-08 Saturday 07:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.25): Stop being noisy.
+
+2005-10-07 Friday 22:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.27): FIXME resolved.
+
+2005-10-07 Friday 18:43 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.7): Update temporary
+ comments. Increase stack space if large exponents are being
+ used. Add directive TEST_LARGE_EXPONENTS, which controls the
+ inclusion of tests with large exponents.
+
+2005-10-07 Friday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.cc (1.3), Polyhedra_Powerset.inlines.hh
+ (1.30): Applied workaround to a gcc bug affecting version 3.3.3.
+ See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+
+2005-10-06 Thursday 18:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.19): In the first line comment,
+ mentioned that the simplex solver can be used too.
+
+2005-10-06 Thursday 18:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.46): Too long line has been split.
+
+2005-10-06 Thursday 18:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.53): The Linear Programming demo is
+ now in demos/ppl_lpsol/.
+
+2005-10-06 Thursday 17:59 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.6): Improve formatting and
+ messages slightly. Take out the "fix" macro. Group tests into
+ functions. Add tests which expect characters trailing the
+ number. Add a test of the exponent size limit. Revise temporary
+ comments.
+
+2005-10-06 Thursday 12:26 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.5): Take out tracing function
+ dump_mpz_ptr. Only print output on error.
+
+2005-10-06 Thursday 12:21 Matthew Mundell
+
+ * src/checked_int.inlines.hh (1.39): Clip trailing spaces.
+
+2005-10-06 Thursday 11:56 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.25): In satisfies_all_congruences
+ multiply the modulus by the divisor when the divisor is greater
+ than 1 (was 0).
+
+2005-10-06 Thursday 11:55 Matthew Mundell
+
+ * src/GMP_Integer.defs.hh (grids.5): Take `inline' out of gcdext
+ declarations.
+
+2005-10-06 Thursday 11:54 Matthew Mundell
+
+ * src/checked.inlines.hh (grids.7): In gcdext_generic do the s and
+ t negation only once when the given x and y are negative.
+
+2005-10-06 Thursday 11:50 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.35): Add FAIL_TEST directives for
+ the checked types.
+
+2005-10-04 Tuesday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.24): Do not use conditional expressions with
+ expressions of different type.
+
+2005-10-04 Tuesday 22:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.29):
+ Polyhedra_Powerset<PH>::concatenate_assign() was still buggy.
+
+2005-10-04 Tuesday 20:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.28): Fixed a bug
+ Polyhedra_Powerset<PH>::concatenate_assign() whereby a temporary
+ Polyhedra_Powerset object was created with the wrong dimension.
+
+2005-10-04 Tuesday 20:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.6): New test simplified (it
+ could not reproduce the time-dependent bug it was supposed to
+ reproduce).
+
+2005-10-04 Tuesday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.5): Added a new test that
+ exposes a bug in Polyhedra_Powerset<PH>::concatenate_assign().
+
+2005-10-04 Tuesday 15:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.156): A PPL distribution is compilable on environments
+ lacking Perl.
+
+2005-10-04 Tuesday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.155), src/GMP_Integer.defs.hh (1.11), src/simplex.cc
+ (1.23): Added macro PPL_NOISY_SIMPLEX to enable a limited amount
+ of debugging output when executing the primal simplex. The
+ documentation of function is_in_base() improved. Function
+ compute_generator() also simplified.
+
+2005-10-04 Tuesday 14:45 Matthew Mundell
+
+ * src/minimize.cc (1.42): Indent note consistently.
+
+2005-10-04 Tuesday 14:35 Matthew Mundell
+
+ * src/Polyhedron_public.cc (1.62): Take out two redundant `else'
+ and a redundant `if'. Correct some comments (mostly typos).
+ Clip a trailing space. Take out a \relates comment on a
+ Polyhedron method.
+
+2005-10-04 Tuesday 13:20 Matthew Mundell
+
+ * src/Polyhedron_chdims.cc (1.33): Correct and update some comments
+ (mostly grammar). Add a space after two primitive calls in
+ expand_space_dimension.
+
+2005-10-04 Tuesday 12:58 Matthew Mundell
+
+ * src/: Native_Integer.defs.hh (1.13), Native_Integer.inlines.hh
+ (1.14): Add template assign(Native_Integer<To>&, const
+ mpz_class&, Rounding_Dir).
+
+2005-10-04 Tuesday 12:57 Matthew Mundell
+
+ * tests/Random_Number_Generator.inlines.hh (1.3): Revert to using
+ assign in method get.
+
+2005-10-04 Tuesday 12:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.44): Point 3 of Section 6.7.3
+ [Type qualifiers] of the C99 standard says that "The properties
+ associated with qualified types [const, restrict, volatile] are
+ meaningful only for expressions that are lvalues." Point 8 of
+ Section 7.1.5.1 [The cv qualifiers] of the C++98 standard says
+ that "In general, the semantics of volatile are intended to be
+ the same in C++ as they are in C." Since functions can only
+ return rvalues, and since C++98 and C99 are (believed to be)
+ converging, the type qualifier "volatile" on return type has been
+ removed. FIXME resolved.
+
+2005-10-03 Monday 23:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.22): Stupid bug recently introduced is now
+ corrected.
+
+2005-10-03 Monday 18:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.190): Revised the URI for the Perl directory at
+ perl.org.
+
+2005-10-03 Monday 18:11 Matthew Mundell
+
+ * tests/Random_Number_Generator.inlines.hh (1.2): In method get
+ "use" parameter info, and assign the generated number with
+ operator= (via a temporary) instead of with method assign (as
+ operator= is present in Native_Integer).
+
+2005-10-03 Monday 14:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/bgp99extrapolation1.cc (1.1): Put under CVS
+ control.
+
+2005-10-03 Monday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.17), bhz03widening1.cc (1.1):
+ Added a new test for the first implementation of a
+ certificate-based widening on a powerset of BD_Shape's.
+
+2005-10-03 Monday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.32), BD_Shape.inlines.hh (1.66): Added
+ methods difference_assign() and strictly_contains(), that are
+ required when instantiating Polyhedra_Powerset<BD_Shape> and
+ using the BHZ03 widening. Widening methods now have a dummy
+ token argument (not used yet). Removed unreasonable inline
+ directives from too complex class template member
+ implementations.
+
+2005-10-03 Monday 12:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: H79_Certificate.defs.hh (1.12), H79_Certificate.inlines.hh
+ (1.6): Added constructor template and comparison member template,
+ so as to provide a dummy (but working) certificate implementation
+ for all classes PH providing method PH::constraints() (e.g.,
+ BD_Shape).
+
+2005-10-02 Sunday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.65): Added a missing const qualifier
+ and revised a comment in BD_Shape<T>::init().
+
+2005-10-02 Sunday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/Makefile.am (1.3), src/Makefile.am (1.124):
+ Definition of BUILT_SOURCES revised.
+
+2005-10-02 Sunday 12:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.189): Version number bumped.
+
+2005-10-02 Sunday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.33), Watchdog/config.guess (1.17): Updated.
+
+2005-10-02 Sunday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.37), devref.doxyconf-html.in (1.58),
+ devref.doxyconf-latex.in (1.2), devref.tex (1.18),
+ user.doxyconf-html.in (1.30), user.doxyconf-latex.in (1.2),
+ user.tex (1.19): We now generate PostScript from PDF.
+
+2005-10-02 Sunday 08:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/powerset1.cc (1.2): Added Fcaibvp::OK().
+
+2005-10-01 Saturday 15:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.24): Added a section describing source file naming
+ and structuring conventions. Another section has to do with
+ macros.
+
+2005-10-01 Saturday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.36), powerset1.cc (1.1): New
+ (incomplete) test program to test the Powerset class.
+
+2005-10-01 Saturday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.188), doc/Makefile.am (1.36), doc/README.doc
+ (1.6), doc/devref-browse.doxyconf-latex.in (1.57),
+ doc/devref-print.doxyconf-latex.in (1.57),
+ doc/devref.doxyconf-html.in (1.57), doc/devref.doxyconf-latex.in
+ (1.1), doc/user-browse.doxyconf-latex.in (1.27),
+ doc/user-print.doxyconf-latex.in (1.27),
+ doc/user.doxyconf-html.in (1.29), doc/user.doxyconf-latex.in
+ (1.1): No longer produce "browse" and "print" version, since the
+ "browse" version is equally good for printing. Construction of
+ the documentation much simplified. Doxygen configuration files
+ updates.
+
+2005-09-30 Friday 23:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.34): Header file instchk.hh listed in
+ dist_noinst_HEADERS.
+
+2005-09-30 Friday 21:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.21): No longer using (and thus eliminated)
+ functions insert_row_in_matrix(), add_element_to_row(),
+ copy_column(). Function check_optimality() renamed as
+ get_entering_index(), its signature restructured and its
+ implementation made a little bit more efficient. Function
+ choose_out_var() renamed as get_exiting_index(), its signature
+ restructured and its implementation heavily changed to
+ (hopefully) made it more efficient. Function compute_simplex()
+ changed accordingly. Function compute_tableau() further
+ simplified by removing a lot of (not really necessary)
+ bookkeeping. Local variables renamed for improved readability.
+
+2005-09-30 Friday 09:16 David Merchat
+
+ * src/GMP_Integer.types.hh (1.9): We use doxygen command
+ ``\relates'' to put all informations about GMP_Integer at the
+ same place. Since \relates must refer to a class and GMP_Integer
+ is not a class but a type we obtain a warning for all ``\relates
+ GMP_Integer'' To eliminate those warnings we add a doxygen
+ comment ``\class GMP_Integer'' just before declaration of type
+ GMP_Integer
+
+2005-09-29 Thursday 18:03 Matthew Mundell
+
+ * src/: checked.inlines.hh, checked_float.inlines.hh,
+ checked_int.inlines.hh (grids.[6,5,5]): Rename gcdext_generic to
+ gcdext_exact.
+
+2005-09-29 Thursday 18:02 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+ scalar_products.cc, scalar_products.defs.hh,
+ scalar_products.inlines.hh (grids.[12,21,16,2,2,2]): Move scalar
+ product functions into scalar_products.*.
+
+2005-09-29 Thursday 17:00 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.4): Improve the call to
+ function input in function test. Update temporary comments. Add
+ a test with a much larger integer.
+
+2005-09-29 Thursday 11:24 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.3): Convert test_template to
+ function test, which uses an mpq_class checked number. In
+ function test read number with function input (instead of op>>),
+ compare the result of the conversion with an expected result, and
+ use is_not_a_number instead of classify.
+
+ Narrow long test invocations. Add an expected result value to
+ each invocation.
+
+2005-09-28 Wednesday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.154), configure.ac (1.187), Watchdog/src/Makefile.am
+ (1.2), src/Makefile.am (1.123): A PPL distribution should now be
+ compilable even on environments lacking Perl.
+
+2005-09-28 Wednesday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/src/: .cvsignore, Doubly_Linked_Object.defs.hh,
+ Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+ EList.defs.hh, EList.inlines.hh, EList.types.hh,
+ EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+ EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+ Handler.types.hh, Makefile.am, Makefile.in, Pending_Element.cc,
+ Pending_Element.defs.hh, Pending_Element.inlines.hh,
+ Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+ Pending_List.inlines.hh, Pending_List.types.hh, Time.cc,
+ Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+ Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+ pwl_header.hh
+ (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Files moved as in the main trunk.
+
+2005-09-28 Wednesday 21:04 Matthew Mundell
+
+ * CREDITS, ChangeLog, Makefile.am, NEWS, STANDARDS, TODO,
+ configure.ac, instchk.hh, Watchdog/.cvsignore,
+ Watchdog/ChangeLog, Watchdog/Doubly_Linked_Object.defs.hh,
+ Watchdog/Doubly_Linked_Object.inlines.hh,
+ Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+ Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+ Watchdog/EList_Iterator.defs.hh,
+ Watchdog/EList_Iterator.inlines.hh,
+ Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+ Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+ Watchdog/Makefile.am, Watchdog/Pending_Element.cc,
+ Watchdog/Pending_Element.defs.hh,
+ Watchdog/Pending_Element.inlines.hh,
+ Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+ Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+ Watchdog/Pending_List.types.hh, Watchdog/Time.cc,
+ Watchdog/Time.defs.hh, Watchdog/Time.inlines.hh,
+ Watchdog/Time.types.hh, Watchdog/Watchdog.cc,
+ Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+ Watchdog/Watchdog.types.hh, Watchdog/configure.ac,
+ Watchdog/pwl_header.hh, Watchdog/utils/Makefile.am,
+ Watchdog/utils/build_header, Watchdog/utils/build_header.in,
+ demos/ppl_lcdd/ppl_lcdd.cc, doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ interfaces/C/ppl_c.cc, interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected3_int16,
+ interfaces/Prolog/XSB/expected3_int16_a,
+ interfaces/Prolog/XSB/expected3_int32,
+ interfaces/Prolog/XSB/expected3_int8,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/pl_check.pl, m4/ac_check_swi_prolog.m4,
+ src/Ask_Tell.defs.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+ src/Bounding_Box.inlines.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+ src/Coefficient.types.hh, src/Constraint.defs.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/DB_Row.defs.hh,
+ src/Determinate.defs.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+ src/Generator.defs.hh, src/Generator_System.cc,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+ src/Matrix.cc, src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+ src/Native_Integer.inlines.hh, src/Native_Integer.types.hh,
+ src/Polyhedra_Powerset.cc, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Row.cc, src/Row.defs.hh,
+ src/Saturation_Matrix.cc, src/Saturation_Row.cc,
+ src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+ src/Variable.defs.hh, src/algorithms.hh, src/checked.cc,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/conversion.cc, src/globals.defs.hh, src/globals.inlines.hh,
+ src/globals.types.hh, src/mp_numeric_limits.hh,
+ src/scalar_products.cc, src/scalar_products.defs.hh,
+ src/scalar_products.inlines.hh, src/simplex.cc,
+ tests/Makefile.am, tests/Random_Number_Generator.defs.hh,
+ tests/Random_Number_Generator.inlines.hh,
+ tests/Random_Number_Generator.types.hh, tests/ppl_test.hh,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/geomcovers1.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening6.cc,
+ tests/Polyhedron/exceptions1.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/gramschmidt1.cc,
+ tests/Polyhedron/gramshmidt1.cc,
+ tests/Polyhedron/linearsystem1.cc, tests/Polyhedron/matrix1.cc,
+ tests/Polyhedron/numberinput1.cc, utils/Makefile.am,
+ utils/build_header, utils/build_header.in, utils/text2cxxarray,
+ utils/text2cxxarray.in
+ (grids.[1,1,3,3,4,3,4,1,1,1,2,2,1,2,2,1,2,2,1,3,3,1,2,2,2,2,1,2,2,2,1,2,2,3,1,2,2,2,1,2,2,2,2,1,3,3,3,3,2,2,2,4,2,3,4,2,3,2,3,2,5,2,3,1,1,1,1,2,3,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,3,2,4,4,1,1,5,2,3,2,3,3,4,3,1,7,13,2,2,3,5,5,5,4,3,2,8,3,2,3,4,1,1,4,5,7,5,3,5,5,3,2,5,2,2,2,2,2,3,3,4,5,4,4,4,3,4,3,2,3,3,1,1,1,1,1,3,3,1,1,1,12,4,1,2,8,2,2,2,2,2,2,2,2,1,2,1,1,1,2,2,1,2,1]):
+ Fourth merge from the main trunk.
+
+2005-09-28 Wednesday 19:37 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.34), Checked_Number.inlines.hh
+ (1.39): Added input and output functions
+
+2005-09-28 Wednesday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/utils/Makefile.am (1.4), utils/Makefile.am (1.10): Make
+ sure the scripts in the `utils' subdirectory are made also at
+ distribution time, even if they are not distributed themselves.
+
+2005-09-28 Wednesday 17:57 Matthew Mundell
+
+ * tests/Polyhedron/numberinput1.cc (1.2): In test_template add
+ checks, including residual checks, and improve the comparison
+ with the expected value. Add expected residuals to all tests.
+
+2005-09-28 Wednesday 16:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.52), Constraint.defs.hh (1.107),
+ Generator.cc (1.65), Generator.defs.hh (1.109): According to
+ Doxygen manual, the \relates command should name a class, whereas
+ Constraint::Type and Generator::Type are just enums.
+
+2005-09-28 Wednesday 14:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.20): Function compute_tableau() now directly
+ detects trivially unbounded problems instead of leaving this
+ simple check to the caller. Function primal_simplex() corrected
+ so as to return the origin point of the right space dimension
+ when a trivial LP problem is given (fixing the bug uncovered by
+ test primalsimplex2).
+
+2005-09-28 Wednesday 14:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.35), primalsimplex2.cc (1.1):
+ New test shows a (space dimension mismatch) bug in the current
+ implementation of the simplex algorithm.
+
+2005-09-27 Tuesday 21:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.19): Simplified function
+ prepare_for_1st_ph_simplex(), avoiding useless copies and
+ factoring 2nd and 3rd Row& arguments into a single Matrix&
+ argument. Adding slack variables all in one shot, instead of one
+ at a time. Simplified function first_phase() by avoiding useless
+ matrix copies.
+
+2005-09-27 Tuesday 20:50 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.34), numberinput1.cc (1.1): Add
+ numberinput1, a start at testing number input.
+
+2005-09-27 Tuesday 20:43 Matthew Mundell
+
+ * src/checked.cc (1.8): Really revert to revision 1.4.
+
+2005-09-27 Tuesday 12:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.18): Removed a few useless inclusions
+ directives. Added many const modifiers to local variable
+ definitions. Function swap_base() now takes a Row& (rather than
+ a Matrix&) as its second argument. Avoid recomputing the same
+ value several times (using a reference instead). Added some
+ missing spaces for better readability. Function erase_slacks()
+ heavily rewritten so as to avoid a bunch of useless matrix
+ copies. Restructured the doxygen comments according to
+ STANDARDS. In primal_simplex(), use normalize2() instead of
+ reinventing the wheel.
+
+2005-09-27 Tuesday 12:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh (1.14): Minor formatting
+ improvement.
+
+2005-09-26 Monday 18:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.defs.hh (1.24): Removed a few useless inline
+ directives and const modifiers from function declarations.
+
+2005-09-26 Monday 18:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.defs.hh (1.17): Removed a useless inline
+ directive from a function declaration.
+
+2005-09-26 Monday 18:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh (1.10): Removed many useless inline
+ directives from function declarations.
+
+2005-09-26 Monday 18:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.inlines.hh (1.12): Added a const modifier to the
+ low_bits_mask() parameter.
+
+2005-09-26 Monday 16:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.17): Useless using declaration removed. A few
+ FIXME in the comments dealt with. Comments and code still deserve
+ a lot of work to match the PPL quality standards.
+
+2005-09-26 Monday 16:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.cc (1.2), Polyhedra_Powerset.defs.hh
+ (1.22), Polyhedra_Powerset.inlines.hh (1.27): Dealt with a couple
+ of FIXME's in the implementation by introducing a single FIXME in
+ the definition of the templatic class.
+
+2005-09-26 Monday 16:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.cc (1.9), H79_Certificate.cc (1.8): A
+ few FIXME's have been (properly) renamed into TODO's.
+
+2005-09-26 Monday 15:54 Matthew Mundell
+
+ * tests/Polyhedron/matrix1.cc (1.4): Correct spelling.
+
+2005-09-26 Monday 15:27 Matthew Mundell
+
+ * src/checked.defs.hh (1.24): Indent arguments to function
+ declaration macros consistently.
+
+2005-09-26 Monday 15:24 Matthew Mundell
+
+ * tests/Polyhedron/linsysasciidumpload1.cc (1.2): Moved to
+ linearsystem1.cc.
+
+2005-09-26 Monday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/matrix1.cc (1.3): Avoid unnecessary inclusions.
+
+2005-09-26 Monday 13:44 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.33), linearsystem1.cc (1.1):
+ Move linsysasciidumpload1 to linearsystem1. Match linearsystem1
+ to matrix1.
+
+2005-09-26 Monday 12:10 Matthew Mundell
+
+ * src/checked.cc (1.7): Revert to revision 1.4.
+
+2005-09-24 Saturday 22:28 Abramo Bagnara
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.35), tests/Makefile.am
+ (1.246), tests/ppl_test.hh (1.26), tests/Polyhedron/matrix1.cc
+ (1.2): Use new random number generator class.
+
+2005-09-24 Saturday 22:22 Abramo Bagnara
+
+ * tests/: Random_Number_Generator.defs.hh (1.1),
+ Random_Number_Generator.inlines.hh (1.1),
+ Random_Number_Generator.types.hh (1.1): Added random number
+ generator class.
+
+2005-09-24 Saturday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.6): Class
+ numeric_limits<Checked_Number<mp_class, Policy> now inherits from
+ numeric_limits<mp_class> and ovverrides what must be overridden.
+
+2005-09-24 Saturday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.122), mp_numeric_limits.hh (1.1): New file
+ mp_numeric_limits.hh contains specializations of
+ std::numeric_limits for multi-precision types. This will become
+ obsolete when GMP and MPFR will provide the specializations by
+ themselves.
+
+2005-09-24 Saturday 21:25 Abramo Bagnara
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.34),
+ GNU/ppl_gprolog_sd.cc (1.30), SICStus/ppl_sicstus_sd.cc (1.79),
+ SWI/ppl_swiprolog.cc (1.103), XSB/ppl_xsb.cc (1.70),
+ YAP/ppl_yap.cc (1.95): Include higher level file for Checked.
+
+2005-09-24 Saturday 18:10 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.45), interfaces/C/ppl_c.cc (1.138),
+ interfaces/Prolog/ppl_prolog.icc (1.162),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.33),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.29),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.78),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.102),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.69),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.94), src/BD_Shape.inlines.hh
+ (1.64), src/Bounding_Box.inlines.hh (1.9),
+ src/Checked_Number.defs.hh (1.33), src/Checked_Number.inlines.hh
+ (1.38), src/Polyhedron.inlines.hh (1.123),
+ src/Polyhedron_nonpublic.cc (1.54), src/checked.defs.hh (1.23),
+ src/checked.inlines.hh (1.25), src/checked_mpq.inlines.hh (1.23),
+ src/checked_mpz.inlines.hh (1.27): Allow Checked assign functors
+ to accept native types as To argument. Reordered memory_size
+ functors for Checked types.
+
+2005-09-24 Saturday 09:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.types.hh (1.7), Coefficient.types.hh (1.8):
+ Specializations of Coefficient_traits_template moved out from
+ Checked_Number.types.hh, since they do not belong there.
+
+2005-09-24 Saturday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_chdims.cc (1.32), Polyhedron_public.cc (1.61),
+ Polyhedron_widenings.cc (1.49): FIXMEs that do not involve
+ anything that can be considered broken have been retagged TODOs.
+
+2005-09-24 Saturday 08:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.32): Take into account the
+ restructuring of the PWL tree.
+
+2005-09-23 Friday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.46), GNU/Makefile.am
+ (1.49), SICStus/Makefile.am (1.55), SWI/Makefile.am (1.53),
+ XSB/Makefile.am (1.36), YAP/Makefile.am (1.40): Changed according
+ to the restructuring of the PWL source tree.
+
+2005-09-23 Friday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/.cvsignore (1.5): Updated.
+
+2005-09-23 Friday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Doubly_Linked_Object.defs.hh (1.4),
+ Doubly_Linked_Object.inlines.hh (1.4),
+ Doubly_Linked_Object.types.hh (1.3), EList.defs.hh (1.6),
+ EList.inlines.hh (1.5), EList.types.hh (1.3),
+ EList_Iterator.defs.hh (1.4), EList_Iterator.inlines.hh (1.5),
+ EList_Iterator.types.hh (1.3), Handler.defs.hh (1.6),
+ Handler.inlines.hh (1.5), Handler.types.hh (1.3), Makefile.am
+ (1.23), Pending_Element.cc (1.4), Pending_Element.defs.hh (1.4),
+ Pending_Element.inlines.hh (1.4), Pending_Element.types.hh (1.3),
+ Pending_List.cc (1.4), Pending_List.defs.hh (1.4),
+ Pending_List.inlines.hh (1.4), Pending_List.types.hh (1.3),
+ Time.cc (1.4), Time.defs.hh (1.4), Time.inlines.hh (1.5),
+ Time.types.hh (1.3), Watchdog.cc (1.21), Watchdog.defs.hh (1.17),
+ Watchdog.inlines.hh (1.14), Watchdog.types.hh (1.7), configure.ac
+ (1.32), pwl_header.hh (1.2), src/.cvsignore (1.1),
+ src/Doubly_Linked_Object.defs.hh (1.1),
+ src/Doubly_Linked_Object.inlines.hh (1.1),
+ src/Doubly_Linked_Object.types.hh (1.1), src/EList.defs.hh (1.1),
+ src/EList.inlines.hh (1.1), src/EList.types.hh (1.1),
+ src/EList_Iterator.defs.hh (1.1), src/EList_Iterator.inlines.hh
+ (1.1), src/EList_Iterator.types.hh (1.1), src/Handler.defs.hh
+ (1.1), src/Handler.inlines.hh (1.1), src/Handler.types.hh (1.1),
+ src/Makefile.am (1.1), src/Pending_Element.cc (1.1),
+ src/Pending_Element.defs.hh (1.1), src/Pending_Element.inlines.hh
+ (1.1), src/Pending_Element.types.hh (1.1), src/Pending_List.cc
+ (1.1), src/Pending_List.defs.hh (1.1),
+ src/Pending_List.inlines.hh (1.1), src/Pending_List.types.hh
+ (1.1), src/Time.cc (1.1), src/Time.defs.hh (1.1),
+ src/Time.inlines.hh (1.1), src/Time.types.hh (1.1),
+ src/Watchdog.cc (1.1), src/Watchdog.defs.hh (1.1),
+ src/Watchdog.inlines.hh (1.1), src/Watchdog.types.hh (1.1),
+ src/pwl_header.hh (1.1): Restructured.
+
+2005-09-23 Friday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.31): Configure is no longer responsible
+ for creating build_header.
+
+2005-09-23 Friday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.186), Watchdog/utils/Makefile.am (1.3),
+ Watchdog/utils/build_header.in (1.2), utils/Makefile.am (1.9),
+ utils/build_header.in (1.2): Generation of utility scripts fixed.
+
+2005-09-23 Friday 16:51 Matthew Mundell
+
+ * utils/Makefile.am (1.8): Add bin_SCRIPT. Set bin_SCRIPT to
+ build_header, text2cxxarray and a phony target which sets the
+ script permissions.
+
+2005-09-23 Friday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.31), matasciidumpload1.cc
+ (1.5), matrix1.cc (1.1): Test program renamed. The matrix1.cc
+ (and, possibly, matrix2.cc and so forth) will contain tests of
+ some functionalities of the class Matrix (especially those that
+ are not exercised much in an indirect way by the clients of
+ Matrix).
+
+2005-09-23 Friday 14:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.185): Revised the warning message concerning the
+ impossibility of propagating exceptions back from GMP.
+
+2005-09-23 Friday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.33), configure.ac (1.184), Watchdog/Makefile.am
+ (1.22), Watchdog/configure.ac (1.30), Watchdog/utils/Makefile.am
+ (1.2), Watchdog/utils/build_header (1.2),
+ Watchdog/utils/build_header.in (1.1),
+ doc/devref-browse.doxyconf-latex.in (1.56),
+ doc/devref-print.doxyconf-latex.in (1.56),
+ doc/devref.doxyconf-html.in (1.56),
+ doc/user-browse.doxyconf-latex.in (1.26),
+ doc/user-print.doxyconf-latex.in (1.26),
+ doc/user.doxyconf-html.in (1.28), src/Makefile.am (1.121),
+ utils/Makefile.am (1.7), utils/build_header (1.2),
+ utils/build_header.in (1.1), utils/text2cxxarray (1.3),
+ utils/text2cxxarray.in (1.1): Allow Perl to be installed into
+ non-standard places.
+
+2005-09-23 Friday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.29): Check for Perl.
+
+2005-09-23 Friday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.183): Check for Perl.
+
+2005-09-23 Friday 09:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.91): Comment fixed.
+
+2005-09-23 Friday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/matasciidumpload1.cc (1.4): Include <ctime>. It
+ does not make sense to use TEMP_INTEGER here: use Coefficient
+ instead. Avoid unnecessary use of macros: std::numeric_limits<T>
+ is (must) be available for all numerical types. Use GMP's
+ pseudo-random numbers instead of rand().
+
+2005-09-23 Friday 08:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.182): The C header file <time.h> is subsumed by
+ C++'s <ctime>: there is no need to check for its availability.
+
+2005-09-22 Thursday 23:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.181): `sys/time.h' was listed twice in the
+ argument of AC_CHECK_HEADERS. Check also for `time.h'.
+
+2005-09-22 Thursday 18:08 Matthew Mundell
+
+ * src/Polyhedron.defs.hh (1.283): Correct grammar.
+
+2005-09-22 Thursday 17:30 Matthew Mundell
+
+ * src/checked_numeric_limits.hh (1.5): Specialize numeric_limits
+ for int and all unsigned integer native types.
+
+2005-09-22 Thursday 15:51 Matthew Mundell
+
+ * src/Grid_public.cc (grids.68): Automatically initialise con_sys
+ and gen_sys in Grid(n,k).
+
+2005-09-22 Thursday 15:28 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.30), linsysasciidumpload1.cc
+ (1.1): Add linsysasciidumpload1, which tests Linear_System ASCII
+ loading.
+
+2005-09-22 Thursday 15:21 Matthew Mundell
+
+ * src/: Linear_Row.cc (1.13), Linear_Row.defs.hh (1.12),
+ Linear_System.cc (1.26): Add methods Linear_Row::ascii_load and
+ Linear_Row::Flags::ascii_load. Complete
+ Linear_System::ascii_load.
+
+2005-09-22 Thursday 14:07 Matthew Mundell
+
+ * tests/Polyhedron/matasciidumpload1.cc (1.3): Correct the
+ numeric_limits instantiation. Only allow valid modulation.
+
+2005-09-22 Thursday 13:09 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am (1.29), matasciidumpload1.cc
+ (1.2): In matasciidumpload1 limit the size of the random values
+ according to the coefficient type and rename the data file
+ uniquely.
+
+2005-09-21 Wednesday 19:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.153): One item completed and removed (check_containment).
+
+2005-09-21 Wednesday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.158): Some of the recent changes and bugfixes announced.
+
+2005-09-21 Wednesday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.16), geomcovers1.cc (1.1): Added
+ a new test showing that geometrically_covers() also works for
+ powersets of BD_Shape's.
+
+2005-09-21 Wednesday 19:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am (1.120), Polyhedra_Powerset.cc (1.1),
+ Polyhedra_Powerset.defs.hh (1.21), Polyhedra_Powerset.inlines.hh
+ (1.26), algorithms.hh (1.43): Added new specializations for
+ Polyhedra_powerset mixed constructors. Function
+ check_containment() now works with different instantiations of
+ Polyhedra_Powerset; the same happens for geometrically_covers()
+ and geometrically_equals(). A few non-inline full specialization
+ of member templates have been moved into file
+ Polyhedra_Powerset.cc.
+
+2005-09-21 Wednesday 17:05 Matthew Mundell
+
+ * src/Linear_System.cc (1.25): Indent consistently in ascii_load.
+ Correct typo, grammar and formatting in three comments.
+
+2005-09-21 Wednesday 16:56 Matthew Mundell
+
+ * src/: Congruence_System.defs.hh, Linear_System.cc,
+ Congruence_System.cc (grids.[15,2,24]): Take out
+ Congruence_System::add_row. Replace the bulk of
+ Linear_System::add_row with a call to Matrix::add_row.
+
+2005-09-21 Wednesday 16:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/geomcovers1.cc (1.6): Test corrected.
+
+2005-09-21 Wednesday 16:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions1.cc (1.7): Added a new exception
+ check for Polyhedra_Powerset::add_disjunct().
+
+2005-09-21 Wednesday 16:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.defs.hh (1.20),
+ Polyhedra_Powerset.inlines.hh (1.25): The new method
+ Polyhedra_Powerset::add_disjunct() now performs the required
+ check for space dimension compatibility. The check uncovers a
+ previously unnoticed (client) bug in Polyhedron/geomcovers1.cc.
+
+2005-09-21 Wednesday 16:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.152): Item:
+
+ - In the Prolog interface there are predicates such as
+ ppl_Polyhedron_remove_space_dimensions/2 that require an input
+ list;
+ if the argument is not a list, in the current version, the call
+ to
+ this predicate will fail. This needs to be changed so that an
+ exception is thrown.
+
+ removed.
+
+2005-09-21 Wednesday 16:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: exceptions.hh (1.17), ppl_prolog.icc (1.161),
+ tests/pl_check.pl (1.11): All Prolog interface predicates
+ expecting a list as input from the user now throw an exception if
+ the list is not nil terminated. (This could be a list of
+ constraints, generators, intervals, dimensiona or dimension maps)
+
+ That is interface predicates: ppl_new_Polyhedron_from_constraints
+ ppl_new_Polyhedron_from_generators
+ ppl_new_Polyhedron_from_bounding_box
+ ppl_Polyhedron_add_constraints
+ ppl_Polyhedron_add_constraints_and_minimize
+ ppl_Polyhedron_add_generators
+ ppl_Polyhedron_add_generators_and_minimize
+ ppl_Polyhedron_limited_H79_extrapolation_assign
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_token
+ ppl_Polyhedron_bounded_H79_extrapolation_assign
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token
+ ppl_Polyhedron_remove_space_dimensions
+ ppl_Polyhedron_fold_space_dimensions
+ ppl_Polyhedron_map_space_dimensions
+
+ class not_a_nil_terminated_list added to exception.hh.
+
+ Code for throwing an exception added to ppl_prolog.icc Exception
+ thrown for not nil terminating input lists for each of the above.
+ Also indentation of code improved.
+
+ Tests for not nil terminating list exceptions, for each of the
+ above predicates, added to pl_check.pl. Old tests for prolog
+ failure when list is not nil terminated removed. Some tests in
+ pl_check.pl reordered.
+
+2005-09-21 Wednesday 16:18 Matthew Mundell
+
+ * src/Generator_System.cc (1.10): In
+ adjust_topology_and_space_dimension pass to add_zero_columns the
+ result of adding to or subtracting from cols_to_be_added, instead
+ of an increased or decreased cols_to_be_added.
+
+2005-09-21 Wednesday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.31): Out-of-date comments concerning the
+ template parameter T removed from the documentation of class
+ BD_Shape.
+
+2005-09-21 Wednesday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.28), matasciidumpload1.cc
+ (1.1): Test Matrix::ascii_dump() and Matrix::ascii_load().
+
+2005-09-21 Wednesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.180), tests/Makefile.am (1.245): Previous change
+ reverted.
+
+2005-09-21 Wednesday 12:56 Matthew Mundell
+
+ * src/Generator_System.cc (1.9): Align argument indentation of
+ affine_image.
+
+2005-09-21 Wednesday 12:49 Matthew Mundell
+
+ * configure.ac (1.179): Add tests/Matrix/Makefile to
+ AC_CONFIG_FILES.
+
+2005-09-21 Wednesday 12:49 Matthew Mundell
+
+ * tests/Makefile.am (1.244): Add Matrix to SUBDIRS.
+
+2005-09-21 Wednesday 12:44 Matthew Mundell
+
+ * src/: Matrix.cc (1.85), Row.cc (1.90), Row.defs.hh (1.98):
+ Complete Matrix::ascii_load. Restore the stream attributes at
+ the end of Row::ascii_dump. Add ascii_load methods to Row::Flags
+ and Row.
+
+2005-09-21 Wednesday 12:37 Matthew Mundell
+
+ * src/Constraint_System.cc (1.10): In method num_inequalities use
+ dimension_type instead of int for temporary n.
+
+2005-09-20 Tuesday 21:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.151): Links in the CREDITS file checked and lists of
+ collaborators and projects supporting the work updated. So todo
+ item removed.
+
+2005-09-20 Tuesday 21:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.150): SWI 5.4.7 automatically initializes the library.
+ So todo item for this removed.
+
+2005-09-20 Tuesday 19:39 Matthew Mundell
+
+ * configure.ac (1.178): Indent all lines with spaces in
+ AC_CONFIG_FILES.
+
+2005-09-20 Tuesday 19:29 Matthew Mundell
+
+ * src/checked.inlines.hh (grids.4): Take a redundant assignment out
+ of gcdext_generic.
+
+2005-09-20 Tuesday 19:29 Matthew Mundell
+
+ * src/Native_Integer.inlines.hh (grids.3): Take a redundant
+ assignment out of gcdext.
+
+2005-09-20 Tuesday 19:28 Matthew Mundell
+
+ * src/Grid_public.cc (grids.67): Improve temporary comment.
+
+2005-09-20 Tuesday 19:27 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, boundingbox1.cc (grids.[34,1]): Add
+ boundingbox1, which tests Grid(Box& box).
+
+2005-09-20 Tuesday 19:26 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[47,20]): Add template
+ Grid(box, dummy). Improve method descriptions.
+
+2005-09-20 Tuesday 15:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * CREDITS (1.19): Added Matthew Mundell as a contributor.
+
+ Added the Royal Society project and the EPSRC project to the list
+ of supporting projects.
+
+2005-09-20 Tuesday 13:46 Abramo Bagnara
+
+ * src/: checked_float.inlines.hh (1.43), checked_int.inlines.hh
+ (1.38): Prepare inexact only when needed. Use new names for gcd
+ and lcm.
+
+2005-09-20 Tuesday 13:44 Abramo Bagnara
+
+ * src/checked_ext.inlines.hh (1.21): Attempt to reduce code
+ duplicate using explicit goto. Removed FIXME from add_mul_ext and
+ sub_mul_ext.
+
+2005-09-20 Tuesday 13:42 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.24): Removed fixme and choosen a better
+ name for functions.
+
+2005-09-20 Tuesday 13:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.89): Use the ternary version of gcd_assign() so as
+ to gain on checked numbers.
+
+2005-09-20 Tuesday 11:00 Matthew Mundell
+
+ * src/checked.cc (1.6): In parse_number1 move the maximum remainder
+ calculation into a variable.
+
+2005-09-20 Tuesday 09:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.60): Unwanted inclusion removed.
+
+2005-09-20 Tuesday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.108), Linear_Expression.defs.hh
+ (1.11): Friend declarations fixed.
+
+2005-09-20 Tuesday 08:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/scalar_products.inlines.hh (1.4): Fixed
+ homogeneous_scalar_product_assign(Coefficient&, const
+ Linear_Expression&, const Generator&) and
+ homogeneous_scalar_product_sign(const Linear_Expression&, const
+ Generator&).
+
+2005-09-19 Monday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.107), Linear_Expression.defs.hh
+ (1.10), Polyhedron_nonpublic.cc (1.53), scalar_products.defs.hh
+ (1.3), scalar_products.inlines.hh (1.3): Another twist at
+ reducing the dependency from friend class declarations.
+
+2005-09-19 Monday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.106), Generator.defs.hh (1.106),
+ scalar_products.defs.hh (1.2), scalar_products.inlines.hh (1.2):
+ Computing the scalar product between a Constraint and a Generator
+ objects no longer requires Polyhedron to be a friend of
+ Constraint and Generator.
+
+2005-09-19 Monday 22:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.105), Constraint_System.defs.hh
+ (1.13), Constraint_System.inlines.hh (1.5), Polyhedron.defs.hh
+ (1.282), Polyhedron.inlines.hh (1.122), Polyhedron_nonpublic.cc
+ (1.52): The functionality of
+ Polyhedron::add_low_level_constraints(Constraint_System&) is now
+ provided by Constraint_System::add_low_level_constraints().
+ Among other things, this reduces the dependency on friend
+ declarations.
+
+2005-09-19 Monday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.88): Chosen the more elegant implementation of
+ Row::normalize() (profiling was inconclusive: they were probably
+ equivalent).
+
+2005-09-19 Monday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint_System.cc (1.9), Generator_System.cc (1.8),
+ Linear_Row.cc (1.12), Linear_Row.defs.hh (1.11),
+ Linear_Row.inlines.hh (1.9), Linear_System.cc (1.24), Makefile.am
+ (1.119), Polyhedron_nonpublic.cc (1.51), Polyhedron_public.cc
+ (1.59), Polyhedron_widenings.cc (1.48), conversion.cc (1.73),
+ scalar_products.cc (1.1), scalar_products.defs.hh (1.1),
+ scalar_products.inlines.hh (1.1): Scalar product functions moved
+ from Linear_Row.* to scalar_products.*.
+
+2005-09-19 Monday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Row.cc (1.11): Long source line avoided.
+
+2005-09-19 Monday 20:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.inlines.hh (1.13): Use memory_size_type, not
+ size_t.
+
+2005-09-19 Monday 19:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.37): FIXME dealt with:
+ total_memory_in_bytes() and external_memory_in_bytes() properly
+ implemented for checked numbers.
+
+2005-09-19 Monday 19:07 Matthew Mundell
+
+ * src/BD_Shape.defs.hh (1.30): Correct grammar in notes.
+
+2005-09-19 Monday 19:06 Matthew Mundell
+
+ * src/BD_Shape.defs.hh (1.29): Clip trailing whitespace.
+
+2005-09-19 Monday 18:55 Matthew Mundell
+
+ * src/checked.cc (1.5): In parse_number1 parse the exponent in the
+ FRACTIONAL case.
+
+2005-09-19 Monday 17:11 Matthew Mundell
+
+ * tests/Polyhedron/affineimage6.cc (1.6): Neaten expression
+ formatting.
+
+2005-09-19 Monday 17:11 Matthew Mundell
+
+ * tests/Polyhedron/addspacedims3.cc (1.6): Correct argument in
+ print_generators message.
+
+2005-09-19 Monday 17:10 Matthew Mundell
+
+ * tests/Polyhedron/Makefile.am (1.27): Indent all lines in
+ ORIGINAL_TESTS and DERIVED_TESTS with tabs.
+
+2005-09-19 Monday 17:06 Matthew Mundell
+
+ * tests/BD_Shape/Makefile.am (1.15): Clip trailing whitespace.
+
+2005-09-19 Monday 17:04 Matthew Mundell
+
+ * src/checked.cc (1.4): Use `true' to evaluate true. Clip trailing
+ whitespace.
+
+2005-09-19 Monday 17:03 Matthew Mundell
+
+ * src/Polyhedron_widenings.cc (1.47): Correct variable names in
+ H79_widening_assign comments.
+
+2005-09-19 Monday 17:00 Matthew Mundell
+
+ * src/Polyhedron.defs.hh (1.281): Markup parameter in description.
+
+2005-09-19 Monday 16:56 Matthew Mundell
+
+ * src/Linear_System.defs.hh (1.16): Reformat comment.
+
+2005-09-19 Monday 16:43 Matthew Mundell
+
+ * configure.ac (1.177): Cater for the Debian dpkg version of
+ md5sum.
+
+2005-09-19 Monday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplex.cc (1.16): Let the parameter names in the definition
+ of primal_simplex() match those used in its declaration.
+
+2005-09-19 Monday 14:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.21), Watchdog/ChangeLog (1.11): Updated.
+
+2005-09-19 Monday 14:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.defs.hh (1.12): Added documentation for
+ Constraint_System::primal_simplex().
+
+2005-09-19 Monday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.149): Updated.
+
+2005-09-19 Monday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Saturation_Row.inlines.hh (1.7): Include <cassert>.
+
+2005-09-19 Monday 10:00 Matthew Mundell
+
+ * src/Native_Integer.inlines.hh (1.12): In template gcd take the
+ absolute value of the resulting gcd instead of initially taking
+ the absolute value of both arguments.
+
+2005-09-19 Monday 09:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.types.hh (1.10): Fixed struct
+ Coefficient_traits_template<Native_Integer<int64_t>.
+
+2005-09-19 Monday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.28), Bounding_Box.defs.hh (1.9),
+ DB_Row.defs.hh (1.9), Determinate.defs.hh (1.57), Init.cc (1.20),
+ Linear_Row.cc (1.10), Linear_System.cc (1.23), Matrix.cc (1.84),
+ Polyhedron.defs.hh (1.280), Row.cc (1.87), Row.defs.hh (1.97),
+ conversion.cc (1.72), globals.cc (1.23): Include globals.types.hh
+ or globals.defs.hh or none of them as required.
+
+2005-09-19 Monday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GMP_Integer.defs.hh (1.9): Doxygen comments and sectioning
+ revised.
+
+2005-09-19 Monday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ask_Tell.defs.hh (1.6), BD_Shape.defs.hh (1.27),
+ BHRZ03_Certificate.defs.hh (1.12), Bounding_Box.defs.hh (1.8),
+ DB_Row.defs.hh (1.8), Determinate.defs.hh (1.56),
+ GMP_Integer.defs.hh (1.8), GMP_Integer.inlines.hh (1.6),
+ H79_Certificate.defs.hh (1.11), Init.cc (1.19), Linear_Row.cc
+ (1.9), Linear_System.cc (1.22), Makefile.am (1.118), Matrix.cc
+ (1.83), Matrix.inlines.hh (1.45), Polyhedra_Powerset.defs.hh
+ (1.19), Polyhedron.defs.hh (1.279), Row.cc (1.86), Row.defs.hh
+ (1.96), Saturation_Matrix.cc (1.5), Saturation_Row.defs.hh (1.7),
+ Variable.defs.hh (1.47), conversion.cc (1.71), globals.cc (1.22),
+ globals.defs.hh (1.23), globals.types.hh (1.1), simplex.cc
+ (1.15): Memory size inspection functions and methods should
+ always return a memory_size_type. Header file global.types.hh
+ split from global.defs.hh. Only include global.types.hh when
+ possible.
+
+2005-09-19 Monday 07:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.63), Checked_Number.defs.hh (1.32),
+ GMP_Integer.defs.hh (1.7), Native_Integer.defs.hh (1.12): Added a
+ couple of blank lines to improve readability.
+
+2005-09-18 Sunday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.62): Use raw_value() to turn a
+ Coefficient into its underlying type.
+
+2005-09-18 Sunday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.inlines.hh (1.11): Avoid a "unused parameter"
+ warning.
+
+2005-09-18 Sunday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.61): Avoid excessive assumptions on
+ the nature of the Coefficient type.
+
+2005-09-18 Sunday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.31): Three FIXMEs investigated and
+ removed.
+
+2005-09-18 Sunday 20:00 Matthew Mundell
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (grids.[3,3]): Add macros FUNC4, DEF_ASSIGN_FUN5_4 and
+ DEF_ASSIGN_FUN5_5. Add function assign_gcdext and the
+ gcdext_assign user interface functions.
+
+2005-09-18 Sunday 19:55 Matthew Mundell
+
+ * src/: checked.defs.hh, checked.inlines.hh, checked_ext.defs.hh,
+ checked_ext.inlines.hh, checked_float.inlines.hh,
+ checked_int.inlines.hh, checked_mpz.inlines.hh
+ (grids.[3,3,3,3,3,3,3]): Add macros DECLARE_FUN5_0_1,
+ SPECIALIZE_FUN5_0_1 and SPECIALIZE_GCDEXT. Add template
+ gcdext_generic. Specialize gcdext_generic for integers and
+ floats. Add wrapper gcdext_ext. Add and specialize wrapper
+ gcdext_mpz.
+
+2005-09-18 Sunday 19:40 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (grids.5): Only call find_variation
+ on the grid under test.
+
+2005-09-18 Sunday 19:39 Matthew Mundell
+
+ * tests/print.cc (grids.4): Include Congruence_System definitions.
+
+2005-09-18 Sunday 19:38 Matthew Mundell
+
+ * src/: Native_Integer.defs.hh, Native_Integer.inlines.hh
+ (grids.[2,2]): Add gcdext_assign methods. "Use" the parameter in
+ external_memory_in_bytes.
+
+2005-09-18 Sunday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.types.hh (1.9): The specializations of
+ Coefficient_traits_template for native integers are now
+ differentiated the same way as for checked integers.
+
+2005-09-18 Sunday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.types.hh (1.6), Coefficient.types.hh (1.7),
+ GMP_Integer.types.hh (1.8), Native_Integer.types.hh (1.8): Treat
+ the three basic coefficient types (GMP, checked and native) the
+ same way, as far as the specialization of
+ Coefficient_traits_template is concerned.
+
+2005-09-18 Sunday 10:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.18), TODO (1.148): Two links fixed. All the others
+ need to be checked.
+
+2005-09-17 Saturday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.85): Added an alternative implementation for
+ Row::normalize() that should be more efficient than the present
+ one.
+
+2005-09-17 Saturday 08:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.84): Row::normalize() speeded-up further.
+
+2005-09-16 Friday 21:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int64_a (1.2): Adapted to
+ the recent changes in pl_check.pl.
+
+2005-09-16 Friday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.83): Row::normalize() speeded up.
+
+2005-09-16 Friday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.14): Reduced the scope of a using declaration.
+
+2005-09-16 Friday 17:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.13): Avoid duplicating code in order to
+ normalize a Row object.
+
+2005-09-16 Friday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_Row.cc (1.8), Linear_Row.defs.hh (1.10), Row.cc
+ (1.82), Row.defs.hh (1.95): The normalize() method has been moved
+ from Linear_Row to its base class Row.
+
+2005-09-16 Friday 12:16 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.23): Removed unneeded checks.
+
+2005-09-16 Friday 09:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.21), src/Linear_System.defs.hh (1.15),
+ tests/Polyhedron/gramschmidt1.cc (1.1),
+ tests/Polyhedron/gramshmidt1.cc (1.2): Spelling correction: it is
+ "Gram-Schmidt" (the orthonormalization procedure), not
+ "Gram-Shmidt".
+
+2005-09-16 Friday 06:43 Abramo Bagnara
+
+ * src/: Bounding_Box.inlines.hh (1.8), Polyhedron.inlines.hh
+ (1.121): Fixed mpq building from arbitrary coefficient type.
+
+2005-09-15 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected3_int16 (1.2),
+ XSB/expected3_int32 (1.2), XSB/expected3_int8 (1.2),
+ tests/expected_pchk_int16 (1.2), tests/expected_pchk_int32 (1.2),
+ tests/expected_pchk_int8 (1.2): Adapted to the recent changes in
+ pl_check.pl.
+
+2005-09-15 Thursday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int8_a (1.2): Adapted to
+ the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_int32_a (1.2): Adapted to
+ the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 18:21 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.22): Faster and more precise
+ implementation of gcd.
+
+2005-09-13 Tuesday 19:21 Matthew Mundell
+
+ * tests/Polyhedron/Makefile.am (grids.7): Add derived tests for the
+ congruence adding tests.
+
+2005-09-13 Tuesday 19:21 Matthew Mundell
+
+ * tests/Polyhedron/addcongruence2.cc (grids.2): Use C_Polyhedron
+ instead of NNC_Polyhedron.
+
+2005-09-13 Tuesday 18:57 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am, congruences1.cc (grids.[6,1]):
+ Add test congruences1 and derived test nnc_congruences1, which
+ test the polyhedra congruence constructors.
+
+2005-09-13 Tuesday 18:55 Matthew Mundell
+
+ * src/: C_Polyhedron.cc, C_Polyhedron.defs.hh, NNC_Polyhedron.cc,
+ NNC_Polyhedron.defs.hh (grids.[3,3,3,3]): Add C_Polyhedron(const
+ cgs), C_Polyhedron(cgs), NNC_Polyhedron(const cgs) and
+ NNC_Polyhedron(cgs).
+
+2005-09-13 Tuesday 17:43 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am, addcongruences1.cc,
+ addcongruences2.cc, addcongruences3.cc, addcongruences4.cc,
+ addcongruences5.cc (grids.[5,1,1,1,1,1]): Add addcongruences1-5.
+
+2005-09-13 Tuesday 17:41 Matthew Mundell
+
+ * tests/: print.cc, print.hh (grids.[3,6]): Add
+ print_constraints(cgs).
+
+2005-09-13 Tuesday 17:41 Matthew Mundell
+
+ * src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+ Polyhedron_public.cc (grids.[6,4,4]): Add
+ throw_dimension_incompatible(m, cgs_name, cgs) and
+ add_congruences(cgs).
+
+2005-09-13 Tuesday 17:39 Matthew Mundell
+
+ * src/Grid_public.cc (grids.66): In add_constraints(cs) only add
+ cgs to the grid if congruences have been inserted into cgs.
+
+2005-09-13 Tuesday 17:37 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.46): Correct two descriptions.
+
+2005-09-13 Tuesday 15:56 Matthew Mundell
+
+ * tests/Polyhedron/: Makefile.am, addcongruence1.cc,
+ addcongruence2.cc, addcongruence3.cc, addcongruence4.cc,
+ addcongruence5.cc (grids.[4,1,1,1,1,1]): Add addcongruence1-5.
+
+2005-09-13 Tuesday 15:54 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.33): List related tests in TESTS on
+ single lines.
+
+2005-09-13 Tuesday 15:52 Matthew Mundell
+
+ * src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+ Polyhedron_public.cc (grids.[5,3,3]): Add
+ throw_dimension_incompatible(method, cg_name, cg) and
+ add_congruence(cg).
+
+2005-09-13 Tuesday 15:51 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.20): Declare Polyhedron a friend.
+
+2005-09-13 Tuesday 15:46 Matthew Mundell
+
+ * src/: Constraint.cc, Constraint.defs.hh (grids.[3,4]): Add
+ ascii_dump(s).
+
+2005-09-13 Tuesday 15:44 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.inlines.hh (grids.[11,15]): Make
+ Congruence(c) a real function (was inline).
+
+2005-09-13 Tuesday 15:43 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.45): Use \brief on a line of its own.
+ Prefer //! to \brief for single line comments.
+
+2005-09-13 Tuesday 15:41 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.5): Add test7 (adds an NNC
+ constraint).
+
+2005-09-12 Monday 16:17 Matthew Mundell
+
+ * STANDARDS (1.23): Add coding standard entries for negation and
+ comparison to zero.
+
+2005-09-12 Monday 14:29 Matthew Mundell
+
+ * tests/Grid/certificate1.cc (grids.3): Correct an error message in
+ test3. Add test6, which uses zero dimension universes.
+
+2005-09-12 Monday 14:28 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.3): In Grid_Certificate(cgr)
+ handle the zero dimension universe specially, and improve three
+ comments.
+
+2005-09-12 Monday 14:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected3_int16_a (1.2),
+ tests/expected_pchk_int16_a (1.2): Adapted to the recent changes
+ in pl_check.pl.
+
+2005-09-11 Sunday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/maxspacedim.cc (1.7): Pass the right parameters to
+ the BD_Shape template class.
+
+2005-09-11 Sunday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.25): Pass the right parameters to the
+ BD_Shape template class.
+
+2005-09-11 Sunday 21:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.26), BD_Shape.inlines.hh (1.60): Life
+ of the user of BD_Shape is now simpler, as he can specify a
+ BD_Shape by providing the base numerical type used to represent
+ the inhomogeneous terms.
+
+2005-09-11 Sunday 11:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/tests/pl_check.pl (1.10): Improved error and
+ exception messages. Try and ensure that regardless of the error
+ or exception, an informative message detailing the group test and
+ the predicates it is testing is printed.
+
+ An extra noisy level added (noisy(2) for debugging (set by the
+ predicate make_extra_noisy).
+
+ check_all now is quiet only as a default and does not change
+ existing noisy level.
+
+ Avoiding abbreviations in group names to improve readability.
+
+ Made three groups for testing the constructor predicates instead
+ of one. Simplified test for new_Polyhedron_from_space_dimension.
+
+ Added tests for
+ ppl_Polyhedron_generalized_affine_preimage_lhs_rhs.
+
+ Improved tests for ppl_Polyhedron_maximize_with_point and
+ ppl_Polyhedron_minimize_with_point to correct behaviour on
+ failure.
+
+2005-09-11 Sunday 10:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.18),
+ src/Polyhedra_Powerset.inlines.hh (1.24),
+ tests/Polyhedron/bhz03widening1.cc (1.6),
+ tests/Polyhedron/bhz03widening2.cc (1.6),
+ tests/Polyhedron/bhz03widening3.cc (1.6),
+ tests/Polyhedron/bhz03widening6.cc (1.6): Removed the shorthand
+ notation for
+ Polyhedra_Powerset::BHZ03_widening_assing<BHRZ03_Certificate>(...).
+ Now the user should always explicitly mention the (type of)
+ certificate used for the base-level widening operator.
+
+2005-09-10 Saturday 23:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * instchk.hh (1.2): Description and copyright notice added.
+
+2005-09-10 Saturday 23:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_mpz.inlines.hh (1.26): Avoid assert(0) and make sure
+ the compiler does not think we are returning without a value.
+
+2005-09-10 Saturday 23:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.37): Avoid naming unused arguments.
+
+2005-09-10 Saturday 23:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.42): FIXME added.
+
+2005-09-10 Saturday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.176), instchk.hh (1.1): Started the
+ implementation of the --enable-instances option.
+
+2005-09-08 Thursday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.175): Better logic to handle interfaces that are
+ enabled by default.
+
+2005-09-08 Thursday 01:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.174), Watchdog/configure.ac (1.28): Allow the
+ specification of --enable-optimization=zero to temporarily get
+ around bugs such as the one affecting Intel C/C++ 9.0.25 under
+ Fedora Core 4.
+
+2005-09-08 Thursday 01:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.173), interfaces/Prolog/Ciao/Makefile.am (1.45),
+ interfaces/Prolog/GNU/Makefile.am (1.48),
+ interfaces/Prolog/SICStus/Makefile.am (1.54),
+ interfaces/Prolog/SWI/Makefile.am (1.52),
+ interfaces/Prolog/XSB/Makefile.am (1.35),
+ interfaces/Prolog/YAP/Makefile.am (1.39): Allow to selectively
+ enable the construction of the Prolog interfaces.
+
+2005-09-07 Wednesday 23:37 Matthew Mundell
+
+ * src/Grid_Certificate.cc (grids.2): In Grid_Certificate(cgr) call
+ simplify outside the points assertion.
+
+2005-09-07 Wednesday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.4): Only set `have_swi_prolog' and
+ leave it to the caller to decide whether define an Automake
+ conditional and which one.
+
+2005-09-07 Wednesday 08:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.172): Started implementing the new
+ `--enable-interfaces' option.
+
+2005-09-06 Tuesday 16:24 Matthew Mundell
+
+ * tests/Grid/widening1.cc (grids.5): Add test15, to show problems
+ with using the Halbwachs method.
+
+2005-09-06 Tuesday 16:23 Matthew Mundell
+
+ * src/Grid_widenings.cc (grids.4): Add space between sentences.
+
+2005-09-06 Tuesday 15:27 Matthew Mundell
+
+ * tests/Grid/certificate1.cc (grids.2): Use compare(gr) or struct
+ Compare::operator() instead of compare(grc) in some of the
+ comparison tests. Also test is_stabilising in some of the tests.
+
+2005-09-06 Tuesday 15:00 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, certificate1.cc (grids.[32,1]): Add
+ certificate1, which tests class Grid_Certificate.
+
+2005-09-06 Tuesday 13:19 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, contains2.cc (grids.[31,1]): Add
+ contains2, which tests strictly_contains.
+
+2005-09-06 Tuesday 13:19 Matthew Mundell
+
+ * tests/Grid/contains1.cc (grids.2): Improve failure messages.
+
+2005-09-06 Tuesday 13:07 Matthew Mundell
+
+ * tests/Grid/bhz03widening1.cc (grids.2): Describe test1. Add
+ test2, where the widening falls back to joining the grids.
+
+2005-09-05 Monday 23:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Widening_Function.defs.hh, Widening_Function.inlines.hh,
+ Widening_Function.types.hh (grids.[2,2,1]): Ported from the main
+ trunk: the version of widen_fun_ref() building a limited widening
+ function is now parametric on its second argument too (i.e., the
+ limiting cs).
+
+2005-09-05 Monday 22:51 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (grids.6): Add colons to messages.
+
+2005-09-05 Monday 22:50 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, bhz03widening1.cc (grids.[30,1]): Add
+ an initial bhz03widening1.
+
+2005-09-05 Monday 22:49 Matthew Mundell
+
+ * src/: Polyhedra_Powerset.inlines.hh, Polyhedron.defs.hh,
+ Polyhedron.inlines.hh (grids.[4,4,4]): Add method
+ Polyhedron::difference_assign, and use it in
+ BHZ03_widening_assign (shadowing the trunk).
+
+2005-09-05 Monday 22:37 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.32): Shorten two comments.
+
+2005-09-05 Monday 22:37 Matthew Mundell
+
+ * src/: Congruence_System.defs.hh, Generator_System.defs.hh,
+ Grid.defs.hh, Grid.inlines.hh (grids.[14,5,44,19]): Befriend
+ Grid_Certificate where necessary. Enable
+ Grid::strictly_contains. Add difference_assign.
+
+2005-09-05 Monday 22:34 Matthew Mundell
+
+ * src/: Grid_Certificate.cc, Grid_Certificate.defs.hh,
+ Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+ Makefile.am (grids.[1,1,1,1,7]): Add class Grid_Certificate.
+
+2005-09-05 Monday 17:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.inlines.hh (1.23), Polyhedron.defs.hh
+ (1.278), Polyhedron.inlines.hh (1.120): Added method
+ difference_assign(), which is now used in the widening on
+ powersets.
+
+2005-09-05 Monday 11:15 Matthew Mundell
+
+ * src/Grid_public.cc (grids.65): In relation_with(cg) use the
+ scalar_product_assign that expects cg to be at most the size of
+ the generator.
+
+2005-09-05 Monday 11:13 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[10,19]): Add
+ scalar_product_assign(Coefficient&, const Congruence&, const
+ Linear_Row&).
+
+2005-09-05 Monday 10:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Widening_Function.defs.hh (1.12),
+ Widening_Function.inlines.hh (1.11), Widening_Function.types.hh
+ (1.3): The version of widen_fun_ref() building a limited widening
+ function is now parametric on its second argument too (i.e., the
+ limiting cs).
+
+2005-09-04 Sunday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.21): Workaround and FIXME added for the
+ bug affecting lcm_generic().
+
+2005-09-04 Sunday 23:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.70): FIXME dealt with.
+
+2005-09-04 Sunday 21:05 Matthew Mundell
+
+ * tests/Grid/: join1.cc, join2.cc (grids.[8,4]): Use common
+ Variables for all the tests. Only call find_variation for the
+ grid under test.
+
+2005-09-04 Sunday 21:04 Matthew Mundell
+
+ * tests/Grid/generalizedaffinepreimage1.cc (grids.4): Correct the
+ known grids in test3, test4 and test5.
+
+2005-09-04 Sunday 21:03 Matthew Mundell
+
+ * tests/Grid/affinepreimage1.cc (grids.4): Note which second grid
+ is under test in failure messages. Correct the known grid and
+ given variable in test13.
+
+2005-09-04 Sunday 20:58 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.4): Comment the end of the
+ namespace block.
+
+2005-09-04 Sunday 20:57 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, contains1.cc, join3.cc
+ (grids.[29,1,1]): Add contains1, including a test for the
+ is_included_in error found via CHINA. Add join3, which tests
+ join_assign_if_exact.
+
+2005-09-04 Sunday 20:52 Matthew Mundell
+
+ * src/Grid_public.cc (grids.64): Implement join_assign_if_exact.
+
+2005-09-04 Sunday 19:35 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.31): In is_included_in check that
+ all generators (including the first one) satisfy the congruences.
+
+2005-09-04 Sunday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[18,14]):
+ Avoid returning references to temporaries.
+
+2005-09-04 Sunday 00:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Saturation_Row.cc (1.8): FIXME dealt with.
+
+2005-09-03 Saturday 23:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[28,4,4]):
+ Obsolete test program removed.
+
+2005-09-03 Saturday 23:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.inlines.hh (grids.2),
+ NNC_Polyhedron.inlines.hh (1.30): Added the implementation of
+ NNC_Polyhedron::upper_bound_assign_if_exact(const
+ NNC_Polyhedron&).
+
+2005-09-03 Saturday 13:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh, Determinate.inlines.hh,
+ Polyhedra_Powerset.defs.hh, Polyhedra_Powerset.inlines.hh
+ (grids.[2,3,3,3]): Added constructors taking congruence systems.
+
+2005-09-03 Saturday 13:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/Makefile.am, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Constraint_System.defs.hh, src/Determinate.inlines.hh,
+ src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+ src/Powerset.inlines.hh, src/algorithms.hh, src/simplex.cc,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/bdshull1.cc,
+ tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+ tests/BD_Shape/bdshull4.cc, tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/ch78widening6.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/polyhull1.cc, tests/BD_Shape/polyhull2.cc,
+ tests/BD_Shape/polyhull3.cc, tests/BD_Shape/polyhull4.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/max_min2.cc, tests/Polyhedron/primalsimplex1.cc
+ (grids.[3,3,3,2,3,3,3,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,3,1,1,1,1,2,2,2,3,2,2,2,2,3,2,2,1]):
+ Third merge from main trunk.
+
+2005-09-03 Saturday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.inlines.hh (1.12): Output function fixed.
+
+2005-09-03 Saturday 13:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Powerset.inlines.hh (1.11): Bracketing fixed in
+ operator<<(std::ostream&, const Powerset<CS>&).
+
+2005-09-03 Saturday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.50): Do not refer to
+ element().poly_hull_assign(): refer to
+ element().upper_bound_assign() instead.
+
+2005-09-03 Saturday 12:47 Matthew Mundell
+
+ * src/: Congruence_System.inlines.hh, Grid_Status.cc,
+ Grid_conversion.cc, Grid_nonpublic.cc (grids.[6,3,19,30]): Update
+ FSF address.
+
+2005-09-03 Saturday 12:46 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+ (grids.[43,18,63]): Add methods upper_bound_assign,
+ join_assign_if_exact and upper_bound_assign_if_exact.
+
+2005-09-03 Saturday 12:44 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.7): Use upper_bound_assign in some of
+ the tests.
+
+2005-09-03 Saturday 12:44 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.3): Update FSF address.
+
+2005-09-03 Saturday 12:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.25), BD_Shape.inlines.hh (1.59): Added
+ declarations and dummy implementations for method bool
+ BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) and its
+ alias bool BD_Shape<T>::upper_bound_assign_if_exact(const
+ BD_Shape&).
+
+2005-09-03 Saturday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.37), NNC_Polyhedron.defs.hh (1.39):
+ Comments fixed and completed.
+
+2005-09-03 Saturday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.36), NNC_Polyhedron.defs.hh (1.38):
+ Comments fixed.
+
+2005-09-03 Saturday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.35), C_Polyhedron.inlines.hh
+ (1.28), NNC_Polyhedron.cc (1.16), NNC_Polyhedron.defs.hh (1.37):
+ Be consistent in the choice of parameters' names.
+
+2005-09-03 Saturday 12:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.22): Use the
+ PH::upper_bound_assign_if_exact() method and not the function
+ with the same name.
+
+2005-09-03 Saturday 12:07 Matthew Mundell
+
+ * tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+ addspacedims1.cc, addspacedims2.cc, affineimage1.cc,
+ affinepreimage1.cc, bug1.cc, concatenate1.cc, congruence1.cc,
+ congruencesystem1.cc, congruencesystem2.cc, equals1.cc,
+ expandspacedim1.cc, foldspacedims1.cc,
+ generalizedaffineimage1.cc, generalizedaffineimage2.cc,
+ generalizedaffinepreimage1.cc, generalizedaffinepreimage2.cc,
+ grid1.cc, grid2.cc, griddifference1.cc, intersection1.cc,
+ intersection2.cc, isuniverse1.cc, join1.cc, join2.cc,
+ limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+ relations2.cc, removespacedims1.cc, removespacedims2.cc,
+ timeelapse1.cc, widening1.cc, writecongruencesystem.cc
+ (grids.[4,10,8,5,4,3,3,2,5,6,6,2,4,3,3,4,3,3,20,16,5,4,5,3,6,3,3,9,3,5,5,4,3,4,5]):
+ Update FSF address.
+
+2005-09-03 Saturday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.16), C_Polyhedron.defs.hh (1.34),
+ C_Polyhedron.inlines.hh (1.27), NNC_Polyhedron.cc (1.15),
+ NNC_Polyhedron.defs.hh (1.36), algorithms.hh (1.42): New methods
+ bool C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron&)
+ and bool NNC_Polyhedron::poly_hull_assign_if_exact(const
+ NNC_Polyhedron&) and their synonyms bool
+ C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron&)
+ and bool NNC_Polyhedron::upper_bound_assign_if_exact(const
+ NNC_Polyhedron&).
+
+2005-09-03 Saturday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.277): Long source line avoided.
+
+2005-09-03 Saturday 11:53 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+ Congruence_System.cc, Congruence_System.defs.hh, Grid.defs.hh,
+ Grid.inlines.hh, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+ Grid_chdims.cc, Grid_minimize.cc, Grid_public.cc,
+ Grid_simplify.cc, Grid_widenings.cc
+ (grids.[9,17,13,23,13,42,17,3,2,17,17,62,30,3]): Update FSF
+ address.
+
+2005-09-03 Saturday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: max_min1.cc (1.5), max_min2.cc (1.5): Adapted
+ so as to use the new interfaces for maximize() and minimize().
+
+2005-09-03 Saturday 11:18 Matthew Mundell
+
+ * tests/Grid/writecongruencesystem.cc (grids.4): Use a single equal
+ sign in the expected output string.
+
+2005-09-03 Saturday 11:17 Matthew Mundell
+
+ * tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+ affineimage1.cc, affinepreimage1.cc, expandspacedim1.cc,
+ foldspacedims1.cc, generalizedaffineimage1.cc,
+ generalizedaffineimage2.cc, generalizedaffinepreimage1.cc,
+ generalizedaffinepreimage2.cc, grid1.cc, grid2.cc,
+ griddifference1.cc, intersection1.cc, intersection2.cc,
+ limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+ relations2.cc, timeelapse1.cc, widening1.cc
+ (grids.[3,9,3,2,3,2,2,3,2,2,19,15,4,3,4,2,8,2,4,2,3]): Use the
+ new Degenerate_Element kinds.
+
+2005-09-03 Saturday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.21): Refer to
+ "upper_bound_assign" methods rather than "poly_hull_assign" ones.
+ Corrected several instances were the
+ `Determinate<PH>::element()' accessor was not used.
+
+2005-09-03 Saturday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.17): New typedef `element_type'
+ corresponding to the type of the underlying numeric domain.
+
+2005-09-03 Saturday 10:53 Matthew Mundell
+
+ * tests/Grid/addconstraints1.cc (grids.2): Dump grids on error.
+ Test Grid(ccs). Add tests where the resulting grid is empty.
+
+2005-09-03 Saturday 10:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.24), src/BD_Shape.inlines.hh (1.58),
+ tests/BD_Shape/Makefile.am (1.14), tests/BD_Shape/bdshull1.cc
+ (1.1), tests/BD_Shape/bdshull2.cc (1.1),
+ tests/BD_Shape/bdshull3.cc (1.1), tests/BD_Shape/bdshull4.cc
+ (1.1), tests/BD_Shape/cc76extrapolation2.cc (1.5),
+ tests/BD_Shape/cc76extrapolation6.cc (1.6),
+ tests/BD_Shape/ch78widening6.cc (1.6),
+ tests/BD_Shape/exceptions1.cc (1.6), tests/BD_Shape/polyhull1.cc
+ (1.5), tests/BD_Shape/polyhull2.cc (1.5),
+ tests/BD_Shape/polyhull3.cc (1.5), tests/BD_Shape/polyhull4.cc
+ (1.5): Methods BD_Shape::poly_hull_assign* renamed
+ bds_hull_assign*. New method void upper_bound_assign(const
+ BD_Shape<T>& y) is the same as bds_hull_assign(y).
+
+2005-09-03 Saturday 10:51 Matthew Mundell
+
+ * src/Grid_public.cc (grids.61): In Grid(ccs) ensure that the grid
+ is the same dimension as ccs.
+
+2005-09-03 Saturday 10:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.276), Polyhedron.inlines.hh (1.119):
+ New method void upper_bound_assign(const Polyhedron& y) is the
+ same as poly_hull_assign(y).
+
+2005-09-03 Saturday 10:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.18): Corrected to match the new
+ specifications for Polyhedron::maximize(), Polyhedron::minimize()
+ and Constraint_System::primal_simplex(). Also corrected a memory
+ leak bug.
+
+2005-09-03 Saturday 10:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.cc (1.137), C/ppl_c.h.in (1.52),
+ Prolog/ppl_prolog.icc (1.160): Interfaces updated to match the
+ new specifications of Polyhedron::maximize(),
+ Polyhedron::minimize() and Constraint_System::primal_simplex().
+
+2005-09-03 Saturday 10:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.inlines.hh (1.57), Constraint_System.defs.hh
+ (1.11), Polyhedron.defs.hh (1.275), Polyhedron.inlines.hh
+ (1.118), Polyhedron_nonpublic.cc (1.50), simplex.cc (1.12):
+ Corrected a bug in the implementation of
+ Constraint_System::primal_simplex() whereby a feasible solution
+ was claimed even for inconsistent constraint systems. Added
+ private method Simplex_Status
+ Constraint_System::primal_simplex(obj, gen) that maximizes obj on
+ the low-level polyhedron (i.e., the eps-polyhedron if topology is
+ NNC) encoded by the constraint system. New method used to
+ correct a bug in the implementation of
+ Polyhedron::minimized_constraints() whereby the constraint system
+ could have been marked minimized even if it was not. Simplified
+ the interfaces of methods Polyhedron::minimize(),
+ Polyhedron::maximize(), Constraint_System::primal_simplex() by
+ avoiding memory-leakage prone parameter passing.
+
+2005-09-02 Friday 23:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.26), primalsimplex1.cc (1.1):
+ This test shows an error in Constraint_System::primal_simplex().
+
+2005-09-02 Friday 20:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[41,60]): Use the
+ global DEGENERATE_ELEMENT enum instead of the local
+ DEGENERATE_KIND.
+
+2005-09-02 Friday 19:15 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.12): Compute the row capacity in
+ Congruence(c).
+
+2005-09-02 Friday 18:54 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, addconstraints1.cc (grids.[27,1]): Add
+ addconstraints1.
+
+2005-09-02 Friday 18:53 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.11): Account for the extra
+ element in NNC constraints in Congruence(c).
+
+2005-09-02 Friday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.44): Dividing by 10 the
+ parameter GLOBALSTKSIZE seems to help testing with clpq2.
+
+2005-09-02 Friday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING, Makefile.am, NEWS, README, README.configure, STANDARDS,
+ TODO, build_header, compile, config.guess, config.rpath,
+ config.sub, configure.ac, depcomp, install-sh, ltmain.sh,
+ missing, mkinstalldirs, Watchdog/COPYING,
+ Watchdog/Doubly_Linked_Object.defs.hh,
+ Watchdog/Doubly_Linked_Object.inlines.hh, Watchdog/EList.defs.hh,
+ Watchdog/EList.inlines.hh, Watchdog/EList_Iterator.defs.hh,
+ Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+ Watchdog/Handler.inlines.hh, Watchdog/Makefile.am,
+ Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+ Watchdog/Pending_Element.inlines.hh, Watchdog/Pending_List.cc,
+ Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+ Watchdog/README, Watchdog/Time.cc, Watchdog/Time.defs.hh,
+ Watchdog/Time.inlines.hh, Watchdog/Watchdog.cc,
+ Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+ Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+ Watchdog/pwl_header.bottom, Watchdog/pwl_header.hh,
+ Watchdog/pwl_header.middle, Watchdog/pwl_header.top,
+ Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+ Watchdog/utils/build_header, debian/libppl-pwl.copyright.in,
+ debian/libppl.copyright.in, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/ppl_lpsol.c,
+ demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+ doc/README.doc, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/fdl.dox, doc/fdl.tex, doc/fdl.txt, doc/gpl.dox, doc/gpl.tex,
+ doc/gpl.txt, doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ interfaces/Makefile.am, interfaces/C/Makefile.am,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/gp_clpq.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.h,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.cc,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/SWI/ppl_pl.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.pl,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/ppl_yap.pl,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+ m4/ac_check_gmp.m4, m4/ac_check_swi_prolog.m4,
+ m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+ m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+ m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+ m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+ src/Ask_Tell.inlines.hh, src/BDS_Status.idefs.hh,
+ src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+ src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/Checked_Number.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Coefficient.cc, src/Coefficient.defs.hh,
+ src/Coefficient.inlines.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint_System.cc, src/Constraint_System.defs.hh,
+ src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+ src/DB_Row.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/E_NIT.defs.hh,
+ src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+ src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+ src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/Generator.cc,
+ src/Generator.defs.hh, src/Generator.inlines.hh,
+ src/Generator_System.cc, src/Generator_System.defs.hh,
+ src/Generator_System.inlines.hh, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/Init.cc, src/Init.defs.hh, src/Interval.cc,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Interval.types.hh, src/Limits.hh, src/Linear_Expression.cc,
+ src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/Matrix.inlines.hh, src/NNC_Polyhedron.cc,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Numeric_Format.defs.hh, src/Ph_Status.cc,
+ src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Con_Relation.inlines.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+ src/Rounding.types.hh, src/Row.cc, src/Row.defs.hh,
+ src/Row.inlines.hh, src/Saturation_Matrix.cc,
+ src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+ src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+ src/Saturation_Row.inlines.hh, src/Variable.cc,
+ src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+ src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/compiler.hh, src/conversion.cc, src/float.types.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh, src/initializer.hh,
+ src/max_space_dimension.hh, src/minimize.cc, src/namespaces.hh,
+ src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+ src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+ src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+ tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+ tests/ehandlers.cc, tests/ehandlers.hh, tests/files.cc,
+ tests/files.hh, tests/ppl_test.hh, tests/print.cc,
+ tests/print.hh, tests/BD_Shape/Makefile.am,
+ tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc,
+ tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+ tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+ tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+ tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+ tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+ tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+ tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+ tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+ tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+ tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+ tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+ tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+ tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedCC76extrapolation1.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation1.cc,
+ tests/BD_Shape/limitedCH78extrapolation2.cc,
+ tests/BD_Shape/limitedCH78extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation4.cc,
+ tests/BD_Shape/limitedCH78extrapolation5.cc,
+ tests/BD_Shape/limitedCH78extrapolation6.cc,
+ tests/BD_Shape/limitedCH78extrapolation7.cc,
+ tests/BD_Shape/limitedCH78extrapolation8.cc,
+ tests/BD_Shape/limitedCH78extrapolation9.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+ tests/BD_Shape/polydifference2.cc,
+ tests/BD_Shape/polydifference3.cc,
+ tests/BD_Shape/polydifference4.cc,
+ tests/BD_Shape/polydifference5.cc,
+ tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+ tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+ tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+ tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/removespacedims2.cc,
+ tests/BD_Shape/removespacedims3.cc,
+ tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+ tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+ tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+ tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+ tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage11.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedaffineimage1.cc,
+ tests/Polyhedron/boundedaffineimage2.cc,
+ tests/Polyhedron/boundedaffineimage3.cc,
+ tests/Polyhedron/boundedaffinepreimage1.cc,
+ tests/Polyhedron/boundedaffinepreimage2.cc,
+ tests/Polyhedron/boundedaffinepreimage3.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+ tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/concatenate7.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc,
+ tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage13.cc,
+ tests/Polyhedron/generalizedaffineimage14.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generalizedaffinepreimage1.cc,
+ tests/Polyhedron/generalizedaffinepreimage2.cc,
+ tests/Polyhedron/generalizedaffinepreimage3.cc,
+ tests/Polyhedron/generalizedaffinepreimage4.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/gramshmidt1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+ tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+ tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+ tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+ tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+ tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+ tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+ tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+ tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+ tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+ tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+ tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+ tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+ tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+ tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+ tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+ tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+ tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+ tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+ tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+ utils/build_header, utils/text2cxxarray, utils/timings.cc,
+ utils/timings.hh
+ (grids.[1,2,2,2,1,3,2,2,1,2,1,2,3,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,2,2,1,2,1,7,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,2,4,1,1,1,1,1,2,2,1,1,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,2,2,1,1,1,1,1,2,2,1,1,1,2,3,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,2,2,3,2,3,6,3,12,4,1,1,1,1,2,2,1,2,2,1,1,2,4,2,4,4,3,1,1,1,6,2,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,2,1,2, [...]
+ Second merge from main trunk.
+
+2005-09-02 Friday 17:00 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.16): Take reference to pending rows
+ out of comment.
+
+2005-09-02 Friday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/timings.cc (1.5): Fixed print_clock().
+
+2005-09-02 Friday 17:00 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[40,29,59]): Add add_constraint, add_constraints and
+ Grid(cs). Add throw_dimension_incompatible methods for
+ Constraints and Constraint_Systems.
+
+2005-09-02 Friday 11:42 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.10): Check for all cases of
+ trivially true congruences.
+
+2005-09-02 Friday 11:41 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence_System.cc (grids.[16,22]):
+ Strong normalize congruences before outputting them from the
+ congruence system.
+
+2005-09-02 Friday 11:39 Matthew Mundell
+
+ * src/Congruence.cc (grids.8): In the output operator only output
+ the modulus for proper congruences, and use `=' instead of `=='.
+
+2005-09-02 Friday 10:53 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.21): Use `while (true)' instead
+ of `while (1)'.
+
+2005-09-02 Friday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator_System.cc (grids.11): Use booleans when booleans
+ are intended.
+
+2005-09-02 Friday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (grids.58): Print only the minimized
+ congruences.
+
+2005-09-01 Thursday 19:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.49): When strongly minimizing a
+ constraint system, if we add back an epsilon upper bound
+ constraint we should reset the minimization flag.
+
+2005-09-01 Thursday 18:31 Matthew Mundell
+
+ * src/Grid_public.cc (grids.57): In generalized_affine_preimage
+ improve a variable name and skip the normalization check when
+ inserting the lines.
+
+2005-09-01 Thursday 18:18 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.28): Set gen_sys's sortedness false
+ after clearing gen_sys. Correct a comment.
+
+2005-09-01 Thursday 18:17 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.15): In map_space_dimensions clear
+ minimized flags after permuting columns, and skip the
+ normalization check when inserting generators.
+
+2005-09-01 Thursday 17:17 Matthew Mundell
+
+ * src/Grid_public.cc (grids.56): In the copy constructor set
+ gen_sys's sortedness to false when given grid's generators are
+ out of date. In OK correct a comment and a message and test that
+ gen_sys's sortedness is false.
+
+2005-09-01 Thursday 17:15 Matthew Mundell
+
+ * src/: Grid.inlines.hh, Grid_chdims.cc, Grid_simplify.cc
+ (grids.[14,16,29]): Set gen_sys's sortedness to false after
+ clearing gen_sys. Take extra set_sorted calls out of the
+ generator simplify method.
+
+2005-09-01 Thursday 15:54 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.13): Set sortedness of the temporary
+ generators system in map_space_dimensions to false.
+
+2005-09-01 Thursday 15:34 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.27): Take tracing out of
+ is_included_in.
+
+2005-09-01 Thursday 15:29 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.20): Take tracing out of
+ satisfies_all_congruences.
+
+2005-09-01 Thursday 15:23 Matthew Mundell
+
+ * src/: Grid_nonpublic.cc, Grid_public.cc (grids.[26,55]): Always
+ and only set sorted to false when adding new generators.
+
+2005-09-01 Thursday 15:21 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.15): Use correct domain in comment.
+
+2005-09-01 Thursday 15:20 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.39): Take out old Polyhedra comments.
+
+2005-09-01 Thursday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.20): Prefer pre-increment to
+ post-increment.
+
+2005-09-01 Thursday 15:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.56): Using direct initialization
+ instead of definition+assignment in a few places.
+
+2005-09-01 Thursday 14:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc (1.64): Reverted previosu change, since it might
+ result in poorer performance.
+
+2005-09-01 Thursday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * install-sh (1.15), ltmain.sh (1.26), Watchdog/install-sh (1.12),
+ Watchdog/ltmain.sh (1.15): Updated from Libtool 1.5.20.
+
+2005-08-31 Wednesday 18:09 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.38): Mark up parameter description
+ correctly.
+
+2005-08-31 Wednesday 18:08 Matthew Mundell
+
+ * doc/definitions.dox (grids.6): Correct spelling of anchor.
+
+2005-08-31 Wednesday 17:19 Matthew Mundell
+
+ * doc/definitions.dox (grids.5): Clip trailing whitespace.
+
+2005-08-31 Wednesday 17:04 Matthew Mundell
+
+ * src/Makefile.am (grids.5): Add grid_widenings.cc to
+ libppl_la_SOURCES.
+
+2005-08-31 Wednesday 17:03 Matthew Mundell
+
+ * tests/Grid/bug1.dat, src/Grid_public.cc (grids.[3,54]): Enable
+ dumping and loading of the entire status.
+
+2005-08-31 Wednesday 16:58 Matthew Mundell
+
+ * src/Grid_Status.cc (grids.2): Append a newline to the ASCII dump.
+ ASCII dump on failure of the empty flag check in the OK method.
+ Correct the class name in the file header.
+
+2005-08-30 Tuesday 15:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.49): Do not override the output
+ function of PH.
+
+2005-08-30 Tuesday 15:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.55): Do not refer to nonexistent
+ constructors.
+
+2005-08-29 Monday 23:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: Makefile.am (1.14), ppl.m4 (1.1): Initial revision of an
+ Autoconf function to test for the existence and usability of
+ particular versions of the PPL, defining macros containing the
+ required paths.
+
+2005-08-29 Monday 18:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: tests/pl_check.pl (1.9),
+ Ciao/ciao_pl_check.pl (1.13), XSB/xsb_pl_check.P (1.18): Added
+ tests for Prolog interface predicates: bounded_affine_image,
+ bounded_affine_preimage, generalized_affine_preimage.
+
+2005-08-29 Monday 17:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Coefficient.defs.hh (1.4), Coefficient.inlines.hh (1.4),
+ Generator.cc (1.63), Linear_Row.cc (1.7), globals.defs.hh (1.22),
+ globals.inlines.hh (1.11), simplex.cc (1.11): Do use
+ Coefficient_traits where appropriate.
+
+2005-08-29 Monday 16:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.23), BD_Shape.inlines.hh (1.54): Using
+ Coefficient_traits where appropriate. Corrected a few comments.
+ Trying to clean up affine_image().
+
+2005-08-29 Monday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.22): No longer mention is_nonnegative().
+
+2005-08-29 Monday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: cc76extrapolation6.cc (1.5), ch78widening6.cc
+ (1.5), relations1.cc (1.7), relations2.cc (1.7), relations3.cc
+ (1.6), relations4.cc (1.5), relations5.cc (1.7): Added, when
+ needed, using directives for IO_Operators.
+
+2005-08-29 Monday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.53): No longer refer to the obsolete
+ function is_nonnegative().
+
+2005-08-29 Monday 09:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/gramshmidt1.cc (1.1): Draft test program for
+ Constraint_System::gram_shmidt().
+
+2005-08-28 Sunday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bounding_Box.inlines.hh (1.7), Polyhedron.inlines.hh
+ (1.117): Objects of type mpq_class now created properly.
+
+2005-08-28 Sunday 12:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.159), Ciao/ppl_ciao.pl
+ (1.81), GNU/ppl_gprolog.pl (1.53), SICStus/ppl_sicstus_sd.cc
+ (1.77), SWI/ppl_swiprolog.cc (1.101), XSB/ppl_xsb.H (1.40),
+ XSB/ppl_xsb.cc (1.68), YAP/ppl_yap.cc (1.93): Interfaced new
+ methods computing preimages of generalized affine relations.
+
+2005-08-28 Sunday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bounding_Box.inlines.hh (1.6): Temporary kludges to avoid the
+ selection of the wrong mpq_class constructor.
+
+2005-08-28 Sunday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_check_gmp.m4 (1.22), ac_check_swi_prolog.m4 (1.3),
+ ac_cxx_attribute_weak.m4 (1.6), ac_cxx_double_is_iec_559.m4
+ (1.4), ac_cxx_flexible_arrays.m4 (1.11),
+ ac_cxx_float_is_iec_559.m4 (1.4), ac_cxx_long_double.m4 (1.5),
+ ac_cxx_long_double_is_iec_559.m4 (1.4), ac_cxx_long_long.m4
+ (1.4): Broken comments restored.
+
+2005-08-28 Sunday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * missing (1.12), Watchdog/missing (1.8): Broken comments restored.
+
+2005-08-27 Saturday 23:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.8): Progress on the --ldflags option.
+
+2005-08-27 Saturday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.32), Watchdog/Makefile.am (1.21): The `configure'
+ script is now listed in `dist_noinst_SCRIPTS' and no longer in
+ `EXTRA_DIST'.
+
+2005-08-27 Saturday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.31), build_header (1.3), Watchdog/Makefile.am
+ (1.20), Watchdog/configure.ac (1.27), Watchdog/pwl_header.bottom
+ (1.3), Watchdog/pwl_header.hh (1.1), Watchdog/pwl_header.middle
+ (1.4), Watchdog/pwl_header.top (1.8), Watchdog/utils/.cvsignore
+ (1.1), Watchdog/utils/Makefile.am (1.1),
+ Watchdog/utils/build_header (1.1), src/Makefile.am (1.117),
+ utils/Makefile.am (1.6), utils/build_header (1.1): Definitely
+ switch to the new mechanism to build the library headers. The
+ `build_header' script belongs to the `utils' directories.
+
+2005-08-27 Saturday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.46): Fixed a couple of typos in
+ comments.
+
+2005-08-27 Saturday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.158), src/Bounding_Box.cc
+ (1.8), src/Bounding_Box.inlines.hh (1.5), src/Interval.cc (1.12),
+ src/Interval.defs.hh (1.24), src/Interval.inlines.hh (1.23),
+ src/Interval.types.hh (1.9), src/Polyhedron.inlines.hh (1.116),
+ src/checked_mpq.inlines.hh (1.22): Obsolete class ERational
+ removed. In the process, fixed a couple of bugs whereby GMP
+ rationals were created out of pairs of integers that could have
+ common factors, yet the canonicalize() method was not invoked.
+
+2005-08-27 Saturday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/Makefile.am (1.5): Ensure the `text2cxxarray' script is
+ distributed.
+
+2005-08-27 Saturday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/Makefile.am (1.4): The `text2cxxarray' script is now listed
+ in `noinst_SCRIPTS'.
+
+2005-08-27 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.171), src/checked_float.inlines.hh (1.41): Check
+ for the declaration of long double rintl(long double x): rintl()
+ is not provided on systems that do not have proper long doubles.
+
+2005-08-26 Friday 11:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.170): Comment restored.
+
+2005-08-26 Friday 10:04 Abramo Bagnara
+
+ * src/: checked.defs.hh (1.22), checked_ext.inlines.hh (1.20),
+ checked_float.inlines.hh (1.40), checked_int.inlines.hh (1.36),
+ checked_mpq.inlines.hh (1.21), checked_mpz.inlines.hh (1.25):
+ Finer grain for policy. New special values functions. Use
+ assertions when policy does not request checks.
+
+2005-08-26 Friday 10:02 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.36): Added special values
+ funcions.
+
+2005-08-26 Friday 10:01 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.31): Finer grain for policy.
+
+2005-08-25 Thursday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/E_NIT.defs.hh (1.6), src/E_NIT.inlines.hh (1.11),
+ src/E_NIT.types.hh (1.4), src/E_Rational.defs.hh (1.6),
+ src/E_Rational.inlines.hh (1.9), src/E_Rational.types.hh (1.4),
+ src/Makefile.am (1.116), tests/BD_Shape/maxspacedim.cc (1.6):
+ Obsolete classes E_NIT and E_Rational removed.
+
+2005-08-25 Thursday 18:37 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, limitedextrapolation1.cc
+ (grids.[26,1]): Add limitedextrapolation1.
+
+2005-08-25 Thursday 18:36 Matthew Mundell
+
+ * tests/Grid/widening1.cc (grids.2): Add congruences to the correct
+ grid in test5. Improve a comment. Use a definition for the
+ token count in test10. Take out the old test invocations.
+
+2005-08-25 Thursday 18:30 Matthew Mundell
+
+ * tests/Grid/relations2.cc (grids.3): Add test9, in which a grid
+ with a line strictly intersects a relational congruence.
+
+2005-08-25 Thursday 18:19 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_widenings.cc (grids.[37,2]): Add method
+ limited_extrapolation_assign. Improve the description of
+ dim_kinds. Rename the congruence parameter in the relation_with
+ declaration to cg.
+
+2005-08-25 Thursday 18:09 Matthew Mundell
+
+ * src/Grid_public.cc (grids.53): In relation_with(cg) only modulate
+ the scalar product for points and parameters.
+
+2005-08-25 Thursday 18:06 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.12): Swap dim_kinds in method swap.
+
+2005-08-23 Tuesday 22:07 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, widening1.cc (grids.[25,1]): Add
+ widening1.
+
+2005-08-23 Tuesday 22:06 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_widenings.cc (grids.[36,1]): Add methods
+ widening_assign and select_wider_congruences.
+
+2005-08-23 Tuesday 11:22 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Grid_conversion.cc, Grid_simplify.cc
+ (grids.[15,18,28]): Prefer postfix operators.
+
+2005-08-22 Monday 12:18 Matthew Mundell
+
+ * src/Grid_public.cc (grids.52): In OK check dim_kinds size before
+ checking upper triangularity.
+
+2005-08-22 Monday 07:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.sty (1.21): Restored comment broken with previous commit.
+
+2005-08-22 Monday 00:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.32), config.sub (1.31), Watchdog/config.guess
+ (1.16), Watchdog/config.sub (1.16): Updated.
+
+2005-08-22 Monday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING (1.3), Makefile.am (1.30), README (1.37),
+ README.configure (1.14), build_header (1.2), compile (1.6),
+ config.guess (1.31), config.rpath (1.4), config.sub (1.30),
+ configure.ac (1.169), depcomp (1.11), ltmain.sh (1.25), missing
+ (1.11), Watchdog/COPYING (1.3),
+ Watchdog/Doubly_Linked_Object.defs.hh (1.3),
+ Watchdog/Doubly_Linked_Object.inlines.hh (1.3),
+ Watchdog/EList.defs.hh (1.5), Watchdog/EList.inlines.hh (1.4),
+ Watchdog/EList_Iterator.defs.hh (1.3),
+ Watchdog/EList_Iterator.inlines.hh (1.4),
+ Watchdog/Handler.defs.hh (1.5), Watchdog/Handler.inlines.hh
+ (1.4), Watchdog/Makefile.am (1.19), Watchdog/Pending_Element.cc
+ (1.3), Watchdog/Pending_Element.defs.hh (1.3),
+ Watchdog/Pending_Element.inlines.hh (1.3),
+ Watchdog/Pending_List.cc (1.3), Watchdog/Pending_List.defs.hh
+ (1.3), Watchdog/Pending_List.inlines.hh (1.3), Watchdog/README
+ (1.11), Watchdog/Time.cc (1.3), Watchdog/Time.defs.hh (1.3),
+ Watchdog/Time.inlines.hh (1.4), Watchdog/Watchdog.cc (1.20),
+ Watchdog/Watchdog.defs.hh (1.16), Watchdog/Watchdog.inlines.hh
+ (1.13), Watchdog/compile (1.6), Watchdog/config.guess (1.15),
+ Watchdog/config.sub (1.15), Watchdog/configure.ac (1.26),
+ Watchdog/depcomp (1.9), Watchdog/ltmain.sh (1.14),
+ Watchdog/missing (1.7), Watchdog/pwl_header.top (1.7),
+ debian/libppl-pwl.copyright.in (1.2), debian/libppl.copyright.in
+ (1.2), demos/Makefile.am (1.7), demos/ppl_lcdd/Makefile.am
+ (1.20), demos/ppl_lcdd/ppl_lcdd.cc (1.44),
+ demos/ppl_lcdd/examples/Makefile.am (1.5),
+ demos/ppl_lpsol/Makefile.am (1.14), demos/ppl_lpsol/ppl_lpsol.c
+ (1.17), demos/ppl_lpsol/examples/Makefile.am (1.4),
+ doc/Makefile.am (1.35), doc/README.doc (1.5), doc/fdl.dox (1.7),
+ doc/fdl.tex (1.4), doc/fdl.txt (1.2), doc/gpl.dox (1.7),
+ doc/gpl.tex (1.3), doc/gpl.txt (1.3), doc/ppl.sty (1.20),
+ interfaces/Makefile.am (1.11), interfaces/C/Makefile.am (1.19),
+ interfaces/C/ppl_c.cc (1.136), interfaces/C/ppl_c.h.in (1.51),
+ interfaces/OCaml/Makefile.am (1.10),
+ interfaces/Prolog/Makefile.am (1.28),
+ interfaces/Prolog/Prolog_interface.dox (1.133),
+ interfaces/Prolog/exceptions.hh (1.16),
+ interfaces/Prolog/ppl_prolog.icc (1.157),
+ interfaces/Prolog/track_allocation.hh (1.17),
+ interfaces/Prolog/Ciao/Makefile.am (1.43),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.15),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.11),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.12),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.32),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.80),
+ interfaces/Prolog/GNU/Makefile.am (1.47),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.6),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.9),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.52),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.28),
+ interfaces/Prolog/SICStus/Makefile.am (1.53),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.25),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.76),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.5),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.6),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.12),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.12),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.4),
+ interfaces/Prolog/SWI/Makefile.am (1.51),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.9),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.8),
+ interfaces/Prolog/SWI/ppl_pl.cc (1.9),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.100),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.5),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.5),
+ interfaces/Prolog/XSB/Makefile.am (1.34),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.39),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.67),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.14),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.12),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.17),
+ interfaces/Prolog/YAP/Makefile.am (1.38),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.92),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.9),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.10),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.6),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.8),
+ interfaces/Prolog/tests/Makefile.am (1.5),
+ interfaces/Prolog/tests/clpq.pl (1.6),
+ interfaces/Prolog/tests/clpq2.pl (1.6),
+ interfaces/Prolog/tests/pl_check.pl (1.8), m4/Makefile.am (1.13),
+ m4/ac_check_gmp.m4 (1.21), m4/ac_check_swi_prolog.m4 (1.2),
+ m4/ac_cxx_attribute_weak.m4 (1.5), m4/ac_cxx_double_is_iec_559.m4
+ (1.3), m4/ac_cxx_flexible_arrays.m4 (1.10),
+ m4/ac_cxx_float_is_iec_559.m4 (1.3), m4/ac_cxx_long_double.m4
+ (1.4), m4/ac_cxx_long_double_is_iec_559.m4 (1.3),
+ m4/ac_cxx_long_long.m4 (1.3), src/Ask_Tell.defs.hh (1.5),
+ src/Ask_Tell.inlines.hh (1.5), src/BDS_Status.idefs.hh (1.7),
+ src/BDS_Status.inlines.hh (1.5), src/BD_Shape.defs.hh (1.21),
+ src/BD_Shape.inlines.hh (1.52), src/BHRZ03_Certificate.cc (1.8),
+ src/BHRZ03_Certificate.defs.hh (1.11),
+ src/BHRZ03_Certificate.inlines.hh (1.6), src/Bounding_Box.cc
+ (1.7), src/Bounding_Box.defs.hh (1.7),
+ src/Bounding_Box.inlines.hh (1.4), src/C_Polyhedron.cc (1.15),
+ src/C_Polyhedron.defs.hh (1.33), src/C_Polyhedron.inlines.hh
+ (1.26), src/Checked_Number.cc (1.7), src/Checked_Number.defs.hh
+ (1.30), src/Checked_Number.inlines.hh (1.35), src/Coefficient.cc
+ (1.3), src/Coefficient.defs.hh (1.3), src/Coefficient.inlines.hh
+ (1.3), src/Constraint.cc (1.51), src/Constraint.defs.hh (1.104),
+ src/Constraint.inlines.hh (1.60), src/Constraint_System.cc (1.8),
+ src/Constraint_System.defs.hh (1.10),
+ src/Constraint_System.inlines.hh (1.4), src/DB_Matrix.defs.hh
+ (1.5), src/DB_Matrix.inlines.hh (1.5), src/DB_Row.defs.hh (1.7),
+ src/DB_Row.inlines.hh (1.7), src/Determinate.defs.hh (1.55),
+ src/Determinate.inlines.hh (1.48), src/E_NIT.defs.hh (1.5),
+ src/E_NIT.inlines.hh (1.10), src/E_Rational.defs.hh (1.5),
+ src/E_Rational.inlines.hh (1.8), src/Float.defs.hh (1.8),
+ src/Float.inlines.hh (1.9), src/GMP_Integer.defs.hh (1.6),
+ src/GMP_Integer.inlines.hh (1.5), src/Generator.cc (1.62),
+ src/Generator.defs.hh (1.105), src/Generator.inlines.hh (1.55),
+ src/Generator_System.cc (1.7), src/Generator_System.defs.hh
+ (1.8), src/Generator_System.inlines.hh (1.4),
+ src/H79_Certificate.cc (1.7), src/H79_Certificate.defs.hh (1.10),
+ src/H79_Certificate.inlines.hh (1.5), src/Init.cc (1.18),
+ src/Init.defs.hh (1.13), src/Interval.cc (1.11),
+ src/Interval.defs.hh (1.23), src/Interval.inlines.hh (1.22),
+ src/Limits.hh (1.7), src/Linear_Expression.cc (1.5),
+ src/Linear_Expression.defs.hh (1.9),
+ src/Linear_Expression.inlines.hh (1.5), src/Linear_Row.cc (1.6),
+ src/Linear_Row.defs.hh (1.9), src/Linear_Row.inlines.hh (1.8),
+ src/Linear_System.cc (1.19), src/Linear_System.defs.hh (1.14),
+ src/Linear_System.inlines.hh (1.17), src/Makefile.am (1.115),
+ src/Matrix.cc (1.82), src/Matrix.defs.hh (1.69),
+ src/Matrix.inlines.hh (1.44), src/NNC_Polyhedron.cc (1.14),
+ src/NNC_Polyhedron.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh
+ (1.29), src/Native_Integer.defs.hh (1.11),
+ src/Native_Integer.inlines.hh (1.10), src/Numeric_Format.defs.hh
+ (1.4), src/Ph_Status.cc (1.7), src/Ph_Status.idefs.hh (1.10),
+ src/Ph_Status.inlines.hh (1.6), src/Poly_Con_Relation.cc (1.10),
+ src/Poly_Con_Relation.defs.hh (1.27),
+ src/Poly_Con_Relation.inlines.hh (1.13), src/Poly_Gen_Relation.cc
+ (1.10), src/Poly_Gen_Relation.defs.hh (1.25),
+ src/Poly_Gen_Relation.inlines.hh (1.13),
+ src/Polyhedra_Powerset.defs.hh (1.16),
+ src/Polyhedra_Powerset.inlines.hh (1.20), src/Polyhedron.defs.hh
+ (1.274), src/Polyhedron.inlines.hh (1.115),
+ src/Polyhedron_chdims.cc (1.30), src/Polyhedron_nonpublic.cc
+ (1.48), src/Polyhedron_public.cc (1.58),
+ src/Polyhedron_widenings.cc (1.45), src/Powerset.defs.hh (1.13),
+ src/Powerset.inlines.hh (1.10), src/Ptr_Iterator.defs.hh (1.4),
+ src/Ptr_Iterator.inlines.hh (1.4), src/Result.defs.hh (1.10),
+ src/Result.inlines.hh (1.6), src/Rounding.defs.hh (1.13),
+ src/Rounding.types.hh (1.4), src/Row.cc (1.81), src/Row.defs.hh
+ (1.94), src/Row.inlines.hh (1.61), src/Saturation_Matrix.cc
+ (1.4), src/Saturation_Matrix.defs.hh (1.3),
+ src/Saturation_Matrix.inlines.hh (1.4), src/Saturation_Row.cc
+ (1.7), src/Saturation_Row.defs.hh (1.6),
+ src/Saturation_Row.inlines.hh (1.6), src/Variable.cc (1.19),
+ src/Variable.defs.hh (1.46), src/Variable.inlines.hh (1.22),
+ src/Widening_Function.defs.hh (1.11),
+ src/Widening_Function.inlines.hh (1.10), src/algorithms.hh
+ (1.41), src/checked.cc (1.3), src/checked.defs.hh (1.21),
+ src/checked.inlines.hh (1.20), src/checked_ext.defs.hh (1.8),
+ src/checked_ext.inlines.hh (1.19), src/checked_float.inlines.hh
+ (1.39), src/checked_int.inlines.hh (1.35),
+ src/checked_mpq.inlines.hh (1.20), src/checked_mpz.inlines.hh
+ (1.24), src/checked_numeric_limits.hh (1.4), src/compiler.hh
+ (1.5), src/conversion.cc (1.69), src/float.types.hh (1.8),
+ src/fpu-c99.inlines.hh (1.7), src/fpu-ia32.inlines.hh (1.7),
+ src/fpu-none.inlines.hh (1.2), src/fpu.defs.hh (1.5),
+ src/globals.cc (1.21), src/globals.defs.hh (1.21),
+ src/globals.inlines.hh (1.10), src/initializer.hh (1.11),
+ src/max_space_dimension.hh (1.6), src/minimize.cc (1.41),
+ src/namespaces.hh (1.2), src/ppl-config.cc.in (1.7),
+ src/ppl_header.hh (1.3), src/simplex.cc (1.10), src/simplify.cc
+ (1.43), src/swapping_sort.icc (1.9), src/version.cc (1.6),
+ src/version.hh.in (1.11), tests/BBox.cc (1.10), tests/BBox.hh
+ (1.9), tests/Makefile.am (1.243), tests/PFunction.cc (1.7),
+ tests/PFunction.hh (1.7), tests/ehandlers.cc (1.7),
+ tests/ehandlers.hh (1.12), tests/files.cc (1.7), tests/files.hh
+ (1.8), tests/ppl_test.hh (1.24), tests/print.cc (1.16),
+ tests/print.hh (1.20), tests/BD_Shape/Makefile.am (1.13),
+ tests/BD_Shape/addconstraints1.cc (1.4),
+ tests/BD_Shape/addspacedims1.cc (1.5),
+ tests/BD_Shape/addspacedims2.cc (1.5),
+ tests/BD_Shape/addspacedims3.cc (1.6),
+ tests/BD_Shape/addspacedims4.cc (1.6),
+ tests/BD_Shape/addspacedims5.cc (1.6),
+ tests/BD_Shape/addspacedims6.cc (1.6),
+ tests/BD_Shape/addspacedims7.cc (1.5),
+ tests/BD_Shape/affineimage1.cc (1.5),
+ tests/BD_Shape/affineimage2.cc (1.5),
+ tests/BD_Shape/affineimage3.cc (1.5),
+ tests/BD_Shape/affineimage4.cc (1.5),
+ tests/BD_Shape/affineimage5.cc (1.5),
+ tests/BD_Shape/affineimage6.cc (1.5),
+ tests/BD_Shape/affineimage7.cc (1.5),
+ tests/BD_Shape/affineimage8.cc (1.3),
+ tests/BD_Shape/affineimage9.cc (1.3),
+ tests/BD_Shape/affinepreimage1.cc (1.5),
+ tests/BD_Shape/affinepreimage2.cc (1.5),
+ tests/BD_Shape/affinepreimage3.cc (1.5),
+ tests/BD_Shape/affinepreimage4.cc (1.5),
+ tests/BD_Shape/affinepreimage5.cc (1.3),
+ tests/BD_Shape/ascii_dump_load1.cc (1.6),
+ tests/BD_Shape/ascii_dump_load2.cc (1.4),
+ tests/BD_Shape/cc76extrapolation1.cc (1.4),
+ tests/BD_Shape/cc76extrapolation2.cc (1.4),
+ tests/BD_Shape/cc76extrapolation3.cc (1.4),
+ tests/BD_Shape/cc76extrapolation4.cc (1.5),
+ tests/BD_Shape/cc76extrapolation5.cc (1.4),
+ tests/BD_Shape/cc76extrapolation6.cc (1.4),
+ tests/BD_Shape/cc76narrowing1.cc (1.4),
+ tests/BD_Shape/cc76narrowing2.cc (1.4),
+ tests/BD_Shape/cc76narrowing3.cc (1.4),
+ tests/BD_Shape/cc76narrowing4.cc (1.5),
+ tests/BD_Shape/cc76narrowing5.cc (1.5),
+ tests/BD_Shape/ch78widening1.cc (1.4),
+ tests/BD_Shape/ch78widening2.cc (1.5),
+ tests/BD_Shape/ch78widening3.cc (1.4),
+ tests/BD_Shape/ch78widening4.cc (1.4),
+ tests/BD_Shape/ch78widening5.cc (1.5),
+ tests/BD_Shape/ch78widening6.cc (1.4),
+ tests/BD_Shape/ch78widening7.cc (1.4),
+ tests/BD_Shape/ch78widening8.cc (1.4),
+ tests/BD_Shape/concatenate1.cc (1.5),
+ tests/BD_Shape/concatenate2.cc (1.5),
+ tests/BD_Shape/concatenate3.cc (1.4),
+ tests/BD_Shape/concatenate4.cc (1.4),
+ tests/BD_Shape/concatenate5.cc (1.5),
+ tests/BD_Shape/constraints1.cc (1.6),
+ tests/BD_Shape/constraints2.cc (1.5), tests/BD_Shape/contains1.cc
+ (1.4), tests/BD_Shape/contains2.cc (1.6),
+ tests/BD_Shape/contains3.cc (1.6), tests/BD_Shape/empty1.cc
+ (1.4), tests/BD_Shape/empty2.cc (1.4), tests/BD_Shape/empty3.cc
+ (1.5), tests/BD_Shape/empty4.cc (1.4), tests/BD_Shape/empty5.cc
+ (1.4), tests/BD_Shape/equality1.cc (1.6),
+ tests/BD_Shape/exceptions1.cc (1.5),
+ tests/BD_Shape/exceptions2.cc (1.5),
+ tests/BD_Shape/exceptions3.cc (1.7),
+ tests/BD_Shape/fromgensys1.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage10.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage11.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage12.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage13.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage14.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage3.cc (1.6),
+ tests/BD_Shape/generalizedaffineimage4.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage5.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage6.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage7.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage8.cc (1.5),
+ tests/BD_Shape/generalizedaffineimage9.cc (1.4),
+ tests/BD_Shape/h79widening1.cc (1.4),
+ tests/BD_Shape/intersection1.cc (1.4),
+ tests/BD_Shape/intersection2.cc (1.4),
+ tests/BD_Shape/intersection3.cc (1.5),
+ tests/BD_Shape/intersection4.cc (1.6),
+ tests/BD_Shape/intersection5.cc (1.6),
+ tests/BD_Shape/intersection6.cc (1.5),
+ tests/BD_Shape/intersection7.cc (1.5),
+ tests/BD_Shape/intersection8.cc (1.5),
+ tests/BD_Shape/limitedCC76extrapolation1.cc (1.4),
+ tests/BD_Shape/limitedCC76extrapolation2.cc (1.5),
+ tests/BD_Shape/limitedCC76extrapolation3.cc (1.5),
+ tests/BD_Shape/limitedCH78extrapolation1.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation2.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation3.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation4.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation5.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation6.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation7.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation8.cc (1.4),
+ tests/BD_Shape/limitedCH78extrapolation9.cc (1.4),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.4),
+ tests/BD_Shape/mapspacedims1.cc (1.4),
+ tests/BD_Shape/mapspacedims2.cc (1.5),
+ tests/BD_Shape/mapspacedims3.cc (1.4),
+ tests/BD_Shape/mapspacedims4.cc (1.5),
+ tests/BD_Shape/maxspacedim.cc (1.5),
+ tests/BD_Shape/polydifference1.cc (1.6),
+ tests/BD_Shape/polydifference2.cc (1.4),
+ tests/BD_Shape/polydifference3.cc (1.4),
+ tests/BD_Shape/polydifference4.cc (1.4),
+ tests/BD_Shape/polydifference5.cc (1.5),
+ tests/BD_Shape/polydifference6.cc (1.4),
+ tests/BD_Shape/polyhull1.cc (1.4), tests/BD_Shape/polyhull2.cc
+ (1.4), tests/BD_Shape/polyhull3.cc (1.4),
+ tests/BD_Shape/polyhull4.cc (1.4), tests/BD_Shape/relations1.cc
+ (1.6), tests/BD_Shape/relations2.cc (1.6),
+ tests/BD_Shape/relations3.cc (1.5), tests/BD_Shape/relations4.cc
+ (1.4), tests/BD_Shape/relations5.cc (1.6),
+ tests/BD_Shape/removespacedims1.cc (1.5),
+ tests/BD_Shape/removespacedims2.cc (1.5),
+ tests/BD_Shape/removespacedims3.cc (1.5),
+ tests/BD_Shape/timeelapse1.cc (1.5),
+ tests/BD_Shape/timeelapse2.cc (1.4),
+ tests/BD_Shape/timeelapse3.cc (1.4),
+ tests/BD_Shape/timeelapse4.cc (1.4),
+ tests/BD_Shape/timeelapse5.cc (1.5), tests/BD_Shape/universe1.cc
+ (1.5), tests/BD_Shape/writebdshape1.cc (1.2),
+ tests/BD_Shape/writebdshape2.cc (1.3),
+ tests/Polyhedron/CbecomesNNC1.cc (1.4),
+ tests/Polyhedron/Makefile.am (1.25),
+ tests/Polyhedron/NNCbecomesC1.cc (1.4),
+ tests/Polyhedron/NNCminimize1.cc (1.4),
+ tests/Polyhedron/NNCminimize2.cc (1.4),
+ tests/Polyhedron/NNCminimize3.cc (1.4),
+ tests/Polyhedron/NNCminimize4.cc (1.4),
+ tests/Polyhedron/NNCminimize5.cc (1.4),
+ tests/Polyhedron/NNCminimize6.cc (1.4), tests/Polyhedron/README
+ (1.4), tests/Polyhedron/addconstraint1.cc (1.4),
+ tests/Polyhedron/addconstraint2.cc (1.5),
+ tests/Polyhedron/addconstraint3.cc (1.4),
+ tests/Polyhedron/addconstraints1.cc (1.5),
+ tests/Polyhedron/addconstraints10.cc (1.5),
+ tests/Polyhedron/addconstraints11.cc (1.4),
+ tests/Polyhedron/addconstraints12.cc (1.4),
+ tests/Polyhedron/addconstraints13.cc (1.5),
+ tests/Polyhedron/addconstraints2.cc (1.4),
+ tests/Polyhedron/addconstraints3.cc (1.5),
+ tests/Polyhedron/addconstraints4.cc (1.4),
+ tests/Polyhedron/addconstraints5.cc (1.5),
+ tests/Polyhedron/addconstraints6.cc (1.4),
+ tests/Polyhedron/addconstraints7.cc (1.5),
+ tests/Polyhedron/addconstraints8.cc (1.5),
+ tests/Polyhedron/addconstraints9.cc (1.4),
+ tests/Polyhedron/addgenerator1.cc (1.5),
+ tests/Polyhedron/addgenerator2.cc (1.5),
+ tests/Polyhedron/addgenerator3.cc (1.4),
+ tests/Polyhedron/addgenerator4.cc (1.5),
+ tests/Polyhedron/addgenerator5.cc (1.5),
+ tests/Polyhedron/addgenerators1.cc (1.5),
+ tests/Polyhedron/addgenerators10.cc (1.5),
+ tests/Polyhedron/addgenerators11.cc (1.5),
+ tests/Polyhedron/addgenerators12.cc (1.5),
+ tests/Polyhedron/addgenerators13.cc (1.5),
+ tests/Polyhedron/addgenerators2.cc (1.5),
+ tests/Polyhedron/addgenerators3.cc (1.4),
+ tests/Polyhedron/addgenerators4.cc (1.4),
+ tests/Polyhedron/addgenerators5.cc (1.4),
+ tests/Polyhedron/addgenerators6.cc (1.5),
+ tests/Polyhedron/addgenerators7.cc (1.4),
+ tests/Polyhedron/addgenerators8.cc (1.5),
+ tests/Polyhedron/addgenerators9.cc (1.4),
+ tests/Polyhedron/addspacedims1.cc (1.5),
+ tests/Polyhedron/addspacedims10.cc (1.4),
+ tests/Polyhedron/addspacedims11.cc (1.4),
+ tests/Polyhedron/addspacedims12.cc (1.4),
+ tests/Polyhedron/addspacedims13.cc (1.4),
+ tests/Polyhedron/addspacedims2.cc (1.5),
+ tests/Polyhedron/addspacedims3.cc (1.5),
+ tests/Polyhedron/addspacedims4.cc (1.4),
+ tests/Polyhedron/addspacedims5.cc (1.4),
+ tests/Polyhedron/addspacedims6.cc (1.4),
+ tests/Polyhedron/addspacedims7.cc (1.4),
+ tests/Polyhedron/addspacedims8.cc (1.5),
+ tests/Polyhedron/addspacedims9.cc (1.4),
+ tests/Polyhedron/affineimage1.cc (1.5),
+ tests/Polyhedron/affineimage2.cc (1.4),
+ tests/Polyhedron/affineimage3.cc (1.4),
+ tests/Polyhedron/affineimage4.cc (1.5),
+ tests/Polyhedron/affineimage5.cc (1.5),
+ tests/Polyhedron/affineimage6.cc (1.5),
+ tests/Polyhedron/affineimage7.cc (1.4),
+ tests/Polyhedron/affineimage8.cc (1.4),
+ tests/Polyhedron/affineimage9.cc (1.4),
+ tests/Polyhedron/affinepreimage1.cc (1.4),
+ tests/Polyhedron/affinepreimage10.cc (1.4),
+ tests/Polyhedron/affinepreimage11.cc (1.2),
+ tests/Polyhedron/affinepreimage2.cc (1.4),
+ tests/Polyhedron/affinepreimage3.cc (1.5),
+ tests/Polyhedron/affinepreimage4.cc (1.4),
+ tests/Polyhedron/affinepreimage5.cc (1.4),
+ tests/Polyhedron/affinepreimage6.cc (1.4),
+ tests/Polyhedron/affinepreimage7.cc (1.4),
+ tests/Polyhedron/affinepreimage8.cc (1.5),
+ tests/Polyhedron/affinepreimage9.cc (1.4),
+ tests/Polyhedron/affinetrans.cc (1.5),
+ tests/Polyhedron/append1.cc (1.4), tests/Polyhedron/append2.cc
+ (1.4), tests/Polyhedron/ascii_dump_load1.cc (1.4),
+ tests/Polyhedron/ascii_dump_load2.cc (1.4),
+ tests/Polyhedron/ascii_dump_load3.cc (1.4),
+ tests/Polyhedron/ascii_dump_load4.cc (1.4),
+ tests/Polyhedron/ascii_dump_load5.cc (1.4),
+ tests/Polyhedron/ascii_dump_load6.cc (1.5),
+ tests/Polyhedron/ascii_dump_load7.cc (1.4),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.5),
+ tests/Polyhedron/bgp99extrapolation2.cc (1.5),
+ tests/Polyhedron/bhrz03widening1.cc (1.4),
+ tests/Polyhedron/bhrz03widening10.cc (1.5),
+ tests/Polyhedron/bhrz03widening11.cc (1.4),
+ tests/Polyhedron/bhrz03widening12.cc (1.4),
+ tests/Polyhedron/bhrz03widening13.cc (1.4),
+ tests/Polyhedron/bhrz03widening14.cc (1.4),
+ tests/Polyhedron/bhrz03widening15.cc (1.5),
+ tests/Polyhedron/bhrz03widening16.cc (1.4),
+ tests/Polyhedron/bhrz03widening17.cc (1.4),
+ tests/Polyhedron/bhrz03widening18.cc (1.4),
+ tests/Polyhedron/bhrz03widening19.cc (1.4),
+ tests/Polyhedron/bhrz03widening2.cc (1.4),
+ tests/Polyhedron/bhrz03widening3.cc (1.4),
+ tests/Polyhedron/bhrz03widening4.cc (1.4),
+ tests/Polyhedron/bhrz03widening5.cc (1.4),
+ tests/Polyhedron/bhrz03widening6.cc (1.4),
+ tests/Polyhedron/bhrz03widening7.cc (1.4),
+ tests/Polyhedron/bhrz03widening8.cc (1.4),
+ tests/Polyhedron/bhrz03widening9.cc (1.4),
+ tests/Polyhedron/bhz03widening1.cc (1.5),
+ tests/Polyhedron/bhz03widening2.cc (1.5),
+ tests/Polyhedron/bhz03widening3.cc (1.5),
+ tests/Polyhedron/bhz03widening4.cc (1.5),
+ tests/Polyhedron/bhz03widening5.cc (1.5),
+ tests/Polyhedron/bhz03widening6.cc (1.5),
+ tests/Polyhedron/bounded1.cc (1.5),
+ tests/Polyhedron/boundedaffineimage1.cc (1.3),
+ tests/Polyhedron/boundedaffineimage2.cc (1.2),
+ tests/Polyhedron/boundedaffineimage3.cc (1.2),
+ tests/Polyhedron/boundedaffinepreimage1.cc (1.2),
+ tests/Polyhedron/boundedaffinepreimage2.cc (1.2),
+ tests/Polyhedron/boundedaffinepreimage3.cc (1.2),
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.3),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.5),
+ tests/Polyhedron/boundingbox1.cc (1.5),
+ tests/Polyhedron/boundingbox2.cc (1.5),
+ tests/Polyhedron/boundingbox3.cc (1.5),
+ tests/Polyhedron/boundingbox4.cc (1.5),
+ tests/Polyhedron/boundingbox5.cc (1.5),
+ tests/Polyhedron/bounds1.cc (1.5), tests/Polyhedron/bounds2.cc
+ (1.4), tests/Polyhedron/bug2.cc (1.3),
+ tests/Polyhedron/concatenate1.cc (1.4),
+ tests/Polyhedron/concatenate2.cc (1.5),
+ tests/Polyhedron/concatenate3.cc (1.4),
+ tests/Polyhedron/concatenate4.cc (1.4),
+ tests/Polyhedron/concatenate5.cc (1.4),
+ tests/Polyhedron/concatenate6.cc (1.5),
+ tests/Polyhedron/concatenate7.cc (1.3),
+ tests/Polyhedron/constraints1.cc (1.4),
+ tests/Polyhedron/constraints2.cc (1.5),
+ tests/Polyhedron/constraints3.cc (1.4),
+ tests/Polyhedron/constraints4.cc (1.5),
+ tests/Polyhedron/constraints5.cc (1.3),
+ tests/Polyhedron/contains1.cc (1.4),
+ tests/Polyhedron/contains2.cc (1.4),
+ tests/Polyhedron/contains3.cc (1.4),
+ tests/Polyhedron/contains4.cc (1.4),
+ tests/Polyhedron/contains5.cc (1.4),
+ tests/Polyhedron/disjoint1.cc (1.4),
+ tests/Polyhedron/disjoint2.cc (1.5),
+ tests/Polyhedron/disjoint3.cc (1.5),
+ tests/Polyhedron/dualhypercubes.cc (1.4),
+ tests/Polyhedron/empty1.cc (1.5), tests/Polyhedron/equals1.cc
+ (1.4), tests/Polyhedron/exceptions1.cc (1.6),
+ tests/Polyhedron/exceptions2.cc (1.5),
+ tests/Polyhedron/exceptions3.cc (1.6),
+ tests/Polyhedron/expandspacedim1.cc (1.5),
+ tests/Polyhedron/expandspacedim2.cc (1.5),
+ tests/Polyhedron/foldspacedims1.cc (1.5),
+ tests/Polyhedron/foldspacedims2.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage10.cc (1.4),
+ tests/Polyhedron/generalizedaffineimage11.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage12.cc (1.4),
+ tests/Polyhedron/generalizedaffineimage13.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage14.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage3.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage4.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage5.cc (1.4),
+ tests/Polyhedron/generalizedaffineimage6.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage7.cc (1.5),
+ tests/Polyhedron/generalizedaffineimage8.cc (1.4),
+ tests/Polyhedron/generalizedaffineimage9.cc (1.4),
+ tests/Polyhedron/generalizedaffinepreimage1.cc (1.2),
+ tests/Polyhedron/generalizedaffinepreimage2.cc (1.2),
+ tests/Polyhedron/generalizedaffinepreimage3.cc (1.2),
+ tests/Polyhedron/generalizedaffinepreimage4.cc (1.2),
+ tests/Polyhedron/generators1.cc (1.4),
+ tests/Polyhedron/generators2.cc (1.4),
+ tests/Polyhedron/generators3.cc (1.5),
+ tests/Polyhedron/generators4.cc (1.5),
+ tests/Polyhedron/generators5.cc (1.4),
+ tests/Polyhedron/generators6.cc (1.5),
+ tests/Polyhedron/generators7.cc (1.4),
+ tests/Polyhedron/geomcovers1.cc (1.5),
+ tests/Polyhedron/h79widening1.cc (1.4),
+ tests/Polyhedron/h79widening2.cc (1.4),
+ tests/Polyhedron/h79widening3.cc (1.4),
+ tests/Polyhedron/h79widening4.cc (1.4),
+ tests/Polyhedron/h79widening5.cc (1.5),
+ tests/Polyhedron/h79widening6.cc (1.4),
+ tests/Polyhedron/h79widening7.cc (1.4),
+ tests/Polyhedron/h79widening8.cc (1.4),
+ tests/Polyhedron/intersection1.cc (1.4),
+ tests/Polyhedron/intersection10.cc (1.5),
+ tests/Polyhedron/intersection11.cc (1.5),
+ tests/Polyhedron/intersection2.cc (1.4),
+ tests/Polyhedron/intersection3.cc (1.4),
+ tests/Polyhedron/intersection4.cc (1.5),
+ tests/Polyhedron/intersection5.cc (1.5),
+ tests/Polyhedron/intersection6.cc (1.5),
+ tests/Polyhedron/intersection7.cc (1.4),
+ tests/Polyhedron/intersection8.cc (1.5),
+ tests/Polyhedron/intersection9.cc (1.5),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.4),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.4),
+ tests/Polyhedron/limitedh79extrapolation2.cc (1.4),
+ tests/Polyhedron/limitedh79extrapolation3.cc (1.4),
+ tests/Polyhedron/limitedh79extrapolation4.cc (1.5),
+ tests/Polyhedron/linearpartition1.cc (1.4),
+ tests/Polyhedron/linearpartition2.cc (1.4),
+ tests/Polyhedron/linearpartition3.cc (1.4),
+ tests/Polyhedron/linearpartition4.cc (1.5),
+ tests/Polyhedron/linexpression1.cc (1.4),
+ tests/Polyhedron/mapspacedims1.cc (1.5),
+ tests/Polyhedron/mapspacedims2.cc (1.4),
+ tests/Polyhedron/mapspacedims3.cc (1.4),
+ tests/Polyhedron/mapspacedims4.cc (1.4),
+ tests/Polyhedron/max_min1.cc (1.4), tests/Polyhedron/max_min2.cc
+ (1.4), tests/Polyhedron/maxspacedim1.cc (1.4),
+ tests/Polyhedron/mc91.cc (1.5), tests/Polyhedron/membytes1.cc
+ (1.5), tests/Polyhedron/membytes2.cc (1.4),
+ tests/Polyhedron/memory1.cc (1.6), tests/Polyhedron/memory2.cc
+ (1.9), tests/Polyhedron/minconstraints1.cc (1.4),
+ tests/Polyhedron/minconstraints2.cc (1.5),
+ tests/Polyhedron/minconstraints3.cc (1.4),
+ tests/Polyhedron/minconstraints4.cc (1.4),
+ tests/Polyhedron/mingenerators1.cc (1.4),
+ tests/Polyhedron/mingenerators2.cc (1.5),
+ tests/Polyhedron/mingenerators3.cc (1.4),
+ tests/Polyhedron/onepoint.cc (1.5), tests/Polyhedron/permute.cc
+ (1.4), tests/Polyhedron/polydifference1.cc (1.4),
+ tests/Polyhedron/polydifference2.cc (1.4),
+ tests/Polyhedron/polydifference3.cc (1.4),
+ tests/Polyhedron/polydifference4.cc (1.5),
+ tests/Polyhedron/polydifference5.cc (1.4),
+ tests/Polyhedron/polydifference6.cc (1.4),
+ tests/Polyhedron/polydifference7.cc (1.5),
+ tests/Polyhedron/polydifference8.cc (1.4),
+ tests/Polyhedron/polydifference9.cc (1.5),
+ tests/Polyhedron/polyhull1.cc (1.4),
+ tests/Polyhedron/polyhull10.cc (1.4),
+ tests/Polyhedron/polyhull11.cc (1.4),
+ tests/Polyhedron/polyhull2.cc (1.5),
+ tests/Polyhedron/polyhull3.cc (1.5),
+ tests/Polyhedron/polyhull4.cc (1.4),
+ tests/Polyhedron/polyhull5.cc (1.5),
+ tests/Polyhedron/polyhull6.cc (1.4),
+ tests/Polyhedron/polyhull7.cc (1.4),
+ tests/Polyhedron/polyhull8.cc (1.5),
+ tests/Polyhedron/polyhull9.cc (1.5),
+ tests/Polyhedron/polypowerset1.cc (1.4),
+ tests/Polyhedron/randphull1.cc (1.5),
+ tests/Polyhedron/randphull2.cc (1.6),
+ tests/Polyhedron/relations1.cc (1.4),
+ tests/Polyhedron/relations10.cc (1.4),
+ tests/Polyhedron/relations11.cc (1.4),
+ tests/Polyhedron/relations12.cc (1.4),
+ tests/Polyhedron/relations13.cc (1.4),
+ tests/Polyhedron/relations14.cc (1.4),
+ tests/Polyhedron/relations15.cc (1.4),
+ tests/Polyhedron/relations16.cc (1.4),
+ tests/Polyhedron/relations17.cc (1.5),
+ tests/Polyhedron/relations18.cc (1.4),
+ tests/Polyhedron/relations19.cc (1.5),
+ tests/Polyhedron/relations2.cc (1.5),
+ tests/Polyhedron/relations3.cc (1.4),
+ tests/Polyhedron/relations4.cc (1.4),
+ tests/Polyhedron/relations5.cc (1.4),
+ tests/Polyhedron/relations6.cc (1.5),
+ tests/Polyhedron/relations7.cc (1.4),
+ tests/Polyhedron/relations8.cc (1.4),
+ tests/Polyhedron/relations9.cc (1.4),
+ tests/Polyhedron/removespacedims1.cc (1.4),
+ tests/Polyhedron/removespacedims10.cc (1.5),
+ tests/Polyhedron/removespacedims2.cc (1.4),
+ tests/Polyhedron/removespacedims3.cc (1.5),
+ tests/Polyhedron/removespacedims4.cc (1.4),
+ tests/Polyhedron/removespacedims5.cc (1.5),
+ tests/Polyhedron/removespacedims6.cc (1.4),
+ tests/Polyhedron/removespacedims7.cc (1.4),
+ tests/Polyhedron/removespacedims8.cc (1.4),
+ tests/Polyhedron/removespacedims9.cc (1.4),
+ tests/Polyhedron/smm1.cc (1.4), tests/Polyhedron/timeelapse1.cc
+ (1.4), tests/Polyhedron/timeelapse2.cc (1.5),
+ tests/Polyhedron/timeelapse3.cc (1.4),
+ tests/Polyhedron/timeelapse4.cc (1.4),
+ tests/Polyhedron/timeelapse5.cc (1.5),
+ tests/Polyhedron/timeelapse6.cc (1.4),
+ tests/Polyhedron/timeelapse7.cc (1.5),
+ tests/Polyhedron/timeelapse8.cc (1.5),
+ tests/Polyhedron/timeelapse9.cc (1.5),
+ tests/Polyhedron/topclosed1.cc (1.5),
+ tests/Polyhedron/topclosed2.cc (1.5),
+ tests/Polyhedron/topclosed3.cc (1.4),
+ tests/Polyhedron/topclosure1.cc (1.4),
+ tests/Polyhedron/topclosure2.cc (1.5),
+ tests/Polyhedron/topclosure3.cc (1.4),
+ tests/Polyhedron/topclosure4.cc (1.5),
+ tests/Polyhedron/universe1.cc (1.4),
+ tests/Polyhedron/universe2.cc (1.4),
+ tests/Polyhedron/universe3.cc (1.4),
+ tests/Polyhedron/universe4.cc (1.4),
+ tests/Polyhedron/universe5.cc (1.4),
+ tests/Polyhedron/universe6.cc (1.4),
+ tests/Polyhedron/universe7.cc (1.4),
+ tests/Polyhedron/watchdog1.cc (1.5),
+ tests/Polyhedron/writeconsys1.cc (1.4),
+ tests/Polyhedron/writegensys1.cc (1.4),
+ tests/Polyhedron/writegensys2.cc (1.5),
+ tests/Polyhedron/writegensys3.cc (1.4),
+ tests/Polyhedron/writepolyhedron1.cc (1.4),
+ tests/Polyhedron/writepolyhedron2.cc (1.4),
+ tests/Polyhedron/writepolyhedron3.cc (1.4),
+ tests/Polyhedron/writerelation1.cc (1.4),
+ tests/Polyhedron/writevariable1.cc (1.4), utils/Makefile.am
+ (1.3), utils/text2cxxarray (1.2), utils/timings.cc (1.4),
+ utils/timings.hh (1.3): Address of the Free Software Foundation
+ updated.
+
+2005-08-21 Sunday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.6): The --libs option has been removed
+ (could not assign a decent semantics to it).
+
+2005-08-21 Sunday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.5): Completed the work announced in the
+ previous commit.
+
+2005-08-21 Sunday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.4): Implemented the --interface option.
+ Keywords are now case-insensitive.
+
+2005-08-21 Sunday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.3): Added the --coefficients option.
+
+2005-08-21 Sunday 01:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc.in (1.2): Several improvements and new options.
+
+2005-08-20 Saturday 16:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.168), src/Makefile.am (1.114), src/ppl-config.cc
+ (1.6), src/ppl-config.cc.in (1.1): A new implementation technique
+ for `ppl-config' allows to deal with package relocations.
+
+2005-08-20 Saturday 00:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc (1.5): New option --banner.
+
+2005-08-20 Saturday 00:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc (1.4): Output format `raw' renamed `plain'.
+ New output format `makefile'.
+
+2005-08-19 Friday 23:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.113), ppl-config.cc (1.3): Added support for
+ the --prefix and the --exec-prefix options.
+
+2005-08-19 Friday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.167): Version number bumped.
+
+2005-08-19 Friday 13:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl-config.cc (1.2): Added an option to print the `configure'
+ options.
+
+2005-08-19 Friday 13:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.166): Keep track of the options with which
+ `configure' was invoked.
+
+2005-08-19 Friday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.112), ppl-config.cc (1.1): The ppl-config
+ program allows to enquire about the configuration of the PPL and
+ of the applications using it.
+
+2005-08-19 Friday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/text2cxxarray (1.1): Convert an ASCII text into the
+ declaration of a C++ array.
+
+2005-08-18 Thursday 20:49 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, timeelapse1.cc (grids.[24,1]): Add
+ timeelapse1.
+
+2005-08-18 Thursday 20:45 Matthew Mundell
+
+ * src/Grid_public.cc (grids.51): Enable method time_elapse_assign.
+
+2005-08-18 Thursday 20:44 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.25): Improve temporary comment.
+
+2005-08-18 Thursday 15:34 Matthew Mundell
+
+ * src/Grid_public.cc (grids.50): Check for points before adding
+ lines in generalized_affine_image(lhs,rhs,m).
+
+2005-08-18 Thursday 15:24 Matthew Mundell
+
+ * tests/Grid/griddifference1.cc (grids.3): Add test11, in which
+ many 2-complements are added to the result.
+
+2005-08-18 Thursday 12:59 Matthew Mundell
+
+ * tests/Grid/griddifference1.cc (grids.2): Add test10.
+
+2005-08-18 Thursday 12:21 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, generalizedaffinepreimage1.cc,
+ generalizedaffinepreimage2.cc (grids.[23,1,1]): Add partial tests
+ generalizedaffinepreimage1 and generalizedaffinepreimage2.
+
+2005-08-18 Thursday 12:18 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[35,49]): Add the
+ generalized_affine_preimage methods.
+
+2005-08-18 Thursday 12:16 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.19): Add a comment.
+
+2005-08-18 Thursday 12:15 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.14): Declare Linear_Expression a
+ friend.
+
+2005-08-17 Wednesday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.50): Added
+ -I$(SWI_PROLOG_INCLUDE_DIRECTORY) to AM_CPPFLAGS.
+
+2005-08-17 Wednesday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.165): Use AC_CHECK_SWI_PROLOG to perform the
+ checks for SWI Prolog.
+
+2005-08-17 Wednesday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_swi_prolog.m4 (1.1): The new AC_CHECK_SWI_PROLOG
+ function performs check for SWI Prolog by invoking the SWI-Prolog
+ executable with `-dump-runtime-variables' option and interpreting
+ the results.
+
+2005-08-17 Wednesday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.24): Added
+ boundedaffinepreimage2, generalizedaffinepreimage3,
+ nnc_boundedaffinepreimage2 and nnc_generalizedaffinepreimage3 to
+ XFAIL_WITH_INT8.
+
+2005-08-16 Tuesday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.49): Removed the "-goal
+ main" options from the invocations of `plld'.
+
+2005-08-16 Tuesday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.132): Stray \endcode
+ fixed. Formatting improvements.
+
+2005-08-16 Tuesday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PFunction.cc (1.6): Code formatting improved.
+
+2005-08-16 Tuesday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.157): Announced new methods for computing preimages.
+
+2005-08-16 Tuesday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.57): Corrected error in the
+ implementation of generalized_affine_(pre)image.
+
+2005-08-16 Tuesday 14:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.135), ppl_c.h.in (1.50): Interfaced
+ new methods for computing affine preimages.
+
+2005-08-16 Tuesday 12:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.173): Had another try at explaining the
+ shorthand notation for affine relations.
+
+2005-08-16 Tuesday 11:44 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, griddifference1.cc (grids.[22,1]): Add
+ griddifference1.
+
+2005-08-16 Tuesday 11:43 Matthew Mundell
+
+ * tests/: ppl_test.hh, print.hh (grids.[10,4]): Move dump_grids to
+ print.hh. Abort if the comparison in find_variation_template
+ fails.
+
+2005-08-16 Tuesday 11:41 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+ (grids.[34,24,48]): Enable grid_difference_assign. Add and
+ improve a few comments. Take out some old Polyhedron code.
+
+2005-08-16 Tuesday 11:39 Matthew Mundell
+
+ * src/: Linear_Expression.cc, Linear_Expression.defs.hh
+ (grids.[1,3]): Add constructor Linear_Expression(cg).
+
+2005-08-16 Tuesday 10:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.23), affinepreimage11.cc (1.1),
+ boundedaffineimage3.cc (1.1), boundedaffinepreimage1.cc (1.1),
+ boundedaffinepreimage2.cc (1.1), boundedaffinepreimage3.cc (1.1),
+ generalizedaffinepreimage1.cc (1.1),
+ generalizedaffinepreimage2.cc (1.1),
+ generalizedaffinepreimage3.cc (1.1),
+ generalizedaffinepreimage4.cc (1.1): Added tests for new methods
+ computing preimages of polyhedra.
+
+2005-08-16 Tuesday 10:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.273), Polyhedron_public.cc (1.56):
+ Added methods generalized_affine_preimage() and
+ bounded_affine_preimage(). A few improvements also in other
+ affine images and preimages methods.
+
+2005-08-16 Tuesday 10:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.114): In map_space_dimensions,
+ temporary constant declared const.
+
+2005-08-16 Tuesday 10:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.81): Remove spurious space.
+
+2005-08-16 Tuesday 10:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.7): Avoid a too long line.
+
+2005-08-15 Monday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.20), src/BD_Shape.inlines.hh (1.51),
+ src/Checked_Number.defs.hh (1.29), src/DB_Row.inlines.hh (1.6),
+ tests/ppl_test.hh (1.23): Old kludges removed.
+
+2005-08-15 Monday 21:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.48): Use the "-goal main"
+ option of `plld' instead of the more verbose (and obscure)
+ "-pl-options,-g,main".
+
+2005-08-15 Monday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/bug2.cc (1.2): Be more verbose.
+
+2005-08-12 Friday 19:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.172), ppl.sty (1.19): Provided new
+ description of affine transfer relations so as to also allow for
+ preimages of (bounded or generalized) affine relations.
+
+2005-08-12 Friday 16:55 Matthew Mundell
+
+ * tests/Grid/generalizedaffineimage2.cc (grids.2): Add test22.
+
+2005-08-11 Thursday 17:29 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, generalizedaffineimage2.cc
+ (grids.[21,1]): Add generalizedaffineimage2.
+
+2005-08-11 Thursday 17:27 Matthew Mundell
+
+ * tests/Grid/intersection2.cc (grids.3): Always call
+ intersection_assign_and_minimize. Only call find_variation after
+ the operation.
+
+2005-08-11 Thursday 17:21 Matthew Mundell
+
+ * tests/Grid/intersection1.cc (grids.2): In test8 leave
+ minimization to intersection_assign.
+
+2005-08-11 Thursday 17:20 Matthew Mundell
+
+ * src/Grid_public.cc (grids.47): In intersection_assign,
+ add_recycled_congruences_and_minimize and
+ add_recycled_congruences correct the sense of the test for
+ emptiness.
+
+ Enable generalized_affine_image(lhs,rhs,modulus).
+
+2005-08-11 Thursday 17:18 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.33): Improve some descriptions.
+
+2005-08-09 Tuesday 16:37 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.7): Correct comment.
+
+2005-08-09 Tuesday 16:36 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.32): Markup parameters in the
+ construct(gs,convert_rays_to_lines) description.
+
+2005-08-09 Tuesday 16:29 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.6): Add test9, which tests a
+ minimized grid in which the point contains factors and the
+ divisor is greater than one. Dump the grids on failure.
+
+2005-08-09 Tuesday 16:27 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc
+ (grids.[31,11,23]): Add a convert_rays_to_line parameter to
+ Grid(gs) and construct(gs).
+
+ In map_space_dimensions, when the number of dimensions changes:
+
+ - ensure that points and rays remain constant under the
+ generator
+ normalization that occurs when the points and rays are
+ created
+
+ - skip converting rays to lines when creating the temporary new
+ grid.
+
+2005-08-08 Monday 20:01 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, generalizedaffineimage1.cc
+ (grids.[20,1]): Add generalizedaffineimage1.
+
+2005-08-08 Monday 19:59 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[30,46]): Declare the
+ generalized_affine_image methods. Enable method
+ generalized_affine_image(var,expr,denom,mod). Clean some
+ formatting. Note where comments mention rays.
+
+2005-08-08 Monday 19:54 Matthew Mundell
+
+ * src/Generator_System.cc (grids.10): Call
+ remove_invalid_lines_and_rays when grid is true.
+
+2005-08-03 Wednesday 20:36 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, foldspacedims1.cc (grids.[19,1]): Add
+ foldspacedims1.
+
+2005-08-03 Wednesday 20:35 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.5): Add test6 and test7, in which the
+ generators are initially out of date.
+
+2005-08-03 Wednesday 20:33 Matthew Mundell
+
+ * src/: Grid_chdims.cc, Grid_public.cc (grids.[14,45]): Enable
+ fold_space_dimensions. Invert the empty tests after updating in
+ join_assign.
+
+2005-08-02 Tuesday 19:43 Matthew Mundell
+
+ * tests/Grid/affineimage1.cc (grids.2): Format linear expressions
+ consistently.
+
+2005-08-02 Tuesday 19:42 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, affinepreimage1.cc (grids.[18,1]): Add
+ affinepreimage1.
+
+2005-08-02 Tuesday 19:41 Matthew Mundell
+
+ * src/Grid_public.cc (grids.44): Enable affine_preimage.
+
+2005-08-01 Monday 18:32 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, affineimage1.cc (grids.[17,1]): Add
+ affineimage1.
+
+2005-08-01 Monday 18:31 Matthew Mundell
+
+ * src/: Linear_Row.cc, Linear_Row.defs.hh (grids.[3,3]): Add method
+ ascii_dump().
+
+2005-08-01 Monday 18:30 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.22): In normalize_divisors(sys,
+ divisor) only set the divisor for points.
+
+2005-08-01 Monday 18:28 Matthew Mundell
+
+ * src/: Congruence_System.cc, Generator.cc, Generator.defs.hh,
+ Generator_System.cc, Generator_System.defs.hh, Grid_public.cc,
+ Linear_Expression.defs.hh (grids.[18,2,5,9,3,43,2]): Enable
+ Congruence_System::affine_preimage and Grid::affine_image.
+
+ Add parameter check_normalization to Generator::OK, which
+ determines if normalization is checked. Add parameter
+ check_normalization to Generator_System methods OK and insert,
+ which is passed through to Generator::OK. Skip the normalization
+ checks for the Grid generator system.
+
+ Add parameter grid to Generator_System::affine_image, which
+ determines if strong_normalize and remove_invalid_lines_and_rays
+ are called.
+
+ In add_generator normalize the generator's divisor after the
+ generator is inserted.
+
+ Declare Grid and Congruence_System friends of Linear_Expression.
+
+2005-07-27 Wednesday 13:18 Matthew Mundell
+
+ * tests/Grid/relations2.cc (grids.2): Add test4 to test8.
+
+2005-07-27 Wednesday 13:17 Matthew Mundell
+
+ * src/Grid_public.cc (grids.42): Update relation_with(cg) to handle
+ any grid representation, instead of requiring a minimized
+ representation.
+
+2005-07-24 Sunday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.22): Added boundedaffineimage2
+ and nnc_boundedaffineimage2 to XFAIL_WITH_INT8.
+
+2005-07-20 Wednesday 09:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.131): Corrected
+ documentation for the Prolog interface where the specifications
+ for the predicates ppl_Polyhedron_contains_Polyhedron/2 and
+ ppl_Polyhedron_strictly_contains_Polyhedron/2 referred to
+ their arguments
+ the wrong way round.
+
+2005-07-14 Thursday 20:53 Matthew Mundell
+
+ * tests/Grid/expandspacedim1.cc (grids.2): Indent the copyright
+ line.
+
+2005-07-14 Thursday 20:52 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, relations1.cc, relations2.cc
+ (grids.[16,1,1]): Add relations1 and relations2.
+
+2005-07-14 Thursday 20:51 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_chdims.cc, Grid_public.cc
+ (grids.[29,13,41]): Enable and convert relation_with(cg) and
+ relation_with(g), adding an optional divisor argument to
+ relations_with(g).
+
+2005-07-14 Thursday 20:47 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[17,12]): Add method insert_verbatim.
+
+2005-07-13 Wednesday 14:58 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, expandspacedim1.cc (grids.[15,1]): Add
+ expandspacedim1.
+
+2005-07-13 Wednesday 14:56 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.12): Enable and convert
+ expand_space_dimension.
+
+2005-07-12 Tuesday 16:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/boundedaffineimage1.cc (1.2): Corrected a typo
+ in the expected result.
+
+2005-07-12 Tuesday 15:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.156): Announced new method
+ Polyhedron::bounded_affine_image().
+
+2005-07-12 Tuesday 15:47 Matthew Mundell
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[18,14]): Dump grids on
+ failure. Only use find_variation for the grid under test.
+ Insert test9 to test12, test14 and test22, from the revised
+ Chiara tests.
+
+2005-07-12 Tuesday 15:44 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.9): Add macro dump_grids.
+
+2005-07-12 Tuesday 13:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.171), interfaces/C/ppl_c.cc (1.134),
+ interfaces/C/ppl_c.h.in (1.49),
+ interfaces/Prolog/Prolog_interface.dox (1.130),
+ interfaces/Prolog/ppl_prolog.icc (1.156),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.11),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.79),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.51),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.75),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.99),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.38),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.66),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.16),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.91), src/Polyhedron.defs.hh
+ (1.272), src/Polyhedron_public.cc (1.55),
+ tests/Polyhedron/Makefile.am (1.21),
+ tests/Polyhedron/boundedaffineimage1.cc (1.1),
+ tests/Polyhedron/boundedaffineimage2.cc (1.1),
+ tests/Polyhedron/exceptions1.cc (1.5): The new method
+ Polyhedron::affine_bounds() renamed as
+ Polyhedron::bounded_affine_image(), added to all available
+ interfaces and documented. Added a few tests on its C++ version
+ (no test added yet for Prolog).
+
+2005-07-12 Tuesday 12:49 Matthew Mundell
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[17,13]): Match tests to
+ revised Chiara algorithm tests.
+
+2005-07-11 Monday 17:47 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+ (grids.[28,16,40]): Replace both add_and_minimize methods with
+ code in each caller.
+
+2005-07-11 Monday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.5), config.guess (1.30), config.sub (1.29), depcomp
+ (1.10), mkinstalldirs (1.9), missing (1.10), Watchdog/compile
+ (1.5), Watchdog/config.guess (1.14), Watchdog/config.sub (1.14),
+ Watchdog/depcomp (1.8), Watchdog/missing (1.6),
+ Watchdog/mkinstalldirs (1.5): Updated from Automake 1.9.6.
+
+2005-07-08 Friday 20:02 Matthew Mundell
+
+ * tests/Grid/: Makefile.am, equals1.cc (grids.[14,1]): Add equals,
+ which tests operator== and operator!=.
+
+2005-07-08 Friday 19:58 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.5): Correct test7 expected
+ result. Print test name from all tests.
+
+2005-07-08 Friday 19:57 Matthew Mundell
+
+ * tests/Grid/congruencesystem2.cc (grids.5): Add another line test,
+ and some temporary comments.
+
+2005-07-08 Friday 19:56 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.8): Correct test3 expected
+ result.
+
+2005-07-08 Friday 19:55 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.16): In satisfies_all_congruences
+ compare the entire scalar product to zero when the generator is a
+ line.
+
+2005-07-07 Thursday 16:41 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.4): Add test5, which requires divisor
+ normalisation. Call join_assign instead of
+ join_assign_and_minimize in test4.
+
+2005-07-07 Thursday 16:39 Matthew Mundell
+
+ * src/Grid_public.cc (grids.39): Match the divisors of the two
+ generator systems in join_assign.
+
+2005-07-06 Wednesday 20:21 Matthew Mundell
+
+ * tests/Grid/congruencesystem2.cc, tests/Grid/grid1.cc,
+ tests/Grid/grid2.cc, tests/Grid/removespacedims1.cc,
+ src/Congruence_System.cc, src/Congruence_System.defs.hh,
+ src/Grid_nonpublic.cc, src/Grid_public.cc
+ (grids.[4,16,12,4,15,11,21,38]): Normalize divisors after
+ converting from rays to lines. Use the system-wide divisor to
+ calculate the factor used when normalizing parameters. In
+ satisfies_all_congruences multiply the modulus by the divisor to
+ account for the divisor when comparing parameters.
+
+ Correct Chiara function names in grid1.cc comments. Correct the
+ expected results in grid1.cc test13 and test14, grid2.cc test2
+ and test10 and removespacedims1.cc test1. Insert test16 (from
+ the chiara water monitor example) into grid1.cc.
+
+2005-07-06 Wednesday 19:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.155): Mentioned the bug corrected in
+ generalized_affine_image() and the renaming of enumeration
+ Degenerate_Element.
+
+2005-07-06 Wednesday 17:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.147): Degenerate_Kind is now named Degenerate_Element and
+ placed outside of class Polyhedron. Namespaces are documented in
+ namespaces.hh.
+
+2005-07-06 Wednesday 17:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.155): No longer using
+ Degenerate_Kind.
+
+2005-07-06 Wednesday 17:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.133): Do use Degenerate_Element instead
+ of Degenerate_Kind.
+
+2005-07-06 Wednesday 17:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.55),
+ devref-print.doxyconf-latex.in (1.55), devref.doxyconf-html.in
+ (1.55): Also include namespaces.hh.
+
+2005-07-06 Wednesday 17:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: BD_Shape/addspacedims3.cc (1.5),
+ BD_Shape/addspacedims4.cc (1.5), BD_Shape/addspacedims5.cc (1.5),
+ BD_Shape/addspacedims6.cc (1.5), BD_Shape/addspacedims7.cc (1.4),
+ BD_Shape/cc76extrapolation4.cc (1.4), BD_Shape/cc76narrowing4.cc
+ (1.4), BD_Shape/cc76narrowing5.cc (1.4),
+ BD_Shape/ch78widening2.cc (1.4), BD_Shape/ch78widening5.cc (1.4),
+ BD_Shape/concatenate2.cc (1.4), BD_Shape/concatenate5.cc (1.4),
+ BD_Shape/constraints1.cc (1.5), BD_Shape/contains2.cc (1.5),
+ BD_Shape/contains3.cc (1.5), BD_Shape/equality1.cc (1.5),
+ BD_Shape/fromgensys1.cc (1.3),
+ BD_Shape/generalizedaffineimage14.cc (1.4),
+ BD_Shape/generalizedaffineimage3.cc (1.5),
+ BD_Shape/intersection4.cc (1.5), BD_Shape/intersection5.cc (1.5),
+ BD_Shape/limitedCC76extrapolation2.cc (1.4),
+ BD_Shape/limitedCC76extrapolation3.cc (1.4),
+ BD_Shape/mapspacedims2.cc (1.4), BD_Shape/polydifference1.cc
+ (1.5), BD_Shape/polydifference5.cc (1.4), BD_Shape/relations1.cc
+ (1.5), BD_Shape/relations5.cc (1.5), BD_Shape/removespacedims2.cc
+ (1.4), BD_Shape/removespacedims3.cc (1.4),
+ BD_Shape/timeelapse1.cc (1.4), BD_Shape/timeelapse5.cc (1.4),
+ BD_Shape/writebdshape2.cc (1.2), Polyhedron/addconstraint2.cc
+ (1.4), Polyhedron/addconstraints1.cc (1.4),
+ Polyhedron/addconstraints10.cc (1.4),
+ Polyhedron/addconstraints13.cc (1.4),
+ Polyhedron/addconstraints3.cc (1.4),
+ Polyhedron/addconstraints5.cc (1.4),
+ Polyhedron/addconstraints7.cc (1.4),
+ Polyhedron/addconstraints8.cc (1.4), Polyhedron/addgenerator1.cc
+ (1.4), Polyhedron/addgenerator2.cc (1.4),
+ Polyhedron/addgenerator4.cc (1.4), Polyhedron/addgenerator5.cc
+ (1.4), Polyhedron/addgenerators1.cc (1.4),
+ Polyhedron/addgenerators10.cc (1.4),
+ Polyhedron/addgenerators11.cc (1.4),
+ Polyhedron/addgenerators12.cc (1.4),
+ Polyhedron/addgenerators13.cc (1.4), Polyhedron/addgenerators2.cc
+ (1.4), Polyhedron/addgenerators6.cc (1.4),
+ Polyhedron/addgenerators8.cc (1.4), Polyhedron/addspacedims1.cc
+ (1.4), Polyhedron/addspacedims2.cc (1.4),
+ Polyhedron/addspacedims3.cc (1.4), Polyhedron/addspacedims8.cc
+ (1.4), Polyhedron/affineimage1.cc (1.4),
+ Polyhedron/affineimage4.cc (1.4), Polyhedron/affineimage5.cc
+ (1.4), Polyhedron/affineimage6.cc (1.4),
+ Polyhedron/affinepreimage3.cc (1.4),
+ Polyhedron/affinepreimage8.cc (1.4),
+ Polyhedron/ascii_dump_load6.cc (1.4),
+ Polyhedron/bgp99extrapolation1.cc (1.4),
+ Polyhedron/bgp99extrapolation2.cc (1.4),
+ Polyhedron/bhrz03widening10.cc (1.4),
+ Polyhedron/bhrz03widening15.cc (1.4),
+ Polyhedron/bhz03widening1.cc (1.4), Polyhedron/bhz03widening2.cc
+ (1.4), Polyhedron/bhz03widening3.cc (1.4),
+ Polyhedron/bhz03widening4.cc (1.4), Polyhedron/bhz03widening5.cc
+ (1.4), Polyhedron/bhz03widening6.cc (1.4), Polyhedron/bounded1.cc
+ (1.4), Polyhedron/boundedbhrz03extrapolation1.cc (1.2),
+ Polyhedron/boundingbox1.cc (1.4), Polyhedron/boundingbox2.cc
+ (1.4), Polyhedron/boundingbox3.cc (1.4),
+ Polyhedron/boundingbox4.cc (1.4), Polyhedron/boundingbox5.cc
+ (1.4), Polyhedron/bounds1.cc (1.4), Polyhedron/concatenate2.cc
+ (1.4), Polyhedron/concatenate6.cc (1.4),
+ Polyhedron/concatenate7.cc (1.2), Polyhedron/constraints2.cc
+ (1.4), Polyhedron/constraints4.cc (1.4), Polyhedron/disjoint2.cc
+ (1.4), Polyhedron/disjoint3.cc (1.4), Polyhedron/empty1.cc (1.4),
+ Polyhedron/exceptions1.cc (1.4), Polyhedron/exceptions2.cc (1.4),
+ Polyhedron/exceptions3.cc (1.5), Polyhedron/expandspacedim1.cc
+ (1.4), Polyhedron/expandspacedim2.cc (1.4),
+ Polyhedron/foldspacedims1.cc (1.4), Polyhedron/foldspacedims2.cc
+ (1.4), Polyhedron/generalizedaffineimage1.cc (1.4),
+ Polyhedron/generalizedaffineimage11.cc (1.4),
+ Polyhedron/generalizedaffineimage13.cc (1.2),
+ Polyhedron/generalizedaffineimage14.cc (1.2),
+ Polyhedron/generalizedaffineimage2.cc (1.4),
+ Polyhedron/generalizedaffineimage3.cc (1.4),
+ Polyhedron/generalizedaffineimage4.cc (1.4),
+ Polyhedron/generalizedaffineimage6.cc (1.4),
+ Polyhedron/generalizedaffineimage7.cc (1.4),
+ Polyhedron/generators3.cc (1.4), Polyhedron/generators4.cc (1.4),
+ Polyhedron/generators6.cc (1.4), Polyhedron/generators7.cc (1.3),
+ Polyhedron/geomcovers1.cc (1.4), Polyhedron/h79widening5.cc
+ (1.4), Polyhedron/intersection10.cc (1.4),
+ Polyhedron/intersection11.cc (1.4), Polyhedron/intersection4.cc
+ (1.4), Polyhedron/intersection5.cc (1.4),
+ Polyhedron/intersection6.cc (1.4), Polyhedron/intersection8.cc
+ (1.4), Polyhedron/intersection9.cc (1.4),
+ Polyhedron/limitedh79extrapolation4.cc (1.4),
+ Polyhedron/linearpartition4.cc (1.4), Polyhedron/mapspacedims1.cc
+ (1.4), Polyhedron/mc91.cc (1.4), Polyhedron/membytes1.cc (1.4),
+ Polyhedron/minconstraints2.cc (1.4), Polyhedron/mingenerators2.cc
+ (1.4), Polyhedron/onepoint.cc (1.4),
+ Polyhedron/polydifference4.cc (1.4),
+ Polyhedron/polydifference7.cc (1.4),
+ Polyhedron/polydifference9.cc (1.4), Polyhedron/polyhull2.cc
+ (1.4), Polyhedron/polyhull3.cc (1.4), Polyhedron/polyhull5.cc
+ (1.4), Polyhedron/polyhull8.cc (1.4), Polyhedron/polyhull9.cc
+ (1.4), Polyhedron/polypowerset1.cc (1.3),
+ Polyhedron/randphull1.cc (1.4), Polyhedron/randphull2.cc (1.5),
+ Polyhedron/relations17.cc (1.4), Polyhedron/relations19.cc (1.4),
+ Polyhedron/relations2.cc (1.4), Polyhedron/relations6.cc (1.4),
+ Polyhedron/removespacedims10.cc (1.4),
+ Polyhedron/removespacedims3.cc (1.4),
+ Polyhedron/removespacedims5.cc (1.4), Polyhedron/timeelapse2.cc
+ (1.4), Polyhedron/timeelapse5.cc (1.4), Polyhedron/timeelapse7.cc
+ (1.4), Polyhedron/timeelapse8.cc (1.4), Polyhedron/timeelapse9.cc
+ (1.4), Polyhedron/topclosed1.cc (1.4), Polyhedron/topclosed2.cc
+ (1.4), Polyhedron/topclosure2.cc (1.4), Polyhedron/topclosure4.cc
+ (1.4), Polyhedron/writegensys2.cc (1.4): Using Degenerate_Element
+ instead of Polyhedron::Degenerate_Kind.
+
+2005-07-06 Wednesday 17:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.19), BD_Shape.inlines.hh (1.50),
+ C_Polyhedron.defs.hh (1.32), C_Polyhedron.inlines.hh (1.25),
+ Determinate.defs.hh (1.54), Determinate.inlines.hh (1.47),
+ Makefile.am (1.111), NNC_Polyhedron.defs.hh (1.34),
+ NNC_Polyhedron.inlines.hh (1.28), Polyhedra_Powerset.defs.hh
+ (1.15), Polyhedra_Powerset.inlines.hh (1.19), Polyhedron.defs.hh
+ (1.271), Polyhedron.types.hh (1.15), Polyhedron_nonpublic.cc
+ (1.47), algorithms.hh (1.40), globals.defs.hh (1.20),
+ namespaces.hh (1.1): Doxygen documentation for namespaces moved
+ into namespaces.hh. Polyhedron::Degenerate_Kind renamed as
+ Degenerate_Element and moved outside of class Polyhedron in
+ globals.hh.
+
+2005-07-06 Wednesday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.5), utils/timings.cc (1.3):
+ <sys/resource.h> should always be included after <time.h> and
+ <sys/time.h> so as to make sure we have the definitions for,
+ e.g., `ru_utime'.
+
+2005-07-06 Wednesday 14:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.54),
+ devref-print.doxyconf-latex.in (1.54), devref.doxyconf-html.in
+ (1.54), user-browse.doxyconf-latex.in (1.25),
+ user-print.doxyconf-latex.in (1.25), user.doxyconf-html.in
+ (1.27): Changed so as to reflect the fact that macro __P has been
+ renamed PPL_PROTO.
+
+2005-07-06 Wednesday 10:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.22): Minor typo correction.
+
+2005-07-06 Wednesday 10:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.146), src/Powerset.defs.hh (1.12): One item in the huge
+ list has gone.
+
+2005-07-06 Wednesday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, README, TODO, build_header, config.guess,
+ config.sub, configure.ac, install-sh, ltmain.sh, ppl.spec.in,
+ Watchdog/Handler.defs.hh, Watchdog/Handler.inlines.hh,
+ Watchdog/Time.inlines.hh, Watchdog/config.guess,
+ Watchdog/config.sub, Watchdog/install-sh, Watchdog/ltmain.sh,
+ debian/.cvsignore, debian/changelog, debian/compat,
+ debian/control, debian/libppl-c.dirs, debian/libppl-c.install,
+ debian/libppl-c.links, debian/libppl-dev.dirs,
+ debian/libppl-dev.doc-base, debian/libppl-dev.doc-base.user,
+ debian/libppl-dev.docs, debian/libppl-dev.install,
+ debian/libppl-dev.links, debian/libppl-gprolog.links,
+ debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+ debian/libppl-pwl.docs, debian/libppl-pwl.install,
+ debian/libppl-sicstus.links, debian/libppl-swi.links,
+ debian/libppl-yap.links, debian/libppl.copyright.in,
+ debian/libppl.dirs, debian/libppl.docs, debian/libppl.install,
+ debian/rules, demos/ppl_lcdd/.cvsignore,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/Makefile.am, doc/definitions.dox, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/sp_pl_check.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/check_script,
+ interfaces/Prolog/tests/check_script2,
+ interfaces/Prolog/tests/check_script2_int8,
+ interfaces/Prolog/tests/expected2_int16,
+ interfaces/Prolog/tests/expected2_int16_a,
+ interfaces/Prolog/tests/expected2_int32,
+ interfaces/Prolog/tests/expected2_int32_a,
+ interfaces/Prolog/tests/expected2_int64,
+ interfaces/Prolog/tests/expected2_int64_a,
+ interfaces/Prolog/tests/expected2_int8,
+ interfaces/Prolog/tests/expected2_int8_a,
+ interfaces/Prolog/tests/expected2_mpz,
+ interfaces/Prolog/tests/expected2_mpz_a,
+ interfaces/Prolog/tests/expected3_int16,
+ interfaces/Prolog/tests/expected3_int16_a,
+ interfaces/Prolog/tests/expected3_int32,
+ interfaces/Prolog/tests/expected3_int32_a,
+ interfaces/Prolog/tests/expected3_int64,
+ interfaces/Prolog/tests/expected3_int64_a,
+ interfaces/Prolog/tests/expected3_int8,
+ interfaces/Prolog/tests/expected3_int8_a,
+ interfaces/Prolog/tests/expected3_mpz,
+ interfaces/Prolog/tests/expected3_mpz_a,
+ interfaces/Prolog/tests/expected_clpq2_int16,
+ interfaces/Prolog/tests/expected_clpq2_int16_a,
+ interfaces/Prolog/tests/expected_clpq2_int32,
+ interfaces/Prolog/tests/expected_clpq2_int32_a,
+ interfaces/Prolog/tests/expected_clpq2_int64,
+ interfaces/Prolog/tests/expected_clpq2_int64_a,
+ interfaces/Prolog/tests/expected_clpq2_int8,
+ interfaces/Prolog/tests/expected_clpq2_int8_a,
+ interfaces/Prolog/tests/expected_clpq2_mpz,
+ interfaces/Prolog/tests/expected_clpq2_mpz_a,
+ interfaces/Prolog/tests/expected_clpq_int16,
+ interfaces/Prolog/tests/expected_clpq_int16_a,
+ interfaces/Prolog/tests/expected_clpq_int32,
+ interfaces/Prolog/tests/expected_clpq_int32_a,
+ interfaces/Prolog/tests/expected_clpq_int64,
+ interfaces/Prolog/tests/expected_clpq_int64_a,
+ interfaces/Prolog/tests/expected_clpq_int8,
+ interfaces/Prolog/tests/expected_clpq_int8_a,
+ interfaces/Prolog/tests/expected_clpq_mpz,
+ interfaces/Prolog/tests/expected_clpq_mpz_a,
+ interfaces/Prolog/tests/expected_int16,
+ interfaces/Prolog/tests/expected_int16_a,
+ interfaces/Prolog/tests/expected_int32,
+ interfaces/Prolog/tests/expected_int32_a,
+ interfaces/Prolog/tests/expected_int64,
+ interfaces/Prolog/tests/expected_int64_a,
+ interfaces/Prolog/tests/expected_int8,
+ interfaces/Prolog/tests/expected_int8_a,
+ interfaces/Prolog/tests/expected_mpz,
+ interfaces/Prolog/tests/expected_mpz_a,
+ interfaces/Prolog/tests/expected_pchk_int16,
+ interfaces/Prolog/tests/expected_pchk_int16_a,
+ interfaces/Prolog/tests/expected_pchk_int32,
+ interfaces/Prolog/tests/expected_pchk_int32_a,
+ interfaces/Prolog/tests/expected_pchk_int64,
+ interfaces/Prolog/tests/expected_pchk_int64_a,
+ interfaces/Prolog/tests/expected_pchk_int8,
+ interfaces/Prolog/tests/expected_pchk_int8_a,
+ interfaces/Prolog/tests/expected_pchk_mpz,
+ interfaces/Prolog/tests/expected_pchk_mpz_a,
+ interfaces/Prolog/tests/script_clpq,
+ interfaces/Prolog/tests/script_clpq2,
+ interfaces/Prolog/tests/script_clpq2_int8, src/.cvsignore,
+ src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Constraint.cc, src/Constraint.defs.hh, src/DB_Row.defs.hh,
+ src/E_Rational.inlines.hh, src/Float.defs.hh,
+ src/Float.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+ src/Grid.defs.hh, src/Grid_Status.idefs.hh, src/Init.cc,
+ src/Init.defs.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/Makefile.am, src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Result.defs.hh, src/Rounding.defs.hh,
+ src/Rounding.inlines.hh, src/checked.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_ext.defs.hh,
+ src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+ src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+ src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+ src/globals.inlines.hh, src/ppl_header.bottom, src/ppl_header.hh,
+ src/ppl_header.middle, src/ppl_header.top, tests/BBox.cc,
+ tests/BBox.hh, tests/PFunction.cc, tests/PFunction.hh,
+ tests/ehandlers.hh, tests/files.hh, tests/ppl_test.hh,
+ tests/print.cc, tests/print.hh, tests/BD_Shape/.cvsignore,
+ tests/BD_Shape/Makefile.am, tests/BD_Shape/addspacedims1.cc,
+ tests/BD_Shape/addspacedims2.cc, tests/BD_Shape/addspacedims3.cc,
+ tests/BD_Shape/addspacedims4.cc, tests/BD_Shape/addspacedims5.cc,
+ tests/BD_Shape/addspacedims6.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/affinepreimage5.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains2.cc,
+ tests/BD_Shape/contains3.cc, tests/BD_Shape/empty3.cc,
+ tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/fromgensys1.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage13.cc,
+ tests/BD_Shape/generalizedaffineimage14.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+ tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+ tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/polydifference1.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+ tests/BD_Shape/writebdiffs2.cc, tests/BD_Shape/writebdshape1.cc,
+ tests/BD_Shape/writebdshape2.cc, tests/Polyhedron/.cvsignore,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/affinetrans.cc,
+ tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat,
+ tests/Polyhedron/concatenate7.cc,
+ tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/generalizedaffineimage13.cc,
+ tests/Polyhedron/generalizedaffineimage14.cc,
+ tests/Polyhedron/randphull2.cc, tests/Polyhedron/watchdog1.cc
+ (grids.[1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,27,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, [...]
+ First merge from main trunk.
+
+2005-07-04 Monday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.54): Corrected symmetric bug on the
+ other flavor of method Polyhedron::generalized_affine_inage().
+
+2005-07-04 Monday 15:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.20),
+ generalizedaffineimage14.cc (1.1): New test show symmetric bug on
+ the other flavor of generalized_affine_image().
+
+2005-07-03 Sunday 23:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: Makefile.am (1.4), check_script2_int8
+ (1.2), script_clpq2_int8 (1.1): Distribution fixed.
+
+2005-07-03 Sunday 23:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/script_clpq2_int8 (altnum.1): file
+ script_clpq2_int8 was added on branch altnum on 2006-10-29
+ 19:27:09 +0000
+
+2005-07-03 Sunday 23:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.37): Link against libYap.
+
+2005-07-03 Sunday 23:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.129), XSB/Makefile.am
+ (1.33), XSB/xsb_clpq.P (1.13), XSB/xsb_clpq2.P (1.11),
+ XSB/xsb_pl_check.P (1.15): Updated to use new versions of XSB
+ (older ones are too problematic). Only XSB versions following
+ 2.7.1 and CVS HEAD versions starting from 2 July 2005 are now
+ supported.
+
+2005-07-03 Sunday 23:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.36): Make the tests
+ independent from one another. Updated to use the new names of
+ the test files.
+
+2005-07-03 Sunday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.145): We should not forget to update those bits of
+ documentation that have proved to be not adequate.
+
+2005-07-03 Sunday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.46), gnu_pl_check.pl
+ (1.5): Make the tests independent from one another. Updated to
+ use the new names of the test files.
+
+2005-07-03 Sunday 16:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.52), sp_pl_check.pl
+ (1.3): Make the tests independent from one another. Updated to
+ use the new names of the test files.
+
+2005-07-03 Sunday 14:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.42): Make the tests
+ independent from one another. Updated to use the new names of
+ the test files.
+
+2005-07-03 Sunday 14:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.47), swi_pl_check.pl
+ (1.4): Make the tests independent from one another. Updated to
+ use the new names of the test files.
+
+2005-07-03 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/: check_script (1.2), check_script2
+ (1.2), expected2_int16 (1.5), expected2_int16_a (1.4),
+ expected2_int32 (1.4), expected2_int32_a (1.3), expected2_int64
+ (1.3), expected2_int64_a (1.3), expected2_int8 (1.3),
+ expected2_int8_a (1.3), expected2_mpz (1.3), expected2_mpz_a
+ (1.3), expected3_int16 (1.2), expected3_int16_a (1.2),
+ expected3_int32 (1.2), expected3_int32_a (1.2), expected3_int64
+ (1.3), expected3_int64_a (1.2), expected3_int8 (1.3),
+ expected3_int8_a (1.2), expected3_mpz (1.2), expected3_mpz_a
+ (1.2), expected_clpq2_int16 (1.1), expected_clpq2_int16_a (1.1),
+ expected_clpq2_int32 (1.1), expected_clpq2_int32_a (1.1),
+ expected_clpq2_int64 (1.1), expected_clpq2_int64_a (1.1),
+ expected_clpq2_int8 (1.1), expected_clpq2_int8_a (1.1),
+ expected_clpq2_mpz (1.1), expected_clpq2_mpz_a (1.1),
+ expected_clpq_int16 (1.1), expected_clpq_int16_a (1.1),
+ expected_clpq_int32 (1.1), expected_clpq_int32_a (1.1),
+ expected_clpq_int64 (1.1), expected_clpq_int64_a (1.1),
+ expected_clpq_int8 (1.1), expected_clpq_int8_a (1.1),
+ expected_clpq_mpz (1.1), expected_clpq_mpz_a (1.1),
+ expected_int16 (1.3), expected_int16_a (1.3), expected_int32
+ (1.3), expected_int32_a (1.3), expected_int64 (1.3),
+ expected_int64_a (1.3), expected_int8 (1.4), expected_int8_a
+ (1.4), expected_mpz (1.3), expected_mpz_a (1.3),
+ expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+ expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+ expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+ expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+ expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1), script_clpq
+ (1.1), script_clpq2 (1.1): Use more sensible file names.
+
+2005-07-03 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_mpz (altnum.1): file
+ expected_pchk_mpz was added on branch altnum on 2006-10-29
+ 19:27:08 +0000
+
+2005-07-03 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected_pchk_mpz_a (altnum.1): file
+ expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+ 19:27:08 +0000
+
+2005-07-03 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/script_clpq (altnum.1): file script_clpq
+ was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2005-07-03 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/script_clpq2 (altnum.1): file
+ script_clpq2 was added on branch altnum on 2006-10-29 19:27:09
+ +0000
+
+2005-07-03 Sunday 12:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.164): Version number bumped.
+
+2005-07-03 Sunday 12:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.128), GNU/README
+ (1.1): Specify how to obtain the only version of GNU Prolog that
+ is known to work with the PPL's Prolog interface.
+
+2005-07-03 Sunday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.45): Always use $(CXX) to
+ compile and link.
+
+2005-07-03 Sunday 10:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Polyhedron/Makefile.am (1.19), BD_Shape/Makefile.am
+ (1.12): LDADD reordered so that libraries occur in dependence
+ order (Cygwin seems to depend on this).
+
+2005-07-01 Friday 17:13 Matthew Mundell
+
+ * src/: Grid_public.cc, Grid.defs.hh, Grid_nonpublic.cc
+ (grids.[37,26,20]): Add back normalizing of divisors. Take out
+ two temporary comments, and add one. Take some old Polyhedron
+ code out of add_recycled_generators_and_minimize.
+
+2005-06-30 Thursday 19:56 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_conversion.cc, Grid_simplify.cc,
+ Row.inlines.hh (grids.[25,17,27,1]): Add strong reduction. Use
+ negate(x) instead of -x. Slightly improve some comments.
+
+2005-06-27 Monday 13:15 Matthew Mundell
+
+ * tests/Grid/: addspacedims2.cc, removespacedims1.cc,
+ removespacedims2.cc (grids.[4,3,3]): Correct known_gr.
+
+2005-06-27 Monday 13:12 Matthew Mundell
+
+ * src/: Generator_System.cc, Generator_System.defs.hh,
+ Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+ Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+ Grid_simplify.cc, Linear_Row.cc, Linear_Row.defs.hh,
+ Linear_Row.inlines.hh, Congruence.cc, Congruence.defs.hh,
+ Congruence.inlines.hh, Congruence_System.cc,
+ Congruence_System.defs.hh, Generator.defs.hh,
+ Generator.inlines.hh
+ (grids.[8,2,24,11,16,15,19,36,26,2,2,2,7,13,9,14,10,3,2]): Update
+ to new treatment of virtual rows. Add ascii_dump() methods to
+ Congruence, Congruence_System and Generator_System. Add macro
+ print_dim_kinds to Grid.defs.hh.
+
+2005-06-22 Wednesday 12:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.53): Corrected the bug in
+ Polyhedron::generalized_affine_image() that was shown by test
+ generalizedaffineimage13.cc. We should actually check for
+ emptyness before adding lines to the polyhedron.
+
+2005-06-22 Wednesday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.18),
+ generalizedaffineimage13.cc (1.1): Added a test program showing a
+ bug in Polyhedron::generalized_affine_image(). The bug shows up
+ (by throwing an exception) when the polyhedron is empty, but hte
+ library hasn't yet detected emptyness.
+
+2005-06-21 Tuesday 18:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.270), Polyhedron_public.cc (1.52):
+ Added new method Polyhedron::affine_bounds() to compute the
+ effect of transfer functions providing upper and lower bound
+ affine expressions for a dimension of the polyhedron.
+
+2005-06-18 Saturday 22:58 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.28), Checked_Number.inlines.hh
+ (1.34), checked.defs.hh (1.20), checked_ext.inlines.hh (1.18),
+ checked_float.inlines.hh (1.38), checked_int.inlines.hh (1.34),
+ checked_mpq.inlines.hh (1.19), checked_mpz.inlines.hh (1.23):
+ Added mul2exp and div2exp.
+
+2005-06-16 Thursday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.29): Typo fixed.
+
+2005-06-16 Thursday 15:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.17), bug1.cc (1.2), bug1.dat
+ (1.2), concatenate7.cc (1.1): Program `concatenate7' exhibits the
+ same bug exhinited by `bug1'.
+
+2005-06-16 Thursday 15:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.28): Corrected a bug in
+ Polyhedron::concatenate_assign() whereby the produced result
+ could have failed to satisfy the library invariants.
+
+2005-06-16 Thursday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.16), bug2.cc (1.1), bug2.dat
+ (1.1): Program bug2.cc exhibits a misbehavior that, up to now,
+ has only been observed on MacOs X.
+
+2005-06-16 Thursday 12:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.15), bug1.cc (1.1), bug1.dat
+ (1.1): Program bug1.cc exhibits a bug in
+ Polyhedron::concatenate_assign().
+
+2005-06-16 Thursday 11:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.154): Colon added.
+
+2005-06-16 Thursday 11:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.153), src/Constraint.cc (1.50), src/Constraint.defs.hh
+ (1.103), src/Generator.cc (1.61), src/Generator.defs.hh (1.104):
+ New output operators in namespace IO_Operators: std::ostream&
+ operator<<(std::ostream&, const Constraint::Type&) and
+ std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+2005-06-16 Thursday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.132): FIXME dealt with.
+
+2005-06-16 Thursday 11:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.49), Generator.cc (1.60): Avoid
+ unnecessary qualification.
+
+2005-06-16 Thursday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/randphull2.cc (1.4): When NOISY, make noise in
+ case of failure.
+
+2005-06-15 Wednesday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.41): Do not assume `.' is
+ in the `PATH' environment variable.
+
+2005-06-14 Tuesday 15:22 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.7): Improve comment.
+
+2005-06-14 Tuesday 15:22 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.7): Print ASCII dump of a when loading
+ it fails.
+
+2005-06-14 Tuesday 15:21 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+ Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+ Grid_simplify.cc (grids.[23,10,15,14,18,35,25]): Add enum
+ Dimension_Kind and type Dimension_Kinds. Add attribute
+ dim_kinds, pass it to the minimize, simplify and conversion
+ methods, and fill it in the simplify methods. Add macro
+ trace_dim_kinds. Dump and load dim_kinds in ascii_load and
+ ascii_dump. Check dim_kinds in OK. Adjust dim_kinds in
+ add_space_dimensions*.
+
+ Add ascii_dump(), which writes to cerr.
+
+2005-06-14 Tuesday 15:12 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.27), Checked_Number.inlines.hh
+ (1.33), Rounding.defs.hh (1.12): Moved default rounding mode in
+ policy. Removed bogus Checked_Pair trick.
+
+2005-06-14 Tuesday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.16): Do not refer to
+ `option_index' if HAVE_GETOPT_H is undefined.
+
+2005-06-14 Tuesday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BBox.hh (1.8): Avoid using directives in header files.
+
+2005-06-14 Tuesday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.49): Include "C_Polyhedron.defs.hh".
+
+2005-06-14 Tuesday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BBox.cc (1.9), BBox.hh (1.7), PFunction.cc (1.5),
+ PFunction.hh (1.6), ehandlers.hh (1.11), files.hh (1.7),
+ ppl_test.hh (1.22), print.cc (1.15), print.hh (1.19): Adjust
+ inclusions so as to avoid multiple inclusion of ppl_install.hh.
+ Besides speeding up the build, this works around a problem on
+ Darwin.
+
+2005-06-14 Tuesday 10:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/PFunction.hh (1.5): Multiple inclusion guard fixed.
+
+2005-06-14 Tuesday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.43): Fixes for systems that do not
+ provide <getopt.h>.
+
+2005-06-14 Tuesday 09:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.15): Do not declare `option_index'
+ when it is not needed.
+
+2005-06-14 Tuesday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BDS_Status.inlines.hh (1.4): Helper function get_field() is
+ now declared inline.
+
+2005-06-14 Tuesday 07:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.14): Work also on systems that do
+ not provide <getopt.h> and/or that do not provide a declaration
+ for RLIMIT_AS.
+
+2005-06-14 Tuesday 07:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.163): Check also for the presence of
+ <sys/time.h>.
+
+2005-06-14 Tuesday 07:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.13), expected_int16 (1.3),
+ expected_int16_a (1.3), expected_int32 (1.4), expected_int32_a
+ (1.4), expected_int64 (1.4), expected_int64_a (1.4),
+ expected_int8 (1.3), expected_int8_a (1.2), expected_mpz (1.4),
+ expected_mpz_a (1.4): Do not use long options for testing, since
+ they may be unavailable on some platforms.
+
+2005-06-13 Monday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.162): Version number bumped.
+
+2005-06-13 Monday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.152), interfaces/C/ppl_c.h.in (1.48): Do not infringe on
+ system name space as well as on user name space.
+
+2005-06-10 Friday 18:33 Matthew Mundell
+
+ * src/Grid_public.cc (grids.34): Improve comment.
+
+2005-06-10 Friday 18:31 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.11): Add test14, which adds a
+ congruence system having a row capacity larger than the row
+ capacity of the grid's existing congruence system.
+
+2005-06-10 Friday 18:30 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.15): Take tracing out of test20.
+
+2005-06-10 Friday 18:26 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.13): Move bug1 to TESTS.
+
+2005-06-10 Friday 18:21 Matthew Mundell
+
+ * tests/Grid/bug1.cc (grids.2): Add header comment, use nout
+ instead of cerr.
+
+2005-06-10 Friday 18:14 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.14): Improve comment.
+
+2005-06-10 Friday 18:05 Matthew Mundell
+
+ * src/Row.defs.hh (grids.3): Declare Congruence_System a friend
+ when EXTRA_ROW_DEBUG.
+
+2005-06-10 Friday 18:01 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.24): In reduce_pc_with_pc add GCD
+ tracing and use the ternary operator instead of !.
+
+2005-06-10 Friday 17:59 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.14): In generator to congruence
+ conversion ensure that the resulting moduli and first element of
+ the matrix are positive.
+
+2005-06-10 Friday 14:02 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.33): Avoided a warning.
+
+2005-06-10 Friday 11:16 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.23): In free_row in the congruence
+ simplify, ensure that all the rows to have the same capacity.
+
+2005-06-10 Friday 11:13 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[13,9]): Add method add_row.
+
+2005-06-09 Thursday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/exceptions3.cc (1.4): Avoid a compiler warning.
+
+2005-06-09 Thursday 17:29 Matthew Mundell
+
+ * interfaces/Prolog/SWI/Makefile.am (grids.2): Revert last change.
+
+2005-06-09 Thursday 12:12 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_conversion.cc (grids.[22,13]): Move the
+ grid multiplying code into two inline functions called
+ multiply_grid.
+
+2005-06-08 Wednesday 17:00 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.13): Add test20, which constructs from
+ a generator system containing a ray.
+
+2005-06-08 Wednesday 16:59 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.17): In method construct convert
+ rays to lines.
+
+2005-06-08 Wednesday 16:58 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.9): Use a temporary variable in
+ add_space_dimensions.
+
+2005-06-08 Wednesday 07:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: concatenate1.cc (1.4), contains2.cc (1.4),
+ contains3.cc (1.4), empty3.cc (1.4), equality1.cc (1.4),
+ exceptions1.cc (1.4), exceptions2.cc (1.4), intersection3.cc
+ (1.4), intersection4.cc (1.4), intersection5.cc (1.4),
+ intersection6.cc (1.4), intersection7.cc (1.4), intersection8.cc
+ (1.4), mapspacedims4.cc (1.4), relations1.cc (1.4), relations2.cc
+ (1.5), removespacedims1.cc (1.4), universe1.cc (1.4): Avoid
+ unused variable warnings.
+
+2005-06-07 Tuesday 19:36 Matthew Mundell
+
+ * src/Row.defs.hh (grids.2): Only befriend Grid when
+ EXTRA_ROW_DEBUG. Take out declaration of operator==(gr,gr) as a
+ friend.
+
+2005-06-07 Tuesday 18:17 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.21): Include
+ Constraint_Systems.inlines.hh.
+
+2005-06-07 Tuesday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/.cvsignore (1.2), tests/Polyhedron/.cvsignore
+ (1.5): Updated.
+
+2005-06-07 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/.cvsignore (1.1), src/.cvsignore (1.8),
+ tests/BD_Shape/.cvsignore (1.3), tests/Polyhedron/.cvsignore
+ (1.3), tests/Polyhedron/.cvsignore (1.4): Updated.
+
+2005-06-07 Tuesday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.cc (1.2): Indentation fixed.
+
+2005-06-07 Tuesday 16:28 Matthew Mundell
+
+ * interfaces/Prolog/SWI/Makefile.am (grids.1): Link against pl in
+ rule ppl_pl$(EXEEXT).
+
+2005-06-07 Tuesday 12:43 Matthew Mundell
+
+ * src/Row.defs.hh (grids.1): Temporarily befriend operator==(gr,gr)
+ and Grid, and make method capacity public, for tracing.
+
+2005-06-07 Tuesday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.6): Temporary kludge for Darwin that
+ may turn out to be the right thing to do on any system.
+
+2005-06-07 Tuesday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.161): Version number bumped.
+
+2005-06-07 Tuesday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.19): Include "compiler.hh".
+
+2005-06-01 Wednesday 20:26 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc,
+ Grid_public.cc (grids.[20,10,16,33]): Take out method
+ add_low_level_congruences.
+
+2005-06-01 Wednesday 20:25 Matthew Mundell
+
+ * src/Generator_System.cc (grids.7): Update comments. Re-enable
+ the ascii_load comparison between actual and declared types.
+
+2005-06-01 Wednesday 20:23 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[12,8]): Update comments. In OK add a message for the
+ number of columns check and take out an old test.
+
+2005-06-01 Wednesday 20:20 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+ (grids.[6,12,8]): Update comments. Add a modulus method that
+ returns a writable reference.
+
+2005-06-01 Wednesday 18:12 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.19): Make most of the constructors
+ explicit.
+
+2005-06-01 Wednesday 17:07 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+ (grids.[18,13,32]): Take out the add_and_minimize\3 methods.
+ Update some comments. In the add_and_minimize\2 methods add all
+ the given rows to the system, instead of looking for duplicates.
+ Convert rays to lines in all generator-adding methods, for now.
+
+2005-06-01 Wednesday 13:15 Matthew Mundell
+
+ * src/Grid_public.cc (grids.31): In add_generators add rays as
+ lines, for now.
+
+2005-06-01 Wednesday 13:11 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.3): Add more interesting generators in
+ test3. Add test4, in which a ray is inserted.
+
+2005-05-28 Saturday 13:17 Matthew Mundell
+
+ * tests/Grid/bug1.dat, src/Generator_System.cc (grids.[2,6]): In
+ Generator_System::asci_load leave the stream read position at the
+ end of the dump.
+
+2005-05-27 Friday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[12,1,1]): The
+ program `bug1' exhibits a bug triggered by an invocation of (to
+ be renamed) Grid::add_congruences_and_minimize(const
+ Constraint_System&).
+
+2005-05-27 Friday 21:02 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.12): Improve a comment.
+
+2005-05-27 Friday 21:02 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.10): Revert last change.
+
+2005-05-27 Friday 20:54 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.9): Improve a comment.
+
+2005-05-27 Friday 20:53 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_minimize.cc, Grid_nonpublic.cc,
+ Grid_public.cc (grids.[17,12,15,30]): Take out methods
+ normalize_divisors and parameterize. In the construct methods
+ leave the system as given (instead of simplifying it). Always
+ clear the pending rows flag of an added generator system. Set
+ the sorted flag in the generator construct method. Neaten some
+ formatting.
+
+2005-05-27 Friday 14:57 Matthew Mundell
+
+ * tests/ppl_test.hh, tests/Grid/addgenerator1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/congruencesystem2.cc,
+ tests/Grid/writecongruencesystem.cc, src/Congruence.cc,
+ src/Congruence_System.cc, src/Generator_System.cc,
+ src/Grid.inlines.hh, src/Grid_chdims.cc, src/Grid_conversion.cc,
+ src/Grid_minimize.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+ src/Grid_simplify.cc
+ (grids.[6,6,7,3,3,5,11,5,9,8,12,11,14,29,22]): Use `!' instead of
+ comparing to `false'.
+
+2005-05-27 Friday 14:53 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.11): Make zero_dim_false and
+ zero_dim_integrality public.
+
+2005-05-26 Thursday 20:50 Matthew Mundell
+
+ * tests/Grid/join2.cc (grids.2): Add test2 which joins with both
+ grids universe.
+
+2005-05-26 Thursday 20:50 Matthew Mundell
+
+ * tests/Grid/join1.cc (grids.2): Add test2 and test3 which join
+ with both and one grids universe.
+
+2005-05-26 Thursday 20:30 Matthew Mundell
+
+ * src/Grid_public.cc (grids.28): Rename adjust_space_dimension to
+ increase_space_dimension.
+
+2005-05-26 Thursday 20:30 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh,
+ Congruence_System.inlines.hh (grids.[10,7,5]): Rename
+ adjust_space_dimension to increase_space_dimension, and
+ num_non_equalities to num_proper_congruences. Only count proper
+ congruences in num_proper_congruences. Take out method
+ saturates_all_congruences. Make the member access permissions
+ more sensible. Enable the definition of zero_dim_empty.
+
+2005-05-26 Thursday 20:24 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence.inlines.hh,
+ Grid_conversion.cc, Grid_simplify.cc (grids.[10,7,11,21]): Make
+ the Congruence normalize methods protected and flag setting
+ methods private. In Congruence rename is_congruence to
+ is_proper_congruence, and add method zero_dim_false.
+
+2005-05-26 Thursday 20:20 Matthew Mundell
+
+ * tests/Grid/: congruence1.cc, congruencesystem1.cc,
+ congruencesystem2.cc (grids.[4,5,2]): Wrap the class under test,
+ instead of requiring all methods to be public.
+
+2005-05-26 Thursday 17:01 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (grids.2): Add test2, which adds to
+ an empty grid.
+
+2005-05-26 Thursday 17:01 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.5): Add test7, which adds a
+ generator to a universe grid.
+
+2005-05-26 Thursday 17:00 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.20): Improve a variable name, and a
+ comment.
+
+2005-05-26 Thursday 16:58 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[16,27]): Restore the
+ declaration of add_congruence(c), and add a new declaration for
+ add_congruences_and_minimize(cs). Take out the
+ add_congruence_and_minimize(cs) declaration. Improve the
+ ordering of the public definitions. Define add_congruence(c) and
+ add_congruence_and_minimize(c).
+
+2005-05-26 Thursday 16:52 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh,
+ Congruence_System.inlines.hh (grids.[9,6,4]): Call num_columns
+ later in adjust_space_dimension. Add insert(c). Take out an old
+ constraint comment. Take out pending row code, old
+ constraint_system code, and method
+ satisfies_all_congruences(g,ref). Clean up ascii_dump and some
+ of ascii_load. Correct the names in the Congruence_System(c)
+ declaration.
+
+2005-05-26 Thursday 16:38 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+ (grids.[4,9,6]): Take out throw_invalid_modulus. Update some
+ temporary comments. In Congruence(c) throw an exception if the
+ constraint is a relation, and set the modulus to 0 instead of 1.
+
+2005-05-26 Thursday 13:21 Matthew Mundell
+
+ * src/Grid_public.cc (grids.26): In add_generator also clear the
+ congruences up-to-date flag when adding to an empty grid.
+
+2005-05-26 Thursday 12:52 Matthew Mundell
+
+ * tests/Grid/addspacedims2.cc (grids.3): Add test6, which add
+ dimensions only to the grid's generator system.
+
+2005-05-26 Thursday 12:51 Matthew Mundell
+
+ * tests/Grid/addspacedims1.cc (grids.6): Improve comment.
+
+2005-05-25 Wednesday 21:18 Matthew Mundell
+
+ * src/Grid_public.cc (grids.25): In OK, take the extra copy of the
+ generator system out of the minimized test, Use "generators"
+ instead of "parameters", and print the minimized congruence
+ system (instead of the original) in the congruence minimized
+ test.
+
+2005-05-25 Wednesday 20:47 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.11): Add test addcongruence1.
+
+2005-05-25 Wednesday 20:47 Matthew Mundell
+
+ * tests/Grid/addcongruence1.cc (grids.1): Initial revision.
+
+2005-05-25 Wednesday 20:46 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.4): Add test6, which tests
+ add_generator_and_minimize.
+
+2005-05-25 Wednesday 19:27 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.3): Add tests 2 to 5.
+
+2005-05-25 Wednesday 14:48 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.8): Start from the universe when
+ constructing grids from congruences.
+
+2005-05-25 Wednesday 14:46 Matthew Mundell
+
+ * src/Grid_public.cc (grids.24): Take the extra temporary
+ congruence system out of the OK minimize test. Modify
+ add_recycled_congruences and
+ add_recycled_congruences_and_minimize to update the congruences
+ before adding new ones. Also improve the empty handling in both
+ these methods.
+
+2005-05-25 Wednesday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.29), config.sub (1.28), install-sh (1.14),
+ ltmain.sh (1.24), Watchdog/config.guess (1.13),
+ Watchdog/config.sub (1.13), Watchdog/install-sh (1.11),
+ Watchdog/ltmain.sh (1.13): Updated from Libtool 1.5.18.
+
+2005-05-25 Wednesday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.28), config.sub (1.27), ltmain.sh (1.23),
+ Watchdog/config.guess (1.12), Watchdog/config.sub (1.12),
+ Watchdog/ltmain.sh (1.12): Updated from Libtool 1.5.16.
+
+2005-05-25 Wednesday 07:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.144): Added one issue to be checked before releasing PPL
+ 0.8.
+
+2005-05-25 Wednesday 07:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.46): The `libppl_swiprolog'
+ library must be linked also with `libpwl'.
+
+2005-05-24 Tuesday 21:27 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_chdims.cc,
+ Grid_nonpublic.cc, Grid_public.cc (grids.[15,8,7,13,23]): Take
+ out all code for handling pending rows. Add a check for pending
+ rows to method OK.
+
+2005-05-24 Tuesday 21:23 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.19): Use unset_pending_rows instead
+ of clearing the pending rows manually.
+
+2005-05-24 Tuesday 19:17 Matthew Mundell
+
+ * src/Grid_public.cc (grids.22): Always adjust the space dimension
+ of con_sys in constructor Grid(num_dimensions, kind). Clean a
+ comment.
+
+2005-05-24 Tuesday 18:23 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.10): Take out tracing.
+
+2005-05-24 Tuesday 18:13 Matthew Mundell
+
+ * src/Grid.defs.hh, tests/Grid/addgenerator1.cc,
+ tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+ tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+ tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+ tests/Grid/mapspacedims1.cc, tests/Grid/removespacedims2.cc
+ (grids.[14,2,5,2,11,7,2,2,4,2]): In constructor
+ Grid(num_dimensions, kind) kind is UNIVERSE if only
+ num_dimensions if given.
+
+2005-05-24 Tuesday 17:14 Matthew Mundell
+
+ * src/Grid_public.cc (grids.21): Output "true" from operator<< if
+ the grid is universe.
+
+2005-05-24 Tuesday 17:01 Matthew Mundell
+
+ * tests/Grid/addspacedims1.cc (grids.4): Add test5, where
+ dimensions are only added to the congruence system.
+
+2005-05-24 Tuesday 16:55 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.10): Add test addgenerator1.
+
+2005-05-24 Tuesday 16:55 Matthew Mundell
+
+ * tests/Grid/addgenerator1.cc (grids.1): Initial revision.
+
+2005-05-24 Tuesday 16:54 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.3): Add test6 (maps additional
+ dimensions to themselves), test7 (maps over existing dimensions)
+ and test8 (maps away a dimension in an empty grid).
+
+2005-05-24 Tuesday 16:51 Matthew Mundell
+
+ * src/Grid_public.cc (grids.20): Set congruences up to date in
+ add_congruence. Implement the rest of add_generator.
+
+2005-05-23 Monday 19:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (grids.19):
+ Grid::add_congruences_and_minimize(const Constraint_System& cs)
+ fixed.
+
+2005-05-23 Monday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Grid_public.cc (grids.18): In
+ Grid::add_congruences_and_minimize(const Constraint_System& cs),
+ non equality constraints that may be present in `cs' are simply
+ ignored.
+
+2005-05-23 Monday 18:09 Matthew Mundell
+
+ * src/Grid_public.cc (grids.17): Implement some of add_generator.
+ Modify add_congruences_and_minimize to match the dimension of the
+ congruence system being constructed to the given constraint
+ system. Correct a doxygen comment.
+
+2005-05-23 Monday 15:57 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.2): Add test5.
+
+2005-05-23 Monday 15:51 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.18): Adjust the system's row capacity
+ after inserting or erasing rows.
+
+2005-05-23 Monday 15:48 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.6): In add_space_dimensions_and_embed
+ correct the clearing of the minimize flags and the loop that adds
+ virtual rows. Take some pending code out of concatenate_assign.
+
+2005-05-20 Friday 09:12 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.9): Add test mapspacedims1.
+
+2005-05-20 Friday 09:12 Matthew Mundell
+
+ * tests/Grid/mapspacedims1.cc (grids.1): Initial revision.
+
+2005-05-20 Friday 09:11 Matthew Mundell
+
+ * src/Grid.inlines.hh (grids.7): Enable and implement method
+ map_space_dimensions.
+
+2005-05-19 Thursday 09:35 Matthew Mundell
+
+ * src/Grid_public.cc (grids.16): Take out some of the pending code.
+ Add the definition of add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:34 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.13): Temporarily add
+ add_congruences_and_minimize and erroneously rename
+ add_congruences to add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:07 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.17): Rename pivot_num to pivot_index.
+ In the congruence reduction swap the current row with a newly
+ accessed pivot instead of with the original reference to the
+ pivot. Also decrement the pivot_index in macro free_row.
+
+2005-05-18 Wednesday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/.cvsignore (grids.1): Put under CVS control.
+
+2005-05-18 Wednesday 17:45 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.10): Always define
+ is_upper_triangular and is_lower_triangular. Add some tracing.
+
+2005-05-18 Wednesday 17:43 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.12): Always declare is_upper_triangular
+ and is_lower_triangular
+
+2005-05-18 Wednesday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Grid/Makefile.in (grids.2): Makefile.in is a generated file
+ and should not be put under CVS.
+
+2005-05-18 Wednesday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (grids.3): Improvements to the section on
+ rational grids.
+
+2005-05-17 Tuesday 22:06 Abramo Bagnara
+
+ * src/checked.inlines.hh (1.18): abs may legitimately fail with
+ overflow.
+
+2005-05-17 Tuesday 19:31 Abramo Bagnara
+
+ * src/Init.cc (1.17): Fixed include file.
+
+2005-05-15 Sunday 20:03 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.21): Moved rounding mode handling to a lower
+ level. Converted some method to functions.
+
+2005-05-15 Sunday 18:13 Abramo Bagnara
+
+ * src/: Init.cc (1.16), Init.defs.hh (1.12), Makefile.am (1.110),
+ Rounding.defs.hh (1.11), Rounding.inlines.hh (1.8),
+ checked.defs.hh (1.19), checked.inlines.hh (1.17),
+ checked_float.inlines.hh (1.37), checked_int.inlines.hh (1.32),
+ checked_mpz.inlines.hh (1.22), fpu-none.inlines.hh (1.1): Moved
+ rounding mode handling to a lower level.
+
+2005-05-15 Sunday 18:11 Abramo Bagnara
+
+ * src/: BD_Shape.inlines.hh (1.48), Checked_Number.defs.hh (1.26),
+ Checked_Number.inlines.hh (1.32): Converted many Checked_Number
+ method in functions.
+
+2005-05-15 Sunday 10:34 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.8): Add test concatenate1.
+
+2005-05-15 Sunday 10:34 Matthew Mundell
+
+ * tests/Grid/concatenate1.cc (grids.1): Initial revision.
+
+2005-05-15 Sunday 10:33 Matthew Mundell
+
+ * tests/Grid/removespacedims1.cc (grids.2): Take out trace dumping.
+
+2005-05-15 Sunday 10:32 Matthew Mundell
+
+ * tests/Grid/addspacedims1.cc (grids.3): Shorten comments.
+
+2005-05-15 Sunday 10:31 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.16): In the congruence reduction,
+ after erasing rows set the row capacity of the system from the
+ first row.
+
+2005-05-15 Sunday 10:18 Matthew Mundell
+
+ * src/Grid_public.cc (grids.15): Add loading of the minimize flag
+ to ascii_load.
+
+2005-05-15 Sunday 10:16 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.5): Enable and implement
+ concatenate_assign.
+
+2005-05-15 Sunday 10:13 Matthew Mundell
+
+ * src/Generator_System.cc (grids.4): In method ascii_load, turn off
+ the type check (for now), and correctly handle reading in the
+ virtual flag.
+
+2005-05-15 Sunday 10:09 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.8): In operator== decrement the
+ row count before the comparing the elements.
+
+2005-05-15 Sunday 10:08 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.5): In find_variation, dump the ASCII of
+ `a' before loading it into `b', and print an error and exit if
+ the load fails.
+
+2005-05-12 Thursday 18:11 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.7): Add test removespacedims1.
+
+2005-05-12 Thursday 18:10 Matthew Mundell
+
+ * tests/Grid/removespacedims1.cc (grids.1): Initial revision.
+
+2005-05-12 Thursday 18:10 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.12): Clean comments and take out
+ tracing in normalize_divisors.
+
+2005-05-12 Thursday 18:09 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.4): Enable and implement
+ add_space_dimensions.
+
+2005-05-12 Thursday 18:07 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.11): Integrate a too-deeply nested
+ doxygen sublist into the parent item. Correct parameter names in
+ some method descriptions.
+
+2005-05-12 Thursday 16:04 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.8): Take doxygen \p's out of maths
+ environments.
+
+2005-05-12 Thursday 14:49 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.7): Escape %'s in maths
+ environments.
+
+2005-05-12 Thursday 14:13 Matthew Mundell
+
+ * src/Grid_public.cc (grids.14): In OK declare limit the scope of
+ variable num_columns, instead of jumping into that scope. Add
+ the state of minimization to the ascii_dump output.
+
+2005-05-12 Thursday 13:20 Matthew Mundell
+
+ * src/Makefile.am (grids.3): Add Congruence, Congruence_System and
+ Grid files to DOC_FILES.
+
+2005-05-12 Thursday 13:15 Matthew Mundell
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in (grids.[1,1]): Add files for
+ Congruence, Congruence_System and Grid to INPUT.
+
+2005-05-12 Thursday 09:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (grids.2): Several small improvements to the
+ new documentation on grids.
+
+2005-05-11 Wednesday 20:18 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.6): Add test removespacedims2.
+
+2005-05-11 Wednesday 20:17 Matthew Mundell
+
+ * tests/Grid/removespacedims2.cc (grids.1): Initial revision.
+
+2005-05-11 Wednesday 20:16 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.11): Enable
+ remove_pending_to_obtain_generators.
+
+2005-05-11 Wednesday 20:15 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.3): Update
+ add_space_dimensions_and_project to clear the generator system if
+ the grid is empty. Enable and implement method
+ remove_higher_space_dimensions.
+
+2005-05-11 Wednesday 17:17 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.5): Add tests isuniverse1 and
+ addspacedims2.
+
+2005-05-11 Wednesday 17:16 Matthew Mundell
+
+ * tests/Grid/addspacedims1.cc (grids.2): Improve the file
+ description. Take out excess variable declarations. Add a check
+ that the grid is the universe to test3.
+
+2005-05-11 Wednesday 17:12 Matthew Mundell
+
+ * tests/Grid/: addspacedims2.cc, isuniverse1.cc (grids.[1,1]):
+ Initial revision.
+
+2005-05-11 Wednesday 17:07 Matthew Mundell
+
+ * src/Grid_public.cc (grids.13): Enable and finish off is_universe.
+
+2005-05-11 Wednesday 17:03 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_chdims.cc (grids.[10,2]): Add method
+ add_space_dimensions(cgs, gs dims). Declare the original
+ add_space_dimensions inline. Update the space dimension
+ adjusting functions to set the created generators to lines via
+ flags (instead of explicit calls to the respective methods).
+ Implement add_space_dimensions_and_project. Improve some
+ comments.
+
+2005-05-11 Wednesday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox, ppl.sty (grids.[1,1]): Introductory
+ documentation for grids and draft specifications of most of the
+ main operations to be implemented.
+
+2005-05-09 Monday 12:40 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.4): Add tests addspacedims1,
+ intersection1, intersection2, join1 and join2.
+
+2005-05-09 Monday 12:39 Matthew Mundell
+
+ * tests/Grid/addspacedims1.cc (grids.1): Initial revision.
+
+2005-05-09 Monday 12:36 Matthew Mundell
+
+ * tests/Grid/: grid3.cc, intersection1.cc, intersection2.cc,
+ join1.cc, join2.cc (grids.[3,1,1,1,1]): Move operation tests to
+ per-operation files. Add various tests of the
+ intersection_assign methods.
+
+2005-05-09 Monday 12:32 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.6): Add test13 (an empty grid
+ constructed with congruences).
+
+2005-05-09 Monday 12:32 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.10): Add test19 (a generator system
+ with only a line).
+
+2005-05-09 Monday 12:31 Matthew Mundell
+
+ * tests/Grid/: congruence1.cc, congruencesystem1.cc (grids.[3,4]):
+ Use C++ style single line comments. Take out some duplicate
+ Variables.
+
+2005-05-09 Monday 12:28 Matthew Mundell
+
+ * tests/print.hh (grids.2): Declare nout and vnout static.
+
+2005-05-09 Monday 12:27 Matthew Mundell
+
+ * src/Makefile.am (grids.2): Add Grid_chdims.cc to
+ libppl_la_SOURCES.
+
+2005-05-09 Monday 12:26 Matthew Mundell
+
+ * src/Grid_chdims.cc (grids.1): Initial revision, with methods
+ add_space_dimensions and add_space_dimensions_and_embed enabled.
+
+2005-05-09 Monday 12:24 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_public.cc, Grid_simplify.cc
+ (grids.[9,12,15]): Add method add_space_dimensions. Change the
+ type of the reduce_equality_with_equality arguments to
+ Congruence. Rename reduce_line_with_parameter to
+ reduce_parameter_with_line. Rename
+ reduce_equality_with_congruence to
+ reduce_congruence_with_equality. Enable the definition of method
+ contains. Update comments. Take out some tracing. Correct the
+ asserts in two of the reduce functions.
+
+2005-05-09 Monday 12:05 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.10): Take out some tracing. Update
+ comments left from Polyhedron.
+
+2005-05-09 Monday 12:00 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[7,5]): Take out a line of tracing and the declaration of
+ method insert(const Constraint&). Update a comment.
+
+2005-05-06 Friday 11:47 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.9): Correct method name typo.
+
+2005-05-06 Friday 11:39 Matthew Mundell
+
+ * tests/Grid/grid3.cc (grids.2): Use A instead of C in test1. Add
+ test2, test3 and test4, which test
+ intersection_assign_and_minimize, join_assign and
+ join_assign_and_minimize.
+
+2005-05-06 Friday 11:37 Matthew Mundell
+
+ * src/: Grid_conversion.cc, Grid_simplify.cc (grids.[8,14]): Use
+ new method Congruence_System::is_congruence. Update parameter
+ reduction to make all following rows virtual if the first row
+ turns out to be virtual or a line. Update congruence reduction
+ to make the first row the integrality congruence if the resulting
+ grid is empty.
+
+2005-05-06 Friday 11:29 Matthew Mundell
+
+ * src/Grid_public.cc (grids.11): Enable and implement
+ intersection_assign_and_minimize, join_assign and
+ join_assign_and_minimize.
+
+2005-05-06 Friday 11:27 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.9): Normalise moduli before
+ simplifying in construct. Correct some comments.
+
+2005-05-06 Friday 11:26 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.9): Reorder method definitions. Add
+ some temporary comments.
+
+2005-05-06 Friday 11:22 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence.inlines.hh,
+ Congruence_System.cc (grids.[6,5,6]): Add method is_congruence.
+ Adjust normalize_moduli to loop through all the rows when
+ calculating the LCM.
+
+2005-05-05 Thursday 10:55 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.3): Add grid3_SOURCES and add grid3
+ to TESTS.
+
+2005-05-05 Thursday 10:54 Matthew Mundell
+
+ * tests/Grid/grid3.cc (grids.1): Initial revision.
+
+2005-05-05 Thursday 10:49 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.13): Rename function
+ trailing_rows_are_zero to rows_are_zero, and modify it to also
+ take the last row (instead of just checking to the end). Update
+ the call of this function in the congruence simplify to correctly
+ check the rows at the beginning of the matrix.
+
+ In the congruence simplify decrement orig_row_num in macro
+ free_row, to match it to the new number of rows.
+
+2005-05-05 Thursday 10:42 Matthew Mundell
+
+ * src/Grid_public.cc (grids.10): Simplify instead of processing
+ pending, in is_universe. Enable processing of pending generators
+ in add_congruence. Enable and implement intersection_assign.
+
+2005-05-05 Thursday 10:36 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.8): Minimize instead of simplifying
+ in the process_pending methods. Update a comment.
+
+2005-05-05 Thursday 10:34 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.8): Take out tracing, add a comment.
+
+2005-05-05 Thursday 10:34 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[5,4]): Add void method add_rows(const
+ Congruence_System&).
+
+2005-05-05 Thursday 10:32 Matthew Mundell
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[9,5]): Convert comments
+ to C++ style.
+
+2005-05-04 Wednesday 15:04 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+ Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+ (grids.[8,6,7,7,9,12]): Rename constructor parameters from cgs to
+ const_gs, and from cs to cgs. Add static methods
+ lower_triangular and upper_triangular, and use them in OK. Use
+ these and new function identity as pre-conversion assertions.
+ Take out the congruence-related and Grid versions of
+ throw_topology_incompatible, and the old Polyhedron constructor
+ definitions. Clean up the topology checking in general. Comment
+ out the parameter name in add_low_level_congruences to work
+ around a compiler warning. Clean some argument spacing and
+ update some comments. Update construct to convert a given NNC
+ generator system to NC.
+
+2005-05-03 Tuesday 15:20 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.11): Only throw the "type match" run
+ time errors when assertions are enabled.
+
+2005-05-03 Tuesday 15:03 Matthew Mundell
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[8,4]): Neaten tracing
+ headers. Use the single argument Grid constructor, instead of
+ explicitly passing kind as EMPTY. Create known grids using the
+ copy constructor. Add the known grid check to test15. Add
+ test16, test17 and test18, which test universe grids of one, many
+ and zero dimensions.
+
+2005-05-03 Tuesday 15:02 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.10): Turn off tracing.
+
+2005-05-03 Tuesday 15:01 Matthew Mundell
+
+ * src/Grid_public.cc (grids.8): Ensure that dimensions given to the
+ constructor are small enough. Implement method is_universe.
+ Enable, clean up and improve the OK method. Add operator= (moved
+ from Grid_nonpublic.cc).
+
+2005-05-03 Tuesday 14:48 Matthew Mundell
+
+ * src/Grid_nonpublic.cc (grids.6): Take out operator= (moved to
+ Grid_public.cc). Enable and update process_pending_congruences
+ and process_pending_generators. Enable the pending processing in
+ minimize(). Drop the topol argument from calls to
+ throw_space_dimension_overflow.
+
+2005-05-03 Tuesday 14:40 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.7): Simplify before initialising the
+ destination in the minimize functions. Improve the loops that
+ create identity matrices.
+
+2005-05-03 Tuesday 14:35 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.6): Update some comments. Add and
+ use macro ctrace_dump. Only throw the "type match" run time
+ errors when assertions are enabled. Move source_diag init out of
+ the row-processing loop in the parameter to congruence
+ conversion.
+
+2005-05-03 Tuesday 14:22 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[7,5]): Improve some
+ comments. Revert the miscellaneous methods to private. Drop
+ throw_space_dimension_overflow's topol argument. Take out the
+ bounding box method definitions. Enable method process_pending.
+
+2005-05-03 Tuesday 14:11 Matthew Mundell
+
+ * tests/Grid/congruencesystem1.cc (grids.3): Neaten test7.
+
+2005-04-28 Thursday 18:50 Abramo Bagnara
+
+ * src/: Float.defs.hh (1.7), checked_float.inlines.hh (1.36): Avoid
+ some compiler warnings.
+
+2005-04-27 Wednesday 21:45 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+ Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+ Grid_simplify.cc (grids.[6,4,5,6,5,7,9]): Take out all saturation
+ matrix code, polyhedron method descriptions, some tracing, the
+ polyhedron related parts of exception messages, and the methods
+ obtain_sorted_congruences, obtain_sorted_generators,
+ obtain_sorted_congruences_with_sat_c and
+ obtain_sorted_generators_with_sat_g.
+
+ Only pass the source and destination systems to the conversion
+ and simplify methods. Revert some of the temporarily public
+ methods to private. Clean up the minimize methods and enclose
+ them in a namespace block.
+
+ Conversion
+
+ Enclose the method definitions in a namespace block. Improve
+ comments and initial asserts. Skip multiplying the destination
+ grid
+ by the multiplier when the multiplier is one. Use temporary
+ variables better in the parameter to congruence version.
+
+ Reduction
+
+ Neaten the reduce_line_with_line description, and some variable
+ names in the reduce methods. Only define
+ trailing_rows_are_zero
+ when assertions are enabled.
+
+2005-04-27 Wednesday 21:10 Matthew Mundell
+
+ * src/Congruence_System.inlines.hh (grids.3): Take old comment out
+ of resize_no_copy.
+
+2005-04-26 Tuesday 20:54 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.8): Use the new is_virtual and
+ set_is_virtual methods instead of the old virtual row functions.
+ Clean up many of the temporary comments and some of the others.
+ Improve variable names. Take out some of the trace printing.
+ Improve the loop used to iterate through the preceding rows in
+ the congruence reduction. Move the congruence reduction OK
+ assertion so that is is called in every return case. Save doing
+ one of the comparisons in the empty grid check at the end of the
+ congruence reduction.
+
+2005-04-26 Tuesday 20:38 Matthew Mundell
+
+ * src/Grid_minimize.cc (grids.5): Add an assertion that there are
+ rows to the 4 parameter congruence to generator minimize method.
+ Take the Polhedron assertion comment out of both of the 4
+ parameter minimize methods.
+
+2005-04-26 Tuesday 20:33 Matthew Mundell
+
+ * src/: Generator_System.cc, Grid_conversion.cc, Grid_nonpublic.cc
+ (grids.[3,4,4]): Use new is_virtual and set_is_virtual methods
+ instead of the old virtual row functions.
+
+2005-04-26 Tuesday 20:30 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh (grids.[5,3]): Take out the
+ virtual row functions (replace with methods in the Generator and
+ Congruence classes).
+
+2005-04-26 Tuesday 20:28 Matthew Mundell
+
+ * src/: Generator.defs.hh, Generator.inlines.hh (grids.[2,1]): Add
+ is_virtual.
+
+2005-04-26 Tuesday 20:27 Matthew Mundell
+
+ * src/Congruence_System.defs.hh (grids.3): Correct comment.
+
+2005-04-26 Tuesday 20:26 Matthew Mundell
+
+ * src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[5,4]):
+ Add methods is_virtual and set_is_virtual. Assert that there are
+ elements in methods modulus and set_is_equality.
+
+2005-04-26 Tuesday 11:04 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.7): Add test15, which tests
+ reduce_line_with_line. Neaten the generator system definition in
+ test9.
+
+2005-04-25 Monday 19:35 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid_simplify.cc (grids.[4,7]): Use
+ strace_dump in the congruence system reduction.
+
+ The previous log message should have been:
+
+ Improve comments. Split le_le_reduce into
+ reduce_equality_with_equality and reduce_line_with_line. Improve
+ the names, arguments and variables of all the reduce functions.
+ Also consider the divisor in reduce_line_with_line. Use
+ Coefficient_traits::const_reference in the reduce functions.
+ Correct the assertions. Add and use macro strace_dump and
+ temporary tracing stream strace.
+
+2005-04-25 Monday 18:58 Matthew Mundell
+
+ * src/Grid_public.cc (grids.6): In
+ add_recycled_congruences_and_minimize use the add_and_minimize
+ return directly, instead of using a variable.
+
+2005-04-25 Monday 18:48 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.6): In
+ add_recycled_congruences_and_minimize use the add_and_minimize
+ return directly, instead of using a variable.
+
+2005-04-25 Monday 18:46 Matthew Mundell
+
+ * src/Grid_conversion.cc (grids.3): Rename the trace stream ctrace.
+
+2005-04-25 Monday 18:42 Matthew Mundell
+
+ * src/GMP_Integer.defs.hh (grids.2): Improve comment.
+
+2005-04-25 Monday 13:03 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.3): Add general tests test11 and
+ test12, which have more and fewer rows than columns,
+ respectively.
+
+2005-04-22 Friday 11:41 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.2): Add general test cong_test4.
+
+2005-04-21 Thursday 12:30 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.2): Add grid2_SOURCES, and add
+ grid2 to TESTS.
+
+2005-04-21 Thursday 12:29 Matthew Mundell
+
+ * tests/Grid/grid2.cc (grids.1): Initial revision.
+
+2005-04-21 Thursday 12:28 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.6): Always compare the grid and known
+ grid in the same order. Match the test names in the comments to
+ the new Chiara names.
+
+2005-04-21 Thursday 12:16 Matthew Mundell
+
+ * src/Grid_public.cc (grids.5): Update
+ add_recycled_congruences_and_minimize to clear the empty flag and
+ set the congruences up-to-date. Take out the polyhedra comments
+ in operator==, and neaten operator<<.
+
+2005-04-21 Thursday 12:10 Matthew Mundell
+
+ * src/: Grid_minimize.cc, Grid_nonpublic.cc, Grid_simplify.cc
+ (grids.[4,3,5]): Return a bool from the update_congruences and
+ simplify methods to indicate whether the grid is empty. Pass
+ this return on in the minimize and add_and_minimize methods which
+ call simplify. Assert an equal number of columns in source1 and
+ source2 in add_and_minimize\5 (congruence to generator).
+
+ In update_congruences and update_generators set the grid empty
+ according to the minimize return.
+
+ In both simplifys use the row number instead of the row to test
+ if the original row and pivot must be swapped. In the congruence
+ simplify when adding the top row, search for a valid modulus and
+ set the diagonal (and modulus) to the result of the search.
+
+2005-04-21 Thursday 11:51 Matthew Mundell
+
+ * src/Grid.defs.hh (grids.3): Return a bool from update_congruences
+ and simplify to indicate whether the grid is empty. Pass this
+ return on in the minimize and add_and_minimize methods which call
+ simplify. Assert an equal number of columns in the sources in
+ the congruence to generator add_and_minimize\5.
+
+2005-04-21 Thursday 11:40 Matthew Mundell
+
+ * src/Generator_System.cc (grids.2): In operator<< increment the
+ iterator after the virtual row check, and loop with a single
+ comparison.
+
+2005-04-21 Thursday 11:37 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.4): Take out normalize_moduli
+ tracing. Add satisfies_all_cgs tracing. Update normalize_moduli
+ to consider only positive moduli. Make adjust_space_dimension
+ move the moduli to the new last column. Neaten the operator<<
+ loop.
+
+2005-04-19 Tuesday 19:08 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.5): Add test14 which uses larger
+ numbers than the existing tests.
+
+2005-04-19 Tuesday 14:22 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.4): Add test11-13 which test with an
+ empty grid in one, an empty grid in many dimensions and a grid in
+ which the values are larger than in the existing tests.
+
+2005-04-19 Tuesday 14:17 Matthew Mundell
+
+ * src/Linear_Row.cc (grids.1): Note the virtual row in
+ Flags::ascii_dump.
+
+2005-04-19 Tuesday 14:15 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.4): Include the divisor in the
+ parameter version of le_pc_reduce. In the congruence version
+ consider every row (instead of leaving out the last row) and skip
+ modifying virtual rows.
+
+2005-04-19 Tuesday 14:07 Matthew Mundell
+
+ * src/: Grid_minimize.cc, Grid_public.cc (grids.[3,4]): Take out
+ the pending row tracing.
+
+2005-04-17 Sunday 19:38 Abramo Bagnara
+
+ * src/: fpu-c99.inlines.hh (1.5), fpu-ia32.inlines.hh (1.6),
+ fpu.defs.hh (1.4): Code cleaning. Added
+ fpu_set_rounding_direction.
+
+2005-04-15 Friday 18:55 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.3): Take out tracing. Enable
+ comparison to known grid in test1.
+
+2005-04-15 Friday 18:51 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.4): ASCII dump `a'.
+
+2005-04-15 Friday 18:49 Matthew Mundell
+
+ * src/Grid_simplify.cc (grids.3): When the first row must be added,
+ add an empty congruence or point instead of a virtual row.
+
+2005-04-15 Friday 17:29 Matthew Mundell
+
+ * tests/Grid/Makefile.am (grids.1): Initial revision.
+
+2005-04-15 Friday 15:23 Matthew Mundell
+
+ * src/Congruence.inlines.hh (grids.3): Take out tracing.
+
+2005-04-15 Friday 15:23 Matthew Mundell
+
+ * src/Congruence.defs.hh (grids.4): Take out inclusion of test
+ file.
+
+2005-04-15 Friday 12:12 Matthew Mundell
+
+ * tests/Grid/grid1.cc (grids.2): Add test7 to test10, and update
+ all tests to test reduction and conversion.
+
+2005-04-15 Friday 12:11 Matthew Mundell
+
+ * tests/Grid/congruencesystem1.cc (grids.2): Add test7, which
+ includes an all-zero congruence and an equality.
+
+2005-04-15 Friday 12:07 Matthew Mundell
+
+ * src/: Linear_Row.defs.hh, Linear_Row.inlines.hh (grids.[1,1]):
+ Add a virtual flag and methods is_virtual and set_is_virtual.
+
+2005-04-15 Friday 12:06 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+ Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+ Grid_simplify.cc (grids.[2,2,2,2,2,3,2]): Add much tracing.
+ Neaten whitespace. Improve comments. Change the parameter
+ system type to Generator_System in methods minimize and simplify.
+ Rename convert to conversion (to match Polyhedron). Temporarily
+ make some private methods public (for testing). Change
+ parameterize to return the generator system and add the ability
+ to pass a reference point to parameterize. Add static methods
+ virtual_row and mark_virtual.
+
+ Adjust is_included_in to the parameter system.
+
+ Move the definition of construct to Grid_nonpublic.cc. Enable
+ operator!=.
+
+ Add conversion from parameter system to congruence system, and
+ get both conversion methods working. Add a trace stream.
+
+ Update the minimize and add_and_minimize methods. In all of
+ these include negative values in the check for an empty grid
+ after conversion, and always set the destination generators and
+ generator system necessarily closed.
+
+ Direct out some of the saturation matrix code. Correct the empty
+ flag handling after adding congruences to the grid. In
+ Grid(num_dimensions,kind) change the initial generator system
+ topology to necessarily closed and set the congruences to
+ minimized directly via status when the grid is empty.
+
+ Update reduction (the simplify methods).
+
+2005-04-15 Friday 11:01 Matthew Mundell
+
+ * src/Generator_System.cc (grids.1): Add virtual_rows to loading
+ and dumping.
+
+2005-04-15 Friday 10:55 Matthew Mundell
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh,
+ Congruence_System.inlines.hh (grids.[3,2,2]): Add method
+ resize_no_copy and a version of satisfies_all_congruences that
+ accepts a parameter. In operator== substitute a local
+ implementation for the Matrix::operator== call. Leave out
+ equalities in normalize_moduli. In both
+ satisfies_all_congruences compare the scalar product with zero
+ for equalities.
+
+2005-04-15 Friday 10:41 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+ (grids.[3,3,2]): Add versions of reduced_scalar_product_assign
+ and scalar_product_assign which accept parameters. Add method
+ set_is_equality. In normalize set the inhomogeneous term to the
+ modulus when the coefficients are all zero. Correct the loading
+ of the "m" in ascii_load.
+
+2005-04-15 Friday 10:30 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.3): In find_variation_template neaten
+ the failure output, take out the tracing output, and note that
+ `a' must be up to date.
+
+2005-04-11 Monday 00:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Time.inlines.hh (1.3): Fixed a bug in
+ Time::operator+=(const Time&).
+
+2005-04-10 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.47), tests/BD_Shape/affineimage8.cc
+ (1.2), tests/BD_Shape/affineimage9.cc (1.2),
+ tests/BD_Shape/affinepreimage5.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage14.cc (1.3): Improved
+ methods BD_Shape::affine_image(Variable, const
+ Linear_Expression&, Coefficient_traits::const_reference),
+ BD_Shape::affine_preimage(Variable, const Linear_Expression&,
+ Coefficient_traits::const_reference), and
+ BD_Shape::generalized_affine_image(Variable, Relation_Symbol,
+ const Linear_Expression&, Coefficient_traits::const_reference).
+
+2005-04-06 Wednesday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.20): Added negate_round_up().
+
+2005-04-03 Sunday 17:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.51): Wrong indentation corrected.
+
+2005-04-03 Sunday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.36): Sentence fixed.
+
+2005-04-02 Saturday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.18), BD_Shape.inlines.hh (1.46): Added
+ method Constraint_System BD_Shape<T>::minimized_constraints()
+ const.
+
+2005-03-31 Thursday 12:14 Matthew Mundell
+
+ * doc/Makefile.am (1.34): Keep TXT_LICENSES in LICENSES. Use
+ specific licence variables in ALL_TARGETS, instead of LICENSES.
+
+2005-03-31 Thursday 12:11 Matthew Mundell
+
+ * demos/ppl_lcdd/examples/README (1.3): Make "example" plural.
+
+2005-03-31 Thursday 12:10 Matthew Mundell
+
+ * debian/: libppl.dirs (1.2), libppl.install (1.3), rules (1.4):
+ Add ppl_lcdd to the libppl package. Extract the PPL version
+ string from configure.ac instead of from one of the documentation
+ files. Make the PWL. Install the PWL and Debian changelog to
+ libppl-pwl. Copy the Debian changelog to libppl correctly.
+
+2005-03-31 Thursday 12:03 Matthew Mundell
+
+ * debian/: libppl-pwl.dirs (1.1), libppl-pwl.docs (1.1),
+ libppl-pwl.install (1.1): Initial revision.
+
+2005-03-31 Thursday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-pwl.dirs (altnum.1): file libppl-pwl.dirs was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-pwl.docs (altnum.1): file libppl-pwl.docs was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:02 Matthew Mundell
+
+ * debian/control (1.7): For the PWL package, correct long and short
+ descriptions and take out the libppl dependency.
+
+2005-03-31 Thursday 11:59 Matthew Mundell
+
+ * configure.ac (1.160): Add Debian copyright files to
+ AC_CONFIG_FILES. Clean some whitespace.
+
+2005-03-31 Thursday 11:58 Matthew Mundell
+
+ * debian/libppl-pwl.links (1.2): Use libppl-pwl.docs instead of a
+ symlink.
+
+2005-03-31 Thursday 11:56 Matthew Mundell
+
+ * debian/libppl.copyright (1.2): Move to libppl.copyright.in.
+
+2005-03-31 Thursday 11:55 Matthew Mundell
+
+ * debian/libppl.copyright.in (1.1): Initial revision (moved here
+ from libppl.copyright).
+
+2005-03-31 Thursday 11:54 Matthew Mundell
+
+ * debian/libppl-pwl.copyright.in (1.1): Initial revision.
+
+2005-03-29 Tuesday 23:22 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.25), Checked_Number.inlines.hh
+ (1.31), Float.defs.hh (1.6), Float.inlines.hh (1.8), Makefile.am
+ (1.109), checked.cc (1.1), checked.defs.hh (1.18),
+ checked.inlines.hh (1.16), checked_ext.defs.hh (1.7),
+ checked_ext.inlines.hh (1.17), checked_float.inlines.hh (1.35),
+ checked_int.inlines.hh (1.31), checked_mpq.inlines.hh (1.18),
+ checked_mpz.inlines.hh (1.21): New implementation of standardized
+ input of checked numbers. Added mpq to float conversion.
+
+2005-03-29 Tuesday 16:40 Matthew Mundell
+
+ * doc/README.doc (1.4): Revert accidental previous commit.
+
+2005-03-29 Tuesday 16:37 Matthew Mundell
+
+ * doc/: README.doc (1.3), Makefile.am (1.33): Preserve text
+ licences across the clean rules by making CLEANFILES and
+ ALL_TARGETS only refer to files that can be built. Take
+ duplicate text files out of EXTRA_DIST. Take out the dist-hook
+ rule.
+
+2005-03-29 Tuesday 16:29 Matthew Mundell
+
+ * debian/rules (1.3): For the config.status rule add a Watchdog
+ configure command and take out the dependency on configure.
+
+2005-03-29 Tuesday 12:01 Matthew Mundell
+
+ * debian/rules (1.2): Add configure flags assignment suggested in
+ Debian autotools-dev README. Change DOC_DIR to libppl-dev (user
+ manual moved to package libppl-dev). Update comment.
+
+2005-03-29 Tuesday 11:50 Matthew Mundell
+
+ * debian/libppl.doc-base (1.2): Moved to libppl-dev.doc-base.user
+ (user manual moved to package libppl-dev).
+
+2005-03-29 Tuesday 11:47 Matthew Mundell
+
+ * debian/libppl-dev.doc-base.user (1.1): Initial revision.
+
+2005-03-29 Tuesday 11:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.doc-base.user (altnum.1): file
+ libppl-dev.doc-base.user was added on branch altnum on 2006-10-29
+ 19:26:52 +0000
+
+2005-03-29 Tuesday 11:45 Matthew Mundell
+
+ * debian/libppl-dev.doc-base (1.2): Make the fields in the first
+ section contiguous. Update HTML directory name.
+
+2005-03-29 Tuesday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.doc-base (altnum.1): file libppl-dev.doc-base
+ was added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-29 Tuesday 11:43 Matthew Mundell
+
+ * debian/control (1.6): Add automake1.4 build conflict. Update
+ interface short descriptions. As per Developers Reference: take
+ leading "The"'s out of short descriptions, add homepage field to
+ long descriptions, take mention of Free Software out of the long
+ descriptions.
+
+2005-03-26 Saturday 10:45 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.24), checked.defs.hh (1.17),
+ checked_ext.inlines.hh (1.16), checked_float.inlines.hh (1.34),
+ checked_int.inlines.hh (1.30): Cosmetic fix to conform to usual
+ C++ guidelines.
+
+2005-03-26 Saturday 10:24 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.23), Checked_Number.inlines.hh
+ (1.30), checked.defs.hh (1.16), checked_ext.inlines.hh (1.15),
+ checked_float.inlines.hh (1.33), checked_int.inlines.hh (1.29),
+ checked_mpq.inlines.hh (1.17), checked_mpz.inlines.hh (1.20):
+ Fixed assignments from infinities.
+
+2005-03-25 Friday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.17), BD_Shape.inlines.hh (1.45): Pass
+ arguments of type Coefficient using
+ Coefficient_traits::const_reference instead of plain const
+ reference.
+
+2005-03-25 Friday 15:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.16), BD_Shape.inlines.hh (1.44): Some
+ unwanted const qualifiers have been removed. Some desirable
+ const qualifiers have been added.
+
+2005-03-25 Friday 12:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.43): Use the proper constructor when
+ building a BDS from a polyhedron.
+
+2005-03-25 Friday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/exceptions3.cc (1.6): Reflect the recent changes
+ in the behavior of BDS methods for affine images and preimages.
+
+2005-03-25 Friday 10:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.15): The documentation of
+ generalized_affine_image(const Linear_Expression&, const
+ Relation_Symbol, const Linear_Expression&) is now consistent with
+ the implementation.
+
+2005-03-25 Friday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.42): Comments of
+ generalized_affine_image(Variable, Relation_Symbol,
+ Linear_Expression&, const Coefficient&) somewhat cleaned up.
+
+2005-03-25 Friday 10:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.14): The documentation of
+ generalized_affine_image(Variable, Relation_Symbol,
+ Linear_Expression&, const Coefficient&); is now consistent with
+ the documentation.
+
+2005-03-25 Friday 09:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.41): Comments of
+ affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+ somewhat cleaned up.
+
+2005-03-25 Friday 09:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.13): The documentation of
+ affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+ is now consistent with the documentation.
+
+2005-03-25 Friday 09:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.40): Comments of
+ affine_image(Variable, Linear_Expression&, const Coefficient&)
+ somewhat cleaned up.
+
+2005-03-25 Friday 09:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.12): File comment fixed. The
+ documentation of affine_image(Variable, Linear_Expression&, const
+ Coefficient&) is now consistent with the documentation.
+
+2005-03-24 Thursday 11:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.127): Comments
+ concerning the widening and extrapolation predicates changed so
+ as to state explicitly that the polyhedron referenced by the 1st
+ handle must contain the polyhedron referenced by the second
+ handle.
+
+2005-03-24 Thursday 09:48 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.22), Checked_Number.inlines.hh
+ (1.29), Rounding.defs.hh (1.10): Permit rounding default
+ direction different from CURRENT. Added Checked_Number methods to
+ save/restore rounding mode.
+
+2005-03-23 Wednesday 19:21 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.21), Checked_Number.inlines.hh
+ (1.28), checked_float.inlines.hh (1.32), checked_int.inlines.hh
+ (1.28), checked_mpq.inlines.hh (1.16), checked_mpz.inlines.hh
+ (1.19), checked_numeric_limits.hh (1.3): Added explicit 'signed'
+ to integral types. Fixed set_special for mpz and mpq. Use always
+ extended assignment for Checked_Number.
+
+2005-03-22 Tuesday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.14): Programs
+ boundedh79extrapolation1 and nnc_boundedh79extrapolation1 removed
+ from XFAIL_WITH_INT8 and added to XFAIL_WITH_INT8_A.
+
+2005-03-22 Tuesday 14:36 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.20), Checked_Number.inlines.hh
+ (1.27), Result.defs.hh (1.9), checked.defs.hh (1.15),
+ checked_ext.inlines.hh (1.14), checked_float.inlines.hh (1.31),
+ checked_int.inlines.hh (1.27), checked_mpq.inlines.hh (1.15),
+ checked_mpz.inlines.hh (1.18): Removed unused pred/succ. Don't
+ return special result for representable values.
+
+2005-03-22 Tuesday 13:01 Matthew Mundell
+
+ * STANDARDS (grids.2): Take out the paragraph about the check_dump
+ function.
+
+2005-03-22 Tuesday 13:00 Matthew Mundell
+
+ * tests/Grid/writecongruencesystem.cc (grids.2): Take out the dump
+ comparisons. Add find_variation checks. Use endl instead of
+ '\n'.
+
+2005-03-22 Tuesday 12:58 Matthew Mundell
+
+ * tests/Grid/congruence1.cc (grids.2): Take out all dump
+ comparisons. Use find_variation instead of check_ok. Print
+ fewer NOISY tracing messages. Add dumps to the NOISY test
+ failure messages.
+
+2005-03-22 Tuesday 12:55 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.2): Take out check_dump. Create the
+ comparison object in find_variation_template with a copy
+ constructor.
+
+2005-03-22 Tuesday 12:54 Matthew Mundell
+
+ * src/Grid_public.cc (grids.2): Define the copy constructor.
+
+2005-03-22 Tuesday 12:53 Matthew Mundell
+
+ * src/Congruence_System.cc (grids.2): Use Congruence::ascii_load.
+
+2005-03-22 Tuesday 12:52 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[2,2]): Add method
+ ascii_load.
+
+2005-03-21 Monday 20:12 Matthew Mundell
+
+ * src/: Matrix.cc, Matrix.defs.hh (grids.[1,1]): Declare Grid and
+ an operator== as friends. Add method add_row.
+
+2005-03-21 Monday 20:03 Matthew Mundell
+
+ * doc/devref.doxyconf-html.in (grids.1): Add Grid, Congruence and
+ Congruence_System files to INPUT.
+
+2005-03-21 Monday 19:59 Matthew Mundell
+
+ * src/Row.defs.hh (1.93): Take out dot following \brief.
+
+2005-03-21 Monday 19:52 Matthew Mundell
+
+ * src/Makefile.am (grids.1): Add Grid, Congruence and
+ Congruence_System files to INCLUDE_FILES and libppl_la_SOURCES.
+
+2005-03-21 Monday 19:49 Matthew Mundell
+
+ * src/: Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+ (grids.[1,1]): Declare Congruence, two operator%='s and
+ swap(Linear_Expression&, Linear_Expression&) as friends. Add
+ copy constructor which takes size and capacity.
+
+2005-03-21 Monday 19:35 Matthew Mundell
+
+ * src/Generator_System.defs.hh (grids.1): Declare Grid friendship.
+
+2005-03-21 Monday 19:34 Matthew Mundell
+
+ * src/Generator.defs.hh (grids.1): Declare Grid and
+ Congruence_System as friends.
+
+2005-03-21 Monday 19:33 Matthew Mundell
+
+ * src/Constraint.defs.hh (grids.1): Declare Congruence a friend.
+
+2005-03-21 Monday 19:32 Matthew Mundell
+
+ * src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+ Congruence.types.hh, Congruence_System.cc,
+ Congruence_System.defs.hh, Congruence_System.inlines.hh,
+ Congruence_System.types.hh (grids.[1,1,1,1,1,1,1,1]): Initial
+ revision.
+
+2005-03-21 Monday 19:30 Matthew Mundell
+
+ * src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (grids.[1,1]):
+ Add gcdext_assign.
+
+2005-03-21 Monday 19:27 Matthew Mundell
+
+ * tests/ppl_test.hh (grids.1): Include the std and PPL namespaces.
+ Define macro stringify, function checkdump and template
+ find_variation_template.
+
+2005-03-21 Monday 19:24 Matthew Mundell
+
+ * tests/print.hh (grids.1): Set NOISY and VERY_NOISY from the
+ associated directives. Create the nout and vnout streams.
+
+2005-03-21 Monday 19:22 Matthew Mundell
+
+ * tests/Makefile.am (grids.1): Add Grid to SUBDIRS.
+
+2005-03-21 Monday 19:21 Matthew Mundell
+
+ * tests/Grid/: Makefile.in, congruence1.cc, congruencesystem1.cc,
+ congruencesystem2.cc, grid1.cc, writecongruencesystem.cc
+ (grids.[1,1,1,1,1,1]): Initial revision.
+
+2005-03-21 Monday 19:15 Matthew Mundell
+
+ * src/: Grid.defs.hh, Grid.inlines.hh, Grid.types.hh,
+ Grid_Status.cc, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+ Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+ Grid_public.cc, Grid_simplify.cc (grids.[1,1,1,1,1,1,1,1,1,1,1]):
+ Initial, partial, rough revision.
+
+2005-03-21 Monday 19:11 Matthew Mundell
+
+ * configure.ac (grids.1): Add tests/Grid/Makefile to
+ AC_CONFIG_FILES.
+
+2005-03-21 Monday 19:09 Matthew Mundell
+
+ * STANDARDS (grids.1): Add "Standards for the Test Programs"
+ section.
+
+2005-03-16 Wednesday 21:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.13): Added
+ `boundedbhrz03extrapolation1' and
+ `nnc_boundedbhrz03extrapolation1' to `XFAIL_WITH_INT8'.
+
+2005-03-16 Wednesday 07:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.44): The limited widening methods
+ now immediately fall back to their non-limited counterparts when
+ given an empty constraint system.
+
+2005-03-14 Monday 10:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.108): Added `ppl_include_files.hh' to
+ `noinst_HEADERS' and `BUILT_SOURCES'.
+
+2005-03-13 Sunday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BD_Shape.defs.hh (1.11), BD_Shape.inlines.hh (1.39):
+ BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape&) now has
+ its stop-points stored in a local, static array..
+
+2005-03-13 Sunday 20:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.107): Added `fpu-c99.inlines.hh' to
+ `INCLUDE_FILES'.
+
+2005-03-13 Sunday 20:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.29): Added `build_header' to `EXTRA_DIST'.
+
+2005-03-13 Sunday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: addspacedims1.cc (1.4), addspacedims2.cc (1.4),
+ addspacedims4.cc (1.4), addspacedims5.cc (1.4), addspacedims6.cc
+ (1.4): Unused variables removed or commented out.
+
+2005-03-13 Sunday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.hh (1.2): Include "version.hh".
+
+2005-03-13 Sunday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/addspacedims3.cc (1.4): Useless variable removed.
+
+2005-03-13 Sunday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.143), build_header (1.1), src/BDS_Status.idefs.hh (1.6),
+ src/BD_Shape.defs.hh (1.10), src/DB_Row.defs.hh (1.6),
+ src/E_Rational.inlines.hh (1.7), src/Float.inlines.hh (1.7),
+ src/Makefile.am (1.106), src/Ph_Status.idefs.hh (1.9),
+ src/Polyhedron.defs.hh (1.269), src/checked_int.inlines.hh
+ (1.26), src/ppl_header.bottom (1.7), src/ppl_header.hh (1.1),
+ src/ppl_header.middle (1.6), src/ppl_header.top (1.9),
+ tests/ppl_test.hh (1.19): New, simpler and less problematic
+ machinery to build ppl_install.hh. (The `build_header' script
+ has been written by Abramo Bagnara.)
+
+2005-03-11 Friday 21:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/generalizedaffineimage14.cc (1.2): Copyright years
+ fixed.
+
+2005-03-11 Friday 20:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.11), constraints2.cc (1.4),
+ exceptions3.cc (1.5), generalizedaffineimage2.cc (1.4),
+ generalizedaffineimage3.cc (1.4), polydifference1.cc (1.4),
+ relations2.cc (1.4), relations3.cc (1.4), relations5.cc (1.4),
+ writebdiffs1.cc (1.4), writebdiffs2.cc (1.4), writebdshape1.cc
+ (1.1), writebdshape2.cc (1.1): We no longer call them "bounded
+ differences": we call them "bounded difference shapes" or "BDS"
+ instead.
+
+2005-03-11 Friday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.38),
+ tests/BD_Shape/generalizedaffineimage10.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage7.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage8.cc (1.4): Fixed a bug in
+ BD_Shape<T>::generalized_affine_image(Variable, const
+ Relation_Symbol, const Linear_Expression&, const Coefficient&).
+
+2005-03-09 Wednesday 17:19 Matthew Mundell
+
+ * debian/libppl.docs (1.2): TODO is currently for internal use.
+
+2005-03-09 Wednesday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl.docs (altnum.1): file libppl.docs was added on
+ branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:37 Matthew Mundell
+
+ * debian/copyright (1.2): Move to libppl.copyright.
+
+2005-03-09 Wednesday 12:24 Matthew Mundell
+
+ * debian/: libppl-c.dirs (1.1), libppl-c.install (1.1),
+ libppl-c.links (1.1), libppl-dev.doc-base (1.1), libppl-dev.docs
+ (1.1), libppl-dev.links (1.1), libppl-gprolog.links (1.1),
+ libppl-pwl.links (1.1), libppl-sicstus.links (1.1),
+ libppl-swi.links (1.1), libppl-yap.links (1.1), libppl.copyright
+ (1.1), libppl.doc-base (1.1), libppl.docs (1.1): Initial
+ revisions.
+
+2005-03-09 Wednesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-c.dirs (altnum.1): file libppl-c.dirs was added on
+ branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-c.install (altnum.1): file libppl-c.install was
+ added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-c.links (altnum.1): file libppl-c.links was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.docs (altnum.1): file libppl-dev.docs was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.links (altnum.1): file libppl-dev.links was
+ added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:46 Matthew Mundell
+
+ * debian/libppl.install (1.2): Only install the main library
+ (others now installed in interface packages).
+
+2005-03-09 Wednesday 11:45 Matthew Mundell
+
+ * debian/libppl-dev.dirs (1.2): Replace package specific doc dir
+ with the general libppl doc dir. Take out usr/lib/pkgconfig.
+
+2005-03-09 Wednesday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/libppl-dev.dirs (altnum.1): file libppl-dev.dirs was added
+ on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:43 Matthew Mundell
+
+ * debian/control (1.5): Rename to libppl. Add a source section
+ name. Depend on graphviz and debhelper version of 4 or higher.
+ Drop libppl-c-dev. Complete the entries for the interface
+ packages.
+
+2005-03-09 Wednesday 11:38 Matthew Mundell
+
+ * debian/: changelog (1.1), rules (1.1): Initial revision.
+
+2005-03-05 Saturday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.12),
+ boundedbhrz03extrapolation1.cc (1.1): A new, very interesting,
+ test program showing an analysis of linear invariants divided
+ into phases: a first propagation phase (without widening),
+ followed by a widening phase employing the "widening up to"
+ technique and further preserving interval constraints. Notice
+ that neither the H79 nor the BHRZ03 limited extrapolations (used
+ as widenings here) allow to obtain the desired postfixpoint for
+ this example (since they lose the crucial constraint `k <= 1').
+ Both the H79 and the BHRZ03 bounded extrapolation operators do
+ achieve this result.
+
+2005-03-05 Saturday 13:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.43): Internal implementation class
+ BW_Box was no longer used: removed.
+
+2005-03-05 Saturday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.42),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.4):
+ Polyhedron::bounded_BHRZ03_extrapolation_assign() and
+ Polyhedron::bounded_H79_extrapolation_assign() now use
+ Bounding_Box::CC76_widening_assign() to make sure the interval
+ constraints that are preserved do not cause termination problems.
+ Test program boundedh79extrapolation1.cc (it was testing nothing
+ anyway).
+
+2005-03-05 Saturday 13:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.10), generalizedaffineimage14.cc
+ (1.1): New test for BD_Shape::generalized_affine_image().
+
+2005-03-05 Saturday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bounding_Box.cc (1.6), Bounding_Box.defs.hh (1.6): New
+ method Constraint_System Bounding_Box::constraints() const.
+
+2005-03-05 Saturday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Bounding_Box.cc (1.5): Fixed
+ Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+ Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Bounding_Box.cc (1.4), Bounding_Box.defs.hh (1.5): Added
+ Bounding_Box::CC76_widening_assign(const Bounding_Box& y) and
+ template <typename Iterator>
+ Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+ Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.22), Interval.inlines.hh (1.21): Added
+ non-const versions of accessors.
+
+2005-03-04 Friday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.9): Comments for
+ CC76_extrapolation_assign(const BD_Shape& y) and
+ CC76_extrapolation_assign(const BD_Shape& y, Iterator first,
+ Iterator last) revised.
+
+2005-03-04 Friday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.268): Misleading variable name changed
+ in the Polyhedron class documentation.
+
+2005-03-03 Thursday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/control (1.4): Now libppl-dev depends on libppl.
+
+2005-03-03 Thursday 15:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.37):
+ BD_Shape::generalized_affine_image(const Linear_Expression&,
+ const Relation_Symbol, const Linear_Expression&) improved.
+
+2005-03-03 Thursday 12:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/: libppl-dev.dirs (1.1), libppl-dev.install (1.1),
+ libppl.dirs (1.1), libppl.install (1.1): Directories and
+ installed files for packages libppl and libppl-dev.
+
+2005-03-03 Thursday 12:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/control (1.3): Packages named `libppl*' instead of `ppl*'.
+ Dependency from g++ fixed.
+
+2005-03-03 Thursday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.170): Some headings properly capitalized.
+
+2005-03-02 Wednesday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.36): Simplified the logic of
+ BD_Shape<T>::BD_Shape(const Polyhedron&, Complexity_Class).
+
+2005-03-02 Wednesday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.267): Befriend template <typename T>
+ class BD_Shape.
+
+2005-03-02 Wednesday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.113): Use of simplex temporarily
+ disabled in Polyhedron::shrink_bounding_box() until we have an
+ efficient way to compute the topological closure of a constraint
+ system.
+
+2005-03-02 Wednesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.35): Added an initial, very rough
+ implementation of BD_Shape<T>::BD_Shape(const Polyhedron&,
+ Complexity_Class).
+
+2005-03-01 Tuesday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/affinetrans.cc (1.4): Misleading variable name
+ changed.
+
+2005-03-01 Tuesday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: affineimage1.cc (1.4), affineimage2.cc (1.4),
+ affineimage3.cc (1.4), affineimage4.cc (1.4), affineimage5.cc
+ (1.4), affineimage6.cc (1.4), affineimage7.cc (1.4),
+ affinepreimage1.cc (1.4), affinepreimage2.cc (1.4),
+ affinepreimage3.cc (1.4), affinepreimage4.cc (1.4),
+ exceptions3.cc (1.4): Avoid declaring variables when a temporary
+ would do the same thing more clearly.
+
+2005-03-01 Tuesday 20:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.34), tests/BD_Shape/Makefile.am (1.9),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage13.cc (1.1),
+ tests/BD_Shape/generalizedaffineimage4.cc (1.4),
+ tests/BD_Shape/generalizedaffineimage5.cc (1.4):
+ BD_Shape<T>::generalized_affine_image() can now handle any
+ expression.
+
+2005-03-01 Tuesday 11:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am (1.8),
+ tests/BD_Shape/affinepreimage5.cc (1.1):
+ BD_Shape<T>::affine_preimage() can now handle any expression.
+
+2005-03-01 Tuesday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.32), tests/BD_Shape/Makefile.am (1.7),
+ tests/BD_Shape/affineimage8.cc (1.1),
+ tests/BD_Shape/affineimage9.cc (1.1): BD_Shape<T>::affine_image()
+ can now handle any expression.
+
+2005-03-01 Tuesday 10:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.26): Wrong dependency fixed.
+
+2005-03-01 Tuesday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/control (1.2): Dependencies changed so as to depend on g++
+ == 3.4. Added autoconf, automake1.9, libtool and doxygen to
+ Build-Depends. (Thanks to Michael Tautschnig.)
+
+2005-02-28 Monday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/: compat (1.1), control (1.1), copyright (1.1): Initial
+ drafts put under CVS control.
+
+2005-02-28 Monday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/compat (altnum.1): file compat was added on branch altnum
+ on 2006-10-29 19:26:52 +0000
+
+2005-02-28 Monday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.25): URL for the source fixed.
+
+2005-02-27 Sunday 22:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/watchdog1.cc (1.4): Empty throw specification
+ added to ~Timeout().
+
+2005-02-27 Sunday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.112): Slight simplification in
+ Polyhedron::shrink_bounding_box(Box&, Complexity_Class).
+
+2005-02-27 Sunday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.8): Added declaration for BD_Shape(const
+ Polyhedron&, Complexity_Class).
+
+2005-02-27 Sunday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.19), globals.inlines.hh (1.9): Class
+ Throwable was missing a virtual destructor: added.
+
+2005-02-27 Sunday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.111):
+ Polyhedron::shrink_bounding_box(Box&, Complexity_Class) improved.
+
+2005-02-27 Sunday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Handler.defs.hh (1.4), Handler.inlines.hh (1.3): Class
+ Handler was missing a virtual destructor: added.
+
+2005-02-27 Sunday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.7): Imprecisions in the comments for
+ BD_Shape(const Generator_System&) corrected.
+
+2005-02-27 Sunday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.31): On exit from
+ BD_Shape<T>::BD_Shape(const Generator_System&), the DBM is always
+ transitively closed.
+
+2005-02-27 Sunday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.30): No longer print spurious newlines
+ in operator<<(std::ostream&, const BD_Shape<T>&).
+
+2005-02-27 Sunday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.110): Useless temporary removed and
+ scope of one variable reduced in
+ Polyhedron::shrink_bounding_box().
+
+2005-02-27 Sunday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.142): Added one more thing to do.
+
+2005-02-27 Sunday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/constraints1.cc (1.4): Needlessly long comment
+ shortened.
+
+2005-02-27 Sunday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/fromgensys1.cc (1.2): Be quiet.
+
+2005-02-27 Sunday 10:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.6), fromgensys1.cc (1.1): New
+ test program for BD_Shape::BD_Shape(const Generator_System&).
+
+2005-02-27 Sunday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.29): BD_Shape::BD_Shape(const
+ Generator_System&) implemented.
+
+2005-02-26 Saturday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.6): Added declaration for
+ BD_Shape::BD_Shape(const Generator_System& gs). Comments for
+ BD_Shape::BD_Shape(const Constraint_System& cs) further improved.
+
+2005-02-26 Saturday 17:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.5): Comments for BD_Shape::BD_Shape(const
+ Constraint_System& cs) improved.
+
+2005-02-24 Thursday 19:05 Matthew Mundell
+
+ * src/: Generator.defs.hh (1.103), Linear_System.cc (1.18): Correct
+ comment typo.
+
+2005-02-24 Thursday 19:05 Matthew Mundell
+
+ * src/Constraint_System.defs.hh (1.9): Correct comment typos and
+ clip off trailing whitespace.
+
+2005-02-22 Tuesday 20:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BHRZ03_Certificate.inlines.hh (1.5): Removed a pair of
+ redundant parentheses.
+
+2005-02-18 Friday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Float.inlines.hh (1.6): Include <climits>.
+
+2005-02-18 Friday 21:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.2): Added more attributes to the
+ specializations of std::numeric_limits for "checked" integer
+ types.
+
+2005-02-18 Friday 18:55 Abramo Bagnara
+
+ * src/: Float.inlines.hh (1.5), checked_int.inlines.hh (1.25):
+ Added U to make explicit unsignedness for constants.
+
+2005-02-18 Friday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.131): Useless type qualifiers removed.
+
+2005-02-18 Friday 15:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Saturation_Matrix.cc (1.3), Saturation_Row.cc (1.6),
+ Saturation_Row.defs.hh (1.5), Saturation_Row.inlines.hh (1.5),
+ conversion.cc (1.68): Several methods speeded up. Now bit
+ positions are represented by means of unsigned longs and the
+ invalid position is represented by ULONG_MAX.
+
+2005-02-18 Friday 15:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.105): Added checked_numeric_limits.hh to
+ INCLUDE_FILES.
+
+2005-02-18 Friday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/empty5.cc (1.3): Allow for every definition of
+ Coefficient.
+
+2005-02-18 Friday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_numeric_limits.hh (1.1): Specializations of
+ std::numeric_limits for "checked" types (still incomplete as far
+ as `round_style' is concerned).
+
+2005-02-17 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.28): BD_Shape<T>::contains() improved.
+
+2005-02-17 Thursday 19:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.27): BD_Shape<T>::poly_hull_assign()
+ improved.
+
+2005-02-17 Thursday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.26):
+ BD_Shape<T>::poly_difference_assign() improved.
+
+2005-02-17 Thursday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.25):
+ BD_Shape<T>::CC76_extrapolation_assign() improved.
+
+2005-02-17 Thursday 19:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.24):
+ BD_Shape<T>::CH78_widening_assign() improved.
+
+2005-02-17 Thursday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.23):
+ BD_Shape<T>::limited_CH78_extrapolation_assign() improved.
+
+2005-02-17 Thursday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.22):
+ BD_Shape<T>::intersection_assign() improved.
+
+2005-02-17 Thursday 18:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.21):
+ BD_Shape<T>::CC76_narrowing_assign() improved.
+
+2005-02-17 Thursday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.20):
+ BD_Shape<T>::add_space_dimensions_and_embed() improved.
+
+2005-02-17 Thursday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.19):
+ BD_Shape<T>::add_space_dimensions_and_project() improved.
+
+2005-02-17 Thursday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.18): BD_Shape<T>::relation_with(const
+ Constraint&) improved.
+
+2005-02-17 Thursday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.17): BD_Shape<T>::relation_with()
+ improved.
+
+2005-02-16 Wednesday 17:34 Abramo Bagnara
+
+ * src/: Float.defs.hh (1.5), Float.inlines.hh (1.4),
+ checked_float.inlines.hh (1.30), checked_mpz.inlines.hh (1.17):
+ Added support for assignment from mpz to floating type.
+
+2005-02-16 Wednesday 17:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.16): Improved
+ BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 16:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.15): Variables renamed in
+ BD_Shape<T>::contains().
+
+2005-02-16 Wednesday 16:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.14): Variables renamed in
+ BD_Shape<T>::concatenate_assign().
+
+2005-02-16 Wednesday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.13): Variable renamed in
+ BD_Shape<T>::is_empty().
+
+2005-02-16 Wednesday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.12): Variable renamed in
+ BD_Shape<T>::is_universe().
+
+2005-02-16 Wednesday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.11): Fixed
+ BD_Shape<T>::limited_CC76_extrapolation_assign().
+
+2005-02-16 Wednesday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.10): Removed redundant declaration
+ from BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 12:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.9):
+ BD_Shape<T>::limited_CC76_extrapolation_assign() cleaned up.
+
+2005-02-15 Tuesday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.80), src/Row.defs.hh (1.92), src/Row.inlines.hh
+ (1.60), tests/ppl_test.hh (1.18), tests/BD_Shape/Makefile.am
+ (1.5), tests/BD_Shape/addconstraints1.cc (1.3),
+ tests/BD_Shape/addspacedims1.cc (1.3),
+ tests/BD_Shape/addspacedims2.cc (1.3),
+ tests/BD_Shape/addspacedims3.cc (1.3),
+ tests/BD_Shape/addspacedims4.cc (1.3),
+ tests/BD_Shape/addspacedims5.cc (1.3),
+ tests/BD_Shape/addspacedims6.cc (1.3),
+ tests/BD_Shape/addspacedims7.cc (1.3),
+ tests/BD_Shape/affineimage1.cc (1.3),
+ tests/BD_Shape/affineimage2.cc (1.3),
+ tests/BD_Shape/affineimage3.cc (1.3),
+ tests/BD_Shape/affineimage4.cc (1.3),
+ tests/BD_Shape/affineimage5.cc (1.3),
+ tests/BD_Shape/affineimage6.cc (1.3),
+ tests/BD_Shape/affineimage7.cc (1.3),
+ tests/BD_Shape/affinepreimage1.cc (1.3),
+ tests/BD_Shape/affinepreimage2.cc (1.3),
+ tests/BD_Shape/affinepreimage3.cc (1.3),
+ tests/BD_Shape/affinepreimage4.cc (1.3),
+ tests/BD_Shape/ascii_dump_load1.cc (1.5),
+ tests/BD_Shape/ascii_dump_load2.cc (1.3),
+ tests/BD_Shape/cc76extrapolation1.cc (1.3),
+ tests/BD_Shape/cc76extrapolation2.cc (1.3),
+ tests/BD_Shape/cc76extrapolation3.cc (1.3),
+ tests/BD_Shape/cc76extrapolation4.cc (1.3),
+ tests/BD_Shape/cc76extrapolation5.cc (1.3),
+ tests/BD_Shape/cc76extrapolation6.cc (1.3),
+ tests/BD_Shape/cc76narrowing1.cc (1.3),
+ tests/BD_Shape/cc76narrowing2.cc (1.3),
+ tests/BD_Shape/cc76narrowing3.cc (1.3),
+ tests/BD_Shape/cc76narrowing4.cc (1.3),
+ tests/BD_Shape/cc76narrowing5.cc (1.3),
+ tests/BD_Shape/ch78widening1.cc (1.3),
+ tests/BD_Shape/ch78widening2.cc (1.3),
+ tests/BD_Shape/ch78widening3.cc (1.3),
+ tests/BD_Shape/ch78widening4.cc (1.3),
+ tests/BD_Shape/ch78widening5.cc (1.3),
+ tests/BD_Shape/ch78widening6.cc (1.3),
+ tests/BD_Shape/ch78widening7.cc (1.3),
+ tests/BD_Shape/ch78widening8.cc (1.3),
+ tests/BD_Shape/concatenate1.cc (1.3),
+ tests/BD_Shape/concatenate2.cc (1.3),
+ tests/BD_Shape/concatenate3.cc (1.3),
+ tests/BD_Shape/concatenate4.cc (1.3),
+ tests/BD_Shape/concatenate5.cc (1.3),
+ tests/BD_Shape/constraints1.cc (1.3),
+ tests/BD_Shape/constraints2.cc (1.3), tests/BD_Shape/contains1.cc
+ (1.3), tests/BD_Shape/contains2.cc (1.3),
+ tests/BD_Shape/contains3.cc (1.3), tests/BD_Shape/empty1.cc
+ (1.3), tests/BD_Shape/empty2.cc (1.3), tests/BD_Shape/empty3.cc
+ (1.3), tests/BD_Shape/empty4.cc (1.3), tests/BD_Shape/empty5.cc
+ (1.2), tests/BD_Shape/equality1.cc (1.3),
+ tests/BD_Shape/exceptions1.cc (1.3),
+ tests/BD_Shape/exceptions2.cc (1.3),
+ tests/BD_Shape/exceptions3.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage10.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage11.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage12.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage3.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage4.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage5.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage6.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage7.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage8.cc (1.3),
+ tests/BD_Shape/generalizedaffineimage9.cc (1.3),
+ tests/BD_Shape/h79widening1.cc (1.3),
+ tests/BD_Shape/intersection1.cc (1.3),
+ tests/BD_Shape/intersection2.cc (1.3),
+ tests/BD_Shape/intersection3.cc (1.3),
+ tests/BD_Shape/intersection4.cc (1.3),
+ tests/BD_Shape/intersection5.cc (1.3),
+ tests/BD_Shape/intersection6.cc (1.3),
+ tests/BD_Shape/intersection7.cc (1.3),
+ tests/BD_Shape/intersection8.cc (1.3),
+ tests/BD_Shape/limitedCC76extrapolation1.cc (1.3),
+ tests/BD_Shape/limitedCC76extrapolation2.cc (1.3),
+ tests/BD_Shape/limitedCC76extrapolation3.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation1.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation2.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation3.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation4.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation5.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation6.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation7.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation8.cc (1.3),
+ tests/BD_Shape/limitedCH78extrapolation9.cc (1.3),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.3),
+ tests/BD_Shape/mapspacedims1.cc (1.3),
+ tests/BD_Shape/mapspacedims2.cc (1.3),
+ tests/BD_Shape/mapspacedims3.cc (1.3),
+ tests/BD_Shape/mapspacedims4.cc (1.3),
+ tests/BD_Shape/maxspacedim.cc (1.4),
+ tests/BD_Shape/polydifference1.cc (1.3),
+ tests/BD_Shape/polydifference2.cc (1.3),
+ tests/BD_Shape/polydifference3.cc (1.3),
+ tests/BD_Shape/polydifference4.cc (1.3),
+ tests/BD_Shape/polydifference5.cc (1.3),
+ tests/BD_Shape/polydifference6.cc (1.3),
+ tests/BD_Shape/polyhull1.cc (1.3), tests/BD_Shape/polyhull2.cc
+ (1.3), tests/BD_Shape/polyhull3.cc (1.3),
+ tests/BD_Shape/polyhull4.cc (1.3),
+ tests/BD_Shape/removespacedims1.cc (1.3),
+ tests/BD_Shape/removespacedims2.cc (1.3),
+ tests/BD_Shape/removespacedims3.cc (1.3),
+ tests/BD_Shape/timeelapse1.cc (1.3),
+ tests/BD_Shape/timeelapse2.cc (1.3),
+ tests/BD_Shape/timeelapse3.cc (1.3),
+ tests/BD_Shape/timeelapse4.cc (1.3),
+ tests/BD_Shape/timeelapse5.cc (1.3), tests/BD_Shape/universe1.cc
+ (1.3), tests/BD_Shape/writebdiffs1.cc (1.3),
+ tests/BD_Shape/writebdiffs2.cc (1.3), tests/Polyhedron/memory2.cc
+ (1.8), tests/Polyhedron/polypowerset1.cc (1.2): Copyright years
+ updated.
+
+2005-02-15 Tuesday 19:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.8): BD_Shape<T>::is_empty() fixed:
+ add_round_down() was used instead of add_round_up().
+
+2005-02-15 Tuesday 19:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: Makefile.am (1.4), empty5.cc (1.1): New test
+ triggering a bug in BD_Shape<T>::is_empty().
+
+2005-02-15 Tuesday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator_System.cc (1.6): Spurious redeclaration removed
+ from Generator_System::ascii_load().
+
+2005-02-15 Tuesday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.inlines.hh (1.16): Make sure inline methods
+ Linear_System::num_pending_rows() and
+ Linear_System::unset_pending_rows() are defined before being
+ invoked.
+
+2005-02-15 Tuesday 18:16 Matthew Mundell
+
+ * src/BDS_Status.idefs.hh (1.5): Correct a typo.
+
+2005-02-14 Monday 21:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.169), interfaces/C/ppl_c.h.in (1.47),
+ src/BDS_Status.idefs.hh (1.4), src/BD_Shape.inlines.hh (1.7),
+ src/BHRZ03_Certificate.defs.hh (1.10), src/Bounding_Box.defs.hh
+ (1.4), src/Checked_Number.cc (1.6), src/Checked_Number.defs.hh
+ (1.19), src/Constraint.cc (1.48), src/DB_Matrix.defs.hh (1.4),
+ src/DB_Row.defs.hh (1.5), src/Generator.cc (1.59),
+ src/Generator.defs.hh (1.102), src/Limits.hh (1.6),
+ src/Linear_Row.defs.hh (1.8), src/Linear_System.cc (1.17),
+ src/Linear_System.inlines.hh (1.15), src/Makefile.am (1.104),
+ src/Native_Integer.defs.hh (1.10), src/Ph_Status.idefs.hh (1.8),
+ src/Poly_Con_Relation.defs.hh (1.26),
+ src/Poly_Gen_Relation.defs.hh (1.24),
+ src/Polyhedra_Powerset.inlines.hh (1.18), src/Polyhedron.defs.hh
+ (1.266), src/Polyhedron_widenings.cc (1.41), src/Powerset.defs.hh
+ (1.11), src/Result.defs.hh (1.8), src/Saturation_Row.defs.hh
+ (1.4), src/checked.inlines.hh (1.15), src/checked_int.inlines.hh
+ (1.24), src/conversion.cc (1.67), src/globals.defs.hh (1.18):
+ Fixed several spelling mistakes.
+
+2005-02-14 Monday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Saturation_Row.cc (1.5), Saturation_Row.inlines.hh (1.4):
+ Saturation_Row::operator[](), operator==(const Saturation_Row&,
+ const Saturation_Row&) and operator!=(const Saturation_Row&,
+ const Saturation_Row&) speeded up.
+
+2005-02-14 Monday 17:19 Matthew Mundell
+
+ * src/Linear_System.inlines.hh (1.14): Improve comment.
+
+2005-02-14 Monday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-ia32.inlines.hh (1.5): Define HIJACK_FPU only if it is
+ not already defined.
+
+2005-02-14 Monday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.6): Do not use assignment with
+ unspecified rounding mode.
+
+2005-02-14 Monday 14:49 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.29): Added rounding functions.
+ Treat specially negative zero representation.
+
+2005-02-13 Sunday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.7), compile (1.4), config.guess (1.27), config.sub
+ (1.26), depcomp (1.9), missing (1.9), mkinstalldirs (1.8),
+ Watchdog/INSTALL (1.4), Watchdog/compile (1.4),
+ Watchdog/config.guess (1.11), Watchdog/config.sub (1.11),
+ Watchdog/depcomp (1.7), Watchdog/missing (1.5),
+ Watchdog/mkinstalldirs (1.4): Updated from Automake 1.9.5.
+
+2005-02-12 Saturday 18:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.50): Little comment improvements.
+
+2005-02-12 Saturday 17:53 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.28): Fixed cut and paste typo.
+
+2005-02-12 Saturday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: E_Rational.defs.hh (1.4), E_Rational.inlines.hh (1.6):
+ Alternative interface functions added to make a comparison with
+ new code possible.
+
+2005-02-12 Saturday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/E_NIT.inlines.hh (1.9): Formatting change.
+
+2005-02-12 Saturday 15:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.22), Watchdog/ltmain.sh (1.11): Updated from Libtool
+ 1.5.14.
+
+2005-02-11 Friday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.16), Linear_System.defs.hh (1.13),
+ Linear_System.inlines.hh (1.13), Polyhedron_nonpublic.cc (1.46),
+ Polyhedron_public.cc (1.49): Pending rows in a linear (constraint
+ or generator) system make sense only when the system is part of a
+ polyhedron. The ordinary copy constructor and assignment
+ operator now turn pending rows into non-pending ones. A full
+ copy constructor and pseudo-assignment are now provided for those
+ cases where the copy and assignment must preserve the pending
+ status of pending rows. These changes fix the bug exhibited by
+ tests/Polyhedron/constraints5.cc and
+ tests/Polyhedron/generators7.cc.
+
+2005-02-11 Friday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh (1.17): Comment reformatted.
+
+2005-02-11 Friday 16:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/generators7.cc (1.2): Fixed and made silent.
+
+2005-02-11 Friday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BD_Shape/ascii_dump_load1.cc (1.4),
+ Polyhedron/constraints5.cc (1.2): Be quiet.
+
+2005-02-11 Friday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint_System.cc (1.6), Constraint_System.inlines.hh
+ (1.3), Generator_System.cc (1.5), Generator_System.inlines.hh
+ (1.3), Linear_System.cc (1.15): Missing assertions added. Code
+ formatting improved.
+
+2005-02-10 Thursday 22:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.11), generators7.cc (1.1): New
+ test triggering a bug in Generator_System::insert(const
+ Generator&).
+
+2005-02-10 Thursday 22:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.10), constraints5.cc (1.1): New
+ test triggering a bug in Constraint_System::insert(const
+ Constraint&).
+
+2005-02-10 Thursday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/fpu-c99.inlines.hh (1.4): Code reformatted as per our coding
+ standards.
+
+2005-02-10 Thursday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_cfli.ic (1.11):
+ Prolog_put_ulong() fixed.
+
+2005-02-10 Thursday 16:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: compiler.hh (1.4), fpu-ia32.inlines.hh (1.4): Code
+ reformatted as per our coding standards.
+
+2005-02-10 Thursday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.inlines.hh (1.14): Missing "used declaration" added.
+
+2005-02-10 Thursday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.cc (1.5): Useless break removed.
+
+2005-02-10 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.9): Missing std:: qualifier added.
+
+2005-02-10 Thursday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.27): Declare strtof() and
+ strtod() if they are not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.159): Check for the declaration of strtof() and
+ strtod().
+
+2005-02-10 Thursday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.cc (1.4): All *.cc files must include
+ <config.h> first.
+
+2005-02-10 Thursday 16:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.26): Declare strtold() if this is
+ not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.158): Check for the declaration of strtold().
+
+2005-02-08 Tuesday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.sub (1.25), install-sh (1.13), Watchdog/config.sub (1.10),
+ Watchdog/install-sh (1.10): Updated.
+
+2005-02-08 Tuesday 20:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.21), Watchdog/ltmain.sh (1.10): Updated from Libtool
+ 1.5.12.
+
+2005-02-08 Tuesday 12:01 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.17): Fixed use of native types.
+
+2005-02-08 Tuesday 11:49 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.18), src/Checked_Number.inlines.hh
+ (1.26), tests/ppl_test.hh (1.16): Allow rounding direction
+ save/restore for both Checked_Number and native types.
+
+2005-02-08 Tuesday 11:10 Abramo Bagnara
+
+ * src/: checked.inlines.hh (1.13), checked_int.inlines.hh (1.23),
+ checked_mpz.inlines.hh (1.16): Pushed rounding to a lowest level.
+
+2005-02-03 Thursday 10:02 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.15): Added inline keyword.
+
+2005-01-31 Monday 22:33 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.14): Fixed two typos.
+
+2005-01-31 Monday 22:30 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.42), interfaces/C/ppl_c.cc (1.130),
+ interfaces/Prolog/ppl_prolog.icc (1.154),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.31),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.27),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.74),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.98),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.65),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.90),
+ src/Checked_Number.defs.hh (1.17), src/Checked_Number.inlines.hh
+ (1.25), src/E_NIT.inlines.hh (1.8), src/E_Rational.inlines.hh
+ (1.5), src/Interval.inlines.hh (1.20),
+ src/Polyhedron_nonpublic.cc (1.45), src/Rounding.defs.hh (1.9),
+ src/Rounding.inlines.hh (1.7), src/checked.defs.hh (1.14),
+ src/checked.inlines.hh (1.12), src/checked_ext.defs.hh (1.6),
+ src/checked_ext.inlines.hh (1.13), src/checked_float.inlines.hh
+ (1.25), src/checked_int.inlines.hh (1.22),
+ src/checked_mpq.inlines.hh (1.14), src/checked_mpz.inlines.hh
+ (1.15), tests/ppl_test.hh (1.13): Better efficiency for
+ Checked_Number.
+
+2005-01-29 Saturday 09:38 Abramo Bagnara
+
+ * src/Checked_Number.defs.hh (1.16), src/Checked_Number.inlines.hh
+ (1.24), src/checked_ext.inlines.hh (1.12),
+ src/checked_float.inlines.hh (1.24), tests/ppl_test.hh (1.12):
+ More work to improve performance on extended numbers.
+
+2005-01-28 Friday 12:24 Abramo Bagnara
+
+ * src/: checked.defs.hh (1.13), checked.inlines.hh (1.11),
+ checked_ext.inlines.hh (1.11), checked_int.inlines.hh (1.21),
+ checked_mpq.inlines.hh (1.13), checked_mpz.inlines.hh (1.14):
+ Attempt to improve performance of extended numbers.
+
+2005-01-28 Friday 11:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.9): Removed ascii_dump_load4 from
+ XFAIL_WITH_INT8_A.
+
+2005-01-27 Thursday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/E_NIT.inlines.hh (1.7): Fixed exact_neg(E_NIT<T>& to, const
+ E_NIT<T>& x).
+
+2005-01-27 Thursday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: E_NIT.defs.hh (1.4), E_NIT.inlines.hh (1.6): Added
+ constructor and assignment operator from Plus_Infinity.
+
+2005-01-27 Thursday 20:25 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.15), Checked_Number.inlines.hh
+ (1.23): Added constructors for special values. Added functors to
+ return special values.
+
+2005-01-27 Thursday 17:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/E_NIT.inlines.hh (1.5), tests/ppl_test.hh (1.11): Temporarily
+ added a modified interface for E_NIT.
+
+2005-01-27 Thursday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.103): Include the declaration and definition
+ of E_NIT and E_Rational into ppl.hh.
+
+2005-01-27 Thursday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.8), memory2.cc (1.7): Now
+ memory2 fails only if a memory leak is detected. Check for
+ possible memory leaks caused by any type of exception.
+
+2005-01-27 Thursday 00:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.7), memory2.cc (1.6): Added
+ much more serious tests to guard against the introduction of
+ memory leaks.
+
+2005-01-26 Wednesday 19:13 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh (1.22), checked_ext.inlines.hh
+ (1.10), checked_mpq.inlines.hh (1.12), checked_mpz.inlines.hh
+ (1.13): Bug fixes for checked numbers I/O.
+
+2005-01-26 Wednesday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (1.5): Corrected and generalized.
+
+2005-01-26 Wednesday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/ascii_dump_load1.cc (1.3): Be noisy so as to show
+ that things are not working as expected.
+
+2005-01-26 Wednesday 16:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (1.5): Use the function is_nonnegative()
+ instead of the method is_nonnegative().
+
+2005-01-26 Wednesday 15:45 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.14), Checked_Number.inlines.hh
+ (1.21), checked.defs.hh (1.12), checked.inlines.hh (1.10),
+ checked_ext.defs.hh (1.5), checked_ext.inlines.hh (1.9),
+ checked_float.inlines.hh (1.23), checked_int.inlines.hh (1.20),
+ checked_mpq.inlines.hh (1.11), checked_mpz.inlines.hh (1.12): New
+ string based I/O implementation for checked numbers.
+
+2005-01-26 Wednesday 09:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.10): Added void
+ negate_round_down(Checked_Number<T, Policy>& to, const
+ Checked_Number<T, Policy>& x).
+
+2005-01-26 Wednesday 09:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.9): Added bool is_nonnegative(const
+ Checked_Number<T, Policy>&).
+
+2005-01-26 Wednesday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.18): Added void print_constraints(const
+ BD_Shape<T>&, const string&, ostream&).
+
+2005-01-25 Tuesday 23:23 Abramo Bagnara
+
+ * tests/ppl_test.hh (1.8): Fixed compilation for mpz coefficients.
+
+2005-01-25 Tuesday 23:22 Abramo Bagnara
+
+ * src/Makefile.am (1.102): Checked_* include files are now needed.
+
+2005-01-25 Tuesday 18:25 Abramo Bagnara
+
+ * src/BD_Shape.inlines.hh (1.4), src/DB_Row.inlines.hh (1.5),
+ tests/ppl_test.hh (1.7), tests/BD_Shape/maxspacedim.cc (1.3): Use
+ new templatic implementation for extended numbers.
+
+2005-01-25 Tuesday 18:22 Abramo Bagnara
+
+ * src/checked_ext.inlines.hh (1.8): Fixed +inf text representation.
+
+2005-01-25 Tuesday 18:22 Abramo Bagnara
+
+ * src/: Rounding.defs.hh (1.8), Rounding.inlines.hh (1.6): Faster
+ versions for use inside library.
+
+2005-01-25 Tuesday 18:21 Abramo Bagnara
+
+ * src/: Checked_Number.cc (1.3), Checked_Number.defs.hh (1.13),
+ Checked_Number.inlines.hh (1.20): Better support for extended
+ numbers.
+
+2005-01-25 Tuesday 11:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (1.4): Be quiet.
+
+2005-01-24 Monday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.22): Temporary workaround to
+ allow compilation on systems not providing fma(), fmaf() or
+ fmal().
+
+2005-01-24 Monday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.13): No longer use GLPK's obsolete
+ functions lpx_get_obj_c0() and lpx_get_col_coef().
+
+2005-01-23 Sunday 22:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.141), demos/ppl_lpsol/examples/README (1.1): Added a
+ README file in demos/ppl_lpsol/examples explaining the origin of
+ the examples there contained.
+
+2005-01-23 Sunday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.157): Check for the availability of fma(), fmaf()
+ and fmal() in C++.
+
+2005-01-13 Thursday 15:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.151): Mentioned the correction of the exception-safety
+ bug.
+
+2005-01-13 Thursday 14:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.265): Typo fixed.
+
+2005-01-13 Thursday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: DB_Matrix.inlines.hh (1.4), DB_Row.defs.hh (1.4),
+ DB_Row.inlines.hh (1.4), DB_Row.types.hh (1.4): Corrected an
+ exception-safety bug in class DB_Row. Methods resize_no_copy()
+ and grow_no_copy() have been replaced by method
+ expand_within_capacity().
+
+2005-01-13 Thursday 14:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.inlines.hh (1.59): For clarity, explicitly invoke
+ Row_Impl_Handler constructor in the Row constructors.
+
+2005-01-13 Thursday 14:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.91): Documentation fixed: `impl' is a member,
+ not a method.
+
+2005-01-13 Thursday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.264): Fixed a couple of sentences.
+
+2005-01-13 Thursday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.140): One more item added.
+
+2005-01-13 Thursday 14:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.139): Two items added.
+
+2005-01-13 Thursday 09:26 Abramo Bagnara
+
+ * src/Rounding.defs.hh (1.7): Removed old declarations.
+
+2005-01-12 Wednesday 22:05 Abramo Bagnara
+
+ * src/Rounding.defs.hh (1.6): save & restore are public methods.
+
+2005-01-12 Wednesday 18:37 Abramo Bagnara
+
+ * src/: E_NIT.inlines.hh (1.4), E_Rational.inlines.hh (1.4),
+ Interval.inlines.hh (1.19), Polyhedron_nonpublic.cc (1.44): Use
+ constructor implicitly.
+
+2005-01-12 Wednesday 18:36 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.12), Checked_Number.inlines.hh
+ (1.19), Rounding.defs.hh (1.5), Rounding.inlines.hh (1.5): Given
+ access to rounding via Checked_Number class.
+
+2005-01-12 Wednesday 14:39 Abramo Bagnara
+
+ * src/: Checked_Number.cc (1.2), Checked_Number.defs.hh (1.11),
+ Checked_Number.inlines.hh (1.18), Checked_Number.types.hh (1.5),
+ Makefile.am (1.101): Moved result handler in policy.
+
+2005-01-12 Wednesday 10:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (1.3): The memory leak should be
+ fixed.
+
+2005-01-12 Wednesday 10:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Row.cc (1.79), Row.inlines.hh (1.58): Fixed a couple of
+ stupid typos.
+
+2005-01-11 Tuesday 17:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.150), src/Row.cc (1.78), src/Row.defs.hh (1.90),
+ src/Row.inlines.hh (1.57), src/Row.types.hh (1.9): Class Row now
+ provately inherits from Row_Impl_Handler instead of having a
+ member of class Row::Impl_Handler. Corrected the handling of the
+ capacity_ member of Row_Impl_Handler, so as to have a clean make
+ check when enabling more assertions. The handling of Row
+ implementation made a bit more elegant by introducing the
+ function allocate().
+
+2005-01-11 Tuesday 08:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/polypowerset1.cc (1.1): Added tests to guard
+ against reintroduction of recently corrected errors in
+ Polyhedra_Powerset constructors.
+
+2005-01-10 Monday 10:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.cc (1.77), src/Row.defs.hh (1.89), src/Row.inlines.hh
+ (1.56), tests/Polyhedron/Makefile.am (1.6): Provided a quick fix
+ for the potential memory leak error.
+
+2005-01-07 Friday 23:39 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.10), Checked_Number.inlines.hh
+ (1.17), Makefile.am (1.100), Rounding.inlines.hh (1.4),
+ checked.defs.hh (1.11), checked.inlines.hh (1.9),
+ checked_ext.inlines.hh (1.7): Allows Checked_Number to handle
+ extended values via appropriate policy.
+
+2005-01-06 Thursday 21:28 Abramo Bagnara
+
+ * src/: Float.defs.hh (1.4), checked_int.inlines.hh (1.19),
+ checked_float.inlines.hh (1.21): White spaces fix.
+
+2005-01-06 Thursday 21:27 Abramo Bagnara
+
+ * src/: Extended_Number.defs.hh (1.5), Extended_Number.inlines.hh
+ (1.7), Extended_Number.types.hh (1.4): Removed files.
+
+2005-01-02 Sunday 08:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory2.cc (1.2): Force failure everywhere until
+ the bug is fixed.
+
+2005-01-01 Saturday 23:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/: Makefile.am (1.5), memory2.cc (1.1): Another
+ program to test the allocation error recovery facility of the
+ library.
+
+2005-01-01 Saturday 23:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/memory1.cc (1.4): Comment added to help decipher
+ a #else.
+
+2005-01-01 Saturday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.8): The first_phase() function now returns a
+ Simplex_Status().
+
+2005-01-01 Saturday 14:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.129): Fixed
+ ppl_Constraint_System_minimize() (thanks to Andrea Cimino).
+
+2005-01-01 Saturday 12:24 Abramo Bagnara
+
+ * src/: checked.inlines.hh (1.8), checked_float.inlines.hh (1.20),
+ checked_int.inlines.hh (1.18), checked_mpq.inlines.hh (1.10),
+ checked_mpz.inlines.hh (1.11): Renamed mod to more appropriate
+ rem.
+
+2005-01-01 Saturday 12:10 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh (1.9), Checked_Number.inlines.hh
+ (1.16), Extended_Number.defs.hh (1.4), Extended_Number.inlines.hh
+ (1.6), checked.defs.hh (1.10), checked.inlines.hh (1.7),
+ checked_ext.defs.hh (1.4), checked_ext.inlines.hh (1.6),
+ checked_float.inlines.hh (1.19), checked_int.inlines.hh (1.17),
+ checked_mpq.inlines.hh (1.9), checked_mpz.inlines.hh (1.10):
+ Renamed mod to more appropriate rem.
+
+2005-01-01 Saturday 00:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.28), README (1.35), README.configure (1.13),
+ configure.ac (1.156), Watchdog/Doubly_Linked_Object.defs.hh
+ (1.2), Watchdog/Doubly_Linked_Object.inlines.hh (1.2),
+ Watchdog/Doubly_Linked_Object.types.hh (1.2),
+ Watchdog/EList.defs.hh (1.4), Watchdog/EList.inlines.hh (1.3),
+ Watchdog/EList.types.hh (1.2), Watchdog/EList_Iterator.defs.hh
+ (1.2), Watchdog/EList_Iterator.inlines.hh (1.3),
+ Watchdog/EList_Iterator.types.hh (1.2), Watchdog/Handler.defs.hh
+ (1.3), Watchdog/Handler.inlines.hh (1.2),
+ Watchdog/Handler.types.hh (1.2), Watchdog/Makefile.am (1.18),
+ Watchdog/Pending_Element.cc (1.2),
+ Watchdog/Pending_Element.defs.hh (1.2),
+ Watchdog/Pending_Element.inlines.hh (1.2),
+ Watchdog/Pending_Element.types.hh (1.2), Watchdog/Pending_List.cc
+ (1.2), Watchdog/Pending_List.defs.hh (1.2),
+ Watchdog/Pending_List.inlines.hh (1.2),
+ Watchdog/Pending_List.types.hh (1.2), Watchdog/README (1.10),
+ Watchdog/Time.cc (1.2), Watchdog/Time.defs.hh (1.2),
+ Watchdog/Time.inlines.hh (1.2), Watchdog/Time.types.hh (1.2),
+ Watchdog/Watchdog.cc (1.19), Watchdog/Watchdog.defs.hh (1.15),
+ Watchdog/Watchdog.inlines.hh (1.12), Watchdog/Watchdog.types.hh
+ (1.6), Watchdog/configure.ac (1.25), Watchdog/pwl_header.top
+ (1.6), demos/Makefile.am (1.6), demos/ppl_lcdd/Makefile.am
+ (1.19), demos/ppl_lcdd/ppl_lcdd.cc (1.41),
+ demos/ppl_lcdd/examples/Makefile.am (1.4),
+ demos/ppl_lpsol/Makefile.am (1.12), demos/ppl_lpsol/ppl_lpsol.c
+ (1.12), demos/ppl_lpsol/examples/Makefile.am (1.3),
+ doc/Makefile.am (1.32), doc/README.doc (1.2), doc/definitions.dox
+ (1.168), doc/devref.tex (1.17), doc/ppl.sty (1.18), doc/user.tex
+ (1.18), interfaces/Makefile.am (1.10), interfaces/C/Makefile.am
+ (1.18), interfaces/C/ppl_c.cc (1.128), interfaces/C/ppl_c.h.in
+ (1.46), interfaces/OCaml/Makefile.am (1.9),
+ interfaces/Prolog/Makefile.am (1.27),
+ interfaces/Prolog/Prolog_interface.dox (1.126),
+ interfaces/Prolog/exceptions.hh (1.15),
+ interfaces/Prolog/ppl_prolog.icc (1.153),
+ interfaces/Prolog/track_allocation.hh (1.16),
+ interfaces/Prolog/Ciao/Makefile.am (1.40),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.14),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.10),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.10),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.30),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.78),
+ interfaces/Prolog/GNU/Makefile.am (1.44),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.4),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.8),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.50),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.26),
+ interfaces/Prolog/SICStus/Makefile.am (1.51),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.24),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.73),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.4),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.5),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.10),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.11),
+ interfaces/Prolog/SICStus/sp_pl_check.pl (1.2),
+ interfaces/Prolog/SWI/Makefile.am (1.45),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.8),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.7),
+ interfaces/Prolog/SWI/ppl_pl.cc (1.8),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.97),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.4),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.3),
+ interfaces/Prolog/XSB/Makefile.am (1.32),
+ interfaces/Prolog/XSB/expected2_int16 (1.4),
+ interfaces/Prolog/XSB/expected2_int16_a (1.3),
+ interfaces/Prolog/XSB/expected2_int32 (1.3),
+ interfaces/Prolog/XSB/expected2_int32_a (1.2),
+ interfaces/Prolog/XSB/expected2_int64 (1.2),
+ interfaces/Prolog/XSB/expected2_int64_a (1.2),
+ interfaces/Prolog/XSB/expected2_int8 (1.2),
+ interfaces/Prolog/XSB/expected2_int8_a (1.2),
+ interfaces/Prolog/XSB/expected2_mpz (1.2),
+ interfaces/Prolog/XSB/expected2_mpz_a (1.2),
+ interfaces/Prolog/XSB/expected_int16 (1.2),
+ interfaces/Prolog/XSB/expected_int16_a (1.2),
+ interfaces/Prolog/XSB/expected_int32 (1.2),
+ interfaces/Prolog/XSB/expected_int32_a (1.2),
+ interfaces/Prolog/XSB/expected_int64 (1.2),
+ interfaces/Prolog/XSB/expected_int64_a (1.2),
+ interfaces/Prolog/XSB/expected_int8 (1.3),
+ interfaces/Prolog/XSB/expected_int8_a (1.3),
+ interfaces/Prolog/XSB/expected_mpz (1.2),
+ interfaces/Prolog/XSB/expected_mpz_a (1.2),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.37),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.64),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.12),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.10),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.14),
+ interfaces/Prolog/YAP/Makefile.am (1.35),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.89),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.8),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.9),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.5),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.7),
+ interfaces/Prolog/tests/Makefile.am (1.3),
+ interfaces/Prolog/tests/clpq.pl (1.5),
+ interfaces/Prolog/tests/clpq2.pl (1.5),
+ interfaces/Prolog/tests/expected2_int16 (1.4),
+ interfaces/Prolog/tests/expected2_int16_a (1.3),
+ interfaces/Prolog/tests/expected2_int32 (1.3),
+ interfaces/Prolog/tests/expected2_int32_a (1.2),
+ interfaces/Prolog/tests/expected2_int64 (1.2),
+ interfaces/Prolog/tests/expected2_int64_a (1.2),
+ interfaces/Prolog/tests/expected2_int8 (1.2),
+ interfaces/Prolog/tests/expected2_int8_a (1.2),
+ interfaces/Prolog/tests/expected2_mpz (1.2),
+ interfaces/Prolog/tests/expected2_mpz_a (1.2),
+ interfaces/Prolog/tests/expected_int16 (1.2),
+ interfaces/Prolog/tests/expected_int16_a (1.2),
+ interfaces/Prolog/tests/expected_int32 (1.2),
+ interfaces/Prolog/tests/expected_int32_a (1.2),
+ interfaces/Prolog/tests/expected_int64 (1.2),
+ interfaces/Prolog/tests/expected_int64_a (1.2),
+ interfaces/Prolog/tests/expected_int8 (1.3),
+ interfaces/Prolog/tests/expected_int8_a (1.3),
+ interfaces/Prolog/tests/expected_mpz (1.2),
+ interfaces/Prolog/tests/expected_mpz_a (1.2),
+ interfaces/Prolog/tests/pl_check.pl (1.7), m4/Makefile.am (1.12),
+ m4/ac_check_gmp.m4 (1.20), m4/ac_cxx_attribute_weak.m4 (1.4),
+ m4/ac_cxx_double_is_iec_559.m4 (1.2),
+ m4/ac_cxx_flexible_arrays.m4 (1.9), m4/ac_cxx_float_is_iec_559.m4
+ (1.2), m4/ac_cxx_long_double.m4 (1.3),
+ m4/ac_cxx_long_double_is_iec_559.m4 (1.2), m4/ac_cxx_long_long.m4
+ (1.2), src/Ask_Tell.defs.hh (1.4), src/Ask_Tell.inlines.hh (1.4),
+ src/Ask_Tell.types.hh (1.2), src/BDS_Status.idefs.hh (1.3),
+ src/BDS_Status.inlines.hh (1.3), src/BD_Shape.defs.hh (1.4),
+ src/BD_Shape.inlines.hh (1.3), src/BD_Shape.types.hh (1.3),
+ src/BHRZ03_Certificate.cc (1.7), src/BHRZ03_Certificate.defs.hh
+ (1.9), src/BHRZ03_Certificate.inlines.hh (1.4),
+ src/BHRZ03_Certificate.types.hh (1.2), src/Bounding_Box.cc (1.3),
+ src/Bounding_Box.defs.hh (1.3), src/Bounding_Box.inlines.hh
+ (1.3), src/Bounding_Box.types.hh (1.2), src/C_Polyhedron.cc
+ (1.14), src/C_Polyhedron.defs.hh (1.31),
+ src/C_Polyhedron.inlines.hh (1.24), src/C_Polyhedron.types.hh
+ (1.8), src/Checked_Number.defs.hh (1.8),
+ src/Checked_Number.inlines.hh (1.15), src/Checked_Number.types.hh
+ (1.4), src/Coefficient.cc (1.2), src/Coefficient.defs.hh (1.2),
+ src/Coefficient.inlines.hh (1.2), src/Coefficient.types.hh (1.6),
+ src/Coefficient_traits_template.hh (1.3), src/Constraint.cc
+ (1.47), src/Constraint.defs.hh (1.102), src/Constraint.inlines.hh
+ (1.59), src/Constraint.types.hh (1.8), src/Constraint_System.cc
+ (1.5), src/Constraint_System.defs.hh (1.8),
+ src/Constraint_System.inlines.hh (1.2),
+ src/Constraint_System.types.hh (1.2), src/DB_Matrix.defs.hh
+ (1.3), src/DB_Matrix.inlines.hh (1.3), src/DB_Matrix.types.hh
+ (1.3), src/DB_Row.defs.hh (1.3), src/DB_Row.inlines.hh (1.3),
+ src/DB_Row.types.hh (1.3), src/Determinate.defs.hh (1.53),
+ src/Determinate.inlines.hh (1.46), src/Determinate.types.hh
+ (1.6), src/E_NIT.defs.hh (1.3), src/E_NIT.inlines.hh (1.3),
+ src/E_NIT.types.hh (1.3), src/E_Rational.defs.hh (1.3),
+ src/E_Rational.inlines.hh (1.3), src/E_Rational.types.hh (1.3),
+ src/Extended_Number.defs.hh (1.3), src/Extended_Number.inlines.hh
+ (1.5), src/Extended_Number.types.hh (1.3), src/Float.defs.hh
+ (1.3), src/Float.inlines.hh (1.3), src/GMP_Integer.defs.hh (1.5),
+ src/GMP_Integer.inlines.hh (1.4), src/GMP_Integer.types.hh (1.7),
+ src/Generator.cc (1.58), src/Generator.defs.hh (1.101),
+ src/Generator.inlines.hh (1.54), src/Generator.types.hh (1.8),
+ src/Generator_System.cc (1.4), src/Generator_System.defs.hh
+ (1.7), src/Generator_System.inlines.hh (1.2),
+ src/Generator_System.types.hh (1.2), src/H79_Certificate.cc
+ (1.6), src/H79_Certificate.defs.hh (1.9),
+ src/H79_Certificate.inlines.hh (1.4),
+ src/H79_Certificate.types.hh (1.2), src/Init.cc (1.15),
+ src/Init.defs.hh (1.11), src/Init.types.hh (1.7), src/Interval.cc
+ (1.10), src/Interval.defs.hh (1.21), src/Interval.inlines.hh
+ (1.18), src/Interval.types.hh (1.8), src/Limits.hh (1.5),
+ src/Linear_Expression.cc (1.4), src/Linear_Expression.defs.hh
+ (1.8), src/Linear_Expression.inlines.hh (1.4),
+ src/Linear_Expression.types.hh (1.2), src/Linear_Row.cc (1.5),
+ src/Linear_Row.defs.hh (1.7), src/Linear_Row.inlines.hh (1.7),
+ src/Linear_Row.types.hh (1.2), src/Linear_System.cc (1.14),
+ src/Linear_System.defs.hh (1.12), src/Linear_System.inlines.hh
+ (1.12), src/Linear_System.types.hh (1.2), src/Makefile.am (1.99),
+ src/Matrix.cc (1.80), src/Matrix.defs.hh (1.68),
+ src/Matrix.inlines.hh (1.43), src/Matrix.types.hh (1.8),
+ src/NNC_Polyhedron.cc (1.13), src/NNC_Polyhedron.defs.hh (1.33),
+ src/NNC_Polyhedron.inlines.hh (1.27), src/NNC_Polyhedron.types.hh
+ (1.8), src/Native_Integer.defs.hh (1.9),
+ src/Native_Integer.inlines.hh (1.9), src/Native_Integer.types.hh
+ (1.7), src/Numeric_Format.defs.hh (1.3), src/Ph_Status.cc (1.6),
+ src/Ph_Status.idefs.hh (1.7), src/Ph_Status.inlines.hh (1.5),
+ src/Poly_Con_Relation.cc (1.9), src/Poly_Con_Relation.defs.hh
+ (1.25), src/Poly_Con_Relation.inlines.hh (1.12),
+ src/Poly_Con_Relation.types.hh (1.7), src/Poly_Gen_Relation.cc
+ (1.9), src/Poly_Gen_Relation.defs.hh (1.23),
+ src/Poly_Gen_Relation.inlines.hh (1.12),
+ src/Poly_Gen_Relation.types.hh (1.7),
+ src/Polyhedra_Powerset.defs.hh (1.14),
+ src/Polyhedra_Powerset.inlines.hh (1.17),
+ src/Polyhedra_Powerset.types.hh (1.2), src/Polyhedron.defs.hh
+ (1.263), src/Polyhedron.inlines.hh (1.109),
+ src/Polyhedron.types.hh (1.14), src/Polyhedron_chdims.cc (1.27),
+ src/Polyhedron_nonpublic.cc (1.43), src/Polyhedron_public.cc
+ (1.48), src/Polyhedron_widenings.cc (1.40), src/Powerset.defs.hh
+ (1.10), src/Powerset.inlines.hh (1.9), src/Powerset.types.hh
+ (1.2), src/Ptr_Iterator.defs.hh (1.3),
+ src/Ptr_Iterator.inlines.hh (1.3), src/Ptr_Iterator.types.hh
+ (1.3), src/Result.defs.hh (1.7), src/Result.inlines.hh (1.5),
+ src/Rounding.defs.hh (1.4), src/Rounding.inlines.hh (1.3),
+ src/Rounding.types.hh (1.3), src/Row.cc (1.76), src/Row.defs.hh
+ (1.88), src/Row.inlines.hh (1.55), src/Row.types.hh (1.8),
+ src/Saturation_Matrix.cc (1.2), src/Saturation_Matrix.defs.hh
+ (1.2), src/Saturation_Matrix.inlines.hh (1.3),
+ src/Saturation_Matrix.types.hh (1.2), src/Saturation_Row.cc
+ (1.4), src/Saturation_Row.defs.hh (1.3),
+ src/Saturation_Row.inlines.hh (1.3), src/Saturation_Row.types.hh
+ (1.2), src/Topology.hh (1.10), src/Variable.cc (1.18),
+ src/Variable.defs.hh (1.45), src/Variable.inlines.hh (1.21),
+ src/Variable.types.hh (1.8), src/Widening_Function.defs.hh
+ (1.10), src/Widening_Function.inlines.hh (1.9),
+ src/Widening_Function.types.hh (1.2), src/algorithms.hh (1.39),
+ src/checked.defs.hh (1.9), src/checked.inlines.hh (1.6),
+ src/checked_ext.defs.hh (1.3), src/checked_ext.inlines.hh (1.5),
+ src/checked_float.inlines.hh (1.18), src/checked_int.inlines.hh
+ (1.16), src/checked_mpq.inlines.hh (1.8),
+ src/checked_mpz.inlines.hh (1.9), src/compiler.hh (1.3),
+ src/conversion.cc (1.66), src/float.types.hh (1.7),
+ src/fpu-c99.inlines.hh (1.3), src/fpu-ia32.inlines.hh (1.3),
+ src/fpu.defs.hh (1.3), src/globals.cc (1.20), src/globals.defs.hh
+ (1.16), src/globals.inlines.hh (1.8), src/initializer.hh (1.10),
+ src/max_space_dimension.hh (1.5), src/minimize.cc (1.40),
+ src/ppl_header.top (1.8), src/simplex.cc (1.7), src/simplify.cc
+ (1.42), src/swapping_sort.icc (1.8), src/version.cc (1.5),
+ src/version.hh.in (1.10), tests/BBox.cc (1.8), tests/BBox.hh
+ (1.6), tests/Makefile.am (1.242), tests/PFunction.cc (1.4),
+ tests/PFunction.hh (1.4), tests/ehandlers.cc (1.6),
+ tests/ehandlers.hh (1.10), tests/files.cc (1.6), tests/files.hh
+ (1.6), tests/ppl_test.hh (1.6), tests/print.cc (1.14),
+ tests/print.hh (1.17), tests/BD_Shape/relations1.cc (1.3),
+ tests/BD_Shape/relations2.cc (1.3), tests/BD_Shape/relations3.cc
+ (1.3), tests/BD_Shape/relations4.cc (1.3),
+ tests/BD_Shape/relations5.cc (1.3),
+ tests/Polyhedron/CbecomesNNC1.cc (1.3),
+ tests/Polyhedron/Makefile.am (1.4),
+ tests/Polyhedron/NNCbecomesC1.cc (1.3),
+ tests/Polyhedron/NNCminimize1.cc (1.3),
+ tests/Polyhedron/NNCminimize2.cc (1.3),
+ tests/Polyhedron/NNCminimize3.cc (1.3),
+ tests/Polyhedron/NNCminimize4.cc (1.3),
+ tests/Polyhedron/NNCminimize5.cc (1.3),
+ tests/Polyhedron/NNCminimize6.cc (1.3), tests/Polyhedron/README
+ (1.3), tests/Polyhedron/addconstraint1.cc (1.3),
+ tests/Polyhedron/addconstraint2.cc (1.3),
+ tests/Polyhedron/addconstraint3.cc (1.3),
+ tests/Polyhedron/addconstraints1.cc (1.3),
+ tests/Polyhedron/addconstraints10.cc (1.3),
+ tests/Polyhedron/addconstraints11.cc (1.3),
+ tests/Polyhedron/addconstraints12.cc (1.3),
+ tests/Polyhedron/addconstraints13.cc (1.3),
+ tests/Polyhedron/addconstraints2.cc (1.3),
+ tests/Polyhedron/addconstraints3.cc (1.3),
+ tests/Polyhedron/addconstraints4.cc (1.3),
+ tests/Polyhedron/addconstraints5.cc (1.3),
+ tests/Polyhedron/addconstraints6.cc (1.3),
+ tests/Polyhedron/addconstraints7.cc (1.3),
+ tests/Polyhedron/addconstraints8.cc (1.3),
+ tests/Polyhedron/addconstraints9.cc (1.3),
+ tests/Polyhedron/addgenerator1.cc (1.3),
+ tests/Polyhedron/addgenerator2.cc (1.3),
+ tests/Polyhedron/addgenerator3.cc (1.3),
+ tests/Polyhedron/addgenerator4.cc (1.3),
+ tests/Polyhedron/addgenerator5.cc (1.3),
+ tests/Polyhedron/addgenerators1.cc (1.3),
+ tests/Polyhedron/addgenerators10.cc (1.3),
+ tests/Polyhedron/addgenerators11.cc (1.3),
+ tests/Polyhedron/addgenerators12.cc (1.3),
+ tests/Polyhedron/addgenerators13.cc (1.3),
+ tests/Polyhedron/addgenerators2.cc (1.3),
+ tests/Polyhedron/addgenerators3.cc (1.3),
+ tests/Polyhedron/addgenerators4.cc (1.3),
+ tests/Polyhedron/addgenerators5.cc (1.3),
+ tests/Polyhedron/addgenerators6.cc (1.3),
+ tests/Polyhedron/addgenerators7.cc (1.3),
+ tests/Polyhedron/addgenerators8.cc (1.3),
+ tests/Polyhedron/addgenerators9.cc (1.3),
+ tests/Polyhedron/addspacedims1.cc (1.3),
+ tests/Polyhedron/addspacedims10.cc (1.3),
+ tests/Polyhedron/addspacedims11.cc (1.3),
+ tests/Polyhedron/addspacedims12.cc (1.3),
+ tests/Polyhedron/addspacedims13.cc (1.3),
+ tests/Polyhedron/addspacedims2.cc (1.3),
+ tests/Polyhedron/addspacedims3.cc (1.3),
+ tests/Polyhedron/addspacedims4.cc (1.3),
+ tests/Polyhedron/addspacedims5.cc (1.3),
+ tests/Polyhedron/addspacedims6.cc (1.3),
+ tests/Polyhedron/addspacedims7.cc (1.3),
+ tests/Polyhedron/addspacedims8.cc (1.3),
+ tests/Polyhedron/addspacedims9.cc (1.3),
+ tests/Polyhedron/affineimage1.cc (1.3),
+ tests/Polyhedron/affineimage2.cc (1.3),
+ tests/Polyhedron/affineimage3.cc (1.3),
+ tests/Polyhedron/affineimage4.cc (1.3),
+ tests/Polyhedron/affineimage5.cc (1.3),
+ tests/Polyhedron/affineimage6.cc (1.3),
+ tests/Polyhedron/affineimage7.cc (1.3),
+ tests/Polyhedron/affineimage8.cc (1.3),
+ tests/Polyhedron/affineimage9.cc (1.3),
+ tests/Polyhedron/affinepreimage1.cc (1.3),
+ tests/Polyhedron/affinepreimage10.cc (1.3),
+ tests/Polyhedron/affinepreimage2.cc (1.3),
+ tests/Polyhedron/affinepreimage3.cc (1.3),
+ tests/Polyhedron/affinepreimage4.cc (1.3),
+ tests/Polyhedron/affinepreimage5.cc (1.3),
+ tests/Polyhedron/affinepreimage6.cc (1.3),
+ tests/Polyhedron/affinepreimage7.cc (1.3),
+ tests/Polyhedron/affinepreimage8.cc (1.3),
+ tests/Polyhedron/affinepreimage9.cc (1.3),
+ tests/Polyhedron/affinetrans.cc (1.3),
+ tests/Polyhedron/append1.cc (1.3), tests/Polyhedron/append2.cc
+ (1.3), tests/Polyhedron/ascii_dump_load1.cc (1.3),
+ tests/Polyhedron/ascii_dump_load2.cc (1.3),
+ tests/Polyhedron/ascii_dump_load3.cc (1.3),
+ tests/Polyhedron/ascii_dump_load4.cc (1.3),
+ tests/Polyhedron/ascii_dump_load5.cc (1.3),
+ tests/Polyhedron/ascii_dump_load6.cc (1.3),
+ tests/Polyhedron/ascii_dump_load7.cc (1.3),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.3),
+ tests/Polyhedron/bgp99extrapolation2.cc (1.3),
+ tests/Polyhedron/bhrz03widening1.cc (1.3),
+ tests/Polyhedron/bhrz03widening10.cc (1.3),
+ tests/Polyhedron/bhrz03widening11.cc (1.3),
+ tests/Polyhedron/bhrz03widening12.cc (1.3),
+ tests/Polyhedron/bhrz03widening13.cc (1.3),
+ tests/Polyhedron/bhrz03widening14.cc (1.3),
+ tests/Polyhedron/bhrz03widening15.cc (1.3),
+ tests/Polyhedron/bhrz03widening16.cc (1.3),
+ tests/Polyhedron/bhrz03widening17.cc (1.3),
+ tests/Polyhedron/bhrz03widening18.cc (1.3),
+ tests/Polyhedron/bhrz03widening19.cc (1.3),
+ tests/Polyhedron/bhrz03widening2.cc (1.3),
+ tests/Polyhedron/bhrz03widening3.cc (1.3),
+ tests/Polyhedron/bhrz03widening4.cc (1.3),
+ tests/Polyhedron/bhrz03widening5.cc (1.3),
+ tests/Polyhedron/bhrz03widening6.cc (1.3),
+ tests/Polyhedron/bhrz03widening7.cc (1.3),
+ tests/Polyhedron/bhrz03widening8.cc (1.3),
+ tests/Polyhedron/bhrz03widening9.cc (1.3),
+ tests/Polyhedron/bhz03widening1.cc (1.3),
+ tests/Polyhedron/bhz03widening2.cc (1.3),
+ tests/Polyhedron/bhz03widening3.cc (1.3),
+ tests/Polyhedron/bhz03widening4.cc (1.3),
+ tests/Polyhedron/bhz03widening5.cc (1.3),
+ tests/Polyhedron/bhz03widening6.cc (1.3),
+ tests/Polyhedron/bounded1.cc (1.3),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.3),
+ tests/Polyhedron/boundingbox1.cc (1.3),
+ tests/Polyhedron/boundingbox2.cc (1.3),
+ tests/Polyhedron/boundingbox3.cc (1.3),
+ tests/Polyhedron/boundingbox4.cc (1.3),
+ tests/Polyhedron/boundingbox5.cc (1.3),
+ tests/Polyhedron/bounds1.cc (1.3), tests/Polyhedron/bounds2.cc
+ (1.3), tests/Polyhedron/concatenate1.cc (1.3),
+ tests/Polyhedron/concatenate2.cc (1.3),
+ tests/Polyhedron/concatenate3.cc (1.3),
+ tests/Polyhedron/concatenate4.cc (1.3),
+ tests/Polyhedron/concatenate5.cc (1.3),
+ tests/Polyhedron/concatenate6.cc (1.3),
+ tests/Polyhedron/constraints1.cc (1.3),
+ tests/Polyhedron/constraints2.cc (1.3),
+ tests/Polyhedron/constraints3.cc (1.3),
+ tests/Polyhedron/constraints4.cc (1.3),
+ tests/Polyhedron/contains1.cc (1.3),
+ tests/Polyhedron/contains2.cc (1.3),
+ tests/Polyhedron/contains3.cc (1.3),
+ tests/Polyhedron/contains4.cc (1.3),
+ tests/Polyhedron/contains5.cc (1.3),
+ tests/Polyhedron/disjoint1.cc (1.3),
+ tests/Polyhedron/disjoint2.cc (1.3),
+ tests/Polyhedron/disjoint3.cc (1.3),
+ tests/Polyhedron/dualhypercubes.cc (1.3),
+ tests/Polyhedron/empty1.cc (1.3), tests/Polyhedron/equals1.cc
+ (1.3), tests/Polyhedron/exceptions1.cc (1.3),
+ tests/Polyhedron/exceptions2.cc (1.3),
+ tests/Polyhedron/exceptions3.cc (1.3),
+ tests/Polyhedron/expandspacedim1.cc (1.3),
+ tests/Polyhedron/expandspacedim2.cc (1.3),
+ tests/Polyhedron/foldspacedims1.cc (1.3),
+ tests/Polyhedron/foldspacedims2.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage10.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage11.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage12.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage3.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage4.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage5.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage6.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage7.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage8.cc (1.3),
+ tests/Polyhedron/generalizedaffineimage9.cc (1.3),
+ tests/Polyhedron/generators1.cc (1.3),
+ tests/Polyhedron/generators2.cc (1.3),
+ tests/Polyhedron/generators3.cc (1.3),
+ tests/Polyhedron/generators4.cc (1.3),
+ tests/Polyhedron/generators5.cc (1.3),
+ tests/Polyhedron/generators6.cc (1.3),
+ tests/Polyhedron/geomcovers1.cc (1.3),
+ tests/Polyhedron/h79widening1.cc (1.3),
+ tests/Polyhedron/h79widening2.cc (1.3),
+ tests/Polyhedron/h79widening3.cc (1.3),
+ tests/Polyhedron/h79widening4.cc (1.3),
+ tests/Polyhedron/h79widening5.cc (1.3),
+ tests/Polyhedron/h79widening6.cc (1.3),
+ tests/Polyhedron/h79widening7.cc (1.3),
+ tests/Polyhedron/h79widening8.cc (1.3),
+ tests/Polyhedron/intersection1.cc (1.3),
+ tests/Polyhedron/intersection10.cc (1.3),
+ tests/Polyhedron/intersection11.cc (1.3),
+ tests/Polyhedron/intersection2.cc (1.3),
+ tests/Polyhedron/intersection3.cc (1.3),
+ tests/Polyhedron/intersection4.cc (1.3),
+ tests/Polyhedron/intersection5.cc (1.3),
+ tests/Polyhedron/intersection6.cc (1.3),
+ tests/Polyhedron/intersection7.cc (1.3),
+ tests/Polyhedron/intersection8.cc (1.3),
+ tests/Polyhedron/intersection9.cc (1.3),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.3),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.3),
+ tests/Polyhedron/limitedh79extrapolation2.cc (1.3),
+ tests/Polyhedron/limitedh79extrapolation3.cc (1.3),
+ tests/Polyhedron/limitedh79extrapolation4.cc (1.3),
+ tests/Polyhedron/linearpartition1.cc (1.3),
+ tests/Polyhedron/linearpartition2.cc (1.3),
+ tests/Polyhedron/linearpartition3.cc (1.3),
+ tests/Polyhedron/linearpartition4.cc (1.3),
+ tests/Polyhedron/linexpression1.cc (1.3),
+ tests/Polyhedron/mapspacedims1.cc (1.3),
+ tests/Polyhedron/mapspacedims2.cc (1.3),
+ tests/Polyhedron/mapspacedims3.cc (1.3),
+ tests/Polyhedron/mapspacedims4.cc (1.3),
+ tests/Polyhedron/max_min1.cc (1.3), tests/Polyhedron/max_min2.cc
+ (1.3), tests/Polyhedron/maxspacedim1.cc (1.3),
+ tests/Polyhedron/mc91.cc (1.3), tests/Polyhedron/membytes1.cc
+ (1.3), tests/Polyhedron/membytes2.cc (1.3),
+ tests/Polyhedron/memory1.cc (1.3),
+ tests/Polyhedron/minconstraints1.cc (1.3),
+ tests/Polyhedron/minconstraints2.cc (1.3),
+ tests/Polyhedron/minconstraints3.cc (1.3),
+ tests/Polyhedron/minconstraints4.cc (1.3),
+ tests/Polyhedron/mingenerators1.cc (1.3),
+ tests/Polyhedron/mingenerators2.cc (1.3),
+ tests/Polyhedron/mingenerators3.cc (1.3),
+ tests/Polyhedron/onepoint.cc (1.3), tests/Polyhedron/permute.cc
+ (1.3), tests/Polyhedron/polydifference1.cc (1.3),
+ tests/Polyhedron/polydifference2.cc (1.3),
+ tests/Polyhedron/polydifference3.cc (1.3),
+ tests/Polyhedron/polydifference4.cc (1.3),
+ tests/Polyhedron/polydifference5.cc (1.3),
+ tests/Polyhedron/polydifference6.cc (1.3),
+ tests/Polyhedron/polydifference7.cc (1.3),
+ tests/Polyhedron/polydifference8.cc (1.3),
+ tests/Polyhedron/polydifference9.cc (1.3),
+ tests/Polyhedron/polyhull1.cc (1.3),
+ tests/Polyhedron/polyhull10.cc (1.3),
+ tests/Polyhedron/polyhull11.cc (1.3),
+ tests/Polyhedron/polyhull2.cc (1.3),
+ tests/Polyhedron/polyhull3.cc (1.3),
+ tests/Polyhedron/polyhull4.cc (1.3),
+ tests/Polyhedron/polyhull5.cc (1.3),
+ tests/Polyhedron/polyhull6.cc (1.3),
+ tests/Polyhedron/polyhull7.cc (1.3),
+ tests/Polyhedron/polyhull8.cc (1.3),
+ tests/Polyhedron/polyhull9.cc (1.3),
+ tests/Polyhedron/randphull1.cc (1.3),
+ tests/Polyhedron/randphull2.cc (1.3),
+ tests/Polyhedron/relations1.cc (1.3),
+ tests/Polyhedron/relations10.cc (1.3),
+ tests/Polyhedron/relations11.cc (1.3),
+ tests/Polyhedron/relations12.cc (1.3),
+ tests/Polyhedron/relations13.cc (1.3),
+ tests/Polyhedron/relations14.cc (1.3),
+ tests/Polyhedron/relations15.cc (1.3),
+ tests/Polyhedron/relations16.cc (1.3),
+ tests/Polyhedron/relations17.cc (1.3),
+ tests/Polyhedron/relations18.cc (1.3),
+ tests/Polyhedron/relations19.cc (1.3),
+ tests/Polyhedron/relations2.cc (1.3),
+ tests/Polyhedron/relations3.cc (1.3),
+ tests/Polyhedron/relations4.cc (1.3),
+ tests/Polyhedron/relations5.cc (1.3),
+ tests/Polyhedron/relations6.cc (1.3),
+ tests/Polyhedron/relations7.cc (1.3),
+ tests/Polyhedron/relations8.cc (1.3),
+ tests/Polyhedron/relations9.cc (1.3),
+ tests/Polyhedron/removespacedims1.cc (1.3),
+ tests/Polyhedron/removespacedims10.cc (1.3),
+ tests/Polyhedron/removespacedims2.cc (1.3),
+ tests/Polyhedron/removespacedims3.cc (1.3),
+ tests/Polyhedron/removespacedims4.cc (1.3),
+ tests/Polyhedron/removespacedims5.cc (1.3),
+ tests/Polyhedron/removespacedims6.cc (1.3),
+ tests/Polyhedron/removespacedims7.cc (1.3),
+ tests/Polyhedron/removespacedims8.cc (1.3),
+ tests/Polyhedron/removespacedims9.cc (1.3),
+ tests/Polyhedron/smm1.cc (1.3), tests/Polyhedron/timeelapse1.cc
+ (1.3), tests/Polyhedron/timeelapse2.cc (1.3),
+ tests/Polyhedron/timeelapse3.cc (1.3),
+ tests/Polyhedron/timeelapse4.cc (1.3),
+ tests/Polyhedron/timeelapse5.cc (1.3),
+ tests/Polyhedron/timeelapse6.cc (1.3),
+ tests/Polyhedron/timeelapse7.cc (1.3),
+ tests/Polyhedron/timeelapse8.cc (1.3),
+ tests/Polyhedron/timeelapse9.cc (1.3),
+ tests/Polyhedron/topclosed1.cc (1.3),
+ tests/Polyhedron/topclosed2.cc (1.3),
+ tests/Polyhedron/topclosed3.cc (1.3),
+ tests/Polyhedron/topclosure1.cc (1.3),
+ tests/Polyhedron/topclosure2.cc (1.3),
+ tests/Polyhedron/topclosure3.cc (1.3),
+ tests/Polyhedron/topclosure4.cc (1.3),
+ tests/Polyhedron/universe1.cc (1.3),
+ tests/Polyhedron/universe2.cc (1.3),
+ tests/Polyhedron/universe3.cc (1.3),
+ tests/Polyhedron/universe4.cc (1.3),
+ tests/Polyhedron/universe5.cc (1.3),
+ tests/Polyhedron/universe6.cc (1.3),
+ tests/Polyhedron/universe7.cc (1.3),
+ tests/Polyhedron/watchdog1.cc (1.3),
+ tests/Polyhedron/writeconsys1.cc (1.3),
+ tests/Polyhedron/writegensys1.cc (1.3),
+ tests/Polyhedron/writegensys2.cc (1.3),
+ tests/Polyhedron/writegensys3.cc (1.3),
+ tests/Polyhedron/writepolyhedron1.cc (1.3),
+ tests/Polyhedron/writepolyhedron2.cc (1.3),
+ tests/Polyhedron/writepolyhedron3.cc (1.3),
+ tests/Polyhedron/writerelation1.cc (1.3),
+ tests/Polyhedron/writevariable1.cc (1.3), utils/Makefile.am
+ (1.2), utils/timings.cc (1.2), utils/timings.hh (1.2): Copyright
+ years extended.
+
+2004-12-31 Friday 23:36 Abramo Bagnara
+
+ * src/: Extended_Number.inlines.hh (1.4), checked_ext.inlines.hh
+ (1.4), checked_float.inlines.hh (1.17): Added comparison and
+ arithmetic binary operators.
+
+2004-12-31 Friday 23:36 Abramo Bagnara
+
+ * src/Result.defs.hh (1.6): Added V_INF_DIV_INF.
+
+2004-12-31 Friday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (1.3): Added membytes2 to
+ XFAIL_WITH_INT8_A.
+
+2004-12-31 Friday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.6): ConSys renamed to Constraint_System in
+ comments and error messages.
+
+2004-12-31 Friday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16_a (1.2), expected_int32 (1.3),
+ expected_int32_a (1.3), expected_int64 (1.3), expected_int64_a
+ (1.3): Adapted to recent changes in ppl_lpsol.
+
+2004-12-31 Friday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected_int8 (1.2), tests/expected_int8
+ (1.2): Adapted to the recent changes in the implementation of
+ checked numbers.
+
+2004-12-31 Friday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: XSB/expected2_int16_a (1.2),
+ XSB/expected_int8_a (1.2), tests/expected2_int16_a (1.2),
+ tests/expected_int8_a (1.2): Adapted to the recent changes in the
+ implementation of checked numbers.
+
+2004-12-31 Friday 13:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected2_int16 (1.3): Adapted to the
+ recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/tests/expected2_int16 (1.3): Adapted to the
+ recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.39),
+ interfaces/Prolog/GNU/Makefile.am (1.43),
+ interfaces/Prolog/SICStus/Makefile.am (1.50),
+ interfaces/Prolog/SWI/Makefile.am (1.44),
+ interfaces/Prolog/XSB/Makefile.am (1.31),
+ demos/ppl_lcdd/Makefile.am (1.18), demos/ppl_lpsol/Makefile.am
+ (1.11), interfaces/Prolog/YAP/Makefile.am (1.34): When checking
+ for differences between the obtained and the expected output, use
+ `diff -u' instead of `diff -q'.
+
+2004-12-31 Friday 13:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.5): Comment fixed.
+
+2004-12-31 Friday 09:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.4): Variable-length automatic arrays are not
+ (yet) standard in C++: use vectors instead.
+
+2004-12-31 Friday 08:57 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh (1.14),
+ Extended_Number.inlines.hh (1.3), Result.defs.hh (1.5),
+ Result.inlines.hh (1.4), checked_ext.inlines.hh (1.3),
+ checked_float.inlines.hh (1.16), checked_int.inlines.hh (1.15),
+ checked_mpq.inlines.hh (1.7), checked_mpz.inlines.hh (1.8):
+ Discriminate between special values sources.
+
+2004-12-30 Thursday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz_a (1.3): Adapted to the recent
+ changes to ppl_lpsol.
+
+2004-12-30 Thursday 16:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.100): Avoid a couple of long lines.
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/adlittle.mps (altnum.1): file
+ adlittle.mps was added on branch altnum on 2006-10-29 19:26:55
+ +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/blend.mps (altnum.1): file blend.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/boeing1.mps (altnum.1): file boeing1.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/boeing2.mps (altnum.1): file boeing2.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/kb2.mps (altnum.1): file kb2.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/mip.mps (altnum.1): file mip.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/sc105.mps (altnum.1): file sc105.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/sc50a.mps (altnum.1): file sc50a.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/sc50b.mps (altnum.1): file sc50b.mps was
+ added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/examples/ship08l.mps (altnum.1): file ship08l.mps
+ was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.138), demos/ppl_lpsol/Makefile.am (1.10),
+ demos/ppl_lpsol/examples/Makefile.am (1.2),
+ demos/ppl_lpsol/examples/adlittle.mps (1.1),
+ demos/ppl_lpsol/examples/blend.mps (1.1),
+ demos/ppl_lpsol/examples/boeing1.mps (1.1),
+ demos/ppl_lpsol/examples/boeing2.mps (1.1),
+ demos/ppl_lpsol/examples/kb2.mps (1.1),
+ demos/ppl_lpsol/examples/mip.mps (1.1),
+ demos/ppl_lpsol/examples/sc105.mps (1.1),
+ demos/ppl_lpsol/examples/sc50a.mps (1.1),
+ demos/ppl_lpsol/examples/sc50b.mps (1.1),
+ demos/ppl_lpsol/examples/ship08l.mps (1.1): New examples to test
+ the simplex solver.
+
+2004-12-30 Thursday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.11), interfaces/C/ppl_c.cc
+ (1.127), src/Constraint_System.defs.hh (1.7), src/simplex.cc
+ (1.3): The simplex solver now returns a Simplex_Status instead of
+ a bool.
+
+2004-12-30 Thursday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.108): In
+ Polyhedron::map_space_dimensions(const Partial_Function& pfunc)
+ we no longer completely trust the (user-provided) partial
+ function `pfunc'. Compiler warning silenced.
+
+2004-12-30 Thursday 15:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.152): Fixed
+ term_to_Coefficient(Prolog_term_ref t).
+
+2004-12-30 Thursday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.52), Determinate.inlines.hh (1.45):
+ All methods that are specific to the Polyhedra tempplate
+ parameter have been dropped. If needed, they can still be invoked
+ through element().
+
+2004-12-30 Thursday 15:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.inlines.hh (1.53): Minor documentation improvement.
+
+2004-12-30 Thursday 15:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.16): Use element() to access
+ those methods that are specific to the Polyhedron class.
+
+2004-12-30 Thursday 15:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Powerset.defs.hh (1.9): Minor documentation improvements.
+
+2004-12-30 Thursday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.107): Error messages fixed.
+
+2004-12-30 Thursday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Powerset.defs.hh (1.8), Powerset.inlines.hh (1.8): Added
+ mixed comparison operators for iterator and const_iterator.
+ Drafted some documentation with an iterator's usage example.
+
+2004-12-30 Thursday 11:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.126), ppl_c.h.in (1.45): Added support
+ for simplex solver status to the C interface.
+
+2004-12-30 Thursday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh (1.15): New enum Simplex_Status to represent
+ the possible outcomes of a simplex solver.
+
+2004-12-30 Thursday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.10): Redundant print statement
+ removed.
+
+2004-12-30 Thursday 08:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz (1.3): The objective function is now
+ printed even if the problem is unfeasible.
+
+2004-12-29 Wednesday 21:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.defs.hh (1.13),
+ Polyhedra_Powerset.inlines.hh (1.15), Powerset.defs.hh (1.7),
+ Powerset.inlines.hh (1.7), algorithms.hh (1.38): Added support
+ for the consident use of bidirectional iterators (iterator,
+ const_iterator, reverse_iterator, const_reverse_iterator) for the
+ class Powerset. The new iterators replace the low-level ones on
+ the sequence of disjuncts, which are now protected and were not
+ enforcing the consistency of the reduced flag. All the new
+ iterators only provide read-only access to the disjuncts in a
+ Powerset element. It is possible to drop elements form the
+ sequence (but not to directly modify them) by using `iterator' in
+ conjunction with Powerset<CS> methods drop_disjunct(),
+ drop_disjuncts() and clear().
+
+2004-12-29 Wednesday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.9): Optionally use the simplex
+ method.
+
+2004-12-29 Wednesday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.137), interfaces/C/ppl_c.cc (1.125),
+ interfaces/C/ppl_c.h.in (1.44): Temporary interfaces to our new
+ simplex method added.
+
+2004-12-29 Wednesday 21:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.149): Announced the recent changes to Constraint and
+ Generator.
+
+2004-12-29 Wednesday 21:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Result.defs.hh (1.4), Rounding.defs.hh (1.3): Avoid
+ trailing commas: they are non standard.
+
+2004-12-29 Wednesday 18:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplex.cc (1.2): Include "Constraint_System.inlines.hh".
+
+2004-12-29 Wednesday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh (1.6), Makefile.am (1.98),
+ Matrix.defs.hh (1.67), simplex.cc (1.1): Several methods of
+ Matrix are now public instead of protected. Added a first, very
+ rough implementation of Constraint_System::primal_simplex().
+
+2004-12-29 Wednesday 16:45 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.14): Prefer esplicit overflow
+ result.
+
+2004-12-29 Wednesday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.17): Added Maximiliano Marchesi and Andrea Cimino.
+ Updated the contribution of Abramo. Other minor improvements.
+
+2004-12-29 Wednesday 14:47 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.13): Don't throw exception when
+ exactness of result is not checked.
+
+2004-12-29 Wednesday 14:45 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.13): Return overflow Result when
+ Rounding direction is IGNORE.
+
+2004-12-29 Wednesday 11:06 Abramo Bagnara
+
+ * src/: checked.defs.hh (1.8), checked_int.inlines.hh (1.12),
+ checked_mpz.inlines.hh (1.7): Don't compute relation with exact
+ result if choosen rounding direction is IGNORE
+
+2004-12-29 Wednesday 08:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Result.inlines.hh (1.3): Comment fixed. Indentation fixed.
+ Use assert(false) instead of assert(0). Include <cassert>.
+
+2004-12-29 Wednesday 08:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Result.defs.hh (1.3): Comment fixed.
+
+2004-12-29 Wednesday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/Makefile.am (1.3): Added ascii_dump_load1.dat and
+ ascii_dump_load2.dat to MOSTLYCLEANFILES.
+
+2004-12-29 Wednesday 08:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (1.3): Typo fixed.
+
+2004-12-29 Wednesday 00:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.defs.hh (altnum.3): Typos fixed.
+
+2004-12-28 Tuesday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.12): Reflect the fact that the `gmp' option
+ for `--enable-coefficients' has been renamed `mpz'.
+
+2004-12-28 Tuesday 23:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.148): Mention the fact that one of the possible values
+ for the configuration option `--enable-coefficients' has been
+ renamed from `gmp' to `mpz'.
+
+2004-12-28 Tuesday 22:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.16), configure.ac (1.155), demos/ppl_lcdd/ppl_lcdd.cc
+ (1.40), interfaces/C/ppl_c.cc (1.124),
+ interfaces/Prolog/ppl_prolog.icc (1.151),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.29),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.25),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.72),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.96),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.63),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.88), src/BDS_Status.idefs.hh
+ (1.2), src/BDS_Status.inlines.hh (1.2), src/BD_Shape.defs.hh
+ (1.2), src/BD_Shape.inlines.hh (1.2), src/BD_Shape.types.hh
+ (1.2), src/Checked_Number.defs.hh (1.7),
+ src/Checked_Number.inlines.hh (1.12), src/DB_Matrix.defs.hh
+ (1.2), src/DB_Matrix.inlines.hh (1.2), src/DB_Matrix.types.hh
+ (1.2), src/DB_Row.defs.hh (1.2), src/DB_Row.inlines.hh (1.2),
+ src/DB_Row.types.hh (1.2), src/E_NIT.defs.hh (1.2),
+ src/E_NIT.inlines.hh (1.2), src/E_NIT.types.hh (1.2),
+ src/E_Rational.defs.hh (1.2), src/E_Rational.inlines.hh (1.2),
+ src/E_Rational.types.hh (1.2), src/Extended_Number.defs.hh (1.2),
+ src/Extended_Number.inlines.hh (1.2),
+ src/Extended_Number.types.hh (1.2), src/Float.defs.hh (1.2),
+ src/Float.inlines.hh (1.2), src/Interval.inlines.hh (1.17),
+ src/Limits.hh (1.4), src/Makefile.am (1.97),
+ src/Numeric_Format.defs.hh (1.2), src/Polyhedron_nonpublic.cc
+ (1.42), src/Ptr_Iterator.defs.hh (1.2),
+ src/Ptr_Iterator.inlines.hh (1.2), src/Ptr_Iterator.types.hh
+ (1.2), src/Result.defs.hh (1.2), src/Result.inlines.hh (1.2),
+ src/Rounding.defs.hh (1.2), src/Rounding.inlines.hh (1.2),
+ src/Rounding.types.hh (1.2), src/checked.defs.hh (1.7),
+ src/checked.inlines.hh (1.5), src/checked_ext.defs.hh (1.2),
+ src/checked_ext.inlines.hh (1.2), src/checked_float.inlines.hh
+ (1.15), src/checked_int.inlines.hh (1.11),
+ src/checked_mpq.inlines.hh (1.6), src/checked_mpz.inlines.hh
+ (1.6), src/compiler.hh (1.2), src/float.types.hh (1.6),
+ src/fpu-c99.inlines.hh (1.2), src/fpu-ia32.inlines.hh (1.2),
+ src/fpu.defs.hh (1.2), src/globals.defs.hh (1.14),
+ src/globals.inlines.hh (1.7), tests/.cvsignore (1.11),
+ tests/CbecomesNNC1.cc (1.7), tests/Makefile.am (1.241),
+ tests/NNCbecomesC1.cc (1.2), tests/NNCminimize1.cc (1.13),
+ tests/NNCminimize2.cc (1.13), tests/NNCminimize3.cc (1.13),
+ tests/NNCminimize4.cc (1.14), tests/NNCminimize5.cc (1.13),
+ tests/NNCminimize6.cc (1.13), tests/README (1.3),
+ tests/addconstraint1.cc (1.8), tests/addconstraint2.cc (1.5),
+ tests/addconstraint3.cc (1.5), tests/addconstraints1.cc (1.14),
+ tests/addconstraints10.cc (1.12), tests/addconstraints11.cc
+ (1.13), tests/addconstraints12.cc (1.6),
+ tests/addconstraints13.cc (1.8), tests/addconstraints2.cc (1.21),
+ tests/addconstraints3.cc (1.12), tests/addconstraints4.cc (1.13),
+ tests/addconstraints5.cc (1.14), tests/addconstraints6.cc (1.15),
+ tests/addconstraints7.cc (1.14), tests/addconstraints8.cc (1.15),
+ tests/addconstraints9.cc (1.16), tests/addgenerator1.cc (1.10),
+ tests/addgenerator2.cc (1.10), tests/addgenerator3.cc (1.6),
+ tests/addgenerator4.cc (1.8), tests/addgenerator5.cc (1.3),
+ tests/addgenerators1.cc (1.14), tests/addgenerators10.cc (1.6),
+ tests/addgenerators11.cc (1.11), tests/addgenerators12.cc (1.8),
+ tests/addgenerators13.cc (1.4), tests/addgenerators2.cc (1.14),
+ tests/addgenerators3.cc (1.14), tests/addgenerators4.cc (1.14),
+ tests/addgenerators5.cc (1.14), tests/addgenerators6.cc (1.14),
+ tests/addgenerators7.cc (1.11), tests/addgenerators8.cc (1.9),
+ tests/addgenerators9.cc (1.8), tests/addspacedims1.cc (1.3),
+ tests/addspacedims10.cc (1.4), tests/addspacedims11.cc (1.3),
+ tests/addspacedims12.cc (1.2), tests/addspacedims13.cc (1.2),
+ tests/addspacedims2.cc (1.2), tests/addspacedims3.cc (1.4),
+ tests/addspacedims4.cc (1.3), tests/addspacedims5.cc (1.3),
+ tests/addspacedims6.cc (1.3), tests/addspacedims7.cc (1.3),
+ tests/addspacedims8.cc (1.2), tests/addspacedims9.cc (1.3),
+ tests/affineimage1.cc (1.13), tests/affineimage2.cc (1.12),
+ tests/affineimage3.cc (1.6), tests/affineimage4.cc (1.5),
+ tests/affineimage5.cc (1.6), tests/affineimage6.cc (1.5),
+ tests/affineimage7.cc (1.6), tests/affineimage8.cc (1.9),
+ tests/affineimage9.cc (1.3), tests/affinepreimage1.cc (1.13),
+ tests/affinepreimage10.cc (1.9), tests/affinepreimage2.cc (1.12),
+ tests/affinepreimage3.cc (1.12), tests/affinepreimage4.cc (1.14),
+ tests/affinepreimage5.cc (1.5), tests/affinepreimage6.cc (1.6),
+ tests/affinepreimage7.cc (1.6), tests/affinepreimage8.cc (1.5),
+ tests/affinepreimage9.cc (1.6), tests/affinetrans.cc (1.17),
+ tests/append1.cc (1.24), tests/append2.cc (1.24),
+ tests/ascii_dump_load1.cc (1.14), tests/ascii_dump_load2.cc
+ (1.12), tests/ascii_dump_load3.cc (1.15),
+ tests/ascii_dump_load4.cc (1.16), tests/ascii_dump_load5.cc
+ (1.11), tests/ascii_dump_load6.cc (1.8),
+ tests/ascii_dump_load7.cc (1.9), tests/bgp99extrapolation1.cc
+ (1.8), tests/bgp99extrapolation2.cc (1.9),
+ tests/bhrz03widening1.cc (1.6), tests/bhrz03widening10.cc (1.5),
+ tests/bhrz03widening11.cc (1.5), tests/bhrz03widening12.cc (1.6),
+ tests/bhrz03widening13.cc (1.7), tests/bhrz03widening14.cc (1.9),
+ tests/bhrz03widening15.cc (1.10), tests/bhrz03widening16.cc
+ (1.6), tests/bhrz03widening17.cc (1.6), tests/bhrz03widening18.cc
+ (1.6), tests/bhrz03widening19.cc (1.6), tests/bhrz03widening2.cc
+ (1.8), tests/bhrz03widening3.cc (1.7), tests/bhrz03widening4.cc
+ (1.5), tests/bhrz03widening5.cc (1.5), tests/bhrz03widening6.cc
+ (1.7), tests/bhrz03widening7.cc (1.7), tests/bhrz03widening8.cc
+ (1.6), tests/bhrz03widening9.cc (1.9), tests/bhz03widening1.cc
+ (1.9), tests/bhz03widening2.cc (1.11), tests/bhz03widening3.cc
+ (1.10), tests/bhz03widening4.cc (1.7), tests/bhz03widening5.cc
+ (1.8), tests/bhz03widening6.cc (1.9), tests/bounded1.cc (1.15),
+ tests/boundedh79extrapolation1.cc (1.3), tests/boundingbox1.cc
+ (1.40), tests/boundingbox2.cc (1.24), tests/boundingbox3.cc
+ (1.16), tests/boundingbox4.cc (1.13), tests/boundingbox5.cc
+ (1.3), tests/bounds1.cc (1.8), tests/bounds2.cc (1.7),
+ tests/concatenate1.cc (1.11), tests/concatenate2.cc (1.10),
+ tests/concatenate3.cc (1.9), tests/concatenate4.cc (1.8),
+ tests/concatenate5.cc (1.5), tests/concatenate6.cc (1.7),
+ tests/constraints1.cc (1.8), tests/constraints2.cc (1.8),
+ tests/constraints3.cc (1.9), tests/constraints4.cc (1.8),
+ tests/contains1.cc (1.6), tests/contains2.cc (1.5),
+ tests/contains3.cc (1.5), tests/contains4.cc (1.4),
+ tests/contains5.cc (1.4), tests/disjoint1.cc (1.8),
+ tests/disjoint2.cc (1.11), tests/disjoint3.cc (1.11),
+ tests/dualhypercubes.cc (1.10), tests/empty1.cc (1.16),
+ tests/equals1.cc (1.2), tests/exceptions1.cc (1.44),
+ tests/exceptions2.cc (1.38), tests/exceptions3.cc (1.6),
+ tests/expandspacedim1.cc (1.4), tests/expandspacedim2.cc (1.2),
+ tests/foldspacedims1.cc (1.3), tests/foldspacedims2.cc (1.3),
+ tests/generalizedaffineimage1.cc (1.9),
+ tests/generalizedaffineimage10.cc (1.8),
+ tests/generalizedaffineimage11.cc (1.7),
+ tests/generalizedaffineimage12.cc (1.6),
+ tests/generalizedaffineimage2.cc (1.8),
+ tests/generalizedaffineimage3.cc (1.9),
+ tests/generalizedaffineimage4.cc (1.7),
+ tests/generalizedaffineimage5.cc (1.7),
+ tests/generalizedaffineimage6.cc (1.7),
+ tests/generalizedaffineimage7.cc (1.9),
+ tests/generalizedaffineimage8.cc (1.7),
+ tests/generalizedaffineimage9.cc (1.9), tests/generators1.cc
+ (1.17), tests/generators2.cc (1.13), tests/generators3.cc (1.7),
+ tests/generators4.cc (1.8), tests/generators5.cc (1.7),
+ tests/generators6.cc (1.8), tests/geomcovers1.cc (1.3),
+ tests/h79widening1.cc (1.7), tests/h79widening2.cc (1.8),
+ tests/h79widening3.cc (1.8), tests/h79widening4.cc (1.6),
+ tests/h79widening5.cc (1.6), tests/h79widening6.cc (1.8),
+ tests/h79widening7.cc (1.4), tests/h79widening8.cc (1.3),
+ tests/intersection1.cc (1.7), tests/intersection10.cc (1.7),
+ tests/intersection11.cc (1.7), tests/intersection2.cc (1.13),
+ tests/intersection3.cc (1.8), tests/intersection4.cc (1.9),
+ tests/intersection5.cc (1.8), tests/intersection6.cc (1.9),
+ tests/intersection7.cc (1.7), tests/intersection8.cc (1.6),
+ tests/intersection9.cc (1.6),
+ tests/limitedbhrz03extrapolation1.cc (1.6),
+ tests/limitedh79extrapolation1.cc (1.5),
+ tests/limitedh79extrapolation2.cc (1.5),
+ tests/limitedh79extrapolation3.cc (1.6),
+ tests/limitedh79extrapolation4.cc (1.6),
+ tests/linearpartition1.cc (1.16), tests/linearpartition2.cc
+ (1.16), tests/linearpartition3.cc (1.16),
+ tests/linearpartition4.cc (1.4), tests/linexpression1.cc (1.6),
+ tests/mapspacedims1.cc (1.3), tests/mapspacedims2.cc (1.2),
+ tests/mapspacedims3.cc (1.2), tests/mapspacedims4.cc (1.2),
+ tests/max_min1.cc (1.7), tests/max_min2.cc (1.7),
+ tests/maxspacedim1.cc (1.6), tests/mc91.cc (1.16),
+ tests/membytes1.cc (1.8), tests/membytes2.cc (1.4),
+ tests/memory1.cc (1.24), tests/minconstraints1.cc (1.7),
+ tests/minconstraints2.cc (1.7), tests/minconstraints3.cc (1.6),
+ tests/minconstraints4.cc (1.10), tests/mingenerators1.cc (1.7),
+ tests/mingenerators2.cc (1.6), tests/mingenerators3.cc (1.6),
+ tests/onepoint.cc (1.11), tests/permute.cc (1.33),
+ tests/polydifference1.cc (1.11), tests/polydifference2.cc (1.12),
+ tests/polydifference3.cc (1.7), tests/polydifference4.cc (1.6),
+ tests/polydifference5.cc (1.7), tests/polydifference6.cc (1.7),
+ tests/polydifference7.cc (1.6), tests/polydifference8.cc (1.5),
+ tests/polydifference9.cc (1.7), tests/polyhull1.cc (1.10),
+ tests/polyhull10.cc (1.6), tests/polyhull11.cc (1.3),
+ tests/polyhull2.cc (1.9), tests/polyhull3.cc (1.8),
+ tests/polyhull4.cc (1.7), tests/polyhull5.cc (1.6),
+ tests/polyhull6.cc (1.6), tests/polyhull7.cc (1.6),
+ tests/polyhull8.cc (1.6), tests/polyhull9.cc (1.7),
+ tests/ppl_test.hh (1.5), tests/randphull1.cc (1.14),
+ tests/randphull2.cc (1.11), tests/relations1.cc (1.12),
+ tests/relations10.cc (1.7), tests/relations11.cc (1.7),
+ tests/relations12.cc (1.7), tests/relations13.cc (1.6),
+ tests/relations14.cc (1.6), tests/relations15.cc (1.7),
+ tests/relations16.cc (1.7), tests/relations17.cc (1.10),
+ tests/relations18.cc (1.6), tests/relations19.cc (1.7),
+ tests/relations2.cc (1.12), tests/relations3.cc (1.12),
+ tests/relations4.cc (1.13), tests/relations5.cc (1.13),
+ tests/relations6.cc (1.11), tests/relations7.cc (1.12),
+ tests/relations8.cc (1.12), tests/relations9.cc (1.15),
+ tests/removespacedims1.cc (1.3), tests/removespacedims10.cc
+ (1.2), tests/removespacedims2.cc (1.4), tests/removespacedims3.cc
+ (1.2), tests/removespacedims4.cc (1.3), tests/removespacedims5.cc
+ (1.2), tests/removespacedims6.cc (1.2), tests/removespacedims7.cc
+ (1.2), tests/removespacedims8.cc (1.3), tests/removespacedims9.cc
+ (1.2), tests/smm1.cc (1.18), tests/timeelapse1.cc (1.10),
+ tests/timeelapse2.cc (1.9), tests/timeelapse3.cc (1.11),
+ tests/timeelapse4.cc (1.10), tests/timeelapse5.cc (1.10),
+ tests/timeelapse6.cc (1.6), tests/timeelapse7.cc (1.5),
+ tests/timeelapse8.cc (1.6), tests/timeelapse9.cc (1.2),
+ tests/topclosed1.cc (1.8), tests/topclosed2.cc (1.8),
+ tests/topclosed3.cc (1.10), tests/topclosure1.cc (1.9),
+ tests/topclosure2.cc (1.5), tests/topclosure3.cc (1.5),
+ tests/topclosure4.cc (1.7), tests/universe1.cc (1.11),
+ tests/universe2.cc (1.12), tests/universe3.cc (1.13),
+ tests/universe4.cc (1.13), tests/universe5.cc (1.13),
+ tests/universe6.cc (1.12), tests/universe7.cc (1.3),
+ tests/valgrind_suppressions (1.2), tests/watchdog1.cc (1.22),
+ tests/writeconsys1.cc (1.10), tests/writegensys1.cc (1.10),
+ tests/writegensys2.cc (1.10), tests/writegensys3.cc (1.10),
+ tests/writepolyhedron1.cc (1.8), tests/writepolyhedron2.cc (1.9),
+ tests/writepolyhedron3.cc (1.8), tests/writerelation1.cc (1.8),
+ tests/writevariable1.cc (1.11), tests/BD_Shape/.cvsignore (1.2),
+ tests/BD_Shape/Makefile.am (1.2),
+ tests/BD_Shape/addconstraints1.cc (1.2),
+ tests/BD_Shape/addspacedims1.cc (1.2),
+ tests/BD_Shape/addspacedims2.cc (1.2),
+ tests/BD_Shape/addspacedims3.cc (1.2),
+ tests/BD_Shape/addspacedims4.cc (1.2),
+ tests/BD_Shape/addspacedims5.cc (1.2),
+ tests/BD_Shape/addspacedims6.cc (1.2),
+ tests/BD_Shape/addspacedims7.cc (1.2),
+ tests/BD_Shape/affineimage1.cc (1.2),
+ tests/BD_Shape/affineimage2.cc (1.2),
+ tests/BD_Shape/affineimage3.cc (1.2),
+ tests/BD_Shape/affineimage4.cc (1.2),
+ tests/BD_Shape/affineimage5.cc (1.2),
+ tests/BD_Shape/affineimage6.cc (1.2),
+ tests/BD_Shape/affineimage7.cc (1.2),
+ tests/BD_Shape/affinepreimage1.cc (1.2),
+ tests/BD_Shape/affinepreimage2.cc (1.2),
+ tests/BD_Shape/affinepreimage3.cc (1.2),
+ tests/BD_Shape/affinepreimage4.cc (1.2),
+ tests/BD_Shape/ascii_dump_load1.cc (1.2),
+ tests/BD_Shape/ascii_dump_load2.cc (1.2),
+ tests/BD_Shape/cc76extrapolation1.cc (1.2),
+ tests/BD_Shape/cc76extrapolation2.cc (1.2),
+ tests/BD_Shape/cc76extrapolation3.cc (1.2),
+ tests/BD_Shape/cc76extrapolation4.cc (1.2),
+ tests/BD_Shape/cc76extrapolation5.cc (1.2),
+ tests/BD_Shape/cc76extrapolation6.cc (1.2),
+ tests/BD_Shape/cc76narrowing1.cc (1.2),
+ tests/BD_Shape/cc76narrowing2.cc (1.2),
+ tests/BD_Shape/cc76narrowing3.cc (1.2),
+ tests/BD_Shape/cc76narrowing4.cc (1.2),
+ tests/BD_Shape/cc76narrowing5.cc (1.2),
+ tests/BD_Shape/ch78widening1.cc (1.2),
+ tests/BD_Shape/ch78widening2.cc (1.2),
+ tests/BD_Shape/ch78widening3.cc (1.2),
+ tests/BD_Shape/ch78widening4.cc (1.2),
+ tests/BD_Shape/ch78widening5.cc (1.2),
+ tests/BD_Shape/ch78widening6.cc (1.2),
+ tests/BD_Shape/ch78widening7.cc (1.2),
+ tests/BD_Shape/ch78widening8.cc (1.2),
+ tests/BD_Shape/concatenate1.cc (1.2),
+ tests/BD_Shape/concatenate2.cc (1.2),
+ tests/BD_Shape/concatenate3.cc (1.2),
+ tests/BD_Shape/concatenate4.cc (1.2),
+ tests/BD_Shape/concatenate5.cc (1.2),
+ tests/BD_Shape/constraints1.cc (1.2),
+ tests/BD_Shape/constraints2.cc (1.2), tests/BD_Shape/contains1.cc
+ (1.2), tests/BD_Shape/contains2.cc (1.2),
+ tests/BD_Shape/contains3.cc (1.2), tests/BD_Shape/empty1.cc
+ (1.2), tests/BD_Shape/empty2.cc (1.2), tests/BD_Shape/empty3.cc
+ (1.2), tests/BD_Shape/empty4.cc (1.2),
+ tests/BD_Shape/equality1.cc (1.2), tests/BD_Shape/exceptions1.cc
+ (1.2), tests/BD_Shape/exceptions2.cc (1.2),
+ tests/BD_Shape/exceptions3.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage1.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage10.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage11.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage12.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage2.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage3.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage4.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage5.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage6.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage7.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage8.cc (1.2),
+ tests/BD_Shape/generalizedaffineimage9.cc (1.2),
+ tests/BD_Shape/h79widening1.cc (1.2),
+ tests/BD_Shape/intersection1.cc (1.2),
+ tests/BD_Shape/intersection2.cc (1.2),
+ tests/BD_Shape/intersection3.cc (1.2),
+ tests/BD_Shape/intersection4.cc (1.2),
+ tests/BD_Shape/intersection5.cc (1.2),
+ tests/BD_Shape/intersection6.cc (1.2),
+ tests/BD_Shape/intersection7.cc (1.2),
+ tests/BD_Shape/intersection8.cc (1.2),
+ tests/BD_Shape/limitedCC76extrapolation1.cc (1.2),
+ tests/BD_Shape/limitedCC76extrapolation2.cc (1.2),
+ tests/BD_Shape/limitedCC76extrapolation3.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation1.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation2.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation3.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation4.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation5.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation6.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation7.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation8.cc (1.2),
+ tests/BD_Shape/limitedCH78extrapolation9.cc (1.2),
+ tests/BD_Shape/limitedh79extrapolation1.cc (1.2),
+ tests/BD_Shape/mapspacedims1.cc (1.2),
+ tests/BD_Shape/mapspacedims2.cc (1.2),
+ tests/BD_Shape/mapspacedims3.cc (1.2),
+ tests/BD_Shape/mapspacedims4.cc (1.2),
+ tests/BD_Shape/maxspacedim.cc (1.2),
+ tests/BD_Shape/polydifference1.cc (1.2),
+ tests/BD_Shape/polydifference2.cc (1.2),
+ tests/BD_Shape/polydifference3.cc (1.2),
+ tests/BD_Shape/polydifference4.cc (1.2),
+ tests/BD_Shape/polydifference5.cc (1.2),
+ tests/BD_Shape/polydifference6.cc (1.2),
+ tests/BD_Shape/polyhull1.cc (1.2), tests/BD_Shape/polyhull2.cc
+ (1.2), tests/BD_Shape/polyhull3.cc (1.2),
+ tests/BD_Shape/polyhull4.cc (1.2), tests/BD_Shape/relations1.cc
+ (1.2), tests/BD_Shape/relations2.cc (1.2),
+ tests/BD_Shape/relations3.cc (1.2), tests/BD_Shape/relations4.cc
+ (1.2), tests/BD_Shape/relations5.cc (1.2),
+ tests/BD_Shape/removespacedims1.cc (1.2),
+ tests/BD_Shape/removespacedims2.cc (1.2),
+ tests/BD_Shape/removespacedims3.cc (1.2),
+ tests/BD_Shape/timeelapse1.cc (1.2),
+ tests/BD_Shape/timeelapse2.cc (1.2),
+ tests/BD_Shape/timeelapse3.cc (1.2),
+ tests/BD_Shape/timeelapse4.cc (1.2),
+ tests/BD_Shape/timeelapse5.cc (1.2), tests/BD_Shape/universe1.cc
+ (1.2), tests/BD_Shape/writebdiffs1.cc (1.2),
+ tests/BD_Shape/writebdiffs2.cc (1.2), tests/Polyhedron/.cvsignore
+ (1.2), tests/Polyhedron/CbecomesNNC1.cc (1.2),
+ tests/Polyhedron/Makefile.am (1.2),
+ tests/Polyhedron/NNCbecomesC1.cc (1.2),
+ tests/Polyhedron/NNCminimize1.cc (1.2),
+ tests/Polyhedron/NNCminimize2.cc (1.2),
+ tests/Polyhedron/NNCminimize3.cc (1.2),
+ tests/Polyhedron/NNCminimize4.cc (1.2),
+ tests/Polyhedron/NNCminimize5.cc (1.2),
+ tests/Polyhedron/NNCminimize6.cc (1.2), tests/Polyhedron/README
+ (1.2), tests/Polyhedron/addconstraint1.cc (1.2),
+ tests/Polyhedron/addconstraint2.cc (1.2),
+ tests/Polyhedron/addconstraint3.cc (1.2),
+ tests/Polyhedron/addconstraints1.cc (1.2),
+ tests/Polyhedron/addconstraints10.cc (1.2),
+ tests/Polyhedron/addconstraints11.cc (1.2),
+ tests/Polyhedron/addconstraints12.cc (1.2),
+ tests/Polyhedron/addconstraints13.cc (1.2),
+ tests/Polyhedron/addconstraints2.cc (1.2),
+ tests/Polyhedron/addconstraints3.cc (1.2),
+ tests/Polyhedron/addconstraints4.cc (1.2),
+ tests/Polyhedron/addconstraints5.cc (1.2),
+ tests/Polyhedron/addconstraints6.cc (1.2),
+ tests/Polyhedron/addconstraints7.cc (1.2),
+ tests/Polyhedron/addconstraints8.cc (1.2),
+ tests/Polyhedron/addconstraints9.cc (1.2),
+ tests/Polyhedron/addgenerator1.cc (1.2),
+ tests/Polyhedron/addgenerator2.cc (1.2),
+ tests/Polyhedron/addgenerator3.cc (1.2),
+ tests/Polyhedron/addgenerator4.cc (1.2),
+ tests/Polyhedron/addgenerator5.cc (1.2),
+ tests/Polyhedron/addgenerators1.cc (1.2),
+ tests/Polyhedron/addgenerators10.cc (1.2),
+ tests/Polyhedron/addgenerators11.cc (1.2),
+ tests/Polyhedron/addgenerators12.cc (1.2),
+ tests/Polyhedron/addgenerators13.cc (1.2),
+ tests/Polyhedron/addgenerators2.cc (1.2),
+ tests/Polyhedron/addgenerators3.cc (1.2),
+ tests/Polyhedron/addgenerators4.cc (1.2),
+ tests/Polyhedron/addgenerators5.cc (1.2),
+ tests/Polyhedron/addgenerators6.cc (1.2),
+ tests/Polyhedron/addgenerators7.cc (1.2),
+ tests/Polyhedron/addgenerators8.cc (1.2),
+ tests/Polyhedron/addgenerators9.cc (1.2),
+ tests/Polyhedron/addspacedims1.cc (1.2),
+ tests/Polyhedron/addspacedims10.cc (1.2),
+ tests/Polyhedron/addspacedims11.cc (1.2),
+ tests/Polyhedron/addspacedims12.cc (1.2),
+ tests/Polyhedron/addspacedims13.cc (1.2),
+ tests/Polyhedron/addspacedims2.cc (1.2),
+ tests/Polyhedron/addspacedims3.cc (1.2),
+ tests/Polyhedron/addspacedims4.cc (1.2),
+ tests/Polyhedron/addspacedims5.cc (1.2),
+ tests/Polyhedron/addspacedims6.cc (1.2),
+ tests/Polyhedron/addspacedims7.cc (1.2),
+ tests/Polyhedron/addspacedims8.cc (1.2),
+ tests/Polyhedron/addspacedims9.cc (1.2),
+ tests/Polyhedron/affineimage1.cc (1.2),
+ tests/Polyhedron/affineimage2.cc (1.2),
+ tests/Polyhedron/affineimage3.cc (1.2),
+ tests/Polyhedron/affineimage4.cc (1.2),
+ tests/Polyhedron/affineimage5.cc (1.2),
+ tests/Polyhedron/affineimage6.cc (1.2),
+ tests/Polyhedron/affineimage7.cc (1.2),
+ tests/Polyhedron/affineimage8.cc (1.2),
+ tests/Polyhedron/affineimage9.cc (1.2),
+ tests/Polyhedron/affinepreimage1.cc (1.2),
+ tests/Polyhedron/affinepreimage10.cc (1.2),
+ tests/Polyhedron/affinepreimage2.cc (1.2),
+ tests/Polyhedron/affinepreimage3.cc (1.2),
+ tests/Polyhedron/affinepreimage4.cc (1.2),
+ tests/Polyhedron/affinepreimage5.cc (1.2),
+ tests/Polyhedron/affinepreimage6.cc (1.2),
+ tests/Polyhedron/affinepreimage7.cc (1.2),
+ tests/Polyhedron/affinepreimage8.cc (1.2),
+ tests/Polyhedron/affinepreimage9.cc (1.2),
+ tests/Polyhedron/affinetrans.cc (1.2),
+ tests/Polyhedron/append1.cc (1.2), tests/Polyhedron/append2.cc
+ (1.2), tests/Polyhedron/ascii_dump_load1.cc (1.2),
+ tests/Polyhedron/ascii_dump_load2.cc (1.2),
+ tests/Polyhedron/ascii_dump_load3.cc (1.2),
+ tests/Polyhedron/ascii_dump_load4.cc (1.2),
+ tests/Polyhedron/ascii_dump_load5.cc (1.2),
+ tests/Polyhedron/ascii_dump_load6.cc (1.2),
+ tests/Polyhedron/ascii_dump_load7.cc (1.2),
+ tests/Polyhedron/bgp99extrapolation1.cc (1.2),
+ tests/Polyhedron/bgp99extrapolation2.cc (1.2),
+ tests/Polyhedron/bhrz03widening1.cc (1.2),
+ tests/Polyhedron/bhrz03widening10.cc (1.2),
+ tests/Polyhedron/bhrz03widening11.cc (1.2),
+ tests/Polyhedron/bhrz03widening12.cc (1.2),
+ tests/Polyhedron/bhrz03widening13.cc (1.2),
+ tests/Polyhedron/bhrz03widening14.cc (1.2),
+ tests/Polyhedron/bhrz03widening15.cc (1.2),
+ tests/Polyhedron/bhrz03widening16.cc (1.2),
+ tests/Polyhedron/bhrz03widening17.cc (1.2),
+ tests/Polyhedron/bhrz03widening18.cc (1.2),
+ tests/Polyhedron/bhrz03widening19.cc (1.2),
+ tests/Polyhedron/bhrz03widening2.cc (1.2),
+ tests/Polyhedron/bhrz03widening3.cc (1.2),
+ tests/Polyhedron/bhrz03widening4.cc (1.2),
+ tests/Polyhedron/bhrz03widening5.cc (1.2),
+ tests/Polyhedron/bhrz03widening6.cc (1.2),
+ tests/Polyhedron/bhrz03widening7.cc (1.2),
+ tests/Polyhedron/bhrz03widening8.cc (1.2),
+ tests/Polyhedron/bhrz03widening9.cc (1.2),
+ tests/Polyhedron/bhz03widening1.cc (1.2),
+ tests/Polyhedron/bhz03widening2.cc (1.2),
+ tests/Polyhedron/bhz03widening3.cc (1.2),
+ tests/Polyhedron/bhz03widening4.cc (1.2),
+ tests/Polyhedron/bhz03widening5.cc (1.2),
+ tests/Polyhedron/bhz03widening6.cc (1.2),
+ tests/Polyhedron/bounded1.cc (1.2),
+ tests/Polyhedron/boundedh79extrapolation1.cc (1.2),
+ tests/Polyhedron/boundingbox1.cc (1.2),
+ tests/Polyhedron/boundingbox2.cc (1.2),
+ tests/Polyhedron/boundingbox3.cc (1.2),
+ tests/Polyhedron/boundingbox4.cc (1.2),
+ tests/Polyhedron/boundingbox5.cc (1.2),
+ tests/Polyhedron/bounds1.cc (1.2), tests/Polyhedron/bounds2.cc
+ (1.2), tests/Polyhedron/concatenate1.cc (1.2),
+ tests/Polyhedron/concatenate2.cc (1.2),
+ tests/Polyhedron/concatenate3.cc (1.2),
+ tests/Polyhedron/concatenate4.cc (1.2),
+ tests/Polyhedron/concatenate5.cc (1.2),
+ tests/Polyhedron/concatenate6.cc (1.2),
+ tests/Polyhedron/constraints1.cc (1.2),
+ tests/Polyhedron/constraints2.cc (1.2),
+ tests/Polyhedron/constraints3.cc (1.2),
+ tests/Polyhedron/constraints4.cc (1.2),
+ tests/Polyhedron/contains1.cc (1.2),
+ tests/Polyhedron/contains2.cc (1.2),
+ tests/Polyhedron/contains3.cc (1.2),
+ tests/Polyhedron/contains4.cc (1.2),
+ tests/Polyhedron/contains5.cc (1.2),
+ tests/Polyhedron/disjoint1.cc (1.2),
+ tests/Polyhedron/disjoint2.cc (1.2),
+ tests/Polyhedron/disjoint3.cc (1.2),
+ tests/Polyhedron/dualhypercubes.cc (1.2),
+ tests/Polyhedron/empty1.cc (1.2), tests/Polyhedron/equals1.cc
+ (1.2), tests/Polyhedron/exceptions1.cc (1.2),
+ tests/Polyhedron/exceptions2.cc (1.2),
+ tests/Polyhedron/exceptions3.cc (1.2),
+ tests/Polyhedron/expandspacedim1.cc (1.2),
+ tests/Polyhedron/expandspacedim2.cc (1.2),
+ tests/Polyhedron/foldspacedims1.cc (1.2),
+ tests/Polyhedron/foldspacedims2.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage1.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage10.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage11.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage12.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage2.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage3.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage4.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage5.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage6.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage7.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage8.cc (1.2),
+ tests/Polyhedron/generalizedaffineimage9.cc (1.2),
+ tests/Polyhedron/generators1.cc (1.2),
+ tests/Polyhedron/generators2.cc (1.2),
+ tests/Polyhedron/generators3.cc (1.2),
+ tests/Polyhedron/generators4.cc (1.2),
+ tests/Polyhedron/generators5.cc (1.2),
+ tests/Polyhedron/generators6.cc (1.2),
+ tests/Polyhedron/geomcovers1.cc (1.2),
+ tests/Polyhedron/h79widening1.cc (1.2),
+ tests/Polyhedron/h79widening2.cc (1.2),
+ tests/Polyhedron/h79widening3.cc (1.2),
+ tests/Polyhedron/h79widening4.cc (1.2),
+ tests/Polyhedron/h79widening5.cc (1.2),
+ tests/Polyhedron/h79widening6.cc (1.2),
+ tests/Polyhedron/h79widening7.cc (1.2),
+ tests/Polyhedron/h79widening8.cc (1.2),
+ tests/Polyhedron/intersection1.cc (1.2),
+ tests/Polyhedron/intersection10.cc (1.2),
+ tests/Polyhedron/intersection11.cc (1.2),
+ tests/Polyhedron/intersection2.cc (1.2),
+ tests/Polyhedron/intersection3.cc (1.2),
+ tests/Polyhedron/intersection4.cc (1.2),
+ tests/Polyhedron/intersection5.cc (1.2),
+ tests/Polyhedron/intersection6.cc (1.2),
+ tests/Polyhedron/intersection7.cc (1.2),
+ tests/Polyhedron/intersection8.cc (1.2),
+ tests/Polyhedron/intersection9.cc (1.2),
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.2),
+ tests/Polyhedron/limitedh79extrapolation1.cc (1.2),
+ tests/Polyhedron/limitedh79extrapolation2.cc (1.2),
+ tests/Polyhedron/limitedh79extrapolation3.cc (1.2),
+ tests/Polyhedron/limitedh79extrapolation4.cc (1.2),
+ tests/Polyhedron/linearpartition1.cc (1.2),
+ tests/Polyhedron/linearpartition2.cc (1.2),
+ tests/Polyhedron/linearpartition3.cc (1.2),
+ tests/Polyhedron/linearpartition4.cc (1.2),
+ tests/Polyhedron/linexpression1.cc (1.2),
+ tests/Polyhedron/mapspacedims1.cc (1.2),
+ tests/Polyhedron/mapspacedims2.cc (1.2),
+ tests/Polyhedron/mapspacedims3.cc (1.2),
+ tests/Polyhedron/mapspacedims4.cc (1.2),
+ tests/Polyhedron/max_min1.cc (1.2), tests/Polyhedron/max_min2.cc
+ (1.2), tests/Polyhedron/maxspacedim1.cc (1.2),
+ tests/Polyhedron/mc91.cc (1.2), tests/Polyhedron/membytes1.cc
+ (1.2), tests/Polyhedron/membytes2.cc (1.2),
+ tests/Polyhedron/memory1.cc (1.2),
+ tests/Polyhedron/minconstraints1.cc (1.2),
+ tests/Polyhedron/minconstraints2.cc (1.2),
+ tests/Polyhedron/minconstraints3.cc (1.2),
+ tests/Polyhedron/minconstraints4.cc (1.2),
+ tests/Polyhedron/mingenerators1.cc (1.2),
+ tests/Polyhedron/mingenerators2.cc (1.2),
+ tests/Polyhedron/mingenerators3.cc (1.2),
+ tests/Polyhedron/onepoint.cc (1.2), tests/Polyhedron/permute.cc
+ (1.2), tests/Polyhedron/polydifference1.cc (1.2),
+ tests/Polyhedron/polydifference2.cc (1.2),
+ tests/Polyhedron/polydifference3.cc (1.2),
+ tests/Polyhedron/polydifference4.cc (1.2),
+ tests/Polyhedron/polydifference5.cc (1.2),
+ tests/Polyhedron/polydifference6.cc (1.2),
+ tests/Polyhedron/polydifference7.cc (1.2),
+ tests/Polyhedron/polydifference8.cc (1.2),
+ tests/Polyhedron/polydifference9.cc (1.2),
+ tests/Polyhedron/polyhull1.cc (1.2),
+ tests/Polyhedron/polyhull10.cc (1.2),
+ tests/Polyhedron/polyhull11.cc (1.2),
+ tests/Polyhedron/polyhull2.cc (1.2),
+ tests/Polyhedron/polyhull3.cc (1.2),
+ tests/Polyhedron/polyhull4.cc (1.2),
+ tests/Polyhedron/polyhull5.cc (1.2),
+ tests/Polyhedron/polyhull6.cc (1.2),
+ tests/Polyhedron/polyhull7.cc (1.2),
+ tests/Polyhedron/polyhull8.cc (1.2),
+ tests/Polyhedron/polyhull9.cc (1.2),
+ tests/Polyhedron/randphull1.cc (1.2),
+ tests/Polyhedron/randphull2.cc (1.2),
+ tests/Polyhedron/relations1.cc (1.2),
+ tests/Polyhedron/relations10.cc (1.2),
+ tests/Polyhedron/relations11.cc (1.2),
+ tests/Polyhedron/relations12.cc (1.2),
+ tests/Polyhedron/relations13.cc (1.2),
+ tests/Polyhedron/relations14.cc (1.2),
+ tests/Polyhedron/relations15.cc (1.2),
+ tests/Polyhedron/relations16.cc (1.2),
+ tests/Polyhedron/relations17.cc (1.2),
+ tests/Polyhedron/relations18.cc (1.2),
+ tests/Polyhedron/relations19.cc (1.2),
+ tests/Polyhedron/relations2.cc (1.2),
+ tests/Polyhedron/relations3.cc (1.2),
+ tests/Polyhedron/relations4.cc (1.2),
+ tests/Polyhedron/relations5.cc (1.2),
+ tests/Polyhedron/relations6.cc (1.2),
+ tests/Polyhedron/relations7.cc (1.2),
+ tests/Polyhedron/relations8.cc (1.2),
+ tests/Polyhedron/relations9.cc (1.2),
+ tests/Polyhedron/removespacedims1.cc (1.2),
+ tests/Polyhedron/removespacedims10.cc (1.2),
+ tests/Polyhedron/removespacedims2.cc (1.2),
+ tests/Polyhedron/removespacedims3.cc (1.2),
+ tests/Polyhedron/removespacedims4.cc (1.2),
+ tests/Polyhedron/removespacedims5.cc (1.2),
+ tests/Polyhedron/removespacedims6.cc (1.2),
+ tests/Polyhedron/removespacedims7.cc (1.2),
+ tests/Polyhedron/removespacedims8.cc (1.2),
+ tests/Polyhedron/removespacedims9.cc (1.2),
+ tests/Polyhedron/smm1.cc (1.2), tests/Polyhedron/timeelapse1.cc
+ (1.2), tests/Polyhedron/timeelapse2.cc (1.2),
+ tests/Polyhedron/timeelapse3.cc (1.2),
+ tests/Polyhedron/timeelapse4.cc (1.2),
+ tests/Polyhedron/timeelapse5.cc (1.2),
+ tests/Polyhedron/timeelapse6.cc (1.2),
+ tests/Polyhedron/timeelapse7.cc (1.2),
+ tests/Polyhedron/timeelapse8.cc (1.2),
+ tests/Polyhedron/timeelapse9.cc (1.2),
+ tests/Polyhedron/topclosed1.cc (1.2),
+ tests/Polyhedron/topclosed2.cc (1.2),
+ tests/Polyhedron/topclosed3.cc (1.2),
+ tests/Polyhedron/topclosure1.cc (1.2),
+ tests/Polyhedron/topclosure2.cc (1.2),
+ tests/Polyhedron/topclosure3.cc (1.2),
+ tests/Polyhedron/topclosure4.cc (1.2),
+ tests/Polyhedron/universe1.cc (1.2),
+ tests/Polyhedron/universe2.cc (1.2),
+ tests/Polyhedron/universe3.cc (1.2),
+ tests/Polyhedron/universe4.cc (1.2),
+ tests/Polyhedron/universe5.cc (1.2),
+ tests/Polyhedron/universe6.cc (1.2),
+ tests/Polyhedron/universe7.cc (1.2),
+ tests/Polyhedron/valgrind_suppressions (1.2),
+ tests/Polyhedron/watchdog1.cc (1.2),
+ tests/Polyhedron/writeconsys1.cc (1.2),
+ tests/Polyhedron/writegensys1.cc (1.2),
+ tests/Polyhedron/writegensys2.cc (1.2),
+ tests/Polyhedron/writegensys3.cc (1.2),
+ tests/Polyhedron/writepolyhedron1.cc (1.2),
+ tests/Polyhedron/writepolyhedron2.cc (1.2),
+ tests/Polyhedron/writepolyhedron3.cc (1.2),
+ tests/Polyhedron/writerelation1.cc (1.2),
+ tests/Polyhedron/writevariable1.cc (1.2): Second merge from the
+ `altnum' branch.
+
+2004-12-28 Tuesday 20:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.21): Anonymous namespaces hve to do with visibility
+ of names, not linkage.
+
+2004-12-28 Tuesday 20:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: track_allocation.hh (1.15), Ciao/ppl_ciao.cc
+ (1.28), GNU/ppl_gprolog_sd.cc (1.24), SICStus/ppl_sicstus_sd.cc
+ (1.71), SWI/ppl_swiprolog.cc (1.95), XSB/ppl_xsb.cc (1.62),
+ YAP/ppl_yap.cc (1.87): Use anonymous namespaces instead of
+ keyword "static" to hide functions and variables from the eyes of
+ other translation units.
+
+2004-12-28 Tuesday 19:39 Abramo Bagnara
+
+ * src/: Extended_Number.defs.hh, Extended_Number.inlines.hh,
+ Extended_Number.types.hh (altnum.[1,1,1]): Added preliminary
+ Extended_Number implementation.
+
+2004-12-28 Tuesday 19:36 Abramo Bagnara
+
+ * src/: E_Rational.inlines.hh, Interval.inlines.hh,
+ Polyhedron_nonpublic.cc (altnum.[2,9,12]): Fixed some
+ Checked::assign use.
+
+2004-12-28 Tuesday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/: exceptions2.cc, exceptions3.cc (altnum.[3,3]):
+ Refer to `Coefficient' instead of `Integer'.
+
+2004-12-28 Tuesday 18:35 Abramo Bagnara
+
+ * src/checked.defs.hh (altnum.25): Fixed incomplete change of
+ return type for set_special.
+
+2004-12-28 Tuesday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/.cvsignore (altnum.1): Put under CVS control.
+
+2004-12-28 Tuesday 18:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.20): Added guideline for the specification of
+ internal linkage functions and variables.
+
+2004-12-28 Tuesday 18:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Polyhedron/: NNCbecomesC1.cc, addconstraints13.cc,
+ addgenerators12.cc, affineimage8.cc, affinepreimage10.cc,
+ affinepreimage9.cc, append1.cc, append2.cc, ascii_dump_load1.cc,
+ ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+ ascii_dump_load5.cc, ascii_dump_load6.cc, ascii_dump_load7.cc,
+ bhrz03widening1.cc, bhrz03widening12.cc, bhrz03widening13.cc,
+ bhrz03widening14.cc, bhrz03widening15.cc, bhrz03widening9.cc,
+ bhz03widening6.cc, boundingbox1.cc, boundingbox2.cc,
+ boundingbox3.cc, boundingbox4.cc, concatenate6.cc,
+ constraints4.cc, contains5.cc, disjoint2.cc, disjoint3.cc,
+ exceptions1.cc, exceptions2.cc, exceptions3.cc,
+ expandspacedim1.cc, expandspacedim2.cc, foldspacedims1.cc,
+ foldspacedims2.cc, generalizedaffineimage10.cc,
+ generalizedaffineimage11.cc, generalizedaffineimage7.cc,
+ generalizedaffineimage9.cc, generators6.cc, h79widening1.cc,
+ intersection10.cc, intersection11.cc, intersection2.cc,
+ intersection7.cc, limitedh79extrapolation4.cc,
+ linearpartition1.cc, linearpartition2.cc, linearpartition3.cc,
+ mapspacedims1.cc, mapspacedims2.cc, mapspacedims3.cc,
+ mapspacedims4.cc, membytes1.cc, membytes2.cc, memory1.cc,
+ permute.cc, polydifference7.cc, polydifference9.cc, polyhull4.cc,
+ polyhull8.cc, polyhull9.cc, randphull1.cc, randphull2.cc,
+ relations17.cc, relations19.cc, relations9.cc, smm1.cc,
+ topclosure4.cc, watchdog1.cc, writeconsys1.cc, writegensys1.cc,
+ writegensys2.cc, writegensys3.cc, writepolyhedron1.cc,
+ writepolyhedron2.cc, writepolyhedron3.cc, writerelation1.cc,
+ writevariable1.cc
+ (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2]):
+ Prefer using anonymous namespace to specify internal linkage.
+
+2004-12-28 Tuesday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (altnum.3): New implementation for
+ BD_Shape<T>::relation_with(const Generator& g).
+
+2004-12-28 Tuesday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BD_Shape/affinepreimage1.cc (altnum.3): Typo fixed.
+
+2004-12-28 Tuesday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, tests/BD_Shape/addconstraints1.cc,
+ tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+ tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+ tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+ tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+ tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+ tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+ tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+ tests/BD_Shape/affinepreimage1.cc,
+ tests/BD_Shape/affinepreimage2.cc,
+ tests/BD_Shape/affinepreimage3.cc,
+ tests/BD_Shape/affinepreimage4.cc,
+ tests/BD_Shape/ascii_dump_load1.cc,
+ tests/BD_Shape/ascii_dump_load2.cc,
+ tests/BD_Shape/cc76extrapolation1.cc,
+ tests/BD_Shape/cc76extrapolation2.cc,
+ tests/BD_Shape/cc76extrapolation3.cc,
+ tests/BD_Shape/cc76extrapolation4.cc,
+ tests/BD_Shape/cc76extrapolation5.cc,
+ tests/BD_Shape/cc76extrapolation6.cc,
+ tests/BD_Shape/cc76narrowing1.cc,
+ tests/BD_Shape/cc76narrowing2.cc,
+ tests/BD_Shape/cc76narrowing3.cc,
+ tests/BD_Shape/cc76narrowing4.cc,
+ tests/BD_Shape/cc76narrowing5.cc,
+ tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+ tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+ tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+ tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+ tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+ tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+ tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+ tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+ tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+ tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+ tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+ tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+ tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+ tests/BD_Shape/generalizedaffineimage1.cc,
+ tests/BD_Shape/generalizedaffineimage10.cc,
+ tests/BD_Shape/generalizedaffineimage11.cc,
+ tests/BD_Shape/generalizedaffineimage12.cc,
+ tests/BD_Shape/generalizedaffineimage2.cc,
+ tests/BD_Shape/generalizedaffineimage3.cc,
+ tests/BD_Shape/generalizedaffineimage4.cc,
+ tests/BD_Shape/generalizedaffineimage5.cc,
+ tests/BD_Shape/generalizedaffineimage6.cc,
+ tests/BD_Shape/generalizedaffineimage7.cc,
+ tests/BD_Shape/generalizedaffineimage8.cc,
+ tests/BD_Shape/generalizedaffineimage9.cc,
+ tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+ tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+ tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+ tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+ tests/BD_Shape/intersection8.cc,
+ tests/BD_Shape/limitedCC76extrapolation1.cc,
+ tests/BD_Shape/limitedCC76extrapolation2.cc,
+ tests/BD_Shape/limitedCC76extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation1.cc,
+ tests/BD_Shape/limitedCH78extrapolation2.cc,
+ tests/BD_Shape/limitedCH78extrapolation3.cc,
+ tests/BD_Shape/limitedCH78extrapolation4.cc,
+ tests/BD_Shape/limitedCH78extrapolation5.cc,
+ tests/BD_Shape/limitedCH78extrapolation6.cc,
+ tests/BD_Shape/limitedCH78extrapolation7.cc,
+ tests/BD_Shape/limitedCH78extrapolation8.cc,
+ tests/BD_Shape/limitedCH78extrapolation9.cc,
+ tests/BD_Shape/limitedh79extrapolation1.cc,
+ tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+ tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+ tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+ tests/BD_Shape/polydifference2.cc,
+ tests/BD_Shape/polydifference3.cc,
+ tests/BD_Shape/polydifference4.cc,
+ tests/BD_Shape/polydifference5.cc,
+ tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+ tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+ tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+ tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+ tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+ tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+ tests/BD_Shape/writebdiffs2.cc
+ (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+ No longer mention `BDiffs'.
+
+2004-12-28 Tuesday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.21): Deal correctly with nested include
+ files.
+
+2004-12-28 Tuesday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BD_Shape.inlines.hh (altnum.2): Added the required template
+ function min_assign(T& x, const T& y).
+
+2004-12-28 Tuesday 16:51 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked_ext.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[24,3,16,25,18,21]): Changed lowlevel set_special to
+ return Result info.
+
+2004-12-28 Tuesday 16:28 Abramo Bagnara
+
+ * src/E_NIT.inlines.hh (altnum.3): Added missing rounding argument.
+
+2004-12-28 Tuesday 16:21 Abramo Bagnara
+
+ * src/checked.defs.hh (altnum.23): Documentation fix.
+
+2004-12-28 Tuesday 16:19 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[16,17]): Transformed helper function in static method.
+
+2004-12-28 Tuesday 16:18 Abramo Bagnara
+
+ * src/checked_ext.inlines.hh (altnum.2): Removed useless function.
+
+2004-12-28 Tuesday 16:17 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.24): Added policy dependance
+ to special values.
+
+2004-12-28 Tuesday 16:16 Abramo Bagnara
+
+ * configure.ac (altnum.18): Renamed gmp option value to mpz
+
+2004-12-28 Tuesday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/E_NIT.inlines.hh (altnum.2): Failed attempt to fix a problem
+ with E_NIT (the build is still broken).
+
+2004-12-28 Tuesday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (altnum.17): Configure the `tests/BD_Shape'
+ directory.
+
+2004-12-28 Tuesday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, ppl_test.hh, BD_Shape/Makefile.am,
+ BD_Shape/addconstraints1.cc, BD_Shape/addspacedims1.cc,
+ BD_Shape/addspacedims2.cc, BD_Shape/addspacedims3.cc,
+ BD_Shape/addspacedims4.cc, BD_Shape/addspacedims5.cc,
+ BD_Shape/addspacedims6.cc, BD_Shape/addspacedims7.cc,
+ BD_Shape/affineimage1.cc, BD_Shape/affineimage2.cc,
+ BD_Shape/affineimage3.cc, BD_Shape/affineimage4.cc,
+ BD_Shape/affineimage5.cc, BD_Shape/affineimage6.cc,
+ BD_Shape/affineimage7.cc, BD_Shape/affinepreimage1.cc,
+ BD_Shape/affinepreimage2.cc, BD_Shape/affinepreimage3.cc,
+ BD_Shape/affinepreimage4.cc, BD_Shape/ascii_dump_load1.cc,
+ BD_Shape/ascii_dump_load2.cc, BD_Shape/cc76extrapolation1.cc,
+ BD_Shape/cc76extrapolation2.cc, BD_Shape/cc76extrapolation3.cc,
+ BD_Shape/cc76extrapolation4.cc, BD_Shape/cc76extrapolation5.cc,
+ BD_Shape/cc76extrapolation6.cc, BD_Shape/cc76narrowing1.cc,
+ BD_Shape/cc76narrowing2.cc, BD_Shape/cc76narrowing3.cc,
+ BD_Shape/cc76narrowing4.cc, BD_Shape/cc76narrowing5.cc,
+ BD_Shape/ch78widening1.cc, BD_Shape/ch78widening2.cc,
+ BD_Shape/ch78widening3.cc, BD_Shape/ch78widening4.cc,
+ BD_Shape/ch78widening5.cc, BD_Shape/ch78widening6.cc,
+ BD_Shape/ch78widening7.cc, BD_Shape/ch78widening8.cc,
+ BD_Shape/concatenate1.cc, BD_Shape/concatenate2.cc,
+ BD_Shape/concatenate3.cc, BD_Shape/concatenate4.cc,
+ BD_Shape/concatenate5.cc, BD_Shape/constraints1.cc,
+ BD_Shape/constraints2.cc, BD_Shape/contains1.cc,
+ BD_Shape/contains2.cc, BD_Shape/contains3.cc, BD_Shape/empty1.cc,
+ BD_Shape/empty2.cc, BD_Shape/empty3.cc, BD_Shape/empty4.cc,
+ BD_Shape/equality1.cc, BD_Shape/exceptions1.cc,
+ BD_Shape/exceptions2.cc, BD_Shape/exceptions3.cc,
+ BD_Shape/generalizedaffineimage1.cc,
+ BD_Shape/generalizedaffineimage10.cc,
+ BD_Shape/generalizedaffineimage11.cc,
+ BD_Shape/generalizedaffineimage12.cc,
+ BD_Shape/generalizedaffineimage2.cc,
+ BD_Shape/generalizedaffineimage3.cc,
+ BD_Shape/generalizedaffineimage4.cc,
+ BD_Shape/generalizedaffineimage5.cc,
+ BD_Shape/generalizedaffineimage6.cc,
+ BD_Shape/generalizedaffineimage7.cc,
+ BD_Shape/generalizedaffineimage8.cc,
+ BD_Shape/generalizedaffineimage9.cc, BD_Shape/h79widening1.cc,
+ BD_Shape/intersection1.cc, BD_Shape/intersection2.cc,
+ BD_Shape/intersection3.cc, BD_Shape/intersection4.cc,
+ BD_Shape/intersection5.cc, BD_Shape/intersection6.cc,
+ BD_Shape/intersection7.cc, BD_Shape/intersection8.cc,
+ BD_Shape/limitedCC76extrapolation1.cc,
+ BD_Shape/limitedCC76extrapolation2.cc,
+ BD_Shape/limitedCC76extrapolation3.cc,
+ BD_Shape/limitedCH78extrapolation1.cc,
+ BD_Shape/limitedCH78extrapolation2.cc,
+ BD_Shape/limitedCH78extrapolation3.cc,
+ BD_Shape/limitedCH78extrapolation4.cc,
+ BD_Shape/limitedCH78extrapolation5.cc,
+ BD_Shape/limitedCH78extrapolation6.cc,
+ BD_Shape/limitedCH78extrapolation7.cc,
+ BD_Shape/limitedCH78extrapolation8.cc,
+ BD_Shape/limitedCH78extrapolation9.cc,
+ BD_Shape/limitedh79extrapolation1.cc, BD_Shape/mapspacedims1.cc,
+ BD_Shape/mapspacedims2.cc, BD_Shape/mapspacedims3.cc,
+ BD_Shape/mapspacedims4.cc, BD_Shape/maxspacedim.cc,
+ BD_Shape/polydifference1.cc, BD_Shape/polydifference2.cc,
+ BD_Shape/polydifference3.cc, BD_Shape/polydifference4.cc,
+ BD_Shape/polydifference5.cc, BD_Shape/polydifference6.cc,
+ BD_Shape/polyhull1.cc, BD_Shape/polyhull2.cc,
+ BD_Shape/polyhull3.cc, BD_Shape/polyhull4.cc,
+ BD_Shape/relations1.cc, BD_Shape/relations2.cc,
+ BD_Shape/relations3.cc, BD_Shape/relations4.cc,
+ BD_Shape/relations5.cc, BD_Shape/removespacedims1.cc,
+ BD_Shape/removespacedims2.cc, BD_Shape/removespacedims3.cc,
+ BD_Shape/timeelapse1.cc, BD_Shape/timeelapse2.cc,
+ BD_Shape/timeelapse3.cc, BD_Shape/timeelapse4.cc,
+ BD_Shape/timeelapse5.cc, BD_Shape/universe1.cc,
+ BD_Shape/writebdiffs1.cc, BD_Shape/writebdiffs2.cc
+ (altnum.[9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Tests for the BD_Shape class.
+
+2004-12-28 Tuesday 14:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.14): Fixed the indentation of a
+ few comments.
+
+2004-12-28 Tuesday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint_System.defs.hh (1.5), Generator_System.defs.hh
+ (1.6): Header file inclusions fixed.
+
+2004-12-28 Tuesday 13:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint_System.cc (1.4): Avoid recomputing the same
+ expression more than once.
+
+2004-12-28 Tuesday 11:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.19): Documented the new policy about swap method and
+ std::swap specialization.
+
+2004-12-28 Tuesday 11:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.46), Constraint.defs.hh (1.101),
+ Constraint.inlines.hh (1.58), Constraint_System.cc (1.3),
+ Constraint_System.defs.hh (1.4), Generator.cc (1.57),
+ Generator.defs.hh (1.99), Generator.inlines.hh (1.52),
+ Generator_System.defs.hh (1.5), Linear_Expression.defs.hh (1.7),
+ Polyhedron.inlines.hh (1.106), Polyhedron_nonpublic.cc (1.41),
+ Polyhedron_public.cc (1.47), Polyhedron_widenings.cc (1.39):
+ Classes Constraint and Generator now have comparison operators ==
+ and !=, checking for semantic equivalence. Class constraint has
+ publicly available methods is_tautological() and
+ is_inconsistent(), replacing the preovate methods
+ is_trivial_true() and is_trivial_false(). The swap methods of
+ classes Constraint, Generator, Linear_Expression,
+ Constraint_System and Generator_System are now publicly
+ available. Corrected a minor efficiency bug in
+ Polyhedron::shrink_bounding_box().
+
+2004-12-28 Tuesday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.136): Two important items added.
+
+2004-12-26 Sunday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.100): Useless explicit qualification
+ removed.
+
+2004-12-26 Sunday 18:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.99): FIXME added: we do not seem to
+ have strong reason to let Polyhedron be a friend of Constraint.
+
+2004-12-25 Saturday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, ChangeLog, NEWS, README, README.configure, STANDARDS,
+ TODO, config.guess, config.rpath, config.sub, configure.ac,
+ install-sh, ppl.lsm.in, ppl.spec.in, Watchdog/ChangeLog,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+ Watchdog/config.guess, Watchdog/config.sub,
+ Watchdog/configure.ac, Watchdog/install-sh,
+ Watchdog/pwl_filter_doxygen.sed, Watchdog/pwl_filter_install.sed,
+ Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+ Watchdog/pwl_header.top, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/dummy.cc, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/Makefile.am, doc/README, doc/README.doc, doc/definitions.dox,
+ doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/GNU/gnu_pl_check.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/SWI/swi_pl_check.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/pl_check.pl,
+ m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_is_iec_559.m4,
+ m4/ac_cxx_long_double_is_iec_559.m4, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+ src/Coefficient_traits_template.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.types.hh, src/Generator_System.defs.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh, src/Limits.hh,
+ src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+ src/Linear_System.cc, src/Linear_System.defs.hh,
+ src/Linear_System.inlines.hh, src/Makefile.am,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Saturation_Row.cc, src/Saturation_Row.inlines.hh,
+ src/Widening_Function.defs.hh, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_int.inlines.hh,
+ src/globals.defs.hh, src/initializer.hh, src/ppl_header.bottom,
+ src/ppl_header.middle, src/swapping_sort.icc, tests/BBox.cc,
+ tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/watchdog1.cc
+ (altnum.[5,2,7,3,3,3,7,4,1,3,16,4,2,2,2,5,2,2,4,3,3,4,1,1,1,1,1,6,10,4,1,5,3,2,1,7,3,3,8,5,7,2,9,1,5,2,3,3,5,4,1,3,5,7,5,8,1,4,3,8,2,2,3,4,8,2,2,3,1,1,1,15,16,2,2,6,5,7,4,2,5,8,4,2,3,4,4,4,20,8,8,4,5,5,8,11,8,3,3,2,2,5,22,15,23,9,1,1,1,3,3,3,2,2,2,2,2,2,2,2,2,2,1,2]):
+ Seventh merge from main trunk.
+
+2004-12-25 Saturday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.147), README (1.34), configure.ac (1.154),
+ src/Makefile.am (1.96): Updated for PPL 0.8.
+
+2004-12-24 Friday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_7-branch.1): Update version.
+
+2004-12-24 Friday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_7-branch.[1,1]): Mark
+ ChangeLog.
+
+2004-12-24 Friday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.20), Watchdog/ChangeLog (1.10): Updated.
+
+2004-12-24 Friday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.33), Watchdog/README (1.9): Updated.
+
+2004-12-24 Friday 14:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/user-browse.doxyconf-latex.in (1.24),
+ doc/user-print.doxyconf-latex.in (1.24),
+ doc/user.doxyconf-html.in (1.26), src/Coefficient.types.hh (1.5),
+ src/GMP_Integer.types.hh (1.6), src/Makefile.am (1.95),
+ src/Native_Integer.defs.hh (1.8), src/Native_Integer.types.hh
+ (1.6): On a second thought, the user shouldn't care much about
+ coefficient traits: the corresponding documentation now occurs in
+ the devref manual only.
+
+2004-12-24 Friday 12:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.13): Typo fixed.
+
+2004-12-24 Friday 12:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/user-browse.doxyconf-latex.in (1.23),
+ doc/user-print.doxyconf-latex.in (1.23),
+ doc/user.doxyconf-html.in (1.25), src/Checked_Number.defs.hh
+ (1.6), src/Coefficient.types.hh (1.4),
+ src/Coefficient_traits_template.hh (1.2),
+ src/GMP_Integer.types.hh (1.5), src/Linear_System.inlines.hh
+ (1.11), src/Makefile.am (1.94), src/Native_Integer.defs.hh (1.7),
+ src/Native_Integer.types.hh (1.5), src/checked.defs.hh (1.6),
+ src/globals.defs.hh (1.13): Minor improvements to the
+ documentation.
+
+2004-12-24 Friday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.38), ciao_clpq.pl (1.13),
+ ciao_clpq2.pl (1.9), ciao_pl_check.pl (1.9): Fixed for the case
+ where the source and the build directories coincide.
+
+2004-12-24 Friday 12:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/.cvsignore (1.10): Updated.
+
+2004-12-24 Friday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.17): No longer mention erased files.
+
+2004-12-24 Friday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.bottom (1.6): The preprocessor symbol
+ PPL_FLEXIBLE_ARRAY is no longer used.
+
+2004-12-24 Friday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: pwl_header.bottom (1.2), pwl_header.top (1.5):
+ Handling of NDEBUG improved.
+
+2004-12-24 Friday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/pwl_header.middle (1.3): We no longer support GCC
+ versions prior to 3.
+
+2004-12-24 Friday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.24): Require Autoconf 2.59.
+
+2004-12-24 Friday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/README (1.8): Version number bumped.
+
+2004-12-24 Friday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.16), pwl_filter_doxygen.sed (1.2),
+ pwl_filter_install.sed (1.2): Obsolete filters removed. Shared
+ library version info updated.
+
+2004-12-24 Friday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.24): Sentence fixed.
+
+2004-12-24 Friday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.rpath (1.3): Updated.
+
+2004-12-24 Friday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.146), README.configure (1.11), TODO (1.135): Minor
+ improvements.
+
+2004-12-24 Friday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.15): AIDA project credited.
+
+2004-12-24 Friday 10:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Checked_Number.inlines.hh (1.11), Native_Integer.inlines.hh
+ (1.8), checked.defs.hh (1.5): Added some \relates doxygen
+ commands.
+
+2004-12-24 Friday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.15), Watchdog/configure.ac (1.23),
+ interfaces/Prolog/YAP/Makefile.am (1.33): Enable the creation of
+ DLLs under Cygwin.
+
+2004-12-24 Friday 08:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.134): More checking of the documentation should be done.
+
+2004-12-24 Friday 08:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Generator_System.defs.hh (1.4), Linear_Expression.defs.hh
+ (1.6), Polyhedra_Powerset.defs.hh (1.12), Polyhedron.defs.hh
+ (1.262), Powerset.defs.hh (1.6): Several small improvements to
+ the documantation.
+
+2004-12-23 Thursday 22:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.145): Added quotes.
+
+2004-12-23 Thursday 22:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.144): Mentioned the new configuration option
+ --enable-coefficients.
+
+2004-12-23 Thursday 21:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README (1.32), src/Checked_Number.defs.hh (1.5),
+ src/Coefficient.types.hh (1.3), src/GMP_Integer.defs.hh (1.4),
+ src/GMP_Integer.types.hh (1.4), src/Makefile.am (1.93),
+ src/Native_Integer.defs.hh (1.6), src/Native_Integer.types.hh
+ (1.4): Drafted the doxygen documentation for Coefficient,
+ GMP_Integer, Checked_Number and Native_Integer, as well as
+ corresponding traits. Corrected a minor error in the README
+ file.
+
+2004-12-23 Thursday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.31), interfaces/Prolog/SWI/Makefile.am (1.43),
+ src/globals.defs.hh (1.12): Redundant inline declarations
+ removed.
+
+2004-12-23 Thursday 14:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.42): Let `plld' use the C++
+ compiler to perform linking.
+
+2004-12-23 Thursday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.23), doc/README (1.5), doc/README.doc (1.1): The
+ file doc/README has been renamed README.doc so as not to conflict
+ with the library's main README file.
+
+2004-12-23 Thursday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.22): Updated.
+
+2004-12-23 Thursday 11:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.153), src/Makefile.am (1.92): Allow the creation
+ of a PPL DLL under Cygwin.
+
+2004-12-23 Thursday 11:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.configure (1.10): Small improvement.
+
+2004-12-23 Thursday 10:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.9): Updated.
+
+2004-12-23 Thursday 10:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.14): Make sure
+ Polyhedra_Powerset<PH>::space_dimension() is defined before being
+ used.
+
+2004-12-23 Thursday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (1.5): Never include <config.h> from a header
+ file.
+
+2004-12-22 Wednesday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BBox.cc (1.7): Avoid repeating the inclusion of
+ "ppl_install.hh".
+
+2004-12-22 Wednesday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/initializer.hh (1.9): Multiple inclusion guard fixed.
+
+2004-12-22 Wednesday 19:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.8): Added a section on enabling the use of
+ alternative coefficient types.
+
+2004-12-22 Wednesday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.9), dummy.cc (1.1): Force using
+ the C++ compiler for linking.
+
+2004-12-22 Wednesday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.37), GNU/Makefile.am
+ (1.42), SICStus/Makefile.am (1.49), SWI/Makefile.am (1.41),
+ XSB/Makefile.am (1.30), YAP/Makefile.am (1.32): Do not use the
+ `-no-undefined' Libtool option to build the dynamically loadable
+ modules.
+
+2004-12-22 Wednesday 16:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.167): Changed "of" to "on" in:
+
+ Note that all the documented operators automatically
+ perform reductions on their arguments, when needed or
+ appropriate.
+
+2004-12-22 Wednesday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.133): The remaining item postponed to version 0.8 or
+ later.
+
+2004-12-22 Wednesday 16:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.132), doc/definitions.dox (1.166),
+ src/Determinate.defs.hh (1.51): Added a note about lazy
+ Omega-reduction in the documentation of the powerset domain.
+ Avoid underscore when providing the name of operators, unless
+ inside a <CODE> tag.
+
+2004-12-22 Wednesday 16:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Powerset.defs.hh (1.5): Added a reference to the description
+ of the powerset domain in definitions.dox. Documented the
+ methods begin() and end() returning a const_iterator.
+
+2004-12-22 Wednesday 14:39 Abramo Bagnara
+
+ * src/float.types.hh (1.4): Added IEC559 conformance conditional
+ for larger types.
+
+2004-12-22 Wednesday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.123): Better support for different
+ definitions of `size_t'.
+
+2004-12-22 Wednesday 14:19 Abramo Bagnara
+
+ * src/float.types.hh (1.3): Added support for iec559 types
+ detection.
+
+2004-12-22 Wednesday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Powerset.inlines.hh (1.6): Added a couple of inline
+ declarations.
+
+2004-12-22 Wednesday 13:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.152), demos/ppl_lcdd/Makefile.am (1.17): On
+ Darwin, the `md5sum' program does not support the `-t' option and
+ compilation is best done with the `-Wno-long-double' option.
+
+2004-12-22 Wednesday 13:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.131): Added an item saying that we should reconsider the
+ "with_token" predicates in the Prolog interface.
+
+2004-12-22 Wednesday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.16): Fixed the way `md5sum' is
+ invoked.
+
+2004-12-22 Wednesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.6): Updated with new authors and new size of the
+ archive.
+
+2004-12-22 Wednesday 11:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.151): Version number bumped.
+
+2004-12-22 Wednesday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.130): Updated.
+
+2004-12-22 Wednesday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.18): The requirement of keeping source lines short
+ has been softened.
+
+2004-12-22 Wednesday 10:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.129), interfaces/Prolog/Prolog_interface.dox (1.125),
+ interfaces/Prolog/exceptions.hh (1.14),
+ interfaces/Prolog/ppl_prolog.icc (1.150),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.77),
+ interfaces/Prolog/tests/pl_check.pl (1.6): In the Prolog
+ interface, exceptions now always thrown if input values (other
+ than lists) are invalid.
+
+ Tests for these new exceptions added to the pl_check.pl test
+ file.
+
+ Corrected bug in Prolog interface in the case when a list was
+ expected but a non-list was input.
+
+ The interface needs to be changed so that it throws an exception
+ for non-lists (instead of just Prolog failure) when a list is
+ expected; this job has been added to the TODO file.
+
+2004-12-22 Wednesday 00:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.240), timeelapse9.cc (1.1): Added a new
+ test, experimenting method
+ Polyhedra_Powerset::time_elapse_assign() as well as the new
+ (corrected) implementation of the equality test for class
+ Powerset.
+
+2004-12-22 Wednesday 00:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_Powerset.defs.hh (1.11),
+ Polyhedra_Powerset.inlines.hh (1.13): Added methods
+ intersection_assign() and time_elapse_assign(), exploiting the
+ generic function Powerset::pairwise_apply_assign(). A lot of
+ simple operators declared inline.
+
+2004-12-22 Wednesday 00:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Powerset.defs.hh (1.4), Powerset.inlines.hh (1.5): Member
+ omega_reduce() made (temporarily) publicly available. Added a
+ generic method pairwise_apply_assign() to apply a binary operator
+ to all pairs drawn from two powersets. A lot of simple operators
+ declared inline.
+
+2004-12-21 Tuesday 23:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.150), m4/ac_cxx_double_is_iec_559.m4 (1.1),
+ m4/ac_cxx_float_is_iec_559.m4 (1.1),
+ m4/ac_cxx_long_double_is_iec_559.m4 (1.1): New tests to check
+ whether C++ floats, doubles and long doubles comply to IEC 559.
+
+2004-12-21 Tuesday 23:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.149): Detect the sizes of float, double and long
+ double.
+
+2004-12-21 Tuesday 22:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.50), Determinate.inlines.hh (1.44):
+ Added a function object adapter to lift any "apply_and_assign"
+ function object defined on PH so as to obtain the corresponding
+ function object working on Determinate<PH>.
+
+2004-12-21 Tuesday 22:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Widening_Function.defs.hh (1.9): Unary constructor made
+ explicit.
+
+2004-12-21 Tuesday 22:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.17): std::swap_iter() ===> std::iter_swap().
+
+2004-12-21 Tuesday 08:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.165), src/Polyhedron.defs.hh (1.261):
+ Spelling and similar corrections to the documentation.
+
+2004-12-21 Tuesday 08:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_c.h.in (1.43): Spelling and similar corrections
+ to documentation.
+
+2004-12-20 Monday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_Row.cc (1.4): Unused, duplicated code removed.
+
+2004-12-20 Monday 21:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.10): The Comeau and Intel C++
+ compilers are actually right: if check_result() has internal
+ linkage (is declared static) then, according to section 14.6.4.2
+ of the C++ standard (Candidate Functions), it is not a candidate
+ function and thus it is not found by the name lookup mechanism.
+
+2004-12-20 Monday 14:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/polydifference9.cc (1.6): Comment corrected.
+
+2004-12-20 Monday 11:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.122): Previous change corrected again.
+
+2004-12-20 Monday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.121): Previous change completed.
+
+2004-12-20 Monday 10:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.120): Support definitions for `size_t'
+ different from `unsigned'.
+
+2004-12-20 Monday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.148): Detect the size of more C types.
+
+2004-12-20 Monday 07:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.10): Fixed an instance of LONG_MAX
+ that should instead be ULONG_MAX.
+
+2004-12-19 Sunday 12:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.22), configure.ac (1.147): Version
+ number bumped.
+
+2004-12-19 Sunday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.31): Updated.
+
+2004-12-19 Sunday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.143), Watchdog/NEWS (1.5): The tentative release date for
+ PPL 0.7 is December 24, 2004.
+
+2004-12-19 Sunday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/swapping_sort.icc (1.7): Make sure emacs recognizes this file
+ as C++.
+
+2004-12-19 Sunday 09:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.16), interfaces/C/ppl_c.cc (1.119),
+ interfaces/Prolog/track_allocation.hh (1.14),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.76),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.3),
+ interfaces/Prolog/SWI/swi_pl_check.pl (1.2),
+ interfaces/Prolog/tests/clpq.pl (1.4),
+ interfaces/Prolog/tests/clpq2.pl (1.4),
+ interfaces/Prolog/tests/pl_check.pl (1.5), src/Interval.defs.hh
+ (1.20), src/Interval.inlines.hh (1.16), src/swapping_sort.icc
+ (1.6), tests/bhz03widening2.cc (1.10), tests/bhz03widening3.cc
+ (1.9), tests/bhz03widening5.cc (1.7), tests/bhz03widening6.cc
+ (1.8), tests/expandspacedim1.cc (1.3), tests/foldspacedims1.cc
+ (1.2), tests/foldspacedims2.cc (1.2), tests/watchdog1.cc (1.21):
+ Avoid "baStudlyCaps" identifiers everywhere.
+
+2004-12-19 Sunday 09:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.9): Workaround for the Comeau
+ and Intel C++ compilers: they do not like the use of `static' in
+ a particular context.
+
+2004-12-19 Sunday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.19), Watchdog/ChangeLog (1.9): Updated.
+
+2004-12-19 Sunday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.26), config.sub (1.24), Watchdog/config.guess
+ (1.10), Watchdog/config.sub (1.9): Updated.
+
+2004-12-19 Sunday 07:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * install-sh (1.12), Watchdog/install-sh (1.9): Updated from
+ Automake 1.9.4.
+
+2004-12-18 Saturday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.29): Erase the *.xwam files
+ so as to force XSB to recompile.
+
+2004-12-18 Saturday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.142): One entry slightly improved.
+
+2004-12-18 Saturday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.149): No longer support unary
+ plus in linear expressions. Avoid long source lines.
+
+2004-12-17 Friday 18:59 Abramo Bagnara
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+ YAP/ppl_yap.cc (altnum.[6,7,7]): Added missing colons.
+
+2004-12-17 Friday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (altnum.15): Created tests/Polyhedron/Makefile.
+
+2004-12-17 Friday 18:20 Abramo Bagnara
+
+ * configure.ac, demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/Interval.inlines.hh,
+ src/Polyhedron_nonpublic.cc, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh
+ (altnum.[14,9,7,8,5,4,6,7,6,6,14,15,7,10,21,14,15,22,17,20]):
+ Added rounding support to checked functions.
+
+2004-12-17 Friday 18:18 Abramo Bagnara
+
+ * src/Makefile.am (altnum.19): Added new files.
+
+2004-12-17 Friday 18:17 Abramo Bagnara
+
+ * src/: Limits.hh, float.types.hh (altnum.[3,4]): More portable
+ code.
+
+2004-12-17 Friday 18:17 Abramo Bagnara
+
+ * src/: Float.defs.hh, Float.inlines.hh (altnum.[1,1]): Better
+ place for IEC559 format related functions.
+
+2004-12-17 Friday 18:16 Abramo Bagnara
+
+ * src/Numeric_Format.defs.hh (altnum.1): Initial empty
+ Numeric_Format definition.
+
+2004-12-17 Friday 18:15 Abramo Bagnara
+
+ * src/: Result.defs.hh, Result.inlines.hh (altnum.[1,1]): Better
+ place for Result.
+
+2004-12-17 Friday 18:15 Abramo Bagnara
+
+ * src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu.defs.hh
+ (altnum.[1,1,1]): FPU manipulation functions.
+
+2004-12-17 Friday 18:14 Abramo Bagnara
+
+ * src/: checked_ext.defs.hh, checked_ext.inlines.hh (altnum.[1,1]):
+ Better place for new extended numbers functions.
+
+2004-12-17 Friday 18:13 Abramo Bagnara
+
+ * src/: Rounding.defs.hh, Rounding.inlines.hh, Rounding.types.hh
+ (altnum.[1,1,1]): Rounding mode support.
+
+2004-12-17 Friday 18:11 Abramo Bagnara
+
+ * src/: compiler.hh, globals.defs.hh (altnum.[1,8]): Moved used
+ helper to better place.
+
+2004-12-17 Friday 17:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.18): Do not mention DB_Shape.cc.
+
+2004-12-17 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.17): Do not mention DB_Matrix.cc.
+
+2004-12-17 Friday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.16): Do not mention DB_Row.cc.
+
+2004-12-17 Friday 12:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.141), interfaces/Prolog/Prolog_interface.dox (1.124): As
+ it is not in standard Prolog, the unary "+" is not supported in
+ the Prolog interface.
+
+2004-12-16 Thursday 19:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.128): Dealt with one item of the list.
+
+2004-12-16 Thursday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.118): Fixed a problem whereby
+ ppl_set_error_handler() could have (depending on the compiler
+ employed) C++ linkage instead of C linkage.
+
+2004-12-16 Thursday 19:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.8): Define a dummy
+ set_GMP_memory_allocation_functions(), if the C++ compiler does
+ not support __attribute__((weak)).
+
+2004-12-16 Thursday 18:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.146), demos/ppl_lcdd/ppl_lcdd.cc (1.39): Do not
+ use C++-style comments in config.h.
+
+2004-12-16 Thursday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.61): Unused variable
+ `a_throw' removed.
+
+2004-12-16 Thursday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.145), src/Coefficient.types.hh (1.2),
+ src/ppl_header.middle (1.5): Problem with Comeau C/C++ and the
+ definition of `int64_t' solved in a better way. Always link with
+ the `libm' library.
+
+2004-12-16 Thursday 14:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: addgenerator1.cc (1.9), addgenerator2.cc (1.9): Tests
+ corrected: they were just calling generators(), yet relying on
+ the fact that a non-redundant description would have been
+ obtained.
+
+2004-12-16 Thursday 14:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.46): Added a preprocessing flag to
+ control whether we insist on returning sorted descriptions.
+ Currently the flag is unset and we only order the generator
+ systems of NNC polyhedra, if these are known to be in minimal
+ form.
+
+2004-12-16 Thursday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.13): Corrected a bug in method
+ add_rows(); the sortedness flag was not handled correctly when
+ the arguemnt was not sorted or had pending rows. This bug was
+ hidden by some unnecessary sorting done before calling the
+ method.
+
+2004-12-16 Thursday 12:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.12): We were relying on a
+ GCC bug concerning name-lookup.
+
+2004-12-16 Thursday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.middle (1.4): // In order for the definition of
+ `int64_t' to be seen by Comeau C/C++, // we must make sure
+ <stdint.h> is included before <sys/types.hh> is // (even
+ indirectly) included. #include <stdint.h>
+
+2004-12-16 Thursday 09:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.123): Some errors
+ corrected. The token C_unsigned now used to name a C unsigned
+ integer.
+
+2004-12-16 Thursday 08:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.140), interfaces/Prolog/Prolog_interface.dox (1.122),
+ interfaces/Prolog/ppl_prolog.icc (1.148),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.12),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.8),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.8),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.75),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.49),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.70),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.94),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.36),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.60),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.11),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.9),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.13),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.86),
+ interfaces/Prolog/tests/clpq.pl (1.3),
+ interfaces/Prolog/tests/clpq2.pl (1.3),
+ interfaces/Prolog/tests/pl_check.pl (1.4): In the Prolog
+ interface, the predicates
+ ppl_new_polyhedron_universe_from_space_dimension/3 and
+ ppl_new_polyhedron_empty_from_space_dimension/3 have been
+ replaced by a single predicate
+ ppl_new_polyhedron_from_space_dimension/4 where the (extra) third
+ argument indicates whether the polyhedron to be created should
+ be the universe or the empty polyhedron. NEWS has been
+ revised accordingly.
+
+2004-12-15 Wednesday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.9): Declare strtoll() and
+ strtoull() if they are not already declared.
+
+2004-12-15 Wednesday 23:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.12): Fixed the return value of
+ template <typename Policy, typename T> Result succ_float(T&).
+
+2004-12-15 Wednesday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.inlines.hh (1.10): Fixed
+ Linear_System::With_Saturation_Matrix_iterator::operator->().
+
+2004-12-15 Wednesday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Saturation_Row.cc (1.3), Saturation_Row.inlines.hh (1.2):
+ Depend on HAVE_DECL_FFS instead of HAS_FFS.
+
+2004-12-15 Wednesday 23:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.144): Checks for the availability of ffs, strtoll
+ and strtoull in C++.
+
+2004-12-15 Wednesday 23:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.defs.hh (1.11): Use
+ std::iterator_traits<Iter1>::attribute instead of
+ Iter1::attribute.
+
+2004-12-15 Wednesday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Limits.hh (1.3), checked_float.inlines.hh (1.11),
+ checked_int.inlines.hh (1.8): Moved the declaration of LLONG_MIN,
+ LLONG_MAX and ULLONG_MAX to Limits.hh. Refer to C99 standard
+ types uint*_t instead of u_int*_t. Include <climits> and
+ <cstdlib> instead of <limits.h> and <stdlib.h>.
+
+2004-12-15 Wednesday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.7): Define ULLONG_MAX, if it is not
+ already defined. Use ULLONG_MAX instead of ULONG_LONG_MAX, since
+ the latter is GCC-specific.
+
+2004-12-15 Wednesday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.91): Explicitly pass CPPFLAGS when invoking
+ CXXCPP explicitly.
+
+2004-12-15 Wednesday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.143): Added a check for the size of long long.
+ Fixed a couple of comments.
+
+2004-12-14 Tuesday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.139), interfaces/Prolog/Prolog_interface.dox (1.121),
+ interfaces/Prolog/ppl_prolog.icc (1.147),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.11),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.7),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.7),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.74),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.48),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.69),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.93),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.35),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.59),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.10),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.8),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.12),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.85),
+ interfaces/Prolog/tests/clpq.pl (1.2),
+ interfaces/Prolog/tests/clpq2.pl (1.2),
+ interfaces/Prolog/tests/pl_check.pl (1.3): In the Prolog
+ interface, the predicate ppl_new_polyhedron_from_dimension/3
+ has been renamed
+ ppl_new_polyhedron_universe_from_space_dimension/3 and the
+ predicate ppl_new_polyhedron_empty_from_dimension/3 has been
+ renamed ppl_new_polyhedron_empty_from_space_dimension/3. NEWS
+ updated to include this information.
+
+2004-12-14 Tuesday 11:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.120): Replace the date
+ type "Integer" used in the syntax specification by
+ "Dimension_Type", "Coefficient", "C_int", or "Token_Flag" as
+ appropriate. Some other small improvements and corrections also
+ done.
+
+2004-12-14 Tuesday 10:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.42): Reverted previous change, since
+ it was hiding a doxygen bug, which is the actual source of the
+ undefined reference.
+
+2004-12-13 Monday 15:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.41): Avoid autolink generation for
+ ppl_c.h.
+
+2004-12-13 Monday 15:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref.tex (1.16), user.tex (1.17): Also thank the new
+ COFIN project.
+
+2004-12-13 Monday 15:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron_nonpublic.cc (1.40), Polyhedron_public.cc
+ (1.45): Minor documentation changes; use const where appropriate.
+
+2004-12-13 Monday 08:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.127): The sorting routines have been completely
+ rewritten.CVS:
+ ----------------------------------------------------------------------
+
+2004-12-12 Sunday 18:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+ src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+ src/BD_Shape.types.hh, src/DB_Matrix.defs.hh,
+ src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+ src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+ src/E_NIT.defs.hh, src/E_NIT.inlines.hh, src/E_NIT.types.hh,
+ src/E_Rational.defs.hh, src/E_Rational.inlines.hh,
+ src/E_Rational.types.hh, src/Makefile.am,
+ src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+ src/Ptr_Iterator.types.hh, src/globals.defs.hh,
+ src/globals.inlines.hh
+ (altnum.[4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,7,4]):
+ Added a draft implementation of bounded differences.
+
+2004-12-12 Sunday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Polyhedron/Makefile.am (altnum.2): The `BBox' class
+ implementation is now contained in the convenience library
+ `libppl_tests'.
+
+2004-12-12 Sunday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, tests/.cvsignore, tests/CbecomesNNC1.cc,
+ tests/Makefile.am, tests/NNCbecomesC1.cc, tests/NNCminimize1.cc,
+ tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+ tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+ tests/NNCminimize6.cc, tests/README, tests/addconstraint1.cc,
+ tests/addconstraint2.cc, tests/addconstraint3.cc,
+ tests/addconstraints1.cc, tests/addconstraints10.cc,
+ tests/addconstraints11.cc, tests/addconstraints12.cc,
+ tests/addconstraints13.cc, tests/addconstraints2.cc,
+ tests/addconstraints3.cc, tests/addconstraints4.cc,
+ tests/addconstraints5.cc, tests/addconstraints6.cc,
+ tests/addconstraints7.cc, tests/addconstraints8.cc,
+ tests/addconstraints9.cc, tests/addgenerator1.cc,
+ tests/addgenerator2.cc, tests/addgenerator3.cc,
+ tests/addgenerator4.cc, tests/addgenerator5.cc,
+ tests/addgenerators1.cc, tests/addgenerators10.cc,
+ tests/addgenerators11.cc, tests/addgenerators12.cc,
+ tests/addgenerators13.cc, tests/addgenerators2.cc,
+ tests/addgenerators3.cc, tests/addgenerators4.cc,
+ tests/addgenerators5.cc, tests/addgenerators6.cc,
+ tests/addgenerators7.cc, tests/addgenerators8.cc,
+ tests/addgenerators9.cc, tests/addspacedims1.cc,
+ tests/addspacedims10.cc, tests/addspacedims11.cc,
+ tests/addspacedims12.cc, tests/addspacedims13.cc,
+ tests/addspacedims2.cc, tests/addspacedims3.cc,
+ tests/addspacedims4.cc, tests/addspacedims5.cc,
+ tests/addspacedims6.cc, tests/addspacedims7.cc,
+ tests/addspacedims8.cc, tests/addspacedims9.cc,
+ tests/affineimage1.cc, tests/affineimage2.cc,
+ tests/affineimage3.cc, tests/affineimage4.cc,
+ tests/affineimage5.cc, tests/affineimage6.cc,
+ tests/affineimage7.cc, tests/affineimage8.cc,
+ tests/affineimage9.cc, tests/affinepreimage1.cc,
+ tests/affinepreimage10.cc, tests/affinepreimage2.cc,
+ tests/affinepreimage3.cc, tests/affinepreimage4.cc,
+ tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+ tests/affinepreimage7.cc, tests/affinepreimage8.cc,
+ tests/affinepreimage9.cc, tests/affinetrans.cc, tests/append1.cc,
+ tests/append2.cc, tests/ascii_dump_load1.cc,
+ tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+ tests/ascii_dump_load4.cc, tests/ascii_dump_load5.cc,
+ tests/ascii_dump_load6.cc, tests/ascii_dump_load7.cc,
+ tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+ tests/bhrz03widening1.cc, tests/bhrz03widening10.cc,
+ tests/bhrz03widening11.cc, tests/bhrz03widening12.cc,
+ tests/bhrz03widening13.cc, tests/bhrz03widening14.cc,
+ tests/bhrz03widening15.cc, tests/bhrz03widening16.cc,
+ tests/bhrz03widening17.cc, tests/bhrz03widening18.cc,
+ tests/bhrz03widening19.cc, tests/bhrz03widening2.cc,
+ tests/bhrz03widening3.cc, tests/bhrz03widening4.cc,
+ tests/bhrz03widening5.cc, tests/bhrz03widening6.cc,
+ tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+ tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+ tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+ tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+ tests/bhz03widening6.cc, tests/bounded1.cc,
+ tests/boundedh79extrapolation1.cc, tests/boundingbox1.cc,
+ tests/boundingbox2.cc, tests/boundingbox3.cc,
+ tests/boundingbox4.cc, tests/boundingbox5.cc, tests/bounds1.cc,
+ tests/bounds2.cc, tests/concatenate1.cc, tests/concatenate2.cc,
+ tests/concatenate3.cc, tests/concatenate4.cc,
+ tests/concatenate5.cc, tests/concatenate6.cc,
+ tests/constraints1.cc, tests/constraints2.cc,
+ tests/constraints3.cc, tests/constraints4.cc, tests/contains1.cc,
+ tests/contains2.cc, tests/contains3.cc, tests/contains4.cc,
+ tests/contains5.cc, tests/disjoint1.cc, tests/disjoint2.cc,
+ tests/disjoint3.cc, tests/dualhypercubes.cc, tests/empty1.cc,
+ tests/equals1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+ tests/exceptions3.cc, tests/expandspacedim1.cc,
+ tests/expandspacedim2.cc, tests/foldspacedims1.cc,
+ tests/foldspacedims2.cc, tests/generalizedaffineimage1.cc,
+ tests/generalizedaffineimage10.cc,
+ tests/generalizedaffineimage11.cc,
+ tests/generalizedaffineimage12.cc,
+ tests/generalizedaffineimage2.cc,
+ tests/generalizedaffineimage3.cc,
+ tests/generalizedaffineimage4.cc,
+ tests/generalizedaffineimage5.cc,
+ tests/generalizedaffineimage6.cc,
+ tests/generalizedaffineimage7.cc,
+ tests/generalizedaffineimage8.cc,
+ tests/generalizedaffineimage9.cc, tests/generators1.cc,
+ tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+ tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+ tests/h79widening1.cc, tests/h79widening2.cc,
+ tests/h79widening3.cc, tests/h79widening4.cc,
+ tests/h79widening5.cc, tests/h79widening6.cc,
+ tests/h79widening7.cc, tests/h79widening8.cc,
+ tests/intersection1.cc, tests/intersection10.cc,
+ tests/intersection11.cc, tests/intersection2.cc,
+ tests/intersection3.cc, tests/intersection4.cc,
+ tests/intersection5.cc, tests/intersection6.cc,
+ tests/intersection7.cc, tests/intersection8.cc,
+ tests/intersection9.cc, tests/limitedbhrz03extrapolation1.cc,
+ tests/limitedh79extrapolation1.cc,
+ tests/limitedh79extrapolation2.cc,
+ tests/limitedh79extrapolation3.cc,
+ tests/limitedh79extrapolation4.cc, tests/linearpartition1.cc,
+ tests/linearpartition2.cc, tests/linearpartition3.cc,
+ tests/linearpartition4.cc, tests/linexpression1.cc,
+ tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+ tests/mapspacedims3.cc, tests/mapspacedims4.cc,
+ tests/max_min1.cc, tests/max_min2.cc, tests/maxspacedim1.cc,
+ tests/mc91.cc, tests/membytes1.cc, tests/membytes2.cc,
+ tests/memory1.cc, tests/minconstraints1.cc,
+ tests/minconstraints2.cc, tests/minconstraints3.cc,
+ tests/minconstraints4.cc, tests/mingenerators1.cc,
+ tests/mingenerators2.cc, tests/mingenerators3.cc,
+ tests/onepoint.cc, tests/permute.cc, tests/polydifference1.cc,
+ tests/polydifference2.cc, tests/polydifference3.cc,
+ tests/polydifference4.cc, tests/polydifference5.cc,
+ tests/polydifference6.cc, tests/polydifference7.cc,
+ tests/polydifference8.cc, tests/polydifference9.cc,
+ tests/polyhull1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+ tests/polyhull2.cc, tests/polyhull3.cc, tests/polyhull4.cc,
+ tests/polyhull5.cc, tests/polyhull6.cc, tests/polyhull7.cc,
+ tests/polyhull8.cc, tests/polyhull9.cc, tests/randphull1.cc,
+ tests/randphull2.cc, tests/relations1.cc, tests/relations10.cc,
+ tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+ tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+ tests/relations17.cc, tests/relations18.cc, tests/relations19.cc,
+ tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+ tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+ tests/relations8.cc, tests/relations9.cc,
+ tests/removespacedims1.cc, tests/removespacedims10.cc,
+ tests/removespacedims2.cc, tests/removespacedims3.cc,
+ tests/removespacedims4.cc, tests/removespacedims5.cc,
+ tests/removespacedims6.cc, tests/removespacedims7.cc,
+ tests/removespacedims8.cc, tests/removespacedims9.cc,
+ tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse2.cc,
+ tests/timeelapse3.cc, tests/timeelapse4.cc, tests/timeelapse5.cc,
+ tests/timeelapse6.cc, tests/timeelapse7.cc, tests/timeelapse8.cc,
+ tests/topclosed1.cc, tests/topclosed2.cc, tests/topclosed3.cc,
+ tests/topclosure1.cc, tests/topclosure2.cc, tests/topclosure3.cc,
+ tests/topclosure4.cc, tests/universe1.cc, tests/universe2.cc,
+ tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+ tests/universe6.cc, tests/universe7.cc,
+ tests/valgrind_suppressions, tests/watchdog1.cc,
+ tests/writeconsys1.cc, tests/writegensys1.cc,
+ tests/writegensys2.cc, tests/writegensys3.cc,
+ tests/writepolyhedron1.cc, tests/writepolyhedron2.cc,
+ tests/writepolyhedron3.cc, tests/writerelation1.cc,
+ tests/writevariable1.cc, tests/Polyhedron/.cvsignore,
+ tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+ tests/Polyhedron/NNCbecomesC1.cc,
+ tests/Polyhedron/NNCminimize1.cc,
+ tests/Polyhedron/NNCminimize2.cc,
+ tests/Polyhedron/NNCminimize3.cc,
+ tests/Polyhedron/NNCminimize4.cc,
+ tests/Polyhedron/NNCminimize5.cc,
+ tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+ tests/Polyhedron/addconstraint1.cc,
+ tests/Polyhedron/addconstraint2.cc,
+ tests/Polyhedron/addconstraint3.cc,
+ tests/Polyhedron/addconstraints1.cc,
+ tests/Polyhedron/addconstraints10.cc,
+ tests/Polyhedron/addconstraints11.cc,
+ tests/Polyhedron/addconstraints12.cc,
+ tests/Polyhedron/addconstraints13.cc,
+ tests/Polyhedron/addconstraints2.cc,
+ tests/Polyhedron/addconstraints3.cc,
+ tests/Polyhedron/addconstraints4.cc,
+ tests/Polyhedron/addconstraints5.cc,
+ tests/Polyhedron/addconstraints6.cc,
+ tests/Polyhedron/addconstraints7.cc,
+ tests/Polyhedron/addconstraints8.cc,
+ tests/Polyhedron/addconstraints9.cc,
+ tests/Polyhedron/addgenerator1.cc,
+ tests/Polyhedron/addgenerator2.cc,
+ tests/Polyhedron/addgenerator3.cc,
+ tests/Polyhedron/addgenerator4.cc,
+ tests/Polyhedron/addgenerator5.cc,
+ tests/Polyhedron/addgenerators1.cc,
+ tests/Polyhedron/addgenerators10.cc,
+ tests/Polyhedron/addgenerators11.cc,
+ tests/Polyhedron/addgenerators12.cc,
+ tests/Polyhedron/addgenerators13.cc,
+ tests/Polyhedron/addgenerators2.cc,
+ tests/Polyhedron/addgenerators3.cc,
+ tests/Polyhedron/addgenerators4.cc,
+ tests/Polyhedron/addgenerators5.cc,
+ tests/Polyhedron/addgenerators6.cc,
+ tests/Polyhedron/addgenerators7.cc,
+ tests/Polyhedron/addgenerators8.cc,
+ tests/Polyhedron/addgenerators9.cc,
+ tests/Polyhedron/addspacedims1.cc,
+ tests/Polyhedron/addspacedims10.cc,
+ tests/Polyhedron/addspacedims11.cc,
+ tests/Polyhedron/addspacedims12.cc,
+ tests/Polyhedron/addspacedims13.cc,
+ tests/Polyhedron/addspacedims2.cc,
+ tests/Polyhedron/addspacedims3.cc,
+ tests/Polyhedron/addspacedims4.cc,
+ tests/Polyhedron/addspacedims5.cc,
+ tests/Polyhedron/addspacedims6.cc,
+ tests/Polyhedron/addspacedims7.cc,
+ tests/Polyhedron/addspacedims8.cc,
+ tests/Polyhedron/addspacedims9.cc,
+ tests/Polyhedron/affineimage1.cc,
+ tests/Polyhedron/affineimage2.cc,
+ tests/Polyhedron/affineimage3.cc,
+ tests/Polyhedron/affineimage4.cc,
+ tests/Polyhedron/affineimage5.cc,
+ tests/Polyhedron/affineimage6.cc,
+ tests/Polyhedron/affineimage7.cc,
+ tests/Polyhedron/affineimage8.cc,
+ tests/Polyhedron/affineimage9.cc,
+ tests/Polyhedron/affinepreimage1.cc,
+ tests/Polyhedron/affinepreimage10.cc,
+ tests/Polyhedron/affinepreimage2.cc,
+ tests/Polyhedron/affinepreimage3.cc,
+ tests/Polyhedron/affinepreimage4.cc,
+ tests/Polyhedron/affinepreimage5.cc,
+ tests/Polyhedron/affinepreimage6.cc,
+ tests/Polyhedron/affinepreimage7.cc,
+ tests/Polyhedron/affinepreimage8.cc,
+ tests/Polyhedron/affinepreimage9.cc,
+ tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+ tests/Polyhedron/append2.cc,
+ tests/Polyhedron/ascii_dump_load1.cc,
+ tests/Polyhedron/ascii_dump_load2.cc,
+ tests/Polyhedron/ascii_dump_load3.cc,
+ tests/Polyhedron/ascii_dump_load4.cc,
+ tests/Polyhedron/ascii_dump_load5.cc,
+ tests/Polyhedron/ascii_dump_load6.cc,
+ tests/Polyhedron/ascii_dump_load7.cc,
+ tests/Polyhedron/bgp99extrapolation1.cc,
+ tests/Polyhedron/bgp99extrapolation2.cc,
+ tests/Polyhedron/bhrz03widening1.cc,
+ tests/Polyhedron/bhrz03widening10.cc,
+ tests/Polyhedron/bhrz03widening11.cc,
+ tests/Polyhedron/bhrz03widening12.cc,
+ tests/Polyhedron/bhrz03widening13.cc,
+ tests/Polyhedron/bhrz03widening14.cc,
+ tests/Polyhedron/bhrz03widening15.cc,
+ tests/Polyhedron/bhrz03widening16.cc,
+ tests/Polyhedron/bhrz03widening17.cc,
+ tests/Polyhedron/bhrz03widening18.cc,
+ tests/Polyhedron/bhrz03widening19.cc,
+ tests/Polyhedron/bhrz03widening2.cc,
+ tests/Polyhedron/bhrz03widening3.cc,
+ tests/Polyhedron/bhrz03widening4.cc,
+ tests/Polyhedron/bhrz03widening5.cc,
+ tests/Polyhedron/bhrz03widening6.cc,
+ tests/Polyhedron/bhrz03widening7.cc,
+ tests/Polyhedron/bhrz03widening8.cc,
+ tests/Polyhedron/bhrz03widening9.cc,
+ tests/Polyhedron/bhz03widening1.cc,
+ tests/Polyhedron/bhz03widening2.cc,
+ tests/Polyhedron/bhz03widening3.cc,
+ tests/Polyhedron/bhz03widening4.cc,
+ tests/Polyhedron/bhz03widening5.cc,
+ tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+ tests/Polyhedron/boundedh79extrapolation1.cc,
+ tests/Polyhedron/boundingbox1.cc,
+ tests/Polyhedron/boundingbox2.cc,
+ tests/Polyhedron/boundingbox3.cc,
+ tests/Polyhedron/boundingbox4.cc,
+ tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+ tests/Polyhedron/bounds2.cc, tests/Polyhedron/concatenate1.cc,
+ tests/Polyhedron/concatenate2.cc,
+ tests/Polyhedron/concatenate3.cc,
+ tests/Polyhedron/concatenate4.cc,
+ tests/Polyhedron/concatenate5.cc,
+ tests/Polyhedron/concatenate6.cc,
+ tests/Polyhedron/constraints1.cc,
+ tests/Polyhedron/constraints2.cc,
+ tests/Polyhedron/constraints3.cc,
+ tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+ tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+ tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+ tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+ tests/Polyhedron/disjoint3.cc,
+ tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+ tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+ tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+ tests/Polyhedron/expandspacedim1.cc,
+ tests/Polyhedron/expandspacedim2.cc,
+ tests/Polyhedron/foldspacedims1.cc,
+ tests/Polyhedron/foldspacedims2.cc,
+ tests/Polyhedron/generalizedaffineimage1.cc,
+ tests/Polyhedron/generalizedaffineimage10.cc,
+ tests/Polyhedron/generalizedaffineimage11.cc,
+ tests/Polyhedron/generalizedaffineimage12.cc,
+ tests/Polyhedron/generalizedaffineimage2.cc,
+ tests/Polyhedron/generalizedaffineimage3.cc,
+ tests/Polyhedron/generalizedaffineimage4.cc,
+ tests/Polyhedron/generalizedaffineimage5.cc,
+ tests/Polyhedron/generalizedaffineimage6.cc,
+ tests/Polyhedron/generalizedaffineimage7.cc,
+ tests/Polyhedron/generalizedaffineimage8.cc,
+ tests/Polyhedron/generalizedaffineimage9.cc,
+ tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+ tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+ tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+ tests/Polyhedron/geomcovers1.cc,
+ tests/Polyhedron/h79widening1.cc,
+ tests/Polyhedron/h79widening2.cc,
+ tests/Polyhedron/h79widening3.cc,
+ tests/Polyhedron/h79widening4.cc,
+ tests/Polyhedron/h79widening5.cc,
+ tests/Polyhedron/h79widening6.cc,
+ tests/Polyhedron/h79widening7.cc,
+ tests/Polyhedron/h79widening8.cc,
+ tests/Polyhedron/intersection1.cc,
+ tests/Polyhedron/intersection10.cc,
+ tests/Polyhedron/intersection11.cc,
+ tests/Polyhedron/intersection2.cc,
+ tests/Polyhedron/intersection3.cc,
+ tests/Polyhedron/intersection4.cc,
+ tests/Polyhedron/intersection5.cc,
+ tests/Polyhedron/intersection6.cc,
+ tests/Polyhedron/intersection7.cc,
+ tests/Polyhedron/intersection8.cc,
+ tests/Polyhedron/intersection9.cc,
+ tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation1.cc,
+ tests/Polyhedron/limitedh79extrapolation2.cc,
+ tests/Polyhedron/limitedh79extrapolation3.cc,
+ tests/Polyhedron/limitedh79extrapolation4.cc,
+ tests/Polyhedron/linearpartition1.cc,
+ tests/Polyhedron/linearpartition2.cc,
+ tests/Polyhedron/linearpartition3.cc,
+ tests/Polyhedron/linearpartition4.cc,
+ tests/Polyhedron/linexpression1.cc,
+ tests/Polyhedron/mapspacedims1.cc,
+ tests/Polyhedron/mapspacedims2.cc,
+ tests/Polyhedron/mapspacedims3.cc,
+ tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+ tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+ tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+ tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+ tests/Polyhedron/minconstraints1.cc,
+ tests/Polyhedron/minconstraints2.cc,
+ tests/Polyhedron/minconstraints3.cc,
+ tests/Polyhedron/minconstraints4.cc,
+ tests/Polyhedron/mingenerators1.cc,
+ tests/Polyhedron/mingenerators2.cc,
+ tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+ tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+ tests/Polyhedron/polydifference2.cc,
+ tests/Polyhedron/polydifference3.cc,
+ tests/Polyhedron/polydifference4.cc,
+ tests/Polyhedron/polydifference5.cc,
+ tests/Polyhedron/polydifference6.cc,
+ tests/Polyhedron/polydifference7.cc,
+ tests/Polyhedron/polydifference8.cc,
+ tests/Polyhedron/polydifference9.cc,
+ tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+ tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+ tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+ tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+ tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+ tests/Polyhedron/polyhull9.cc, tests/Polyhedron/randphull1.cc,
+ tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+ tests/Polyhedron/relations10.cc, tests/Polyhedron/relations11.cc,
+ tests/Polyhedron/relations12.cc, tests/Polyhedron/relations13.cc,
+ tests/Polyhedron/relations14.cc, tests/Polyhedron/relations15.cc,
+ tests/Polyhedron/relations16.cc, tests/Polyhedron/relations17.cc,
+ tests/Polyhedron/relations18.cc, tests/Polyhedron/relations19.cc,
+ tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+ tests/Polyhedron/relations4.cc, tests/Polyhedron/relations5.cc,
+ tests/Polyhedron/relations6.cc, tests/Polyhedron/relations7.cc,
+ tests/Polyhedron/relations8.cc, tests/Polyhedron/relations9.cc,
+ tests/Polyhedron/removespacedims1.cc,
+ tests/Polyhedron/removespacedims10.cc,
+ tests/Polyhedron/removespacedims2.cc,
+ tests/Polyhedron/removespacedims3.cc,
+ tests/Polyhedron/removespacedims4.cc,
+ tests/Polyhedron/removespacedims5.cc,
+ tests/Polyhedron/removespacedims6.cc,
+ tests/Polyhedron/removespacedims7.cc,
+ tests/Polyhedron/removespacedims8.cc,
+ tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+ tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+ tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+ tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+ tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+ tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosed2.cc,
+ tests/Polyhedron/topclosed3.cc, tests/Polyhedron/topclosure1.cc,
+ tests/Polyhedron/topclosure2.cc, tests/Polyhedron/topclosure3.cc,
+ tests/Polyhedron/topclosure4.cc, tests/Polyhedron/universe1.cc,
+ tests/Polyhedron/universe2.cc, tests/Polyhedron/universe3.cc,
+ tests/Polyhedron/universe4.cc, tests/Polyhedron/universe5.cc,
+ tests/Polyhedron/universe6.cc, tests/Polyhedron/universe7.cc,
+ tests/Polyhedron/valgrind_suppressions,
+ tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+ tests/Polyhedron/writegensys1.cc,
+ tests/Polyhedron/writegensys2.cc,
+ tests/Polyhedron/writegensys3.cc,
+ tests/Polyhedron/writepolyhedron1.cc,
+ tests/Polyhedron/writepolyhedron2.cc,
+ tests/Polyhedron/writepolyhedron3.cc,
+ tests/Polyhedron/writerelation1.cc,
+ tests/Polyhedron/writevariable1.cc
+ (altnum.[13,2,2,8,2,2,2,2,2,3,2,2,3,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,3,3,2,2,4,2,2,2,2,2,2,2,2,2,2,3,4,3,2,2,2,3,3,3,3,3,2,3,1,1,2,1,1,1,2,1,3,2,1,1,1,2,1,1,2,1,1,2,2,2,1,1,1,2,1,1,2,5,4,2,1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,3,5,4,5,5,4,4,2,2,6,4,3,3,2,2,1,3,2,2,2,1,1,2,2,2,2,1,2,2,2,2,1,2,2,3,2,2,3,4,5,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,3,3,2,3,2,2,3,1,1,1,2,1,2,1,2,1,1,1,2,1,2,1,2,1,1,1,2,2,2,3,2,3,3,3,3,2,3,2,2,2,2,2,3,2,3,2,1,2,2,2,2,2,2,2,1,2,3,2,2,1,1,1,1,3,4,2,2,2,2,1,1,1,1,2,1,1 [...]
+ Tests for the polyhedra classes are now in `tests/Polyhedron'.
+
+2004-12-12 Sunday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.inlines.hh (1.7): Added the implementation of
+ constructors from native floating-point types.
+
+2004-12-11 Saturday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, README, STANDARDS, TODO, configure.ac,
+ Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+ Watchdog/Makefile.am, Watchdog/Watchdog.defs.hh,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/allzero.ine,
+ demos/ppl_lcdd/examples/ccc4.ext,
+ demos/ppl_lcdd/examples/ccp4.ext,
+ demos/ppl_lcdd/examples/cp4.ext, demos/ppl_lcdd/examples/cp4.ine,
+ demos/ppl_lcdd/examples/cp5.ine, demos/ppl_lcdd/examples/cp6.ine,
+ demos/ppl_lcdd/examples/cp7.ext,
+ demos/ppl_lcdd/examples/cross10.ine,
+ demos/ppl_lcdd/examples/cross12.ine,
+ demos/ppl_lcdd/examples/cross4.ine,
+ demos/ppl_lcdd/examples/cross6.ine,
+ demos/ppl_lcdd/examples/cross8.ine,
+ demos/ppl_lcdd/examples/cube.ext,
+ demos/ppl_lcdd/examples/cubetop.ine,
+ demos/ppl_lcdd/examples/cubocta.ine,
+ demos/ppl_lcdd/examples/cut16_11.ext,
+ demos/ppl_lcdd/examples/cut32_16.ext,
+ demos/ppl_lcdd/examples/cyc.ine,
+ demos/ppl_lcdd/examples/cyclic16-10.ext,
+ demos/ppl_lcdd/examples/cyclic25_13.ext,
+ demos/ppl_lcdd/examples/ex1.ine,
+ demos/ppl_lcdd/examples/grcubocta.ine,
+ demos/ppl_lcdd/examples/in0.ine, demos/ppl_lcdd/examples/in1.ine,
+ demos/ppl_lcdd/examples/in2.ine, demos/ppl_lcdd/examples/in3.ine,
+ demos/ppl_lcdd/examples/in4.ine, demos/ppl_lcdd/examples/in5.ine,
+ demos/ppl_lcdd/examples/in6.ine, demos/ppl_lcdd/examples/in7.ine,
+ demos/ppl_lcdd/examples/integralpoints.ine,
+ demos/ppl_lcdd/examples/irbox20-4.ext,
+ demos/ppl_lcdd/examples/irbox200-4.ext,
+ demos/ppl_lcdd/examples/kkd18_4.ine,
+ demos/ppl_lcdd/examples/kkd27_5.ine,
+ demos/ppl_lcdd/examples/kkd38_6.ine,
+ demos/ppl_lcdd/examples/kq20_11_m.ine,
+ demos/ppl_lcdd/examples/metric40_11.ine,
+ demos/ppl_lcdd/examples/metric80_16.ine,
+ demos/ppl_lcdd/examples/mit.ine,
+ demos/ppl_lcdd/examples/mit288-281.ine,
+ demos/ppl_lcdd/examples/mit31-20.ine,
+ demos/ppl_lcdd/examples/mit41-16.ine,
+ demos/ppl_lcdd/examples/mit708-9.ine,
+ demos/ppl_lcdd/examples/mit71-61.ine,
+ demos/ppl_lcdd/examples/mit90-86.ine,
+ demos/ppl_lcdd/examples/mp5.ext, demos/ppl_lcdd/examples/mp5.ine,
+ demos/ppl_lcdd/examples/mp5a.ine,
+ demos/ppl_lcdd/examples/mp6.ine,
+ demos/ppl_lcdd/examples/origin.ine,
+ demos/ppl_lcdd/examples/project2res.ine,
+ demos/ppl_lcdd/examples/rcubocta.ine,
+ demos/ppl_lcdd/examples/reg24-5.ext,
+ demos/ppl_lcdd/examples/reg24-5.ine,
+ demos/ppl_lcdd/examples/sampleh1.ine,
+ demos/ppl_lcdd/examples/sampleh3.ine,
+ demos/ppl_lcdd/examples/sampleh4.ine,
+ demos/ppl_lcdd/examples/sampleh6.ine,
+ demos/ppl_lcdd/examples/sampleh7.ine,
+ demos/ppl_lcdd/examples/sampleh8.ine,
+ demos/ppl_lcdd/examples/samplev1.ext,
+ demos/ppl_lcdd/examples/samplev3.ext,
+ demos/ppl_lcdd/examples/trunc10.ine,
+ demos/ppl_lcdd/examples/trunc7.ine,
+ demos/ppl_lcdd/examples/tsp5.ext,
+ demos/ppl_lcdd/examples/tsp5.ine, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+ demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+ demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+ demos/ppl_lpsol/ppl_lpsol.c, doc/Makefile.am,
+ doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/fdl.tex, doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/exceptions.hh,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sicstus_cfli.ic,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/tests/pl_check.pl, src/AskTell.defs.hh,
+ src/AskTell.inlines.hh, src/AskTell.types.hh,
+ src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+ src/Ask_Tell.types.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh, src/BoundingBox.cc,
+ src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+ src/BoundingBox.types.hh, src/Bounding_Box.cc,
+ src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+ src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.inlines.hh, src/Coefficient.cc,
+ src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+ src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+ src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+ src/ConSys.types.hh, src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Constraint_System.cc,
+ src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+ src/Constraint_System.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GMP_Integer.types.hh,
+ src/GenSys.cc, src/GenSys.defs.hh, src/GenSys.inlines.hh,
+ src/GenSys.types.hh, src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator_System.cc,
+ src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+ src/Generator_System.types.hh, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/Integer.cc, src/Integer.defs.hh,
+ src/Integer.inlines.hh, src/Integer.types.hh,
+ src/Integer_macros.hh, src/Integer_traits_template.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/LinExpression.cc, src/LinExpression.defs.hh,
+ src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+ src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+ src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_System.cc,
+ src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+ src/Makefile.am, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/Row.inlines.hh, src/SatMatrix.cc,
+ src/SatMatrix.defs.hh, src/SatMatrix.inlines.hh,
+ src/SatMatrix.types.hh, src/SatRow.cc, src/SatRow.defs.hh,
+ src/SatRow.inlines.hh, src/SatRow.types.hh,
+ src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+ src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+ src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+ src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+ src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+ src/algorithms.hh, src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/conversion.cc, src/globals.cc,
+ src/globals.defs.hh, src/globals.inlines.hh, src/minimize.cc,
+ src/simplify.cc, src/swapping_sort.icc, tests/BBox.cc,
+ tests/BBox.hh, tests/Makefile.am, tests/NNCminimize1.cc,
+ tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+ tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+ tests/NNCminimize6.cc, tests/addconstraint1.cc,
+ tests/addconstraints1.cc, tests/addconstraints10.cc,
+ tests/addconstraints11.cc, tests/addconstraints12.cc,
+ tests/addconstraints13.cc, tests/addconstraints2.cc,
+ tests/addconstraints3.cc, tests/addconstraints4.cc,
+ tests/addconstraints5.cc, tests/addconstraints6.cc,
+ tests/addconstraints7.cc, tests/addconstraints8.cc,
+ tests/addconstraints9.cc, tests/addgenerator1.cc,
+ tests/addgenerator2.cc, tests/addgenerator3.cc,
+ tests/addgenerator4.cc, tests/addgenerator5.cc,
+ tests/addgenerators1.cc, tests/addgenerators10.cc,
+ tests/addgenerators11.cc, tests/addgenerators12.cc,
+ tests/addgenerators13.cc, tests/addgenerators2.cc,
+ tests/addgenerators3.cc, tests/addgenerators4.cc,
+ tests/addgenerators5.cc, tests/addgenerators6.cc,
+ tests/addgenerators7.cc, tests/addgenerators8.cc,
+ tests/addgenerators9.cc, tests/addspacedims1.cc,
+ tests/addspacedims10.cc, tests/addspacedims11.cc,
+ tests/addspacedims3.cc, tests/addspacedims4.cc,
+ tests/addspacedims5.cc, tests/addspacedims6.cc,
+ tests/addspacedims7.cc, tests/addspacedims9.cc,
+ tests/affineimage3.cc, tests/affineimage7.cc,
+ tests/affinepreimage1.cc, tests/affinepreimage4.cc,
+ tests/affinepreimage7.cc, tests/affinetrans.cc,
+ tests/ascii_dump_load4.cc, tests/ascii_dump_load7.cc,
+ tests/bgp99extrapolation1.cc, tests/bhrz03widening1.cc,
+ tests/bhrz03widening12.cc, tests/bhrz03widening13.cc,
+ tests/bhrz03widening14.cc, tests/bhrz03widening15.cc,
+ tests/bhrz03widening16.cc, tests/bhrz03widening17.cc,
+ tests/bhrz03widening18.cc, tests/bhrz03widening19.cc,
+ tests/bhrz03widening2.cc, tests/bhrz03widening6.cc,
+ tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+ tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+ tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+ tests/bounded1.cc, tests/boundedh79extrapolation1.cc,
+ tests/boundingbox1.cc, tests/boundingbox2.cc,
+ tests/boundingbox3.cc, tests/boundingbox4.cc, tests/bounds1.cc,
+ tests/concatenate1.cc, tests/concatenate2.cc,
+ tests/concatenate3.cc, tests/concatenate4.cc,
+ tests/constraints1.cc, tests/constraints2.cc,
+ tests/constraints3.cc, tests/constraints4.cc, tests/contains2.cc,
+ tests/contains3.cc, tests/contains4.cc, tests/contains5.cc,
+ tests/disjoint2.cc, tests/disjoint3.cc, tests/dualhypercubes.cc,
+ tests/empty1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+ tests/exceptions3.cc, tests/expandspacedim1.cc,
+ tests/generalizedaffineimage9.cc, tests/generators1.cc,
+ tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+ tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+ tests/h79widening4.cc, tests/intersection2.cc,
+ tests/intersection4.cc, tests/intersection6.cc,
+ tests/limitedbhrz03extrapolation1.cc,
+ tests/limitedh79extrapolation1.cc,
+ tests/limitedh79extrapolation2.cc,
+ tests/limitedh79extrapolation3.cc,
+ tests/limitedh79extrapolation4.cc, tests/linexpression1.cc,
+ tests/mapspacedims1.cc, tests/max_min1.cc, tests/max_min2.cc,
+ tests/maxspacedim1.cc, tests/membytes1.cc, tests/membytes2.cc,
+ tests/minconstraints1.cc, tests/minconstraints2.cc,
+ tests/minconstraints3.cc, tests/minconstraints4.cc,
+ tests/mingenerators1.cc, tests/mingenerators2.cc,
+ tests/mingenerators3.cc, tests/polydifference1.cc,
+ tests/polydifference2.cc, tests/polydifference3.cc,
+ tests/polydifference8.cc, tests/polydifference9.cc,
+ tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull7.cc,
+ tests/print.cc, tests/print.hh, tests/randphull1.cc,
+ tests/randphull2.cc, tests/relations1.cc, tests/relations12.cc,
+ tests/relations15.cc, tests/relations16.cc, tests/relations17.cc,
+ tests/relations4.cc, tests/relations5.cc, tests/relations7.cc,
+ tests/relations8.cc, tests/relations9.cc,
+ tests/removespacedims1.cc, tests/removespacedims2.cc,
+ tests/removespacedims4.cc, tests/removespacedims8.cc,
+ tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse3.cc,
+ tests/timeelapse4.cc, tests/timeelapse6.cc, tests/topclosed2.cc,
+ tests/topclosed3.cc, tests/topclosure1.cc, tests/universe3.cc,
+ tests/universe4.cc, tests/universe6.cc, tests/universe7.cc,
+ tests/writeconsys1.cc, tests/writegensys1.cc,
+ tests/writegensys2.cc, tests/writegensys3.cc
+ (altnum.[6,2,2,6,12,2,2,4,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,2,6,5,5,5,1,3,3,3,6,4,6,1,7,2,4,4,3,4,5,1,4,6,5,5,2,5,3,1,1,1,1,3,4,2,4,4,1,1,1,1,1,3,5,4,14,1,1,1,1,1,5,7,4,1,3,7,5,1,1,1,1,5,4,3,6,7,3,1,5,7,5,1,1,1,1,4,4,1,6,2,6,2,3,4,6,3,5,3,1,1,1,1,1,2,3,3,3,3,3,14,5,3,4,4,7,7,3,4,4,7,7,2,5,9,7,5,2,2,5,6,5,4,4,3,1,10,4,3,1,1,1,1,1,1,1,1,1,1,4,2,4,4,3,20,13,21,16,19,6 [...]
+ Sixth merge from main trunk.
+
+2004-12-11 Saturday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.138), STANDARDS (1.15), TODO (1.126),
+ Watchdog/EList_Iterator.inlines.hh (1.2),
+ Watchdog/Handler.defs.hh (1.2), Watchdog/Makefile.am (1.14),
+ Watchdog/Watchdog.defs.hh (1.14), demos/ppl_lcdd/ppl_lcdd.cc
+ (1.38), demos/ppl_lcdd/examples/allzero.ine (1.2),
+ demos/ppl_lcdd/examples/ccc4.ext (1.2),
+ demos/ppl_lcdd/examples/ccp4.ext (1.2),
+ demos/ppl_lcdd/examples/cp4.ext (1.2),
+ demos/ppl_lcdd/examples/cp4.ine (1.2),
+ demos/ppl_lcdd/examples/cp5.ine (1.2),
+ demos/ppl_lcdd/examples/cp6.ine (1.2),
+ demos/ppl_lcdd/examples/cp7.ext (1.2),
+ demos/ppl_lcdd/examples/cross10.ine (1.2),
+ demos/ppl_lcdd/examples/cross12.ine (1.2),
+ demos/ppl_lcdd/examples/cross4.ine (1.2),
+ demos/ppl_lcdd/examples/cross6.ine (1.2),
+ demos/ppl_lcdd/examples/cross8.ine (1.2),
+ demos/ppl_lcdd/examples/cube.ext (1.2),
+ demos/ppl_lcdd/examples/cubetop.ine (1.2),
+ demos/ppl_lcdd/examples/cubocta.ine (1.2),
+ demos/ppl_lcdd/examples/cut16_11.ext (1.2),
+ demos/ppl_lcdd/examples/cut32_16.ext (1.2),
+ demos/ppl_lcdd/examples/cyc.ine (1.2),
+ demos/ppl_lcdd/examples/cyclic16-10.ext (1.2),
+ demos/ppl_lcdd/examples/cyclic25_13.ext (1.2),
+ demos/ppl_lcdd/examples/ex1.ine (1.2),
+ demos/ppl_lcdd/examples/grcubocta.ine (1.2),
+ demos/ppl_lcdd/examples/in0.ine (1.2),
+ demos/ppl_lcdd/examples/in1.ine (1.2),
+ demos/ppl_lcdd/examples/in2.ine (1.2),
+ demos/ppl_lcdd/examples/in3.ine (1.2),
+ demos/ppl_lcdd/examples/in4.ine (1.2),
+ demos/ppl_lcdd/examples/in5.ine (1.2),
+ demos/ppl_lcdd/examples/in6.ine (1.2),
+ demos/ppl_lcdd/examples/in7.ine (1.2),
+ demos/ppl_lcdd/examples/integralpoints.ine (1.2),
+ demos/ppl_lcdd/examples/irbox20-4.ext (1.2),
+ demos/ppl_lcdd/examples/irbox200-4.ext (1.2),
+ demos/ppl_lcdd/examples/kkd18_4.ine (1.2),
+ demos/ppl_lcdd/examples/kkd27_5.ine (1.2),
+ demos/ppl_lcdd/examples/kkd38_6.ine (1.2),
+ demos/ppl_lcdd/examples/kq20_11_m.ine (1.2),
+ demos/ppl_lcdd/examples/metric40_11.ine (1.2),
+ demos/ppl_lcdd/examples/metric80_16.ine (1.2),
+ demos/ppl_lcdd/examples/mit.ine (1.2),
+ demos/ppl_lcdd/examples/mit288-281.ine (1.2),
+ demos/ppl_lcdd/examples/mit31-20.ine (1.2),
+ demos/ppl_lcdd/examples/mit41-16.ine (1.2),
+ demos/ppl_lcdd/examples/mit708-9.ine (1.2),
+ demos/ppl_lcdd/examples/mit71-61.ine (1.2),
+ demos/ppl_lcdd/examples/mit90-86.ine (1.2),
+ demos/ppl_lcdd/examples/mp5.ext (1.2),
+ demos/ppl_lcdd/examples/mp5.ine (1.2),
+ demos/ppl_lcdd/examples/mp5a.ine (1.2),
+ demos/ppl_lcdd/examples/mp6.ine (1.2),
+ demos/ppl_lcdd/examples/origin.ine (1.2),
+ demos/ppl_lcdd/examples/project2res.ine (1.2),
+ demos/ppl_lcdd/examples/rcubocta.ine (1.2),
+ demos/ppl_lcdd/examples/reg24-5.ext (1.2),
+ demos/ppl_lcdd/examples/reg24-5.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh1.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh3.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh4.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh6.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh7.ine (1.2),
+ demos/ppl_lcdd/examples/sampleh8.ine (1.2),
+ demos/ppl_lcdd/examples/samplev1.ext (1.2),
+ demos/ppl_lcdd/examples/samplev3.ext (1.2),
+ demos/ppl_lcdd/examples/trunc10.ine (1.2),
+ demos/ppl_lcdd/examples/trunc7.ine (1.2),
+ demos/ppl_lcdd/examples/tsp5.ext (1.2),
+ demos/ppl_lcdd/examples/tsp5.ine (1.2), doc/Makefile.am (1.30),
+ doc/definitions.dox (1.164), doc/devref-browse.doxyconf-latex.in
+ (1.53), doc/devref-print.doxyconf-latex.in (1.53),
+ doc/devref.doxyconf-html.in (1.53), doc/fdl.tex (1.3),
+ doc/user-browse.doxyconf-latex.in (1.22),
+ doc/user-print.doxyconf-latex.in (1.22),
+ doc/user.doxyconf-html.in (1.24), interfaces/C/ppl_c.h.in (1.40),
+ interfaces/Prolog/Prolog_interface.dox (1.119),
+ interfaces/Prolog/exceptions.hh (1.13),
+ interfaces/Prolog/ppl_prolog.icc (1.146),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.6),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.73),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.23),
+ interfaces/Prolog/SICStus/Makefile.am (1.48),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.68),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.9),
+ interfaces/Prolog/SWI/Makefile.am (1.40),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.92),
+ interfaces/Prolog/tests/pl_check.pl (1.2), src/Ask_Tell.defs.hh
+ (1.3), src/Ask_Tell.inlines.hh (1.3), src/BHRZ03_Certificate.cc
+ (1.6), src/BHRZ03_Certificate.defs.hh (1.8),
+ src/Checked_Number.inlines.hh (1.8), src/Constraint.defs.hh
+ (1.98), src/Constraint.inlines.hh (1.57),
+ src/Constraint_System.defs.hh (1.3), src/Generator.defs.hh
+ (1.98), src/Generator.inlines.hh (1.51), src/Generator_System.cc
+ (1.3), src/Generator_System.defs.hh (1.3),
+ src/H79_Certificate.defs.hh (1.8), src/Interval.defs.hh (1.19),
+ src/Interval.inlines.hh (1.15), src/Linear_Expression.cc (1.3),
+ src/Linear_Expression.defs.hh (1.5),
+ src/Linear_Expression.inlines.hh (1.3), src/Linear_Row.cc (1.3),
+ src/Linear_Row.inlines.hh (1.6), src/Linear_System.cc (1.12),
+ src/Linear_System.defs.hh (1.10), src/Linear_System.inlines.hh
+ (1.9), src/Matrix.inlines.hh (1.42),
+ src/Native_Integer.inlines.hh (1.6),
+ src/Polyhedra_Powerset.defs.hh (1.10),
+ src/Polyhedra_Powerset.inlines.hh (1.11), src/Polyhedron.defs.hh
+ (1.260), src/Polyhedron.inlines.hh (1.105),
+ src/Polyhedron_chdims.cc (1.26), src/Polyhedron_nonpublic.cc
+ (1.39), src/Polyhedron_public.cc (1.44),
+ src/Polyhedron_widenings.cc (1.38), src/Row.cc (1.75),
+ src/Row.defs.hh (1.87), src/Row.inlines.hh (1.54),
+ src/Saturation_Matrix.inlines.hh (1.2), src/Saturation_Row.cc
+ (1.2), src/Saturation_Row.defs.hh (1.2),
+ src/Widening_Function.defs.hh (1.8),
+ src/Widening_Function.inlines.hh (1.8), src/checked.defs.hh
+ (1.4), src/checked.inlines.hh (1.4), src/checked_float.inlines.hh
+ (1.10), src/checked_int.inlines.hh (1.6),
+ src/checked_mpq.inlines.hh (1.5), src/checked_mpz.inlines.hh
+ (1.5), src/globals.defs.hh (1.11), src/globals.inlines.hh (1.6),
+ src/swapping_sort.icc (1.5), tests/Makefile.am (1.239),
+ tests/addspacedims9.cc (1.2), tests/bgp99extrapolation1.cc (1.7),
+ tests/bhz03widening1.cc (1.8), tests/bhz03widening3.cc (1.8),
+ tests/bhz03widening4.cc (1.6), tests/boundingbox1.cc (1.39),
+ tests/boundingbox3.cc (1.15), tests/boundingbox4.cc (1.12),
+ tests/disjoint3.cc (1.10), tests/dualhypercubes.cc (1.9),
+ tests/expandspacedim1.cc (1.2), tests/generalizedaffineimage9.cc
+ (1.8), tests/polydifference1.cc (1.10), tests/polydifference8.cc
+ (1.4), tests/polydifference9.cc (1.5), tests/print.cc (1.13): Try
+ to avoid very long lines.
+
+2004-12-11 Saturday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.125): Postponed a couple of items.
+
+2004-12-11 Saturday 20:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.137), README (1.30), TODO (1.124),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.37),
+ doc/devref-browse.doxyconf-latex.in (1.52),
+ doc/devref-print.doxyconf-latex.in (1.52),
+ doc/devref.doxyconf-html.in (1.52), interfaces/C/ppl_c.cc
+ (1.117), interfaces/Prolog/Prolog_interface.dox (1.118),
+ interfaces/Prolog/exceptions.hh (1.12),
+ interfaces/Prolog/ppl_prolog.icc (1.145),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.27),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.22),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.67),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.91),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.58),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.84), src/Bounding_Box.cc
+ (1.2), src/Bounding_Box.defs.hh (1.2),
+ src/Bounding_Box.inlines.hh (1.2), src/Coefficient.cc (1.1),
+ src/Coefficient.defs.hh (1.1), src/Coefficient.inlines.hh (1.1),
+ src/Coefficient.types.hh (1.1),
+ src/Coefficient_traits_template.hh (1.1), src/Constraint.cc
+ (1.45), src/Constraint.defs.hh (1.97), src/Constraint.inlines.hh
+ (1.56), src/Constraint_System.cc (1.2),
+ src/Constraint_System.defs.hh (1.2), src/GMP_Integer.types.hh
+ (1.3), src/Generator.cc (1.56), src/Generator.defs.hh (1.97),
+ src/Generator.inlines.hh (1.50), src/Generator_System.cc (1.2),
+ src/Generator_System.defs.hh (1.2), src/Integer.cc (1.5),
+ src/Integer.defs.hh (1.15), src/Integer.inlines.hh (1.14),
+ src/Integer.types.hh (1.10), src/Integer_macros.hh (1.3),
+ src/Integer_traits_template.hh (1.3), src/Interval.defs.hh
+ (1.18), src/Interval.inlines.hh (1.14), src/Linear_Expression.cc
+ (1.2), src/Linear_Expression.defs.hh (1.4),
+ src/Linear_Expression.inlines.hh (1.2), src/Linear_Row.cc (1.2),
+ src/Linear_Row.defs.hh (1.6), src/Linear_Row.inlines.hh (1.5),
+ src/Linear_System.cc (1.11), src/Makefile.am (1.90),
+ src/Matrix.defs.hh (1.66), src/Native_Integer.defs.hh (1.5),
+ src/Native_Integer.types.hh (1.3), src/Polyhedron.defs.hh
+ (1.259), src/Polyhedron.inlines.hh (1.104),
+ src/Polyhedron_nonpublic.cc (1.38), src/Polyhedron_public.cc
+ (1.43), src/Polyhedron_widenings.cc (1.37), src/Row.cc (1.74),
+ src/Row.defs.hh (1.86), src/Row.inlines.hh (1.53),
+ src/conversion.cc (1.65), src/globals.cc (1.19),
+ src/globals.defs.hh (1.10), src/globals.inlines.hh (1.5),
+ tests/BBox.cc (1.6), tests/BBox.hh (1.5),
+ tests/bhrz03widening13.cc (1.6), tests/bhrz03widening14.cc (1.8),
+ tests/dualhypercubes.cc (1.8), tests/exceptions1.cc (1.43),
+ tests/intersection2.cc (1.12), tests/max_min1.cc (1.6),
+ tests/max_min2.cc (1.6), tests/randphull1.cc (1.13),
+ tests/randphull2.cc (1.10): The type Integer has been renamed
+ Coefficient.
+
+2004-12-11 Saturday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.37): Useless inclusions removed.
+
+2004-12-11 Saturday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.136), README (1.29), TODO (1.123),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.36), doc/definitions.dox (1.163),
+ doc/devref-browse.doxyconf-latex.in (1.51),
+ doc/devref-print.doxyconf-latex.in (1.51),
+ doc/devref.doxyconf-html.in (1.51), interfaces/C/ppl_c.cc
+ (1.116), interfaces/C/ppl_c.h.in (1.39),
+ interfaces/Prolog/ppl_prolog.icc (1.144),
+ src/BHRZ03_Certificate.cc (1.5), src/C_Polyhedron.defs.hh (1.30),
+ src/C_Polyhedron.inlines.hh (1.23), src/Constraint.defs.hh
+ (1.96), src/GenSys.cc (1.102), src/GenSys.defs.hh (1.107),
+ src/GenSys.inlines.hh (1.38), src/GenSys.types.hh (1.8),
+ src/Generator.defs.hh (1.96), src/Generator_System.cc (1.1),
+ src/Generator_System.defs.hh (1.1),
+ src/Generator_System.inlines.hh (1.1),
+ src/Generator_System.types.hh (1.1),
+ src/Linear_Expression.defs.hh (1.3), src/Linear_System.defs.hh
+ (1.9), src/Makefile.am (1.89), src/Matrix.defs.hh (1.65),
+ src/NNC_Polyhedron.defs.hh (1.32), src/NNC_Polyhedron.inlines.hh
+ (1.26), src/Polyhedron.defs.hh (1.258), src/Polyhedron.inlines.hh
+ (1.103), src/Polyhedron_nonpublic.cc (1.37),
+ src/Polyhedron_public.cc (1.42), src/Polyhedron_widenings.cc
+ (1.36), tests/NNCminimize1.cc (1.12), tests/NNCminimize2.cc
+ (1.12), tests/NNCminimize3.cc (1.12), tests/NNCminimize4.cc
+ (1.13), tests/NNCminimize5.cc (1.12), tests/addconstraints9.cc
+ (1.15), tests/addgenerator1.cc (1.8), tests/addgenerator2.cc
+ (1.8), tests/addgenerator3.cc (1.5), tests/addgenerator4.cc
+ (1.7), tests/addgenerator5.cc (1.2), tests/addgenerators1.cc
+ (1.13), tests/addgenerators10.cc (1.5), tests/addgenerators11.cc
+ (1.10), tests/addgenerators12.cc (1.7), tests/addgenerators13.cc
+ (1.3), tests/addgenerators2.cc (1.13), tests/addgenerators3.cc
+ (1.13), tests/addgenerators4.cc (1.13), tests/addgenerators5.cc
+ (1.13), tests/addgenerators6.cc (1.13), tests/addgenerators7.cc
+ (1.10), tests/addgenerators8.cc (1.8), tests/addgenerators9.cc
+ (1.7), tests/addspacedims1.cc (1.2), tests/addspacedims10.cc
+ (1.3), tests/addspacedims11.cc (1.2), tests/addspacedims3.cc
+ (1.3), tests/addspacedims6.cc (1.2), tests/addspacedims7.cc
+ (1.2), tests/affineimage3.cc (1.5), tests/affineimage7.cc (1.5),
+ tests/affinepreimage1.cc (1.12), tests/affinepreimage4.cc (1.13),
+ tests/affinepreimage7.cc (1.5), tests/affinetrans.cc (1.16),
+ tests/ascii_dump_load7.cc (1.8), tests/bhrz03widening1.cc (1.5),
+ tests/bhrz03widening12.cc (1.5), tests/bhrz03widening13.cc (1.5),
+ tests/bhrz03widening14.cc (1.7), tests/bhrz03widening15.cc (1.9),
+ tests/bhrz03widening16.cc (1.5), tests/bhrz03widening17.cc (1.5),
+ tests/bhrz03widening18.cc (1.5), tests/bhrz03widening19.cc (1.5),
+ tests/bhrz03widening2.cc (1.7), tests/bhrz03widening6.cc (1.6),
+ tests/bhrz03widening7.cc (1.6), tests/bhrz03widening8.cc (1.5),
+ tests/bhrz03widening9.cc (1.8), tests/concatenate4.cc (1.7),
+ tests/contains2.cc (1.4), tests/contains3.cc (1.4),
+ tests/contains4.cc (1.3), tests/disjoint2.cc (1.10),
+ tests/disjoint3.cc (1.9), tests/dualhypercubes.cc (1.7),
+ tests/empty1.cc (1.15), tests/exceptions1.cc (1.42),
+ tests/exceptions2.cc (1.37), tests/generators1.cc (1.16),
+ tests/generators2.cc (1.12), tests/generators3.cc (1.6),
+ tests/generators4.cc (1.7), tests/generators5.cc (1.6),
+ tests/generators6.cc (1.7), tests/h79widening4.cc (1.5),
+ tests/intersection2.cc (1.11), tests/intersection6.cc (1.8),
+ tests/limitedbhrz03extrapolation1.cc (1.5),
+ tests/mapspacedims1.cc (1.2), tests/maxspacedim1.cc (1.5),
+ tests/membytes1.cc (1.7), tests/mingenerators1.cc (1.6),
+ tests/mingenerators2.cc (1.5), tests/mingenerators3.cc (1.5),
+ tests/polydifference1.cc (1.9), tests/polydifference2.cc (1.11),
+ tests/polydifference8.cc (1.3), tests/polyhull1.cc (1.9),
+ tests/polyhull2.cc (1.8), tests/polyhull7.cc (1.5),
+ tests/print.cc (1.12), tests/print.hh (1.16), tests/randphull1.cc
+ (1.12), tests/randphull2.cc (1.9), tests/relations12.cc (1.6),
+ tests/relations15.cc (1.6), tests/relations16.cc (1.6),
+ tests/relations17.cc (1.9), tests/relations4.cc (1.12),
+ tests/relations5.cc (1.12), tests/removespacedims1.cc (1.2),
+ tests/removespacedims2.cc (1.3), tests/removespacedims4.cc (1.2),
+ tests/removespacedims8.cc (1.2), tests/smm1.cc (1.17),
+ tests/timeelapse1.cc (1.9), tests/timeelapse3.cc (1.10),
+ tests/timeelapse4.cc (1.9), tests/timeelapse6.cc (1.5),
+ tests/topclosed2.cc (1.7), tests/topclosed3.cc (1.9),
+ tests/topclosure1.cc (1.8), tests/universe7.cc (1.2),
+ tests/writegensys1.cc (1.9), tests/writegensys2.cc (1.9),
+ tests/writegensys3.cc (1.9): The class GenSys has been renamed
+ Generator_System.
+
+2004-12-11 Saturday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.135), README (1.28), TODO (1.122),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.35), demos/ppl_lpsol/ppl_lpsol.c
+ (1.7), doc/definitions.dox (1.162),
+ doc/devref-browse.doxyconf-latex.in (1.50),
+ doc/devref-print.doxyconf-latex.in (1.50),
+ doc/devref.doxyconf-html.in (1.50), interfaces/C/ppl_c.cc
+ (1.115), interfaces/C/ppl_c.h.in (1.38),
+ interfaces/Prolog/ppl_prolog.icc (1.143), src/Ask_Tell.defs.hh
+ (1.2), src/Ask_Tell.inlines.hh (1.2), src/BHRZ03_Certificate.cc
+ (1.4), src/C_Polyhedron.cc (1.13), src/C_Polyhedron.defs.hh
+ (1.29), src/C_Polyhedron.inlines.hh (1.22), src/ConSys.cc (1.76),
+ src/ConSys.defs.hh (1.93), src/ConSys.inlines.hh (1.37),
+ src/ConSys.types.hh (1.8), src/Constraint.defs.hh (1.95),
+ src/Constraint_System.cc (1.1), src/Constraint_System.defs.hh
+ (1.1), src/Constraint_System.inlines.hh (1.1),
+ src/Constraint_System.types.hh (1.1), src/Determinate.defs.hh
+ (1.49), src/Determinate.inlines.hh (1.43), src/GenSys.inlines.hh
+ (1.37), src/Generator.defs.hh (1.95), src/H79_Certificate.cc
+ (1.5), src/Linear_Expression.defs.hh (1.2),
+ src/Linear_System.defs.hh (1.8), src/Makefile.am (1.88),
+ src/Matrix.defs.hh (1.64), src/NNC_Polyhedron.defs.hh (1.31),
+ src/NNC_Polyhedron.inlines.hh (1.25),
+ src/Polyhedra_Powerset.defs.hh (1.9),
+ src/Polyhedra_Powerset.inlines.hh (1.10), src/Polyhedron.defs.hh
+ (1.257), src/Polyhedron.inlines.hh (1.102),
+ src/Polyhedron.types.hh (1.13), src/Polyhedron_chdims.cc (1.25),
+ src/Polyhedron_nonpublic.cc (1.36), src/Polyhedron_public.cc
+ (1.41), src/Polyhedron_widenings.cc (1.35),
+ src/Widening_Function.defs.hh (1.7),
+ src/Widening_Function.inlines.hh (1.7), src/algorithms.hh (1.36),
+ tests/NNCminimize1.cc (1.11), tests/NNCminimize2.cc (1.11),
+ tests/NNCminimize3.cc (1.11), tests/NNCminimize5.cc (1.11),
+ tests/NNCminimize6.cc (1.12), tests/addconstraint1.cc (1.7),
+ tests/addconstraints1.cc (1.13), tests/addconstraints10.cc
+ (1.11), tests/addconstraints11.cc (1.12),
+ tests/addconstraints12.cc (1.5), tests/addconstraints13.cc (1.7),
+ tests/addconstraints2.cc (1.20), tests/addconstraints3.cc (1.11),
+ tests/addconstraints4.cc (1.12), tests/addconstraints5.cc (1.13),
+ tests/addconstraints6.cc (1.14), tests/addconstraints7.cc (1.13),
+ tests/addconstraints8.cc (1.14), tests/addconstraints9.cc (1.14),
+ tests/addspacedims3.cc (1.2), tests/addspacedims4.cc (1.2),
+ tests/addspacedims5.cc (1.2), tests/ascii_dump_load4.cc (1.15),
+ tests/boundedh79extrapolation1.cc (1.2), tests/boundingbox1.cc
+ (1.38), tests/boundingbox3.cc (1.14), tests/concatenate1.cc
+ (1.10), tests/concatenate2.cc (1.9), tests/concatenate3.cc (1.8),
+ tests/constraints1.cc (1.7), tests/constraints2.cc (1.7),
+ tests/constraints3.cc (1.8), tests/constraints4.cc (1.7),
+ tests/contains2.cc (1.3), tests/contains3.cc (1.3),
+ tests/contains5.cc (1.3), tests/exceptions1.cc (1.41),
+ tests/exceptions2.cc (1.36), tests/generators1.cc (1.15),
+ tests/generators2.cc (1.11), tests/geomcovers1.cc (1.2),
+ tests/intersection4.cc (1.8),
+ tests/limitedbhrz03extrapolation1.cc (1.4),
+ tests/limitedh79extrapolation1.cc (1.4),
+ tests/limitedh79extrapolation2.cc (1.4),
+ tests/limitedh79extrapolation3.cc (1.5),
+ tests/limitedh79extrapolation4.cc (1.5), tests/maxspacedim1.cc
+ (1.4), tests/membytes1.cc (1.6), tests/minconstraints1.cc (1.6),
+ tests/minconstraints2.cc (1.6), tests/minconstraints3.cc (1.5),
+ tests/minconstraints4.cc (1.9), tests/polydifference2.cc (1.10),
+ tests/polydifference3.cc (1.6), tests/polydifference8.cc (1.2),
+ tests/print.cc (1.11), tests/print.hh (1.15), tests/randphull2.cc
+ (1.8), tests/relations1.cc (1.11), tests/relations8.cc (1.11),
+ tests/relations9.cc (1.14), tests/smm1.cc (1.16),
+ tests/timeelapse3.cc (1.9), tests/universe3.cc (1.12),
+ tests/universe4.cc (1.12), tests/universe6.cc (1.11),
+ tests/writeconsys1.cc (1.9): The class ConSys has been renamed
+ Constraint_System.
+
+2004-12-11 Saturday 09:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.134), README (1.27), TODO (1.121), configure.ac (1.142),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.34), demos/ppl_lpsol/ppl_lpsol.c
+ (1.6), doc/devref-browse.doxyconf-latex.in (1.49),
+ doc/devref-print.doxyconf-latex.in (1.49),
+ doc/devref.doxyconf-html.in (1.49), interfaces/C/ppl_c.cc
+ (1.114), interfaces/C/ppl_c.h.in (1.37),
+ interfaces/Prolog/ppl_prolog.icc (1.142),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.72), src/C_Polyhedron.cc
+ (1.12), src/ConSys.cc (1.75), src/ConSys.defs.hh (1.92),
+ src/Constraint.cc (1.44), src/Constraint.defs.hh (1.94),
+ src/Constraint.inlines.hh (1.55), src/GenSys.cc (1.101),
+ src/GenSys.defs.hh (1.106), src/Generator.cc (1.55),
+ src/Generator.defs.hh (1.94), src/Generator.inlines.hh (1.49),
+ src/LinExpression.cc (1.25), src/LinExpression.defs.hh (1.73),
+ src/LinExpression.inlines.hh (1.34), src/LinExpression.types.hh
+ (1.8), src/Linear_Expression.cc (1.1),
+ src/Linear_Expression.defs.hh (1.1),
+ src/Linear_Expression.inlines.hh (1.1),
+ src/Linear_Expression.types.hh (1.1), src/Linear_Row.defs.hh
+ (1.5), src/Linear_System.cc (1.10), src/Makefile.am (1.87),
+ src/Polyhedra_Powerset.inlines.hh (1.9), src/Polyhedron.defs.hh
+ (1.256), src/Polyhedron.inlines.hh (1.101),
+ src/Polyhedron_chdims.cc (1.24), src/Polyhedron_nonpublic.cc
+ (1.35), src/Polyhedron_public.cc (1.40),
+ src/Polyhedron_widenings.cc (1.34), src/Variable.defs.hh (1.44),
+ src/algorithms.hh (1.35), tests/addconstraints1.cc (1.12),
+ tests/addconstraints3.cc (1.10), tests/addconstraints8.cc (1.13),
+ tests/affinetrans.cc (1.15), tests/bhrz03widening14.cc (1.6),
+ tests/bhrz03widening15.cc (1.8), tests/bounded1.cc (1.14),
+ tests/bounds1.cc (1.7), tests/constraints3.cc (1.7),
+ tests/disjoint2.cc (1.9), tests/disjoint3.cc (1.8),
+ tests/dualhypercubes.cc (1.6), tests/exceptions1.cc (1.40),
+ tests/exceptions2.cc (1.35), tests/exceptions3.cc (1.5),
+ tests/generalizedaffineimage9.cc (1.7),
+ tests/limitedh79extrapolation4.cc (1.4), tests/linexpression1.cc
+ (1.5), tests/max_min1.cc (1.5), tests/max_min2.cc (1.5),
+ tests/maxspacedim1.cc (1.3), tests/membytes1.cc (1.5),
+ tests/polydifference3.cc (1.5), tests/randphull2.cc (1.7),
+ tests/relations7.cc (1.11), tests/relations9.cc (1.13),
+ tests/removespacedims2.cc (1.2), tests/universe6.cc (1.10),
+ tests/writeconsys1.cc (1.8), tests/writegensys3.cc (1.8): The
+ class LinExpression has been renamed Linear_Expression.
+
+2004-12-11 Saturday 09:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/expected_mpz_a (1.2): Adapted to the recent
+ changes in the precision of ppl_lpsol's output.
+
+2004-12-09 Thursday 17:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/swapping_sort.icc (1.4): The swapping sort procedure
+ rewritten from scratch (it was buggy).
+
+2004-12-08 Wednesday 11:12 Abramo Bagnara
+
+ * src/globals.defs.hh (altnum.5): Added used() function useful to
+ suppress compiler warning.
+
+2004-12-08 Wednesday 09:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Number.inlines.hh (1.7): Do not name an unused
+ parameter.
+
+2004-12-07 Tuesday 19:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: expected_int16 (1.2), expected_int32 (1.2),
+ expected_int32_a (1.2), expected_int64 (1.2), expected_int64_a
+ (1.2), expected_mpz (1.2), ppl_lpsol.c (1.5): Print optimum value
+ and location with the format "%.10g" instead of "%g".
+
+2004-12-07 Tuesday 13:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.133), README (1.26), TODO (1.120),
+ doc/devref-browse.doxyconf-latex.in (1.48),
+ doc/devref-print.doxyconf-latex.in (1.48),
+ doc/devref.doxyconf-html.in (1.48), src/AskTell.defs.hh (1.28),
+ src/AskTell.inlines.hh (1.24), src/AskTell.types.hh (1.7),
+ src/Linear_System.cc (1.9), src/Linear_System.defs.hh (1.7),
+ src/Linear_System.inlines.hh (1.8), src/Makefile.am (1.86),
+ src/Matrix.defs.hh (1.63), src/Polyhedron.defs.hh (1.255),
+ src/Polyhedron_chdims.cc (1.23), src/Polyhedron_nonpublic.cc
+ (1.34), src/Polyhedron_public.cc (1.39),
+ src/Polyhedron_widenings.cc (1.33), src/SatMatrix.cc (1.35),
+ src/SatMatrix.defs.hh (1.39), src/SatMatrix.inlines.hh (1.27),
+ src/SatMatrix.types.hh (1.8), src/SatRow.cc (1.31),
+ src/SatRow.defs.hh (1.37), src/SatRow.inlines.hh (1.31),
+ src/SatRow.types.hh (1.8), src/Saturation_Matrix.cc (1.1),
+ src/Saturation_Matrix.defs.hh (1.1),
+ src/Saturation_Matrix.inlines.hh (1.1),
+ src/Saturation_Matrix.types.hh (1.1), src/Saturation_Row.cc
+ (1.1), src/Saturation_Row.defs.hh (1.1),
+ src/Saturation_Row.inlines.hh (1.1), src/Saturation_Row.types.hh
+ (1.1), src/conversion.cc (1.64), src/minimize.cc (1.39),
+ src/simplify.cc (1.41), src/swapping_sort.icc (1.3): The class
+ SatRow has been renamed Saturation_Row. The class SatMatrix has
+ been renamed Saturation_Matrix.
+
+2004-12-07 Tuesday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.132), README (1.25), TODO (1.119),
+ doc/devref-browse.doxyconf-latex.in (1.47),
+ doc/devref-print.doxyconf-latex.in (1.47),
+ doc/devref.doxyconf-html.in (1.47),
+ interfaces/Prolog/ppl_prolog.icc (1.141), src/BoundingBox.cc
+ (1.10), src/BoundingBox.defs.hh (1.15),
+ src/BoundingBox.inlines.hh (1.14), src/BoundingBox.types.hh
+ (1.7), src/Bounding_Box.cc (1.1), src/Bounding_Box.defs.hh (1.1),
+ src/Bounding_Box.inlines.hh (1.1), src/Bounding_Box.types.hh
+ (1.1), src/Makefile.am (1.85), tests/boundingbox2.cc (1.23),
+ tests/boundingbox3.cc (1.13), tests/boundingbox4.cc (1.11): The
+ class BoundingBox has been renamed Bounding_Box.
+
+2004-12-06 Monday 22:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.238): Added nnc_membytes2 to
+ XFAIL_WITH_INT8_A.
+
+2004-12-06 Monday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.131), README (1.24), TODO (1.118), src/Ask_Tell.defs.hh
+ (1.1), src/Ask_Tell.inlines.hh (1.1), src/Ask_Tell.types.hh
+ (1.1): The class AskTell has been renamed Ask_Tell.
+
+2004-12-06 Monday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.130), src/Polyhedra_Powerset.defs.hh (1.8),
+ src/Polyhedra_Powerset.inlines.hh (1.8), tests/membytes2.cc
+ (1.3): New explicit constructor
+ Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph): if
+ `ph' is not empty, builds a powerset containing only `ph';
+ builds the empty powerset otherwise. Constructor
+ Polyhedra_Powerset<PH>::Polyhedra_Powerset(const ConSys& cs) made
+ explicit as well.
+
+2004-12-06 Monday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.129), src/Powerset.defs.hh (1.3), src/Powerset.inlines.hh
+ (1.4): New explicit constructor Powerset<CS>::Powerset(const CS&
+ d): if `d' is not bottom, builds a powerset containing only `d';
+ builds the empty powerset otherwise.
+
+2004-12-06 Monday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.128): Restored an item erased by mistake.
+
+2004-12-06 Monday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.127): Improved.
+
+2004-12-06 Monday 17:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.126), TODO (1.117), src/C_Polyhedron.defs.hh (1.28),
+ src/C_Polyhedron.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh
+ (1.30), src/NNC_Polyhedron.inlines.hh (1.24): New methods
+ C_Polyhedron& C_Polyhedron::operator=(const NNC_Polyhedron& y)
+ and NNC_Polyhedron& NNC_Polyhedron::operator=(const C_Polyhedron&
+ y).
+
+2004-12-06 Monday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Polyhedron.cc (1.11): Efficiency bug fixed in
+ C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-12-06 Monday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.116): All the public classes of the library have been
+ endowed with methods total_memory_in_bytes() and
+ external_memory_in_bytes().
+
+2004-12-06 Monday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.72), Variable.defs.hh (1.43):
+ Comments fixed/improved.
+
+2004-12-06 Monday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.7),
+ src/Polyhedra_Powerset.inlines.hh (1.7), src/Powerset.defs.hh
+ (1.2), src/Powerset.inlines.hh (1.3), tests/membytes2.cc (1.2):
+ Added methods Powerset<CS>::external_memory_in_bytes() and
+ Powerset<CS>::total_memory_in_bytes(). Added methods
+ Polyhedra_Powerset<PH>::external_memory_in_bytes() and
+ Polyhedra_Powerset<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.48), src/Determinate.inlines.hh
+ (1.42), tests/Makefile.am (1.237), tests/membytes2.cc (1.1):
+ Added methods Determinate<PH>::external_memory_in_bytes() and
+ Determinate<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.47): Useless declarations removed.
+
+2004-12-05 Sunday 22:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Variable.cc (1.17), Variable.defs.hh (1.42): New method
+ Variable::OK().
+
+2004-12-05 Sunday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LinExpression.cc (1.24), LinExpression.defs.hh (1.71): New
+ method LinExpression::OK().
+
+2004-12-05 Sunday 21:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.93), src/Generator.inlines.hh (1.48),
+ src/LinExpression.defs.hh (1.70), src/LinExpression.inlines.hh
+ (1.33), src/Variable.defs.hh (1.41), src/Variable.inlines.hh
+ (1.20), tests/membytes1.cc (1.4): Added
+ Variable::total_memory_in_bytes() and
+ Variable::external_memory_in_bytes(). Added
+ Generator::total_memory_in_bytes() and
+ Generator::external_memory_in_bytes(). Added
+ LinExpression::total_memory_in_bytes() and
+ LinExpression::external_memory_in_bytes().
+
+2004-12-05 Sunday 07:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/membytes1.cc (1.3): Avoid compiler warnings.
+
+2004-12-05 Sunday 07:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.115), interfaces/Prolog/Prolog_interface.dox (1.117): We
+ now explain to the GNU Prolog user that GNU Prolog must be
+ configured using the `--disable-regs' option, if it has to work
+ with _any_ foreign code (not just the PPL).
+
+2004-11-28 Sunday 14:35 Abramo Bagnara
+
+ * configure.ac, src/checked_float.inlines.hh (altnum.[11,14]):
+ Fixed cygwin support.
+
+2004-11-28 Sunday 14:34 Abramo Bagnara
+
+ * configure.ac (1.141), src/checked_float.inlines.hh (1.9): Fixed
+ cygwin support
+
+2004-11-27 Saturday 19:32 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.20): Use signed explicitly.
+
+2004-11-27 Saturday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, NEWS, TODO, compile, config.guess, configure.ac,
+ install-sh, Watchdog/INSTALL, Watchdog/Makefile.am,
+ Watchdog/compile, Watchdog/config.guess, Watchdog/configure.ac,
+ Watchdog/install-sh, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected_int8,
+ demos/ppl_lcdd/expected_int8_a, demos/ppl_lpsol/Makefile.am,
+ demos/ppl_lpsol/expected, demos/ppl_lpsol/expected_int16,
+ demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+ demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+ demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+ demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+ demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+ doc/definitions.dox, doc/ppl.sty,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am, m4/Makefile.am,
+ m4/ac_cxx_long_double.m4, m4/ac_cxx_long_long.m4,
+ src/AskTell.defs.hh, src/AskTell.inlines.hh,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/Checked_Number.types.hh, src/ConSys.defs.hh,
+ src/ConSys.inlines.hh, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+ src/GMP_Integer.inlines.hh, src/GenSys.defs.hh,
+ src/GenSys.inlines.hh, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/LinExpression.defs.hh,
+ src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+ src/Linear_System.cc, src/Linear_System.defs.hh,
+ src/Linear_System.inlines.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/SatMatrix.cc, src/SatMatrix.defs.hh,
+ src/SatMatrix.inlines.hh, src/SatRow.cc, src/SatRow.defs.hh,
+ src/SatRow.inlines.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/checked.defs.hh,
+ src/checked.inlines.hh, src/checked_float.inlines.hh,
+ src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+ src/checked_mpz.inlines.hh, src/globals.defs.hh, src/simplify.cc,
+ src/swapping_sort.icc, tests/Makefile.am, tests/affineimage9.cc,
+ tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+ tests/bhz03widening1.cc, tests/bhz03widening2.cc,
+ tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+ tests/bhz03widening5.cc, tests/bhz03widening6.cc,
+ tests/equals1.cc, tests/exceptions3.cc, tests/mapspacedims4.cc,
+ tests/maxspacedim1.cc, tests/membytes1.cc, tests/universe7.cc,
+ tests/valgrind_suppressions
+ (altnum.[1,5,5,2,3,10,3,1,3,2,3,2,3,2,5,2,2,3,3,1,1,1,1,1,1,1,1,1,1,3,5,3,5,6,4,3,3,3,3,3,1,1,1,4,2,4,3,13,13,4,6,3,6,4,4,3,6,6,6,2,6,4,4,2,2,2,2,2,13,5,4,2,3,3,6,6,3,3,6,6,4,8,6,4,5,4,3,3,2,9,3,2,3,3,19,12,13,19,15,18,4,4,1,6,2,3,3,3,3,3,3,3,3,1,3,1,1,1,1,1]):
+ Fifth number from main repository.
+
+2004-11-27 Saturday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/ppl_lpsol.c (1.4): Little memory leaks fixed.
+
+2004-11-27 Saturday 15:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.inlines.hh (1.20), NNC_Polyhedron.inlines.hh
+ (1.23), Polyhedron.defs.hh (1.254), Polyhedron_chdims.cc (1.22),
+ Polyhedron_nonpublic.cc (1.33): Private exception thrower method
+ Polyhedron::throw_space_dimension_overflow() made static, as it
+ is often called inside constructors (before actually constructing
+ the polyhedron object).
+
+2004-11-27 Saturday 14:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.236), valgrind_suppressions (1.1): Added a
+ minimal infrastructure to perform regression testing using
+ `valgrind'.
+
+2004-11-26 Friday 07:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected_int8_a (1.2): Fixed.
+
+2004-11-25 Thursday 08:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.235): Added `ascii_dump_load4' to
+ `XFAIL_WITH_INT8_A'. iCVS:
+ ----------------------------------------------------------------------
+
+2004-11-23 Tuesday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.140): Version number bumped.
+
+2004-11-23 Tuesday 22:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.30): The methods SatRow::last() and the
+ functions compare(const SatRow&, const SatRow&),
+ subset_or_equal(const SatRow&, const SatRow&),
+ subset_or_equal(const SatRow&, const SatRow&, bool&) and
+ strict_subset(const SatRow&, const SatRow&) have been simplified
+ and optimized.
+
+2004-11-23 Tuesday 13:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/membytes1.cc (1.2): Be quiet.
+
+2004-11-23 Tuesday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc (1.29), SatRow.defs.hh (1.36), simplify.cc
+ (1.40): New function bool subset_or_equal(const SatRow& x, const
+ SatRow& y, bool& strict_subset) allows a simple optimization of
+ Polyhedron::simplify(). The function bool strict_subset(const
+ SatRow& x, const SatRow& y) is currently unused but left in
+ place: it may be needed and, moreover, when all what matters is
+ strict inclusion, `strict_subset(x, y)' is faster than
+ `subset_or_equal(x, y, s) && s'.
+
+2004-11-22 Monday 19:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Linear_System.cc (1.8): The assertion at the beginning of
+ add_pending_rows() made stronger: we assume that rows to be added
+ have the same size.
+
+2004-11-22 Monday 06:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.15), demos/ppl_lpsol/Makefile.am
+ (1.8), interfaces/Prolog/Ciao/Makefile.am (1.36),
+ interfaces/Prolog/GNU/Makefile.am (1.41),
+ interfaces/Prolog/SICStus/Makefile.am (1.47),
+ interfaces/Prolog/SWI/Makefile.am (1.39),
+ interfaces/Prolog/XSB/Makefile.am (1.28),
+ interfaces/Prolog/YAP/Makefile.am (1.31): Do not depend on the
+ current locale.
+
+2004-11-22 Monday 06:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.114): Postpone one item to PPL 0.8.
+
+2004-11-21 Sunday 15:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_Row.defs.hh (1.4), Linear_Row.inlines.hh (1.4):
+ Removed useless constructor for Linear_Row::Flags objects.
+
+2004-11-20 Saturday 08:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.21): Define the PROFILING symbol when
+ compiling for profiling.
+
+2004-11-15 Monday 16:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.139): Version number bumped.
+
+2004-11-15 Monday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.73): Method Row::Impl::shrink() fixed: it was
+ horribly broken on October 30, 2004 with the result that no
+ memory could ever be deallocated.
+
+2004-11-15 Monday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.7), Linear_System.defs.hh (1.6),
+ Linear_System.inlines.hh (1.7), SatMatrix.cc (1.34),
+ SatMatrix.defs.hh (1.38), SatMatrix.inlines.hh (1.26),
+ swapping_sort.icc (1.2): Function objects *LessThan() renamed as
+ *_Less_Than. Rewritten the sorting routine based on iter_swap's.
+
+2004-11-15 Monday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.138): Version number bumped.
+
+2004-11-15 Monday 09:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.125), TODO (1.113), src/Checked_Number.defs.hh (1.4),
+ src/Checked_Number.inlines.hh (1.6), src/ConSys.defs.hh (1.91),
+ src/ConSys.inlines.hh (1.36), src/Constraint.defs.hh (1.93),
+ src/Constraint.inlines.hh (1.54), src/GMP_Integer.defs.hh (1.3),
+ src/GMP_Integer.inlines.hh (1.3), src/GenSys.defs.hh (1.105),
+ src/GenSys.inlines.hh (1.36), src/Linear_System.defs.hh (1.5),
+ src/Linear_System.inlines.hh (1.6), src/Matrix.cc (1.79),
+ src/Matrix.defs.hh (1.62), src/Matrix.inlines.hh (1.41),
+ src/Native_Integer.defs.hh (1.4), src/Native_Integer.inlines.hh
+ (1.5), src/Polyhedron.defs.hh (1.253), src/Polyhedron.inlines.hh
+ (1.100), src/Polyhedron_public.cc (1.38), src/Row.cc (1.72),
+ src/Row.defs.hh (1.85), src/Row.inlines.hh (1.52),
+ src/SatMatrix.cc (1.33), src/SatMatrix.defs.hh (1.37),
+ src/SatMatrix.inlines.hh (1.25), src/SatRow.defs.hh (1.35),
+ src/SatRow.inlines.hh (1.30), src/globals.defs.hh (1.9),
+ tests/Makefile.am (1.234), tests/membytes1.cc (1.1): Most of the
+ public classes of the library have been endowed with methods
+ `memory_size_type total_memory_in_bytes() const' and
+ `memory_size_type external_memory_in_bytes() const' returning
+ (lower bounds for) the total size in bytes of the memory occupied
+ by *this and of the memory managed by *this, respectively. The
+ type `memory_size_type' is a newly added unsigned integral type
+ suitable to the representation of such information.
+
+2004-11-11 Thursday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.defs.hh (1.6): Powerset::omega_reduce()
+ made available to users of class Polyhedra_Powerset.
+
+2004-11-11 Thursday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.137): Version number bumped.
+
+2004-11-10 Wednesday 11:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.124), src/Polyhedra_Powerset.defs.hh (1.5),
+ src/Widening_Function.defs.hh (1.6),
+ src/Widening_Function.inlines.hh (1.6),
+ tests/bgp99extrapolation1.cc (1.6), tests/bgp99extrapolation2.cc
+ (1.8), tests/bhz03widening1.cc (1.7), tests/bhz03widening2.cc
+ (1.9), tests/bhz03widening3.cc (1.7), tests/bhz03widening4.cc
+ (1.5), tests/bhz03widening5.cc (1.6), tests/bhz03widening6.cc
+ (1.7): The helper function widen_fun has been renamed
+ widen_fun_ref.
+
+2004-11-08 Monday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/Makefile.am (1.7): Distribute all the expected*
+ files.
+
+2004-11-08 Monday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.140): Handle
+ std::length_error exceptions.
+
+2004-11-08 Monday 21:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.84): Concatenation order for ppl_install.hh
+ fixed.
+
+2004-11-08 Monday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.112), src/AskTell.defs.hh (1.27), src/AskTell.inlines.hh
+ (1.23), src/Determinate.defs.hh (1.46),
+ src/Determinate.inlines.hh (1.41), src/Polyhedra_Powerset.defs.hh
+ (1.4), src/Polyhedra_Powerset.inlines.hh (1.6),
+ src/Polyhedron.defs.hh (1.252), src/Polyhedron.inlines.hh (1.99):
+ `PartialFunction' renamed `Partial_Function'.
+
+2004-11-08 Monday 17:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.123), src/Polyhedron_public.cc (1.37): The bug shown by
+ universe7.cc, affecting method Polyhedron::is_universe(), is now
+ corrected.
+
+2004-11-08 Monday 17:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.233), universe7.cc (1.1): New test shows a
+ bug in method Polyhedron::is_universe().
+
+2004-11-08 Monday 17:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: SatMatrix.cc (1.32), SatMatrix.inlines.hh (1.24):
+ Reimplemented SatMatrix::sorted_contains() usiong binary search
+ (instead of linear-search).
+
+2004-11-08 Monday 14:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.6), Linear_System.defs.hh (1.4),
+ Linear_System.inlines.hh (1.5), Makefile.am (1.83), SatMatrix.cc
+ (1.31), SatMatrix.defs.hh (1.36), SatMatrix.inlines.hh (1.23),
+ swapping_sort.icc (1.1): Added a simplified version of the STL
+ sorting algorithm that avoids (almost all) copies of objects by
+ performing more swaps. The new algorithm is used when sorting
+ Linear_System and SatMatrix objects. The same algorithm is also
+ used to provide a new implementation of method
+ Linear_System::sort_and_remove_with_sat(SatMatrix& sat); by
+ defining an iterator on Linear_System that mimics on the
+ SatMatrix all the swaps made on the Linear_System.
+
+2004-11-08 Monday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.6), expected_int16_a (1.1),
+ expected_int32_a (1.1), expected_int64_a (1.1), expected_int8_a
+ (1.1), expected_mpz_a (1.1): Not all the examples can be tested
+ with assertions enabled.
+
+2004-11-08 Monday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.14): Logic simplified.
+
+2004-11-08 Monday 07:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.136): In Cygwin, /usr/include/mingw contains
+ header files that conflict with those in /usr/include: cannot add
+ the former to the include path list.
+
+2004-11-08 Monday 07:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (1.8): Previous change reverted.
+
+2004-11-08 Monday 00:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.135), src/checked_float.inlines.hh (1.7): Support
+ for Cygwin improved.
+
+2004-11-07 Sunday 17:59 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.6): Dirty tricks due to
+ ppl_install.hh generation weirdness.
+
+2004-11-07 Sunday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.35): Erase the right
+ temporary file.
+
+2004-11-07 Sunday 16:10 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.5): Added support for non C99
+ conformant Cygwin.
+
+2004-11-07 Sunday 15:55 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (1.4): Avoided endian.h inclusion.
+
+2004-11-07 Sunday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/expected_int8 (1.2), ppl_lpsol/expected_int8
+ (1.2): Adapted to the fixed output of 8-bits integers.
+
+2004-11-07 Sunday 11:09 Abramo Bagnara
+
+ * src/: Checked_Number.inlines.hh (1.5), checked.defs.hh (1.3),
+ checked.inlines.hh (1.3), checked_float.inlines.hh (1.3),
+ checked_int.inlines.hh (1.5), checked_mpq.inlines.hh (1.4),
+ checked_mpz.inlines.hh (1.4): Added support for I/O
+ specialization.
+
+2004-11-06 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.5), expected (1.3): The
+ `expected' file is now obsolete.
+
+2004-11-06 Saturday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.27): Distribute all the
+ expected* files.
+
+2004-11-06 Saturday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.134): Bumped version number.
+
+2004-11-06 Saturday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.122): Mention the bug fixed in
+ Polyhedron::map_space_dimensions().
+
+2004-11-06 Saturday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.inlines.hh (1.4), tests/Makefile.am (1.232),
+ tests/mapspacedims4.cc (1.1): After the permutation of columns, a
+ linear system must be sign-normalized. The new test program
+ mapspacedims4 shows this phenomenon.
+
+2004-11-06 Saturday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.5), Linear_System.defs.hh (1.3): New
+ method Linear_System::sign_normalize().
+
+2004-11-06 Saturday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lpsol/: Makefile.am (1.4), expected_int16 (1.1),
+ expected_int32 (1.1), expected_int64 (1.1), expected_int8 (1.1),
+ expected_mpz (1.1): Added expected results for the various
+ coeffcient types.
+
+2004-11-06 Saturday 10:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.defs.hh (1.27), src/NNC_Polyhedron.defs.hh
+ (1.29), TODO (1.111): Documented the std::length exceptions that
+ can be thrown by constructors.
+
+2004-11-04 Thursday 13:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/Makefile.am (1.5): Re-add `ppl_lpsol' to `SUBDIRS'.
+
+2004-11-04 Thursday 13:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.13): Distribute the expected_*
+ files.
+
+2004-11-04 Thursday 10:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.110), doc/definitions.dox (1.161), doc/ppl.sty (1.17),
+ interfaces/Prolog/Prolog_interface.dox (1.116): Explained the
+ order of arguments in widening applications. Better explained
+ the reason for having C_Polyhedron and NNC_Polyhedron.
+
+2004-11-02 Tuesday 17:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/exceptions3.cc (1.4): Checking the detection of space
+ dimension overflows in methods changing teh dimension of a
+ polyhedron.
+
+2004-11-02 Tuesday 17:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/maxspacedim1.cc (1.2): Testing the max_space_dimension()
+ methods on Constraint and Generator.
+
+2004-11-02 Tuesday 17:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.21): Corrected exception message.
+
+2004-11-02 Tuesday 17:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.92), Constraint.inlines.hh (1.53),
+ Generator.defs.hh (1.92), Generator.inlines.hh (1.47): Added
+ static method max_space_dimension() to classes Constraint and
+ Generator.
+
+2004-11-02 Tuesday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Native_Integer.inlines.hh (1.4): Added several constructors.
+
+2004-11-02 Tuesday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/affineimage9.cc (1.2): A spurious dot resulted into an
+ unknown floating point constant: fixed.
+
+2004-11-02 Tuesday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_int.inlines.hh (1.4): Include <cstdlib> for strtol(),
+ strtoul(), strtoll() and strtoull().
+
+2004-11-02 Tuesday 12:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.133), m4/ac_cxx_long_double.m4 (1.2): Amended to
+ check whether the C++ compiler provides long double numbers that
+ have bigger range or precision than double.
+
+2004-11-02 Tuesday 12:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Native_Integer.defs.hh (1.3), Native_Integer.inlines.hh
+ (1.3): Reorganized. All friend declarations removed.
+
+2004-11-02 Tuesday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Number.defs.hh (1.3), Checked_Number.inlines.hh
+ (1.4), Checked_Number.types.hh (1.3): Minor changes to adhere to
+ our coding conventions. Added declarations for template
+ <typename T, typename Policy> const T& raw_value(const
+ Checked_Number<T, Policy>& x) and template <typename T, typename
+ Policy> T& raw_value(Checked_Number<T, Policy>& x).
+
+2004-11-02 Tuesday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.231): The programs equals1 and nnc_equals1
+ fail also with 32-bits integers.
+
+2004-11-01 Monday 20:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.132), m4/Makefile.am (1.11),
+ m4/ac_cxx_long_double.m4 (1.1), m4/ac_cxx_long_long.m4 (1.1): New
+ Autoconf tests to check whether the C++ compiler supports long
+ long integers and long double numbers.
+
+2004-11-01 Monday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.230), equals1.cc (1.1): Test
+ operator==(const Polyhedron&, const Polyhedron&).
+
+2004-11-01 Monday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.6), compile (1.3), config.guess (1.25), install-sh
+ (1.11), Watchdog/INSTALL (1.3), Watchdog/compile (1.3),
+ Watchdog/config.guess (1.9), Watchdog/install-sh (1.8): Updated
+ from Automake 1.9.3.
+
+2004-11-01 Monday 11:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.4): Fixed a problem introduced with the
+ previous commit.
+
+2004-11-01 Monday 10:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.cc (1.3): Two FIXMEs dealt with.
+
+2004-11-01 Monday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.defs.hh (1.61): FIXME added.
+
+2004-10-30 Saturday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.71), Row.inlines.hh (1.51): Fixed a bug in
+ Row::shrink() that could bite (but not with the current code)
+ when using compilers not supporting flexible arrays.
+
+2004-10-30 Saturday 12:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.131): Check for endianness.
+
+2004-10-29 Friday 19:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.229), maxspacedim1.cc (1.1): Test the
+ *::max_space_dimension() methods.
+
+2004-10-29 Friday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked_mpq.inlines.hh (1.3), checked_mpz.inlines.hh (1.3):
+ Spurious semicolons removed.
+
+2004-10-29 Friday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Linear_System.inlines.hh (1.3): Make sure
+ Linear_System::is_sorted() and Linear_System::set_sorted() are
+ defined before being used.
+
+2004-10-29 Friday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.69): Meaningless type qualifier
+ removed.
+
+2004-10-29 Friday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.13), demos/ppl_lcdd/Makefile.am (1.12),
+ demos/ppl_lpsol/Makefile.am (1.3),
+ interfaces/Prolog/Ciao/Makefile.am (1.34),
+ interfaces/Prolog/GNU/Makefile.am (1.40),
+ interfaces/Prolog/SICStus/Makefile.am (1.46),
+ interfaces/Prolog/XSB/Makefile.am (1.26),
+ interfaces/Prolog/YAP/Makefile.am (1.30), tests/Makefile.am
+ (1.228): Always specify the condition which is closed by an
+ Automake's `end',
+
+2004-10-29 Friday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.11): Run `ppl_lcdd' in the local
+ directory, not some other executable with the same name.
+
+2004-10-28 Thursday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, TODO, configure.ac, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/expected, demos/ppl_lcdd/expected_int16,
+ demos/ppl_lcdd/expected_int16_a, demos/ppl_lcdd/expected_int32,
+ demos/ppl_lcdd/expected_int32_a, demos/ppl_lcdd/expected_int64,
+ demos/ppl_lcdd/expected_int64_a, demos/ppl_lcdd/expected_int8,
+ demos/ppl_lcdd/expected_int8_a, demos/ppl_lcdd/expected_mpz,
+ demos/ppl_lcdd/expected_mpz_a, demos/ppl_lcdd/ppl_lcdd.cc,
+ doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/ack.clpq, interfaces/Prolog/ackn.clpq,
+ interfaces/Prolog/check_script, interfaces/Prolog/check_script2,
+ interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+ interfaces/Prolog/expected, interfaces/Prolog/expected2,
+ interfaces/Prolog/expected3, interfaces/Prolog/fib.clpq,
+ interfaces/Prolog/mc91.clpq, interfaces/Prolog/pl_check.pl,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/schedule.clpq, interfaces/Prolog/smm.clpq,
+ interfaces/Prolog/smmdiff.clpq, interfaces/Prolog/sumto.clpq,
+ interfaces/Prolog/tak.clpq, interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ppl_ciao.cc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SICStus/sp_clpq.pl,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/SWI/pl_clpq.pl,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+ interfaces/Prolog/XSB/expected2_int16,
+ interfaces/Prolog/XSB/expected2_int16_a,
+ interfaces/Prolog/XSB/expected2_int32,
+ interfaces/Prolog/XSB/expected2_int32_a,
+ interfaces/Prolog/XSB/expected2_int64,
+ interfaces/Prolog/XSB/expected2_int64_a,
+ interfaces/Prolog/XSB/expected2_int8,
+ interfaces/Prolog/XSB/expected2_int8_a,
+ interfaces/Prolog/XSB/expected2_mpz,
+ interfaces/Prolog/XSB/expected2_mpz_a,
+ interfaces/Prolog/XSB/expected3_int16,
+ interfaces/Prolog/XSB/expected3_int16_a,
+ interfaces/Prolog/XSB/expected3_int32,
+ interfaces/Prolog/XSB/expected3_int32_a,
+ interfaces/Prolog/XSB/expected3_int64,
+ interfaces/Prolog/XSB/expected3_int64_a,
+ interfaces/Prolog/XSB/expected3_int8,
+ interfaces/Prolog/XSB/expected3_int8_a,
+ interfaces/Prolog/XSB/expected3_mpz,
+ interfaces/Prolog/XSB/expected3_mpz_a,
+ interfaces/Prolog/XSB/expected_int16,
+ interfaces/Prolog/XSB/expected_int16_a,
+ interfaces/Prolog/XSB/expected_int32,
+ interfaces/Prolog/XSB/expected_int32_a,
+ interfaces/Prolog/XSB/expected_int64,
+ interfaces/Prolog/XSB/expected_int64_a,
+ interfaces/Prolog/XSB/expected_int8,
+ interfaces/Prolog/XSB/expected_int8_a,
+ interfaces/Prolog/XSB/expected_mpz,
+ interfaces/Prolog/XSB/expected_mpz_a,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/Makefile.am,
+ interfaces/Prolog/YAP/ppl_yap.cc,
+ interfaces/Prolog/YAP/yap_clpq.pl,
+ interfaces/Prolog/YAP/yap_clpq2.pl,
+ interfaces/Prolog/YAP/yap_pl_check.pl,
+ interfaces/Prolog/tests/.cvsignore,
+ interfaces/Prolog/tests/Makefile.am,
+ interfaces/Prolog/tests/ack.clpq,
+ interfaces/Prolog/tests/ackn.clpq,
+ interfaces/Prolog/tests/check_script,
+ interfaces/Prolog/tests/check_script2,
+ interfaces/Prolog/tests/check_script2_int8,
+ interfaces/Prolog/tests/clpq.pl,
+ interfaces/Prolog/tests/clpq2.pl,
+ interfaces/Prolog/tests/expected2_int16,
+ interfaces/Prolog/tests/expected2_int16_a,
+ interfaces/Prolog/tests/expected2_int32,
+ interfaces/Prolog/tests/expected2_int32_a,
+ interfaces/Prolog/tests/expected2_int64,
+ interfaces/Prolog/tests/expected2_int64_a,
+ interfaces/Prolog/tests/expected2_int8,
+ interfaces/Prolog/tests/expected2_int8_a,
+ interfaces/Prolog/tests/expected2_mpz,
+ interfaces/Prolog/tests/expected2_mpz_a,
+ interfaces/Prolog/tests/expected3_int16,
+ interfaces/Prolog/tests/expected3_int16_a,
+ interfaces/Prolog/tests/expected3_int32,
+ interfaces/Prolog/tests/expected3_int32_a,
+ interfaces/Prolog/tests/expected3_int64,
+ interfaces/Prolog/tests/expected3_int64_a,
+ interfaces/Prolog/tests/expected3_int8,
+ interfaces/Prolog/tests/expected3_int8_a,
+ interfaces/Prolog/tests/expected3_mpz,
+ interfaces/Prolog/tests/expected3_mpz_a,
+ interfaces/Prolog/tests/expected_int16,
+ interfaces/Prolog/tests/expected_int16_a,
+ interfaces/Prolog/tests/expected_int32,
+ interfaces/Prolog/tests/expected_int32_a,
+ interfaces/Prolog/tests/expected_int64,
+ interfaces/Prolog/tests/expected_int64_a,
+ interfaces/Prolog/tests/expected_int8,
+ interfaces/Prolog/tests/expected_int8_a,
+ interfaces/Prolog/tests/expected_mpz,
+ interfaces/Prolog/tests/expected_mpz_a,
+ interfaces/Prolog/tests/fib.clpq,
+ interfaces/Prolog/tests/mc91.clpq,
+ interfaces/Prolog/tests/pl_check.pl,
+ interfaces/Prolog/tests/schedule.clpq,
+ interfaces/Prolog/tests/smm.clpq,
+ interfaces/Prolog/tests/smmdiff.clpq,
+ interfaces/Prolog/tests/sumto.clpq,
+ interfaces/Prolog/tests/tak.clpq, m4/ac_check_gmp.m4,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/LinExpression.cc,
+ src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+ src/Linear_Row.cc, src/Linear_Row.defs.hh,
+ src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+ src/Linear_System.cc, src/Linear_System.defs.hh,
+ src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/Matrix.inlines.hh, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Row.cc, src/Row.defs.hh,
+ src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+ src/SatMatrix.inlines.hh, src/Variable.defs.hh,
+ src/Variable.inlines.hh, src/conversion.cc, src/globals.defs.hh,
+ src/globals.inlines.hh, src/max_space_dimension.hh,
+ src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+ tests/addgenerator1.cc, tests/addgenerator2.cc,
+ tests/addgenerator5.cc, tests/addgenerators11.cc,
+ tests/addspacedims10.cc, tests/affineimage9.cc,
+ tests/bhrz03widening9.cc, tests/ehandlers.hh,
+ tests/exceptions2.cc, tests/exceptions3.cc, tests/generators2.cc,
+ tests/geomcovers1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+ tests/randphull1.cc
+ (altnum.[4,4,9,4,3,1,1,1,1,1,1,1,1,1,1,7,4,4,4,4,2,2,5,3,1,4,1,1,1,1,2,2,2,2,1,1,1,3,5,1,1,1,1,1,3,3,3,2,2,4,1,2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,4,5,2,2,5,3,5,5,1,4,5,3,2,3,2,1,1,1,1,1,1,1,1,12,4,3,1,2,2,1,5,5,3,7,5,3,4,3,2,2,1,3,1,5,3,2,2,3,3,5,2,2,1,2,2,1,1,1,2,2,1,1,1,1,1]):
+ Fourth merge from main trunk.
+
+2004-10-28 Thursday 18:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.8), globals.inlines.hh (1.4):
+ Implementation of not_a_dimension() and maybe_abandon() moved to
+ global.inlines.hh.
+
+2004-10-28 Thursday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.defs.hh (1.7), globals.inlines.hh (1.3):
+ Implementation of compute_capacity() moved to global.inlines.hh.
+
+2004-10-28 Thursday 17:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_System.cc (1.2), Matrix.cc (1.78), Matrix.inlines.hh
+ (1.40), Row.cc (1.70), Row.inlines.hh (1.50), SatMatrix.cc
+ (1.30), SatMatrix.defs.hh (1.35), SatMatrix.inlines.hh (1.22),
+ globals.defs.hh (1.6): Avoid overflows when computing capacities
+ for speculative memory allocations. Added missing assertions on
+ (user-unavailable) methods creating or extending data structures.
+
+2004-10-28 Thursday 08:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.19): Simplified the detection of
+ sizeof(mp_limb_t): this works with Autoconf version 2.50 or
+ higher (we already require 2.59 or higher).
+
+2004-10-28 Thursday 08:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.18): Second test program improved.
+
+2004-10-28 Thursday 07:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.121), configure.ac (1.130), interfaces/C/ppl_c.h.in
+ (1.36), m4/ac_check_gmp.m4 (1.17): We now require GMP 4.1.3 or
+ higher.
+
+2004-10-27 Wednesday 16:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.68), Variable.defs.hh (1.40): The
+ new exceptions thrown by Variable and LinExpression are now
+ mentioned in the documentation.
+
+2004-10-27 Wednesday 12:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.inlines.hh (1.35), GenSys.inlines.hh (1.35),
+ Linear_System.defs.hh (1.2), Linear_System.inlines.hh (1.2):
+ Added static method Linear_System::max_space_dimension().
+ Corresponding methods of ConSys and GenSys are now implemented
+ using this one.
+
+2004-10-27 Wednesday 12:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.43), Constraint.inlines.hh (1.52),
+ Generator.cc (1.54), Generator.inlines.hh (1.46),
+ Polyhedron.defs.hh (1.251), Polyhedron_chdims.cc (1.20),
+ Polyhedron_nonpublic.cc (1.32), Polyhedron_public.cc (1.36):
+ Exploit the availability of Variable::space_dimension().
+
+2004-10-27 Wednesday 12:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Linear_Row.defs.hh (1.3), Linear_Row.inlines.hh (1.3):
+ Implemented method max_space_dimension().
+
+2004-10-27 Wednesday 12:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/exceptions3.cc (1.3): Now also checking for exceptions
+ thrown by Variable and LinExpression when exceeding the maximum
+ space dimension.
+
+2004-10-27 Wednesday 12:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.cc (1.23), LinExpression.defs.hh (1.67),
+ LinExpression.inlines.hh (1.32): Added method
+ max_space_dimension(). Checking for space dimension overflows
+ when building a LinExpression.
+
+2004-10-27 Wednesday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Variable.defs.hh (1.39), Variable.inlines.hh (1.19): Added
+ methods space_dimension() and max_space_dimension() to class
+ Variable. The constructor now checks for space dimension
+ overflows.
+
+2004-10-26 Tuesday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.227): Take into account that some tests with
+ checked-int8 fail only when assertions are enabled.
+
+2004-10-26 Tuesday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ehandlers.hh (1.9): Treat std::overflow_error specially.
+
+2004-10-26 Tuesday 18:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.115): Information about
+ system-dependent features for the Prolog interface updated.
+
+2004-10-26 Tuesday 18:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.74), GenSys.cc (1.100): Try to correctly deal
+ with systems having no rows and possibly 0 columns.
+
+2004-10-26 Tuesday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.39), tests/Makefile.am
+ (1.2), tests/check_script2_int8 (1.1): Temporary kludge to avoid
+ GNU Prolog's syntax errors when using clpq2 with checked-int8
+ coefficients.
+
+2004-10-26 Tuesday 14:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SWI/pl_clpq.pl (1.6): Temporary work-around to
+ avoid a problem with the Prolog prompt whenusing SWI-Prolog.
+
+2004-10-26 Tuesday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.15), user.tex (1.16): Use
+ \renewcommand{\footrulewidth}{0.4pt} instead of
+ \setlength{\footrulewidth}{0.4pt}.
+
+2004-10-26 Tuesday 10:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.109): The last XFAILS has been dealt with (the only
+ XFAILS remaining are those related to checked integers).
+
+2004-10-26 Tuesday 10:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.160): Typo corrected. Also stressed that
+ NNC polyhedra have to be used only when actually needed.
+
+2004-10-26 Tuesday 10:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.120), tests/Makefile.am (1.226), tests/addgenerators11.cc
+ (1.9), tests/exceptions2.cc (1.34): Test addgenerators11 is no
+ longer in the XFAIL list. Modified test2() in exceptions2.cc so
+ as to no longer guard against an unwanted exception. While at
+ it, reordered the tests in Makefile.am so as to follow the
+ alphabetical order. The corrected bug announced in the NEWS
+ file.
+
+2004-10-26 Tuesday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.99), GenSys.defs.hh (1.104): Private mathod
+ bool GenSys::has_closure_points() const; now behaves assuming the
+ point of view of the user, i.e., disregarding those closure
+ points that are matched by corresponding points. Fixed a bug in
+ private method void
+ GenSys::adjust_topology_and_space_dimension(...); whereby an
+ unwanted exception was thrown when converting an NNC generator
+ system into a C generator system. This correction also makes test
+ addgenerators11 behave correctly (i.e., no longer XFAILS).
+
+2004-10-25 Monday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected3_mpz (1.1): New and revised
+ expectations.
+
+2004-10-25 Monday 17:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.33): Pathname fixed.
+
+2004-10-25 Monday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.119), TODO (1.108), src/C_Polyhedron.defs.hh (1.26),
+ src/ConSys.defs.hh (1.90), src/GenSys.defs.hh (1.103),
+ src/NNC_Polyhedron.defs.hh (1.28), tests/bhrz03widening9.cc
+ (1.7): Avoid implicit constructors (except in very special
+ cases).
+
+2004-10-25 Monday 13:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.107): Added another item related to non-explicit
+ constructors.
+
+2004-10-25 Monday 10:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected_int16 (1.1),
+ interfaces/Prolog/XSB/expected2_int16 (1.2),
+ interfaces/Prolog/XSB/expected3_int16 (1.1),
+ interfaces/Prolog/tests/expected2_int16 (1.2): New and revised
+ expectations.
+
+2004-10-25 Monday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected_int8 (1.1),
+ interfaces/Prolog/XSB/expected3_int8 (1.1),
+ interfaces/Prolog/tests/expected3_int8 (1.2): New and revised
+ expectations.
+
+2004-10-25 Monday 10:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected_int64 (1.1),
+ interfaces/Prolog/XSB/expected2_int32 (1.2),
+ interfaces/Prolog/XSB/expected3_int32 (1.1),
+ interfaces/Prolog/XSB/expected3_int64 (1.1),
+ interfaces/Prolog/tests/expected2_int32 (1.2),
+ interfaces/Prolog/tests/expected3_int64 (1.2): New and revised
+ expectations.
+
+2004-10-25 Monday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.129), interfaces/Prolog/Makefile.am (1.26),
+ interfaces/Prolog/ack.clpq (1.2), interfaces/Prolog/ackn.clpq
+ (1.2), interfaces/Prolog/check_script (1.4),
+ interfaces/Prolog/check_script2 (1.3), interfaces/Prolog/clpq.pl
+ (1.18), interfaces/Prolog/clpq2.pl (1.29),
+ interfaces/Prolog/expected2_int16 (1.2),
+ interfaces/Prolog/expected2_int32 (1.2),
+ interfaces/Prolog/expected2_int64 (1.2),
+ interfaces/Prolog/expected2_int8 (1.2),
+ interfaces/Prolog/expected2_mpz (1.2),
+ interfaces/Prolog/expected3_int16 (1.2),
+ interfaces/Prolog/expected3_int32 (1.2),
+ interfaces/Prolog/expected3_int64 (1.2),
+ interfaces/Prolog/expected3_int8 (1.3),
+ interfaces/Prolog/expected3_mpz (1.2),
+ interfaces/Prolog/expected_int16 (1.2),
+ interfaces/Prolog/expected_int32 (1.2),
+ interfaces/Prolog/expected_int64 (1.2),
+ interfaces/Prolog/expected_int8 (1.2),
+ interfaces/Prolog/expected_mpz (1.2), interfaces/Prolog/fib.clpq
+ (1.2), interfaces/Prolog/mc91.clpq (1.2),
+ interfaces/Prolog/pl_check.pl (1.103),
+ interfaces/Prolog/schedule.clpq (1.4), interfaces/Prolog/smm.clpq
+ (1.2), interfaces/Prolog/smmdiff.clpq (1.2),
+ interfaces/Prolog/sumto.clpq (1.2), interfaces/Prolog/tak.clpq
+ (1.2), interfaces/Prolog/Ciao/Makefile.am (1.32),
+ interfaces/Prolog/GNU/Makefile.am (1.38),
+ interfaces/Prolog/SICStus/Makefile.am (1.45),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.10),
+ interfaces/Prolog/SWI/Makefile.am (1.38),
+ interfaces/Prolog/XSB/Makefile.am (1.25),
+ interfaces/Prolog/XSB/expected2_int16_a (1.1),
+ interfaces/Prolog/XSB/expected2_int32_a (1.1),
+ interfaces/Prolog/XSB/expected2_int64_a (1.1),
+ interfaces/Prolog/XSB/expected2_int8_a (1.1),
+ interfaces/Prolog/XSB/expected2_mpz_a (1.1),
+ interfaces/Prolog/XSB/expected3_int16_a (1.1),
+ interfaces/Prolog/XSB/expected3_int32_a (1.1),
+ interfaces/Prolog/XSB/expected3_int64_a (1.1),
+ interfaces/Prolog/XSB/expected3_int8_a (1.1),
+ interfaces/Prolog/XSB/expected3_mpz_a (1.1),
+ interfaces/Prolog/XSB/expected_int16_a (1.1),
+ interfaces/Prolog/XSB/expected_int32_a (1.1),
+ interfaces/Prolog/XSB/expected_int64_a (1.1),
+ interfaces/Prolog/XSB/expected_int8_a (1.1),
+ interfaces/Prolog/XSB/expected_mpz_a (1.1),
+ interfaces/Prolog/YAP/Makefile.am (1.29),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.8),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.4),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.6),
+ interfaces/Prolog/tests/.cvsignore (1.1),
+ interfaces/Prolog/tests/Makefile.am (1.1),
+ interfaces/Prolog/tests/ack.clpq (1.1),
+ interfaces/Prolog/tests/ackn.clpq (1.1),
+ interfaces/Prolog/tests/check_script (1.1),
+ interfaces/Prolog/tests/check_script2 (1.1),
+ interfaces/Prolog/tests/clpq.pl (1.1),
+ interfaces/Prolog/tests/clpq2.pl (1.1),
+ interfaces/Prolog/tests/expected2_int16 (1.1),
+ interfaces/Prolog/tests/expected2_int16_a (1.1),
+ interfaces/Prolog/tests/expected2_int32 (1.1),
+ interfaces/Prolog/tests/expected2_int32_a (1.1),
+ interfaces/Prolog/tests/expected2_int64 (1.1),
+ interfaces/Prolog/tests/expected2_int64_a (1.1),
+ interfaces/Prolog/tests/expected2_int8 (1.1),
+ interfaces/Prolog/tests/expected2_int8_a (1.1),
+ interfaces/Prolog/tests/expected2_mpz (1.1),
+ interfaces/Prolog/tests/expected2_mpz_a (1.1),
+ interfaces/Prolog/tests/expected3_int16 (1.1),
+ interfaces/Prolog/tests/expected3_int16_a (1.1),
+ interfaces/Prolog/tests/expected3_int32 (1.1),
+ interfaces/Prolog/tests/expected3_int32_a (1.1),
+ interfaces/Prolog/tests/expected3_int64 (1.1),
+ interfaces/Prolog/tests/expected3_int64_a (1.1),
+ interfaces/Prolog/tests/expected3_int8 (1.1),
+ interfaces/Prolog/tests/expected3_int8_a (1.1),
+ interfaces/Prolog/tests/expected3_mpz (1.1),
+ interfaces/Prolog/tests/expected3_mpz_a (1.1),
+ interfaces/Prolog/tests/expected_int16 (1.1),
+ interfaces/Prolog/tests/expected_int16_a (1.1),
+ interfaces/Prolog/tests/expected_int32 (1.1),
+ interfaces/Prolog/tests/expected_int32_a (1.1),
+ interfaces/Prolog/tests/expected_int64 (1.1),
+ interfaces/Prolog/tests/expected_int64_a (1.1),
+ interfaces/Prolog/tests/expected_int8 (1.1),
+ interfaces/Prolog/tests/expected_int8_a (1.1),
+ interfaces/Prolog/tests/expected_mpz (1.1),
+ interfaces/Prolog/tests/expected_mpz_a (1.1),
+ interfaces/Prolog/tests/fib.clpq (1.1),
+ interfaces/Prolog/tests/mc91.clpq (1.1),
+ interfaces/Prolog/tests/pl_check.pl (1.1),
+ interfaces/Prolog/tests/schedule.clpq (1.1),
+ interfaces/Prolog/tests/smm.clpq (1.1),
+ interfaces/Prolog/tests/smmdiff.clpq (1.1),
+ interfaces/Prolog/tests/sumto.clpq (1.1),
+ interfaces/Prolog/tests/tak.clpq (1.1): Prolog tests reorganized.
+
+2004-10-24 Sunday 22:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.128), demos/ppl_lcdd/Makefile.am (1.10),
+ demos/ppl_lcdd/expected (1.4), demos/ppl_lcdd/expected_a (1.2),
+ demos/ppl_lcdd/expected_int16_a (1.1),
+ demos/ppl_lcdd/expected_int32 (1.1),
+ demos/ppl_lcdd/expected_int32_a (1.1),
+ demos/ppl_lcdd/expected_int64_a (1.1),
+ demos/ppl_lcdd/expected_int8_a (1.1), demos/ppl_lcdd/expected_mpz
+ (1.1), demos/ppl_lcdd/expected_mpz_a (1.1),
+ interfaces/Prolog/Makefile.am (1.25), interfaces/Prolog/expected
+ (1.8), interfaces/Prolog/expected2 (1.13),
+ interfaces/Prolog/expected2_int16 (1.1),
+ interfaces/Prolog/expected2_int32 (1.1),
+ interfaces/Prolog/expected2_int64 (1.1),
+ interfaces/Prolog/expected2_mpz (1.1),
+ interfaces/Prolog/expected3 (1.2),
+ interfaces/Prolog/expected3_int16 (1.1),
+ interfaces/Prolog/expected3_int32 (1.1),
+ interfaces/Prolog/expected3_int64 (1.1),
+ interfaces/Prolog/expected3_mpz (1.1),
+ interfaces/Prolog/expected_int16 (1.1),
+ interfaces/Prolog/expected_int32 (1.1),
+ interfaces/Prolog/expected_int64 (1.1),
+ interfaces/Prolog/expected_mpz (1.1),
+ interfaces/Prolog/Ciao/Makefile.am (1.31),
+ interfaces/Prolog/GNU/Makefile.am (1.37),
+ interfaces/Prolog/SICStus/Makefile.am (1.44),
+ interfaces/Prolog/SWI/Makefile.am (1.37),
+ interfaces/Prolog/XSB/Makefile.am (1.24),
+ interfaces/Prolog/XSB/expected (1.9),
+ interfaces/Prolog/XSB/expected2 (1.11),
+ interfaces/Prolog/XSB/expected2_int16 (1.1),
+ interfaces/Prolog/XSB/expected2_int32 (1.1),
+ interfaces/Prolog/XSB/expected2_int64 (1.1),
+ interfaces/Prolog/XSB/expected2_mpz (1.1),
+ interfaces/Prolog/XSB/expected_int16 (1.1),
+ interfaces/Prolog/XSB/expected_int32 (1.1),
+ interfaces/Prolog/XSB/expected_int64 (1.1),
+ interfaces/Prolog/XSB/expected_mpz (1.1),
+ interfaces/Prolog/YAP/Makefile.am (1.28): Another step toward the
+ generalization of the regression testing mechanisms.
+
+2004-10-24 Sunday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.33): Print more about which kind of
+ arithmetic overflow occurred.
+
+2004-10-24 Sunday 16:38 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (1.3): Generate overflow exception
+ instead of inappropriate domain one.
+
+2004-10-24 Sunday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: expected3_int8 (1.2), SWI/Makefile.am (1.36),
+ XSB/Makefile.am (1.23), XSB/expected2_int8 (1.1),
+ XSB/expected_int8 (1.1): More infrastructure to conditionalize
+ our expectations about the tests outcome on the kind of
+ coefficients we use.
+
+2004-10-24 Sunday 12:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.102): Catch all exceptions.
+
+2004-10-24 Sunday 12:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.66):
+ Integer_to_integer_term() fixed.
+
+2004-10-24 Sunday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.101): Variable name clash
+ removed: this was causing XSB to crash (due to one of its many
+ bugs).
+
+2004-10-24 Sunday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.127), interfaces/Prolog/expected2_int8 (1.1),
+ interfaces/Prolog/expected3_int8 (1.1),
+ interfaces/Prolog/expected_int8 (1.1),
+ interfaces/Prolog/Ciao/Makefile.am (1.30),
+ interfaces/Prolog/GNU/Makefile.am (1.36),
+ interfaces/Prolog/SICStus/Makefile.am (1.43),
+ interfaces/Prolog/YAP/Makefile.am (1.27): Started adding some
+ infrastructure so as to conditionalize our expectations about the
+ tests outcome on the kind of coefficients used.
+
+2004-10-24 Sunday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.225), geomcovers1.cc (1.1): New test for
+ Polyhedra_Powerset<PH>::geometrically_covers().
+
+2004-10-24 Sunday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.106): Added a new item.
+
+2004-10-23 Saturday 23:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.28): Fail gracefully in those cases
+ where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq.pl (1.17): Fail gracefully in those cases
+ where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.139): Handle
+ std::overflow_error.
+
+2004-10-21 Thursday 20:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.23): Be quiet.
+
+2004-10-21 Thursday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.224): The definition of XFAIL_TESTS now
+ takes into account the type of coefficients being used.
+
+2004-10-21 Thursday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.126): Introduced new Automake variables that
+ allow to keep track of the type of coefficients being used.
+
+2004-10-21 Thursday 13:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/randphull1.cc (1.11): Fixed to allow for generic
+ coefficients.
+
+2004-10-21 Thursday 11:59 Abramo Bagnara
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.26): Generalized string
+ conversion.
+
+2004-10-20 Wednesday 20:00 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (1.3): Use signed explicitly.
+
+2004-10-20 Wednesday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/: Makefile.am (1.9), expected_a (1.1): Exclude
+ examples that are too heavy when assertions are enabled.
+
+2004-10-20 Wednesday 18:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.125): Introduced new Automake conditional
+ ASSERTIONS_ENABLED.
+
+2004-10-20 Wednesday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.105): We now allow the specification of alternative
+ coefficient implementations.
+
+2004-10-20 Wednesday 15:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.104): The bug concerning empty generator systems has been
+ fixed.
+
+2004-10-20 Wednesday 13:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.223): Added nnc_randphull1 and
+ nnc_randphull2 to DERIVED_TESTS.
+
+2004-10-19 Tuesday 22:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.14), configure.ac (1.124), demos/Makefile.am (1.4),
+ demos/ppl_lcdd/ppl_lcdd.cc (1.32),
+ doc/devref-browse.doxyconf-latex.in (1.46),
+ doc/devref-print.doxyconf-latex.in (1.46),
+ doc/devref.doxyconf-html.in (1.46), interfaces/C/ppl_c.cc
+ (1.113), interfaces/Prolog/ppl_prolog.icc (1.138),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.25),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.21),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.65),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.90),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.57),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.83), src/BoundingBox.defs.hh
+ (1.14), src/BoundingBox.inlines.hh (1.13),
+ src/Checked_Number.defs.hh (1.2), src/Checked_Number.inlines.hh
+ (1.2), src/Checked_Number.types.hh (1.2), src/ConSys.cc (1.73),
+ src/ConSys.defs.hh (1.89), src/Constraint.defs.hh (1.91),
+ src/Constraint.inlines.hh (1.51), src/GMP_Integer.defs.hh (1.2),
+ src/GMP_Integer.inlines.hh (1.2), src/GMP_Integer.types.hh (1.2),
+ src/GenSys.cc (1.98), src/GenSys.defs.hh (1.102),
+ src/Generator.cc (1.53), src/Generator.defs.hh (1.91),
+ src/Generator.inlines.hh (1.45), src/Integer.defs.hh (1.14),
+ src/Integer.inlines.hh (1.13), src/Integer.types.hh (1.9),
+ src/Integer_macros.hh (1.2), src/Integer_traits_template.hh
+ (1.2), src/Interval.defs.hh (1.17), src/Interval.inlines.hh
+ (1.13), src/Limits.hh (1.2), src/LinExpression.cc (1.22),
+ src/LinExpression.defs.hh (1.66), src/LinExpression.inlines.hh
+ (1.31), src/Linear_Row.defs.hh (1.2), src/Linear_Row.inlines.hh
+ (1.2), src/Makefile.am (1.82), src/Native_Integer.defs.hh (1.2),
+ src/Native_Integer.inlines.hh (1.2), src/Native_Integer.types.hh
+ (1.2), src/Polyhedron.defs.hh (1.250), src/Polyhedron.inlines.hh
+ (1.98), src/Polyhedron_nonpublic.cc (1.31),
+ src/Polyhedron_public.cc (1.35), src/Polyhedron_widenings.cc
+ (1.32), src/Row.defs.hh (1.84), src/Row.inlines.hh (1.49),
+ src/checked.defs.hh (1.2), src/checked.inlines.hh (1.2),
+ src/checked_float.inlines.hh (1.2), src/checked_int.inlines.hh
+ (1.2), src/checked_mpq.inlines.hh (1.2),
+ src/checked_mpz.inlines.hh (1.2), src/conversion.cc (1.63),
+ src/float.types.hh (1.2), src/globals.defs.hh (1.5),
+ tests/BBox.cc (1.5), tests/BBox.hh (1.4), tests/Makefile.am
+ (1.222), tests/dualhypercubes.cc (1.5): First merge from the
+ `altnum' branch.
+
+2004-10-19 Tuesday 22:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.100), Ciao/ppl_ciao.pl (1.71):
+ Correction to ciao interface so it now allows for prolog failure
+ for ppl_Polyhedron_map_space_dimensions/2 and
+ ppl_Polyhedron_fold_dimensions/3.
+
+ Negative tests for ppl_Polyhedron_map_space_dimensions/2 that
+ caused make check when using pl_check.pl to fail have now been
+ restored. Now these tests pass with all the Prolog systems.
+
+2004-10-19 Tuesday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.31),
+ doc/devref-browse.doxyconf-latex.in (1.45),
+ doc/devref-print.doxyconf-latex.in (1.45),
+ doc/devref.doxyconf-html.in (1.45), src/ConSys.cc (1.72),
+ src/ConSys.defs.hh (1.88), src/ConSys.inlines.hh (1.34),
+ src/Constraint.cc (1.42), src/Constraint.defs.hh (1.90),
+ src/Constraint.inlines.hh (1.50), src/GenSys.cc (1.97),
+ src/GenSys.defs.hh (1.101), src/GenSys.inlines.hh (1.34),
+ src/Generator.cc (1.52), src/Generator.defs.hh (1.90),
+ src/Generator.inlines.hh (1.44), src/LinExpression.cc (1.21),
+ src/LinExpression.defs.hh (1.65), src/LinExpression.inlines.hh
+ (1.30), src/Linear_Row.cc (1.1), src/Linear_Row.defs.hh (1.1),
+ src/Linear_Row.inlines.hh (1.1), src/Linear_Row.types.hh (1.1),
+ src/Linear_System.cc (1.1), src/Linear_System.defs.hh (1.1),
+ src/Linear_System.inlines.hh (1.1), src/Linear_System.types.hh
+ (1.1), src/Makefile.am (1.81), src/Matrix.cc (1.77),
+ src/Matrix.defs.hh (1.60), src/Matrix.inlines.hh (1.39),
+ src/Ph_Status.cc (1.5), src/Polyhedron.defs.hh (1.249),
+ src/Polyhedron_chdims.cc (1.19), src/Polyhedron_nonpublic.cc
+ (1.30), src/Polyhedron_public.cc (1.34), src/Row.cc (1.69),
+ src/Row.defs.hh (1.83), src/Row.inlines.hh (1.48),
+ src/conversion.cc (1.62), src/globals.defs.hh (1.4),
+ src/globals.inlines.hh (1.2), src/minimize.cc (1.38),
+ src/simplify.cc (1.39): The class Matrix now represents a simple
+ matrix of coefficients that is organized in rows, represented by
+ the class Row. Matrix and Row take care of all the memory
+ allocation details and little more. They are specialized by
+ classes Linear_Row and Linear_System that, in turn constitute the
+ basis upon which constraints, generators and systems thereof are
+ built upon. Several methods that were no longer needed have been
+ removed. Several methods have been given more sensible names and
+ interfaces.
+
+2004-10-19 Tuesday 16:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.99): Tests causing "make check"
+ to fail in Ciao and GNU Prolog temporarily disabled. Now "make
+ check" in all the prolog interfaces succeeds.
+
+2004-10-19 Tuesday 11:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.98): More tests added so as to
+ test the Prolog interface more exhaustively.
+
+ However, because of the more thorough testing, bugs in the Ciao
+ Prolog and GNU Prolog interfaces have been exposed; as a result
+ the "make check" for Ciao Prolog and GNU Prolog now fails.
+
+2004-10-17 Sunday 21:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.112): Fixed a couple of indentation
+ glitches.
+
+2004-10-17 Sunday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.inlines.hh (1.19), NNC_Polyhedron.inlines.hh
+ (1.22): Simplified all constructors that need to check for
+ dimension overflows removing, at the same time, the previous
+ requirement imposed on the BoundingBox template concerning the
+ availability of a default constructor.
+
+2004-10-16 Saturday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.118): Explain why functions in the C interface that
+ compute (space) dimensions no longer return their result.
+
+2004-10-16 Saturday 23:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.117): Mention the bug fixed in
+ ppl_new_LinExpression_with_dimension().
+
+2004-10-16 Saturday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.111): Fixed a bug in
+ ppl_new_LinExpression_with_dimension() reported by Pedro
+ Vasconcelos.
+
+2004-10-15 Friday 08:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.25), C_Polyhedron.inlines.hh
+ (1.18), NNC_Polyhedron.defs.hh (1.27), NNC_Polyhedron.inlines.hh
+ (1.21), Polyhedron.defs.hh (1.248), Polyhedron.inlines.hh (1.97),
+ Polyhedron_chdims.cc (1.18), Polyhedron_nonpublic.cc (1.29),
+ max_space_dimension.hh (1.4): Removed
+ C_Polyhedron::max_space_dimension() and
+ NNC_Polyehdron::max_space_dimension(): the method
+ Polyhedron::max_space_dimension() no longer uses them and it is
+ not hided by them. Changed all places where we check for
+ dimensions overflows accordingly. Exception throwers made
+ protected to allow calling them from subclasses. The BoundingBox
+ template is now required to have a default constructor.
+
+2004-10-13 Wednesday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/addspacedims10.cc (1.2): Comment corrected.
+
+2004-10-13 Wednesday 12:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.116), TODO (1.103): Corrected the bug shown by
+ generators2.cc.
+
+2004-10-13 Wednesday 11:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.17), tests/addgenerator1.cc (1.7),
+ tests/addgenerator2.cc (1.7), tests/memory1.cc (1.22): Small
+ adjustments in comments.
+
+2004-10-13 Wednesday 11:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.33): Method generators() now
+ correctly sets the space dimension of the generator system
+ representing an empty polyhedron (thereby correcting the bug
+ shown by test generators2.cc).
+
+2004-10-13 Wednesday 11:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.28): Constructors now correctly
+ deal with empty systems of constraints/generators having a
+ positive space dimension.
+
+2004-10-13 Wednesday 11:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.71), GenSys.cc (1.96): Now methods
+ adjust_topology_and_space_dimension() allow for empty systems
+ having a positive space dimension.
+
+2004-10-13 Wednesday 11:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.76), Matrix.inlines.hh (1.38): No longer
+ enforcing the Matrix invariant num_rows() == 0 ==>
+ num_columns() == 0.
+
+2004-10-13 Wednesday 09:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.102): Documentation of affine dimension is now in the
+ user manual.
+
+2004-10-11 Monday 11:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.221), addgenerator5.cc (1.1),
+ generators2.cc (1.10): Tests generators2 and addgenerator5 show a
+ bug in the handling of space dimensions for a generator system
+ corresponding to an empty polyhedron.
+
+2004-10-07 Thursday 15:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.220), affineimage9.cc (1.1): New test for
+ Polyhedron::affine_image().
+
+2004-10-07 Thursday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/polyhull11.cc (1.2): Small correction.
+
+2004-10-07 Thursday 12:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.219), polyhull11.cc (1.1): New test for
+ Polyhedron::poly_hull_assign_and_minimize().
+
+2004-10-07 Thursday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/polyhull10.cc (1.5): Completed.
+
+2004-10-03 Sunday 15:33 Abramo Bagnara
+
+ * src/: Makefile.am, checked.defs.hh, checked.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[11,18,11,12,18,17]): Transformed
+ implicit default implementation in esplicit specializations using
+ generic implementation.
+
+2004-10-03 Sunday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.defs.hh (altnum.17): Comment improved.
+
+2004-10-03 Sunday 00:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.24): Started implementing
+ bidirectional communication of bignums.
+
+2004-10-02 Saturday 19:23 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.17): Fixed 64 bit
+ architecture.
+
+2004-10-02 Saturday 19:18 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.16): Better architecture
+ support for Larger.
+
+2004-10-02 Saturday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked.defs.hh (altnum.16): Comments improved.
+
+2004-10-02 Saturday 18:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+ (altnum.[3,3,3]): Add the new implementation files to the lists
+ Doxygen uses to produce the developer's reference manual.
+
+2004-10-02 Saturday 18:03 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.15): Better name for Larger
+ struct.
+
+2004-10-02 Saturday 17:59 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (altnum.16): Use GMP specific type for
+ MP size.
+
+2004-10-02 Saturday 17:56 Abramo Bagnara
+
+ * src/checked.defs.hh (altnum.15): Use distinct policies for ext
+ functions.
+
+2004-10-02 Saturday 17:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.27): Implemented another exception
+ thrower.
+
+2004-10-02 Saturday 17:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.inlines.hh (1.20): Previous commit undone, as
+ it was breaking the build.
+
+2004-10-02 Saturday 16:22 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.10): Use distinct policies for ext
+ functions.
+
+2004-10-02 Saturday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Limits.hh, checked.defs.hh, checked.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[2,14,9,11,14,14,15]): Started enforcing some of our
+ coding conventions.
+
+2004-10-02 Saturday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/float.types.hh (altnum.3): Initial comment fixed.
+
+2004-10-02 Saturday 13:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+ YAP/ppl_yap.cc (altnum.[2,3,3]): Use checked numbers to detect
+ overflows.
+
+2004-10-02 Saturday 13:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/NNC_Polyhedron.inlines.hh (1.19): Using the exception thrower
+ instead of directly throwing the exception.
+
+2004-10-02 Saturday 13:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.247), Polyhedron_chdims.cc (1.16):
+ Modified all the methods augmenting the space dimension of a
+ polyhedron so as to throw std::length_error if the new vector
+ space exceeds the maximum allowed space dimension.
+
+2004-10-02 Saturday 13:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.115): Announced the new behavior of the
+ H79_widening_assign() operator. Formally, it is a bugfix since
+ we were already promising the new behavior in the user manual.
+
+2004-10-02 Saturday 12:11 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.13): Removed unused code.
+
+2004-10-02 Saturday 10:42 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[13,12,13,14]): Use a typedef for pointer to C strings.
+
+2004-10-02 Saturday 08:42 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ checked_int.inlines.hh, checked_mpq.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[12,12,11,12,13]): Added
+ constructors from char *.
+
+2004-10-02 Saturday 08:41 Abramo Bagnara
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (altnum.3): Attempt
+ to fix compilation.
+
+2004-10-01 Friday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, TODO, compile, config.guess, config.sub, configure.ac,
+ install-sh, ltmain.sh, missing, Watchdog/compile,
+ Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+ Watchdog/ltmain.sh, Watchdog/missing, demos/ppl_lcdd/Makefile.am,
+ demos/ppl_lcdd/expected, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/Makefile.am,
+ demos/ppl_lcdd/examples/README,
+ demos/ppl_lcdd/examples/dcube10.ext,
+ demos/ppl_lcdd/examples/dcube12.ext,
+ demos/ppl_lcdd/examples/dcube3.ext,
+ demos/ppl_lcdd/examples/dcube6.ext,
+ demos/ppl_lcdd/examples/dcube8.ext, doc/README,
+ doc/definitions.dox, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+ interfaces/Prolog/expected, interfaces/Prolog/expected2,
+ interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ciao_clpq.pl,
+ interfaces/Prolog/Ciao/ciao_clpq2.pl,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+ src/AskTell.inlines.hh, src/BHRZ03_Certificate.cc,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.defs.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+ src/ConSys.defs.hh, src/Constraint.defs.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/GenSys.cc, src/GenSys.defs.hh, src/Generator.defs.hh,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+ src/H79_Certificate.inlines.hh, src/LinExpression.defs.hh,
+ src/Matrix.defs.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/Variable.defs.hh,
+ src/conversion.cc, src/globals.defs.hh, src/minimize.cc,
+ src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+ tests/NNCbecomesC1.cc, tests/README, tests/adddimensions1.cc,
+ tests/adddimensions10.cc, tests/adddimensions11.cc,
+ tests/adddimensions12.cc, tests/adddimensions13.cc,
+ tests/adddimensions2.cc, tests/adddimensions3.cc,
+ tests/adddimensions4.cc, tests/adddimensions5.cc,
+ tests/adddimensions6.cc, tests/adddimensions7.cc,
+ tests/adddimensions8.cc, tests/adddimensions9.cc,
+ tests/addgenerators11.cc, tests/addspacedims1.cc,
+ tests/addspacedims10.cc, tests/addspacedims11.cc,
+ tests/addspacedims12.cc, tests/addspacedims13.cc,
+ tests/addspacedims2.cc, tests/addspacedims3.cc,
+ tests/addspacedims4.cc, tests/addspacedims5.cc,
+ tests/addspacedims6.cc, tests/addspacedims7.cc,
+ tests/addspacedims8.cc, tests/addspacedims9.cc, tests/append1.cc,
+ tests/append2.cc, tests/boundingbox1.cc, tests/boundingbox2.cc,
+ tests/concatenate1.cc, tests/exceptions1.cc,
+ tests/exceptions2.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+ tests/expandspacedim1.cc, tests/expandspacedim2.cc,
+ tests/folddims1.cc, tests/folddims2.cc, tests/foldspacedims1.cc,
+ tests/foldspacedims2.cc, tests/generators1.cc,
+ tests/generators4.cc, tests/limitedh79extrapolation3.cc,
+ tests/mapdim1.cc, tests/mapdim2.cc, tests/mapdim3.cc,
+ tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+ tests/mapspacedims3.cc, tests/permute.cc,
+ tests/polydifference1.cc, tests/polydifference9.cc,
+ tests/removedim1.cc, tests/removedim10.cc, tests/removedim2.cc,
+ tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+ tests/removedim6.cc, tests/removedim7.cc, tests/removedim8.cc,
+ tests/removedim9.cc, tests/removespacedims1.cc,
+ tests/removespacedims10.cc, tests/removespacedims2.cc,
+ tests/removespacedims3.cc, tests/removespacedims4.cc,
+ tests/removespacedims5.cc, tests/removespacedims6.cc,
+ tests/removespacedims7.cc, tests/removespacedims8.cc,
+ tests/removespacedims9.cc
+ (altnum.[3,3,1,2,2,8,2,2,1,1,2,2,2,2,1,3,2,6,2,2,1,1,1,1,1,1,3,4,2,3,1,1,1,1,2,4,1,1,2,2,2,2,5,1,1,2,2,1,1,2,2,3,1,2,3,2,3,2,2,3,4,4,3,2,4,4,4,3,3,2,2,2,2,2,4,4,2,6,4,4,2,4,2,2,2,1,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Third merge from main trunk.
+
+2004-09-30 Thursday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.101): Added another thing not to be forgotten.
+
+2004-09-30 Thursday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.100): Added another item not to be forgotten.
+
+2004-09-30 Thursday 17:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Makefile.am (1.218), addgenerators11.cc (1.8): Restored
+ previous version of test as that change wrongly destroyed the
+ intention of the test. Added this test to the XFAIL_TESTS list
+ in Makefile.am.
+
+2004-09-30 Thursday 13:30 Abramo Bagnara
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.2): Added needed
+ #include's.
+
+2004-09-30 Thursday 13:23 Abramo Bagnara
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (altnum.4): Include only
+ the needed file.
+
+2004-09-30 Thursday 09:09 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[11,11]): Removed test #define.
+
+2004-09-30 Thursday 09:07 Abramo Bagnara
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.1): Fixes for
+ generalized Integers.
+
+2004-09-29 Wednesday 21:46 Abramo Bagnara
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (altnum.1): Fixed compilation.
+
+2004-09-29 Wednesday 14:00 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, src/Checked_Number.defs.hh,
+ src/checked.defs.hh (altnum.[5,10,12]): Fixed compilation for GMP
+ Integers.
+
+2004-09-29 Wednesday 09:52 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/Interval.inlines.hh, src/Native_Integer.defs.hh,
+ src/Native_Integer.inlines.hh, src/Polyhedron_nonpublic.cc,
+ src/checked.defs.hh, src/checked.inlines.hh,
+ src/checked_int.inlines.hh
+ (altnum.[4,3,3,3,9,10,5,5,5,5,5,5,11,8,10]): Fixed compilation
+ for different types of Integers.
+
+2004-09-29 Wednesday 08:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.97): More tests added and
+ improved structure for the tests for
+ ppl_Polyhedron_topological_closure_assign/1.
+
+2004-09-28 Tuesday 17:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.114), TODO (1.99), doc/definitions.dox (1.159): Announced
+ the renaming of methods changing space dimensions. Added to the
+ user manual the notion of affine independence, which is used to
+ define the affine dimension of a polyhedron. Small reordering to
+ the devref part of definitions.dox.
+
+2004-09-28 Tuesday 17:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.31), tests/Makefile.am (1.217),
+ tests/limitedh79extrapolation3.cc (1.4): The implementation of
+ select_H79_constraints() changed so as to ignore trivially true
+ constraints coming from homogenization or epsilon-polyhedra
+ encoding. Thus, the H79 widening is now applied to the polyhedra
+ and not their homogenized polyehdral cones. The known result of
+ the test limitedh79extrapolation3 has been changed accordingly.
+
+2004-09-28 Tuesday 15:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Makefile.am (1.216), addgenerators11.cc (1.7),
+ polydifference1.cc (1.8): Changes to tests so that
+ addgenerators11, polydifference1 and nnc_polydifference1 tests
+ succeed. The tests addgenerators11 and nnc_polydifference1 are
+ no longer named as failing tests by Makefile.
+
+2004-09-27 Monday 22:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.70): Added missing
+ definition for ppl_Polyhedron_affine_dimension/2.
+
+2004-09-27 Monday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: xsb_clpq.P (1.9), xsb_clpq2.P (1.7),
+ xsb_pl_check.P (1.11): The names of all the methods changing the
+ space dimension of a polyhedron now contain "space_dimension" as
+ a substring, therefore avoiding ambiguity with the concept of
+ affine dimension.
+
+2004-09-27 Monday 17:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.158), interfaces/C/ppl_c.cc (1.110),
+ interfaces/C/ppl_c.h.in (1.35),
+ interfaces/Prolog/Prolog_interface.dox (1.114),
+ interfaces/Prolog/clpq.pl (1.16), interfaces/Prolog/clpq2.pl
+ (1.27), interfaces/Prolog/pl_check.pl (1.96),
+ interfaces/Prolog/ppl_prolog.icc (1.137),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.10),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.5),
+ interfaces/Prolog/Ciao/ciao_pl_check.pl (1.6),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.69),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.47),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.64),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.89),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.34),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.56),
+ interfaces/Prolog/XSB/xsb_pl_check.P (1.10),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.82), src/AskTell.defs.hh
+ (1.26), src/AskTell.inlines.hh (1.22), src/BHRZ03_Certificate.cc
+ (1.3), src/BHRZ03_Certificate.defs.hh (1.7),
+ src/BHRZ03_Certificate.inlines.hh (1.3), src/BoundingBox.defs.hh
+ (1.13), src/ConSys.cc (1.70), src/ConSys.defs.hh (1.87),
+ src/Constraint.defs.hh (1.89), src/Determinate.defs.hh (1.45),
+ src/Determinate.inlines.hh (1.40), src/GenSys.cc (1.95),
+ src/GenSys.defs.hh (1.100), src/Generator.defs.hh (1.89),
+ src/H79_Certificate.cc (1.4), src/H79_Certificate.defs.hh (1.7),
+ src/H79_Certificate.inlines.hh (1.3), src/LinExpression.defs.hh
+ (1.64), src/Matrix.defs.hh (1.59), src/Polyhedra_Powerset.defs.hh
+ (1.3), src/Polyhedra_Powerset.inlines.hh (1.5),
+ src/Polyhedron.defs.hh (1.246), src/Polyhedron.inlines.hh (1.96),
+ src/Polyhedron_chdims.cc (1.15), src/Polyhedron_nonpublic.cc
+ (1.26), src/Polyhedron_public.cc (1.32), src/Variable.defs.hh
+ (1.38), tests/Makefile.am (1.215), tests/adddimensions1.cc
+ (1.15), tests/adddimensions10.cc (1.8), tests/adddimensions11.cc
+ (1.7), tests/adddimensions12.cc (1.5), tests/adddimensions13.cc
+ (1.4), tests/adddimensions2.cc (1.11), tests/adddimensions3.cc
+ (1.13), tests/adddimensions4.cc (1.11), tests/adddimensions5.cc
+ (1.9), tests/adddimensions6.cc (1.9), tests/adddimensions7.cc
+ (1.9), tests/adddimensions8.cc (1.7), tests/adddimensions9.cc
+ (1.8), tests/addspacedims1.cc (1.1), tests/addspacedims10.cc
+ (1.1), tests/addspacedims11.cc (1.1), tests/addspacedims12.cc
+ (1.1), tests/addspacedims13.cc (1.1), tests/addspacedims2.cc
+ (1.1), tests/addspacedims3.cc (1.1), tests/addspacedims4.cc
+ (1.1), tests/addspacedims5.cc (1.1), tests/addspacedims6.cc
+ (1.1), tests/addspacedims7.cc (1.1), tests/addspacedims8.cc
+ (1.1), tests/addspacedims9.cc (1.1), tests/append1.cc (1.23),
+ tests/append2.cc (1.23), tests/concatenate1.cc (1.9),
+ tests/exceptions1.cc (1.39), tests/expanddim1.cc (1.8),
+ tests/expanddim2.cc (1.2), tests/expandspacedim1.cc (1.1),
+ tests/expandspacedim2.cc (1.1), tests/folddims1.cc (1.3),
+ tests/folddims2.cc (1.3), tests/foldspacedims1.cc (1.1),
+ tests/foldspacedims2.cc (1.1), tests/mapdim1.cc (1.3),
+ tests/mapdim2.cc (1.3), tests/mapdim3.cc (1.2),
+ tests/mapspacedims1.cc (1.1), tests/mapspacedims2.cc (1.1),
+ tests/mapspacedims3.cc (1.1), tests/permute.cc (1.32),
+ tests/polydifference9.cc (1.4), tests/removedim1.cc (1.12),
+ tests/removedim10.cc (1.4), tests/removedim2.cc (1.16),
+ tests/removedim3.cc (1.12), tests/removedim4.cc (1.13),
+ tests/removedim5.cc (1.11), tests/removedim6.cc (1.14),
+ tests/removedim7.cc (1.10), tests/removedim8.cc (1.7),
+ tests/removedim9.cc (1.7), tests/removespacedims1.cc (1.1),
+ tests/removespacedims10.cc (1.1), tests/removespacedims2.cc
+ (1.1), tests/removespacedims3.cc (1.1), tests/removespacedims4.cc
+ (1.1), tests/removespacedims5.cc (1.1), tests/removespacedims6.cc
+ (1.1), tests/removespacedims7.cc (1.1), tests/removespacedims8.cc
+ (1.1), tests/removespacedims9.cc (1.1): The method
+ Polyhedron::dimension() is now named
+ Polyhedron::affine_dimension(). The names of all the methods
+ changing the space dimension of a polyhedron now contain
+ "space_dimension" as a substring, therefore avoiding ambiguity
+ with the concept of affine dimension. All the foreign interfaces
+ changed accordingly. Also tried to be consistent in the
+ documentation. All the tests related to methods changing space
+ dimensions now follow a common naming scheme (***spacedim(s)*).
+
+2004-09-27 Monday 17:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.61): Improved the detailed documentation in
+ a couple of places. Using a reference to avoid multiple access
+ to dest[num_lines_or_equalities].
+
+2004-09-27 Monday 09:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc, SatRow.defs.hh, SatRow.inlines.hh
+ (altnum.[8,2,1]): Updated from the main trunk.
+
+2004-09-26 Sunday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.28): SatRow::first() and SatRow::next() speeded
+ up.
+
+2004-09-26 Sunday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.27): SatRow::last() and SatRow::prev() speeded
+ up.
+
+2004-09-26 Sunday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.98): Added a set of possible renamings we may decide to
+ perform before releasing PPL 0.7.
+
+2004-09-26 Sunday 15:44 Abramo Bagnara
+
+ * src/: checked_int.inlines.hh, checked_mpz.inlines.hh,
+ checked_mpq.inlines.hh (altnum.[9,12,11]): Reorganizing
+ specializations.
+
+2004-09-26 Sunday 15:44 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.10): Removed trailing
+ semicolons.
+
+2004-09-26 Sunday 15:44 Abramo Bagnara
+
+ * src/checked.defs.hh (altnum.10): Removed trailing semicolon.
+
+2004-09-26 Sunday 15:43 Abramo Bagnara
+
+ * src/: Interval.inlines.hh, Polyhedron_nonpublic.cc
+ (altnum.[4,4]): Call proper constructors.
+
+2004-09-26 Sunday 15:43 Abramo Bagnara
+
+ * src/Checked_Number.types.hh (altnum.3): Renamed default policy.
+
+2004-09-26 Sunday 15:42 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[8,9]): Make Checked_Number optionally implicitly
+ convertible to base type.
+
+2004-09-26 Sunday 15:41 Abramo Bagnara
+
+ * interfaces/Prolog/: ppl_prolog.icc, SWI/ppl_swiprolog.cc
+ (altnum.[2,2]): Preliminary step on generalization path.
+
+2004-09-26 Sunday 15:40 Abramo Bagnara
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (altnum.3): Call proper constructor.
+
+2004-09-26 Sunday 14:44 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.7): Fixed thinko. Added assertion for bogus
+ call to last.
+
+2004-09-26 Sunday 13:47 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.6): Trivial bug fixes.
+
+2004-09-26 Sunday 11:24 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.5): Further optimizations.
+
+2004-09-26 Sunday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.113), interfaces/C/ppl_c.cc (1.109),
+ interfaces/Prolog/ppl_prolog.icc (1.136), src/Polyhedron.defs.hh
+ (1.245), src/Polyhedron.inlines.hh (1.95),
+ src/Polyhedron_widenings.cc (1.30), src/globals.defs.hh (1.3),
+ tests/boundingbox1.cc (1.37), tests/boundingbox2.cc (1.22): The
+ enumeration values of enum Complexity_Class have been renamed
+ POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+2004-09-26 Sunday 09:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc (1.26), SatRow.inlines.hh (1.29): Use ffs(3) when
+ possible.
+
+2004-09-26 Sunday 09:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.123): Added a check to determine sizeof(int).
+
+2004-09-26 Sunday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.25): Function strict_subset() speeded up
+ further.
+
+2004-09-26 Sunday 00:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.122): Check whether the ffs(3) function is
+ available.
+
+2004-09-25 Saturday 23:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.defs.hh (1.34): Fix two completely bogus comments.
+
+2004-09-25 Saturday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.24): Function strict_subset() speeded up.
+
+2004-09-25 Saturday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.23): Function subset_or_equal() speeded up.
+
+2004-09-25 Saturday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (altnum.4): Avoid a useless asymmetry. All the
+ other things being equal, prefer pre-increment and pre-decrement
+ to post-increment and post-decrement.
+
+2004-09-25 Saturday 10:25 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.3): Minor residual optimization.
+
+2004-09-25 Saturday 10:23 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.2): Optimization second attempt.
+
+2004-09-25 Saturday 10:15 Abramo Bagnara
+
+ * src/SatRow.cc (altnum.1): Optimization first attempt.
+
+2004-09-22 Wednesday 18:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (altnum.2): Activate the Prolog
+ interfaces.
+
+2004-09-22 Wednesday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected (1.3): Updated to reflect the fact that
+ we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: expected (1.7), expected2 (1.12),
+ XSB/expected (1.8), XSB/expected2 (1.10): Updated to reflect the
+ fact that we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, configure.ac, src/Checked_Integer.defs.hh,
+ src/Checked_Integer.inlines.hh, src/Checked_Integer.types.hh,
+ src/Integer.defs.hh, src/Integer.types.hh, src/Makefile.am
+ (altnum.[3,7,6,7,3,5,5,10]): Commit to the new implementation of
+ checked numbers.
+
+2004-09-22 Wednesday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (altnum.2): Temporary kludge to make things
+ work until we generalize the interface.
+
+2004-09-22 Wednesday 16:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (altnum.[4,4]):
+ Added add_mul_assign() and sub_mul_assign().
+
+2004-09-22 Wednesday 16:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.31): No longer sorting constraints in
+ Polyhedron::constraints(). Two FIXMEs added so as not to forget
+ to reconsider the situation when we will have better sorting
+ methods.
+
+2004-09-22 Wednesday 12:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.86), GenSys.defs.hh (1.99): Added a
+ couple of missing \relates.
+
+2004-09-22 Wednesday 10:18 Abramo Bagnara
+
+ * src/: checked.inlines.hh, checked_float.inlines.hh
+ (altnum.[7,9]): Separated approximated arithmentic add/sub.
+
+2004-09-20 Monday 17:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.113): Added
+ documentation for ppl_Polyhedron_dimension/2.
+
+2004-09-20 Monday 15:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, interfaces/Makefile.am (altnum.[4,1]): Activate the
+ C interface (this breaks the build).
+
+2004-09-20 Monday 13:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox1.cc (altnum.3): Quiet again.
+
+2004-09-20 Monday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.inlines.hh, Interval.defs.hh,
+ Interval.inlines.hh, Polyhedron.inlines.hh (altnum.[3,3,3,3]):
+ Temporary hacks to avoid failures with checked 64-bits integers.
+
+2004-09-20 Monday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.2), install-sh (1.10), missing (1.8), Watchdog/compile
+ (1.2), Watchdog/install-sh (1.7), Watchdog/missing (1.4): Updated
+ from Automake 1.9.2.
+
+2004-09-20 Monday 09:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox1.cc (altnum.2): Made noisy so as to make
+ visible how test2() is failing.
+
+2004-09-19 Sunday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, NEWS, README.configure, TODO, configure.ac,
+ Watchdog/Makefile.am, Watchdog/Watchdog.cc,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected,
+ demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+ demos/ppl_lpsol/ppl_lpsol.c, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/GNU/Makefile.am,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SWI/Makefile.am,
+ interfaces/Prolog/XSB/Makefile.am,
+ interfaces/Prolog/YAP/Makefile.am, src/AskTell.defs.hh,
+ src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+ src/BoundingBox.defs.hh, src/Checked_Number.defs.hh,
+ src/Checked_Number.inlines.hh, src/ConSys.cc, src/ConSys.defs.hh,
+ src/Constraint.defs.hh, src/Determinate.defs.hh, src/GenSys.cc,
+ src/GenSys.defs.hh, src/Generator.cc, src/Generator.defs.hh,
+ src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+ src/Makefile.am, src/Matrix.cc, src/Polyhedra_PowerSet.defs.hh,
+ src/Polyhedra_PowerSet.inlines.hh,
+ src/Polyhedra_PowerSet.types.hh, src/Polyhedra_Powerset.defs.hh,
+ src/Polyhedra_Powerset.inlines.hh,
+ src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+ src/Polyhedron_widenings.cc, src/PowerSet.defs.hh,
+ src/PowerSet.inlines.hh, src/PowerSet.types.hh,
+ src/Powerset.defs.hh, src/Powerset.inlines.hh,
+ src/Powerset.types.hh, src/Row.cc, src/Row.defs.hh,
+ src/Row.inlines.hh, src/SatMatrix.cc, src/SatRow.defs.hh,
+ src/Variable.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/algorithms.hh,
+ src/checked.inlines.hh, src/conversion.cc, src/globals.cc,
+ src/globals.defs.hh, src/globals.hh, src/globals.inlines.hh,
+ src/max_space_dimension.hh, tests/Makefile.am,
+ tests/NNCminimize5.cc, tests/addconstraint1.cc,
+ tests/addgenerator1.cc, tests/addgenerator2.cc,
+ tests/addgenerator4.cc, tests/bgp99extrapolation1.cc,
+ tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+ tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+ tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+ tests/bhz03widening6.cc, tests/h79widening8.cc,
+ tests/linearpartition1.cc, tests/linearpartition2.cc,
+ tests/linearpartition3.cc, tests/linearpartition4.cc,
+ tests/mc91.cc, tests/polydifference9.cc, tests/relations17.cc,
+ tests/timings.cc, tests/timings.hh, utils/.cvsignore,
+ utils/Makefile.am, utils/timings.cc, utils/timings.hh
+ (altnum.[3,2,2,2,6,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,2,7,8,2,3,3,2,3,3,3,3,2,2,2,9,3,2,2,1,1,1,1,3,3,3,3,2,2,1,1,1,1,2,3,2,1,1,1,2,2,2,6,3,3,1,3,1,1,3,1,1,1,1,1,2,2,2,2,2,2,2,2,1,2,2,2,2,1,1,1,1,1,1,1,1,1]):
+ Second merge from main trunk.
+
+2004-09-19 Sunday 21:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.95), Ciao/ciao_pl_check.pl
+ (1.5), GNU/ppl_gprolog.pl (1.46): Added tests for the Prolog
+ interface predicate ppl_Polyhedron_dimension/2. Updated
+ interface files to correct obvious bugs for this predicate.
+
+2004-09-19 Sunday 21:28 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked.inlines.hh,
+ checked_float.inlines.hh, checked_int.inlines.hh,
+ checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[9,5,8,8,10,11]): Better names for policy fields. Added
+ add_assign_mul and sub_assign_mul. Enriched Result return codes.
+
+2004-09-19 Sunday 21:25 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+ (altnum.[6,7]): Better names for policy fields. Added
+ add_assign_mul and sub_assign_nul.
+
+2004-09-19 Sunday 21:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/simplify.cc (1.38): Comments revised so as not to refer to
+ (no longer existing) comparison operators between rows of the
+ saturation matrices.
+
+2004-09-19 Sunday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/examples/: Makefile.am (1.3), README (1.2),
+ dcube10.ext (1.1), dcube12.ext (1.1), dcube3.ext (1.1),
+ dcube6.ext (1.1), dcube8.ext (1.1): New examples with V
+ representations of dual hypercubes.
+
+2004-09-19 Sunday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.24), config.sub (1.23), Watchdog/config.guess
+ (1.8), Watchdog/config.sub (1.8): Updated.
+
+2004-09-19 Sunday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.20), Watchdog/ltmain.sh (1.9): Updated from Libtool
+ 1.5.10.
+
+2004-09-19 Sunday 09:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/README (1.2): Improved the text.
+
+2004-09-19 Sunday 09:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/expected (1.2): Updated to reflect the fact that
+ we no longer sort generators for closed polyhedra.
+
+2004-09-19 Sunday 08:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.97): Two new important things to do.
+
+2004-09-19 Sunday 08:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.112): Significant efficiency improvements have been
+ achieved in the case of closed polyhedra.
+
+2004-09-19 Sunday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.68): Similar lines are now
+ commented out in the same way.
+
+2004-09-19 Sunday 08:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README (1.4): Copyright notice added.
+
+2004-09-19 Sunday 08:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.defs.hh (1.2): Added code to experiment with an
+ alternative way of dealing with temporaries.
+
+2004-09-19 Sunday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: minimize.cc (1.37), simplify.cc (1.37): Small improvements.
+
+2004-09-19 Sunday 08:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.30): In Polyhedron::generators(), we
+ no longer insist in returning a sorted system of generators in
+ the case of a closed polyhedron.
+
+2004-09-19 Sunday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_Powerset.inlines.hh (1.4): Use the new constructor
+ C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-09-19 Sunday 00:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.30): Added some comments to explain
+ what we are doing. Enahnced the function write_polyehdron() to
+ also apply to Polka and PolyLib polyhedra objects.
+
+2004-09-18 Saturday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.29): With Polka, do not try to
+ print the "frames" of an empty polyhedron.
+
+2004-09-18 Saturday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.28): Increase the magic parameter
+ of polka_initialize() to 25000: with 22500 Polka 2.0.2 dies on
+ mit31-20.ine with the error "Chernikova: out of table space".
+
+2004-09-18 Saturday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/: Makefile.am (1.8), ppl_lcdd.cc (1.27): A first,
+ rough attempt at obtaining an `lcdd' clone that works also with
+ (New) Polka and PolyLib.
+
+2004-09-17 Friday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.96), interfaces/Prolog/ppl_prolog.icc (1.135),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.67),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.63),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.88),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.33),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.55),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.81): Polyhedron::dimension()
+ is now available in all the interfaces.
+
+2004-09-17 Friday 15:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.111), interfaces/C/ppl_c.cc (1.108),
+ interfaces/C/ppl_c.h.in (1.34): Functions in the C interface that
+ compute (space) dimensions no longer return their result. The
+ caller is now required to pass, as an extra argument, a pointer
+ to a memory area where the result will be written.
+
+2004-09-17 Friday 15:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.107), ppl_c.h.in (1.33): New function
+ int ppl_Polyhedron_dimension(ppl_const_Polyhedron_t ph).
+
+2004-09-17 Friday 10:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.26): Remove support for the
+ "project" command: it was undocumented and its usefulness is
+ highly questionable.
+
+2004-09-17 Friday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.110), TODO (1.95), demos/ppl_lcdd/ppl_lcdd.cc (1.25): The
+ `ppl_lcdd' demo is now able to parse problems produced by lrs,
+ i.e., where the number of rows of the matrix is omitted and
+ replaced by "*****" (five asterisks).
+
+2004-09-17 Friday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.94): Typo fixed.
+
+2004-09-16 Thursday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.93), tests/README (1.1): New README file explains how a
+ program in our test suite can be used for a quick hands-on PPL.
+
+2004-09-16 Thursday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: CbecomesNNC1.cc (1.6), exceptions1.cc (1.38),
+ exceptions2.cc (1.33), generators1.cc (1.14), generators4.cc
+ (1.6): Replace "built" by "build" wherever appropriate.
+
+2004-09-16 Thursday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.109), TODO (1.92), src/C_Polyhedron.cc (1.10),
+ src/C_Polyhedron.defs.hh (1.24), tests/Makefile.am (1.214),
+ tests/NNCbecomesC1.cc (1.1), tests/exceptions2.cc (1.32): The
+ constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+ throws an exception if `y' is not topologically closed. Rather,
+ it constructs a C_Polyhedron representing the topological closure
+ of `y'.
+
+2004-09-16 Thursday 17:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.108), src/Polyhedra_Powerset.defs.hh (1.2),
+ src/Polyhedra_Powerset.inlines.hh (1.3): The constructors
+ allowing to obtain a Polyhedra_Powerset<NNC_Polyhedron> from a
+ Polyhedra_Powerset<C_Polyhedron> and the other way around are now
+ explicit.
+
+2004-09-16 Thursday 17:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BoundingBox.cc (1.9): Include <config.h>.
+
+2004-09-16 Thursday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/adddimensions11.cc (1.6): Inconsistency fixed.
+
+2004-09-16 Thursday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.18), src/Powerset.inlines.hh (1.2),
+ src/algorithms.hh (1.34): Simplified the progrma logic in a few
+ places where we remove elements from a container by using the
+ return value of method erase().
+
+2004-09-15 Wednesday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/linearpartition4.cc (1.3): Be quiet.
+
+2004-09-15 Wednesday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/polydifference9.cc (1.3): Completed and made quiet.
+
+2004-09-15 Wednesday 19:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BHRZ03_Certificate.cc (1.2), src/ConSys.defs.hh (1.85),
+ src/GenSys.defs.hh (1.98), src/H79_Certificate.cc (1.3),
+ src/Matrix.cc (1.75), src/Polyhedra_Powerset.inlines.hh (1.2),
+ src/Polyhedron_widenings.cc (1.29), tests/NNCminimize5.cc (1.10),
+ tests/addconstraint1.cc (1.6), tests/addgenerator1.cc (1.6),
+ tests/addgenerator2.cc (1.6), tests/addgenerator4.cc (1.6),
+ tests/relations17.cc (1.8): Try to be consistent in the choice of
+ variable names.
+
+2004-09-15 Wednesday 19:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.107): Announce the bug just fixed.
+
+2004-09-15 Wednesday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.106), TODO (1.91), doc/devref-browse.doxyconf-latex.in
+ (1.44), doc/devref-print.doxyconf-latex.in (1.44),
+ doc/devref.doxyconf-html.in (1.44), src/Makefile.am (1.80),
+ src/Polyhedra_PowerSet.defs.hh (1.36),
+ src/Polyhedra_PowerSet.inlines.hh (1.42),
+ src/Polyhedra_PowerSet.types.hh (1.3),
+ src/Polyhedra_Powerset.defs.hh (1.1),
+ src/Polyhedra_Powerset.inlines.hh (1.1),
+ src/Polyhedra_Powerset.types.hh (1.1), src/PowerSet.defs.hh
+ (1.49), src/PowerSet.inlines.hh (1.59), src/PowerSet.types.hh
+ (1.7), src/Powerset.defs.hh (1.1), src/Powerset.inlines.hh (1.1),
+ src/Powerset.types.hh (1.1), src/Widening_Function.defs.hh (1.5),
+ src/Widening_Function.inlines.hh (1.5), src/algorithms.hh (1.33),
+ src/max_space_dimension.hh (1.3), tests/bgp99extrapolation1.cc
+ (1.5), tests/bgp99extrapolation2.cc (1.7),
+ tests/bhz03widening1.cc (1.6), tests/bhz03widening2.cc (1.8),
+ tests/bhz03widening3.cc (1.6), tests/bhz03widening4.cc (1.4),
+ tests/bhz03widening5.cc (1.5), tests/bhz03widening6.cc (1.6),
+ tests/linearpartition1.cc (1.15), tests/linearpartition2.cc
+ (1.15), tests/linearpartition3.cc (1.15),
+ tests/linearpartition4.cc (1.2), tests/mc91.cc (1.15),
+ tests/polydifference9.cc (1.2): The classes PowerSet and
+ Polyhedra_PowerSet have been renamed Powerset and
+ Polyhedra_Powerset, respectively.
+
+2004-09-15 Wednesday 18:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/algorithms.hh (1.32): Corrected a bug in check_containment().
+ The bug was affecting method geometrically_contains().
+
+2004-09-15 Wednesday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.90): Polyhedra_PowerSet::poly_difference_assign() has
+ been implemented.
+
+2004-09-15 Wednesday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.29): (Not well thought) FIXME
+ removed.
+
+2004-09-15 Wednesday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.89): Several new things to do.
+
+2004-09-15 Wednesday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.213), polydifference9.cc (1.1): Test
+ Polyhedra_PowerSet<PH>::poly_difference_assign(). (It presently
+ fails, apparently due to a bug in
+ Polyhedra_PowerSet<PH>::geometrically_equals().)
+
+2004-09-15 Wednesday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.31): The linear_partition() template
+ function is now in Polyhedra_PowerSet.*.hh.
+
+2004-09-15 Wednesday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.105), src/Polyhedra_PowerSet.defs.hh (1.35),
+ src/Polyhedra_PowerSet.inlines.hh (1.41): New constructors and
+ assignment operators allowing to obtain a
+ Polyhedra_PowerSet<NNC_Polyhedron> from a
+ Polyhedra_PowerSet<C_Polyhedron> and the other way around. In
+ the latter case, the topological clusure of the element polyhedra
+ is computed. New method
+ Polyhedra_PowerSet::poly_difference_assign(const
+ Polyhedra_PowerSet& y) assigns to `*this' the poly-difference of
+ `*this' and `y'.
+
+2004-09-15 Wednesday 14:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.48), PowerSet.inlines.hh (1.58): New
+ method PowerSet<CS>::clear().
+
+2004-09-15 Wednesday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.104), TODO (1.88), src/Polyhedron.defs.hh (1.244),
+ src/Polyhedron_public.cc (1.28): Added a first, draft
+ implementation of method dimension_type Polyhedron::dimension():
+ it returns the dimension of *this (not to be confused with the
+ dimension of its enclosing vector space) or 0, if *this is empty.
+
+2004-09-13 Monday 07:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.103): Mentioned the bug just corrected.
+
+2004-09-12 Sunday 18:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.212): Use h79widening8.cc also with NNC
+ polyhedra.
+
+2004-09-08 Wednesday 17:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (ppl-0_6-branch.1): Corrected a bug reported by
+ Sriram.
+
+2004-09-08 Wednesday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/h79widening8.cc (1.2): Made silent.
+
+2004-09-08 Wednesday 16:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.94): Corrected a bug in
+ GenSys::satisfied_by_all_generators(), which was revealed by the
+ test h79widening8.cc.
+
+2004-09-08 Wednesday 16:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.211), h79widening8.cc (1.1): Added a test
+ showing a bug in H79_widening_assign().
+
+2004-09-03 Friday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.7): Inclusion directive fixed.
+
+2004-09-03 Friday 10:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.87), demos/ppl_lcdd/ppl_lcdd.cc (1.24): Added support for
+ printing timing information (on std::cerr).
+
+2004-09-02 Thursday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.102), demos/ppl_lpsol/expected (1.2),
+ demos/ppl_lpsol/ppl_lpsol.c (1.3): Fixed a bug in the `ppl_lpsol'
+ demo (thanks to Andrea Cimino).
+
+2004-09-02 Thursday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.12), src/Makefile.am (1.79): Prepared for
+ PPL 0.7.
+
+2004-08-31 Tuesday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.210): Search for header files also in the
+ `utils' directory.
+
+2004-08-31 Tuesday 16:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.27), configure.ac (1.121),
+ demos/ppl_lcdd/Makefile.am (1.6), tests/Makefile.am (1.209),
+ tests/timings.cc (1.5), tests/timings.hh (1.5), utils/.cvsignore
+ (1.1), utils/Makefile.am (1.1), utils/timings.cc (1.1),
+ utils/timings.hh (1.1): The timings functions are now included in
+ a `ppl_utils' convenience library, which is contained in the
+ newly created `utils' directory.
+
+2004-08-30 Monday 23:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.86): Three more things to do.
+
+2004-08-30 Monday 23:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.85): Added several new things to be done.
+
+2004-08-30 Monday 21:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/examples/README (1.1): Explain and give pointers
+ to the origins of these examples.
+
+2004-08-30 Monday 16:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.43),
+ devref-print.doxyconf-latex.in (1.43), devref.doxyconf-html.in
+ (1.43), user-browse.doxyconf-latex.in (1.21),
+ user-print.doxyconf-latex.in (1.21), user.doxyconf-html.in
+ (1.23): Updated to the latest doxygen version (1.3.8).
+
+2004-08-28 Saturday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.42),
+ devref-print.doxyconf-latex.in (1.42), devref.doxyconf-html.in
+ (1.42): Replaced globals.hh with globals.defs.hh and
+ globals.inlines.hh.
+
+2004-08-27 Friday 09:23 Abramo Bagnara
+
+ * src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[9,10]): Added support for special values.
+
+2004-08-27 Friday 09:23 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.7): Added implementation of
+ extended integers
+
+2004-08-27 Friday 09:22 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.7): Better implementation of
+ pred/succ.
+
+2004-08-27 Friday 09:21 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.4): Added extended functions.
+
+2004-08-26 Thursday 23:54 Abramo Bagnara
+
+ * src/Makefile.am (altnum.8): Fixed concatenation order.
+
+2004-08-26 Thursday 23:53 Abramo Bagnara
+
+ * src/Checked_Number.inlines.hh (altnum.6): Use Checked::functions
+
+2004-08-26 Thursday 23:52 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[5,8]):
+ Added some policy fields. Better specialization infrastructure.
+
+2004-08-23 Monday 20:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.243), Polyhedron_widenings.cc (1.28):
+ Removed the no-longer used function is_BHRZ03_stabilizing(),
+ which has been superseded by the use of BHRZ03_Certificate.
+
+2004-08-23 Monday 16:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/algorithms.hh (1.30): Documented (for the developers) the
+ function check_containment() and linear_partition_aux().
+
+2004-08-23 Monday 12:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.69), Matrix.cc (1.74): Use add_mul_assign()
+ and sub_mul_assign() when possible.
+
+2004-08-23 Monday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_nonpublic.cc (1.25), Row.cc (1.68), Row.defs.hh
+ (1.82), Row.inlines.hh (1.47): New funcions void
+ homogeneous_scalar_product_assign(Integer& z, const Row& x, const
+ Row& y) and int homogeneous_scalar_product_sign(const Row& x,
+ const Row& y).
+
+2004-08-23 Monday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GenSys.cc (1.93): Last change completed.
+
+2004-08-23 Monday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GenSys.cc (1.92): Use scalar_product_assign() instead of
+ replicating code..
+
+2004-08-23 Monday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.25), BHRZ03_Certificate.defs.hh (1.6),
+ BoundingBox.defs.hh (1.12), Determinate.defs.hh (1.44),
+ H79_Certificate.defs.hh (1.6), Init.cc (1.14), Makefile.am
+ (1.78), Matrix.cc (1.73), Polyhedra_PowerSet.defs.hh (1.34),
+ Polyhedron.defs.hh (1.242), Row.cc (1.67), Row.defs.hh (1.81),
+ Row.inlines.hh (1.46), SatMatrix.cc (1.29), SatRow.defs.hh
+ (1.33), Variable.defs.hh (1.37), conversion.cc (1.60), globals.cc
+ (1.18), globals.defs.hh (1.1), globals.hh (1.42): Header file
+ globals.hh renamed globals.defs.hh.
+
+2004-08-23 Monday 09:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.77), Row.cc (1.66), conversion.cc (1.59),
+ globals.hh (1.41), globals.inlines.hh (1.1): New function void
+ normalize2(const Integer& x, const Integer& y, Integer& nx,
+ Integer& ny). Start moving inline implementations of globals in
+ globals.inlines.hh.
+
+2004-08-23 Monday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.65), conversion.cc (1.58): Avoid using some
+ temporaries. Avoid calling the same function twice.
+
+2004-08-22 Sunday 23:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.91), Integer.defs.hh (1.13),
+ Integer.inlines.hh (1.12), Matrix.cc (1.72),
+ Polyhedron_nonpublic.cc (1.24), Polyhedron_widenings.cc (1.27),
+ Row.cc (1.64): New function void sub_mul_assign(Integer& x, const
+ Integer& y, const Integer& z) to efficiently compute x -= y*z.
+
+ Use add_mul_assign() and sub_mul_assign() when possible.
+
+2004-08-22 Sunday 23:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.43): Spurious friend declarations
+ removed.
+
+2004-08-22 Sunday 23:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.88), GenSys.cc (1.90),
+ Generator.defs.hh (1.88), Polyhedron_nonpublic.cc (1.23),
+ Polyhedron_public.cc (1.27), Polyhedron_widenings.cc (1.26),
+ globals.cc (1.17), globals.hh (1.40): Functions const Integer&
+ operator*(const Constraint& c, const Generator& g) and const
+ Integer& reduced_scalar_product(const Constraint& c, const
+ Generator& g) removed. Used void scalar_product_assign(Integer&
+ z, const Row& x, const Row& y) and void
+ reduced_scalar_product_assign(Integer& z, const Row& x, const
+ Row& y) instead.
+
+ Use void scalar_product_sign(const Row& x, const Row& y) and void
+ reduced_scalar_product_sign(const Row& x, const Row& y) wherever
+ possible.
+
+2004-08-22 Sunday 19:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.68), GenSys.cc (1.89), Integer.defs.hh (1.12),
+ Integer.inlines.hh (1.11), Matrix.cc (1.71), Polyhedron_public.cc
+ (1.26), Polyhedron_widenings.cc (1.25), Row.cc (1.63),
+ Row.defs.hh (1.80), Row.inlines.hh (1.45), conversion.cc (1.57):
+ Functions const Integer& operator*(const Row& x, const Row& y)
+ and const Integer& reduced_scalar_product(const Row& x, const
+ Row& y) removed. New functions void
+ scalar_product_assign(Integer& z, const Row& x, const Row& y) and
+ void reduced_scalar_product_assign(Integer& z, const Row& x,
+ const Row& y) provide the same functionality, but without
+ (explicitely) using temporaries.
+
+ New functions int scalar_product_sign(const Row& x, const Row& y)
+ and int reduced_scalar_product_sign(const Row& x, const Row& y)
+ return the sign of the (reduced) scalar product of the given
+ arguments.
+
+ New function void add_mul_assign(Integer& x, const Integer& y,
+ const Integer& z) to efficiently compute x += y*z.
+
+2004-08-22 Sunday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.88), Generator.cc (1.51), Init.cc (1.13),
+ Matrix.cc (1.70), Polyhedron_nonpublic.cc (1.22),
+ Polyhedron_widenings.cc (1.24), Row.cc (1.62), conversion.cc
+ (1.56), globals.cc (1.16), globals.hh (1.39): Old code for the
+ handling of temporary coefficients removed.
+
+2004-08-22 Sunday 17:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.87), Generator.cc (1.50), Init.cc (1.12),
+ Matrix.cc (1.69), Polyhedron_nonpublic.cc (1.21),
+ Polyhedron_widenings.cc (1.23), Row.cc (1.61), conversion.cc
+ (1.55), globals.cc (1.15), globals.hh (1.38): Draft new code for
+ the handling of temporary coefficients.
+
+2004-08-22 Sunday 08:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Widening_Function.inlines.hh (1.4): Added \relates doxygen
+ command to function definition.
+
+2004-08-21 Saturday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.11), demos/ppl_lpsol/Makefile.am (1.2),
+ interfaces/Prolog/Ciao/Makefile.am (1.29),
+ interfaces/Prolog/GNU/Makefile.am (1.35),
+ interfaces/Prolog/SICStus/Makefile.am (1.42),
+ interfaces/Prolog/SWI/Makefile.am (1.35),
+ interfaces/Prolog/XSB/Makefile.am (1.22),
+ interfaces/Prolog/YAP/Makefile.am (1.26), tests/Makefile.am
+ (1.208): Match every `endif' with the corresponding `if'
+ condition.
+
+2004-08-21 Saturday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.5): Add `expected' to the list of
+ files to be distributed.
+
+2004-08-21 Saturday 10:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.101): Now `make check' runs a number of tests with
+ `ppl_lcdd', comparing the results to expected ones.
+
+2004-08-21 Saturday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/: Makefile.am (1.4), expected (1.1): Use
+ `ppl_lcdd' to perform regression testing.
+
+2004-08-20 Friday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.120): Check for md5sum.
+
+2004-08-20 Friday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.26): Option `--with-cxxflags=-Wno-deprecated'
+ removed from `DISTCHECK_CONFIGURE_FLAGS'.
+
+2004-08-20 Friday 19:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_6-branch.3): Update version.
+
+2004-08-20 Friday 19:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[3,5]): Mark
+ ChangeLog.
+
+2004-08-20 Friday 19:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_6-branch.4): Updated.
+
+2004-08-20 Friday 19:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_6-branch.2): Glitch fixed.
+
+2004-08-20 Friday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_6-branch.3): Updated.
+
+2004-08-20 Friday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.41),
+ devref-print.doxyconf-latex.in (1.41), devref.doxyconf-html.in
+ (1.41): Include certificates in the developer's reference.
+
+2004-08-20 Friday 18:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/H79_Certificate.defs.hh (1.5): Spurious comments removed.
+
+2004-08-20 Friday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+ (ppl-0_6-branch.[3,3,4]): Include certificates in the developer's
+ reference.
+
+2004-08-20 Friday 18:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/H79_Certificate.defs.hh (ppl-0_6-branch.2): Spurious comments
+ removed.
+
+2004-08-20 Friday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog (ppl-0_6-branch.[2,2]): Updated.
+
+2004-08-20 Friday 17:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox, doc/ppl.sty,
+ interfaces/Prolog/Prolog_interface.dox (ppl-0_6-branch.[1,1,1]):
+ Merge from the main trunk.
+
+2004-08-20 Friday 17:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.157): Minor English improvement.
+
+2004-08-20 Friday 17:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.3): The
+ documentation of BHZ03_widening_assign made shorter by referring
+ to the new section in the introduction. The comment on
+ concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 17:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.156): Link error corrected.
+
+2004-08-20 Friday 17:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.155): Added a paragraph on the BGP99
+ extrapolation operator.
+
+2004-08-20 Friday 17:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.154): After doing the meet on elements of
+ the powerset domain elementwise, omega reduction is needed.
+
+2004-08-20 Friday 16:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.153): Small improvements.
+
+2004-08-20 Friday 16:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.33): The comment on
+ concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 16:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.32): The documentation of
+ BHZ03_widening_assign made shorter by referring to the new
+ section in the introduction.
+
+2004-08-20 Friday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_6-branch.1): Ready for the release of PPL 0.6.1.
+
+2004-08-20 Friday 16:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.152): A couple of corrections.
+
+2004-08-20 Friday 16:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.151): Added a section on certificate-based
+ widenings.
+
+2004-08-20 Friday 16:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.31): Corrected two comments.
+
+2004-08-20 Friday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/ppl_lcdd.cc, ppl_lpsol/ppl_lpsol.c
+ (ppl-0_6-branch.[1,1]): Do not try to use RLIMIT_AS unless the
+ configure script has determined its availability.
+
+2004-08-20 Friday 15:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: ppl_lcdd/ppl_lcdd.cc (1.23), ppl_lpsol/ppl_lpsol.c (1.2):
+ Do not try to use RLIMIT_AS unless the configure script has
+ determined its availability.
+
+2004-08-20 Friday 15:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.150): Some improvements for the section on
+ polyhedra powersets.
+
+2004-08-20 Friday 15:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.149): In the section about add_disjuct,
+ \cS_1 ==> \cS.
+
+2004-08-20 Friday 15:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.112): Update cross
+ reference.
+
+2004-08-20 Friday 15:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.148), ppl.sty (1.16): Added a short
+ (incomplete) section on the polyhedral powerset domain and
+ revised the description of the generic powerset meet operation.
+
+2004-08-20 Friday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/NEWS (ppl-0_6-branch.1): Updated for the release of PPL
+ 0.6.1.
+
+2004-08-20 Friday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh,
+ src/Polyhedra_PowerSet.inlines.hh, tests/bgp99extrapolation2.cc,
+ tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+ tests/bhz03widening5.cc, tests/bhz03widening6.cc
+ (ppl-0_6-branch.[2,1,1,1,1,1,1]): The methods
+ Polyhedra_PowerSet::semantically_contains(const
+ Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::semantically_equals(const
+ Polyhedra_PowerSet&) have been renamed
+ Polyhedra_PowerSet::geometrically_covers(const
+ Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::geometrically_equals(const
+ Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_6-branch.1): Completed for 0.6.1.
+
+2004-08-20 Friday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (ppl-0_6-branch.2): Formatting glitch fixed.
+
+2004-08-20 Friday 14:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_6-branch.2): Version number bumped.
+
+2004-08-20 Friday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.100): Completed for 0.6.1.
+
+2004-08-20 Friday 14:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.7): Formatting glitch fixed.
+
+2004-08-20 Friday 14:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.147): Small improvements to section 1.6.
+
+2004-08-20 Friday 14:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.146): Some polyhedra where wrongly named P
+ instead of \cP. Replaced a couple of = signs by \defeq. A first
+ pass on Section 1.5 (PowerSet) to correct minor typos.
+
+2004-08-20 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.99), src/Polyhedra_PowerSet.defs.hh (1.30),
+ src/Polyhedra_PowerSet.inlines.hh (1.40),
+ tests/bgp99extrapolation2.cc (1.6), tests/bhz03widening2.cc
+ (1.7), tests/bhz03widening3.cc (1.5), tests/bhz03widening5.cc
+ (1.4), tests/bhz03widening6.cc (1.5): The methods
+ Polyhedra_PowerSet::semantically_contains(const
+ Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::semantically_equals(const
+ Polyhedra_PowerSet&) have been renamed
+ Polyhedra_PowerSet::geometrically_covers(const
+ Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::geometrically_equals(const
+ Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 14:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.1): Documented
+ function pairwise_reduce().
+
+2004-08-20 Friday 13:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.145): Some stuff (lazy/eager operators and
+ polymorphism disclaimer) moved into section 1.6 (Using the
+ Library).
+
+2004-08-20 Friday 13:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.144): Bug fixed.
+
+2004-08-20 Friday 13:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.29): Documented method
+ pairwise_reduce().
+
+2004-08-20 Friday 13:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.143), ppl.sty (1.15): First draft of
+ description of the powerset construction added.
+
+2004-08-20 Friday 11:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README.configure (ppl-0_6-branch.1): Spurious indentation fixed.
+
+2004-08-20 Friday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.defs.hh, H79_Certificate.defs.hh
+ (ppl-0_6-branch.[1,1]): In the Doxygen comments: lgo --> limited
+ growth ordering.
+
+2004-08-20 Friday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README.configure (1.6): A spurious indentation fixed.
+
+2004-08-20 Friday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.defs.hh (1.5), H79_Certificate.defs.hh
+ (1.4): In the Doxygen comment: lgo --> limited growth ordering
+
+2004-08-19 Thursday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS, CREDITS, ChangeLog, Makefile.am, NEWS, README,
+ README.configure, STANDARDS, TODO, config.guess, config.sub,
+ configure.ac, depcomp, install-sh, ltmain.sh, ppl.lsm.in,
+ ppl.spec.in, Watchdog/ChangeLog,
+ Watchdog/Doubly_Linked_Object.defs.hh,
+ Watchdog/Doubly_Linked_Object.inlines.hh,
+ Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+ Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+ Watchdog/EList_Iterator.defs.hh,
+ Watchdog/EList_Iterator.inlines.hh,
+ Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+ Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+ Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/Pending_Element.cc,
+ Watchdog/Pending_Element.defs.hh,
+ Watchdog/Pending_Element.inlines.hh,
+ Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+ Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+ Watchdog/Pending_List.types.hh, Watchdog/README,
+ Watchdog/Time.cc, Watchdog/Time.defs.hh,
+ Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+ Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+ Watchdog/Watchdog.inlines.hh, Watchdog/config.guess,
+ Watchdog/config.sub, Watchdog/configure.ac, Watchdog/depcomp,
+ Watchdog/install-sh, Watchdog/ltmain.sh, demos/Makefile.am,
+ demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+ demos/ppl_lcdd/examples/.cvsignore,
+ demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/.cvsignore,
+ demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+ demos/ppl_lpsol/ppl_lpsol.c, demos/ppl_lpsol/examples/.cvsignore,
+ demos/ppl_lpsol/examples/Makefile.am,
+ demos/ppl_lpsol/examples/afiro.mps,
+ demos/ppl_lpsol/examples/bgprtr.mps,
+ demos/ppl_lpsol/examples/ex1.mps,
+ demos/ppl_lpsol/examples/sample.mps,
+ demos/ppl_lpsol/examples/unboundedmin.mps, doc/Makefile.am,
+ doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/devref.tex, doc/fdl.txt, doc/gpl.txt, doc/ppl.sty,
+ doc/user-browse.doxyconf-latex.in,
+ doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+ doc/user.tex, interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/Makefile.am,
+ interfaces/Prolog/Ciao/ciao_pl_check.pl,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/.cvsignore,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_pl_check.P,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+ src/BHRZ03_Certificate.defs.hh,
+ src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.inlines.hh,
+ src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+ src/C_Polyhedron.inlines.hh, src/ConSys.defs.hh,
+ src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/H79_Certificate.cc,
+ src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+ src/H79_Certificate.types.hh, src/Init.cc, src/Makefile.am,
+ src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+ src/NNC_Polyhedron.inlines.hh, src/Ph_Status.idefs.hh,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.defs.hh,
+ src/Polyhedra_PowerSet.defs.hh,
+ src/Polyhedra_PowerSet.inlines.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+ src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.defs.hh,
+ src/SatMatrix.defs.hh, src/Widening_Function.defs.hh,
+ src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+ src/algorithms.hh, src/conversion.cc, src/globals.cc,
+ src/globals.hh, src/minimize.cc, src/simplify.cc,
+ src/statistics.hh, src/version.hh.in, tests/.cvsignore,
+ tests/Makefile.am, tests/bgp99extrapolation1.cc,
+ tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+ tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+ tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+ tests/bhz03widening6.cc, tests/boundingbox1.cc,
+ tests/boundingbox2.cc, tests/boundingbox3.cc,
+ tests/boundingbox4.cc, tests/boundingbox5.cc,
+ tests/exceptions3.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+ tests/folddims1.cc, tests/folddims2.cc, tests/h79widening6.cc,
+ tests/linearpartition1.cc, tests/linearpartition2.cc,
+ tests/linearpartition3.cc, tests/linearpartition4.cc,
+ tests/polydifference8.cc, tests/watchdog1.cc
+ (altnum.[1,2,1,2,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,2,2,1,1,2,2,2,2,2,1,1,1,1,1,7,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,1,1,2,1,1,1,1,1,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ First merge from main trunk.
+
+2004-08-19 Thursday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.207), linearpartition4.cc (1.1): New test
+ for linear_partition() (still to be completed).
+
+2004-08-19 Thursday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.119): Version number bumped.
+
+2004-08-19 Thursday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.18): Updated.
+
+2004-08-19 Thursday 15:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.142): This is a start in revising the
+ introductory sections to the manual so as to allow for the
+ inclusion of domains other than that of convex polyhedra.
+
+2004-08-19 Thursday 14:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+ (ppl-0_6-branch.[2,2,3]), devref-browse.doxyconf-latex.in (1.40),
+ devref-print.doxyconf-latex.in (1.40), devref.doxyconf-html.in
+ (1.40): AskTell should not appear in the develper's reference.
+
+2004-08-19 Thursday 14:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Widening_Function.defs.hh (ppl-0_6-branch.1): Avoided a
+ warning in the devref documentation.
+
+2004-08-19 Thursday 14:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Widening_Function.defs.hh (1.4): Avoided a warning in the
+ devref documentation.
+
+2004-08-19 Thursday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (ppl-0_6-branch.2), AskTell.defs.hh (1.24):
+ Previous change reverted.
+
+2004-08-19 Thursday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.39),
+ devref-print.doxyconf-latex.in (1.39), devref.doxyconf-html.in
+ (1.39): Widening_Function and Polyhedra_PowerSet should appear in
+ all the devref manuals.
+
+2004-08-19 Thursday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/AskTell.defs.hh (1.23): AskTell should not appear in the user
+ documentation until working.
+
+2004-08-19 Thursday 12:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+ (ppl-0_6-branch.[1,1,2]): Widening_Function should appear in the
+ devref manuals.
+
+2004-08-19 Thursday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref.doxyconf-html.in (ppl-0_6-branch.1):
+ Polyhedra_PowerSet has to also appear in the developers manual.
+
+2004-08-19 Thursday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/AskTell.defs.hh (ppl-0_6-branch.1): AskTell construction
+ should not appear in the user manuals.
+
+2004-08-18 Wednesday 23:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (ppl-0_6-branch.1), Makefile.am (1.76): AskTell
+ is unfinished and not working: it should not be distributed.
+
+2004-08-18 Wednesday 22:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: configure.ac (ppl-0_6-branch.1), ChangeLog (1.8),
+ configure.ac (1.20): Version number bumped.
+
+2004-08-18 Wednesday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_6-branch.1): Update version.
+
+2004-08-18 Wednesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[1,1]): Mark
+ ChangeLog.
+
+2004-08-18 Wednesday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.21): Distribute more documentation.
+
+2004-08-18 Wednesday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.38),
+ devref-print.doxyconf-latex.in (1.38): The Polyhedra_PowerSet
+ documentation has to appear in the devref manual too.
+
+2004-08-18 Wednesday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Widening_Function.defs.hh (1.3), algorithms.hh (1.29):
+ Applied the Doxygen \relates command in a couple of places.
+
+2004-08-18 Wednesday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bgp99extrapolation1.cc (1.4), bgp99extrapolation2.cc
+ (1.5), bhz03widening1.cc (1.5), bhz03widening2.cc (1.6),
+ bhz03widening3.cc (1.4), bhz03widening6.cc (1.4): Modified to
+ comply with the new interface.
+
+2004-08-18 Wednesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.28),
+ Polyhedra_PowerSet.inlines.hh (1.39): Added doxygen
+ documentation. Removed some methods that are now subsumed by the
+ generic ones.
+
+2004-08-18 Wednesday 13:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README (1.3): Last change reverted.
+
+2004-08-18 Wednesday 13:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.23): Ready for the release.
+
+2004-08-18 Wednesday 13:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/README (1.2): Revised.
+
+2004-08-18 Wednesday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.29): Installation of the documentation now
+ works both for distribution archives and for CVS versions.
+
+2004-08-18 Wednesday 11:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.38): Include
+ "Widening_Function.defs.hh" instead of
+ "Widening_Function.types.hh".
+
+2004-08-18 Wednesday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.84): Ready for the release.
+
+2004-08-18 Wednesday 09:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bhz03widening4.cc (1.3), bhz03widening5.cc (1.3):
+ Exploiting helper functions widen_fun().
+
+2004-08-18 Wednesday 09:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.37): Exploiting helper
+ function widen_fun().
+
+2004-08-18 Wednesday 09:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: GenSys.cc (1.86), Polyhedron.types.hh (1.12),
+ Polyhedron_widenings.cc (1.22), conversion.cc (1.54), simplify.cc
+ (1.36): Comments improved.
+
+2004-08-18 Wednesday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.106), interfaces/C/ppl_c.h.in (1.32),
+ src/C_Polyhedron.defs.hh (1.23), src/C_Polyhedron.inlines.hh
+ (1.17), src/NNC_Polyhedron.defs.hh (1.26),
+ src/NNC_Polyhedron.inlines.hh (1.18), tests/Makefile.am (1.206),
+ tests/exceptions3.cc (1.2): Start dealing with requests to build
+ "over-sized" objects.
+
+2004-08-18 Wednesday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Widening_Function.defs.hh (1.2),
+ Widening_Function.inlines.hh (1.3): Added helper function
+ widen_fun() to simplify the creation of widening function
+ objects. Added brief documentation.
+
+2004-08-18 Wednesday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: linearpartition2.cc (1.14), linearpartition3.cc (1.14):
+ Fixed.
+
+2004-08-18 Wednesday 09:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: AskTell.defs.hh (1.22), ConSys.defs.hh (1.84),
+ Determinate.defs.hh (1.42), GenSys.defs.hh (1.97),
+ Polyhedra_PowerSet.defs.hh (1.27), Polyhedron.defs.hh (1.241),
+ Polyhedron.inlines.hh (1.94): Comments improved.
+
+2004-08-18 Wednesday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/linearpartition1.cc (1.14): Fixed.
+
+2004-08-17 Tuesday 23:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Widening_Function.inlines.hh (1.2):
+ Limited_Widening_Function::operator() fixed.
+
+2004-08-17 Tuesday 23:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.28): Install documentation in text format.
+
+2004-08-17 Tuesday 21:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bhz03widening4.cc (1.2), bhz03widening5.cc (1.2):
+ Corrected to work with the new implementation.
+
+2004-08-17 Tuesday 21:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am (1.75), Polyhedra_PowerSet.defs.hh (1.26),
+ Polyhedra_PowerSet.inlines.hh (1.36), Widening_Function.defs.hh
+ (1.1), Widening_Function.inlines.hh (1.1),
+ Widening_Function.types.hh (1.1): Factorized a lot of code
+ related to widenings of powersets by using function objects
+ instead of method pointers.
+
+2004-08-17 Tuesday 21:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.41), Determinate.inlines.hh (1.39),
+ algorithms.hh (1.28): Improved a little bit the docuemntation for
+ the Determinate construction. Removed a few seemingly useless
+ methods. The polyhedron() methods renamed as element().
+
+2004-08-17 Tuesday 19:43 Abramo Bagnara
+
+ * src/checked_mpq.inlines.hh (altnum.8): Fixed unhandled native
+ integer type behaviour.
+
+2004-08-17 Tuesday 19:39 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (altnum.9): Fixed unhandled native
+ integer type behaviour.
+
+2004-08-17 Tuesday 19:33 Abramo Bagnara
+
+ * src/Makefile.am (altnum.6): Added Limits.hh
+
+2004-08-17 Tuesday 19:33 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.6): Fixed float96_t format
+ oddities. Cleaned code.
+
+2004-08-17 Tuesday 19:31 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Limits.hh, checked.defs.hh, checked_int.inlines.hh
+ (altnum.[4,5,1,7,6]): Fixed unhandled native integer type
+ behaviour.
+
+2004-08-17 Tuesday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/gpl.txt (1.2): Spacing fixed.
+
+2004-08-17 Tuesday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.25): Distribute also README.configure.
+
+2004-08-17 Tuesday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.83): One less thing to do.
+
+2004-08-17 Tuesday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS (1.4), CREDITS (1.13): Formatted.
+
+2004-08-17 Tuesday 14:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * README.configure (1.5): Corrected a typo and improved the
+ English.
+
+2004-08-17 Tuesday 13:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * BUGS (1.3), CREDITS (1.12), STANDARDS (1.14): English
+ improvements made.
+
+2004-08-17 Tuesday 12:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.40), Determinate.inlines.hh (1.38),
+ PowerSet.defs.hh (1.47), PowerSet.inlines.hh (1.57):
+ Determinate::operator+(), Determinate::operator*(),
+ PowerSet::operator+() and PowerSet::operator*() removed.
+
+2004-08-17 Tuesday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.11): Small English improvement.
+
+2004-08-17 Tuesday 11:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/bhz03widening2.cc (1.5): Redundant code removed.
+
+2004-08-17 Tuesday 11:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.39), Determinate.inlines.hh (1.37):
+ The methods grouped according to constness and space-dim
+ preservation, as done for the class Polyhedron. Two inline
+ directives moved from *.defs.hh into *.inlines.hh.
+
+2004-08-17 Tuesday 10:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.94): Tests for adding and
+ removing dimensions now include cases where no dimensions are
+ added or removed and also when all the dimensions are removed.
+
+2004-08-17 Tuesday 10:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.141): The descriptions of the add and
+ remove dimensions operators improved. The description of the
+ concatenate operation moved to just before the description of the
+ add dimensions operators.
+
+2004-08-17 Tuesday 10:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.98), configure.ac (1.118), doc/Makefile.am (1.27): The
+ documentation for users, in PostScript, PDF and HTML formats, is
+ now installed in a standard place by `make install'.
+
+2004-08-17 Tuesday 09:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.38): Small improvements.
+
+2004-08-17 Tuesday 09:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.140): Added a section on constructions on
+ polyhedra.
+
+2004-08-17 Tuesday 09:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.25): Started documenting the
+ widening operators.
+
+2004-08-17 Tuesday 09:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.defs.hh (1.4),
+ BHRZ03_Certificate.inlines.hh (1.2), H79_Certificate.cc (1.2),
+ H79_Certificate.defs.hh (1.3), H79_Certificate.inlines.hh (1.2):
+ H79_Certificate simplified by removing useless methods. The
+ documentation of BHRZ03_Certificate method is_stabilizing() now
+ only appears in the developers manual. Both classes now appear in
+ the user manual, as they provide documentation of the method
+ needed by any new certificate.
+
+2004-08-17 Tuesday 09:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.111): Several minor
+ "English" corrections and some cross references improved or
+ added.
+
+2004-08-17 Tuesday 09:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.139): An anchor has been added and minor
+ English improvement.
+
+2004-08-17 Tuesday 08:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: bhz03widening3.cc (1.3), bhz03widening6.cc (1.3),
+ boundingbox2.cc (1.21), boundingbox4.cc (1.10): Comments revised
+ in boundinbox2.cc and boundingbox4.cc. Known result in
+ bhz03widening3.cc added and checked. New test added to
+ bhz03widening6.cc for the case when the multiset ordering wrt the
+ lgo is converging.
+
+2004-08-17 Tuesday 00:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bgp99extrapolation2.cc (1.4): Be quiet.
+
+2004-08-17 Tuesday 00:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/folddims2.cc (1.2): Removed test that was already made in
+ folddims1.cc. Comment revised.
+
+2004-08-17 Tuesday 00:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.205): Spurious backslash removed.
+
+2004-08-17 Tuesday 00:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bgp99extrapolation2.cc (1.3): Completed (and made more
+ interesting).
+
+2004-08-16 Monday 21:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Makefile.am (1.204), folddims2.cc (1.1): Tests for NNC
+ polyhedra added.
+
+2004-08-16 Monday 21:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/bgp99extrapolation2.cc (1.2): Comment corrected.
+
+2004-08-16 Monday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/h79widening6.cc (1.7): An example taken from CH78.
+
+2004-08-16 Monday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.203), bgp99extrapolation2.cc (1.1),
+ h79widening6.cc (1.6): Test program h79widening6.cc renamed
+ bgp99extrapolation2.cc.
+
+2004-08-16 Monday 19:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.20): Added the `ppl_lcdd' program to the main
+ package. Require gcc-c++ to be exactly version 3.4.1.
+
+2004-08-16 Monday 19:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/Makefile.am (1.3): The `ppl_lcdd' program will be
+ installed in `bindir'.
+
+2004-08-16 Monday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.5), ppl.spec.in (1.19): Updated.
+
+2004-08-16 Monday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.138): Definition of the folding operation
+ improved.
+
+2004-08-16 Monday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.82): Some items postponed. Main points of PPL 0.7
+ drafted.
+
+2004-08-16 Monday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.22): Typo fixed.
+
+2004-08-16 Monday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/README (1.7): Updated.
+
+2004-08-16 Monday 18:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.defs.hh (1.3), H79_Certificate.defs.hh
+ (1.2): Fixed the documentation of the certificates (for now, this
+ will only appear in the developer manual).
+
+2004-08-16 Monday 18:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.24),
+ Polyhedra_PowerSet.inlines.hh (1.35): Fixed header inclusions.
+
+2004-08-16 Monday 18:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.37), src/Polyhedron.defs.hh (1.240),
+ doc/definitions.dox (1.137): Added a section about concatenation
+ of polyhedra to the introduction of the user manual. Now the
+ documentation of concatenate_assign() refers to it.
+
+2004-08-16 Monday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.54): Prolog_raise_exception()
+ implemented.
+
+2004-08-16 Monday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.10): Specify that Andrea is with the University of
+ Parma. Email address omitted.
+
+2004-08-16 Monday 17:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.21): Formatting changes.
+
+2004-08-16 Monday 17:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.93): This test file now checks
+ correctly that the exceptions do work ok.
+
+2004-08-16 Monday 17:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.20): Updated.
+
+2004-08-16 Monday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.4): Added instructions about the use of
+ Comeau C/C++ 4.3.3.
+
+2004-08-16 Monday 16:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.97): Announce the new README.configure file.
+
+2004-08-16 Monday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.96): Drafted an announcement for the new Determinate,
+ PowerSet and Polyhedra_PowerSet classes.
+
+2004-08-16 Monday 16:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.inlines.hh (1.33): Fixed
+ ConSys::max_space_dimension().
+
+2004-08-16 Monday 14:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/bhz03widening6.cc (1.2): Comments added.
+
+2004-08-16 Monday 14:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Makefile.am (1.202), bhz03widening6.cc (1.1): dded more
+ tests.
+
+2004-08-16 Monday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.81): Some items postponed. Main points of PPL 0.7
+ drafted.
+
+2004-08-16 Monday 12:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.95): Announce the new "expand" and "fold" operations.
+
+2004-08-16 Monday 12:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.201), bhz03widening4.cc (1.1),
+ bhz03widening5.cc (1.1): New tests are the same as
+ bhz03widening1.cc and bhz03widening2.cc, but use the
+ H79_Certificate instead of BHRZ03_Certificate.
+
+2004-08-16 Monday 12:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: H79_Certificate.cc (1.1), H79_Certificate.defs.hh (1.1),
+ H79_Certificate.inlines.hh (1.1), H79_Certificate.types.hh (1.1),
+ Makefile.am (1.74), Polyhedra_PowerSet.defs.hh (1.23),
+ Polyhedra_PowerSet.inlines.hh (1.34), Polyhedron.defs.hh (1.239):
+ Added the H79 widening certificate. The certificate-based
+ widening methods for the Polyhedra_Powerset domain made generic
+ by parameterizing the certificate used. The instance using the
+ BHRZ03_Certificate still have the old name (so as old code still
+ works).
+
+2004-08-16 Monday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.94), Watchdog/NEWS (1.4): Our tentative release date is
+ August 18, 2004.
+
+2004-08-16 Monday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.17), Watchdog/ChangeLog (1.7): Updated.
+
+2004-08-16 Monday 08:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.14): In
+ Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+ correctly handle the case where the set is empty.
+
+2004-08-15 Sunday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.105), ppl_c.h.in (1.31): New C
+ interface functions ppl_Polyhedron_expand_dimension() and
+ ppl_Polyhedron_fold_dimensions().
+
+2004-08-15 Sunday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.13): Polyhedron::fold_dimensions()
+ now checks its interface invariants.
+
+2004-08-15 Sunday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.238): Completed the documentation of
+ Polyhedron::fold_dimensions().
+
+2004-08-15 Sunday 19:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.136): Set-cardinality notation explained.
+
+2004-08-15 Sunday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.22): Do not mix extern "C" pointers
+ and extern "C++" pointers: they are different types.
+
+2004-08-15 Sunday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.135): Drafted a formal definition of the
+ "fold_dimensions" operation.
+
+2004-08-15 Sunday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.sty (1.14): Added the definition of the set-cardinality
+ operator `\card'.
+
+2004-08-15 Sunday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.134), src/Polyhedron.defs.hh (1.237):
+ Added placeholder and reference to the (yet to be written)
+ section on folding dimensions.
+
+2004-08-15 Sunday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: boundingbox1.cc (1.36), boundingbox3.cc (1.12),
+ boundingbox4.cc (1.9): Comments corrected/revised.
+
+2004-08-15 Sunday 10:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.110): Documentation for
+ the ppl_Polyhedron_expand_dimension/3 and
+ ppl_Polyhedron_fold_dimensions/3 predicates, added.
+
+2004-08-15 Sunday 10:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.92): A bug has been fixed. The
+ tests for the bounding box predicates improved.
+
+2004-08-15 Sunday 10:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: boundingbox1.cc (1.35), boundingbox2.cc (1.20),
+ boundingbox3.cc (1.11), boundingbox4.cc (1.8): The tests for
+ shrink_bounding_box() and building polyhedra from boxes have been
+ revised.
+
+2004-08-15 Sunday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.21): Catch and handle the
+ exceptions that may be raised.
+
+2004-08-15 Sunday 08:44 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (altnum.8): Added conversion from mpz
+ to int.
+
+2004-08-15 Sunday 00:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.20): Missing include files added.
+ Reduced the scope of some variables in set_alarm_on_cpu_time().
+
+2004-08-14 Saturday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.3): Added instructions on how to use the
+ Intel C/C++ compiler.
+
+2004-08-14 Saturday 23:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.117): Version number bumped. Require Autoconf
+ 2.59 or later.
+
+2004-08-14 Saturday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox5.cc (1.2): Be quiet.
+
+2004-08-14 Saturday 23:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Ph_Status.idefs.hh (1.6): Inclusion guard added.
+
+2004-08-14 Saturday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Integer.defs.hh (altnum.5): Friend declarations
+ fixed.
+
+2004-08-14 Saturday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Checked_Integer.inlines.hh (altnum.6): Horrible kludge to fix
+ a bug in Checked_Integer<T>::Checked_Integer(U), where U is some
+ native integral type.
+
+2004-08-14 Saturday 10:11 Abramo Bagnara
+
+ * src/checked_mpz.inlines.hh (altnum.7): Fixed unsigned/signed
+ typo.
+
+2004-08-14 Saturday 10:10 Abramo Bagnara
+
+ * src/: Checked_Integer.inlines.hh, Checked_Number.inlines.hh,
+ checked.defs.hh, checked_float.inlines.hh, checked_mpq.inlines.hh
+ (altnum.[5,4,6,5,7]): Fixed code formatting.
+
+2004-08-14 Saturday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (altnum.5): Include the contents of
+ Integer.inlines.hh in ppl_install.hh.
+
+2004-08-14 Saturday 00:04 Abramo Bagnara
+
+ * src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[6,6]): Fixed signed/unsigned conversion.
+
+2004-08-13 Friday 19:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bhz03widening3.cc (1.2): Be quiet.
+
+2004-08-13 Friday 19:21 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked_mpq.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[5,5,5]): Always pass 'from'
+ arguments by reference in inline helper functions
+
+2004-08-13 Friday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+ (altnum.[4,4]): Qualified name is not allowed in namespace member
+ declaration.
+
+2004-08-13 Friday 18:05 Abramo Bagnara
+
+ * configure.ac (altnum.4): Added AM_CONDITIONAL for new checked
+ code.
+
+2004-08-13 Friday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.10), src/Makefile.am (1.73): Version info
+ updated for the libtool libraries.
+
+2004-08-13 Friday 17:29 Abramo Bagnara
+
+ * src/checked.defs.hh (altnum.4): More explicit name for function
+ container
+
+2004-08-13 Friday 17:20 Abramo Bagnara
+
+ * src/float.types.hh (altnum.2): Renamed float basic type.
+
+2004-08-13 Friday 17:19 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked.inlines.hh,
+ checked_int.inlines.hh, checked_mpq.inlines.hh,
+ checked_mpz.inlines.hh (altnum.[3,3,5,3,3]): Added many const.
+ Renamed float basic type.
+
+2004-08-13 Friday 17:19 Abramo Bagnara
+
+ * src/checked_float.inlines.hh (altnum.4): Added pred/succ.
+
+2004-08-13 Friday 17:17 Abramo Bagnara
+
+ * src/Makefile.am (altnum.4): Adjusted for use of new checked code.
+
+2004-08-13 Friday 17:17 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Checked_Number.types.hh (altnum.[3,3,2]): Added policy to
+ Checked_Numbers. Added operator from basic types.
+
+2004-08-13 Friday 17:07 Abramo Bagnara
+
+ * src/Checked_Number.cc (altnum.2): Removed empty file.
+
+2004-08-13 Friday 17:06 Abramo Bagnara
+
+ * src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+ GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Integer.defs.hh,
+ Integer.inlines.hh, Integer.types.hh, Native_Integer.defs.hh,
+ Native_Integer.inlines.hh (altnum.[4,4,3,3,4,1,4,4,4]): Shared
+ definitions and declarations Integer_{zero,one}.
+
+2004-08-13 Friday 16:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.9), doc/devref.tex (1.14), doc/user.tex (1.15):
+ Authors lists adapted to reality.
+
+2004-08-13 Friday 16:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.116): Version number bumped.
+
+2004-08-13 Friday 16:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.13): Slightly modified the policy for the list of
+ parameters: for increased flexibility, detailed comments may
+ occur both before and after the list.
+
+2004-08-13 Friday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.21), C_Polyhedron.defs.hh (1.22),
+ ConSys.defs.hh (1.83), Determinate.defs.hh (1.36), GenSys.defs.hh
+ (1.96), Generator.defs.hh (1.87), Matrix.defs.hh (1.58),
+ NNC_Polyhedron.defs.hh (1.25), Polyhedra_PowerSet.defs.hh (1.22),
+ Polyhedron.defs.hh (1.236), Row.defs.hh (1.79), SatMatrix.defs.hh
+ (1.34), conversion.cc (1.53), globals.hh (1.37), minimize.cc
+ (1.36), simplify.cc (1.35): All parameter lists formatted
+ according to the new policy in STANDARDS.
+
+2004-08-13 Friday 16:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/.cvsignore (1.6), tests/.cvsignore (1.9):
+ Updated.
+
+2004-08-13 Friday 15:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.91): Tests for
+ ppl_new_Polyhedron_from_bounding_box/3 that use the empty box as
+ input have been added. Unwanted code removed.
+
+2004-08-13 Friday 14:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.93), interfaces/Prolog/ppl_prolog.icc (1.134): Fixed a
+ bug in the Prolog interface predicate
+ ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+ failing when given an empty bounding box.
+
+2004-08-13 Friday 14:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.90): Improved documentation and
+ tests.
+
+2004-08-13 Friday 12:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.235), Polyhedron_nonpublic.cc (1.20):
+ Some parameters renamed so as to be more consistent with the rest
+ of the code.
+
+2004-08-13 Friday 12:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.80): Updated.
+
+2004-08-13 Friday 12:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/version.hh.in (1.9): Split the brief and detailed parts of a
+ couple of doxygen comments.
+
+2004-08-13 Friday 12:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.30): Split a few brief comments where
+ seemingly appropriate. Started applying the new formatting
+ policy for doxygen lists of parameters.
+
+2004-08-13 Friday 12:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.12): Drafted a policy for the formatting of
+ parameter lists in doxygen comments.
+
+2004-08-13 Friday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.72): ppl.hh and ppl_install.hh also depend on
+ version.hh.
+
+2004-08-13 Friday 11:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.92): Fixed a bug in the Prolog interface predicate
+ ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+ sometimes computed in the case of an empty polyhedron.
+
+2004-08-13 Friday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BoundingBox.inlines.hh (1.12): BoundingBox::set_empty() now
+ empties all the intervals.
+
+2004-08-13 Friday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: boundingbox1.cc (1.34), boundingbox2.cc (1.19),
+ boundingbox3.cc (1.10), boundingbox4.cc (1.7): Comments fixed.
+
+2004-08-13 Friday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.200), boundingbox5.cc (1.1): New test for
+ Polyhedron::shrink_bounding_box().
+
+2004-08-13 Friday 10:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.89): Improved comments and
+ better sequence of tests for the widening and extrapolation
+ operators.
+
+2004-08-13 Friday 08:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.37),
+ devref-print.doxyconf-latex.in (1.37), devref.doxyconf-html.in
+ (1.38), user-browse.doxyconf-latex.in (1.20),
+ user-print.doxyconf-latex.in (1.20), user.doxyconf-html.in
+ (1.22): Use the `:=' operator to PREDEFINE __P: this prevents the
+ definition to be undefined by `#undef'.
+
+2004-08-13 Friday 08:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.88): Added simpler test defined
+ by predicate boundingbox_test/0 to show bug in
+ ppl_Polyhedron_get_bounding_box/3 predicate when the polyhedron
+ is empty. Test can be run using check_noisy/0.
+
+2004-08-13 Friday 00:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.19), doc/devref-browse.doxyconf-latex.in (1.36),
+ doc/devref-print.doxyconf-latex.in (1.36),
+ doc/devref.doxyconf-html.in (1.37): The file statistics.hh has
+ been removed.
+
+2004-08-13 Friday 00:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.79): Harmonization of methods Polyhedron::throw_*() dealt
+ with.
+
+2004-08-13 Friday 00:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.9), Constraint.cc (1.41),
+ Constraint.defs.hh (1.87), Constraint.inlines.hh (1.49),
+ Generator.cc (1.49), Generator.defs.hh (1.86),
+ Generator.inlines.hh (1.43), Matrix.defs.hh (1.57),
+ Ph_Status.idefs.hh (1.5), Poly_Con_Relation.defs.hh (1.24),
+ Poly_Gen_Relation.defs.hh (1.22), Polyhedron.defs.hh (1.234),
+ Polyhedron.inlines.hh (1.93), Polyhedron_chdims.cc (1.12),
+ Polyhedron_nonpublic.cc (1.19), Polyhedron_public.cc (1.25),
+ Polyhedron_widenings.cc (1.21), Row.defs.hh (1.78): The various
+ methods throw_incompatible_*() made more consistent with each
+ other, as well as the way they are called. When closing a
+ doxygen comment group with @}, made clear the group closed.
+
+2004-08-12 Thursday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.91): Mention that a bug has been fixed in
+ Polyhedron::poly_difference_assign(const Polyhedron&).
+
+2004-08-12 Thursday 18:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.87), ppl_prolog.icc (1.133),
+ Ciao/ciao_pl_check.pl (1.4), Ciao/ppl_ciao.pl (1.66),
+ GNU/ppl_gprolog.pl (1.45), SICStus/ppl_sicstus_sd.cc (1.62),
+ SWI/ppl_swiprolog.cc (1.87), XSB/ppl_xsb.H (1.32), XSB/ppl_xsb.cc
+ (1.53), XSB/xsb_pl_check.P (1.9), YAP/ppl_yap.cc (1.80): Added
+ interface predicate for fold_dimensions(). Added test for this
+ predicate.
+
+2004-08-12 Thursday 17:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.86): Bugs introduced by adding
+ full stops corrected.
+
+2004-08-12 Thursday 17:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.24): The patch for poly-difference
+ operator seems to be the right solution: CHECKME removed.
+
+2004-08-12 Thursday 17:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.133), src/Polyhedron.defs.hh (1.233):
+ Pedantic correction to the explanation of poly-difference.
+
+2004-08-12 Thursday 17:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.29): Simplified comments about
+ poly-hull operators. For the poly-difference, added reference to
+ appropriate section of the manual.
+
+2004-08-12 Thursday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.2), TODO (1.78): Explained the basics about
+ configuring GMP and the PPL, as far as selecting the right
+ version of GPM is concerned.
+
+2004-08-12 Thursday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.77), doc/definitions.dox (1.132): Added a paragraph
+ explaining that PPL types should not be used polymorphically.
+ This is at the beginning of section 7 (The library), since it is
+ specific of the C++ language.
+
+2004-08-12 Thursday 15:14 Abramo Bagnara
+
+ * src/Integer.defs.hh (altnum.3): Fixed typos including new files.
+
+2004-08-12 Thursday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Integer.defs.hh, src/Integer.types.hh
+ (altnum.[3,2,3]): First go at a setup that allows to test the new
+ checked code against the old one. The configure option
+ `--enable-new-checked-code' does what is expected.
+
+2004-08-12 Thursday 12:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.76), doc/definitions.dox (1.131): Small improvement to
+ the discussion about the use of iterators and references.
+
+2004-08-12 Thursday 11:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.28): Corrected two doxygen comments:
+ "const iterator system" --> "const iterator".
+
+2004-08-12 Thursday 11:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.130): Drafted a section providing a
+ warning about the possible invalidation of references and
+ iterators.
+
+2004-08-12 Thursday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac, src/Integer.types.hh, src/Makefile.am
+ (altnum.[2,2,3]): Do not use C types like char, short, long and
+ long long. Use the fixed width types int8_t, int16_t, int32_t
+ and int64_t instead.
+
+2004-08-12 Thursday 10:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/folddims1.cc (1.2): A number of different tests for
+ fold_dimensions() added.
+
+2004-08-12 Thursday 10:20 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.4): Added preliminary
+ optimizations.
+
+2004-08-12 Thursday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/checked_float.inlines.hh (altnum.3): Parenthesis moved
+ outside #if/#endif block.
+
+2004-08-12 Thursday 09:49 Abramo Bagnara
+
+ * src/checked.inlines.hh (altnum.2): Missing file from previous
+ commit (policy addition).
+
+2004-08-12 Thursday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.23): Added a comment to the
+ implementation of Polyhedron::poly_difference_assign().
+
+2004-08-12 Thursday 09:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.85): Given a proper reference to
+ the work of Gopan et al. Comments terminated by a full-stop.
+
+2004-08-12 Thursday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.132): Indentation fixed.
+
+2004-08-12 Thursday 09:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.199), expanddim1.cc (1.7), expanddim2.cc
+ (1.1): Tests that are specific to NNC polyhedra must go in
+ separate files: expanddim2.cc cut out from expanddim1.cc.
+
+2004-08-12 Thursday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/expanddim1.cc (1.6): Biobliographic reference fixed.
+
+2004-08-12 Thursday 08:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.84): Added another (simple) test
+ for the poly difference predicate; Added a test for the
+ expand_dimension predicate based on that in the TACAS04 paper on
+ page 519.
+
+2004-08-12 Thursday 08:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/expanddim1.cc (1.5): Added test corresponding to example in
+ the TACAS04 paper on page 519.
+
+2004-08-12 Thursday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/expanddim1.cc (1.4): We always terminate sentences with a
+ full stop.
+
+2004-08-11 Wednesday 23:49 Abramo Bagnara
+
+ * src/checked_int.inlines.hh (altnum.3): Changed approach to
+ checked add/sub to avoid undefined behaviour caused by out of
+ range expressions.
+
+2004-08-11 Wednesday 22:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.83): Test for
+ ppl_Polyhedron_poly_difference_assign corrected.
+
+2004-08-11 Wednesday 21:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.82), ppl_prolog.icc (1.131),
+ Ciao/ciao_pl_check.pl (1.3), Ciao/ppl_ciao.pl (1.65),
+ GNU/ppl_gprolog.pl (1.44), SICStus/ppl_sicstus_sd.cc (1.61),
+ SWI/ppl_swiprolog.cc (1.86), XSB/ppl_xsb.H (1.31), XSB/ppl_xsb.cc
+ (1.52), XSB/xsb_pl_check.P (1.8), YAP/ppl_yap.cc (1.79): Prolog
+ interface predicate added for expand_dimension(). Test for new
+ predicate added to pl_check.pl.
+
+2004-08-11 Wednesday 21:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/expanddim1.cc (1.3): More tests added for testing
+ expand_dimensions().
+
+2004-08-11 Wednesday 19:25 Abramo Bagnara
+
+ * src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+ Result_Info.defs.hh, checked.defs.hh, checked_float.cc,
+ checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+ checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+ checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+ checked_mpz.defs.hh, checked_mpz.inlines.hh
+ (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]): Added policy to
+ checked functions. Deleted useless files. Confined checked
+ functions and helper class to Checked namespace.
+
+2004-08-11 Wednesday 18:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.22): Drafted a patch to correct bug
+ shown by polydifference8.cc.
+
+2004-08-11 Wednesday 18:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.198), bhz03widening3.cc (1.1),
+ polydifference8.cc (1.1): New test polydifference8.cc (extracted
+ from bhz03wodening3.cc) shows a bug in method
+ Polyhedron::poly_difference_assign().
+
+2004-08-11 Wednesday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.197), folddims1.cc (1.1): Use folddims1.cc
+ for testing Polyhedron::fold_dimensions().
+
+2004-08-11 Wednesday 16:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.21),
+ Polyhedra_PowerSet.inlines.hh (1.33): Use BHRZ03_Certificate
+ instead of BHRZ03_info. First step towards generalizing the BHZ03
+ widening to arbitrary certificates.
+
+2004-08-11 Wednesday 16:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.232), Polyhedron.inlines.hh (1.92),
+ Polyhedron_widenings.cc (1.20): Got rid of all the stuff related
+ to Polyhedron::BHRZ03_info, superseded by the class
+ BHRZ03_Certificate.
+
+2004-08-11 Wednesday 16:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/BHRZ03_Certificate.defs.hh (1.2): The comparison function is
+ now provided with a brief and a detailed doxygen descriptions.
+
+2004-08-11 Wednesday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/expanddim1.cc (1.2): Two new tests sketched.
+
+2004-08-11 Wednesday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.11): Fixed a bug in
+ Polyhedron::expand_dimension(). Polyhedron::fold_dimensions()
+ drafted.
+
+2004-08-11 Wednesday 12:03 Abramo Bagnara
+
+ * src/: Checked_Number.cc, Checked_Number.defs.hh,
+ Checked_Number.inlines.hh, Checked_Number.types.hh
+ (altnum.[1,1,1,1]): Replacement for Checked_Integer and more
+
+2004-08-11 Wednesday 12:03 Abramo Bagnara
+
+ * src/float.types.hh (altnum.1): Native float type declaration
+
+2004-08-11 Wednesday 12:02 Abramo Bagnara
+
+ * src/Result_Info.defs.hh (altnum.1): Result info for checked
+ functions
+
+2004-08-11 Wednesday 12:02 Abramo Bagnara
+
+ * src/: checked.defs.hh, checked.inlines.hh, checked_float.cc,
+ checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+ checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+ checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+ checked_mpz.defs.hh, checked_mpz.inlines.hh
+ (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Checked functions for
+ int, float, mpz and mpq
+
+2004-08-11 Wednesday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.10), tests/Makefile.am (1.196),
+ tests/expanddim1.cc (1.1): Added a prototype implementation of
+ Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-08-09 Monday 23:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.18): Started revision for the PPL 0.6 release.
+
+2004-08-09 Monday 22:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.75): Section on portability migrated to README.configure.
+ Section on constructions on polyhedra revised.
+
+2004-08-09 Monday 22:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README.configure (1.1): New file describing the PPL-specific
+ aspects of configuration, compilation and installation of the
+ library.
+
+2004-08-09 Monday 20:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.26), fdl.txt (1.1), gpl.txt (1.1): We now
+ distribute the GPL and the FDL also in text format (so as not to
+ assume that users have Doxygen and/or LaTeX and/or a
+ PostScript/PDF viewer).
+
+2004-08-09 Monday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Init.cc (1.11), Makefile.am (1.71), Polyhedron_widenings.cc
+ (1.19), statistics.hh (1.4): Dealt with all the stuff needed to
+ collect statistics about the BHRZ03 widening operator.
+
+2004-08-09 Monday 10:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.74), src/Polyhedron.defs.hh (1.231),
+ src/Polyhedron.inlines.hh (1.91): In
+ Polyhedron::map_dimensions(const PartialFunction&), the method
+ PartialFunction::maps() is now called at most `n' times, where
+ `n' is the dimension of the vector space enclosing the
+ polyhedron.
+
+2004-08-09 Monday 08:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.90), TODO (1.73), interfaces/Prolog/ppl_prolog.icc
+ (1.130), src/Polyhedra_PowerSet.inlines.hh (1.32),
+ src/PowerSet.inlines.hh (1.56), src/conversion.cc (1.52),
+ src/globals.cc (1.14), src/globals.hh (1.36), tests/watchdog1.cc
+ (1.20): The variable `abandon_exponential_computations' has been
+ renamed `abandon_expensive_computations'. Its documentation has
+ also been revised.
+
+2004-08-08 Sunday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.18): Two FIXMEs dealt with.
+
+2004-08-08 Sunday 19:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.89), demos/ppl_lcdd/ppl_lcdd.cc (1.19), src/version.hh.in
+ (1.8): New macro PPL_VERSION expands to the version string of the
+ library.
+
+2004-08-08 Sunday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.88), Watchdog/Makefile.am (1.9), Watchdog/Watchdog.cc
+ (1.17), Watchdog/Watchdog.defs.hh (1.13),
+ Watchdog/Watchdog.inlines.hh (1.11),
+ interfaces/Prolog/ppl_prolog.icc (1.129), tests/watchdog1.cc
+ (1.19): Watchdog library completely reorganized. Deadlock bug
+ fixed in the process.
+
+2004-08-08 Sunday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/examples/Makefile.am (1.2): Distribute the
+ examples.
+
+2004-08-08 Sunday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.types.hh (1.11): Namespace closing brace
+ commented.
+
+2004-08-08 Sunday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Handler.defs.hh (1.1), Handler.inlines.hh (1.1),
+ Handler.types.hh (1.1): Classes for handlers of the watchdog
+ events.
+
+2004-08-08 Sunday 18:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.129): Corrected a typo.
+
+2004-08-08 Sunday 12:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.230): Documentation on map_dimensions
+ wrt the specification of pfunc revised.
+
+2004-08-08 Sunday 10:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.229): Added to documentation of
+ map_dimensions, in the specification of the partial function
+ pfunc/2, an indication of the number of times the different
+ methods will be called.
+
+2004-08-07 Saturday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.19), Watchdog/ltmain.sh (1.8): Updated from Libtool
+ 1.5.8.
+
+2004-08-07 Saturday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Pending_List.cc (1.1), Pending_List.defs.hh (1.1),
+ Pending_List.inlines.hh (1.1), Pending_List.types.hh (1.1): An
+ ordered list for recording pending watchdog events.
+
+2004-08-07 Saturday 08:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: EList.defs.hh (1.3), EList.inlines.hh (1.2): The
+ clear() method has been removed. The destructor now destructs
+ also the elements in the list.
+
+2004-08-06 Friday 19:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Pending_Element.cc (1.1), Pending_Element.defs.hh
+ (1.1), Pending_Element.inlines.hh (1.1), Pending_Element.types.hh
+ (1.1): A class for pending watchdog events with embedded links.
+
+2004-08-06 Friday 18:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Doubly_Linked_Object.defs.hh (1.1),
+ Doubly_Linked_Object.inlines.hh (1.1),
+ Doubly_Linked_Object.types.hh (1.1): A (base) class for doubly
+ linked objects.
+
+2004-08-06 Friday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: EList_Iterator.defs.hh (1.1),
+ EList_Iterator.inlines.hh (1.1), EList_Iterator.types.hh (1.1): A
+ class providing iterators for embedded lists.
+
+2004-08-06 Friday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/EList.defs.hh (1.2): Class comment revised.
+
+2004-08-06 Friday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: EList.defs.hh (1.1), EList.inlines.hh (1.1),
+ EList.types.hh (1.1): A list of doubly linked objects (where the
+ links are embedded in the objects themselves).
+
+2004-08-06 Friday 18:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Time.cc (1.1), Time.defs.hh (1.1), Time.inlines.hh
+ (1.1), Time.types.hh (1.1): A class for representing and
+ manipulating positive time intervals.
+
+2004-08-05 Thursday 08:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.72): ppl_Polyhedron_maximize,
+ ppl_Polyhedron_maximize_with_point, and ppl_Polyhedron_minimize,
+ ppl_Polyhedron_minimize_with_point have been added to the Prolog
+ interface with corresponding additions to the documentation and
+ pl_check.pl. Todo item on this removed.
+
+2004-08-05 Thursday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+ Checked_Integer.types.hh, GMP_Integer.defs.hh,
+ GMP_Integer.inlines.hh, GMP_Integer.types.hh,
+ Integer_traits_template.hh, Native_Integer.defs.hh,
+ Native_Integer.inlines.hh, Native_Integer.types.hh
+ (altnum.[3,3,2,2,2,2,2,3,3,2]): Copyright years updated.
+
+2004-08-04 Wednesday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.8), install-sh (1.9), Watchdog/depcomp (1.6),
+ Watchdog/install-sh (1.6): Updated from Automake 1.9.
+
+2004-08-04 Wednesday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.87), configure.ac (1.115), demos/Makefile.am (1.3),
+ demos/ppl_lcdd/Makefile.am (1.2),
+ demos/ppl_lcdd/examples/.cvsignore (1.1),
+ demos/ppl_lcdd/examples/Makefile.am (1.1),
+ demos/ppl_lpsol/.cvsignore (1.1), demos/ppl_lpsol/Makefile.am
+ (1.1), demos/ppl_lpsol/expected (1.1),
+ demos/ppl_lpsol/ppl_lpsol.c (1.1),
+ demos/ppl_lpsol/examples/.cvsignore (1.1),
+ demos/ppl_lpsol/examples/Makefile.am (1.1),
+ demos/ppl_lpsol/examples/afiro.mps (1.1),
+ demos/ppl_lpsol/examples/bgprtr.mps (1.1),
+ demos/ppl_lpsol/examples/ex1.mps (1.1),
+ demos/ppl_lpsol/examples/sample.mps (1.1),
+ demos/ppl_lpsol/examples/unboundedmin.mps (1.1),
+ interfaces/C/Makefile.am (1.17): All demos are now under the
+ `demos' directory.
+
+2004-08-04 Wednesday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.28): The source
+ `fake_mail.pl' has gone long time ago.
+
+2004-08-04 Wednesday 20:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.23), config.sub (1.22), Watchdog/config.guess
+ (1.7), Watchdog/config.sub (1.7): Updated.
+
+2004-08-04 Wednesday 20:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.71): The Polyhedron::*recycled*() methods do not make
+ sense for the Prolog interface.
+
+2004-08-04 Wednesday 16:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: adddimensions11.cc, dualhypercubes.cc (altnum.[1,1]): The
+ main program must catch exceptions.
+
+2004-08-04 Wednesday 16:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.70): Some things to do will only be done in PPL 0.7 or
+ later version.
+
+2004-08-04 Wednesday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Interval.defs.hh, Interval.inlines.hh (altnum.[2,2]):
+ Returning by const reference when appropriate. (numerator and
+ denominator).
+
+2004-08-04 Wednesday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+ Native_Integer.defs.hh, Native_Integer.inlines.hh
+ (altnum.[2,2,2,2]): Use Integer_macros.hh to declare and define
+ all the required functions.
+
+2004-08-04 Wednesday 15:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (altnum.2): Wrongly-named variable references
+ fixed.
+
+2004-08-04 Wednesday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Integer_macros.hh, Makefile.am (altnum.[1,2]): Helper
+ macros for the implementation of Native_Integer and
+ Checked_Integer.
+
+2004-08-04 Wednesday 15:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (altnum.1): Temporarily disable the `interfaces'
+ directory.
+
+2004-08-04 Wednesday 13:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS, configure.ac, src/BoundingBox.cc,
+ src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+ src/Checked_Integer.defs.hh, src/Checked_Integer.inlines.hh,
+ src/Checked_Integer.types.hh, src/ConSys.cc, src/ConSys.defs.hh,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+ src/GMP_Integer.types.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Integer.defs.hh,
+ src/Integer.types.hh, src/Integer_traits_template.hh,
+ src/Interval.defs.hh, src/Interval.inlines.hh,
+ src/LinExpression.cc, src/LinExpression.defs.hh,
+ src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+ src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+ src/Native_Integer.types.hh, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+ src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+ src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+ src/conversion.cc, src/globals.cc, src/globals.hh, tests/BBox.cc,
+ tests/BBox.hh, tests/Makefile.am
+ (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Imported, with changes, from the `altnum' branch of the students'
+ repository. As the Purenum project seems dead, support for
+ Purenum has been evicted. Notice that both native and checked
+ integers do not currently work due to the absence of some
+ relational operators.
+
+2004-07-15 Thursday 18:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.18): Option `-c' (`--check')
+ implemented.
+
+2004-07-15 Thursday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/examples/: 1d.ine (1.1), 1da.ine (1.1), cp4.ext
+ (1.1), cp4.ine (1.1), cp5.ext (1.1), cp5.ine (1.1), cp6.ext
+ (1.1), cp6.ine (1.1), cp7.ext (1.1), cross4.ine (1.1), cube.ext
+ (1.1), cube.ine (1.1), cubetop.ine (1.1), cut16_11.ext (1.1),
+ cut32_16.ext (1.1), cyc.ine (1.1), cyclic17_8.ine (1.1),
+ cyclic25_13.ext (1.1), diamond.ine (1.1), in0.ine (1.1), in1.ine
+ (1.1), in2.ine (1.1), in3.ine (1.1), in4.ine (1.1), in5.ine
+ (1.1), in6.ine (1.1), in7.ine (1.1), kq20_11_m.ine (1.1),
+ metric40_11.ine (1.1), metric80_16.ine (1.1), mit.ine (1.1),
+ mit288-281.ine (1.1), mit31-20.ine (1.1), mit41-16.ine (1.1),
+ mit708-9.ine (1.1), mit71-61.ine (1.1), mit90-86.ine (1.1),
+ mp5.ext (1.1), mp5.ine (1.1), mp5a.ine (1.1), mp6.ine (1.1),
+ trunc10.ine (1.1), trunc7.ine (1.1), tsp5.ext (1.1), tsp5.ine
+ (1.1): Borrowed, with some minor changes, from lrslib 042.
+
+2004-07-15 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/examples/: allzero.ine (1.1), ccc4.ext (1.1),
+ ccc5.ext (1.1), ccc6.ext (1.1), ccp4.ext (1.1), ccp5.ext (1.1),
+ ccp6.ext (1.1), cross10.ine (1.1), cross12.ine (1.1), cross6.ine
+ (1.1), cross8.ine (1.1), cube10.ine (1.1), cube12.ine (1.1),
+ cube3.ine (1.1), cube6.ine (1.1), cube8.ine (1.1), cubocta.ine
+ (1.1), cyclic10-4.ext (1.1), cyclic12-6.ext (1.1), cyclic14-8.ext
+ (1.1), cyclic16-10.ext (1.1), dodeca_m.ine (1.1), ex1.ine (1.1),
+ grcubocta.ine (1.1), hexocta.ine (1.1), icododeca_m.ine (1.1),
+ infeas.ine (1.1), integralpoints.ine (1.1), irbox20-4.ext (1.1),
+ irbox200-4.ext (1.1), kkd18_4.ine (1.1), kkd27_5.ine (1.1),
+ kkd38_6.ine (1.1), nonfull.ine (1.1), origin.ine (1.1),
+ prodst62.ext (1.1), project1_m.ine (1.1), project1res.ine (1.1),
+ project2_m.ine (1.1), project2res.ine (1.1), rcubocta.ine (1.1),
+ redcheck.ext (1.1), reg24-5.ext (1.1), reg24-5.ine (1.1),
+ reg600-5_m.ext (1.1), rhomtria_m.ine (1.1), sample.ine (1.1),
+ sampleh1.ine (1.1), sampleh2.ine (1.1), sampleh3.ine (1.1),
+ sampleh4.ine (1.1), sampleh5.ine (1.1), sampleh6.ine (1.1),
+ sampleh7.ine (1.1), sampleh8.ine (1.1), samplev1.ext (1.1),
+ samplev2.ext (1.1), samplev3.ext (1.1): Borrowed, with some minor
+ changes, from cddlib 093c.
+
+2004-07-11 Sunday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.17): Append to the output file,
+ instead of truncating it.
+
+2004-07-11 Sunday 15:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.16): Error messages fixed.
+
+2004-07-10 Saturday 19:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.15): Fixed the handling of equality
+ constraints in read_polyhedron().
+
+2004-07-10 Saturday 17:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.14): Corrected input and output of
+ H-representations (a couple of sign errors). When outputting
+ rational coefficients, print 0 instead of 0/<denominator>.
+
+2004-07-10 Saturday 16:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.13): Bug fixed in function
+ normalize().
+
+2004-07-10 Saturday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.12): Initial implementation of the
+ `project' command (which seems to be unimplemented in the real
+ lcdd).
+
+2004-07-10 Saturday 10:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.11): Started adding a new option to
+ check the result. Bugs fixed in set_input() and set_output().
+ Reject the `linearity' command when it does not appear before
+ `begin'.
+
+2004-07-10 Saturday 01:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.10): Output made watertight.
+
+2004-07-09 Friday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.9): Several bugs fixed. Formal
+ parameters tightened.
+
+2004-07-09 Friday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.8): Obey the `-o' option.
+
+2004-07-09 Friday 21:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.7): Make sure every non-empty
+ generator system we create has at least one point.
+
+2004-07-09 Friday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.6): Input made more robust.
+
+2004-07-09 Friday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.5): Make sure points are created
+ with the right denominator.
+
+2004-07-09 Friday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.4): Bug fixed in
+ write_polyhedron().
+
+2004-07-09 Friday 15:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.3): Input/output rewritten.
+
+2004-07-09 Friday 09:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.81): Some reorganisation of test
+ predicates to match order of tests. Improved handling of
+ deletion of polyhedra in the exception tests.
+
+2004-07-09 Friday 08:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/ppl_lcdd/ppl_lcdd.cc (1.2): Started drafting the output
+ function. Several other improvements.
+
+2004-07-09 Friday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/.cvsignore (1.3): Put under CVS control.
+
+2004-07-09 Friday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.114), demos/.cvsignore (1.2), demos/Makefile.am
+ (1.2), demos/ppl_lcdd.cc (1.2), demos/ppl_lcdd/.cvsignore (1.1),
+ demos/ppl_lcdd/Makefile.am (1.1), demos/ppl_lcdd/ppl_lcdd.cc
+ (1.1): The `ppl_lcdd' demo has now its own subdirectory.
+
+2004-07-08 Thursday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.16): Spacing fixed.
+
+2004-07-08 Thursday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.113): Added checks for getopt.h and signal.h.
+ Added demos/Makefile to the output list.
+
+2004-07-08 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.24): Added `demos' to `SUBDIR'.
+
+2004-07-08 Thursday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * demos/: .cvsignore (1.1), Makefile.am (1.1), ppl_lcdd.cc (1.1):
+ `ppl_lcdd' is a sort of clone of the cddlib test program `lcdd'.
+
+2004-07-08 Thursday 16:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.109): Brief
+ descriptions of the new interface predicates are added.
+
+2004-07-08 Thursday 12:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.108): New Prolog
+ interface predicates recently added have been added to the PPL
+ Predicate List in the documentation for this interface.
+
+2004-05-26 Wednesday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.228): Fixed examples involving
+ ConSys::insert() and GenSys::insert().
+
+2004-05-26 Wednesday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.86): Mention the documentation improvements.
+
+2004-05-21 Friday 22:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.112): Tests reordered so that an invalid
+ combination of compiler options is detected earlier and diagnosed
+ in an intelligible way.
+
+2004-05-09 Sunday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.15): Anachronisms removed.
+
+2004-05-09 Sunday 14:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.11), src/Polyhedra_PowerSet.inlines.hh (1.31),
+ src/Polyhedron_public.cc (1.21), src/Polyhedron_widenings.cc
+ (1.17), src/simplify.cc (1.34), tests/bhrz03widening14.cc (1.5),
+ tests/bhrz03widening15.cc (1.7): All other things being equal,
+ always prefer preincrement and predecrement to postincrement and
+ postdecrement.
+
+2004-05-09 Sunday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_chdims.cc (1.9): Redundant test avoided.
+
+2004-05-08 Saturday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.68), Matrix.defs.hh (1.56),
+ Polyhedron.inlines.hh (1.90): New declaration and implementation
+ of Matrix::permute_columns(). Implementation of
+ Polyhedron::map_dimensions() improved.
+
+2004-05-08 Saturday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.21): Missing dependency
+ added.
+
+2004-05-07 Friday 21:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.7): Code reordered.
+
+2004-05-07 Friday 21:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.51):
+ Integer_to_integer_term() fixed.
+
+2004-05-07 Friday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/.cvsignore (1.5): Updated.
+
+2004-05-07 Friday 19:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.6): Small improvement to
+ a comment.
+
+2004-05-07 Friday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.5): Kludge to to test the
+ Prolog interface exceptions when converting PPL integers to XSB
+ Prolog integer terms.
+
+2004-05-07 Friday 19:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BHRZ03_Certificate.cc (1.1), BHRZ03_Certificate.defs.hh
+ (1.1), BHRZ03_Certificate.inlines.hh (1.1),
+ BHRZ03_Certificate.types.hh (1.1): Put under CVS control.
+
+2004-05-07 Friday 19:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am (1.70), Polyhedron.defs.hh (1.227),
+ Polyhedron_widenings.cc (1.16): Changed to use the new
+ BHRZ03_Certificate class. Current implementation for NNC
+ polyhedra is an inefficient kludge, but should be correct. It
+ will become efficient as soon as we implement lazy procedures for
+ eps-minimization of NNC polyhedra.
+
+2004-05-07 Friday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.20): Avoid code
+ duplication: Integer_to_integer_term() now uses
+ Prolog_put_long().
+
+2004-05-07 Friday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/.cvsignore (1.5), SICStus/.cvsignore
+ (1.5), SWI/.cvsignore (1.5), XSB/.cvsignore (1.4), YAP/.cvsignore
+ (1.5): Updated.
+
+2004-05-07 Friday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/fake_main.pl (1.2): This is not necessary
+ with new versions of Ciao Prolog.
+
+2004-05-07 Friday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.27): The previous change
+ did not take into account that `ciaoc' always writes the object
+ file in the same directory where the sources reside. Copies
+ restored, but now the copies are written in the right place.
+
+2004-05-07 Friday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/.cvsignore (1.3), src/.cvsignore (1.7),
+ tests/.cvsignore (1.8): Updated.
+
+2004-05-07 Friday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.26), ciao_clpq.pl (1.9),
+ ciao_clpq2.pl (1.4), ciao_pl_check.pl (1.2): New versions of Ciao
+ Prolog no longer require the sources to be copied.
+
+2004-05-07 Friday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/Makefile.am (1.25), SICStus/Makefile.am
+ (1.41), SWI/Makefile.am (1.34): Clean things up after `make
+ check'.
+
+2004-05-07 Friday 10:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.80): Additional tests for system
+ dependent exceptions when the integer values are max, max+1, min,
+ or min-1.
+
+2004-05-07 Friday 10:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.79): More and improved tests for
+ exceptions. Code better commented and additional predicates for
+ i/o etc reorganised.
+
+2004-05-07 Friday 10:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.4): Corrected typo.
+
+2004-05-07 Friday 10:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.3): Added a definition
+ for current_prolog_flag/3.
+
+2004-05-07 Friday 09:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.19):
+ Integer_to_integer_term() fixed.
+
+2004-05-06 Thursday 10:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.78): More tests for ppl Prolog
+ interface exceptions added.
+
+2004-05-05 Wednesday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.33), swi_pl_check.pl
+ (1.1): Use also pl_check.pl to test the SWI-Prolog interface.
+
+2004-05-05 Wednesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.40), sp_pl_check.pl
+ (1.1): Use also pl_check.pl to test the SICStus-Prolog interface.
+
+2004-05-05 Wednesday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.24), ciao_pl_check.pl
+ (1.1): Use also pl_check.pl to test the Ciao-Prolog interface.
+
+2004-05-05 Wednesday 10:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.77): Comment added explaining
+ new code for exceptions tests
+
+2004-05-05 Wednesday 10:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.76): New tests for checking some
+ possible exceptions in the C++ and Prolog interface added.
+
+2004-05-04 Tuesday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.226): Documentation for
+ Polyhedron::expand_dimension() improved. New method void
+ Polyhedron::void fold_dimensions(const Variables_Set&
+ to_be_folded, Variable var) declared: documentation still to be
+ written.
+
+2004-05-04 Tuesday 21:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.128), src/Polyhedron.defs.hh (1.225): New
+ declaration and documentation for void
+ Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-05-04 Tuesday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.127): Added a section on the new
+ `expand_dimension' operation.
+
+2004-05-04 Tuesday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.126): Additions to the bibliography.
+
+2004-05-04 Tuesday 14:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.125): Definition of `map_dimensions'
+ improved.
+
+2004-04-30 Friday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.11), ppl_prolog.icc (1.128),
+ Ciao/ppl_ciao.cc (1.23), GNU/ppl_gprolog_sd.cc (1.18),
+ SICStus/ppl_sicstus_sd.cc (1.60), SWI/ppl_swiprolog.cc (1.85),
+ XSB/ppl_xsb.cc (1.50), YAP/ppl_yap.cc (1.78): Deal with different
+ representations for integers in Prolog and C++ code.
+
+2004-04-30 Friday 19:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.104): Handle std::overflow_error.
+
+2004-04-30 Friday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.103), ppl_c.h.in (1.27): Missing
+ try/catch blocks added. Interface changed for
+ ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+ ppl_version_beta(), ppl_version() and ppl_banner().
+
+2004-04-30 Friday 16:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.102): CATCH_ALL fixed: was translating
+ std::exception to PPL_ERROR_INTERNAL_ERROR instead of
+ PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION.
+
+2004-04-27 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.111), interfaces/OCaml/.cvsignore (1.3),
+ interfaces/OCaml/Makefile.am (1.8), interfaces/OCaml/gmp.h (1.2),
+ interfaces/OCaml/ppl_ocaml_c.swg (1.3): Our OCaml interface will
+ not be based on SWIG.
+
+2004-04-26 Monday 23:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_pl_check.pl (1.5): Previous change
+ reverted.
+
+2004-04-26 Monday 22:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/YAP/yap_pl_check.pl (1.4): Paths to pl_check.pl
+ and yap_pl_check.pl need to allow for working in a separate build
+ directory.
+
+2004-04-26 Monday 22:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.75): Bug fixed in
+ "format_banner" code. Definitions of "make_noisy" and
+ "make_quiet" corrected. Added a new top-level predicate
+ "check_noisy/0" since "check_all" is now forced to be quiet. A
+ redundant temporary test removed.
+
+2004-04-26 Monday 22:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.127): Removed unwanted line
+ in ..._relations_with_constraints procedure. Modified
+ .._relations_with_generator procedure to be in line with changes
+ to ..._relations_with_constraints procedure.
+
+2004-04-26 Monday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.126): Do not call any
+ Prolog_put_*() function on a destination term that does not
+ represent a free variable.
+
+2004-04-26 Monday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.20): Infrastructure for
+ automatic testing with pl_check.pl completed.
+
+2004-04-26 Monday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_pl_check.P (1.2): Initial goal fixed.
+
+2004-04-26 Monday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.19), xsb_pl_check.P (1.1):
+ Use also pl_check.pl when testing the XSB interface.
+
+2004-04-26 Monday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.49): Some assertion fixed: we
+ cannot assume XSB's TRUE evaluates to C++'s true.
+
+2004-04-26 Monday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.74): A predicate is either
+ static or dynamic (noisy/1). The predicate retractall/1 is
+ non-standard: do not use it.
+
+2004-04-25 Sunday 22:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.10), ppl_prolog.icc (1.125):
+ New error handling code completed.
+
+2004-04-25 Sunday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.7), install-sh (1.8), mkinstalldirs (1.7),
+ Watchdog/depcomp (1.5), Watchdog/install-sh (1.5),
+ Watchdog/mkinstalldirs (1.3): Updated from Automake 1.8.4.
+
+2004-04-25 Sunday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.124): Previous changes
+ reverted. Rewritten a good part of the error handling code.
+ Several bugs fixed.
+
+2004-04-25 Sunday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/exceptions.hh (1.9): Exception classes revised.
+
+2004-04-25 Sunday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.84): Prolog_put_long()
+ and Integer_to_integer_term() implemented properly. Added
+ Prolog_put_ulong().
+
+2004-04-25 Sunday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.59): The wrong
+ exception was thrown by integer_term_to_Integer(): fixed.
+
+2004-04-25 Sunday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_cfli.ic (1.8): Added
+ Prolog_put_ulong().
+
+2004-04-25 Sunday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.48): Added a temporary, buggy
+ version of Prolog_put_ulong(). All the XSB c2p_*() functions
+ require that the second argument is an unbound variable:
+ assertions added to check that we abide by this rule.
+
+2004-04-25 Sunday 21:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.22),
+ GNU/ppl_gprolog_sd.cc (1.17), YAP/ppl_yap.cc (1.77): Added a
+ temporary, buggy version of Prolog_put_ulong().
+
+2004-04-25 Sunday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.73): Previous changes reverted.
+
+2004-04-25 Sunday 11:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.72), ppl_prolog.icc (1.123):
+ Bug in an interface predicate
+ (ppl_Polyhedron_relation_with_constraints) that only caused an
+ error with the XSB interface now fixed. pl_check revised to
+ avoid warning messages with XSB compiler.
+
+2004-04-24 Saturday 23:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.83): SWI Prolog does
+ not support unlimited precision integers.
+
+2004-04-24 Saturday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.21): If GMP does not support exceptions this
+ test is pointless.
+
+2004-04-24 Saturday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.69): Flags for ICC changed.
+
+2004-04-24 Saturday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.34): Use the C++ compiler to
+ compile and link. Do not mention -lstcd++.
+
+2004-04-24 Saturday 10:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.16): Work around
+ gprolog.h namespace pollution.
+
+2004-04-24 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.122): Include
+ "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.101): Include "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.85): Explain the changes concerning the
+ max_space_dimension() functions.
+
+2004-04-24 Saturday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.inlines.hh (1.16), max_space_dimension.hh
+ (1.2): C_Polyhedron::max_space_dimension() fixed.
+
+2004-04-24 Saturday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.defs.hh (1.95), GenSys.inlines.hh (1.33): New
+ function GenSys::max_space_dimension().
+
+2004-04-24 Saturday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.82), ConSys.inlines.hh (1.32): New
+ function ConSys::max_space_dimension().
+
+2004-04-24 Saturday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.inlines.hh (1.44): Spurious newline removed.
+
+2004-04-24 Saturday 09:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.55), Matrix.inlines.hh (1.37): New
+ functions Matrix::max_num_rows() and Matrix::max_num_columns().
+
+2004-04-24 Saturday 09:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.defs.hh (1.77), Row.inlines.hh (1.43): New functions
+ Row::Impl::max_size() and Row::max_size().
+
+2004-04-24 Saturday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.21), C_Polyhedron.inlines.hh
+ (1.15), Makefile.am (1.69), NNC_Polyhedron.defs.hh (1.24),
+ NNC_Polyhedron.inlines.hh (1.17), Polyhedra_PowerSet.defs.hh
+ (1.20), Polyhedra_PowerSet.inlines.hh (1.30), Polyhedron.defs.hh
+ (1.224), algorithms.hh (1.27), globals.hh (1.35),
+ max_space_dimension.hh (1.1): The function
+ Parma_Polyhedra_Library::max_space_dimension() has been given a
+ new semantics and destiny: it returns the maximum space dimension
+ that _all_ the abstractions provided by the library can handle.
+ Each individual abstraction provides its versions of this
+ function. Thus, e.g., NNC_Polyhedron::max_space_dimension()
+ gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+2004-04-24 Saturday 08:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.inlines.hh (1.12), Topology.hh (1.9),
+ initializer.hh (1.8): Comment added.
+
+2004-04-24 Saturday 00:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.32): Pass the C and C++
+ compilers to plld.
+
+2004-04-23 Friday 18:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.71), ppl_prolog.icc (1.121),
+ Ciao/ppl_ciao.pl (1.64), GNU/ppl_gprolog.pl (1.43),
+ SICStus/ppl_sicstus_sd.cc (1.58), SWI/ppl_swiprolog.cc (1.82),
+ XSB/ppl_xsb.H (1.30), XSB/ppl_xsb.cc (1.47), YAP/ppl_yap.cc
+ (1.76): Minimize and maximize with generator point predicates
+ added.
+
+2004-04-23 Friday 16:10 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.63): Interface definitions
+ for the banner predicate corrected.
+
+2004-04-23 Friday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.46): Temporary, kludgy
+ definitions for `bool Prolog_has_unbounded_integers' and `long
+ Prolog_max_integer'. Comments added.
+
+2004-04-23 Friday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.21),
+ GNU/ppl_gprolog_sd.cc (1.15), SICStus/ppl_sicstus_sd.cc (1.57),
+ SWI/ppl_swiprolog.cc (1.81), YAP/ppl_yap.cc (1.75): Define `bool
+ Prolog_has_unbounded_integers' and `long Prolog_max_integer'.
+ Comments added.
+
+2004-04-23 Friday 11:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.70), ppl_prolog.icc (1.120),
+ Ciao/ppl_ciao.pl (1.62), GNU/ppl_gprolog.pl (1.42),
+ SICStus/ppl_sicstus_sd.cc (1.56), SWI/ppl_swiprolog.cc (1.80),
+ XSB/ppl_xsb.H (1.29), XSB/ppl_xsb.cc (1.45), YAP/ppl_yap.cc
+ (1.74): ppl_banner added. pl_check revised so that check_all
+ calls for checks on all recently added predicates.
+
+2004-04-23 Friday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.119), Ciao/Makefile.am
+ (1.23), GNU/Makefile.am (1.33), SICStus/Makefile.am (1.39),
+ SWI/Makefile.am (1.31), XSB/Makefile.am (1.18), YAP/Makefile.am
+ (1.25): Follow our programming conventions concerning code
+ formatting. Do not include "version.hh.in": include "version.hh"
+ instead.
+
+2004-04-23 Friday 07:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.61): Ciao interface for the
+ additional ppl predicates corrected.
+
+2004-04-22 Thursday 12:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.69), ppl_prolog.icc (1.118),
+ Ciao/ppl_ciao.pl (1.60), GNU/ppl_gprolog.pl (1.41),
+ SICStus/ppl_sicstus_sd.cc (1.55), SWI/ppl_swiprolog.cc (1.79),
+ XSB/ppl_xsb.H (1.28), XSB/ppl_xsb.cc (1.44), YAP/ppl_yap.cc
+ (1.73): Added version predicates and maximum dimension predicate.
+
+2004-04-22 Thursday 07:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.68), ppl_prolog.icc (1.117),
+ Ciao/ppl_ciao.pl (1.59), GNU/ppl_gprolog.pl (1.40),
+ SICStus/ppl_sicstus_sd.cc (1.54), SWI/ppl_swiprolog.cc (1.78),
+ XSB/ppl_xsb.H (1.27), XSB/ppl_xsb.cc (1.43), YAP/ppl_yap.cc
+ (1.72): Added predicates ppl_Polyhedron_maximize/5 and
+ ppl_Polyhedron_minimize/5. A second version of the same
+ predicates with 6 arguments is still needed.
+
+2004-04-21 Wednesday 15:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.37), exceptions2.cc (1.31): We were not
+ flagging as errors the cases where an exception that must be
+ thrown is not thrown.
+
+2004-04-21 Wednesday 14:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.68): Remember to explain how to use the Intel C/C++
+ compiler.
+
+2004-04-21 Wednesday 14:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.195), exceptions3.cc (1.1): New test
+ program: this shows that we are not checking against attempts of
+ building polyhedra with a dimension greater than
+ max_space_dimension() (which results in violated assertions and
+ who knows what other nasty things).
+
+2004-04-21 Wednesday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.36), exceptions2.cc (1.30): Comment
+ improved.
+
+2004-04-21 Wednesday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: bgp99extrapolation1.cc (1.3), bhz03widening1.cc (1.4),
+ bhz03widening2.cc (1.4), dualhypercubes.cc (1.4): Avoid defining
+ things in the global namespace.
+
+2004-04-21 Wednesday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.26): The function check_containment(const
+ PH&, const Polyhedra_PowerSet<PH>&s) is now declared before being
+ defined.
+
+2004-04-21 Wednesday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.100): Use the `%u' conversion specifier
+ (not `%d') for the conversion of an object of type
+ ppl_dimension_type.
+
+2004-04-21 Wednesday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.26): Unused SWIG stuff removed.
+
+2004-04-19 Monday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.67): Fixed Matrix::permute_columns().
+
+2004-04-19 Monday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.89): Avoid useless parentheses.
+
+2004-04-19 Monday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.194), mapdim3.cc (1.1): New test for
+ Polyhedron::map_dimensions().
+
+2004-04-19 Monday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.88): Comment improved.
+
+2004-04-19 Monday 08:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/mapdim2.cc (1.2): Add some variety in the tested
+ conditions.
+
+2004-04-19 Monday 08:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.84), src/Polyhedron.inlines.hh (1.87): The method
+ Polyhedron::map_dimensions(const PartialFunction& pfunc) has been
+ significantly optimized for the case when `pfunc' is a
+ permutation. A simple "renaming" of the dimensions is now
+ extremely cheap.
+
+2004-04-18 Sunday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.66), Matrix.defs.hh (1.54): Added
+ Matrix::permute_columns().
+
+2004-04-18 Sunday 13:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.18): Spacing fixes in comments.
+
+2004-04-18 Sunday 13:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.20): Two messages fixed in
+ Polyhedron::OK().
+
+2004-04-17 Saturday 23:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.65): Matrix::swap_columns() improved. Be
+ consistent in variable names.
+
+2004-04-17 Saturday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.defs.hh (1.76): Mathematical objects whose name is more
+ than one character long are typeset in Roman.
+
+2004-04-17 Saturday 19:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.124): Mathematical objects whose name is
+ more than one character long are typeset in Roman. Fixed two
+ other font mistakes.
+
+2004-04-17 Saturday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.193): Put more things in the convenience
+ library `libppl_tests'.
+
+2004-04-17 Saturday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.192), mapdim2.cc (1.1): New test for
+ Polyhedron::map_dimensions().
+
+2004-04-16 Friday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.191), boundedh79extrapolation1.cc (1.1):
+ Test Polyhedron::bounded_H79_extrapolation_assign().
+
+2004-04-06 Tuesday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.22), config.sub (1.21), ltmain.sh (1.18),
+ Watchdog/config.guess (1.6), Watchdog/config.sub (1.6),
+ Watchdog/ltmain.sh (1.7): Updated from libtool-1.5.4.
+
+2004-03-06 Saturday 09:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.67), src/ConSys.defs.hh (1.81), src/GenSys.defs.hh
+ (1.94), src/LinExpression.defs.hh (1.63), src/Matrix.defs.hh
+ (1.53): Matrix::ascii_dump(), Matrix::ascii_load(),
+ LinExpression::~LinExpression(), Matrix::~Matrix(),
+ ConSys::~ConSys(), GenSys::~GenSys() and
+ ConSys::const_iterator::~const_iterator() are no longer virtual.
+
+2004-03-04 Thursday 07:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.86):
+ Constraint::Constraint(LinExpression& e) made explicit.
+
+2004-02-25 Wednesday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.66): Added a (monster) configure command line to compile
+ with Comeau C/C++ compiler.
+
+2004-02-25 Wednesday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.65): Started adding instructions on how to compile with
+ other C++ compilers.
+
+2004-02-24 Tuesday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.25): Fixed the comments for
+ ppl_Polyhedron_minimize() and ppl_Polyhedron_maximize().
+
+2004-02-22 Sunday 18:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.20), AskTell.inlines.hh (1.21):
+ AskTell<CS>::add_constraints() now takes a ConSys by const
+ reference.
+
+2004-02-22 Sunday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.29): Avoid making
+ unnecessary copies.
+
+2004-02-22 Sunday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_public.cc (1.19), Polyhedron_widenings.cc
+ (1.15): Use the add_recycled_*() methods whenever necessary or
+ desirable.
+
+2004-02-22 Sunday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.8), NNC_Polyhedron.cc (1.12),
+ Polyhedra_PowerSet.inlines.hh (1.28), Polyhedron_public.cc
+ (1.18), Polyhedron_widenings.cc (1.14): Use the add_recycled_*()
+ methods whenever necessary or desirable.
+
+2004-02-22 Sunday 17:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.99): The function snprintf() is not in
+ standard C++: use sprintf() instead, but play safely anyway.
+
+2004-02-22 Sunday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.24): Non-standard trailing comma
+ removed from enumeration.
+
+2004-02-22 Sunday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.98): Meaningless type qualifiers
+ removed.
+
+2004-02-22 Sunday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.83), TODO (1.64), interfaces/C/ppl_c.cc (1.97),
+ interfaces/C/ppl_c.h.in (1.23), src/Polyhedron.defs.hh (1.223),
+ src/Polyhedron_public.cc (1.17): The methods void
+ Polyhedron::add_constraints(ConSys& cs), void
+ Polyhedron::add_generators(GenSys& gs), bool
+ Polyhedron::add_constraints_and_minimize(ConSys& cs), and bool
+ Polyhedron::add_generators_and_minimize(GenSys& gs) have been
+ renamed void Polyhedron::add_recycled_constraints(ConSys& cs),
+ void Polyhedron::add_recycled_generators(GenSys& gs), bool
+ Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs),
+ and bool Polyhedron::add_recycled_generators_and_minimize(GenSys&
+ gs), respectively. At the same time, the methods void
+ Polyhedron::add_constraints(const ConSys& cs), void
+ Polyhedron::add_generators(const GenSys& gs), bool
+ Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+ bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+ have been added. Corresponding changes have been made to the C
+ interface.
+
+2004-02-22 Sunday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.rpath (1.2): Support Comeau's C/C++ compiler.
+
+2004-02-16 Monday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.defs.hh (1.75): Comments fixed.
+
+2004-02-12 Thursday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.52), Matrix.inlines.hh (1.36): Do not put
+ code into files named *.defs.hh.
+
+2004-02-09 Monday 08:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.27): All names that are not
+ dependent on template parameters are bound to their present
+ definitions when parsing a template function or class: make sure
+ elements of the base class are correctly referred to.
+
+2004-02-08 Sunday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.110): Fixed some error messages.
+
+2004-02-08 Sunday 21:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/AskTell.inlines.hh (1.20): Missing `typename' added.
+
+2004-02-06 Friday 11:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.109): Disable the interface/OCaml directory, for
+ the time being.
+
+2004-02-05 Thursday 22:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Makefile.am (1.9): Ignore the OCaml subdirectory, for
+ the time being.
+
+2004-02-05 Thursday 22:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.108): Version number bumped.
+
+2004-02-05 Thursday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.96): Output functions fixed.
+
+2004-02-05 Thursday 21:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.95), ppl_c.h.in (1.22): New functions
+ ppl_io_print_variable() and ppl_io_fprint_variable().
+
+2004-02-05 Thursday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.82), interfaces/C/ppl_c.cc (1.94), src/Variable.cc
+ (1.16), src/Variable.defs.hh (1.36), src/Variable.inlines.hh
+ (1.18), tests/writevariable1.cc (1.10):
+ Variable::Output_Function_Type renamed
+ Variable::output_function_type.
+
+2004-02-05 Thursday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.93): cxx_Variable_output_function()
+ partly fixed.
+
+2004-02-05 Thursday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.35): Comment corrected.
+
+2004-02-05 Thursday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.92), ppl_c.h.in (1.21): New functions
+ ppl_io_set_variable_output_function() and
+ ppl_io_get_variable_output_function().
+
+2004-02-05 Thursday 19:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.91): Implemented most of the machinery
+ allowing the user to select its preferred output function for
+ Variable objects,
+
+2004-02-05 Thursday 16:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.20): Make Doxygen comments uniformly
+ brief.
+
+2004-02-05 Thursday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.7): Add `-I../C' to
+ libppl_ocaml_c_la_CPPFLAGS.
+
+2004-02-05 Thursday 14:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.90), ppl_c.h.in (1.19): Documentation
+ improvements.
+
+2004-02-05 Thursday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: user-browse.doxyconf-latex.in (1.19),
+ user-print.doxyconf-latex.in (1.19), user.doxyconf-html.in
+ (1.21): Add PPL_DECLARE_PRINT_FUNCTIONS to EXPAND_AS_DEFINED.
+
+2004-02-05 Thursday 14:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.18): Make sure not to leave
+ unnecessary preprocessor symbols behind.
+
+2004-02-05 Thursday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.89), ppl_c.h.in (1.17): A first,
+ tentative implementation of the new print functions. New error
+ codes PPL_STDIO_ERROR and PPL_ARITHMETIC_OVERFLOW.
+
+2004-02-05 Thursday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.16): Added a kludge to make the
+ documentation on how to use the C interface easier to find.
+
+2004-02-04 Wednesday 18:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.15): A couple of corrections to the
+ usage instructions.
+
+2004-02-04 Wednesday 18:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_c.h.in (1.14): Corrections to the explanation on
+ using the C interface done.
+
+2004-02-04 Wednesday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.13): Two minor fixes.
+
+2004-02-04 Wednesday 16:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/C/ppl_c.h.in (1.12): The comment on how to use the C
+ interface revised.
+
+2004-02-04 Wednesday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.11): Documentation on how to use the C
+ interface finished (for the time being, at least).
+
+2004-02-04 Wednesday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.10): Finished the section on linking.
+
+2004-02-04 Wednesday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.9): Started explaining how to link.
+
+2004-02-04 Wednesday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.8): Better explained how to use the -I
+ (or similar) compiler option.
+
+2004-02-04 Wednesday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.7): Finished dealing with version
+ checking.
+
+2004-02-03 Tuesday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.6): Fix thinko in Doxygen's comments.
+
+2004-02-03 Tuesday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.cc (1.4): Put new functions into the PPL namespace.
+
+2004-02-03 Tuesday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.88), ppl_c.h.in (1.5): New functions:
+ ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+ and ppl_version_beta().
+
+2004-02-03 Tuesday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: version.cc (1.3), version.hh.in (1.7): New functions:
+ version_major(), version_minor(), version_revision(), and
+ version_beta().
+
+2004-02-03 Tuesday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.107): Some vertical space added.
+
+2004-02-03 Tuesday 14:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.4): New macro PPL_VERSION added.
+
+2004-02-03 Tuesday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h.in (1.3): Started dealing with version
+ checking.
+
+2004-02-03 Tuesday 09:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: Makefile.am (1.16), ppl_c.cc (1.87), ppl_c.h.in
+ (1.2): New C interface functions ppl_version() and ppl_banner().
+
+2004-02-03 Tuesday 09:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.hh.in (1.6): Tell emacs that this is C++.
+
+2004-02-03 Tuesday 09:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.106), doc/Makefile.am (1.25),
+ doc/devref-browse.doxyconf-latex.in (1.35),
+ doc/devref-print.doxyconf-latex.in (1.35),
+ doc/devref.doxyconf-html.in (1.36),
+ doc/user-browse.doxyconf-latex.in (1.18),
+ doc/user-print.doxyconf-latex.in (1.18),
+ doc/user.doxyconf-html.in (1.20), interfaces/C/ppl_c.h (1.100),
+ interfaces/C/ppl_c.h.in (1.1), interfaces/OCaml/Makefile.am
+ (1.6): The C interface's header file `ppl_c.h' is now generated
+ at configuration time from `ppl_c.h.in' so as to carry the proper
+ version information.
+
+2004-02-02 Monday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.86), ppl_c.h (1.99): Now
+ ppl_initialize() and ppl_finalize() return
+ PPL_ERROR_INVALID_ARGUMENT if called when they should not.
+
+2004-02-02 Monday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.98): Explain initialization and
+ finalization in the C interface.
+
+2004-02-02 Monday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.97): Explained what to do in case
+ `#include <ppl_c.h>' seems not to work. Explained what opaque
+ data types are and why we use them.
+
+2004-02-01 Sunday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.96): Explain the usage of the header file
+ for the C interface and its name space.
+
+2004-02-01 Sunday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: gpl.dox (1.6), gpl.tex (1.2): Avoid excessive
+ capitalization.
+
+2004-02-01 Sunday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.13), fdl.dox (1.6), fdl.tex (1.2), user.tex
+ (1.14): The documentation is now distributed under the terms of
+ version 1.2 of the GNU Free Documentation License.
+
+2004-01-28 Wednesday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/.cvsignore (1.2): Updated.
+
+2004-01-28 Wednesday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.5): Seriously hacked so that
+ files are created in the right places.
+
+2004-01-28 Wednesday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/gmp.h (1.1): Hacked version of the main C header
+ file of GMP 4.1.2. This is to get around some bugs and
+ limitations of SWIG 1.3.21.
+
+2004-01-28 Wednesday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.8), Watchdog/README (1.6),
+ Watchdog/Watchdog.cc (1.14), Watchdog/Watchdog.defs.hh (1.12),
+ Watchdog/Watchdog.inlines.hh (1.10), Watchdog/Watchdog.types.hh
+ (1.5), Watchdog/configure.ac (1.19), Watchdog/pwl_header.top
+ (1.4), doc/devref.tex (1.12), doc/ppl.sty (1.13), doc/user.tex
+ (1.13), interfaces/Prolog/XSB/ppl_xsb.H (1.26),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.42): Update copyright years.
+
+2004-01-27 Tuesday 23:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.23), README (1.17), configure.ac (1.105),
+ doc/Makefile.am (1.24), doc/definitions.dox (1.123),
+ interfaces/Makefile.am (1.8), interfaces/C/Makefile.am (1.15),
+ interfaces/C/ppl_c.cc (1.85), interfaces/C/ppl_c.h (1.95),
+ interfaces/OCaml/Makefile.am (1.4),
+ interfaces/OCaml/ppl_ocaml_c.swg (1.2),
+ interfaces/Prolog/Makefile.am (1.24),
+ interfaces/Prolog/Prolog_interface.dox (1.107),
+ interfaces/Prolog/clpq.pl (1.15), interfaces/Prolog/clpq2.pl
+ (1.26), interfaces/Prolog/exceptions.hh (1.8),
+ interfaces/Prolog/expected (1.6), interfaces/Prolog/expected2
+ (1.11), interfaces/Prolog/pl_check.pl (1.67),
+ interfaces/Prolog/ppl_prolog.icc (1.116),
+ interfaces/Prolog/track_allocation.hh (1.13),
+ interfaces/Prolog/Ciao/Makefile.am (1.22),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.8),
+ interfaces/Prolog/Ciao/ciao_clpq2.pl (1.3),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.20),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.58),
+ interfaces/Prolog/GNU/Makefile.am (1.32),
+ interfaces/Prolog/GNU/gnu_pl_check.pl (1.2),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.7),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.39),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.14),
+ interfaces/Prolog/SICStus/Makefile.am (1.38),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.23),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.53),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.3),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.4),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.7),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.9),
+ interfaces/Prolog/SWI/Makefile.am (1.30),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.7),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.5),
+ interfaces/Prolog/SWI/ppl_pl.cc (1.7),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.77),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.3),
+ interfaces/Prolog/XSB/Makefile.am (1.17),
+ interfaces/Prolog/XSB/expected (1.7),
+ interfaces/Prolog/XSB/expected2 (1.9),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.41),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.8),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.6),
+ interfaces/Prolog/YAP/Makefile.am (1.24),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.71),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.7),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.7),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.3),
+ interfaces/Prolog/YAP/yap_pl_check.pl (1.3), m4/Makefile.am
+ (1.10), m4/ac_check_gmp.m4 (1.16), m4/ac_cxx_attribute_weak.m4
+ (1.3), m4/ac_cxx_flexible_arrays.m4 (1.8), src/AskTell.defs.hh
+ (1.19), src/AskTell.inlines.hh (1.19), src/AskTell.types.hh
+ (1.6), src/BoundingBox.cc (1.8), src/BoundingBox.defs.hh (1.11),
+ src/BoundingBox.inlines.hh (1.11), src/BoundingBox.types.hh
+ (1.6), src/C_Polyhedron.cc (1.7), src/C_Polyhedron.defs.hh
+ (1.20), src/C_Polyhedron.inlines.hh (1.14),
+ src/C_Polyhedron.types.hh (1.7), src/ConSys.cc (1.67),
+ src/ConSys.defs.hh (1.80), src/ConSys.inlines.hh (1.31),
+ src/ConSys.types.hh (1.7), src/Constraint.cc (1.40),
+ src/Constraint.defs.hh (1.85), src/Constraint.inlines.hh (1.48),
+ src/Constraint.types.hh (1.7), src/Determinate.defs.hh (1.35),
+ src/Determinate.inlines.hh (1.36), src/Determinate.types.hh
+ (1.5), src/GenSys.cc (1.85), src/GenSys.defs.hh (1.93),
+ src/GenSys.inlines.hh (1.32), src/GenSys.types.hh (1.7),
+ src/Generator.cc (1.48), src/Generator.defs.hh (1.85),
+ src/Generator.inlines.hh (1.42), src/Generator.types.hh (1.7),
+ src/Init.cc (1.10), src/Init.defs.hh (1.10), src/Init.types.hh
+ (1.6), src/Integer.cc (1.4), src/Integer.defs.hh (1.11),
+ src/Integer.inlines.hh (1.10), src/Integer.types.hh (1.8),
+ src/Interval.cc (1.9), src/Interval.defs.hh (1.16),
+ src/Interval.inlines.hh (1.11), src/Interval.types.hh (1.7),
+ src/LinExpression.cc (1.20), src/LinExpression.defs.hh (1.62),
+ src/LinExpression.inlines.hh (1.29), src/LinExpression.types.hh
+ (1.7), src/Makefile.am (1.68), src/Matrix.cc (1.64),
+ src/Matrix.defs.hh (1.51), src/Matrix.inlines.hh (1.35),
+ src/Matrix.types.hh (1.7), src/NNC_Polyhedron.cc (1.11),
+ src/NNC_Polyhedron.defs.hh (1.23), src/NNC_Polyhedron.inlines.hh
+ (1.16), src/NNC_Polyhedron.types.hh (1.7), src/Ph_Status.cc
+ (1.4), src/Ph_Status.idefs.hh (1.4), src/Ph_Status.inlines.hh
+ (1.4), src/Poly_Con_Relation.cc (1.8),
+ src/Poly_Con_Relation.defs.hh (1.23),
+ src/Poly_Con_Relation.inlines.hh (1.11),
+ src/Poly_Con_Relation.types.hh (1.6), src/Poly_Gen_Relation.cc
+ (1.8), src/Poly_Gen_Relation.defs.hh (1.21),
+ src/Poly_Gen_Relation.inlines.hh (1.11),
+ src/Poly_Gen_Relation.types.hh (1.6),
+ src/Polyhedra_PowerSet.defs.hh (1.19),
+ src/Polyhedra_PowerSet.inlines.hh (1.26),
+ src/Polyhedra_PowerSet.types.hh (1.2), src/Polyhedron.defs.hh
+ (1.222), src/Polyhedron.inlines.hh (1.86),
+ src/Polyhedron.types.hh (1.10), src/Polyhedron_chdims.cc (1.8),
+ src/Polyhedron_nonpublic.cc (1.17), src/Polyhedron_public.cc
+ (1.16), src/Polyhedron_widenings.cc (1.13), src/PowerSet.defs.hh
+ (1.46), src/PowerSet.inlines.hh (1.55), src/PowerSet.types.hh
+ (1.6), src/Row.cc (1.60), src/Row.defs.hh (1.74),
+ src/Row.inlines.hh (1.42), src/Row.types.hh (1.7),
+ src/SatMatrix.cc (1.28), src/SatMatrix.defs.hh (1.33),
+ src/SatMatrix.inlines.hh (1.21), src/SatMatrix.types.hh (1.7),
+ src/SatRow.cc (1.22), src/SatRow.defs.hh (1.32),
+ src/SatRow.inlines.hh (1.28), src/SatRow.types.hh (1.7),
+ src/Topology.hh (1.8), src/Variable.cc (1.15),
+ src/Variable.defs.hh (1.34), src/Variable.inlines.hh (1.17),
+ src/Variable.types.hh (1.7), src/algorithms.hh (1.25),
+ src/conversion.cc (1.51), src/globals.cc (1.13), src/globals.hh
+ (1.34), src/initializer.hh (1.7), src/minimize.cc (1.35),
+ src/ppl_header.top (1.7), src/simplify.cc (1.33),
+ src/statistics.hh (1.3), src/version.cc (1.2), src/version.hh.in
+ (1.5), tests/BBox.cc (1.4), tests/BBox.hh (1.3),
+ tests/CbecomesNNC1.cc (1.5), tests/Makefile.am (1.190),
+ tests/NNCminimize1.cc (1.10), tests/NNCminimize2.cc (1.10),
+ tests/NNCminimize3.cc (1.10), tests/NNCminimize4.cc (1.12),
+ tests/NNCminimize5.cc (1.9), tests/NNCminimize6.cc (1.11),
+ tests/PFunction.cc (1.3), tests/PFunction.hh (1.3),
+ tests/addconstraint1.cc (1.5), tests/addconstraint2.cc (1.4),
+ tests/addconstraint3.cc (1.4), tests/addconstraints1.cc (1.11),
+ tests/addconstraints10.cc (1.10), tests/addconstraints11.cc
+ (1.11), tests/addconstraints12.cc (1.4),
+ tests/addconstraints13.cc (1.6), tests/addconstraints2.cc (1.19),
+ tests/addconstraints3.cc (1.9), tests/addconstraints4.cc (1.11),
+ tests/addconstraints5.cc (1.12), tests/addconstraints6.cc (1.13),
+ tests/addconstraints7.cc (1.12), tests/addconstraints8.cc (1.12),
+ tests/addconstraints9.cc (1.13), tests/adddimensions1.cc (1.14),
+ tests/adddimensions10.cc (1.7), tests/adddimensions11.cc (1.5),
+ tests/adddimensions12.cc (1.4), tests/adddimensions13.cc (1.3),
+ tests/adddimensions2.cc (1.10), tests/adddimensions3.cc (1.12),
+ tests/adddimensions4.cc (1.10), tests/adddimensions5.cc (1.8),
+ tests/adddimensions6.cc (1.8), tests/adddimensions7.cc (1.8),
+ tests/adddimensions8.cc (1.6), tests/adddimensions9.cc (1.7),
+ tests/addgenerator1.cc (1.5), tests/addgenerator2.cc (1.5),
+ tests/addgenerator3.cc (1.4), tests/addgenerator4.cc (1.5),
+ tests/addgenerators1.cc (1.12), tests/addgenerators10.cc (1.4),
+ tests/addgenerators11.cc (1.6), tests/addgenerators12.cc (1.6),
+ tests/addgenerators13.cc (1.2), tests/addgenerators2.cc (1.12),
+ tests/addgenerators3.cc (1.12), tests/addgenerators4.cc (1.12),
+ tests/addgenerators5.cc (1.12), tests/addgenerators6.cc (1.12),
+ tests/addgenerators7.cc (1.9), tests/addgenerators8.cc (1.7),
+ tests/addgenerators9.cc (1.6), tests/affineimage1.cc (1.12),
+ tests/affineimage2.cc (1.11), tests/affineimage3.cc (1.4),
+ tests/affineimage4.cc (1.4), tests/affineimage5.cc (1.5),
+ tests/affineimage6.cc (1.4), tests/affineimage7.cc (1.4),
+ tests/affineimage8.cc (1.8), tests/affinepreimage1.cc (1.11),
+ tests/affinepreimage10.cc (1.8), tests/affinepreimage2.cc (1.11),
+ tests/affinepreimage3.cc (1.11), tests/affinepreimage4.cc (1.12),
+ tests/affinepreimage5.cc (1.4), tests/affinepreimage6.cc (1.5),
+ tests/affinepreimage7.cc (1.4), tests/affinepreimage8.cc (1.4),
+ tests/affinepreimage9.cc (1.5), tests/affinetrans.cc (1.14),
+ tests/append1.cc (1.22), tests/append2.cc (1.22),
+ tests/ascii_dump_load1.cc (1.13), tests/ascii_dump_load2.cc
+ (1.11), tests/ascii_dump_load3.cc (1.14),
+ tests/ascii_dump_load4.cc (1.14), tests/ascii_dump_load5.cc
+ (1.10), tests/ascii_dump_load6.cc (1.7),
+ tests/ascii_dump_load7.cc (1.7), tests/bgp99extrapolation1.cc
+ (1.2), tests/bhrz03widening1.cc (1.4), tests/bhrz03widening10.cc
+ (1.4), tests/bhrz03widening11.cc (1.4), tests/bhrz03widening12.cc
+ (1.4), tests/bhrz03widening13.cc (1.4), tests/bhrz03widening14.cc
+ (1.4), tests/bhrz03widening15.cc (1.6), tests/bhrz03widening16.cc
+ (1.4), tests/bhrz03widening17.cc (1.4), tests/bhrz03widening18.cc
+ (1.4), tests/bhrz03widening19.cc (1.4), tests/bhrz03widening2.cc
+ (1.6), tests/bhrz03widening3.cc (1.6), tests/bhrz03widening4.cc
+ (1.4), tests/bhrz03widening5.cc (1.4), tests/bhrz03widening6.cc
+ (1.5), tests/bhrz03widening7.cc (1.5), tests/bhrz03widening8.cc
+ (1.4), tests/bhrz03widening9.cc (1.6), tests/bhz03widening1.cc
+ (1.3), tests/bhz03widening2.cc (1.3), tests/bounded1.cc (1.13),
+ tests/boundingbox1.cc (1.33), tests/boundingbox2.cc (1.18),
+ tests/boundingbox3.cc (1.9), tests/boundingbox4.cc (1.6),
+ tests/bounds1.cc (1.6), tests/bounds2.cc (1.6),
+ tests/concatenate1.cc (1.8), tests/concatenate2.cc (1.8),
+ tests/concatenate3.cc (1.7), tests/concatenate4.cc (1.6),
+ tests/concatenate5.cc (1.4), tests/concatenate6.cc (1.6),
+ tests/constraints1.cc (1.6), tests/constraints2.cc (1.6),
+ tests/constraints3.cc (1.6), tests/constraints4.cc (1.6),
+ tests/contains1.cc (1.5), tests/contains2.cc (1.2),
+ tests/contains3.cc (1.2), tests/contains4.cc (1.2),
+ tests/contains5.cc (1.2), tests/disjoint1.cc (1.7),
+ tests/disjoint2.cc (1.8), tests/disjoint3.cc (1.7),
+ tests/dualhypercubes.cc (1.3), tests/ehandlers.cc (1.5),
+ tests/ehandlers.hh (1.8), tests/empty1.cc (1.14),
+ tests/exceptions1.cc (1.35), tests/exceptions2.cc (1.29),
+ tests/files.cc (1.5), tests/files.hh (1.5),
+ tests/generalizedaffineimage1.cc (1.8),
+ tests/generalizedaffineimage10.cc (1.7),
+ tests/generalizedaffineimage11.cc (1.6),
+ tests/generalizedaffineimage12.cc (1.5),
+ tests/generalizedaffineimage2.cc (1.7),
+ tests/generalizedaffineimage3.cc (1.8),
+ tests/generalizedaffineimage4.cc (1.6),
+ tests/generalizedaffineimage5.cc (1.6),
+ tests/generalizedaffineimage6.cc (1.6),
+ tests/generalizedaffineimage7.cc (1.8),
+ tests/generalizedaffineimage8.cc (1.6),
+ tests/generalizedaffineimage9.cc (1.6), tests/generators1.cc
+ (1.13), tests/generators2.cc (1.9), tests/generators3.cc (1.5),
+ tests/generators4.cc (1.5), tests/generators5.cc (1.5),
+ tests/generators6.cc (1.6), tests/h79widening1.cc (1.6),
+ tests/h79widening2.cc (1.7), tests/h79widening3.cc (1.7),
+ tests/h79widening4.cc (1.4), tests/h79widening5.cc (1.5),
+ tests/h79widening6.cc (1.5), tests/h79widening7.cc (1.3),
+ tests/intersection1.cc (1.6), tests/intersection10.cc (1.6),
+ tests/intersection11.cc (1.6), tests/intersection2.cc (1.10),
+ tests/intersection3.cc (1.7), tests/intersection4.cc (1.7),
+ tests/intersection5.cc (1.7), tests/intersection6.cc (1.7),
+ tests/intersection7.cc (1.6), tests/intersection8.cc (1.5),
+ tests/intersection9.cc (1.5),
+ tests/limitedbhrz03extrapolation1.cc (1.3),
+ tests/limitedh79extrapolation1.cc (1.3),
+ tests/limitedh79extrapolation2.cc (1.3),
+ tests/limitedh79extrapolation3.cc (1.3),
+ tests/limitedh79extrapolation4.cc (1.3),
+ tests/linearpartition1.cc (1.13), tests/linearpartition2.cc
+ (1.13), tests/linearpartition3.cc (1.13), tests/linexpression1.cc
+ (1.4), tests/mapdim1.cc (1.2), tests/max_min1.cc (1.4),
+ tests/max_min2.cc (1.4), tests/mc91.cc (1.14), tests/memory1.cc
+ (1.20), tests/minconstraints1.cc (1.5), tests/minconstraints2.cc
+ (1.5), tests/minconstraints3.cc (1.4), tests/minconstraints4.cc
+ (1.8), tests/mingenerators1.cc (1.5), tests/mingenerators2.cc
+ (1.4), tests/mingenerators3.cc (1.4), tests/onepoint.cc (1.10),
+ tests/permute.cc (1.31), tests/polydifference1.cc (1.7),
+ tests/polydifference2.cc (1.9), tests/polydifference3.cc (1.4),
+ tests/polydifference4.cc (1.5), tests/polydifference5.cc (1.6),
+ tests/polydifference6.cc (1.6), tests/polydifference7.cc (1.5),
+ tests/polyhull1.cc (1.8), tests/polyhull10.cc (1.4),
+ tests/polyhull2.cc (1.7), tests/polyhull3.cc (1.7),
+ tests/polyhull4.cc (1.6), tests/polyhull5.cc (1.5),
+ tests/polyhull6.cc (1.5), tests/polyhull7.cc (1.4),
+ tests/polyhull8.cc (1.5), tests/polyhull9.cc (1.6),
+ tests/ppl_test.hh (1.4), tests/print.cc (1.10), tests/print.hh
+ (1.14), tests/randphull1.cc (1.10), tests/randphull2.cc (1.6),
+ tests/relations1.cc (1.10), tests/relations10.cc (1.6),
+ tests/relations11.cc (1.6), tests/relations12.cc (1.5),
+ tests/relations13.cc (1.5), tests/relations14.cc (1.5),
+ tests/relations15.cc (1.5), tests/relations16.cc (1.5),
+ tests/relations17.cc (1.7), tests/relations18.cc (1.5),
+ tests/relations19.cc (1.6), tests/relations2.cc (1.11),
+ tests/relations3.cc (1.11), tests/relations4.cc (1.11),
+ tests/relations5.cc (1.11), tests/relations6.cc (1.10),
+ tests/relations7.cc (1.10), tests/relations8.cc (1.10),
+ tests/relations9.cc (1.12), tests/removedim1.cc (1.11),
+ tests/removedim10.cc (1.3), tests/removedim2.cc (1.15),
+ tests/removedim3.cc (1.11), tests/removedim4.cc (1.12),
+ tests/removedim5.cc (1.10), tests/removedim6.cc (1.13),
+ tests/removedim7.cc (1.9), tests/removedim8.cc (1.6),
+ tests/removedim9.cc (1.6), tests/smm1.cc (1.15),
+ tests/timeelapse1.cc (1.8), tests/timeelapse2.cc (1.8),
+ tests/timeelapse3.cc (1.8), tests/timeelapse4.cc (1.8),
+ tests/timeelapse5.cc (1.9), tests/timeelapse6.cc (1.4),
+ tests/timeelapse7.cc (1.4), tests/timeelapse8.cc (1.5),
+ tests/timings.cc (1.4), tests/timings.hh (1.4),
+ tests/topclosed1.cc (1.7), tests/topclosed2.cc (1.6),
+ tests/topclosed3.cc (1.8), tests/topclosure1.cc (1.7),
+ tests/topclosure2.cc (1.4), tests/topclosure3.cc (1.4),
+ tests/topclosure4.cc (1.6), tests/universe1.cc (1.10),
+ tests/universe2.cc (1.11), tests/universe3.cc (1.11),
+ tests/universe4.cc (1.11), tests/universe5.cc (1.12),
+ tests/universe6.cc (1.9), tests/watchdog1.cc (1.18),
+ tests/writeconsys1.cc (1.7), tests/writegensys1.cc (1.8),
+ tests/writegensys2.cc (1.8), tests/writegensys3.cc (1.7),
+ tests/writepolyhedron1.cc (1.7), tests/writepolyhedron2.cc (1.8),
+ tests/writepolyhedron3.cc (1.7), tests/writerelation1.cc (1.7),
+ tests/writevariable1.cc (1.9): Update copyright years.
+
+2004-01-27 Tuesday 23:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.3): Some little progress.
+
+2004-01-27 Tuesday 23:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/: ppl_c.swg (1.2), ppl_ocaml_c.swg (1.1):
+ Renamed.
+
+2004-01-27 Tuesday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.1), Watchdog/compile (1.1): Added from Automake 1.8.2.
+
+2004-01-26 Monday 19:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/Makefile.am (1.2): Avoid running swig multiple
+ times.
+
+2004-01-26 Monday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.104), interfaces/Makefile.am (1.7),
+ interfaces/OCaml/.cvsignore (1.1), interfaces/OCaml/Makefile.am
+ (1.1): Directory `interfaces/OCaml' activated.
+
+2004-01-26 Monday 16:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.23): It is no longer necessary to specify `-d
+ Validate' on the Doxygen's command line.
+
+2004-01-26 Monday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.94): Temporarily avoid splitting
+ preprocessor directives across multiple lines. This is to get
+ around a bug in SWIG 1.3.21.
+
+2004-01-26 Monday 08:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.93): Spacing fixed.
+
+2004-01-25 Sunday 23:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/OCaml/ppl_c.swg (1.1): SWIG module declaration for the
+ OCaml interface to the C interface.
+
+2004-01-25 Sunday 23:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.92): Explain to SWIG how to convert an
+ OCaml array to a C array plus length.
+
+2004-01-25 Sunday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.67): Avoid repeating the name of the target
+ file.
+
+2004-01-25 Sunday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.6), install-sh (1.7), missing (1.7), mkinstalldirs
+ (1.6), Watchdog/depcomp (1.4), Watchdog/install-sh (1.4),
+ Watchdog/missing (1.3), Watchdog/mkinstalldirs (1.2): Update from
+ Automake.
+
+2004-01-25 Sunday 22:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.103): Check for SWIG added.
+
+2004-01-25 Sunday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.21), config.sub (1.20), Watchdog/config.guess
+ (1.5), Watchdog/config.sub (1.5): Updated from config.
+
+2004-01-25 Sunday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.17), Watchdog/ltmain.sh (1.6): Updated from Libtool
+ 1.5.2.
+
+2004-01-23 Friday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.221): Implement a new method to
+ differentiate between the inclusion of Ph_Status.idefs.hh and the
+ inclusion of all other header files. This gets around a bug in
+ doxygen.
+
+2004-01-23 Friday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.220): Documentation for
+ Polyhedron::max_min() fixed.
+
+2004-01-21 Wednesday 13:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/dualhypercubes.cc (1.2): Corrected an error and made
+ silent.
+
+2004-01-20 Tuesday 08:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.189), dualhypercubes.cc (1.1): Put under
+ CVS control.
+
+2003-12-19 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ppl_header.bottom (1.5), ppl_header.top (1.6): Include
+ <cassert> after restoring the status of NDEBUG: this should
+ finally solve the NDEBUG problem.
+
+2003-12-17 Wednesday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.middle (1.3): GCC versions prior to 3.0 are no
+ longer supported.
+
+2003-12-15 Monday 23:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.63): See if we can provide some guarantee on the maximum
+ number of times we are calling the methods of the argument of
+ Polyhedron::map_dimensions(const PartialFunction&).
+
+2003-12-05 Friday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.13): Do not use the ITIMER_PROF timer
+ when profiling.
+
+2003-12-05 Friday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.102): Define the symbol `PROFILING' when
+ profiling is enabled.
+
+2003-12-04 Thursday 10:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.34),
+ devref-print.doxyconf-latex.in (1.34), devref.doxyconf-html.in
+ (1.35): The source files for the Status class are now called
+ Ph_Status.*.
+
+2003-12-02 Tuesday 21:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: lib-ld.m4 (1.2), lib-prefix.m4 (1.2): Updated from gettext
+ 0.13.
+
+2003-11-19 Wednesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.62): Remember to implement void
+ Polyhedron::envelope_assign(const Polyhedron& y).
+
+2003-11-12 Wednesday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.22), acinclude.m4 (1.6): Implement a much simpler
+ way of telling aclocal where to look for `.m4' files (in
+ addition, `sinclude', which we used in `acinclude.m4', is an
+ obsolete name for `m4_include').
+
+2003-11-09 Sunday 00:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.33): Comment for compute_capacity() improved.
+ Added an alternative implementation (commented out) characterized
+ a speculation factor of 1.5.
+
+2003-11-07 Friday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.defs.hh (1.73): Including Integer.types.hh is not enough:
+ include Integer.defs.hh.
+
+2003-11-04 Tuesday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.20), config.sub (1.19), Watchdog/config.guess
+ (1.4), Watchdog/config.sub (1.4): Updated.
+
+2003-10-30 Thursday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ph_Status.cc (1.3), Polyhedron_public.cc (1.15): OK()
+ methods must print their own error messages (unless NDEBUG is
+ defined).
+
+2003-10-29 Wednesday 06:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.15): In case libgmp and libgmpxx are
+ installed in the same location, allow to specify the prefix for
+ either one, the other being set automatically.
+
+2003-10-29 Wednesday 06:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_cxx_attribute_weak.m4 (1.2), ac_cxx_flexible_arrays.m4
+ (1.7): Preserve CPPFLAGS.
+
+2003-10-28 Tuesday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.101), interfaces/C/Makefile.am (1.14),
+ interfaces/Prolog/Ciao/Makefile.am (1.21),
+ interfaces/Prolog/GNU/Makefile.am (1.31),
+ interfaces/Prolog/SICStus/Makefile.am (1.37),
+ interfaces/Prolog/SWI/Makefile.am (1.29),
+ interfaces/Prolog/XSB/Makefile.am (1.16),
+ interfaces/Prolog/YAP/Makefile.am (1.23), src/Makefile.am (1.66),
+ tests/Makefile.am (1.188): Got rid of extra_cpp_flags (was used
+ nowhere).
+
+2003-10-27 Monday 22:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.8), NEWS (1.81), TODO (1.61), acinclude.m4 (1.5),
+ config.rpath (1.1), m4/ac_check_gmp.m4 (1.14), m4/lib-ld.m4
+ (1.1), m4/lib-link.m4 (1.1), m4/lib-prefix.m4 (1.1): Thanks to
+ Bruno Haible, it is now possible to use versions of the GMP
+ library installed into nonstandard places.
+
+2003-10-27 Monday 10:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ph_Status.idefs.hh (1.3), Ph_Status.inlines.hh (1.3): Some
+ useless code removed.
+
+2003-10-27 Monday 09:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Ph_Status.cc (1.2), Ph_Status.idefs.hh (1.2),
+ Ph_Status.inlines.hh (1.2): Comments fixed.
+
+2003-10-27 Monday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.65), Ph_Status.cc (1.1), Ph_Status.idefs.hh
+ (1.1), Ph_Status.inlines.hh (1.1), Polyhedron.defs.hh (1.219),
+ Status.cc (1.22), Status.defs.hh (1.30), Status.inlines.hh
+ (1.15), Status.types.hh (1.7): The Status class is now a private
+ member of class Polyhedron.
+
+2003-10-26 Sunday 18:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Status.defs.hh (1.29), Status.inlines.hh (1.14): Pass
+ objects of type Status by value.
+
+2003-10-16 Thursday 17:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/polyhull1.cc (1.7): Debug message improved.
+
+2003-10-13 Monday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.59): Comment fixed.
+
+2003-10-06 Monday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.60), tests/h79widening6.cc (1.4): h79widening6.cc
+ temporarily fixed, but must be turned into a proper test.
+
+2003-10-04 Saturday 22:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.58): Revert previous change.
+
+2003-10-04 Saturday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.57): Avoid including <iostream>.
+
+2003-10-03 Friday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.7), Watchdog/.cvsignore (1.4): Ignore config.h.in.
+
+2003-10-03 Friday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.26), Watchdog/config.h.in (1.4): These should not
+ be in the repository, since they are automatically generated.
+
+2003-09-23 Tuesday 10:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.33),
+ devref-print.doxyconf-latex.in (1.33), devref.doxyconf-html.in
+ (1.34), user-browse.doxyconf-latex.in (1.17),
+ user-print.doxyconf-latex.in (1.17), user.doxyconf-html.in
+ (1.19): Updated for Doxygen 1.3.4.
+
+2003-09-10 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.19), config.h.in (1.25), config.sub (1.18),
+ depcomp (1.5), install-sh (1.6), missing (1.6),
+ Watchdog/config.guess (1.3), Watchdog/config.sub (1.3),
+ Watchdog/depcomp (1.3), Watchdog/install-sh (1.3),
+ Watchdog/missing (1.2): Updated.
+
+2003-09-10 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Variable.cc (1.14), Variable.defs.hh (1.33): Pass variables
+ by const reference for uniformity.
+
+2003-09-01 Monday 23:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.54):
+ PowerSet<CS>::check_omega_reduced() fixed: now it return false if
+ a bottom element is encountered (even in a singleton).
+
+2003-09-01 Monday 23:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.53): Modified
+ PowerSet<CS>::omega_reduce() so that all bottom elements are
+ removed first.
+
+2003-09-01 Monday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.24): Use Polyhedra_PowerSet<PH>::empty()
+ instead of Polyhedra_PowerSet<PH>::is_bottom().
+
+2003-09-01 Monday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.18): Useless using declarations
+ removed.
+
+2003-09-01 Monday 20:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.45), PowerSet.inlines.hh (1.52): Method
+ bool PowerSet<CS>::empty() const added. Useless using
+ declarations removed. Added a bool argument to
+ PowerSet<CS>::OK() to decide whether bottom is or not allowed
+ into the powerset.
+
+2003-09-01 Monday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.17),
+ Polyhedra_PowerSet.inlines.hh (1.25): Methods
+ Polyhedra_PowerSet<PH>::add_constraint() and
+ Polyhedra_PowerSet<PH>::add_constraints() made lazy. Methods
+ Polyhedra_PowerSet<PH>::add_constraint_and_minimize() and
+ Polyhedra_PowerSet<PH>::add_constraints_and_minimize() added.
+
+2003-08-31 Sunday 23:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.51): Correct a mistake in previous
+ change.
+
+2003-08-31 Sunday 23:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.50): PowerSet<CS>::collapse(iterator
+ sink) improved.
+
+2003-08-30 Saturday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bhz03widening2.cc (1.2): Be quiet.
+
+2003-08-30 Saturday 12:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.24): Corrected a bug in
+ pairwise_reduce(), whereby we were marking the wrong polyhedra in
+ the sequence. Corrected a bug in BHZ03_widening_assign(),
+ whereby we were calling BGP99_extrapolation_assign() instead of
+ BGP99_heuristics_assign (the latter does not pairwise-reduce nor
+ collapse the sequence of polyhedra). In the implementation of
+ BGP99_heuristics_assign(), we now take a copy of polyhedron `pi'
+ before computing the base-level widening.
+
+2003-08-30 Saturday 12:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.49): In function collapse(const
+ unsigned max_disjuncts), removed the never used iterators sbegin
+ and send.
+
+2003-08-30 Saturday 00:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.187), bhz03widening2.cc (1.1): New test
+ for Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-29 Friday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.59): The name of the `abandon_exponential_computations'
+ variable is now misleading, as we use it also to abandon
+ polynomial computations in the PowerSet domains.
+
+2003-08-29 Friday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.44), PowerSet.inlines.hh (1.48): Method
+ PowerSet::collapse() added. It provides the same functionality
+ as the project() function, which has been removed.
+
+2003-08-29 Friday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.16),
+ Polyhedra_PowerSet.inlines.hh (1.23), PowerSet.defs.hh (1.43),
+ PowerSet.inlines.hh (1.47): Method collapse() reimplemented
+ generically in the PowerSet class. Methods
+ PowerSet<CS>::omega_reduce() and
+ Polyhedra_PowerSet<PH>::concatenate_assign() (which have
+ quadratic complexity) now test the
+ `abandon_exponential_computations' variable and hurry up (giving
+ up precision) if necessary.
+
+2003-08-28 Thursday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.23): Function check_containment() fixed and
+ silenced.
+
+2003-08-27 Wednesday 23:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.22): Fixed a couple of bugs in
+ check_containment(). Print statements added to the same function
+ in order to help debugging it (it still does not work).
+
+2003-08-27 Wednesday 23:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.15),
+ Polyhedra_PowerSet.inlines.hh (1.22): New methods `bool
+ semantically_contains(const Polyhedra_PowerSet&) const' and `bool
+ semantically_equals(const Polyhedra_PowerSet&) const'. Fixed
+ methods ascii_dump() and ascii_load().
+
+2003-08-27 Wednesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.14),
+ Polyhedra_PowerSet.inlines.hh (1.21): Methods `void
+ Polyhedra_PowerSet<PH>::ascii_dump(std::ostream&) const' and
+ `bool Polyhedra_PowerSet<PH>::ascii_load(std::istream&)' added.
+
+2003-08-27 Wednesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.58), src/Init.cc (1.9): New mechanism to allow the user
+ to redefine the GMP memory allocation functions being 100% sure
+ that all GMP objects are allocated and deallocated by the same
+ functions (nasty things happen if this is not the case).
+
+2003-08-27 Wednesday 18:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * acinclude.m4 (1.4), config.h.in (1.24), configure.ac (1.100),
+ m4/ac_cxx_attribute_weak.m4 (1.1): Check whether the C++ compiler
+ supports __attribute__ ((weak)).
+
+2003-08-26 Tuesday 22:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.18), AskTell.inlines.hh (1.18),
+ Determinate.defs.hh (1.34), Determinate.inlines.hh (1.35),
+ Polyhedra_PowerSet.defs.hh (1.13), Polyhedra_PowerSet.inlines.hh
+ (1.20), PowerSet.defs.hh (1.42), PowerSet.inlines.hh (1.46):
+ Added the swap() method and the specialization of std::swap().
+
+2003-08-26 Tuesday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.21): Added a first version of the
+ "check_containment" algorithm described in Srivastava93.
+ Multiple inclusion guard added.
+
+2003-08-26 Tuesday 08:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.12),
+ Polyhedra_PowerSet.inlines.hh (1.19): Added
+ Polyhedra_PowerSet<PH>::limited_BHZ03_widening_assign().
+
+2003-08-26 Tuesday 08:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.18): TODO comment revised.
+ Variable declaration turned into a constant declaration.
+
+2003-08-25 Monday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bhz03widening1.cc (1.2): Ensure the widening is always
+ called properly.
+
+2003-08-25 Monday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.186), bhz03widening1.cc (1.1): Test
+ Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-25 Monday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.11),
+ Polyhedra_PowerSet.inlines.hh (1.17): Method
+ new_widening_assign() renamed BHZ03_widening_assign() and
+ modified to accept a widening method on the underlying polyhedra
+ domain.
+
+2003-08-25 Monday 18:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.16): In BGP99 extrapolation,
+ do pairwise reduction before collapsing.
+
+2003-08-25 Monday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.10),
+ src/Polyhedra_PowerSet.inlines.hh (1.15), tests/Makefile.am
+ (1.185), tests/bgp99extrapolation1.cc (1.1),
+ tests/powersetwidening1.cc (1.8): Cleaned and simplified the code
+ for the "simple powerset widening", now more appropriately called
+ "BGP99 extrapolation".
+
+2003-08-25 Monday 00:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.99): Version number bumped.
+
+2003-08-25 Monday 00:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.16): Avoid two compiler warnings.
+
+2003-08-24 Sunday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.7): 20 iterations are enough.
+
+2003-08-24 Sunday 17:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.6): Corrected the affine image
+ transformation. Made the test silent.
+
+2003-08-24 Sunday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.84), ppl_c.h (1.91): Revised interface
+ for ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-24 Sunday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.218), src/Polyhedron.inlines.hh (1.85),
+ src/Polyhedron_nonpublic.cc (1.15), tests/max_min1.cc (1.3),
+ tests/max_min2.cc (1.3): Revised interface for
+ Polyhedron::maximize() and Polyhedron::minimize().
+
+2003-08-24 Sunday 13:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.80): Section on bugfixes added for PPL 0.6.
+
+2003-08-24 Sunday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.79), src/LinExpression.cc (1.19),
+ src/LinExpression.defs.hh (1.61): New output operator in
+ namespace IO_Operators: std::ostream& operator<<(std::ostream&,
+ const LinExpression&).
+
+2003-08-23 Saturday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.14): The applicability test
+ asserted in Polyhedra_PowerSet<PH>::widening_assign() was
+ reversed: fixed.
+
+2003-08-23 Saturday 18:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.83): Fixed indentation.
+
+2003-08-23 Saturday 18:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.5): Counter-example for the simple
+ powerset widening is now working as expected.
+
+2003-08-23 Saturday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.4): Fixed an output statement.
+ Avoid computing S(n) multiple times.
+
+2003-08-23 Saturday 16:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.3): For readability, use an
+ alternate output function for variables.
+
+2003-08-23 Saturday 16:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.13): In
+ Polyhedra_PowerSet<PH>::widening_assign(const Polyhedra_PowerSet&
+ y, ...) assert that `*this' definitely entails `y'.
+
+2003-08-23 Saturday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.2): Started turning this program
+ into an implementation of Enea's counterexample for the simple
+ powerset widening.
+
+2003-08-22 Friday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: max_min1.cc (1.2), max_min2.cc (1.2): Be quiet.
+
+2003-08-22 Friday 19:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.98): Version number bumped.
+
+2003-08-22 Friday 19:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.78): Announce Polyhedron::maximize() and
+ Polyhedron::minimize().
+
+2003-08-22 Friday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.57): New things to do before releasing PPL 0.6.
+
+2003-08-22 Friday 19:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.82), ppl_c.h (1.90): Added
+ ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-22 Friday 19:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.217): Documentation for
+ Polyhedron::maximize(const LinExpression&, ...) and
+ Polyhedron::minimize(const LinExpression&, ...) revised.
+
+2003-08-22 Friday 18:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.184), max_min1.cc (1.1), max_min2.cc
+ (1.1): Test Polyhedron::maximize(const LinExpression&, ...) and
+ Polyhedron::minimize(const LinExpression&, ...).
+
+2003-08-22 Friday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.14): Method Polyhedron::max_min()
+ implemented.
+
+2003-08-22 Friday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.13): Avoid useless iterations in
+ Polyhedron::bounds().
+
+2003-08-22 Friday 13:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.216), Polyhedron.inlines.hh (1.84),
+ Polyhedron_nonpublic.cc (1.12): Revised specification for the new
+ methods Polyhedron::maximize(const LinExpression&, ...) and
+ Polyhedron::minimize(const LinExpression&, ...). Implementation
+ work started.
+
+2003-08-22 Friday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.cc (1.47): Avoid useless calls to std::ostream&
+ std::operator<<(std::ostream& s, ...).
+
+2003-08-20 Wednesday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.215): First tentative declaration for
+ the new maximization and minimization methods.
+
+2003-08-20 Wednesday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.56): We must explain very well that iterators can be
+ invalidated by several (actually, almost all) operations, and
+ that use of an invalidated iterator causes undefined behavior.
+
+2003-08-20 Wednesday 16:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (ppl-0_5-branch.1): Fixed constructor
+ `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+ initializing the `empty' member. (Thanks to Axel Simon.)
+
+2003-08-20 Wednesday 11:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.81): Fixed constructor
+ `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+ initializing the `empty' member. (Thanks to Axel Simon.)
+
+2003-08-19 Tuesday 09:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.inlines.hh (1.12), PowerSet.defs.hh
+ (1.41), PowerSet.inlines.hh (1.45): Lazy, much more efficient
+ implementation of powersets.
+
+2003-08-18 Monday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.77), src/Variable.cc (1.13), src/Variable.defs.hh (1.32),
+ tests/writevariable1.cc (1.8): The type of output functions for
+ the class Variable, Variable::Output_Function_Type, is now
+ defined as void Output_Function_Type(std::ostream& s, const
+ Variable& v). In other words, `v' is now passed by const
+ reference and not by value.
+
+2003-08-10 Sunday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.11): Removed the final
+ pairwise-reduction step from the 4th case of the new widening.
+
+2003-08-10 Sunday 12:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.10): Added a new case to the
+ definition of the new widening for powerset polyhedra.
+
+2003-08-08 Friday 16:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.9): Corrected the
+ implementation of the new widening so that we now check for `y'
+ not being a singleton before computing its multiset lgo
+ information.
+
+2003-08-07 Thursday 12:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/powersetwidening1.cc (1.1): Put under CVS control.
+
+2003-08-06 Wednesday 14:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.9),
+ src/Polyhedra_PowerSet.inlines.hh (1.8), src/Polyhedron.defs.hh
+ (1.214), src/Polyhedron.inlines.hh (1.83),
+ src/Polyhedron_widenings.cc (1.12), tests/Makefile.am (1.183):
+ Added a (rough) draft for the new widening on Polyhedra_PowerSet,
+ using the BHRZ03 widening and based on the lgo relation induced
+ by the BHRZ03 lgo.
+
+2003-08-06 Wednesday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.97), Watchdog/configure.ac (1.18): Allow for
+ `mild', -O1 optimization.
+
+2003-08-04 Monday 16:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.8): Let the PPL compile.
+
+2003-08-04 Monday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.7),
+ Polyhedra_PowerSet.inlines.hh (1.7), PowerSet.defs.hh (1.40),
+ PowerSet.inlines.hh (1.44): Currect, greedy implementation of the
+ powerset construction and of its specialization on polyhedra.
+ (Will be replaced by a lazy implementation ASAP.)
+
+2003-08-04 Monday 14:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.6),
+ Polyhedra_PowerSet.inlines.hh (1.6), Polyhedron.defs.hh (1.213),
+ Polyhedron.inlines.hh (1.82), Polyhedron_widenings.cc (1.11):
+ Drafted functions to compute multiset lgo for the powerset
+ domain.
+
+2003-08-02 Saturday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.21): Alternative implementation for
+ SatRow::next() added in a comment.
+
+2003-07-30 Wednesday 22:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.18): Build an RPM package also for the PWL. The
+ Prolog interfaces depend on the PWL.
+
+2003-07-30 Wednesday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: xsb_clpq.P (1.7), xsb_clpq2.P (1.5): XSB
+ version 2.6 still does not offer read_term/2.
+
+2003-07-30 Wednesday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.106), XSB/.cvsignore
+ (1.3), XSB/Makefile.am (1.15), XSB/ppl_xsb.cc (1.40): Removed
+ most of the kludges we had for supporting old versions of XSB.
+ We now only support XSB version 2.6 and following.
+
+2003-07-28 Monday 08:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/fdl.dox (1.5), doc/gpl.dox (1.5),
+ interfaces/Prolog/Prolog_interface.dox (1.105): No longer using
+ Doxygen sectioning commands inside normal documentation blocks
+ (they only work inside \page and \mainpage blocks). Instead, now
+ using \anchor and unnumbered section headings.
+
+2003-07-22 Tuesday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.5): Ensure omega reductions
+ in the widening and extrapolation methods.
+
+2003-07-22 Tuesday 13:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.43): PowerSet::is_top() now asserts
+ this->is_omega_reduced().
+
+2003-07-21 Monday 22:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.defs.hh (1.5),
+ Polyhedra_PowerSet.inlines.hh (1.4): Limited extrapolation
+ operators added.
+
+2003-07-20 Sunday 12:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.18), config.sub (1.17): Updated.
+
+2003-07-18 Friday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.122): Citations fixed.
+
+2003-07-18 Friday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.17), AskTell.inlines.hh (1.17): Entry
+ point for AskTell<CS>::H79_extrapolation_assign() added.
+
+2003-07-18 Friday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.20): poly_hull_assign_if_exact() improved.
+
+2003-07-18 Friday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.inlines.hh (1.3):
+ Polyhedra_PowerSet<PH>::collapse() improved.
+
+2003-07-16 Wednesday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/h79widening7.cc (1.2): Make sure the outcome is as
+ expected.
+
+2003-07-16 Wednesday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/h79widening6.cc (1.3): Made silent.
+
+2003-07-16 Wednesday 15:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.63), Polyhedron_widenings.cc (1.10): Corrected
+ a bug in H79_widening_assign() and BHRZ03_combining_constraints()
+ whereby we could have created an illegal constraint system (the
+ bug was showing up when running the test h79widening6 with
+ assertions enabled). Also added an assertion to the
+ corresponding constructor of Matrix.
+
+2003-07-16 Wednesday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.121): Updated.
+
+2003-07-16 Wednesday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.4): Comment fixed.
+
+2003-07-16 Wednesday 09:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.182), h79widening7.cc (1.1):
+ h79widening7.cc shows there is a bug somewhere.
+
+2003-07-15 Tuesday 22:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: h79widening6.cc (1.2), mc91.cc (1.13): Brought up-to-date
+ with respect to the rest of the library.
+
+2003-07-15 Tuesday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedra_PowerSet.defs.hh (1.3): Initial fix for the problem
+ concerning dependent names.
+
+2003-07-15 Tuesday 11:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.96), m4/ac_check_gmp.m4 (1.13): Separated the
+ check for the existence of the GMP library from the check that it
+ has been compiled with the C++ interface enabled. Changed error
+ messages accordingly, to avoid the user getting confused.
+
+2003-07-14 Monday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.34): Fixed two copy-and-paste
+ errors.
+
+2003-07-14 Monday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedra_PowerSet.inlines.hh (1.2), PowerSet.defs.hh
+ (1.39), PowerSet.inlines.hh (1.42): Lots of improvements and bug
+ fixes.
+
+2003-07-14 Monday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.33): Exploit pointer equality to
+ optimize equality and containment tests.
+
+2003-07-14 Monday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.16), AskTell.inlines.hh (1.16): Several
+ improvements.
+
+2003-07-13 Sunday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.15), AskTell.inlines.hh (1.15),
+ Polyhedra_PowerSet.defs.hh (1.2): Fixed a few glitches.
+
+2003-07-13 Sunday 11:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.19): Several functions moved (as methods) to
+ the Polyhedra_PowerSet class.
+
+2003-07-13 Sunday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.64), Polyhedra_PowerSet.defs.hh (1.1),
+ Polyhedra_PowerSet.inlines.hh (1.1), Polyhedra_PowerSet.types.hh
+ (1.1): The powerset construction instantiated on PPL polyhedra.
+
+2003-07-13 Sunday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.38), PowerSet.inlines.hh (1.41):
+ Rewritten so as to be truly generic.
+
+2003-07-13 Sunday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.14), AskTell.inlines.hh (1.14): Includes
+ fixed. Comment added.
+
+2003-07-10 Thursday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.181), h79widening6.cc (1.1): Test the
+ simple powerset widening.
+
+2003-07-10 Thursday 17:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.18): Includes fixed. Simple powerset
+ widening reimplemented.
+
+2003-07-10 Thursday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.14): Wrong call to
+ Polyhedron::throw_topology_incompatible() replaced with call to
+ Polyhedron::throw_dimension_incompatible().
+
+2003-07-10 Thursday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.63): Obsolete stuff out, AskTell class in.
+
+2003-07-10 Thursday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.33), Determinate.inlines.hh (1.32):
+ Big exception-safety bug fixed. Some obsolete stuff removed.
+
+2003-07-10 Thursday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.37), PowerSet.inlines.hh (1.40),
+ PowerSet.types.hh (1.5): Several improvements.
+
+2003-07-10 Thursday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.13), AskTell.inlines.hh (1.13),
+ AskTell.types.hh (1.5), LCompare.defs.hh (1.6),
+ LCompare.inlines.hh (1.5), LCompare.types.hh (1.5): Started
+ reimplementing the AskTell class from scratch.
+
+2003-07-10 Thursday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.55): We must not forget to harmonize all the methods void
+ PPL::Polyhedron::throw_...(): now they build error messages
+ according to (confusingly) different styles.
+
+2003-07-05 Saturday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/mc91.cc (1.12): Call PowerSet:add_disjunct() instead of the
+ no longer existing PowerSet::inject().
+
+2003-07-05 Saturday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.12): Delete statement uncommented.
+
+2003-07-05 Saturday 17:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.17): Added simple widening on powersets of
+ polyhedra. They are based on the extrapolation operators but
+ enforce a maximum number of polyhedra in the destination
+ powerset.
+
+2003-07-05 Saturday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.36), PowerSet.inlines.hh (1.39): Added
+ template <typename CS> void PowerSet<CS>::pop_back().
+
+2003-07-01 Tuesday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.35), PowerSet.inlines.hh (1.38),
+ algorithms.hh (1.16): PowerSet::inject() renamed
+ PowerSet::add_disjunct().
+
+2003-07-01 Tuesday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.12), AskTell.inlines.hh (1.12):
+ AskTell::inject() renamed AskTell::add_pair().
+
+2003-07-01 Tuesday 09:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.inlines.hh (1.81), PowerSet.defs.hh (1.34):
+ Corrected minor typo. Renamed PowerSet::add_disjunct as
+ PowerSet::inject.
+
+2003-06-17 Tuesday 23:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh, Polyhedron_widenings.cc
+ (alt_lgo.[1,1]): Initial support for the "facing constraints"
+ technique, as provided by Pat.
+
+2003-06-17 Tuesday 23:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.defs.hh (1.33): Comments revised. Some cleaning.
+
+2003-05-24 Saturday 21:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * install-sh (1.5): Updated.
+
+2003-05-15 Thursday 07:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.54): Started drafting a list of enhancements for PPL 0.6.
+
+2003-05-07 Wednesday 21:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/algorithms.hh (ppl-0_5-branch.1): Functon linear_partition()
+ excluded from the user manual version 0.5.
+
+2003-05-07 Wednesday 21:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh, PowerSet.defs.hh
+ (ppl-0_5-branch.[1,1]): Determinate and PowerSet template classes
+ excluded from the user manual of version 0.5.
+
+2003-05-04 Sunday 19:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.10), doc/devref-browse.doxyconf-latex.in (1.32),
+ doc/devref-print.doxyconf-latex.in (1.32),
+ doc/devref.doxyconf-html.in (1.33), src/Determinate.defs.hh
+ (1.32), src/Determinate.inlines.hh (1.31), src/PowerSet.defs.hh
+ (1.32), src/PowerSet.inlines.hh (1.37): In the STANDARDS,
+ explained how the Doxygen documentation of a non-member method
+ has to be related to a templatic class. Added or improved the
+ documentation of Determinate and PowerSet. Let these files be
+ included in the devref manual (they were already in the user
+ manual).
+
+2003-05-01 Thursday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/fdl.dox (ppl-0_5-branch.1): \ingroup replaced by \addtogroup,
+ since otherwise the documentation page is not included in the
+ produced manuals.
+
+2003-05-01 Thursday 11:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/fdl.dox (1.4): \ingroup replaced by \addtogroup, since
+ otherwise the documentation page is not included in the produced
+ manuals.
+
+2003-05-01 Thursday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in,
+ devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+ (ppl-0_5-branch.[1,1,1]): List CATCH_ALL in EXPAND_AS_DEFINED.
+ This is a temporary kludge to get around a bug in Doxygen whereby
+ occurrences of CATCH_ALL are otherwise interpreted as namespace
+ declarations.
+
+2003-05-01 Thursday 10:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.31),
+ devref-print.doxyconf-latex.in (1.31), devref.doxyconf-html.in
+ (1.32): List CATCH_ALL in EXPAND_AS_DEFINED. This is a temporary
+ kludge to get around a bug in Doxygen whereby occurrences of
+ CATCH_ALL are otherwise interpreted as namespace declarations.
+
+2003-04-30 Wednesday 21:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (ppl-0_5-branch.1), Matrix.defs.hh (1.50):
+ Use \genfrac instead of \atop, since the latter causes problems
+ with the amsmath package.
+
+2003-04-30 Wednesday 20:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (ppl-0_5-branch.1), Polyhedron.defs.hh
+ (1.212): Name the parameters of conversion() in a consistent way.
+
+2003-04-30 Wednesday 19:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.95): Version number bumped.
+
+2003-04-27 Sunday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Watchdog/ChangeLog, Watchdog/NEWS, Watchdog/README,
+ Watchdog/configure.ac (ppl-0_5-branch.[2,2,1,1,1]): Synchronize
+ with the main trunk.
+
+2003-04-27 Sunday 21:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_5-branch.1): Update version.
+
+2003-04-27 Sunday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_5-branch.[1,1]): Mark
+ ChangeLog.
+
+2003-04-27 Sunday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.16), Watchdog/ChangeLog (1.6): Updated.
+
+2003-04-27 Sunday 21:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.17): Version number bumped.
+
+2003-04-27 Sunday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.15), Watchdog/ChangeLog (1.5): Updated.
+
+2003-04-27 Sunday 21:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: ChangeLog (1.4), NEWS (1.3), README (1.5): Updated for
+ release 0.2.
+
+2003-04-27 Sunday 21:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.53), ChangeLog (1.14): Updated.
+
+2003-04-27 Sunday 20:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.13): Updated.
+
+2003-04-27 Sunday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.76): Reorganized.
+
+2003-04-27 Sunday 16:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BoundingBox.cc (1.7), BoundingBox.defs.hh (1.10),
+ BoundingBox.inlines.hh (1.10), Polyhedron.inlines.hh (1.80):
+ Added Doxygen comments for class BoundingBox. Method
+ Polyehdron::shrink_bounding_box() adapted to the lack of default
+ constructors for LBoundary and UBoundary.
+
+2003-04-27 Sunday 16:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Interval.cc (1.8), Interval.defs.hh (1.15),
+ Interval.inlines.hh (1.10): Added Doxygen comments to classes
+ ERational, Boundary, LBoundary, UBoundary, Interval. Removed all
+ the comparison operators that are not currently used in the
+ sources. Removed the default constructors for LBoundary and
+ UBoundary. Made explicit that the Interval class, as it is
+ defined, can only manipulate standard (i.e., non-extended)
+ rational intervals.
+
+2003-04-27 Sunday 16:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.72): Added a scary comment to Row::assign(),
+ since its improper use may cause memory leaks.
+
+2003-04-27 Sunday 16:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.211): In the documentation of
+ shrink_bounding_box, we now state that we will always call
+ raise_lower_bound and lower_upper_bound with fractions in
+ canonical form.
+
+2003-04-27 Sunday 16:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.30),
+ devref-print.doxyconf-latex.in (1.30), devref.doxyconf-html.in
+ (1.31): Added files Interval.* and BoundingBox.* to the
+ documentation of the developers.
+
+2003-04-27 Sunday 12:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/writevariable1.cc (1.7): Pass objects of type `Variable' by
+ value.
+
+2003-04-27 Sunday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LinExpression.cc (1.18), LinExpression.defs.hh (1.60),
+ LinExpression.inlines.hh (1.28), Polyhedron.defs.hh (1.210),
+ Polyhedron_public.cc (1.13), Variable.cc (1.12), Variable.defs.hh
+ (1.31), Variable.inlines.hh (1.16): Be consistent: always pass
+ objects of type `Variable' by value.
+
+2003-04-27 Sunday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.cc (1.6), BoundingBox.inlines.hh (1.9),
+ ConSys.cc (1.66), ConSys.inlines.hh (1.30), Constraint.cc (1.39),
+ Constraint.inlines.hh (1.47), GenSys.cc (1.84), GenSys.inlines.hh
+ (1.31), Generator.cc (1.46), Generator.inlines.hh (1.41): Declare
+ variables `const' whenever possible or desirable. Other little
+ improvements.
+
+2003-04-27 Sunday 10:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.62): Fixed a typo in a comment.
+
+2003-04-27 Sunday 09:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.9): Avoid unnecessary explicit
+ initialization of vectors.
+
+2003-04-27 Sunday 09:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.8): Some debugging output removed.
+
+2003-04-27 Sunday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_widenings.cc (1.7): Declare variables `const'
+ whenever possible or desirable.
+
+2003-04-26 Saturday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.12): Declare variables `const'
+ whenever possible or desirable.
+
+2003-04-26 Saturday 19:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.11): Declare variables `const'
+ whenever possible or desirable.
+
+2003-04-26 Saturday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.16): Updated.
+
+2003-04-26 Saturday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.75): Tentative release date for PPL 0.5 is April 28,
+ 2003.
+
+2003-04-26 Saturday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatMatrix.cc (1.27), SatMatrix.inlines.hh (1.20): Declare
+ variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 15:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc (1.20), SatRow.inlines.hh (1.27): Declare
+ variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 14:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.61): Added comments to Matrix::sort_rows(first,
+ last).
+
+2003-04-26 Saturday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.74), TODO (1.52): Widening with tokens announced in the
+ NEWS file.
+
+2003-04-26 Saturday 07:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.80), ppl_c.h (1.89): Stick to the C89
+ standard.
+
+2003-04-26 Saturday 07:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.51): We must announce widening with tokens in the NEWS
+ file.
+
+2003-04-25 Friday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.15): Changes made elsewhere (removal of the
+ comparison operators over polyhedra and introduction of widenings
+ with tokens) now reflected here.
+
+2003-04-25 Friday 21:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.50): All the functionalities are available in all
+ interfaces. The documentation for Polyhedron::map_dimensions()
+ and its wrappers for all the interfaces is OK.
+
+2003-04-24 Thursday 22:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.73), TODO (1.49), doc/definitions.dox (1.120),
+ interfaces/C/ppl_c.cc (1.79), interfaces/C/ppl_c.h (1.88),
+ interfaces/Prolog/Prolog_interface.dox (1.104),
+ interfaces/Prolog/pl_check.pl (1.66),
+ interfaces/Prolog/ppl_prolog.icc (1.115),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.57),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.38),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.52),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.76),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.25),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.39),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.70), src/Determinate.defs.hh
+ (1.31), src/Determinate.inlines.hh (1.30), src/Polyhedron.defs.hh
+ (1.209), src/Polyhedron.inlines.hh (1.79), src/PowerSet.defs.hh
+ (1.31), src/PowerSet.inlines.hh (1.36), tests/Makefile.am
+ (1.180), tests/mapdim1.cc (1.1), tests/remapdim1.cc (1.3): The
+ "remap_dimensions" operation is now called "map_dimensions".
+
+2003-04-23 Wednesday 14:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.103), pl_check.pl
+ (1.65): Improved grammar specification for Prolog interface.
+ Amended remap test so that it does not refer to unused
+ (singleton) variable D.
+
+2003-04-22 Tuesday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: conversion.cc (1.50), minimize.cc (1.34), simplify.cc
+ (1.32): Declare variables `const' whenever possible or desirable.
+
+2003-04-22 Tuesday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron_chdims.cc (1.7), Polyhedron_nonpublic.cc (1.10),
+ Polyhedron_public.cc (1.11), Polyhedron_widenings.cc (1.6):
+ Consistently use `space_dim' instead of `space_dimension()' from
+ within the Polyhedron class.
+
+2003-04-22 Tuesday 08:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.60), Matrix.inlines.hh (1.34), Row.cc (1.56),
+ Row.inlines.hh (1.41): Declare variables `const' whenever
+ possible or desirable.
+
+2003-04-20 Sunday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.87),
+ interfaces/Prolog/Prolog_interface.dox (1.102),
+ interfaces/Prolog/pl_check.pl (1.64),
+ interfaces/Prolog/ppl_prolog.icc (1.114), src/Polyhedron.defs.hh
+ (1.208), src/Polyhedron.inlines.hh (1.78), tests/remapdim1.cc
+ (1.2): Changed the documentation of the remapping operator to
+ refer to the specification provided in doc/definitions.dox;
+ changed the tests to avoid experimenting with cases when the
+ behavior is undefined; no longer insisting that the partial
+ function is injective (since this is required but it is not
+ enough to obtain a well-defined behavior).
+
+2003-04-19 Saturday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.179), remapdim1.cc (1.1), renamedim1.cc
+ (1.3): Test program renamedim1.cc renamed remapdim1.cc.
+
+2003-04-18 Friday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.119), doc/devref-browse.doxyconf-latex.in
+ (1.29), doc/devref-print.doxyconf-latex.in (1.29),
+ doc/devref.doxyconf-html.in (1.30),
+ doc/user-browse.doxyconf-latex.in (1.16),
+ doc/user-print.doxyconf-latex.in (1.16),
+ doc/user.doxyconf-html.in (1.18), interfaces/C/ppl_c.cc (1.78),
+ interfaces/C/ppl_c.h (1.86),
+ interfaces/Prolog/Prolog_interface.dox (1.101),
+ interfaces/Prolog/pl_check.pl (1.63),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.7),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.19),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.56),
+ interfaces/Prolog/GNU/Makefile.am (1.30),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.13),
+ interfaces/Prolog/SICStus/Makefile.am (1.36),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.6),
+ interfaces/Prolog/SWI/Makefile.am (1.28),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.75),
+ interfaces/Prolog/XSB/Makefile.am (1.14),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.38),
+ interfaces/Prolog/YAP/Makefile.am (1.22),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.69), m4/Makefile.am (1.9),
+ m4/ac_check_gmp.m4 (1.12), m4/ac_cxx_flexible_arrays.m4 (1.6),
+ src/ConSys.cc (1.65), src/GenSys.cc (1.83), src/GenSys.defs.hh
+ (1.92), src/Generator.defs.hh (1.84), src/Matrix.cc (1.59),
+ src/Matrix.defs.hh (1.49), src/NNC_Polyhedron.defs.hh (1.22),
+ src/Poly_Con_Relation.defs.hh (1.22), src/Polyhedron.defs.hh
+ (1.207), src/Polyhedron.inlines.hh (1.77),
+ src/Polyhedron_chdims.cc (1.6), src/Polyhedron_nonpublic.cc
+ (1.9), src/Polyhedron_public.cc (1.10),
+ src/Polyhedron_widenings.cc (1.5), src/PowerSet.inlines.hh
+ (1.35), src/Row.cc (1.55), src/Row.defs.hh (1.71),
+ src/SatMatrix.cc (1.26), src/SatMatrix.defs.hh (1.32),
+ src/SatRow.cc (1.19), src/SatRow.defs.hh (1.31), src/Status.cc
+ (1.21), src/conversion.cc (1.49), src/minimize.cc (1.33),
+ src/simplify.cc (1.31): Trailing blanks removed.
+
+2003-04-18 Friday 19:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.72), TODO (1.48), interfaces/C/ppl_c.cc (1.77),
+ interfaces/C/ppl_c.h (1.85),
+ interfaces/Prolog/Prolog_interface.dox (1.100),
+ interfaces/Prolog/pl_check.pl (1.62),
+ interfaces/Prolog/ppl_prolog.icc (1.113),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.55),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.37),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.51),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.74),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.24),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.37),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.68), src/Determinate.defs.hh
+ (1.30), src/Determinate.inlines.hh (1.29), src/Polyhedron.defs.hh
+ (1.206), src/Polyhedron.inlines.hh (1.76), src/PowerSet.defs.hh
+ (1.30), src/PowerSet.inlines.hh (1.34), tests/renamedim1.cc
+ (1.2): The "rename_dimensions" operation is now called
+ "remap_dimensions".
+
+2003-04-18 Friday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.118): Section about "Remapping the
+ Dimension of the Vector Space" rewritten.
+
+2003-04-18 Friday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/ppl.sty (1.12): New macro \pard[3] to typeset the signature
+ of a partial function.
+
+2003-04-17 Thursday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.117), src/ConSys.cc (1.64),
+ src/Matrix.defs.hh (1.48), src/Polyhedron_nonpublic.cc (1.8):
+ Prefer "zeroes" to "zeros".
+
+2003-04-17 Thursday 22:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.112): The Boundary_Kind enum
+ is now confined into the anonymous namespace.
+
+2003-04-17 Thursday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.11), interfaces/Prolog/ppl_prolog.icc
+ (1.111): Prefer anonymous namespaces to static declarations.
+
+2003-04-17 Thursday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.110),
+ src/BoundingBox.inlines.hh (1.8), src/Interval.cc (1.7),
+ src/Interval.defs.hh (1.14), src/Interval.inlines.hh (1.9),
+ src/Interval.types.hh (1.6), src/Polyhedron.inlines.hh (1.75):
+ Class `ExtendedRational' renamed `ERational'.
+
+2003-04-17 Thursday 19:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.47), src/Matrix.defs.hh (1.47), src/Matrix.inlines.hh
+ (1.33): Fixed the comments of the following methods of Matrix:
+ void grow(dimension_type new_n_rows, dimension_type
+ new_n_columns); void resize_no_copy(dimension_type new_n_rows,
+ void add_rows_and_columns(dimension_type n).
+
+2003-04-17 Thursday 19:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.94): Version number bumped.
+
+2003-04-17 Thursday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.21): Target `check-local'
+ fixed.
+
+2003-04-17 Thursday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.20): Remove ciao_clpq and
+ ciao_clpq2 when cleaning.
+
+2003-04-17 Thursday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.29): Remove check_script3
+ when cleaning.
+
+2003-04-17 Thursday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.20): Distribute also
+ yap_pl_check.pl.
+
+2003-04-17 Thursday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.28): Distribute also
+ gnu_pl_check.pl.
+
+2003-04-16 Wednesday 07:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.99): Small corrections
+ made.
+
+2003-04-16 Wednesday 05:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.23): Distribute expected3.
+
+2003-04-15 Tuesday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.22): Distribute also
+ pl_check.pl.
+
+2003-04-15 Tuesday 19:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.71), TODO (1.46), interfaces/C/ppl_c.cc (1.76),
+ interfaces/C/ppl_c.h (1.84),
+ interfaces/Prolog/Prolog_interface.dox (1.98),
+ interfaces/Prolog/pl_check.pl (1.61),
+ interfaces/Prolog/ppl_prolog.icc (1.109),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.54),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.36),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.50),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.73),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.23),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.36),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.67), src/C_Polyhedron.cc
+ (1.6), src/Determinate.inlines.hh (1.28), src/Polyhedron.defs.hh
+ (1.205), src/Polyhedron.inlines.hh (1.74),
+ src/Polyhedron_public.cc (1.9), tests/bounded1.cc (1.12),
+ tests/disjoint1.cc (1.6), tests/disjoint2.cc (1.7),
+ tests/disjoint3.cc (1.6), tests/empty1.cc (1.13),
+ tests/intersection2.cc (1.9), tests/linearpartition1.cc (1.12),
+ tests/linearpartition2.cc (1.12), tests/linearpartition3.cc
+ (1.12), tests/randphull1.cc (1.9), tests/smm1.cc (1.14),
+ tests/timeelapse5.cc (1.8), tests/topclosed1.cc (1.6),
+ tests/topclosed2.cc (1.5), tests/topclosed3.cc (1.7),
+ tests/universe1.cc (1.9), tests/universe2.cc (1.10),
+ tests/universe3.cc (1.10), tests/universe4.cc (1.10),
+ tests/universe5.cc (1.11), tests/universe6.cc (1.8): The methods
+ Polyhedron::check_empty() and Polyhedron::check_universe() have
+ been renamed is_empty() and is_universe(), respectively. The
+ function check_disjoint(const Polyhedron&, const Polyhedron&) had
+ been replaced by method Polyhedron::is_disjoint_from(const
+ Polyhedron&). The methods Polyhedron::check_bounded() and
+ Polyhedron::check_topologically_closed() have been renamed
+ is_bounded() and is_topologically_closed(), respectively.
+
+2003-04-15 Tuesday 19:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.19): Distribute also
+ ciao_clpq2.pl.
+
+2003-04-15 Tuesday 13:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.204), Polyhedron.inlines.hh (1.73),
+ Polyhedron_chdims.cc (1.5), Polyhedron_nonpublic.cc (1.7),
+ Polyhedron_public.cc (1.8), Polyhedron_widenings.cc (1.4):
+ Polyhedron::is_empty() renamed Polyhedron::marked_empty().
+
+2003-04-15 Tuesday 13:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.16), Watchdog/ltmain.sh (1.5): Updated.
+
+2003-04-15 Tuesday 09:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.70), interfaces/C/ppl_c.cc (1.75),
+ interfaces/Prolog/ppl_prolog.icc (1.108), src/ConSys.defs.hh
+ (1.79), src/GenSys.defs.hh (1.91), src/Generator.defs.hh (1.83),
+ src/Polyhedron.defs.hh (1.203), src/Polyhedron.inlines.hh (1.72),
+ src/Polyhedron_public.cc (1.7), src/Polyhedron_widenings.cc
+ (1.3), tests/Makefile.am (1.178), tests/NNCinclusion1.cc (1.7),
+ tests/contains1.cc (1.4), tests/contains2.cc (1.1),
+ tests/contains3.cc (1.1), tests/contains4.cc (1.1),
+ tests/contains5.cc (1.1), tests/exceptions1.cc (1.34),
+ tests/exceptions2.cc (1.28), tests/inclusion1.cc (1.7),
+ tests/inclusion2.cc (1.4), tests/linearpartition1.cc (1.11),
+ tests/linearpartition2.cc (1.11), tests/linearpartition3.cc
+ (1.11), tests/operator1.cc (1.5): The functions
+ Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+ Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+ Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+ Polyhedron::operator>(const Polyhedron&, const Polyhedron&) have
+ been removed. The methods Polyhedron::contains(const
+ Polyhedron&) and Polyhedron::strictly_contains(const Polyhedron&)
+ provide the same functionality.
+
+2003-04-14 Monday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.202), Polyhedron_nonpublic.cc (1.6),
+ Polyhedron_public.cc (1.6): Polyhedron::is_included(const
+ Polyhedron&) renamed Polyhedron::is_included_in(const
+ Polyhedron&).
+
+2003-04-14 Monday 12:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.60), Ciao/ppl_ciao.pl (1.53):
+ The ciao system now allows for
+ ppl_Polyhedron_generalized_affine_image to fail. This is now
+ tested in pl_check.
+
+2003-04-14 Monday 11:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.59), Ciao/ppl_ciao.pl (1.52):
+ This allows for failure in ciao for timeout_exception_atom when
+ the atom given does not unify with the current value and also for
+ the new_Polyhedron predicates when unifying the new handle with
+ the input value. In order to test this, the tests in pl_check
+ assume that unifying a new handle with value 0 will fail.
+
+2003-04-13 Sunday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/expected2 (1.8): Adapted to strong
+ normalization.
+
+2003-04-13 Sunday 13:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.63), GenSys.cc (1.82), Matrix.cc (1.58),
+ Matrix.defs.hh (1.46), Row.cc (1.54), Row.defs.hh (1.70),
+ simplify.cc (1.30): Added a boolean parameter to Matrix::OK() to
+ control whether or not we also want to check for strong
+ normalization of the rows in the matrix. Strong normalization is
+ now checked when this might be useful, i.e., avoiding bare
+ repetitions of the same check. Also added a method
+ Row::check_strongly_normalized() with the obvious semantics.
+
+2003-04-13 Sunday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.18): Do not use the
+ GLOBALSTKSIZE kludge for testing with clpq2.pl.
+
+2003-04-13 Sunday 09:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.51): Indentation fixed.
+
+2003-04-12 Saturday 20:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/expected2 (1.10): Updated according to the
+ enforcing of strong-normalization.
+
+2003-04-12 Saturday 20:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplify.cc (1.29): Method Polyhedron::simplify(mat, sat)
+ takes as 1st input argument a well-formed Matrix mat. When a
+ ray-point-inequality is transformed into a line-equality,
+ sign_normalization is applied to enforce strong-normalization.
+ Well-formedness of mat also asserted on exit.
+
+2003-04-12 Saturday 20:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.57): Methods Matrix::gauss() and
+ Matrix::back_substitute() are applied to well-formed matrices and
+ will return well-formed matrices. Corrected a bug in the
+ handling of the sortedness flag in back_substitute(). Method
+ Matrix::OK() now also checks strong normalization of rows.
+
+2003-04-12 Saturday 20:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Row.cc (1.53), Row.defs.hh (1.69), Row.inlines.hh (1.40):
+ Strong normalization of rows made inline and implemented by
+ calling Row::normalize() and Row::sign_normalize().
+
+2003-04-11 Friday 08:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.62), GenSys.cc (1.81): Fixed a couple of
+ comments.
+
+2003-04-11 Friday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.15), Watchdog/ltmain.sh (1.4): Updated.
+
+2003-04-11 Friday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.61), Constraint.cc (1.38),
+ Constraint.inlines.hh (1.46), GenSys.cc (1.80), Generator.cc
+ (1.45), Matrix.cc (1.56), Matrix.inlines.hh (1.32), Row.cc
+ (1.52), Row.defs.hh (1.68), conversion.cc (1.48), simplify.cc
+ (1.28): Commit to EXTRA_NORMALIZATION=1.
+
+2003-04-10 Thursday 14:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.60), GenSys.cc (1.79), Polyhedron_widenings.cc
+ (1.2), conversion.cc (1.47): Strong normalization of rows called
+ when EXTRA_NORMALIZATION is set; otherwise use (simple)
+ normalization.
+
+2003-04-10 Thursday 12:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.59), GenSys.cc (1.78), Matrix.defs.hh (1.45),
+ Matrix.inlines.hh (1.31), Polyhedron_chdims.cc (1.4): Added
+ method Matrix::remove_columns(dimension_type new_n_columns) with
+ the expected semantics. The method ensures that the resulting
+ matrix is in normal form, thus correcting the bug shown by
+ removedim10.cc. The new method is now used everywhere we remove
+ columns from a matrix.
+
+2003-04-10 Thursday 11:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/removedim10.cc (1.2): Corrected the known result.
+
+2003-04-10 Thursday 10:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.177), removedim10.cc (1.1): New test
+ showing a bug whereby rows of matrices are not re-normalized
+ after the removal of some columns.
+
+2003-04-10 Thursday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/removedim9.cc (1.5): Indentation fixed.
+
+2003-04-09 Wednesday 09:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.9): Improved the section about the production of
+ Doxygen documentation.
+
+2003-04-09 Wednesday 09:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.58): Changed the way variables
+ are bound to dimension names. This avoids a problem due to a bug
+ in XSB.
+
+2003-04-08 Tuesday 19:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.45): For the moment, it is convenient to have
+ Matrix::set_sorted(bool value) instead of, say,
+ Matrix::set_sorted() and Matrix::set_unsorted(). Sortedness will
+ have to be dealt with at a more fundamental level anyway.
+
+2003-04-08 Tuesday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.4): Updated.
+
+2003-04-08 Tuesday 19:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.44): Section on "Constructions on Polyhedra" revised.
+ Minor fix in the section about "Cutting-Plane Methods".
+
+2003-04-08 Tuesday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.43): Remove the section about designing and
+ implementating strict weak orderings on polyhedra.
+
+2003-04-08 Tuesday 19:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.15): Updated.
+
+2003-04-08 Tuesday 18:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.5): Copyright symbol added.
+
+2003-04-08 Tuesday 18:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.12): Updated.
+
+2003-04-08 Tuesday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.7): Minor correction.
+
+2003-04-08 Tuesday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.97): Information on how
+ to use the XSB interface added.
+
+2003-04-08 Tuesday 16:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/SatMatrix.defs.hh (1.31): Added short Doxygen description and
+ improved the long one for SatMatrix.
+
+2003-04-08 Tuesday 13:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.49): Added missing
+ definitions for
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_token and
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token.
+
+2003-04-08 Tuesday 13:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.322): Implementation file Polyhedron.cc has
+ been split in 4 chunks: - Polyhedron_widenings.cc contains the
+ definitions of (non-inline) functions related to widening and
+ extrapolation operators; - Polyhedron_chdims.cc contains the
+ definitions of (non-inline) functions that change the space
+ dimensions; - Polyhedron_public.cc contains the definitions of
+ all the other public (non-inline) functions -
+ Polyhedron_nonpublic.cc contains the definitions of all the other
+ non-public (i.e., private or protected) (non-inline) functions.
+
+2003-04-08 Tuesday 13:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron_chdims.cc (1.3), Polyhedron_nonpublic.cc (1.5),
+ Row.defs.hh (1.67), statistics.hh (1.2): Added Doxygen
+ documentation for a few #define's.
+
+2003-04-08 Tuesday 10:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.57), Ciao/ppl_ciao.pl (1.50):
+ Added code and test to allow for Prolog failure in the
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs/4 predicate.
+
+2003-04-08 Tuesday 09:39 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.56): Added tests for Prolog
+ failure for the "with_token" predicates. Some reorganisation of
+ the widening/extrapolation tests.
+
+2003-04-08 Tuesday 09:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.49): Modified the
+ "with_token" predicates to allow for Prolog failure.
+
+2003-04-08 Tuesday 08:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.29), PowerSet.inlines.hh (1.33): Added
+ \relates command for functions working on class template
+ PowerSet.
+
+2003-04-08 Tuesday 08:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.66): Improved the detailed Doxygen description
+ of class Row.
+
+2003-04-08 Tuesday 08:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.29), Determinate.inlines.hh (1.27):
+ Added a few \relates commands, which however show a bug in the
+ handling of template specializations by Doxygen.
+
+2003-04-08 Tuesday 08:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.cc (1.17): Added missing \relates Doxygen
+ commands.
+
+2003-04-07 Monday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.14), Watchdog/ltmain.sh (1.3): Updated.
+
+2003-04-07 Monday 08:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.48): The local definition
+ of many of the ppl predicates changed to allow for Prolog
+ failure. Some missing predicates added.
+
+2003-04-07 Monday 08:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.55): Tests have been improved
+ and extended to check negation and Prolog failure. Some
+ reorganisation done.
+
+2003-04-07 Monday 07:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.35):
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_token was
+ missing - is now added.
+
+2003-04-06 Sunday 18:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.84), Constraint.inlines.hh (1.45),
+ Generator.defs.hh (1.82), Generator.inlines.hh (1.40),
+ LinExpression.defs.hh (1.59), LinExpression.inlines.hh (1.27),
+ Polyhedron_public.cc (1.5): Adding a few missing \relates Doxygen
+ commands. Avoid adding Doxygen blocks near to *friend*
+ declarations: comment the very function declarations instead.
+
+2003-04-06 Sunday 18:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.defs.hh (1.21),
+ Poly_Con_Relation.inlines.hh (1.10), Poly_Gen_Relation.defs.hh
+ (1.20), Poly_Gen_Relation.inlines.hh (1.10), SatRow.inlines.hh
+ (1.26), Status.defs.hh (1.28), Status.inlines.hh (1.13): Adding a
+ few missing \relates Doxygen commands. Avoid adding Doxygen
+ blocks near to *friend* declarations: comment the very function
+ declarations instead.
+
+2003-04-06 Sunday 18:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/SatRow.defs.hh (1.30): Removed declared but unimplemented
+ member function unsigned int size().
+
+2003-04-06 Sunday 12:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.65): Upgraded the detailed documentation of
+ class Row to also describe the representation of NNC row objects.
+
+2003-04-05 Saturday 09:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Status.defs.hh (1.27): Modified class documentation to also
+ consider the flags about pending constraints and generators.
+ Moved Doxygen comments from friend declaration to the real
+ function declaration. Avoid using preproc flag PPL_DOXYGEN_HYDE_
+ IMPLEMENTATION_DETAILS when useless, i.e., when we are inside a
+ class whose documentation is already hidden.
+
+2003-04-05 Saturday 09:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.55), Matrix.defs.hh (1.44): Adjusted a couple
+ of Doxygen and code comments.
+
+2003-04-01 Tuesday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.93): Fixed a bug whereby building of the SICStus
+ Prolog interface was attempted even if deemed to fail because the
+ sicstus.h include could not be found.
+
+2003-04-01 Tuesday 12:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron_public.cc (1.4), SatRow.cc (1.18): Added four
+ \relates Doxygen commands to correctly match declaration and
+ definition of functions in the devref manual.
+
+2003-03-31 Monday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.83): Missing inline qualification added.
+
+2003-03-31 Monday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.13): Updated.
+
+2003-03-28 Friday 10:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.92): When checking for the presence of source
+ files, avoid testing for `Polyhedron.cc', who is going to be
+ removed from the repository.
+
+2003-03-27 Thursday 14:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.42): New items to be checked.
+
+2003-03-27 Thursday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.54): Comments of Matrix::operator=(const Matrix&
+ y) made more precise.
+
+2003-03-27 Thursday 14:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.inlines.hh (1.39): Indentation of preprocessing
+ directives fixed.
+
+2003-03-27 Thursday 14:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.51): Row::Impl::copy_construct() slightly improved.
+
+2003-03-27 Thursday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.inlines.hh (1.30): Spacing adjusted.
+
+2003-03-25 Tuesday 18:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.96), pl_check.pl
+ (1.54): The documentation for the relations_with predicates
+ corrected. The tests for the relations_with predicates improved.
+
+2003-03-25 Tuesday 11:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.71): Inline functions should be
+ *defined* before they are used.
+
+2003-03-19 Wednesday 09:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.53): All tests now test both c
+ and nnc polyhedra. Some more checks on the interface
+ incorporated into these tests.
+
+2003-03-19 Wednesday 08:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/permute.cc (1.30): Avoid unnecessary calls to
+ append_size_rel.
+
+2003-03-19 Wednesday 07:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/permute.cc (1.29): Bug fixed
+
+2003-03-18 Tuesday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/SatRow.defs.hh (1.29): Added Doxygen comment to class SatRow.
+ Avoiding commenting friend declarations.
+
+2003-03-18 Tuesday 15:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.64): Added doxygen comment to class Row::Impl.
+
+2003-03-18 Tuesday 12:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.28),
+ devref-print.doxyconf-latex.in (1.28), devref.doxyconf-html.in
+ (1.29): Added input file version.hh.
+
+2003-03-18 Tuesday 11:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh (1.44), Row.cc (1.50), Row.defs.hh
+ (1.63), Row.inlines.hh (1.38), SatMatrix.defs.hh (1.30),
+ SatMatrix.inlines.hh (1.19), SatRow.defs.hh (1.28),
+ SatRow.inlines.hh (1.25): As suggested in our STANDARDS file, let
+ all Doxygen comments be centralized before methods declarations
+ in file *.defs.hh. In class Row, be careful to use the same
+ parameter naming in declarations and definitions. For Row and
+ SatRow, let std::iter_swap be declared in *.defs.hh.
+
+2003-03-18 Tuesday 11:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.107), Ciao/ppl_ciao.pl
+ (1.47): Be more general with respect to different ways of raising
+ Prolog exceptions in C code.
+
+2003-03-18 Tuesday 10:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.95): Bug in comment for
+ ppl_Polyhedron_OK fixed.
+
+2003-03-18 Tuesday 10:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.34): Repeated declaration
+ removed.
+
+2003-03-18 Tuesday 08:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.94): Bug fixed in
+ documentation of ppl_Polyhedron_OK.
+
+2003-03-18 Tuesday 08:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.33): Bug fixed.
+
+2003-03-18 Tuesday 08:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.93), pl_check.pl
+ (1.52), ppl_prolog.icc (1.106), Ciao/ppl_ciao.pl (1.46),
+ GNU/ppl_gprolog.pl (1.35), SICStus/ppl_sicstus_sd.cc (1.48),
+ SWI/ppl_swiprolog.cc (1.72), XSB/ppl_xsb.H (1.22), XSB/ppl_xsb.cc
+ (1.32), YAP/ppl_yap.cc (1.66): The "with_token" predicates added
+ for the extrapolation operators. The ppl_Polyhedron_OK predicate
+ added. The documentation predicates reorganised to match the
+ standard ordering. Tests added for the new predicates.
+
+2003-03-17 Monday 09:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.82): Comments fixed.
+
+2003-03-17 Monday 09:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.51): Many improvements and extra
+ tests added.
+
+2003-03-16 Sunday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.105): Default arguments are
+ only permitted on functions.
+
+2003-03-16 Sunday 22:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.104): Prefer anonymous
+ namespaces to static linkage.
+
+2003-03-16 Sunday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.inlines.hh (1.70), Polyhedron_chdims.cc (1.2),
+ Polyhedron_nonpublic.cc (1.4), Polyhedron_public.cc (1.3): A few
+ harmless FIXME's replaced by TODO.
+
+2003-03-16 Sunday 10:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_public.cc (1.2): In affine_image(), added a
+ comment explaining why in one case we can leave work correctly
+ with a DD pair having pending rows.
+
+2003-03-16 Sunday 10:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron_nonpublic.cc (1.3): Preferred unset_pending_rows()
+ wrt set_index_first_pending_row().
+
+2003-03-16 Sunday 10:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplify.cc (1.27): Preferring unset_pending_rows() wrt
+ set_index_first_pending_row().
+
+2003-03-16 Sunday 10:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.46): Dealt with a FIXME. Preferring the use
+ of unset_pending_rows() wrt the use of set_index_first_pending(),
+ since the first is more intuitive.
+
+2003-03-16 Sunday 10:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.77): Dealt with the CHECK ME in
+ remove_invalid_rays_and_lines().
+
+2003-03-16 Sunday 10:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (1.58): Added a needed comment.
+
+2003-03-15 Saturday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.103): Some code duplication
+ avoided.
+
+2003-03-15 Saturday 13:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.78), GenSys.defs.hh (1.90): Corrected
+ typos in comments.
+
+2003-03-15 Saturday 13:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.69): Small corrections in
+ rename_dimensions().
+
+2003-03-15 Saturday 13:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.h (1.81), ppl_c.cc (1.74): Added the
+ equality test for polyhedra to the C interface.
+
+2003-03-14 Friday 21:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in (1.27),
+ doc/devref-print.doxyconf-latex.in (1.27),
+ doc/devref.doxyconf-html.in (1.28), interfaces/C/ppl_c.h (1.80),
+ interfaces/Prolog/Prolog_interface.dox (1.92),
+ interfaces/Prolog/ppl_prolog.icc (1.102),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.45),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.34),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.47),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.71),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.21),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.31),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.65), src/Polyhedron.defs.hh
+ (1.201), src/Polyhedron.inlines.hh (1.68),
+ src/Polyhedron_nonpublic.cc (1.2): Reordered the functions and
+ their documentation in all the interfaces to follow the
+ reorganization done in Polyhedron.defs.hh. Adjusted Doxygen
+ configuration files for the devref manuals to get their input
+ from the new .cc files of class Polyhedron.
+
+2003-03-14 Friday 13:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.69), TODO (1.41), interfaces/C/ppl_c.cc (1.73),
+ interfaces/C/ppl_c.h (1.79),
+ interfaces/Prolog/Prolog_interface.dox (1.91),
+ interfaces/Prolog/pl_check.pl (1.50),
+ interfaces/Prolog/ppl_prolog.icc (1.101),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.44),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.33),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.46),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.70),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.20),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.30),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.64): Interfaces changed to
+ match method name changes (check_bound, check_topolo- giaclly
+ close and check_disjoint). Change reported in the NEWS.
+
+2003-03-14 Friday 13:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bounded1.cc (1.11), disjoint1.cc (1.5), disjoint2.cc
+ (1.6), disjoint3.cc (1.5), linearpartition1.cc (1.10),
+ linearpartition2.cc (1.10), linearpartition3.cc (1.10),
+ topclosed1.cc (1.5), topclosed2.cc (1.4), topclosed3.cc (1.6):
+ Tests changed according to method renaming.
+
+2003-03-14 Friday 13:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.5), Makefile.am (1.62), Polyhedron.cc
+ (1.321), Polyhedron.defs.hh (1.200), Polyhedron.inlines.hh
+ (1.67), Polyhedron_chdims.cc (1.1), Polyhedron_nonpublic.cc
+ (1.1), Polyhedron_public.cc (1.1), Polyhedron_widenings.cc (1.1):
+ Split file Polyhedron.cc into several files. Methods
+ is_bounded(), is_topologically_closed() and are_disjoint()
+ renamed to check_bounded(), check_topologically_closed() and
+ check_disjoint(). Documentation reorganized to match more
+ closely the order in the introduction of the user manual, also
+ grouping related methods. Added exception thrower
+ throw_runtime_error(). In the documentation, all examples using
+ class `Polyhedron' changed to use the user-accessible class
+ `C_Polyhedron'.
+
+2003-03-14 Friday 12:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.43), Poly_Con_Relation.defs.hh (1.20),
+ Poly_Gen_Relation.defs.hh (1.19), Row.defs.hh (1.62),
+ SatRow.defs.hh (1.27), Status.defs.hh (1.26): In Doxygen
+ documentation, replaced `@name' by `\name'.
+
+2003-03-14 Friday 09:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.17): Corrected for clpq2.pl
+ checks
+
+2003-03-13 Thursday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.27), gnu_pl_check.pl
+ (1.1): Test all predicates with GNU Prolog.
+
+2003-03-13 Thursday 08:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/yap_pl_check.pl (1.2): Comment corrected.
+
+2003-03-13 Thursday 08:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.19): Dependencies fixed.
+
+2003-03-12 Wednesday 19:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.116): Another attempt at specifying the
+ space-dimensions remapping operator.
+
+2003-03-12 Wednesday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: expected3 (1.1), YAP/Makefile.am (1.18),
+ YAP/yap_pl_check.pl (1.1): A first attempt at integrating
+ `pl_check.pl' into the regression testing mechanism.
+
+2003-03-12 Wednesday 19:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: user-browse.doxyconf-latex.in (1.15),
+ user-print.doxyconf-latex.in (1.15), user.doxyconf-html.in
+ (1.17): Hide the listing of friend compounds in the user
+ documentation.
+
+2003-03-12 Wednesday 16:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.49): Removed the "and_minimize"
+ from the code for the "checks" predicate.
+
+2003-03-12 Wednesday 13:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.320): Corrected a bug in
+ Polyhedron::add_genrators() whereby a generator system was
+ wrongly declared sorted after the inclusion of pending rows.
+
+2003-03-12 Wednesday 10:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/ppl_gprolog.pl (1.32): Added missing
+ definitions and corrected a bug.
+
+2003-03-12 Wednesday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.176), addgenerators13.cc (1.1): New test
+ exhibiting a bug triggered by an invocation to
+ Polyhedron::add_generators()..
+
+2003-03-12 Wednesday 08:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.48): In many cases, predicates
+ that are intended to cause Prolog failure in certain specified
+ situations now tested more thoroughly. Unnecessary uses of
+ "and_minimize" removed. Other general improvements.
+
+2003-03-11 Tuesday 20:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.90): Mention that we
+ support only YAP version 4.4 or later and Ciao Prolog 1.9 #44 or
+ later.
+
+2003-03-11 Tuesday 19:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.100): Now all the
+ *_and_minimize/2 predicates fail if the resulting polyhedron is
+ empty.
+
+2003-03-11 Tuesday 17:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.99): Indentation fixed.
+
+2003-03-11 Tuesday 15:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.47), ppl_prolog.icc (1.98),
+ Ciao/ppl_ciao.pl (1.43), GNU/ppl_gprolog.pl (1.31),
+ SICStus/ppl_sicstus_sd.cc (1.45), SWI/ppl_swiprolog.cc (1.69),
+ XSB/ppl_xsb.H (1.19), XSB/ppl_xsb.cc (1.29), YAP/ppl_yap.cc
+ (1.63): The "..with_tokens" predicates are now "..with_token".
+ The predicate ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+ added to Ciao, GNU, SICStus, XSB, and Yap.
+
+2003-03-11 Tuesday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: ciao_clpq.pl (1.6), ciao_clpq2.pl (1.2):
+ Import as few predicates as possible.
+
+2003-03-11 Tuesday 13:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.42): Complete declarations
+ for ppl_Polyhedron_H79_widening_assign_with_tokens/3.
+
+2003-03-11 Tuesday 11:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.46), Ciao/ppl_ciao.pl (1.41),
+ GNU/ppl_gprolog.pl (1.30), SICStus/ppl_sicstus_sd.cc (1.44),
+ SWI/ppl_swiprolog.cc (1.68), XSB/ppl_xsb.H (1.18), XSB/ppl_xsb.cc
+ (1.28), YAP/ppl_yap.cc (1.62): Tests for new interface predicates
+ added.
+
+2003-03-11 Tuesday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.97): Translate std::bad_alloc
+ into a usable Prolog exception.
+
+2003-03-11 Tuesday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.96):
+ PIFunc::max_in_codomain() fixed.
+
+2003-03-11 Tuesday 09:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.89): Descriptions of
+ "with_token" predicates improved.
+
+2003-03-10 Monday 19:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.16), ciao_clpq.pl (1.5),
+ ciao_clpq2.pl (1.1), ppl_ciao.cc (1.18), ppl_ciao.pl (1.40): Ciao
+ Prolog interface fixed and now part of the regression testing
+ mechanism.
+
+2003-03-10 Monday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.68): The Prolog interface now supports also Ciao Prolog
+ and XSB.
+
+2003-03-10 Monday 18:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.115): First attempt at describing the
+ operator remapping dimensions.
+
+2003-03-10 Monday 12:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.114): Changed a bit the description about
+ widenings to better clarify what has been done and we are still
+ doing for NNC polyhedra.
+
+2003-03-10 Monday 11:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.72), ppl_c.h (1.78): Modified the C
+ interface to support the widening-with-tokens technique for all
+ widening and extrapolation operators.
+
+2003-03-10 Monday 10:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.88): Descriptions for
+ the bounded_..._extrapolation_assign predicates corrected.
+
+2003-03-10 Monday 10:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.87): Added
+ documentation for the with_token versions of the widening
+ predicates and for the bounded versions of the extrapolation
+ predicates.
+
+2003-03-10 Monday 09:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.86): Prolog interface
+ documentation reorganised with a summary list of all predicates.
+
+2003-03-09 Sunday 22:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.95): Started factorizing the
+ implementation of the Prolog interface using pointers to members.
+
+2003-03-09 Sunday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.94), Ciao/ppl_ciao.pl
+ (1.39), GNU/ppl_gprolog.pl (1.29), SICStus/ppl_sicstus_sd.cc
+ (1.43), SWI/ppl_swiprolog.cc (1.67), XSB/ppl_xsb.H (1.17),
+ XSB/ppl_xsb.cc (1.27), YAP/ppl_yap.cc (1.61): New predicate
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+
+2003-03-09 Sunday 21:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.93), Ciao/ppl_ciao.pl
+ (1.38), GNU/ppl_gprolog.pl (1.28), SICStus/ppl_sicstus_sd.cc
+ (1.42), SWI/ppl_swiprolog.cc (1.66), XSB/ppl_xsb.H (1.16),
+ XSB/ppl_xsb.cc (1.26), YAP/ppl_yap.cc (1.60): New predicate
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/3.
+
+2003-03-09 Sunday 21:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.71), ppl_c.h (1.77): New function
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(). Some
+ hyperlinks added.
+
+2003-03-09 Sunday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.23): Updated.
+
+2003-03-09 Sunday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.91): Check whether the C compiler supports the
+ `inline' keyword.
+
+2003-03-09 Sunday 19:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.40), src/Interval.defs.hh (1.13): The Interval class has
+ been documented.
+
+2003-03-09 Sunday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.199): Polyhedron::OK() only prints
+ something if run-time assertions are enabled.
+
+2003-03-09 Sunday 11:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.39), src/Polyhedron.types.hh (1.9): Explained PPL's I/O
+ operators and how to deal with the IO_Operators namespace.
+
+2003-03-09 Sunday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.38): It should now be clear how to build the
+ documentation.
+
+2003-03-09 Sunday 08:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.90): Version number bumped.
+
+2003-03-09 Sunday 08:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/adddimensions13.cc (1.2): Comments improved.
+
+2003-03-09 Sunday 08:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.53): Explain the necessity of the guard against
+ auto-assignments in Matrix::operator=(const Matrix&).
+
+2003-03-08 Saturday 22:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (1.52): Corrected Matrix::operator= to avoid the
+ bug shown by tests adddimensions13.
+
+2003-03-08 Saturday 22:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.175), adddimensions13.cc (1.1): Added test
+ showing a bug in teh assignment operator of Matrix. Bug is only
+ visible when configuring with --enable-more-assertions.
+
+2003-03-08 Saturday 22:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.113): Removed wrong capitalization.
+
+2003-03-08 Saturday 21:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.11), user.tex (1.12): Apparently, CoVer is a
+ MURST project.
+
+2003-03-08 Saturday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.70), ppl_c.h (1.76): New functions
+ ppl_add_LinExpression_to_LinExpression(),
+ ppl_subtract_LinExpression_from_LinExpression() and
+ ppl_multiply_LinExpression_by_Coefficient().
+
+2003-03-08 Saturday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.30): Variable::Compare commented.
+
+2003-03-08 Saturday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.6), TODO (1.37): CREDITS updated.
+
+2003-03-08 Saturday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/README (1.1): Explain how to get (more) PPL documentation.
+
+2003-03-08 Saturday 09:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.69), ppl_c.h (1.75): Typos fixed.
+
+2003-03-08 Saturday 09:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: adddimensions9.cc (1.6), affineimage8.cc (1.7),
+ affinepreimage10.cc (1.7), bounded1.cc (1.10), concatenate2.cc
+ (1.7), disjoint1.cc (1.4), exceptions1.cc (1.33), exceptions2.cc
+ (1.27), intersection10.cc (1.5), removedim7.cc (1.8): Typos
+ fixed.
+
+2003-03-08 Saturday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.83), GenSys.cc (1.76), Polyhedron.cc
+ (1.319), Polyhedron.defs.hh (1.198), Polyhedron.inlines.hh
+ (1.66), SatRow.defs.hh (1.26), Status.cc (1.20), conversion.cc
+ (1.45), minimize.cc (1.32), simplify.cc (1.26): Typos fixed.
+
+2003-03-07 Friday 19:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.32), exceptions2.cc (1.26),
+ generalizedaffineimage1.cc (1.7), generalizedaffineimage10.cc
+ (1.6), generalizedaffineimage11.cc (1.5),
+ generalizedaffineimage12.cc (1.4), generalizedaffineimage2.cc
+ (1.6), generalizedaffineimage3.cc (1.7),
+ generalizedaffineimage4.cc (1.5), generalizedaffineimage5.cc
+ (1.5), generalizedaffineimage6.cc (1.5),
+ generalizedaffineimage7.cc (1.7), generalizedaffineimage8.cc
+ (1.5), generalizedaffineimage9.cc (1.5): Reflect the changes to
+ the enumerate Relation_Symbol.
+
+2003-03-07 Friday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.68), ppl_c.h (1.74): New functions
+ ppl_LinExpression_coefficient() and
+ ppl_LinExpression_inhomogeneous_term().
+
+2003-03-07 Friday 17:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.73): Reorganized the C interface
+ documentation using Doxygen member grouping and trying to use
+ brief comments when possible.
+
+2003-03-07 Friday 15:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.61): Old stuff removed.
+
+2003-03-07 Friday 15:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.67), doc/definitions.dox (1.112), doc/ppl.sty (1.11),
+ interfaces/C/ppl_c.cc (1.67), interfaces/C/ppl_c.h (1.72),
+ interfaces/Prolog/Prolog_interface.dox (1.85),
+ interfaces/Prolog/ppl_prolog.icc (1.92), src/Constraint.defs.hh
+ (1.82), src/LinExpression.defs.hh (1.58), src/Polyhedron.cc
+ (1.318), src/Polyhedron.defs.hh (1.197), src/globals.hh (1.32):
+ We now speak of "relation symbols", not of "relation operators"
+ or "relational operators".
+
+2003-03-07 Friday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.111),
+ interfaces/Prolog/Prolog_interface.dox (1.84): The discussion
+ about eager methods moved from the prolog interface to the
+ introduction (just before the bibliography).
+
+2003-03-07 Friday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.66), TODO (1.36), interfaces/C/ppl_c.cc (1.66),
+ interfaces/C/ppl_c.h (1.71),
+ interfaces/Prolog/Prolog_interface.dox (1.83),
+ interfaces/Prolog/pl_check.pl (1.45),
+ interfaces/Prolog/ppl_prolog.icc (1.91),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.37),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.27),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.41),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.65),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.15),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.25),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.59), src/Determinate.defs.hh
+ (1.28), src/Determinate.inlines.hh (1.26), src/Polyhedron.defs.hh
+ (1.196), src/Polyhedron.inlines.hh (1.65), src/PowerSet.defs.hh
+ (1.28), src/PowerSet.inlines.hh (1.32), tests/Makefile.am
+ (1.174), tests/renamedim1.cc (1.1), tests/shuffledim1.cc (1.11):
+ We rename dimensions, we do not shuffle them.
+
+2003-03-07 Friday 11:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.110), devref-browse.doxyconf-latex.in
+ (1.26), devref-print.doxyconf-latex.in (1.26),
+ devref.doxyconf-html.in (1.27), user-browse.doxyconf-latex.in
+ (1.14), user-print.doxyconf-latex.in (1.14),
+ user.doxyconf-html.in (1.16): Updated Doxygen configuration files
+ to version 1.3-rc3-20030223. Small typo fixed in
+ definitions.dox.
+
+2003-03-07 Friday 11:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.90): Predicate
+ ppl_Polyhedron_shuffle_dimensions/2 now fails when given a
+ non-injective function.
+
+2003-03-07 Friday 09:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: CbecomesNNC1.cc (1.4), NNCinclusion1.cc (1.6),
+ NNCminimize1.cc (1.9), NNCminimize2.cc (1.9), NNCminimize3.cc
+ (1.9), NNCminimize4.cc (1.11), NNCminimize5.cc (1.8),
+ NNCminimize6.cc (1.10), addconstraint1.cc (1.4),
+ addconstraint2.cc (1.3), addconstraint3.cc (1.3),
+ addconstraints1.cc (1.10), addconstraints10.cc (1.9),
+ addconstraints11.cc (1.10), addconstraints12.cc (1.3),
+ addconstraints13.cc (1.5), addconstraints2.cc (1.18),
+ addconstraints3.cc (1.8), addconstraints4.cc (1.10),
+ addconstraints5.cc (1.11), addconstraints6.cc (1.12),
+ addconstraints7.cc (1.11), addconstraints8.cc (1.11),
+ addconstraints9.cc (1.12), adddimensions1.cc (1.13),
+ adddimensions10.cc (1.6), adddimensions11.cc (1.4),
+ adddimensions12.cc (1.3), adddimensions2.cc (1.9),
+ adddimensions3.cc (1.11), adddimensions4.cc (1.9),
+ adddimensions5.cc (1.7), adddimensions6.cc (1.7),
+ adddimensions7.cc (1.7), adddimensions8.cc (1.5),
+ adddimensions9.cc (1.5), addgenerator1.cc (1.4), addgenerator2.cc
+ (1.4), addgenerator3.cc (1.3), addgenerator4.cc (1.4),
+ addgenerators1.cc (1.11), addgenerators10.cc (1.3),
+ addgenerators11.cc (1.5), addgenerators12.cc (1.5),
+ addgenerators2.cc (1.11), addgenerators3.cc (1.11),
+ addgenerators4.cc (1.11), addgenerators5.cc (1.11),
+ addgenerators6.cc (1.11), addgenerators7.cc (1.8),
+ addgenerators8.cc (1.6), addgenerators9.cc (1.5), affineimage1.cc
+ (1.11), affineimage2.cc (1.10), affineimage3.cc (1.3),
+ affineimage4.cc (1.3), affineimage5.cc (1.4), affineimage6.cc
+ (1.3), affineimage7.cc (1.3), affineimage8.cc (1.6),
+ affinepreimage1.cc (1.10), affinepreimage10.cc (1.6),
+ affinepreimage2.cc (1.10), affinepreimage3.cc (1.10),
+ affinepreimage4.cc (1.11), affinepreimage5.cc (1.3),
+ affinepreimage6.cc (1.4), affinepreimage7.cc (1.3),
+ affinepreimage8.cc (1.3), affinepreimage9.cc (1.4),
+ affinetrans.cc (1.13), append1.cc (1.21), append2.cc (1.21),
+ ascii_dump_load1.cc (1.12), ascii_dump_load2.cc (1.10),
+ ascii_dump_load3.cc (1.13), ascii_dump_load4.cc (1.13),
+ ascii_dump_load5.cc (1.9), ascii_dump_load6.cc (1.6),
+ ascii_dump_load7.cc (1.6), bhrz03widening1.cc (1.3),
+ bhrz03widening10.cc (1.3), bhrz03widening11.cc (1.3),
+ bhrz03widening12.cc (1.3), bhrz03widening13.cc (1.3),
+ bhrz03widening14.cc (1.3), bhrz03widening15.cc (1.5),
+ bhrz03widening16.cc (1.3), bhrz03widening17.cc (1.3),
+ bhrz03widening18.cc (1.3), bhrz03widening19.cc (1.3),
+ bhrz03widening2.cc (1.5), bhrz03widening3.cc (1.5),
+ bhrz03widening4.cc (1.3), bhrz03widening5.cc (1.3),
+ bhrz03widening6.cc (1.4), bhrz03widening7.cc (1.4),
+ bhrz03widening8.cc (1.3), bhrz03widening9.cc (1.5), bounded1.cc
+ (1.9), boundingbox1.cc (1.32), boundingbox2.cc (1.17),
+ boundingbox3.cc (1.8), boundingbox4.cc (1.5), bounds1.cc (1.5),
+ bounds2.cc (1.5), concatenate1.cc (1.7), concatenate2.cc (1.6),
+ concatenate3.cc (1.6), concatenate4.cc (1.5), concatenate5.cc
+ (1.3), concatenate6.cc (1.5), constraints1.cc (1.5),
+ constraints2.cc (1.5), constraints3.cc (1.5), constraints4.cc
+ (1.5), contains1.cc (1.3), disjoint1.cc (1.3), disjoint2.cc
+ (1.5), disjoint3.cc (1.4), ehandlers.hh (1.7), empty1.cc (1.12),
+ exceptions1.cc (1.31), exceptions2.cc (1.25),
+ generalizedaffineimage1.cc (1.6), generalizedaffineimage10.cc
+ (1.5), generalizedaffineimage11.cc (1.4),
+ generalizedaffineimage12.cc (1.3), generalizedaffineimage2.cc
+ (1.5), generalizedaffineimage3.cc (1.6),
+ generalizedaffineimage4.cc (1.4), generalizedaffineimage5.cc
+ (1.4), generalizedaffineimage6.cc (1.4),
+ generalizedaffineimage7.cc (1.6), generalizedaffineimage8.cc
+ (1.4), generalizedaffineimage9.cc (1.4), generators1.cc (1.12),
+ generators2.cc (1.8), generators3.cc (1.4), generators4.cc (1.4),
+ generators5.cc (1.4), generators6.cc (1.5), h79widening1.cc
+ (1.5), h79widening2.cc (1.6), h79widening3.cc (1.6),
+ h79widening4.cc (1.3), h79widening5.cc (1.4), inclusion1.cc
+ (1.6), inclusion2.cc (1.3), intersection1.cc (1.5),
+ intersection10.cc (1.4), intersection11.cc (1.5),
+ intersection2.cc (1.8), intersection3.cc (1.6), intersection4.cc
+ (1.6), intersection5.cc (1.6), intersection6.cc (1.6),
+ intersection7.cc (1.5), intersection8.cc (1.4), intersection9.cc
+ (1.4), limitedbhrz03extrapolation1.cc (1.2),
+ limitedh79extrapolation1.cc (1.2), limitedh79extrapolation2.cc
+ (1.2), limitedh79extrapolation3.cc (1.2),
+ limitedh79extrapolation4.cc (1.2), linearpartition1.cc (1.9),
+ linearpartition2.cc (1.9), linearpartition3.cc (1.9),
+ linexpression1.cc (1.3), mc91.cc (1.11), memory1.cc (1.19),
+ minconstraints1.cc (1.4), minconstraints2.cc (1.4),
+ minconstraints3.cc (1.3), minconstraints4.cc (1.7),
+ mingenerators1.cc (1.4), mingenerators2.cc (1.3),
+ mingenerators3.cc (1.3), onepoint.cc (1.9), operator1.cc (1.4),
+ permute.cc (1.28), polydifference1.cc (1.6), polydifference2.cc
+ (1.8), polydifference3.cc (1.3), polydifference4.cc (1.4),
+ polydifference5.cc (1.5), polydifference6.cc (1.5),
+ polydifference7.cc (1.4), polyhull1.cc (1.6), polyhull10.cc
+ (1.3), polyhull2.cc (1.6), polyhull3.cc (1.6), polyhull4.cc
+ (1.5), polyhull5.cc (1.4), polyhull6.cc (1.4), polyhull7.cc
+ (1.3), polyhull8.cc (1.4), polyhull9.cc (1.5), randphull1.cc
+ (1.8), randphull2.cc (1.5), relations1.cc (1.9), relations10.cc
+ (1.5), relations11.cc (1.5), relations12.cc (1.4), relations13.cc
+ (1.4), relations14.cc (1.4), relations15.cc (1.4), relations16.cc
+ (1.4), relations17.cc (1.6), relations18.cc (1.4), relations19.cc
+ (1.5), relations2.cc (1.10), relations3.cc (1.10), relations4.cc
+ (1.10), relations5.cc (1.10), relations6.cc (1.9), relations7.cc
+ (1.9), relations8.cc (1.9), relations9.cc (1.11), removedim1.cc
+ (1.10), removedim2.cc (1.14), removedim3.cc (1.10), removedim4.cc
+ (1.11), removedim5.cc (1.9), removedim6.cc (1.12), removedim7.cc
+ (1.7), removedim8.cc (1.5), removedim9.cc (1.4), shuffledim1.cc
+ (1.10), smm1.cc (1.13), timeelapse1.cc (1.7), timeelapse2.cc
+ (1.7), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+ (1.7), timeelapse6.cc (1.3), timeelapse7.cc (1.3), timeelapse8.cc
+ (1.4), topclosed1.cc (1.4), topclosed2.cc (1.3), topclosed3.cc
+ (1.5), topclosure1.cc (1.6), topclosure2.cc (1.3), topclosure3.cc
+ (1.3), topclosure4.cc (1.5), universe1.cc (1.8), universe2.cc
+ (1.9), universe3.cc (1.9), universe4.cc (1.9), universe5.cc
+ (1.10), universe6.cc (1.7), watchdog1.cc (1.17), writeconsys1.cc
+ (1.6), writegensys1.cc (1.7), writegensys2.cc (1.7),
+ writegensys3.cc (1.6), writepolyhedron1.cc (1.6),
+ writepolyhedron2.cc (1.7), writepolyhedron3.cc (1.6),
+ writerelation1.cc (1.6), writevariable1.cc (1.6): Treatment of
+ exceptions harmonized. Some stylistic improvements.
+
+2003-03-07 Friday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.82), pl_check.pl
+ (1.44): Added documentation and tests for the new Prolog
+ interface predicates ppl_Polyhedron_generalized_affine_image/5
+ and ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: append1.cc (1.20), permute.cc (1.27), shuffledim1.cc
+ (1.9): Return 1 on failure.
+
+2003-03-06 Thursday 21:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.70): Avoid using `//' comments, since
+ they are not in C89. Let the multiple inclusion guard be
+ external to everything.
+
+2003-03-06 Thursday 21:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.89), Ciao/ppl_ciao.pl
+ (1.36), GNU/ppl_gprolog.pl (1.26), SICStus/ppl_sicstus_sd.cc
+ (1.40), SWI/ppl_swiprolog.cc (1.64), XSB/ppl_xsb.H (1.14),
+ XSB/ppl_xsb.cc (1.24), YAP/ppl_yap.cc (1.58): New predicates
+ ppl_Polyhedron_generalized_affine_image/5 and
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 15:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/version.hh.in (1.4): Specify that the beta number is zero for
+ official releases and nonzero for development snapshots.
+
+2003-03-06 Thursday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.81): Improved
+ discussion about *_and_minimize predicates.
+
+2003-03-06 Thursday 11:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/version.hh.in (1.3): Small correction of module heading.
+
+2003-03-06 Thursday 11:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.109), doc/fdl.dox (1.3), doc/gpl.dox
+ (1.4), interfaces/C/ppl_c.h (1.69),
+ interfaces/Prolog/Prolog_interface.dox (1.80): Let the licence
+ pages and the documentation of foreign language interfaces be
+ grouped into ``modules'', so as to avoid spreading information in
+ too many places of the user manual. We no longer have a ``PPL
+ pages'' index.
+
+2003-03-06 Thursday 09:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.43): Updated the predicate
+ testing the PPL watchdog predicates to use ppl_Polyhedron_swap/2.
+
+2003-03-06 Thursday 09:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.79), pl_check.pl
+ (1.42): Added the ppl_Polyhedron_time_elapse_assign/2 to the
+ Prolog documentation and to the tests in pl_check.pl.
+
+2003-03-05 Wednesday 23:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/version.hh.in (1.2): Library defines with version info put
+ inside a \defgroup block to have them appear in the user
+ documentation.
+
+2003-03-05 Wednesday 18:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: append1.cc (1.19), append2.cc (1.20), concatenate1.cc
+ (1.6), permute.cc (1.26): Do not use the obsolete
+ operator>>(const Constraint&, unsigned int).
+
+2003-03-05 Wednesday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.88), Ciao/ppl_ciao.pl
+ (1.35), GNU/ppl_gprolog.pl (1.25), SICStus/ppl_sicstus_sd.cc
+ (1.39), SWI/ppl_swiprolog.cc (1.63), XSB/ppl_xsb.H (1.13),
+ XSB/ppl_xsb.cc (1.23), YAP/ppl_yap.cc (1.57): New predicate
+ ppl_Polyhedron_time_elapse_assign/2.
+
+2003-03-05 Wednesday 17:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.64), tests/shuffledim1.cc (1.8):
+ Corrected implementation of shuffle_dimensions() and the known
+ result in the last test of shuffledim1.
+
+2003-03-05 Wednesday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.317): Avoid useless abbreviations.
+
+2003-03-05 Wednesday 15:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.41): Call to polydiff_assign_min
+ removed from check_all.
+
+2003-03-05 Wednesday 15:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.78), pl_check.pl
+ (1.40): Added ppl_Polyhedron_swap/2. Shuffle_Map syntax added
+ and ppl_Polyhedron_shuffle_dimensions/2 documentation header
+ added.
+
+2003-03-05 Wednesday 14:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.65), interfaces/C/ppl_c.cc (1.65), interfaces/C/ppl_c.h
+ (1.68), interfaces/Prolog/Prolog_interface.dox (1.77),
+ interfaces/Prolog/pl_check.pl (1.39),
+ interfaces/Prolog/ppl_prolog.icc (1.87),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.34),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.24),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.38),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.62),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.12),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.22),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.56), src/Polyhedron.cc
+ (1.316), src/Polyhedron.defs.hh (1.195), tests/polydifference6.cc
+ (1.4): The method
+ Polyhedron::poly_difference_assign_and_minimize(const
+ Polyhedron&) has been removed.
+
+2003-03-05 Wednesday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.86), Ciao/ppl_ciao.pl
+ (1.33), GNU/ppl_gprolog.pl (1.23), SICStus/ppl_sicstus_sd.cc
+ (1.37), SWI/ppl_swiprolog.cc (1.61), XSB/ppl_xsb.H (1.11),
+ XSB/ppl_xsb.cc (1.21), YAP/ppl_yap.cc (1.55): New predicate
+ ppl_Polyhedron_swap/2.
+
+2003-03-05 Wednesday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.315), Polyhedron.defs.hh (1.194): The
+ (dis-)equality boolean functions operator== and operator!= on
+ objects of the class Polyhedron no longer require topological-
+ and dimension-consistency. Inconsistent objects are not
+ equivalent.
+
+2003-03-05 Wednesday 14:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.64), configure.ac (1.89), src/Makefile.am (1.60),
+ src/version.cc (1.1), src/version.hh.in (1.1): New macros
+ PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION, and
+ PPL_VERSION_BETA allow the client application to adapt to
+ different versions of the library.
+
+ New function const char* version() returns a character string
+ containing the PPL version.
+
+ New function const char* banner() returns a character string
+ containing information about the PPL version, the licensing, the
+ lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+
+2003-03-05 Wednesday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.63): News item concerning the new
+ Polyhedron::generalized_affine_image() operators revised.
+
+2003-03-05 Wednesday 10:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/shuffledim1.cc (1.7): Added a test showing a bug in
+ Polyhedron::shuffle_dimensions().
+
+2003-03-05 Wednesday 10:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.62): Improved the synthetic description of methods
+ generalized_affine_image().
+
+2003-03-04 Tuesday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.88): Require GMP version 4.1.2 or following.
+
+2003-03-04 Tuesday 18:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.61): The C and Prolog interfaces have been extended so as
+ to make more of the library's functionality available to Prolog
+ and C users.
+
+2003-03-04 Tuesday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.67): Comments fixed.
+
+2003-03-04 Tuesday 18:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.64), ppl_c.h (1.66): New functions
+ ppl_ConSys_clear() and ppl_GenSys_clear().
+
+2003-03-04 Tuesday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.85): Predicate
+ ppl_Polyhedron_shuffle_dimensions(Ph, PFun) now fails if the
+ domain of PFun is not contained in the space dimension of Ph.
+
+2003-03-04 Tuesday 17:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.60): Added the new Polyhedron::generalized_affine_image()
+ method.
+
+2003-03-04 Tuesday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.59), src/Constraint.cc (1.37), src/Constraint.defs.hh
+ (1.81): The operator Constraint operator>>(const Constraint&,
+ dimension_type) has been removed.
+
+2003-03-04 Tuesday 15:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.108), src/Polyhedron.defs.hh (1.193):
+ Reordered the sections in the final part of definitions.dox;
+ added a section on extrapolation operators, describing the
+ limited and bounded extrapolation operators. Corrected
+ capitalization of a doxygen reference.
+
+2003-03-04 Tuesday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.63), ppl_c.h (1.65): New functions
+ ppl_Polyhedron_generalized_affine_image() and
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs().
+
+2003-03-04 Tuesday 08:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.38): Bug corrected.
+
+2003-03-04 Tuesday 08:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.37): Improved tests for widenig
+ operators. Added tests for ...shuffle_dimensions.
+
+2003-03-04 Tuesday 06:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.17): We require GMP at least 4.1.2.
+
+2003-03-03 Monday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.64): For some reason, GMP up to and
+ including version 4.1.2 requires <stdio.h> to be included before
+ <gmp.h>.
+
+2003-03-03 Monday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.62), ppl_c.h (1.63): The `var'
+ argument of ppl_Constraint_coefficient() and
+ ppl_Generator_coefficient() is of type ppl_dimension_type.
+
+2003-03-03 Monday 21:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.62): FIXME added.
+
+2003-03-03 Monday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.61): Do not worry about versions of GMP
+ prior to 4.1.2 since they are not supported anyway.
+
+2003-03-03 Monday 21:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.61), ppl_c.h (1.60): New function
+ ppl_Polyhedron_time_elapse_assign().
+
+2003-03-03 Monday 21:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.60), ppl_c.h (1.59): Added
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign() and
+ ppl_Polyhedron_bounded_H79_extrapolation_assign(). Comments of
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+ ppl_Polyhedron_limited_H79_extrapolation_assign() fixed.
+
+2003-03-03 Monday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.4), install-sh (1.4), Watchdog/depcomp (1.2),
+ Watchdog/install-sh (1.2): Updated.
+
+2003-03-03 Monday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.87), Watchdog/configure.ac (1.16): Require
+ Autoconf 2.57 or following and Automake 1.7.3 or following.
+
+2003-03-03 Monday 20:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.27), PowerSet.inlines.hh (1.31): The
+ method PowerSet<CS>::limited_H79_extrapolation_assign() takes a
+ constant constraint system.
+
+2003-03-03 Monday 19:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.59), ppl_c.h (1.58):
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+ ppl_Polyhedron_limited_H79_extrapolation_assign() take a constant
+ constraint system.
+
+2003-03-03 Monday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.12), Watchdog/COPYING (1.2), Watchdog/ChangeLog
+ (1.3), Watchdog/INSTALL (1.2), Watchdog/NEWS (1.2),
+ Watchdog/config.guess (1.2), Watchdog/config.sub (1.2),
+ Watchdog/ltmain.sh (1.2): Updated.
+
+2003-03-03 Monday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.7): Update version info.
+
+2003-03-03 Monday 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.13), src/Makefile.am (1.59): AGE must
+ be reset to 0 since we removed some interfaces.
+
+2003-03-03 Monday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.30), exceptions2.cc (1.24): Refer the
+ new extrapolation operators.
+
+2003-03-03 Monday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.58), interfaces/C/ppl_c.cc (1.58), interfaces/C/ppl_c.h
+ (1.57), interfaces/Prolog/Prolog_interface.dox (1.76),
+ interfaces/Prolog/pl_check.pl (1.36),
+ interfaces/Prolog/ppl_prolog.icc (1.84),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.32),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.22),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.36),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.60),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.10),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.20),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.54), src/Determinate.defs.hh
+ (1.27), src/Determinate.inlines.hh (1.25), src/Polyhedron.cc
+ (1.314), src/Polyhedron.defs.hh (1.192), src/PowerSet.defs.hh
+ (1.26), src/PowerSet.inlines.hh (1.30), src/algorithms.hh (1.14),
+ tests/Makefile.am (1.173), tests/limitedbhrz03extrapolation1.cc
+ (1.1), tests/limitedbhrz03widening1.cc (1.5),
+ tests/limitedh79extrapolation1.cc (1.1),
+ tests/limitedh79extrapolation2.cc (1.1),
+ tests/limitedh79extrapolation3.cc (1.1),
+ tests/limitedh79extrapolation4.cc (1.1),
+ tests/limitedh79widening1.cc (1.6), tests/limitedh79widening2.cc
+ (1.7), tests/limitedh79widening3.cc (1.4),
+ tests/limitedh79widening4.cc (1.4): From now on, the name
+ `widening' is reserved for operators that come with a convergence
+ guarantee (i.e., with the ability of turning infinite chains to
+ finite ones). Upper bound operators without such a guarantee
+ contain the word `extrapolation' in their name.
+
+2003-03-03 Monday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.57): Confine implementation classes into
+ anonymous namespaces.
+
+2003-03-03 Monday 16:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.57): News item for Polyhedron::shrink_bounding_box()
+ completed.
+
+2003-03-03 Monday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.56): News item concerning
+ Polyhedron::shuffle_dimensions() completed.
+
+2003-03-03 Monday 16:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.56), ppl_c.h (1.56): New function int
+ ppl_Polyhedron_shuffle_dimensions().
+
+2003-03-03 Monday 15:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.191): Another reorganization for better
+ documentation.
+
+2003-03-03 Monday 14:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.190): Let all the methods
+ <method>_and_minimize be declared after the corresponding methods
+ <method>, so that a less disordered documentation is produced.
+
+2003-03-03 Monday 12:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.313), Polyhedron.defs.hh (1.189): Now the
+ constraint system parameter of methods bounded_*_widening_assign
+ and limited_*_widening_assign is a const parameter.
+
+2003-03-03 Monday 11:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.55), ppl_c.h (1.55): New function int
+ ppl_not_a_dimension(ppl_dimension_type*).
+
+2003-03-03 Monday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.83), Ciao/ppl_ciao.pl
+ (1.31), GNU/ppl_gprolog.pl (1.21), SICStus/ppl_sicstus_sd.cc
+ (1.35), SWI/ppl_swiprolog.cc (1.59), XSB/ppl_xsb.H (1.9),
+ XSB/ppl_xsb.cc (1.19), YAP/ppl_yap.cc (1.53): New predicate
+ ppl_Polyhedron_shuffle_dimensions/2.
+
+2003-03-03 Monday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.55), src/globals.hh (1.31): New function dimension_type
+ not_a_dimension(): returns a value that does not designate a
+ valid dimension.
+
+2003-03-03 Monday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.35): We must explain to the users of CVS versions how to
+ build the documentation.
+
+2003-03-02 Sunday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.34): Make sure all the functionalities are available in
+ all interfaces.
+
+2003-03-02 Sunday 20:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.33), src/Polyhedron.defs.hh (1.188),
+ src/Polyhedron.inlines.hh (1.63): Documentation of
+ Polyhedron::shuffle_dimensions() improved.
+
+2003-03-02 Sunday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.32): More things that should not be forgotten.
+
+2003-03-02 Sunday 19:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.54): News items added, others improved, reorganized.
+
+2003-03-02 Sunday 19:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.11): Updated.
+
+2003-03-01 Saturday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.312): Full stop added.
+
+2003-03-01 Saturday 07:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sicstus_cfli.ic (1.5): Include
+ assert.h.
+
+2003-03-01 Saturday 07:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.34): Includes
+ reordered.
+
+2003-03-01 Saturday 07:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.86): Enable shared the libraries by default.
+
+2003-03-01 Saturday 07:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.17), config.sub (1.16), ltmain.sh (1.11):
+ Updated.
+
+2003-02-24 Monday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in (1.25),
+ doc/devref-print.doxyconf-latex.in (1.25),
+ doc/devref.doxyconf-html.in (1.26), src/Init.cc (1.8),
+ src/Makefile.am (1.58), src/Polyhedron.cc (1.311),
+ src/Statistics.hh (1.2), src/statistics.hh (1.1): Statistics.hh
+ improved, added to the documentation for developers, and renamed
+ statistics.hh.
+
+2003-02-24 Monday 16:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Init.cc (1.7), Makefile.am (1.57), Polyhedron.cc (1.310),
+ Statistics.hh (1.1), globals.cc (1.12), globals.hh (1.30):
+ Removed from globals.hh and globals.cc all the stuff related to
+ statistics and placed into Statistics.hh; modified Polyhedron.cc
+ and Init.cc accordingly.
+
+2003-02-23 Sunday 21:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bhrz03widening2.cc (1.4), limitedbhrz03widening1.cc
+ (1.4): Restored expected result after correction on evolving
+ points technique.
+
+2003-02-23 Sunday 20:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.309), tests/Makefile.am (1.172),
+ tests/bhrz03widening3.cc (1.4): Improved is_BHRZ03_stabilizing to
+ always avoid considering the low-level constraints when comparing
+ the number of constraints. As a consequence, changed back the
+ known result of test bhrz03widening3.
+
+2003-02-23 Sunday 16:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.31): Remember to comment uncommented classes.
+
+2003-02-23 Sunday 09:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.10), user.tex (1.11): Thank the CoVer
+ project.
+
+2003-02-22 Saturday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.44): Two FIXMEs dealt with and removed.
+
+2003-02-22 Saturday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.inlines.hh (1.37), SatRow.inlines.hh (1.24): Redundant
+ comment removed.
+
+2003-02-22 Saturday 21:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.inlines.hh (1.36), SatRow.inlines.hh (1.23): FIXMEs
+ related to Doxygen's bugs removed.
+
+2003-02-22 Saturday 21:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.defs.hh (1.61): FIXME dealt with and removed.
+
+2003-02-22 Saturday 21:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.171), bhrz03widening2.cc (1.3),
+ bhrz03widening3.cc (1.3), limitedbhrz03widening1.cc (1.3):
+ Expected results adjusted.
+
+2003-02-22 Saturday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.308): Commit to
+ BHRZ03_EP_DELAY_INTERSECTION.
+
+2003-02-22 Saturday 09:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PowerSet.defs.hh (1.25): Fixed a parameter name mismatch in
+ the documentation.
+
+2003-02-21 Friday 19:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.80): Doxygen documentation fix: "<" and
+ ">" should not be escaped by "\" when occurring inside a \code
+ ... \endcode section.
+
+2003-02-21 Friday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.107): Bibliography and bibliographic
+ references improved.
+
+2003-02-21 Friday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/bib2html2.sed (1.3): Provide text for the \ref link commands.
+
+2003-02-21 Friday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: bib2dox (1.3), bib2html2.sed (1.2): Produce
+ cross-references that work well with any Doxygen output.
+
+2003-02-21 Friday 16:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.106), src/Polyhedron.defs.hh (1.187): In
+ the documentation, added explanation for the BHRZ03 widening and
+ the widening with tokens technique. Broken <a name=...> links
+ replaced by \ref and \anchor.
+
+2003-02-21 Friday 11:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.10): Updated.
+
+2003-02-21 Friday 11:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.85): Version number bumped.
+
+2003-02-21 Friday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.307), Polyhedron.defs.hh (1.186): The
+ widening-with-tokens delay technique is now also available for
+ the standard widening as well as the ``limited'' and ``bounded''
+ variants.
+
+2003-02-21 Friday 09:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * TODO (1.30): Items dealt with removed.
+
+2003-02-21 Friday 09:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.75), pl_check.pl
+ (1.35): Prolog_interface.dox: Added simple descriptions for the
+ timeout predicates. Atom added to the syntax of the language
+ specification. pl_check.pl Several small improvements.
+
+2003-02-21 Friday 08:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.306), Polyhedron.defs.hh (1.185): In
+ Polyhedron::BHRZ03_widening_assign(), pass the number of tokens
+ as `unsigned', not `long'.
+
+2003-02-20 Thursday 16:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Init.cc (1.6), Polyhedron.cc (1.305), Polyhedron.defs.hh
+ (1.184), globals.hh (1.29): The averaging_constraints technique
+ is now called combining_constraints. Added optional pointer
+ argument to BHRZ03_widening_assign to implement the
+ ``widening-with-tokens'' technique.
+
+2003-02-19 Wednesday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/track_allocation.hh (1.12): Declaration fixed.
+
+2003-02-16 Sunday 14:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.9): Updated.
+
+2003-02-16 Sunday 14:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: bhrz03widening15.cc (1.4), bhrz03widening6.cc (1.3),
+ bhrz03widening7.cc (1.3): Expected results fixed.
+
+2003-02-11 Tuesday 11:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.304): Commit to
+ BHRZ03_AC_CHECKS_H79_BOUNDARY=1.
+
+2003-02-11 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.303): Commit to BHRZ03_AC_IS_SUM=1.
+
+2003-02-11 Tuesday 11:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.302): Commit to BHRZ03_ER_CWQ=1.
+
+2003-02-09 Sunday 18:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.301): New candidate techniques for the
+ implementation of BRHZ03.
+
+2003-02-07 Friday 20:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.300): Let an assertion in
+ select_H79_constraints be satisfied.
+
+2003-02-07 Friday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.299): Unreachable statements removed.
+
+2003-02-07 Friday 17:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.62): Make sure inline functions are
+ defined before being used.
+
+2003-02-07 Friday 11:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.298): Added new preproc flag BHRZ03_EP_P1_P2
+ to be experimented with.
+
+2003-02-07 Friday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.10): Throw std::runtime_error instead of
+ calling abort().
+
+2003-02-07 Friday 10:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.inlines.hh (1.9): Throw std::invalid_argument
+ if a Watchdog constructor is called with a non-positive number of
+ time units.
+
+2003-02-06 Thursday 18:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.297): Added preprocessing flag
+ BHRZ03_EP_DELAY_INTERSECTION, enabling a different implementation
+ of the evolving points technique to be experimented with.
+
+2003-02-06 Thursday 10:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.296): Make BHRZ03_AC_IS_SUM and
+ BHRZ03_AC_CHECKS_H79_BOUNDARY default to 1.
+
+2003-02-05 Wednesday 16:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.295), tests/limitedh79widening2.cc (1.6):
+ Corrected the implementation of limited_H79_widening_assign to
+ match its specification; the same for
+ limited_BHRZ03_widening_assign. Corrected the known result of
+ test limitedh79widening2, which was computed according to a
+ flawed specification.
+
+2003-02-05 Wednesday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.294): Both BHRZ03_AC_IS_SUM and
+ BHRZ03_AC_CHECKS_H79_BOUNDARY default to 0.
+
+2003-02-05 Wednesday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.293), Polyhedron.defs.hh (1.183): A first,
+ totally untested implementation of
+ Polyhedron::bounded_H79_widening_assign() and
+ Polyhedron::bounded_BHRZ03_widening_assign().
+
+2003-02-05 Wednesday 11:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.182): Improved the Doxygen comments for
+ the two limited widening operators.
+
+2003-02-05 Wednesday 10:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.181): Give more guarantees to the user
+ of Polyhedron::shrink_bounding_box().
+
+2003-02-05 Wednesday 10:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.292): Added preprocessing flags to control
+ whether or not, in the technique BHRZ03_averaging_constraints, we
+ actually compute averages or just sum the constraints and whether
+ the selected point can lie on the boundary of H79.
+
+2003-02-04 Tuesday 21:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.16), config.sub (1.15): Updated.
+
+2003-02-04 Tuesday 20:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.291): Spurious newline removed.
+
+2003-02-04 Tuesday 19:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.290): Avoiding equality check in
+ is_BHRZ03_stabilizing, which is called more than once, and
+ computing it just once inside BHRZ03_widening_assign.
+
+2003-02-04 Tuesday 11:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.289): Corrected a bug in
+ H79_widening_assign, whereby we were relying on the number of
+ columns of a constraint system that was not up-to-date.
+
+2003-02-04 Tuesday 09:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.288), Polyhedron.inlines.hh (1.61): When
+ declaring constraints (generators) no longer up-to-date, also
+ clearing the pending constraints (generators) flag. In
+ H79_widening_assign, avoiding the creation of polyhedra having
+ the wrong dimension.
+
+2003-02-03 Monday 15:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.287), Polyhedron.defs.hh (1.180): The
+ quick equivalence check is now a provate method of Polyhedron and
+ it is called also by the inclusion test operator<=. Improved the
+ computation of the H79widening operator by resorting to CH78 when
+ polyhedra x and y have the same dimension.
+
+2003-02-01 Saturday 15:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.286): Commented out conditionals removed.
+
+2003-02-01 Saturday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.51): Old garbage removed.
+
+2003-01-31 Friday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.50): Fixed a very serious performance bug in
+ Matrix::add_pending_rows() whereby adding one row to a matrix
+ with `n' rows had complexity O(n) instead of amortized constant.
+
+2003-01-27 Monday 13:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: expected (1.6), expected2 (1.7): Adapted
+ to the new normal form.
+
+2003-01-27 Monday 11:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * configure.ac (1.84), interfaces/Prolog/expected (1.5),
+ interfaces/Prolog/expected2 (1.9), src/Row.cc (1.49),
+ src/Row.defs.hh (1.60): Modified strong normalization of rows, so
+ that the first *homogeneous* coefficient is required to be
+ positive.
+
+2003-01-27 Monday 10:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.285): Removed no longer used preprocessing
+ flag.
+
+2003-01-27 Monday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.49), Matrix.defs.hh (1.42): Added private
+ method Matrix::gram_shmidt() to orthogonalize a matrix so that
+ its rays/points/inequalities have a unique representation.
+
+2003-01-27 Monday 10:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: conversion.cc (1.43), minimize.cc (1.31), simplify.cc
+ (1.25): Adjusted a few comments that became outdated after the
+ merge with the lazy branch. Removed a couple of FIXME's.
+
+2003-01-26 Sunday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.cc (1.9): Ported to Cygwin (it only supports
+ ITIMER_REAL). Robustness increased. Throw std:runtime_error
+ exceptions instead of calling exit().
+
+2003-01-24 Friday 18:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.77), GenSys.defs.hh (1.89), Polyhedron.cc
+ (1.284), Polyhedron.defs.hh (1.179), Polyhedron.inlines.hh
+ (1.60): Equality test between polyhedra improved to first perform
+ a few fast-fail checks, including a complete test for
+ representations in normal form.
+
+2003-01-24 Friday 10:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.283), Polyhedron.defs.hh (1.178): Added
+ private method void select_CH78_constraints(const Polyhedron& y,
+ ConSys& cs) const; performing a constraint selection from
+ y.con_sys according to the definition of the widening as reported
+ in Cousot&Halbwachs78.
+
+2003-01-24 Friday 10:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.79), GenSys.cc (1.75), GenSys.defs.hh
+ (1.88): Added private method bool
+ GenSys::satisfied_by_all_generators(const Constraint& c) const.
+
+2003-01-21 Tuesday 11:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.34): Test for time out
+ predicates improved.
+
+2003-01-21 Tuesday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.82): Make sure that the
+ timeout is reset when caught.
+
+2003-01-21 Tuesday 09:00 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.74), pl_check.pl
+ (1.33), ppl_prolog.icc (1.81): Restored deleted text.
+
+2003-01-20 Monday 15:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/expected (1.4), interfaces/Prolog/expected2
+ (1.8), interfaces/Prolog/XSB/expected (1.5),
+ interfaces/Prolog/XSB/expected2 (1.6), tests/bhrz03widening15.cc
+ (1.3), tests/bhrz03widening9.cc (1.4): Applying some semantically
+ preserving syntactic changes to the expected results in order to
+ match what is obtained after modification to methods
+ Matrix::gauss() and Matrix::back_substitute(). The changes are
+ also semantic for the known results of bhrz03widening9/15.
+
+2003-01-20 Monday 09:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.282), Polyhedron.defs.hh (1.177):
+ Rewritten methods related to the computation of the BHRZ03
+ widening, which are no longer static and now take the polyhedron
+ corresponding to the H79 widening as a parameter.
+
+2003-01-20 Monday 09:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.48), Row.cc (1.48), Row.defs.hh (1.59),
+ minimize.cc (1.30), simplify.cc (1.24): Strong normalization of
+ Row objects now enforce the first non-zero coefficient to be
+ positive. When creating a matrix having n copies of the same
+ row, the matrix is now declared to be sorted (since sortedness by
+ itself does not implies that it has no duplicates); this also
+ includes the case of empty matrices. Some improvements in
+ methods Matrix::gauss() and Matrix::back_substitute().
+
+2003-01-18 Saturday 16:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.36), Constraint.inlines.hh (1.43),
+ Generator.cc (1.44), Matrix.cc (1.47), Polyhedron.cc (1.281),
+ minimize.cc (1.29), simplify.cc (1.23): Implemented changes
+ required to make the library compile cleanly and pass `make
+ check' when the flag EXTRA_NORMALIZATION is set to 1 (the default
+ being still 0).
+
+2003-01-18 Saturday 12:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.170): The `libppl_tests.a' library should
+ not be built until the `make check' command is run.
+
+2003-01-18 Saturday 11:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.280): Corrected a bug in
+ poly_hull_assign_and_minimize().
+
+2003-01-15 Wednesday 14:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README (1.14), doc/devref-browse.doxyconf-latex.in (1.24),
+ doc/devref-print.doxyconf-latex.in (1.24),
+ doc/devref.doxyconf-html.in (1.25), src/Init.inlines.hh (1.8): No
+ longer using file Init.inlines.hh.
+
+2003-01-15 Wednesday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.279): After applying each of the techniques
+ of the BHRZ03 widening, check whether we have obtained a
+ polyhedron strictly smaller than that one obtainable using the
+ H79 widening.
+
+2003-01-15 Wednesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Init.cc (1.5), Init.defs.hh (1.9), Makefile.am (1.56):
+ Initialization and finalization of the library are no longer
+ inlined.
+
+2003-01-13 Monday 23:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.278): Many improvements in the code and
+ comments of method averaging_constraints().
+
+2003-01-12 Sunday 23:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.59): Try to avoid minimization in
+ method check_empty().
+
+2003-01-12 Sunday 23:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.277): In add_generators_and_minimize(), an
+ odd use of method check_empty() replaced by correct use of method
+ minimize().
+
+2003-01-12 Sunday 23:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.defs.hh (1.41): Fixed documentation of method
+ index_first_pending().
+
+2003-01-12 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.169), bug1.cc (1.4), bug1.dat (1.3):
+ Obsolete bug witness removed.
+
+2003-01-12 Sunday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.168): No longer lie to automake.
+
+2003-01-12 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Watchdog.defs.hh (1.11): Spurious, illegal qualification
+ removed.
+
+2003-01-12 Sunday 00:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.276): In check_universe(), try to avoid
+ minimization as much as possible.
+
+2003-01-11 Saturday 22:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.275): Got rid of preprocessing flag
+ NEW_LIMITED_GROWTH_ORDERING: now always using the new lgo in
+ is_BHRZ03_stabilizing(). Added preprocessing flag
+ EVOLVING_RAYS_SATURATORS for testing purposes on the evolving
+ rays technique of BHRZ03_widening_assign(). Some improvements in
+ the variable names and comments of the evolving rays technique.
+ No longer testing for stabilization after applying H79 (unless
+ assertions are turned on).
+
+2003-01-10 Friday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.15), config.sub (1.14): Updated.
+
+2003-01-10 Friday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.80): Paranoid robustness
+ improvements.
+
+2003-01-10 Friday 09:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.79): Avoid leaking memory on
+ exit and in the case of multiple calls to ppl_set_timeout/1 not
+ intermixed to calls to ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.53), interfaces/Prolog/ppl_prolog.icc (1.78),
+ interfaces/Prolog/Ciao/Makefile.am (1.15),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.30),
+ interfaces/Prolog/GNU/Makefile.am (1.26),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.20),
+ interfaces/Prolog/SICStus/Makefile.am (1.35),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.33),
+ interfaces/Prolog/SWI/Makefile.am (1.27),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.58),
+ interfaces/Prolog/XSB/Makefile.am (1.13),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.8),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.18),
+ interfaces/Prolog/YAP/Makefile.am (1.17),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.52), src/Init.cc (1.4):
+ Timeout computation facilities have been added to the Prolog
+ interfaces: new predicates ppl_set_timeout_exception_atom/1,
+ ppl_timeout_exception_atom/1, ppl_set_timeout/1,
+ ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.29): More urgent things to do.
+
+2003-01-10 Friday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/watchdog1.cc (1.16): Do not explicitly initialize the Parma
+ Watchdog Library.
+
+2003-01-10 Friday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.cc (1.8), Watchdog.defs.hh (1.10),
+ Watchdog.inlines.hh (1.8), Watchdog.types.hh (1.4): New "nifty
+ counter" implementation of library's initialization and
+ finalization. Explicit initialization and finalization is no
+ longer necessary nor possible.
+
+2003-01-10 Friday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: expected (1.4), expected2 (1.5): Update
+ copyright years.
+
+2003-01-09 Thursday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.83), Watchdog/configure.ac (1.15): Building the
+ Parma Watchdog Library is now enabled by default.
+
+2003-01-09 Thursday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.77): Added a new class
+ `timeout_exception'.
+
+2003-01-07 Tuesday 16:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.73), pl_check.pl
+ (1.32): A typo in the Prolog_interface,dox corrected and
+ ppl_Polyhedron_is_disjoint_from_Polyhedron/2 documentation added.
+ Many improvements to pl_check.pl and some bugs fixed.
+
+2003-01-07 Tuesday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.82): Bump version number.
+
+2003-01-07 Tuesday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: expected (1.3), expected2 (1.4): Update
+ copyright years.
+
+2003-01-07 Tuesday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.52), configure.ac (1.81): We now require GMP 4.1.2 or
+ higher.
+
+2003-01-07 Tuesday 15:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.5): Typo corrected.
+
+2003-01-07 Tuesday 15:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * CREDITS (1.4), doc/devref.tex (1.9), doc/user.tex (1.10): The
+ MURST project COFIN01 credited.
+
+2003-01-07 Tuesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.12), Interval.inlines.hh (1.8): Old
+ kludges removed.
+
+2003-01-07 Tuesday 12:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/bhrz03widening9.cc (1.3): Updated the known result to match
+ the output according to the new limited growth ordering
+ convergence criterion.
+
+2003-01-07 Tuesday 12:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.hh (1.28): Do not output statistics by default.
+
+2003-01-01 Wednesday 02:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.21), README (1.13), configure.ac (1.80),
+ Watchdog/Makefile.am (1.6), Watchdog/README (1.4),
+ Watchdog/Watchdog.cc (1.7), Watchdog/Watchdog.defs.hh (1.9),
+ Watchdog/Watchdog.inlines.hh (1.7), Watchdog/Watchdog.types.hh
+ (1.3), Watchdog/configure.ac (1.14), Watchdog/pwl_header.top
+ (1.3), doc/Makefile.am (1.22), doc/definitions.dox (1.105),
+ doc/devref.tex (1.8), doc/user.tex (1.9), interfaces/Makefile.am
+ (1.6), interfaces/C/Makefile.am (1.12), interfaces/C/ppl_c.cc
+ (1.54), interfaces/C/ppl_c.h (1.54),
+ interfaces/Prolog/Makefile.am (1.21),
+ interfaces/Prolog/Prolog_interface.dox (1.72),
+ interfaces/Prolog/clpq.pl (1.14), interfaces/Prolog/clpq2.pl
+ (1.25), interfaces/Prolog/exceptions.hh (1.7),
+ interfaces/Prolog/expected (1.3), interfaces/Prolog/expected2
+ (1.7), interfaces/Prolog/pl_check.pl (1.31),
+ interfaces/Prolog/ppl_prolog.icc (1.76),
+ interfaces/Prolog/track_allocation.hh (1.11),
+ interfaces/Prolog/Ciao/Makefile.am (1.14),
+ interfaces/Prolog/Ciao/ciao_clpq.pl (1.4),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.17),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.29),
+ interfaces/Prolog/GNU/Makefile.am (1.25),
+ interfaces/Prolog/GNU/gp_clpq.pl (1.6),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.19),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.12),
+ interfaces/Prolog/SICStus/Makefile.am (1.34),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.22),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.32),
+ interfaces/Prolog/SICStus/sicstus_cfli.cc (1.2),
+ interfaces/Prolog/SICStus/sicstus_cfli.h (1.3),
+ interfaces/Prolog/SICStus/sicstus_cfli.ic (1.4),
+ interfaces/Prolog/SICStus/sp_clpq.pl (1.8),
+ interfaces/Prolog/SWI/Makefile.am (1.26),
+ interfaces/Prolog/SWI/pl_clpq.cc (1.6),
+ interfaces/Prolog/SWI/pl_clpq.pl (1.4),
+ interfaces/Prolog/SWI/ppl_pl.cc (1.6),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.57),
+ interfaces/Prolog/SWI/ppl_swiprolog.pl (1.2),
+ interfaces/Prolog/XSB/Makefile.am (1.12),
+ interfaces/Prolog/XSB/expected (1.2),
+ interfaces/Prolog/XSB/expected2 (1.3),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.17),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.6),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.4),
+ interfaces/Prolog/YAP/Makefile.am (1.16),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.51),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.6),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.6),
+ interfaces/Prolog/YAP/yap_clpq2.pl (1.2), m4/Makefile.am (1.8),
+ m4/ac_check_gmp.m4 (1.11), m4/ac_cxx_flexible_arrays.m4 (1.5),
+ src/AskTell.defs.hh (1.11), src/AskTell.inlines.hh (1.11),
+ src/AskTell.types.hh (1.4), src/BoundingBox.cc (1.5),
+ src/BoundingBox.defs.hh (1.9), src/BoundingBox.inlines.hh (1.7),
+ src/BoundingBox.types.hh (1.5), src/C_Polyhedron.cc (1.4),
+ src/C_Polyhedron.defs.hh (1.19), src/C_Polyhedron.inlines.hh
+ (1.13), src/C_Polyhedron.types.hh (1.6), src/ConSys.cc (1.57),
+ src/ConSys.defs.hh (1.76), src/ConSys.inlines.hh (1.29),
+ src/ConSys.types.hh (1.6), src/Constraint.cc (1.35),
+ src/Constraint.defs.hh (1.78), src/Constraint.inlines.hh (1.42),
+ src/Constraint.types.hh (1.6), src/Determinate.defs.hh (1.26),
+ src/Determinate.inlines.hh (1.24), src/Determinate.types.hh
+ (1.4), src/GenSys.cc (1.74), src/GenSys.defs.hh (1.87),
+ src/GenSys.inlines.hh (1.30), src/GenSys.types.hh (1.6),
+ src/Generator.cc (1.43), src/Generator.defs.hh (1.81),
+ src/Generator.inlines.hh (1.39), src/Generator.types.hh (1.6),
+ src/Init.cc (1.3), src/Init.defs.hh (1.8), src/Init.inlines.hh
+ (1.7), src/Init.types.hh (1.5), src/Integer.cc (1.3),
+ src/Integer.defs.hh (1.10), src/Integer.inlines.hh (1.9),
+ src/Integer.types.hh (1.7), src/Interval.cc (1.6),
+ src/Interval.defs.hh (1.11), src/Interval.inlines.hh (1.7),
+ src/Interval.types.hh (1.5), src/LCompare.defs.hh (1.5),
+ src/LCompare.inlines.hh (1.4), src/LCompare.types.hh (1.4),
+ src/LinExpression.cc (1.16), src/LinExpression.defs.hh (1.57),
+ src/LinExpression.inlines.hh (1.26), src/LinExpression.types.hh
+ (1.6), src/Makefile.am (1.55), src/Matrix.cc (1.46),
+ src/Matrix.defs.hh (1.40), src/Matrix.inlines.hh (1.29),
+ src/Matrix.types.hh (1.6), src/NNC_Polyhedron.cc (1.10),
+ src/NNC_Polyhedron.defs.hh (1.21), src/NNC_Polyhedron.inlines.hh
+ (1.15), src/NNC_Polyhedron.types.hh (1.6),
+ src/Poly_Con_Relation.cc (1.7), src/Poly_Con_Relation.defs.hh
+ (1.19), src/Poly_Con_Relation.inlines.hh (1.9),
+ src/Poly_Con_Relation.types.hh (1.5), src/Poly_Gen_Relation.cc
+ (1.7), src/Poly_Gen_Relation.defs.hh (1.18),
+ src/Poly_Gen_Relation.inlines.hh (1.9),
+ src/Poly_Gen_Relation.types.hh (1.5), src/Polyhedron.cc (1.274),
+ src/Polyhedron.defs.hh (1.176), src/Polyhedron.inlines.hh (1.58),
+ src/Polyhedron.types.hh (1.8), src/PowerSet.defs.hh (1.24),
+ src/PowerSet.inlines.hh (1.29), src/PowerSet.types.hh (1.4),
+ src/Row.cc (1.47), src/Row.defs.hh (1.58), src/Row.inlines.hh
+ (1.35), src/Row.types.hh (1.6), src/SatMatrix.cc (1.25),
+ src/SatMatrix.defs.hh (1.29), src/SatMatrix.inlines.hh (1.18),
+ src/SatMatrix.types.hh (1.6), src/SatRow.cc (1.17),
+ src/SatRow.defs.hh (1.25), src/SatRow.inlines.hh (1.22),
+ src/SatRow.types.hh (1.6), src/Status.cc (1.19),
+ src/Status.defs.hh (1.25), src/Status.inlines.hh (1.12),
+ src/Status.types.hh (1.6), src/Topology.hh (1.7), src/Variable.cc
+ (1.11), src/Variable.defs.hh (1.29), src/Variable.inlines.hh
+ (1.15), src/Variable.types.hh (1.6), src/algorithms.hh (1.13),
+ src/conversion.cc (1.42), src/globals.cc (1.11), src/globals.hh
+ (1.27), src/initializer.hh (1.6), src/minimize.cc (1.28),
+ src/ppl_header.top (1.5), src/simplify.cc (1.22), tests/BBox.cc
+ (1.3), tests/BBox.hh (1.2), tests/CbecomesNNC1.cc (1.3),
+ tests/Makefile.am (1.167), tests/NNCinclusion1.cc (1.5),
+ tests/NNCminimize1.cc (1.8), tests/NNCminimize2.cc (1.8),
+ tests/NNCminimize3.cc (1.8), tests/NNCminimize4.cc (1.10),
+ tests/NNCminimize5.cc (1.7), tests/NNCminimize6.cc (1.9),
+ tests/PFunction.cc (1.2), tests/PFunction.hh (1.2),
+ tests/addconstraint1.cc (1.3), tests/addconstraint2.cc (1.2),
+ tests/addconstraint3.cc (1.2), tests/addconstraints1.cc (1.9),
+ tests/addconstraints10.cc (1.8), tests/addconstraints11.cc (1.9),
+ tests/addconstraints12.cc (1.2), tests/addconstraints13.cc (1.4),
+ tests/addconstraints2.cc (1.17), tests/addconstraints3.cc (1.7),
+ tests/addconstraints4.cc (1.9), tests/addconstraints5.cc (1.10),
+ tests/addconstraints6.cc (1.11), tests/addconstraints7.cc (1.10),
+ tests/addconstraints8.cc (1.10), tests/addconstraints9.cc (1.11),
+ tests/adddimensions1.cc (1.12), tests/adddimensions10.cc (1.5),
+ tests/adddimensions11.cc (1.3), tests/adddimensions12.cc (1.2),
+ tests/adddimensions2.cc (1.8), tests/adddimensions3.cc (1.10),
+ tests/adddimensions4.cc (1.8), tests/adddimensions5.cc (1.6),
+ tests/adddimensions6.cc (1.6), tests/adddimensions7.cc (1.6),
+ tests/adddimensions8.cc (1.4), tests/adddimensions9.cc (1.4),
+ tests/addgenerator1.cc (1.3), tests/addgenerator2.cc (1.3),
+ tests/addgenerator3.cc (1.2), tests/addgenerator4.cc (1.3),
+ tests/addgenerators1.cc (1.10), tests/addgenerators10.cc (1.2),
+ tests/addgenerators11.cc (1.4), tests/addgenerators12.cc (1.4),
+ tests/addgenerators2.cc (1.10), tests/addgenerators3.cc (1.10),
+ tests/addgenerators4.cc (1.10), tests/addgenerators5.cc (1.10),
+ tests/addgenerators6.cc (1.10), tests/addgenerators7.cc (1.7),
+ tests/addgenerators8.cc (1.5), tests/addgenerators9.cc (1.4),
+ tests/affineimage1.cc (1.10), tests/affineimage2.cc (1.9),
+ tests/affineimage3.cc (1.2), tests/affineimage4.cc (1.2),
+ tests/affineimage5.cc (1.3), tests/affineimage6.cc (1.2),
+ tests/affineimage7.cc (1.2), tests/affineimage8.cc (1.5),
+ tests/affinepreimage1.cc (1.9), tests/affinepreimage10.cc (1.5),
+ tests/affinepreimage2.cc (1.9), tests/affinepreimage3.cc (1.9),
+ tests/affinepreimage4.cc (1.10), tests/affinepreimage5.cc (1.2),
+ tests/affinepreimage6.cc (1.3), tests/affinepreimage7.cc (1.2),
+ tests/affinepreimage8.cc (1.2), tests/affinepreimage9.cc (1.3),
+ tests/affinetrans.cc (1.12), tests/append1.cc (1.18),
+ tests/append2.cc (1.19), tests/ascii_dump_load1.cc (1.11),
+ tests/ascii_dump_load2.cc (1.9), tests/ascii_dump_load3.cc
+ (1.12), tests/ascii_dump_load4.cc (1.12),
+ tests/ascii_dump_load5.cc (1.8), tests/ascii_dump_load6.cc (1.5),
+ tests/ascii_dump_load7.cc (1.5), tests/bhrz03widening1.cc (1.2),
+ tests/bhrz03widening10.cc (1.2), tests/bhrz03widening11.cc (1.2),
+ tests/bhrz03widening12.cc (1.2), tests/bhrz03widening13.cc (1.2),
+ tests/bhrz03widening14.cc (1.2), tests/bhrz03widening15.cc (1.2),
+ tests/bhrz03widening16.cc (1.2), tests/bhrz03widening17.cc (1.2),
+ tests/bhrz03widening18.cc (1.2), tests/bhrz03widening19.cc (1.2),
+ tests/bhrz03widening2.cc (1.2), tests/bhrz03widening3.cc (1.2),
+ tests/bhrz03widening4.cc (1.2), tests/bhrz03widening5.cc (1.2),
+ tests/bhrz03widening6.cc (1.2), tests/bhrz03widening7.cc (1.2),
+ tests/bhrz03widening8.cc (1.2), tests/bhrz03widening9.cc (1.2),
+ tests/bounded1.cc (1.8), tests/boundingbox1.cc (1.31),
+ tests/boundingbox2.cc (1.16), tests/boundingbox3.cc (1.7),
+ tests/boundingbox4.cc (1.4), tests/bounds1.cc (1.4),
+ tests/bounds2.cc (1.4), tests/concatenate1.cc (1.5),
+ tests/concatenate2.cc (1.5), tests/concatenate3.cc (1.5),
+ tests/concatenate4.cc (1.4), tests/concatenate5.cc (1.2),
+ tests/concatenate6.cc (1.4), tests/constraints1.cc (1.4),
+ tests/constraints2.cc (1.4), tests/constraints3.cc (1.4),
+ tests/constraints4.cc (1.4), tests/contains1.cc (1.2),
+ tests/disjoint1.cc (1.2), tests/disjoint2.cc (1.4),
+ tests/disjoint3.cc (1.3), tests/ehandlers.cc (1.4),
+ tests/ehandlers.hh (1.6), tests/empty1.cc (1.11),
+ tests/exceptions1.cc (1.29), tests/exceptions2.cc (1.23),
+ tests/files.cc (1.4), tests/files.hh (1.4),
+ tests/generalizedaffineimage1.cc (1.5),
+ tests/generalizedaffineimage10.cc (1.4),
+ tests/generalizedaffineimage11.cc (1.3),
+ tests/generalizedaffineimage12.cc (1.2),
+ tests/generalizedaffineimage2.cc (1.4),
+ tests/generalizedaffineimage3.cc (1.5),
+ tests/generalizedaffineimage4.cc (1.3),
+ tests/generalizedaffineimage5.cc (1.3),
+ tests/generalizedaffineimage6.cc (1.3),
+ tests/generalizedaffineimage7.cc (1.5),
+ tests/generalizedaffineimage8.cc (1.3),
+ tests/generalizedaffineimage9.cc (1.3), tests/generators1.cc
+ (1.11), tests/generators2.cc (1.7), tests/generators3.cc (1.3),
+ tests/generators4.cc (1.3), tests/generators5.cc (1.3),
+ tests/generators6.cc (1.4), tests/h79widening1.cc (1.4),
+ tests/h79widening2.cc (1.5), tests/h79widening3.cc (1.5),
+ tests/h79widening4.cc (1.2), tests/h79widening5.cc (1.3),
+ tests/inclusion1.cc (1.5), tests/inclusion2.cc (1.2),
+ tests/intersection1.cc (1.4), tests/intersection10.cc (1.3),
+ tests/intersection11.cc (1.4), tests/intersection2.cc (1.7),
+ tests/intersection3.cc (1.5), tests/intersection4.cc (1.5),
+ tests/intersection5.cc (1.5), tests/intersection6.cc (1.5),
+ tests/intersection7.cc (1.4), tests/intersection8.cc (1.3),
+ tests/intersection9.cc (1.3), tests/limitedbhrz03widening1.cc
+ (1.2), tests/limitedh79widening1.cc (1.5),
+ tests/limitedh79widening2.cc (1.5), tests/limitedh79widening3.cc
+ (1.3), tests/limitedh79widening4.cc (1.3),
+ tests/linearpartition1.cc (1.8), tests/linearpartition2.cc (1.8),
+ tests/linearpartition3.cc (1.8), tests/linexpression1.cc (1.2),
+ tests/mc91.cc (1.10), tests/memory1.cc (1.18),
+ tests/minconstraints1.cc (1.3), tests/minconstraints2.cc (1.3),
+ tests/minconstraints3.cc (1.2), tests/minconstraints4.cc (1.6),
+ tests/mingenerators1.cc (1.3), tests/mingenerators2.cc (1.2),
+ tests/mingenerators3.cc (1.2), tests/onepoint.cc (1.8),
+ tests/operator1.cc (1.3), tests/permute.cc (1.25),
+ tests/polydifference1.cc (1.5), tests/polydifference2.cc (1.7),
+ tests/polydifference3.cc (1.2), tests/polydifference4.cc (1.3),
+ tests/polydifference5.cc (1.4), tests/polydifference6.cc (1.3),
+ tests/polydifference7.cc (1.3), tests/polyhull1.cc (1.5),
+ tests/polyhull10.cc (1.2), tests/polyhull2.cc (1.5),
+ tests/polyhull3.cc (1.5), tests/polyhull4.cc (1.4),
+ tests/polyhull5.cc (1.3), tests/polyhull6.cc (1.3),
+ tests/polyhull7.cc (1.2), tests/polyhull8.cc (1.3),
+ tests/polyhull9.cc (1.4), tests/ppl_test.hh (1.3), tests/print.cc
+ (1.9), tests/print.hh (1.13), tests/randphull1.cc (1.7),
+ tests/randphull2.cc (1.4), tests/relations1.cc (1.8),
+ tests/relations10.cc (1.4), tests/relations11.cc (1.4),
+ tests/relations12.cc (1.3), tests/relations13.cc (1.3),
+ tests/relations14.cc (1.3), tests/relations15.cc (1.3),
+ tests/relations16.cc (1.3), tests/relations17.cc (1.5),
+ tests/relations18.cc (1.3), tests/relations19.cc (1.4),
+ tests/relations2.cc (1.9), tests/relations3.cc (1.9),
+ tests/relations4.cc (1.9), tests/relations5.cc (1.9),
+ tests/relations6.cc (1.8), tests/relations7.cc (1.8),
+ tests/relations8.cc (1.8), tests/relations9.cc (1.10),
+ tests/removedim1.cc (1.9), tests/removedim2.cc (1.13),
+ tests/removedim3.cc (1.9), tests/removedim4.cc (1.10),
+ tests/removedim5.cc (1.8), tests/removedim6.cc (1.11),
+ tests/removedim7.cc (1.6), tests/removedim8.cc (1.4),
+ tests/removedim9.cc (1.3), tests/shuffledim1.cc (1.6),
+ tests/smm1.cc (1.12), tests/timeelapse1.cc (1.6),
+ tests/timeelapse2.cc (1.6), tests/timeelapse3.cc (1.6),
+ tests/timeelapse4.cc (1.6), tests/timeelapse5.cc (1.6),
+ tests/timeelapse6.cc (1.2), tests/timeelapse7.cc (1.2),
+ tests/timeelapse8.cc (1.3), tests/timings.cc (1.3),
+ tests/timings.hh (1.3), tests/topclosed1.cc (1.3),
+ tests/topclosed2.cc (1.2), tests/topclosed3.cc (1.4),
+ tests/topclosure1.cc (1.5), tests/topclosure2.cc (1.2),
+ tests/topclosure3.cc (1.2), tests/topclosure4.cc (1.4),
+ tests/universe1.cc (1.7), tests/universe2.cc (1.8),
+ tests/universe3.cc (1.8), tests/universe4.cc (1.8),
+ tests/universe5.cc (1.9), tests/universe6.cc (1.6),
+ tests/watchdog1.cc (1.15), tests/writeconsys1.cc (1.5),
+ tests/writegensys1.cc (1.6), tests/writegensys2.cc (1.6),
+ tests/writegensys3.cc (1.5), tests/writepolyhedron1.cc (1.5),
+ tests/writepolyhedron2.cc (1.6), tests/writepolyhedron3.cc (1.5),
+ tests/writerelation1.cc (1.5), tests/writevariable1.cc (1.5):
+ Update copyright years.
+
+2002-12-31 Tuesday 17:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.273), Polyhedron.defs.hh (1.175): The
+ three different techniques making up BHRZ03_widening_assign() are
+ now isolated into corresponding members, to ease further
+ experimentation. Keeping track of the convergence reason and of
+ the successful technique in order to later output statistics
+ about it.
+
+2002-12-31 Tuesday 17:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Init.inlines.hh (1.6), globals.cc (1.10), globals.hh
+ (1.26): Added a global struct to keep statistics about BHRZ03
+ when the pre-proc flag PPL_STATISTICS is set (now set by
+ default). Statistics are outputted during the library
+ finalization.
+
+2002-12-30 Monday 19:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.272): In the NEW_LIMITED_GROWTH_ORDERING
+ case of method is_BHRZ03_stabilizing(), when we have the same
+ number of constraints for x and y, we now also check if the same
+ number is obtained when disregarding the positivity constraint.
+
+2002-12-30 Monday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.271): Wrong reference to `abort()' corrected
+ into a call.
+
+2002-12-30 Monday 09:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.270): Added preproc flag
+ NEW_LIMITED_GROWTH_ORDERING to test the new convergence criterion
+ for bhrz03. The new stabilization test now prints a '*' on
+ std::cerr each time we miss an opportunity of applying the new
+ widening techniques due to the new convergence criterion.
+
+2002-12-26 Thursday 14:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.75), Ciao/ppl_ciao.cc
+ (1.16), GNU/ppl_gprolog_sd.cc (1.11), SICStus/sicstus_cfli.ic
+ (1.3), SWI/ppl_swiprolog.cc (1.56), XSB/ppl_xsb.cc (1.16),
+ YAP/ppl_yap.cc (1.50): Transition to C: avoid references.
+
+2002-12-26 Thursday 11:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.15),
+ GNU/ppl_gprolog_sd.cc (1.10), SICStus/sicstus_cfli.h (1.2),
+ SICStus/sicstus_cfli.ic (1.2), SWI/ppl_swiprolog.cc (1.55),
+ XSB/ppl_xsb.cc (1.15), YAP/ppl_yap.cc (1.49): Transition to C:
+ avoid `bool'.
+
+2002-12-26 Thursday 11:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.33), ppl_sicstus_sd.cc
+ (1.31), sicstus_cfli.cc (1.1), sicstus_cfli.h (1.1),
+ sicstus_cfli.ic (1.1): Started carving the new Common Foreign
+ Language Interface.
+
+2002-12-25 Wednesday 19:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.74): Spurious element removed
+ from the `prolog_atoms' array.
+
+2002-12-22 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.51): Mention the bug fixed in
+ Polyhedron::minimized_constraints().
+
+2002-12-22 Sunday 08:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.79): Version number bumped.
+
+2002-12-21 Saturday 20:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.269), tests/topclosure1.cc (1.4): Corrected
+ the bug pointed out by topclosure1.cc.
+
+2002-12-21 Saturday 20:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.73): In add_corresponding_points(), iteration
+ now goes upward to insert the new points in a partially ordered
+ sequence.
+
+2002-12-21 Saturday 19:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.cc (1.8): Consistently follow "true" and "false" by a
+ full stop.
+
+2002-12-21 Saturday 16:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: print.cc (1.7), print.hh (1.12): Removal of easy_print()
+ completed.
+
+2002-12-21 Saturday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.53), src/Status.cc (1.18),
+ src/initializer.hh (1.5), tests/ehandlers.cc (1.3): Prefer
+ anonymous namespaces to static declarations.
+
+2002-12-21 Saturday 13:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.cc (1.6): The functions print_constraints() and
+ print_generators() were ignoring the `intro' argument.
+
+2002-12-20 Friday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/topclosure1.cc (1.3): Temporarily force NOISY to 1.
+
+2002-12-20 Friday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.cc (1.5): Avoid excess minimizations when printing
+ constraints or generators.
+
+2002-12-20 Friday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/boundingbox1.cc (1.30): Minor adjustments to expression
+ spacing; cutted away a few commented stmts.
+
+2002-12-20 Friday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/BBox.cc (1.2): Output functions greatly improved.
+
+2002-12-19 Thursday 07:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.78): Version number bumped.
+
+2002-12-18 Wednesday 20:10 Elisa Ricci
+
+ * src/conversion.cc (1.41): The bug witnessed by the `polyhull10'
+ test program has been fixed: under some circumstances we were not
+ indicating that the matrix no longer had pending rows.
+
+2002-12-17 Tuesday 19:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.166), polyhull10.cc (1.1): New test
+ showing a bug in the current version of the library.
+
+2002-12-16 Monday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.21): Production of the documentation depends
+ also on ppl.sty.
+
+2002-12-15 Sunday 20:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.165): The -lm flag for *randphull2 is in
+ addition to the other LDFLAGS.
+
+2002-12-15 Sunday 19:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.164): The randphull2 and nnc_randphull2 test
+ programs need to be linked against the math library.
+
+2002-12-15 Sunday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/shuffledim1.cc (1.5): Define print_function() only when
+ noisy.
+
+2002-12-15 Sunday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/randphull2.cc (1.3): Define M_PI unless it is already
+ defined.
+
+2002-12-14 Saturday 21:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: limitedbbrz02widening1.cc (1.4),
+ limitedbhrz03widening1.cc (1.1): The new widening is now
+ nicknamed BHRZ03.
+
+2002-12-14 Saturday 20:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: affineimage8.cc (1.4), affinepreimage10.cc (1.4): Use the
+ NOISY flag to control noisiness.
+
+2002-12-14 Saturday 20:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: addconstraints13.cc (1.3), addgenerators12.cc (1.3),
+ affineimage8.cc (1.3), affinepreimage10.cc (1.3), boundingbox1.cc
+ (1.29), concatenate6.cc (1.3), constraints4.cc (1.3),
+ generators6.cc (1.3), intersection11.cc (1.3), polyhull9.cc
+ (1.3), relations19.cc (1.3), shuffledim1.cc (1.4), topclosure4.cc
+ (1.3): Use internal linkage when possible.
+
+2002-12-14 Saturday 20:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variable.cc (1.10): Variable::default_output_function()
+ improved.
+
+2002-12-14 Saturday 18:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.50), doc/definitions.dox (1.104), interfaces/C/ppl_c.cc
+ (1.52), interfaces/C/ppl_c.h (1.53),
+ interfaces/Prolog/Prolog_interface.dox (1.71),
+ interfaces/Prolog/pl_check.pl (1.30),
+ interfaces/Prolog/ppl_prolog.icc (1.73),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.28),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.30),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.54),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.7),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.14),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.48), src/Polyhedron.cc
+ (1.268), src/Polyhedron.defs.hh (1.174), src/algorithms.hh
+ (1.12), tests/Makefile.am (1.163), tests/bbrz02widening1.cc
+ (1.5), tests/bbrz02widening10.cc (1.2), tests/bbrz02widening11.cc
+ (1.2), tests/bbrz02widening12.cc (1.4), tests/bbrz02widening13.cc
+ (1.7), tests/bbrz02widening14.cc (1.8), tests/bbrz02widening15.cc
+ (1.7), tests/bbrz02widening16.cc (1.2), tests/bbrz02widening17.cc
+ (1.2), tests/bbrz02widening18.cc (1.2), tests/bbrz02widening19.cc
+ (1.2), tests/bbrz02widening2.cc (1.3), tests/bbrz02widening3.cc
+ (1.3), tests/bbrz02widening4.cc (1.2), tests/bbrz02widening5.cc
+ (1.2), tests/bbrz02widening6.cc (1.4), tests/bbrz02widening7.cc
+ (1.4), tests/bbrz02widening8.cc (1.3), tests/bbrz02widening9.cc
+ (1.7), tests/bhrz03widening1.cc (1.1), tests/bhrz03widening10.cc
+ (1.1), tests/bhrz03widening11.cc (1.1), tests/bhrz03widening12.cc
+ (1.1), tests/bhrz03widening13.cc (1.1), tests/bhrz03widening14.cc
+ (1.1), tests/bhrz03widening15.cc (1.1), tests/bhrz03widening16.cc
+ (1.1), tests/bhrz03widening17.cc (1.1), tests/bhrz03widening18.cc
+ (1.1), tests/bhrz03widening19.cc (1.1), tests/bhrz03widening2.cc
+ (1.1), tests/bhrz03widening3.cc (1.1), tests/bhrz03widening4.cc
+ (1.1), tests/bhrz03widening5.cc (1.1), tests/bhrz03widening6.cc
+ (1.1), tests/bhrz03widening7.cc (1.1), tests/bhrz03widening8.cc
+ (1.1), tests/bhrz03widening9.cc (1.1), tests/exceptions1.cc
+ (1.28), tests/exceptions2.cc (1.22),
+ tests/limitedbbrz02widening1.cc (1.3): The new widening is now
+ nicknamed BHRZ03.
+
+2002-12-06 Friday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.57): Avoid totally useless
+ parentheses. Make sure inline methods and functions are defined
+ before being used.
+
+2002-12-05 Thursday 21:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.14), config.sub (1.13): Updated.
+
+2002-12-05 Thursday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.77): Bump version number.
+
+2002-12-05 Thursday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/minconstraints4.cc (1.5): Original testcase restored.
+
+2002-12-05 Thursday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: append1.cc (1.17), append2.cc (1.18), exceptions1.cc
+ (1.27), minconstraints4.cc (1.4), permute.cc (1.24),
+ removedim1.cc (1.8), removedim2.cc (1.12), removedim3.cc (1.8),
+ removedim6.cc (1.10), removedim7.cc (1.5), removedim8.cc (1.3):
+ Use PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.25), Determinate.inlines.hh (1.23),
+ Polyhedron.cc (1.267), Polyhedron.defs.hh (1.173),
+ PowerSet.defs.hh (1.23), PowerSet.inlines.hh (1.28),
+ Variable.defs.hh (1.28), Variable.inlines.hh (1.14): The function
+ bool operator<(const Variable&, const Variable&) has been
+ substituted by bool less(const Variable&, const Variable&). New
+ predicate Variable::Compare useful for defining associative
+ containers of variables. New typedef Variables_Set standing for
+ std::set<Variable, Variable::Compare>. Use PPL::Variables_Set
+ instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.cc (1.51), Prolog/ppl_prolog.icc (1.72): Use
+ PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 12:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.28): Added an item about strong minimization.
+
+2002-12-05 Thursday 12:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.266): In
+ Polyhedron::strongly_minimize_constraints(), corrected the bug
+ spotted by test minconstraints4.cc.
+
+2002-12-05 Thursday 12:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/minconstraints4.cc (1.3): Further simplified the test
+ showing the bug.
+
+2002-12-05 Thursday 10:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/minconstraints4.cc (1.2): Simplified the test showing the
+ bug in the strong minimization of constraints.
+
+2002-12-05 Thursday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.162), minconstraints4.cc (1.1): New test
+ showing a bug triggered by an invocation of
+ Polyhedron::minimized_constraints().
+
+2002-12-03 Tuesday 20:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.cc (1.56), src/ConSys.defs.hh (1.75),
+ src/ConSys.inlines.hh (1.28), src/GenSys.cc (1.72),
+ src/GenSys.defs.hh (1.86), src/GenSys.inlines.hh (1.29),
+ src/Matrix.cc (1.45), src/Matrix.defs.hh (1.39),
+ src/Matrix.inlines.hh (1.28), src/Polyhedron.cc (1.265),
+ src/Polyhedron.defs.hh (1.172), src/Polyhedron.inlines.hh (1.56),
+ src/Status.cc (1.17), src/Status.defs.hh (1.24),
+ src/Status.inlines.hh (1.11), src/conversion.cc (1.40),
+ src/minimize.cc (1.27), src/simplify.cc (1.21), tests/Makefile.am
+ (1.161), tests/addconstraints13.cc (1.2),
+ tests/addgenerators12.cc (1.2), tests/affineimage8.cc (1.2),
+ tests/affinepreimage10.cc (1.2), tests/boundingbox1.cc (1.28),
+ tests/bug1.cc (1.3), tests/bug1.dat (1.2), tests/concatenate6.cc
+ (1.2), tests/constraints4.cc (1.2), tests/generators6.cc (1.2),
+ tests/intersection11.cc (1.2), tests/polyhull9.cc (1.2),
+ tests/relations19.cc (1.2), tests/timeelapse8.cc (1.2),
+ tests/topclosure4.cc (1.2): The `lazy' branch has been merged.
+
+2002-12-03 Tuesday 11:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.264): Fixed a couple of comments.
+
+2002-12-02 Monday 18:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[12,12]): A
+ whole pass on the code of the class, trying to use the new
+ methods defined for the handling of pending rows; also tried to
+ provide more uniform comments and to avoid useless reordering of
+ rows when invoking add_and_minimize().
+
+2002-12-02 Monday 18:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (lazy.4): Modified methods
+ add_corresponding_points() and add_corr_closure_points() to rely
+ on the caller for the management of pending rows.
+
+2002-12-02 Monday 18:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (lazy.3): Modified method
+ adjust_topology_and_dimensions() to rely on the caller for the
+ management of pending rows.
+
+2002-12-02 Monday 18:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh, minimize.cc (lazy.[7,4]): Provided
+ slightly better names for methods dealing with pending rows.
+ Modified the assertions for the two methods named
+ add_and_minimize(...) and added new documentation.
+
+2002-12-02 Monday 18:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (lazy.8): No longer using flag
+ KEEP_SOURCE_SORTEDNESS.
+
+2002-12-02 Monday 18:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (lazy.10): Corrected a typo in
+ add_pending_rows(const Matrix&). Removed an ill-placed
+ well-formedness check. Adjusted a few assertions.
+
+2002-12-02 Monday 09:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+ (lazy.[9,7,3]): Added new method unset_pending_rows() that sets
+ the index_first_pending_row equal to the number of rows of the
+ matrix. Added new methods add_rows(const Matrix&) and
+ add_pending_rows(const Matrix&) to add a set of rows with one
+ matrix reallocation at most. Adjusted a few comments. Factored
+ some common code in the sorting methods.
+
+2002-11-30 Saturday 11:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ciao_clpq.pl (1.3): No longer use the
+ debug package: use the debugger library instead. Added
+ use_module(library(prolog_sys)) in order to use statistics/0.
+
+2002-11-29 Friday 20:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.39): Committed to preserving the sortedness
+ of `source', but changed the name of the new index, now using
+ `source_num_redundant'. Using a reference instead of evaluating
+ source[k] many times.
+
+2002-11-29 Friday 11:51 Elisa Ricci
+
+ * src/: Matrix.cc, Matrix.defs.hh, Polyhedron.cc,
+ Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+ minimize.cc (lazy.[8,6,11,6,11,7,3]): Added
+ Matrix::sort_rows(dimension_type first_row, dimension_type
+ last_row) that sorts the the part of the matrix that is between
+ `first_row' and `last_row'. Added also
+ Matrix::sort_pending_and_remove_duplicates() that sorts the
+ pending part of the matrix and remove the pending rows that are
+ also in the upper part of the matrix. Added
+ Polyhedron::remove_pending_constraints_and_minimize() and
+ Polyhedron::remove_pending_generators_and_minimize() that remove
+ pending constraints/generators and minimize the polyhedron: now
+ Polyhedron::remove_pending_and_minimze() only calls the two added
+ methods. Added also Polyhedron::add_and_minimize(bool, Matrix&,
+ Matrix&, SatMatrix&) to obtain a polyhedron in minimal form
+ defined by the system composed by the non-pending rows and by the
+ pending rows of the first matrix. This new method is called by
+ Polyhedron::add_and_minimize(bool, Matrix&, Matrix&, SatMatrix&,
+ const Matrix&) after We have added the row of the constant matrix
+ to the first matrix. Changed conversion so that when we swap the
+ rows of source we set a flag and at the end we verify if the
+ matrix is really sorted or not.
+
+2002-11-29 Friday 11:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.27): We should not forget to document
+ Polyhedron::shuffle_dimensions().
+
+2002-11-29 Friday 10:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (lazy.6): The management of flag
+ KEEP_SOURCE_SORTEDNESS reported into the branch lazy.
+
+2002-11-29 Friday 10:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.38): Implemented a more efficient way to
+ keep the sortedness of Matric `source', requiring max
+ source_num_rows - 1 swaps of the rows in source. The new code is
+ controlled by pre-proc flag KEEP_SOURCE_SORTEDNESS, which is now
+ set to 0 (i.e., still using old code).
+
+2002-11-28 Thursday 18:22 Elisa Ricci
+
+ * src/: SatMatrix.cc (1.24), SatMatrix.defs.hh (1.28), minimize.cc
+ (1.26): Restored SatMatrix::transpose() and used it in
+ add_and_minimize(), where it is possible, instead of
+ SatMatrix::transpose_assign(). When we use add_row(), it sets
+ correctly if the changed matrix is sorted or not: so we have not
+ to say in add_and_minimize() that the changed matrix is not
+ sorted. In add_and_minimize(), after adding the new rows to the
+ matrix `source1', we resize the saturation matrix `sat' instead
+ of built a temporary saturation matrix.
+
+2002-11-28 Thursday 14:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.37): Added (a preprocessing controlled and
+ now disabled) alternative code for the removal of rows in Matrix
+ `source' that are found to be redundant. The alternative code
+ does keep the sortedness of `source'.
+
+2002-11-28 Thursday 14:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (lazy.5): Added (a preprocessing controlled and
+ now disabled) alternative code for the removal of rows in Matrix
+ source that are found to be redundant. The alternative code does
+ keep the sortedness of source.
+
+2002-11-27 Wednesday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.42), Poly_Con_Relation.cc (1.6),
+ Poly_Gen_Relation.cc (1.6): Added missing \relates needed by
+ Doxygen.
+
+2002-11-27 Wednesday 18:10 Elisa Ricci
+
+ * src/conversion.cc (lazy.4): Improve the last part of conversion:
+ now we check if the sorted matrix `dest' is really sorted and
+ then we update `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 16:19 Elisa Ricci
+
+ * src/conversion.cc (lazy.3): Improved the part in which we update
+ `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 13:15 Elisa Ricci
+
+ * src/: Matrix.defs.hh, Matrix.cc, conversion.cc (lazy.[5,7,2]):
+ Now we have Matrix::add_pending_row(Row::Type type) instead of
+ Matrix::add_row(Row::Type type). This new method does not change
+ `index_first_pending' and does not verify the sortedness of the
+ matrix. Used this new method in conversion. At the end of
+ conversion, we update the sortedness of `dest' and its
+ `index_first_pending'.
+
+2002-11-27 Wednesday 11:45 Elisa Ricci
+
+ * src/minimize.cc (lazy.2): When we use add_row(), it sets
+ correctly if the changed matrix is sorted or not: so we do not
+ say in add_and_minimize() that then the vhanged matrix is not
+ sorted. In add_and_minimize(), after adding the new rows to the
+ matrix `source1', we resize the saturation matrix `sat' instead
+ of built a temporary saturation matrix. In add_and_minimize(),
+ also used SatMatrix::transpose() where it is possible instead of
+ SatMatrix::transpose_assign().
+
+2002-11-27 Wednesday 11:21 Elisa Ricci
+
+ * tests/shuffledim1.cc (1.3): Added a test to verify
+ Polyhedron::shuffle_dimensions() in the case that the polyhedron
+ is zero-dimensional.
+
+2002-11-26 Tuesday 17:51 Elisa Ricci
+
+ * tests/shuffledim1.cc (1.2): Added void print_function() that is
+ used to print a function in this test. Added also other tests to
+ verify Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 17:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.cc (1.4): Fixed a bug whereby universe polyhedra were
+ sometimes wrongly printed.
+
+2002-11-26 Tuesday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.160), PFunction.cc (1.1), PFunction.hh
+ (1.1), shuffledim1.cc (1.1): To test
+ Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.263), SatRow.cc (1.16), SatRow.defs.hh
+ (1.24), SatRow.inlines.hh (1.21), conversion.cc (1.36),
+ simplify.cc (1.20): New functions bool subset_or_equal(const
+ SatRow&, const SatRow&) and bool strict_subset(const SatRow&,
+ const SatRow&) replace the misleading overloadings of the
+ comparison operators `<', `<=', `>' and `>=' on SatRow's.
+
+2002-11-26 Tuesday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (lazy.1): From the main trunk: fixed int
+ compare(const SatRow&, const SatRow&), bool operator<=(const
+ SatRow&, const SatRow&), and bool operator<(const SatRow&, const
+ SatRow&).
+
+2002-11-26 Tuesday 10:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.cc (1.15): Fixed int compare(const SatRow& x, const
+ SatRow& y), bool operator<=(const SatRow& x, const SatRow& y),
+ and bool operator<(const SatRow& x, const SatRow& y): they were
+ completely broken.
+
+2002-11-25 Monday 15:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (lazy.6): Fixed a bug in Matrix::grow() whereby,
+ depending on the relations between the new rows' size and the old
+ row's capacity, index_first_pending could erroneously be set to
+ zero.
+
+2002-11-25 Monday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.32): Properly install
+ ppl_sicstus.so.
+
+2002-11-25 Monday 09:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh, GenSys.defs.hh, Matrix.defs.hh
+ (lazy.[3,4,4]): Added more details in the documentation for the
+ split constructors.
+
+2002-11-25 Monday 09:25 Elisa Ricci
+
+ * src/: Matrix.cc, Polyhedron.cc (lazy.[5,10]): Corrected the bug
+ in Matrix::ascii_load: we used "nrows" instead of "index", when
+ we set the "index_first_pending". In Matrix::add_row, erased in
+ a condition of an "if" erased the check about the number of
+ pending rows, because we use this method only when the matrix has
+ no pending rows. In Polyhedron::Polyhedron(Topology topol,
+ ConSys& cs) and Polyhedron::Polyhedron(Topology topol, const
+ ConSys& cs) erased an "if" that is repeated twice.
+
+2002-11-24 Sunday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug1.cc, bug1.dat (lazy.[4,1,1]): New test
+ program (with input data) meant to witness the existence of a bug
+ in Polyhedron::concatenate_assign(). Unfortunately, it shows
+ that there are also problems in Polyhedron::ascii_dump() and/or
+ Polyhedron::ascii_load().
+
+2002-11-24 Sunday 14:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc, Polyhedron.defs.hh (lazy.[9,5]): Using the
+ new split constructor to implement remove_pending_and_minimize().
+
+2002-11-24 Sunday 14:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh, ConSys.inlines.hh, GenSys.defs.hh,
+ GenSys.inlines.hh, Matrix.cc, Matrix.defs.hh
+ (lazy.[2,1,3,1,4,3]): Added split constructors for Matrix, ConSys
+ and GenSys.
+
+2002-11-23 Saturday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.31): Use libtool
+ whenever possible.
+
+2002-11-23 Saturday 09:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.52): Include <stdio.h> before <gmp.h> so
+ as to avoid warnings about the implicit declaration of all the
+ I/O functions.
+
+2002-11-22 Friday 17:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/disjoint2.cc (1.3): Be quiet.
+
+2002-11-22 Friday 15:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.11): Practice information hiding.
+
+2002-11-22 Friday 12:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: affinepreimage9.cc (1.2), append1.cc (1.16), append2.cc
+ (1.17), ascii_dump_load1.cc (1.10), ascii_dump_load2.cc (1.8),
+ ascii_dump_load3.cc (1.11), ascii_dump_load4.cc (1.11),
+ ascii_dump_load5.cc (1.7), ascii_dump_load6.cc (1.4),
+ ascii_dump_load7.cc (1.4), bbrz02widening1.cc (1.4),
+ bbrz02widening12.cc (1.3), bbrz02widening13.cc (1.6),
+ bbrz02widening14.cc (1.7), bbrz02widening15.cc (1.6),
+ bbrz02widening9.cc (1.6), boundingbox1.cc (1.27), boundingbox2.cc
+ (1.15), boundingbox3.cc (1.6), boundingbox4.cc (1.3),
+ disjoint2.cc (1.2), disjoint3.cc (1.2), exceptions1.cc (1.26),
+ exceptions2.cc (1.21), files.cc (1.3),
+ generalizedaffineimage10.cc (1.3), generalizedaffineimage11.cc
+ (1.2), generalizedaffineimage7.cc (1.4),
+ generalizedaffineimage9.cc (1.2), intersection10.cc (1.2),
+ intersection2.cc (1.6), limitedh79widening4.cc (1.2),
+ linearpartition1.cc (1.7), linearpartition2.cc (1.7),
+ linearpartition3.cc (1.7), memory1.cc (1.17), operator1.cc (1.2),
+ permute.cc (1.23), polydifference7.cc (1.2), polyhull8.cc (1.2),
+ randphull1.cc (1.6), randphull2.cc (1.2), relations17.cc (1.4),
+ relations9.cc (1.9), smm1.cc (1.11), watchdog1.cc (1.14),
+ writeconsys1.cc (1.4), writegensys1.cc (1.5), writegensys2.cc
+ (1.5), writegensys3.cc (1.4), writepolyhedron1.cc (1.4),
+ writepolyhedron2.cc (1.5), writepolyhedron3.cc (1.4),
+ writerelation1.cc (1.4), writevariable1.cc (1.4): Consistency
+ improvements.
+
+2002-11-22 Friday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/files.hh (1.3): Include <iostream> instead of <iosfwd>.
+
+2002-11-22 Friday 11:54 Elisa Ricci
+
+ * src/Matrix.inlines.hh (lazy.2): Added the assertion
+ "assert(num_rows() >= first_pending_row())" in
+ Matrix::num_pending_rows().
+
+2002-11-22 Friday 10:23 Elisa Ricci
+
+ * src/: ConSys.cc, GenSys.cc, Matrix.cc, Polyhedron.cc,
+ Polyhedron.inlines.hh (lazy.[2,3,3,8,10]): Added some comments to
+ explain the case in which the polyhedron has something pending.
+ Added some assertions to verify that a method is not used in
+ wrong cases.
+
+2002-11-22 Friday 10:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.24): Teo declarations uncommented.
+
+2002-11-22 Friday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.51): Declarations of ppl_ConSys_begin()
+ and ppl_ConSys_end() fixed.
+
+2002-11-22 Friday 09:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ppl_test.hh (1.2): Copyright notice added.
+
+2002-11-22 Friday 09:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ehandlers.cc (1.2): Include ehandlers.hh.
+
+2002-11-22 Friday 09:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.76): Bump version number.
+
+2002-11-21 Thursday 18:18 Elisa Ricci
+
+ * src/: ConSys.cc, ConSys.defs.hh, GenSys.cc, GenSys.defs.hh,
+ Matrix.cc, Matrix.defs.hh, Polyhedron.cc, Polyhedron.defs.hh,
+ Polyhedron.inlines.hh, conversion.cc, minimize.cc, simplify.cc
+ (lazy.[1,1,2,2,2,2,7,4,9,1,1,1]): Added the methods
+ Matrix::add_pending_row(), Matrix::insert_pending(),
+ GenSys::insert_pending() and ConSys::insert_pending(). Erased
+ the matrices `pending_cs' and `pending_gs' from polyhedron: now
+ if the polyhedron has pending constraints/generators, they are in
+ con_sys/gen_sys. Modified the methods of Polyhedron, ConSys,
+ GenSys and Matrix so that they always consider if the polyhedron
+ contains something pending or if the matrix has some pending
+ rows.
+
+2002-11-20 Wednesday 12:38 Elisa Ricci
+
+ * tests/: Makefile.am (1.159), disjoint2.cc (1.1), disjoint3.cc
+ (1.1): Added new tests to verify are_disjoint(const Polyhedron&
+ x, const Polyhedron& y).
+
+2002-11-15 Friday 16:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.158), intersection2.cc (1.5),
+ randphull1.cc (1.5), randphull2.cc (1.1): New test computing
+ random polytopes by generating points on the surface of an
+ n-dimensional sphere.
+
+2002-11-15 Friday 12:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.29), ppl_prolog.icc (1.71):
+ Bug in term_to_complexity_class/2 corrected (a_empty changed to
+ a_any). Tests for ppl_Polyhedron_get_bounding_box/3 added to
+ pl_check.pl.
+
+2002-11-15 Friday 12:31 Elisa Ricci
+
+ * src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+ (lazy.[1,1,1]): Started to insert the pending system into the
+ matrix.
+
+2002-11-15 Friday 09:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.70): Added
+ documentation for the complexity classes allowed in
+ ppl_Polyhedron_get_bounding_box/3
+
+2002-11-14 Thursday 10:30 Elisa Ricci
+
+ * src/Polyhedron.inlines.hh (lazy.8): Erased a repeated comment.
+
+2002-11-14 Thursday 10:14 Elisa Ricci
+
+ * src/Polyhedron.cc, tests/topclosure4.cc (lazy.[6,2]): Improved
+ Polyhedron::topological_closure_assign() in the case that the
+ polyhedron has pending constraints. Typo fixed in the test.
+
+2002-11-14 Thursday 09:43 Elisa Ricci
+
+ * src/Polyhedron.inlines.hh, tests/boundingbox1.cc (lazy.[7,1]):
+ Corrected an error in Polyhedron::shrink_bounding_box(Box& box,
+ Complexity_Class complexity). Added two tests to verify this
+ method. In boundingbox1.cc, corrected also test10 that did not
+ verify if the resulting box computed using POLYNOMIAL were equal
+ to the "known_pbox".
+
+2002-11-13 Wednesday 18:51 Elisa Ricci
+
+ * tests/: Makefile.am, topclosure4.cc (lazy.[3,1]): Added a new
+ test to verify Polyhedron::topological_closure_assign().
+
+2002-11-13 Wednesday 18:50 Elisa Ricci
+
+ * src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[5,6]): Improved
+ Polyhedron::intersection_assign(),
+ Polyhedron::poly_hull_assign(), Polyhedron::add_generator(),
+ Polyhedron::add_constraint(), Polyhedron::concatenate_assign(),
+ Polyhedron::add_constraints(), Polyhedron::add_generators() and
+ modified Polyhedron::topological_closure_assign() and
+ Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+ complexity) in the case in which the polyhedra can have something
+ pending.
+
+2002-11-13 Wednesday 18:43 Elisa Ricci
+
+ * src/: GenSys.cc, GenSys.defs.hh (lazy.[1,1]): Added the method
+ add_corresponding_points(const GenSys& gs) that add to *this the
+ "corresponding point of the closure points of "gs" and of *this".
+
+2002-11-13 Wednesday 10:58 Elisa Ricci
+
+ * tests/: Makefile.am, addconstraints13.cc, addgenerators12.cc,
+ affineimage8.cc, affinepreimage10.cc, relations19.cc,
+ timeelapse8.cc (lazy.[2,2,1,1,1,1,1]): Added some other tests
+ that verify the methods Polyhedron::add_generators(),
+ Polyhedron::add_generators_and_minimize(),
+ Polyhedron::affine_image(), Polyhedron::affine_preimage(),
+ Polyhedron::relation_with() and Polyhedron::time_elapse_assign()
+ in the case in which the polyhedra can have something pending.
+
+2002-11-13 Wednesday 10:49 Elisa Ricci
+
+ * src/Polyhedron.cc (lazy.4): Improved Polyhedron::is_bounded() and
+ Polyhedron::bounds(). Corrected
+ Polyhedron::is_topologically_closed().
+
+2002-11-13 Wednesday 09:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.28): pl_check.pl now avoids
+ unifying terms with constraint and generator systems.
+
+2002-11-12 Tuesday 17:32 Elisa Ricci
+
+ * tests/: Makefile.am, addconstraints13.cc, concatenate6.cc,
+ constraints4.cc, generators6.cc, intersection11.cc, polyhull9.cc
+ (lazy.[1,1,1,1,1,1,1]): Added some new tests that verify the case
+ in which the polyhedron can have something pending.
+
+2002-11-12 Tuesday 17:30 Elisa Ricci
+
+ * src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[3,5]): Improved
+ operator<=(x, y) and Polyhedron::concatenate_assign(y) in the
+ case that the polyhedra have something pending.
+
+2002-11-12 Tuesday 16:21 Elisa Ricci
+
+ * src/Polyhedron.inlines.hh (lazy.4): Considered the case of a
+ polyhedron that has something pending in
+ Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+ complexity) and in Polyhedron::shuffle_dimensions(const
+ PartialFunction& pfunc).
+
+2002-11-12 Tuesday 11:52 Elisa Ricci
+
+ * src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+ (lazy.[2,3,3]): Improved the case of pending system in
+ Polyhedron::generators() and Polyhedron::minimize() and
+ Polyhedron::intersection_assign(). Corrected operator<= in the
+ case that one of the two polyhedra have something pending. Added
+ the method Polyhedron::can_have_something_pending(). Considered
+ the case of pending constraints or pending generators in
+ concatenate_assign(), poly_hull_assign(),
+ poly_hull_assign()_and_minimize, add_dimension_and_embed(),
+ add_dimensions_and_project, remove_dimensions()
+ remove_higher_dimensions, in all the methods that are used to add
+ constraints and generators, in affine_image() and
+ affine_preimage, in time_elapse_assign(), in check_universe(), in
+ is_bounded() and bounds(), in is_topologically_closed() and in
+ topological_closure_assign(), in Polyhedron::swap() and in
+ Polyhedron(Topology topol, const Box& box).
+
+2002-11-12 Tuesday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.26): Revised the section on urgent things to do.
+
+2002-11-12 Tuesday 10:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.69), pl_check.pl
+ (1.27), ppl_prolog.icc (1.70), Ciao/ppl_ciao.pl (1.27),
+ SICStus/ppl_sicstus_sd.cc (1.29), SWI/ppl_swiprolog.cc (1.53),
+ XSB/ppl_xsb.H (1.6), XSB/ppl_xsb.cc (1.13), YAP/ppl_yap.cc
+ (1.47): Implemented ppl_Polyhedron_get_bounding_box/3.
+
+2002-11-10 Sunday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.16): Do not try to run the real test on
+ Cygwin since the implementation of setrlimit() there is a dummy
+ one.
+
+2002-11-10 Sunday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.11): Allow to build in the
+ sources' directory.
+
+2002-11-10 Sunday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/.cvsignore (1.4), tests/.cvsignore (1.7):
+ Ignore more generated files.
+
+2002-11-09 Saturday 22:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.15): The LIMIT macro has been fixed.
+
+2002-11-08 Friday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.13), ciao_clpq.pl (1.2):
+ Completed.
+
+2002-11-08 Friday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.cc (1.14): Fixed two critical
+ bugs.
+
+2002-11-08 Friday 12:20 Elisa Ricci
+
+ * src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+ (lazy.[1,2,2]): Added to a polyhedron the system of pending
+ constraints and the system of pending generators. Added the
+ methods that set the flags used for the pending systems and
+ Polyhedron::remove_pending_and_minimize(),
+ Polyhedron::remove_pending_to_obtain_constraints() and
+ Polyhedron::remove_pending_to_obtain_generators(). Started to
+ consider the pending systems and in particular used them
+ operator<=(x, y), Polyhedron::intersection_assign_and_minimize(y)
+ and Polyhedron::intersection_assign(y).
+
+2002-11-08 Friday 12:13 Elisa Ricci
+
+ * src/Status.cc (lazy.2): Modified Status::OK() so that it also
+ verify if the polyhedron has both pending constraints and pending
+ generators.
+
+2002-11-08 Friday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.12): Added missing patterns
+ to MOSTLYCLEANFILES.
+
+2002-11-08 Friday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ascii_dump_load3.cc (1.10), ascii_dump_load4.cc (1.10),
+ ascii_dump_load5.cc (1.6), ascii_dump_load6.cc (1.3): Be noisy
+ when NOISY.
+
+2002-11-08 Friday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ascii_dump_load7.cc (1.3): Comment fixed.
+
+2002-11-08 Friday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.11): Add fake_main.pl and
+ ciao_clpq.pl to EXTRA_DIST.
+
+2002-11-07 Thursday 18:32 Elisa Ricci
+
+ * src/: Polyhedron.defs.hh, Polyhedron.inlines.hh, Status.cc,
+ Status.defs.hh, Status.inlines.hh (lazy.[1,1,1,1,1]): Added in
+ the Status the flags that say if the polyhedron has something
+ pending. Added the methods that check these flags.
+
+2002-11-07 Thursday 16:45 Elisa Ricci
+
+ * src/: SatMatrix.cc (1.23), SatMatrix.defs.hh (1.27),
+ SatMatrix.inlines.hh (1.17): Erased SatMatrix::transpose(),
+ operator==(const SatMatrix& x, const SatMatrix& y) and
+ operator!=(const SatMatrix& x, const SatMatrix& y), because they
+ were never used.
+
+2002-11-07 Thursday 16:04 Elisa Ricci
+
+ * src/Polyhedron.cc (1.262): Corrected the bug: we printed "sat_c"
+ twice instead of "sat_c" and "sat_g".
+
+2002-11-07 Thursday 15:41 Elisa Ricci
+
+ * tests/ascii_dump_load7.cc (1.2): Simplify the test that shows the
+ bug.
+
+2002-11-07 Thursday 15:35 Elisa Ricci
+
+ * tests/: Makefile.am (1.157), ascii_dump_load7.cc (1.1): This test
+ shows a bug: we have a polyhedron with sat_g up-to-date but sat_g
+ is dimensional incompatible with con_sys.
+
+2002-11-07 Thursday 15:20 Elisa Ricci
+
+ * tests/ascii_dump_load6.cc (1.2): Added two other tests to verify
+ Status::ascii_dump() and Status::ascii_load().
+
+2002-11-06 Wednesday 19:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ascii_dump_load3.cc (1.9), ascii_dump_load4.cc (1.9):
+ Added missing calls to seekp() where input was immediately
+ followed by output on a stream open in read/write mode.
+
+2002-11-06 Wednesday 07:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.25): Added a few things to do rather urgently.
+
+2002-11-05 Tuesday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/watchdog1.cc (1.13): Missing return statement added.
+
+2002-11-05 Tuesday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.14): Missing return statement added.
+
+2002-11-05 Tuesday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.10): Detection of sizeof(mp_limb_t) fixed.
+
+2002-11-05 Tuesday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.13): The custom allocation functions must
+ have C linkage.
+
+2002-11-05 Tuesday 14:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/mc91.cc (1.9): Do not refer to the AskTell class.
+
+2002-11-05 Tuesday 14:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.23), PowerSet.defs.hh (1.22),
+ PowerSet.inlines.hh (1.27): Include the required files.
+
+2002-11-05 Tuesday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.54): The AskTell constraint system class is
+ nowhere near maturity: will not be distributed for the time
+ being.
+
+2002-11-05 Tuesday 12:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.75): Check whether the C++ compiler supports
+ flexible array only after having set CXXFLAGS.
+
+2002-11-05 Tuesday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/: ac_check_gmp.m4 (1.9), ac_cxx_flexible_arrays.m4 (1.4): More
+ quoting where needed.
+
+2002-11-05 Tuesday 11:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.cc (1.6), Watchdog.defs.hh (1.8): Standard
+ conformance fixes.
+
+2002-11-05 Tuesday 10:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.8): Updated.
+
+2002-11-05 Tuesday 10:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.13): Work around a bug in AC_CHECK_FUNCS
+ as implemented in autoconf 2.54c and previous versions. For more
+ information, see
+ http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html.
+
+2002-11-05 Tuesday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.74), Watchdog/configure.ac (1.12),
+ m4/ac_check_gmp.m4 (1.8), m4/ac_cxx_flexible_arrays.m4 (1.3):
+ Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.73), m4/ac_check_gmp.m4 (1.7),
+ m4/ac_cxx_flexible_arrays.m4 (1.2): Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.12): Warning avoided, FIXME
+ added.
+
+2002-11-05 Tuesday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/smm1.cc (1.10): Extend the Parma_Polyhedra_Library
+ namespace with the output operators before using STL stream
+ iterators.
+
+2002-11-05 Tuesday 00:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.55), ConSys.defs.hh (1.74), ConSys.inlines.hh
+ (1.27), GenSys.cc (1.71), GenSys.defs.hh (1.85), Matrix.defs.hh
+ (1.38): We were violating the C++ standard by referring to
+ unaccessible base classes.
+
+2002-11-04 Monday 17:28 Elisa Ricci
+
+ * tests/: Makefile.am (1.156), affineimage7.cc (1.1),
+ affinepreimage9.cc (1.1), ascii_dump_load4.cc (1.8),
+ ascii_dump_load5.cc (1.5), ascii_dump_load6.cc (1.1): Added tests
+ to verify ascii_dump() and ascii_load() of SatMatrix and of
+ Status and to verify Polyhedron::affine_image() and
+ Polyhedron::affine_preimage() with a negative denominator.
+
+2002-11-04 Monday 12:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.55): Reposition a declaration that
+ was moved by mistake.
+
+2002-11-04 Monday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: Makefile.am (1.10), ciao_clpq.pl (1.1):
+ Little progress in the Ciao-Prolog interface.
+
+2002-11-04 Monday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.54): Improved comments for
+ Polyhedron::shrink_bounding_box().
+
+2002-11-04 Monday 11:36 Elisa Ricci
+
+ * src/Polyhedron.inlines.hh (1.53): In
+ Polyhedron::shrink_bounding_box() added the comment that explains
+ why we change the sign of `n' when we built the ExtendedRational
+ `r`.
+
+2002-11-04 Monday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.52): Avoid taking references to
+ temporary GMP expressions. FIXME about a missing comment added.
+
+2002-11-04 Monday 09:34 Elisa Ricci
+
+ * tests/: boundingbox3.cc (1.5), boundingbox4.cc (1.2): Modified
+ these tests so that they also verify
+ Polyhedron::shrink_bounding_box(box, POLYNOMIAL).
+
+2002-11-04 Monday 08:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.261): Avoid some useless copies.
+
+2002-11-03 Sunday 23:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.260): Avoid taking references to temporary
+ GMP expressions.
+
+2002-11-03 Sunday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.155), ascii_dump_load1.cc (1.9),
+ ascii_dump_load2.cc (1.7), ascii_dump_load3.cc (1.8),
+ ascii_dump_load4.cc (1.7), ascii_dump_load5.cc (1.4): Be
+ consistent in naming files.
+
+2002-11-03 Sunday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.46), Row.inlines.hh (1.34): Progress in
+ supporting compilers that do not provide flexible arrays.
+
+2002-11-03 Sunday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.68),
+ interfaces/Prolog/GNU/Makefile.am (1.24), m4/ac_check_gmp.m4
+ (1.6): For the sake of not very smart linkers, link with `-lgmpxx
+ -lgmp' instead of the other way around.
+
+2002-11-03 Sunday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: ascii_dump_load1.cc (1.8), ascii_dump_load2.cc (1.6),
+ ascii_dump_load3.cc (1.7), ascii_dump_load4.cc (1.6),
+ ascii_dump_load5.cc (1.3), linearpartition1.cc (1.6),
+ linearpartition2.cc (1.6), linearpartition3.cc (1.6), memory1.cc
+ (1.12), writeconsys1.cc (1.3), writegensys1.cc (1.4),
+ writegensys2.cc (1.4), writegensys3.cc (1.3), writepolyhedron1.cc
+ (1.3), writepolyhedron2.cc (1.4), writepolyhedron3.cc (1.3),
+ writerelation1.cc (1.3), writevariable1.cc (1.3): Be consistent
+ as far as inclusions are concerned.
+
+2002-11-03 Sunday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/pwl_header.middle (1.2): Include sys/time.h, if
+ available.
+
+2002-11-03 Sunday 10:56 Elisa Ricci
+
+ * tests/: Makefile.am (1.154), boundingbox3.cc (1.4),
+ boundingbox4.cc (1.1): Erased form boundingbox3.cc the flags
+ "C_TESTS" and "NNC_TESTS". boundingbox3.cc now contains only
+ tests with C_Polyhedron; the tests that were in boundingbox3.cc
+ and that contain polyhedron described by strict inequalities now
+ are in boundingbox4.cc.
+
+2002-11-03 Sunday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.10): Always use the current
+ C++ compiler, not simply `g++'.
+
+2002-11-03 Sunday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.defs.hh (1.7), Watchdog.inlines.hh (1.6):
+ Little cleaning.
+
+2002-11-03 Sunday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: config.h.in (1.3), configure.ac (1.11): Get rid of
+ AC_C_INLINE: we do not use inlines in C code and it was doing
+ harm with some compilers.
+
+2002-11-02 Saturday 23:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.50), ppl_c.h (1.50): The function
+ ppl_Polyhedron_shrink_bounding_box() has now a parameter allowing
+ the selection of the desired complexity class.
+
+2002-11-02 Saturday 23:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.25): Spurious line removed.
+
+2002-11-02 Saturday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.9): Can now compile the
+ Ciao-Prolog interface.
+
+2002-11-02 Saturday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.26): Properly declare all
+ the predicates.
+
+2002-11-02 Saturday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.11): Uninitialized variable
+ bug fixed.
+
+2002-11-02 Saturday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.10): Buggy conditional fixed.
+
+2002-11-02 Saturday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: adddimensions11.cc (1.2), addgenerators11.cc (1.3),
+ exceptions1.cc (1.25), exceptions2.cc (1.20): Avoid inventing
+ non-existing standard exceptions.
+
+2002-11-02 Saturday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.171), src/Polyhedron.inlines.hh (1.51),
+ src/globals.hh (1.24), tests/boundingbox1.cc (1.26),
+ tests/boundingbox2.cc (1.14): New enum Complexity_Class to
+ represent complexity classes. Polyhedron::shrink_bounding_box()
+ now takes a complexity class, defaulting to ANY, instead of a
+ bool.
+
+2002-11-02 Saturday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.49): Mention the bug fixed in operator-=(LinExpression&,
+ const LinExpression&).
+
+2002-11-02 Saturday 09:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.22), configure.ac (1.72): Get rid of AC_C_INLINE:
+ we do not use inlines in C code and it was doing harm with some
+ compilers.
+
+2002-11-01 Friday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.21), configure.ac (1.71), m4/ac_check_gmp.m4
+ (1.5): Much improved detection of the size of GMP's mp_limb_t.
+
+2002-11-01 Friday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc (1.14), SatRow.defs.hh (1.23): Got rid of
+ operator<<(std::ostream&, const SatRow&).
+
+2002-11-01 Friday 18:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.73), Constraint.defs.hh (1.77),
+ GenSys.defs.hh (1.84), Generator.defs.hh (1.80),
+ Poly_Con_Relation.defs.hh (1.18), Poly_Gen_Relation.defs.hh
+ (1.17), Polyhedron.defs.hh (1.170), Variable.defs.hh (1.27):
+ Correctly relate the output operators to the corresponding
+ classes.
+
+2002-11-01 Friday 18:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.24): There must be a more efficient way to implement bool
+ are_disjoint(const Polyhedron&, const Polyhedron&).
+
+2002-11-01 Friday 18:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+ NNCminimize3.cc (1.7), NNCminimize5.cc (1.6), ascii_dump_load3.cc
+ (1.6), ascii_dump_load4.cc (1.5), bbrz02widening13.cc (1.5),
+ bbrz02widening14.cc (1.6), bbrz02widening15.cc (1.5),
+ bbrz02widening9.cc (1.5), concatenate1.cc (1.4), exceptions1.cc
+ (1.24), generators1.cc (1.10), generators2.cc (1.6),
+ linearpartition1.cc (1.5), linearpartition2.cc (1.5),
+ linearpartition3.cc (1.5), memory1.cc (1.11), smm1.cc (1.9),
+ watchdog1.cc (1.12): It is pointless to say `using namespace std'
+ and `std::' at the same time.
+
+2002-11-01 Friday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.48), src/AskTell.defs.hh (1.10), src/AskTell.inlines.hh
+ (1.10), src/BoundingBox.cc (1.4), src/BoundingBox.defs.hh (1.8),
+ src/ConSys.cc (1.54), src/ConSys.defs.hh (1.72),
+ src/Constraint.cc (1.34), src/Constraint.defs.hh (1.76),
+ src/Determinate.defs.hh (1.22), src/Determinate.inlines.hh
+ (1.22), src/GenSys.cc (1.70), src/GenSys.defs.hh (1.83),
+ src/Generator.cc (1.41), src/Generator.defs.hh (1.79),
+ src/Interval.cc (1.5), src/Interval.defs.hh (1.10),
+ src/Poly_Con_Relation.cc (1.5), src/Poly_Con_Relation.defs.hh
+ (1.17), src/Poly_Gen_Relation.cc (1.5),
+ src/Poly_Gen_Relation.defs.hh (1.16), src/Polyhedron.cc (1.259),
+ src/Polyhedron.defs.hh (1.169), src/Polyhedron.types.hh (1.7),
+ src/PowerSet.defs.hh (1.21), src/PowerSet.inlines.hh (1.26),
+ src/SatRow.cc (1.13), src/SatRow.defs.hh (1.22), src/Variable.cc
+ (1.9), src/Variable.defs.hh (1.26), tests/NNCminimize4.cc (1.9),
+ tests/NNCminimize6.cc (1.8), tests/bbrz02widening13.cc (1.4),
+ tests/bbrz02widening14.cc (1.5), tests/bbrz02widening15.cc (1.4),
+ tests/bbrz02widening9.cc (1.4), tests/boundingbox1.cc (1.25),
+ tests/boundingbox2.cc (1.13), tests/linearpartition1.cc (1.4),
+ tests/linearpartition2.cc (1.4), tests/linearpartition3.cc (1.4),
+ tests/mc91.cc (1.8), tests/print.cc (1.3), tests/relations1.cc
+ (1.7), tests/relations10.cc (1.3), tests/relations11.cc (1.3),
+ tests/relations12.cc (1.2), tests/relations13.cc (1.2),
+ tests/relations14.cc (1.2), tests/relations15.cc (1.2),
+ tests/relations16.cc (1.2), tests/relations17.cc (1.3),
+ tests/relations18.cc (1.2), tests/relations2.cc (1.8),
+ tests/relations3.cc (1.8), tests/relations4.cc (1.8),
+ tests/relations5.cc (1.8), tests/relations6.cc (1.7),
+ tests/relations7.cc (1.7), tests/relations8.cc (1.7),
+ tests/relations9.cc (1.8), tests/smm1.cc (1.8),
+ tests/writeconsys1.cc (1.2), tests/writegensys1.cc (1.3),
+ tests/writegensys2.cc (1.3), tests/writegensys3.cc (1.2),
+ tests/writepolyhedron1.cc (1.2), tests/writepolyhedron2.cc (1.3),
+ tests/writepolyhedron3.cc (1.2), tests/writerelation1.cc (1.2),
+ tests/writevariable1.cc (1.2): All the input/output operators
+ have been confined into namespace
+ Parma_Polyhedra_Library::IO_Operators. This way they do not
+ conflict with the operators the user might want to define.
+
+2002-11-01 Friday 14:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.53): Exclude Topology.hh from the generation
+ of user's documentation.
+
+2002-11-01 Friday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: BBox.cc (1.1), BBox.hh (1.1), Makefile.am (1.153),
+ boundingbox1.cc (1.24), boundingbox2.cc (1.12), boundingbox3.cc
+ (1.3): Avoid code duplication and some spaghetti-code.
+
+2002-11-01 Friday 12:03 Elisa Ricci
+
+ * tests/: boundingbox1.cc (1.23), boundingbox3.cc (1.2): Added
+ operator<=(const BInterval& x, const BInterval& y) and
+ operator<=(const BBox& x, const BBox& y). In the tests, now we
+ verify also if nbox <= pbox.
+
+2002-11-01 Friday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.cc (1.4): Always include <iostream>.
+
+2002-10-31 Thursday 18:08 Elisa Ricci
+
+ * tests/: Makefile.am (1.152), boundingbox1.cc (1.22),
+ boundingbox3.cc (1.1): Modified the test boundingbox1.cc to use
+ only necessarily closed polyhedron and to test also
+ Polyhedron::shrink_bounding_box(Box& box, bool polynomial) when
+ polynomial is "true". Put the tests with not necessarily closed
+ polyhedra into boundingbox3.cc.
+
+2002-10-31 Thursday 18:02 Elisa Ricci
+
+ * src/: Interval.cc (1.3), Interval.defs.hh (1.9),
+ Interval.inlines.hh (1.6), Polyhedron.inlines.hh (1.50): Added
+ :operator<<(std::ostream& s, const ExtendedRational& x). In
+ ExtendedRational(const Integer& num, const Integer& den) we
+ temporary use `canonicalize()'. Added the part that we use if
+ the bounding box must be shrunk in polynomial time (if the
+ generator system of the polyhedron is not up-to-date).
+
+2002-10-30 Wednesday 21:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.49): Two problems with the current
+ implementation of Polyhedron::shrink_bounding_box() flagged.
+
+2002-10-30 Wednesday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.47), src/Polyhedron.defs.hh (1.168),
+ src/Polyhedron.inlines.hh (1.48): New boolean parameter for
+ template <typename Box> void Polyhedron::shrink_bounding_box(Box&
+ box, bool polynomial) const: when true it specifies the bounding
+ box must be shrunk in polynomial time.
+
+2002-10-30 Wednesday 17:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc, src/Polyhedron.defs.hh, tests/Makefile.am,
+ tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+ tests/stronglyminimize3.cc (alt_nnc.[26,10,8,4,4,4]): Got rid of
+ Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.258), src/Polyhedron.defs.hh (1.167),
+ tests/Makefile.am (1.151), tests/stronglyminimize1.cc (1.2),
+ tests/stronglyminimize2.cc (1.2), tests/stronglyminimize3.cc
+ (1.2): Got rid of Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:24 Elisa Ricci
+
+ * tests/: NNCminimize5.cc (1.5), NNCminimize6.cc (1.7),
+ addconstraints3.cc (1.6), generators1.cc (1.9), h79widening2.cc
+ (1.4), h79widening3.cc (1.4): Now these tests verify if the used
+ methods do the right thing.
+
+2002-10-30 Wednesday 17:18 Elisa Ricci
+
+ * tests/: Makefile.am (1.150), ascii_dump1.cc (1.2), operator1.cc
+ (1.1), writerelation1.cc (1.1): The test ascii_dump1.cc now is
+ called writerealtion1.cc, because it verifies operator<< of
+ Poly_Gen_Relation and Poly_Con_Relation. In operator1.cc put the
+ tests to verify operator>=(const Polyhedron& x, const Polyhedron&
+ y), operator>(const Polyhedron& x, const Polyhedron& y),
+ operator!=(const Polyhedron& x, const Polyhedron& y) and
+ operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-10-30 Wednesday 16:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.25): Duplicate `public' specification
+ removed.
+
+2002-10-30 Wednesday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.25): extra_linker_opts/1
+ directive added.
+
+2002-10-30 Wednesday 09:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.149), writegensys4.cc (1.2),
+ writevariable1.cc (1.1): Properly test operator<<(std::ostream&
+ s, const Variable& v) and the related machinery.
+
+2002-10-29 Tuesday 18:35 Elisa Ricci
+
+ * tests/: Makefile.am (1.148), writegensys4.cc (1.1): Added a test
+ to print a variable with id > 26.
+
+2002-10-29 Tuesday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.45), Row.defs.hh (1.57): Removed
+ operator<<(std::ostream&, const Row&).
+
+2002-10-29 Tuesday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.7): Updated.
+
+2002-10-29 Tuesday 14:49 Elisa Ricci
+
+ * tests/: Makefile.am (1.147), ascii_dump1.cc (1.1),
+ ascii_dump_load1.cc (1.7), ascii_dump_load2.cc (1.5),
+ ascii_dump_load3.cc (1.5), ascii_dump_load4.cc (1.4),
+ ascii_dump_load5.cc (1.2): Added some tests to verify
+ Poly_Gen_Relation::ascii_dump(), Poly_Gen_Relation::OK(),
+ Poly_Con_Relation::ascii_dump() and Poly_Con_Relation::OK().
+ Corrected the comment of the tests ascii_dump_load1.cc,
+ ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+ ascii_dump_load5.cc.
+
+2002-10-28 Monday 08:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LinExpression.cc (ppl-0_4-branch.1): Fixed a bug in
+ LinExpression::operator-=().
+
+2002-10-28 Monday 08:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, linexpression1.cc (ppl-0_4-branch.[5,1]):
+ This test shows a bug in LinExpression::operator-=().
+
+2002-10-26 Saturday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.70): Bump version number.
+
+2002-10-25 Friday 20:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (alt_nnc.8): Definitions of num_cons()
+ and num_gens().
+
+2002-10-25 Friday 19:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh, tests/hypercubes.cc (alt_nnc.[9,10]):
+ Added methods for printing sizes of (low-level) con_sys and
+ gen_sys.
+
+2002-10-25 Friday 18:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.25): n strong minimization of
+ constraints, force all strict inequalities to have the same
+ epsilon coefficient.
+
+2002-10-25 Friday 18:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.9): Test exploiting smf's.
+
+2002-10-25 Friday 12:42 Elisa Ricci
+
+ * tests/: Makefile.am (1.146), ascii_dump_load4.cc (1.3),
+ ascii_dump_load5.cc (1.1): Added some new test to verify
+ ascii_dump() and ascii_load().
+
+2002-10-24 Thursday 18:07 Elisa Ricci
+
+ * tests/: Makefile.am (1.145), ascii_dump_load4.cc (1.2),
+ writegensys3.cc (1.1): Added a new test to verify
+ operator<<(std::ostream&, const GenSys&). Erased form
+ ascii_dump_load4.cc an unused const char*.
+
+2002-10-24 Thursday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Init.defs.hh (1.7): Useless file inclusion removed.
+
+2002-10-24 Thursday 15:45 Elisa Ricci
+
+ * src/LinExpression.cc (1.15): Corrected the bug in
+ operator-=(LinExpression& e1, const LinExpression& e2): if
+ e1.size() < e2.size(), we compute a copy e of e1 with the
+ dimension of e2 and then we compute e - e2.
+
+2002-10-24 Thursday 15:09 Elisa Ricci
+
+ * tests/: Makefile.am (1.144), addgenerator4.cc (1.2),
+ linexpression1.cc (1.1): Now, the test addgenerator4.cc verifies
+ only Polyhedron::add_generator(g). The bug of
+ operator-=(LinExpression& e1, const LinExpression& e2) is now
+ reported in the test linexpression1.cc.
+
+2002-10-24 Thursday 14:37 Elisa Ricci
+
+ * tests/: Makefile.am (1.143), addgenerator4.cc (1.1): Added a test
+ for Polyhedron::add_generator(g). This test shows a bug in
+ operator-=(LinExpression& e1, const LinExpression& e2) if
+ e1.size() < e2.size().
+
+2002-10-23 Wednesday 12:19 Elisa Ricci
+
+ * src/Polyhedron.cc (alt_nnc.24): Corrected a problem in
+ Polyhedron::is_BBRZ02_stabilizing(x, y): the vector `x_num_rays'
+ must have `x.gen_sys.num_columns() - 1' elements and not
+ `x.space_dimension()'. We have done the same change for the
+ vector `y_num_rays'.
+
+2002-10-23 Wednesday 10:09 Elisa Ricci
+
+ * src/Polyhedron.cc (alt_nnc.23): Modified
+ Polyhedron::is_BBRZ02_stabilizing(x, y) so that if `x' and `y'
+ are not necessarily closed we compute the number of their points
+ and closure points and not only the number of their closure
+ points.
+
+2002-10-21 Monday 07:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am, smfintersection.cc, smfpolyhull.cc
+ (alt_nnc.[7,1,2]): Trying to better exploit smf's.
+
+2002-10-21 Monday 07:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.22): Disregarding the minusepsray when
+ performing strong minimization of consys.
+
+2002-10-19 Saturday 00:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * mkinstalldirs (1.5): Updated.
+
+2002-10-19 Saturday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: config.guess (1.1), config.sub (1.1), depcomp (1.1),
+ install-sh (1.1), ltmain.sh (1.1), missing (1.1), mkinstalldirs
+ (1.1): Missing files added.
+
+2002-10-18 Friday 17:02 Elisa Ricci
+
+ * src/: ConSys.cc (1.53), ConSys.defs.hh (1.71): Modified
+ ConSys:OK(): now we verify also if every row in the matrix is a
+ valid constraint.
+
+2002-10-18 Friday 16:46 Elisa Ricci
+
+ * tests/: Makefile.am (1.142), ascii_dump_load1.cc (1.6),
+ exceptions1.cc (1.23), writeconsys1.cc (1.1): The writeconsys1.cc
+ test verifies operator<<(s, cs). Added tests in exceptions1.cc
+ to verify Generator::coefficient() and Constraint::coefficient().
+ In ascii_dump_load1.cc erased an unused variable.
+
+2002-10-18 Friday 16:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/smfpolyhull.cc (alt_nnc.1): Put under CVS control.
+
+2002-10-18 Friday 10:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.21): Modified the widening operators
+ to also add the non-strict inequality corresponding to each
+ strict inequality added.
+
+2002-10-17 Thursday 18:33 Elisa Ricci
+
+ * tests/: exceptions1.cc (1.22), exceptions2.cc (1.19),
+ writegensys1.cc (1.2): Added some tests to verify
+ Generator::ray(), Generator::line(), Generator::closure_point(),
+ Generator::coefficient(), Generator::divisor() and operator<<(s,
+ g).
+
+2002-10-17 Thursday 18:30 Elisa Ricci
+
+ * src/Polyhedron.cc (1.257): In
+ Polyhedron::BBRZ02_widening_assign() and
+ Polyhedron::is_BBRZ02_stabilizing() debugging-purpose output made
+ silent. Modified Polyhedron::select_H79_constraints(y, cs) so
+ that when we use it the system of constraints has the right
+ topology.
+
+2002-10-17 Thursday 17:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.8): Now committed the right file I
+ was playing with.
+
+2002-10-17 Thursday 17:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am, hypercubes.cc (alt_nnc.[6,7]): Playing with
+ hypercubes and strong minimization.
+
+2002-10-17 Thursday 17:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.20): Debugging-purpose output made
+ silent.
+
+2002-10-17 Thursday 15:39 Elisa Ricci
+
+ * tests/: Makefile.am (1.141), ascii_dump_load4.cc (1.1),
+ relations18.cc (1.1), writepolyhedron3.cc (1.1): The
+ ascii_dump_load4.cc test verifies some particular cases of
+ ConSys::ascii_dump(s) and ConSys::ascii_load(s). The
+ relations18.cc test verifies Polyhedron::relation_with(g), where
+ "g" is a closure point and the system of constraints of the
+ polyhedron contains equalities. The writepolyhedron3.cc test
+ verifies operator<<(std::ostream&, const Polyhedron&) with an
+ universe polyhedron.
+
+2002-10-17 Thursday 11:20 Elisa Ricci
+
+ * tests/: ascii_dump_load1.cc (1.5), relations17.cc (1.2): Added
+ new tests and modified other tests to verify some other methods
+ of the class GenSys.
+
+2002-10-16 Wednesday 19:02 Elisa Ricci
+
+ * tests/writegensys2.cc (1.2): Now we print the system of
+ generators of an empty polyhedron.
+
+2002-10-16 Wednesday 19:00 Elisa Ricci
+
+ * tests/: Makefile.am (1.140), limitedbbrz02widening1.cc (1.2),
+ relations17.cc (1.1), writegensys1.cc (1.1), writegensys2.cc
+ (1.1): Added new tests for the methods of the class GenSys.
+ limitedbbrz02widening1.cc is now silent. Now we do not test
+ nnc_bbrz02widening4.cc and nnc_bbrz02widening7.cc because they
+ contains NNC polyhedra.
+
+2002-10-16 Wednesday 17:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.256): Fixed a topology problem in
+ select_H79_constraints().
+
+2002-10-16 Wednesday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/writepolyhedron2.cc (1.2): Inconsistent spacing fixed.
+
+2002-10-16 Wednesday 14:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.255), Polyhedron.defs.hh (1.166),
+ Polyhedron.inlines.hh (1.47): Added static member
+ add_low_level_constraints(ConSys&) to factorize common code
+ adding either the positivity or the epsilon-bound constraints.
+
+2002-10-16 Wednesday 14:36 Elisa Ricci
+
+ * tests/: Makefile.am (1.139), bbrz02widening19.cc (1.1),
+ limitedbbrz02widening1.cc (1.1), writepolyhedron2.cc (1.1): Added
+ new tests to verify some methods of the class Polyhedron.
+
+2002-10-16 Wednesday 09:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.6): Experimenting with closed
+ hypercubes from which we cut vertices using strict inequalities
+ and open duals of hypercubes to which we add (relatively open)
+ facets by adding points.
+
+2002-10-16 Wednesday 07:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.69): Handle unary plus:
+ previously, `+A = 1' could not be valid syntax for a constraint.
+
+2002-10-16 Wednesday 07:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.69): Version number bumped.
+
+2002-10-15 Tuesday 18:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.254): Debugging code in
+ Polyhedron::check_universe() fixed.
+
+2002-10-15 Tuesday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.138), writepolyhedron1.cc (1.1): Test
+ operator<<(std::ostream&, const Polyhedron&).
+
+2002-10-15 Tuesday 18:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.46), src/LinExpression.defs.hh (1.56),
+ src/LinExpression.inlines.hh (1.25): New function LinExpression
+ operator+(const LinExpression&): previously an expressions like
+ `+x2-x3-x4 <= 0' could not constitute valid syntax for a
+ constraint.
+
+2002-10-15 Tuesday 17:55 Elisa Ricci
+
+ * src/Polyhedron.cc (1.253): Modified Polyhedron::check_univers():
+ if we are considering a not necessarily closed polyhedron and if
+ its system of constraints contains only two rows that are not
+ equalities, we are sure that they are epsilon constraints.
+
+2002-10-15 Tuesday 17:48 Elisa Ricci
+
+ * tests/: Makefile.am (1.137), topclosure3.cc (1.1): Added a test
+ to verify Polyhedron::topological_closure_assign().
+
+2002-10-15 Tuesday 15:27 Elisa Ricci
+
+ * tests/: Makefile.am (1.136), adddimensions12.cc (1.1),
+ affineimage6.cc (1.1), affinepreimage8.cc (1.1), disjoint1.cc
+ (1.1), generalizedaffineimage11.cc (1.1),
+ generalizedaffineimage12.cc (1.1), limitedh79widening4.cc (1.1):
+ Added new tests for some methods of the class Polyhedron.
+
+2002-10-15 Tuesday 15:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+ config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+ doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+ doc/bib2html2.sed, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+ src/BoundingBox.defs.hh, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+ src/ConSys.defs.hh, src/Constraint.cc, src/Constraint.defs.hh,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/GenSys.cc, src/GenSys.defs.hh, src/Integer.defs.hh,
+ src/Integer.inlines.hh, src/LinExpression.cc,
+ src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+ src/Polyhedron.defs.hh, src/PowerSet.defs.hh,
+ src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+ src/SatMatrix.cc, src/SatMatrix.defs.hh, src/SatRow.cc,
+ src/SatRow.defs.hh, src/Status.cc, src/Status.defs.hh,
+ src/algorithms.hh, src/conversion.cc, src/globals.hh,
+ src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+ tests/addconstraint2.cc, tests/addconstraint3.cc,
+ tests/addconstraints10.cc, tests/addconstraints11.cc,
+ tests/addconstraints12.cc, tests/adddimensions11.cc,
+ tests/addgenerator3.cc, tests/addgenerators11.cc,
+ tests/affineimage3.cc, tests/affineimage4.cc,
+ tests/affineimage5.cc, tests/affinepreimage5.cc,
+ tests/affinepreimage6.cc, tests/affinepreimage7.cc,
+ tests/ascii_dump_load1.cc, tests/ascii_dump_load2.cc,
+ tests/ascii_dump_load3.cc, tests/bbrz02widening1.cc,
+ tests/bbrz02widening10.cc, tests/bbrz02widening11.cc,
+ tests/bbrz02widening12.cc, tests/bbrz02widening13.cc,
+ tests/bbrz02widening14.cc, tests/bbrz02widening15.cc,
+ tests/bbrz02widening16.cc, tests/bbrz02widening17.cc,
+ tests/bbrz02widening18.cc, tests/bbrz02widening6.cc,
+ tests/bbrz02widening7.cc, tests/bbrz02widening9.cc,
+ tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+ tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+ tests/generalizedaffineimage1.cc,
+ tests/generalizedaffineimage10.cc,
+ tests/generalizedaffineimage2.cc,
+ tests/generalizedaffineimage3.cc,
+ tests/generalizedaffineimage4.cc,
+ tests/generalizedaffineimage5.cc,
+ tests/generalizedaffineimage6.cc,
+ tests/generalizedaffineimage7.cc,
+ tests/generalizedaffineimage8.cc,
+ tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+ tests/intersection10.cc, tests/linearpartition1.cc,
+ tests/linearpartition2.cc, tests/linearpartition3.cc,
+ tests/mc91.cc, tests/memory1.cc, tests/minconstraints2.cc,
+ tests/minconstraints3.cc, tests/mingenerators2.cc,
+ tests/mingenerators3.cc, tests/polydifference7.cc,
+ tests/polyhull7.cc, tests/polyhull8.cc, tests/relations10.cc,
+ tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+ tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+ tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+ tests/stronglyminimize3.cc, tests/timeelapse6.cc,
+ tests/timeelapse7.cc, tests/topclosed3.cc, tests/topclosure2.cc
+ (alt_nnc.[3,6,4,3,5,3,5,3,3,3,3,3,3,4,3,3,3,3,3,6,6,4,4,4,5,4,4,3,4,4,4,4,4,5,5,5,8,7,7,7,7,7,10,7,4,4,4,5,5,4,4,5,5,4,5,4,5,19,8,6,6,4,5,4,5,3,5,4,5,3,4,5,5,4,5,3,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,4,4,4,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]):
+ Merged the changes on the main trunk within the tags
+ third_merge_to_alt_nnc and fourth_merge_to_alt_nnc.
+
+2002-10-15 Tuesday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+ config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+ doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+ doc/bib2html2.sed, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+ src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+ src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Integer.defs.hh,
+ src/Integer.inlines.hh, src/LinExpression.cc,
+ src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+ src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+ src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+ src/globals.hh, src/minimize.cc, src/simplify.cc,
+ tests/Makefile.am, tests/addconstraint2.cc,
+ tests/addconstraint3.cc, tests/addconstraints10.cc,
+ tests/addconstraints11.cc, tests/addconstraints12.cc,
+ tests/adddimensions11.cc, tests/addgenerator3.cc,
+ tests/addgenerators11.cc, tests/affineimage3.cc,
+ tests/affineimage4.cc, tests/affineimage5.cc,
+ tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+ tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+ tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+ tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+ tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+ tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+ tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+ tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+ tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+ tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+ tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+ tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+ tests/generalizedaffineimage1.cc,
+ tests/generalizedaffineimage10.cc,
+ tests/generalizedaffineimage2.cc,
+ tests/generalizedaffineimage3.cc,
+ tests/generalizedaffineimage4.cc,
+ tests/generalizedaffineimage5.cc,
+ tests/generalizedaffineimage6.cc,
+ tests/generalizedaffineimage7.cc,
+ tests/generalizedaffineimage8.cc,
+ tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+ tests/hypercubes.cc, tests/intersection10.cc,
+ tests/linearpartition1.cc, tests/linearpartition2.cc,
+ tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+ tests/minconstraints2.cc, tests/minconstraints3.cc,
+ tests/mingenerators2.cc, tests/mingenerators3.cc,
+ tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+ tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+ tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+ tests/relations16.cc, tests/stronglyminimize1.cc,
+ tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+ tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+ tests/topclosure2.cc
+ (alt_nnc.[2,5,3,2,4,2,4,2,2,2,2,2,2,3,2,2,2,2,2,5,5,3,3,3,4,3,3,2,3,3,3,3,3,4,4,3,4,7,6,5,6,6,5,6,6,9,6,7,7,5,3,3,3,4,4,3,3,4,4,3,4,3,4,18,7,7,5,5,3,4,3,4,2,4,3,4,2,3,4,4,3,4,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,5,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,5,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+ Erroneous merge undone.
+
+2002-10-15 Tuesday 12:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.67): Documentation for
+ ppl_Polyhedron_add_constraint_and_minimize ppl_Polyhedron_and
+ add_generator_and_minimize added.
+
+2002-10-15 Tuesday 12:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.10): Bug introduced in previous change
+ fixed.
+
+2002-10-15 Tuesday 10:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.20), configure.ac (1.68), tests/memory1.cc (1.10):
+ Portability improvements for memory-guarded programs. Mac OS X
+ is now supported. Operating systems not providing any mechanism
+ to limit memory usage are also supported.
+
+2002-10-15 Tuesday 09:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.252): Greatly simplified the
+ strongly_minimize() procedure.
+
+2002-10-15 Tuesday 08:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.30): Specify -lstdc++ in
+ splfr command invocation (this seems to help on Mac OS X).
+
+2002-10-15 Tuesday 08:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.9): Use
+ Polyhedron::add_constraint_and_minimize().
+
+2002-10-14 Monday 21:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+ config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+ doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+ doc/bib2html2.sed, doc/definitions.dox,
+ doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/Makefile.am,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+ src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+ src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+ src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Integer.defs.hh,
+ src/Integer.inlines.hh, src/LinExpression.cc,
+ src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+ src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+ src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+ src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+ src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+ src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+ src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+ src/globals.hh, src/minimize.cc, src/simplify.cc,
+ tests/Makefile.am, tests/addconstraint2.cc,
+ tests/addconstraint3.cc, tests/addconstraints10.cc,
+ tests/addconstraints11.cc, tests/addconstraints12.cc,
+ tests/adddimensions11.cc, tests/addgenerator3.cc,
+ tests/addgenerators11.cc, tests/affineimage3.cc,
+ tests/affineimage4.cc, tests/affineimage5.cc,
+ tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+ tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+ tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+ tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+ tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+ tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+ tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+ tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+ tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+ tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+ tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+ tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+ tests/generalizedaffineimage1.cc,
+ tests/generalizedaffineimage10.cc,
+ tests/generalizedaffineimage2.cc,
+ tests/generalizedaffineimage3.cc,
+ tests/generalizedaffineimage4.cc,
+ tests/generalizedaffineimage5.cc,
+ tests/generalizedaffineimage6.cc,
+ tests/generalizedaffineimage7.cc,
+ tests/generalizedaffineimage8.cc,
+ tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+ tests/hypercubes.cc, tests/intersection10.cc,
+ tests/linearpartition1.cc, tests/linearpartition2.cc,
+ tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+ tests/minconstraints2.cc, tests/minconstraints3.cc,
+ tests/mingenerators2.cc, tests/mingenerators3.cc,
+ tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+ tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+ tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+ tests/relations16.cc, tests/stronglyminimize1.cc,
+ tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+ tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+ tests/topclosure2.cc
+ (alt_nnc.[1,4,2,1,3,1,3,1,1,1,1,1,1,2,1,1,1,1,1,4,4,2,2,2,3,2,2,1,2,2,2,2,2,3,3,2,3,6,5,4,5,5,4,5,5,8,5,6,6,4,2,2,2,3,3,2,2,3,3,2,3,2,3,17,6,6,4,4,2,3,2,3,1,3,2,3,1,2,3,3,2,3,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,2,4,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Fourth merge from main trunk.
+
+2002-10-14 Monday 17:09 Elisa Ricci
+
+ * tests/: Makefile.am (1.135), addconstraint3.cc (1.1),
+ addgenerator3.cc (1.1): Added a test for
+ Polyhedron::add_constraint_and_minimize(c) and a test for
+ Polyhedron::add_generator_and_minimize(g).
+
+2002-10-14 Monday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.45), interfaces/C/ppl_c.cc (1.49), interfaces/C/ppl_c.h
+ (1.49), interfaces/Prolog/pl_check.pl (1.26),
+ interfaces/Prolog/ppl_prolog.icc (1.68),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.24),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.28),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.52),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.5),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.10),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.46), src/Polyhedron.cc
+ (1.251), src/Polyhedron.defs.hh (1.165): New methods bool
+ Polyhedron::add_constraint_and_minimize(const Constraint&) and
+ bool Polyhedron::add_generator_and_minimize(const Generator&) to
+ add a constraint or a generator and minimizing the result at the
+ same time.
+
+2002-10-14 Monday 14:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.44), interfaces/C/ppl_c.cc (1.48), interfaces/C/ppl_c.h
+ (1.48), interfaces/Prolog/Prolog_interface.dox (1.66),
+ interfaces/Prolog/pl_check.pl (1.25),
+ interfaces/Prolog/ppl_prolog.icc (1.67),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.23),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.27),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.51),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.4),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.9),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.45), src/Polyhedron.cc
+ (1.250), src/Polyhedron.defs.hh (1.164): New method void
+ Polyhedron::BBRZ02_limited_widening_assign(const Polyhedron&,
+ ConSys&). Both this and void
+ Polyhedron::BBRZ02_widening_assign(const Polyhedron&) are now
+ available through all the interfaces.
+
+2002-10-14 Monday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.67): We now require autoconf (at least) 2.54 and
+ automake (at least) 1.7.
+
+2002-10-14 Monday 12:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.66), interfaces/Prolog/SICStus/Makefile.am
+ (1.29): An hack that was necessary to build the SICStus Prolog
+ interface with SICStus 3.9.0 has been removed, since it prevented
+ us to build on Darwin. Consequently, we now require SICStus
+ 3.9.1 or later version.
+
+2002-10-14 Monday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.65): Bump version number.
+
+2002-10-13 Sunday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.6): Update to the latest version of libtool.
+
+2002-10-13 Sunday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.8): Bug fixed in widening_assign().
+
+2002-10-13 Sunday 16:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.75): We were too eager in converting
+ "<" and ">" to "\<" and "\>" in Doxygen comments: this should not
+ be done within LaTeX formulas.
+
+2002-10-12 Saturday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.35): Comment fixed for Doxygen.
+
+2002-10-12 Saturday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.9): Much improved portability.
+
+2002-10-12 Saturday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.19), configure.ac (1.64): Check for declarations
+ of RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS in
+ <sys/resource.h>.
+
+2002-10-12 Saturday 20:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.7): Two serious bugs have been fixed. Other
+ improvements.
+
+2002-10-12 Saturday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.21), Determinate.inlines.hh (1.21),
+ PowerSet.defs.hh (1.20), PowerSet.inlines.hh (1.25): New default
+ constructor.
+
+2002-10-12 Saturday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.103), src/AskTell.defs.hh (1.9),
+ src/C_Polyhedron.defs.hh (1.18), src/Constraint.defs.hh (1.74),
+ src/Determinate.defs.hh (1.20), src/NNC_Polyhedron.defs.hh
+ (1.20): Fix all but one of the problems reported by the new
+ version of Doxygen.
+
+2002-10-12 Saturday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/fdl.dox (1.2), doc/gpl.dox (1.3),
+ interfaces/Prolog/Prolog_interface.dox (1.65): Sectioning fixed.
+
+2002-10-12 Saturday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: bib2dox (1.2), bib2html1.sed (1.1), bib2html2.sed (1.1),
+ bib2html2dox.sed (1.2), definitions.dox (1.102): Improvements to
+ the machinery we use to build the bibliography section of the
+ documentation.
+
+2002-10-11 Friday 18:41 Elisa Ricci
+
+ * tests/: Makefile.am (1.134), stronglyminimize1.cc (1.1),
+ stronglyminimize2.cc (1.1), stronglyminimize3.cc (1.1): Added
+ three tests for Polyhedron::strongly_minimize().
+
+2002-10-11 Friday 18:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.44): Use the new C interface
+ provided by YAP.
+
+2002-10-11 Friday 16:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.64): Mention other
+ problems we had with the GNU Prolog interface.
+
+2002-10-11 Friday 12:53 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.163): Polyhedron::strongly_minimize()
+ is now public, but the user can not see its documentation.
+
+2002-10-11 Friday 11:49 Elisa Ricci
+
+ * tests/: Makefile.am (1.133), addconstraint2.cc (1.1),
+ concatenate5.cc (1.1), intersection10.cc (1.1),
+ polydifference7.cc (1.1), polyhull8.cc (1.1): Added these tests
+ to verify some methods of the class Polyhedron in the case of
+ empty or zero dimensional polyhedron.
+
+2002-10-11 Friday 11:46 Elisa Ricci
+
+ * tests/generalizedaffineimage10.cc (1.2): Added two tests to
+ verify Polyhedron::generalized_affine_image(lhs, r, rhs) when the
+ set of variables of left hand side and the set of the variable of
+ the right hand side are disjoint.
+
+2002-10-10 Thursday 17:47 Elisa Ricci
+
+ * tests/: Makefile.am (1.132), generalizedaffineimage10.cc (1.1):
+ Added a new test for Polyhedron::generalized_affine_image(lhs, r,
+ rhs).
+
+2002-10-10 Thursday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.249): Do not use vector<bool>.
+
+2002-10-10 Thursday 11:20 Elisa Ricci
+
+ * src/Polyhedron.cc (1.248): Some improvements to the third
+ technique of Polyhedron::BBRZ02_widening_assign(): - the test
+ y.relation_with(x_g) == Poly_Gen_Relation::nothing() is done
+ after testing if x_g is a ray; - corrected the test of the
+ elements of the vector "considered"; - now we use a const
+ reference x_g (for x.gen_sys[i]) to find how it evolved since a
+ ray of "y" and a copy of "x_g" to built the new ray. Use
+ "H79_con_sys" instead of "common_con_sys" in
+ Polyhedron::BBRZ02_widening_assign() and in
+ Polyhedron::H79_widening_assign().
+
+2002-10-10 Thursday 10:35 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.247), Polyhedron.defs.hh (1.162): Improved
+ the messages of the exceptions.
+
+2002-10-09 Wednesday 20:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/addgenerators11.cc (1.2): Be quiet.
+
+2002-10-09 Wednesday 17:59 Elisa Ricci
+
+ * tests/: bbrz02widening13.cc (1.3), bbrz02widening14.cc (1.4),
+ bbrz02widening15.cc (1.3), bbrz02widening9.cc (1.3): Added the
+ "known_result" to verify if the resulting polyhedron is equal to
+ the polyhedron that we want to have.
+
+2002-10-09 Wednesday 14:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.24): Problem due to bug in GNU
+ Prolog now avoided by delaying as much as possible any reference
+ to variables that are intended to be bound to polyhedral handles.
+
+2002-10-09 Wednesday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/algorithms.hh (1.6): poly_hull_assign_if_exact(p,q) now
+ return true if the poly-hull is exact.
+
+2002-10-09 Wednesday 10:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.73), Polyhedron.defs.hh (1.161):
+ Escaped a few ">" and "<" occurring inside HTML tags.
+
+2002-10-09 Wednesday 10:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.101): "<" and ">" inside HTMK tags have to
+ be escaped by "\".
+
+2002-10-09 Wednesday 09:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.131), bbrz02widening18.cc (1.1): New test
+ for bbrz02widening18, showing that we fall back to H79 when we
+ may have obtained more precise results by combining H79 and the
+ bbrz02 heuristics.
+
+2002-10-09 Wednesday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.20): Use the `-d Validate' option of doxygen
+ (and see the resulting disaster).
+
+2002-10-08 Tuesday 12:29 Elisa Ricci
+
+ * src/Polyhedron.cc (1.246), tests/Makefile.am (1.130),
+ tests/bbrz02widening16.cc (1.1), tests/bbrz02widening17.cc (1.1):
+ Improved the third technique: the rays that we want to add are
+ modified so that they satisfy the constraints of
+ "common_con_sys". Added to test to verify these changes.
+
+2002-10-08 Tuesday 09:24 Elisa Ricci
+
+ * src/Polyhedron.cc (1.245): Modified
+ Polyhedron::is_BBRZ02_stabilizing(): if the number of points (or
+ closure points) of `y' is smaller than the number of points of
+ `x', the chain is not stabilizing.
+
+2002-10-07 Monday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.129), ascii_dump_load1.cc (1.4),
+ ascii_dump_load2.cc (1.4), ascii_dump_load3.cc (1.4): Write files
+ in the current directory. Make sure the current directory is
+ also properly cleaned afterwards.
+
+2002-10-07 Monday 17:16 Elisa Ricci
+
+ * src/Polyhedron.cc (1.244): Made a little improvement to the third
+ technique of Polyhedron::BBRZ02_widening_assign(): we built a
+ temporary system of generators and then we use
+ Polyhedron::add_generators_and_minimize() to add this system to
+ the polyhedron `x'.
+
+2002-10-07 Monday 16:07 Elisa Ricci
+
+ * src/Polyhedron.cc (1.243): Corrected an error in the second
+ technique of Polyhedron::BBRZ02_widening_assign(): we add the
+ system of generators `valid_rays' if the new ray has all
+ homogeneous coefficients equal to zero or if adding only a ray
+ there is not stabilization.
+
+2002-10-07 Monday 14:38 Elisa Ricci
+
+ * src/Polyhedron.cc (1.242): Modified the second technique of
+ Polyhedron::BBRZ02_widening_assign() so that before we add only
+ the averaged ray and if the result is not stabilizing we add all
+ the rays of `valid_rays'.
+
+2002-10-07 Monday 12:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.241): In is_BBRZ02_stabilizing(), corrected
+ a bug in the test on stabilization based on number of rays.
+
+2002-10-07 Monday 11:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.24), ppl_prolog.icc (1.66),
+ Ciao/ppl_ciao.pl (1.22), GNU/ppl_gprolog.pl (1.18),
+ SICStus/ppl_sicstus_sd.cc (1.26), SWI/ppl_swiprolog.cc (1.50),
+ XSB/ppl_xsb.H (1.3), XSB/ppl_xsb.cc (1.8), YAP/ppl_yap.cc (1.43):
+ Added ppl_Polyhedron_is_disjoint_from_Polyhedron/2 to Prolog
+ interface. Tests for this added to pl_check.pl
+
+2002-10-07 Monday 11:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.240): Modified method
+ Polyhedron::is_BBRZ02_stabilizing(x, y) so that: - we check for
+ a decreasing number of rays lying inside the faces of an
+ orthant. - we check whether x and y do happens to be the same
+ polyhedron. Modified method
+ Polyhedron::BBRZ02_widening_assign(y) to apply, as a last resort,
+ the widening H79.
+
+2002-10-07 Monday 11:19 Elisa Ricci
+
+ * tests/: ascii_dump_load3.cc (1.3), bbrz02widening1.cc (1.3),
+ bbrz02widening12.cc (1.2), exceptions1.cc (1.21), exceptions2.cc
+ (1.18): Modified these tests so that there is only a
+ `set_handlers()' for each test.
+
+2002-10-07 Monday 10:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.160): In the Doxygen documentation of
+ affine (pre)-image operators, fixed a couple of mismatches in the
+ naming of parameters.
+
+2002-10-07 Monday 07:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.20): PH&
+ Determinate<PH>::polyhedron() fixed: it was not calling mutate().
+
+2002-10-06 Sunday 22:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.5): Added a tentative, inefficient
+ implementation for template <typename PH> bool
+ poly_hull_assign_if_exact(PH& p, const PH& q): if the poly-hull
+ of `p' and `q' is exact, assigns it to `p' and returns `true'; it
+ returns false otherwise.
+
+ Added a tentative implementation for template <typename PH> void
+ complete_reduction(PowerSet<Determinate<PH> >& p): it collapses
+ all the elements of `p' that can be poly-hulled without loss of
+ precision.
+
+ Added tentative implementations of template <typename PH> void
+ H79_widening_assign(PowerSet<Determinate<PH> >& r, const
+ PowerSet<Determinate<PH> >& q) and template <typename PH> void
+ BBRZ02_widening_assign(PowerSet<Determinate<PH> >& r, const
+ PowerSet<Determinate<PH> >& q): they are meant to generalize the
+ widenings on polyhedra to sets of polyhedra.
+
+2002-10-06 Sunday 22:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.19), Determinate.inlines.hh (1.19):
+ Added PH& polyhedron().
+
+2002-10-06 Sunday 22:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: linearpartition1.cc (1.3), linearpartition2.cc (1.3),
+ linearpartition3.cc (1.3): Reduce the scope of declarations.
+
+2002-10-06 Sunday 20:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: linearpartition2.cc (1.2), linearpartition3.cc (1.2):
+ Made quiet.
+
+2002-10-06 Sunday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.128), linearpartition2.cc (1.1),
+ linearpartition3.cc (1.1): Test linear_partition() with two
+ disjoint polyhedra and with two telescopic polyhedra.
+
+2002-10-06 Sunday 19:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.4): Relax the limitations of
+ linear_partition().
+
+2002-10-06 Sunday 18:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.239): Many (small) improvements in the
+ implementation of the 2nd technique of BBRZ02_widening_assign().
+
+2002-10-06 Sunday 10:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.100): Bibliography added (perhaps not at
+ the right place).
+
+2002-10-06 Sunday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: bib2dox (1.1), bib2html2dox.sed (1.1): A tool to convert a
+ BibTeX file into something suitable for inclusion into the
+ Doxygen documentation.
+
+2002-10-06 Sunday 09:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.3): Comment slightly improved.
+
+2002-10-06 Sunday 09:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.23),
+ devref-print.doxyconf-latex.in (1.23), devref.doxyconf-html.in
+ (1.24): Include `algorithms.hh' in the sources used to create the
+ developer's reference manual.
+
+2002-10-06 Sunday 09:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.99): Use the condition
+ `Include_Implementation_Details' instead of
+ `Implementation_Info'.
+
+2002-10-06 Sunday 09:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.8): A few minor improvements.
+
+2002-10-05 Saturday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/algorithms.hh (1.2): Include implementation details for
+ linear_partition().
+
+2002-10-05 Saturday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/linearpartition1.cc (1.2): Be quiet.
+
+2002-10-05 Saturday 22:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bbrz02widening13.cc (1.2), bbrz02widening14.cc (1.3):
+ Made silent.
+
+2002-10-05 Saturday 22:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.238), Polyhedron.defs.hh (1.159): Added
+ new private method void Polyhedron::select_H79_constraints(const
+ Polyhedron& y, ConSys&
+ cs_selection) const; that selects the common constraints of *this
+ and y (into cs_selection) according to H79. Used the method both
+ in H79_widening and in BBRZ02_widening. Modified the second
+ technique of BBRZ02 to have more chances that it will produce a
+ stabilizing sequence of polyhedra. Added a few outputs for the
+ debugging of BBRZ02_widening.
+
+2002-10-05 Saturday 20:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.52), src/algorithms.hh (1.1),
+ tests/Makefile.am (1.127), tests/linearpartition1.cc (1.1): New
+ function template <typename PH> std::pair<PH,
+ PowerSet<Determinate<NNC_Polyhedron> > > linear_partition(const
+ PH& p, const PH& q) computing a partition of `q' with respect to
+ `p'.
+
+2002-10-05 Saturday 20:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.18), Determinate.inlines.hh (1.18):
+ Added const PH& polyhedron() const.
+
+2002-10-05 Saturday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.47), ppl_c.h (1.47): The function int
+ ppl_Polyhedron_is_disjoint_from_Polyhedron() makes the
+ disjointness test for polyhedra available to the C interface.
+
+2002-10-05 Saturday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.43), src/Polyhedron.cc (1.237), src/Polyhedron.defs.hh
+ (1.158): New function bool are_disjoint(const Polyhedron&, const
+ Polyhedron&) returning true if and only if the two polyhedra are
+ disjoint.
+
+2002-10-05 Saturday 18:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.157): All the relational operators on
+ polyhedra are now commented the same way.
+
+2002-10-05 Saturday 17:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.19), PowerSet.inlines.hh (1.24): The
+ default constructor now builds an empty (bottom) PowerSet.
+
+2002-10-05 Saturday 16:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: BoundingBox.defs.hh (1.7), ConSys.cc (1.52), ConSys.defs.hh
+ (1.70), Constraint.cc (1.33), Constraint.defs.hh (1.72),
+ Determinate.defs.hh (1.17), GenSys.cc (1.69), GenSys.defs.hh
+ (1.82), Generator.cc (1.40), Generator.defs.hh (1.78),
+ Matrix.defs.hh (1.37), Poly_Con_Relation.defs.hh (1.16),
+ Poly_Gen_Relation.defs.hh (1.15), Polyhedron.cc (1.236),
+ Polyhedron.defs.hh (1.156), PowerSet.defs.hh (1.18), Row.cc
+ (1.44), Row.defs.hh (1.56), SatMatrix.cc (1.22),
+ SatMatrix.defs.hh (1.26), SatRow.cc (1.12), SatRow.defs.hh
+ (1.21), Status.cc (1.16), Status.defs.hh (1.23), conversion.cc
+ (1.34), minimize.cc (1.25), simplify.cc (1.19): Started enforcing
+ STANDARDS rules as far as the doxygen documentation is concerned:
+ - added a \brief declaration where needed; - cut detailed
+ doxygen comments from *.cc files and pasted in *.defs.hh files
+ (with the exceptions of conversion, minimize and simplify); -
+ started using the conditional section
+ Include_Implementation_Details; - avoided using \fn declaration
+ where it is not needed (it was also causing problems since it
+ does not support line breaks); - fixed some problems with the
+ naming of doxygen documentation groups.
+
+2002-10-05 Saturday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/mc91.cc (1.7): Fixed and made quiet.
+
+2002-10-05 Saturday 12:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.23): Fixed a couple of bugs concerning
+ space dimensions.
+
+2002-10-05 Saturday 10:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.17), PowerSet.inlines.hh (1.22): The
+ default constructor for PowerSet now takes the dimension of the
+ enclosing space as an optional parameter, defaulting to zero.
+
+2002-10-05 Saturday 10:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.68), Polyhedron.cc (1.235): Added missing
+ \relates doxygen declarations.
+
+2002-10-05 Saturday 10:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.33): Added a missing namespace qualification
+ in the doxygen comment.
+
+2002-10-05 Saturday 10:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.51), ConSys.defs.hh (1.69): According to
+ STANDARDS, moved doxygen documentation in the header file. Added
+ a missing \relates declaration to avoid a doxygen warning.
+
+2002-10-05 Saturday 10:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.22),
+ devref-print.doxyconf-latex.in (1.22), devref.doxyconf-html.in
+ (1.23): Added Include_Implementation_Details in the
+ ENABLED_SECTIONS of the developer reference.
+
+2002-10-05 Saturday 10:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.7): Added specification on how to integrate an
+ end-user comment block with further comments for the developer
+ only.
+
+2002-10-04 Friday 23:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.42): Notified new function for manipulation
+ LinExpression's.
+
+2002-10-04 Friday 23:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: bbrz02widening14.cc (1.2), bbrz02widening15.cc (1.2):
+ Tests made silent.
+
+2002-10-04 Friday 22:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.98): Cut away previous spurious commit on
+ the specification of generalized affine image. Added a missing
+ transposition sign.
+
+2002-10-04 Friday 22:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.63): Typo corrected:
+ closure-point ==> closure_point.
+
+2002-10-04 Friday 19:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.10): Updated.
+
+2002-10-04 Friday 19:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.41): Report the news for PPL 0.4.2.
+
+2002-10-04 Friday 18:53 Elisa Ricci
+
+ * src/Polyhedron.cc (1.234): Modified the second technique of
+ Polyhedron::BBRZ02_widening_assign(): we add all the chosen rays
+ that satisfy the system of constraints `common_con_sys' to the
+ system of generators of `x'.
+
+2002-10-04 Friday 18:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.126), bbrz02widening14.cc (1.1),
+ bbrz02widening15.cc (1.1): Added two new tests. The first one is
+ similar to bbrz02widening13, but this time the limit of the chain
+ of polyhedra is a bounded polyhedron. The second one is similar
+ to the first one, but it is based on a chain of polyhedral cones.
+
+2002-10-04 Friday 18:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.cc (1.14), LinExpression.defs.hh (1.55):
+ Added new function LinExpression& operator*=(LinExpression& e,
+ const Integer& n); to multiply (in place) a given expression by
+ an Integer constant.
+
+2002-10-04 Friday 15:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.97), tests/Makefile.am (1.125),
+ tests/bbrz02widening13.cc (1.1): Added a new test for the bbrz02
+ widening.
+
+2002-10-04 Friday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[3,7]): Mark
+ ChangeLog.
+
+2002-10-04 Friday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.6): Updated.
+
+2002-10-04 Friday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.16): Require GCC 3.2 or later, require GMP 4.1 or
+ later version.
+
+2002-10-04 Friday 10:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (ppl-0_4-branch.1): Require GCC 3.2 or later version.
+
+2002-10-04 Friday 09:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.5): Updated.
+
+2002-10-04 Friday 09:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_4-branch.4): Version number bumped.
+
+2002-10-04 Friday 09:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_4-branch.7): Try to release today.
+
+2002-10-03 Thursday 17:58 Elisa Ricci
+
+ * tests/: Makefile.am (1.124), exceptions1.cc (1.20),
+ exceptions2.cc (1.17), generalizedaffineimage9.cc (1.1): Added
+ some new tests for Polyhedron::generalized_affine_image(lhs, r,
+ rhs).
+
+2002-10-03 Thursday 15:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.123), ascii_dump_load1.cc (1.3),
+ ascii_dump_load2.cc (1.3), files.cc (1.2), files.hh (1.2):
+ Several improvements.
+
+2002-10-03 Thursday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.122), ascii_dump_load3.cc (1.2), files.cc
+ (1.1), files.hh (1.1): Avoid spaghetti-coding.
+
+2002-10-03 Thursday 15:01 Elisa Ricci
+
+ * tests/generalizedaffineimage7.cc (1.3): Corrected the test: we
+ want "return 1" if there is at least a test that exits with
+ "return 1".
+
+2002-10-03 Thursday 12:23 Elisa Ricci
+
+ * tests/: Makefile.am (1.121), ascii_dump_load2.cc (1.2),
+ ascii_dump_load3.cc (1.1): Added a new test for
+ Polyhedron::ascii_dump() and Polyhedron::ascii_load(). Corrected
+ an error in the comment of ascii_dump_load2.cc.
+
+2002-10-03 Thursday 12:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.233), src/Polyhedron.defs.hh (1.155),
+ tests/generalizedaffineimage1.cc (1.4),
+ tests/generalizedaffineimage7.cc (1.2): When the lhs of the
+ generalized affine image is an arbitrary LinExpression, there is
+ no need of having a denominator for the rhs.
+
+2002-10-03 Thursday 12:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.96): Added missing transposition signs in
+ documentation of affine images. Improved comment of generalized
+ affine images.
+
+2002-10-03 Thursday 11:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.40): Reported the bug on minimization of
+ zero-dim-universe NNC polyhedra.
+
+2002-10-03 Thursday 11:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (1.50): Fixed a couple of comments.
+
+2002-10-03 Thursday 10:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS, doc/definitions.dox, src/ConSys.cc, src/Polyhedron.cc,
+ tests/Makefile.am, tests/minconstraints1.cc,
+ tests/minconstraints2.cc, tests/minconstraints3.cc,
+ tests/mingenerators1.cc, tests/mingenerators2.cc,
+ tests/mingenerators3.cc (ppl-0_4-branch.[6,1,4,7,4,1,1,1,1,1,1]):
+ Reported on the branch a couple of bugfixes and corresponding
+ tests.
+
+2002-10-03 Thursday 09:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.95): Corrected the definition of affine
+ preimage.
+
+2002-10-03 Thursday 04:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.13), config.sub (1.12): Updated.
+
+2002-10-02 Wednesday 17:32 Elisa Ricci
+
+ * tests/: Makefile.am (1.120), ascii_dump_load2.cc (1.1): Added a
+ new test to verify Polyhedron::ascii_load() and
+ Polyhedron::ascii_dump().
+
+2002-10-02 Wednesday 16:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.232): Fixed a typo in a comment.
+
+2002-10-02 Wednesday 16:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.231): The implementation of
+ generalized_affine_image(lhs, rel, rhs, denom) now handles some
+ special cases in a more efficient way.
+
+2002-10-02 Wednesday 16:14 Elisa Ricci
+
+ * src/Polyhedron.cc (1.230): In
+ Polyhedron::strongly_minimize_constraints() and
+ Polyhedron::strongly_minimize_generators() corrected the bug
+ shown by minconstraints3.cc and mingenerators3.cc: now we verify
+ if the polyhedron is not empty and zero-dimensional.
+
+2002-10-02 Wednesday 16:10 Elisa Ricci
+
+ * tests/: Makefile.am (1.119), minconstraints3.cc (1.1),
+ mingenerators3.cc (1.1): The test minconstraints3.cc shows a bug
+ in Polyhedron::strongly_minimize_constraints(). The test
+ mingenerators3.cc shows a bug in
+ Polyhedron::strongly_minimize_generators().
+
+2002-10-02 Wednesday 15:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.118): Expect addgenerators11 to fail.
+
+2002-10-02 Wednesday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/exceptions1.cc (1.19): Fixed a few comments on tests about
+ generalized_affine_image.
+
+2002-10-02 Wednesday 14:40 Elisa Ricci
+
+ * tests/generalizedaffineimage8.cc (1.2): Corrected an error in the
+ comment of the test: the relation is `>' and not `<'.
+
+2002-10-02 Wednesday 14:39 Elisa Ricci
+
+ * tests/: Makefile.am (1.117), generalizedaffineimage8.cc (1.1):
+ Added a new test for Polyhedron::generalized_affine_image(v, r,
+ e, d) in the case of non necessarily closed polyhedron and the
+ relation `>'.
+
+2002-10-02 Wednesday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.18), exceptions2.cc (1.16): Adapted to
+ the new interface of Polyhedron::generalized_affine_image().
+
+2002-10-02 Wednesday 14:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.116), generalizedaffineimage3.cc (1.4),
+ generalizedaffineimage7.cc (1.1): Added a new test for method
+ Polyhedron::generalized_affine_image(lhs, relop, rhs, denum)
+ checking that, when lhs has a single variable, the current
+ implementation does have the same behavior of
+ Polyhedron::generalized_affine_image(var, relop, rhs, denum).
+
+2002-10-02 Wednesday 14:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.115): Specify the source for
+ addgenerators11.
+
+2002-10-02 Wednesday 14:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.114), addgenerators11.cc (1.1): New test
+ for Polyhedron::add_generators_and_minimize().
+
+2002-10-02 Wednesday 12:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.229), src/Polyhedron.defs.hh (1.154),
+ src/globals.hh (1.23), tests/generalizedaffineimage1.cc (1.3),
+ tests/generalizedaffineimage2.cc (1.3),
+ tests/generalizedaffineimage3.cc (1.3),
+ tests/generalizedaffineimage4.cc (1.2),
+ tests/generalizedaffineimage5.cc (1.2),
+ tests/generalizedaffineimage6.cc (1.2): Added enumeration
+ Relation_Operator to encode the operator <, <=, ==, >=, >. Used
+ the enumeration to specify the relation operator of methods
+ Polyhedron::generalized_affine_image(). Patched the tests to use
+ the enumeration instead of string encodings.
+
+2002-10-02 Wednesday 12:05 Elisa Ricci
+
+ * src/ConSys.cc (1.49): Modified
+ ConSys::adjust_topology_and_dimension() so that if the system of
+ constraints was sorted, does not contains strict inequalities and
+ is not necessarily closed and if the new topology is
+ NECESSARILY_CLOSED, we sort the system again.
+
+2002-10-02 Wednesday 11:20 Elisa Ricci
+
+ * src/ConSys.cc (1.48), tests/Makefile.am (1.113),
+ tests/addconstraints12.cc (1.1): Corrected an error in
+ ConSys::adjust_topology_and_dimension: now we erase the
+ constraints 0 <= \epsilon <= 1 if the system of constraints does
+ not contains strict inequalities and is not necessarily closed
+ and the new topology is NECESSARILY_CLOSED. Added a test to
+ verify this function.
+
+2002-10-02 Wednesday 10:19 Elisa Ricci
+
+ * tests/topclosed3.cc (1.3): Added the comment to explain what this
+ test does.
+
+2002-10-02 Wednesday 09:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/topclosed3.cc (1.2): New test made silent.
+
+2002-10-02 Wednesday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.112), topclosed3.cc (1.1): Added a new
+ test on the topological closure check. It shows that an
+ unmatched closure point lying on the same line of a point, after
+ performing minimization, is converted by back_substitute() into
+ the corresponding matched closure point: this property is needed
+ to ensure the correctness of the current implementation.
+
+2002-10-01 Tuesday 21:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.228), tests/Makefile.am (1.111),
+ tests/generalizedaffineimage6.cc (1.1): Added a first draft
+ implementation for method
+ Polyhedron::generalized_affine_image(const LinExpression& lhs,
+ const char* relation,
+ const LinExpression& rhs,
+ const Integer& denominator);
+ Added a first test to check if it works.
+
+2002-10-01 Tuesday 14:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.94), src/Polyhedron.cc (1.227),
+ src/Polyhedron.defs.hh (1.153): The specification of the
+ generalized affine image operator further generalized to allow
+ for an arbitrary affine expression in the lhs. Added the
+ declaration of this generalization (with a void implementation).
+
+2002-10-01 Tuesday 11:56 Elisa Ricci
+
+ * tests/: bbrz02widening6.cc (1.3), bbrz02widening7.cc (1.3):
+ Modified the polyhedron `known_result' according to the changes
+ of Polyhedron::BBRZ02_widening_assign().
+
+2002-10-01 Tuesday 11:22 Elisa Ricci
+
+ * src/Polyhedron.cc (1.226), tests/Makefile.am (1.110),
+ tests/generalizedaffineimage5.cc (1.1): Corrected an error in
+ Polyhedron::generalized_affine_image(). Added a test to verify
+ this function.
+
+2002-09-30 Monday 11:32 Elisa Ricci
+
+ * tests/: Makefile.am (1.109), affinepreimage6.cc (1.2),
+ affinepreimage7.cc (1.1), exceptions1.cc (1.17), exceptions2.cc
+ (1.15), polyhull7.cc (1.1): Added new tests for some methods of
+ the class Polyhedron. Corrected a comment in the test
+ affinepreimage6.cc.
+
+2002-09-29 Sunday 15:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.cc (1.47), src/ConSys.defs.hh (1.68), src/GenSys.cc
+ (1.67), src/GenSys.defs.hh (1.81), src/Matrix.cc (1.44),
+ src/Matrix.defs.hh (1.36), src/Poly_Con_Relation.cc (1.4),
+ src/Poly_Con_Relation.defs.hh (1.15), src/Poly_Gen_Relation.cc
+ (1.4), src/Poly_Gen_Relation.defs.hh (1.14), src/Polyhedron.cc
+ (1.225), src/Polyhedron.defs.hh (1.152), src/SatMatrix.cc (1.21),
+ src/SatMatrix.defs.hh (1.25), src/Status.cc (1.15),
+ src/Status.defs.hh (1.22), tests/ascii_dump_load1.cc (1.2): The
+ ASCII_dump() and ASCII_load() methods have been renamed
+ ascii_dump() and ascii_load().
+
+2002-09-29 Sunday 11:16 Elisa Ricci
+
+ * src/Status.cc (1.14), tests/Makefile.am (1.108),
+ tests/ascii_dump_load1.cc (1.1): Corrected an error in
+ Status::ASCII_load(std::istream& s). Added a test to verify
+ Polyhedron::ASCII_dump(std::ostream& s) and
+ Polyhedron::ASCII_load(std::istream& s).
+
+2002-09-27 Friday 20:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.39), tests/affineimage5.cc (1.2): Test affineimage5 made
+ silent. The bug affecting affine_image() could have produced
+ wrong results (not just violate a library invariant).
+
+2002-09-27 Friday 20:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS, src/ConSys.cc, src/GenSys.cc, src/Polyhedron.cc,
+ tests/Makefile.am, tests/affineimage4.cc, tests/affineimage5.cc
+ (ppl-0_4-branch.[5,3,3,6,3,1,1]): The correction of the bug
+ affecting Polyhedron::affine_image() and
+ Polyhedron::affine_preimage() reported on ppl-0_4-branch.
+
+2002-09-27 Friday 15:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.93), src/Polyhedron.defs.hh (1.151): Fixed
+ documentation reference for the generalized_affine_image
+ operator.
+
+2002-09-27 Friday 15:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.224): Methods Polyhedron::affine_image() and
+ Polyhedron::affine_preimage() now only call
+ ConSys::affine_preimage() and GenSys::affine_image() with a
+ strictly positive denominator. Added draft implementation of
+ generalized_affine_image() for the case of a strict relation
+ operator (only for NNC polyhedra).
+
+2002-09-27 Friday 15:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.46), GenSys.cc (1.66): Private methods
+ ConSys::affine_preimage() and GenSys::affine_image() now assume
+ that the third argument is a _positive_ Integer.
+
+2002-09-27 Friday 15:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.107), affineimage5.cc (1.1),
+ generalizedaffineimage1.cc (1.2), generalizedaffineimage2.cc
+ (1.2), generalizedaffineimage3.cc (1.2),
+ generalizedaffineimage4.cc (1.1): Added new tests and adjusted
+ the known_results of generalizedaffineimage* to match the
+ specification.
+
+2002-09-27 Friday 09:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.92), src/Polyhedron.cc (1.223),
+ src/Polyhedron.defs.hh (1.150): Method generalized_affine_image()
+ reimplemented to match its specification. The doxygen
+ specification improved.
+
+2002-09-27 Friday 09:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.38): Reported the bugfix for Polyhedron::affine_image().
+
+2002-09-27 Friday 09:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.65): Corrected a bug in GenSys::affine_image()
+ whereby we were creating points having a negative divisor when
+ the denominator of the affine transformation was negative.
+
+2002-09-27 Friday 09:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.106), affineimage4.cc (1.1): New test
+ showing a bug in Polyhedron::affine_image() when the divisor is
+ negative.
+
+2002-09-26 Thursday 15:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.222): The draft implementation of
+ Polyhedron::generalized_affine_image() extended to work with NNC
+ polyhedra.
+
+2002-09-26 Thursday 13:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.105), generalizedaffineimage3.cc (1.1):
+ Added a test for generalized_affine_image where the points of the
+ polyhedron have non-integral coordinates.
+
+2002-09-26 Thursday 12:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.104), generalizedaffineimage1.cc (1.1),
+ generalizedaffineimage2.cc (1.1): Added a couple of tests for the
+ new generalized_affine_image operator.
+
+2002-09-26 Thursday 12:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.91): Added draft specification of the
+ generalized affine image operator.
+
+2002-09-26 Thursday 12:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.221), Polyhedron.defs.hh (1.149): Added a
+ first draft implementation of the generalized_affine_image
+ operator. Current implementation should work correctly for
+ C_Polyhedron.
+
+2002-09-26 Thursday 12:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.54), LinExpression.inlines.hh
+ (1.24): Added methods to provide read-only access to the
+ coefficients and the inhomogeneous term of a LinExpression.
+
+2002-09-25 Wednesday 18:25 Elisa Ricci
+
+ * src/Polyhedron.cc (1.220), tests/Makefile.am (1.103),
+ tests/bbrz02widening12.cc (1.1): Corrected an improved the third
+ technique of Polyhedron::BBRZ02_widening_assign(). Added a test
+ to verify this technique.
+
+2002-09-25 Wednesday 16:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.90): Greatly improved the matrix in the
+ explanation of affine images and preimages.
+
+2002-09-25 Wednesday 14:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.37): Removed a few repetitions in the list of bugfixes.
+
+2002-09-25 Wednesday 10:12 Elisa Ricci
+
+ * src/: Integer.defs.hh (1.9), Integer.inlines.hh (1.8),
+ Polyhedron.cc (1.219): Added the functions void
+ sqrt_assign(Integer& x) and void sqrt_assign(Integer& x, const
+ Integer& y) in Integer to compute he truncated integer part of
+ the root of an Integer. Used the function sqrt_assign(Integer&)
+ in the first technique of BBRZ02_widening_assign().
+
+2002-09-24 Tuesday 19:05 Elisa Ricci
+
+ * src/: Integer.defs.hh (1.8), Integer.inlines.hh (1.7),
+ Polyhedron.cc (1.218): Added the functions lcm_assign(Integer& x,
+ const Integer& y) and lcm_assign(Integer& x, const Integer& y,
+ const Integer& z) in Integer. Modified the function
+ Polyhedron::BBRZ02_widening_assing() so that in the first
+ technique we choose the constraints to add in the right system
+ and we normalize the vectors using a bad approximation of the
+ norm; corrected also an error in the third technique in the case
+ of rays with negative coefficients.
+
+2002-09-24 Tuesday 15:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS, src/GenSys.cc, src/Polyhedron.cc (ppl-0_4-branch.[4,2,5]):
+ Reported to the ppl-0_4-branch the corrections to a couple of
+ bugs affecting methods GenSys::insert(const Generator& ) and
+ Polyhedron::add_generator(const Generator& ).
+
+2002-09-24 Tuesday 10:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc, tests/Makefile.am, tests/relations14.cc
+ (ppl-0_4-branch.[2,2,1]): Added the test showing a bug when
+ invoking method Polyhedron::relation_with(const Generator& ).
+ Implemented the correction in method
+ ConSys::satisfies_all_constraints(const Generator& ).
+
+2002-09-23 Monday 17:15 Elisa Ricci
+
+ * tests/: Makefile.am (1.102), relations11.cc (1.2), relations15.cc
+ (1.1), relations16.cc (1.1): Added two tests for the methods of
+ the class GenSys and corrected an error in the comment of the
+ test relations11.cc.
+
+2002-09-23 Monday 12:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.36), src/ConSys.cc (1.45): Corrected a bug in
+ ConSys::satisfies_all_constraints(const Generator& ) which was
+ affecting the public method Polyhedron::relation_with(const
+ Generator& ). The bug reported on the NEWS file.
+
+2002-09-23 Monday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.101), relations13.cc (1.1), relations14.cc
+ (1.1): A couple of new tests. relations14 shows a bug in the
+ implementation of ConSys::satisfies_all_constraints(const
+ Generator& g) const.
+
+2002-09-20 Friday 11:54 Elisa Ricci
+
+ * tests/: Makefile.am (1.100), addconstraints11.cc (1.8),
+ affinepreimage6.cc (1.1), relations10.cc (1.2), relations12.cc
+ (1.1): Added other tests for some methods of the classes ConSys
+ and GenSys. Corrected the comment of the test in relations10.cc.
+
+2002-09-19 Thursday 17:16 Elisa Ricci
+
+ * tests/: Makefile.am (1.99), affineimage3.cc (1.1),
+ affinepreimage5.cc (1.1), relations10.cc (1.1), relations11.cc
+ (1.1): Added some tests for the methods of the classes
+ Polyhedron, ConSys and GenSys.
+
+2002-09-18 Wednesday 11:54 Elisa Ricci
+
+ * tests/: Makefile.am (1.98), adddimensions11.cc (1.1),
+ exceptions2.cc (1.14): Added two other tests to verify the
+ methods of the class Polyhedron.
+
+2002-09-18 Wednesday 10:27 Elisa Ricci
+
+ * src/Polyhedron.cc (1.217): Made some little improvements to the
+ function Polyhedron::BBRZ02_widenin_assign(). Improved also some
+ comments of this function.
+
+2002-09-17 Tuesday 18:44 Elisa Ricci
+
+ * tests/: Makefile.am (1.97), contains1.cc (1.1), exceptions2.cc
+ (1.13), h79widening5.cc (1.2), minconstraints2.cc (1.2): Improved
+ some tests and added other tests to verify some methods of
+ Polyhedron.cc and C_Polyhedron.cc.
+
+2002-09-17 Tuesday 11:29 Elisa Ricci
+
+ * tests/: Makefile.am (1.96), addconstraints10.cc (1.7),
+ bbrz02widening10.cc (1.1), bbrz02widening11.cc (1.1),
+ h79widening5.cc (1.1), minconstraints2.cc (1.1),
+ mingenerators2.cc (1.1), timeelapse7.cc (1.1), topclosure2.cc
+ (1.1): Added other tests to verify some methods of Polyhedron.cc.
+
+2002-09-12 Thursday 18:17 Elisa Ricci
+
+ * tests/: Makefile.am (1.95), timeelapse6.cc (1.1): Added a new
+ test for the function Polyhedron::time_elapse_assign().
+
+2002-09-12 Thursday 16:30 Elisa Ricci
+
+ * src/Polyhedron.cc (1.216): Corrected an error in
+ Polyhedron::BBRZ02_widening_assign(): the new generator was added
+ to the polyhedron x instead of the polyhedron x2.
+
+2002-09-12 Thursday 11:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.51): Try to fix a long-standing problem in the
+ generation of ppl_install.hh.
+
+2002-09-11 Wednesday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, STANDARDS, acinclude.m4, config.h.in, configure.ac,
+ doc/definitions.dox, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+ interfaces/Prolog/Makefile.am,
+ interfaces/Prolog/Prolog_interface.dox,
+ interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+ interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/track_allocation.hh,
+ interfaces/Prolog/GNU/ppl_gprolog_sd.cc, m4/Makefile.am,
+ m4/ac_cxx_flexible_arrays.m4, src/AskTell.defs.hh,
+ src/AskTell.inlines.hh, src/BoundingBox.cc,
+ src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+ src/Constraint.cc, src/Constraint.defs.hh,
+ src/Constraint.inlines.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+ src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Init.cc, src/Init.defs.hh,
+ src/Init.inlines.hh, src/Interval.defs.hh, src/LCompare.defs.hh,
+ src/LinExpression.cc, src/LinExpression.defs.hh,
+ src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+ src/Polyhedron.cc, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/PowerSet.defs.hh,
+ src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+ src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+ src/SatMatrix.inlines.hh, src/SatRow.defs.hh,
+ src/SatRow.inlines.hh, src/Status.cc, src/Status.defs.hh,
+ src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/conversion.cc, src/globals.cc, src/globals.hh,
+ src/initializer.hh, src/minimize.cc, src/ppl_header.middle,
+ src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+ tests/addconstraint1.cc, tests/addconstraints2.cc,
+ tests/addconstraints4.cc, tests/addconstraints5.cc,
+ tests/addconstraints6.cc, tests/addconstraints7.cc,
+ tests/addconstraints8.cc, tests/addconstraints9.cc,
+ tests/adddimensions1.cc, tests/adddimensions10.cc,
+ tests/adddimensions2.cc, tests/adddimensions3.cc,
+ tests/adddimensions4.cc, tests/adddimensions5.cc,
+ tests/adddimensions6.cc, tests/adddimensions7.cc,
+ tests/adddimensions8.cc, tests/adddimensions9.cc,
+ tests/addgenerator1.cc, tests/addgenerator2.cc,
+ tests/addgenerators10.cc, tests/addgenerators3.cc,
+ tests/addgenerators4.cc, tests/addgenerators5.cc,
+ tests/addgenerators6.cc, tests/addgenerators7.cc,
+ tests/addgenerators9.cc, tests/affineimage1.cc,
+ tests/affineimage2.cc, tests/affinepreimage1.cc,
+ tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+ tests/affinepreimage4.cc, tests/append1.cc, tests/append2.cc,
+ tests/bbrz02widening1.cc, tests/bbrz02widening2.cc,
+ tests/bbrz02widening3.cc, tests/bbrz02widening4.cc,
+ tests/bbrz02widening5.cc, tests/bbrz02widening6.cc,
+ tests/bbrz02widening7.cc, tests/bbrz02widening8.cc,
+ tests/bbrz02widening9.cc, tests/bounded1.cc,
+ tests/boundingbox1.cc, tests/boundingbox2.cc, tests/bounds1.cc,
+ tests/bounds2.cc, tests/concatenate2.cc, tests/concatenate3.cc,
+ tests/concatenate4.cc, tests/constraints1.cc,
+ tests/constraints2.cc, tests/constraints3.cc, tests/empty1.cc,
+ tests/exceptions1.cc, tests/exceptions2.cc, tests/generators3.cc,
+ tests/generators4.cc, tests/generators5.cc,
+ tests/h79widening4.cc, tests/inclusion2.cc,
+ tests/intersection2.cc, tests/intersection3.cc,
+ tests/intersection4.cc, tests/intersection5.cc,
+ tests/intersection6.cc, tests/intersection8.cc,
+ tests/intersection9.cc, tests/limitedh79widening1.cc,
+ tests/limitedh79widening2.cc, tests/limitedh79widening3.cc,
+ tests/memory1.cc, tests/minconstraints1.cc,
+ tests/mingenerators1.cc, tests/permute.cc,
+ tests/polydifference1.cc, tests/polydifference2.cc,
+ tests/polydifference3.cc, tests/polydifference4.cc,
+ tests/polydifference5.cc, tests/polydifference6.cc,
+ tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull3.cc,
+ tests/polyhull5.cc, tests/polyhull6.cc, tests/relations1.cc,
+ tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+ tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+ tests/relations8.cc, tests/relations9.cc, tests/removedim4.cc,
+ tests/removedim5.cc, tests/removedim6.cc, tests/removedim7.cc,
+ tests/removedim8.cc, tests/removedim9.cc, tests/timeelapse1.cc,
+ tests/timeelapse2.cc, tests/timeelapse3.cc, tests/timeelapse4.cc,
+ tests/timeelapse5.cc, tests/topclosed1.cc, tests/topclosed2.cc,
+ tests/topclosure1.cc, tests/universe1.cc, tests/universe2.cc,
+ tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+ tests/universe6.cc, tests/watchdog1.cc
+ (alt_nnc.[3,1,1,2,2,1,3,3,1,1,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,5,4,3,4,4,3,4,4,7,4,2,5,5,3,1,2,2,2,2,1,2,2,1,1,2,2,2,2,1,2,1,2,16,5,5,3,3,1,2,2,1,2,2,2,2,1,2,1,2,2,1,1,2,2,2,1,1,1,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,3,1,1,2,2,1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,2,2,1,2,1,1,2,2,2,1,1,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2]):
+ Merged changes in main trunk between tags
+ "second_merge_to_alt_nnc" and "third_merge_to_alt_nnc".
+
+2002-09-11 Wednesday 19:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.63): Fixed a bug whereby the configuration
+ options --enable-assertions and --enable-more-assertions were not
+ working properly.
+
+2002-09-11 Wednesday 14:51 Elisa Ricci
+
+ * tests/bbrz02widening9.cc (1.2): Corrected this test: to built the
+ increasing chain q_i we must do the widening between q_i_minus_1
+ and the poly_hull of q_i_minus_1 and p_i (and not the widening
+ between p_i and the poly_hull of q_i_minus_1 and p_i).
+
+2002-09-11 Wednesday 12:55 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.215), Polyhedron.defs.hh (1.148): Added
+ the function static bool is_BBRZ02_stabilizing(const Polyhedron&
+ x, const Polyhedron& y). Used this new function in
+ Polyhedron::BBRZ02_widening_assign().
+
+2002-09-10 Tuesday 23:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.214): A couple of comments adjusted in
+ add_generator() and bbrz_widening_assign().
+
+2002-09-10 Tuesday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.35), doc/definitions.dox (1.89),
+ interfaces/Prolog/Makefile.am (1.20),
+ interfaces/Prolog/Prolog_interface.dox (1.62),
+ interfaces/Prolog/clpq.pl (1.13), interfaces/Prolog/clpq2.pl
+ (1.23), interfaces/Prolog/pl_check.pl (1.23),
+ interfaces/Prolog/ppl_prolog.icc (1.65),
+ interfaces/Prolog/track_allocation.hh (1.10),
+ src/AskTell.inlines.hh (1.9), src/C_Polyhedron.defs.hh (1.17),
+ src/ConSys.defs.hh (1.67), src/Constraint.cc (1.32),
+ src/Constraint.defs.hh (1.71), src/conversion.cc (1.32),
+ tests/addconstraints2.cc (1.16), tests/adddimensions10.cc (1.4),
+ tests/adddimensions5.cc (1.5), tests/adddimensions6.cc (1.5),
+ tests/adddimensions7.cc (1.5), tests/adddimensions8.cc (1.3),
+ tests/adddimensions9.cc (1.3), tests/addgenerator1.cc (1.2),
+ tests/addgenerator2.cc (1.2), tests/addgenerators7.cc (1.6),
+ tests/addgenerators9.cc (1.3), tests/bbrz02widening1.cc (1.2),
+ tests/bbrz02widening2.cc (1.2), tests/bbrz02widening3.cc (1.2),
+ tests/bbrz02widening6.cc (1.2), tests/bbrz02widening7.cc (1.2),
+ tests/bbrz02widening8.cc (1.2), tests/bounded1.cc (1.7),
+ tests/boundingbox1.cc (1.21), tests/boundingbox2.cc (1.11),
+ tests/bounds1.cc (1.3), tests/concatenate4.cc (1.3),
+ tests/constraints1.cc (1.3), tests/constraints2.cc (1.3),
+ tests/constraints3.cc (1.3): Lots of trailing blanks removed.
+
+2002-09-10 Tuesday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/topclosed1.cc (1.2): Indentation improvements.
+
+2002-09-10 Tuesday 18:05 Elisa Ricci
+
+ * src/Polyhedron.cc (1.213): Simplify the function
+ `Polyhedron::add_generator(g)' in the case of a necessarily
+ closed empty polyhedron and of a non-necessarily closed
+ generator.
+
+2002-09-10 Tuesday 18:00 Elisa Ricci
+
+ * tests/: Makefile.am (1.94), topclosed1.cc (1.1), topclosed2.cc
+ (1.1): Added two tests for the method
+ `Polyhedron::is_topologically_closed()'.
+
+2002-09-10 Tuesday 17:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.15): The correction of the bug on
+ Polyhedron::operator<=() reported on the alt_nnc branch.
+
+2002-09-10 Tuesday 16:46 Elisa Ricci
+
+ * tests/: Makefile.am (1.93), addgenerator1.cc (1.1),
+ addgenerator2.cc (1.1), addgenerators10.cc (1.1), exceptions1.cc
+ (1.16), exceptions2.cc (1.12), h79widening4.cc (1.1): Added some
+ other tests to verify the functions of Polyhedron.cc.
+
+2002-09-10 Tuesday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (ppl-0_4-branch.4):
+ Parma_Polyhedra_Library::dimension_type is undefined in PPL
+ 0.4.x.
+
+2002-09-10 Tuesday 14:48 Elisa Ricci
+
+ * tests/: bounds2.cc (1.3), polydifference5.cc (1.3),
+ polydifference6.cc (1.2), polyhull5.cc (1.2), polyhull6.cc (1.2),
+ removedim8.cc (1.2), removedim9.cc (1.2), topclosure1.cc (1.2):
+ Added some explanations of what these tests do and improved the
+ `return' of the test bounds2.
+
+2002-09-10 Tuesday 13:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (ppl-0_4-branch.3), NEWS (1.34): The correction
+ of the bug affecting Polyhedron::operator<=() reported on the
+ ppl_0_4-branch. Bug correction notified in the NEWS.
+
+2002-09-10 Tuesday 12:33 Elisa Ricci
+
+ * tests/: CbecomesNNC1.cc (1.2), Makefile.am (1.92),
+ addconstraint1.cc (1.2), addconstraints2.cc (1.15),
+ adddimensions10.cc (1.3), adddimensions8.cc (1.2),
+ adddimensions9.cc (1.2), addgenerators9.cc (1.2), bounds1.cc
+ (1.2), bounds2.cc (1.2), concatenate4.cc (1.2), constraints1.cc
+ (1.2), constraints2.cc (1.2), constraints3.cc (1.2),
+ generators3.cc (1.2), generators4.cc (1.2), generators5.cc (1.2),
+ intersection8.cc (1.2), intersection9.cc (1.2),
+ minconstraints1.cc (1.2), mingenerators1.cc (1.2),
+ polydifference4.cc (1.2), polydifference5.cc (1.2): Improved some
+ tests.
+
+2002-09-10 Tuesday 12:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/adddimensions10.cc (1.2): The old `known_result' was wrong.
+ This was masking the bug in Polyhedron::operator<=().
+
+2002-09-10 Tuesday 12:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.212): Correcting the bug in operator<=()
+ pointed out by test inclusion2.cc.
+
+2002-09-10 Tuesday 11:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.91), inclusion2.cc (1.1): New test showing
+ a bug in Polyhedron::operator<=().
+
+2002-09-09 Monday 18:00 Elisa Ricci
+
+ * tests/: CbecomesNNC1.cc (1.1), Makefile.am (1.90),
+ addconstraint1.cc (1.1), addconstraints2.cc (1.14),
+ adddimensions10.cc (1.1), adddimensions8.cc (1.1),
+ adddimensions9.cc (1.1), addgenerators9.cc (1.1), bounds1.cc
+ (1.1), bounds2.cc (1.1), concatenate4.cc (1.1), constraints1.cc
+ (1.1), constraints2.cc (1.1), constraints3.cc (1.1),
+ exceptions1.cc (1.15), exceptions2.cc (1.11), generators3.cc
+ (1.1), generators4.cc (1.1), generators5.cc (1.1),
+ intersection8.cc (1.1), intersection9.cc (1.1),
+ minconstraints1.cc (1.1), mingenerators1.cc (1.1),
+ polydifference3.cc (1.1), polydifference4.cc (1.1),
+ polydifference5.cc (1.1), polydifference6.cc (1.1), polyhull5.cc
+ (1.1), polyhull6.cc (1.1), removedim8.cc (1.1), removedim9.cc
+ (1.1), topclosure1.cc (1.1): Added tests to verify some methods
+ of Polyhedron.cc and NNC_Polyhedron.cc.
+
+2002-09-09 Monday 17:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.211), src/Polyhedron.defs.hh (1.147),
+ tests/Makefile.am (1.89), tests/bbrz02widening1.cc (1.1),
+ tests/bbrz02widening2.cc (1.1), tests/bbrz02widening3.cc (1.1),
+ tests/bbrz02widening4.cc (1.1), tests/bbrz02widening5.cc (1.1),
+ tests/bbrz02widening6.cc (1.1), tests/bbrz02widening7.cc (1.1),
+ tests/bbrz02widening8.cc (1.1), tests/bbrz02widening9.cc (1.1):
+ Initial implementation of the new widening.
+
+2002-09-04 Wednesday 20:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.43), Row.inlines.hh (1.33): Changes to support
+ C++ compilers not providing flexible arrays.
+
+2002-09-04 Wednesday 12:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.210): Method OK() adjusted to behave
+ correctly on an empty polyhedron having a single trivially false
+ constraint.
+
+2002-09-03 Tuesday 20:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * acinclude.m4 (1.3), config.h.in (1.18), configure.ac (1.62),
+ m4/Makefile.am (1.7), m4/ac_cxx_flexible_arrays.m4 (1.1),
+ src/Row.defs.hh (1.55), src/Row.inlines.hh (1.32): Initial
+ support for compilers not providing flexible arrays. (Flexible
+ arrays are standard in C99 but not in the current C++ standard.)
+
+2002-09-03 Tuesday 19:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.17), configure.ac (1.61): New configuration option
+ --enable-more-assertions: for the time being it enables more
+ complete debugging of the class Row by defining EXTRA_ROW_DEBUG.
+
+2002-09-03 Tuesday 18:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.3): Computing also the constraints
+ for the dual of hypercubes.
+
+2002-09-02 Monday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.16), configure.ac (1.60), src/ppl_header.middle
+ (1.2): Some portability enhancements.
+
+2002-09-02 Monday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.16): Friend declaration fixed.
+
+2002-09-02 Monday 22:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LCompare.defs.hh (1.4): Use public inheritance.
+
+2002-09-02 Monday 17:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.33), interfaces/C/ppl_c.cc (1.46), interfaces/C/ppl_c.h
+ (1.46), src/initializer.hh (1.4): Identifiers containing a double
+ underscore ("__") are reserved: we no longer use them.
+
+2002-09-02 Monday 16:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.77), LinExpression.defs.hh (1.53):
+ Illegal friend function declarations removed and substituted with
+ (still unsatisfactory) friend class declarations.
+
+2002-09-02 Monday 16:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.inlines.hh (1.31): Fixed typo in comment.
+
+2002-09-01 Sunday 19:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.9): Encode addresses
+ with terms of the form `$address'(High, Low) instead of
+ [High|Low].
+
+2002-09-01 Sunday 15:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.6), interfaces/C/ppl_c.cc (1.45),
+ interfaces/C/ppl_c.h (1.45), interfaces/Prolog/ppl_prolog.icc
+ (1.64), interfaces/Prolog/track_allocation.hh (1.9),
+ src/AskTell.defs.hh (1.8), src/BoundingBox.defs.hh (1.6),
+ src/C_Polyhedron.inlines.hh (1.12), src/ConSys.defs.hh (1.66),
+ src/ConSys.inlines.hh (1.26), src/Constraint.defs.hh (1.70),
+ src/Determinate.defs.hh (1.15), src/Determinate.inlines.hh
+ (1.17), src/GenSys.defs.hh (1.80), src/GenSys.inlines.hh (1.28),
+ src/Generator.cc (1.39), src/Generator.defs.hh (1.76),
+ src/Interval.defs.hh (1.8), src/Matrix.cc (1.43),
+ src/Matrix.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh (1.14),
+ src/Poly_Con_Relation.defs.hh (1.14),
+ src/Poly_Gen_Relation.defs.hh (1.13), src/Polyhedron.cc (1.209),
+ src/Polyhedron.defs.hh (1.146), src/SatMatrix.cc (1.20),
+ src/conversion.cc (1.31), src/minimize.cc (1.24), src/simplify.cc
+ (1.18), tests/append1.cc (1.15), tests/append2.cc (1.16),
+ tests/empty1.cc (1.10), tests/exceptions1.cc (1.14),
+ tests/permute.cc (1.22): Avoid source lines longer than 78
+ characters.
+
+2002-09-01 Sunday 15:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatRow.cc (1.11), SatRow.defs.hh (1.20), SatRow.inlines.hh
+ (1.20): Use the right integral types. Avoid source lines longer
+ than 78 characters.
+
+2002-09-01 Sunday 15:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.44), GenSys.cc (1.64), Generator.defs.hh
+ (1.75), LinExpression.defs.hh (1.52): Minor formatting changes.
+
+2002-09-01 Sunday 15:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.46): Make sure inlines are defined
+ before they are used.
+
+2002-09-01 Sunday 13:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.32), configure.ac (1.59), interfaces/C/ppl_c.cc (1.44),
+ interfaces/C/ppl_c.h (1.44), interfaces/Prolog/ppl_prolog.icc
+ (1.63), interfaces/Prolog/track_allocation.hh (1.8),
+ src/BoundingBox.cc (1.3), src/BoundingBox.defs.hh (1.5),
+ src/BoundingBox.inlines.hh (1.6), src/C_Polyhedron.defs.hh
+ (1.16), src/C_Polyhedron.inlines.hh (1.11), src/ConSys.cc (1.43),
+ src/ConSys.defs.hh (1.65), src/ConSys.inlines.hh (1.25),
+ src/Constraint.cc (1.31), src/Constraint.defs.hh (1.69),
+ src/Constraint.inlines.hh (1.41), src/Determinate.defs.hh (1.14),
+ src/Determinate.inlines.hh (1.16), src/GenSys.cc (1.63),
+ src/GenSys.defs.hh (1.79), src/GenSys.inlines.hh (1.27),
+ src/Generator.cc (1.38), src/Generator.defs.hh (1.74),
+ src/Generator.inlines.hh (1.38), src/Init.cc (1.2),
+ src/Init.defs.hh (1.6), src/LinExpression.cc (1.13),
+ src/LinExpression.defs.hh (1.51), src/LinExpression.inlines.hh
+ (1.23), src/Makefile.am (1.50), src/Matrix.cc (1.42),
+ src/Matrix.defs.hh (1.34), src/Matrix.inlines.hh (1.27),
+ src/NNC_Polyhedron.defs.hh (1.19), src/NNC_Polyhedron.inlines.hh
+ (1.13), src/Polyhedron.cc (1.208), src/Polyhedron.defs.hh
+ (1.145), src/Polyhedron.inlines.hh (1.45), src/PowerSet.defs.hh
+ (1.16), src/PowerSet.inlines.hh (1.21), src/Row.cc (1.42),
+ src/Row.defs.hh (1.54), src/Row.inlines.hh (1.30),
+ src/SatMatrix.cc (1.19), src/SatMatrix.defs.hh (1.24),
+ src/SatMatrix.inlines.hh (1.16), src/SatRow.cc (1.10),
+ src/SatRow.defs.hh (1.19), src/SatRow.inlines.hh (1.19),
+ src/Variable.cc (1.8), src/Variable.defs.hh (1.24),
+ src/Variable.inlines.hh (1.13), src/conversion.cc (1.30),
+ src/globals.cc (1.9), src/globals.hh (1.22), src/minimize.cc
+ (1.23), src/simplify.cc (1.17), tests/append1.cc (1.14),
+ tests/append2.cc (1.15), tests/boundingbox1.cc (1.20),
+ tests/intersection2.cc (1.4), tests/memory1.cc (1.8),
+ tests/permute.cc (1.21), tests/watchdog1.cc (1.11): No longer
+ abuse `size_t'. The new type `dimension_type' is an unsigned
+ integral type for representing space dimensions. The new
+ function dimension_type max_space_dimension() returns the maximum
+ space dimension this library can handle.
+
+2002-08-22 Thursday 15:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.61), pl_check.pl
+ (1.22): Updated for concatenate_assign.
+
+2002-08-22 Thursday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.20): PowerSet<CS>::add_constraint()
+ and PowerSet<CS>::add_constraints() fixed.
+
+2002-08-22 Thursday 01:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.2): Some more tests.
+
+2002-08-20 Tuesday 17:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.19): Several corrections.
+
+2002-08-19 Monday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.144): Avoid unnecessary qualification.
+
+2002-08-19 Monday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.42), ConSys.defs.hh (1.64), GenSys.cc (1.62),
+ GenSys.defs.hh (1.78), Matrix.cc (1.41), Matrix.defs.hh (1.33),
+ Poly_Con_Relation.cc (1.3), Poly_Con_Relation.defs.hh (1.13),
+ Poly_Gen_Relation.cc (1.3), Poly_Gen_Relation.defs.hh (1.12),
+ Polyhedron.cc (1.207), SatMatrix.cc (1.18), SatMatrix.defs.hh
+ (1.23), Status.cc (1.13): Rewriting of all input/output functions
+ and operators completed.
+
+2002-08-19 Monday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.206), Status.cc (1.12), Status.defs.hh
+ (1.21): The input and output operators on Status have been
+ replaced by methods void ASCII_dump(std::ostream&) const and bool
+ ASCII_load(std::istream&).
+
+2002-08-19 Monday 16:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.143): Comment corrected.
+
+2002-08-19 Monday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.205), Polyhedron.defs.hh (1.142): The
+ historical operators operator<<(std::ostream&, const Polyhedron&)
+ and oprator>>(std::istream&, Polyhedron&) have been replaced by
+ (internal) methods Polyhedron::ASCII_dump(std::ostream& s) and
+ ASCII_load(std::istream& s). New version of
+ operator<<(std::ostream& s, const Polyhedron& ph): writes a
+ textual representation of \p ph on \p s: "false" is written if
+ `ph' is an empty polyhedron; "true" is written if `ph' is a
+ universe polyhedron; a minimized system of constraints defining
+ `ph' is written otherwise, all constraints in one row separated
+ by ", ".
+
+2002-08-19 Monday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.inlines.hh (1.5), Makefile.am (1.49), Variable.cc
+ (1.7), Variable.defs.hh (1.23), Variable.inlines.hh (1.12): Allow
+ the user to change the output function for Variable objects by
+ calling Variable::set_output_function(). Allow the user to
+ obtain a pointer to the current output function by calling
+ Variable::get_output_function().
+
+2002-08-19 Monday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.21): Obey the indentation rules.
+
+2002-08-18 Sunday 22:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.88): We know nnc_limitedh79widening3 should
+ fail (for the time being).
+
+2002-08-18 Sunday 22:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: addconstraints4.cc (1.8), addconstraints5.cc (1.9),
+ addconstraints6.cc (1.10), addconstraints7.cc (1.9),
+ addconstraints8.cc (1.9), addconstraints9.cc (1.10),
+ adddimensions1.cc (1.11), adddimensions2.cc (1.7),
+ adddimensions3.cc (1.9), adddimensions4.cc (1.7),
+ adddimensions5.cc (1.4), adddimensions6.cc (1.4),
+ adddimensions7.cc (1.4), addgenerators3.cc (1.9),
+ addgenerators4.cc (1.9), addgenerators5.cc (1.9),
+ addgenerators6.cc (1.9), addgenerators7.cc (1.5), affineimage1.cc
+ (1.9), affineimage2.cc (1.8), affinepreimage1.cc (1.8),
+ affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+ affinepreimage4.cc (1.9), bounded1.cc (1.6), boundingbox1.cc
+ (1.19), boundingbox2.cc (1.10), concatenate2.cc (1.4),
+ concatenate3.cc (1.4), intersection3.cc (1.4), intersection4.cc
+ (1.4), intersection5.cc (1.4), intersection6.cc (1.4),
+ limitedh79widening1.cc (1.4), limitedh79widening2.cc (1.4),
+ limitedh79widening3.cc (1.2), polydifference1.cc (1.4),
+ polydifference2.cc (1.6), polyhull1.cc (1.4), polyhull2.cc (1.4),
+ polyhull3.cc (1.4), relations1.cc (1.6), relations2.cc (1.7),
+ relations3.cc (1.7), relations4.cc (1.7), relations5.cc (1.7),
+ relations6.cc (1.6), relations7.cc (1.6), relations8.cc (1.6),
+ relations9.cc (1.7), removedim4.cc (1.9), removedim5.cc (1.7),
+ removedim6.cc (1.9), removedim7.cc (1.4), timeelapse1.cc (1.5),
+ timeelapse2.cc (1.5), timeelapse3.cc (1.5), timeelapse4.cc (1.5),
+ timeelapse5.cc (1.5), universe1.cc (1.6), universe2.cc (1.7),
+ universe3.cc (1.7), universe4.cc (1.7), universe5.cc (1.8),
+ universe6.cc (1.5): Comments corrected.
+
+2002-08-18 Sunday 18:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.14): Adjusted new constructors to
+ produce the new epsilon representations.
+
+2002-08-18 Sunday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.87), limitedh79widening3.cc (1.1): New
+ test showing an incongruence in the behavior of the limited
+ widening operations in C and NNC polyhedra, respectively.
+
+2002-08-17 Saturday 18:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.41): Properly terminate messages.
+
+2002-08-17 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.15), PowerSet.inlines.hh (1.18): Define
+ `reverse_iterator' and `const_reverse_iterator'. New methods
+ rbegin() and rend(). New method definitely_contains(const CS&).
+ First prototype of method limited_H79_widening_assign(const
+ PowerSet&, ConSys&).
+
+2002-08-17 Saturday 18:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.13), Determinate.inlines.hh (1.15):
+ New method is_definitely_equivalent_to(const Determinate&).
+
+2002-08-17 Saturday 17:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.inlines.hh (1.14), PowerSet.inlines.hh (1.17):
+ PowerSet<CS>::omega_reduction() properly implemented.
+ operator<<(std::ostream&, const Determinate<PH>&) implemented so
+ as to obtain something readable.
+
+2002-08-17 Saturday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, config.h.in, configure.ac, Watchdog/Watchdog.defs.hh,
+ Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+ Watchdog/pwl_header.top, interfaces/C/ppl_c.cc,
+ interfaces/C/ppl_c.h, interfaces/Prolog/track_allocation.hh,
+ src/AskTell.defs.hh, src/AskTell.inlines.hh,
+ src/AskTell.types.hh, src/BoundingBox.defs.hh,
+ src/BoundingBox.inlines.hh, src/BoundingBox.types.hh,
+ src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+ src/C_Polyhedron.types.hh, src/ConSys.defs.hh,
+ src/ConSys.inlines.hh, src/ConSys.types.hh, src/Constraint.cc,
+ src/Constraint.defs.hh, src/Constraint.inlines.hh,
+ src/Constraint.types.hh, src/Determinate.defs.hh,
+ src/Determinate.inlines.hh, src/Determinate.types.hh,
+ src/GenSys.defs.hh, src/GenSys.inlines.hh, src/GenSys.types.hh,
+ src/Generator.cc, src/Generator.defs.hh,
+ src/Generator.inlines.hh, src/Generator.types.hh,
+ src/Init.defs.hh, src/Init.inlines.hh, src/Init.types.hh,
+ src/Integer.defs.hh, src/Integer.inlines.hh,
+ src/Integer.types.hh, src/Interval.defs.hh,
+ src/Interval.inlines.hh, src/Interval.types.hh,
+ src/LCompare.defs.hh, src/LCompare.inlines.hh,
+ src/LCompare.types.hh, src/LinExpression.defs.hh,
+ src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+ src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+ src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+ src/NNC_Polyhedron.types.hh, src/Poly_Con_Relation.defs.hh,
+ src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+ src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+ src/Poly_Gen_Relation.types.hh, src/Polyhedron.cc,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+ src/Polyhedron.types.hh, src/PowerSet.defs.hh,
+ src/PowerSet.inlines.hh, src/PowerSet.types.hh, src/Row.defs.hh,
+ src/Row.inlines.hh, src/Row.types.hh, src/SatMatrix.defs.hh,
+ src/SatMatrix.inlines.hh, src/SatMatrix.types.hh,
+ src/SatRow.defs.hh, src/SatRow.inlines.hh, src/SatRow.types.hh,
+ src/Status.defs.hh, src/Status.inlines.hh, src/Status.types.hh,
+ src/Topology.hh, src/Variable.defs.hh, src/Variable.inlines.hh,
+ src/Variable.types.hh, src/globals.hh, src/initializer.hh,
+ src/ppl_header.top, tests/ehandlers.hh, tests/mc91.cc,
+ tests/print.hh, tests/timings.hh
+ (alt_nnc.[2,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,3,2,1,3,3,2,1,3,3,1,3,1,1,4,4,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,4,4,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1]):
+ Merge changes from the trunk between tags `merge_to_alt_nnc' and
+ `second_merge_to_alt_nnc'.
+
+2002-08-17 Saturday 13:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PowerSet.inlines.hh (1.16):
+ PowerSet<CS>::concatenate_assign() fixed.
+
+2002-08-17 Saturday 11:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.12): In method
+ add_dimensions_and_project(), now adding the minus_epsilon_ray
+ instead of the zero_dim_closure_point.
+
+2002-08-17 Saturday 10:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh, Polyhedron.inlines.hh (alt_nnc.[3,3]):
+ Method shuffle_dimensions(...) implemented in tha alt_nnc branch
+ too.
+
+2002-08-16 Friday 22:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.31), interfaces/C/ppl_c.cc (1.43), interfaces/C/ppl_c.h
+ (1.43): The functions taking non-const arguments named
+ ppl_new_<T>_from_<S> have been renamed ppl_new_<T>_recycle_<S>,
+ where <T> is either "C" or "NNC", and <S> is either "ConSys" or
+ "GenSys". The old names have been given to the new const
+ functions.
+
+2002-08-16 Friday 22:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.defs.hh (1.12), src/Determinate.inlines.hh
+ (1.13), src/PowerSet.defs.hh (1.14), src/PowerSet.inlines.hh
+ (1.15), tests/mc91.cc (1.6): Another bit of Determinate and
+ PowerSet implementation written.
+
+2002-08-16 Friday 22:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.30): Updated.
+
+2002-08-16 Friday 22:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.30), Generator.cc (1.37): Exception
+ messages improved.
+
+2002-08-16 Friday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.15), C_Polyhedron.inlines.hh
+ (1.10), NNC_Polyhedron.defs.hh (1.18), NNC_Polyhedron.inlines.hh
+ (1.12), Polyhedron.cc (1.204), Polyhedron.defs.hh (1.141): New
+ constructors to build polyhedra from read-only constraint and
+ generator systems: C_Polyhedron(const ConSys&),
+ C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+ NNC_Polyhedron(const GenSys&). Some comments improved. Poorly
+ chosen variable name changed. Exception messages improved.
+
+2002-08-16 Friday 16:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Determinate.defs.hh, Determinate.inlines.hh
+ (alt_nnc.[2,2]): Chnages needed to let China compile (taken from
+ the main trunk).
+
+2002-08-16 Friday 16:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.11): Widening operators now should
+ work with the NER.
+
+2002-08-16 Friday 10:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.10): Corrected a comment.
+
+2002-08-16 Friday 10:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (alt_nnc.6): Corrected method
+ adjust_topology_and_dimension(), which could have introduced an
+ illegal (all zero's) ray when mapping a NNC to a C gensys.
+
+2002-08-16 Friday 10:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.cc (alt_nnc.1): Constructor
+ C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y) now is
+ implemented using generators (using constraints is not safe wrt
+ NER).
+
+2002-08-16 Friday 10:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.15), configure.ac (1.58),
+ Watchdog/Watchdog.defs.hh (1.6), Watchdog/Watchdog.inlines.hh
+ (1.5), Watchdog/Watchdog.types.hh (1.2), Watchdog/pwl_header.top
+ (1.2), interfaces/C/ppl_c.h (1.42),
+ interfaces/Prolog/track_allocation.hh (1.7), src/AskTell.defs.hh
+ (1.7), src/AskTell.inlines.hh (1.8), src/AskTell.types.hh (1.3),
+ src/BoundingBox.defs.hh (1.4), src/BoundingBox.inlines.hh (1.5),
+ src/BoundingBox.types.hh (1.4), src/C_Polyhedron.defs.hh (1.14),
+ src/C_Polyhedron.inlines.hh (1.9), src/C_Polyhedron.types.hh
+ (1.5), src/ConSys.defs.hh (1.63), src/ConSys.inlines.hh (1.24),
+ src/ConSys.types.hh (1.5), src/Constraint.defs.hh (1.68),
+ src/Constraint.inlines.hh (1.40), src/Constraint.types.hh (1.5),
+ src/Determinate.defs.hh (1.11), src/Determinate.inlines.hh
+ (1.12), src/Determinate.types.hh (1.3), src/GenSys.defs.hh
+ (1.77), src/GenSys.inlines.hh (1.26), src/GenSys.types.hh (1.5),
+ src/Generator.defs.hh (1.73), src/Generator.inlines.hh (1.37),
+ src/Generator.types.hh (1.5), src/Init.defs.hh (1.5),
+ src/Init.inlines.hh (1.4), src/Init.types.hh (1.4),
+ src/Integer.defs.hh (1.7), src/Integer.inlines.hh (1.6),
+ src/Integer.types.hh (1.6), src/Interval.defs.hh (1.7),
+ src/Interval.inlines.hh (1.5), src/Interval.types.hh (1.4),
+ src/LCompare.defs.hh (1.3), src/LCompare.inlines.hh (1.3),
+ src/LCompare.types.hh (1.3), src/LinExpression.defs.hh (1.50),
+ src/LinExpression.inlines.hh (1.22), src/LinExpression.types.hh
+ (1.5), src/Matrix.defs.hh (1.32), src/Matrix.inlines.hh (1.26),
+ src/Matrix.types.hh (1.5), src/NNC_Polyhedron.defs.hh (1.17),
+ src/NNC_Polyhedron.inlines.hh (1.11), src/NNC_Polyhedron.types.hh
+ (1.5), src/Poly_Con_Relation.defs.hh (1.12),
+ src/Poly_Con_Relation.inlines.hh (1.8),
+ src/Poly_Con_Relation.types.hh (1.4),
+ src/Poly_Gen_Relation.defs.hh (1.11),
+ src/Poly_Gen_Relation.inlines.hh (1.8),
+ src/Poly_Gen_Relation.types.hh (1.4), src/Polyhedron.defs.hh
+ (1.140), src/Polyhedron.inlines.hh (1.44),
+ src/Polyhedron.types.hh (1.6), src/PowerSet.defs.hh (1.13),
+ src/PowerSet.inlines.hh (1.14), src/PowerSet.types.hh (1.3),
+ src/Row.defs.hh (1.53), src/Row.inlines.hh (1.29),
+ src/Row.types.hh (1.5), src/SatMatrix.defs.hh (1.22),
+ src/SatMatrix.inlines.hh (1.15), src/SatMatrix.types.hh (1.5),
+ src/SatRow.defs.hh (1.18), src/SatRow.inlines.hh (1.18),
+ src/SatRow.types.hh (1.5), src/Status.defs.hh (1.20),
+ src/Status.inlines.hh (1.10), src/Status.types.hh (1.5),
+ src/Topology.hh (1.6), src/Variable.defs.hh (1.22),
+ src/Variable.inlines.hh (1.11), src/Variable.types.hh (1.5),
+ src/globals.hh (1.20), src/initializer.hh (1.3),
+ src/ppl_header.top (1.4), tests/ehandlers.hh (1.5),
+ tests/print.hh (1.11), tests/timings.hh (1.2): According to the
+ C++ standard (Section 17.4), every name that starts with an
+ underscore is reserved to the implementation. All the multiple
+ inclusion guards have been renamed (some missing ones have been
+ added).
+
+2002-08-15 Thursday 11:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, GenSys.defs.hh, Generator.cc, Generator.defs.hh
+ (alt_nnc.[5,2,3,3]): Removed useless methods
+ Generator::is_matching_closure_point() and
+ GenSys::add_corresponding_points().
+
+2002-08-15 Thursday 11:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.9): Corrected trivial errors in
+ is_topologically_closed() and topological_closure_assign().
+
+2002-08-15 Thursday 11:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.10), Determinate.inlines.hh (1.11):
+ Implemented the functionality required for testing with China.
+
+2002-08-15 Thursday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.203), Polyhedron.defs.hh (1.139),
+ Polyhedron.inlines.hh (1.43): Added template <typename
+ PartialFunction> void Polyhedron::shuffle_dimensions(const
+ PartialFunction& pfunc).
+
+2002-08-14 Wednesday 18:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.8): Comments of
+ Polyhedron::concatenate_assign() improved.
+
+2002-08-14 Wednesday 18:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.202): Polyhedron::concatenate_assign()
+ improved.
+
+2002-08-14 Wednesday 18:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.7): Rewritten methods
+ is_topologically_closed() and topological_closure_assign().
+
+2002-08-14 Wednesday 16:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.6): Some improvements to
+ concatenate_assign().
+
+2002-08-14 Wednesday 16:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (alt_nnc.4): Corrected method has_points(), which
+ was returning true even when finding the minus_epsilon ray.
+
+2002-08-14 Wednesday 15:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.41): Documentation of
+ ppl_Polyhedron_concatenate_assign() corrected.
+
+2002-08-14 Wednesday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/hypercubes.cc (alt_nnc.1): Put under CVS control. It is not
+ (yet) built and executed by `make check', because we should find
+ the right performance tradeoff.
+
+2002-08-14 Wednesday 14:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+ interfaces/Prolog/ppl_prolog.icc,
+ interfaces/Prolog/Ciao/ppl_ciao.pl,
+ interfaces/Prolog/GNU/ppl_gprolog.pl,
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+ interfaces/Prolog/SWI/ppl_swiprolog.cc,
+ interfaces/Prolog/XSB/ppl_xsb.H,
+ interfaces/Prolog/XSB/ppl_xsb.cc,
+ interfaces/Prolog/XSB/xsb_clpq.P,
+ interfaces/Prolog/XSB/xsb_clpq2.P,
+ interfaces/Prolog/YAP/ppl_yap.cc, src/ConSys.cc,
+ src/Determinate.defs.hh, src/Determinate.inlines.hh,
+ src/GenSys.cc, src/Polyhedron.cc, src/Polyhedron.defs.hh,
+ src/PowerSet.defs.hh, src/PowerSet.inlines.hh, tests/Makefile.am,
+ tests/NNCinclusion1.cc, tests/NNCminimize1.cc,
+ tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+ tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+ tests/NNCminimize6.cc, tests/addconstraints1.cc,
+ tests/addconstraints10.cc, tests/addconstraints11.cc,
+ tests/addconstraints2.cc, tests/addconstraints3.cc,
+ tests/addconstraints4.cc, tests/addconstraints5.cc,
+ tests/addconstraints6.cc, tests/addconstraints7.cc,
+ tests/addconstraints8.cc, tests/addconstraints9.cc,
+ tests/adddimensions1.cc, tests/adddimensions2.cc,
+ tests/adddimensions3.cc, tests/adddimensions4.cc,
+ tests/adddimensions5.cc, tests/adddimensions6.cc,
+ tests/adddimensions7.cc, tests/addgenerators1.cc,
+ tests/addgenerators2.cc, tests/addgenerators3.cc,
+ tests/addgenerators4.cc, tests/addgenerators5.cc,
+ tests/addgenerators6.cc, tests/addgenerators7.cc,
+ tests/addgenerators8.cc, tests/affineimage1.cc,
+ tests/affineimage2.cc, tests/affinepreimage1.cc,
+ tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+ tests/affinepreimage4.cc, tests/affinetrans.cc, tests/append1.cc,
+ tests/append2.cc, tests/bounded1.cc, tests/boundingbox1.cc,
+ tests/boundingbox2.cc, tests/concatenate1.cc,
+ tests/concatenate2.cc, tests/concatenate3.cc, tests/empty1.cc,
+ tests/exceptions1.cc, tests/exceptions2.cc, tests/generators1.cc,
+ tests/generators2.cc, tests/h79widening1.cc,
+ tests/h79widening2.cc, tests/h79widening3.cc,
+ tests/inclusion1.cc, tests/inters1.cc, tests/inters2.cc,
+ tests/inters3.cc, tests/inters4.cc, tests/inters5.cc,
+ tests/inters6.cc, tests/inters7.cc, tests/intersection1.cc,
+ tests/intersection2.cc, tests/intersection3.cc,
+ tests/intersection4.cc, tests/intersection5.cc,
+ tests/intersection6.cc, tests/intersection7.cc,
+ tests/limitedh79widening1.cc, tests/limitedh79widening2.cc,
+ tests/mc91.cc, tests/memory1.cc, tests/onepoint.cc,
+ tests/permute.cc, tests/polydifference1.cc,
+ tests/polydifference2.cc, tests/polyhull1.cc, tests/polyhull2.cc,
+ tests/polyhull3.cc, tests/polyhull4.cc, tests/ppl_test.hh,
+ tests/randphull1.cc, tests/relations1.cc, tests/relations2.cc,
+ tests/relations3.cc, tests/relations4.cc, tests/relations5.cc,
+ tests/relations6.cc, tests/relations7.cc, tests/relations8.cc,
+ tests/relations9.cc, tests/removedim1.cc, tests/removedim2.cc,
+ tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+ tests/removedim6.cc, tests/removedim7.cc, tests/smm1.cc,
+ tests/timeelapse1.cc, tests/timeelapse2.cc, tests/timeelapse3.cc,
+ tests/timeelapse4.cc, tests/timeelapse5.cc, tests/universe1.cc,
+ tests/universe2.cc, tests/universe3.cc, tests/universe4.cc,
+ tests/universe5.cc, tests/universe6.cc, tests/watchdog1.cc
+ (alt_nnc.[1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,3,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Merge changes from the trunk between tags `alt_nnc_root' and
+ `merge_to_alt_nnc'.
+
+2002-08-14 Wednesday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: NNCinclusion1.cc (1.4), NNCminimize1.cc (1.6),
+ NNCminimize2.cc (1.6), NNCminimize3.cc (1.6), NNCminimize4.cc
+ (1.8), NNCminimize5.cc (1.4), NNCminimize6.cc (1.6),
+ addconstraints1.cc (1.8), addconstraints3.cc (1.5),
+ addconstraints4.cc (1.7), addconstraints5.cc (1.8),
+ addconstraints6.cc (1.9), addconstraints7.cc (1.8),
+ addconstraints8.cc (1.8), addconstraints9.cc (1.9),
+ adddimensions1.cc (1.10), adddimensions2.cc (1.6),
+ adddimensions3.cc (1.8), adddimensions4.cc (1.6),
+ adddimensions5.cc (1.3), adddimensions6.cc (1.3),
+ adddimensions7.cc (1.3), addgenerators1.cc (1.9),
+ addgenerators2.cc (1.9), addgenerators3.cc (1.8),
+ addgenerators4.cc (1.8), addgenerators5.cc (1.8),
+ addgenerators6.cc (1.8), addgenerators7.cc (1.4),
+ addgenerators8.cc (1.4), affineimage1.cc (1.8), affineimage2.cc
+ (1.7), affinepreimage1.cc (1.7), affinepreimage2.cc (1.7),
+ affinepreimage3.cc (1.7), affinepreimage4.cc (1.8),
+ affinetrans.cc (1.11), append1.cc (1.13), append2.cc (1.14),
+ bounded1.cc (1.5), boundingbox1.cc (1.18), boundingbox2.cc (1.9),
+ concatenate1.cc (1.3), concatenate2.cc (1.3), concatenate3.cc
+ (1.3), empty1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc
+ (1.10), generators1.cc (1.8), generators2.cc (1.5),
+ h79widening1.cc (1.3), h79widening2.cc (1.3), h79widening3.cc
+ (1.3), inclusion1.cc (1.4), intersection1.cc (1.3),
+ intersection2.cc (1.3), intersection3.cc (1.3), intersection4.cc
+ (1.3), intersection5.cc (1.3), intersection6.cc (1.3),
+ intersection7.cc (1.3), limitedh79widening1.cc (1.3),
+ limitedh79widening2.cc (1.3), mc91.cc (1.5), memory1.cc (1.7),
+ onepoint.cc (1.7), permute.cc (1.20), polydifference1.cc (1.3),
+ polydifference2.cc (1.5), polyhull1.cc (1.3), polyhull2.cc (1.3),
+ polyhull3.cc (1.3), polyhull4.cc (1.3), randphull1.cc (1.4),
+ relations1.cc (1.5), relations2.cc (1.6), relations3.cc (1.6),
+ relations4.cc (1.6), relations5.cc (1.6), relations6.cc (1.5),
+ relations7.cc (1.5), relations8.cc (1.5), relations9.cc (1.6),
+ removedim1.cc (1.7), removedim2.cc (1.11), removedim3.cc (1.7),
+ removedim4.cc (1.8), removedim5.cc (1.6), removedim6.cc (1.8),
+ removedim7.cc (1.3), smm1.cc (1.7), timeelapse1.cc (1.4),
+ timeelapse2.cc (1.4), timeelapse3.cc (1.4), timeelapse4.cc (1.4),
+ timeelapse5.cc (1.4), universe1.cc (1.5), universe2.cc (1.6),
+ universe3.cc (1.6), universe4.cc (1.6), universe5.cc (1.7),
+ universe6.cc (1.4), watchdog1.cc (1.10): Minor improvements.
+
+2002-08-14 Wednesday 12:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.86): The test nnc_polydifference1 must fail.
+
+2002-08-14 Wednesday 12:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, Generator.cc, Generator.defs.hh
+ (alt_nnc.[2,2,2]): The skip_forward() method now only skips the
+ minus_epsilon_ray.
+
+2002-08-14 Wednesday 12:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (alt_nnc.3): In the skip_forward() method, avoid
+ useless computations for necessarily closed constraint systems.
+
+2002-08-14 Wednesday 12:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.85), NNCinclusion1.cc (1.3),
+ NNCminimize1.cc (1.5), NNCminimize2.cc (1.5), NNCminimize3.cc
+ (1.5), NNCminimize4.cc (1.7), NNCminimize5.cc (1.3),
+ NNCminimize6.cc (1.5), addconstraints1.cc (1.7),
+ addconstraints3.cc (1.4), addconstraints4.cc (1.6),
+ addconstraints5.cc (1.7), addconstraints6.cc (1.8),
+ addconstraints7.cc (1.7), addconstraints8.cc (1.7),
+ addconstraints9.cc (1.8), adddimensions1.cc (1.9),
+ adddimensions2.cc (1.5), adddimensions3.cc (1.7),
+ adddimensions4.cc (1.5), adddimensions5.cc (1.2),
+ adddimensions6.cc (1.2), adddimensions7.cc (1.2),
+ addgenerators1.cc (1.8), addgenerators2.cc (1.8),
+ addgenerators3.cc (1.7), addgenerators4.cc (1.7),
+ addgenerators5.cc (1.7), addgenerators6.cc (1.7),
+ addgenerators7.cc (1.3), addgenerators8.cc (1.3), affineimage1.cc
+ (1.7), affineimage2.cc (1.6), affinepreimage1.cc (1.6),
+ affinepreimage2.cc (1.6), affinepreimage3.cc (1.6),
+ affinepreimage4.cc (1.7), affinetrans.cc (1.10), append1.cc
+ (1.12), append2.cc (1.13), bounded1.cc (1.4), boundingbox1.cc
+ (1.17), boundingbox2.cc (1.8), concatenate1.cc (1.2),
+ concatenate2.cc (1.2), concatenate3.cc (1.2), empty1.cc (1.8),
+ exceptions1.cc (1.12), exceptions2.cc (1.9), generators1.cc
+ (1.7), generators2.cc (1.4), h79widening1.cc (1.2),
+ h79widening2.cc (1.2), h79widening3.cc (1.2), inclusion1.cc
+ (1.3), intersection1.cc (1.2), intersection2.cc (1.2),
+ intersection3.cc (1.2), intersection4.cc (1.2), intersection5.cc
+ (1.2), intersection6.cc (1.2), intersection7.cc (1.2),
+ limitedh79widening1.cc (1.2), limitedh79widening2.cc (1.2),
+ mc91.cc (1.4), memory1.cc (1.6), onepoint.cc (1.6), permute.cc
+ (1.19), polydifference1.cc (1.2), polydifference2.cc (1.4),
+ polyhull1.cc (1.2), polyhull2.cc (1.2), polyhull3.cc (1.2),
+ polyhull4.cc (1.2), ppl_test.hh (1.1), randphull1.cc (1.3),
+ relations1.cc (1.4), relations2.cc (1.5), relations3.cc (1.5),
+ relations4.cc (1.5), relations5.cc (1.5), relations6.cc (1.4),
+ relations7.cc (1.4), relations8.cc (1.4), relations9.cc (1.5),
+ removedim1.cc (1.6), removedim2.cc (1.10), removedim3.cc (1.6),
+ removedim4.cc (1.7), removedim5.cc (1.5), removedim6.cc (1.7),
+ removedim7.cc (1.2), smm1.cc (1.6), timeelapse1.cc (1.3),
+ timeelapse2.cc (1.3), timeelapse3.cc (1.3), timeelapse4.cc (1.3),
+ timeelapse5.cc (1.3), universe1.cc (1.4), universe2.cc (1.5),
+ universe3.cc (1.5), universe4.cc (1.5), universe5.cc (1.6),
+ universe6.cc (1.3), watchdog1.cc (1.9): Most of the test programs
+ are now used to test both closed and not necessarily closed
+ polyhedra.
+
+2002-08-14 Wednesday 11:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+ Constraint.cc, Constraint.defs.hh (alt_nnc.[2,2,1,2,2]): Now the
+ iterators on constraint systems do skip the next constraint when
+ the current one is a strict inequality and the next one is a
+ non-strict inequality matching the current one (we still skip
+ trivial-true constraints).
+
+2002-08-14 Wednesday 08:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.29): Updated.
+
+2002-08-14 Wednesday 08:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.201): Polyhedron::concatenate_assign()
+ improved.
+
+2002-08-13 Tuesday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.84), inters1.cc (1.11), inters2.cc (1.14),
+ inters3.cc (1.7), inters4.cc (1.6), inters5.cc (1.8), inters6.cc
+ (1.7), inters7.cc (1.4), intersection1.cc (1.1), intersection2.cc
+ (1.1), intersection3.cc (1.1), intersection4.cc (1.1),
+ intersection5.cc (1.1), intersection6.cc (1.1), intersection7.cc
+ (1.1): Renamed intersN.cc to intersectionN.cc, for N = 1, ..., 7.
+
+2002-08-13 Tuesday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: xsb_clpq.P (1.5), xsb_clpq2.P (1.3):
+ Import as little as possible.
+
+2002-08-13 Tuesday 21:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.4): add_constraints_and_minimize()
+ should now be ok for the new NNC repr. Added a couple of FIXME's
+ to mark methods that still need to be adjusted.
+
+2002-08-13 Tuesday 21:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, GenSys.defs.hh (alt_nnc.[1,1]): Removed method
+ add_corresponding_closure_points().
+
+2002-08-13 Tuesday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.42), interfaces/C/ppl_c.h (1.40),
+ interfaces/Prolog/ppl_prolog.icc (1.62),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.21),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.17),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.25),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.49),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.2),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.7),
+ interfaces/Prolog/XSB/xsb_clpq.P (1.4),
+ interfaces/Prolog/XSB/xsb_clpq2.P (1.2),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.42), src/Determinate.defs.hh
+ (1.9), src/Determinate.inlines.hh (1.10), src/Polyhedron.cc
+ (1.200), src/Polyhedron.defs.hh (1.138), src/PowerSet.defs.hh
+ (1.12), src/PowerSet.inlines.hh (1.13), tests/Makefile.am (1.83),
+ tests/addconstraints10.cc (1.6), tests/addconstraints11.cc (1.7),
+ tests/addconstraints2.cc (1.13), tests/concatenate1.cc (1.1),
+ tests/concatenate2.cc (1.1), tests/concatenate3.cc (1.1),
+ tests/exceptions2.cc (1.8): The method
+ Polyhedron::add_dimensions_and_constraints(ConSys&) has gone. A
+ similar functionality is provided by the new method
+ Polyhedron::concatenate_assign(const Polyhedron&).
+
+2002-08-13 Tuesday 18:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (alt_nnc.2): Fixed method template
+ <typename Box> Polyhedron::Polyhedron(Topology topol, const
+ Box& box) to work correctly with the new NNC representation.
+
+2002-08-13 Tuesday 18:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/boundingbox2.cc (alt_nnc.1): Some strange formatting fixed.
+
+2002-08-13 Tuesday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.8), Determinate.inlines.hh (1.9):
+ Default constructor replaced with a generalized constructor. New
+ method Determinate::concatenate_assign(const Determinate& y).
+
+2002-08-13 Tuesday 16:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.3): Most methods now correctly use the
+ new NNC representation (notable exceptions: the wideinings and
+ the boundingbox operators).
+
+2002-08-13 Tuesday 16:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/minimize.cc (alt_nnc.1): When con_to_gen is false, no longer
+ checking for the presence of the positivity constraint (C) or the
+ presence of eps_geq_zero (NNC).
+
+2002-08-13 Tuesday 16:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc, Generator.defs.hh, Generator.inlines.hh
+ (alt_nnc.[1,1,1]): Added method for getting the
+ minus_epsilon_ray, needed for the new NNC representation;
+ adjusted the OK() method so that it will no longer complain when
+ finding a ray with a non-zero epsilon coefficient.
+
+2002-08-13 Tuesday 16:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.defs.hh (alt_nnc.[1,1]): Added method
+ add_corresponding_nonstrict_inequalities().
+
+2002-08-13 Tuesday 14:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.11), PowerSet.inlines.hh (1.12): Added
+ a `space_dim' private member and its usual public accessor:
+ space_dimension().
+
+2002-08-13 Tuesday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.7), Determinate.inlines.hh (1.8):
+ Method space_dimension() added. Added template <typename PH>
+ bool operator==(const Determinate<PH>& x, const Determinate<PH>&
+ y) and template <typename PH> bool operator!=(const
+ Determinate<PH>& x, const Determinate<PH>& y). Added several
+ assertions. Default constructor made public (it was left private
+ by mistake). Prepare for some cleanup.
+
+2002-08-13 Tuesday 11:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (alt_nnc.2): Started converting
+ H-representations into P-representations. The build is
+ (obviously) broken.
+
+2002-08-13 Tuesday 10:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh,
+ Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+ (alt_nnc.[1,1,1,1,1,1]): Getting rid of the epsilon_geq_zero()
+ constraint. Added the static function
+ Polyhedron::add_low_level_constraints(ConSys&) to centralize the
+ issues related to the positivity and the epsilon_leq_one()
+ low-level constraints.
+
+2002-08-13 Tuesday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.41), GenSys.cc (1.61): In methods
+ ConSys::insert() and GenSys::insert(), when the systems are empty
+ and NNC, computing the new size of the constraint/generators in a
+ cleaner way.
+
+2002-08-12 Monday 20:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.60): Patched the method insert(const
+ Generator&), which was doing nasty things when trying to insert a
+ generator into an empty generator system that was declared to be
+ NNC.
+
+2002-08-12 Monday 20:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/addgenerators8.cc (1.2): No longer NOISY.
+
+2002-08-12 Monday 20:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.199): Corrected a bug in add_generator(const
+ Generator&) whereby we were not adding the corresponding closure
+ point when adding a point to an empty NNC polyhedron.
+
+2002-08-12 Monday 20:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.137): Removed a /*! that was inside the
+ scope of another /*!.
+
+2002-08-12 Monday 20:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.82), addgenerators8.cc (1.1): The new test
+ addgenerators8 shows a bug when trying to insert a point into an
+ empty NNC polyhedron using add_generator(const Generator&).
+
+2002-08-12 Monday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.6), Determinate.inlines.hh (1.7),
+ PowerSet.defs.hh (1.10), PowerSet.inlines.hh (1.11): Classes
+ Determinate and PowerSet equipped with initial implementations of
+ methods add_constraint(), add_constraints(), and
+ add_dimensions_and_constraints().
+
+2002-08-12 Monday 09:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.136): The documentation of
+ Polyhedron::add_dimensions_and_constraints() has been made
+ consistent with that of the other methods.
+
+2002-08-12 Monday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.22), interfaces/Prolog/expected2
+ (1.6), interfaces/Prolog/XSB/expected2 (1.2), src/ConSys.cc
+ (1.40), src/Constraint.cc (1.29), src/Constraint.inlines.hh
+ (1.39), src/GenSys.cc (1.59), src/Generator.cc (1.36),
+ src/Generator.inlines.hh (1.36), src/Matrix.cc (1.40),
+ src/Matrix.defs.hh (1.31), src/Polyhedron.cc (1.198),
+ src/Polyhedron.inlines.hh (1.42), src/minimize.cc (1.22): Avoid
+ using LaTeX commands in ordinary C++ comments.
+
+2002-08-12 Monday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.197): Properly comment a couple of
+ preprocessor directives.
+
+2002-08-11 Sunday 17:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.61), src/C_Polyhedron.defs.hh
+ (1.13), src/C_Polyhedron.inlines.hh (1.8),
+ src/NNC_Polyhedron.defs.hh (1.16), src/NNC_Polyhedron.inlines.hh
+ (1.10), src/Polyhedron.defs.hh (1.135), src/Polyhedron.inlines.hh
+ (1.41), src/PowerSet.defs.hh (1.9), src/PowerSet.inlines.hh
+ (1.10): The syntax `template <class T>' is an anachronism: use
+ `template <typename T>' instead.
+
+2002-08-11 Sunday 16:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.types.hh (1.3), C_Polyhedron.types.hh (1.4),
+ ConSys.types.hh (1.4), Constraint.types.hh (1.4), GenSys.types.hh
+ (1.4), Generator.types.hh (1.4), Init.types.hh (1.3),
+ Integer.types.hh (1.5), Interval.types.hh (1.3),
+ LinExpression.types.hh (1.4), Matrix.types.hh (1.4),
+ NNC_Polyhedron.types.hh (1.4), Poly_Con_Relation.types.hh (1.3),
+ Poly_Gen_Relation.types.hh (1.3), Polyhedron.types.hh (1.5),
+ Row.types.hh (1.4), SatMatrix.types.hh (1.4), SatRow.types.hh
+ (1.4), Status.types.hh (1.4), Variable.types.hh (1.4): Obey our
+ standard about namespace-level indentation.
+
+2002-08-11 Sunday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.6), AskTell.inlines.hh (1.7),
+ AskTell.types.hh (1.2), BoundingBox.defs.hh (1.3),
+ BoundingBox.inlines.hh (1.4), BoundingBox.types.hh (1.2),
+ C_Polyhedron.defs.hh (1.12), C_Polyhedron.inlines.hh (1.7),
+ C_Polyhedron.types.hh (1.3), ConSys.defs.hh (1.62),
+ ConSys.inlines.hh (1.23), ConSys.types.hh (1.3),
+ Constraint.defs.hh (1.67), Constraint.inlines.hh (1.38),
+ Constraint.types.hh (1.3), Determinate.defs.hh (1.5),
+ Determinate.inlines.hh (1.6), Determinate.types.hh (1.2),
+ GenSys.defs.hh (1.76), GenSys.inlines.hh (1.25), GenSys.types.hh
+ (1.3), Generator.defs.hh (1.72), Generator.inlines.hh (1.35),
+ Generator.types.hh (1.3), Init.defs.hh (1.4), Init.inlines.hh
+ (1.3), Init.types.hh (1.2), Integer.defs.hh (1.6),
+ Integer.inlines.hh (1.5), Integer.types.hh (1.4),
+ Interval.defs.hh (1.6), Interval.types.hh (1.2), LCompare.defs.hh
+ (1.2), LCompare.inlines.hh (1.2), LCompare.types.hh (1.2),
+ LinExpression.defs.hh (1.49), LinExpression.inlines.hh (1.21),
+ LinExpression.types.hh (1.3), Matrix.defs.hh (1.30),
+ Matrix.inlines.hh (1.25), Matrix.types.hh (1.3),
+ NNC_Polyhedron.defs.hh (1.15), NNC_Polyhedron.inlines.hh (1.9),
+ NNC_Polyhedron.types.hh (1.3), Poly_Con_Relation.defs.hh (1.11),
+ Poly_Con_Relation.inlines.hh (1.7), Poly_Con_Relation.types.hh
+ (1.2), Poly_Gen_Relation.defs.hh (1.10),
+ Poly_Gen_Relation.inlines.hh (1.7), Poly_Gen_Relation.types.hh
+ (1.2), Polyhedron.defs.hh (1.134), Polyhedron.inlines.hh (1.40),
+ Polyhedron.types.hh (1.4), PowerSet.defs.hh (1.8),
+ PowerSet.inlines.hh (1.9), PowerSet.types.hh (1.2), Row.defs.hh
+ (1.52), Row.inlines.hh (1.28), Row.types.hh (1.3),
+ SatMatrix.defs.hh (1.21), SatMatrix.inlines.hh (1.14),
+ SatMatrix.types.hh (1.3), SatRow.defs.hh (1.17),
+ SatRow.inlines.hh (1.17), SatRow.types.hh (1.3), Status.defs.hh
+ (1.19), Status.inlines.hh (1.9), Status.types.hh (1.3),
+ Variable.defs.hh (1.21), Variable.inlines.hh (1.10),
+ Variable.types.hh (1.3): Multiple inclusion guards properly
+ commented.
+
+2002-08-11 Sunday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.h (1.39), Prolog/XSB/ppl_xsb.cc (1.6),
+ Prolog/YAP/ppl_yap.cc (1.41): Comment the closing brace of
+ `extern "C"' blocks.
+
+2002-08-11 Sunday 15:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.61), Constraint.defs.hh (1.66),
+ GenSys.defs.hh (1.75), Generator.defs.hh (1.71), Integer.defs.hh
+ (1.5), Interval.defs.hh (1.5), LinExpression.defs.hh (1.48),
+ Matrix.defs.hh (1.29), Poly_Con_Relation.defs.hh (1.10),
+ Poly_Gen_Relation.defs.hh (1.9), Polyhedron.defs.hh (1.133),
+ Row.defs.hh (1.51), SatMatrix.defs.hh (1.20), SatRow.defs.hh
+ (1.16), Status.defs.hh (1.18), Variable.defs.hh (1.20):
+ Namespace-level indentation fixed.
+
+2002-08-11 Sunday 15:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.5): Add rules concerning block closures and
+ namespace indentation.
+
+2002-08-11 Sunday 11:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.4), Determinate.inlines.hh (1.5),
+ PowerSet.defs.hh (1.7), PowerSet.inlines.hh (1.8): Added methods
+ add_dimensions_and_project(), add_dimensions_and_embed(),
+ remove_dimensions(), and remove_higher_dimensions().
+
+2002-08-10 Saturday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.57), interfaces/C/Makefile.am (1.11),
+ src/Makefile.am (1.48): Bump version numbers.
+
+2002-08-10 Saturday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/.cvsignore (1.2): For those building in the sources
+ directory.
+
+2002-08-10 Saturday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.9): Allow building in any
+ directory (included the one containing the sources).
+
+2002-08-09 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.8): Distribute also expected
+ and expected2.
+
+2002-08-09 Friday 21:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.19), devref-browse.doxyconf-latex.in (1.21),
+ devref-print.doxyconf-latex.in (1.21), devref.doxyconf-html.in
+ (1.22), user-browse.doxyconf-latex.in (1.13),
+ user-print.doxyconf-latex.in (1.13), user.doxyconf-html.in
+ (1.15): Transition to Doxygen 1.2.17 completed.
+
+2002-08-08 Thursday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/.cvsignore (1.6): Ignore also the newly added tests.
+
+2002-08-07 Wednesday 23:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: .cvsignore (1.2), Makefile.am (1.7):
+ Support building in the sources' directory.
+
+2002-08-07 Wednesday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.6), expected2 (1.1): XSB
+ interface now fully operational.
+
+2002-08-07 Wednesday 19:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.5), expected (1.1),
+ ppl_xsb.cc (1.5), xsb_clpq.P (1.3), xsb_clpq2.P (1.1): Bug fixed.
+ Tests with clpq.pl now working.
+
+2002-08-07 Wednesday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.4): Improve the `make check'
+ mechanism.
+
+2002-08-07 Wednesday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/Makefile.am (1.3): MOSTLYCLEANFILES
+ integrated.
+
+2002-08-07 Wednesday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/xsb_clpq.P (1.2): Unneeded parentheses
+ removed.
+
+2002-08-07 Wednesday 11:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/: Makefile.am (1.2), xsb_clpq.P (1.1):
+ Towards a working XSB interface.
+
+2002-08-06 Tuesday 19:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.38): Better comment for the closing
+ #endif of the multiple inclusion guard.
+
+2002-08-06 Tuesday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.4): Wrong initializations
+ fixed.
+
+2002-08-06 Tuesday 18:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.3): Try to get around bugs in
+ XSB 2.5 foreign language interface (several foreign language
+ interface functions do not properly dereference their arguments).
+
+2002-08-05 Monday 17:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.5), AskTell.inlines.hh (1.6),
+ PowerSet.inlines.hh (1.7): Some cleaning.
+
+2002-08-04 Sunday 18:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.4), AskTell.inlines.hh (1.5),
+ Determinate.defs.hh (1.3), Determinate.inlines.hh (1.4),
+ PowerSet.defs.hh (1.6), PowerSet.inlines.hh (1.6): All the
+ entails() functions became definitely_entails() methods. More
+ cleaning.
+
+2002-08-04 Sunday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.3), AskTell.inlines.hh (1.4),
+ PowerSet.defs.hh (1.5), PowerSet.inlines.hh (1.5): More cleaning.
+
+2002-08-04 Sunday 13:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/AskTell.inlines.hh (1.3), src/Determinate.defs.hh (1.2),
+ src/Determinate.inlines.hh (1.3), src/PowerSet.defs.hh (1.4),
+ src/PowerSet.inlines.hh (1.4), tests/mc91.cc (1.3):
+ CS::operator*=() renamed CS::meet_assign(). CS::operator+=()
+ renamed CS::upper_bound_assign().
+
+2002-08-04 Sunday 13:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.47), PowerSet.defs.hh (1.3),
+ PowerSet.inlines.hh (1.3): Use the new classes also for the
+ documentation. The PowerSet construction is now implemented
+ using a sequence. PowerSet::omega_reduction() reimplemented.
+
+2002-08-03 Saturday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.2), PowerSet.inlines.hh (1.2): Complete
+ redesign started.
+
+2002-08-02 Friday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/AskTell.defs.hh (1.2), src/AskTell.inlines.hh (1.2),
+ tests/mc91.cc (1.2): Move all code to AskTell.inlines.hh. Minor
+ improvements.
+
+2002-08-02 Friday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.11), exceptions2.cc (1.7), print.hh
+ (1.10), randphull1.cc (1.2): Include <iostream>.
+
+2002-08-02 Friday 09:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.56): Check whether the Mercury compiler is
+ installed.
+
+2002-08-01 Thursday 18:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.81), mc91.cc (1.1): Test the constraint
+ systems' constructions with McCarthy's 91 function.
+
+2002-08-01 Thursday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.46): Activate the new constraint systems'
+ files.
+
+2002-08-01 Thursday 17:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Determinate.inlines.hh (1.2): Inclusion guard comment fixed.
+
+2002-08-01 Thursday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PowerSet.defs.hh (1.1), PowerSet.inlines.hh (1.1),
+ PowerSet.types.hh (1.1): Initial implementation for the class
+ `PowerSet': the powerset construction on constraint systems.
+
+2002-08-01 Thursday 17:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: AskTell.defs.hh (1.1), AskTell.inlines.hh (1.1),
+ AskTell.types.hh (1.1): Initial implementation for the class
+ `AskTell': the ask and tell construction on constraint systems.
+
+2002-08-01 Thursday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LCompare.defs.hh (1.1), LCompare.inlines.hh (1.1),
+ LCompare.types.hh (1.1): Initial implementation for the class
+ `LCompare': a function object for lexical comparison.
+
+2002-08-01 Thursday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Determinate.defs.hh (1.1), Determinate.inlines.hh (1.1),
+ Determinate.types.hh (1.1): Initial implementation for the class
+ `Determinate': it wraps a polyhedron class into a determinate
+ constraint system interface.
+
+2002-07-30 Tuesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_4-branch.3): Update version.
+
+2002-07-30 Tuesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[2,4]): Mark
+ ChangeLog.
+
+2002-07-30 Tuesday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.3): Updated.
+
+2002-07-29 Monday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING (1.2), INSTALL (1.4), config.guess (1.12), config.sub
+ (1.11), depcomp (1.3), install-sh (1.3), missing (1.5),
+ mkinstalldirs (1.4): Updated to the respective latest versions.
+
+2002-07-29 Monday 10:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.196): Added an assertions to
+ add_constraints(ConSys& cs). Also added a test for emptyness, to
+ avoid adding constraints to a polyhedron already known to be
+ empty.
+
+2002-07-29 Monday 07:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.21): Comment removed.
+
+2002-07-29 Monday 07:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (ppl-0_4-branch.1): Comment
+ removed.
+
+2002-07-29 Monday 07:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_4-branch.3): Mention the fixes to
+ Polyhedron::check_universe() and
+ NNC_Polyhedron::NNC_Polyhedron(ConSys& cs).
+
+2002-07-29 Monday 01:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc, src/GenSys.cc, tests/universe6.cc,
+ src/Polyhedron.cc (ppl-0_4-branch.[1,1,1,2]): The following
+ corrections made on HEAD are now reported in the ppl-0_4-branch:
+ - fixed a bug in ConSys/GenSys.adjust_topology_and_dimension() -
+ fixed a bug in Polyhedron::check_universe().
+
+2002-07-29 Monday 00:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.195): Fixed a bug in check_universe(), which
+ was returning the wrong result when called by a zero-dim universe
+ polyhedron.
+
+2002-07-29 Monday 00:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.39), GenSys.cc (1.58): Methods
+ adjust_topology_and_dimension() now behave properly even on
+ constraint/generator systems having no rows.
+
+2002-07-29 Monday 00:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/universe6.cc (1.2): Added a new test, showing two bugs: -
+ the first bug has to do with an invariant that was not fullfilled
+ when creating an NNC polyehdron starting from an empty
+ constraint system; this bug was only visible when compiling
+ with assertions turned on. - the second bug was due to the fact
+ that check_universe() returns the wrong result when applied
+ to a zero-dim-universe polyhedron.
+
+2002-07-28 Sunday 20:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/.cvsignore (1.1): Put under CVS control.
+
+2002-07-28 Sunday 20:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/pl_check.pl (1.20): Properly initialize and
+ finalize the library.
+
+2002-07-28 Sunday 19:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.13),
+ GNU/ppl_gprolog_sd.cc (1.8), SICStus/ppl_sicstus_sd.cc (1.24),
+ SWI/ppl_swiprolog.cc (1.48), YAP/ppl_yap.cc (1.40): Fixed some
+ comments and assertions.
+
+2002-07-28 Sunday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/XSB/ppl_xsb.cc (1.2): Several bugs fixed.
+
+2002-07-28 Sunday 12:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.2): Updated.
+
+2002-07-28 Sunday 11:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_4-branch.1): Updated for version 0.4.1.
+
+2002-07-28 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_4-branch.2): Add news for version 0.4.1.
+
+2002-07-28 Sunday 11:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_4-branch.2): Bump version number.
+
+2002-07-28 Sunday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Integer.types.hh, Makefile.am (ppl-0_4-branch.[1,1]):
+ Document the fact that Parma_Polyhedra_Library::Integer is a
+ synonym for GMP's mpz_class.
+
+2002-07-24 Wednesday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/Makefile.am (1.8): Ciao Prolog library
+ renamed.
+
+2002-07-24 Wednesday 14:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Integer.types.hh (1.3), Makefile.am (1.45): Document the
+ fact that Parma_Polyhedra_Library::Integer is a synonym for GMP's
+ mpz_class.
+
+2002-07-23 Tuesday 18:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.70): Corrected doxygen comments to
+ shorthands functions line, ray, point.
+
+2002-07-23 Tuesday 18:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.88): Small correction in the example of
+ the use of an extended generator system.
+
+2002-07-22 Monday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.12),
+ GNU/ppl_gprolog_sd.cc (1.7), SICStus/ppl_sicstus_sd.cc (1.23),
+ SWI/ppl_swiprolog.cc (1.47), YAP/ppl_yap.cc (1.39): Comments
+ fixed. Avoid macros with unused parameters.
+
+2002-07-22 Monday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.55), interfaces/Prolog/Makefile.am (1.19),
+ interfaces/Prolog/XSB/Makefile.am (1.1),
+ interfaces/Prolog/XSB/ppl_xsb.H (1.1),
+ interfaces/Prolog/XSB/ppl_xsb.cc (1.1): New Prolog interface.
+
+2002-07-22 Monday 14:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc, tests/Makefile.am, tests/polydifference2.cc
+ (ppl-0_4-branch.[1,1,1]): The corrections of the bug identified
+ in revisions 1.193 and 1.194 of the HEAD branch are now reported
+ in the ppl-0_4-branch. The same for the test that outlighted the
+ bug.
+
+2002-07-10 Wednesday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/polydifference2.cc (1.3): Don't be noisy.
+
+2002-07-10 Wednesday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.194): Corrected a bug in
+ poly_difference_assign(const Polyhedron& y). No longer ignoring
+ the equality constraints of `y' (the bug was affecting both C and
+ NNC computations).
+
+2002-07-10 Wednesday 12:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/polydifference2.cc (1.2): Output improved.
+
+2002-07-10 Wednesday 11:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.193): Corrected a bug in
+ Polyhedron::operator=(...). When assigning to *this a polyhedron
+ declared to be empty, we now call set_empty() to also clear the
+ constraint and generator systems, therefore enforcing the
+ corresponding invariant.
+
+2002-07-10 Wednesday 11:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.80), polydifference2.cc (1.1): Added a new
+ test showing two bugs: - the assignment operator on Polyhedron
+ breaks the invariant saying that an empty polyhedron has a
+ constraint system with either no rows or a single
+ unsatisfiable constraint; - the current implementation of
+ poly_difference_assign() is wrong in that it disregards
+ equality constraints.
+
+2002-07-03 Wednesday 15:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: fake_main.pl (1.1), ppl_ciao.pl (1.20):
+ Wrong declarations fixed (thanks to Jose Morales). The file
+ fake_main.pl is a kludge to convince ciaoc to produce object code
+ (the `-c' option is broken in Ciao Prolog 1.8 #2). Missing
+ predicate declarations have been added.
+
+2002-07-02 Tuesday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.19): Some bugs have been
+ fixed.
+
+2002-07-02 Tuesday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.54): Version bumped: we are now in the 0.5 era.
+
+2002-07-02 Tuesday 22:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.53), interfaces/Prolog/Makefile.am (1.18): The
+ Ciao Prolog interface has been re-enabled.
+
+2002-07-02 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.52), Watchdog/configure.ac (1.9): Shared
+ libraries are again turned off by default.
+
+2002-07-02 Tuesday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_4-branch.1), NEWS (1.28): Cut and paste error fixed.
+
+2002-07-01 Monday 18:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_4-branch.1): Update version.
+
+2002-07-01 Monday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[1,1]): Mark
+ ChangeLog.
+
+2002-07-01 Monday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.9): Updated.
+
+2002-07-01 Monday 16:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.11), config.sub (1.10), ltmain.sh (1.5): Updated.
+
+2002-07-01 Monday 08:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.27): Updated.
+
+2002-06-30 Sunday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * STANDARDS (1.4): Use the same form of headings.
+
+2002-06-30 Sunday 22:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.12): Mention the support for NNC polyhedra. Updated
+ for PPL 0.4. Organization of source distributions updated.
+
+2002-06-30 Sunday 22:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/ppl_gprolog.pl (1.16): Bug fixed in
+ limited_H79_widening_assign.
+
+2002-06-30 Sunday 21:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.15): Mention not necessarily closed convex
+ polyhedra in the main %description.
+
+2002-06-30 Sunday 20:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: check_script (1.3), expected (1.2): Test
+ ack.clpq with the easier query `?- ack(2, 1, Z).'.
+
+2002-06-30 Sunday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.defs.hh (1.5), Watchdog.inlines.hh (1.4):
+ Implementation of inline functions moved to Watchdog.inlines.hh.
+
+2002-06-30 Sunday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/ChangeLog (1.2): This file will no longer be empty.
+
+2002-06-30 Sunday 15:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.51), Watchdog/configure.ac (1.8): Invocations to
+ AC_PROG_* macros repositioned.
+
+2002-06-30 Sunday 15:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.69): Friend declaration split
+ differently.
+
+2002-06-30 Sunday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.defs.hh (1.4), Watchdog.inlines.hh (1.3): Use
+ methods instead of friends for binary operators over Time.
+
+2002-06-30 Sunday 12:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/.cvsignore (1.4), SICStus/.cvsignore
+ (1.4), SWI/.cvsignore (1.4), YAP/.cvsignore (1.4): Added files to
+ be ignored.
+
+2002-06-30 Sunday 12:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/.cvsignore (1.3), GNU/.cvsignore (1.3),
+ SICStus/.cvsignore (1.3), YAP/.cvsignore (1.3): For those
+ building in the sources' directory.
+
+2002-06-30 Sunday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.50): Make building shared libraries the default.
+
+2002-06-29 Saturday 21:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.60), ppl_prolog.icc
+ (1.60), Ciao/ppl_ciao.pl (1.18), GNU/ppl_gprolog.pl (1.15),
+ SICStus/ppl_sicstus_sd.cc (1.22), SWI/ppl_swiprolog.cc (1.46),
+ YAP/ppl_yap.cc (1.38): Added documentation for Prolog interface
+ predicates bounds from above/below and moved definitions to
+ follow that of is_bounded.
+
+2002-06-29 Saturday 14:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.19), ppl_prolog.icc (1.59),
+ Ciao/ppl_ciao.pl (1.17), GNU/ppl_gprolog.pl (1.14),
+ SICStus/ppl_sicstus_sd.cc (1.21), SWI/ppl_swiprolog.cc (1.45),
+ YAP/ppl_yap.cc (1.37): Predicates for bounds_from_above/below
+ added to Prolog interface.
+
+2002-06-29 Saturday 08:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.41), ppl_c.h (1.37): Added
+ ppl_Polyhedron_bounds_from_above() and
+ ppl_Polyhedron_bounds_from_below().
+
+2002-06-29 Saturday 08:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.192), Polyhedron.defs.hh (1.132),
+ Polyhedron.inlines.hh (1.39): Added bool bounds_from_above(const
+ LinExpression&) const and bool bounds_from_below(const
+ LinExpression&) const: both are implemented in terms of the new
+ bool bounds(const LinExpression& expr, bool from_above) const.
+
+2002-06-28 Friday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.191): Polyhedron::is_bounded() improved.
+
+2002-06-28 Friday 22:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: clpq2.pl (1.21), expected2 (1.5): Undo the
+ changes corresponding to the last two commits of clpq2.pl and to
+ the last commit of expected2.
+
+2002-06-28 Friday 17:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq2.pl (1.20), expected2 (1.4): Updated the
+ expected2 file to match current clpq2.pl clpq2.pl has a minor bug
+ fixed when writing equality bindings that were not included as
+ constraints (this does not affect the results of the
+ check_script2).
+
+2002-06-28 Friday 09:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: memory1.cc (1.5), timings.cc (1.2): Improved error
+ handling.
+
+2002-06-28 Friday 09:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/memory1.cc (1.4): Cleaned and improved error handling.
+
+2002-06-27 Thursday 09:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.defs.hh (1.60), src/ConSys.inlines.hh (1.22),
+ src/GenSys.defs.hh (1.74), src/GenSys.inlines.hh (1.24),
+ tests/NNCminimize1.cc (1.4), tests/NNCminimize2.cc (1.4),
+ tests/NNCminimize3.cc (1.4), tests/NNCminimize4.cc (1.6): Added
+ public method clear() to ConSys and GenSys. Added a FIXME
+ comment to NNCminimize* tests.
+
+2002-06-27 Thursday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.59), ConSys.inlines.hh (1.21),
+ Constraint.defs.hh (1.65), Constraint.inlines.hh (1.37),
+ GenSys.defs.hh (1.73), GenSys.inlines.hh (1.23),
+ Generator.defs.hh (1.68), Generator.inlines.hh (1.34),
+ LinExpression.defs.hh (1.47), LinExpression.inlines.hh (1.20):
+ Added several versions of swap() to cope with the private
+ inheritance problems caused by the departure of PPL_HIDDEN.
+
+2002-06-27 Thursday 08:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.inlines.hh (1.33): Avoid redefinition of default
+ arguments.
+
+2002-06-26 Wednesday 19:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.57), GenSys.defs.hh (1.72): Added
+ std::ostream& operator<<(std::ostream&, const GenSys&) and
+ std::istream& operator>>(std::istream&, GenSys&).
+
+2002-06-26 Wednesday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.38), ConSys.defs.hh (1.58), Matrix.cc (1.39):
+ Added std::ostream& operator<<(std::ostream&, const ConSys&) and
+ std::istream& operator>>(std::istream&, ConSys&).
+
+2002-06-26 Wednesday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in (1.20),
+ doc/devref-print.doxyconf-latex.in (1.20),
+ doc/devref.doxyconf-html.in (1.21), interfaces/C/Makefile.am
+ (1.10), interfaces/C/ppl_c.cc (1.40),
+ interfaces/Prolog/Ciao/Makefile.am (1.7),
+ interfaces/Prolog/GNU/Makefile.am (1.23),
+ interfaces/Prolog/SICStus/Makefile.am (1.28),
+ interfaces/Prolog/SWI/Makefile.am (1.25),
+ interfaces/Prolog/YAP/Makefile.am (1.15), src/ConSys.defs.hh
+ (1.57), src/Constraint.defs.hh (1.64), src/GenSys.defs.hh (1.71),
+ src/Generator.defs.hh (1.67), src/LinExpression.defs.hh (1.46),
+ src/Makefile.am (1.44), src/Poly_Con_Relation.defs.hh (1.9),
+ src/Poly_Gen_Relation.defs.hh (1.8), src/ppl_filter_doxygen.sed
+ (1.3), src/ppl_filter_install.sed (1.3): PPL_HIDDEN has gone.
+
+2002-06-26 Wednesday 18:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: ConSys.defs.hh (1.56), Constraint.defs.hh (1.63),
+ GenSys.defs.hh (1.70): Minor improvements to comments (just
+ English).
+
+2002-06-26 Wednesday 18:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.66), Generator.inlines.hh (1.32),
+ Makefile.am (1.43): Added new shorthand non-member functions for
+ creting generators: Generator line(const LinExpression&),
+ Generator ray(const LinExpression&), Generator point(const
+ LinExpression&, const Integer&), Generator closure_point(const
+ LinExpression&, const Integer&).
+
+2002-06-26 Wednesday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.cc (1.39), Prolog/ppl_prolog.icc (1.58): Use
+ the new static members of Generator to construct generatos.
+
+2002-06-26 Wednesday 15:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.45): Removed spurious duplicated
+ declaration (was already commented out).
+
+2002-06-26 Wednesday 15:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.40), Row.defs.hh (1.50), globals.cc (1.8),
+ globals.hh (1.19): const Integer& operator*(const Constraint&,
+ const Generator&) and const Integer& reduced_scalar_product(const
+ Constraint&, const Generator&) moved from Row.* to globals.*.
+
+2002-06-26 Wednesday 14:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.62), Generator.cc (1.35),
+ Generator.defs.hh (1.65), LinExpression.defs.hh (1.44),
+ Makefile.am (1.42), Polyhedron.cc (1.190), Row.cc (1.39),
+ Row.defs.hh (1.49): Started getting rid of preprocessing flag
+ PPL_HIDDEN (work still in progress - build broken).
+
+2002-06-26 Wednesday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.55), GenSys.defs.hh (1.69): Input and
+ output operator for Polyhedron made friends of ConSys and GenSys.
+
+2002-06-26 Wednesday 14:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (1.37): Comment alignment fixed.
+
+2002-06-26 Wednesday 08:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.87): Improved and corrected affine image
+ paragraph.
+
+2002-06-25 Tuesday 16:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.86): More improvements to paragraph on
+ affine image operations.
+
+2002-06-25 Tuesday 16:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.85): For uniformity, using \cQ instead of
+ \cP' in the section about widening.
+
+2002-06-25 Tuesday 16:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.84): Improved the section about
+ addition/removal of space dimensions.
+
+2002-06-25 Tuesday 16:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.131): The documentation for the swap
+ function on Polyhedron objects now appears in the user manuals
+ too.
+
+2002-06-25 Tuesday 15:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.types.hh (1.3): Added comments to `namespace std'.
+
+2002-06-25 Tuesday 15:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.83): Added more on an affine preimage.
+
+2002-06-25 Tuesday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/.cvsignore (1.3), src/.cvsignore (1.6), tests/.cvsignore
+ (1.5): For those building in the sources' directory.
+
+2002-06-25 Tuesday 15:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.82): Added formal definition of the
+ time-elapse operator.
+
+2002-06-25 Tuesday 14:16 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.81): Changed rows and columns round in the
+ affine paragraph.
+
+2002-06-25 Tuesday 14:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.80), src/Polyhedron.defs.hh (1.130):
+ Adding some references to the introduction to the documentation
+ of operators.
+
+2002-06-25 Tuesday 14:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.19),
+ devref-print.doxyconf-latex.in (1.19), devref.doxyconf-html.in
+ (1.20): No longer including the second part of the introduction
+ in the devref's manuals, since it is not up-to-date.
+
+2002-06-25 Tuesday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.79): Examples added to explanation of
+ affine image operator.
+
+2002-06-25 Tuesday 13:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.78): Started explaining the affine
+ operators.
+
+2002-06-25 Tuesday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.77), src/Polyhedron.defs.hh (1.129): In
+ the widening and poly-difference comments, using the \anchor
+ doxygen command to link to a specific paragraph of the
+ introduction.
+
+2002-06-25 Tuesday 11:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.128): A few docuemntation errors
+ corrected. Added a note about methods ending in _and_minimize(),
+ to explain the menaing of their return value. From all of their
+ brief doxygen comments, moved the corresponding sentence on their
+ return value, which is now placed in the detailed doxygen
+ comment, using the \return command.
+
+2002-06-25 Tuesday 11:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.76): Renamed variables in example in
+ paragraph wrt adding dimensions.
+
+2002-06-25 Tuesday 11:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.19): Improved version of clpq2.pl:
+ - Code formatting corrected; - Unused predicate
+ definitions removed; - Predicates renamed to match
+ functionality; - Much more efficient as it projects unwanted
+ dimensions away; - Allows input variables to bind to Herbrand
+ terms; - Allows integer expressions as input (eg fib(2,
+ X+1)).
+
+2002-06-25 Tuesday 10:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.75): Added paragraphs on adding and
+ removing dimensions.
+
+2002-06-25 Tuesday 08:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.18): More tidying of the tests.
+
+2002-06-25 Tuesday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.49): Version number bumped.
+
+2002-06-25 Tuesday 08:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: ConSys.cc (1.36), Generator.defs.hh (1.64), Polyhedron.cc
+ (1.189), Polyhedron.defs.hh (1.127), conversion.cc (1.29): In all
+ files, changed reference to Introduction to the relevant section.
+ In Polyhedron.defs.hh: - A few minor changes to English
+ expressions. - An x_1 changed to y.
+
+2002-06-25 Tuesday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.26), doc/definitions.dox (1.74), interfaces/C/ppl_c.cc
+ (1.38), interfaces/C/ppl_c.h (1.36),
+ interfaces/Prolog/Prolog_interface.dox (1.59),
+ interfaces/Prolog/pl_check.pl (1.17),
+ interfaces/Prolog/ppl_prolog.icc (1.57),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.16),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.13),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.20),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.44),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.36), src/Polyhedron.cc
+ (1.188), src/Polyhedron.defs.hh (1.126), tests/.cvsignore (1.4),
+ tests/Makefile.am (1.79), tests/exceptions1.cc (1.10),
+ tests/h79widening1.cc (1.1), tests/h79widening2.cc (1.1),
+ tests/h79widening3.cc (1.1), tests/limitedh79widening1.cc (1.1),
+ tests/limitedh79widening2.cc (1.1), tests/limitedwideningcc921.cc
+ (1.2), tests/limitedwideningcc922.cc (1.2), tests/permute.cc
+ (1.18), tests/wideningcc921.cc (1.3), tests/wideningcc922.cc
+ (1.3), tests/wideningcc923.cc (1.2): The widening is now called
+ H79 not to confuse the user.
+
+2002-06-25 Tuesday 06:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.14): %files section for gprolog package fixed.
+
+2002-06-24 Monday 23:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.13): %files section fixed for the yap package.
+
+2002-06-24 Monday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.14): Do not forget
+ yap_clpq2.pl.
+
+2002-06-24 Monday 21:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.58): Should now contain
+ all the information need to use the Prolog interface.
+
+2002-06-24 Monday 18:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.187), Polyhedron.defs.hh (1.125): The
+ detailed comments about class Polyhedron improved. Better
+ marking the start of detailed doxygen sections in the
+ documentation of Polyhedron methods (using /*! ... */ instead of
+ multi-line //!). Adjusted a couple of old comments saying that
+ the return value of minimize() was `true' when the polyhedron is
+ found to be empty.
+
+2002-06-24 Monday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.22): Added definitions for
+ libppl_gprolog_la_LIBADD and libppl_gprolog_la_LDFLAGS.
+
+2002-06-24 Monday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.12): The %files sections of each package are now
+ complete.
+
+2002-06-24 Monday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.57): Dealt with the
+ issue of initialization and finalization.
+
+2002-06-24 Monday 17:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.21): Install also
+ ppl_gprolog.pl.
+
+2002-06-24 Monday 17:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.56): Reorganization
+ started.
+
+2002-06-24 Monday 15:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * NEWS (1.25), STANDARDS (1.3): Minor spelling/grammar corrections.
+
+2002-06-24 Monday 15:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.124), Polyhedron.inlines.hh (1.38):
+ Adding short doxygen comment to Polyhedron related functions.
+
+2002-06-24 Monday 14:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * STANDARDS (1.2): Sketching the first rules to obtain a somewhat
+ standard Doxygen documentation style.
+
+2002-06-24 Monday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.186): Polyhedron::remove_dimensions() fixed.
+
+2002-06-24 Monday 14:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/removedim6.cc (1.6): This test was carefully written so as
+ to cover a bug in the library: fixed.
+
+2002-06-24 Monday 13:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.18): Final delete_Polyhedron for Q
+ now replaced by cleanup call and by adding polyhedron Q to list
+ of used polyhedra in head of solve_query.
+
+2002-06-24 Monday 13:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.185), Polyhedron.defs.hh (1.123): Going on
+ enforcing new rules on doxygen comments of class Polyhedron.
+
+2002-06-24 Monday 12:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.16): Improved layout and
+ comments. Simplified and renamed some tests while adding others.
+
+2002-06-24 Monday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.7): Fixed typo in a comment.
+
+2002-06-24 Monday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.48): Effectively disable the
+ interface/Prolog/Ciao directory.
+
+2002-06-24 Monday 11:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.54), GenSys.defs.hh (1.68),
+ Generator.defs.hh (1.63): Added examples to ConSys and GenSys
+ documentation using strict inequalities and closure points.
+ Improved terminology note point/vertex in Generator.
+
+2002-06-24 Monday 11:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Poly_Con_Relation.defs.hh (1.8): Missing full stop added.
+
+2002-06-24 Monday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.24): Distribute also
+ ppl_swiprolog.pl.
+
+2002-06-24 Monday 00:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.184), Polyhedron.defs.hh (1.122),
+ Polyhedron.inlines.hh (1.37): Started uniformizing doxygen
+ comments of class Polyehdron according to new rules.
+
+2002-06-24 Monday 00:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.inlines.hh (1.20), GenSys.inlines.hh (1.22),
+ LinExpression.inlines.hh (1.19), Row.inlines.hh (1.27),
+ SatMatrix.inlines.hh (1.13), SatRow.inlines.hh (1.16): Relating
+ std::swap functions to the corresponding classes.
+
+2002-06-23 Sunday 22:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.48): Surrounding the #define
+ EXTRA_NORMALIZATION 0 with #ifndef EXTRA_NORMALIZATION.
+
+2002-06-23 Sunday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.55), ppl_prolog.icc
+ (1.56), Ciao/ppl_ciao.cc (1.11), GNU/ppl_gprolog_sd.cc (1.6),
+ SICStus/ppl_sicstus_sd.cc (1.19), SWI/Makefile.am (1.23),
+ SWI/ppl_swiprolog.cc (1.43), SWI/ppl_swiprolog.pl (1.1),
+ YAP/Makefile.am (1.13), YAP/ppl_yap.cc (1.35): Avoid unnecessary
+ differences in the implementation of the various Prolog
+ interfaces. Hook ppl_Prolog_sysdep_deinit() added.
+
+2002-06-23 Sunday 22:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.35), ConSys.defs.hh (1.53), GenSys.cc (1.56),
+ Matrix.cc (1.38), Matrix.defs.hh (1.28), Matrix.inlines.hh
+ (1.24): Fixed doxygen comments in class Matrix. Changed raw
+ output methods get() and print() to also read/write information
+ about topology. Changed the corresponding methods of ConSys and
+ GenSys so that they no longer output this information.
+
+2002-06-23 Sunday 18:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.28), Generator.cc (1.34): Using flag
+ EXTRA_NORMALIZATION instead of STRONG_NORMALIZATION.
+
+2002-06-23 Sunday 18:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Init.defs.hh (1.3): Added short doxygen comment to class
+ Init.
+
+2002-06-23 Sunday 18:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.183), tests/timeelapse5.cc (1.2):
+ Implementation of time_elapse corrected and cleaned. The test
+ timeelapse5 corrected according to the new specification.
+
+2002-06-23 Sunday 15:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.17): The Ciao-Prolog interface
+ will not be included in PPL 0.4.
+
+2002-06-23 Sunday 15:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: Makefile.am (1.12), ppl_yap.cc (1.34),
+ yap_clpq.pl (1.5), yap_clpq2.pl (1.1): The YAP interface is now
+ complete and running.
+
+2002-06-22 Saturday 11:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Topology.hh (1.5): Nothing (apart comments) should follow
+ #endif.
+
+2002-06-22 Saturday 08:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/globals.hh (1.18): Long comment for class Throwable improved.
+ Function maybe_abandon() related to class Throwable.
+
+2002-06-22 Saturday 08:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.defs.hh (1.7), Poly_Gen_Relation.defs.hh
+ (1.7): Comments of *_Relation classes adapted to new doxygen
+ rules.
+
+2002-06-21 Friday 23:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.52), GenSys.defs.hh (1.67),
+ Generator.defs.hh (1.62), Topology.hh (1.4): Adapted doxygen
+ comments of classes ConSys and GenSys to the new style. Added
+ short description for the enumeration Topology (in the devref
+ manual).
+
+2002-06-21 Friday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.35): No longer use __BEGIN_DECLS and
+ __END_DECLS (so as not to provoke pollution). Use a brief only
+ description for the opaque pointers. Undefine
+ PPL_TYPE_DECLARATION as soon as we are done with it.
+ Documentation for all the *_OK() functions improved: they do not
+ always make noise (if the compilation was done with NDEBUG
+ defined, they do not make any noise).
+
+2002-06-21 Friday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Polyhedron.defs.hh (1.11): Alignment fixed in a comment.
+
+2002-06-21 Friday 19:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.27), Constraint.defs.hh (1.61),
+ Constraint.inlines.hh (1.36), Generator.defs.hh (1.61),
+ LinExpression.defs.hh (1.43): Documentation of classes
+ LinExpression, Constraint and Generator adapted to the new
+ doxygen rules.
+
+2002-06-21 Friday 19:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.10), NNC_Polyhedron.defs.hh (1.14):
+ Avoiding repetitions due to REPEAT_BRIEF = YES.
+
+2002-06-21 Friday 19:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.18),
+ devref-print.doxyconf-latex.in (1.18), devref.doxyconf-html.in
+ (1.19), user-browse.doxyconf-latex.in (1.12),
+ user-print.doxyconf-latex.in (1.12), user.doxyconf-html.in
+ (1.14): Changed doxygen configuration files so that brief
+ comments are always repeated at the beginning of long comments
+ (REPEAT_BRIEF = YES).
+
+2002-06-21 Friday 15:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.9), NNC_Polyhedron.defs.hh (1.13):
+ For classes C_Polyhedron and NNC_Polyhedron, adopting the new
+ doxygen standards about brief/long comments.
+
+2002-06-21 Friday 15:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.27), Row.inlines.hh (1.26): Non-friend
+ but related functions should have the \relates special doxygen
+ command.
+
+2002-06-21 Friday 15:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/SatRow.cc (1.9): As things are now, doxygen comments to
+ friend functions should not have the \relates special command.
+
+2002-06-21 Friday 09:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.47): Use C to test the presence and usability of
+ <glpk.h>. Use the new style AC_LANG(LANGUAGE) macro.
+
+2002-06-21 Friday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.20): Additions
+ MOSTLYCLEANFILES.
+
+2002-06-20 Thursday 22:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.54),
+ track_allocation.hh (1.6): Prolog allocation tracking properly
+ reimplemented.
+
+2002-06-20 Thursday 22:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.17): Singleton variable renamed so
+ as to disable the corresponding warning.
+
+2002-06-20 Thursday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.cc (1.2): Do not redefine the default arguments.
+
+2002-06-20 Thursday 21:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.73): A few improvements in the first
+ paragraph of the introduction. Better explained what a preimage
+ is and some chnages to the paragraph on the DD method.
+
+2002-06-20 Thursday 21:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Row.cc (1.38), Row.defs.hh (1.47), Row.inlines.hh (1.25),
+ SatMatrix.cc (1.17), SatMatrix.defs.hh (1.19),
+ SatMatrix.inlines.hh (1.12), SatRow.cc (1.8), SatRow.defs.hh
+ (1.15), SatRow.inlines.hh (1.15), Status.defs.hh (1.17): Added
+ \relates doxygen commands to match related function declarations
+ and definitions.
+
+2002-06-20 Thursday 13:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.72): Reordered the bibliography to be
+ alphabetical. Changed the syntax in Bounded Polyhedra. Moved
+ Rational Polyhedra to end of section on representations (it needs
+ the definition of constraint representation). Comment in
+ Generators Representation wrt this moved to the Rational one.
+ Small change of wording to Points... paragraph.
+
+2002-06-20 Thursday 13:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.53): Corrected the
+ grammar rules for Rational and made other changes related to
+ this.
+
+2002-06-20 Thursday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.37): Functions dealing with closure
+ points and strict inequalities were still commented out: fixed.
+
+2002-06-20 Thursday 12:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.52): Improvements to
+ grammar rules. List_of_Constraints and List_of_Generators now
+ specified formally as Constraint_System and Generator_System.
+
+2002-06-20 Thursday 12:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.51): Improved
+ description of "relation with" predicates.
+
+2002-06-20 Thursday 11:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.50): In the grammar
+ rules Numerator and Denominator are non-terminals and should
+ start with capitals.
+
+2002-06-20 Thursday 11:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.49): Many improvements,
+ including: Where comments were repeated elswhere (ie
+ compatibility rules) they have been removed. Where possible,
+ references to relevant sections in the introduction have been
+ made. Grammar rule for Relation added.
+
+2002-06-20 Thursday 11:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.71): Improved the paragraph on topological
+ compatibility.
+
+2002-06-20 Thursday 09:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.16): Cleaned up previous changes.
+
+2002-06-20 Thursday 08:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.15): Revised the way unwanted
+ polyhedron are removed. It has not been checked yet for leaks.
+
+2002-06-20 Thursday 08:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.14): PPL is the right acronym in
+ normal text.
+
+2002-06-20 Thursday 08:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/expected2 (1.3): Corrected with the right
+ results.
+
+2002-06-20 Thursday 07:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.13): Bug fixed and I hope the
+ variable ordering is now stable so that the constraints are
+ presented uniformly in all Prologs.
+
+2002-06-19 Wednesday 23:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.60), Generator.defs.hh (1.60),
+ Generator.inlines.hh (1.31), Variable.defs.hh (1.19): Using the
+ \relates doxygen special command to have non-member and
+ non-friend functions listed in the related classes.
+
+2002-06-19 Wednesday 22:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.55), track_allocation.hh
+ (1.5): Leave the responsibility of TRACK_ALLOCATION to
+ track_allocation.hh.
+
+2002-06-19 Wednesday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.12): A couple of trivial formatting
+ changes.
+
+2002-06-19 Wednesday 20:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.20), STANDARDS (1.1): The `STANDARDS' file will
+ contain a description of our coding standards.
+
+2002-06-19 Wednesday 20:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: clpq.pl (1.12), clpq2.pl (1.11): Use a
+ uniform coding style.
+
+2002-06-19 Wednesday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.19): Use the 2nd CLP(Q)
+ interpreter for regression testing.
+
+2002-06-19 Wednesday 18:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.22): Fixed the dependencies
+ of the `check-local' target.
+
+2002-06-19 Wednesday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.10): Fixed calls meant to be to
+ ppl_delete_Polyhedron/1.
+
+2002-06-19 Wednesday 18:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: expected2 (1.2), check_script2 (1.2):
+ Trailing blank line removed.
+
+2002-06-19 Wednesday 17:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.48): Many ongoing
+ changes.
+
+2002-06-19 Wednesday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.16): Distributes also
+ check_script2 and expected2.
+
+2002-06-19 Wednesday 16:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.47): Corrected a typo
+ in the first paragraph about the SICStus Prolog interface.
+
+2002-06-19 Wednesday 16:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.34): Corrected a typo in the
+ documentation of PPL_CONSTRAINT_TYPE_GREATER_THAN.
+
+2002-06-19 Wednesday 16:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.18): Adjusted comment about the
+ constructor.
+
+2002-06-19 Wednesday 16:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.70): Improvements to the space dimension
+ and the relation with paragraphs.
+
+2002-06-19 Wednesday 15:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.121), globals.hh (1.17): Added a
+ short description for class Throwable. Corrected a typo in
+ comment for remove_dimensions.
+
+2002-06-19 Wednesday 15:18 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.69): Bounding box paragraph improved a
+ little.
+
+2002-06-19 Wednesday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.68): Corrected spurious uses of the macro
+ \mathord. Some improvements in the paragraph on bounding boxes:
+ the standard notation for the i-th vector of the canonical base
+ is \vect{e}_i.
+
+2002-06-19 Wednesday 14:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.67): Changes to relation-wirh and widening
+ paragraphs.
+
+2002-06-19 Wednesday 14:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/sp_clpq.pl (1.7): Import append/3 and
+ member/2 from library(lists).
+
+2002-06-19 Wednesday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/clpq2.pl (1.9): Avoid defining append/3 and
+ member/2, since they are defined as built-ins or provided as
+ library predicates by any supported Prolog implementation
+ (SWI-Prolog seems to be annoyed if a user program tries to
+ redefine them).
+
+2002-06-19 Wednesday 14:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.4): Upgraded from the CVS version of libtool.
+
+2002-06-19 Wednesday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.27), sp_clpq.pl (1.6):
+ Use the 2nd CLP(Q) interpreter for regression testing.
+
+2002-06-19 Wednesday 14:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Makefile.am (1.15): Distribute also the tests
+ for strict inequalities.
+
+2002-06-19 Wednesday 14:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.66): Changes in the paragraph on the
+ relation-with operators.
+
+2002-06-19 Wednesday 13:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.18), SWI/Makefile.am
+ (1.21): Use the configured version of libtool.
+
+2002-06-19 Wednesday 11:43 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.46): Changed the
+ description for the assignment predicates.
+
+2002-06-19 Wednesday 11:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.65): A first draft for a paragraph on the
+ relation-with operators.
+
+2002-06-19 Wednesday 10:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.64): Using the macro \nonnegRset in the
+ paragraph defiing extreme rays.
+
+2002-06-19 Wednesday 10:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.63), ppl.sty (1.10): Some improvements
+ in the introduction. Redefined the command \vec following
+ llncs.cls.
+
+2002-06-19 Wednesday 08:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.45), pl_check.pl
+ (1.15), ppl_prolog.icc (1.54), Ciao/ppl_ciao.pl (1.15),
+ GNU/ppl_gprolog.pl (1.12), SICStus/ppl_sicstus_sd.cc (1.18),
+ SWI/ppl_swiprolog.cc (1.42), YAP/ppl_yap.cc (1.33): Predicates
+ ppl_Polyhedron_topological_closure_assign and
+ ppl_Polyhedron_is_topologically_closed added.
+
+2002-06-19 Wednesday 08:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.36), interfaces/C/ppl_c.h (1.33),
+ src/Polyhedron.defs.hh (1.120): Added topological closure test
+ and assignment to the C interface.
+
+2002-06-19 Wednesday 07:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/schedule.clpq (1.3): Use a uniform syntax.
+
+2002-06-19 Wednesday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/Makefile.am (1.11): Checking mechanism
+ fixed (but still commented out).
+
+2002-06-19 Wednesday 07:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: check_script2 (1.1), expected2 (1.1),
+ SWI/Makefile.am (1.20): Test also with clpq2.pl.
+
+2002-06-19 Wednesday 07:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: clpq.pl (1.11), clpq2.pl (1.8): Improved the
+ query for more solutions.
+
+2002-06-18 Tuesday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.14): Use
+ use_foreign_library/1 instead of use_foreign_source/1.
+
+2002-06-18 Tuesday 17:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.53): Indentation fixed.
+
+2002-06-18 Tuesday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/ppl_ciao.pl (1.13): Declarations
+ completed.
+
+2002-06-18 Tuesday 17:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.62): Corrected a typo in the definition of
+ closed polyhedra. Improved the paragraph on dimension
+ compatibility to make it independent from th epolyhedra topology.
+
+2002-06-18 Tuesday 15:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.7): Just a little more robust in
+ that it fails if there are variables in non-integer positions in
+ a query rather than crashing.
+
+2002-06-18 Tuesday 15:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.14): Tidied the tests on
+ bounding boxes.
+
+2002-06-18 Tuesday 14:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.44), pl_check.pl
+ (1.13), ppl_prolog.icc (1.52), Ciao/ppl_ciao.pl (1.12),
+ GNU/ppl_gprolog.pl (1.11), SICStus/ppl_sicstus_sd.cc (1.17),
+ SWI/ppl_swiprolog.cc (1.41), YAP/ppl_yap.cc (1.32):
+ ppl_new_Polyhedron_from_ConSys and ppl_new_Polyhedron_from_GenSys
+ renamed ppl_new_Polyhedron_from_constraints and
+ ppl_new_Polyhedron_from_generators, respectively.
+
+2002-06-18 Tuesday 12:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.61): Added a preamble based on the ppl
+ home web page.
+
+2002-06-18 Tuesday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.60): Reorganised the introductory
+ sections.
+
+2002-06-18 Tuesday 11:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.inlines.hh (1.35): Corrected a trivial bug just
+ introduced in Constraint operator>(const LinExpression& e1,
+ const LinExpression& e2).
+
+2002-06-18 Tuesday 10:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/schedule.clpq (1.2): Improved layout.
+
+2002-06-18 Tuesday 10:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq2.pl (1.6), schedule.clpq (1.1): clpq2.pl
+ now allows Herbrand terms as arguments including lists.
+ schedule.clpq tests the strict inequalities in clpq2.pl
+
+2002-06-18 Tuesday 10:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.inlines.hh (1.34): Avoiding the creation of
+ temporaries in Constraint operator>(const LinExpression& e1,
+ const LinExpression& e2) Constraint operator>(const Integer& n,
+ const LinExpression& e) Constraint operator>(const
+ LinExpression& e, const Integer& n).
+
+2002-06-18 Tuesday 08:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.59): Paragraph for widening improved.
+ Paragraph for time-elapse added (just a reference to the 1997
+ Halbwachs paper).
+
+2002-06-18 Tuesday 07:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.31): Code for testing YAP
+ exceptions temporarily included.
+
+2002-06-18 Tuesday 00:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.182), Polyhedron.defs.hh (1.119): Private
+ methods strongly_minimize* now return a boolean which is false if
+ the result is an empty polyhedron (this is consistent with the
+ behavior of private method minimize()). Patched method
+ widening_CC92_assign() to also work for NNC polyhedra.
+
+2002-06-17 Monday 23:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: Makefile.am (1.10), ppl_yap.pl (1.5),
+ yap_clpq.pl (1.4): Some progress in the support for YAP.
+
+2002-06-17 Monday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.37), Row.defs.hh (1.46), Row.inlines.hh (1.24):
+ The NDEBUG symbol no longer changes data layout. Now, to obtain
+ a version of Row where each object remembers its own capacity,
+ the macro EXTRA_ROW_DEBUG must evaluate to true (whether this
+ capacity is tested in run-time assertions or not depends, as
+ usual, on the NDEBUG macro not being or being defined).
+
+2002-06-17 Monday 18:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.78), wideningcc921.cc (1.2),
+ wideningcc922.cc (1.2), wideningcc923.cc (1.1): Added a new tests
+ showing a bug in the current implementation of
+ widening_CC92_assign, when the arguments are NNC polyhedra.
+ Corrected the output of the other widening tests.
+
+2002-06-17 Monday 18:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh (1.33), LinExpression.cc (1.12),
+ LinExpression.defs.hh (1.42), LinExpression.inlines.hh (1.18):
+ Added LinExpression& operator-=(LinExpression& e1, const
+ LinExpression& e2), LinExpression& operator-=(LinExpression& e,
+ const Variable& v), and LinExpression& operator-=(LinExpression&
+ e, const Integer& n). Useless creation of a temporary avoided
+ thanks to the second of those.
+
+2002-06-17 Monday 17:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.58),
+ interfaces/Prolog/Prolog_interface.dox (1.43): Added the
+ condition that the CC92-widening requires the polyhedra to have
+ the same topology.
+
+2002-06-17 Monday 17:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.23): We now have complete support for bounding boxes.
+ List a couple of pending efficiency issues.
+
+2002-06-17 Monday 17:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.57), interfaces/C/ppl_c.h (1.32),
+ interfaces/Prolog/Prolog_interface.dox (1.42), src/Polyhedron.cc
+ (1.181), src/Polyhedron.defs.hh (1.118): Added a draft paragraph
+ about widening (and CC92-widening) to definitions.dox. Replaced
+ "widening" by CC92-widening" in the comments about the widening
+ operators.
+
+2002-06-17 Monday 16:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.55), Polyhedron.cc (1.180): All the FIXME's in
+ Polyhedron.cc and GenSys.cc transformed into TODO's, since they
+ were just place-holders for possible performance improvements.
+
+2002-06-17 Monday 16:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.35), ppl_c.h (1.31): Added interfaces
+ function for the copy constructors of classes Constraint and
+ Generators and for the constructors of a LinExpression from a
+ Constraint/Generator.
+
+2002-06-17 Monday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog.pl (1.10): The two widening
+ predicates have been renamed.
+
+2002-06-17 Monday 15:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.24), interfaces/C/ppl_c.cc (1.34), interfaces/C/ppl_c.h
+ (1.30), interfaces/Prolog/Prolog_interface.dox (1.41),
+ interfaces/Prolog/pl_check.pl (1.12),
+ interfaces/Prolog/ppl_prolog.icc (1.51),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.11),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.16),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.40),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.30), src/Polyhedron.cc
+ (1.179), src/Polyhedron.defs.hh (1.117), tests/.cvsignore (1.3),
+ tests/Makefile.am (1.77), tests/exceptions1.cc (1.9),
+ tests/limitedwidening1.cc (1.8), tests/limitedwidening2.cc (1.5),
+ tests/limitedwideningcc921.cc (1.1),
+ tests/limitedwideningcc922.cc (1.1), tests/permute.cc (1.17),
+ tests/widening1.cc (1.5), tests/widening2.cc (1.3),
+ tests/wideningcc921.cc (1.1), tests/wideningcc922.cc (1.1):
+ Widening methods, functions and test programs renamed so as to
+ make clear that (currently) our widenings are extensions of the
+ one proposed in the PLILP'92 paper by Cousot & Cousot.
+
+2002-06-17 Monday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.29): Added comment to functions building
+ polyhedra from bounding boxes.
+
+2002-06-17 Monday 12:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq.pl (1.10): clpq.pl only uses C polyhedron
+ again.
+
+2002-06-17 Monday 12:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.8), NNC_Polyhedron.defs.hh (1.12),
+ Polyhedron.defs.hh (1.116), globals.hh (1.16): Added
+ documentation for constructor of C_ and NNC_ polyhedra out of a
+ bounding box. The comment on the C_Polyhedron destructor is now
+ a proper doxygen comment. Added a short description doc for
+ struct FromBoundingBox to avoid cluttering the ``PPL Compound
+ List'' page.
+
+2002-06-17 Monday 11:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.41): Corrected typo in documentation
+ of explicit LinExpression(const Generator& g);
+
+2002-06-17 Monday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.115): Improved documentation of
+ poly_difference_assign* methods, stating that topological closure
+ is enforced when *this is a C_Polyhedron.
+
+2002-06-17 Monday 10:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.40): Constructors of a LinExpression
+ out of a Constraint/Generator made public. Added a more detailed
+ comment about the unicity of the built expression.
+
+2002-06-17 Monday 10:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.inlines.hh (1.32): Removed FIXME's about the
+ efficiency of row-type setting methods.
+
+2002-06-17 Monday 08:59 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.40), clpq.pl (1.9):
+ clpq.pl is updated to allow for strict constraints. Improved
+ comments for new polyhedron predicates from consys, gensys and
+ boxes.
+
+2002-06-17 Monday 08:47 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.56): Paragraphs on intervals and bounding
+ boxes improved.
+
+2002-06-17 Monday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.cc (1.5), Watchdog.defs.hh (1.3): Use #ifdef
+ to test configuration symbols that may be undefined or defined to
+ 1.
+
+2002-06-17 Monday 08:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.37): It is non-standard to omit the second
+ argument of std::vector::iterator std::vector::insert(iterator
+ position, const T& x).
+
+2002-06-17 Monday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.inlines.hh (1.19), Constraint.cc (1.26),
+ Constraint.inlines.hh (1.31), GenSys.inlines.hh (1.21),
+ Generator.inlines.hh (1.30), LinExpression.inlines.hh (1.17),
+ Row.defs.hh (1.45): Reduce our dependence on the PPL_HIDDEN
+ trick.
+
+2002-06-16 Sunday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.h (1.28): Remove non-standard trailing comma.
+
+2002-06-16 Sunday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh (1.30), Generator.inlines.hh (1.29),
+ Matrix.inlines.hh (1.23), Polyhedron.inlines.hh (1.36),
+ Row.inlines.hh (1.23): Make sure the first use of each inline
+ function follows its definition.
+
+2002-06-16 Sunday 20:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.26): Modified SICStus
+ interface makefile to find the ppl library even when this has not
+ been installed yet.
+
+2002-06-16 Sunday 19:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.51), GenSys.defs.hh (1.66),
+ LinExpression.defs.hh (1.39): Reposition friend declarations.
+ Always put the public section before the protected one before the
+ private one.
+
+2002-06-16 Sunday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.38): LinExpression(const
+ Constraint&) and LinExpression(const Generator&) made private
+ again, since they expose the library's internals.
+
+2002-06-16 Sunday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.54), Polyhedron.cc (1.178), minimize.cc
+ (1.21), simplify.cc (1.16): No space before question mark in
+ comments.
+
+2002-06-16 Sunday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: generators1.cc (1.6), generators2.cc (1.3): Include
+ <stdexcept>.
+
+2002-06-16 Sunday 17:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.25), Constraint.inlines.hh (1.29),
+ Polyhedron.cc (1.177): Removed CHECKME comments from a few
+ methods of classes Constraint and Polyhedron. A few FIXME changed
+ to CHECKME.
+
+2002-06-16 Sunday 17:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.cc (1.2): Replace `and' by `&&'.
+
+2002-06-16 Sunday 17:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.defs.hh (1.2), BoundingBox.inlines.hh (1.3),
+ C_Polyhedron.defs.hh (1.7), ConSys.defs.hh (1.50),
+ Constraint.defs.hh (1.59), GenSys.defs.hh (1.65),
+ Generator.defs.hh (1.59), Init.defs.hh (1.2), Integer.defs.hh
+ (1.4), Interval.defs.hh (1.4), LinExpression.defs.hh (1.37),
+ Matrix.defs.hh (1.26), NNC_Polyhedron.defs.hh (1.11),
+ Poly_Con_Relation.defs.hh (1.6), Poly_Gen_Relation.defs.hh (1.6),
+ Polyhedron.defs.hh (1.114), Row.defs.hh (1.44), SatMatrix.defs.hh
+ (1.18), SatRow.defs.hh (1.14), Status.defs.hh (1.16),
+ Variable.defs.hh (1.17): Use uniform guards against multiple
+ inclusion. Include Interval.defs.hh in BoundingBox.defs.hh.
+
+2002-06-16 Sunday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.inlines.hh (1.22), SatRow.inlines.hh (1.14): Fully
+ qualify `vector' as `std::vector'.
+
+2002-06-16 Sunday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/C_Polyhedron.cc (1.3), interfaces/C/ppl_c.cc (1.33): Include
+ <stdexcept>.
+
+2002-06-16 Sunday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.inlines.hh (1.28), Integer.inlines.hh (1.4),
+ LinExpression.defs.hh (1.36), LinExpression.inlines.hh (1.16):
+ Remove unnecessary include files and add some necessary one.
+
+2002-06-16 Sunday 16:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.inlines.hh (1.2), C_Polyhedron.inlines.hh
+ (1.6), ConSys.inlines.hh (1.18), Constraint.inlines.hh (1.28),
+ GenSys.inlines.hh (1.20), Generator.inlines.hh (1.27),
+ Init.inlines.hh (1.2), Integer.inlines.hh (1.3),
+ LinExpression.inlines.hh (1.15), Matrix.inlines.hh (1.22),
+ NNC_Polyhedron.inlines.hh (1.8), Poly_Con_Relation.inlines.hh
+ (1.6), Poly_Gen_Relation.inlines.hh (1.6), Polyhedron.inlines.hh
+ (1.35), Row.inlines.hh (1.21), SatMatrix.inlines.hh (1.11),
+ SatRow.inlines.hh (1.13), Status.inlines.hh (1.8),
+ Variable.inlines.hh (1.9): Guard against multiple inclusion.
+
+2002-06-16 Sunday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.49), GenSys.defs.hh (1.64),
+ LinExpression.defs.hh (1.35), Matrix.defs.hh (1.25),
+ Variable.defs.hh (1.16): Avoid being pedantic when commenting
+ constructors.
+
+2002-06-16 Sunday 15:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.48), GenSys.defs.hh (1.63): All the OK()
+ methods must be public.
+
+2002-06-16 Sunday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in (1.17),
+ doc/devref-print.doxyconf-latex.in (1.17),
+ doc/devref.doxyconf-html.in (1.18), interfaces/C/Makefile.am
+ (1.9), interfaces/Prolog/Ciao/Makefile.am (1.6),
+ interfaces/Prolog/GNU/Makefile.am (1.17),
+ interfaces/Prolog/SICStus/Makefile.am (1.25),
+ interfaces/Prolog/SWI/Makefile.am (1.19),
+ interfaces/Prolog/YAP/Makefile.am (1.9), src/ConSys.defs.hh
+ (1.47), src/Constraint.defs.hh (1.58), src/GenSys.defs.hh (1.62),
+ src/Generator.defs.hh (1.58), src/LinExpression.defs.hh (1.34),
+ src/Makefile.am (1.41), src/Polyhedron.defs.hh (1.113),
+ src/Row.defs.hh (1.43), src/ppl_filter_doxygen.sed (1.2),
+ src/ppl_filter_install.sed (1.2): PPL_INTERNAL has gone: replaced
+ with `private' everywhere.
+
+2002-06-16 Sunday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.24), sp_clpq.pl (1.5):
+ Simplify `make check' in the SICStus directory and solve a `make
+ distcheck' problem.
+
+2002-06-16 Sunday 08:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.16): Generation of gp_clpq
+ fixed.
+
+2002-06-16 Sunday 00:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.50), src/ConSys.cc (1.34),
+ src/ConSys.defs.hh (1.46), src/ConSys.inlines.hh (1.17),
+ src/Constraint.defs.hh (1.57), src/GenSys.cc (1.53),
+ src/GenSys.defs.hh (1.61), src/GenSys.inlines.hh (1.19),
+ src/Generator.defs.hh (1.57), src/LinExpression.defs.hh (1.33),
+ src/Makefile.am (1.40), src/Polyhedron.defs.hh (1.112),
+ src/Polyhedron.inlines.hh (1.34): Phasing out PPL_INTERNAL.
+
+2002-06-15 Saturday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: memory1.cc (1.3), watchdog1.cc (1.8): Be quiet.
+
+2002-06-15 Saturday 18:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.32), interfaces/Prolog/ppl_prolog.icc
+ (1.49), src/C_Polyhedron.defs.hh (1.6),
+ src/C_Polyhedron.inlines.hh (1.5), src/ConSys.defs.hh (1.45),
+ src/Constraint.defs.hh (1.56), src/GenSys.defs.hh (1.60),
+ src/NNC_Polyhedron.defs.hh (1.10), src/NNC_Polyhedron.inlines.hh
+ (1.7), tests/boundingbox2.cc (1.7): Start replacing our ad hoc
+ protection mechanisms with friendship. Got around the GCC bug
+ described in http://gcc.gnu.org/bugs.html#known by exchanging the
+ order of arguments in the constructors from bounding boxes of
+ C_Polyhedron and NNC_Polyhedron. The test program
+ boundingbox2.cc has been cleaned up consequently.
+
+2002-06-15 Saturday 17:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.3): Revert previous change: the CVS version of
+ libtool causes more problems than it solves.
+
+2002-06-15 Saturday 17:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.76): Always distribute the sources for
+ watchdog1.
+
+2002-06-15 Saturday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.2), missing (1.4): Updated to the CVS version of
+ libtool.
+
+2002-06-15 Saturday 14:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.6): For those building in the sources' directory.
+
+2002-06-15 Saturday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/Makefile.am (1.5): dist-hook goes into the unconditional
+ section.
+
+2002-06-15 Saturday 14:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.75): Always distribute $(watchdog1_SOURCES).
+
+2002-06-15 Saturday 14:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/.cvsignore (1.3), tests/.cvsignore (1.2):
+ For those building in the sources' directory.
+
+2002-06-15 Saturday 13:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.cc (1.9), NNC_Polyhedron.defs.hh (1.9),
+ Polyhedron.cc (1.176): Corrected method
+ Polyhedron::limited_widening_assign to work with NNC polyehdra.
+ Removed the overriding method from NNC_Polyhedron.
+
+2002-06-15 Saturday 13:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.55): Added comment for
+ construct_eps_geq_zero().
+
+2002-06-15 Saturday 12:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/.cvsignore (1.2), GNU/.cvsignore (1.2),
+ SWI/.cvsignore (1.2), YAP/.cvsignore (1.2), YAP/ppl_yap.cc
+ (1.29), YAP/yap_clpq.pl (1.3): Minor changes to YAP support.
+ Changes for those building in the sources' directory.
+
+2002-06-15 Saturday 12:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.23): Removed
+ ppl_sicstus.pl and sp_clpq.pl from MOSTLYCLEANFILES.
+
+2002-06-14 Friday 23:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.28): Support for YAP almost
+ completed.
+
+2002-06-14 Friday 23:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.48): Include initializer.hh.
+
+2002-06-14 Friday 23:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/initializer.hh (1.2): Added the guard against multiple
+ inclusion. Include Init.defs.hh.
+
+2002-06-14 Friday 20:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.44), Constraint.defs.hh (1.54),
+ GenSys.defs.hh (1.59): Temporary kludges removed.
+
+2002-06-14 Friday 19:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.47), Ciao/Makefile.am
+ (1.5), Ciao/ppl_ciao.cc (1.10), GNU/Makefile.am (1.15),
+ GNU/ppl_gprolog_sd.cc (1.5), SICStus/Makefile.am (1.22),
+ SICStus/ppl_sicstus_sd.cc (1.15), SWI/Makefile.am (1.18),
+ SWI/ppl_swiprolog.cc (1.39), YAP/Makefile.am (1.8),
+ YAP/ppl_yap.cc (1.27): Include the true sources.
+
+2002-06-14 Friday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.26): Prolog_raise_exception()
+ written.
+
+2002-06-14 Friday 18:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Interval.defs.hh (1.3), Interval.inlines.hh (1.4): Provide
+ a copy constructor and assignment operator for ExtendedRational.
+
+2002-06-14 Friday 18:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox1.cc (1.16): Made it quiet and corrected a
+ comment.
+
+2002-06-14 Friday 18:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: boundingbox1.cc (1.15), boundingbox2.cc (1.6): Test file
+ boundingbox1.cc tidied. Small changes to comments in
+ boundingbox2.cc.
+
+2002-06-14 Friday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.cc (1.2), BoundingBox.defs.hh (1.1),
+ BoundingBox.hh (1.7), BoundingBox.inlines.hh (1.1),
+ BoundingBox.types.hh (1.1), Interval.defs.hh (1.2),
+ Interval.inlines.hh (1.3), Makefile.am (1.39),
+ Polyhedron.inlines.hh (1.33): template <class Box> void
+ Polyhedron::shrink_bounding_box(Box&) redesigned and simplified.
+ Many other improvements in the code for dealing with bounding
+ boxes.
+
+2002-06-14 Friday 17:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox2.cc (1.5): Made boundingbox2.cc quiet.
+
+2002-06-14 Friday 16:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox2.cc (1.4): Some tidying of the tests.
+
+2002-06-14 Friday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.55), src/Polyhedron.cc (1.175),
+ src/Polyhedron.defs.hh (1.111): Removed strange mixing of short
+ and detailed style doxygen comments, that was causing a warning
+ when building the documentation. Improved the user introduction,
+ adding definition of poly-differences.
+
+2002-06-14 Friday 12:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.46): Added to
+ term_to_boundary checks that the input numerator and denominator
+ are integers and that the denominator is positive.
+
+2002-06-14 Friday 10:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.45):
+ ppl_new_Polyhedron_from_bounding_box() fixed and simplified.
+
+2002-06-14 Friday 10:15 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.39): Added a short
+ description for new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 09:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.11), ppl_prolog.icc (1.44):
+ Some tidying of the code for
+ ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 08:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox2.cc (1.3): Some bugs fixed.
+
+2002-06-13 Thursday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.43): Fixed two occurrences of
+ assignment where a test for equality was intended.
+
+2002-06-13 Thursday 16:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.42): In
+ ppl_new_Polyhedron_from_bounding_box it now fails (ie
+ PROLOG_FAILURE is returned) if the list is not properly
+ terminated or it is not a list. A few comments added to the
+ code.
+
+2002-06-13 Thursday 16:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.10), ppl_prolog.icc (1.41),
+ Ciao/ppl_ciao.pl (1.10), GNU/ppl_gprolog.pl (1.9),
+ SICStus/ppl_sicstus_sd.cc (1.14), YAP/ppl_yap.cc (1.25):
+ Completed the code for ppl_new_Polyhedron_from_bounding_box/3.
+
+2002-06-13 Thursday 14:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.38): Prepare to explain
+ the not-so-easy situation with GNU Prolog.
+
+2002-06-13 Thursday 13:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.cc (1.1), BoundingBox.hh (1.6): Start
+ completing the BoundingBox class.
+
+2002-06-13 Thursday 12:42 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: boundingbox1.cc (1.14), boundingbox2.cc (1.2): More tests
+ added.
+
+2002-06-13 Thursday 11:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.32), tests/Makefile.am (1.74),
+ tests/boundingbox2.cc (1.1): A bug corrected in the constructor
+ of a Polyhedron from a Box. Added a new test boundingbox2.
+
+2002-06-13 Thursday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BoundingBox.hh (1.5): Fixed two bugs whereby call-by-value
+ was used instead of call-by-reference.
+
+2002-06-12 Wednesday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.38):
+ ppl_new_Polyhedron_from_bounding_box/3 added.
+
+2002-06-12 Wednesday 17:29 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.40): A start in completing
+ ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-12 Wednesday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: pl_clpq.cc (1.5), ppl_pl.cc (1.5),
+ ppl_swiprolog.cc (1.37): Also uninstall() "returns" install_t.
+
+2002-06-12 Wednesday 14:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: pl_clpq.cc (1.4), ppl_pl.cc (1.4),
+ ppl_swiprolog.cc (1.36): Make sure the library is always
+ uninstalled.
+
+2002-06-12 Wednesday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.11): Added file list for package gprolog. Updated
+ file list for package swi.
+
+2002-06-12 Wednesday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.17): Create dynamic
+ libraries but link statically until we understand whether and if
+ libtool can be made to interoperate with plld.
+
+2002-06-12 Wednesday 10:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.14): Create dynamic
+ libraries but link statically until we understand whether and if
+ libtool can be made to interoperate with gplc.
+
+2002-06-12 Wednesday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.37): Started writing
+ the documentation for the GNU Prolog interface.
+
+2002-06-12 Wednesday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.15): Document struct From_Bounding_Box.
+
+2002-06-11 Tuesday 17:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.54): Added a few words on the double
+ description method. Adjusted capitalizations.
+
+2002-06-11 Tuesday 15:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.52), Polyhedron.cc (1.174): Enforcing
+ normalization of constraints and generators in Polyhedron methods
+ strongly_minimize_generators(), add_generator(),
+ time_elapse_assign() and topological_closure_assign(); the same
+ for method GenSys::add_corresponding_closure_points().
+
+2002-06-11 Tuesday 12:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.24), Constraint.defs.hh (1.53),
+ Generator.cc (1.33): Added method Constraint::OK() to check for
+ normalization of constraints. Added the same check to method
+ Generator::OK().
+
+2002-06-11 Tuesday 11:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.51), GenSys.defs.hh (1.58), GenSys.inlines.hh
+ (1.18), Polyhedron.cc (1.173): Added method
+ GenSys::const_iterator::skip_forward(): if the generator
+ currently pointed is a closure point and the next generator is
+ the point matching this closure point, then it skips to the next
+ generator. This method is used to skip redundant closure points
+ when iterating through strongly-minimized generator systems.
+ Added note to Polyhedron::strongly_minimize_generators() stating
+ that the approach is correct if the generator system is sorted.
+
+2002-06-11 Tuesday 11:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.defs.hh (1.43): Corrected comment to the method
+ skip_forward().
+
+2002-06-11 Tuesday 11:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh (1.27), Generator.cc (1.32):
+ Enforcing the normalization of constraints and generators.
+
+2002-06-11 Tuesday 09:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.53), ppl.sty (1.9): Better explaning
+ affine transformations.
+
+2002-06-11 Tuesday 09:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.36), pl_check.pl
+ (1.9): Grammar for boxes and description of
+ ppl_Polyhedron_get_bounding_box improved.
+
+2002-06-11 Tuesday 08:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.52): Added a paragraph on topologies and
+ topological compatibility.
+
+2002-06-10 Monday 19:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.21): Fix packaging
+ problem.
+
+2002-06-10 Monday 19:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox1.cc (1.13): Updated so as to abide by the new
+ interfaces.
+
+2002-06-10 Monday 18:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.31), interfaces/C/ppl_c.h (1.27),
+ src/BoundingBox.hh (1.4), src/ConSys.defs.hh (1.42),
+ src/Polyhedron.defs.hh (1.110), src/Polyhedron.inlines.hh (1.31):
+ This should be the final version of the interfaces for dealing
+ with bounding boxes.
+
+2002-06-10 Monday 18:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.51): Several improvements and a few
+ corrections.
+
+2002-06-10 Monday 17:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.109), Polyhedron.inlines.hh (1.30):
+ Improvements to the documentation of template <class Box>
+ Polyhedron::Polyhedron(Topology topol, const Box& box).
+
+2002-06-10 Monday 17:09 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.50): A first attempt to define intervals,
+ boxes and bounding boxes.
+
+2002-06-10 Monday 16:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.108), Polyhedron.inlines.hh (1.29):
+ Finished the implementation of constructor template <class Box>
+ Polyhedron(Topology topol, const Box& box); Changed comments to
+ require that class Box provides a method bool is_empty();
+
+2002-06-10 Monday 15:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.49): Minor improvements and bug fixed in
+ paragraph on the generators representation.
+
+2002-06-10 Monday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.28): Avoid a couple of compiler's
+ warnings.
+
+2002-06-10 Monday 13:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.35): Added grammar for
+ intervals and description for ppl_Polyhedron_get_bounding_box/2
+
+2002-06-10 Monday 11:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox1.cc (1.12): Now it exits with return value 1 if
+ the boxes are not as expected.
+
+2002-06-10 Monday 11:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.39), src/BoundingBox.hh
+ (1.3), src/ConSys.defs.hh (1.41), src/Constraint.defs.hh (1.52),
+ src/GenSys.defs.hh (1.57): ppl_new_Polyhedron_from_bounding_box/3
+ sketched. Class Parma_Polyhedra_Library::BoundingBox fixed.
+ Inserted several temporary kludges related to the interaction of
+ templates, access control, and the way we produce ppl_install.hh.
+
+2002-06-10 Monday 10:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.5): clpq2.pl now can handle strict
+ constraints.
+
+2002-06-10 Monday 10:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/BoundingBox.hh (1.2): Complete this implementation of
+ bounding boxes.
+
+2002-06-10 Monday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.107): Fix the comment fix.
+
+2002-06-10 Monday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.106): Comment fixed.
+
+2002-06-10 Monday 09:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox1.cc (1.11): Added operator==() and operator!=()
+ for BInterval and BBox.
+
+2002-06-10 Monday 09:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.38): Formatting changes.
+
+2002-06-10 Monday 09:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox1.cc (1.10): Further small improvements to test
+ file boundingbox1.cc
+
+2002-06-10 Monday 08:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/clpq2.pl (1.4), tests/boundingbox1.cc (1.9):
+ boundingbox1.cc is improved but needs further testing. clpq2.pl
+ now works with changed interface predicates.
+
+2002-06-10 Monday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.9): Only declarations here.
+
+2002-06-09 Sunday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.105): Useless `explicit' qualification
+ removed.
+
+2002-06-09 Sunday 19:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.14), ppl_prolog.pl (1.4),
+ GNU/Makefile.am (1.13), GNU/ppl_gprolog.pl (1.8),
+ GNU/ppl_gprolog_sd.pl (1.11), SICStus/Makefile.am (1.20),
+ SICStus/ppl_sicstus.pl (1.21), SICStus/ppl_sicstus_sd.pl (1.3):
+ Reorganization due to the fact that ppl_prolog.pl was obsolete.
+
+2002-06-09 Sunday 19:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/ppl_c.cc (1.30): Use the new bounding box
+ constructors.
+
+2002-06-09 Sunday 19:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.5), C_Polyhedron.inlines.hh (1.4),
+ NNC_Polyhedron.defs.hh (1.8), NNC_Polyhedron.inlines.hh (1.6),
+ globals.hh (1.14): Differentiate the bounding box constructors
+ for C_Polyhedron and NNC_Polyhedron from all the other
+ constructors.
+
+2002-06-09 Sunday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.34), exceptions.hh
+ (1.6), pl_check.pl (1.8), track_allocation.hh (1.4),
+ Ciao/ppl_ciao.pl (1.9), GNU/gp_clpq.pl (1.5),
+ GNU/ppl_gprolog_sd.pl (1.10), SICStus/ppl_sicstus_sd.pl (1.2),
+ SICStus/sp_clpq.pl (1.4), SWI/pl_clpq.cc (1.3), SWI/pl_clpq.pl
+ (1.3), SWI/ppl_pl.cc (1.3), YAP/ppl_yap.pl (1.4), YAP/yap_clpq.pl
+ (1.2): Copyright and "no warranty" notices added.
+
+2002-06-09 Sunday 16:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.3): Updated.
+
+2002-06-09 Sunday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.4), configure.ac (1.6): Consistent
+ spelling for Autoconf and Automake.
+
+2002-06-09 Sunday 16:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.46): Set CFLAGS properly. Quote systematically.
+
+2002-06-09 Sunday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/configure.ac (1.5): Set CFLAGS properly. Check for
+ header files and library functions only if we are building the
+ library.
+
+2002-06-09 Sunday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.45), Watchdog/configure.ac (1.4): Be more
+ friendly to compilers different from GCC.
+
+2002-06-09 Sunday 14:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.29), ppl_c.h (1.26): Added
+ ppl_new_C_Polyhedron_from_bounding_box() and
+ ppl_new_NNC_Polyhedron_from_bounding_box().
+
+2002-06-09 Sunday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.4), C_Polyhedron.inlines.hh (1.3),
+ NNC_Polyhedron.defs.hh (1.7), NNC_Polyhedron.inlines.hh (1.5),
+ Polyhedron.defs.hh (1.104), Polyhedron.inlines.hh (1.27): Added
+ template <class Box> C_Polyhedron::C_Polyhedron(const Box& box)
+ and template <class Box> NNC_Polyhedron::NNC_Polyhedron(const
+ Box& box). Added the declaration and documentation and sketched
+ the implementation of template <class Box>
+ Polyhedron::Polyhedron(Topology topol, const Box& box): these
+ constructor allow to builds a polyhedron out of a generic,
+ interval-based bounding box.
+
+ Documentation of Polyhedron::shrink_bounding_box(Box& box)
+ revised: we now promise to communicate rational numbers using
+ fractions in canonical form. The fraction n/d is in canonical
+ form if and only if n and d have no common factors and d is
+ positive, 0/1 being the unique representation for zero.
+
+2002-06-09 Sunday 12:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.48): Added definitions of "minimized"
+ constraints and generators.
+
+2002-06-09 Sunday 11:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.47): Further updating of the user manual
+ to allow for NNC polyhedra. Minkowski's and Weil's theorems and
+ some definitions moved to the developers part.
+
+2002-06-09 Sunday 08:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Interval.inlines.hh (1.2): Removed redundant and erroneous
+ default argument specification.
+
+2002-06-08 Saturday 17:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Interval.hh (1.3), Makefile.am (1.13),
+ ppl_prolog.icc (1.37): Use the new implementation of bounding
+ boxes.
+
+2002-06-08 Saturday 17:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/addconstraints2.cc (1.12): Shut up if not noisy.
+
+2002-06-08 Saturday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: BoundingBox.hh (1.1), Interval.cc (1.1), Interval.defs.hh
+ (1.1), Interval.inlines.hh (1.1), Interval.types.hh (1.1),
+ Makefile.am (1.38): New implementation of bounding boxes.
+
+2002-06-08 Saturday 17:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.73), addconstraints2.cc (1.11),
+ boundingbox1.cc (1.8), ehandlers.cc (1.1), ehandlers.hh (1.4),
+ memory1.cc (1.2), print.cc (1.1), print.hh (1.8), smm1.cc (1.5),
+ watchdog1.cc (1.7): Better implementation for auxiliary
+ functions. Some more cleaning.
+
+2002-06-08 Saturday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Interval.hh (1.2), ppl_prolog.icc (1.36),
+ Ciao/ppl_ciao.cc (1.9), Ciao/ppl_ciao.pl (1.8), GNU/gp_clpq.pl
+ (1.4), GNU/ppl_gprolog_sd.pl (1.9), SICStus/ppl_sicstus_sd.cc
+ (1.13), SWI/ppl_swiprolog.cc (1.35), YAP/ppl_yap.cc (1.24):
+ Initial implementation for ppl_Polyhedron_get_bounding_box/2.
+ ppl_init/0 removed (was an inferior duplicate of
+ ppl_initialize/0).
+
+2002-06-07 Friday 17:31 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.46): On-going reorganisation of
+ introduction based on some of the items suggested by Enea.
+
+2002-06-07 Friday 16:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.5), ppl_prolog.icc (1.35):
+ The function term_to_polyhedron_handle() replaces
+ get_ph_pointer(). The new function either return a plausible
+ polyhedron handle or throws the `not_a_polyhedron_handle'
+ exception. All sites that used to call get_ph_pointer() have
+ been consequently simplified.
+
+2002-06-07 Friday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.12): Stub
+ declarations fixed.
+
+2002-06-07 Friday 14:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.172): Corrected a bug in
+ strongly_minimize_constraints() whereby sat_c was declared
+ up-to-date even if it was not the case.
+
+2002-06-07 Friday 13:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.45), ppl.sty (1.8): Some further step
+ toward the reorganization of user-manual intro.
+
+2002-06-07 Friday 13:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.33): Documentation for
+ the Prolog interface updated to allow for the change to more
+ generic predicates.
+
+2002-06-07 Friday 13:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/exceptions2.cc (1.6): Typos fixed.
+
+2002-06-07 Friday 12:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq.pl (1.8), pl_check.pl (1.7),
+ ppl_prolog.icc (1.34), Ciao/ppl_ciao.pl (1.7),
+ GNU/ppl_gprolog_sd.pl (1.8), SICStus/ppl_sicstus_sd.cc (1.11),
+ SWI/ppl_swiprolog.cc (1.34), YAP/ppl_yap.cc (1.23): All
+ predicates specific to C or NNC now removed and replaced by
+ generic predicates. Documentation needs to be updated.
+
+2002-06-07 Friday 11:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.6), ppl_prolog.icc (1.33),
+ SWI/ppl_swiprolog.cc (1.33): Predicates
+ ppl_new_Polyhedron_from_Polyhedron/4,
+ ppl_new_Polyhedron_from_ConSys/3, and
+ ppl_new_Polyhedron_from_GenSys/3 added - just defined in SWI
+ Prolog in this commit.
+
+2002-06-07 Friday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.32): Explain how to
+ enable polyhedra allocation tracking.
+
+2002-06-07 Friday 10:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.32): Creation and disposal of
+ polyhedra is enabled only if explicitely requested.
+
+2002-06-07 Friday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.31): Remove useless inclusion
+ and using namespace directives.
+
+2002-06-07 Friday 10:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.30): Avoid quoting for better
+ output.
+
+2002-06-07 Friday 10:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.4), ppl_prolog.icc (1.29):
+ New internal_exception: not_a_polyhedron_kind. New function
+ term_to_polyhedron_kind() replaces term_to_atom().
+
+2002-06-07 Friday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.28): `a_closed' renamed
+ `a_c'.
+
+2002-06-07 Friday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.27), Ciao/ppl_ciao.cc
+ (1.8), GNU/ppl_gprolog_sd.cc (1.4), SICStus/ppl_sicstus_sd.cc
+ (1.10), SWI/ppl_swiprolog.cc (1.32), YAP/ppl_yap.cc (1.22):
+ Prolog_get_name_arity() renamed Prolog_get_compound_name_arity().
+
+2002-06-07 Friday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.26), Ciao/ppl_ciao.cc
+ (1.7), GNU/ppl_gprolog_sd.cc (1.3), SICStus/ppl_sicstus_sd.cc
+ (1.9), SWI/ppl_swiprolog.cc (1.31), YAP/ppl_yap.cc (1.21):
+ Prolog_get_atom_name() added.
+
+2002-06-07 Friday 07:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Ciao/ppl_ciao.cc (1.6), Ciao/ppl_ciao.pl
+ (1.6), GNU/ppl_gprolog_sd.cc (1.2), SICStus/ppl_sicstus_sd.cc
+ (1.8), SWI/ppl_swiprolog.cc (1.30), YAP/ppl_yap.cc (1.20):
+ Prolog_is_atom() added.
+
+2002-06-06 Thursday 18:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.5), ppl_prolog.icc (1.25),
+ SWI/ppl_swiprolog.cc (1.29): Added 2 generic predicates
+ ppl_new_Polyhedron_from_dimension/3 and
+ ppl_new_Polyhedron_empty_from_dimension/3 where the 1st argument
+ must be c or nnc. The only Prolog system with interface changed
+ is SWI.
+
+2002-06-06 Thursday 17:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.10): The `swi' package has now its `%files'
+ section.
+
+2002-06-06 Thursday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.44): Version number bumped.
+
+2002-06-06 Thursday 17:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.31), SWI/Makefile.am
+ (1.16), SWI/pl_clpq.cc (1.2), SWI/ppl_pl.cc (1.2),
+ SWI/ppl_swiprolog.cc (1.28): Support for SWI-Prolog completed and
+ documented.
+
+2002-06-06 Thursday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.44): Slowly progressing.
+
+2002-06-06 Thursday 12:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.43), ppl.sty (1.7): Started rewriting
+ the introduction to the user manual.
+
+2002-06-06 Thursday 10:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.30): Explained how to
+ use the library from SICStus Prolog.
+
+2002-06-06 Thursday 09:40 Elisa Ricci
+
+ * src/: ConSys.defs.hh (1.40), Constraint.defs.hh (1.51),
+ Generator.defs.hh (1.56), LinExpression.defs.hh (1.32),
+ Matrix.defs.hh (1.24), Polyhedron.defs.hh (1.103), Row.defs.hh
+ (1.42), SatMatrix.defs.hh (1.17), SatRow.defs.hh (1.13),
+ Status.defs.hh (1.15): Now, a Doxygen comment is separated by an
+ empty line from the C++ item that precedes it.
+
+2002-06-05 Wednesday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.15), ppl_pl.cc (1.1),
+ pplpl.cc (1.2): Renamed pplpl.cc to ppl_pl.cc.
+
+2002-06-05 Wednesday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.9): We will build several RPM packages out of our
+ source tree.
+
+2002-06-05 Wednesday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.23): Added support for timeout-guarded operations.
+
+2002-06-05 Wednesday 17:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.72), timings.cc (1.1), timings.hh (1.1),
+ watchdog1.cc (1.6): When NOISY, watchdog1 prints the time after
+ which the timeout exception has been received.
+
+2002-06-05 Wednesday 17:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.29): Added
+ documentation for the minimized_constraints and
+ minimized_generators predicates. Removed comments that SWI, GNU,
+ YAP are not yet supported.
+
+2002-06-05 Wednesday 17:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.28), ppl_c.h (1.25): Added support for
+ minimized_constraints() and minimized_generators() to the C
+ interface.
+
+2002-06-05 Wednesday 16:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.24), Ciao/ppl_ciao.pl
+ (1.5), GNU/ppl_gprolog_sd.pl (1.7), SICStus/ppl_sicstus_sd.cc
+ (1.7), SWI/ppl_swiprolog.cc (1.27), YAP/ppl_yap.cc (1.19): All
+ Prolog interfaces now have methods for accessing the minimized
+ constraint and generator systems.
+
+2002-06-05 Wednesday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.13): Simpler and more efficient implementation
+ of Parma_Polyhedra_Library::maybe_abandon().
+
+2002-06-05 Wednesday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: conversion.cc (1.28), globals.hh (1.12): Documentation of
+ `abandon_exponential_computations' changed: we now provide a
+ quite strong guarantee, which is implemented in
+ Polyhedron::conversion().
+
+2002-06-05 Wednesday 15:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.102), tests/NNCminimize1.cc (1.3),
+ tests/NNCminimize2.cc (1.3), tests/NNCminimize3.cc (1.3),
+ tests/NNCminimize4.cc (1.5), tests/NNCminimize6.cc (1.4): Methods
+ strongly_minimize(), strongly_minimize_constraints() and
+ strongly_minimize_generators() are now private; tests changed to
+ call the public methods minimized_constraints() and
+ minimized_generators(), instead.
+
+2002-06-05 Wednesday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.22): More news.
+
+2002-06-05 Wednesday 14:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.21): News items added. List sorted to match the
+ (subjective) relative importance of the innovations.
+
+2002-06-05 Wednesday 12:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.22): Removed some obsolete entries.
+
+2002-06-05 Wednesday 12:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.20): Mention the addition of the time-elapse operation.
+
+2002-06-05 Wednesday 08:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.19), configure.ac (1.43), doc/Makefile.am (1.18),
+ interfaces/Makefile.am (1.5), interfaces/C/Makefile.am (1.8),
+ interfaces/Prolog/Makefile.am (1.12),
+ interfaces/Prolog/Ciao/Makefile.am (1.4),
+ interfaces/Prolog/GNU/Makefile.am (1.12),
+ interfaces/Prolog/SICStus/Makefile.am (1.19),
+ interfaces/Prolog/SWI/Makefile.am (1.14),
+ interfaces/Prolog/YAP/Makefile.am (1.7), m4/Makefile.am (1.6),
+ src/Makefile.am (1.37), tests/Makefile.am (1.71): File
+ description improved.
+
+2002-06-05 Wednesday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.18): Improved formatting.
+
+2002-06-04 Tuesday 20:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.10), config.sub (1.9): Updated.
+
+2002-06-04 Tuesday 18:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.3), ChangeLog (1.8): Updated.
+
+2002-06-04 Tuesday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.3): Updated.
+
+2002-06-04 Tuesday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS (1.2): Written.
+
+2002-06-04 Tuesday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.13): Do not assume the
+ library has already been installed.
+
+2002-06-04 Tuesday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.11): Do not assume `.' is
+ the first item of the current PATH.
+
+2002-06-04 Tuesday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/Makefile.am (1.10): No longer require that
+ the library is already installed for a successful `make check'.
+
+2002-05-31 Friday 11:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.14), configure.ac (1.42), interfaces/C/Makefile.am
+ (1.7): Improvements in automatic configuration and make file
+ generation.
+
+2002-05-31 Friday 11:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.70), memory1.cc (1.1): To test the
+ allocation error recovery facility of the library. Not yet
+ operational.
+
+2002-05-31 Friday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/watchdog1.cc (1.5): Minor improvements.
+
+2002-05-30 Thursday 16:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.171): Modified methos strongly_minimize()
+ according to the recent findings by Pat.
+
+2002-05-30 Thursday 15:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.170): In method
+ strongly_minimize_constraints(), corrected handling of the sorted
+ flag for the constraint system and of the changed boolean flag.
+
+2002-05-30 Thursday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.169): In methods strongly_minimize_*(),
+ keeping track of whether or not we modify the considered system.
+ If there has been no changes, the dual system is not flagged as
+ out-of-date at the end of the method.
+
+2002-05-30 Thursday 11:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.168): The method
+ strongly_minimize_generators() now forces all point encodings to
+ have the same epsilon-coordinate (which is 1).
+
+2002-05-29 Wednesday 18:11 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.28), pl_check.pl
+ (1.4): Documentation now introduces the C and NNC polyhedra. The
+ grammar rules allow for strict inequalities and closure points.
+ The test file has minor improvements; checking that redundant
+ strict inequalities are ignored when creating a C polyhedron as a
+ copy of an NNC polyhedra.
+
+2002-05-29 Wednesday 15:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: NNCminimize1.cc (1.2), NNCminimize2.cc (1.2),
+ NNCminimize3.cc (1.2), NNCminimize4.cc (1.4), NNCminimize6.cc
+ (1.3): Methods NNC_minimize* renamed as strongly_minimize*
+
+2002-05-29 Wednesday 15:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.167), Polyhedron.defs.hh (1.101): Methods
+ NNC_minimize* renamed as strongly_minimize* and implemented
+ (almost) according to the technical report Q286. When strongly
+ minimizing a constraint system, we now always remove any
+ eps-upper-bound constraint and we later insert back the
+ constraint eps-leq-one only if that is needed to obtain an
+ epsilon-representation.
+
+2002-05-29 Wednesday 07:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: NNCinclusion1.cc (1.2), NNCminimize6.cc (1.2),
+ boundingbox1.cc (1.7), watchdog1.cc (1.4), widening2.cc (1.2): Be
+ quiet.
+
+2002-05-28 Tuesday 16:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.166): Several simplifications in strong
+ minmization of constraints and generators and in check for
+ topological closure of a NNC polyhedron.
+
+2002-05-28 Tuesday 16:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc (1.31), Generator.defs.hh (1.55): Method
+ is_corresponding_closure_point() renamed as
+ is_matching_closure_point().
+
+2002-05-28 Tuesday 13:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.5), Watchdog/.cvsignore (1.2),
+ interfaces/C/.cvsignore (1.2), interfaces/Prolog/ppl_prolog.icc
+ (1.23), interfaces/Prolog/SICStus/.cvsignore (1.2): For those
+ building in the sources' tree.
+
+2002-05-28 Tuesday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/watchdog1.cc (1.3): Adapted to the new version of the
+ Watchdog library and "abandon" mechanism.
+
+2002-05-28 Tuesday 12:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: globals.cc (1.7), globals.hh (1.11): Improved
+ implementation of the "abandon" mechanism.
+
+2002-05-28 Tuesday 12:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Watchdog.cc (1.4), Watchdog.defs.hh (1.2),
+ Watchdog.inlines.hh (1.2): Better implementation using templates.
+
+2002-05-28 Tuesday 12:12 Elisa Ricci
+
+ * src/Polyhedron.cc (1.165): Corrected an error in
+ Polyhedron::topological_closure_assign(): if we modify the system
+ of constraints or of generators, it is no longer minimized.
+
+2002-05-27 Monday 17:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: pl_check.pl (1.3), ppl_prolog.icc (1.22): Bug
+ in ppl_prolog.icc corrected. Tests in pl_check.pl amended to use
+ poly_hull and poly_difference instead of convex_hull and
+ convex_difference.
+
+2002-05-27 Monday 16:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/.cvsignore (1.5): For those that build in the source
+ directory.
+
+2002-05-27 Monday 16:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ppl_header.bottom (1.4): Undefine all autoconf macros.
+
+2002-05-27 Monday 16:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/Makefile.am (1.6),
+ interfaces/Prolog/Ciao/Makefile.am (1.3),
+ interfaces/Prolog/GNU/Makefile.am (1.9),
+ interfaces/Prolog/SICStus/Makefile.am (1.18),
+ interfaces/Prolog/SWI/Makefile.am (1.12),
+ interfaces/Prolog/YAP/Makefile.am (1.6), src/Makefile.am (1.36):
+ INCLUDES is deprecated: use AM_CPPFLAGS instead.
+
+2002-05-27 Monday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.69), watchdog1.cc (1.2): Stress test for
+ the timeout facility.
+
+2002-05-27 Monday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.3), README (1.3), Timeout.hh (1.3),
+ Watchdog.cc (1.3), Watchdog.defs.hh (1.1), Watchdog.hh (1.3),
+ Watchdog.inlines.hh (1.1), Watchdog.types.hh (1.1), configure.ac
+ (1.3), pwl_filter_doxygen.sed (1.1), pwl_filter_install.sed
+ (1.1), pwl_header.bottom (1.1), pwl_header.middle (1.1),
+ pwl_header.top (1.1): The Watchdog library is now complete.
+
+2002-05-27 Monday 13:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.27): Prolog interface
+ predicates and their names in the documentation now agree with
+ each other.
+
+2002-05-26 Sunday 14:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.164): Assertion fixed in
+ time_elapse_assign().
+
+2002-05-26 Sunday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.163): Properly identify time_elapse_assign()
+ when throwing an exception from there.
+
+2002-05-25 Saturday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.35), Row.cc (1.36), SatMatrix.cc (1.16),
+ maxmin.hh (1.3): Baking our own versions of max() and min() was a
+ bad idea.
+
+2002-05-25 Saturday 16:26 Elisa Ricci
+
+ * src/Polyhedron.cc (1.162), src/Polyhedron.defs.hh (1.100),
+ tests/timeelapse1.cc (1.2), tests/timeelapse2.cc (1.2),
+ tests/timeelapse3.cc (1.2), tests/timeelapse4.cc (1.2): Changed
+ the function Polyhedron::time_elapse_assign() so that only
+ polyhedra that are topology-compatible can be used and modified
+ the tests so that the polyhedra satisfy this condition.
+
+2002-05-24 Friday 11:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.161): Corrected method
+ topological_closure_assign(): inserting the constraint
+ eps_leq_one after modifying the polyhedron to enforce the epsilon
+ upper bound.
+
+2002-05-24 Friday 10:34 Elisa Ricci
+
+ * src/Constraint.cc (1.23): Corrected an error in the function
+ Constraint::is_trivial_true(): a strict inequality such as `lhs -
+ k > 0' can not be trivial true if `k' is a non negative integer.
+
+2002-05-24 Friday 07:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.41), tests/Makefile.am (1.68), tests/watchdog1.cc
+ (1.1): Prepare for testing the timeout facility.
+
+2002-05-24 Friday 07:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.17): If we are building the Watchdog library, make
+ sure it is built before entering the `tests' directory.
+
+2002-05-24 Friday 07:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog/: Makefile.am (1.2), README (1.2), Timeout.hh (1.2),
+ Watchdog.cc (1.2), Watchdog.hh (1.2), config.h.in (1.2),
+ configure.ac (1.2): Several improvement (but still not
+ operational).
+
+2002-05-24 Friday 07:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.26): Be more specific
+ about how to use the library in SICStus Prolog.
+
+2002-05-23 Thursday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/widening2.cc (1.1): widening2.cc shows a precision problem
+ in Polyhedron::widening_assign().
+
+2002-05-23 Thursday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.67): widening2.cc shows a precision problem
+ in Polyhedron::widening_assign().
+
+2002-05-22 Wednesday 13:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.cc (1.6): Definition of
+ abandon_exponential_computations fixed again.
+
+2002-05-22 Wednesday 13:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.27): Added a call to maybe_abandon(): this
+ is supposed to be called on all the exponential paths within the
+ library and, in such paths, invocations to it should be separated
+ from one another by a distance that is bounded from above by a
+ polynomial of the size of the input to conversion().
+
+2002-05-22 Wednesday 13:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.cc (1.5): Definition of
+ abandon_exponential_computations fixed.
+
+2002-05-22 Wednesday 11:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: convexdifference1.cc (1.10), convexhull1.cc (1.7),
+ convexhull2.cc (1.6), convexhull3.cc (1.6), convexhull4.cc (1.5),
+ randchull1.cc (1.15): Removed and replaced by tests named
+ "poly*".
+
+2002-05-22 Wednesday 11:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.66), NNCminimize5.cc (1.2), append1.cc
+ (1.11), append2.cc (1.12), exceptions1.cc (1.8), permute.cc
+ (1.16), polydifference1.cc (1.1), polyhull1.cc (1.1),
+ polyhull2.cc (1.1), polyhull3.cc (1.1), polyhull4.cc (1.1),
+ randchull1.cc (1.14), randphull1.cc (1.1), widening1.cc (1.4):
+ Renaming convex-hull into poly-hull.
+
+2002-05-22 Wednesday 11:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.160), src/Polyhedron.defs.hh (1.99),
+ interfaces/C/ppl_c.cc (1.27), interfaces/C/ppl_c.h (1.24),
+ interfaces/Prolog/Prolog_interface.dox (1.25),
+ interfaces/Prolog/pl_check.pl (1.2),
+ interfaces/Prolog/ppl_prolog.icc (1.21),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.4),
+ interfaces/Prolog/GNU/ppl_gprolog_sd.pl (1.6),
+ interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.6),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.26),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.18): Renamed convex-hull into
+ poly-hull.
+
+2002-05-22 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.11): Build the SWI Prolog
+ interface only if SWI Prolog is installed.
+
+2002-05-22 Wednesday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.16), configure.ac (1.40), Watchdog/.cvsignore
+ (1.1), Watchdog/BUGS (1.1), Watchdog/COPYING (1.1),
+ Watchdog/CREDITS (1.1), Watchdog/ChangeLog (1.1),
+ Watchdog/INSTALL (1.1), Watchdog/Makefile.am (1.1), Watchdog/NEWS
+ (1.1), Watchdog/README (1.1), Watchdog/Timeout.hh (1.1),
+ Watchdog/Watchdog.cc (1.1), Watchdog/Watchdog.hh (1.1),
+ Watchdog/config.h.in (1.1), Watchdog/configure.ac (1.1): Even
+ though the Watchdog library is completely independent from the
+ PPL, it will live with it, at least for a while.
+
+2002-05-22 Wednesday 08:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.34), globals.cc (1.4), globals.hh (1.10):
+ New timeout mechanisms.
+
+2002-05-22 Wednesday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.159): Typo fixed.
+
+2002-05-22 Wednesday 08:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GenSys.cc (1.50): Useless emphasis removed.
+
+2002-05-22 Wednesday 08:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.11), Ciao/Makefile.am (1.2):
+ Compile also the Ciao Prolog interface, if Ciao Prolog is
+ available.
+
+2002-05-22 Wednesday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.16),
+ devref-print.doxyconf-latex.in (1.16), devref.doxyconf-html.in
+ (1.17): Fixes and additions for the developer's documentation of
+ Prolog interfaces.
+
+2002-05-18 Saturday 16:56 Elisa Ricci
+
+ * src/Polyhedron.cc (1.158), src/Polyhedron.defs.hh (1.98),
+ tests/Makefile.am (1.65), tests/exceptions1.cc (1.7),
+ tests/timeelapse1.cc (1.1), tests/timeelapse2.cc (1.1),
+ tests/timeelapse3.cc (1.1), tests/timeelapse4.cc (1.1),
+ tests/timeelapse5.cc (1.1): Added the function void
+ time_elapse_assign(const Polyhedron&) and some tests for it.
+
+2002-05-17 Friday 07:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.17): Commented out statement
+ removed.
+
+2002-05-17 Friday 07:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: .cvsignore (1.1), Makefile.am (1.1),
+ ppl_ciao.cc (1.5): Rewritten using the interface provided by Ciao
+ Prolog 1.8 (still not operational).
+
+2002-05-14 Tuesday 09:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/pl_check.pl (1.1): pl_check.pl can be used to
+ run all the interface predicates with simple tests.
+
+2002-05-14 Tuesday 09:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq.pl (1.7), ppl_prolog.icc (1.20),
+ GNU/ppl_gprolog_sd.pl (1.5), SICStus/ppl_sicstus_sd.cc (1.5),
+ SWI/ppl_swiprolog.cc (1.25), YAP/ppl_yap.cc (1.16): All interface
+ predicates now renamed and completed apart from
+ shrink_bounding_box predicate.
+
+2002-05-13 Monday 18:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.19), GNU/ppl_gprolog_sd.pl
+ (1.4), SICStus/ppl_sicstus_sd.cc (1.4), SWI/ppl_swiprolog.cc
+ (1.24), YAP/ppl_yap.cc (1.15): Prolog interface predicates for
+ removing dimensions renamed.
+
+2002-05-13 Monday 17:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.18), ppl_prolog.pl (1.3),
+ GNU/ppl_gprolog_sd.pl (1.3), SICStus/ppl_sicstus_sd.cc (1.3),
+ SWI/ppl_swiprolog.cc (1.23), YAP/ppl_yap.cc (1.14): The "add"
+ predicates renamed or added to the Prolog interface.
+
+2002-05-13 Monday 15:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq.pl (1.6), ppl_prolog.icc (1.17),
+ GNU/ppl_gprolog_sd.pl (1.2), SICStus/ppl_sicstus_sd.cc (1.2),
+ SWI/ppl_swiprolog.cc (1.22), YAP/ppl_yap.cc (1.13): More
+ interface predicates updated for NNC polyhedra
+
+2002-05-13 Monday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.15), configure.ac (1.39): Use --enable-shared when
+ making distcheck. Make sure we really have the Prolog systems.
+
+2002-05-13 Monday 10:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.10), ppl_prolog.icc (1.16):
+ Always enter subdirectories. Source file ppl_prolog.icc is a C++
+ file.
+
+2002-05-13 Monday 10:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.8), ppl_gprolog.cc (1.13),
+ ppl_gprolog.pl (1.7), ppl_gprolog_sd.cc (1.1), ppl_gprolog_sd.pl
+ (1.1): Cleaned up.
+
+2002-05-13 Monday 10:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.17), ppl_sicstus.cc
+ (1.54), ppl_sicstus.pl (1.20), ppl_sicstus_sd.cc (1.1),
+ ppl_sicstus_sd.pl (1.1), sp_clpq.pl (1.3): Cleaned up: works both
+ with static and dynamic linking.
+
+2002-05-13 Monday 10:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: Makefile.am (1.5), ppl_yap.cc (1.12),
+ ppl_yap.pl (1.3): Cleaned up, but still not operational.
+
+2002-05-10 Friday 13:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.38), interfaces/Prolog/SICStus/Makefile.am
+ (1.16): Some Progress with the SICStus interface.
+
+2002-04-28 Sunday 22:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.26): Formatting change.
+
+2002-04-24 Wednesday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.15): Fixed two declarations
+ of std::ostringstream's.
+
+2002-04-20 Saturday 22:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.inlines.hh (1.25), tests/boundingbox1.cc (1.6):
+ shrink_bounding_box now works for NNC polyhedra defined both with
+ and without strict inequalites. The test file boundingbox1.cc
+ has been also updated to deal with NNC polyhedra. Extra tests
+ have been added to check the changes.
+
+2002-04-19 Friday 17:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.14): Now including the
+ closure points in the list of generators is ok when creating new
+ polyhedra from lists of generators in the Prolog interface.
+
+2002-04-19 Friday 16:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.13), GNU/ppl_gprolog.pl
+ (1.6): Predicates for GNU Prolog brought in line with the Prolog
+ interface.
+
+2002-04-19 Friday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.12): Now constraint_term()
+ supports strict inequalities.
+
+2002-04-19 Friday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/inclusion1.cc (1.2): Be quiet.
+
+2002-04-19 Friday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.11): a_strictly_greater_than
+ and a_strictly_less_than renamed a_greater_than and a_less_than.
+
+2002-04-19 Friday 14:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.10): Throw an exception
+ instead of aborting in generator_term().
+
+2002-04-19 Friday 14:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.9), GNU/ppl_gprolog.cc
+ (1.12), SICStus/ppl_sicstus.cc (1.53), SWI/ppl_swiprolog.cc
+ (1.21), YAP/ppl_yap.cc (1.11): General cleanup.
+
+2002-04-19 Friday 13:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: clpq.pl (1.5), ppl_prolog.icc (1.8): The
+ order of arguments in the revised predicates is input followed by
+ output. The ppl_prolog.icc now has code to handle strict
+ inequalities and closure points. clpq.pl has been updated to use
+ the revised predicates.
+
+2002-04-19 Friday 11:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.20):
+ ppl_delete_polyhedron/2 renamed ppl_delete_Polyhedron/2.
+
+2002-04-19 Friday 11:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.7), SICStus/ppl_sicstus.cc
+ (1.52), SWI/ppl_swiprolog.cc (1.19), YAP/ppl_yap.cc (1.10): The
+ code for ppl_new_NNC_Polyhedron_from_GenSys uncommented.
+
+2002-04-19 Friday 10:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.6), SICStus/ppl_sicstus.cc
+ (1.51), SWI/ppl_swiprolog.cc (1.18): ppl_delete_polyhedron
+ renamed ppl_delete_Polyhedron. SP_STUB_0 macro fixed.
+
+2002-04-19 Friday 10:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/ppl_yap.cc (1.9): Added missing semicolons.
+
+2002-04-19 Friday 10:17 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.icc (1.5): In the copy
+ methods/predicates the arguments have been reversed to match the
+ corresponding ones in the C interface. Now the 1st argument
+ unifies with a handle for the new polyhedron and the 2nd argument
+ is the handle for the source/original polyhedron. Predicates
+ affected are: ppl_new_C_Polyhedron_from_C_Polyhedron,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron.
+
+2002-04-19 Friday 10:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.4), SICStus/ppl_sicstus.cc
+ (1.50), SWI/ppl_swiprolog.cc (1.17), YAP/ppl_yap.cc (1.8):
+ Predicates: ppl_new_C_Polyhedron_from_ConSys,
+ ppl_new_NNC_Polyhedron_from_ConSys,
+ ppl_new_C_Polyhedron_from_GenSys added.
+
+2002-04-19 Friday 08:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.icc (1.3), SICStus/ppl_sicstus.cc
+ (1.49), SWI/ppl_swiprolog.cc (1.16), YAP/ppl_yap.cc (1.7): The
+ new, new_empty and copy predicates have been replaced by ones
+ that allow for C and NNC polyhedra to match the same methods in
+ the C interface. Propositions ppl_initialize and ppl_finalize
+ added.
+
+2002-04-16 Tuesday 09:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.157): Test NNCminimize6 has shown that our
+ check for topological closure was relying on a false invariant
+ (namely, that in a weakly minimized constraint system any strict
+ inequality can be made redundant by another strict inequality
+ only). Corrected the implementation of
+ is_topologically_closed().
+
+2002-04-15 Monday 10:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (1.33): Corrected a memory allocation bug in
+ ConSys::insert(const Constraint& c). Now test NNCminimize6 shows
+ that the strong minimization of constraints for NNC polyhedra
+ does not fully minimize constraint systems, yet.
+
+2002-04-15 Monday 09:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.64), NNCminimize6.cc (1.1): Example
+ NNCminimize6 shows a memory allocation bug in method
+ ConSys::insert(const Constraint&).
+
+2002-04-14 Sunday 17:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.cc (1.30): Avoid redundant test.
+
+2002-04-14 Sunday 17:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.cc (1.22): Factorize some calls to
+ operator<<(std::ostream&, ...).
+
+2002-04-13 Saturday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.24): Avoid shadowing in
+ Polyhedron::shrink_bounding_box().
+
+2002-04-12 Friday 20:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.63), NNCminimize4.cc (1.3),
+ NNCminimize5.cc (1.1): Test NNCminimize5 is a fake test showing
+ that strong minimization problems can arise even when the user is
+ only allowed to interact using constraint systems.
+
+2002-04-12 Friday 20:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.156): When performing strong minimization of
+ constraints, no longer preventing the removal of the \esilon \leq
+ 1 constraint. This modification is justified by the relaxation
+ of the invariant on the class Generator, where we no longer
+ require the coordinate of \epsilon to be \leq 1.
+
+2002-04-12 Friday 09:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.9), config.sub (1.8): Updated.
+
+2002-04-11 Thursday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Interval.hh (1.1), Makefile.am (1.9),
+ ppl_prolog.icc (1.2): Progress in the implementation of
+ ppl_get_bounding_box().
+
+2002-04-11 Thursday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.8), ppl_prolog.icc (1.1),
+ ppl_prolog.outlines.hh (1.26), GNU/ppl_gprolog.cc (1.11),
+ SICStus/ppl_sicstus.cc (1.48), SWI/ppl_swiprolog.cc (1.15),
+ YAP/ppl_yap.cc (1.6): The file `ppl_prolog.outlines.hh' has been
+ renamed `ppl_prolog.icc'.
+
+2002-04-10 Wednesday 12:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc (1.29): The OK() function for Generator no
+ longer checks that, for points, the epsilon coordinate is less
+ than or equal to 1 (because strong minimization does not maintain
+ this invariant).
+
+2002-04-10 Wednesday 10:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.47),
+ SWI/ppl_swiprolog.cc (1.14), YAP/ppl_yap.cc (1.5): Provided the
+ ppl_Prolog_sysdep_init() hook for system-dependent
+ initialization.
+
+2002-04-10 Wednesday 10:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog.cc (1.10):
+ Prolog_raise_exception() implemented. Provided the
+ ppl_Prolog_sysdep_init() hook for system-dependent
+ initialization.
+
+2002-04-10 Wednesday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.25): Started playing
+ with the ppl_get_bounding_box() interface function.
+
+2002-04-09 Tuesday 18:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.155), Polyhedron.defs.hh (1.97): Added
+ methods const ConSys& Polyhedron::minimized_constraints()
+ const; const GenSys& Polyhedron::minimized_generators() const;
+ together with the corresponding (unoptimized) implementations.
+
+2002-04-08 Monday 22:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.154): Typo fixed.
+
+2002-04-08 Monday 22:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.49), GenSys.defs.hh (1.56), Polyhedron.cc
+ (1.153), Polyhedron.defs.hh (1.96): Added first draft for the
+ method Polyhedron::topological_closure_assign(). Also added
+ method GenSys::add_corresponding_points().
+
+2002-04-07 Sunday 15:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.26), ppl_c.h (1.23): Two bugs fixed.
+ The swap functions have been removed.
+
+2002-04-07 Sunday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.152): Avoid an inconsistent mixture of
+ useless emphasizers.
+
+2002-04-07 Sunday 13:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.62), inclusion1.cc (1.1): Test
+ C_Polyhedron::operator<=().
+
+2002-04-07 Sunday 12:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: exceptions1.cc (1.6), exceptions2.cc (1.5): Replace
+ "impossible" with "illegal" when the latter was meant.
+
+2002-04-07 Sunday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.151): There is no such a thing as the
+ reduced scalar product operator^.
+
+2002-04-06 Saturday 08:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * m4/ac_check_gmp.m4 (1.4): Fixed two instances of the use of an
+ inexistent GMP assignment operator from `char*'. These gave no
+ error because of the C++ pointer to `bool' conversion feature and
+ because GMP had an assignment operator from `bool'.
+
+2002-04-05 Friday 12:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/boundingbox1.cc (1.5): Improved printed results: now says
+ "none" when the denominator of the bound is 0.
+
+2002-04-05 Friday 12:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.inlines.hh (1.23), tests/boundingbox1.cc (1.4):
+ The dimension() method removed from BBox.
+
+2002-04-05 Friday 10:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.inlines.hh (1.22), tests/boundingbox1.cc (1.3): In
+ Polyhedron.inlines.hh: shrink_bounding_box now handles the
+ empty polyhedron correctly.
+
+ In boundingbox1.cc: BBox and Interval improved and many tests
+ added.
+
+2002-04-04 Thursday 14:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.inlines.hh (1.21): Initial implementation of
+ Polyhedron::shrink_bounding_box().
+
+2002-04-04 Thursday 13:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.32), GenSys.cc (1.48), Polyhedron.cc (1.150),
+ Row.cc (1.35), Row.defs.hh (1.41): PPL::operator^(const Row&,
+ const Row&) renamed as "reduced_scalar_product".
+
+2002-04-04 Thursday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/boundingbox1.cc (1.2): Use a more concrete bounding-box
+ class.
+
+2002-04-04 Thursday 11:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.15),
+ devref-print.doxyconf-latex.in (1.15), devref.doxyconf-html.in
+ (1.16): Configuration files updated after class names changes.
+
+2002-04-04 Thursday 11:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.types.hh (1.3): Forgot to remove this one.
+
+2002-04-04 Thursday 10:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PolyBase.cc (1.25), PolyBase.defs.hh (1.17),
+ PolyBase.inlines.hh (1.5): Getting rid of these old files.
+
+2002-04-04 Thursday 10:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.149), Polyhedron.defs.hh (1.95),
+ Polyhedron.inlines.hh (1.20): All functions created to throw
+ exceptions are now private methods of the class Polyhedron.
+ Exception messages modified to reflect the changes in the names
+ of the classes and in the names of methods (e.g., add_constraint
+ instead of insert). Added topology-compatibility test to method
+ swap(Polyhedron& y). In all public methods, we now first check
+ for topology inconsistencies, then we check for dimension
+ inconsistencies.
+
+2002-04-04 Thursday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.25), ppl_c.h (1.22): Add
+ copy-conversion functions.
+
+2002-04-04 Thursday 08:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.24), ppl_c.h (1.21): Basic interface
+ for the NNC polyhedra.
+
+2002-04-03 Wednesday 19:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/: C/ppl_c.cc (1.23), Prolog/ppl_prolog.outlines.hh
+ (1.24): Allow the manipulation of closed polyhedra only (for the
+ moment).
+
+2002-04-03 Wednesday 19:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.94): Make the destructor public (for
+ the moment).
+
+2002-04-03 Wednesday 18:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.93): Modified doxygen comments to
+ account for the possibility of exceptions caused by incompatible
+ topologies.
+
+2002-04-03 Wednesday 17:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.types.hh (1.2): Cutted (redundant) brief
+ namespace description to avoid a Doxygen warning.
+
+2002-04-03 Wednesday 17:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Row.defs.hh (1.40), Row.inlines.hh (1.20): Some cleaning in
+ the Row::Type class: - removed the useless static methods; -
+ the constants NNC and RPI are now tied to the Topology and
+ Row::Kind enumerations.
+
+2002-04-03 Wednesday 15:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.148), Polyhedron.defs.hh (1.92): All the
+ assertions regarding topology compatibility (but those inside the
+ non-public methods) replaced by run-time checks so that, When
+ identifying a topology mismatch, we now throw an exception.
+
+ Since wrapper classes C_Polyhedron and NNC_Polyhedron will not
+ override the methods of base class Polyhedron (they will just
+ inherit them), all implementation specific members of Polyhedron,
+ apart from the constructors and assignment, are now declared
+ "private" instead of "protected".
+
+2002-04-03 Wednesday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.61), boundingbox1.cc (1.1): To test
+ Polyhedron::shrink_bounding_box().
+
+2002-04-03 Wednesday 12:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.defs.hh (1.3), NNC_Polyhedron.cc (1.8),
+ NNC_Polyhedron.defs.hh (1.6), Polyhedron.cc (1.147),
+ Polyhedron.defs.hh (1.91): The method bool
+ is_topologycally_closed() const; is now a method of the _base_
+ class Polyhedron, trivially returning true if the polyhedron is
+ necessarily closed.
+
+2002-04-03 Wednesday 11:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/C_Polyhedron.cc (1.2), src/C_Polyhedron.defs.hh (1.2),
+ src/C_Polyhedron.inlines.hh (1.2), src/Makefile.am (1.33),
+ src/NNC_Polyhedron.cc (1.7), src/NNC_Polyhedron.defs.hh (1.5),
+ src/NNC_Polyhedron.inlines.hh (1.4), src/Polyhedron.cc (1.146),
+ src/Polyhedron.defs.hh (1.90), src/Polyhedron.inlines.hh (1.19),
+ src/conversion.cc (1.26), src/minimize.cc (1.20), src/simplify.cc
+ (1.15), tests/print.hh (1.7): Base class PolyBase renamed (back)
+ as Polyhedron.
+
+2002-04-03 Wednesday 10:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Makefile.am (1.32), src/NNC_Polyhedron.cc (1.6),
+ src/NNC_Polyhedron.defs.hh (1.4), tests/addconstraints1.cc (1.6),
+ tests/addconstraints10.cc (1.5), tests/addconstraints11.cc (1.6),
+ tests/addconstraints2.cc (1.10), tests/addconstraints3.cc (1.3),
+ tests/addconstraints4.cc (1.5), tests/addconstraints5.cc (1.6),
+ tests/addconstraints6.cc (1.7), tests/addconstraints7.cc (1.6),
+ tests/addconstraints8.cc (1.6), tests/addconstraints9.cc (1.7),
+ tests/adddimensions1.cc (1.8), tests/adddimensions2.cc (1.4),
+ tests/adddimensions3.cc (1.6), tests/adddimensions4.cc (1.4),
+ tests/addgenerators1.cc (1.7), tests/addgenerators2.cc (1.7),
+ tests/addgenerators3.cc (1.6), tests/addgenerators4.cc (1.6),
+ tests/addgenerators5.cc (1.6), tests/addgenerators6.cc (1.6),
+ tests/addgenerators7.cc (1.2), tests/affineimage1.cc (1.6),
+ tests/affineimage2.cc (1.5), tests/affinepreimage1.cc (1.5),
+ tests/affinepreimage2.cc (1.5), tests/affinepreimage3.cc (1.5),
+ tests/affinepreimage4.cc (1.6), tests/affinetrans.cc (1.9),
+ tests/append1.cc (1.10), tests/append2.cc (1.11),
+ tests/bounded1.cc (1.3), tests/convexdifference1.cc (1.9),
+ tests/convexhull1.cc (1.6), tests/convexhull2.cc (1.5),
+ tests/convexhull3.cc (1.5), tests/convexhull4.cc (1.4),
+ tests/empty1.cc (1.7), tests/exceptions1.cc (1.5),
+ tests/exceptions2.cc (1.4), tests/generators1.cc (1.5),
+ tests/generators2.cc (1.2), tests/inters1.cc (1.10),
+ tests/inters2.cc (1.13), tests/inters3.cc (1.6), tests/inters4.cc
+ (1.5), tests/inters5.cc (1.7), tests/inters6.cc (1.6),
+ tests/inters7.cc (1.3), tests/limitedwidening1.cc (1.7),
+ tests/limitedwidening2.cc (1.4), tests/onepoint.cc (1.5),
+ tests/permute.cc (1.15), tests/randchull1.cc (1.13),
+ tests/relations1.cc (1.3), tests/relations2.cc (1.4),
+ tests/relations3.cc (1.4), tests/relations4.cc (1.4),
+ tests/relations5.cc (1.4), tests/relations6.cc (1.3),
+ tests/relations7.cc (1.3), tests/relations8.cc (1.3),
+ tests/relations9.cc (1.4), tests/removedim1.cc (1.5),
+ tests/removedim2.cc (1.9), tests/removedim3.cc (1.5),
+ tests/removedim4.cc (1.6), tests/removedim5.cc (1.4),
+ tests/removedim6.cc (1.5), tests/smm1.cc (1.4),
+ tests/universe1.cc (1.3), tests/universe2.cc (1.4),
+ tests/universe3.cc (1.4), tests/universe4.cc (1.4),
+ tests/universe5.cc (1.5), tests/widening1.cc (1.3): Wrapper class
+ Polyhedron renamed as C_Polyhedron. All test programs modified
+ accordingly.
+
+2002-04-03 Wednesday 10:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: C_Polyhedron.cc (1.1), C_Polyhedron.defs.hh (1.1),
+ C_Polyhedron.inlines.hh (1.1), C_Polyhedron.types.hh (1.1): Added
+ wrapper class C_Polyhedron to implement necessarily closed
+ polyhedra.
+
+2002-04-02 Tuesday 19:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (1.24), tests/addconstraints6.cc (1.6): Corrected
+ stupid bugs related to a misinterpretation of the value returned
+ by minimize().
+
+2002-04-02 Tuesday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.22), ppl_c.h (1.20): All the
+ *_and_minimize functions return a positive integer if the
+ reulting polyhedron is non-empty; they return 0 if it is empty
+ (and, as usual, return a negative number if an error occurred).
+
+2002-04-02 Tuesday 17:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * TODO (1.21): Dealt with the first item (the *_and_minimize one).
+
+2002-04-02 Tuesday 17:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PolyBase.cc (1.23), PolyBase.defs.hh (1.16): All the public
+ methods of PolyBase whose name ends in "_and_minimize" now return
+ a boolean value (which is `false' iff the resulting polyhedron is
+ empty).
+
+2002-04-02 Tuesday 16:48 Elisa Ricci
+
+ * tests/: Makefile.am (1.60), removedim7.cc (1.1), universe6.cc
+ (1.1): Added a test for the functions remove_higher_dimensions()
+ and remove_dimensions() and one for the function check_universe
+ for NNC_Polyhedron.
+
+2002-04-02 Tuesday 16:43 Elisa Ricci
+
+ * tests/exceptions1.cc (1.4): Added a test to show when an
+ exception is thrown in the function convex_difference_assign(ph).
+
+2002-04-02 Tuesday 12:08 Elisa Ricci
+
+ * tests/: Makefile.am (1.59), adddimensions5.cc (1.1),
+ adddimensions6.cc (1.1), adddimensions7.cc (1.1): Added tests for
+ the functions add_dimensions_and_embed and
+ add_dimensions_and_project for NNC_Polyhedron.
+
+2002-04-02 Tuesday 09:43 Elisa Ricci
+
+ * tests/: Makefile.am (1.58), addgenerators7.cc (1.1), print.hh
+ (1.6): Add a test for the function
+ add_generators_and_minimize(gs) for a NNC_Polyhedron. Changed
+ the functions to print the polyhedra so that they can be used to
+ print also for the NNC polyhedra.
+
+2002-04-02 Tuesday 08:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.22): Some nonsense removed from
+ PolyBase::affine_image() and PolyBase::affine_preimage().
+
+2002-04-02 Tuesday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.21): PolyBase::limited_widening_assign()
+ fixed: it was not checking the return value of
+ PolyBase::update_generators().
+
+2002-03-31 Sunday 23:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.20), interfaces/C/Makefile.am (1.5),
+ interfaces/C/ppl_c.cc (1.21),
+ interfaces/Prolog/Prolog_interface.dox (1.24),
+ interfaces/Prolog/ppl_prolog.outlines.hh (1.23),
+ interfaces/Prolog/ppl_prolog.pl (1.2),
+ interfaces/Prolog/Ciao/ppl_ciao.cc (1.4),
+ interfaces/Prolog/Ciao/ppl_ciao.pl (1.3),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.5),
+ interfaces/Prolog/SICStus/ppl_sicstus.cc (1.46),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.13),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.4), src/PolyBase.cc (1.20),
+ src/PolyBase.defs.hh (1.15), tests/addconstraints11.cc (1.5),
+ tests/addconstraints2.cc (1.9), tests/addconstraints4.cc (1.4),
+ tests/addconstraints6.cc (1.5), tests/addconstraints7.cc (1.5),
+ tests/addconstraints8.cc (1.5), tests/addconstraints9.cc (1.6),
+ tests/adddimensions1.cc (1.7), tests/adddimensions3.cc (1.5),
+ tests/addgenerators1.cc (1.6), tests/addgenerators2.cc (1.6),
+ tests/addgenerators3.cc (1.5), tests/addgenerators4.cc (1.5),
+ tests/addgenerators5.cc (1.5), tests/addgenerators6.cc (1.5),
+ tests/affineimage1.cc (1.5), tests/affineimage2.cc (1.4),
+ tests/affinepreimage2.cc (1.4), tests/affinepreimage3.cc (1.4),
+ tests/affinepreimage4.cc (1.5), tests/append1.cc (1.9),
+ tests/append2.cc (1.10), tests/bounded1.cc (1.2),
+ tests/convexhull3.cc (1.4), tests/convexhull4.cc (1.3),
+ tests/exceptions1.cc (1.3), tests/exceptions2.cc (1.3),
+ tests/inters1.cc (1.9), tests/inters2.cc (1.12), tests/inters3.cc
+ (1.5), tests/inters4.cc (1.4), tests/inters5.cc (1.6),
+ tests/inters6.cc (1.5), tests/inters7.cc (1.2),
+ tests/limitedwidening1.cc (1.6), tests/onepoint.cc (1.4),
+ tests/permute.cc (1.14), tests/randchull1.cc (1.12),
+ tests/relations9.cc (1.3), tests/removedim6.cc (1.4),
+ tests/smm1.cc (1.3), tests/universe2.cc (1.3), tests/universe3.cc
+ (1.3), tests/universe4.cc (1.3), tests/universe5.cc (1.4),
+ tests/widening1.cc (1.2): Renamed Polyhedron::insert(const
+ Constraint&) to Polyhedron::add_constraint(const Constraint&).
+ Likewise, renamed Polyhedron::insert(const Generator&) to
+ Polyhedron::add_generator(const Generator&).
+
+2002-03-31 Sunday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.37), interfaces/C/Makefile.am (1.4): Added a
+ first starting draft of `lpenum', a program to solve linear
+ programming problems by vertex/point enumeration. Just a toy to
+ test the C interface of the library.
+
+2002-03-31 Sunday 20:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.28), Matrix.cc (1.36), PolyBase.cc (1.19),
+ Row.cc (1.34), SatMatrix.cc (1.15): All the OK() methods are now
+ silent if the NDEBUG symbol is defined.
+
+2002-03-31 Sunday 19:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.18): Always provide default cases in switches.
+
+2002-03-31 Sunday 19:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.39), ConSys.inlines.hh (1.16),
+ Constraint.inlines.hh (1.26), GenSys.defs.hh (1.55),
+ GenSys.inlines.hh (1.17), Generator.inlines.hh (1.26), Matrix.cc
+ (1.35), Matrix.defs.hh (1.23), Matrix.inlines.hh (1.21),
+ PolyBase.cc (1.17), PolyBase.defs.hh (1.14), Row.defs.hh (1.39),
+ Row.inlines.hh (1.19): Do not shadow the members of *this.
+
+2002-03-31 Sunday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.16): Started exploiting the return value of
+ PolyBase::minimize().
+
+2002-03-31 Sunday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.57), widening1.cc (1.1): Test
+ Polyhedron::widening_assign() with empty polyhedra.
+
+2002-03-31 Sunday 10:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.15):
+ PolyBase::intersection_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 10:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.56), inters7.cc (1.1): Test
+ Polyhedron::intersection_assign_and_minimize() with empty
+ polyhedra (exposes bugs in the current implementation of that
+ method).
+
+2002-03-31 Sunday 10:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PolyBase.cc (1.14), PolyBase.defs.hh (1.13):
+ PolyBase::minimize() now returns a Boolean: false if and only if
+ *this turns out to be empty. Handling of empty polyhedra fixed
+ in PolyBase::convex_hull_assign_and_minimize().
+
+2002-03-31 Sunday 09:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/convexhull4.cc (1.2): Exercise
+ PolyBase::convex_hull_assign_and_minimize() with empty polyhedra
+ in all possible ways (exposes more bugs in the current PolyBase
+ implementation).
+
+2002-03-31 Sunday 08:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.13):
+ PolyBase::convex_hull_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.55), convexhull4.cc (1.1): Test
+ Polyhedron::convex_hull_assign_and_minimize() with an empty
+ parameter polyhedron.
+
+2002-03-30 Saturday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.20), ppl_c.h (1.19): New interface
+ functions.
+
+2002-03-30 Saturday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: PolyBase.cc (1.12), PolyBase.defs.hh (1.12):
+ PolyBase::generators() fixed: no longer ignoring the return value
+ of PolyBase::update_generators().
+
+2002-03-30 Saturday 11:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (1.11): Corrected bugs in methods insert(g),
+ add_generators(gs) and add_generators_and_minimize(gs): in the
+ case of NNC topology, we were not adding the closure points
+ corresponding to each added point.
+
+2002-03-30 Saturday 11:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.47), GenSys.defs.hh (1.54): Added method
+ GenSys::add_corresponding_closure_points().
+
+2002-03-30 Saturday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.19), ppl_c.h (1.18): Fixed
+ ppl_assign_Coefficient_from_mpz_t() and ppl_Generator_type().
+
+2002-03-30 Saturday 10:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.18), ppl_c.h (1.17): More functions to
+ deal with coefficients. New function to get the type of a
+ generator.
+
+2002-03-30 Saturday 10:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.inlines.hh (1.4): Added an empty implementation for
+ PolyBase::shrink_bounding_box().
+
+2002-03-30 Saturday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.54), generators2.cc (1.1): New test
+ computing the generators of an empty polyhedron.
+
+2002-03-30 Saturday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.17), ppl_c.h (1.16): New functions and
+ bug fixes.
+
+2002-03-29 Friday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (1.10), src/PolyBase.defs.hh (1.11),
+ tests/NNCminimize4.cc (1.2): Added methods
+ NNC_minimize_generators() and NNC_minimize_constraints(), which
+ enforce NNC-minimization on only one system. They have a common
+ kernel, which might be factored out in a "generic"
+ NNC-minimization function (something like the simplify() method).
+ Now test NNCminimize4.cc uses the (more lazy)
+ NNC_minimize_constraints() function.
+
+2002-03-29 Friday 10:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.53), NNCminimize4.cc (1.1): New test put
+ under CVS control.
+
+2002-03-28 Thursday 22:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.16), ppl_c.h (1.15):
+ ppl_Polyhedron_shrink_bounding_box() added to the C interface.
+
+2002-03-28 Thursday 20:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc (1.27), Generator.defs.hh (1.54), Matrix.cc
+ (1.34), NNC_Polyhedron.cc (1.5), PolyBase.cc (1.9): Added method
+ bool Generator::is_corresponding_closure_point(const Generator&)
+ const; Methods NNC_Polyhedron::is_necessarily_closed() and
+ PolyBase::NNC_minimize() updated to use the above method; this
+ also corrects a bug in the previous implementations.
+
+ Added a \param Doxygen command in Matrix.cc to avoid a warning.
+
+2002-03-28 Thursday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (1.10): Redeclared `shrink_bounding_box' as
+ template <class Box> void shrink_bounding_box(Box& box) const;
+ the previous declaration was too concrete.
+
+2002-03-28 Thursday 16:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (1.9): Added the declaration and
+ documentation of template <class Interval> void
+ shrink_bounding_box(std::vector<Interval>& box) const.
+
+2002-03-28 Thursday 15:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.52), NNCinclusion1.cc (1.1),
+ NNCminimize1.cc (1.1), NNCminimize2.cc (1.1), NNCminimize3.cc
+ (1.1): Added a test on the inclusion method for NNC_Polyhedron
+ and three tests for the full minimization of NNC_Polyhedron.
+
+2002-03-28 Thursday 15:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PolyBase.cc (1.8), PolyBase.defs.hh (1.8): Added method
+ PolyBase::NNC_minimize() performing "full" minimization of
+ constraint and generator systems of a NNC_Polyhedron.
+ Temporarily public for testing and debugging purposes.
+
+2002-03-28 Thursday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc (1.26): Printing closure points as c(lin-expr).
+
+2002-03-28 Thursday 09:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.31), GenSys.cc (1.46): Methods get() and
+ print() of classes ConSys and GenSys modified in order to: -
+ read (and print) the new kinds of constraint/generators types; -
+ check for the correspondence between declared and actual row
+ types when reading them in; - check for the well-formedness
+ of the read ConSys/GenSys, using OK().
+
+2002-03-27 Wednesday 19:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.19), TODO (1.19): Updated.
+
+2002-03-27 Wednesday 19:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.18), interfaces/C/ppl_c.cc (1.15),
+ interfaces/Prolog/ppl_prolog.outlines.hh (1.22),
+ src/Constraint.defs.hh (1.50), src/Constraint.inlines.hh (1.25),
+ src/Generator.inlines.hh (1.25), src/Row.defs.hh (1.38),
+ src/Row.inlines.hh (1.18): Constraint::coefficient(void) and
+ Row::coefficient(void) renamed to
+ Constraint::inhomogeneous_term(void) and
+ Row::inhomogeneous_term(void).
+
+2002-03-27 Wednesday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (1.7): Documentation for PolyBase::OK()
+ improved.
+
+2002-03-27 Wednesday 18:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.17), interfaces/C/ppl_c.cc (1.14), src/NNC_Polyhedron.cc
+ (1.4), src/PolyBase.cc (1.7), src/PolyBase.defs.hh (1.6),
+ src/Polyhedron.cc (1.145): Now the default for PolyBase::OK() is
+ not to check for non-emptiness. This is more consistent since
+ OK() without arguments now checks for well-formedness only as all
+ the other methods with the same name. Use OK(true) if you want
+ the extra service of non-emptiness checking.
+
+2002-03-27 Wednesday 18:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.30), ConSys.defs.hh (1.38), Constraint.cc
+ (1.21), Constraint.defs.hh (1.49), Constraint.inlines.hh (1.24),
+ GenSys.cc (1.45), GenSys.defs.hh (1.53), Generator.cc (1.25),
+ LinExpression.defs.hh (1.31), Matrix.cc (1.33), Matrix.defs.hh
+ (1.22), Matrix.inlines.hh (1.20), NNC_Polyhedron.cc (1.3),
+ NNC_Polyhedron.inlines.hh (1.3), PolyBase.cc (1.6),
+ PolyBase.defs.hh (1.5), Poly_Con_Relation.defs.hh (1.5),
+ Poly_Gen_Relation.defs.hh (1.5), Row.defs.hh (1.37),
+ Row.inlines.hh (1.17), Topology.hh (1.3): Replaced everywhere
+ "non_necessarily_closed" by "not_necessarily_closed". Improved
+ the documentation of class Constraint to consider examples using
+ strict inequalities. Added brief description for classes
+ Poly_xxx_Relation and for the const_iterators of ConSys and
+ GenSys.
+
+2002-03-27 Wednesday 16:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/PolyBase.cc (1.5): PolyBase::OK(bool check_not_empty) was
+ disregarding its argument in some cases. This bug was hiding two
+ bogus assertions in PolyBase::add_constraints() and
+ PolyBase::add_constraints_and_minimize().
+
+2002-03-27 Wednesday 16:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/addconstraints1.cc (1.5): Unused variable removed.
+
+2002-03-27 Wednesday 16:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.defs.hh (1.3), Polyhedron.defs.hh (1.89):
+ Removed duplicate documentation stuff from Polyhedron.defs.hh.
+ Documented constructors of classes Polyhedron and NNC_Polyhedron.
+ Provided a brief explanation of the reason why we do have 2
+ classes.
+
+2002-03-27 Wednesday 15:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.16): At a closer scrutiny, the <CODE> and </CODE> tags
+ are actually superior to any other alternative. Remove the TODO
+ item that suggested not to use them.
+
+2002-03-27 Wednesday 12:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.37), GenSys.defs.hh (1.52),
+ Generator.defs.hh (1.53), PolyBase.defs.hh (1.4), Row.cc (1.33):
+ Started adjusting the documentation to made it aware of the new
+ kind of constraints and generators. Corrected a couple of
+ docuementation problems causing Doxygen warnings.
+
+2002-03-27 Wednesday 10:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (1.4): One FIXME removed: was related to an
+ efficiency concern where we really do not have any efficiency
+ problem.
+
+2002-03-27 Wednesday 08:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.44), PolyBase.cc (1.3): Merged the changes
+ made to the `strict' branch after yesterday's merge.
+
+2002-03-27 Wednesday 08:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.15), src/ConSys.defs.hh (1.36), src/ConSys.inlines.hh
+ (1.15), src/Constraint.defs.hh (1.48), src/Constraint.inlines.hh
+ (1.23), src/GenSys.defs.hh (1.51), src/GenSys.inlines.hh (1.16),
+ src/Generator.defs.hh (1.52), src/Generator.inlines.hh (1.24),
+ src/Integer.defs.hh (1.3), src/LinExpression.defs.hh (1.30),
+ src/LinExpression.inlines.hh (1.14), src/Matrix.defs.hh (1.21),
+ src/Matrix.inlines.hh (1.19), src/PolyBase.defs.hh (1.3),
+ src/PolyBase.inlines.hh (1.3), src/Row.defs.hh (1.36),
+ src/Row.inlines.hh (1.16), src/SatMatrix.defs.hh (1.16),
+ src/SatMatrix.inlines.hh (1.10), src/SatRow.defs.hh (1.12),
+ src/SatRow.inlines.hh (1.12): Added a specialization of the the
+ std:swap() function for LinExpression. Solved several
+ documentation and stylistic issues concerning our specializations
+ of std::swap().
+
+2002-03-27 Wednesday 08:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, PolyBase.cc (strict.[13,31]): Method
+ GenSys::relation_with(c) now supports all the possible
+ combinations of topology and type for both *this and the
+ constraint parameter c.
+
+2002-03-27 Wednesday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.14), src/Constraint.defs.hh (1.47), src/Generator.defs.hh
+ (1.51): Avoid using \enum when it is not strictly necessary.
+
+2002-03-26 Tuesday 23:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in (1.14),
+ doc/devref-print.doxyconf-latex.in (1.14),
+ doc/devref.doxyconf-html.in (1.15),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.4), src/ConSys.cc (1.29),
+ src/ConSys.defs.hh (1.35), src/ConSys.inlines.hh (1.14),
+ src/Constraint.cc (1.20), src/Constraint.defs.hh (1.46),
+ src/Constraint.inlines.hh (1.22), src/GenSys.cc (1.43),
+ src/GenSys.defs.hh (1.50), src/GenSys.inlines.hh (1.15),
+ src/Generator.cc (1.24), src/Generator.defs.hh (1.50),
+ src/Generator.inlines.hh (1.23), src/LinExpression.cc (1.11),
+ src/LinExpression.defs.hh (1.29), src/LinExpression.inlines.hh
+ (1.13), src/Makefile.am (1.31), src/Matrix.cc (1.32),
+ src/Matrix.defs.hh (1.20), src/Matrix.inlines.hh (1.18),
+ src/NNC_Polyhedron.cc (1.2), src/NNC_Polyhedron.defs.hh (1.2),
+ src/NNC_Polyhedron.inlines.hh (1.2), src/NNC_Polyhedron.types.hh
+ (1.2), src/PolyBase.cc (1.2), src/PolyBase.defs.hh (1.2),
+ src/PolyBase.inlines.hh (1.2), src/PolyBase.types.hh (1.2),
+ src/Polyhedron.cc (1.144), src/Polyhedron.defs.hh (1.88),
+ src/Polyhedron.inlines.hh (1.18), src/Row.cc (1.32),
+ src/Row.defs.hh (1.35), src/Row.inlines.hh (1.15),
+ src/Topology.hh (1.2), src/conversion.cc (1.25), src/minimize.cc
+ (1.19), src/simplify.cc (1.14), tests/Makefile.am (1.51),
+ tests/exceptions2.cc (1.2), tests/relations9.cc (1.2): The
+ `strict' branch has been merged.
+
+2002-03-26 Tuesday 21:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.13), ppl_c.h (1.14): Implemented the
+ error handling and reporting mechanisms. Many other
+ improvements.
+
+2002-03-26 Tuesday 19:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/minimize.cc (1.18): Throw `std::runtime_error' instead of
+ `std::invalid_argument'. Removed the inclusion of two unneeded
+ header.
+
+2002-03-26 Tuesday 18:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: Makefile.am (1.3), ppl_c.cc (1.12), ppl_c.h
+ (1.13): All the interface functions should be there now.
+
+2002-03-26 Tuesday 17:54 Elisa Ricci
+
+ * src/: GenSys.cc, Polyhedron.cc, Polyhedron.defs.hh, minimize.cc
+ (positive.[2,6,4,12]): Some changes in the part controlled by
+ "POSITIVE_TRANSFORMATION".
+
+2002-03-26 Tuesday 17:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (strict.12): Some progresses in the generalization
+ of method GenSys::relation_with(c) to work with a NNC system of
+ generators.
+
+2002-03-26 Tuesday 17:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.23): Refer to handles
+ rather than addresses.
+
+2002-03-26 Tuesday 16:41 Elisa Ricci
+
+ * tests/exceptions2.cc (strict.3): Added other two tests to show
+ when an exception is thrown.
+
+2002-03-26 Tuesday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.28): Friend declarations fixed.
+
+2002-03-26 Tuesday 16:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Poly_Con_Relation.inlines.hh (strict.1): Bug (related to
+ operator precedence) corrected in method implies().
+
+2002-03-26 Tuesday 14:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am, relations9.cc (strict.[2,1]): Test
+ relations9 calls method PolyBase::relation_with(c) when *this is
+ a necessarily closed polyhedron and c is a strict inequality.
+
+2002-03-26 Tuesday 13:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, PolyBase.cc (strict.[11,30]): Methods
+ PolyBase::relation_with(c) and GenSys::relation_with(c) modified
+ to work as expected when *this.topology() == NECESSARILY_CLOSED
+ and the c.type() == STRICT_INEQUALITY.
+
+2002-03-26 Tuesday 11:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, GenSys.cc, PolyBase.cc, PolyBase.defs.hh
+ (strict.[13,10,29,9]): Some cleaning in ConSys/GenSys methods
+ adjust_topology_and_dimension(). Adjusted a few comments and
+ removed a few FIXME and CHECKME notes.
+
+2002-03-26 Tuesday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.13): More things to do after the `strict' merge.
+
+2002-03-26 Tuesday 11:05 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: GNU/ppl_gprolog.pl (1.3),
+ SICStus/ppl_sicstus.cc (1.45), YAP/ppl_yap.cc (1.3): Update so
+ that they are all consistent with each other and SWI
+
+2002-03-25 Monday 21:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+ PolyBase.defs.hh, Polyhedron.cc, Polyhedron.defs.hh
+ (strict.[3,3,8,4,4]): Added explicit constructors (to be used as
+ conversion functions) for building a Polyhedron starting from a
+ NNC_Polyhedron, and viceversa. Added method bool
+ NNC_Polyhedron::is_topologucally_closed() used in the above
+ constructor to check if the argument is legal.
+ NNC_Polyhedron::limited_widening_assign() reimplemented using the
+ new constructor functions.
+
+2002-03-25 Monday 21:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.28): Corrected a bug in the assignment
+ operator, which was not clearing matrices when a zero-dim
+ polyhedron was assigned.
+
+2002-03-25 Monday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.12): More things to do after the merge with the `strict'
+ branch.
+
+2002-03-25 Monday 19:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.11), ppl_c.h (1.12): More interface
+ functions added.
+
+2002-03-25 Monday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.10), ppl_c.h (1.11): Widenings added.
+
+2002-03-25 Monday 17:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh (strict.[2,2]):
+ Method limited_widening_assign() overridden in NNC_Polyhedron to
+ avoid an annoying problem when testing with china.
+
+2002-03-25 Monday 17:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.27): When looping on constraints in
+ widening_assign(), now going upward so as to avoid reversing the
+ ordering of constraints.
+
+2002-03-25 Monday 16:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.9), ppl_c.h (1.10): Added an interface
+ for the Polyhedron::relation_with() methods.
+
+2002-03-25 Monday 16:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.12): Predicate
+ add_dimensions_and_constraints/2 added.
+
+2002-03-25 Monday 16:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (strict.12): Trivially true constraints (such as 1
+ > 0, the eps_leq_one constraint) should not be considered by
+ method "has_strict_inequalities()".
+
+2002-03-25 Monday 15:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Poly_Gen_Relation.defs.hh (1.4),
+ Poly_Gen_Relation.inlines.hh (1.5): Provide a hidden
+ Poly_Gen_Relation::get_flags() method for use by the foreign
+ language interfaces.
+
+2002-03-25 Monday 15:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.defs.hh (1.4),
+ Poly_Con_Relation.inlines.hh (1.5): Provide a hidden
+ Poly_Con_Relation::get_flags() method for use by the foreign
+ language interfaces.
+
+2002-03-25 Monday 15:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.143), Polyhedron.defs.hh (1.87): Both
+ Polyhedron::relation_with() methods were erroneously not declared
+ const.
+
+2002-03-25 Monday 14:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.8), ppl_c.h (1.9): Added more
+ interface functions for ordinary polyhedra.
+
+2002-03-24 Sunday 21:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.26): Coorected trivial bug in
+ check_universe().
+
+2002-03-24 Sunday 20:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.7), ppl_c.h (1.8): All the
+ functionality provided by the C++ classes Constraint, ConSys,
+ Generator and GenSys is now available to the C user.
+
+2002-03-24 Sunday 20:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.25): Method check_universe() is now
+ correct for NNC polyhedra. Try to exploit the boolean value
+ returned by update_generators() to shorthen computations when
+ possible.
+
+2002-03-24 Sunday 16:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PolyBase.cc, PolyBase.defs.hh (strict.[24,7]): Methods
+ obtain_sorted_constraints(), obtain_sorted_generators(),
+ obtain_sorted_constraints_with_sat_c(),
+ obtain_sorted_generators_with_sat_g() now declared const, since
+ they do not logically modify the polyhedron. As a consequence,
+ simplified (by removing the const_cast's) the methods
+ constraints(), generators(), intersection_assign(),
+ convex_hull_assign(), convex_hull_assign_and_minimize().
+
+2002-03-24 Sunday 15:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.6), ppl_c.h (1.7): Added all the
+ functions for the handling of generators and generators' systems.
+
+2002-03-24 Sunday 10:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.23): Patched method convex_hull_assign().
+ The error (not correctly handling the sorting of gen_sys rows for
+ the parameter y) was NOT related to the changes done in the
+ strict branch. Changed (detailed) doxygen comments for the
+ methods obtain_sorted_constraints() and
+ obtain_sorted_generators().
+
+2002-03-23 Saturday 19:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.5), ppl_c.h (1.6): Finished the
+ implementation of const iterators for constraints.
+
+2002-03-23 Saturday 14:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.13), configure.ac (1.36): Support C compilers that
+ do not support `const' and/or `inline'.
+
+2002-03-23 Saturday 14:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: ppl_c.cc (1.4), ppl_c.h (1.5): Started interfacing
+ ConSys::const_iterator.
+
+2002-03-23 Saturday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.7), gp_clpq.pl (1.3),
+ ppl_gprolog.cc (1.9): The GNU Prolog interface is finally
+ operational. The problem was that a GNU Prolog integer is not
+ wide enough to hold a memory address: now memory addresses are
+ represented by terms of the form `[u1|u2]' where `u1' and `u2'
+ are GNU Prolog integers.
+
+2002-03-23 Saturday 13:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/track_allocation.hh (1.3): This was always
+ commented out due to a typo. Missing qualification added.
+
+2002-03-22 Friday 20:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (strict.11): Method satisfies_all_constraints(g)
+ reimplemented to work with NNC polyhedra and to correctly deal
+ with potential (legal) topology mismatches. As a consequence,
+ now PolyBase::relation_with(g) also works for NNC polyhedra
+ and/or an NNC generator parameter g.
+
+2002-03-22 Friday 20:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.22): The inclusion operator<=
+ re-implemented: - using the new scalaro product operator ^ when
+ appropriate; - changed the order of the two nested loops to
+ factor out some tests that were repeated unnecessarily.
+
+2002-03-22 Friday 20:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Row.cc, Row.defs.hh (strict.[2,3]): Added the "strict"
+ scalar product operator (PPL::operator^) computing the scalar
+ product of two Row objects but ignoring the last coefficient of
+ the first row.
+
+2002-03-22 Friday 15:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, GenSys.cc, PolyBase.cc (strict.[10,9,21]):
+ Metods GenSys::affine_image(v, e, d) and
+ ConSys::affine_preimage(v, e, d) no longer require the expression
+ `e' to have the _same_ number of columns of the matrix; now they
+ only require dimension compatibility. This change, while
+ allowing a correct implementation for NNC topology matrices, also
+ turns out to be a potentially remarkable performance improvement.
+
+ The corresponding methods of PolyBase changed accordingly: - no
+ longer performing the dangerous const_cast on the expression; -
+ missing assertion OK(false) placed on exit.
+
+2002-03-22 Friday 12:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.20): Cleaned the code trying to preserve
+ the sortedness of matrices when swapping epsilon columns in
+ methods add_dimensions*. In operator<=, avoiding repeated tests
+ on the generator kind when computing the scalar products for NNC
+ polyhedra.
+
+2002-03-22 Friday 10:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.19): Corrected a bug in
+ add_dimensions_and_constraint(). The OK() assertion at the end
+ of limited_widening_assign() changed into OK(false), because the
+ parameter cs may cause the polyhedron to become inconsistent. In
+ widening_assign(), now adding the epsilon constraints (instead of
+ the positivity one) when the topology requires them.
+
+2002-03-21 Thursday 18:08 Elisa Ricci
+
+ * src/: GenSys.cc, GenSys.defs.hh, Matrix.defs.hh, Polyhedron.cc,
+ Polyhedron.defs.hh, conversion.cc, minimize.cc
+ (positive.[1,1,2,5,3,6,11]): Started to implement the new method
+ that use a transformation to compute the system of constraints of
+ a positive polyhedron described by its system of generators: this
+ method is controlled by the flag "POSITIVE_TRANSFORMATION".
+
+2002-03-21 Thursday 16:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.18): Corrected a bug in the constructor
+ PolyBase(t, gs): we were breaking the correctenss of the
+ sortedness flag.
+
+2002-03-21 Thursday 16:03 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.17): Added missing OK(bool) assertions on
+ exit of constructors and methos operator<=,
+ intersection_assign(ph), convex_difference_assign(ph), insert(g),
+ insert(c), add_dimensions_and_constraints(),
+ add_generators_and_minimize().
+
+ Corrected \epsilon-swapping bugs in methods add_dimensions(...),
+ add_dimensions_and_project(), add_dimensions_and_embed() and
+ add_dimensions_and_constraints().
+
+ Patched topology-related bug in limited_widening_assign().
+
+2002-03-21 Thursday 15:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, GenSys.cc (strict.[9,8]): Methods get() and
+ print(), i.e., input/output operators >> and <<, now also handle
+ topology information.
+
+2002-03-21 Thursday 10:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.22): Added a note to
+ try and explain when the _and_minimize predicates should be used.
+
+2002-03-21 Thursday 09:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.21): Two bugs corrected
+ in the description of the "relation_with" predicates.
+
+2002-03-20 Wednesday 19:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.16): Patched methods
+ add_dimensions_and_embed(), add_dimensions_and_project() and
+ add_dimensions() to properly handle the "sorted" flag of
+ matrices. Corrected a small bug in
+ add_dimensions_and_constraints(), where we were trying to swap a
+ column with itself.
+
+2002-03-20 Wednesday 17:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.15): In constructors for NNC polyhedra,
+ add the \epsilon constraint in the order that is likely to
+ preserve the sorted flag.
+
+2002-03-20 Wednesday 17:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh, Generator.cc (strict.[5,3]): Just a
+ few spaces added for style.
+
+2002-03-20 Wednesday 17:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (strict.8): Corrected a bug in
+ has_strict_inequalities() whereby we were returning "true" when
+ finding the epsilon_geq_zero() constraint.
+
+2002-03-20 Wednesday 16:48 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.inlines.hh, PolyBase.cc (strict.[4,14]): A
+ strict inequality has a _negative_ \epsilon coefficient
+ (previously, we were testing for a _non-zero_ coefficient,
+ causing a bug in method operator<=(PolyBase&, PolyBase&).
+
+2002-03-20 Wednesday 16:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (strict.6): Constructors of the base class
+ PolyBase are now protected, so that the user _has_ to create
+ objects of the derived classes Polyhedron and NNC_Polyhedron.
+
+2002-03-20 Wednesday 15:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.13): Corrected a bug in operator<= for
+ the NNC case.
+
+2002-03-20 Wednesday 14:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.12): Implemented operator<= for NNC
+ polyhedra. Added a couple of missing assertions to
+ add_generators().
+
+2002-03-20 Wednesday 13:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, GenSys.cc, Matrix.cc (strict.[7,7,8]): In
+ Matrix::OK(), restored the test checking that num_columns() == 0
+ whenever num_rows() == 0. Added assertions to
+ ConSys::adjust_topology_and_dimension() and
+ GenSys::adjust_topology_and_dimension().
+
+2002-03-20 Wednesday 12:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+ (strict.[7,4,3]): Corrected bugs: - set_necessarily_closed() and
+ set_non_necessarily_closed() now also set the right topology
+ for all the rows in the matrix; - grow(...) no longer asserts
+ OK() on exit, because it may leave the matrix in a state where
+ num_rows() == 0 and num_columns() > 0; - grow(...) was comparing
+ the first row to be added with the last row in the matrix even
+ when there were no rows in the matrix; - insert(...) no longer
+ swaps a coefficient with itself when num_columns() and
+ row.size() do match.
+
+2002-03-20 Wednesday 11:20 Elisa Ricci
+
+ * tests/exceptions2.cc (strict.2): Added some other tests that show
+ when an exception is thrown: one of them shows that there is
+ still a problem with the function Matrix::grow().
+
+2002-03-19 Tuesday 19:02 Elisa Ricci
+
+ * tests/: Makefile.am, exceptions2.cc (strict.[1,1]): In
+ "exceptions2.cc" put two tests that show that an exception is
+ thrown if we want to built a Polyhedron starting from a system of
+ constraints that contains strict-inequalities or a a system of
+ generators that contains closure_points.
+
+2002-03-19 Tuesday 18:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.11): The method OK() improved to check
+ invariants for both NC and NNC polyhedra.
+
+2002-03-19 Tuesday 18:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (strict.6): One of the new tests added to OK() was
+ causing Matrix::grow() to fail. Temporarily commented out.
+
+2002-03-19 Tuesday 16:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (strict.6): Method OK() now merely calls
+ Matrix::OK(), since there are no other meaningful tests to
+ perform. Overriding used just for better documenting this fact.
+
+2002-03-19 Tuesday 16:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (strict.5): In method OK(), added a check on
+ matrices with no rows.
+
+2002-03-19 Tuesday 16:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (strict.6): In method OK(), no longer checking for
+ topology mismatches between the systems and its generators (this
+ is already done when calling Matrix::OK()). No longer checking
+ for the existence of a point, because points are only required if
+ the GenSys is representing a polyhedron (check has to be
+ performed by PolyBase::OK()).
+
+2002-03-19 Tuesday 15:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.cc (strict.4): Method OK() now checks for topology
+ mismatches between the matrix and its rows. The check on the
+ minimum number of columns updated to work correctly with NNC
+ topology matrices.
+
+2002-03-19 Tuesday 15:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc, Generator.inlines.hh (strict.[2,4]): Method
+ OK() updated to perform checks of invariants for generators
+ defined on the NNC topology.
+
+2002-03-19 Tuesday 15:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.cc (strict.1): In method OK(), added a check on the
+ minimum number of coefficients of a row (the minimum depends on
+ the row topology).
+
+2002-03-19 Tuesday 13:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (strict.5): In function OK(), when checking for the
+ existence of a point, we now use is_point() to (correctly)
+ disregard closure points. Also checking for topology mismatches
+ between gen_sys and its elements.
+
+2002-03-19 Tuesday 11:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.10): Exploiting the new explicit
+ conversions from Constraint/Generator to LinExpression in
+ PolyBase methods - insert(const Constraint&) - insert(const
+ Generator&) - convex_difference_assign(const PolyBase&).
+
+2002-03-19 Tuesday 11:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.cc (strict.2): Corrected a bug in the newly
+ introduced constructors.
+
+2002-03-19 Tuesday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.cc, LinExpression.defs.hh (strict.[1,1]):
+ Added explicit constructors taking a constraint/generator as
+ parameter: they are PPL_INTERNAL and extract from the parameter a
+ "necessarily closed" copy of the corresponding linear expression.
+
+2002-03-19 Tuesday 01:09 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/devref-browse.doxyconf-latex.in,
+ doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+ src/Makefile.am (strict.[1,1,1,3]): Added files NNC_Polyhedron.*
+ and PolyBase_* to Makefile.am and to the INPUT_FILE flags for
+ doxygen devref configuration files.
+
+2002-03-19 Tuesday 01:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.9): Consistency modification: all static
+ functions defined to just throw an exception now print the class
+ name of the invoking object (dirty kludge using the topology()
+ accessor; may be improved). Added a whole set of such functions
+ for reporting topology clashes and illegal generator systems.
+ Adjusted several comments. In method remove_dimensions, the case
+ when we remove _all_ dimensions captured earlier. Provided a
+ temporary patches for the methods PolyBase::insert(const
+ Constraint&) and PolyBase::insert(const Generator&). Added
+ topology-inconsistency checks to add_generators(gs).
+
+2002-03-19 Tuesday 00:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (strict.4): Methods reordered according
+ to Polyhedron.defs.hh.
+
+2002-03-19 Tuesday 00:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (strict.5): Method topology() made public.
+
+2002-03-19 Tuesday 00:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+ NNC_Polyhedron.inlines.hh, NNC_Polyhedron.types.hh
+ (strict.[1,1,1,1]): Put under CVS control.
+
+2002-03-19 Tuesday 00:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (strict.3): Removed useless include
+ directives (already included by PolyBase.defs.hh).
+
+2002-03-19 Tuesday 00:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/minimize.cc (strict.2): In both minimize(...) methods,
+ modified the emptyness check after conversion in order to work
+ for NNC Polyhedra too.
+
+2002-03-18 Monday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/user-browse.doxyconf-latex.in (1.11),
+ doc/user-print.doxyconf-latex.in (1.11),
+ doc/user.doxyconf-html.in (1.13), interfaces/C/ppl_c.cc (1.3),
+ interfaces/C/ppl_c.h (1.4): Several improvements to the C
+ interface.
+
+2002-03-18 Monday 17:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.17), doc/devref-browse.doxyconf-latex.in
+ (1.13), doc/devref-print.doxyconf-latex.in (1.13),
+ doc/devref.doxyconf-html.in (1.14),
+ doc/user-browse.doxyconf-latex.in (1.10),
+ doc/user-print.doxyconf-latex.in (1.10),
+ doc/user.doxyconf-html.in (1.12), interfaces/C/ppl_c.cc (1.2),
+ interfaces/C/ppl_c.h (1.3), src/LinExpression.defs.hh (1.27):
+ Started merging the new C interface.
+
+2002-03-18 Monday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.11): Another thing to remember.
+
+2002-03-18 Monday 15:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.8): Corrected a (just introduced) bug in
+ add_dimensions_and_constraints(ConSys& cs).
+
+2002-03-18 Monday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.10): More things we should not forget to do.
+
+2002-03-18 Monday 14:58 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.defs.hh, PolyBase.cc (strict.[4,7]): Patched method
+ PolyBase::add_generators_and_minimize(gs).
+
+2002-03-18 Monday 14:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.6): Patched method
+ PolyBase::add_dimensions_and_constraints(cs).
+
+2002-03-18 Monday 13:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.9): Things todo just after merging the `strict' branch.
+
+2002-03-18 Monday 11:43 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.5): Adding topology-compatibility checks
+ where needed, throwing exceptions if necessary. Consistently
+ using the methods [ConSys/GenSys]::adjust_topology_and_dimension
+ when building a new polyhedron (or augmenting an existing one)
+ starting from a ConSys or a GenSys. When building an NNC
+ polyhedron using the constructor PolyBase(GenSys&), we now add a
+ closure point for each point in the GenSys. Patched the
+ specification of convex_difference_assign() to work correctly for
+ NNC polyhedra. Patched the methods add_dimensions_and_* and
+ remove*_dimensions() to work correctly for NNC polyhedra. Added
+ a few "placeholder" exceptions to point out places where the
+ current implementation is still not correct.
+
+2002-03-18 Monday 11:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.defs.hh (strict.4): In doxygen comments, added
+ specification for exceptions that should be thrown when
+ identifying a topology-incompatibility.
+
+2002-03-18 Monday 11:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (strict.4): Using Matrix::swap_columns. Corrected
+ a bug in GenSys::insert(g).
+
+2002-03-18 Monday 11:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.defs.hh (strict.[5,3]): Method
+ contains_strict_inequalities() renamed as
+ has_strict_inequalities(). Using Matrix::swap_columns(i, j)
+ whene swapping the \epsilon coefficients after dimension changes.
+
+2002-03-18 Monday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc, Matrix.defs.hh (strict.[3,3]): Added method
+ Matrix::swap_columns(size_t i, size_t j) to factorize the several
+ places where we swap the column of \epsilon coefficients.
+
+2002-03-18 Monday 11:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.defs.hh, Generator.cc, Generator.inlines.hh
+ (strict.[2,1,3]): Implemented friend function closure_point(...)
+ returning a closure point. Added static method
+ zero_dim_closure_point().
+
+2002-03-17 Sunday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc, GenSys.defs.hh (strict.[3,3]): Added methods
+ adjust_topology_and_dimensions(), has_closure_points() and
+ has_points() to help checking for legality and automatically
+ adjusting generator systems when building polyhedra.
+
+2002-03-17 Sunday 14:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (strict.4): Optimized the method
+ contains_strict_inequalities() by factoring out the topology
+ tests.
+
+2002-03-17 Sunday 11:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/YAP/: Makefile.am (1.4), ppl_yap.cc (1.2),
+ ppl_yap.pl (1.2): Slow and difficult progress on the YAP
+ interface.
+
+2002-03-17 Sunday 11:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: definitions.dox (1.42), ppl.sty (1.6): Introcude the macro
+ \cone. Fix the macro \linspace. Define commands using the
+ \{new,renew,provide}command* form.
+
+2002-03-17 Sunday 11:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.35): Configuration for producing dlopen modules
+ and WIN32 dlls.
+
+2002-03-17 Sunday 08:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (strict.3): Add missing `inline'
+ qualifiers.
+
+2002-03-17 Sunday 00:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: PolyBase.cc, PolyBase.defs.hh, PolyBase.inlines.hh
+ (strict.[4,3,3]): The Topology parameter is now the first one in
+ constructors. Added the missing topology consistency assertion
+ to limited_widening_assign. Using the static Constraint members
+ for adding the positivity and epsilon related constraints in the
+ constructors. Constructor PolyBase(Topology, ConSys) now
+ automatically adjust the constraint system according to the first
+ parameter, throwing an exception if we try to insert a strict
+ inequality into a Polyhedron.
+
+2002-03-17 Sunday 00:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+ (strict.[3,2,2]): Added the assignment operator. All methods are
+ now inlined.
+
+2002-03-17 Sunday 00:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.defs.hh, GenSys.inlines.hh (strict.[2,3]): The
+ Topology parameter is now the first one in constructors.
+
+2002-03-17 Sunday 00:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh
+ (strict.[3,2,3]): Added methods adjust_topology_and_dimensions()
+ and contains_strict_inequality() to help checking for legality
+ and automatically adjusting constraint systems when building
+ polyhedra. Now the Topology parameter is the first one in
+ constructors.
+
+2002-03-17 Sunday 00:19 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh
+ (strict.[3,2,3]): Added static methods to produce the two
+ (zero-dim) epsilon constraints replacing the positivity
+ constraint in NNC polyhedra (0 \leq \epsilon \leq 1). Methods
+ is_trivial_true() and is_trivial_false() modified to also work
+ for strict inequalities.
+
+2002-03-16 Saturday 13:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+ Constraint.cc, Constraint.inlines.hh, GenSys.cc, GenSys.defs.hh,
+ GenSys.inlines.hh, Generator.inlines.hh, Makefile.am, Matrix.cc,
+ Matrix.defs.hh, Matrix.inlines.hh, PolyBase.cc, PolyBase.defs.hh,
+ PolyBase.inlines.hh, Polyhedron.cc, Row.defs.hh, Row.inlines.hh,
+ conversion.cc (strict.[2,1,2,2,2,2,1,2,2,2,2,2,2,3,2,2,2,2,3,3]):
+ In constructors, now using an element of the enum Topology in
+ order to control the kind of object created (instead of the
+ previous boolean). Started adding controls on Topology
+ mismatches and automatic conversions of objects when needed.
+
+2002-03-16 Saturday 13:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Topology.hh (strict.1): Put under CVS control: new header
+ file for the enumeration controlling the topological kind of Row,
+ Matrix, Constraint, Generator, ConSys, GenSys and PolyBase
+ objects.
+
+2002-03-15 Friday 11:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.inlines.hh (strict.2): Re-ordering the initializer in Row
+ constrauctors to avoid the warnings.
+
+2002-03-15 Friday 10:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc, ConSys.inlines.hh, Constraint.cc,
+ Constraint.defs.hh, Constraint.inlines.hh, GenSys.cc,
+ GenSys.inlines.hh, Generator.defs.hh, Generator.inlines.hh,
+ LinExpression.inlines.hh, Matrix.cc, Matrix.defs.hh,
+ Matrix.inlines.hh, Row.defs.hh, Row.inlines.hh, conversion.cc
+ (strict.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]): Removed enumeration
+ Type from class Row: added enumerations PolyhedronKind and
+ RowKind; they are merged into a single object using new class
+ Row::Type. Rows now rememberif they have or not the \epsilon
+ coefficient.
+
+ Constructors for Matrix now have a boolean flag indicating
+ whether or not the matrix has the \epsilon coefficient. The flag
+ is remembered in order to correctly set the type of new rows.
+
+ Added support for creating constraints that are strict
+ inequalities and generators that are closure points. Added
+ support for adding these two new kind of objects to constraint
+ systems and generator systems (with automatic detection and
+ resizing if needed).
+
+ Constraints, generators and the respective systems
+ space-dimensions now depend on the Polyhedron kind of the
+ corresponding rows.
+
+2002-03-15 Friday 08:55 Elisa Ricci
+
+ * doc/definitions.dox (1.41): Improved the proposition that is
+ before the definition of the ray space: we were using an object
+ that was not defined before.
+
+2002-03-14 Thursday 15:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.20): Draft descriptions
+ for all the new predicates added. A few other small improvements
+ made.
+
+2002-03-14 Thursday 13:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.21): Improved
+ ppl_affine_image and ppl_affine_preimage.
+
+2002-03-14 Thursday 12:22 Elisa Ricci
+
+ * doc/definitions.dox (1.40): Improved the definition of minimal
+ proper face.
+
+2002-03-14 Thursday 10:56 Elisa Ricci
+
+ * doc/definitions.dox (1.39): Corrected two errors in the
+ definition of minimal proper face: I have written "C" instead of
+ "P".
+
+2002-03-14 Thursday 09:21 Elisa Ricci
+
+ * doc/definitions.dox (1.38): Improved the documentation about the
+ faces of a polyhedron.
+
+2002-03-13 Wednesday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.50), relations9.cc (1.1): New test.
+
+2002-03-13 Wednesday 20:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.20),
+ interfaces/Prolog/GNU/ppl_gprolog.pl (1.2),
+ interfaces/Prolog/SICStus/ppl_sicstus.cc (1.44),
+ interfaces/Prolog/SWI/ppl_swiprolog.cc (1.11),
+ src/Poly_Con_Relation.defs.hh (1.3),
+ src/Poly_Con_Relation.inlines.hh (1.4),
+ src/Poly_Gen_Relation.defs.hh (1.3),
+ src/Poly_Gen_Relation.inlines.hh (1.4):
+ Poly_Con_Relation::implies() and Poly_Gen_Relation::implies()
+ were wrong because of missing parentheses.
+ Poly_Con_Relation::operator!() and Poly_Gen_Relation::operator!()
+ were ill-designed: removed. Added Poly_Con_Relation
+ operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y)
+ and the similar operator dealing with Poly_Gen_Relation. Prolog
+ interface functions ppl_relation_with_constraint/2 and
+ ppl_relation_with_generator/2 changed accordingly. New Prolog
+ interface functions made available to GNU, SICStus, and SWI
+ Prolog.
+
+2002-03-13 Wednesday 18:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.19): ppl_affine_image
+ and ppl_affine_preimage corrected and
+ ppl_add_domensions_and_constraints added.
+
+2002-03-13 Wednesday 17:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/PolyBase.cc (strict.2): When constructing a PolyBase, now we
+ store the value of the newly introduced boolean flag in the
+ corresponding private member.
+
+2002-03-13 Wednesday 17:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Makefile.am, PolyBase.cc, PolyBase.defs.hh,
+ PolyBase.inlines.hh, PolyBase.types.hh, Polyhedron.cc,
+ Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+ minimize.cc, simplify.cc (strict.[1,1,1,1,1,1,1,1,1,1,1]): Class
+ Polyhedron renamed into PolyBase. Added a private boolean flag
+ "necessarily_closed_" and modified all constructors (but not the
+ copy constructor) to also accept a boolean argument (which is
+ ignored, for the moment). Created a new class Polyhedron
+ inheriting public-ly from PolyBase. This will be the class
+ defining "necessarily closed" polyhedra.
+
+2002-03-13 Wednesday 16:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.18):
+ ppl_relation_with_constraint/3 and ppl_relation_with_generator/3
+ added.
+
+2002-03-13 Wednesday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.defs.hh (1.2),
+ Poly_Con_Relation.inlines.hh (1.3), Poly_Gen_Relation.defs.hh
+ (1.2), Poly_Gen_Relation.inlines.hh (1.3): The implies() methods
+ were not qualified as const. Poly_Con_Relation::operator!() and
+ Poly_Gen_Relation::operator!() added.
+
+2002-03-13 Wednesday 16:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.17),
+ SWI/ppl_swiprolog.cc (1.10): ppl_affine_image and
+ ppl_affine_preimage added.
+
+2002-03-13 Wednesday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.43): Misspelled
+ functions fixed. ppl_polyhedron_strictly_included/2 added.
+
+2002-03-13 Wednesday 14:02 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.16): Definitions of
+ equal, included_or_equal and strictly_included predicates
+ corrected.
+
+2002-03-13 Wednesday 11:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.15),
+ SWI/ppl_swiprolog.cc (1.9): Some corrections to some of the new
+ predicates definitions.
+
+2002-03-13 Wednesday 07:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.10): Always build `pplpl'
+ and `pl_clpq'.
+
+2002-03-13 Wednesday 07:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.14): Added new atoms
+ for the relations of polyhedra with constraints and generators.
+
+2002-03-13 Wednesday 07:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.42): Missing
+ semicolons added.
+
+2002-03-12 Tuesday 20:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.41): Macro SP_STUB_3
+ added and used for ppl_limited_widening_assign/3.
+
+2002-03-12 Tuesday 19:46 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.13),
+ SICStus/ppl_sicstus.cc (1.40), SWI/ppl_swiprolog.cc (1.8): <=,
+ ==, and < added as ppl predicates. SWI and SICStus interfaces
+ updated with <= and == predicates.
+
+2002-03-12 Tuesday 19:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.12),
+ SICStus/ppl_sicstus.cc (1.39), SWI/ppl_swiprolog.cc (1.7): Added
+ ppl_add_generators_and_minimize, ppl_check_universe, and
+ ppl_is_bounded. SICStus and SWI updated to use the new
+ predicates.
+
+2002-03-12 Tuesday 18:57 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.11):
+ ppl_add_generators_and_minimize added.
+
+2002-03-12 Tuesday 17:50 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.19): Restored comment
+ for ppl_copy_polyhedron, small change to notation and added draft
+ documentation for three predicates that were missing.
+
+2002-03-12 Tuesday 17:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/ppl_prolog.outlines.hh (1.10): Code for
+ ppl_limited_widening_assign, ppl_relation_with_constraint and
+ ppl_relation_with_generator added.
+
+2002-03-12 Tuesday 15:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.18): Added a note on the change of terminology
+ vertex/point.
+
+2002-03-12 Tuesday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.9),
+ Ciao/ppl_ciao.cc (1.3): Using "point" instead of "vertex".
+
+2002-03-12 Tuesday 15:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: addconstraints9.cc (1.5), adddimensions1.cc (1.6),
+ adddimensions3.cc (1.4), addgenerators1.cc (1.5),
+ addgenerators2.cc (1.5), addgenerators3.cc (1.4),
+ addgenerators4.cc (1.4), addgenerators5.cc (1.4),
+ addgenerators6.cc (1.4), affineimage1.cc (1.4),
+ affinepreimage1.cc (1.4), affinepreimage3.cc (1.3),
+ affinepreimage4.cc (1.4), affinetrans.cc (1.8),
+ convexdifference1.cc (1.8), convexhull1.cc (1.5), convexhull2.cc
+ (1.4), convexhull3.cc (1.3), error1.cc (1.8), error10.cc (1.2),
+ error11.cc (1.2), error12.cc (1.2), error13.cc (1.2), error14.cc
+ (1.2), error15.cc (1.2), error16.cc (1.2), error17.cc (1.2),
+ error18.cc (1.3), error19.cc (1.2), error2.cc (1.10), error20.cc
+ (1.3), error21.cc (1.4), error22.cc (1.3), error23.cc (1.2),
+ error24.cc (1.2), error25.cc (1.4), error26.cc (1.3), error27.cc
+ (1.3), error28.cc (1.3), error29.cc (1.3), error3.cc (1.10),
+ error4.cc (1.5), error5.cc (1.6), error6.cc (1.4), error7.cc
+ (1.3), error8.cc (1.2), error9.cc (1.3), exceptions1.cc (1.2),
+ generators1.cc (1.4), inters2.cc (1.11), inters5.cc (1.5),
+ inters6.cc (1.4), onepoint.cc (1.3), randchull1.cc (1.11),
+ relations2.cc (1.3), relations3.cc (1.3), relations4.cc (1.3),
+ relations5.cc (1.3), removedim1.cc (1.4), removedim2.cc (1.8),
+ removedim4.cc (1.5): In all the tests, now using "point" instead
+ of "vertex". Removed the old tests "errorN.cc", which are now
+ all subsumed by the single test "exceptions1.cc".
+
+2002-03-12 Tuesday 15:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.28), Constraint.defs.hh (1.45),
+ Constraint.inlines.hh (1.21), GenSys.cc (1.42), GenSys.defs.hh
+ (1.49), GenSys.inlines.hh (1.14), Generator.cc (1.23),
+ Generator.defs.hh (1.49), Generator.inlines.hh (1.22),
+ LinExpression.defs.hh (1.26), Matrix.cc (1.31), Polyhedron.cc
+ (1.142), Polyhedron.defs.hh (1.86), Row.cc (1.31), Row.defs.hh
+ (1.34), Row.inlines.hh (1.14), conversion.cc (1.24), minimize.cc
+ (1.17), simplify.cc (1.13): The term "vertex" replaced almost
+ everywhere by "point": this is because these kind of generators
+ are not necessarily vertices of the polyhedron. All comments
+ adjusted accordingly.
+
+2002-03-12 Tuesday 15:02 Elisa Ricci
+
+ * src/minimize.cc (positive.10): Some changes in the part
+ controlled by the flag " POS_SIMPLEX_TRICK".
+
+2002-03-12 Tuesday 14:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.18): Description of
+ some of the Prolog predicates improved.
+
+2002-03-12 Tuesday 13:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.141): Do not use the amsmath's \text{} macro
+ in contexts like $a_\text{var}$. Use $a_\mathrm{var}$ instead.
+
+2002-03-12 Tuesday 12:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.30): Do not use the `-e' option of GNU grep
+ (this solves a portability problem on Solaris).
+
+2002-03-12 Tuesday 11:44 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.44), Generator.defs.hh (1.48),
+ Generator.inlines.hh (1.21): The method Constraint::type() and
+ the corresponding enum Constraint::Type are now public. Added
+ new public type tests to Generator, is_ray() and is_vertex();
+ also, the existing method is_line() is now public.
+
+2002-03-12 Tuesday 11:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc (1.22), Generator.defs.hh (1.47),
+ Generator.inlines.hh (1.20): We were still throwing an exception
+ from the inlined method divisor(); added a non-inline function
+ for that purpose.
+
+2002-03-12 Tuesday 11:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.6), SWI/Makefile.am (1.9),
+ YAP/Makefile.am (1.3): More packaging glitches have been fixed.
+
+2002-03-12 Tuesday 09:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.7), GNU/Makefile.am (1.5),
+ SICStus/Makefile.am (1.15), SWI/Makefile.am (1.8),
+ YAP/Makefile.am (1.2): A first go at fixing the packaging
+ problems.
+
+2002-03-11 Monday 19:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.17), src/Polyhedron.defs.hh (1.85): Visibility bug fixed:
+ Polyhedron::is_empty() must be private.
+
+2002-03-11 Monday 18:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.17): Fixed a severe performance bug
+ in operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-03-11 Monday 14:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.34), Constraint.defs.hh (1.43),
+ GenSys.defs.hh (1.48), Generator.defs.hh (1.46), Matrix.defs.hh
+ (1.19), Row.defs.hh (1.33): Added a few missing doxygen comments
+ to avoid warnings.
+
+2002-03-11 Monday 14:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Matrix.inlines.hh (1.17): Fixed a \relates doxygen comment
+ pointing to the wrong class.
+
+2002-03-11 Monday 14:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Variable.defs.hh (1.15): Removed a redundant namespace
+ qualification.
+
+2002-03-11 Monday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.12),
+ devref-print.doxyconf-latex.in (1.12), devref.doxyconf-html.in
+ (1.13): Set the WARN_IF_UNDOCUMENTED flag to YES. This will have
+ no effect until we will set EXTRACT_ALL to NO. Added the
+ *.types.hh files to the INPUT variable.
+
+2002-03-11 Monday 14:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.17): Documentation
+ describing the PPL Prolog predicates revised.
+
+2002-03-11 Monday 12:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.16): Documentation for
+ ppl_copy_polyhedron corrected.
+
+2002-03-11 Monday 12:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: clpq.pl (1.4), clpq2.pl (1.3): Now consulting
+ 'file' will try also 'file.pl' in case 'file' does not exist or
+ is not readable.
+
+2002-03-11 Monday 01:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.19), Constraint.defs.hh (1.42),
+ Generator.cc (1.21), Generator.defs.hh (1.45), Matrix.cc (1.30),
+ Matrix.defs.hh (1.18), Matrix.inlines.hh (1.16), Polyhedron.cc
+ (1.140), Polyhedron.defs.hh (1.84), Row.cc (1.30), Row.defs.hh
+ (1.32), Row.inlines.hh (1.13), SatMatrix.cc (1.14),
+ SatMatrix.defs.hh (1.15), SatRow.cc (1.7), SatRow.defs.hh (1.11),
+ SatRow.inlines.hh (1.11), Status.cc (1.11), Status.defs.hh
+ (1.14), Variable.cc (1.6), Variable.defs.hh (1.14),
+ Variable.inlines.hh (1.8): Placing the doxygen \relates command
+ before function definitions (instead of declarations) to avoid
+ warnings for unmatched functions.
+
+2002-03-11 Monday 00:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.11),
+ devref-print.doxyconf-latex.in (1.11), devref.doxyconf-html.in
+ (1.12): Added the newer (and old ones too) source files to the
+ INPUT tag. Turned on the STRIP_CODE_COMMENTS flag, to avoid
+ outputting dosygen comments in the devref detailed comments for
+ enumerations (e.g., Generator::Type).
+
+2002-03-10 Sunday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.27), LinExpression.defs.hh (1.25),
+ Polyhedron.cc (1.139): Just formatting.
+
+2002-03-10 Sunday 21:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.29), Row.defs.hh (1.31): Avoid the creation of
+ temporaries in operator*(const Row& x, const Row& y). This
+ results in a speedup of at least 3%.
+
+2002-03-10 Sunday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.26), GenSys.cc (1.41): Missing full-stops
+ added.
+
+2002-03-10 Sunday 16:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.25), GenSys.cc (1.40):
+ ConSys::affine_preimage() and GenSys::affine_image() shortened
+ and slightly optimized. Moreover, each contained a wrong
+ assertion.
+
+2002-03-10 Sunday 15:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.cc (1.24): Avoid a useless temporary in
+ ConSys::affine_preimage().
+
+2002-03-10 Sunday 14:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.23), ConSys.defs.hh (1.33), ConSys.inlines.hh
+ (1.13), Constraint.defs.hh (1.41), Constraint.inlines.hh (1.20),
+ GenSys.cc (1.39), GenSys.defs.hh (1.47), GenSys.inlines.hh
+ (1.13), LinExpression.defs.hh (1.24), LinExpression.inlines.hh
+ (1.12), Matrix.cc (1.29), Matrix.defs.hh (1.17), Polyhedron.cc
+ (1.138), Row.defs.hh (1.30), Row.inlines.hh (1.12), SatMatrix.cc
+ (1.13), SatMatrix.defs.hh (1.14), SatMatrix.inlines.hh (1.9),
+ Variable.defs.hh (1.13), Variable.inlines.hh (1.7): Compile
+ cleanly with gcc's -Wshadow.
+
+2002-03-10 Sunday 13:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.34): The configure options --with-cflags and
+ --with-cxxflags now add more compiler options (as opposed to
+ replace them). In addition the --with-cflags options was simply
+ broken.
+
+2002-03-10 Sunday 13:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swiprolog.cc (1.6): Assertion fixed.
+
+2002-03-10 Sunday 00:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.18), Generator.cc (1.20): Useless
+ namespace qualification in argument was causing a doxygen
+ warning.
+
+2002-03-10 Sunday 00:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.10),
+ devref-print.doxyconf-latex.in (1.10), devref.doxyconf-html.in
+ (1.11), user-browse.doxyconf-latex.in (1.9),
+ user-print.doxyconf-latex.in (1.9), user.doxyconf-html.in (1.11):
+ New configuration files obtained by using the -u options of
+ doxygen 1.2.14 and a bit of manual editing.
+
+2002-03-09 Saturday 19:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/C/: Makefile.am (1.2), ppl_c.c (1.2), ppl_c.cc (1.1),
+ ppl_c.h (1.2): Slow progress. The C interface is implemented in
+ C++ (of course).
+
+2002-03-09 Saturday 13:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.33), interfaces/Makefile.am (1.4),
+ interfaces/C/.cvsignore (1.1), interfaces/C/Makefile.am (1.1),
+ interfaces/C/ppl_c.c (1.1), interfaces/C/ppl_c.h (1.1): C
+ interface started.
+
+2002-03-08 Friday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.8): More things to do.
+
+2002-03-08 Friday 12:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.32): The SICStus Prolog interface is only built
+ if the user has SICStus Prolog 3.9.0 or a later version.
+
+2002-03-08 Friday 11:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/ppl_gprolog.cc (1.8),
+ SICStus/ppl_sicstus.cc (1.38), SWI/ppl_swiprolog.cc (1.5): Minor
+ improvements.
+
+2002-03-08 Friday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.31), interfaces/Prolog/YAP/.cvsignore (1.1),
+ interfaces/Prolog/YAP/Makefile.am (1.1),
+ interfaces/Prolog/YAP/ppl_yap.cc (1.1),
+ interfaces/Prolog/YAP/ppl_yap.pl (1.1),
+ interfaces/Prolog/YAP/yap_clpq.pl (1.1): YAP Prolog interface
+ started.
+
+2002-03-08 Friday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: relations1.cc (1.2), relations2.cc (1.2), relations3.cc
+ (1.2), relations4.cc (1.2), relations5.cc (1.2), relations6.cc
+ (1.2), relations7.cc (1.2), relations8.cc (1.2): Tests updated to
+ correctly use the new classes Poly_Con_Relation and
+ Poly_Gen_Relation.
+
+2002-03-08 Friday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.38), GenSys.defs.hh (1.46), Polyhedron.cc
+ (1.137), Polyhedron.defs.hh (1.83): Methods relation_with(...)
+ updated to correctly use the new classes Poly_Con_Relation and
+ Poly_Gen_Relation.
+
+2002-03-08 Friday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.32), ConSys.inlines.hh (1.12),
+ Constraint.cc (1.17), Constraint.defs.hh (1.40),
+ Constraint.inlines.hh (1.19), GenSys.defs.hh (1.45),
+ GenSys.inlines.hh (1.12), Generator.cc (1.19), Generator.defs.hh
+ (1.44), LinExpression.cc (1.10), LinExpression.defs.hh (1.23),
+ LinExpression.inlines.hh (1.11), Matrix.cc (1.28), Matrix.defs.hh
+ (1.16), Matrix.inlines.hh (1.15), Poly_Con_Relation.cc (1.2),
+ Poly_Gen_Relation.cc (1.2), Polyhedron.cc (1.136),
+ Polyhedron.defs.hh (1.82), Polyhedron.inlines.hh (1.16), Row.cc
+ (1.28), Row.defs.hh (1.29), Row.inlines.hh (1.11), SatMatrix.cc
+ (1.12), SatMatrix.defs.hh (1.13), SatMatrix.inlines.hh (1.8),
+ SatRow.cc (1.6), SatRow.defs.hh (1.10), SatRow.inlines.hh (1.10),
+ Status.cc (1.10), Status.defs.hh (1.13), Status.inlines.hh (1.7),
+ Variable.cc (1.5), Variable.defs.hh (1.12), Variable.inlines.hh
+ (1.6): For each operator name @ different from `new' and
+ `delete', the syntax `operator@()' has to be preferred to
+ `operator @'.
+
+2002-03-08 Friday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Poly_Con_Relation.inlines.hh (1.2),
+ Poly_Gen_Relation.inlines.hh (1.2): Add missing `inline'
+ qualifiers.
+
+2002-03-08 Friday 10:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.37), GenSys.defs.hh (1.44), Makefile.am
+ (1.29), Poly_Con_Relation.cc (1.1), Poly_Con_Relation.defs.hh
+ (1.1), Poly_Con_Relation.inlines.hh (1.1),
+ Poly_Con_Relation.types.hh (1.1), Poly_Gen_Relation.cc (1.1),
+ Poly_Gen_Relation.defs.hh (1.1), Poly_Gen_Relation.inlines.hh
+ (1.1), Poly_Gen_Relation.types.hh (1.1), Polyhedron.cc (1.135),
+ Polyhedron.defs.hh (1.81), relations.cc (1.2), relations.hh
+ (1.3): New classes for polyhedron/constraint and
+ polyhedron/generator relations.
+
+2002-03-08 Friday 09:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Status.defs.hh (1.12), Status.inlines.hh (1.6): Only
+ esthetics.
+
+2002-03-07 Thursday 19:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/Makefile.am (1.4), GNU/gp_clpq.pl (1.2),
+ GNU/ppl_gprolog.cc (1.7), SWI/Makefile.am (1.7): GNU Prolog
+ CLP(Q) interpreter almost working (the ack.clpq test provokes a
+ segmentation fault though).
+
+2002-03-07 Thursday 16:35 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.37): First part of Section 1.2 -
+ Homogeneous Systems of the developer's manual, revised.
+
+2002-03-07 Thursday 14:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.7): Started adding the list of minor things to do.
+
+2002-03-07 Thursday 12:48 Elisa Ricci
+
+ * tests/: Makefile.am (1.49), includes1.cc (1.7), includes2.cc
+ (1.6), includes3.cc (1.6), includes4.cc (1.6), relations1.cc
+ (1.1), relations2.cc (1.1), relations3.cc (1.1), relations4.cc
+ (1.1), relations5.cc (1.1), relations6.cc (1.1), relations7.cc
+ (1.1), relations8.cc (1.1), satisfies1.cc (1.8), satisfies2.cc
+ (1.6), satisfies3.cc (1.7), satisfies4.cc (1.5): The tests
+ includes1, includes2, includes3, includes4 are now renamed
+ relations1, relations2, relations3, relations4 and the tests
+ satisfies1, satisfies2,satisfies3, satisfies4 are renamed
+ relations5, relations6, relations7, relations8.
+
+2002-03-07 Thursday 12:24 Elisa Ricci
+
+ * tests/: Makefile.am (1.48), exceptions1.cc (1.1): All the tests
+ for the exceptions are now put in this file.
+
+2002-03-07 Thursday 12:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: check_script (1.2), clpq.pl (1.3),
+ SICStus/sp_clpq.pl (1.2), SWI/Makefile.am (1.6), SWI/pl_clpq.cc
+ (1.1), SWI/pl_clpq.pl (1.2): The CLP(Q) interpreter now behaves
+ the same under SICStus and SWI-Prolog. The two version now
+ implement the same `make check' procedure.
+
+2002-03-07 Thursday 11:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.16): Corrected a cut&paste error and added a note on the
+ bug fixed in Polyhedron::add_constraints().
+
+2002-03-07 Thursday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.8),
+ GNU/ppl_gprolog.cc (1.6), SICStus/ppl_sicstus.cc (1.37),
+ SWI/Makefile.am (1.5), SWI/ppl_swiprolog.cc (1.4): Use the names
+ Prolog_is_cons and Prolog_get_cons instead of the ambiguous
+ Prolog_is_list and Prolog_get_list. Bugs fixed. The CLP(Q)
+ interpreter now works also under SWI-Prolog.
+
+2002-03-07 Thursday 11:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.36): Adjusted a few comments in
+ GenSys::relation_with(c). Also avoided using the boolean variable
+ first_vertex_or_nonsaturating_ray when c is an equality
+ constraint.
+
+2002-03-07 Thursday 10:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.35), tests/satisfies4.cc (1.4): Method
+ Polyhedron::relation_with(c) corrected to work as expected when c
+ is an equality. Test satisfies4, modified to test for the right
+ thing, now is correctly handled.
+
+2002-03-07 Thursday 08:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.134): "steel" corrected to "steal".
+
+2002-03-06 Wednesday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.6), check_script (1.1),
+ clpq.pl (1.2), clpq2.pl (1.2), expected (1.1), GNU/Makefile.am
+ (1.3), GNU/gp_clpq.pl (1.1), GNU/ppl_gprolog.cc (1.5),
+ SICStus/Makefile.am (1.14), SICStus/check_script (1.2),
+ SICStus/expected (1.5), SWI/Makefile.am (1.4), SWI/pl_clpq.pl
+ (1.1): Slow progress on the unified Prolog interfaces.
+
+2002-03-06 Wednesday 19:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.80), tests/error21.cc (1.3),
+ tests/error22.cc (1.2), tests/includes1.cc (1.6),
+ tests/includes2.cc (1.5), tests/includes3.cc (1.5),
+ tests/includes4.cc (1.5): Small fix in a comment of
+ Polyhedron.defs.hh. Modified a few tests to let them compile
+ after the API changes.
+
+2002-03-06 Wednesday 15:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * NEWS (1.15), src/relations.hh (1.2): Small change in a comment to
+ enum Relation_Poly_Con. Added to NEWS information about the
+ replacement of includes() and satisfies() by methods
+ relation_with().
+
+2002-03-06 Wednesday 15:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.34), src/GenSys.defs.hh (1.43), src/Makefile.am
+ (1.28), src/Polyhedron.cc (1.133), src/Polyhedron.defs.hh (1.79),
+ src/relations.cc (1.1), src/relations.hh (1.1),
+ tests/satisfies1.cc (1.7), tests/satisfies2.cc (1.5),
+ tests/satisfies3.cc (1.6), tests/satisfies4.cc (1.3): Put under
+ CVS control.
+
+2002-03-06 Wednesday 15:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ack.clpq (1.1), ackn.clpq (1.1), clpq.pl
+ (1.1), clpq2.pl (1.1), fib.clpq (1.1), mc91.clpq (1.1),
+ ppl_prolog.pl (1.1), smm.clpq (1.1), smmdiff.clpq (1.1),
+ sumto.clpq (1.1), tak.clpq (1.1), SICStus/Makefile.am (1.13),
+ SICStus/ack.clpq (1.4), SICStus/ackn.clpq (1.2), SICStus/clpq.pl
+ (1.28), SICStus/clpq2.pl (1.4), SICStus/fib.clpq (1.3),
+ SICStus/mc91.clpq (1.2), SICStus/ppl_sicstus.pl (1.19),
+ SICStus/smm.clpq (1.2), SICStus/smmdiff.clpq (1.3),
+ SICStus/sp_clpq.pl (1.1), SICStus/sumto.clpq (1.2),
+ SICStus/tak.clpq (1.2): Share as much sources as possible among
+ all supported Prolog implementations.
+
+2002-03-06 Wednesday 13:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.7),
+ track_allocation.hh (1.2), SICStus/ppl_sicstus.cc (1.36),
+ SICStus/ppl_sicstus.pl (1.18): GNU Prolog, SICStus Prolog and
+ SWI-Prolog interfaces now share most of the code.
+
+2002-03-06 Wednesday 11:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.33): In GenSys::affine_image(), rays and lines
+ can be mapped into the origin only if the transformation is NOT
+ invertible.
+
+2002-03-06 Wednesday 11:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.132): Invertible affine transformations
+ preserve both the minimality and the saturation relations of
+ constraints and generators.
+
+2002-03-06 Wednesday 08:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: exceptions.hh (1.3), ppl_prolog.outlines.hh
+ (1.6), track_allocation.hh (1.1), GNU/ppl_gprolog.cc (1.4),
+ SWI/ppl_swiprolog.cc (1.3): GNU Prolog interface fixed. More
+ common code between the GNU Prolog and the SWI Prolog interfaces.
+ Allocation tracking implemented in a separate file.
+
+2002-03-05 Tuesday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/ppl_gprolog.cc (1.3): Work around a couple
+ of bugs in GNU Prolog 1.2.8.
+
+2002-03-05 Tuesday 19:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.32): Now GenSys::satisfy() correctly handles the
+ case when c is an equality. Still have to check the case of c
+ being an inequality.
+
+2002-03-05 Tuesday 16:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/satisfies4.cc (1.2): Corrected the test just inserted (and
+ set NOISY = 0).
+
+2002-03-05 Tuesday 15:46 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.47), satisfies4.cc (1.1): The test
+ satisfies4 shows a bug whereby we return SOME_SATISFY even when
+ the considered equality constraint has an empty intersection with
+ the polyhedron.
+
+2002-03-05 Tuesday 14:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.131): Corrected a bug in satisfies() for the
+ case when *this is a zero-dim univ. polyhedron. Now the test
+ satisfies3 should pass.
+
+2002-03-05 Tuesday 14:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/satisfies3.cc (1.5): Test satisfies3 modified to check all
+ the possibilities when calling Polyhedron::satisfies() on a
+ zero-dim-universe polyhedron. The old test was meaningless,
+ since it was saying that the wrong result was ok. This new test
+ shows a bug that I am going to correct.
+
+2002-03-05 Tuesday 12:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.39): A couple of spelling errors in
+ comments fixed.
+
+2002-03-04 Monday 22:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.9),
+ devref-print.doxyconf-latex.in (1.9), devref.doxyconf-html.in
+ (1.10): Include the Prolog interfaces into the documentation for
+ developers.
+
+2002-03-04 Monday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.35),
+ SWI/ppl_swiprolog.cc (1.2): Small improvements.
+
+2002-03-04 Monday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/GNU/: Makefile.am (1.2), ppl_gprolog.cc (1.2),
+ ppl_gprolog.pl (1.1): GNU Prolog interface almost complete.
+
+2002-03-04 Monday 17:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/simplify.cc (1.12): Adjusted the comments in the part where
+ we check the independence rule for inequalities.
+
+2002-03-04 Monday 17:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: GNU/.cvsignore (1.1), SWI/.cvsignore (1.1):
+ Put under CVS control.
+
+2002-03-04 Monday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.30), interfaces/Prolog/GNU/Makefile.am (1.1),
+ interfaces/Prolog/GNU/ppl_gprolog.cc (1.1): GNU Prolog interface
+ started.
+
+2002-03-04 Monday 17:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.12), ppl_sicstus.cc
+ (1.34): Comment added. Do not use the preprocessor to declare
+ constants.
+
+2002-03-04 Monday 17:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/: Makefile.am (1.3), ppl_swi.cc (1.7),
+ ppl_swiprolog.cc (1.1): Renamed.
+
+2002-03-04 Monday 17:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swi.cc (1.6): More interface functions
+ added.
+
+2002-03-04 Monday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/Makefile.am (1.2), src/Makefile.am (1.27):
+ Comments fixed.
+
+2002-03-04 Monday 16:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.8): Updated.
+
+2002-03-04 Monday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.29), interfaces/Prolog/exceptions.hh (1.2),
+ interfaces/Prolog/ppl_prolog.outlines.hh (1.5),
+ interfaces/Prolog/SICStus/ppl_sicstus.cc (1.33),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.17),
+ interfaces/Prolog/SWI/Makefile.am (1.1),
+ interfaces/Prolog/SWI/ppl_swi.cc (1.5),
+ interfaces/Prolog/SWI/pplpl.cc (1.1): SWI Prolog interface almost
+ complete.
+
+2002-03-04 Monday 14:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.130): Since the Row::capacity() method is
+ accessible only during debugging, we no longer swap rows in
+ Polyhedron::add_constraints() (we always swap the coefficeints).
+
+2002-03-03 Sunday 11:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: minimize.cc (1.16), simplify.cc (1.11): Started polishing
+ the comments, and also the code in a few places, for the function
+ simplify(). Adjusted a few comments in minimize(), regarding the
+ saturation matrix.
+
+2002-03-02 Saturday 17:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/exceptions.hh (1.1): Exceptions to be used by
+ the Prolog interfaces.
+
+2002-03-02 Saturday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.4),
+ SICStus/ppl_sicstus.cc (1.32), SICStus/ppl_sicstus.pl (1.16),
+ SWI/ppl_swi.cc (1.4): Progress on the SWI and SICStus interfaces.
+ More error checking added.
+
+2002-03-02 Saturday 14:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.3),
+ SICStus/ppl_sicstus.cc (1.31), SWI/ppl_swi.cc (1.3): SICStus and
+ SWI interfaces reconciled.
+
+2002-03-02 Saturday 09:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.129): In add_constraints(), corrected a bug
+ whereby we were mixing constraints having different row's
+ capoacities into a single constraint system.
+
+2002-03-02 Saturday 09:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/minimize.cc (1.15): Small change in a comment.
+
+2002-03-02 Saturday 09:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.43): Added the right doxygen comments to
+ enumeration Generator::Type. The special command
+ \hideinitializer allows to mask implementation details.
+
+2002-03-02 Saturday 07:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: ppl_prolog.outlines.hh (1.2),
+ SICStus/ppl_sicstus.cc (1.30), SWI/ppl_swi.cc (1.2): Some
+ progress on the combined SICStus/SWI interface.
+
+2002-03-01 Friday 16:55 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.defs.hh (1.78), minimize.cc (1.14): Polished the
+ function add_and_minimize(...). No longer using variable
+ `index', which was useless. Some style changes to made the code
+ more uniform wrt what is done in function minimize(...). Also,
+ con_to_ray renamed into con_to_gen.
+
+2002-03-01 Friday 16:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SWI/ppl_swi.cc (1.1): This will become the
+ SWI-Prolog stub.
+
+2002-03-01 Friday 15:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.29): Use
+ ppl_prolog.outlines.hh.
+
+2002-03-01 Friday 15:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Makefile.am (1.5), ppl_prolog.outlines.hh
+ (1.1): Will try to derive as much Prolog interfaces as possible
+ from this one.
+
+2002-03-01 Friday 14:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: ppl_ciao.cc (1.2), ppl_ciao.pl (1.2):
+ Ciao only handles integer type `int'. Added placeholders for
+ linker and compiler options.
+
+2002-03-01 Friday 14:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * interfaces/Prolog/Ciao/: ppl_ciao.cc (1.1), ppl_ciao.pl (1.1):
+ Put under CVS control. The structure of ppl_ciao.pl is basically
+ there, even if there still are gaps to be filled. ppl_ciao.cc,
+ for the moment, is just a bare copy of the code written for
+ SICStus.
+
+2002-03-01 Friday 12:42 Elisa Ricci
+
+ * src/: conversion.cc, minimize.cc (positive.[5,9]): Tried to
+ implement a new method to compute the system of constraints of a
+ positive polyhedron defined by its system of generators: it is
+ controlled by the flag "POS_SIMPLEX_TRICK".
+
+2002-02-28 Thursday 17:08 Elisa Ricci
+
+ * src/conversion.cc, src/minimize.cc, src/simplify.cc,
+ tests/Makefile.am, tests/bug7.cc, tests/bug7.dat
+ (positive.[4,8,4,8,1,1]): We need the equalities that derived
+ from the constraints of positivity of the variables: this
+ resolves "bug6". Added a test that still fails.
+
+2002-02-28 Thursday 12:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.6): Reference added.
+
+2002-02-28 Thursday 08:44 Elisa Ricci
+
+ * src/: Generator.defs.hh (1.42), Row.defs.hh (1.28): Changed the
+ place of the comment about the inhomogeneous term of a vertex.
+
+2002-02-27 Wednesday 19:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.14): Better explanations.
+
+2002-02-27 Wednesday 19:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.8),
+ devref-print.doxyconf-latex.in (1.8), devref.doxyconf-html.in
+ (1.9): Predefine PPL_INTERNAL and PPL_HIDDEN.
+
+2002-02-27 Wednesday 18:26 Elisa Ricci
+
+ * NEWS (1.13), src/Polyhedron.cc (1.128), src/Polyhedron.defs.hh
+ (1.77), tests/Makefile.am (1.46), tests/bounded1.cc (1.1): Added
+ the function Polyhedron::is_bounded() that returns true if and
+ only if the polyhedron is bounded. Added a test for this
+ function.
+
+2002-02-27 Wednesday 17:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/minimize.cc (1.13): In minimize(), added an assertion saying
+ that matrix source is not empty. Removed a FIXME and added a
+ comment explaining why dest is initialized as what would be a
+ non-legal generator matrix.
+
+2002-02-27 Wednesday 16:52 Elisa Ricci
+
+ * NEWS (1.12): Added the new feature that says that PPL does not
+ call abort(), but we have an error message and the correction of
+ the bug of the negative denominator of the vertex.
+
+2002-02-27 Wednesday 16:36 Elisa Ricci
+
+ * src/: Generator.cc (1.18), Generator.defs.hh (1.41),
+ Polyhedron.cc (1.127): Considered the fact that a vertex must
+ always have a positive denominator.
+
+2002-02-27 Wednesday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.5): Non-Necessarily-Closed Polyhedra.
+
+2002-02-27 Wednesday 14:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.4): Constructions on polyhedra.
+
+2002-02-27 Wednesday 13:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/generators1.cc (1.3): Print something only when NOISY.
+
+2002-02-27 Wednesday 13:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * TODO (1.3): Started with the definition of strict weak ordering
+ and with a statement about why we need one or more of them.
+
+2002-02-27 Wednesday 11:16 Elisa Ricci
+
+ * src/minimize.cc (1.12), tests/generators1.cc (1.2): Used the
+ exception instead of the abort() and modified the test.
+
+2002-02-27 Wednesday 10:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.11), configure.ac (1.28), src/Makefile.am (1.26): We are
+ now in the 0.4 era.
+
+2002-02-27 Wednesday 10:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/minimize.cc (1.11): Polishing the comments in function
+ minimize(). Small changes to the code (no longer using the flag
+ empty_or_illegal).
+
+2002-02-27 Wednesday 09:18 Elisa Ricci
+
+ * tests/: Makefile.am (1.45), generators1.cc (1.1): Added a test
+ for a polyhedron built form a system of generators with a vertex
+ with negative denominator.
+
+2002-02-26 Tuesday 14:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.27): Release number back to 0.3 i order to
+ generate the Web pages' documentation.
+
+2002-02-26 Tuesday 12:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_3-branch.2), README (1.11): Fixed.
+
+2002-02-26 Tuesday 12:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_3-branch.1), NEWS (1.10): Updated.
+
+2002-02-26 Tuesday 12:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.10): Updated.
+
+2002-02-26 Tuesday 12:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (ppl-0_3-branch.1): Updated.
+
+2002-02-26 Tuesday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.26): Bump version number: the main trunk is now
+ in the 0.4 era.
+
+2002-02-26 Tuesday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_3-branch.1): Update version.
+
+2002-02-26 Tuesday 12:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_3-branch.1): Mark ChangeLog.
+
+2002-02-26 Tuesday 11:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (ppl-0_3-branch.1),
+ Makefile.am (1.11): Ignore all space when comparing results.
+
+2002-02-26 Tuesday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.7): Updated.
+
+2002-02-26 Tuesday 11:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.9): Updated.
+
+2002-02-26 Tuesday 11:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.6), config.guess (1.8), doc/definitions.dox (1.36),
+ interfaces/Prolog/SICStus/clpq.pl (1.27),
+ interfaces/Prolog/SICStus/clpq2.pl (1.3),
+ interfaces/Prolog/SICStus/expected (1.4),
+ interfaces/Prolog/SICStus/fib.clpq (1.2),
+ interfaces/Prolog/SICStus/smmdiff.clpq (1.2),
+ src/Constraint.defs.hh (1.38), src/GenSys.cc (1.31),
+ src/Polyhedron.cc (1.126), tests/addconstraints11.cc (1.4),
+ tests/addconstraints5.cc (1.5), tests/adddimensions1.cc (1.5),
+ tests/convexdifference1.cc (1.7), tests/error28.cc (1.2),
+ tests/error29.cc (1.2), tests/universe5.cc (1.3): Trailing blanks
+ removed.
+
+2002-02-26 Tuesday 10:34 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.76): Added the documentation for the
+ exception thrown in the function Polyhedron::add_generators and
+ Polyhedron::add_generators_and_minimize if the polyhedron is
+ empty and the system of generators has no vertices.
+
+2002-02-26 Tuesday 09:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.37): Simplified the example showing how
+ to use the Constraint::coefficient() methods.
+
+2002-02-26 Tuesday 08:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.15):
+ ppl_convex_difference_assign/2 mentioned.
+
+2002-02-26 Tuesday 02:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.23): Another big pass on all the comments,
+ trying to uniformize the terminology. Small changes in the code
+ to avoid repeating tests that are useless under certain
+ conditions.
+
+2002-02-25 Monday 22:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.36): Small changes in the
+ documentation.
+
+2002-02-25 Monday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.14), configure.ac (1.25), doc/Makefile.am (1.16),
+ interfaces/Makefile.am (1.3), interfaces/Prolog/Makefile.am
+ (1.4), interfaces/Prolog/SICStus/Makefile.am (1.10),
+ m4/Makefile.am (1.5), m4/ac_check_gmp.m4 (1.3), src/Makefile.am
+ (1.25), tests/Makefile.am (1.44): Limit the exceptions to the
+ GPL.
+
+2002-02-25 Monday 21:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.40): The example on the use of
+ coefficient(v) modified to keep into account the divisor of the
+ vertex and to actually check that g1 is a vertex.
+
+2002-02-25 Monday 18:02 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.35), Generator.defs.hh (1.39):
+ Modified the example of the use of coefficient(v) for a
+ generator. Modified also the similar example for a constraint,
+ now using the assignment operator.
+
+2002-02-25 Monday 17:28 Elisa Ricci
+
+ * tests/: Makefile.am (1.43), addconstraints10.cc (1.4),
+ addconstraints11.cc (1.3), addconstraints2.cc (1.8),
+ addconstraints4.cc (1.3), addconstraints5.cc (1.4),
+ addconstraints6.cc (1.4), addconstraints7.cc (1.4),
+ addconstraints8.cc (1.4), addconstraints9.cc (1.4),
+ adddimensions1.cc (1.4), adddimensions2.cc (1.3),
+ adddimensions3.cc (1.3), adddimensions4.cc (1.3),
+ addgenerators1.cc (1.4), addgenerators2.cc (1.4),
+ addgenerators3.cc (1.3), addgenerators4.cc (1.3),
+ addgenerators5.cc (1.3), addgenerators6.cc (1.3), affineimage1.cc
+ (1.3), affineimage2.cc (1.3), affinepreimage1.cc (1.3),
+ affinepreimage2.cc (1.3), affinepreimage3.cc (1.2),
+ affinepreimage4.cc (1.3), convexdifference1.cc (1.6),
+ convexhull1.cc (1.4), convexhull2.cc (1.3), error28.cc (1.1),
+ error29.cc (1.1), includes2.cc (1.4), includes3.cc (1.4),
+ includes4.cc (1.4), inters3.cc (1.4), inters4.cc (1.3),
+ inters5.cc (1.4), inters6.cc (1.3), limitedwidening1.cc (1.5),
+ removedim2.cc (1.7), removedim3.cc (1.4), removedim4.cc (1.4),
+ removedim5.cc (1.3), removedim6.cc (1.3), satisfies1.cc (1.6),
+ satisfies2.cc (1.4), satisfies3.cc (1.4), universe1.cc (1.2),
+ universe2.cc (1.2), universe3.cc (1.2), universe4.cc (1.2),
+ universe5.cc (1.2): We use the functions of the file print.hh to
+ print when it is possible. Added two tests for the functions
+ Polyhedron::add_generators() and
+ Polyhedron::add_generators_and_minimize().
+
+2002-02-25 Monday 17:23 Elisa Ricci
+
+ * src/Polyhedron.cc (1.125): In functions
+ Polyhedron::add_generators() and
+ Polyhedron::add_generators_and_minimize, we throw an exception if
+ we add a system of generators with no vertex to an empty
+ polyhedron.
+
+2002-02-25 Monday 17:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/globals.hh (1.9): Qualified name is not allowed in namespace
+ member declaration.
+
+2002-02-25 Monday 17:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.34), Constraint.inlines.hh (1.18),
+ Generator.defs.hh (1.38), Generator.inlines.hh (1.19),
+ Row.defs.hh (1.27), Row.inlines.hh (1.10): Assignments operators
+ added for Constraint and Generator. Some cleaning meanwhile.
+
+2002-02-25 Monday 15:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.33): Changed the example showing how to
+ use method coefficient(v) and is_equality(). This shows that we
+ probably miss a public method that is capable to set the
+ relational operator of a constraint.
+
+2002-02-25 Monday 15:02 Elisa Ricci
+
+ * tests/: addconstraints1.cc (1.4), addconstraints10.cc (1.3),
+ addconstraints5.cc (1.3), addconstraints6.cc (1.3),
+ addconstraints7.cc (1.3), addconstraints8.cc (1.3),
+ addconstraints9.cc (1.3), error25.cc (1.3), includes1.cc (1.5),
+ includes2.cc (1.3), includes3.cc (1.3), includes4.cc (1.3),
+ inters5.cc (1.3), satisfies2.cc (1.3), satisfies3.cc (1.3):
+ Corrected some errors in the tests.
+
+2002-02-25 Monday 14:51 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.16), Constraint.defs.hh (1.32),
+ Constraint.inlines.hh (1.17), Generator.cc (1.17),
+ Generator.defs.hh (1.37), Generator.inlines.hh (1.18): Added
+ non-inlined methods that throw exceptions. These are now called
+ by the inline methods coefficient(v).
+
+2002-02-25 Monday 14:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.7), config.sub (1.7): Updated.
+
+2002-02-25 Monday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.124), Row.cc (1.27), Row.defs.hh (1.26):
+ Row::first(), Row::last(), Row::next() and Row::prev() are gone.
+
+2002-02-25 Monday 13:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/conversion.cc (1.22): Started polishing comments. Avoided
+ swapping rows with themselves. A few other tiny improvements.
+
+2002-02-25 Monday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: addconstraints10.cc (1.2), addconstraints11.cc (1.2),
+ addconstraints2.cc (1.7), addconstraints4.cc (1.2),
+ addconstraints5.cc (1.2), addconstraints6.cc (1.2),
+ addconstraints7.cc (1.2), addconstraints8.cc (1.2),
+ addconstraints9.cc (1.2), adddimensions1.cc (1.3),
+ adddimensions2.cc (1.2), adddimensions3.cc (1.2),
+ adddimensions4.cc (1.2), addgenerators1.cc (1.3),
+ addgenerators2.cc (1.3), addgenerators3.cc (1.2),
+ addgenerators4.cc (1.2), addgenerators5.cc (1.2),
+ addgenerators6.cc (1.2), affineimage2.cc (1.2),
+ affinepreimage1.cc (1.2), affinepreimage2.cc (1.2),
+ affinepreimage4.cc (1.2), affinetrans.cc (1.7),
+ convexdifference1.cc (1.5), convexhull1.cc (1.3), convexhull2.cc
+ (1.2), convexhull3.cc (1.2), error18.cc (1.2), error20.cc (1.2),
+ error21.cc (1.2), error25.cc (1.2), error26.cc (1.2), error27.cc
+ (1.2), error6.cc (1.3), error7.cc (1.2), error9.cc (1.2),
+ includes1.cc (1.4), includes2.cc (1.2), includes3.cc (1.2),
+ includes4.cc (1.2), inters3.cc (1.3), inters4.cc (1.2),
+ inters5.cc (1.2), inters6.cc (1.2), permute.cc (1.13), print.hh
+ (1.5), removedim3.cc (1.3), removedim4.cc (1.3), removedim5.cc
+ (1.2), removedim6.cc (1.2), satisfies1.cc (1.5), satisfies2.cc
+ (1.2), satisfies3.cc (1.2): Started putting some order in the way
+ results are returned how objects are built, and how we print
+ things in NOISY mode. While at it, a zillion of trailing blanks
+ have been removed.
+
+2002-02-25 Monday 12:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.cc (1.15): Unwanted change retracted.
+
+2002-02-25 Monday 11:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.31), Constraint.cc (1.14),
+ Constraint.defs.hh (1.31), GenSys.defs.hh (1.42),
+ Generator.defs.hh (1.36), Makefile.am (1.24),
+ ppl_filter_doxygen.sed (1.1), ppl_filter_install.sed (1.1): Now
+ PPL_INTERNAL means `private' everywhere we are not compiling the
+ library itself. PPL_HIDDEN, instead, is `private' only to keep
+ doxygen from including documentation that is not for the user.
+
+2002-02-25 Monday 10:02 Elisa Ricci
+
+ * tests/: Makefile.am (1.42), addconstraints10.cc (1.1),
+ addconstraints11.cc (1.1), addconstraints4.cc (1.1),
+ addconstraints5.cc (1.1), addconstraints6.cc (1.1),
+ addconstraints7.cc (1.1), addconstraints8.cc (1.1),
+ addconstraints9.cc (1.1), adddimensions2.cc (1.1),
+ adddimensions3.cc (1.1), adddimensions4.cc (1.1),
+ addgenerators3.cc (1.1), addgenerators4.cc (1.1),
+ addgenerators5.cc (1.1), addgenerators6.cc (1.1), affineimage2.cc
+ (1.1), affinepreimage1.cc (1.1), affinepreimage2.cc (1.1),
+ affinepreimage3.cc (1.1), affinepreimage4.cc (1.1),
+ convexhull2.cc (1.1), convexhull3.cc (1.1), error10.cc (1.1),
+ error11.cc (1.1), error12.cc (1.1), error13.cc (1.1), error14.cc
+ (1.1), error15.cc (1.1), error16.cc (1.1), error17.cc (1.1),
+ error18.cc (1.1), error19.cc (1.1), error20.cc (1.1), error21.cc
+ (1.1), error22.cc (1.1), error23.cc (1.1), error24.cc (1.1),
+ error25.cc (1.1), error26.cc (1.1), error27.cc (1.1), error6.cc
+ (1.2), error7.cc (1.1), error8.cc (1.1), error9.cc (1.1),
+ includes2.cc (1.1), includes3.cc (1.1), includes4.cc (1.1),
+ inters4.cc (1.1), inters5.cc (1.1), inters6.cc (1.1),
+ removedim5.cc (1.1), removedim6.cc (1.1), satisfies2.cc (1.1),
+ satisfies3.cc (1.1), universe1.cc (1.1), universe2.cc (1.1),
+ universe3.cc (1.1), universe4.cc (1.1), universe5.cc (1.1): Added
+ new tests for the functions of the Polyhedron class.
+
+2002-02-25 Monday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/conversion.cc (1.21): Two kludges (with FIXME) to continue
+ supporting GCC 2.96.
+
+2002-02-25 Monday 08:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.14): Minor typos fixed.
+
+2002-02-25 Monday 08:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.13): Add CIAO Prolog to
+ the list of (to be) supported systems and sort the list of
+ prologs alphabetically.
+
+2002-02-25 Monday 01:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.30), Generator.defs.hh (1.35): Added
+ examples on the use of methods coefficient(v), coefficient() and
+ divisor(), as well as (en passant) the method Generator::type().
+
+2002-02-25 Monday 00:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Row.defs.hh (1.25): Added comments to methods first(),
+ last(), next(...) and prev(...).
+
+2002-02-24 Sunday 22:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: addconstraints2.cc (1.6), includes1.cc (1.3),
+ satisfies1.cc (1.4): Do not use private methods.
+
+2002-02-24 Sunday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Init.cc (1.1), Init.defs.hh (1.1), Init.inlines.hh (1.1),
+ Init.types.hh (1.1), Makefile.am (1.23), Row.cc (1.26),
+ conversion.cc (1.20), globals.cc (1.3), globals.hh (1.8),
+ initializer.hh (1.1): New standard compliant mechanism for the
+ library initialization and finalization. New implementation for
+ tmp_Integer (worth a speedup greater than 3%).
+
+2002-02-24 Sunday 19:31 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/SatRow.inlines.hh (1.9): Spurious space in comment removed.
+
+2002-02-24 Sunday 19:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc (1.16): Using function
+ all_homogeneous_terms_are_zero() when building a ray or line to
+ check their validity.
+
+2002-02-24 Sunday 19:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.inlines.hh (1.17): Throwing an exception if
+ Generator::coefficient(v) is called with a variable beyond the
+ space-dimension.
+
+2002-02-24 Sunday 19:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.inlines.hh (1.16): We now throw an exception if
+ Constraint::coefficient(v) is called with a variable which is
+ beyond the current space-dimension.
+
+2002-02-24 Sunday 19:25 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.123): Many comments adjusted. We now use the
+ BE_LAZY flag in Polyhedron::operator<=, where we do not
+ necessarily minimize given arguments.
+
+2002-02-24 Sunday 19:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.30): Using "satisfy" instead of "verify" when
+ talking about the relation between a generator and a constraint.
+
+2002-02-24 Sunday 12:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.13), README (1.9), configure.ac (1.24),
+ doc/Makefile.am (1.15), doc/definitions.dox (1.35),
+ interfaces/Makefile.am (1.2), interfaces/Prolog/Makefile.am
+ (1.3), interfaces/Prolog/SICStus/Makefile.am (1.9),
+ interfaces/Prolog/SICStus/clpq.pl (1.26),
+ interfaces/Prolog/SICStus/clpq2.pl (1.2),
+ interfaces/Prolog/SICStus/expected (1.3), m4/Makefile.am (1.4),
+ m4/ac_check_gmp.m4 (1.2), src/ConSys.cc (1.22),
+ src/ConSys.defs.hh (1.30), src/ConSys.inlines.hh (1.11),
+ src/ConSys.types.hh (1.2), src/Constraint.cc (1.13),
+ src/Constraint.defs.hh (1.29), src/Constraint.inlines.hh (1.15),
+ src/Constraint.types.hh (1.2), src/GenSys.cc (1.29),
+ src/GenSys.defs.hh (1.41), src/GenSys.inlines.hh (1.11),
+ src/GenSys.types.hh (1.2), src/Generator.cc (1.15),
+ src/Generator.defs.hh (1.34), src/Generator.inlines.hh (1.16),
+ src/Generator.types.hh (1.2), src/Integer.cc (1.2),
+ src/Integer.defs.hh (1.2), src/Integer.inlines.hh (1.2),
+ src/Integer.types.hh (1.2), src/LinExpression.cc (1.9),
+ src/LinExpression.defs.hh (1.22), src/LinExpression.inlines.hh
+ (1.10), src/LinExpression.types.hh (1.2), src/Makefile.am (1.22),
+ src/Matrix.cc (1.27), src/Matrix.defs.hh (1.15),
+ src/Matrix.inlines.hh (1.14), src/Matrix.types.hh (1.2),
+ src/Polyhedron.cc (1.122), src/Polyhedron.defs.hh (1.75),
+ src/Polyhedron.inlines.hh (1.15), src/Polyhedron.types.hh (1.2),
+ src/Row.cc (1.25), src/Row.defs.hh (1.24), src/Row.inlines.hh
+ (1.9), src/Row.types.hh (1.2), src/SatMatrix.cc (1.11),
+ src/SatMatrix.defs.hh (1.12), src/SatMatrix.inlines.hh (1.7),
+ src/SatMatrix.types.hh (1.2), src/SatRow.cc (1.5),
+ src/SatRow.defs.hh (1.9), src/SatRow.inlines.hh (1.8),
+ src/SatRow.types.hh (1.2), src/Status.cc (1.9),
+ src/Status.defs.hh (1.11), src/Status.inlines.hh (1.5),
+ src/Status.types.hh (1.2), src/Variable.cc (1.4),
+ src/Variable.defs.hh (1.11), src/Variable.inlines.hh (1.5),
+ src/Variable.types.hh (1.2), src/conversion.cc (1.19),
+ src/globals.hh (1.7), src/minimize.cc (1.10), src/ppl_header.top
+ (1.3), src/simplify.cc (1.10), tests/Makefile.am (1.41),
+ tests/addconstraints1.cc (1.3), tests/addconstraints2.cc (1.5),
+ tests/addconstraints3.cc (1.2), tests/adddimensions1.cc (1.2),
+ tests/addgenerators1.cc (1.2), tests/addgenerators2.cc (1.2),
+ tests/affineimage1.cc (1.2), tests/affinetrans.cc (1.6),
+ tests/append1.cc (1.8), tests/append2.cc (1.9),
+ tests/convexdifference1.cc (1.4), tests/convexhull1.cc (1.2),
+ tests/ehandlers.hh (1.3), tests/empty1.cc (1.6), tests/error1.cc
+ (1.7), tests/error2.cc (1.9), tests/error3.cc (1.9),
+ tests/error4.cc (1.4), tests/error5.cc (1.5), tests/includes1.cc
+ (1.2), tests/inters1.cc (1.8), tests/inters2.cc (1.10),
+ tests/inters3.cc (1.2), tests/limitedwidening1.cc (1.4),
+ tests/limitedwidening2.cc (1.3), tests/onepoint.cc (1.2),
+ tests/permute.cc (1.12), tests/randchull1.cc (1.10),
+ tests/removedim1.cc (1.3), tests/removedim2.cc (1.6),
+ tests/removedim3.cc (1.2), tests/removedim4.cc (1.2),
+ tests/satisfies1.cc (1.3), tests/smm1.cc (1.2), doc/devref.tex
+ (1.7), doc/user.tex (1.8): Copyright year bumped.
+
+2002-02-23 Saturday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/convexdifference1.cc (1.3): Do not be noisy.
+
+2002-02-23 Saturday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.121), tests/convexdifference1.cc (1.2):
+ Polyhedron::convex_difference_assign() fixed.
+
+2002-02-23 Saturday 16:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.120): Method
+ Polyhedron::convex_diffrence_assign corrected. The new version
+ forces the result to be a _closed_ polyhedron.
+
+2002-02-23 Saturday 14:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.8), src/Polyhedron.cc (1.119), src/Polyhedron.defs.hh
+ (1.74), tests/Makefile.am (1.40), tests/convexdifference1.cc
+ (1.1): New methods Polyhedron::convex_difference_assign(const
+ Polyhedron&) and
+ Polyhedron::convex_difference_assign_and_minimize(const
+ Polyhedron&). They assigns to *this the convex hull of the
+ set-theoretic difference of *this and the argument (possibly non
+ minimized or minimized, respectively).
+ Polyhedron::convex_hull_assign() was missing the final
+ assert(OK()).
+
+2002-02-22 Friday 22:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.7), src/Polyhedron.cc (1.118), src/Polyhedron.defs.hh
+ (1.73), tests/limitedwidening1.cc (1.3),
+ tests/limitedwidening2.cc (1.2):
+ Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+ was erroneously returning a (random) boolean: it is now a void
+ method.
+
+2002-02-22 Friday 19:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.39), limitedwidening2.cc (1.1): New test
+ to check that the case where the passed constraint system is
+ inconsistent with respect to the widened polyhedron. Note: it
+ currently fails, since Polyhedron::limited_widening_assign() is
+ buggy, as it is now.
+
+2002-02-22 Friday 19:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/limitedwidening1.cc (1.2): Improved: now we check also the
+ returned boolean.
+
+2002-02-22 Friday 19:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/print.hh (1.4): New functions to print the constraints and
+ the generators.
+
+2002-02-22 Friday 19:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.117): Readability improvements to
+ Polyhedron::limited_widening_assign().
+
+2002-02-22 Friday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.116): Slightly optimized operator <=(const
+ Polyhedron& x, const Polyhedron& y).
+
+2002-02-22 Friday 08:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.6): Updated for release 0.3.
+
+2002-02-20 Wednesday 19:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.5): Updated.
+
+2002-02-20 Wednesday 13:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.115): In Polyhedron::add_constraints(ConSys&
+ cs), turned on the BE_LAZY version which does not sort matrices
+ and does not perform unnecessary copies.
+
+2002-02-17 Sunday 23:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/satisfies1.cc (1.2): Avoid a compiler warning when NOISY is
+ 0.
+
+2002-02-17 Sunday 21:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * acinclude.m4 (1.2), configure.ac (1.23),
+ interfaces/Prolog/SICStus/Makefile.am (1.8), m4/Makefile.am
+ (1.3), m4/ac_check_gmp.m4 (1.1), m4/ac_check_gmp_exceptions.m4
+ (1.3), m4/ac_check_have_gmp.m4 (1.3), tests/Makefile.am (1.38):
+ GMP configuration machinery rewritten (this should help people
+ trying to build the PPL under CygWin).
+
+2002-02-15 Friday 16:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bug6.dat (positive.2): This is the correct test data.
+
+2002-02-15 Friday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: bug1.cc, bug2.cc, bug3.cc, bug4.cc, bug5.cc, bug6.cc
+ (positive.[3,2,2,2,2,2]): All the invocations of Polyhedron::OK()
+ were misplaced.
+
+2002-02-15 Friday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug6.cc, bug6.dat (positive.[7,1,1]): bug6
+ shows that problems minimizations problems persist.
+
+2002-02-14 Thursday 14:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.22), src/Integer.cc (1.1), src/Integer.defs.hh
+ (1.1), src/Integer.inlines.hh (1.1), src/Integer.types.hh (1.1),
+ src/Makefile.am (1.21): Integer stuff moved up one level.
+
+2002-02-14 Thursday 13:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.37), affine_image1.cc (1.2),
+ affineimage1.cc (1.1): For consistency, affine_image1.cc has been
+ renamed affineimage1.cc.
+
+2002-02-14 Thursday 13:17 Elisa Ricci
+
+ * tests/: Makefile.am (1.36), adddimensions1.cc (1.1),
+ convexhull1.cc (1.1), inters3.cc (1.1), limitedwidening1.cc
+ (1.1), removedim4.cc (1.1): Added tests for the functions
+ Polyhedron::add_dimensions_and_project(),
+ Polyhedron::convex_hull_assign(),
+ Polyhedron::intersection_assign(),
+ Polyhedron::limited_widening_assign() and
+ Polyhedron::remove_higher_dimensions().
+
+2002-02-14 Thursday 11:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.114): Added comments regarding the handling
+ of the `sorted' flag in methods remove_dimensions and
+ remove_higher_dimensions.
+
+2002-02-14 Thursday 11:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.cc (1.28): In method remove_invalid_lines_and_rays(),
+ we do not need to keep the generators sorted (this saves
+ efficiency, since we were always calling it with a possibly
+ non-sorted system). Using remove_invalid_lines_and_rays() in
+ affine_image.
+
+2002-02-14 Thursday 10:04 Elisa Ricci
+
+ * src/Generator.cc (1.14): Changed the error message and the
+ comment in function Generator::OK().
+
+2002-02-14 Thursday 09:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.27), Polyhedron.cc (1.113): Avoiding all
+ shadowing of the space_dim member of a Polyhedron. Now using the
+ accessor Polyhedron::space_dimension() only when needed. Fixed a
+ few comments.
+
+2002-02-14 Thursday 09:37 Elisa Ricci
+
+ * src/Polyhedron.cc (1.112), tests/Makefile.am (1.35),
+ tests/includes1.cc (1.1): Erased the abort() at the end of
+ function Polyhedron::includes(g) and added a test for this
+ function.
+
+2002-02-13 Wednesday 23:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.21): Bump version number.
+
+2002-02-13 Wednesday 23:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.26), GenSys.defs.hh (1.40): Overload the
+ output operator for GenSys_Con_Rel.
+
+2002-02-13 Wednesday 23:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.34), affine_image1.cc (1.1), satisfies1.cc
+ (1.1): New test programs.
+
+2002-02-13 Wednesday 19:08 Elisa Ricci
+
+ * src/: GenSys.cc (1.25), Polyhedron.cc (1.111): Modified the
+ function Polyhedron::satisfies(...). In function
+ GenSys::affine_image(...) we erase the rows that have all the
+ terms equal to zero.
+
+2002-02-13 Wednesday 12:07 Elisa Ricci
+
+ * src/minimize.cc (positive.7): In functions minimize() and
+ add_and_minimize(), to obtain the system of constraints in the
+ case !con_to_gen now we use conversion().
+
+2002-02-12 Tuesday 15:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug5.cc, bug5.dat (positive.[6,1,1]): bug5
+ shows that we still have problems with minimization.
+
+2002-02-12 Tuesday 10:10 Elisa Ricci
+
+ * src/minimize.cc (positive.6): We must simplify also `dest' in
+ function minimize to erase all redundant constraints in the case
+ !con_to_gen. In functions minimize() and add_and_minimize(), in
+ the case !con_to_gen, there was an error when we choose the
+ constraints to erase.
+
+2002-02-11 Monday 12:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug4.cc, bug4.dat (positive.[5,1,1]): bug4
+ shows that we still have minimization problems.
+
+2002-02-11 Monday 11:49 Elisa Ricci
+
+ * src/minimize.cc (positive.5): In function add_and_minimize, we
+ must simplify `dest' in the case !con_to_gen because it can
+ contain redundant constraints.
+
+2002-02-11 Monday 10:57 Elisa Ricci
+
+ * src/: conversion.cc, minimize.cc, simplify.cc (positive.[3,4,3]):
+ In function add_and_minimize and in the case of !con_to_gen, the
+ system of constraints (that in this case is `dest') must contain
+ the constraints of positivity of variables. In minimize and
+ add_and_minimize, we must erase the constraints that are a linear
+ combination of an equality and a constraint of positivity of
+ variables.
+
+2002-02-09 Saturday 07:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (positive.4): Error message made more specific.
+
+2002-02-07 Thursday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug3.cc, bug3.dat (positive.[4,1,1]): bug3
+ shows that Polyhedron::minimize() does not minimize.
+
+2002-02-07 Thursday 14:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatMatrix.cc, SatMatrix.inlines.hh (positive.[1,1]):
+ SatMatrix::columns_erase_to_end() fixed (and no longer inline).
+
+2002-02-07 Thursday 12:25 Elisa Ricci
+
+ * src/: Row.cc, minimize.cc (positive.[3,3]): Corrected an error in
+ the function Row::only_a_term_is_positive(). In minimize and in
+ the case !con_to_gen we must call simplify() also for the `dest'
+ because there is the possibility that constraints that are
+ redundant with the constraints of positivity of variables are
+ present in dest.
+
+2002-02-06 Wednesday 08:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug2.cc, bug2.dat (positive.[3,1,1]): bug2
+ shows another problem this time cropping up in
+ SatMatrix::columns_erase_to_end().
+
+2002-02-06 Wednesday 08:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/bug1.cc (positive.2): Assert that the input polyhedra are
+ OK.
+
+2002-02-06 Wednesday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.110): Error messages improved.
+
+2002-02-05 Tuesday 22:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am, bug1.cc, bug1.dat (positive.[2,1,1]): bug1
+ shows a problem with
+ Polyhedron::convex_hull_assign_and_minimize().
+
+2002-02-05 Tuesday 22:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (positive.3): The input operator now handles
+ the `positive' flag.
+
+2002-02-05 Tuesday 16:02 Elisa Ricci
+
+ * src/Matrix.cc, src/Matrix.defs.hh, src/Polyhedron.cc,
+ src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh, src/Row.cc,
+ src/Row.defs.hh, src/conversion.cc, src/minimize.cc,
+ src/simplify.cc, tests/Makefile.am, tests/addconstraints1.cc,
+ tests/addconstraints2.cc, tests/addconstraints3.cc,
+ tests/addgenerators1.cc, tests/addgenerators2.cc,
+ tests/affinetrans.cc, tests/append1.cc, tests/append2.cc,
+ tests/empty1.cc, tests/error2.cc, tests/error3.cc,
+ tests/error4.cc, tests/error5.cc, tests/error6.cc,
+ tests/inters1.cc, tests/inters2.cc, tests/onepoint.cc,
+ tests/permute.cc, tests/randchull1.cc, tests/removedim1.cc,
+ tests/removedim2.cc, tests/removedim3.cc, tests/smm1.cc
+ (positive.[1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Considered the case of a positive poited cone (i.e. a polyhedron
+ composed by points that satisfies the constraints of positivity
+ of all variables). Added a test that shows that we can not add
+ or insert a line in a positive pointed cone. All the tests use
+ positive pointed cones.
+
+2002-02-04 Monday 22:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.109): More concise usage of stringstreams.
+
+2002-02-03 Sunday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.6), config.sub (1.6): Updated.
+
+2002-02-01 Friday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh,
+ Row.cc, Row.defs.hh, conversion.cc, minimize.cc, simplify.cc
+ (positive.[1,1,1,1,1,1,1,1]): The work on positive polyhedra is
+ being moved onto the `positive' branch. Phase 2: latest changes
+ reapplied on the branch.
+
+2002-02-01 Friday 15:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.108), Polyhedron.defs.hh (1.72),
+ Polyhedron.inlines.hh (1.14), Row.cc (1.24), Row.defs.hh (1.23),
+ conversion.cc (1.18), minimize.cc (1.9), simplify.cc (1.9): The
+ work on positive polyhedra is being moved onto the `positive'
+ branch. Phase 1: latest changes undone.
+
+2002-01-31 Thursday 08:35 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.107), Polyhedron.defs.hh (1.71),
+ Polyhedron.inlines.hh (1.13), Row.cc (1.23), Row.defs.hh (1.22),
+ conversion.cc (1.17), minimize.cc (1.8), simplify.cc (1.8):
+ Started to consider the case of positive polyhedra: this part is
+ controlled by POSITIVE.
+
+2002-01-29 Tuesday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.20): Tell the user how to configure GMP.
+
+2002-01-29 Tuesday 15:41 Elisa Ricci
+
+ * src/Polyhedron.cc (1.106): In function
+ Polyhedron::remove_higher_dimensions, erased the command `size_t
+ space_dim = space_dimension()' because it caused a problem.
+
+2002-01-29 Tuesday 11:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.19), interfaces/Prolog/SICStus/ppl_sicstus.cc
+ (1.28), m4/ac_check_gmp_exceptions.m4 (1.2),
+ m4/ac_check_have_gmp.m4 (1.2), src/Constraint.cc (1.12),
+ src/Constraint.inlines.hh (1.14), src/Generator.cc (1.13),
+ src/Generator.defs.hh (1.33), src/LinExpression.cc (1.8),
+ src/LinExpression.inlines.hh (1.9), src/Matrix.cc (1.26),
+ src/Matrix.inlines.hh (1.13), src/Polyhedron.defs.hh (1.70),
+ src/Row.cc (1.22), src/Row.defs.hh (1.21), src/conversion.cc
+ (1.16), src/globals.hh (1.6), tests/randchull1.cc (1.9): We now
+ use the integer C++ class of GMP, instead of baking our own.
+ Note: we now require GMP 4.0.1 or higher.
+
+2002-01-29 Tuesday 08:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.20): Finish backing out the unwanted commit.
+
+2002-01-29 Tuesday 08:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.105): Better formatting for error messages.
+
+2002-01-29 Tuesday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.11), Constraint.inlines.hh (1.13),
+ Generator.cc (1.12), Generator.defs.hh (1.32), LinExpression.cc
+ (1.7), LinExpression.inlines.hh (1.8), Matrix.cc (1.25),
+ Matrix.defs.hh (1.14), Matrix.inlines.hh (1.12), Polyhedron.cc
+ (1.104), Polyhedron.defs.hh (1.69), Row.cc (1.21), Row.defs.hh
+ (1.20), conversion.cc (1.15), globals.hh (1.5): Back out previous
+ commit.
+
+2002-01-29 Tuesday 08:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.10), Constraint.inlines.hh (1.12),
+ Generator.cc (1.11), Generator.defs.hh (1.31), LinExpression.cc
+ (1.6), LinExpression.inlines.hh (1.7), Makefile.am (1.19),
+ Matrix.cc (1.24), Matrix.defs.hh (1.13), Matrix.inlines.hh
+ (1.11), Polyhedron.cc (1.103), Polyhedron.defs.hh (1.68), Row.cc
+ (1.20), Row.defs.hh (1.19), conversion.cc (1.14), globals.hh
+ (1.4): Better formatting for error messages.
+
+2002-01-29 Tuesday 07:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.27): Fix a couple of
+ namespace and include file glitches.
+
+2002-01-27 Sunday 22:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.18), ppl.spec.in (1.7), doc/Makefile.am (1.14),
+ interfaces/Prolog/SICStus/Makefile.am (1.7), src/Makefile.am
+ (1.18), tests/Makefile.am (1.33): The move to libtool is
+ complete: we can now build and distribute (with, e.g., RPM)
+ static and dynamic versions of the library.
+
+2002-01-27 Sunday 17:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.12), configure.ac (1.17), ltmain.sh (1.1): Start
+ to migrate to libtool.
+
+2002-01-27 Sunday 15:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.28): Fixed a typo in a (documentation)
+ comment.
+
+2002-01-19 Saturday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.29), ConSys.inlines.hh (1.10),
+ GenSys.defs.hh (1.39), GenSys.inlines.hh (1.10): ConSys and
+ GenSys were both missing the assignment operator.
+
+2002-01-14 Monday 08:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.5), config.sub (1.5): Updated.
+
+2001-12-23 Sunday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.19): Include maxmin.hh.
+
+2001-12-20 Thursday 09:21 Elisa Ricci
+
+ * src/Polyhedron.cc (1.102): Modified the part of function
+ Polyhedron::add_constraints(cs) that is controlled by "#if 0":
+ used Matrix::grow(size_t, size_t) instead of resize(size_t,
+ size_t) and swap instead of "=", where it is possible.
+
+2001-12-15 Saturday 11:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.6): Distribute also
+ clpq2.pl.
+
+2001-12-15 Saturday 11:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.23), Polyhedron.cc (1.101), conversion.cc
+ (1.13): Some comments fixed.
+
+2001-12-14 Friday 16:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/smmdiff.clpq (1.1): smmdiff.clpq is
+ based on smm.clpq and solves the classic send-more-money problem
+ so that each variable is bound to a unique number.
+
+2001-12-14 Friday 16:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq2.pl (1.1): clpq2.pl is an
+ alternative meta-interpreter with some extra features, including
+ disjunction.
+
+2001-12-13 Thursday 16:52 Elisa Ricci
+
+ * tests/: Makefile.am (1.32), addgenerators1.cc (1.1),
+ addgenerators2.cc (1.1): Added a test for the function
+ Polyhedron::add_generators_and_minimize(gs) and one for the
+ function Polyhedron::add_generators(gs).
+
+2001-12-13 Thursday 16:50 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.100), Polyhedron.defs.hh (1.67): The
+ function Polyhedron::add_generators(gs) now is called
+ Polyhedron::add_generators_and_minimize(gs). Added the function
+ Polyhedron::add_generators(gs) that adds the system of generators
+ "gs" to the polyhedron without minimizing the resulting
+ polyhedron.
+
+2001-12-13 Thursday 11:35 Elisa Ricci
+
+ * src/Polyhedron.cc (1.99): In functions
+ Polyhedron::add_constraints() and add_constraints_and_minimize()
+ improved the comments for the case of a zero-dimensional
+ polyhedron.
+
+2001-12-13 Thursday 08:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.98): Some comments have been improved.
+
+2001-12-12 Wednesday 18:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.31), bug1.cc (1.2), bug2.cc (1.2):
+ Obsolete bug witnesses removed.
+
+2001-12-12 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.30), addconstraints3.cc (1.1): New test.
+
+2001-12-12 Wednesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.10), Generator.defs.hh (1.30),
+ LinExpression.defs.hh (1.21), Matrix.cc (1.22), Polyhedron.cc
+ (1.97), Polyhedron.defs.hh (1.66), Polyhedron.inlines.hh (1.12),
+ Row.cc (1.18), Row.defs.hh (1.18), conversion.cc (1.12),
+ minimize.cc (1.7), simplify.cc (1.7): Kill trailing blanks.
+
+2001-12-12 Wednesday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Row.cc (1.17): The function compare(const Row& x, const Row&
+ y) can now compare rows of different size.
+
+2001-12-12 Wednesday 17:16 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.96), Polyhedron.inlines.hh (1.11): The
+ function Polyhedron::set_zero_dim_univ() is now in Polyhedron.cc
+ (instead of Polyhedron.inlines.hh), says that a zero-dimensional
+ polyhedron is in a 0-dimensional space and clears the system of
+ the polyhedron. Used "space_dim" instead of "space_dimension()"
+ (where we call this function many times).
+
+2001-12-12 Wednesday 14:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.95): Some minor improvements.
+
+2001-12-11 Tuesday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.94): Bad uses of the negation operator `!'
+ have been fixed. Some comments improved.
+
+2001-12-11 Tuesday 19:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatMatrix.cc (1.10), SatMatrix.defs.hh (1.11): Wrong
+ comments fixed.
+
+2001-12-11 Tuesday 19:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatMatrix.defs.hh (1.10): Spurious declarations removed: two
+ methods were declared and never used nor implemented.
+
+2001-12-11 Tuesday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.12), Matrix.inlines.hh (1.10): Comments
+ for Matrix::clear() adjusted.
+
+2001-12-11 Tuesday 18:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: SatMatrix.cc (1.9), SatMatrix.defs.hh (1.9),
+ SatMatrix.inlines.hh (1.6): SatMatrix::clear() was complete
+ nonsense: rewritten.
+
+2001-12-11 Tuesday 17:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.inlines.hh (1.9): Matrix::clear() now releases as much
+ memory as possible.
+
+2001-12-11 Tuesday 16:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.6), user.tex (1.7): People that are no longer
+ contributing or willing to contribute take a back seat (will
+ simplify the publication of the documentation as a technical
+ report).
+
+2001-12-11 Tuesday 11:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatRow.inlines.hh (1.7): Much more efficient (and concise)
+ implementation for SatRow::clear_from().
+
+2001-12-11 Tuesday 10:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.93), Polyhedron.defs.hh (1.65): Comments
+ added for Polyhedron::remove_higher_dimensions().
+
+2001-12-11 Tuesday 09:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.92): Polyhedron::Polyhedron(ConSys& cs)
+ improved.
+
+2001-12-11 Tuesday 00:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.21), Matrix.defs.hh (1.11): Always compile
+ Matrix::check_sorted(). Matrix::OK() fixed: the symbols `cerr'
+ and `endl' live in the `std' namespace.
+
+2001-12-11 Tuesday 00:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.20), Matrix.inlines.hh (1.8), Polyhedron.cc
+ (1.91): A default-constructed (empty) Matrix is now declared as
+ sorted. Matrix::grow() was not handling the `sorted' flag
+ correctly: fixed. Matrix::add_zero_columns() is now an inline
+ method. Matrix::OK() now checks that the `sorted' flag is set
+ only if the matrix is actually sorted.
+ Matrix::add_rows_and_columns() now asserts OK() before returning.
+ Some comments fixed.
+
+2001-12-10 Monday 16:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatMatrix.cc (1.8): SatMatrix::resize() was not shrinking the
+ matrix when requested to do so: fixed.
+
+2001-12-10 Monday 12:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatMatrix.cc (1.7): Added speculative memory allocation for
+ SatMatrix.
+
+2001-12-10 Monday 08:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.90), Row.defs.hh (1.17): Some comments
+ have been fixed.
+
+2001-12-09 Sunday 11:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.16): Bump version number so as to avoid
+ confusion.
+
+2001-12-08 Saturday 10:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/expected (1.2), src/Row.defs.hh (1.16):
+ EXTRA_NORMALIZATION defaults to 0. Expected outcome from the
+ clpq test updated.
+
+2001-12-05 Wednesday 18:58 Elisa Ricci
+
+ * src/: ConSys.cc (1.21), GenSys.cc (1.24), Matrix.cc (1.19),
+ Matrix.defs.hh (1.10), Polyhedron.cc (1.89), Row.cc (1.16),
+ Row.defs.hh (1.15), conversion.cc (1.11): The method
+ Row::normalize() has been restored so that it only ensures
+ coefficients are mutually prime. The new method
+ Row::strong_normalize() also ensures that the first non-zero
+ coefficient of lines and equalities is negative. The new method
+ Matrix::strong_normalize() that calls strongly normalizes each
+ row. Strong normalization is now used wherever it is guaranteed
+ to be both safe and efficient. The "EXTRA_NORMALIZATION" flag is
+ used to decide whether strong_normalization is also used in
+ Row::libear_combine() (since in this case strong normalization
+ can incur performance penalties).
+
+2001-12-03 Monday 09:16 Elisa Ricci
+
+ * src/Row.cc (1.15): Changed the function Row::normalize() so that
+ the first coefficient different from zero is negative (and not
+ positive).
+
+2001-12-02 Sunday 16:09 Elisa Ricci
+
+ * src/: Matrix.cc (1.18), Polyhedron.cc (1.88), Row.cc (1.14): In
+ Polyhedron::intersection_assign_and_minimize added the assertion
+ to verify if the resulting polyhedron is OK. In function
+ Row::normalize() if we normalize an equality or a line, we decide
+ that the first element of the corresponding row is positive. In
+ function Matrix::back_substitute(), if we call linear_combine
+ with an equality and an inequality, we must change the
+ coefficients of the equality so that the coefficient of the
+ inequality in the linear combination is non-negative.
+
+2001-11-26 Monday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.4), config.sub (1.4): Updated.
+
+2001-11-26 Monday 17:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.26): Typo fixed.
+
+2001-11-21 Wednesday 19:26 Elisa Ricci
+
+ * src/Polyhedron.cc (1.87): Changed the message of some exceptions:
+ where it is possible we use the functions
+ `throw_different_dimensions' and `throw_dimension_incompatible'.
+
+2001-11-20 Tuesday 20:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.25): End-of-line characters
+ left behind be read_term/2 are now eaten.
+
+2001-11-13 Tuesday 21:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.4): Updated.
+
+2001-11-13 Tuesday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.5): Mention that we have greatly improved the
+ documentation.
+
+2001-11-13 Tuesday 21:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.3): Updated.
+
+2001-11-13 Tuesday 21:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.12): Use `| ?-'
+ everywhere a goal is introduced.
+
+2001-11-13 Tuesday 21:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.11): `E.g.' and `i.e.'
+ must always be followed by comma. There are no exceptions to
+ this rule.
+
+2001-11-13 Tuesday 18:14 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.10): Documentation for
+ ppl_add_consraints_and _minimize and for ppl_copy_polyhedron
+ added. Two examples for ppl_insert_constraints added that
+ compare with examples for those for
+ ppl_add_consraints_and_minimize. Introductory sentence added.
+ "To be written" replaced by "Support for XXX ...future release."
+
+2001-11-13 Tuesday 17:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.8): Updated for release 0.2.
+
+2001-11-13 Tuesday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.15): Version number bumped to 0.2.
+
+2001-11-13 Tuesday 17:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.4): PPL 0.2 will be released on November 14, 2001.
+
+2001-11-13 Tuesday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.5): Packaging issues
+ solved.
+
+2001-11-13 Tuesday 15:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: Makefile.am (1.4), check_script
+ (1.1), expected (1.1): Use the meta-interpreter for `make check'.
+
+2001-11-13 Tuesday 15:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.24): reconsult(File) command
+ fixed.
+
+2001-11-13 Tuesday 15:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_check.pl (1.7): Gone, at last.
+
+2001-11-13 Tuesday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.23): Legalese added.
+
+2001-11-13 Tuesday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.22): Better support for
+ debugging. Now the `spy' command works as expected by most
+ Prolog users.
+
+2001-11-13 Tuesday 09:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/tak.clpq (1.1): New test program.
+
+2001-11-13 Tuesday 09:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ack.clpq (1.3), ackn.clpq (1.1):
+ ack.clpq is the original version whereas ackn.clpq is the
+ normalized version.
+
+2001-11-12 Monday 22:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.21): Fixed a bug whereby
+ original_goal_variables/1 was not retracted in some cases.
+ Multiple clauses for original_goal_variables/1 were causing the
+ use of already discarded polyhedra.
+
+2001-11-12 Monday 22:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.25): When compiled
+ with run-time assertions switched on, the interface now checks
+ that the Prolog caller is not messing around with Polyhedron's
+ addresses.
+
+2001-11-12 Monday 17:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.20): Use
+ ppl_add_constraints_and_minimize/2 instead of adding one
+ constraint at a time and then checking for emptiness.
+
+2001-11-12 Monday 17:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.24), ppl_sicstus.pl
+ (1.15): New interface predicate
+ ppl_add_constraints_and_minimize/2.
+
+2001-11-12 Monday 16:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.19): Fixed bug in
+ read_clauses/1: now unit clauses are read correctly.
+
+2001-11-12 Monday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.18): The meta-interpreter
+ core has been rewritten. Computed answer constraints are also
+ output in a readable way with variables named as in the original
+ goal.
+
+2001-11-12 Monday 16:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.9): General
+ improvements throughout the file.
+
+2001-11-12 Monday 09:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.8): A linear expression
+ for defining constraints or generators can only have integer
+ coefficients. Therefore division by a number is not allowed and
+ option removed from the grammar rules. Also a number can
+ multiply a PPL variable but not an arbitrary linear expression.
+
+2001-11-11 Sunday 18:19 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.3), config.sub (1.3): Updated.
+
+2001-11-11 Sunday 18:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/Makefile.am (1.3): Missing dependency
+ added: pplsp depends on the library. Do not assume `.' is in
+ PATH.
+
+2001-11-11 Sunday 17:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.27), Constraint.inlines.hh (1.11),
+ Generator.defs.hh (1.29), Generator.inlines.hh (1.15),
+ Row.defs.hh (1.14): std::swap() specialized both for Constraint
+ and Generator. Less verbose comments for such a simple
+ operation.
+
+2001-11-11 Sunday 17:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GenSys.cc (1.23): Spurious assertions removed.
+
+2001-11-11 Sunday 17:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.28), ConSys.inlines.hh (1.9), GenSys.cc
+ (1.22), GenSys.defs.hh (1.38), GenSys.inlines.hh (1.9):
+ ConSys::swap() and GenSys::swap() removed: they are inherited
+ from Matrix. GenSys::remove_invalid_lines_and_rays()
+ implemented.
+
+2001-11-11 Sunday 16:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: GenSys.cc (1.21), GenSys.defs.hh (1.37), Polyhedron.cc
+ (1.86): Use Constraint::trivial_true() and
+ Constraint::trivial_false(). Prepare to remove invalid line and
+ rays from a GenSys. This is necessary in the
+ Polyhedron::remove_...() methods.
+
+2001-11-11 Sunday 16:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.cc (1.20): Use Constraint::is_trivial_true().
+
+2001-11-11 Sunday 15:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.9), Generator.defs.hh (1.28): Added `bool
+ Generator::OK() const'.
+
+2001-11-11 Sunday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.cc (1.9), Constraint.defs.hh (1.26):
+ Constraint::is_trivial() renamed is_trivial_true().
+ Constraint::is_unsatisfiable() renamed is_trivial_false(). Both
+ now use Row::all_homogeneous_terms_are_zero().
+
+2001-11-11 Sunday 15:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Row.cc (1.13), Row.defs.hh (1.13): Added `bool
+ Row::all_homogeneous_terms_are_zero() const'.
+
+2001-11-11 Sunday 12:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.85): All other things being equal, prefer
+ pre-increment/decrement to post-increment/decrement.
+
+2001-11-10 Saturday 20:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: append1.cc (1.7), append2.cc (1.8), permute.cc (1.11):
+ Infamous relops are already neutralized in ppl_install.hh.
+
+2001-11-09 Friday 19:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.29), smm1.cc (1.1): New test program.
+
+2001-11-09 Friday 18:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.17): Now clpq.pl does not
+ require the lists module.
+
+2001-11-09 Friday 17:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.16): Now a vertex is
+ inserted before any lines or rays. This avoids a bug when
+ inserting generators into the empty polyhedron.
+
+2001-11-09 Friday 16:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.15): Now the interpreter
+ answers "yes" or "no". The listing/0 command has been improved.
+
+2001-11-09 Friday 15:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Matrix.cc (1.17), Matrix.defs.hh (1.9), Polyhedron.cc
+ (1.84), Row.cc (1.12), Row.defs.hh (1.12), conversion.cc (1.10):
+ Another go at smart memory allocation.
+
+2001-11-09 Friday 15:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/addconstraints2.cc (1.4): Catch standard exceptions.
+
+2001-11-09 Friday 14:22 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.7): Corrections and
+ improvements as suggested by Enea implemented. Other corrections
+ done and examples added.
+
+2001-11-09 Friday 13:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.14): Now there are no calls
+ to the ppl_convex_hull_assign operation. This version keeps the
+ list of generators and uses that to recover from failure paths.
+
+2001-11-09 Friday 08:48 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.13): Now many of the
+ unwanted temporary copies of polyhedra are deleted earlier.
+
+2001-11-08 Thursday 22:23 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.6): More detailed
+ specification of the interface predicates with many examples
+ added. Introduction includes grammar rules and list of some
+ important issues wrt using the PPL in Prolog.
+
+2001-11-08 Thursday 17:37 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.12): Each constraint output
+ on a new line.
+
+2001-11-08 Thursday 15:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.pl (1.14): Comment
+ containing documentation removed.
+
+2001-11-08 Thursday 15:30 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.11): The main polyhedron is
+ now deleted when solve(goal) fails.
+
+2001-11-08 Thursday 12:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.10): Unwanted polyhedra are
+ deleted now when calls to solve/7 fail.
+
+2001-11-08 Thursday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.16): Matrix::resize_no_copy() now deals with the
+ case where the vector of rows must be reallocated.
+
+2001-11-08 Thursday 10:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/Prolog_interface.dox (1.5): Detailed predicate
+ descriptions drafted for SICStus Prolog.
+
+2001-11-08 Thursday 08:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.9): Some improvements to the
+ efficiency by replacing calls to member/2 by member_check/2 and
+ by reducing the number of calls to ppl_check_empty. Also,
+ numbervars/3 replaced by numvars/3 defined within clpq.pl.
+
+2001-11-07 Wednesday 13:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.pl (1.13): First draft of
+ documentation for ppl_sicstus.pl the interface for Prolog.
+
+2001-11-07 Wednesday 11:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.8): This version tries to
+ reduce the amount of memory leakage between requests for more
+ solutions and between tests.
+
+2001-11-06 Tuesday 16:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.7): More small improvements
+ made.
+
+2001-11-06 Tuesday 16:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/: ack.clpq (1.2), clpq.pl (1.6):
+ clpq.pl: The comments have been corrected and some
+ simplifications to the code. ack.clpq: A bug in the second
+ clause corrected.
+
+2001-11-06 Tuesday 15:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.5): Temporary version. This
+ is working but needs commenting and further checking.
+
+2001-11-05 Monday 11:36 Elisa Ricci
+
+ * src/ConSys.cc (1.19), src/ConSys.defs.hh (1.27), src/GenSys.cc
+ (1.20), src/GenSys.defs.hh (1.36), src/Polyhedron.cc (1.83),
+ src/Polyhedron.defs.hh (1.64), tests/affinetrans.cc (1.5),
+ tests/error2.cc (1.8): Changed the name of some functions:
+ Polyhedron::assign_variable --> Polyhedron::affine_image
+ Polyhedron::substitute_variable --> Polyhedron::affine_preimage
+ GenSys::assign_variable --> GenSys::affine_image
+ ConSys::substitute_variable --> ConSys::affine_preimage The new
+ names are used in the examples and in the tests.
+
+2001-11-05 Monday 10:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/smm.clpq (1.1): A new example program.
+
+2001-11-05 Monday 09:57 Elisa Ricci
+
+ * src/Polyhedron.cc (1.82): At the end of the functions
+ Polyhedron::add_dimensions_and_project and
+ Polyhedron::add_dimensions_and_constraints, we can have an empty
+ polyhedron without the flag EMPTY sets: so, the assertion OK() is
+ modified not to verify if the system of constraints is
+ satisfiable.
+
+2001-11-05 Monday 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ack.clpq (1.1), fib.clpq (1.1),
+ mc91.clpq (1.1), sumto.clpq (1.1): Small programs to test
+ clpq.pl.
+
+2001-11-05 Monday 08:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.81): The final OK() assertion of
+ Polyhedron::add_dimensions_and_embed() has been modified so as to
+ allow for empty polyhedra. Needs checking. A similar analysis
+ must be conducted on Polyhedron::add_dimensions_and_project().
+
+2001-11-05 Monday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.4): Let `.clpq' be the
+ default extension.
+
+2001-11-05 Monday 07:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.17), Matrix.cc (1.15), Matrix.inlines.hh
+ (1.7), Row.defs.hh (1.11), Row.inlines.hh (1.8), globals.hh
+ (1.3): Speculative memory allocation is now completely
+ implemented. The function `size_t compute_capacity(size_t
+ requested_size)' is now in namespace scope, since it is used both
+ for Row's and for Matrix columns. Its current implementation
+ (2*(requested_size+1)) is to be considered experimental.
+
+2001-11-04 Sunday 22:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.34): Doxygen no longer causes a spurious
+ string of characters in the user manual.
+
+2001-11-04 Sunday 22:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.14): In Matrix(const Matrix& y) the right
+ row-capacity is computed for the copy.
+
+2001-11-04 Sunday 19:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.13): The methods Matrix::add_row(...) are now
+ careful with respect to reallocation of the `rows' vector. The
+ stage is now ready for speculative memory allocation.
+
+2001-11-04 Sunday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.25), Constraint.inlines.hh (1.10),
+ Polyhedron.cc (1.80): Added and used `const Constraint&
+ Constraint::zero_dim_positivity()'.
+
+2001-11-04 Sunday 15:59 Elisa Ricci
+
+ * src/Polyhedron.cc (1.79): In functions
+ Polyhedron::update_constraints and Polyhedron::update_generators
+ we only have a saturation matrix up-to-date: so, we must say that
+ the other is not up-to-date. In function
+ Polyhedron::assign_variable, if the transformation is not
+ invertible, we must have the system of generators up-to-date, and
+ then if the polyhedron is non-empty, we use the function
+ GenSys::assign_variable to find the resulting polyhedron. so, we
+ always modify the polyhedron (we do not modify the polyhedron if
+ it is empty or if there are dimensional problems).
+
+2001-11-04 Sunday 15:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.78): Polyhedron::remove_...() methods
+ improved.
+
+2001-11-04 Sunday 12:56 Elisa Ricci
+
+ * src/Matrix.cc (1.12): A wrong comment erased: it is not true that
+ the Row::linear_combine changes the flag `sorted' of the matrix.
+
+2001-11-04 Sunday 12:22 Elisa Ricci
+
+ * src/Polyhedron.cc (1.77): In functions
+ Polyhedron::assign_variable and Polyhedron::substitute_variable
+ we must clear the flags SAT_C_UP_TO_DATE and SAT_G_UP_TO_DATE,
+ because after the operations the polyhedron is changed.
+
+2001-11-04 Sunday 12:01 Elisa Ricci
+
+ * src/Matrix.cc (1.11): In function Matrix::gauss(), we change a
+ row without changing "changed" that indicates that the matrix is
+ changed: so the flag "sorted" of the matrix was true even if the
+ matrix was not sorted.
+
+2001-11-04 Sunday 10:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.23):
+ ppl_intersection_assign/2 calls
+ Polyhedron::intersection_assign().
+
+2001-11-04 Sunday 09:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.18), GenSys.cc (1.19), Makefile.am (1.16),
+ Matrix.cc (1.10), Matrix.defs.hh (1.8), Matrix.inlines.hh (1.6),
+ Polyhedron.cc (1.76), Row.cc (1.11), Row.defs.hh (1.10),
+ Row.inlines.hh (1.7), SatRow.inlines.hh (1.6), conversion.cc
+ (1.9), globals.cc (1.2), globals.hh (1.2), minimize.cc (1.6):
+ OK() methods changed to allow for ConSys and GenSys with a single
+ column.
+
+ Temporary Integer's now incapsulated into a function: the source
+ globals.cc is no longer necessary.
+
+ The funcionality of Matrix::compute_row_capacity() is now
+ provided by Row::compute_capacity().
+
+ Tracking of capacity improved (there are still several problems
+ though). Matrix::sort_rows() rewritten: the STL algorithms keep
+ the freedom of making copies of rows and we cannot accept that.
+
+ Temporaty kludges added to the Matrix::add_row() methods: if the
+ rows vector must grow, the implementation will copy the rows
+ changing their capacity. A proper solution to this problem must
+ be found.
+
+ OK() safety checks added tp Polyhedron::remove_dimensions() and
+ Polyhedron::remove_higher_dimensions().
+
+ Polyhedron::remove_dimensions() and
+ Polyhedron::remove_higher_dimensions() where not clearing the
+ "generators are minimized" flag. With this change the flag is
+ cleared a bit too often. A proper solution must be found.
+
+ Polyhedron::remove_dimensions() and
+ Polyhedron::remove_higher_dimensions() now use
+ Matrix::resize_no_copy() instead of Matrix::resize() in order to
+ shrink matrices.
+
+ Row::OK() added and used. When compiling with assertions each
+ rows brings its own capacity in the capacity_ flag. The
+ consistency of this information is checked by Row::OK() which, in
+ turn, is called by Matrix::OK() for each row of the matrix. For
+ internal use, the capacity_ field can be accessed by `size_t
+ Row::capacity() const'.
+
+ `void Row::assign(Row& y)' added to assign the implementation of
+ y to *this.
+
+ `std::iter_swap()' specialized both for vector<Row> and
+ vector<SatRow>.
+
+2001-11-04 Sunday 08:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.28), bug2.cc (1.1): bug2.cc shows a
+ problem whereby we do not correctly keep track of the status of
+ saturation matrices.
+
+2001-11-04 Sunday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.27), bug1.cc (1.1): bug1.cc shows a
+ problem with the tracking of matrix sortedness.
+
+2001-11-03 Saturday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/append1.cc (1.6): Two assertions added: they prove that
+ Polyhedron::remove_dimensions() is broken.
+
+2001-11-03 Saturday 13:49 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.26), GenSys.defs.hh (1.35): "no guarantee
+ at all" changed into "no guarantees" as suggested by Pat.
+
+2001-11-03 Saturday 10:45 Elisa Ricci
+
+ * src/Polyhedron.cc (1.75): In a comment correct an error: there
+ was "systemo" instead of "system".
+
+2001-11-03 Saturday 10:40 Elisa Ricci
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.22),
+ src/Polyhedron.cc (1.74), src/Polyhedron.defs.hh (1.63),
+ tests/inters1.cc (1.7), tests/inters2.cc (1.9): The function
+ Polyhedron::intersection_assign now is
+ Polyhedron::intersection_assign_and_minimize. Added a new
+ function Polyhedron::intersection_assign that computes the
+ intersection between x and y without minimizing the result.
+
+2001-11-02 Friday 17:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.3): Use
+ ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.21), ppl_sicstus.pl
+ (1.12): Added ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.73), Polyhedron.defs.hh (1.62): New method
+ drafted: void Polyhedron::remove_higher_dimensions(size_t
+ new_dimension).
+
+2001-11-02 Friday 17:22 Elisa Ricci
+
+ * src/Polyhedron.cc (1.72), src/Polyhedron.defs.hh (1.61),
+ tests/addconstraints1.cc (1.2), tests/append1.cc (1.5),
+ tests/append2.cc (1.7), tests/error3.cc (1.8), tests/permute.cc
+ (1.10): The Polyhedron::add_constraints now is
+ Polyhedron::add_constraints_and_minimize, while
+ Polyhedron::add_constraints_lazy now is only
+ Polyhedron::add_constraints. The Polyhedron::convex_hull_assign
+ now is Polyhedron::convex_hull_assign_and_minimize, while
+ Polyhedron::convex_hull_assign_lazy now is
+ Polyhedron::convex_hull_assign.
+
+2001-11-02 Friday 16:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/clpq.pl (1.2): Some infrastructure
+ added to simplify loading programs and trying them.
+
+2001-11-02 Friday 15:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.33), src/ConSys.defs.hh (1.25),
+ src/Constraint.defs.hh (1.24), src/GenSys.defs.hh (1.34),
+ src/Generator.defs.hh (1.27), src/LinExpression.defs.hh (1.20),
+ src/Polyhedron.defs.hh (1.60): A further scan on almost all user
+ documentation in order to better comment on space-dimensionality
+ checks.
+
+2001-11-02 Friday 14:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: clpq.pl (1.1), solve.pl (1.19):
+ Renamed.
+
+2001-11-02 Friday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Matrix.cc (1.9): Matrix::resize_no_copy() improved. It now
+ preserves the sortedness flag in the easy cases.
+
+2001-11-02 Friday 13:28 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.18): Comments added
+ throughout.
+
+2001-11-02 Friday 09:01 Elisa Ricci
+
+ * src/Row.cc (1.10): In a comment of operator *(Row, Row) used
+ "dimension-compatible", instead of "dimension-compatibility".
+
+2001-11-02 Friday 08:24 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.17): An improved version of
+ the interpreter. This is a bit faster.
+
+2001-11-01 Thursday 19:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.26): Link the GMP library after the PPL.
+
+2001-11-01 Thursday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.14): The --with-cc configure option has been
+ fixed (it affected CXX instead of CC).
+
+2001-11-01 Thursday 18:08 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.16): Now only use the
+ copied polyhedron when trying a clause.
+
+2001-11-01 Thursday 17:27 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.15): Bug is fixed and test
+ added to check bug is dead. Also, more care is taken to remove
+ polyhedron that are no longer needed.
+
+2001-11-01 Thursday 15:44 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.14): Now, delete_polyhedron
+ is used when the call to solve((A,B)...) fails as well as when it
+ succeeds.
+
+2001-11-01 Thursday 15:36 Elisa Ricci
+
+ * src/: ConSys.cc (1.17), GenSys.cc (1.18), Row.cc (1.9),
+ Row.defs.hh (1.9): Erased the function projected_scalar_prod(x,
+ y) and used instead of it the operator * that it is changed to
+ support also the case of x.size() < y.size (operator * so can be
+ used in the case x.size <= y.size). The functions
+ GenSys::satisfy(Constraint) and
+ ConSys::satisfies_all_constraints(Generator) are modified to use
+ only the operator *.
+
+2001-11-01 Thursday 14:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.13): Names of terms made
+ more descriptive.
+
+2001-11-01 Thursday 14:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.cc (1.8), Matrix.inlines.hh (1.5),
+ Polyhedron.inlines.hh (1.10), Row.cc (1.8), Row.defs.hh (1.8),
+ SatMatrix.defs.hh (1.8), SatMatrix.inlines.hh (1.5),
+ SatRow.defs.hh (1.8), SatRow.inlines.hh (1.5), Status.cc (1.8),
+ Status.defs.hh (1.10), Status.inlines.hh (1.4),
+ Variable.inlines.hh (1.4): Using the \related doxygen command
+ everywhere appropriate (but not using it for specialization of
+ std::swap functions). All inline functions enclosed in namespace
+ delimiters: removed redundant namespace qualifiers accordingly.
+
+2001-11-01 Thursday 13:53 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.12): Now temporary
+ polyhedra are deleted when they are no longer needed.
+
+2001-11-01 Thursday 13:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.11): Old code for
+ ppl_renew_polyhedron that does not use ppl_delete_polyhedron has
+ been restored.
+
+2001-11-01 Thursday 11:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.10): Now all but the head
+ variables are projected away. Other general improvements and
+ corrections done.
+
+2001-11-01 Thursday 10:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.7), Polyhedron.cc (1.71), Row.defs.hh
+ (1.7), Row.inlines.hh (1.6): Using the \relates doxygen command
+ for Row and Matrix. Enclosing inline functions in the namespace
+ delimiters. Avoiding useless namespace qualifiers.
+
+2001-11-01 Thursday 07:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.3): Drafted.
+
+2001-10-31 Wednesday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.20): Removed
+ false_constraint_term(): it is no longer needed.
+
+2001-10-31 Wednesday 22:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.19), ppl_sicstus.pl
+ (1.11), solve.pl (1.9): ppl_copy_polyhedron/2 is now provided by
+ the interface.
+
+2001-10-31 Wednesday 22:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.18): In
+ ppl_get_constraints/2, no longer treat empty polyhedra specially.
+ get_generator() renamed generator_term().
+
+2001-10-31 Wednesday 21:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.17): In
+ ppl_get_generators/2, no longer abort if the polyhedron is
+ zero-dimensional.
+
+2001-10-31 Wednesday 21:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.23), Generator.defs.hh (1.26),
+ Polyhedron.defs.hh (1.59), Variable.defs.hh (1.10): Exploiting
+ the doxygen special command \relates to put the documentation of
+ non-friend functions inside the documentation of the related
+ class.
+
+2001-10-31 Wednesday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.16): All C++
+ exceptions are now handled and translated into Prolog exceptions.
+
+2001-10-31 Wednesday 18:25 Elisa Ricci
+
+ * src/: Matrix.cc (1.7), Polyhedron.cc (1.70): Now, the function
+ merge_row_assign resizes the second matrix if it is necessary: it
+ means that in functions add_constraints_lazy and
+ limited_widening_assign we do not resize the matrix cs. In
+ Polyhedron::OK the check of the number of columns is not
+ necessary.
+
+2001-10-31 Wednesday 15:37 Elisa Ricci
+
+ * src/Polyhedron.cc (1.69): In function Polyhedron::OK() the case
+ of is_empty == true is considered.
+
+2001-10-31 Wednesday 14:45 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.8): Now, backtracking works
+ for some queries including fibonacci. Also it works with a test
+ that checks deeper backtracking.
+
+2001-10-31 Wednesday 14:36 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.68): In the checking function OK, we were
+ forgetting return or jump to the appropriate code after having
+ checked the correctness of a 0-space dim polyhedron.
+
+2001-10-31 Wednesday 12:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.67): A missing "return" added inside
+ "add_dimensions_and_constraints".
+
+2001-10-31 Wednesday 12:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.58): Added specification for
+ add_dimensions_and_constraints(ConSys& cs).
+
+2001-10-31 Wednesday 11:52 Elisa Ricci
+
+ * src/Polyhedron.cc (1.66): In functions
+ Polyhedron::widening_assign and
+ Polyhedron::limited_widening_assign considered the case of the
+ polyhedra in a zero-dimensional space. In function
+ Polyhedron::limited_widening_assign considered the case of
+ cs.space_dimension() < space_dimension().
+
+2001-10-31 Wednesday 11:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/GenSys.defs.hh (1.33): Added an example where a system of
+ generators is printed by using more features of the STL.
+
+2001-10-31 Wednesday 11:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.65): When the user invokes
+ Polyhedron::constraints() on an empty polyhedron, we now return
+ the inconsistent constraint of the right dimension. This also
+ implies that a polyhedron with the EMPTY flag set can still have
+ a non-empty con_sys; therefore, we clear the con_sys whenever we
+ change the dimension of an empty polyhedron.
+
+2001-10-31 Wednesday 10:28 Elisa Ricci
+
+ * src/: ConSys.cc (1.16), Polyhedron.cc (1.64): In functions
+ Polyhedron::includes and ConSys::satisfies_all_constraints the
+ cases of a polyhedron in a zero-dimensional space and of
+ g.space_dimension < space_dimension are considered.
+
+2001-10-31 Wednesday 09:56 Elisa Ricci
+
+ * src/: GenSys.cc (1.17), Polyhedron.cc (1.63), Row.cc (1.7),
+ Row.defs.hh (1.6): The function projected_scalar_prod() moved in
+ `namespace Parma_Polyhedra_Library'. The case of
+ c.space_dimension < polyhedron.space_dimension is considered in
+ functions Polyhedron::satisfies and GenSys::satisy. In function
+ Polyhedron::satisfies the cases of empty polyhedron and of the
+ polyhedron is a zero-dimensional space are considered.
+
+2001-10-31 Wednesday 08:47 Elisa Ricci
+
+ * src/LinExpression.defs.hh (1.19): The copy-constructor of a
+ linear expression with a specified dimension is PPL_INTERNAL and
+ not public.
+
+2001-10-30 Tuesday 22:01 Elisa Ricci
+
+ * tests/affinetrans.cc (1.4): We can use the linear expression `x +
+ 4' instead of `x + 0*y + 4'.
+
+2001-10-30 Tuesday 21:57 Elisa Ricci
+
+ * src/: LinExpression.defs.hh (1.18), Polyhedron.cc (1.62): In
+ functions Polyhedron::assign_variable and
+ Polyhedron::substitutte_variable considered the cases of an empty
+ polyhedron and of space_dimension of linear expression <
+ space_dimension of polyhedron. In LinExpression the
+ copy-constructor with the size of the new linear expression is
+ now public.
+
+2001-10-30 Tuesday 18:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.8), Constraint.defs.hh (1.22): Added
+ PPL_INTERNAL method Constraint::is_unsatisfiable().
+
+2001-10-30 Tuesday 18:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.7): Now it allows for
+ constants in the head.
+
+2001-10-30 Tuesday 17:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.6): The interpreter now
+ accepts repeated variables in the head.
+
+2001-10-30 Tuesday 17:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.61), src/Polyhedron.defs.hh (1.57),
+ tests/addconstraints2.cc (1.3): Method
+ add_dimensions_and_constraints_lazy renamed as
+ add_dimensions_and_constraints; signature changed (the argument
+ is no longer const); in the implementation, we swap coefficients
+ instead of copying them.
+
+2001-10-30 Tuesday 15:54 Elisa Ricci
+
+ * src/: Row.cc (1.6), Row.defs.hh (1.5): Added the function Integer
+ projected_scalar_prod(const Row&, const Row&).
+
+2001-10-30 Tuesday 15:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.56): Spelling of "poject" to "project"
+ changed.
+
+2001-10-30 Tuesday 15:17 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.60): Spelling error corrected in an output
+ message; for consistency, try always to use the
+ dimension-compatibility concept in error messages.
+
+2001-10-30 Tuesday 15:12 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.5): Adjusted to allow for =
+ instead of == for equality.
+
+2001-10-30 Tuesday 14:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.17), LinExpression.inlines.hh
+ (1.6): Added method space_dimension.
+
+2001-10-30 Tuesday 14:54 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.55): We do not have any exception if we
+ use the function Polyhedron::constraints() with an empty
+ polyhedron of the function Polyhedron::generators() with a
+ zero-dimensional polyhedron.
+
+2001-10-30 Tuesday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.15): Use '='/2
+ instead of '=='/2 to denote equality. Fixed a bug whereby the
+ sign of the inhomogeneous term of constraints was inverted.
+
+2001-10-30 Tuesday 14:40 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.59): Started using the methods
+ space_dimension() of classes Constraint, Generator, ConSys and
+ GenSys.
+
+2001-10-30 Tuesday 14:30 Elisa Ricci
+
+ * src/Polyhedron.cc (1.58): In functions Polyhedron::insert used
+ the function space_dimension() (of a constraint or of a
+ generator) instead of size() - 1.
+
+2001-10-30 Tuesday 13:25 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.4): More improvements.
+
+2001-10-30 Tuesday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.24), ConSys.inlines.hh (1.8),
+ GenSys.defs.hh (1.32), GenSys.inlines.hh (1.8): Added method
+ space_dimension() to both ConSys and GenSys.
+
+2001-10-30 Tuesday 12:25 Elisa Ricci
+
+ * src/Polyhedron.cc (1.57): In function
+ add_dimensions_and_constraints_lazy, if we are lazy we only say
+ that the system of constraints is not sorted, otherwise we sort
+ the system of constraints.
+
+2001-10-30 Tuesday 12:17 Elisa Ricci
+
+ * tests/addconstraints2.cc (1.2): Changed the second system of
+ constraints (ConSys c2) to have a non-empty polyhedron.
+
+2001-10-30 Tuesday 12:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.56): insert(const Generator&) improved.
+
+2001-10-30 Tuesday 11:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.3): Now upgraded to accept
+ user predicates as well as constraints.
+
+2001-10-30 Tuesday 11:47 Elisa Ricci
+
+ * tests/: Makefile.am (1.25), addconstraints2.cc (1.1): Added the
+ test for the function add_dimensions_and_constraints_lazy.
+
+2001-10-30 Tuesday 11:39 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.55): In add_constraints, after adding NO
+ constraints at all we still need to check for the emptyness of
+ the polyhedron. In insert(const Constraint&), adjusted
+ assertions and added triviality check when inserting into a
+ zero-dim space polyhedron.
+
+2001-10-30 Tuesday 11:29 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.54), Polyhedron.defs.hh (1.54): Added the
+ function add_dimensions_and_constraints_lazy(const ConSys& cs).
+
+2001-10-30 Tuesday 11:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.53): In add_constraints(_lazy), if a
+ zero-dim space polyhedron is considered, using ConSys iterators
+ to see if an inconsistent polyhedron is created.
+
+2001-10-30 Tuesday 10:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.24), addconstraints1.cc (1.1): Added test
+ for the addition of consistent and inconsistent zero-dim
+ constraints to a zero-dim space polyhedron. Tests re-ordered
+ alphabetically.
+
+2001-10-30 Tuesday 10:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.2): Some small bugs fixed.
+
+2001-10-30 Tuesday 10:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.23), removedim3.cc (1.1): Added simple
+ test on the removal of dimensions from an empty polyhedron.
+
+2001-10-30 Tuesday 09:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.52), Polyhedron.defs.hh (1.53): BE_LAZY
+ used also in Polyhedron::add_dimensions_and_project. A couple of
+ assertions added and old code (already commented out) removed.
+
+2001-10-30 Tuesday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SICStus/solve.pl (1.1): A first start/attempt
+ at a simple meta-interpreter for CLP(Q). There is a bug to be
+ fixed.
+
+2001-10-29 Monday 21:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.51): Be lazy.
+
+2001-10-29 Monday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: conversion.cc (1.8), minimize.cc (1.5), simplify.cc (1.6):
+ Comments fixed: the class is called Polyhedron, not Poly.
+
+2001-10-29 Monday 18:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.14): Use
+ Constraint/Generator::space_dimension() instead of the no longer
+ existing last_variable().
+
+2001-10-29 Monday 16:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.21), Constraint.inlines.hh (1.9),
+ Generator.defs.hh (1.25), Generator.inlines.hh (1.14): Removed
+ methods last_variable() and added method space_dimension() to
+ Constraint and Generator.
+
+2001-10-29 Monday 16:46 Elisa Ricci
+
+ * src/Polyhedron.cc (1.50): In Polyhedron(size_t num_dimensions,
+ Degenerate_Kind kind) if we build an universe polyhedron the
+ system of constraints is in the minimal form. In the function
+ insert(Constraint) added the comment that specify why when we
+ insert the constraint the polyhedron is non-empty.
+
+2001-10-29 Monday 16:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.15), Constraint.cc (1.7), Constraint.defs.hh
+ (1.20): Constraint::is_non_trivial() transformed into
+ Constraint::is_trivial(). Btw, the old evrsion was still wrong.
+
+2001-10-29 Monday 16:26 Elisa Ricci
+
+ * src/Polyhedron.cc (1.49): In function add_constraints,
+ add_constraints_lazy and add_generators the case of
+ cs(gs)_num_columns == 1 && space_dimension() == 0 is considered.
+
+2001-10-29 Monday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * missing (1.3): Updated.
+
+2001-10-29 Monday 14:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Constraint.cc (1.6): Constraint::is_nontrivial() fixed.
+
+2001-10-29 Monday 14:29 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.48): In add_dimensions_and_embed, when
+ embedding a zero-dim universe polyhedron the creation of the
+ system of generators is now guarded by pre-proc flag BE_LAZY.
+
+2001-10-29 Monday 13:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.cc (1.16), GenSys.defs.hh (1.31), GenSys.inlines.hh
+ (1.7), Polyhedron.cc (1.47): Added static member function
+ GenSys::zero_dim_univ() to replace static member
+ GenSys::zero_dim_univ. All inline functions enclosed in the
+ namespace.
+
+2001-10-29 Monday 13:23 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc (1.8), Generator.defs.hh (1.24),
+ Generator.inlines.hh (1.13): Added static member function
+ Generator::zero_dim_vertex(). Functions vertex, ray and line are
+ no longer inlined; for ray and line we now check that the
+ argument does not represent the origin of the space.
+
+2001-10-29 Monday 13:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/ConSys.defs.hh (1.23): Must include <iterator>.
+
+2001-10-29 Monday 12:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.14), ConSys.defs.hh (1.22), ConSys.inlines.hh
+ (1.7), Polyhedron.cc (1.46): Added static member function
+ ConSys::zero_dim_empty().
+
+2001-10-29 Monday 12:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.5), Constraint.defs.hh (1.19),
+ Constraint.inlines.hh (1.8): Added static memebr function
+ Constraint::zero_dim_false(). All inline functions enclosed in
+ the namespace.
+
+2001-10-29 Monday 12:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.cc (1.5), LinExpression.defs.hh (1.16),
+ LinExpression.inlines.hh (1.5): Added static member function
+ LinExpression::zero() in place of static member LinExpression
+ zero. All inline functions enclosed in the scope of namespace.
+
+2001-10-29 Monday 11:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.45): Polyhedron::Polyhedron(GenSys& gs)
+ improved.
+
+2001-10-29 Monday 10:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.13): Require autoconf 2.52e.
+
+2001-10-29 Monday 10:18 Elisa Ricci
+
+ * tests/: affinetrans.cc (1.3), append2.cc (1.6), empty1.cc (1.5),
+ error1.cc (1.6), error2.cc (1.7), error3.cc (1.7), error4.cc
+ (1.3), error5.cc (1.4), inters1.cc (1.6), inters2.cc (1.8),
+ permute.cc (1.9), randchull1.cc (1.8), removedim1.cc (1.2),
+ removedim2.cc (1.5): Added the comment to the tests, the
+ inclusion of the file "ehandlers.hh", use the function
+ set_handlers() and added some NOISY-print of the polyhedra (where
+ they are necessary).
+
+2001-10-29 Monday 09:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/Makefile.am (1.22): Committing Makefile.am was unwanted
+ (error6 is a non-meaningful dummy test).
+
+2001-10-29 Monday 06:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.7), Polyhedron.defs.hh (1.52),
+ conversion.cc (1.7): The Integer constants 0 and 1 are now
+ provided by the static methods Integer::zero() and
+ Integer::one().
+
+2001-10-28 Sunday 21:41 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/ConSys.cc (1.13), src/ConSys.defs.hh (1.21),
+ src/ConSys.inlines.hh (1.6), src/GenSys.cc (1.15),
+ src/GenSys.defs.hh (1.30), src/GenSys.inlines.hh (1.6),
+ src/Generator.defs.hh (1.23), src/Polyhedron.cc (1.44),
+ tests/Makefile.am (1.21): Added static members denoting the
+ zero-dim usatisfiable constraint, teh corresponding constraint
+ system and the system of generators corresponding to the zero-dim
+ universe.
+
+2001-10-28 Sunday 20:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.cc (1.4), Constraint.defs.hh (1.18):
+ is_non_trivial() now correctly handles inconsistent constraints,
+ which should NOT be considered trivial. Output operator now
+ correctly prints inconsistent constraints.
+
+2001-10-28 Sunday 18:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.4),
+ SICStus/ppl_sicstus.pl (1.10): Added ppl_insert_constraints/2 and
+ ppl_insert_generators/2.
+
+2001-10-28 Sunday 18:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.3),
+ SICStus/ppl_sicstus.cc (1.13), SICStus/ppl_sicstus.pl (1.9):
+ Added ppl_add_dimensions_and_embed/2 and
+ ppl_add_dimensions_and_project/2.
+
+2001-10-28 Sunday 18:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/: Prolog_interface.dox (1.2),
+ SICStus/ppl_check.pl (1.6), SICStus/ppl_sicstus.cc (1.12),
+ SICStus/ppl_sicstus.pl (1.8): ppl_remove_dimensions/2 added.
+
+2001-10-28 Sunday 14:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.11), configure.ac (1.12),
+ interfaces/Prolog/Makefile.am (1.2): Try not to bother people
+ without the SICStus include file.
+
+2001-10-28 Sunday 14:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.cc (1.6), Generator.defs.hh (1.22),
+ Generator.inlines.hh (1.12), LinExpression.cc (1.4),
+ LinExpression.defs.hh (1.15): Now the friend function vertex(e,
+ d) has also its first argument optional; calling vertex() creates
+ the origin of the zero-dim vector space. Added zero-dim checks
+ to ray(e) and line(e).
+
+2001-10-28 Sunday 13:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.13), doc/devref-browse.doxyconf-latex.in
+ (1.7), doc/devref-print.doxyconf-latex.in (1.7),
+ doc/devref.doxyconf-html.in (1.8),
+ doc/user-browse.doxyconf-latex.in (1.8),
+ doc/user-print.doxyconf-latex.in (1.8), doc/user.doxyconf-html.in
+ (1.10), interfaces/Prolog/Prolog_interface.dox (1.1): Provide a
+ framework for the Prolog interface documentation.
+
+2001-10-28 Sunday 11:12 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/removedim2.cc (1.4): Moved creation of lin-expr
+ infrastructure outside the loop.
+
+2001-10-28 Sunday 10:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_check.pl (1.5), ppl_sicstus.cc
+ (1.11), ppl_sicstus.pl (1.7): Added ppl_get_constraints/2 and
+ ppl_get_generators/2.
+
+2001-10-28 Sunday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.51): Do not create yet another Integer
+ set to one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 10:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.17), Generator.defs.hh (1.21),
+ Generator.inlines.hh (1.11): New methods of Generator:
+ last_variable(), coefficient(), and divisor(). Harmonized with
+ the ones of Constraint. Do not create yet another Integer set to
+ one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 08:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.43): Corrected the error making test
+ `randchull1' fail (I was forgetting to clear flags after
+ insertion of the generator).
+
+2001-10-27 Saturday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/onepoint.cc (1.1): New test on the creation of a one-point
+ polyhedron.
+
+2001-10-27 Saturday 22:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.20), error1.cc (1.5), error2.cc (1.6),
+ error3.cc (1.6), error4.cc (1.2), error5.cc (1.3), removedim.cc
+ (1.3), removedim1.cc (1.1), removedim2.cc (1.3): Try to be
+ consistent.
+
+2001-10-27 Saturday 18:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.16), Constraint.inlines.hh (1.7): New
+ Constraint methods: last_variable(), coefficient(Variable v) and
+ coefficient() to return the last variable, the homogeneous and
+ inhomogeneous coefficients.
+
+2001-10-27 Saturday 17:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_check.pl (1.4), ppl_sicstus.cc
+ (1.10), ppl_sicstus.pl (1.6): ppl_new_polyhedron/1 replaced with
+ ppl_new_polyhedron/2 and ppl_new_empty_polyhedron/2.
+
+2001-10-27 Saturday 16:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/definitions.dox (1.32), src/Constraint.defs.hh (1.15),
+ src/Constraint.inlines.hh (1.6), src/Generator.cc (1.5),
+ src/Generator.defs.hh (1.20), src/Generator.inlines.hh (1.10),
+ src/Polyhedron.cc (1.42), src/Polyhedron.defs.hh (1.50),
+ src/Polyhedron.inlines.hh (1.9), src/Status.cc (1.7),
+ src/Status.defs.hh (1.9), src/Status.inlines.hh (1.3),
+ tests/Makefile.am (1.19), tests/affinetrans.cc (1.2),
+ tests/append1.cc (1.4), tests/append2.cc (1.5), tests/empty1.cc
+ (1.4), tests/error3.cc (1.5), tests/error5.cc (1.2),
+ tests/inters2.cc (1.7), tests/permute.cc (1.8), tests/print.hh
+ (1.3), tests/randchull1.cc (1.7), tests/removedim.cc (1.2),
+ tests/removedim2.cc (1.2): All changes on the `space_dim' branch
+ have been merged to the main trunk.
+
+2001-10-27 Saturday 15:30 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (space_dim.12): In Polyhedron::insert(const
+ Generator&) added generator type check.
+
+2001-10-27 Saturday 15:24 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh, Constraint.inlines.hh, Polyhedron.cc,
+ Polyhedron.defs.hh (space_dim.[1,1,11,6]): Default constructor
+ for Constraint is now private and not implemented. In
+ Polyhedron::insert(const Generator&) we should check that the
+ generator is a vertex if the polyhedron is empty (we cannot add
+ just a ray or a line).
+
+2001-10-27 Saturday 15:12 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.9), ppl_sicstus.pl
+ (1.5): ppl_widening_assign/2 added.
+
+2001-10-27 Saturday 15:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.8), ppl_sicstus.pl
+ (1.4): ppl_intersection_assign/2 and ppl_convex_hull_assign/2
+ added. Try to be as const-correct as possible.
+
+2001-10-27 Saturday 14:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_check.pl (1.3), ppl_sicstus.cc
+ (1.7), ppl_sicstus.pl (1.3): ppl_check_empty/1 added.
+
+2001-10-27 Saturday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.6):
+ SP_register_atom() and SP_unregister_atom() can fail.
+
+2001-10-27 Saturday 14:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/: ppl_check.pl (1.2), ppl_sicstus.cc
+ (1.5), ppl_sicstus.pl (1.2): ppl_insert_generator/2 added.
+
+2001-10-27 Saturday 12:35 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, src/Status.cc, src/Status.defs.hh,
+ src/Status.inlines.hh, tests/empty1.cc, tests/inters2.cc,
+ tests/print.hh, tests/randchull1.cc
+ (space_dim.[10,5,2,1,1,1,1,1,1,1]): The zero_dim flag (and
+ methods) in Status changed into more meaningful "zero_dim_univ".
+ A lot of small changes to have a consistent dimension-checking.
+ Now there is one "default" constructor for Polyhedron having two
+ optional arguments: the space dimension (default 0) and the
+ degenerate kind (default UNIVERSE). Tests adapted to use the new
+ constructor and to avoid using the removed
+ Polyhedron::is_zero_dim().
+
+2001-10-27 Saturday 12:26 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.31): Proposition after Minkowsky's theorem
+ corrected (we can CHOOSE extreme rays so that they have rational
+ coefficients).
+
+2001-10-27 Saturday 11:54 Elisa Ricci
+
+ * tests/: affinetrans.cc, error3.cc (space_dim.[2,2]): To build the
+ polyhedron that we want using the system of generators, we must
+ create the system of generators and then use Polyhedron ph(gs).
+ (If we use Polyhedron ph(num_dim), we have the universe
+ polyhedron and then when we add the generators we do not have our
+ polyhedron but the universe one).
+
+2001-10-27 Saturday 11:49 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (space_dim.4): Added an example for the
+ function remove_dimensions (the example 8). In the examples when
+ we build a polyhedron we must specify the dimension of the space
+ if then we use the function Polyhedron::insert(Constraint). We
+ can not do the same thing if then we want to use the function
+ Polyhedron::insert(Generator) In fact, in this case we build the
+ universe polyhedron and then we add the generators. To build a
+ polyhedron starting from the system of generators we must create
+ the system of generators and then use Polyhedron ph(gs).
+
+2001-10-27 Saturday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.11): Version number bumped so as to avoid
+ confusion: 0.2-pre1.
+
+2001-10-27 Saturday 10:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.10), interfaces/Prolog/SICStus/Makefile.am (1.2),
+ interfaces/Prolog/SICStus/ppl_check.pl (1.1),
+ interfaces/Prolog/SICStus/ppl_sicstus.cc (1.4),
+ interfaces/Prolog/SICStus/ppl_sicstus.pl (1.1): Check to see
+ whether `sicstus' is installed: if it is, tests can be performed.
+ Some progress in the interface itself.
+
+2001-10-27 Saturday 10:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.41): ConSys and GenSys do not yet provide a
+ `bool empty() const' method.
+
+2001-10-27 Saturday 10:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.15): Distribute ppl_header.middle.
+
+2001-10-26 Friday 21:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.3): Exception
+ handling improved.
+
+2001-10-26 Friday 19:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc, tests/Makefile.am, tests/removedim2.cc
+ (space_dim.[9,4,1]): Polyhedron::remove_dimensions(...) rewritten
+ from scratch. Added a new test to check its correctness.
+
+2001-10-26 Friday 18:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * interfaces/Prolog/SICStus/ppl_sicstus.cc (1.2): Can now insert
+ constraints into a polyhedron.
+
+2001-10-26 Friday 16:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am, ppl_header.middle (space_dim.[1,1]): Get
+ around a bug in GCC versions prior to 3 whereby the <cassert>
+ header is wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.12), config.h.in (1.10), configure.ac (1.9),
+ interfaces/.cvsignore (1.1), interfaces/Makefile.am (1.1),
+ interfaces/Prolog/.cvsignore (1.1), interfaces/Prolog/Makefile.am
+ (1.1), interfaces/Prolog/SICStus/.cvsignore (1.1),
+ interfaces/Prolog/SICStus/Makefile.am (1.1),
+ interfaces/Prolog/SICStus/ppl_sicstus.cc (1.1): Start working on
+ the Prolog interfaces.
+
+2001-10-26 Friday 16:51 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.14): ppl_install.hh depends also on
+ ppl_header.middle.
+
+2001-10-26 Friday 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.13), ppl_header.middle (1.1): Get around a
+ bug in GCC versions prior to 3 whereby the <cassert> header is
+ wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.40), Variable.defs.hh (1.9): Just
+ formatting.
+
+2001-10-26 Friday 13:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (space_dim.8): A few trivial errors inside
+ assertions fixed.
+
+2001-10-26 Friday 12:29 Elisa Ricci
+
+ * src/Polyhedron.cc (space_dim.7): In function add_generators we
+ resize the matrix gs that we want to add if space_dimension() >
+ num_columns() - 1.
+
+2001-10-26 Friday 12:14 Elisa Ricci
+
+ * src/Polyhedron.cc (space_dim.6): Added the dimension-consistency
+ check in the function add_constraints_lazy and add_generators.
+ In functions add_constraints and add_generators we use
+ if(check_empty()) instead of minimize() if(is_empty()) In
+ functions add_constraints and add_constraints_lazy we resize the
+ matrix of constraints that we add if num_columns - 1 <
+ space_dimension().
+
+2001-10-26 Friday 12:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.defs.hh, Generator.inlines.hh (space_dim.[1,1]):
+ The default constructor for Generator is now private and
+ unimplemented.
+
+2001-10-26 Friday 11:22 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am, error5.cc, removedim.cc (space_dim.[3,1,2]):
+ New test for dimension-compatibility in
+ Polyhedron::remove_dimensions. The test still fails because
+ objects of set<Variable> do not provide ordered access to their
+ elements (yet).
+
+2001-10-26 Friday 10:42 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am, removedim.cc, remuvedim.cc
+ (space_dim.[2,1,2]): Test file "remuvedim.cc" renamed.
+
+2001-10-26 Friday 10:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (space_dim.5): Using begin() instead of max()
+ to select the highest dimension variable from a set of variables.
+
+2001-10-26 Friday 10:34 Elisa Ricci
+
+ * tests/: Makefile.am, remuvedim.cc (space_dim.[1,1]): Added a test
+ for the function remuve_dimensions(...).
+
+2001-10-26 Friday 10:34 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (space_dim.4): Some comments improved. Added
+ dimension-compatibility checks to
+ Polyhedron::remove_dimensions(...).
+
+2001-10-25 Thursday 23:21 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc, tests/affinetrans.cc, tests/append1.cc,
+ tests/append2.cc, tests/error3.cc, tests/permute.cc
+ (space_dim.[3,1,1,1,1,2]): Going on ading the right
+ dimension-compatibility checks. Now the tests are all passed
+ (some of them changed to declare polyhedra dimensions in the
+ constructors, other changed by calling operator
+ add_dimensions_and_embed).
+
+2001-10-25 Thursday 20:59 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.cc (space_dim.1): Strange code indentation fixed.
+
+2001-10-25 Thursday 20:36 Elisa Ricci
+
+ * src/Polyhedron.cc (space_dim.2): In operator <=(x,y) we only need
+ the generators of x and the constraints of y. In functions
+ intersection_assign and convex_hull, we did two checks of the
+ dimension of the space (one with space_dimension() and the other
+ with num_columns()). In functions add_dimensions_and_embed and
+ add_dimensions_and_project we have both the system of constraints
+ and the system of generators minimized when we add some
+ dimensions to a polyhedron in a 0-dimensional space.
+
+2001-10-25 Thursday 16:45 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc, src/Polyhedron.defs.hh,
+ src/Polyhedron.inlines.hh, tests/permute.cc
+ (space_dim.[1,3,1,1]): Added private member
+ Polyhedron::space_dim, which stores the number of dimensions of
+ the enclosing space. Public member Polyhedron::num_dimensions()
+ renamed into Polyhedron::space_dimension() and now reads the
+ member space_dim. Started modifying methods of the class
+ Polyhedron so that they consistently use space_dimension() and
+ space_dim. Started guarding methods by suitable
+ dimension-compatibility checks.
+
+2001-10-25 Thursday 11:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (space_dim.2): All comparison operators on
+ Polyhedron throw an exception when the two polyhedra are
+ dimension-incompatible.
+
+2001-10-25 Thursday 11:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox, src/Polyhedron.defs.hh (space_dim.[1,1]):
+ Added an informal specification for dimension-compatibility. The
+ specification of Polyhedron::insert now says that an exception is
+ thrown if the argument is dimension-incompatible with the
+ polyhedron.
+
+2001-10-24 Wednesday 20:16 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Generator.defs.hh (1.19), Polyhedron.cc (1.39),
+ Polyhedron.defs.hh (1.49): Exceptions are thrown when polyhedra
+ are dimension-incompatible.
+
+2001-10-24 Wednesday 20:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.30): Better explained the difference
+ between the dimension of the polyhedron and the dimension of the
+ enclosing space. The terminology "dimension-consistent" added.
+ Pointed out what seems to be a problem with empty polyhedrons
+ (what is the dimensions of their enclosing space?)
+
+2001-10-24 Wednesday 14:57 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.29): A full scan on the user-manual
+ portion of the introduction. In particular: - added a
+ proposition after Minkowsky's theorem for rational polyhedra; -
+ preferring the use of \lambda wrt \mu for scalars; - yet another
+ variation on the definition of extreme rays; - "non-negative"
+ combinations are now "positive" combinations; - better explaining
+ the border-line cases of the generators representation.
+
+2001-10-24 Wednesday 10:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.28): Doxygen does not accept "\f(" [and
+ neither the potentially correct "\f\("] as a way to enter LaTeX
+ mathematical environment. Indexes of vectors goes from 0 to the
+ dim-1.
+
+2001-10-23 Tuesday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.7): Ready for distribution.
+
+2001-10-23 Tuesday 19:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.11): Distribute also the BUGS file.
+
+2001-10-23 Tuesday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.12): Produce and make available HTML
+ documentation to be used off-line.
+
+2001-10-23 Tuesday 19:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * BUGS (1.1), NEWS (1.2), TODO (1.2): Initial versions of these
+ files.
+
+2001-10-23 Tuesday 19:23 Elisa Ricci
+
+ * tests/: Makefile.am (1.18), affinetrans.cc (1.1): Added a test
+ for the functions assign_variable and substitute_variable.
+
+2001-10-23 Tuesday 19:21 Elisa Ricci
+
+ * src/Polyhedron.cc (1.38): In function assign_variable and
+ substitute_variable we must have size_t num_columns =
+ x.num_dimensions() + 1 instead of size_t num_columns =
+ x.con_sys(gen_sys).num_columns() because at this point we do not
+ know which system we have.
+
+2001-10-23 Tuesday 18:52 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.27): A small improvement on the
+ explanation of the representation by generators.
+
+2001-10-23 Tuesday 18:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.37), Polyhedron.defs.hh (1.48):
+ Polyhedron::constraints() no longer throws an exception when
+ *this is a zero-dimensional polyhedron (now it returns the empty
+ system of constraints). Polyhedron::generators() no longer
+ throws an exception when *this is an empty polyhedron (now it
+ returns the empty system of generators).
+
+2001-10-23 Tuesday 18:12 Elisa Ricci
+
+ * src/minimize.cc (1.4): We see the definitions in the Introduction
+ and not in the file definition.dox.
+
+2001-10-23 Tuesday 18:09 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.47): Typo fixed.
+
+2001-10-23 Tuesday 18:05 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: Makefile.am (1.17), error4.cc (1.1): Added a test on the
+ exception thrown when building a polyhedron by using a non-empty
+ system of generators with no vertices.
+
+2001-10-23 Tuesday 17:57 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.46): Added the explanation of why a
+ parameter of a function is non-constant.
+
+2001-10-23 Tuesday 17:54 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.36): Exception messages now use the
+ "function: message" convention. The comment in
+ PPL::Polyhedron::Polyhedron(GenSys& gs) related to the existence
+ of a vertex improved.
+
+2001-10-23 Tuesday 17:27 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.26): In the proposition after the
+ definition of rays, we need to consider a non-empty polyhedron
+ and a non-zero vector \vect{r}. It is NOT true that extreme rays
+ define _all_ the directions in which an arbitrary polyhedron is
+ infinite. Definition of line simplified. A typo fixed in
+ definition of Minkowsky's sum.
+
+2001-10-23 Tuesday 16:50 Elisa Ricci
+
+ * src/Polyhedron.cc (1.35): In function
+ Polyhedron::insert(Constraint), if we add a constraint to an
+ empty polyhedron it remains empty.
+
+2001-10-23 Tuesday 16:35 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.34), Polyhedron.defs.hh (1.45): When a
+ polyhedron is built starting from a system of generators, this
+ must have at least a vertex; otherwise an exception is thrown.
+
+2001-10-23 Tuesday 16:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Generator.cc (1.4), Generator.inlines.hh (1.9),
+ Polyhedron.cc (1.33), Polyhedron.inlines.hh (1.8): Inlining is no
+ longer requested for functions that may throw.
+
+2001-10-23 Tuesday 16:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.9), configure.ac (1.8), src/Makefile.am (1.12),
+ src/Row.defs.hh (1.4), src/ppl_header.bottom (1.3),
+ src/ppl_header.top (1.2): Better configuration and macro
+ handling.
+
+2001-10-23 Tuesday 14:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.32): DLEVEL noise removed.
+
+2001-10-23 Tuesday 14:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.8), configure.ac (1.7), src/ConSys.cc (1.12),
+ src/ConSys.defs.hh (1.20), src/ConSys.inlines.hh (1.5),
+ src/Constraint.cc (1.3), src/Constraint.defs.hh (1.14),
+ src/Constraint.inlines.hh (1.5), src/GenSys.cc (1.14),
+ src/GenSys.defs.hh (1.29), src/GenSys.inlines.hh (1.5),
+ src/Generator.cc (1.3), src/Generator.defs.hh (1.18),
+ src/Generator.inlines.hh (1.8), src/LinExpression.cc (1.3),
+ src/LinExpression.defs.hh (1.14), src/LinExpression.inlines.hh
+ (1.4), src/Makefile.am (1.11), src/Matrix.cc (1.6),
+ src/Matrix.defs.hh (1.6), src/Matrix.inlines.hh (1.4),
+ src/Polyhedron.cc (1.31), src/Polyhedron.defs.hh (1.44),
+ src/Polyhedron.inlines.hh (1.7), src/Row.cc (1.5),
+ src/Row.defs.hh (1.3), src/Row.inlines.hh (1.5), src/SatMatrix.cc
+ (1.6), src/SatMatrix.defs.hh (1.7), src/SatMatrix.inlines.hh
+ (1.4), src/SatRow.cc (1.4), src/SatRow.defs.hh (1.7),
+ src/SatRow.inlines.hh (1.4), src/Status.cc (1.6),
+ src/Status.defs.hh (1.8), src/Status.inlines.hh (1.2),
+ src/Variable.cc (1.3), src/Variable.defs.hh (1.8),
+ src/Variable.inlines.hh (1.3), src/ppl_header.bottom (1.2): The
+ INLINE/OUTLINE mechanism has gone: it caused too many problems.
+
+2001-10-23 Tuesday 14:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: GenSys.defs.hh (1.28), GenSys.inlines.hh (1.4): Inserting a
+ generator in a GenSys automatically adjust the dimensions.
+ Specialization of std:swap for GenSys's added.
+
+2001-10-23 Tuesday 14:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.19), ConSys.inlines.hh (1.4): Better
+ documented the fact that, when inserting constraints in a ConSys,
+ dimensions are automatically adjusted. Added the specialization
+ of function std:swap for ConSys's.
+
+2001-10-23 Tuesday 13:40 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.25), ppl.sty (1.5): Changes to allow for
+ a decomposition when there are no vertices.
+
+2001-10-23 Tuesday 11:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.43): Brackets closing a namespace
+ should be marked as in
+
+ namespace Parma_Polyhedra_Library { ... } // namespace
+ Parma_Polyhedra_Library
+
+2001-10-23 Tuesday 11:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/SatMatrix.inlines.hh (1.3): Must include <cassert>.
+
+2001-10-23 Tuesday 11:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/maxmin.hh (1.2): Put everything in our namespace.
+
+2001-10-23 Tuesday 10:58 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.24): Changes to user introduction to
+ clarify why a polyhedron represented by a system of generators
+ needs a vertex. On-going improvements to the developer's guide
+ including the removal of some repeated definitions. Minor bugs
+ fixed.
+
+2001-10-23 Tuesday 10:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/Makefile.am (1.16): INCLUDES now includes @extra_includes at .
+
+2001-10-23 Tuesday 09:53 Elisa Ricci
+
+ * src/: ConSys.cc (1.11), GenSys.cc (1.13), simplify.cc (1.5): For
+ the definitions and the rules, we must see the Introduction
+ instead of the file definitions.dox. In the functions
+ assign_variable and substitute_variable, the parameter "expr" is
+ the "numerator" of affine expression.
+
+2001-10-23 Tuesday 09:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.10), Constraint.cc (1.2),
+ Constraint.inlines.hh (1.4), GenSys.cc (1.12), LinExpression.cc
+ (1.2), Matrix.cc (1.5), Matrix.inlines.hh (1.3), Row.cc (1.4),
+ Row.inlines.hh (1.4), SatMatrix.cc (1.5): Do not request the
+ inlining of functions containing loops. Be consistent in the use
+ of namespace names and aliases.
+
+2001-10-23 Tuesday 08:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.7), configure.ac (1.6),
+ doc/user-browse.doxyconf-latex.in (1.7),
+ doc/user-print.doxyconf-latex.in (1.7), doc/user.doxyconf-html.in
+ (1.9), src/Makefile.am (1.10), src/Polyhedron.inlines.hh (1.6),
+ src/ppl.cc (1.3), src/ppl_header.bottom (1.1), src/ppl_header.top
+ (1.1), src/protect.sed (1.3), src/restore.sed (1.3),
+ tests/append1.cc (1.3), tests/append2.cc (1.4), tests/empty1.cc
+ (1.3), tests/error1.cc (1.4), tests/error2.cc (1.5),
+ tests/error3.cc (1.4), tests/inters1.cc (1.5), tests/inters2.cc
+ (1.6), tests/permute.cc (1.7), tests/print.hh (1.2),
+ tests/randchull1.cc (1.6): The mechanism for automatically
+ generating the header files has been rewritten from scratch. We
+ no longer depend on kcc: we use CXXCPP instead. Avoid checking
+ for header files we do not use. Try to convince Doxygen not to
+ sort things the way he wants, at least in user's documentation
+ (SORT_MEMBER_DOCS = no). Using std::invalid argument requires
+ including <stdexcept>. All tests should include the header file
+ that will be installed (ppl_install.hh) so that we avoid checking
+ against an already installed header (ppl.hh).
+
+2001-10-23 Tuesday 08:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Status.cc (1.5): Do not fight against emacs indentation
+ rules.
+
+2001-10-22 Monday 19:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.18), GenSys.defs.hh (1.27): When using
+ the doxygen command \code, indentation really matters and, for
+ consistency, we should start with a 2-spaces indentation.
+
+2001-10-22 Monday 19:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.17): Example on how to build vertices
+ split into two parts: the first one shows how to build a generic
+ vertex and, in particular, the origin of the space; the second
+ one shows how to use the optional denominator argument.
+
+2001-10-22 Monday 19:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Status.cc (1.4), Status.defs.hh (1.7): An annoying warning
+ about an unused argument dealt with by exploiting pre-processing
+ macro NDEBUG.
+
+2001-10-22 Monday 16:18 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.30), conversion.cc (1.6), simplify.cc
+ (1.4): Used the notation of "vect{..}" for all the vectors that
+ are in the comments. The definitions and the rules must be seen
+ in the "Introduction" instead of "definitions.dox" or
+ "user_definitions.dox".
+
+2001-10-22 Monday 16:08 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Polyhedron.cc (1.29), Polyhedron.defs.hh (1.42): Now the
+ argument `denominator' for methods Polyhedron::assign_variable
+ and Polyhedron::substitute_variable is a _const_ Integer&,
+ optional and with a default value of 1.
+
+2001-10-22 Monday 15:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.2): Updated.
+
+2001-10-22 Monday 15:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * tests/: error1.cc (1.3), error2.cc (1.4), error3.cc (1.3),
+ inters2.cc (1.5), randchull1.cc (1.5): All tests updated to use
+ the new functions line, ray and vertex.
+
+2001-10-22 Monday 15:10 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.cc (1.9), ConSys.defs.hh (1.17), GenSys.cc (1.11),
+ GenSys.defs.hh (1.26), Generator.defs.hh (1.16),
+ Generator.inlines.hh (1.7), Polyhedron.defs.hh (1.41): Operators
+ |, ^, /= have now been replaced by functions `line', 'ray' and
+ 'vertex'. Note that the function vertex has an _optional_ second
+ argument (the denominator), with default value 1. Hopefully, all
+ the documentation has been changed accordingly (please check).
+ In GenSys and ConSys, now the functions assign_variable and
+ substitute_variable take a _const_ Integer& as their third
+ argument. The same change cannot be applied to the corresponding
+ functions defined on Polyhedron, since we perform a swap on this
+ argument, so that it cannot be const. However, I am now seeing
+ if it is possible to have also these as "optional" arguments,
+ with a default value of 1. Alas, I need to read the C++ manual in
+ order to see how I can define a default value for a non-const
+ argument passed by reference.
+
+2001-10-22 Monday 15:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.6), configure.ac (1.5),
+ doc/devref-browse.doxyconf-latex.in (1.6),
+ doc/devref-print.doxyconf-latex.in (1.6),
+ doc/devref.doxyconf-html.in (1.7), src/.cvsignore (1.4),
+ src/Makefile.am (1.9), src/SatRow.cc (1.3), src/SatRow.defs.hh
+ (1.6), src/SatRow.inlines.hh (1.3): SatRow reimplemented from
+ scratch: we no longer depend on the BitSet class.
+
+2001-10-22 Monday 14:26 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.23): Changed \alpha in the definition of
+ affine transformations to \lambda. Added a comment after the
+ definition of "Combinations" that the empty sum is the origin.
+
+2001-10-22 Monday 10:34 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.22): Changes to wording and restructuring
+ of the definition of Polyhedra. New headings added : Constraints
+ representation and Rational polyheron. Heading "Generators"
+ replaced by "Generators representation". Wording in this
+ definition changed
+
+2001-10-22 Monday 10:02 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.40): In the comments, there was a
+ system of constraints called "constraints" instead of "cs" and a
+ variable called "var" instead of "v".
+
+2001-10-22 Monday 09:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Generator.defs.hh (1.15): Wording of comment on how to build
+ a generator changed. Also minor changes to wording in the
+ following examples.
+
+2001-10-22 Monday 09:52 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.21): I was wrong to remove the
+ "^\transpose" in Weil's theorem - restored.
+
+2001-10-22 Monday 09:25 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.39): In two examples, erased the spaces
+ between the factor and the variable.
+
+2001-10-22 Monday 09:04 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.20): Comment at the end of Weil's theorem
+ had "convex" and "positive" and "rays" and "vertices" wrong way
+ round. Minor change to wording introducing the two theorems. In
+ final comment of user part, "blurb" removed.
+
+2001-10-22 Monday 08:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.19): Removed spurious ^\transpose (^T) in
+ Weil's theorem. Added "dual representation" as heading and
+ emphasised in text at end of user definitions.
+
+2001-10-21 Sunday 15:50 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.16), GenSys.defs.hh (1.25),
+ Generator.defs.hh (1.14), Generator.inlines.hh (1.6),
+ LinExpression.defs.hh (1.13), LinExpression.inlines.hh (1.3),
+ Polyhedron.defs.hh (1.38): Systems of constraints and generators
+ do not define polyhedra; rather, they may "correspond to" a given
+ polyhedron (the one that would be built by applying the adequate
+ constructor). A system of generator does not need to include a
+ vertex, in general. The vertex is needed if the system of
+ generators is meant to correspond to a non-empty polyhedron. The
+ detailed description of class Generator changed to highlight that
+ vertices, lines and rays are represented as a type plus a
+ direction in the space.
+
+2001-10-21 Sunday 14:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.10): CREDITS added to the distribution.
+
+2001-10-21 Sunday 13:04 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.13), Constraint.inlines.hh (1.3): In
+ the documentation, used n to denote the dimension of the space.
+ In the renaming operator >>, the parameter p renamed into offset,
+ consistently with the comment. In the examples, removed spaces
+ between factor and variable when specifying a linear expression
+ (e.g., "3 * x + 4 * y" now is written "3*x + 4*y").
+
+2001-10-21 Sunday 13:01 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/definitions.dox (1.18): When specifying the coordinates of a
+ point, indexes should range from 0 to n-1, if n is the dimension
+ of the space. This is to be consistent with definition of class
+ Variable. Change applied to the definitions of scalar-product,
+ of polytope and to Weil's theorem. Note: I do not like to say a
+ polyhedron is "open" in one direction; I prefer the terminology
+ "unbounded", so I changed it.
+
+2001-10-21 Sunday 12:09 Elisa Ricci
+
+ * doc/definitions.dox (1.17): Restored some mathematical changes
+ and used the notation "\vect{..}" for all the vectors (also in
+ the part that is not in the user manual).
+
+2001-10-21 Sunday 11:56 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.12), Generator.defs.hh (1.13),
+ Polyhedron.defs.hh (1.37), Variable.cc (1.2), Variable.defs.hh
+ (1.7): In the documentation of the namespace PPL, all non-friend
+ operators are now grouped consistently. I do not like very much
+ the current header of each group ("Non-friend operators on
+ objects ..." is maybe too much implementation-aware), but in any
+ case it is definitely better than the default grouping header
+ ("Functions").
+
+2001-10-21 Sunday 11:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * README (1.6): Now it is in sync with the home page of the www
+ documentation.
+
+2001-10-21 Sunday 11:14 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * doc/: definitions.dox (1.16), ppl.sty (1.4): The new macro \vect
+ inserted in ppl.sty; now the macro simply uses the latex command
+ \mathbf, but we can modify its meaning as we like. Had a run on
+ definitions.dox to consistently use the new macro: be careful, in
+ the future, to use 0 when a scalar is meant, and \vect{0} when
+ the origin of the space is meant. Also made small, readability
+ related changes to Minkowsky's and Weil's theorems.
+
+2001-10-20 Saturday 21:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.5): Equation -> equality.
+
+2001-10-20 Saturday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.4): Almost complete: only the directory structure is
+ missing.
+
+2001-10-20 Saturday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * CREDITS (1.2): Just a formatting change.
+
+2001-10-20 Saturday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: definitions.dox (1.15), devref.tex (1.5), user.tex (1.6):
+ Footers fixed. Put the blame on Doxygen.
+
+2001-10-20 Saturday 16:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * AUTHORS (1.2), CREDITS (1.1): Renamed and completed.
+
+2001-10-20 Saturday 12:22 Elisa Ricci
+
+ * doc/definitions.dox (1.14), src/Polyhedron.defs.hh (1.36): Moved
+ the definition of the universe polyhedron after the definition of
+ the polyhedron.
+
+2001-10-20 Saturday 11:47 Elisa Ricci
+
+ * src/: GenSys.cc (1.10), GenSys.defs.hh (1.24), Polyhedron.cc
+ (1.28), Polyhedron.defs.hh (1.35), Status.defs.hh (1.6),
+ conversion.cc (1.5): Now, we always use `system of' instead of
+ `set of' for GenSys and ConSys. In the comment of polyhedron
+ added the explanation of what an universal polyhedron is. Some
+ changes to the comment of the exception: we say that they "have
+ different dimension" instead of that they "do not have the same
+ dimension".
+
+2001-10-20 Saturday 10:26 Elisa Ricci
+
+ * src/LinExpression.defs.hh (1.12): In the second part of the
+ example, we can use LinExpression e = LinExpression(14) instead
+ of LinExpression e = LinExpression(Integer(14)).
+
+2001-10-19 Friday 20:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: user-browse.doxyconf-latex.in (1.6),
+ user-print.doxyconf-latex.in (1.6), user.doxyconf-html.in (1.8):
+ No INTERNAL_DOCS, no INHERIT_DOCS, no FILE_PATTERNS, and no
+ EXCLUDE_PATTERNS.
+
+2001-10-19 Friday 19:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.15), GenSys.defs.hh (1.23): Use
+ PPL_INTERNAL inheritance.
+
+2001-10-19 Friday 18:13 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.13): Generators and associated terminology
+ now defined in the user section. There is now some repetition of
+ definitions in the developer's section.
+
+2001-10-19 Friday 17:27 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.27), Polyhedron.defs.hh (1.34),
+ Polyhedron.inlines.hh (1.5): Simplified the comment to the
+ function swap. Used `v' instead of `var', `dim' instead of
+ `add_dim'. All the ConSys are called `cs' and all the GenSys are
+ called `gs'. Used the expression "thrown if" to introduce the
+ comment to the exceptions. The variable is "substituted" in the
+ function substitute_variable.
+
+2001-10-19 Friday 17:19 Elisa Ricci
+
+ * src/: ConSys.cc (1.8), ConSys.defs.hh (1.14), GenSys.cc (1.9),
+ GenSys.defs.hh (1.22): The Generator is called `g' instead of `r'
+ and the number that indicates the variable is called `v' instead
+ of 'var'.
+
+2001-10-19 Friday 17:12 Elisa Ricci
+
+ * src/: Constraint.defs.hh (1.11), Generator.defs.hh (1.12):
+ Constraint and Generator are :: PPL_INTERNAL Row instead of ::
+ public Row (like LinExpression).
+
+2001-10-19 Friday 14:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.9), depcomp (1.2), install-sh (1.2), ppl.spec.in
+ (1.6), doc/Makefile.am (1.11), doc/definitions.dox (1.12),
+ doc/devref-browse.doxyconf-latex.in (1.5),
+ doc/devref-print.doxyconf-latex.in (1.5),
+ doc/devref.doxyconf-html.in (1.6), doc/gpl.dox (1.2),
+ doc/user-browse.doxyconf-latex.in (1.5),
+ doc/user-print.doxyconf-latex.in (1.5), doc/user.doxyconf-html.in
+ (1.7), src/ConSys.cc (1.7), src/ConSys.defs.hh (1.13),
+ src/ConSys.inlines.hh (1.3), src/Constraint.defs.hh (1.10),
+ src/GenSys.cc (1.8), src/GenSys.defs.hh (1.21),
+ src/GenSys.inlines.hh (1.3), src/Generator.defs.hh (1.11),
+ src/LinExpression.defs.hh (1.11), src/Makefile.am (1.8),
+ src/Matrix.cc (1.4), src/Matrix.defs.hh (1.5),
+ src/Matrix.inlines.hh (1.2), src/Polyhedron.cc (1.26),
+ src/Polyhedron.defs.hh (1.33), src/Polyhedron.inlines.hh (1.4),
+ src/Row.cc (1.3), src/Row.inlines.hh (1.3), src/SatMatrix.cc
+ (1.4), src/SatMatrix.defs.hh (1.6), src/SatMatrix.inlines.hh
+ (1.2), src/SatRow.defs.hh (1.5), src/SatRow.inlines.hh (1.2),
+ src/Status.cc (1.3), src/Status.defs.hh (1.5), src/conversion.cc
+ (1.4), src/minimize.cc (1.3), src/simplify.cc (1.3),
+ tests/Makefile.am (1.15), tests/append2.cc (1.3), tests/error2.cc
+ (1.3), tests/inters1.cc (1.4), tests/inters2.cc (1.4),
+ tests/permute.cc (1.6): Annoying trailing blanks removed.
+
+2001-10-19 Friday 14:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.10), LinExpression.inlines.hh
+ (1.2): We now have only one sizing constructor, and it is
+ private.
+
+2001-10-19 Friday 12:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: conversion.cc (1.3), minimize.cc (1.2), simplify.cc (1.2),
+ Matrix.cc (1.3): Old junk removed.
+
+2001-10-19 Friday 12:15 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.25), Polyhedron.defs.hh (1.32): In
+ functions widening_assign and limited_widening_assign considered
+ the case of empty-polyhedron and the exception for the different
+ dimension of the polyhedra and the matrix (this for the
+ limited_widening); added some explanations for the parameters.
+ In function assign_variable and substitute_variable considered
+ the exceptions for the variable that is not inside the polyhedron
+ and the expression that does not have the right dimension.
+
+2001-10-19 Friday 09:57 Elisa Ricci
+
+ * doc/definitions.dox (1.11): Some mathematical changes.
+
+2001-10-19 Friday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.5), configure.ac (1.4): Add checks to determine
+ the size of ints and longs.
+
+2001-10-19 Friday 09:06 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.31): Examples 4 to 7 simplified.
+
+2001-10-19 Friday 08:56 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: Polyhedron.defs.hh (1.30), Variable.defs.hh (1.6): Changes
+ to English.
+
+2001-10-18 Thursday 18:51 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.24), Polyhedron.defs.hh (1.29),
+ Polyhedron.inlines.hh (1.3): In function add_dimensions_and_embed
+ and add_dimensions_and_project the case of "add_dim" = 0 and the
+ case of the empty polyhedron are considered. In functions
+ add_constraints, add_constraints_lazy, add_generators, generators
+ and constraints instead of some assertion some exceptions are
+ added.
+
+2001-10-18 Thursday 15:36 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: GenSys.defs.hh (1.20), LinExpression.defs.hh (1.9),
+ Polyhedron.defs.hh (1.28): More improvements to the English.
+
+2001-10-18 Thursday 15:29 Elisa Ricci
+
+ * src/GenSys.defs.hh (1.19): The real name of the function is
+ GenSys_Con_Rel satisfy(const Constraint& c) const and not
+ GenSys_Con_Rel satisfy_constraint(const Constraint& c) const.
+
+2001-10-18 Thursday 14:01 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/GenSys.defs.hh (1.18): Just "specify" changed to "specifies".
+
+2001-10-18 Thursday 13:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/: ConSys.defs.hh (1.12), Constraint.defs.hh (1.9),
+ GenSys.defs.hh (1.17), Generator.defs.hh (1.10): Changes to
+ English. In GenSys.defs.hh the explanation about a system of
+ generators changed to: An object of the class GenSys is a
+ system of generators, i.e. a container of objects of the
+ class Generator (lines, rays and vertices). The set of
+ generators must include at least one vertex. This is needed
+ since a line or ray only specify a direction and a point is
+ needed to indicate its position.
+
+2001-10-18 Thursday 12:40 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.23), Polyhedron.defs.hh (1.27): Now the
+ function GenSys_Con_Rel poly_satisfies_constraint(const
+ Constraint& con) is called GenSys_Con_Rel satisfies(const
+ Constraint& c). Added the exception for the functions
+ convex_hull_lazy(), satisfies() and includes().
+
+2001-10-18 Thursday 12:37 Elisa Ricci
+
+ * src/: GenSys.cc (1.7), GenSys.defs.hh (1.16): Now the function
+ PPL::GenSys::satisfy_constraint(const Constraint& c) const is
+ called PPL::GenSys::satisfy(const Constraint& c) const.
+
+2001-10-18 Thursday 11:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/ehandlers.hh (1.2): Call exit(1) instead of abort().
+
+2001-10-18 Thursday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.14), append1.cc (1.2), ehandlers.hh (1.1):
+ Set the handlers for unexpected and uncaught exceptions.
+
+2001-10-18 Thursday 09:38 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * src/GenSys.defs.hh (1.15): Small change to wording in
+ GenSys_Con_Rel comment.
+
+2001-10-18 Thursday 09:07 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/permute.cc (1.5): Now the termination conditions are
+ checked.
+
+2001-10-18 Thursday 08:32 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/permute.cc (1.4): Instead of giving the number of variables
+ explicitly, it is obtained as needed using
+ Polyhedron.num_dimensions.
+
+2001-10-18 Thursday 08:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.10): Now `make world' also produces the
+ licenses in various formats.
+
+2001-10-17 Wednesday 20:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.22): throw_different_dimensions() fixed.
+
+2001-10-17 Wednesday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.13), permute.cc (1.3): Made quiet.
+
+2001-10-17 Wednesday 20:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/error3.cc (1.2): Fixed and made quiet.
+
+2001-10-17 Wednesday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/append.cc (1.4): Renamed append1.cc.
+
+2001-10-17 Wednesday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: append1.cc (1.1), append2.cc (1.2): Renamed.
+
+2001-10-17 Wednesday 19:37 Elisa Ricci
+
+ * tests/error3.cc (1.1): Tests whether convex_hull assign throws
+ when it should.
+
+2001-10-17 Wednesday 19:33 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.21), Polyhedron.defs.hh (1.26):
+ Polyhedron::intersection_assign() and
+ Polyhedron::convex_hull_assign() now throw an exception if asked
+ to operate on polyhedra of different dimensions.
+
+2001-10-17 Wednesday 16:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/permute.cc (1.2): We now use the intended constraints.
+ Termination is guaranteed by using Polyhedron::widening_assign().
+
+2001-10-17 Wednesday 16:31 Elisa Ricci
+
+ * src/: ConSys.defs.hh (1.11), ConSys.inlines.hh (1.2),
+ GenSys.defs.hh (1.14), GenSys.inlines.hh (1.2): Added the
+ function swap for GenSys and ConSys.
+
+2001-10-17 Wednesday 16:21 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/: Makefile.am (1.12), append2.cc (1.1), my_append.cc (1.2),
+ permute.cc (1.1): The file my_append.cc renamed to append2.cc A
+ new test program permute.cc added. Makefile.am updated to
+ include these tests.
+
+2001-10-17 Wednesday 16:08 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.20), Polyhedron.defs.hh (1.25): Added
+ comments of the parameters to some public functions of
+ Polyhedron.
+
+2001-10-17 Wednesday 15:27 Elisa Ricci
+
+ * src/: ConSys.defs.hh (1.10), Constraint.defs.hh (1.8),
+ GenSys.defs.hh (1.13), Polyhedron.defs.hh (1.24): Now, the
+ definitions of the variables used in the examples are before the
+ examples (they are not inside the examples).
+
+2001-10-17 Wednesday 15:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * tests/my_append.cc (1.1): A modified version of append.cc where
+ code is structured into two procedures, one for the initial
+ polyhedra and one for the fix-point.
+
+2001-10-17 Wednesday 12:55 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.10): Definitions of linearly independent
+ and affinely independent improved.
+
+2001-10-17 Wednesday 12:38 Elisa Ricci
+
+ * src/: Constraint.defs.hh (1.7), Generator.defs.hh (1.9),
+ LinExpression.defs.hh (1.8): Now, "friend" mathods are inside the
+ class documentation of these class. In the "Detail Description"
+ of the class LinExpression there is the paragraph "How to build a
+ linear expression".
+
+2001-10-17 Wednesday 12:03 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.23): Used "check_not_empty" instead of
+ "check_satisfiable" also in the comment of function
+ Polyhedron::OK().
+
+2001-10-17 Wednesday 12:01 Elisa Ricci
+
+ * src/: ConSys.defs.hh (1.9), GenSys.defs.hh (1.12), Matrix.defs.hh
+ (1.4), Polyhedron.cc (1.19), Polyhedron.defs.hh (1.22),
+ SatMatrix.cc (1.3), SatMatrix.defs.hh (1.5), SatRow.defs.hh
+ (1.4), Status.defs.hh (1.4): Changed the comments in the function
+ OK(). In function Polyhedron::OK() used "check_not_empty"
+ instead of "check_satisfiable".
+
+2001-10-17 Wednesday 11:05 Elisa Ricci
+
+ * src/: ConSys.cc (1.6), ConSys.defs.hh (1.8), GenSys.cc (1.6),
+ GenSys.defs.hh (1.11), Polyhedron.cc (1.18), Polyhedron.defs.hh
+ (1.21): In function assign_variable and substitute_variable and
+ in their comments used "expr" instead of "coefficient". Used the
+ concatenation of two strings in the argument of
+ std::invalid_argument(...).
+
+2001-10-17 Wednesday 11:03 Elisa Ricci
+
+ * src/Generator.inlines.hh (1.5): Used the concatenation of two
+ strings in the argument of std::invalid_argument(...).
+
+2001-10-17 Wednesday 10:14 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.20): Erased the temporary debug
+ constructor of a polyhedron.
+
+2001-10-17 Wednesday 09:19 Elisa Ricci
+
+ * src/: ConSys.cc (1.5), ConSys.defs.hh (1.7), GenSys.cc (1.5),
+ GenSys.defs.hh (1.10), Matrix.cc (1.2), Matrix.defs.hh (1.3),
+ Polyhedron.cc (1.17), Polyhedron.defs.hh (1.19), SatMatrix.cc
+ (1.2), SatMatrix.defs.hh (1.4), SatRow.cc (1.2), SatRow.defs.hh
+ (1.3), Status.cc (1.2), Status.defs.hh (1.3): Now, there is not
+ NDEBUG before the function OK.
+
+2001-10-17 Wednesday 07:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: ConSys.cc (1.4), GenSys.cc (1.4), Generator.inlines.hh
+ (1.4), Makefile.am (1.7), Polyhedron.cc (1.16), Row.cc (1.2),
+ Row.inlines.hh (1.2): Now Integer and BitSet are in the PPL
+ namespace. Other namespace-related fixes. Exception strings
+ improved.
+
+2001-10-16 Tuesday 19:05 Elisa Ricci
+
+ * src/: Constraint.defs.hh (1.6), Generator.defs.hh (1.8): Changed
+ the place of the paragraph "How to build ...". In the comment of
+ 'Generator operator /=' used std::invalid_argument instead of
+ invalid_argument.
+
+2001-10-16 Tuesday 18:59 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.18): Used std::invalid_argument instead
+ of invalid_argument in the documentation of exception.
+
+2001-10-16 Tuesday 18:54 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.9), ppl.sty (1.3): More definitions
+ added to ppl.sty.
+
+ New definitions used in definitions.dox. Layout of formula in
+ Minkowski's theorem improved.
+
+2001-10-16 Tuesday 18:23 Elisa Ricci
+
+ * src/: ConSys.defs.hh (1.6), GenSys.defs.hh (1.9), Polyhedron.cc
+ (1.15), Polyhedron.defs.hh (1.17), Status.defs.hh (1.2),
+ conversion.cc (1.2): Used "\Rset" instead of "\mathbb{R}".
+
+2001-10-16 Tuesday 18:18 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Constraint.defs.hh (1.5), LinExpression.defs.hh (1.7),
+ Variable.defs.hh (1.5): Examples on the creation of linear
+ expressions and constraints moved to the right place. Comment
+ about variable names moved into the definition of the class
+ Variable.
+
+2001-10-16 Tuesday 18:06 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.7): The examples on how to build
+ generators moved to the right place.
+
+2001-10-16 Tuesday 17:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: error1.cc (1.2), error2.cc (1.2): There is no point in
+ including print.hh.
+
+2001-10-16 Tuesday 17:33 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/: definitions.dox (1.8), ppl.sty (1.2): Some logic notation
+ and "things that hold by definition" added to ppl.sty \mathbb{R}
+ replaced by \Rset in definitions.dox
+
+2001-10-16 Tuesday 17:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.14), src/Polyhedron.defs.hh (1.16),
+ src/Variable.defs.hh (1.4), src/Variable.inlines.hh (1.2),
+ tests/append.cc (1.3): The argument of
+ Polyhedron::remove_dimensions() has changed again. Now it is
+ remove_dimensions(const std::set<Variable>& to_be_removed).
+
+2001-10-16 Tuesday 17:24 Elisa Ricci
+
+ * tests/: Makefile.am (1.11), error2.cc (1.1): Added a test for the
+ expception of Polyhedron::assign_variable.
+
+2001-10-16 Tuesday 17:12 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.15): Commented the exception for the
+ function assign_variable and substitute_variable. Now, some
+ important puclic function are in the user manual.
+
+2001-10-16 Tuesday 17:10 Elisa Ricci
+
+ * src/Generator.defs.hh (1.6): Commented the exception of the
+ constructor of a vertex.
+
+2001-10-16 Tuesday 17:09 Elisa Ricci
+
+ * src/Generator.inlines.hh (1.3): A line has the inhomogeneus term
+ equal to zero (like a ray).
+
+2001-10-16 Tuesday 16:40 Elisa Ricci
+
+ * src/GenSys.defs.hh (1.8): Added two examples that show that at
+ least a vertex is necessary in a set of generators.
+
+2001-10-16 Tuesday 15:20 Elisa Ricci
+
+ * src/Polyhedron.cc (1.13): In functions assign_variable and
+ substitute_variable tha case of denominator == 0 is considered.
+
+2001-10-16 Tuesday 15:11 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.6), Variable.defs.hh (1.3): No
+ longer using modules (\ingroup, \addgroup, etc.).
+
+2001-10-16 Tuesday 12:26 Elisa Ricci
+
+ * src/Polyhedron.cc (1.12): Erased a print.
+
+2001-10-16 Tuesday 12:23 Elisa Ricci
+
+ * src/: ConSys.cc (1.3), ConSys.defs.hh (1.5), GenSys.cc (1.3),
+ GenSys.defs.hh (1.7): Corrected my previous error.
+
+2001-10-16 Tuesday 12:09 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.11), Polyhedron.defs.hh (1.14): The
+ functions assingn_variable and substitute_variable use a Variable
+ instead od a size_t and a const LinExpression instead of a
+ vector<Integer>. In this functions, we use a copy of the `coeff'
+ to find the inverse transformations. Changed the example in
+ according to these changes.
+
+2001-10-16 Tuesday 12:04 Elisa Ricci
+
+ * src/: ConSys.cc (1.2), ConSys.defs.hh (1.4): Now
+ substitute_variable uses LinExpression instead of a
+ vector<Integer>.
+
+2001-10-16 Tuesday 12:03 Elisa Ricci
+
+ * src/: GenSys.cc (1.2), GenSys.defs.hh (1.6): Now
+ assign_variable(..) uses an LinExpression instead of a
+ vector<Integer>.
+
+2001-10-16 Tuesday 11:59 Elisa Ricci
+
+ * src/LinExpression.defs.hh (1.5): Now LinExpression is
+ PPL_INTERNAL Row, instead of private Row.
+
+2001-10-16 Tuesday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.inlines.hh (1.2), tests/Makefile.am (1.10),
+ tests/error1.cc (1.1): Throw an invalid_argument exception if
+ Generator operator /=(const LinExpression& e, const Integer& n)
+ is called with n == 0. New test program error1.cc to test
+ whether this situation is correctly handled.
+
+2001-10-16 Tuesday 10:54 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.3): New incipit.
+
+2001-10-16 Tuesday 10:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: Matrix.defs.hh (1.2), Row.defs.hh (1.2), SatMatrix.defs.hh
+ (1.3), SatRow.defs.hh (1.2): All the specializations of the
+ std::swap function related to implementation classes are now
+ hidden from the user guide.
+
+2001-10-16 Tuesday 10:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.5): Summary changed. Packager also changed in
+ view of PGP signatures.
+
+2001-10-16 Tuesday 10:20 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.13): The parameter name of the
+ "default" constructor for Polyhedron is `kind'. Hal the comment
+ was using a different parameter name (`full').
+
+2001-10-16 Tuesday 10:15 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.defs.hh (1.5): In the examples, replaced "\=" by "/=".
+
+2001-10-16 Tuesday 10:13 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.5): In the examples for defining
+ vectors, all "\=" replaced by "/=".
+
+2001-10-16 Tuesday 08:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.lsm.in (1.2), src/Polyhedron.cc (1.10),
+ src/Polyhedron.defs.hh (1.12), tests/append.cc (1.2): New
+ interface for remove_dimensions(const std::vector<unsigned int>&
+ to_be_removed). Note: BitSet is an implementation detail that
+ should not surface in the API.
+
+2001-10-16 Tuesday 07:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.4): First attempt at the LSM (Linux Software Map)
+ entry form.
+
+2001-10-15 Monday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.9), append.cc (1.1): A first at the
+ append's analysis test.
+
+2001-10-15 Monday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/randchull1.cc (1.4): Do less work.
+
+2001-10-15 Monday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/empty1.cc (1.2): Must return an int, not a bool.
+
+2001-10-15 Monday 18:35 Elisa Ricci
+
+ * src/Polyhedron.cc (1.9): Erased the "assert(OK())" from the
+ function Polyhedron::insert(const Generator&): after an insertion
+ of a generator the polyhedron can be not OK.
+
+2001-10-15 Monday 18:24 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.11): Added a new example to show the
+ use of the function Polyhedron::insert(...).
+
+2001-10-15 Monday 18:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.8), src/Polyhedron.defs.hh (1.10),
+ tests/Makefile.am (1.8), tests/empty1.cc (1.1): It is not
+ possible to overload bool and unsigned int. New enumeration
+ Degenerate_Kind added with vales ZERO_DIMENSIONAL and EMPTY. The
+ constructor Polyhedron(Degenerate_Kind kind = ZERO_DIMENSIONAL)
+ does the expected thing. The program empty1.cc exemplifies two
+ methods of obtaining an empty polyhedron.
+
+2001-10-15 Monday 18:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.9): ppl.sty must also be distributed.
+
+2001-10-15 Monday 17:14 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.7), Polyhedron.defs.hh (1.9): Now the
+ default constructor of a polyhedron has a default argument. If
+ `full' is false, it builds an empty polyhedron (it has the flag
+ set to empty); otherwise, if it has the default value (i.e.
+ true), it bulids a zero-dimensional polyhedron.
+
+2001-10-15 Monday 16:44 Elisa Ricci
+
+ * src/Polyhedron.cc (1.6): If we build a polyhedron starting from a
+ matrix of generators with no rows the polyhedron is empty.
+
+2001-10-15 Monday 16:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Makefile.am (1.8): Use an absolute path for adding to
+ TEXINPUTS.
+
+2001-10-15 Monday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/.cvsignore (1.3): Here is the Integer class again.
+
+2001-10-15 Monday 15:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.inlines.hh (1.2): Multiple inclusion guard added.
+
+2001-10-15 Monday 15:20 Elisa Ricci
+
+ * src/Polyhedron.cc (1.5): In the constructors of a polyhedron that
+ use a system of constraints or a set of generators these matrices
+ must be at least two columns. In the function
+ remove_dimensions(..) if the matrix of generators does not have
+ at least two columns (i.e num_columns() <= 1) the polyhedron
+ becomes zero-dimensional and so we clear the `con_sys' and
+ `gen_sys'. In function insert(const Constraint& c) if the
+ polyhedron is zero-dimensional we add also the positivity
+ constraint. In functions insert(...) it is no longer necessary
+ clear `con_sys' and `gen_sys' before adding a row if the
+ polyhedron is zero-dimensional. In function OK(), we verify if
+ in a zero-dimensional polyhedron `con_sys' and `gen_sys' have no
+ rows.
+
+2001-10-15 Monday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: Makefile.am (1.7), devref-browse.doxyconf-latex.in (1.4),
+ devref-print.doxyconf-latex.in (1.4), devref.doxyconf-html.in
+ (1.5), devref.tex (1.4), ppl.sty (1.1),
+ user-browse.doxyconf-latex.in (1.4), user-print.doxyconf-latex.in
+ (1.4), user.doxyconf-html.in (1.6), user.tex (1.5): New LaTeX
+ commands can now be defined in ppl.sty and then freely used in
+ the doxygen and LaTeX sources. This works also when producing
+ HTML pages.
+
+2001-10-15 Monday 13:59 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.8): Rewrite a part of the brief
+ description of the class Polyhedron. Added some more expanation
+ for the examples 5 and 6.
+
+2001-10-15 Monday 12:19 Elisa Ricci
+
+ * src/SatMatrix.defs.hh (1.2): Added a briefly description for the
+ saturation matrix.
+
+2001-10-15 Monday 11:59 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.3): Now we build a relocatable package.
+
+2001-10-15 Monday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ppl.spec.in (1.2): A first cut at a working RPM spec file.
+
+2001-10-15 Monday 09:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.6): It is now possible for the build directory
+ to be the same as the source directory.
+
+2001-10-14 Sunday 22:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.2), missing (1.2), mkinstalldirs (1.3): Updated.
+
+2001-10-14 Sunday 21:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.8), configure.ac (1.3), doc/Makefile.am (1.6),
+ m4/Makefile.am (1.2), src/Makefile.am (1.5), tests/Makefile.am
+ (1.7): Several packaging bugs have been fixed: now `make
+ distcheck' is OK.
+
+2001-10-14 Sunday 21:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref-browse.doxyconf-latex.in (1.3),
+ devref-print.doxyconf-latex.in (1.3), devref.doxyconf-html.in
+ (1.4), user-browse.doxyconf-latex.in (1.3),
+ user-print.doxyconf-latex.in (1.3), user.doxyconf-html.in (1.5):
+ The sysdep directory does not exist anymore.
+
+2001-10-14 Sunday 14:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.7), doc/Makefile.am (1.5), doc/definitions.dox
+ (1.7), doc/devref-browse.doxyconf-latex.in (1.2),
+ doc/devref-print.doxyconf-latex.in (1.2),
+ doc/devref.doxyconf-html.in (1.3), doc/fdl.dox (1.1), doc/fdl.tex
+ (1.1), doc/gfdl.dox (1.2), doc/gpl.tex (1.1), doc/gpl.texi (1.2),
+ doc/gpl.texinfo (1.2), doc/texinfo.tex (1.2),
+ doc/user-browse.doxyconf-latex.in (1.2),
+ doc/user-print.doxyconf-latex.in (1.2), doc/user.doxyconf-html.in
+ (1.4): Documentation reorganized.
+
+2001-10-14 Sunday 11:46 Elisa Ricci
+
+ * src/Polyhedron.cc (1.4): In functions Polyhedron::insert(const
+ Constraint& c) e Polyhedron::insert(const Constraint& c) the case
+ of a zero-dimensional polyhedron is considered.
+
+2001-10-13 Saturday 21:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/Polyhedra.texinfo (1.3): Was never meant to be here.
+
+2001-10-13 Saturday 19:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.4), configure.ac (1.2): Configuration fixed in
+ various respects.
+
+ Please note that:
+
+ - debugging (-g) is ON by default; - standard optimization (-O2)
+ is THE default; - run-time assertions are OFF by default.
+
+2001-10-13 Saturday 19:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.4), ppl.cc (1.2), protect.sed (1.2),
+ restore.sed (1.2): Generation of libppl.a and ppl.hh fixed.
+
+2001-10-13 Saturday 19:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.6), inters1.cc (1.3), inters2.cc (1.3),
+ randchull1.cc (1.3): Programs using the PPL need only include
+ ppl.hh.
+
+2001-10-13 Saturday 19:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Polyhedron.cc (1.3), tests/randchull1.cc (1.2): It is now
+ possible to insert a generator into an empty polyhedron.
+
+2001-10-13 Saturday 16:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.6), acconfig.h (1.2), acinclude.m4 (1.1),
+ config.guess (1.2), config.h.in (1.3), config.sub (1.2),
+ configure.ac (1.1), configure.in (1.5), doc/Makefile.am (1.4),
+ m4/.cvsignore (1.1), src/Makefile.am (1.3), tests/Makefile.am
+ (1.5): Upgraded to newer versions of autoconf. Use the new
+ checks for detecting GMP.
+
+2001-10-13 Saturday 12:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.5), m4/Makefile.am (1.1),
+ m4/ac_check_gmp_exceptions.m4 (1.1), m4/ac_check_have_gmp.m4
+ (1.1): New tests to check whether GMP is installed and, if so,
+ whether it was compiled with -fexceptions.
+
+2001-10-13 Saturday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.4), Makefile.am (1.4), Makefile.in (1.4),
+ aclocal.m4 (1.2), configure (1.5), stamp-h.in (1.2),
+ doc/.cvsignore (1.1), doc/Makefile.am (1.3), doc/Makefile.in
+ (1.3), src/.cvsignore (1.2), src/Makefile.in (1.3),
+ tests/.cvsignore (1.1), tests/Makefile.in (1.5): Automatically
+ generated files should not be in the repository and their
+ presence in the directory structure should be ignored.
+
+2001-10-12 Friday 22:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure (1.4), configure.in (1.4), doc/Makefile.am (1.2),
+ doc/Makefile.in (1.2), doc/devref-browse.doxyconf-latex.in (1.1),
+ doc/devref-print.doxyconf-latex.in (1.1),
+ doc/devref.doxyconf-pdf.in (1.3), doc/devref.tex (1.3),
+ doc/user-browse.doxyconf-latex.in (1.1),
+ doc/user-print.doxyconf-latex.in (1.1), doc/user.doxyconf-pdf.in
+ (1.4), doc/user.tex (1.4): Several improvements to the
+ documentation. We now produce docs for printing and docs for
+ browsing
+
+2001-10-12 Friday 18:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.doxyconf-html.in (1.2), devref.doxyconf-pdf.in
+ (1.2), user.doxyconf-html.in (1.3), user.doxyconf-pdf.in (1.3),
+ user.tex (1.3): The project name is "Parma Polyhedra Library",
+ "PPL" for short.
+
+2001-10-12 Friday 18:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.4), Makefile.in (1.4), randchull1.cc
+ (1.1): New test computing convex-hulls of random polytopes.
+
+2001-10-12 Friday 17:19 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.6): Title of document changed. Sections
+ changed so that there are two sections, an introduction to
+ polyhedra and a more advanced section which talks about the PPL
+ implementation. Comment about vertices differing from rays only
+ in the n+1'th term moved to before "Valid linear inequalities"
+ paragraph.
+
+2001-10-12 Friday 17:09 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: Makefile.am (1.2), Makefile.in (1.2): Header file ppl.hh is
+ now guarded against multiple inclusion.
+
+2001-10-12 Friday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Generator.cc (1.2): Bug fixed: a vertex in the origin was
+ printed as "v()" instead of "v(0)".
+
+2001-10-12 Friday 16:51 Elisa Ricci
+
+ * src/: Polyhedron.cc (1.2), Polyhedron.defs.hh (1.7): Added the
+ function Polyhedron::insert(const Generator& g).
+
+2001-10-12 Friday 16:36 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.6): Added other two examples: one is
+ for the use of assign_variable(...) and the other is for the use
+ of substitute_variable(...).
+
+2001-10-12 Friday 15:44 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.5): Corrected a my error: to build a
+ vertex "/=" is needed instead of "\=".
+
+2001-10-12 Friday 15:12 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.4): Added two examples to the comment:
+ one to specify the use of add_dimensions_and_embed(..) and the
+ other to specify the use of add_dimensions_and_project(...).
+ Corrected an error in a formula: now in the comment of
+ convex_hull(...) and convex_hull_lazy(..) there is \f$\cup\f$
+ instead of \f$\union\f$ (that caused an error in Latex).
+
+2001-10-12 Friday 15:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/inters2.cc (1.2): Fixed and extended.
+
+2001-10-12 Friday 14:20 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * tests/: Makefile.am (1.3), Makefile.in (1.3), inters1.cc (1.2),
+ inters2.cc (1.1), print.hh (1.1): print.hh contains functions
+ that are useful for printing polyhedra. inters1.cc improved.
+ New test inters2.cc computing the intersection of a pyramid with
+ an half-space of variable height, then counting the number of
+ vertices of the resulting polytope (the empty polyhedron, a
+ proper frustum, or a singleton).
+
+2001-10-12 Friday 13:20 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.5): Section on the "equivalence of
+ homogeneous and inhomogeneous systems" (up to the paragraph
+ called "Valid linear inequalities") changed and reworded. Title
+ of section changed to "Homogeneous systems".
+
+2001-10-12 Friday 10:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.2), doc/Polyhedra.texinfo (1.2), tests/Makefile.am
+ (1.2), tests/Makefile.in (1.2): Bump copyright year.
+
+2001-10-12 Friday 09:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.3), Makefile.in (1.3), config.h.in (1.2),
+ configure (1.3), configure.in (1.3), tests/Makefile.am (1.1),
+ tests/Makefile.in (1.1), tests/inters1.cc (1.1): Infrastructure
+ for the tests directory and `make check'. inters1.cc is a first
+ example of how test programs could be written.
+
+2001-10-11 Thursday 17:37 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Polyhedron.defs.hh (1.3): Added a backslash to mathbb in the
+ second example. Removing empty lines that were causing Examples
+ 1 and 2 to end prematurely.
+
+2001-10-11 Thursday 17:00 Elisa Ricci
+
+ * src/Polyhedron.defs.hh (1.2): Added two examples to the comment:
+ one is for the construction of a square using the constraints and
+ the generators. The other is for the construction of an
+ half-strip using the constraints and the generators.
+
+2001-10-11 Thursday 16:57 Elisa Ricci
+
+ * src/GenSys.defs.hh (1.4): Added another example for the
+ construction of a set of generators (it builds an half-strip).
+
+2001-10-11 Thursday 16:56 Elisa Ricci
+
+ * src/ConSys.defs.hh (1.3): Added another example for the
+ constraction of a system of constraints (it builds an
+ half-strip).
+
+2001-10-11 Thursday 16:41 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.4): The paragraph "The Minkowski's
+ theorem" renamed to "Minkowski's theorem. The condition
+ "rank(A) = n" changed to "where A is a matrix of rank n". The
+ note following the definition is reworded so that the
+ conditions are not bracketed. "Linear equalities and
+ inequalities" has been changed to "constraints". "positive
+ multiples of each inequality and ray" has been changed to
+ "positive multiples of each constraint and ray". The word "the"
+ inserted where necessary.
+
+ The paragraph "The Weil's theorem" renamed to "Weil's theorem.
+
+2001-10-11 Thursday 16:07 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Constraint.defs.hh (1.4): In the examples, variable "cs"
+ renamed into "inequal" and "equal".
+
+2001-10-11 Thursday 15:49 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.3): In the definition of rays: P is
+ defined before P_0; A and b are defined; inserted "any point"
+ before r; The comment that a ray is the direction in which P is
+ infinite, moved from within the statement of the proposition to
+ before the proposition and reworded.
+
+ In the definition of lines, wording improved. Comment relating
+ opposite rays with lines made into a separate paragraph. It is
+ not part of the definition.
+
+2001-10-11 Thursday 14:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.4): In the first two examples,
+ variable z now has index 2 (using index 5 was correct, but a bit
+ misleading).
+
+2001-10-11 Thursday 14:33 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.4): IN the first example, variable "g"
+ renamed as "line".
+
+2001-10-11 Thursday 14:32 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/Generator.defs.hh (1.3): Examples modified: - using more
+ meaningful names (line, ray and vertex) for Generator variables;
+ - explained that the first argument of operators | and ^ is
+ meaningless; - explained how to use the second argument of /= to
+ obtain vertices with non-integral coefficients.
+
+2001-10-11 Thursday 14:28 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/GenSys.defs.hh (1.3): In the first example, Variable y(0)
+ changed in Variable y(1) to avoid dimension clash with Variable
+ x(0). In the second example, the computation of the past-the-end
+ iterator moved outside the for-loop.
+
+2001-10-11 Thursday 13:53 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: ConSys.defs.hh (1.2), Constraint.defs.hh (1.3),
+ Constraint.inlines.hh (1.2): Friend members building a constraint
+ using operators < and > removed. Example changed accordingly.
+ In the example on the use of iterators for ConSys, the
+ past-the-end iterator is now computed only once before the
+ for-loop.
+
+2001-10-11 Thursday 13:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: user.doxyconf-html.in (1.2), user.doxyconf-pdf.in (1.2): Do
+ not show inheritance graphs or diagrams. Do not show a thousands
+ times that the only PPL header file is ppl.hh.
+
+2001-10-11 Thursday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * doc/: devref.tex (1.2), user.tex (1.2): Tatiana's email address
+ fixed. Better titles.
+
+2001-10-11 Thursday 13:03 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.2): In the definition of the combinations,
+ the p_1,...,p_k are changed to x_1,...,x_k. In the definition of
+ scalar product: "vector" is changed to "vectors". In the
+ definition of polyhedra there are a number of changes to
+ notation, the definitions of the notation and to the wording.
+
+2001-10-11 Thursday 12:38 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: LinExpression.defs.hh (1.3), Variable.defs.hh (1.2): Some
+ errors (just introduced by me) removed. Methods of class
+ Variable added to group LinExpression.
+
+2001-10-11 Thursday 12:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/LinExpression.defs.hh (1.2): A few changes in the example.
+
+2001-10-11 Thursday 11:22 Elisa Ricci
+
+ * src/Generator.defs.hh (1.2): Added three examples: one for the
+ construction of a line, one for the construction of a ray and the
+ other for the construction of a vertex.
+
+2001-10-11 Thursday 11:19 Elisa Ricci
+
+ * src/GenSys.defs.hh (1.2): Added an example in the comment: it is
+ useful to specify the construction of a set of generators.
+
+2001-10-11 Thursday 11:16 Elisa Ricci
+
+ * src/Constraint.defs.hh (1.2): Added two examples in the comment:
+ one for the building of an inequality and the other for the
+ building of an equality.
+
+2001-10-11 Thursday 08:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.2), Makefile.in (1.2), configure (1.2),
+ configure.in (1.2): Disable the test directory.
+
+2001-10-11 Thursday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.3), src/.cvsignore (1.1): My mistake: BitSet and
+ Integer are subdirectories of src.
+
+2001-10-11 Thursday 08:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.2): Ignore the BitSet and Integer subdirectories:
+ they must be here and must be ignored by CVS.
+
+2001-10-10 Wednesday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * mkinstalldirs (1.2): $Id tag removed.
+
+2001-10-10 Wednesday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.1.1.1), AUTHORS (1.1.1.1), COPYING (1.1.1.1),
+ ChangeLog (1.1.1.1), INSTALL (1.1.1.1), Makefile.am (1.1.1.1),
+ Makefile.in (1.1.1.1), NEWS (1.1.1.1), README (1.1.1.1), TODO
+ (1.1.1.1), acconfig.h (1.1.1.1), aclocal.m4 (1.1.1.1),
+ config.guess (1.1.1.1), config.h.in (1.1.1.1), config.sub
+ (1.1.1.1), configure (1.1.1.1), configure.in (1.1.1.1), depcomp
+ (1.1.1.1), install-sh (1.1.1.1), missing (1.1.1.1), mkinstalldirs
+ (1.1.1.1), ppl.lsm.in (1.1.1.1), ppl.spec.in (1.1.1.1),
+ stamp-h.in (1.1.1.1), doc/Makefile.am (1.1.1.1), doc/Makefile.in
+ (1.1.1.1), doc/Polyhedra.texinfo (1.1.1.1), doc/definitions.dox
+ (1.1.1.1), doc/devref.doxyconf-html.in (1.1.1.1),
+ doc/devref.doxyconf-pdf.in (1.1.1.1), doc/devref.tex (1.1.1.1),
+ doc/gfdl.dox (1.1.1.1), doc/gpl.dox (1.1.1.1), doc/gpl.texi
+ (1.1.1.1), doc/gpl.texinfo (1.1.1.1), doc/texinfo.tex (1.1.1.1),
+ doc/user.doxyconf-html.in (1.1.1.1), doc/user.doxyconf-pdf.in
+ (1.1.1.1), doc/user.tex (1.1.1.1), src/ConSys.cc (1.1.1.1),
+ src/ConSys.defs.hh (1.1.1.1), src/ConSys.inlines.hh (1.1.1.1),
+ src/ConSys.types.hh (1.1.1.1), src/Constraint.cc (1.1.1.1),
+ src/Constraint.defs.hh (1.1.1.1), src/Constraint.inlines.hh
+ (1.1.1.1), src/Constraint.types.hh (1.1.1.1), src/GenSys.cc
+ (1.1.1.1), src/GenSys.defs.hh (1.1.1.1), src/GenSys.inlines.hh
+ (1.1.1.1), src/GenSys.types.hh (1.1.1.1), src/Generator.cc
+ (1.1.1.1), src/Generator.defs.hh (1.1.1.1),
+ src/Generator.inlines.hh (1.1.1.1), src/Generator.types.hh
+ (1.1.1.1), src/LinExpression.cc (1.1.1.1),
+ src/LinExpression.defs.hh (1.1.1.1), src/LinExpression.inlines.hh
+ (1.1.1.1), src/LinExpression.types.hh (1.1.1.1), src/Makefile.am
+ (1.1.1.1), src/Makefile.in (1.1.1.1), src/Matrix.cc (1.1.1.1),
+ src/Matrix.defs.hh (1.1.1.1), src/Matrix.inlines.hh (1.1.1.1),
+ src/Matrix.types.hh (1.1.1.1), src/Polyhedron.cc (1.1.1.1),
+ src/Polyhedron.defs.hh (1.1.1.1), src/Polyhedron.inlines.hh
+ (1.1.1.1), src/Polyhedron.types.hh (1.1.1.1), src/Row.cc
+ (1.1.1.1), src/Row.defs.hh (1.1.1.1), src/Row.inlines.hh
+ (1.1.1.1), src/Row.types.hh (1.1.1.1), src/SatMatrix.cc
+ (1.1.1.1), src/SatMatrix.defs.hh (1.1.1.1),
+ src/SatMatrix.inlines.hh (1.1.1.1), src/SatMatrix.types.hh
+ (1.1.1.1), src/SatRow.cc (1.1.1.1), src/SatRow.defs.hh (1.1.1.1),
+ src/SatRow.inlines.hh (1.1.1.1), src/SatRow.types.hh (1.1.1.1),
+ src/Status.cc (1.1.1.1), src/Status.defs.hh (1.1.1.1),
+ src/Status.inlines.hh (1.1.1.1), src/Status.types.hh (1.1.1.1),
+ src/Variable.cc (1.1.1.1), src/Variable.defs.hh (1.1.1.1),
+ src/Variable.inlines.hh (1.1.1.1), src/Variable.types.hh
+ (1.1.1.1), src/conversion.cc (1.1.1.1), src/globals.cc (1.1.1.1),
+ src/globals.hh (1.1.1.1), src/maxmin.hh (1.1.1.1),
+ src/minimize.cc (1.1.1.1), src/ppl.cc (1.1.1.1), src/protect.sed
+ (1.1.1.1), src/restore.sed (1.1.1.1), src/simplify.cc (1.1.1.1):
+ Imported into the new repository.
+
+2001-10-10 Wednesday 21:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.1), AUTHORS (1.1), COPYING (1.1), ChangeLog (1.1),
+ INSTALL (1.1), Makefile.am (1.1), Makefile.in (1.1), NEWS (1.1),
+ README (1.1), TODO (1.1), acconfig.h (1.1), aclocal.m4 (1.1),
+ config.guess (1.1), config.h.in (1.1), config.sub (1.1),
+ configure (1.1), configure.in (1.1), depcomp (1.1), install-sh
+ (1.1), missing (1.1), mkinstalldirs (1.1), ppl.lsm.in (1.1),
+ ppl.spec.in (1.1), stamp-h.in (1.1), doc/Makefile.am (1.1),
+ doc/Makefile.in (1.1), doc/Polyhedra.texinfo (1.1),
+ doc/definitions.dox (1.1), doc/devref.doxyconf-html.in (1.1),
+ doc/devref.doxyconf-pdf.in (1.1), doc/devref.tex (1.1),
+ doc/gfdl.dox (1.1), doc/gpl.dox (1.1), doc/gpl.texi (1.1),
+ doc/gpl.texinfo (1.1), doc/texinfo.tex (1.1),
+ doc/user.doxyconf-html.in (1.1), doc/user.doxyconf-pdf.in (1.1),
+ doc/user.tex (1.1), src/ConSys.cc (1.1), src/ConSys.defs.hh
+ (1.1), src/ConSys.inlines.hh (1.1), src/ConSys.types.hh (1.1),
+ src/Constraint.cc (1.1), src/Constraint.defs.hh (1.1),
+ src/Constraint.inlines.hh (1.1), src/Constraint.types.hh (1.1),
+ src/GenSys.cc (1.1), src/GenSys.defs.hh (1.1),
+ src/GenSys.inlines.hh (1.1), src/GenSys.types.hh (1.1),
+ src/Generator.cc (1.1), src/Generator.defs.hh (1.1),
+ src/Generator.inlines.hh (1.1), src/Generator.types.hh (1.1),
+ src/LinExpression.cc (1.1), src/LinExpression.defs.hh (1.1),
+ src/LinExpression.inlines.hh (1.1), src/LinExpression.types.hh
+ (1.1), src/Makefile.am (1.1), src/Makefile.in (1.1),
+ src/Matrix.cc (1.1), src/Matrix.defs.hh (1.1),
+ src/Matrix.inlines.hh (1.1), src/Matrix.types.hh (1.1),
+ src/Polyhedron.cc (1.1), src/Polyhedron.defs.hh (1.1),
+ src/Polyhedron.inlines.hh (1.1), src/Polyhedron.types.hh (1.1),
+ src/Row.cc (1.1), src/Row.defs.hh (1.1), src/Row.inlines.hh
+ (1.1), src/Row.types.hh (1.1), src/SatMatrix.cc (1.1),
+ src/SatMatrix.defs.hh (1.1), src/SatMatrix.inlines.hh (1.1),
+ src/SatMatrix.types.hh (1.1), src/SatRow.cc (1.1),
+ src/SatRow.defs.hh (1.1), src/SatRow.inlines.hh (1.1),
+ src/SatRow.types.hh (1.1), src/Status.cc (1.1),
+ src/Status.defs.hh (1.1), src/Status.inlines.hh (1.1),
+ src/Status.types.hh (1.1), src/Variable.cc (1.1),
+ src/Variable.defs.hh (1.1), src/Variable.inlines.hh (1.1),
+ src/Variable.types.hh (1.1), src/conversion.cc (1.1),
+ src/globals.cc (1.1), src/globals.hh (1.1), src/maxmin.hh (1.1),
+ src/minimize.cc (1.1), src/ppl.cc (1.1), src/protect.sed (1.1),
+ src/restore.sed (1.1), src/simplify.cc (1.1): Initial revision
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6e90e07
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
+Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved. Use GNU `make'
+instead.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation. Until the limitation is lifted, you can use
+this workaround:
+
+ CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..6557fb9
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,85 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = . utils src tests interfaces demos doc m4
+
+dist_noinst_SCRIPTS = \
+configure
+
+nodist_noinst_HEADERS = \
+ppl-config.h
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+ppl-config.h: config.h $(srcdir)/ppl-config.sed
+ $(SED) -f $(srcdir)/ppl-config.sed config.h >$@
+
+ppl-config.h.in: $(srcdir)/config.h.in $(srcdir)/ppl-config.sed
+ $(SED) -f $(srcdir)/ppl-config.sed $(srcdir)/config.h.in >$@
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST'; but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+dist-hook:
+ rm -f $(distdir)/ppl-config.h \
+ && $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+ -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+ <$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+ && touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+ && mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+ $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+ -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+ <$(distdir)/configure >$(distdir)/configure.new \
+ && touch $(distdir)/configure.new -r $(distdir)/configure \
+ && mv -f $(distdir)/configure.new $(distdir)/configure \
+ && chmod +x $(distdir)/configure
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST'; but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+EXTRA_DIST = \
+ppl-config.h \
+ppl-config.h.in \
+ppl-config.sed \
+ppl.lsm.in \
+BUGS \
+CREDITS \
+ChangeLog_2001-2008 \
+README.alpha \
+README.arm \
+README.configure \
+README.solaris \
+STANDARDS
+
+DISTCLEANFILES = \
+ppl-config.h
+
+distcleancheck_listfiles = \
+ find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..0842da0
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,988 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/configure $(am__configure_deps) \
+ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/ppl.lsm.in \
+ $(dist_noinst_SCRIPTS) $(dist_noinst_HEADERS) COPYING \
+ ChangeLog INSTALL NEWS README TODO compile config.guess \
+ config.rpath config.sub depcomp install-sh missing ltmain.sh
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = ppl.lsm
+CONFIG_CLEAN_VPATH_FILES =
+SCRIPTS = $(dist_noinst_SCRIPTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(dist_noinst_HEADERS) $(nodist_noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+ $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.xz \
+ $(distdir).zip
+GZIP_ENV = --best
+DIST_TARGETS = dist-xz dist-bzip2 dist-gzip dist-zip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = . utils src tests interfaces demos doc m4
+dist_noinst_SCRIPTS = \
+configure
+
+nodist_noinst_HEADERS = \
+ppl-config.h
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared
+
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST'; but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+EXTRA_DIST = \
+ppl-config.h \
+ppl-config.h.in \
+ppl-config.sed \
+ppl.lsm.in \
+BUGS \
+CREDITS \
+ChangeLog_2001-2008 \
+README.alpha \
+README.arm \
+README.configure \
+README.solaris \
+STANDARDS
+
+DISTCLEANFILES = \
+ppl-config.h
+
+distcleancheck_listfiles = \
+ find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+ppl.lsm: $(top_builddir)/config.status $(srcdir)/ppl.lsm.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) $(HEADERS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am clean clean-cscope clean-generic \
+ clean-libtool cscope cscopelist-am ctags ctags-am dist \
+ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+ dist-tarZ dist-xz dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+ppl-config.h: config.h $(srcdir)/ppl-config.sed
+ $(SED) -f $(srcdir)/ppl-config.sed config.h >$@
+
+ppl-config.h.in: $(srcdir)/config.h.in $(srcdir)/ppl-config.sed
+ $(SED) -f $(srcdir)/ppl-config.sed $(srcdir)/config.h.in >$@
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST'; but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+dist-hook:
+ rm -f $(distdir)/ppl-config.h \
+ && $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+ -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+ <$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+ && touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+ && mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+ $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+ -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+ <$(distdir)/configure >$(distdir)/configure.new \
+ && touch $(distdir)/configure.new -r $(distdir)/configure \
+ && mv -f $(distdir)/configure.new $(distdir)/configure \
+ && chmod +x $(distdir)/configure
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..3fc1d9b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2053 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+Verbatim copying and distribution of this entire article is permitted
+in any medium, provided this notice is preserved.
+
+
+Parma Polyhedra Library NEWS -- history of user-visible changes
+===============================================================
+
+--------------------------------------------------------------------------
+NEWS for version 1.1 (released on October 28, 2013)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o Added a new operator on polyhedra: the positive time elapse.
+
+o In the Java language interface:
+
+ - The constraint/generator/... system classes now extend the ArrayList
+ generic container (rather than Vector);
+
+ - Variable objects are now built from a long (rather than int) value,
+ thereby matching the type used elsewhere for space dimensions;
+
+ - added new static method to Variable class
+ void setStringifier(Variable_Stringifier)
+ where Variable_Stringifier is an interface allowing for
+ customization of the output routine for variable's names
+ (see example in interfaces/Java/tests/Variable_Output_test1.java);
+
+ - added value NOT_EQUAL to enumeration Relation_Symbol.
+
+
+Bugfixes
+========
+
+o Portability improved.
+
+o Fixed a precision regression in Polyhedron method
+ void drop_some_non_integer_points(const Variables_Set&,
+ Complexity_Class);
+
+o In the Java language interface, fixed a C++/Java conversion error
+ whereby the construction of a valid Variable object in JNI code
+ was leading to an exception being thrown. The bug has only been
+ observed on 32-bit builds.
+
+o In the Java interface, fixed declaration of methods
+ void drop_some_non_integer_points(...);
+ so as to accept a Complexity_Class enum value.
+
+o Fixed an issue in method MIP_Problem::OK() whereby the method
+ was trying to enforce a non-invariant condition.
+
+
+--------------------------------------------------------------------------
+NEWS for version 1.0 (released on June 28, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o Significant improvements have been obtained in both time and space
+ resource usage by the definition of data structures and algorithms
+ for the case of "sparse rows", i.e., sequences of coefficients
+ where most of the values are zero.
+
+o The library fully supports two different representations for rows:
+ the "dense" representation is an array-like representation tailored
+ to sequences having most of their coefficients different from zero;
+ the "sparse" representation saves memory space (as well as CPU
+ cycles) when most of the coefficients in the sequence are zero.
+
+o A generic interface allows for a seamless interaction between the
+ dense and the sparse row representation. Most library entities
+ (linear expressions, constraints, generators, congruences, and
+ their systems) can be built using either representation, specified
+ as a constructor's argument.
+
+o As a by-product of this sparse/dense refactoring work, efficiency
+ improvements have been obtained even for those computations that
+ are still based on the dense row representation.
+
+o Reasonable default values for the row representation are provided
+ for each library entity, automatically leading to significant
+ memory space savings even in old client/library code, e.g., when
+ dealing with constraint systems describing weakly relational
+ abstractions such as boxes and octagonal shapes.
+
+o If desired, these default values can be customized to user's needs
+ by changing just a few lines of library code. For instance, the
+ constraint systems stored inside C_Polyhedron and NNC_Polyhedron
+ objects can be made to use the sparse representation by just
+ changing the following line in Polyhedron.defs.hh:
+
+ static const Representation default_con_sys_repr = DENSE;
+
+ to become
+
+ static const Representation default_con_sys_repr = SPARSE;
+
+
+Bugfixes
+========
+
+o Fixed a bug affecting methods
+
+ bool BD_Shape<T>::contains(const BD_Shape& y) const;
+ bool Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const;
+
+ whereby the wrong result was obtained when *this is an empty
+ weakly-relational shape and y is not empty.
+
+o Fixed a bug affecting the PIP solver whereby a wrong result could have
+ been obtained if the input constraint system contained multiple linear
+ equality constraints.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.12.1 (released on April 16, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o In the C, Java, OCaml and Prolog interfaces, modified the signature
+ of the function/method/predicate for setting the deterministic timeout
+ threshold. The new interfaces take two input values, named `unscaled'
+ and `scale', that are used to compute the threshold value as
+ `unscaled * 2^scale'.
+
+o Added new Box<ITV> methods
+
+ bool has_upper_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+ bool has_lower_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+
+ to query a non-empty box for the existence and value of its upper/lower
+ bound on variable `var'. The methods have been also added to all the
+ available language interfaces.
+
+o Two BibTeX databases of papers related to the Parma Polyhedra Library
+ have been added to the distribution (in the `doc' directory).
+
+
+Bugfixes
+========
+
+o Restored the support for deterministic timeouts in the PIP solver
+ (it was removed by accident in PPL 0.12).
+
+o Minor documentation fixes.
+
+o Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.12 (released on February 27, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o New configure options `--with-gmp=DIR', `--with-gmp-include=DIR' and
+ `--with-gmp-lib=DIR' supersede the (now removed) option
+ `--with-gmp-prefix'. (The old option never really worked; hopefully
+ this is the last change in this area.)
+
+o New configuration option `--disable-documentation'. When specified
+ no new documentation is built: only the documentation already present
+ in the source tree is installed upon `make install'.
+
+o The resolution process for PIP_Problem now better exploits the
+ integrality of parameters to simplify the newly generated tautological
+ constraints, the splitting constraints of decision nodes, and the
+ expressions defining artificial parameters.
+
+o The implementations of the MIP and PIP solvers are based on a new
+ data structure leading to significant space and time savings when
+ the tableau matrix is sparse; the benchmarks of the ppl_lpsol demo
+ show an improvement on the average case, that grows when the toughest
+ tests in the benchmark suite are considered.
+
+o When the `--check' option is used, the input data for demo ppl_lpsol
+ is perturbed the same way as GLPK does, thereby allowing for a
+ meaningful comparison of the results obtained.
+
+o The input routine for PPL numeric datatypes has been extended to
+ accept the ISO9899 (C99) hexadecimal floating constant syntax.
+
+o The Parma Watchdog Library has been merged into the
+ Parma Polyhedra Library.
+
+
+Bugfixes
+========
+
+o Corrected a precision bug in methods
+
+ Box<ITV>::upper_bound_assign(const Box&)
+ Box<ITV>::upper_bound_assign_if_exact(const Box&)
+
+ whereby, provided any argument is an empty box and under other rather
+ specific conditions, the computed result was correct but unnecessarily
+ imprecise.
+
+o Corrected a bug in method
+
+ Grid::relation_with(const Constraint&) const
+
+ whereby, under specific conditions, the method was creating invalid
+ Grid_Generator objects and providing an incorrect result.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11.2 (released on February 27, 2011)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Fixed the semantics of the `--disable-fpmath' configure option
+ (which is equivalent to `--enable-fpmath=no'). It now disables all
+ floating point computations and, consequently, all numerical
+ abstractions based on floating point numbers.
+
+o The PPL no longer overwrites the SIGILL signal handler.
+
+o Minor documentation fixes.
+
+o Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11.1 (released on February 20, 2011)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Corrected a problem in the simplification of PIP_Problem solution trees
+ whereby, under specific conditions, the node merging process produced
+ decision nodes that did not satisfy their class invariant.
+
+o Corrected a precision bug in method
+
+ Octagonal_Shape<T>::affine_image()
+
+ whereby in the case of an invertible affine transformation implementing
+ a variable sign symmetry (and optional translation), the computed result
+ was correct but unnecessarily imprecise.
+
+o Corrected a problem in the input method for checked integers whereby,
+ under specific conditions, the input stream state bits were not updated.
+ The bug was only affecting builds using checked integer coefficients.
+
+o Corrected a bug in the OCaml interface, which was affecting functions
+
+ ppl_Pointset_Powerset_<INSTANCE>_get_disjunct.
+
+o Corrected a couple of resource (re-)allocation problems that, under
+ specific conditions, could affect the correctness of Grid constructor
+
+ Grid::Grid(const Box<Interval>& box)
+
+ and NNC_Polyhedron method
+
+ Polyhedron::generalized_affine_image().
+
+o Corrected an efficiency bug in the C language interface function
+
+ ppl_Linear_Expression_add_to_coefficient().
+
+o Corrected an efficiency bug in method
+
+ MIP_Problem::compute_generator().
+
+o Corrected a bug affecting the input routine of ppl_lpsol, whereby
+ the inhomogeneous term of the objective function was disregarded.
+
+o Corrected a bug affecting methods
+
+ Box::CC76_widening_assign(const T&, Iterator, Iterator)
+ Interval::CC76_widening_assign(const From&, Iterator, Iterator)
+
+ whereby a lower bound would not be computed correctly when the two
+ iterators specify an empty list of stop points.
+
+o Fixed a bug affecting
+
+ Interval::Interval(const char* s)
+
+ whereby a wrong interval would be constructed if `s' denotes a number
+ that can only be represented as an infinity.
+
+o Fixed a bug whereby the argument of all the methods
+
+ unconstrain(Variable var)
+
+ was not checked correctly for space dimension compatibility.
+
+o Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11 (released on August 2, 2010)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o New class PIP_Problem provides a Parametric Integer Programming
+ (PIP) problem solver (mainly based on P. Feautrier's
+ specification). The implementation combines a parametric dual
+ simplex algorithm using exact arithmetic with Gomory's cut
+ generation.
+
+o New "deterministic" timeout computation facilities: it is now
+ possible to set computational bounds (on the library calls taking
+ exponential time) that do not depend on the actual elapsed time and
+ hence are independent from the actual computation environment (CPU,
+ operating system, etc.).
+
+o New support for termination analysis via the automatic synthesis of
+ linear ranking functions. Given a sound approximation of a loop,
+ the PPL provides methods to decide whether that approximation
+ admits a linear ranking function (possibly obtaining one as a
+ witness for termination) and to compute the space of all such
+ functions. In addition, methods are provided to obtain the space
+ of all linear quasi-ranking functions, for use in conditional
+ termination analysis.
+
+o New support for approximating computations involving (bounded)
+ machine integers. A general wrapping operator is provided that is
+ parametric with respect to the set of space dimensions (variables)
+ to be wrapped, the width, representation and overflow behavior of
+ all these variables. An optional constraint system can, when
+ given, improve the precision.
+
+o All the PPL semantic objects provide new methods
+
+ void drop_some_non_integer_points(Complexity_Class)
+ void drop_some_non_integer_points(const Variables_Set&,
+ Complexity_Class)
+
+ which possibly tighten the object by dropping some points with
+ non-integer coordinates (for the space dimensions corresponding to
+ `vars'), within a certain computational complexity bound.
+
+o New Linear_Expression methods
+
+ bool is_zero() const
+ bool all_homogeneous_terms_are_zero() const
+
+ return true if and only if `*this' is 0, and if and only if all the
+ homogeneous terms of `*this' are 0, respectively.
+
+o New Linear_Expression methods
+
+ void add_mul_assign(Coefficient_traits::const_reference c, Variable v)
+ void sub_mul_assign(Coefficient_traits::const_reference c, Variable v)
+
+ assign linear expression *this + c * v (resp., *this - c * v) to *this,
+ while avoiding the allocation of a temporary Linear_Expression.
+
+o For the PPL semantic objects, other than the Pointset_Powerset and
+ Partially_Reduced Product, there is a new method:
+
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d)
+
+ This operator computes both the "frequency" (f = freq_n/freq_d)
+ and a value (v = val_n/val_d) closest to zero so that every point
+ in the object satisfies the congruence (expr %= v) / f.
+
+o New reduction operator "Shape_Preserving_Reduction" has been added
+ to the Partially_Reduced_Product abstraction. This operator is
+ aimed at the product of a grid and a shape domain, allowing the
+ bounds of the shape to shrink to touch the points of the grid,
+ such that the new bounds are parallel to the old bounds.
+
+o The Java interface has to be explicitly initialized before use by
+ calling static method Parma_Polyhedra_Library.initialize_library().
+ Initialization makes more explicit the exact point where PPL
+ floating point rounding mode is set; it also allows for the caching
+ of Java classes and field/method IDs, thereby reducing the overhead
+ of native method callbacks.
+
+o The C and Java interfaces now support timeout computation facilities.
+
+o Implementation of general (C and NNC) polyhedra speeded up.
+
+o Implementation of the MIP solver speeded up.
+
+o When the PPL has been configured with
+ CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1", the library initialization
+ procedure checks that the FPU can indeed be controlled and fails if
+ that is not the case.
+
+o New configure option `--with-gmp-prefix' supersedes the (now removed)
+ options `--with-libgmp-prefix' and `--with-libgmpxx-prefix'.
+
+o New configuration option `--with-gmp-build=DIR' allows to use a
+ non-installed build of GMP in DIR.
+
+
+Deprecated and Removed Methods
+==============================
+
+o All methods having a name ending in `_and_minimize' (e.g.,
+ add_constraints_and_minimize, poly_hull_assign_and_minimize, ...)
+ have been removed (they were deprecated in version 0.10).
+
+
+Bugfixes
+========
+
+o Corrected a bug in maximize and mininimize optimization methods of
+ class template Pointset_Powerset, whereby the Boolean value true
+ (indicating successful optimization) was returned for empty powersets.
+
+o Corrected a bug in method
+ bool NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron&);
+ whereby some inexact NNC hulls were incorrectly flagged as exact.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10.2 (released on April 18, 2009)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Correctly detect GMP 4.3.0.
+
+o Fixed the C interface library version information.
+
+o Test program tests/Polyhedron/memory1 disabled on the zSeries s390x
+ platform.
+
+o Makefiles fixed so as to avoid failure of `make -n check'.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10.1 (released on April 14, 2009)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o Added support for cross compilation.
+
+o The configuration script now explicitly checks that a recent enough
+ version of GNU M4 is available if at least one non-C++ interface is
+ enabled (in previous versions this check was not performed and
+ building the library could fail in a mysterious way).
+
+o Robustness improved.
+
+o Some packaging issues have been fixed.
+
+o New macro PPL_DIRTY_TEMP_COEFFICIENT allows users of the C++
+ interface to decrease memory allocation overhead and to improve
+ locality whenever they need a temporary variable of type
+ `Coefficient'.
+
+o The C++, C, Java and OCaml interfaces now provide utility functions
+ to format the textual representations of constraints, congruences
+ and so on. This makes it easy to code debugging prints with line
+ indentation and wrapping.
+
+o The C interface now provides functions of the form
+
+ int ppl_io_asprint_Polyhedron(char** strp, P x)
+
+ where `P' is any opaque pointer to a const PPL object. These
+ functions print `x' to a malloc-allocated string, a pointer to
+ which is returned via `strp'.
+
+o The OCaml interface can now be compiled to native code using ocamlopt.
+
+o New configuration option `--with-mlgmp=DIR' allows to specify the
+ installation directory of the ML GMP package.
+
+o The OCaml interface now supports timeout computation facilities
+ through functions ppl_set_timeout and ppl_reset_timeout. Moreover,
+ new functions ppl_Coefficient_is_bounded, ppl_Coefficient_min,
+ ppl_Coefficient_max and ppl_max_space_dimension have been added.
+
+o The Prolog interfaces are no longer enabled by default in the
+ release tarballs (they are enabled by default in the Git versions).
+
+
+Bugfixes
+========
+
+o Fixed a bug whereby `make check' was failing when the library was
+ configured with the `--disable-watchdog' option.
+
+o Fixed a bug in method
+
+ bool Polyhedron::contains_integer_point() const;
+
+ whereby, under very specific conditions, an empty polyhedron is
+ incorrectly said to contain an integer point.
+
+o Fixed a bug in method
+
+ Partially_Reduced_Product<D1, D2, R>::time_elase_assign(y)
+
+ whereby, if the product y was not already reduced, the operation could
+ lose precision.
+
+o Fixed a bug in the OCaml interface, which was affecting functions
+
+ ppl_Grid_generalized_affine_image_with_congruence
+
+ and
+
+ ppl_Grid_generalized_affine_preimage_with_congruence.
+
+o Fixed a bug in the Grid class that affected the methods
+
+ Grid::bounds_from_above(), Grid::bounds_from_below(),
+ Grid::maximize() and Grid::minimize();
+
+ causing all of them to wrongly return true in certain cases where
+ the grid generators were not minimized.
+
+o Fixed a bug whereby big-endian architectures were not properly
+ recognized by the configuration script.
+
+o Fixed a bug in the Java/OCaml/Prolog interfaces, whereby
+ the method/function/predicate for dropping a disjunct from a
+ Pointset_Powerset object were returning an invalid iterator.
+
+o Fixed a bug in method Octagonal_Shape<T>::affine_image(var, expr)
+ whereby a wrong result was computed under specific conditions.
+
+o Fixed a bug in the OCaml interface, whereby functions of form
+
+ ppl_..._widening_assign_with_tokens
+
+ and
+
+ ppl_..._extrapolation_assign_with_tokens
+
+ could return a wrong number of tokens.
+
+o Fixed a bug in the OCaml interface, whereby functions that returned
+ an OCaml 'unit' type were returning the wrong value.
+
+o Fixed several garbage collection related bugs in the OCaml interface.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10 (released on November 4, 2008)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+The license
+-----------
+
+o The Parma Polyhedra Library is now released under the terms of the
+ version 3 (or later) of the GNU General Public License.
+
+New and renamed classes
+-----------------------
+
+o The new class Octagonal_Shape provides an implementation of the domain
+ of octagonal shapes (including optimized algorithms and a provably
+ correct widening) as proposed by Roberto Bagnara, Patricia Hill,
+ Elena Mazzi and Enea Zaffanella in their SAS 2005 paper.
+
+o A new abstraction called Box has been added. Geometrically
+ speaking, a Box represents a not necessarily closed, iso-oriented
+ hyperrectangle. This can also be seen as the smash product of `n'
+ not necessarily closed and possibly unbounded intervals, where `n'
+ is the space dimension of the box. The Box template class is
+ parametric with respect to a class of intervals.
+
+o A generic implementation of intervals has been added. The template
+ class Interval is parametric on the type used to represent the
+ interval boundaries (all native integer and floating point types
+ are supported as well as unbounded integers and rational numbers
+ provided by GMP). Another class template type parameter allows for
+ the control of a number of other features of the class (such as the
+ ability to represent: open as well as closed boundaries, empty
+ intervals in addition to nonempty ones, intervals of extended
+ number families that contain positive and negative infinities,
+ plain intervals of real numbers and intervals of integer numbers).
+ The Interval class still needs a lot of work and both its
+ implementation and its interface are likely to change significantly:
+ it is released now because it is needed for the Box class and as a
+ kind of technology preview.
+
+o The class LP_Problem has been renamed MIP_Problem and now supports
+ the solution of Mixed Integer (Linear) Programming problems.
+ Support has been added for the incremental solution of MIP
+ problems: it is now possible to add new space dimensions or new
+ constraints to the feasible region, as well as change the objective
+ function and the optimization mode, while still exploiting some of
+ the computational work done before these changes. Support has also
+ been added to change control parameters for the pricing method.
+ This allows a choice between the steepest edge pricing method,
+ either implemented with floating point numbers (default) or with
+ integer coefficients, and the textbook pricing method.
+
+o The PPL semantic object Polyhedra_Powerset has been replaced by the
+ templatic object template <typename PS> Pointset_Powerset that can
+ take any (simple) PPL semantic object for the domain of its
+ disjuncts. In addition to the methods common to all the PPL
+ semantic objects, methods specific to this domain include:
+
+ void add_disjunct(const PS&),
+ void pairwise_reduce(),
+ void omega_reduce() const,
+ bool geometrically_covers(const Pointset_Powerset&) const,
+ bool geometrically_equals(const Pointset_Powerset&) const, and
+ bool simplify_using_context_assign(const Pointset_Powerset&).
+
+o A new abstraction called Partially_Reduced_Product (PRP) has been
+ added. A PRP is a pair of two PPL semantic objects that is
+ parametric on the component domains and on a reduction operator.
+ The PPL currently provides three reduction operators and hence,
+ three different kinds of products:
+
+ - a Direct_Product where the reduction operator is the identity;
+
+ - a Smash_Product where the reduction operator shares emptiness
+ information between the components; and
+
+ - a Constraints_Product where the reduction operator refines each
+ component with the constraints satisfied by the other component.
+
+ The PRP class still needs a lot of work and both its implementation
+ and its interface are likely to change significantly: it is released
+ now as a kind of technology preview and any feedback is welcome.
+
+New and renamed methods
+-----------------------
+
+o All PPL semantic objects can now be constructed from other simple
+ PPL semantic objects. All these constructors have an optional complexity
+ argument with default value allowing algorithms with any complexity to be
+ used.
+
+o New methods
+
+ void restore_pre_PPL_rounding() and
+ void set_rounding_for_PPL()
+
+ allow the FPU rounding mode to be set to what it was before the
+ initialization of the PPL, and to set it (again) so that the PPL
+ abstractions based on floating point numbers work correctly, respectively.
+
+o All PPL semantic objects now provide methods
+
+ void refine_with_constraint(const Constraint&),
+ void refine_with_congruence(const Congruence&),
+ void refine_with_constraints(const Constraint_System&), and
+ void refine_with_congruences(const Congruence_System&).
+
+ These methods are similar to the corresponding `add_' methods.
+ The difference is in the reaction policy when the argument
+ constraint/congruence is not optimally supported by the semantic
+ domain: while the `add_' methods will throw an exception, the
+ `refine_with_' methods will apply an upward approximation semantics.
+
+o Default widening operators of the form:
+
+ void widening_assign(const ABSTRACTION&, unsigned*)
+
+ are now provided for all abstractions except for the Pointset_Powerset
+ abstractions.
+
+o All PPL semantic objects now provide the method
+
+ int32_t hash_code() const
+
+ returning a 32-bit hash code for *this. If x and y are such that
+ x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+o All PPL semantic objects now provide the methods
+
+ memory_size_type total_memory_in_bytes() const
+ memory_size_type external_memory_in_bytes() const
+
+ returning, respectively, the total size in bytes of the memory
+ occupied by the PPL object and the size in bytes of the memory
+ managed by the PPL object.
+
+o For all the PPL semantic objects there are new methods:
+
+ static bool can_recycle_constraint_systems() and
+ static bool can_recycle_congruence_systems()
+
+ that indicate whether or not a PPL semantic object is able to recycle
+ constraints and congruences, respectively.
+
+o For all PPL semantic objects there is a new method:
+
+ bool contains_integer_point() const
+
+ which checks if a PPL semantic object contains an integer point;
+ Note that this is not currently provided for the Partially_Reduced_Product
+ classes.
+
+o For all PPL semantic objects there is a new method:
+
+ bool constrains(Variable) const
+
+ which checks if a dimension is constrained by a PPL semantic object;
+
+o For all PPL semantic objects there are new methods:
+
+ void unconstrain(Variable)
+ void unconstrain(const Variables_Set&)
+
+ which assign, to a PPL semantic object, the cylindrification
+ of the object with respect to one (resp., a set) of its dimensions,
+ as defined by L. Henkin, J. D. Monk, and A. Tarski in Cylindric Algebras:
+ Part I (published by North-Holland in 1971).
+
+o Several methods
+
+ bool is_topologically_closed() const
+ void topological_closure_assign()
+
+ that were provided for just some of the PPL semantic objects are now
+ uniformly available for all the objects.
+
+o Methods using the Congruence and Congruence_System classes
+ such as
+
+ Congruence_System congruences() const,
+ Congruence_System minimized_congruences() const,
+ void add_congruence(const Congruence&),
+ void add_congruences(const Congruence_System&),
+ void add_recycled_congruences(const Congruence_System&), and
+ Poly_Con_Relation relation_with(const Congruence&).
+
+ that were just provided for the Grid domain are now provided for
+ all the PPL semantic objects.
+
+o For the Grid class, as it is not always possible to obtain a
+ Pointset_Powerset<Grid> object that is a finite linear partition of
+ the difference of two grids, we have added the method:
+ std::pair<Grid, Pointset_Powerset<Grid> >
+ approximate_partition(const Grid&, const Grid&, bool&)
+ where the third argument is set to false if there is no
+ finite linear partition.
+
+o In the Congruence class, for consistency with the Constraint class,
+ the methods is_trivial_true() and is_trivial_false() have been renamed
+ as is_tautological() and is_inconsistent(), respectively.
+
+o The methods
+
+ bool Constraint_System::empty() const,
+ bool Generator_System::empty() const,
+ bool Congruence_System::empty() const, and
+ bool Grid_Generator_System::empty() const
+
+ return true if and only if the system in question is empty
+ (i.e., it has no constraints, generators, congruences or grid-generators,
+ respectively).
+
+Deprecated and Removed Methods
+==============================
+
+o As all PPL semantic objects can now be constructed from boxes,
+ the constructors
+
+ template <typename Box> C_Polyhedron(const Box&, From_Bounding_Box),
+ template <typename Box> NNC_Polyhedron(const Box&, From_Bounding_Box),
+ template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+ have been removed. Similarly, as boxes can be constructed from other
+ PPL semantic objects, the method
+
+ template <typename Box>
+ void shrink_bounding_box(Box&, Complexity_Class) const
+
+ has been removed from all the classes.
+
+o The use of methods having a name ending in `_and_minimize' (e.g.,
+ add_constraints_and_minimize, poly_hull_assign_and_minimize, ...)
+ is now deprecated (see the core library documentation for an
+ explanation); their complete removal is planned for version 0.11.
+
+o Class BD_Shape and Grid no longer provide methods such as
+ bds_hull_*, join_*, bds_difference_* and grid_difference_*. The
+ uniformly named methods upper_bound_* and difference_assign should
+ be used instead. For (C and NNC) polyhedra, the poly_hull_* and
+ poly_difference_assign methods have been kept for backward
+ compatibility (users should anyway prefer adopting the uniformly
+ named variants).
+
+o For Grids, the PPL no longer supports covering boxes; hence the constructor
+
+ template <typename Box> Grid(const Box&, From_Covering_Box)
+
+ and also the method
+
+ template <typename Box> void get_covering_box(Box&) const
+
+ have been removed.
+
+Other changes for the C++ interface
+-----------------------------------
+
+o All identifiers containing the strings `less_than_or_equal' or
+ `greater_than_or_equal', any case, have been renamed so as to contain
+ `less_or_equal' or `greater_or_equal', respectively.
+ A similar change also applies to the C interface (see below).
+
+o The `ppl.hh' header file no longer defines macros not prefixed
+ by "PPL_".
+
+o Users of the C++ interface of the library can now decide to disable
+ the automatic initialization mechanism of the PPL. To do so, the
+ preprocessor symbol PPL_NO_AUTOMATIC_INITIALIZATION should be
+ defined before including the <ppl.hh> header file. When automatic
+ initialization is disabled it is imperative to explicitly call the
+ new function
+
+ void Parma_Polyhedra_Library::initialize()
+
+ before using the library. The new function
+
+ void Parma_Polyhedra_Library::finalize() and
+
+ should also be called (to release a small amount of memory) when
+ done with the library.
+
+Changes to the other language interfaces
+----------------------------------------
+
+o Support for language interfaces has been expanded to include
+ OCaml and Java. Thus the PPL now supports interfaces to
+ C++, C, Java, OCaml, Ciao Prolog, GNU Prolog, SICStus Prolog,
+ SWI Prolog, XSB Prolog and YAP Prolog.
+
+o Most of the PPL semantic objects provided by the C++ interface
+ are also supported by all the non-C++ language interfaces. A few
+ domains (in particular, many of the possible Box instantiations)
+ are only available via the C++ interface.
+
+o Almost all the public methods for the PPL semantic objects are
+ provided as methods/functions/predicates in the non-C++ language
+ interfaces with a uniform naming policy. In particular:
+
+ * in the C interface, the methods named
+
+ ppl_Polyhedron_{constraints,generators,congruences}
+ ppl_Polyhedron_minimized_{constraints,generators,congruences}
+
+ have been renamed
+
+ ppl_Polyhedron_get_{constraints,generators,congruences}
+ ppl_Polyhedron_get_minimized_{constraints,generators,congruences},
+
+ respectively;
+
+ * in the Prolog interfaces, the predicates
+
+ ppl_Grid_generalized_image_lhs_rhs/5 and
+ ppl_Grid_generalized_preimage_lhs_rhs/5
+ ppl_Grid_generalized_image/6 and
+ ppl_Grid_generalized_preimage/6
+
+ have been renamed as
+
+ ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+ ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+ ppl_Grid_generalized_image_with_congruence/6
+ ppl_Grid_generalized_preimage_with_congruence/6
+
+ respectively, so as to allow for /4 and /5, resp., versions.
+
+o As already reported for the C++ interface, in the C interface,
+ all identifiers containing the strings `less_than_or_equal' or
+ `greater_than_or_equal', any case, have been renamed so as to contain
+ `less_or_equal' or `greater_or_equal', respectively.
+
+o In the C interface it is no longer an error to call ppl_initialize()
+ or ppl_finalize() multiple times (this matches the behavior of the
+ other non-C++ language interfaces).
+
+Documentation changes
+---------------------
+
+o The documentation for the library has been deeply reorganized and
+ split into several documents: besides the user and developer manuals
+ for the core library and its C++ interface, we now provide separate
+ user and developer manuals for each one of the other available
+ language interfaces (namely, C, Java, OCaml, and Prolog). It is
+ also possible to produce "configuration dependent" variants of the
+ non-C++ language interface manuals, where the contents of the
+ manual take into account the value of configuration option
+ `--enable-instantiations'.
+ All the manuals are provided in HTML, PDF and PostScript formats.
+
+o New man pages libppl(3) and libppl_c(3) have been added. These
+ give short overviews on how to use the PPL in C++ and C programs,
+ respectively, on Unix-like operating systems.
+
+Configuration changes
+---------------------
+
+o Several options have been added to the configuration script. These
+ allow to control the generated language interfaces, the floating
+ point instruction set to be used, the use of Valgrind during `make
+ check', the exclusion of some PPL-based programs from the build.
+ The README.configure file has been updated consequently.
+
+
+Bugfixes
+========
+
+o Fixed bugs that prevented building the library on systems not supported
+ by the Parma Watchdog Library or when the `--disable-watchdog' configure
+ was used.
+
+o Fixed a bug in Grid::constraints() and Grid::minimized_constraints()
+ that caused an internal assertion to fail when the grid had 0 space
+ dimensions.
+
+o Fixed a bug in Linear_System::insert(const Linear_Row&) whereby a
+ wrong result could have been obtained when inserting a not necessarily
+ closed constraint/generator in an empty system having a higher space
+ dimension.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.9 (released on March 12, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o The class Grid provides a complete implementation of the relational
+ domain of rational grids. This can represent all sets that can
+ be expressed by the conjunction of a finite number of congruence
+ equations. Operations provided include everything that is needed
+ in the field of static analysis and verification, including affine
+ images, preimages and their generalizations, grid-difference and
+ widening operators. This is the first time such a complete domain
+ is made freely available to the community.
+
+o Several important portability improvements. Among other things,
+ it is now possible to build only the static libraries or only
+ the shared libraries. (Notice that some interfaces depend on
+ the availability of the shared libraries: these will not be built
+ when shared libraries are disabled.)
+
+
+Bugfixes
+========
+
+o Fixed a bug whereby the SICStus Prolog interface could not be built
+ on x86_64.
+
+o Fixed a bug in an internal method that, under some circumstances,
+ could cause a wrong result to be computed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.8 (released on January 20, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o The class template BD_Shape<T> provides an implementation of the
+ abstract domain of bounded difference shapes. The template type
+ parameter T specifies the basic type used for the inhomogeneous term
+ of bounded difference constraints; it can be instantiated to either
+ GMP's unbounded precision types (mpq_class, mpz_class), native
+ floating point types (float, double), or native integer types
+ (8, 16, 32 and 64 bits wide).
+
+o New class LP_Problem provides an implementation of the
+ primal simplex algorithm using exact arithmetic.
+
+o The new program `ppl-config' returns information about the
+ configuration and the installed components of the PPL.
+ This greatly simplifies the task of writing makefiles and
+ automatic configuration scripts. A manual page for `ppl-config'
+ has also been added.
+
+o New Autoconf function
+
+ AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+
+ allows to test the existence and usability of particular versions of the
+ PPL, defining macros containing the required paths. The simple addition
+ of, e.g.,
+
+ AM_PATH_PPL(0.8)
+
+ to an application's configure.ac file is all that is needed in most
+ cases. Paths to the installed version of the PPL will be detected,
+ the version number will be checked to be at least the one
+ indicated, the variables PPL_CPPFLAGS and PPL_LDFLAGS will be set
+ accordingly and a quick sanity check of the PPL installation will
+ be performed. For more complex tasks, the AM_PATH_PPL function
+ defines the `--with-ppl-prefix' and `--with-ppl-exec-prefix'
+ configure options (useful when the PPL is installed into a
+ non-standard place or when multiple versions of the PPL are
+ installed). AM_PATH_PPL also defines the `--disable-ppltest'
+ configure option to disable the quick sanity check. When something
+ fails, AM_PATH_PPL provides accurate indications about what went
+ wrong and how to fix it. See the sources in m4/ppl.m4 for more
+ information.
+
+o The browse and print versions of the PS and PDF formats of the user
+ manual have been merged into single documents: ppl-user-0.8.pdf and
+ ppl-user-0.8.ps.gz. The equivalent developer reference documents
+ have also been merged.
+
+o One of the possible values for the configuration option
+ `--enable-coefficients' has been renamed from `gmp' to `mpz'.
+
+o New configuration option `--enable-interfaces' allows some or all of
+ the Prolog and C interfaces to be selectively enabled.
+
+o Portability has been further improved.
+
+o Added to C_Polyhedron (resp., NNC_Polyhedron) new method
+
+ bool poly_hull_assign_if_exact(const C_Polyhedron&)
+
+ (resp. bool poly_hull_assign_if_exact(const NNC_Polyhedron&))
+ and its synonym
+
+ bool upper_bound_assign_if_exact(const C_Polyhedron&)
+
+ (resp. bool upper_bound_assign_if_exact(const NNC_Polyhedron&)).
+
+o Added new typedef `element_type' to template Polyhedra_Powerset,
+ which corresponds to the type of the underlying numeric domain.
+
+o Output operators have been added for Generator::Type and
+ Constraint::Type.
+
+o Class Bounding_Box has new method
+
+ Constraint_System Bounding_Box::constraints() const,
+
+ which returns the system of constraints.
+
+o Class Bounding_Box has new widening methods
+
+ Bounding_Box::CC76_widening_assign(const Bounding_Box& y)
+
+ and
+
+ template <typename Iterator>
+ Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+ Iterator first,
+ Iterator last).
+
+o All methods in class Determinate that are specific to the Polyhedra
+ template parameter have been dropped. If needed, they can still be
+ invoked through element().
+
+o Method
+
+ bool Constraint_System::has_strict_inequalities() const
+
+ is now publicly accessible.
+
+o Added Polyhedron methods difference_assign() and join_assign(),
+ behaving as poly_difference_assign() and poly_hull_assign(),
+ so as to have more uniform interfaces.
+
+o The helper function widen_fun_ref() building a limited widening
+ function is now templatic even on the second argument (i.e., the
+ limiting constraint system). The template widening method
+
+ Polyhedra_Powerset<PH>::BHZ03_widening_assign()
+
+ no longer has a default value for the certificate parameter.
+
+o The signatures of Polyhedron methods maximize() and minimize()
+ have been greatly simplified.
+
+o The function template
+
+ template <typename PH>
+ bool check_containment(const PH&, const Polyhedra_Powerset<PH>&)
+
+ now works whenever there exists a lossless conversion mapping an
+ object of type PH into an NNC_Polyhedron (e.g., when PH = BD_Shape).
+ The same holds for methods
+
+ bool Polyhedra_Powerset<PH>::geometrically_covers()
+
+ and
+
+ bool Polyhedra_Powerset<PH>::geometrically_equals().
+
+o Disjuncts can be added to an instance of Polyhedra_Powerset with
+ the new method
+
+ void add_disjunct(const PH& ph).
+
+o The two generalized_affine_image() methods of class Polyhedron
+ are now matched by corresponding methods for computing preimages
+ of affine relations.
+
+o Added to class Polyhedron the method
+
+ void bounded_affine_image(Variable v,
+ const Linear_Expression& lb,
+ const Linear_Expression& ub,
+ Coefficient_traits::const_reference d
+ = Coefficient_one())
+
+ computing the image of the polyhedron according to the
+ transfer relation lb/d <= v' <= ub/d.
+ Also added the corresponding method for computing preimages.
+
+o The enumeration
+
+ Polyhedron::Degenerate_Kind
+
+ has been placed outside of class Polyhedron and renamed as
+
+ Degenerate_Element.
+
+o New output operators in namespace IO_Operators:
+
+ std::ostream& operator<<(std::ostream&, const Constraint::Type&)
+
+ and
+
+ std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+o Added to class Constraint the methods
+
+ bool is_tautological() const
+
+ and
+
+ bool is_inconsistent() const
+
+ returning true when the constraint is always or never satisfied,
+ respectively.
+
+o Added to classes Constraint (resp., Generator) the method
+
+ bool is_equivalent_to(const Constraint& y) const
+
+ (resp., bool is_equivalent_to(const Generator& y) const)
+ which check for semantic equivalence of corresponding class
+ instances. Also made available the (semantic) comparison operators
+ `==' and `!='.
+
+o The swap() methods of classes Linear_Expression, Constraint, Generator,
+ Constraint_System and Generator_System are now publicly accessible.
+
+o Added to classes Constraint and Generator the methods
+
+ void ascii_dump(std::ostream& s) const
+
+ and
+
+ void ascii_load(std::istream& s) const.
+
+o In classes Poly_Con_Relation and Poly_Gen_Relation the methods
+
+ void ascii_dump(std::ostream& s) const
+
+ and
+
+ void ascii_load(std::istream& s) const
+
+ are now publicly accessible.
+
+o All classes which provide the method
+
+ void ascii_dump(std::ostream& s) const
+
+ now also provide the methods
+
+ void ascii_dump() const
+
+ and
+
+ void print() const.
+
+ These methods print to std::cerr the textual and user-level
+ representation (resp.) of the given object. This enables the
+ output of such object representations in GDB.
+
+o New functions added to the C interface:
+
+ int ppl_Coefficient_is_bounded(void),
+ int ppl_Coefficient_min(mpz_t min),
+ int ppl_Coefficient_max(mpz_t max)
+
+ allow C applications to obtain information about the Coefficient
+ integer numerical type.
+
+ The new Prolog interface predicates ppl_Coefficient_is_bounded/0,
+ ppl_Coefficient_max/1 and ppl_Coefficient_min/1 provide the same
+ functionality.
+
+o All predicates in the Prolog interface that require an input list
+ as an argument will now throw an exception if that argument is not
+ a list. Before, some predicates, such as
+ ppl_Polyhedron_remove_space_dimensions/2, would fail.
+
+o In the Prolog interface, the names and arities of the "with_token"
+ widening and extrapolation predicates have been revised to
+ "with_tokens" with an extra argument and the functionality has been
+ revised to match more closely the corresponding C++ interface
+ operators.
+
+o In the Prolog interface, the names and arities of the predicates
+ that create handles for new polyhedra have been revised to match
+ more closely the corresponding C and C++ interface operators. That
+ is, instead of having "c" and/or "nnc" as arguments to indicate the
+ topology of the polyhedron, the topologies are now part of the
+ names of the predicates.
+
+o The SWI-Prolog interface allows now the exchange of unbounded numbers
+ between the PPL and Prolog applications. This requires SWI-Prolog
+ version 5.6.0 or later version. Previous versions of SWI-Prolog
+ are no longer supported.
+
+o The YAP interface allows now the exchange of unbounded numbers
+ between the PPL and Prolog applications. This requires YAP
+ version 5.1.0 or later version. Previous versions of YAP
+ are no longer supported.
+
+o The `ppl_lpsol' demo has now two more options: with `--enumerate' it
+ solves the given linear programming problem by vertex/point
+ enumeration; with `--simplex' (the default) it uses our simplex
+ implementation with exact arithmetic. The `ppl_lpsol' program,
+ which is only built if a suitable version of GLPK is available, is
+ installed into the directory (selectable at configuration time) for
+ user executables.
+
+o Manual pages have been added for the ppl_lpsol and ppl_lcdd
+ programs.
+
+o The new class BD_Shape<T> as well as the "checked" native
+ coefficients selectable with the `--enable-coefficients' configure
+ options, are based on a very general and powerful notion of "number
+ family with a policy". This is made available to the users of the
+ PPL via the wrapper template class Checked_Number<T, P>, where T is
+ the underlying numeric type (native integer or float of any width,
+ unbounded integer or rational) and `P' is a policy specifying
+ things such as whether to check for overflows and other
+ "exceptional" conditions and what to do in such cases. The policy
+ also specifies whether T should be extended with representations
+ for infinities or NAN (Not A Number) and default rounding modes.
+ A complete set of arithmetic functions and operators are provided:
+ they either use the default rounding mode or accept a rounding mode
+ as an extra parameter and, depending on the policy, may return a result
+ that indicates the relation that exists between the true mathematical
+ result and the (possibly approximate) computed result. Input/output
+ functions with the same properties (controlled rounding and indications
+ of the approximations) are also provided.
+
+
+Bugfixes
+========
+
+o Fixed a bug in Polyhedra_Powerset<PH>::concatenate_assign() whereby
+ a temporary Polyhedra_Powerset object was created with the wrong
+ dimension.
+
+o Corrected a memory leak bug in the demo ppl_lpsol.
+
+o Corrected a bug in method
+
+ NNC_Polyhedron::minimized_constraints()
+
+ whereby an internal assertion might have been violated.
+
+o Fixed a bug whereby calling the methods
+
+ Polyhedron::generalized_affine_image()
+
+ on an empty polyhedron could have resulted in an exception thrown.
+
+o Fixed a bug whereby the occurrence of an `out of memory' error during
+ the allocation of a row of integer coefficients could have resulted
+ in a memory leak.
+
+o Fixed a bug affecting the specialized constructors
+
+ Polyhedra_Powerset<NNC_Polyhedron>::
+ Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+ and
+
+ Polyhedra_Powerset<C_Polyhedron>::
+ Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+ whereby the newly built Polyhedra_Powerset object could have been
+ flagged as non-redundant even though it was containing redundant
+ disjuncts. Fixed a similar bug in generic constructor
+
+ Polyhedra_Powerset(const Constraint_System& cs)
+
+ that manifests when `cs' is denoting an empty polyhedron.
+
+--------------------------------------------------------------------------
+NEWS for version 0.7 (released on December 24, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o The new configuration option `--enable-coefficients' allows for the
+ use of alternative (integral) coefficient types. Besides GMP
+ integers, the user can now use checked native integers (8, 16, 32
+ or 64 bits wide). The use of such native coefficients is
+ completely safe, since systematic (yet efficient) overflow
+ detection is performed and, in case of overflow, an exception is
+ raised. GMP coefficients are used by default.
+
+o Significant efficiency improvements have been achieved everywhere.
+
+o We now require GMP 4.1.3 or higher.
+
+o The following classes have been renamed as indicated:
+
+ AskTell -> Ask_Tell
+ BoundingBox -> Bounding_Box
+ ConSys -> Constraint_System
+ GenSys -> Generator_System
+ Integer -> Coefficient
+ LinExpression -> Linear_Expression
+ Polyhedra_PowerSet -> Polyhedra_Powerset
+ PowerSet -> Powerset
+ SatMatrix -> Saturation_Matrix
+ SatRow -> Saturation_Row
+
+o The helper function `widen_fun' has been renamed `widen_fun_ref'.
+
+o New assignment operators allowing to obtain an NNC_Polyhedron from a
+ C_Polyhedron and the other way around. In the latter case, the
+ topological closure of the argument polyhedron is computed.
+
+o New explicit constructors and assignment operators allowing to obtain a
+ Polyhedra_Powerset<NNC_Polyhedron> from a Polyhedra_Powerset<C_Polyhedron>
+ and the other way around. In the latter case, the topological closure
+ of the element polyhedra is computed.
+
+o New explicit constructor Powerset<CS>::Powerset(const CS& d): if `d'
+ is not bottom, builds a powerset containing only `d'; builds the empty
+ powerset otherwise.
+
+o New explicit constructor
+ Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph): if `ph' is
+ not empty, builds a powerset containing only `ph'; builds the empty
+ powerset otherwise.
+
+o New method
+
+ Polyhedra_Powerset::poly_difference_assign(const Polyhedra_Powerset& y)
+
+ assigns to `*this' the poly-difference of `*this' and `y'.
+
+o All the public classes of the library have been endowed with methods
+
+ memory_size_type total_memory_in_bytes() const
+
+ and
+
+ memory_size_type external_memory_in_bytes() const
+
+ returning (lower bounds for) the total size in bytes of the memory
+ occupied by *this and of the memory managed by *this, respectively.
+ The type `memory_size_type' is a newly added unsigned integral type
+ suitable to the representation of such information.
+
+o New method dimension_type Polyhedron::affine_dimension() returns
+ the affine dimension of *this (not to be confused with the dimension
+ of its enclosing vector space) or 0, if *this is empty.
+
+o All the methods changing (i.e., adding, removing, mapping, etc.)
+ the dimensions of the vector space have been renamed so as to avoid
+ any possible ambiguity with the affine dimension of the modified object.
+ For instance,
+
+ Polyhedron::add_dimensions_and_embed(dimension_type m);
+
+ has been renamed as
+
+ Polyhedron::add_space_dimensions_and_embed(dimension_type m);
+
+o The constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+ throws an exception if `y' is not topologically closed. Rather,
+ it constructs a C_Polyhedron representing the topological closure
+ of `y'.
+
+o The following constructors have been made explicit:
+
+ Constraint_System::Constraint_System(const Constraint& c),
+ Generator_System::Generator_System(const Generator& g),
+ C_Polyhedron::C_Polyhedron(const Constraint_System& cs),
+ C_Polyhedron::C_Polyhedron(const Generator_System& cs),
+ C_Polyhedron::C_Polyhedron(Constraint_System& cs),
+ C_Polyhedron::C_Polyhedron(Generator_System& cs),
+ NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs),
+ NNC_Polyhedron::NNC_Polyhedron(const Generator_System& cs),
+ NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs),
+ NNC_Polyhedron::NNC_Polyhedron(Generator_System& cs).
+ Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs).
+
+o Functions in the C interface that compute (space) dimensions
+ no longer return their result. The caller is now required to pass,
+ as an extra argument, a pointer to a memory area where the result
+ will be written. All the C interface functions now use the return
+ value to signal the success or failure of the requested operation.
+
+o Now `make check' runs a number of tests with `ppl_lcdd', comparing
+ the results to expected ones.
+
+o The `ppl_lcdd' demo is now able to parse problems produced by lrs,
+ i.e., where the number of rows of the matrix is omitted and replaced
+ by "*****" (five asterisks).
+
+o The enumeration values of enum Complexity_Class have been renamed
+ POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+o In the Prolog interface, the predicates
+ ppl_new_polyhedron_from_dimension/3 and
+ ppl_new_polyhedron_empty_from_dimension/3 have been replaced by a
+ single predicate ppl_new_polyhedron_from_space_dimension/4 where
+ the (extra) third argument indicates whether the polyhedron to be
+ created should be the universe or the empty polyhedron.
+
+o As the unary plus operator is not in standard Prolog, '+'/1 in linear
+ expressions is no longer supported by the Prolog interface.
+
+
+Bugfixes
+========
+
+o Fixed a bug that was causing an unwanted exception to be thrown
+ when adding to a C_Polyhedron some generators obtained from an
+ NNC_Polyhedron (even though no closure point was being added).
+
+o Fixed a bug in the handling of empty generator systems having
+ a strictly positive space dimension.
+
+o Fixed a bug that was affecting Polyhedra_PowerSet::geometrically_covers()
+ and Polyhedra_PowerSet::geometrically_equals().
+
+o Method C_Polyhedron::H79_widening_assign() now widens the polyhedron
+ itself instead of the homogenized polyhedral cone representing it.
+
+o Fixed a bug that was affecting Polyhedron::H79_widening_assign()
+ as well as all the limited and bounded extrapolation operators.
+
+o Fixed a bug in Polyhedron::map_space_dimensions() that could manifest
+ itself when used with a partial function encoding permutation.
+
+o Fixed a bug in the C interface function
+ ppl_new_Linear_Expression_with_dimension().
+
+o Fixed a bug in the `ppl_lpsol' demo.
+
+o Fixed a bug in Polyhedron::is_universe() that could manifest itself
+ when the polyhedron is described by a generator system that is
+ not in minimal form.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6.1 (released on August 20, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o Some packaging issues have been fixed.
+
+o The documentation has been completed and improved.
+
+o The methods
+
+ Polyhedra_PowerSet::semantically_contains(const Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::semantically_equals(const Polyhedra_PowerSet&)
+
+ have been renamed
+
+ Polyhedra_PowerSet::geometrically_covers(const Polyhedra_PowerSet&) and
+ Polyhedra_PowerSet::geometrically_equals(const Polyhedra_PowerSet& y),
+
+ respectively.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6 (released on August 18, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o New template classes Determinate, PowerSet, and Polyhedra_PowerSet.
+ The first two classes realize, in a completely generic way, the
+ determinate and powerset constructions described by Roberto Bagnara
+ in his 1998, Science of Computer Programming paper. The third class
+ is a specialization of the powerset construction on polyhedra.
+ The powerset construction comes with the generic widening technique
+ proposed by Roberto Bagnara, Patricia Hill and Enea Zaffanella
+ in their VMCAI 2004 paper. Actually, the Polyhedra_PowerSet class
+ provides the first genuine, non-trivial widening ever proposed
+ (let alone made available) on a domain of sets of convex polyhedra.
+
+o New methods
+
+ void Polyhedron::expand_dimension(Variable, dimension_type) and
+ void Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+
+ allow the easy realization of summary dimensions as proposed
+ by Denis Gopan and colleagues in their TACAS 2004 paper.
+
+o A new `demos' directory has been added. In the `ppl_lcdd'
+ subdirectory, this contains a sort of clone of the cddlib test
+ program `lcdd', written using the PPL's C++ interface, together
+ with several example polyhedra in the formats that the program can
+ handle. The `ppl_lpsol' subdirectory contains another demo program
+ that solves linear programming problems by vertex/point
+ enumeration. This is written using the PPL's C interface and comes
+ with several example problems in the Mathematical Programming
+ System (MPS) format. In order to read MPS files, `ppl_lpsol' uses
+ the GNU Linear Programming Kit (GLPK); thus `ppl_lpsol' is only compiled
+ if a suitable version of GLPK is available.
+
+o New macro PPL_VERSION expands to the version string of the library.
+
+o New file README.configure provides additional information about
+ the configuration and compilation of the library.
+
+o The documentation has been improved in various ways.
+
+o The documentation for users, in PostScript, PDF and HTML formats,
+ is now installed in a standard place by `make install'.
+
+o The variable `abandon_exponential_computations' has been renamed
+ `abandon_expensive_computations'.
+
+o The methods
+
+ void Polyhedron::add_constraints(ConSys& cs),
+ void Polyhedron::add_generators(GenSys& gs),
+ bool Polyhedron::add_constraints_and_minimize(ConSys& cs), and
+ bool Polyhedron::add_generators_and_minimize(GenSys& gs)
+
+ have been renamed
+
+ void Polyhedron::add_recycled_constraints(ConSys& cs),
+ void Polyhedron::add_recycled_generators(GenSys& gs),
+ bool Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs), and
+ bool Polyhedron::add_recycled_generators_and_minimize(GenSys& gs),
+
+ respectively. At the same time, the methods
+
+ void Polyhedron::add_constraints(const ConSys& cs),
+ void Polyhedron::add_generators(const GenSys& gs),
+ bool Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+ bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+
+ have been added. Corresponding changes have been made to the C and
+ Prolog interfaces.
+
+o New methods Polyhedron::maximize() and Polyhedron::minimize()
+ for maximizing and minimizing a linear expression subject to the
+ polyhedron.
+
+o New output operator in namespace IO_Operators:
+ std::ostream& operator<<(std::ostream&, const LinExpression&).
+
+o The method Polyhedron::map_dimensions(const PartialFunction& pfunc)
+ has been significantly optimized for the case when `pfunc' is a
+ permutation. A simple "renaming" of the dimensions is now
+ extremely cheap.
+
+o The function Parma_Polyhedra_Library::max_space_dimension() has been
+ given a new semantics and destiny: it returns the maximum space
+ dimension that _all_ the abstractions provided by the library can
+ handle. Each individual abstraction provides its versions of this
+ function. Thus, e.g., NNC_Polyhedron::max_space_dimension()
+ gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+o The type of output functions for the class Variable,
+ `Variable::Output_Function_Type', has been renamed
+ `Variable::output_function_type' and is now defined as
+ void output_function_type(std::ostream& s, const Variable& v).
+ In other words, `v' is now passed by const reference and not by value.
+
+o Thanks to Bruno Haible, it is now possible to use versions of the
+ GMP library installed into nonstandard places. The new configure
+ options `--with-libgmp-prefix[=DIR]' and `--with-libgmpxx-prefix[=DIR]'
+ substitute the old (and not really working) options
+ `--with-gmp-includes=DIR' and `--with-gmp-dir=DIR'.
+
+
+Bugfixes
+========
+
+o Fixed a bug in the C interface function ppl_Polyhedron_map_dimensions()
+ whereby a wrong result was computed.
+
+o Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron&)
+ whereby a wrong result was computed.
+
+o Fixed a bug in the Prolog interface predicate
+ ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+ sometimes computed in the case of an empty polyhedron.
+
+o Fixed a bug in the Prolog interface predicate
+ ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+ failing when given an empty bounding box.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.5 (released on April 28, 2003)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o New methods Polyhedron::BHRZ03_widening_assign() and
+ Polyhedron::BHRZ03_limited_extrapolation_assign(). The BHRZ03 widening
+ is a novel widening that is always more precise than the one, by now
+ standard, we call H79.
+
+o The novel "widening with tokens" technique improves on the good old
+ widening delay technique by refraining from widening only when
+ necessary. Precision is thus increased still guaranteeing
+ convergence. All widening operators can now be supplied with an
+ optional argument, recording the number of available tokens, which
+ is decremented when tokens are used.
+
+o Two new methods have been defined that compute the image of
+ a polyhedron under an affine relation. The first method,
+ Polyhedron::generalized_affine_image(var, relsym, expr, denom),
+ generalizes the classical Polyhedron::affine_image() method by allowing
+ `relsym' to denote any of the relations <, <=, =, >=, >.
+ The second method, Polyhedron::generalized_affine_image(lhs, relsym, rhs),
+ is a variant where an arbitrary linear expression `lhs' is allowed to
+ occur on the left-hand side of the affine relation.
+
+o New constructors to build polyhedra from read-only constraint and
+ generator systems: C_Polyhedron(const ConSys&),
+ C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+ NNC_Polyhedron(const GenSys&). In the C interface the functions
+ taking non-const arguments named ppl_new_<T>_from_<S> have been
+ renamed ppl_new_<T>_recycle_<S>, where <T> is either "C" or "NNC",
+ and <S> is either "ConSys" or "GenSys". The old names have been
+ given to the new const functions.
+
+o New function LinExpression& operator*=(LinExpression&, const Integer&)
+ to multiply (in place) an expression by a scalar.
+
+o The methods Polyhedron::check_empty() and Polyhedron::check_universe()
+ have been renamed is_empty() and is_universe(), respectively.
+
+o New method bool Polyhedron::is_disjoint_from(const Polyhedron& y)
+ returning true if and only `*this' and `y' are disjoint.
+
+o New methods bool Polyhedron::add_constraint_and_minimize(const
+ Constraint&) and bool Polyhedron::add_generator_and_minimize(const
+ Generator&) to add a constraint or a generator and minimizing the
+ result at the same time.
+
+o New method: template <typename PartialFunction>
+ void Polyhedron::map_dimensions(const PartialFunction&).
+ This allows to rename the dimensions of a polyhedron according
+ to a partial function mapping dimensions to dimensions.
+
+o New function LinExpression operator+(const LinExpression&): previously
+ an expressions like `+x2-x3-x4 <= 0' could not constitute valid syntax
+ for a constraint.
+
+o New type `dimension_type': an unsigned integral type for representing
+ space dimensions.
+
+o New function dimension_type max_space_dimension():
+ returns the maximum space dimension this library can handle.
+
+o New function dimension_type not_a_dimension():
+ returns a value that does not designate a valid dimension.
+
+o The method Polyhedron::add_dimensions_and_constraints(ConSys&)
+ has gone. A similar functionality is provided by the new method
+ Polyhedron::concatenate_assign(const Polyhedron&). The same change
+ has, of course, been performed on all the PPL interfaces.
+
+o New macros PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION,
+ and PPL_VERSION_BETA allow the client application to adapt to different
+ versions of the library.
+
+o New function const char* version() returns a character string
+ containing the PPL version.
+
+o New function const char* banner() returns a character string
+ containing information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used
+ to build the library, where to report bugs and where to look
+ for further information.
+
+o The Prolog interface now supports also Ciao Prolog and XSB.
+
+o The C and Prolog interfaces have been extended so as to make more of
+ the library's functionality available to Prolog and C users.
+
+o Timeout computation facilities have been added to the Prolog interfaces:
+ new predicates ppl_set_timeout_exception_atom/1,
+ ppl_timeout_exception_atom/1, ppl_set_timeout/1, ppl_reset_timeout/0.
+
+o Many efficiency improvements have been achieved. Part of these have
+ been obtained by increasing the degree of "laziness" of the library.
+
+o Many portability and standard-conformance improvements: the library
+ can now be compiled with GNU g++, Intel C++ Compiler 7.0 for Linux,
+ and Comeau C/C++ 4.3.0.1 Compiler Front-End; the library has also
+ been tested on a variety of platforms.
+
+o The functions
+
+ Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+ Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+ Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+ Polyhedron::operator>(const Polyhedron&, const Polyhedron&)
+
+ have been removed. The methods
+
+ Polyhedron::contains(const Polyhedron&) and
+ Polyhedron::strictly_contains(const Polyhedron&)
+
+ provide the same functionality.
+
+o The method Polyhedron::limited_H79_widening_assign() has been renamed
+ Polyhedron::limited_H79_extrapolation_assign(). From now on, the name
+ `widening' is reserved for operators that come with a convergence
+ guarantee (i.e., with the ability of turning infinite chains to finite
+ ones). Upper bound operators without such a guarantee contain the word
+ `extrapolation' in their name.
+
+o The renamed method Polyhedron::limited_H79_extrapolation_assign()
+ takes the constraint system argument by const reference (in the
+ old Polyhedron::limited_H79_widening_assign() that argument was
+ passed by non-const reference).
+
+o We now require GMP 4.1.2 or higher.
+
+o In conformance with the C++ standard [17.4.3.1.2], in all the
+ identifiers exported by the C interface, any occurrence
+ of "__" (double underscore) has been replaced by "_" (underscore).
+
+o Added a parameter to Polyhedron::shrink_bounding_box(): this specifies
+ the complexity class of the algorithm to be used.
+
+o All the input/output operators have been confined into namespace
+ Parma_Polyhedra_Library::IO_Operators. This way they do not conflict
+ with the operators the user might want to define.
+
+o The operator Constraint operator>>(const Constraint&, unsigned int)
+ has been removed.
+
+o The method
+ Polyhedron::poly_difference_assign_and_minimize(const Polyhedron&)
+ has been removed.
+
+
+Bugfixes
+========
+
+o Fixed a bug in operator-=(LinExpression&, const LinExpression&)
+ whereby we computed a wrong result in some circumstances.
+
+o Fixed a bug in method Polyhedron::minimized_constraints() that,
+ under some circumstances, could cause a wrong result or a program
+ crash.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.2 (released on October 4, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Fixed a bug in method Polyhedron::add_generator(const Generator&)
+ whereby we were not adding the corresponding closure point when adding
+ a point to an empty NNC polyhedron.
+
+o Fixed a bug in method GenSys::insert(const Generator&) whereby the
+ insertion of a generator into an empty generator system might be
+ mishandled.
+
+o Fixed a bug in method Polyhedron::operator<=(const Polyhedron&)
+ whereby the lines of the polyhedron were handled improperly.
+
+o Fixed a bug in a private method used to implement public method
+ Polyhedron::relation_with(const Generator& g),
+ whereby a wrong result was obtained when `g' was a line.
+
+o Fixed a bug in methods Polyhedron::affine_image() and
+ Polyhedron::affine_preimage(), whereby a wrong result could be
+ obtained when using a negative denominator for the affine expression.
+
+o Fixed a bug in methods Polyhedron::minimized_constraints() and
+ Polyhedron::minimized_generators(), whereby a library invariant
+ was violated when calling these methods on a zero-dimensional space
+ universe NNC polyhedron.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.1 (released on July 30, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron& y)
+ whereby the equality constraints of `y' were ignored (the bug was
+ affecting both C and NNC computations).
+
+o Fixed a bug in Polyhedron::operator=(const Polyhedron& y). This bug,
+ which is triggered in some cases when `y' is empty, should only affect
+ versions of the library obtained with the `--enable-assertions'
+ configuration flag.
+
+o Fixed a bug in Polyhedron::check_universe(), which was returning
+ the wrong result when called on a zero-dim universe polyhedron.
+
+o Fixed a bug in NNC_Polyhedron::NNC_Polyhedron(ConSys& cs) whereby
+ an invariant was violated in case `cs' was empty. This bug
+ should only affect versions of the library obtained with the
+ `--enable-assertions' configuration flag.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4 (released on July 1, 2002)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o Added full support for Not Necessarily Closed (NNC) polyhedra:
+ - creation of strict inequality constraints and mixed constraint
+ systems;
+ - creation of closure points and extended generator systems;
+ - added classes C_Polyhedron (for the representation of Closed
+ polyhedra) and NNC_Polyhedron (the user no longer can create
+ Polyhedron objects);
+ - added topology compatibility checks to avoid mixing objects of
+ the two kinds;
+ - added explicit constructors to create a polyhedron of a given
+ topology kind starting from a polyhedron of the other kind;
+ - added methods Polyhedron::is_topologically_closed() and
+ Polyhedron::topological_closure_assign();
+ - implemented methods Polyhedron::minimized_constraints() and
+ Polyhedron::minimized_generators() to obtain minimal
+ descriptions, both for closed and for NNC polyhedra.
+
+o New method Polyhedron::time_elapse_assign(const Polyhedron&):
+ it computes the time-elapse operation defined in
+
+ N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+ Verification of real-time systems using linear relation analysis.
+ Formal Methods in System Design, 11(2):157-185, 1997.
+
+o New method Polyhedron::is_bounded(): it returns true if and only
+ if the polyhedron is bounded, i.e., finite.
+
+o New methods Polyhedron::bounds_from_above(const LinExpression& e)
+ and Polyhedron::bounds_from_below(const LinExpression& e): they
+ return true if and only if the linear expression `e' is bounded
+ from above/below in the polyhedron.
+
+o New, complete C interface. As a demo, a toy solver for pure linear
+ programming problems has been implemented using this interface.
+ Notice that solving linear programming problems is completely
+ outside the scope of the library. As a consequence the toy provided
+ as a demo is only a toy provided as a demo.
+
+o Revised and completed Prolog interface:
+ - now supporting GNU Prolog, SICStus Prolog, SWI-Prolog and YAP.
+ - all predicates have been renamed to match their intended
+ semantics;
+ - arguments have been reordered where necessary so as to follow the
+ rule "input arguments before output arguments";
+ - predicates added so that all the public methods for Polyhedra in
+ the C++ library are available as Prolog predicates;
+ - the interface has been extended to allow for closed and not
+ necessarily closed polyhedra.
+
+o Added support for timeout-guarded operations. It is now possible
+ for client applications to safely interrupt any exponential
+ computation paths in the library and get control back in a time
+ that is a linear function of the space dimension of the object
+ (polyhedron, system of constraints or generators) of highest
+ dimension on which the library is operating upon.
+
+o The methods named convex_hull_* and convex_difference_*
+ have been renamed poly_hull_* and poly_difference_*.
+
+o All methods named *_and_minimize() now return a Boolean
+ flag that is false if the result is empty.
+
+o All method and variable names containing the word "vertex"
+ have been replaced by names containing the word "point"
+ (some previous uses of the word "vertex" were not formally correct).
+
+o The methods Polyhedron::includes(const Generator&) and
+ Polyhedron::satisfies(const Constraint&) have been removed,
+ as well as the enumeration GenSys_Con_Rel.
+ They have been replaced by the new methods
+ Polyhedron::relation_with(const Generator&) and
+ Polyhedron::relation_with(const Constraint&),
+ which return values of the new enumeration types
+ Relation_Poly_Gen and Relation_Poly_Con, respectively.
+
+o The method Constraint::coefficient(void) has been renamed
+ to Constraint::inhomogeneous_term(void).
+
+o The methods Polyhedron::widening_assign() and
+ Polyhedron::limited_widening_assign() have been renamed
+ Polyhedron::H79_widening_assign() and
+ Polyhedron::limited_H79_widening_assign(), respectively.
+ This emphasizes the fact that they implement extensions
+ of the widenings introduced in
+
+ N. Halbwachs.
+ Determination Automatique de Relations Lineaires
+ Verifiees par les Variables d'un Programme.
+ These de 3eme cicle d'informatique,
+ Universite scientifique et medicale de Grenoble,
+ Grenoble, France, March 1979.
+
+ and described in
+
+ N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+ Verification of real-time systems using linear relation analysis.
+ Formal Methods in System Design, 11(2):157-185, 1997.
+
+o The library no longer calls abort(): appropriate exceptions
+ are always thrown instead.
+
+
+Bugfixes
+========
+
+o Fixed a bug whereby creating a point with a negative denominator
+ caused the library to misbehave.
+
+o Fixed a bug in Polyhedron::add_constraints(ConSys&) whereby
+ we could have created constraint systems having rows with
+ different capacities.
+
+o Several other bugs have been fixed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.3 (released on February 26, 2002)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o The library has been ported under Libtool: it is now possible
+ to build dynamic libraries as well.
+
+o We now use the integer C++ class of GMP to represent the
+ coefficients of constraints and generators, instead of our own
+ (very much inferior) Integer class. The drawback is that we
+ now require GMP 4.0.1 or higher.
+
+o New methods Polyhedron::convex_difference_assign(const Polyhedron&) and
+ Polyhedron::convex_difference_assign_and_minimize(const Polyhedron&).
+ They assign to `*this' the convex hull of the set-theoretic difference
+ of `*this' and the argument (possibly non minimized or minimized,
+ respectively).
+
+o The method Polyhedron::add_generators(GenSys&) is now lazy,
+ i.e., no minimization is performed. Adding generators and
+ minimizing at the same time is provided by the method
+ Polyhedron::add_generators_and_minimize(GenSys&).
+ These methods now throw an exception if the resulting
+ polyhedron would be illegal.
+
+o Some performance improvements.
+
+o Added more test programs.
+
+
+Bugfixes
+========
+
+o Fixed Polyhedron::satisfies(const Constraint&) and
+ Polyhedron::affine_image().
+
+o Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+ was erroneously returning a (random) Boolean: it is now a void
+ method.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.2 (released on November 14, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o Massive API changes. This would not normally be called "a feature",
+ but the old API was very wrong in a number of ways. More API changes
+ are to be expected for the next few releases.
+
+o All user-accessible library methods are now guarded by suitable
+ sanity checks. Exception are thrown whenever the library is not
+ called in the intended way.
+
+o A SICStus Prolog interface is now available. It comes with a somewhat
+ interesting demo: a toy CLP(Q) interpreter.
+
+o Greatly improved documentation.
+
+
+Bugfixes
+========
+
+o Many, many more than we would like to admit.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.1 (released on October 24, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o The library has been released under the GNU General Public License.
diff --git a/README b/README
new file mode 100644
index 0000000..afc4f17
--- /dev/null
+++ b/README
@@ -0,0 +1,1768 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Parma Polyhedra Library (Release 1.0)
+=====================================
+
+This is the release 1.0 of the Parma Polyhedra Library:
+a C++ library for (not necessarily closed) convex polyhedra
+and other numerical abstractions.
+
+To be more precise, the Parma Polyhedra Library (PPL) can handle:
+
+ + all the convex polyhedra that can be defined as the intersection
+ of a finite number of (open or closed) hyperspaces, each described
+ by an equality or a (strict or non-strict) inequality with rational
+ coefficients;
+
+ + some special classes of polyhedra shapes that offer interesting
+ complexity/precision tradeoffs: boxes, bounded difference shapes
+ and octagonal shapes defined over a wide choice of integer,
+ rational or floating point coefficients;
+
+ + all grids (or, equivalently, lattices): a grid is defined by a set
+ of congruence relations with rational coefficients and consists of
+ the set of all points that satisfy these relations;
+
+ + finite powersets and products of the above;
+
+ + linear programming problems, solved with an implementation of the
+ primal simplex algorithm using exact arithmetic;
+
+ + parametric integer programming problems;
+
+ + termination analysis problems, via the automatic synthesis of
+ linear ranking functions.
+
+The Parma Polyhedra Library is:
+
+ + user friendly:
+ you write `x + 2*y + 5*z <= 7' when you mean it;
+
+ + fully dynamic:
+ available virtual memory is the only limitation to the dimension
+ of anything;
+
+ + written in standard C++:
+ meant to be portable;
+
+ + exception-safe:
+ never leaks resources or leaves invalid object fragments around;
+
+ + rather efficient:
+ and we hope to make it even more so;
+
+ + thoroughly documented:
+ perhaps not ``literate programming'' but close enough;
+
+ + free software:
+ distributed under the terms of the GNU General Public License.
+
+See the file COPYING for licensing information.
+See the file INSTALL for generic build and installation instructions.
+See the file README.configure for more specific configuration instructions.
+See the file NEWS for recent project news.
+See the file BUGS for known bugs and how to report new ones.
+See the file CREDITS for a list of people, projects and organizations
+that made the PPL a reality.
+See http://bugseng.com/products/ppl/ for more information on the PPL.
+For any additional questions you might have, please do not hesitate to
+write to ppl-devel at cs.unipr.it.
+
+Here is the contents of the PPL 1.0 source distribution
+(41 directories, 1616 files):
+
+ppl-1.0
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- ChangeLog_2001-2008
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- README.alpha
+|-- README.arm
+|-- README.configure
+|-- README.solaris
+|-- STANDARDS
+|-- TODO
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.rpath
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- demos
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- ppl_lcdd
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- examples
+| | | |-- 1d.ine
+| | | |-- 1da.ine
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README
+| | | |-- allzero.ine
+| | | |-- ccc4.ext
+| | | |-- ccc5.ext
+| | | |-- ccc6.ext
+| | | |-- ccp4.ext
+| | | |-- ccp5.ext
+| | | |-- ccp6.ext
+| | | |-- cp4.ext
+| | | |-- cp4.ine
+| | | |-- cp5.ext
+| | | |-- cp5.ine
+| | | |-- cp6.ext
+| | | |-- cp6.ine
+| | | |-- cp7.ext
+| | | |-- cross10.ine
+| | | |-- cross12.ine
+| | | |-- cross4.ine
+| | | |-- cross6.ine
+| | | |-- cross8.ine
+| | | |-- cube.ext
+| | | |-- cube.ine
+| | | |-- cube10.ine
+| | | |-- cube12.ine
+| | | |-- cube3.ine
+| | | |-- cube6.ine
+| | | |-- cube8.ine
+| | | |-- cubetop.ine
+| | | |-- cubocta.ine
+| | | |-- cut16_11.ext
+| | | |-- cut32_16.ext
+| | | |-- cyc.ine
+| | | |-- cyclic10-4.ext
+| | | |-- cyclic12-6.ext
+| | | |-- cyclic14-8.ext
+| | | |-- cyclic16-10.ext
+| | | |-- cyclic17_8.ine
+| | | |-- cyclic25_13.ext
+| | | |-- dcube10.ext
+| | | |-- dcube12.ext
+| | | |-- dcube3.ext
+| | | |-- dcube6.ext
+| | | |-- dcube8.ext
+| | | |-- diamond.ine
+| | | |-- dodeca_m.ine
+| | | |-- ex1.ine
+| | | |-- grcubocta.ine
+| | | |-- hexocta.ine
+| | | |-- icododeca_m.ine
+| | | |-- in0.ine
+| | | |-- in1.ine
+| | | |-- in2.ine
+| | | |-- in3.ine
+| | | |-- in4.ine
+| | | |-- in5.ine
+| | | |-- in6.ine
+| | | |-- in7.ine
+| | | |-- infeas.ine
+| | | |-- integralpoints.ine
+| | | |-- irbox20-4.ext
+| | | |-- irbox200-4.ext
+| | | |-- kkd18_4.ine
+| | | |-- kkd27_5.ine
+| | | |-- kkd38_6.ine
+| | | |-- kq20_11_m.ine
+| | | |-- metric40_11.ine
+| | | |-- metric80_16.ine
+| | | |-- mit.ine
+| | | |-- mit288-281.ine
+| | | |-- mit31-20.ine
+| | | |-- mit41-16.ine
+| | | |-- mit708-9.ine
+| | | |-- mit71-61.ine
+| | | |-- mit90-86.ine
+| | | |-- mp5.ext
+| | | |-- mp5.ine
+| | | |-- mp5a.ine
+| | | |-- mp6.ine
+| | | |-- nonfull.ine
+| | | |-- origin.ine
+| | | |-- prodst62.ext
+| | | |-- project1_m.ine
+| | | |-- project1res.ine
+| | | |-- project2_m.ine
+| | | |-- project2res.ine
+| | | |-- rcubocta.ine
+| | | |-- redcheck.ext
+| | | |-- reg24-5.ext
+| | | |-- reg24-5.ine
+| | | |-- reg600-5_m.ext
+| | | |-- rhomtria_m.ine
+| | | |-- sample.ine
+| | | |-- sampleh1.ine
+| | | |-- sampleh2.ine
+| | | |-- sampleh3.ine
+| | | |-- sampleh4.ine
+| | | |-- sampleh5.ine
+| | | |-- sampleh6.ine
+| | | |-- sampleh7.ine
+| | | |-- sampleh8.ine
+| | | |-- samplev1.ext
+| | | |-- samplev2.ext
+| | | |-- samplev3.ext
+| | | |-- trunc10.ine
+| | | |-- trunc7.ine
+| | | |-- tsp5.ext
+| | | `-- tsp5.ine
+| | |-- expected_int16
+| | |-- expected_int16_a
+| | |-- expected_int32
+| | |-- expected_int32_a
+| | |-- expected_int64
+| | |-- expected_int64_a
+| | |-- expected_int8
+| | |-- expected_int8_a
+| | |-- expected_mpz
+| | |-- expected_mpz_a
+| | |-- ppl_lcdd.1
+| | `-- ppl_lcdd.cc
+| |-- ppl_lpsol
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- dummy.cc
+| | |-- examples
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README
+| | | |-- adlittle.mps
+| | | |-- afiro.mps
+| | | |-- bgprtr.mps
+| | | |-- blend.mps
+| | | |-- boeing1.mps
+| | | |-- boeing2.mps
+| | | |-- egout.mps
+| | | |-- ex1.mps
+| | | |-- ex12.mps
+| | | |-- kb2.mps
+| | | |-- lseu.mps
+| | | |-- markshare1.mps
+| | | |-- markshare2.mps
+| | | |-- mas74.mps
+| | | |-- mas76.mps
+| | | |-- mip.mps
+| | | |-- modglob.mps
+| | | |-- noswot.mps
+| | | |-- opt1217.mps
+| | | |-- p0033.mps
+| | | |-- pk1.mps
+| | | |-- rout.mps
+| | | |-- sample.mps
+| | | |-- sc105.mps
+| | | |-- sc50a.mps
+| | | |-- sc50b.mps
+| | | |-- ship08l.mps
+| | | `-- unboundedmin.mps
+| | |-- expected_int16
+| | |-- expected_int16_a
+| | |-- expected_int32
+| | |-- expected_int32_a
+| | |-- expected_int64
+| | |-- expected_int64_a
+| | |-- expected_int8
+| | |-- expected_int8_a
+| | |-- expected_mpz
+| | |-- expected_mpz_a
+| | |-- glpk_set_d_eps.c
+| | |-- ppl_lpsol.1
+| | `-- ppl_lpsol.c
+| `-- ppl_pips
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- examples
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- README
+| | |-- big.pip
+| | |-- brisebarre.pip
+| | |-- cg1.pip
+| | |-- esced.pip
+| | |-- ex2.pip
+| | |-- fimmel.pip
+| | |-- invert.dat
+| | |-- linear.dat
+| | |-- lineri.dat
+| | |-- loz.dat
+| | |-- max.dat
+| | |-- max.pip
+| | |-- maxb.dat
+| | |-- pairi.dat
+| | |-- petit.dat
+| | |-- rairoi.dat
+| | |-- sor1d.pip
+| | |-- square.pip
+| | |-- test02.dat
+| | `-- test12i.dat
+| |-- expected_int16
+| |-- expected_int16_a
+| |-- expected_int32
+| |-- expected_int32_a
+| |-- expected_int64
+| |-- expected_int64_a
+| |-- expected_int8
+| |-- expected_int8_a
+| |-- expected_mpz
+| |-- expected_mpz_a
+| |-- ppl_pips.1
+| `-- ppl_pips.cc
+|-- depcomp
+|-- doc
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- README.doc
+| |-- bugseng_logo.pdf
+| |-- definitions.dox
+| |-- devref-language-interface.doxyconf.in
+| |-- devref-language-interface.tex
+| |-- devref.doxyconf-html.in
+| |-- devref.doxyconf-latex.in
+| |-- devref.tex
+| |-- fdl.dox
+| |-- fdl.pdf
+| |-- fdl.ps.gz
+| |-- fdl.tex
+| |-- fdl.txt
+| |-- gpl.dox
+| |-- gpl.pdf
+| |-- gpl.ps.gz
+| |-- gpl.tex
+| |-- gpl.txt
+| |-- interfaces-html.sed
+| |-- interfaces-latex.sed
+| |-- libppl.3
+| |-- libppl_c.3
+| |-- ppl-config.1
+| |-- ppl-user-1.0-html.tar.gz
+| |-- ppl-user-1.0.pdf
+| |-- ppl-user-1.0.ps.gz
+| |-- ppl-user-c-interface-1.0-html.tar.gz
+| |-- ppl-user-c-interface-1.0.pdf
+| |-- ppl-user-c-interface-1.0.ps.gz
+| |-- ppl-user-ocaml-interface-1.0-html.tar.gz
+| |-- ppl-user-ocaml-interface-1.0.pdf
+| |-- ppl-user-ocaml-interface-1.0.ps.gz
+| |-- ppl-user-prolog-interface-1.0-html.tar.gz
+| |-- ppl-user-prolog-interface-1.0.pdf
+| |-- ppl-user-prolog-interface-1.0.ps.gz
+| |-- ppl.bib
+| |-- ppl.sty
+| |-- ppl_citations.bib
+| |-- ppl_logo.pdf
+| |-- ppl_logo_no_ppl.pdf
+| |-- user-language-interface.doxyconf.in
+| |-- user-language-interface.tex
+| |-- user.doxyconf-html.in
+| |-- user.doxyconf-latex.in
+| `-- user.tex
+|-- install-sh
+|-- instchk.hh
+|-- interfaces
+| |-- C
+| | |-- C_interface.dox
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ppl_c.h.dist
+| | |-- ppl_c_header.h
+| | |-- ppl_c_implementation_common.cc
+| | |-- ppl_c_implementation_common_defs.hh
+| | |-- ppl_c_implementation_common_inlines.hh
+| | |-- ppl_c_version.h.in
+| | |-- ppl_interface_generator_c_cc_code.m4
+| | |-- ppl_interface_generator_c_cc_files.m4
+| | |-- ppl_interface_generator_c_h.m4
+| | |-- ppl_interface_generator_c_h_code.m4
+| | |-- ppl_interface_generator_c_hh_files.m4
+| | |-- ppl_interface_generator_c_procedure_generators.m4
+| | `-- tests
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- formatted_output.c
+| | |-- pip_test.c
+| | |-- ppl_c_test.cc
+| | |-- ppl_c_test.h
+| | |-- print_to_buffer.c
+| | |-- print_to_buffer.h
+| | |-- watchdog1.c
+| | `-- weightwatch1.c
+| |-- Java
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- README.java
+| | |-- jni
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- ppl_interface_generator_java_classes_cc_code.m4
+| | | |-- ppl_interface_generator_java_classes_cc_files.m4
+| | | |-- ppl_java_common.cc
+| | | |-- ppl_java_common_defs.hh
+| | | |-- ppl_java_common_inlines.hh
+| | | `-- ppl_java_globals.cc
+| | |-- parma_polyhedra_library
+| | | |-- Artificial_Parameter.java
+| | | |-- Artificial_Parameter_Sequence.java
+| | | |-- Bounded_Integer_Type_Overflow.java
+| | | |-- Bounded_Integer_Type_Representation.java
+| | | |-- Bounded_Integer_Type_Width.java
+| | | |-- By_Reference.java
+| | | |-- Coefficient.java
+| | | |-- Complexity_Class.java
+| | | |-- Congruence.java
+| | | |-- Congruence_System.java
+| | | |-- Constraint.java
+| | | |-- Constraint_System.java
+| | | |-- Control_Parameter_Name.java
+| | | |-- Control_Parameter_Value.java
+| | | |-- Degenerate_Element.java
+| | | |-- Domain_Error_Exception.java
+| | | |-- Fake_Class_for_Doxygen.java
+| | | |-- Generator.java
+| | | |-- Generator_System.java
+| | | |-- Generator_Type.java
+| | | |-- Grid_Generator.java
+| | | |-- Grid_Generator_System.java
+| | | |-- Grid_Generator_Type.java
+| | | |-- IO.java
+| | | |-- Invalid_Argument_Exception.java
+| | | |-- Length_Error_Exception.java
+| | | |-- Linear_Expression.java
+| | | |-- Linear_Expression_Coefficient.java
+| | | |-- Linear_Expression_Difference.java
+| | | |-- Linear_Expression_Sum.java
+| | | |-- Linear_Expression_Times.java
+| | | |-- Linear_Expression_Unary_Minus.java
+| | | |-- Linear_Expression_Variable.java
+| | | |-- Logic_Error_Exception.java
+| | | |-- MIP_Problem.java
+| | | |-- MIP_Problem_Status.java
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- Optimization_Mode.java
+| | | |-- Overflow_Error_Exception.java
+| | | |-- PIP_Decision_Node.java
+| | | |-- PIP_Problem.java
+| | | |-- PIP_Problem_Control_Parameter_Name.java
+| | | |-- PIP_Problem_Control_Parameter_Value.java
+| | | |-- PIP_Problem_Status.java
+| | | |-- PIP_Solution_Node.java
+| | | |-- PIP_Tree_Node.java
+| | | |-- PPL_Object.java
+| | | |-- Pair.java
+| | | |-- Parma_Polyhedra_Library.java
+| | | |-- Partial_Function.java
+| | | |-- Poly_Con_Relation.java
+| | | |-- Poly_Gen_Relation.java
+| | | |-- Relation_Symbol.java
+| | | |-- Timeout_Exception.java
+| | | |-- Variable.java
+| | | |-- Variables_Set.java
+| | | |-- ppl_interface_generator_java_classes_java.m4
+| | | `-- ppl_interface_generator_java_classes_java_code.m4
+| | |-- ppl_interface_generator_java_procedure_generators.m4
+| | `-- tests
+| | |-- C_Polyhedron_test1.java
+| | |-- MIP_Problem_test1.java
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- NNC_Polyhedron_test1.java
+| | |-- PIP_Problem_test1.java
+| | |-- PPL_Test.java
+| | |-- Parma_Polyhedra_Library_test1.java
+| | |-- Parma_Polyhedra_Library_test2.java
+| | |-- Test_Executor.java
+| | |-- ppl_interface_generator_java_test_java.m4
+| | |-- ppl_interface_generator_java_test_java_code.m4
+| | `-- ppl_java_tests_common
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- OCaml
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- OCaml_interface.dox
+| | |-- README.ocaml
+| | |-- ppl_interface_generator_ocaml_cc_code.m4
+| | |-- ppl_interface_generator_ocaml_cc_files.m4
+| | |-- ppl_interface_generator_ocaml_hh_code.m4
+| | |-- ppl_interface_generator_ocaml_hh_files.m4
+| | |-- ppl_interface_generator_ocaml_ml.m4
+| | |-- ppl_interface_generator_ocaml_ml_code.m4
+| | |-- ppl_interface_generator_ocaml_mli.m4
+| | |-- ppl_interface_generator_ocaml_mli_code.m4
+| | |-- ppl_interface_generator_ocaml_procedure_generators.m4
+| | |-- ppl_ocaml_common.cc
+| | |-- ppl_ocaml_common_defs.hh
+| | |-- ppl_ocaml_common_inlines.hh
+| | |-- ppl_ocaml_globals.ml
+| | |-- ppl_ocaml_globals.mli
+| | `-- tests
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ppl_interface_generator_ocaml_test_ml.m4
+| | |-- ppl_interface_generator_ocaml_test_ml_code.m4
+| | |-- ppl_ocaml_tests_common
+| | `-- test1.ml
+| |-- Prolog
+| | |-- Ciao
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README.ciao
+| | | |-- ciao_cfli.hh
+| | | |-- ciao_clpq.pl
+| | | |-- ciao_clpq2.pl
+| | | |-- ciao_efli.cc
+| | | |-- ciao_efli.hh
+| | | |-- ciao_pl_check.pl
+| | | |-- ppl_interface_generator_ciao_pl.m4
+| | | |-- ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+| | | `-- ppl_prolog_sysdep.hh
+| | |-- GNU
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README.gprolog
+| | | |-- gnu_pl_check.pl
+| | | |-- gnu_prolog_generated_test.pl
+| | | |-- gp_clpq.pl
+| | | |-- gprolog_cfli.hh
+| | | |-- gprolog_efli.cc
+| | | |-- gprolog_efli.hh
+| | | |-- ppl_interface_generator_gprolog_pl.m4
+| | | `-- ppl_prolog_sysdep.hh
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- Prolog_configured_interface.dox
+| | |-- Prolog_interface.dox
+| | |-- Prolog_interface_compilation.dox
+| | |-- Prolog_interface_sysdep.dox
+| | |-- Prolog_interface_sysindep.dox
+| | |-- Prolog_interface_sysindep_domains.dox
+| | |-- SICStus
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- ppl_interface_generator_sicstus_sd_cc.m4
+| | | |-- ppl_prolog_sysdep.hh
+| | | |-- ppl_sicstus.pl
+| | | |-- sicstus_cfli.cc
+| | | |-- sicstus_cfli.h
+| | | |-- sicstus_cfli.ic
+| | | |-- sicstus_efli.cc
+| | | |-- sicstus_efli.hh
+| | | |-- sp_clpq.pl
+| | | |-- sp_pl_check.pl
+| | | `-- sp_prolog_generated_test.pl
+| | |-- SWI
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README.swiprolog
+| | | |-- pl_clpq.cc
+| | | |-- pl_clpq.pl
+| | | |-- ppl_interface_generator_swiprolog_cc.m4
+| | | |-- ppl_pl.cc
+| | | |-- ppl_prolog_sysdep.hh
+| | | |-- ppl_swiprolog.pl
+| | | |-- swi_cfli.hh
+| | | |-- swi_efli.cc
+| | | |-- swi_efli.hh
+| | | |-- swi_pl_check.pl
+| | | `-- swi_prolog_generated_test.pl
+| | |-- XSB
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- ppl_interface_generator_xsb_H.m4
+| | | |-- ppl_interface_generator_xsb_cc.m4
+| | | |-- ppl_interface_generator_xsb_hh.m4
+| | | |-- ppl_interface_generator_xsb_prolog_generated_test_P.m4
+| | | |-- ppl_prolog_sysdep.hh
+| | | |-- xsb_cfli.hh
+| | | |-- xsb_clpq.P
+| | | |-- xsb_clpq2.P
+| | | |-- xsb_efli.cc
+| | | |-- xsb_efli.hh
+| | | `-- xsb_pl_check.P
+| | |-- YAP
+| | | |-- Makefile.am
+| | | |-- Makefile.in
+| | | |-- README.yap
+| | | |-- ppl_interface_generator_yap_cc.m4
+| | | |-- ppl_prolog_sysdep.hh
+| | | |-- ppl_yap.pl
+| | | |-- yap_cfli.hh
+| | | |-- yap_clpq.pl
+| | | |-- yap_clpq2.pl
+| | | |-- yap_efli.cc
+| | | |-- yap_efli.hh
+| | | |-- yap_pl_check.pl
+| | | `-- yap_prolog_generated_test.pl
+| | |-- ppl_interface_generator_prolog_cc_code.m4
+| | |-- ppl_interface_generator_prolog_cc_files.m4
+| | |-- ppl_interface_generator_prolog_dox.m4
+| | |-- ppl_interface_generator_prolog_dox_code.m4
+| | |-- ppl_interface_generator_prolog_hh_code.m4
+| | |-- ppl_interface_generator_prolog_hh_files.m4
+| | |-- ppl_interface_generator_prolog_procedure_generators.m4
+| | |-- ppl_interface_generator_prolog_systems.m4
+| | |-- ppl_prolog_common.cc
+| | |-- ppl_prolog_common_defs.hh
+| | |-- ppl_prolog_common_inlines.hh
+| | `-- tests
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ack.clpq
+| | |-- ackn.clpq
+| | |-- clpq.pl
+| | |-- clpq2.pl
+| | |-- expected_clpq2_int16
+| | |-- expected_clpq2_int16_a
+| | |-- expected_clpq2_int32
+| | |-- expected_clpq2_int32_a
+| | |-- expected_clpq2_int64
+| | |-- expected_clpq2_int64_a
+| | |-- expected_clpq2_int8
+| | |-- expected_clpq2_int8_a
+| | |-- expected_clpq2_mpz
+| | |-- expected_clpq2_mpz_a
+| | |-- expected_clpq_int16
+| | |-- expected_clpq_int16_a
+| | |-- expected_clpq_int32
+| | |-- expected_clpq_int32_a
+| | |-- expected_clpq_int64
+| | |-- expected_clpq_int64_a
+| | |-- expected_clpq_int8
+| | |-- expected_clpq_int8_a
+| | |-- expected_clpq_mpz
+| | |-- expected_clpq_mpz_a
+| | |-- expected_pchk_int16
+| | |-- expected_pchk_int16_a
+| | |-- expected_pchk_int32
+| | |-- expected_pchk_int32_a
+| | |-- expected_pchk_int64
+| | |-- expected_pchk_int64_a
+| | |-- expected_pchk_int8
+| | |-- expected_pchk_int8_a
+| | |-- expected_pchk_mpz
+| | |-- expected_pchk_mpz_a
+| | |-- expected_pgt
+| | |-- fib.clpq
+| | |-- mc91.clpq
+| | |-- pl_check.pl
+| | |-- ppl_interface_generator_prolog_generated_test_pl.m4
+| | |-- ppl_interface_generator_prolog_generated_test_pl_code.m4
+| | |-- ppl_prolog_generated_test_common.pl
+| | |-- schedule.clpq
+| | |-- script_clpq
+| | |-- script_clpq2
+| | |-- script_clpq2_int8
+| | |-- smm.clpq
+| | |-- sumto.clpq
+| | `-- tak.clpq
+| |-- interfaced_boxes.hh
+| |-- marked_pointers.hh
+| |-- ppl_interface_generator_common.m4
+| |-- ppl_interface_generator_common_dat.m4
+| |-- ppl_interface_generator_common_procedure_generators.m4
+| `-- ppl_interface_generator_copyright
+|-- ltmain.sh
+|-- m4
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- ac_check_ciao.m4
+| |-- ac_check_classpath.m4
+| |-- ac_check_fpu_control.m4
+| |-- ac_check_gmp.m4
+| |-- ac_check_sicstus_prolog.m4
+| |-- ac_check_swi_prolog.m4
+| |-- ac_check_xsb_prolog.m4
+| |-- ac_check_yap.m4
+| |-- ac_cxx_attribute_weak.m4
+| |-- ac_cxx_double_binary_format.m4
+| |-- ac_cxx_float_binary_format.m4
+| |-- ac_cxx_ieee_inexact_flag.m4
+| |-- ac_cxx_limit_memory.m4
+| |-- ac_cxx_long_double_binary_format.m4
+| |-- ac_cxx_plain_char_is_signed.m4
+| |-- ac_cxx_proper_long_double.m4
+| |-- ac_cxx_zero_length_arrays.m4
+| |-- ac_prog_jar.m4
+| |-- ac_prog_java.m4
+| |-- ac_prog_javac.m4
+| |-- ac_prog_javah.m4
+| |-- ac_text_md5sum.m4
+| |-- libtool.m4
+| |-- ltoptions.m4
+| |-- ltsugar.m4
+| |-- ltversion.m4
+| |-- lt~obsolete.m4
+| |-- m4.m4
+| |-- ocaml.m4
+| |-- ppl.m4
+| `-- ppl_c.m4
+|-- missing
+|-- mkinstalldirs
+|-- ppl-config.h.in
+|-- ppl-config.sed
+|-- ppl.lsm.in
+|-- src
+| |-- BDS_Status.idefs.hh
+| |-- BDS_Status_inlines.hh
+| |-- BD_Shape.cc
+| |-- BD_Shape_defs.hh
+| |-- BD_Shape_inlines.hh
+| |-- BD_Shape_templates.hh
+| |-- BD_Shape_types.hh
+| |-- BHRZ03_Certificate.cc
+| |-- BHRZ03_Certificate_defs.hh
+| |-- BHRZ03_Certificate_inlines.hh
+| |-- BHRZ03_Certificate_types.hh
+| |-- BUGS.cc.dist
+| |-- BUGS.hh.dist
+| |-- Bit_Matrix.cc
+| |-- Bit_Matrix_defs.hh
+| |-- Bit_Matrix_inlines.hh
+| |-- Bit_Matrix_types.hh
+| |-- Bit_Row.cc
+| |-- Bit_Row_defs.hh
+| |-- Bit_Row_inlines.hh
+| |-- Bit_Row_types.hh
+| |-- Boundary_defs.hh
+| |-- Box.cc
+| |-- Box_defs.hh
+| |-- Box_inlines.hh
+| |-- Box_templates.hh
+| |-- Box_types.hh
+| |-- Box_Status.idefs.hh
+| |-- Box_Status_inlines.hh
+| |-- COPYING.cc.dist
+| |-- COPYING.hh.dist
+| |-- CO_Tree.cc
+| |-- CO_Tree_defs.hh
+| |-- CO_Tree_inlines.hh
+| |-- CO_Tree_templates.hh
+| |-- CO_Tree_types.hh
+| |-- CREDITS.cc.dist
+| |-- CREDITS.hh.dist
+| |-- C_Integer.hh
+| |-- C_Polyhedron.cc
+| |-- C_Polyhedron_defs.hh
+| |-- C_Polyhedron_inlines.hh
+| |-- C_Polyhedron_types.hh
+| |-- Cast_Floating_Point_Expression_defs.hh
+| |-- Cast_Floating_Point_Expression_inlines.hh
+| |-- Cast_Floating_Point_Expression_templates.hh
+| |-- Cast_Floating_Point_Expression_types.hh
+| |-- Checked_Number.cc
+| |-- Checked_Number_defs.hh
+| |-- Checked_Number_inlines.hh
+| |-- Checked_Number_templates.hh
+| |-- Checked_Number_types.hh
+| |-- Coefficient.cc
+| |-- Coefficient_defs.hh
+| |-- Coefficient_inlines.hh
+| |-- Coefficient_types.hh
+| |-- Coefficient_traits_template.hh
+| |-- Concrete_Expression.cc
+| |-- Concrete_Expression_defs.hh
+| |-- Concrete_Expression_inlines.hh
+| |-- Concrete_Expression_types.hh
+| |-- Congruence.cc
+| |-- Congruence_defs.hh
+| |-- Congruence_inlines.hh
+| |-- Congruence_types.hh
+| |-- Congruence_System.cc
+| |-- Congruence_System_defs.hh
+| |-- Congruence_System_inlines.hh
+| |-- Congruence_System_types.hh
+| |-- Constant_Floating_Point_Expression_defs.hh
+| |-- Constant_Floating_Point_Expression_inlines.hh
+| |-- Constant_Floating_Point_Expression_types.hh
+| |-- Constraint.cc
+| |-- Constraint_defs.hh
+| |-- Constraint_inlines.hh
+| |-- Constraint_types.hh
+| |-- Constraint_System.cc
+| |-- Constraint_System_defs.hh
+| |-- Constraint_System_inlines.hh
+| |-- Constraint_System_types.hh
+| |-- DB_Matrix_defs.hh
+| |-- DB_Matrix_inlines.hh
+| |-- DB_Matrix_templates.hh
+| |-- DB_Matrix_types.hh
+| |-- DB_Row_defs.hh
+| |-- DB_Row_inlines.hh
+| |-- DB_Row_templates.hh
+| |-- DB_Row_types.hh
+| |-- Dense_Row.cc
+| |-- Dense_Row_defs.hh
+| |-- Dense_Row_inlines.hh
+| |-- Dense_Row_templates.hh
+| |-- Dense_Row_types.hh
+| |-- Determinate_defs.hh
+| |-- Determinate_inlines.hh
+| |-- Determinate_types.hh
+| |-- Difference_Floating_Point_Expression_defs.hh
+| |-- Difference_Floating_Point_Expression_inlines.hh
+| |-- Difference_Floating_Point_Expression_templates.hh
+| |-- Difference_Floating_Point_Expression_types.hh
+| |-- Division_Floating_Point_Expression_defs.hh
+| |-- Division_Floating_Point_Expression_inlines.hh
+| |-- Division_Floating_Point_Expression_templates.hh
+| |-- Division_Floating_Point_Expression_types.hh
+| |-- Doubly_Linked_Object_defs.hh
+| |-- Doubly_Linked_Object_inlines.hh
+| |-- Doubly_Linked_Object_types.hh
+| |-- EList_defs.hh
+| |-- EList_inlines.hh
+| |-- EList_types.hh
+| |-- EList_Iterator_defs.hh
+| |-- EList_Iterator_inlines.hh
+| |-- EList_Iterator_types.hh
+| |-- Expression_Hide_Inhomo_defs.hh
+| |-- Expression_Hide_Inhomo_inlines.hh
+| |-- Expression_Hide_Inhomo_types.hh
+| |-- Expression_Hide_Last_defs.hh
+| |-- Expression_Hide_Last_inlines.hh
+| |-- Expression_Hide_Last_types.hh
+| |-- Float.cc
+| |-- Float_defs.hh
+| |-- Float_inlines.hh
+| |-- Float_templates.hh
+| |-- Floating_Point_Expression_defs.hh
+| |-- Floating_Point_Expression_inlines.hh
+| |-- Floating_Point_Expression_templates.hh
+| |-- Floating_Point_Expression_types.hh
+| |-- GMP_Integer_defs.hh
+| |-- GMP_Integer_inlines.hh
+| |-- GMP_Integer_types.hh
+| |-- Generator.cc
+| |-- Generator_defs.hh
+| |-- Generator_inlines.hh
+| |-- Generator_types.hh
+| |-- Generator_System.cc
+| |-- Generator_System_defs.hh
+| |-- Generator_System_inlines.hh
+| |-- Generator_System_types.hh
+| |-- Grid_defs.hh
+| |-- Grid_inlines.hh
+| |-- Grid_templates.hh
+| |-- Grid_types.hh
+| |-- Grid_Certificate.cc
+| |-- Grid_Certificate_defs.hh
+| |-- Grid_Certificate_inlines.hh
+| |-- Grid_Certificate_types.hh
+| |-- Grid_Generator.cc
+| |-- Grid_Generator_defs.hh
+| |-- Grid_Generator_inlines.hh
+| |-- Grid_Generator_types.hh
+| |-- Grid_Generator_System.cc
+| |-- Grid_Generator_System_defs.hh
+| |-- Grid_Generator_System_inlines.hh
+| |-- Grid_Generator_System_types.hh
+| |-- Grid_Status.cc
+| |-- Grid_Status.idefs.hh
+| |-- Grid_Status_inlines.hh
+| |-- Grid_chdims.cc
+| |-- Grid_conversion.cc
+| |-- Grid_nonpublic.cc
+| |-- Grid_public.cc
+| |-- Grid_simplify.cc
+| |-- Grid_widenings.cc
+| |-- H79_Certificate.cc
+| |-- H79_Certificate_defs.hh
+| |-- H79_Certificate_inlines.hh
+| |-- H79_Certificate_types.hh
+| |-- Handler_defs.hh
+| |-- Handler_inlines.hh
+| |-- Handler_types.hh
+| |-- Has_Assign_Or_Swap.hh
+| |-- Init.cc
+| |-- Init_defs.hh
+| |-- Init_inlines.hh
+| |-- Init_types.hh
+| |-- Integer_Interval.hh
+| |-- Interval_defs.hh
+| |-- Interval_inlines.hh
+| |-- Interval_templates.hh
+| |-- Interval_types.hh
+| |-- Interval_Info_defs.hh
+| |-- Interval_Info_inlines.hh
+| |-- Interval_Info_types.hh
+| |-- Linear_Expression.cc
+| |-- Linear_Expression_defs.hh
+| |-- Linear_Expression_inlines.hh
+| |-- Linear_Expression_types.hh
+| |-- Linear_Expression_Impl.cc
+| |-- Linear_Expression_Impl_defs.hh
+| |-- Linear_Expression_Impl_inlines.hh
+| |-- Linear_Expression_Impl_templates.hh
+| |-- Linear_Expression_Impl_types.hh
+| |-- Linear_Expression_Interface.cc
+| |-- Linear_Expression_Interface_defs.hh
+| |-- Linear_Expression_Interface_types.hh
+| |-- Linear_Form.cc
+| |-- Linear_Form_defs.hh
+| |-- Linear_Form_inlines.hh
+| |-- Linear_Form_templates.hh
+| |-- Linear_Form_types.hh
+| |-- Linear_System_defs.hh
+| |-- Linear_System_inlines.hh
+| |-- Linear_System_templates.hh
+| |-- Linear_System_types.hh
+| |-- MIP_Problem.cc
+| |-- MIP_Problem_defs.hh
+| |-- MIP_Problem_inlines.hh
+| |-- MIP_Problem_templates.hh
+| |-- MIP_Problem_types.hh
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- Matrix_defs.hh
+| |-- Matrix_inlines.hh
+| |-- Matrix_templates.hh
+| |-- Matrix_types.hh
+| |-- Multiplication_Floating_Point_Expression_defs.hh
+| |-- Multiplication_Floating_Point_Expression_inlines.hh
+| |-- Multiplication_Floating_Point_Expression_templates.hh
+| |-- Multiplication_Floating_Point_Expression_types.hh
+| |-- NNC_Polyhedron.cc
+| |-- NNC_Polyhedron_defs.hh
+| |-- NNC_Polyhedron_inlines.hh
+| |-- NNC_Polyhedron_types.hh
+| |-- Numeric_Format_defs.hh
+| |-- OR_Matrix_defs.hh
+| |-- OR_Matrix_inlines.hh
+| |-- OR_Matrix_templates.hh
+| |-- OR_Matrix_types.hh
+| |-- Octagonal_Shape.cc
+| |-- Octagonal_Shape_defs.hh
+| |-- Octagonal_Shape_inlines.hh
+| |-- Octagonal_Shape_templates.hh
+| |-- Octagonal_Shape_types.hh
+| |-- Og_Status.idefs.hh
+| |-- Og_Status_inlines.hh
+| |-- Opposite_Floating_Point_Expression_defs.hh
+| |-- Opposite_Floating_Point_Expression_inlines.hh
+| |-- Opposite_Floating_Point_Expression_types.hh
+| |-- PIP_Problem.cc
+| |-- PIP_Problem_defs.hh
+| |-- PIP_Problem_inlines.hh
+| |-- PIP_Problem_templates.hh
+| |-- PIP_Problem_types.hh
+| |-- PIP_Tree.cc
+| |-- PIP_Tree_defs.hh
+| |-- PIP_Tree_inlines.hh
+| |-- PIP_Tree_types.hh
+| |-- Partial_Function.cc
+| |-- Partial_Function_defs.hh
+| |-- Partial_Function_inlines.hh
+| |-- Partial_Function_types.hh
+| |-- Partially_Reduced_Product_defs.hh
+| |-- Partially_Reduced_Product_inlines.hh
+| |-- Partially_Reduced_Product_templates.hh
+| |-- Partially_Reduced_Product_types.hh
+| |-- Pending_Element_defs.hh
+| |-- Pending_Element_inlines.hh
+| |-- Pending_Element_types.hh
+| |-- Pending_List_defs.hh
+| |-- Pending_List_inlines.hh
+| |-- Pending_List_templates.hh
+| |-- Pending_List_types.hh
+| |-- Ph_Status.cc
+| |-- Ph_Status.idefs.hh
+| |-- Ph_Status_inlines.hh
+| |-- Pointset_Powerset.cc
+| |-- Pointset_Powerset_defs.hh
+| |-- Pointset_Powerset_inlines.hh
+| |-- Pointset_Powerset_templates.hh
+| |-- Pointset_Powerset_types.hh
+| |-- Poly_Con_Relation.cc
+| |-- Poly_Con_Relation_defs.hh
+| |-- Poly_Con_Relation_inlines.hh
+| |-- Poly_Con_Relation_types.hh
+| |-- Poly_Gen_Relation.cc
+| |-- Poly_Gen_Relation_defs.hh
+| |-- Poly_Gen_Relation_inlines.hh
+| |-- Poly_Gen_Relation_types.hh
+| |-- Polyhedron_defs.hh
+| |-- Polyhedron_inlines.hh
+| |-- Polyhedron_templates.hh
+| |-- Polyhedron_types.hh
+| |-- Polyhedron_chdims.cc
+| |-- Polyhedron_chdims_templates.hh
+| |-- Polyhedron_conversion_templates.hh
+| |-- Polyhedron_minimize_templates.hh
+| |-- Polyhedron_nonpublic.cc
+| |-- Polyhedron_public.cc
+| |-- Polyhedron_simplify_templates.hh
+| |-- Polyhedron_widenings.cc
+| |-- Powerset_defs.hh
+| |-- Powerset_inlines.hh
+| |-- Powerset_templates.hh
+| |-- Powerset_types.hh
+| |-- Ptr_Iterator_defs.hh
+| |-- Ptr_Iterator_inlines.hh
+| |-- Ptr_Iterator_types.hh
+| |-- Rational_Box.hh
+| |-- Rational_Interval.hh
+| |-- Result_defs.hh
+| |-- Result_inlines.hh
+| |-- Rounding_Dir_defs.hh
+| |-- Rounding_Dir_inlines.hh
+| |-- Scalar_Products.cc
+| |-- Scalar_Products_defs.hh
+| |-- Scalar_Products_inlines.hh
+| |-- Scalar_Products_types.hh
+| |-- Slow_Copy.hh
+| |-- Sparse_Row.cc
+| |-- Sparse_Row_defs.hh
+| |-- Sparse_Row_inlines.hh
+| |-- Sparse_Row_templates.hh
+| |-- Sparse_Row_types.hh
+| |-- Sum_Floating_Point_Expression_defs.hh
+| |-- Sum_Floating_Point_Expression_inlines.hh
+| |-- Sum_Floating_Point_Expression_templates.hh
+| |-- Sum_Floating_Point_Expression_types.hh
+| |-- Swapping_Vector_defs.hh
+| |-- Swapping_Vector_inlines.hh
+| |-- Swapping_Vector_types.hh
+| |-- Temp_defs.hh
+| |-- Temp_inlines.hh
+| |-- Temp_templates.hh
+| |-- Threshold_Watcher.cc
+| |-- Threshold_Watcher_defs.hh
+| |-- Threshold_Watcher_inlines.hh
+| |-- Threshold_Watcher_templates.hh
+| |-- Threshold_Watcher_types.hh
+| |-- Time.cc
+| |-- Time_defs.hh
+| |-- Time_inlines.hh
+| |-- Time_types.hh
+| |-- Topology_types.hh
+| |-- Variable.cc
+| |-- Variable_defs.hh
+| |-- Variable_inlines.hh
+| |-- Variable_types.hh
+| |-- Variable_Floating_Point_Expression_defs.hh
+| |-- Variable_Floating_Point_Expression_inlines.hh
+| |-- Variable_Floating_Point_Expression_types.hh
+| |-- Variables_Set.cc
+| |-- Variables_Set_defs.hh
+| |-- Variables_Set_inlines.hh
+| |-- Variables_Set_types.hh
+| |-- WRD_coefficient_types_defs.hh
+| |-- WRD_coefficient_types_inlines.hh
+| |-- Watchdog.cc
+| |-- Watchdog_defs.hh
+| |-- Watchdog_inlines.hh
+| |-- Watchdog_types.hh
+| |-- Weight_Profiler.cc
+| |-- Weight_Profiler_defs.hh
+| |-- Widening_Function_defs.hh
+| |-- Widening_Function_inlines.hh
+| |-- Widening_Function_types.hh
+| |-- algorithms.hh
+| |-- assert.cc
+| |-- assert.hh
+| |-- assign_or_swap.hh
+| |-- c_streambuf.cc
+| |-- c_streambuf_defs.hh
+| |-- c_streambuf_inlines.hh
+| |-- c_streambuf_types.hh
+| |-- checked.cc
+| |-- checked_defs.hh
+| |-- checked_inlines.hh
+| |-- checked_ext_inlines.hh
+| |-- checked_float_inlines.hh
+| |-- checked_int_inlines.hh
+| |-- checked_mpq_inlines.hh
+| |-- checked_mpz_inlines.hh
+| |-- checked_numeric_limits.hh
+| |-- compiler.hh
+| |-- distances_defs.hh
+| |-- distances_inlines.hh
+| |-- distances_types.hh
+| |-- fpu-c99_inlines.hh
+| |-- fpu-ia32.cc
+| |-- fpu-ia32_inlines.hh
+| |-- fpu-none_inlines.hh
+| |-- fpu-sparc_inlines.hh
+| |-- fpu_defs.hh
+| |-- fpu_types.hh
+| |-- globals.cc
+| |-- globals_defs.hh
+| |-- globals_inlines.hh
+| |-- globals_types.hh
+| |-- initializer.hh
+| |-- intervals_defs.hh
+| |-- iterator_to_const_defs.hh
+| |-- iterator_to_const_inlines.hh
+| |-- iterator_to_const_types.hh
+| |-- linearize.hh
+| |-- math_utilities_defs.hh
+| |-- math_utilities_inlines.hh
+| |-- max_space_dimension.hh
+| |-- meta_programming.hh
+| |-- mp_std_bits.cc
+| |-- mp_std_bits_defs.hh
+| |-- mp_std_bits_inlines.hh
+| |-- namespaces.hh
+| |-- ppl-config.cc.in
+| |-- ppl.hh.dist
+| |-- ppl_header.hh
+| |-- stdiobuf.cc
+| |-- stdiobuf_defs.hh
+| |-- stdiobuf_inlines.hh
+| |-- stdiobuf_types.hh
+| |-- swapping_sort_templates.hh
+| |-- termination.cc
+| |-- termination_defs.hh
+| |-- termination_templates.hh
+| |-- termination_types.hh
+| |-- version.cc
+| |-- version.hh.in
+| |-- wrap_assign.hh
+| |-- wrap_string.cc
+| `-- wrap_string.hh
+|-- tests
+| |-- BD_Shape
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addconstraints1.cc
+| | |-- addspacedims1.cc
+| | |-- affinedimension1.cc
+| | |-- affineimage1.cc
+| | |-- affineimage2.cc
+| | |-- affinepreimage1.cc
+| | |-- ascii_dump_load1.cc
+| | |-- bgp99extrapolation1.cc
+| | |-- bhmz05widening1.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- bounds1.cc
+| | |-- cc76extrapolation1.cc
+| | |-- cc76narrowing1.cc
+| | |-- closure1.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- constrains1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- containsintegerpoint1.cc
+| | |-- difference1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- dropsomenonintegerpoints1.cc
+| | |-- empty1.cc
+| | |-- equality1.cc
+| | |-- expandspacedim1.cc
+| | |-- foldspacedims1.cc
+| | |-- frequency1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromgensys1.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- frompolyhedron1.cc
+| | |-- fromspacedim1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generalizedaffinepreimage3.cc
+| | |-- geomcovers1.cc
+| | |-- h79widening1.cc
+| | |-- integerupperboundifexact1.cc
+| | |-- intersection1.cc
+| | |-- limitedbhmz05extrapolation1.cc
+| | |-- limitedcc76extrapolation1.cc
+| | |-- limitedh79extrapolation1.cc
+| | |-- mapspacedims1.cc
+| | |-- max_min1.cc
+| | |-- max_min2.cc
+| | |-- maxspacedim1.cc
+| | |-- membytes1.cc
+| | |-- minconstraints1.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- relations4.cc
+| | |-- removespacedims1.cc
+| | |-- run_tests
+| | |-- simplifyusingcontext1.cc
+| | |-- timeelapse1.cc
+| | |-- unconstrain1.cc
+| | |-- universe1.cc
+| | |-- upperbound1.cc
+| | |-- upperboundifexact1.cc
+| | |-- wrap1.cc
+| | `-- writebdshape1.cc
+| |-- Box
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addconstraints1.cc
+| | |-- addspacedims1.cc
+| | |-- affinedimension1.cc
+| | |-- affineimage1.cc
+| | |-- affinepreimage1.cc
+| | |-- ascii_dump_load1.cc
+| | |-- bgp99extrapolation1.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- cc76narrowing1.cc
+| | |-- cc76widening.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- constrains1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- containsintegerpoint1.cc
+| | |-- difference1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- empty1.cc
+| | |-- equality1.cc
+| | |-- expandspacedim1.cc
+| | |-- foldspacedims1.cc
+| | |-- frequency1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromgensys1.cc
+| | |-- fromgrid1.cc
+| | |-- frompartiallyreducedproduct1.cc
+| | |-- frompolyhedron1.cc
+| | |-- frompolyhedron2.cc
+| | |-- fromspacedim1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- geomcovers1.cc
+| | |-- intersection1.cc
+| | |-- interval1.cc
+| | |-- limitedcc76extrapolation1.cc
+| | |-- mapspacedims1.cc
+| | |-- max_min1.cc
+| | |-- maxspacedim1.cc
+| | |-- membytes1.cc
+| | |-- minconstraints1.cc
+| | |-- propagateconstraints1.cc
+| | |-- propagateconstraints2.cc
+| | |-- refinewithcongruence1.cc
+| | |-- refinewithcongruences1.cc
+| | |-- refinewithconstraint1.cc
+| | |-- refinewithconstraint2.cc
+| | |-- refinewithconstraints1.cc
+| | |-- refinewithconstraints2.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- relations4.cc
+| | |-- removespacedims1.cc
+| | |-- run_tests
+| | |-- simplifyusingcontext1.cc
+| | |-- timeelapse1.cc
+| | |-- topclosed1.cc
+| | |-- unconstrain1.cc
+| | |-- universe1.cc
+| | |-- upperbound1.cc
+| | |-- upperboundifexact1.cc
+| | |-- wrap1.cc
+| | `-- writebox1.cc
+| |-- CO_Tree
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | `-- cotree1.cc
+| |-- Concrete_Expression
+| | |-- C_Expr.cc
+| | |-- C_Expr_defs.hh
+| | |-- C_Expr_inlines.hh
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- bdshape1.cc
+| | |-- bdshape2.cc
+| | |-- digitalfilters1.cc
+| | |-- linearform1.cc
+| | |-- linearize.cc
+| | |-- octagonalshape1.cc
+| | |-- octagonalshape2.cc
+| | |-- polyhedron1.cc
+| | |-- polyhedron2.cc
+| | `-- run_tests
+| |-- Grid
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addcongruence1.cc
+| | |-- addcongruences1.cc
+| | |-- addconstraint1.cc
+| | |-- addconstraints1.cc
+| | |-- addgenerator1.cc
+| | |-- addgenerators1.cc
+| | |-- addspacedims1.cc
+| | |-- affinedim1.cc
+| | |-- affineimage1.cc
+| | |-- affineimage2.cc
+| | |-- affinepreimage1.cc
+| | |-- affinepreimage2.cc
+| | |-- approximatepartition1.cc
+| | |-- asciidumpload1.cc
+| | |-- asciidumpload2.cc
+| | |-- asciidumpload3.cc
+| | |-- asciidumpload4.cc
+| | |-- asciidumpload5.cc
+| | |-- asciidumpload6.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- bounds1.cc
+| | |-- certificate1.cc
+| | |-- concatenate1.cc
+| | |-- congruence1.cc
+| | |-- congruences1.cc
+| | |-- congruences2.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- containsintegerpoint1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- dropnonintegerpoints1.cc
+| | |-- equals1.cc
+| | |-- expandspacedim1.cc
+| | |-- foldspacedims1.cc
+| | |-- frequency1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- frompolyhedron1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffineimage3.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generalizedaffinepreimage3.cc
+| | |-- generator1.cc
+| | |-- generators1.cc
+| | |-- generators2.cc
+| | |-- grid1.cc
+| | |-- grid2.cc
+| | |-- grid3.cc
+| | |-- griddifference1.cc
+| | |-- intersection1.cc
+| | |-- isempty1.cc
+| | |-- isuniverse1.cc
+| | |-- limitedextrapolation1.cc
+| | |-- limitedextrapolation2.cc
+| | |-- limitedextrapolation3.cc
+| | |-- mapspacedims1.cc
+| | |-- maxmin1.cc
+| | |-- membytes1.cc
+| | |-- mincongruences1.cc
+| | |-- mingenerators1.cc
+| | |-- outputoperator1.cc
+| | |-- outputoperator2.cc
+| | |-- outputoperator3.cc
+| | |-- partition1.cc
+| | |-- powersetdifference1.cc
+| | |-- powersetgeometricallycovers1.cc
+| | |-- powersetgeometricallyequals1.cc
+| | |-- refinewithcongruences1.cc
+| | |-- refinewithconstraints1.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- removespacedims1.cc
+| | |-- removespacedims2.cc
+| | |-- simplifyusingcontext1.cc
+| | |-- timeelapse1.cc
+| | |-- topclosed1.cc
+| | |-- topclosure1.cc
+| | |-- unconstrain1.cc
+| | |-- upperbound1.cc
+| | |-- upperbound2.cc
+| | |-- widening1.cc
+| | |-- widening2.cc
+| | |-- widening3.cc
+| | |-- wrap1.cc
+| | `-- writecongruencesystem.cc
+| |-- MIP_Problem
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ascii_dump_load1.cc
+| | |-- exceptions1.cc
+| | |-- mipproblem1.cc
+| | |-- mipproblem2.cc
+| | |-- mipproblem3.cc
+| | `-- mipproblem4.cc
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- Octagonal_Shape
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addspacedims1.cc
+| | |-- affinedimension1.cc
+| | |-- affineimage1.cc
+| | |-- affineimage2.cc
+| | |-- affinepreimage1.cc
+| | |-- affinepreimage2.cc
+| | |-- ascii_dump_load1.cc
+| | |-- bhmz05widening1.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- bounds1.cc
+| | |-- cc76extrapolation1.cc
+| | |-- cc76narrowing1.cc
+| | |-- chinainit.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- constrains1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- containsintegerpoint1.cc
+| | |-- difference1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- dropsomenonintegerpoints1.cc
+| | |-- empty1.cc
+| | |-- expandspacedim1.cc
+| | |-- foldspacedims1.cc
+| | |-- frequency1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromgensys1.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- frompolyhedron1.cc
+| | |-- fromspacedim1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffineimage3.cc
+| | |-- generalizedaffineimage4.cc
+| | |-- generalizedaffineimage5.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generalizedaffinepreimage3.cc
+| | |-- generalizedaffinepreimage4.cc
+| | |-- integerupperboundifexact1.cc
+| | |-- intersection1.cc
+| | |-- limitedbhmz05extrapolation1.cc
+| | |-- limitedcc76extrapolation1.cc
+| | |-- mapspacedims1.cc
+| | |-- max_min1.cc
+| | |-- max_min2.cc
+| | |-- maxspacedim1.cc
+| | |-- membytes1.cc
+| | |-- minconstraints1.cc
+| | |-- relatwithcons1.cc
+| | |-- relatwithcons2.cc
+| | |-- relatwithcons3.cc
+| | |-- relatwithgen1.cc
+| | |-- removespacedims1.cc
+| | |-- run_tests
+| | |-- simplifyusingcontext1.cc
+| | |-- timeelapse1.cc
+| | |-- unconstrain1.cc
+| | |-- universe1.cc
+| | |-- upperbound1.cc
+| | |-- upperboundifexact1.cc
+| | |-- wrap1.cc
+| | `-- writeoctagon1.cc
+| |-- PIP_Problem
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ascii_dump_load1.cc
+| | |-- exceptions1.cc
+| | |-- pipproblem1.cc
+| | |-- pipproblem2.cc
+| | |-- pipproblem3.cc
+| | `-- weightwatch1.cc
+| |-- Partially_Reduced_Product
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addcongruences1.cc
+| | |-- affineimage1.cc
+| | |-- asciidumpload1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- bounds1.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- congruencesproduct1.cc
+| | |-- constraints1.cc
+| | |-- constraintsproduct1.cc
+| | |-- contains1.cc
+| | |-- difference1.cc
+| | |-- dimension1.cc
+| | |-- directproduct1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- dropsomenonintegerpoints1.cc
+| | |-- equals1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- frompolyhedron1.cc
+| | |-- fromproduct1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- intersection1.cc
+| | |-- isempty1.cc
+| | |-- isuniverse1.cc
+| | |-- maxmin1.cc
+| | |-- partially_reduced_product_test.hh
+| | |-- refinewithcongruences1.cc
+| | |-- refinewithconstraints1.cc
+| | |-- relations1.cc
+| | |-- shapepreservingproduct1.cc
+| | |-- smashproduct1.cc
+| | |-- spacedims1.cc
+| | |-- timeelapse1.cc
+| | |-- topclosed1.cc
+| | |-- topclosure1.cc
+| | `-- upperbound1.cc
+| |-- Polyhedron
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addcongruence1.cc
+| | |-- addcongruences1.cc
+| | |-- addconstraint1.cc
+| | |-- addconstraints1.cc
+| | |-- addconstraints2.cc
+| | |-- addgenerator1.cc
+| | |-- addgenerator2.cc
+| | |-- addgenerators1.cc
+| | |-- addgenerators2.cc
+| | |-- addspacedims1.cc
+| | |-- addspacedims2.cc
+| | |-- affineimage1.cc
+| | |-- affineimage2.cc
+| | |-- affinepreimage1.cc
+| | |-- affinetrans.cc
+| | |-- append1.cc
+| | |-- append2.cc
+| | |-- ascii_dump_load1.cc
+| | |-- ascii_dump_load2.cc
+| | |-- ascii_dump_load3.cc
+| | |-- bgp99extrapolation1.cc
+| | |-- bgp99extrapolation2.cc
+| | |-- bhrz03widening1.cc
+| | |-- bhrz03widening2.cc
+| | |-- bhrz03widening3.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- boundedbhrz03extrapolation1.cc
+| | |-- boundedh79extrapolation1.cc
+| | |-- bounds1.cc
+| | |-- cnncconversion1.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- constrains1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- contains2.cc
+| | |-- containsintegerpoint1.cc
+| | |-- disjoint1.cc
+| | |-- disjoint2.cc
+| | |-- dropsomenonintegerpoints1.cc
+| | |-- dropsomenonintegerpoints2.cc
+| | |-- dualhypercubes.cc
+| | |-- empty1.cc
+| | |-- equals1.cc
+| | |-- exceptions1.cc
+| | |-- exceptions2.cc
+| | |-- exceptions3.cc
+| | |-- expandspacedim1.cc
+| | |-- expandspacedim2.cc
+| | |-- foldspacedims1.cc
+| | |-- foldspacedims2.cc
+| | |-- frequency1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- frombox2.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generators1.cc
+| | |-- geomcovers1.cc
+| | |-- h79widening1.cc
+| | |-- h79widening2.cc
+| | |-- hybrid.cc
+| | |-- intersection1.cc
+| | |-- limitedbhrz03extrapolation1.cc
+| | |-- limitedh79extrapolation1.cc
+| | |-- linearexpression1.cc
+| | |-- linearpartition1.cc
+| | |-- linearsystem1.cc
+| | |-- mapspacedims1.cc
+| | |-- matrix1.cc
+| | |-- max_min1.cc
+| | |-- maxspacedim1.cc
+| | |-- mc91.cc
+| | |-- membytes1.cc
+| | |-- memory1.cc
+| | |-- memory2.cc
+| | |-- minconstraints1.cc
+| | |-- minconstraints2.cc
+| | |-- mingenerators1.cc
+| | |-- mingenerators2.cc
+| | |-- nncminimize1.cc
+| | |-- nncminimize2.cc
+| | |-- numberinput1.cc
+| | |-- onepoint.cc
+| | |-- permute.cc
+| | |-- polydifference1.cc
+| | |-- polydifference2.cc
+| | |-- polyhull1.cc
+| | |-- polyhull2.cc
+| | |-- polyhullifexact1.cc
+| | |-- polyhullifexact2.cc
+| | |-- randphull1.cc
+| | |-- refinewithcongruence1.cc
+| | |-- refinewithcongruences1.cc
+| | |-- refinewithconstraint1.cc
+| | |-- refinewithconstraints1.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- removespacedims1.cc
+| | |-- removespacedims2.cc
+| | |-- simplifyusingcontext1.cc
+| | |-- smm1.cc
+| | |-- sparserow1.cc
+| | |-- termination1.cc
+| | |-- termination2.cc
+| | |-- timeelapse1.cc
+| | |-- timeelapse2.cc
+| | |-- topclosed1.cc
+| | |-- topclosure1.cc
+| | |-- unconstrain1.cc
+| | |-- universe1.cc
+| | |-- universe2.cc
+| | |-- variablesset1.cc
+| | |-- watchdog1.cc
+| | |-- weightwatch1.cc
+| | |-- wrap1.cc
+| | |-- wrap2.cc
+| | |-- writeconsys1.cc
+| | |-- writegensys1.cc
+| | |-- writepolyhedron1.cc
+| | |-- writepolyhedron2.cc
+| | |-- writerelation1.cc
+| | `-- writevariable1.cc
+| |-- Powerset
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addcongruences1.cc
+| | |-- addconstraints1.cc
+| | |-- affinedimension1.cc
+| | |-- affineimage1.cc
+| | |-- affinepreimage1.cc
+| | |-- bounded1.cc
+| | |-- bounds1.cc
+| | |-- closed1.cc
+| | |-- closure1.cc
+| | |-- collapse1.cc
+| | |-- concatenate1.cc
+| | |-- contains1.cc
+| | |-- containsintegerpoint1.cc
+| | |-- difference1.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- disjunct1.cc
+| | |-- empty1.cc
+| | |-- entails1.cc
+| | |-- equals1.cc
+| | |-- frombdshape1.cc
+| | |-- frombox1.cc
+| | |-- fromcongruences1.cc
+| | |-- fromconstraints1.cc
+| | |-- fromgrid1.cc
+| | |-- fromoctagonalshape1.cc
+| | |-- frompolyhedron1.cc
+| | |-- fromspacedimension1.cc
+| | |-- intersection1.cc
+| | |-- maxmin1.cc
+| | |-- meet1.cc
+| | |-- membytes1.cc
+| | |-- powerset1.cc
+| | |-- reduce1.cc
+| | |-- refinewith1.cc
+| | |-- relationwith1.cc
+| | |-- simplifyusingcontext1.cc
+| | |-- size1.cc
+| | |-- spacedims1.cc
+| | |-- universe1.cc
+| | `-- upperbound1.cc
+| |-- README
+| |-- Random_Number_Generator_defs.hh
+| |-- Random_Number_Generator_inlines.hh
+| |-- Random_Number_Generator_types.hh
+| |-- Watchdog
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | `-- watchdog1.cc
+| |-- files.cc
+| |-- files.hh
+| |-- ppl_test.cc
+| |-- ppl_test.hh
+| `-- valgrind_suppressions
+`-- utils
+ |-- Makefile.am
+ |-- Makefile.in
+ |-- build_header.in
+ |-- cm_cleaner.sh
+ |-- cm_splitter.sh
+ |-- text2cxxarray.in
+ |-- timings.cc
+ `-- timings.hh
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.alpha b/README.alpha
new file mode 100644
index 0000000..490756c
--- /dev/null
+++ b/README.alpha
@@ -0,0 +1,59 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on the Alpha
+=========================================================
+
+There appears to be a bug in GCC (all versions up to and including
+4.3.x) concerning exception handling on the Alpha. This may be
+related to
+
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8966
+
+Strictily speaking, the PPL uses exception handling, so if that does
+not work on the Alpha, then the PPL does not work on the Alpha. And
+there is nothing to do but fix the GCC bug.
+
+However, if that GCC bug really only affects exception handling and nothing
+else, given that the PPL only uses exceptions for error reporting, we can
+probably say that the PPL works on the Alpha *apart* from error reporting.
+In other words, under this hypothesis (which we have no way to check),
+users that are not interested in catching exceptions thrown by the PPL
+(in response to invalid arguments, heap exhaustion, overflows, ...)
+should probably not worry. Your mileage may vary...
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.arm b/README.arm
new file mode 100644
index 0000000..435baae
--- /dev/null
+++ b/README.arm
@@ -0,0 +1,54 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on the ARM
+=======================================================
+
+On the ARM, whether or not the rounding mode can be set in a way that
+allows the PPL to work with floating point numbers, will depend on the
+actual hardware. However, disabling the affected PPL code at run-time
+is impractical. Thus, to ensure that the binary distributions of the
+PPL for the ARM work as expected on any hardware, on the ARM, the
+affected code is disabled at compile-time. It is still possible to
+build a binary for the ARM that assumes the hardware can control the
+rounding mode; for this, configure the PPL with
+`-DPPL_ARM_CAN_CONTROL_FPU=1' included in CPPFLAGS.
+For example:
+
+ CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1" .../configure ...
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.configure b/README.configure
new file mode 100644
index 0000000..54268f8
--- /dev/null
+++ b/README.configure
@@ -0,0 +1,519 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library
+============================================
+
+Contents
+--------
+
+ 1. The Standard Thing (configure, make, make install)
+ 2. Using the Right Version of GMP
+ 3. Using the Right C and C++ Compilers
+ 4. Enabling the Use of Alternative Coefficient Types
+ 5. Configuring the Language Interfaces
+ 6. Configuring for Optimized Performance
+ 7. Advanced Performance Tuning
+ 8. Configuring for Debugging
+ 9. Programs that Come with the Library
+10. Using the Git Sources
+
+
+1. The Standard Thing (configure, make, make install)
+-----------------------------------------------------
+
+In an ideal situation (i.e., on a more or less standard Un*x
+environment, with the right C++ compiler to compile the core library
+as well as the right compilers to compile all the enabled language
+interfaces, with the GMP library installed in a standard place and
+provided the user is satisfied with all the options we chose as
+defaults), a source distribution of the Parma Polyhedra Library (PPL)
+can be unpacked, configured, built and installed with the following,
+well-known procedure:
+
+ $ tar jxf ppl-x.y.tar.bz2
+ $ ./configure
+ $ make
+ $ su
+ Password: <root password>
+ $ make install
+
+After successful completion of these steps the PPL is completely
+installed on the system and can be used as expected.
+
+On the other hand, the PPL `configure' shell script provides many
+options to customize the build and installation process. The
+`INSTALL' file gives a detailed description of the non PPL-specific
+aspects of the configuration, compilation and installation process and
+describes the basic options of the `configure' script. For a compact
+summary of all the available configuration options, run the command
+
+ $ ./configure --help
+
+The PPL-specific aspects of the configuration, compilation and
+installation process are discussed in the following sections.
+
+
+2. Using the Right Version of GMP
+---------------------------------
+
+In order to use this version of the PPL you must make sure that:
+
+(1) GMP version 4.1.3 or later is installed on your system;
+(2) that this version was compiled with the C++ interface enabled;
+(3) that this C++ interface was compiled with the same compiler
+ version with which you will compile the PPL;
+(4) that your C and C++ compilers and your linker will find _that_
+ version of GMP and not others that may be present in your system.
+
+Some binary distributions of GMP may contain a version that was compiled
+with the C++ interface disabled, or compiled with a C++ compiler
+implementing a different ABI than the compiler you will use to compile
+the PPL. In these (increasingly rare) cases the only reliable way to
+ensure points (1), (2) and (3) above is to visit GMP's home page at
+
+ http://gmplib.org/
+
+and download the last available version. Then decide where to install
+it and call this place in your file system <GMP prefix>. Then, unless
+you have special needs, you can invoke the GMP's configure script with
+the options
+
+ --prefix=<GMP prefix> --enable-cxx
+
+If the C++ compiler you will use to compile the PPL is not the default
+on your system then, in order to satisfy point (3) above, you should
+set the `CXX', `CXXFLAGS' and `CXXCPP' environment variables so as to
+use the intended compiler with the intended options. See the file
+`INSTALL.autoconf' in the GMP distribution for more on this subject.
+
+If you want to use the PPL ability to recover from out-of-memory
+situations, you should use a version of GMP compiled with GCC (which
+implies you should then compile also the PPL with GCC) using the
+`-fexceptions' option. To build such a version, you can use the
+`CPPFLAGS' environment variable, so that it contains (among possibly
+other compiler options) `-fexceptions'. Again, see `INSTALL.autoconf'
+in the GMP distribution for more on using environment variables to
+influence the configure script.
+
+In order to achieve point (4) above, if the directory <GMP prefix>
+is not standard for your compiler and/or for your linker, you will
+have to make sure the configure script of the PPL is invoked with,
+among others, the option
+
+ --with-gmp=<GMP prefix>
+
+If you use shared libraries, consult the documentation of your dynamic
+linker/loader (`man ld.so' will do on most Un*x-like systems) to see
+how to make sure that GMP's shared library will be found at run-time
+(setting the environment variable `LD_LIBRARY_PATH' to
+"<GMP prefix>/lib:$LD_LIBRARY_PATH" or
+"<GMP prefix>/lib64:$LD_LIBRARY_PATH" is the most commonly used
+solution).
+
+It is also possible to use a non-installed build of GMP. In order to
+do that you should configure the PPL with, among others, the option
+
+ --with-gmp-build=<GMP build directory>
+
+
+3. Using the Right C and C++ Compilers
+--------------------------------------
+
+The configure script of the PPL, as you can see by using its `--help'
+option, besides recognizing `CC', `CXX', `CFLAGS', `CXXFLAGS' and
+other environment variables, provides four switches with which you can
+select the compilers and compilers' options to use for building the
+library. These switches are
+
+ --with-cc=XXX use XXX as the C compiler
+ --with-cxx=XXX use XXX as the C++ compiler
+ --with-cflags=XXX add XXX to the options for the C compiler
+ --with-cxxflags=XXX add XXX to the options for the C++ compiler
+
+Among other things, the ability to specify the C and C++ compilation
+flags allows you to use special compilation options ---such as
+`-fno-threadsafe-statics'--- that, while not safe for general use,
+may be adequate for your particular application.
+
+Let us take the occasion to stress, once again, the fact that you
+must use exactly the same C++ compiler to compile the C++ interface of GMP,
+the PPL and your application, if it uses the C++ interface of the PPL.
+It should be noted that no version of GCC prior to 4.0.3 is known to
+reliably compile PPL 0.10.
+
+Here is an example of a configuration that uses the Intel C/C++ compiler
+version 11.1.x. Assuming you have configured GMP with a command like
+
+ CC=icc CXX=icpc /path/to/gmp-5.0.1/configure --enable-cxx \
+ --prefix=/opt/intel/Compiler/11.1/072 \
+ --libdir=/opt/intel/Compiler/11.1/072/lib/intel64
+
+you can configure the PPL with a command like
+
+ /path/to/ppl-x.y/configure --with-cxx=icpc --with-cc=icc \
+ --with-cxxflags=-pch \
+ --with-gmp=/opt/intel/Compiler/11.1/072
+
+Notice that the `--with-cxxflags' option is not essential here and is
+only included to show how extra compiler options can be passed to the
+configure script.
+
+As another example, here is how you can compile the PPL with
+Comeau C/C++ 4.3.10.1. First configure GMP with a command like
+
+ CXX=como /path/to/gmp-5.0.1/configure --enable-cxx \
+ --disable-shared --prefix=/opt/comeau/local
+
+Then you can configure the PPL with a command like
+
+ /path/to/ppl/configure --with-cc="como --c" --with-cxx="como -tused" \
+ --with-cxxflags="-g++ --remarks --long_long \
+ --display_error_number --diag_suppress 340,401,679" \
+ --disable-shared --with-gmp=/opt/comeau/local
+
+Notice the use of the option `--disable-shared' both in the configuration
+of GMP and the configuration of the PPL. This is due to the fact that
+Comeau C/C++ 4.3.10.1 does not support shared libraries.
+
+
+4. Enabling the Use of Alternative Coefficient Types
+----------------------------------------------------
+
+When speed is important and the numerical coefficients involved are
+likely to be small, you can configure the PPL to use checked native
+integers (8, 16, 32 or 64 bits wide) for the representation of the
+coefficients. This is a safe strategy since, when using checked
+native integers, the library also performs systematic (yet efficient)
+overflow detection and, in case of overflow, an exception is raised.
+To enable the use of various kinds of coefficients, you can use
+the configure option
+
+ --enable-coefficients=TYPE
+
+where TYPE is one of
+
+ mpz, use GMP unbounded integers (default);
+ checked-int8, use 8-bit checked integers;
+ checked-int16, use 16-bit checked integers;
+ checked-int32, use 32-bit checked integers;
+ checked-int64, use 64-bit checked integers.
+
+When using checked integers it is also wise to increase the
+optimization level, since their efficiency largely depends on the
+compiler and on the optimization options used. See below for how
+to do that (in later releases we may try to make the choice of the
+optimization options automatic).
+
+If you want to test the overhead of checked integers with respect
+to plain, unchecked native integers and you are really sure of what
+you are doing, you may be interested to know that these additional
+choices for TYPE are available:
+
+ native-int8, use 8-bit *unchecked* integers;
+ native-int16, use 16-bit *unchecked* integers;
+ native-int32, use 32-bit *unchecked* integers;
+ native-int64, use 64-bit *unchecked* integers.
+
+
+5. Configuring the Language Interfaces
+--------------------------------------
+
+The PPL comes equipped with interfaces for several programming
+languages. Some of these interfaces are enabled by default,
+meaning that, if the configuration script finds support for
+a certain programming language, these interfaces are compiled
+(with `make') and installed (with `make install').
+The set of enabled interface can be customized with the configure option
+
+ --enable-interfaces=INTERFACES
+
+The INTERFACES argument can be
+
+ none, no language interface is enabled;
+ all, all language interfaces are enabled;
+
+or any space-separated list of interface specifiers chosen among
+
+ cxx, the C++ interface;
+ c, the C interface;
+ java, the Java interface;
+ ocaml, the OCaml interface;
+ ciao_prolog, the Ciao Prolog interface;
+ gnu_prolog, the GNU Prolog interface;
+ sicstus_prolog, the SICStus Prolog interface;
+ swi_prolog, the SWI-Prolog interface;
+ xsb_prolog, the XSB interface;
+ yap_prolog, the YAP interface.
+
+Note that, in order to build any interface different from the C++ one,
+a recent enough version of GNU M4 is required (the configuration script
+searches for one and gives an error if it cannot find it).
+
+The instantiations for the domains for interfaces other than the main
+C++ interface can be customized via the `instantiations' option for
+the PPL `configure' shell script which is described below. Some
+interfaces depend on language implementations that are somewhat
+problematic, either because they tend to be installed in rather
+unpredictable places, or because some published versions have bugs
+that prevent the PPL interface to run correctly. In these cases,
+information is given in a README.* file. Presently we have:
+
+ README.java,
+ README.ocaml,
+ README.gprolog,
+ README.swiprolog,
+ README.yap.
+
+For the Java interface, the `--with-java=DIR' configure option allows
+to select the Java SDK root directory. We have tested the Java interface
+with the Java SE Development Kit 6 and OpenJDK 1.6.
+
+For the OCaml interface, the `--with-mlgmp=DIR' configure option allows
+to specify the installation directory of the ML GMP package (which allows
+to use GMP numbers in OCaml programs). By default, ML GMP is searched
+in the `gmp' subdirectory of the OCaml standard library directory.
+
+The C++ interface provides access to all the numerical abstractions
+provided by the PPL. The majority of these (we are talking about
+hundreds of different numerical abstractions) are provided by means
+of C++ templates. The other languages interfaced to the PPL, except
+Java, do not have this facility. Moreover, at the time of writing
+we do not know if and to which extent C++ templates can be mapped
+onto Java generics. As a result, for all the language interfaces
+but the C++ one, the instantiation of the template-based numerical
+abstractions must be done at library-compile-time (instead of
+application-compile-time). A small set of instantiations is enabled
+by default. Currently this set is given by
+
+ Polyhedron (which stands for both C_Polyhedron and NNC_Polyhedron),
+ Grid,
+ Rational_Box,
+ BD_Shape<mpz_class>,
+ BD_Shape<mpq_class>,
+ Octagonal_Shape<mpz_class>,
+ Octagonal_Shape<mpq_class>,
+ Constraints_Product<C_Polyhedron, Grid>,
+ Pointset_Powerset<C_Polyhedron>,
+ Pointset_Powerset<NNC_Polyhedron>,
+
+plus, if the host architecture supports double precision floating point
+numbers conforming to the IEEE 754 standard,
+
+ Double_Box,
+ BD_Shape<double>,
+ Octagonal_Shape<double>.
+
+To enable a different set of instantiations, the configure option
+
+ --enable-instantiations=INSTANTIATIONS
+
+The list of of possibilities for the `INSTANTIATIONS' argument can be
+obtained by omitting the argument, i.e., with the configure option
+
+ --enable-instantiations
+
+Note that the stand-alone `Polyhedron' instantiation must be specified
+without any topology `C_' or `NNC_' as they are added automatically
+and both the domains `C_Polyhedron' and `NNC_Polyhedron' will be
+generated.
+
+
+6. Configuring for Optimized Performance
+----------------------------------------
+
+By default, the PPL is compiled with all the optimizations provided
+by the compiler that do not involve a space-speed tradeoff (a.k.a.
+-O2 optimization). The same optimization level can be obtained by
+using the configure options
+
+ --enable-optimization
+or
+ --enable-optimization=standard
+
+You can try to squeeze more speed from your compiler by using the
+`--enable-optimization=speed' compiler option (a.k.a. -O3
+optimization): this is recommended if you use the checked integers
+coefficients, even though it does not come with an 100% guarantee of
+extra performance. With the `--enable-optimization=sspeed'
+optimization even more optimization is requested, possibly at the cost
+of making debugging impossible on some machines. The
+`--enable-optimization=size' configure option instructs the compiler
+to optimize for size and for speed, but only for speed improvements do
+not increase code size.
+
+Further optimization can be requested at the expense of portability
+of the generated code. This can be achieved by means of the configure option
+
+ --enable-arch[=ARCH]
+
+If the ARCH argument is omitted the configure script attempts to
+detect the architecture of the system. Allowed values for ARCH can be
+found in the documentation of the `-march' option of the used C/C++
+compiler.
+
+For floating point computations, the option
+
+ --enable-fpmath=INSTRUCTION_SET
+
+allows for selecting, on the IA32 and x86_64, the floating point instruction
+set. The allowed values for INSTRUCTION_SET are `sse', `sse2', `387,
+`sse+387', and `sse2+387', `default', and `no'. The latter option, which
+is equivalent to specifying `--disable-fpmath', has the effect of disabling
+all floating point computation and, consequently, all the numerical
+abstractions based on floating point numbers.
+
+On the other hand, there are configure options to request lesser
+degrees of optimization for the sake of debugging. These are,
+in decreasing order of optimization, `--enable-optimization=mild'
+(a.k.a. -O1 optimization), `--enable-optimization=no' or, equivalently
+`--disable-optimization', and `--enable-optimization=zero'
+(a.k.a. -O0 optimization). See below for more information on the
+configure options that are useful for debugging purposes.
+
+
+7. Advanced Performance Tuning
+------------------------------
+
+Starting from version 1.0, the library fully supports two different
+representations for rows (i.e., sequences of coefficients):
+
+ - the "dense" representation is an array-like representation tailored
+ to sequences having most of their coefficients different from zero;
+
+ - the "sparse" representation saves memory space (as well as CPU
+ cycles) when most of the coefficients in the sequence are zero.
+
+A generic interface allows for a seamless interaction between the
+dense and the sparse row representation. Most library entities (linear
+expressions, constraints, generators, congruences, and their systems)
+can be built using either representation, specified as a constructor's
+argument. Reasonable default values for the row representation are
+provided for each library entity, automatically leading to significant
+memory space savings even in old client/library code, e.g., when
+dealing with constraint systems describing weakly relational
+abstractions such as boxes and octagonal shapes.
+
+If desired, these default values can be customized to user's needs by
+changing just a few lines of library code. For instance, the
+constraint systems stored inside C_Polyhedron and NNC_Polyhedron
+objects can be made to use the sparse representation by just changing
+the following line in Polyhedron_defs.hh:
+
+ static const Representation default_con_sys_repr = DENSE;
+
+to become
+
+ static const Representation default_con_sys_repr = SPARSE;
+
+
+8. Configuring for Debugging
+----------------------------
+
+By default, the PPL is configured with debugging information enabled.
+In case you are absolutely, definitely, positively sure that you will
+not need to engage in debugging sessions and wish to save some little
+disk space and compilation time/memory you can configure with the
+`--disable-debugging' option.
+
+When the results you obtain with the PPL surprise you and make you think
+there might be a bug somewhere, it is a good idea to build a version
+of the library using the `--enable-assertions' configure option. This
+causes many run-time assertions to be checked and often result in the
+easier identification of bugs in your application or the library itself.
+Even more run-time assertions can be enabled with the
+`--enable-more-assertions': this causes some PPL objects to carry
+additional data fields for the purpose of making extra checks possible.
+Of course, this breaks the ABI of the library, so you should recompile
+the part of your application that depends on the PPL.
+
+If you are disappointed by performance of the library and would like
+to check where the computation time is being spent, you can use the
+`--enable-profiling' option to generate a version that writes profile
+information suitable for the `gprof' analysis program.
+
+The `--enable-valgrind-tests' causes most of the tests run by `make check'
+under Valgrind's Memcheck tool. This will show you if the library has
+memory leaks. At release time, we guarantee that Memcheck does not
+reveal any memory leak for tests using the C++ and the C interfaces.
+We are not able to make a similar guarantee for other interfaces because
+the corresponding language implementations (e.g., OCaml and SWI-Prolog)
+purposely do not deallocate all memory on exit.
+
+In order to assess the coverage of the PPL test suite, the
+`--enable-coverage' configure option is provided. This causes instrumented
+code to be used in conjunction with the `gcov' coverage testing tool.
+
+
+9. Programs that Come with the Library
+--------------------------------------
+
+The PPL is shipped with two programs that are interesting per se, and
+allow to sanity-check the build as well as to obtain performance
+comparisons. The first such program is `ppl_lpsol', which offers some
+of the functionality of GLPK's `glpsol' using the service of the
+PPL, including its simplex solver. Since `ppl_lpsol' uses GLPK's
+input routines, it is only built if a suitable version of GLPK is
+available. If you prefer `ppl_lpsol' not to be built, use the
+configure option
+
+ --disable-ppl_lpsol
+
+Another program that is built by default and is used for regression
+testing and build validation is `ppl_lcdd'. This is a program for
+vertex/facet enumeration, accepting the same input format as the
+similar programs shipped with cddlib and lrslib. If you prefer `ppl_lcdd'
+not to be built, use the configure option
+
+ --disable-ppl_lcdd
+
+Disabling these programs will shorten the compilation time by a few
+seconds, and the time spent in `make check' by a dozen of minutes.
+In exchange, you will give up an important opportunity to discover
+whether the version of PPL you have built has been miscompiled.
+
+
+10. Using the Git Sources
+-------------------------
+
+If you use the Git sources, then you need recent versions of Autoconf
+Automake and Libtool installed. After a `git clone' or `git pull'
+you should run the `autoreconf' command. In case you have fiddled
+around with some of the configuration files, or if you have problems
+you cannot explain otherwise, use `autoreconf -f'.
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.solaris b/README.solaris
new file mode 100644
index 0000000..f940c14
--- /dev/null
+++ b/README.solaris
@@ -0,0 +1,50 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on Solaris
+=======================================================
+
+Build problems have been reported for Solaris 10, affecting the build
+of the (C, Java, ...) language interfaces, which are due to the use of an
+incompatible version of sed:
+
+ https://www.cs.unipr.it/mantis/view.php?id=103
+
+The solution is to install and use GNU sed.
+This is recommended, even if only the C++ language interface is used.
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/STANDARDS b/STANDARDS
new file mode 100644
index 0000000..a73e161
--- /dev/null
+++ b/STANDARDS
@@ -0,0 +1,739 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Coding Standards for the Parma Polyhedra Library
+================================================
+
+Please read the first chapters of "Ada 95 Quality and Style:
+Guidelines for Professional Programmers" (you will find a link to it
+in the "Links" section of the PPL web site).
+
+
+Names
+-----
+
+Carefully choose names that clarify the nature or the intended use of
+the entity you are naming. Do not be afraid of long identifiers, even
+though conciseness is always a good thing. Do not use abbreviations
+when shorter synonyms exist. Use underscores to separate words in a
+compound name. By all means, avoid baStudlyCaps: write
+available_widening_tokens (if it is a variable) or
+Available_Widening_Tokens (if it is a class or enum); never write
+availableWideningTokens or AvailableWideningTokens.
+In general, we use:
+
+ lower_case for variables, methods, functions, typedefs;
+ UPPER_CASE for macros and enum values;
+ Mixed_Case for class names and template parameter names.
+
+
+Pre and post increment and decrement operators
+----------------------------------------------
+
+All other things being equal, always prefer preincrement and
+predecrement to postincrement and postdecrement.
+
+
+Swap specialization
+-------------------
+
+All library types should provide a publicly available swap method.
+Whenever appropriate for ensuring efficiency, the generic std::swap
+algorithm should be specialized to use the swap method.
+
+
+Limiting the visibility of variables, functions, macros and so forth
+--------------------------------------------------------------------
+
+Avoid using the keyword `static' to specify that global variables or
+functions should be visible only inside the current translation unit;
+use the anonymous namespace, instead. The keyword `static' should
+only appear inside class definitions or function bodies. As an example,
+
+static const char* s = "Not accessible by other translation units";
+
+static void f() {
+ // ... function body ...
+}
+
+should be replaced by
+
+namespace {
+
+const char* s = "Not accessible by other translation units";
+
+void f() {
+ // ... function body ...
+}
+
+} // namespace
+
+However, do not use anonymous namespaces in a header file
+(any file that is meant to be included in other translation units).
+Instead, define and use a new non-anonymous namespace that should
+be placed inside the namespace
+
+ Parma_Polyhedra_Library::Implementation
+
+Concerning macros and the implementation languages (such as C and Prolog)
+that have a flat identifiers namespace, make sure the library limits
+its impact as much as possible by naming objects in a conspicuous way
+and by limiting as much as possible the scope of declarations.
+This means
+
+- all C and C++ macros should have names prefixed by `PPL_';
+ those that are not meant to be directly accessible by the user should
+ be #undef'ed as soon as possible in the source file they are defined in;
+- all functions and types declared by the C interface should have
+ names prefixed by `ppl_';
+- all Prolog predicates declared by the Prolog interfaces should have
+ names prefixed by `ppl_'.
+
+
+Macros
+------
+
+Macros should be used only if really needed (in many cases, macros can
+be replaced by inline functions).
+
+
+Block closures
+--------------
+
+Try to make clear what is being closed. For example:
+
+1)
+
+namespace Parma_Polyhedra_Library {
+
+...
+
+} // namespace Parma_Polyhedra_Library
+
+2)
+
+extern "C" {
+
+...
+
+} // extern "C"
+
+3)
+
+#ifndef PPL_Class_defs_hh
+
+...
+
+#endif // !defined(PPL_Class_defs_hh)
+
+
+Negation
+--------
+
+Use `!' to negate a value.
+
+For example, use
+
+ if (!ph.is_empty())
+ std::cout << "ph contains at least one point" << endl;
+
+instead of
+
+ if (ph.is_empty() == false)
+ std::cout << "ph contains at least one point" << endl;
+
+
+Comparison with zero
+--------------------
+
+Be explicit when comparing a value with zero in a conditional context.
+
+For example, use
+
+ assert(sys.num_rows() != 0);
+
+instead of
+
+ assert(sys.num_rows());
+
+
+Formatting Conventions
+======================
+
+Indent each level using two spaces.
+Insert a space: after each comma, before and after each operator, after
+if/do/while keywords. As an exception to this rule, spaces can be omitted near
+arithmetic multiplication and division operator, if they would harm
+readability.
+Don't insert spaces between the name of a function and the following
+parenthesis.
+Braces should be cuddled on the preceding/following line.
+Avoid, when possible, source lines longer than 78 characters.
+In a function declaration, the return type of a function and the modifiers
+must be placed alone in one line.
+In pointer and reference types, the * and & characters should be followed, but
+not preceded, by a space.
+
+This is bad:
+
+inline void C::f(int *x,int y)
+{
+if( x!=0 )
+{
+ int &z=y;
+ foo (x / 2+y * 3,z/bar(5));
+}
+}
+
+This is good:
+
+inline void
+C::f(int* x, int y) {
+ if (x != 0) {
+ int& z = y;
+ foo(x/2 + y*3, z / bar(5));
+ }
+}
+
+
+Namespace indentation
+---------------------
+
+The entire library is in its own namespace. We sometimes specialize
+std::swap() and std::iter_swap(). Other namespaces may be involved
+but only in restricted contexts. Therefore, we have unindented
+namespace-level declarations, thus saving some precious horizontal
+space. For example:
+
+namespace Parma_Polyhedra_Library {
+
+non-empty lines here start at column 0;
+
+} // namespace Parma_Polyhedra_Library
+
+If you use Emacs, you may want to put the following two lines in your
+.emacs:
+
+;; Disable indentation when in namespace blocks.
+(c-set-offset 'innamespace 0)
+
+
+Trailing whitespace
+-------------------
+
+Always avoid trailing whitespace.
+If you use Emacs, then all the trailing whitespace in the current
+buffer can be removed by using the command
+
+ M-x delete-trailing-whitespace
+
+If you keep inserting trailing whitespace when coding, then you may
+want to put the following two lines in your .emacs:
+
+;; Show trailing whitespace.
+(setq-default show-trailing-whitespace t)
+
+
+Standards for Structuring the Source Code in Files
+==================================================
+
+Source code should be organized so as to ensure that:
+ - the contents of a file are strongly related;
+ - each file is of manageable size.
+
+As a rule of thumb, each type (class, struct, class template, etc.)
+named `Xtype' that is relevant on its own for the user or the
+developer of the library should be provided with a set of source files
+whose filenames start with `Xtype'. The source files for such a type
+should be named and populated as follows:
+
+a) Xtype_types.hh
+Contains the forward declarations of type names (in particular, the
+one for `Xtype') and other useful typedef's.
+
+b) Xtype_defs.hh
+Contains the definition of the type, together with the declaration of
+any function that, even though not being formally part of the type, is
+nonetheless related to it and should therefore be considered part of
+its interface.
+
+c) Xtype_inlines.hh
+Contains the definitions of inline functions.
+
+d) Xtype_templates.hh
+Contains the non-inline definitions of all class template members and
+all (member or non-member) function templates that are not fully
+specialized.
+
+e) Xtype.cc
+Contains the definitions of non-inline functions, including non-inline
+full specializations of templates.
+
+f) When appropriate, further *.cc files can be used to split huge
+source files into more manageable components (e.g., see the files
+Polyhedron_public.cc, Polyhedron_nonpublic.cc, Polyhedron_chdims.cc
+and Polyhedron_widenings.cc, or even conversion.cc, minimize.cc, etc.).
+
+Note that:
+ - all interface functions should be declared in Xtype_defs.hh;
+ - no function definition should be placed in Xtype_defs.hh;
+ - bare declarations should not be declared inline (i.e., inline directives
+ should be placed only in front of the definition of the functions);
+ - inner classes are usually kept in the same files as the outer class;
+ - functions having the anonymous namespace scope can be (and usually are)
+ only declared and defined in file Xtype.cc, regardless of whether or not
+ the inline directive is specified.
+
+
+Standards for Writing the Makefile.am Files
+===========================================
+
+How to clean what
+-----------------
+
+Cleaning in this context means removing files from the build directory.
+In order to clean files, they must be listed in one of three variables:
+MOSTLYCLEANFILES, CLEANFILES and DISTCLEANFILES. The rules (believed to
+have been first formulated by Francois Pinard) are:
+
+ - If `make' built the file, and it is commonly something that one would
+ want to rebuild (such as an object file), then list the file in
+ MOSTLYCLEANFILES.
+ - Otherwise, if `make' built the file, then list it in CLEANFILES.
+ - Otherwise, if `configure' built the file, then list it in DISTCLEANFILES.
+
+When cleaning is more complex than a simple deletion, you can use the hooks
+mostlyclean-local, clean-local and distclean-local.
+
+
+Standards for Documenting the Project with Doxygen
+==================================================
+
+1) All code entities (classes, structs, enums, variables, methods,
+ functions, etc.) should be provided with a brief Doxygen comment.
+ Brief comments are normally obtained as follows:
+
+ //! Brief comment for class C.
+ class C {
+ ...
+ };
+
+ If the comment is multi-line, then the following syntax should be adopted:
+
+ /*! \brief
+ A brief comment for class C, that is a bit too long
+ to be placed in a single line.
+ */
+ class C {
+ ...
+ };
+
+2) A *friend* declaration of a function should NOT be provided with
+ a Doxygen comment. Rather, it is the very declaration of the function
+ (which should be found outside of the class) that has to be documented.
+
+3) When needed or useful, brief comments should be followed by detailed
+ Doxygen comments. If the brief comment spans a single line of text, then
+ the following syntax can be adopted:
+
+ //! Brief comment for class C.
+ /*!
+ More details on class C.
+ Even more details.
+ */
+ class C {
+ ...
+ };
+
+ Otherwise, if the brief comment spans multiple lines of text, the
+ following syntax should be adopted, where the brief and the detailed
+ documentation are merged in a single multiline comment block:
+
+ /*! \brief
+ Brief comment for class C.
+
+ More details on class C.
+ Even more details.
+ */
+ class C {
+ ...
+ };
+
+ The first paragraph break (in this case, the empty line) marks the
+ separation between the brief and the detailed part. Note that
+ all the uses of \param, \result and \exception special commands
+ will automatically cause a paragraph break, therefore starting
+ the detailed part. This will happen even when using the //! style
+ documentation blocks.
+
+4) In the produced documentation, the brief comment will be
+ automatically repeated just before the detailed comment,
+ so that bare repetitions should be avoided.
+
+5) In the source files, detailed comments should be placed together
+ with the brief ones, so that all the documentation pertinent to a
+ code entity is kept in a single file (typically, the *_defs.hh file).
+
+6) Brief Doxygen comments should be brief (indeed).
+ If more than two lines are required, then the comment should be
+ split into a brief part and a detailed part.
+
+7) Code entities or details that should not be visible to the end-user
+ (but that are useful for the developers) should be surrounded by
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! ... Doxygen comments ...
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+ so that they will only appear in the developer's reference.
+ Note that the above preprocessing flags are not necessary
+ (and should therefore be avoided) when documenting:
+ - a private member of a class (because private members never
+ appear in the user manual);
+ - a public member of a class that is not documented
+ (because even the documented members of an undocumented
+ class are automatically filtered out of the user manual).
+
+8) Merging multiple comment blocks is not (fully) supported by Doxygen.
+ Thus, the technique described in point 4) above is useless
+ when we want an end-user comment block to be integrated,
+ in the developer's reference only, by further comments.
+ In such a case, a single comment block should be used as follows:
+
+ /*!
+ ... Doxygen comments for both user and developer ...
+ \if Include_Implementation_Details
+ ... Doxygen comments for developer only ...
+ \endif
+ ... Doxygen comments for both user and developer ...
+ */
+
+9) The documentation of those functions that are neither methods
+ nor friends of a given class, but are related in some way to that
+ class, should be made part of the documentation of the class.
+ This is obtained by using the Doxygen \relates special command
+ as follows:
+
+ /*! \relates Classname */
+
+ It seems that, in order to correctly match function declarations
+ and definitions, the \relates command should be placed in both places.
+ Typically, this will be the only kind of Doxygen command
+ occurring in *_inlines.hh and *.cc source files.
+
+ If Classname is a template class, the arguments of the template
+ (as well as the angle brackets) should be omitted.
+ The namespace qualification of the class can be omitted, provided
+ the comment block is included in the namespace scope.
+
+10)
+ If the \return or \param special commands are used, then these have to
+ be placed after the brief Doxygen comment. The \return special
+ command, if present, should come before any \param command. The
+ \exception special command, if present, should come after any \param
+ command. All the parameters of the function should be provided by the
+ corresponding \param command, respecting their textual order,
+ separating them with a blank line. The documentation of each
+ parameter should start at the line immediately following the \param
+ command. Typically, the list of parameters should be formatted as
+ follows, where the \return command is optional.
+
+ /*! \brief
+ The brief description.
+
+ The detailed description, if any.
+
+ \return
+ Documentation for the return value, if provided.
+
+ \param p1
+ Documentation for p1;
+
+ \param p2
+ Documentation for p2;
+ other documentation for p2;
+
+ \param p3
+ Documentation for p3.
+
+ \exception exception_type1
+ Documentation for the exceptions of type exception_type1;
+
+ \exception exception_type2
+ Documentation for the exceptions of type exception_type2.
+
+ Another piece of detailed description, if needed.
+ */
+ int foo(const bar& p1, const bar& p2, int p3);
+
+
+Standards for the Test Programs
+===============================
+
+o Include the header file `ppl_test.hh' to include common declarations
+ for test code (see below).
+
+o Place the test code in test functions that return a Boolean value.
+ Name the test functions test01, test02, etc.
+
+o Each test program should contain no more than 20 test functions.
+
+o The test functions should be written
+
+ // Comment describing the test...
+ bool
+ test10() {
+ // ... test code ...
+ }
+
+ where the 10 in `test10' indicates that it is the 10th test function
+ in the program.
+
+o The test functions should return true if the test succeeds and false
+ if it fails.
+
+o If a test requires auxiliary functions and/or classes, put them
+ in a namespace named, e.g., `test10_namespace', which in turn is
+ within the anonymous namespace.
+
+o Following all the test functions, include:
+
+ BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ ...
+ END_MAIN
+
+ where every test function in the program is included in the list.
+
+o If any of the tests is known to fail due to an overflow when the
+ library is configured to use some of the bounded-precision checked
+ integers, then the corresponding test function should be called,
+ e.g., as follows
+
+ DO_TEST_F32(test07);
+
+ where the subscript "_F32" means that the overflow is expected for
+ all checked integers having 32 bits at most (i.e., 64 bits checked
+ integers are not expected to overflow). As an alternative,
+
+ DO_TEST_F32A(test07);
+
+ means that the overflow is expected, as before, for all checked
+ integers having less than 32 bits but in the case of 32 bits checked
+ integers the overflow occurs only if assertions are enabled.
+ Hence, the possible subscripts for DO_TEST are:
+
+ _F8A, _F8, _F16A, _F16, _F32A, _F32, _F64A, _F64.
+
+o If any of the tests _may_ fail due to an overflow (when the library
+ is configured to use some of the bounded-precision checked integers)
+ when a templatic shape domain is instantiated using inexact
+ coefficients (e.g., the typedef TBD_Shape stands for BD_Shape<float>),
+ then the corresponding test function should be called as follows
+
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test07, TBD_Shape);
+
+o If a definite overflow (i.e., independent from exactness) is expected
+ for some of the coefficient sizes, then the two macro names above
+ can be combined, e.g., as follows
+
+ DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test07, TBD_Shape);
+
+ meaning that the overflow is expected for 16 (or fewer) bits
+ configurations, while it may occur for configurations using more bits
+ if the shape domain is instantiated usng inexact coefficients.
+
+o Normally, test code should produce no output at all (independently from
+ whether the test succeeded or failed). Output is only meant to help
+ during debugging. In order to support for the coding of conditional
+ output, the header file `ppl_test.hh' defines the output streams `nout'
+ and `vnout'. By default, any output directed to these streams will be
+ simply discarded. For example,
+
+ nout << "A message when noisy." << endl;
+ vnout << "A message when very noisy." << endl;
+
+ will produce no output at all. By default, the helper print functions
+ (e.g., print_constraints, print_generators, etc.) are directed to
+ stream `nout', so that they will normally discard the output too.
+
+o By defining the environment variables `PPL_NOISY_TESTS' and/or
+ `PPL_VERY_NOISY_TESTS' to any value, the streams `nout' and `vnout'
+ will be redirected to standard output and become noisy.
+
+o On very weird platforms the above mechanism may not be supported.
+ In these rare cases, the same effect can be obtained by defining
+ the preprocessor variables NOISY and/or VERY_NOISY to any value other
+ than zero and recompiling the test program. Thus, if some output is
+ (locally and temporarily) needed for debugging purposes, one option
+ is to add
+
+ #define NOISY 1
+ #define VERY_NOISY 1
+
+ as the very first line of the test source file and recompile it.
+
+o To avoid repeated namespace qualifications, the header file `ppl_test.hh'
+ adds a using directive for the whole PPL namespace. It also adds a
+ using declaration for `std::endl'. All the other objects defined in
+ the namespace `std' should be explicitly qualified in the test files
+ (typically, by adding a corresponding using declaration).
+
+o If PPL stream input and output is required, then an explicit using
+ directive for the Parma_Polyhedra_Library::IO_Operators namespace
+ should be added to the test file.
+
+o Refer to the existing tests for examples. Many tests are written along
+ the following schema:
+ a) create a PPL object and perform some computations with it;
+ b) create a second object in a different (maybe simpler) way, having
+ as value the expected result of the computations done in point a);
+ c) check for equivalence of the two objects.
+
+o Ideally the tests should exercise every line of code in the library.
+ To help ensure that, the test-coverage facilities provided by GCC
+ are very useful. They are described in Chapter 9 of the GCC manual
+ ("`gcov'---a Test Coverage Program"). For a simpler user interaction
+ with gcov, also including the generation of nicer HTML output, the
+ adoption of `lcov' is recommended (LCOV, the Linux Test Project GCOV
+ extension, http://ltp.sourceforge.net/coverage/lcov.php).
+ Here we summarize the steps needed to produce coverage information
+ using `lcov' (see below for a few hints on the direct use of `gcov').
+ The build tree under test must be configured with the
+ `--enable-coverage' and `--disable-optimization' options (and possibly
+ also with --enable-profiling). Furthermore, according to this thread
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12076
+ GCC performs NRV (Named Return Value) transformations even when
+ optimizations are turned off; hence, to avoid spurious zero counts
+ in return statements, the compilation flag `-fno-elide-constructors'
+ is recommended. For example:
+
+ $ configure --enable-coverage --enable-profiling \
+ --disable-optimization --with-cxxflags='-fno-elide-constructors' \
+ --enable-assertions --enable-more-assertions
+
+ Running the tests (with `make check') produces many .gcno and .gcda
+ files in src/.libs and in the test directories. These are data
+ files for the `gcov' program. All the coverage data produced can be
+ automatically collected by `lcov' using the following command:
+
+ $ lcov --directory . --capture --output-file ppl-lcov.info
+
+ To generate HTML pages with the graphical view of the captured data,
+ use the `genhtml' command:
+
+ $ genhtml ppl-lcov.info --output-directory ppl-lcov-html
+
+ Coverage info can now be seen by pointing your favorite browser to
+ file ppl-lcov-html/index.html. The annotated sources will look like
+ the following (plus color information), where the value on the left
+ hand side of the colon is the number of executions of the corresponding
+ line of code (see also below on the use of coverage counters):
+
+ 1636 : PPL_DIRTY_TEMP(N, sum);
+ 9828 : for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ 6556 : const DB_Row<N>& x_dbm_k = x.dbm[k];
+ 39648 : for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ 26536 : DB_Row<N>& x_dbm_i = x.dbm[i];
+ 26536 : const N& x_dbm_i_k = x_dbm_i[k];
+ 26536 : if (!is_plus_infinity(x_dbm_i_k))
+ 55128 : for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ 36904 : const N& x_dbm_k_j = x_dbm_k[j];
+ 36904 : if (!is_plus_infinity(x_dbm_k_j)) {
+ : // Rounding upward for correctness.
+ 12136 : add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+ 12136 : min_assign(x_dbm_i[j], sum);
+ : }
+ : }
+ : }
+ : }
+
+ Note that the collection of coverage information is incremental:
+ running again any tests will add to coverage counters (in order
+ to see the changes, coverage data has to be re-captured using the
+ `lcov' command and HTML pages re-generated using the `genhtml' command).
+ Coverage counters can be reset to zero by issuing the command:
+
+ $ lcov --directory . --zerocounters
+
+ As said above, `lcov' is just a wrapper on top of `gcov'. The direct
+ use of `gcov' produces plain-text based coverage information.
+ For example:
+
+ $ cd src
+ $ gcov -o .libs Grid_public.cc
+
+ will produce a file called Grid_public.cc.gcov containing the
+ coverage information for Grid_public.cc. In a similar way
+
+ $ cd tests/Grid
+ $ gcov *.cc
+
+ will produce a file call tests/Grid/ppl.hh.gcov containing coverage
+ information for the header files.
+
+ Below is a section from a .gcov file. The first column is the
+ number of times the line was run, the second is the line number of the
+ line in the source file. Line 1006 has been run 48245 times. Lines
+ 1007, 1002 and 1013 have yet to be run. It would be very difficult
+ to run line 1007, since this requires a Linear_System that does not
+ satisfy the invariants for its class and the PPL does everything it
+ can to make that impossible without fiddling with memory using raw
+ memory pointers. Similarly for line 1013. However, the fact that
+ line 1012 has never been run is suspicious and may indicate an area
+ that needs testing.
+
+ -: 1001:bool
+ 48245: 1002:PPL::Generator_System::OK() const {
+ -: 1003: // A Generator_System must be a valid Linear_System; do not check for
+ -: 1004: // strong normalization, since this will be done when
+ -: 1005: // checking each individual generator.
+ 48245: 1006: if (!Linear_System::OK(false))
+ #####: 1007: return false;
+ -: 1008:
+ -: 1009: // Checking each generator in the system.
+ 48245: 1010: const Generator_System& x = *this;
+ 96490: 1011: for (dimension_type i = num_rows(); i-- > 0; )
+ #####: 1012: if (!x[i].OK())
+ #####: 1013: return false;
+ -: 1014:
+ -: 1015: // All checks passed.
+ 48245: 1016: return true;
+ -: 1017:}
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..4c74e74
--- /dev/null
+++ b/TODO
@@ -0,0 +1,111 @@
+
+Enhancements for PPL 1.1 or later versions
+==========================================
+
+- Make all the *affine*image() methods uniform as far as the
+ specification is concerned.
+- Add the domains of bounded integers and affine spaces.
+- Intervals are best instantiated with checked numbers with
+ particular policies: review all the interfaced boxes,
+ augment the testsuite, and update the documentation.
+- Make the library thread-safe.
+- Modify the Makefile.am's to extend silent mode to our own rules.
+- Reduce the number of FIXMEs to no more than 20.
+- Base the OCaml interface on Zarith
+ (http://forge.ocamlcore.org/projects/zarith/) instead of MLGMP.
+- Improve the OCaml interface by supporting dynamic loading.
+- Enhance the support for systems not providing support for the IEEE
+ inexact flag.
+- `make check' in ppl_lpsol must run also the incremental version
+ of the simplex solver.
+- Complete the implementation of the --enable-check configure option.
+ Explain it in README.configure.
+- Ensure the tests in tests/MIP_Problem/* cover every line of
+ code in MIP_Problem.*.
+- Suppose we want to sum three numbers, and suppose we do it by
+
+ add(T& to, const T& x, const T& y, const T& z) {
+ add(to, x, y);
+ add(to, to, z);
+ }
+
+ Now suppose that &to == &z, so that we compute the wrong result.
+ Perform a code audit to ensure that the above situation never happens.
+ In order to ensure that, ensure that the following rule (to be added
+ to STANDARDS) is always obeyed:
+
+ if an argument of type T and passed by reference is changed,
+ after the change no argument of type U and passed by const or
+ non-const reference should be read unless U is incompatible with T
+ or we are otherwise 100% sure that the changed argument and the
+ argument that is read afterward are not aliases (in the latter
+ case an assert(&to != &z) shall be added.
+- Improve the handling of the --enable-instantiations configure
+ option so that "closure by subdomain" is automatically implemented
+ (e.g., if Pointset_Powerset(X) is specified, X should be automatically
+ added in case it is not already present).
+- Add a "quick assign" function to checked numbers that allows
+ to efficiently assign small integer constants (like those in
+ the range [-2, 2]) that are guaranteed not to cause any
+ rounding or overflow problems.
+- Consider whether or not our interface for method time_elapse_assign()
+ is the one needed by users: in particular, see if it should take as
+ an argument a generator system, instead of an abstract element.
+- Provide a generic implementation for the `widening with tokens'.
+- Implement the extrapolation operators defined in HenzingerH95
+ and HenzingerPW01.
+- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+- Provide support for strict inequalities in MIP problems.
+- Pointset_Powerset and Partially_Reduced_Product domains:
+ Improve and add to the existing methods for the powerset and product domains
+ so that they can be subdomains of themselves and of each other;
+ tidy the tests directories for these domains and ensure the code
+ with all likely instantiations is fully tested;
+ add the same functionaity to the C, Java, OCaml and Prolog interfaces.
+- Any_Pointset domain: check the interface for lacking or useless methods.
+
+
+Enhancements for PPL 1.2 or later versions
+==========================================
+
+- Find a way to let the GMP and checked-int versions of the PPL coexist
+ so as to allow using them in the same application.
+- Provide methods computing approximations of the integer convex hull
+ of semantic domains for the case where we are only interested in integral
+ solutions (as is the case, e.g., in many program analyses). Then
+ cutting-plane methods (Gomory, Chvatal, ...) allow to shrink polyhedra
+ still not losing any integral solution.
+ See http://bugseng.com/products/ppl/Documentation/bibliography#NemhauserW88
+ Check the work by Kent Andersen and Gerard Cornuejols on
+ reduce-and-split cuts.
+- Consider the addition of "constraint-only" methods (e.g., computing
+ projections and upper bounds using the MIP solver).
+- Consider extending the MIP solver to handle Parametric Integer
+ Programming.
+- In the OK() methods, instead of having all those #ifndef NDEBUG,
+ it is probably worthwhile to use a suitable defined `barf' stream
+ that does the right thing.
+- Using meta_programming.hh it is possible to define all the swap functions
+ "automatically". Consider whether it is worth doing it.
+- Provide a single, generic implementation to replace all our status
+ classes.
+- Provide optimized implementations of Polyhedron::expand_dimension()
+ Polyhedron::fold_dimensions().
+- Add an implementation of Minkowski addition. Check the algorithm
+ described in
+
+ K. Fukuda.
+ From the zonotope construction to the Minkowski addition
+ of convex polytopes.
+ J. Symbolic Comput., 38(4):1261-1272, 2004.
+
+
+
+Efficiency Issues
+=================
+
+- There must be a more efficient way to implement
+ bool Polyhedron::is_disjoint_from(const Polyhedron&).
+- There must be a more efficient way to compute convex differences.
+- Provide a better implementation of computing squares in MIP_Problem's
+ steepest-edge to avoid big numbers.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..c0d06d9
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1177 @@
+# generated automatically by aclocal 1.14 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.14'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.14], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.14])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ac_check_ciao.m4])
+m4_include([m4/ac_check_fpu_control.m4])
+m4_include([m4/ac_check_gmp.m4])
+m4_include([m4/ac_check_sicstus_prolog.m4])
+m4_include([m4/ac_check_swi_prolog.m4])
+m4_include([m4/ac_check_xsb_prolog.m4])
+m4_include([m4/ac_check_yap.m4])
+m4_include([m4/ac_cxx_attribute_weak.m4])
+m4_include([m4/ac_cxx_double_binary_format.m4])
+m4_include([m4/ac_cxx_float_binary_format.m4])
+m4_include([m4/ac_cxx_ieee_inexact_flag.m4])
+m4_include([m4/ac_cxx_limit_memory.m4])
+m4_include([m4/ac_cxx_long_double_binary_format.m4])
+m4_include([m4/ac_cxx_plain_char_is_signed.m4])
+m4_include([m4/ac_cxx_proper_long_double.m4])
+m4_include([m4/ac_cxx_zero_length_arrays.m4])
+m4_include([m4/ac_prog_jar.m4])
+m4_include([m4/ac_prog_java.m4])
+m4_include([m4/ac_prog_javac.m4])
+m4_include([m4/ac_prog_javah.m4])
+m4_include([m4/ac_text_md5sum.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([m4/m4.m4])
+m4_include([m4/ocaml.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..531136b
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..b79252d
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1558 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-06-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ LIBC=gnu
+
+ eval $set_cc_for_build
+ cat <<-EOF > $dummy.c
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #else
+ LIBC=gnu
+ #endif
+ EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval $set_cc_for_build
+ SUN_ARCH="i386"
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH="x86_64"
+ fi
+ fi
+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case ${UNAME_PROCESSOR} in
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW64*:*)
+ echo ${UNAME_MACHINE}-pc-mingw64
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:MSYS*:*)
+ echo ${UNAME_MACHINE}-pc-msys
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ 8664:Windows_NT:*)
+ echo x86_64-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ aarch64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ arc:Linux:*:* | arceb:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ cris:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ exit ;;
+ crisv32:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ exit ;;
+ frv:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ hexagon:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ i*86:Linux:*:*)
+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+ or1k:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ or32:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-${LIBC}
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+ *) echo hppa-unknown-linux-${LIBC} ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-${LIBC}
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-${LIBC}
+ exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-${LIBC}
+ exit ;;
+ ppcle:Linux:*:*)
+ echo powerpcle-unknown-linux-${LIBC}
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ tile*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ exit ;;
+ x86_64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configury will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel at ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes at openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf at swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green at stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green at stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ x86_64:Haiku:*:*)
+ echo x86_64-unknown-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ eval $set_cc_for_build
+ if test "$UNAME_PROCESSOR" = unknown ; then
+ UNAME_PROCESSOR=powerpc
+ fi
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ fi
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NEO-?:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo ${UNAME_MACHINE}-pc-aros
+ exit ;;
+ x86_64:VMkernel:*:*)
+ echo ${UNAME_MACHINE}-unknown-esx
+ exit ;;
+esac
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..9e7e5bf
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,411 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+ floating point format. */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#undef HAVE_DECL_FFS
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#undef HAVE_DECL_FMA
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FMAF
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FMAL
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETRUSAGE
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+ */
+#undef HAVE_DECL_RINTF
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+ */
+#undef HAVE_DECL_RINTL
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+ don't. */
+#undef HAVE_DECL_RLIMIT_AS
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+ don't. */
+#undef HAVE_DECL_RLIMIT_DATA
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+ don't. */
+#undef HAVE_DECL_RLIMIT_RSS
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+ don't. */
+#undef HAVE_DECL_RLIMIT_VMEM
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SETITIMER
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SETRLIMIT
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SIGACTION
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+ */
+#undef HAVE_DECL_STRTOD
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+ */
+#undef HAVE_DECL_STRTOF
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOLD
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#undef HAVE_FENV_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+#undef HAVE_GLPK_GLPK_H
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#undef HAVE_GLPK_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#undef HAVE_INT_FAST16_T
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#undef HAVE_INT_FAST32_T
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#undef HAVE_INT_FAST64_T
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#undef HAVE_SIGINFO_T
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `timeval'. */
+#undef HAVE_TIMEVAL
+
+/* Define to 1 if typeof works with your compiler. */
+#undef HAVE_TYPEOF
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#undef HAVE_UINT_FAST16_T
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#undef HAVE_UINT_FAST32_T
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#undef HAVE_UINT_FAST64_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+#undef PPL_ABI_BREAKING_EXTRA_DEBUG
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+ */
+#undef PPL_CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef PPL_COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef PPL_COEFFICIENT_TYPE
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* The unique code of the binary format of C++ doubles, if supported;
+ undefined otherwise. */
+#undef PPL_CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef PPL_CXX_FLOAT_BINARY_FORMAT
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+ undefined otherwise. */
+#undef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the the plain char type is signed. */
+#undef PPL_CXX_PLAIN_CHAR_IS_SIGNED
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+ range or precision than double. */
+#undef PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#undef PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#undef PPL_CXX_SUPPORTS_LIMITING_MEMORY
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#undef PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#undef PPL_FPMATH_MAY_USE_387
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#undef PPL_FPMATH_MAY_USE_SSE
+
+/* Defined if GLPK provides glp_term_hook(). */
+#undef PPL_GLPK_HAS_GLP_TERM_HOOK
+
+/* Defined if GLPK provides glp_term_out(). */
+#undef PPL_GLPK_HAS_GLP_TERM_OUT
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+#undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef PPL_GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef PPL_GMP_SUPPORTS_EXCEPTIONS
+
+/* Defined if the integral type to be used for coefficients is a native one.
+ */
+#undef PPL_NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef PPL_NDEBUG
+
+/* Not zero if doubles are supported. */
+#undef PPL_SUPPORTED_DOUBLE
+
+/* Not zero if floats are supported. */
+#undef PPL_SUPPORTED_FLOAT
+
+/* Not zero if long doubles are supported. */
+#undef PPL_SUPPORTED_LONG_DOUBLE
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of `fp', as computed by sizeof. */
+#undef SIZEOF_FP
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `int*', as computed by sizeof. */
+#undef SIZEOF_INTP
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#undef SIZEOF_MP_LIMB_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+#undef _GLIBCXX_DEBUG
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+#undef _GLIBCXX_DEBUG_PEDANTIC
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+#undef typeof
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+#undef uintptr_t
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+ we must make sure <stdint.h> is included before <sys/types.hh> is
+ (even indirectly) included. Moreover we need to define
+ __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+ in order to have the macros defined also in C++. */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..c547c68
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,666 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2007 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ darwin*)
+ case $cc_basename in
+ xlc*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | pw32* | os2*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ wl='-Wl,'
+ ;;
+ pgcc | pgf77 | pgf90)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we cannot use
+ # them.
+ ld_shlibs=no
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if test "$GCC" = yes ; then
+ :
+ else
+ case $cc_basename in
+ xlc*)
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+ freebsd2.2*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ freebsd2*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix4* | aix5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ library_names_spec='$libname.a'
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd1*)
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_os" in
+ freebsd[123]*)
+ library_names_spec='$libname$shrext$versuffix' ;;
+ *)
+ library_names_spec='$libname$shrext' ;;
+ esac
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ nto-qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..8b612ab
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1788 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-04-24'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | \
+ kopensolaris*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | be32 | be64 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | epiphany \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+ | open8 \
+ | or1k | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pyramid \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | we32k \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pyramid-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i386-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ z80-*-coff)
+ basic_machine=z80-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or1k-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..896c61f
--- /dev/null
+++ b/configure
@@ -0,0 +1,27096 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for the Parma Polyhedra Library 1.1.
+#
+# Report bugs to <ppl-devel at cs.unipr.it>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: ppl-devel at cs.unipr.it about your system, including any
+$0: error possibly output before this message. Then install
+$0: a modern shell, or manually run the script under such a
+$0: shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Polyhedra Library'
+PACKAGE_TARNAME='ppl'
+PACKAGE_VERSION='1.1'
+PACKAGE_STRING='the Parma Polyhedra Library 1.1'
+PACKAGE_BUGREPORT='ppl-devel at cs.unipr.it'
+PACKAGE_URL=''
+
+ac_unique_file="src/Polyhedron_public.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+mlgmp_dir
+required_instantiations_ocaml_cxx_objects
+required_instantiations_ocaml_cxx_sources
+required_instantiations_ocaml_cxx_headers
+required_instantiations_java_cxx_objects
+required_instantiations_java_cxx_sources
+required_instantiations_java_cxx_headers_sources
+required_instantiations_java_cxx_headers
+required_instantiations_java_classes
+required_instantiations_java_sources
+required_instantiations_prolog_generated_test_sources
+required_instantiations_prolog_cxx_objects
+required_instantiations_prolog_cxx_sources
+required_instantiations_prolog_cxx_headers
+required_instantiations_c_cxx_objects
+required_instantiations_c_cxx_sources
+required_instantiations_c_cxx_headers
+required_instantiations_canonical_names
+required_instantiations
+coefficient_mnemonic
+debug_flag
+extra_libraries
+extra_includes
+SHREXT
+LIBEXT
+HAVE_GLPK_FALSE
+HAVE_GLPK_TRUE
+TEXT_MD5SUM
+HAVE_MD5SUM_FALSE
+HAVE_MD5SUM_TRUE
+MD5SUM
+ENABLE_STATIC_FALSE
+ENABLE_STATIC_TRUE
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+LIBTOOL
+THOROUGH_MAKE_CHECK_FALSE
+THOROUGH_MAKE_CHECK_TRUE
+VALGRIND_TESTS_ENABLED_FALSE
+VALGRIND_TESTS_ENABLED_TRUE
+VALGRIND
+M4_DEBUGFILE
+M4
+BUILD_SOME_PROLOG_INTERFACES_FALSE
+BUILD_SOME_PROLOG_INTERFACES_TRUE
+BUILD_YAP_PROLOG_INTERFACE_FALSE
+BUILD_YAP_PROLOG_INTERFACE_TRUE
+YAP_PROLOG_LD_OPTIONS
+YAP_PROLOG_INCLUDE_OPTIONS
+YAP_PROLOG
+yap_prolog
+BUILD_XSB_PROLOG_INTERFACE_FALSE
+BUILD_XSB_PROLOG_INTERFACE_TRUE
+XSB_PROLOG_INCLUDE_OPTIONS
+xsb_prolog
+BUILD_SWI_PROLOG_INTERFACE_FALSE
+BUILD_SWI_PROLOG_INTERFACE_TRUE
+SWI_PROLOG_LD_OPTIONS
+SWI_PROLOG_INCLUDE_OPTIONS
+SWI_PROLOG_LD
+SWI_PROLOG
+swi_prolog_ld
+swi_prolog
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE
+SICSTUS_PROLOG_INCLUDE_OPTIONS
+sicstus_prolog
+BUILD_GNU_PROLOG_INTERFACE_FALSE
+BUILD_GNU_PROLOG_INTERFACE_TRUE
+GNU_PROLOG
+BUILD_CIAO_PROLOG_INTERFACE_FALSE
+BUILD_CIAO_PROLOG_INTERFACE_TRUE
+CIAO_PROLOG_INCLUDE_OPTIONS
+CIAO_PROLOG
+ciao_prolog
+BUILD_OCAML_INTERFACE_FALSE
+BUILD_OCAML_INTERFACE_TRUE
+HAVE_OCAMLOPT_FALSE
+HAVE_OCAMLOPT_TRUE
+HAVE_OCAMLC_FALSE
+HAVE_OCAMLC_TRUE
+OCAMLBUILD
+OCAMLDOC
+OCAMLMKLIB
+OCAMLMKTOP
+OCAMLDEP
+OCAMLOPTDOTOPT
+OCAMLCDOTOPT
+OCAMLBEST
+OCAMLOPT
+OCAMLLIB
+OCAMLVERSION
+OCAMLC
+BUILD_JAVA_INTERFACE_FALSE
+BUILD_JAVA_INTERFACE_TRUE
+JNIFLAGS
+JAVAH
+JAR
+uudecode
+JAVA
+JAVAC
+BUILD_C_INTERFACE_FALSE
+BUILD_C_INTERFACE_TRUE
+BUILD_CXX_INTERFACE_FALSE
+BUILD_CXX_INTERFACE_TRUE
+BUILD_DOCUMENTATION_FALSE
+BUILD_DOCUMENTATION_TRUE
+BUILD_PPL_PIPS_FALSE
+BUILD_PPL_PIPS_TRUE
+BUILD_PPL_LPSOL_FALSE
+BUILD_PPL_LPSOL_TRUE
+BUILD_PPL_LCDD_FALSE
+BUILD_PPL_LCDD_TRUE
+SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE
+SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE
+SUPPORTED_LONG_DOUBLE_FALSE
+SUPPORTED_LONG_DOUBLE_TRUE
+SUPPORTED_DOUBLE_FALSE
+SUPPORTED_DOUBLE_TRUE
+SUPPORTED_FLOAT_FALSE
+SUPPORTED_FLOAT_TRUE
+CAN_CONTROL_FPU_FALSE
+CAN_CONTROL_FPU_TRUE
+HAVE_PERL_FALSE
+HAVE_PERL_TRUE
+PERL
+CPP
+USE_INT64_FALSE
+USE_INT64_TRUE
+USE_INT32_FALSE
+USE_INT32_TRUE
+USE_INT16_FALSE
+USE_INT16_TRUE
+USE_INT8_FALSE
+USE_INT8_TRUE
+USE_GMP_INTEGERS_FALSE
+USE_GMP_INTEGERS_TRUE
+USE_CHECKED_INTEGERS_FALSE
+USE_CHECKED_INTEGERS_TRUE
+USE_NATIVE_INTEGERS_FALSE
+USE_NATIVE_INTEGERS_TRUE
+NO_UNDEFINED_FALSE
+NO_UNDEFINED_TRUE
+HOST_CPU_X86_64_FALSE
+HOST_CPU_X86_64_TRUE
+HOST_OS_SOLARIS_FALSE
+HOST_OS_SOLARIS_TRUE
+HOST_OS_MINGW_FALSE
+HOST_OS_MINGW_TRUE
+HOST_OS_HPUX_FALSE
+HOST_OS_HPUX_TRUE
+HOST_OS_DARWIN_FALSE
+HOST_OS_DARWIN_TRUE
+HOST_OS_CYGWIN_FALSE
+HOST_OS_CYGWIN_TRUE
+USE_PRECOMPILED_HEADERS_FALSE
+USE_PRECOMPILED_HEADERS_TRUE
+ASSERTIONS_ENABLED_FALSE
+ASSERTIONS_ENABLED_TRUE
+DEBUGGING_ENABLED_FALSE
+DEBUGGING_ENABLED_TRUE
+CXXCPP
+SED
+EGREP
+FGREP
+GREP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+ICC_FALSE
+ICC_TRUE
+GCC_FALSE
+GCC_TRUE
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+ISODATE
+CONFIGURE_OPTIONS
+PPL_VERSION_BETA
+PPL_VERSION_REVISION
+PPL_VERSION_MINOR
+PPL_VERSION_MAJOR
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+with_cc
+with_cxx
+enable_dependency_tracking
+enable_debugging
+enable_profiling
+enable_coverage
+enable_assertions
+enable_more_assertions
+enable_optimization
+enable_arch
+enable_fpmath
+enable_pch
+enable_coefficients
+with_cflags
+with_cxxflags
+with_gmp
+with_gmp_include
+with_gmp_lib
+with_gmp_build
+enable_ppl_lcdd
+enable_ppl_lpsol
+enable_ppl_pips
+enable_documentation
+enable_interfaces
+with_java
+with_mlgmp
+enable_instantiations
+enable_valgrind_tests
+enable_check
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+CPP
+M4'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures the Parma Polyhedra Library 1.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/ppl]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of the Parma Polyhedra Library 1.1:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-debugging compile with debugging information
+ --enable-profiling compile for profiling
+ --enable-coverage compile for test coverage
+ --enable-assertions check run-time assertions
+ --enable-more-assertions
+ break the ABI to check even more run-time assertions
+ --enable-optimization[=LEVEL]
+ enable compiler optimizations
+ --enable-arch[=ARCH] optimize for architecture ARCH
+ --enable-fpmath=INSTRUCTION_SET
+ select floating point arithmetic
+ --enable-pch use precompiled headers, if available
+ --enable-coefficients=TYPE
+ select the type of the coefficients
+ --enable-ppl_lcdd build the ppl_lcdd program
+ --enable-ppl_lpsol build the ppl_lpsol program
+ --enable-ppl_pips build the ppl_pips program
+ --enable-documentation build the PPL documentation
+ --enable-interfaces=INTERFACES
+ enable some or all the library interfaces
+ --enable-instantiations=INSTANTIATIONS
+ enable instantiations for the non-C++ interfaces
+ --enable-valgrind-tests run library tests under Valgrind
+ --enable-check=KIND select thorough or quick `make check'
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-static[=PKGS] build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-cc=XXX use XXX as the C compiler
+ --with-cxx=XXX use XXX as the C++ compiler
+ --with-cflags=XXX add XXX to the options for the C compiler
+ --with-cxxflags=XXX add XXX to the options for the C++ compiler
+ --with-gmp=DIR search for libgmp/libgmpxx in DIR/include and
+ DIR/lib
+ --with-gmp-include=DIR search for libgmp/libgmpxx headers in DIR
+ --with-gmp-lib=DIR search for libgmp/libgmpxx library objects in DIR
+ --with-gmp-build=DIR use a non-installed build of GMP in DIR
+ --with-java=DIR use the Java SDK installed in DIR
+ --with-mlgmp=DIR use the ML GMP package installed in DIR
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot=DIR Search for dependent libraries within DIR
+ (or the compiler's sysroot if not specified).
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CXXCPP C++ preprocessor
+ CPP C preprocessor
+ M4 Location of GNU M4 1.4.5 or later. Defaults to the first program
+ of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <ppl-devel at cs.unipr.it>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+the Parma Polyhedra Library configure 1.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid; break
+else
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=$ac_mid; break
+else
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid
+else
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
+# -----------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_cxx_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_decl
+
+# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
+# ---------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_cxx_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_type
+
+# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES
+# ----------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_cxx_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid; break
+else
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_lo=$ac_mid; break
+else
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid
+else
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_compute_int
+
+# ac_fn_cxx_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ------------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_cxx_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_member
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by the Parma Polyhedra Library $as_me 1.1, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Minimum Autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Specify the location of additional local Autoconf macros.
+
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Use Automake.
+am__api_version='1.14'
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='ppl'
+ VERSION='1.1'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+
+# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5
+$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; }
+ if test $am_uid -le $am_max_uid; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ _am_tools=none
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5
+$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; }
+ if test $am_gid -le $am_max_gid; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ _am_tools=none
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ { echo "$as_me:$LINENO: $_am_tar --version" >&5
+ ($_am_tar --version) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && break
+ done
+ am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x ustar -w "$$tardir"'
+ am__tar_='pax -L -x ustar -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+ am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+ am__untar='cpio -i -H ustar -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_ustar}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+ (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+ ($am__untar <conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
+ (cat conftest.dir/file) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ if ${am_cv_prog_tar_ustar+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ am_cv_prog_tar_ustar=$_am_tool
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+
+# Version number machinery.
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+ PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+ PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+ PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+ PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+ PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+ PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+ PPL_VERSION_REVISION=0
+ PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+ PPL_VERSION_BETA=0
+fi
+
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CONFIGURE_OPTIONS "$ac_configure_args"
+_ACEOF
+
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+
+
+# Generate a configuration header file.
+ac_config_headers="$ac_config_headers config.h"
+
+
+ISODATE=`date +%Y-%m-%d`
+
+
+
+
+
+
+
+# C compiler.
+
+
+# Check whether --with-cc was given.
+if test "${with_cc+set}" = set; then :
+ withval=$with_cc; CC=$with_cc
+fi
+
+
+# C++ compiler.
+
+
+# Check whether --with-cxx was given.
+if test "${with_cxx+set}" = set; then :
+ withval=$with_cxx; CXX=$with_cxx
+fi
+
+
+# Checks for programs.
+
+# Note that AC_PROG_CC must precede the first use of $GCC and AC_PROG_CXX
+# must precede the first use of $GXX. Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+CFLAGS="$save_CFLAGS"
+
+ if test x"$GCC" = xyes; then
+ GCC_TRUE=
+ GCC_FALSE='#'
+else
+ GCC_TRUE='#'
+ GCC_FALSE=
+fi
+
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using the Intel C compiler" >&5
+$as_echo_n "checking whether we are actually using the Intel C compiler... " >&6; }
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ICC=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ICC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+ if test x"$ICC" = xyes; then
+ ICC_TRUE=
+ ICC_FALSE='#'
+else
+ ICC_TRUE='#'
+ ICC_FALSE=
+fi
+
+
+# The clang compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using clang" >&5
+$as_echo_n "checking whether we are actually using clang... " >&6; }
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifndef __clang__
+choke me
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CLANG=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CLANG=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The llvm-gcc compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using llvm-gcc" >&5
+$as_echo_n "checking whether we are actually using llvm-gcc... " >&6; }
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int main() {
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LLVM_GCC=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ LLVM_GCC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$save_CFLAGS"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+save_CXXFLAGS="$CXXFLAGS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+else
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using the Intel C++ compiler" >&5
+$as_echo_n "checking whether we are actually using the Intel C++ compiler... " >&6; }
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ICPC=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ICPC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The clang++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using clang++" >&5
+$as_echo_n "checking whether we are actually using clang++... " >&6; }
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifndef __clang__
+choke me
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CLANGXX=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ CLANGXX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The llvm-++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using llvm-g++" >&5
+$as_echo_n "checking whether we are actually using llvm-g++... " >&6; }
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int main() {
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LLVM_GXX=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ LLVM_GXX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CXXFLAGS="$save_CXXFLAGS"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in fgrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if ${ac_cv_prog_CXXCPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+# Compilation flags.
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile with debug info" >&5
+$as_echo_n "checking whether to compile with debug info... " >&6; }
+# Check whether --enable-debugging was given.
+if test "${enable_debugging+set}" = set; then :
+ enableval=$enable_debugging;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ OPT_FLAGS="-g"
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-debugging, needs yes or no" "$LINENO" 5
+ ;;
+esac
+ if test x"$enableval" = xyes; then
+ DEBUGGING_ENABLED_TRUE=
+ DEBUGGING_ENABLED_FALSE='#'
+else
+ DEBUGGING_ENABLED_TRUE='#'
+ DEBUGGING_ENABLED_FALSE=
+fi
+
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile for profiling" >&5
+$as_echo_n "checking whether to compile for profiling... " >&6; }
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then :
+ enableval=$enable_profiling;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-profiling, needs yes or no" "$LINENO" 5
+ ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile for test coverage" >&5
+$as_echo_n "checking whether to compile for test coverage... " >&6; }
+# Check whether --enable-coverage was given.
+if test "${enable_coverage+set}" = set; then :
+ enableval=$enable_coverage;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+ extra_libraries="${extra_libraries} -lgcov"
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-coverage, needs yes or no" "$LINENO" 5
+ ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable checking of run-time assertions" >&5
+$as_echo_n "checking whether to enable checking of run-time assertions... " >&6; }
+# Check whether --enable-assertions was given.
+if test "${enable_assertions+set}" = set; then :
+ enableval=$enable_assertions;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-assertions, needs yes or no" "$LINENO" 5
+ ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable even more run-time assertions" >&5
+$as_echo_n "checking whether to enable even more run-time assertions... " >&6; }
+# Check whether --enable-more-assertions was given.
+if test "${enable_more_assertions+set}" = set; then :
+ enableval=$enable_more_assertions;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-more-assertions, needs yes or no" "$LINENO" 5
+ ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+ enable_assertions=yes
+
+$as_echo "#define PPL_ABI_BREAKING_EXTRA_DEBUG 1" >>confdefs.h
+
+
+$as_echo "#define _GLIBCXX_DEBUG 1" >>confdefs.h
+
+
+$as_echo "#define _GLIBCXX_DEBUG_PEDANTIC 1" >>confdefs.h
+
+fi
+
+if test x"$enable_assertions" = xno
+then
+
+$as_echo "#define PPL_NDEBUG 1" >>confdefs.h
+
+ debug_flag="-DNDEBUG=1"
+fi
+
+ if test x"$enable_assertions" = xyes; then
+ ASSERTIONS_ENABLED_TRUE=
+ ASSERTIONS_ENABLED_FALSE='#'
+else
+ ASSERTIONS_ENABLED_TRUE='#'
+ ASSERTIONS_ENABLED_FALSE=
+fi
+
+
+
+arch=no
+enableval=standard
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable optimizations" >&5
+$as_echo_n "checking whether to enable optimizations... " >&6; }
+# Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then :
+ enableval=$enable_optimization;
+fi
+
+case "${enableval}" in
+sspeed)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sspeed" >&5
+$as_echo "sspeed" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+ arch=yes
+ ;;
+speed)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: speed" >&5
+$as_echo "speed" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -O3"
+ arch=yes
+ ;;
+size)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: size" >&5
+$as_echo "size" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -Os"
+ arch=yes
+ ;;
+standard | yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: standard" >&5
+$as_echo "standard" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -O2"
+ ;;
+mild)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: mild" >&5
+$as_echo "mild" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -O1"
+ ;;
+zero)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: zero" >&5
+$as_echo "zero" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -O0"
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" "$LINENO" 5
+ ;;
+esac
+
+enableval=$arch
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for which architecture to optimize" >&5
+$as_echo_n "checking for which architecture to optimize... " >&6; }
+# Check whether --enable-arch was given.
+if test "${enable_arch+set}" = set; then :
+ enableval=$enable_arch;
+fi
+
+case "${enableval}" in
+yes)
+ m=`uname -m`
+ case $m in
+ i?86 | k6 | athlon)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $m" >&5
+$as_echo "$m" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -march=$m"
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+ ;;
+ esac
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+ ;;
+*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5
+$as_echo "$enableval" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+ ;;
+esac
+
+enableval=default
+use_fpmath=yes
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use (a specific) floating point arithmetic" >&5
+$as_echo_n "checking whether to use (a specific) floating point arithmetic... " >&6; }
+# Check whether --enable-fpmath was given.
+if test "${enable_fpmath+set}" = set; then :
+ enableval=$enable_fpmath;
+fi
+
+case "${enableval}" in
+sse)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse" >&5
+$as_echo "sse" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+ # The SSE instruction set only supports single precision arithmetic:
+ # double and extended precision arithmetic is still done using 387.
+ ;;
+sse2)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse2" >&5
+$as_echo "sse2" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+ # SSE2 still does not support extended precision arithmetic.
+ ;;
+387)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: 387" >&5
+$as_echo "387" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+ # Note that the -mno-sse* and -mfpmath options are only guaranteed
+ # to work with GCC.
+ if test x"$GCC" = xyes
+ then
+ fpmath_may_use_sse=no
+ fi
+ ;;
+sse+387)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse+387" >&5
+$as_echo "sse+387" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+ ;;
+sse2+387)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse2+387" >&5
+$as_echo "sse2+387" >&6; }
+ OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+ ;;
+default)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ use_fpmath=no
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" "$LINENO" 5
+ ;;
+esac
+
+if test x"$fpmath_may_use_387" = xyes
+then
+
+$as_echo "#define PPL_FPMATH_MAY_USE_387 1" >>confdefs.h
+
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+
+$as_echo "#define PPL_FPMATH_MAY_USE_SSE 1" >>confdefs.h
+
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+ if test x"$ICPC" = xyes
+ then
+ OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
+ else
+ # -frounding-math is not yet supported in clang++ or llvm-g++.
+ if test x"$CLANGXX" = xyes || x"$LLVM_GXX" = xyes
+ then
+ if test x"$use_fpmath" = xyes
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL." >&5
+$as_echo "$as_me: WARNING: CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL." >&2;}
+ use_fpmath=no
+ fi
+ else
+ OPT_FLAGS="$OPT_FLAGS -frounding-math"
+ fi
+ fi
+fi
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use precompiled headers" >&5
+$as_echo_n "checking whether to use precompiled headers... " >&6; }
+# Check whether --enable-pch was given.
+if test "${enable_pch+set}" = set; then :
+ enableval=$enable_pch;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-pch, needs yes or no" "$LINENO" 5
+ ;;
+esac
+ if test x"$enableval" = xyes; then
+ USE_PRECOMPILED_HEADERS_TRUE=
+ USE_PRECOMPILED_HEADERS_FALSE='#'
+else
+ USE_PRECOMPILED_HEADERS_TRUE='#'
+ USE_PRECOMPILED_HEADERS_FALSE=
+fi
+
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+# System-dependent adjustments.
+cygwin=no
+mingw=no
+darwin=no
+solaris=no
+x86_64=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+ CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+ else
+ CFLAGS="$CFLAGS -fprm d -ieee_with_inexact"
+ CXXFLAGS="$CXXFLAGS -fprm d -ieee_with_inexact"
+ fi
+ ;;
+x86_64*)
+ x86_64=yes
+ ;;
+*)
+ ;;
+esac
+
+case "${host_os}" in
+cygwin*)
+ cygwin=yes
+ no_undefined=yes
+ shared_library_path_env_var=PATH
+ ;;
+darwin*)
+ darwin=yes
+ shared_library_path_env_var=DYLD_LIBRARY_PATH
+ ;;
+hpux*)
+ hpux=yes
+ shared_library_path_env_var=SHLIB_PATH
+ ;;
+mingw*)
+ mingw=yes
+ no_undefined=yes
+ shared_library_path_env_var=PATH
+ ;;
+solaris*)
+ solaris=yes
+ shared_library_path_env_var=LD_LIBRARY_PATH
+ ;;
+*)
+ shared_library_path_env_var=LD_LIBRARY_PATH
+ ;;
+esac
+
+ if test x$cygwin = xyes; then
+ HOST_OS_CYGWIN_TRUE=
+ HOST_OS_CYGWIN_FALSE='#'
+else
+ HOST_OS_CYGWIN_TRUE='#'
+ HOST_OS_CYGWIN_FALSE=
+fi
+
+ if test x$darwin = xyes; then
+ HOST_OS_DARWIN_TRUE=
+ HOST_OS_DARWIN_FALSE='#'
+else
+ HOST_OS_DARWIN_TRUE='#'
+ HOST_OS_DARWIN_FALSE=
+fi
+
+ if test x$hpux = xyes; then
+ HOST_OS_HPUX_TRUE=
+ HOST_OS_HPUX_FALSE='#'
+else
+ HOST_OS_HPUX_TRUE='#'
+ HOST_OS_HPUX_FALSE=
+fi
+
+ if test x$mingw = xyes; then
+ HOST_OS_MINGW_TRUE=
+ HOST_OS_MINGW_FALSE='#'
+else
+ HOST_OS_MINGW_TRUE='#'
+ HOST_OS_MINGW_FALSE=
+fi
+
+ if test x$solaris = xyes; then
+ HOST_OS_SOLARIS_TRUE=
+ HOST_OS_SOLARIS_FALSE='#'
+else
+ HOST_OS_SOLARIS_TRUE='#'
+ HOST_OS_SOLARIS_FALSE=
+fi
+
+
+ if test x$x86_64 = xyes; then
+ HOST_CPU_X86_64_TRUE=
+ HOST_CPU_X86_64_FALSE='#'
+else
+ HOST_CPU_X86_64_TRUE='#'
+ HOST_CPU_X86_64_FALSE=
+fi
+
+
+ if test x$no_undefined = xyes; then
+ NO_UNDEFINED_TRUE=
+ NO_UNDEFINED_FALSE='#'
+else
+ NO_UNDEFINED_TRUE='#'
+ NO_UNDEFINED_FALSE=
+fi
+
+
+
+enableval=mpz
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the type of integral values to use as coefficients" >&5
+$as_echo_n "checking the type of integral values to use as coefficients... " >&6; }
+# Check whether --enable-coefficients was given.
+if test "${enable_coefficients+set}" = set; then :
+ enableval=$enable_coefficients;
+fi
+
+case "${enableval}" in
+native-int8)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 8 bits integers" >&5
+$as_echo "native 8 bits integers" >&6; }
+ coefficient_kind=native
+ coefficient_bits=8
+ coefficient_mnemonic=nint8
+ ;;
+native-int16)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 16 bits integers" >&5
+$as_echo "native 16 bits integers" >&6; }
+ coefficient_kind=native
+ coefficient_bits=16
+ coefficient_mnemonic=nint16
+ ;;
+native-int32)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 32 bits integers" >&5
+$as_echo "native 32 bits integers" >&6; }
+ coefficient_kind=native
+ coefficient_bits=32
+ coefficient_mnemonic=nint32
+ ;;
+native-int64)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 64 bits integers" >&5
+$as_echo "native 64 bits integers" >&6; }
+ coefficient_kind=native
+ coefficient_bits=64
+ coefficient_mnemonic=nint64
+ ;;
+checked-int8)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 8 bits integers" >&5
+$as_echo "checked 8 bits integers" >&6; }
+ coefficient_kind=checked
+ coefficient_bits=8
+ coefficient_mnemonic=int8
+ ;;
+checked-int16)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 16 bits integers" >&5
+$as_echo "checked 16 bits integers" >&6; }
+ coefficient_kind=checked
+ coefficient_bits=16
+ coefficient_mnemonic=int16
+ ;;
+checked-int32)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 32 bits integers" >&5
+$as_echo "checked 32 bits integers" >&6; }
+ coefficient_kind=checked
+ coefficient_bits=32
+ coefficient_mnemonic=int32
+ ;;
+checked-int64)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 64 bits integers" >&5
+$as_echo "checked 64 bits integers" >&6; }
+ coefficient_kind=checked
+ coefficient_bits=64
+ coefficient_mnemonic=int64
+ ;;
+mpz)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: GMP mpz" >&5
+$as_echo "GMP mpz" >&6; }
+ coefficient_kind=unbounded
+ coefficient_bits=0
+ coefficient_mnemonic=mpz
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" "$LINENO" 5
+ ;;
+esac
+
+ if test x"$coefficient_kind" = xnative; then
+ USE_NATIVE_INTEGERS_TRUE=
+ USE_NATIVE_INTEGERS_FALSE='#'
+else
+ USE_NATIVE_INTEGERS_TRUE='#'
+ USE_NATIVE_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_kind" = xchecked; then
+ USE_CHECKED_INTEGERS_TRUE=
+ USE_CHECKED_INTEGERS_FALSE='#'
+else
+ USE_CHECKED_INTEGERS_TRUE='#'
+ USE_CHECKED_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_kind" = xunbounded; then
+ USE_GMP_INTEGERS_TRUE=
+ USE_GMP_INTEGERS_FALSE='#'
+else
+ USE_GMP_INTEGERS_TRUE='#'
+ USE_GMP_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x8; then
+ USE_INT8_TRUE=
+ USE_INT8_FALSE='#'
+else
+ USE_INT8_TRUE='#'
+ USE_INT8_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x16; then
+ USE_INT16_TRUE=
+ USE_INT16_FALSE='#'
+else
+ USE_INT16_TRUE='#'
+ USE_INT16_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x32; then
+ USE_INT32_TRUE=
+ USE_INT32_FALSE='#'
+else
+ USE_INT32_TRUE='#'
+ USE_INT32_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x64; then
+ USE_INT64_TRUE=
+ USE_INT64_FALSE='#'
+else
+ USE_INT64_TRUE='#'
+ USE_INT64_FALSE=
+fi
+
+
+
+if test x"$coefficient_kind" = xnative
+then
+ coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy<int${coefficient_bits}_t> >"
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+$as_echo "#define PPL_NATIVE_INTEGERS 1" >>confdefs.h
+
+elif test x"$coefficient_kind" = xchecked
+then
+ coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Bounded_Integer_Coefficient_Policy>"
+ cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+ cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+$as_echo "#define PPL_CHECKED_INTEGERS 1" >>confdefs.h
+
+elif test x"$coefficient_kind" = xunbounded
+then
+ $as_echo "#define PPL_COEFFICIENT_TYPE mpz_class" >>confdefs.h
+
+ $as_echo "#define PPL_COEFFICIENT_BITS 0" >>confdefs.h
+
+
+$as_echo "#define PPL_GMP_INTEGERS 1" >>confdefs.h
+
+fi
+
+# Allow additions to C compilation flags.
+
+# Check whether --with-cflags was given.
+if test "${with_cflags+set}" = set; then :
+ withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags"
+fi
+
+
+# Allow additions to C++ compilation flags.
+
+# Check whether --with-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then :
+ withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi
+
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes; then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_c_bigendian=no
+else
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for typeof syntax and keyword spelling" >&5
+$as_echo_n "checking for typeof syntax and keyword spelling... " >&6; }
+if ${ac_cv_c_typeof+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_typeof=no
+ for ac_kw in typeof __typeof__ no; do
+ test $ac_kw = no && break
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ int value;
+ typedef struct {
+ char a [1
+ + ! (($ac_kw (value))
+ (($ac_kw (value)) 0 < ($ac_kw (value)) -1
+ ? ($ac_kw (value)) - 1
+ : ~ (~ ($ac_kw (value)) 0
+ << sizeof ($ac_kw (value)))))]; }
+ ac__typeof_type_;
+ return
+ (! ((void) ((ac__typeof_type_ *) 0), 0));
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_typeof=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test $ac_cv_c_typeof != no && break
+ done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_typeof" >&5
+$as_echo "$ac_cv_c_typeof" >&6; }
+ if test $ac_cv_c_typeof != no; then
+
+$as_echo "#define HAVE_TYPEOF 1" >>confdefs.h
+
+ if test $ac_cv_c_typeof != typeof; then
+
+cat >>confdefs.h <<_ACEOF
+#define typeof $ac_cv_c_typeof
+_ACEOF
+
+ fi
+ fi
+
+
+# Checks for C type sizes.
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
+$as_echo_n "checking size of char... " >&6; }
+if ${ac_cv_sizeof_char+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_char" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (char)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_char=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
+$as_echo "$ac_cv_sizeof_char" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+$as_echo_n "checking size of short... " >&6; }
+if ${ac_cv_sizeof_short+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_short" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (short)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_short=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+$as_echo "$ac_cv_sizeof_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_int=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_long_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_long_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_size_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_size_t=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
+$as_echo_n "checking size of float... " >&6; }
+if ${ac_cv_sizeof_float+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_float" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (float)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_float=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
+$as_echo "$ac_cv_sizeof_float" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+$as_echo_n "checking size of double... " >&6; }
+if ${ac_cv_sizeof_double+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_double=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
+$as_echo "$ac_cv_sizeof_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
+$as_echo_n "checking size of long double... " >&6; }
+if ${ac_cv_sizeof_long_double+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_long_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long double)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_long_double=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
+$as_echo "$ac_cv_sizeof_long_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int*" >&5
+$as_echo_n "checking size of int*... " >&6; }
+if ${ac_cv_sizeof_intp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int*))" "ac_cv_sizeof_intp" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_intp" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int*)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_intp=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_intp" >&5
+$as_echo "$ac_cv_sizeof_intp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INTP $ac_cv_sizeof_intp
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fp" >&5
+$as_echo_n "checking size of fp... " >&6; }
+if ${ac_cv_sizeof_fp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fp))" "ac_cv_sizeof_fp" "typedef int *(*fp)();
+"; then :
+
+else
+ if test "$ac_cv_type_fp" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (fp)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_fp=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_fp" >&5
+$as_echo "$ac_cv_sizeof_fp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FP $ac_cv_sizeof_fp
+_ACEOF
+
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PERL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+$as_echo "$PERL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ if test x"$PERL" != xno; then
+ HAVE_PERL_TRUE=
+ HAVE_PERL_FALSE='#'
+else
+ HAVE_PERL_TRUE='#'
+ HAVE_PERL_FALSE=
+fi
+
+
+# Use C++ for the remaining checks.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# The PPL uses <cmath> for sqrt and other functions in several places.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5
+$as_echo_n "checking for library containing sqrt... " >&6; }
+if ${ac_cv_search_sqrt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqrt ();
+int
+main ()
+{
+return sqrt ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_sqrt=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_sqrt+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_sqrt+:} false; then :
+
+else
+ ac_cv_search_sqrt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5
+$as_echo "$ac_cv_search_sqrt" >&6; }
+ac_res=$ac_cv_search_sqrt
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+if test x"$use_fpmath" = xyes
+then
+ # Check for the possibility to control the FPU.
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for ac_header in fenv.h ieeefp.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if it is possible to control the FPU" >&5
+$as_echo_n "checking if it is possible to control the FPU... " >&6; }
+if test "$cross_compiling" = yes; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if i386 || (sparc && defined(HAVE_IEEEFP_H))
+
+int
+main() {
+ return 0;
+}
+
+#else
+
+ choke me
+
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cv_can_control_fpu=1
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cv_can_control_fpu=0
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if i386
+
+int
+main() {
+ return 0;
+}
+
+#elif defined(HAVE_FENV_H)
+
+# include <fenv.h>
+
+# if !defined(FE_UPWARD) || !defined(FE_DOWNWARD)
+
+ choke me
+
+# elif defined(__arm__) \
+ && (!defined(PPL_ARM_CAN_CONTROL_FPU) || !PPL_ARM_CAN_CONTROL_FPU)
+
+ choke me
+
+#else
+
+ float nf1 = -3, pf1 = 3, f2 = 5;
+ double nd1 = -7, pd1 = 7, d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+ float nf[2], pf[2];
+ double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+ int r = 0;
+ if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+ r |= 1;
+ if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+ r |= 2;
+ if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+ r |= 4;
+ return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+ return fesetround(rounding_mode);
+}
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+int
+main() {
+ if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+ return 255;
+
+ nf[0] = nf1 / f2;
+ nd[0] = nd1 / d2;
+ nl[0] = nl1 / l2;
+ pf[0] = pf1 / f2;
+ pd[0] = pd1 / d2;
+ pl[0] = pl1 / l2;
+
+ if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+ return 255;
+
+ nf[1] = nf1 / f2;
+ nd[1] = nd1 / d2;
+ nl[1] = nl1 / l2;
+ pf[1] = pf1 / f2;
+ pd[1] = pd1 / d2;
+ pl[1] = pl1 / l2;
+
+ return (*ppl_check_function_p)();
+}
+
+# endif
+
+#elif sparc && defined(HAVE_IEEEFP_H)
+
+int
+main() {
+ return 0;
+}
+
+#else
+
+ choke me
+
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cv_can_control_fpu=1
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cv_can_control_fpu=0
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+else
+ ac_cv_can_control_fpu=0
+fi
+ if test $ac_cv_can_control_fpu = 1; then
+ CAN_CONTROL_FPU_TRUE=
+ CAN_CONTROL_FPU_FALSE='#'
+else
+ CAN_CONTROL_FPU_TRUE='#'
+ CAN_CONTROL_FPU_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CAN_CONTROL_FPU $ac_cv_can_control_fpu
+_ACEOF
+
+
+# Check whether for the C++ compiler the plain char type is signed.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the plain char type is signed" >&5
+$as_echo_n "checking whether the plain char type is signed... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+
+int foo[std::numeric_limits<char>::is_signed ? 1 : -1];
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_plain_char_is_signed=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_plain_char_is_signed=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_plain_char_is_signed" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_PLAIN_CHAR_IS_SIGNED $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler provides proper long doubles.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler provides proper long doubles" >&5
+$as_echo_n "checking whether the C++ compiler provides proper long doubles... " >&6; }
+if test "$cross_compiling" = yes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+ ac_cxx_provides_proper_long_double=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <cfloat>
+
+long double f = 0.0;
+
+int main() {
+ if ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+ && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+ return 1;
+ else
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_provides_proper_long_double=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_provides_proper_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ floats.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ floats" >&5
+$as_echo_n "checking the binary format of C++ floats... " >&6; }
+if test "$cross_compiling" = yes; then :
+ ac_cxx_float_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+ union {
+ float value;
+ uint32_t word;
+ } u;
+
+ u.word = x;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<float>::is_iec559
+ && ( convert(0xaaacccaaU)
+ == -3.069535185924732179074680971098132431507110595703125e-13
+ && convert(0xcccaaaccU)
+ == -106255968
+ && convert(0x00000001U)
+ == 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45
+ && convert(0x80000001U)
+ == -1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45))
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE" >>confdefs.h
+
+ ac_cxx_float_binary_format="IEEE754 Single Precision"
+else
+ ac_cxx_float_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_float_binary_format" >&5
+$as_echo "$ac_cxx_float_binary_format" >&6; }
+
+if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+ ac_supported_float=0
+else
+ ac_supported_float=1
+fi
+ if test $ac_supported_float = 1; then
+ SUPPORTED_FLOAT_TRUE=
+ SUPPORTED_FLOAT_FALSE='#'
+else
+ SUPPORTED_FLOAT_TRUE='#'
+ SUPPORTED_FLOAT_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_FLOAT $ac_supported_float
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ doubles.
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ doubles" >&5
+$as_echo_n "checking the binary format of C++ doubles... " >&6; }
+
+if test "$cross_compiling" = yes; then :
+ ac_cxx_double_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+ union {
+ double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0
+ && convert(0x00000000UL, 0x00000001UL)
+ == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+ && convert(0x80000000UL, 0x00000001UL)
+ == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE" >>confdefs.h
+
+ ac_cxx_double_binary_format="IEEE754 Double Precision"
+else
+ ac_cxx_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_double_binary_format" >&5
+$as_echo "$ac_cxx_double_binary_format" >&6; }
+
+if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+ ac_supported_double=0
+else
+ ac_supported_double=1
+fi
+ if test $ac_supported_double = 1; then
+ SUPPORTED_DOUBLE_TRUE=
+ SUPPORTED_DOUBLE_FALSE='#'
+else
+ SUPPORTED_DOUBLE_TRUE='#'
+ SUPPORTED_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_DOUBLE $ac_supported_double
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ long doubles.
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ long doubles" >&5
+$as_echo_n "checking the binary format of C++ long doubles... " >&6; }
+
+if test "$cross_compiling" = yes; then :
+ ac_cxx_long_double_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+ == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034 [...]
+ && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+ == -3.23434990843367356978836243375823670140137920038631047807023049120171609457620808873309220935271108176353097313943940275472100621788903190230956690534410676669705059335585140518969412596610080153759381132049385057915293867970546587078868452351854180615879140837871859693613285468342558175420524259461419246587664010262843224689767458364974546764113923420713958481010186877291531245407558226524068718427924386121735166705992087823616450647326179770339398151079922803077815239965 [...]
+ && convert(0x00000000UL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ && convert(0x80000000UL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED" >>confdefs.h
+
+ ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+ ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+ ac_cxx_long_double_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+#if defined(__sparc__) && defined(__arch64__) \
+ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+
+// Work around http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661
+int
+main() {
+ return 1;
+}
+
+#else // !defined(__sparc__) || !defined(__arch64__) ...
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -1245145811075115522107964569349668036873048429802955738289544979224937529833971888147113044115600185809657440463151337899852742080173681519641002844007842161066491872877272689899483098933357761372012363074222544903849943421327866952518563408226075393323377411859119799862094642227761121175434773105923957353216410161917656139242348962530519313341883531064222310528951125334264629650711950000833461188453888512224682758538996197678583645934917458956166559210225915729833706160100 [...]
+ && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+ == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215 [...]
+ && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+ == -6.47517511943802511092443895822764655249956933803468100968988438919703954012411937101767149127664994025587814147684811967658721988638254204668511007197261798304279271075133493441673462563847174023944852650555399039145555625217114806807082203468825698247627282878910302835733756134803106238656459263982622699190790786766326206571121158306465719606830833284523445306976052648944766096457931375140340263180435003994887007525564871336806611787940315576671330346743493706240941168521 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#endif // !defined(__sparc__) || !defined(__arch64__) ...
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_QUAD" >>confdefs.h
+
+ ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
+else
+ ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+ ac_cxx_long_double_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -7.60485409436602033833759988758780020217551374528569429669911873757906182254327119546821375294569706862634123096006179131975601459939317923749460760611755945509159249553133915285667773529968161411385504730903997838176525168965533046787887965329768475303861077507591270048979509969375307518720976751563959372182344600137482199546034650881151618280482157637543315750344472366897650456745841889271161287700829333629145672371870175300825285400580026318002741921464859617583666254762 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -9965833187718142564038919371244528880400911264240719763322990704886435019238181462823338415353952436874830526964270445045957245891305882920209440893355853355213758922643053767150375473715384555384564609917951254069603870739549122332594610600777084466038134002807982723703367090044608379335368276188508415489863689777967712401011928894574027307241589899644172257148781505238731702567519166576191811900643182875678049360454665894916648664135478300253607136628778029068062099599179 [...]
+ && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED" >>confdefs.h
+
+ ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+ ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+ ac_cxx_long_double_binary_format=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0L
+ && convert(0x00000000UL, 0x00000001UL)
+ == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+ && convert(0x80000000UL, 0x00000001UL)
+ == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE" >>confdefs.h
+
+ ac_cxx_long_double_binary_format="IEEE754 Double Precision"
+else
+ ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_long_double_binary_format" >&5
+$as_echo "$ac_cxx_long_double_binary_format" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether std::floor(long double) is buggy" >&5
+$as_echo_n "checking whether std::floor(long double) is buggy... " >&6; }
+if test "$cross_compiling" = yes; then :
+ ac_std_floor_long_double_is_buggy=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming is not" >&5
+$as_echo "assuming is not" >&6; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <cmath>
+#include <cstdlib>
+
+long double x = 13311002825915415087.0L;
+
+int main() {
+ long double y = std::floor(x);
+ if (x != y)
+ return 1;
+ else
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ ac_std_floor_long_double_is_buggy=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+else
+ ac_std_floor_long_double_is_buggy=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown" \
+|| test $ac_cv_can_control_fpu = 0 \
+|| test x"$ac_std_floor_long_double_is_buggy" = x"yes"
+then
+ ac_supported_long_double=0
+else
+ ac_supported_long_double=1
+fi
+ if test $ac_supported_long_double = 1; then
+ SUPPORTED_LONG_DOUBLE_TRUE=
+ SUPPORTED_LONG_DOUBLE_FALSE='#'
+else
+ SUPPORTED_LONG_DOUBLE_TRUE='#'
+ SUPPORTED_LONG_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_LONG_DOUBLE $ac_supported_long_double
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Test if some floating-point type is supported.
+if test $ac_supported_float = 1 \
+|| test $ac_supported_double = 1 \
+|| test $ac_supported_long_double = 1
+then
+ supported_some_floating_point_type=yes
+fi
+ if test x$supported_some_floating_point_type = xyes; then
+ SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE=
+ SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE='#'
+else
+ SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE='#'
+ SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE=
+fi
+
+
+# Check whether the C++ compiler supports zero-length arrays.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports zero-length arrays" >&5
+$as_echo_n "checking whether the C++ compiler supports zero-length arrays... " >&6; }
+if test "$cross_compiling" = yes; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+ int i;
+ bool b;
+
+public:
+ A()
+ : i(0), b(false) {
+ }
+};
+
+class B {
+private:
+ int capacity;
+ A vec0;
+
+public:
+ void* operator new(size_t fixed_size, int c) {
+ return ::operator new(fixed_size + c*sizeof(B));
+ }
+
+ void operator delete(void* p) {
+ ::operator delete(p);
+ }
+
+ void operator delete(void* p, int) {
+ ::operator delete(p);
+ }
+
+ B(int s)
+ : capacity(s) {
+ }
+};
+
+int
+main() {
+ B* p = new (100) B(100);
+ delete p;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_supports_zero_length_arrays=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_supports_zero_length_arrays=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+ int i;
+ bool b;
+
+public:
+ A()
+ : i(0), b(false) {
+ }
+};
+
+class B {
+private:
+ int capacity;
+ A vec[];
+
+public:
+ void* operator new(size_t fixed_size, int c) {
+ return ::operator new(fixed_size + c*sizeof(B));
+ }
+
+ void operator delete(void* p) {
+ ::operator delete(p);
+ }
+
+ void operator delete(void* p, int) {
+ ::operator delete(p);
+ }
+
+ B(int s)
+ : capacity(s) {
+ }
+};
+
+int
+main() {
+ B* p = new (100) B(100);
+ delete p;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_supports_zero_length_arrays=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_supports_zero_length_arrays=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_zero_length_arrays" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the IEEE inexact flag is supported in C++.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the IEEE inexact flag is supported in C++" >&5
+$as_echo_n "checking whether the IEEE inexact flag is supported in C++... " >&6; }
+if test "$cross_compiling" = yes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+ ac_cxx_supports_ieee_inexact_flag=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+int
+main() {
+ return 0;
+}
+
+#elif defined(PPL_HAVE_IEEEFP_H) \
+ && (defined(__sparc) \
+ || defined(sparc) \
+ || defined(__sparc__))
+
+int
+main() {
+ return 0;
+}
+
+#elif !defined(HAVE_FENV_H)
+
+int
+main() {
+ return 1;
+}
+
+#else
+
+#include <fenv.h>
+
+#if !defined(FE_INEXACT)
+
+int
+main() {
+ return 1;
+}
+
+#else // defined(FE_INEXACT)
+
+struct A {
+ double dividend;
+ double divisor;
+ bool inexact;
+} a[] = {
+ { 1.0, 2.0, false },
+ { 2.0, 3.0, true },
+};
+
+int main() {
+ for (unsigned i = 0; i < sizeof(a)/sizeof(a[0]); ++i) {
+ {
+ volatile float x = a[i].dividend;
+ volatile float y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ {
+ volatile double x = a[i].dividend;
+ volatile double y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ {
+ volatile long double x = a[i].dividend;
+ volatile long double y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#endif // defined(FE_INEXACT)
+
+#endif
+
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_supports_ieee_inexact_flag=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_supports_ieee_inexact_flag=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_ieee_inexact_flag" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
+$as_echo_n "checking whether the C++ compiler supports __attribute__ ((weak))... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_supports_attribute_weak=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_supports_attribute_weak=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Checks for header files.
+for ac_header in fenv.h ieeefp.h getopt.h signal.h string.h strings.h sys/resource.h sys/time.h sys/types.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for the availability of C library functions in C++.
+ac_fn_cxx_check_decl "$LINENO" "ffs" "ac_cv_have_decl_ffs" "
+#if defined(HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(HAVE_STRING_H)
+# include <string.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_ffs" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS $ac_have_decl
+_ACEOF
+
+ac_fn_cxx_check_decl "$LINENO" "getenv" "ac_cv_have_decl_getenv" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_getenv" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtof" "ac_cv_have_decl_strtof" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtof" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtod" "ac_cv_have_decl_strtod" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtod" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtold" "ac_cv_have_decl_strtold" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtold" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtoll" "ac_cv_have_decl_strtoll" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtoll" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtoull" "ac_cv_have_decl_strtoull" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtoull" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL $ac_have_decl
+_ACEOF
+
+ac_fn_cxx_check_decl "$LINENO" "fma" "ac_cv_have_decl_fma" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fma" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "fmaf" "ac_cv_have_decl_fmaf" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fmaf" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "fmal" "ac_cv_have_decl_fmal" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fmal" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "rintf" "ac_cv_have_decl_rintf" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_rintf" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "rintl" "ac_cv_have_decl_rintl" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_rintl" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL $ac_have_decl
+_ACEOF
+
+
+# Checks for the availability of "fast" integral types.
+ac_fn_cxx_check_type "$LINENO" "int_fast16_t" "ac_cv_type_int_fast16_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast16_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST16_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast32_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST32_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "int_fast64_t" "ac_cv_type_int_fast64_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast64_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST64_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast16_t" "ac_cv_type_uint_fast16_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast16_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST16_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast32_t" "ac_cv_type_uint_fast32_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast32_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST32_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast64_t" "ac_cv_type_uint_fast64_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast64_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST64_T 1
+_ACEOF
+
+
+fi
+
+
+# Make sure uintptr_t is defined to an unsigned integer type wide enough
+# to hold a pointer, if such a type exists.
+
+ ac_fn_cxx_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintptr_t" = xyes; then :
+
+$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h
+
+else
+ for ac_type in 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define uintptr_t $ac_type
+_ACEOF
+
+ ac_type=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test -z "$ac_type" && break
+ done
+fi
+
+
+
+
+# Checks on the GMP library.
+
+
+
+# Check whether --with-gmp was given.
+if test "${with_gmp+set}" = set; then :
+ withval=$with_gmp;
+fi
+
+
+
+# Check whether --with-gmp-include was given.
+if test "${with_gmp_include+set}" = set; then :
+ withval=$with_gmp_include;
+fi
+
+
+
+# Check whether --with-gmp-lib was given.
+if test "${with_gmp_lib+set}" = set; then :
+ withval=$with_gmp_lib;
+fi
+
+
+if test -n "$with_gmp"
+then
+ gmp_include_options="-I$with_gmp/include"
+ gmp_library_paths="$with_gmp/lib"
+ gmp_library_options="-L$gmp_library_paths"
+fi
+
+if test -n "$with_gmp_include"
+then
+ gmp_include_options="-I$with_gmp_include"
+fi
+
+if test -n "$with_gmp_lib"
+then
+ gmp_library_paths="$with_gmp_lib"
+ gmp_library_options="-L$gmp_library_paths"
+fi
+
+gmp_libs="-lgmpxx -lgmp"
+
+
+# Check whether --with-gmp-build was given.
+if test "${with_gmp_build+set}" = set; then :
+ withval=$with_gmp_build; gmp_build_dir=$with_gmp_build
+ if test -n "$with_gmp" \
+ || test -n "$with_gmp_include" || test -n "$with_gmp_lib"
+ then
+ as_fn_error $? "cannot use --with-gmp-build and other --with-gmp* options together" "$LINENO" 5
+ else
+ gmp_srcdir=`echo @abs_srcdir@ | $gmp_build_dir/config.status --file=-`
+ gmp_include_options="-I$gmp_build_dir -I$gmp_build_dir/tune -I$gmp_srcdir"
+ gmp_libs="$gmp_build_dir/libgmp.la $gmp_build_dir/libgmpxx.la"
+ fi
+fi
+
+
+gmp_library_options="$gmp_library_options $gmp_libs"
+
+if test -n "$with_gmp_build"
+then
+ ac_save_CXX="$CXX"
+ CXX="libtool --mode=link --tag=CXX $CXX"
+fi
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $gmp_include_options"
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $gmp_library_options"
+eval ac_save_shared_library_path="\$$shared_library_path_env_var"
+eval $shared_library_path_env_var=\"$gmp_library_paths:$ac_save_shared_library_path\"
+export $shared_library_path_env_var
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the GMP library version 4.1.3 or above" >&5
+$as_echo_n "checking for the GMP library version 4.1.3 or above... " >&6; }
+if test "$cross_compiling" = yes; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+int
+main() {
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cv_have_gmp=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cv_have_gmp=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gmpxx.h>
+#include <climits>
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+#ifndef BITS_PER_MP_LIMB
+#define BITS_PER_MP_LIMB GMP_LIMB_BITS
+#endif
+
+int
+main() {
+ std::string header_version;
+ {
+ std::ostringstream s(header_version);
+ s << __GNU_MP_VERSION << "." << __GNU_MP_VERSION_MINOR;
+ // Starting from GMP version 4.3.0, the gmp_version variable
+ // always contains three parts. In previous versions the
+ // patchlevel was omitted if it was 0.
+ if (__GNU_MP_VERSION_PATCHLEVEL != 0
+ || __GNU_MP_VERSION > 4
+ || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 3))
+ s << "." << __GNU_MP_VERSION_PATCHLEVEL;
+ header_version = s.str();
+ }
+
+ std::string library_version = gmp_version;
+
+ if (header_version != library_version) {
+ std::cerr
+ << "GMP header (gmpxx.h) and library (ligmpxx.*) version mismatch:\n"
+ << "header gives " << header_version << ";\n"
+ << "library gives " << library_version << "." << std::endl;
+ return 1;
+ }
+
+ if (sizeof(mp_limb_t)*CHAR_BIT != BITS_PER_MP_LIMB
+ || BITS_PER_MP_LIMB != mp_bits_per_limb) {
+ std::cerr
+ << "GMP header (gmpxx.h) and library (ligmpxx.*) bits-per-limb mismatch:\n"
+ << "header gives " << BITS_PER_MP_LIMB << ";\n"
+ << "library gives " << mp_bits_per_limb << ".\n"
+ << "This probably means you are on a bi-arch system and\n"
+ << "you are compiling with the wrong header or linking with\n"
+ << "the wrong library." << std::endl;
+ return 1;
+ }
+
+ mpz_class n("3141592653589793238462643383279502884");
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cv_have_gmp=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cv_have_gmp=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of mp_limb_t" >&5
+$as_echo_n "checking size of mp_limb_t... " >&6; }
+if ${ac_cv_sizeof_mp_limb_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (mp_limb_t))" "ac_cv_sizeof_mp_limb_t" "#include <gmpxx.h>
+"; then :
+
+else
+ if test "$ac_cv_type_mp_limb_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (mp_limb_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_mp_limb_t=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_mp_limb_t" >&5
+$as_echo "$ac_cv_sizeof_mp_limb_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t
+_ACEOF
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP has been compiled with support for exceptions" >&5
+$as_echo_n "checking whether GMP has been compiled with support for exceptions... " >&6; }
+if test "$cross_compiling" = yes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming yes" >&5
+$as_echo "assuming yes" >&6; }
+ ac_cv_gmp_supports_exceptions=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+ throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+ throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+ mp_set_memory_functions(x_malloc, x_realloc, x_free);
+ try {
+ mpz_class n("3141592653589793238462643383279502884");
+ }
+ catch (std::bad_alloc&) {
+ return 0;
+ }
+ return 1;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cv_gmp_supports_exceptions=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cv_gmp_supports_exceptions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_GMP_SUPPORTS_EXCEPTIONS $value
+_ACEOF
+
+
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+eval $shared_library_path_env_var=\"$ac_save_shared_library_path\"
+LIBS="$ac_save_LIBS"
+CPPFLAGS="$ac_save_CPPFLAGS"
+
+if test -n "$with_gmp_build"
+then
+ CXX="$ac_save_CXX"
+fi
+
+if test x"$have_gmp" = xno
+then
+ as_fn_error $? "Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." "$LINENO" 5
+else
+ if test x"$have_gmpxx" = xno
+ then
+ as_fn_error $? "GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." "$LINENO" 5
+ fi
+fi
+
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_alloc" "ac_cv_member___mpz_struct__mp_alloc" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_alloc" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+_ACEOF
+
+
+else
+ gmp_has_changes=yes
+fi
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_size" "ac_cv_member___mpz_struct__mp_size" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_size" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+_ACEOF
+
+
+else
+ gmp_has_changes=yes
+fi
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_d" "ac_cv_member___mpz_struct__mp_d" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_d" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_D 1
+_ACEOF
+
+
+else
+ gmp_has_changes=yes
+fi
+
+
+if test x"$gmp_has_changed" = xyes
+then
+ as_fn_error $? "GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP. You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it." "$LINENO" 5
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_include_options}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_options}"
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_lcdd program" >&5
+$as_echo_n "checking whether to build the ppl_lcdd program... " >&6; }
+# Check whether --enable-ppl_lcdd was given.
+if test "${enable_ppl_lcdd+set}" = set; then :
+ enableval=$enable_ppl_lcdd;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-ppl_lcdd, needs yes or no" "$LINENO" 5
+ ;;
+esac
+build_ppl_lcdd=$enableval
+ if test x"$build_ppl_lcdd" = xyes; then
+ BUILD_PPL_LCDD_TRUE=
+ BUILD_PPL_LCDD_FALSE='#'
+else
+ BUILD_PPL_LCDD_TRUE='#'
+ BUILD_PPL_LCDD_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_lpsol program" >&5
+$as_echo_n "checking whether to build the ppl_lpsol program... " >&6; }
+# Check whether --enable-ppl_lpsol was given.
+if test "${enable_ppl_lpsol+set}" = set; then :
+ enableval=$enable_ppl_lpsol;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-ppl_lpsol, needs yes or no" "$LINENO" 5
+ ;;
+esac
+build_ppl_lpsol=$enableval
+ if test x"$build_ppl_lpsol" = xyes; then
+ BUILD_PPL_LPSOL_TRUE=
+ BUILD_PPL_LPSOL_FALSE='#'
+else
+ BUILD_PPL_LPSOL_TRUE='#'
+ BUILD_PPL_LPSOL_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_pips program" >&5
+$as_echo_n "checking whether to build the ppl_pips program... " >&6; }
+# Check whether --enable-ppl_pips was given.
+if test "${enable_ppl_pips+set}" = set; then :
+ enableval=$enable_ppl_pips;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-ppl_pips, needs yes or no" "$LINENO" 5
+ ;;
+esac
+build_ppl_pips=$enableval
+ if test x"$build_ppl_pips" = xyes; then
+ BUILD_PPL_PIPS_TRUE=
+ BUILD_PPL_PIPS_FALSE='#'
+else
+ BUILD_PPL_PIPS_TRUE='#'
+ BUILD_PPL_PIPS_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the PPL documentation" >&5
+$as_echo_n "checking whether to build the PPL documentation... " >&6; }
+# Check whether --enable-documentation was given.
+if test "${enable_documentation+set}" = set; then :
+ enableval=$enable_documentation;
+fi
+
+case "${enableval}" in
+yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-documentation, needs yes or no" "$LINENO" 5
+ ;;
+esac
+build_documentation=$enableval
+ if test x"$build_documentation" = xyes; then
+ BUILD_DOCUMENTATION_TRUE=
+ BUILD_DOCUMENTATION_FALSE='#'
+else
+ BUILD_DOCUMENTATION_TRUE='#'
+ BUILD_DOCUMENTATION_FALSE=
+fi
+
+
+# Define lists of available interfaces: lowercase and blank-separated.
+non_prolog_interfaces="cxx c ocaml java"
+prolog_interfaces="ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="${non_prolog_interfaces} ${prolog_interfaces}"
+
+# This is the list of interfaces that are enabled by default.
+default_interfaces=${non_prolog_interfaces}
+
+enableval=not_specified
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which interfaces are enabled" >&5
+$as_echo_n "checking which interfaces are enabled... " >&6; }
+# Check whether --enable-interfaces was given.
+if test "${enable_interfaces+set}" = set; then :
+ enableval=$enable_interfaces;
+fi
+
+case x"${enableval}" in
+xyes | x)
+ as_fn_error $? "--enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" "$LINENO" 5
+ ;;
+xnone | xno)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=no
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+ ;;
+xall)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=yes
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${available_interfaces}" >&5
+$as_echo "${available_interfaces}" >&6; }
+ ;;
+*)
+ if test x"${enableval}" = xnot_specified
+ then
+ enableval=${default_interfaces}
+ fi
+ # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+ required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[ ,][ ,]*/ /g' -e 's/c++/cxx/g' | tr '[:upper:]' '[:lower:]'`
+ # Check that the specified interfaces exist.
+ for interface in ${required_interfaces}
+ do
+ case " ${available_interfaces} " in
+ *\ ${interface}\ *)
+ ;;
+ *)
+ as_fn_error $? "unknown interface ${interface}: must be one of ${available_interfaces}" "$LINENO" 5
+ ;;
+ esac
+ done
+ # Initialize the enabled variable for each interface.
+ for interface in ${available_interfaces}
+ do
+ case " ${required_interfaces} " in
+ *\ ${interface}\ *)
+ eval ${interface}_interface_enabled=yes
+ enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+ ;;
+ *)
+ eval ${interface}_interface_enabled=no
+ ;;
+ esac
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enabled_interfaces}" >&5
+$as_echo "${enabled_interfaces}" >&6; }
+ ;;
+esac
+
+if test x${cxx_interface_enabled} = xyes
+then
+ build_cxx_interface=yes
+fi
+ if test x$build_cxx_interface = xyes; then
+ BUILD_CXX_INTERFACE_TRUE=
+ BUILD_CXX_INTERFACE_FALSE='#'
+else
+ BUILD_CXX_INTERFACE_TRUE='#'
+ BUILD_CXX_INTERFACE_FALSE=
+fi
+
+
+if test x${c_interface_enabled} = xyes
+then
+ build_c_interface=yes
+fi
+ if test x$build_c_interface = xyes; then
+ BUILD_C_INTERFACE_TRUE=
+ BUILD_C_INTERFACE_FALSE='#'
+else
+ BUILD_C_INTERFACE_TRUE='#'
+ BUILD_C_INTERFACE_FALSE=
+fi
+
+
+# Checks for systems for which the interface is enabled.
+
+# Allow to specify the Java SDK installation directory.
+
+# Check whether --with-java was given.
+if test "${with_java+set}" = set; then :
+ withval=$with_java; java_dir=$with_java
+fi
+
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+ if test "x$java_dir" = x
+ then
+ java_dir="/Library/Java/Home"
+ fi
+ ;;
+# On modern Fedora systems the JDK is usually in /usr/lib/jvm/java .
+linux*)
+ if test "x$java_dir" = x
+ then
+ java_dir="/usr/lib/jvm/java"
+ fi
+ ;;
+*)
+ ;;
+esac
+
+if test "x$java_dir" != x
+then
+ JAVAPREFIX="${java_dir}/bin"
+fi
+
+# Checks for Java.
+if test x${java_interface_enabled} = xyes
+then
+ # Check for Java programs. Order here is important: check first
+ # for the compiler.
+
+
+if test "x$JAVAPREFIX" = x
+then
+ test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JAVAC"; then
+ ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JAVAC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+else
+ test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $JAVAC in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $JAVAC supports enums" >&5
+$as_echo_n "checking whether $JAVAC supports enums... " >&6; }
+if ${ac_cv_javac_supports_enums+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 10459 "configure" */
+public class Test {
+public enum Relation_Symbol {
+ /*! Less than. */
+ LESS_THAN,
+ /*! Less than or equal to. */
+ LESS_OR_EQUAL,
+ /*! Equal to. */
+ EQUAL,
+ /*! Greater than or equal to. */
+ GREATER_OR_EQUAL,
+ /*! Greater than. */
+ GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null 2>&1; then
+ ac_cv_javac_supports_enums=yes
+else
+ echo "configure: failed program was:" >&5
+ cat $JAVA_TEST >&5
+ ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_javac_supports_enums" >&5
+$as_echo "$ac_cv_javac_supports_enums" >&6; }
+
+fi
+
+
+if test x$JAVAPREFIX = x; then
+ test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVA+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JAVA"; then
+ ac_cv_prog_JAVA="$JAVA" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JAVA="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVA=$ac_cv_prog_JAVA
+if test -n "$JAVA"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5
+$as_echo "$JAVA" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
+
+else
+ test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVA+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $JAVA in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+JAVA=$ac_cv_path_JAVA
+if test -n "$JAVA"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5
+$as_echo "$JAVA" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
+
+fi
+if test ! x$JAVA = "xno"
+then
+
+# Extract the first word of "uudecode$EXEEXT", so it can be a program name with args.
+set dummy uudecode$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_uudecode+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$uudecode"; then
+ ac_cv_prog_uudecode="$uudecode" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_uudecode="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+uudecode=$ac_cv_prog_uudecode
+if test -n "$uudecode"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $uudecode" >&5
+$as_echo "$uudecode" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$uudecode = xyes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if uudecode can decode base 64 file" >&5
+$as_echo_n "checking if uudecode can decode base 64 file... " >&6; }
+if ${ac_cv_prog_uudecode_base64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+ ac_cv_prog_uudecode_base64=yes
+else
+ echo "configure: 10650: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+ echo "configure: failed file was:" >&5
+ cat Test.uue >&5
+ ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_uudecode_base64" >&5
+$as_echo "$ac_cv_prog_uudecode_base64" >&6; }
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+ rm -f Test.class
+ if test x$ac_cv_javac_supports_enums = x; then
+
+if test "x$JAVAPREFIX" = x
+then
+ test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JAVAC"; then
+ ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JAVAC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+else
+ test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $JAVAC in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $JAVAC supports enums" >&5
+$as_echo_n "checking whether $JAVAC supports enums... " >&6; }
+if ${ac_cv_javac_supports_enums+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 10769 "configure" */
+public class Test {
+public enum Relation_Symbol {
+ /*! Less than. */
+ LESS_THAN,
+ /*! Less than or equal to. */
+ LESS_OR_EQUAL,
+ /*! Equal to. */
+ EQUAL,
+ /*! Greater than or equal to. */
+ GREATER_OR_EQUAL,
+ /*! Greater than. */
+ GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null 2>&1; then
+ ac_cv_javac_supports_enums=yes
+else
+ echo "configure: failed program was:" >&5
+ cat $JAVA_TEST >&5
+ ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_javac_supports_enums" >&5
+$as_echo "$ac_cv_javac_supports_enums" >&6; }
+
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $JAVA works" >&5
+$as_echo_n "checking if $JAVA works... " >&6; }
+if ${ac_cv_prog_java_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+cat << \EOF > $JAVA_TEST
+/* [#]line 10818 "configure" */
+public class Test {
+public static void main (String args[]) {
+ System.exit (0);
+} }
+EOF
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+ if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } && test -s $CLASS_TEST; then
+ :
+ else
+ echo "configure: failed program was:" >&5
+ cat $JAVA_TEST >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5
+$as_echo "$as_me: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;}
+ fi
+fi
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
+else
+if { ac_try='$JAVA $JAVAFLAGS $TEST'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null 2>&1; then
+ ac_cv_prog_java_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat $JAVA_TEST >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&5
+$as_echo "$as_me: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&2;}
+ fi
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_java_works" >&5
+$as_echo "$ac_cv_prog_java_works" >&6; }
+
+
+fi
+
+
+if test "x$JAVAPREFIX" = x; then
+ test "x$JAR" = x && for ac_prog in jar$EXEEXT
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JAR"; then
+ ac_cv_prog_JAR="$JAR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JAR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JAR=$ac_cv_prog_JAR
+if test -n "$JAR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5
+$as_echo "$JAR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+else
+ test "x$JAR" = x && for ac_prog in jar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $JAR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_JAR="$JAR" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+JAR=$ac_cv_path_JAR
+if test -n "$JAR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5
+$as_echo "$JAR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+fi
+test "x$JAR" = xno
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test "x$JAVAPREFIX" = x; then
+ for ac_prog in javah
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAH+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JAVAH"; then
+ ac_cv_prog_JAVAH="$JAVAH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JAVAH="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAH=$ac_cv_prog_JAVAH
+if test -n "$JAVAH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAH" >&5
+$as_echo "$JAVAH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+else
+ for ac_prog in javah
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAH+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $JAVAH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_JAVAH="$JAVAH" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_JAVAH="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+JAVAH=$ac_cv_path_JAVAH
+if test -n "$JAVAH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAH" >&5
+$as_echo "$JAVAH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <jni.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+ ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+ JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+ CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <jni.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ CPPFLAGS="$ac_save_CPPFLAGS"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to include <jni.h>" >&5
+$as_echo "$as_me: WARNING: unable to include <jni.h>" >&2;}
+ JAVAH=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $JNIFLAGS"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether jlong can contain data pointers" >&5
+$as_echo_n "checking whether jlong can contain data pointers... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ ac_jlong_can_contain_pointers=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming it cannot" >&5
+$as_echo "assuming it cannot" >&6; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <jni.h>
+
+ int
+ main() {
+ if (sizeof(jlong) >= sizeof(void*))
+ return 0;
+ else
+ return 1;
+ }
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ ac_jlong_can_contain_pointers=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ ac_jlong_can_contain_pointers=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+# In order to build the Java interface, it must be enabled and all the
+# Java tools must be available.
+if test x${java_interface_enabled} = xyes \
+&& test "x$JAVA" != xno \
+&& test "x$ac_cv_javac_supports_enums" != xno \
+&& test "x$JAR" != xno \
+&& test "x$JAVAH" != xno \
+&& test x${ac_jlong_can_contain_pointers} = xyes
+then
+ build_java_interface=yes
+fi
+ if test x$build_java_interface = xyes; then
+ BUILD_JAVA_INTERFACE_TRUE=
+ BUILD_JAVA_INTERFACE_FALSE='#'
+else
+ BUILD_JAVA_INTERFACE_TRUE='#'
+ BUILD_JAVA_INTERFACE_FALSE=
+fi
+
+
+
+# Allow to specify the ML GMP installation directory.
+
+# Check whether --with-mlgmp was given.
+if test "${with_mlgmp+set}" = set; then :
+ withval=$with_mlgmp; mlgmp_dir=$with_mlgmp
+else
+ mlgmp_dir=+gmp
+fi
+
+
+# Checks for OCaml.
+if test x${ocaml_interface_enabled} = xyes
+then
+ # Detect which tools of the OCaml toolchain are available.
+ # checking for ocamlc
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLC"; then
+ ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLC="${ac_tool_prefix}ocamlc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLC=$ac_cv_prog_OCAMLC
+if test -n "$OCAMLC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5
+$as_echo "$OCAMLC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLC"; then
+ ac_ct_OCAMLC=$OCAMLC
+ # Extract the first word of "ocamlc", so it can be a program name with args.
+set dummy ocamlc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLC"; then
+ ac_cv_prog_ac_ct_OCAMLC="$ac_ct_OCAMLC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLC="ocamlc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLC=$ac_cv_prog_ac_ct_OCAMLC
+if test -n "$ac_ct_OCAMLC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLC" >&5
+$as_echo "$ac_ct_OCAMLC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLC" = x; then
+ OCAMLC="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLC=$ac_ct_OCAMLC
+ fi
+else
+ OCAMLC="$ac_cv_prog_OCAMLC"
+fi
+
+
+ if test "$OCAMLC" != "no"; then
+ OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml version is $OCAMLVERSION" >&5
+$as_echo "OCaml version is $OCAMLVERSION" >&6; }
+ OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml library path is $OCAMLLIB" >&5
+$as_echo "OCaml library path is $OCAMLLIB" >&6; }
+
+
+
+
+ # checking for ocamlopt
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlopt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlopt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLOPT"; then
+ ac_cv_prog_OCAMLOPT="$OCAMLOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLOPT="${ac_tool_prefix}ocamlopt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLOPT=$ac_cv_prog_OCAMLOPT
+if test -n "$OCAMLOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPT" >&5
+$as_echo "$OCAMLOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLOPT"; then
+ ac_ct_OCAMLOPT=$OCAMLOPT
+ # Extract the first word of "ocamlopt", so it can be a program name with args.
+set dummy ocamlopt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLOPT"; then
+ ac_cv_prog_ac_ct_OCAMLOPT="$ac_ct_OCAMLOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLOPT="ocamlopt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLOPT=$ac_cv_prog_ac_ct_OCAMLOPT
+if test -n "$ac_ct_OCAMLOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLOPT" >&5
+$as_echo "$ac_ct_OCAMLOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLOPT" = x; then
+ OCAMLOPT="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLOPT=$ac_ct_OCAMLOPT
+ fi
+else
+ OCAMLOPT="$ac_cv_prog_OCAMLOPT"
+fi
+
+ OCAMLBEST=byte
+ if test "$OCAMLOPT" = "no"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ocamlopt; bytecode compilation only." >&5
+$as_echo "$as_me: WARNING: Cannot find ocamlopt; bytecode compilation only." >&2;}
+ else
+ TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlopt discarded." >&5
+$as_echo "versions differs from ocamlc; ocamlopt discarded." >&6; }
+ OCAMLOPT=no
+ else
+ OCAMLBEST=opt
+ fi
+ fi
+
+
+
+ # checking for ocamlc.opt
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlc.opt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlc.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLCDOTOPT"; then
+ ac_cv_prog_OCAMLCDOTOPT="$OCAMLCDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLCDOTOPT="${ac_tool_prefix}ocamlc.opt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLCDOTOPT=$ac_cv_prog_OCAMLCDOTOPT
+if test -n "$OCAMLCDOTOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLCDOTOPT" >&5
+$as_echo "$OCAMLCDOTOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLCDOTOPT"; then
+ ac_ct_OCAMLCDOTOPT=$OCAMLCDOTOPT
+ # Extract the first word of "ocamlc.opt", so it can be a program name with args.
+set dummy ocamlc.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLCDOTOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLCDOTOPT"; then
+ ac_cv_prog_ac_ct_OCAMLCDOTOPT="$ac_ct_OCAMLCDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLCDOTOPT="ocamlc.opt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLCDOTOPT=$ac_cv_prog_ac_ct_OCAMLCDOTOPT
+if test -n "$ac_ct_OCAMLCDOTOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLCDOTOPT" >&5
+$as_echo "$ac_ct_OCAMLCDOTOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLCDOTOPT" = x; then
+ OCAMLCDOTOPT="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLCDOTOPT=$ac_ct_OCAMLCDOTOPT
+ fi
+else
+ OCAMLCDOTOPT="$ac_cv_prog_OCAMLCDOTOPT"
+fi
+
+ if test "$OCAMLCDOTOPT" != "no"; then
+ TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlc.opt discarded." >&5
+$as_echo "versions differs from ocamlc; ocamlc.opt discarded." >&6; }
+ else
+ OCAMLC=$OCAMLCDOTOPT
+ fi
+ fi
+
+ # checking for ocamlopt.opt
+ if test "$OCAMLOPT" != "no" ; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlopt.opt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlopt.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLOPTDOTOPT"; then
+ ac_cv_prog_OCAMLOPTDOTOPT="$OCAMLOPTDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLOPTDOTOPT="${ac_tool_prefix}ocamlopt.opt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLOPTDOTOPT=$ac_cv_prog_OCAMLOPTDOTOPT
+if test -n "$OCAMLOPTDOTOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPTDOTOPT" >&5
+$as_echo "$OCAMLOPTDOTOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLOPTDOTOPT"; then
+ ac_ct_OCAMLOPTDOTOPT=$OCAMLOPTDOTOPT
+ # Extract the first word of "ocamlopt.opt", so it can be a program name with args.
+set dummy ocamlopt.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
+ ac_cv_prog_ac_ct_OCAMLOPTDOTOPT="$ac_ct_OCAMLOPTDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLOPTDOTOPT="ocamlopt.opt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLOPTDOTOPT=$ac_cv_prog_ac_ct_OCAMLOPTDOTOPT
+if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLOPTDOTOPT" >&5
+$as_echo "$ac_ct_OCAMLOPTDOTOPT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLOPTDOTOPT" = x; then
+ OCAMLOPTDOTOPT="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLOPTDOTOPT=$ac_ct_OCAMLOPTDOTOPT
+ fi
+else
+ OCAMLOPTDOTOPT="$ac_cv_prog_OCAMLOPTDOTOPT"
+fi
+
+ if test "$OCAMLOPTDOTOPT" != "no"; then
+ TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: version differs from ocamlc; ocamlopt.opt discarded." >&5
+$as_echo "version differs from ocamlc; ocamlopt.opt discarded." >&6; }
+ else
+ OCAMLOPT=$OCAMLOPTDOTOPT
+ fi
+ fi
+ fi
+
+
+ fi
+
+
+
+ # checking for ocamldep
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamldep", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamldep; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLDEP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLDEP"; then
+ ac_cv_prog_OCAMLDEP="$OCAMLDEP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLDEP="${ac_tool_prefix}ocamldep"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLDEP=$ac_cv_prog_OCAMLDEP
+if test -n "$OCAMLDEP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDEP" >&5
+$as_echo "$OCAMLDEP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLDEP"; then
+ ac_ct_OCAMLDEP=$OCAMLDEP
+ # Extract the first word of "ocamldep", so it can be a program name with args.
+set dummy ocamldep; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLDEP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLDEP"; then
+ ac_cv_prog_ac_ct_OCAMLDEP="$ac_ct_OCAMLDEP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLDEP="ocamldep"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLDEP=$ac_cv_prog_ac_ct_OCAMLDEP
+if test -n "$ac_ct_OCAMLDEP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDEP" >&5
+$as_echo "$ac_ct_OCAMLDEP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLDEP" = x; then
+ OCAMLDEP="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLDEP=$ac_ct_OCAMLDEP
+ fi
+else
+ OCAMLDEP="$ac_cv_prog_OCAMLDEP"
+fi
+
+
+ # checking for ocamlmktop
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlmktop", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlmktop; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLMKTOP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLMKTOP"; then
+ ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLMKTOP="${ac_tool_prefix}ocamlmktop"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP
+if test -n "$OCAMLMKTOP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5
+$as_echo "$OCAMLMKTOP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLMKTOP"; then
+ ac_ct_OCAMLMKTOP=$OCAMLMKTOP
+ # Extract the first word of "ocamlmktop", so it can be a program name with args.
+set dummy ocamlmktop; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLMKTOP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLMKTOP"; then
+ ac_cv_prog_ac_ct_OCAMLMKTOP="$ac_ct_OCAMLMKTOP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLMKTOP="ocamlmktop"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLMKTOP=$ac_cv_prog_ac_ct_OCAMLMKTOP
+if test -n "$ac_ct_OCAMLMKTOP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLMKTOP" >&5
+$as_echo "$ac_ct_OCAMLMKTOP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLMKTOP" = x; then
+ OCAMLMKTOP="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLMKTOP=$ac_ct_OCAMLMKTOP
+ fi
+else
+ OCAMLMKTOP="$ac_cv_prog_OCAMLMKTOP"
+fi
+
+
+ # checking for ocamlmklib
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlmklib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlmklib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLMKLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLMKLIB"; then
+ ac_cv_prog_OCAMLMKLIB="$OCAMLMKLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLMKLIB="${ac_tool_prefix}ocamlmklib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLMKLIB=$ac_cv_prog_OCAMLMKLIB
+if test -n "$OCAMLMKLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKLIB" >&5
+$as_echo "$OCAMLMKLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLMKLIB"; then
+ ac_ct_OCAMLMKLIB=$OCAMLMKLIB
+ # Extract the first word of "ocamlmklib", so it can be a program name with args.
+set dummy ocamlmklib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLMKLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLMKLIB"; then
+ ac_cv_prog_ac_ct_OCAMLMKLIB="$ac_ct_OCAMLMKLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLMKLIB="ocamlmklib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLMKLIB=$ac_cv_prog_ac_ct_OCAMLMKLIB
+if test -n "$ac_ct_OCAMLMKLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLMKLIB" >&5
+$as_echo "$ac_ct_OCAMLMKLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLMKLIB" = x; then
+ OCAMLMKLIB="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLMKLIB=$ac_ct_OCAMLMKLIB
+ fi
+else
+ OCAMLMKLIB="$ac_cv_prog_OCAMLMKLIB"
+fi
+
+
+ # checking for ocamldoc
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamldoc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamldoc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLDOC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLDOC"; then
+ ac_cv_prog_OCAMLDOC="$OCAMLDOC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLDOC="${ac_tool_prefix}ocamldoc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLDOC=$ac_cv_prog_OCAMLDOC
+if test -n "$OCAMLDOC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDOC" >&5
+$as_echo "$OCAMLDOC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLDOC"; then
+ ac_ct_OCAMLDOC=$OCAMLDOC
+ # Extract the first word of "ocamldoc", so it can be a program name with args.
+set dummy ocamldoc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLDOC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLDOC"; then
+ ac_cv_prog_ac_ct_OCAMLDOC="$ac_ct_OCAMLDOC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLDOC="ocamldoc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLDOC=$ac_cv_prog_ac_ct_OCAMLDOC
+if test -n "$ac_ct_OCAMLDOC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDOC" >&5
+$as_echo "$ac_ct_OCAMLDOC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLDOC" = x; then
+ OCAMLDOC="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLDOC=$ac_ct_OCAMLDOC
+ fi
+else
+ OCAMLDOC="$ac_cv_prog_OCAMLDOC"
+fi
+
+
+ # checking for ocamlbuild
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ocamlbuild", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlbuild; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLBUILD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLBUILD"; then
+ ac_cv_prog_OCAMLBUILD="$OCAMLBUILD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLBUILD="${ac_tool_prefix}ocamlbuild"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLBUILD=$ac_cv_prog_OCAMLBUILD
+if test -n "$OCAMLBUILD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLBUILD" >&5
+$as_echo "$OCAMLBUILD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLBUILD"; then
+ ac_ct_OCAMLBUILD=$OCAMLBUILD
+ # Extract the first word of "ocamlbuild", so it can be a program name with args.
+set dummy ocamlbuild; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLBUILD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OCAMLBUILD"; then
+ ac_cv_prog_ac_ct_OCAMLBUILD="$ac_ct_OCAMLBUILD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OCAMLBUILD="ocamlbuild"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLBUILD=$ac_cv_prog_ac_ct_OCAMLBUILD
+if test -n "$ac_ct_OCAMLBUILD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLBUILD" >&5
+$as_echo "$ac_ct_OCAMLBUILD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OCAMLBUILD" = x; then
+ OCAMLBUILD="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OCAMLBUILD=$ac_ct_OCAMLBUILD
+ fi
+else
+ OCAMLBUILD="$ac_cv_prog_OCAMLBUILD"
+fi
+
+
+ if test x"$OCAMLC" != xno
+ then
+ # Check for the bytecode version of ML GMP.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ML GMP bytecode module gmp.cma" >&5
+$as_echo_n "checking for ML GMP bytecode module gmp.cma... " >&6; }
+ if ( test ${mlgmp_dir} = +gmp && test -f ${OCAMLLIB}/gmp/gmp.cma ) \
+ || test -f ${mlgmp_dir}/gmp.cma;
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ocamlc_gmp="yes"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ocamlc_gmp="no"
+ fi
+ if test x"$OCAMLOPT" != xno
+ then
+ ocamlopt_root=`${OCAMLOPT} -where`
+ # Check for the native version of ML GMP.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ML GMP native module gmp.cmxa" >&5
+$as_echo_n "checking for ML GMP native module gmp.cmxa... " >&6; }
+ if ( test ${mlgmp_dir} = +gmp && test -f ${ocamlopt_root}/gmp/gmp.cmxa ) \
+ || test -f ${mlgmp_dir}/gmp.cmxa;
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ocamlopt_gmp="yes"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ocamlopt_gmp="no"
+ fi
+ fi
+ fi
+fi
+ if test x$ocamlc_gmp = xyes; then
+ HAVE_OCAMLC_TRUE=
+ HAVE_OCAMLC_FALSE='#'
+else
+ HAVE_OCAMLC_TRUE='#'
+ HAVE_OCAMLC_FALSE=
+fi
+
+ if test x$ocamlopt_gmp = xyes; then
+ HAVE_OCAMLOPT_TRUE=
+ HAVE_OCAMLOPT_FALSE='#'
+else
+ HAVE_OCAMLOPT_TRUE='#'
+ HAVE_OCAMLOPT_FALSE=
+fi
+
+
+if test x${ocaml_interface_enabled} = xyes \
+&& (test x$ocamlc_gmp = xyes || test x$ocamlopt_gmp = xyes)
+then
+ build_ocaml_interface=yes
+fi
+ if test x$build_ocaml_interface = xyes; then
+ BUILD_OCAML_INTERFACE_TRUE=
+ BUILD_OCAML_INTERFACE_FALSE='#'
+else
+ BUILD_OCAML_INTERFACE_TRUE='#'
+ BUILD_OCAML_INTERFACE_FALSE=
+fi
+
+
+# Checks for Ciao Prolog.
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "ciao", so it can be a program name with args.
+set dummy ciao; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ciao_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ciao_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ciao_prolog="$ciao_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ciao_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ciao_prolog=$ac_cv_path_ciao_prolog
+if test -n "$ciao_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ciao_prolog" >&5
+$as_echo "$ciao_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$ciao_prolog != x
+then
+ # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+ # Use mktemp if possible; otherwise fall back on mkdir,
+ # with $RANDOM to make collisions less likely.
+ : ${TMPDIR=/tmp}
+ {
+ tmp=`
+ (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+ ` &&
+ test -n "$tmp" && test -d "$tmp"
+ } || {
+ tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } || exit $?
+ cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+ ciaolibdir(Lib_Dir),
+ get_os(Os),
+ get_arch(Arch),
+ format("~p/include/~p~p", [Lib_Dir, Os, Arch]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+ ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+ rm -rf $tmp
+
+ CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ ac_fn_cxx_check_header_mongrel "$LINENO" "ciao_prolog.h" "ac_cv_header_ciao_prolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_ciao_prolog_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ciao Prolog version x.y.z or later" >&5
+$as_echo_n "checking for Ciao Prolog version x.y.z or later... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <ciao_prolog.h>
+
+int
+main() {
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ ciao_prolog=""
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ ciao_prolog=""
+fi
+
+
+
+
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CIAO_PROLOG="$ciao_prolog"
+
+
+ fi
+
+if test x$ciao_prolog != x
+then
+ have_ciao_prolog=yes
+else
+ have_ciao_prolog=no
+fi
+
+fi
+
+if test x${ciao_prolog_interface_enabled} = xyes \
+&& test x$have_ciao_prolog = xyes
+then
+ build_ciao_prolog_interface=yes
+fi
+ if test x$build_ciao_prolog_interface = xyes; then
+ BUILD_CIAO_PROLOG_INTERFACE_TRUE=
+ BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
+ BUILD_CIAO_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for GNU Prolog.
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+ # Extract the first word of "gprolog", so it can be a program name with args.
+set dummy gprolog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GNU_PROLOG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$GNU_PROLOG"; then
+ ac_cv_prog_GNU_PROLOG="$GNU_PROLOG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_GNU_PROLOG="gprolog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
+if test -n "$GNU_PROLOG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNU_PROLOG" >&5
+$as_echo "$GNU_PROLOG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x"$GNU_PROLOG" = xgprolog
+ then
+ ac_fn_cxx_check_header_mongrel "$LINENO" "gprolog.h" "ac_cv_header_gprolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_gprolog_h" = xyes; then :
+
+else
+ GNU_PROLOG=""
+fi
+
+
+ fi
+fi
+
+if test x${gnu_prolog_interface_enabled} = xyes \
+&& test x$GNU_PROLOG = xgprolog
+then
+ build_gnu_prolog_interface=yes
+fi
+ if test x$build_gnu_prolog_interface = xyes; then
+ BUILD_GNU_PROLOG_INTERFACE_TRUE=
+ BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
+ BUILD_GNU_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for SICStus.
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "sicstus", so it can be a program name with args.
+set dummy sicstus; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_sicstus_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $sicstus_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_sicstus_prolog="$sicstus_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+sicstus_prolog=$ac_cv_path_sicstus_prolog
+if test -n "$sicstus_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sicstus_prolog" >&5
+$as_echo "$sicstus_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$sicstus_prolog != x
+then
+ sicstus_prolog_app_dir=`$sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."`
+ sicstus_prolog_base=`dirname $sicstus_prolog_app_dir`
+ SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ # We require SICStus Prolog 3.9.1 or later.
+ ac_fn_cxx_check_header_mongrel "$LINENO" "sicstus/sicstus.h" "ac_cv_header_sicstus_sicstus_h" "$ac_includes_default"
+if test "x$ac_cv_header_sicstus_sicstus_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SICStus version 3.9.1 or later" >&5
+$as_echo_n "checking for SICStus version 3.9.1 or later... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sicstus/sicstus.h>
+ #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+ yes
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ sicstus_prolog=""
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f conftest*
+
+else
+ sicstus_prolog=""
+fi
+
+
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+fi
+
+if test x$sicstus_prolog != x
+then
+ have_sicstus_prolog=yes
+else
+ have_sicstus_prolog=no
+fi
+
+fi
+
+if test x${sicstus_prolog_interface_enabled} = xyes \
+&& test x$have_sicstus_prolog = xyes
+then
+ build_sicstus_prolog_interface=yes
+fi
+ if test x$build_sicstus_prolog_interface = xyes; then
+ BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
+ BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
+ BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for SWI-Prolog.
+if test x${swi_prolog_interface_enabled} = xyes
+then
+
+
+# Extract the first word of "swipl$EXEEXT", so it can be a program name with args.
+set dummy swipl$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test -z $swi_prolog
+then
+ # Extract the first word of "swi-prolog$EXEEXT", so it can be a program name with args.
+set dummy swi-prolog$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -z $swi_prolog
+ then
+ # Extract the first word of "pl$EXEEXT", so it can be a program name with args.
+set dummy pl$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -z $swi_prolog
+ then
+ # Extract the first word of "plcon$EXEEXT", so it can be a program name with args.
+set dummy plcon$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+ fi
+fi
+if test x$swi_prolog != x
+then
+ swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\([a-z]:\)\{0,1\}\(.*\)";.*/\2/'`
+ swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";.*/\1/'`
+ swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";.*/\1/'`
+ swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";.*/\1/'`
+ swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";.*/\1/'`
+
+
+ # Extract the first word of "swipl-ld$EXEEXT", so it can be a program name with args.
+set dummy swipl-ld$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog_ld in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog_ld="$swi_prolog_ld" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog_ld="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog_ld=$ac_cv_path_swi_prolog_ld
+if test -n "$swi_prolog_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog_ld" >&5
+$as_echo "$swi_prolog_ld" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -z $swi_prolog_ld
+ then
+ # Extract the first word of "plld$EXEEXT", so it can be a program name with args.
+set dummy plld$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $swi_prolog_ld in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_swi_prolog_ld="$swi_prolog_ld" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog_ld="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+swi_prolog_ld=$ac_cv_path_swi_prolog_ld
+if test -n "$swi_prolog_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog_ld" >&5
+$as_echo "$swi_prolog_ld" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+
+ # In Fedora, SWI-Prolog.h is installed only in /usr/include/pl, which,
+ # IMHO, is a bug (https://bugzilla.redhat.com/show_bug.cgi?id=471071).
+ SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include -I/usr/include/pl"
+ # If SWI-Prolog was configured with `--disable-libdirversion', then
+ # the files are not in the `${swi_prolog_arch}' subdirectory. Since
+ # currently there is no way to know that, we look in both places.
+ SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} -L${swi_prolog_base}/lib ${swi_prolog_lib} ${swi_prolog_libs}"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ # We require SWI-Prolog 5.6.0 or later.
+ ac_fn_cxx_check_header_mongrel "$LINENO" "SWI-Prolog.h" "ac_cv_header_SWI_Prolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_SWI_Prolog_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SWI-Prolog version 5.6.0 or later" >&5
+$as_echo_n "checking for SWI-Prolog version 5.6.0 or later... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ swi_prolog=""
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ swi_prolog=""
+fi
+
+
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ SWI_PROLOG="$swi_prolog"
+ SWI_PROLOG_LD="$swi_prolog_ld"
+
+
+
+
+fi
+
+if test x$swi_prolog != x
+then
+ have_swi_prolog=yes
+else
+ have_swi_prolog=no
+fi
+
+fi
+
+# Under Cygwin, SWI-Prolog does not work with foreign code:
+# see http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007838.html
+if test x${swi_prolog_interface_enabled} = xyes \
+&& test x$have_swi_prolog = xyes \
+&& test x"${host_os}" != xcygwin
+then
+ build_swi_prolog_interface=yes
+fi
+ if test x$build_swi_prolog_interface = xyes; then
+ BUILD_SWI_PROLOG_INTERFACE_TRUE=
+ BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
+ BUILD_SWI_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for XSB.
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "xsb", so it can be a program name with args.
+set dummy xsb; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_xsb_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $xsb_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_xsb_prolog="$xsb_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+xsb_prolog=$ac_cv_path_xsb_prolog
+if test -n "$xsb_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsb_prolog" >&5
+$as_echo "$xsb_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$xsb_prolog != x
+then
+ xsb_emu_dir=`xsb --nobanner --quietload --noprompt \
+ -e "write('emudir='), \
+ xsb_configuration(emudir, X), write(X), nl, halt." \
+ 2>/dev/null | sed "s/^emudir=//g"`
+ xsb_config_dir=`xsb --nobanner --quietload --noprompt \
+ -e "write('config_dir='), \
+ xsb_configuration(config_dir,X), write(X), nl, halt." \
+ 2>/dev/null | sed "s/^config_dir=//g"`
+ XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+
+fi
+
+if test x$xsb_prolog != x
+then
+ have_xsb_prolog=yes
+else
+ have_xsb_prolog=no
+fi
+
+fi
+
+if test x${xsb_prolog_interface_enabled} = xyes \
+&& test x$have_xsb_prolog = xyes
+then
+ build_xsb_prolog_interface=yes
+fi
+ if test x$build_xsb_prolog_interface = xyes; then
+ BUILD_XSB_PROLOG_INTERFACE_TRUE=
+ BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
+ BUILD_XSB_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for YAP.
+if test x${yap_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "yap", so it can be a program name with args.
+set dummy yap; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_yap_prolog+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $yap_prolog in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_yap_prolog="$yap_prolog" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_yap_prolog="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+yap_prolog=$ac_cv_path_yap_prolog
+if test -n "$yap_prolog"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $yap_prolog" >&5
+$as_echo "$yap_prolog" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$yap_prolog != x
+then
+
+ YAP_PROLOG_INCLUDE_OPTIONS=""
+ YAP_PROLOG_LD_OPTIONS="-lYap"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $YAP_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ # Check for YAP's foreign language interface header file.
+ ac_fn_cxx_check_header_mongrel "$LINENO" "Yap/c_interface.h" "ac_cv_header_Yap_c_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_Yap_c_interface_h" = xyes; then :
+
+else
+ yap_prolog=""
+fi
+
+
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ YAP_PROLOG="$yap_prolog"
+
+
+
+fi
+
+if test x$yap_prolog != x
+then
+ have_yap_prolog=yes
+else
+ have_yap_prolog=no
+fi
+
+fi
+
+if test x${yap_prolog_interface_enabled} = xyes \
+&& test x$have_yap_prolog = xyes
+then
+ build_yap_prolog_interface=yes
+fi
+ if test x$build_yap_prolog_interface = xyes; then
+ BUILD_YAP_PROLOG_INTERFACE_TRUE=
+ BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
+ BUILD_YAP_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Test if some Prolog interfaces have to be built.
+if test x$build_ciao_prolog_interface = xyes \
+|| test x$build_gnu_prolog_interface = xyes \
+|| test x$build_sicstus_prolog_interface = xyes \
+|| test x$build_swi_prolog_interface = xyes \
+|| test x$build_xsb_prolog_interface = xyes \
+|| test x$build_yap_prolog_interface = xyes
+then
+ build_some_prolog_interfaces=yes
+fi
+ if test x$build_some_prolog_interfaces = xyes; then
+ BUILD_SOME_PROLOG_INTERFACES_TRUE=
+ BUILD_SOME_PROLOG_INTERFACES_FALSE='#'
+else
+ BUILD_SOME_PROLOG_INTERFACES_TRUE='#'
+ BUILD_SOME_PROLOG_INTERFACES_FALSE=
+fi
+
+
+if test x$build_c_interface = xyes \
+|| test x$build_java_interface = xyes \
+|| test x$build_ocaml_interface = xyes \
+|| test x$build_some_prolog_interfaces = xyes
+then
+ # Look for a recent enough version of GNU M4.
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU M4 that supports accurate traces" >&5
+$as_echo_n "checking for GNU M4 that supports accurate traces... " >&6; }
+if ${ac_cv_path_M4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -f conftest.m4f
+if test -z "$M4"; then
+ ac_path_M4_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in m4 gm4 gnum4; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_M4="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_M4" || continue
+ # Root out GNU M4 1.4.4, as well as non-GNU m4 that ignore -t, -F.
+ ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)d'nl
+ test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
+ && test -z "`echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
+ && test -f conftest.m4f \
+ && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
+ rm -f conftest.m4f
+ $ac_path_M4_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_M4"; then
+ as_fn_error $? "no acceptable m4 could be found in \$PATH.
+GNU M4 1.4.5 or later is required; 1.4.11 or later is recommended" "$LINENO" 5
+ fi
+else
+ ac_cv_path_M4=$M4
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_M4" >&5
+$as_echo "$ac_cv_path_M4" >&6; }
+ M4=$ac_cv_path_M4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how m4 supports trace files" >&5
+$as_echo_n "checking how m4 supports trace files... " >&6; }
+if ${ac_cv_prog_gnu_m4_debugfile+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case `$M4 --help < /dev/null 2>&1` in
+ *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
+ *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
+ esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_debugfile" >&5
+$as_echo "$ac_cv_prog_gnu_m4_debugfile" >&6; }
+ M4_DEBUGFILE=$ac_cv_prog_gnu_m4_debugfile
+
+
+fi
+
+# Define the list of instantiations that are enabled by default.
+# Different instantiations are separated by a '@' character.
+di=" Polyhedron @ Grid"
+di="${di} @ Rational_Box"
+di="${di} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+di="${di} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+di="${di} @ Constraints_Product<C_Polyhedron, Grid>"
+di="${di} @ Pointset_Powerset<C_Polyhedron>"
+di="${di} @ Pointset_Powerset<NNC_Polyhedron>"
+if test $ac_supported_double = 1
+then
+ di="${di} @ Double_Box @ BD_Shape<double> @ Octagonal_Shape<double>"
+fi
+default_instantiations="${di}"
+
+# Define the list of all instantiations.
+# Different instantiations are separated by a '@' character.
+ai=" Int8_Box @ Int16_Box @ Int32_Box @ Int64_Box"
+ai="${ai} @ Uint8_Box @ Uint16_Box @ Uint32_Box @ Uint64_Box"
+ai="${ai} @ Z_Box @ Rational_Box"
+ai="${ai} @ BD_Shape<int8_t> @ BD_Shape<int16_t>"
+ai="${ai} @ BD_Shape<int32_t> @ BD_Shape<int64_t>"
+ai="${ai} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+ai="${ai} @ Octagonal_Shape<int8_t> @ Octagonal_Shape<int16_t>"
+ai="${ai} @ Octagonal_Shape<int32_t> @ Octagonal_Shape<int64_t>"
+ai="${ai} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+ai="${ai} @ Polyhedron @ Grid"
+ai="${ai} @ Pointset_Powerset<Int8_Box> @ Pointset_Powerset<Int16_Box>"
+ai="${ai} @ Pointset_Powerset<Int32_Box> @ Pointset_Powerset<Int64_Box>"
+ai="${ai} @ Pointset_Powerset<Uint8_Box> @ Pointset_Powerset<Uint16_Box>"
+ai="${ai} @ Pointset_Powerset<Uint32_Box> @ Pointset_Powerset<Uint64_Box>"
+ai="${ai} @ Pointset_Powerset<Rational_Box> @ Pointset_Powerset<Z_Box>"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<C_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<NNC_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<Grid>"
+ai="${ai} @ Constraints_Product<C_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<NNC_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<Grid, C_Polyhedron>"
+ai="${ai} @ Constraints_Product<Grid, NNC_Polyhedron>"
+if test $ac_supported_float = 1
+then
+ ai="${ai} @ Float_Box @ BD_Shape<float>"
+ ai="${ai} @ Octagonal_Shape<float>"
+ ai="${ai} @ Pointset_Powerset<Float_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<float> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<float> >"
+fi
+if test $ac_supported_double = 1
+then
+ ai="${ai} @ Double_Box @ BD_Shape<double>"
+ ai="${ai} @ Octagonal_Shape<double>"
+ ai="${ai} @ Pointset_Powerset<Double_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<double> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<double> >"
+fi
+if test $ac_supported_long_double = 1
+then
+ ai="${ai} @ Long_Double_Box @ BD_Shape<long double>"
+ ai="${ai} @ Octagonal_Shape<long double>"
+ ai="${ai} @ Pointset_Powerset<Long_Double_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<long double> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<long double> >"
+fi
+available_instantiations=${ai}
+
+enableval=not_specified
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which instantiations are enabled" >&5
+$as_echo_n "checking which instantiations are enabled... " >&6; }
+# Check whether --enable-instantiations was given.
+if test "${enable_instantiations+set}" = set; then :
+ enableval=$enable_instantiations;
+fi
+
+case x"${enableval}" in
+xyes | x)
+ ai_one_per_line=`echo "${available_instantiations}" | sed -e 's/ *@ */\n/g' -e 's/ *\([A-Z]\)/\1/g'`
+ as_fn_error $? "
+--enable-instantiations needs at least one argument chosen among none,
+all, and an @-separated list of instantiation specifiers included
+in the following list:
+${ai_one_per_line}" "$LINENO" 5
+ ;;
+xno | xnone)
+ enableval=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+ ;;
+*)
+ if test x"${enableval}" = xnot_specified
+ then
+ enableval=${default_instantiations}
+ elif test x"${enableval}" = xall
+ then
+ enableval=${available_instantiations}
+ fi
+ # Avoid extra blanks.
+ required_instantiations=`echo "${enableval}" | sed -e 's/[ ][ ]*/ /g' -e 's/[ ]*\([@<>,]\)/\1/g' -e 's/\([@<>,]\)[ ]*/\1/g' -e 's/>>/> >/g' -e 's/^[ ]//g' -e 's/[ ]$//g'`
+ # Check the specified instantiations for validity.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -I${srcdir} ${gmp_include_options}"
+ old_IFS="${IFS}"
+ IFS=@
+ set -- ${required_instantiations}
+ IFS="${old_IFS}"
+ for instantiation
+ do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include "instchk.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+bool valid = ${instantiation}::valid_instantiation();
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ valid_instantiation=yes
+else
+ valid_instantiation=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test x${valid_instantiation} != xyes
+ then
+ as_fn_error $? "invalid instantiation ${instantiation}" "$LINENO" 5
+ fi
+ done
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[< ,]/_/g'`
+
+ required_instantiations_c_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_c_cxx_objects=`echo "${required_instantiations_c_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_c_\1.lo/g'`
+ required_instantiations_c_cxx_sources=`echo "${required_instantiations_c_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+ required_instantiations_c_cxx_headers=`echo "${required_instantiations_c_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+ required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_prolog_\1.lo/g'`
+ required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+ required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+ required_instantiations_prolog_generated_test_sources=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.pl /g' -e 's/$/.pl/g' | sed -e 's/\([^. ]*\)\.pl/ppl_prolog_generated_test_\1.pl/g'`
+
+ required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[a-zA-Z0-9_]*/&@&_Iterator/g'`
+ required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+ required_instantiations_java_classes=`echo "${required_instantiations_java_sources}" | sed -e 's/\.java/.class/g'`
+ required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\)\.java/parma_polyhedra_library.\1/g'`
+ required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\)\.java/parma_polyhedra_library_\1.h/g'`
+ required_instantiations_java_cxx_objects=`echo "${required_instantiations_canonical_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_java_\1.lo/g'`
+ required_instantiations_java_cxx_sources=`echo "${required_instantiations_java_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+
+ required_instantiations_ocaml_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_ocaml_cxx_objects=`echo "${required_instantiations_ocaml_source_names}" | sed -e 's/@/.o /g' -e 's/$/.o/g' | sed -e 's/\([^. ]*\)\.o/ppl_ocaml_\1.o/g'`
+ required_instantiations_ocaml_cxx_sources=`echo "${required_instantiations_ocaml_cxx_objects}" | sed -e 's/\([^. ]*\)\.o/\1.cc/g'`
+ required_instantiations_ocaml_cxx_headers=`echo "${required_instantiations_ocaml_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${required_instantiations}" >&5
+$as_echo "${required_instantiations}" >&6; }
+ ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests should be run under Valgrind" >&5
+$as_echo_n "checking whether tests should be run under Valgrind... " >&6; }
+# Check whether --enable-valgrind-tests was given.
+if test "${enable_valgrind_tests+set}" = set; then :
+ enableval=$enable_valgrind_tests;
+fi
+
+case "${enableval}" in
+yes)
+ # Extract the first word of "valgrind", so it can be a program name with args.
+set dummy valgrind; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_VALGRIND+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$VALGRIND"; then
+ ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_VALGRIND="valgrind"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+VALGRIND=$ac_cv_prog_VALGRIND
+if test -n "$VALGRIND"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
+$as_echo "$VALGRIND" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x"$VALGRIND" = xvalgrind
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ enable_valgrind_tests=yes
+ else
+ as_fn_error $? "bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" "$LINENO" 5
+ fi
+ ;;
+no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ enable_valgrind_tests=no
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-valgrind-tests, needs yes or no" "$LINENO" 5
+ ;;
+esac
+ if test x"$enable_valgrind_tests" = xyes; then
+ VALGRIND_TESTS_ENABLED_TRUE=
+ VALGRIND_TESTS_ENABLED_FALSE='#'
+else
+ VALGRIND_TESTS_ENABLED_TRUE='#'
+ VALGRIND_TESTS_ENABLED_FALSE=
+fi
+
+
+enableval=quick
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`make check' does a thorough or quick check" >&5
+$as_echo_n "checking whether \`make check' does a thorough or quick check... " >&6; }
+# Check whether --enable-check was given.
+if test "${enable_check+set}" = set; then :
+ enableval=$enable_check;
+fi
+
+case "${enableval}" in
+thorough)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: thorough" >&5
+$as_echo "thorough" >&6; }
+ ;;
+quick)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: quick" >&5
+$as_echo "quick" >&6; }
+ ;;
+*)
+ as_fn_error $? "bad value ${enableval} for --enable-check, needs thorough or quick" "$LINENO" 5
+ ;;
+esac
+ if test x"$enableval" = xthorough; then
+ THOROUGH_MAKE_CHECK_TRUE=
+ THOROUGH_MAKE_CHECK_FALSE='#'
+else
+ THOROUGH_MAKE_CHECK_TRUE='#'
+ THOROUGH_MAKE_CHECK_FALSE=
+fi
+
+
+# Libtool.
+
+case `pwd` in
+ *\ * | *\ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case "$ECHO" in
+ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+ NM="$lt_cv_path_NM"
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test "$DUMPBIN" != ":"; then
+ NM="$DUMPBIN"
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8 ; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+ = c,a/b,b/c, \
+ && eval 'test $(( 1 + 1 )) -eq 2 \
+ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+ && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+ >/dev/null 2>&1 \
+ && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test "$GCC" != yes; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh
+ # decide which to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -eq 0; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -ne 0; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function
+ # and D for any global variable.
+ # Also find C++ and __fastcall symbols from MSVC++,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+" s[1]~/^[@?]/{print s[1], s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+ withval=$with_sysroot;
+else
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+ if test "$GCC" = yes; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+ enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_cc_needs_belf=yes
+else
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD="${LD-ld}_sol2"
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_apple_cc_single_mod=no
+ if test -z "${LT_MULTI_MODULE}"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_ld_exported_symbols_list=yes
+else
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ 10.[012]*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+for ac_header in dlfcn.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+ case ${2} in
+ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+enable_dlopen=yes
+
+
+
+
+ enable_win32_dll=no
+
+
+ # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for lt_pkg in $withval; do
+ IFS="$lt_save_ifs"
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ # old Intel for x86_64 which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test "$with_gnu_ld" = yes; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test "$lt_use_gnu_ld_interface" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='${wl}--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test "$host_os" = linux-dietlibc; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test "$tmp_diet" = no
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test "x$supports_anon_versioning" = xyes; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test "x$supports_anon_versioning" = xyes; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global
+ # defined symbols, whereas GNU nm marks them as "W".
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='${wl}-f,'
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ export_dynamic_flag_spec='${wl}-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' ${wl}-bernotok'
+ allow_undefined_flag=' ${wl}-berok'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test "$lt_cv_ld_force_load" = "yes"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag="$_lt_dar_allow_undefined"
+ case $cc_basename in
+ ifort*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test "$_lt_dar_can_shared" = "yes"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='${wl}-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_irix_exported_symbol=yes
+else
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+ if test "$lt_cv_irix_exported_symbol" = yes; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='${wl}'
+ archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='${wl}-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='${wl}-z,text'
+ allow_undefined_flag='${wl}-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='${wl}-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test x$host_vendor = xsni; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+ case $host_os in
+ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+ *) lt_awk_arg="/^libraries:/" ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+ *) lt_sed_strip_eq="s,=/,/,g" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary.
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+ else
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+ lt_foo="";
+ lt_count=0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo="/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='${libname}.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec="$LIB"
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existent directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+ test "$inherit_rpath" = yes; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+ lt_cv_dlopen="shl_load"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_shl_load=yes
+else
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+ lt_cv_dlopen="dlopen"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_svld_dlopen=yes
+else
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_dld_link=yes
+else
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report which library types will actually be built
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+ test "$can_build_shared" = "no" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test "$enable_shared" = yes || enable_static=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if ${ac_cv_prog_CXXCPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test "$GXX" = yes; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='${wl}-f,'
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='${wl}-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_CXX='-berok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath__CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath__CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' ${wl}-bernotok'
+ allow_undefined_flag_CXX=' ${wl}-berok'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ # This is similar to how AIX traditionally builds its shared
+ # libraries.
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl*)
+ # Native MSVC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test "$lt_cv_ld_force_load" = "yes"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+ case $cc_basename in
+ ifort*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test "$_lt_dar_can_shared" = "yes"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+ archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ gnu*)
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ if test "x$supports_anon_versioning" = xyes; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ ld_shlibs_CXX=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='${wl}-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='${wl}-z,text'
+ allow_undefined_flag_CXX='${wl}-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+ test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+ GCC_CXX="$GXX"
+ LD_CXX="$LD"
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case ${prev}${p} in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" ||
+ test $p = "-R"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test "$pre_test_object_deps_done" = no; then
+ case ${prev} in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX="${prev}${p}"
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX="${prev}${p}"
+ else
+ postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX="$p"
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX="$p"
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+
+linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ if test "$solaris_use_stlport4" != yes; then
+ postdeps_CXX='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ if test "$solaris_use_stlport4" != yes; then
+ postdeps_CXX='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64 which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test "$hard_links" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global defined
+ # symbols, whereas GNU nm marks them as "W".
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX="$ltdll_cmds"
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='${libname}.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec="$LIB"
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+ # We can hardcode non-existent directories.
+ if test "$hardcode_direct_CXX" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+ test "$hardcode_minus_L_CXX" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+ test "$inherit_rpath_CXX" = yes; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+ if test x"$enable_shared" = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+ if test x"$enable_static" = xyes; then
+ ENABLE_STATIC_TRUE=
+ ENABLE_STATIC_FALSE='#'
+else
+ ENABLE_STATIC_TRUE='#'
+ ENABLE_STATIC_FALSE=
+fi
+
+
+# Checks for md5sum.
+# Extract the first word of "md5sum", so it can be a program name with args.
+set dummy md5sum; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MD5SUM+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MD5SUM"; then
+ ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MD5SUM="md5sum"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MD5SUM=$ac_cv_prog_MD5SUM
+if test -n "$MD5SUM"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5SUM" >&5
+$as_echo "$MD5SUM" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x$MD5SUM = xmd5sum; then
+ HAVE_MD5SUM_TRUE=
+ HAVE_MD5SUM_FALSE='#'
+else
+ HAVE_MD5SUM_TRUE='#'
+ HAVE_MD5SUM_FALSE=
+fi
+
+if test x$MD5SUM = xmd5sum
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the text md5sum command" >&5
+$as_echo_n "checking for the text md5sum command... " >&6; }
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+ ac_cv_prog_text_md5sum='md5sum -t'
+else
+ ac_cv_prog_text_md5sum='md5sum'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_text_md5sum" >&5
+$as_echo "$ac_cv_prog_text_md5sum" >&6; }
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+
+
+fi
+
+# Check for the GLPK library.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+for ac_header in glpk.h glpk/glpk.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_glpk=yes
+fi
+
+done
+
+ if test x$have_glpk = xyes; then
+ HAVE_GLPK_TRUE=
+ HAVE_GLPK_FALSE='#'
+else
+ HAVE_GLPK_TRUE='#'
+ HAVE_GLPK_FALSE=
+fi
+
+if test x$have_glpk = xyes
+then
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS -lglpk"
+ ac_fn_c_check_decl "$LINENO" "lib_set_print_hook" "ac_cv_have_decl_lib_set_print_hook" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_lib_set_print_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_LIB_SET_PRINT_HOOK 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_func "$LINENO" "_glp_lib_print_hook" "ac_cv_func__glp_lib_print_hook"
+if test "x$ac_cv_func__glp_lib_print_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_decl "$LINENO" "glp_term_out" "ac_cv_have_decl_glp_term_out" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_glp_term_out" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_GLP_TERM_OUT 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_decl "$LINENO" "glp_term_hook" "ac_cv_have_decl_glp_term_hook" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_glp_term_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_GLP_TERM_HOOK 1" >>confdefs.h
+
+fi
+
+ LIBS="$ac_save_LIBS"
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# Checks for header declarations.
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_DATA" "ac_cv_have_decl_RLIMIT_DATA" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_DATA" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_RSS" "ac_cv_have_decl_RLIMIT_RSS" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_RSS" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_VMEM" "ac_cv_have_decl_RLIMIT_VMEM" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_VMEM" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_AS" "ac_cv_have_decl_RLIMIT_AS" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_AS" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "getrusage" "ac_cv_have_decl_getrusage" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_getrusage" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETRUSAGE $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "setrlimit" "ac_cv_have_decl_setrlimit" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_setrlimit" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SETRLIMIT $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "setitimer" "ac_cv_have_decl_setitimer" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_setitimer" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SETITIMER $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "sigaction" "ac_cv_have_decl_sigaction" "#include <csignal>
+"
+if test "x$ac_cv_have_decl_sigaction" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SIGACTION $ac_have_decl
+_ACEOF
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+ac_fn_cxx_check_type "$LINENO" "timeval" "ac_cv_type_timeval" "$ac_includes_default"
+if test "x$ac_cv_type_timeval" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_TIMEVAL 1
+_ACEOF
+
+
+fi
+
+ac_fn_cxx_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_siginfo_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGINFO_T 1
+_ACEOF
+
+
+fi
+
+
+# Check whether we can limit memory in C and C++ using setrlimit().
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can limit memory in C++ using setrlimit()" >&5
+$as_echo_n "checking whether we can limit memory in C++ using setrlimit()... " >&6; }
+if test "$cross_compiling" = yes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+ ac_cxx_supports_limiting_memory=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if !HAVE_DECL_SETRLIMIT
+# error "cannot limit memory without setrlimit()"
+#endif
+
+#include <stdexcept>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., ru_utime.
+# include <sys/resource.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#define LIMIT(WHAT) \
+ do { \
+ if (getrlimit(WHAT, &t) != 0) \
+ return false; \
+ t.rlim_cur = bytes; \
+ if (setrlimit(WHAT, &t) != 0) \
+ return false; \
+ } while (0)
+
+bool
+limit_memory(unsigned long bytes) {
+ struct rlimit t;
+#if HAVE_DECL_RLIMIT_DATA
+ // Limit heap size.
+ LIMIT(RLIMIT_DATA);
+#endif
+#if HAVE_DECL_RLIMIT_RSS
+ // Limit resident set size.
+ LIMIT(RLIMIT_RSS);
+#endif
+#if HAVE_DECL_RLIMIT_VMEM
+ // Limit mapped memory (brk + mmap).
+ LIMIT(RLIMIT_VMEM);
+#endif
+#if HAVE_DECL_RLIMIT_AS
+ // Limit virtual memory.
+ LIMIT(RLIMIT_AS);
+#endif
+ return true;
+}
+
+int
+main() try {
+ if (!limit_memory(10000))
+ return 1;
+ (void) new char[20000];
+ return 1;
+ }
+ catch (std::bad_alloc) {
+ return 0;
+ }
+ catch (...) {
+ return 1;
+ }
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_cxx_supports_limiting_memory=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ac_cxx_supports_limiting_memory=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_limiting_memory" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_LIMITING_MEMORY $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
+if test x"$GCC" = xyes
+then
+ if test x"$ICC" = xyes
+ then
+ CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+ else
+ CFLAGS="$CFLAGS -W -Wall"
+ fi
+fi
+if test x"$GXX" = xyes
+then
+ if test x"$ICPC" = xyes
+ then
+ CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+ else
+ CXXFLAGS="$CXXFLAGS -W -Wall"
+ fi
+fi
+
+
+LIBEXT=$libext
+
+SHREXT=$shrext_cmds
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# FIXME: rename headers_sources into sources.
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile ppl.lsm src/Makefile src/version.hh src/ppl-config.cc tests/Makefile tests/BD_Shape/Makefile tests/Box/Makefile tests/Concrete_Expression/Makefile tests/CO_Tree/Makefile tests/Grid/Makefile tests/MIP_Problem/Makefile tests/Octagonal_Shape/Makefile tests/Partially_Reduced_Product/Makefile tests/PIP_Problem/Makefile tests/Polyhedron/Makefile tests/Powerset/Makefile tests/Watchdog/Makefile utils/Makefile m4/Makefile demos/Makefile demos/ppl_lcdd/Ma [...]
+
+# tests/Ask_Tell/Makefile
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GCC_TRUE}" && test -z "${GCC_FALSE}"; then
+ as_fn_error $? "conditional \"GCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ICC_TRUE}" && test -z "${ICC_FALSE}"; then
+ as_fn_error $? "conditional \"ICC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DEBUGGING_ENABLED_TRUE}" && test -z "${DEBUGGING_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"DEBUGGING_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_HPUX_TRUE}" && test -z "${HOST_OS_HPUX_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_OS_HPUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_MINGW_TRUE}" && test -z "${HOST_OS_MINGW_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_OS_MINGW\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_CPU_X86_64_TRUE}" && test -z "${HOST_CPU_X86_64_FALSE}"; then
+ as_fn_error $? "conditional \"HOST_CPU_X86_64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+ as_fn_error $? "conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
+ as_fn_error $? "conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
+ as_fn_error $? "conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
+ as_fn_error $? "conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
+ as_fn_error $? "conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE}" && test -z "${SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE}"; then
+ as_fn_error $? "conditional \"SUPPORTED_SOME_FLOATING_POINT_TYPE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_LCDD_TRUE}" && test -z "${BUILD_PPL_LCDD_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_PPL_LCDD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_LPSOL_TRUE}" && test -z "${BUILD_PPL_LPSOL_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_PPL_LPSOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_PIPS_TRUE}" && test -z "${BUILD_PPL_PIPS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_PPL_PIPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_DOCUMENTATION_TRUE}" && test -z "${BUILD_DOCUMENTATION_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_DOCUMENTATION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_CXX_INTERFACE_TRUE}" && test -z "${BUILD_CXX_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_CXX_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_JAVA_INTERFACE_TRUE}" && test -z "${BUILD_JAVA_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_JAVA_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_OCAMLC_TRUE}" && test -z "${HAVE_OCAMLC_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_OCAMLC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_OCAMLOPT_TRUE}" && test -z "${HAVE_OCAMLOPT_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_OCAMLOPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_OCAML_INTERFACE_TRUE}" && test -z "${BUILD_OCAML_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_OCAML_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SOME_PROLOG_INTERFACES_TRUE}" && test -z "${BUILD_SOME_PROLOG_INTERFACES_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VALGRIND_TESTS_ENABLED_TRUE}" && test -z "${VALGRIND_TESTS_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"VALGRIND_TESTS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THOROUGH_MAKE_CHECK_TRUE}" && test -z "${THOROUGH_MAKE_CHECK_FALSE}"; then
+ as_fn_error $? "conditional \"THOROUGH_MAKE_CHECK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by the Parma Polyhedra Library $as_me 1.1, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <ppl-devel at cs.unipr.it>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+the Parma Polyhedra Library config.status 1.1
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ TIMESTAMP='$TIMESTAMP'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "ppl.lsm") CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "src/version.hh") CONFIG_FILES="$CONFIG_FILES src/version.hh" ;;
+ "src/ppl-config.cc") CONFIG_FILES="$CONFIG_FILES src/ppl-config.cc" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ "tests/BD_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/BD_Shape/Makefile" ;;
+ "tests/Box/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Box/Makefile" ;;
+ "tests/Concrete_Expression/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Concrete_Expression/Makefile" ;;
+ "tests/CO_Tree/Makefile") CONFIG_FILES="$CONFIG_FILES tests/CO_Tree/Makefile" ;;
+ "tests/Grid/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Grid/Makefile" ;;
+ "tests/MIP_Problem/Makefile") CONFIG_FILES="$CONFIG_FILES tests/MIP_Problem/Makefile" ;;
+ "tests/Octagonal_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Octagonal_Shape/Makefile" ;;
+ "tests/Partially_Reduced_Product/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Partially_Reduced_Product/Makefile" ;;
+ "tests/PIP_Problem/Makefile") CONFIG_FILES="$CONFIG_FILES tests/PIP_Problem/Makefile" ;;
+ "tests/Polyhedron/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
+ "tests/Powerset/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Powerset/Makefile" ;;
+ "tests/Watchdog/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Watchdog/Makefile" ;;
+ "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+ "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+ "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;;
+ "demos/ppl_lcdd/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;;
+ "demos/ppl_lcdd/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;;
+ "demos/ppl_lpsol/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;;
+ "demos/ppl_lpsol/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;;
+ "demos/ppl_pips/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_pips/Makefile" ;;
+ "demos/ppl_pips/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_pips/examples/Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "doc/user.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
+ "doc/devref.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
+ "doc/user.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
+ "doc/devref.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
+ "doc/user-language-interface.doxyconf") CONFIG_FILES="$CONFIG_FILES doc/user-language-interface.doxyconf" ;;
+ "doc/devref-language-interface.doxyconf") CONFIG_FILES="$CONFIG_FILES doc/devref-language-interface.doxyconf" ;;
+ "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+ "interfaces/C/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
+ "interfaces/C/ppl_c_version.h") CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c_version.h" ;;
+ "interfaces/C/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/C/tests/Makefile" ;;
+ "interfaces/Java/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/Makefile" ;;
+ "interfaces/Java/jni/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/jni/Makefile" ;;
+ "interfaces/Java/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/tests/Makefile" ;;
+ "interfaces/Java/parma_polyhedra_library/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/parma_polyhedra_library/Makefile" ;;
+ "interfaces/OCaml/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/Makefile" ;;
+ "interfaces/OCaml/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/tests/Makefile" ;;
+ "interfaces/Prolog/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Makefile" ;;
+ "interfaces/Prolog/Ciao/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Ciao/Makefile" ;;
+ "interfaces/Prolog/GNU/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/GNU/Makefile" ;;
+ "interfaces/Prolog/SICStus/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SICStus/Makefile" ;;
+ "interfaces/Prolog/SWI/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SWI/Makefile" ;;
+ "interfaces/Prolog/XSB/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/XSB/Makefile" ;;
+ "interfaces/Prolog/YAP/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/YAP/Makefile" ;;
+ "interfaces/Prolog/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/tests/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir=$dirpart/$fdir; as_fn_mkdir_p
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options which allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile="${ofile}T"
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# Written by Gordon Matzigkeit, 1996
+#
+# This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING. If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ if test x"$xsi_shell" = xyes; then
+ sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\ case ${1} in\
+\ */*) func_dirname_result="${1%/*}${2}" ;;\
+\ * ) func_dirname_result="${3}" ;;\
+\ esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\ func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\ case ${1} in\
+\ */*) func_dirname_result="${1%/*}${2}" ;;\
+\ * ) func_dirname_result="${3}" ;;\
+\ esac\
+\ func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\ # positional parameters, so assign one to ordinary parameter first.\
+\ func_stripname_result=${3}\
+\ func_stripname_result=${func_stripname_result#"${1}"}\
+\ func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\ func_split_long_opt_name=${1%%=*}\
+\ func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\ func_split_short_opt_arg=${1#??}\
+\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\ case ${1} in\
+\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\ *) func_lo2o_result=${1} ;;\
+\ esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+ func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+ func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+ func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+ sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+ eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\ func_quote_for_eval "${2}"\
+\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ # Save a `func_append' function call where possible by direct use of '+='
+ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+else
+ # Save a `func_append' function call even when '+=' is not available
+ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+if test x"$gmp_supports_exceptions" = xno
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL. Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&5
+$as_echo "$as_me: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL. Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&2;}
+fi
+
+if test x"$PERL" = xno
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PERL UNAVAILABLE:
+*** CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system. This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy. If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&5
+$as_echo "$as_me: WARNING: PERL UNAVAILABLE:
+*** CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system. This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy. If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&2;}
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients. This means that arithmetic overflows will be possible
+*** and will not be detected. The consequence of that is that nothing
+*** can be said about the behavior of the library: whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build. Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved. Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+*** computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+*** cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+*** trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&5
+$as_echo "$as_me: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients. This means that arithmetic overflows will be possible
+*** and will not be detected. The consequence of that is that nothing
+*** can be said about the behavior of the library: whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build. Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved. Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+*** computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+*** cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+*** trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&2;}
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..25f3ba3
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,1751 @@
+# Autoconf source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Process this file with Autoconf to produce a configure script.
+
+# Every other copy of the package version number gets its value from here.
+AC_INIT([the Parma Polyhedra Library], [1.1], [ppl-devel at cs.unipr.it], [ppl])
+
+# Minimum Autoconf version required.
+AC_PREREQ(2.61)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Polyhedron_public.cc)
+
+# Specify the location of additional local Autoconf macros.
+AC_CONFIG_MACRO_DIR([m4])
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+AC_CANONICAL_HOST
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign no-define dist-bzip2 dist-zip dist-xz tar-ustar silent-rules 1.11])
+
+AC_SUBST(VERSION)
+
+# Version number machinery.
+changequote(<<, >>)dnl
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+ PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+ PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+ PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+ PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+ PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+ PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+ PPL_VERSION_REVISION=0
+ PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+ PPL_VERSION_BETA=0
+fi
+changequote([, ])dnl
+AC_SUBST(PPL_VERSION_MAJOR)
+AC_SUBST(PPL_VERSION_MINOR)
+AC_SUBST(PPL_VERSION_REVISION)
+AC_SUBST(PPL_VERSION_BETA)
+
+AC_DEFINE_UNQUOTED(PPL_CONFIGURE_OPTIONS, "$ac_configure_args", [This contains the options with which `configure' was invoked.])
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+AC_SUBST(CONFIGURE_OPTIONS)
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER([config.h])
+
+ISODATE=`date +%Y-%m-%d`
+AC_SUBST(ISODATE)
+
+AH_TOP([
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+ floating point format. */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+])
+
+AH_BOTTOM([
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+ we must make sure <stdint.h> is included before <sys/types.hh> is
+ (even indirectly) included. Moreover we need to define
+ __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+ in order to have the macros defined also in C++. */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+])
+
+
+# C compiler.
+
+AC_ARG_WITH(cc,
+ AS_HELP_STRING([--with-cc=XXX], [use XXX as the C compiler]),
+ CC=$with_cc)
+
+# C++ compiler.
+
+AC_ARG_WITH(cxx,
+ AS_HELP_STRING([--with-cxx=XXX], [use XXX as the C++ compiler]),
+ CXX=$with_cxx)
+
+# Checks for programs.
+
+# Note that AC_PROG_CC must precede the first use of $GCC and AC_PROG_CXX
+# must precede the first use of $GXX. Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+AC_PROG_CC
+CFLAGS="$save_CFLAGS"
+
+AM_CONDITIONAL(GCC, test x"$GCC" = xyes)
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using the Intel C compiler])
+ AC_LANG_PUSH(C)
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+ AC_MSG_RESULT(yes)
+ ICC=yes,
+ AC_MSG_RESULT(no)
+ ICC=no,
+ AC_MSG_RESULT(no)
+ ICC=no)
+ AC_LANG_POP(C)
+fi
+
+AM_CONDITIONAL(ICC, test x"$ICC" = xyes)
+
+# The clang compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using clang])
+ AC_LANG_PUSH(C)
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __clang__
+choke me
+#endif
+]])],
+ AC_MSG_RESULT(yes)
+ CLANG=yes,
+ AC_MSG_RESULT(no)
+ CLANG=no,
+ AC_MSG_RESULT(no)
+ CLANG=no)
+ AC_LANG_POP(C)
+fi
+
+# The llvm-gcc compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using llvm-gcc])
+ AC_LANG_PUSH(C)
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int main() {
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ LLVM_GCC=yes,
+ AC_MSG_RESULT(no)
+ LLVM_GCC=no,
+ AC_MSG_RESULT(no)
+ LLVM_GCC=no)
+ CFLAGS="$save_CFLAGS"
+ AC_LANG_POP(C)
+fi
+
+save_CXXFLAGS="$CXXFLAGS"
+AC_PROG_CXX
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using the Intel C++ compiler])
+ AC_LANG_PUSH(C++)
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+ AC_MSG_RESULT(yes)
+ ICPC=yes,
+ AC_MSG_RESULT(no)
+ ICPC=no,
+ AC_MSG_RESULT(no)
+ ICPC=no)
+ AC_LANG_POP(C++)
+fi
+
+# The clang++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using clang++])
+ AC_LANG_PUSH(C++)
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __clang__
+choke me
+#endif
+]])],
+ AC_MSG_RESULT(yes)
+ CLANGXX=yes,
+ AC_MSG_RESULT(no)
+ CLANGXX=no,
+ AC_MSG_RESULT(no)
+ CLANGXX=no)
+ AC_LANG_POP(C++)
+fi
+
+# The llvm-++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+ AC_MSG_CHECKING([whether we are actually using llvm-g++])
+ AC_LANG_PUSH(C++)
+ save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int main() {
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ LLVM_GXX=yes,
+ AC_MSG_RESULT(no)
+ LLVM_GXX=no,
+ AC_MSG_RESULT(no)
+ LLVM_GXX=no)
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_POP(C++)
+fi
+
+
+AC_PROG_FGREP
+AC_PROG_EGREP
+AC_PROG_SED
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Compilation flags.
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+ AS_HELP_STRING([--enable-debugging], [compile with debugging information]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ OPT_FLAGS="-g"
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-debugging, needs yes or no])
+ ;;
+esac
+AM_CONDITIONAL(DEBUGGING_ENABLED, test x"$enableval" = xyes)
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+ AS_HELP_STRING([--enable-profiling], [compile for profiling]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-profiling, needs yes or no])
+ ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for test coverage])
+AC_ARG_ENABLE(coverage,
+ AS_HELP_STRING([--enable-coverage], [compile for test coverage]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+ extra_libraries="${extra_libraries} -lgcov"
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-coverage, needs yes or no])
+ ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to enable checking of run-time assertions])
+AC_ARG_ENABLE(assertions,
+ AS_HELP_STRING([--enable-assertions], [check run-time assertions]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-assertions, needs yes or no])
+ ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+AC_MSG_CHECKING([whether to enable even more run-time assertions])
+AC_ARG_ENABLE(more-assertions,
+ AS_HELP_STRING([--enable-more-assertions],
+ [break the ABI to check even more run-time assertions]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-more-assertions, needs yes or no])
+ ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+ enable_assertions=yes
+ AC_DEFINE(PPL_ABI_BREAKING_EXTRA_DEBUG, 1, [ABI-breaking extra assertions are enabled when this is defined.])
+ AC_DEFINE(_GLIBCXX_DEBUG, 1, [When defined and libstdc++ is used, it is used in debug mode.])
+ AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [When defined and libstdc++ is used, it is used in pedantic debug mode.])
+fi
+
+if test x"$enable_assertions" = xno
+then
+ AC_DEFINE(PPL_NDEBUG, 1, [Assertions are disabled when this is defined.])
+ debug_flag="-DNDEBUG=1"
+fi
+
+AM_CONDITIONAL(ASSERTIONS_ENABLED, test x"$enable_assertions" = xyes)
+
+
+arch=no
+enableval=standard
+AC_MSG_CHECKING([whether to enable optimizations])
+AC_ARG_ENABLE(optimization,
+ AS_HELP_STRING([--enable-optimization@<:@=LEVEL@:>@],
+ [enable compiler optimizations]))
+case "${enableval}" in
+sspeed)
+ AC_MSG_RESULT(sspeed)
+ OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+ arch=yes
+ ;;
+speed)
+ AC_MSG_RESULT(speed)
+ OPT_FLAGS="$OPT_FLAGS -O3"
+ arch=yes
+ ;;
+size)
+ AC_MSG_RESULT(size)
+ OPT_FLAGS="$OPT_FLAGS -Os"
+ arch=yes
+ ;;
+standard | yes)
+ AC_MSG_RESULT(standard)
+ OPT_FLAGS="$OPT_FLAGS -O2"
+ ;;
+mild)
+ AC_MSG_RESULT(mild)
+ OPT_FLAGS="$OPT_FLAGS -O1"
+ ;;
+zero)
+ AC_MSG_RESULT(zero)
+ OPT_FLAGS="$OPT_FLAGS -O0"
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no])
+ ;;
+esac
+
+enableval=$arch
+AC_MSG_CHECKING([for which architecture to optimize])
+AC_ARG_ENABLE(arch,
+ AS_HELP_STRING([--enable-arch@<:@=ARCH@:>@],
+ [optimize for architecture ARCH]))
+case "${enableval}" in
+yes)
+ m=`uname -m`
+ case $m in
+ i?86 | k6 | athlon)
+ AC_MSG_RESULT($m)
+ OPT_FLAGS="$OPT_FLAGS -march=$m"
+ ;;
+ *)
+ AC_MSG_RESULT(default)
+ ;;
+ esac
+ ;;
+no)
+ AC_MSG_RESULT(default)
+ ;;
+*)
+ AC_MSG_RESULT($enableval)
+ OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+ ;;
+esac
+
+enableval=default
+use_fpmath=yes
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+AC_MSG_CHECKING([whether to use (a specific) floating point arithmetic])
+AC_ARG_ENABLE(fpmath,
+ AS_HELP_STRING([--enable-fpmath=INSTRUCTION_SET],
+ [select floating point arithmetic]))
+case "${enableval}" in
+sse)
+ AC_MSG_RESULT(sse)
+ OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+ # The SSE instruction set only supports single precision arithmetic:
+ # double and extended precision arithmetic is still done using 387.
+ ;;
+sse2)
+ AC_MSG_RESULT(sse2)
+ OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+ # SSE2 still does not support extended precision arithmetic.
+ ;;
+387)
+ AC_MSG_RESULT(387)
+ OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+ # Note that the -mno-sse* and -mfpmath options are only guaranteed
+ # to work with GCC.
+ if test x"$GCC" = xyes
+ then
+ fpmath_may_use_sse=no
+ fi
+ ;;
+sse+387)
+ AC_MSG_RESULT(sse+387)
+ OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+ ;;
+sse2+387)
+ AC_MSG_RESULT(sse2+387)
+ OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+ ;;
+default)
+ AC_MSG_RESULT(default)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ use_fpmath=no
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no])
+ ;;
+esac
+
+if test x"$fpmath_may_use_387" = xyes
+then
+ AC_DEFINE(PPL_FPMATH_MAY_USE_387, 1, [Defined if floating point arithmetic may use the 387 unit.])
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+ AC_DEFINE(PPL_FPMATH_MAY_USE_SSE, 1, [Defined if floating point arithmetic may use the SSE instruction set.])
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+ if test x"$ICPC" = xyes
+ then
+ OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
+ else
+ # -frounding-math is not yet supported in clang++ or llvm-g++.
+ if test x"$CLANGXX" = xyes || x"$LLVM_GXX" = xyes
+ then
+ if test x"$use_fpmath" = xyes
+ then
+ AC_MSG_WARN([CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL.])
+ use_fpmath=no
+ fi
+ else
+ OPT_FLAGS="$OPT_FLAGS -frounding-math"
+ fi
+ fi
+fi
+
+enableval=no
+AC_MSG_CHECKING([whether to use precompiled headers])
+AC_ARG_ENABLE(pch,
+ AS_HELP_STRING([--enable-pch],
+ [use precompiled headers, if available]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-pch, needs yes or no])
+ ;;
+esac
+AM_CONDITIONAL(USE_PRECOMPILED_HEADERS, test x"$enableval" = xyes)
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+# System-dependent adjustments.
+cygwin=no
+mingw=no
+darwin=no
+solaris=no
+x86_64=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+ CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+ else
+ CFLAGS="$CFLAGS -fprm d -ieee_with_inexact"
+ CXXFLAGS="$CXXFLAGS -fprm d -ieee_with_inexact"
+ fi
+ ;;
+x86_64*)
+ x86_64=yes
+ ;;
+*)
+ ;;
+esac
+
+case "${host_os}" in
+cygwin*)
+ cygwin=yes
+ no_undefined=yes
+ shared_library_path_env_var=PATH
+ ;;
+darwin*)
+ darwin=yes
+ shared_library_path_env_var=DYLD_LIBRARY_PATH
+ ;;
+hpux*)
+ hpux=yes
+ shared_library_path_env_var=SHLIB_PATH
+ ;;
+mingw*)
+ mingw=yes
+ no_undefined=yes
+ shared_library_path_env_var=PATH
+ ;;
+solaris*)
+ solaris=yes
+ shared_library_path_env_var=LD_LIBRARY_PATH
+ ;;
+*)
+ shared_library_path_env_var=LD_LIBRARY_PATH
+ ;;
+esac
+
+AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes)
+AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes)
+AM_CONDITIONAL(HOST_OS_HPUX, test x$hpux = xyes)
+AM_CONDITIONAL(HOST_OS_MINGW, test x$mingw = xyes)
+AM_CONDITIONAL(HOST_OS_SOLARIS, test x$solaris = xyes)
+
+AM_CONDITIONAL(HOST_CPU_X86_64, test x$x86_64 = xyes)
+
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+
+enableval=mpz
+AC_MSG_CHECKING([the type of integral values to use as coefficients])
+AC_ARG_ENABLE(coefficients,
+ AS_HELP_STRING([--enable-coefficients=TYPE],
+ [select the type of the coefficients]))
+case "${enableval}" in
+native-int8)
+ AC_MSG_RESULT([native 8 bits integers])
+ coefficient_kind=native
+ coefficient_bits=8
+ coefficient_mnemonic=nint8
+ ;;
+native-int16)
+ AC_MSG_RESULT([native 16 bits integers])
+ coefficient_kind=native
+ coefficient_bits=16
+ coefficient_mnemonic=nint16
+ ;;
+native-int32)
+ AC_MSG_RESULT([native 32 bits integers])
+ coefficient_kind=native
+ coefficient_bits=32
+ coefficient_mnemonic=nint32
+ ;;
+native-int64)
+ AC_MSG_RESULT([native 64 bits integers])
+ coefficient_kind=native
+ coefficient_bits=64
+ coefficient_mnemonic=nint64
+ ;;
+checked-int8)
+ AC_MSG_RESULT([checked 8 bits integers])
+ coefficient_kind=checked
+ coefficient_bits=8
+ coefficient_mnemonic=int8
+ ;;
+checked-int16)
+ AC_MSG_RESULT([checked 16 bits integers])
+ coefficient_kind=checked
+ coefficient_bits=16
+ coefficient_mnemonic=int16
+ ;;
+checked-int32)
+ AC_MSG_RESULT([checked 32 bits integers])
+ coefficient_kind=checked
+ coefficient_bits=32
+ coefficient_mnemonic=int32
+ ;;
+checked-int64)
+ AC_MSG_RESULT([checked 64 bits integers])
+ coefficient_kind=checked
+ coefficient_bits=64
+ coefficient_mnemonic=int64
+ ;;
+mpz)
+ AC_MSG_RESULT([GMP mpz])
+ coefficient_kind=unbounded
+ coefficient_bits=0
+ coefficient_mnemonic=mpz
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8])
+ ;;
+esac
+
+AM_CONDITIONAL(USE_NATIVE_INTEGERS, test x"$coefficient_kind" = xnative)
+AM_CONDITIONAL(USE_CHECKED_INTEGERS, test x"$coefficient_kind" = xchecked)
+AM_CONDITIONAL(USE_GMP_INTEGERS, test x"$coefficient_kind" = xunbounded)
+AM_CONDITIONAL(USE_INT8, test x"$coefficient_bits" = x8)
+AM_CONDITIONAL(USE_INT16, test x"$coefficient_bits" = x16)
+AM_CONDITIONAL(USE_INT32, test x"$coefficient_bits" = x32)
+AM_CONDITIONAL(USE_INT64, test x"$coefficient_bits" = x64)
+
+
+if test x"$coefficient_kind" = xnative
+then
+ coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy<int${coefficient_bits}_t> >"
+ AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_TYPE, $coefficient_type, [The integral type used to represent coefficients.])
+ AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_BITS, $coefficient_bits, [The number of bits of coefficients; 0 if unbounded.])
+ AC_DEFINE(PPL_NATIVE_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a native one.])
+elif test x"$coefficient_kind" = xchecked
+then
+ coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Bounded_Integer_Coefficient_Policy>"
+ AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_TYPE, $coefficient_type)
+ AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_BITS, $coefficient_bits)
+ AC_DEFINE(PPL_CHECKED_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a checked one.])
+elif test x"$coefficient_kind" = xunbounded
+then
+ AC_DEFINE(PPL_COEFFICIENT_TYPE, mpz_class)
+ AC_DEFINE(PPL_COEFFICIENT_BITS, 0)
+ AC_DEFINE(PPL_GMP_INTEGERS, 1, [Defined if the integral type to be used for coefficients is GMP's one.])
+fi
+
+# Allow additions to C compilation flags.
+AC_ARG_WITH(cflags,
+ AS_HELP_STRING([--with-cflags=XXX],
+ [add XXX to the options for the C compiler]),
+ CFLAGS="$CFLAGS $with_cflags")
+
+# Allow additions to C++ compilation flags.
+AC_ARG_WITH(cxxflags,
+ AS_HELP_STRING([--with-cxxflags=XXX],
+ [add XXX to the options for the C++ compiler]),
+ CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+AC_LANG(C)
+AC_C_CONST
+AC_C_INLINE
+AC_C_BIGENDIAN
+AC_C_TYPEOF
+
+# Checks for C type sizes.
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(float)
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(long double)
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+AC_CHECK_SIZEOF([int*])
+AC_CHECK_SIZEOF([fp], [], [typedef int *(*fp)();])
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Use C++ for the remaining checks.
+AC_LANG(C++)
+
+# The PPL uses <cmath> for sqrt and other functions in several places.
+AC_SEARCH_LIBS([sqrt], [m])
+
+if test x"$use_fpmath" = xyes
+then
+ # Check for the possibility to control the FPU.
+ AC_CHECK_FPU_CONTROL
+else
+ ac_cv_can_control_fpu=0
+fi
+AM_CONDITIONAL(CAN_CONTROL_FPU, test $ac_cv_can_control_fpu = 1)
+AC_DEFINE_UNQUOTED(PPL_CAN_CONTROL_FPU, $ac_cv_can_control_fpu,
+ [Not zero if the FPU can be controlled.])
+
+# Check whether for the C++ compiler the plain char type is signed.
+AC_CXX_PLAIN_CHAR_IS_SIGNED
+
+# Check whether the C++ compiler provides proper long doubles.
+AC_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+# Detect the binary format used by C++ floats.
+AC_CXX_FLOAT_BINARY_FORMAT
+
+# Detect the binary format used by C++ doubles.
+AC_CXX_DOUBLE_BINARY_FORMAT
+
+# Detect the binary format used by C++ long doubles.
+AC_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+# Test if some floating-point type is supported.
+if test $ac_supported_float = 1 \
+|| test $ac_supported_double = 1 \
+|| test $ac_supported_long_double = 1
+then
+ supported_some_floating_point_type=yes
+fi
+AM_CONDITIONAL(SUPPORTED_SOME_FLOATING_POINT_TYPE,
+ test x$supported_some_floating_point_type = xyes)
+
+# Check whether the C++ compiler supports zero-length arrays.
+AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+# Check whether the IEEE inexact flag is supported in C++.
+AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+AC_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+# Checks for header files.
+AC_CHECK_HEADERS([fenv.h ieeefp.h getopt.h signal.h string.h strings.h sys/resource.h sys/time.h sys/types.h unistd.h])
+
+# Checks for the availability of C library functions in C++.
+AC_CHECK_DECLS([ffs],
+ ,
+ ,
+ [
+#if defined(HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(HAVE_STRING_H)
+# include <string.h>
+#endif
+ ])
+AC_CHECK_DECLS([getenv,strtof,strtod,strtold,strtoll,strtoull], , , [#include <cstdlib>])
+AC_CHECK_DECLS([fma,fmaf,fmal,rintf,rintl], , , [#include <cmath>])
+
+# Checks for the availability of "fast" integral types.
+AC_CHECK_TYPES([int_fast16_t,int_fast32_t,int_fast64_t,uint_fast16_t,uint_fast32_t,uint_fast64_t])
+
+# Make sure uintptr_t is defined to an unsigned integer type wide enough
+# to hold a pointer, if such a type exists.
+AC_TYPE_UINTPTR_T
+
+
+# Checks on the GMP library.
+
+AC_CHECK_GMP
+if test x"$have_gmp" = xno
+then
+ AC_MSG_ERROR([Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+else
+ if test x"$have_gmpxx" = xno
+ then
+ AC_MSG_ERROR([GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+ fi
+fi
+
+AC_CHECK_MEMBERS([__mpz_struct._mp_alloc,
+ __mpz_struct._mp_size,
+ __mpz_struct._mp_d],
+ ,
+ gmp_has_changes=yes,
+ [#include <gmp.h>])
+
+if test x"$gmp_has_changed" = xyes
+then
+ AC_MSG_ERROR([GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP. You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it.])
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_include_options}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_options}"
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_lcdd program])
+AC_ARG_ENABLE(ppl_lcdd,
+ AS_HELP_STRING([--enable-ppl_lcdd], [build the ppl_lcdd program]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_lcdd, needs yes or no])
+ ;;
+esac
+build_ppl_lcdd=$enableval
+AM_CONDITIONAL(BUILD_PPL_LCDD, test x"$build_ppl_lcdd" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_lpsol program])
+AC_ARG_ENABLE(ppl_lpsol,
+ AS_HELP_STRING([--enable-ppl_lpsol], [build the ppl_lpsol program]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_lpsol, needs yes or no])
+ ;;
+esac
+build_ppl_lpsol=$enableval
+AM_CONDITIONAL(BUILD_PPL_LPSOL, test x"$build_ppl_lpsol" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_pips program])
+AC_ARG_ENABLE(ppl_pips,
+ AS_HELP_STRING([--enable-ppl_pips], [build the ppl_pips program]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_pips, needs yes or no])
+ ;;
+esac
+build_ppl_pips=$enableval
+AM_CONDITIONAL(BUILD_PPL_PIPS, test x"$build_ppl_pips" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the PPL documentation])
+AC_ARG_ENABLE(documentation,
+ AS_HELP_STRING([--enable-documentation], [build the PPL documentation]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-documentation, needs yes or no])
+ ;;
+esac
+build_documentation=$enableval
+AM_CONDITIONAL(BUILD_DOCUMENTATION, test x"$build_documentation" = xyes)
+
+# Define lists of available interfaces: lowercase and blank-separated.
+non_prolog_interfaces="cxx c ocaml java"
+prolog_interfaces="ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="${non_prolog_interfaces} ${prolog_interfaces}"
+
+# This is the list of interfaces that are enabled by default.
+default_interfaces=${non_prolog_interfaces}
+
+enableval=not_specified
+AC_MSG_CHECKING([which interfaces are enabled])
+AC_ARG_ENABLE(interfaces,
+ AS_HELP_STRING([--enable-interfaces=INTERFACES],
+ [enable some or all the library interfaces]))
+case x"${enableval}" in
+xyes | x)
+ AC_MSG_ERROR([--enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all])
+ ;;
+xnone | xno)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=no
+ done
+ AC_MSG_RESULT(none)
+ ;;
+xall)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=yes
+ done
+ AC_MSG_RESULT([${available_interfaces}])
+ ;;
+*)
+ if test x"${enableval}" = xnot_specified
+ then
+ enableval=${default_interfaces}
+ fi
+ # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+ required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[[ ,]][[ ,]]*/ /g' -e 's/c++/cxx/g' | tr '[[:upper:]]' '[[:lower:]]'`
+ # Check that the specified interfaces exist.
+ for interface in ${required_interfaces}
+ do
+ case " ${available_interfaces} " in
+ *\ ${interface}\ *)
+ ;;
+ *)
+ AC_MSG_ERROR([unknown interface ${interface}: must be one of ${available_interfaces}])
+ ;;
+ esac
+ done
+ # Initialize the enabled variable for each interface.
+ for interface in ${available_interfaces}
+ do
+ case " ${required_interfaces} " in
+ *\ ${interface}\ *)
+ eval ${interface}_interface_enabled=yes
+ enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+ ;;
+ *)
+ eval ${interface}_interface_enabled=no
+ ;;
+ esac
+ done
+ AC_MSG_RESULT([${enabled_interfaces}])
+ ;;
+esac
+
+if test x${cxx_interface_enabled} = xyes
+then
+ build_cxx_interface=yes
+fi
+AM_CONDITIONAL(BUILD_CXX_INTERFACE, test x$build_cxx_interface = xyes)
+
+if test x${c_interface_enabled} = xyes
+then
+ build_c_interface=yes
+fi
+AM_CONDITIONAL(BUILD_C_INTERFACE, test x$build_c_interface = xyes)
+
+# Checks for systems for which the interface is enabled.
+
+# Allow to specify the Java SDK installation directory.
+AC_ARG_WITH(java,
+ AS_HELP_STRING([--with-java=DIR], [use the Java SDK installed in DIR]),
+ java_dir=$with_java)
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+ if test "x$java_dir" = x
+ then
+ java_dir="/Library/Java/Home"
+ fi
+ ;;
+# On modern Fedora systems the JDK is usually in /usr/lib/jvm/java .
+linux*)
+ if test "x$java_dir" = x
+ then
+ java_dir="/usr/lib/jvm/java"
+ fi
+ ;;
+*)
+ ;;
+esac
+
+if test "x$java_dir" != x
+then
+ JAVAPREFIX="${java_dir}/bin"
+fi
+
+# Checks for Java.
+if test x${java_interface_enabled} = xyes
+then
+ # Check for Java programs. Order here is important: check first
+ # for the compiler.
+ AC_PROG_JAVAC
+ AC_PROG_JAVA
+ AC_PROG_JAR
+ AC_PROG_JAVAH
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $JNIFLAGS"
+ AC_LANG_PUSH(C++)
+ AC_MSG_CHECKING([whether jlong can contain data pointers])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <jni.h>
+
+ int
+ main() {
+ if (sizeof(jlong) >= sizeof(void*))
+ return 0;
+ else
+ return 1;
+ }
+ ]])],
+ ac_jlong_can_contain_pointers=yes
+ AC_MSG_RESULT(yes),
+ ac_jlong_can_contain_pointers=no
+ AC_MSG_RESULT(no),
+ ac_jlong_can_contain_pointers=no
+ AC_MSG_RESULT([assuming it cannot]))
+ AC_LANG_POP(C++)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+# In order to build the Java interface, it must be enabled and all the
+# Java tools must be available.
+if test x${java_interface_enabled} = xyes \
+&& test "x$JAVA" != xno \
+&& test "x$ac_cv_javac_supports_enums" != xno \
+&& test "x$JAR" != xno \
+&& test "x$JAVAH" != xno \
+&& test x${ac_jlong_can_contain_pointers} = xyes
+then
+ build_java_interface=yes
+fi
+AM_CONDITIONAL(BUILD_JAVA_INTERFACE, test x$build_java_interface = xyes)
+
+
+# Allow to specify the ML GMP installation directory.
+AC_ARG_WITH(mlgmp,
+ AS_HELP_STRING([--with-mlgmp=DIR],
+ [use the ML GMP package installed in DIR]),
+ mlgmp_dir=$with_mlgmp,
+ mlgmp_dir=+gmp)
+
+# Checks for OCaml.
+if test x${ocaml_interface_enabled} = xyes
+then
+ # Detect which tools of the OCaml toolchain are available.
+ AC_PROG_OCAML
+ if test x"$OCAMLC" != xno
+ then
+ # Check for the bytecode version of ML GMP.
+ AC_MSG_CHECKING([for ML GMP bytecode module gmp.cma])
+ if ( test ${mlgmp_dir} = +gmp && test -f ${OCAMLLIB}/gmp/gmp.cma ) \
+ || test -f ${mlgmp_dir}/gmp.cma;
+ then
+ AC_MSG_RESULT(yes)
+ ocamlc_gmp="yes"
+ else
+ AC_MSG_RESULT(no)
+ ocamlc_gmp="no"
+ fi
+ if test x"$OCAMLOPT" != xno
+ then
+ ocamlopt_root=`${OCAMLOPT} -where`
+ # Check for the native version of ML GMP.
+ AC_MSG_CHECKING([for ML GMP native module gmp.cmxa])
+ if ( test ${mlgmp_dir} = +gmp && test -f ${ocamlopt_root}/gmp/gmp.cmxa ) \
+ || test -f ${mlgmp_dir}/gmp.cmxa;
+ then
+ AC_MSG_RESULT(yes)
+ ocamlopt_gmp="yes"
+ else
+ AC_MSG_RESULT(no)
+ ocamlopt_gmp="no"
+ fi
+ fi
+ fi
+fi
+AM_CONDITIONAL(HAVE_OCAMLC, test x$ocamlc_gmp = xyes)
+AM_CONDITIONAL(HAVE_OCAMLOPT, test x$ocamlopt_gmp = xyes)
+
+if test x${ocaml_interface_enabled} = xyes \
+&& (test x$ocamlc_gmp = xyes || test x$ocamlopt_gmp = xyes)
+then
+ build_ocaml_interface=yes
+fi
+AM_CONDITIONAL(BUILD_OCAML_INTERFACE, test x$build_ocaml_interface = xyes)
+
+# Checks for Ciao Prolog.
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_CIAO_PROLOG
+fi
+
+if test x${ciao_prolog_interface_enabled} = xyes \
+&& test x$have_ciao_prolog = xyes
+then
+ build_ciao_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE,
+ test x$build_ciao_prolog_interface = xyes)
+
+# Checks for GNU Prolog.
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_PROG(GNU_PROLOG, gprolog, gprolog)
+ if test x"$GNU_PROLOG" = xgprolog
+ then
+ AC_CHECK_HEADER(gprolog.h,
+ [],
+ GNU_PROLOG="")
+ fi
+fi
+
+if test x${gnu_prolog_interface_enabled} = xyes \
+&& test x$GNU_PROLOG = xgprolog
+then
+ build_gnu_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_GNU_PROLOG_INTERFACE,
+ test x$build_gnu_prolog_interface = xyes)
+
+# Checks for SICStus.
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_SICSTUS_PROLOG
+fi
+
+if test x${sicstus_prolog_interface_enabled} = xyes \
+&& test x$have_sicstus_prolog = xyes
+then
+ build_sicstus_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_SICSTUS_PROLOG_INTERFACE,
+ test x$build_sicstus_prolog_interface = xyes)
+
+# Checks for SWI-Prolog.
+if test x${swi_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_SWI_PROLOG
+fi
+
+# Under Cygwin, SWI-Prolog does not work with foreign code:
+# see http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007838.html
+if test x${swi_prolog_interface_enabled} = xyes \
+&& test x$have_swi_prolog = xyes \
+&& test x"${host_os}" != xcygwin
+then
+ build_swi_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_SWI_PROLOG_INTERFACE,
+ test x$build_swi_prolog_interface = xyes)
+
+# Checks for XSB.
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_XSB_PROLOG
+fi
+
+if test x${xsb_prolog_interface_enabled} = xyes \
+&& test x$have_xsb_prolog = xyes
+then
+ build_xsb_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_XSB_PROLOG_INTERFACE,
+ test x$build_xsb_prolog_interface = xyes)
+
+# Checks for YAP.
+if test x${yap_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_YAP_PROLOG
+fi
+
+if test x${yap_prolog_interface_enabled} = xyes \
+&& test x$have_yap_prolog = xyes
+then
+ build_yap_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE,
+ test x$build_yap_prolog_interface = xyes)
+
+# Test if some Prolog interfaces have to be built.
+if test x$build_ciao_prolog_interface = xyes \
+|| test x$build_gnu_prolog_interface = xyes \
+|| test x$build_sicstus_prolog_interface = xyes \
+|| test x$build_swi_prolog_interface = xyes \
+|| test x$build_xsb_prolog_interface = xyes \
+|| test x$build_yap_prolog_interface = xyes
+then
+ build_some_prolog_interfaces=yes
+fi
+AM_CONDITIONAL(BUILD_SOME_PROLOG_INTERFACES,
+ test x$build_some_prolog_interfaces = xyes)
+
+if test x$build_c_interface = xyes \
+|| test x$build_java_interface = xyes \
+|| test x$build_ocaml_interface = xyes \
+|| test x$build_some_prolog_interfaces = xyes
+then
+ # Look for a recent enough version of GNU M4.
+ AC_PROG_GNU_M4
+fi
+
+# Define the list of instantiations that are enabled by default.
+# Different instantiations are separated by a '@' character.
+di=" Polyhedron @ Grid"
+di="${di} @ Rational_Box"
+di="${di} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+di="${di} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+di="${di} @ Constraints_Product<C_Polyhedron, Grid>"
+di="${di} @ Pointset_Powerset<C_Polyhedron>"
+di="${di} @ Pointset_Powerset<NNC_Polyhedron>"
+if test $ac_supported_double = 1
+then
+ di="${di} @ Double_Box @ BD_Shape<double> @ Octagonal_Shape<double>"
+fi
+default_instantiations="${di}"
+
+# Define the list of all instantiations.
+# Different instantiations are separated by a '@' character.
+ai=" Int8_Box @ Int16_Box @ Int32_Box @ Int64_Box"
+ai="${ai} @ Uint8_Box @ Uint16_Box @ Uint32_Box @ Uint64_Box"
+ai="${ai} @ Z_Box @ Rational_Box"
+ai="${ai} @ BD_Shape<int8_t> @ BD_Shape<int16_t>"
+ai="${ai} @ BD_Shape<int32_t> @ BD_Shape<int64_t>"
+ai="${ai} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+ai="${ai} @ Octagonal_Shape<int8_t> @ Octagonal_Shape<int16_t>"
+ai="${ai} @ Octagonal_Shape<int32_t> @ Octagonal_Shape<int64_t>"
+ai="${ai} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+ai="${ai} @ Polyhedron @ Grid"
+ai="${ai} @ Pointset_Powerset<Int8_Box> @ Pointset_Powerset<Int16_Box>"
+ai="${ai} @ Pointset_Powerset<Int32_Box> @ Pointset_Powerset<Int64_Box>"
+ai="${ai} @ Pointset_Powerset<Uint8_Box> @ Pointset_Powerset<Uint16_Box>"
+ai="${ai} @ Pointset_Powerset<Uint32_Box> @ Pointset_Powerset<Uint64_Box>"
+ai="${ai} @ Pointset_Powerset<Rational_Box> @ Pointset_Powerset<Z_Box>"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<C_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<NNC_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<Grid>"
+ai="${ai} @ Constraints_Product<C_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<NNC_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<Grid, C_Polyhedron>"
+ai="${ai} @ Constraints_Product<Grid, NNC_Polyhedron>"
+if test $ac_supported_float = 1
+then
+ ai="${ai} @ Float_Box @ BD_Shape<float>"
+ ai="${ai} @ Octagonal_Shape<float>"
+ ai="${ai} @ Pointset_Powerset<Float_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<float> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<float> >"
+fi
+if test $ac_supported_double = 1
+then
+ ai="${ai} @ Double_Box @ BD_Shape<double>"
+ ai="${ai} @ Octagonal_Shape<double>"
+ ai="${ai} @ Pointset_Powerset<Double_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<double> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<double> >"
+fi
+if test $ac_supported_long_double = 1
+then
+ ai="${ai} @ Long_Double_Box @ BD_Shape<long double>"
+ ai="${ai} @ Octagonal_Shape<long double>"
+ ai="${ai} @ Pointset_Powerset<Long_Double_Box>"
+ ai="${ai} @ Pointset_Powerset<BD_Shape<long double> >"
+ ai="${ai} @ Pointset_Powerset<Octagonal_Shape<long double> >"
+fi
+available_instantiations=${ai}
+
+enableval=not_specified
+AC_MSG_CHECKING([which instantiations are enabled])
+AC_ARG_ENABLE(instantiations,
+ AS_HELP_STRING([--enable-instantiations=INSTANTIATIONS],
+ [enable instantiations for the non-C++ interfaces]))
+case x"${enableval}" in
+xyes | x)
+ ai_one_per_line=`echo "${available_instantiations}" | sed -e 's/ *@ */\n/g' -e 's/ *\([[A-Z]]\)/\1/g'`
+ AC_MSG_ERROR([
+--enable-instantiations needs at least one argument chosen among none,
+all, and an @-separated list of instantiation specifiers included
+in the following list:
+${ai_one_per_line}])
+ ;;
+xno | xnone)
+ enableval=
+ AC_MSG_RESULT(none)
+ ;;
+*)
+ if test x"${enableval}" = xnot_specified
+ then
+ enableval=${default_instantiations}
+ elif test x"${enableval}" = xall
+ then
+ enableval=${available_instantiations}
+ fi
+ # Avoid extra blanks.
+ required_instantiations=`echo "${enableval}" | sed -e 's/[[ ]][[ ]]*/ /g' -e 's/[[ ]]*\([[@<>,]]\)/\1/g' -e 's/\([[@<>,]]\)[[ ]]*/\1/g' -e 's/>>/> >/g' -e 's/^[[ ]]//g' -e 's/[[ ]]$//g'`
+ # Check the specified instantiations for validity.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -I${srcdir} ${gmp_include_options}"
+ old_IFS="${IFS}"
+ IFS=@
+ set -- ${required_instantiations}
+ IFS="${old_IFS}"
+ for instantiation
+ do
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include "instchk.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+bool valid = ${instantiation}::valid_instantiation();
+]])],
+ valid_instantiation=yes,
+ valid_instantiation=no)
+ if test x${valid_instantiation} != xyes
+ then
+ AC_MSG_ERROR([invalid instantiation ${instantiation}])
+ fi
+ done
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[[< ,]]/_/g'`
+
+ required_instantiations_c_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_c_cxx_objects=`echo "${required_instantiations_c_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_c_\1.lo/g'`
+ required_instantiations_c_cxx_sources=`echo "${required_instantiations_c_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+ required_instantiations_c_cxx_headers=`echo "${required_instantiations_c_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+ required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_prolog_\1.lo/g'`
+ required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+ required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+ required_instantiations_prolog_generated_test_sources=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.pl /g' -e 's/$/.pl/g' | sed -e 's/\([[^. ]]*\)\.pl/ppl_prolog_generated_test_\1.pl/g'`
+
+ required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[[a-zA-Z0-9_]]*/&@&_Iterator/g'`
+ required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+ required_instantiations_java_classes=`echo "${required_instantiations_java_sources}" | sed -e 's/\.java/.class/g'`
+ required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\)\.java/parma_polyhedra_library.\1/g'`
+ required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\)\.java/parma_polyhedra_library_\1.h/g'`
+ required_instantiations_java_cxx_objects=`echo "${required_instantiations_canonical_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_java_\1.lo/g'`
+ required_instantiations_java_cxx_sources=`echo "${required_instantiations_java_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+
+ required_instantiations_ocaml_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+ required_instantiations_ocaml_cxx_objects=`echo "${required_instantiations_ocaml_source_names}" | sed -e 's/@/.o /g' -e 's/$/.o/g' | sed -e 's/\([[^. ]]*\)\.o/ppl_ocaml_\1.o/g'`
+ required_instantiations_ocaml_cxx_sources=`echo "${required_instantiations_ocaml_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.o/\1.cc/g'`
+ required_instantiations_ocaml_cxx_headers=`echo "${required_instantiations_ocaml_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+ AC_MSG_RESULT([${required_instantiations}])
+ ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether tests should be run under Valgrind])
+AC_ARG_ENABLE(valgrind-tests,
+ AS_HELP_STRING([--enable-valgrind-tests],
+ [run library tests under Valgrind]))
+case "${enableval}" in
+yes)
+ AC_CHECK_PROG(VALGRIND, valgrind, valgrind)
+ if test x"$VALGRIND" = xvalgrind
+ then
+ AC_MSG_RESULT(yes)
+ enable_valgrind_tests=yes
+ else
+ AC_MSG_ERROR([bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind])
+ fi
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ enable_valgrind_tests=no
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-valgrind-tests, needs yes or no])
+ ;;
+esac
+AM_CONDITIONAL(VALGRIND_TESTS_ENABLED, test x"$enable_valgrind_tests" = xyes)
+
+enableval=quick
+AC_MSG_CHECKING([whether `make check' does a thorough or quick check])
+AC_ARG_ENABLE(check,
+ AS_HELP_STRING([--enable-check=KIND],
+ [select thorough or quick `make check']))
+case "${enableval}" in
+thorough)
+ AC_MSG_RESULT(thorough)
+ ;;
+quick)
+ AC_MSG_RESULT(quick)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-check, needs thorough or quick])
+ ;;
+esac
+AM_CONDITIONAL(THOROUGH_MAKE_CHECK, test x"$enableval" = xthorough)
+
+# Libtool.
+LT_PREREQ([1.5.24])
+LT_INIT([dlopen,win32-dll])
+AM_CONDITIONAL(ENABLE_SHARED, test x"$enable_shared" = xyes)
+AM_CONDITIONAL(ENABLE_STATIC, test x"$enable_static" = xyes)
+
+# Checks for md5sum.
+AC_CHECK_PROG(MD5SUM, md5sum, md5sum)
+AM_CONDITIONAL(HAVE_MD5SUM, test x$MD5SUM = xmd5sum)
+if test x$MD5SUM = xmd5sum
+then
+ AC_TEXT_MD5SUM
+fi
+
+# Check for the GLPK library.
+AC_LANG_PUSH(C)
+AC_CHECK_HEADERS([glpk.h glpk/glpk.h], have_glpk=yes)
+AM_CONDITIONAL(HAVE_GLPK, test x$have_glpk = xyes)
+if test x$have_glpk = xyes
+then
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS -lglpk"
+ AC_CHECK_DECL(lib_set_print_hook,
+ AC_DEFINE(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK,
+ 1,
+ [Defined if GLPK provides lib_set_print_hook().]),
+ ,
+ [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+ ])
+ AC_CHECK_FUNC(_glp_lib_print_hook,
+ AC_DEFINE(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK,
+ 1,
+ [Defined if GLPK provides _glp_lib_print_hook().]))
+ AC_CHECK_DECL(glp_term_out,
+ AC_DEFINE(PPL_GLPK_HAS_GLP_TERM_OUT,
+ 1,
+ [Defined if GLPK provides glp_term_out().]),
+ ,
+ [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+ ])
+ AC_CHECK_DECL(glp_term_hook,
+ AC_DEFINE(PPL_GLPK_HAS_GLP_TERM_HOOK,
+ 1,
+ [Defined if GLPK provides glp_term_hook().]),
+ ,
+ [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+ ])
+ LIBS="$ac_save_LIBS"
+fi
+AC_LANG_POP(C)
+
+# Checks for header declarations.
+AC_CHECK_DECLS([RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS],
+ ,
+ ,
+ [
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+ ])
+
+AC_CHECK_DECLS([getrusage, setrlimit],
+ ,
+ ,
+ [
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+])
+
+AC_CHECK_DECLS([setitimer], [], [], [[
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+]])
+
+AC_CHECK_DECLS([sigaction], , , [#include <csignal>])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_CHECK_TYPES([timeval])
+AC_CHECK_TYPES([siginfo_t], [], [], [[
+#include <signal.h>
+]])
+
+# Check whether we can limit memory in C and C++ using setrlimit().
+AC_CXX_SUPPORTS_LIMITING_MEMORY
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
+if test x"$GCC" = xyes
+then
+ if test x"$ICC" = xyes
+ then
+ CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+ else
+ CFLAGS="$CFLAGS -W -Wall"
+ fi
+fi
+if test x"$GXX" = xyes
+then
+ if test x"$ICPC" = xyes
+ then
+ CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+ else
+ CXXFLAGS="$CXXFLAGS -W -Wall"
+ fi
+fi
+
+
+AC_SUBST(LIBEXT, [$libext])
+AC_SUBST(SHREXT, [$shrext_cmds])
+AC_SUBST(extra_includes)
+AC_SUBST(extra_libraries)
+AC_SUBST(debug_flag)
+AC_SUBST(coefficient_mnemonic)
+AC_SUBST(required_instantiations)
+AC_SUBST(required_instantiations_canonical_names)
+AC_SUBST(required_instantiations_c_cxx_headers)
+AC_SUBST(required_instantiations_c_cxx_sources)
+AC_SUBST(required_instantiations_c_cxx_objects)
+AC_SUBST(required_instantiations_prolog_cxx_headers)
+AC_SUBST(required_instantiations_prolog_cxx_sources)
+AC_SUBST(required_instantiations_prolog_cxx_objects)
+AC_SUBST(required_instantiations_prolog_generated_test_sources)
+AC_SUBST(required_instantiations_java_sources)
+AC_SUBST(required_instantiations_java_classes)
+AC_SUBST(required_instantiations_java_cxx_headers)
+# FIXME: rename headers_sources into sources.
+AC_SUBST(required_instantiations_java_cxx_headers_sources)
+AC_SUBST(required_instantiations_java_cxx_sources)
+AC_SUBST(required_instantiations_java_cxx_objects)
+AC_SUBST(required_instantiations_ocaml_cxx_headers)
+AC_SUBST(required_instantiations_ocaml_cxx_sources)
+AC_SUBST(required_instantiations_ocaml_cxx_objects)
+AC_SUBST(mlgmp_dir)
+
+AC_CONFIG_FILES(Makefile
+ ppl.lsm
+ src/Makefile
+ src/version.hh
+ src/ppl-config.cc
+ tests/Makefile
+ tests/BD_Shape/Makefile
+ tests/Box/Makefile
+ tests/Concrete_Expression/Makefile
+ tests/CO_Tree/Makefile
+ tests/Grid/Makefile
+ tests/MIP_Problem/Makefile
+ tests/Octagonal_Shape/Makefile
+ tests/Partially_Reduced_Product/Makefile
+ tests/PIP_Problem/Makefile
+ tests/Polyhedron/Makefile
+ tests/Powerset/Makefile
+ tests/Watchdog/Makefile
+ utils/Makefile
+ m4/Makefile
+ demos/Makefile
+ demos/ppl_lcdd/Makefile
+ demos/ppl_lcdd/examples/Makefile
+ demos/ppl_lpsol/Makefile
+ demos/ppl_lpsol/examples/Makefile
+ demos/ppl_pips/Makefile
+ demos/ppl_pips/examples/Makefile
+ doc/Makefile
+ doc/user.doxyconf-latex
+ doc/devref.doxyconf-latex
+ doc/user.doxyconf-html
+ doc/devref.doxyconf-html
+ doc/user-language-interface.doxyconf
+ doc/devref-language-interface.doxyconf
+ interfaces/Makefile
+ interfaces/C/Makefile
+ interfaces/C/ppl_c_version.h
+ interfaces/C/tests/Makefile
+ interfaces/Java/Makefile
+ interfaces/Java/jni/Makefile
+ interfaces/Java/tests/Makefile
+ interfaces/Java/parma_polyhedra_library/Makefile
+ interfaces/OCaml/Makefile
+ interfaces/OCaml/tests/Makefile
+ interfaces/Prolog/Makefile
+ interfaces/Prolog/Ciao/Makefile
+ interfaces/Prolog/GNU/Makefile
+ interfaces/Prolog/SICStus/Makefile
+ interfaces/Prolog/SWI/Makefile
+ interfaces/Prolog/XSB/Makefile
+ interfaces/Prolog/YAP/Makefile
+ interfaces/Prolog/tests/Makefile
+ )
+# tests/Ask_Tell/Makefile
+AC_OUTPUT
+
+if test x"$gmp_supports_exceptions" = xno
+then
+ AC_MSG_WARN([CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL. Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** `-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local])
+fi
+
+if test x"$PERL" = xno
+then
+ AC_MSG_WARN([PERL UNAVAILABLE:
+*** CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system. This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy. If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information.])
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+ AC_MSG_WARN([USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients. This means that arithmetic overflows will be possible
+*** and will not be detected. The consequence of that is that nothing
+*** can be said about the behavior of the library: whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build. Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved. Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+*** computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+*** cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+*** trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead.])
+fi
diff --git a/demos/Makefile.am b/demos/Makefile.am
new file mode 100644
index 0000000..646b0dd
--- /dev/null
+++ b/demos/Makefile.am
@@ -0,0 +1,36 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_PPL_LCDD
+PPL_LCDD_SUBDIR = ppl_lcdd
+endif BUILD_PPL_LCDD
+
+if BUILD_PPL_LPSOL
+PPL_LPSOL_SUBDIR = ppl_lpsol
+endif BUILD_PPL_LPSOL
+
+if BUILD_PPL_PIPS
+PPL_PIPS_SUBDIR = ppl_pips
+endif BUILD_PPL_PIPS
+
+SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_SUBDIR) $(PPL_PIPS_SUBDIR)
diff --git a/demos/Makefile.in b/demos/Makefile.in
new file mode 100644
index 0000000..fa9d62a
--- /dev/null
+++ b/demos/Makefile.in
@@ -0,0 +1,728 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = ppl_lcdd ppl_lpsol ppl_pips
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_PPL_LCDD_TRUE@PPL_LCDD_SUBDIR = ppl_lcdd
+ at BUILD_PPL_LPSOL_TRUE@PPL_LPSOL_SUBDIR = ppl_lpsol
+ at BUILD_PPL_PIPS_TRUE@PPL_PIPS_SUBDIR = ppl_pips
+SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_SUBDIR) $(PPL_PIPS_SUBDIR)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/Makefile.am b/demos/ppl_lcdd/Makefile.am
new file mode 100644
index 0000000..2d2c462
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.am
@@ -0,0 +1,135 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_lcdd
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_lcdd.1
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+ $(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+ $(CXXLINK) polka_lcdd.o \
+ -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+
+polylib_lcdd.o: $(srcdir)/ppl_lcdd.cc
+ $(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+ $(CXXLINK) polylib_lcdd.o \
+ -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if HAVE_MD5SUM
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ccc6.ext \
+ccp6.ext \
+cut32_16.ext \
+cyclic16-10.ext \
+reg600-5_m.ext \
+cyclic17_8.ine \
+in6.ine \
+in7.ine \
+kq20_11_m.ine \
+mit31-20.ine \
+sampleh8.ine \
+trunc10.ine
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES = \
+cp7.ext \
+cyclic25_13.ext \
+prodst62.ext \
+cp6.ine \
+mit.ine \
+mit288-281.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+check-local: ppl_lcdd$(EXEEXT)
+ echo $(TOUGH_EXAMPLES) >tough_examples
+ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ export LC_ALL=C; \
+ for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ echo ppl_lcdd$(EXEEXT) $$path; \
+ ./ppl_lcdd$(EXEEXT) $$path | tr -d '\015' | $(TEXT_MD5SUM) \
+ >>obtained; \
+ done
+ diff obtained $(srcdir)/$(EXPECTED)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/demos/ppl_lcdd/Makefile.in b/demos/ppl_lcdd/Makefile.in
new file mode 100644
index 0000000..f40e738
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.in
@@ -0,0 +1,1027 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_lcdd$(EXEEXT)
+subdir = demos/ppl_lcdd
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_lcdd_OBJECTS = ppl_lcdd.$(OBJEXT)
+ppl_lcdd_OBJECTS = $(am_ppl_lcdd_OBJECTS)
+ppl_lcdd_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ $(top_builddir)/utils/libppl_utils.a
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ppl_lcdd_SOURCES)
+DIST_SOURCES = $(ppl_lcdd_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_lcdd.1
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccc6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccp6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cut32_16.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic16-10.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at reg600-5_m.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic17_8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in6.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in7.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at kq20_11_m.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at mit31-20.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at sampleh8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at trunc10.ine
+
+ at ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \
+ at HAVE_MD5SUM_TRUE@cp7.ext \
+ at HAVE_MD5SUM_TRUE@cyclic25_13.ext \
+ at HAVE_MD5SUM_TRUE@prodst62.ext \
+ at HAVE_MD5SUM_TRUE@cp6.ine \
+ at HAVE_MD5SUM_TRUE@mit.ine \
+ at HAVE_MD5SUM_TRUE@mit288-281.ine \
+ at HAVE_MD5SUM_TRUE@mit41-16.ine \
+ at HAVE_MD5SUM_TRUE@mit708-9.ine \
+ at HAVE_MD5SUM_TRUE@mit71-61.ine \
+ at HAVE_MD5SUM_TRUE@mit90-86.ine \
+ at HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+ at HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \
+ at HAVE_MD5SUM_TRUE@tough_examples \
+ at HAVE_MD5SUM_TRUE@obtained
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES) $(EXTRA_ppl_lcdd_DEPENDENCIES)
+ @rm -f ppl_lcdd$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lcdd.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(dist_man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ at HAVE_MD5SUM_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-local clean clean-binPROGRAMS clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-man1 install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+ $(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+ $(CXXLINK) polka_lcdd.o \
+ -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+polylib_lcdd.o: $(srcdir)/ppl_lcdd.cc
+ $(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+ $(CXXLINK) polylib_lcdd.o \
+ -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_lcdd$(EXEEXT)
+ at HAVE_MD5SUM_TRUE@ echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@ export LC_ALL=C; \
+ at HAVE_MD5SUM_TRUE@ for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+ at HAVE_MD5SUM_TRUE@ do \
+ at HAVE_MD5SUM_TRUE@ file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@ echo ppl_lcdd$(EXEEXT) $$path; \
+ at HAVE_MD5SUM_TRUE@ ./ppl_lcdd$(EXEEXT) $$path | tr -d '\015' | $(TEXT_MD5SUM) \
+ at HAVE_MD5SUM_TRUE@ >>obtained; \
+ at HAVE_MD5SUM_TRUE@ done
+ at HAVE_MD5SUM_TRUE@ diff obtained $(srcdir)/$(EXPECTED)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/1d.ine b/demos/ppl_lcdd/examples/1d.ine
new file mode 100644
index 0000000..e07de85
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1d.ine
@@ -0,0 +1,5 @@
+H-representation
+begin
+1 2 rational
+-1 1
+end
diff --git a/demos/ppl_lcdd/examples/1da.ine b/demos/ppl_lcdd/examples/1da.ine
new file mode 100644
index 0000000..b0c0534
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1da.ine
@@ -0,0 +1,6 @@
+H-representation
+begin
+2 2 rational
+-1 1
+0 1
+end
diff --git a/demos/ppl_lcdd/examples/Makefile.am b/demos/ppl_lcdd/examples/Makefile.am
new file mode 100644
index 0000000..8a516bf
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.am
@@ -0,0 +1,136 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
diff --git a/demos/ppl_lcdd/examples/Makefile.in b/demos/ppl_lcdd/examples/Makefile.in
new file mode 100644
index 0000000..30b5f1d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.in
@@ -0,0 +1,659 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lcdd/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/README b/demos/ppl_lcdd/examples/README
new file mode 100644
index 0000000..c1c4b14
--- /dev/null
+++ b/demos/ppl_lcdd/examples/README
@@ -0,0 +1,13 @@
+Most of the examples in this directory have been taken (sometimes with
+changes) from cddlib version 0.93c [1] and lrslib version 4.2 [2].
+The changes consisted in the removal of commands that are not
+implemented in `ppl_lcdd', the revision of some comments and, for some
+examples, in the conversion of floating point coefficients to integer
+or rational numbers. In this last case, the name of the example has
+been changed from, e.g., `file.ine' to `file_m.ine'.
+
+
+--------
+
+[1] http://www.cs.mcgill.ca/~fukuda/soft/cdd_home/cdd.html
+[2] http://cgm.cs.mcgill.ca/~avis/C/lrs.html
diff --git a/demos/ppl_lcdd/examples/allzero.ine b/demos/ppl_lcdd/examples/allzero.ine
new file mode 100644
index 0000000..9c9c353
--- /dev/null
+++ b/demos/ppl_lcdd/examples/allzero.ine
@@ -0,0 +1,11 @@
+H-representation
+begin
+ 6 4 integer
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc4.ext b/demos/ppl_lcdd/examples/ccc4.ext
new file mode 100644
index 0000000..8f98f5f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc4.ext
@@ -0,0 +1,14 @@
+* Complete cut cone on 4 vertices
+* The number of facets is 12.
+V-representation
+begin
+ 7 7 integer
+ 0 1 1 1 0 0 0
+ 0 0 1 1 1 1 0
+ 0 1 0 1 1 0 1
+ 0 1 1 0 0 1 1
+ 0 0 0 1 0 1 1
+ 0 0 1 0 1 0 1
+ 0 1 0 0 1 1 0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc5.ext b/demos/ppl_lcdd/examples/ccc5.ext
new file mode 100644
index 0000000..007cad2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc5.ext
@@ -0,0 +1,21 @@
+* Complete cut cone on 5 vertices
+* The number of facets is 40.
+V-representation
+begin
+ 15 11 integer
+0 1 1 1 1 0 0 0 0 0 0
+0 0 1 1 1 1 1 1 0 0 0
+0 1 0 1 1 1 0 0 1 1 0
+0 1 1 0 1 0 1 0 1 0 1
+0 1 1 1 0 0 0 1 0 1 1
+0 0 0 1 1 0 1 1 1 1 0
+0 0 1 0 1 1 0 1 1 0 1
+0 0 1 1 0 1 1 0 0 1 1
+0 1 0 0 1 1 1 0 0 1 1
+0 1 0 1 0 1 0 1 1 0 1
+0 1 1 0 0 0 1 1 1 1 0
+0 0 0 0 1 0 0 1 0 1 1
+0 0 0 1 0 0 1 0 1 0 1
+0 0 1 0 0 1 0 0 1 1 0
+0 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccc6.ext b/demos/ppl_lcdd/examples/ccc6.ext
new file mode 100644
index 0000000..08f4879
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc6.ext
@@ -0,0 +1,37 @@
+* Complete cut cone on 6 vertices
+* The number of facets is 210.
+V-representation
+begin
+ 31 16 integer
+0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp4.ext b/demos/ppl_lcdd/examples/ccp4.ext
new file mode 100644
index 0000000..0c3e44c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp4.ext
@@ -0,0 +1,14 @@
+* Input file for computing the facets of the complete cut polytope on 4 vertices
+* The number of facets is 16.
+V-representation
+begin
+ 8 7 integer
+ 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0
+ 1 0 1 1 1 1 0
+ 1 1 0 1 1 0 1
+ 1 1 1 0 0 1 1
+ 1 0 0 1 0 1 1
+ 1 0 1 0 1 0 1
+ 1 1 0 0 1 1 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp5.ext b/demos/ppl_lcdd/examples/ccp5.ext
new file mode 100644
index 0000000..bd56d93
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp5.ext
@@ -0,0 +1,22 @@
+* Input file for computing the facets of the complete cut polytope on 5 vertices
+* The number of facets is 56.
+V-representation
+begin
+ 16 11 integer
+1 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 0 0 0
+1 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 1 0 1 0 1 0 1
+1 1 1 1 0 0 0 1 0 1 1
+1 0 0 1 1 0 1 1 1 1 0
+1 0 1 0 1 1 0 1 1 0 1
+1 0 1 1 0 1 1 0 0 1 1
+1 1 0 0 1 1 1 0 0 1 1
+1 1 0 1 0 1 0 1 1 0 1
+1 1 1 0 0 0 1 1 1 1 0
+1 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 0 1 1 0
+1 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp6.ext b/demos/ppl_lcdd/examples/ccp6.ext
new file mode 100644
index 0000000..def0444
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp6.ext
@@ -0,0 +1,38 @@
+* Input file for computing the facets of the complete cut polytope on 6 vertices
+* The number of facets is 368.
+V-representation
+begin
+ 32 16 integer
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ext b/demos/ppl_lcdd/examples/cp4.ext
new file mode 100644
index 0000000..2de9fb7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ext
@@ -0,0 +1,12 @@
+V-representation
+begin
+8 7 integer
+1 0 0 0 0 0 0
+1 0 1 1 1 1 0
+1 0 0 1 0 1 1
+1 1 0 0 1 1 0
+1 1 1 1 0 0 0
+1 0 1 0 1 0 1
+1 1 1 0 0 1 1
+1 1 0 1 1 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ine b/demos/ppl_lcdd/examples/cp4.ine
new file mode 100644
index 0000000..0a2ec5e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 7 rational
+ 2 0 -1 -1 0 0 -1
+ 2 -1 -1 0 -1 0 0
+ 2 0 0 0 -1 -1 -1
+ 2 -1 0 -1 0 -1 0
+ 0 0 0 0 1 1 -1
+ 0 -1 0 1 0 1 0
+ 0 0 1 1 0 0 -1
+ 0 -1 1 0 1 0 0
+ 0 1 0 -1 0 1 0
+ 0 0 0 0 -1 1 1
+ 0 1 1 0 -1 0 0
+ 0 0 1 -1 0 0 1
+ 0 1 -1 0 1 0 0
+ 0 0 -1 1 0 0 1
+ 0 1 0 1 0 -1 0
+ 0 0 0 0 1 -1 1
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ext b/demos/ppl_lcdd/examples/cp5.ext
new file mode 100644
index 0000000..3aa967a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+ 16 11 integer
+1 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 0 0 0
+1 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 1 0 1 0 1 0 1
+1 1 1 1 0 0 0 1 0 1 1
+1 0 0 1 1 0 1 1 1 1 0
+1 0 1 0 1 1 0 1 1 0 1
+1 0 1 1 0 1 1 0 0 1 1
+1 1 0 0 1 1 1 0 0 1 1
+1 1 0 1 0 1 0 1 1 0 1
+1 1 1 0 0 0 1 1 1 1 0
+1 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 0 1 1 0
+1 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ine b/demos/ppl_lcdd/examples/cp5.ine
new file mode 100644
index 0000000..8b21e42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ine
@@ -0,0 +1,61 @@
+* 6 point cut polytope
+H-representation
+begin
+56 11 rational
+ 2 0 0 0 0 0 0 0 -1 -1 -1
+ 2 0 0 0 0 0 -1 -1 0 0 -1
+ 2 0 0 0 0 -1 0 -1 0 -1 0
+ 0 1 0 0 1 0 0 -1 0 0 0
+ 0 0 1 0 1 0 0 0 0 -1 0
+ 0 0 0 1 1 0 0 0 0 0 -1
+ 2 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 0 0 1 1 0 0 0 0 -1 0 0
+ 0 -1 1 0 0 1 0 0 0 0 0
+ 0 -1 1 1 1 1 1 1 -1 -1 -1
+ 0 0 0 0 0 1 1 0 -1 0 0
+ 0 0 0 0 0 1 0 -1 0 1 0
+ 0 0 1 0 -1 0 0 0 0 1 0
+ 2 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 2 -1 0 0 -1 0 0 -1 0 0 0
+ 0 -1 0 1 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 -1 0 0 1
+ 0 -1 1 1 -1 1 1 -1 -1 1 1
+ 0 0 0 1 -1 0 0 0 0 0 1
+ 2 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 0 1 0 1 0 0 -1 0 0 0 0
+ 0 0 0 0 0 1 0 1 0 -1 0
+ 0 0 0 0 0 1 -1 0 1 0 0
+ 0 1 -1 0 0 1 0 0 0 0 0
+ 0 1 -1 1 1 1 -1 -1 1 1 -1
+ 0 1 0 0 -1 0 0 1 0 0 0
+ 0 1 1 1 -1 -1 -1 1 -1 1 1
+ 2 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 2 0 -1 0 -1 0 0 0 0 -1 0
+ 0 0 -1 1 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 1 -1 1
+ 0 1 -1 1 -1 1 -1 1 1 -1 1
+ 0 1 1 0 0 -1 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 0 0 -1
+ 0 0 0 0 0 -1 1 0 1 0 0
+ 0 1 0 -1 0 0 1 0 0 0 0
+ 0 1 1 -1 1 -1 1 -1 1 -1 1
+ 2 0 0 -1 -1 0 0 0 0 0 -1
+ 0 0 1 -1 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 1 1 -1
+ 0 1 1 -1 -1 -1 1 1 1 1 -1
+ 2 0 0 0 0 -1 -1 0 -1 0 0
+ 2 -1 0 -1 0 0 -1 0 0 0 0
+ 0 -1 0 0 1 0 0 1 0 0 0
+ 0 0 0 -1 1 0 0 0 0 0 1
+ 2 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 0 0 0 0 0 0 -1 1 0 0 1
+ 0 -1 1 -1 1 1 -1 1 1 -1 1
+ 2 0 -1 -1 0 0 0 0 -1 0 0
+ 0 0 -1 0 1 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 -1 1 1
+ 0 1 -1 -1 1 1 1 -1 -1 1 1
+ 0 0 0 0 0 -1 0 1 0 1 0
+ 0 -1 -1 1 1 -1 1 1 1 1 -1
+ 2 -1 -1 0 0 -1 0 0 0 0 0
+ 6 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ext b/demos/ppl_lcdd/examples/cp6.ext
new file mode 100644
index 0000000..81b136e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ext
@@ -0,0 +1,37 @@
+* 6 point cut cone
+V-representation
+begin
+ 32 16 integer
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ine b/demos/ppl_lcdd/examples/cp6.ine
new file mode 100644
index 0000000..a26068e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ine
@@ -0,0 +1,373 @@
+* 6 point cut polytope
+H-representation
+begin
+368 16 integer
+ 2 0 1 1 1 1 0 0 0 0 -1 -1 -1 -1 -1 -1
+ 2 1 0 1 1 1 0 -1 -1 -1 0 0 0 -1 -1 -1
+ 2 1 1 0 1 1 -1 0 -1 -1 0 -1 -1 0 0 -1
+ 0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+ 0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+ 0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+ 0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+ 0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+ 0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+ 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+ 2 2 2 2 2 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+ 0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 -2 2 2 2 2 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 0 -2 1 1 1 1 2 2 2 2 -1 -1 -1 -1 -1 -1
+ 0 1 -1 2 -1 -1 1 -2 1 1 2 -1 -1 2 2 -1
+ 0 1 -1 -1 2 -1 1 1 -2 1 -1 2 -1 2 -1 2
+ 2 -2 1 1 -1 -1 2 2 -2 -2 -1 1 1 1 1 -1
+ 0 -1 2 1 -1 -1 2 1 -1 -1 -2 2 2 1 1 -1
+ 2 -2 1 -1 -1 1 2 -2 -2 2 1 1 -1 -1 1 1
+ 0 -1 2 -1 -1 1 2 -1 -1 1 2 2 -2 -1 1 1
+ 2 -1 2 1 1 1 2 1 1 1 -2 -2 -2 -1 -1 -1
+ 2 -2 1 -1 1 -1 2 -2 2 -2 1 -1 1 1 -1 1
+ 0 -1 2 -1 1 -1 2 -1 1 -1 2 -2 2 1 -1 1
+ 0 1 -1 -1 -1 2 1 1 1 -2 -1 -1 2 -1 2 2
+ 0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+ 0 -1 1 1 1 0 1 1 1 0 -1 -1 0 -1 0 0
+ 2 1 -2 -1 -1 1 2 1 1 -1 -2 -2 2 -1 1 1
+ 0 2 -1 -1 -1 1 2 2 2 -2 -1 -1 1 -1 1 1
+ 0 0 1 1 1 -1 0 0 0 0 -1 -1 1 -1 1 1
+ 0 -1 2 1 1 -1 2 1 1 -1 -2 -2 2 -1 1 1
+ 0 0 0 0 0 0 1 1 1 -1 -1 -1 1 -1 1 1
+ 0 1 2 -1 -1 -1 -2 1 1 1 2 2 2 -1 -1 -1
+ 2 -2 2 -2 2 -2 1 -1 1 -1 1 -1 1 1 -1 1
+ 2 -1 1 -1 1 -2 1 -1 1 -2 1 -1 2 1 -2 2
+ 0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+ 2 -1 2 -1 -1 -1 2 -1 -1 -1 2 2 2 -1 -1 -1
+ 6 -1 1 -1 -1 -2 1 -1 -1 -2 1 1 2 -1 -2 -2
+ 2 0 1 -1 -1 -1 0 0 0 0 1 1 1 -1 -1 -1
+ 2 -1 1 -1 0 -1 1 -1 0 -1 1 0 1 0 -1 0
+ 2 -1 1 0 -1 -1 1 0 -1 -1 0 1 1 0 0 -1
+ 2 0 0 0 0 0 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 2 1 -1 1 1 2 1 -1 -1 -2 1 1 2 -1 -2 -2
+ 0 -2 1 1 1 -1 2 2 2 -2 -1 -1 1 -1 1 1
+ 0 -1 1 0 1 -1 1 0 1 -1 0 -1 1 0 0 1
+ 0 -1 1 1 0 -1 1 1 0 -1 -1 0 1 0 1 0
+ 2 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+ 0 -1 0 1 1 -1 0 1 1 -1 0 0 0 -1 1 1
+ 0 -2 2 2 2 -2 1 1 1 -1 -1 -1 1 -1 1 1
+ 2 -2 -2 2 2 -2 -1 1 1 -1 1 1 -1 -1 1 1
+ 2 -1 -1 1 1 -2 -1 1 1 -2 1 1 -2 -1 2 2
+ 12 -1 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+ 0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+ 0 -1 1 1 0 1 1 1 0 1 -1 0 -1 0 -1 0
+ 2 1 -2 -1 1 -1 2 1 -1 1 -2 2 -2 1 -1 1
+ 0 2 -1 -1 1 -1 2 2 -2 2 -1 1 -1 1 -1 1
+ 0 0 1 1 -1 1 0 0 0 0 -1 1 -1 1 -1 1
+ 0 -1 2 1 -1 1 2 1 -1 1 -2 2 -2 1 -1 1
+ 0 0 0 0 0 0 1 1 -1 1 -1 1 -1 1 -1 1
+ 0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+ 0 1 -1 0 1 1 1 0 -1 -1 0 1 1 0 0 -1
+ 2 1 -1 -2 1 -1 1 2 -1 1 -2 1 -1 2 -2 1
+ 2 -2 -1 1 -1 1 -2 2 -2 2 1 -1 1 1 -1 1
+ 0 -1 -1 2 -1 1 -1 2 -1 1 2 -1 1 2 -2 1
+ 2 -1 1 2 1 1 1 2 1 1 -2 -1 -1 -2 -2 -1
+ 2 1 -1 1 2 1 1 -1 -2 -1 1 2 1 -2 -1 -2
+ 0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+ 0 1 -1 -1 1 0 1 1 -1 0 -1 1 0 1 0 0
+ 0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+ 0 1 0 -1 1 1 0 1 -1 -1 0 0 0 1 1 -1
+ 0 2 -1 -1 1 1 2 2 -2 -2 -1 1 1 1 1 -1
+ 2 1 1 -1 2 1 -1 1 -2 -1 1 -2 -1 2 1 -2
+ 0 1 -1 -1 2 1 1 1 -2 -1 -1 2 1 2 1 -2
+ 0 -1 1 2 -1 -1 1 2 -1 -1 -2 1 1 2 2 -1
+ 0 -1 1 1 -1 0 1 1 -1 0 -1 1 0 1 0 0
+ 0 -1 1 2 -1 1 1 2 -1 1 -2 1 -1 2 -2 1
+ 0 0 0 0 0 0 1 1 -1 -1 -1 1 1 1 1 -1
+ 2 -2 -1 1 1 -1 -2 2 2 -2 1 1 -1 -1 1 1
+ 0 -1 -1 2 1 -1 -1 2 1 -1 2 1 -1 -2 2 1
+ 0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+ 0 -2 1 1 -1 1 2 2 -2 2 -1 1 -1 1 -1 1
+ 0 -1 1 0 -1 1 1 0 -1 1 0 1 -1 0 0 1
+ 0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+ 0 1 -2 -1 1 1 2 1 -1 -1 -2 2 2 1 1 -1
+ 0 1 -1 -1 0 1 1 1 0 -1 -1 0 1 0 1 0
+ 2 -2 2 -2 -2 2 1 -1 -1 1 1 1 -1 -1 1 1
+ 2 -1 1 -1 -2 1 1 -1 -2 1 1 2 -1 -2 1 2
+ 2 1 -1 -2 -1 1 1 2 1 -1 -2 -1 1 -2 2 1
+ 6 -1 1 -1 -2 -1 1 -1 -2 -1 1 2 1 -2 -1 -2
+ 2 -1 1 -1 -1 0 1 -1 -1 0 1 1 0 -1 0 0
+ 0 1 -1 -2 1 1 1 2 -1 -1 -2 1 1 2 2 -1
+ 0 -1 1 2 1 -1 1 2 1 -1 -2 -1 1 -2 2 1
+ 6 -1 -1 1 -2 -1 -1 1 -2 -1 1 -2 -1 2 1 -2
+ 2 -1 -1 1 -1 0 -1 1 -1 0 1 -1 0 1 0 0
+ 2 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+ 0 -1 0 1 -1 1 0 1 -1 1 0 0 0 1 -1 1
+ 0 -2 2 2 -2 2 1 1 -1 1 -1 1 -1 1 -1 1
+ 2 -2 -2 2 -2 2 -1 1 -1 1 1 -1 1 1 -1 1
+ 2 -1 -1 1 -2 1 -1 1 -2 1 1 -2 1 2 -1 2
+ 12 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 0 1 -1 -1 1 2 1 1 -1 -2 -1 1 2 1 2 -2
+ 2 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+ 0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+ 0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+ 2 -1 -1 2 -1 -1 -1 2 -1 -1 2 -1 -1 2 2 -1
+ 6 -1 -1 1 -1 -2 -1 1 -1 -2 1 -1 -2 1 2 -2
+ 2 0 -1 1 -1 -1 0 0 0 0 1 -1 -1 1 1 -1
+ 2 -1 -1 1 0 -1 -1 1 0 -1 1 0 -1 0 1 0
+ 2 -1 0 1 -1 -1 0 1 -1 -1 0 0 0 1 1 -1
+ 2 0 0 0 0 0 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 2 1 1 -1 1 2 -1 1 -1 -2 1 -1 -2 1 2 -2
+ 0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+ 0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+ 0 -1 1 0 1 1 1 0 1 1 0 -1 -1 0 0 -1
+ 2 1 -2 1 -1 -1 2 -1 1 1 2 -2 -2 1 1 -1
+ 0 2 -1 1 -1 -1 2 -2 2 2 1 -1 -1 1 1 -1
+ 0 0 1 -1 1 1 0 0 0 0 1 -1 -1 1 1 -1
+ 0 -1 2 -1 1 1 2 -1 1 1 2 -2 -2 1 1 -1
+ 0 0 0 0 0 0 1 -1 1 1 1 -1 -1 1 1 -1
+ 0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+ 0 1 -1 1 0 1 1 -1 0 -1 1 0 1 0 -1 0
+ 2 1 -1 1 -2 -1 1 -1 2 1 1 -2 -1 2 1 -2
+ 2 -2 -1 -1 1 1 -2 -2 2 2 -1 1 1 1 1 -1
+ 0 -1 -1 -1 2 1 -1 -1 2 1 -1 2 1 2 1 -2
+ 2 -2 2 2 -2 -2 1 1 -1 -1 -1 1 1 1 1 -1
+ 2 1 -1 2 1 1 1 -2 -1 -1 2 1 1 -2 -2 -1
+ 2 1 2 -1 1 1 -2 1 -1 -1 2 -2 -2 1 1 -1
+ 2 -1 1 1 2 1 1 1 2 1 -1 -2 -1 -2 -1 -2
+ 2 2 -2 -2 2 -2 1 1 -1 1 -1 1 -1 1 -1 1
+ 2 -1 1 1 -1 -2 1 1 -1 -2 -1 1 2 1 2 -2
+ 2 1 -1 -1 1 -2 1 1 -1 2 -1 1 -2 1 -2 2
+ 0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+ 0 1 0 1 -1 1 0 -1 1 -1 0 0 0 1 -1 1
+ 0 2 -1 1 -1 1 2 -2 2 -2 1 -1 1 1 -1 1
+ 2 1 1 2 -1 1 -1 -2 1 -1 -2 1 -1 2 -2 1
+ 0 1 -1 2 -1 1 1 -2 1 -1 2 -1 1 2 -2 1
+ 0 -1 1 -1 2 -1 1 -1 2 -1 1 -2 1 2 -1 2
+ 0 -1 1 -1 1 0 1 -1 1 0 1 -1 0 1 0 0
+ 0 -1 1 -1 2 1 1 -1 2 1 1 -2 -1 2 1 -2
+ 0 0 0 0 0 0 1 -1 1 -1 1 -1 1 1 -1 1
+ 0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+ 0 1 -1 1 -1 0 1 -1 1 0 1 -1 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+ 0 1 -1 1 1 0 1 -1 -1 0 1 1 0 -1 0 0
+ 0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 2 -2 2 2 2 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 0 1 -2 1 1 1 2 -1 -1 -1 2 2 2 -1 -1 -1
+ 2 2 -1 1 1 1 2 -2 -2 -2 1 1 1 -1 -1 -1
+ 0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+ 0 1 1 1 1 -2 -1 -1 -1 2 -1 -1 2 -1 2 2
+ 0 2 2 2 2 -2 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 2 2 1 1 1 -1 -2 -2 -2 2 -1 -1 1 -1 1 1
+ 2 2 2 -2 -2 -2 -1 1 1 1 1 1 1 -1 -1 -1
+ 2 2 -1 -1 -1 -1 2 2 2 2 -1 -1 -1 -1 -1 -1
+ 6 1 -1 -1 -1 -2 1 1 1 2 -1 -1 -2 -1 -2 -2
+ 2 1 0 -1 -1 -1 0 1 1 1 0 0 0 -1 -1 -1
+ 2 1 1 -1 -1 -2 -1 1 1 2 1 1 2 -1 -2 -2
+ 2 1 -1 -1 0 -1 1 1 0 1 -1 0 -1 0 -1 0
+ 6 1 -1 -1 -2 -1 1 1 2 1 -1 -2 -1 -2 -1 -2
+ 2 1 -1 0 -1 -1 1 0 1 1 0 -1 -1 0 0 -1
+ 2 2 -2 2 -2 -2 1 -1 1 1 1 -1 -1 1 1 -1
+ 2 1 -1 1 -1 -2 1 -1 1 2 1 -1 -2 1 2 -2
+ 2 -1 -2 1 1 -1 -2 1 1 -1 2 2 -2 -1 1 1
+ 2 -1 1 1 -2 -1 1 1 -2 -1 -1 2 1 2 1 -2
+ 2 -1 1 1 1 2 1 1 1 2 -1 -1 -2 -1 -2 -2
+ 2 2 -2 -2 -2 2 1 1 1 -1 -1 -1 1 -1 1 1
+ 2 -1 1 -2 1 -1 1 -2 1 -1 2 -1 1 2 -2 1
+ 2 1 -1 -1 -1 0 1 1 1 0 -1 -1 0 -1 0 0
+ 2 0 0 0 0 0 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 0 1 -2 1 1 -1 2 -1 -1 1 2 2 -2 -1 1 1
+ 0 1 -1 0 1 -1 1 0 -1 1 0 1 -1 0 0 1
+ 0 1 -1 1 0 -1 1 -1 0 1 1 0 -1 0 1 0
+ 2 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+ 0 0 -1 1 1 -1 0 0 0 0 1 1 -1 -1 1 1
+ 0 2 -2 2 2 -2 1 -1 -1 1 1 1 -1 -1 1 1
+ 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+ 0 1 1 1 -1 0 -1 -1 1 0 -1 1 0 1 0 0
+ 0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+ 2 2 1 1 -1 1 -2 -2 2 -2 -1 1 -1 1 -1 1
+ 0 2 2 2 -2 2 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 0 1 1 1 -2 1 -1 -1 2 -1 -1 2 -1 2 -1 2
+ 0 1 1 1 -2 -1 -1 -1 2 1 -1 2 1 2 1 -2
+ 0 1 0 1 -1 -1 0 -1 1 1 0 0 0 1 1 -1
+ 0 1 1 0 -1 -1 -1 0 1 1 0 1 1 0 0 -1
+ 2 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+ 0 0 1 1 -1 -1 0 0 0 0 -1 1 1 1 1 -1
+ 0 2 2 2 -2 -2 -1 -1 1 1 -1 1 1 1 1 -1
+ 2 1 1 -1 -2 -1 -1 1 2 1 1 2 1 -2 -1 -2
+ 0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+ 2 1 1 2 1 -1 -1 -2 -1 1 -2 -1 1 -2 2 1
+ 0 1 0 1 1 -1 0 -1 -1 1 0 0 0 -1 1 1
+ 0 2 -1 1 1 -1 2 -2 -2 2 1 1 -1 -1 1 1
+ 0 1 -1 2 1 -1 1 -2 -1 1 2 1 -1 -2 2 1
+ 0 -1 1 -1 -1 2 1 -1 -1 2 1 1 -2 -1 2 2
+ 0 -2 1 -1 1 1 2 -2 2 2 1 -1 -1 1 1 -1
+ 0 -1 1 -1 0 1 1 -1 0 1 1 0 -1 0 1 0
+ 0 -1 1 -2 1 1 1 -2 1 1 2 -1 -1 2 2 -1
+ 0 -1 1 -1 1 2 1 -1 1 2 1 -1 -2 1 2 -2
+ 0 0 0 0 0 0 1 -1 -1 1 1 1 -1 -1 1 1
+ 0 1 -2 1 -1 1 2 -1 1 -1 2 -2 2 1 -1 1
+ 0 1 -1 0 -1 1 1 0 1 -1 0 -1 1 0 0 1
+ 0 0 0 0 0 0 -1 -1 1 1 -1 1 1 1 1 -1
+ 0 1 1 2 -1 -1 -1 -2 1 1 -2 1 1 2 2 -1
+ 2 -1 -2 1 -1 1 -2 1 -1 1 2 -2 2 1 -1 1
+ 0 -1 -1 -1 1 2 -1 -1 1 2 -1 1 2 1 2 -2
+ 2 1 -1 -1 -2 1 1 1 2 -1 -1 -2 1 -2 1 2
+ 2 -1 1 -2 -1 1 1 -2 -1 1 2 1 -1 -2 2 1
+ 2 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+ 0 0 -1 1 -1 1 0 0 0 0 1 -1 1 1 -1 1
+ 0 2 -2 2 -2 2 1 -1 1 -1 1 -1 1 1 -1 1
+ 2 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+ 0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+ 0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+ 0 -1 0 1 1 1 0 1 1 1 0 0 0 -1 -1 -1
+ 2 1 1 -2 -1 -1 -1 2 1 1 2 1 1 -2 -2 -1
+ 0 2 1 -1 -1 -1 -2 2 2 2 1 1 1 -1 -1 -1
+ 0 0 -1 1 1 1 0 0 0 0 1 1 1 -1 -1 -1
+ 0 -1 -1 2 1 1 -1 2 1 1 2 1 1 -2 -2 -1
+ 0 0 0 0 0 0 -1 1 1 1 1 1 1 -1 -1 -1
+ 0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+ 0 1 1 -1 0 1 -1 1 0 -1 1 0 -1 0 1 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+ 0 1 1 -1 -1 0 -1 1 1 0 1 1 0 -1 0 0
+ 0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+ 0 1 1 -1 1 0 -1 1 -1 0 1 -1 0 1 0 0
+ 0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+ 2 2 1 -1 1 1 -2 2 -2 -2 1 -1 -1 1 1 -1
+ 0 2 2 -2 2 2 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 0 1 1 -2 1 1 -1 2 -1 -1 2 -1 -1 2 2 -1
+ 0 1 1 -2 1 -1 -1 2 -1 1 2 -1 1 2 -2 1
+ 0 1 0 -1 1 -1 0 1 -1 1 0 0 0 1 -1 1
+ 0 1 1 -1 0 -1 -1 1 0 1 1 0 1 0 -1 0
+ 2 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+ 0 0 1 -1 1 -1 0 0 0 0 1 -1 1 1 -1 1
+ 0 2 2 -2 2 -2 -1 1 -1 1 1 -1 1 1 -1 1
+ 2 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+ 0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+ 2 1 1 1 1 0 -1 -1 -1 0 -1 -1 0 -1 0 0
+ 2 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+ 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+ 0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+ 2 -1 -1 -1 -1 2 -1 -1 -1 2 -1 -1 2 -1 2 2
+ 6 -1 -1 -1 -2 1 -1 -1 -2 1 -1 -2 1 -2 1 2
+ 2 0 -1 -1 -1 1 0 0 0 0 -1 -1 1 -1 1 1
+ 2 -1 -1 0 -1 1 -1 0 -1 1 0 -1 1 0 0 1
+ 2 -1 0 -1 -1 1 0 -1 -1 1 0 0 0 -1 1 1
+ 2 0 0 0 0 0 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 2 1 1 1 2 -1 -1 -1 -2 1 -1 -2 1 -2 1 2
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+ 0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+ 2 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+ 0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+ 2 1 2 1 1 -1 -2 -1 -1 1 -2 -2 2 -1 1 1
+ 0 1 1 0 1 -1 -1 0 -1 1 0 -1 1 0 0 1
+ 0 2 1 -1 1 -1 -2 2 -2 2 1 -1 1 1 -1 1
+ 0 1 2 -1 1 -1 -2 1 -1 1 2 -2 2 1 -1 1
+ 0 1 1 1 0 -1 -1 -1 0 1 -1 0 1 0 1 0
+ 0 2 1 1 -1 -1 -2 -2 2 2 -1 1 1 1 1 -1
+ 0 1 1 1 -1 -2 -1 -1 1 2 -1 1 2 1 2 -2
+ 0 1 2 1 -1 -1 -2 -1 1 1 -2 2 2 1 1 -1
+ 0 1 1 -1 1 -2 -1 1 -1 2 1 -1 2 1 -2 2
+ 0 -2 -1 1 1 1 -2 2 2 2 1 1 1 -1 -1 -1
+ 0 -1 -1 1 0 1 -1 1 0 1 1 0 1 0 -1 0
+ 0 -1 -2 1 1 1 -2 1 1 1 2 2 2 -1 -1 -1
+ 0 -1 -1 1 1 2 -1 1 1 2 1 1 2 -1 -2 -2
+ 0 -1 -1 1 -1 2 -1 1 -1 2 1 -1 2 1 -2 2
+ 0 1 1 -2 -1 1 -1 2 1 -1 2 1 -1 -2 2 1
+ 0 1 0 -1 -1 1 0 1 1 -1 0 0 0 -1 1 1
+ 2 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+ 0 0 1 -1 -1 1 0 0 0 0 1 1 -1 -1 1 1
+ 0 2 2 -2 -2 2 -1 1 1 -1 1 1 -1 -1 1 1
+ 0 0 0 0 0 0 -1 1 -1 1 1 -1 1 1 -1 1
+ 0 1 1 -1 2 -1 -1 1 -2 1 1 -2 1 2 -1 2
+ 6 1 -1 -2 -1 -1 1 2 1 1 -2 -1 -1 -2 -2 -1
+ 2 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+ 6 1 1 1 2 1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 2 1 1 1 0 1 -1 -1 0 -1 -1 0 -1 0 -1 0
+ 2 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+ 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+ 0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+ 2 -1 -1 -1 2 -1 -1 -1 2 -1 -1 2 -1 2 -1 2
+ 6 -1 -1 -1 1 -2 -1 -1 1 -2 -1 1 -2 1 -2 2
+ 2 0 -1 -1 1 -1 0 0 0 0 -1 1 -1 1 -1 1
+ 2 -1 -1 0 1 -1 -1 0 1 -1 0 1 -1 0 0 1
+ 2 -1 0 -1 1 -1 0 -1 1 -1 0 0 0 1 -1 1
+ 2 0 0 0 0 0 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 2 1 1 1 -1 2 -1 -1 1 -2 -1 1 -2 1 -2 2
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+ 0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+ 2 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+ 0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+ 0 1 1 0 -1 1 -1 0 1 -1 0 1 -1 0 0 1
+ 0 2 1 -1 -1 1 -2 2 2 -2 1 1 -1 -1 1 1
+ 2 1 2 1 -1 1 -2 -1 1 -1 -2 2 -2 1 -1 1
+ 0 1 2 -1 -1 1 -2 1 1 -1 2 2 -2 -1 1 1
+ 0 -1 -1 1 1 0 -1 1 1 0 1 1 0 -1 0 0
+ 0 -1 -1 1 2 1 -1 1 2 1 1 2 1 -2 -1 -2
+ 0 -1 -1 1 2 -1 -1 1 2 -1 1 2 -1 -2 1 2
+ 0 0 0 0 0 0 -1 1 1 -1 1 1 -1 -1 1 1
+ 2 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+ 6 1 1 2 1 1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 0 1 -1 1 1 -2 1 -1 -1 2 1 1 -2 -1 2 2
+ 0 -1 1 1 -2 1 1 1 -2 1 -1 2 -1 2 -1 2
+ 6 -1 -1 -2 -1 1 -1 -2 -1 1 -2 -1 1 -2 2 1
+ 2 -1 -1 -1 0 1 -1 -1 0 1 -1 0 1 0 1 0
+ 0 -1 1 1 -1 2 1 1 -1 2 -1 1 -2 1 -2 2
+ 0 1 -1 1 2 -1 1 -1 -2 1 1 2 -1 -2 1 2
+ 0 1 -1 1 -2 1 1 -1 2 -1 1 -2 1 2 -1 2
+ 0 -1 1 1 1 -2 1 1 1 -2 -1 -1 2 -1 2 2
+ 0 -1 1 1 2 -1 1 1 2 -1 -1 -2 1 -2 1 2
+ 6 -1 -1 -2 1 -1 -1 -2 1 -1 -2 1 -1 2 -2 1
+ 2 -1 -1 -1 1 0 -1 -1 1 0 -1 1 0 1 0 0
+ 2 -2 -2 -2 2 2 -1 -1 1 1 -1 1 1 1 1 -1
+ 0 -2 2 -2 2 2 1 -1 1 1 1 -1 -1 1 1 -1
+ 0 -1 0 -1 1 1 0 -1 1 1 0 0 0 1 1 -1
+ 2 -1 -1 -2 1 1 -1 -2 1 1 -2 1 1 2 2 -1
+ 2 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+ 12 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 12 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 6 -1 1 -2 -1 -1 1 -2 -1 -1 2 1 1 -2 -2 -1
+ 6 -1 0 -1 -1 -1 0 -1 -1 -1 0 0 0 -1 -1 -1
+ 6 -2 1 -1 -1 -1 2 -2 -2 -2 1 1 1 -1 -1 -1
+ 0 1 -1 1 -1 2 1 -1 1 -2 1 -1 2 1 -2 2
+ 0 2 -2 -2 2 2 1 1 -1 -1 -1 1 1 1 1 -1
+ 0 0 -1 -1 1 1 0 0 0 0 -1 1 1 1 1 -1
+ 2 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+ 0 1 1 -1 -2 1 -1 1 2 -1 1 2 -1 -2 1 2
+ 0 -2 -2 2 2 2 -1 1 1 1 1 1 1 -1 -1 -1
+ 0 -1 -1 0 1 1 -1 0 1 1 0 1 1 0 0 -1
+ 2 -1 -2 -1 1 1 -2 -1 1 1 -2 2 2 1 1 -1
+ 0 1 1 -1 -1 2 -1 1 1 -2 1 1 -2 -1 2 2
+ 6 1 2 1 1 1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6 2 -2 -2 -2 -2 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 6 2 1 1 1 1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -2 2 -2 -2 -2 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 6 -2 -2 2 -2 -2 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 2 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+ 12 -1 -2 -1 -1 -1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6 -1 -2 1 -1 -1 -2 1 -1 -1 2 -2 -2 1 1 -1
+ 6 -1 -1 0 -1 -1 -1 0 -1 -1 0 -1 -1 0 0 -1
+ 6 -2 -1 1 -1 -1 -2 2 -2 -2 1 -1 -1 1 1 -1
+ 6 -1 -2 -1 1 -1 -2 -1 1 -1 -2 2 -2 1 -1 1
+ 6 -2 -2 -2 2 -2 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 6 -1 -1 -1 0 -1 -1 -1 0 -1 -1 0 -1 0 -1 0
+ 6 -2 -1 -1 1 -1 -2 -2 2 -2 -1 1 -1 1 -1 1
+ 12 -2 -1 -1 -1 -1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -1 -2 -1 -1 1 -2 -1 -1 1 -2 -2 2 -1 1 1
+ 6 -2 -2 -2 -2 2 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 6 -1 -1 -1 -1 0 -1 -1 -1 0 -1 -1 0 -1 0 0
+ 6 -2 -1 -1 -1 1 -2 -2 -2 2 -1 -1 1 -1 1 1
+ 6 0 -1 -1 -1 -1 0 0 0 0 -1 -1 -1 -1 -1 -1
+ 6 1 -2 -1 -1 -1 2 1 1 1 -2 -2 -2 -1 -1 -1
+ 6 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 2 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+ 6 1 1 1 1 2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+end
diff --git a/demos/ppl_lcdd/examples/cp7.ext b/demos/ppl_lcdd/examples/cp7.ext
new file mode 100644
index 0000000..390c068
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp7.ext
@@ -0,0 +1,70 @@
+* Complete Cut Polytope on 7 vertices
+* The number of facets is 116,764.
+V-representation
+begin
+ 64 22 integer
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1 0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1 0 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1 1 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1 1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cross10.ine b/demos/ppl_lcdd/examples/cross10.ine
new file mode 100644
index 0000000..ad45922
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross10.ine
@@ -0,0 +1,1030 @@
+* 10-dim cross polytope
+H-representation
+begin
+1024 11 integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross12.ine b/demos/ppl_lcdd/examples/cross12.ine
new file mode 100644
index 0000000..ce5b2fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross12.ine
@@ -0,0 +1,4102 @@
+* 12-dim cross polytope
+H-representation
+begin
+4096 13 integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross4.ine b/demos/ppl_lcdd/examples/cross4.ine
new file mode 100644
index 0000000..b716562
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 5 integer
+1 1 1 1 -1
+1 -1 -1 1 -1
+1 -1 1 -1 -1
+1 -1 1 1 -1
+1 1 -1 -1 1
+1 1 -1 1 1
+1 1 1 -1 1
+1 1 1 1 1
+1 -1 -1 -1 1
+1 -1 -1 1 1
+1 -1 1 -1 1
+1 -1 1 1 1
+1 1 -1 -1 -1
+1 1 -1 1 -1
+1 1 1 -1 -1
+1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross6.ine b/demos/ppl_lcdd/examples/cross6.ine
new file mode 100644
index 0000000..a4024b8
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross6.ine
@@ -0,0 +1,69 @@
+* 6-dim cross polytope
+H-representation
+begin
+64 7 integer
+ 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross8.ine b/demos/ppl_lcdd/examples/cross8.ine
new file mode 100644
index 0000000..b045ac5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross8.ine
@@ -0,0 +1,261 @@
+* 8-dim cross polytope
+H-representation
+begin
+256 9 integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ext b/demos/ppl_lcdd/examples/cube.ext
new file mode 100644
index 0000000..b55a875
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ext
@@ -0,0 +1,13 @@
+* cube
+V-representation
+begin
+8 4 rational
+ 1 1 1 1
+ 1 -1 1 1
+ 1 1 -1 1
+ 1 -1 -1 1
+ 1 1 1 -1
+ 1 -1 1 -1
+ 1 1 -1 -1
+ 1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ine b/demos/ppl_lcdd/examples/cube.ine
new file mode 100644
index 0000000..28301fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ine
@@ -0,0 +1,12 @@
+* cube of side 2 centred at origin
+H-representation
+linearity 1 1
+begin
+6 4 rational
+1 -1 0 0
+1 0 -1 0
+1 0 0 -1
+1 1 0 0
+1 0 1 0
+1 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cube10.ine b/demos/ppl_lcdd/examples/cube10.ine
new file mode 100644
index 0000000..7318f48
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube10.ine
@@ -0,0 +1,25 @@
+* 10-dim hypercube
+H-representation
+begin
+ 20 11 integer
+ 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0 0 0 0 0
+ 1 0 -1 0 0 0 0 0 0 0 0
+ 1 0 0 -1 0 0 0 0 0 0 0
+ 1 0 0 0 -1 0 0 0 0 0 0
+ 1 0 0 0 0 -1 0 0 0 0 0
+ 1 0 0 0 0 0 -1 0 0 0 0
+ 1 0 0 0 0 0 0 -1 0 0 0
+ 1 0 0 0 0 0 0 0 -1 0 0
+ 1 0 0 0 0 0 0 0 0 -1 0
+ 1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube12.ine b/demos/ppl_lcdd/examples/cube12.ine
new file mode 100644
index 0000000..4206e39
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube12.ine
@@ -0,0 +1,29 @@
+* 12-dim hypercube
+H-representation
+begin
+ 24 13 integer
+ 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 -1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 -1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 -1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 -1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 -1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 -1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 -1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 -1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 -1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 -1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube3.ine b/demos/ppl_lcdd/examples/cube3.ine
new file mode 100644
index 0000000..601dd13
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube3.ine
@@ -0,0 +1,11 @@
+* Hypercube of dimension 3
+H-representation
+begin
+ 6 4 integer
+ 1 1 0 0
+ 1 0 1 0
+ 1 0 0 1
+ 1 -1 0 0
+ 1 0 -1 0
+ 1 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube6.ine b/demos/ppl_lcdd/examples/cube6.ine
new file mode 100644
index 0000000..98b2553
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube6.ine
@@ -0,0 +1,17 @@
+* 6-dim hypercube
+H-representation
+begin
+ 12 7 integer
+ 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0
+ 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0
+ 1 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0
+ 1 0 -1 0 0 0 0
+ 1 0 0 -1 0 0 0
+ 1 0 0 0 -1 0 0
+ 1 0 0 0 0 -1 0
+ 1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube8.ine b/demos/ppl_lcdd/examples/cube8.ine
new file mode 100644
index 0000000..2028c83
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube8.ine
@@ -0,0 +1,21 @@
+* 8-dim hypercube
+H-representation
+begin
+ 16 9 integer
+ 1 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0 0 0
+ 1 0 -1 0 0 0 0 0 0
+ 1 0 0 -1 0 0 0 0 0
+ 1 0 0 0 -1 0 0 0 0
+ 1 0 0 0 0 -1 0 0 0
+ 1 0 0 0 0 0 -1 0 0
+ 1 0 0 0 0 0 0 -1 0
+ 1 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cubetop.ine b/demos/ppl_lcdd/examples/cubetop.ine
new file mode 100644
index 0000000..bc0b835
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubetop.ine
@@ -0,0 +1,12 @@
+* top facet of cube
+linearity 1 3
+H-representation
+begin
+6 4 integer
+ 1 -1 0 0
+ 1 0 -1 0
+ 1 0 0 -1
+ 0 1 0 0
+ 0 0 1 0
+ 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cubocta.ine b/demos/ppl_lcdd/examples/cubocta.ine
new file mode 100644
index 0000000..d467383
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubocta.ine
@@ -0,0 +1,19 @@
+* Cuboctahedron
+H-representation
+begin
+ 14 4 integer
+ 1 1 0 0
+ 1 0 1 0
+ 1 0 0 1
+ 1 -1 0 0
+ 1 0 -1 0
+ 1 0 0 -1
+ 2 1 1 1
+ 2 -1 1 1
+ 2 1 -1 1
+ 2 1 1 -1
+ 2 -1 -1 1
+ 2 1 -1 -1
+ 2 -1 1 -1
+ 2 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cut16_11.ext b/demos/ppl_lcdd/examples/cut16_11.ext
new file mode 100644
index 0000000..c7370ff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut16_11.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+16 11 integer
+1 1 1 -1 -1 -1 1 1 1 1 -1
+1 -1 -1 -1 1 -1 -1 1 -1 1 1
+1 -1 -1 1 -1 -1 1 -1 1 -1 1
+1 -1 1 -1 -1 1 -1 -1 1 1 -1
+1 1 -1 -1 -1 1 1 1 -1 -1 -1
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1 1 1 1 1 -1 -1 -1 -1 -1 -1
+1 -1 1 1 1 1 1 1 -1 -1 -1
+1 1 -1 1 1 1 -1 -1 1 1 -1
+1 1 1 -1 1 -1 1 -1 1 -1 1
+1 1 1 1 -1 -1 -1 1 -1 1 1
+1 -1 -1 1 1 -1 1 1 1 1 -1
+1 -1 1 -1 1 1 -1 1 1 -1 1
+1 -1 1 1 -1 1 1 -1 -1 1 1
+1 1 -1 -1 1 1 1 -1 -1 1 1
+1 1 -1 1 -1 1 -1 1 1 -1 1
+end
diff --git a/demos/ppl_lcdd/examples/cut32_16.ext b/demos/ppl_lcdd/examples/cut32_16.ext
new file mode 100644
index 0000000..5d68397
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut32_16.ext
@@ -0,0 +1,37 @@
+* 6 point cut polytope
+V-representation
+begin
+ 32 16 integer
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1 -1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+1 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+1 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+1 -1 -1 1 1 1 -1 1 1 1 1 1 1 -1 -1 -1
+1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1 1 1 -1
+1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 1
+1 -1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 1 -1
+1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1
+1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+1 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1
+1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 1 1 1 -1
+1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1
+1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1
+1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1 1
+1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+1 1 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cyc.ine b/demos/ppl_lcdd/examples/cyc.ine
new file mode 100644
index 0000000..9eeadd9
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyc.ine
@@ -0,0 +1,10 @@
+* cyclic polytope: 5 vertices in R^3
+V-representation
+begin
+5 4 integer
+1 1 1 1
+1 2 4 8
+1 3 9 27
+1 4 16 64
+1 5 25 125
+end
diff --git a/demos/ppl_lcdd/examples/cyclic10-4.ext b/demos/ppl_lcdd/examples/cyclic10-4.ext
new file mode 100644
index 0000000..84629a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic10-4.ext
@@ -0,0 +1,16 @@
+* 3-dim cyclic polytope with 10 vertices
+* Number of facets (outputs) =16
+V-representation
+begin
+10 4 integer
+ 1 1 1 1
+ 1 2 4 8
+ 1 3 9 27
+ 1 4 16 64
+ 1 5 25 125
+ 1 6 36 216
+ 1 7 49 343
+ 1 8 64 512
+ 1 9 81 729
+ 1 10 100 1000
+end
diff --git a/demos/ppl_lcdd/examples/cyclic12-6.ext b/demos/ppl_lcdd/examples/cyclic12-6.ext
new file mode 100644
index 0000000..4dfa2f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic12-6.ext
@@ -0,0 +1,18 @@
+* 5-dim cyclic polytope with12 vertices
+* Number of facets (outputs) =72
+V-representation
+begin
+12 6 integer
+ 1 1 1 1 1 1
+ 1 2 4 8 16 32
+ 1 3 9 27 81 243
+ 1 4 16 64 256 1024
+ 1 5 25 125 625 3125
+ 1 6 36 216 1296 7776
+ 1 7 49 343 2401 16807
+ 1 8 64 512 4096 32768
+ 1 9 81 729 6561 59049
+ 1 10 100 1000 10000 100000
+ 1 11 121 1331 14641 161051
+ 1 12 144 1728 20736 248832
+end
diff --git a/demos/ppl_lcdd/examples/cyclic14-8.ext b/demos/ppl_lcdd/examples/cyclic14-8.ext
new file mode 100644
index 0000000..df59976
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic14-8.ext
@@ -0,0 +1,20 @@
+* 7-dim cyclic polytope with 14 vertices
+* Number of facets (outputs) =240
+V-representation
+begin
+14 8 integer
+ 1 1 1 1 1 1 1 1
+ 1 2 4 8 16 32 64 128
+ 1 3 9 27 81 243 729 2187
+ 1 4 16 64 256 1024 4096 16384
+ 1 5 25 125 625 3125 15625 78125
+ 1 6 36 216 1296 7776 46656 279936
+ 1 7 49 343 2401 16807 117649 823543
+ 1 8 64 512 4096 32768 262144 2097152
+ 1 9 81 729 6561 59049 531441 4782969
+ 1 10 100 1000 10000 100000 1000000 10000000
+ 1 11 121 1331 14641 161051 1771561 19487171
+ 1 12 144 1728 20736 248832 2985984 35831808
+ 1 13 169 2197 28561 371293 4826809 62748517
+ 1 14 196 2744 38416 537824 7529536 105413504
+end
diff --git a/demos/ppl_lcdd/examples/cyclic16-10.ext b/demos/ppl_lcdd/examples/cyclic16-10.ext
new file mode 100644
index 0000000..c7d90da
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic16-10.ext
@@ -0,0 +1,23 @@
+* 9-dim cyclic polytope with 16 vertices
+* Number of facets (outputs) =660
+* This must be computed with exact arithmetic
+V-representation
+begin
+16 10 integer
+ 1 1 1 1 1 1 1 1 1 1
+ 1 2 4 8 16 32 64 128 256 512
+ 1 3 9 27 81 243 729 2187 6561 19683
+ 1 4 16 64 256 1024 4096 16384 65536 262144
+ 1 5 25 125 625 3125 15625 78125 390625 1953125
+ 1 6 36 216 1296 7776 46656 279936 1679616 10077696
+ 1 7 49 343 2401 16807 117649 823543 5764801 40353607
+ 1 8 64 512 4096 32768 262144 2097152 16777216 134217728
+ 1 9 81 729 6561 59049 531441 4782969 43046721 387420489
+ 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000
+ 1 11 121 1331 14641 161051 1771561 19487171 214358881 2357947691
+ 1 12 144 1728 20736 248832 2985984 35831808 429981696 5159780352
+ 1 13 169 2197 28561 371293 4826809 62748517 815730721 10604499373
+ 1 14 196 2744 38416 537824 7529536 105413504 1475789056 20661046784
+ 1 15 225 3375 50625 759375 11390625 170859375 2562890625 38443359375
+ 1 16 256 4096 65536 1048576 16777216 268435456 4294967296 68719476736
+end
diff --git a/demos/ppl_lcdd/examples/cyclic17_8.ine b/demos/ppl_lcdd/examples/cyclic17_8.ine
new file mode 100644
index 0000000..af885fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic17_8.ine
@@ -0,0 +1,20 @@
+begin
+17 9 integer
+1 -72 516 -4608 36156 -294912 2349516 -18874368 150850236
+1 -63 381 -3087 20901 -151263 1049061 -7411887 51738501
+1 -54 264 -1944 10956 -69984 410124 -2519424 14971836
+1 -45 165 -1125 4917 -28125 130845 -703125 3370917
+1 -36 84 -576 1596 -9216 27084 -147456 445116
+1 -27 21 -243 21 -2187 -3219 -19683 -85659
+1 -18 -24 -72 -564 -288 -9204 -1152 -142404
+1 -9 -51 -9 -699 -9 -9771 -9 -144699
+1 0 -60 0 -708 0 -9780 0 -144708
+1 9 -51 9 -699 9 -9771 9 -144699
+1 18 -24 72 -564 288 -9204 1152 -142404
+1 27 21 243 21 2187 -3219 19683 -85659
+1 36 84 576 1596 9216 27084 147456 445116
+1 45 165 1125 4917 28125 130845 703125 3370917
+1 54 264 1944 10956 69984 410124 2519424 14971836
+1 63 381 3087 20901 151263 1049061 7411887 51738501
+1 72 516 4608 36156 294912 2349516 18874368 150850236
+end
diff --git a/demos/ppl_lcdd/examples/cyclic25_13.ext b/demos/ppl_lcdd/examples/cyclic25_13.ext
new file mode 100644
index 0000000..fdd1448
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic25_13.ext
@@ -0,0 +1,54 @@
+H-representation
+begin
+25 13 integer
+1 -156 1690 -22464 265018 -3234816 38683450 -465813504
+5585476858 -67077144576 804783054010 -9659108818944 115904429355898
+1 -143 1391 -17303 185783 -2093663 22895951 -253333223
+2782380263 -30653319983 337043838911 -3709051717943 40794692425943
+1 -130 1118 -13000 125450 -1300000 12865658 -130000000
+1295714810 -13000000000 129857319098 -1300000000000 12995123528570
+1 -117 871 -9477 80743 -767637 6774391 -62178597 555322183
+-5036466357 45185516311 -407953774917 3666707502823
+1 -104 650 -6656 48698 -425984 3273530 -27262976 213818618
+-1744830464 13815962810 -111669149696 888476726138
+1 -91 455 -4459 26663 -218491 1395095 -10706059 70657223
+-524596891 3529497335 -25705247659 175060262183
+1 -78 286 -2808 12298 -101088 472186 -3639168 17549818
+-131010048 643379386 -4716361728 23421698938
+1 -65 143 -1625 3575 -40625 68783 -1015625 792935 -25390625
+ -15727777 -634765625 -1702643305
+1 -52 26 -832 -1222 -13312 -81094 -212992 -3433222 -3407872
+ -129049414 -54525952 -4658367622
+1 -39 -65 -351 -3497 -3159 -124865 -28431 -4199897 -255879
+-141913265 -2302911 -4869562697
+1 -26 -130 -104 -4342 -416 -133510 -1664 -4281862 -6656
+-142667590 -26624 -4876418182
+1 -13 -169 -13 -4537 -13 -134329 -13 -4285177 -13
+-142680889 -13 -4876471417
+1 0 -182 0 -4550 0 -134342 0 -4285190 0 -142680902 0
+-4876471430
+1 13 -169 13 -4537 13 -134329 13 -4285177 13 -142680889
+13 -4876471417
+1 26 -130 104 -4342 416 -133510 1664 -4281862 6656
+-142667590 26624 -4876418182
+1 39 -65 351 -3497 3159 -124865 28431 -4199897 255879
+-141913265 2302911 -4869562697
+1 52 26 832 -1222 13312 -81094 212992 -3433222 3407872
+-129049414 54525952 -4658367622
+1 65 143 1625 3575 40625 68783 1015625 792935 25390625
+-15727777 634765625 -1702643305
+1 78 286 2808 12298 101088 472186 3639168 17549818 131010048
+ 643379386 4716361728 23421698938
+1 91 455 4459 26663 218491 1395095 10706059 70657223
+524596891 3529497335 25705247659 175060262183
+1 104 650 6656 48698 425984 3273530 27262976 213818618
+1744830464 13815962810 111669149696 888476726138
+1 117 871 9477 80743 767637 6774391 62178597 555322183
+5036466357 45185516311 407953774917 3666707502823
+1 130 1118 13000 125450 1300000 12865658 130000000 1295714810
+ 13000000000 129857319098 1300000000000 12995123528570
+1 143 1391 17303 185783 2093663 22895951 253333223 2782380263
+ 30653319983 337043838911 3709051717943 40794692425943
+1 156 1690 22464 265018 3234816 38683450 465813504 5585476858
+ 67077144576 804783054010 9659108818944 115904429355898
+end
diff --git a/demos/ppl_lcdd/examples/dcube10.ext b/demos/ppl_lcdd/examples/dcube10.ext
new file mode 100644
index 0000000..67db319
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube10.ext
@@ -0,0 +1,24 @@
+V-representation
+begin
+20 11 rational
+1 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube12.ext b/demos/ppl_lcdd/examples/dcube12.ext
new file mode 100644
index 0000000..0e4b7f5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube12.ext
@@ -0,0 +1,28 @@
+V-representation
+begin
+24 13 rational
+1 0 0 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube3.ext b/demos/ppl_lcdd/examples/dcube3.ext
new file mode 100644
index 0000000..5702d28
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube3.ext
@@ -0,0 +1,10 @@
+V-representation
+begin
+6 4 rational
+1 0 0 1
+1 0 0 -1
+1 0 1 0
+1 0 -1 0
+1 1 0 0
+1 -1 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube6.ext b/demos/ppl_lcdd/examples/dcube6.ext
new file mode 100644
index 0000000..43861a0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube6.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 7 rational
+1 0 0 0 0 0 1
+1 0 0 0 0 0 -1
+1 0 0 0 0 1 0
+1 0 0 0 0 -1 0
+1 0 0 0 1 0 0
+1 0 0 0 -1 0 0
+1 0 0 1 0 0 0
+1 0 0 -1 0 0 0
+1 0 1 0 0 0 0
+1 0 -1 0 0 0 0
+1 1 0 0 0 0 0
+1 -1 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube8.ext b/demos/ppl_lcdd/examples/dcube8.ext
new file mode 100644
index 0000000..d151797
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube8.ext
@@ -0,0 +1,20 @@
+V-representation
+begin
+16 9 rational
+1 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 -1 0 0
+1 0 0 0 0 1 0 0 0
+1 0 0 0 0 -1 0 0 0
+1 0 0 0 1 0 0 0 0
+1 0 0 0 -1 0 0 0 0
+1 0 0 1 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0
+1 0 1 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/diamond.ine b/demos/ppl_lcdd/examples/diamond.ine
new file mode 100644
index 0000000..8522f1c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/diamond.ine
@@ -0,0 +1,10 @@
+* Unit diamond centred at origin
+* Last two inequalities define vertex (-1/2,0)
+begin
+4 3 rational
+1/2 -1 -1
+1/2 -1 1
+1/2 1 -1
+1/2 1 1
+end
+
diff --git a/demos/ppl_lcdd/examples/dodeca_m.ine b/demos/ppl_lcdd/examples/dodeca_m.ine
new file mode 100644
index 0000000..6599d78
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dodeca_m.ine
@@ -0,0 +1,17 @@
+* dodecahedron inequalities
+H-representation
+begin
+12 4 integer
+562949953421312 -562949953421312 0 -347922205179541
+562949953421312 -562949953421312 0 347922205179541
+562949953421312 -347922205179541 -562949953421312 0
+562949953421312 -347922205179541 562949953421312 0
+562949953421312 0 -347922205179541 -562949953421312
+562949953421312 0 -347922205179541 562949953421312
+562949953421312 0 347922205179541 -562949953421312
+562949953421312 0 347922205179541 562949953421312
+562949953421312 347922205179541 -562949953421312 0
+562949953421312 347922205179541 562949953421312 0
+562949953421312 562949953421312 0 -347922205179541
+562949953421312 562949953421312 0 347922205179541
+end
diff --git a/demos/ppl_lcdd/examples/ex1.ine b/demos/ppl_lcdd/examples/ex1.ine
new file mode 100644
index 0000000..790b897
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ex1.ine
@@ -0,0 +1,10 @@
+* 2 dimensional polyhedron with three vertices (0,3), (-1, 4) and (-1,10) and
+* two extremal rays (2,1) and (1,2).
+H-representation
+begin
+ 4 3 integer
+ 12 2 -1
+ -6 -1 2
+ -3 1 1
+ 1 1 0
+end
diff --git a/demos/ppl_lcdd/examples/grcubocta.ine b/demos/ppl_lcdd/examples/grcubocta.ine
new file mode 100644
index 0000000..9fd74c4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/grcubocta.ine
@@ -0,0 +1,31 @@
+* Great rhombicuboctahedron
+H-representation
+begin
+ 26 4 integer
+ 1 1 0 0
+ 1 0 1 0
+ 1 0 0 1
+ 1 -1 0 0
+ 1 0 -1 0
+ 1 0 0 -1
+ 2 1 1 1
+ 2 -1 1 1
+ 2 1 -1 1
+ 2 1 1 -1
+ 2 -1 -1 1
+ 2 1 -1 -1
+ 2 -1 1 -1
+ 2 -1 -1 -1
+ 5 3 3 0
+ 5 0 3 3
+ 5 3 0 3
+ 5 -3 3 0
+ 5 0 -3 3
+ 5 3 0 -3
+ 5 3 -3 0
+ 5 0 3 -3
+ 5 -3 0 3
+ 5 -3 -3 0
+ 5 0 -3 -3
+ 5 -3 0 -3
+end
diff --git a/demos/ppl_lcdd/examples/hexocta.ine b/demos/ppl_lcdd/examples/hexocta.ine
new file mode 100644
index 0000000..57ffede
--- /dev/null
+++ b/demos/ppl_lcdd/examples/hexocta.ine
@@ -0,0 +1,54 @@
+* Hexakis octahedron
+H-representation
+begin
+ 48 4 integer
+ 3 -3 1 -2
+ 3 -2 -1 -3
+ 3 -2 1 -3
+ 3 -3 -1 -2
+ 3 -2 3 -1
+ 3 -2 3 1
+ 3 -3 2 -1
+ 3 -3 2 1
+ 3 1 -3 2
+ 3 1 -2 3
+ 3 -1 -3 2
+ 3 -1 -2 3
+ 3 1 2 3
+ 3 1 3 2
+ 3 -1 2 3
+ 3 -1 3 2
+ 3 3 1 -2
+ 3 2 -1 -3
+ 3 3 -1 -2
+ 3 2 1 -3
+ 3 2 3 -1
+ 3 3 2 -1
+ 3 2 3 1
+ 3 3 2 1
+ 3 2 1 3
+ 3 3 -1 2
+ 3 2 -1 3
+ 3 3 1 2
+ 3 2 -3 1
+ 3 2 -3 -1
+ 3 3 -2 1
+ 3 3 -2 -1
+ 3 -1 3 -2
+ 3 -1 2 -3
+ 3 1 3 -2
+ 3 1 2 -3
+ 3 -1 -2 -3
+ 3 -1 -3 -2
+ 3 1 -2 -3
+ 3 1 -3 -2
+ 3 -3 -1 2
+ 3 -2 1 3
+ 3 -2 -1 3
+ 3 -3 1 2
+ 3 -2 -3 1
+ 3 -2 -3 -1
+ 3 -3 -2 1
+ 3 -3 -2 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/icododeca_m.ine b/demos/ppl_lcdd/examples/icododeca_m.ine
new file mode 100644
index 0000000..3f095ec
--- /dev/null
+++ b/demos/ppl_lcdd/examples/icododeca_m.ine
@@ -0,0 +1,39 @@
+* Icosidodecahedron
+% rational numbers appearing here are [approximations of]
+% -3-5^(1/2), -1-5^(1/2) and their negatives.
+H-representation
+begin
+32 4 integer
+2251799813685248 -11790576896177794 -7286977268807297 0
+2251799813685248 -11790576896177794 7286977268807297 0
+2251799813685248 -7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 -7286977268807297 0 -11790576896177794
+2251799813685248 -7286977268807297 0 11790576896177794
+2251799813685248 -7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 7286977268807297 7286977268807297
+1125899906842624 -5895288448088897 0 -2251799813685248
+1125899906842624 -5895288448088897 0 2251799813685248
+1125899906842624 -2251799813685248 -5895288448088897 0
+1125899906842624 -2251799813685248 5895288448088897 0
+2251799813685248 0 -11790576896177794 -7286977268807297
+2251799813685248 0 -11790576896177794 7286977268807297
+1125899906842624 0 -2251799813685248 -5895288448088897
+1125899906842624 0 -2251799813685248 5895288448088897
+1125899906842624 0 2251799813685248 -5895288448088897
+1125899906842624 0 2251799813685248 5895288448088897
+2251799813685248 0 11790576896177794 -7286977268807297
+2251799813685248 0 11790576896177794 7286977268807297
+1125899906842624 2251799813685248 -5895288448088897 0
+1125899906842624 2251799813685248 5895288448088897 0
+1125899906842624 5895288448088897 0 -2251799813685248
+1125899906842624 5895288448088897 0 2251799813685248
+2251799813685248 7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 7286977268807297 0 -11790576896177794
+2251799813685248 7286977268807297 0 11790576896177794
+2251799813685248 7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 7286977268807297 7286977268807297
+2251799813685248 11790576896177794 -7286977268807297 0
+2251799813685248 11790576896177794 7286977268807297 0
+end
diff --git a/demos/ppl_lcdd/examples/in0.ine b/demos/ppl_lcdd/examples/in0.ine
new file mode 100644
index 0000000..8c3d751
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in0.ine
@@ -0,0 +1,11 @@
+begin
+8 6 integer
+9 -2 -3 -3 -2 -2
+9 -2 0 0 2 0
+9 -2 -1 -1 -1 -3
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in1.ine b/demos/ppl_lcdd/examples/in1.ine
new file mode 100644
index 0000000..e231e52
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in1.ine
@@ -0,0 +1,37 @@
+begin
+34 5 integer
+1 -299 -534 815 807
+1 -887 -399 -867 -543
+1 683 632 958 -181
+1 -756 681 -658 470
+1 -99 135 -921 -825
+1 -795 -874 -286 732
+1 43 -567 588 -143
+1 -955 414 -159 -378
+1 -235 -695 947 166
+1 957 853 -194 -258
+1 487 -914 -100 -991
+1 -515 -786 -169 200
+1 954 -758 -178 985
+1 505 -970 400 -211
+1 714 997 401 661
+1 -475 618 459 775
+1 -219 704 -111 -876
+1 152 -390 -629 984
+1 -240 -621 -62 583
+1 -76 531 -606 -676
+1 490 -519 -240 -109
+1 -635 860 -798 825
+1 5 49 781 895
+1 495 490 -774 866
+1 -78 69 853 861
+1 -340 228 -374 498
+1 390 -12 -524 -408
+1 -382 -42 -376 264
+1 -299 -731 -283 -518
+1 892 -581 654 -439
+0 1 0 0 0
+0 0 1 0 0
+0 0 0 1 0
+0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in2.ine b/demos/ppl_lcdd/examples/in2.ine
new file mode 100644
index 0000000..cb49112
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in2.ine
@@ -0,0 +1,19 @@
+begin
+16 6 integer
+1 -1 0 -1 0 0
+1 -1 0 0 0 -1
+1 0 -1 -1 0 0
+1 0 -1 0 -1 0
+1 0 0 0 -1 -1
+0 -1 1 0 0 1
+0 1 -1 0 1 0
+0 0 0 -1 1 1
+0 0 1 1 -1 0
+0 1 0 1 0 -1
+2 -1 -1 -1 -1 -1
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in3.ine b/demos/ppl_lcdd/examples/in3.ine
new file mode 100644
index 0000000..a5db732
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in3.ine
@@ -0,0 +1,16 @@
+begin
+13 7 integer
+0 1 -1 0 1 0 0
+0 0 -1 1 0 0 1
+0 -1 1 0 1 0 0
+0 -1 0 1 0 1 0
+0 0 1 -1 0 0 1
+0 1 1 0 -1 0 0
+0 0 0 0 -1 1 1
+0 1 0 1 0 -1 0
+0 0 0 0 1 -1 1
+0 0 1 1 0 0 -1
+0 0 0 0 1 1 -1
+0 1 0 -1 0 1 0
+12 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/in4.ine b/demos/ppl_lcdd/examples/in4.ine
new file mode 100644
index 0000000..8c11b95
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in4.ine
@@ -0,0 +1,15 @@
+begin
+12 8 integer
+10 -8 -1 -2 -3 -3 -2 -2
+10 8 -2 -2 0 0 2 0
+10 -11 3 -2 -1 -1 -1 -3
+5 23 -4 -2 -3 0 0 1
+27 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0
+0 0 1 0 0 0 0 0
+0 0 0 1 0 0 0 0
+0 0 0 0 1 0 0 0
+0 0 0 0 0 1 0 0
+0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in5.ine b/demos/ppl_lcdd/examples/in5.ine
new file mode 100644
index 0000000..e429d0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in5.ine
@@ -0,0 +1,17 @@
+begin
+14 10 integer
+10 2 3 -8 -1 -2 -3 -3 -2 -2
+10 -6 33 8 -2 -2 0 0 2 0
+10 93 3 -11 3 -2 -1 -1 -1 -3
+5 -9 21 23 -4 -2 -3 0 0 1
+27 31 23 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in6.ine b/demos/ppl_lcdd/examples/in6.ine
new file mode 100644
index 0000000..faa493a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in6.ine
@@ -0,0 +1,26 @@
+begin
+23 11 integer
+1 1 1 1 1 1 1 1 1 1 0
+2 -2 -3 8 1 2 3 3 2 2 -9
+3 6 -3 -8 2 2 0 0 -2 0 -9
+4 -9 -3 1 -3 2 1 1 1 3 -9
+5 9 -2 -2 4 2 3 0 0 -1 -5
+6 -3 -2 -5 4 1 -3 -9 -1 2 -7
+7 -9 -3 -5 -2 2 4 -2 4 -1 -7
+8 -8 -4 5 -2 2 4 -2 4 -1 -7
+9 -7 -5 -5 -2 2 4 -2 4 -1 -7
+10 -6 -6 5 -2 2 4 -2 4 -1 -7
+11 -5 -7 -5 -2 2 4 -2 4 -1 -7
+12 -4 -8 5 -2 2 4 -2 4 -1 -7
+13 -3 -9 -5 -2 2 4 -2 4 -1 -7
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in7.ine b/demos/ppl_lcdd/examples/in7.ine
new file mode 100644
index 0000000..5e82762
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in7.ine
@@ -0,0 +1,23 @@
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/infeas.ine b/demos/ppl_lcdd/examples/infeas.ine
new file mode 100644
index 0000000..0f2a496
--- /dev/null
+++ b/demos/ppl_lcdd/examples/infeas.ine
@@ -0,0 +1,18 @@
+* The empty polytope. No vertices and rays.
+H-representation
+begin
+ 13 7 integer
+ 0 1 0 0 0 0 0
+ 0 0 1 0 0 0 0
+ 0 0 0 1 0 0 0
+ 0 0 0 0 1 0 0
+ 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0
+ 1 0 -1 0 0 0 0
+ 1 0 0 -1 0 0 0
+ 1 0 0 0 -1 0 0
+ 1 0 0 0 0 -1 0
+ 1 0 0 0 0 0 -1
+ -2 1 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/integralpoints.ine b/demos/ppl_lcdd/examples/integralpoints.ine
new file mode 100644
index 0000000..8f75e27
--- /dev/null
+++ b/demos/ppl_lcdd/examples/integralpoints.ine
@@ -0,0 +1,36 @@
+* This input file is an example for generating
+* integral solutions to the following system of linear inequalities:
+* 10 x1 + 7 x2 <= 70
+* 11 x1 + 5 x2 >= 55
+* x1 >= 0, x2 >= 0
+* By using the fact that 0<=x1<=7 and 0<=x2<=10, we apply
+* the (binary representation) substitution:
+ x1 = 4 x13 + 2 x12 + x11 (all binary variables)
+ x2 = 8 x24 + 4 x23 + 2 x22 + x21 (all binary variables)
+* The reduced system of linear inequalities is the input data.
+* Since all integral (i.e. 0-1) solutions are extreme points,
+* the integral extreme points are in one-to-one correspondence
+* with the integral solutions to the original system. In this
+* example, there are 194 extreme points among which 10 are
+* integral (0-1) solutions.
+
+H-representation
+begin
+ 16 8 integer
+ 0 1 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0
+ 0 0 0 1 0 0 0 0
+ 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 1
+ 1 -1 0 0 0 0 0 0
+ 1 0 -1 0 0 0 0 0
+ 1 0 0 -1 0 0 0 0
+ 1 0 0 0 -1 0 0 0
+ 1 0 0 0 0 -1 0 0
+ 1 0 0 0 0 0 -1 0
+ 1 0 0 0 0 0 0 -1
+ 70 -40 -20 -10 -56 -28 -14 -7
+ -55 44 22 11 40 20 10 5
+end
diff --git a/demos/ppl_lcdd/examples/irbox20-4.ext b/demos/ppl_lcdd/examples/irbox20-4.ext
new file mode 100644
index 0000000..8fba299
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox20-4.ext
@@ -0,0 +1,25 @@
+* Randomly generated 20 integral points in [-100..100]^3
+V-representation
+begin
+ 20 4 integer
+ 1 -45 1 47
+ 1 -34 19 4
+ 1 5 -11 28
+ 1 17 -43 17
+ 1 -46 8 -15
+ 1 35 -26 -6
+ 1 41 -3 -8
+ 1 -39 41 34
+ 1 -46 49 40
+ 1 -18 -29 46
+ 1 -20 -25 -2
+ 1 -22 -9 -32
+ 1 31 46 5
+ 1 10 14 11
+ 1 -22 17 -29
+ 1 12 3 -5
+ 1 -44 -5 40
+ 1 -2 4 32
+ 1 -18 8 31
+ 1 -27 40 -48
+end
diff --git a/demos/ppl_lcdd/examples/irbox200-4.ext b/demos/ppl_lcdd/examples/irbox200-4.ext
new file mode 100644
index 0000000..d218b33
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox200-4.ext
@@ -0,0 +1,205 @@
+* Randomly generated 200 integral points in [-100..100]^3
+V-representation
+begin
+ 200 4 integer
+ 1 12 -49 2
+ 1 -38 25 -3
+ 1 -26 39 -7
+ 1 -25 28 44
+ 1 -20 -41 -31
+ 1 49 45 28
+ 1 -42 12 -25
+ 1 -9 -31 -20
+ 1 49 5 33
+ 1 15 34 30
+ 1 -18 -3 31
+ 1 34 8 6
+ 1 -19 31 -4
+ 1 23 -44 -25
+ 1 17 -14 -16
+ 1 36 -14 -20
+ 1 15 -7 42
+ 1 39 33 -39
+ 1 -30 33 15
+ 1 -46 -1 0
+ 1 33 30 47
+ 1 14 14 5
+ 1 -28 45 -13
+ 1 17 18 -7
+ 1 41 -13 27
+ 1 -24 -27 -36
+ 1 5 37 5
+ 1 -2 27 -11
+ 1 7 47 -28
+ 1 -26 -49 20
+ 1 24 34 0
+ 1 21 0 -35
+ 1 -23 20 -39
+ 1 13 -12 28
+ 1 -44 -20 -35
+ 1 33 4 -12
+ 1 46 -39 -25
+ 1 2 7 -47
+ 1 41 -34 49
+ 1 -36 -11 -49
+ 1 33 -37 34
+ 1 -16 34 -15
+ 1 -1 -39 -45
+ 1 8 23 -8
+ 1 -12 29 21
+ 1 2 13 -23
+ 1 39 10 -13
+ 1 -36 -37 43
+ 1 -34 -46 -41
+ 1 -34 -32 -2
+ 1 -33 -49 10
+ 1 -48 -15 -5
+ 1 -14 33 4
+ 1 -10 -7 -21
+ 1 31 29 -42
+ 1 2 -18 21
+ 1 29 -29 -18
+ 1 -34 -15 -6
+ 1 -41 0 -2
+ 1 -32 16 14
+ 1 14 32 15
+ 1 -25 33 -49
+ 1 19 -31 33
+ 1 -26 8 -24
+ 1 2 -10 -44
+ 1 9 42 -12
+ 1 -19 21 8
+ 1 12 37 43
+ 1 -44 45 -6
+ 1 3 -36 -40
+ 1 -31 27 42
+ 1 33 -47 25
+ 1 33 21 43
+ 1 17 45 1
+ 1 43 -2 41
+ 1 49 -42 34
+ 1 -13 -11 5
+ 1 45 -49 -7
+ 1 38 -43 -11
+ 1 -18 10 2
+ 1 -8 28 -19
+ 1 -16 12 -17
+ 1 -40 -4 -45
+ 1 -46 -36 -49
+ 1 5 -43 -2
+ 1 -3 -44 5
+ 1 -18 -7 43
+ 1 36 -12 44
+ 1 -20 -24 -49
+ 1 18 7 10
+ 1 -29 48 -10
+ 1 0 -17 -48
+ 1 33 -8 -2
+ 1 37 -4 10
+ 1 38 -49 17
+ 1 -14 -2 22
+ 1 41 28 -35
+ 1 35 15 2
+ 1 29 44 27
+ 1 30 13 -15
+ 1 -8 33 -16
+ 1 30 -16 15
+ 1 31 -32 -42
+ 1 -20 -44 3
+ 1 39 43 3
+ 1 6 -20 -49
+ 1 -20 -29 29
+ 1 -5 -44 -5
+ 1 46 34 -11
+ 1 24 15 -48
+ 1 -41 -43 35
+ 1 -8 37 -30
+ 1 -42 19 -13
+ 1 -34 48 -8
+ 1 18 37 -15
+ 1 -27 -5 13
+ 1 -27 23 33
+ 1 -48 -32 39
+ 1 -3 -35 23
+ 1 34 38 -10
+ 1 36 47 -4
+ 1 22 -11 -17
+ 1 41 -3 -47
+ 1 -22 12 -49
+ 1 18 -18 37
+ 1 -46 3 -17
+ 1 17 26 -44
+ 1 1 28 -26
+ 1 -9 -25 -11
+ 1 -35 -40 -23
+ 1 3 46 -26
+ 1 49 18 12
+ 1 -18 9 -40
+ 1 -16 37 21
+ 1 -15 5 -46
+ 1 -27 9 6
+ 1 4 -23 -16
+ 1 10 27 -38
+ 1 34 -31 -14
+ 1 -27 -17 -4
+ 1 -1 35 -8
+ 1 22 34 -40
+ 1 -15 -33 19
+ 1 -5 0 6
+ 1 -33 34 -37
+ 1 -30 -43 21
+ 1 26 11 48
+ 1 -40 -28 26
+ 1 -29 -43 44
+ 1 6 -21 -23
+ 1 -48 27 -38
+ 1 -7 0 46
+ 1 2 34 -36
+ 1 -28 -21 13
+ 1 27 -5 -1
+ 1 39 14 5
+ 1 11 -9 -33
+ 1 9 0 -11
+ 1 -14 20 -5
+ 1 -20 -22 23
+ 1 6 -21 0
+ 1 18 21 49
+ 1 14 -25 34
+ 1 27 -4 -37
+ 1 -8 -26 7
+ 1 39 -36 -27
+ 1 -4 24 13
+ 1 11 -15 -36
+ 1 -49 20 33
+ 1 -4 49 -38
+ 1 -31 6 -10
+ 1 18 -25 -38
+ 1 18 39 -13
+ 1 2 17 32
+ 1 14 -41 -44
+ 1 -27 48 -31
+ 1 -5 -6 43
+ 1 -42 -44 -22
+ 1 -29 -44 48
+ 1 -45 1 47
+ 1 -34 19 4
+ 1 5 -11 28
+ 1 17 -43 17
+ 1 -46 8 -15
+ 1 35 -26 -6
+ 1 41 -3 -8
+ 1 -39 41 34
+ 1 -46 49 40
+ 1 -18 -29 46
+ 1 -20 -25 -2
+ 1 -22 -9 -32
+ 1 31 46 5
+ 1 10 14 11
+ 1 -22 17 -29
+ 1 12 3 -5
+ 1 -44 -5 40
+ 1 -2 4 32
+ 1 -18 8 31
+ 1 -27 40 -48
+ 1 -31 -29 -23
+end
diff --git a/demos/ppl_lcdd/examples/kkd18_4.ine b/demos/ppl_lcdd/examples/kkd18_4.ine
new file mode 100644
index 0000000..ad6b26b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd18_4.ine
@@ -0,0 +1,25 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+18 5 integer
+3976210973720 -5964591245895 -33802508475500 -161110322828670
+-745886931169976
+5 -10 -50 -220 -974
+5 -5 -35 -185 -899
+5 0 -10 -90 -574
+5 5 25 95 301
+5 10 70 400 2146
+5 15 125 855 5501
+5 20 190 1490 11026
+5 25 265 2335 19501
+5 30 350 3420 31826
+5 35 445 4775 49021
+5 40 550 6430 72226
+5 45 665 8415 102701
+5 50 790 10760 141826
+5 55 925 13495 191101
+5 60 1070 16650 252146
+5 65 1225 20255 326701
+-3976210973719 5964591245895 33802508475500 161110322828670
+745886931169976
+end
diff --git a/demos/ppl_lcdd/examples/kkd27_5.ine b/demos/ppl_lcdd/examples/kkd27_5.ine
new file mode 100644
index 0000000..7a8954c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd27_5.ine
@@ -0,0 +1,34 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+27 6 integer
+1172039901841798080 -1758060515119739835 -12306436783413558955
+-72080893223436992535 -406122552605284841587 -2275777153240670950215
+6 -15 -85 -435 -2269 -12195
+6 -9 -67 -393 -2179 -12009
+6 -3 -37 -279 -1789 -10743
+6 3 5 -57 -739 -6057
+6 9 59 309 1475 6549
+6 15 125 855 5501 34455
+6 21 203 1617 12131 88641
+6 27 293 2631 22301 184407
+6 33 395 3933 37091 342093
+6 39 509 5559 57725 587799
+6 45 635 7545 85571 954105
+6 51 773 9927 122141 1480791
+6 57 923 12741 169091 2215557
+6 63 1085 16023 228221 3214743
+6 69 1259 19809 301475 4544049
+6 75 1445 24135 390941 6279255
+6 81 1643 29037 498851 8506941
+6 87 1853 34551 627581 11325207
+6 93 2075 40713 779651 14844393
+6 99 2309 47559 957725 19187799
+6 105 2555 55125 1164611 24492405
+6 111 2813 63447 1403261 30909591
+6 117 3083 72561 1676771 38605857
+6 123 3365 82503 1988381 47763543
+6 129 3659 93309 2341475 58581549
+-1172039901841798079 1758060515119739835 12306436783413558955
+72080893223436992535 406122552605284841587 2275777153240670950215
+end
diff --git a/demos/ppl_lcdd/examples/kkd38_6.ine b/demos/ppl_lcdd/examples/kkd38_6.ine
new file mode 100644
index 0000000..4ea9b0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd38_6.ine
@@ -0,0 +1,49 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+38 7 integer
+2919394390774395218459334 -4379091595292464054287507
+-36492430237104184038520181 -253987324572060483286422939
+-1691789494531258045567157717 -11149182918946980113429731347
+-73511950112254277868261780941
+7 -21 -133 -777 -4669 -29001 -184813
+7 -14 -112 -728 -4564 -28784 -184372
+7 -7 -77 -595 -4109 -27307 -179717
+7 0 -28 -336 -2884 -21840 -156148
+7 7 35 91 -301 -7133 -75445
+7 14 112 728 4396 25424 141772
+7 21 203 1617 12131 88641 638723
+7 28 308 2800 23996 200368 1650188
+7 35 427 4319 41251 384335 3535267
+7 42 560 6216 65324 670992 6815180
+7 49 707 8533 97811 1098349 12216107
+7 56 868 11312 140476 1712816 20717068
+7 63 1043 14595 195251 2570043 33602843
+7 70 1232 18424 264236 3735760 52521932
+7 77 1435 22841 349699 5286617 79549555
+7 84 1652 27888 454076 7311024 117255692
+7 91 1883 33607 579971 9909991 168778163
+7 98 2128 40040 730156 13197968 237900748
+7 105 2387 47229 907571 17303685 329136347
+7 112 2660 55216 1115324 22370992 447815180
+7 119 2947 64043 1356691 28559699 600178027
+7 126 3248 73752 1635116 36046416 793474508
+7 133 3563 84385 1954211 45025393 1036066403
+7 140 3892 95984 2317756 55709360 1337536012
+7 147 4235 108591 2729699 68330367 1708799555
+7 154 4592 122248 3194156 83140624 2162225612
+7 161 4963 136997 3715411 100413341 2711758603
+7 168 5348 152880 4297916 120443568 3373047308
+7 175 5747 169939 4946291 143549035 4163578427
+7 182 6160 188216 5665324 170070992 5102815180
+7 189 6587 207753 6459971 200375049 6212340947
+7 196 7028 228592 7335356 234852016 7516007948
+7 203 7483 250775 8296771 273918743 9040090963
+7 210 7952 274344 9349676 318018960 10813446092
+7 217 8435 299341 10499699 367624117 12867674555
+7 224 8932 325808 11752636 423234224 15237291532
+-2919394390774395218459333 4379091595292464054287507
+36492430237104184038520181 253987324572060483286422939
+1691789494531258045567157717 11149182918946980113429731347
+73511950112254277868261780941
+end
diff --git a/demos/ppl_lcdd/examples/kq20_11_m.ine b/demos/ppl_lcdd/examples/kq20_11_m.ine
new file mode 100644
index 0000000..19a589d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kq20_11_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/metric40_11.ine b/demos/ppl_lcdd/examples/metric40_11.ine
new file mode 100644
index 0000000..2fec9a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric40_11.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 -1 1 0 1 0 0
+2 -1 -1 0 0 -1 0 0 0 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 -1 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 1 1 -1
+0 0 1 -1 0 0 0 0 1 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 1 -1 0 0 1 0 0 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 1 1 0 0 -1
+0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 0 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/metric80_16.ine b/demos/ppl_lcdd/examples/metric80_16.ine
new file mode 100644
index 0000000..065eae3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric80_16.ine
@@ -0,0 +1,86 @@
+* metric polytope on 6 points
+H-representation
+linearity 3 1 2 3
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+6 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+6 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+6 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+6 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+6 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+6 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+6 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+6 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+6 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+6 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+6 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+6 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+6 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+6 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+6 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+6 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+6 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+6 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+6 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+6 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit.ine b/demos/ppl_lcdd/examples/mit.ine
new file mode 100644
index 0000000..5d31d88
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit.ine
@@ -0,0 +1,732 @@
+begin
+729 9 integer
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+16 0 0 -1 -1 0 0 0 0
+192 -6 0 -8 12 -8 0 0 -4
+192 -6 0 -8 -4 -8 0 0 0
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+192 -6 0 -4 -8 -8 0 0 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+960 -30 -4 -32 -36 -40 4 2 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+64 -2 0 -4 0 0 0 0 0
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 1 1 -2 0 4 0 0 0
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 8 -20 12 32 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 0 24 -60 36 104 -4 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+960 -20 -12 -32 -56 -8 4 2 -4
+96 -1 -1 -4 -6 0 0 0 0
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+720 -23 -3 -25 -27 -30 3 2 -3
+624 -21 -1 -27 -17 -26 1 2 -1
+768 -26 0 -32 -20 -32 0 2 0
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 2 -4 4 8 0 0 0
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 6 8 -16 4 40 -4 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+64 -2 0 0 -4 0 0 0 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+192 -4 -2 -4 -12 0 0 0 0
+0 16 24 -52 12 120 -12 2 -12
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+2496 -36 -28 -96 -152 16 -8 2 -16
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+768 -10 -8 -28 -48 8 -4 0 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+2880 -60 -36 -96 -168 -16 8 6 -16
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit288-281.ine b/demos/ppl_lcdd/examples/mit288-281.ine
new file mode 100644
index 0000000..895a518
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit288-281.ine
@@ -0,0 +1,291 @@
+begin
+288 281 rational
+1 -3 0 10 -4 -8 8 4 -4 -4 4 4 2 4 8 -12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 -4 -4 -8 -4 -4 0 24 8 0 -4 -2 8 -2 0 -8 -1 -16 -10 -8 -4 -12 0 24 8 -12 2 4 -4 4 -8 12 0 -8 -8 16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 -24 0 8 0 0 4 -16 -8 -4 -8 16 12 8 -16 -16 16 16 8 16 -16 16 -16 8 4 -8 8 0 8 4 0 0 -12 -16 16 -8 -8 4 0 4 0 10 8 4 0 12 -4 4 -24 - [...]
+1 -5 0 12 -2 -4 0 4 -8 0 2 0 4 8 8 -8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 8 8 8 0 0 -2 0 2 0 -8 1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 0 0 0 -8 8 0 8 4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 -4 8 0 0 -8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 -8 0 -4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 [...]
+1 -7 4 14 0 0 -8 4 -12 4 0 -4 -2 4 8 -8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 4 4 8 4 4 0 -8 -8 0 -4 2 0 2 0 8 -1 8 2 -8 4 4 0 8 0 -4 -10 -4 -4 4 -8 12 0 8 8 0 8 16 8 4 8 -16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 0 4 0 8 0 4 -4 0 0 -12 -16 -16 -8 -4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 8 -8 4 0 8 4 -8 -4 8 -8 [...]
+1 -7 0 18 0 0 0 4 -12 0 0 -12 6 12 0 -12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 12 12 -24 12 0 24 0 24 -12 12 -6 0 6 0 0 3 0 6 0 -12 12 -24 0 0 0 6 0 -12 -12 0 -12 0 0 0 12 0 24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 -12 0 0 0 0 0 -12 0 0 12 -24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 -12 0 -12 0 0 12 0 0 12 0 24 12 0 12 4 -12 -4 -6 0 -12 0 -12 0 12 [...]
+1 -7 0 14 0 4 0 0 -12 -4 0 -4 6 4 0 -4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 16 0 0 8 12 -2 0 2 8 0 3 -4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 8 0 0 -8 8 0 4 -4 -8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 -16 8 16 -8 0 8 0 -8 0 4 -12 -4 -8 0 0 4 0 0 4 8 0 8 0 -12 -4 12 4 2 0 -4 0 0 -12 -4 0 2 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 -9 4 20 2 8 -8 0 -16 -4 -2 -16 0 0 -8 -12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 8 0 0 8 0 8 -8 0 -4 8 -2 0 2 0 8 1 0 4 -8 0 8 -8 8 0 -4 -4 4 0 0 8 0 0 0 8 -4 8 8 0 -8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 8 8 -8 0 0 8 16 8 0 0 8 -4 8 8 0 8 0 8 16 8 0 -8 8 8 8 4 4 4 -8 -4 -8 0 0 -8 4 4 0 0 0 0 4 8 8 4 8 4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 2 8 0 0 0 4 4 [...]
+1 -11 8 26 4 16 -24 -4 -20 -12 -4 -28 -6 -12 -24 -20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 -4 -4 -8 -4 -4 -16 -8 -8 -8 -4 -2 -8 -2 -16 -8 -1 -8 -2 -8 -4 -4 -16 -8 -8 -4 -6 -4 -4 -4 -8 -4 -16 -8 -8 -8 -8 -16 -8 -4 -8 -16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8 [...]
+1 -13 12 36 6 24 -48 -8 -32 -24 -6 -48 -12 -24 -48 -36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 -24 -24 -48 -24 -12 -48 -48 -48 -24 -24 -6 -24 -6 -48 -48 -3 -24 -12 -48 -24 -24 -48 -48 -24 -24 -24 -24 -24 -24 -48 -24 -48 -24 -48 -24 -48 -48 -24 -24 -48 -48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 -12 -48 -24 -48 -48 -16 -24 -48 -48 -24 -48 [...]
+1 13 12 36 6 24 48 8 32 24 6 48 12 24 48 36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 24 24 48 24 12 48 48 48 24 24 6 24 6 48 48 3 24 12 48 24 24 48 48 24 24 24 24 24 24 48 24 48 24 48 24 48 48 24 24 48 48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 12 48 24 48 48 16 24 48 48 24 48 48 24 48 48 48 48 48 48 48 48 48 48 24 24 24 24 12 12 24 12 24 [...]
+1 11 8 26 4 16 24 4 20 12 4 28 6 12 24 20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 4 4 8 4 4 16 8 8 8 4 2 8 2 16 8 1 8 2 8 4 4 16 8 8 4 6 4 4 4 8 4 16 8 8 8 8 16 8 4 8 16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8 -8 -4 -2 -4 -4 -8 -8 -8 -8 - [...]
+1 11 12 12 6 24 48 8 -16 24 -6 0 12 24 48 12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 24 24 48 24 -12 -48 48 48 -24 24 -6 -24 -6 -48 48 -3 -24 12 48 24 24 -48 48 -24 24 0 24 24 24 48 24 -48 -24 48 -24 48 -48 -24 24 48 -48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 -12 48 -24 48 -48 -16 24 -48 48 24 48 -48 24 48 [...]
+1 9 8 16 2 8 16 0 8 0 2 8 8 8 0 16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 8 -16 -16 0 -4 16 -16 0 -8 16 2 8 2 16 -16 3 -8 0 0 -16 0 0 0 0 0 4 0 0 0 16 8 0 0 0 -8 0 0 -8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 16 8 8 4 8 0 -4 0 8 0 0 8 8 -16 -4 -16 -4 0 -16 0 -4 0 0 0 -16 0 -16 -4 -16 -32 8 0 0 8 16 0 0 [...]
+1 9 4 20 2 8 8 0 16 4 2 16 0 0 8 12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 -8 8 0 4 -8 2 0 -2 0 -8 -1 0 -4 8 0 -8 8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 4 -8 -8 0 8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 -8 -8 8 0 0 -8 -16 -8 0 0 -8 4 -8 -8 0 -8 0 -8 -16 -8 0 8 -8 -8 -8 -4 -4 -4 8 4 8 0 0 8 -4 -4 0 0 0 0 -4 -8 -8 -4 -8 -4 0 8 4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 [...]
+1 9 4 16 6 8 0 0 8 0 6 8 8 0 32 4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 12 16 0 0 8 16 -2 -8 -2 16 0 3 8 -8 -32 16 0 -16 -32 8 0 -12 0 -16 0 0 0 -16 8 32 8 0 -16 8 -16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 -4 -32 -24 -32 -16 -16 0 -16 0 0 0 -16 0 32 16 16 16 16 0 -16 -16 -16 -16 8 16 8 8 12 4 -16 -4 -24 0 -16 -16 8 4 16 4 1 [...]
+1 9 4 16 2 12 8 4 8 8 2 16 0 8 8 4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 -2 0 2 -8 8 -1 4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 8 0 -8 0 0 16 4 -8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 8 8 -8 0 0 0 8 0 -4 -8 0 -8 -8 0 -8 0 -8 -8 8 0 -8 -16 -4 -8 -4 -8 -4 -4 -8 -4 -8 -8 -8 -16 -8 -4 0 0 0 0 4 8 8 4 4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 [...]
+1 9 8 6 4 16 24 4 -12 12 -4 -4 6 12 24 4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 4 4 8 4 -4 -16 8 8 -8 4 -2 -8 -2 -16 8 -1 -8 2 8 4 4 -16 8 -8 4 -2 4 4 4 8 4 -16 -8 8 -8 8 -16 -8 4 8 -16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 8 8 4 - [...]
+1 7 4 14 0 0 8 -4 12 -4 0 4 2 -4 -8 8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 -4 0 8 8 0 4 -2 0 -2 0 -8 1 -8 -2 8 -4 -4 0 -8 0 4 10 4 4 -4 8 -12 0 -8 -8 0 -8 -16 -8 -4 -8 16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 0 -4 0 -8 0 -4 4 0 0 12 16 16 8 4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 8 -8 4 0 8 4 -8 -4 8 [...]
+1 7 8 6 4 0 8 -4 -4 -12 4 -12 10 4 8 12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 4 16 -8 -8 -8 -4 2 8 2 16 -8 1 -8 -2 -8 -4 -4 -16 -8 8 -4 2 -4 -4 -4 24 12 -16 8 24 -8 -8 -16 -8 -4 -8 -16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 -16 4 16 16 0 0 4 0 0 -12 0 0 -16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 - [...]
+1 7 4 6 0 8 8 4 -4 4 0 4 2 4 -8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 -4 0 -8 -8 -8 4 -2 0 -2 0 8 1 0 6 -8 -4 4 0 8 0 -4 2 -4 4 4 8 -4 0 -8 -8 -8 8 16 0 -4 -8 -16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 -8 0 8 0 0 12 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 8 -4 -8 0 0 -4 4 0 0 4 0 0 0 4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 -4 [...]
+1 7 4 10 0 4 0 0 4 0 0 4 2 4 -8 8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 4 2 0 2 0 -8 1 -4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 -16 4 0 0 -8 -4 0 0 -4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 16 8 8 8 8 4 -4 -4 -4 0 4 -4 0 0 -4 -8 -8 4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8 4 [...]
+1 7 8 0 2 8 16 0 -8 0 -2 -8 8 8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 8 -16 -16 0 4 -16 -16 0 8 16 -2 -8 -2 -16 -16 -3 8 0 0 -16 0 0 0 0 0 -4 0 0 0 16 8 0 0 0 8 0 0 8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 16 -8 -8 -4 -8 0 4 0 8 0 0 -8 -8 -16 4 -16 4 0 -16 0 4 0 0 0 -16 0 -16 4 -16 32 8 0 0 -8 16 0 [...]
+1 7 0 10 4 4 -8 0 4 0 4 4 2 -4 16 -4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 -4 4 0 -4 4 0 0 0 4 4 -2 -8 -2 0 0 1 4 -2 -8 4 0 -8 -8 0 0 -6 0 -4 0 -8 -4 -8 0 0 4 0 -8 4 -4 0 -8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 2 [...]
+1 7 0 18 0 0 0 -4 12 0 0 12 -6 -12 0 12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 -24 0 -24 12 -12 6 0 -6 0 0 -3 0 -6 0 12 -12 24 0 0 0 -6 0 12 12 0 12 0 0 0 -12 0 -24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 12 0 0 0 0 0 12 0 0 -12 24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 12 0 12 0 0 -12 0 0 -12 0 -24 -12 0 -12 -4 12 4 6 0 12 0 12 0 -1 [...]
+1 7 0 14 0 4 0 0 12 4 0 4 -6 -4 0 4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 -16 0 0 -8 -12 2 0 -2 -8 0 -3 4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 -8 0 0 8 -8 0 -4 4 8 8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 16 -8 -16 8 0 -8 0 8 0 -4 12 4 8 0 0 -4 0 0 -4 -8 0 -8 0 12 4 -12 -4 -2 0 4 0 0 12 4 0 -2 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 7 0 10 0 8 0 4 4 0 0 12 -6 4 0 -4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 4 -12 -8 4 0 -8 0 -8 4 -12 -2 0 2 -16 0 -3 -8 2 0 12 -4 -8 0 0 0 2 0 -4 -12 0 -4 0 0 0 -4 0 8 8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 12 8 4 0 0 4 0 0 4 0 8 -4 0 -12 -4 12 4 -2 0 -4 0 4 0 4 0 -2 8 4 -8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4 [...]
+1 7 4 4 2 8 8 0 -8 4 -2 0 0 0 8 4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 8 8 0 -4 -8 -2 0 2 0 -8 1 0 -4 8 0 -8 -8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 -4 -8 8 0 8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 -8 8 8 0 0 -8 16 -8 0 0 8 4 -8 8 0 8 0 -8 16 8 0 -8 8 -8 8 4 4 4 8 -4 -8 0 0 -8 4 4 0 0 0 0 -4 -8 -8 4 -8 -4 0 8 4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0 [...]
+1 7 4 0 6 8 0 0 -8 0 -6 -8 8 0 32 -4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 -12 -16 0 0 -8 16 2 8 2 -16 0 -3 -8 -8 -32 16 0 16 -32 -8 0 -4 0 -16 0 0 0 16 -8 32 -8 0 16 -8 -16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 4 -32 24 -32 16 16 0 16 0 0 0 16 0 32 -16 -16 -16 -16 0 16 16 16 16 -8 16 -8 -8 -12 -4 -16 4 24 0 16 16 -8 -4 16 -4 [...]
+1 7 0 6 0 12 0 0 -4 12 0 12 -6 12 0 -12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 -6 0 6 -24 0 -3 12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 24 0 0 0 -24 0 -12 -12 -24 -24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 12 0 0 0 0 0 -12 -24 24 0 0 0 12 0 0 -24 0 24 0 24 0 -24 0 -12 12 12 0 0 0 12 0 0 12 24 0 0 0 12 4 -12 -4 6 0 -12 0 0 -12 -1 [...]
+1 7 4 0 2 12 8 4 -8 8 -2 -8 0 8 8 -4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 2 0 -2 8 8 1 -4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 -8 0 -8 0 0 -16 -4 -8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 8 -8 -8 0 0 0 -8 0 -4 -8 0 -8 -8 0 8 0 8 -8 -8 0 8 16 4 -8 4 8 4 4 -8 4 8 -8 8 16 8 4 0 0 0 0 4 8 8 -4 4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 5 4 12 -2 -8 16 -8 16 -8 -2 0 4 -8 -16 -4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 -4 16 16 16 8 8 -2 -8 -2 -16 16 3 -8 4 -16 8 8 -16 -16 8 -8 16 24 8 -24 16 -8 16 -24 -16 8 -16 -16 -8 8 -16 16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 -4 -16 8 -16 -16 -16 -8 16 -16 -24 16 -16 -8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8 [...]
+1 5 4 4 2 -4 0 -4 0 -8 2 -8 4 0 0 4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 -2 0 2 8 0 -1 -4 0 0 0 -4 -8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 -8 -4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 4 8 8 8 0 0 8 0 8 0 0 8 0 8 -4 -8 -4 0 -4 -4 -8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 8 4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0 [...]
+1 5 4 4 -2 0 0 0 0 0 -2 0 4 0 -16 4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 -4 0 0 0 0 8 -2 8 -2 0 0 3 0 -4 16 8 0 0 16 -8 0 -8 0 -8 0 0 0 0 -8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 -4 16 -8 16 16 16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 4 -8 -4 -8 0 0 0 0 4 8 4 8 4 -4 0 -8 -4 0 0 -8 0 -4 0 -4 0 16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 [...]
+1 5 0 4 2 0 0 0 0 0 2 0 4 -8 0 -8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 -8 -8 16 -8 -4 0 0 0 0 8 -6 -8 -6 0 0 3 0 4 0 -8 0 0 0 0 0 8 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 12 0 0 0 16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 4 0 -8 -4 0 -8 0 0 0 0 -8 -4 -8 -4 4 0 -8 -4 0 0 8 0 4 16 12 16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4 [...]
+1 5 0 12 -2 -4 0 -4 8 0 -2 0 -4 -8 -8 8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 8 0 0 -8 -8 -8 0 0 2 0 -2 0 8 -1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 0 0 0 8 -8 0 -8 -4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 4 -8 0 0 8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 8 0 4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 4 0 [...]
+1 5 0 8 -2 0 0 0 8 -4 -2 0 -4 0 -8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 -4 0 -2 0 2 -8 -8 -1 -8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 -8 0 8 4 8 0 0 0 8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 8 -4 8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 -8 0 -8 -4 0 0 0 0 0 0 -8 0 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 [...]
+1 5 4 2 0 0 8 -4 -4 -4 0 4 2 -4 -8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 4 0 8 8 0 4 2 0 2 0 -8 -1 8 -2 8 -4 -4 0 -8 0 4 2 4 4 -4 8 -12 0 8 -8 0 -8 16 8 -4 -8 -16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 0 -4 0 8 0 4 4 0 0 12 -16 -16 -8 -4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 -12 [...]
+1 5 12 -4 6 -8 16 -8 -16 -24 6 -32 4 8 16 20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 8 8 16 8 12 -16 16 -48 -8 8 6 24 6 -16 16 3 -8 4 16 8 -24 -16 16 24 -24 16 -24 8 -24 16 8 -16 24 16 -8 -48 -16 -8 8 16 -16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 12 16 24 16 48 16 8 -16 -48 -24 -48 -16 -24 16 -16 -16 -16 -16 16 -16 -16 -16 [...]
+1 5 4 0 2 0 0 0 -8 -4 2 -8 4 0 0 4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 8 0 0 -4 -8 2 0 -2 0 0 -1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 -8 0 0 -4 8 0 0 8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 8 0 8 0 0 8 0 8 0 0 -8 0 -4 -4 -4 8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 -8 -4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8 [...]
+1 5 8 -6 4 0 8 -4 -4 -12 -4 -12 10 4 8 -4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 -4 -16 -8 -8 8 -4 -2 -8 -2 -16 -8 -1 8 -2 -8 -4 -4 16 -8 -8 -4 -6 -4 -4 -4 24 12 16 -8 24 8 -8 16 8 -4 -8 16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 16 4 -16 -16 0 0 4 0 0 -12 0 0 16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 12 [...]
+1 5 4 -4 -2 8 16 8 -16 8 -2 0 4 -8 -16 -4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 -8 8 -16 8 -4 -16 16 -16 -8 8 -2 -8 -2 16 16 3 8 4 -16 8 -8 16 -16 8 8 16 -24 8 24 16 -8 -16 -24 -16 -8 16 16 8 8 -16 -16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 -4 -16 8 -16 -16 -16 -8 -16 16 24 -16 16 8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 -4 4 8 [...]
+1 5 0 4 -2 4 0 4 0 0 -2 0 -4 0 -8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 -8 -8 8 -8 0 2 0 -2 0 8 -1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 8 4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 -8 -8 0 -4 8 0 0 8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 8 8 0 8 0 0 0 0 0 0 8 0 4 -4 0 0 -8 0 -8 0 8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 - [...]
+1 5 0 0 -2 8 0 0 -8 4 -2 8 -4 8 -8 -8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 4 0 -2 0 2 -8 -8 -1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 8 0 8 -4 -8 0 -8 0 -8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 -8 4 8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 -8 0 -4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0 0 4 - [...]
+1 5 4 -6 0 8 8 4 -4 4 0 -12 2 4 -8 -8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 4 0 -8 -8 8 4 2 0 2 0 8 -1 0 6 -8 -4 4 0 8 0 -4 -6 -4 4 4 8 -4 0 8 -8 8 8 -16 0 -4 -8 16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 -8 0 8 0 0 12 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 -8 -4 8 0 0 4 4 0 0 4 0 0 0 -4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8 4 2 -4 [...]
+1 5 4 4 -2 0 -16 0 0 0 -2 0 4 8 -16 12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 8 8 16 8 -4 0 -16 0 0 8 6 -8 6 0 -16 3 0 4 -16 8 0 0 -16 -24 0 0 0 8 0 -16 8 0 8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 12 -16 8 -16 -16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 4 8 -4 8 8 0 0 0 4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 16 12 16 16 -8 -16 -16 8 0 0 0 0 0 -16 - [...]
+1 5 0 4 2 0 -16 0 0 0 2 0 4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 -4 0 16 0 0 8 2 -8 2 0 16 3 0 -4 0 -8 0 0 0 0 0 -16 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 0 8 12 0 0 0 0 0 0 -8 -4 -8 -4 -4 16 8 12 0 0 -8 16 -4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0 [...]
+1 5 4 -2 0 4 0 0 -4 0 0 -4 2 4 -8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 4 -4 0 4 4 0 -8 0 4 4 -2 0 -2 0 -8 -1 4 -2 0 -4 0 0 0 8 0 2 0 -4 0 -16 4 0 0 -8 4 0 0 4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 16 -8 -8 -8 -8 -4 -4 4 4 0 -4 -4 0 0 -4 8 8 -4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 0 -2 [...]
+1 5 -4 4 6 0 -16 0 0 0 6 0 4 -8 16 -12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 -8 8 -16 8 12 0 -16 0 0 8 -2 -8 -2 0 -16 3 0 4 16 8 0 0 16 -8 0 0 0 8 0 -16 -8 0 -8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 -4 16 24 16 -16 16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 12 -4 8 -4 24 -8 0 0 0 -4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 -16 -4 -16 -16 -8 16 16 -8 [...]
+1 5 -4 8 2 0 -8 0 0 -4 2 8 -4 -8 8 -4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 -8 8 0 12 0 2 0 -2 0 -8 -1 -8 0 -8 8 -8 8 8 0 -4 -8 4 8 0 8 8 0 0 -8 -4 8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 8 8 -8 0 0 0 0 8 0 0 8 -4 -8 -8 0 -8 0 8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 8 16 -8 4 4 8 0 -8 0 0 -8 0 -4 -8 4 8 8 -8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 -4 [...]
+1 5 -4 8 2 0 -8 0 8 4 2 -8 -4 -8 8 -4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 -8 8 0 -4 0 2 0 -2 0 -8 -1 8 8 -8 -8 8 -8 8 0 4 0 -4 -8 0 8 8 -16 0 -8 12 -8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 8 8 -8 0 0 0 16 -8 0 0 -8 4 -8 -8 0 -8 0 8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 8 0 8 4 4 -8 0 8 0 8 -8 0 -4 8 -4 -8 8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4 12 [...]
+1 5 -4 4 2 4 -8 -4 0 8 2 0 -4 0 8 -12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 -8 0 -2 0 2 -8 8 -1 12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 8 0 -8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 -8 -8 8 0 0 8 -8 0 4 8 16 -8 -8 0 -8 0 -8 8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 -8 0 8 0 -8 8 0 4 -4 0 8 -8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 - [...]
+1 5 -4 4 2 4 -8 4 0 -8 2 8 -4 0 8 -12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 8 0 -2 0 2 -8 8 -1 -4 0 8 8 4 -16 -8 0 8 8 0 -8 -4 8 0 -8 0 -8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 -8 -8 8 0 0 8 8 0 -4 -8 0 8 -8 0 -8 0 -8 8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 8 0 -8 0 0 8 0 4 4 0 -8 -8 8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 8 [...]
+1 5 0 -2 4 4 -8 0 -4 0 -4 -4 2 -4 16 -4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 -4 4 0 -4 -4 0 0 0 -4 4 2 8 2 0 0 -1 -4 -2 -8 4 0 8 -8 0 0 2 0 -4 0 -8 -4 8 0 0 -4 0 8 -4 -4 0 8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 5 0 6 0 0 0 -4 -12 0 0 12 -6 -12 0 12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 24 0 -24 -12 -12 -6 0 6 0 0 3 0 -6 0 12 -12 -24 0 0 0 -6 0 12 12 0 12 0 0 0 12 0 24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 -12 0 0 0 0 0 12 0 0 -12 24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 12 0 -12 0 0 -12 0 0 -12 0 24 12 0 -12 4 12 -4 6 0 12 0 12 0 -12 0 6 [...]
+1 5 0 2 0 4 0 0 -4 4 0 -4 -6 -4 0 4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 16 0 0 8 -12 -2 0 2 8 0 3 -4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 8 0 0 -8 -8 0 4 4 8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 -16 8 16 -8 0 8 0 -8 0 4 12 -4 -8 0 0 -4 0 0 -4 8 0 8 0 12 -4 -12 4 -2 0 4 0 0 12 4 0 -2 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 - [...]
+1 5 0 -2 0 8 0 4 -4 0 0 -4 -6 4 0 -4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 4 -12 -8 4 0 8 0 -8 -4 -12 2 0 -2 16 0 3 8 2 0 12 -4 8 0 0 0 2 0 -4 -12 0 -4 0 0 0 4 0 -8 -8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 12 -8 -4 0 0 4 0 0 4 0 -8 4 0 -12 4 12 -4 -2 0 -4 0 4 0 4 0 -2 8 -4 -8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 - [...]
+1 5 0 -6 0 12 0 0 -4 12 0 -12 -6 12 0 -12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 6 0 -6 24 0 3 -12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 -24 0 0 0 -24 0 12 -12 -24 24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 -12 0 0 0 0 0 -12 24 24 0 0 0 12 0 0 24 0 -24 0 -24 0 24 0 12 12 -12 0 0 0 12 0 0 12 -24 0 0 0 12 -4 -12 4 6 0 -12 0 0 -12 -12 0 [...]
+1 3 4 2 0 -8 8 -4 4 -4 0 -4 6 -4 -8 -8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 -4 4 8 4 -4 0 -8 8 8 -4 -2 0 -2 0 8 1 0 2 -8 4 -4 -16 8 0 4 -2 4 -4 -4 8 4 16 -8 -8 8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 -8 4 8 0 0 -4 -4 0 0 -4 -16 -16 0 4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4 [...]
+1 3 0 10 -4 -8 8 -4 12 -4 -4 -4 -2 -4 -8 -4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 16 8 -8 0 4 2 -8 2 -16 8 1 0 2 -8 4 12 0 -8 8 -12 6 4 4 -4 -8 4 0 -8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 8 -4 0 0 -4 0 0 -8 -8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 4 -2 -8 16 -8 0 -8 2 16 4 -8 -16 -12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 4 -16 16 16 -8 8 2 8 2 16 16 -3 8 4 -16 8 8 16 -16 -8 -8 -8 24 8 -24 16 -8 -16 24 -16 -8 -16 16 8 8 -16 -16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 4 -16 -8 -16 16 16 -8 -16 -16 -24 16 16 -8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 4 -4 8 [...]
+1 3 8 -6 4 -8 8 -4 -12 -12 4 -20 -2 4 8 12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 -4 4 8 4 4 -16 8 -8 0 4 2 8 2 -16 8 1 0 2 8 4 -4 0 8 8 -4 6 -4 4 -4 -8 -4 0 8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 8 -4 -8 -8 0 0 -4 0 0 4 0 0 8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 0 0 - [...]
+1 3 4 -2 0 -4 -16 0 -4 0 0 -4 6 4 -8 8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 4 4 0 -4 -4 0 8 0 4 -4 2 0 2 0 8 1 4 2 0 4 0 0 0 -8 0 -2 0 4 0 0 4 0 0 -8 4 0 0 4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 -8 -8 -8 -4 4 4 4 0 4 4 0 0 -4 8 8 -4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 -2 0 [...]
+1 3 0 -2 4 -4 -8 0 -4 0 4 -4 6 -4 0 -4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 -4 -4 0 4 4 0 0 0 -4 -4 -2 -8 -2 0 0 1 -4 2 8 -4 0 8 8 0 0 -2 0 4 0 -8 -4 8 0 16 -4 0 8 -4 4 0 8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 - [...]
+1 3 0 6 0 -8 0 -4 4 0 0 -12 -2 -4 0 4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 -4 -4 8 12 0 -8 0 8 4 -4 -2 0 2 16 0 -3 8 6 0 4 4 -8 0 0 0 6 0 -12 12 0 4 0 0 0 -4 0 8 -8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 4 -8 4 0 0 12 0 0 -4 0 8 -4 0 -4 -4 4 4 -6 0 -12 0 -4 0 12 0 -6 -8 4 8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 [...]
+1 3 0 2 0 -4 0 0 -4 -4 0 -4 -2 -4 0 4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 2 0 -2 8 0 -3 -4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 8 0 0 0 8 0 4 -4 8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 -4 0 0 0 0 0 4 -8 -8 0 0 0 -4 0 0 8 0 -8 0 8 0 -8 0 4 4 -4 0 0 0 4 0 0 -4 8 0 0 0 4 4 -4 -4 2 0 -4 0 0 -12 -4 0 2 8 4 -8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0 [...]
+1 3 0 2 0 -4 0 0 4 -12 0 -4 -2 4 0 -4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 -6 0 6 8 0 -3 -4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 -8 0 0 0 24 0 4 -4 -8 8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 12 0 0 0 0 0 -4 8 -24 0 0 0 -12 0 0 8 0 -8 0 -8 0 8 0 4 4 -4 0 0 0 4 0 0 4 -8 0 0 0 4 4 -4 -4 2 0 -4 0 0 12 -4 0 2 -8 -12 8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0 [...]
+1 3 0 -2 0 0 0 -4 -4 0 0 -4 -2 4 0 -4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 8 0 8 -4 -4 -2 0 2 0 0 -3 0 -2 0 4 4 8 0 0 0 -2 0 4 12 0 -4 0 0 0 4 0 -8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 -4 0 0 0 0 0 -4 0 0 -12 -8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 4 0 -4 0 0 -4 0 0 4 0 -8 4 0 -4 -4 4 4 2 0 4 0 -4 0 -4 0 2 8 4 -8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0 [...]
+1 3 4 -4 2 -4 0 -4 0 -8 -2 0 4 0 0 -4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 2 0 -2 -8 0 1 4 0 0 0 -4 8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 8 4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 4 8 -8 8 0 0 -8 0 -8 0 0 -8 0 -8 4 -8 4 0 4 4 -8 4 8 0 0 -8 0 4 0 0 0 0 0 0 8 -4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 0 [...]
+1 3 4 -6 0 0 8 4 -12 4 0 -4 6 -12 -8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 4 4 8 4 -4 0 8 -8 0 -4 -2 0 -2 0 -8 1 8 -6 8 4 4 16 -8 0 -4 6 -4 -4 4 8 -4 -16 -8 -8 0 8 0 8 4 8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 0 4 0 8 0 -4 -4 0 0 4 0 0 -8 4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 3 0 6 -4 -4 0 0 4 0 -4 -4 -2 -4 -8 4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 4 4 0 -4 4 0 -8 0 -4 4 -2 8 -2 0 8 1 4 -6 0 4 0 0 16 0 0 -2 0 -4 0 0 -4 0 0 8 -4 0 0 4 -4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 -16 0 0 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 4 -8 8 4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4 [...]
+1 3 0 -2 -4 4 0 0 -4 0 -4 4 -2 4 -8 -4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 -4 4 0 -4 4 0 8 0 4 4 -2 8 -2 0 -8 1 -4 2 16 4 0 0 0 0 0 -10 0 -4 0 0 4 0 0 8 4 0 0 -4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 -16 0 0 4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 -4 8 -8 -4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4 [...]
+1 3 4 -4 -2 0 0 0 0 0 2 0 4 0 -16 -4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 4 0 0 0 0 8 2 -8 2 0 0 -3 0 -4 16 8 0 0 16 8 0 0 0 -8 0 0 0 0 8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 4 16 8 16 -16 -16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 4 -4 -8 4 8 0 0 0 0 -4 8 -4 8 -4 -4 0 -8 4 0 0 -8 0 -4 0 4 0 -16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 -8 [...]
+1 3 -4 2 0 0 0 -4 -4 4 0 4 -2 -4 0 -8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 4 -4 8 -4 -4 0 0 8 0 4 -2 0 -2 0 0 1 0 2 0 -4 -4 8 0 0 -4 6 -4 4 -4 0 4 8 8 0 0 8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 4 4 0 0 -4 -8 8 0 -4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 [...]
+1 3 -4 2 0 0 0 4 4 -4 0 -4 -2 -4 0 -8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 4 -4 8 -4 -4 0 0 -8 0 4 -2 0 -2 0 0 1 0 2 0 -4 4 -8 0 0 4 6 4 4 4 0 4 -8 8 0 0 -8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 4 4 0 0 -4 8 -8 0 -4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 - [...]
+1 3 0 -4 2 0 0 0 0 0 -2 0 4 -8 0 -8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 -8 -8 16 -8 4 0 0 0 0 8 6 8 6 0 0 -3 0 4 0 -8 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 -12 0 0 0 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 -8 4 0 -8 0 0 0 0 -8 4 -8 4 4 0 -8 4 0 0 8 0 4 16 -12 16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0 - [...]
+1 3 0 10 -4 -8 -8 -4 4 4 -4 -4 -2 -4 -8 12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 4 4 8 4 4 0 -24 -8 0 4 2 -8 2 0 8 1 16 10 8 4 12 0 -24 -8 12 -2 -4 4 -4 8 -12 0 8 8 -16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 16 8 4 8 -16 -12 -8 16 16 -16 -16 -8 -16 16 -16 16 -8 -4 8 -8 0 -8 -4 0 0 12 16 -16 8 8 -4 0 -4 0 -10 -8 -4 0 -12 4 -4 24 6 [...]
+1 3 -4 6 0 -4 -8 0 4 0 0 -4 -2 -4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 4 -4 0 4 -4 0 16 0 4 4 2 0 2 0 0 1 -4 2 -8 -4 0 8 8 8 0 -10 0 -4 0 8 -4 -8 0 0 4 0 8 -4 4 0 -8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 -4 -4 0 0 4 0 0 4 4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8 [...]
+1 3 0 4 -2 -4 0 -4 -8 0 2 8 -4 -8 -8 8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 8 0 0 8 -8 -8 0 0 -2 0 2 0 8 1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 0 0 0 8 8 0 8 4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 4 -8 0 0 8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 8 0 -4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8 [...]
+1 3 0 2 -4 0 -8 4 4 -4 -4 -4 -2 4 -8 4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 -4 4 8 4 4 0 -8 8 -8 4 2 -8 2 0 -8 1 -8 2 -8 4 -12 0 -8 -8 -12 6 4 4 4 8 -4 0 8 8 8 8 0 8 4 8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 -16 -16 16 16 -8 0 0 0 0 0 -4 0 0 0 -8 -4 0 0 4 0 0 0 8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 4 [...]
+1 3 0 0 -2 0 0 0 0 -4 2 0 -4 0 -8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 4 0 2 0 -2 8 -8 1 8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 8 0 8 -4 8 0 0 0 8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 -8 -4 8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 -8 0 8 4 0 0 0 0 0 0 -8 0 4 0 -4 0 8 0 -8 0 8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0 [...]
+1 3 12 -12 6 -8 16 -8 0 -24 -6 -16 4 8 16 -4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 8 8 16 8 -12 16 16 -48 8 8 -6 -24 -6 16 16 -3 8 4 16 8 -24 16 16 -24 -24 -8 -24 8 -24 16 8 16 -24 16 8 -48 16 8 8 16 16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 -12 16 -24 16 -48 -16 8 16 -48 -24 -48 16 -24 16 16 16 16 16 16 16 [...]
+1 3 0 -2 0 0 0 4 -4 0 0 -12 -2 -4 0 4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 8 0 24 -4 -4 6 0 -6 0 0 -3 0 -2 0 4 12 -8 0 0 0 -2 0 4 -12 0 4 0 0 0 4 0 8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 12 0 0 0 0 0 4 0 0 12 -24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 4 0 -4 0 0 -4 0 0 -4 0 8 4 0 -4 -4 4 4 2 0 4 0 -12 0 -4 0 2 -8 -12 8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4 [...]
+1 3 0 -6 0 4 0 0 -12 -4 0 4 -2 4 0 -4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 16 0 0 8 -4 2 0 -2 -8 0 -3 4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 -8 0 0 -8 8 0 -4 12 -8 8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 -16 -8 16 8 0 -8 0 8 0 -4 4 4 -8 0 0 -12 0 0 4 -8 0 8 0 4 4 -4 -4 -6 0 12 0 0 -12 12 0 -6 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 [...]
+1 3 4 -8 2 0 0 0 0 -4 -2 -8 4 0 0 -4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 -8 0 0 4 -8 -2 0 2 0 0 1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 8 0 0 4 8 0 0 8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 -8 0 -8 0 0 -8 0 -8 0 0 -8 0 4 4 4 8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 -8 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8 -8 [...]
+1 3 0 -6 -4 8 8 4 -12 4 -4 4 -2 -4 -8 -4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 -16 8 8 0 4 2 -8 2 16 8 1 0 2 -8 4 -12 0 -8 8 12 6 -4 4 4 -8 4 0 -8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 8 -4 0 0 -4 0 0 8 -8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 -12 -2 8 16 8 0 8 2 -16 4 -8 -16 -12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 -8 8 -16 8 4 16 16 -16 8 8 2 8 2 -16 16 -3 -8 4 -16 8 -8 -16 -16 -8 8 -8 -24 8 24 16 -8 16 24 -16 8 16 -16 -8 8 -16 16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 4 -16 -8 -16 16 16 -8 16 16 24 -16 -16 8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8 4 -4 8 [...]
+1 3 -4 -2 0 4 -8 0 -4 0 0 4 -2 4 0 -8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 -4 -4 0 4 -4 0 0 0 -4 4 2 0 2 0 16 1 4 -6 8 -4 0 -8 -8 8 0 -2 0 -4 0 8 4 8 0 0 -4 0 -8 4 4 0 8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 -4 -4 0 0 -4 0 0 -4 4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6 [...]
+1 3 0 -4 -2 4 0 4 0 0 2 -8 -4 0 -8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 8 -8 8 8 0 -2 0 2 0 8 1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 -8 -4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 -8 8 0 -4 8 0 0 8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 8 -8 0 -8 0 0 0 0 0 0 8 0 -4 -4 0 0 -8 0 -8 0 8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0 [...]
+1 3 0 -6 -4 8 -8 -4 -12 4 -4 12 -2 12 -8 -4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 -12 4 8 4 4 0 8 -8 16 4 2 -8 2 0 -24 1 0 -6 -24 4 12 0 8 -8 12 14 -4 4 -4 8 4 0 8 8 0 -8 0 -16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 -8 0 24 0 0 12 -16 8 4 8 16 -12 -8 16 16 -16 -16 -8 16 -16 16 -16 8 -4 -8 8 0 -8 -4 0 0 -4 -16 16 -8 8 -4 0 -4 0 6 24 -4 0 -12 4 -4 -8 -10 [...]
+1 3 0 -8 -2 8 0 0 0 4 2 -8 -4 8 -8 -8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 -4 0 2 0 -2 8 -8 1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 -8 0 8 4 -8 0 8 0 -8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 8 4 8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 -8 0 4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 - [...]
+1 3 4 -4 -2 0 -16 0 0 0 2 0 4 8 -16 4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 8 8 16 8 4 0 -16 0 0 8 -6 8 -6 0 -16 -3 0 4 -16 8 0 0 -16 24 0 8 0 8 0 -16 8 0 -8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 -12 -16 -8 -16 16 16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 -4 8 4 -8 8 0 0 0 -4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 16 -12 16 -16 -8 16 16 -8 0 0 0 [...]
+1 3 0 -4 2 0 -16 0 0 0 -2 0 4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 4 0 16 0 0 8 -2 8 -2 0 16 -3 0 -4 0 -8 0 0 0 0 0 8 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 0 8 -12 0 0 0 0 0 0 -8 4 -8 4 -4 16 8 -12 0 0 -8 16 -4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4 [...]
+1 3 -8 2 4 0 -8 4 -4 -12 4 12 -2 -4 8 -12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 4 4 -8 4 4 0 -8 8 8 4 2 8 2 0 -8 1 -8 2 8 4 4 0 8 -8 -4 6 -4 4 4 8 4 0 -8 -8 -8 -8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4 -4 [...]
+1 3 -8 2 4 0 -8 -4 4 12 4 -12 -2 -4 8 -12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 4 4 -8 4 4 0 -8 -8 -8 4 2 8 2 0 -8 1 8 2 8 4 -4 0 8 -8 4 6 4 4 -4 8 4 0 -8 -8 8 8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4 -4 [...]
+1 3 -4 -4 6 0 -16 0 0 0 -6 0 4 -8 16 -4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 -8 8 -16 8 -12 0 -16 0 0 8 2 8 2 0 -16 -3 0 4 16 8 0 0 16 8 0 8 0 8 0 -16 -8 0 8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 4 16 -24 16 16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -12 4 8 4 -24 -8 0 0 0 4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 -16 4 -16 16 -8 -16 -16 8 [...]
+1 3 -4 0 2 0 -8 0 -8 -4 -2 8 -4 -8 8 4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 8 8 0 -12 0 -2 0 2 0 -8 1 8 0 -8 8 -8 -8 8 0 -4 -8 4 8 0 8 8 0 0 -8 4 8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 8 -8 -8 0 0 0 0 8 0 0 -8 -4 -8 8 0 8 0 8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 8 -16 8 -4 -4 8 0 -8 0 0 -8 0 4 -8 4 8 8 -8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 3 -4 0 2 0 -8 0 0 4 -2 -8 -4 -8 8 4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 8 8 0 4 0 -2 0 2 0 -8 1 -8 8 -8 -8 8 8 8 0 4 0 -4 -8 0 8 8 16 0 -8 -12 -8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 8 -8 -8 0 0 0 -16 -8 0 0 8 4 -8 8 0 8 0 8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 8 0 -8 -4 -4 -8 0 8 0 8 -8 0 4 8 -4 -8 8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4 1 [...]
+1 3 -4 -4 2 4 -8 -4 0 8 -2 -8 -4 0 8 -4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 8 0 2 0 -2 8 8 1 -12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 -8 0 -8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 -8 8 8 0 0 8 8 0 4 8 -16 -8 -8 0 8 0 8 8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 -8 0 8 0 -8 8 0 -4 -4 0 8 -8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4 [...]
+1 3 -4 -4 2 4 -8 4 0 -8 -2 0 -4 0 8 -4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 -8 0 2 0 -2 8 8 1 4 0 8 8 4 16 -8 0 8 8 0 -8 -4 8 0 8 0 -8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 -8 8 8 0 0 8 -8 0 -4 -8 0 8 -8 0 8 0 8 8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 8 0 -8 0 0 8 0 -4 4 0 -8 -8 8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 1 8 -8 2 -8 16 0 -8 0 2 -8 0 -8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 -8 0 16 16 -4 -16 -16 0 8 0 2 8 2 -16 -16 3 8 -8 0 0 0 0 0 0 0 -4 0 -16 0 16 -8 0 0 0 8 0 0 8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 0 -8 -8 4 8 16 -4 0 -8 0 0 -8 8 0 -4 0 -4 -8 -16 16 -4 0 0 -16 -16 -8 16 -4 16 -32 8 0 0 -8 - [...]
+1 1 4 -4 2 -8 -8 0 0 4 2 0 8 0 -8 -4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 8 0 0 -8 0 -8 -8 0 4 -8 2 0 -2 0 8 -1 0 4 -8 0 -8 -8 8 0 4 -4 -4 0 0 8 0 16 0 8 4 -8 8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 8 -8 -8 0 0 8 0 -8 0 0 8 4 8 -8 0 -8 0 8 0 8 -16 -8 8 -8 8 12 -4 -4 8 4 8 0 -16 -8 12 -4 0 0 0 0 4 8 -8 -4 -8 -4 0 -8 -4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4 [...]
+1 1 0 4 -2 -8 8 0 8 -4 -2 -8 0 0 0 -8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 -4 -8 0 0 -8 8 0 -4 4 -4 0 0 -8 8 0 0 0 -4 8 8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 -8 8 0 0 0 -4 0 0 -8 0 -8 -8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 8 8 0 -4 0 0 0 0 0 -4 0 0 -4 0 -4 0 0 4 8 0 -8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0 [...]
+1 1 0 0 -2 -4 8 -4 0 0 -2 0 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 -8 0 0 8 0 -8 0 0 2 0 -2 0 0 -1 -4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 8 0 0 8 0 0 4 0 8 -8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 -8 0 0 -8 0 -8 0 -8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 8 0 8 -8 0 0 0 0 0 4 0 0 4 4 0 0 0 -4 -8 0 8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8 [...]
+1 1 4 -2 0 -8 8 -4 4 -4 0 12 6 -4 -8 -16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 -4 4 8 4 4 0 -8 8 -8 -4 2 0 2 0 8 -1 0 2 -8 4 -4 16 8 0 4 -10 4 -4 -4 8 4 -16 8 -8 -8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 8 4 -8 0 0 4 -4 0 0 -4 16 16 0 -4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8 - [...]
+1 1 0 8 -6 -8 0 0 8 0 -6 -8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 12 16 0 0 -8 0 2 -8 2 -16 0 3 8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 -12 0 0 -4 0 0 0 0 8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0 [...]
+1 1 -4 8 -2 -8 0 0 8 0 -2 -8 0 0 0 -4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 -4 16 0 0 8 0 6 -8 6 -16 0 3 -8 0 0 0 0 16 0 24 0 -4 0 0 0 0 0 -16 -8 0 8 0 16 -8 0 0 -16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 12 0 -8 0 -16 16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 -4 -4 0 -4 -8 0 -16 16 8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 6 -4 -8 8 -4 -4 -4 4 12 -2 -4 -8 -4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 -16 8 -8 0 4 -2 8 -2 16 8 -1 0 2 -8 4 12 0 -8 -8 -12 -2 4 4 -4 -8 4 0 8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 -8 -4 0 0 -4 0 0 8 8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 [...]
+1 1 8 -8 2 -8 -16 0 -8 0 2 -8 0 8 0 16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 8 0 -16 -16 -4 -16 16 0 8 0 2 8 2 -16 16 3 8 8 0 0 0 0 0 0 0 12 0 16 0 -16 8 0 0 0 8 0 0 8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 0 -8 -8 4 8 -16 -4 0 8 0 0 -8 8 0 -4 0 -4 8 16 -16 -4 0 0 16 16 8 -16 -4 -16 -32 8 0 0 8 -16 0 0 [...]
+1 1 4 -8 6 -8 0 0 -8 0 6 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 12 -16 0 0 -8 0 -2 -8 -2 -16 0 3 -8 0 0 0 0 16 0 8 0 -4 0 0 0 0 0 16 8 0 -8 0 16 -8 0 0 16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 -4 0 -24 0 -16 -16 0 16 0 0 0 16 0 0 -16 -16 -16 -16 0 16 16 16 16 -8 0 -8 -8 12 4 0 -4 -24 0 16 16 -8 4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 16 -8 0 [...]
+1 1 4 -4 2 -8 8 0 -8 -4 2 -16 -8 0 8 12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 -8 0 0 8 0 -8 8 0 4 8 2 0 -2 0 -8 -1 0 -4 8 0 8 -8 -8 0 -4 4 4 0 0 -8 0 16 0 -8 4 8 8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 -8 -8 8 0 0 -8 0 8 0 0 8 -4 -8 -8 0 -8 0 -8 0 8 -16 -8 8 8 8 12 -4 -4 -8 4 8 0 -16 -8 12 -4 0 0 0 0 -4 -8 8 -4 8 4 0 8 4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8 [...]
+1 1 4 -8 2 -4 8 -4 -8 -8 2 -8 -8 8 8 4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 -2 0 2 -8 8 -1 4 4 -8 0 -4 16 8 0 8 -4 0 0 4 -8 -8 -8 0 -8 0 0 0 4 8 0 8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 8 8 -8 0 0 0 -8 0 4 8 -16 8 -8 0 -8 0 -8 -8 -8 -16 8 0 12 8 12 8 -4 -4 8 -4 -8 -8 8 0 8 -4 0 0 0 0 4 8 -8 4 -4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 - [...]
+1 1 8 -10 4 -8 8 -4 4 -12 -4 -4 -2 4 8 -4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 -4 4 8 4 -4 16 8 -8 0 4 -2 -8 -2 16 8 -1 0 2 8 4 -4 0 8 -8 -4 -2 -4 4 -4 -8 -4 0 -8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 -8 -4 8 8 0 0 -4 0 0 4 0 0 -8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4 [...]
+1 1 4 -8 2 -4 -8 4 -8 8 2 0 8 -8 -8 4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 -2 0 2 -8 -8 -1 4 -4 8 0 4 16 -8 0 -8 4 0 0 -4 8 8 -8 0 8 0 0 0 4 -8 0 8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 -8 8 8 0 0 0 -8 0 -4 -8 -16 -8 8 0 -8 0 -8 8 -8 -16 8 0 12 -8 12 8 -4 -4 -8 -4 -8 8 8 0 8 -4 0 0 0 0 -4 -8 8 4 4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8 [...]
+1 1 0 4 -2 -8 -8 0 0 4 -2 -8 0 0 0 8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 4 8 0 0 -8 -8 0 4 -4 4 0 0 8 -8 0 0 0 -4 -8 8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 -8 -8 0 0 0 4 0 0 -8 0 -8 8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 -8 8 0 -4 0 0 0 0 0 4 0 0 -4 0 4 0 0 -4 -8 0 8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 1 0 0 -2 -4 -8 4 0 0 -2 -8 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 8 0 0 8 0 8 0 0 2 0 -2 0 0 -1 -4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 8 0 0 8 0 0 4 0 -8 -8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 -8 0 0 -8 0 -8 0 8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 -8 0 8 -8 0 0 0 0 0 -4 0 0 4 -4 0 0 0 4 8 0 -8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 [...]
+1 1 0 -4 -2 0 -8 0 0 -4 -2 0 0 8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 4 8 0 0 8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 4 8 -8 8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 8 8 0 0 0 -4 0 0 -8 0 -8 8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 4 0 0 -4 0 -4 0 0 -4 8 0 -8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 [...]
+1 1 0 -8 -2 4 -8 -4 -8 0 -2 8 0 8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 8 0 -8 8 0 2 0 -2 0 0 -1 4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 -8 0 0 0 0 0 -4 0 8 8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 8 0 0 -8 0 -8 0 8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 -4 0 0 4 4 0 0 0 4 -8 0 8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0 [...]
+1 1 4 -6 0 -4 -16 0 4 0 0 4 6 4 -8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 4 4 0 -4 4 0 8 0 -4 -4 -2 0 -2 0 8 -1 -4 2 0 4 0 0 0 8 0 6 0 4 0 0 4 0 0 -8 -4 0 0 -4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 0 8 8 8 8 4 4 -4 -4 0 -4 4 0 0 -4 -8 -8 4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 [...]
+1 1 -4 0 2 -4 0 -4 0 8 2 -8 0 0 0 -4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 -2 0 2 8 0 -1 -4 4 0 8 -4 8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 4 8 -8 -8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 8 0 -8 0 4 0 0 4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0 [...]
+1 1 -4 -4 2 0 0 0 -8 -4 2 8 0 0 0 -4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 8 0 0 -4 8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 -8 0 8 0 4 0 0 -4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0 [...]
+1 1 -4 0 2 -4 0 4 0 -8 2 0 0 0 0 -4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 -2 0 2 8 0 -1 -4 -4 0 -8 4 8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 -8 0 8 0 -4 0 0 4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 [...]
+1 1 -4 -4 2 0 0 0 0 4 2 -8 0 0 0 -4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 8 0 0 -4 -8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 8 0 -8 0 -4 0 0 -4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2 [...]
+1 1 0 -6 4 -4 -8 0 4 0 -4 4 6 -4 0 -4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 -4 -4 0 4 -4 0 0 0 4 -4 2 8 2 0 0 -1 4 2 8 -4 0 -8 8 0 0 6 0 4 0 -8 -4 -8 0 16 4 0 -8 4 4 0 -8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8 [...]
+1 1 0 2 0 -8 0 -4 -4 0 0 4 -2 -4 0 4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 -4 -4 8 12 0 8 0 8 -4 -4 2 0 -2 -16 0 3 -8 6 0 4 4 8 0 0 0 6 0 -12 12 0 4 0 0 0 4 0 -8 8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 4 8 -4 0 0 12 0 0 -4 0 -8 4 0 -4 4 4 -4 -6 0 -12 0 -4 0 12 0 -6 -8 -4 8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12 [...]
+1 1 0 -4 -2 0 8 0 -8 4 -2 0 0 -8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 -4 -8 0 0 8 8 0 4 4 4 0 0 -8 0 0 0 0 4 -8 -8 8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 0 0 4 0 0 -8 0 -8 -8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 -4 0 0 -4 0 4 0 0 4 -8 0 8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 0 [...]
+1 1 0 -2 0 -4 0 0 -4 -4 0 4 -2 -4 0 4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 -2 0 2 -8 0 3 4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 -8 0 0 0 8 0 -4 -4 8 8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 4 0 0 0 0 0 4 8 -8 0 0 0 -4 0 0 -8 0 8 0 -8 0 8 0 -4 4 4 0 0 0 4 0 0 -4 -8 0 0 0 4 -4 -4 4 2 0 -4 0 0 -12 -4 0 2 8 -4 -8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0 [...]
+1 1 0 -2 0 -4 0 0 4 -12 0 4 -2 4 0 -4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 6 0 -6 -8 0 3 4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 8 0 0 0 24 0 -4 -4 -8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 -12 0 0 0 0 0 -4 -8 -24 0 0 0 -12 0 0 -8 0 8 0 8 0 -8 0 -4 4 4 0 0 0 4 0 0 4 8 0 0 0 4 -4 -4 4 2 0 -4 0 0 12 -4 0 2 -8 12 8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0 0 [...]
+1 1 0 -6 0 0 0 -4 4 0 0 -4 -2 4 0 -4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 -8 0 8 4 -4 2 0 -2 0 0 3 0 -2 0 4 4 -8 0 0 0 -2 0 4 12 0 -4 0 0 0 -4 0 8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 4 0 0 0 0 0 -4 0 0 -12 -8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 4 0 4 0 0 -4 0 0 4 0 8 -4 0 -4 4 4 -4 2 0 4 0 -4 0 -4 0 2 8 -4 -8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2 [...]
+1 1 0 -8 -2 4 8 4 -8 0 -2 0 0 -8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 8 0 8 8 0 2 0 -2 0 0 -1 4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 -8 0 0 0 0 0 -4 0 -8 8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 8 0 0 -8 0 -8 0 -8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 4 0 0 4 -4 0 0 0 -4 8 0 -8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 - [...]
+1 1 4 -10 0 0 8 4 4 4 0 -4 6 -12 -8 -8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 4 4 8 4 4 0 8 -8 0 -4 2 0 2 0 -8 -1 -8 -6 8 4 4 -16 -8 0 -4 -2 -4 -4 4 8 -4 16 8 -8 0 8 0 -8 4 8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 0 4 0 -8 0 4 -4 0 0 4 0 0 8 -4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4 2 [...]
+1 1 0 0 -6 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 -6 24 -6 0 0 3 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 12 0 0 0 -48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 12 0 0 0 0 0 0 0 -4 0 -4 0 0 0 12 0 0 0 0 0 0 12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0 [...]
+1 1 -4 0 -2 0 0 0 0 0 -2 0 0 0 0 -4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 -4 0 0 0 0 0 -2 8 -2 0 0 3 0 0 0 0 0 0 0 8 0 -4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 -4 0 8 0 16 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 -4 8 0 0 0 0 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 -16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0 [...]
+1 1 0 2 -4 -4 0 0 -4 0 4 4 -2 -4 -8 4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 4 4 0 -4 -4 0 -8 0 4 4 2 -8 2 0 8 -1 -4 -6 0 4 0 0 16 0 0 6 0 -4 0 0 -4 0 0 8 4 0 0 -4 -4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 -16 0 0 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 4 8 -8 -4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0 [...]
+1 1 0 -8 -6 8 0 0 -8 0 -6 8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 12 -16 0 0 8 0 2 -8 2 16 0 3 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 -12 0 0 -4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 [...]
+1 1 0 -6 -4 4 0 0 4 0 4 -4 -2 4 -8 -4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 4 2 -8 2 0 -8 -1 4 2 16 4 0 0 0 0 0 -2 0 -4 0 0 4 0 0 8 -4 0 0 4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 -16 0 0 4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 -4 -8 8 4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0 [...]
+1 1 -4 0 -2 0 0 -8 -8 8 -2 8 0 0 0 -4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 16 0 0 -2 -8 -2 0 0 3 0 0 0 0 8 0 0 -8 8 12 -24 0 -24 0 0 0 24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 8 -24 0 0 0 0 -4 0 -16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0 [...]
+1 1 -8 0 2 0 0 0 0 0 2 0 0 0 0 -8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 2 8 2 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 -4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 -4 0 0 0 0 0 -8 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 [...]
+1 1 -4 -2 0 0 0 -4 -4 4 0 4 -2 -4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 4 -4 8 -4 4 0 0 8 0 4 2 0 2 0 0 -1 0 2 0 -4 -4 -8 0 0 -4 -2 -4 4 -4 0 4 -8 -8 0 0 8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 -4 4 0 0 -4 8 -8 0 4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4 [...]
+1 1 -4 0 -2 0 0 8 8 -8 -2 -8 0 0 0 -4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 -16 0 0 -2 -8 -2 0 0 3 0 0 0 0 -8 0 0 -8 -8 12 24 0 24 0 0 0 24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 -8 24 0 0 0 0 -4 0 -16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0 [...]
+1 1 -4 -2 0 0 0 4 4 -4 0 -4 -2 -4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 4 -4 8 -4 4 0 0 -8 0 4 2 0 2 0 0 -1 0 2 0 -4 4 8 0 0 4 -2 4 4 4 0 4 8 -8 0 0 -8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 -4 4 0 0 -4 -8 8 0 4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 - [...]
+1 1 0 6 -4 -8 -8 -4 -12 4 4 12 -2 -4 -8 12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 4 4 8 4 -4 0 -24 -8 0 4 -2 8 -2 0 8 -1 -16 10 8 4 12 0 -24 8 12 -10 -4 4 -4 8 -12 0 -8 8 16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 -16 8 4 8 16 -12 -8 -16 -16 16 16 -8 16 -16 16 -16 8 -4 -8 8 0 8 -4 0 0 12 -16 16 -8 -8 -4 0 -4 0 -10 -8 -4 0 -12 4 [...]
+1 1 -4 2 0 -4 -8 0 -4 0 0 4 -2 -4 0 8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 4 -4 0 4 4 0 16 0 -4 4 -2 0 -2 0 0 -1 4 2 -8 -4 0 -8 8 -8 0 -2 0 -4 0 8 -4 8 0 0 -4 0 -8 4 4 0 8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 4 -4 0 0 4 0 0 -4 -4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8 [...]
+1 1 0 -2 -4 0 -8 4 4 -4 4 -4 -2 4 -8 4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 -4 4 8 4 -4 0 -8 8 8 4 -2 8 -2 0 -8 -1 8 2 -8 4 -12 0 -8 8 -12 -2 4 4 4 8 -4 0 -8 8 -8 8 0 -8 4 8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 16 16 -16 -16 -8 0 0 0 0 0 -4 0 0 0 8 -4 0 0 4 0 0 0 -8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 -8 -8 -4 0 8 4 8 -12 8 8 [...]
+1 1 0 -6 0 0 0 4 4 0 0 -12 -2 -4 0 4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 -8 0 24 4 -4 -6 0 6 0 0 3 0 -2 0 4 12 8 0 0 0 -2 0 4 -12 0 4 0 0 0 -4 0 -8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 -12 0 0 0 0 0 4 0 0 12 -24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 4 0 4 0 0 -4 0 0 -4 0 -8 -4 0 -4 4 4 -4 2 0 4 0 -12 0 -4 0 2 -8 12 8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0 [...]
+1 1 0 -10 0 4 0 0 4 -4 0 -4 -2 4 0 -4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 -16 0 0 -8 -4 -2 0 2 8 0 3 -4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 8 0 0 8 8 0 4 12 -8 -8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 16 8 -16 -8 0 8 0 -8 0 4 4 -4 8 0 0 -12 0 0 4 8 0 -8 0 4 -4 -4 4 -6 0 12 0 0 -12 12 0 -6 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4 [...]
+1 1 -4 -8 -2 8 0 0 -8 0 -2 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 -4 -16 0 0 -8 0 6 -8 6 16 0 3 8 0 0 0 0 -16 0 24 0 -4 0 0 0 0 0 16 -8 0 -8 0 -16 8 0 0 16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 12 0 -8 0 -16 16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 -4 -4 0 -4 -8 0 16 -16 -8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 -10 -4 8 8 4 4 4 4 -12 -2 -4 -8 -4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 16 8 8 0 4 -2 8 -2 -16 8 -1 0 2 -8 4 -12 0 -8 -8 12 -2 -4 4 4 -8 4 0 8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 -8 -4 0 0 -4 0 0 -8 8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 - [...]
+1 1 -4 -6 0 4 -8 0 4 0 0 -4 -2 4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 -4 -4 0 4 4 0 0 0 4 4 -2 0 -2 0 16 -1 -4 -6 8 -4 0 8 -8 -8 0 6 0 -4 0 8 4 -8 0 0 4 0 8 -4 4 0 -8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 4 -4 0 0 -4 0 0 4 -4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8 [...]
+1 1 0 -10 -4 8 -8 -4 4 4 4 -4 -2 12 -8 -4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 -12 4 8 4 -4 0 8 -8 -16 4 -2 8 -2 0 -24 -1 0 -6 -24 4 12 0 8 8 12 6 -4 4 -4 8 4 0 -8 8 0 -8 0 16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 -8 0 24 0 0 12 16 8 4 8 -16 -12 -8 -16 -16 16 16 -8 -16 16 -16 16 -8 -4 8 -8 0 8 -4 0 0 -4 16 -16 8 -8 -4 0 -4 0 6 24 -4 0 -12 4 -4 - [...]
+1 1 -12 0 6 0 0 8 -8 -24 6 24 0 0 0 -12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 48 0 0 6 24 6 0 0 3 0 0 0 0 24 0 0 -24 -24 12 -24 0 24 0 0 0 -24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 24 -24 0 0 0 0 12 0 -48 24 0 0 0 0 -48 24 48 [...]
+1 1 -8 -2 4 0 -8 4 -4 -12 -4 12 -2 -4 8 4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 4 4 -8 4 -4 0 -8 8 -8 4 -2 -8 -2 0 -8 -1 8 2 8 4 4 0 8 8 -4 -2 -4 4 4 8 4 0 8 -8 8 -8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2 [...]
+1 1 -12 0 6 0 0 -8 8 24 6 -24 0 0 0 -12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 -48 0 0 6 24 6 0 0 3 0 0 0 0 -24 0 0 -24 24 12 24 0 -24 0 0 0 -24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 -24 24 0 0 0 0 12 0 -48 24 0 0 0 0 48 -24 -48 [...]
+1 1 -8 -2 4 0 -8 -4 4 12 -4 -12 -2 -4 8 4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 4 4 -8 4 -4 0 -8 -8 8 4 -2 -8 -2 0 -8 -1 -8 2 8 4 -4 0 8 8 4 -2 4 4 -4 8 4 0 8 -8 -8 8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2 [...]
+1 -1 8 -10 4 -8 -8 4 -4 12 4 4 2 -4 -8 4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 4 -4 -8 -4 4 -16 -8 8 0 -4 2 8 2 -16 -8 1 0 -2 -8 -4 4 0 -8 8 4 2 4 -4 4 8 4 0 8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 8 4 -8 -8 0 0 4 0 0 -4 0 0 8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4 -4 0 0 0 [...]
+1 -1 4 -6 0 -4 16 0 -4 0 0 -4 -6 -4 8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 -4 -4 0 4 -4 0 -8 0 4 4 2 0 2 0 -8 1 4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 0 -4 0 0 8 4 0 0 4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -8 -8 -8 -4 -4 4 4 0 4 -4 0 0 4 8 8 -4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 0 [...]
+1 -1 8 -8 2 -8 16 0 8 0 -2 8 0 -8 0 -16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 -8 0 16 16 4 16 -16 0 -8 0 -2 -8 -2 16 -16 -3 -8 -8 0 0 0 0 0 0 0 -12 0 -16 0 16 -8 0 0 0 -8 0 0 -8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 0 8 8 -4 -8 16 4 0 -8 0 0 8 -8 0 4 0 4 -8 -16 16 4 0 0 -16 -16 -8 16 4 16 32 8 0 0 8 -1 [...]
+1 -1 0 2 0 -8 0 4 4 0 0 -4 2 4 0 -4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 4 4 -8 -12 0 -8 0 -8 4 4 -2 0 2 16 0 -3 8 -6 0 -4 -4 -8 0 0 0 -6 0 12 -12 0 -4 0 0 0 -4 0 8 -8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 -4 -8 4 0 0 -12 0 0 4 0 8 -4 0 4 -4 -4 4 6 0 12 0 4 0 -12 0 6 8 4 -8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12 [...]
+1 -1 0 -2 0 -4 0 0 4 4 0 -4 2 4 0 -4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 2 0 -2 8 0 -3 -4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 8 0 0 0 -8 0 4 4 -8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 -4 0 0 0 0 0 -4 -8 8 0 0 0 4 0 0 8 0 -8 0 8 0 -8 0 4 -4 -4 0 0 0 -4 0 0 4 8 0 0 0 -4 4 4 -4 -2 0 4 0 0 12 4 0 -2 -8 4 8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0 - [...]
+1 -1 0 -6 0 0 0 -4 -4 0 0 12 2 4 0 -4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 4 4 -8 4 0 8 0 -24 -4 4 6 0 -6 0 0 -3 0 2 0 -4 -12 -8 0 0 0 2 0 -4 12 0 -4 0 0 0 4 0 8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 12 0 0 0 0 0 -4 0 0 -12 24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 -4 0 -4 0 0 4 0 0 4 0 8 4 0 4 -4 -4 4 -2 0 -4 0 12 0 4 0 -2 8 -12 -8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0 [...]
+1 -1 4 -4 2 -8 -8 0 8 4 -2 16 8 0 -8 -12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 8 0 0 -8 0 8 -8 0 -4 -8 -2 0 2 0 8 1 0 4 -8 0 -8 8 8 0 4 -4 -4 0 0 8 0 -16 0 8 -4 -8 -8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 8 8 -8 0 0 8 0 -8 0 0 -8 4 8 8 0 8 0 8 0 -8 16 8 -8 -8 -8 -12 4 4 8 -4 -8 0 16 8 -12 4 0 0 0 0 4 8 -8 4 -8 -4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8 0 [...]
+1 -1 0 2 -4 -4 0 0 4 0 -4 -4 2 4 8 -4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 -4 -4 0 4 4 0 8 0 -4 -4 -2 8 -2 0 -8 1 4 6 0 -4 0 0 -16 0 0 -6 0 4 0 0 4 0 0 -8 -4 0 0 4 4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 16 0 0 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 -4 -8 8 4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0 [...]
+1 -1 0 6 -4 -8 8 4 12 -4 -4 -12 2 4 8 -12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 -4 -4 -8 -4 4 0 24 8 0 -4 2 -8 2 0 -8 1 16 -10 -8 -4 -12 0 24 -8 -12 10 4 -4 4 -8 12 0 8 -8 -16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 -24 0 8 0 0 4 16 -8 -4 -8 -16 12 8 16 16 -16 -16 8 -16 16 -16 16 -8 4 8 -8 0 -8 4 0 0 -12 16 -16 8 8 4 0 4 0 10 8 4 0 12 -4 4 [...]
+1 -1 -4 2 0 -4 8 0 4 0 0 -4 2 4 0 -8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 -4 4 0 -4 -4 0 -16 0 4 -4 2 0 2 0 0 1 -4 -2 8 4 0 8 -8 8 0 2 0 4 0 -8 4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 -4 4 0 0 -4 0 0 4 4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8 2 8 [...]
+1 -1 0 4 -2 -8 8 0 0 -4 2 8 0 0 0 -8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 -4 -8 0 0 8 8 0 -4 4 -4 0 0 -8 8 0 0 0 4 8 -8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 8 8 0 0 0 -4 0 0 8 0 8 -8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 8 -8 0 4 0 0 0 0 0 -4 0 0 4 0 -4 0 0 4 8 0 -8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 -1 0 -2 -4 0 8 -4 -4 4 -4 4 2 -4 8 -4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 4 -4 -8 -4 4 0 8 -8 -8 -4 2 -8 2 0 8 1 -8 -2 8 -4 12 0 8 -8 12 2 -4 -4 -4 -8 4 0 8 -8 8 -8 0 8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 -16 -16 16 16 8 0 0 0 0 0 4 0 0 0 -8 4 0 0 -4 0 0 0 8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 -8 -8 -4 0 8 4 8 -12 8 8 4 -2 [...]
+1 -1 0 0 -2 -4 8 -4 0 0 2 8 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 -8 0 0 -8 0 -8 0 0 -2 0 2 0 0 1 4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 -8 0 0 -8 0 0 -4 0 8 8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 8 0 0 8 0 8 0 -8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 8 0 -8 8 0 0 0 0 0 4 0 0 -4 4 0 0 0 -4 -8 0 8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 0 [...]
+1 -1 0 6 -4 -8 -8 4 4 4 -4 -12 2 4 8 4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 16 -8 8 0 -4 2 -8 2 -16 -8 1 0 -2 8 -4 -12 0 8 8 12 2 -4 -4 4 8 -4 0 -8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 8 4 0 0 4 0 0 -8 -8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 -2 4 4 [...]
+1 -1 0 8 -6 -8 0 0 -8 0 6 8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 -12 -16 0 0 8 0 -2 8 -2 16 0 -3 -8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 12 0 0 4 0 0 0 0 -8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0 0 [...]
+1 -1 -4 8 -2 -8 0 0 -8 0 2 8 0 0 0 4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 4 -16 0 0 -8 0 -6 8 -6 16 0 -3 8 0 0 0 0 -16 0 -24 0 4 0 0 0 0 0 16 8 0 -8 0 -16 8 0 0 16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 -12 0 8 0 16 -16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 4 4 0 4 8 0 16 -16 -8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0 [...]
+1 -1 4 -2 0 -8 -8 4 -4 4 0 -12 -6 4 8 16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 4 -4 -8 -4 -4 0 8 -8 8 4 -2 0 -2 0 -8 1 0 -2 8 -4 4 -16 -8 0 -4 10 -4 4 4 -8 -4 16 -8 8 8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 -8 -4 8 0 0 -4 4 0 0 4 -16 -16 0 4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8 [...]
+1 -1 4 -10 0 0 -8 -4 -4 -4 0 4 -6 12 8 8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 -4 0 -8 8 0 4 -2 0 -2 0 8 1 8 6 -8 -4 -4 16 8 0 4 2 4 4 -4 -8 4 -16 -8 8 0 -8 0 8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 -8 0 8 0 0 4 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 0 -4 0 8 0 -4 4 0 0 -4 0 0 -8 4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4 [...]
+1 -1 8 -8 2 -8 -16 0 8 0 -2 8 0 8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 8 0 -16 -16 4 16 16 0 -8 0 -2 -8 -2 16 16 -3 -8 8 0 0 0 0 0 0 0 4 0 16 0 -16 8 0 0 0 -8 0 0 -8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 0 8 8 -4 -8 -16 4 0 8 0 0 8 -8 0 4 0 4 8 16 -16 4 0 0 16 16 8 -16 4 -16 32 8 0 0 -8 -16 0 [...]
+1 -1 0 -6 4 -4 8 0 -4 0 4 -4 -6 4 0 4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 4 4 0 -4 4 0 0 0 -4 4 -2 -8 -2 0 0 1 -4 -2 -8 4 0 8 -8 0 0 -6 0 -4 0 8 4 8 0 -16 -4 0 8 -4 -4 0 8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 -4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8 [...]
+1 -1 4 -8 6 -8 0 0 8 0 -6 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 -12 16 0 0 8 0 2 8 2 16 0 -3 8 0 0 0 0 -16 0 -8 0 4 0 0 0 0 0 -16 -8 0 8 0 -16 8 0 0 -16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 4 0 24 0 16 16 0 -16 0 0 0 -16 0 0 16 16 16 16 0 -16 -16 -16 -16 8 0 8 8 -12 -4 0 4 24 0 -16 -16 8 -4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 -16 -8 0 0 [...]
+1 -1 4 -4 2 -8 8 0 0 -4 -2 0 -8 0 8 4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 -8 0 0 8 0 8 8 0 -4 8 -2 0 2 0 -8 1 0 -4 8 0 8 8 -8 0 -4 4 4 0 0 -8 0 -16 0 -8 -4 8 -8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 -8 8 8 0 0 -8 0 8 0 0 -8 -4 -8 8 0 8 0 -8 0 -8 16 8 -8 8 -8 -12 4 4 -8 -4 -8 0 16 8 -12 4 0 0 0 0 -4 -8 8 4 8 4 0 8 4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4 [...]
+1 -1 4 -8 2 -4 8 -4 8 -8 -2 0 -8 8 8 -4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 2 0 -2 8 8 1 -4 4 -8 0 -4 -16 8 0 8 -4 0 0 4 -8 -8 8 0 -8 0 0 0 -4 8 0 -8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 8 -8 -8 0 0 0 8 0 4 8 16 8 -8 0 8 0 8 -8 8 16 -8 0 -12 8 -12 -8 4 4 8 4 8 -8 -8 0 -8 4 0 0 0 0 4 8 -8 -4 -4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8 [...]
+1 -1 0 -2 0 -4 0 0 -4 12 0 -4 2 -4 0 4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 -6 0 6 8 0 -3 -4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 -8 0 0 0 -24 0 4 4 8 8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 12 0 0 0 0 0 4 8 24 0 0 0 12 0 0 8 0 -8 0 -8 0 8 0 4 -4 -4 0 0 0 -4 0 0 -4 -8 0 0 0 -4 4 4 -4 -2 0 4 0 0 -12 4 0 -2 8 -12 -8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0 [...]
+1 -1 0 -6 0 0 0 4 -4 0 0 4 2 -4 0 4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 -4 4 8 4 0 8 0 -8 -4 4 -2 0 2 0 0 -3 0 2 0 -4 -4 8 0 0 0 2 0 -4 -12 0 4 0 0 0 4 0 -8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 -4 0 0 0 0 0 4 0 0 12 8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 -4 0 -4 0 0 4 0 0 -4 0 -8 4 0 4 -4 -4 4 -2 0 -4 0 4 0 4 0 -2 -8 4 8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2 0 [...]
+1 -1 0 -10 0 4 0 0 -4 4 0 4 2 -4 0 4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 16 0 0 8 4 2 0 -2 -8 0 -3 4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 -8 0 0 -8 -8 0 -4 -12 8 8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 -16 -8 16 8 0 -8 0 8 0 -4 -4 4 -8 0 0 12 0 0 -4 -8 0 8 0 -4 4 4 -4 6 0 -12 0 0 12 -12 0 6 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4 [...]
+1 -1 4 -8 2 -4 -8 4 8 8 -2 8 8 -8 -8 -4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 2 0 -2 8 -8 1 -4 -4 8 0 4 -16 -8 0 -8 4 0 0 -4 8 8 8 0 8 0 0 0 -4 -8 0 -8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 -8 -8 8 0 0 0 8 0 -4 -8 16 -8 8 0 8 0 8 8 8 16 -8 0 -12 -8 -12 -8 4 4 -8 4 8 8 -8 0 -8 4 0 0 0 0 -4 -8 8 -4 4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 -8 [...]
+1 -1 -4 -2 0 0 0 -4 -4 4 0 4 2 4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 -4 4 -8 4 -4 0 0 8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 -4 -8 0 0 -4 2 -4 -4 -4 0 -4 -8 8 0 0 8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 4 -4 0 0 4 8 -8 0 -4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4 [...]
+1 -1 0 4 -2 -8 -8 0 -8 4 2 8 0 0 0 8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 4 8 0 0 8 -8 0 4 -4 4 0 0 8 -8 0 0 0 4 -8 -8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 8 -8 0 0 0 4 0 0 8 0 8 8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 -8 -8 0 4 0 0 0 0 0 4 0 0 4 0 4 0 0 -4 -8 0 8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -4 -2 0 0 0 4 4 -4 0 -4 2 4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 -4 4 -8 4 -4 0 0 -8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 4 8 0 0 4 2 4 -4 4 0 -4 8 8 0 0 -8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 4 -4 0 0 4 -8 8 0 -4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4 8 [...]
+1 -1 0 -6 -4 4 0 0 -4 0 -4 4 2 -4 8 4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 4 -4 0 4 4 0 -8 0 4 -4 -2 8 -2 0 8 1 -4 -2 -16 -4 0 0 0 0 0 2 0 4 0 0 -4 0 0 -8 4 0 0 -4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 16 0 0 -4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 4 8 -8 -4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0 [...]
+1 -1 0 0 -2 -4 -8 4 0 0 2 0 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 8 0 0 -8 0 8 0 0 -2 0 2 0 0 1 4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 -8 0 0 -8 0 0 -4 0 -8 8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 8 0 0 8 0 8 0 8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 -8 0 -8 8 0 0 0 0 0 -4 0 0 -4 -4 0 0 0 4 8 0 -8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -10 -4 8 -8 -4 -4 -4 -4 12 2 4 8 4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 -16 -8 -8 0 -4 2 -8 2 16 -8 1 0 -2 8 -4 12 0 8 8 -12 2 4 -4 -4 8 -4 0 -8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 8 4 0 0 4 0 0 8 -8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 -2 4 [...]
+1 -1 0 -4 -2 0 -8 0 8 -4 2 0 0 8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 4 8 0 0 -8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 -4 8 8 -8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 -8 8 0 0 0 -4 0 0 8 0 8 8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 4 0 0 4 0 -4 0 0 -4 8 0 -8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 [...]
+1 -1 0 -8 -2 4 -8 -4 8 0 2 0 0 8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 -8 0 -8 -8 0 -2 0 2 0 0 1 -4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 8 0 0 0 0 0 4 0 8 -8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 -8 0 0 8 0 8 0 8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 -4 0 0 -4 4 0 0 0 4 -8 0 8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 -2 0 [...]
+1 -1 -8 -2 4 0 8 -4 4 12 4 -12 2 4 -8 -4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 4 0 8 -8 8 -4 2 8 2 0 8 1 -8 -2 -8 -4 -4 0 -8 -8 4 2 4 -4 -4 -8 -4 0 -8 8 -8 8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2 4 4 8 [...]
+1 -1 -4 0 2 -4 0 -4 0 8 -2 0 0 0 0 4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 2 0 -2 -8 0 1 4 4 0 8 -4 -8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 4 8 8 -8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 8 0 -8 0 4 0 0 -4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -8 -2 4 0 8 4 -4 -12 4 12 2 4 -8 -4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 4 0 8 8 -8 -4 2 8 2 0 8 1 8 -2 -8 -4 4 0 -8 -8 -4 2 -4 -4 4 -8 -4 0 -8 8 8 -8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2 4 4 -8 [...]
+1 -1 -4 -6 0 4 8 0 -4 0 0 4 2 -4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 4 4 0 -4 -4 0 0 0 -4 -4 2 0 2 0 -16 1 4 6 -8 4 0 -8 8 8 0 -6 0 4 0 -8 -4 8 0 0 -4 0 -8 4 -4 0 8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 -4 4 0 0 4 0 0 -4 4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8 -6 [...]
+1 -1 -4 -4 2 0 0 0 0 -4 -2 8 0 0 0 4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 -8 0 0 4 8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 -8 0 8 0 4 0 0 4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2 0 8 [...]
+1 -1 -4 0 2 -4 0 4 0 -8 -2 8 0 0 0 4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 2 0 -2 -8 0 1 4 -4 0 -8 4 -8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 -4 -8 8 8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 -8 0 8 0 -4 0 0 -4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0 0 [...]
+1 -1 -4 -4 2 0 0 0 8 4 -2 -8 0 0 0 4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 -8 0 0 4 -8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 8 0 -8 0 -4 0 0 4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -4 -2 0 8 0 0 4 2 0 0 -8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 -4 -8 0 0 -8 8 0 4 4 4 0 0 -8 0 0 0 0 -4 -8 8 -8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 -8 -8 0 0 0 4 0 0 8 0 8 -8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 -4 0 0 4 0 4 0 0 4 -8 0 8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 0 [...]
+1 -1 0 -10 -4 8 8 4 -4 -4 -4 4 2 -12 8 4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 12 -4 -8 -4 4 0 -8 8 16 -4 2 -8 2 0 24 1 0 6 24 -4 -12 0 -8 -8 -12 -6 4 -4 4 -8 -4 0 8 -8 0 8 0 -16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 8 0 -24 0 0 -12 -16 -8 -4 -8 16 12 8 16 16 -16 -16 8 16 -16 16 -16 8 4 -8 8 0 -8 4 0 0 4 -16 16 -8 8 4 0 4 0 -6 -24 4 0 12 -4 4 8 [...]
+1 -1 0 -8 -2 4 8 4 8 0 2 -8 0 -8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 -8 0 8 -8 0 -2 0 2 0 0 1 -4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 8 0 0 0 0 0 4 0 -8 -8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 -8 0 0 8 0 8 0 -8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 4 0 0 -4 -4 0 0 0 -4 8 0 -8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0 [...]
+1 -1 0 0 -6 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 6 -24 6 0 0 -3 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 -12 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 -12 0 0 0 0 0 0 0 4 0 4 0 0 0 -12 0 0 0 0 0 0 -12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0 [...]
+1 -1 -4 0 -2 0 0 0 0 0 2 0 0 0 0 4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 4 0 0 0 0 0 2 -8 2 0 0 -3 0 0 0 0 0 0 0 -8 0 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 4 0 -8 0 -16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 4 -8 0 0 0 0 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0 0 0 0 [...]
+1 -1 0 -8 -6 8 0 0 8 0 6 -8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 -12 16 0 0 -8 0 -2 8 -2 -16 0 -3 8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 12 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 -8 -8 8 2 8 0 0 0 4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 16 0 0 2 8 2 0 0 -3 0 0 0 0 8 0 0 8 8 -12 -24 0 -24 0 0 0 -24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 8 -24 0 0 0 0 4 0 16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -8 0 2 0 0 0 0 0 -2 0 0 0 0 8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 -2 -8 -2 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 8 0 4 0 0 0 0 0 8 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 -32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 8 8 -8 2 -8 0 0 0 4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 -16 0 0 2 8 2 0 0 -3 0 0 0 0 -8 0 0 8 -8 -12 24 0 24 0 0 0 -24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 -8 24 0 0 0 0 4 0 16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -4 -8 -2 8 0 0 8 0 2 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 4 16 0 0 8 0 -6 8 -6 -16 0 -3 -8 0 0 0 0 16 0 -24 0 4 0 0 0 0 0 -16 8 0 8 0 16 -8 0 0 -16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 -12 0 8 0 16 -16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 4 4 0 4 8 0 -16 16 8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0 [...]
+1 -1 -12 0 6 0 0 8 -8 -24 -6 24 0 0 0 12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 24 0 0 24 -24 -12 -24 0 24 0 0 0 24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 24 -24 0 0 0 0 -12 0 48 24 0 0 0 0 48 [...]
+1 -1 -12 0 6 0 0 -8 8 24 -6 -24 0 0 0 12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 -48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 -24 0 0 24 24 -12 24 0 -24 0 0 0 24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 -24 24 0 0 0 0 -12 0 48 24 0 0 0 0 -48 [...]
+1 -3 12 -12 6 -8 -16 8 0 24 6 16 -4 -8 -16 4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 12 -16 -16 48 -8 -8 6 24 6 -16 -16 3 -8 -4 -16 -8 24 -16 -16 24 24 8 24 -8 24 -16 -8 -16 24 -16 -8 48 -16 -8 -8 -16 -16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 12 -16 24 -16 48 16 -8 -16 48 24 48 -16 24 -16 -16 -16 [...]
+1 -3 4 -4 2 -4 0 4 0 8 2 0 -4 0 0 4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 -2 0 2 8 0 -1 -4 0 0 0 4 -8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 -8 -4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 -4 -8 8 -8 0 0 8 0 8 0 0 8 0 8 -4 8 -4 0 -4 -4 8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 -8 4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 [...]
+1 -3 4 -8 2 0 0 0 0 4 2 8 -4 0 0 4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 8 0 0 -4 8 2 0 -2 0 0 -1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 -8 0 0 -4 -8 0 0 -8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 8 0 8 0 0 8 0 8 0 0 8 0 -4 -4 -4 -8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 8 -4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8 [...]
+1 -3 8 -6 4 -8 -8 4 12 12 -4 20 2 -4 -8 -12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 4 -4 -8 -4 -4 16 -8 8 0 -4 -2 -8 -2 16 -8 -1 0 -2 -8 -4 4 0 -8 -8 4 -6 4 -4 4 8 4 0 -8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 -8 4 8 8 0 0 4 0 0 -4 0 0 -8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 [...]
+1 -3 4 -4 -2 0 0 0 0 0 -2 0 -4 0 16 4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 -4 0 0 0 0 -8 -2 8 -2 0 0 3 0 4 -16 -8 0 0 -16 -8 0 0 0 8 0 0 0 0 -8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 -4 -16 -8 -16 16 16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 4 8 -4 -8 0 0 0 0 4 -8 4 -8 4 4 0 8 -4 0 0 8 0 4 0 -4 0 16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 [...]
+1 -3 4 -4 -2 0 16 0 0 0 -2 0 -4 -8 16 -4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 -8 -8 -16 -8 -4 0 16 0 0 -8 6 -8 6 0 16 3 0 -4 16 -8 0 0 16 -24 0 -8 0 -8 0 16 -8 0 8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 12 16 8 16 -16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 4 -8 -4 8 -8 0 0 0 4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 -16 12 -16 16 -8 16 1 [...]
+1 -3 0 -4 2 0 16 0 0 0 2 0 -4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 -4 0 -16 0 0 -8 2 -8 2 0 -16 3 0 4 0 8 0 0 0 0 0 -8 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 0 -8 12 0 0 0 0 0 0 8 -4 8 -4 4 -16 -8 12 0 0 8 -16 4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4 [...]
+1 -3 4 -2 0 -4 16 0 4 0 0 4 -6 -4 8 -8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 -4 -4 0 4 4 0 -8 0 -4 4 -2 0 -2 0 -8 -1 -4 -2 0 -4 0 0 0 8 0 2 0 -4 0 0 -4 0 0 8 -4 0 0 -4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 8 8 8 4 -4 -4 -4 0 -4 -4 0 0 4 -8 -8 4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 - [...]
+1 -3 0 4 -2 -4 0 4 8 0 -2 -8 4 8 8 -8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 -8 8 8 0 0 2 0 -2 0 -8 -1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 0 0 0 -8 -8 0 -8 -4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 -4 8 0 0 -8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 -8 0 4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8 [...]
+1 -3 -4 0 2 0 8 0 0 -4 2 8 4 8 -8 -4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 -8 -8 0 -4 0 2 0 -2 0 8 -1 8 -8 8 8 -8 -8 -8 0 -4 0 4 8 0 -8 -8 -16 0 8 12 8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 -8 8 8 0 0 0 16 8 0 0 -8 -4 8 -8 0 -8 0 -8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 -8 0 8 4 4 8 0 -8 0 -8 8 0 -4 -8 4 8 -8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4 [...]
+1 -3 0 6 0 -8 0 4 -4 0 0 12 2 4 0 -4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 4 4 -8 -12 0 8 0 -8 -4 4 2 0 -2 -16 0 3 -8 -6 0 -4 -4 8 0 0 0 -6 0 12 -12 0 -4 0 0 0 4 0 -8 8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 -4 8 -4 0 0 -12 0 0 4 0 -8 4 0 4 4 -4 -4 6 0 12 0 4 0 -12 0 6 8 -4 -8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 - [...]
+1 -3 -4 0 2 0 8 0 8 4 2 -8 4 8 -8 -4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 -8 -8 0 12 0 2 0 -2 0 8 -1 -8 0 8 -8 8 8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 -4 -8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 -8 8 8 0 0 0 0 -8 0 0 8 4 8 -8 0 -8 0 -8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 -8 16 -8 4 4 -8 0 8 0 0 8 0 -4 8 -4 -8 -8 8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 -3 0 -4 -2 4 0 -4 0 0 -2 8 4 0 8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 -8 8 -8 -8 0 2 0 -2 0 -8 -1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 8 4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 8 -8 0 4 -8 0 0 -8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 -8 8 0 8 0 0 0 0 0 0 -8 0 4 4 0 0 8 0 8 0 -8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0 [...]
+1 -3 0 2 0 -4 0 0 4 4 0 4 2 4 0 -4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 -2 0 2 -8 0 3 4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 -8 0 0 0 -8 0 -4 4 -8 8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 4 0 0 0 0 0 -4 8 8 0 0 0 4 0 0 -8 0 8 0 -8 0 8 0 -4 -4 4 0 0 0 -4 0 0 4 -8 0 0 0 -4 -4 4 4 -2 0 4 0 0 12 4 0 -2 -8 -4 8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0 0 2 [...]
+1 -3 0 -2 0 0 0 -4 4 0 0 12 2 4 0 -4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 4 4 -8 4 0 -8 0 -24 4 4 -6 0 6 0 0 3 0 2 0 -4 -12 8 0 0 0 2 0 -4 12 0 -4 0 0 0 -4 0 -8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 -12 0 0 0 0 0 -4 0 0 -12 24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 -4 0 4 0 0 4 0 0 4 0 -8 -4 0 4 4 -4 -4 -2 0 -4 0 12 0 4 0 -2 8 12 -8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4 [...]
+1 -3 0 0 -2 0 0 0 0 4 -2 0 4 0 8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 -4 0 -2 0 2 -8 8 -1 -8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 -8 0 -8 4 -8 0 0 0 -8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 8 4 -8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 8 0 -8 -4 0 0 0 0 0 0 8 0 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0 0 [...]
+1 -3 0 6 -4 -4 0 0 -4 0 4 4 2 4 8 -4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 -4 -4 0 4 -4 0 8 0 4 -4 2 -8 2 0 -8 -1 -4 6 0 -4 0 0 -16 0 0 2 0 4 0 0 4 0 0 -8 4 0 0 -4 4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 16 0 0 0 0 4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 -4 8 -8 -4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4 0 4 [...]
+1 -3 -4 6 0 -4 8 0 -4 0 0 4 2 4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 -4 4 0 -4 4 0 -16 0 -4 -4 -2 0 -2 0 0 -1 4 -2 8 4 0 -8 -8 -8 0 10 0 4 0 -8 4 8 0 0 -4 0 -8 4 -4 0 8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 4 4 0 0 -4 0 0 -4 -4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8 [...]
+1 -3 0 2 -4 0 8 -4 -4 4 4 4 2 -4 8 -4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 4 -4 -8 -4 -4 0 8 -8 8 -4 -2 8 -2 0 8 -1 8 -2 8 -4 12 0 8 8 12 -6 -4 -4 -4 -8 4 0 -8 -8 -8 -8 0 -8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 16 16 -16 -16 8 0 0 0 0 0 4 0 0 0 8 4 0 0 -4 0 0 0 -8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 [...]
+1 -3 4 4 -2 -8 -16 8 0 8 -2 -16 -4 8 16 12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 -4 16 -16 -16 8 -8 -2 -8 -2 -16 -16 3 -8 -4 16 -8 -8 -16 16 8 8 8 -24 -8 24 -16 8 16 -24 16 8 16 -16 -8 -8 16 16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 -4 16 8 16 -16 -16 8 16 16 24 -16 -16 8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 -4 [...]
+1 -3 0 10 -4 -8 -8 4 -12 4 4 4 2 4 8 4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 -16 -8 8 0 -4 -2 8 -2 16 -8 -1 0 -2 8 -4 -12 0 8 -8 12 -6 -4 -4 4 8 -4 0 8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 -8 4 0 0 4 0 0 8 8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 0 [...]
+1 -3 0 -4 2 0 0 0 0 0 2 0 -4 8 0 8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 8 8 -16 8 -4 0 0 0 0 -8 -6 -8 -6 0 0 3 0 -4 0 8 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 12 0 0 0 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 8 -4 0 8 0 0 0 0 8 -4 8 -4 -4 0 8 -4 0 0 -8 0 -4 -16 12 -16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0 [...]
+1 -3 4 2 0 -8 -8 4 -4 4 0 4 -6 4 8 8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 4 -4 -8 -4 4 0 8 -8 -8 4 2 0 2 0 -8 -1 0 -2 8 -4 4 16 -8 0 -4 2 -4 4 4 -8 -4 -16 8 8 -8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 8 -4 -8 0 0 4 4 0 0 4 16 16 0 -4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4 -4 [...]
+1 -3 4 -12 -2 8 -16 -8 0 -8 -2 16 -4 8 16 12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 8 -8 16 -8 -4 -16 -16 16 -8 -8 -2 -8 -2 16 -16 3 8 -4 16 -8 8 16 16 8 -8 8 24 -8 -24 -16 8 -16 -24 16 -8 -16 16 8 -8 16 -16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 -4 16 8 16 -16 -16 8 -16 -16 -24 16 16 -8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 - [...]
+1 -3 4 -6 0 0 -8 -4 12 -4 0 4 -6 12 8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 4 0 -8 8 0 4 2 0 2 0 8 -1 -8 6 -8 -4 -4 -16 8 0 4 -6 4 4 -4 -8 4 16 8 8 0 -8 0 -8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 -8 0 8 0 0 4 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 0 -4 0 -8 0 4 4 0 0 -4 0 0 8 -4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 -3 -4 -4 6 0 16 0 0 0 6 0 -4 8 -16 4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 8 -8 16 -8 12 0 16 0 0 -8 -2 -8 -2 0 16 3 0 -4 -16 -8 0 0 -16 -8 0 -8 0 -8 0 16 8 0 -8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 -4 -16 24 -16 -16 16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 12 -4 -8 -4 24 8 0 0 0 -4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 16 -4 16 -16 - [...]
+1 -3 0 -2 4 -4 8 0 4 0 -4 4 -6 4 0 4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 4 4 0 -4 -4 0 0 0 4 4 2 8 2 0 0 -1 4 -2 -8 4 0 -8 -8 0 0 2 0 -4 0 8 4 -8 0 -16 4 0 -8 4 -4 0 -8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 -4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 -2 -8 [...]
+1 -3 -4 -4 2 4 8 -4 0 8 2 0 4 0 -8 4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 8 0 -2 0 2 -8 -8 -1 -4 0 -8 -8 -4 -16 8 0 -8 -8 0 8 4 -8 0 -8 0 8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 8 -8 -8 0 0 -8 8 0 4 8 0 -8 8 0 -8 0 -8 -8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 -8 0 8 0 0 -8 0 4 -4 0 8 8 -8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 -3 0 2 0 -4 0 0 -4 12 0 4 2 -4 0 4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 6 0 -6 -8 0 3 4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 8 0 0 0 -24 0 -4 4 8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 -12 0 0 0 0 0 4 -8 24 0 0 0 12 0 0 -8 0 8 0 8 0 -8 0 -4 -4 4 0 0 0 -4 0 0 -4 8 0 0 0 -4 -4 4 4 -2 0 4 0 0 -12 4 0 -2 8 12 -8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0 [...]
+1 -3 -4 -4 2 4 8 4 0 -8 2 8 4 0 -8 4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 -8 0 -2 0 2 -8 -8 -1 12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 8 0 8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 8 -8 -8 0 0 -8 -8 0 -4 -8 16 8 8 0 -8 0 -8 -8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 8 0 -8 0 8 -8 0 4 4 0 -8 8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4 - [...]
+1 -3 0 -8 -2 8 0 0 0 -4 -2 8 4 -8 8 8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 4 0 -2 0 2 -8 8 -1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 8 0 -8 -4 8 0 -8 0 8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 -8 -4 -8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 8 0 -4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 [...]
+1 -3 0 -2 0 0 0 4 4 0 0 4 2 -4 0 4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 -4 4 8 4 0 -8 0 -8 4 4 2 0 -2 0 0 3 0 2 0 -4 -4 -8 0 0 0 2 0 -4 -12 0 4 0 0 0 -4 0 8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 4 0 0 0 0 0 4 0 0 12 8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 -4 0 4 0 0 4 0 0 -4 0 8 -4 0 4 4 -4 -4 -2 0 -4 0 4 0 4 0 -2 -8 -4 8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0 8 2 [...]
+1 -3 0 -6 0 4 0 0 12 4 0 -4 2 -4 0 4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 -16 0 0 -8 4 -2 0 2 8 0 3 -4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 8 0 0 8 -8 0 4 -12 8 -8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 16 8 -16 -8 0 8 0 -8 0 4 -4 -4 8 0 0 12 0 0 -4 8 0 -8 0 -4 -4 4 4 6 0 -12 0 0 12 -12 0 6 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 4 [...]
+1 -3 -4 2 0 0 0 -4 -4 4 0 4 2 4 0 8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 -4 4 -8 4 4 0 0 8 0 -4 2 0 2 0 0 -1 0 -2 0 4 -4 8 0 0 -4 -6 -4 -4 -4 0 -4 8 -8 0 0 8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 -4 -4 0 0 4 -8 8 0 4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 -8 - [...]
+1 -3 -4 2 0 0 0 4 4 -4 0 -4 2 4 0 8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 -4 4 -8 4 4 0 0 -8 0 -4 2 0 2 0 0 -1 0 -2 0 4 4 -8 0 0 4 -6 4 -4 4 0 -4 -8 -8 0 0 -8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 -4 -4 0 0 4 8 -8 0 4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 8 [...]
+1 -3 0 -2 -4 4 0 0 4 0 4 -4 2 -4 8 4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 -4 2 -8 2 0 8 -1 4 -2 -16 -4 0 0 0 0 0 10 0 4 0 0 -4 0 0 -8 -4 0 0 4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 16 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 4 -8 8 4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4 0 [...]
+1 -3 0 -6 -4 8 -8 -4 12 -4 4 -4 2 4 8 4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 16 -8 -8 0 -4 -2 8 -2 -16 -8 -1 0 -2 8 -4 12 0 8 -8 -12 -6 4 -4 -4 8 -4 0 8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 -8 4 0 0 4 0 0 -8 8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4 [...]
+1 -3 -8 2 4 0 8 -4 4 12 -4 -12 2 4 -8 12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 -4 0 8 -8 -8 -4 -2 -8 -2 0 8 -1 8 -2 -8 -4 -4 0 -8 8 4 -6 4 -4 -4 -8 -4 0 8 8 8 8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4 [...]
+1 -3 -8 2 4 0 8 4 -4 -12 -4 12 2 4 -8 12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 -4 0 8 8 8 -4 -2 -8 -2 0 8 -1 -8 -2 -8 -4 4 0 -8 8 -4 -6 -4 -4 4 -8 -4 0 8 8 -8 -8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4 [...]
+1 -3 -4 -2 0 4 8 0 4 0 0 -4 2 -4 0 8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 4 4 0 -4 4 0 0 0 4 -4 -2 0 -2 0 -16 -1 -4 6 -8 4 0 8 8 -8 0 2 0 4 0 -8 -4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 4 4 0 0 4 0 0 4 -4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6 [...]
+1 -3 0 -6 -4 8 8 4 12 -4 4 -12 2 -12 8 4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 12 -4 -8 -4 -4 0 -8 8 -16 -4 -2 8 -2 0 24 -1 0 6 24 -4 -12 0 -8 8 -12 -14 4 -4 4 -8 -4 0 -8 -8 0 8 0 16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 8 0 -24 0 0 -12 16 -8 -4 -8 -16 12 8 -16 -16 16 16 8 -16 16 -16 16 -8 4 8 -8 0 8 4 0 0 4 16 -16 8 -8 4 0 4 0 -6 -24 4 0 12 -4 4 8 [...]
+1 -5 8 -6 4 0 -8 4 4 12 4 12 -10 -4 -8 4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 -12 4 8 4 4 16 8 8 -8 4 2 8 2 16 8 1 -8 2 8 4 4 -16 8 8 4 6 4 4 4 -24 -12 -16 8 -24 -8 8 -16 -8 4 8 -16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 -16 -4 16 16 0 0 -4 0 0 12 0 0 -16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 12 -1 [...]
+1 -5 12 -4 6 -8 -16 8 16 24 -6 32 -4 -8 -16 -20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 -12 16 -16 48 8 -8 -6 -24 -6 16 -16 -3 8 -4 -16 -8 24 16 -16 -24 24 -16 24 -8 24 -16 -8 16 -24 -16 8 48 16 8 -8 -16 16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 -12 -16 -24 -16 -48 -16 -8 16 48 24 48 16 24 -16 16 16 16 16 -16 1 [...]
+1 -5 4 2 0 0 -8 4 4 4 0 -4 -2 4 8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 4 4 8 4 -4 0 -8 -8 0 -4 -2 0 -2 0 8 1 -8 2 -8 4 4 0 8 0 -4 -2 -4 -4 4 -8 12 0 -8 8 0 8 -16 -8 4 8 16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 0 4 0 -8 0 -4 -4 0 0 -12 16 16 8 4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 [...]
+1 -5 4 -2 0 4 0 0 4 0 0 4 -2 -4 8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 -4 2 0 2 0 8 1 -4 2 0 4 0 0 0 -8 0 -2 0 4 0 16 -4 0 0 8 -4 0 0 -4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 -16 8 8 8 8 4 4 -4 -4 0 4 4 0 0 4 -8 -8 4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 [...]
+1 -5 0 -2 4 4 8 0 4 0 4 4 -2 4 -16 4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 4 -4 0 4 4 0 0 0 4 -4 -2 -8 -2 0 0 1 4 2 8 -4 0 -8 8 0 0 -2 0 4 0 8 4 -8 0 0 4 0 -8 4 4 0 -8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 -4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 -5 4 4 2 -4 0 4 0 8 -2 8 -4 0 0 -4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 2 0 -2 -8 0 1 4 0 0 0 4 8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 8 4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 -8 0 0 -8 0 -8 0 0 -8 0 -8 4 8 4 0 4 4 8 4 8 0 0 -8 0 4 0 0 0 0 0 0 -8 -4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0 [...]
+1 -5 4 -6 0 8 -8 -4 4 -4 0 12 -2 -4 8 8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 12 4 8 4 -4 0 8 8 -8 -4 -2 0 -2 0 -8 1 0 -6 8 4 -4 0 -8 0 4 6 4 -4 -4 -8 4 0 -8 8 -8 -8 16 0 4 8 -16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 8 0 -8 0 0 -12 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 8 4 -8 0 0 -4 -4 0 0 -4 0 0 0 4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8 [...]
+1 -5 4 0 2 0 0 0 8 4 -2 8 -4 0 0 -4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 -8 0 0 4 8 -2 0 2 0 0 1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 8 0 0 4 -8 0 0 -8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 -8 0 -8 0 0 -8 0 -8 0 0 8 0 4 4 4 -8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 8 4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8 [...]
+1 -5 4 4 -2 0 0 0 0 0 2 0 -4 0 16 -4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 4 0 0 0 0 -8 2 -8 2 0 0 -3 0 4 -16 -8 0 0 -16 8 0 8 0 8 0 0 0 0 8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 4 -16 8 -16 -16 -16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 -4 8 4 8 0 0 0 0 -4 -8 -4 -8 -4 4 0 8 4 0 0 8 0 4 0 4 0 -16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 8 8 [...]
+1 -5 4 4 -2 0 16 0 0 0 2 0 -4 -8 16 -12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 -8 -8 -16 -8 4 0 16 0 0 -8 -6 8 -6 0 16 -3 0 -4 16 -8 0 0 16 24 0 0 0 -8 0 16 -8 0 -8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 -12 16 -8 16 16 16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 -4 -8 4 -8 -8 0 0 0 -4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 -16 -12 -16 -16 -8 -16 -16 [...]
+1 -5 0 4 2 0 16 0 0 0 -2 0 -4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 4 0 -16 0 0 -8 -2 8 -2 0 -16 -3 0 4 0 8 0 0 0 0 0 16 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 0 -8 -12 0 0 0 0 0 0 8 4 8 4 4 -16 -8 -12 0 0 8 -16 4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0 [...]
+1 -5 0 6 0 0 0 4 12 0 0 -12 6 12 0 -12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 12 12 -24 12 0 -24 0 24 12 12 6 0 -6 0 0 -3 0 6 0 -12 12 24 0 0 0 6 0 -12 -12 0 -12 0 0 0 -12 0 -24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 12 0 0 0 0 0 -12 0 0 12 -24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 -12 0 12 0 0 12 0 0 12 0 -24 -12 0 12 -4 -12 4 -6 0 -12 0 -12 0 12 0 -6 [...]
+1 -5 0 2 0 4 0 0 4 -4 0 4 6 4 0 -4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 -16 0 0 -8 12 2 0 -2 -8 0 -3 4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 -8 0 0 8 8 0 -4 -4 -8 8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 16 -8 -16 8 0 -8 0 8 0 -4 -12 4 8 0 0 4 0 0 4 -8 0 -8 0 -12 4 12 -4 2 0 -4 0 0 -12 -4 0 2 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 [...]
+1 -5 -4 8 2 0 8 0 -8 -4 -2 8 4 8 -8 4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 8 -8 0 4 0 -2 0 2 0 8 1 -8 -8 8 8 -8 8 -8 0 -4 0 4 8 0 -8 -8 16 0 8 -12 8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 -8 -8 8 0 0 0 -16 8 0 0 8 -4 8 8 0 8 0 -8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 -8 0 -8 -4 -4 8 0 -8 0 -8 8 0 4 -8 4 8 -8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4 [...]
+1 -5 0 -2 0 8 0 -4 4 0 0 4 6 -4 0 4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 -4 12 8 -4 0 -8 0 8 4 12 -2 0 2 -16 0 -3 -8 -2 0 -12 4 -8 0 0 0 -2 0 4 12 0 4 0 0 0 -4 0 8 8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 -12 8 4 0 0 -4 0 0 -4 0 8 -4 0 12 -4 -12 4 2 0 4 0 -4 0 -4 0 2 -8 4 8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 [...]
+1 -5 -4 8 2 0 8 0 0 4 -2 -8 4 8 -8 4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 8 -8 0 -12 0 -2 0 2 0 8 1 8 0 8 -8 8 -8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 4 -8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 -8 -8 8 0 0 0 0 -8 0 0 -8 4 8 8 0 8 0 -8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 -8 -16 8 -4 -4 -8 0 8 0 0 8 0 4 8 -4 -8 -8 8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 - [...]
+1 -5 0 4 -2 4 0 -4 0 0 2 0 4 0 8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 8 8 -8 8 0 -2 0 2 0 -8 1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 -8 -4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 8 8 0 4 -8 0 0 -8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 -8 -8 0 -8 0 0 0 0 0 0 -8 0 -4 4 0 0 8 0 8 0 -8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 -8 [...]
+1 -5 0 8 -2 0 0 0 -8 4 2 0 4 0 8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 4 0 2 0 -2 8 8 1 8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 8 0 -8 -4 -8 0 0 0 -8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 -8 4 -8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 8 0 8 4 0 0 0 0 0 0 8 0 4 0 4 0 -8 0 8 0 -8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 0 [...]
+1 -5 4 12 -2 -8 -16 8 -16 8 2 0 -4 8 16 4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 4 -16 -16 -16 -8 -8 2 8 2 16 -16 -3 8 -4 16 -8 -8 16 16 -8 8 -16 -24 -8 24 -16 8 -16 24 16 -8 16 16 8 -8 16 -16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 4 16 -8 16 16 16 8 -16 16 24 -16 16 8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 -8 4 -4 -8 [...]
+1 -5 0 4 2 0 0 0 0 0 -2 0 -4 8 0 8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 8 8 -16 8 4 0 0 0 0 -8 6 8 6 0 0 -3 0 -4 0 8 0 0 0 0 0 -8 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 -12 0 0 0 -16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 0 8 4 0 8 0 0 0 0 8 4 8 4 -4 0 8 4 0 0 -8 0 -4 -16 -12 -16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4 0 [...]
+1 -5 4 -4 -2 8 -16 -8 16 -8 2 0 -4 8 16 4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 8 -8 16 -8 4 16 -16 16 8 -8 2 8 2 -16 -16 -3 -8 -4 16 -8 8 -16 16 -8 -8 -16 24 -8 -24 -16 8 16 24 16 8 -16 -16 -8 -8 16 16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 4 16 -8 16 16 16 8 16 -16 -24 16 -16 -8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 4 -4 -8 [...]
+1 -5 -4 4 6 0 16 0 0 0 -6 0 -4 8 -16 12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 8 -8 16 -8 -12 0 16 0 0 -8 2 8 2 0 16 -3 0 -4 -16 -8 0 0 -16 8 0 0 0 -8 0 16 8 0 8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 4 -16 -24 -16 16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -12 4 -8 4 -24 8 0 0 0 4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 16 4 16 16 -8 16 16 [...]
+1 -5 -4 4 2 4 8 -4 0 8 -2 -8 4 0 -8 12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 -8 0 2 0 -2 8 -8 1 4 0 -8 -8 -4 16 8 0 -8 -8 0 8 4 -8 0 8 0 8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 8 8 -8 0 0 -8 -8 0 4 8 0 -8 8 0 8 0 8 -8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 -8 0 8 0 0 -8 0 -4 -4 0 8 8 -8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 [...]
+1 -5 0 -6 0 12 0 0 4 -12 0 12 6 -12 0 12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 -6 0 6 -24 0 -3 12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 24 0 0 0 24 0 -12 12 24 -24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 12 0 0 0 0 0 12 -24 -24 0 0 0 -12 0 0 -24 0 24 0 24 0 -24 0 -12 -12 12 0 0 0 -12 0 0 -12 24 0 0 0 -12 4 12 -4 -6 0 12 0 0 12 12 0 [...]
+1 -5 -4 4 2 4 8 4 0 -8 -2 0 4 0 -8 12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 8 0 2 0 -2 8 -8 1 -12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 -8 0 8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 8 8 -8 0 0 -8 8 0 -4 -8 -16 8 8 0 8 0 8 -8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 8 0 -8 0 8 -8 0 -4 4 0 -8 8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 [...]
+1 -5 0 0 -2 8 0 0 8 -4 2 -8 4 -8 8 8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 -4 0 2 0 -2 8 8 1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -8 4 8 0 8 0 8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 8 -4 -8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 8 0 4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0 [...]
+1 -7 8 0 2 8 -16 0 8 0 2 8 -8 -8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 -8 16 16 0 -4 16 16 0 -8 -16 2 8 2 16 16 3 -8 0 0 16 0 0 0 0 0 4 0 0 0 -16 -8 0 0 0 -8 0 0 -8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 -16 8 8 4 8 0 -4 0 -8 0 0 8 8 16 -4 16 -4 0 16 0 -4 0 0 0 16 0 16 -4 16 -32 8 0 0 -8 16 0 [...]
+1 -7 4 0 6 8 0 0 8 0 6 8 -8 0 -32 4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 12 16 0 0 8 -16 -2 -8 -2 16 0 3 8 8 32 -16 0 -16 32 8 0 4 0 16 0 0 0 -16 8 -32 8 0 -16 8 16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 -4 32 -24 32 -16 -16 0 -16 0 0 0 -16 0 -32 16 16 16 16 0 -16 -16 -16 -16 8 -16 8 8 12 4 16 -4 -24 0 -16 -16 8 4 -16 4 -16 [...]
+1 -7 8 6 4 0 -8 4 4 12 -4 12 -10 -4 -8 -12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 -12 4 8 4 -4 -16 8 8 8 4 -2 -8 -2 -16 8 -1 8 2 8 4 4 16 8 -8 4 -2 4 4 4 -24 -12 16 -8 -24 8 8 16 8 4 8 16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 16 -4 -16 -16 0 0 -4 0 0 12 0 0 16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 [...]
+1 -7 4 4 2 8 -8 0 8 -4 2 0 0 0 -8 -4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 8 0 0 8 0 -8 -8 0 4 8 2 0 -2 0 8 -1 0 4 -8 0 8 8 8 0 -4 -4 4 0 0 8 0 0 0 8 4 8 -8 0 -8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 8 -8 -8 0 0 8 -16 8 0 0 -8 -4 8 -8 0 -8 0 8 -16 -8 0 8 -8 8 -8 -4 -4 -4 -8 4 8 0 0 8 -4 -4 0 0 0 0 4 8 8 -4 8 4 0 -8 -4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0 [...]
+1 -7 4 0 2 12 -8 -4 8 -8 2 8 0 -8 -8 4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 -2 0 2 -8 -8 -1 4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 8 0 8 0 0 16 4 8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 -8 8 8 0 0 0 8 0 4 8 0 8 8 0 -8 0 -8 8 8 0 -8 -16 -4 8 -4 -8 -4 -4 8 -4 -8 8 -8 -16 -8 -4 0 0 0 0 -4 -8 -8 4 -4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 -7 4 10 0 4 0 0 -4 0 0 -4 -2 -4 8 -8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 -4 4 0 -4 4 0 8 0 4 -4 -2 0 -2 0 8 -1 4 2 0 4 0 0 0 8 0 6 0 4 0 16 -4 0 0 8 4 0 0 4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 -16 -8 -8 -8 -8 -4 4 4 4 0 -4 4 0 0 4 8 8 -4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8 [...]
+1 -7 0 10 4 4 8 0 -4 0 -4 -4 -2 4 -16 4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 4 -4 0 4 -4 0 0 0 -4 -4 2 8 2 0 0 -1 -4 2 8 -4 0 8 8 0 0 6 0 4 0 8 4 8 0 0 -4 0 8 -4 4 0 8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 -4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 [...]
+1 -7 4 6 0 8 -8 -4 4 -4 0 -4 -2 -4 8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 12 4 8 4 4 0 8 8 8 -4 2 0 2 0 -8 -1 0 -6 8 4 -4 0 -8 0 4 -2 4 -4 -4 -8 4 0 8 8 8 -8 -16 0 4 8 16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 8 0 -8 0 0 -12 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 -8 4 8 0 0 4 -4 0 0 -4 0 0 0 -4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 - [...]
+1 -7 0 10 0 8 0 -4 -4 0 0 -12 6 -4 0 4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 -4 12 8 -4 0 8 0 8 -4 12 2 0 -2 16 0 3 8 -2 0 -12 4 8 0 0 0 -2 0 4 12 0 4 0 0 0 4 0 -8 -8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 -12 -8 -4 0 0 -4 0 0 -4 0 -8 4 0 12 4 -12 -4 2 0 4 0 -4 0 -4 0 2 -8 -4 8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4 [...]
+1 -7 0 6 0 12 0 0 4 -12 0 -12 6 -12 0 12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 6 0 -6 24 0 3 -12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 -24 0 0 0 24 0 12 12 24 24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 -12 0 0 0 0 0 12 24 -24 0 0 0 -12 0 0 24 0 -24 0 -24 0 24 0 12 -12 -12 0 0 0 -12 0 0 -12 -24 0 0 0 -12 -4 12 4 -6 0 12 0 0 12 12 [...]
+1 -9 8 6 4 16 -24 -4 12 -12 4 4 -6 -12 -24 -4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 -4 -4 -8 -4 4 16 -8 -8 8 -4 2 8 2 16 -8 1 8 -2 -8 -4 -4 16 -8 8 -4 2 -4 -4 -4 -8 -4 16 8 -8 8 -8 16 8 -4 -8 16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 8 8 4 -16 8 4 8 4 8 8 [...]
+1 -9 8 16 2 8 -16 0 -8 0 -2 -8 -8 -8 0 -16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 -8 16 16 0 4 -16 16 0 8 -16 -2 -8 -2 -16 16 -3 8 0 0 16 0 0 0 0 0 -4 0 0 0 -16 -8 0 0 0 8 0 0 8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 -16 -8 -8 -4 -8 0 4 0 -8 0 0 -8 -8 16 4 16 4 0 16 0 4 0 0 0 16 0 16 4 16 32 8 0 0 8 16 0 [...]
+1 -9 4 16 6 8 0 0 -8 0 -6 -8 -8 0 -32 -4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 -12 -16 0 0 -8 -16 2 8 2 -16 0 -3 -8 8 32 -16 0 16 32 -8 0 12 0 16 0 0 0 16 -8 -32 -8 0 16 -8 16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 4 32 24 32 16 16 0 16 0 0 0 16 0 -32 -16 -16 -16 -16 0 16 16 16 16 -8 -16 -8 -8 -12 -4 16 4 24 0 16 16 -8 -4 -16 [...]
+1 -9 4 16 2 12 -8 -4 -8 -8 -2 -16 0 -8 -8 -4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 2 0 -2 8 -8 1 -4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 -8 0 8 0 0 -16 -4 8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 -8 -8 8 0 0 0 -8 0 4 8 0 8 8 0 8 0 8 8 -8 0 8 16 4 8 4 8 4 4 8 4 8 8 8 16 8 4 0 0 0 0 -4 -8 -8 -4 -4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 -2 -8 -8 4 [...]
+1 -11 12 12 6 24 -48 -8 16 -24 6 0 -12 -24 -48 -12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 -24 -24 -48 -24 12 48 -48 -48 24 -24 6 24 6 48 -48 3 24 -12 -48 -24 -24 48 -48 24 -24 0 -24 -24 -24 -48 -24 48 24 -48 24 -48 48 24 -24 -48 48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 12 -48 24 -48 48 16 -24 48 -48 -24 [...]
+end
diff --git a/demos/ppl_lcdd/examples/mit31-20.ine b/demos/ppl_lcdd/examples/mit31-20.ine
new file mode 100644
index 0000000..d38798a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit31-20.ine
@@ -0,0 +1,34 @@
+begin
+31 20 integer
+1 -6 12 3 0 0 0 -12 -8 0 0 12 3 0 0 0 -6 0 1 0
+1 2 -1 2 -2 0 -4 4 -4 -2 0 2 0 1 -2 2 0 0 0 1
+1 0 -3 0 0 2 0 0 -2 0 4 0 0 -1 0 -2 0 2 0 -1
+1 0 1 -2 -2 0 0 0 0 2 0 2 0 1 -2 0 0 0 0 -1
+1 0 -3 2 -2 0 0 0 0 2 0 -2 0 1 2 0 0 0 0 -1
+1 -2 -1 0 0 2 0 0 2 0 0 0 0 -1 0 0 0 -2 0 1
+1 -2 -5 2 2 -4 4 4 0 2 -8 2 0 1 2 2 0 -4 0 1
+1 -2 3 -2 -2 0 4 4 -4 -2 0 -2 0 1 2 -2 0 0 0 1
+1 -2 -1 2 -2 0 4 -4 4 -2 0 2 0 1 -2 -2 0 0 0 1
+1 -4 1 2 2 -4 0 0 4 -2 0 -2 0 1 -2 0 0 4 0 -1
+1 -4 5 0 0 2 0 0 -2 0 -4 0 0 -1 0 2 0 2 0 -1
+1 -6 11 2 2 -4 -4 -4 -8 2 8 2 0 1 2 -2 0 -4 0 1
+1 6 12 3 0 0 0 12 8 0 0 12 3 0 0 0 6 0 1 0
+1 4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 -4 0 -1 0
+1 2 0 -1 0 0 0 -4 0 0 0 0 -1 0 0 0 2 0 1 0
+1 2 -4 3 0 0 0 4 -8 0 0 -4 3 0 0 0 2 0 1 0
+1 0 -4 1 0 0 0 0 0 0 0 4 -1 0 0 0 0 0 -1 0
+1 0 0 -3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 -1 0
+1 -2 -4 3 0 0 0 -4 8 0 0 -4 3 0 0 0 -2 0 1 0
+1 -2 0 -1 0 0 0 4 0 0 0 0 -1 0 0 0 -2 0 1 0
+1 -4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 4 0 -1 0
+1 6 11 2 2 4 4 4 8 2 8 2 0 1 2 2 0 4 0 1
+1 4 5 0 0 -2 0 0 2 0 -4 0 0 -1 0 -2 0 -2 0 -1
+1 4 1 2 2 4 0 0 -4 -2 0 -2 0 1 -2 0 0 -4 0 -1
+1 2 3 -2 -2 0 -4 -4 4 -2 0 -2 0 1 2 2 0 0 0 1
+1 2 -1 0 0 -2 0 0 -2 0 0 0 0 -1 0 0 0 2 0 1
+1 2 -1 -2 2 0 4 -4 -4 2 0 -2 0 1 -2 2 0 0 0 1
+1 2 -5 2 2 4 -4 -4 0 2 -8 2 0 1 2 -2 0 4 0 1
+1 0 -3 -2 2 0 0 0 0 -2 0 2 0 1 2 0 0 0 0 -1
+1 0 -3 0 0 -2 0 0 2 0 4 0 0 -1 0 2 0 -2 0 -1
+1 -2 -1 -2 2 0 -4 4 4 2 0 -2 0 1 -2 -2 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit41-16.ine b/demos/ppl_lcdd/examples/mit41-16.ine
new file mode 100644
index 0000000..bb26798
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit41-16.ine
@@ -0,0 +1,44 @@
+begin
+41 16 rational
+1 -1 0 0 -1 0 1 0 0 0 0 0 0 0 0 0
+1 -3 2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 -1 0 -1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -1 -2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -3 2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 1 -1 1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 -1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 1 -1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 -1 1 -1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 -1 1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -3 1 1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 0 0 0 0 0 0 0 -1 0 0 0 0 0
+1 1 1 0 -2 0 0 0 0 0 -1 0 0 0 0 0
+1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 -1 1 0 -2 0 0 0 0 0 1 0 0 0 0 0
+1 -3 1 0 2 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 -2 0 0 0 0 0 0 0 1 0 0 0
+1 -2 0 0 0 2 0 0 0 0 0 0 -1 0 0 0
+1 -4 0 0 6 -4 0 0 0 0 0 0 1 0 0 0
+1 0 0 -3 0 0 0 0 0 0 0 0 0 3 0 -1
+1 -2 0 3 -4 8 0 -4 0 0 0 -4 0 3 -2 1
+1 -2 0 -1 0 0 0 4 0 0 0 0 0 -1 -2 1
+1 -4 0 1 4 0 0 0 0 0 0 -4 0 -1 4 -1
+1 -6 0 3 12 -8 0 -12 0 0 0 12 0 3 -6 1
+1 3 2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 1 0 0 -1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 -2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 -1 -2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 3 2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 1 -2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 3 1 1 1 0 0 0 0 1 0 0 0 0 0 0
+1 3 1 0 2 0 0 0 0 0 1 0 0 0 0 0
+1 4 0 0 6 4 0 0 0 0 0 0 1 0 0 0
+1 2 0 0 0 -2 0 0 0 0 0 0 -1 0 0 0
+1 6 0 3 12 8 0 12 0 0 0 12 0 3 6 1
+1 4 0 1 4 0 0 0 0 0 0 -4 0 -1 -4 -1
+1 2 0 -1 0 0 0 -4 0 0 0 0 0 -1 2 1
+1 2 0 3 -4 -8 0 4 0 0 0 -4 0 3 2 1
+1 0 0 1 -4 0 0 0 0 0 0 4 0 -1 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit708-9.ine b/demos/ppl_lcdd/examples/mit708-9.ine
new file mode 100644
index 0000000..a30a095
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit708-9.ine
@@ -0,0 +1,711 @@
+begin
+708 9 rational
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+192 -6 0 -8 12 -8 0 0 -4
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit71-61.ine b/demos/ppl_lcdd/examples/mit71-61.ine
new file mode 100644
index 0000000..dcc420d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit71-61.ine
@@ -0,0 +1,74 @@
+begin
+71 61 rational
+64 -384 0 192 0 0 768 0 0 -512 0 0 0 -768 0 0 0 0 0 768 0 0 0 0 0 0 0 0 0 0 0 0 0 192 0 0 0 0 0 -384 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -6 6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 6 -6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -2 -2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 2 2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 2 -2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 6 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -6 -6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 -8 4 -8 16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 0 -4 -8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 8 4 -8 -16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 -8 0 0 0 -24 24 0 24 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 8 0 0 0 -24 -24 0 24 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+16 -64 0 0 0 0 96 0 0 -64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -6 12 3 -12 -8 3 12 -6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 4 1 0 0 -1 -4 4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 -1 4 0 -1 0 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 -4 3 -4 8 3 -4 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -4 1 0 0 -1 4 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -3 0 0 3 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -4 3 4 -8 3 -4 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -1 -4 0 -1 0 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 1 0 0 -1 -4 -4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 12 3 12 8 3 12 6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 -2 8 4 8 -4 -8 -8 8 2 -2 -2 10 -16 -4 12 8 -2 -8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 -2 4 0 0 0 0 4 -4 -2 2 -2 6 -4 0 -4 0 2 4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 2 -8 4 8 4 8 -8 -8 2 2 -2 6 0 -4 4 -8 -2 8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 2 -4 0 0 0 0 4 4 -2 -2 -2 2 4 0 -4 0 2 -4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 4 -8 -4 8 0 0 2 -2 -2 2 8 -4 4 -8 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 -4 0 4 0 0 0 2 -2 -2 2 0 4 -4 0 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 4 -8 4 -8 0 0 2 2 -2 -2 8 -4 -4 8 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 -4 0 -4 0 0 0 2 2 -2 -2 0 4 4 0 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 -2 -4 0 0 0 0 -4 4 -2 2 -2 -2 4 0 4 0 2 -4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 4 0 0 0 0 -4 -4 -2 -2 -2 -6 -4 0 4 0 2 4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 -2 -8 4 8 -4 -8 8 -8 2 -2 -2 -6 0 -4 -4 8 -2 8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 2 8 4 8 4 8 8 8 2 2 -2 -10 -16 -4 -12 -8 -2 -8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 -8 4 16 4 -8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 24 8 -24 -8 -16 8 16 8 -8 0 0 4 -16 20 4 -8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 -4 0 4 8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 16 0 8 -8 0 0 -16 0 8 0 0 4 -8 -4 4 0 8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 4 0 -4 0 8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 8 8 -8 8 0 -8 0 -8 8 0 0 4 -8 4 -4 8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 -8 4 -16 4 -8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 8 -8 8 -8 16 -8 16 -8 -8 0 0 4 0 -12 4 8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 8 8 0 0 0 0 -8 0 0 4 0 -4 -4 0 0 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 8 4 -16 4 8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 8 8 -8 16 8 -16 8 -8 0 0 4 0 -12 4 -8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 4 0 -4 0 -8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 -8 -8 8 0 8 0 8 8 0 0 4 8 4 -4 -8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -4 0 4 -8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -16 0 8 -8 0 0 16 0 8 0 0 4 8 -4 4 0 -8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 8 4 16 4 8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -24 -8 -24 -8 -16 -8 -16 -8 -8 0 0 4 16 20 4 8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -16 8 16 -16 4 -8 32 0 0 -16 -32 0 0 32 0 -8 0 4 -16 16 8 -16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 0 8 -4 -8 16 0 0 0 0 0 0 -16 0 8 0 4 -8 0 0 8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -16 0 4 -8 0 0 0 -16 32 0 0 0 0 -8 0 4 0 -16 8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 4 -8 0 0 0 16 0 0 0 0 0 -8 0 4 0 0 -8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 0 -8 -4 -8 -16 0 0 0 0 0 0 16 0 8 0 4 8 0 0 -8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 8 16 16 4 -8 -32 0 0 -16 -32 0 0 -32 0 -8 0 4 16 16 8 16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 -16 16 8 -8 -16 16 32 0 -32 -16 0 16 0 0 0 0 0 0 -8 24 -8 -16 8 0 24 -64 -8 16 24 32 -8 0 -16 0 0 0 -8 24 -16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 -16 -16 8 8 -16 -16 32 0 32 -16 0 -16 0 0 0 0 0 0 -8 8 -8 16 -8 0 24 -32 8 -16 24 -32 8 0 16 0 0 0 -8 8 16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 0 0 -8 8 -16 16 0 0 0 16 0 -16 0 0 0 0 0 0 -8 8 8 0 -8 0 24 -16 -8 0 -24 0 8 0 16 0 0 0 -8 8 0 8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 0 0 -8 -8 -16 -16 0 0 0 16 0 16 0 0 0 0 0 0 -8 -8 8 0 8 0 24 16 8 0 -24 0 -8 0 -16 0 0 0 -8 -8 0 8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 16 -16 8 -8 -16 16 -32 0 32 -16 0 16 0 0 0 0 0 0 -8 -8 -8 16 8 0 24 32 -8 -16 24 -32 -8 0 -16 0 0 0 -8 -8 16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 16 16 8 8 -16 -16 -32 0 -32 -16 0 -16 0 0 0 0 0 0 -8 -24 -8 -16 -8 0 24 64 8 16 24 32 8 0 16 0 0 0 -8 -24 -16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -24 24 -8 0 0 0 0 0 0 -24 48 24 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -48 -24 48 0 24 0 -24 0 0 0 0 -8 24 -24 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -8 -8 8 0 0 0 0 0 0 -24 16 8 8 16 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -16 -8 -16 0 -8 0 24 0 0 0 0 -8 8 8 0 0 -8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 8 -8 -8 0 0 0 0 0 0 -24 -16 -8 8 16 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 16 8 -16 0 -8 0 -24 0 0 0 0 -8 -8 8 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 24 24 8 0 0 0 0 0 0 -24 -48 -24 -24 -48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 48 24 48 0 24 0 24 0 0 0 0 -8 -24 -24 0 0 -8 0 0 0 0
+0 0 0 16 -32 16 0 0 0 0 0 0 0 -64 0 128 0 -64 0 64 0 -128 0 0 64 0 0 0 0 0 0 0 0 32 -64 32 0 0 0 -64 128 0 0 -64 0 0 0 0 0 0 0 16 -32 0 16 0 0 0 0 0 0
+0 0 0 16 0 -16 0 0 0 0 0 0 0 -64 0 0 0 64 0 64 0 0 0 0 -64 0 0 0 0 0 0 0 0 32 0 -32 0 0 0 -64 0 0 0 64 0 0 0 0 0 0 0 16 0 0 -16 0 0 0 0 0 0
+0 0 0 16 32 16 0 0 0 0 0 0 0 -64 0 -128 0 -64 0 64 0 128 0 0 64 0 0 0 0 0 0 0 0 32 64 32 0 0 0 -64 -128 0 0 -64 0 0 0 0 0 0 0 16 32 0 16 0 0 0 0 0 0
+0 0 0 0 0 0 16 -32 16 -32 64 -32 0 -32 32 32 -32 0 0 80 -96 -64 16 64 0 0 0 0 0 0 0 0 0 16 -32 0 16 0 0 -64 96 32 -32 0 -32 0 0 0 0 0 0 16 -32 16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 0 -16 -32 0 32 0 -32 0 0 32 0 0 80 0 0 -16 -64 0 0 0 0 0 0 0 0 0 16 0 0 -16 0 0 -64 0 0 32 0 32 0 0 0 0 0 0 16 0 -16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 32 16 -32 -64 -32 0 -32 -32 -32 -32 0 0 80 96 64 16 64 0 0 0 0 0 0 0 0 0 16 32 0 16 0 0 -64 -96 -32 -32 0 -32 0 0 0 0 0 0 16 32 16 0 0 0 0 0 0 0
+0 32 -32 -32 32 0 -128 128 0 128 -128 0 0 192 -64 -128 0 0 0 -256 128 128 0 0 0 0 0 0 0 0 0 0 0 -64 64 0 0 0 0 160 -128 -32 0 0 0 0 0 0 0 0 0 -32 32 0 0 0 0 0 0 0 0
+0 32 32 -32 -32 0 -128 -128 0 128 128 0 0 192 64 128 0 0 0 -256 -128 -128 0 0 0 0 0 0 0 0 0 0 0 -64 -64 0 0 0 0 160 128 32 0 0 0 0 0 0 0 0 0 -32 -32 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 6 -4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/mit90-86.ine b/demos/ppl_lcdd/examples/mit90-86.ine
new file mode 100644
index 0000000..5bee933
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit90-86.ine
@@ -0,0 +1,93 @@
+begin
+90 86 rational
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 -12 0 12 0 0 0 0 -12 0 0 0 12 0 -12 12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 -4 4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 12 0 12 0 0 0 0 -12 0 0 0 -12 0 12 -12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 4 -4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -6 6 4 -1 4 0 4 -2 -8 0 4 0 -2 -4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 -2 4 0 0 8 4 0 0 0 -2 4 0 8 0 0 4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 4 -8 0 0 -4 -2 -2 0 4 -1 4 0 6 4 -4 -2 1
+1 -8 6 8 1 12 -4 -4 -4 -16 -4 0 -8 -4 -4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 -4 0 4 0 0 -4 -4 -8 -4 4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 4 16 8 4 4 4 4 4 0 -1 -8 -4 -6 -8 4 4 -1
+1 -10 6 12 3 24 -12 -12 -6 -24 -20 -12 -24 -6 -4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 -6 -12 -12 -12 -24 -12 -12 -24 -12 -6 -12 -24 -24 -12 -12 -12 -12 -12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 -4 -4 -12 -24 -24 -12 -4 -6 -6 -12 -12 3 12 12 6 12 -4 -6 1
+1 10 6 12 3 24 12 12 6 24 20 12 24 6 4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 6 12 12 12 24 12 12 24 12 6 12 24 24 12 12 12 12 12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 4 4 12 24 24 12 4 6 6 12 12 3 12 12 6 12 4 6 1
+1 8 6 8 1 12 4 4 4 16 4 0 8 4 4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 4 0 -4 0 0 4 4 8 4 -4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 -4 -16 -8 -4 -4 -4 -4 -4 0 -1 -8 -4 -6 -8 -4 -4 -1
+1 8 0 6 3 18 6 6 0 0 14 12 12 0 -2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 -6 0 6 0 0 -6 -6 -12 -6 6 6 12 0 6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 -4 -4 -6 0 -12 -6 2 0 0 -6 -12 -3 -6 -12 0 -6 -2 -6 -1
+1 6 0 2 1 10 -2 2 2 0 6 0 4 -2 -2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 -4 -4 -6 -4 0 -2 -6 -4 2 -4 -2 -4 0 2 -4 4 4 4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 2 0 4 6 -2 -2 2 -2 0 1 2 4 0 6 2 4 1
+1 6 6 4 -1 4 0 -4 2 8 0 -4 0 2 4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 2 -4 0 0 -8 -4 0 0 0 2 -4 0 -8 0 0 -4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 -4 8 0 0 4 2 2 0 -4 -1 4 0 6 4 4 2 1
+1 6 0 6 1 6 6 2 -2 0 -2 0 4 2 -2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 -4 4 2 4 0 -2 2 -4 -6 -4 -2 -4 0 -6 4 -4 -4 -4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 2 0 4 -2 -2 2 -2 6 0 1 6 4 0 2 2 4 1
+1 6 6 4 3 0 -4 12 2 8 -12 4 -8 2 4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 2 4 -4 -12 8 12 -4 -8 -4 2 12 -8 8 -4 -12 4 -12 -12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 -4 -4 12 8 -8 -4 4 2 2 -4 4 3 4 -4 6 4 4 2 1
+1 6 -2 0 3 12 0 0 -2 -8 8 12 0 -2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 6 -4 0 -4 -8 0 0 0 0 6 0 0 -8 0 -4 -4 -4 -4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 4 4 0 -8 0 0 0 -2 -2 0 12 3 0 12 -2 0 0 6 1
+1 4 -2 -4 1 8 -8 0 -4 0 8 0 0 -4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 4 0 -8 0 -16 0 8 0 -8 -4 0 0 16 8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 -8 0 4 4 8 0 -1 4 -4 2 -4 0 -4 -1
+1 4 0 -2 -1 6 -6 -2 4 0 2 -4 4 -4 -2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 -2 0 2 -4 0 2 -2 -4 6 2 -2 4 0 -6 4 0 4 -4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 2 0 -4 -2 2 4 -4 6 4 1 2 0 0 -6 -2 -2 -1
+1 4 0 2 -1 2 2 -2 0 0 2 -4 -4 0 -2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 -2 0 2 4 0 2 -2 4 -2 2 -2 -4 0 2 -4 0 -4 4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 2 0 4 -2 2 0 0 -2 4 1 -2 0 0 -2 -2 -2 -1
+1 4 -2 0 1 4 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 4 0 0 0 8 0 0 0 0 -4 0 0 -8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 -4 -1
+1 4 0 2 3 -2 -2 6 0 0 -10 4 -4 0 -2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 -2 0 -2 0 0 -6 2 4 2 2 6 -4 0 -2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 4 4 -6 0 4 2 2 0 0 2 -4 -3 -2 4 0 -2 -2 -2 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 -12 0 -12 0 0 0 0 12 0 0 0 12 0 -12 12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 -4 4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 12 0 -12 0 0 0 0 12 0 0 0 -12 0 12 -12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 4 -4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 1 -4 -4 4 0 0 -4 0 -8 0 4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 4 0 0 4 -4 -8 -4 0 -4 8 0 4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 -4 0 8 4 -4 0 0 4 0 -1 0 4 -6 0 -4 0 -1
+1 4 0 6 -1 -2 2 -2 -4 0 -6 -4 4 4 -2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 -2 0 -6 -4 0 2 6 -4 -2 2 -2 4 0 2 4 0 4 -4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 2 0 -4 6 2 -4 4 -2 4 1 -6 0 0 2 -2 -2 -1
+1 4 -2 4 1 0 8 0 -4 0 -8 0 0 -4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 4 0 8 0 -16 0 -8 0 8 -4 0 0 16 -8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 8 0 4 4 -8 0 -1 -4 -4 2 4 0 -4 -1
+1 4 0 -6 3 6 -6 -6 0 0 2 12 -12 0 2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 -6 0 -6 0 0 6 6 12 6 6 -6 -12 0 -6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 -4 -4 6 0 12 6 -2 0 0 6 -12 -3 6 -12 0 6 2 -6 -1
+1 2 -2 -4 -1 4 -4 0 -2 0 4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 2 4 4 0 0 0 4 0 -4 2 0 0 0 -4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 4 0 -2 -2 -4 -4 -1 -4 0 -2 4 0 2 1
+1 2 0 -6 1 2 -6 -2 -2 0 2 0 -4 2 2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 -4 4 -2 4 0 2 -2 4 6 -4 2 4 0 6 4 -4 -4 -4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 -2 0 -4 2 2 2 -2 -6 0 1 -6 4 0 -2 -2 4 1
+1 2 -2 0 3 -4 0 0 -6 8 -8 4 0 -6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 2 -12 0 4 8 0 0 0 0 2 0 0 8 0 4 -12 4 4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 -4 -4 0 8 0 0 0 -6 -6 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 -3 2 2 -6 2 0 2 0 -4 -2 -2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 -4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 4 -4 -6 0 -4 2 -2 -2 2 2 0 -3 -2 0 0 2 2 0 1
+1 2 0 -6 -3 6 -6 -6 6 0 -6 0 12 -6 -2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 -12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 -4 4 -6 0 12 -6 -2 -6 6 -6 0 -3 -6 0 0 6 2 0 1
+1 2 0 -2 1 -2 -2 2 2 0 -2 0 -4 -2 -2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 -4 2 4 0 -2 2 4 2 0 -2 4 0 2 4 4 -4 -4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 2 0 -4 -2 -2 -2 2 -2 0 1 -2 -4 0 2 2 0 1
+1 2 -2 0 -1 0 -4 0 2 -8 -4 -4 8 2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 2 -4 -4 0 8 0 -4 8 -4 2 0 8 8 -4 0 -4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 -8 8 -4 0 2 2 -4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 -3 -2 2 -6 -2 0 2 0 -4 2 -2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 -4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 -4 4 -6 0 -4 2 -2 2 -2 2 0 -3 2 0 0 -2 2 0 1
+1 2 -2 0 -1 0 4 0 2 -8 4 -4 -8 2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 2 -4 4 0 8 0 4 -8 4 2 0 -8 8 4 0 -4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 -8 -8 4 0 2 2 4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 1 -6 -2 2 -2 0 -2 0 -4 2 -2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 4 2 -4 0 -2 2 4 2 0 -2 4 0 2 -4 -4 4 4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 2 0 -4 -2 -2 2 -2 -2 0 1 2 -4 0 -2 2 0 1
+1 2 -2 4 -1 -4 4 0 -2 0 -4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 2 4 -4 0 0 0 -4 0 4 2 0 0 0 4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 -4 0 -2 -2 4 -4 -1 4 0 -2 -4 0 2 1
+1 2 -2 0 3 -4 0 0 2 -8 -8 4 0 2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 2 4 0 4 -8 0 0 0 0 2 0 0 -8 0 4 4 4 4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 -4 -4 0 -8 0 0 0 2 2 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 1 -2 2 -2 2 0 -6 0 -4 -2 2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 -4 -4 6 -4 0 2 6 4 -2 -4 2 4 0 -2 -4 4 4 4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 -2 0 -4 -6 2 -2 2 2 0 1 -2 4 0 -6 -2 4 1
+1 2 6 -4 -1 -4 0 -4 -2 -8 0 4 0 -2 4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 -2 4 0 0 8 -4 0 0 0 -2 -4 0 8 0 0 4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 -4 -8 0 0 4 -2 -2 0 4 -1 -4 0 6 -4 4 -2 1
+1 2 0 6 -3 -6 -6 -6 -6 0 -6 0 12 6 -2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 -12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 4 -4 -6 0 12 -6 -2 6 -6 -6 0 -3 6 0 0 -6 2 0 1
+1 2 6 -4 3 -8 -4 12 -2 -8 4 -4 -8 -2 4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 -2 -4 -4 12 -8 12 -4 -8 -4 -2 12 -8 -8 -4 12 -4 12 12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 4 4 12 -8 -8 -4 4 -2 -2 -4 -4 3 -4 -4 6 -4 4 -2 1
+1 2 6 -12 3 0 -12 -12 6 24 -4 12 -24 6 -4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 6 12 -12 12 24 -12 -12 -24 -12 6 -12 -24 24 -12 12 12 12 12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 4 4 -12 24 -24 -12 -4 6 6 -12 12 3 -12 12 6 -12 -4 6 1
+1 0 -2 -4 -3 4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 -4 4 0 0 4 -8 4 0 0 8 0 -4 -4 0 4 -4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 -4 4 0 0 8 -4 0 0 0 -4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 -3 4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 4 -4 0 0 -4 8 -4 0 0 -8 0 4 4 0 -4 4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 4 -4 0 0 -8 4 0 0 0 4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 1 0 0 0 0 0 0 0 0 0 0 -4 -4 8 4 8 4 4 8 -4 1 4 -4 -1 -6 -4 4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 8 4 -4 4 -8 4 4 6 4 -8 -1 1 -4 -4 -4 0 0 0 0 0 0 0 0 0 0 0 -1 4 4 2 -4 0 0 -1
+1 0 0 -6 -1 2 -2 2 -4 0 6 -4 -4 4 2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 -2 0 6 -4 0 -2 -6 4 2 2 2 -4 0 -2 4 0 4 -4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 -2 0 4 -6 -2 -4 4 2 4 1 6 0 0 -2 2 -2 -1
+1 0 -2 0 1 -4 0 0 -4 8 0 0 0 -4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 -8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 -8 0 0 0 4 4 0 0 -1 0 4 2 0 0 0 -1
+1 0 0 -2 -1 -2 -2 2 0 0 -2 -4 4 0 2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 -2 0 -2 4 0 -2 2 -4 2 2 2 4 0 -2 -4 0 -4 4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 -2 0 -4 2 -2 0 0 2 4 1 2 0 0 2 2 -2 -1
+1 0 0 -2 3 -6 2 -6 0 0 -6 4 4 0 2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 -2 0 2 0 0 6 -2 -4 -2 2 -6 4 0 2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 4 4 6 0 -4 -2 -2 0 0 -2 -4 -3 2 4 0 2 2 -2 -1
+1 0 6 -8 1 -4 -4 -4 4 16 -4 0 -8 4 -4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 4 0 4 0 0 -4 -4 -8 -4 -4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 4 -16 8 4 4 -4 -4 4 0 -1 8 -4 -6 8 4 -4 -1
+1 0 0 -6 -1 2 2 -2 4 0 -6 4 4 -4 -2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 2 0 -6 4 0 2 6 -4 -2 -2 -2 4 0 2 -4 0 -4 4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 2 0 -4 6 2 4 -4 -2 -4 1 6 0 0 -2 -2 2 -1
+1 0 0 -2 -1 -2 2 -2 0 0 2 4 -4 0 -2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 2 0 2 -4 0 2 -2 4 -2 -2 -2 -4 0 2 4 0 4 -4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 2 0 4 -2 2 0 0 -2 -4 1 2 0 0 2 -2 2 -1
+1 0 -2 4 -3 -4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 4 4 0 0 -4 8 -4 0 0 -8 0 4 -4 0 4 -4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 -4 4 0 0 -8 4 0 0 0 4 0 3 -4 0 2 4 0 0 -1
+1 0 0 -2 3 -6 -2 6 0 0 6 -4 -4 0 -2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 2 0 -2 0 0 -6 2 4 2 -2 6 -4 0 -2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 -4 -4 -6 0 4 2 2 0 0 2 4 -3 2 4 0 2 -2 2 -1
+1 0 -2 0 1 -4 0 0 4 -8 0 0 0 4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 8 0 0 0 -4 -4 0 0 -1 0 4 2 0 0 0 -1
+1 0 -2 4 -3 -4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 -4 -4 0 0 4 -8 4 0 0 8 0 -4 4 0 -4 4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 4 -4 0 0 8 -4 0 0 0 -4 0 3 -4 0 2 4 0 0 -1
+1 0 0 2 -1 -6 -6 -2 -4 0 2 4 4 4 -2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 2 0 2 4 0 2 -2 -4 6 -2 -2 4 0 -6 -4 0 -4 4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 2 0 -4 -2 2 -4 4 6 -4 1 -2 0 0 6 -2 2 -1
+1 0 0 2 -1 -6 6 2 4 0 -2 -4 -4 -4 2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 -2 0 -2 -4 0 -2 2 4 -6 2 2 -4 0 6 4 0 4 -4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 -2 0 4 2 -2 4 -4 -6 4 1 -2 0 0 6 2 -2 -1
+1 0 -2 4 1 -8 0 0 0 0 0 0 0 0 0 -4 4 8 -4 8 4 4 -8 4 1 -4 4 -1 -6 -4 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 -8 4 4 4 8 -4 -4 6 -4 -8 -1 1 4 -4 4 0 0 0 0 0 0 0 0 0 0 0 -1 -4 4 2 4 0 0 -1
+1 0 6 -8 1 -4 4 4 -4 -16 4 0 8 -4 4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 -4 0 -4 0 0 4 4 8 4 4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 -4 16 -8 -4 -4 4 4 -4 0 -1 8 -4 -6 8 -4 4 -1
+1 -2 -2 -4 -1 4 4 0 2 0 -4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 -2 -4 -4 0 0 0 -4 0 4 -2 0 0 0 4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 -4 0 2 2 4 4 -1 -4 0 -2 4 0 -2 1
+1 -2 0 -6 -3 6 6 6 -6 0 6 0 -12 6 2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 -12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 4 -4 6 0 -12 6 2 6 -6 6 0 -3 -6 0 0 6 -2 0 1
+1 -2 -2 0 -1 0 4 0 -2 8 4 4 -8 -2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 -2 4 4 0 -8 0 4 -8 4 -2 0 -8 -8 4 0 4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 8 -8 4 0 -2 -2 4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 2 -3 -2 -2 6 2 0 -2 0 4 -2 2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 -4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 4 -4 6 0 4 -2 2 -2 2 -2 0 -3 2 0 0 -2 -2 0 1
+1 -2 0 -2 -3 2 -2 6 -2 0 -2 0 4 2 2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 -4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 -4 4 6 0 4 -2 2 2 -2 -2 0 -3 -2 0 0 2 -2 0 1
+1 -2 -2 0 -1 0 -4 0 -2 8 -4 4 8 -2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 -2 4 -4 0 -8 0 -4 8 -4 -2 0 8 -8 -4 0 4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 8 8 -4 0 -2 -2 -4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 -2 1 -2 2 -2 -2 0 2 0 4 2 2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 4 -2 -4 0 2 -2 -4 -2 0 2 -4 0 -2 -4 -4 4 4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 -2 0 4 2 2 2 -2 2 0 1 -2 -4 0 2 -2 0 1
+1 -2 -2 0 3 -4 0 0 -2 8 8 -4 0 -2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 -2 -4 0 -4 8 0 0 0 0 -2 0 0 8 0 -4 -4 -4 -4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 4 4 0 8 0 0 0 -2 -2 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 6 -4 -1 -4 0 4 2 8 0 -4 0 2 -4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 2 -4 0 0 -8 4 0 0 0 2 4 0 -8 0 0 -4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 4 8 0 0 -4 2 2 0 -4 -1 -4 0 6 -4 -4 2 1
+1 -2 0 2 1 -6 2 -2 2 0 2 0 4 -2 2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 -4 -2 4 0 2 -2 -4 -2 0 2 -4 0 -2 4 4 -4 -4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 -2 0 4 2 2 -2 2 2 0 1 2 -4 0 -2 -2 0 1
+1 -2 6 -4 3 -8 4 -12 2 8 -4 4 8 2 -4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 2 4 4 -12 8 -12 4 8 4 2 -12 8 8 4 -12 4 -12 -12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 -4 -4 -12 8 8 4 -4 2 2 4 4 3 -4 -4 6 -4 -4 2 1
+1 -2 0 -6 1 2 6 2 2 0 -2 0 4 -2 -2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 4 -4 2 -4 0 -2 2 -4 -6 4 -2 -4 0 -6 -4 4 4 4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 2 0 4 -2 -2 -2 2 6 0 1 -6 4 0 -2 2 -4 1
+1 -2 0 -2 1 -2 -2 2 -2 0 6 0 4 2 -2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 4 4 -6 4 0 -2 -6 -4 2 4 -2 -4 0 2 4 -4 -4 -4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 2 0 4 6 -2 2 -2 -2 0 1 -2 4 0 -6 2 -4 1
+1 -2 -2 4 -1 -4 -4 0 2 0 4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 -2 -4 4 0 0 0 4 0 -4 -2 0 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 4 0 2 2 -4 4 -1 4 0 -2 -4 0 -2 1
+1 -2 -2 0 3 -4 0 0 6 -8 8 -4 0 6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 -2 12 0 -4 -8 0 0 0 0 -2 0 0 -8 0 -4 12 -4 -4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 4 4 0 -8 0 0 0 6 6 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 0 6 -3 -6 6 6 6 0 6 0 -12 -6 2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 -12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 -4 4 6 0 -12 6 2 -6 6 6 0 -3 6 0 0 -6 -2 0 1
+1 -2 6 -12 3 0 12 12 -6 -24 4 -12 24 -6 4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 -6 -12 12 -12 -24 12 12 24 12 -6 12 24 -24 12 -12 -12 -12 -12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 -4 -4 12 -24 24 12 4 -6 -6 12 -12 3 -12 12 6 -12 4 -6 1
+1 -4 -2 -4 1 8 8 0 4 0 -8 0 0 4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 -4 0 8 0 16 0 -8 0 8 4 0 0 -16 -8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 8 0 -4 -4 -8 0 -1 4 -4 2 -4 0 4 -1
+1 -4 0 -2 -1 6 6 2 -4 0 -2 4 -4 4 2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 2 0 -2 4 0 -2 2 4 -6 -2 2 -4 0 6 -4 0 -4 4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 -2 0 4 2 -2 -4 4 -6 -4 1 2 0 0 -6 2 2 -1
+1 -4 -2 0 1 4 0 0 0 8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 -4 0 0 0 -8 0 0 0 0 4 0 0 8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 -8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 4 -1
+1 -4 0 2 -1 2 -2 2 0 0 -2 4 4 0 2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 2 0 -2 -4 0 -2 2 -4 2 -2 2 4 0 -2 4 0 4 -4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 -2 0 -4 2 -2 0 0 2 -4 1 -2 0 0 -2 2 2 -1
+1 -4 0 6 -1 -2 -2 2 4 0 6 4 -4 -4 2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 2 0 6 4 0 -2 -6 4 2 -2 2 -4 0 -2 -4 0 -4 4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 -2 0 4 -6 -2 4 -4 2 -4 1 -6 0 0 2 2 2 -1
+1 -4 0 2 3 -2 2 -6 0 0 10 -4 4 0 2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 2 0 2 0 0 6 -2 -4 -2 -2 -6 4 0 2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 -4 -4 6 0 -4 -2 -2 0 0 -2 4 -3 -2 4 0 -2 2 2 -1
+1 -4 6 0 1 -4 4 -4 0 0 4 0 8 0 -4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 -4 0 0 -4 4 8 4 0 4 -8 0 -4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 4 0 -8 -4 4 0 0 -4 0 -1 0 4 -6 0 4 0 -1
+1 -4 0 -6 3 6 6 6 0 0 -2 -12 12 0 -2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 6 0 6 0 0 -6 -6 -12 -6 -6 6 12 0 6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 4 4 -6 0 -12 -6 2 0 0 -6 12 -3 6 -12 0 6 -2 6 -1
+1 -4 -2 4 1 0 -8 0 4 0 8 0 0 4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 -4 0 -8 0 16 0 8 0 -8 4 0 0 -16 8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 -8 0 -4 -4 8 0 -1 -4 -4 2 4 0 4 -1
+1 -6 0 2 1 10 2 -2 -2 0 -6 0 -4 2 2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 4 4 6 4 0 2 6 4 -2 4 2 4 0 -2 4 -4 -4 -4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 -2 0 -4 -6 2 2 -2 2 0 1 2 4 0 6 -2 -4 1
+1 -6 -2 0 3 12 0 0 2 8 -8 -12 0 2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 -6 4 0 4 8 0 0 0 0 -6 0 0 8 0 4 4 4 4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 -4 -4 0 8 0 0 0 2 2 0 -12 3 0 12 -2 0 0 -6 1
+1 -6 0 6 1 6 -6 -2 2 0 2 0 -4 -2 2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 4 -4 -2 -4 0 2 -2 4 6 4 2 4 0 6 -4 4 4 4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 -2 0 -4 2 2 -2 2 -6 0 1 6 4 0 2 -2 -4 1
+1 -6 6 4 3 0 4 -12 -2 -8 12 -4 8 -2 -4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 -2 -4 4 12 -8 -12 4 8 4 -2 -12 8 -8 4 12 -4 12 12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 4 4 -12 -8 8 4 -4 -2 -2 4 -4 3 4 -4 6 4 -4 -2 1
+1 -8 0 6 3 18 -6 -6 0 0 -14 -12 -12 0 2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 6 0 -6 0 0 6 6 12 6 -6 -6 -12 0 -6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 4 4 6 0 12 6 -2 0 0 6 12 -3 -6 -12 0 -6 2 6 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ext b/demos/ppl_lcdd/examples/mp5.ext
new file mode 100644
index 0000000..dff1bf7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ext
@@ -0,0 +1,36 @@
+V-representation
+begin
+32 11 rational
+ 1 1 1 1 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 1 1 1 1 0
+ 1 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3
+ 1 1 0 1 1 1 0 0 1 1 0
+ 1 0 1 1 1 1 1 1 0 0 0
+ 1 2/3 2/3 1/3 1/3 2/3 1/3 1/3 1/3 1/3 2/3
+ 1 0 1 0 1 1 0 1 1 0 1
+ 1 1 1 0 1 0 1 0 1 0 1
+ 1 1/3 2/3 2/3 2/3 1/3 1/3 1/3 2/3 2/3 2/3
+ 1 0 1 1 0 1 1 0 0 1 1
+ 1 1 1 1 0 0 0 1 0 1 1
+ 1 1/3 1/3 2/3 2/3 2/3 1/3 1/3 1/3 1/3 2/3
+ 1 0 0 0 1 0 0 1 0 1 1
+ 1 1 0 0 1 1 1 0 0 1 1
+ 1 2/3 1/3 2/3 2/3 1/3 2/3 2/3 1/3 1/3 2/3
+ 1 1/3 2/3 1/3 1/3 1/3 2/3 2/3 1/3 1/3 2/3
+ 1 2/3 1/3 1/3 1/3 1/3 1/3 1/3 2/3 2/3 2/3
+ 1 0 0 1 0 0 1 0 1 0 1
+ 1 2/3 2/3 2/3 1/3 2/3 2/3 1/3 2/3 1/3 1/3
+ 1 1 0 1 0 1 0 1 1 0 1
+ 1 2/3 1/3 1/3 2/3 1/3 1/3 2/3 2/3 1/3 1/3
+ 1 1/3 1/3 1/3 2/3 2/3 2/3 1/3 2/3 1/3 1/3
+ 1 1/3 1/3 1/3 1/3 2/3 2/3 2/3 2/3 2/3 2/3
+ 1 0 1 0 0 1 0 0 1 1 0
+ 1 2/3 1/3 2/3 1/3 1/3 2/3 1/3 1/3 2/3 1/3
+ 1 1/3 2/3 1/3 2/3 1/3 2/3 1/3 1/3 2/3 1/3
+ 1 1/3 1/3 2/3 1/3 2/3 1/3 2/3 1/3 2/3 1/3
+ 1 1 1 0 0 0 1 1 1 1 0
+ 1 1/3 2/3 2/3 1/3 1/3 1/3 2/3 2/3 1/3 1/3
+ 1 1 0 0 0 1 1 1 0 0 0
+ 1 2/3 2/3 1/3 2/3 2/3 1/3 2/3 1/3 2/3 1/3
+ 1 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ine b/demos/ppl_lcdd/examples/mp5.ine
new file mode 100644
index 0000000..b901024
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5a.ine b/demos/ppl_lcdd/examples/mp5a.ine
new file mode 100644
index 0000000..6e18548
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5a.ine
@@ -0,0 +1,44 @@
+* metric polytope on 5 points
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp6.ine b/demos/ppl_lcdd/examples/mp6.ine
new file mode 100644
index 0000000..7359781
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp6.ine
@@ -0,0 +1,84 @@
+* metric polytope on 6 points
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+2 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+2 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+2 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+2 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+2 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+2 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+2 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+2 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+2 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+2 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+2 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+2 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+2 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+2 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+2 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+2 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/nonfull.ine b/demos/ppl_lcdd/examples/nonfull.ine
new file mode 100644
index 0000000..b662f47
--- /dev/null
+++ b/demos/ppl_lcdd/examples/nonfull.ine
@@ -0,0 +1,11 @@
+* non full-dimensional polyhedron
+H-representation
+begin
+ 6 4 integer
+ 2 -1 0 0
+ -2 1 0 0
+ 2 0 -1 0
+ -1 1 0 0
+ -1 0 1 0
+ -1 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/origin.ine b/demos/ppl_lcdd/examples/origin.ine
new file mode 100644
index 0000000..a755533
--- /dev/null
+++ b/demos/ppl_lcdd/examples/origin.ine
@@ -0,0 +1,14 @@
+* The polytope consists of a single point, the origin.
+* cddlib now works properly for this input (version 090c and up).
+H-representation
+begin
+ 7 7 integer
+ 0 1 0 0 0 0 0
+ 0 0 1 0 0 0 0
+ 0 0 0 1 0 0 0
+ 0 0 0 0 1 0 0
+ 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 1
+ 0 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/prodst62.ext b/demos/ppl_lcdd/examples/prodst62.ext
new file mode 100644
index 0000000..6fcd39e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/prodst62.ext
@@ -0,0 +1,3467 @@
+* Created by Alain Prodon.
+* Convex hull problem and the number of facets is 168.
+V-representation
+begin
+ 3461 25 integer
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/project1_m.ine b/demos/ppl_lcdd/examples/project1_m.ine
new file mode 100644
index 0000000..af7e014
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20 7 integer
+ 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0
+ 1 0 0 0 0 0 1
+ 1 0 0 0 -1 0 0
+ 1 0 0 0 0 -1 0
+ 1 0 0 0 0 0 -1
+ 1 1 0 0 -1 0 0
+ 1 0 1 0 0 -1 0
+ 1 0 0 1 0 0 -1
+ 1 -1 0 0 1 0 0
+ 1 0 -1 0 0 1 0
+ 1 0 0 -1 0 0 1
+ 2 1 1 1 -1 -1 -1
+ 2 -1 1 1 1 -1 -1
+ 2 1 -1 1 -1 1 -1
+ 2 1 1 -1 -1 -1 1
+ 2 -1 -1 1 1 1 -1
+ 2 1 -1 -1 -1 1 1
+ 2 -1 1 -1 1 -1 1
+ 2 -1 -1 -1 1 1 1
+end
diff --git a/demos/ppl_lcdd/examples/project1res.ine b/demos/ppl_lcdd/examples/project1res.ine
new file mode 100644
index 0000000..d89603e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1res.ine
@@ -0,0 +1,18 @@
+H-representation
+begin
+14 4 integer
+ 5 -1 -1 1
+ 2 0 0 1
+ 5 -1 1 1
+ 5 1 -1 1
+ 2 1 0 0
+ 5 1 1 1
+ 5 1 1 -1
+ 5 1 -1 -1
+ 2 0 1 0
+ 5 -1 1 -1
+ 2 0 0 -1
+ 5 -1 -1 -1
+ 2 0 -1 0
+ 2 -1 0 0
+end
diff --git a/demos/ppl_lcdd/examples/project2_m.ine b/demos/ppl_lcdd/examples/project2_m.ine
new file mode 100644
index 0000000..a71cbff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2_m.ine
@@ -0,0 +1,66 @@
+H-representation
+begin
+62 7 integer
+ 7 0 0 0 -3 1 -2
+ 9 0 0 0 -2 -1 -3
+ 7 0 0 0 -2 1 -3
+ 9 0 0 0 -3 -1 -2
+ 3 0 0 0 -2 3 -1
+ 1 0 0 0 -2 3 1
+ 5 0 0 0 -3 2 -1
+ 3 0 0 0 -3 2 1
+ 3 0 0 0 1 -3 2
+ 1 0 0 0 1 -2 3
+ 5 0 0 0 -1 -3 2
+ 3 0 0 0 -1 -2 3
+ -3 0 0 0 1 2 3
+ -3 0 0 0 1 3 2
+ -1 0 0 0 -1 2 3
+ -1 0 0 0 -1 3 2
+ 1 0 0 0 3 1 -2
+ 5 0 0 0 2 -1 -3
+ 3 0 0 0 3 -1 -2
+ 3 0 0 0 2 1 -3
+ -1 0 0 0 2 3 -1
+ -1 0 0 0 3 2 -1
+ -3 0 0 0 2 3 1
+ -3 0 0 0 3 2 1
+ -3 0 0 0 2 1 3
+ -1 0 0 0 3 -1 2
+ -1 0 0 0 2 -1 3
+ -3 0 0 0 3 1 2
+ 3 0 0 0 2 -3 1
+ 5 0 0 0 2 -3 -1
+ 1 0 0 0 3 -2 1
+ 3 0 0 0 3 -2 -1
+ 3 0 0 0 -1 3 -2
+ 5 0 0 0 -1 2 -3
+ 1 0 0 0 1 3 -2
+ 3 0 0 0 1 2 -3
+ 9 0 0 0 -1 -2 -3
+ 9 0 0 0 -1 -3 -2
+ 7 0 0 0 1 -2 -3
+ 7 0 0 0 1 -3 -2
+ 5 0 0 0 -3 -1 2
+ 1 0 0 0 -2 1 3
+ 3 0 0 0 -2 -1 3
+ 3 0 0 0 -3 1 2
+ 7 0 0 0 -2 -3 1
+ 9 0 0 0 -2 -3 -1
+ 7 0 0 0 -3 -2 1
+ 9 0 0 0 -3 -2 -1
+ 0 1 0 0 -1 0 0
+ 0 0 1 0 0 -1 0
+ 0 0 0 1 0 0 -1
+ 2 -1 0 0 1 0 0
+ 2 0 -1 0 0 1 0
+ 2 0 0 -1 0 0 1
+ -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1
+ 3 -1 -1 1 1 1 -1
+ 3 1 -1 -1 -1 1 1
+ 3 -1 1 -1 1 -1 1
+ 5 -1 -1 -1 1 1 1
+end
diff --git a/demos/ppl_lcdd/examples/project2res.ine b/demos/ppl_lcdd/examples/project2res.ine
new file mode 100644
index 0000000..740f2aa
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2res.ine
@@ -0,0 +1,90 @@
+H-representation
+begin
+86 4 integer
+ 9 -2 1 -1
+ 16 -3 1 -2
+ 20 -3 -1 -2
+ 12 -3 2 -1
+ 8 -3 2 1
+ 8 -2 -1 3
+ 4 -2 1 3
+ 8 -2 3 -1
+ 4 -2 3 1
+ 9 -1 -2 1
+ 11 -2 -2 2
+ 5 -1 -1 2
+ 1 -1 1 2
+ 3 -2 2 2
+ 1 -1 2 1
+ 4 0 0 -1
+ 0 0 1 0
+ 8 -1 -2 3
+ 12 -1 -3 2
+ 0 -1 2 3
+ 0 -1 3 2
+ 5 1 -2 1
+ 8 1 -3 2
+ 4 1 -2 3
+ 1 1 -1 2
+ -3 1 1 2
+ -4 1 2 3
+ -4 1 3 2
+ -3 1 2 1
+ 3 2 -2 2
+ -5 2 2 2
+ 8 2 1 -3
+ 12 2 -1 -3
+ 0 2 3 -1
+ -4 2 3 1
+ 1 2 -1 1
+ 4 3 -2 1
+ 0 3 -1 2
+ -3 2 1 1
+ -4 3 1 2
+ -4 3 2 1
+ 0 1 0 0
+ 0 3 2 -1
+ 4 3 1 -2
+ 1 2 1 -1
+ 8 3 -1 -2
+ 8 3 -2 -1
+ 5 2 -1 -1
+ 0 2 -1 3
+ -4 2 1 3
+ 8 2 -3 1
+ 12 2 -3 -1
+ 3 2 2 -2
+ 11 2 -2 -2
+ 1 1 2 -1
+ 4 1 3 -2
+ 8 1 2 -3
+ 5 1 1 -2
+ 9 1 -1 -2
+ 16 1 -2 -3
+ 16 1 -3 -2
+ 9 1 -2 -1
+ 12 -1 2 -3
+ 8 -1 3 -2
+ 20 -1 -2 -3
+ 20 -1 -3 -2
+ 0 0 0 1
+ 4 0 -1 0
+ 5 -1 2 -1
+ 11 -2 2 -2
+ 9 -1 1 -2
+ 13 -1 -1 -2
+ 19 -2 -2 -2
+ 13 -1 -2 -1
+ 16 -2 1 -3
+ 20 -2 -1 -3
+ 16 -2 -3 1
+ 20 -2 -3 -1
+ 12 -3 -1 2
+ 8 -3 1 2
+ 5 -2 1 1
+ 16 -3 -2 1
+ 20 -3 -2 -1
+ 9 -2 -1 1
+ 13 -2 -1 -1
+ 4 -1 0 0
+end
diff --git a/demos/ppl_lcdd/examples/rcubocta.ine b/demos/ppl_lcdd/examples/rcubocta.ine
new file mode 100644
index 0000000..909db72
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rcubocta.ine
@@ -0,0 +1,31 @@
+* Rhombicuboctahedron
+H-representation
+begin
+ 26 4 integer
+ 1 1 0 0
+ 1 0 1 0
+ 1 0 0 1
+ 1 -1 0 0
+ 1 0 -1 0
+ 1 0 0 -1
+ 2 1 1 1
+ 2 -1 1 1
+ 2 1 -1 1
+ 2 1 1 -1
+ 2 -1 -1 1
+ 2 1 -1 -1
+ 2 -1 1 -1
+ 2 -1 -1 -1
+ 3 2 2 0
+ 3 0 2 2
+ 3 2 0 2
+ 3 -2 2 0
+ 3 0 -2 2
+ 3 2 0 -2
+ 3 2 -2 0
+ 3 0 2 -2
+ 3 -2 0 2
+ 3 -2 -2 0
+ 3 0 -2 -2
+ 3 -2 0 -2
+end
diff --git a/demos/ppl_lcdd/examples/redcheck.ext b/demos/ppl_lcdd/examples/redcheck.ext
new file mode 100644
index 0000000..e970c42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/redcheck.ext
@@ -0,0 +1,11 @@
+V-representation
+begin
+ 7 3 integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ext b/demos/ppl_lcdd/examples/reg24-5.ext
new file mode 100644
index 0000000..b755b67
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ext
@@ -0,0 +1,31 @@
+* The vertices of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+* We use hull option to compute all (24) facet inequalities.
+V-representation
+begin
+ 24 5 integer
+ 1 1 1 1 1
+ 1 1 1 1 -1
+ 1 1 1 -1 1
+ 1 1 1 -1 -1
+ 1 1 -1 1 1
+ 1 1 -1 1 -1
+ 1 1 -1 -1 1
+ 1 1 -1 -1 -1
+ 1 -1 1 1 1
+ 1 -1 1 1 -1
+ 1 -1 1 -1 1
+ 1 -1 1 -1 -1
+ 1 -1 -1 1 1
+ 1 -1 -1 1 -1
+ 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1
+ 1 2 0 0 0
+ 1 0 2 0 0
+ 1 0 0 2 0
+ 1 0 0 0 2
+ 1 -2 0 0 0
+ 1 0 -2 0 0
+ 1 0 0 -2 0
+ 1 0 0 0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ine b/demos/ppl_lcdd/examples/reg24-5.ine
new file mode 100644
index 0000000..d984817
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ine
@@ -0,0 +1,30 @@
+* The facets of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+H-representation
+begin
+ 24 5 integer
+ 1 1 1 1 1
+ 1 1 1 1 -1
+ 1 1 1 -1 1
+ 1 1 1 -1 -1
+ 1 1 -1 1 1
+ 1 1 -1 1 -1
+ 1 1 -1 -1 1
+ 1 1 -1 -1 -1
+ 1 -1 1 1 1
+ 1 -1 1 1 -1
+ 1 -1 1 -1 1
+ 1 -1 1 -1 -1
+ 1 -1 -1 1 1
+ 1 -1 -1 1 -1
+ 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1
+ 1 2 0 0 0
+ 1 0 2 0 0
+ 1 0 0 2 0
+ 1 0 0 0 2
+ 1 -2 0 0 0
+ 1 0 -2 0 0
+ 1 0 0 -2 0
+ 1 0 0 0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg600-5_m.ext b/demos/ppl_lcdd/examples/reg600-5_m.ext
new file mode 100644
index 0000000..4147d7f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg600-5_m.ext
@@ -0,0 +1,606 @@
+* The vertices of a 4-dim regular polytope with 600 vertices.
+* Hull computation for finding all 120 facets.
+V-representation
+begin
+600 5 rational
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2 -2 0 0
+1 -2 0 -2 0
+1 -2 0 0 -2
+1 -2 0 0 2
+1 -2 0 2 0
+1 -2 2 0 0
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -2 -2 0
+1 0 -2 0 -2
+1 0 -2 0 2
+1 0 -2 2 0
+1 0 0 -2 -2
+1 0 0 -2 2
+1 0 0 2 -2
+1 0 0 2 2
+1 0 2 -2 0
+1 0 2 0 -2
+1 0 2 0 2
+1 0 2 2 0
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 2 -2 0 0
+1 2 0 -2 0
+1 2 0 0 -2
+1 2 0 0 2
+1 2 0 2 0
+1 2 2 0 0
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+end
diff --git a/demos/ppl_lcdd/examples/rhomtria_m.ine b/demos/ppl_lcdd/examples/rhomtria_m.ine
new file mode 100644
index 0000000..26757d4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rhomtria_m.ine
@@ -0,0 +1,35 @@
+* Rhombic Triacontahedron
+H-representation
+begin
+30 4 integer
+14411518807585588 -22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 13761775885668118
+14411518807585588 -13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 8505245247627733
+14411518807585588 -8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 22267021104472812
+3602879701896397 -6880887957245578 0 0
+3602879701896397 0 -6880887957245578 0
+3602879701896397 0 0 -6880887957245578
+3602879701896397 0 0 6880887957245578
+3602879701896397 0 6880887957245578 0
+3602879701896397 6880887957245578 0 0
+14411518807585588 8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 13761775885668118 22267021104472812
+14411518807585588 13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 22267021104472812 8505245247627733
+14411518807585588 22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 8505245247627733 13761775885668118
+end
diff --git a/demos/ppl_lcdd/examples/sample.ine b/demos/ppl_lcdd/examples/sample.ine
new file mode 100644
index 0000000..452e1bf
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sample.ine
@@ -0,0 +1,11 @@
+* 3-cube
+H-representation
+begin
+ 6 4 rational
+ 10/3 1 0 0
+ 10/3 0 1 0
+ 10/3 0 0 1
+ 10/3 -1 0 0
+ 10/3 0 -1 0
+ 10/3 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/sampleh1.ine b/demos/ppl_lcdd/examples/sampleh1.ine
new file mode 100644
index 0000000..93f3df3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh1.ine
@@ -0,0 +1,9 @@
+* a 3-D cone containing no vertices and a line
+H-representation
+begin
+ 3 4 integer
+ 2 -1 -1 0
+ 0 1 0 0
+ 0 0 1 0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh2.ine b/demos/ppl_lcdd/examples/sampleh2.ine
new file mode 100644
index 0000000..082026d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh2.ine
@@ -0,0 +1,7 @@
+* a hyperplane with no vertices and rays
+H-representation
+begin
+ 1 4 integer
+-1 0 0 1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh3.ine b/demos/ppl_lcdd/examples/sampleh3.ine
new file mode 100644
index 0000000..b2ace9b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh3.ine
@@ -0,0 +1,7 @@
+* a 3-D homogeneous cone with no vertices
+H-representation
+begin
+ 2 4 integer
+ 0 1 1 0
+ 0 0 1 0
+end
diff --git a/demos/ppl_lcdd/examples/sampleh4.ine b/demos/ppl_lcdd/examples/sampleh4.ine
new file mode 100644
index 0000000..f929e10
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh4.ine
@@ -0,0 +1,12 @@
+* trivial inequalities: the polyhedron is the whole space.
+H-representation
+begin
+ 6 4 integer
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+ 0 0 0 0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh5.ine b/demos/ppl_lcdd/examples/sampleh5.ine
new file mode 100644
index 0000000..ec122d5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh5.ine
@@ -0,0 +1,15 @@
+* test file for redundancy removal
+H-representation
+linearity 1 3
+begin
+ 8 4 integer
+ 0 1 0 0
+ 0 0 1 0
+ 0 0 0 1
+ 1 -1 -1 -1
+ 1 -1 -1 0
+ 1 0 -1 -1
+ 1 -1 0 -1
+ 2 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh6.ine b/demos/ppl_lcdd/examples/sampleh6.ine
new file mode 100644
index 0000000..b9c93a7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh6.ine
@@ -0,0 +1,11 @@
+* test file for forced-equality checking
+H-representation
+begin
+ 5 4 integer
+ 0 1 0 0
+ 0 0 1 0
+ 0 0 0 1
+ 1 -1 -1 -1
+-1 1 1 0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh7.ine b/demos/ppl_lcdd/examples/sampleh7.ine
new file mode 100644
index 0000000..c4c09d2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh7.ine
@@ -0,0 +1,19 @@
+* test file for redundancy removal
+* the redundant rows are
+* 3 4 5 9 10
+* LP type = 1 Seed = 123
+H-representation
+begin
+ 10 3 integer
+ 0 1 0
+ 0 0 1
+ -10000 651 693
+ -10000 697 637
+ -10000 368 824
+ -10000 87 725
+ -10000 387 219
+ -10000 430 202
+ -10000 356 988
+ -10000 674 979
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh8.ine b/demos/ppl_lcdd/examples/sampleh8.ine
new file mode 100644
index 0000000..cf5f54c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh8.ine
@@ -0,0 +1,110 @@
+* test file for redundancy removal
+* the redundant rows are
+* 10 11 12 14 21 23 26 32 39 40 41 44 46
+* 50 51 54 56 57 59 62 63 64 69 76 77 78
+* 79 83 84 85 87 88 91 94 97
+* LP type = 1 Seed = 123
+H-representation
+begin
+ 100 10 integer
+ 0 1 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 1
+ -10000 651 693 84 697 637 340 368 824 663
+ -10000 725 742 387 219 751 430 202 745 356
+ -10000 377 674 979 167 815 988 412 676 475
+ -10000 710 275 949 284 629 1 422 974 510
+ -10000 692 945 725 488 271 430 724 225 726
+ -10000 465 258 450 343 87 168 161 103 919
+ -10000 86 79 656 493 832 514 791 506 29
+ -10000 63 630 874 918 877 272 992 119 480
+ -10000 598 926 42 378 288 66 927 919 99
+ -10000 256 354 106 979 641 160 395 225 837
+ -10000 202 388 900 471 160 751 300 731 818
+ -10000 342 502 825 563 639 261 194 984 990
+ -10000 266 406 364 216 448 675 145 694 866
+ -10000 362 983 732 378 134 902 946 877 205
+ -10000 926 125 949 888 234 630 275 707 67
+ -10000 634 81 192 768 652 822 311 961 895
+ -10000 983 597 743 314 696 585 367 396 826
+ -10000 511 545 539 97 111 996 477 35 372
+ -10000 474 103 152 753 159 120 929 161 563
+ -10000 549 793 307 456 444 184 149 792 894
+ -10000 839 488 917 192 168 788 959 245 25
+ -10000 750 165 338 182 392 381 962 117 713
+ -10000 738 827 943 507 914 814 951 663 815
+ -10000 493 339 225 351 450 788 992 167 792
+ -10000 174 773 247 247 180 517 445 599 596
+ -10000 303 26 967 39 535 4 7 335 217
+ -10000 772 173 189 291 668 191 610 677 544
+ -10000 848 642 40 125 865 100 259 534 648
+ -10000 501 622 398 624 118 416 30 17 236
+ -10000 218 602 697 892 322 314 361 573 985
+ -10000 958 856 608 492 563 478 311 614 740
+ -10000 582 913 938 949 715 338 39 726 998
+ -10000 521 805 708 221 624 316 24 127 322
+ -10000 491 189 412 774 418 200 193 633 315
+ -10000 144 679 383 447 989 939 441 631 482
+ -10000 940 241 153 215 149 457 254 207 125
+ -10000 80 873 207 904 684 600 940 431 825
+ -10000 75 100 353 637 432 377 940 758 164
+ -10000 627 721 915 710 8 786 96 17 576
+ -10000 247 104 607 432 540 164 597 282 317
+ -10000 553 787 881 942 152 318 44 509 518
+ -10000 181 772 942 993 916 900 713 694 812
+ -10000 625 26 638 261 385 196 676 717 572
+ -10000 11 911 296 761 658 631 757 817 400
+ -10000 964 989 879 491 490 751 490 97 405
+ -10000 28 461 343 452 480 504 411 242 892
+ -10000 768 746 347 352 724 487 185 767 287
+ -10000 924 228 958 554 352 460 765 742 430
+ -10000 737 986 499 993 721 29 821 416 813
+ -10000 483 458 249 781 584 321 779 209 570
+ -10000 222 166 975 53 765 256 859 469 164
+ -10000 82 696 181 166 375 145 415 496 261
+ -10000 540 309 526 918 439 489 846 417 775
+ -10000 699 145 327 873 467 866 711 393 603
+ -10000 445 668 729 224 654 970 279 789 680
+ -10000 28 659 365 306 186 520 427 176 191
+ -10000 919 58 859 436 105 35 560 716 14
+ -10000 641 238 340 524 205 255 272 14 472
+ -10000 817 22 904 782 573 847 649 100 280
+ -10000 925 277 930 495 736 960 276 726 657
+ -10000 336 54 357 979 941 765 593 630 286
+ -10000 65 113 104 915 222 158 580 520 188
+ -10000 42 617 904 414 588 857 416 94 988
+ -10000 716 49 849 67 607 99 934 184 217
+ -10000 458 32 500 552 108 980 255 998 935
+ -10000 860 936 115 268 231 281 948 209 766
+ -10000 293 330 940 570 857 421 574 481 364
+ -10000 959 949 372 757 306 757 752 312 137
+ -10000 769 303 737 260 187 695 946 723 433
+ -10000 980 564 605 363 776 893 558 616 603
+ -10000 945 23 632 820 54 677 795 616 625
+ -10000 629 692 585 33 674 703 304 489 949
+ -10000 52 903 723 746 692 232 917 933 211
+ -10000 367 566 364 318 607 818 424 234 605
+ -10000 915 305 354 829 469 447 925 188 799
+ -10000 387 596 946 888 751 614 539 295 299
+ -10000 969 902 10 739 289 923 808 28 151
+ -10000 537 152 546 442 182 301 258 265 762
+ -10000 671 288 343 199 694 391 457 947 250
+ -10000 415 734 423 435 696 111 53 227 784
+ -10000 800 992 720 76 40 419 608 182 683
+ -10000 619 627 278 526 453 960 772 992 86
+ -10000 836 623 0 21 371 4 676 964 658
+ -10000 258 677 64 968 62 219 587 308 299
+ -10000 224 823 258 449 575 526 908 585 405
+ -10000 593 660 663 341 36 79 50 242 293
+ -10000 80 761 270 460 82 133 874 559 41
+ -10000 169 539 257 827 222 743 873 929 523
+ -10000 403 167 259 377 76 160 749 448 902
+ -10000 290 5 276 509 342 909 193 443 552
+ -10000 928 326 757 405 598 765 143 833 150
+end
diff --git a/demos/ppl_lcdd/examples/samplev1.ext b/demos/ppl_lcdd/examples/samplev1.ext
new file mode 100644
index 0000000..b68bf9f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev1.ext
@@ -0,0 +1,8 @@
+* a 1-D cone in 3D space
+V-representation
+begin
+ 2 4 integer
+ 1 1 0 1
+ 0 0 1 0
+end
+
diff --git a/demos/ppl_lcdd/examples/samplev2.ext b/demos/ppl_lcdd/examples/samplev2.ext
new file mode 100644
index 0000000..99ab9f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev2.ext
@@ -0,0 +1,11 @@
+* a 1-D cone in 3D space without any vertices
+V-representation
+linearity 1 3
+begin
+ 3 4 integer
+ 0 0 0 1
+ 1 1 0 0
+ 0 1 -1 0
+end
+
+
diff --git a/demos/ppl_lcdd/examples/samplev3.ext b/demos/ppl_lcdd/examples/samplev3.ext
new file mode 100644
index 0000000..bc92ef4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev3.ext
@@ -0,0 +1,16 @@
+* test file for redundancy removal
+* the redundant rows: 2 4 5 6 7
+* the implicit linearities : 8 9
+V-representation
+begin
+ 9 3 integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+ 0 1 0
+ 0 -1 0
+end
diff --git a/demos/ppl_lcdd/examples/trunc10.ine b/demos/ppl_lcdd/examples/trunc10.ine
new file mode 100644
index 0000000..3f5bd91
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc10.ine
@@ -0,0 +1,119 @@
+* delta=1/10
+* eps0=1/20
+* scut=1/40
+* pcut=1/40
+begin
+112 11 integer
+3 5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 -5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 0 10 0 0 0 0 0 0 0 20
+3 0 20 0 0 0 0 0 0 0 10
+3 5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 -5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 0 20 10 0 0 0 0 0 0 0
+3 0 20 0 10 0 0 0 0 0 0
+3 0 20 0 0 10 0 0 0 0 0
+3 0 20 0 0 0 10 0 0 0 0
+3 0 20 0 0 0 0 10 0 0 0
+3 0 20 0 0 0 0 0 10 0 0
+3 0 20 0 0 0 0 0 0 10 0
+3 0 0 10 0 0 0 0 0 0 20
+3 0 0 20 0 0 0 0 0 0 10
+3 5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 -5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 0 10 20 0 0 0 0 0 0 0
+3 0 0 20 10 0 0 0 0 0 0
+3 0 0 20 0 10 0 0 0 0 0
+3 0 0 20 0 0 10 0 0 0 0
+3 0 0 20 0 0 0 10 0 0 0
+3 0 0 20 0 0 0 0 10 0 0
+3 0 0 20 0 0 0 0 0 10 0
+3 0 0 0 10 0 0 0 0 0 20
+3 0 0 0 20 0 0 0 0 0 10
+3 5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 -5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 0 10 0 20 0 0 0 0 0 0
+3 0 0 10 20 0 0 0 0 0 0
+3 0 0 0 20 10 0 0 0 0 0
+3 0 0 0 20 0 10 0 0 0 0
+3 0 0 0 20 0 0 10 0 0 0
+3 0 0 0 20 0 0 0 10 0 0
+3 0 0 0 20 0 0 0 0 10 0
+3 0 0 0 0 10 0 0 0 0 20
+3 0 0 0 0 20 0 0 0 0 10
+3 5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 -5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 0 10 0 0 20 0 0 0 0 0
+3 0 0 10 0 20 0 0 0 0 0
+3 0 0 0 10 20 0 0 0 0 0
+3 0 0 0 0 20 10 0 0 0 0
+3 0 0 0 0 20 0 10 0 0 0
+3 0 0 0 0 20 0 0 10 0 0
+3 0 0 0 0 20 0 0 0 10 0
+3 0 0 0 0 0 10 0 0 0 20
+3 0 0 0 0 0 20 0 0 0 10
+3 5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 -5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 0 10 0 0 0 20 0 0 0 0
+3 0 0 10 0 0 20 0 0 0 0
+3 0 0 0 10 0 20 0 0 0 0
+3 0 0 0 0 10 20 0 0 0 0
+3 0 0 0 0 0 20 10 0 0 0
+3 0 0 0 0 0 20 0 10 0 0
+3 0 0 0 0 0 20 0 0 10 0
+3 0 0 0 0 0 0 10 0 0 20
+3 0 0 0 0 0 0 20 0 0 10
+3 5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 -5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 0 10 0 0 0 0 20 0 0 0
+3 0 0 10 0 0 0 20 0 0 0
+3 0 0 0 10 0 0 20 0 0 0
+3 0 0 0 0 10 0 20 0 0 0
+3 0 0 0 0 0 10 20 0 0 0
+3 0 0 0 0 0 0 20 10 0 0
+3 0 0 0 0 0 0 20 0 10 0
+3 0 0 0 0 0 0 0 10 0 20
+3 0 0 0 0 0 0 0 20 0 10
+3 5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 -5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 0 10 0 0 0 0 0 20 0 0
+3 0 0 10 0 0 0 0 20 0 0
+3 0 0 0 10 0 0 0 20 0 0
+3 0 0 0 0 10 0 0 20 0 0
+3 0 0 0 0 0 10 0 20 0 0
+3 0 0 0 0 0 0 10 20 0 0
+3 0 0 0 0 0 0 0 20 10 0
+3 0 0 0 0 0 0 0 0 10 20
+3 0 0 0 0 0 0 0 0 20 10
+3 5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 -5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 0 10 0 0 0 0 0 0 20 0
+3 0 0 10 0 0 0 0 0 20 0
+3 0 0 0 10 0 0 0 0 20 0
+3 0 0 0 0 10 0 0 0 20 0
+3 0 0 0 0 0 10 0 0 20 0
+3 0 0 0 0 0 0 10 0 20 0
+3 0 0 0 0 0 0 0 10 20 0
+1 10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+1 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+39 40 0 0 0 0 0 0 0 0 0
+39 -40 0 0 0 0 0 0 0 0 0
+1 0 8 0 0 0 0 0 0 0 0
+1 0 0 8 0 0 0 0 0 0 0
+1 0 0 0 8 0 0 0 0 0 0
+1 0 0 0 0 8 0 0 0 0 0
+1 0 0 0 0 0 8 0 0 0 0
+1 0 0 0 0 0 0 8 0 0 0
+1 0 0 0 0 0 0 0 8 0 0
+1 0 0 0 0 0 0 0 0 8 0
+1 0 0 0 0 0 0 0 0 0 8
+7 0 -8 0 0 0 0 0 0 0 0
+7 0 0 -8 0 0 0 0 0 0 0
+7 0 0 0 -8 0 0 0 0 0 0
+7 0 0 0 0 -8 0 0 0 0 0
+7 0 0 0 0 0 -8 0 0 0 0
+7 0 0 0 0 0 0 -8 0 0 0
+7 0 0 0 0 0 0 0 -8 0 0
+7 0 0 0 0 0 0 0 0 -8 0
+7 0 0 0 0 0 0 0 0 0 -8
+end
diff --git a/demos/ppl_lcdd/examples/trunc7.ine b/demos/ppl_lcdd/examples/trunc7.ine
new file mode 100644
index 0000000..8250bc0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc7.ine
@@ -0,0 +1,65 @@
+* delta=1/7
+* eps0=1/14
+* scut=1/28
+* pcut=1/28
+begin
+58 8 integer
+6 7 -7 -7 -7 -7 -7 28
+6 -7 -7 -7 -7 -7 -7 28
+3 0 7 0 0 0 0 14
+3 0 14 0 0 0 0 7
+6 7 28 -7 -7 -7 -7 -7
+6 -7 28 -7 -7 -7 -7 -7
+3 0 14 7 0 0 0 0
+3 0 14 0 7 0 0 0
+3 0 14 0 0 7 0 0
+3 0 14 0 0 0 7 0
+3 0 0 7 0 0 0 14
+3 0 0 14 0 0 0 7
+6 7 -7 28 -7 -7 -7 -7
+6 -7 -7 28 -7 -7 -7 -7
+3 0 7 14 0 0 0 0
+3 0 0 14 7 0 0 0
+3 0 0 14 0 7 0 0
+3 0 0 14 0 0 7 0
+3 0 0 0 7 0 0 14
+3 0 0 0 14 0 0 7
+6 7 -7 -7 28 -7 -7 -7
+6 -7 -7 -7 28 -7 -7 -7
+3 0 7 0 14 0 0 0
+3 0 0 7 14 0 0 0
+3 0 0 0 14 7 0 0
+3 0 0 0 14 0 7 0
+3 0 0 0 0 7 0 14
+3 0 0 0 0 14 0 7
+6 7 -7 -7 -7 28 -7 -7
+6 -7 -7 -7 -7 28 -7 -7
+3 0 7 0 0 14 0 0
+3 0 0 7 0 14 0 0
+3 0 0 0 7 14 0 0
+3 0 0 0 0 14 7 0
+3 0 0 0 0 0 7 14
+3 0 0 0 0 0 14 7
+6 7 -7 -7 -7 -7 28 -7
+6 -7 -7 -7 -7 -7 28 -7
+3 0 7 0 0 0 14 0
+3 0 0 7 0 0 14 0
+3 0 0 0 7 0 14 0
+3 0 0 0 0 7 14 0
+1 7 -7 -7 -7 -7 -7 -7
+1 -7 -7 -7 -7 -7 -7 -7
+27 28 0 0 0 0 0 0
+27 -28 0 0 0 0 0 0
+5 0 28 0 0 0 0 0
+5 0 0 28 0 0 0 0
+5 0 0 0 28 0 0 0
+5 0 0 0 0 28 0 0
+5 0 0 0 0 0 28 0
+5 0 0 0 0 0 0 28
+23 0 -28 0 0 0 0 0
+23 0 0 -28 0 0 0 0
+23 0 0 0 -28 0 0 0
+23 0 0 0 0 -28 0 0
+23 0 0 0 0 0 -28 0
+23 0 0 0 0 0 0 -28
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ext b/demos/ppl_lcdd/examples/tsp5.ext
new file mode 100644
index 0000000..b4e6874
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 11 rational
+ 1 0 0 1 1 1 1 0 0 1 0
+ 1 1 0 0 1 0 1 0 1 1 0
+ 1 0 1 0 1 0 1 1 1 0 0
+ 1 0 1 0 1 1 1 0 0 0 1
+ 1 0 1 1 0 0 1 1 0 1 0
+ 1 0 1 1 0 1 0 1 0 0 1
+ 1 1 1 0 0 0 0 1 1 0 1
+ 1 1 1 0 0 0 1 0 0 1 1
+ 1 1 0 1 0 0 0 1 1 1 0
+ 1 1 0 1 0 1 0 0 0 1 1
+ 1 0 0 1 1 1 0 1 1 0 0
+ 1 1 0 0 1 1 0 0 1 0 1
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ine b/demos/ppl_lcdd/examples/tsp5.ine
new file mode 100644
index 0000000..04563a2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ine
@@ -0,0 +1,30 @@
+H-representation
+linearity 5 1 2 3 4 5
+begin
+25 11 rational
+-2 1 1 1 1 0 0 0 0 0 0
+-2 1 0 0 0 1 1 1 0 0 0
+-3 1 1 1 0 1 1 0 1 0 0
+ 1 -1 0 -1 0 0 -1 0 0 1 0
+ 1 -1 -1 0 0 -1 0 0 0 0 1
+ 1 -1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0
+ 2 -1 -1 0 0 -1 0 0 0 0 0
+ 1 0 0 0 0 -1 0 0 0 0 0
+ 2 -1 0 0 0 -1 -1 0 0 0 0
+-1 1 0 1 0 0 1 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0
+-1 1 1 1 0 0 0 0 0 0 0
+-2 1 1 1 0 1 1 0 0 0 0
+ 2 -1 -1 -1 0 0 0 0 0 0 0
+ 1 0 0 -1 0 0 0 0 0 0 0
+ 2 -1 0 -1 0 0 -1 0 0 0 0
+ 3 -1 -1 -1 0 -1 -1 0 0 0 0
+-1 1 0 0 0 1 1 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0
+-1 1 1 0 0 1 0 0 0 0 0
+ 1 0 -1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 -1 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/expected_int16 b/demos/ppl_lcdd/expected_int16
new file mode 100644
index 0000000..281f13b
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16
@@ -0,0 +1,98 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+ccp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine d41d8cd98f00b204e9800998ecf8427e -
+in5.ine d41d8cd98f00b204e9800998ecf8427e -
+in6.ine d41d8cd98f00b204e9800998ecf8427e -
+in7.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mit31-20.ine 03aef81d50c861b73302866415184106 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine d41d8cd98f00b204e9800998ecf8427e -
+sampleh8.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc10.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int16_a b/demos/ppl_lcdd/expected_int16_a
new file mode 100644
index 0000000..8dbcb68
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16_a
@@ -0,0 +1,85 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine d41d8cd98f00b204e9800998ecf8427e -
+in5.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc7.ine d41d8cd98f00b204e9800998ecf8427e -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int32 b/demos/ppl_lcdd/expected_int32
new file mode 100644
index 0000000..351a73b
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32
@@ -0,0 +1,98 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+ccp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine 9e3e0e301762546a26557c8bee786732 -
+in5.ine c29524500ec4656ca26c5671df46db96 -
+in6.ine 1d81f92f878af596166bc64c20392e5b -
+in7.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mit31-20.ine 03aef81d50c861b73302866415184106 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 -
+sampleh8.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int32_a b/demos/ppl_lcdd/expected_int32_a
new file mode 100644
index 0000000..afac8d7
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32_a
@@ -0,0 +1,85 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine d41d8cd98f00b204e9800998ecf8427e -
+in5.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc7.ine d41d8cd98f00b204e9800998ecf8427e -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int64 b/demos/ppl_lcdd/expected_int64
new file mode 100644
index 0000000..bae6f3d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64
@@ -0,0 +1,98 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+ccp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 -
+cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d -
+cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 -
+irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine 9e3e0e301762546a26557c8bee786732 -
+in5.ine c29524500ec4656ca26c5671df46db96 -
+in6.ine 1d81f92f878af596166bc64c20392e5b -
+in7.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mit31-20.ine 03aef81d50c861b73302866415184106 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 -
+sampleh8.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int64_a b/demos/ppl_lcdd/expected_int64_a
new file mode 100644
index 0000000..b8e517c
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64_a
@@ -0,0 +1,85 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine 9e3e0e301762546a26557c8bee786732 -
+in5.ine c29524500ec4656ca26c5671df46db96 -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int8 b/demos/ppl_lcdd/expected_int8
new file mode 100644
index 0000000..179b90d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8
@@ -0,0 +1,98 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+ccp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 -
+cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine d41d8cd98f00b204e9800998ecf8427e -
+cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine d41d8cd98f00b204e9800998ecf8427e -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine d41d8cd98f00b204e9800998ecf8427e -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine d41d8cd98f00b204e9800998ecf8427e -
+in5.ine d41d8cd98f00b204e9800998ecf8427e -
+in6.ine d41d8cd98f00b204e9800998ecf8427e -
+in7.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mit31-20.ine d41d8cd98f00b204e9800998ecf8427e -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine d41d8cd98f00b204e9800998ecf8427e -
+project2res.ine d41d8cd98f00b204e9800998ecf8427e -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine d41d8cd98f00b204e9800998ecf8427e -
+sampleh8.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc10.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc7.ine d41d8cd98f00b204e9800998ecf8427e -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_int8_a b/demos/ppl_lcdd/expected_int8_a
new file mode 100644
index 0000000..5e7a7d0
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8_a
@@ -0,0 +1,85 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e -
+cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e -
+irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine d41d8cd98f00b204e9800998ecf8427e -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine d41d8cd98f00b204e9800998ecf8427e -
+hexocta.ine d41d8cd98f00b204e9800998ecf8427e -
+icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e -
+in0.ine d41d8cd98f00b204e9800998ecf8427e -
+in1.ine d41d8cd98f00b204e9800998ecf8427e -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine d41d8cd98f00b204e9800998ecf8427e -
+in5.ine d41d8cd98f00b204e9800998ecf8427e -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e -
+kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine d41d8cd98f00b204e9800998ecf8427e -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine d41d8cd98f00b204e9800998ecf8427e -
+project2res.ine d41d8cd98f00b204e9800998ecf8427e -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine d41d8cd98f00b204e9800998ecf8427e -
+trunc7.ine d41d8cd98f00b204e9800998ecf8427e -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_mpz b/demos/ppl_lcdd/expected_mpz
new file mode 100644
index 0000000..0f5701e
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz
@@ -0,0 +1,98 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+ccp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp6.ext ac5556e9e9fd1100c6b9f97384f609da -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 -
+cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d -
+cyclic16-10.ext a7b2ba7c494b41e0f7faf6f34cb6ca48 -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 -
+irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+reg600-5_m.ext bf50ec3c18bc063d041f07259cbe0977 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+cyclic17_8.ine 7dde598eeb61433637ff7ecd1d9689e0 -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine 4a3d6132b5a0f2ee9a65e422b520bcce -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine 8a75d6463098ed2e2160c33f6955f3ac -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine bba9cb757ba441e33e0a3628fc13ed2c -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine 9e3e0e301762546a26557c8bee786732 -
+in5.ine c29524500ec4656ca26c5671df46db96 -
+in6.ine 1d81f92f878af596166bc64c20392e5b -
+in7.ine a5f569a088696cf71dbd23ccf5a2cca6 -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine 1736867592c3f53fb4d062ace63e6ba4 -
+kkd27_5.ine 9c376148791743bbb9d2a6b1467b8a11 -
+kkd38_6.ine 1c692bb63e7d61fad11d3b1e196eabe4 -
+kq20_11_m.ine a5f569a088696cf71dbd23ccf5a2cca6 -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mit31-20.ine 03aef81d50c861b73302866415184106 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine a351f4fc25819a278bdf2244f3f1c3a4 -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 -
+sampleh8.ine 8ddc3026fccbbeb3699fc6db254ff981 -
+trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/expected_mpz_a b/demos/ppl_lcdd/expected_mpz_a
new file mode 100644
index 0000000..561cef3
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz_a
@@ -0,0 +1,85 @@
+ccc4.ext bc96322497eecd12c4d0582ff2311cb4 -
+ccc5.ext 4964babfa462514ddeb8b3b549e92982 -
+ccp4.ext c57dd7951e50033fa8955810bbe273a3 -
+ccp5.ext 226f386e8780b30e239586b8b2964a0d -
+cp4.ext c57dd7951e50033fa8955810bbe273a3 -
+cp5.ext 226f386e8780b30e239586b8b2964a0d -
+cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 -
+cut16_11.ext 56ec06c653436caff88819989a739b74 -
+cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e -
+cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 -
+cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d -
+dcube10.ext aab7857f665af827774614f090f72b51 -
+dcube12.ext d2e47db88b9ea21f7fabb03c60421297 -
+dcube3.ext f37f7234953ac36f582bfcad6e933397 -
+dcube6.ext 09056814a1944456ce283f5839411c38 -
+dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a -
+irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 -
+irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e -
+mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 -
+redcheck.ext 12a70972a9385cf228abe8484f68f1c6 -
+reg24-5.ext 8e8fa94ededd63732112f68094fe0559 -
+samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 -
+samplev2.ext 6718e59a777d0ae297dbe7d6d305961a -
+samplev3.ext 425b227f7720ee71af25fadbec2560b9 -
+tsp5.ext e9e56d002855db0d1ba399d6cf991799 -
+1d.ine 89d8b1916d823aaf7563740c09f71470 -
+1da.ine 89d8b1916d823aaf7563740c09f71470 -
+allzero.ine 360296f0fb93ab70b1528453d6cf02ca -
+cp4.ine a868d7ab4d206871d4af3311059caa32 -
+cp5.ine a329d8a17d135c38d9bbc5709a523f9a -
+cross10.ine 38178216a0010320f29334df7a2f9eac -
+cross12.ine 1c24d854ca16cbb6281648219c37cf0a -
+cross4.ine a9bab74fd8c29016443a117b88827ca6 -
+cross6.ine 3b41f0b924526fec2616f6299fe14c6f -
+cross8.ine 32274fa3bd0758c81380bb305ec09d8f -
+cube.ine e2498d1cd888aa8cf2762bb5a8613592 -
+cube10.ine 9511f2116a3863917e7c75067ca2c2e5 -
+cube12.ine a71ae423c627c68442fc2dff2b2b9e0a -
+cube3.ine 4872fb1845557d484af5c09e47890ccc -
+cube6.ine 59218da4f6db0b742bd18271c9d5f6da -
+cube8.ine 857e4c7484b1dc5919a1629e46b856e8 -
+cubetop.ine f963c1b731386d994e03975ac98b5c25 -
+cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 -
+cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 -
+diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c -
+dodeca_m.ine 4a3d6132b5a0f2ee9a65e422b520bcce -
+ex1.ine 846681e0741bb57be1673b8c9170cd49 -
+grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab -
+hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 -
+icododeca_m.ine 8a75d6463098ed2e2160c33f6955f3ac -
+in0.ine aee5c7fb5cdf7881c33ac3e379986b79 -
+in1.ine bba9cb757ba441e33e0a3628fc13ed2c -
+in2.ine 30fc1812a724bad238f8af157ef58729 -
+in3.ine 662e46c09123c5aa87ae82a792dc3df6 -
+in4.ine 9e3e0e301762546a26557c8bee786732 -
+in5.ine c29524500ec4656ca26c5671df46db96 -
+infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 -
+integralpoints.ine e8057c28540aa563ef831399d8a15654 -
+kkd18_4.ine 1736867592c3f53fb4d062ace63e6ba4 -
+kkd27_5.ine 9c376148791743bbb9d2a6b1467b8a11 -
+kkd38_6.ine 1c692bb63e7d61fad11d3b1e196eabe4 -
+metric40_11.ine 8730ceaec3e4fe9f4155779510300011 -
+metric80_16.ine 60bc723581cb4ef986f654967511b104 -
+mp5.ine 8730ceaec3e4fe9f4155779510300011 -
+mp5a.ine 8730ceaec3e4fe9f4155779510300011 -
+mp6.ine a1d322a1bf98569f129efe4774099f0a -
+nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e -
+origin.ine 58ac995e1d9ce9dcc73d546675db0c91 -
+project1_m.ine 5330d7ef41d67f29d6102ae6d961112f -
+project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 -
+project2_m.ine 629a0c15eed90e3f84307bad56301493 -
+project2res.ine aaf40e2fe14795fb63f647773c0e13fe -
+rcubocta.ine b75aae81c225ab7a2bcaa6217384346f -
+reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 -
+rhomtria_m.ine a351f4fc25819a278bdf2244f3f1c3a4 -
+sample.ine 1b6dfffb7025fbca392de0a359db1f01 -
+sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede -
+sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c -
+sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 -
+sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca -
+sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc -
+sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 -
+sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 -
+trunc7.ine 989656d77040b040f10b241041f7c404 -
+tsp5.ine 214457d06fa51e69e2edd126f66e07fc -
diff --git a/demos/ppl_lcdd/ppl_lcdd.1 b/demos/ppl_lcdd/ppl_lcdd.1
new file mode 100644
index 0000000..ff895ef
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.1
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11.
+.TH PPL_LCDD "1" "October 2013" "ppl_lcdd 1.1" "User Commands"
+.SH NAME
+ppl_lcdd \- a PPL-based program for vertex/facet enumeration of convex polyhedra
+.SH SYNOPSIS
+.B ppl_lcdd
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads an H\-representation (resp., a V\-representation) of a polyhedron
+and generates a V\-representation (resp., an H\-representation) of
+the same polyhedron.
+.PP
+See the
+.IR "cddlib Reference Manual"
+for information on the file formats.
+.SH OPTIONS
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+produces lots of output
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
+checks if the result is equal to what is in PATH
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The option \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) is not available
+on some platforms.
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Komei Fukuda.
+.IR "cddlib Reference Manual",
+available (in several formats) at
+\fBhttp://www.ifor.math.ethz.ch/~fukuda/cdd_home/index.html\fR .
diff --git a/demos/ppl_lcdd/ppl_lcdd.cc b/demos/ppl_lcdd/ppl_lcdd.cc
new file mode 100644
index 0000000..8e2e2f4
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.cc
@@ -0,0 +1,1357 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+//#define USE_POLKA 1
+//#define USE_POLYLIB 1
+
+#if (!defined(USE_PPL) && !defined(USE_POLKA) && !defined(USE_POLYLIB))
+#define USE_PPL 1
+#elif \
+ (defined(USE_PPL) && defined(USE_POLKA)) \
+|| (defined(USE_PPL) && defined(USE_POLYLIB)) \
+|| (defined(USE_POLKA) && defined(USE_POLYLIB))
+#error "Exactly one among USE_PPL, USE_POLKA and USE_POLYLIB must be defined"
+#endif
+
+#if defined(USE_PPL)
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+#error "PPL version 0.6 or following is required"
+#endif
+
+typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_POLKA)
+
+#include <ppl-config.h>
+#include <gmp.h>
+
+extern "C" {
+#define bool polka_bool
+#define true polka_true
+#define false polka_false
+#define POLKA_NUM 3
+#include <polka/poly.h>
+#undef POLKA_NUM
+#undef false
+#undef true
+#undef bool
+#undef pkint_set
+#define pkint_set(a,b) mpz_set((a).rep, (b))
+}
+
+typedef poly_t* POLYHEDRON_TYPE;
+
+#elif defined(USE_POLYLIB)
+
+#include <ppl-config.h>
+#include <gmp.h>
+
+extern "C" {
+#include "polylib/polylibgmp.h"
+}
+
+// This is required (and, yes, 20000 is a magic number ;-)
+const unsigned max_constraints_or_generators = 20000;
+
+typedef Polyhedron* POLYHEDRON_TYPE;
+
+#endif
+
+#include "timings.hh"
+#include <gmpxx.h>
+#include <vector>
+#include <set>
+#include <limits>
+#include <climits>
+#include <cassert>
+#include <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+#if defined(PPL_HAVE_SYS_RESOURCE_H) \
+ && PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+ && (defined(SA_ONESHOT) || defined(SA_RESETHAND))
+# define PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+#endif
+
+namespace {
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+ {"max-cpu", required_argument, 0, 'C'},
+ {"max-memory", required_argument, 0, 'R'},
+ {"help", no_argument, 0, 'h'},
+ {"output", required_argument, 0, 'o'},
+ {"timings", no_argument, 0, 't'},
+ {"verbose", no_argument, 0, 'v'},
+#if defined(USE_PPL)
+ {"version", no_argument, 0, 'V'},
+ {"check", required_argument, 0, 'c'},
+#endif
+ {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]\n"
+"Reads an H-representation (resp., a V-representation) of a polyhedron\n"
+"and generates a V-representation (resp., an H-representation) of\n"
+"the same polyhedron.\n\n"
+"Options:\n"
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+" -CSECS, --max-cpu=SECS limits CPU usage to SECS seconds\n"
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+" -RMB, --max-memory=MB limits memory usage to MB megabytes\n"
+" -h, --help prints this help text to stdout\n"
+" -oPATH, --output=PATH appends output to PATH\n"
+" -t, --timings prints timings to stderr\n"
+" -v, --verbose produces lots of output\n"
+#if defined(USE_PPL)
+" -V, --version prints version information to stdout\n"
+" -cPATH, --check=PATH checks if the result is equal to what is in PATH\n"
+#endif
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#if defined(USE_PPL)
+#define OPTION_LETTERS "C:R:ho:tvVc:"
+#else
+#define OPTION_LETTERS "C:R:ho:tv"
+#endif
+
+const char* program_name = 0;
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+unsigned long max_seconds_of_cpu_time = 0;
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+unsigned long max_bytes_of_virtual_memory = 0;
+bool print_timings = false;
+bool verbose = false;
+const char* check_file_name = 0;
+
+void
+fatal(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+namespace {
+
+const char* input_file_name = 0;
+std::istream* input_stream_p = 0;
+
+void
+set_input(const char* file_name) {
+ if (input_stream_p && *input_stream_p != std::cin)
+ delete input_stream_p;
+
+ if (file_name) {
+ input_stream_p = new std::ifstream(file_name, std::ios_base::in);
+ if (!*input_stream_p)
+ fatal("cannot open input file `%s'", file_name);
+ input_file_name = file_name;
+ }
+ else {
+ input_stream_p = &std::cin;
+ input_file_name = "<cin>";
+ }
+}
+
+std::istream&
+input() {
+ assert(input_stream_p != 0);
+ return *input_stream_p;
+}
+
+const char* output_file_name = 0;
+std::ostream* output_stream_p = 0;
+
+void
+set_output(const char* file_name) {
+ if (output_stream_p && *output_stream_p != std::cout)
+ delete output_stream_p;
+
+ if (file_name) {
+ output_stream_p = new std::ofstream(file_name,
+ std::ios_base::out
+ | std::ios_base::app);
+ if (!*output_stream_p)
+ fatal("cannot open output file `%s'", file_name);
+ output_file_name = file_name;
+ }
+ else {
+ output_stream_p = &std::cout;
+ output_file_name = "<cout>";
+ }
+}
+
+std::ostream&
+output() {
+ assert(output_stream_p != 0);
+ return *output_stream_p;
+}
+
+} // namespace
+
+void
+error(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: in `%s': ", program_name, input_file_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+void
+warning(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+}
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+extern "C" typedef void (* const sig_handler_type)(int);
+
+void
+set_alarm_on_cpu_time(const unsigned long seconds, sig_handler_type handler) {
+ sigset_t mask;
+ sigemptyset(&mask);
+
+ struct sigaction s;
+ s.sa_handler = handler;
+ s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+ s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+ s.sa_flags = SA_RESETHAND;
+#else
+# error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+ if (sigaction(SIGXCPU, &s, 0) != 0)
+ fatal("sigaction failed: %s", strerror(errno));
+
+ struct rlimit t;
+ if (getrlimit(RLIMIT_CPU, &t) != 0)
+ fatal("getrlimit failed: %s", strerror(errno));
+
+ if (seconds < t.rlim_cur) {
+ t.rlim_cur = seconds;
+ if (setrlimit(RLIMIT_CPU, &t) != 0)
+ fatal("setrlimit failed: %s", strerror(errno));
+ }
+}
+
+#endif // PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(const unsigned long bytes) {
+ struct rlimit t;
+
+ if (getrlimit(RLIMIT_AS, &t) != 0)
+ fatal("getrlimit failed: %s", strerror(errno));
+
+ if (bytes < t.rlim_cur) {
+ t.rlim_cur = bytes;
+ if (setrlimit(RLIMIT_AS, &t) != 0)
+ fatal("setrlimit failed: %s", strerror(errno));
+ }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long) {
+}
+
+#endif // !PPL_HAVE_DECL_RLIMIT_AS
+
+extern "C" void
+timeout(int) {
+ try {
+ std::cerr << "TIMEOUT"
+ << std::endl;
+ }
+ catch (...) {
+ }
+
+ try {
+ if (output_file_name)
+ output() << "TIMEOUT"
+ << std::endl;
+ }
+ catch (...) {
+ }
+
+ exit(0);
+}
+
+void
+process_options(int argc, char* argv[]) {
+ while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+ int option_index = 0;
+ const int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+ &option_index);
+#else
+ const int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+ if (c == EOF)
+ break;
+
+ char* endptr;
+ long l;
+ switch (c) {
+ case 0:
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, usage_string, argv[0]);
+ exit(0);
+ break;
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+ case 'C':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-C'");
+ else
+ max_seconds_of_cpu_time = static_cast<unsigned long>(l);
+ break;
+
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+ case 'R':
+ {
+ const unsigned long MEGA = 1024U*1024U;
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-R'");
+ else if (static_cast<unsigned long>(l) > ULONG_MAX/MEGA)
+ max_bytes_of_virtual_memory = ULONG_MAX;
+ else
+ max_bytes_of_virtual_memory = static_cast<unsigned long>(l)*MEGA;
+ }
+ break;
+
+ case 'o':
+ output_file_name = optarg;
+ break;
+
+ case 't':
+ print_timings = true;
+ break;
+
+ case 'v':
+ verbose = true;
+ break;
+
+#if defined(USE_PPL)
+
+ case 'V':
+ fprintf(stdout, "%s\n", PPL_VERSION);
+ exit(0);
+ break;
+
+ case 'c':
+ check_file_name = optarg;
+ break;
+
+#endif
+
+ default:
+ abort();
+ }
+ }
+
+ if (argc - optind > 1)
+ // We have multiple input files.
+ fatal("at most one input file is accepted");
+
+ // We have one input files.
+ if (optind < argc)
+ input_file_name = argv[optind];
+ else
+ // If no input files have been specified: we will read from standard input.
+ assert(input_file_name == 0);
+}
+
+void
+maybe_start_clock() {
+ if (print_timings)
+ start_clock();
+}
+
+void
+maybe_print_clock() {
+ if (print_timings) {
+ std::cerr << input_file_name << " ";
+ print_clock(std::cerr);
+ std::cerr << std::endl;
+ }
+}
+
+
+void
+normalize(const std::vector<mpq_class>& source,
+ std::vector<mpz_class>& dest,
+ mpz_class& denominator) {
+ typedef std::vector<mpq_class>::size_type size_type;
+ const size_type n = source.size();
+ denominator = 1;
+ for (size_type i = 0; i < n; ++i)
+ mpz_lcm(denominator.get_mpz_t(),
+ denominator.get_mpz_t(),
+ source[i].get_den().get_mpz_t());
+ for (size_type i = 0; i < n; ++i)
+ dest[i] = denominator*source[i];
+}
+
+template <typename T>
+bool
+guarded_read(std::istream& in, T& x) {
+ try {
+ in >> x;
+ return !in.fail();
+ }
+ catch (...) {
+ return false;
+ }
+}
+
+template <typename T>
+void
+guarded_write(std::ostream& out, const T& x) {
+ bool succeeded = false;
+ try {
+ out << x;
+ succeeded = !out.fail();
+ }
+ catch (...) {
+ }
+ if (!succeeded)
+ fatal("cannot write to output file `%s'", output_file_name);
+}
+
+#if defined (USE_POLKA)
+template <>
+void
+guarded_write(std::ostream& out, const pkint_t& x) {
+ bool succeeded = false;
+ try {
+ succeeded = out << x.rep;
+ }
+ catch (...) {
+ }
+ if (!succeeded)
+ fatal("cannot write to output file `%s'", output_file_name);
+}
+#endif
+
+enum Number_Type { INTEGER, RATIONAL, REAL };
+
+void
+read_coefficients(std::istream& in,
+ const Number_Type number_type,
+ std::vector<mpz_class>& coefficients,
+ mpz_class& denominator) {
+ typedef std::vector<mpz_class>::size_type size_type;
+ const size_type num_coefficients = coefficients.size();
+ switch (number_type) {
+ case INTEGER:
+ {
+ for (unsigned i = 0; i < num_coefficients; ++i)
+ if (!guarded_read(in, coefficients[i]))
+ error("missing or invalid integer coefficient");
+ denominator = 1;
+ break;
+ }
+ case RATIONAL:
+ {
+ std::vector<mpq_class> rational_coefficients(num_coefficients);
+ for (unsigned i = 0; i < num_coefficients; ++i)
+ if (!guarded_read(in, rational_coefficients[i]))
+ error("missing or invalid rational coefficient");
+ normalize(rational_coefficients, coefficients, denominator);
+ break;
+ }
+ case REAL:
+ {
+ std::vector<mpq_class> rational_coefficients(num_coefficients);
+ for (unsigned i = 0; i < num_coefficients; ++i) {
+ double d;
+ if (!guarded_read(in, d))
+ error("missing or invalid real coefficient");
+ rational_coefficients[i] = mpq_class(d);
+ }
+ normalize(rational_coefficients, coefficients, denominator);
+ break;
+ }
+ }
+}
+
+void
+read_indexes_set(std::istream& in,
+ std::set<unsigned>& dest,
+ const char* what) {
+ assert(dest.empty());
+ unsigned num_elements;
+ if (!guarded_read(in, num_elements))
+ error("missing or invalid number of set elements in `%s'", what);
+ while (num_elements--) {
+ unsigned i;
+ if (!guarded_read(in, i))
+ error("missing or invalid set element in `%s'", what);
+ dest.insert(i);
+ }
+}
+
+enum Representation { H, V };
+
+Representation
+read_polyhedron(std::istream& in, POLYHEDRON_TYPE& ph) {
+ // By default we have an H-representation.
+ Representation rep = H;
+
+ std::string s;
+ std::set<unsigned> linearity;
+ while (true) {
+ if (!guarded_read(in, s))
+ error("premature end of file while seeking for `begin'");
+
+ if (s == "V-representation")
+ rep = V;
+ else if (s == "H-representation")
+ rep = H;
+ else if (s == "linearity" || s == "equality" || s == "partial_enum") {
+ read_indexes_set(in, linearity, "linearity");
+ if (verbose) {
+ std::cerr << "Linearity: ";
+ for (std::set<unsigned>::const_iterator j = linearity.begin(),
+ linearity_end = linearity.end(); j != linearity_end; ++j)
+ std::cerr << *j << " ";
+ std::cerr << std::endl;
+ }
+ }
+ else if (s == "begin")
+ break;
+ else
+ // A comment: skip to end of line.
+ in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+ }
+
+ // Tools such as `lrs' produce "*****" instead of the number of
+ // rows. We will accept that as valid input and compute the number
+ // of rows ourselves.
+ bool has_num_rows = false;
+ unsigned num_rows;
+ if (!guarded_read(in, s))
+ error("missing number of rows");
+ if (s != "*****") {
+ std::istringstream iss(s);
+ if (!guarded_read(iss, num_rows))
+ error("illegal number of rows `%s' (\"*****\" would be accepted)",
+ s.c_str());
+ has_num_rows = true;
+ }
+
+ unsigned num_columns;
+ if (!guarded_read(in, num_columns))
+ error("illegal or missing number of columns");
+ const unsigned space_dim = num_columns - 1;
+
+ if (!guarded_read(in, s))
+ error("missing number type");
+ Number_Type number_type = INTEGER;
+ if (s == "integer")
+ number_type = INTEGER;
+ else if (s == "rational")
+ number_type = RATIONAL;
+ else if (s == "real")
+ number_type = REAL;
+ else
+ error("illegal number type `%s'", s.c_str());
+
+ if (verbose) {
+ std::cerr << "Problem dimension: ";
+ if (has_num_rows)
+ std::cerr << num_rows;
+ else
+ std::cerr << '?';
+ std::cerr << " x " << num_columns
+ << "; number type: " << s
+ << std::endl;
+ }
+
+#if defined(USE_PPL)
+
+ PPL::Constraint_System cs;
+ PPL::Generator_System gs;
+
+#elif defined(USE_POLKA)
+
+ // Initialize polka in non-strict mode.
+ // 25000 is a magic number: with 22500 Polka 2.0.2 dies on
+ // mit31-20.ine with the error "Chernikova: out of table space".
+ polka_initialize(polka_false, space_dim, 25000);
+ // Declare and allocate a Polka matrix.
+ matrix_t* mat = matrix_alloc(num_rows+1, space_dim+2, polka_false);
+
+#elif defined(USE_POLYLIB)
+
+ // Declare and allocate a PolyLib matrix.
+ Matrix* mat = Matrix_Alloc(num_rows+1, space_dim+2);
+
+#endif
+
+ unsigned row = 0;
+ std::set<unsigned>::iterator linearity_end = linearity.end();
+ if (rep == V) {
+ // The V representation allows for `space_dim' coordinates.
+ std::vector<mpz_class> coefficients(space_dim);
+ mpz_class denominator;
+ bool has_a_point = false;
+ for (row = 0; !has_num_rows || row < num_rows; ++row) {
+ int vertex_marker;
+ if (!has_num_rows) {
+ // Must be prepared to read an "end" here.
+ if (!guarded_read(in, s))
+ error("missing vertex marker");
+ if (s == "end")
+ break;
+ std::istringstream iss(s);
+ if (!guarded_read(iss, vertex_marker)
+ || vertex_marker < 0 || vertex_marker > 1)
+ error("illegal vertex marker `%s'", s.c_str());
+ }
+ else if (!guarded_read(in, vertex_marker)
+ || vertex_marker < 0 || vertex_marker > 1)
+ error("illegal or missing vertex marker");
+ read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+ // PPL variables have indices 0, 1, ..., space_dim-1.
+ PPL::Linear_Expression e;
+ for (unsigned j = space_dim; j-- > 0; )
+ e += coefficients[j] * PPL::Variable(j);
+#elif defined(USE_POLKA)
+ // NewPolka variables have indices 2, 3, ..., space_dim+1.
+ for (unsigned j = space_dim; j-- > 0; )
+ pkint_set(mat->p[row][j+2], coefficients[j].get_mpz_t());
+#elif defined(USE_POLYLIB)
+ // PolyLib variables have indices 1, 2, ..., space_dim.
+ for (unsigned j = space_dim; j-- > 0; )
+ value_assign(mat->p[row][j+1], coefficients[j].get_mpz_t());
+#endif
+ if (vertex_marker == 1) {
+ assert(linearity.find(row+1) == linearity_end);
+#if defined(USE_PPL)
+ gs.insert(point(e, denominator));
+#elif defined(USE_POLKA)
+ // NewPolka stores the generator kind at index 0 (1 = ray/point)
+ // and the common denominator at index 1.
+ pkint_set_si(mat->p[row][0], 1);
+ pkint_set(mat->p[row][1], denominator.get_mpz_t());
+#elif defined(USE_POLYLIB)
+ // PolyLib stores the generator kind at index 0 (1 = ray/point)
+ // and the common denominator at index space_dim+1.
+ value_set_si(mat->p[row][0], 1);
+ value_assign(mat->p[row][space_dim+1], denominator.get_mpz_t());
+#endif
+ has_a_point = true;
+ }
+ else if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+ gs.insert(line(e));
+#elif defined(USE_POLKA)
+ // NewPolka stores the generator kind at index 0 (0 = line)
+ // and the common denominator at index 1 (0 for ray/line).
+ pkint_set_si(mat->p[row][0], 0);
+ pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+ // PolyLib stores the generator kind at index 0 (0 = line)
+ // and the common denominator at index space_dim+1 (0 for ray/line).
+ value_set_si(mat->p[row][0], 0);
+ value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+ }
+ else {
+#if defined(USE_PPL)
+ gs.insert(ray(e));
+#elif defined(USE_POLKA)
+ // NewPolka stores the generator kind at index 0 (1 = ray/point)
+ // and the common denominator at index 1 (0 for ray/line).
+ pkint_set_si(mat->p[row][0], 1);
+ pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+ // PolyLib stores the generator kind at index 0 (1 = ray/point)
+ // and the common denominator at index space_dim+1 (0 for ray/line).
+ value_set_si(mat->p[row][0], 1);
+ value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+ }
+ }
+ // Every non-empty generator system must have at least one point.
+ if (row > 0 && !has_a_point) {
+#if defined(USE_PPL)
+ gs.insert(PPL::point());
+#elif defined(USE_POLKA)
+ // Add the origin as a point.
+ pkint_set_si(mat->p[num_rows][0], 1);
+ pkint_set_si(mat->p[num_rows][1], 1);
+ for (unsigned j = space_dim; j-- > 0; )
+ pkint_set_si(mat->p[num_rows][j+2], 0);
+ ++num_rows;
+#elif defined(USE_POLYLIB)
+ // Add the origin as a point.
+ value_set_si(mat->p[num_rows][0], 1);
+ value_set_si(mat->p[num_rows][space_dim+1], 1);
+ for (unsigned j = space_dim; j-- > 0; )
+ value_set_si(mat->p[num_rows][j+1], 0);
+ ++num_rows;
+#endif
+ }
+
+ if (verbose) {
+ if (!has_num_rows)
+ std::cerr << "Problem dimension: " << row << " x " << num_columns
+ << "; number type: " << s
+ << std::endl;
+
+#if defined(USE_PPL)
+ using namespace PPL::IO_Operators;
+ std::cerr << "Generator system:\n" << gs << std::endl;
+#elif defined(USE_POLKA)
+ // Polka can only print to stdout.
+ printf("Generator system:\n");
+ matrix_print(mat);
+#elif defined(USE_POLYLIB)
+ fprintf(stderr, "Generator system:\n");
+ Matrix_Print(stderr, 0, mat);
+#endif
+ }
+ }
+ else {
+ assert(rep == H);
+ // The H representation stores the inhomogeneous term at index 0,
+ // and the variables' coefficients at indices 1, 2, ..., space_dim.
+ std::vector<mpz_class> coefficients(space_dim+1);
+ mpz_class denominator;
+ for (row = 0; !has_num_rows || row < num_rows; ++row) {
+ if (!has_num_rows) {
+ // Must be prepared to read an "end" here.
+ std::getline(in, s);
+ if (!in)
+ error("premature end of file while seeking "
+ "for coefficients or `end'");
+ if (s.substr(0, 2) == "end")
+ break;
+ std::istringstream iss(s);
+ read_coefficients(iss, number_type, coefficients, denominator);
+ }
+ else
+ read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+ // PPL variables have indices 0, 1, ..., space_dim-1.
+ PPL::Linear_Expression e;
+ for (unsigned j = num_columns; j-- > 1; )
+ e += coefficients[j] * PPL::Variable(j-1);
+ e += coefficients[0];
+#elif defined(USE_POLKA)
+ // NewPolka variables have indices 2, 3, ..., space_dim+1.
+ for (unsigned j = num_columns; j-- > 1; )
+ pkint_set(mat->p[row][j+1], coefficients[j].get_mpz_t());
+ // NewPolka stores the inhomogeneous term at index 1.
+ pkint_set(mat->p[row][1], coefficients[0].get_mpz_t());
+#elif defined(USE_POLYLIB)
+ // PolyLib variables have indices 1, 2, ..., space_dim.
+ for (unsigned j = num_columns; j-- > 1; )
+ value_assign(mat->p[row][j], coefficients[j].get_mpz_t());
+ // PolyLib stores the inhomogeneous term at index space_dim+1.
+ value_assign(mat->p[row][space_dim+1], coefficients[0].get_mpz_t());
+#endif
+
+ if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+ cs.insert(e == 0);
+#elif defined(USE_POLKA)
+ // NewPolka stores the constraint kind at index 0 (0 = equality).
+ pkint_set_si(mat->p[row][0], 0);
+#elif defined(USE_POLYLIB)
+ // PolyLib stores the constraint kind at index 0 (0 = equality).
+ value_set_si(mat->p[row][0], 0);
+#endif
+ }
+ else {
+#if defined(USE_PPL)
+ cs.insert(e >= 0);
+#elif defined(USE_POLKA)
+ // NewPolka stores the constraint kind at index 0 (1 = inequality).
+ pkint_set_si(mat->p[row][0], 1);
+#elif defined(USE_POLYLIB)
+ // PolyLib stores the constraint kind at index 0 (1 = inequality).
+ value_set_si(mat->p[row][0], 1);
+#endif
+ }
+ }
+
+ if (verbose) {
+ if (!has_num_rows)
+ std::cerr << "Problem dimension: " << row << " x " << num_columns
+ << "; number type: " << s
+ << std::endl;
+
+#if defined(USE_PPL)
+ using namespace PPL::IO_Operators;
+ std::cerr << "Constraint system:\n" << cs << std::endl;
+#elif defined(USE_POLKA)
+ // Polka can only print to stdout.
+ printf("Constraint system:\n");
+ matrix_print(mat);
+#elif defined(USE_POLYLIB)
+ fprintf(stderr, "Constraint system:\n");
+ Matrix_Print(stderr, 0, mat);
+#endif
+ }
+ }
+
+ if (has_num_rows) {
+ if (!guarded_read(in, s))
+ error("premature end of file while seeking for `end'");
+
+ if (s != "end")
+ error("`%s' found while seeking for `end'", s.c_str());
+ }
+
+ if (rep == H) {
+#if defined(USE_PPL)
+ ph = PPL::C_Polyhedron(cs, PPL::Recycle_Input());
+#elif defined(USE_POLKA)
+ ph = poly_universe(space_dim);
+ ph = poly_add_constraints_lazy(ph, mat);
+#elif defined(USE_POLYLIB)
+ ph = Universe_Polyhedron(space_dim);
+
+ // PolyLib is not lazy: it will perform the conversion immediately.
+ maybe_start_clock();
+ ph = AddConstraints(mat->p[0], num_rows, ph,
+ max_constraints_or_generators);
+ maybe_print_clock();
+#endif
+ }
+ else {
+#if defined(USE_PPL)
+ ph = PPL::C_Polyhedron(gs, PPL::Recycle_Input());
+#elif defined(USE_POLKA)
+ ph = poly_of_frames(mat);
+#elif defined(USE_POLYLIB)
+ ph = Empty_Polyhedron(space_dim);
+
+ // PolyLib is not lazy: it will perform the conversion immediately.
+ maybe_start_clock();
+ ph = AddRays(mat->p[0], num_rows, ph,
+ max_constraints_or_generators);
+ maybe_print_clock();
+#endif
+ }
+ return rep;
+}
+
+void
+write_polyhedron(std::ostream& out,
+ const POLYHEDRON_TYPE& ph,
+ const Representation rep) {
+ if (rep == H)
+ guarded_write(out, "H-representation\n");
+ else {
+ assert(rep == V);
+ guarded_write(out, "V-representation\n");
+ }
+
+ std::set<unsigned> linearity;
+#if defined(USE_PPL)
+ unsigned num_rows = 0;
+ if (rep == H) {
+ const PPL::Constraint_System& cs = ph.constraints();
+ for (PPL::Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ ++num_rows;
+ if (i->is_equality())
+ linearity.insert(linearity.end(), num_rows);
+ }
+ }
+ else {
+ const PPL::Generator_System& gs = ph.generators();
+ for (PPL::Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ ++num_rows;
+ if (i->is_line())
+ linearity.insert(linearity.end(), num_rows);
+ }
+ }
+#elif defined(USE_POLKA)
+ // Don't even try to get frames if the polyhedron is empty.
+ const matrix_t* mat = (rep == H)
+ ? poly_constraints(ph)
+ : (poly_is_empty(ph) ? 0 : poly_frames(ph));
+ const unsigned num_rows = (rep == V && poly_is_empty(ph)) ? 0 : mat->nbrows;
+ for (unsigned i = 0; i < num_rows; ++i)
+ if (pkint_sgn(mat->p[i][0]) == 0)
+ linearity.insert(linearity.end(), i+1);
+#elif defined(USE_POLYLIB)
+ const Matrix* mat = (rep == H)
+ ? Polyhedron2Constraints(ph)
+ : Polyhedron2Rays(ph);
+ const unsigned num_rows = mat->NbRows;
+ for (unsigned i = 0; i < num_rows; ++i)
+ if (value_sign(mat->p[i][0]) == 0)
+ linearity.insert(linearity.end(), i+1);
+#endif
+
+ if (!linearity.empty()) {
+ guarded_write(out, "linearity ");
+ guarded_write(out, linearity.size());
+ for (std::set<unsigned>::const_iterator j = linearity.begin(),
+ linearity_end = linearity.end(); j != linearity_end; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, *j);
+ }
+ guarded_write(out, '\n');
+ }
+
+#if defined(USE_PPL)
+ const PPL::dimension_type space_dim = ph.space_dimension();
+#elif defined(USE_POLKA)
+ const unsigned space_dim = poly_dimension(ph);
+#elif defined(USE_POLYLIB)
+ const unsigned space_dim = mat->NbColumns - 2;
+#endif
+
+ guarded_write(out, "begin\n");
+ guarded_write(out, num_rows);
+ guarded_write(out, ' ');
+ guarded_write(out, space_dim+1);
+ guarded_write(out, ' ');
+ if (rep == H)
+ guarded_write(out, "integer\n");
+ else
+ guarded_write(out, "rational\n");
+
+#if defined(USE_PPL)
+ if (rep == H) {
+ const PPL::Constraint_System& cs = ph.constraints();
+ for (PPL::Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const PPL::Constraint& c = *i;
+ guarded_write(out, c.inhomogeneous_term());
+ for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, c.coefficient(PPL::Variable(j)));
+ }
+ guarded_write(out, '\n');
+ }
+ }
+ else {
+ assert(rep == V);
+ const PPL::Generator_System& gs = ph.generators();
+ for (PPL::Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ const PPL::Generator& g = *i;
+ if (g.is_point()) {
+ guarded_write(out, '1');
+ const PPL::Coefficient& divisor = g.divisor();
+ for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ if (g.coefficient(PPL::Variable(j)) == 0)
+ guarded_write(out, '0');
+ else {
+ mpz_class numer, denom;
+ PPL::assign_r(numer,
+ g.coefficient(PPL::Variable(j)),
+ PPL::ROUND_NOT_NEEDED);
+ PPL::assign_r(denom, divisor, PPL::ROUND_NOT_NEEDED);
+ guarded_write(out, mpq_class(numer, denom));
+ }
+ }
+ }
+ else {
+ // `g' is a ray or a line.
+ guarded_write(out, '0');
+ for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, g.coefficient(PPL::Variable(j)));
+ }
+ }
+ guarded_write(out, '\n');
+ }
+ }
+#elif defined(USE_POLKA)
+ if (rep == H) {
+ for (unsigned i = 0; i < num_rows; ++i) {
+ const pkint_t* c = mat->p[i];
+ // The inhomogeneous term.
+ guarded_write(out, c[1]);
+ // The variables' coefficients.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, c[j+2]);
+ }
+ guarded_write(out, '\n');
+ }
+ }
+ else {
+ assert(rep == V);
+ for (unsigned i = 0; i < num_rows; ++i) {
+ const pkint_t* g = mat->p[i];
+ guarded_write(out, g[0]);
+ const pkint_t divisor = g[1];
+ if (pkint_sgn(divisor) != 0)
+ // `g' is a point.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ if (pkint_sgn(g[j+2]) == 0)
+ guarded_write(out, '0');
+ else
+ guarded_write(out, mpq_class(mpz_class(g[j+2].rep),
+ mpz_class(divisor.rep)));
+ }
+ else
+ // `g' is a ray or a line.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, g[j+2]);
+ }
+ guarded_write(out, '\n');
+ }
+ }
+#elif defined (USE_POLYLIB)
+ if (rep == H) {
+ for (unsigned i = 0; i < num_rows; ++i) {
+ const Value* c = mat->p[i];
+ // The inhomogeneous term.
+ guarded_write(out, c[space_dim+1]);
+ // The variables' coefficients.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, c[j+1]);
+ }
+ guarded_write(out, '\n');
+ }
+ }
+ else {
+ assert(rep == V);
+ for (unsigned i = 0; i < num_rows; ++i) {
+ const Value* g = mat->p[i];
+ guarded_write(out, g[0]);
+ const Value& divisor = g[space_dim+1];
+ if (value_sign(divisor) != 0)
+ // `g' is a point.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ if (value_sign(g[j+1]) == 0)
+ guarded_write(out, '0');
+ else
+ guarded_write(out, mpq_class(mpz_class(g[j+1]),
+ mpz_class(divisor)));
+ }
+ else
+ // `g' is a ray or a line.
+ for (unsigned j = 0; j < space_dim; ++j) {
+ guarded_write(out, ' ');
+ guarded_write(out, g[j+1]);
+ }
+ guarded_write(out, '\n');
+ }
+ }
+#endif
+ guarded_write(out, "end\n");
+
+ // Flush `out'.
+ bool flush_succeeded = false;
+ try {
+ out.flush();
+ flush_succeeded = !out.fail();
+ }
+ catch (...) {
+ }
+ if (!flush_succeeded)
+ fatal("cannot write to output file `%s'", output_file_name);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+ program_name = argv[0];
+
+#if defined(USE_PPL)
+ if (strcmp(PPL_VERSION, PPL::version()) != 0)
+ fatal("was compiled with PPL version %s, but linked with version %s",
+ PPL_VERSION, PPL::version());
+
+ if (verbose)
+ std::cerr << "Parma Polyhedra Library version:\n" << PPL::version()
+ << "\n\nParma Polyhedra Library banner:\n" << PPL::banner()
+ << std::endl;
+#endif
+
+ // Process command line options.
+ process_options(argc, argv);
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+ if (max_seconds_of_cpu_time > 0)
+ set_alarm_on_cpu_time(max_seconds_of_cpu_time, &timeout);
+
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+ if (max_bytes_of_virtual_memory > 0)
+ limit_virtual_memory(max_bytes_of_virtual_memory);
+
+ // Set up the input and output streams.
+ set_input(input_file_name);
+ set_output(output_file_name);
+
+ POLYHEDRON_TYPE ph;
+ const Representation rep = read_polyhedron(input(), ph);
+
+ enum Command { None, H_to_V, V_to_H };
+ Command command = None;
+
+ // Warn for misplaced linearity commands, and ignore all what follows.
+ std::string s;
+ while (guarded_read(input(), s)) {
+ if (s == "linearity" || s == "equality" || s == "partial_enum")
+ error("the `linearity' command must occur before `begin'");
+ input().ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+ }
+
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+ maybe_start_clock();
+#endif
+
+ // Compute the dual representation.
+ if (rep == V) {
+ command = V_to_H;
+#if defined(USE_PPL)
+ ph.minimized_constraints();
+#elif defined(USE_POLKA)
+ poly_minimize(ph);
+#endif
+ }
+ else {
+ command = H_to_V;
+#if defined(USE_PPL)
+ ph.minimized_generators();
+#elif defined(USE_POLKA)
+ poly_minimize(ph);
+#endif
+ }
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+ maybe_print_clock();
+#endif
+
+ // Write the result of the conversion.
+ if (rep == V)
+ write_polyhedron(output(), ph, H);
+ else
+ write_polyhedron(output(), ph, V);
+
+#if defined(USE_PPL)
+ // Check the result, if requested to do so.
+ if (check_file_name) {
+ set_input(check_file_name);
+ // Read the polyhedron containing the expected result.
+ PPL::C_Polyhedron e_ph;
+ const Representation e_rep = read_polyhedron(input(), e_ph);
+
+ switch (command) {
+ case H_to_V:
+ {
+ if (e_rep == H)
+ warning("checking an H-to-V conversion with an H representation");
+
+ // Count the number of generators of `ph'.
+ unsigned ph_num_generators = 0;
+ const PPL::Generator_System& ph_gs = ph.generators();
+ for (PPL::Generator_System::const_iterator i = ph_gs.begin(),
+ ph_gs_end = ph_gs.end(); i != ph_gs_end; ++i)
+ ++ph_num_generators;
+
+ // Count the number of generators of `e_ph'.
+ unsigned e_ph_num_generators = 0;
+ const PPL::Generator_System& e_ph_gs = e_ph.generators();
+ for (PPL::Generator_System::const_iterator i = e_ph_gs.begin(),
+ e_ph_gs_end = e_ph_gs.end(); i != e_ph_gs_end; ++i)
+ ++e_ph_num_generators;
+
+ // If the polyhedra differ, that is the problem.
+ if (ph != e_ph) {
+ if (verbose)
+ std::cerr << "Check failed: polyhedra differ"
+ << std::endl;
+ return 1;
+ }
+ else if (ph_num_generators != e_ph_num_generators)
+ // If we have different number of generators, we fail.
+ std::cerr << "Check failed: different number of generators:\n"
+ << "expected " << e_ph_num_generators
+ << ", obtained " << ph_num_generators
+ << std::endl;
+ break;
+ }
+ case V_to_H:
+ {
+ if (e_rep == V)
+ warning("checking an V-to-H conversion with a V representation");
+
+ // Count the number of constraints of `ph'.
+ unsigned ph_num_constraints = 0;
+ const PPL::Constraint_System& ph_cs = ph.constraints();
+ for (PPL::Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i)
+ ++ph_num_constraints;
+
+ // Count the number of constraints of `e_ph'.
+ unsigned e_ph_num_constraints = 0;
+ const PPL::Constraint_System& e_ph_cs = e_ph.constraints();
+ for (PPL::Constraint_System::const_iterator i = e_ph_cs.begin(),
+ e_ph_cs_end = e_ph_cs.end(); i != e_ph_cs_end; ++i)
+ ++e_ph_num_constraints;
+
+ // If the polyhedra differ, that is the problem.
+ if (ph != e_ph) {
+ if (verbose)
+ std::cerr << "Check failed: polyhedra differ"
+ << std::endl;
+ return 1;
+ }
+ else if (ph_num_constraints != e_ph_num_constraints)
+ // If we have different number of constraints, we fail.
+ std::cerr << "Check failed: different number of constraints:\n"
+ << "expected " << e_ph_num_constraints
+ << ", obtained " << ph_num_constraints
+ << std::endl;
+ break;
+ }
+ case None:
+ break;
+ }
+ }
+#endif
+
+#if defined(USE_POLKA)
+ // Finalize the library.
+ polka_finalize();
+#endif
+
+ return 0;
+}
+catch (const std::bad_alloc&) {
+ fatal("out of memory");
+ exit(1);
+}
+catch (const std::overflow_error& e) {
+ fatal("arithmetic overflow (%s)", e.what());
+ exit(1);
+}
+catch (...) {
+ fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+ exit(1);
+}
diff --git a/demos/ppl_lpsol/Makefile.am b/demos/ppl_lpsol/Makefile.am
new file mode 100644
index 0000000..2291d5b
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.am
@@ -0,0 +1,334 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+dist_man_MANS = \
+ppl_lpsol.1
+
+if BUILD_C_INTERFACE
+if HAVE_GLPK
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_lpsol
+
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ppl_lpsol_SOURCES = \
+ppl_lpsol.c \
+dummy.cc
+
+if GCC
+
+if ICC
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ppl_lpsol_CFLAGS = -std=gnu89
+
+else !ICC
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ppl_lpsol_CFLAGS = -pedantic -std=gnu89
+
+endif !ICC
+
+endif GCC
+
+ppl_lpsol_LDADD = \
+libglpk_set_d_eps.a \
+-lglpk \
+$(top_builddir)/interfaces/C/libppl_c.la \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+noinst_LIBRARIES = libglpk_set_d_eps.a
+libglpk_set_d_eps_a_SOURCES = \
+glpk_set_d_eps.c
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+afiro.mps
+
+TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+opt1217.mps \
+rout.mps
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+CHECK_OPTION =
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+CHECK_OPTION = -c
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM = \
+adlittle.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ship08l.mps\
+$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+egout.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
+LP_PROBLEMS = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+kb2.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps
+
+DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+adlittle.mps \
+boeing1.mps \
+boeing2.mps \
+rout.mps
+
+INDIVIDUALLY_CHECKED_PROBLEMS = \
+boeing1.mps \
+boeing2.mps \
+ex12.mps \
+mas74.mps \
+modglob.mps
+
+if HOST_OS_CYGWIN
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_CYGWIN
+
+if HOST_OS_DARWIN
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_SOLARIS
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) \
+| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained \
+| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_SOLARIS
+
+if HOST_OS_MINGW
+
+DIFF_COMMAND = \
+tr -d '\015' <obtained \
+| sed -e "s/ppl_lpsol.exe/ppl_lpsol/g" -e "s/1e+012/1e+12/g" \
+| diff $(srcdir)/$(EXPECTED) -
+
+else !HOST_OS_MINGW
+
+DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+
+endif !HOST_OS_MINGW
+
+endif !HOST_OS_SOLARIS
+
+endif !HOST_OS_DARWIN
+
+endif !HOST_OS_CYGWIN
+
+# NOTE: use exact steepest-edge pricing (-p1) instead float-based one.
+# This has an efficiency penalty, but it guarantees deterministic
+# results across different architectures.
+SIMPLEX = ./ppl_lpsol$(EXEEXT) -s -p1 $(CHECK_OPTION) -oobtained
+SIMPLEX_NOCHECK = ./ppl_lpsol$(EXEEXT) -s -p1 -oobtained
+ECHO_SIMPLEX = echo "***" $(SIMPLEX)
+ECHO_SIMPLEX_NOCHECK = echo "***" $(SIMPLEX_NOCHECK)
+
+check-local: ppl_lpsol$(EXEEXT)
+ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ echo $(LP_PROBLEMS) >lp_problems
+ echo $(INDIVIDUALLY_CHECKED_PROBLEMS) >individually_checked_problems
+ export LC_ALL=C; \
+ echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+ -for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ $(ECHO_SIMPLEX) "-n $$m $$file" >>obtained; \
+ $(SIMPLEX) -n $$path >/dev/null; \
+ done
+ echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+ -for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ for m in -m -M; \
+ do \
+ $(ECHO_SIMPLEX) "$$m $$file" >>obtained; \
+ $(SIMPLEX) $$m $$path >/dev/null; \
+ done \
+ done
+ echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+ -for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ verbosity=''; \
+ $(FGREP) $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+ for m in -m -M; \
+ do \
+ $(ECHO_SIMPLEX) "-r $$m $$file" >>obtained; \
+ $(SIMPLEX) -r $$verbosity $$m $$path >/dev/null; \
+ done \
+ done
+ echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ -for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+ ./ppl_lpsol$(EXEEXT) -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ done
+ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000518 boeing1.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -m -c0.00000000518 $(srcdir)/examples/boeing1.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0000000105 boeing1.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -M -c0.0000000105 $(srcdir)/examples/boeing1.mps $$m >/dev/null
+ $(ECHO_SIMPLEX) "-n boeing1.mps" >>obtained
+ -$(SIMPLEX) -n $(srcdir)/examples/boeing1.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000863 boeing2.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -m -c0.00000000863 $(srcdir)/examples/boeing2.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.00000000213 boeing2.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -M -c0.00000000213 $(srcdir)/examples/boeing2.mps $$m >/dev/null
+ $(ECHO_SIMPLEX) "-n boeing2.mps" >>obtained
+ -$(SIMPLEX) -n $(srcdir)/examples/boeing2.mps >/dev/null
+
+ $(ECHO_SIMPLEX) "-r -m mas74.mps" >>obtained
+ -$(SIMPLEX) -r -m $(srcdir)/examples/mas74.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000123 mas74.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas74.mps $$m >/dev/null
+ $(ECHO_SIMPLEX) "-n mas74.mps" >>obtained
+ -$(SIMPLEX) -n $(srcdir)/examples/mas74.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000273 modglob.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -m -c0.0000273 $(srcdir)/examples/modglob.mps >/dev/null
+ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0290 modglob.mps" >>obtained
+ -$(SIMPLEX_NOCHECK) -r -M -c0.0290 $(srcdir)/examples/modglob.mps >/dev/null
+ $(ECHO_SIMPLEX) "-n modglob.mps" >>obtained
+ -$(SIMPLEX) -n $(srcdir)/examples/modglob.mps >/dev/null
+ $(DIFF_COMMAND)
+
+endif HAVE_GLPK
+endif BUILD_C_INTERFACE
+
+MOSTLYCLEANFILES = \
+individually_checked_problems \
+do_not_output_location \
+expected_optima \
+lp_problems \
+obtained \
+obtained_optima \
+tough_examples
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
diff --git a/demos/ppl_lpsol/Makefile.in b/demos/ppl_lpsol/Makefile.in
new file mode 100644
index 0000000..6c0b8e7
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.in
@@ -0,0 +1,1272 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bin_PROGRAMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ppl_lpsol$(EXEEXT)
+subdir = demos/ppl_lpsol
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libglpk_set_d_eps_a_AR = $(AR) $(ARFLAGS)
+libglpk_set_d_eps_a_LIBADD =
+am__libglpk_set_d_eps_a_SOURCES_DIST = glpk_set_d_eps.c
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at am_libglpk_set_d_eps_a_OBJECTS = glpk_set_d_eps.$(OBJEXT)
+libglpk_set_d_eps_a_OBJECTS = $(am_libglpk_set_d_eps_a_OBJECTS)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__ppl_lpsol_SOURCES_DIST = ppl_lpsol.c dummy.cc
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at am_ppl_lpsol_OBJECTS = ppl_lpsol-ppl_lpsol.$(OBJEXT) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ dummy.$(OBJEXT)
+ppl_lpsol_OBJECTS = $(am_ppl_lpsol_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_DEPENDENCIES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ libglpk_set_d_eps.a \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libglpk_set_d_eps_a_SOURCES) $(ppl_lpsol_SOURCES)
+DIST_SOURCES = $(am__libglpk_set_d_eps_a_SOURCES_DIST) \
+ $(am__ppl_lpsol_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+dist_man_MANS = \
+ppl_lpsol.1
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at AM_CPPFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -I$(top_builddir)/interfaces/C \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_includes@
+
+
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol.c \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at dummy.cc
+
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ at BUILD_C_INTERFACE_TRUE@@GCC_TRUE@@HAVE_GLPK_TRUE@@ICC_FALSE at ppl_lpsol_CFLAGS = -pedantic -std=gnu89
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ at BUILD_C_INTERFACE_TRUE@@GCC_TRUE@@HAVE_GLPK_TRUE@@ICC_TRUE at ppl_lpsol_CFLAGS = -std=gnu89
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_LDADD = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at libglpk_set_d_eps.a \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -lglpk \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_libraries@
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noinst_LIBRARIES = libglpk_set_d_eps.a
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at libglpk_set_d_eps_a_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at glpk_set_d_eps.c
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps
+
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = -c
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION =
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at p0033.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps\
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at LP_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bgprtr.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sample.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at INDIVIDUALLY_CHECKED_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ex12.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE at tr -d '\015' <obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@| sed -e "s/ppl_lpsol.exe/ppl_lpsol/g" -e "s/1e+012/1e+12/g" \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@| diff $(srcdir)/$(EXPECTED) -
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& $(EGREP) "^Optimum value: " obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+
+# NOTE: use exact steepest-edge pricing (-p1) instead float-based one.
+# This has an efficiency penalty, but it guarantees deterministic
+# results across different architectures.
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at SIMPLEX = ./ppl_lpsol$(EXEEXT) -s -p1 $(CHECK_OPTION) -oobtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at SIMPLEX_NOCHECK = ./ppl_lpsol$(EXEEXT) -s -p1 -oobtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ECHO_SIMPLEX = echo "***" $(SIMPLEX)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ECHO_SIMPLEX_NOCHECK = echo "***" $(SIMPLEX_NOCHECK)
+MOSTLYCLEANFILES = \
+individually_checked_problems \
+do_not_output_location \
+expected_optima \
+lp_problems \
+obtained \
+obtained_optima \
+tough_examples
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libglpk_set_d_eps.a: $(libglpk_set_d_eps_a_OBJECTS) $(libglpk_set_d_eps_a_DEPENDENCIES) $(EXTRA_libglpk_set_d_eps_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libglpk_set_d_eps.a
+ $(AM_V_AR)$(libglpk_set_d_eps_a_AR) libglpk_set_d_eps.a $(libglpk_set_d_eps_a_OBJECTS) $(libglpk_set_d_eps_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libglpk_set_d_eps.a
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES) $(EXTRA_ppl_lpsol_DEPENDENCIES)
+ @rm -f ppl_lpsol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/glpk_set_d_eps.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lpsol-ppl_lpsol.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+ppl_lpsol-ppl_lpsol.o: ppl_lpsol.c
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -MT ppl_lpsol-ppl_lpsol.o -MD -MP -MF $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo -c -o ppl_lpsol-ppl_lpsol.o `test -f 'ppl_lpsol.c' || echo '$(srcdir)/'`ppl_lpsol.c
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo $(DEPDIR)/ppl_lpsol-ppl_lpsol.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppl_lpsol.c' object='ppl_lpsol-ppl_lpsol.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -c -o ppl_lpsol-ppl_lpsol.o `test -f 'ppl_lpsol.c' || echo '$(srcdir)/'`ppl_lpsol.c
+
+ppl_lpsol-ppl_lpsol.obj: ppl_lpsol.c
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -MT ppl_lpsol-ppl_lpsol.obj -MD -MP -MF $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo -c -o ppl_lpsol-ppl_lpsol.obj `if test -f 'ppl_lpsol.c'; then $(CYGPATH_W) 'ppl_lpsol.c'; else $(CYGPATH_W) '$(srcdir)/ppl_lpsol.c'; fi`
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo $(DEPDIR)/ppl_lpsol-ppl_lpsol.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppl_lpsol.c' object='ppl_lpsol-ppl_lpsol.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -c -o ppl_lpsol-ppl_lpsol.obj `if test -f 'ppl_lpsol.c'; then $(CYGPATH_W) 'ppl_lpsol.c'; else $(CYGPATH_W) '$(srcdir)/ppl_lpsol.c'; fi`
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(dist_man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_C_INTERFACE_FALSE@check-local:
+ at HAVE_GLPK_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-local clean clean-binPROGRAMS clean-generic \
+ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-man \
+ uninstall-man1
+
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at check-local: ppl_lpsol$(EXEEXT)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(LP_PROBLEMS) >lp_problems
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(INDIVIDUALLY_CHECKED_PROBLEMS) >individually_checked_problems
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ export LC_ALL=C; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n $$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) -n $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "$$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) $$m $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ verbosity=''; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r $$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) -r $$verbosity $$m $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ./ppl_lpsol$(EXEEXT) -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000518 boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -m -c0.00000000518 $(srcdir)/examples/boeing1.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0000000105 boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.0000000105 $(srcdir)/examples/boeing1.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/boeing1.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000863 boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -m -c0.00000000863 $(srcdir)/examples/boeing2.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.00000000213 boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.00000000213 $(srcdir)/examples/boeing2.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/boeing2.mps >/dev/null
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r -m mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -r -m $(srcdir)/examples/mas74.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000123 mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas74.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/mas74.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000273 modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -m -c0.0000273 $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0290 modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.0290 $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(DIFF_COMMAND)
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/dummy.cc b/demos/ppl_lpsol/dummy.cc
new file mode 100644
index 0000000..67adace
--- /dev/null
+++ b/demos/ppl_lpsol/dummy.cc
@@ -0,0 +1,13 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+// This file intentionally contains only this comment :-)
diff --git a/demos/ppl_lpsol/examples/Makefile.am b/demos/ppl_lpsol/examples/Makefile.am
new file mode 100644
index 0000000..88ff354
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.am
@@ -0,0 +1,52 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+ex12.mps \
+ex1.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
diff --git a/demos/ppl_lpsol/examples/Makefile.in b/demos/ppl_lpsol/examples/Makefile.in
new file mode 100644
index 0000000..924730b
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.in
@@ -0,0 +1,576 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lpsol/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+ex12.mps \
+ex1.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/examples/README b/demos/ppl_lpsol/examples/README
new file mode 100644
index 0000000..671c211
--- /dev/null
+++ b/demos/ppl_lpsol/examples/README
@@ -0,0 +1,9 @@
+Most of the examples in this directory have been taken from:
+ - the `lp' library of Netlib [1];
+ - the problem sets MIPLIB 3.0 [2] and MIPLIB 2003 [3].
+
+--------
+
+[1] http://www.netlib.org/lp/index.html
+[2] http://miplib.zib.de/miplib3/miplib3.html
+[3] http://miplib.zib.de/miplib2003.php
diff --git a/demos/ppl_lpsol/examples/adlittle.mps b/demos/ppl_lpsol/examples/adlittle.mps
new file mode 100644
index 0000000..6620f06
--- /dev/null
+++ b/demos/ppl_lpsol/examples/adlittle.mps
@@ -0,0 +1,335 @@
+NAME ADLITTLE
+ROWS
+ N .Z....
+ L ....01
+ E ....02
+ L ....03
+ L ....04
+ L ....05
+ L ....06
+ L ....07
+ L ....08
+ L ....09
+ E ....10
+ L ....11
+ L ....12
+ L ....13
+ L ....14
+ L ....15
+ L ....16
+ L ....17
+ L ....18
+ L ....19
+ L ....20
+ L ....21
+ L ....22
+ L ....23
+ L ....24
+ E ....25
+ L ....26
+ L ....27
+ E ....28
+ L ....29
+ L ....30
+ E ....31
+ E ....32
+ E ....33
+ L ....34
+ L ....35
+ E ....36
+ L ....37
+ L ....38
+ L ....39
+ E ....40
+ L ....41
+ E ....42
+ E ....43
+ E ....44
+ L ....45
+ L ....46
+ L ....47
+ L ....48
+ E ....49
+ E ....50
+ G ....51
+ L ....52
+ L ....53
+ E ....54
+ L ....55
+ L ....56
+COLUMNS
+ ...100 .Z.... -3280. ....01 .506
+ ...100 ....04 1. ....05 .182
+ ...100 ....55 .312
+ ...101 .Z.... -3280. ....01 .638
+ ...101 ....04 1. ....05 .05
+ ...101 ....55 .312
+ ...102 .Z.... 3310. ....01 -1.
+ ...103 .Z.... -1890. ....05 .92
+ ...103 ....30 1. ....49 -9.5
+ ...103 ....52 -.042 ....53 -.063
+ ...103 ....55 .08
+ ...104 ....34 .825 ....35 .175
+ ...104 ....40 1. ....51 16.
+ ...105 ....35 .175 ....40 1.
+ ...105 ....46 .825 ....51 21.
+ ...106 .Z.... -1890. ....06 1.
+ ...106 ....30 1. ....49 3.6
+ ...106 ....52 -.042 ....53 -.063
+ ...107 .Z.... -903. ....06 1.
+ ...107 ....38 1.
+ ...108 ....06 1. ....50 -.8
+ ...109 .Z.... 432. ....31 -1.23
+ ...109 ....42 .23
+ ...110 .Z.... 432. ....32 -1.23
+ ...110 ....43 .23 ....56 1.
+ ...111 .Z.... 432. ....33 -1.23
+ ...111 ....44 .23 ....56 1.
+ ...112 .Z.... 446. ....07 1.
+ ...112 ....31 -1.
+ ...113 .Z.... 446. ....07 1.
+ ...113 ....32 -1.
+ ...114 .Z.... 446. ....07 1.
+ ...114 ....33 -1.
+ ...115 .Z.... 450. ....08 1.
+ ...115 ....31 -.95 ....42 -.05
+ ...116 .Z.... 450. ....08 1.
+ ...116 ....32 -.95 ....43 -.05
+ ...117 .Z.... 450. ....08 1.
+ ...117 ....33 -.95 ....44 -.05
+ ...118 .Z.... 459. ....09 1.
+ ...118 ....31 -.79 ....42 -.21
+ ...119 .Z.... 459. ....09 1.
+ ...119 ....32 -.79 ....43 -.21
+ ...120 .Z.... 459. ....09 1.
+ ...120 ....33 -.79 ....44 -.21
+ ...121 .Z.... 483. ....11 1.
+ ...121 ....31 -.42 ....42 -.58
+ ...122 .Z.... 483. ....11 1.
+ ...122 ....32 -.42 ....43 -.58
+ ...123 .Z.... 483. ....11 1.
+ ...123 ....33 -.42 ....44 -.58
+ ...124 .Z.... 500. ....12 1.
+ ...124 ....31 -.05 ....42 -.95
+ ...125 .Z.... 500. ....12 1.
+ ...125 ....32 -.05 ....43 -.95
+ ...126 .Z.... 500. ....12 1.
+ ...126 ....33 -.05 ....44 -.95
+ ...127 .Z.... 493. ....13 1.
+ ...127 ....31 -.26 ....42 -.74
+ ...128 .Z.... 493. ....13 1.
+ ...128 ....32 -.26 ....43 -.74
+ ...129 .Z.... 493. ....13 1.
+ ...129 ....33 -.26 ....44 -.74
+ ...130 .Z.... -1890. ....14 1.
+ ...130 ....30 1. ....49 -3.2
+ ...130 ....52 -.042 ....53 -.063
+ ...131 .Z.... -903. ....14 1.
+ ...131 ....38 1.
+ ...132 .Z.... 506. ....17 1.
+ ...132 ....31 .26 ....42 -1.26
+ ...133 ....14 1. ....50 -.8
+ ...134 .Z.... 506. ....17 1.
+ ...134 ....32 .26 ....43 -1.26
+ ...135 .Z.... 506. ....17 1.
+ ...135 ....33 .26 ....44 -1.26
+ ...136 .Z.... 505. ....15 1.
+ ...136 ....31 .16 ....42 -1.16
+ ...137 .Z.... 505. ....15 1.
+ ...137 ....32 .16 ....43 -1.16
+ ...138 .Z.... 505. ....15 1.
+ ...138 ....33 .16 ....44 -1.16
+ ...139 .Z.... 499. ....16 1.
+ ...139 ....31 -.16 ....42 -.84
+ ...140 .Z.... 499. ....16 1.
+ ...140 ....32 -.16 ....43 -.84
+ ...141 .Z.... 499. ....16 1.
+ ...141 ....33 -.16 ....44 -.84
+ ...142 ....10 -1.
+ ...143 ....02 1. ....03 .79
+ ...143 ....10 37. ....28 .494
+ ...143 ....34 .506 ....54 2.27424
+ ...144 ....02 1. ....03 .53
+ ...144 ....10 47. ....28 .492
+ ...144 ....46 .508 ....54 2.2632
+ ...145 .Z.... 512. ....18 1.
+ ...145 ....31 .62 ....42 -1.62
+ ...146 .Z.... 512. ....18 1.
+ ...146 ....32 .62 ....43 -1.62
+ ...147 .Z.... 512. ....18 1.
+ ...147 ....33 .62 ....44 -1.62
+ ...148 .Z.... 70.9 ....01 -.247
+ ...148 ....06 .1726 ....14 -.3122
+ ...148 ....20 1.783 ....28 .4703
+ ...148 ....50 -.0928 ....54 1.40015
+ ...149 .Z.... 39.8 ....01 -.157
+ ...149 ....14 -.2399 ....20 1.
+ ...149 ....28 .4273 ....50 -.0361
+ ...149 ....54 1.20404
+ ...150 .Z.... 39.8 ....01 -.157
+ ...150 ....14 -.2789 ....20 1.
+ ...150 ....28 .4663 ....50 -.0361
+ ...150 ....54 1.43498
+ ...151 .Z.... 2.04 ....26 1.
+ ...151 ....28 .55 ....50 -.52
+ ...151 ....54 .6
+ ...152 ....28 1. ....50 -1.
+ ...152 ....54 1.8
+ ...153 .Z.... 1.8 ....03 -.33
+ ...153 ....21 1. ....50 .017
+ ...154 .Z.... 1.8 ....21 1.
+ ...154 ....37 -.33
+ ...155 .Z.... -2600. ....01 .2
+ ...155 ....14 .73 ....29 1.
+ ...155 ....55 .07
+ ...156 .Z.... -2600. ....14 .72
+ ...156 ....29 1. ....47 .2
+ ...156 ....55 .08
+ ...157 .Z.... 10.4 ....02 1.
+ ...157 ....03 .25 ....10 45.
+ ...157 ....22 .875 ....28 .3675
+ ...157 ....34 .6325 ....50 .02536
+ ...157 ....54 1.614
+ ...158 .Z.... 10.4 ....02 1.
+ ...158 ....03 .2 ....10 55.
+ ...158 ....22 .875 ....28 .365
+ ...158 ....46 .635 ....50 .02538
+ ...158 ....54 1.59
+ ...159 .Z.... 28.8 ....19 1.
+ ...159 ....28 -.828 ....31 1.
+ ...159 ....34 -.095 ....35 -.02
+ ...159 ....50 .012 ....54 -1.42
+ ...159 ....55 -.0467
+ ...160 .Z.... 43.4 ....01 -.0022
+ ...160 ....06 -.0192 ....19 1.
+ ...160 ....27 .679 ....28 -.808
+ ...160 ....32 1. ....34 -.095
+ ...160 ....35 -.02 ....50 .0205
+ ...160 ....54 -1.84 ....55 -.0467
+ ...161 .Z.... 30.4 ....01 -.0022
+ ...161 ....06 -.0192 ....24 1.
+ ...161 ....27 .679 ....28 -.808
+ ...161 ....33 1. ....34 -.095
+ ...161 ....35 -.02 ....50 .0205
+ ...161 ....54 -1.84 ....55 -.0467
+ ...162 ....28 -1. ....34 1.
+ ...162 ....54 -5.2
+ ...163 ....28 -1. ....35 1.
+ ...163 ....54 -6.7
+ ...164 .Z.... -1218. ....35 1.
+ ...164 ....48 1.
+ ...165 ....35 1. ....50 -.8
+ ...166 ....28 .482 ....34 .498
+ ...166 ....35 .02 ....36 1.
+ ...166 ....37 .79 ....54 2.217
+ ...167 ....28 .474 ....35 .02
+ ...167 ....36 1. ....37 .53
+ ...167 ....46 .506 ....54 2.18
+ ...168 .Z.... -1322. ....06 .07
+ ...168 ....35 .1 ....39 1.
+ ...168 ....55 .83
+ ...169 .Z.... -1322. ....35 .07
+ ...169 ....39 1. ....46 .33
+ ...169 ....55 .6
+ ...170 .Z.... -1322. ....34 .33
+ ...170 ....35 .07 ....39 1.
+ ...170 ....55 .6
+ ...171 .Z.... -1660. ....22 .625
+ ...171 ....28 -.125 ....34 1.125
+ ...171 ....41 1. ....50 .01812
+ ...171 ....54 -.65
+ ...172 .Z.... -1670. ....41 1.
+ ...172 ....46 1.
+ ...173 .Z.... 14.8 ....22 1.25
+ ...173 ....28 -.25 ....34 1.03125
+ ...173 ....35 .21875 ....40 1.
+ ...173 ....50 .03625 ....51 30.
+ ...173 ....54 -1.36562
+ ...174 .Z.... 14.8 ....22 1.25
+ ...174 ....28 -.25 ....35 .21875
+ ...174 ....40 1. ....46 1.03125
+ ...174 ....50 .03625 ....51 35.
+ ...174 ....54 -1.38375
+ ...175 .Z.... 28.8 ....19 1.072
+ ...175 ....28 -.706 ....35 -.027
+ ...175 ....42 1. ....46 -.128
+ ...175 ....50 .0129 ....54 -1.61
+ ...175 ....55 -.1203
+ ...176 .Z.... 43. ....01 -.0012
+ ...176 ....06 -.0159 ....19 1.072
+ ...176 ....27 .534 ....28 -.69
+ ...176 ....35 -.027 ....43 1.
+ ...176 ....46 -.128 ....50 .0195
+ ...176 ....54 -1.84 ....55 -.1203
+ ...177 .Z.... 30. ....01 -.0012
+ ...177 ....06 -.0159 ....24 1.
+ ...177 ....27 .534 ....28 -.69
+ ...177 ....35 -.027 ....44 1.
+ ...177 ....46 -.128 ....50 .0195
+ ...177 ....54 -1.84 ....55 -.1203
+ ...178 .Z.... -1763. ....05 .181
+ ...178 ....45 1. ....47 .11
+ ...178 ....55 .709
+ ...179 .Z.... -1722. ....05 .051
+ ...179 ....45 1. ....47 .055
+ ...179 ....55 .894
+ ...180 .Z.... -1680. ....05 .036
+ ...180 ....45 1. ....55 .964
+ ...181 ....28 -1. ....46 1.
+ ...181 ....54 -5.3
+ ...182 .Z.... -1890. ....30 1.
+ ...182 ....47 .92 ....49 -10.1
+ ...182 ....52 -.042 ....53 -.063
+ ...182 ....55 .08
+ ...183 .Z.... 1780. ....02 1.
+ ...183 ....03 .4 ....10 45.
+ ...184 .Z.... 1600. ....28 -1.
+ ...184 ....54 -4.35
+ ...185 .Z.... 903. ....28 -1.
+ ...185 ....54 -2.1
+ ...186 .Z.... 1760. ....36 1.
+ ...186 ....37 .8
+ ...187 .Z.... 2100. ....40 1.
+ ...187 ....51 24.
+ ...188 .Z.... 1000. ....49 -64.3
+ ...188 ....52 1.
+ ...189 .Z.... 1000. ....49 -27.4
+ ...189 ....53 1.
+ ...190 .Z.... -1890. ....30 1.
+ ...190 ....49 9.1 ....52 -.042
+ ...190 ....53 -.063 ....55 1.
+ ...191 .Z.... 92.1 ....05 -.36
+ ...191 ....23 1. ....28 -.026
+ ...191 ....47 -.134 ....50 -.182
+ ...191 ....54 -.1742 ....55 .826
+ ...192 .Z.... -903. ....38 1.
+ ...192 ....55 1.
+ ...193 .Z.... 78.7 ....55 1.
+ ...194 .Z.... -1218. ....48 1.
+ ...194 ....55 1.
+ ...195 .Z.... 15.6 ....05 -.396
+ ...195 ....25 1. ....28 -.029
+ ...195 ....47 -.147 ....50 -.119
+ ...195 ....54 -.194 ....55 .81
+ ...196 ....50 -.8 ....55 1.
+RHS
+ ZZZZ0001 ....02 52.6 ....03 22.7
+ ZZZZ0001 ....04 23.4 ....07 108.
+ ZZZZ0001 ....08 50. ....09 13.
+ ZZZZ0001 ....10 2366. ....11 200.
+ ZZZZ0001 ....12 265. ....13 300.
+ ZZZZ0001 ....15 31. ....16 60.
+ ZZZZ0001 ....17 134. ....18 34.
+ ZZZZ0001 ....19 413. ....20 41.5
+ ZZZZ0001 ....21 15. ....22 20.6
+ ZZZZ0001 ....23 13.5 ....24 440.
+ ZZZZ0001 ....26 16. ....27 290.
+ ZZZZ0001 ....28 -524.9 ....29 3.1
+ ZZZZ0001 ....30 9.1 ....36 43.
+ ZZZZ0001 ....37 34.4 ....38 15.6
+ ZZZZ0001 ....39 19.2 ....40 44.9
+ ZZZZ0001 ....41 6.1 ....45 13.2
+ ZZZZ0001 ....48 31.2 ....50 2.5
+ ZZZZ0001 ....51 1080. ....54 -1231.6
+ ZZZZ0001 ....56 107.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/afiro.mps b/demos/ppl_lpsol/examples/afiro.mps
new file mode 100644
index 0000000..26002a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/afiro.mps
@@ -0,0 +1,83 @@
+NAME AFIRO
+ROWS
+ E R09
+ E R10
+ L X05
+ L X21
+ E R12
+ E R13
+ L X17
+ L X18
+ L X19
+ L X20
+ E R19
+ E R20
+ L X27
+ L X44
+ E R22
+ E R23
+ L X40
+ L X41
+ L X42
+ L X43
+ L X45
+ L X46
+ L X47
+ L X48
+ L X49
+ L X50
+ L X51
+ N COST
+COLUMNS
+ X01 X48 .301 R09 -1.
+ X01 R10 -1.06 X05 1.
+ X02 X21 -1. R09 1.
+ X02 COST -.4
+ X03 X46 -1. R09 1.
+ X04 X50 1. R10 1.
+ X06 X49 .301 R12 -1.
+ X06 R13 -1.06 X17 1.
+ X07 X49 .313 R12 -1.
+ X07 R13 -1.06 X18 1.
+ X08 X49 .313 R12 -1.
+ X08 R13 -.96 X19 1.
+ X09 X49 .326 R12 -1.
+ X09 R13 -.86 X20 1.
+ X10 X45 2.364 X17 -1.
+ X11 X45 2.386 X18 -1.
+ X12 X45 2.408 X19 -1.
+ X13 X45 2.429 X20 -1.
+ X14 X21 1.4 R12 1.
+ X14 COST -.32
+ X15 X47 -1. R12 1.
+ X16 X51 1. R13 1.
+ X22 X46 .109 R19 -1.
+ X22 R20 -.43 X27 1.
+ X23 X44 -1. R19 1.
+ X23 COST -.6
+ X24 X48 -1. R19 1.
+ X25 X45 -1. R19 1.
+ X26 X50 1. R20 1.
+ X28 X47 .109 R22 -.43
+ X28 R23 1. X40 1.
+ X29 X47 .108 R22 -.43
+ X29 R23 1. X41 1.
+ X30 X47 .108 R22 -.39
+ X30 R23 1. X42 1.
+ X31 X47 .107 R22 -.37
+ X31 R23 1. X43 1.
+ X32 X45 2.191 X40 -1.
+ X33 X45 2.219 X41 -1.
+ X34 X45 2.249 X42 -1.
+ X35 X45 2.279 X43 -1.
+ X36 X44 1.4 R23 -1.
+ X36 COST -.48
+ X37 X49 -1. R23 1.
+ X38 X51 1. R22 1.
+ X39 R23 1. COST 10.
+RHS
+ B X50 310. X51 300.
+ B X05 80. X17 80.
+ B X27 500. R23 44.
+ B X40 500.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/bgprtr.mps b/demos/ppl_lpsol/examples/bgprtr.mps
new file mode 100644
index 0000000..50e56cd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/bgprtr.mps
@@ -0,0 +1,84 @@
+NAME BGPRTR
+ROWS
+ N 1
+ E 2
+ E 3
+ L 4
+ L 5
+ L 6
+ L 7
+ L 8
+ L 9
+ E 10
+ E 11
+ E 12
+ E 13
+ E 14
+ E 15
+ E 16
+ E 17
+ E 18
+ E 19
+ E 20
+ E 21
+COLUMNS
+ P1T1 1 29970. 2 1.
+ P1T1 14 1.
+ P1T2 1 29970. 3 1.
+ P1T2 15 1.
+ P2T1 1 29910. 2 1.
+ P2T1 16 1.
+ P2T2 1 29910. 3 1.
+ P2T2 17 1.
+ I1T1 1 -1000. 8 1.
+ I1T1 10 -1.
+ I1T2 1 -1000. 9 1.
+ I1T2 12 -1.
+ I2T1 1 -1000. 8 1.
+ I2T1 11 -1.
+ I2T2 1 -1000. 9 1.
+ I2T2 13 -1.
+ E1T1 1 -1200. 10 -1.
+ E1T2 1 -1200. 12 -1.
+ E2T1 1 -1200. 11 -1.
+ E2T2 1 -1200. 13 -1.
+ C1T1 1 -20. 18 1.
+ C1T1 21 -1.
+ C1T2 1 -20. 19 1.
+ C2T1 1 -20. 19 -1.
+ C2T1 20 1.
+ C2T2 1 -20. 21 1.
+ NDT1 1 -3000. 2 -1.
+ NDT2 1 -3000. 3 -1.
+ R1T1 1 -20. 18 1.
+ R1T1 19 -1.
+ R1T2 1 -20. 19 1.
+ R2T1 1 -20. 20 1.
+ R2T1 21 -1.
+ R2T2 1 -20. 21 1.
+ N1T1 1 -300. 14 1.
+ N1T1 15 -1.
+ N1T2 1 -300. 15 1.
+ N2T1 1 -300. 16 1.
+ N2T1 17 -1.
+ N2T2 1 -300. 17 1.
+ B1T1 4 900. 10 6.
+ B1T1 14 -1. 18 1.
+ T1T1 4 90. 18 -1.
+ B1T2 5 900. 12 6.
+ B1T2 15 -1. 19 1.
+ T1T2 5 90. 19 -1.
+ B2T1 6 600. 11 6.
+ B2T1 16 -1. 20 1.
+ T2T1 6 60. 20 -1.
+ B2T2 7 600. 13 6.
+ B2T2 17 -1. 21 1.
+ T2T2 7 60. 21 -1.
+RHS
+ RHS 2 130. 3 190.
+ RHS 4 8. 5 80000.
+ RHS 6 70000. 7 70000.
+ RHS 8 1000. 9 1000.
+ RHS 14 5. 16 2.
+ RHS 18 6. 20 4.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/blend.mps b/demos/ppl_lpsol/examples/blend.mps
new file mode 100644
index 0000000..2a37ae6
--- /dev/null
+++ b/demos/ppl_lpsol/examples/blend.mps
@@ -0,0 +1,366 @@
+* Problem: BLEND
+* Class: LP
+* Rows: 75
+* Columns: 83
+* Non-zeros: 521
+* Format: Free MPS
+*
+NAME BLEND
+ROWS
+ E 1
+ E 2
+ E 3
+ E 4
+ E 5
+ E 6
+ E 7
+ E 8
+ E 9
+ E 10
+ E 11
+ E 12
+ E 13
+ E 14
+ E 15
+ E 16
+ E 17
+ E 18
+ E 19
+ E 20
+ E 21
+ E 22
+ E 23
+ E 24
+ E 25
+ E 26
+ E 27
+ E 28
+ E 29
+ E 30
+ E 31
+ E 32
+ E 33
+ E 34
+ E 35
+ E 36
+ E 37
+ E 38
+ E 39
+ E 40
+ E 41
+ E 42
+ E 43
+ L 44
+ L 45
+ L 46
+ L 47
+ L 48
+ L 49
+ L 50
+ L 51
+ L 52
+ L 53
+ L 54
+ L 55
+ L 56
+ L 57
+ L 58
+ L 59
+ L 60
+ L 61
+ L 62
+ L 63
+ L 64
+ L 65
+ L 66
+ L 67
+ L 68
+ L 69
+ L 70
+ L 71
+ L 72
+ L 73
+ L 74
+ N C
+COLUMNS
+ 1 2 -0.537 3 -0.131
+ 1 4 -0.1155 5 -0.0365
+ 1 6 -0.143 7 -0.037
+ 1 40 0.003 41 0.0587
+ 1 42 0.15 43 0.302
+ 1 67 1 C 3.2
+ 2 1 -0.2931 3 -0.117
+ 2 4 -0.0649 5 -0.1233
+ 2 6 -0.2217 8 -0.18
+ 2 39 0.0042 40 0.003
+ 2 41 0.1053 42 0.185
+ 2 43 0.384 50 -0.00862
+ 2 51 -0.00862 56 -0.0101
+ 2 57 -0.0101 68 1
+ 2 C 2.87
+ 3 2 1 9 -0.0277
+ 3 10 -0.0563 11 -0.199
+ 3 12 -0.6873 13 -0.017
+ 3 40 0.01303 41 0.0506
+ 3 42 0.209 43 0.495
+ 3 65 1
+ 4 1 1 9 -0.0112
+ 4 10 -0.0378 11 -0.1502
+ 4 12 -0.7953 13 -0.0099
+ 4 40 0.01303 41 0.0448
+ 4 42 0.185 43 0.721
+ 4 65 1
+ 5 9 -0.175 10 -0.27
+ 5 11 -0.028 13 -0.455
+ 5 21 1 40 0.01303
+ 5 41 0.0506 42 0.209
+ 5 43 0.495
+ 6 9 -0.271 10 -0.3285
+ 6 11 -0.0255 13 -0.2656
+ 6 18 1 40 0.01303
+ 6 41 0.0506 42 0.209
+ 6 43 0.495
+ 7 9 -0.2836 10 -0.3285
+ 7 11 -0.0241 13 -0.2502
+ 7 17 1 40 0.01303
+ 7 41 0.0506 42 0.209
+ 7 43 0.495
+ 8 12 1 14 -1
+ 8 39 0.0327 41 0.094
+ 8 42 0.045 43 0.793
+ 8 C 0.0044
+ 9 15 -1 22 1
+ 10 16 -1 22 1
+ 11 14 1 15 -1
+ 12 14 1 16 -1
+ 13 15 1 17 -0.0588
+ 13 19 -0.8145 23 -0.0091
+ 13 39 -0.8239 40 0.0081
+ 13 41 -0.2112 42 0.387
+ 13 43 1.03 69 1.3
+ 13 C 0.07
+ 14 16 1 18 -0.0404
+ 14 20 -0.8564 23 -0.0069
+ 14 39 -0.7689 40 0.0063
+ 14 41 -0.156 42 0.297
+ 14 43 0.792 69 1
+ 14 C 0.0378
+ 15 5 1 21 -0.3321
+ 15 22 -0.5875 23 -0.362
+ 15 39 2.3 41 -0.2049
+ 15 42 0.826 43 14.61
+ 15 65 1 70 1
+ 15 C 0.155
+ 16 6 1 21 -0.3321
+ 16 22 -0.5875 23 -0.362
+ 16 39 2.3 41 -0.2049
+ 16 42 0.826 43 14.61
+ 16 66 1 70 1
+ 16 C 0.155
+ 17 4 1 21 -0.2414
+ 17 22 -0.6627 23 -0.293
+ 17 39 2.3 41 -0.1531
+ 17 42 0.826 43 14.61
+ 17 65 1 70 1
+ 17 C 0.155
+ 18 21 -0.2414 22 -0.6627
+ 18 23 -0.293 28 1
+ 18 39 2.3 41 -0.1531
+ 18 42 0.826 43 14.61
+ 18 70 1 C 0.155
+ 19 5 1 10 -0.0185
+ 19 13 -0.0568 24 -0.0806
+ 19 25 -0.0658 26 -0.0328
+ 19 27 -0.4934 28 -0.2922
+ 19 29 -0.0096 40 -0.0654
+ 19 41 -0.2535 42 0.632
+ 19 43 0.6807 65 1
+ 19 71 1 C 0.0528
+ 20 6 1 10 -0.0185
+ 20 13 -0.0568 24 -0.0806
+ 20 25 -0.0658 26 -0.0328
+ 20 27 -0.4934 28 -0.2922
+ 20 29 -0.0096 40 -0.0654
+ 20 41 -0.2535 42 0.632
+ 20 43 0.6807 66 1
+ 20 71 1 C 0.0528
+ 21 4 1 10 -0.0184
+ 21 13 -0.0564 24 -0.078
+ 21 25 -0.0655 26 -0.0303
+ 21 27 -0.475 28 -0.305
+ 21 40 -0.0654 41 -0.2703
+ 21 42 0.632 43 0.6807
+ 21 65 1 71 1
+ 21 C 0.0528
+ 22 3 1 10 -0.0184
+ 22 13 -0.0564 24 -0.078
+ 22 25 -0.0655 26 -0.0303
+ 22 27 -0.475 28 -0.305
+ 22 40 -0.0654 41 -0.2703
+ 22 42 0.632 43 0.6807
+ 22 65 1 71 1
+ 22 C 0.0528
+ 23 13 0.76 25 0.5714
+ 23 30 -1 40 0.1869
+ 23 41 0.2796 42 2.241
+ 23 43 2.766 72 1
+ 23 C 0.128
+ 24 9 -0.0571 10 -0.0114
+ 24 13 0.6571 24 0.5714
+ 24 31 -1 40 0.1724
+ 24 41 0.2579 42 2.067
+ 24 43 2.552 72 1
+ 24 C 0.118
+ 25 9 -1 25 1
+ 26 10 -1 24 1
+ 27 10 -1 13 1
+ 28 11 1 32 -1
+ 28 44 -7.95 45 -8.7
+ 28 46 -3 47 14
+ 28 48 1 49 -1
+ 29 23 1 32 -1
+ 29 44 -8.84 45 -9.45
+ 29 46 -3 47 12
+ 29 48 1 49 -1
+ 30 19 1 32 -1
+ 30 44 -9.43 45 -9.57
+ 30 46 -3 47 3.5
+ 30 48 0.233 49 -0.358
+ 31 20 1 32 -1
+ 31 44 -9.03 45 -9.32
+ 31 46 -3 47 3.5
+ 31 48 0.205 49 -0.333
+ 32 27 1 32 -1
+ 32 44 -9.23 45 -9.22
+ 32 46 -3 47 6
+ 32 48 0.381 49 -0.509
+ 33 30 1 32 -1
+ 33 44 -9.4 45 -9.85
+ 33 46 -3 47 2.5
+ 33 48 0.39 49 -0.77
+ 34 31 1 32 -1
+ 34 44 -9.74 45 -10.1
+ 34 46 -3 47 3.3
+ 34 48 0.233 49 -0.58
+ 35 10 1 32 -1
+ 35 44 -9.74 45 -9.9
+ 35 46 -3 47 66
+ 35 48 1 49 -1
+ 36 44 -0.493 45 -0.165
+ 36 46 1 C 0.0924
+ 37 32 1 44 10.03
+ 37 45 10.03 47 -9.5
+ 37 48 -0.5 49 0.5
+ 37 73 0.64 74 0.35
+ 37 C -5.36
+ 38 11 1 33 -1
+ 38 50 -7.98 51 -8.58
+ 38 52 -3 53 14
+ 38 54 1 55 -1
+ 39 23 1 33 -1
+ 39 50 -8.87 51 -9.33
+ 39 52 -3 53 12
+ 39 54 1 55 -1
+ 40 19 1 33 -1
+ 40 50 -9.46 51 -9.45
+ 40 52 -3 53 3.5
+ 40 54 0.233 55 -0.358
+ 41 20 1 33 -1
+ 41 50 -9.06 51 -9.2
+ 41 52 -3 53 3.5
+ 41 54 0.205 55 -0.333
+ 42 27 1 33 -1
+ 42 50 -9.26 51 -9.13
+ 42 52 -3 53 6
+ 42 54 0.318 55 -0.509
+ 43 10 1 33 -1
+ 43 50 -9.77 51 -9.78
+ 43 52 -3 53 66
+ 43 54 1 55 -1
+ 44 50 -0.435 51 -0.208
+ 44 52 1 C 0.0924
+ 45 33 1 50 9.65
+ 45 51 9.65 53 -9.5
+ 45 54 -0.5 55 0.5
+ 45 73 -0.36 74 0.35
+ 45 C -5.08
+ 46 11 1 36 -1
+ 46 56 -7.99 57 -8.59
+ 46 58 -3 59 14
+ 46 60 1 61 -1
+ 47 23 1 36 -1
+ 47 56 -8.88 57 -9.34
+ 47 58 -3 59 12
+ 47 60 1 61 -1
+ 48 19 1 36 -1
+ 48 56 -9.47 57 -9.46
+ 48 58 -3 59 3.5
+ 48 60 0.233 61 -0.358
+ 49 20 1 36 -1
+ 49 56 -9.07 57 -9.21
+ 49 58 -3 59 3.5
+ 49 60 0.205 61 -0.333
+ 50 27 1 36 -1
+ 50 56 -9.27 57 -9.14
+ 50 58 -3 59 6
+ 50 60 0.318 61 -0.509
+ 51 10 1 36 -1
+ 51 56 -9.78 57 -9.79
+ 51 58 -3 59 66
+ 51 60 1 61 -1
+ 52 56 -0.426 57 -0.204
+ 52 58 1 C 0.0924
+ 53 36 1 56 9.05
+ 53 57 9.05 59 -9.5
+ 53 60 -0.5 61 0.5
+ 53 73 -0.36 74 -0.65
+ 53 C -4.51
+ 54 9 -1 26 1
+ 55 9 1 37 -1
+ 56 10 1 37 -1
+ 57 37 1 C -2.75
+ 58 11 1 38 -1
+ 58 63 -14 64 14
+ 59 12 1 38 -1
+ 59 63 -0.8 64 0.8
+ 60 38 1 63 2
+ 60 64 -3 C -4.2
+ 61 4 1 34 -1
+ 62 3 1 34 -1
+ 63 34 1 65 1
+ 63 C -3.6
+ 64 7 1 35 -1
+ 64 62 10.1
+ 65 8 1 35 -1
+ 65 62 12.63
+ 66 6 1 35 -1
+ 66 62 8.05 66 1
+ 67 5 1 35 -1
+ 67 62 6.9 65 1
+ 68 29 1 35 -1
+ 68 62 8.05
+ 69 28 1 35 -1
+ 69 62 4.4
+ 70 35 1 62 -10.1
+ 70 C -2
+ 71 39 1 41 -0.325
+ 72 13 1 41 -4.153
+ 73 10 1 41 -4.316
+ 74 9 1 41 -3.814
+ 75 25 1 41 -3.808
+ 76 24 1 41 -4.44
+ 77 40 -1 41 1.42
+ 77 C 0.04
+ 78 40 1
+ 79 10 -0.5 13 -0.5
+ 79 C 3
+ 80 41 -1 C 0.4
+ 81 41 1
+ 82 42 -1 C 0.0132
+ 83 43 -1 C 0.01
+RHS
+ RHS1 65 23.26 66 5.25
+ RHS1 67 26.32 68 21.05
+ RHS1 69 13.45 70 2.58
+ RHS1 71 10 72 10
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing1.mps b/demos/ppl_lpsol/examples/boeing1.mps
new file mode 100644
index 0000000..bbe16dd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing1.mps
@@ -0,0 +1,2636 @@
+NAME BOEING1 (FLAPINTL)
+ROWS
+ G REVENUES
+ G ACOCOSTS
+ N OBJECTIV
+ G SYSTDEPT
+ G ACMILES
+ G ASMILES
+ G PASSNGRS
+ G RPMILES
+ G LFRPMASM
+ G ATONMILE
+ G RTONMILE
+ G LFTNMILE
+ E FLAV*1
+ E FLAV*2
+ E FLAV*3
+ E FLAV*4
+ E FLAV*5
+ E FLAV*6
+ G LF1001S1
+ G LF1002S1
+ G LF1002S2
+ G LF1003S1
+ G LF1004S1
+ G LF1004S2
+ G LF1005S1
+ G LF1005S2
+ G LF1105S1
+ G LF1105S2
+ G LF1006S1
+ G LF1006S2
+ G LF1007S1
+ G LF1007S2
+ G LF1008S1
+ G LF1008S2
+ G LF1008S3
+ G LF1009S1
+ G LF1009S2
+ G LF1010S1
+ G LF1011S1
+ G LF1011S2
+ G LF1012S1
+ G LF1013S1
+ G LF1013S2
+ G LF1014S1
+ G LF1014S2
+ G LF1015S1
+ G LF1015S2
+ G LF1016S1
+ G LF1016S2
+ G LF1017S1
+ G LF1017S2
+ G LF1018S1
+ G LF1018S2
+ G LF1019S1
+ G LF1019S2
+ G LF1020S1
+ G LF1021S1
+ G LF1022S1
+ G LF1022S2
+ G LF1022S3
+ G LF1023S1
+ G LF1023S2
+ G LF1023S3
+ G LF1026S1
+ G LF1026S2
+ G LF1026S3
+ G LF1027S1
+ G LF1027S2
+ G LF1027S3
+ G LF1028S1
+ G LF1028S2
+ G LF1028S3
+ G LF1029S1
+ G LF1029S2
+ G LF1029S3
+ G LF1029S4
+ G LF1029S5
+ G LF1030S1
+ G LF1030S2
+ G LF1030S3
+ G LF1030S4
+ G LF1032S1
+ G LF1032S2
+ G LF1032S3
+ G LF1032S4
+ G LF1032S5
+ G LF1033S1
+ G LF1033S2
+ G LF1033S3
+ G LF1034S1
+ G LF1034S2
+ G LF1035S1
+ G LF1035S2
+ G LF1036S1
+ G LF1036S2
+ G LF1037S1
+ G LF1037S2
+ G LF1038S1
+ G LF1039S1
+ G LF1040S1
+ G LF1040S2
+ G LF1041S1
+ G LF1042S1
+ G LF1043S1
+ G LF1044S1
+ G LF1046S1
+ G LF1046S2
+ G LF1047S1
+ G LF1047S2
+ G LF1047S3
+ G LF1050S1
+ G LF1050S2
+ G LF1051S1
+ L NOPTLON0
+ G NOPTLON1
+ L NOPTTYO0
+ G NOPTTYO1
+ L DMBOSHNL
+ L DMBOSLAX
+ L DMBOSSEA
+ L DMBOSSFO
+ L DMBOSTPE
+ L DMBOSTYO
+ L DMBOSYUL
+ L DMBOSYVR
+ L DMBOSYWG
+ L DMBOSYYZ
+ L DMBUROAK
+ L DMBURSEA
+ L DMBURSFO
+ L DMHNLLAX
+ L DMHNLLON
+ L DMHNLPAR
+ L DMHNLSEA
+ L DMHNLSFO
+ L DMHNLYVR
+ L DMLASSEA
+ L DMLASYVR
+ L DMLAXOAK
+ L DMLAXSEA
+ L DMLAXSFO
+ L DMLAXTPE
+ L DMLAXTYO
+ L DMLAXYVR
+ L DMLONPAR
+ L DMLONSEA
+ L DMLONYVR
+ L DMOAKONT
+ L DMOAKSEA
+ L DMONTSFO
+ L DMONTSEA
+ L DMPARSEA
+ L DMPARYVR
+ L DMRNOSEA
+ L DMRNOYVR
+ L DMSEASFO
+ L DMSEATPE
+ L DMSEATYO
+ L DMSEAYVR
+ L DMSFOTPE
+ L DMSFOTYO
+ L DMSFOYVR
+ L DMTPETYO
+ L DMTPEYVR
+ L DMTYOYVR
+ L DMYULYVR
+ L DMYULYWG
+ L DMYULYYZ
+ L DMYVRYWG
+ L DMYVRYYZ
+ L DMYWGYYZ
+ L DMBOSOAK
+ L DMBOSBUR
+ L DMBOSONT
+ L DMBURYVR
+ L DMBURTYO
+ L DMBURTPE
+ L DMBURHNL
+ L DMHNLOAK
+ L DMHNLONT
+ L DMHNLYWG
+ L DMHNLYYZ
+ L DMHNLYUL
+ L DMLASTYO
+ L DMLASTPE
+ L DMLAXLON
+ L DMLAXPAR
+ L DMBURLON
+ L DMBURPAR
+ L DMLONONT
+ L DMLONOAK
+ L DMOAKPAR
+ L DMOAKTYO
+ L DMOAKTPE
+ L DMONTPAR
+ L DMONTTYO
+ L DMONTTPE
+ L DMPARSFO
+ L DMRNOTYO
+ L DMRNOTPE
+ L DMTPEYWG
+ L DMTPEYYZ
+ L DMTPEYUL
+ L DMTYOYUL
+ L DMTYOYYZ
+ L DMTYOYWG
+ E DMSFOOAK
+ E DMLAXBUR
+ E DMLAXONT
+ G MSBOSHNL
+ G MSBOSSEA
+ G MSBOSSFO
+ G MSBOSYUL
+ G MSBOSYVR
+ G MSBOSYWG
+ G MSBOSYYZ
+ G MSBUROAK
+ G MSBURSEA
+ G MSBURSFO
+ G MSHNLLAX
+ G MSHNLSEA
+ G MSHNLSFO
+ G MSHNLYVR
+ G MSLASSEA
+ G MSLASYVR
+ G MSLAXOAK
+ G MSLAXSEA
+ G MSLAXSFO
+ G MSLAXTPE
+ G MSLAXYVR
+ G MSLONPAR
+ G MSLONSEA
+ L MSLONYVR
+ G MSOAKONT
+ G MSOAKSEA
+ G MSONTSFO
+ G MSONTSEA
+ L MSPARSEA
+ G MSRNOSEA
+ G MSRNOYVR
+ G MSSEASFO
+ G MSSEATPE
+ G MSSEATYO
+ G MSSEAYVR
+ G MSSFOYVR
+ G MSTPETYO
+ G MSYULYVR
+ G MSYULYWG
+ G MSYULYYZ
+ G MSYVRYWG
+ G MSYVRYYZ
+ G MSYWGYYZ
+ G MSBOSOAK
+ G MSHNLOAK
+ G MSLAXLON
+ G P1044X32
+ G P1047X54
+ G P1032X76
+ G P1033X54
+ G P1036X43
+ G P1040X43
+ G P1042X32
+ G P1032X75
+ G P1040X42
+ G P1016X43
+ G P1003X32
+ G P1004X43
+ G P1105X43
+ G P1047X23
+ G P1001X32
+ G P1002X43
+ G P1007X43
+ G P1002X42
+ G P1022X23
+ G P1019X43
+ G P1021X32
+ G P1105X32
+ G P1017X43
+ G P1046X23
+ G P1008X53
+ G P1009X43
+ G P1011X42
+ G P1012X32
+ G P1017X42
+ G P1026X23
+ G P1027X23
+ G P1029X24
+ G P1030X24
+ G P1050X32
+ G P1004X32
+ G P1008X54
+ G P1011X43
+ G P1029X23
+ G P1030X23
+ G P1047X34
+ G P1051X23
+ G P1027X25
+ G P1029X27
+ G P1030X26
+ G P1008X52
+ G P1009X42
+ G P1029X25
+ G P1013X32
+ G P1014X32
+ G P1017X32
+ G P1015X43
+ G P1013X42
+ G P1015X42
+ G P1050X42
+ G P1018X43
+ G P1020X32
+ G P1008X34
+ G P1011X23
+ G P1015X23
+ G P1016X23
+ G P1028X32
+ G P1029X43
+ G P1030X43
+ G P1002X32
+ G P1008X32
+ G P1009X32
+ G P1010X32
+ G P1018X32
+ G P1019X32
+ G P1023X32
+ G P1029X45
+ G P1032X23
+ G P1008X42
+ G P1029X35
+ G P1032X63
+ G P1033X42
+ G P1034X42
+ G P1036X32
+ G P1032X64
+ G P1033X43
+ G P1037X42
+ G P1039X32
+ G P1032X65
+ G P1034X43
+ G P1037X43
+ G P1040X32
+ G P1041X32
+ G P1032X34
+ G P1033X23
+ G P1035X23
+ G P1032X35
+ G P1034X23
+ G P1035X24
+ G P1032X45
+ G P1035X34
+ G P1037X23
+ G P1038X23
+COLUMNS
+ PBOSHNL0 REVENUES .23519 OBJECTIV -.23519
+ PBOSHNL0 PASSNGRS 1. RPMILES 5.16595
+ PBOSHNL0 LFRPMASM -5.16595 DMBOSHNL 1.
+ PBOSHNL0 LF1007S1 -1. LF1007S2 -1.
+ PBOSHNL1 REVENUES .23519 OBJECTIV -.23519
+ PBOSHNL1 PASSNGRS 1. RPMILES 5.59035
+ PBOSHNL1 LFRPMASM -5.59035 DMBOSHNL 1.
+ PBOSHNL1 LF1047S1 -1. LF1047S2 -1.
+ PBOSHNL1 LF1047S3 -1.
+ PBOSHNL7 REVENUES -.02469 OBJECTIV .02469
+ PBOSHNL7 PASSNGRS -1. DMBOSHNL 1.
+ PBOSHNL7 DMBOSSEA -1. DMHNLSEA -1.
+ PBOSHNL8 REVENUES -.02665 OBJECTIV .02665
+ PBOSHNL8 PASSNGRS -1. DMBOSHNL 1.
+ PBOSHNL8 DMBOSYVR -1. DMHNLYVR -1.
+ PBOSLAX0 REVENUES .13092 OBJECTIV -.13092
+ PBOSLAX0 PASSNGRS 1. RPMILES 3.02542
+ PBOSLAX0 LFRPMASM -3.02542 DMBOSLAX 1.
+ PBOSLAX0 LF1046S1 -1. LF1046S2 -1.
+ PBOSLAX1 REVENUES .13092 OBJECTIV -.13092
+ PBOSLAX1 PASSNGRS 1. RPMILES 3.03697
+ PBOSLAX1 LFRPMASM -3.03697 DMBOSLAX 1.
+ PBOSLAX1 LF1047S2 -1. LF1047S3 -1.
+ PBOSLAX7 REVENUES -.03462 OBJECTIV .03462
+ PBOSLAX7 PASSNGRS -1. DMBOSLAX 1.
+ PBOSLAX7 DMBOSSFO -1. DMLAXSFO -1.
+ PBOSSEA0 REVENUES .12596 OBJECTIV -.12596
+ PBOSSEA0 PASSNGRS 1. RPMILES 2.48884
+ PBOSSEA0 LFRPMASM -2.48884 DMBOSSEA 1.
+ PBOSSEA0 LF1007S1 -1.
+ PBOSSEA1 REVENUES .12596 OBJECTIV -.12596
+ PBOSSEA1 PASSNGRS 1. RPMILES 2.78679
+ PBOSSEA1 LFRPMASM -2.78679 DMBOSSEA 1.
+ PBOSSEA1 LF1032S1 -1. LF1032S2 -1.
+ PBOSSEA1 LF1032S3 -1. LF1032S4 -1.
+ PBOSSEA1 LF1032S5 -1.
+ PBOSSEA2 REVENUES .12596 OBJECTIV -.12596
+ PBOSSEA2 PASSNGRS 1. RPMILES 2.48884
+ PBOSSEA2 LFRPMASM -2.48884 DMBOSSEA 1.
+ PBOSSEA2 LF1043S1 -1.
+ PBOSSFO0 REVENUES .13481 OBJECTIV -.13481
+ PBOSSFO0 PASSNGRS 1. RPMILES 2.69845
+ PBOSSFO0 LFRPMASM -2.69845 DMBOSSFO 1.
+ PBOSSFO0 P1044X32 -1. LF1044S1 -1.
+ PBOSSFO1 REVENUES .13481 OBJECTIV -.13481
+ PBOSSFO1 PASSNGRS 1. RPMILES 2.69845
+ PBOSSFO1 LFRPMASM -2.69845 DMBOSSFO 1.
+ PBOSSFO1 P1047X54 -1. LF1047S3 -1.
+ PBOSTPE1 REVENUES -.05629 OBJECTIV .05629
+ PBOSTPE1 PASSNGRS -1. DMBOSTPE 1.
+ PBOSTPE1 DMBOSSEA -1. DMSEATPE -1.
+ PBOSTPE2 REVENUES -.0528 OBJECTIV .0528
+ PBOSTPE2 PASSNGRS -1. DMBOSTPE 1.
+ PBOSTPE2 DMBOSYVR -1. DMTPEYVR -1.
+ PBOSTYO1 REVENUES -.04525 OBJECTIV .04525
+ PBOSTYO1 PASSNGRS -1. DMBOSTYO 1.
+ PBOSTYO1 DMBOSSEA -1. DMSEATYO -1.
+ PBOSTYO2 REVENUES -.04206 OBJECTIV .04206
+ PBOSTYO2 PASSNGRS -1. DMBOSTYO 1.
+ PBOSTYO2 DMBOSYVR -1. DMTYOYVR -1.
+ PBOSYUL0 REVENUES .02799 OBJECTIV -.02799
+ PBOSYUL0 PASSNGRS 1. RPMILES .25418
+ PBOSYUL0 LFRPMASM -.25418 DMBOSYUL 1.
+ PBOSYUL0 P1032X76 -1. LF1032S5 -1.
+ PBOSYUL1 REVENUES .02799 OBJECTIV -.02799
+ PBOSYUL1 PASSNGRS 1. RPMILES .25418
+ PBOSYUL1 LFRPMASM -.25418 DMBOSYUL 1.
+ PBOSYUL1 P1033X54 -1. LF1033S3 -1.
+ PBOSYUL2 REVENUES .02799 OBJECTIV -.02799
+ PBOSYUL2 PASSNGRS 1. RPMILES .25418
+ PBOSYUL2 LFRPMASM -.25418 DMBOSYUL 1.
+ PBOSYUL2 P1036X43 -1. LF1036S2 -1.
+ PBOSYUL3 REVENUES .02799 OBJECTIV -.02799
+ PBOSYUL3 PASSNGRS 1. RPMILES .25418
+ PBOSYUL3 LFRPMASM -.25418 DMBOSYUL 1.
+ PBOSYUL3 P1040X43 -1. LF1040S2 -1.
+ PBOSYUL4 REVENUES .02799 OBJECTIV -.02799
+ PBOSYUL4 PASSNGRS 1. RPMILES .25418
+ PBOSYUL4 LFRPMASM -.25418 DMBOSYUL 1.
+ PBOSYUL4 P1042X32 -1. LF1042S1 -1.
+ PBOSYVR0 REVENUES .12674 OBJECTIV -.12674
+ PBOSYVR0 PASSNGRS 1. RPMILES 2.66058
+ PBOSYVR0 LFRPMASM -2.66058 DMBOSYVR 1.
+ PBOSYVR0 LF1032S2 -1. LF1032S3 -1.
+ PBOSYVR0 LF1032S4 -1. LF1032S5 -1.
+ PBOSYVR1 REVENUES .12674 OBJECTIV -.12674
+ PBOSYVR1 PASSNGRS 1. RPMILES 2.5415
+ PBOSYVR1 LFRPMASM -2.5415 DMBOSYVR 1.
+ PBOSYVR1 LF1033S1 -1. LF1033S2 -1.
+ PBOSYVR1 LF1033S3 -1.
+ PBOSYVR2 REVENUES .12674 OBJECTIV -.12674
+ PBOSYVR2 PASSNGRS 1. RPMILES 2.54144
+ PBOSYVR2 LFRPMASM -2.54144 DMBOSYVR 1.
+ PBOSYVR2 LF1036S1 -1. LF1036S2 -1.
+ PBOSYWG0 REVENUES .07408 OBJECTIV -.07408
+ PBOSYWG0 PASSNGRS 1. RPMILES 1.50255
+ PBOSYWG0 LFRPMASM -1.50255 DMBOSYWG 1.
+ PBOSYWG0 LF1032S3 -1. LF1032S4 -1.
+ PBOSYWG0 LF1032S5 -1.
+ PBOSYWG1 REVENUES .07408 OBJECTIV -.07408
+ PBOSYWG1 PASSNGRS 1. RPMILES 1.38348
+ PBOSYWG1 LFRPMASM -1.38348 DMBOSYWG 1.
+ PBOSYWG1 LF1033S2 -1. LF1033S3 -1.
+ PBOSYWG7 REVENUES -.01789 OBJECTIV .01789
+ PBOSYWG7 PASSNGRS -1. DMBOSYWG 1.
+ PBOSYWG7 DMBOSYUL -1. DMYULYWG -1.
+ PBOSYYZ0 REVENUES .03418 OBJECTIV -.03418
+ PBOSYYZ0 PASSNGRS 1. RPMILES .56879
+ PBOSYYZ0 LFRPMASM -.56879 DMBOSYYZ 1.
+ PBOSYYZ0 P1032X75 -1. LF1032S4 -1.
+ PBOSYYZ0 LF1032S5 -1.
+ PBOSYYZ1 REVENUES .03418 OBJECTIV -.03418
+ PBOSYYZ1 PASSNGRS 1. RPMILES .56879
+ PBOSYYZ1 LFRPMASM -.56879 DMBOSYYZ 1.
+ PBOSYYZ1 P1040X42 -1. LF1040S1 -1.
+ PBOSYYZ1 LF1040S2 -1.
+ PBUROAK0 REVENUES .03032 OBJECTIV -.03032
+ PBUROAK0 PASSNGRS 1. RPMILES .32608
+ PBUROAK0 LFRPMASM -.32608 DMBUROAK 1.
+ PBUROAK0 LF1005S1 -1.
+ PBUROAK1 REVENUES .03032 OBJECTIV -.03032
+ PBUROAK1 PASSNGRS 1. RPMILES .32608
+ PBUROAK1 LFRPMASM -.32608 DMBUROAK 1.
+ PBUROAK1 LF1014S2 -1.
+ PBURSEA0 REVENUES .05527 OBJECTIV -.05527
+ PBURSEA0 PASSNGRS 1. RPMILES .9975
+ PBURSEA0 LFRPMASM -.9975 DMBURSEA 1.
+ PBURSEA0 LF1014S1 -1. LF1014S2 -1.
+ PBURSEA1 REVENUES .05527 OBJECTIV -.05527
+ PBURSEA1 PASSNGRS 1. RPMILES 1.00605
+ PBURSEA1 LFRPMASM -1.00605 DMBURSEA 1.
+ PBURSEA1 LF1016S1 -1. LF1016S2 -1.
+ PBURSFO0 REVENUES .03033 OBJECTIV -.03033
+ PBURSFO0 PASSNGRS 1. RPMILES .32657
+ PBURSFO0 LFRPMASM -.32657 DMBURSFO 1.
+ PBURSFO0 P1016X43 -1. LF1016S2 -1.
+ PHNLLAX0 REVENUES .12871 OBJECTIV -.12871
+ PHNLLAX0 PASSNGRS 1. RPMILES 2.55338
+ PHNLLAX0 LFRPMASM -2.55338 DMHNLLAX 1.
+ PHNLLAX0 P1003X32 -1. LF1003S1 -1.
+ PHNLLAX1 REVENUES .12871 OBJECTIV -.12871
+ PHNLLAX1 PASSNGRS 1. RPMILES 2.55338
+ PHNLLAX1 LFRPMASM -2.55338 DMHNLLAX 1.
+ PHNLLAX1 P1004X43 -1. LF1004S2 -1.
+ PHNLLAX2 REVENUES .12871 OBJECTIV -.12871
+ PHNLLAX2 PASSNGRS 1. RPMILES 2.55338
+ PHNLLAX2 LFRPMASM -2.55338 DMHNLLAX 1.
+ PHNLLAX2 P1105X43 -1. LF1105S2 -1.
+ PHNLLAX3 REVENUES .12871 OBJECTIV -.12871
+ PHNLLAX3 PASSNGRS 1. RPMILES 2.55338
+ PHNLLAX3 LFRPMASM -2.55338 DMHNLLAX 1.
+ PHNLLAX3 P1047X23 -1. LF1047S1 -1.
+ PHNLLON0 REVENUES .32504 OBJECTIV -.32504
+ PHNLLON0 PASSNGRS 1. RPMILES 7.41547
+ PHNLLON0 LFRPMASM -7.41547 DMHNLLON 1.
+ PHNLLON0 LF1022S1 -1. LF1022S2 -1.
+ PHNLLON6 REVENUES -.03143 OBJECTIV .03143
+ PHNLLON6 PASSNGRS -1. DMHNLLON 1.
+ PHNLLON6 DMHNLSEA -1. DMLONSEA -1.
+ PHNLPAR0 REVENUES .3343 OBJECTIV -.3343
+ PHNLPAR0 PASSNGRS 1. RPMILES 7.64184
+ PHNLPAR0 LFRPMASM -7.64184 DMHNLPAR 1.
+ PHNLPAR0 LF1022S1 -1. LF1022S2 -1.
+ PHNLPAR0 LF1022S3 -1.
+ PHNLPAR6 REVENUES -.03166 OBJECTIV .03166
+ PHNLPAR6 PASSNGRS -1. DMHNLPAR 1.
+ PHNLPAR6 DMHNLSEA -1. DMPARSEA -1.
+ PHNLSEA0 REVENUES .13391 OBJECTIV -.13391
+ PHNLSEA0 PASSNGRS 1. RPMILES 2.67711
+ PHNLSEA0 LFRPMASM -2.67711 DMHNLSEA 1.
+ PHNLSEA0 P1001X32 -1. LF1001S1 -1.
+ PHNLSEA1 REVENUES .13391 OBJECTIV -.13391
+ PHNLSEA1 PASSNGRS 1. RPMILES 2.67711
+ PHNLSEA1 LFRPMASM -2.67711 DMHNLSEA 1.
+ PHNLSEA1 P1002X43 -1. LF1002S2 -1.
+ PHNLSEA2 REVENUES .13391 OBJECTIV -.13391
+ PHNLSEA2 PASSNGRS 1. RPMILES 2.67711
+ PHNLSEA2 LFRPMASM -2.67711 DMHNLSEA 1.
+ PHNLSEA2 P1007X43 -1. LF1007S2 -1.
+ PHNLSFO0 REVENUES .12174 OBJECTIV -.12174
+ PHNLSFO0 PASSNGRS 1. RPMILES 2.8919
+ PHNLSFO0 LFRPMASM -2.8919 DMHNLSFO 1.
+ PHNLSFO0 LF1004S1 -1. LF1004S2 -1.
+ PHNLSFO1 REVENUES .12174 OBJECTIV -.12174
+ PHNLSFO1 PASSNGRS 1. RPMILES 2.8919
+ PHNLSFO1 LFRPMASM -2.8919 DMHNLSFO 1.
+ PHNLSFO1 LF1047S1 -1. LF1047S2 -1.
+ PHNLSFO7 REVENUES -.0377 OBJECTIV .0377
+ PHNLSFO7 PASSNGRS -1. DMHNLSFO 1.
+ PHNLSFO7 DMHNLLAX -1. DMLAXSFO -1.
+ PHNLYVR0 REVENUES .1351 OBJECTIV -.1351
+ PHNLYVR0 PASSNGRS 1. RPMILES 2.80333
+ PHNLYVR0 LFRPMASM -2.80333 DMHNLYVR 1.
+ PHNLYVR0 P1002X42 -1. LF1002S1 -1.
+ PHNLYVR0 LF1002S2 -1.
+ PHNLYVR1 REVENUES .1351 OBJECTIV -.1351
+ PHNLYVR1 PASSNGRS 1. RPMILES 2.70531
+ PHNLYVR1 LFRPMASM -2.70531 DMHNLYVR 1.
+ PHNLYVR1 P1022X23 -1. LF1022S1 -1.
+ PHNLYVR7 REVENUES -.01809 OBJECTIV .01809
+ PHNLYVR7 PASSNGRS -1. DMHNLYVR 1.
+ PHNLYVR7 DMHNLSEA -1. DMSEAYVR -1.
+ PLASSEA0 REVENUES .05205 OBJECTIV -.05205
+ PLASSEA0 PASSNGRS 1. RPMILES .86771
+ PLASSEA0 LFRPMASM -.86771 DMLASSEA 1.
+ PLASSEA0 P1019X43 -1. LF1019S2 -1.
+ PLASSEA1 REVENUES .05205 OBJECTIV -.05205
+ PLASSEA1 PASSNGRS 1. RPMILES .86771
+ PLASSEA1 LFRPMASM -.86771 DMLASSEA 1.
+ PLASSEA1 P1021X32 -1. LF1021S1 -1.
+ PLASYVR0 REVENUES .05774 OBJECTIV -.05774
+ PLASYVR0 PASSNGRS 1. RPMILES .99393
+ PLASYVR0 LFRPMASM -.99393 DMLASYVR 1.
+ PLASYVR0 LF1019S1 -1. LF1019S2 -1.
+ PLASYVR6 REVENUES -.01359 OBJECTIV .01359
+ PLASYVR6 PASSNGRS -1. DMLASYVR 1.
+ PLASYVR6 DMLASSEA -1. DMSEAYVR -1.
+ PLAXOAK0 REVENUES .03072 OBJECTIV -.03072
+ PLAXOAK0 PASSNGRS 1. RPMILES .33855
+ PLAXOAK0 LFRPMASM -.33855 DMLAXOAK 1.
+ PLAXOAK0 P1105X32 -1. LF1105S1 -1.
+ PLAXOAK1 REVENUES .03072 OBJECTIV -.03072
+ PLAXOAK1 PASSNGRS 1. RPMILES .33855
+ PLAXOAK1 LFRPMASM -.33855 DMLAXOAK 1.
+ PLAXOAK1 P1017X43 -1. LF1017S2 -1.
+ PLAXOAK2 REVENUES .03072 OBJECTIV -.03072
+ PLAXOAK2 PASSNGRS 1. RPMILES .33855
+ PLAXOAK2 LFRPMASM -.33855 DMLAXOAK 1.
+ PLAXOAK2 P1046X23 -1. LF1046S1 -1.
+ PLAXSEA0 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA0 PASSNGRS 1. RPMILES 1.01801
+ PLAXSEA0 LFRPMASM -1.01801 DMLAXSEA 1.
+ PLAXSEA0 P1008X53 -1. LF1008S2 -1.
+ PLAXSEA0 LF1008S3 -1.
+ PLAXSEA1 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA1 PASSNGRS 1. RPMILES .95575
+ PLAXSEA1 LFRPMASM -.95575 DMLAXSEA 1.
+ PLAXSEA1 P1009X43 -1. LF1009S2 -1.
+ PLAXSEA2 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA2 PASSNGRS 1. RPMILES 1.01801
+ PLAXSEA2 LFRPMASM -1.01801 DMLAXSEA 1.
+ PLAXSEA2 P1011X42 -1. LF1011S1 -1.
+ PLAXSEA2 LF1011S2 -1.
+ PLAXSEA3 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA3 PASSNGRS 1. RPMILES .95575
+ PLAXSEA3 LFRPMASM -.95575 DMLAXSEA 1.
+ PLAXSEA3 P1012X32 -1. LF1012S1 -1.
+ PLAXSEA4 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA4 PASSNGRS 1. RPMILES 1.00997
+ PLAXSEA4 LFRPMASM -1.00997 DMLAXSEA 1.
+ PLAXSEA4 P1017X42 -1. LF1017S1 -1.
+ PLAXSEA4 LF1017S2 -1.
+ PLAXSEA5 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA5 PASSNGRS 1. RPMILES .95575
+ PLAXSEA5 LFRPMASM -.95575 DMLAXSEA 1.
+ PLAXSEA5 P1026X23 -1. LF1026S1 -1.
+ PLAXSEA6 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA6 PASSNGRS 1. RPMILES .95575
+ PLAXSEA6 LFRPMASM -.95575 DMLAXSEA 1.
+ PLAXSEA6 P1027X23 -1. LF1027S1 -1.
+ PLAXSEA7 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA7 PASSNGRS 1. RPMILES 1.01801
+ PLAXSEA7 LFRPMASM -1.01801 DMLAXSEA 1.
+ PLAXSEA7 P1029X24 -1. LF1029S1 -1.
+ PLAXSEA7 LF1029S2 -1.
+ PLAXSEA8 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA8 PASSNGRS 1. RPMILES 1.01801
+ PLAXSEA8 LFRPMASM -1.01801 DMLAXSEA 1.
+ PLAXSEA8 P1030X24 -1. LF1030S1 -1.
+ PLAXSEA8 LF1030S2 -1.
+ PLAXSEA9 REVENUES .05607 OBJECTIV -.05607
+ PLAXSEA9 PASSNGRS 1. RPMILES .95575
+ PLAXSEA9 LFRPMASM -.95575 DMLAXSEA 1.
+ PLAXSEA9 P1050X32 -1. LF1050S1 -1.
+ PLAXSFO0 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO0 PASSNGRS 1. RPMILES .33852
+ PLAXSFO0 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO0 P1004X32 -1. LF1004S1 -1.
+ PLAXSFO1 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO1 PASSNGRS 1. RPMILES .33852
+ PLAXSFO1 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO1 P1008X54 -1. LF1008S3 -1.
+ PLAXSFO2 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO2 PASSNGRS 1. RPMILES .33852
+ PLAXSFO2 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO2 P1011X43 -1. LF1011S2 -1.
+ PLAXSFO3 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO3 PASSNGRS 1. RPMILES .33852
+ PLAXSFO3 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO3 P1029X23 -1. LF1029S1 -1.
+ PLAXSFO4 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO4 PASSNGRS 1. RPMILES .33852
+ PLAXSFO4 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO4 P1030X23 -1. LF1030S1 -1.
+ PLAXSFO5 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO5 PASSNGRS 1. RPMILES .33852
+ PLAXSFO5 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO5 P1047X34 -1. LF1047S2 -1.
+ PLAXSFO6 REVENUES .03072 OBJECTIV -.03072
+ PLAXSFO6 PASSNGRS 1. RPMILES .33852
+ PLAXSFO6 LFRPMASM -.33852 DMLAXSFO 1.
+ PLAXSFO6 P1051X23 -1. LF1051S1 -1.
+ PLAXTPE0 REVENUES .30609 OBJECTIV -.30609
+ PLAXTPE0 PASSNGRS 1. RPMILES 7.05137
+ PLAXTPE0 LFRPMASM -7.05137 DMLAXTPE 1.
+ PLAXTPE0 P1027X25 -1. LF1027S1 -1.
+ PLAXTPE0 LF1027S2 -1. LF1027S3 -1.
+ PLAXTPE1 REVENUES .30609 OBJECTIV -.30609
+ PLAXTPE1 PASSNGRS 1. RPMILES 7.14547
+ PLAXTPE1 LFRPMASM -7.14547 DMLAXTPE 1.
+ PLAXTPE1 P1029X27 -1. LF1029S1 -1.
+ PLAXTPE1 LF1029S2 -1. LF1029S3 -1.
+ PLAXTPE1 LF1029S4 -1. LF1029S5 -1.
+ PLAXTPE2 REVENUES .30609 OBJECTIV -.30609
+ PLAXTPE2 PASSNGRS 1. RPMILES 7.11364
+ PLAXTPE2 LFRPMASM -7.11364 DMLAXTPE 1.
+ PLAXTPE2 P1030X26 -1. LF1030S1 -1.
+ PLAXTPE2 LF1030S2 -1. LF1030S3 -1.
+ PLAXTPE2 LF1030S4 -1.
+ PLAXTPE8 REVENUES -.02571 OBJECTIV .02571
+ PLAXTPE8 PASSNGRS -1. DMLAXTPE 1.
+ PLAXTPE8 DMLAXSEA -1. DMSEATPE -1.
+ PLAXTYO0 REVENUES .2516 OBJECTIV -.2516
+ PLAXTYO0 PASSNGRS 1. RPMILES 5.74891
+ PLAXTYO0 LFRPMASM -5.74891 DMLAXTYO 1.
+ PLAXTYO0 LF1027S1 -1. LF1027S2 -1.
+ PLAXTYO1 REVENUES .2516 OBJECTIV -.2516
+ PLAXTYO1 PASSNGRS 1. RPMILES 5.843
+ PLAXTYO1 LFRPMASM -5.843 DMLAXTYO 1.
+ PLAXTYO1 LF1029S1 -1. LF1029S2 -1.
+ PLAXTYO1 LF1029S3 -1. LF1029S4 -1.
+ PLAXTYO2 REVENUES .2516 OBJECTIV -.2516
+ PLAXTYO2 PASSNGRS 1. RPMILES 5.81118
+ PLAXTYO2 LFRPMASM -5.81118 DMLAXTYO 1.
+ PLAXTYO2 LF1030S1 -1. LF1030S2 -1.
+ PLAXTYO2 LF1030S3 -1.
+ PLAXTYO8 REVENUES -.0273 OBJECTIV .0273
+ PLAXTYO8 PASSNGRS -1. DMLAXTYO 1.
+ PLAXTYO8 DMLAXSEA -1. DMSEATYO -1.
+ PLAXYVR0 REVENUES .06181 OBJECTIV -.06181
+ PLAXYVR0 PASSNGRS 1. RPMILES 1.14422
+ PLAXYVR0 LFRPMASM -1.14422 DMLAXYVR 1.
+ PLAXYVR0 P1008X52 -1. LF1008S1 -1.
+ PLAXYVR0 LF1008S2 -1. LF1008S3 -1.
+ PLAXYVR1 REVENUES .06181 OBJECTIV -.06181
+ PLAXYVR1 PASSNGRS 1. RPMILES 1.08196
+ PLAXYVR1 LFRPMASM -1.08196 DMLAXYVR 1.
+ PLAXYVR1 P1009X42 -1. LF1009S1 -1.
+ PLAXYVR1 LF1009S2 -1.
+ PLAXYVR2 REVENUES .06181 OBJECTIV -.06181
+ PLAXYVR2 PASSNGRS 1. RPMILES 1.14422
+ PLAXYVR2 LFRPMASM -1.14422 DMLAXYVR 1.
+ PLAXYVR2 P1029X25 -1. LF1029S1 -1.
+ PLAXYVR2 LF1029S2 -1. LF1029S3 -1.
+ PLONPAR0 REVENUES .02622 OBJECTIV -.02622
+ PLONPAR0 PASSNGRS 1. RPMILES .22636
+ PLONPAR0 LFRPMASM -.22636 DMLONPAR 1.
+ PLONPAR0 LF1022S3 -1.
+ PLONPAR1 REVENUES .02622 OBJECTIV -.02622
+ PLONPAR1 PASSNGRS 1. RPMILES .22636
+ PLONPAR1 LFRPMASM -.22636 DMLONPAR 1.
+ PLONPAR1 LF1023S3 -1.
+ PLONPAR2 REVENUES .02622 OBJECTIV -.02622
+ PLONPAR2 PASSNGRS 1. RPMILES .22636
+ PLONPAR2 LFRPMASM -.22636 DMLONPAR 1.
+ PLONPAR2 LF1026S3 -1.
+ PLONSEA0 REVENUES .22255 OBJECTIV -.22255
+ PLONSEA0 PASSNGRS 1. RPMILES 4.78646
+ PLONSEA0 LFRPMASM -4.78646 DMLONSEA 1.
+ PLONSEA0 LF1023S2 -1.
+ PLONSEA1 REVENUES .22255 OBJECTIV -.22255
+ PLONSEA1 PASSNGRS 1. RPMILES 4.78646
+ PLONSEA1 LFRPMASM -4.78646 DMLONSEA 1.
+ PLONSEA1 LF1026S2 -1.
+ PLONYVR0 REVENUES .21935 OBJECTIV -.21935
+ PLONYVR0 PASSNGRS 1. RPMILES 4.71017
+ PLONYVR0 LFRPMASM -4.71017 DMLONYVR 1.
+ PLONYVR0 LF1022S2 -1.
+ PLONYVR1 REVENUES .21935 OBJECTIV -.21935
+ PLONYVR1 PASSNGRS 1. RPMILES 4.91267
+ PLONYVR1 LFRPMASM -4.91267 DMLONYVR 1.
+ PLONYVR1 LF1023S1 -1. LF1023S2 -1.
+ PLONYVR7 REVENUES -.02248 OBJECTIV .02248
+ PLONYVR7 PASSNGRS -1. DMLONYVR 1.
+ PLONYVR7 DMLONSEA -1. DMSEAYVR -1.
+ POAKONT0 REVENUES .03148 OBJECTIV -.03148
+ POAKONT0 PASSNGRS 1. RPMILES .36196
+ POAKONT0 LFRPMASM -.36196 DMOAKONT 1.
+ POAKONT0 LF1006S1 -1.
+ POAKONT1 REVENUES .03148 OBJECTIV -.03148
+ POAKONT1 PASSNGRS 1. RPMILES .36196
+ POAKONT1 LFRPMASM -.36196 DMOAKONT 1.
+ POAKONT1 LF1013S2 -1.
+ POAKSEA0 REVENUES .04311 OBJECTIV -.04311
+ POAKSEA0 PASSNGRS 1. RPMILES .67142
+ POAKSEA0 LFRPMASM -.67142 DMOAKSEA 1.
+ POAKSEA0 P1013X32 -1. LF1013S1 -1.
+ POAKSEA1 REVENUES .04311 OBJECTIV -.04311
+ POAKSEA1 PASSNGRS 1. RPMILES .67142
+ POAKSEA1 LFRPMASM -.67142 DMOAKSEA 1.
+ POAKSEA1 P1014X32 -1. LF1014S1 -1.
+ POAKSEA2 REVENUES .04311 OBJECTIV -.04311
+ POAKSEA2 PASSNGRS 1. RPMILES .67142
+ POAKSEA2 LFRPMASM -.67142 DMOAKSEA 1.
+ POAKSEA2 P1017X32 -1. LF1017S1 -1.
+ PONTSFO0 REVENUES .03152 OBJECTIV -.03152
+ PONTSFO0 PASSNGRS 1. RPMILES .36328
+ PONTSFO0 LFRPMASM -.36328 DMONTSFO 1.
+ PONTSFO0 P1015X43 -1. LF1015S2 -1.
+ PONTSEA0 REVENUES .05614 OBJECTIV -.05614
+ PONTSEA0 PASSNGRS 1. RPMILES 1.03338
+ PONTSEA0 LFRPMASM -1.03338 DMONTSEA 1.
+ PONTSEA0 P1013X42 -1. LF1013S1 -1.
+ PONTSEA0 LF1013S2 -1.
+ PONTSEA1 REVENUES .05614 OBJECTIV -.05614
+ PONTSEA1 PASSNGRS 1. RPMILES 1.04277
+ PONTSEA1 LFRPMASM -1.04277 DMONTSEA 1.
+ PONTSEA1 P1015X42 -1. LF1015S1 -1.
+ PONTSEA1 LF1015S2 -1.
+ PONTSEA2 REVENUES .05614 OBJECTIV -.05614
+ PONTSEA2 PASSNGRS 1. RPMILES 1.00139
+ PONTSEA2 LFRPMASM -1.00139 DMONTSEA 1.
+ PONTSEA2 P1050X42 -1. LF1050S1 -1.
+ PONTSEA2 LF1050S2 -1.
+ PPARSEA0 REVENUES .23205 OBJECTIV -.23205
+ PPARSEA0 PASSNGRS 1. RPMILES 5.01282
+ PPARSEA0 LFRPMASM -5.01282 DMPARSEA 1.
+ PPARSEA0 LF1023S2 -1. LF1023S3 -1.
+ PPARSEA1 REVENUES .23205 OBJECTIV -.23205
+ PPARSEA1 PASSNGRS 1. RPMILES 5.01282
+ PPARSEA1 LFRPMASM -5.01282 DMPARSEA 1.
+ PPARSEA1 LF1026S2 -1. LF1026S3 -1.
+ PPARYVR0 REVENUES .22885 OBJECTIV -.22885
+ PPARYVR0 PASSNGRS 1. RPMILES 4.93653
+ PPARYVR0 LFRPMASM -4.93653 DMPARYVR 1.
+ PPARYVR0 LF1022S2 -1. LF1022S3 -1.
+ PPARYVR1 REVENUES .22885 OBJECTIV -.22885
+ PPARYVR1 PASSNGRS 1. RPMILES 5.13904
+ PPARYVR1 LFRPMASM -5.13904 DMPARYVR 1.
+ PPARYVR1 LF1023S1 -1. LF1023S2 -1.
+ PPARYVR1 LF1023S3 -1.
+ PPARYVR7 REVENUES -.02247 OBJECTIV .02247
+ PPARYVR7 PASSNGRS -1. DMPARYVR 1.
+ PPARYVR7 DMPARSEA -1. DMSEAYVR -1.
+ PRNOSEA0 REVENUES .0382 OBJECTIV -.0382
+ PRNOSEA0 PASSNGRS 1. RPMILES .56374
+ PRNOSEA0 LFRPMASM -.56374 DMRNOSEA 1.
+ PRNOSEA0 P1018X43 -1. LF1018S2 -1.
+ PRNOSEA1 REVENUES .0382 OBJECTIV -.0382
+ PRNOSEA1 PASSNGRS 1. RPMILES .56374
+ PRNOSEA1 LFRPMASM -.56374 DMRNOSEA 1.
+ PRNOSEA1 P1020X32 -1. LF1020S1 -1.
+ PRNOYVR0 REVENUES .04394 OBJECTIV -.04394
+ PRNOYVR0 PASSNGRS 1. RPMILES .68996
+ PRNOYVR0 LFRPMASM -.68996 DMRNOYVR 1.
+ PRNOYVR0 LF1018S1 -1. LF1018S2 -1.
+ PSEASFO0 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO0 PASSNGRS 1. RPMILES .67949
+ PSEASFO0 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO0 P1008X34 -1. LF1008S2 -1.
+ PSEASFO1 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO1 PASSNGRS 1. RPMILES .67949
+ PSEASFO1 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO1 P1011X23 -1. LF1011S1 -1.
+ PSEASFO2 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO2 PASSNGRS 1. RPMILES .67949
+ PSEASFO2 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO2 P1015X23 -1. LF1015S1 -1.
+ PSEASFO3 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO3 PASSNGRS 1. RPMILES .67949
+ PSEASFO3 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO3 P1016X23 -1. LF1016S1 -1.
+ PSEASFO4 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO4 PASSNGRS 1. RPMILES .67949
+ PSEASFO4 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO4 P1028X32 -1. LF1028S1 -1.
+ PSEASFO5 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO5 PASSNGRS 1. RPMILES .67949
+ PSEASFO5 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO5 P1029X43 -1. LF1029S2 -1.
+ PSEASFO6 REVENUES .04347 OBJECTIV -.04347
+ PSEASFO6 PASSNGRS 1. RPMILES .67949
+ PSEASFO6 LFRPMASM -.67949 DMSEASFO 1.
+ PSEASFO6 P1030X43 -1. LF1030S2 -1.
+ PSEATPE0 REVENUES .27573 OBJECTIV -.27573
+ PSEATPE0 PASSNGRS 1. RPMILES 6.09563
+ PSEATPE0 LFRPMASM -6.09563 DMSEATPE 1.
+ PSEATPE0 LF1027S2 -1. LF1027S3 -1.
+ PSEATPE1 REVENUES .27573 OBJECTIV -.27573
+ PSEATPE1 PASSNGRS 1. RPMILES 6.09563
+ PSEATPE1 LFRPMASM -6.09563 DMSEATPE 1.
+ PSEATPE1 LF1028S2 -1. LF1028S3 -1.
+ PSEATPE2 REVENUES .27573 OBJECTIV -.27573
+ PSEATPE2 PASSNGRS 1. RPMILES 6.12746
+ PSEATPE2 LFRPMASM -6.12746 DMSEATPE 1.
+ PSEATPE2 LF1029S3 -1. LF1029S4 -1.
+ PSEATPE2 LF1029S5 -1.
+ PSEATPE3 REVENUES .27573 OBJECTIV -.27573
+ PSEATPE3 PASSNGRS 1. RPMILES 6.09563
+ PSEATPE3 LFRPMASM -6.09563 DMSEATPE 1.
+ PSEATPE3 LF1030S3 -1. LF1030S4 -1.
+ PSEATYO0 REVENUES .22283 OBJECTIV -.22283
+ PSEATYO0 PASSNGRS 1. RPMILES 4.79317
+ PSEATYO0 LFRPMASM -4.79317 DMSEATYO 1.
+ PSEATYO0 LF1027S2 -1.
+ PSEATYO1 REVENUES .22283 OBJECTIV -.22283
+ PSEATYO1 PASSNGRS 1. RPMILES 4.79317
+ PSEATYO1 LFRPMASM -4.79317 DMSEATYO 1.
+ PSEATYO1 LF1028S2 -1.
+ PSEATYO2 REVENUES .22283 OBJECTIV -.22283
+ PSEATYO2 PASSNGRS 1. RPMILES 4.825
+ PSEATYO2 LFRPMASM -4.825 DMSEATYO 1.
+ PSEATYO2 LF1029S3 -1. LF1029S4 -1.
+ PSEATYO3 REVENUES .22283 OBJECTIV -.22283
+ PSEATYO3 PASSNGRS 1. RPMILES 4.79317
+ PSEATYO3 LFRPMASM -4.79317 DMSEATYO 1.
+ PSEATYO3 LF1030S3 -1.
+ PSEAYVR0 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR0 PASSNGRS 1. RPMILES .12622
+ PSEAYVR0 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR0 P1002X32 -1. LF1002S1 -1.
+ PSEAYVR1 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR1 PASSNGRS 1. RPMILES .12622
+ PSEAYVR1 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR1 P1008X32 -1. LF1008S1 -1.
+ PSEAYVR2 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR2 PASSNGRS 1. RPMILES .12622
+ PSEAYVR2 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR2 P1009X32 -1. LF1009S1 -1.
+ PSEAYVR3 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR3 PASSNGRS 1. RPMILES .12622
+ PSEAYVR3 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR3 P1010X32 -1. LF1010S1 -1.
+ PSEAYVR4 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR4 PASSNGRS 1. RPMILES .12622
+ PSEAYVR4 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR4 P1018X32 -1. LF1018S1 -1.
+ PSEAYVR5 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR5 PASSNGRS 1. RPMILES .12622
+ PSEAYVR5 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR5 P1019X32 -1. LF1019S1 -1.
+ PSEAYVR6 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR6 PASSNGRS 1. RPMILES .12622
+ PSEAYVR6 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR6 P1023X32 -1. LF1023S1 -1.
+ PSEAYVR7 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR7 PASSNGRS 1. RPMILES .12622
+ PSEAYVR7 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR7 P1029X45 -1. LF1029S3 -1.
+ PSEAYVR8 REVENUES .01928 OBJECTIV -.01928
+ PSEAYVR8 PASSNGRS 1. RPMILES .12622
+ PSEAYVR8 LFRPMASM -.12622 DMSEAYVR 1.
+ PSEAYVR8 P1032X23 -1. LF1032S1 -1.
+ PSFOTPE0 REVENUES .29218 OBJECTIV -.29218
+ PSFOTPE0 PASSNGRS 1. RPMILES 6.77512
+ PSFOTPE0 LFRPMASM -6.77512 DMSFOTPE 1.
+ PSFOTPE0 LF1028S1 -1. LF1028S2 -1.
+ PSFOTPE0 LF1028S3 -1.
+ PSFOTPE1 REVENUES .29218 OBJECTIV -.29218
+ PSFOTPE1 PASSNGRS 1. RPMILES 6.80694
+ PSFOTPE1 LFRPMASM -6.80694 DMSFOTPE 1.
+ PSFOTPE1 LF1029S2 -1. LF1029S3 -1.
+ PSFOTPE1 LF1029S4 -1. LF1029S5 -1.
+ PSFOTPE2 REVENUES .29218 OBJECTIV -.29218
+ PSFOTPE2 PASSNGRS 1. RPMILES 6.77512
+ PSFOTPE2 LFRPMASM -6.77512 DMSFOTPE 1.
+ PSFOTPE2 LF1030S2 -1. LF1030S3 -1.
+ PSFOTPE2 LF1030S4 -1.
+ PSFOTPE8 REVENUES -.02702 OBJECTIV .02702
+ PSFOTPE8 PASSNGRS -1. DMSFOTPE 1.
+ PSFOTPE8 DMSEASFO -1. DMSEATPE -1.
+ PSFOTYO0 REVENUES .2378 OBJECTIV -.2378
+ PSFOTYO0 PASSNGRS 1. RPMILES 5.47265
+ PSFOTYO0 LFRPMASM -5.47265 DMSFOTYO 1.
+ PSFOTYO0 LF1028S1 -1. LF1028S2 -1.
+ PSFOTYO1 REVENUES .2378 OBJECTIV -.2378
+ PSFOTYO1 PASSNGRS 1. RPMILES 5.50448
+ PSFOTYO1 LFRPMASM -5.50448 DMSFOTYO 1.
+ PSFOTYO1 LF1029S2 -1. LF1029S3 -1.
+ PSFOTYO1 LF1029S4 -1.
+ PSFOTYO2 REVENUES .2378 OBJECTIV -.2378
+ PSFOTYO2 PASSNGRS 1. RPMILES 5.47265
+ PSFOTYO2 LFRPMASM -5.47265 DMSFOTYO 1.
+ PSFOTYO2 LF1030S2 -1. LF1030S3 -1.
+ PSFOTYO8 REVENUES -.0285 OBJECTIV .0285
+ PSFOTYO8 PASSNGRS -1. DMSFOTYO 1.
+ PSFOTYO8 DMSEASFO -1. DMSEATYO -1.
+ PSFOYVR0 REVENUES .04898 OBJECTIV -.04898
+ PSFOYVR0 PASSNGRS 1. RPMILES .8057
+ PSFOYVR0 LFRPMASM -.8057 DMSFOYVR 1.
+ PSFOYVR0 P1008X42 -1. LF1008S1 -1.
+ PSFOYVR0 LF1008S2 -1.
+ PSFOYVR1 REVENUES .04898 OBJECTIV -.04898
+ PSFOYVR1 PASSNGRS 1. RPMILES .8057
+ PSFOYVR1 LFRPMASM -.8057 DMSFOYVR 1.
+ PSFOYVR1 P1029X35 -1. LF1029S2 -1.
+ PSFOYVR1 LF1029S3 -1.
+ PTPETYO0 REVENUES .07188 OBJECTIV -.07188
+ PTPETYO0 PASSNGRS 1. RPMILES 1.30247
+ PTPETYO0 LFRPMASM -1.30247 DMTPETYO 1.
+ PTPETYO0 LF1027S3 -1.
+ PTPETYO1 REVENUES .07188 OBJECTIV -.07188
+ PTPETYO1 PASSNGRS 1. RPMILES 1.30247
+ PTPETYO1 LFRPMASM -1.30247 DMTPETYO 1.
+ PTPETYO1 LF1028S3 -1.
+ PTPETYO2 REVENUES .07188 OBJECTIV -.07188
+ PTPETYO2 PASSNGRS 1. RPMILES 1.30247
+ PTPETYO2 LFRPMASM -1.30247 DMTPETYO 1.
+ PTPETYO2 LF1029S5 -1.
+ PTPETYO3 REVENUES .07188 OBJECTIV -.07188
+ PTPETYO3 PASSNGRS 1. RPMILES 1.30247
+ PTPETYO3 LFRPMASM -1.30247 DMTPETYO 1.
+ PTPETYO3 LF1030S4 -1.
+ PTPEYVR0 REVENUES .27146 OBJECTIV -.27146
+ PTPEYVR0 PASSNGRS 1. RPMILES 6.00125
+ PTPEYVR0 LFRPMASM -6.00125 DMTPEYVR 1.
+ PTPEYVR0 LF1029S4 -1. LF1029S5 -1.
+ PTYOYVR0 REVENUES .21887 OBJECTIV -.21887
+ PTYOYVR0 PASSNGRS 1. RPMILES 4.69878
+ PTYOYVR0 LFRPMASM -4.69878 DMTYOYVR 1.
+ PTYOYVR0 LF1029S4 -1.
+ PYULYVR0 REVENUES .11677 OBJECTIV -.11677
+ PYULYVR0 PASSNGRS 1. RPMILES 2.4064
+ PYULYVR0 LFRPMASM -2.4064 DMYULYVR 1.
+ PYULYVR0 P1032X63 -1. LF1032S2 -1.
+ PYULYVR0 LF1032S3 -1. LF1032S4 -1.
+ PYULYVR1 REVENUES .11677 OBJECTIV -.11677
+ PYULYVR1 PASSNGRS 1. RPMILES 2.28733
+ PYULYVR1 LFRPMASM -2.28733 DMYULYVR 1.
+ PYULYVR1 P1033X42 -1. LF1033S1 -1.
+ PYULYVR1 LF1033S2 -1.
+ PYULYVR2 REVENUES .11677 OBJECTIV -.11677
+ PYULYVR2 PASSNGRS 1. RPMILES 2.39258
+ PYULYVR2 LFRPMASM -2.39258 DMYULYVR 1.
+ PYULYVR2 P1034X42 -1. LF1034S1 -1.
+ PYULYVR2 LF1034S2 -1.
+ PYULYVR3 REVENUES .11677 OBJECTIV -.11677
+ PYULYVR3 PASSNGRS 1. RPMILES 2.28726
+ PYULYVR3 LFRPMASM -2.28726 DMYULYVR 1.
+ PYULYVR3 P1036X32 -1. LF1036S1 -1.
+ PYULYWG0 REVENUES .06398 OBJECTIV -.06398
+ PYULYWG0 PASSNGRS 1. RPMILES 1.24837
+ PYULYWG0 LFRPMASM -1.24837 DMYULYWG 1.
+ PYULYWG0 P1032X64 -1. LF1032S3 -1.
+ PYULYWG0 LF1032S4 -1.
+ PYULYWG1 REVENUES .06398 OBJECTIV -.06398
+ PYULYWG1 PASSNGRS 1. RPMILES 1.1293
+ PYULYWG1 LFRPMASM -1.1293 DMYULYWG 1.
+ PYULYWG1 P1033X43 -1. LF1033S2 -1.
+ PYULYWG2 REVENUES .06398 OBJECTIV -.06398
+ PYULYWG2 PASSNGRS 1. RPMILES 1.24837
+ PYULYWG2 LFRPMASM -1.24837 DMYULYWG 1.
+ PYULYWG2 P1037X42 -1. LF1037S1 -1.
+ PYULYWG2 LF1037S2 -1.
+ PYULYWG3 REVENUES .06398 OBJECTIV -.06398
+ PYULYWG3 PASSNGRS 1. RPMILES 1.1293
+ PYULYWG3 LFRPMASM -1.1293 DMYULYWG 1.
+ PYULYWG3 P1039X32 -1. LF1039S1 -1.
+ PYULYYZ0 REVENUES .02995 OBJECTIV -.02995
+ PYULYYZ0 PASSNGRS 1. RPMILES .31461
+ PYULYYZ0 LFRPMASM -.31461 DMYULYYZ 1.
+ PYULYYZ0 P1032X65 -1. LF1032S4 -1.
+ PYULYYZ1 REVENUES .02995 OBJECTIV -.02995
+ PYULYYZ1 PASSNGRS 1. RPMILES .31461
+ PYULYYZ1 LFRPMASM -.31461 DMYULYYZ 1.
+ PYULYYZ1 P1034X43 -1. LF1034S2 -1.
+ PYULYYZ2 REVENUES .02995 OBJECTIV -.02995
+ PYULYYZ2 PASSNGRS 1. RPMILES .31461
+ PYULYYZ2 LFRPMASM -.31461 DMYULYYZ 1.
+ PYULYYZ2 P1037X43 -1. LF1037S2 -1.
+ PYULYYZ3 REVENUES .02995 OBJECTIV -.02995
+ PYULYYZ3 PASSNGRS 1. RPMILES .31461
+ PYULYYZ3 LFRPMASM -.31461 DMYULYYZ 1.
+ PYULYYZ3 P1040X32 -1. LF1040S1 -1.
+ PYULYYZ4 REVENUES .02995 OBJECTIV -.02995
+ PYULYYZ4 PASSNGRS 1. RPMILES .31461
+ PYULYYZ4 LFRPMASM -.31461 DMYULYYZ 1.
+ PYULYYZ4 P1041X32 -1. LF1041S1 -1.
+ PYVRYWG0 REVENUES .06529 OBJECTIV -.06529
+ PYVRYWG0 PASSNGRS 1. RPMILES 1.15803
+ PYVRYWG0 LFRPMASM -1.15803 DMYVRYWG 1.
+ PYVRYWG0 P1032X34 -1. LF1032S2 -1.
+ PYVRYWG1 REVENUES .06529 OBJECTIV -.06529
+ PYVRYWG1 PASSNGRS 1. RPMILES 1.15803
+ PYVRYWG1 LFRPMASM -1.15803 DMYVRYWG 1.
+ PYVRYWG1 P1033X23 -1. LF1033S1 -1.
+ PYVRYWG2 REVENUES .06529 OBJECTIV -.06529
+ PYVRYWG2 PASSNGRS 1. RPMILES 1.15803
+ PYVRYWG2 LFRPMASM -1.15803 DMYVRYWG 1.
+ PYVRYWG2 P1035X23 -1. LF1035S1 -1.
+ PYVRYYZ0 REVENUES .10723 OBJECTIV -.10723
+ PYVRYYZ0 PASSNGRS 1. RPMILES 2.09179
+ PYVRYYZ0 LFRPMASM -2.09179 DMYVRYYZ 1.
+ PYVRYYZ0 P1032X35 -1. LF1032S2 -1.
+ PYVRYYZ0 LF1032S3 -1.
+ PYVRYYZ1 REVENUES .10723 OBJECTIV -.10723
+ PYVRYYZ1 PASSNGRS 1. RPMILES 2.07796
+ PYVRYYZ1 LFRPMASM -2.07796 DMYVRYYZ 1.
+ PYVRYYZ1 P1034X23 -1. LF1034S1 -1.
+ PYVRYYZ2 REVENUES .10723 OBJECTIV -.10723
+ PYVRYYZ2 PASSNGRS 1. RPMILES 2.09179
+ PYVRYYZ2 LFRPMASM -2.09179 DMYVRYYZ 1.
+ PYVRYYZ2 P1035X24 -1. LF1035S1 -1.
+ PYVRYYZ2 LF1035S2 -1.
+ PYWGYYZ0 REVENUES .05507 OBJECTIV -.05507
+ PYWGYYZ0 PASSNGRS 1. RPMILES .93376
+ PYWGYYZ0 LFRPMASM -.93376 DMYWGYYZ 1.
+ PYWGYYZ0 P1032X45 -1. LF1032S3 -1.
+ PYWGYYZ1 REVENUES .05507 OBJECTIV -.05507
+ PYWGYYZ1 PASSNGRS 1. RPMILES .93376
+ PYWGYYZ1 LFRPMASM -.93376 DMYWGYYZ 1.
+ PYWGYYZ1 P1035X34 -1. LF1035S2 -1.
+ PYWGYYZ2 REVENUES .05507 OBJECTIV -.05507
+ PYWGYYZ2 PASSNGRS 1. RPMILES .93376
+ PYWGYYZ2 LFRPMASM -.93376 DMYWGYYZ 1.
+ PYWGYYZ2 P1037X23 -1. LF1037S1 -1.
+ PYWGYYZ3 REVENUES .05507 OBJECTIV -.05507
+ PYWGYYZ3 PASSNGRS 1. RPMILES .93376
+ PYWGYYZ3 LFRPMASM -.93376 DMYWGYYZ 1.
+ PYWGYYZ3 P1038X23 -1. LF1038S1 -1.
+ PBOSOAK0 REVENUES .13432 OBJECTIV -.13432
+ PBOSOAK0 PASSNGRS 1. RPMILES 2.68687
+ PBOSOAK0 LFRPMASM -2.68687 DMBOSOAK 1.
+ PBOSOAK0 LF1046S2 -1.
+ PBOSOAK6 REVENUES -.01157 OBJECTIV .01157
+ PBOSOAK6 PASSNGRS -1. DMBOSOAK 1.
+ PBOSOAK6 DMBOSSFO -1. DMSFOOAK -1.
+ PBOSBUR1 REVENUES -.03469 OBJECTIV .03469
+ PBOSBUR1 PASSNGRS -1. DMBOSBUR 1.
+ PBOSBUR1 DMBOSSFO -1. DMBURSFO -1.
+ PBOSBUR2 REVENUES -.04664 OBJECTIV .04664
+ PBOSBUR2 PASSNGRS -2. DMBOSBUR 1.
+ PBOSBUR2 DMBOSSFO -1. DMLAXSFO -1.
+ PBOSBUR2 DMLAXBUR -1.
+ PBOSONT1 REVENUES -.03725 OBJECTIV .03725
+ PBOSONT1 PASSNGRS -1. DMBOSONT 1.
+ PBOSONT1 DMBOSSFO -1. DMONTSFO -1.
+ PBOSONT2 REVENUES -.04996 OBJECTIV .04996
+ PBOSONT2 PASSNGRS -2. DMBOSONT 1.
+ PBOSONT2 DMBOSSFO -1. DMLAXSFO -1.
+ PBOSONT2 DMLAXONT -1.
+ PBURYVR1 REVENUES -.01353 OBJECTIV .01353
+ PBURYVR1 PASSNGRS -1. DMBURYVR 1.
+ PBURYVR1 DMBURSEA -1. DMSEAYVR -1.
+ PBURTYO1 REVENUES -.02686 OBJECTIV .02686
+ PBURTYO1 PASSNGRS -1. DMBURTYO 1.
+ PBURTYO1 DMBURSEA -1. DMSEATYO -1.
+ PBURTPE1 REVENUES -.02529 OBJECTIV .02529
+ PBURTPE1 PASSNGRS -1. DMBURTPE 1.
+ PBURTPE1 DMBURSEA -1. DMSEATPE -1.
+ PBURHNL0 REVENUES .12896 OBJECTIV -.12896
+ PBURHNL0 PASSNGRS 1. RPMILES 2.55929
+ PBURHNL0 LFRPMASM -2.55929 DMBURHNL 1.
+ PBURHNL0 LF1005S2 -1.
+ PBURHNL6 REVENUES -.01132 OBJECTIV .01132
+ PBURHNL6 PASSNGRS -1. DMBURHNL 1.
+ PBURHNL6 DMLAXBUR -1. DMHNLLAX -1.
+ PHNLOAK0 REVENUES .12225 OBJECTIV -.12225
+ PHNLOAK0 PASSNGRS 1. RPMILES 2.88537
+ PHNLOAK0 LFRPMASM -2.88537 DMHNLOAK 1.
+ PHNLOAK0 LF1005S1 -1. LF1005S2 -1.
+ PHNLOAK1 REVENUES .12225 OBJECTIV -.12225
+ PHNLOAK1 PASSNGRS 1. RPMILES 2.89192
+ PHNLOAK1 LFRPMASM -2.89192 DMHNLOAK 1.
+ PHNLOAK1 LF1105S1 -1. LF1105S2 -1.
+ PHNLOAK2 REVENUES .12225 OBJECTIV -.12225
+ PHNLOAK2 PASSNGRS 1. RPMILES 2.96093
+ PHNLOAK2 LFRPMASM -2.96093 DMHNLOAK 1.
+ PHNLOAK2 LF1006S1 -1. LF1006S2 -1.
+ PHNLOAK8 REVENUES -.03719 OBJECTIV .03719
+ PHNLOAK8 PASSNGRS -1. DMHNLOAK 1.
+ PHNLOAK8 DMHNLLAX -1. DMLAXOAK -1.
+ PHNLONT0 REVENUES .13063 OBJECTIV -.13063
+ PHNLONT0 PASSNGRS 1. RPMILES 2.59897
+ PHNLONT0 LFRPMASM -2.59897 DMHNLONT 1.
+ PHNLONT0 LF1006S2 -1.
+ PHNLONT6 REVENUES -.0116 OBJECTIV .0116
+ PHNLONT6 PASSNGRS -1. DMHNLONT 1.
+ PHNLONT6 DMHNLLAX -1. DMLAXONT -1.
+ PHNLYWG1 REVENUES -.01893 OBJECTIV .01893
+ PHNLYWG1 PASSNGRS -1. DMHNLYWG 1.
+ PHNLYWG1 DMHNLYVR -1. DMYVRYWG -1.
+ PHNLYYZ1 REVENUES -.02585 OBJECTIV .02585
+ PHNLYYZ1 PASSNGRS -1. DMHNLYYZ 1.
+ PHNLYYZ1 DMHNLYVR -1. DMYVRYYZ -1.
+ PHNLYUL1 REVENUES -.02429 OBJECTIV .02429
+ PHNLYUL1 PASSNGRS -1. DMHNLYUL 1.
+ PHNLYUL1 DMHNLYVR -1. DMYULYVR -1.
+ PLASTYO1 REVENUES -.02076 OBJECTIV .02076
+ PLASTYO1 PASSNGRS -1. DMLASTYO 1.
+ PLASTYO1 DMLASSEA -1. DMSEATYO -1.
+ PLASTPE1 REVENUES -.01956 OBJECTIV .01956
+ PLASTPE1 PASSNGRS -1. DMLASTPE 1.
+ PLASTPE1 DMLASSEA -1. DMSEATPE -1.
+ PLAXLON0 REVENUES .25019 OBJECTIV -.25019
+ PLAXLON0 PASSNGRS 1. RPMILES 5.7422
+ PLAXLON0 LFRPMASM -5.7422 DMLAXLON 1.
+ PLAXLON0 LF1026S1 -1. LF1026S2 -1.
+ PLAXLON6 REVENUES -.02843 OBJECTIV .02843
+ PLAXLON6 PASSNGRS -1. DMLAXLON 1.
+ PLAXLON6 DMLAXSEA -1. DMLONSEA -1.
+ PLAXLON7 REVENUES -.03096 OBJECTIV .03096
+ PLAXLON7 PASSNGRS -1. DMLAXLON 1.
+ PLAXLON7 DMLAXYVR -1. DMLONYVR -1.
+ PLAXPAR0 REVENUES .25943 OBJECTIV -.25943
+ PLAXPAR0 PASSNGRS 1. RPMILES 5.96857
+ PLAXPAR0 LFRPMASM -5.96857 DMLAXPAR 1.
+ PLAXPAR0 LF1026S1 -1. LF1026S2 -1.
+ PLAXPAR0 LF1026S3 -1.
+ PLAXPAR6 REVENUES -.02868 OBJECTIV .02868
+ PLAXPAR6 PASSNGRS -1. DMLAXPAR 1.
+ PLAXPAR6 DMLAXSEA -1. DMPARSEA -1.
+ PLAXPAR7 REVENUES -.03123 OBJECTIV .03123
+ PLAXPAR7 PASSNGRS -1. DMLAXPAR 1.
+ PLAXPAR7 DMLAXYVR -1. DMPARYVR -1.
+ PBURLON1 REVENUES -.02834 OBJECTIV .02834
+ PBURLON1 PASSNGRS -1. DMBURLON 1.
+ PBURLON1 DMBURSEA -1. DMLONSEA -1.
+ PBURPAR1 REVENUES -.02859 OBJECTIV .02859
+ PBURPAR1 PASSNGRS -1. DMBURPAR 1.
+ PBURPAR1 DMBURSEA -1. DMPARSEA -1.
+ PLONONT1 REVENUES -.02984 OBJECTIV .02984
+ PLONONT1 PASSNGRS -1. DMLONONT 1.
+ PLONONT1 DMLONSEA -1. DMONTSEA -1.
+ PLONOAK1 REVENUES -.0197 OBJECTIV .0197
+ PLONOAK1 PASSNGRS -1. DMLONOAK 1.
+ PLONOAK1 DMLONSEA -1. DMOAKSEA -1.
+ POAKPAR1 REVENUES -.0198 OBJECTIV .0198
+ POAKPAR1 PASSNGRS -1. DMOAKPAR 1.
+ POAKPAR1 DMOAKSEA -1. DMPARSEA -1.
+ POAKTYO1 REVENUES -.028 OBJECTIV .028
+ POAKTYO1 PASSNGRS -1. DMOAKTYO 1.
+ POAKTYO1 DMOAKSEA -1. DMSEATYO -1.
+ POAKTPE1 REVENUES -.02654 OBJECTIV .02654
+ POAKTPE1 PASSNGRS -1. DMOAKTPE 1.
+ POAKTPE1 DMOAKSEA -1. DMSEATPE -1.
+ PONTPAR1 REVENUES -.03012 OBJECTIV .03012
+ PONTPAR1 PASSNGRS -1. DMONTPAR 1.
+ PONTPAR1 DMONTSEA -1. DMPARSEA -1.
+ PONTTYO1 REVENUES -.02605 OBJECTIV .02605
+ PONTTYO1 PASSNGRS -1. DMONTTYO 1.
+ PONTTYO1 DMONTSEA -1. DMSEATYO -1.
+ PONTTPE1 REVENUES -.02451 OBJECTIV .02451
+ PONTTPE1 PASSNGRS -1. DMONTTPE 1.
+ PONTTPE1 DMONTSEA -1. DMSEATPE -1.
+ PPARSFO1 REVENUES -.01968 OBJECTIV .01968
+ PPARSFO1 PASSNGRS -1. DMPARSFO 1.
+ PPARSFO1 DMPARSEA -1. DMSEASFO -1.
+ PRNOTYO1 REVENUES -.02132 OBJECTIV .02132
+ PRNOTYO1 PASSNGRS -1. DMRNOTYO 1.
+ PRNOTYO1 DMRNOSEA -1. DMSEATYO -1.
+ PRNOTPE1 REVENUES -.0202 OBJECTIV .0202
+ PRNOTPE1 PASSNGRS -1. DMRNOTPE 1.
+ PRNOTPE1 DMRNOSEA -1. DMSEATPE -1.
+ PTPEYWG1 REVENUES -.03219 OBJECTIV .03219
+ PTPEYWG1 PASSNGRS -1. DMTPEYWG 1.
+ PTPEYWG1 DMTPEYVR -1. DMYVRYWG -1.
+ PTPEYYZ1 REVENUES -.04208 OBJECTIV .04208
+ PTPEYYZ1 PASSNGRS -1. DMTPEYYZ 1.
+ PTPEYYZ1 DMTPEYVR -1. DMYVRYYZ -1.
+ PTPEYUL1 REVENUES -.05292 OBJECTIV .05292
+ PTPEYUL1 PASSNGRS -1. DMTPEYUL 1.
+ PTPEYUL1 DMTPEYVR -1. DMYULYVR -1.
+ PTYOYUL1 REVENUES -.0427 OBJECTIV .0427
+ PTYOYUL1 PASSNGRS -1. DMTYOYUL 1.
+ PTYOYUL1 DMTYOYVR -1. DMYULYVR -1.
+ PTYOYYZ1 REVENUES -.03452 OBJECTIV .03452
+ PTYOYYZ1 PASSNGRS -1. DMTYOYYZ 1.
+ PTYOYYZ1 DMTYOYVR -1. DMYVRYYZ -1.
+ PTYOYWG1 REVENUES -.02803 OBJECTIV .02803
+ PTYOYWG1 PASSNGRS -1. DMTYOYWG 1.
+ PTYOYWG1 DMTYOYVR -1. DMYVRYWG -1.
+ PLAXONT0 REVENUES .01351 OBJECTIV -.01351
+ PLAXONT0 PASSNGRS 1. RPMILES .04564
+ PLAXONT0 LFRPMASM -.04564 DMLAXONT 1.
+ PLAXONT0 LF1050S2 -1.
+ GRDTIMO1 FLAV*1 1. ACOCOSTS .457
+ GRDTIMO1 OBJECTIV .457
+ GRDTIMN1 FLAV*1 1. ACOCOSTS -.13333
+ GRDTIMN1 OBJECTIV -.13333
+ GRDTIMO2 FLAV*2 1. ACOCOSTS .318
+ GRDTIMO2 OBJECTIV .318
+ GRDTIMN2 FLAV*2 1. ACOCOSTS -.10692
+ GRDTIMN2 OBJECTIV -.10692
+ GRDTIMO3 FLAV*3 1. ACOCOSTS .206
+ GRDTIMO3 OBJECTIV .206
+ GRDTIMN3 FLAV*3 1.
+ GRDTIMO4 FLAV*4 1. ACOCOSTS .25
+ GRDTIMO4 OBJECTIV .25
+ GRDTIMN4 FLAV*4 1.
+ GRDTIMO5 FLAV*5 1. ACOCOSTS .163
+ GRDTIMO5 OBJECTIV .163
+ GRDTIMN5 FLAV*5 1.
+ GRDTIMO6 FLAV*6 1. ACOCOSTS .095
+ GRDTIMO6 OBJECTIV .095
+ GRDTIMN6 FLAV*6 1.
+ N1001AC1 ACOCOSTS 14.0062 OBJECTIV 14.0062
+ N1001AC1 SYSTDEPT 1. ACMILES 2.67711
+ N1001AC1 ASMILES 1086.90576 LFRPMASM 760.834032
+ N1001AC1 FLAV*1 5.53037 LF1001S1 284.
+ N1001AC1 MSHNLSEA 1. P1001X32 67.
+ N1001AC2 ACOCOSTS 10.44277 OBJECTIV 10.44277
+ N1001AC2 SYSTDEPT 1. ACMILES 2.67711
+ N1001AC2 ASMILES 690.69434 LFRPMASM 483.486038
+ N1001AC2 FLAV*2 5.5491 LF1001S1 180.
+ N1001AC2 MSHNLSEA 1. P1001X32 67.
+ N1001AC3 ACOCOSTS 7.65023 OBJECTIV 7.65023
+ N1001AC3 SYSTDEPT 1. ACMILES 2.67711
+ N1001AC3 ASMILES 492.58813 LFRPMASM 344.811691
+ N1001AC3 FLAV*3 5.74745 LF1001S1 128.
+ N1001AC3 MSHNLSEA 1. P1001X32 67.
+ N1002AC1 ACOCOSTS 16.89049 OBJECTIV 16.89049
+ N1002AC1 SYSTDEPT 2. ACMILES 2.80333
+ N1002AC1 ASMILES 1138.1499 LFRPMASM 796.70493
+ N1002AC1 FLAV*1 6.41046 LF1002S1 243.
+ N1002AC1 LF1002S2 284. MSSEAYVR 1.
+ N1002AC1 MSHNLYVR 1. MSHNLSEA 1.
+ N1002AC1 P1002X32 109. P1002X42 40.
+ N1002AC1 P1002X43 67.
+ N1002AC2 ACOCOSTS 12.39107 OBJECTIV 12.39107
+ N1002AC2 SYSTDEPT 2. ACMILES 2.80333
+ N1002AC2 ASMILES 723.25806 LFRPMASM 506.280642
+ N1002AC2 FLAV*2 6.35099 LF1002S1 154.
+ N1002AC2 LF1002S2 180. MSSEAYVR 1.
+ N1002AC2 MSHNLYVR 1. MSHNLSEA 1.
+ N1002AC2 P1002X32 109. P1002X42 40.
+ N1002AC2 P1002X43 67.
+ N1002AC3 ACOCOSTS 8.97425 OBJECTIV 8.97425
+ N1002AC3 SYSTDEPT 2. ACMILES 2.80333
+ N1002AC3 ASMILES 515.81177 LFRPMASM 361.068239
+ N1002AC3 FLAV*3 6.41862 LF1002S1 110.
+ N1002AC3 LF1002S2 128. MSSEAYVR 1.
+ N1002AC3 MSHNLYVR 1. MSHNLSEA 1.
+ N1002AC3 P1002X32 109. P1002X42 40.
+ N1002AC3 P1002X43 67.
+ N1003AC1 ACOCOSTS 13.46672 OBJECTIV 13.46672
+ N1003AC1 SYSTDEPT 1. ACMILES 2.55338
+ N1003AC1 ASMILES 1036.67114 LFRPMASM 725.669798
+ N1003AC1 FLAV*1 5.30481 LF1003S1 243.
+ N1003AC1 MSHNLLAX 1. P1003X32 118.
+ N1003AC2 ACOCOSTS 10.03075 OBJECTIV 10.03075
+ N1003AC2 SYSTDEPT 1. ACMILES 2.55338
+ N1003AC2 ASMILES 658.77124 LFRPMASM 461.139868
+ N1003AC2 FLAV*2 5.31883 LF1003S1 154.
+ N1003AC2 MSHNLLAX 1. P1003X32 118.
+ N1003AC3 ACOCOSTS 7.34337 OBJECTIV 7.34337
+ N1003AC3 SYSTDEPT 1. ACMILES 2.55338
+ N1003AC3 ASMILES 469.82129 LFRPMASM 328.874903
+ N1003AC3 FLAV*3 5.50122 LF1003S1 110.
+ N1003AC3 MSHNLLAX 1. P1003X32 118.
+ N1004AC1 ACOCOSTS 17.27667 OBJECTIV 17.27667
+ N1004AC1 SYSTDEPT 2. ACMILES 2.8919
+ N1004AC1 ASMILES 1174.11182 LFRPMASM 821.878274
+ N1004AC1 FLAV*1 6.57193 LF1004S1 243.
+ N1004AC1 LF1004S2 243. MSLAXSFO 1.
+ N1004AC1 MSHNLSFO 1. MSHNLLAX 1.
+ N1004AC1 P1004X32 168. P1004X43 118.
+ N1004AC2 ACOCOSTS 12.68603 OBJECTIV 12.68603
+ N1004AC2 SYSTDEPT 2. ACMILES 2.8919
+ N1004AC2 ASMILES 746.11035 LFRPMASM 522.277245
+ N1004AC2 FLAV*2 6.51583 LF1004S1 154.
+ N1004AC2 LF1004S2 154. MSLAXSFO 1.
+ N1004AC2 MSHNLSFO 1. MSHNLLAX 1.
+ N1004AC2 P1004X32 168. P1004X43 118.
+ N1004AC3 ACOCOSTS 9.19391 OBJECTIV 9.19391
+ N1004AC3 SYSTDEPT 2. ACMILES 2.8919
+ N1004AC3 ASMILES 532.10986 LFRPMASM 372.476902
+ N1004AC3 FLAV*3 6.59488 LF1004S1 110.
+ N1004AC3 LF1004S2 110. MSLAXSFO 1.
+ N1004AC3 MSHNLSFO 1. MSHNLLAX 1.
+ N1004AC3 P1004X32 168. P1004X43 118.
+ N1005AC3 ACOCOSTS 9.1777 OBJECTIV 9.1777
+ N1005AC3 SYSTDEPT 2. ACMILES 2.88537
+ N1005AC3 ASMILES 530.90723 LFRPMASM 371.635061
+ N1005AC3 FLAV*3 6.58188 LF1005S1 128.
+ N1005AC3 LF1005S2 128. MSBUROAK 1.
+ N1005AC3 MSHNLOAK 1.
+ N1105AC3 ACOCOSTS 9.19396 OBJECTIV 9.19396
+ N1105AC3 SYSTDEPT 2. ACMILES 2.89192
+ N1105AC3 ASMILES 532.11377 LFRPMASM 372.479639
+ N1105AC3 FLAV*3 6.59493 LF1105S1 128.
+ N1105AC3 LF1105S2 110. MSLAXOAK 1.
+ N1105AC3 MSHNLOAK 1. MSHNLLAX 1.
+ N1105AC3 P1105X32 46. P1105X43 118.
+ N1006AC3 ACOCOSTS 9.3651 OBJECTIV 9.3651
+ N1006AC3 SYSTDEPT 2. ACMILES 2.96093
+ N1006AC3 ASMILES 544.81104 LFRPMASM 381.367728
+ N1006AC3 FLAV*3 6.73225 LF1006S1 128.
+ N1006AC3 LF1006S2 128. MSOAKONT 1.
+ N1006AC3 MSHNLOAK 1.
+ N1007AC1 ACOCOSTS 27.19154 OBJECTIV 27.19154
+ N1007AC1 SYSTDEPT 2. ACMILES 5.16595
+ N1007AC1 ASMILES 2097.37598 LFRPMASM 1468.163186
+ N1007AC1 FLAV*1 10.71753 LF1007S1 284.
+ N1007AC1 LF1007S2 284. MSBOSSEA 1.
+ N1007AC1 MSBOSHNL 1. MSHNLSEA 1.
+ N1007AC1 P1007X43 67.
+ N1007AC2 ACOCOSTS 20.25861 OBJECTIV 20.25861
+ N1007AC2 SYSTDEPT 2. ACMILES 5.16595
+ N1007AC2 ASMILES 1332.81494 LFRPMASM 932.970458
+ N1007AC2 FLAV*2 10.74784 LF1007S1 180.
+ N1007AC2 LF1007S2 180. MSBOSSEA 1.
+ N1007AC2 MSBOSHNL 1. MSHNLSEA 1.
+ N1007AC2 P1007X43 67.
+ N1007AC3 ACOCOSTS 14.83356 OBJECTIV 14.83356
+ N1007AC3 SYSTDEPT 2. ACMILES 5.16595
+ N1007AC3 ASMILES 950.53516 LFRPMASM 665.374612
+ N1007AC3 FLAV*3 11.12024 LF1007S1 128.
+ N1007AC3 LF1007S2 128. MSBOSSEA 1.
+ N1007AC3 MSBOSHNL 1. MSHNLSEA 1.
+ N1007AC3 P1007X43 67.
+ N1008AC1 ACOCOSTS 11.99082 OBJECTIV 11.99082
+ N1008AC1 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC1 ASMILES 464.55518 LFRPMASM 325.188626
+ N1008AC1 FLAV*1 4.03592 LF1008S1 243.
+ N1008AC1 LF1008S2 243. LF1008S3 243.
+ N1008AC1 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC1 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC1 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC1 P1008X32 109. P1008X42 71.
+ N1008AC1 P1008X52 77. P1008X34 170.
+ N1008AC1 P1008X53 139. P1008X54 168.
+ N1008AC2 ACOCOSTS 8.39427 OBJECTIV 8.39427
+ N1008AC2 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC2 ASMILES 295.20972 LFRPMASM 206.646804
+ N1008AC2 FLAV*2 3.8304 LF1008S1 154.
+ N1008AC2 LF1008S2 154. LF1008S3 154.
+ N1008AC2 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC2 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC2 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC2 P1008X32 109. P1008X42 71.
+ N1008AC2 P1008X52 77. P1008X34 170.
+ N1008AC2 P1008X53 139. P1008X54 168.
+ N1008AC3 ACOCOSTS 5.87068 OBJECTIV 5.87068
+ N1008AC3 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC3 ASMILES 210.53731 LFRPMASM 147.376117
+ N1008AC3 FLAV*3 3.53701 LF1008S1 110.
+ N1008AC3 LF1008S2 110. LF1008S3 110.
+ N1008AC3 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC3 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC3 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC3 P1008X32 109. P1008X42 71.
+ N1008AC3 P1008X52 77. P1008X34 170.
+ N1008AC3 P1008X53 139. P1008X54 168.
+ N1008AC4 ACOCOSTS 3.99147 OBJECTIV 3.99147
+ N1008AC4 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC4 ASMILES 109.84555 LFRPMASM 76.891885
+ N1008AC4 FLAV*4 3.40841 LF1008S1 57.
+ N1008AC4 LF1008S2 57. LF1008S3 57.
+ N1008AC4 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC4 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC4 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC4 P1008X32 109. P1008X42 71.
+ N1008AC4 P1008X52 77. P1008X34 170.
+ N1008AC4 P1008X53 139. P1008X54 168.
+ N1008AC5 ACOCOSTS 4.41133 OBJECTIV 4.41133
+ N1008AC5 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC5 ASMILES 141.8838 LFRPMASM 99.31866
+ N1008AC5 FLAV*5 3.42334 LF1008S1 74.
+ N1008AC5 LF1008S2 74. LF1008S3 74.
+ N1008AC5 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC5 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC5 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC5 P1008X32 109. P1008X42 71.
+ N1008AC5 P1008X52 77. P1008X34 170.
+ N1008AC5 P1008X53 139. P1008X54 168.
+ N1008AC6 ACOCOSTS 3.43737 OBJECTIV 3.43737
+ N1008AC6 SYSTDEPT 3. ACMILES 1.14422
+ N1008AC6 ASMILES 108.70131 LFRPMASM 76.090917
+ N1008AC6 FLAV*6 3.59515 LF1008S1 56.
+ N1008AC6 LF1008S2 56. LF1008S3 56.
+ N1008AC6 MSSEAYVR 1. MSSFOYVR 1.
+ N1008AC6 MSLAXYVR 1. MSSEASFO 1.
+ N1008AC6 MSLAXSEA 1. MSLAXSFO 1.
+ N1008AC6 P1008X32 109. P1008X42 71.
+ N1008AC6 P1008X52 77. P1008X34 170.
+ N1008AC6 P1008X53 139. P1008X54 168.
+ N1009AC1 ACOCOSTS 9.38535 OBJECTIV 9.38535
+ N1009AC1 SYSTDEPT 2. ACMILES 1.08196
+ N1009AC1 ASMILES 439.27612 LFRPMASM 307.493284
+ N1009AC1 FLAV*1 3.27241 LF1009S1 243.
+ N1009AC1 LF1009S2 243. MSSEAYVR 1.
+ N1009AC1 MSLAXYVR 1. MSLAXSEA 1.
+ N1009AC1 P1009X32 109. P1009X42 77.
+ N1009AC1 P1009X43 139.
+ N1009AC2 ACOCOSTS 6.65893 OBJECTIV 6.65893
+ N1009AC2 SYSTDEPT 2. ACMILES 1.08196
+ N1009AC2 ASMILES 279.14575 LFRPMASM 195.402025
+ N1009AC2 FLAV*2 3.14753 LF1009S1 154.
+ N1009AC2 LF1009S2 154. MSSEAYVR 1.
+ N1009AC2 MSLAXYVR 1. MSLAXSEA 1.
+ N1009AC2 P1009X32 109. P1009X42 77.
+ N1009AC2 P1009X43 139.
+ N1009AC3 ACOCOSTS 4.70526 OBJECTIV 4.70526
+ N1009AC3 SYSTDEPT 2. ACMILES 1.08196
+ N1009AC3 ASMILES 199.08081 LFRPMASM 139.356567
+ N1009AC3 FLAV*3 2.9931 LF1009S1 110.
+ N1009AC3 LF1009S2 110. MSSEAYVR 1.
+ N1009AC3 MSLAXYVR 1. MSLAXSEA 1.
+ N1009AC3 P1009X32 109. P1009X42 77.
+ N1009AC3 P1009X43 139.
+ N1009AC4 ACOCOSTS 3.27055 OBJECTIV 3.27055
+ N1009AC4 SYSTDEPT 2. ACMILES 1.08196
+ N1009AC4 ASMILES 103.86824 LFRPMASM 72.707768
+ N1009AC4 FLAV*4 2.90163 LF1009S1 57.
+ N1009AC4 LF1009S2 57. MSSEAYVR 1.
+ N1009AC4 MSLAXYVR 1. MSLAXSEA 1.
+ N1009AC4 P1009X32 109. P1009X42 77.
+ N1009AC4 P1009X43 139.
+ N1009AC5 ACOCOSTS 3.58556 OBJECTIV 3.58556
+ N1009AC5 SYSTDEPT 2. ACMILES 1.08196
+ N1009AC5 ASMILES 134.16312 LFRPMASM 93.914184
+ N1009AC5 FLAV*5 2.92913 LF1009S1 74.
+ N1009AC5 LF1009S2 74. MSSEAYVR 1.
+ N1009AC5 MSLAXYVR 1. MSLAXSEA 1.
+ N1009AC5 P1009X32 109. P1009X42 77.
+ N1009AC5 P1009X43 139.
+ N1010AC1 ACOCOSTS 2.8843 OBJECTIV 2.8843
+ N1010AC1 SYSTDEPT 1. ACMILES .12622
+ N1010AC1 ASMILES 51.24359 LFRPMASM 35.870513
+ N1010AC1 FLAV*1 .88009 LF1010S1 243.
+ N1010AC1 MSSEAYVR 1. P1010X32 109.
+ N1010AC2 ACOCOSTS 1.9483 OBJECTIV 1.9483
+ N1010AC2 SYSTDEPT 1. ACMILES .12622
+ N1010AC2 ASMILES 32.56366 LFRPMASM 22.794562
+ N1010AC2 FLAV*2 .80189 LF1010S1 154.
+ N1010AC2 MSSEAYVR 1. P1010X32 109.
+ N1010AC3 ACOCOSTS 1.32401 OBJECTIV 1.32401
+ N1010AC3 SYSTDEPT 1. ACMILES .12622
+ N1010AC3 ASMILES 23.22369 LFRPMASM 16.256583
+ N1010AC3 FLAV*3 .67117 LF1010S1 110.
+ N1010AC3 MSSEAYVR 1. P1010X32 109.
+ N1010AC4 ACOCOSTS .84307 OBJECTIV .84307
+ N1010AC4 SYSTDEPT 1. ACMILES .12622
+ N1010AC4 ASMILES 12.11671 LFRPMASM 8.481697
+ N1010AC4 FLAV*4 .6329 LF1010S1 57.
+ N1010AC4 MSSEAYVR 1. P1010X32 109.
+ N1010AC5 ACOCOSTS .95496 OBJECTIV .95496
+ N1010AC5 SYSTDEPT 1. ACMILES .12622
+ N1010AC5 ASMILES 15.65075 LFRPMASM 10.955525
+ N1010AC5 FLAV*5 .62384 LF1010S1 74.
+ N1010AC5 MSSEAYVR 1. P1010X32 109.
+ N1010AC6 ACOCOSTS .67624 OBJECTIV .67624
+ N1010AC6 SYSTDEPT 1. ACMILES .12622
+ N1010AC6 ASMILES 11.9905 LFRPMASM 8.39335
+ N1010AC6 FLAV*6 .61067 LF1010S1 56.
+ N1010AC6 MSSEAYVR 1. P1010X32 109.
+ N1011AC1 ACOCOSTS 9.10651 OBJECTIV 9.10651
+ N1011AC1 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC1 ASMILES 413.31152 LFRPMASM 289.318064
+ N1011AC1 FLAV*1 3.15583 LF1011S1 243.
+ N1011AC1 LF1011S2 243. MSSEASFO 1.
+ N1011AC1 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC1 P1011X23 170. P1011X42 139.
+ N1011AC1 P1011X43 168.
+ N1011AC2 ACOCOSTS 6.44597 OBJECTIV 6.44597
+ N1011AC2 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC2 ASMILES 262.64624 LFRPMASM 183.852368
+ N1011AC2 FLAV*2 3.02851 LF1011S1 154.
+ N1011AC2 LF1011S2 154. MSSEASFO 1.
+ N1011AC2 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC2 P1011X23 170. P1011X42 139.
+ N1011AC2 P1011X43 168.
+ N1011AC3 ACOCOSTS 4.54666 OBJECTIV 4.54666
+ N1011AC3 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC3 ASMILES 187.31361 LFRPMASM 131.119527
+ N1011AC3 FLAV*3 2.86584 LF1011S1 110.
+ N1011AC3 LF1011S2 110. MSSEASFO 1.
+ N1011AC3 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC3 P1011X23 170. P1011X42 139.
+ N1011AC3 P1011X43 168.
+ N1011AC4 ACOCOSTS 3.1484 OBJECTIV 3.1484
+ N1011AC4 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC4 ASMILES 97.72881 LFRPMASM 68.410167
+ N1011AC4 FLAV*4 2.77551 LF1011S1 57.
+ N1011AC4 LF1011S2 57. MSSEASFO 1.
+ N1011AC4 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC4 P1011X23 170. P1011X42 139.
+ N1011AC4 P1011X43 168.
+ N1011AC5 ACOCOSTS 3.45638 OBJECTIV 3.45638
+ N1011AC5 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC5 ASMILES 126.23305 LFRPMASM 88.363135
+ N1011AC5 FLAV*5 2.7995 LF1011S1 74.
+ N1011AC5 LF1011S2 74. MSSEASFO 1.
+ N1011AC5 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC5 P1011X23 170. P1011X42 139.
+ N1011AC5 P1011X43 168.
+ N1011AC6 ACOCOSTS 2.76114 OBJECTIV 2.76114
+ N1011AC6 SYSTDEPT 2. ACMILES 1.01801
+ N1011AC6 ASMILES 96.7108 LFRPMASM 67.69756
+ N1011AC6 FLAV*6 2.98447 LF1011S1 56.
+ N1011AC6 LF1011S2 56. MSSEASFO 1.
+ N1011AC6 MSLAXSEA 1. MSLAXSFO 1.
+ N1011AC6 P1011X23 170. P1011X42 139.
+ N1011AC6 P1011X43 168.
+ N1012AC1 ACOCOSTS 6.50105 OBJECTIV 6.50105
+ N1012AC1 SYSTDEPT 1. ACMILES .95575
+ N1012AC1 ASMILES 388.03247 LFRPMASM 271.622729
+ N1012AC1 FLAV*1 2.39232 LF1012S1 243.
+ N1012AC1 MSLAXSEA 1. P1012X32 139.
+ N1012AC2 ACOCOSTS 4.71063 OBJECTIV 4.71063
+ N1012AC2 SYSTDEPT 1. ACMILES .95575
+ N1012AC2 ASMILES 246.58224 LFRPMASM 172.607568
+ N1012AC2 FLAV*2 2.34564 LF1012S1 154.
+ N1012AC2 MSLAXSEA 1. P1012X32 139.
+ N1012AC3 ACOCOSTS 3.38125 OBJECTIV 3.38125
+ N1012AC3 SYSTDEPT 1. ACMILES .95575
+ N1012AC3 ASMILES 175.85712 LFRPMASM 123.099984
+ N1012AC3 FLAV*3 2.32193 LF1012S1 110.
+ N1012AC3 MSLAXSEA 1. P1012X32 139.
+ N1012AC4 ACOCOSTS 2.42747 OBJECTIV 2.42747
+ N1012AC4 SYSTDEPT 1. ACMILES .95575
+ N1012AC4 ASMILES 91.7515 LFRPMASM 64.22605
+ N1012AC4 FLAV*4 2.26873 LF1012S1 57.
+ N1012AC4 MSLAXSEA 1. P1012X32 139.
+ N1012AC5 MSLAXSEA 1. P1012X32 139.
+ N1012AC5 ASMILES 118.51237 LFRPMASM 82.958659
+ N1012AC5 FLAV*5 2.30529 SYSTDEPT 1.
+ N1012AC5 ACMILES .95575 ACOCOSTS 2.6306
+ N1012AC5 OBJECTIV 2.6306 LF1012S1 74.
+ N1013AC3 ACOCOSTS 4.58479 OBJECTIV 4.58479
+ N1013AC3 SYSTDEPT 2. ACMILES 1.03338
+ N1013AC3 ASMILES 190.14275 LFRPMASM 133.099925
+ N1013AC3 FLAV*3 2.89643 LF1013S1 128.
+ N1013AC3 LF1013S2 128. MSOAKSEA 1.
+ N1013AC3 MSONTSEA 1. MSOAKONT 1.
+ N1013AC3 P1013X32 43. P1013X42 25.
+ N1013AC4 ACOCOSTS 3.17776 OBJECTIV 3.17776
+ N1013AC4 SYSTDEPT 2. ACMILES 1.03338
+ N1013AC4 ASMILES 99.20493 LFRPMASM 69.443451
+ N1013AC4 FLAV*4 2.80583 LF1013S1 67.
+ N1013AC4 LF1013S2 67. MSOAKSEA 1.
+ N1013AC4 MSONTSEA 1. MSOAKONT 1.
+ N1013AC4 P1013X32 43. P1013X42 25.
+ N1013AC5 ACOCOSTS 3.48744 OBJECTIV 3.48744
+ N1013AC5 SYSTDEPT 2. ACMILES 1.03338
+ N1013AC5 ASMILES 128.13968 LFRPMASM 89.697776
+ N1013AC5 FLAV*5 2.83067 LF1013S1 86.
+ N1013AC5 LF1013S2 86. MSOAKSEA 1.
+ N1013AC5 MSONTSEA 1. MSOAKONT 1.
+ N1013AC5 P1013X32 43. P1013X42 25.
+ N1013AC6 ACOCOSTS 2.78943 OBJECTIV 2.78943
+ N1013AC6 SYSTDEPT 2. ACMILES 1.03338
+ N1013AC6 ASMILES 98.17149 LFRPMASM 68.720043
+ N1013AC6 FLAV*6 3.01988 LF1013S1 66.
+ N1013AC6 LF1013S2 66. MSOAKSEA 1.
+ N1013AC6 MSONTSEA 1. MSOAKONT 1.
+ N1013AC6 P1013X32 43. P1013X42 25.
+ N1014AC3 ACOCOSTS 4.4958 OBJECTIV 4.4958
+ N1014AC3 SYSTDEPT 2. ACMILES .9975
+ N1014AC3 ASMILES 183.53999 LFRPMASM 128.477993
+ N1014AC3 FLAV*3 2.82502 LF1014S1 128.
+ N1014AC3 LF1014S2 128. MSOAKSEA 1.
+ N1014AC3 MSBURSEA 1. MSBUROAK 1.
+ N1014AC3 P1014X32 43.
+ N1014AC4 ACOCOSTS 3.10922 OBJECTIV 3.10922
+ N1014AC4 SYSTDEPT 2. ACMILES .9975
+ N1014AC4 ASMILES 95.75999 LFRPMASM 67.031993
+ N1014AC4 FLAV*4 2.73507 LF1014S1 67.
+ N1014AC4 LF1014S2 67. MSOAKSEA 1.
+ N1014AC4 MSBURSEA 1. MSBUROAK 1.
+ N1014AC4 P1014X32 43.
+ N1014AC5 ACOCOSTS 3.41495 OBJECTIV 3.41495
+ N1014AC5 SYSTDEPT 2. ACMILES .9975
+ N1014AC5 ASMILES 123.68999 LFRPMASM 86.582993
+ N1014AC5 FLAV*5 2.75793 LF1014S1 86.
+ N1014AC5 LF1014S2 86. MSOAKSEA 1.
+ N1014AC5 MSBURSEA 1. MSBUROAK 1.
+ N1014AC5 P1014X32 43.
+ N1014AC6 ACOCOSTS 2.7234 OBJECTIV 2.7234
+ N1014AC6 SYSTDEPT 2. ACMILES .9975
+ N1014AC6 ASMILES 94.7625 LFRPMASM 66.33375
+ N1014AC6 FLAV*6 2.93724 LF1014S1 66.
+ N1014AC6 LF1014S2 66. MSOAKSEA 1.
+ N1014AC6 MSBURSEA 1. MSBUROAK 1.
+ N1014AC6 P1014X32 43.
+ N1015AC3 ACOCOSTS 4.60806 OBJECTIV 4.60806
+ N1015AC3 SYSTDEPT 2. ACMILES 1.04277
+ N1015AC3 ASMILES 191.86919 LFRPMASM 134.308433
+ N1015AC3 FLAV*3 2.91511 LF1015S1 110.
+ N1015AC3 LF1015S2 128. MSSEASFO 1.
+ N1015AC3 MSONTSEA 1. MSONTSFO 1.
+ N1015AC3 P1015X23 170. P1015X42 25.
+ N1015AC3 P1015X43 69.
+ N1015AC4 ACOCOSTS 3.19568 OBJECTIV 3.19568
+ N1015AC4 SYSTDEPT 2. ACMILES 1.04277
+ N1015AC4 ASMILES 100.10562 LFRPMASM 70.073934
+ N1015AC4 FLAV*4 2.82434 LF1015S1 57.
+ N1015AC4 LF1015S2 67. MSSEASFO 1.
+ N1015AC4 MSONTSEA 1. MSONTSFO 1.
+ N1015AC4 P1015X23 170. P1015X42 25.
+ N1015AC4 P1015X43 69.
+ N1015AC5 ACOCOSTS 3.50639 OBJECTIV 3.50639
+ N1015AC5 SYSTDEPT 2. ACMILES 1.04277
+ N1015AC5 ASMILES 129.30312 LFRPMASM 90.512184
+ N1015AC5 FLAV*5 2.84969 LF1015S1 74.
+ N1015AC5 LF1015S2 86. MSSEASFO 1.
+ N1015AC5 MSONTSEA 1. MSONTSFO 1.
+ N1015AC5 P1015X23 170. P1015X42 25.
+ N1015AC5 P1015X43 69.
+ N1015AC6 ACOCOSTS 2.80669 OBJECTIV 2.80669
+ N1015AC6 SYSTDEPT 2. ACMILES 1.04277
+ N1015AC6 ASMILES 99.06287 LFRPMASM 69.344009
+ N1015AC6 FLAV*6 3.04149 LF1015S1 56.
+ N1015AC6 LF1015S2 66. MSSEASFO 1.
+ N1015AC6 MSONTSEA 1. MSONTSFO 1.
+ N1015AC6 P1015X23 170. P1015X42 25.
+ N1015AC6 P1015X43 69.
+ N1016AC3 ACOCOSTS 4.51701 OBJECTIV 4.51701
+ N1016AC3 SYSTDEPT 2. ACMILES 1.00605
+ N1016AC3 ASMILES 185.11406 LFRPMASM 129.579842
+ N1016AC3 FLAV*3 2.84205 LF1016S1 110.
+ N1016AC3 LF1016S2 128. MSSEASFO 1.
+ N1016AC3 MSBURSEA 1. MSBURSFO 1.
+ N1016AC3 P1016X23 170. P1016X43 81.
+ N1016AC4 ACOCOSTS 3.12556 OBJECTIV 3.12556
+ N1016AC4 SYSTDEPT 2. ACMILES 1.00605
+ N1016AC4 ASMILES 96.58124 LFRPMASM 67.606868
+ N1016AC4 FLAV*4 2.75194 LF1016S1 57.
+ N1016AC4 LF1016S2 67. MSSEASFO 1.
+ N1016AC4 MSBURSEA 1. MSBURSFO 1.
+ N1016AC4 P1016X23 170. P1016X43 81.
+ N1016AC5 ACOCOSTS 3.43223 OBJECTIV 3.43223
+ N1016AC5 SYSTDEPT 2. ACMILES 1.00605
+ N1016AC5 ASMILES 124.75075 LFRPMASM 87.325525
+ N1016AC5 FLAV*5 2.77527 LF1016S1 74.
+ N1016AC5 LF1016S2 86. MSSEASFO 1.
+ N1016AC5 MSBURSEA 1. MSBURSFO 1.
+ N1016AC5 P1016X23 170. P1016X43 81.
+ N1016AC6 ACOCOSTS 2.73914 OBJECTIV 2.73914
+ N1016AC6 SYSTDEPT 2. ACMILES 1.00605
+ N1016AC6 ASMILES 95.57518 LFRPMASM 66.902626
+ N1016AC6 FLAV*6 2.95694 LF1016S1 56.
+ N1016AC6 LF1016S2 66. MSSEASFO 1.
+ N1016AC6 MSBURSEA 1. MSBURSFO 1.
+ N1016AC6 P1016X23 170. P1016X43 81.
+ N1017AC3 ACOCOSTS 4.52672 OBJECTIV 4.52672
+ N1017AC3 SYSTDEPT 2. ACMILES 1.00997
+ N1017AC3 ASMILES 185.8343 LFRPMASM 130.08401
+ N1017AC3 FLAV*3 2.84984 LF1017S1 128.
+ N1017AC3 LF1017S2 128. MSOAKSEA 1.
+ N1017AC3 MSLAXSEA 1. MSLAXOAK 1.
+ N1017AC3 P1017X32 43. P1017X42 139.
+ N1017AC3 P1017X43 46.
+ N1017AC4 ACOCOSTS 3.13304 OBJECTIV 3.13304
+ N1017AC4 SYSTDEPT 2. ACMILES 1.00997
+ N1017AC4 ASMILES 96.95699 LFRPMASM 67.869893
+ N1017AC4 FLAV*4 2.75966 LF1017S1 67.
+ N1017AC4 LF1017S2 67. MSOAKSEA 1.
+ N1017AC4 MSLAXSEA 1. MSLAXOAK 1.
+ N1017AC4 P1017X32 43. P1017X42 139.
+ N1017AC4 P1017X43 46.
+ N1017AC5 ACOCOSTS 3.44014 OBJECTIV 3.44014
+ N1017AC5 SYSTDEPT 2. ACMILES 1.00997
+ N1017AC5 ASMILES 125.23611 LFRPMASM 87.665277
+ N1017AC5 FLAV*5 2.78321 LF1017S1 86.
+ N1017AC5 LF1017S2 86. MSOAKSEA 1.
+ N1017AC5 MSLAXSEA 1. MSLAXOAK 1.
+ N1017AC5 P1017X32 43. P1017X42 139.
+ N1017AC5 P1017X43 46.
+ N1017AC6 ACOCOSTS 2.74634 OBJECTIV 2.74634
+ N1017AC6 SYSTDEPT 2. ACMILES 1.00997
+ N1017AC6 ASMILES 95.94705 LFRPMASM 67.162935
+ N1017AC6 FLAV*6 2.96596 LF1017S1 66.
+ N1017AC6 LF1017S2 66. MSOAKSEA 1.
+ N1017AC6 MSLAXSEA 1. MSLAXOAK 1.
+ N1017AC6 P1017X32 43. P1017X42 139.
+ N1017AC6 P1017X43 46.
+ N1018AC1 ACOCOSTS 7.67623 OBJECTIV 7.67623
+ N1018AC1 SYSTDEPT 2. ACMILES .68996
+ N1018AC1 ASMILES 280.12378 LFRPMASM 196.086646
+ N1018AC1 FLAV*1 2.5578 LF1018S1 243.
+ N1018AC1 LF1018S2 243. MSSEAYVR 1.
+ N1018AC1 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC1 P1018X32 109. P1018X43 85.
+ N1018AC2 ACOCOSTS 5.35357 OBJECTIV 5.35357
+ N1018AC2 SYSTDEPT 2. ACMILES .68996
+ N1018AC2 ASMILES 178.00974 LFRPMASM 124.606818
+ N1018AC2 FLAV*2 2.41802 LF1018S1 154.
+ N1018AC2 LF1018S2 154. MSSEAYVR 1.
+ N1018AC2 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC2 P1018X32 109. P1018X43 85.
+ N1018AC3 ACOCOSTS 3.7331 OBJECTIV 3.7331
+ N1018AC3 SYSTDEPT 2. ACMILES .68996
+ N1018AC3 ASMILES 126.95268 LFRPMASM 88.866876
+ N1018AC3 FLAV*3 2.21302 LF1018S1 110.
+ N1018AC3 LF1018S2 110. MSSEAYVR 1.
+ N1018AC3 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC3 P1018X32 109. P1018X43 85.
+ N1018AC4 ACOCOSTS 2.52182 OBJECTIV 2.52182
+ N1018AC4 SYSTDEPT 2. ACMILES .68996
+ N1018AC4 ASMILES 66.23618 LFRPMASM 46.365326
+ N1018AC4 FLAV*4 2.1286 LF1018S1 57.
+ N1018AC4 LF1018S2 57. MSSEAYVR 1.
+ N1018AC4 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC4 P1018X32 109. P1018X43 85.
+ N1018AC5 ACOCOSTS 2.79372 OBJECTIV 2.79372
+ N1018AC5 SYSTDEPT 2. ACMILES .68996
+ N1018AC5 ASMILES 85.55505 LFRPMASM 59.888535
+ N1018AC5 FLAV*5 2.13455 LF1018S1 74.
+ N1018AC5 LF1018S2 74. MSSEAYVR 1.
+ N1018AC5 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC5 P1018X32 109. P1018X43 85.
+ N1018AC6 ACOCOSTS 2.15753 OBJECTIV 2.15753
+ N1018AC6 SYSTDEPT 2. ACMILES .68996
+ N1018AC6 ASMILES 65.54617 LFRPMASM 45.882319
+ N1018AC6 FLAV*6 2.22898 LF1018S1 56.
+ N1018AC6 LF1018S2 56. MSSEAYVR 1.
+ N1018AC6 MSRNOYVR 1. MSRNOSEA 1.
+ N1018AC6 P1018X32 109. P1018X43 85.
+ N1019AC1 ACOCOSTS 9.00153 OBJECTIV 9.00153
+ N1019AC1 SYSTDEPT 2. ACMILES .99393
+ N1019AC1 ASMILES 403.53516 LFRPMASM 282.474612
+ N1019AC1 FLAV*1 3.11193 LF1019S1 243.
+ N1019AC1 LF1019S2 243. MSSEAYVR 1.
+ N1019AC1 MSLASYVR 1. MSLASSEA 1.
+ N1019AC1 P1019X32 109. P1019X43 110.
+ N1019AC2 ACOCOSTS 6.36578 OBJECTIV 6.36578
+ N1019AC2 SYSTDEPT 2. ACMILES .99393
+ N1019AC2 ASMILES 256.43359 LFRPMASM 179.503513
+ N1019AC2 FLAV*2 2.9837 LF1019S1 154.
+ N1019AC2 LF1019S2 154. MSSEAYVR 1.
+ N1019AC2 MSLASYVR 1. MSLASSEA 1.
+ N1019AC2 P1019X32 109. P1019X43 110.
+ N1019AC3 ACOCOSTS 4.48694 OBJECTIV 4.48694
+ N1019AC3 SYSTDEPT 2. ACMILES .99393
+ N1019AC3 ASMILES 182.88293 LFRPMASM 128.018051
+ N1019AC3 FLAV*3 2.81792 LF1019S1 110.
+ N1019AC3 LF1019S2 110. MSSEAYVR 1.
+ N1019AC3 MSLASYVR 1. MSLASSEA 1.
+ N1019AC3 P1019X32 109. P1019X43 110.
+ N1019AC4 ACOCOSTS 3.1024 OBJECTIV 3.1024
+ N1019AC4 SYSTDEPT 2. ACMILES .99393
+ N1019AC4 ASMILES 95.41718 LFRPMASM 66.792026
+ N1019AC4 FLAV*4 2.72803 LF1019S1 57.
+ N1019AC4 LF1019S2 57. MSSEAYVR 1.
+ N1019AC4 MSLASYVR 1. MSLASSEA 1.
+ N1019AC4 P1019X32 109. P1019X43 110.
+ N1019AC5 ACOCOSTS 3.40774 OBJECTIV 3.40774
+ N1019AC5 SYSTDEPT 2. ACMILES .99393
+ N1019AC5 ASMILES 123.24718 LFRPMASM 86.273026
+ N1019AC5 FLAV*5 2.75069 LF1019S1 74.
+ N1019AC5 LF1019S2 74. MSSEAYVR 1.
+ N1019AC5 MSLASYVR 1. MSLASSEA 1.
+ N1019AC5 P1019X32 109. P1019X43 110.
+ N1020AC1 ACOCOSTS 4.79193 OBJECTIV 4.79193
+ N1020AC1 SYSTDEPT 1. ACMILES .56374
+ N1020AC1 ASMILES 228.88037 LFRPMASM 160.216259
+ N1020AC1 FLAV*1 1.67771 LF1020S1 243.
+ N1020AC1 MSRNOSEA 1. P1020X32 85.
+ N1020AC2 ACOCOSTS 3.40527 OBJECTIV 3.40527
+ N1020AC2 SYSTDEPT 1. ACMILES .56374
+ N1020AC2 ASMILES 145.44612 LFRPMASM 101.812284
+ N1020AC2 FLAV*2 1.61613 LF1020S1 154.
+ N1020AC2 MSRNOSEA 1. P1020X32 85.
+ N1020AC3 ACOCOSTS 2.40909 OBJECTIV 2.40909
+ N1020AC3 SYSTDEPT 1. ACMILES .56374
+ N1020AC3 ASMILES 103.72899 LFRPMASM 72.610293
+ N1020AC3 FLAV*3 1.54185 LF1020S1 110.
+ N1020AC3 MSRNOSEA 1. P1020X32 85.
+ N1020AC4 ACOCOSTS 1.67875 OBJECTIV 1.67875
+ N1020AC4 SYSTDEPT 1. ACMILES .56374
+ N1020AC4 ASMILES 54.11951 LFRPMASM 37.883657
+ N1020AC4 FLAV*4 1.4957 LF1020S1 57.
+ N1020AC4 MSRNOSEA 1. P1020X32 85.
+ N1020AC5 ACOCOSTS 1.83876 OBJECTIV 1.83876
+ N1020AC5 SYSTDEPT 1. ACMILES .56374
+ N1020AC5 ASMILES 69.90431 LFRPMASM 48.933017
+ N1020AC5 FLAV*5 1.51071 LF1020S1 74.
+ N1020AC5 MSRNOSEA 1. P1020X32 85.
+ N1020AC6 ACOCOSTS 1.48129 OBJECTIV 1.48129
+ N1020AC6 SYSTDEPT 1. ACMILES .56374
+ N1020AC6 ASMILES 53.55576 LFRPMASM 37.489032
+ N1020AC6 FLAV*6 1.6183 LF1020S1 56.
+ N1020AC6 MSRNOSEA 1. P1020X32 85.
+ N1021AC1 ACOCOSTS 6.11723 OBJECTIV 6.11723
+ N1021AC1 SYSTDEPT 1. ACMILES .86771
+ N1021AC1 ASMILES 352.2915 LFRPMASM 246.60405
+ N1021AC1 FLAV*1 2.23184 LF1021S1 243.
+ N1021AC1 MSLASSEA 1. P1021X32 110.
+ N1021AC2 ACOCOSTS 4.41748 OBJECTIV 4.41748
+ N1021AC2 SYSTDEPT 1. ACMILES .86771
+ N1021AC2 ASMILES 223.87006 LFRPMASM 156.709042
+ N1021AC2 FLAV*2 2.18181 LF1021S1 154.
+ N1021AC2 MSLASSEA 1. P1021X32 110.
+ N1021AC3 ACOCOSTS 3.16293 OBJECTIV 3.16293
+ N1021AC3 SYSTDEPT 1. ACMILES .86771
+ N1021AC3 ASMILES 159.65924 LFRPMASM 111.761468
+ N1021AC3 FLAV*3 2.14675 LF1021S1 110.
+ N1021AC3 MSLASSEA 1. P1021X32 110.
+ N1021AC4 ACOCOSTS 2.25933 OBJECTIV 2.25933
+ N1021AC4 SYSTDEPT 1. ACMILES .86771
+ N1021AC4 ASMILES 83.30049 LFRPMASM 58.310343
+ N1021AC4 FLAV*4 2.09513 LF1021S1 57.
+ N1021AC4 MSLASSEA 1. P1021X32 110.
+ N1021AC5 ACOCOSTS 2.45278 OBJECTIV 2.45278
+ N1021AC5 SYSTDEPT 1. ACMILES .86771
+ N1021AC5 ASMILES 107.59644 LFRPMASM 75.317508
+ N1021AC5 FLAV*5 2.12685 LF1021S1 74.
+ N1021AC5 MSLASSEA 1. P1021X32 110.
+ N1022AC1 ACOCOSTS 40.32039 OBJECTIV 40.32039
+ N1022AC1 SYSTDEPT 3. ACMILES 7.64184
+ N1022AC1 ASMILES 3102.58496 LFRPMASM 2171.809472
+ N1022AC1 FLAV*1 15.88107 LF1022S1 284.
+ N1022AC1 LF1022S2 284. LF1022S3 284.
+ N1022AC1 NOPTLON1 2. NOPTLON0 2.
+ N1022AC1 MSHNLYVR 1. MSLONYVR 1.
+ N1022AC1 MSLONPAR 1. P1022X23 40.
+ N1023AC1 ACOCOSTS 29.4082 OBJECTIV 29.4082
+ N1023AC1 SYSTDEPT 3. ACMILES 5.13904
+ N1023AC1 ASMILES 2086.44897 LFRPMASM 1460.514279
+ N1023AC1 FLAV*1 11.31847 LF1023S1 243.
+ N1023AC1 LF1023S2 243. LF1023S3 284.
+ N1023AC1 NOPTLON1 2. NOPTLON0 2.
+ N1023AC1 MSSEAYVR 1. MSLONYVR 1.
+ N1023AC1 MSLONSEA 1. MSPARSEA 1.
+ N1023AC1 MSLONPAR 1. P1023X32 109.
+ N1026AC1 ACOCOSTS 33.02493 OBJECTIV 33.02493
+ N1026AC1 SYSTDEPT 3. ACMILES 5.96857
+ N1026AC1 ASMILES 2423.23682 LFRPMASM 1696.265774
+ N1026AC1 FLAV*1 12.8307 LF1026S1 243.
+ N1026AC1 LF1026S2 243. LF1026S3 284.
+ N1026AC1 NOPTLON1 2. NOPTLON0 2.
+ N1026AC1 MSLAXSEA 1. MSLAXLON 1.
+ N1026AC1 MSLONSEA 1. MSPARSEA 1.
+ N1026AC1 MSLONPAR 1. P1026X23 139.
+ N1027AC1 ACOCOSTS 37.74599 OBJECTIV 37.74599
+ N1027AC1 SYSTDEPT 3. ACMILES 7.05137
+ N1027AC1 ASMILES 2862.85791 LFRPMASM 2004.000537
+ N1027AC1 FLAV*1 14.80466 LF1027S1 243.
+ N1027AC1 LF1027S2 263. LF1027S3 284.
+ N1027AC1 NOPTTYO1 2. NOPTTYO0 2.
+ N1027AC1 MSLAXSEA 1. MSLAXTPE 1.
+ N1027AC1 MSSEATYO 1. MSSEATPE 1.
+ N1027AC1 MSTPETYO 1. P1027X23 139.
+ N1027AC1 P1027X25 18.
+ N1028AC1 ACOCOSTS 36.5415 OBJECTIV 36.5415
+ N1028AC1 SYSTDEPT 3. ACMILES 6.77512
+ N1028AC1 ASMILES 2750.69678 LFRPMASM 1925.487746
+ N1028AC1 FLAV*1 14.30104 LF1028S1 243.
+ N1028AC1 LF1028S2 263. LF1028S3 284.
+ N1028AC1 NOPTTYO1 2. NOPTTYO0 2.
+ N1028AC1 MSSEASFO 1. MSSEATYO 1.
+ N1028AC1 MSSEATPE 1. MSTPETYO 1.
+ N1028AC1 P1028X32 170.
+ N1029AC1 ACOCOSTS 42.82423 OBJECTIV 42.82423
+ N1029AC1 SYSTDEPT 5. ACMILES 7.14547
+ N1029AC1 ASMILES 2901.05981 LFRPMASM 2030.741867
+ N1029AC1 FLAV*1 16.27618 LF1029S1 243.
+ N1029AC1 LF1029S2 243. LF1029S3 243.
+ N1029AC1 LF1029S4 304. LF1029S5 284.
+ N1029AC1 NOPTTYO1 2. NOPTTYO0 2.
+ N1029AC1 MSLAXSFO 1. MSLAXSEA 1.
+ N1029AC1 MSLAXYVR 1. MSLAXTPE 1.
+ N1029AC1 MSSEASFO 1. MSSFOYVR 1.
+ N1029AC1 MSSEAYVR 1. MSSEATYO 1.
+ N1029AC1 MSSEATPE 1. MSTPETYO 1.
+ N1029AC1 P1029X23 168. P1029X24 139.
+ N1029AC1 P1029X25 77. P1029X27 18.
+ N1029AC1 P1029X43 170. P1029X35 71.
+ N1029AC1 P1029X45 109.
+ N1030AC1 ACOCOSTS 40.35146 OBJECTIV 40.35146
+ N1030AC1 SYSTDEPT 4. ACMILES 7.11364
+ N1030AC1 ASMILES 2888.13794 LFRPMASM 2021.696558
+ N1030AC1 FLAV*1 15.56816 LF1030S1 243.
+ N1030AC1 LF1030S2 243. LF1030S3 263.
+ N1030AC1 LF1030S4 284. NOPTTYO1 2.
+ N1030AC1 NOPTTYO0 2. MSLAXSFO 1.
+ N1030AC1 MSLAXSEA 1. MSLAXTPE 1.
+ N1030AC1 MSSEASFO 1. MSSEATYO 1.
+ N1030AC1 MSSEATPE 1. MSTPETYO 1.
+ N1030AC1 P1030X23 168. P1030X24 139.
+ N1030AC1 P1030X26 18. P1030X43 170.
+ N1032AC1 ACOCOSTS 23.8204 OBJECTIV 23.8204
+ N1032AC1 SYSTDEPT 5. ACMILES 2.78679
+ N1032AC1 ASMILES 1131.43799 LFRPMASM 792.006593
+ N1032AC1 FLAV*1 8.33032 LF1032S1 243.
+ N1032AC1 LF1032S2 284. LF1032S3 284.
+ N1032AC1 LF1032S4 284. LF1032S5 243.
+ N1032AC1 MSSEAYVR 1. MSBOSSEA 1.
+ N1032AC1 MSYVRYWG 1. MSYVRYYZ 1.
+ N1032AC1 MSYULYVR 1. MSBOSYVR 1.
+ N1032AC1 MSYWGYYZ 1. MSYULYWG 1.
+ N1032AC1 MSBOSYWG 1. MSYULYYZ 1.
+ N1032AC1 MSBOSYYZ 1. MSBOSYUL 1.
+ N1032AC1 P1032X23 109. P1032X34 89.
+ N1032AC1 P1032X35 76. P1032X63 44.
+ N1032AC1 P1032X45 83. P1032X64 99.
+ N1032AC1 P1032X65 130. P1032X75 85.
+ N1032AC1 P1032X76 115.
+ N1032AC2 ACOCOSTS 16.92001 OBJECTIV 16.92001
+ N1032AC2 SYSTDEPT 5. ACMILES 2.78679
+ N1032AC2 ASMILES 718.99268 LFRPMASM 503.294876
+ N1032AC2 FLAV*2 8.02122 LF1032S1 154.
+ N1032AC2 LF1032S2 180. LF1032S3 180.
+ N1032AC2 LF1032S4 180. LF1032S5 154.
+ N1032AC2 MSSEAYVR 1. MSBOSSEA 1.
+ N1032AC2 MSYVRYWG 1. MSYVRYYZ 1.
+ N1032AC2 MSYULYVR 1. MSBOSYVR 1.
+ N1032AC2 MSYWGYYZ 1. MSYULYWG 1.
+ N1032AC2 MSBOSYWG 1. MSYULYYZ 1.
+ N1032AC2 MSBOSYYZ 1. MSBOSYUL 1.
+ N1032AC2 P1032X23 109. P1032X34 89.
+ N1032AC2 P1032X35 76. P1032X63 44.
+ N1032AC2 P1032X45 83. P1032X64 99.
+ N1032AC2 P1032X65 130. P1032X75 85.
+ N1032AC2 P1032X76 115.
+ N1032AC3 ACOCOSTS 11.96625 OBJECTIV 11.96625
+ N1032AC3 SYSTDEPT 5. ACMILES 2.78679
+ N1032AC3 ASMILES 512.76978 LFRPMASM 358.938846
+ N1032AC3 FLAV*3 7.64572 LF1032S1 110.
+ N1032AC3 LF1032S2 128. LF1032S3 128.
+ N1032AC3 LF1032S4 128. LF1032S5 110.
+ N1032AC3 MSSEAYVR 1. MSBOSSEA 1.
+ N1032AC3 MSYVRYWG 1. MSYVRYYZ 1.
+ N1032AC3 MSYULYVR 1. MSBOSYVR 1.
+ N1032AC3 MSYWGYYZ 1. MSYULYWG 1.
+ N1032AC3 MSBOSYWG 1. MSYULYYZ 1.
+ N1032AC3 MSBOSYYZ 1. MSBOSYUL 1.
+ N1032AC3 P1032X23 109. P1032X34 89.
+ N1032AC3 P1032X35 76. P1032X63 44.
+ N1032AC3 P1032X45 83. P1032X64 99.
+ N1032AC3 P1032X65 130. P1032X75 85.
+ N1032AC3 P1032X76 115.
+ N1032AC4 ACOCOSTS 8.33277 OBJECTIV 8.33277
+ N1032AC4 SYSTDEPT 5. ACMILES 2.78679
+ N1032AC4 ASMILES 267.53198 LFRPMASM 187.272386
+ N1032AC4 FLAV*4 7.41556 LF1032S1 57.
+ N1032AC4 LF1032S2 67. LF1032S3 67.
+ N1032AC4 LF1032S4 67. LF1032S5 57.
+ N1032AC4 MSSEAYVR 1. MSBOSSEA 1.
+ N1032AC4 MSYVRYWG 1. MSYVRYYZ 1.
+ N1032AC4 MSYULYVR 1. MSBOSYVR 1.
+ N1032AC4 MSYWGYYZ 1. MSYULYWG 1.
+ N1032AC4 MSBOSYWG 1. MSYULYYZ 1.
+ N1032AC4 MSBOSYYZ 1. MSBOSYUL 1.
+ N1032AC4 P1032X23 109. P1032X34 89.
+ N1032AC4 P1032X35 76. P1032X63 44.
+ N1032AC4 P1032X45 83. P1032X64 99.
+ N1032AC4 P1032X65 130. P1032X75 85.
+ N1032AC4 P1032X76 115.
+ N1032AC5 ACOCOSTS 9.12932 OBJECTIV 9.12932
+ N1032AC5 SYSTDEPT 5. ACMILES 2.78679
+ N1032AC5 ASMILES 345.56226 LFRPMASM 241.893582
+ N1032AC5 FLAV*5 7.48883 LF1032S1 74.
+ N1032AC5 LF1032S2 86. LF1032S3 86.
+ N1032AC5 LF1032S4 86. LF1032S5 74.
+ N1032AC5 MSSEAYVR 1. MSBOSSEA 1.
+ N1032AC5 MSYVRYWG 1. MSYVRYYZ 1.
+ N1032AC5 MSYULYVR 1. MSBOSYVR 1.
+ N1032AC5 MSYWGYYZ 1. MSYULYWG 1.
+ N1032AC5 MSBOSYWG 1. MSYULYYZ 1.
+ N1032AC5 MSBOSYYZ 1. MSBOSYUL 1.
+ N1032AC5 P1032X23 109. P1032X34 89.
+ N1032AC5 P1032X35 76. P1032X63 44.
+ N1032AC5 P1032X45 83. P1032X64 99.
+ N1032AC5 P1032X65 130. P1032X75 85.
+ N1032AC5 P1032X76 115.
+ N1033AC1 ACOCOSTS 18.08295 OBJECTIV 18.08295
+ N1033AC1 SYSTDEPT 3. ACMILES 2.5415
+ N1033AC1 ASMILES 1031.8501 LFRPMASM 722.29507
+ N1033AC1 FLAV*1 6.58316 LF1033S1 284.
+ N1033AC1 LF1033S2 284. LF1033S3 243.
+ N1033AC1 MSYVRYWG 1. MSYULYVR 1.
+ N1033AC1 MSBOSYVR 1. MSYULYWG 1.
+ N1033AC1 MSBOSYWG 1. MSBOSYUL 1.
+ N1033AC1 P1033X23 89. P1033X42 44.
+ N1033AC1 P1033X43 99. P1033X54 115.
+ N1033AC2 ACOCOSTS 13.0472 OBJECTIV 13.0472
+ N1033AC2 SYSTDEPT 3. ACMILES 2.5415
+ N1033AC2 ASMILES 655.70752 LFRPMASM 458.995264
+ N1033AC2 FLAV*2 6.43074 LF1033S1 180.
+ N1033AC2 LF1033S2 180. LF1033S3 154.
+ N1033AC2 MSYVRYWG 1. MSYULYVR 1.
+ N1033AC2 MSBOSYVR 1. MSYULYWG 1.
+ N1033AC2 MSBOSYWG 1. MSBOSYUL 1.
+ N1033AC2 P1033X23 89. P1033X42 44.
+ N1033AC2 P1033X43 99. P1033X54 115.
+ N1033AC3 ACOCOSTS 9.33593 OBJECTIV 9.33593
+ N1033AC3 SYSTDEPT 3. ACMILES 2.5415
+ N1033AC3 ASMILES 467.63647 LFRPMASM 327.345529
+ N1033AC3 FLAV*3 6.31759 LF1033S1 128.
+ N1033AC3 LF1033S2 128. LF1033S3 110.
+ N1033AC3 MSYVRYWG 1. MSYULYVR 1.
+ N1033AC3 MSBOSYVR 1. MSYULYWG 1.
+ N1033AC3 MSBOSYWG 1. MSBOSYUL 1.
+ N1033AC3 P1033X23 89. P1033X42 44.
+ N1033AC3 P1033X43 99. P1033X54 115.
+ N1033AC4 ACOCOSTS 6.66027 OBJECTIV 6.66027
+ N1033AC4 SYSTDEPT 3. ACMILES 2.5415
+ N1033AC4 ASMILES 243.98424 LFRPMASM 170.788968
+ N1033AC4 FLAV*4 6.16384 LF1033S1 67.
+ N1033AC4 LF1033S2 67. LF1033S3 57.
+ N1033AC4 MSYVRYWG 1. MSYULYVR 1.
+ N1033AC4 MSBOSYVR 1. MSYULYWG 1.
+ N1033AC4 MSBOSYWG 1. MSBOSYUL 1.
+ N1033AC4 P1033X23 89. P1033X42 44.
+ N1033AC4 P1033X43 99. P1033X54 115.
+ N1033AC5 ACOCOSTS 7.23383 OBJECTIV 7.23383
+ N1033AC5 SYSTDEPT 3. ACMILES 2.5415
+ N1033AC5 ASMILES 315.14624 LFRPMASM 220.602368
+ N1033AC5 FLAV*5 6.25562 LF1033S1 86.
+ N1033AC5 LF1033S2 86. LF1033S3 74.
+ N1033AC5 MSYVRYWG 1. MSYULYVR 1.
+ N1033AC5 MSBOSYVR 1. MSYULYWG 1.
+ N1033AC5 MSBOSYWG 1. MSBOSYUL 1.
+ N1033AC5 P1033X23 89. P1033X42 44.
+ N1033AC5 P1033X43 99. P1033X54 115.
+ N1034AC1 ACOCOSTS 15.09963 OBJECTIV 15.09963
+ N1034AC1 SYSTDEPT 2. ACMILES 2.39258
+ N1034AC1 ASMILES 971.38599 LFRPMASM 679.970193
+ N1034AC1 FLAV*1 5.66166 LF1034S1 284.
+ N1034AC1 LF1034S2 284. MSYVRYYZ 1.
+ N1034AC1 MSYULYVR 1. MSYULYYZ 1.
+ N1034AC1 P1034X23 76. P1034X42 44.
+ N1034AC1 P1034X43 130.
+ N1034AC2 ACOCOSTS 11.02328 OBJECTIV 11.02328
+ N1034AC2 SYSTDEPT 2. ACMILES 2.39258
+ N1034AC2 ASMILES 617.28467 LFRPMASM 432.099269
+ N1034AC2 FLAV*2 5.58658 LF1034S1 180.
+ N1034AC2 LF1034S2 180. MSYVRYYZ 1.
+ N1034AC2 MSYULYVR 1. MSYULYYZ 1.
+ N1034AC2 P1034X23 76. P1034X42 44.
+ N1034AC2 P1034X43 130.
+ N1034AC3 ACOCOSTS 7.95559 OBJECTIV 7.95559
+ N1034AC3 SYSTDEPT 2. ACMILES 2.39258
+ N1034AC3 ASMILES 440.23389 LFRPMASM 308.163723
+ N1034AC3 FLAV*3 5.60122 LF1034S1 128.
+ N1034AC3 LF1034S2 128. MSYVRYYZ 1.
+ N1034AC3 MSYULYVR 1. MSYULYYZ 1.
+ N1034AC3 P1034X23 76. P1034X42 44.
+ N1034AC3 P1034X43 130.
+ N1035AC1 ACOCOSTS 13.78819 OBJECTIV 13.78819
+ N1035AC1 SYSTDEPT 2. ACMILES 2.09179
+ N1035AC1 ASMILES 849.26563 LFRPMASM 594.485941
+ N1035AC1 FLAV*1 5.11333 LF1035S1 284.
+ N1035AC1 LF1035S2 284. MSYVRYWG 1.
+ N1035AC1 MSYVRYYZ 1. MSYWGYYZ 1.
+ N1035AC1 P1035X23 89. P1035X24 76.
+ N1035AC1 P1035X34 83.
+ N1035AC2 ACOCOSTS 10.02165 OBJECTIV 10.02165
+ N1035AC2 SYSTDEPT 2. ACMILES 2.09179
+ N1035AC2 ASMILES 539.68115 LFRPMASM 377.776805
+ N1035AC2 FLAV*2 5.02682 LF1035S1 180.
+ N1035AC2 LF1035S2 180. MSYVRYWG 1.
+ N1035AC2 MSYVRYYZ 1. MSYWGYYZ 1.
+ N1035AC2 P1035X23 89. P1035X24 76.
+ N1035AC2 P1035X34 83.
+ N1035AC3 ACOCOSTS 7.20963 OBJECTIV 7.20963
+ N1035AC3 SYSTDEPT 2. ACMILES 2.09179
+ N1035AC3 ASMILES 384.88867 LFRPMASM 269.422069
+ N1035AC3 FLAV*3 5.00266 LF1035S1 128.
+ N1035AC3 LF1035S2 128. MSYVRYWG 1.
+ N1035AC3 MSYVRYYZ 1. MSYWGYYZ 1.
+ N1035AC3 P1035X23 89. P1035X24 76.
+ N1035AC3 P1035X34 83.
+ N1035AC4 ACOCOSTS 5.19931 OBJECTIV 5.19931
+ N1035AC4 SYSTDEPT 2. ACMILES 2.09179
+ N1035AC4 ASMILES 200.81155 LFRPMASM 140.568085
+ N1035AC4 FLAV*4 4.893 LF1035S1 67.
+ N1035AC4 LF1035S2 67. MSYVRYWG 1.
+ N1035AC4 MSYVRYYZ 1. MSYWGYYZ 1.
+ N1035AC4 P1035X23 89. P1035X24 76.
+ N1035AC4 P1035X34 83.
+ N1035AC5 ACOCOSTS 5.62541 OBJECTIV 5.62541
+ N1035AC5 SYSTDEPT 2. ACMILES 2.09179
+ N1035AC5 ASMILES 259.38159 LFRPMASM 181.567113
+ N1035AC5 FLAV*5 4.97605 LF1035S1 86.
+ N1035AC5 LF1035S2 86. MSYVRYWG 1.
+ N1035AC5 MSYVRYYZ 1. MSYWGYYZ 1.
+ N1035AC5 P1035X23 89. P1035X24 76.
+ N1035AC5 P1035X34 83.
+ N1036AC1 ACOCOSTS 15.74868 OBJECTIV 15.74868
+ N1036AC1 SYSTDEPT 2. ACMILES 2.54144
+ N1036AC1 ASMILES 1031.82446 LFRPMASM 722.277122
+ N1036AC1 FLAV*1 5.93304 LF1036S1 284.
+ N1036AC1 LF1036S2 243. MSYULYVR 1.
+ N1036AC1 MSBOSYVR 1. MSBOSYUL 1.
+ N1036AC1 P1036X32 44. P1036X43 115.
+ N1036AC2 ACOCOSTS 11.51899 OBJECTIV 11.51899
+ N1036AC2 SYSTDEPT 2. ACMILES 2.54144
+ N1036AC2 ASMILES 655.69141 LFRPMASM 458.983987
+ N1036AC2 FLAV*2 5.86362 LF1036S1 180.
+ N1036AC2 LF1036S2 154. MSYULYVR 1.
+ N1036AC2 MSBOSYVR 1. MSBOSYUL 1.
+ N1036AC2 P1036X32 44. P1036X43 115.
+ N1036AC3 ACOCOSTS 8.32477 OBJECTIV 8.32477
+ N1036AC3 SYSTDEPT 2. ACMILES 2.54144
+ N1036AC3 ASMILES 467.62476 LFRPMASM 327.337332
+ N1036AC3 FLAV*3 5.89746 LF1036S1 128.
+ N1036AC3 LF1036S2 110. MSYULYVR 1.
+ N1036AC3 MSBOSYVR 1. MSBOSYUL 1.
+ N1036AC3 P1036X32 44. P1036X43 115.
+ N1037AC4 ACOCOSTS 3.5884 OBJECTIV 3.5884
+ N1037AC4 SYSTDEPT 2. ACMILES 1.24837
+ N1037AC4 ASMILES 119.84406 LFRPMASM 83.890842
+ N1037AC4 FLAV*4 3.2298 LF1037S1 67.
+ N1037AC4 LF1037S2 67. MSYWGYYZ 1.
+ N1037AC4 MSYULYWG 1. MSYULYYZ 1.
+ N1037AC4 P1037X23 83. P1037X42 99.
+ N1037AC4 P1037X43 130.
+ N1037AC5 ACOCOSTS 3.92172 OBJECTIV 3.92172
+ N1037AC5 SYSTDEPT 2. ACMILES 1.24837
+ N1037AC5 ASMILES 154.79855 LFRPMASM 108.358985
+ N1037AC5 FLAV*5 3.26646 LF1037S1 86.
+ N1037AC5 LF1037S2 86. MSYWGYYZ 1.
+ N1037AC5 MSYULYWG 1. MSYULYYZ 1.
+ N1037AC5 P1037X23 83. P1037X42 99.
+ N1037AC5 P1037X43 130.
+ N1038AC4 ACOCOSTS 2.38548 OBJECTIV 2.38548
+ N1038AC4 SYSTDEPT 1. ACMILES .93376
+ N1038AC4 ASMILES 89.64105 LFRPMASM 62.748735
+ N1038AC4 FLAV*4 2.22538 LF1038S1 67.
+ N1038AC4 MSYWGYYZ 1. P1038X23 83.
+ N1038AC5 ACOCOSTS 2.5862 OBJECTIV 2.5862
+ N1038AC5 SYSTDEPT 1. ACMILES .93376
+ N1038AC5 ASMILES 115.78636 LFRPMASM 81.050452
+ N1038AC5 FLAV*5 2.26073 LF1038S1 86.
+ N1038AC5 MSYWGYYZ 1. P1038X23 83.
+ N1039AC4 ACOCOSTS 2.75896 OBJECTIV 2.75896
+ N1039AC4 SYSTDEPT 1. ACMILES 1.1293
+ N1039AC4 ASMILES 108.41281 LFRPMASM 75.888967
+ N1039AC4 FLAV*4 2.61098 LF1039S1 67.
+ N1039AC4 MSYULYWG 1. P1039X32 99.
+ N1039AC5 ACOCOSTS 2.98119 OBJECTIV 2.98119
+ N1039AC5 SYSTDEPT 1. ACMILES 1.1293
+ N1039AC5 ASMILES 140.03325 LFRPMASM 98.023275
+ N1039AC5 FLAV*5 2.65709 LF1039S1 86.
+ N1039AC5 MSYULYWG 1. P1039X32 99.
+ N1040AC4 ACOCOSTS 2.29039 OBJECTIV 2.29039
+ N1040AC4 SYSTDEPT 2. ACMILES .56879
+ N1040AC4 ASMILES 54.60388 LFRPMASM 38.222716
+ N1040AC4 FLAV*4 1.88965 LF1040S1 67.
+ N1040AC4 LF1040S2 57. MSYULYYZ 1.
+ N1040AC4 MSBOSYYZ 1. MSBOSYUL 1.
+ N1040AC4 P1040X32 130. P1040X42 85.
+ N1040AC4 P1040X43 115.
+ N1040AC5 ACOCOSTS 2.54896 OBJECTIV 2.54896
+ N1040AC5 SYSTDEPT 2. ACMILES .56879
+ N1040AC5 ASMILES 70.53 LFRPMASM 49.371
+ N1040AC5 FLAV*5 1.88894 LF1040S1 86.
+ N1040AC5 LF1040S2 74. MSYULYYZ 1.
+ N1040AC5 MSBOSYYZ 1. MSBOSYUL 1.
+ N1040AC5 P1040X32 130. P1040X42 85.
+ N1040AC5 P1040X43 115.
+ N1040AC6 ACOCOSTS 1.93457 OBJECTIV 1.93457
+ N1040AC6 SYSTDEPT 2. ACMILES .56879
+ N1040AC6 ASMILES 54.0351 LFRPMASM 37.82457
+ N1040AC6 FLAV*6 1.94992 LF1040S1 66.
+ N1040AC6 LF1040S2 56. MSYULYYZ 1.
+ N1040AC6 MSBOSYYZ 1. MSBOSYUL 1.
+ N1040AC6 P1040X32 130. P1040X42 85.
+ N1040AC6 P1040X43 115.
+ N1041AC4 ACOCOSTS 1.20291 OBJECTIV 1.20291
+ N1041AC4 SYSTDEPT 1. ACMILES .31461
+ N1041AC4 ASMILES 30.20299 LFRPMASM 21.142093
+ N1041AC4 FLAV*4 1.00442 LF1041S1 67.
+ N1041AC4 MSYULYYZ 1. P1041X32 130.
+ N1041AC5 ACOCOSTS 1.33552 OBJECTIV 1.33552
+ N1041AC5 SYSTDEPT 1. ACMILES .31461
+ N1041AC5 ASMILES 39.01219 LFRPMASM 27.308533
+ N1041AC5 FLAV*5 1.00572 LF1041S1 86.
+ N1041AC5 MSYULYYZ 1. P1041X32 130.
+ N1041AC6 ACOCOSTS 1.02289 OBJECTIV 1.02289
+ N1041AC6 SYSTDEPT 1. ACMILES .31461
+ N1041AC6 ASMILES 29.88837 LFRPMASM 20.921859
+ N1041AC6 FLAV*6 1.04456 LF1041S1 66.
+ N1041AC6 MSYULYYZ 1. P1041X32 130.
+ N1042AC4 ACOCOSTS 1.08748 OBJECTIV 1.08748
+ N1042AC4 SYSTDEPT 1. ACMILES .25418
+ N1042AC4 ASMILES 24.40089 LFRPMASM 17.080623
+ N1042AC4 FLAV*4 .88524 LF1042S1 57.
+ N1042AC4 MSBOSYUL 1. P1042X32 115.
+ N1042AC5 ACOCOSTS 1.21344 OBJECTIV 1.21344
+ N1042AC5 SYSTDEPT 1. ACMILES .25418
+ N1042AC5 ASMILES 31.51784 LFRPMASM 22.062488
+ N1042AC5 FLAV*5 .88321 LF1042S1 74.
+ N1042AC5 MSBOSYUL 1. P1042X32 115.
+ N1042AC6 ACOCOSTS .91168 OBJECTIV .91168
+ N1042AC6 SYSTDEPT 1. ACMILES .25418
+ N1042AC6 ASMILES 24.14673 LFRPMASM 16.902711
+ N1042AC6 FLAV*6 .90537 LF1042S1 56.
+ N1042AC6 MSBOSYUL 1. P1042X32 115.
+ N1043AC1 ACOCOSTS 13.18536 OBJECTIV 13.18536
+ N1043AC1 SYSTDEPT 1. ACMILES 2.48884
+ N1043AC1 ASMILES 1010.47021 LFRPMASM 707.329147
+ N1043AC1 FLAV*1 5.18716 LF1043S1 284.
+ N1043AC1 MSBOSSEA 1.
+ N1043AC2 ACOCOSTS 9.81585 OBJECTIV 9.81585
+ N1043AC2 SYSTDEPT 1. ACMILES 2.48884
+ N1043AC2 ASMILES 642.12134 LFRPMASM 449.484938
+ N1043AC2 FLAV*2 5.19874 LF1043S1 180.
+ N1043AC2 MSBOSSEA 1.
+ N1043AC3 ACOCOSTS 7.18333 OBJECTIV 7.18333
+ N1043AC3 SYSTDEPT 1. ACMILES 2.48884
+ N1043AC3 ASMILES 457.94702 LFRPMASM 320.562914
+ N1043AC3 FLAV*3 5.3728 LF1043S1 128.
+ N1043AC3 MSBOSSEA 1.
+ N1044AC1 ACOCOSTS 14.09924 OBJECTIV 14.09924
+ N1044AC1 SYSTDEPT 1. ACMILES 2.69845
+ N1044AC1 ASMILES 1095.56982 LFRPMASM 766.898874
+ N1044AC1 FLAV*1 5.56927 LF1044S1 243.
+ N1044AC1 MSBOSSFO 1. P1044X32 73.
+ N1044AC2 ACOCOSTS 10.51384 OBJECTIV 10.51384
+ N1044AC2 SYSTDEPT 1. ACMILES 2.69845
+ N1044AC2 ASMILES 696.19995 LFRPMASM 487.339965
+ N1044AC2 FLAV*2 5.58881 LF1044S1 154.
+ N1044AC2 MSBOSSFO 1. P1044X32 73.
+ N1044AC3 ACOCOSTS 7.70315 OBJECTIV 7.70315
+ N1044AC3 SYSTDEPT 1. ACMILES 2.69845
+ N1044AC3 ASMILES 496.51465 LFRPMASM 347.560255
+ N1044AC3 FLAV*3 5.78991 LF1044S1 110.
+ N1044AC3 MSBOSSFO 1. P1044X32 73.
+ N1046AC3 ACOCOSTS 9.52503 OBJECTIV 9.52503
+ N1046AC3 SYSTDEPT 2. ACMILES 3.02542
+ N1046AC3 ASMILES 556.67676 LFRPMASM 389.673732
+ N1046AC3 FLAV*3 6.86058 LF1046S1 128.
+ N1046AC3 LF1046S2 128. MSLAXOAK 1.
+ N1046AC3 MSBOSOAK 1. P1046X23 46.
+ N1047AC1 ACOCOSTS 31.37592 OBJECTIV 31.37592
+ N1047AC1 SYSTDEPT 3. ACMILES 5.59035
+ N1047AC1 ASMILES 2269.68188 LFRPMASM 1588.777316
+ N1047AC1 FLAV*1 12.14121 LF1047S1 243.
+ N1047AC1 LF1047S2 243. LF1047S3 243.
+ N1047AC1 MSHNLLAX 1. MSHNLSFO 1.
+ N1047AC1 MSBOSHNL 1. MSLAXSFO 1.
+ N1047AC1 MSBOSSFO 1. P1047X23 118.
+ N1047AC1 P1047X34 168. P1047X54 73.
+ N1047AC2 ACOCOSTS 23.19986 OBJECTIV 23.19986
+ N1047AC2 SYSTDEPT 3. ACMILES 5.59035
+ N1047AC2 ASMILES 1442.30981 LFRPMASM 1009.616867
+ N1047AC2 FLAV*2 12.10464 LF1047S1 154.
+ N1047AC2 LF1047S2 154. LF1047S3 154.
+ N1047AC2 MSHNLLAX 1. MSHNLSFO 1.
+ N1047AC2 MSBOSHNL 1. MSLAXSFO 1.
+ N1047AC2 MSBOSSFO 1. P1047X23 118.
+ N1047AC2 P1047X34 168. P1047X54 73.
+ N1047AC3 ACOCOSTS 16.89706 OBJECTIV 16.89706
+ N1047AC3 SYSTDEPT 3. ACMILES 5.59035
+ N1047AC3 ASMILES 1028.62451 LFRPMASM 720.037157
+ N1047AC3 FLAV*3 12.3848 LF1047S1 110.
+ N1047AC3 LF1047S2 110. LF1047S3 110.
+ N1047AC3 MSHNLLAX 1. MSHNLSFO 1.
+ N1047AC3 MSBOSHNL 1. MSLAXSFO 1.
+ N1047AC3 MSBOSSFO 1. P1047X23 118.
+ N1047AC3 P1047X34 168. P1047X54 73.
+ N1050AC3 ACOCOSTS 4.50544 OBJECTIV 4.50544
+ N1050AC3 SYSTDEPT 2. ACMILES 1.00139
+ N1050AC3 ASMILES 184.25568 LFRPMASM 128.978976
+ N1050AC3 FLAV*3 2.83276 LF1050S1 110.
+ N1050AC3 LF1050S2 128. MSLAXSEA 1.
+ N1050AC3 MSONTSEA 1. P1050X32 139.
+ N1050AC3 P1050X42 25.
+ N1050AC4 ACOCOSTS 3.11665 OBJECTIV 3.11665
+ N1050AC4 SYSTDEPT 2. ACMILES 1.00139
+ N1050AC4 ASMILES 96.13336 LFRPMASM 67.293352
+ N1050AC4 FLAV*4 2.74274 LF1050S1 57.
+ N1050AC4 LF1050S2 67. MSLAXSEA 1.
+ N1050AC4 MSONTSEA 1. P1050X32 139.
+ N1050AC4 P1050X42 25.
+ N1050AC5 ACOCOSTS 3.42281 OBJECTIV 3.42281
+ N1050AC5 SYSTDEPT 2. ACMILES 1.00139
+ N1050AC5 ASMILES 124.1723 LFRPMASM 86.92061
+ N1050AC5 FLAV*5 2.76582 LF1050S1 74.
+ N1050AC5 LF1050S2 86. MSLAXSEA 1.
+ N1050AC5 MSONTSEA 1. P1050X32 139.
+ N1050AC5 P1050X42 25.
+ N1051AC1 ACOCOSTS 3.80996 OBJECTIV 3.80996
+ N1051AC1 SYSTDEPT 1. ACMILES .33852
+ N1051AC1 ASMILES 137.44067 LFRPMASM 96.208469
+ N1051AC1 FLAV*1 1.26713 LF1051S1 243.
+ N1051AC1 MSLAXSFO 1. P1051X23 168.
+ N1051AC2 ACOCOSTS 2.65528 OBJECTIV 2.65528
+ N1051AC2 SYSTDEPT 1. ACMILES .33852
+ N1051AC2 ASMILES 87.33911 LFRPMASM 61.137377
+ N1051AC2 FLAV*2 1.19699 LF1051S1 154.
+ N1051AC2 MSLAXSFO 1. P1051X23 168.
+ N1051AC3 ACOCOSTS 1.85054 OBJECTIV 1.85054
+ N1051AC3 SYSTDEPT 1. ACMILES .33852
+ N1051AC3 ASMILES 62.28839 LFRPMASM 43.601873
+ N1051AC3 FLAV*3 1.09366 LF1051S1 110.
+ N1051AC3 MSLAXSFO 1. P1051X23 168.
+ N1051AC4 ACOCOSTS 1.24858 OBJECTIV 1.24858
+ N1051AC4 SYSTDEPT 1. ACMILES .33852
+ N1051AC4 ASMILES 32.49829 LFRPMASM 22.748803
+ N1051AC4 FLAV*4 1.05157 LF1051S1 57.
+ N1051AC4 MSLAXSFO 1. P1051X23 168.
+ N1051AC5 ACOCOSTS 1.38382 OBJECTIV 1.38382
+ N1051AC5 SYSTDEPT 1. ACMILES .33852
+ N1051AC5 ASMILES 41.97696 LFRPMASM 29.383872
+ N1051AC5 FLAV*5 1.05419 LF1051S1 74.
+ N1051AC5 MSLAXSFO 1. P1051X23 168.
+ N1051AC6 ACOCOSTS 1.06688 OBJECTIV 1.06688
+ N1051AC6 SYSTDEPT 1. ACMILES .33852
+ N1051AC6 ASMILES 32.15976 LFRPMASM 22.511832
+ N1051AC6 FLAV*6 1.09962 LF1051S1 56.
+ N1051AC6 MSLAXSFO 1. P1051X23 168.
+RHS
+ RHS1 SYSTDEPT 200. FLAV*1 10.5
+ RHS1 FLAV*2 13.65 FLAV*3 23.5
+ RHS1 FLAV*4 21.75 FLAV*5 21.75
+ RHS1 FLAV*6 24.3 DMBOSHNL 12.
+ RHS1 DMBOSLAX 14. DMBOSSEA 45.
+ RHS1 DMBOSSFO 122. DMBOSTPE 1.
+ RHS1 DMBOSTYO 3. DMBOSYUL 676.
+ RHS1 DMBOSYVR 26. DMBOSYWG 37.
+ RHS1 DMBOSYYZ 215. DMBUROAK 27.
+ RHS1 DMBURSEA 52. DMBURSFO 271.
+ RHS1 DMHNLLAX 297. DMHNLLON 5.
+ RHS1 DMHNLPAR 1. DMHNLSEA 112.
+ RHS1 DMHNLSFO 35. DMHNLYVR 67.
+ RHS1 DMLASSEA 370. DMLASYVR 37.
+ RHS1 DMLAXOAK 78. DMLAXSEA 813.
+ RHS1 DMLAXSFO 2952. DMLAXTPE 31.
+ RHS1 DMLAXTYO 41. DMLAXYVR 193.
+ RHS1 DMLONPAR 2. DMLONSEA 92.
+ RHS1 DMLONYVR 51. DMOAKONT 13.
+ RHS1 DMOAKSEA 110. DMONTSFO 173.
+ RHS1 DMONTSEA 42. DMPARSEA 36.
+ RHS1 DMPARYVR 24. DMRNOSEA 284.
+ RHS1 DMRNOYVR 67. DMSEASFO 1417.
+ RHS1 DMSEATPE 47. DMSEATYO 114.
+ RHS1 DMSEAYVR 547. DMSFOTPE 6.
+ RHS1 DMSFOTYO 17. DMSFOYVR 298.
+ RHS1 DMTPETYO 111. DMTPEYVR 17.
+ RHS1 DMTYOYVR 42. DMYULYVR 262.
+ RHS1 DMYULYWG 413. DMYULYYZ 2612.
+ RHS1 DMYVRYWG 375. DMYVRYYZ 318.
+ RHS1 DMYWGYYZ 278. DMBOSOAK 11.
+ RHS1 DMBOSBUR 7. DMBOSONT 4.
+ RHS1 DMBURYVR 26. DMBURTYO 2.
+ RHS1 DMBURTPE 1. DMBURHNL 11.
+ RHS1 DMHNLOAK 24. DMHNLONT 16.
+ RHS1 DMHNLYWG 3. DMHNLYYZ 24.
+ RHS1 DMHNLYUL 40. DMLASTYO 5.
+ RHS1 DMLASTPE 1. DMLAXLON 13.
+ RHS1 DMLAXPAR 8. DMBURLON 1.
+ RHS1 DMBURPAR 1. DMLONONT 1.
+ RHS1 DMLONOAK 1. DMOAKPAR 2.
+ RHS1 DMOAKTYO 7. DMOAKTPE 2.
+ RHS1 DMONTPAR 2. DMONTTYO 2.
+ RHS1 DMONTTPE 1. DMPARSFO 2.
+ RHS1 DMRNOTYO 5. DMRNOTPE 2.
+ RHS1 DMTPEYWG 21. DMTPEYYZ 13.
+ RHS1 DMTPEYUL 6. DMTYOYUL 7.
+ RHS1 DMTYOYYZ 17. DMTYOYWG 25.
+ RHS1 MSBOSHNL 1. MSBOSSEA 1.
+ RHS1 MSBOSSFO 2. MSBOSYUL 7.
+ RHS1 MSBOSYVR 1. MSBOSYWG 1.
+ RHS1 MSBOSYYZ 3. MSBUROAK 1.
+ RHS1 MSBURSEA 1. MSBURSFO 4.
+ RHS1 MSHNLLAX 3. MSHNLSEA 2.
+ RHS1 MSHNLSFO 1. MSHNLYVR 2.
+ RHS1 MSLASSEA 4. MSLASYVR 1.
+ RHS1 MSLAXOAK 2. MSLAXSEA 7.
+ RHS1 MSLAXSFO 21. MSLAXTPE 2.
+ RHS1 MSLAXYVR 3. MSLONPAR 1.
+ RHS1 MSLONSEA 1. MSLONYVR 1.
+ RHS1 MSOAKONT 1. MSOAKSEA 3.
+ RHS1 MSONTSFO 3. MSONTSEA 2.
+ RHS1 MSPARSEA 1. MSRNOSEA 4.
+ RHS1 MSRNOYVR 1. MSSEASFO 10.
+ RHS1 MSSEATPE 1. MSSEATYO 1.
+ RHS1 MSSEAYVR 6. MSSFOYVR 5.
+ RHS1 MSTPETYO 1. MSYULYVR 7.
+ RHS1 MSYULYWG 5. MSYULYYZ 24.
+ RHS1 MSYVRYWG 5. MSYVRYYZ 5.
+ RHS1 MSYWGYYZ 4. MSBOSOAK 1.
+ RHS1 MSHNLOAK 1. MSLAXLON 1.
+ RHS1 NOPTLON0 4. NOPTLON1 2.
+ RHS1 NOPTTYO0 4. NOPTTYO1 2.
+RANGES
+ RANGE1 DMBOSHNL 2. DMBOSLAX 2.
+ RANGE1 DMBOSSEA 5. DMBOSSFO 13.
+ RANGE1 DMBOSTPE 1. DMBOSTYO 3.
+ RANGE1 DMBOSYUL 68. DMBOSYVR 3.
+ RANGE1 DMBOSYWG 4. DMBOSYYZ 22.
+ RANGE1 DMBUROAK 3. DMBURSEA 6.
+ RANGE1 DMBURSFO 28. DMHNLLAX 30.
+ RANGE1 DMHNLLON 5. DMHNLPAR 1.
+ RANGE1 DMHNLSEA 12. DMHNLSFO 4.
+ RANGE1 DMHNLYVR 7. DMLASSEA 38.
+ RANGE1 DMLASYVR 4. DMLAXOAK 8.
+ RANGE1 DMLAXSEA 82. DMLAXSFO 296.
+ RANGE1 DMLAXTPE 4. DMLAXTYO 5.
+ RANGE1 DMLAXYVR 20. DMLONPAR 2.
+ RANGE1 DMLONSEA 10. DMLONYVR 6.
+ RANGE1 DMOAKONT 2. DMOAKSEA 12.
+ RANGE1 DMONTSFO 18. DMONTSEA 5.
+ RANGE1 DMPARSEA 4. DMPARYVR 3.
+ RANGE1 DMRNOSEA 29. DMRNOYVR 7.
+ RANGE1 DMSEASFO 142. DMSEATPE 5.
+ RANGE1 DMSEATYO 12. DMSEAYVR 55.
+ RANGE1 DMSFOTPE 6. DMSFOTYO 2.
+ RANGE1 DMSFOYVR 30. DMTPETYO 12.
+ RANGE1 DMTPEYVR 2. DMTYOYVR 5.
+ RANGE1 DMYULYVR 27. DMYULYWG 42.
+ RANGE1 DMYULYYZ 262. DMYVRYWG 38.
+ RANGE1 DMYVRYYZ 32. DMYWGYYZ 28.
+ RANGE1 DMBOSOAK 2. DMBOSBUR 7.
+ RANGE1 DMBOSONT 4. DMBURYVR 3.
+ RANGE1 DMBURTYO 2. DMBURTPE 1.
+ RANGE1 DMBURHNL 2. DMHNLOAK 3.
+ RANGE1 DMHNLONT 2. DMHNLYWG 3.
+ RANGE1 DMHNLYYZ 3. DMHNLYUL 5.
+ RANGE1 DMLASTYO 5. DMLASTPE 1.
+ RANGE1 DMLAXLON 2. DMLAXPAR 8.
+ RANGE1 DMBURLON 1. DMBURPAR 1.
+ RANGE1 DMLONONT 1. DMLONOAK 1.
+ RANGE1 DMOAKPAR 2. DMOAKTYO 7.
+ RANGE1 DMOAKTPE 2. DMONTPAR 2.
+ RANGE1 DMONTTYO 2. DMONTTPE 1.
+ RANGE1 DMPARSFO 2. DMRNOTYO 5.
+ RANGE1 DMRNOTPE 2. DMTPEYWG 3.
+ RANGE1 DMTPEYYZ 2. DMTPEYUL 6.
+ RANGE1 DMTYOYUL 7. DMTYOYYZ 2.
+ RANGE1 DMTYOYWG 3.
+BOUNDS
+ LO INTBOU GRDTIMN1 -105.
+ UP INTBOU GRDTIMN1 0.
+ LO INTBOU GRDTIMN2 -91.
+ UP INTBOU GRDTIMN2 0.
+ LO INTBOU GRDTIMN3 -47.
+ UP INTBOU GRDTIMN3 0.
+ LO INTBOU GRDTIMN4 -43.5
+ UP INTBOU GRDTIMN4 0.
+ LO INTBOU GRDTIMN5 -87.
+ UP INTBOU GRDTIMN5 0.
+ LO INTBOU GRDTIMN6 -81.
+ UP INTBOU GRDTIMN6 0.
+ UP INTBOU N1001AC1 3.
+ UP INTBOU N1001AC2 3.
+ UP INTBOU N1001AC3 3.
+ UP INTBOU N1002AC1 3.
+ UP INTBOU N1002AC2 3.
+ UP INTBOU N1002AC3 3.
+ UP INTBOU N1003AC1 4.
+ UP INTBOU N1003AC2 4.
+ UP INTBOU N1003AC3 4.
+ UP INTBOU N1004AC1 4.
+ UP INTBOU N1004AC2 4.
+ UP INTBOU N1004AC3 4.
+ UP INTBOU N1005AC3 2.
+ UP INTBOU N1105AC3 1.
+ UP INTBOU N1006AC3 2.
+ UP INTBOU N1007AC1 2.
+ UP INTBOU N1007AC2 2.
+ UP INTBOU N1007AC3 2.
+ UP INTBOU N1008AC1 7.
+ UP INTBOU N1008AC2 7.
+ UP INTBOU N1008AC3 7.
+ UP INTBOU N1008AC4 7.
+ UP INTBOU N1008AC5 7.
+ UP INTBOU N1008AC6 7.
+ UP INTBOU N1009AC1 7.
+ UP INTBOU N1009AC2 7.
+ UP INTBOU N1009AC3 7.
+ UP INTBOU N1009AC4 7.
+ UP INTBOU N1009AC5 7.
+ UP INTBOU N1010AC1 7.
+ UP INTBOU N1010AC2 7.
+ UP INTBOU N1010AC3 7.
+ UP INTBOU N1010AC4 7.
+ UP INTBOU N1010AC5 7.
+ UP INTBOU N1010AC6 7.
+ UP INTBOU N1011AC1 7.
+ UP INTBOU N1011AC2 7.
+ UP INTBOU N1011AC3 7.
+ UP INTBOU N1011AC4 7.
+ UP INTBOU N1011AC5 7.
+ UP INTBOU N1011AC6 7.
+ UP INTBOU N1012AC1 7.
+ UP INTBOU N1012AC2 7.
+ UP INTBOU N1012AC3 7.
+ UP INTBOU N1012AC4 7.
+ UP INTBOU N1012AC5 7.
+ UP INTBOU N1013AC3 4.
+ UP INTBOU N1013AC4 4.
+ UP INTBOU N1013AC5 4.
+ UP INTBOU N1013AC6 4.
+ UP INTBOU N1014AC3 4.
+ UP INTBOU N1014AC4 4.
+ UP INTBOU N1014AC5 4.
+ UP INTBOU N1014AC6 4.
+ UP INTBOU N1015AC3 4.
+ UP INTBOU N1015AC4 4.
+ UP INTBOU N1015AC5 4.
+ UP INTBOU N1015AC6 4.
+ UP INTBOU N1016AC3 4.
+ UP INTBOU N1016AC4 4.
+ UP INTBOU N1016AC5 4.
+ UP INTBOU N1016AC6 4.
+ UP INTBOU N1017AC3 4.
+ UP INTBOU N1017AC4 4.
+ UP INTBOU N1017AC5 4.
+ UP INTBOU N1017AC6 4.
+ UP INTBOU N1018AC1 7.
+ UP INTBOU N1018AC2 7.
+ UP INTBOU N1018AC3 7.
+ UP INTBOU N1018AC4 7.
+ UP INTBOU N1018AC5 7.
+ UP INTBOU N1018AC6 7.
+ UP INTBOU N1019AC1 7.
+ UP INTBOU N1019AC2 7.
+ UP INTBOU N1019AC3 7.
+ UP INTBOU N1019AC4 7.
+ UP INTBOU N1019AC5 7.
+ UP INTBOU N1020AC1 7.
+ UP INTBOU N1020AC2 7.
+ UP INTBOU N1020AC3 7.
+ UP INTBOU N1020AC4 7.
+ UP INTBOU N1020AC5 7.
+ UP INTBOU N1020AC6 7.
+ UP INTBOU N1021AC1 7.
+ UP INTBOU N1021AC2 7.
+ UP INTBOU N1021AC3 7.
+ UP INTBOU N1021AC4 7.
+ UP INTBOU N1021AC5 7.
+ UP INTBOU N1022AC1 1.
+ UP INTBOU N1023AC1 1.
+ UP INTBOU N1026AC1 1.
+ UP INTBOU N1027AC1 1.
+ UP INTBOU N1028AC1 1.
+ UP INTBOU N1029AC1 1.
+ UP INTBOU N1030AC1 1.
+ UP INTBOU N1032AC1 1.
+ UP INTBOU N1032AC2 1.
+ UP INTBOU N1032AC3 1.
+ UP INTBOU N1032AC4 1.
+ UP INTBOU N1032AC5 1.
+ UP INTBOU N1033AC1 5.
+ UP INTBOU N1033AC2 5.
+ UP INTBOU N1033AC3 5.
+ UP INTBOU N1033AC4 5.
+ UP INTBOU N1033AC5 5.
+ UP INTBOU N1034AC1 5.
+ UP INTBOU N1034AC2 5.
+ UP INTBOU N1034AC3 5.
+ UP INTBOU N1035AC1 5.
+ UP INTBOU N1035AC2 5.
+ UP INTBOU N1035AC3 5.
+ UP INTBOU N1035AC4 5.
+ UP INTBOU N1035AC5 5.
+ UP INTBOU N1036AC1 5.
+ UP INTBOU N1036AC2 5.
+ UP INTBOU N1036AC3 5.
+ UP INTBOU N1037AC4 5.
+ UP INTBOU N1037AC5 5.
+ UP INTBOU N1038AC4 10.
+ UP INTBOU N1038AC5 10.
+ UP INTBOU N1039AC4 7.
+ UP INTBOU N1039AC5 7.
+ UP INTBOU N1040AC4 10.
+ UP INTBOU N1040AC5 10.
+ UP INTBOU N1040AC6 10.
+ UP INTBOU N1041AC4 20.
+ UP INTBOU N1041AC5 20.
+ UP INTBOU N1041AC6 20.
+ UP INTBOU N1042AC4 20.
+ UP INTBOU N1042AC5 20.
+ UP INTBOU N1042AC6 20.
+ UP INTBOU N1043AC1 3.
+ UP INTBOU N1043AC2 3.
+ UP INTBOU N1043AC3 3.
+ UP INTBOU N1044AC1 3.
+ UP INTBOU N1044AC2 3.
+ UP INTBOU N1044AC3 3.
+ UP INTBOU N1046AC3 2.
+ UP INTBOU N1047AC1 1.
+ UP INTBOU N1047AC2 1.
+ UP INTBOU N1047AC3 1.
+ UP INTBOU N1050AC3 5.
+ UP INTBOU N1050AC4 5.
+ UP INTBOU N1050AC5 5.
+ UP INTBOU N1051AC1 20.
+ UP INTBOU N1051AC2 20.
+ UP INTBOU N1051AC3 20.
+ UP INTBOU N1051AC4 20.
+ UP INTBOU N1051AC5 20.
+ UP INTBOU N1051AC6 20.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing2.mps b/demos/ppl_lpsol/examples/boeing2.mps
new file mode 100644
index 0000000..254aed7
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing2.mps
@@ -0,0 +1,970 @@
+NAME BOEING2
+ROWS
+ G REVENUES
+ G ACOCOSTS
+ N OBJECTIV
+ L FUELAVAL
+ G SYSTDEPT
+ G ACMILES
+ G ASMILES
+ G PASSNGRS
+ G RPMILES
+ G LFRPMASM
+ G ATONMILE
+ G RTONMILE
+ G LFTNMILE
+ E FLAV*1
+ E FLAV*2
+ E FLAV*3
+ E FLAV*4
+ G LF1003S1
+ G LF1003B1
+ G LF1003C1
+ G LF1005S1
+ G LF1005B1
+ G LF1005C1
+ G LF1011S1
+ G LF1011S2
+ G LF1011B1
+ G LF1011B2
+ G LF1011C1
+ G LF1011C2
+ G LF1013S1
+ G LF1013S2
+ G LF1013B1
+ G LF1013B2
+ G LF1013C1
+ G LF1013C2
+ G LF1015S1
+ G LF1015B1
+ G LF1015C1
+ G LF1017S1
+ G LF1017B1
+ G LF1017C1
+ G LF1019S1
+ G LF1019S2
+ G LF1019B1
+ G LF1019B2
+ G LF1019C1
+ G LF1019C2
+ G LF1021S1
+ G LF1021B1
+ G LF1021C1
+ G LF1002S1
+ G LF1002B1
+ G LF1002C1
+ G LF1004S1
+ G LF1004B1
+ G LF1004C1
+ G LF1006S1
+ G LF1006S2
+ G LF1006B1
+ G LF1006B2
+ G LF1006C1
+ G LF1006C2
+ G LF1008S1
+ G LF1008S2
+ G LF1008B1
+ G LF1008B2
+ G LF1008C1
+ G LF1008C2
+ G LF1010S1
+ G LF1010S2
+ G LF1010S3
+ G LF1010B1
+ G LF1010B2
+ G LF1010B3
+ G LF1010C1
+ G LF1010C2
+ G LF1010C3
+ G LF1012S1
+ G LF1012B1
+ G LF1012C1
+ G LF1014S1
+ G LF1014S2
+ G LF1014B1
+ G LF1014B2
+ G LF1014C1
+ G LF1014C2
+ G LF1100S1
+ G LF1100S2
+ G LF1100S3
+ G LF1100S4
+ G LF1100S5
+ G LF1100B1
+ G LF1100B2
+ G LF1100B3
+ G LF1100B4
+ G LF1100B5
+ G LF1100C1
+ G LF1100C2
+ G LF1100C3
+ G LF1100C4
+ G LF1100C5
+ G LF1102S1
+ G LF1102S2
+ G LF1102S3
+ G LF1102S4
+ G LF1102B1
+ G LF1102B2
+ G LF1102B3
+ G LF1102B4
+ G LF1102C1
+ G LF1102C2
+ G LF1102C3
+ G LF1102C4
+ G LF1200S1
+ G LF1200B1
+ G LF1200C1
+ G LF1201S1
+ G LF1201B1
+ G LF1201C1
+ G NOPTCLE0
+ G CONTBOS1
+ G CONTBOS2
+ G CONTBOS3
+ G CONTBOS4
+ G CONTORD1
+ G CONTORD2
+ G CONTORD3
+ G CONTORD4
+ G CONTLGA2
+ G CONTLGA4
+ G CONTCLE1
+ G CONTCLE2
+ G CONTCLE3
+ G CONTCLE4
+ L DMBOSORD
+ L DMBOSLGA
+ L DMBOSCLE
+ L DMORDBOS
+ L DMORDLGA
+ L DMORDCLE
+ L DMLGABOS
+ L DMLGAORD
+ L DMLGACLE
+ L DMCLEBOS
+ L DMCLEORD
+ L DMCLELGA
+ G MSBOSORD
+ G MSBOSLGA
+ G MSBOSCLE
+ G MSORDBOS
+ G MSORDLGA
+ G MSORDCLE
+ G MSLGABOS
+ G MSLGAORD
+ G MSLGACLE
+ G MSCLEBOS
+ G MSCLEORD
+ G MSCLELGA
+ L DCBOSORD
+ L DCBOSCLE
+ L DCORDBOS
+ L DCORDLGA
+ L DCLGAORD
+ L DCLGACLE
+ L DCCLELGA
+ G MCORDBOS
+ G MCLGAORD
+COLUMNS
+ PBOSORD0 REVENUES .075 OBJECTIV -.075
+ PBOSORD0 PASSNGRS 1. RPMILES .86441
+ PBOSORD0 LFRPMASM -.86441 DMBOSORD 1.
+ PBOSORD0 LF1003S1 -1.
+ PBOSORD1 REVENUES .075 OBJECTIV -.075
+ PBOSORD1 PASSNGRS 1. RPMILES .87605
+ PBOSORD1 LFRPMASM -.87605 DMBOSORD 1.
+ PBOSORD1 LF1011S1 -1. LF1011S2 -1.
+ PBOSORD2 REVENUES .075 OBJECTIV -.075
+ PBOSORD2 PASSNGRS 1. RPMILES .91637
+ PBOSORD2 LFRPMASM -.91637 DMBOSORD 1.
+ PBOSORD2 LF1013S1 -1. LF1013S2 -1.
+ PBOSORD3 REVENUES .075 OBJECTIV -.075
+ PBOSORD3 PASSNGRS 1. RPMILES .91722
+ PBOSORD3 LFRPMASM -.91722 DMBOSORD 1.
+ PBOSORD3 LF1100S1 -1. LF1100S2 -1.
+ PBOSORD3 LF1100S3 -1.
+ PBOSORD4 REVENUES .075 OBJECTIV -.075
+ PBOSORD4 PASSNGRS 1. RPMILES .87605
+ PBOSORD4 LFRPMASM -.87605 DMBOSORD 1.
+ PBOSORD4 LF1102S1 -1. LF1102S2 -1.
+ PBOSLGA0 REVENUES .027 OBJECTIV -.027
+ PBOSLGA0 PASSNGRS 1. RPMILES .18557
+ PBOSLGA0 LFRPMASM -.18557 DMBOSLGA 1.
+ PBOSLGA0 LF1013S1 -1.
+ PBOSLGA1 REVENUES .027 OBJECTIV -.027
+ PBOSLGA1 PASSNGRS 1. RPMILES .18557
+ PBOSLGA1 LFRPMASM -.18557 DMBOSLGA 1.
+ PBOSLGA1 LF1100S1 -1.
+ PBOSLGA2 REVENUES .027 OBJECTIV -.027
+ PBOSLGA2 PASSNGRS 1. RPMILES 1.60685
+ PBOSLGA2 LFRPMASM -1.60685 DMBOSLGA 1.
+ PBOSLGA2 LF1102S1 -1. LF1102S2 -1.
+ PBOSLGA2 LF1102S3 -1.
+ PBOSLGA3 REVENUES .027 OBJECTIV -.027
+ PBOSLGA3 PASSNGRS 1. RPMILES .18557
+ PBOSLGA3 LFRPMASM -.18557 DMBOSLGA 1.
+ PBOSLGA3 LF1200S1 -1.
+ PBOSCLE0 REVENUES .053 OBJECTIV -.053
+ PBOSCLE0 PASSNGRS 1. RPMILES .56156
+ PBOSCLE0 LFRPMASM -.56156 DMBOSCLE 1.
+ PBOSCLE0 LF1005S1 -1.
+ PBOSCLE1 REVENUES .053 OBJECTIV -.053
+ PBOSCLE1 PASSNGRS 1. RPMILES .56156
+ PBOSCLE1 LFRPMASM -.56156 DMBOSCLE 1.
+ PBOSCLE1 LF1011S1 -1.
+ PBOSCLE2 REVENUES .053 OBJECTIV -.053
+ PBOSCLE2 PASSNGRS 1. RPMILES .60273
+ PBOSCLE2 LFRPMASM -.60273 DMBOSCLE 1.
+ PBOSCLE2 LF1100S1 -1. LF1100S2 -1.
+ PBOSCLE3 REVENUES .053 OBJECTIV -.053
+ PBOSCLE3 PASSNGRS 1. RPMILES .56156
+ PBOSCLE3 LFRPMASM -.56156 DMBOSCLE 1.
+ PBOSCLE3 LF1102S1 -1.
+ PORDBOS0 REVENUES .075 OBJECTIV -.075
+ PORDBOS0 PASSNGRS 1. RPMILES .87605
+ PORDBOS0 LFRPMASM -.87605 DMORDBOS 1.
+ PORDBOS0 LF1006S1 -1. LF1006S2 -1.
+ PORDBOS1 REVENUES .075 OBJECTIV -.075
+ PORDBOS1 PASSNGRS 1. RPMILES .91637
+ PORDBOS1 LFRPMASM -.91637 DMORDBOS 1.
+ PORDBOS1 LF1008S1 -1. LF1008S2 -1.
+ PORDBOS2 REVENUES .075 OBJECTIV -.075
+ PORDBOS2 PASSNGRS 1. RPMILES .91722
+ PORDBOS2 LFRPMASM -.91722 DMORDBOS 1.
+ PORDBOS2 LF1010S1 -1. LF1010S2 -1.
+ PORDBOS2 LF1010S3 -1.
+ PORDBOS3 REVENUES .075 OBJECTIV -.075
+ PORDBOS3 PASSNGRS 1. RPMILES .87605
+ PORDBOS3 LFRPMASM -.87605 DMORDBOS 1.
+ PORDBOS3 LF1100S4 -1. LF1100S5 -1.
+ PORDBOS4 REVENUES .075 OBJECTIV -.075
+ PORDBOS4 PASSNGRS 1. RPMILES .91637
+ PORDBOS4 LFRPMASM -.91637 DMORDBOS 1.
+ PORDBOS4 LF1102S3 -1. LF1102S4 -1.
+ PORDLGA0 REVENUES .068 OBJECTIV -.068
+ PORDLGA0 PASSNGRS 1. RPMILES .7308
+ PORDLGA0 LFRPMASM -.7308 DMORDLGA 1.
+ PORDLGA0 LF1004S1 -1.
+ PORDLGA1 REVENUES .068 OBJECTIV -.068
+ PORDLGA1 PASSNGRS 1. RPMILES .7308
+ PORDLGA1 LFRPMASM -.7308 DMORDLGA 1.
+ PORDLGA1 LF1008S1 -1.
+ PORDLGA2 REVENUES .068 OBJECTIV -.068
+ PORDLGA2 PASSNGRS 1. RPMILES .73165
+ PORDLGA2 LFRPMASM -.73165 DMORDLGA 1.
+ PORDLGA2 LF1010S1 -1. LF1010S2 -1.
+ PORDLGA3 REVENUES .068 OBJECTIV -.068
+ PORDLGA3 PASSNGRS 1. RPMILES .7308
+ PORDLGA3 LFRPMASM -.7308 DMORDLGA 1.
+ PORDLGA3 LF1102S3 -1.
+ PORDCLE0 REVENUES .035 OBJECTIV -.035
+ PORDCLE0 PASSNGRS 1. RPMILES .3145
+ PORDCLE0 LFRPMASM -.3145 DMORDCLE 1.
+ PORDCLE0 LF1002S1 -1.
+ PORDCLE1 REVENUES .035 OBJECTIV -.035
+ PORDCLE1 PASSNGRS 1. RPMILES .3145
+ PORDCLE1 LFRPMASM -.3145 DMORDCLE 1.
+ PORDCLE1 LF1006S1 -1.
+ PORDCLE2 REVENUES .035 OBJECTIV -.035
+ PORDCLE2 PASSNGRS 1. RPMILES .3145
+ PORDCLE2 LFRPMASM -.3145 DMORDCLE 1.
+ PORDCLE2 LF1010S1 -1.
+ PORDCLE3 REVENUES .035 OBJECTIV -.035
+ PORDCLE3 PASSNGRS 1. RPMILES .3145
+ PORDCLE3 LFRPMASM -.3145 DMORDCLE 1.
+ PORDCLE3 LF1100S4 -1.
+ PLGABOS0 REVENUES .027 OBJECTIV -.027
+ PLGABOS0 PASSNGRS 1. RPMILES .18557
+ PLGABOS0 LFRPMASM -.18557 DMLGABOS 1.
+ PLGABOS0 LF1008S2 -1.
+ PLGABOS1 REVENUES .027 OBJECTIV -.027
+ PLGABOS1 PASSNGRS 1. RPMILES .18557
+ PLGABOS1 LFRPMASM -.18557 DMLGABOS 1.
+ PLGABOS1 LF1010S3 -1.
+ PLGABOS2 REVENUES .027 OBJECTIV -.027
+ PLGABOS2 PASSNGRS 1. RPMILES .18557
+ PLGABOS2 LFRPMASM -.18557 DMLGABOS 1.
+ PLGABOS2 LF1014S2 -1.
+ PLGABOS3 REVENUES .027 OBJECTIV -.027
+ PLGABOS3 PASSNGRS 1. RPMILES 1.6077
+ PLGABOS3 LFRPMASM -1.6077 DMLGABOS 1.
+ PLGABOS3 LF1100S2 -1. LF1100S3 -1.
+ PLGABOS3 LF1100S4 -1. LF1100S5 -1.
+ PLGABOS4 REVENUES .027 OBJECTIV -.027
+ PLGABOS4 PASSNGRS 1. RPMILES .18557
+ PLGABOS4 LFRPMASM -.18557 DMLGABOS 1.
+ PLGABOS4 LF1102S4 -1.
+ PLGABOS5 REVENUES .027 OBJECTIV -.027
+ PLGABOS5 PASSNGRS 1. RPMILES .18557
+ PLGABOS5 LFRPMASM -.18557 DMLGABOS 1.
+ PLGABOS5 LF1201S1 -1.
+ PLGAORD0 REVENUES .068 OBJECTIV -.068
+ PLGAORD0 PASSNGRS 1. RPMILES .7308
+ PLGAORD0 LFRPMASM -.7308 DMLGAORD 1.
+ PLGAORD0 LF1013S2 -1.
+ PLGAORD1 REVENUES .068 OBJECTIV -.068
+ PLGAORD1 PASSNGRS 1. RPMILES .7308
+ PLGAORD1 LFRPMASM -.7308 DMLGAORD 1.
+ PLGAORD1 LF1017S1 -1.
+ PLGAORD2 REVENUES .068 OBJECTIV -.068
+ PLGAORD2 PASSNGRS 1. RPMILES .73165
+ PLGAORD2 LFRPMASM -.73165 DMLGAORD 1.
+ PLGAORD2 LF1019S1 -1. LF1019S2 -1.
+ PLGAORD3 REVENUES .068 OBJECTIV -.068
+ PLGAORD3 PASSNGRS 1. RPMILES .73165
+ PLGAORD3 LFRPMASM -.73165 DMLGAORD 1.
+ PLGAORD3 LF1100S2 -1. LF1100S3 -1.
+ PLGACLE0 REVENUES .037 OBJECTIV -.037
+ PLGACLE0 PASSNGRS 1. RPMILES .41715
+ PLGACLE0 LFRPMASM -.41715 DMLGACLE 1.
+ PLGACLE0 LF1015S1 -1.
+ PLGACLE1 REVENUES .037 OBJECTIV -.037
+ PLGACLE1 PASSNGRS 1. RPMILES .41715
+ PLGACLE1 LFRPMASM -.41715 DMLGACLE 1.
+ PLGACLE1 LF1019S1 -1.
+ PLGACLE2 REVENUES .037 OBJECTIV -.037
+ PLGACLE2 PASSNGRS 1. RPMILES .41715
+ PLGACLE2 LFRPMASM -.41715 DMLGACLE 1.
+ PLGACLE2 LF1100S2 -1.
+ PCLEBOS0 REVENUES .053 OBJECTIV -.053
+ PCLEBOS0 PASSNGRS 1. RPMILES .56156
+ PCLEBOS0 LFRPMASM -.56156 DMCLEBOS 1.
+ PCLEBOS0 LF1006S2 -1.
+ PCLEBOS1 REVENUES .053 OBJECTIV -.053
+ PCLEBOS1 PASSNGRS 1. RPMILES .60273
+ PCLEBOS1 LFRPMASM -.60273 DMCLEBOS 1.
+ PCLEBOS1 LF1010S2 -1. LF1010S3 -1.
+ PCLEBOS2 REVENUES .053 OBJECTIV -.053
+ PCLEBOS2 PASSNGRS 1. RPMILES .60273
+ PCLEBOS2 LFRPMASM -.60273 DMCLEBOS 1.
+ PCLEBOS2 LF1014S1 -1. LF1014S2 -1.
+ PCLEBOS3 REVENUES .053 OBJECTIV -.053
+ PCLEBOS3 PASSNGRS 1. RPMILES .56156
+ PCLEBOS3 LFRPMASM -.56156 DMCLEBOS 1.
+ PCLEBOS3 LF1100S5 -1.
+ PCLEBOS4 REVENUES .053 OBJECTIV -.053
+ PCLEBOS4 PASSNGRS 1. RPMILES 1.23087
+ PCLEBOS4 LFRPMASM -1.23087 DMCLEBOS 1.
+ PCLEBOS4 LF1102S2 -1. LF1102S3 -1.
+ PCLEBOS4 LF1102S4 -1.
+ PCLEORD0 REVENUES .035 OBJECTIV -.035
+ PCLEORD0 PASSNGRS 1. RPMILES .3145
+ PCLEORD0 LFRPMASM -.3145 DMCLEORD 1.
+ PCLEORD0 LF1011S2 -1.
+ PCLEORD1 REVENUES .035 OBJECTIV -.035
+ PCLEORD1 PASSNGRS 1. RPMILES .3145
+ PCLEORD1 LFRPMASM -.3145 DMCLEORD 1.
+ PCLEORD1 LF1019S2 -1.
+ PCLEORD2 REVENUES .035 OBJECTIV -.035
+ PCLEORD2 PASSNGRS 1. RPMILES .3145
+ PCLEORD2 LFRPMASM -.3145 DMCLEORD 1.
+ PCLEORD2 LF1021S1 -1.
+ PCLEORD3 REVENUES .035 OBJECTIV -.035
+ PCLEORD3 PASSNGRS 1. RPMILES .3145
+ PCLEORD3 LFRPMASM -.3145 DMCLEORD 1.
+ PCLEORD3 LF1100S3 -1.
+ PCLEORD4 REVENUES .035 OBJECTIV -.035
+ PCLEORD4 PASSNGRS 1. RPMILES .3145
+ PCLEORD4 LFRPMASM -.3145 DMCLEORD 1.
+ PCLEORD4 LF1102S2 -1.
+ PCLELGA0 REVENUES .037 OBJECTIV -.037
+ PCLELGA0 PASSNGRS 1. RPMILES .41715
+ PCLELGA0 LFRPMASM -.41715 DMCLELGA 1.
+ PCLELGA0 LF1010S2 -1.
+ PCLELGA1 REVENUES .037 OBJECTIV -.037
+ PCLELGA1 PASSNGRS 1. RPMILES .41715
+ PCLELGA1 LFRPMASM -.41715 DMCLELGA 1.
+ PCLELGA1 LF1012S1 -1.
+ PCLELGA2 REVENUES .037 OBJECTIV -.037
+ PCLELGA2 PASSNGRS 1. RPMILES .41715
+ PCLELGA2 LFRPMASM -.41715 DMCLELGA 1.
+ PCLELGA2 LF1014S1 -1.
+ PCLELGA3 REVENUES .037 OBJECTIV -.037
+ PCLELGA3 PASSNGRS 1. RPMILES 1.0453
+ PCLELGA3 LFRPMASM -1.0453 DMCLELGA 1.
+ PCLELGA3 LF1102S2 -1. LF1102S3 -1.
+ BBOSORD0 REVENUES .75 OBJECTIV -.75
+ BBOSORD0 RTONMILE .86441 LFTNMILE -.86441
+ BBOSORD0 DCBOSORD 1. LF1003B1 -1.
+ BBOSORD1 REVENUES .75 OBJECTIV -.75
+ BBOSORD1 RTONMILE .87605 LFTNMILE -.87605
+ BBOSORD1 DCBOSORD 1. LF1011B1 -1.
+ BBOSORD1 LF1011B2 -1.
+ BBOSCLE0 REVENUES .53 OBJECTIV -.53
+ BBOSCLE0 RTONMILE .56156 LFTNMILE -.56156
+ BBOSCLE0 DCBOSCLE 1. LF1005B1 -1.
+ BBOSCLE1 REVENUES .53 OBJECTIV -.53
+ BBOSCLE1 RTONMILE .56156 LFTNMILE -.56156
+ BBOSCLE1 DCBOSCLE 1. LF1011B1 -1.
+ BORDBOS0 REVENUES .75 OBJECTIV -.75
+ BORDBOS0 RTONMILE .87605 LFTNMILE -.87605
+ BORDBOS0 DCORDBOS 1. LF1006B1 -1.
+ BORDBOS0 LF1006B2 -1.
+ CBOSORD0 REVENUES .75 OBJECTIV -.75
+ CBOSORD0 RTONMILE .86441 LFTNMILE -.86441
+ CBOSORD0 DCBOSORD 1. LF1003C1 -1.
+ CBOSORD1 REVENUES .75 OBJECTIV -.75
+ CBOSORD1 RTONMILE .87605 LFTNMILE -.87605
+ CBOSORD1 DCBOSORD 1. LF1011C1 -1.
+ CBOSORD1 LF1011C2 -1.
+ CBOSORD2 REVENUES .75 OBJECTIV -.75
+ CBOSORD2 RTONMILE .91637 LFTNMILE -.91637
+ CBOSORD2 DCBOSORD 1. LF1013C1 -1.
+ CBOSORD2 LF1013C2 -1.
+ CBOSORD3 REVENUES .75 OBJECTIV -.75
+ CBOSORD3 RTONMILE .91722 LFTNMILE -.91722
+ CBOSORD3 DCBOSORD 1. LF1100C1 -1.
+ CBOSORD3 LF1100C2 -1. LF1100C3 -1.
+ CBOSORD4 REVENUES .75 OBJECTIV -.75
+ CBOSORD4 RTONMILE .87605 LFTNMILE -.87605
+ CBOSORD4 DCBOSORD 1. LF1102C1 -1.
+ CBOSORD4 LF1102C2 -1.
+ CBOSCLE0 REVENUES .53 OBJECTIV -.53
+ CBOSCLE0 RTONMILE .56156 LFTNMILE -.56156
+ CBOSCLE0 DCBOSCLE 1. LF1005C1 -1.
+ CBOSCLE1 REVENUES .53 OBJECTIV -.53
+ CBOSCLE1 RTONMILE .56156 LFTNMILE -.56156
+ CBOSCLE1 DCBOSCLE 1. LF1011C1 -1.
+ CBOSCLE2 REVENUES .53 OBJECTIV -.53
+ CBOSCLE2 RTONMILE .60273 LFTNMILE -.60273
+ CBOSCLE2 DCBOSCLE 1. LF1100C1 -1.
+ CBOSCLE2 LF1100C2 -1.
+ CBOSCLE3 REVENUES .53 OBJECTIV -.53
+ CBOSCLE3 RTONMILE .56156 LFTNMILE -.56156
+ CBOSCLE3 DCBOSCLE 1. LF1102C1 -1.
+ CORDBOS0 REVENUES .75 OBJECTIV -.75
+ CORDBOS0 RTONMILE .87605 LFTNMILE -.87605
+ CORDBOS0 DCORDBOS 1. LF1006C1 -1.
+ CORDBOS0 LF1006C2 -1.
+ CORDBOS1 REVENUES .75 OBJECTIV -.75
+ CORDBOS1 RTONMILE .91637 LFTNMILE -.91637
+ CORDBOS1 DCORDBOS 1. LF1008C1 -1.
+ CORDBOS1 LF1008C2 -1.
+ CORDBOS2 REVENUES .75 OBJECTIV -.75
+ CORDBOS2 RTONMILE .91722 LFTNMILE -.91722
+ CORDBOS2 DCORDBOS 1. LF1010C1 -1.
+ CORDBOS2 LF1010C2 -1. LF1010C3 -1.
+ CORDBOS3 REVENUES .75 OBJECTIV -.75
+ CORDBOS3 RTONMILE .87605 LFTNMILE -.87605
+ CORDBOS3 DCORDBOS 1. LF1100C4 -1.
+ CORDBOS3 LF1100C5 -1.
+ CORDBOS4 REVENUES .75 OBJECTIV -.75
+ CORDBOS4 RTONMILE .91637 LFTNMILE -.91637
+ CORDBOS4 DCORDBOS 1. LF1102C3 -1.
+ CORDBOS4 LF1102C4 -1.
+ CORDLGA0 REVENUES .68 OBJECTIV -.68
+ CORDLGA0 RTONMILE .7308 LFTNMILE -.7308
+ CORDLGA0 DCORDLGA 1. LF1004C1 -1.
+ CORDLGA1 REVENUES .68 OBJECTIV -.68
+ CORDLGA1 RTONMILE .7308 LFTNMILE -.7308
+ CORDLGA1 DCORDLGA 1. LF1008C1 -1.
+ CORDLGA2 REVENUES .68 OBJECTIV -.68
+ CORDLGA2 RTONMILE .73165 LFTNMILE -.73165
+ CORDLGA2 DCORDLGA 1. LF1010C1 -1.
+ CORDLGA2 LF1010C2 -1.
+ CORDLGA3 REVENUES .68 OBJECTIV -.68
+ CORDLGA3 RTONMILE .7308 LFTNMILE -.7308
+ CORDLGA3 DCORDLGA 1. LF1102C3 -1.
+ CLGAORD0 REVENUES .68 OBJECTIV -.68
+ CLGAORD0 RTONMILE .7308 LFTNMILE -.7308
+ CLGAORD0 DCLGAORD 1. LF1013C2 -1.
+ CLGAORD1 REVENUES .68 OBJECTIV -.68
+ CLGAORD1 RTONMILE .7308 LFTNMILE -.7308
+ CLGAORD1 DCLGAORD 1. LF1017C1 -1.
+ CLGAORD2 REVENUES .68 OBJECTIV -.68
+ CLGAORD2 RTONMILE .73165 LFTNMILE -.73165
+ CLGAORD2 DCLGAORD 1. LF1019C1 -1.
+ CLGAORD2 LF1019C2 -1.
+ CLGAORD3 REVENUES .68 OBJECTIV -.68
+ CLGAORD3 RTONMILE .73165 LFTNMILE -.73165
+ CLGAORD3 DCLGAORD 1. LF1100C2 -1.
+ CLGAORD3 LF1100C3 -1.
+ CLGACLE0 REVENUES .37 OBJECTIV -.37
+ CLGACLE0 RTONMILE .41715 LFTNMILE -.41715
+ CLGACLE0 DCLGACLE 1. LF1015C1 -1.
+ CLGACLE1 REVENUES .37 OBJECTIV -.37
+ CLGACLE1 RTONMILE .41715 LFTNMILE -.41715
+ CLGACLE1 DCLGACLE 1. LF1019C1 -1.
+ CLGACLE2 REVENUES .37 OBJECTIV -.37
+ CLGACLE2 RTONMILE .41715 LFTNMILE -.41715
+ CLGACLE2 DCLGACLE 1. LF1100C2 -1.
+ CCLELGA0 REVENUES .37 OBJECTIV -.37
+ CCLELGA0 RTONMILE .41715 LFTNMILE -.41715
+ CCLELGA0 DCCLELGA 1. LF1010C2 -1.
+ CCLELGA1 REVENUES .37 OBJECTIV -.37
+ CCLELGA1 RTONMILE .41715 LFTNMILE -.41715
+ CCLELGA1 DCCLELGA 1. LF1012C1 -1.
+ CCLELGA2 REVENUES .37 OBJECTIV -.37
+ CCLELGA2 RTONMILE .41715 LFTNMILE -.41715
+ CCLELGA2 DCCLELGA 1. LF1014C1 -1.
+ CCLELGA3 REVENUES .37 OBJECTIV -.37
+ CCLELGA3 RTONMILE 1.0453 LFTNMILE -1.0453
+ CCLELGA3 DCCLELGA 1. LF1102C2 -1.
+ CCLELGA3 LF1102C3 -1.
+ GRDTIMO1 FLAV*1 1. ACOCOSTS .65
+ GRDTIMO1 OBJECTIV .65
+ GRDTIMN1 FLAV*1 1. ACOCOSTS -.05
+ GRDTIMN1 OBJECTIV -.05
+ GRDTIMO2 FLAV*2 1. ACOCOSTS .275
+ GRDTIMO2 OBJECTIV .275
+ GRDTIMN2 FLAV*2 1. ACOCOSTS -.02889
+ GRDTIMN2 OBJECTIV -.02889
+ GRDTIMN3 FLAV*3 1. ACOCOSTS -.03611
+ GRDTIMN3 OBJECTIV -.03611
+ GRDTIMN4 FLAV*4 1. ACOCOSTS -.01333
+ GRDTIMN4 OBJECTIV -.01333
+ N1003AC1 ACOCOSTS .01 OBJECTIV .01
+ N1003AC1 FUELAVAL 7.98429 SYSTDEPT 1.
+ N1003AC1 ACMILES .86441 ASMILES 351.81396
+ N1003AC1 LFRPMASM 211.088376 FLAV*1 2.32729
+ N1003AC1 ATONMILE 25.93224 LFTNMILE 12.96612
+ N1003AC1 LF1003S1 305. LF1003B1 12.
+ N1003AC1 CONTBOS1 1. CONTORD1 -1.
+ N1003AC1 MSBOSORD 1.
+ N1003AC2 ACOCOSTS .02 OBJECTIV .02
+ N1003AC2 FUELAVAL 2.51914 SYSTDEPT 1.
+ N1003AC2 ACMILES .86441 ASMILES 113.23743
+ N1003AC2 LFRPMASM 67.942458 FLAV*2 2.10966
+ N1003AC2 LF1003S1 98. CONTBOS2 1.
+ N1003AC2 CONTORD2 -1. MSBOSORD 1.
+ N1003AC3 ACOCOSTS .03 OBJECTIV .03
+ N1003AC3 FUELAVAL 3.15178 SYSTDEPT 1.
+ N1003AC3 ACMILES .86441 FLAV*3 2.10966
+ N1003AC3 ATONMILE 34.57631 LFTNMILE 17.288155
+ N1003AC3 LF1003C1 30. CONTBOS3 1.
+ N1003AC3 CONTORD3 -1.
+ N1003AC4 ACOCOSTS .04 OBJECTIV .04
+ N1003AC4 FUELAVAL 1.99337 SYSTDEPT 1.
+ N1003AC4 ACMILES .86441 FLAV*4 2.10966
+ N1003AC4 ATONMILE 12.96612 LFTNMILE 6.48306
+ N1003AC4 LF1003C1 11.25 CONTBOS4 1.
+ N1003AC4 CONTORD4 -1.
+ N1005AC1 ACOCOSTS 4.04337 OBJECTIV 4.04337
+ N1005AC1 FUELAVAL 5.83404 SYSTDEPT 1.
+ N1005AC1 ACMILES .56156 ASMILES 228.55299
+ N1005AC1 LFRPMASM 137.131794 FLAV*1 1000.
+ N1005AC1 ATONMILE 16.84665 LFTNMILE 8.423325
+ N1005AC1 LF1005S1 305. LF1005B1 12.
+ N1005AC1 NOPTCLE0 1. CONTBOS1 1.
+ N1005AC1 CONTCLE1 -1. MSBOSCLE 1.
+ N1005AC2 ACOCOSTS 1.60964 OBJECTIV 1.60964
+ N1005AC2 FUELAVAL 1.82258 SYSTDEPT 1.
+ N1005AC2 ACMILES .56156 ASMILES 73.56374
+ N1005AC2 LFRPMASM 44.138244 FLAV*2 2000.
+ N1005AC2 LF1005S1 98. NOPTCLE0 1.
+ N1005AC2 CONTBOS2 1. CONTCLE2 -1.
+ N1005AC2 MSBOSCLE 1.
+ N1005AC3 ACOCOSTS 1.93119 OBJECTIV 1.93119
+ N1005AC3 FUELAVAL 2.27351 SYSTDEPT 1.
+ N1005AC3 ACMILES .56156 FLAV*3 3000.
+ N1005AC3 ATONMILE 22.4622 LFTNMILE 11.2311
+ N1005AC3 LF1005C1 30. NOPTCLE0 1.
+ N1005AC3 CONTBOS3 1. CONTCLE3 -1.
+ N1005AC4 ACOCOSTS 1.34618 OBJECTIV 1.34618
+ N1005AC4 FUELAVAL 1.41795 SYSTDEPT 1.
+ N1005AC4 ACMILES .56156 FLAV*4 1500.
+ N1005AC4 ATONMILE 8.42333 LFTNMILE 4.211665
+ N1005AC4 LF1005C1 11.25 NOPTCLE0 1.
+ N1005AC4 CONTBOS4 1. CONTCLE4 -1.
+ N1011AC1 ACOCOSTS 1.1 OBJECTIV 1.1
+ N1011AC1 FUELAVAL 9.91398 SYSTDEPT 2.
+ N1011AC1 ACMILES .87605 ASMILES 356.55371
+ N1011AC1 LFRPMASM 213.932226 FLAV*1 25.
+ N1011AC1 ATONMILE 26.2816 LFTNMILE 13.1408
+ N1011AC1 LF1011S1 305. LF1011S2 305.
+ N1011AC1 LF1011B1 12. LF1011B2 12.
+ N1011AC1 NOPTCLE0 2. CONTBOS1 1.
+ N1011AC1 CONTORD1 -1. MSBOSCLE 1.
+ N1011AC1 MSBOSORD 1. MSCLEORD 1.
+ N1011AC2 ACOCOSTS 1.2 OBJECTIV 1.2
+ N1011AC2 FUELAVAL 3.07692 SYSTDEPT 2.
+ N1011AC2 ACMILES .87605 ASMILES 114.76299
+ N1011AC2 LFRPMASM 68.857794 FLAV*2 25.
+ N1011AC2 LF1011S1 98. LF1011S2 98.
+ N1011AC2 NOPTCLE0 2. CONTBOS2 1.
+ N1011AC2 CONTORD2 -1. MSBOSCLE 1.
+ N1011AC2 MSBOSORD 1. MSCLEORD 1.
+ N1011AC3 ACOCOSTS 1.3 OBJECTIV 1.3
+ N1011AC3 FUELAVAL 3.83055 SYSTDEPT 2.
+ N1011AC3 ACMILES .87605 FLAV*3 26.
+ N1011AC3 ATONMILE 35.04214 LFTNMILE 17.52107
+ N1011AC3 LF1011C1 30. LF1011C2 30.
+ N1011AC3 NOPTCLE0 2. CONTBOS3 1.
+ N1011AC3 CONTORD3 -1.
+ N1011AC4 ACOCOSTS 2.34647 OBJECTIV 2.34647
+ N1011AC4 FUELAVAL 2.3665 SYSTDEPT 2.
+ N1011AC4 ACMILES .87605 FLAV*4 27.
+ N1011AC4 ATONMILE 13.1408 LFTNMILE 6.5704
+ N1011AC4 LF1011C1 11.25 LF1011C2 11.25
+ N1011AC4 NOPTCLE0 2. CONTBOS4 1.
+ N1011AC4 CONTORD4 -1.
+ N1013AC2 ACOCOSTS 2.36783 OBJECTIV 2.36783
+ N1013AC2 FUELAVAL 3.16965 SYSTDEPT 2.
+ N1013AC2 ACMILES .91637 ASMILES 120.04449
+ N1013AC2 LFRPMASM 72.026694 FLAV*2 2.65943
+ N1013AC2 LF1013S1 98. LF1013S2 98.
+ N1013AC2 CONTBOS2 1. CONTORD2 -1.
+ N1013AC2 MSBOSLGA 1. MSBOSORD 1.
+ N1013AC2 MSLGAORD 1.
+ N1013AC4 ACOCOSTS 1.90292 OBJECTIV 1.90292
+ N1013AC4 FUELAVAL 2.4431 SYSTDEPT 2.
+ N1013AC4 ACMILES .91637 FLAV*4 2.65943
+ N1013AC4 ATONMILE 13.74556 LFTNMILE 6.87278
+ N1013AC4 LF1013C1 11.25 LF1013C2 11.25
+ N1013AC4 CONTBOS4 1. CONTORD4 -1.
+ N1013AC4 MCLGAORD 1.
+ N1015AC2 ACOCOSTS 1.36416 OBJECTIV 1.36416
+ N1015AC2 FUELAVAL 1.49045 SYSTDEPT 1.
+ N1015AC2 ACMILES .41715 ASMILES 54.64705
+ N1015AC2 LFRPMASM 32.78823 FLAV*2 1.25093
+ N1015AC2 LF1015S1 98. NOPTCLE0 1.
+ N1015AC2 CONTLGA2 1. CONTCLE2 -1.
+ N1015AC2 MSLGACLE 1.
+ N1015AC4 ACOCOSTS 1.14401 OBJECTIV 1.14401
+ N1015AC4 FUELAVAL 1.14359 SYSTDEPT 1.
+ N1015AC4 ACMILES .41715 FLAV*4 1.25093
+ N1015AC4 ATONMILE 6.25729 LFTNMILE 3.128645
+ N1015AC4 LF1015C1 11.25 NOPTCLE0 1.
+ N1015AC4 CONTLGA4 1. CONTCLE4 -1.
+ N1017AC2 ACOCOSTS 1.64736 OBJECTIV 1.64736
+ N1017AC2 FUELAVAL 2.21183 SYSTDEPT 1.
+ N1017AC2 ACMILES .7308 ASMILES 95.73444
+ N1017AC2 LFRPMASM 57.440664 FLAV*2 1.85313
+ N1017AC2 LF1017S1 98. CONTLGA2 1.
+ N1017AC2 CONTORD2 -1. MSLGAORD 1.
+ N1017AC4 ACOCOSTS 1.33312 OBJECTIV 1.33312
+ N1017AC4 FUELAVAL 1.73951 SYSTDEPT 1.
+ N1017AC4 ACMILES .7308 FLAV*4 1.85313
+ N1017AC4 ATONMILE 10.96196 LFTNMILE 5.48098
+ N1017AC4 LF1017C1 11.25 CONTLGA4 1.
+ N1017AC4 CONTORD4 -1. MCLGAORD 1.
+ N1019AC2 ACOCOSTS 2.55381 OBJECTIV 2.55381
+ N1019AC2 FUELAVAL 2.7448 SYSTDEPT 2.
+ N1019AC2 ACMILES .73165 ASMILES 95.8463
+ N1019AC2 LFRPMASM 57.50778 FLAV*2 2.30477
+ N1019AC2 LF1019S1 98. LF1019S2 98.
+ N1019AC2 NOPTCLE0 2. CONTLGA2 1.
+ N1019AC2 CONTORD2 -1. MSLGACLE 1.
+ N1019AC2 MSLGAORD 1. MSCLEORD 1.
+ N1019AC4 ACOCOSTS 2.14431 OBJECTIV 2.14431
+ N1019AC4 FUELAVAL 2.09214 SYSTDEPT 2.
+ N1019AC4 ACMILES .73165 FLAV*4 2.30477
+ N1019AC4 ATONMILE 10.97477 LFTNMILE 5.487385
+ N1019AC4 LF1019C1 11.25 LF1019C2 11.25
+ N1019AC4 NOPTCLE0 2. CONTLGA4 1.
+ N1019AC4 CONTORD4 -1. MCLGAORD 1.
+ N1021AC1 ACOCOSTS 3.12679 OBJECTIV 3.12679
+ N1021AC1 FUELAVAL 4.07994 SYSTDEPT 1.
+ N1021AC1 ACMILES .3145 ASMILES 128.00075
+ N1021AC1 LFRPMASM 76.80045 FLAV*1 1.34295
+ N1021AC1 ATONMILE 9.43495 LFTNMILE 4.717475
+ N1021AC1 LF1021S1 305. LF1021B1 12.
+ N1021AC1 NOPTCLE0 1. CONTCLE1 1.
+ N1021AC1 CONTORD1 -1. MSCLEORD 1.
+ N1021AC2 ACOCOSTS 1.18965 OBJECTIV 1.18965
+ N1021AC2 FUELAVAL 1.25435 SYSTDEPT 1.
+ N1021AC2 ACMILES .3145 ASMILES 41.19926
+ N1021AC2 LFRPMASM 24.719556 FLAV*2 1.05384
+ N1021AC2 LF1021S1 98. NOPTCLE0 1.
+ N1021AC2 CONTCLE2 1. CONTORD2 -1.
+ N1021AC2 MSCLEORD 1.
+ N1021AC3 ACOCOSTS 1.42472 OBJECTIV 1.42472
+ N1021AC3 FUELAVAL 1.55704 SYSTDEPT 1.
+ N1021AC3 ACMILES .3145 FLAV*3 1.05384
+ N1021AC3 ATONMILE 12.57993 LFTNMILE 6.289965
+ N1021AC3 LF1021C1 30. NOPTCLE0 1.
+ N1021AC3 CONTCLE3 1. CONTORD3 -1.
+ N1021AC4 ACOCOSTS 1.0003 OBJECTIV 1.0003
+ N1021AC4 FUELAVAL .94855 SYSTDEPT 1.
+ N1021AC4 ACMILES .3145 FLAV*4 1.05384
+ N1021AC4 ATONMILE 4.71747 LFTNMILE 2.358735
+ N1021AC4 LF1021C1 11.25 NOPTCLE0 1.
+ N1021AC4 CONTCLE4 1. CONTORD4 -1.
+ N1002AC1 ACOCOSTS 3.12679 OBJECTIV 3.12679
+ N1002AC1 FUELAVAL 4.07994 SYSTDEPT 1.
+ N1002AC1 ACMILES .3145 ASMILES 128.00075
+ N1002AC1 LFRPMASM 76.80045 FLAV*1 1.34295
+ N1002AC1 ATONMILE 9.43495 LFTNMILE 4.717475
+ N1002AC1 LF1002S1 305. LF1002B1 12.
+ N1002AC1 NOPTCLE0 1. CONTORD1 1.
+ N1002AC1 CONTCLE1 -1. MSORDCLE 1.
+ N1002AC2 ACOCOSTS 1.18965 OBJECTIV 1.18965
+ N1002AC2 FUELAVAL 1.25435 SYSTDEPT 1.
+ N1002AC2 ACMILES .3145 ASMILES 41.19926
+ N1002AC2 LFRPMASM 24.719556 FLAV*2 1.05384
+ N1002AC2 LF1002S1 98. NOPTCLE0 1.
+ N1002AC2 CONTORD2 1. CONTCLE2 -1.
+ N1002AC2 MSORDCLE 1.
+ N1002AC3 ACOCOSTS 1.42472 OBJECTIV 1.42472
+ N1002AC3 FUELAVAL 1.55704 SYSTDEPT 1.
+ N1002AC3 ACMILES .3145 FLAV*3 1.05384
+ N1002AC3 ATONMILE 12.57993 LFTNMILE 6.289965
+ N1002AC3 LF1002C1 30. NOPTCLE0 1.
+ N1002AC3 CONTORD3 1. CONTCLE3 -1.
+ N1002AC4 ACOCOSTS 1.0003 OBJECTIV 1.0003
+ N1002AC4 FUELAVAL .94855 SYSTDEPT 1.
+ N1002AC4 ACMILES .3145 FLAV*4 1.05384
+ N1002AC4 ATONMILE 4.71747 LFTNMILE 2.358735
+ N1002AC4 LF1002C1 11.25 NOPTCLE0 1.
+ N1002AC4 CONTORD4 1. CONTCLE4 -1.
+ N1004AC2 ACOCOSTS 1.64736 OBJECTIV 1.64736
+ N1004AC2 FUELAVAL 2.21183 SYSTDEPT 1.
+ N1004AC2 ACMILES .7308 ASMILES 95.73444
+ N1004AC2 LFRPMASM 57.440664 FLAV*2 1.85313
+ N1004AC2 LF1004S1 98. CONTORD2 1.
+ N1004AC2 CONTLGA2 -1. MSORDLGA 1.
+ N1004AC4 ACOCOSTS 1.33312 OBJECTIV 1.33312
+ N1004AC4 FUELAVAL 1.73951 SYSTDEPT 1.
+ N1004AC4 ACMILES .7308 FLAV*4 1.85313
+ N1004AC4 ATONMILE 10.96196 LFTNMILE 5.48098
+ N1004AC4 LF1004C1 11.25 CONTORD4 1.
+ N1004AC4 CONTLGA4 -1.
+ N1006AC1 ACOCOSTS 7.17016 OBJECTIV 7.17016
+ N1006AC1 FUELAVAL 9.91398 SYSTDEPT 2.
+ N1006AC1 ACMILES .87605 ASMILES 356.55371
+ N1006AC1 LFRPMASM 213.932226 FLAV*1 3.12813
+ N1006AC1 ATONMILE 26.2816 LFTNMILE 13.1408
+ N1006AC1 LF1006S1 305. LF1006S2 305.
+ N1006AC1 LF1006B1 12. LF1006B2 12.
+ N1006AC1 NOPTCLE0 2. CONTORD1 1.
+ N1006AC1 CONTBOS1 -1. MSORDCLE 1.
+ N1006AC1 MSORDBOS 1. MSCLEBOS 1.
+ N1006AC2 ACOCOSTS 2.79929 OBJECTIV 2.79929
+ N1006AC2 FUELAVAL 3.07692 SYSTDEPT 2.
+ N1006AC2 ACMILES .87605 ASMILES 114.76299
+ N1006AC2 LFRPMASM 68.857794 FLAV*2 2.58202
+ N1006AC2 LF1006S1 98. LF1006S2 98.
+ N1006AC2 NOPTCLE0 2. CONTORD2 1.
+ N1006AC2 CONTBOS2 -1. MSORDCLE 1.
+ N1006AC2 MSORDBOS 1. MSCLEBOS 1.
+ N1006AC3 ACOCOSTS 3.35591 OBJECTIV 3.35591
+ N1006AC3 FUELAVAL 3.83055 SYSTDEPT 2.
+ N1006AC3 ACMILES .87605 FLAV*3 2.58202
+ N1006AC3 ATONMILE 35.04214 LFTNMILE 17.52107
+ N1006AC3 LF1006C1 30. LF1006C2 30.
+ N1006AC3 NOPTCLE0 2. CONTORD3 1.
+ N1006AC3 CONTBOS3 -1. MCORDBOS 1.
+ N1006AC4 ACOCOSTS 2.34647 OBJECTIV 2.34647
+ N1006AC4 FUELAVAL 2.3665 SYSTDEPT 2.
+ N1006AC4 ACMILES .87605 FLAV*4 2.58202
+ N1006AC4 ATONMILE 13.1408 LFTNMILE 6.5704
+ N1006AC4 LF1006C1 11.25 LF1006C2 11.25
+ N1006AC4 NOPTCLE0 2. CONTORD4 1.
+ N1006AC4 CONTBOS4 -1. MCORDBOS 1.
+ N1008AC2 ACOCOSTS 2.36783 OBJECTIV 2.36783
+ N1008AC2 FUELAVAL 3.16965 SYSTDEPT 2.
+ N1008AC2 ACMILES .91637 ASMILES 120.04449
+ N1008AC2 LFRPMASM 72.026694 FLAV*2 2.65943
+ N1008AC2 LF1008S1 98. LF1008S2 98.
+ N1008AC2 CONTORD2 1. CONTBOS2 -1.
+ N1008AC2 MSORDLGA 1. MSORDBOS 1.
+ N1008AC2 MSLGABOS 1.
+ N1008AC4 ACOCOSTS 1.90292 OBJECTIV 1.90292
+ N1008AC4 FUELAVAL 2.4431 SYSTDEPT 2.
+ N1008AC4 ACMILES .91637 FLAV*4 2.65943
+ N1008AC4 ATONMILE 13.74556 LFTNMILE 6.87278
+ N1008AC4 LF1008C1 11.25 LF1008C2 11.25
+ N1008AC4 CONTORD4 1. CONTBOS4 -1.
+ N1008AC4 MCORDBOS 1.
+ N1010AC2 ACOCOSTS 3.27428 OBJECTIV 3.27428
+ N1010AC2 FUELAVAL 3.70262 SYSTDEPT 3.
+ N1010AC2 ACMILES .91722 ASMILES 120.15637
+ N1010AC2 LFRPMASM 72.093822 FLAV*2 3.11107
+ N1010AC2 LF1010S1 98. LF1010S2 98.
+ N1010AC2 LF1010S3 98. NOPTCLE0 2.
+ N1010AC2 CONTORD2 1. CONTBOS2 -1.
+ N1010AC2 MSORDCLE 1. MSORDLGA 1.
+ N1010AC2 MSORDBOS 1. MSCLELGA 1.
+ N1010AC2 MSCLEBOS 1. MSLGABOS 1.
+ N1010AC4 ACOCOSTS 2.71411 OBJECTIV 2.71411
+ N1010AC4 FUELAVAL 2.79573 SYSTDEPT 3.
+ N1010AC4 ACMILES .91722 FLAV*4 3.11107
+ N1010AC4 ATONMILE 13.75836 LFTNMILE 6.87918
+ N1010AC4 LF1010C1 11.25 LF1010C2 11.25
+ N1010AC4 LF1010C3 11.25 NOPTCLE0 2.
+ N1010AC4 CONTORD4 1. CONTBOS4 -1.
+ N1010AC4 MCORDBOS 1.
+ N1012AC2 ACOCOSTS 1.36416 OBJECTIV 1.36416
+ N1012AC2 FUELAVAL 1.49045 SYSTDEPT 1.
+ N1012AC2 ACMILES .41715 ASMILES 54.64705
+ N1012AC2 LFRPMASM 32.78823 FLAV*2 1.25093
+ N1012AC2 LF1012S1 98. NOPTCLE0 1.
+ N1012AC2 CONTCLE2 1. CONTLGA2 -1.
+ N1012AC2 MSCLELGA 1.
+ N1012AC4 ACOCOSTS 1.14401 OBJECTIV 1.14401
+ N1012AC4 FUELAVAL 1.14359 SYSTDEPT 1.
+ N1012AC4 ACMILES .41715 FLAV*4 1.25093
+ N1012AC4 ATONMILE 6.25729 LFTNMILE 3.128645
+ N1012AC4 LF1012C1 11.25 NOPTCLE0 1.
+ N1012AC4 CONTCLE4 1. CONTLGA4 -1.
+ N1014AC2 ACOCOSTS 2.08463 OBJECTIV 2.08463
+ N1014AC2 FUELAVAL 2.44827 SYSTDEPT 2.
+ N1014AC2 ACMILES .60273 ASMILES 78.95706
+ N1014AC2 LFRPMASM 47.374236 FLAV*2 2.05723
+ N1014AC2 LF1014S1 98. LF1014S2 98.
+ N1014AC2 NOPTCLE0 1. CONTCLE2 1.
+ N1014AC2 CONTBOS2 -1. MSCLELGA 1.
+ N1014AC2 MSCLEBOS 1. MSLGABOS 1.
+ N1014AC4 ACOCOSTS 1.71382 OBJECTIV 1.71382
+ N1014AC4 FUELAVAL 1.84718 SYSTDEPT 2.
+ N1014AC4 ACMILES .60273 FLAV*4 2.05723
+ N1014AC4 ATONMILE 9.04089 LFTNMILE 4.520445
+ N1014AC4 LF1014C1 11.25 LF1014C2 11.25
+ N1014AC4 NOPTCLE0 1. CONTCLE4 1.
+ N1014AC4 CONTBOS4 -1.
+ N1100AC2 ACOCOSTS 6.07357 OBJECTIV 6.07357
+ N1100AC2 FUELAVAL 6.77953 SYSTDEPT 5.
+ N1100AC2 ACMILES 1.79328 ASMILES 234.91937
+ N1100AC2 LFRPMASM 140.951622 FLAV*2 5.69309
+ N1100AC2 LF1100S1 98. LF1100S2 98.
+ N1100AC2 LF1100S3 98. LF1100S4 98.
+ N1100AC2 LF1100S5 98. NOPTCLE0 4.
+ N1100AC2 MSBOSLGA 1. MSBOSCLE 1.
+ N1100AC2 MSBOSORD 1. MSLGACLE 1.
+ N1100AC2 MSLGAORD 1. MSLGABOS 1.
+ N1100AC2 MSCLEORD 1. MSORDCLE 1.
+ N1100AC2 MSORDBOS 1. MSCLEBOS 1.
+ N1100AC4 ACOCOSTS 5.06059 OBJECTIV 5.06059
+ N1100AC4 FUELAVAL 5.16223 SYSTDEPT 5.
+ N1100AC4 ACMILES 1.79328 FLAV*4 5.69309
+ N1100AC4 ATONMILE 26.89915 LFTNMILE 13.449575
+ N1100AC4 LF1100C1 11.25 LF1100C2 11.25
+ N1100AC4 LF1100C3 11.25 LF1100C4 11.25
+ N1100AC4 LF1100C5 11.25 NOPTCLE0 4.
+ N1100AC4 MCLGAORD 1. MCORDBOS 1.
+ N1102AC2 ACOCOSTS 5.16712 OBJECTIV 5.16712
+ N1102AC2 FUELAVAL 6.24657 SYSTDEPT 4.
+ N1102AC2 ACMILES 1.79242 ASMILES 234.80756
+ N1102AC2 LFRPMASM 140.884536 FLAV*2 5.24145
+ N1102AC2 LF1102S1 98. LF1102S2 98.
+ N1102AC2 LF1102S3 98. LF1102S4 98.
+ N1102AC2 NOPTCLE0 2. MSBOSCLE 1.
+ N1102AC2 MSBOSORD 1. MSBOSLGA 1.
+ N1102AC2 MSCLEORD 1. MSCLELGA 1.
+ N1102AC2 MSCLEBOS 1. MSORDLGA 1.
+ N1102AC2 MSORDBOS 1. MSLGABOS 1.
+ N1102AC4 ACOCOSTS 4.24939 OBJECTIV 4.24939
+ N1102AC4 FUELAVAL 4.8096 SYSTDEPT 4.
+ N1102AC4 ACMILES 1.79242 FLAV*4 5.24145
+ N1102AC4 ATONMILE 26.88635 LFTNMILE 13.443175
+ N1102AC4 LF1102C1 11.25 LF1102C2 11.25
+ N1102AC4 LF1102C3 11.25 LF1102C4 11.25
+ N1102AC4 NOPTCLE0 2. MCORDBOS 1.
+ N1200AC2 ACOCOSTS .72047 OBJECTIV .72047
+ N1200AC2 FUELAVAL .95782 SYSTDEPT 1.
+ N1200AC2 ACMILES .18557 ASMILES 24.31007
+ N1200AC2 LFRPMASM 14.586042 FLAV*2 .8063
+ N1200AC2 LF1200S1 98. CONTBOS2 1.
+ N1200AC2 CONTLGA2 -1. MSBOSLGA 1.
+ N1200AC4 ACOCOSTS .5698 OBJECTIV .5698
+ N1200AC4 FUELAVAL .70359 SYSTDEPT 1.
+ N1200AC4 ACMILES .18557 FLAV*4 .8063
+ N1200AC4 ATONMILE 2.7836 LFTNMILE 1.3918
+ N1200AC4 LF1200C1 11.25 CONTBOS4 1.
+ N1200AC4 CONTLGA4 -1.
+ N1201AC2 ACOCOSTS .72047 OBJECTIV .72047
+ N1201AC2 FUELAVAL .95782 SYSTDEPT 1.
+ N1201AC2 ACMILES .18557 ASMILES 24.31007
+ N1201AC2 LFRPMASM 14.586042 FLAV*2 .8063
+ N1201AC2 LF1201S1 98. CONTLGA2 1.
+ N1201AC2 CONTBOS2 -1. MSLGABOS 1.
+ N1201AC4 ACOCOSTS .5698 OBJECTIV .5698
+ N1201AC4 FUELAVAL .70359 SYSTDEPT 1.
+ N1201AC4 ACMILES .18557 FLAV*4 .8063
+ N1201AC4 ATONMILE 2.7836 LFTNMILE 1.3918
+ N1201AC4 LF1201C1 11.25 CONTLGA4 1.
+ N1201AC4 CONTBOS4 -1.
+RHS
+ RHS1 FUELAVAL 100000. PASSNGRS 9431.
+ RHS1 SYSTDEPT 50. FLAV*1 30.
+ RHS1 FLAV*2 45. DMBOSORD 302.
+ RHS1 DMBOSLGA 2352. DMBOSCLE 142.
+ RHS1 DMORDBOS 302. DMORDLGA 515.
+ RHS1 DMORDCLE 619. DMLGABOS 2743.
+ RHS1 DMLGAORD 712. DMLGACLE 517.
+ RHS1 DMCLEBOS 131. DMCLEORD 712.
+ RHS1 DMCLELGA 409. MSBOSORD 3.
+ RHS1 MSBOSLGA 7. MSBOSCLE 1.
+ RHS1 MSORDBOS 3. MSORDLGA 4.
+ RHS1 MSORDCLE 5. MSLGABOS 7.
+ RHS1 MSLGAORD 5. MSLGACLE 4.
+ RHS1 MSCLEBOS 1. MSCLEORD 6.
+ RHS1 MSCLELGA 3. MCORDBOS 1.
+ RHS1 MCLGAORD 2. DCBOSORD 12.
+ RHS1 DCBOSCLE 16. DCORDBOS 24.
+ RHS1 DCORDLGA 13. DCLGAORD 45.
+ RHS1 DCLGACLE 16. DCCLELGA 5.
+ RHS1 NOPTCLE0 24.
+RANGES
+ RANGE1 DMBOSORD 61. DMBOSLGA 471.
+ RANGE1 DMBOSCLE 29. DMORDBOS 61.
+ RANGE1 DMORDLGA 103. DMORDCLE 124.
+ RANGE1 DMLGABOS 549. DMLGAORD 143.
+ RANGE1 DMLGACLE 104. DMCLEBOS 27.
+ RANGE1 DMCLEORD 143. DMCLELGA 82.
+ RANGE1 DCBOSORD 12. DCBOSCLE 3.2
+ RANGE1 DCORDBOS 4.8 DCORDLGA 2.6
+ RANGE1 DCLGAORD 9. DCLGACLE 3.2
+ RANGE1 DCCLELGA 5.
+BOUNDS
+ LO INTBOU GRDTIMN1 -100.
+ UP INTBOU GRDTIMN1 0.
+ LO INTBOU GRDTIMN2 -90.
+ UP INTBOU GRDTIMN2 0.
+ LO INTBOU GRDTIMN3 -45.
+ UP INTBOU GRDTIMN3 0.
+ LO INTBOU GRDTIMN4 -45.
+ UP INTBOU GRDTIMN4 0.
+ UP INTBOU N1003AC1 7.
+ UP INTBOU N1003AC2 7.
+ UP INTBOU N1003AC3 2.
+ UP INTBOU N1003AC4 2.
+ UP INTBOU N1005AC1 7.
+ UP INTBOU N1005AC2 7.
+ UP INTBOU N1005AC3 2.
+ UP INTBOU N1005AC4 2.
+ UP INTBOU N1011AC1 7.
+ UP INTBOU N1011AC2 7.
+ UP INTBOU N1011AC3 2.
+ UP INTBOU N1011AC4 2.
+ UP INTBOU N1013AC2 14.
+ UP INTBOU N1013AC4 2.
+ UP INTBOU N1015AC2 7.
+ UP INTBOU N1015AC4 2.
+ UP INTBOU N1017AC2 7.
+ UP INTBOU N1017AC4 2.
+ UP INTBOU N1019AC2 7.
+ UP INTBOU N1019AC4 2.
+ UP INTBOU N1021AC1 7.
+ UP INTBOU N1021AC2 7.
+ UP INTBOU N1021AC3 2.
+ UP INTBOU N1021AC4 2.
+ UP INTBOU N1002AC1 7.
+ UP INTBOU N1002AC2 7.
+ UP INTBOU N1002AC3 2.
+ UP INTBOU N1002AC4 2.
+ UP INTBOU N1004AC2 7.
+ UP INTBOU N1004AC4 2.
+ UP INTBOU N1006AC1 7.
+ UP INTBOU N1006AC2 7.
+ UP INTBOU N1006AC3 2.
+ UP INTBOU N1006AC4 2.
+ UP INTBOU N1008AC2 14.
+ UP INTBOU N1008AC4 2.
+ UP INTBOU N1010AC2 14.
+ UP INTBOU N1010AC4 2.
+ UP INTBOU N1012AC2 7.
+ UP INTBOU N1012AC4 2.
+ UP INTBOU N1014AC2 14.
+ UP INTBOU N1014AC4 2.
+ UP INTBOU N1100AC2 7.
+ UP INTBOU N1100AC4 7.
+ UP INTBOU N1102AC2 7.
+ UP INTBOU N1102AC4 7.
+ UP INTBOU N1200AC2 14.
+ UP INTBOU N1200AC4 7.
+ UP INTBOU N1201AC2 14.
+ UP INTBOU N1201AC4 7.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/egout.mps b/demos/ppl_lpsol/examples/egout.mps
new file mode 100644
index 0000000..dab1108
--- /dev/null
+++ b/demos/ppl_lpsol/examples/egout.mps
@@ -0,0 +1,403 @@
+*NAME: egout
+*ROWS: 98
+*COLUMNS: 141
+*INTEGER: 55
+*NONZERO: 282
+*BEST SOLN: 568.101 (opt)
+*LP SOLN: 149.589
+*SOURCE: Etienne Loute (Univ. of Louvain)
+* Laurence A. Wolsey (Univ. of Louvain)
+* Martin Savelsbergh (Eindhoven Univ. of Technology)
+*APPLICATION: drainage system design, 42 nodes, 55 arcs
+*COMMENTS: all integer variables are binary
+* solution reported by Martin W. P. Savelsbergh
+*
+NAME EGOUT
+ROWS
+ N COST
+ E ...
+ E 001
+ E 002
+ E 004
+ E 006
+ E 007
+ E 009
+ E 010
+ E 011
+ E 013
+ E 014
+ E 015
+ E 017
+ E 019
+ E 020
+ E 021
+ E 023
+ E 025
+ E 026
+ E 028
+ E 029
+ E 030
+ E 031
+ E 033
+ E 034
+ E 035
+ E 036
+ E 038
+ E 039
+ E 040
+ E 041
+ E 042
+ E 003
+ E 005
+ E 008
+ E 012
+ E 016
+ E 018
+ E 024
+ E 022
+ E 027
+ E 032
+ E 037
+ L U.001...
+ L U.001003
+ L U.002003
+ L U.002...
+ L U.003005
+ L U.004005
+ L U.004...
+ L U.005007
+ L U.006007
+ L U.007008
+ L U.008...
+ L U.008009
+ L U.010012
+ L U.011012
+ L U.012...
+ L U.012013
+ L U.013016
+ L U.014015
+ L U.015016
+ L U.016...
+ L U.016017
+ L U.017018
+ L U.009018
+ L U.018019
+ L U.019024
+ L U.024...
+ L U.023024
+ L U.022023
+ L U.020022
+ L U.021022
+ L U.022...
+ L U.024026
+ L U.025026
+ L U.025...
+ L U.026027
+ L U.027...
+ L U.027032
+ L U.030031
+ L U.031032
+ L U.029031
+ L U.028029
+ L U.028...
+ L U.032033
+ L U.033037
+ L U.036037
+ L U.034036
+ L U.035036
+ L U.037038
+ L U.038040
+ L U.039040
+ L U.040...
+ L U.041...
+ L U.040041
+ L U.041042
+ L U.042...
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ I.001... COST 28.21 U.001... -117.04
+ I.001003 COST 18.57 U.001003 -117.04
+ I.002003 COST 8.45 U.002003 -117.04
+ I.002... COST 21.16 U.002... -117.04
+ I.003005 COST 28.38 U.003005 -117.04
+ I.004005 COST 9.8 U.004005 -117.04
+ I.004... COST 23.29 U.004... -117.04
+ I.005007 COST 5.07 U.005007 -117.04
+ I.006007 COST 6.78 U.006007 -117.04
+ I.007008 COST 2.9 U.007008 -117.04
+ I.008... COST 27.89 U.008... -117.04
+ I.008009 COST 10.03 U.008009 -117.04
+ I.010012 COST 14.74 U.010012 -117.04
+ I.011012 COST 6.19 U.011012 -117.04
+ I.012... COST 22.1 U.012... -117.04
+ I.012013 COST 15.82 U.012013 -117.04
+ I.013016 COST 11.33 U.013016 -117.04
+ I.014015 COST 5.79 U.014015 -117.04
+ I.015016 COST 3.9 U.015016 -117.04
+ I.016... COST 24.79 U.016... -117.04
+ I.016017 COST 16.36 U.016017 -117.04
+ I.017018 COST 3.45 U.017018 -117.04
+ I.009018 COST 2.26 U.009018 -117.04
+ I.018019 COST 3.86 U.018019 -117.04
+ I.019024 COST 8.41 U.019024 -117.04
+ I.024... COST 26.46 U.024... -117.04
+ I.023024 COST 16.01 U.023024 -117.04
+ I.022023 COST 16.73 U.022023 -117.04
+ I.020022 COST 11.75 U.020022 -117.04
+ I.021022 COST 3.25 U.021022 -117.04
+ I.022... COST 27.41 U.022... -117.04
+ I.024026 COST 5.98 U.024026 -117.04
+ I.025026 COST 21.88 U.025026 -117.04
+ I.025... COST 43.71 U.025... -117.04
+ I.026027 COST 11.42 U.026027 -117.04
+ I.027... COST 23.4 U.027... -117.04
+ I.027032 COST 7.5 U.027032 -117.04
+ I.030031 COST 6.73 U.030031 -117.04
+ I.031032 COST 5.92 U.031032 -117.04
+ I.029031 COST 9.7 U.029031 -117.04
+ I.028029 COST 12.67 U.028029 -117.04
+ I.028... COST 26.45 U.028... -117.04
+ I.032033 COST 2.71 U.032033 -117.04
+ I.033037 COST 5.89 U.033037 -117.04
+ I.036037 COST 9.85 U.036037 -117.04
+ I.034036 COST 8.5 U.034036 -117.04
+ I.035036 COST 9 U.035036 -117.04
+ I.037038 COST 2.27 U.037038 -117.04
+ I.038040 COST 6.37 U.038040 -117.04
+ I.039040 COST 16.2 U.039040 -117.04
+ I.040... COST 23.58 U.040... -117.04
+ I.041... COST 29.93 U.041... -117.04
+ I.040041 COST 6.73 U.040041 -117.04
+ I.041042 COST 20.66 U.041042 -117.04
+ I.042... COST 30.92 U.042... -117.04
+ MARK0001 'MARKER' 'INTEND'
+ F....001 ... 1 001 -1
+ F....002 ... 1 002 -1
+ F....004 ... 1 004 -1
+ F....006 ... 1 006 -1
+ F....007 ... 1 007 -1
+ F....009 ... 1 009 -1
+ F....010 ... 1 010 -1
+ F....011 ... 1 011 -1
+ F....013 ... 1 013 -1
+ F....014 ... 1 014 -1
+ F....015 ... 1 015 -1
+ F....017 ... 1 017 -1
+ F....019 ... 1 019 -1
+ F....020 ... 1 020 -1
+ F....021 ... 1 021 -1
+ F....023 ... 1 023 -1
+ F....025 ... 1 025 -1
+ F....026 ... 1 026 -1
+ F....028 ... 1 028 -1
+ F....029 ... 1 029 -1
+ F....030 ... 1 030 -1
+ F....031 ... 1 031 -1
+ F....033 ... 1 033 -1
+ F....034 ... 1 034 -1
+ F....035 ... 1 035 -1
+ F....036 ... 1 036 -1
+ F....038 ... 1 038 -1
+ F....039 ... 1 039 -1
+ F....040 ... 1 040 -1
+ F....041 ... 1 041 -1
+ F....042 ... 1 042 -1
+ F.001... COST 0.979 ... -1
+ F.001... 001 1 U.001... 1
+ F.001003 COST 0.034 001 1
+ F.001003 003 -1 U.001003 1
+ F.002003 COST 0.016 002 1
+ F.002003 003 -1 U.002003 1
+ F.002... COST 0.914 ... -1
+ F.002... 002 1 U.002... 1
+ F.003005 COST 0.057 003 1
+ F.003005 005 -1 U.003005 1
+ F.004005 COST 0.016 004 1
+ F.004005 005 -1 U.004005 1
+ F.004... COST 0.969 ... -1
+ F.004... 004 1 U.004... 1
+ F.005007 COST 0.006 007 -1
+ F.005007 005 1 U.005007 1
+ F.006007 COST 0.01 006 1
+ F.006007 007 -1 U.006007 1
+ F.007008 COST 0.002 007 1
+ F.007008 008 -1 U.007008 1
+ F.008... COST 0.976 ... -1
+ F.008... 008 1 U.008... 1
+ F.008009 COST 0.017 009 -1
+ F.008009 008 1 U.008009 1
+ F.010012 COST 0.027 010 1
+ F.010012 012 -1 U.010012 1
+ F.011012 COST 0.009 011 1
+ F.011012 012 -1 U.011012 1
+ F.012... COST 0.964 ... -1
+ F.012... 012 1 U.012... 1
+ F.012013 COST 0.025 013 -1
+ F.012013 012 1 U.012013 1
+ F.013016 COST 0.015 013 1
+ F.013016 016 -1 U.013016 1
+ F.014015 COST 0.01 014 1
+ F.014015 015 -1 U.014015 1
+ F.015016 COST 0.006 015 1
+ F.015016 016 -1 U.015016 1
+ F.016... COST 0.97 ... -1
+ F.016... 016 1 U.016... 1
+ F.016017 COST 0.022 017 -1
+ F.016017 016 1 U.016017 1
+ F.017018 COST 0.003 017 1
+ F.017018 018 -1 U.017018 1
+ F.009018 COST 0.002 009 1
+ F.009018 018 -1 U.009018 1
+ F.018019 COST 0.004 019 -1
+ F.018019 018 1 U.018019 1
+ F.019024 COST 0.969 019 1
+ F.019024 024 -1 U.019024 1
+ F.024... COST 0.021 ... -1
+ F.024... 024 1 U.024... 1
+ F.023024 COST 0.026 023 1
+ F.023024 024 -1 U.023024 1
+ F.022023 COST 0.022 023 -1
+ F.022023 022 1 U.022023 1
+ F.020022 COST 0.005 020 1
+ F.020022 022 -1 U.020022 1
+ F.021022 COST 0.971 021 1
+ F.021022 022 -1 U.021022 1
+ F.022... COST 0.004 ... -1
+ F.022... 022 1 U.022... 1
+ F.024026 COST 0.054 026 -1
+ F.024026 024 1 U.024026 1
+ F.025026 COST 0.054 025 1
+ F.025026 026 -1 U.025026 1
+ F.025... COST 1.017 ... -1
+ F.025... 025 1 U.025... 1
+ F.026027 COST 0.02 026 1
+ F.026027 027 -1 U.026027 1
+ F.027... COST 0.967 ... -1
+ F.027... 027 1 U.027... 1
+ F.027032 COST 0.011 027 1
+ F.027032 032 -1 U.027032 1
+ F.030031 COST 0.012 030 1
+ F.030031 031 -1 U.030031 1
+ F.031032 COST 0.004 031 1
+ F.031032 032 -1 U.031032 1
+ F.029031 COST 0.012 029 1
+ F.029031 031 -1 U.029031 1
+ F.028029 COST 0.024 028 1
+ F.028029 029 -1 U.028029 1
+ F.028... COST 0.975 ... -1
+ F.028... 028 1 U.028... 1
+ F.032033 COST 0.002 033 -1
+ F.032033 032 1 U.032033 1
+ F.033037 COST 0.004 033 1
+ F.033037 037 -1 U.033037 1
+ F.036037 COST 0.018 036 1
+ F.036037 037 -1 U.036037 1
+ F.034036 COST 0.016 034 1
+ F.034036 036 -1 U.034036 1
+ F.035036 COST 0.015 035 1
+ F.035036 036 -1 U.035036 1
+ F.037038 COST 0.001 038 -1
+ F.037038 037 1 U.037038 1
+ F.038040 COST 0.009 038 1
+ F.038040 040 -1 U.038040 1
+ F.039040 COST 0.025 039 1
+ F.039040 040 -1 U.039040 1
+ F.040... COST 0.967 ... -1
+ F.040... 040 1 U.040... 1
+ F.041... COST 0.98 ... -1
+ F.041... 041 1 U.041... 1
+ F.040041 COST 0.01 040 1
+ F.040041 041 -1 U.040041 1
+ F.041042 COST 0.035 041 1
+ F.041042 042 -1 U.041042 1
+ F.042... COST 0.978 ... -1
+ F.042... 042 1 U.042... 1
+RHS
+BOUNDS
+ UP BOUNDS I.001... 1
+ UP BOUNDS I.001003 1
+ UP BOUNDS I.002003 1
+ UP BOUNDS I.002... 1
+ UP BOUNDS I.003005 1
+ UP BOUNDS I.004005 1
+ UP BOUNDS I.004... 1
+ UP BOUNDS I.005007 1
+ UP BOUNDS I.006007 1
+ UP BOUNDS I.007008 1
+ UP BOUNDS I.008... 1
+ UP BOUNDS I.008009 1
+ UP BOUNDS I.010012 1
+ UP BOUNDS I.011012 1
+ UP BOUNDS I.012... 1
+ UP BOUNDS I.012013 1
+ UP BOUNDS I.013016 1
+ UP BOUNDS I.014015 1
+ UP BOUNDS I.015016 1
+ UP BOUNDS I.016... 1
+ UP BOUNDS I.016017 1
+ UP BOUNDS I.017018 1
+ UP BOUNDS I.009018 1
+ UP BOUNDS I.018019 1
+ UP BOUNDS I.019024 1
+ UP BOUNDS I.024... 1
+ UP BOUNDS I.023024 1
+ UP BOUNDS I.022023 1
+ UP BOUNDS I.020022 1
+ UP BOUNDS I.021022 1
+ UP BOUNDS I.022... 1
+ UP BOUNDS I.024026 1
+ UP BOUNDS I.025026 1
+ UP BOUNDS I.025... 1
+ UP BOUNDS I.026027 1
+ UP BOUNDS I.027... 1
+ UP BOUNDS I.027032 1
+ UP BOUNDS I.030031 1
+ UP BOUNDS I.031032 1
+ UP BOUNDS I.029031 1
+ UP BOUNDS I.028029 1
+ UP BOUNDS I.028... 1
+ UP BOUNDS I.032033 1
+ UP BOUNDS I.033037 1
+ UP BOUNDS I.036037 1
+ UP BOUNDS I.034036 1
+ UP BOUNDS I.035036 1
+ UP BOUNDS I.037038 1
+ UP BOUNDS I.038040 1
+ UP BOUNDS I.039040 1
+ UP BOUNDS I.040... 1
+ UP BOUNDS I.041... 1
+ UP BOUNDS I.040041 1
+ UP BOUNDS I.041042 1
+ UP BOUNDS I.042... 1
+ FX BOUNDS F....001 2.45
+ FX BOUNDS F....002 0.61
+ FX BOUNDS F....004 7.91
+ FX BOUNDS F....006 4.54
+ FX BOUNDS F....007 1.14
+ FX BOUNDS F....009 0.28
+ FX BOUNDS F....010 1.13
+ FX BOUNDS F....011 21.46
+ FX BOUNDS F....013 4.64
+ FX BOUNDS F....014 0.31
+ FX BOUNDS F....015 1.24
+ FX BOUNDS F....017 0.07
+ FX BOUNDS F....019 2.41
+ FX BOUNDS F....020 0.39
+ FX BOUNDS F....021 7.41
+ FX BOUNDS F....023 0.07
+ FX BOUNDS F....025 19.22
+ FX BOUNDS F....026 10.49
+ FX BOUNDS F....028 0.88
+ FX BOUNDS F....029 5.7
+ FX BOUNDS F....030 0.28
+ FX BOUNDS F....031 0.28
+ FX BOUNDS F....033 0.19
+ FX BOUNDS F....034 0.19
+ FX BOUNDS F....035 0.28
+ FX BOUNDS F....036 0.57
+ FX BOUNDS F....038 5.3
+ FX BOUNDS F....039 5.32
+ FX BOUNDS F....040 0.76
+ FX BOUNDS F....041 5.08
+ FX BOUNDS F....042 6.44
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex1.mps b/demos/ppl_lpsol/examples/ex1.mps
new file mode 100644
index 0000000..fcbc51a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex1.mps
@@ -0,0 +1,21 @@
+NAME from_lp_file
+ROWS
+ N r_000000
+ L C1
+ L r_000002
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ x1 r_000000 1
+ x1 C1 2
+ x1 r_000002 -4
+ x2 r_000000 -2
+ x2 C1 1
+ x2 r_000002 4
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ RHS C1 5
+ RHS r_000002 5
+BOUNDS
+ PL FOO x1
+ PL FOO x2
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex12.mps b/demos/ppl_lpsol/examples/ex12.mps
new file mode 100644
index 0000000..755462b
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex12.mps
@@ -0,0 +1,25 @@
+* Problem: UNKNOWN
+* Class: MIP
+* Rows: 2
+* Columns: 2 (1 integer, 0 binary)
+* Non-zeros: 4
+* Format: Fixed MPS
+*
+NAME
+ROWS
+ N R0000000
+ L R0000001
+ L R0000002
+COLUMNS
+ M0000001 'MARKER' 'INTORG'
+ C0000001 R0000000 4 R0000001 0.7
+ C0000001 R0000002 0.1
+ M0000002 'MARKER' 'INTEND'
+ C0000002 R0000000 1 R0000001 1
+ C0000002 R0000002 0.025
+RHS
+ RHS1 R0000001 630 R0000002 135
+BOUNDS
+ LO BND1 C0000002 20
+ UP BND1 C0000002 500
+ENDATA
diff --git a/demos/ppl_lpsol/examples/kb2.mps b/demos/ppl_lpsol/examples/kb2.mps
new file mode 100644
index 0000000..625ceba
--- /dev/null
+++ b/demos/ppl_lpsol/examples/kb2.mps
@@ -0,0 +1,219 @@
+NAME KB2
+ROWS
+ N FAT7..J.
+ E BAL...BW
+ E BHC...BW
+ E BLC...BW
+ E BLV...BW
+ E BN4...BW
+ E BP8...BW
+ E BTO...BW
+ E B3E...BW
+ E B3P...BW
+ E B3R...BW
+ E B3T...BW
+ E B3E.VOBW
+ E B3P.VOBW
+ E B3R.VOBW
+ G HMH.3EBW
+ G HML.3EBW
+ G HMM.3EBW
+ G HRH.3EBW
+ G HRL.3EBW
+ G HRM.3EBW
+ G HMH.3RBW
+ G HML.3RBW
+ G HMM.3RBW
+ G HRH.3RBW
+ G HRL.3RBW
+ G HRM.3RBW
+ G NOI.3EBW
+ G NOI.3PBW
+ G NOI.3RBW
+ E WMO.3PBW
+ E WRO.3PBW
+ L XPB.3ABW
+ L XCV.3EBW
+ L XPB.3EBW
+ L XRV.3EBW
+ L X12.3EBW
+ L XCV.3PBW
+ L XRV.3PBW
+ L X12.3PBW
+ L XCV.3RBW
+ L XPB.3RBW
+ L XRV.3RBW
+ L X12.3RBW
+COLUMNS
+ BAL.3EBW BAL...BW -1. B3E.VOBW 1.
+ BAL.3EBW XCV.3EBW 6. XRV.3EBW 4.
+ BAL.3EBW X12.3EBW 50.3 HRL.3EBW 98.70277
+ BAL.3EBW HML.3EBW 94.63568 HRM.3EBW 102.02191
+ BAL.3EBW HMM.3EBW 98.08976 HRH.3EBW 103.0581
+ BAL.3EBW HMH.3EBW 99.18559
+ BHC.3EBW BHC...BW -1. B3E.VOBW 1.
+ BHC.3EBW XCV.3EBW -2. XRV.3EBW .5
+ BHC.3EBW X12.3EBW -15.6 HRL.3EBW 92.89535
+ BHC.3EBW HML.3EBW 79.40534 HRM.3EBW 94.57094
+ BHC.3EBW HMM.3EBW 81.47009 HRH.3EBW 95.02163
+ BHC.3EBW HMH.3EBW 82.04308
+ BLC.3EBW BLC...BW -1. B3E.VOBW 1.
+ BLC.3EBW XCV.3EBW 7. XRV.3EBW 4.5
+ BLC.3EBW X12.3EBW 57.9 HRL.3EBW 95.38345
+ BLC.3EBW HML.3EBW 80.37873 HRM.3EBW 97.97965
+ BLC.3EBW HMM.3EBW 83.22026 HRH.3EBW 98.64634
+ BLC.3EBW HMH.3EBW 83.9937
+ BLV.3EBW BLV...BW -1. B3E.VOBW 1.
+ BLV.3EBW XCV.3EBW 14. XRV.3EBW 7.2
+ BLV.3EBW X12.3EBW 102.3 HRL.3EBW 82.8797
+ BLV.3EBW HML.3EBW 80.36789 HRM.3EBW 87.33298
+ BLV.3EBW HMM.3EBW 84.5191 HRH.3EBW 88.46612
+ BLV.3EBW HMH.3EBW 85.61385
+ BN4.3EBW BN4...BW -1. B3E.VOBW 1.
+ BN4.3EBW XCV.3EBW 80. XRV.3EBW 70.
+ BN4.3EBW X12.3EBW 113. HRL.3EBW 97.32996
+ BN4.3EBW HML.3EBW 92.71594 HRM.3EBW 100.65
+ BN4.3EBW HMM.3EBW 96.86628 HRH.3EBW 101.66321
+ BN4.3EBW HMH.3EBW 98.06433
+ BP8.3EBW BP8...BW -1. B3E.VOBW 1.
+ BP8.3EBW XCV.3EBW 4. XRV.3EBW 3.6
+ BP8.3EBW X12.3EBW 28.9 HRL.3EBW 101.17309
+ BP8.3EBW HML.3EBW 90.03844 HRM.3EBW 102.21363
+ BP8.3EBW HMM.3EBW 91.26611 HRH.3EBW 102.51818
+ BP8.3EBW HMH.3EBW 91.62642
+ BTO.3EBW BTO...BW -1. B3E.VOBW 1.
+ BTO.3EBW XCV.3EBW -1. XRV.3EBW 1.2
+ BTO.3EBW X12.3EBW 5. HRL.3EBW 105.47666
+ BTO.3EBW HML.3EBW 89.10432 HRM.3EBW 106.21918
+ BTO.3EBW HMM.3EBW 90.14887 HRH.3EBW 106.46719
+ BTO.3EBW HMH.3EBW 90.49629
+ BAL.3PBW BAL...BW -1. B3P.VOBW 1.
+ BAL.3PBW XCV.3PBW 6. XRV.3PBW 4.
+ BAL.3PBW X12.3PBW 50.3 WRO.3PBW 96.13556
+ BAL.3PBW WMO.3PBW 91.96313
+ BHC.3PBW BHC...BW -1. B3P.VOBW 1.
+ BHC.3PBW XCV.3PBW -2. XRV.3PBW .5
+ BHC.3PBW X12.3PBW -15.6 WRO.3PBW 90.99637
+ BHC.3PBW WMO.3PBW 78.09095
+ BLC.3PBW BLC...BW -1. B3P.VOBW 1.
+ BLC.3PBW XCV.3PBW 7. XRV.3PBW 4.5
+ BLC.3PBW X12.3PBW 57.9 WRO.3PBW 93.95665
+ BLC.3PBW WMO.3PBW 80.74635
+ BLV.3PBW BLV...BW -1. B3P.VOBW 1.
+ BLV.3PBW XCV.3PBW 14. XRV.3PBW 7.2
+ BLV.3PBW X12.3PBW 102.3 WRO.3PBW 79.78002
+ BLV.3PBW WMO.3PBW 77.37441
+ BN4.3PBW BN4...BW -1. B3P.VOBW 1.
+ BN4.3PBW XCV.3PBW 80. XRV.3PBW 70.
+ BN4.3PBW X12.3PBW 113. WRO.3PBW 94.11062
+ BN4.3PBW WMO.3PBW 88.35436
+ BP8.3PBW BP8...BW -1. B3P.VOBW 1.
+ BP8.3PBW XCV.3PBW 4. XRV.3PBW 3.6
+ BP8.3PBW X12.3PBW 28.9 WRO.3PBW 99.83178
+ BP8.3PBW WMO.3PBW 88.58029
+ BTO.3PBW BTO...BW -1. B3P.VOBW 1.
+ BTO.3PBW XCV.3PBW -1. XRV.3PBW 1.2
+ BTO.3PBW X12.3PBW 5. WRO.3PBW 105.07558
+ BTO.3PBW WMO.3PBW 88.18188
+ BAL.3RBW BAL...BW -1. B3R.VOBW 1.
+ BAL.3RBW XCV.3RBW 6. XRV.3RBW 4.
+ BAL.3RBW X12.3RBW 50.3 HRL.3RBW 99.19039
+ BAL.3RBW HML.3RBW 95.17073 HRM.3RBW 101.0885
+ BAL.3RBW HMM.3RBW 97.11016 HRH.3RBW 103.0581
+ BAL.3RBW HMH.3RBW 99.18559
+ BHC.3RBW BHC...BW -1. B3R.VOBW 1.
+ BHC.3RBW XCV.3RBW -2. XRV.3RBW .5
+ BHC.3RBW X12.3RBW -15.6 HRL.3RBW 93.16124
+ BHC.3RBW HML.3RBW 79.72867 HRM.3RBW 94.14769
+ BHC.3RBW HMM.3RBW 80.94047 HRH.3RBW 95.02163
+ BHC.3RBW HMH.3RBW 82.04308
+ BLC.3RBW BLC...BW -1. B3R.VOBW 1.
+ BLC.3RBW XCV.3RBW 7. XRV.3RBW 4.5
+ BLC.3RBW X12.3RBW 57.9 HRL.3RBW 95.80861
+ BLC.3RBW HML.3RBW 80.82888 HRM.3RBW 97.34183
+ BLC.3RBW HMM.3RBW 82.49926 HRH.3RBW 98.64634
+ BLC.3RBW HMH.3RBW 83.9937
+ BLV.3RBW BLV...BW -1. B3R.VOBW 1.
+ BLV.3RBW XCV.3RBW 14. XRV.3RBW 7.2
+ BLV.3RBW X12.3RBW 102.3 HRL.3RBW 83.61375
+ BLV.3RBW HML.3RBW 81.03825 HRM.3RBW 86.24515
+ BLV.3RBW HMM.3RBW 83.48458 HRH.3RBW 88.46612
+ BLV.3RBW HMH.3RBW 85.61385
+ BN4.3RBW BN4...BW -1. B3R.VOBW 1.
+ BN4.3RBW XCV.3RBW 80. XRV.3RBW 70.
+ BN4.3RBW X12.3RBW 113. HRL.3RBW 97.86876
+ BN4.3RBW HML.3RBW 93.41749 HRM.3RBW 99.77765
+ BN4.3RBW HMM.3RBW 95.86635 HRH.3RBW 101.66321
+ BN4.3RBW HMH.3RBW 98.06433
+ BP8.3RBW BP8...BW -1. B3R.VOBW 1.
+ BP8.3RBW XCV.3RBW 4. XRV.3RBW 3.6
+ BP8.3RBW X12.3RBW 28.9 HRL.3RBW 101.32905
+ BP8.3RBW HML.3RBW 90.22411 HRM.3RBW 101.93754
+ BP8.3RBW HMM.3RBW 90.94112 HRH.3RBW 102.51818
+ BP8.3RBW HMH.3RBW 91.62642
+ BTO.3RBW BTO...BW -1. B3R.VOBW 1.
+ BTO.3RBW XCV.3RBW -1. XRV.3RBW 1.2
+ BTO.3RBW X12.3RBW 5. HRL.3RBW 105.58392
+ BTO.3RBW HML.3RBW 89.25587 HRM.3RBW 106.0019
+ BTO.3RBW HMM.3RBW 89.84584 HRH.3RBW 106.46719
+ BTO.3RBW HMH.3RBW 90.49629
+ D3T...BW B3T...BW -1. FAT7..J. -16.5
+ EAL...BW BAL...BW 1.
+ EHC...BW BHC...BW 1.
+ ELC...BW BLC...BW 1.
+ ELV...BW BLV...BW 1.
+ EN4...BW BN4...BW 1. FAT7..J. 12.
+ EP8...BW BP8...BW 1.
+ ETO...BW BTO...BW 1. FAT7..J. 16.
+ M3..3TBW B3T...BW 1. B3E...BW -.29
+ M3..3TBW B3P...BW -.17 B3R...BW -.54
+ QPB73EBW FAT7..J. .08757 XPB.3EBW 1.
+ QPB73EBW HRL.3EBW 2.52143 HML.3EBW 3.42918
+ QPB73EBW HRM.3EBW 1.54954 HMM.3EBW 1.55751
+ QPB73EBW HRH.3EBW 1.27141 HMH.3EBW 1.23842
+ QPB73EBW XPB.3ABW 1.
+ QVO73EBW B3E...BW 1. B3E.VOBW -1.
+ QVO73EBW XCV.3EBW -16. XRV.3EBW -12.
+ QVO73EBW X12.3EBW -61. NOI.3EBW -107.52
+ QVO73EBW XPB.3EBW -1.7 HRL.3EBW -1.00857
+ QVO73EBW HML.3EBW -1.37167 HRM.3EBW -2.0144
+ QVO73EBW HMM.3EBW -2.02477 HRH.3EBW -2.16139
+ QVO73EBW HMH.3EBW -2.10531 XPB.3ABW -1.5
+ QVO73PBW B3P...BW 1. B3P.VOBW -1.
+ QVO73PBW XCV.3PBW -16. XRV.3PBW -12.
+ QVO73PBW X12.3PBW -61. NOI.3PBW -97.41
+ QVO73PBW XPB.3ABW -1.5
+ QPB73RBW FAT7..J. .08757 XPB.3RBW 1.
+ QPB73RBW HRL.3RBW 4.31949 HML.3RBW 4.41873
+ QPB73RBW HRM.3RBW 2.62696 HMM.3RBW 2.74531
+ QPB73RBW HRH.3RBW 1.64391 HMH.3RBW 1.75028
+ QPB73RBW XPB.3ABW 1.
+ QVO73RBW B3R...BW 1. B3R.VOBW -1.
+ QVO73RBW XCV.3RBW -16. XRV.3RBW -12.
+ QVO73RBW X12.3RBW -61. NOI.3RBW -98.5
+ QVO73RBW XPB.3RBW -1.7 HRL.3RBW -2.15975
+ QVO73RBW HML.3RBW -2.20937 HRM.3RBW -2.62696
+ QVO73RBW HMM.3RBW -2.74531 HRH.3RBW -2.79464
+ QVO73RBW HMH.3RBW -2.97548 XPB.3ABW -1.5
+ WMO73EBW NOI.3EBW .73 HML.3EBW -1.
+ WMO73EBW HMM.3EBW -1. HMH.3EBW -1.
+ WRO73EBW NOI.3EBW .41 HRL.3EBW -1.
+ WRO73EBW HRM.3EBW -1. HRH.3EBW -1.
+ WMO73PBW WMO.3PBW -1. NOI.3PBW .84
+ WRO73PBW WRO.3PBW -1. NOI.3PBW .27
+ WMO73RBW NOI.3RBW .81 HML.3RBW -1.
+ WMO73RBW HMM.3RBW -1. HMH.3RBW -1.
+ WRO73RBW NOI.3RBW .31 HRL.3RBW -1.
+ WRO73RBW HRM.3RBW -1. HRH.3RBW -1.
+RHS
+BOUNDS
+ UP 77BOUND BHC.3EBW 10.
+ UP 77BOUND D3T...BW 200.
+ UP 77BOUND EAL...BW 10.
+ UP 77BOUND EHC...BW 20.
+ UP 77BOUND ELC...BW 25.
+ UP 77BOUND ELV...BW 12.
+ UP 77BOUND EN4...BW 100.
+ UP 77BOUND EP8...BW 35.
+ UP 77BOUND ETO...BW 5.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/lseu.mps b/demos/ppl_lpsol/examples/lseu.mps
new file mode 100644
index 0000000..00e6b5a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/lseu.mps
@@ -0,0 +1,371 @@
+*NAME: lseu
+*ROWS: 28
+*COLUMNS: 89
+*INTEGER: 89
+*NONZERO: 309
+*BEST SOLN: 1120 (opt)
+*LP SOLN: 834.68
+*SOURCE: C. E. Lemke and K. Spielberg
+* Ellis L. Johnson and Uwe H. Suhl
+* John J. Forrest (IBM)
+*APPLICATION: unknown
+*COMMENTS: pure 0/1 IP
+*
+*
+NAME LSEU
+ROWS
+ N R100
+ L R101
+ L R102
+ L R103
+ L R104
+ L R105
+ L R106
+ L R107
+ L R108
+ L R109
+ L R110
+ L R111
+ L R112
+ L R113
+ L R114
+ L R115
+ L R116
+ L R117
+ L R118
+ L R119
+ L R120
+ L R121
+ L R122
+ L R123
+ L R124
+ L R125
+ L R126
+ L R127
+ L R128
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ C101 R100 7 R119 525
+ C101 R120 -525 R122 -525
+ C101 R123 -525
+ C102 R100 10 R119 500
+ C102 R120 -500 R122 -500
+ C102 R123 -500
+ C103 R100 179 R101 1
+ C103 R119 475 R120 -475
+ C103 R124 -475 R125 -475
+ C104 R100 186 R101 1
+ C104 R119 475 R120 -475
+ C104 R122 -475 R123 -475
+ C105 R100 179 R101 1
+ C105 R119 475 R120 -475
+ C105 R122 -190 R123 -190
+ C105 R124 -285 R125 -285
+ C106 R102 1 R118 -450
+ C107 R102 1 R124 -450
+ C107 R125 -450
+ C108 R100 6 R102 1
+ C108 R122 -450 R123 -450
+ C109 R102 1 R122 -165
+ C109 R123 -165 R124 -285
+ C109 R125 -285
+ C110 R102 1 R124 -150
+ C110 R125 -150
+ C111 R100 164 R103 1
+ C111 R118 -435
+ C112 R100 164 R103 1
+ C112 R124 -435 R125 -435
+ C113 R100 170 R103 1
+ C113 R119 435 R120 -435
+ C113 R123 -435
+ C114 R100 164 R103 1
+ C114 R119 435 R120 -435
+ C114 R121 -435
+ C115 R100 346 R104 1
+ C115 R124 -435 R125 -435
+ C116 R100 346 R104 1
+ C116 R119 435 R120 -435
+ C116 R125 -435
+ C117 R100 248 R105 1
+ C117 R119 435 R120 -435
+ C117 R124 -435 R125 -435
+ C118 R100 253 R105 1
+ C118 R119 435 R120 -435
+ C118 R122 -435 R123 -435
+ C119 R100 248 R105 1
+ C119 R119 435 R120 -435
+ C119 R122 -300 R123 -300
+ C119 R124 -135 R125 -135
+ C120 R100 346 R106 1
+ C120 R118 -435
+ C121 R100 346 R106 1
+ C121 R123 -400
+ C122 R100 346 R106 1
+ C122 R121 -400
+ C123 R100 346 R106 1
+ C123 R124 -100 R125 -100
+ C123 R127 -300
+ C124 R100 160 R107 1
+ C124 R124 -400 R125 -400
+ C125 R100 161 R107 1
+ C125 R122 -400 R123 -400
+ C126 R100 160 R107 1
+ C126 R122 -115 R123 -115
+ C126 R124 -285 R125 -285
+ C127 R100 160 R107 1
+ C127 R119 425 R120 -425
+ C127 R125 -425
+ C128 R100 161 R107 1
+ C128 R119 425 R120 -425
+ C128 R123 -425
+ C129 R100 160 R107 1
+ C129 R119 425 R120 -425
+ C129 R123 -140 R125 -285
+ C130 R100 160 R107 1
+ C130 R124 -100 R125 -100
+ C130 R126 -300 R127 -300
+ C131 R100 278 R108 1
+ C131 R118 -350
+ C132 R100 278 R108 1
+ C132 R124 -350 R125 -350
+ C133 R100 278 R108 1
+ C133 R121 -350
+ C134 R100 86 R109 1
+ C134 R122 -330 R123 -330
+ C135 R100 86 R109 1
+ C135 R126 -330 R127 -330
+ C136 R100 86 R109 1
+ C136 R119 330 R120 -330
+ C136 R124 -330 R125 -330
+ C137 R100 86 R109 1
+ C137 R119 330 R120 -330
+ C137 R123 -330
+ C138 R100 86 R109 1
+ C138 R119 330 R120 -330
+ C138 R121 -330
+ C139 R100 86 R119 330
+ C139 R120 -330 R122 -330
+ C139 R123 -330
+ C140 R100 188 R110 1
+ C140 R122 -330 R123 -330
+ C141 R100 188 R110 1
+ C141 R119 330 R120 -330
+ C141 R124 -330 R125 -330
+ C142 R100 188 R110 1
+ C142 R119 330 R120 -330
+ C142 R121 -330
+ C143 R100 85 R111 1
+ C143 R122 -325 R123 -325
+ C144 R100 85 R111 1
+ C144 R126 -325 R127 -325
+ C145 R100 85 R111 1
+ C145 R119 325 R120 -325
+ C145 R124 -325 R125 -325
+ C146 R100 85 R111 1
+ C146 R119 325 R120 -325
+ C146 R123 -325
+ C147 R100 85 R111 1
+ C147 R119 325 R120 -325
+ C147 R121 -325
+ C148 R100 78 R112 1
+ C148 R122 -300 R123 -300
+ C149 R100 78 R112 1
+ C149 R119 300 R120 -300
+ C149 R124 -300 R125 -300
+ C150 R100 78 R112 1
+ C150 R119 300 R120 -300
+ C150 R121 -300
+ C151 R100 78 R112 1
+ C151 R128 -300
+ C152 R100 78 R113 1
+ C152 R122 -300 R123 -300
+ C153 R100 78 R113 1
+ C153 R126 -300 R127 -300
+ C154 R100 78 R113 1
+ C154 R119 300 R120 -300
+ C154 R124 -300 R125 -300
+ C155 R100 78 R113 1
+ C155 R119 300 R120 -300
+ C155 R123 -300
+ C156 R100 78 R113 1
+ C156 R119 300 R120 -300
+ C156 R121 -300
+ C157 R100 171 R114 1
+ C157 R122 -300 R123 -300
+ C158 R100 171 R114 1
+ C158 R126 -300 R127 -300
+ C159 R100 171 R114 1
+ C159 R119 300 R120 -300
+ C159 R123 -300
+ C160 R100 171 R114 1
+ C160 R119 300 R120 -300
+ C160 R121 -300
+ C161 R100 163 R115 1
+ C161 R119 285 R120 -285
+ C161 R124 -285 R125 -285
+ C162 R100 163 R115 1
+ C162 R119 285 R120 -285
+ C162 R122 -285 R123 -285
+ C163 R100 163 R115 1
+ C163 R128 -285
+ C164 R100 69 R116 1
+ C164 R119 265 R120 -265
+ C164 R124 -265 R125 -265
+ C165 R100 69 R116 1
+ C165 R119 265 R120 -265
+ C165 R122 -265 R123 -265
+ C166 R100 183 R117 1
+ C166 R118 -230
+ C167 R100 183 R117 1
+ C167 R124 -230 R125 -230
+ C168 R100 183 R117 1
+ C168 R119 230 R120 -230
+ C168 R125 -230
+ C169 R100 183 R117 1
+ C169 R119 230 R120 -230
+ C169 R123 -230
+ C170 R100 49 R119 190
+ C170 R120 -190 R122 -190
+ C170 R123 -190
+ C171 R100 183 R117 1
+ C172 R100 258 R118 -200
+ C173 R100 517 R118 -400
+ C174 R100 250 R126 -200
+ C174 R127 -200
+ C175 R100 500 R126 -400
+ C175 R127 -400
+ C176 R100 250 R127 -200
+ C177 R100 500 R127 -400
+ C178 R100 159 R119 200
+ C178 R120 -200 R124 -200
+ C178 R125 -200
+ C179 R100 318 R119 400
+ C179 R120 -400 R124 -400
+ C179 R125 -400
+ C180 R100 159 R119 200
+ C180 R120 -200 R125 -200
+ C181 R100 318 R119 400
+ C181 R120 -400 R125 -400
+ C182 R100 159 R119 200
+ C182 R120 -200 R122 -200
+ C182 R123 -200
+ C183 R100 318 R119 400
+ C183 R120 -400 R122 -400
+ C183 R123 -400
+ C184 R100 159 R119 200
+ C184 R120 -200 R123 -200
+ C185 R100 318 R119 400
+ C185 R120 -400 R123 -400
+ C186 R100 114 R119 200
+ C186 R120 -200 R121 -200
+ C187 R100 228 R119 400
+ C187 R120 -400 R121 -400
+ C188 R100 159 R128 -200
+ C189 R100 318 R128 -400
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ RHS R101 1 R102 1
+ RHS R103 1 R104 1
+ RHS R105 1 R106 1
+ RHS R107 1 R108 1
+ RHS R109 1 R110 1
+ RHS R111 1 R112 1
+ RHS R113 1 R114 1
+ RHS R115 1 R116 1
+ RHS R117 1 R118 -190
+ RHS R119 2700 R120 -2600
+ RHS R121 -630 R122 -900
+ RHS R123 -1656 R124 -335
+ RHS R125 -1026 R126 -150
+ RHS R127 -500 R128 -270
+BOUNDS
+ UP ONE C101 1
+ UP ONE C102 1
+ UP ONE C103 1
+ UP ONE C104 1
+ UP ONE C105 1
+ UP ONE C106 1
+ UP ONE C107 1
+ UP ONE C108 1
+ UP ONE C109 1
+ UP ONE C110 1
+ UP ONE C111 1
+ UP ONE C112 1
+ UP ONE C113 1
+ UP ONE C114 1
+ UP ONE C115 1
+ UP ONE C116 1
+ UP ONE C117 1
+ UP ONE C118 1
+ UP ONE C119 1
+ UP ONE C120 1
+ UP ONE C121 1
+ UP ONE C122 1
+ UP ONE C123 1
+ UP ONE C124 1
+ UP ONE C125 1
+ UP ONE C126 1
+ UP ONE C127 1
+ UP ONE C128 1
+ UP ONE C129 1
+ UP ONE C130 1
+ UP ONE C131 1
+ UP ONE C132 1
+ UP ONE C133 1
+ UP ONE C134 1
+ UP ONE C135 1
+ UP ONE C136 1
+ UP ONE C137 1
+ UP ONE C138 1
+ UP ONE C139 1
+ UP ONE C140 1
+ UP ONE C141 1
+ UP ONE C142 1
+ UP ONE C143 1
+ UP ONE C144 1
+ UP ONE C145 1
+ UP ONE C146 1
+ UP ONE C147 1
+ UP ONE C148 1
+ UP ONE C149 1
+ UP ONE C150 1
+ UP ONE C151 1
+ UP ONE C152 1
+ UP ONE C153 1
+ UP ONE C154 1
+ UP ONE C155 1
+ UP ONE C156 1
+ UP ONE C157 1
+ UP ONE C158 1
+ UP ONE C159 1
+ UP ONE C160 1
+ UP ONE C161 1
+ UP ONE C162 1
+ UP ONE C163 1
+ UP ONE C164 1
+ UP ONE C165 1
+ UP ONE C166 1
+ UP ONE C167 1
+ UP ONE C168 1
+ UP ONE C169 1
+ UP ONE C170 1
+ UP ONE C171 1
+ UP ONE C172 1
+ UP ONE C173 1
+ UP ONE C174 1
+ UP ONE C175 1
+ UP ONE C176 1
+ UP ONE C177 1
+ UP ONE C178 1
+ UP ONE C179 1
+ UP ONE C180 1
+ UP ONE C181 1
+ UP ONE C182 1
+ UP ONE C183 1
+ UP ONE C184 1
+ UP ONE C185 1
+ UP ONE C186 1
+ UP ONE C187 1
+ UP ONE C188 1
+ UP ONE C189 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare1.mps b/demos/ppl_lpsol/examples/markshare1.mps
new file mode 100644
index 0000000..1efa1f5
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare1.mps
@@ -0,0 +1,236 @@
+NAME markshare1
+ROWS
+ N obj
+ E c1
+ E c2
+ E c3
+ E c4
+ E c5
+ E c6
+COLUMNS
+ x1 obj 1 c1 1
+ x2 obj -1 c1 1
+ x3 obj 1 c2 1
+ x4 obj -1 c2 1
+ x5 obj 1 c3 1
+ x6 obj -1 c3 1
+ x7 obj 1 c4 1
+ x8 obj -1 c4 1
+ x9 obj 1 c5 1
+ x10 obj -1 c5 1
+ x11 obj 1 c6 1
+ x12 obj -1 c6 1
+ MARK0000 'MARKER' 'INTORG'
+ x13 c1 25 c2 97
+ x13 c3 95 c4 1
+ x13 c5 3 c6 69
+ x14 c1 35 c2 64
+ x14 c3 71 c4 27
+ x14 c5 94 c6 72
+ x15 c1 14 c2 24
+ x15 c3 19 c4 46
+ x15 c5 51 c6 94
+ x16 c1 76 c2 63
+ x16 c3 15 c4 48
+ x16 c5 4 c6 56
+ x17 c1 58 c2 58
+ x17 c3 66 c4 66
+ x17 c5 25 c6 90
+ x18 c1 10 c2 45
+ x18 c3 76 c4 58
+ x18 c5 46 c6 20
+ x19 c1 20 c2 20
+ x19 c3 4 c4 52
+ x19 c5 30 c6 56
+ x20 c1 51 c2 71
+ x20 c3 50 c4 6
+ x20 c5 2 c6 50
+ x21 c1 58 c2 32
+ x21 c3 50 c4 14
+ x21 c5 89 c6 79
+ x22 c1 1 c2 7
+ x22 c3 97 c4 26
+ x22 c5 65 c6 59
+ x23 c1 35 c2 28
+ x23 c3 83 c4 55
+ x23 c5 28 c6 36
+ x24 c1 40 c2 77
+ x24 c3 14 c4 61
+ x24 c5 46 c6 24
+ x25 c1 65 c2 95
+ x25 c3 27 c4 60
+ x25 c5 36 c6 42
+ x26 c1 59 c2 96
+ x26 c3 14 c4 3
+ x26 c5 53 c6 9
+ x27 c1 24 c2 70
+ x27 c3 34 c4 33
+ x27 c5 30 c6 29
+ x28 c1 44 c2 22
+ x28 c3 9 c4 99
+ x28 c5 73 c6 68
+ x29 c1 1 c2 93
+ x29 c3 99 c4 36
+ x29 c5 37 c6 10
+ x30 c1 93 c2 32
+ x30 c3 62 c4 55
+ x30 c5 60 c6 1
+ x31 c1 24 c2 17
+ x31 c3 92 c4 70
+ x31 c5 21 c6 44
+ x32 c1 68 c2 56
+ x32 c3 39 c4 73
+ x32 c5 41 c6 74
+ x33 c1 38 c2 74
+ x33 c3 56 c4 70
+ x33 c5 2 c6 61
+ x34 c1 64 c2 62
+ x34 c3 53 c4 38
+ x34 c5 21 c6 37
+ x35 c1 93 c2 94
+ x35 c3 91 c4 66
+ x35 c5 93 c6 71
+ x36 c1 14 c2 9
+ x36 c3 81 c4 39
+ x36 c5 82 c6 63
+ x37 c1 83 c2 92
+ x37 c3 46 c4 43
+ x37 c5 16 c6 44
+ x38 c1 6 c2 90
+ x38 c3 94 c4 63
+ x38 c5 97 c6 77
+ x39 c1 58 c2 40
+ x39 c3 76 c4 88
+ x39 c5 75 c6 57
+ x40 c1 14 c2 45
+ x40 c3 53 c4 47
+ x40 c5 50 c6 46
+ x41 c1 71 c2 84
+ x41 c3 58 c4 18
+ x41 c5 13 c6 51
+ x42 c1 17 c2 62
+ x42 c3 23 c4 73
+ x42 c5 43 c6 43
+ x43 c1 18 c2 62
+ x43 c3 15 c4 40
+ x43 c5 45 c6 4
+ x44 c1 8 c2 34
+ x44 c3 63 c4 91
+ x44 c5 64 c6 85
+ x45 c1 57 c2 21
+ x45 c3 2 c4 96
+ x45 c5 78 c6 59
+ x46 c1 48 c2 2
+ x46 c3 31 c4 49
+ x46 c5 78 c6 7
+ x47 c1 35 c2 75
+ x47 c3 55 c4 13
+ x47 c5 6 c6 25
+ x48 c1 13 c2 42
+ x48 c3 71 c4 27
+ x48 c5 35 c6 46
+ x49 c1 47 c2 75
+ x49 c3 97 c4 22
+ x49 c5 72 c6 25
+ x50 c1 46 c2 29
+ x50 c3 71 c4 71
+ x50 c5 31 c6 70
+ x51 c1 8 c2 4
+ x51 c3 55 c4 99
+ x51 c5 28 c6 78
+ x52 c1 82 c2 64
+ x52 c3 8 c4 66
+ x52 c5 56 c6 88
+ x53 c1 51 c2 80
+ x53 c3 57 c4 57
+ x53 c5 60 c6 20
+ x54 c1 49 c2 17
+ x54 c3 14 c4 1
+ x54 c5 23 c6 40
+ x55 c1 85 c2 55
+ x55 c3 76 c4 54
+ x55 c5 70 c6 40
+ x56 c1 66 c2 73
+ x56 c3 1 c4 35
+ x56 c5 46 c6 16
+ x57 c1 45 c2 23
+ x57 c3 46 c4 52
+ x57 c5 88 c6 3
+ x58 c1 99 c2 13
+ x58 c3 87 c4 66
+ x58 c5 20 c6 3
+ x59 c1 21 c2 91
+ x59 c3 22 c4 26
+ x59 c5 69 c6 5
+ x60 c1 75 c2 70
+ x60 c3 97 c4 1
+ x60 c5 13 c6 77
+ x61 c1 78 c2 73
+ x61 c3 99 c4 26
+ x61 c5 40 c6 88
+ x62 c1 43 c2 28
+ x62 c3 92 c4 12
+ x62 c5 73 c6 16
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ rhs c1 1116 c2 1325
+ rhs c3 1353 c4 1169
+ rhs c5 1160 c6 1163
+BOUNDS
+ FX bnd x2 0
+ FX bnd x4 0
+ FX bnd x6 0
+ FX bnd x8 0
+ FX bnd x10 0
+ FX bnd x12 0
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ UP bnd x57 1
+ UP bnd x58 1
+ UP bnd x59 1
+ UP bnd x60 1
+ UP bnd x61 1
+ UP bnd x62 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare2.mps b/demos/ppl_lpsol/examples/markshare2.mps
new file mode 100644
index 0000000..3e50b0a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare2.mps
@@ -0,0 +1,341 @@
+NAME markshare2
+ROWS
+ N obj
+ E c1
+ E c2
+ E c3
+ E c4
+ E c5
+ E c6
+ E c7
+COLUMNS
+ x1 obj 1 c1 1
+ x2 obj -1 c1 1
+ x3 obj 1 c2 1
+ x4 obj -1 c2 1
+ x5 obj 1 c3 1
+ x6 obj -1 c3 1
+ x7 obj 1 c4 1
+ x8 obj -1 c4 1
+ x9 obj 1 c5 1
+ x10 obj -1 c5 1
+ x11 obj 1 c6 1
+ x12 obj -1 c6 1
+ x13 obj 1 c7 1
+ x14 obj -1 c7 1
+ MARK0000 'MARKER' 'INTORG'
+ x15 c1 74 c2 20
+ x15 c3 85 c4 13
+ x15 c5 35 c6 86
+ x15 c7 41
+ x16 c1 49 c2 7
+ x16 c3 47 c4 71
+ x16 c5 61 c6 8
+ x16 c7 64
+ x17 c1 12 c2 68
+ x17 c3 67 c4 78
+ x17 c5 66 c6 44
+ x17 c7 82
+ x18 c1 93 c2 69
+ x18 c3 59 c4 84
+ x18 c5 78 c6 96
+ x18 c7 24
+ x19 c1 56 c2 95
+ x19 c3 84 c4 56
+ x19 c5 46 c6 64
+ x19 c7 48
+ x20 c1 16 c2 64
+ x20 c3 59 c4 66
+ x20 c5 89 c6 65
+ x20 c7 41
+ x21 c1 39 c2 76
+ x21 c3 19 c4 8
+ x21 c5 61 c6 68
+ x21 c7 29
+ x22 c1 77 c2 12
+ x22 c3 8 c4 68
+ x22 c5 25 c6 53
+ x22 c7 93
+ x23 c1 56 c2 45
+ x23 c3 50 c4 48
+ x23 c5 55 c6 19
+ x23 c7 64
+ x24 c1 73 c2 43
+ x24 c3 66 c4 28
+ x24 c5 16 c6 33
+ x24 c7 39
+ x25 c1 1 c2 83
+ x25 c3 5 c4 33
+ x25 c5 81 c6 28
+ x25 c7 92
+ x26 c1 3 c2 15
+ x26 c3 51 c4 34
+ x26 c5 35 c6 42
+ x26 c7 86
+ x27 c1 68 c2 90
+ x27 c3 51 c4 8
+ x27 c5 96 c6 72
+ x27 c7 64
+ x28 c1 61 c2 10
+ x28 c3 64 c4 99
+ x28 c5 23 c6 39
+ x28 c7 45
+ x29 c1 8 c2 96
+ x29 c3 64 c4 80
+ x29 c5 83 c6 5
+ x29 c7 87
+ x30 c1 55 c2 98
+ x30 c3 53 c4 74
+ x30 c5 39 c6 77
+ x30 c7 34
+ x31 c1 18 c2 53
+ x31 c3 61 c4 2
+ x31 c5 14 c6 37
+ x31 c7 39
+ x32 c1 21 c2 1
+ x32 c3 45 c4 10
+ x32 c5 53 c6 89
+ x32 c7 88
+ x33 c1 57 c2 2
+ x33 c3 3 c4 96
+ x33 c5 23 c6 7
+ x33 c7 99
+ x34 c1 98 c2 58
+ x34 c3 76 c4 41
+ x34 c5 23 c6 78
+ x34 c7 63
+ x35 c1 58 c2 24
+ x35 c3 17 c4 98
+ x35 c5 93 c6 10
+ x35 c7 85
+ x36 c1 57 c2 90
+ x36 c3 54 c4 74
+ x36 c5 38 c6 78
+ x36 c7 48
+ x37 c1 46 c2 29
+ x37 c3 13 c4 39
+ x37 c5 15 c6 10
+ x37 c7 83
+ x38 c1 72 c2 57
+ x38 c3 89 c4 91
+ x38 c5 20 c6 96
+ x38 c7 88
+ x39 c1 6 c2 19
+ x39 c3 68 c4 85
+ x39 c5 19 c6 55
+ x39 c7 85
+ x40 c1 16 c2 73
+ x40 c3 57 c4 95
+ x40 c5 28 c6 1
+ x40 c7 5
+ x41 c1 76 c2 89
+ x41 c3 4 c4 96
+ x41 c5 79 c6 64
+ x41 c7 14
+ x42 c1 21 c2 31
+ x42 c3 24 c4 1
+ x42 c5 51 c6 61
+ x42 c7 31
+ x43 c1 78 c2 12
+ x43 c3 96 c4 80
+ x43 c5 24 c6 63
+ x43 c7 12
+ x44 c1 18 c2 34
+ x44 c3 81 c4 90
+ x44 c5 6 c6 90
+ x44 c7 93
+ x45 c1 11 c2 67
+ x45 c3 36 c4 97
+ x45 c5 3 c6 22
+ x45 c7 55
+ x46 c1 58 c2 48
+ x46 c3 54 c4 36
+ x46 c5 47 c6 78
+ x46 c7 1
+ x47 c1 59 c2 11
+ x47 c3 3 c4 7
+ x47 c5 61 c6 92
+ x47 c7 2
+ x48 c1 25 c2 22
+ x48 c3 82 c4 69
+ x48 c5 60 c6 25
+ x48 c7 22
+ x49 c1 32 c2 36
+ x49 c3 33 c4 9
+ x49 c5 71 c6 24
+ x49 c7 93
+ x50 c1 14 c2 78
+ x50 c3 88 c4 9
+ x50 c5 63 c6 65
+ x50 c7 49
+ x51 c1 16 c2 75
+ x51 c3 1 c4 93
+ x51 c5 26 c6 6
+ x51 c7 35
+ x52 c1 3 c2 52
+ x52 c3 29 c4 94
+ x52 c5 66 c6 68
+ x52 c7 25
+ x53 c1 60 c2 95
+ x53 c3 4 c4 44
+ x53 c5 71 c6 66
+ x53 c7 39
+ x54 c1 12 c2 57
+ x54 c3 48 c4 36
+ x54 c5 63 c6 66
+ x54 c7 1
+ x55 c1 7 c2 62
+ x55 c3 51 c4 71
+ x55 c5 56 c6 1
+ x55 c7 77
+ x56 c1 42 c2 94
+ x56 c3 14 c4 37
+ x56 c5 32 c6 67
+ x56 c7 43
+ x57 c1 98 c2 10
+ x57 c3 86 c4 72
+ x57 c5 39 c6 78
+ x57 c7 7
+ x58 c1 34 c2 42
+ x58 c3 64 c4 38
+ x58 c5 31 c6 21
+ x58 c7 42
+ x59 c1 33 c2 89
+ x59 c3 73 c4 74
+ x59 c5 64 c6 47
+ x59 c7 36
+ x60 c1 16 c2 11
+ x60 c3 78 c4 89
+ x60 c5 89 c6 17
+ x60 c7 63
+ x61 c1 97 c2 77
+ x61 c3 45 c4 37
+ x61 c5 62 c6 89
+ x61 c7 5
+ x62 c1 63 c2 85
+ x62 c3 65 c4 24
+ x62 c5 68 c6 77
+ x62 c7 8
+ x63 c1 66 c2 30
+ x63 c3 30 c4 88
+ x63 c5 59 c6 88
+ x63 c7 43
+ x64 c1 28 c2 82
+ x64 c3 52 c4 77
+ x64 c5 71 c6 54
+ x64 c7 18
+ x65 c1 57 c2 20
+ x65 c3 6 c4 61
+ x65 c5 48 c6 10
+ x65 c7 60
+ x66 c1 19 c2 52
+ x66 c3 78 c4 80
+ x66 c5 76 c6 87
+ x66 c7 47
+ x67 c1 74 c2 78
+ x67 c3 9 c4 2
+ x67 c5 96 c6 88
+ x67 c7 47
+ x68 c1 44 c2 6
+ x68 c3 19 c4 60
+ x68 c5 74 c6 80
+ x68 c7 46
+ x69 c1 45 c2 57
+ x69 c3 87 c4 87
+ x69 c5 61 c6 76
+ x69 c7 45
+ x70 c1 49 c2 65
+ x70 c3 73 c4 80
+ x70 c5 21 c6 9
+ x70 c7 38
+ x71 c1 76 c2 79
+ x71 c3 10 c4 74
+ x71 c5 46 c6 83
+ x71 c7 9
+ x72 c1 74 c2 83
+ x72 c3 87 c4 42
+ x72 c5 18 c6 95
+ x72 c7 37
+ x73 c1 9 c2 16
+ x73 c3 33 c4 2
+ x73 c5 23 c6 86
+ x73 c7 8
+ x74 c1 44 c2 67
+ x74 c3 1 c4 37
+ x74 c5 24 c6 24
+ x74 c7 82
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ rhs c1 1324 c2 1554
+ rhs c3 1429 c4 1686
+ rhs c5 1482 c6 1613
+ rhs c7 1424
+BOUNDS
+ FX bnd x2 0
+ FX bnd x4 0
+ FX bnd x6 0
+ FX bnd x8 0
+ FX bnd x10 0
+ FX bnd x12 0
+ FX bnd x14 0
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ UP bnd x57 1
+ UP bnd x58 1
+ UP bnd x59 1
+ UP bnd x60 1
+ UP bnd x61 1
+ UP bnd x62 1
+ UP bnd x63 1
+ UP bnd x64 1
+ UP bnd x65 1
+ UP bnd x66 1
+ UP bnd x67 1
+ UP bnd x68 1
+ UP bnd x69 1
+ UP bnd x70 1
+ UP bnd x71 1
+ UP bnd x72 1
+ UP bnd x73 1
+ UP bnd x74 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas74.mps b/demos/ppl_lpsol/examples/mas74.mps
new file mode 100644
index 0000000..c5ed04a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas74.mps
@@ -0,0 +1,1131 @@
+NAME mas74
+ROWS
+ N obj
+ L c1
+ G c2
+ G c3
+ G c4
+ G c5
+ G c6
+ G c7
+ G c8
+ G c9
+ G c10
+ G c11
+ G c12
+ G c13
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ x1 obj 1E-5 c1 1
+ x1 c2 3857.5340376 c3 4264
+ x1 c4 4264 c5 4264
+ x1 c6 4264 c7 4264
+ x1 c8 4264 c9 4264
+ x1 c10 4264 c11 4264
+ x1 c12 1530.2702703 c13 4264
+ x2 obj 1E-5 c1 1
+ x2 c2 125.76760563 c3 5339
+ x2 c4 5339 c5 5026.3323601
+ x2 c6 5339 c7 5339
+ x2 c8 3236.6488464 c9 5339
+ x2 c10 5339 c11 5339
+ x2 c13 5339
+ x3 obj 1E-5 c1 1
+ x3 c2 7165.7769953 c3 7227.5
+ x3 c4 5876.7923949 c5 4212.5800487
+ x3 c7 3489 c8 8260
+ x3 c9 8260 c11 4540
+ x3 c13 8260
+ x4 obj 1E-5 c1 1
+ x4 c2 2876 c3 2876
+ x4 c4 2876 c5 2876
+ x4 c6 2876 c7 2876
+ x4 c8 2876 c9 2876
+ x4 c10 2876 c11 2876
+ x4 c12 2876 c13 2876
+ x5 obj 1E-5 c1 1
+ x5 c2 9723 c4 9723
+ x5 c6 9723 c9 6324.0237443
+ x5 c10 5706.6236192 c11 6007.4739286
+ x5 c12 6622.5405405 c13 7071.525641
+ x6 obj 1E-5 c1 1
+ x6 c2 7310 c3 7310
+ x6 c4 7310 c7 7310
+ x6 c8 6884 c9 7310
+ x6 c11 7310 c13 7310
+ x7 obj 1E-5 c1 1
+ x7 c2 1529 c3 1529
+ x7 c4 1529 c5 1529
+ x7 c6 1529 c7 1529
+ x7 c8 1529 c9 1529
+ x7 c10 1529 c11 1529
+ x7 c12 1529 c13 1529
+ x8 obj 1E-5 c1 1
+ x8 c2 1585 c3 1585
+ x8 c4 1585 c5 1585
+ x8 c6 1585 c7 1585
+ x8 c8 1585 c9 1585
+ x8 c10 1585 c11 1585
+ x8 c12 1585 c13 1585
+ x9 obj 1E-5 c1 1
+ x9 c2 2949 c3 2949
+ x9 c4 2949 c5 2949
+ x9 c6 2949 c7 2949
+ x9 c8 2949 c9 2949
+ x9 c10 2949 c11 2949
+ x9 c12 2949 c13 2949
+ x10 obj 1E-5 c1 1
+ x10 c2 7097 c3 5404.8448466
+ x10 c4 7097 c5 7097
+ x10 c7 5864.7752809 c10 7097
+ x10 c12 2091.1486486 c13 1239
+ x11 obj 1E-5 c1 1
+ x11 c2 1239 c3 1239
+ x11 c4 1239 c5 1239
+ x11 c6 1239 c7 1239
+ x11 c8 1239 c9 1239
+ x11 c10 1239 c11 1239
+ x11 c12 1239 c13 1239
+ x12 obj 1E-5 c1 1
+ x12 c2 6449 c3 8128.2443156
+ x12 c4 3263.9478854 c5 6449
+ x12 c6 2475 c7 9321.7752809
+ x12 c9 2669.5520548 c11 5164.8090243
+ x12 c12 5210 c13 1431.2820513
+ x13 obj 1E-5 c1 1
+ x13 c2 4596.07277 c3 2473.8400699
+ x13 c4 4787.9998652 c5 1673.7990268
+ x13 c6 6817.4161987 c7 7919.9662921
+ x13 c8 5586.9236606 c9 3224
+ x13 c10 3270.405833 c11 1287.8998662
+ x13 c12 2116.7297297 c13 4388
+ x14 obj 1E-5 c1 1
+ x14 c2 8037 c3 8037
+ x14 c5 8037 c7 8037
+ x14 c9 8037 c10 8037
+ x14 c12 8037
+ x15 obj 1E-5 c1 1
+ x15 c2 7123 c3 7123
+ x15 c4 3932.0774689 c5 7123
+ x15 c6 7123 c8 7123
+ x15 c13 7123
+ x16 obj 1E-5 c1 1
+ x16 c2 8067 c4 4508
+ x16 c5 4902.0158151 c6 3754
+ x16 c7 2923 c8 2980.0315887
+ x16 c9 721.8803653 c10 6814.5238232
+ x16 c11 6755.136625 c12 421.86486486
+ x16 c13 3091.3205128
+ x17 obj 1E-5 c1 1
+ x17 c2 5704 c3 5704
+ x17 c4 5383.2865918 c5 2299.7472019
+ x17 c6 5704 c7 5704
+ x17 c8 4171 c9 5704
+ x17 c10 5704 c11 5704
+ x17 c12 5704 c13 5704
+ x18 obj 1E-5 c1 1
+ x18 c2 1582 c3 1582
+ x18 c4 1007.7206724 c5 1582
+ x18 c6 1582 c7 1582
+ x18 c8 1582 c9 1582
+ x18 c10 1582 c11 1582
+ x18 c12 1582 c13 1144.5384615
+ x19 obj 1E-5 c1 1
+ x19 c2 8713 c4 8713
+ x19 c5 8713 c7 8171.3932584
+ x19 c9 8713 c10 8713
+ x19 c13 8713
+ x20 obj 1E-5 c1 1
+ x20 c2 9232 c4 9232
+ x20 c6 9232 c7 9232
+ x20 c9 9232 c10 9232
+ x20 c11 9232
+ x21 obj 1E-5 c1 1
+ x21 c2 3371 c3 4035
+ x21 c4 3733.6777996 c5 4035
+ x21 c6 4035 c7 4600
+ x21 c8 3371 c9 3371
+ x21 c10 4600 c11 4600
+ x21 c12 4035 c13 2933.5384615
+ x22 obj 1E-5 c1 1
+ x22 c2 2637 c3 2637
+ x22 c4 2637 c5 2637
+ x22 c6 2637 c7 2637
+ x22 c8 2637 c9 2637
+ x22 c10 2637 c11 2637
+ x22 c12 2637 c13 2637
+ x23 obj 1E-5 c1 1
+ x23 c2 7131 c3 2505.925667
+ x23 c4 2622.9478854 c5 7131
+ x23 c6 7131 c7 3525.6966292
+ x23 c8 7131 c9 7048.9675799
+ x23 c10 7131 c11 5166.9799255
+ x23 c12 1313 c13 1662.1153846
+ x24 obj 1E-5 c1 1
+ x24 c2 418.3028169 c3 9861
+ x24 c4 5572.0948907 c5 2435.796837
+ x24 c6 5429.5829374 c8 922.29134407
+ x24 c9 5007.8803653 c10 4652.0215414
+ x24 c11 1899.2210109
+ x25 obj 1E-5 c1 1
+ x25 c2 3647 c3 3647
+ x25 c4 3647 c5 3647
+ x25 c6 3647 c7 3647
+ x25 c8 3647 c9 3647
+ x25 c10 3647 c11 3647
+ x25 c12 3647 c13 3647
+ x26 obj 1E-5 c1 1
+ x26 c2 5688.4859155 c3 5478.2871361
+ x26 c4 8494 c5 1160.0158151
+ x26 c6 7496 c8 805.25526479
+ x26 c9 2201.1196347 c10 3891.5238232
+ x26 c11 3013.136625 c12 421.86486486
+ x26 c13 2501.1474359
+ x27 obj 1E-5 c1 1
+ x27 c2 7832.5997653 c3 5665.9031945
+ x27 c4 1590.9888423 c5 1850.9749392
+ x27 c6 583.5 c7 4272.9662921
+ x27 c8 2660.5892304 c9 1631.030137
+ x27 c10 5039.7045485 c11 5571.6006929
+ x27 c12 2940.1756757 c13 1070.4038462
+ x28 obj 1E-5 c1 1
+ x28 c2 4409.1255869 c3 5880
+ x28 c4 5880 c5 5880
+ x28 c6 5162.5 c7 5880
+ x28 c8 5880 c9 5880
+ x28 c13 5649.4038462
+ x29 obj 1E-5 c1 1
+ x29 c2 1053 c3 1053
+ x29 c4 1053 c5 1053
+ x29 c6 1053 c7 1053
+ x29 c8 1053 c9 1053
+ x29 c10 1053 c11 1053
+ x29 c12 1053 c13 1053
+ x30 obj 1E-5 c1 1
+ x30 c2 2869 c3 2869
+ x30 c4 2869 c5 1573.9406326
+ x30 c6 449.31447084 c7 2869
+ x30 c8 2869 c9 204.02305936
+ x30 c10 2869 c11 2869
+ x30 c12 1053
+ x31 obj 1E-5 c1 1
+ x31 c2 5410 c3 5410
+ x31 c4 5410 c5 5410
+ x31 c6 3240.6855292 c7 5410
+ x31 c8 5410 c9 2678.01621
+ x31 c10 5410 c12 5287
+ x31 c13 2480.7179487
+ x32 obj 1E-5 c1 1
+ x32 c2 3948 c3 3948
+ x32 c4 3948 c5 3948
+ x32 c6 3948 c7 3948
+ x32 c8 3948 c9 3948
+ x32 c10 3948 c11 3948
+ x32 c12 3948 c13 3948
+ x33 obj 1E-5 c1 1
+ x33 c2 6049 c3 6049
+ x33 c4 6049 c5 6049
+ x33 c6 6049 c9 6049
+ x33 c10 6049 c11 6049
+ x34 obj 1E-5 c1 1
+ x34 c2 9317 c5 9317
+ x34 c6 9317 c7 9317
+ x34 c8 9317 c9 9317
+ x34 c12 5488.7162162 c13 888
+ x35 obj 1E-5 c1 1
+ x35 c2 6880 c3 6880
+ x35 c4 1928.2865918 c5 6880
+ x35 c6 1950 c7 2311.7191011
+ x35 c8 1762.3431016 c9 4388.8803653
+ x35 c10 6880 c11 3103.6850787
+ x35 c12 4446.6621622
+ x36 obj 1E-5 c1 1
+ x36 c2 3779 c3 3779
+ x36 c4 3779 c5 3779
+ x36 c6 3779 c7 3779
+ x36 c8 3779 c9 3779
+ x36 c10 3779 c11 3779
+ x36 c12 3779 c13 3779
+ x37 obj 1E-5 c1 1
+ x37 c2 3641 c3 3641
+ x37 c4 3641 c5 3641
+ x37 c6 3641 c7 3641
+ x37 c8 3641 c9 3641
+ x37 c10 3641 c11 3641
+ x37 c12 3641 c13 3641
+ x38 obj 1E-5 c1 1
+ x38 c2 5567 c3 5567
+ x38 c4 5567 c5 5567
+ x38 c6 5567 c7 5567
+ x38 c8 5567 c10 1477.4963355
+ x38 c11 5567 c12 4894.9189189
+ x38 c13 5567
+ x39 obj 1E-5 c1 1
+ x39 c2 2197 c3 2197
+ x39 c4 2197 c5 2197
+ x39 c6 2197 c7 2197
+ x39 c8 2197 c9 2197
+ x39 c10 2197 c11 2197
+ x39 c12 2197 c13 2197
+ x40 obj 1E-5 c1 1
+ x40 c2 2842 c3 1164.8704111
+ x40 c4 2842 c5 2842
+ x40 c6 2842 c7 2842
+ x40 c8 2842 c9 2842
+ x40 c10 2842 c11 2842
+ x40 c12 2103.3243243 c13 2842
+ x41 obj 1E-5 c1 1
+ x41 c2 4846 c3 4846
+ x41 c4 4846 c5 4846
+ x41 c6 4846 c7 4846
+ x41 c8 4846 c9 4846
+ x41 c10 4846 c11 4846
+ x41 c12 4846 c13 4846
+ x42 obj 1E-5 c1 1
+ x42 c2 4616 c3 139.72342842
+ x42 c4 4616 c5 4616
+ x42 c6 4616 c7 4616
+ x42 c8 4616 c9 4616
+ x42 c10 4616 c11 4616
+ x42 c12 4616 c13 2765.2179487
+ x43 obj 1E-5 c1 1
+ x43 c2 8807 c4 8807
+ x43 c6 8807 c7 8807
+ x43 c8 8807 c10 8807
+ x43 c11 8807 c12 8807
+ x44 obj 1E-5 c1 1
+ x44 c2 3261 c3 3261
+ x44 c4 3261 c5 3261
+ x44 c6 3261 c7 3261
+ x44 c8 3261 c9 3261
+ x44 c10 3261 c11 3261
+ x44 c12 3261 c13 3261
+ x45 obj 1E-5 c1 1
+ x45 c2 3553 c3 3553
+ x45 c4 3553 c5 3553
+ x45 c6 3553 c7 3553
+ x45 c8 3553 c9 3553
+ x45 c10 3553 c11 3553
+ x45 c12 3553 c13 3553
+ x46 obj 1E-5 c1 1
+ x46 c2 5239 c3 5239
+ x46 c4 5239 c5 2665
+ x46 c6 5239 c7 5239
+ x46 c8 3338.1665376 c9 5239
+ x46 c10 5239 c11 5239
+ x46 c12 2665 c13 2665
+ x47 obj 1E-5 c1 1
+ x47 c2 6665 c3 6665
+ x47 c4 6665 c5 6665
+ x47 c6 6665 c11 6665
+ x48 obj 1E-5 c1 1
+ x48 c2 3257.4906103 c3 1655.7848997
+ x48 c4 8172 c5 4492.4068127
+ x48 c6 8172 c7 5877.6685393
+ x48 c8 2589.3009446 c9 8172
+ x48 c10 8172 c11 8172
+ x48 c12 1009.4459459
+ x49 obj 1E-5 c1 1
+ x49 c2 7219.556338 c3 1655.7848997
+ x49 c4 5587.4533223 c5 4492.4068127
+ x49 c6 8425 c7 4262.3764045
+ x49 c8 2589.3009446 c9 8425
+ x49 c10 8425 c11 3203.5967077
+ x49 c12 1009.4459459
+ x50 obj 1E-5 c1 1
+ x50 c2 2536 c3 2536
+ x50 c4 2536 c5 2536
+ x50 c6 2536 c7 2536
+ x50 c8 2536 c9 2536
+ x50 c10 2536 c11 2536
+ x50 c12 2536 c13 2536
+ x51 obj 1E-5 c1 1
+ x51 c2 8013 c3 8013
+ x51 c5 3924.9124088 c6 4869.6696544
+ x51 c7 7090.005618 c8 6077
+ x51 c9 1351.1242009 c10 8013
+ x51 c12 2956.6621622 c13 2768
+ x52 obj 1E-5 c1 1
+ x52 c2 3541 c3 3541
+ x52 c4 509.74314193 c5 3541
+ x52 c6 3541 c7 1074.011236
+ x52 c8 3541 c9 3541
+ x52 c10 3541 c12 420.66216216
+ x52 c13 3541
+ x53 obj 1E-5 c1 1
+ x53 c2 8080 c3 8080
+ x53 c5 3336.9664234 c6 8080
+ x53 c7 8080 c10 8080
+ x53 c11 8080 c13 8080
+ x54 obj 1E-5 c1 1
+ x54 c2 5593.0586854 c3 2778.8438922
+ x54 c4 5130.4842654 c5 509.94136253
+ x54 c6 5337.9205184 c7 2240.3595506
+ x54 c8 257.07955249 c9 6767
+ x54 c10 2672.975731 c11 6767
+ x54 c13 759.60897436
+ x55 obj 1E-5 c1 1
+ x55 c2 5036 c3 5036
+ x55 c4 5036 c5 5036
+ x55 c6 5036 c7 5036
+ x55 c8 5036 c9 5036
+ x55 c10 5036 c11 5036
+ x55 c12 5036 c13 5036
+ x56 obj 1E-5 c1 1
+ x56 c2 1782 c3 1782
+ x56 c4 1782 c5 1782
+ x56 c6 1782 c7 1782
+ x56 c8 1782 c9 1782
+ x56 c10 1782 c11 1782
+ x56 c12 1782 c13 1782
+ x57 obj 1E-5 c1 1
+ x57 c2 3895 c3 1724.2205458
+ x57 c4 476.85677148 c5 2066.1187348
+ x57 c6 3895 c7 3895
+ x57 c8 3895 c9 3895
+ x57 c10 3895 c11 3895
+ x57 c12 3895 c13 3895
+ x58 obj 1E-5 c1 1
+ x58 c2 4205 c4 4205
+ x58 c5 4205 c6 4205
+ x58 c7 4205 c8 4205
+ x58 c9 4205 c10 4205
+ x58 c11 4205 c12 4205
+ x58 c13 4205
+ x59 obj 1E-5 c1 1
+ x59 c2 7772 c3 7772
+ x59 c5 7772 c7 7106.3258427
+ x59 c8 7772 c10 2726.2276162
+ x59 c11 7772 c12 7772
+ x60 obj 1E-5 c1 1
+ x60 c2 9326 c5 8367.2374696
+ x60 c6 5256.5 c7 7383
+ x60 c8 6619.0778105 c9 6075.1340183
+ x60 c10 3171.9293238 c11 4961.8312283
+ x60 c12 5919.7837838 c13 9326
+ x61 obj 1E-5 c1 1
+ x61 c2 4757 c3 4757
+ x61 c4 2026.2568581 c5 4757
+ x61 c6 2104.6903888 c7 3561.488764
+ x61 c9 88.128310502 c10 4757
+ x61 c11 2536 c13 1576.5448718
+ x62 obj 1E-5 c1 1
+ x62 c2 5355 c4 5355
+ x62 c5 2978.6437956 c7 2033.3258427
+ x62 c8 5355 c9 5355
+ x62 c10 5355 c11 5355
+ x62 c12 5355 c13 5355
+ x63 obj 1E-5 c1 1
+ x63 c2 1919 c3 1919
+ x63 c4 1919 c5 1919
+ x63 c6 1919 c7 1919
+ x63 c8 1919 c9 1919
+ x63 c10 1919 c11 1919
+ x63 c12 1919 c13 1919
+ x64 obj 1E-5 c1 1
+ x64 c2 7510.5774648 c3 8722.393681
+ x64 c4 3652.6973102 c6 4473.0773218
+ x64 c7 6121.0505618 c8 9948
+ x64 c10 4389.7373933 c11 5846.2742077
+ x64 c12 6017.0810811
+ x65 obj 1E-5 c1 1
+ x65 c2 7341 c3 7341
+ x65 c5 7341 c6 7341
+ x65 c8 7341 c11 7341
+ x65 c12 5188.3918919 c13 2995.1025641
+ x66 obj 1E-5 c1 1
+ x66 c2 8541 c4 8541
+ x66 c5 4655 c6 4655
+ x66 c7 8541 c8 6962.5370084
+ x66 c11 7926.8090243 c12 7281.4594595
+ x66 c13 8541
+ x67 obj 1E-5 c1 1
+ x67 c2 8352 c4 8352
+ x67 c5 8352 c6 8352
+ x67 c9 8352 c11 8352
+ x67 c12 2160.4594595 c13 8352
+ x68 obj 1E-5 c1 1
+ x68 c2 3291 c3 3291
+ x68 c4 3291 c5 3291
+ x68 c6 3291 c7 3291
+ x68 c8 3291 c9 3291
+ x68 c10 3291 c11 3291
+ x68 c12 3291 c13 3291
+ x69 obj 1E-5 c1 1
+ x69 c2 7328 c3 7328
+ x69 c5 7328 c6 7328
+ x69 c8 7328 c11 7328
+ x69 c12 6739.2972973
+ x70 obj 1E-5 c1 1
+ x70 c2 4506 c3 4506
+ x70 c4 4506 c5 4506
+ x70 c6 4506 c7 4429
+ x70 c8 4506 c9 4506
+ x70 c10 4506 c11 4506
+ x70 c12 4429 c13 4506
+ x71 obj 1E-5 c1 1
+ x71 c2 4429 c3 4429
+ x71 c4 4429 c5 4429
+ x71 c6 4429 c7 4429
+ x71 c8 4429 c9 4429
+ x71 c10 4429 c11 4429
+ x71 c12 4429 c13 4429
+ x72 obj 1E-5 c1 1
+ x72 c2 4593 c3 4593
+ x72 c4 4593 c5 896.82189781
+ x72 c6 4593 c7 4081.3146067
+ x72 c8 4593 c9 4593
+ x72 c10 4593 c11 4593
+ x72 c12 4593 c13 4593
+ x73 obj 1E-5 c1 1
+ x73 c2 9138 c4 6903.6330621
+ x73 c5 2486.593674 c6 9138
+ x73 c7 4272.9662921 c8 9138
+ x73 c10 4769.9270193 c11 2864.5421929
+ x73 c13 9138
+ x74 obj 1E-5 c1 1
+ x74 c2 3731.7664319 c3 4857.7089899
+ x74 c4 4972.5996947 c5 7925.6586375
+ x74 c6 5052.5596112 c7 7999.5842697
+ x74 c8 940.48633478 c9 1881.3954338
+ x74 c10 560.5962977 c11 3452.764849
+ x74 c12 1530.2702703 c13 7740.9358974
+ x75 obj 1E-5 c1 1
+ x75 c2 5124.2922535 c3 7404
+ x75 c4 4006.8453527 c5 1794.7394161
+ x75 c6 1174.3740821 c7 5324.3033708
+ x75 c8 6731.8123645 c9 4723.3954338
+ x75 c10 3402.5962977 c11 4126.5871636
+ x75 c12 4615.3378378 c13 7404
+ x76 obj 1E-5 c1 1
+ x76 c2 4378 c3 4378
+ x76 c4 4378 c5 4378
+ x76 c6 4378 c7 4378
+ x76 c8 2220.491406 c9 4378
+ x76 c10 4378 c11 4378
+ x76 c12 1530.2702703 c13 4378
+ x77 obj 1E-5 c1 1
+ x77 c2 3647 c3 3647
+ x77 c4 3647 c5 3647
+ x77 c6 3647 c7 3647
+ x77 c8 3647 c9 3647
+ x77 c10 3647 c11 3647
+ x77 c12 3647 c13 3647
+ x78 obj 1E-5 c1 1
+ x78 c2 3795 c3 3795
+ x78 c4 3795 c5 1205.9406326
+ x78 c6 3795 c7 3795
+ x78 c8 3795 c9 3795
+ x78 c10 3795 c11 3795
+ x78 c12 3795 c13 3795
+ x79 obj 1E-5 c1 1
+ x79 c2 2912 c3 2912
+ x79 c4 2912 c5 1205.9406326
+ x79 c6 2912 c7 2559.6067416
+ x79 c8 2912 c9 2912
+ x79 c10 2912 c11 2912
+ x79 c12 2912 c13 2912
+ x80 obj 1E-5 c1 1
+ x80 c2 8830 c3 7601.2456701
+ x80 c6 8830 c7 2550.0224719
+ x80 c8 6707 c9 8830
+ x80 c10 8830 c12 8830
+ x80 c13 390.93589744
+ x81 obj 1E-5 c1 1
+ x81 c2 5445 c3 5445
+ x81 c4 5445 c5 5445
+ x81 c6 5445 c7 5008.247191
+ x81 c8 5445 c9 5445
+ x81 c11 5445 c13 5445
+ x82 obj 1E-5 c1 1
+ x83 obj 1E-5 c1 1
+ x83 c2 6112 c3 6112
+ x83 c4 6112 c5 6112
+ x83 c6 6112 c9 6112
+ x83 c10 6112 c12 6112
+ x84 obj 1E-5 c1 1
+ x84 c2 8841 c4 8841
+ x84 c5 8841 c8 8841
+ x84 c10 8841 c13 8841
+ x85 obj 1E-5 c1 1
+ x85 c2 1236 c3 1236
+ x85 c4 1236 c5 1236
+ x85 c6 1236 c7 1236
+ x85 c8 1236 c9 1236
+ x85 c10 1236 c11 1236
+ x85 c12 1236 c13 1236
+ x86 obj 1E-5 c1 1
+ x86 c2 7010 c3 7010
+ x86 c4 7010 c7 7010
+ x86 c8 2909 c9 7010
+ x86 c10 7010 c11 7010
+ x86 c12 1324 c13 7010
+ x87 obj 1E-5 c1 1
+ x87 c2 2909 c3 2909
+ x87 c4 1599.0521146 c5 2909
+ x87 c6 2909 c7 2909
+ x87 c8 2909 c9 2909
+ x87 c10 2909 c11 2909
+ x87 c12 2909 c13 2909
+ x88 obj 1E-5 c1 1
+ x88 c2 7622 c3 5342.1452962
+ x88 c4 7622 c5 7622
+ x88 c9 7622 c10 7622
+ x88 c11 7622
+ x89 obj 1E-5 c1 1
+ x89 c2 7393 c3 7393
+ x89 c5 7393 c6 7393
+ x89 c9 7393 c10 7393
+ x89 c12 7393 c13 7393
+ x90 obj 1E-5 c1 1
+ x90 c2 8317.6971831 c3 6883.3314132
+ x90 c5 8830 c7 4261.7191011
+ x90 c8 2953.3115129 c9 6338.8803653
+ x90 c10 4727.2211862 c11 5053.6850787
+ x90 c12 6396.6621622
+ x91 obj 1E-5 c1 1
+ x91 c2 1950 c3 1950
+ x91 c4 1950 c5 1950
+ x91 c6 1950 c7 1950
+ x91 c8 1950 c9 1950
+ x91 c10 1950 c11 1950
+ x91 c12 1950
+ x92 obj 1E-5 c1 1
+ x92 c2 4654 c3 4654
+ x92 c4 4654 c5 4654
+ x92 c6 4654 c7 4654
+ x92 c8 4654 c9 4654
+ x92 c10 4654 c11 1188
+ x92 c12 4654 c13 4654
+ x93 obj 1E-5 c1 1
+ x93 c2 2255 c3 2255
+ x93 c4 2255 c5 2255
+ x93 c6 2255 c7 117.03370787
+ x93 c8 2255 c9 2255
+ x93 c10 2255 c11 2255
+ x93 c12 2255 c13 2255
+ x94 obj 1E-5 c1 1
+ x94 c2 7104 c3 7104
+ x94 c4 7104 c7 7104
+ x94 c8 7104 c9 7104
+ x94 c10 6114.1385266 c11 7104
+ x94 c12 7104
+ x95 obj 1E-5 c1 1
+ x95 c2 7534.7887324 c3 7435.0469687
+ x95 c4 7744 c7 3406.2808989
+ x95 c8 7744 c9 7744
+ x95 c11 7744 c12 3202.5945946
+ x95 c13 7744
+ x96 obj 1E-5 c1 1
+ x96 c2 2054 c3 2054
+ x96 c4 2054 c5 2054
+ x96 c6 2054 c7 2054
+ x96 c8 2054 c9 2054
+ x96 c10 2054 c11 2054
+ x96 c12 2054 c13 2054
+ x97 obj 1E-5 c1 1
+ x97 c2 6682 c3 6682
+ x97 c4 6682 c5 6682
+ x97 c8 1726.1613116 c9 6682
+ x97 c11 6682 c12 4613.5135135
+ x97 c13 1696.5128205
+ x98 obj 1E-5 c1 1
+ x98 c2 3234 c3 3234
+ x98 c4 3234 c5 3234
+ x98 c6 3234 c7 3234
+ x98 c8 3234 c9 3234
+ x98 c10 3234 c11 3234
+ x98 c12 3234 c13 3234
+ x99 obj 1E-5 c1 1
+ x99 c2 2842 c3 1164.8704111
+ x99 c4 2842 c5 2842
+ x99 c6 2842 c7 2675.2808989
+ x99 c8 2842 c9 2842
+ x99 c10 2842 c11 2842
+ x99 c12 2103.3243243 c13 2842
+ x100 obj 1E-5 c1 1
+ x100 c2 3974 c3 3974
+ x100 c4 3974 c5 3974
+ x100 c6 3974 c7 3974
+ x100 c8 3974 c9 3974
+ x100 c10 3974 c11 3974
+ x100 c12 3974 c13 2670.2820513
+ x101 obj 1E-5 c1 1
+ x101 c2 3624 c3 3624
+ x101 c4 3624 c5 3624
+ x101 c6 3624 c7 3624
+ x101 c8 3624 c9 3624
+ x101 c10 3624 c11 3624
+ x101 c12 3624 c13 3624
+ x102 obj 1E-5 c1 1
+ x102 c2 5415 c3 5415
+ x102 c4 5415 c5 5415
+ x102 c6 5415 c7 5415
+ x102 c8 5415 c9 5415
+ x102 c10 5415
+ x103 obj 1E-5 c1 1
+ x103 c2 2246 c3 1582
+ x103 c4 2246 c5 1582
+ x103 c6 2246 c7 2246
+ x103 c8 2246 c9 2246
+ x103 c10 1807.7609822 c11 2246
+ x103 c12 1582 c13 2246
+ x104 obj 1E-5 c1 1
+ x104 c2 8590 c4 8590
+ x104 c5 8590 c7 8590
+ x104 c8 8590 c11 5312.3064276
+ x104 c12 5392.9324324
+ x105 obj 1E-5 c1 1
+ x105 c2 2633 c3 2633
+ x105 c4 2633 c5 2633
+ x105 c6 2633 c7 40.747191011
+ x105 c8 2633 c9 2633
+ x105 c10 2633 c11 2633
+ x105 c12 732.93243243 c13 2633
+ x106 obj 1E-5 c1 1
+ x106 c2 4655 c3 4655
+ x106 c4 4655 c5 4655
+ x106 c6 4655 c7 4655
+ x106 c8 4655 c9 4655
+ x106 c10 4655 c11 4655
+ x106 c12 418.45945946 c13 691
+ x107 obj 1E-5 c1 1
+ x107 c2 2923 c3 2923
+ x107 c4 2923 c5 2923
+ x107 c6 2923 c7 2923
+ x107 c8 2923 c9 2923
+ x107 c10 2923 c11 2923
+ x107 c12 2923 c13 2923
+ x108 obj 1E-5 c1 1
+ x108 c2 6318 c3 6318
+ x108 c5 6318 c6 6318
+ x108 c7 4285.6853933 c8 6318
+ x108 c9 6318 c10 6318
+ x108 c11 6318 c13 6318
+ x109 obj 1E-5 c1 1
+ x109 c2 7440 c3 7440
+ x109 c4 5080.614002 c6 1739
+ x109 c7 6319.247191 c8 7440
+ x109 c9 3677.0954338 c10 7440
+ x109 c13 1402.1282051
+ x110 obj 1E-5 c1 1
+ x110 c2 4579 c3 4579
+ x110 c4 4579 c5 4579
+ x110 c6 4579 c7 4579
+ x110 c8 4579 c9 1172.1497717
+ x110 c10 3472.3863166 c11 4579
+ x110 c12 4579 c13 4579
+ x111 obj 1E-5 c1 1
+ x111 c2 8342 c3 8342
+ x111 c6 8342 c7 8342
+ x111 c9 8342 c11 8342
+ x111 c12 8342 c13 3445
+ x112 obj 1E-5 c1 1
+ x112 c2 3813.4002347 c3 5050
+ x112 c4 4677.0111577 c5 81.974939173
+ x112 c6 1239 c7 3764.0337079
+ x112 c8 2660.5892304 c9 2180.2694064
+ x112 c10 3270.7045485 c11 5050
+ x112 c12 1102 c13 3648.6794872
+ x113 obj 1E-5 c1 1
+ x113 c2 6268 c3 6268
+ x113 c4 6268 c5 6268
+ x113 c6 1822.5 c9 6268
+ x113 c10 6268 c11 4575.3149213
+ x113 c12 6268 c13 4719.0833333
+ x114 obj 1E-5 c1 1
+ x114 c2 8570 c3 8570
+ x114 c6 8570 c8 8570
+ x114 c9 6425.2703196 c10 8570
+ x114 c11 7133
+ x115 obj 1E-5 c1 1
+ x115 c2 9838 c5 6831.392944
+ x115 c6 9838 c7 5613.6853933
+ x115 c8 9838 c9 4293.1287671
+ x115 c10 9838 c11 5180
+ x115 c13 2068.8974359
+ x116 obj 1E-5 c1 1
+ x116 c2 4876 c3 4876
+ x116 c4 2157.614002 c5 4876
+ x116 c6 4876 c7 4876
+ x116 c8 4876 c9 4876
+ x116 c10 4624.3962297 c11 4876
+ x116 c13 1920.724359
+ x117 obj 1E-5 c1 1
+ x117 c2 418.3028169 c3 9861
+ x117 c4 5572.0948907 c5 2435.796837
+ x117 c6 5429.5829374 c8 922.29134407
+ x117 c9 5007.8803653 c10 4652.0215414
+ x117 c11 1899.2210109
+ x118 obj 1E-5 c1 1
+ x118 c2 4922 c3 4922
+ x118 c4 4922 c5 4922
+ x118 c6 4922 c7 3647
+ x118 c8 4922 c9 4922
+ x118 c10 2886.5022818 c11 4922
+ x118 c12 3225.1351351 c13 1741.5064103
+ x119 obj 1E-5 c1 1
+ x119 c2 3590 c3 3590
+ x119 c4 3590 c5 3590
+ x119 c6 3590 c7 625.96629213
+ x119 c8 3590 c9 3590
+ x119 c10 3590 c11 2057.4578071
+ x119 c12 1866.4459459 c13 899.94871795
+ x120 obj 1E-5 c1 1
+ x120 c2 7152 c3 7152
+ x120 c4 7152 c6 7152
+ x120 c8 7152 c9 7152
+ x120 c12 3625.7162162 c13 7152
+ x121 obj 1E-5 c1 1
+ x121 c2 7056 c3 7056
+ x121 c4 7056 c5 7056
+ x121 c10 7056 c11 7056
+ x121 c13 3555.5641026
+ x122 obj 1E-5 c1 1
+ x122 c2 9136 c4 9136
+ x122 c5 9136 c8 9136
+ x122 c9 9136 c12 9136
+ x123 obj 1E-5 c1 1
+ x123 c2 7850 c3 4655
+ x123 c4 7850 c7 7850
+ x123 c8 5952.0905079 c9 4655
+ x123 c10 4655 c11 7850
+ x123 c12 7850 c13 7850
+ x124 obj 1E-5 c1 1
+ x124 c2 6863 c3 6863
+ x124 c4 6863 c6 6863
+ x124 c7 6863 c10 6863
+ x124 c12 6863 c13 6863
+ x125 obj 1E-5 c1 1
+ x125 c2 9356 c4 9356
+ x125 c6 9356 c7 9356
+ x125 c9 9091 c11 5319.7567851
+ x125 c12 9356 c13 7943.6794872
+ x126 obj 1E-5 c1 1
+ x126 c2 2933 c3 2933
+ x126 c4 2933 c5 2933
+ x126 c6 2933 c7 2933
+ x126 c8 2933 c9 2933
+ x126 c10 2933 c11 2933
+ x126 c12 2933 c13 2933
+ x127 obj 1E-5 c1 1
+ x127 c2 2665 c3 2665
+ x127 c4 2665 c5 2665
+ x127 c6 2665 c7 2665
+ x127 c8 2665 c9 2665
+ x127 c10 2665 c11 2665
+ x127 c12 2665 c13 2665
+ x128 obj 1E-5 c1 1
+ x128 c2 4063 c3 4063
+ x128 c4 4063 c5 4063
+ x128 c6 4063 c7 4063
+ x128 c8 4063 c9 4063
+ x128 c10 4063 c11 4063
+ x128 c12 4020 c13 4063
+ x129 obj 1E-5 c1 1
+ x129 c2 7502 c3 4120.6364834
+ x129 c4 7502 c5 7502
+ x129 c7 5485.988764 c8 2002.5321694
+ x129 c10 7502 c11 7502
+ x129 c13 6355.8974359
+ x130 obj 1E-5 c1 1
+ x130 c2 1966 c3 1966
+ x130 c4 1966 c5 1966
+ x130 c6 1966 c7 1966
+ x130 c8 1966 c9 1966
+ x130 c10 1966 c11 1966
+ x130 c12 1966 c13 1966
+ x131 obj 1E-5 c1 1
+ x131 c2 4540 c3 4540
+ x131 c4 4540 c5 4540
+ x131 c6 4540 c7 4540
+ x131 c8 4540 c9 4540
+ x131 c10 4540 c11 4540
+ x131 c12 4540 c13 4540
+ x132 obj 1E-5 c1 1
+ x132 c2 1370 c3 1370
+ x132 c4 1370 c5 1370
+ x132 c6 1370 c7 1370
+ x132 c8 1370 c9 1370
+ x132 c10 1370 c11 1370
+ x132 c12 1370 c13 1370
+ x133 obj 1E-5 c1 1
+ x133 c2 9828 c5 6682.7810219
+ x133 c6 9828 c7 4661.988764
+ x133 c8 9828 c9 9828
+ x133 c10 9828 c11 7435.893535
+ x134 obj 1E-5 c1 1
+ x134 c2 9376 c4 9376
+ x134 c6 9376 c8 9376
+ x134 c9 7354 c10 9376
+ x134 c12 4540 c13 9376
+ x135 obj 1E-5 c1 1
+ x135 c2 3856.6326291 c3 2379.6660405
+ x135 c4 6443 c5 5038.2167883
+ x135 c6 5616.8782937 c7 5761.1011236
+ x135 c8 6443 c9 6443
+ x135 c10 2784.1324972 c11 4802.8550525
+ x135 c13 816.93589744
+ x136 obj 1E-5 c1 1
+ x136 c2 1996 c3 1996
+ x136 c4 1996 c5 1996
+ x136 c6 1996 c7 1996
+ x136 c8 1996 c9 1996
+ x136 c10 1996 c11 1996
+ x136 c12 1996 c13 1996
+ x137 obj 1E-5 c1 1
+ x137 c2 5320 c3 5320
+ x137 c4 5320 c5 4660.7472019
+ x137 c6 5320 c7 5320
+ x137 c8 5320 c9 5320
+ x137 c10 2436.2770533 c11 5320
+ x137 c12 1390.0810811 c13 5320
+ x138 obj 1E-5 c1 1
+ x138 c2 3107.4788732 c3 5533.7993219
+ x138 c4 2524.7428057 c5 6754
+ x138 c6 1358.4934125 c7 3269.2808989
+ x138 c8 6041.6761381 c9 801.50639269
+ x138 c10 579.50663393 c12 275
+ x138 c13 1376.7820513
+ x139 obj 1E-5 c1 1
+ x139 c2 1645 c3 1645
+ x139 c4 1645 c5 1645
+ x139 c6 1645 c7 1645
+ x139 c8 1645 c9 1645
+ x139 c10 1645 c11 1645
+ x139 c12 1645 c13 1645
+ x140 obj 1E-5 c1 1
+ x140 c2 2890.0046948 c3 4365
+ x140 c4 499.32083911 c5 2864.8812652
+ x140 c6 4365 c7 3781.011236
+ x140 c8 647 c9 4920
+ x140 c10 3851.4963355 c11 3400.7613107
+ x140 c12 7967.1621622 c13 433
+ x141 obj 1E-5 c1 1
+ x141 c2 4920 c3 4920
+ x141 c4 4920 c5 4920
+ x141 c6 4920 c7 4396.0561798
+ x141 c8 4920 c9 4920
+ x141 c10 4920 c11 4920
+ x141 c12 4920 c13 4920
+ x142 obj 1E-5 c1 1
+ x142 c2 8107 c3 8107
+ x142 c5 8107 c7 8107
+ x142 c9 4475.8803653 c10 8107
+ x142 c11 8107 c12 3561.7972973
+ x143 obj 1E-5 c1 1
+ x143 c2 6103 c3 6103
+ x143 c4 6103 c5 6103
+ x143 c6 6103 c9 6103
+ x143 c10 6103 c12 2247.6351351
+ x144 obj 1E-5 c1 1
+ x144 c2 4970 c3 4970
+ x144 c4 4970 c5 4970
+ x144 c6 4970 c7 4970
+ x144 c8 4970 c9 4970
+ x144 c10 4970 c11 4970
+ x144 c12 4970 c13 3647
+ x145 obj 1E-5 c1 1
+ x145 c2 1582 c3 1582
+ x145 c4 1007.7206724 c5 1582
+ x145 c6 1582 c7 1582
+ x145 c8 1582 c9 1582
+ x145 c10 1582 c11 1582
+ x145 c12 1582 c13 1582
+ x146 obj 1E-5 c1 1
+ x146 c2 6146 c3 6146
+ x146 c4 6146 c6 6146
+ x146 c7 4694 c8 6146
+ x146 c9 4153.7584475 c10 956.80938421
+ x146 c11 6146 c12 6146
+ x146 c13 3939
+ x147 obj 1E-5 c1 1
+ x147 c2 6295 c3 6295
+ x147 c4 6295 c5 5403.1975669
+ x147 c6 6295 c10 6295
+ x147 c11 4239.4996656 c12 6295
+ x147 c13 6295
+ x148 obj 1E-5 c1 1
+ x148 c2 8177 c3 8177
+ x148 c5 3640.0593674 c6 8177
+ x148 c8 8177 c11 5869.4915429
+ x148 c12 1942.6756757 c13 8177
+ x149 obj 1E-5 c1 1
+ x149 c2 5339 c3 6015.5
+ x149 c4 8641 c6 8742
+ x149 c7 4299.5617978 c8 8742
+ x149 c10 4836
+ x150 obj 1E-5 c1 1
+ x150 c2 9936 c3 9936
+ x150 c8 9936 c9 8641
+ x150 c10 5887 c11 9936
+ x150 c12 9936 c13 9936
+ MARK0001 'MARKER' 'INTEND'
+ x151 obj 1 c2 1
+ x151 c3 1 c4 1
+ x151 c5 1 c6 1
+ x151 c7 1 c8 1
+ x151 c9 1 c10 1
+ x151 c11 1 c12 1
+ x151 c13 1
+RHS
+ rhs c1 20 c2 157344.61033
+ rhs c3 110007.77718 c4 113089.95355
+ rhs c5 107767 c6 107283.94838
+ rhs c7 86376 c8 107309
+ rhs c9 105490.73653 c10 117802.11377
+ rhs c11 97934 c12 85137
+ rhs c13 94358.5
+BOUNDS
+ UP bnd x1 1
+ UP bnd x2 1
+ UP bnd x3 1
+ UP bnd x4 1
+ UP bnd x5 1
+ UP bnd x6 1
+ UP bnd x7 1
+ UP bnd x8 1
+ UP bnd x9 1
+ UP bnd x10 1
+ UP bnd x11 1
+ UP bnd x12 1
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ UP bnd x57 1
+ UP bnd x58 1
+ UP bnd x59 1
+ UP bnd x60 1
+ UP bnd x61 1
+ UP bnd x62 1
+ UP bnd x63 1
+ UP bnd x64 1
+ UP bnd x65 1
+ UP bnd x66 1
+ UP bnd x67 1
+ UP bnd x68 1
+ UP bnd x69 1
+ UP bnd x70 1
+ UP bnd x71 1
+ UP bnd x72 1
+ UP bnd x73 1
+ UP bnd x74 1
+ UP bnd x75 1
+ UP bnd x76 1
+ UP bnd x77 1
+ UP bnd x78 1
+ UP bnd x79 1
+ UP bnd x80 1
+ UP bnd x81 1
+ UP bnd x82 1
+ UP bnd x83 1
+ UP bnd x84 1
+ UP bnd x85 1
+ UP bnd x86 1
+ UP bnd x87 1
+ UP bnd x88 1
+ UP bnd x89 1
+ UP bnd x90 1
+ UP bnd x91 1
+ UP bnd x92 1
+ UP bnd x93 1
+ UP bnd x94 1
+ UP bnd x95 1
+ UP bnd x96 1
+ UP bnd x97 1
+ UP bnd x98 1
+ UP bnd x99 1
+ UP bnd x100 1
+ UP bnd x101 1
+ UP bnd x102 1
+ UP bnd x103 1
+ UP bnd x104 1
+ UP bnd x105 1
+ UP bnd x106 1
+ UP bnd x107 1
+ UP bnd x108 1
+ UP bnd x109 1
+ UP bnd x110 1
+ UP bnd x111 1
+ UP bnd x112 1
+ UP bnd x113 1
+ UP bnd x114 1
+ UP bnd x115 1
+ UP bnd x116 1
+ UP bnd x117 1
+ UP bnd x118 1
+ UP bnd x119 1
+ UP bnd x120 1
+ UP bnd x121 1
+ UP bnd x122 1
+ UP bnd x123 1
+ UP bnd x124 1
+ UP bnd x125 1
+ UP bnd x126 1
+ UP bnd x127 1
+ UP bnd x128 1
+ UP bnd x129 1
+ UP bnd x130 1
+ UP bnd x131 1
+ UP bnd x132 1
+ UP bnd x133 1
+ UP bnd x134 1
+ UP bnd x135 1
+ UP bnd x136 1
+ UP bnd x137 1
+ UP bnd x138 1
+ UP bnd x139 1
+ UP bnd x140 1
+ UP bnd x141 1
+ UP bnd x142 1
+ UP bnd x143 1
+ UP bnd x144 1
+ UP bnd x145 1
+ UP bnd x146 1
+ UP bnd x147 1
+ UP bnd x148 1
+ UP bnd x149 1
+ UP bnd x150 1
+ UP bnd x151 1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas76.mps b/demos/ppl_lpsol/examples/mas76.mps
new file mode 100644
index 0000000..7ff9a64
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas76.mps
@@ -0,0 +1,1134 @@
+NAME mas76
+ROWS
+ N obj
+ L c1
+ G c2
+ G c3
+ G c4
+ G c5
+ G c6
+ G c7
+ G c8
+ G c9
+ G c10
+ G c11
+ G c12
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ x1 obj 1E-5 c1 1
+ x1 c2 3857.5340376 c3 4264
+ x1 c4 4264 c5 4264
+ x1 c6 4264 c7 4264
+ x1 c8 4264 c9 4264
+ x1 c10 4264 c11 4264
+ x1 c12 4264
+ x2 obj 1E-5 c1 1
+ x2 c2 125.76760563 c3 5339
+ x2 c4 5339 c5 5339
+ x2 c6 4264 c7 5339
+ x2 c8 5339 c9 3875.8958001
+ x2 c10 1218.3024772 c11 2349.7029047
+ x2 c12 3717.0066721
+ x3 obj 1E-5 c1 1
+ x3 c2 7165.7769953 c3 5997.5298448
+ x3 c4 4020 c5 2551.0705817
+ x3 c6 7749 c7 5950
+ x3 c8 8260 c9 4091.5157068
+ x3 c11 5954.3061901 c12 3906
+ x4 obj 1E-5 c1 1
+ x4 c2 2876 c3 2876
+ x4 c4 2876 c5 2876
+ x4 c6 2876 c7 2876
+ x4 c8 2876 c9 2876
+ x4 c10 2876 c11 2876
+ x4 c12 2876
+ x5 obj 1E-5 c1 1
+ x5 c2 9723 c5 9723
+ x5 c6 9723 c7 9723
+ x5 c8 8445 c9 9723
+ x5 c11 9723 c12 7630.8567538
+ x6 obj 1E-5 c1 1
+ x6 c2 7310 c3 7310
+ x6 c4 7310 c5 7310
+ x6 c8 7310 c11 7310
+ x6 c12 7310
+ x7 obj 1E-5 c1 1
+ x7 c2 1529 c3 1529
+ x7 c4 1529 c5 1529
+ x7 c6 1529 c7 1529
+ x7 c8 1529 c9 1529
+ x7 c10 1529 c11 1529
+ x7 c12 1529
+ x8 obj 1E-5 c1 1
+ x8 c2 1585 c3 1585
+ x8 c4 1585 c5 1585
+ x8 c6 1585 c7 1585
+ x8 c8 1585 c9 1585
+ x8 c10 1585 c11 1585
+ x8 c12 1585
+ x9 obj 1E-5 c1 1
+ x9 c2 2949 c3 2949
+ x9 c4 2949 c5 2949
+ x9 c6 2949 c7 2949
+ x9 c8 2949 c9 2949
+ x9 c10 2949 c11 2949
+ x9 c12 2949
+ x10 obj 1E-5 c1 1
+ x10 c2 7097 c3 4194.6948608
+ x10 c4 7097 c5 7097
+ x10 c6 5307.6683033 c7 3402.7992571
+ x10 c8 7097 c9 7097
+ x10 c11 7097 c12 3993.4803922
+ x11 obj 1E-5 c1 1
+ x11 c2 1239 c3 1239
+ x11 c4 1239 c5 1239
+ x11 c6 1239 c7 1239
+ x11 c8 1239 c9 1239
+ x11 c10 1239 c11 1239
+ x11 c12 1239
+ x12 obj 1E-5 c1 1
+ x12 c2 6449 c3 9402
+ x12 c4 5213 c5 5460.1237005
+ x12 c6 4623.3631424 c7 6449
+ x12 c8 2364.3477082 c9 9402
+ x12 c11 6019.7713621
+ x13 obj 1E-5 c1 1
+ x13 c2 4596.07277 c3 8025
+ x13 c4 5205.5725555 c5 6988.5590257
+ x13 c6 5095.7938067 c7 3647
+ x13 c8 2463 c9 141.85254951
+ x13 c10 2623.8400161 c11 8025
+ x13 c12 996.84041394
+ x14 obj 1E-5 c1 1
+ x14 c2 8037 c3 8037
+ x14 c5 8037 c6 8037
+ x14 c8 8037 c9 8037
+ x14 c10 8037 c12 8037
+ x15 obj 1E-5 c1 1
+ x15 c2 7123 c3 7123
+ x15 c4 3447.1997813 c5 7123
+ x15 c6 7123 c7 4517.0858346
+ x15 c8 7123 c10 7123
+ x15 c11 7123
+ x16 obj 1E-5 c1 1
+ x16 c2 8067 c3 4956.3455567
+ x16 c4 5187.6249609 c5 8067
+ x16 c6 8067 c10 3697.4308858
+ x16 c11 8067
+ x17 obj 1E-5 c1 1
+ x17 c2 5704 c3 5704
+ x17 c4 5704 c5 5704
+ x17 c6 5704 c7 5704
+ x17 c8 2933 c9 5704
+ x17 c10 5704 c11 5704
+ x17 c12 5704
+ x18 obj 1E-5 c1 1
+ x18 c2 1582 c3 1582
+ x18 c4 1506.6047419 c5 1582
+ x18 c6 1582 c7 1582
+ x18 c8 1582 c9 1582
+ x18 c10 1582 c11 1582
+ x18 c12 1582
+ x19 obj 1E-5 c1 1
+ x19 c2 8713 c4 8713
+ x19 c5 4132.4582009 c6 6570.524825
+ x19 c7 7115.7257058 c8 8713
+ x19 c10 8713 c11 8713
+ x19 c12 7955.7135076
+ x20 obj 1E-5 c1 1
+ x20 c2 9232 c4 9232
+ x20 c6 9232 c8 9232
+ x20 c9 8172 c10 8172
+ x20 c11 9232 c12 9232
+ x21 obj 1E-5 c1 1
+ x21 c2 3371 c3 4450.6085385
+ x21 c4 4600 c5 4035
+ x21 c6 4035 c7 3371
+ x21 c8 4600 c9 4600
+ x21 c10 4600 c11 4600
+ x21 c12 4600
+ x22 obj 1E-5 c1 1
+ x22 c2 2637 c3 2637
+ x22 c4 2637 c5 2637
+ x22 c6 2637 c7 2637
+ x22 c8 2637 c9 2637
+ x22 c10 2637 c11 2637
+ x22 c12 2637
+ x23 obj 1E-5 c1 1
+ x23 c2 7131 c3 2834.0627677
+ x23 c4 3022.4184269 c5 5161.2867944
+ x23 c6 5112.4181569 c7 7131
+ x23 c8 6859.5538378 c9 6201.8467448
+ x23 c10 3993.954677 c11 7131
+ x23 c12 6771.8233932
+ x24 obj 1E-5 c1 1
+ x24 c2 418.3028169 c3 6800.7326017
+ x24 c4 1444.7264377 c5 4438.6399605
+ x24 c6 4376.4583031 c7 5896.5208271
+ x24 c8 2400.0713317 c9 4056
+ x24 c10 9861 c11 4486.3993937
+ x24 c12 425.53118192
+ x25 obj 1E-5 c1 1
+ x25 c2 3647 c3 3647
+ x25 c4 3647 c5 3647
+ x25 c6 3647 c7 3647
+ x25 c8 3647 c9 3647
+ x25 c10 3647 c11 3647
+ x25 c12 3647
+ x26 obj 1E-5 c1 1
+ x26 c2 5688.4859155 c3 5067.3705835
+ x26 c4 8494 c5 4130.3600395
+ x26 c6 6202.6957438 c7 8494
+ x26 c8 2923 c9 4370
+ x26 c10 8494 c11 5761.3993937
+ x26 c12 2913.3760893
+ x27 obj 1E-5 c1 1
+ x27 c2 7832.5997653 c3 9897
+ x27 c5 9897 c7 379.40517583
+ x27 c8 1683.2694603 c9 692.80030731
+ x27 c10 1978.1561741 c11 3143.4143401
+ x27 c12 2587.7352941
+ x28 obj 1E-5 c1 1
+ x28 c2 4409.1255869 c3 5880
+ x28 c4 4579 c5 5880
+ x28 c6 5880 c7 5880
+ x28 c8 5880 c9 1252
+ x28 c10 5880 c11 4322.1433305
+ x28 c12 3416.7352941
+ x29 obj 1E-5 c1 1
+ x29 c2 1053 c3 1053
+ x29 c4 1053 c5 1053
+ x29 c6 1053 c7 1053
+ x29 c8 1053 c9 1053
+ x29 c10 1053 c11 1053
+ x29 c12 1053
+ x30 obj 1E-5 c1 1
+ x30 c2 2869 c3 2869
+ x30 c4 2869 c5 2869
+ x30 c6 2869 c7 2869
+ x30 c8 2781.1171684 c9 2869
+ x30 c10 2869 c11 2869
+ x30 c12 2869
+ x31 obj 1E-5 c1 1
+ x31 c2 5410 c3 5410
+ x31 c4 5410 c5 4453
+ x31 c6 5410 c7 5410
+ x31 c8 1920.896664 c9 5410
+ x31 c10 5410 c11 5410
+ x31 c12 1867.9586057
+ x32 obj 1E-5 c1 1
+ x32 c2 3948 c3 3948
+ x32 c4 3948 c5 3948
+ x32 c6 3948 c7 3948
+ x32 c8 3948 c9 3948
+ x32 c10 3948 c11 3948
+ x32 c12 3948
+ x33 obj 1E-5 c1 1
+ x33 c2 6049 c3 6049
+ x33 c4 6049 c5 6049
+ x33 c6 6049 c7 6049
+ x33 c8 6049 c9 6049
+ x33 c10 6049 c11 6049
+ x33 c12 6049
+ x34 obj 1E-5 c1 1
+ x34 c2 9317 c4 9317
+ x34 c6 9317 c8 9317
+ x34 c9 9317 c10 9317
+ x35 obj 1E-5 c1 1
+ x35 c2 6880 c3 6880
+ x35 c4 179.5 c5 1950
+ x35 c6 6880 c7 2814.2200099
+ x35 c8 2633.4930838 c9 4584.1996927
+ x35 c10 2002.5472941 c11 4666.1862662
+ x35 c12 6880
+ x36 obj 1E-5 c1 1
+ x36 c2 3779 c3 3779
+ x36 c4 3779 c5 3779
+ x36 c6 3779 c7 3779
+ x36 c8 3779 c9 3779
+ x36 c10 3779 c11 3779
+ x36 c12 3779
+ x37 obj 1E-5 c1 1
+ x37 c2 3641 c3 3641
+ x37 c4 3641 c5 3641
+ x37 c6 3641 c7 3641
+ x37 c8 3641 c9 3641
+ x37 c10 3641 c11 3641
+ x37 c12 3641
+ x38 obj 1E-5 c1 1
+ x38 c2 5567 c3 4989.1615364
+ x38 c4 5567 c5 5567
+ x38 c6 5567 c7 5567
+ x38 c8 5567 c9 5567
+ x38 c10 5567 c11 5353
+ x38 c12 5567
+ x39 obj 1E-5 c1 1
+ x39 c2 2197 c3 2197
+ x39 c4 2197 c5 2197
+ x39 c6 2197 c7 2197
+ x39 c8 2197 c9 2197
+ x39 c10 2197 c11 2197
+ x39 c12 2197
+ x40 obj 1E-5 c1 1
+ x40 c2 2842 c3 2842
+ x40 c4 2842 c5 2842
+ x40 c6 2842 c7 2842
+ x40 c8 2842 c9 2842
+ x40 c10 2842 c11 2842
+ x40 c12 2842
+ x41 obj 1E-5 c1 1
+ x41 c2 4846 c3 4846
+ x41 c4 4846 c5 4846
+ x41 c6 4846 c7 4846
+ x41 c8 4846 c9 4846
+ x41 c10 4846 c11 4846
+ x41 c12 4846
+ x42 obj 1E-5 c1 1
+ x42 c2 4616 c3 4616
+ x42 c4 4616 c5 4616
+ x42 c6 4386.6285041 c7 4616
+ x42 c8 4616 c9 4616
+ x42 c10 4616 c11 4616
+ x42 c12 4616
+ x43 obj 1E-5 c1 1
+ x43 c2 8807 c4 8807
+ x43 c5 8807 c8 8807
+ x43 c9 8807 c10 8807
+ x43 c11 8807 c12 8807
+ x44 obj 1E-5 c1 1
+ x44 c2 3261 c3 3261
+ x44 c4 3261 c5 3261
+ x44 c6 3261 c7 3261
+ x44 c8 3261 c9 3261
+ x44 c10 3261 c11 3261
+ x44 c12 3261
+ x45 obj 1E-5 c1 1
+ x45 c2 3553 c3 3553
+ x45 c4 3553 c5 3553
+ x45 c6 3553 c7 3553
+ x45 c8 3553 c9 3553
+ x45 c10 3553 c11 3553
+ x45 c12 3553
+ x46 obj 1E-5 c1 1
+ x46 c2 5239 c3 5239
+ x46 c4 5239 c5 5239
+ x46 c6 5239 c7 5239
+ x46 c8 5239 c9 5239
+ x46 c10 5239 c11 5239
+ x46 c12 5239
+ x47 obj 1E-5 c1 1
+ x47 c2 6665 c3 6665
+ x47 c4 6665 c5 6665
+ x47 c6 6665 c7 6665
+ x47 c9 6665 c10 6665
+ x47 c11 6665
+ x48 obj 1E-5 c1 1
+ x48 c2 3257.4906103 c3 6513.6694995
+ x48 c4 8172 c6 8172
+ x48 c7 5519.3776127 c8 8172
+ x48 c9 8172 c10 8172
+ x48 c11 8172 c12 8172
+ x49 obj 1E-5 c1 1
+ x49 c2 7219.556338 c3 6513.6694995
+ x49 c4 8425 c6 8425
+ x49 c7 5519.3776127 c8 8425
+ x49 c11 8425 c12 4380.7073802
+ x50 obj 1E-5 c1 1
+ x50 c2 2536 c3 2536
+ x50 c4 2536 c5 2536
+ x50 c6 2536 c7 2536
+ x50 c8 2536 c9 2536
+ x50 c10 2536 c11 2536
+ x50 c12 2536
+ x51 obj 1E-5 c1 1
+ x51 c2 8013 c3 5762
+ x51 c5 5175.6917691 c6 2922.0679176
+ x51 c7 2679.7992571 c8 6292.9194467
+ x51 c9 7163.2213749 c10 5780.0146168
+ x51 c11 8013 c12 5333.267293
+ x52 obj 1E-5 c1 1
+ x52 c2 3541 c3 3541
+ x52 c4 3541 c5 3541
+ x52 c6 922.71451306 c7 3541
+ x52 c8 3541 c9 3541
+ x52 c10 3541 c11 3541
+ x52 c12 3541
+ x53 obj 1E-5 c1 1
+ x53 c2 8080 c3 8080
+ x53 c5 8080 c6 8080
+ x53 c9 8080 c10 8080
+ x53 c11 8080 c12 8080
+ x54 obj 1E-5 c1 1
+ x54 c2 5593.0586854 c3 6767
+ x54 c4 4966.4377418 c5 2857.9555159
+ x54 c6 6767 c7 5991.3240713
+ x54 c8 4602.7549498 c9 3568.8679718
+ x54 c10 6701.5752929 c11 6767
+ x54 c12 3547.4434913
+ x55 obj 1E-5 c1 1
+ x55 c2 5036 c3 5036
+ x55 c4 5036 c5 5036
+ x55 c6 5036 c7 5036
+ x55 c8 5036 c9 5036
+ x55 c10 5036 c11 5036
+ x55 c12 5036
+ x56 obj 1E-5 c1 1
+ x56 c2 1782 c3 1782
+ x56 c4 1782 c5 1782
+ x56 c6 1782 c7 1782
+ x56 c8 1782 c9 1782
+ x56 c10 1782 c11 1782
+ x56 c12 1782
+ x57 obj 1E-5 c1 1
+ x57 c2 3895 c3 3895
+ x57 c4 3895 c5 3895
+ x57 c6 3895 c7 3895
+ x57 c8 3895 c9 3895
+ x57 c10 3895 c11 3895
+ x57 c12 769.38126362
+ x58 obj 1E-5 c1 1
+ x58 c2 4205 c3 4205
+ x58 c4 4205 c5 4205
+ x58 c6 4205 c7 4205
+ x58 c8 4205 c9 4205
+ x58 c10 4205 c11 4205
+ x58 c12 4205
+ x59 obj 1E-5 c1 1
+ x59 c2 7772 c3 7772
+ x59 c4 7772 c7 7772
+ x59 c9 7772 c10 7772
+ x59 c11 6995.3832487
+ x60 obj 1E-5 c1 1
+ x60 c2 9326 c4 6887.3290528
+ x60 c5 2548.0705817 c6 9326
+ x60 c7 9326 c8 5781.2161649
+ x60 c10 9326 c11 9326
+ x61 obj 1E-5 c1 1
+ x61 c2 4757 c3 4757
+ x61 c4 1337.1303919 c5 1766.2736704
+ x61 c8 3828.0930296 c9 2546.4977806
+ x61 c10 4720.6651742 c11 1936
+ x61 c12 1374.3269336
+ x62 obj 1E-5 c1 1
+ x62 c2 5355 c3 5355
+ x62 c4 5355 c5 5355
+ x62 c6 5355 c7 5355
+ x62 c8 5355 c9 920.44109948
+ x62 c10 5355 c11 5355
+ x62 c12 5355
+ x63 obj 1E-5 c1 1
+ x63 c2 1919 c3 1919
+ x63 c4 1919 c5 1919
+ x63 c6 1919 c7 1919
+ x63 c8 1919 c9 1919
+ x63 c10 1919 c11 1919
+ x63 c12 1919
+ x64 obj 1E-5 c1 1
+ x64 c2 7510.5774648 c3 7988.4333512
+ x64 c4 6185.1233268 c6 5491.8578076
+ x64 c7 6851.4383853 c8 6803.6804991
+ x64 c10 3921.3900634 c11 7066.1811901
+ x64 c12 1296.5245098
+ x65 obj 1E-5 c1 1
+ x65 c2 7341 c3 7341
+ x65 c4 7341 c5 7341
+ x65 c8 7341 c9 6295.6057364
+ x65 c11 7341
+ x66 obj 1E-5 c1 1
+ x66 c2 8541 c3 8541
+ x66 c6 4655 c7 8541
+ x66 c8 4655 c9 3195
+ x66 c10 8541 c11 4655
+ x66 c12 8541
+ x67 obj 1E-5 c1 1
+ x67 c2 8352 c3 8352
+ x67 c5 8352 c7 8352
+ x67 c10 8352 c11 8352
+ x67 c12 8352
+ x68 obj 1E-5 c1 1
+ x68 c2 3291 c3 3291
+ x68 c4 3291 c5 3291
+ x68 c6 3291 c7 3291
+ x68 c8 3291 c9 3291
+ x68 c10 3291 c11 3291
+ x68 c12 3291
+ x69 obj 1E-5 c1 1
+ x69 c2 7328 c3 7328
+ x69 c4 7328 c5 7328
+ x69 c8 7328 c11 7328
+ x69 c12 7328
+ x70 obj 1E-5 c1 1
+ x70 c2 4506 c3 4506
+ x70 c4 4506 c5 4506
+ x70 c6 4506 c7 4506
+ x70 c8 4506 c9 4506
+ x70 c10 4506 c11 4506
+ x70 c12 4506
+ x71 obj 1E-5 c1 1
+ x71 c2 4429 c3 4429
+ x71 c4 4429 c5 4429
+ x71 c6 4429 c7 4429
+ x71 c8 4429 c9 4429
+ x71 c10 4429 c11 4429
+ x71 c12 4429
+ x72 obj 1E-5 c1 1
+ x72 c2 4593 c3 4593
+ x72 c4 2038.6351681 c5 4593
+ x72 c6 3783.7812896 c7 2671.1703318
+ x72 c8 2068.3189585 c9 4593
+ x72 c10 4593 c11 4593
+ x72 c12 758.29711329
+ x73 obj 1E-5 c1 1
+ x73 c2 9138 c4 6121.179313
+ x73 c5 8484 c7 4071.8888806
+ x73 c8 8484 c9 2896.1020089
+ x73 c10 9138 c11 2081.7976241
+ x73 c12 2184.2401961
+ x74 obj 1E-5 c1 1
+ x74 c2 3731.7664319 c3 6465.6610011
+ x74 c4 6197.801258 c5 6175.543002
+ x74 c7 5999.3406637 c8 4290.3138053
+ x74 c9 5877.0429661 c10 3472.3031042
+ x74 c11 3545.8932953 c12 4236.1090686
+ x75 obj 1E-5 c1 1
+ x75 c2 5124.2922535 c3 5806.8664347
+ x75 c4 1698.801258 c5 2921.3990893
+ x75 c6 654.39121533 c7 3781.9888063
+ x75 c8 5470.8814755 c9 984.49846346
+ x75 c10 630.30310424 c11 5202.9097575
+ x75 c12 5406.1224129
+ x76 obj 1E-5 c1 1
+ x76 c2 4378 c3 4378
+ x76 c4 2279.4274445 c5 4378
+ x76 c6 4378 c8 4378
+ x76 c9 4378 c10 4378
+ x76 c11 4378 c12 4378
+ x77 obj 1E-5 c1 1
+ x77 c2 3647 c3 3647
+ x77 c4 3647 c5 3647
+ x77 c6 3647 c7 3647
+ x77 c8 3647 c9 3647
+ x77 c10 3647 c11 3647
+ x77 c12 3647
+ x78 obj 1E-5 c1 1
+ x78 c2 3795 c3 1395.1358405
+ x78 c4 3795 c5 3795
+ x78 c6 3795 c7 3795
+ x78 c8 3795 c9 3795
+ x78 c10 2912 c11 3795
+ x78 c12 3795
+ x79 obj 1E-5 c1 1
+ x79 c2 2912 c3 2912
+ x79 c4 2912 c5 2912
+ x79 c6 2912 c7 2912
+ x79 c8 2912 c9 2912
+ x79 c10 2912 c11 2912
+ x79 c12 2912
+ x80 obj 1E-5 c1 1
+ x80 c2 8830 c4 8830
+ x80 c5 2505.1281467 c6 8830
+ x80 c7 8830 c8 8830
+ x80 c9 8830 c12 40.55787037
+ x81 obj 1E-5 c1 1
+ x81 c2 5445 c3 5445
+ x81 c4 5445 c5 5445
+ x81 c6 5445 c7 5445
+ x81 c8 5445 c9 2395.8979911
+ x81 c10 5445 c11 5445
+ x81 c12 5445
+ x82 obj 1E-5 c1 1
+ x83 obj 1E-5 c1 1
+ x83 c2 6112 c3 6112
+ x83 c4 4478.7723368 c5 6112
+ x83 c6 6112 c7 6112
+ x83 c8 6112 c9 6112
+ x83 c10 6112 c11 6112
+ x83 c12 6112
+ x84 obj 1E-5 c1 1
+ x84 c2 8841 c4 8841
+ x84 c5 8841 c6 8841
+ x84 c10 8841 c12 8841
+ x85 obj 1E-5 c1 1
+ x85 c2 1236 c3 1236
+ x85 c4 1236 c5 1236
+ x85 c6 1236 c7 1236
+ x85 c8 1236 c9 1236
+ x85 c10 1236 c11 1236
+ x85 c12 1236
+ x86 obj 1E-5 c1 1
+ x86 c2 7010 c3 7010
+ x86 c4 7010 c5 7010
+ x86 c6 7010 c9 7010
+ x86 c10 7010
+ x87 obj 1E-5 c1 1
+ x87 c2 2909 c3 2909
+ x87 c4 2909 c5 2909
+ x87 c6 2909 c7 2909
+ x87 c8 2909 c9 2909
+ x87 c10 2909 c11 2909
+ x87 c12 2909
+ x88 obj 1E-5 c1 1
+ x88 c2 7622 c3 7622
+ x88 c4 7622 c7 7622
+ x88 c8 7622 c9 7622
+ x88 c10 7622 c12 7622
+ x89 obj 1E-5 c1 1
+ x89 c2 7393 c3 6594.385439
+ x89 c4 1997.1997813 c5 6110.5626987
+ x89 c6 5966.6503463 c7 6281.3502229
+ x89 c8 7393 c9 7393
+ x89 c10 7393 c12 7393
+ x90 obj 1E-5 c1 1
+ x90 c2 8317.6971831 c3 8830
+ x90 c6 4789.3781866 c7 4764.2200099
+ x90 c8 3307.7596962 c9 4019.8003073
+ x90 c10 3952.5472941 c11 5757.7289904
+ x90 c12 8830
+ x91 obj 1E-5 c1 1
+ x91 c2 1950 c3 1950
+ x91 c4 179.5 c5 1950
+ x91 c6 1950 c7 1950
+ x91 c8 1950 c9 1950
+ x91 c10 1950 c11 1950
+ x91 c12 1950
+ x92 obj 1E-5 c1 1
+ x92 c2 4654 c3 4654
+ x92 c4 4654 c5 4654
+ x92 c6 4654 c7 4654
+ x92 c8 4654 c9 2510.3471432
+ x92 c10 4654 c11 4654
+ x92 c12 4654
+ x93 obj 1E-5 c1 1
+ x93 c2 2255 c3 2255
+ x93 c4 2255 c5 2255
+ x93 c6 2255 c7 2255
+ x93 c8 2255 c9 2255
+ x93 c10 2255 c11 2255
+ x93 c12 2255
+ x94 obj 1E-5 c1 1
+ x94 c2 7104 c3 7104
+ x94 c4 7104 c5 7104
+ x94 c6 7104 c10 7104
+ x94 c12 7104
+ x95 obj 1E-5 c1 1
+ x95 c2 7534.7887324 c3 7744
+ x95 c4 7744 c6 7744
+ x95 c9 4404.6020089 c11 7744
+ x95 c12 5858.9893791
+ x96 obj 1E-5 c1 1
+ x96 c2 2054 c3 2054
+ x96 c4 2054 c5 2054
+ x96 c6 2054 c7 2054
+ x96 c8 2054 c9 2054
+ x96 c10 2054 c11 2054
+ x96 c12 2054
+ x97 obj 1E-5 c1 1
+ x97 c2 6682 c3 6682
+ x97 c4 6682 c5 2501.4582009
+ x97 c6 3124.5817884 c7 6682
+ x97 c8 6682 c9 1366.8979911
+ x97 c10 6682 c11 1810.9409546
+ x97 c12 6682
+ x98 obj 1E-5 c1 1
+ x98 c2 3234 c3 3234
+ x98 c4 3234 c5 3234
+ x98 c6 3234 c7 3234
+ x98 c8 3234 c9 3234
+ x98 c10 3234 c11 3234
+ x98 c12 3234
+ x99 obj 1E-5 c1 1
+ x99 c2 2842 c3 2842
+ x99 c4 2842 c5 2842
+ x99 c6 654.39121533 c7 2706.9888063
+ x99 c8 2842 c9 2842
+ x99 c10 2842 c11 1339.329068
+ x99 c12 2842
+ x100 obj 1E-5 c1 1
+ x100 c2 3974 c3 3974
+ x100 c4 3974 c5 3974
+ x100 c6 3974 c7 3974
+ x100 c8 3974 c9 3974
+ x100 c10 3974 c11 3974
+ x100 c12 3974
+ x101 obj 1E-5 c1 1
+ x101 c2 3624 c3 3624
+ x101 c4 3624 c5 3624
+ x101 c6 3624 c7 3624
+ x101 c8 3624 c9 3624
+ x101 c10 3624 c11 3624
+ x101 c12 3624
+ x102 obj 1E-5 c1 1
+ x102 c2 5415 c3 5415
+ x102 c4 5415 c5 5415
+ x102 c6 5415 c7 5415
+ x102 c8 5415 c9 5415
+ x102 c10 5415 c11 5415
+ x102 c12 5415
+ x103 obj 1E-5 c1 1
+ x103 c2 2246 c3 1997.6085385
+ x103 c4 2246 c5 1582
+ x103 c6 2246 c7 2246
+ x103 c8 2246 c9 2246
+ x103 c10 2246 c11 2246
+ x103 c12 2246
+ x104 obj 1E-5 c1 1
+ x104 c2 8590 c3 8590
+ x104 c6 8590 c8 8590
+ x104 c9 8590 c10 8590
+ x104 c11 8590 c12 8590
+ x105 obj 1E-5 c1 1
+ x105 c2 2633 c3 2373.137781
+ x105 c4 2633 c5 2633
+ x105 c6 2633 c7 2633
+ x105 c8 2633 c9 2633
+ x105 c10 2633 c11 2633
+ x105 c12 2633
+ x106 obj 1E-5 c1 1
+ x106 c2 4655 c3 4655
+ x106 c4 4655 c5 4655
+ x106 c6 4655 c7 4655
+ x106 c8 4655 c9 4655
+ x106 c10 4655 c11 4655
+ x106 c12 4655
+ x107 obj 1E-5 c1 1
+ x107 c2 2923 c3 2923
+ x107 c4 2923 c5 2923
+ x107 c6 2923 c7 2923
+ x107 c8 2923 c9 2923
+ x107 c10 2923 c11 2923
+ x107 c12 2923
+ x108 obj 1E-5 c1 1
+ x108 c2 6318 c3 6318
+ x108 c4 6318 c5 6318
+ x108 c6 6318 c7 6318
+ x108 c8 6318 c9 6318
+ x108 c10 6318 c12 6318
+ x109 obj 1E-5 c1 1
+ x109 c2 7440 c3 7440
+ x109 c4 7440 c6 7440
+ x109 c7 7440 c9 7440
+ x109 c12 7440
+ x110 obj 1E-5 c1 1
+ x110 c2 4579 c3 4579
+ x110 c4 4579 c5 4579
+ x110 c6 4579 c7 4579
+ x110 c8 4579 c9 4579
+ x110 c10 4579 c11 4579
+ x110 c12 4579
+ x111 obj 1E-5 c1 1
+ x111 c2 8342 c3 8342
+ x111 c5 8342 c7 5211.7323923
+ x111 c8 8342 c9 8342
+ x111 c10 8342
+ x112 obj 1E-5 c1 1
+ x112 c2 3813.4002347 c3 5050
+ x112 c4 5050 c5 1365.1296074
+ x112 c6 3650.9002494 c7 1367.1828628
+ x112 c8 2259.9591809 c9 1582
+ x112 c10 4641.0618824 c12 1839.3216231
+ x113 obj 1E-5 c1 1
+ x113 c2 6268 c3 6268
+ x113 c4 5050 c5 6268
+ x113 c6 6268 c7 987.77768697
+ x113 c8 6268 c9 6268
+ x113 c10 6268 c11 3143.4143401
+ x113 c12 6268
+ x114 obj 1E-5 c1 1
+ x114 c2 8570 c3 8570
+ x114 c6 8570 c7 8570
+ x114 c8 8570 c10 2672.8901642
+ x114 c11 8570 c12 7847.8483115
+ x115 obj 1E-5 c1 1
+ x115 c2 9838 c5 7799
+ x115 c6 7119.5646547 c7 8392.0859336
+ x115 c8 9838 c9 9838
+ x115 c10 9838 c11 9838
+ x115 c12 9838
+ x116 obj 1E-5 c1 1
+ x116 c2 4876 c3 4876
+ x116 c4 4876 c5 4876
+ x116 c6 4876 c7 4876
+ x116 c8 1677.8517765 c9 4876
+ x116 c10 4876 c11 4876
+ x116 c12 4876
+ x117 obj 1E-5 c1 1
+ x117 c2 418.3028169 c3 6800.7326017
+ x117 c4 1444.7264377 c5 4438.6399605
+ x117 c6 4376.4583031 c7 5896.5208271
+ x117 c8 2400.0713317 c9 4056
+ x117 c10 9861 c11 4486.3993937
+ x117 c12 425.53118192
+ x118 obj 1E-5 c1 1
+ x118 c2 4922 c3 4922
+ x118 c4 4922 c5 4922
+ x118 c6 3590 c7 4922
+ x118 c8 4922 c9 3333
+ x118 c10 4922 c11 4922
+ x118 c12 4922
+ x119 obj 1E-5 c1 1
+ x119 c2 3590 c3 3590
+ x119 c4 3590 c5 3590
+ x119 c6 3590 c7 3590
+ x119 c8 3590 c9 3590
+ x119 c10 3590 c11 3590
+ x119 c12 3590
+ x120 obj 1E-5 c1 1
+ x120 c2 7152 c3 7152
+ x120 c4 7152 c5 7152
+ x120 c7 7152 c8 7152
+ x120 c10 7152
+ x121 obj 1E-5 c1 1
+ x121 c2 7056 c3 7056
+ x121 c4 805 c5 7056
+ x121 c6 7056 c7 7056
+ x121 c8 7056 c9 6684.7360005
+ x121 c10 7056 c11 7056
+ x121 c12 7056
+ x122 obj 1E-5 c1 1
+ x122 c2 9136 c4 9136
+ x122 c6 9136 c7 9136
+ x122 c9 9136 c10 9136
+ x122 c11 9136
+ x123 obj 1E-5 c1 1
+ x123 c2 7850 c3 7850
+ x123 c4 4655 c5 4655
+ x123 c7 7850 c9 7850
+ x123 c10 7850 c12 7850
+ x124 obj 1E-5 c1 1
+ x124 c2 6863 c3 6863
+ x124 c4 6863 c5 6863
+ x124 c6 6863 c7 6863
+ x124 c12 6863
+ x125 obj 1E-5 c1 1
+ x125 c2 9356 c4 6006.1685651
+ x125 c5 9356 c7 9356
+ x125 c9 7984.5952083 c11 4448
+ x125 c12 7131.2908497
+ x126 obj 1E-5 c1 1
+ x126 c2 2933 c3 2933
+ x126 c4 2933 c5 2933
+ x126 c6 2933 c7 2933
+ x126 c8 2933 c9 2933
+ x126 c10 2933 c11 2933
+ x126 c12 2933
+ x127 obj 1E-5 c1 1
+ x127 c2 2665 c3 2665
+ x127 c4 2665 c5 2665
+ x127 c6 2665 c7 2665
+ x127 c8 2665 c9 2665
+ x127 c10 2665 c11 2665
+ x127 c12 2665
+ x128 obj 1E-5 c1 1
+ x128 c2 4063 c3 4063
+ x128 c4 4063 c5 4063
+ x128 c6 4063 c7 4063
+ x128 c8 4063 c9 4063
+ x128 c10 4063 c11 4063
+ x128 c12 4063
+ x129 obj 1E-5 c1 1
+ x129 c2 7502 c3 7194.4958512
+ x129 c4 7502 c6 5805.6941235
+ x129 c7 7502 c8 2838.1593436
+ x129 c9 2973.398674 c10 7502
+ x129 c11 6324.7029047 c12 6844.4421296
+ x130 obj 1E-5 c1 1
+ x130 c2 1966 c3 1966
+ x130 c4 1966 c5 1966
+ x130 c6 1966 c7 1966
+ x130 c8 1966 c9 1966
+ x130 c10 1966 c11 1966
+ x130 c12 1966
+ x131 obj 1E-5 c1 1
+ x131 c2 4540 c3 4540
+ x131 c4 4540 c5 4540
+ x131 c6 4540 c7 4540
+ x131 c8 4540 c9 4540
+ x131 c10 4540 c11 4540
+ x131 c12 4540
+ x132 obj 1E-5 c1 1
+ x132 c2 1370 c3 1370
+ x132 c4 1370 c5 1370
+ x132 c6 1370 c7 1370
+ x132 c8 1370 c9 1370
+ x132 c10 1370 c11 1370
+ x132 c12 1370
+ x133 obj 1E-5 c1 1
+ x133 c2 9828 c5 9828
+ x133 c6 9828 c7 9828
+ x133 c9 9828 c11 9828
+ x133 c12 9828
+ x134 obj 1E-5 c1 1
+ x134 c2 9376 c4 9376
+ x134 c7 9376 c8 9376
+ x134 c9 9376 c10 9376
+ x134 c11 9376 c12 9376
+ x135 obj 1E-5 c1 1
+ x135 c2 3856.6326291 c3 699.33050054
+ x135 c4 6443 c5 2459.7239454
+ x135 c6 6443 c7 4204.3776127
+ x135 c8 6443 c9 5442.4805372
+ x135 c10 4223.2163061 c11 6443
+ x135 c12 4023.7207244
+ x136 obj 1E-5 c1 1
+ x136 c2 1996 c3 1996
+ x136 c4 1996 c5 1996
+ x136 c6 1996 c7 1996
+ x136 c8 1996 c9 1996
+ x136 c10 1996 c11 1996
+ x136 c12 1996
+ x137 obj 1E-5 c1 1
+ x137 c2 5320 c3 5320
+ x137 c4 5320 c5 5320
+ x137 c6 2230.8578076 c7 5320
+ x137 c8 5320 c9 5320
+ x137 c10 5320 c11 5320
+ x137 c12 5320
+ x138 obj 1E-5 c1 1
+ x138 c2 3107.4788732 c3 2686.2422377
+ x138 c4 190.29012568 c6 35.415531264
+ x138 c7 3688.0699604 c8 6754
+ x138 c10 3234 c12 5299.145561
+ x139 obj 1E-5 c1 1
+ x139 c2 1645 c3 1645
+ x139 c4 1645 c5 1645
+ x139 c6 1645 c7 1645
+ x139 c8 1645 c9 1645
+ x139 c10 1645 c11 1645
+ x139 c12 1645
+ x140 obj 1E-5 c1 1
+ x140 c2 2890.0046948 c3 2194.0980996
+ x140 c4 1966 c5 234.37039265
+ x140 c6 6184.8933866 c7 433
+ x140 c8 8057.6528343 c9 5264.9477578
+ x140 c10 7785.9167409 c11 433
+ x140 c12 5743.9670479
+ x141 obj 1E-5 c1 1
+ x141 c2 4920 c3 4920
+ x141 c4 4276.6272259 c5 4920
+ x141 c6 4920 c7 4920
+ x141 c8 4920 c9 4920
+ x141 c10 4920 c11 4920
+ x141 c12 4920
+ x142 obj 1E-5 c1 1
+ x142 c2 8107 c3 8107
+ x142 c5 8107 c6 8107
+ x142 c8 8107 c9 8107
+ x142 c11 8107
+ x143 obj 1E-5 c1 1
+ x143 c2 6103 c3 6103
+ x143 c4 6103 c5 2850.6425595
+ x143 c6 6103 c7 6103
+ x143 c8 4014.9286683 c9 6103
+ x143 c10 6103 c11 6103
+ x143 c12 3705
+ x144 obj 1E-5 c1 1
+ x144 c2 4970 c3 4970
+ x144 c4 4970 c5 4970
+ x144 c6 4970 c7 4970
+ x144 c8 4970 c9 4970
+ x144 c10 4970 c11 4970
+ x144 c12 4970
+ x145 obj 1E-5 c1 1
+ x145 c2 1582 c3 1582
+ x145 c4 1582 c5 1582
+ x145 c6 1582 c7 1582
+ x145 c8 1582 c9 1582
+ x145 c10 1582 c11 1582
+ x145 c12 1582
+ x146 obj 1E-5 c1 1
+ x146 c2 6146 c3 6007.6066649
+ x146 c4 6146 c5 6146
+ x146 c6 1807.4118259 c7 6146
+ x146 c8 6146 c9 6146
+ x146 c10 4055.643386 c11 6146
+ x146 c12 3889.5196078
+ x147 obj 1E-5 c1 1
+ x147 c2 6295 c3 6295
+ x147 c4 6295 c5 6295
+ x147 c6 6295 c7 6295
+ x147 c8 6295 c9 6295
+ x147 c10 6295 c11 6295
+ x148 obj 1E-5 c1 1
+ x148 c2 8177 c3 4739.5
+ x148 c4 8177 c7 8177
+ x148 c8 8177 c9 8177
+ x148 c10 8177 c11 8177
+ x148 c12 8177
+ x149 obj 1E-5 c1 1
+ x149 c2 5339 c3 3384.6358405
+ x149 c4 8742 c5 3373
+ x149 c6 4547.1370064 c7 8742
+ x149 c8 8742 c9 8742
+ x149 c10 8742 c11 8742
+ x149 c12 8742
+ x150 obj 1E-5 c1 1
+ x150 c2 9936 c5 9936
+ x150 c6 9936 c7 9936
+ x150 c8 9936 c10 9936
+ MARK0001 'MARKER' 'INTEND'
+ x151 obj 1 c2 1
+ x151 c3 1 c4 1
+ x151 c5 1 c6 1
+ x151 c7 1 c8 1
+ x151 c9 1 c10 1
+ x151 c11 1 c12 1
+RHS
+ rhs c1 15 c2 157344.61033
+ rhs c3 117845.82287 c4 121387.97778
+ rhs c5 122529.5819 c6 124193.83991
+ rhs c7 110802.52457 c8 111973.66667
+ rhs c9 115941 c10 127089.14155
+ rhs c11 112419.0906 c12 123188
+BOUNDS
+ UP bnd x1 1
+ UP bnd x2 1
+ UP bnd x3 1
+ UP bnd x4 1
+ UP bnd x5 1
+ UP bnd x6 1
+ UP bnd x7 1
+ UP bnd x8 1
+ UP bnd x9 1
+ UP bnd x10 1
+ UP bnd x11 1
+ UP bnd x12 1
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ UP bnd x57 1
+ UP bnd x58 1
+ UP bnd x59 1
+ UP bnd x60 1
+ UP bnd x61 1
+ UP bnd x62 1
+ UP bnd x63 1
+ UP bnd x64 1
+ UP bnd x65 1
+ UP bnd x66 1
+ UP bnd x67 1
+ UP bnd x68 1
+ UP bnd x69 1
+ UP bnd x70 1
+ UP bnd x71 1
+ UP bnd x72 1
+ UP bnd x73 1
+ UP bnd x74 1
+ UP bnd x75 1
+ UP bnd x76 1
+ UP bnd x77 1
+ UP bnd x78 1
+ UP bnd x79 1
+ UP bnd x80 1
+ UP bnd x81 1
+ UP bnd x82 1
+ UP bnd x83 1
+ UP bnd x84 1
+ UP bnd x85 1
+ UP bnd x86 1
+ UP bnd x87 1
+ UP bnd x88 1
+ UP bnd x89 1
+ UP bnd x90 1
+ UP bnd x91 1
+ UP bnd x92 1
+ UP bnd x93 1
+ UP bnd x94 1
+ UP bnd x95 1
+ UP bnd x96 1
+ UP bnd x97 1
+ UP bnd x98 1
+ UP bnd x99 1
+ UP bnd x100 1
+ UP bnd x101 1
+ UP bnd x102 1
+ UP bnd x103 1
+ UP bnd x104 1
+ UP bnd x105 1
+ UP bnd x106 1
+ UP bnd x107 1
+ UP bnd x108 1
+ UP bnd x109 1
+ UP bnd x110 1
+ UP bnd x111 1
+ UP bnd x112 1
+ UP bnd x113 1
+ UP bnd x114 1
+ UP bnd x115 1
+ UP bnd x116 1
+ UP bnd x117 1
+ UP bnd x118 1
+ UP bnd x119 1
+ UP bnd x120 1
+ UP bnd x121 1
+ UP bnd x122 1
+ UP bnd x123 1
+ UP bnd x124 1
+ UP bnd x125 1
+ UP bnd x126 1
+ UP bnd x127 1
+ UP bnd x128 1
+ UP bnd x129 1
+ UP bnd x130 1
+ UP bnd x131 1
+ UP bnd x132 1
+ UP bnd x133 1
+ UP bnd x134 1
+ UP bnd x135 1
+ UP bnd x136 1
+ UP bnd x137 1
+ UP bnd x138 1
+ UP bnd x139 1
+ UP bnd x140 1
+ UP bnd x141 1
+ UP bnd x142 1
+ UP bnd x143 1
+ UP bnd x144 1
+ UP bnd x145 1
+ UP bnd x146 1
+ UP bnd x147 1
+ UP bnd x148 1
+ UP bnd x149 1
+ UP bnd x150 1
+ UP bnd x151 1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mip.mps b/demos/ppl_lpsol/examples/mip.mps
new file mode 100644
index 0000000..d2da1a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mip.mps
@@ -0,0 +1,27 @@
+NAME SAMP2
+ROWS
+ N Z
+ G R1
+ G R2
+ G R3
+COLUMNS
+ X1 R1 2.0 R2 1.0
+ X1 R3 5.0 Z 3.0
+ X2 R1 -1.0 R2 -1.0
+ X2 R3 3.0 Z 7.0
+ X3 R1 1.0 R2 -6.0
+ X3 Z -1.0
+ X4 R1 -1.0 R2 4.0
+ X4 R3 1.0 Z 1.0
+RHS
+ RHS1 R1 1.0
+ RHS1 R2 8.0
+ RHS1 R3 5.0
+BOUNDS
+ UP BND1 X1 4.0
+ LO BND1 X2 2.0
+ UI BND1 X2 5.0
+ BV BND1 X3
+ LO BND1 X4 3.0
+ UP BND1 X4 8.0
+ENDATA
diff --git a/demos/ppl_lpsol/examples/modglob.mps b/demos/ppl_lpsol/examples/modglob.mps
new file mode 100644
index 0000000..fe9611e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/modglob.mps
@@ -0,0 +1,1192 @@
+NAME modglob
+ROWS
+ N OBJ
+ E c1
+ E c2
+ E c3
+ E c4
+ E c5
+ E c6
+ E c7
+ E c8
+ E c9
+ E c10
+ E c11
+ E c12
+ E c13
+ E c14
+ E c15
+ E c16
+ E c17
+ E c18
+ E c19
+ E c20
+ E c21
+ E c22
+ E c23
+ E c24
+ E c25
+ E c26
+ E c27
+ E c28
+ E c29
+ E c30
+ E c31
+ E c32
+ E c33
+ E c34
+ E c35
+ E c36
+ E c37
+ E c38
+ E c39
+ E c40
+ E c41
+ E c42
+ E c43
+ E c44
+ E c45
+ E c46
+ E c47
+ E c48
+ E c49
+ E c50
+ E c51
+ E c52
+ E c53
+ E c54
+ E c55
+ E c56
+ E c57
+ E c58
+ E c59
+ E c60
+ E c61
+ E c62
+ E c63
+ E c64
+ E c65
+ E c66
+ E c67
+ E c68
+ E c69
+ E c70
+ E c71
+ E c72
+ E c73
+ E c74
+ E c75
+ E c76
+ E c77
+ E c78
+ E c79
+ E c80
+ E c81
+ E c82
+ E c83
+ E c84
+ E c85
+ E c86
+ E c87
+ E c88
+ E c89
+ E c90
+ E c91
+ E c92
+ E c93
+ E c94
+ E c95
+ L c96
+ L c97
+ L c98
+ L c99
+ L c100
+ L c101
+ L c102
+ L c103
+ L c104
+ L c105
+ L c106
+ L c107
+ L c108
+ L c109
+ L c110
+ L c111
+ L c112
+ L c113
+ L c114
+ L c115
+ L c116
+ L c117
+ L c118
+ L c119
+ L c120
+ L c121
+ L c122
+ L c123
+ L c124
+ L c125
+ L c126
+ L c127
+ L c128
+ L c129
+ L c130
+ L c131
+ L c132
+ L c133
+ L c134
+ L c135
+ L c136
+ L c137
+ L c138
+ L c139
+ L c140
+ L c141
+ L c142
+ L c143
+ L c144
+ L c145
+ L c146
+ L c147
+ L c148
+ L c149
+ L c150
+ L c151
+ L c152
+ L c153
+ L c154
+ L c155
+ L c156
+ L c157
+ L c158
+ L c159
+ L c160
+ L c161
+ L c162
+ L c163
+ L c164
+ L c165
+ L c166
+ L c167
+ L c168
+ L c169
+ L c170
+ L c171
+ L c172
+ L c173
+ L c174
+ L c175
+ L c176
+ L c177
+ L c178
+ L c179
+ L c180
+ L c181
+ L c182
+ L c183
+ L c184
+ L c185
+ L c186
+ L c187
+ L c188
+ L c189
+ L c190
+ L c191
+ L c192
+ L c193
+ L c194
+ L c195
+ L c196
+ L c197
+ L c198
+ L c199
+ L c200
+ L c201
+ L c202
+ L c203
+ L c204
+ L c205
+ L c206
+ L c207
+ L c208
+ L c209
+ L c210
+ L c211
+ L c212
+ L c213
+ L c214
+ L c215
+ L c216
+ L c217
+ L c218
+ L c219
+ L c220
+ L c221
+ L c222
+ L c223
+ L c224
+ L c225
+ L c226
+ L c227
+ L c228
+ L c229
+ L c230
+ L c231
+ L c232
+ L c233
+ L c234
+ L c235
+ L c236
+ L c237
+ L c238
+ L c239
+ L c240
+ L c241
+ L c242
+ L c243
+ L c244
+ L c245
+ L c246
+ L c247
+ L c248
+ L c249
+ L c250
+ L c251
+ L c252
+ L c253
+ L c254
+ L c255
+ L c256
+ L c257
+ L c258
+ L c259
+ L c260
+ L c261
+ L c262
+ L c263
+ L c264
+ L c265
+ L c266
+ L c267
+ L c268
+ L c269
+ L c270
+ L c271
+ L c272
+ L c273
+ L c274
+ L c275
+ L c276
+ L c277
+ L c278
+ L c279
+ L c280
+ L c281
+ L c282
+ L c283
+ L c284
+ L c285
+ L c286
+ L c287
+ L c288
+ L c289
+ L c290
+ L c291
+COLUMNS
+ x1 OBJ 432 c1 -0.9
+ x2 OBJ 432 c3 -0.9
+ x3 OBJ 367 c2 -1
+ x4 OBJ 367 c4 -1
+ x5 OBJ 0.65392 c36 -1
+ x5 c38 0.98 c98 1
+ x6 OBJ 3.224038 c36 -1
+ x6 c42 0.98 c96 1
+ x7 OBJ 0.65392 c36 0.98
+ x7 c38 -1 c196 1
+ x8 OBJ 2.985518 c38 -1
+ x8 c44 0.98 c100 1
+ x9 OBJ 1.599959 c40 -1
+ x9 c42 0.98 c206 1
+ x10 OBJ 4.336906 c40 -1
+ x10 c46 0.98 c110 1
+ x11 OBJ 3.224038 c36 0.98
+ x11 c42 -1 c194 1
+ x12 OBJ 1.599959 c40 0.98
+ x12 c42 -1 c108 1
+ x13 OBJ 1.135649 c42 -1
+ x13 c44 0.98 c200 1
+ x14 OBJ 4.795188 c42 -1
+ x14 c48 0.98 c106 1
+ x15 OBJ 2.985518 c38 0.98
+ x15 c44 -1 c198 1
+ x16 OBJ 1.135649 c42 0.98
+ x16 c44 -1 c102 1
+ x17 OBJ 5.424316 c44 -1
+ x17 c50 0.98 c104 1
+ x18 OBJ 4.336906 c40 0.98
+ x18 c46 -1 c208 1
+ x19 OBJ 1.938308 c46 -1
+ x19 c48 0.98 c210 1
+ x20 OBJ 3.851157 c46 -1
+ x20 c60 0.98 c124 1
+ x21 OBJ 4.795188 c42 0.98
+ x21 c48 -1 c204 1
+ x22 OBJ 1.938308 c46 0.98
+ x22 c48 -1 c112 1
+ x23 OBJ 1.6951 c48 -1
+ x23 c50 0.98 c114 1
+ x24 OBJ 4.293357 c48 -1
+ x24 c58 0.98 c122 1
+ x25 OBJ 5.424316 c44 0.98
+ x25 c50 -1 c202 1
+ x26 OBJ 1.6951 c48 0.98
+ x26 c50 -1 c212 1
+ x27 OBJ 1.461269 c50 -1
+ x27 c52 0.98 c116 1
+ x28 OBJ 3.782818 c50 -1
+ x28 c56 0.98 c120 1
+ x29 OBJ 1.461269 c50 0.98
+ x29 c52 -1 c214 1
+ x30 OBJ 3.392878 c52 -1
+ x30 c54 0.98 c118 1
+ x31 OBJ 3.392878 c52 0.98
+ x31 c54 -1 c216 1
+ x32 OBJ 2.129257 c54 -1
+ x32 c56 0.98 c126 1
+ x33 OBJ 3.449157 c54 -1
+ x33 c132 1
+ x34 OBJ 3.782818 c50 0.98
+ x34 c56 -1 c218 1
+ x35 OBJ 2.129257 c54 0.98
+ x35 c56 -1 c224 1
+ x36 OBJ 2.294749 c56 -1
+ x36 c58 0.98 c128 1
+ x37 OBJ 3.3768 c56 -1
+ x37 c64 0.98 c134 1
+ x38 OBJ 4.293357 c48 0.98
+ x38 c58 -1 c220 1
+ x39 OBJ 2.294749 c56 0.98
+ x39 c58 -1 c226 1
+ x40 OBJ 2.068289 c58 -1
+ x40 c60 0.98 c130 1
+ x41 OBJ 3.107457 c58 -1
+ x41 c66 0.98 c136 1
+ x42 OBJ 3.851157 c46 0.98
+ x42 c60 -1 c222 1
+ x43 OBJ 2.068289 c58 0.98
+ x43 c60 -1 c228 1
+ x44 OBJ 1.222749 c60 -1
+ x44 c62 0.98 c140 1
+ x45 OBJ 2.622378 c60 -1
+ x45 c68 0.98 c138 1
+ x46 OBJ 1.222749 c60 0.98
+ x46 c62 -1 c238 1
+ x47 OBJ 2.252539 c62 -1
+ x47 c70 0.98 c142 1
+ x48 OBJ 3.3768 c56 0.98
+ x48 c64 -1 c232 1
+ x49 OBJ 2.510489 c64 -1
+ x49 c66 0.98 c150 1
+ x50 OBJ 4.276607 c64 -1
+ x50 c80 0.98 c148 1
+ x51 OBJ 2.449518 c64 -1
+ x51 c244 1
+ x52 OBJ 3.107457 c58 0.98
+ x52 c66 -1 c234 1
+ x53 OBJ 2.510489 c64 0.98
+ x53 c66 -1 c248 1
+ x54 OBJ 2.576149 c66 -1
+ x54 c68 0.98 c154 1
+ x55 OBJ 3.762717 c66 -1
+ x55 c78 0.98 c152 1
+ x56 OBJ 2.622378 c60 0.98
+ x56 c68 -1 c236 1
+ x57 OBJ 2.576149 c66 0.98
+ x57 c68 -1 c252 1
+ x58 OBJ 2.059578 c68 -1
+ x58 c70 0.98 c158 1
+ x59 OBJ 2.9078 c68 -1
+ x59 c76 0.98 c156 1
+ x60 OBJ 2.252539 c62 0.98
+ x60 c70 -1 c240 1
+ x61 OBJ 2.059578 c68 0.98
+ x61 c70 -1 c256 1
+ x62 OBJ 1.9631 c70 -1
+ x62 c74 0.98 c160 1
+ x63 OBJ 1.797607 c72 -1
+ x63 c74 0.98 c278 1
+ x64 OBJ 1.727258 c72 -1
+ x64 c94 0.98 c182 1
+ x65 OBJ 1.9631 c70 0.98
+ x65 c74 -1 c258 1
+ x66 OBJ 1.797607 c72 0.98
+ x66 c74 -1 c180 1
+ x67 OBJ 2.842138 c74 -1
+ x67 c76 0.98 c274 1
+ x68 OBJ 2.178839 c74 -1
+ x68 c92 0.98 c178 1
+ x69 OBJ 2.9078 c68 0.98
+ x69 c76 -1 c254 1
+ x70 OBJ 2.842138 c74 0.98
+ x70 c76 -1 c176 1
+ x71 OBJ 4.285317 c76 -1
+ x71 c78 0.98 c270 1
+ x72 OBJ 3.573778 c76 -1
+ x72 c90 0.98 c174 1
+ x73 OBJ 3.762717 c66 0.98
+ x73 c78 -1 c250 1
+ x74 OBJ 4.285317 c76 0.98
+ x74 c78 -1 c172 1
+ x75 OBJ 3.946967 c78 -1
+ x75 c80 0.98 c266 1
+ x76 OBJ 4.337578 c78 -1
+ x76 c88 0.98 c170 1
+ x77 OBJ 4.276607 c64 0.98
+ x77 c80 -1 c246 1
+ x78 OBJ 3.946967 c78 0.98
+ x78 c80 -1 c168 1
+ x79 OBJ 2.714838 c80 -1
+ x79 c82 0.98 c262 1
+ x80 OBJ 4.556 c80 -1
+ x80 c86 0.98 c166 1
+ x81 OBJ 2.714838 c80 0.98
+ x81 c82 -1 c164 1
+ x82 OBJ 4.397878 c82 -1
+ x82 c84 0.98 c162 1
+ x83 OBJ 4.060867 c82 -1
+ x83 c242 1
+ x84 OBJ 4.397878 c82 0.98
+ x84 c84 -1 c260 1
+ x85 OBJ 2.985518 c84 -1
+ x85 c86 0.98 c184 1
+ x86 OBJ 4.556 c80 0.98
+ x86 c86 -1 c264 1
+ x87 OBJ 2.985518 c84 0.98
+ x87 c86 -1 c282 1
+ x88 OBJ 5.672216 c86 -1
+ x88 c88 0.98 c186 1
+ x89 OBJ 4.337578 c78 0.98
+ x89 c88 -1 c268 1
+ x90 OBJ 5.672216 c86 0.98
+ x90 c88 -1 c284 1
+ x91 OBJ 6.280577 c88 -1
+ x91 c90 0.98 c188 1
+ x92 OBJ 3.573778 c76 0.98
+ x92 c90 -1 c272 1
+ x93 OBJ 6.280577 c88 0.98
+ x93 c90 -1 c286 1
+ x94 OBJ 4.728188 c90 -1
+ x94 c92 0.98 c190 1
+ x95 OBJ 2.178839 c74 0.98
+ x95 c92 -1 c276 1
+ x96 OBJ 4.728188 c90 0.98
+ x96 c92 -1 c288 1
+ x97 OBJ 2.384528 c92 -1
+ x97 c94 0.98 c192 1
+ x98 OBJ 1.727258 c72 0.98
+ x98 c94 -1 c280 1
+ x99 OBJ 2.384528 c92 0.98
+ x99 c94 -1 c290 1
+ x100 OBJ 3.449157 c3 1
+ x100 c54 0.98 c230 1
+ x101 OBJ 2.449518 c3 1
+ x101 c64 0.98 c146 1
+ x102 OBJ 4.060867 c3 1
+ x102 c82 0.98 c144 1
+ x103 OBJ 0.35136 c37 -1
+ x103 c39 0.98 c99 1
+ x104 OBJ 1.732319 c37 -1
+ x104 c43 0.98 c97 1
+ x105 OBJ 0.35136 c37 0.98
+ x105 c39 -1 c197 1
+ x106 OBJ 1.604159 c39 -1
+ x106 c45 0.98 c101 1
+ x107 OBJ 0.85968 c41 -1
+ x107 c43 0.98 c207 1
+ x108 OBJ 2.330278 c41 -1
+ x108 c47 0.98 c111 1
+ x109 OBJ 1.732319 c37 0.98
+ x109 c43 -1 c195 1
+ x110 OBJ 0.85968 c41 0.98
+ x110 c43 -1 c109 1
+ x111 OBJ 0.6102 c43 -1
+ x111 c45 0.98 c201 1
+ x112 OBJ 2.576519 c43 -1
+ x112 c49 0.98 c107 1
+ x113 OBJ 1.604159 c39 0.98
+ x113 c45 -1 c199 1
+ x114 OBJ 0.6102 c43 0.98
+ x114 c45 -1 c103 1
+ x115 OBJ 2.914559 c45 -1
+ x115 c51 0.98 c105 1
+ x116 OBJ 2.330278 c41 0.98
+ x116 c47 -1 c209 1
+ x117 OBJ 1.041479 c47 -1
+ x117 c49 0.98 c211 1
+ x118 OBJ 2.069279 c47 -1
+ x118 c61 0.98 c125 1
+ x119 OBJ 2.576519 c43 0.98
+ x119 c49 -1 c205 1
+ x120 OBJ 1.041479 c47 0.98
+ x120 c49 -1 c113 1
+ x121 OBJ 0.9108 c49 -1
+ x121 c51 0.98 c115 1
+ x122 OBJ 2.306879 c49 -1
+ x122 c59 0.98 c123 1
+ x123 OBJ 2.914559 c45 0.98
+ x123 c51 -1 c203 1
+ x124 OBJ 0.9108 c49 0.98
+ x124 c51 -1 c213 1
+ x125 OBJ 0.78516 c51 -1
+ x125 c53 0.98 c117 1
+ x126 OBJ 2.032559 c51 -1
+ x126 c57 0.98 c121 1
+ x127 OBJ 0.78516 c51 0.98
+ x127 c53 -1 c215 1
+ x128 OBJ 1.823039 c53 -1
+ x128 c55 0.98 c119 1
+ x129 OBJ 1.823039 c53 0.98
+ x129 c55 -1 c217 1
+ x130 OBJ 1.144079 c55 -1
+ x130 c57 0.98 c127 1
+ x131 OBJ 1.853279 c55 -1
+ x131 c133 1
+ x132 OBJ 2.032559 c51 0.98
+ x132 c57 -1 c219 1
+ x133 OBJ 1.144079 c55 0.98
+ x133 c57 -1 c225 1
+ x134 OBJ 1.233 c57 -1
+ x134 c59 0.98 c129 1
+ x135 OBJ 1.8144 c57 -1
+ x135 c65 0.98 c135 1
+ x136 OBJ 2.306879 c49 0.98
+ x136 c59 -1 c221 1
+ x137 OBJ 1.233 c57 0.98
+ x137 c59 -1 c227 1
+ x138 OBJ 1.11132 c59 -1
+ x138 c61 0.98 c131 1
+ x139 OBJ 1.669679 c59 -1
+ x139 c67 0.98 c137 1
+ x140 OBJ 2.069279 c47 0.98
+ x140 c61 -1 c223 1
+ x141 OBJ 1.11132 c59 0.98
+ x141 c61 -1 c229 1
+ x142 OBJ 0.657 c61 -1
+ x142 c63 0.98 c141 1
+ x143 OBJ 1.409039 c61 -1
+ x143 c69 0.98 c139 1
+ x144 OBJ 0.657 c61 0.98
+ x144 c63 -1 c239 1
+ x145 OBJ 1.21032 c63 -1
+ x145 c71 0.98 c143 1
+ x146 OBJ 1.8144 c57 0.98
+ x146 c65 -1 c233 1
+ x147 OBJ 1.348919 c65 -1
+ x147 c67 0.98 c151 1
+ x148 OBJ 2.297879 c65 -1
+ x148 c81 0.98 c149 1
+ x149 OBJ 1.316159 c65 -1
+ x149 c245 1
+ x150 OBJ 1.669679 c59 0.98
+ x150 c67 -1 c235 1
+ x151 OBJ 1.348919 c65 0.98
+ x151 c67 -1 c249 1
+ x152 OBJ 1.3842 c67 -1
+ x152 c69 0.98 c155 1
+ x153 OBJ 2.021759 c67 -1
+ x153 c79 0.98 c153 1
+ x154 OBJ 1.409039 c61 0.98
+ x154 c69 -1 c237 1
+ x155 OBJ 1.3842 c67 0.98
+ x155 c69 -1 c253 1
+ x156 OBJ 1.106639 c69 -1
+ x156 c71 0.98 c159 1
+ x157 OBJ 1.5624 c69 -1
+ x157 c77 0.98 c157 1
+ x158 OBJ 1.21032 c63 0.98
+ x158 c71 -1 c241 1
+ x159 OBJ 1.106639 c69 0.98
+ x159 c71 -1 c257 1
+ x160 OBJ 1.0548 c71 -1
+ x160 c75 0.98 c161 1
+ x161 OBJ 0.965879 c73 -1
+ x161 c75 0.98 c279 1
+ x162 OBJ 0.928079 c73 -1
+ x162 c95 0.98 c183 1
+ x163 OBJ 1.0548 c71 0.98
+ x163 c75 -1 c259 1
+ x164 OBJ 0.965879 c73 0.98
+ x164 c75 -1 c181 1
+ x165 OBJ 1.52712 c75 -1
+ x165 c77 0.98 c275 1
+ x166 OBJ 1.170719 c75 -1
+ x166 c93 0.98 c179 1
+ x167 OBJ 1.5624 c69 0.98
+ x167 c77 -1 c255 1
+ x168 OBJ 1.52712 c75 0.98
+ x168 c77 -1 c177 1
+ x169 OBJ 2.302559 c77 -1
+ x169 c79 0.98 c271 1
+ x170 OBJ 1.920239 c77 -1
+ x170 c91 0.98 c175 1
+ x171 OBJ 2.021759 c67 0.98
+ x171 c79 -1 c251 1
+ x172 OBJ 2.302559 c77 0.98
+ x172 c79 -1 c173 1
+ x173 OBJ 2.120759 c79 -1
+ x173 c81 0.98 c267 1
+ x174 OBJ 2.330639 c79 -1
+ x174 c89 0.98 c171 1
+ x175 OBJ 2.297879 c65 0.98
+ x175 c81 -1 c247 1
+ x176 OBJ 2.120759 c79 0.98
+ x176 c81 -1 c169 1
+ x177 OBJ 1.458719 c81 -1
+ x177 c83 0.98 c263 1
+ x178 OBJ 2.448 c81 -1
+ x178 c87 0.98 c167 1
+ x179 OBJ 1.458719 c81 0.98
+ x179 c83 -1 c165 1
+ x180 OBJ 2.363039 c83 -1
+ x180 c85 0.98 c163 1
+ x181 OBJ 2.181959 c83 -1
+ x181 c243 1
+ x182 OBJ 2.363039 c83 0.98
+ x182 c85 -1 c261 1
+ x183 OBJ 1.604159 c85 -1
+ x183 c87 0.98 c185 1
+ x184 OBJ 2.448 c81 0.98
+ x184 c87 -1 c265 1
+ x185 OBJ 1.604159 c85 0.98
+ x185 c87 -1 c283 1
+ x186 OBJ 3.047759 c87 -1
+ x186 c89 0.98 c187 1
+ x187 OBJ 2.330639 c79 0.98
+ x187 c89 -1 c269 1
+ x188 OBJ 3.047759 c87 0.98
+ x188 c89 -1 c285 1
+ x189 OBJ 3.37464 c89 -1
+ x189 c91 0.98 c189 1
+ x190 OBJ 1.920239 c77 0.98
+ x190 c91 -1 c273 1
+ x191 OBJ 3.37464 c89 0.98
+ x191 c91 -1 c287 1
+ x192 OBJ 2.54052 c91 -1
+ x192 c93 0.98 c191 1
+ x193 OBJ 1.170719 c75 0.98
+ x193 c93 -1 c277 1
+ x194 OBJ 2.54052 c91 0.98
+ x194 c93 -1 c289 1
+ x195 OBJ 1.28124 c93 -1
+ x195 c95 0.98 c193 1
+ x196 OBJ 0.928079 c73 0.98
+ x196 c95 -1 c281 1
+ x197 OBJ 1.28124 c93 0.98
+ x197 c95 -1 c291 1
+ x198 OBJ 1.853279 c4 1
+ x198 c55 0.98 c231 1
+ x199 OBJ 1.316159 c4 1
+ x199 c65 0.98 c147 1
+ x200 OBJ 2.181959 c4 1
+ x200 c83 0.98 c145 1
+ MARK0000 'MARKER' 'INTORG'
+ x201 OBJ 15061.55078 c96 -17360
+ x201 c194 -17360
+ x202 OBJ 9479.636719 c97 -17360
+ x202 c195 -17360
+ x203 OBJ 3054.878418 c98 -17360
+ x203 c196 -17360
+ x204 OBJ 1922.719482 c99 -17360
+ x204 c197 -17360
+ x205 OBJ 13947.26953 c100 -17360
+ x205 c198 -17360
+ x206 OBJ 8778.3125 c101 -17360
+ x206 c199 -17360
+ x207 OBJ 5305.347656 c102 -17360
+ x207 c200 -17360
+ x208 OBJ 3339.149414 c103 -17360
+ x208 c201 -17360
+ x209 OBJ 25340.46484 c104 -17360
+ x209 c202 -17360
+ x210 OBJ 15949.11328 c105 -17360
+ x210 c203 -17360
+ x211 OBJ 22401.39844 c106 -17360
+ x211 c204 -17360
+ x212 OBJ 14099.28516 c107 -17360
+ x212 c205 -17360
+ x213 OBJ 7474.433594 c108 -17360
+ x213 c206 -17360
+ x214 OBJ 4704.355469 c109 -17360
+ x214 c207 -17360
+ x215 OBJ 20260.47266 c110 -17360
+ x215 c208 -17360
+ x216 OBJ 12751.80078 c111 -17360
+ x216 c209 -17360
+ x217 OBJ 9055.078125 c112 -17360
+ x217 c210 -17360
+ x218 OBJ 5699.203125 c113 -17360
+ x218 c211 -17360
+ x219 OBJ 7918.894531 c114 -17360
+ x219 c212 -17360
+ x220 OBJ 4984.097656 c115 -17360
+ x220 c213 -17360
+ x221 OBJ 6826.523438 c116 -17360
+ x221 c214 -17360
+ x222 OBJ 4296.566406 c117 -17360
+ x222 c215 -17360
+ x223 OBJ 15850.30859 c118 -17360
+ x223 c216 -17360
+ x224 OBJ 9976.074219 c119 -17360
+ x224 c217 -17360
+ x225 OBJ 17671.96484 c120 -17360
+ x225 c218 -17360
+ x226 OBJ 11122.61328 c121 -17360
+ x226 c219 -17360
+ x227 OBJ 20057.02344 c122 -17360
+ x227 c220 -17360
+ x228 OBJ 12623.75391 c123 -17360
+ x228 c221 -17360
+ x229 OBJ 17991.22656 c124 -17360
+ x229 c222 -17360
+ x230 OBJ 11323.55078 c125 -17360
+ x230 c223 -17360
+ x231 OBJ 9947.128906 c126 -17360
+ x231 c224 -17360
+ x232 OBJ 6260.652344 c127 -17360
+ x232 c225 -17360
+ x233 OBJ 10720.24219 c128 -17360
+ x233 c226 -17360
+ x234 OBJ 6747.246094 c129 -17360
+ x234 c227 -17360
+ x235 OBJ 9662.304688 c130 -17360
+ x235 c228 -17360
+ x236 OBJ 6081.386719 c131 -17360
+ x236 c229 -17360
+ x237 OBJ 16113.22656 c132 -17360
+ x237 c230 -17360
+ x238 OBJ 10141.55078 c133 -17360
+ x238 c231 -17360
+ x239 OBJ 15775.19141 c134 -17360
+ x239 c232 -17360
+ x240 OBJ 9928.796875 c135 -17360
+ x240 c233 -17360
+ x241 OBJ 14516.92578 c136 -17360
+ x241 c234 -17360
+ x242 OBJ 9136.851563 c137 -17360
+ x242 c235 -17360
+ x243 OBJ 12250.80859 c138 -17360
+ x243 c236 -17360
+ x244 OBJ 7710.574219 c139 -17360
+ x244 c237 -17360
+ x245 OBJ 5712.246094 c140 -17360
+ x245 c238 -17360
+ x246 OBJ 3595.249268 c141 -17360
+ x246 c239 -17360
+ x247 OBJ 10523.05078 c142 -17360
+ x247 c240 -17360
+ x248 OBJ 6623.136719 c143 -17360
+ x248 c241 -17360
+ x249 OBJ 18970.91797 c144 -17360
+ x249 c242 -17360
+ x250 OBJ 11940.16406 c145 -17360
+ x250 c243 -17360
+ x251 OBJ 11443.26953 c146 -17360
+ x251 c244 -17360
+ x252 OBJ 7202.3125 c147 -17360
+ x252 c245 -17360
+ x253 OBJ 19978.77344 c148 -17360
+ x253 c246 -17360
+ x254 OBJ 12574.50391 c149 -17360
+ x254 c247 -17360
+ x255 OBJ 11728.10156 c150 -17360
+ x255 c248 -17360
+ x256 OBJ 7381.585938 c151 -17360
+ x256 c249 -17360
+ x257 OBJ 17578.06641 c152 -17360
+ x257 c250 -17360
+ x258 OBJ 11063.51172 c153 -17360
+ x258 c251 -17360
+ x259 OBJ 12034.84375 c154 -17360
+ x259 c252 -17360
+ x260 OBJ 7574.648438 c155 -17360
+ x260 c253 -17360
+ x261 OBJ 13584.19141 c156 -17360
+ x261 c254 -17360
+ x262 OBJ 8549.796875 c157 -17360
+ x262 c255 -17360
+ x263 OBJ 9621.609375 c158 -17360
+ x263 c256 -17360
+ x264 OBJ 6055.773438 c159 -17360
+ x264 c257 -17360
+ x265 OBJ 9170.894531 c160 -17360
+ x265 c258 -17360
+ x266 OBJ 5772.097656 c161 -17360
+ x266 c259 -17360
+ x267 OBJ 20545.30859 c162 -17360
+ x267 c260 -17360
+ x268 OBJ 12931.07422 c163 -17360
+ x268 c261 -17360
+ x269 OBJ 12682.75 c164 -17360
+ x269 c262 -17360
+ x270 OBJ 7982.4375 c165 -17360
+ x270 c263 -17360
+ x271 OBJ 21283.98828 c166 -17360
+ x271 c264 -17360
+ x272 OBJ 13395.99609 c167 -17360
+ x272 c265 -17360
+ x273 OBJ 18438.81641 c168 -17360
+ x273 c266 -17360
+ x274 OBJ 11605.26172 c169 -17360
+ x274 c267 -17360
+ x275 OBJ 20263.60547 c170 -17360
+ x275 c268 -17360
+ x276 OBJ 12753.77344 c171 -17360
+ x276 c269 -17360
+ x277 OBJ 20019.46484 c172 -17360
+ x277 c270 -17360
+ x278 OBJ 12600.11328 c173 -17360
+ x278 c271 -17360
+ x279 OBJ 16695.41016 c174 -17360
+ x279 c272 -17360
+ x280 OBJ 10507.97266 c175 -17360
+ x280 c273 -17360
+ x281 OBJ 13277.45313 c176 -17360
+ x281 c274 -17360
+ x282 OBJ 8356.734375 c177 -17360
+ x282 c275 -17360
+ x283 OBJ 10178.75391 c178 -17360
+ x283 c276 -17360
+ x284 OBJ 6406.4375 c179 -17360
+ x284 c277 -17360
+ x285 OBJ 8397.777344 c180 -17360
+ x285 c278 -17360
+ x286 OBJ 5285.503906 c181 -17360
+ x286 c279 -17360
+ x287 OBJ 8069.128906 c182 -17360
+ x287 c280 -17360
+ x288 OBJ 5078.652344 c183 -17360
+ x288 c281 -17360
+ x289 OBJ 13947.26953 c184 -17360
+ x289 c282 -17360
+ x290 OBJ 8778.3125 c185 -17360
+ x290 c283 -17360
+ x291 OBJ 26498.5625 c186 -17360
+ x291 c284 -17360
+ x292 OBJ 16678.01172 c187 -17360
+ x292 c285 -17360
+ x293 OBJ 29340.60547 c188 -17360
+ x293 c286 -17360
+ x294 OBJ 18466.77344 c189 -17360
+ x294 c287 -17360
+ x295 OBJ 22088.39844 c190 -17360
+ x295 c288 -17360
+ x296 OBJ 13902.28516 c191 -17360
+ x296 c289 -17360
+ x297 OBJ 11139.66016 c192 -17360
+ x297 c290 -17360
+ x298 OBJ 7011.226563 c193 -17360
+ x298 c291 -17360
+ MARK0001 'MARKER' 'INTEND'
+ x299 OBJ 935.779785 c5 1
+ x299 c36 -1.197604
+ x300 OBJ 590.19458 c6 1
+ x300 c38 -1.197604
+ x301 OBJ 586.431152 c7 1
+ x301 c40 -1.197604
+ x302 OBJ 586.384521 c8 1
+ x302 c42 -1.197604
+ x303 OBJ 585.222412 c9 1
+ x303 c44 -1.197604
+ x304 OBJ 584.8667 c10 1
+ x304 c46 -1.197604
+ x305 OBJ 584.592285 c11 1
+ x305 c48 -1.197604
+ x306 OBJ 586.196533 c12 1
+ x306 c50 -1.197604
+ x307 OBJ 607.073486 c13 1
+ x307 c52 -1.197604
+ x308 OBJ 593.749756 c14 1
+ x308 c54 -1.197604
+ x309 OBJ 585.37793 c15 1
+ x309 c56 -1.197604
+ x310 OBJ 584.541016 c16 1
+ x310 c58 -1.197604
+ x311 OBJ 585.455078 c17 1
+ x311 c60 -1.197604
+ x312 OBJ 587.869385 c18 1
+ x312 c62 -1.197604
+ x313 OBJ 584.969482 c19 1
+ x313 c64 -1.197604
+ x314 OBJ 584.601318 c20 1
+ x314 c66 -1.197604
+ x315 OBJ 585.421143 c21 1
+ x315 c68 -1.197604
+ x316 OBJ 586.946777 c22 1
+ x316 c70 -1.197604
+ x317 OBJ 592.529541 c23 1
+ x317 c72 -1.197604
+ x318 OBJ 585.983643 c24 1
+ x318 c74 -1.197604
+ x319 OBJ 585.921387 c25 1
+ x319 c76 -1.197604
+ x320 OBJ 586.138184 c26 1
+ x320 c78 -1.197604
+ x321 OBJ 585.365967 c27 1
+ x321 c80 -1.197604
+ x322 OBJ 593.9563 c28 1
+ x322 c82 -1.197604
+ x323 OBJ 586.775391 c29 1
+ x323 c84 -1.197604
+ x324 OBJ 590.526367 c30 1
+ x324 c86 -1.197604
+ x325 OBJ 588.990479 c31 1
+ x325 c88 -1.197604
+ x326 OBJ 628.276367 c32 1
+ x326 c90 -1.197604
+ x327 OBJ 589.911133 c33 1
+ x327 c92 -1.197604
+ x328 OBJ 590.110107 c34 1
+ x328 c94 -1.197604
+ x329 OBJ 585.704346 c3 1.197604
+ x329 c35 1
+ x330 OBJ 994.519775 c5 1
+ x330 c37 -1.503759
+ x331 OBJ 764.129639 c6 1
+ x331 c39 -1.503759
+ x332 OBJ 761.62085 c7 1
+ x332 c41 -1.503759
+ x333 OBJ 761.5896 c8 1
+ x333 c43 -1.503759
+ x334 OBJ 760.814697 c9 1
+ x334 c45 -1.503759
+ x335 OBJ 760.577881 c10 1
+ x335 c47 -1.503759
+ x336 OBJ 760.394287 c11 1
+ x336 c49 -1.503759
+ x337 OBJ 761.463867 c12 1
+ x337 c51 -1.503759
+ x338 OBJ 775.38208 c13 1
+ x338 c53 -1.503759
+ x339 OBJ 766.499756 c14 1
+ x339 c55 -1.503759
+ x340 OBJ 760.918457 c15 1
+ x340 c57 -1.503759
+ x341 OBJ 760.360107 c16 1
+ x341 c59 -1.503759
+ x342 OBJ 760.969971 c17 1
+ x342 c61 -1.503759
+ x343 OBJ 762.579346 c18 1
+ x343 c63 -1.503759
+ x344 OBJ 760.64624 c19 1
+ x344 c65 -1.503759
+ x345 OBJ 760.4 c20 1
+ x345 c67 -1.503759
+ x346 OBJ 760.947021 c21 1
+ x346 c69 -1.503759
+ x347 OBJ 761.964355 c22 1
+ x347 c71 -1.503759
+ x348 OBJ 765.686279 c23 1
+ x348 c73 -1.503759
+ x349 OBJ 761.322021 c24 1
+ x349 c75 -1.503759
+ x350 OBJ 761.280518 c25 1
+ x350 c77 -1.503759
+ x351 OBJ 761.425293 c26 1
+ x351 c79 -1.503759
+ x352 OBJ 760.9104 c27 1
+ x352 c81 -1.503759
+ x353 OBJ 766.636475 c28 1
+ x353 c83 -1.503759
+ x354 OBJ 761.849609 c29 1
+ x354 c85 -1.503759
+ x355 OBJ 764.35083 c30 1
+ x355 c87 -1.503759
+ x356 OBJ 763.32666 c31 1
+ x356 c89 -1.503759
+ x357 OBJ 789.517578 c32 1
+ x357 c91 -1.503759
+ x358 OBJ 763.940186 c33 1
+ x358 c93 -1.503759
+ x359 OBJ 764.072754 c34 1
+ x359 c95 -1.503759
+ x360 OBJ 761.135986 c4 1.503759
+ x360 c35 1
+ x361 OBJ 40996 c5 1
+ x362 OBJ 40996 c6 1
+ x363 OBJ 40995.97266 c7 1
+ x364 OBJ 40995.97656 c8 1
+ x365 OBJ 40995.99609 c9 1
+ x366 OBJ 40995.99219 c10 1
+ x367 OBJ 40995.99609 c11 1
+ x368 OBJ 40995.99219 c12 1
+ x369 OBJ 40995.99609 c13 1
+ x370 OBJ 40995.99609 c14 1
+ x371 OBJ 40995.97266 c15 1
+ x372 OBJ 40995.99609 c16 1
+ x373 OBJ 40995.98438 c17 1
+ x374 OBJ 40995.99609 c18 1
+ x375 OBJ 40995.98828 c19 1
+ x376 OBJ 40995.99609 c20 1
+ x377 OBJ 40995.99219 c21 1
+ x378 OBJ 40995.99609 c22 1
+ x379 OBJ 40996 c23 1
+ x380 OBJ 40995.99609 c24 1
+ x381 OBJ 40995.97656 c25 1
+ x382 OBJ 40995.98438 c26 1
+ x383 OBJ 40995.98047 c27 1
+ x384 OBJ 40995.98828 c28 1
+ x385 OBJ 40995.98828 c29 1
+ x386 OBJ 40995.99219 c30 1
+ x387 OBJ 40995.98828 c31 1
+ x388 OBJ 40996 c32 1
+ x389 OBJ 40995.99609 c33 1
+ x390 OBJ 40995.99609 c34 1
+ x391 OBJ 40995.98047 c35 1
+ x392 OBJ 2184.375 c5 1
+ x393 OBJ 2184.375 c6 1
+ x394 OBJ 2184.375 c7 1
+ x395 OBJ 2184.374268 c8 1
+ x396 OBJ 2184.374512 c9 1
+ x397 OBJ 2184.375 c10 1
+ x398 OBJ 2184.374512 c11 1
+ x399 OBJ 2184.374512 c12 1
+ x400 OBJ 2184.374512 c13 1
+ x401 OBJ 2184.373779 c14 1
+ x402 OBJ 2184.374268 c15 1
+ x403 OBJ 2184.374268 c16 1
+ x404 OBJ 2184.374268 c17 1
+ x405 OBJ 2184.374512 c18 1
+ x406 OBJ 2184.374512 c19 1
+ x407 OBJ 2184.374512 c20 1
+ x408 OBJ 2184.374268 c21 1
+ x409 OBJ 2184.374512 c22 1
+ x410 OBJ 2184.375 c23 1
+ x411 OBJ 2184.374268 c24 1
+ x412 OBJ 2184.374512 c25 1
+ x413 OBJ 2184.374512 c26 1
+ x414 OBJ 2184.374512 c27 1
+ x415 OBJ 2184.374268 c28 1
+ x416 OBJ 2184.374512 c29 1
+ x417 OBJ 2184.374512 c30 1
+ x418 OBJ 2184.374512 c31 1
+ x419 OBJ 2184.375 c32 1
+ x420 OBJ 2184.374512 c33 1
+ x421 OBJ 2184.374512 c34 1
+ x422 OBJ 2184.374268 c35 1
+RHS
+ rhs c5 1.5 c6 69
+ rhs c7 520.5 c8 495.299805
+ rhs c9 754.099854 c10 1198.5
+ rhs c11 2188.799805 c12 594.4
+ rhs c13 51.4 c14 75.6
+ rhs c15 563.099854 c16 1533.099854
+ rhs c17 556.299805 c18 167.8
+ rhs c19 975.799805 c20 1642.9
+ rhs c21 347.099854 c22 262.799805
+ rhs c23 62 c24 395.9
+ rhs c25 691.7 c26 936.7
+ rhs c27 791.099854 c28 106.7
+ rhs c29 393.7 c30 173.7
+ rhs c31 466.2 c32 34
+ rhs c33 116.9 c34 103.4
+ rhs c35 552.099854
+BOUNDS
+ UP bnd x201 1
+ UP bnd x202 1
+ UP bnd x203 1
+ UP bnd x204 1
+ UP bnd x205 1
+ UP bnd x206 1
+ UP bnd x207 1
+ UP bnd x208 1
+ UP bnd x209 1
+ UP bnd x210 1
+ UP bnd x211 1
+ UP bnd x212 1
+ UP bnd x213 1
+ UP bnd x214 1
+ UP bnd x215 1
+ UP bnd x216 1
+ UP bnd x217 1
+ UP bnd x218 1
+ UP bnd x219 1
+ UP bnd x220 1
+ UP bnd x221 1
+ UP bnd x222 1
+ UP bnd x223 1
+ UP bnd x224 1
+ UP bnd x225 1
+ UP bnd x226 1
+ UP bnd x227 1
+ UP bnd x228 1
+ UP bnd x229 1
+ UP bnd x230 1
+ UP bnd x231 1
+ UP bnd x232 1
+ UP bnd x233 1
+ UP bnd x234 1
+ UP bnd x235 1
+ UP bnd x236 1
+ UP bnd x237 1
+ UP bnd x238 1
+ UP bnd x239 1
+ UP bnd x240 1
+ UP bnd x241 1
+ UP bnd x242 1
+ UP bnd x243 1
+ UP bnd x244 1
+ UP bnd x245 1
+ UP bnd x246 1
+ UP bnd x247 1
+ UP bnd x248 1
+ UP bnd x249 1
+ UP bnd x250 1
+ UP bnd x251 1
+ UP bnd x252 1
+ UP bnd x253 1
+ UP bnd x254 1
+ UP bnd x255 1
+ UP bnd x256 1
+ UP bnd x257 1
+ UP bnd x258 1
+ UP bnd x259 1
+ UP bnd x260 1
+ UP bnd x261 1
+ UP bnd x262 1
+ UP bnd x263 1
+ UP bnd x264 1
+ UP bnd x265 1
+ UP bnd x266 1
+ UP bnd x267 1
+ UP bnd x268 1
+ UP bnd x269 1
+ UP bnd x270 1
+ UP bnd x271 1
+ UP bnd x272 1
+ UP bnd x273 1
+ UP bnd x274 1
+ UP bnd x275 1
+ UP bnd x276 1
+ UP bnd x277 1
+ UP bnd x278 1
+ UP bnd x279 1
+ UP bnd x280 1
+ UP bnd x281 1
+ UP bnd x282 1
+ UP bnd x283 1
+ UP bnd x284 1
+ UP bnd x285 1
+ UP bnd x286 1
+ UP bnd x287 1
+ UP bnd x288 1
+ UP bnd x289 1
+ UP bnd x290 1
+ UP bnd x291 1
+ UP bnd x292 1
+ UP bnd x293 1
+ UP bnd x294 1
+ UP bnd x295 1
+ UP bnd x296 1
+ UP bnd x297 1
+ UP bnd x298 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/noswot.mps b/demos/ppl_lpsol/examples/noswot.mps
new file mode 100644
index 0000000..bf3f987
--- /dev/null
+++ b/demos/ppl_lpsol/examples/noswot.mps
@@ -0,0 +1,729 @@
+NAME noswot
+ROWS
+ N 1
+ L c1
+ L c2
+ L c3
+ L c4
+ L c5
+ L c6
+ G c7
+ L c8
+ G c9
+ L c10
+ G c11
+ L c12
+ G c13
+ L c14
+ G c15
+ L c16
+ G c17
+ G c18
+ G c19
+ G c20
+ G c21
+ G c22
+ G c23
+ G c24
+ G c25
+ G c26
+ G c27
+ G c28
+ G c29
+ G c30
+ G c31
+ G c32
+ G c33
+ G c34
+ G c35
+ G c36
+ G c37
+ G c38
+ G c39
+ G c40
+ G c41
+ G c42
+ G c43
+ G c44
+ G c45
+ G c46
+ G c47
+ G c48
+ G c49
+ G c50
+ G c51
+ G c52
+ G c53
+ G c54
+ G c55
+ G c56
+ L c57
+ L c58
+ L c59
+ L c60
+ L c61
+ L c62
+ G c63
+ L c64
+ G c65
+ L c66
+ G c67
+ L c68
+ G c69
+ L c70
+ G c71
+ L c72
+ G c73
+ G c74
+ G c75
+ G c76
+ G c77
+ G c78
+ G c79
+ G c80
+ G c81
+ G c82
+ G c83
+ G c84
+ G c85
+ G c86
+ G c87
+ G c88
+ G c89
+ G c90
+ G c91
+ G c92
+ G c93
+ G c94
+ G c95
+ G c96
+ G c97
+ G c98
+ G c99
+ G c100
+ G c101
+ G c102
+ G c103
+ L c104
+ L c105
+ L c106
+ L c107
+ L c108
+ L c109
+ G c110
+ L c111
+ G c112
+ L c113
+ G c114
+ L c115
+ G c116
+ L c117
+ G c118
+ L c119
+ G c120
+ G c121
+ G c122
+ G c123
+ G c124
+ G c125
+ G c126
+ G c127
+ G c128
+ G c129
+ G c130
+ G c131
+ G c132
+ G c133
+ G c134
+ G c135
+ G c136
+ G c137
+ G c138
+ G c139
+ L c140
+ L c141
+ L c142
+ L c143
+ L c144
+ L c145
+ G c146
+ E c147
+ G c148
+ E c149
+ G c150
+ L c151
+ G c152
+ L c153
+ G c154
+ L c155
+ G c156
+ G c157
+ G c158
+ G c159
+ G c160
+ G c161
+ G c162
+ G c163
+ G c164
+ G c165
+ L c166
+ L c167
+ L c168
+ L c169
+ L c170
+ L c171
+ G c172
+ L c173
+ G c174
+ L c175
+ G c176
+ L c177
+ G c178
+ L c179
+ G c180
+ L c181
+ L c182
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ x1 c17 21 c18 -21
+ x2 c19 21 c20 -21
+ x3 c21 21 c22 -21
+ x4 c23 21 c24 -21
+ x5 c25 21 c26 -21
+ x6 c27 21 c28 -21
+ x7 c29 21 c30 -21
+ x8 c31 21 c32 -21
+ x9 c33 21 c34 -21
+ x10 c35 21 c36 -21
+ x11 c37 21 c38 -21
+ x12 c39 21 c40 -21
+ x13 c41 21 c42 -21
+ x14 c43 21 c44 -21
+ x15 c45 21 c46 -21
+ x16 c47 21 c48 -21
+ x17 c49 21 c50 -21
+ x18 c51 21 c52 -21
+ x19 c53 21 c54 -21
+ x20 c55 21 c56 -21
+ x21 c73 21 c74 -21
+ x22 c75 21 c76 -21
+ x23 c77 21 c78 -21
+ x24 c79 21 c80 -21
+ x25 c81 21 c82 -21
+ x26 c83 21 c84 -21
+ x27 c85 21 c86 -21
+ x28 c87 21 c88 -21
+ x29 c89 21 c90 -21
+ x30 c91 21 c92 -21
+ x31 c93 21 c94 -21
+ x32 c95 21 c96 -21
+ x33 c97 21 c98 -21
+ x34 c99 21 c100 -21
+ x35 c101 21 c102 -21
+ x36 c120 21 c121 -21
+ x37 c122 21 c123 -21
+ x38 c124 21 c125 -21
+ x39 c126 21 c127 -21
+ x40 c128 21 c129 -21
+ x41 c130 21 c131 -21
+ x42 c132 21 c133 -21
+ x43 c134 21 c135 -21
+ x44 c136 21 c137 -21
+ x45 c138 21 c139 -21
+ x46 c156 21 c157 -21
+ x47 c158 21 c159 -21
+ x48 c160 21 c161 -21
+ x49 c162 21 c163 -21
+ x50 c164 21 c165 -21
+ x51 c2 -20 c7 -1
+ x51 c8 -9.6000004 c18 -0.75
+ x51 c28 -0.66670000 c38 -0.25
+ x51 c48 -0.25
+ x52 1 -1 c1 1
+ x52 c2 2.0833001 c7 1
+ x52 c8 1 c18 -2.0833001
+ x52 c28 -2.0833001 c38 -2.0833001
+ x52 c48 -2.0833001 c57 1
+ x53 c3 -20 c9 -1
+ x53 c10 -9.6000004 c20 -0.75
+ x53 c30 -0.66670000 c40 -0.25
+ x53 c50 -0.25
+ x54 1 -1 c1 1
+ x54 c3 2.0833001 c9 1
+ x54 c10 1 c20 -2.0833001
+ x54 c30 -2.0833001 c40 -2.0833001
+ x54 c50 -2.0833001 c57 1
+ x55 c4 -20 c11 -1
+ x55 c12 -9.6000004 c22 -0.75
+ x55 c32 -0.66670000 c42 -0.25
+ x55 c52 -0.25
+ x56 1 -1 c1 1
+ x56 c4 2.0833001 c11 1
+ x56 c12 1 c22 -2.0833001
+ x56 c32 -2.0833001 c42 -2.0833001
+ x56 c52 -2.0833001 c57 1
+ x57 c5 -20 c13 -1
+ x57 c14 -9.6000004 c24 -0.75
+ x57 c34 -0.66670000 c44 -0.25
+ x57 c54 -0.25
+ x58 1 -1 c1 1
+ x58 c5 2.0833001 c13 1
+ x58 c14 1 c24 -2.0833001
+ x58 c34 -2.0833001 c44 -2.0833001
+ x58 c54 -2.0833001 c57 1
+ x59 c6 -16 c15 -1
+ x59 c16 -7.6799998 c26 -0.75
+ x59 c36 -0.66670000 c46 -0.25
+ x59 c56 -0.25
+ x60 1 -1 c1 1
+ x60 c6 2.0833001 c15 1
+ x60 c16 1 c26 -2.0833001
+ x60 c36 -2.0833001 c46 -2.0833001
+ x60 c56 -2.0833001 c57 1
+ x61 c17 -0.66670000 c58 -20
+ x61 c63 -1 c64 -6.7199998
+ x61 c74 -0.66670000 c84 -0.66670000
+ x61 c94 -0.66670000
+ x62 1 -1 c1 1
+ x62 c17 -2.9762001 c58 2.9762001
+ x62 c63 1 c64 1
+ x62 c74 -2.9762001 c84 -2.9762001
+ x62 c94 -2.9762001 c103 1
+ x62 c104 1
+ x63 c19 -0.66670000 c59 -20
+ x63 c65 -1 c66 -6.7199998
+ x63 c76 -0.66670000 c86 -0.66670000
+ x63 c96 -0.66670000
+ x64 1 -1 c1 1
+ x64 c19 -2.9762001 c59 2.9762001
+ x64 c65 1 c66 1
+ x64 c76 -2.9762001 c86 -2.9762001
+ x64 c96 -2.9762001 c103 1
+ x64 c104 1
+ x65 c21 -0.66670000 c60 -20
+ x65 c67 -1 c68 -6.7199998
+ x65 c78 -0.66670000 c88 -0.66670000
+ x65 c98 -0.66670000
+ x66 1 -1 c1 1
+ x66 c21 -2.9762001 c60 2.9762001
+ x66 c67 1 c68 1
+ x66 c78 -2.9762001 c88 -2.9762001
+ x66 c98 -2.9762001 c103 1
+ x66 c104 1
+ x67 c23 -0.66670000 c61 -20
+ x67 c69 -1 c70 -6.7199998
+ x67 c80 -0.66670000 c90 -0.66670000
+ x67 c100 -0.66670000
+ x68 1 -1 c1 1
+ x68 c23 -2.9762001 c61 2.9762001
+ x68 c69 1 c70 1
+ x68 c80 -2.9762001 c90 -2.9762001
+ x68 c100 -2.9762001 c103 1
+ x68 c104 1
+ x69 c25 -0.66670000 c62 -16
+ x69 c71 -1 c72 -5.3759999
+ x69 c82 -0.66670000 c92 -0.66670000
+ x69 c102 -0.66670000
+ x70 1 -1 c1 1
+ x70 c25 -2.9762001 c62 2.9762001
+ x70 c71 1 c72 1
+ x70 c82 -2.9762001 c92 -2.9762001
+ x70 c102 -2.9762001 c103 1
+ x70 c104 1
+ x71 c27 -0.66670000 c73 -0.75
+ x71 c105 -20 c110 -1
+ x71 c111 -5.7600002 c121 -0.66670000
+ x71 c131 -0.66670000
+ x72 1 -1 c1 1
+ x72 c27 -3.4721999 c73 -3.4721999
+ x72 c105 3.4721999 c110 1
+ x72 c111 1 c121 -3.4721999
+ x72 c131 -3.4721999 c140 1
+ x73 c29 -0.66670000 c75 -0.75
+ x73 c106 -20 c112 -1
+ x73 c113 -5.7600002 c123 -0.66670000
+ x73 c133 -0.66670000
+ x74 1 -1 c1 1
+ x74 c29 -3.4721999 c75 -3.4721999
+ x74 c106 3.4721999 c112 1
+ x74 c113 1 c123 -3.4721999
+ x74 c133 -3.4721999 c140 1
+ x75 c31 -0.66670000 c77 -0.75
+ x75 c107 -20 c114 -1
+ x75 c115 -5.7600002 c125 -0.66670000
+ x75 c135 -0.66670000
+ x76 1 -1 c1 1
+ x76 c31 -3.4721999 c77 -3.4721999
+ x76 c107 3.4721999 c114 1
+ x76 c115 1 c125 -3.4721999
+ x76 c135 -3.4721999 c140 1
+ x77 c33 -0.66670000 c79 -0.75
+ x77 c108 -20 c116 -1
+ x77 c117 -5.7600002 c127 -0.66670000
+ x77 c137 -0.66670000
+ x78 1 -1 c1 1
+ x78 c33 -3.4721999 c79 -3.4721999
+ x78 c108 3.4721999 c116 1
+ x78 c117 1 c127 -3.4721999
+ x78 c137 -3.4721999 c140 1
+ x79 c35 -0.66670000 c81 -0.75
+ x79 c109 -16 c118 -1
+ x79 c119 -4.6079998 c129 -0.66670000
+ x79 c139 -0.66670000
+ x80 1 -1 c1 1
+ x80 c35 -3.4721999 c81 -3.4721999
+ x80 c109 3.4721999 c118 1
+ x80 c119 1 c129 -3.4721999
+ x80 c139 -3.4721999 c140 1
+ x81 c37 -0.25 c83 -0.75
+ x81 c120 -0.66670000 c141 -20
+ x81 c146 -1 c147 -8.9280005
+ x81 c157 -0.25
+ x82 1 -1 c1 1
+ x82 c37 -2.2400999 c83 -2.2400999
+ x82 c120 -2.2400999 c141 2.2400999
+ x82 c146 1 c147 1
+ x82 c157 -2.2400999 c166 1
+ x83 c39 -0.25 c85 -0.75
+ x83 c122 -0.66670000 c142 -20
+ x83 c148 -1 c149 -8.9280005
+ x83 c159 -0.25
+ x84 1 -1 c1 1
+ x84 c39 -2.2400999 c85 -2.2400999
+ x84 c122 -2.2400999 c142 2.2400999
+ x84 c148 1 c149 1
+ x84 c159 -2.2400999 c166 1
+ x85 c41 -0.25 c87 -0.75
+ x85 c124 -0.66670000 c143 -20
+ x85 c150 -1 c151 -8.9280005
+ x85 c161 -0.25
+ x86 1 -1 c1 1
+ x86 c41 -2.2400999 c87 -2.2400999
+ x86 c124 -2.2400999 c143 2.2400999
+ x86 c150 1 c151 1
+ x86 c161 -2.2400999 c166 1
+ x87 c43 -0.25 c89 -0.75
+ x87 c126 -0.66670000 c144 -20
+ x87 c152 -1 c153 -8.9280005
+ x87 c163 -0.25
+ x88 1 -1 c1 1
+ x88 c43 -2.2400999 c89 -2.2400999
+ x88 c126 -2.2400999 c144 2.2400999
+ x88 c152 1 c153 1
+ x88 c163 -2.2400999 c166 1
+ x89 c45 -0.25 c91 -0.75
+ x89 c128 -0.66670000 c145 -16
+ x89 c154 -1 c155 -7.1423998
+ x89 c165 -0.25
+ x90 1 -1 c1 1
+ x90 c45 -2.2400999 c91 -2.2400999
+ x90 c128 -2.2400999 c145 2.2400999
+ x90 c154 1 c155 1
+ x90 c165 -2.2400999 c166 1
+ x91 c47 -0.66670000 c93 -0.75
+ x91 c130 -0.66670000 c156 -0.66670000
+ x91 c167 -20 c172 -1
+ x91 c173 -9.6000004
+ x92 1 -1 c1 1
+ x92 c47 -2.0833001 c93 -2.0833001
+ x92 c130 -2.0833001 c156 -2.0833001
+ x92 c167 2.0833001 c172 1
+ x92 c173 1 c182 1
+ x93 c49 -0.66670000 c95 -0.75
+ x93 c132 -0.66670000 c158 -0.66670000
+ x93 c168 -20 c174 -1
+ x93 c175 -9.6000004
+ x94 1 -1 c1 1
+ x94 c49 -2.0833001 c95 -2.0833001
+ x94 c132 -2.0833001 c158 -2.0833001
+ x94 c168 2.0833001 c174 1
+ x94 c175 1 c182 1
+ x95 c51 -0.66670000 c97 -0.75
+ x95 c134 -0.66670000 c160 -0.66670000
+ x95 c169 -20 c176 -1
+ x95 c177 -9.6000004
+ x96 1 -1 c1 1
+ x96 c51 -2.0833001 c97 -2.0833001
+ x96 c134 -2.0833001 c160 -2.0833001
+ x96 c169 2.0833001 c176 1
+ x96 c177 1 c182 1
+ x97 c53 -0.66670000 c99 -0.75
+ x97 c136 -0.66670000 c162 -0.66670000
+ x97 c170 -20 c178 -1
+ x97 c179 -9.6000004
+ x98 1 -1 c1 1
+ x98 c53 -2.0833001 c99 -2.0833001
+ x98 c136 -2.0833001 c162 -2.0833001
+ x98 c170 2.0833001 c178 1
+ x98 c179 1 c182 1
+ x99 c55 -0.66670000 c101 -0.75
+ x99 c138 -0.66670000 c164 -0.66670000
+ x99 c171 -16 c180 -1
+ x99 c181 -7.6799998
+ x100 1 -1 c1 1
+ x100 c55 -2.0833001 c101 -2.0833001
+ x100 c138 -2.0833001 c164 -2.0833001
+ x100 c171 2.0833001 c180 1
+ x100 c181 1 c182 1
+ MARK0001 'MARKER' 'INTEND'
+ x101 c2 1 c17 1
+ x101 c18 -1 c27 1
+ x101 c28 -1 c37 1
+ x101 c38 -1 c47 1
+ x101 c48 -1
+ x102 c3 1 c19 1
+ x102 c20 -1 c29 1
+ x102 c30 -1 c39 1
+ x102 c40 -1 c49 1
+ x102 c50 -1
+ x103 c4 1 c21 1
+ x103 c22 -1 c31 1
+ x103 c32 -1 c41 1
+ x103 c42 -1 c51 1
+ x103 c52 -1
+ x104 c5 1 c23 1
+ x104 c24 -1 c33 1
+ x104 c34 -1 c43 1
+ x104 c44 -1 c53 1
+ x104 c54 -1
+ x105 c6 1 c25 1
+ x105 c26 -1 c35 1
+ x105 c36 -1 c45 1
+ x105 c46 -1 c55 1
+ x105 c56 -1
+ x106 c17 -1 c18 1
+ x106 c58 1 c73 1
+ x106 c74 -1 c83 1
+ x106 c84 -1 c93 1
+ x106 c94 -1
+ x107 c19 -1 c20 1
+ x107 c59 1 c75 1
+ x107 c76 -1 c85 1
+ x107 c86 -1 c95 1
+ x107 c96 -1
+ x108 c21 -1 c22 1
+ x108 c60 1 c77 1
+ x108 c78 -1 c87 1
+ x108 c88 -1 c97 1
+ x108 c98 -1
+ x109 c23 -1 c24 1
+ x109 c61 1 c79 1
+ x109 c80 -1 c89 1
+ x109 c90 -1 c99 1
+ x109 c100 -1
+ x110 c25 -1 c26 1
+ x110 c62 1 c81 1
+ x110 c82 -1 c91 1
+ x110 c92 -1 c101 1
+ x110 c102 -1
+ x111 c27 -1 c28 1
+ x111 c73 -1 c74 1
+ x111 c105 1 c120 1
+ x111 c121 -1 c130 1
+ x111 c131 -1
+ x112 c29 -1 c30 1
+ x112 c75 -1 c76 1
+ x112 c106 1 c122 1
+ x112 c123 -1 c132 1
+ x112 c133 -1
+ x113 c31 -1 c32 1
+ x113 c77 -1 c78 1
+ x113 c107 1 c124 1
+ x113 c125 -1 c134 1
+ x113 c135 -1
+ x114 c33 -1 c34 1
+ x114 c79 -1 c80 1
+ x114 c108 1 c126 1
+ x114 c127 -1 c136 1
+ x114 c137 -1
+ x115 c35 -1 c36 1
+ x115 c81 -1 c82 1
+ x115 c109 1 c128 1
+ x115 c129 -1 c138 1
+ x115 c139 -1
+ x116 c37 -1 c38 1
+ x116 c83 -1 c84 1
+ x116 c120 -1 c121 1
+ x116 c141 1 c156 1
+ x116 c157 -1
+ x117 c39 -1 c40 1
+ x117 c85 -1 c86 1
+ x117 c122 -1 c123 1
+ x117 c142 1 c158 1
+ x117 c159 -1
+ x118 c41 -1 c42 1
+ x118 c87 -1 c88 1
+ x118 c124 -1 c125 1
+ x118 c143 1 c160 1
+ x118 c161 -1
+ x119 c43 -1 c44 1
+ x119 c89 -1 c90 1
+ x119 c126 -1 c127 1
+ x119 c144 1 c162 1
+ x119 c163 -1
+ x120 c45 -1 c46 1
+ x120 c91 -1 c92 1
+ x120 c128 -1 c129 1
+ x120 c145 1 c164 1
+ x120 c165 -1
+ x121 c47 -1 c48 1
+ x121 c93 -1 c94 1
+ x121 c130 -1 c131 1
+ x121 c156 -1 c157 1
+ x121 c167 1
+ x122 c49 -1 c50 1
+ x122 c95 -1 c96 1
+ x122 c132 -1 c133 1
+ x122 c158 -1 c159 1
+ x122 c168 1
+ x123 c51 -1 c52 1
+ x123 c97 -1 c98 1
+ x123 c134 -1 c135 1
+ x123 c160 -1 c161 1
+ x123 c169 1
+ x124 c53 -1 c54 1
+ x124 c99 -1 c100 1
+ x124 c136 -1 c137 1
+ x124 c162 -1 c163 1
+ x124 c170 1
+ x125 c55 -1 c56 1
+ x125 c101 -1 c102 1
+ x125 c138 -1 c139 1
+ x125 c164 -1 c165 1
+ x125 c171 1
+ x126 c149 1
+ x127 c147 1
+ x128 c151 2 c153 3
+ x128 c155 4
+RHS
+ rhs c1 43 c18 -21
+ rhs c20 -21 c22 -21
+ rhs c24 -21 c26 -21
+ rhs c28 -21 c30 -21
+ rhs c32 -21 c34 -21
+ rhs c36 -21 c38 -21
+ rhs c40 -21 c42 -21
+ rhs c44 -21 c46 -21
+ rhs c48 -21 c50 -21
+ rhs c52 -21 c54 -21
+ rhs c56 -21 c57 38
+ rhs c74 -21 c76 -21
+ rhs c78 -21 c80 -21
+ rhs c82 -21 c84 -21
+ rhs c86 -21 c88 -21
+ rhs c90 -21 c92 -21
+ rhs c94 -21 c96 -21
+ rhs c98 -21 c100 -21
+ rhs c102 -21 c103 5
+ rhs c104 9 c121 -21
+ rhs c123 -21 c125 -21
+ rhs c127 -21 c129 -21
+ rhs c131 -21 c133 -21
+ rhs c135 -21 c137 -21
+ rhs c139 -21 c140 2
+ rhs c157 -21 c159 -21
+ rhs c161 -21 c163 -21
+ rhs c165 -21 c166 1
+ rhs c182 2
+BOUNDS
+ UP bnd x1 1
+ UP bnd x2 1
+ UP bnd x3 1
+ UP bnd x4 1
+ UP bnd x5 1
+ UP bnd x6 1
+ UP bnd x7 1
+ UP bnd x8 1
+ UP bnd x9 1
+ UP bnd x10 1
+ UP bnd x11 1
+ UP bnd x12 1
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 100000
+ UP bnd x53 1
+ UP bnd x54 100000
+ UP bnd x55 1
+ UP bnd x56 100000
+ UP bnd x57 1
+ UP bnd x58 100000
+ UP bnd x59 1
+ UP bnd x60 100000
+ UP bnd x61 1
+ UP bnd x62 100000
+ UP bnd x63 1
+ UP bnd x64 100000
+ UP bnd x65 1
+ UP bnd x66 100000
+ UP bnd x67 1
+ UP bnd x68 100000
+ UP bnd x69 1
+ UP bnd x70 100000
+ UP bnd x71 1
+ UP bnd x72 100000
+ UP bnd x73 1
+ UP bnd x74 100000
+ UP bnd x75 1
+ UP bnd x76 100000
+ UP bnd x77 1
+ UP bnd x78 100000
+ UP bnd x79 1
+ UP bnd x80 100000
+ UP bnd x81 1
+ UP bnd x82 100000
+ UP bnd x83 1
+ UP bnd x84 100000
+ UP bnd x85 1
+ UP bnd x86 100000
+ UP bnd x87 1
+ UP bnd x88 100000
+ UP bnd x89 1
+ UP bnd x90 100000
+ UP bnd x91 1
+ UP bnd x92 100000
+ UP bnd x93 1
+ UP bnd x94 100000
+ UP bnd x95 1
+ UP bnd x96 100000
+ UP bnd x97 1
+ UP bnd x98 100000
+ UP bnd x99 1
+ UP bnd x100 100000
+ENDATA
diff --git a/demos/ppl_lpsol/examples/opt1217.mps b/demos/ppl_lpsol/examples/opt1217.mps
new file mode 100644
index 0000000..afc134c
--- /dev/null
+++ b/demos/ppl_lpsol/examples/opt1217.mps
@@ -0,0 +1,1643 @@
+NAME opt1217
+ROWS
+ N MINIMIZE
+ G c1
+ G c2
+ G c3
+ G c4
+ G c5
+ G c6
+ G c7
+ G c8
+ G c9
+ G c10
+ G c11
+ G c12
+ G c13
+ G c14
+ G c15
+ G c16
+ E c17
+ E c18
+ E c19
+ E c20
+ E c21
+ E c22
+ E c23
+ E c24
+ E c25
+ E c26
+ E c27
+ E c28
+ E c29
+ E c30
+ E c31
+ E c32
+ E c33
+ E c34
+ E c35
+ E c36
+ E c37
+ E c38
+ E c39
+ E c40
+ E c41
+ E c42
+ E c43
+ E c44
+ E c45
+ E c46
+ E c47
+ E c48
+ E c49
+ E c50
+ E c51
+ E c52
+ E c53
+ E c54
+ E c55
+ E c56
+ E c57
+ E c58
+ E c59
+ E c60
+ E c61
+ E c62
+ E c63
+ E c64
+COLUMNS
+ x1 MINIMIZE -1 c1 -1
+ x1 c2 -1 c3 -1
+ x1 c4 -1 c5 -1
+ x1 c6 -1 c7 -1
+ x1 c8 -1 c9 -1
+ x1 c10 -1 c11 -1
+ x1 c12 -1 c13 -1
+ x1 c14 -1 c15 -1
+ x1 c16 -1
+ MARK0000 'MARKER' 'INTORG'
+ x2 c1 4 c17 1
+ x3 c1 4 c18 1
+ x4 c1 4 c19 1
+ x5 c1 4 c20 1
+ x6 c1 4 c21 1
+ x7 c1 4 c22 1
+ x8 c1 4 c23 1
+ x9 c1 2 c24 1
+ x10 c1 2 c25 1
+ x11 c1 2 c26 1
+ x12 c1 2 c27 1
+ x13 c1 2 c28 1
+ x14 c1 2 c29 1
+ x15 c1 2 c30 1
+ x16 c1 2 c31 1
+ x17 c1 1 c32 1
+ x18 c1 1 c34 1
+ x19 c1 2 c35 1
+ x20 c1 2 c36 1
+ x21 c1 2 c37 1
+ x22 c1 2 c38 1
+ x23 c1 2 c39 1
+ x24 c1 2 c40 1
+ x25 c1 4 c41 1
+ x26 c1 4 c42 1
+ x27 c1 4 c43 1
+ x28 c1 4 c44 1
+ x29 c1 4 c45 1
+ x30 c1 2 c46 1
+ x31 c1 2 c47 1
+ x32 c1 2 c48 1
+ x33 c1 4 c49 1
+ x34 c1 4 c50 1
+ x35 c1 6 c51 1
+ x36 c1 6 c52 1
+ x37 c1 6 c53 1
+ x38 c1 6 c54 1
+ x39 c1 8 c55 1
+ x40 c1 6 c56 1
+ x41 c1 6 c57 1
+ x42 c1 6 c58 1
+ x43 c1 6 c59 1
+ x44 c1 4 c60 1
+ x45 c1 4 c61 1
+ x46 c1 4 c62 1
+ x47 c1 4 c63 1
+ x48 c1 4 c64 1
+ x49 c2 2 c17 1
+ x50 c2 2 c18 1
+ x51 c2 2 c19 1
+ x52 c2 4 c20 1
+ x53 c2 4 c21 1
+ x54 c2 4 c22 1
+ x55 c2 4 c23 1
+ x56 c2 4 c24 1
+ x57 c2 2 c25 1
+ x58 c2 4 c26 1
+ x59 c2 4 c27 1
+ x60 c2 4 c28 1
+ x61 c2 2 c29 1
+ x62 c2 2 c30 1
+ x63 c2 4 c31 1
+ x64 c2 6 c32 1
+ x65 c2 6 c33 1
+ x66 c2 4 c34 1
+ x67 c2 4 c35 1
+ x68 c2 4 c36 1
+ x69 c2 4 c37 1
+ x70 c2 4 c38 1
+ x71 c2 2 c39 1
+ x72 c2 1 c40 1
+ x73 c2 2 c41 1
+ x74 c2 4 c42 1
+ x75 c2 2 c43 1
+ x76 c2 2 c44 1
+ x77 c2 4 c45 1
+ x78 c2 4 c46 1
+ x79 c2 4 c47 1
+ x80 c2 2 c48 1
+ x81 c2 2 c49 1
+ x82 c2 4 c50 1
+ x83 c2 4 c51 1
+ x84 c2 4 c52 1
+ x85 c2 4 c53 1
+ x86 c2 4 c54 1
+ x87 c2 4 c55 1
+ x88 c2 4 c56 1
+ x89 c2 4 c57 1
+ x90 c2 4 c58 1
+ x91 c2 4 c59 1
+ x92 c2 2 c60 1
+ x93 c2 2 c61 1
+ x94 c2 4 c62 1
+ x95 c2 4 c63 1
+ x96 c2 4 c64 1
+ x97 c3 2 c17 1
+ x98 c3 4 c18 1
+ x99 c3 4 c19 1
+ x100 c3 4 c20 1
+ x101 c3 6 c21 1
+ x102 c3 6 c22 1
+ x103 c3 6 c23 1
+ x104 c3 6 c24 1
+ x105 c3 6 c25 1
+ x106 c3 6 c26 1
+ x107 c3 6 c27 1
+ x108 c3 4 c28 1
+ x109 c3 4 c29 1
+ x110 c3 4 c30 1
+ x111 c3 4 c31 1
+ x112 c3 4 c32 1
+ x113 c3 4 c33 1
+ x114 c3 4 c34 1
+ x115 c3 4 c35 1
+ x116 c3 2 c36 1
+ x117 c3 2 c37 1
+ x118 c3 1 c38 1
+ x119 c3 1 c40 1
+ x120 c3 2 c41 1
+ x121 c3 4 c42 1
+ x122 c3 4 c43 1
+ x123 c3 6 c44 1
+ x124 c3 6 c45 1
+ x125 c3 6 c46 1
+ x126 c3 4 c47 1
+ x127 c3 4 c48 1
+ x128 c3 2 c49 1
+ x129 c3 2 c50 1
+ x130 c3 2 c51 1
+ x131 c3 4 c52 1
+ x132 c3 4 c53 1
+ x133 c3 2 c54 1
+ x134 c3 2 c55 1
+ x135 c3 4 c56 1
+ x136 c3 4 c57 1
+ x137 c3 4 c58 1
+ x138 c3 4 c59 1
+ x139 c3 1 c60 1
+ x140 c3 2 c61 1
+ x141 c3 4 c62 1
+ x142 c3 6 c63 1
+ x143 c3 6 c64 1
+ x144 c4 4 c17 1
+ x145 c4 4 c18 1
+ x146 c4 4 c19 1
+ x147 c4 4 c20 1
+ x148 c4 4 c21 1
+ x149 c4 2 c22 1
+ x150 c4 1 c23 1
+ x151 c4 2 c24 1
+ x152 c4 4 c25 1
+ x153 c4 4 c26 1
+ x154 c4 4 c27 1
+ x155 c4 4 c28 1
+ x156 c4 4 c29 1
+ x157 c4 6 c30 1
+ x158 c4 6 c31 1
+ x159 c4 6 c32 1
+ x160 c4 6 c33 1
+ x161 c4 6 c34 1
+ x162 c4 6 c35 1
+ x163 c4 6 c36 1
+ x164 c4 6 c37 1
+ x165 c4 6 c38 1
+ x166 c4 4 c39 1
+ x167 c4 4 c40 1
+ x168 c4 4 c41 1
+ x169 c4 4 c42 1
+ x170 c4 6 c43 1
+ x171 c4 4 c44 1
+ x172 c4 4 c45 1
+ x173 c4 4 c46 1
+ x174 c4 2 c47 1
+ x175 c4 2 c48 1
+ x176 c4 4 c49 1
+ x177 c4 6 c50 1
+ x178 c4 6 c51 1
+ x179 c4 6 c52 1
+ x180 c4 6 c53 1
+ x181 c4 6 c54 1
+ x182 c4 4 c55 1
+ x183 c4 4 c56 1
+ x184 c4 6 c57 1
+ x185 c4 6 c58 1
+ x186 c4 6 c59 1
+ x187 c4 6 c60 1
+ x188 c4 4 c61 1
+ x189 c4 2 c62 1
+ x190 c4 2 c63 1
+ x191 c4 2 c64 1
+ x192 c5 6 c17 1
+ x193 c5 6 c18 1
+ x194 c5 6 c19 1
+ x195 c5 6 c20 1
+ x196 c5 4 c21 1
+ x197 c5 4 c22 1
+ x198 c5 4 c23 1
+ x199 c5 4 c24 1
+ x200 c5 4 c25 1
+ x201 c5 4 c26 1
+ x202 c5 6 c27 1
+ x203 c5 6 c28 1
+ x204 c5 6 c29 1
+ x205 c5 6 c30 1
+ x206 c5 6 c31 1
+ x207 c5 6 c32 1
+ x208 c5 6 c33 1
+ x209 c5 6 c34 1
+ x210 c5 6 c35 1
+ x211 c5 4 c36 1
+ x212 c5 4 c37 1
+ x213 c5 4 c38 1
+ x214 c5 2 c39 1
+ x215 c5 2 c40 1
+ x216 c5 2 c41 1
+ x217 c5 1 c42 1
+ x218 c5 1 c43 1
+ x219 c5 2 c44 1
+ x220 c5 2 c45 1
+ x221 c5 2 c46 1
+ x222 c5 2 c47 1
+ x223 c5 2 c48 1
+ x224 c5 2 c49 1
+ x225 c5 2 c50 1
+ x226 c5 2 c51 1
+ x227 c5 2 c52 1
+ x228 c5 2 c53 1
+ x229 c5 2 c54 1
+ x230 c5 2 c55 1
+ x231 c5 2 c56 1
+ x232 c5 2 c57 1
+ x233 c5 2 c58 1
+ x234 c5 2 c59 1
+ x235 c5 2 c60 1
+ x236 c5 2 c61 1
+ x237 c5 2 c62 1
+ x238 c5 2 c63 1
+ x239 c5 2 c64 1
+ x240 c6 2 c17 1
+ x241 c6 2 c18 1
+ x242 c6 2 c19 1
+ x243 c6 2 c20 1
+ x244 c6 2 c21 1
+ x245 c6 1 c22 1
+ x246 c6 1 c23 1
+ x247 c6 1 c24 1
+ x248 c6 1 c25 1
+ x249 c6 1 c30 1
+ x250 c6 1 c31 1
+ x251 c6 1 c32 1
+ x252 c6 2 c33 1
+ x253 c6 2 c34 1
+ x254 c6 2 c35 1
+ x255 c6 2 c36 1
+ x256 c6 2 c37 1
+ x257 c6 2 c38 1
+ x258 c6 2 c39 1
+ x259 c6 2 c40 1
+ x260 c6 1 c41 1
+ x261 c6 1 c42 1
+ x262 c6 2 c43 1
+ x263 c6 2 c44 1
+ x264 c6 4 c45 1
+ x265 c6 4 c46 1
+ x266 c6 4 c47 1
+ x267 c6 4 c48 1
+ x268 c6 4 c49 1
+ x269 c6 4 c50 1
+ x270 c6 4 c51 1
+ x271 c6 4 c52 1
+ x272 c6 4 c53 1
+ x273 c6 4 c54 1
+ x274 c6 2 c55 1
+ x275 c6 2 c56 1
+ x276 c6 2 c57 1
+ x277 c6 4 c58 1
+ x278 c6 4 c59 1
+ x279 c6 4 c60 1
+ x280 c6 6 c61 1
+ x281 c6 6 c62 1
+ x282 c6 6 c63 1
+ x283 c6 6 c64 1
+ x284 c7 4 c17 1
+ x285 c7 4 c18 1
+ x286 c7 4 c19 1
+ x287 c7 4 c20 1
+ x288 c7 2 c21 1
+ x289 c7 1 c22 1
+ x290 c7 2 c23 1
+ x291 c7 4 c24 1
+ x292 c7 4 c25 1
+ x293 c7 6 c26 1
+ x294 c7 4 c27 1
+ x295 c7 4 c28 1
+ x296 c7 4 c29 1
+ x297 c7 4 c30 1
+ x298 c7 4 c31 1
+ x299 c7 6 c32 1
+ x300 c7 6 c33 1
+ x301 c7 6 c34 1
+ x302 c7 6 c35 1
+ x303 c7 6 c36 1
+ x304 c7 6 c37 1
+ x305 c7 4 c38 1
+ x306 c7 4 c39 1
+ x307 c7 4 c40 1
+ x308 c7 4 c41 1
+ x309 c7 4 c42 1
+ x310 c7 4 c43 1
+ x311 c7 4 c44 1
+ x312 c7 4 c45 1
+ x313 c7 4 c46 1
+ x314 c7 6 c47 1
+ x315 c7 6 c48 1
+ x316 c7 6 c49 1
+ x317 c7 6 c50 1
+ x318 c7 6 c51 1
+ x319 c7 6 c52 1
+ x320 c7 6 c53 1
+ x321 c7 6 c54 1
+ x322 c7 4 c55 1
+ x323 c7 4 c56 1
+ x324 c7 4 c57 1
+ x325 c7 4 c58 1
+ x326 c7 4 c59 1
+ x327 c7 4 c60 1
+ x328 c7 4 c61 1
+ x329 c7 4 c62 1
+ x330 c7 4 c63 1
+ x331 c7 4 c64 1
+ x332 c8 4 c17 1
+ x333 c8 4 c18 1
+ x334 c8 4 c19 1
+ x335 c8 4 c20 1
+ x336 c8 2 c21 1
+ x337 c8 4 c22 1
+ x338 c8 4 c23 1
+ x339 c8 6 c24 1
+ x340 c8 6 c25 1
+ x341 c8 6 c26 1
+ x342 c8 6 c27 1
+ x343 c8 8 c28 1
+ x344 c8 8 c29 1
+ x345 c8 8 c30 1
+ x346 c8 8 c31 1
+ x347 c8 8 c32 1
+ x348 c8 6 c33 1
+ x349 c8 6 c34 1
+ x350 c8 6 c35 1
+ x351 c8 6 c36 1
+ x352 c8 4 c37 1
+ x353 c8 4 c38 1
+ x354 c8 2 c39 1
+ x355 c8 2 c40 1
+ x356 c8 2 c41 1
+ x357 c8 2 c42 1
+ x358 c8 4 c43 1
+ x359 c8 4 c44 1
+ x360 c8 4 c45 1
+ x361 c8 4 c46 1
+ x362 c8 4 c47 1
+ x363 c8 4 c48 1
+ x364 c8 4 c49 1
+ x365 c8 6 c50 1
+ x366 c8 6 c51 1
+ x367 c8 6 c52 1
+ x368 c8 6 c53 1
+ x369 c8 6 c54 1
+ x370 c8 6 c55 1
+ x371 c8 6 c56 1
+ x372 c8 6 c57 1
+ x373 c8 6 c58 1
+ x374 c8 6 c59 1
+ x375 c8 4 c60 1
+ x376 c8 4 c61 1
+ x377 c8 2 c62 1
+ x378 c8 1 c63 1
+ x379 c8 1 c64 1
+ x380 c9 4 c17 1
+ x381 c9 4 c18 1
+ x382 c9 6 c19 1
+ x383 c9 6 c20 1
+ x384 c9 6 c21 1
+ x385 c9 6 c22 1
+ x386 c9 4 c23 1
+ x387 c9 4 c24 1
+ x388 c9 2 c25 1
+ x389 c9 2 c26 1
+ x390 c9 2 c27 1
+ x391 c9 2 c28 1
+ x392 c9 2 c29 1
+ x393 c9 2 c30 1
+ x394 c9 4 c31 1
+ x395 c9 4 c32 1
+ x396 c9 4 c33 1
+ x397 c9 4 c34 1
+ x398 c9 4 c35 1
+ x399 c9 4 c36 1
+ x400 c9 4 c37 1
+ x401 c9 6 c38 1
+ x402 c9 6 c39 1
+ x403 c9 6 c40 1
+ x404 c9 6 c41 1
+ x405 c9 4 c42 1
+ x406 c9 4 c43 1
+ x407 c9 2 c44 1
+ x408 c9 2 c45 1
+ x409 c9 4 c46 1
+ x410 c9 4 c47 1
+ x411 c9 4 c48 1
+ x412 c9 4 c49 1
+ x413 c9 4 c50 1
+ x414 c9 4 c51 1
+ x415 c9 4 c52 1
+ x416 c9 4 c53 1
+ x417 c9 6 c54 1
+ x418 c9 6 c55 1
+ x419 c9 6 c56 1
+ x420 c9 6 c57 1
+ x421 c9 6 c58 1
+ x422 c9 6 c59 1
+ x423 c9 4 c60 1
+ x424 c9 4 c61 1
+ x425 c9 4 c62 1
+ x426 c9 4 c63 1
+ x427 c9 4 c64 1
+ x428 c10 1 c17 1
+ x429 c10 2 c18 1
+ x430 c10 2 c19 1
+ x431 c10 4 c20 1
+ x432 c10 4 c21 1
+ x433 c10 4 c22 1
+ x434 c10 4 c23 1
+ x435 c10 4 c24 1
+ x436 c10 4 c25 1
+ x437 c10 4 c26 1
+ x438 c10 4 c27 1
+ x439 c10 4 c28 1
+ x440 c10 2 c29 1
+ x441 c10 2 c30 1
+ x442 c10 2 c31 1
+ x443 c10 2 c32 1
+ x444 c10 4 c33 1
+ x445 c10 4 c34 1
+ x446 c10 4 c35 1
+ x447 c10 4 c36 1
+ x448 c10 4 c37 1
+ x449 c10 4 c38 1
+ x450 c10 4 c39 1
+ x451 c10 4 c40 1
+ x452 c10 4 c41 1
+ x453 c10 2 c42 1
+ x454 c10 1 c43 1
+ x455 c10 2 c45 1
+ x456 c10 4 c46 1
+ x457 c10 4 c47 1
+ x458 c10 6 c48 1
+ x459 c10 6 c49 1
+ x460 c10 6 c50 1
+ x461 c10 6 c51 1
+ x462 c10 8 c52 1
+ x463 c10 8 c53 1
+ x464 c10 8 c54 1
+ x465 c10 8 c55 1
+ x466 c10 8 c56 1
+ x467 c10 8 c57 1
+ x468 c10 8 c58 1
+ x469 c10 6 c59 1
+ x470 c10 6 c60 1
+ x471 c10 6 c61 1
+ x472 c10 6 c62 1
+ x473 c10 6 c63 1
+ x474 c10 4 c64 1
+ x475 c11 4 c18 1
+ x476 c11 6 c19 1
+ x477 c11 6 c20 1
+ x478 c11 4 c21 1
+ x479 c11 2 c22 1
+ x480 c11 4 c23 1
+ x481 c11 4 c24 1
+ x482 c11 2 c25 1
+ x483 c11 2 c26 1
+ x484 c11 4 c27 1
+ x485 c11 4 c28 1
+ x486 c11 6 c29 1
+ x487 c11 6 c30 1
+ x488 c11 6 c31 1
+ x489 c11 6 c32 1
+ x490 c11 6 c33 1
+ x491 c11 6 c34 1
+ x492 c11 6 c35 1
+ x493 c11 4 c36 1
+ x494 c11 2 c37 1
+ x495 c11 2 c38 1
+ x496 c11 4 c39 1
+ x497 c11 4 c40 1
+ x498 c11 2 c41 1
+ x499 c11 2 c42 1
+ x500 c11 4 c43 1
+ x501 c11 4 c44 1
+ x502 c11 4 c45 1
+ x503 c11 4 c46 1
+ x504 c11 2 c47 1
+ x505 c11 2 c48 1
+ x506 c11 4 c49 1
+ x507 c11 6 c50 1
+ x508 c11 4 c51 1
+ x509 c11 4 c52 1
+ x510 c11 6 c53 1
+ x511 c11 6 c54 1
+ x512 c11 6 c55 1
+ x513 c11 6 c56 1
+ x514 c11 4 c57 1
+ x515 c11 6 c58 1
+ x516 c11 6 c59 1
+ x517 c11 6 c60 1
+ x518 c11 6 c61 1
+ x519 c11 8 c62 1
+ x520 c11 8 c63 1
+ x521 c11 8 c64 1
+ x522 c12 6 c17 1
+ x523 c12 6 c18 1
+ x524 c12 8 c19 1
+ x525 c12 8 c20 1
+ x526 c12 8 c21 1
+ x527 c12 8 c22 1
+ x528 c12 8 c23 1
+ x529 c12 6 c24 1
+ x530 c12 6 c25 1
+ x531 c12 6 c26 1
+ x532 c12 4 c27 1
+ x533 c12 4 c28 1
+ x534 c12 2 c29 1
+ x535 c12 2 c30 1
+ x536 c12 2 c31 1
+ x537 c12 2 c32 1
+ x538 c12 2 c33 1
+ x539 c12 2 c34 1
+ x540 c12 2 c35 1
+ x541 c12 2 c36 1
+ x542 c12 4 c37 1
+ x543 c12 4 c38 1
+ x544 c12 4 c39 1
+ x545 c12 6 c40 1
+ x546 c12 6 c41 1
+ x547 c12 6 c42 1
+ x548 c12 6 c43 1
+ x549 c12 6 c44 1
+ x550 c12 6 c45 1
+ x551 c12 6 c46 1
+ x552 c12 8 c47 1
+ x553 c12 8 c48 1
+ x554 c12 8 c49 1
+ x555 c12 6 c50 1
+ x556 c12 6 c51 1
+ x557 c12 6 c52 1
+ x558 c12 6 c53 1
+ x559 c12 6 c54 1
+ x560 c12 6 c55 1
+ x561 c12 6 c56 1
+ x562 c12 8 c57 1
+ x563 c12 8 c58 1
+ x564 c12 6 c59 1
+ x565 c12 6 c60 1
+ x566 c12 6 c61 1
+ x567 c12 6 c62 1
+ x568 c12 4 c63 1
+ x569 c12 6 c64 1
+ x570 c13 6 c17 1
+ x571 c13 6 c18 1
+ x572 c13 4 c19 1
+ x573 c13 4 c20 1
+ x574 c13 6 c21 1
+ x575 c13 6 c22 1
+ x576 c13 6 c23 1
+ x577 c13 6 c24 1
+ x578 c13 6 c25 1
+ x579 c13 6 c26 1
+ x580 c13 6 c27 1
+ x581 c13 6 c28 1
+ x582 c13 8 c29 1
+ x583 c13 8 c30 1
+ x584 c13 8 c31 1
+ x585 c13 6 c32 1
+ x586 c13 6 c33 1
+ x587 c13 6 c34 1
+ x588 c13 4 c35 1
+ x589 c13 2 c36 1
+ x590 c13 4 c37 1
+ x591 c13 4 c38 1
+ x592 c13 4 c39 1
+ x593 c13 2 c40 1
+ x594 c13 1 c41 1
+ x595 c13 1 c42 1
+ x596 c13 4 c43 1
+ x597 c13 4 c44 1
+ x598 c13 4 c45 1
+ x599 c13 4 c46 1
+ x600 c13 4 c47 1
+ x601 c13 6 c48 1
+ x602 c13 6 c49 1
+ x603 c13 6 c50 1
+ x604 c13 6 c51 1
+ x605 c13 6 c52 1
+ x606 c13 6 c53 1
+ x607 c13 6 c54 1
+ x608 c13 4 c55 1
+ x609 c13 2 c56 1
+ x610 c13 2 c58 1
+ x611 c13 4 c59 1
+ x612 c13 4 c60 1
+ x613 c13 4 c61 1
+ x614 c13 4 c62 1
+ x615 c13 4 c63 1
+ x616 c13 4 c64 1
+ x617 c14 8 c17 1
+ x618 c14 8 c18 1
+ x619 c14 8 c19 1
+ x620 c14 6 c20 1
+ x621 c14 6 c21 1
+ x622 c14 6 c22 1
+ x623 c14 8 c23 1
+ x624 c14 6 c24 1
+ x625 c14 6 c25 1
+ x626 c14 4 c26 1
+ x627 c14 4 c27 1
+ x628 c14 4 c28 1
+ x629 c14 4 c29 1
+ x630 c14 2 c30 1
+ x631 c14 6 c31 1
+ x632 c14 6 c32 1
+ x633 c14 8 c33 1
+ x634 c14 8 c34 1
+ x635 c14 8 c35 1
+ x636 c14 6 c36 1
+ x637 c14 6 c37 1
+ x638 c14 6 c38 1
+ x639 c14 6 c39 1
+ x640 c14 6 c40 1
+ x641 c14 6 c41 1
+ x642 c14 8 c42 1
+ x643 c14 8 c43 1
+ x644 c14 8 c44 1
+ x645 c14 8 c45 1
+ x646 c14 8 c46 1
+ x647 c14 8 c47 1
+ x648 c14 6 c48 1
+ x649 c14 6 c49 1
+ x650 c14 6 c50 1
+ x651 c14 6 c51 1
+ x652 c14 2 c52 1
+ x653 c14 4 c53 1
+ x654 c14 4 c54 1
+ x655 c14 4 c55 1
+ x656 c14 2 c56 1
+ x657 c14 4 c57 1
+ x658 c14 6 c58 1
+ x659 c14 8 c59 1
+ x660 c14 6 c60 1
+ x661 c14 6 c61 1
+ x662 c14 6 c62 1
+ x663 c14 6 c63 1
+ x664 c14 6 c64 1
+ x665 c15 8 c17 1
+ x666 c15 8 c18 1
+ x667 c15 8 c19 1
+ x668 c15 8 c20 1
+ x669 c15 8 c21 1
+ x670 c15 8 c22 1
+ x671 c15 8 c23 1
+ x672 c15 8 c24 1
+ x673 c15 8 c25 1
+ x674 c15 8 c26 1
+ x675 c15 8 c27 1
+ x676 c15 8 c28 1
+ x677 c15 8 c29 1
+ x678 c15 6 c30 1
+ x679 c15 6 c31 1
+ x680 c15 6 c32 1
+ x681 c15 6 c33 1
+ x682 c15 8 c34 1
+ x683 c15 8 c35 1
+ x684 c15 6 c36 1
+ x685 c15 6 c37 1
+ x686 c15 4 c38 1
+ x687 c15 2 c40 1
+ x688 c15 4 c41 1
+ x689 c15 4 c42 1
+ x690 c15 2 c43 1
+ x691 c15 2 c44 1
+ x692 c15 4 c45 1
+ x693 c15 4 c46 1
+ x694 c15 4 c47 1
+ x695 c15 4 c48 1
+ x696 c15 2 c49 1
+ x697 c15 2 c50 1
+ x698 c15 4 c51 1
+ x699 c15 6 c52 1
+ x700 c15 6 c53 1
+ x701 c15 8 c54 1
+ x702 c15 6 c55 1
+ x703 c15 6 c56 1
+ x704 c15 4 c57 1
+ x705 c15 2 c58 1
+ x706 c15 2 c59 1
+ x707 c15 4 c60 1
+ x708 c15 6 c61 1
+ x709 c15 6 c62 1
+ x710 c15 6 c63 1
+ x711 c15 6 c64 1
+ x712 c16 8 c17 1
+ x713 c16 8 c18 1
+ x714 c16 8 c19 1
+ x715 c16 8 c20 1
+ x716 c16 6 c21 1
+ x717 c16 4 c22 1
+ x718 c16 6 c23 1
+ x719 c16 8 c24 1
+ x720 c16 8 c25 1
+ x721 c16 8 c26 1
+ x722 c16 8 c27 1
+ x723 c16 8 c28 1
+ x724 c16 8 c29 1
+ x725 c16 8 c30 1
+ x726 c16 8 c31 1
+ x727 c16 8 c32 1
+ x728 c16 8 c33 1
+ x729 c16 8 c34 1
+ x730 c16 8 c35 1
+ x731 c16 8 c36 1
+ x732 c16 6 c37 1
+ x733 c16 6 c38 1
+ x734 c16 4 c39 1
+ x735 c16 4 c40 1
+ x736 c16 6 c41 1
+ x737 c16 6 c42 1
+ x738 c16 6 c43 1
+ x739 c16 6 c44 1
+ x740 c16 6 c45 1
+ x741 c16 8 c46 1
+ x742 c16 8 c47 1
+ x743 c16 8 c48 1
+ x744 c16 8 c49 1
+ x745 c16 8 c50 1
+ x746 c16 8 c51 1
+ x747 c16 8 c52 1
+ x748 c16 6 c53 1
+ x749 c16 6 c54 1
+ x750 c16 2 c55 1
+ x751 c16 6 c56 1
+ x752 c16 8 c57 1
+ x753 c16 8 c58 1
+ x754 c16 8 c59 1
+ x755 c16 8 c60 1
+ x756 c16 8 c61 1
+ x757 c16 8 c62 1
+ x758 c16 6 c63 1
+ x759 c16 8 c64 1
+ x760 c17 1
+ x761 c26 1
+ x762 c27 1
+ x763 c28 1
+ x764 c29 1
+ x765 c33 1
+ x766 c39 1
+ x767 c39 1
+ x768 c44 1
+ x769 c57 1
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ rhs c17 1 c18 1
+ rhs c19 1 c20 1
+ rhs c21 1 c22 1
+ rhs c23 1 c24 1
+ rhs c25 1 c26 1
+ rhs c27 1 c28 1
+ rhs c29 1 c30 1
+ rhs c31 1 c32 1
+ rhs c33 1 c34 1
+ rhs c35 1 c36 1
+ rhs c37 1 c38 1
+ rhs c39 1 c40 1
+ rhs c41 1 c42 1
+ rhs c43 1 c44 1
+ rhs c45 1 c46 1
+ rhs c47 1 c48 1
+ rhs c49 1 c50 1
+ rhs c51 1 c52 1
+ rhs c53 1 c54 1
+ rhs c55 1 c56 1
+ rhs c57 1 c58 1
+ rhs c59 1 c60 1
+ rhs c61 1 c62 1
+ rhs c63 1 c64 1
+BOUNDS
+ UP bnd x1 384
+ UP bnd x2 1
+ UP bnd x3 1
+ UP bnd x4 1
+ UP bnd x5 1
+ UP bnd x6 1
+ UP bnd x7 1
+ UP bnd x8 1
+ UP bnd x9 1
+ UP bnd x10 1
+ UP bnd x11 1
+ UP bnd x12 1
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ UP bnd x57 1
+ UP bnd x58 1
+ UP bnd x59 1
+ UP bnd x60 1
+ UP bnd x61 1
+ UP bnd x62 1
+ UP bnd x63 1
+ UP bnd x64 1
+ UP bnd x65 1
+ UP bnd x66 1
+ UP bnd x67 1
+ UP bnd x68 1
+ UP bnd x69 1
+ UP bnd x70 1
+ UP bnd x71 1
+ UP bnd x72 1
+ UP bnd x73 1
+ UP bnd x74 1
+ UP bnd x75 1
+ UP bnd x76 1
+ UP bnd x77 1
+ UP bnd x78 1
+ UP bnd x79 1
+ UP bnd x80 1
+ UP bnd x81 1
+ UP bnd x82 1
+ UP bnd x83 1
+ UP bnd x84 1
+ UP bnd x85 1
+ UP bnd x86 1
+ UP bnd x87 1
+ UP bnd x88 1
+ UP bnd x89 1
+ UP bnd x90 1
+ UP bnd x91 1
+ UP bnd x92 1
+ UP bnd x93 1
+ UP bnd x94 1
+ UP bnd x95 1
+ UP bnd x96 1
+ UP bnd x97 1
+ UP bnd x98 1
+ UP bnd x99 1
+ UP bnd x100 1
+ UP bnd x101 1
+ UP bnd x102 1
+ UP bnd x103 1
+ UP bnd x104 1
+ UP bnd x105 1
+ UP bnd x106 1
+ UP bnd x107 1
+ UP bnd x108 1
+ UP bnd x109 1
+ UP bnd x110 1
+ UP bnd x111 1
+ UP bnd x112 1
+ UP bnd x113 1
+ UP bnd x114 1
+ UP bnd x115 1
+ UP bnd x116 1
+ UP bnd x117 1
+ UP bnd x118 1
+ UP bnd x119 1
+ UP bnd x120 1
+ UP bnd x121 1
+ UP bnd x122 1
+ UP bnd x123 1
+ UP bnd x124 1
+ UP bnd x125 1
+ UP bnd x126 1
+ UP bnd x127 1
+ UP bnd x128 1
+ UP bnd x129 1
+ UP bnd x130 1
+ UP bnd x131 1
+ UP bnd x132 1
+ UP bnd x133 1
+ UP bnd x134 1
+ UP bnd x135 1
+ UP bnd x136 1
+ UP bnd x137 1
+ UP bnd x138 1
+ UP bnd x139 1
+ UP bnd x140 1
+ UP bnd x141 1
+ UP bnd x142 1
+ UP bnd x143 1
+ UP bnd x144 1
+ UP bnd x145 1
+ UP bnd x146 1
+ UP bnd x147 1
+ UP bnd x148 1
+ UP bnd x149 1
+ UP bnd x150 1
+ UP bnd x151 1
+ UP bnd x152 1
+ UP bnd x153 1
+ UP bnd x154 1
+ UP bnd x155 1
+ UP bnd x156 1
+ UP bnd x157 1
+ UP bnd x158 1
+ UP bnd x159 1
+ UP bnd x160 1
+ UP bnd x161 1
+ UP bnd x162 1
+ UP bnd x163 1
+ UP bnd x164 1
+ UP bnd x165 1
+ UP bnd x166 1
+ UP bnd x167 1
+ UP bnd x168 1
+ UP bnd x169 1
+ UP bnd x170 1
+ UP bnd x171 1
+ UP bnd x172 1
+ UP bnd x173 1
+ UP bnd x174 1
+ UP bnd x175 1
+ UP bnd x176 1
+ UP bnd x177 1
+ UP bnd x178 1
+ UP bnd x179 1
+ UP bnd x180 1
+ UP bnd x181 1
+ UP bnd x182 1
+ UP bnd x183 1
+ UP bnd x184 1
+ UP bnd x185 1
+ UP bnd x186 1
+ UP bnd x187 1
+ UP bnd x188 1
+ UP bnd x189 1
+ UP bnd x190 1
+ UP bnd x191 1
+ UP bnd x192 1
+ UP bnd x193 1
+ UP bnd x194 1
+ UP bnd x195 1
+ UP bnd x196 1
+ UP bnd x197 1
+ UP bnd x198 1
+ UP bnd x199 1
+ UP bnd x200 1
+ UP bnd x201 1
+ UP bnd x202 1
+ UP bnd x203 1
+ UP bnd x204 1
+ UP bnd x205 1
+ UP bnd x206 1
+ UP bnd x207 1
+ UP bnd x208 1
+ UP bnd x209 1
+ UP bnd x210 1
+ UP bnd x211 1
+ UP bnd x212 1
+ UP bnd x213 1
+ UP bnd x214 1
+ UP bnd x215 1
+ UP bnd x216 1
+ UP bnd x217 1
+ UP bnd x218 1
+ UP bnd x219 1
+ UP bnd x220 1
+ UP bnd x221 1
+ UP bnd x222 1
+ UP bnd x223 1
+ UP bnd x224 1
+ UP bnd x225 1
+ UP bnd x226 1
+ UP bnd x227 1
+ UP bnd x228 1
+ UP bnd x229 1
+ UP bnd x230 1
+ UP bnd x231 1
+ UP bnd x232 1
+ UP bnd x233 1
+ UP bnd x234 1
+ UP bnd x235 1
+ UP bnd x236 1
+ UP bnd x237 1
+ UP bnd x238 1
+ UP bnd x239 1
+ UP bnd x240 1
+ UP bnd x241 1
+ UP bnd x242 1
+ UP bnd x243 1
+ UP bnd x244 1
+ UP bnd x245 1
+ UP bnd x246 1
+ UP bnd x247 1
+ UP bnd x248 1
+ UP bnd x249 1
+ UP bnd x250 1
+ UP bnd x251 1
+ UP bnd x252 1
+ UP bnd x253 1
+ UP bnd x254 1
+ UP bnd x255 1
+ UP bnd x256 1
+ UP bnd x257 1
+ UP bnd x258 1
+ UP bnd x259 1
+ UP bnd x260 1
+ UP bnd x261 1
+ UP bnd x262 1
+ UP bnd x263 1
+ UP bnd x264 1
+ UP bnd x265 1
+ UP bnd x266 1
+ UP bnd x267 1
+ UP bnd x268 1
+ UP bnd x269 1
+ UP bnd x270 1
+ UP bnd x271 1
+ UP bnd x272 1
+ UP bnd x273 1
+ UP bnd x274 1
+ UP bnd x275 1
+ UP bnd x276 1
+ UP bnd x277 1
+ UP bnd x278 1
+ UP bnd x279 1
+ UP bnd x280 1
+ UP bnd x281 1
+ UP bnd x282 1
+ UP bnd x283 1
+ UP bnd x284 1
+ UP bnd x285 1
+ UP bnd x286 1
+ UP bnd x287 1
+ UP bnd x288 1
+ UP bnd x289 1
+ UP bnd x290 1
+ UP bnd x291 1
+ UP bnd x292 1
+ UP bnd x293 1
+ UP bnd x294 1
+ UP bnd x295 1
+ UP bnd x296 1
+ UP bnd x297 1
+ UP bnd x298 1
+ UP bnd x299 1
+ UP bnd x300 1
+ UP bnd x301 1
+ UP bnd x302 1
+ UP bnd x303 1
+ UP bnd x304 1
+ UP bnd x305 1
+ UP bnd x306 1
+ UP bnd x307 1
+ UP bnd x308 1
+ UP bnd x309 1
+ UP bnd x310 1
+ UP bnd x311 1
+ UP bnd x312 1
+ UP bnd x313 1
+ UP bnd x314 1
+ UP bnd x315 1
+ UP bnd x316 1
+ UP bnd x317 1
+ UP bnd x318 1
+ UP bnd x319 1
+ UP bnd x320 1
+ UP bnd x321 1
+ UP bnd x322 1
+ UP bnd x323 1
+ UP bnd x324 1
+ UP bnd x325 1
+ UP bnd x326 1
+ UP bnd x327 1
+ UP bnd x328 1
+ UP bnd x329 1
+ UP bnd x330 1
+ UP bnd x331 1
+ UP bnd x332 1
+ UP bnd x333 1
+ UP bnd x334 1
+ UP bnd x335 1
+ UP bnd x336 1
+ UP bnd x337 1
+ UP bnd x338 1
+ UP bnd x339 1
+ UP bnd x340 1
+ UP bnd x341 1
+ UP bnd x342 1
+ UP bnd x343 1
+ UP bnd x344 1
+ UP bnd x345 1
+ UP bnd x346 1
+ UP bnd x347 1
+ UP bnd x348 1
+ UP bnd x349 1
+ UP bnd x350 1
+ UP bnd x351 1
+ UP bnd x352 1
+ UP bnd x353 1
+ UP bnd x354 1
+ UP bnd x355 1
+ UP bnd x356 1
+ UP bnd x357 1
+ UP bnd x358 1
+ UP bnd x359 1
+ UP bnd x360 1
+ UP bnd x361 1
+ UP bnd x362 1
+ UP bnd x363 1
+ UP bnd x364 1
+ UP bnd x365 1
+ UP bnd x366 1
+ UP bnd x367 1
+ UP bnd x368 1
+ UP bnd x369 1
+ UP bnd x370 1
+ UP bnd x371 1
+ UP bnd x372 1
+ UP bnd x373 1
+ UP bnd x374 1
+ UP bnd x375 1
+ UP bnd x376 1
+ UP bnd x377 1
+ UP bnd x378 1
+ UP bnd x379 1
+ UP bnd x380 1
+ UP bnd x381 1
+ UP bnd x382 1
+ UP bnd x383 1
+ UP bnd x384 1
+ UP bnd x385 1
+ UP bnd x386 1
+ UP bnd x387 1
+ UP bnd x388 1
+ UP bnd x389 1
+ UP bnd x390 1
+ UP bnd x391 1
+ UP bnd x392 1
+ UP bnd x393 1
+ UP bnd x394 1
+ UP bnd x395 1
+ UP bnd x396 1
+ UP bnd x397 1
+ UP bnd x398 1
+ UP bnd x399 1
+ UP bnd x400 1
+ UP bnd x401 1
+ UP bnd x402 1
+ UP bnd x403 1
+ UP bnd x404 1
+ UP bnd x405 1
+ UP bnd x406 1
+ UP bnd x407 1
+ UP bnd x408 1
+ UP bnd x409 1
+ UP bnd x410 1
+ UP bnd x411 1
+ UP bnd x412 1
+ UP bnd x413 1
+ UP bnd x414 1
+ UP bnd x415 1
+ UP bnd x416 1
+ UP bnd x417 1
+ UP bnd x418 1
+ UP bnd x419 1
+ UP bnd x420 1
+ UP bnd x421 1
+ UP bnd x422 1
+ UP bnd x423 1
+ UP bnd x424 1
+ UP bnd x425 1
+ UP bnd x426 1
+ UP bnd x427 1
+ UP bnd x428 1
+ UP bnd x429 1
+ UP bnd x430 1
+ UP bnd x431 1
+ UP bnd x432 1
+ UP bnd x433 1
+ UP bnd x434 1
+ UP bnd x435 1
+ UP bnd x436 1
+ UP bnd x437 1
+ UP bnd x438 1
+ UP bnd x439 1
+ UP bnd x440 1
+ UP bnd x441 1
+ UP bnd x442 1
+ UP bnd x443 1
+ UP bnd x444 1
+ UP bnd x445 1
+ UP bnd x446 1
+ UP bnd x447 1
+ UP bnd x448 1
+ UP bnd x449 1
+ UP bnd x450 1
+ UP bnd x451 1
+ UP bnd x452 1
+ UP bnd x453 1
+ UP bnd x454 1
+ UP bnd x455 1
+ UP bnd x456 1
+ UP bnd x457 1
+ UP bnd x458 1
+ UP bnd x459 1
+ UP bnd x460 1
+ UP bnd x461 1
+ UP bnd x462 1
+ UP bnd x463 1
+ UP bnd x464 1
+ UP bnd x465 1
+ UP bnd x466 1
+ UP bnd x467 1
+ UP bnd x468 1
+ UP bnd x469 1
+ UP bnd x470 1
+ UP bnd x471 1
+ UP bnd x472 1
+ UP bnd x473 1
+ UP bnd x474 1
+ UP bnd x475 1
+ UP bnd x476 1
+ UP bnd x477 1
+ UP bnd x478 1
+ UP bnd x479 1
+ UP bnd x480 1
+ UP bnd x481 1
+ UP bnd x482 1
+ UP bnd x483 1
+ UP bnd x484 1
+ UP bnd x485 1
+ UP bnd x486 1
+ UP bnd x487 1
+ UP bnd x488 1
+ UP bnd x489 1
+ UP bnd x490 1
+ UP bnd x491 1
+ UP bnd x492 1
+ UP bnd x493 1
+ UP bnd x494 1
+ UP bnd x495 1
+ UP bnd x496 1
+ UP bnd x497 1
+ UP bnd x498 1
+ UP bnd x499 1
+ UP bnd x500 1
+ UP bnd x501 1
+ UP bnd x502 1
+ UP bnd x503 1
+ UP bnd x504 1
+ UP bnd x505 1
+ UP bnd x506 1
+ UP bnd x507 1
+ UP bnd x508 1
+ UP bnd x509 1
+ UP bnd x510 1
+ UP bnd x511 1
+ UP bnd x512 1
+ UP bnd x513 1
+ UP bnd x514 1
+ UP bnd x515 1
+ UP bnd x516 1
+ UP bnd x517 1
+ UP bnd x518 1
+ UP bnd x519 1
+ UP bnd x520 1
+ UP bnd x521 1
+ UP bnd x522 1
+ UP bnd x523 1
+ UP bnd x524 1
+ UP bnd x525 1
+ UP bnd x526 1
+ UP bnd x527 1
+ UP bnd x528 1
+ UP bnd x529 1
+ UP bnd x530 1
+ UP bnd x531 1
+ UP bnd x532 1
+ UP bnd x533 1
+ UP bnd x534 1
+ UP bnd x535 1
+ UP bnd x536 1
+ UP bnd x537 1
+ UP bnd x538 1
+ UP bnd x539 1
+ UP bnd x540 1
+ UP bnd x541 1
+ UP bnd x542 1
+ UP bnd x543 1
+ UP bnd x544 1
+ UP bnd x545 1
+ UP bnd x546 1
+ UP bnd x547 1
+ UP bnd x548 1
+ UP bnd x549 1
+ UP bnd x550 1
+ UP bnd x551 1
+ UP bnd x552 1
+ UP bnd x553 1
+ UP bnd x554 1
+ UP bnd x555 1
+ UP bnd x556 1
+ UP bnd x557 1
+ UP bnd x558 1
+ UP bnd x559 1
+ UP bnd x560 1
+ UP bnd x561 1
+ UP bnd x562 1
+ UP bnd x563 1
+ UP bnd x564 1
+ UP bnd x565 1
+ UP bnd x566 1
+ UP bnd x567 1
+ UP bnd x568 1
+ UP bnd x569 1
+ UP bnd x570 1
+ UP bnd x571 1
+ UP bnd x572 1
+ UP bnd x573 1
+ UP bnd x574 1
+ UP bnd x575 1
+ UP bnd x576 1
+ UP bnd x577 1
+ UP bnd x578 1
+ UP bnd x579 1
+ UP bnd x580 1
+ UP bnd x581 1
+ UP bnd x582 1
+ UP bnd x583 1
+ UP bnd x584 1
+ UP bnd x585 1
+ UP bnd x586 1
+ UP bnd x587 1
+ UP bnd x588 1
+ UP bnd x589 1
+ UP bnd x590 1
+ UP bnd x591 1
+ UP bnd x592 1
+ UP bnd x593 1
+ UP bnd x594 1
+ UP bnd x595 1
+ UP bnd x596 1
+ UP bnd x597 1
+ UP bnd x598 1
+ UP bnd x599 1
+ UP bnd x600 1
+ UP bnd x601 1
+ UP bnd x602 1
+ UP bnd x603 1
+ UP bnd x604 1
+ UP bnd x605 1
+ UP bnd x606 1
+ UP bnd x607 1
+ UP bnd x608 1
+ UP bnd x609 1
+ UP bnd x610 1
+ UP bnd x611 1
+ UP bnd x612 1
+ UP bnd x613 1
+ UP bnd x614 1
+ UP bnd x615 1
+ UP bnd x616 1
+ UP bnd x617 1
+ UP bnd x618 1
+ UP bnd x619 1
+ UP bnd x620 1
+ UP bnd x621 1
+ UP bnd x622 1
+ UP bnd x623 1
+ UP bnd x624 1
+ UP bnd x625 1
+ UP bnd x626 1
+ UP bnd x627 1
+ UP bnd x628 1
+ UP bnd x629 1
+ UP bnd x630 1
+ UP bnd x631 1
+ UP bnd x632 1
+ UP bnd x633 1
+ UP bnd x634 1
+ UP bnd x635 1
+ UP bnd x636 1
+ UP bnd x637 1
+ UP bnd x638 1
+ UP bnd x639 1
+ UP bnd x640 1
+ UP bnd x641 1
+ UP bnd x642 1
+ UP bnd x643 1
+ UP bnd x644 1
+ UP bnd x645 1
+ UP bnd x646 1
+ UP bnd x647 1
+ UP bnd x648 1
+ UP bnd x649 1
+ UP bnd x650 1
+ UP bnd x651 1
+ UP bnd x652 1
+ UP bnd x653 1
+ UP bnd x654 1
+ UP bnd x655 1
+ UP bnd x656 1
+ UP bnd x657 1
+ UP bnd x658 1
+ UP bnd x659 1
+ UP bnd x660 1
+ UP bnd x661 1
+ UP bnd x662 1
+ UP bnd x663 1
+ UP bnd x664 1
+ UP bnd x665 1
+ UP bnd x666 1
+ UP bnd x667 1
+ UP bnd x668 1
+ UP bnd x669 1
+ UP bnd x670 1
+ UP bnd x671 1
+ UP bnd x672 1
+ UP bnd x673 1
+ UP bnd x674 1
+ UP bnd x675 1
+ UP bnd x676 1
+ UP bnd x677 1
+ UP bnd x678 1
+ UP bnd x679 1
+ UP bnd x680 1
+ UP bnd x681 1
+ UP bnd x682 1
+ UP bnd x683 1
+ UP bnd x684 1
+ UP bnd x685 1
+ UP bnd x686 1
+ UP bnd x687 1
+ UP bnd x688 1
+ UP bnd x689 1
+ UP bnd x690 1
+ UP bnd x691 1
+ UP bnd x692 1
+ UP bnd x693 1
+ UP bnd x694 1
+ UP bnd x695 1
+ UP bnd x696 1
+ UP bnd x697 1
+ UP bnd x698 1
+ UP bnd x699 1
+ UP bnd x700 1
+ UP bnd x701 1
+ UP bnd x702 1
+ UP bnd x703 1
+ UP bnd x704 1
+ UP bnd x705 1
+ UP bnd x706 1
+ UP bnd x707 1
+ UP bnd x708 1
+ UP bnd x709 1
+ UP bnd x710 1
+ UP bnd x711 1
+ UP bnd x712 1
+ UP bnd x713 1
+ UP bnd x714 1
+ UP bnd x715 1
+ UP bnd x716 1
+ UP bnd x717 1
+ UP bnd x718 1
+ UP bnd x719 1
+ UP bnd x720 1
+ UP bnd x721 1
+ UP bnd x722 1
+ UP bnd x723 1
+ UP bnd x724 1
+ UP bnd x725 1
+ UP bnd x726 1
+ UP bnd x727 1
+ UP bnd x728 1
+ UP bnd x729 1
+ UP bnd x730 1
+ UP bnd x731 1
+ UP bnd x732 1
+ UP bnd x733 1
+ UP bnd x734 1
+ UP bnd x735 1
+ UP bnd x736 1
+ UP bnd x737 1
+ UP bnd x738 1
+ UP bnd x739 1
+ UP bnd x740 1
+ UP bnd x741 1
+ UP bnd x742 1
+ UP bnd x743 1
+ UP bnd x744 1
+ UP bnd x745 1
+ UP bnd x746 1
+ UP bnd x747 1
+ UP bnd x748 1
+ UP bnd x749 1
+ UP bnd x750 1
+ UP bnd x751 1
+ UP bnd x752 1
+ UP bnd x753 1
+ UP bnd x754 1
+ UP bnd x755 1
+ UP bnd x756 1
+ UP bnd x757 1
+ UP bnd x758 1
+ UP bnd x759 1
+ UP bnd x760 1
+ UP bnd x761 1
+ UP bnd x762 1
+ UP bnd x763 1
+ UP bnd x764 1
+ UP bnd x765 1
+ UP bnd x766 1
+ UP bnd x767 1
+ UP bnd x768 1
+ UP bnd x769 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/p0033.mps b/demos/ppl_lpsol/examples/p0033.mps
new file mode 100644
index 0000000..7237e25
--- /dev/null
+++ b/demos/ppl_lpsol/examples/p0033.mps
@@ -0,0 +1,152 @@
+*NAME: p0033
+*ROWS: 16
+*COLUMNS: 33
+*INTEGER: 33
+*NONZERO: 98
+*BEST SOLN: 3089 (opt)
+*LP SOLN: 2520.57
+*SOURCE: Crowder-Johnson-Padberg test set
+*
+* E. Andrew Boyd (Rice University)
+*APPLICATION: unknown
+*COMMENTS: pure 0/1 IP
+* 5 SOS constraints
+*
+NAME P0033
+ROWS
+ N R100
+ L R114
+ L R115
+ L R116
+ L R117
+ L R118
+ L R119
+ L R120
+ L R121
+ L R122
+ L R123
+ L R124
+ L R125
+ L R126
+ L R127
+ L R128
+ L ZBESTROW
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ C157 R100 171 R114 1
+ C157 R122 -300 R123 -300
+ C158 R100 171 R114 1
+ C158 R126 -300 R127 -300
+ C159 R100 171 R114 1
+ C159 R119 300 R120 -300
+ C159 R123 -300
+ C160 R100 171 R114 1
+ C160 R119 300 R120 -300
+ C160 R121 -300
+ C161 R100 163 R115 1
+ C161 R119 285 R120 -285
+ C161 R124 -285 R125 -285
+ C162 R100 162 R115 1
+ C162 R119 285 R120 -285
+ C162 R122 -285 R123 -285
+ C163 R100 163 R115 1
+ C163 R128 -285
+ C164 R100 69 R116 1
+ C164 R119 265 R120 -265
+ C164 R124 -265 R125 -265
+ C165 R100 69 R116 1
+ C165 R119 265 R120 -265
+ C165 R122 -265 R123 -265
+ C166 R100 183 R117 1
+ C166 R118 -230
+ C167 R100 183 R117 1
+ C167 R124 -230 R125 -230
+ C168 R100 183 R117 1
+ C168 R119 230 R120 -230
+ C168 R125 -230
+ C169 R100 183 R117 1
+ C169 R119 230 R120 -230
+ C169 R123 -230
+ C170 R100 49 R119 190
+ C170 R120 -190 R122 -190
+ C170 R123 -190
+ C171 R100 183 R117 1
+ C172 R100 258 R118 -200
+ C173 R100 517 R118 -400
+ C174 R100 250 R126 -200
+ C174 R127 -200
+ C175 R100 500 R126 -400
+ C175 R127 -400
+ C176 R100 250 R127 -200
+ C177 R100 500 R127 -400
+ C178 R100 159 R119 200
+ C178 R120 -200 R124 -200
+ C178 R125 -200
+ C179 R100 318 R119 400
+ C179 R120 -400 R124 -400
+ C179 R125 -400
+ C180 R100 159 R119 200
+ C180 R120 -200 R125 -200
+ C181 R100 318 R119 400
+ C181 R120 -400 R125 -400
+ C182 R100 159 R119 200
+ C182 R120 -200 R122 -200
+ C182 R123 -200
+ C183 R100 318 R119 400
+ C183 R120 -400 R122 -400
+ C183 R123 -400
+ C184 R100 159 R119 200
+ C184 R120 -200 R123 -200
+ C185 R100 318 R119 400
+ C185 R120 -400 R123 -400
+ C186 R100 114 R119 200
+ C186 R120 -200 R121 -200
+ C187 R100 228 R119 400
+ C187 R120 -400 R121 -400
+ C188 R100 159 R128 -200
+ C189 R100 318 R128 -400
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ RHS R114 1 R115 1
+ RHS R116 1 R117 1
+ RHS R118 -5 R119 2700
+ RHS R120 -2600 R121 -100
+ RHS R122 -900 R123 -1656
+ RHS R124 -335 R125 -1026
+ RHS R126 -5 R127 -500
+ RHS R128 -270
+BOUNDS
+ UP ONE C157 1
+ UP ONE C158 1
+ UP ONE C159 1
+ UP ONE C160 1
+ UP ONE C161 1
+ UP ONE C162 1
+ UP ONE C163 1
+ UP ONE C164 1
+ UP ONE C165 1
+ UP ONE C166 1
+ UP ONE C167 1
+ UP ONE C168 1
+ UP ONE C169 1
+ UP ONE C170 1
+ UP ONE C171 1
+ UP ONE C172 1
+ UP ONE C173 1
+ UP ONE C174 1
+ UP ONE C175 1
+ UP ONE C176 1
+ UP ONE C177 1
+ UP ONE C178 1
+ UP ONE C179 1
+ UP ONE C180 1
+ UP ONE C181 1
+ UP ONE C182 1
+ UP ONE C183 1
+ UP ONE C184 1
+ UP ONE C185 1
+ UP ONE C186 1
+ UP ONE C187 1
+ UP ONE C188 1
+ UP ONE C189 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/pk1.mps b/demos/ppl_lpsol/examples/pk1.mps
new file mode 100644
index 0000000..283ea72
--- /dev/null
+++ b/demos/ppl_lpsol/examples/pk1.mps
@@ -0,0 +1,603 @@
+NAME pk1
+ROWS
+ N obj
+ E c1
+ E c2
+ E c3
+ E c4
+ E c5
+ E c6
+ E c7
+ E c8
+ E c9
+ E c10
+ E c11
+ E c12
+ E c13
+ E c14
+ E c15
+ G c16
+ G c17
+ G c18
+ G c19
+ G c20
+ G c21
+ G c22
+ G c23
+ G c24
+ G c25
+ G c26
+ G c27
+ G c28
+ G c29
+ G c30
+ G c31
+ G c32
+ G c33
+ G c34
+ G c35
+ G c36
+ G c37
+ G c38
+ G c39
+ G c40
+ G c41
+ G c42
+ G c43
+ G c44
+ G c45
+COLUMNS
+ x1 obj 1 c16 1
+ x1 c17 1 c18 1
+ x1 c19 1 c20 1
+ x1 c21 1 c22 1
+ x1 c23 1 c24 1
+ x1 c25 1 c26 1
+ x1 c27 1 c28 1
+ x1 c29 1 c30 1
+ x1 c31 1 c32 1
+ x1 c33 1 c34 1
+ x1 c35 1 c36 1
+ x1 c37 1 c38 1
+ x1 c39 1 c40 1
+ x1 c41 1 c42 1
+ x1 c43 1 c44 1
+ x1 c45 1
+ MARK0000 'MARKER' 'INTORG'
+ x2 c1 14 c2 53
+ x2 c3 48 c4 33
+ x2 c5 15 c6 43
+ x2 c7 8 c8 38
+ x2 c9 34 c10 37
+ x2 c11 25 c12 42
+ x2 c13 16 c14 10
+ x2 c15 28
+ x3 c1 36 c2 48
+ x3 c3 34 c4 34
+ x3 c5 9 c6 28
+ x3 c7 30 c8 42
+ x3 c9 13 c10 42
+ x3 c11 47 c12 33
+ x3 c13 6 c14 51
+ x3 c15 47
+ x4 c1 11 c2 48
+ x4 c3 8 c4 36
+ x4 c5 24 c6 30
+ x4 c7 18 c8 24
+ x4 c9 39 c10 23
+ x4 c11 25 c12 45
+ x4 c13 47 c14 33
+ x4 c15 16
+ x5 c1 27 c2 12
+ x5 c3 5 c4 34
+ x5 c5 43 c6 30
+ x5 c7 16 c8 46
+ x5 c9 19 c10 41
+ x5 c11 29 c12 6
+ x5 c13 30 c14 23
+ x5 c15 32
+ x6 c1 49 c2 43
+ x6 c3 49 c4 19
+ x6 c5 53 c6 10
+ x6 c7 18 c8 20
+ x6 c9 51 c10 33
+ x6 c11 44 c12 33
+ x6 c13 45 c14 31
+ x6 c15 28
+ x7 c1 26 c2 42
+ x7 c3 21 c4 19
+ x7 c5 54 c6 26
+ x7 c7 21 c8 11
+ x7 c9 13 c10 14
+ x7 c11 22 c12 6
+ x7 c13 37 c14 34
+ x7 c15 16
+ x8 c1 37 c2 14
+ x8 c3 38 c4 30
+ x8 c5 29 c6 32
+ x8 c7 24 c8 32
+ x8 c9 22 c10 40
+ x8 c11 10 c12 24
+ x8 c13 16 c14 32
+ x8 c15 32
+ x9 c1 45 c2 48
+ x9 c3 11 c4 48
+ x9 c5 24 c6 54
+ x9 c7 46 c8 52
+ x9 c9 20 c10 53
+ x9 c11 21 c12 54
+ x9 c13 19 c14 23
+ x9 c15 15
+ x10 c1 21 c2 16
+ x10 c3 26 c4 32
+ x10 c5 11 c6 26
+ x10 c7 47 c8 24
+ x10 c9 24 c10 14
+ x10 c11 5 c12 9
+ x10 c13 5 c14 38
+ x10 c15 11
+ x11 c1 6 c2 23
+ x11 c3 12 c4 30
+ x11 c5 47 c6 52
+ x11 c7 6 c8 31
+ x11 c9 45 c10 23
+ x11 c11 10 c12 12
+ x11 c13 44 c14 32
+ x11 c15 8
+ x12 c1 48 c2 25
+ x12 c3 30 c4 26
+ x12 c5 24 c6 34
+ x12 c7 48 c8 45
+ x12 c9 30 c10 37
+ x12 c11 35 c12 48
+ x12 c13 45 c14 40
+ x12 c15 21
+ x13 c1 38 c2 36
+ x13 c3 18 c4 39
+ x13 c5 34 c6 24
+ x13 c7 27 c8 50
+ x13 c9 51 c10 9
+ x13 c11 17 c12 51
+ x13 c13 53 c14 30
+ x13 c15 33
+ x14 c1 37 c2 54
+ x14 c3 23 c4 47
+ x14 c5 29 c6 21
+ x14 c7 10 c8 47
+ x14 c9 24 c10 14
+ x14 c11 20 c12 16
+ x14 c13 22 c14 14
+ x14 c15 15
+ x15 c1 10 c2 34
+ x15 c3 8 c4 37
+ x15 c5 49 c6 39
+ x15 c7 26 c8 6
+ x15 c9 17 c10 38
+ x15 c11 33 c12 48
+ x15 c13 40 c14 19
+ x15 c15 54
+ x16 c1 16 c2 45
+ x16 c3 55 c4 52
+ x16 c5 50 c6 41
+ x16 c7 6 c8 15
+ x16 c9 23 c10 19
+ x16 c11 27 c12 8
+ x16 c13 47 c14 37
+ x16 c15 22
+ x17 c1 35 c2 51
+ x17 c3 46 c4 33
+ x17 c5 39 c6 47
+ x17 c7 36 c8 53
+ x17 c9 22 c10 24
+ x17 c11 39 c12 21
+ x17 c13 55 c14 48
+ x17 c15 55
+ x18 c1 17 c2 45
+ x18 c3 5 c4 5
+ x18 c5 50 c6 36
+ x18 c7 52 c8 20
+ x18 c9 29 c10 29
+ x18 c11 50 c12 54
+ x18 c13 43 c14 36
+ x18 c15 13
+ x19 c1 7 c2 46
+ x19 c3 10 c4 39
+ x19 c5 36 c6 27
+ x19 c7 14 c8 24
+ x19 c9 36 c10 55
+ x19 c11 17 c12 46
+ x19 c13 34 c14 33
+ x19 c15 47
+ x20 c1 46 c2 30
+ x20 c3 50 c4 34
+ x20 c5 32 c6 52
+ x20 c7 29 c8 31
+ x20 c9 14 c10 29
+ x20 c11 11 c12 39
+ x20 c13 33 c14 27
+ x20 c15 19
+ x21 c1 26 c2 38
+ x21 c3 52 c4 42
+ x21 c5 42 c6 7
+ x21 c7 43 c8 40
+ x21 c9 33 c10 40
+ x21 c11 25 c12 23
+ x21 c13 6 c14 20
+ x21 c15 33
+ x22 c1 8 c2 52
+ x22 c3 45 c4 30
+ x22 c5 55 c6 6
+ x22 c7 7 c8 54
+ x22 c9 51 c10 52
+ x22 c11 42 c12 11
+ x22 c13 13 c14 14
+ x22 c15 35
+ x23 c1 40 c2 21
+ x23 c3 42 c4 33
+ x23 c5 21 c6 52
+ x23 c7 8 c8 10
+ x23 c9 17 c10 54
+ x23 c11 50 c12 28
+ x23 c13 15 c14 50
+ x23 c15 15
+ x24 c1 19 c2 9
+ x24 c3 43 c4 19
+ x24 c5 11 c6 13
+ x24 c7 26 c8 40
+ x24 c9 35 c10 16
+ x24 c11 19 c12 27
+ x24 c13 36 c14 54
+ x24 c15 44
+ x25 c1 33 c2 21
+ x25 c3 19 c4 21
+ x25 c5 24 c6 30
+ x25 c7 31 c8 30
+ x25 c9 31 c10 23
+ x25 c11 40 c12 21
+ x25 c13 41 c14 34
+ x25 c15 55
+ x26 c1 5 c2 15
+ x26 c3 25 c4 38
+ x26 c5 45 c6 32
+ x26 c7 10 c8 50
+ x26 c9 39 c10 8
+ x26 c11 37 c12 30
+ x26 c13 39 c14 50
+ x26 c15 39
+ x27 c1 42 c2 22
+ x27 c3 8 c4 40
+ x27 c5 10 c6 46
+ x27 c7 6 c8 14
+ x27 c9 12 c10 53
+ x27 c11 38 c12 38
+ x27 c13 50 c14 14
+ x27 c15 28
+ x28 c1 22 c2 12
+ x28 c3 27 c4 9
+ x28 c5 30 c6 41
+ x28 c7 7 c8 44
+ x28 c9 47 c10 23
+ x28 c11 22 c12 52
+ x28 c13 38 c14 54
+ x28 c15 39
+ x29 c1 14 c2 12
+ x29 c3 5 c4 33
+ x29 c5 42 c6 12
+ x29 c7 12 c8 41
+ x29 c9 9 c10 9
+ x29 c11 20 c12 18
+ x29 c13 18 c14 9
+ x29 c15 23
+ x30 c1 51 c2 19
+ x30 c3 41 c4 48
+ x30 c5 38 c6 44
+ x30 c7 33 c8 42
+ x30 c9 46 c10 52
+ x30 c11 5 c12 43
+ x30 c13 36 c14 37
+ x30 c15 6
+ x31 c1 49 c2 17
+ x31 c3 39 c4 35
+ x31 c5 51 c6 7
+ x31 c7 42 c8 29
+ x31 c9 46 c10 52
+ x31 c11 16 c12 46
+ x31 c13 6 c14 55
+ x31 c15 20
+ x32 c1 7 c2 38
+ x32 c3 52 c4 42
+ x32 c5 6 c6 12
+ x32 c7 41 c8 8
+ x32 c9 55 c10 37
+ x32 c11 22 c12 42
+ x32 c13 13 c14 55
+ x32 c15 36
+ x33 c1 10 c2 17
+ x33 c3 33 c4 26
+ x33 c5 48 c6 32
+ x33 c7 37 c8 24
+ x33 c9 25 c10 33
+ x33 c11 25 c12 29
+ x33 c13 47 c14 42
+ x33 c15 29
+ x34 c1 30 c2 9
+ x34 c3 17 c4 13
+ x34 c5 5 c6 30
+ x34 c7 17 c8 16
+ x34 c9 55 c10 39
+ x34 c11 8 c12 23
+ x34 c13 8 c14 51
+ x34 c15 12
+ x35 c1 14 c2 30
+ x35 c3 5 c4 23
+ x35 c5 25 c6 38
+ x35 c7 55 c8 27
+ x35 c9 38 c10 55
+ x35 c11 43 c12 32
+ x35 c13 5 c14 32
+ x35 c15 48
+ x36 c1 32 c2 24
+ x36 c3 34 c4 55
+ x36 c5 36 c6 6
+ x36 c7 48 c8 15
+ x36 c9 39 c10 18
+ x36 c11 50 c12 31
+ x36 c13 22 c14 10
+ x36 c15 6
+ x37 c1 24 c2 48
+ x37 c3 11 c4 27
+ x37 c5 53 c6 36
+ x37 c7 31 c8 31
+ x37 c9 51 c10 17
+ x37 c11 47 c12 52
+ x37 c13 48 c14 26
+ x37 c15 35
+ x38 c1 36 c2 16
+ x38 c3 21 c4 37
+ x38 c5 24 c6 8
+ x38 c7 20 c8 34
+ x38 c9 46 c10 14
+ x38 c11 9 c12 33
+ x38 c13 37 c14 11
+ x38 c15 8
+ x39 c1 14 c2 34
+ x39 c3 16 c4 30
+ x39 c5 10 c6 34
+ x39 c7 17 c8 42
+ x39 c9 6 c10 54
+ x39 c11 5 c12 51
+ x39 c13 34 c14 38
+ x39 c15 33
+ x40 c1 13 c2 41
+ x40 c3 17 c4 20
+ x40 c5 22 c6 34
+ x40 c7 21 c8 28
+ x40 c9 15 c10 14
+ x40 c11 12 c12 50
+ x40 c13 11 c14 45
+ x40 c15 46
+ x41 c1 52 c2 28
+ x41 c3 42 c4 14
+ x41 c5 31 c6 30
+ x41 c7 11 c8 53
+ x41 c9 15 c10 24
+ x41 c11 10 c12 38
+ x41 c13 38 c14 44
+ x41 c15 15
+ x42 c1 16 c2 52
+ x42 c3 23 c4 5
+ x42 c5 53 c6 31
+ x42 c7 19 c8 17
+ x42 c9 47 c10 21
+ x42 c11 10 c12 7
+ x42 c13 22 c14 14
+ x42 c15 37
+ x43 c1 5 c2 10
+ x43 c3 43 c4 42
+ x43 c5 41 c6 13
+ x43 c7 13 c8 18
+ x43 c9 40 c10 46
+ x43 c11 42 c12 42
+ x43 c13 52 c14 30
+ x43 c15 11
+ x44 c1 35 c2 8
+ x44 c3 5 c4 49
+ x44 c5 10 c6 49
+ x44 c7 34 c8 48
+ x44 c9 10 c10 28
+ x44 c11 22 c12 34
+ x44 c13 35 c14 19
+ x44 c15 44
+ x45 c1 48 c2 51
+ x45 c3 42 c4 47
+ x45 c5 26 c6 47
+ x45 c7 24 c8 8
+ x45 c9 15 c10 30
+ x45 c11 25 c12 18
+ x45 c13 39 c14 24
+ x45 c15 48
+ x46 c1 11 c2 40
+ x46 c3 47 c4 24
+ x46 c5 35 c6 48
+ x46 c7 35 c8 19
+ x46 c9 52 c10 29
+ x46 c11 20 c12 35
+ x46 c13 37 c14 44
+ x46 c15 9
+ x47 c1 47 c2 48
+ x47 c3 55 c4 45
+ x47 c5 55 c6 35
+ x47 c7 35 c8 7
+ x47 c9 29 c10 43
+ x47 c11 45 c12 37
+ x47 c13 27 c14 52
+ x47 c15 11
+ x48 c1 27 c2 46
+ x48 c3 32 c4 25
+ x48 c5 10 c6 39
+ x48 c7 55 c8 6
+ x48 c9 32 c10 50
+ x48 c11 9 c12 35
+ x48 c13 38 c14 16
+ x48 c15 47
+ x49 c1 24 c2 30
+ x49 c3 47 c4 24
+ x49 c5 29 c6 29
+ x49 c7 31 c8 35
+ x49 c9 26 c10 53
+ x49 c11 15 c12 33
+ x49 c13 24 c14 24
+ x49 c15 18
+ x50 c1 49 c2 38
+ x50 c3 9 c4 28
+ x50 c5 36 c6 6
+ x50 c7 44 c8 27
+ x50 c9 10 c10 43
+ x50 c11 7 c12 28
+ x50 c13 5 c14 29
+ x50 c15 54
+ x51 c1 17 c2 21
+ x51 c3 26 c4 54
+ x51 c5 37 c6 35
+ x51 c7 29 c8 33
+ x51 c9 42 c10 24
+ x51 c11 15 c12 18
+ x51 c13 16 c14 39
+ x51 c15 10
+ x52 c1 46 c2 12
+ x52 c3 43 c4 11
+ x52 c5 15 c6 32
+ x52 c7 19 c8 20
+ x52 c9 55 c10 38
+ x52 c11 35 c12 52
+ x52 c13 25 c14 39
+ x52 c15 46
+ x53 c1 53 c2 35
+ x53 c3 50 c4 53
+ x53 c5 36 c6 7
+ x53 c7 46 c8 25
+ x53 c9 6 c10 39
+ x53 c11 44 c12 34
+ x53 c13 14 c14 39
+ x53 c15 34
+ x54 c1 53 c2 38
+ x54 c3 13 c4 32
+ x54 c5 54 c6 32
+ x54 c7 33 c8 39
+ x54 c9 54 c10 22
+ x54 c11 9 c12 42
+ x54 c13 27 c14 33
+ x54 c15 20
+ x55 c1 10 c2 17
+ x55 c3 30 c4 25
+ x55 c5 22 c6 40
+ x55 c7 41 c8 55
+ x55 c9 34 c10 49
+ x55 c11 50 c12 24
+ x55 c13 6 c14 37
+ x55 c15 35
+ x56 c1 30 c2 52
+ x56 c3 14 c4 19
+ x56 c5 55 c6 33
+ x56 c7 22 c8 51
+ x56 c9 32 c10 7
+ x56 c11 28 c12 51
+ x56 c13 51 c14 17
+ x56 c15 33
+ MARK0001 'MARKER' 'INTEND'
+ x57 c1 1 c16 -1
+ x58 c1 -1 c17 -1
+ x59 c2 1 c18 -1
+ x60 c2 -1 c19 -1
+ x61 c3 1 c20 -1
+ x62 c3 -1 c21 -1
+ x63 c4 1 c22 -1
+ x64 c4 -1 c23 -1
+ x65 c5 1 c24 -1
+ x66 c5 -1 c25 -1
+ x67 c6 1 c26 -1
+ x68 c6 -1 c27 -1
+ x69 c7 1 c28 -1
+ x70 c7 -1 c29 -1
+ x71 c8 1 c30 -1
+ x72 c8 -1 c31 -1
+ x73 c9 1 c32 -1
+ x74 c9 -1 c33 -1
+ x75 c10 1 c34 -1
+ x76 c10 -1 c35 -1
+ x77 c11 1 c36 -1
+ x78 c11 -1 c37 -1
+ x79 c12 1 c38 -1
+ x80 c12 -1 c39 -1
+ x81 c13 1 c40 -1
+ x82 c13 -1 c41 -1
+ x83 c14 1 c42 -1
+ x84 c14 -1 c43 -1
+ x85 c15 1 c44 -1
+ x86 c15 -1 c45 -1
+RHS
+ rhs c1 731 c2 731
+ rhs c3 731 c4 731
+ rhs c5 731 c6 731
+ rhs c7 731 c8 731
+ rhs c9 731 c10 731
+ rhs c11 731 c12 731
+ rhs c13 731 c14 731
+ rhs c15 731
+BOUNDS
+ UP bnd x2 1
+ UP bnd x3 1
+ UP bnd x4 1
+ UP bnd x5 1
+ UP bnd x6 1
+ UP bnd x7 1
+ UP bnd x8 1
+ UP bnd x9 1
+ UP bnd x10 1
+ UP bnd x11 1
+ UP bnd x12 1
+ UP bnd x13 1
+ UP bnd x14 1
+ UP bnd x15 1
+ UP bnd x16 1
+ UP bnd x17 1
+ UP bnd x18 1
+ UP bnd x19 1
+ UP bnd x20 1
+ UP bnd x21 1
+ UP bnd x22 1
+ UP bnd x23 1
+ UP bnd x24 1
+ UP bnd x25 1
+ UP bnd x26 1
+ UP bnd x27 1
+ UP bnd x28 1
+ UP bnd x29 1
+ UP bnd x30 1
+ UP bnd x31 1
+ UP bnd x32 1
+ UP bnd x33 1
+ UP bnd x34 1
+ UP bnd x35 1
+ UP bnd x36 1
+ UP bnd x37 1
+ UP bnd x38 1
+ UP bnd x39 1
+ UP bnd x40 1
+ UP bnd x41 1
+ UP bnd x42 1
+ UP bnd x43 1
+ UP bnd x44 1
+ UP bnd x45 1
+ UP bnd x46 1
+ UP bnd x47 1
+ UP bnd x48 1
+ UP bnd x49 1
+ UP bnd x50 1
+ UP bnd x51 1
+ UP bnd x52 1
+ UP bnd x53 1
+ UP bnd x54 1
+ UP bnd x55 1
+ UP bnd x56 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/rout.mps b/demos/ppl_lpsol/examples/rout.mps
new file mode 100644
index 0000000..cf0541a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/rout.mps
@@ -0,0 +1,2038 @@
+NAME rout
+ROWS
+ N R0000292
+ E c1
+ L c2
+ L c3
+ L c4
+ L c5
+ L c6
+ L c7
+ L c8
+ L c9
+ L c10
+ L c11
+ L c12
+ L c13
+ L c14
+ L c15
+ L c16
+ L c17
+ L c18
+ L c19
+ L c20
+ L c21
+ E c22
+ E c23
+ E c24
+ E c25
+ E c26
+ E c27
+ E c28
+ E c29
+ E c30
+ E c31
+ E c32
+ E c33
+ E c34
+ E c35
+ E c36
+ E c37
+ E c38
+ E c39
+ E c40
+ E c41
+ E c42
+ E c43
+ E c44
+ E c45
+ E c46
+ E c47
+ E c48
+ E c49
+ E c50
+ E c51
+ L c52
+ L c53
+ L c54
+ L c55
+ L c56
+ L c57
+ L c58
+ L c59
+ L c60
+ L c61
+ L c62
+ L c63
+ L c64
+ L c65
+ L c66
+ L c67
+ L c68
+ L c69
+ L c70
+ L c71
+ L c72
+ L c73
+ L c74
+ L c75
+ L c76
+ L c77
+ L c78
+ L c79
+ L c80
+ L c81
+ L c82
+ L c83
+ L c84
+ L c85
+ L c86
+ L c87
+ L c88
+ L c89
+ L c90
+ L c91
+ L c92
+ L c93
+ L c94
+ L c95
+ L c96
+ L c97
+ L c98
+ L c99
+ L c100
+ L c101
+ L c102
+ L c103
+ L c104
+ L c105
+ L c106
+ L c107
+ L c108
+ L c109
+ L c110
+ L c111
+ L c112
+ L c113
+ L c114
+ L c115
+ L c116
+ L c117
+ L c118
+ L c119
+ L c120
+ L c121
+ L c122
+ L c123
+ L c124
+ L c125
+ L c126
+ L c127
+ L c128
+ L c129
+ L c130
+ L c131
+ L c132
+ L c133
+ L c134
+ L c135
+ L c136
+ L c137
+ L c138
+ L c139
+ L c140
+ L c141
+ L c142
+ L c143
+ L c144
+ L c145
+ L c146
+ L c147
+ L c148
+ L c149
+ L c150
+ L c151
+ L c152
+ L c153
+ L c154
+ L c155
+ L c156
+ L c157
+ L c158
+ L c159
+ L c160
+ L c161
+ L c162
+ L c163
+ L c164
+ L c165
+ L c166
+ L c167
+ L c168
+ L c169
+ L c170
+ L c171
+ L c172
+ L c173
+ L c174
+ L c175
+ L c176
+ L c177
+ L c178
+ L c179
+ L c180
+ L c181
+ L c182
+ L c183
+ L c184
+ L c185
+ L c186
+ L c187
+ L c188
+ L c189
+ L c190
+ L c191
+ L c192
+ L c193
+ L c194
+ L c195
+ L c196
+ L c197
+ L c198
+ L c199
+ L c200
+ L c201
+ L c202
+ L c203
+ L c204
+ L c205
+ L c206
+ L c207
+ L c208
+ L c209
+ L c210
+ L c211
+ L c212
+ L c213
+ L c214
+ L c215
+ L c216
+ L c217
+ L c218
+ L c219
+ L c220
+ L c221
+ L c222
+ L c223
+ L c224
+ L c225
+ L c226
+ L c227
+ L c228
+ L c229
+ L c230
+ L c231
+ L c232
+ L c233
+ L c234
+ L c235
+ L c236
+ L c237
+ L c238
+ L c239
+ L c240
+ L c241
+ L c242
+ L c243
+ L c244
+ L c245
+ L c246
+ L c247
+ L c248
+ L c249
+ L c250
+ L c251
+ L c252
+ L c253
+ L c254
+ L c255
+ L c256
+ L c257
+ L c258
+ L c259
+ L c260
+ L c261
+ L c262
+ L c263
+ L c264
+ L c265
+ L c266
+ L c267
+ L c268
+ L c269
+ L c270
+ L c271
+ L c272
+ L c273
+ L c274
+ L c275
+ L c276
+ L c277
+ L c278
+ L c279
+ L c280
+ L c281
+ L c282
+ L c283
+ L c284
+ L c285
+ L c286
+ L c287
+ L c288
+ L c289
+ L c290
+ L c291
+COLUMNS
+ x1 c37 -1 c52 1
+ x2 c38 -1 c53 1
+ x3 c39 -1 c54 1
+ x4 c40 -1 c55 1
+ x5 c41 -1 c56 1
+ x6 c42 -1 c57 1
+ x7 c43 -1 c58 1
+ x8 c44 -1 c59 1
+ x9 c45 -1 c60 1
+ x10 c46 -1 c61 1
+ x11 c47 -1 c62 1
+ x12 c48 -1 c63 1
+ x13 c49 -1 c64 1
+ x14 c50 -1 c65 1
+ x15 c51 -1 c66 1
+ x16 c47 1 c67 1
+ x17 c48 1 c68 1
+ x18 c49 1 c69 1
+ x19 c50 1 c70 1
+ x20 c51 1 c71 1
+ x21 c37 -1 c47 1
+ x21 c72 1
+ x22 c38 -1 c48 1
+ x22 c73 1
+ x23 c39 -1 c49 1
+ x23 c74 1
+ x24 c40 -1 c50 1
+ x24 c75 1
+ x25 c41 -1 c51 1
+ x25 c76 1
+ x26 c42 -1 c47 1
+ x26 c77 1
+ x27 c43 -1 c48 1
+ x27 c78 1
+ x28 c44 -1 c49 1
+ x28 c79 1
+ x29 c45 -1 c50 1
+ x29 c80 1
+ x30 c46 -1 c51 1
+ x30 c81 1
+ x31 c42 1 c82 1
+ x32 c43 1 c83 1
+ x33 c44 1 c84 1
+ x34 c45 1 c85 1
+ x35 c46 1 c86 1
+ x36 c37 -1 c42 1
+ x36 c87 1
+ x37 c38 -1 c43 1
+ x37 c88 1
+ x38 c39 -1 c44 1
+ x38 c89 1
+ x39 c40 -1 c45 1
+ x39 c90 1
+ x40 c41 -1 c46 1
+ x40 c91 1
+ x41 c42 1 c47 -1
+ x41 c92 1
+ x42 c43 1 c48 -1
+ x42 c93 1
+ x43 c44 1 c49 -1
+ x43 c94 1
+ x44 c45 1 c50 -1
+ x44 c95 1
+ x45 c46 1 c51 -1
+ x45 c96 1
+ x46 c37 1 c97 1
+ x47 c38 1 c98 1
+ x48 c39 1 c99 1
+ x49 c40 1 c100 1
+ x50 c41 1 c101 1
+ x51 c37 1 c42 -1
+ x51 c102 1
+ x52 c38 1 c43 -1
+ x52 c103 1
+ x53 c39 1 c44 -1
+ x53 c104 1
+ x54 c40 1 c45 -1
+ x54 c105 1
+ x55 c41 1 c46 -1
+ x55 c106 1
+ x56 c37 1 c47 -1
+ x56 c107 1
+ x57 c38 1 c48 -1
+ x57 c108 1
+ x58 c39 1 c49 -1
+ x58 c109 1
+ x59 c40 1 c50 -1
+ x59 c110 1
+ x60 c41 1 c51 -1
+ x60 c111 1
+ x61 c47 1 c112 1
+ x62 c48 1 c113 1
+ x63 c49 1 c114 1
+ x64 c50 1 c115 1
+ x65 c51 1 c116 1
+ x66 c37 -1 c47 1
+ x66 c117 1
+ x67 c38 -1 c48 1
+ x67 c118 1
+ x68 c39 -1 c49 1
+ x68 c119 1
+ x69 c40 -1 c50 1
+ x69 c120 1
+ x70 c41 -1 c51 1
+ x70 c121 1
+ x71 c42 -1 c47 1
+ x71 c122 1
+ x72 c43 -1 c48 1
+ x72 c123 1
+ x73 c44 -1 c49 1
+ x73 c124 1
+ x74 c45 -1 c50 1
+ x74 c125 1
+ x75 c46 -1 c51 1
+ x75 c126 1
+ x76 c47 1 c127 1
+ x77 c48 1 c128 1
+ x78 c49 1 c129 1
+ x79 c50 1 c130 1
+ x80 c51 1 c131 1
+ x81 c37 -1 c47 1
+ x81 c132 1
+ x82 c38 -1 c48 1
+ x82 c133 1
+ x83 c39 -1 c49 1
+ x83 c134 1
+ x84 c40 -1 c50 1
+ x84 c135 1
+ x85 c41 -1 c51 1
+ x85 c136 1
+ x86 c42 -1 c47 1
+ x86 c137 1
+ x87 c43 -1 c48 1
+ x87 c138 1
+ x88 c44 -1 c49 1
+ x88 c139 1
+ x89 c45 -1 c50 1
+ x89 c140 1
+ x90 c46 -1 c51 1
+ x90 c141 1
+ x91 c47 1 c142 1
+ x92 c48 1 c143 1
+ x93 c49 1 c144 1
+ x94 c50 1 c145 1
+ x95 c51 1 c146 1
+ x96 c37 -1 c47 1
+ x96 c147 1
+ x97 c38 -1 c48 1
+ x97 c148 1
+ x98 c39 -1 c49 1
+ x98 c149 1
+ x99 c40 -1 c50 1
+ x99 c150 1
+ x100 c41 -1 c51 1
+ x100 c151 1
+ x101 c42 -1 c47 1
+ x101 c152 1
+ x102 c43 -1 c48 1
+ x102 c153 1
+ x103 c44 -1 c49 1
+ x103 c154 1
+ x104 c45 -1 c50 1
+ x104 c155 1
+ x105 c46 -1 c51 1
+ x105 c156 1
+ x106 c42 1 c157 1
+ x107 c43 1 c158 1
+ x108 c44 1 c159 1
+ x109 c45 1 c160 1
+ x110 c46 1 c161 1
+ x111 c37 -1 c42 1
+ x111 c162 1
+ x112 c38 -1 c43 1
+ x112 c163 1
+ x113 c39 -1 c44 1
+ x113 c164 1
+ x114 c40 -1 c45 1
+ x114 c165 1
+ x115 c41 -1 c46 1
+ x115 c166 1
+ x116 c42 1 c47 -1
+ x116 c167 1
+ x117 c43 1 c48 -1
+ x117 c168 1
+ x118 c44 1 c49 -1
+ x118 c169 1
+ x119 c45 1 c50 -1
+ x119 c170 1
+ x120 c46 1 c51 -1
+ x120 c171 1
+ x121 c42 1 c172 1
+ x122 c43 1 c173 1
+ x123 c44 1 c174 1
+ x124 c45 1 c175 1
+ x125 c46 1 c176 1
+ x126 c37 -1 c42 1
+ x126 c177 1
+ x127 c38 -1 c43 1
+ x127 c178 1
+ x128 c39 -1 c44 1
+ x128 c179 1
+ x129 c40 -1 c45 1
+ x129 c180 1
+ x130 c41 -1 c46 1
+ x130 c181 1
+ x131 c42 1 c47 -1
+ x131 c182 1
+ x132 c43 1 c48 -1
+ x132 c183 1
+ x133 c44 1 c49 -1
+ x133 c184 1
+ x134 c45 1 c50 -1
+ x134 c185 1
+ x135 c46 1 c51 -1
+ x135 c186 1
+ x136 c37 1 c187 1
+ x137 c38 1 c188 1
+ x138 c39 1 c189 1
+ x139 c40 1 c190 1
+ x140 c41 1 c191 1
+ x141 c37 1 c42 -1
+ x141 c192 1
+ x142 c38 1 c43 -1
+ x142 c193 1
+ x143 c39 1 c44 -1
+ x143 c194 1
+ x144 c40 1 c45 -1
+ x144 c195 1
+ x145 c41 1 c46 -1
+ x145 c196 1
+ x146 c37 1 c47 -1
+ x146 c197 1
+ x147 c38 1 c48 -1
+ x147 c198 1
+ x148 c39 1 c49 -1
+ x148 c199 1
+ x149 c40 1 c50 -1
+ x149 c200 1
+ x150 c41 1 c51 -1
+ x150 c201 1
+ x151 c37 1 c202 1
+ x152 c38 1 c203 1
+ x153 c39 1 c204 1
+ x154 c40 1 c205 1
+ x155 c41 1 c206 1
+ x156 c37 1 c42 -1
+ x156 c207 1
+ x157 c38 1 c43 -1
+ x157 c208 1
+ x158 c39 1 c44 -1
+ x158 c209 1
+ x159 c40 1 c45 -1
+ x159 c210 1
+ x160 c41 1 c46 -1
+ x160 c211 1
+ x161 c37 1 c47 -1
+ x161 c212 1
+ x162 c38 1 c48 -1
+ x162 c213 1
+ x163 c39 1 c49 -1
+ x163 c214 1
+ x164 c40 1 c50 -1
+ x164 c215 1
+ x165 c41 1 c51 -1
+ x165 c216 1
+ x166 c37 1 c217 1
+ x167 c38 1 c218 1
+ x168 c39 1 c219 1
+ x169 c40 1 c220 1
+ x170 c41 1 c221 1
+ x171 c37 1 c42 -1
+ x171 c222 1
+ x172 c38 1 c43 -1
+ x172 c223 1
+ x173 c39 1 c44 -1
+ x173 c224 1
+ x174 c40 1 c45 -1
+ x174 c225 1
+ x175 c41 1 c46 -1
+ x175 c226 1
+ x176 c37 1 c47 -1
+ x176 c227 1
+ x177 c38 1 c48 -1
+ x177 c228 1
+ x178 c39 1 c49 -1
+ x178 c229 1
+ x179 c40 1 c50 -1
+ x179 c230 1
+ x180 c41 1 c51 -1
+ x180 c231 1
+ x181 c47 1 c232 1
+ x182 c48 1 c233 1
+ x183 c49 1 c234 1
+ x184 c50 1 c235 1
+ x185 c51 1 c236 1
+ x186 c37 -1 c47 1
+ x186 c237 1
+ x187 c38 -1 c48 1
+ x187 c238 1
+ x188 c39 -1 c49 1
+ x188 c239 1
+ x189 c40 -1 c50 1
+ x189 c240 1
+ x190 c41 -1 c51 1
+ x190 c241 1
+ x191 c42 -1 c47 1
+ x191 c242 1
+ x192 c43 -1 c48 1
+ x192 c243 1
+ x193 c44 -1 c49 1
+ x193 c244 1
+ x194 c45 -1 c50 1
+ x194 c245 1
+ x195 c46 -1 c51 1
+ x195 c246 1
+ x196 c37 1 c247 1
+ x197 c38 1 c248 1
+ x198 c39 1 c249 1
+ x199 c40 1 c250 1
+ x200 c41 1 c251 1
+ x201 c37 1 c42 -1
+ x201 c252 1
+ x202 c38 1 c43 -1
+ x202 c253 1
+ x203 c39 1 c44 -1
+ x203 c254 1
+ x204 c40 1 c45 -1
+ x204 c255 1
+ x205 c41 1 c46 -1
+ x205 c256 1
+ x206 c37 1 c47 -1
+ x206 c257 1
+ x207 c38 1 c48 -1
+ x207 c258 1
+ x208 c39 1 c49 -1
+ x208 c259 1
+ x209 c40 1 c50 -1
+ x209 c260 1
+ x210 c41 1 c51 -1
+ x210 c261 1
+ x211 c47 1 c262 1
+ x212 c48 1 c263 1
+ x213 c49 1 c264 1
+ x214 c50 1 c265 1
+ x215 c51 1 c266 1
+ x216 c37 -1 c47 1
+ x216 c267 1
+ x217 c38 -1 c48 1
+ x217 c268 1
+ x218 c39 -1 c49 1
+ x218 c269 1
+ x219 c40 -1 c50 1
+ x219 c270 1
+ x220 c41 -1 c51 1
+ x220 c271 1
+ x221 c42 -1 c47 1
+ x221 c272 1
+ x222 c43 -1 c48 1
+ x222 c273 1
+ x223 c44 -1 c49 1
+ x223 c274 1
+ x224 c45 -1 c50 1
+ x224 c275 1
+ x225 c46 -1 c51 1
+ x225 c276 1
+ x226 c47 1 c277 1
+ x227 c48 1 c278 1
+ x228 c49 1 c279 1
+ x229 c50 1 c280 1
+ x230 c51 1 c281 1
+ x231 c37 -1 c47 1
+ x231 c282 1
+ x232 c38 -1 c48 1
+ x232 c283 1
+ x233 c39 -1 c49 1
+ x233 c284 1
+ x234 c40 -1 c50 1
+ x234 c285 1
+ x235 c41 -1 c51 1
+ x235 c286 1
+ x236 c42 -1 c47 1
+ x236 c287 1
+ x237 c43 -1 c48 1
+ x237 c288 1
+ x238 c44 -1 c49 1
+ x238 c289 1
+ x239 c45 -1 c50 1
+ x239 c290 1
+ x240 c46 -1 c51 1
+ x240 c291 1
+ x241 R0000292 1 c1 1
+ MARK0000 'MARKER' 'INTORG'
+ x242 c1 -5.43 c2 0.22
+ x242 c22 1 c37 -1
+ x242 c52 -7
+ x243 c1 -5.43 c3 0.22
+ x243 c23 1 c38 -1
+ x243 c53 -7
+ x244 c1 -5.43 c4 0.22
+ x244 c24 1 c39 -1
+ x244 c54 -7
+ x245 c1 -5.43 c5 0.22
+ x245 c25 1 c40 -1
+ x245 c55 -7
+ x246 c1 -5.43 c6 0.22
+ x246 c26 1 c41 -1
+ x246 c56 -7
+ x247 c1 -53.78 c2 2.2
+ x247 c27 1 c42 -1
+ x247 c57 -7
+ x248 c1 -53.78 c3 2.2
+ x248 c28 1 c43 -1
+ x248 c58 -7
+ x249 c1 -53.78 c4 2.2
+ x249 c29 1 c44 -1
+ x249 c59 -7
+ x250 c1 -53.78 c5 2.2
+ x250 c30 1 c45 -1
+ x250 c60 -7
+ x251 c1 -53.78 c6 2.2
+ x251 c31 1 c46 -1
+ x251 c61 -7
+ x252 c1 -23.36 c2 0.96
+ x252 c32 1 c47 -1
+ x252 c62 -7
+ x253 c1 -23.36 c3 0.96
+ x253 c33 1 c48 -1
+ x253 c63 -7
+ x254 c1 -23.36 c4 0.96
+ x254 c34 1 c49 -1
+ x254 c64 -7
+ x255 c1 -23.36 c5 0.96
+ x255 c35 1 c50 -1
+ x255 c65 -7
+ x256 c1 -23.36 c6 0.96
+ x256 c36 1 c51 -1
+ x256 c66 -7
+ x257 c1 74.52 c2 3.79
+ x257 c7 1 c32 -1
+ x257 c67 -7
+ x258 c1 74.52 c3 3.79
+ x258 c7 1 c33 -1
+ x258 c68 -7
+ x259 c1 74.52 c4 3.79
+ x259 c7 1 c34 -1
+ x259 c69 -7
+ x260 c1 74.52 c5 3.79
+ x260 c7 1 c35 -1
+ x260 c70 -7
+ x261 c1 74.52 c6 3.79
+ x261 c7 1 c36 -1
+ x261 c71 -7
+ x262 c1 78.87 c2 3.62
+ x262 c7 1 c22 1
+ x262 c32 -1 c37 -1
+ x262 c72 -7
+ x263 c1 78.87 c3 3.62
+ x263 c7 1 c23 1
+ x263 c33 -1 c38 -1
+ x263 c73 -7
+ x264 c1 78.87 c4 3.62
+ x264 c7 1 c24 1
+ x264 c34 -1 c39 -1
+ x264 c74 -7
+ x265 c1 78.87 c5 3.62
+ x265 c7 1 c25 1
+ x265 c35 -1 c40 -1
+ x265 c75 -7
+ x266 c1 78.87 c6 3.62
+ x266 c7 1 c26 1
+ x266 c36 -1 c41 -1
+ x266 c76 -7
+ x267 c1 79.41 c2 3.59
+ x267 c7 1 c27 1
+ x267 c32 -1 c42 -1
+ x267 c77 -7
+ x268 c1 79.41 c3 3.59
+ x268 c7 1 c28 1
+ x268 c33 -1 c43 -1
+ x268 c78 -7
+ x269 c1 79.41 c4 3.59
+ x269 c7 1 c29 1
+ x269 c34 -1 c44 -1
+ x269 c79 -7
+ x270 c1 79.41 c5 3.59
+ x270 c7 1 c30 1
+ x270 c35 -1 c45 -1
+ x270 c80 -7
+ x271 c1 79.41 c6 3.59
+ x271 c7 1 c31 1
+ x271 c36 -1 c46 -1
+ x271 c81 -7
+ x272 c1 84.3 c2 3.39
+ x272 c7 1 c47 -1
+ x273 c1 84.3 c3 3.39
+ x273 c7 1 c48 -1
+ x274 c1 84.3 c4 3.39
+ x274 c7 1 c49 -1
+ x275 c1 84.3 c5 3.39
+ x275 c7 1 c50 -1
+ x276 c1 84.3 c6 3.39
+ x276 c7 1 c51 -1
+ x277 c1 29.18 c2 4.48
+ x277 c8 1 c27 -1
+ x277 c82 -7
+ x278 c1 29.18 c3 4.48
+ x278 c8 1 c28 -1
+ x278 c83 -7
+ x279 c1 29.18 c4 4.48
+ x279 c8 1 c29 -1
+ x279 c84 -7
+ x280 c1 29.18 c5 4.48
+ x280 c8 1 c30 -1
+ x280 c85 -7
+ x281 c1 29.18 c6 4.48
+ x281 c8 1 c31 -1
+ x281 c86 -7
+ x282 c1 38.96 c2 4.08
+ x282 c8 1 c22 1
+ x282 c27 -1 c37 -1
+ x282 c87 -7
+ x283 c1 38.96 c3 4.08
+ x283 c8 1 c23 1
+ x283 c28 -1 c38 -1
+ x283 c88 -7
+ x284 c1 38.96 c4 4.08
+ x284 c8 1 c24 1
+ x284 c29 -1 c39 -1
+ x284 c89 -7
+ x285 c1 38.96 c5 4.08
+ x285 c8 1 c25 1
+ x285 c30 -1 c40 -1
+ x285 c90 -7
+ x286 c1 38.96 c6 4.08
+ x286 c8 1 c26 1
+ x286 c31 -1 c41 -1
+ x286 c91 -7
+ x287 c1 69.92 c2 2.82
+ x287 c8 1 c42 -1
+ x288 c1 69.92 c3 2.82
+ x288 c8 1 c43 -1
+ x289 c1 69.92 c4 2.82
+ x289 c8 1 c44 -1
+ x290 c1 69.92 c5 2.82
+ x290 c8 1 c45 -1
+ x291 c1 69.92 c6 2.82
+ x291 c8 1 c46 -1
+ x292 c1 51.45 c2 3.57
+ x292 c8 1 c27 -1
+ x292 c32 1 c47 -1
+ x292 c92 -7
+ x293 c1 51.45 c3 3.57
+ x293 c8 1 c28 -1
+ x293 c33 1 c48 -1
+ x293 c93 -7
+ x294 c1 51.45 c4 3.57
+ x294 c8 1 c29 -1
+ x294 c34 1 c49 -1
+ x294 c94 -7
+ x295 c1 51.45 c5 3.57
+ x295 c8 1 c30 -1
+ x295 c35 1 c50 -1
+ x295 c95 -7
+ x296 c1 51.45 c6 3.57
+ x296 c8 1 c31 -1
+ x296 c36 1 c51 -1
+ x296 c96 -7
+ x297 c1 120.54 c2 5.19
+ x297 c9 1 c22 -1
+ x297 c97 -7
+ x298 c1 120.54 c3 5.19
+ x298 c9 1 c23 -1
+ x298 c98 -7
+ x299 c1 120.54 c4 5.19
+ x299 c9 1 c24 -1
+ x299 c99 -7
+ x300 c1 120.54 c5 5.19
+ x300 c9 1 c25 -1
+ x300 c100 -7
+ x301 c1 120.54 c6 5.19
+ x301 c9 1 c26 -1
+ x301 c101 -7
+ x302 c1 125.43 c2 4.99
+ x302 c9 1 c37 -1
+ x303 c1 125.43 c3 4.99
+ x303 c9 1 c38 -1
+ x304 c1 125.43 c4 4.99
+ x304 c9 1 c39 -1
+ x305 c1 125.43 c5 4.99
+ x305 c9 1 c40 -1
+ x306 c1 125.43 c6 4.99
+ x306 c9 1 c41 -1
+ x307 c1 108.05 c2 5.71
+ x307 c9 1 c22 -1
+ x307 c27 1 c42 -1
+ x307 c102 -7
+ x308 c1 108.05 c3 5.71
+ x308 c9 1 c23 -1
+ x308 c28 1 c43 -1
+ x308 c103 -7
+ x309 c1 108.05 c4 5.71
+ x309 c9 1 c24 -1
+ x309 c29 1 c44 -1
+ x309 c104 -7
+ x310 c1 108.05 c5 5.71
+ x310 c9 1 c25 -1
+ x310 c30 1 c45 -1
+ x310 c105 -7
+ x311 c1 108.05 c6 5.71
+ x311 c9 1 c26 -1
+ x311 c31 1 c46 -1
+ x311 c106 -7
+ x312 c1 142.82 c2 4.28
+ x312 c9 1 c22 -1
+ x312 c32 1 c47 -1
+ x312 c107 -7
+ x313 c1 142.82 c3 4.28
+ x313 c9 1 c23 -1
+ x313 c33 1 c48 -1
+ x313 c108 -7
+ x314 c1 142.82 c4 4.28
+ x314 c9 1 c24 -1
+ x314 c34 1 c49 -1
+ x314 c109 -7
+ x315 c1 142.82 c5 4.28
+ x315 c9 1 c25 -1
+ x315 c35 1 c50 -1
+ x315 c110 -7
+ x316 c1 142.82 c6 4.28
+ x316 c9 1 c26 -1
+ x316 c36 1 c51 -1
+ x316 c111 -7
+ x317 c1 74.43 c2 4.99
+ x317 c10 1 c32 -1
+ x317 c112 -7
+ x318 c1 74.43 c3 4.99
+ x318 c10 1 c33 -1
+ x318 c113 -7
+ x319 c1 74.43 c4 4.99
+ x319 c10 1 c34 -1
+ x319 c114 -7
+ x320 c1 74.43 c5 4.99
+ x320 c10 1 c35 -1
+ x320 c115 -7
+ x321 c1 74.43 c6 4.99
+ x321 c10 1 c36 -1
+ x321 c116 -7
+ x322 c1 83.13 c2 4.64
+ x322 c10 1 c22 1
+ x322 c32 -1 c37 -1
+ x322 c117 -7
+ x323 c1 83.13 c3 4.64
+ x323 c10 1 c23 1
+ x323 c33 -1 c38 -1
+ x323 c118 -7
+ x324 c1 83.13 c4 4.64
+ x324 c10 1 c24 1
+ x324 c34 -1 c39 -1
+ x324 c119 -7
+ x325 c1 83.13 c5 4.64
+ x325 c10 1 c25 1
+ x325 c35 -1 c40 -1
+ x325 c120 -7
+ x326 c1 83.13 c6 4.64
+ x326 c10 1 c26 1
+ x326 c36 -1 c41 -1
+ x326 c121 -7
+ x327 c1 93.99 c2 4.19
+ x327 c10 1 c27 1
+ x327 c32 -1 c42 -1
+ x327 c122 -7
+ x328 c1 93.99 c3 4.19
+ x328 c10 1 c28 1
+ x328 c33 -1 c43 -1
+ x328 c123 -7
+ x329 c1 93.99 c4 4.19
+ x329 c10 1 c29 1
+ x329 c34 -1 c44 -1
+ x329 c124 -7
+ x330 c1 93.99 c5 4.19
+ x330 c10 1 c30 1
+ x330 c35 -1 c45 -1
+ x330 c125 -7
+ x331 c1 93.99 c6 4.19
+ x331 c10 1 c31 1
+ x331 c36 -1 c46 -1
+ x331 c126 -7
+ x332 c1 96.16 c2 4.11
+ x332 c10 1 c47 -1
+ x333 c1 96.16 c3 4.11
+ x333 c10 1 c48 -1
+ x334 c1 96.16 c4 4.11
+ x334 c10 1 c49 -1
+ x335 c1 96.16 c5 4.11
+ x335 c10 1 c50 -1
+ x336 c1 96.16 c6 4.11
+ x336 c10 1 c51 -1
+ x337 c1 48.09 c2 3.37
+ x337 c11 1 c32 -1
+ x337 c127 -7
+ x338 c1 48.09 c3 3.37
+ x338 c11 1 c33 -1
+ x338 c128 -7
+ x339 c1 48.09 c4 3.37
+ x339 c11 1 c34 -1
+ x339 c129 -7
+ x340 c1 48.09 c5 3.37
+ x340 c11 1 c35 -1
+ x340 c130 -7
+ x341 c1 48.09 c6 3.37
+ x341 c11 1 c36 -1
+ x341 c131 -7
+ x342 c1 56.24 c2 3.04
+ x342 c11 1 c22 1
+ x342 c32 -1 c37 -1
+ x342 c132 -7
+ x343 c1 56.24 c3 3.04
+ x343 c11 1 c23 1
+ x343 c33 -1 c38 -1
+ x343 c133 -7
+ x344 c1 56.24 c4 3.04
+ x344 c11 1 c24 1
+ x344 c34 -1 c39 -1
+ x344 c134 -7
+ x345 c1 56.24 c5 3.04
+ x345 c11 1 c25 1
+ x345 c35 -1 c40 -1
+ x345 c135 -7
+ x346 c1 56.24 c6 3.04
+ x346 c11 1 c26 1
+ x346 c36 -1 c41 -1
+ x346 c136 -7
+ x347 c1 26.9 c2 4.24
+ x347 c11 1 c27 1
+ x347 c32 -1 c42 -1
+ x347 c137 -7
+ x348 c1 26.9 c3 4.24
+ x348 c11 1 c28 1
+ x348 c33 -1 c43 -1
+ x348 c138 -7
+ x349 c1 26.9 c4 4.24
+ x349 c11 1 c29 1
+ x349 c34 -1 c44 -1
+ x349 c139 -7
+ x350 c1 26.9 c5 4.24
+ x350 c11 1 c30 1
+ x350 c35 -1 c45 -1
+ x350 c140 -7
+ x351 c1 26.9 c6 4.24
+ x351 c11 1 c31 1
+ x351 c36 -1 c46 -1
+ x351 c141 -7
+ x352 c1 66.02 c2 2.64
+ x352 c11 1 c47 -1
+ x353 c1 66.02 c3 2.64
+ x353 c11 1 c48 -1
+ x354 c1 66.02 c4 2.64
+ x354 c11 1 c49 -1
+ x355 c1 66.02 c5 2.64
+ x355 c11 1 c50 -1
+ x356 c1 66.02 c6 2.64
+ x356 c11 1 c51 -1
+ x357 c1 94.53 c2 4.17
+ x357 c12 1 c32 -1
+ x357 c142 -7
+ x358 c1 94.53 c3 4.17
+ x358 c12 1 c33 -1
+ x358 c143 -7
+ x359 c1 94.53 c4 4.17
+ x359 c12 1 c34 -1
+ x359 c144 -7
+ x360 c1 94.53 c5 4.17
+ x360 c12 1 c35 -1
+ x360 c145 -7
+ x361 c1 94.53 c6 4.17
+ x361 c12 1 c36 -1
+ x361 c146 -7
+ x362 c1 96.71 c2 4.08
+ x362 c12 1 c22 1
+ x362 c32 -1 c37 -1
+ x362 c147 -7
+ x363 c1 96.71 c3 4.08
+ x363 c12 1 c23 1
+ x363 c33 -1 c38 -1
+ x363 c148 -7
+ x364 c1 96.71 c4 4.08
+ x364 c12 1 c24 1
+ x364 c34 -1 c39 -1
+ x364 c149 -7
+ x365 c1 96.71 c5 4.08
+ x365 c12 1 c25 1
+ x365 c35 -1 c40 -1
+ x365 c150 -7
+ x366 c1 96.71 c6 4.08
+ x366 c12 1 c26 1
+ x366 c36 -1 c41 -1
+ x366 c151 -7
+ x367 c1 93.45 c2 4.22
+ x367 c12 1 c27 1
+ x367 c32 -1 c42 -1
+ x367 c152 -7
+ x368 c1 93.45 c3 4.22
+ x368 c12 1 c28 1
+ x368 c33 -1 c43 -1
+ x368 c153 -7
+ x369 c1 93.45 c4 4.22
+ x369 c12 1 c29 1
+ x369 c34 -1 c44 -1
+ x369 c154 -7
+ x370 c1 93.45 c5 4.22
+ x370 c12 1 c30 1
+ x370 c35 -1 c45 -1
+ x370 c155 -7
+ x371 c1 93.45 c6 4.22
+ x371 c12 1 c31 1
+ x371 c36 -1 c46 -1
+ x371 c156 -7
+ x372 c1 93.99 c2 4.19
+ x372 c12 1 c47 -1
+ x373 c1 93.99 c3 4.19
+ x373 c12 1 c48 -1
+ x374 c1 93.99 c4 4.19
+ x374 c12 1 c49 -1
+ x375 c1 93.99 c5 4.19
+ x375 c12 1 c50 -1
+ x376 c1 93.99 c6 4.19
+ x376 c12 1 c51 -1
+ x377 c1 22.76 c2 5.08
+ x377 c13 1 c27 -1
+ x377 c157 -7
+ x378 c1 22.76 c3 5.08
+ x378 c13 1 c28 -1
+ x378 c158 -7
+ x379 c1 22.76 c4 5.08
+ x379 c13 1 c29 -1
+ x379 c159 -7
+ x380 c1 22.76 c5 5.08
+ x380 c13 1 c30 -1
+ x380 c160 -7
+ x381 c1 22.76 c6 5.08
+ x381 c13 1 c31 -1
+ x381 c161 -7
+ x382 c1 37.97 c2 4.46
+ x382 c13 1 c22 1
+ x382 c27 -1 c37 -1
+ x382 c162 -7
+ x383 c1 37.97 c3 4.46
+ x383 c13 1 c23 1
+ x383 c28 -1 c38 -1
+ x383 c163 -7
+ x384 c1 37.97 c4 4.46
+ x384 c13 1 c24 1
+ x384 c29 -1 c39 -1
+ x384 c164 -7
+ x385 c1 37.97 c5 4.46
+ x385 c13 1 c25 1
+ x385 c30 -1 c40 -1
+ x385 c165 -7
+ x386 c1 37.97 c6 4.46
+ x386 c13 1 c26 1
+ x386 c31 -1 c41 -1
+ x386 c166 -7
+ x387 c1 74.91 c2 2.95
+ x387 c13 1 c42 -1
+ x388 c1 74.91 c3 2.95
+ x388 c13 1 c43 -1
+ x389 c1 74.91 c4 2.95
+ x389 c13 1 c44 -1
+ x390 c1 74.91 c5 2.95
+ x390 c13 1 c45 -1
+ x391 c1 74.91 c6 2.95
+ x391 c13 1 c46 -1
+ x392 c1 47.75 c2 4.06
+ x392 c13 1 c27 -1
+ x392 c32 1 c47 -1
+ x392 c167 -7
+ x393 c1 47.75 c3 4.06
+ x393 c13 1 c28 -1
+ x393 c33 1 c48 -1
+ x393 c168 -7
+ x394 c1 47.75 c4 4.06
+ x394 c13 1 c29 -1
+ x394 c34 1 c49 -1
+ x394 c169 -7
+ x395 c1 47.75 c5 4.06
+ x395 c13 1 c30 -1
+ x395 c35 1 c50 -1
+ x395 c170 -7
+ x396 c1 47.75 c6 4.06
+ x396 c13 1 c31 -1
+ x396 c36 1 c51 -1
+ x396 c171 -7
+ x397 c1 85.38 c2 3.99
+ x397 c14 1 c27 -1
+ x397 c172 -7
+ x398 c1 85.38 c3 3.99
+ x398 c14 1 c28 -1
+ x398 c173 -7
+ x399 c1 85.38 c4 3.99
+ x399 c14 1 c29 -1
+ x399 c174 -7
+ x400 c1 85.38 c5 3.99
+ x400 c14 1 c30 -1
+ x400 c175 -7
+ x401 c1 85.38 c6 3.99
+ x401 c14 1 c31 -1
+ x401 c176 -7
+ x402 c1 86.47 c2 3.95
+ x402 c14 1 c22 1
+ x402 c27 -1 c37 -1
+ x402 c177 -7
+ x403 c1 86.47 c3 3.95
+ x403 c14 1 c23 1
+ x403 c28 -1 c38 -1
+ x403 c178 -7
+ x404 c1 86.47 c4 3.95
+ x404 c14 1 c24 1
+ x404 c29 -1 c39 -1
+ x404 c179 -7
+ x405 c1 86.47 c5 3.95
+ x405 c14 1 c25 1
+ x405 c30 -1 c40 -1
+ x405 c180 -7
+ x406 c1 86.47 c6 3.95
+ x406 c14 1 c26 1
+ x406 c31 -1 c41 -1
+ x406 c181 -7
+ x407 c1 90.27 c2 3.79
+ x407 c14 1 c42 -1
+ x408 c1 90.27 c3 3.79
+ x408 c14 1 c43 -1
+ x409 c1 90.27 c4 3.79
+ x409 c14 1 c44 -1
+ x410 c1 90.27 c5 3.79
+ x410 c14 1 c45 -1
+ x411 c1 90.27 c6 3.79
+ x411 c14 1 c46 -1
+ x412 c1 76.69 c2 4.35
+ x412 c14 1 c27 -1
+ x412 c32 1 c47 -1
+ x412 c182 -7
+ x413 c1 76.69 c3 4.35
+ x413 c14 1 c28 -1
+ x413 c33 1 c48 -1
+ x413 c183 -7
+ x414 c1 76.69 c4 4.35
+ x414 c14 1 c29 -1
+ x414 c34 1 c49 -1
+ x414 c184 -7
+ x415 c1 76.69 c5 4.35
+ x415 c14 1 c30 -1
+ x415 c35 1 c50 -1
+ x415 c185 -7
+ x416 c1 76.69 c6 4.35
+ x416 c14 1 c31 -1
+ x416 c36 1 c51 -1
+ x416 c186 -7
+ x417 c1 87.17 c2 3.46
+ x417 c15 1 c22 -1
+ x417 c187 -7
+ x418 c1 87.17 c3 3.46
+ x418 c15 1 c23 -1
+ x418 c188 -7
+ x419 c1 87.17 c4 3.46
+ x419 c15 1 c24 -1
+ x419 c189 -7
+ x420 c1 87.17 c5 3.46
+ x420 c15 1 c25 -1
+ x420 c190 -7
+ x421 c1 87.17 c6 3.46
+ x421 c15 1 c26 -1
+ x421 c191 -7
+ x422 c1 83.37 c2 3.62
+ x422 c15 1 c37 -1
+ x423 c1 83.37 c3 3.62
+ x423 c15 1 c38 -1
+ x424 c1 83.37 c4 3.62
+ x424 c15 1 c39 -1
+ x425 c1 83.37 c5 3.62
+ x425 c15 1 c40 -1
+ x426 c1 83.37 c6 3.62
+ x426 c15 1 c41 -1
+ x427 c1 38.27 c2 5.46
+ x427 c15 1 c22 -1
+ x427 c27 1 c42 -1
+ x427 c192 -7
+ x428 c1 38.27 c3 5.46
+ x428 c15 1 c23 -1
+ x428 c28 1 c43 -1
+ x428 c193 -7
+ x429 c1 38.27 c4 5.46
+ x429 c15 1 c24 -1
+ x429 c29 1 c44 -1
+ x429 c194 -7
+ x430 c1 38.27 c5 5.46
+ x430 c15 1 c25 -1
+ x430 c30 1 c45 -1
+ x430 c195 -7
+ x431 c1 38.27 c6 5.46
+ x431 c15 1 c26 -1
+ x431 c31 1 c46 -1
+ x431 c196 -7
+ x432 c1 75.76 c2 3.93
+ x432 c15 1 c22 -1
+ x432 c32 1 c47 -1
+ x432 c197 -7
+ x433 c1 75.76 c3 3.93
+ x433 c15 1 c23 -1
+ x433 c33 1 c48 -1
+ x433 c198 -7
+ x434 c1 75.76 c4 3.93
+ x434 c15 1 c24 -1
+ x434 c34 1 c49 -1
+ x434 c199 -7
+ x435 c1 75.76 c5 3.93
+ x435 c15 1 c25 -1
+ x435 c35 1 c50 -1
+ x435 c200 -7
+ x436 c1 75.76 c6 3.93
+ x436 c15 1 c26 -1
+ x436 c36 1 c51 -1
+ x436 c201 -7
+ x437 c1 69.51 c2 2.13
+ x437 c16 1 c22 -1
+ x437 c202 -7
+ x438 c1 69.51 c3 2.13
+ x438 c16 1 c23 -1
+ x438 c203 -7
+ x439 c1 69.51 c4 2.13
+ x439 c16 1 c24 -1
+ x439 c204 -7
+ x440 c1 69.51 c5 2.13
+ x440 c16 1 c25 -1
+ x440 c205 -7
+ x441 c1 69.51 c6 2.13
+ x441 c16 1 c26 -1
+ x441 c206 -7
+ x442 c1 65.71 c2 2.28
+ x442 c16 1 c37 -1
+ x443 c1 65.71 c3 2.28
+ x443 c16 1 c38 -1
+ x444 c1 65.71 c4 2.28
+ x444 c16 1 c39 -1
+ x445 c1 65.71 c5 2.28
+ x445 c16 1 c40 -1
+ x446 c1 65.71 c6 2.28
+ x446 c16 1 c41 -1
+ x447 c1 20.62 c2 4.13
+ x447 c16 1 c22 -1
+ x447 c27 1 c42 -1
+ x447 c207 -7
+ x448 c1 20.62 c3 4.13
+ x448 c16 1 c23 -1
+ x448 c28 1 c43 -1
+ x448 c208 -7
+ x449 c1 20.62 c4 4.13
+ x449 c16 1 c24 -1
+ x449 c29 1 c44 -1
+ x449 c209 -7
+ x450 c1 20.62 c5 4.13
+ x450 c16 1 c25 -1
+ x450 c30 1 c45 -1
+ x450 c210 -7
+ x451 c1 20.62 c6 4.13
+ x451 c16 1 c26 -1
+ x451 c31 1 c46 -1
+ x451 c211 -7
+ x452 c1 53.22 c2 2.79
+ x452 c16 1 c22 -1
+ x452 c32 1 c47 -1
+ x452 c212 -7
+ x453 c1 53.22 c3 2.79
+ x453 c16 1 c23 -1
+ x453 c33 1 c48 -1
+ x453 c213 -7
+ x454 c1 53.22 c4 2.79
+ x454 c16 1 c24 -1
+ x454 c34 1 c49 -1
+ x454 c214 -7
+ x455 c1 53.22 c5 2.79
+ x455 c16 1 c25 -1
+ x455 c35 1 c50 -1
+ x455 c215 -7
+ x456 c1 53.22 c6 2.79
+ x456 c16 1 c26 -1
+ x456 c36 1 c51 -1
+ x456 c216 -7
+ x457 c1 87.47 c2 4.46
+ x457 c17 1 c22 -1
+ x457 c217 -7
+ x458 c1 87.47 c3 4.46
+ x458 c17 1 c23 -1
+ x458 c218 -7
+ x459 c1 87.47 c4 4.46
+ x459 c17 1 c24 -1
+ x459 c219 -7
+ x460 c1 87.47 c5 4.46
+ x460 c17 1 c25 -1
+ x460 c220 -7
+ x461 c1 87.47 c6 4.46
+ x461 c17 1 c26 -1
+ x461 c221 -7
+ x462 c1 95.08 c2 4.15
+ x462 c17 1 c37 -1
+ x463 c1 95.08 c3 4.15
+ x463 c17 1 c38 -1
+ x464 c1 95.08 c4 4.15
+ x464 c17 1 c39 -1
+ x465 c1 95.08 c5 4.15
+ x465 c17 1 c40 -1
+ x466 c1 95.08 c6 4.15
+ x466 c17 1 c41 -1
+ x467 c1 39.66 c2 6.42
+ x467 c17 1 c22 -1
+ x467 c27 1 c42 -1
+ x467 c222 -7
+ x468 c1 39.66 c3 6.42
+ x468 c17 1 c23 -1
+ x468 c28 1 c43 -1
+ x468 c223 -7
+ x469 c1 39.66 c4 6.42
+ x469 c17 1 c24 -1
+ x469 c29 1 c44 -1
+ x469 c224 -7
+ x470 c1 39.66 c5 6.42
+ x470 c17 1 c25 -1
+ x470 c30 1 c45 -1
+ x470 c225 -7
+ x471 c1 39.66 c6 6.42
+ x471 c17 1 c26 -1
+ x471 c31 1 c46 -1
+ x471 c226 -7
+ x472 c1 76.06 c2 4.93
+ x472 c17 1 c22 -1
+ x472 c32 1 c47 -1
+ x472 c227 -7
+ x473 c1 76.06 c3 4.93
+ x473 c17 1 c23 -1
+ x473 c33 1 c48 -1
+ x473 c228 -7
+ x474 c1 76.06 c4 4.93
+ x474 c17 1 c24 -1
+ x474 c34 1 c49 -1
+ x474 c229 -7
+ x475 c1 76.06 c5 4.93
+ x475 c17 1 c25 -1
+ x475 c35 1 c50 -1
+ x475 c230 -7
+ x476 c1 76.06 c6 4.93
+ x476 c17 1 c26 -1
+ x476 c36 1 c51 -1
+ x476 c231 -7
+ x477 c1 43.98 c2 3.17
+ x477 c18 1 c32 -1
+ x477 c232 -7
+ x478 c1 43.98 c3 3.17
+ x478 c18 1 c33 -1
+ x478 c233 -7
+ x479 c1 43.98 c4 3.17
+ x479 c18 1 c34 -1
+ x479 c234 -7
+ x480 c1 43.98 c5 3.17
+ x480 c18 1 c35 -1
+ x480 c235 -7
+ x481 c1 43.98 c6 3.17
+ x481 c18 1 c36 -1
+ x481 c236 -7
+ x482 c1 46.7 c2 3.06
+ x482 c18 1 c22 1
+ x482 c32 -1 c37 -1
+ x482 c237 -7
+ x483 c1 46.7 c3 3.06
+ x483 c18 1 c23 1
+ x483 c33 -1 c38 -1
+ x483 c238 -7
+ x484 c1 46.7 c4 3.06
+ x484 c18 1 c24 1
+ x484 c34 -1 c39 -1
+ x484 c239 -7
+ x485 c1 46.7 c5 3.06
+ x485 c18 1 c25 1
+ x485 c35 -1 c40 -1
+ x485 c240 -7
+ x486 c1 46.7 c6 3.06
+ x486 c18 1 c26 1
+ x486 c36 -1 c41 -1
+ x486 c241 -7
+ x487 c1 29.31 c2 3.77
+ x487 c18 1 c27 1
+ x487 c32 -1 c42 -1
+ x487 c242 -7
+ x488 c1 29.31 c3 3.77
+ x488 c18 1 c28 1
+ x488 c33 -1 c43 -1
+ x488 c243 -7
+ x489 c1 29.31 c4 3.77
+ x489 c18 1 c29 1
+ x489 c34 -1 c44 -1
+ x489 c244 -7
+ x490 c1 29.31 c5 3.77
+ x490 c18 1 c30 1
+ x490 c35 -1 c45 -1
+ x490 c245 -7
+ x491 c1 29.31 c6 3.77
+ x491 c18 1 c31 1
+ x491 c36 -1 c46 -1
+ x491 c246 -7
+ x492 c1 65.71 c2 2.28
+ x492 c18 1 c47 -1
+ x493 c1 65.71 c3 2.28
+ x493 c18 1 c48 -1
+ x494 c1 65.71 c4 2.28
+ x494 c18 1 c49 -1
+ x495 c1 65.71 c5 2.28
+ x495 c18 1 c50 -1
+ x496 c1 65.71 c6 2.28
+ x496 c18 1 c51 -1
+ x497 c1 68.29 c2 2.88
+ x497 c19 1 c22 -1
+ x497 c247 -7
+ x498 c1 68.29 c3 2.88
+ x498 c19 1 c23 -1
+ x498 c248 -7
+ x499 c1 68.29 c4 2.88
+ x499 c19 1 c24 -1
+ x499 c249 -7
+ x500 c1 68.29 c5 2.88
+ x500 c19 1 c25 -1
+ x500 c250 -7
+ x501 c1 68.29 c6 2.88
+ x501 c19 1 c26 -1
+ x501 c251 -7
+ x502 c1 71.01 c2 2.77
+ x502 c19 1 c37 -1
+ x503 c1 71.01 c3 2.77
+ x503 c19 1 c38 -1
+ x504 c1 71.01 c4 2.77
+ x504 c19 1 c39 -1
+ x505 c1 71.01 c5 2.77
+ x505 c19 1 c40 -1
+ x506 c1 71.01 c6 2.77
+ x506 c19 1 c41 -1
+ x507 c1 40.59 c2 4.02
+ x507 c19 1 c22 -1
+ x507 c27 1 c42 -1
+ x507 c252 -7
+ x508 c1 40.59 c3 4.02
+ x508 c19 1 c23 -1
+ x508 c28 1 c43 -1
+ x508 c253 -7
+ x509 c1 40.59 c4 4.02
+ x509 c19 1 c24 -1
+ x509 c29 1 c44 -1
+ x509 c254 -7
+ x510 c1 40.59 c5 4.02
+ x510 c19 1 c25 -1
+ x510 c30 1 c45 -1
+ x510 c255 -7
+ x511 c1 40.59 c6 4.02
+ x511 c19 1 c26 -1
+ x511 c31 1 c46 -1
+ x511 c256 -7
+ x512 c1 52 c2 3.55
+ x512 c19 1 c22 -1
+ x512 c32 1 c47 -1
+ x512 c257 -7
+ x513 c1 52 c3 3.55
+ x513 c19 1 c23 -1
+ x513 c33 1 c48 -1
+ x513 c258 -7
+ x514 c1 52 c4 3.55
+ x514 c19 1 c24 -1
+ x514 c34 1 c49 -1
+ x514 c259 -7
+ x515 c1 52 c5 3.55
+ x515 c19 1 c25 -1
+ x515 c35 1 c50 -1
+ x515 c260 -7
+ x516 c1 52 c6 3.55
+ x516 c19 1 c26 -1
+ x516 c36 1 c51 -1
+ x516 c261 -7
+ x517 c1 64.59 c2 3.37
+ x517 c20 1 c32 -1
+ x517 c262 -7
+ x518 c1 64.59 c3 3.37
+ x518 c20 1 c33 -1
+ x518 c263 -7
+ x519 c1 64.59 c4 3.37
+ x519 c20 1 c34 -1
+ x519 c264 -7
+ x520 c1 64.59 c5 3.37
+ x520 c20 1 c35 -1
+ x520 c265 -7
+ x521 c1 64.59 c6 3.37
+ x521 c20 1 c36 -1
+ x521 c266 -7
+ x522 c1 62.96 c2 3.44
+ x522 c20 1 c22 1
+ x522 c32 -1 c37 -1
+ x522 c267 -7
+ x523 c1 62.96 c3 3.44
+ x523 c20 1 c23 1
+ x523 c33 -1 c38 -1
+ x523 c268 -7
+ x524 c1 62.96 c4 3.44
+ x524 c20 1 c24 1
+ x524 c34 -1 c39 -1
+ x524 c269 -7
+ x525 c1 62.96 c5 3.44
+ x525 c20 1 c25 1
+ x525 c35 -1 c40 -1
+ x525 c270 -7
+ x526 c1 62.96 c6 3.44
+ x526 c20 1 c26 1
+ x526 c36 -1 c41 -1
+ x526 c271 -7
+ x527 c1 29.82 c2 4.79
+ x527 c20 1 c27 1
+ x527 c32 -1 c42 -1
+ x527 c272 -7
+ x528 c1 29.82 c3 4.79
+ x528 c20 1 c28 1
+ x528 c33 -1 c43 -1
+ x528 c273 -7
+ x529 c1 29.82 c4 4.79
+ x529 c20 1 c29 1
+ x529 c34 -1 c44 -1
+ x529 c274 -7
+ x530 c1 29.82 c5 4.79
+ x530 c20 1 c30 1
+ x530 c35 -1 c45 -1
+ x530 c275 -7
+ x531 c1 29.82 c6 4.79
+ x531 c20 1 c31 1
+ x531 c36 -1 c46 -1
+ x531 c276 -7
+ x532 c1 74.91 c2 2.95
+ x532 c20 1 c47 -1
+ x533 c1 74.91 c3 2.95
+ x533 c20 1 c48 -1
+ x534 c1 74.91 c4 2.95
+ x534 c20 1 c49 -1
+ x535 c1 74.91 c5 2.95
+ x535 c20 1 c50 -1
+ x536 c1 74.91 c6 2.95
+ x536 c20 1 c51 -1
+ x537 c1 62.18 c2 4.48
+ x537 c21 1 c32 -1
+ x537 c277 -7
+ x538 c1 62.18 c3 4.48
+ x538 c21 1 c33 -1
+ x538 c278 -7
+ x539 c1 62.18 c4 4.48
+ x539 c21 1 c34 -1
+ x539 c279 -7
+ x540 c1 62.18 c5 4.48
+ x540 c21 1 c35 -1
+ x540 c280 -7
+ x541 c1 62.18 c6 4.48
+ x541 c21 1 c36 -1
+ x541 c281 -7
+ x542 c1 67.07 c2 4.28
+ x542 c21 1 c22 1
+ x542 c32 -1 c37 -1
+ x542 c282 -7
+ x543 c1 67.07 c3 4.28
+ x543 c21 1 c23 1
+ x543 c33 -1 c38 -1
+ x543 c283 -7
+ x544 c1 67.07 c4 4.28
+ x544 c21 1 c24 1
+ x544 c34 -1 c39 -1
+ x544 c284 -7
+ x545 c1 67.07 c5 4.28
+ x545 c21 1 c25 1
+ x545 c35 -1 c40 -1
+ x545 c285 -7
+ x546 c1 67.07 c6 4.28
+ x546 c21 1 c26 1
+ x546 c36 -1 c41 -1
+ x546 c286 -7
+ x547 c1 49.68 c2 4.99
+ x547 c21 1 c27 1
+ x547 c32 -1 c42 -1
+ x547 c287 -7
+ x548 c1 49.68 c3 4.99
+ x548 c21 1 c28 1
+ x548 c33 -1 c43 -1
+ x548 c288 -7
+ x549 c1 49.68 c4 4.99
+ x549 c21 1 c29 1
+ x549 c34 -1 c44 -1
+ x549 c289 -7
+ x550 c1 49.68 c5 4.99
+ x550 c21 1 c30 1
+ x550 c35 -1 c45 -1
+ x550 c290 -7
+ x551 c1 49.68 c6 4.99
+ x551 c21 1 c31 1
+ x551 c36 -1 c46 -1
+ x551 c291 -7
+ x552 c1 84.45 c2 3.57
+ x552 c21 1 c47 -1
+ x553 c1 84.45 c3 3.57
+ x553 c21 1 c48 -1
+ x554 c1 84.45 c4 3.57
+ x554 c21 1 c49 -1
+ x555 c1 84.45 c5 3.57
+ x555 c21 1 c50 -1
+ x556 c1 84.45 c6 3.57
+ x556 c21 1 c51 -1
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ rhs c1 2375.25 c2 12.5
+ rhs c3 12.5 c4 12.5
+ rhs c5 12.5 c6 12.5
+ rhs c7 1 c8 1
+ rhs c9 2 c10 1
+ rhs c11 1 c12 1
+ rhs c13 1 c14 1
+ rhs c15 1 c16 1
+ rhs c17 1 c18 1
+ rhs c19 1 c20 1
+ rhs c21 1
+BOUNDS
+ FR bnd x241
+ UP bnd x242 1
+ UP bnd x243 1
+ UP bnd x244 1
+ UP bnd x245 1
+ UP bnd x246 1
+ UP bnd x247 1
+ UP bnd x248 1
+ UP bnd x249 1
+ UP bnd x250 1
+ UP bnd x251 1
+ UP bnd x252 1
+ UP bnd x253 1
+ UP bnd x254 1
+ UP bnd x255 1
+ UP bnd x256 1
+ UP bnd x257 1
+ UP bnd x258 1
+ UP bnd x259 1
+ UP bnd x260 1
+ UP bnd x261 1
+ UP bnd x262 1
+ UP bnd x263 1
+ UP bnd x264 1
+ UP bnd x265 1
+ UP bnd x266 1
+ UP bnd x267 1
+ UP bnd x268 1
+ UP bnd x269 1
+ UP bnd x270 1
+ UP bnd x271 1
+ UP bnd x272 1
+ UP bnd x273 1
+ UP bnd x274 1
+ UP bnd x275 1
+ UP bnd x276 1
+ UP bnd x277 1
+ UP bnd x278 1
+ UP bnd x279 1
+ UP bnd x280 1
+ UP bnd x281 1
+ UP bnd x282 1
+ UP bnd x283 1
+ UP bnd x284 1
+ UP bnd x285 1
+ UP bnd x286 1
+ UP bnd x287 1
+ UP bnd x288 1
+ UP bnd x289 1
+ UP bnd x290 1
+ UP bnd x291 1
+ UP bnd x292 1
+ UP bnd x293 1
+ UP bnd x294 1
+ UP bnd x295 1
+ UP bnd x296 1
+ UP bnd x297 1
+ UP bnd x298 1
+ UP bnd x299 1
+ UP bnd x300 1
+ UP bnd x301 1
+ UP bnd x302 2
+ UP bnd x303 2
+ UP bnd x304 2
+ UP bnd x305 2
+ UP bnd x306 2
+ UP bnd x307 2
+ UP bnd x308 2
+ UP bnd x309 2
+ UP bnd x310 2
+ UP bnd x311 2
+ UP bnd x312 2
+ UP bnd x313 2
+ UP bnd x314 2
+ UP bnd x315 2
+ UP bnd x316 2
+ UP bnd x317 1
+ UP bnd x318 1
+ UP bnd x319 1
+ UP bnd x320 1
+ UP bnd x321 1
+ UP bnd x322 1
+ UP bnd x323 1
+ UP bnd x324 1
+ UP bnd x325 1
+ UP bnd x326 1
+ UP bnd x327 1
+ UP bnd x328 1
+ UP bnd x329 1
+ UP bnd x330 1
+ UP bnd x331 1
+ UP bnd x332 1
+ UP bnd x333 1
+ UP bnd x334 1
+ UP bnd x335 1
+ UP bnd x336 1
+ UP bnd x337 1
+ UP bnd x338 1
+ UP bnd x339 1
+ UP bnd x340 1
+ UP bnd x341 1
+ UP bnd x342 1
+ UP bnd x343 1
+ UP bnd x344 1
+ UP bnd x345 1
+ UP bnd x346 1
+ UP bnd x347 1
+ UP bnd x348 1
+ UP bnd x349 1
+ UP bnd x350 1
+ UP bnd x351 1
+ UP bnd x352 1
+ UP bnd x353 1
+ UP bnd x354 1
+ UP bnd x355 1
+ UP bnd x356 1
+ UP bnd x357 1
+ UP bnd x358 1
+ UP bnd x359 1
+ UP bnd x360 1
+ UP bnd x361 1
+ UP bnd x362 1
+ UP bnd x363 1
+ UP bnd x364 1
+ UP bnd x365 1
+ UP bnd x366 1
+ UP bnd x367 1
+ UP bnd x368 1
+ UP bnd x369 1
+ UP bnd x370 1
+ UP bnd x371 1
+ UP bnd x372 1
+ UP bnd x373 1
+ UP bnd x374 1
+ UP bnd x375 1
+ UP bnd x376 1
+ UP bnd x377 1
+ UP bnd x378 1
+ UP bnd x379 1
+ UP bnd x380 1
+ UP bnd x381 1
+ UP bnd x382 1
+ UP bnd x383 1
+ UP bnd x384 1
+ UP bnd x385 1
+ UP bnd x386 1
+ UP bnd x387 1
+ UP bnd x388 1
+ UP bnd x389 1
+ UP bnd x390 1
+ UP bnd x391 1
+ UP bnd x392 1
+ UP bnd x393 1
+ UP bnd x394 1
+ UP bnd x395 1
+ UP bnd x396 1
+ UP bnd x397 1
+ UP bnd x398 1
+ UP bnd x399 1
+ UP bnd x400 1
+ UP bnd x401 1
+ UP bnd x402 1
+ UP bnd x403 1
+ UP bnd x404 1
+ UP bnd x405 1
+ UP bnd x406 1
+ UP bnd x407 1
+ UP bnd x408 1
+ UP bnd x409 1
+ UP bnd x410 1
+ UP bnd x411 1
+ UP bnd x412 1
+ UP bnd x413 1
+ UP bnd x414 1
+ UP bnd x415 1
+ UP bnd x416 1
+ UP bnd x417 1
+ UP bnd x418 1
+ UP bnd x419 1
+ UP bnd x420 1
+ UP bnd x421 1
+ UP bnd x422 1
+ UP bnd x423 1
+ UP bnd x424 1
+ UP bnd x425 1
+ UP bnd x426 1
+ UP bnd x427 1
+ UP bnd x428 1
+ UP bnd x429 1
+ UP bnd x430 1
+ UP bnd x431 1
+ UP bnd x432 1
+ UP bnd x433 1
+ UP bnd x434 1
+ UP bnd x435 1
+ UP bnd x436 1
+ UP bnd x437 1
+ UP bnd x438 1
+ UP bnd x439 1
+ UP bnd x440 1
+ UP bnd x441 1
+ UP bnd x442 1
+ UP bnd x443 1
+ UP bnd x444 1
+ UP bnd x445 1
+ UP bnd x446 1
+ UP bnd x447 1
+ UP bnd x448 1
+ UP bnd x449 1
+ UP bnd x450 1
+ UP bnd x451 1
+ UP bnd x452 1
+ UP bnd x453 1
+ UP bnd x454 1
+ UP bnd x455 1
+ UP bnd x456 1
+ UP bnd x457 1
+ UP bnd x458 1
+ UP bnd x459 1
+ UP bnd x460 1
+ UP bnd x461 1
+ UP bnd x462 1
+ UP bnd x463 1
+ UP bnd x464 1
+ UP bnd x465 1
+ UP bnd x466 1
+ UP bnd x467 1
+ UP bnd x468 1
+ UP bnd x469 1
+ UP bnd x470 1
+ UP bnd x471 1
+ UP bnd x472 1
+ UP bnd x473 1
+ UP bnd x474 1
+ UP bnd x475 1
+ UP bnd x476 1
+ UP bnd x477 1
+ UP bnd x478 1
+ UP bnd x479 1
+ UP bnd x480 1
+ UP bnd x481 1
+ UP bnd x482 1
+ UP bnd x483 1
+ UP bnd x484 1
+ UP bnd x485 1
+ UP bnd x486 1
+ UP bnd x487 1
+ UP bnd x488 1
+ UP bnd x489 1
+ UP bnd x490 1
+ UP bnd x491 1
+ UP bnd x492 1
+ UP bnd x493 1
+ UP bnd x494 1
+ UP bnd x495 1
+ UP bnd x496 1
+ UP bnd x497 1
+ UP bnd x498 1
+ UP bnd x499 1
+ UP bnd x500 1
+ UP bnd x501 1
+ UP bnd x502 1
+ UP bnd x503 1
+ UP bnd x504 1
+ UP bnd x505 1
+ UP bnd x506 1
+ UP bnd x507 1
+ UP bnd x508 1
+ UP bnd x509 1
+ UP bnd x510 1
+ UP bnd x511 1
+ UP bnd x512 1
+ UP bnd x513 1
+ UP bnd x514 1
+ UP bnd x515 1
+ UP bnd x516 1
+ UP bnd x517 1
+ UP bnd x518 1
+ UP bnd x519 1
+ UP bnd x520 1
+ UP bnd x521 1
+ UP bnd x522 1
+ UP bnd x523 1
+ UP bnd x524 1
+ UP bnd x525 1
+ UP bnd x526 1
+ UP bnd x527 1
+ UP bnd x528 1
+ UP bnd x529 1
+ UP bnd x530 1
+ UP bnd x531 1
+ UP bnd x532 1
+ UP bnd x533 1
+ UP bnd x534 1
+ UP bnd x535 1
+ UP bnd x536 1
+ UP bnd x537 1
+ UP bnd x538 1
+ UP bnd x539 1
+ UP bnd x540 1
+ UP bnd x541 1
+ UP bnd x542 1
+ UP bnd x543 1
+ UP bnd x544 1
+ UP bnd x545 1
+ UP bnd x546 1
+ UP bnd x547 1
+ UP bnd x548 1
+ UP bnd x549 1
+ UP bnd x550 1
+ UP bnd x551 1
+ UP bnd x552 1
+ UP bnd x553 1
+ UP bnd x554 1
+ UP bnd x555 1
+ UP bnd x556 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sample.mps b/demos/ppl_lpsol/examples/sample.mps
new file mode 100644
index 0000000..da97e46
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sample.mps
@@ -0,0 +1,24 @@
+* Problem: sample
+* Class: LP
+* Rows: 4
+* Columns: 3
+* Non-zeros: 12
+* Format: Free MPS
+*
+NAME sample
+ROWS
+ N R______0
+ L p
+ L q
+ L r
+COLUMNS
+ x1 R______0 -10 p 1
+ x1 q 10 r 2
+ x2 R______0 -6 p 1
+ x2 q 4 r 2
+ x3 R______0 -4 p 1
+ x3 q 5 r 6
+RHS
+ RHS1 p 100 q 600
+ RHS1 r 300
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc105.mps b/demos/ppl_lpsol/examples/sc105.mps
new file mode 100644
index 0000000..4de391e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc105.mps
@@ -0,0 +1,296 @@
+NAME SC105
+ROWS
+ N MAXIM
+ L ROW00001
+ L ROW00002
+ L ROW00003
+ E ROW00004
+ E ROW00005
+ E ROW00006
+ E ROW00007
+ L ROW00008
+ L ROW00009
+ L ROW00010
+ L ROW00011
+ L ROW00012
+ L ROW00013
+ E ROW00014
+ E ROW00015
+ E ROW00016
+ E ROW00017
+ E ROW00018
+ L ROW00019
+ L ROW00020
+ L ROW00021
+ L ROW00022
+ L ROW00023
+ L ROW00024
+ E ROW00025
+ E ROW00026
+ E ROW00027
+ E ROW00028
+ E ROW00029
+ L ROW00030
+ L ROW00031
+ L ROW00032
+ L ROW00033
+ L ROW00034
+ L ROW00035
+ E ROW00036
+ E ROW00037
+ E ROW00038
+ E ROW00039
+ E ROW00040
+ L ROW00041
+ L ROW00042
+ L ROW00043
+ L ROW00044
+ L ROW00045
+ L ROW00046
+ E ROW00047
+ E ROW00048
+ E ROW00049
+ E ROW00050
+ E ROW00051
+ L ROW00052
+ L ROW00053
+ L ROW00054
+ L ROW00055
+ L ROW00056
+ L ROW00057
+ E ROW00058
+ E ROW00059
+ E ROW00060
+ E ROW00061
+ E ROW00062
+ L ROW00063
+ L ROW00064
+ L ROW00065
+ L ROW00066
+ L ROW00067
+ L ROW00068
+ E ROW00069
+ E ROW00070
+ E ROW00071
+ E ROW00072
+ E ROW00073
+ L ROW00074
+ L ROW00075
+ L ROW00076
+ L ROW00077
+ L ROW00078
+ L ROW00079
+ E ROW00080
+ E ROW00081
+ E ROW00082
+ E ROW00083
+ E ROW00084
+ L ROW00085
+ L ROW00086
+ L ROW00087
+ L ROW00088
+ L ROW00089
+ L ROW00090
+ E ROW00091
+ E ROW00092
+ E ROW00093
+ E ROW00094
+ E ROW00095
+ L ROW00096
+ L ROW00097
+ L ROW00098
+ L ROW00099
+ L ROW00100
+ L ROW00101
+ E ROW00102
+ L ROW00103
+ L ROW00104
+ L ROW00105
+COLUMNS
+ COL00001 ROW00001 2. ROW00002 1.
+ COL00001 ROW00005 -1.
+ COL00002 ROW00001 1. ROW00002 2.
+ COL00002 ROW00006 -1.
+ COL00003 ROW00001 1.5 ROW00002 1.5
+ COL00003 ROW00007 -1.
+ COL00004 MAXIM -1. ROW00004 1.
+ COL00004 ROW00014 1.1
+ COL00005 ROW00004 -1. ROW00013 1.
+ COL00005 ROW00015 1.
+ COL00006 ROW00005 1. ROW00008 -1.
+ COL00006 ROW00016 -1.
+ COL00007 ROW00006 1. ROW00009 -1.
+ COL00007 ROW00017 -1.
+ COL00008 ROW00007 1. ROW00010 -1.
+ COL00008 ROW00018 -1.
+ COL00009 ROW00008 1. ROW00011 -1.
+ COL00010 ROW00009 1. ROW00012 -1.
+ COL00011 ROW00010 1. ROW00013 -1.
+ COL00012 ROW00011 2. ROW00012 1.
+ COL00012 ROW00016 -1.
+ COL00013 ROW00011 1. ROW00012 2.
+ COL00013 ROW00017 -1.
+ COL00014 ROW00011 1.5 ROW00012 1.5
+ COL00014 ROW00018 -1.
+ COL00015 ROW00014 -1. ROW00015 1.
+ COL00015 ROW00025 1.1
+ COL00016 ROW00015 -1. ROW00024 1.
+ COL00016 ROW00026 1.
+ COL00017 ROW00016 1. ROW00019 -1.
+ COL00017 ROW00027 -1.
+ COL00018 ROW00017 1. ROW00020 -1.
+ COL00018 ROW00028 -1.
+ COL00019 ROW00018 1. ROW00021 -1.
+ COL00019 ROW00029 -1.
+ COL00020 ROW00019 1. ROW00022 -1.
+ COL00021 ROW00020 1. ROW00023 -1.
+ COL00022 ROW00021 1. ROW00024 -1.
+ COL00023 ROW00022 2. ROW00023 1.
+ COL00023 ROW00027 -1.
+ COL00024 ROW00022 1. ROW00023 2.
+ COL00024 ROW00028 -1.
+ COL00025 ROW00022 1.5 ROW00023 1.5
+ COL00025 ROW00029 -1.
+ COL00026 ROW00025 -1. ROW00026 1.
+ COL00026 ROW00036 1.1
+ COL00027 ROW00026 -1. ROW00035 1.
+ COL00027 ROW00037 1.
+ COL00028 ROW00027 1. ROW00030 -1.
+ COL00028 ROW00038 -1.
+ COL00029 ROW00028 1. ROW00031 -1.
+ COL00029 ROW00039 -1.
+ COL00030 ROW00029 1. ROW00032 -1.
+ COL00030 ROW00040 -1.
+ COL00031 ROW00030 1. ROW00033 -1.
+ COL00032 ROW00031 1. ROW00034 -1.
+ COL00033 ROW00032 1. ROW00035 -1.
+ COL00034 ROW00033 2. ROW00034 1.
+ COL00034 ROW00038 -1.
+ COL00035 ROW00033 1. ROW00034 2.
+ COL00035 ROW00039 -1.
+ COL00036 ROW00033 1.5 ROW00034 1.5
+ COL00036 ROW00040 -1.
+ COL00037 ROW00036 -1. ROW00037 1.
+ COL00037 ROW00047 1.1
+ COL00038 ROW00037 -1. ROW00046 1.
+ COL00038 ROW00048 1.
+ COL00039 ROW00038 1. ROW00041 -1.
+ COL00039 ROW00049 -1.
+ COL00040 ROW00039 1. ROW00042 -1.
+ COL00040 ROW00050 -1.
+ COL00041 ROW00040 1. ROW00043 -1.
+ COL00041 ROW00051 -1.
+ COL00042 ROW00041 1. ROW00044 -1.
+ COL00043 ROW00042 1. ROW00045 -1.
+ COL00044 ROW00043 1. ROW00046 -1.
+ COL00045 ROW00044 2. ROW00045 1.
+ COL00045 ROW00049 -1.
+ COL00046 ROW00044 1. ROW00045 2.
+ COL00046 ROW00050 -1.
+ COL00047 ROW00044 1.5 ROW00045 1.5
+ COL00047 ROW00051 -1.
+ COL00048 ROW00047 -1. ROW00048 1.
+ COL00048 ROW00058 1.1
+ COL00049 ROW00048 -1. ROW00057 1.
+ COL00049 ROW00059 1.
+ COL00050 ROW00049 1. ROW00052 -1.
+ COL00050 ROW00060 -1.
+ COL00051 ROW00050 1. ROW00053 -1.
+ COL00051 ROW00061 -1.
+ COL00052 ROW00051 1. ROW00054 -1.
+ COL00052 ROW00062 -1.
+ COL00053 ROW00052 1. ROW00055 -1.
+ COL00054 ROW00053 1. ROW00056 -1.
+ COL00055 ROW00054 1. ROW00057 -1.
+ COL00056 ROW00055 2. ROW00056 1.
+ COL00056 ROW00060 -1.
+ COL00057 ROW00055 1. ROW00056 2.
+ COL00057 ROW00061 -1.
+ COL00058 ROW00055 1.5 ROW00056 1.5
+ COL00058 ROW00062 -1.
+ COL00059 ROW00058 -1. ROW00059 1.
+ COL00059 ROW00069 1.1
+ COL00060 ROW00059 -1. ROW00068 1.
+ COL00060 ROW00070 1.
+ COL00061 ROW00060 1. ROW00063 -1.
+ COL00061 ROW00071 -1.
+ COL00062 ROW00061 1. ROW00064 -1.
+ COL00062 ROW00072 -1.
+ COL00063 ROW00062 1. ROW00065 -1.
+ COL00063 ROW00073 -1.
+ COL00064 ROW00063 1. ROW00066 -1.
+ COL00065 ROW00064 1. ROW00067 -1.
+ COL00066 ROW00065 1. ROW00068 -1.
+ COL00067 ROW00066 2. ROW00067 1.
+ COL00067 ROW00071 -1.
+ COL00068 ROW00066 1. ROW00067 2.
+ COL00068 ROW00072 -1.
+ COL00069 ROW00066 1.5 ROW00067 1.5
+ COL00069 ROW00073 -1.
+ COL00070 ROW00069 -1. ROW00070 1.
+ COL00070 ROW00080 1.1
+ COL00071 ROW00070 -1. ROW00079 1.
+ COL00071 ROW00081 1.
+ COL00072 ROW00071 1. ROW00074 -1.
+ COL00072 ROW00082 -1.
+ COL00073 ROW00072 1. ROW00075 -1.
+ COL00073 ROW00083 -1.
+ COL00074 ROW00073 1. ROW00076 -1.
+ COL00074 ROW00084 -1.
+ COL00075 ROW00074 1. ROW00077 -1.
+ COL00076 ROW00075 1. ROW00078 -1.
+ COL00077 ROW00076 1. ROW00079 -1.
+ COL00078 ROW00077 2. ROW00078 1.
+ COL00078 ROW00082 -1.
+ COL00079 ROW00077 1. ROW00078 2.
+ COL00079 ROW00083 -1.
+ COL00080 ROW00077 1.5 ROW00078 1.5
+ COL00080 ROW00084 -1.
+ COL00081 ROW00080 -1. ROW00081 1.
+ COL00081 ROW00091 1.1
+ COL00082 ROW00081 -1. ROW00090 1.
+ COL00082 ROW00092 1.
+ COL00083 ROW00082 1. ROW00085 -1.
+ COL00083 ROW00093 -1.
+ COL00084 ROW00083 1. ROW00086 -1.
+ COL00084 ROW00094 -1.
+ COL00085 ROW00084 1. ROW00087 -1.
+ COL00085 ROW00095 -1.
+ COL00086 ROW00085 1. ROW00088 -1.
+ COL00087 ROW00086 1. ROW00089 -1.
+ COL00088 ROW00087 1. ROW00090 -1.
+ COL00089 ROW00088 2. ROW00089 1.
+ COL00089 ROW00093 -1.
+ COL00090 ROW00088 1. ROW00089 2.
+ COL00090 ROW00094 -1.
+ COL00091 ROW00088 1.5 ROW00089 1.5
+ COL00091 ROW00095 -1.
+ COL00092 ROW00091 -1. ROW00092 1.
+ COL00092 ROW00102 1.1
+ COL00093 ROW00092 -1. ROW00101 1.
+ COL00094 ROW00093 1. ROW00096 -1.
+ COL00095 ROW00094 1. ROW00097 -1.
+ COL00096 ROW00095 1. ROW00098 -1.
+ COL00097 ROW00096 1. ROW00099 -1.
+ COL00098 ROW00097 1. ROW00100 -1.
+ COL00099 ROW00098 1. ROW00101 -1.
+ COL00100 ROW00099 2. ROW00100 1.
+ COL00100 ROW00103 -.8 ROW00104 .1
+ COL00101 ROW00099 1. ROW00100 2.
+ COL00101 ROW00103 .1 ROW00104 -.8
+ COL00102 ROW00099 1.5 ROW00100 1.5
+ COL00102 ROW00103 .15 ROW00104 .15
+ COL00102 ROW00105 -1.
+ COL00103 ROW00102 -1. ROW00105 1.
+RHS
+ CONST ROW00001 200. ROW00002 100.
+ CONST ROW00011 200. ROW00012 100.
+ CONST ROW00022 200. ROW00023 100.
+ CONST ROW00033 200. ROW00034 100.
+ CONST ROW00044 200. ROW00045 100.
+ CONST ROW00055 200. ROW00056 100.
+ CONST ROW00066 200. ROW00067 100.
+ CONST ROW00077 200. ROW00078 100.
+ CONST ROW00088 200. ROW00089 100.
+ CONST ROW00099 200. ROW00100 100.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50a.mps b/demos/ppl_lpsol/examples/sc50a.mps
new file mode 100644
index 0000000..a59623f
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50a.mps
@@ -0,0 +1,141 @@
+NAME SC50A
+ROWS
+ N MAXIM
+ L ROW00001
+ L ROW00002
+ L ROW00003
+ E ROW00004
+ E ROW00005
+ E ROW00006
+ E ROW00007
+ L ROW00008
+ L ROW00009
+ L ROW00010
+ L ROW00011
+ L ROW00012
+ L ROW00013
+ E ROW00014
+ E ROW00015
+ E ROW00016
+ E ROW00017
+ E ROW00018
+ L ROW00019
+ L ROW00020
+ L ROW00021
+ L ROW00022
+ L ROW00023
+ L ROW00024
+ E ROW00025
+ E ROW00026
+ E ROW00027
+ E ROW00028
+ E ROW00029
+ L ROW00030
+ L ROW00031
+ L ROW00032
+ L ROW00033
+ L ROW00034
+ L ROW00035
+ E ROW00036
+ E ROW00037
+ E ROW00038
+ E ROW00039
+ E ROW00040
+ L ROW00041
+ L ROW00042
+ L ROW00043
+ L ROW00044
+ L ROW00045
+ L ROW00046
+ E ROW00047
+ L ROW00048
+ L ROW00049
+ L ROW00050
+COLUMNS
+ COL00001 ROW00001 2. ROW00002 1.
+ COL00001 ROW00005 -1.
+ COL00002 ROW00001 1. ROW00002 2.
+ COL00002 ROW00006 -1.
+ COL00003 ROW00001 1.5 ROW00002 1.5
+ COL00003 ROW00007 -1.
+ COL00004 MAXIM -1. ROW00004 1.
+ COL00004 ROW00014 1.1
+ COL00005 ROW00004 -1. ROW00013 1.
+ COL00005 ROW00015 1.
+ COL00006 ROW00005 1. ROW00008 -1.
+ COL00006 ROW00016 -1.
+ COL00007 ROW00006 1. ROW00009 -1.
+ COL00007 ROW00017 -1.
+ COL00008 ROW00007 1. ROW00010 -1.
+ COL00008 ROW00018 -1.
+ COL00009 ROW00008 1. ROW00011 -1.
+ COL00010 ROW00009 1. ROW00012 -1.
+ COL00011 ROW00010 1. ROW00013 -1.
+ COL00012 ROW00011 2. ROW00012 1.
+ COL00012 ROW00016 -1.
+ COL00013 ROW00011 1. ROW00012 2.
+ COL00013 ROW00017 -1.
+ COL00014 ROW00011 1.5 ROW00012 1.5
+ COL00014 ROW00018 -1.
+ COL00015 ROW00014 -1. ROW00015 1.
+ COL00015 ROW00025 1.1
+ COL00016 ROW00015 -1. ROW00024 1.
+ COL00016 ROW00026 1.
+ COL00017 ROW00016 1. ROW00019 -1.
+ COL00017 ROW00027 -1.
+ COL00018 ROW00017 1. ROW00020 -1.
+ COL00018 ROW00028 -1.
+ COL00019 ROW00018 1. ROW00021 -1.
+ COL00019 ROW00029 -1.
+ COL00020 ROW00019 1. ROW00022 -1.
+ COL00021 ROW00020 1. ROW00023 -1.
+ COL00022 ROW00021 1. ROW00024 -1.
+ COL00023 ROW00022 2. ROW00023 1.
+ COL00023 ROW00027 -1.
+ COL00024 ROW00022 1. ROW00023 2.
+ COL00024 ROW00028 -1.
+ COL00025 ROW00022 1.5 ROW00023 1.5
+ COL00025 ROW00029 -1.
+ COL00026 ROW00025 -1. ROW00026 1.
+ COL00026 ROW00036 1.1
+ COL00027 ROW00026 -1. ROW00035 1.
+ COL00027 ROW00037 1.
+ COL00028 ROW00027 1. ROW00030 -1.
+ COL00028 ROW00038 -1.
+ COL00029 ROW00028 1. ROW00031 -1.
+ COL00029 ROW00039 -1.
+ COL00030 ROW00029 1. ROW00032 -1.
+ COL00030 ROW00040 -1.
+ COL00031 ROW00030 1. ROW00033 -1.
+ COL00032 ROW00031 1. ROW00034 -1.
+ COL00033 ROW00032 1. ROW00035 -1.
+ COL00034 ROW00033 2. ROW00034 1.
+ COL00034 ROW00038 -1.
+ COL00035 ROW00033 1. ROW00034 2.
+ COL00035 ROW00039 -1.
+ COL00036 ROW00033 1.5 ROW00034 1.5
+ COL00036 ROW00040 -1.
+ COL00037 ROW00036 -1. ROW00037 1.
+ COL00037 ROW00047 1.1
+ COL00038 ROW00037 -1. ROW00046 1.
+ COL00039 ROW00038 1. ROW00041 -1.
+ COL00040 ROW00039 1. ROW00042 -1.
+ COL00041 ROW00040 1. ROW00043 -1.
+ COL00042 ROW00041 1. ROW00044 -1.
+ COL00043 ROW00042 1. ROW00045 -1.
+ COL00044 ROW00043 1. ROW00046 -1.
+ COL00045 ROW00044 2. ROW00045 1.
+ COL00045 ROW00048 -.8 ROW00049 .1
+ COL00046 ROW00044 1. ROW00045 2.
+ COL00046 ROW00048 .1 ROW00049 -.8
+ COL00047 ROW00044 1.5 ROW00045 1.5
+ COL00047 ROW00048 .15 ROW00049 .15
+ COL00047 ROW00050 -1.
+ COL00048 ROW00047 -1. ROW00050 1.
+RHS
+ CONST ROW00001 170. ROW00002 130.
+ CONST ROW00011 170. ROW00012 130.
+ CONST ROW00022 170. ROW00023 130.
+ CONST ROW00033 170. ROW00034 130.
+ CONST ROW00044 170. ROW00045 130.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50b.mps b/demos/ppl_lpsol/examples/sc50b.mps
new file mode 100644
index 0000000..8d517ef
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50b.mps
@@ -0,0 +1,127 @@
+NAME SC50B
+ROWS
+ N MAXIM
+ L ROW00001
+ L ROW00002
+ L ROW00003
+ E ROW00004
+ E ROW00005
+ E ROW00006
+ E ROW00007
+ L ROW00008
+ L ROW00009
+ L ROW00010
+ L ROW00011
+ L ROW00012
+ L ROW00013
+ E ROW00014
+ E ROW00015
+ E ROW00016
+ E ROW00017
+ E ROW00018
+ L ROW00019
+ L ROW00020
+ L ROW00021
+ L ROW00022
+ L ROW00023
+ L ROW00024
+ E ROW00025
+ E ROW00026
+ E ROW00027
+ E ROW00028
+ E ROW00029
+ L ROW00030
+ L ROW00031
+ L ROW00032
+ L ROW00033
+ L ROW00034
+ L ROW00035
+ E ROW00036
+ E ROW00037
+ E ROW00038
+ E ROW00039
+ E ROW00040
+ L ROW00041
+ L ROW00042
+ L ROW00043
+ L ROW00044
+ L ROW00045
+ L ROW00046
+ E ROW00047
+ L ROW00048
+ L ROW00049
+ L ROW00050
+COLUMNS
+ COL00001 ROW00001 3. ROW00005 -1.
+ COL00002 ROW00001 3. ROW00006 -1.
+ COL00003 ROW00001 3. ROW00007 -1.
+ COL00004 MAXIM -1. ROW00004 1.
+ COL00004 ROW00014 1.1
+ COL00005 ROW00004 -1. ROW00012 .4
+ COL00005 ROW00013 .6 ROW00015 1.
+ COL00006 ROW00005 1. ROW00008 -1.
+ COL00006 ROW00016 -1.
+ COL00007 ROW00006 1. ROW00009 -1.
+ COL00007 ROW00017 -1.
+ COL00008 ROW00007 1. ROW00010 -1.
+ COL00008 ROW00018 -1.
+ COL00009 ROW00008 1. ROW00011 -1.
+ COL00010 ROW00009 1. ROW00012 -1.
+ COL00011 ROW00010 1. ROW00013 -1.
+ COL00012 ROW00011 3. ROW00016 -1.
+ COL00013 ROW00011 3. ROW00017 -1.
+ COL00014 ROW00011 3. ROW00018 -1.
+ COL00015 ROW00014 -1. ROW00015 1.
+ COL00015 ROW00025 1.1
+ COL00016 ROW00015 -1. ROW00023 .4
+ COL00016 ROW00024 .6 ROW00026 1.
+ COL00017 ROW00016 1. ROW00019 -1.
+ COL00017 ROW00027 -1.
+ COL00018 ROW00017 1. ROW00020 -1.
+ COL00018 ROW00028 -1.
+ COL00019 ROW00018 1. ROW00021 -1.
+ COL00019 ROW00029 -1.
+ COL00020 ROW00019 1. ROW00022 -1.
+ COL00021 ROW00020 1. ROW00023 -1.
+ COL00022 ROW00021 1. ROW00024 -1.
+ COL00023 ROW00022 3. ROW00027 -1.
+ COL00024 ROW00022 3. ROW00028 -1.
+ COL00025 ROW00022 3. ROW00029 -1.
+ COL00026 ROW00025 -1. ROW00026 1.
+ COL00026 ROW00036 1.1
+ COL00027 ROW00026 -1. ROW00034 .4
+ COL00027 ROW00035 .6 ROW00037 1.
+ COL00028 ROW00027 1. ROW00030 -1.
+ COL00028 ROW00038 -1.
+ COL00029 ROW00028 1. ROW00031 -1.
+ COL00029 ROW00039 -1.
+ COL00030 ROW00029 1. ROW00032 -1.
+ COL00030 ROW00040 -1.
+ COL00031 ROW00030 1. ROW00033 -1.
+ COL00032 ROW00031 1. ROW00034 -1.
+ COL00033 ROW00032 1. ROW00035 -1.
+ COL00034 ROW00033 3. ROW00038 -1.
+ COL00035 ROW00033 3. ROW00039 -1.
+ COL00036 ROW00033 3. ROW00040 -1.
+ COL00037 ROW00036 -1. ROW00037 1.
+ COL00037 ROW00047 1.1
+ COL00038 ROW00037 -1. ROW00045 .4
+ COL00038 ROW00046 .6
+ COL00039 ROW00038 1. ROW00041 -1.
+ COL00040 ROW00039 1. ROW00042 -1.
+ COL00041 ROW00040 1. ROW00043 -1.
+ COL00042 ROW00041 1. ROW00044 -1.
+ COL00043 ROW00042 1. ROW00045 -1.
+ COL00044 ROW00043 1. ROW00046 -1.
+ COL00045 ROW00044 3. ROW00048 -.7
+ COL00046 ROW00044 3. ROW00048 .3
+ COL00046 ROW00049 -1.
+ COL00047 ROW00044 3. ROW00048 .3
+ COL00047 ROW00050 -1.
+ COL00048 ROW00047 -1. ROW00049 .4
+ COL00048 ROW00050 .6
+RHS
+ CONST ROW00001 300. ROW00011 300.
+ CONST ROW00022 300. ROW00033 300.
+ CONST ROW00044 300.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ship08l.mps b/demos/ppl_lpsol/examples/ship08l.mps
new file mode 100644
index 0000000..afb09b8
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ship08l.mps
@@ -0,0 +1,9547 @@
+NAME SHIP08L
+ROWS
+ N COST
+ G REGMIN
+ L REGMAX
+ G OVRMIN
+ L OVRMAX
+ G REGMIN01
+ G REGMIN02
+ E REGMIN03
+ G REGMIN04
+ E REGMIN05
+ E REGMIN06
+ E REGMIN07
+ E REGMIN08
+ L REGMAX01
+ L REGMAX02
+ L REGMAX04
+ G OVRMIN01
+ G OVRMIN02
+ E OVRMIN03
+ G OVRMIN04
+ E OVRMIN05
+ E OVRMIN06
+ E OVRMIN07
+ E OVRMIN08
+ L OVRMAX01
+ L OVRMAX02
+ L OVRMAX04
+ L TRAN0101
+ L TRAN0102
+ L TRAN0103
+ L TRAN0104
+ L TRAN0105
+ L TRAN0106
+ L TRAN0107
+ L TRAN0108
+ L TRAN0201
+ L TRAN0202
+ L TRAN0203
+ L TRAN0204
+ L TRAN0205
+ L TRAN0206
+ L TRAN0207
+ L TRAN0208
+ L TRAN0301
+ L TRAN0302
+ L TRAN0303
+ L TRAN0304
+ L TRAN0305
+ L TRAN0306
+ L TRAN0307
+ L TRAN0308
+ L TRAN0401
+ L TRAN0402
+ L TRAN0403
+ L TRAN0404
+ L TRAN0405
+ L TRAN0406
+ L TRAN0407
+ L TRAN0408
+ L TRAN0501
+ L TRAN0502
+ L TRAN0503
+ L TRAN0504
+ L TRAN0505
+ L TRAN0506
+ L TRAN0507
+ L TRAN0508
+ L TRAN0601
+ L TRAN0602
+ L TRAN0603
+ L TRAN0604
+ L TRAN0605
+ L TRAN0606
+ L TRAN0607
+ L TRAN0608
+ L TRAN0701
+ L TRAN0702
+ L TRAN0703
+ L TRAN0704
+ L TRAN0705
+ L TRAN0706
+ L TRAN0707
+ L TRAN0708
+ L TRAN0801
+ L TRAN0802
+ L TRAN0803
+ L TRAN0804
+ L TRAN0805
+ L TRAN0806
+ L TRAN0807
+ L TRAN0808
+ E BAL0101
+ E BAL0102
+ E BAL0103
+ E BAL0104
+ E BAL0105
+ E BAL0106
+ E BAL0107
+ E BAL0108
+ E BAL0109
+ E BAL0110
+ E BAL0111
+ E BAL0112
+ E BAL0113
+ E BAL0114
+ E BAL0115
+ E BAL0116
+ E BAL0117
+ E BAL0118
+ E BAL0119
+ E BAL0120
+ E BAL0121
+ E BAL0122
+ E BAL0123
+ E BAL0124
+ E BAL0125
+ E BAL0126
+ E BAL0127
+ E BAL0128
+ E BAL0129
+ E BAL0130
+ E BAL0131
+ E BAL0132
+ E BAL0133
+ E BAL0134
+ E BAL0135
+ E BAL0136
+ E BAL0137
+ E BAL0138
+ E BAL0139
+ E BAL0140
+ E BAL0141
+ E BAL0142
+ E BAL0143
+ E BAL0144
+ E BAL0145
+ E BAL0146
+ E BAL0147
+ E BAL0148
+ E BAL0149
+ E BAL0150
+ E BAL0151
+ E BAL0152
+ E BAL0153
+ E BAL0154
+ E BAL0155
+ E BAL0156
+ E BAL0157
+ E BAL0158
+ E BAL0159
+ E BAL0160
+ E BAL0161
+ E BAL0162
+ E BAL0163
+ E BAL0164
+ E BAL0165
+ E BAL0166
+ E BAL0167
+ E BAL0168
+ E BAL0169
+ E BAL0170
+ E BAL0171
+ E BAL0172
+ E BAL0173
+ E BAL0174
+ E BAL0175
+ E BAL0176
+ E BAL0177
+ E BAL0178
+ E BAL0179
+ E BAL0180
+ E BAL0181
+ E BAL0182
+ E BAL0183
+ E BAL0184
+ E BAL0185
+ E BAL0186
+ E BAL0201
+ E BAL0202
+ E BAL0203
+ E BAL0204
+ E BAL0205
+ E BAL0206
+ E BAL0207
+ E BAL0208
+ E BAL0209
+ E BAL0210
+ E BAL0211
+ E BAL0212
+ E BAL0213
+ E BAL0214
+ E BAL0215
+ E BAL0216
+ E BAL0217
+ E BAL0218
+ E BAL0219
+ E BAL0220
+ E BAL0221
+ E BAL0222
+ E BAL0223
+ E BAL0224
+ E BAL0225
+ E BAL0226
+ E BAL0227
+ E BAL0228
+ E BAL0229
+ E BAL0230
+ E BAL0231
+ E BAL0232
+ E BAL0233
+ E BAL0234
+ E BAL0235
+ E BAL0236
+ E BAL0237
+ E BAL0238
+ E BAL0239
+ E BAL0240
+ E BAL0241
+ E BAL0242
+ E BAL0243
+ E BAL0244
+ E BAL0245
+ E BAL0246
+ E BAL0247
+ E BAL0248
+ E BAL0249
+ E BAL0250
+ E BAL0251
+ E BAL0252
+ E BAL0253
+ E BAL0254
+ E BAL0255
+ E BAL0256
+ E BAL0257
+ E BAL0258
+ E BAL0259
+ E BAL0260
+ E BAL0261
+ E BAL0262
+ E BAL0263
+ E BAL0264
+ E BAL0265
+ E BAL0266
+ E BAL0267
+ E BAL0268
+ E BAL0269
+ E BAL0270
+ E BAL0271
+ E BAL0272
+ E BAL0273
+ E BAL0274
+ E BAL0275
+ E BAL0276
+ E BAL0277
+ E BAL0278
+ E BAL0279
+ E BAL0280
+ E BAL0281
+ E BAL0282
+ E BAL0283
+ E BAL0284
+ E BAL0285
+ E BAL0286
+ E BAL0301
+ E BAL0302
+ E BAL0303
+ E BAL0304
+ E BAL0305
+ E BAL0306
+ E BAL0307
+ E BAL0308
+ E BAL0309
+ E BAL0310
+ E BAL0311
+ E BAL0312
+ E BAL0313
+ E BAL0314
+ E BAL0315
+ E BAL0316
+ E BAL0317
+ E BAL0318
+ E BAL0319
+ E BAL0320
+ E BAL0321
+ E BAL0322
+ E BAL0323
+ E BAL0324
+ E BAL0325
+ E BAL0326
+ E BAL0327
+ E BAL0328
+ E BAL0329
+ E BAL0330
+ E BAL0331
+ E BAL0332
+ E BAL0333
+ E BAL0334
+ E BAL0335
+ E BAL0336
+ E BAL0337
+ E BAL0338
+ E BAL0339
+ E BAL0340
+ E BAL0341
+ E BAL0342
+ E BAL0343
+ E BAL0344
+ E BAL0345
+ E BAL0346
+ E BAL0347
+ E BAL0348
+ E BAL0349
+ E BAL0350
+ E BAL0351
+ E BAL0352
+ E BAL0353
+ E BAL0354
+ E BAL0355
+ E BAL0356
+ E BAL0357
+ E BAL0358
+ E BAL0359
+ E BAL0360
+ E BAL0361
+ E BAL0362
+ E BAL0363
+ E BAL0364
+ E BAL0365
+ E BAL0366
+ E BAL0367
+ E BAL0368
+ E BAL0369
+ E BAL0370
+ E BAL0371
+ E BAL0372
+ E BAL0373
+ E BAL0374
+ E BAL0375
+ E BAL0376
+ E BAL0377
+ E BAL0378
+ E BAL0379
+ E BAL0380
+ E BAL0381
+ E BAL0382
+ E BAL0383
+ E BAL0384
+ E BAL0385
+ E BAL0386
+ E BAL0401
+ E BAL0402
+ E BAL0403
+ E BAL0404
+ E BAL0405
+ E BAL0406
+ E BAL0407
+ E BAL0408
+ E BAL0409
+ E BAL0410
+ E BAL0411
+ E BAL0412
+ E BAL0413
+ E BAL0414
+ E BAL0415
+ E BAL0416
+ E BAL0417
+ E BAL0418
+ E BAL0419
+ E BAL0420
+ E BAL0421
+ E BAL0422
+ E BAL0423
+ E BAL0424
+ E BAL0425
+ E BAL0426
+ E BAL0427
+ E BAL0428
+ E BAL0429
+ E BAL0430
+ E BAL0431
+ E BAL0432
+ E BAL0433
+ E BAL0434
+ E BAL0435
+ E BAL0436
+ E BAL0437
+ E BAL0438
+ E BAL0439
+ E BAL0440
+ E BAL0441
+ E BAL0442
+ E BAL0443
+ E BAL0444
+ E BAL0445
+ E BAL0446
+ E BAL0447
+ E BAL0448
+ E BAL0449
+ E BAL0450
+ E BAL0451
+ E BAL0452
+ E BAL0453
+ E BAL0454
+ E BAL0455
+ E BAL0456
+ E BAL0457
+ E BAL0458
+ E BAL0459
+ E BAL0460
+ E BAL0461
+ E BAL0462
+ E BAL0463
+ E BAL0464
+ E BAL0465
+ E BAL0466
+ E BAL0467
+ E BAL0468
+ E BAL0469
+ E BAL0470
+ E BAL0471
+ E BAL0472
+ E BAL0473
+ E BAL0474
+ E BAL0475
+ E BAL0476
+ E BAL0477
+ E BAL0478
+ E BAL0479
+ E BAL0480
+ E BAL0481
+ E BAL0482
+ E BAL0483
+ E BAL0484
+ E BAL0485
+ E BAL0486
+ E BAL0501
+ E BAL0502
+ E BAL0503
+ E BAL0504
+ E BAL0505
+ E BAL0506
+ E BAL0507
+ E BAL0508
+ E BAL0509
+ E BAL0510
+ E BAL0511
+ E BAL0512
+ E BAL0513
+ E BAL0514
+ E BAL0515
+ E BAL0516
+ E BAL0517
+ E BAL0518
+ E BAL0519
+ E BAL0520
+ E BAL0521
+ E BAL0522
+ E BAL0523
+ E BAL0524
+ E BAL0525
+ E BAL0526
+ E BAL0527
+ E BAL0528
+ E BAL0529
+ E BAL0530
+ E BAL0531
+ E BAL0532
+ E BAL0533
+ E BAL0534
+ E BAL0535
+ E BAL0536
+ E BAL0537
+ E BAL0538
+ E BAL0539
+ E BAL0540
+ E BAL0541
+ E BAL0542
+ E BAL0543
+ E BAL0544
+ E BAL0545
+ E BAL0546
+ E BAL0547
+ E BAL0548
+ E BAL0549
+ E BAL0550
+ E BAL0551
+ E BAL0552
+ E BAL0553
+ E BAL0554
+ E BAL0555
+ E BAL0556
+ E BAL0557
+ E BAL0558
+ E BAL0559
+ E BAL0560
+ E BAL0561
+ E BAL0562
+ E BAL0563
+ E BAL0564
+ E BAL0565
+ E BAL0566
+ E BAL0567
+ E BAL0568
+ E BAL0569
+ E BAL0570
+ E BAL0571
+ E BAL0572
+ E BAL0573
+ E BAL0574
+ E BAL0575
+ E BAL0576
+ E BAL0577
+ E BAL0578
+ E BAL0579
+ E BAL0580
+ E BAL0581
+ E BAL0582
+ E BAL0583
+ E BAL0584
+ E BAL0585
+ E BAL0586
+ E BAL0601
+ E BAL0602
+ E BAL0603
+ E BAL0604
+ E BAL0605
+ E BAL0606
+ E BAL0607
+ E BAL0608
+ E BAL0609
+ E BAL0610
+ E BAL0611
+ E BAL0612
+ E BAL0613
+ E BAL0614
+ E BAL0615
+ E BAL0616
+ E BAL0617
+ E BAL0618
+ E BAL0619
+ E BAL0620
+ E BAL0621
+ E BAL0622
+ E BAL0623
+ E BAL0624
+ E BAL0625
+ E BAL0626
+ E BAL0627
+ E BAL0628
+ E BAL0629
+ E BAL0630
+ E BAL0631
+ E BAL0632
+ E BAL0633
+ E BAL0634
+ E BAL0635
+ E BAL0636
+ E BAL0637
+ E BAL0638
+ E BAL0639
+ E BAL0640
+ E BAL0641
+ E BAL0642
+ E BAL0643
+ E BAL0644
+ E BAL0645
+ E BAL0646
+ E BAL0647
+ E BAL0648
+ E BAL0649
+ E BAL0650
+ E BAL0651
+ E BAL0652
+ E BAL0653
+ E BAL0654
+ E BAL0655
+ E BAL0656
+ E BAL0657
+ E BAL0658
+ E BAL0659
+ E BAL0660
+ E BAL0661
+ E BAL0662
+ E BAL0663
+ E BAL0664
+ E BAL0665
+ E BAL0666
+ E BAL0667
+ E BAL0668
+ E BAL0669
+ E BAL0670
+ E BAL0671
+ E BAL0672
+ E BAL0673
+ E BAL0674
+ E BAL0675
+ E BAL0676
+ E BAL0677
+ E BAL0678
+ E BAL0679
+ E BAL0680
+ E BAL0681
+ E BAL0682
+ E BAL0683
+ E BAL0684
+ E BAL0685
+ E BAL0686
+ E BAL0701
+ E BAL0702
+ E BAL0703
+ E BAL0704
+ E BAL0705
+ E BAL0706
+ E BAL0707
+ E BAL0708
+ E BAL0709
+ E BAL0710
+ E BAL0711
+ E BAL0712
+ E BAL0713
+ E BAL0714
+ E BAL0715
+ E BAL0716
+ E BAL0717
+ E BAL0718
+ E BAL0719
+ E BAL0720
+ E BAL0721
+ E BAL0722
+ E BAL0723
+ E BAL0724
+ E BAL0725
+ E BAL0726
+ E BAL0727
+ E BAL0728
+ E BAL0729
+ E BAL0730
+ E BAL0731
+ E BAL0732
+ E BAL0733
+ E BAL0734
+ E BAL0735
+ E BAL0736
+ E BAL0737
+ E BAL0738
+ E BAL0739
+ E BAL0740
+ E BAL0741
+ E BAL0742
+ E BAL0743
+ E BAL0744
+ E BAL0745
+ E BAL0746
+ E BAL0747
+ E BAL0748
+ E BAL0749
+ E BAL0750
+ E BAL0751
+ E BAL0752
+ E BAL0753
+ E BAL0754
+ E BAL0755
+ E BAL0756
+ E BAL0757
+ E BAL0758
+ E BAL0759
+ E BAL0760
+ E BAL0761
+ E BAL0762
+ E BAL0763
+ E BAL0764
+ E BAL0765
+ E BAL0766
+ E BAL0767
+ E BAL0768
+ E BAL0769
+ E BAL0770
+ E BAL0771
+ E BAL0772
+ E BAL0773
+ E BAL0774
+ E BAL0775
+ E BAL0776
+ E BAL0777
+ E BAL0778
+ E BAL0779
+ E BAL0780
+ E BAL0781
+ E BAL0782
+ E BAL0783
+ E BAL0784
+ E BAL0785
+ E BAL0786
+ E BAL0801
+ E BAL0802
+ E BAL0803
+ E BAL0804
+ E BAL0805
+ E BAL0806
+ E BAL0807
+ E BAL0808
+ E BAL0809
+ E BAL0810
+ E BAL0811
+ E BAL0812
+ E BAL0813
+ E BAL0814
+ E BAL0815
+ E BAL0816
+ E BAL0817
+ E BAL0818
+ E BAL0819
+ E BAL0820
+ E BAL0821
+ E BAL0822
+ E BAL0823
+ E BAL0824
+ E BAL0825
+ E BAL0826
+ E BAL0827
+ E BAL0828
+ E BAL0829
+ E BAL0830
+ E BAL0831
+ E BAL0832
+ E BAL0833
+ E BAL0834
+ E BAL0835
+ E BAL0836
+ E BAL0837
+ E BAL0838
+ E BAL0839
+ E BAL0840
+ E BAL0841
+ E BAL0842
+ E BAL0843
+ E BAL0844
+ E BAL0845
+ E BAL0846
+ E BAL0847
+ E BAL0848
+ E BAL0849
+ E BAL0850
+ E BAL0851
+ E BAL0852
+ E BAL0853
+ E BAL0854
+ E BAL0855
+ E BAL0856
+ E BAL0857
+ E BAL0858
+ E BAL0859
+ E BAL0860
+ E BAL0861
+ E BAL0862
+ E BAL0863
+ E BAL0864
+ E BAL0865
+ E BAL0866
+ E BAL0867
+ E BAL0868
+ E BAL0869
+ E BAL0870
+ E BAL0871
+ E BAL0872
+ E BAL0873
+ E BAL0874
+ E BAL0875
+ E BAL0876
+ E BAL0877
+ E BAL0878
+ E BAL0879
+ E BAL0880
+ E BAL0881
+ E BAL0882
+ E BAL0883
+ E BAL0884
+ E BAL0885
+ E BAL0886
+COLUMNS
+ PREG0101 COST 4862. REGMIN .0210855
+ PREG0101 REGMAX .0210855 REGMIN01 .0210855
+ PREG0101 REGMAX01 .0210855 TRAN0101 -1.
+ PREG0101 BAL0101 1.
+ PREG0102 COST 4688. REGMIN .0175461
+ PREG0102 REGMAX .0175461 REGMIN01 .0175461
+ PREG0102 REGMAX01 .0175461 TRAN0201 -1.
+ PREG0102 BAL0201 1.
+ PREG0103 COST 4872. REGMIN .0175461
+ PREG0103 REGMAX .0175461 REGMIN01 .0175461
+ PREG0103 REGMAX01 .0175461 TRAN0301 -1.
+ PREG0103 BAL0301 1.
+ PREG0105 COST 4655. REGMIN .0175461
+ PREG0105 REGMAX .0175461 REGMIN01 .0175461
+ PREG0105 REGMAX01 .0175461 TRAN0501 -1.
+ PREG0105 BAL0501 1.
+ PREG0202 COST 4196. REGMIN .0187961
+ PREG0202 REGMAX .0187961 REGMIN02 .0187961
+ PREG0202 REGMAX02 .0187961 TRAN0202 -1.
+ PREG0202 BAL0202 1.
+ PREG0203 COST 4338. REGMIN .0328947
+ PREG0203 REGMAX .0328947 REGMIN02 .0328947
+ PREG0203 REGMAX02 .0328947 TRAN0302 -1.
+ PREG0203 BAL0302 1.
+ PREG0205 COST 4283. REGMIN .0112105
+ PREG0205 REGMAX .0112105 REGMIN02 .0112105
+ PREG0205 REGMAX02 .0112105 TRAN0502 -1.
+ PREG0205 BAL0502 1.
+ PREG0207 COST 4156. REGMIN .0131579
+ PREG0207 REGMAX .0131579 REGMIN02 .0131579
+ PREG0207 REGMAX02 .0131579 TRAN0702 -1.
+ PREG0207 BAL0702 1.
+ PREG0401 COST 4691. REGMIN .0175461
+ PREG0401 REGMAX .0175461 REGMIN04 .0175461
+ PREG0401 REGMAX04 .0175461 TRAN0104 -1.
+ PREG0401 BAL0104 1.
+ PREG0402 COST 4669. REGMIN .0181711
+ PREG0402 REGMAX .0181711 REGMIN04 .0181711
+ PREG0402 REGMAX04 .0181711 TRAN0204 -1.
+ PREG0402 BAL0204 1.
+ PREG0404 COST 6724. REGMIN .0263158
+ PREG0404 REGMAX .0263158 REGMIN04 .0263158
+ PREG0404 REGMAX04 .0263158 TRAN0404 -1.
+ PREG0404 BAL0404 1.
+ PREG0405 COST 4615. REGMIN .0181711
+ PREG0405 REGMAX .0181711 REGMIN04 .0181711
+ PREG0405 REGMAX04 .0181711 TRAN0504 -1.
+ PREG0405 BAL0504 1.
+ PREG0406 COST 4148. REGMIN .0181711
+ PREG0406 REGMAX .0181711 REGMIN04 .0181711
+ PREG0406 REGMAX04 .0181711 TRAN0604 -1.
+ PREG0406 BAL0604 1.
+ PREG0408 COST 6411. REGMIN .0239211
+ PREG0408 REGMAX .0239211 REGMIN04 .0239211
+ PREG0408 REGMAX04 .0239211 TRAN0804 -1.
+ PREG0408 BAL0804 1.
+ POVR0101 COST 6552. OVRMIN 3.205
+ POVR0101 OVRMAX 3.205 OVRMIN01 3.205
+ POVR0101 OVRMAX01 3.205 TRAN0101 -1.
+ POVR0101 BAL0101 1.
+ POVR0102 COST 6351. OVRMIN 2.667
+ POVR0102 OVRMAX 2.667 OVRMIN01 2.667
+ POVR0102 OVRMAX01 2.667 TRAN0201 -1.
+ POVR0102 BAL0201 1.
+ POVR0103 COST 6554. OVRMIN 2.667
+ POVR0103 OVRMAX 2.667 OVRMIN01 2.667
+ POVR0103 OVRMAX01 2.667 TRAN0301 -1.
+ POVR0103 BAL0301 1.
+ POVR0105 COST 6325. OVRMIN 2.667
+ POVR0105 OVRMAX 2.667 OVRMIN01 2.667
+ POVR0105 OVRMAX01 2.667 TRAN0501 -1.
+ POVR0105 BAL0501 1.
+ POVR0202 COST 5756. OVRMIN 2.857
+ POVR0202 OVRMAX 2.857 OVRMIN02 2.857
+ POVR0202 OVRMAX02 2.857 TRAN0202 -1.
+ POVR0202 BAL0202 1.
+ POVR0203 COST 6777. OVRMIN 5.
+ POVR0203 OVRMAX 5. OVRMIN02 5.
+ POVR0203 OVRMAX02 5. TRAN0302 -1.
+ POVR0203 BAL0302 1.
+ POVR0205 COST 5844. OVRMIN 1.704
+ POVR0205 OVRMAX 1.704 OVRMIN02 1.704
+ POVR0205 OVRMAX02 1.704 TRAN0502 -1.
+ POVR0205 BAL0502 1.
+ POVR0207 COST 5673. OVRMIN 2.
+ POVR0207 OVRMAX 2. OVRMIN02 2.
+ POVR0207 OVRMAX02 2. TRAN0702 -1.
+ POVR0207 BAL0702 1.
+ POVR0401 COST 5794. OVRMIN 2.667
+ POVR0401 OVRMAX 2.667 OVRMIN04 2.667
+ POVR0401 OVRMAX04 2.667 TRAN0104 -1.
+ POVR0401 BAL0104 1.
+ POVR0402 COST 5787. OVRMIN 2.762
+ POVR0402 OVRMAX 2.762 OVRMIN04 2.762
+ POVR0402 OVRMAX04 2.762 TRAN0204 -1.
+ POVR0402 BAL0204 1.
+ POVR0404 COST 8111. OVRMIN 4.
+ POVR0404 OVRMAX 4. OVRMIN04 4.
+ POVR0404 OVRMAX04 4. TRAN0404 -1.
+ POVR0404 BAL0404 1.
+ POVR0405 COST 5721. OVRMIN 2.762
+ POVR0405 OVRMAX 2.762 OVRMIN04 2.762
+ POVR0405 OVRMAX04 2.762 TRAN0504 -1.
+ POVR0405 BAL0504 1.
+ POVR0406 COST 5303. OVRMIN 2.762
+ POVR0406 OVRMAX 2.762 OVRMIN04 2.762
+ POVR0406 OVRMAX04 2.762 TRAN0604 -1.
+ POVR0406 BAL0604 1.
+ SH010201 COST 323.73 TRAN0102 1.
+ SH010201 BAL0102 -1. BAL0101 1.
+ SH010301 COST 124.26 TRAN0103 1.
+ SH010301 BAL0103 -1. BAL0101 1.
+ SH010401 COST 226.72 TRAN0104 1.
+ SH010401 BAL0104 -1. BAL0101 1.
+ SH010501 COST 258.33 TRAN0105 1.
+ SH010501 BAL0105 -1. BAL0101 1.
+ SH010601 COST 137.34 TRAN0106 1.
+ SH010601 BAL0152 -1. BAL0101 1.
+ SH010801 COST 155.87 TRAN0108 1.
+ SH010801 BAL0183 -1. BAL0101 1.
+ SH010102 COST 516.66 TRAN0101 1.
+ SH010102 BAL0101 -1. BAL0102 1.
+ SH010302 COST 454.53 TRAN0103 1.
+ SH010302 BAL0103 -1. BAL0102 1.
+ SH010402 COST 667.08 TRAN0104 1.
+ SH010402 BAL0104 -1. BAL0102 1.
+ SH010502 COST 807.69 TRAN0105 1.
+ SH010502 BAL0105 -1. BAL0102 1.
+ SH010602 COST 412.02 TRAN0106 1.
+ SH010602 BAL0152 -1. BAL0102 1.
+ SH010802 COST 567.89 TRAN0108 1.
+ SH010802 BAL0183 -1. BAL0102 1.
+ SH010103 COST 267.05 TRAN0101 1.
+ SH010103 BAL0101 -1. BAL0103 1.
+ SH010203 COST 516.66 TRAN0102 1.
+ SH010203 BAL0102 -1. BAL0103 1.
+ SH010403 COST 400.03 TRAN0104 1.
+ SH010403 BAL0104 -1. BAL0103 1.
+ SH010503 COST 309.56 TRAN0105 1.
+ SH010503 BAL0105 -1. BAL0103 1.
+ SH010603 COST 98.1 TRAN0106 1.
+ SH010603 BAL0152 -1. BAL0103 1.
+ SH010803 COST 277.95 TRAN0108 1.
+ SH010803 BAL0183 -1. BAL0103 1.
+ SH010104 COST 189.66 TRAN0101 1.
+ SH010104 BAL0101 -1. BAL0104 1.
+ SH010204 COST 548.27 TRAN0102 1.
+ SH010204 BAL0102 -1. BAL0104 1.
+ SH010304 COST 264.87 TRAN0103 1.
+ SH010304 BAL0103 -1. BAL0104 1.
+ SH010504 COST 347.71 TRAN0105 1.
+ SH010504 BAL0105 -1. BAL0104 1.
+ SH010604 COST 267.05 TRAN0106 1.
+ SH010604 BAL0152 -1. BAL0104 1.
+ SH010704 COST 293.21 TRAN0107 1.
+ SH010704 BAL0164 -1. BAL0104 1.
+ SH010804 COST 63.22 TRAN0108 1.
+ SH010804 BAL0183 -1. BAL0104 1.
+ SH010105 COST 294.3 TRAN0101 1.
+ SH010105 BAL0101 -1. BAL0105 1.
+ SH010205 COST 562.44 TRAN0102 1.
+ SH010205 BAL0102 -1. BAL0105 1.
+ SH010305 COST 309.56 TRAN0103 1.
+ SH010305 BAL0103 -1. BAL0105 1.
+ SH010405 COST 310.65 TRAN0104 1.
+ SH010405 BAL0104 -1. BAL0105 1.
+ SH010605 COST 355.34 TRAN0106 1.
+ SH010605 BAL0152 -1. BAL0105 1.
+ SH010705 COST 364.06 TRAN0107 1.
+ SH010705 BAL0164 -1. BAL0105 1.
+ SH010805 COST 295.39 TRAN0108 1.
+ SH010805 BAL0183 -1. BAL0105 1.
+ SH010106 COST 216.91 TRAN0101 1.
+ SH010106 BAL0101 -1. BAL0106 1.
+ SH010206 COST 454.53 TRAN0102 1.
+ SH010206 BAL0102 -1. BAL0106 1.
+ SH010306 COST 232.17 TRAN0103 1.
+ SH010306 BAL0103 -1. BAL0106 1.
+ SH010406 COST 238.71 TRAN0104 1.
+ SH010406 BAL0104 -1. BAL0106 1.
+ SH010506 COST 274.68 TRAN0105 1.
+ SH010506 BAL0105 -1. BAL0106 1.
+ SH010606 COST 224.54 TRAN0106 1.
+ SH010606 BAL0152 -1. BAL0106 1.
+ SH010706 COST 218. TRAN0107 1.
+ SH010706 BAL0164 -1. BAL0106 1.
+ SH010806 COST 164.59 TRAN0108 1.
+ SH010806 BAL0183 -1. BAL0106 1.
+ SH010107 COST 22.89 TRAN0101 1.
+ SH010107 BAL0101 -1. BAL0107 1.
+ SH010207 COST 318.28 TRAN0102 1.
+ SH010207 BAL0102 -1. BAL0107 1.
+ SH010307 COST 135.16 TRAN0103 1.
+ SH010307 BAL0103 -1. BAL0107 1.
+ SH010407 COST 225.63 TRAN0104 1.
+ SH010407 BAL0104 -1. BAL0107 1.
+ SH010507 COST 249.61 TRAN0105 1.
+ SH010507 BAL0105 -1. BAL0107 1.
+ SH010607 COST 136.25 TRAN0106 1.
+ SH010607 BAL0152 -1. BAL0107 1.
+ SH010707 COST 252.88 TRAN0107 1.
+ SH010707 BAL0164 -1. BAL0107 1.
+ SH010807 COST 168.95 TRAN0108 1.
+ SH010807 BAL0183 -1. BAL0107 1.
+ SH010108 COST 71.94 TRAN0101 1.
+ SH010108 BAL0101 -1. BAL0108 1.
+ SH010208 COST 409.84 TRAN0102 1.
+ SH010208 BAL0102 -1. BAL0108 1.
+ SH010308 COST 153.69 TRAN0103 1.
+ SH010308 BAL0103 -1. BAL0108 1.
+ SH010408 COST 269.23 TRAN0104 1.
+ SH010408 BAL0104 -1. BAL0108 1.
+ SH010508 COST 198.38 TRAN0105 1.
+ SH010508 BAL0105 -1. BAL0108 1.
+ SH010608 COST 180.94 TRAN0106 1.
+ SH010608 BAL0152 -1. BAL0108 1.
+ SH010808 COST 203.83 TRAN0108 1.
+ SH010808 BAL0183 -1. BAL0108 1.
+ SH010109 COST 150.42 TRAN0101 1.
+ SH010109 BAL0101 -1. BAL0109 1.
+ SH010209 COST 417.47 TRAN0102 1.
+ SH010209 BAL0102 -1. BAL0109 1.
+ SH010309 COST 183.12 TRAN0103 1.
+ SH010309 BAL0103 -1. BAL0109 1.
+ SH010409 COST 275.77 TRAN0104 1.
+ SH010409 BAL0104 -1. BAL0109 1.
+ SH010509 COST 260.51 TRAN0105 1.
+ SH010509 BAL0105 -1. BAL0109 1.
+ SH010709 COST 213.64 TRAN0107 1.
+ SH010709 BAL0164 -1. BAL0109 1.
+ SH010809 COST 211.46 TRAN0108 1.
+ SH010809 BAL0183 -1. BAL0109 1.
+ SH010110 COST 269.23 TRAN0101 1.
+ SH010110 BAL0101 -1. BAL0110 1.
+ SH010210 COST 172.22 TRAN0102 1.
+ SH010210 BAL0102 -1. BAL0110 1.
+ SH010310 COST 261.6 TRAN0103 1.
+ SH010310 BAL0103 -1. BAL0110 1.
+ SH010410 COST 391.31 TRAN0104 1.
+ SH010410 BAL0104 -1. BAL0110 1.
+ SH010510 COST 419.65 TRAN0105 1.
+ SH010510 BAL0105 -1. BAL0110 1.
+ SH010610 COST 245.25 TRAN0106 1.
+ SH010610 BAL0152 -1. BAL0110 1.
+ SH010810 COST 332.45 TRAN0108 1.
+ SH010810 BAL0183 -1. BAL0110 1.
+ SH010111 COST 115.54 TRAN0101 1.
+ SH010111 BAL0101 -1. BAL0111 1.
+ SH010211 COST 539.55 TRAN0102 1.
+ SH010211 BAL0102 -1. BAL0111 1.
+ SH010311 COST 270.32 TRAN0103 1.
+ SH010311 BAL0103 -1. BAL0111 1.
+ SH010411 COST 151.51 TRAN0104 1.
+ SH010411 BAL0104 -1. BAL0111 1.
+ SH010511 COST 371.69 TRAN0105 1.
+ SH010511 BAL0105 -1. BAL0111 1.
+ SH010611 COST 213.64 TRAN0106 1.
+ SH010611 BAL0152 -1. BAL0111 1.
+ SH010811 COST 111.18 TRAN0108 1.
+ SH010811 BAL0183 -1. BAL0111 1.
+ SH010112 COST 95.92 TRAN0101 1.
+ SH010112 BAL0101 -1. BAL0112 1.
+ SH010212 COST 369.51 TRAN0102 1.
+ SH010212 BAL0102 -1. BAL0112 1.
+ SH010312 COST 159.14 TRAN0103 1.
+ SH010312 BAL0103 -1. BAL0112 1.
+ SH010412 COST 218. TRAN0104 1.
+ SH010412 BAL0104 -1. BAL0112 1.
+ SH010512 COST 291.03 TRAN0105 1.
+ SH010512 BAL0105 -1. BAL0112 1.
+ SH010612 COST 158.05 TRAN0106 1.
+ SH010612 BAL0152 -1. BAL0112 1.
+ SH010812 COST 159.14 TRAN0108 1.
+ SH010812 BAL0183 -1. BAL0112 1.
+ SH010114 COST 154.78 TRAN0101 1.
+ SH010114 BAL0101 -1. BAL0114 1.
+ SH010214 COST 449.08 TRAN0102 1.
+ SH010214 BAL0102 -1. BAL0114 1.
+ SH010314 COST 213.64 TRAN0103 1.
+ SH010314 BAL0103 -1. BAL0114 1.
+ SH010414 COST 216.91 TRAN0104 1.
+ SH010414 BAL0104 -1. BAL0114 1.
+ SH010514 COST 383.68 TRAN0105 1.
+ SH010514 BAL0105 -1. BAL0114 1.
+ SH010614 COST 204.92 TRAN0106 1.
+ SH010614 BAL0152 -1. BAL0114 1.
+ SH010814 COST 137.34 TRAN0108 1.
+ SH010814 BAL0183 -1. BAL0114 1.
+ SH010115 COST 330.27 TRAN0101 1.
+ SH010115 BAL0101 -1. BAL0115 1.
+ SH010215 COST 173.31 TRAN0102 1.
+ SH010215 BAL0102 -1. BAL0115 1.
+ SH010315 COST 255.06 TRAN0103 1.
+ SH010315 BAL0103 -1. BAL0115 1.
+ SH010415 COST 518.84 TRAN0104 1.
+ SH010415 BAL0104 -1. BAL0115 1.
+ SH010515 COST 433.82 TRAN0105 1.
+ SH010515 BAL0105 -1. BAL0115 1.
+ SH010615 COST 204.92 TRAN0106 1.
+ SH010615 BAL0152 -1. BAL0115 1.
+ SH010815 COST 406.57 TRAN0108 1.
+ SH010815 BAL0183 -1. BAL0115 1.
+ SH010116 COST 172.22 TRAN0101 1.
+ SH010116 BAL0101 -1. BAL0116 1.
+ SH010216 COST 305.2 TRAN0102 1.
+ SH010216 BAL0102 -1. BAL0116 1.
+ SH010316 COST 247.43 TRAN0103 1.
+ SH010316 BAL0103 -1. BAL0116 1.
+ SH010416 COST 312.83 TRAN0104 1.
+ SH010416 BAL0104 -1. BAL0116 1.
+ SH010516 COST 347.71 TRAN0105 1.
+ SH010516 BAL0105 -1. BAL0116 1.
+ SH010616 COST 142.79 TRAN0106 1.
+ SH010616 BAL0152 -1. BAL0116 1.
+ SH010816 COST 223.45 TRAN0108 1.
+ SH010816 BAL0183 -1. BAL0116 1.
+ SH010117 COST 164.59 TRAN0101 1.
+ SH010117 BAL0101 -1. BAL0117 1.
+ SH010217 COST 550.45 TRAN0102 1.
+ SH010217 BAL0102 -1. BAL0117 1.
+ SH010317 COST 298.66 TRAN0103 1.
+ SH010317 BAL0103 -1. BAL0117 1.
+ SH010417 COST 62.13 TRAN0104 1.
+ SH010417 BAL0104 -1. BAL0117 1.
+ SH010517 COST 324.82 TRAN0105 1.
+ SH010517 BAL0105 -1. BAL0117 1.
+ SH010717 COST 321.55 TRAN0107 1.
+ SH010717 BAL0164 -1. BAL0117 1.
+ SH010817 COST 29.43 TRAN0108 1.
+ SH010817 BAL0183 -1. BAL0117 1.
+ SH010118 COST 190.75 TRAN0101 1.
+ SH010118 BAL0101 -1. BAL0118 1.
+ SH010218 COST 393.49 TRAN0102 1.
+ SH010218 BAL0102 -1. BAL0118 1.
+ SH010318 COST 294.3 TRAN0103 1.
+ SH010318 BAL0103 -1. BAL0118 1.
+ SH010418 COST 167.86 TRAN0104 1.
+ SH010418 BAL0104 -1. BAL0118 1.
+ SH010518 COST 443.63 TRAN0105 1.
+ SH010518 BAL0105 -1. BAL0118 1.
+ SH010618 COST 383.68 TRAN0106 1.
+ SH010618 BAL0152 -1. BAL0118 1.
+ SH010818 COST 112.27 TRAN0108 1.
+ SH010818 BAL0183 -1. BAL0118 1.
+ SH010119 COST 270.32 TRAN0101 1.
+ SH010119 BAL0101 -1. BAL0119 1.
+ SH010219 COST 748.83 TRAN0102 1.
+ SH010219 BAL0102 -1. BAL0119 1.
+ SH010319 COST 345.53 TRAN0103 1.
+ SH010319 BAL0103 -1. BAL0119 1.
+ SH010419 COST 173.31 TRAN0104 1.
+ SH010419 BAL0104 -1. BAL0119 1.
+ SH010519 COST 226.72 TRAN0105 1.
+ SH010519 BAL0105 -1. BAL0119 1.
+ SH010619 COST 376.05 TRAN0106 1.
+ SH010619 BAL0152 -1. BAL0119 1.
+ SH010819 COST 107.91 TRAN0108 1.
+ SH010819 BAL0183 -1. BAL0119 1.
+ SH010120 COST 223.45 TRAN0101 1.
+ SH010120 BAL0101 -1. BAL0120 1.
+ SH010220 COST 744.47 TRAN0102 1.
+ SH010220 BAL0102 -1. BAL0120 1.
+ SH010320 COST 323.73 TRAN0103 1.
+ SH010320 BAL0103 -1. BAL0120 1.
+ SH010420 COST 123.17 TRAN0104 1.
+ SH010420 BAL0104 -1. BAL0120 1.
+ SH010520 COST 317.19 TRAN0105 1.
+ SH010520 BAL0105 -1. BAL0120 1.
+ SH010820 COST 137.34 TRAN0108 1.
+ SH010820 BAL0183 -1. BAL0120 1.
+ SH010121 COST 439.27 TRAN0101 1.
+ SH010121 BAL0101 -1. BAL0121 1.
+ SH010221 COST 401.12 TRAN0102 1.
+ SH010221 BAL0102 -1. BAL0121 1.
+ SH010321 COST 486.14 TRAN0103 1.
+ SH010321 BAL0103 -1. BAL0121 1.
+ SH010421 COST 348.8 TRAN0104 1.
+ SH010421 BAL0104 -1. BAL0121 1.
+ SH010521 COST 599.5 TRAN0105 1.
+ SH010521 BAL0105 -1. BAL0121 1.
+ SH010821 COST 348.8 TRAN0108 1.
+ SH010821 BAL0183 -1. BAL0121 1.
+ SH010122 COST 270.32 TRAN0101 1.
+ SH010122 BAL0101 -1. BAL0122 1.
+ SH010222 COST 630.02 TRAN0102 1.
+ SH010222 BAL0102 -1. BAL0122 1.
+ SH010322 COST 325.91 TRAN0103 1.
+ SH010322 BAL0103 -1. BAL0122 1.
+ SH010422 COST 244.16 TRAN0104 1.
+ SH010422 BAL0104 -1. BAL0122 1.
+ SH010522 COST 195.11 TRAN0105 1.
+ SH010522 BAL0105 -1. BAL0122 1.
+ SH010622 COST 337.9 TRAN0106 1.
+ SH010622 BAL0152 -1. BAL0122 1.
+ SH010822 COST 151.51 TRAN0108 1.
+ SH010822 BAL0183 -1. BAL0122 1.
+ SH010123 COST 255.06 TRAN0101 1.
+ SH010123 BAL0101 -1. BAL0123 1.
+ SH010223 COST 589.69 TRAN0102 1.
+ SH010223 BAL0102 -1. BAL0123 1.
+ SH010323 COST 312.83 TRAN0103 1.
+ SH010323 BAL0103 -1. BAL0123 1.
+ SH010423 COST 182.03 TRAN0104 1.
+ SH010423 BAL0104 -1. BAL0123 1.
+ SH010523 COST 180.94 TRAN0105 1.
+ SH010523 BAL0105 -1. BAL0123 1.
+ SH010823 COST 151.51 TRAN0108 1.
+ SH010823 BAL0183 -1. BAL0123 1.
+ SH010124 COST 1565.24 TRAN0101 1.
+ SH010124 BAL0101 -1. BAL0124 1.
+ SH010125 COST 421.83 TRAN0101 1.
+ SH010125 BAL0101 -1. BAL0125 1.
+ SH010225 COST 465.43 TRAN0102 1.
+ SH010225 BAL0102 -1. BAL0125 1.
+ SH010325 COST 556.99 TRAN0103 1.
+ SH010325 BAL0103 -1. BAL0125 1.
+ SH010425 COST 379.32 TRAN0104 1.
+ SH010425 BAL0104 -1. BAL0125 1.
+ SH010525 COST 616.94 TRAN0105 1.
+ SH010525 BAL0105 -1. BAL0125 1.
+ SH010625 COST 439.27 TRAN0106 1.
+ SH010625 BAL0152 -1. BAL0125 1.
+ SH010825 COST 332.45 TRAN0108 1.
+ SH010825 BAL0183 -1. BAL0125 1.
+ SH010426 COST 294.3 TRAN0104 1.
+ SH010426 BAL0104 -1. BAL0126 1.
+ SH010127 COST 255.06 TRAN0101 1.
+ SH010127 BAL0101 -1. BAL0127 1.
+ SH010227 COST 309.56 TRAN0102 1.
+ SH010227 BAL0102 -1. BAL0127 1.
+ SH010327 COST 315.01 TRAN0103 1.
+ SH010327 BAL0103 -1. BAL0127 1.
+ SH010427 COST 365.15 TRAN0104 1.
+ SH010427 BAL0104 -1. BAL0127 1.
+ SH010527 COST 412.02 TRAN0105 1.
+ SH010527 BAL0105 -1. BAL0127 1.
+ SH010627 COST 292.12 TRAN0106 1.
+ SH010627 BAL0152 -1. BAL0127 1.
+ SH010827 COST 274.68 TRAN0108 1.
+ SH010827 BAL0183 -1. BAL0127 1.
+ SH010128 COST 264.87 TRAN0101 1.
+ SH010128 BAL0101 -1. BAL0128 1.
+ SH010228 COST 620.21 TRAN0102 1.
+ SH010228 BAL0102 -1. BAL0128 1.
+ SH010328 COST 322.64 TRAN0103 1.
+ SH010328 BAL0103 -1. BAL0128 1.
+ SH010428 COST 321.55 TRAN0104 1.
+ SH010428 BAL0104 -1. BAL0128 1.
+ SH010528 COST 111.18 TRAN0105 1.
+ SH010528 BAL0105 -1. BAL0128 1.
+ SH010628 COST 284.49 TRAN0106 1.
+ SH010628 BAL0152 -1. BAL0128 1.
+ SH010728 COST 116.63 TRAN0107 1.
+ SH010728 BAL0164 -1. BAL0128 1.
+ SH010828 COST 276.86 TRAN0108 1.
+ SH010828 BAL0183 -1. BAL0128 1.
+ SH010129 COST 243.07 TRAN0101 1.
+ SH010129 BAL0101 -1. BAL0129 1.
+ SH010229 COST 505.76 TRAN0102 1.
+ SH010229 BAL0102 -1. BAL0129 1.
+ SH010329 COST 262.69 TRAN0103 1.
+ SH010329 BAL0103 -1. BAL0129 1.
+ SH010429 COST 216.91 TRAN0104 1.
+ SH010429 BAL0104 -1. BAL0129 1.
+ SH010529 COST 468.7 TRAN0105 1.
+ SH010529 BAL0105 -1. BAL0129 1.
+ SH010629 COST 284.49 TRAN0106 1.
+ SH010629 BAL0152 -1. BAL0129 1.
+ SH010829 COST 156.96 TRAN0108 1.
+ SH010829 BAL0183 -1. BAL0129 1.
+ SH010130 COST 507.94 TRAN0101 1.
+ SH010130 BAL0101 -1. BAL0130 1.
+ SH010230 COST 475.24 TRAN0102 1.
+ SH010230 BAL0102 -1. BAL0130 1.
+ SH010330 COST 570.07 TRAN0103 1.
+ SH010330 BAL0103 -1. BAL0130 1.
+ SH010430 COST 331.36 TRAN0104 1.
+ SH010430 BAL0104 -1. BAL0130 1.
+ SH010530 COST 486.14 TRAN0105 1.
+ SH010530 BAL0105 -1. BAL0130 1.
+ SH010830 COST 416.38 TRAN0108 1.
+ SH010830 BAL0183 -1. BAL0130 1.
+ SH010131 COST 120.99 TRAN0101 1.
+ SH010131 BAL0101 -1. BAL0131 1.
+ SH010231 COST 382.59 TRAN0102 1.
+ SH010231 BAL0102 -1. BAL0131 1.
+ SH010331 COST 119.9 TRAN0103 1.
+ SH010331 BAL0103 -1. BAL0131 1.
+ SH010431 COST 275.77 TRAN0104 1.
+ SH010431 BAL0104 -1. BAL0131 1.
+ SH010531 COST 334.63 TRAN0105 1.
+ SH010531 BAL0105 -1. BAL0131 1.
+ SH010631 COST 122.08 TRAN0106 1.
+ SH010631 BAL0152 -1. BAL0131 1.
+ SH010831 COST 243.07 TRAN0108 1.
+ SH010831 BAL0183 -1. BAL0131 1.
+ SH010132 COST 325.91 TRAN0101 1.
+ SH010132 BAL0101 -1. BAL0132 1.
+ SH010232 COST 521.02 TRAN0102 1.
+ SH010232 BAL0102 -1. BAL0132 1.
+ SH010332 COST 461.07 TRAN0103 1.
+ SH010332 BAL0103 -1. BAL0132 1.
+ SH010432 COST 171.13 TRAN0104 1.
+ SH010432 BAL0104 -1. BAL0132 1.
+ SH010532 COST 427.28 TRAN0105 1.
+ SH010532 BAL0105 -1. BAL0132 1.
+ SH010832 COST 196.2 TRAN0108 1.
+ SH010832 BAL0183 -1. BAL0132 1.
+ SH010133 COST 537.37 TRAN0101 1.
+ SH010133 BAL0101 -1. BAL0133 1.
+ SH010233 COST 436. TRAN0102 1.
+ SH010233 BAL0102 -1. BAL0133 1.
+ SH010333 COST 591.87 TRAN0103 1.
+ SH010333 BAL0103 -1. BAL0133 1.
+ SH010433 COST 485.05 TRAN0104 1.
+ SH010433 BAL0104 -1. BAL0133 1.
+ SH010533 COST 687.79 TRAN0105 1.
+ SH010533 BAL0105 -1. BAL0133 1.
+ SH010833 COST 415.29 TRAN0108 1.
+ SH010833 BAL0183 -1. BAL0133 1.
+ SH010134 COST 420.74 TRAN0101 1.
+ SH010134 BAL0101 -1. BAL0134 1.
+ SH010234 COST 713.95 TRAN0102 1.
+ SH010234 BAL0102 -1. BAL0134 1.
+ SH010334 COST 548.27 TRAN0103 1.
+ SH010334 BAL0103 -1. BAL0134 1.
+ SH010434 COST 229.99 TRAN0104 1.
+ SH010434 BAL0104 -1. BAL0134 1.
+ SH010534 COST 480.69 TRAN0105 1.
+ SH010534 BAL0105 -1. BAL0134 1.
+ SH010834 COST 286.67 TRAN0108 1.
+ SH010834 BAL0183 -1. BAL0134 1.
+ SH010135 COST 502.49 TRAN0101 1.
+ SH010135 BAL0101 -1. BAL0135 1.
+ SH010235 COST 485.05 TRAN0102 1.
+ SH010235 BAL0102 -1. BAL0135 1.
+ SH010335 COST 410.93 TRAN0103 1.
+ SH010335 BAL0103 -1. BAL0135 1.
+ SH010435 COST 132.98 TRAN0104 1.
+ SH010435 BAL0104 -1. BAL0135 1.
+ SH010535 COST 469.79 TRAN0105 1.
+ SH010535 BAL0105 -1. BAL0135 1.
+ SH010835 COST 256.15 TRAN0108 1.
+ SH010835 BAL0183 -1. BAL0135 1.
+ SH010136 COST 223.45 TRAN0101 1.
+ SH010136 BAL0101 -1. BAL0136 1.
+ SH010236 COST 488.32 TRAN0102 1.
+ SH010236 BAL0102 -1. BAL0136 1.
+ SH010336 COST 115.54 TRAN0103 1.
+ SH010336 BAL0103 -1. BAL0136 1.
+ SH010436 COST 403.3 TRAN0104 1.
+ SH010436 BAL0104 -1. BAL0136 1.
+ SH010536 COST 377.14 TRAN0105 1.
+ SH010536 BAL0105 -1. BAL0136 1.
+ SH010636 COST 119.9 TRAN0106 1.
+ SH010636 BAL0152 -1. BAL0136 1.
+ SH010836 COST 349.89 TRAN0108 1.
+ SH010836 BAL0183 -1. BAL0136 1.
+ SH010137 COST 100.28 TRAN0101 1.
+ SH010137 BAL0101 -1. BAL0137 1.
+ SH010237 COST 372.78 TRAN0102 1.
+ SH010237 BAL0102 -1. BAL0137 1.
+ SH010337 COST 172.22 TRAN0103 1.
+ SH010337 BAL0103 -1. BAL0137 1.
+ SH010437 COST 331.36 TRAN0104 1.
+ SH010437 BAL0104 -1. BAL0137 1.
+ SH010537 COST 198.38 TRAN0105 1.
+ SH010537 BAL0105 -1. BAL0137 1.
+ SH010637 COST 211.46 TRAN0106 1.
+ SH010637 BAL0152 -1. BAL0137 1.
+ SH010837 COST 274.68 TRAN0108 1.
+ SH010837 BAL0183 -1. BAL0137 1.
+ SH010138 COST 148.24 TRAN0101 1.
+ SH010138 BAL0101 -1. BAL0138 1.
+ SH010238 COST 265.96 TRAN0102 1.
+ SH010238 BAL0102 -1. BAL0138 1.
+ SH010338 COST 103.55 TRAN0103 1.
+ SH010338 BAL0103 -1. BAL0138 1.
+ SH010438 COST 335.72 TRAN0104 1.
+ SH010438 BAL0104 -1. BAL0138 1.
+ SH010538 COST 303.02 TRAN0105 1.
+ SH010538 BAL0105 -1. BAL0138 1.
+ SH010638 COST 42.51 TRAN0106 1.
+ SH010638 BAL0152 -1. BAL0138 1.
+ SH010738 COST 235.44 TRAN0107 1.
+ SH010738 BAL0164 -1. BAL0138 1.
+ SH010838 COST 258.33 TRAN0108 1.
+ SH010838 BAL0183 -1. BAL0138 1.
+ SH010139 COST 141.7 TRAN0101 1.
+ SH010139 BAL0101 -1. BAL0139 1.
+ SH010239 COST 369.51 TRAN0102 1.
+ SH010239 BAL0102 -1. BAL0139 1.
+ SH010339 COST 174.4 TRAN0103 1.
+ SH010339 BAL0103 -1. BAL0139 1.
+ SH010439 COST 271.41 TRAN0104 1.
+ SH010439 BAL0104 -1. BAL0139 1.
+ SH010539 COST 467.61 TRAN0105 1.
+ SH010539 BAL0105 -1. BAL0139 1.
+ SH010639 COST 222.36 TRAN0106 1.
+ SH010639 BAL0152 -1. BAL0139 1.
+ SH010839 COST 183.12 TRAN0108 1.
+ SH010839 BAL0183 -1. BAL0139 1.
+ SH010140 COST 179.85 TRAN0101 1.
+ SH010140 BAL0101 -1. BAL0140 1.
+ SH010240 COST 412.02 TRAN0102 1.
+ SH010240 BAL0102 -1. BAL0140 1.
+ SH010340 COST 112.27 TRAN0103 1.
+ SH010340 BAL0103 -1. BAL0140 1.
+ SH010440 COST 323.73 TRAN0104 1.
+ SH010440 BAL0104 -1. BAL0140 1.
+ SH010540 COST 240.89 TRAN0105 1.
+ SH010540 BAL0105 -1. BAL0140 1.
+ SH010640 COST 142.79 TRAN0106 1.
+ SH010640 BAL0152 -1. BAL0140 1.
+ SH010840 COST 298.66 TRAN0108 1.
+ SH010840 BAL0183 -1. BAL0140 1.
+ SH010141 COST 213.64 TRAN0101 1.
+ SH010141 BAL0101 -1. BAL0141 1.
+ SH010241 COST 327. TRAN0102 1.
+ SH010241 BAL0102 -1. BAL0141 1.
+ SH010341 COST 163.5 TRAN0103 1.
+ SH010341 BAL0103 -1. BAL0141 1.
+ SH010441 COST 353.16 TRAN0104 1.
+ SH010441 BAL0104 -1. BAL0141 1.
+ SH010541 COST 401.12 TRAN0105 1.
+ SH010541 BAL0105 -1. BAL0141 1.
+ SH010641 COST 109. TRAN0106 1.
+ SH010641 BAL0152 -1. BAL0141 1.
+ SH010841 COST 325.91 TRAN0108 1.
+ SH010841 BAL0183 -1. BAL0141 1.
+ SH010142 COST 98.1 TRAN0101 1.
+ SH010142 BAL0101 -1. BAL0142 1.
+ SH010242 COST 451.26 TRAN0102 1.
+ SH010242 BAL0102 -1. BAL0142 1.
+ SH010342 COST 174.4 TRAN0103 1.
+ SH010342 BAL0103 -1. BAL0142 1.
+ SH010442 COST 212.55 TRAN0104 1.
+ SH010442 BAL0104 -1. BAL0142 1.
+ SH010542 COST 393.49 TRAN0105 1.
+ SH010542 BAL0105 -1. BAL0142 1.
+ SH010642 COST 175.49 TRAN0106 1.
+ SH010642 BAL0152 -1. BAL0142 1.
+ SH010842 COST 165.68 TRAN0108 1.
+ SH010842 BAL0183 -1. BAL0142 1.
+ SH010143 COST 173.31 TRAN0101 1.
+ SH010143 BAL0101 -1. BAL0143 1.
+ SH010243 COST 430.55 TRAN0102 1.
+ SH010243 BAL0102 -1. BAL0143 1.
+ SH010343 COST 27.25 TRAN0103 1.
+ SH010343 BAL0103 -1. BAL0143 1.
+ SH010443 COST 322.64 TRAN0104 1.
+ SH010443 BAL0104 -1. BAL0143 1.
+ SH010543 COST 281.22 TRAN0105 1.
+ SH010543 BAL0105 -1. BAL0143 1.
+ SH010643 COST 109. TRAN0106 1.
+ SH010643 BAL0152 -1. BAL0143 1.
+ SH010743 COST 262.69 TRAN0107 1.
+ SH010743 BAL0164 -1. BAL0143 1.
+ SH010843 COST 295.39 TRAN0108 1.
+ SH010843 BAL0183 -1. BAL0143 1.
+ SH010144 COST 173.31 TRAN0101 1.
+ SH010144 BAL0101 -1. BAL0144 1.
+ SH010244 COST 413.11 TRAN0102 1.
+ SH010244 BAL0102 -1. BAL0144 1.
+ SH010344 COST 139.52 TRAN0103 1.
+ SH010344 BAL0103 -1. BAL0144 1.
+ SH010444 COST 340.08 TRAN0104 1.
+ SH010444 BAL0104 -1. BAL0144 1.
+ SH010544 COST 337.9 TRAN0105 1.
+ SH010544 BAL0105 -1. BAL0144 1.
+ SH010644 COST 97.01 TRAN0106 1.
+ SH010644 BAL0152 -1. BAL0144 1.
+ SH010844 COST 324.82 TRAN0108 1.
+ SH010844 BAL0183 -1. BAL0144 1.
+ SH010145 COST 187.48 TRAN0101 1.
+ SH010145 BAL0101 -1. BAL0145 1.
+ SH010245 COST 475.24 TRAN0102 1.
+ SH010245 BAL0102 -1. BAL0145 1.
+ SH010345 COST 175.49 TRAN0103 1.
+ SH010345 BAL0103 -1. BAL0145 1.
+ SH010445 COST 318.28 TRAN0104 1.
+ SH010445 BAL0104 -1. BAL0145 1.
+ SH010545 COST 255.06 TRAN0105 1.
+ SH010545 BAL0105 -1. BAL0145 1.
+ SH010645 COST 208.19 TRAN0106 1.
+ SH010645 BAL0152 -1. BAL0145 1.
+ SH010745 COST 214.73 TRAN0107 1.
+ SH010745 BAL0164 -1. BAL0145 1.
+ SH010845 COST 332.45 TRAN0108 1.
+ SH010845 BAL0183 -1. BAL0145 1.
+ SH010146 COST 267.05 TRAN0101 1.
+ SH010146 BAL0101 -1. BAL0146 1.
+ SH010246 COST 297.57 TRAN0102 1.
+ SH010246 BAL0102 -1. BAL0146 1.
+ SH010346 COST 240.89 TRAN0103 1.
+ SH010346 BAL0103 -1. BAL0146 1.
+ SH010446 COST 487.23 TRAN0104 1.
+ SH010446 BAL0104 -1. BAL0146 1.
+ SH010546 COST 468.7 TRAN0105 1.
+ SH010546 BAL0105 -1. BAL0146 1.
+ SH010646 COST 280.13 TRAN0106 1.
+ SH010646 BAL0152 -1. BAL0146 1.
+ SH010846 COST 488.32 TRAN0108 1.
+ SH010846 BAL0183 -1. BAL0146 1.
+ SH010147 COST 119.9 TRAN0101 1.
+ SH010147 BAL0101 -1. BAL0147 1.
+ SH010247 COST 406.57 TRAN0102 1.
+ SH010247 BAL0102 -1. BAL0147 1.
+ SH010347 COST 173.31 TRAN0103 1.
+ SH010347 BAL0103 -1. BAL0147 1.
+ SH010447 COST 298.66 TRAN0104 1.
+ SH010447 BAL0104 -1. BAL0147 1.
+ SH010547 COST 253.97 TRAN0105 1.
+ SH010547 BAL0105 -1. BAL0147 1.
+ SH010647 COST 158.05 TRAN0106 1.
+ SH010647 BAL0152 -1. BAL0147 1.
+ SH010847 COST 265.96 TRAN0108 1.
+ SH010847 BAL0183 -1. BAL0147 1.
+ SH010148 COST 103.55 TRAN0101 1.
+ SH010148 BAL0101 -1. BAL0148 1.
+ SH010248 COST 369.51 TRAN0102 1.
+ SH010248 BAL0102 -1. BAL0148 1.
+ SH010348 COST 149.33 TRAN0103 1.
+ SH010348 BAL0103 -1. BAL0148 1.
+ SH010448 COST 250.7 TRAN0104 1.
+ SH010448 BAL0104 -1. BAL0148 1.
+ SH010548 COST 269.23 TRAN0105 1.
+ SH010548 BAL0105 -1. BAL0148 1.
+ SH010648 COST 125.35 TRAN0106 1.
+ SH010648 BAL0152 -1. BAL0148 1.
+ SH010848 COST 212.55 TRAN0108 1.
+ SH010848 BAL0183 -1. BAL0148 1.
+ SH010149 COST 358.61 TRAN0101 1.
+ SH010149 BAL0101 -1. BAL0149 1.
+ SH010249 COST 583.15 TRAN0102 1.
+ SH010249 BAL0102 -1. BAL0149 1.
+ SH010349 COST 361.88 TRAN0103 1.
+ SH010349 BAL0103 -1. BAL0149 1.
+ SH010449 COST 415.29 TRAN0104 1.
+ SH010449 BAL0104 -1. BAL0149 1.
+ SH010549 COST 165.68 TRAN0105 1.
+ SH010549 BAL0105 -1. BAL0149 1.
+ SH010649 COST 368.42 TRAN0106 1.
+ SH010649 BAL0152 -1. BAL0149 1.
+ SH010749 COST 146.06 TRAN0107 1.
+ SH010749 BAL0164 -1. BAL0149 1.
+ SH010849 COST 444.72 TRAN0108 1.
+ SH010849 BAL0183 -1. BAL0149 1.
+ SH010150 COST 262.69 TRAN0101 1.
+ SH010150 BAL0101 -1. BAL0150 1.
+ SH010250 COST 667.08 TRAN0102 1.
+ SH010250 BAL0102 -1. BAL0150 1.
+ SH010350 COST 268.14 TRAN0103 1.
+ SH010350 BAL0103 -1. BAL0150 1.
+ SH010450 COST 397.85 TRAN0104 1.
+ SH010450 BAL0104 -1. BAL0150 1.
+ SH010550 COST 256.15 TRAN0105 1.
+ SH010550 BAL0105 -1. BAL0150 1.
+ SH010750 COST 149.33 TRAN0107 1.
+ SH010750 BAL0164 -1. BAL0150 1.
+ SH010850 COST 442.54 TRAN0108 1.
+ SH010850 BAL0183 -1. BAL0150 1.
+ SH010151 COST 361.88 TRAN0101 1.
+ SH010151 BAL0101 -1. BAL0151 1.
+ SH010251 COST 599.5 TRAN0102 1.
+ SH010251 BAL0102 -1. BAL0151 1.
+ SH010351 COST 371.69 TRAN0103 1.
+ SH010351 BAL0103 -1. BAL0151 1.
+ SH010451 COST 368.42 TRAN0104 1.
+ SH010451 BAL0104 -1. BAL0151 1.
+ SH010551 COST 134.07 TRAN0105 1.
+ SH010551 BAL0105 -1. BAL0151 1.
+ SH010751 COST 107.91 TRAN0107 1.
+ SH010751 BAL0164 -1. BAL0151 1.
+ SH010851 COST 466.52 TRAN0108 1.
+ SH010851 BAL0183 -1. BAL0151 1.
+ SH010152 COST 122.08 TRAN0101 1.
+ SH010152 BAL0101 -1. BAL0152 1.
+ SH010252 COST 327. TRAN0102 1.
+ SH010252 BAL0102 -1. BAL0152 1.
+ SH010352 COST 89.38 TRAN0103 1.
+ SH010352 BAL0103 -1. BAL0152 1.
+ SH010452 COST 350.98 TRAN0104 1.
+ SH010452 BAL0104 -1. BAL0152 1.
+ SH010552 COST 321.55 TRAN0105 1.
+ SH010552 BAL0105 -1. BAL0152 1.
+ SH010852 COST 275.77 TRAN0108 1.
+ SH010852 BAL0183 -1. BAL0152 1.
+ SH010153 COST 391.31 TRAN0101 1.
+ SH010153 BAL0101 -1. BAL0153 1.
+ SH010253 COST 693.24 TRAN0102 1.
+ SH010253 BAL0102 -1. BAL0153 1.
+ SH010353 COST 354.25 TRAN0103 1.
+ SH010353 BAL0103 -1. BAL0153 1.
+ SH010453 COST 449.08 TRAN0104 1.
+ SH010453 BAL0104 -1. BAL0153 1.
+ SH010553 COST 200.56 TRAN0105 1.
+ SH010553 BAL0105 -1. BAL0153 1.
+ SH010653 COST 391.31 TRAN0106 1.
+ SH010653 BAL0152 -1. BAL0153 1.
+ SH010753 COST 159.14 TRAN0107 1.
+ SH010753 BAL0164 -1. BAL0153 1.
+ SH010853 COST 439.27 TRAN0108 1.
+ SH010853 BAL0183 -1. BAL0153 1.
+ SH010154 COST 201.65 TRAN0101 1.
+ SH010154 BAL0101 -1. BAL0154 1.
+ SH010254 COST 485.05 TRAN0102 1.
+ SH010254 BAL0102 -1. BAL0154 1.
+ SH010354 COST 236.53 TRAN0103 1.
+ SH010354 BAL0103 -1. BAL0154 1.
+ SH010454 COST 373.87 TRAN0104 1.
+ SH010454 BAL0104 -1. BAL0154 1.
+ SH010554 COST 232.17 TRAN0105 1.
+ SH010554 BAL0105 -1. BAL0154 1.
+ SH010654 COST 221.27 TRAN0106 1.
+ SH010654 BAL0152 -1. BAL0154 1.
+ SH010854 COST 438.18 TRAN0108 1.
+ SH010854 BAL0183 -1. BAL0154 1.
+ SH010155 COST 303.02 TRAN0101 1.
+ SH010155 BAL0101 -1. BAL0155 1.
+ SH010255 COST 522.11 TRAN0102 1.
+ SH010255 BAL0102 -1. BAL0155 1.
+ SH010355 COST 306.29 TRAN0103 1.
+ SH010355 BAL0103 -1. BAL0155 1.
+ SH010455 COST 320.46 TRAN0104 1.
+ SH010455 BAL0104 -1. BAL0155 1.
+ SH010555 COST 167.86 TRAN0105 1.
+ SH010555 BAL0105 -1. BAL0155 1.
+ SH010655 COST 316.1 TRAN0106 1.
+ SH010655 BAL0152 -1. BAL0155 1.
+ SH010755 COST 116.63 TRAN0107 1.
+ SH010755 BAL0164 -1. BAL0155 1.
+ SH010855 COST 320.46 TRAN0108 1.
+ SH010855 BAL0183 -1. BAL0155 1.
+ SH010156 COST 425.1 TRAN0101 1.
+ SH010156 BAL0101 -1. BAL0156 1.
+ SH010256 COST 631.11 TRAN0102 1.
+ SH010256 BAL0102 -1. BAL0156 1.
+ SH010356 COST 332.45 TRAN0103 1.
+ SH010356 BAL0103 -1. BAL0156 1.
+ SH010456 COST 397.85 TRAN0104 1.
+ SH010456 BAL0104 -1. BAL0156 1.
+ SH010556 COST 148.24 TRAN0105 1.
+ SH010556 BAL0105 -1. BAL0156 1.
+ SH010656 COST 369.51 TRAN0106 1.
+ SH010656 BAL0152 -1. BAL0156 1.
+ SH010756 COST 132.98 TRAN0107 1.
+ SH010756 BAL0164 -1. BAL0156 1.
+ SH010856 COST 389.13 TRAN0108 1.
+ SH010856 BAL0183 -1. BAL0156 1.
+ SH010157 COST 284.49 TRAN0101 1.
+ SH010157 BAL0101 -1. BAL0157 1.
+ SH010257 COST 566.8 TRAN0102 1.
+ SH010257 BAL0102 -1. BAL0157 1.
+ SH010357 COST 316.1 TRAN0103 1.
+ SH010357 BAL0103 -1. BAL0157 1.
+ SH010457 COST 255.06 TRAN0104 1.
+ SH010457 BAL0104 -1. BAL0157 1.
+ SH010557 COST 183.12 TRAN0105 1.
+ SH010557 BAL0105 -1. BAL0157 1.
+ SH010657 COST 347.71 TRAN0106 1.
+ SH010657 BAL0152 -1. BAL0157 1.
+ SH010757 COST 161.32 TRAN0107 1.
+ SH010757 BAL0164 -1. BAL0157 1.
+ SH010857 COST 251.79 TRAN0108 1.
+ SH010857 BAL0183 -1. BAL0157 1.
+ SH010158 COST 320.46 TRAN0101 1.
+ SH010158 BAL0101 -1. BAL0158 1.
+ SH010258 COST 567.89 TRAN0102 1.
+ SH010258 BAL0102 -1. BAL0158 1.
+ SH010358 COST 303.02 TRAN0103 1.
+ SH010358 BAL0103 -1. BAL0158 1.
+ SH010458 COST 373.87 TRAN0104 1.
+ SH010458 BAL0104 -1. BAL0158 1.
+ SH010558 COST 22.89 TRAN0105 1.
+ SH010558 BAL0105 -1. BAL0158 1.
+ SH010658 COST 355.34 TRAN0106 1.
+ SH010658 BAL0152 -1. BAL0158 1.
+ SH010758 COST 74.12 TRAN0107 1.
+ SH010758 BAL0164 -1. BAL0158 1.
+ SH010858 COST 276.86 TRAN0108 1.
+ SH010858 BAL0183 -1. BAL0158 1.
+ SH010159 COST 224.54 TRAN0101 1.
+ SH010159 BAL0101 -1. BAL0159 1.
+ SH010259 COST 542.82 TRAN0102 1.
+ SH010259 BAL0102 -1. BAL0159 1.
+ SH010359 COST 259.42 TRAN0103 1.
+ SH010359 BAL0103 -1. BAL0159 1.
+ SH010459 COST 265.96 TRAN0104 1.
+ SH010459 BAL0104 -1. BAL0159 1.
+ SH010559 COST 173.31 TRAN0105 1.
+ SH010559 BAL0105 -1. BAL0159 1.
+ SH010659 COST 323.73 TRAN0106 1.
+ SH010659 BAL0152 -1. BAL0159 1.
+ SH010759 COST 114.45 TRAN0107 1.
+ SH010759 BAL0164 -1. BAL0159 1.
+ SH010859 COST 277.95 TRAN0108 1.
+ SH010859 BAL0183 -1. BAL0159 1.
+ SH010160 COST 284.49 TRAN0101 1.
+ SH010160 BAL0101 -1. BAL0160 1.
+ SH010260 COST 599.5 TRAN0102 1.
+ SH010260 BAL0102 -1. BAL0160 1.
+ SH010360 COST 308.47 TRAN0103 1.
+ SH010360 BAL0103 -1. BAL0160 1.
+ SH010460 COST 340.08 TRAN0104 1.
+ SH010460 BAL0104 -1. BAL0160 1.
+ SH010560 COST 147.15 TRAN0105 1.
+ SH010560 BAL0105 -1. BAL0160 1.
+ SH010660 COST 352.07 TRAN0106 1.
+ SH010660 BAL0152 -1. BAL0160 1.
+ SH010760 COST 95.92 TRAN0107 1.
+ SH010760 BAL0164 -1. BAL0160 1.
+ SH010860 COST 325.91 TRAN0108 1.
+ SH010860 BAL0183 -1. BAL0160 1.
+ SH010163 COST 289.94 TRAN0101 1.
+ SH010163 BAL0101 -1. BAL0163 1.
+ SH010263 COST 538.46 TRAN0102 1.
+ SH010263 BAL0102 -1. BAL0163 1.
+ SH010363 COST 312.83 TRAN0103 1.
+ SH010363 BAL0103 -1. BAL0163 1.
+ SH010463 COST 402.21 TRAN0104 1.
+ SH010463 BAL0104 -1. BAL0163 1.
+ SH010563 COST 165.68 TRAN0105 1.
+ SH010563 BAL0105 -1. BAL0163 1.
+ SH010663 COST 343.35 TRAN0106 1.
+ SH010663 BAL0152 -1. BAL0163 1.
+ SH010763 COST 135.16 TRAN0107 1.
+ SH010763 BAL0164 -1. BAL0163 1.
+ SH010863 COST 436. TRAN0108 1.
+ SH010863 BAL0183 -1. BAL0163 1.
+ SH010164 COST 216.91 TRAN0101 1.
+ SH010164 BAL0101 -1. BAL0164 1.
+ SH010264 COST 573.34 TRAN0102 1.
+ SH010264 BAL0102 -1. BAL0164 1.
+ SH010364 COST 243.07 TRAN0103 1.
+ SH010364 BAL0103 -1. BAL0164 1.
+ SH010464 COST 366.24 TRAN0104 1.
+ SH010464 BAL0104 -1. BAL0164 1.
+ SH010564 COST 63.22 TRAN0105 1.
+ SH010564 BAL0105 -1. BAL0164 1.
+ SH010664 COST 345.53 TRAN0106 1.
+ SH010664 BAL0152 -1. BAL0164 1.
+ SH010864 COST 272.5 TRAN0108 1.
+ SH010864 BAL0183 -1. BAL0164 1.
+ SH010165 COST 470.88 TRAN0101 1.
+ SH010165 BAL0101 -1. BAL0165 1.
+ SH010265 COST 334.63 TRAN0102 1.
+ SH010265 BAL0102 -1. BAL0165 1.
+ SH010365 COST 550.45 TRAN0103 1.
+ SH010365 BAL0103 -1. BAL0165 1.
+ SH010465 COST 422.92 TRAN0104 1.
+ SH010465 BAL0104 -1. BAL0165 1.
+ SH010565 COST 658.36 TRAN0105 1.
+ SH010565 BAL0105 -1. BAL0165 1.
+ SH010865 COST 452.35 TRAN0108 1.
+ SH010865 BAL0183 -1. BAL0165 1.
+ SH010166 COST 610.4 TRAN0101 1.
+ SH010166 BAL0101 -1. BAL0166 1.
+ SH010266 COST 282.31 TRAN0102 1.
+ SH010266 BAL0102 -1. BAL0166 1.
+ SH010366 COST 630.02 TRAN0103 1.
+ SH010366 BAL0103 -1. BAL0166 1.
+ SH010466 COST 606.04 TRAN0104 1.
+ SH010466 BAL0104 -1. BAL0166 1.
+ SH010566 COST 773.9 TRAN0105 1.
+ SH010566 BAL0105 -1. BAL0166 1.
+ SH010866 COST 610.4 TRAN0108 1.
+ SH010866 BAL0183 -1. BAL0166 1.
+ SH010167 COST 463.25 TRAN0101 1.
+ SH010167 BAL0101 -1. BAL0167 1.
+ SH010267 COST 252.88 TRAN0102 1.
+ SH010267 BAL0102 -1. BAL0167 1.
+ SH010367 COST 537.37 TRAN0103 1.
+ SH010367 BAL0103 -1. BAL0167 1.
+ SH010467 COST 498.13 TRAN0104 1.
+ SH010467 BAL0104 -1. BAL0167 1.
+ SH010567 COST 658.36 TRAN0105 1.
+ SH010567 BAL0105 -1. BAL0167 1.
+ SH010867 COST 499.22 TRAN0108 1.
+ SH010867 BAL0183 -1. BAL0167 1.
+ SH010168 COST 647.46 TRAN0101 1.
+ SH010168 BAL0101 -1. BAL0168 1.
+ SH010268 COST 436. TRAN0102 1.
+ SH010268 BAL0102 -1. BAL0168 1.
+ SH010368 COST 610.4 TRAN0103 1.
+ SH010368 BAL0103 -1. BAL0168 1.
+ SH010468 COST 765.18 TRAN0104 1.
+ SH010468 BAL0104 -1. BAL0168 1.
+ SH010568 COST 1031.14 TRAN0105 1.
+ SH010568 BAL0105 -1. BAL0168 1.
+ SH010868 COST 818.59 TRAN0108 1.
+ SH010868 BAL0183 -1. BAL0168 1.
+ SH010169 COST 587.51 TRAN0101 1.
+ SH010169 BAL0101 -1. BAL0169 1.
+ SH010269 COST 240.89 TRAN0102 1.
+ SH010269 BAL0102 -1. BAL0169 1.
+ SH010369 COST 555.9 TRAN0103 1.
+ SH010369 BAL0103 -1. BAL0169 1.
+ SH010469 COST 677.98 TRAN0104 1.
+ SH010469 BAL0104 -1. BAL0169 1.
+ SH010569 COST 704.14 TRAN0105 1.
+ SH010569 BAL0105 -1. BAL0169 1.
+ SH010869 COST 717.22 TRAN0108 1.
+ SH010869 BAL0183 -1. BAL0169 1.
+ SH010171 COST 479.6 TRAN0101 1.
+ SH010171 BAL0101 -1. BAL0171 1.
+ SH010371 COST 571.16 TRAN0103 1.
+ SH010371 BAL0103 -1. BAL0171 1.
+ SH010471 COST 567.89 TRAN0104 1.
+ SH010471 BAL0104 -1. BAL0171 1.
+ SH010571 COST 633.29 TRAN0105 1.
+ SH010571 BAL0105 -1. BAL0171 1.
+ SH010671 COST 426.19 TRAN0106 1.
+ SH010671 BAL0152 -1. BAL0171 1.
+ SH010771 COST 767.36 TRAN0107 1.
+ SH010771 BAL0164 -1. BAL0171 1.
+ SH010871 COST 580.97 TRAN0108 1.
+ SH010871 BAL0183 -1. BAL0171 1.
+ SH010172 COST 639.83 TRAN0101 1.
+ SH010172 BAL0101 -1. BAL0172 1.
+ SH010272 COST 591.87 TRAN0102 1.
+ SH010272 BAL0102 -1. BAL0172 1.
+ SH010372 COST 672.53 TRAN0103 1.
+ SH010372 BAL0103 -1. BAL0172 1.
+ SH010472 COST 621.3 TRAN0104 1.
+ SH010472 BAL0104 -1. BAL0172 1.
+ SH010572 COST 831.67 TRAN0105 1.
+ SH010572 BAL0105 -1. BAL0172 1.
+ SH010872 COST 621.3 TRAN0108 1.
+ SH010872 BAL0183 -1. BAL0172 1.
+ SH010173 COST 425.1 TRAN0101 1.
+ SH010173 BAL0101 -1. BAL0173 1.
+ SH010273 COST 397.85 TRAN0102 1.
+ SH010273 BAL0102 -1. BAL0173 1.
+ SH010373 COST 368.42 TRAN0103 1.
+ SH010373 BAL0103 -1. BAL0173 1.
+ SH010473 COST 498.13 TRAN0104 1.
+ SH010473 BAL0104 -1. BAL0173 1.
+ SH010573 COST 614.76 TRAN0105 1.
+ SH010573 BAL0105 -1. BAL0173 1.
+ SH010673 COST 332.45 TRAN0106 1.
+ SH010673 BAL0152 -1. BAL0173 1.
+ SH010873 COST 549.36 TRAN0108 1.
+ SH010873 BAL0183 -1. BAL0173 1.
+ SH010174 COST 597.32 TRAN0101 1.
+ SH010174 BAL0101 -1. BAL0174 1.
+ SH010274 COST 228.9 TRAN0102 1.
+ SH010274 BAL0102 -1. BAL0174 1.
+ SH010374 COST 621.3 TRAN0103 1.
+ SH010374 BAL0103 -1. BAL0174 1.
+ SH010474 COST 694.33 TRAN0104 1.
+ SH010474 BAL0104 -1. BAL0174 1.
+ SH010574 COST 798.97 TRAN0105 1.
+ SH010574 BAL0105 -1. BAL0174 1.
+ SH010874 COST 674.71 TRAN0108 1.
+ SH010874 BAL0183 -1. BAL0174 1.
+ SH010275 COST 603.86 TRAN0102 1.
+ SH010275 BAL0102 -1. BAL0175 1.
+ SH010176 COST 503.58 TRAN0101 1.
+ SH010176 BAL0101 -1. BAL0176 1.
+ SH010276 COST 437.09 TRAN0102 1.
+ SH010276 BAL0102 -1. BAL0176 1.
+ SH010376 COST 439.27 TRAN0103 1.
+ SH010376 BAL0103 -1. BAL0176 1.
+ SH010476 COST 686.7 TRAN0104 1.
+ SH010476 BAL0104 -1. BAL0176 1.
+ SH010576 COST 686.7 TRAN0105 1.
+ SH010576 BAL0105 -1. BAL0176 1.
+ SH010676 COST 415.29 TRAN0106 1.
+ SH010676 BAL0152 -1. BAL0176 1.
+ SH010876 COST 846.93 TRAN0108 1.
+ SH010876 BAL0183 -1. BAL0176 1.
+ SH010177 COST 474.15 TRAN0101 1.
+ SH010177 BAL0101 -1. BAL0177 1.
+ SH010277 COST 296.48 TRAN0102 1.
+ SH010277 BAL0102 -1. BAL0177 1.
+ SH010377 COST 502.49 TRAN0103 1.
+ SH010377 BAL0103 -1. BAL0177 1.
+ SH010477 COST 437.09 TRAN0104 1.
+ SH010477 BAL0104 -1. BAL0177 1.
+ SH010577 COST 610.4 TRAN0105 1.
+ SH010577 BAL0105 -1. BAL0177 1.
+ SH010877 COST 348.8 TRAN0108 1.
+ SH010877 BAL0183 -1. BAL0177 1.
+ SH010178 COST 829.49 TRAN0101 1.
+ SH010178 BAL0101 -1. BAL0178 1.
+ SH010278 COST 481.78 TRAN0102 1.
+ SH010278 BAL0102 -1. BAL0178 1.
+ SH010378 COST 853.47 TRAN0103 1.
+ SH010378 BAL0103 -1. BAL0178 1.
+ SH010478 COST 746.65 TRAN0104 1.
+ SH010478 BAL0104 -1. BAL0178 1.
+ SH010578 COST 958.11 TRAN0105 1.
+ SH010578 BAL0105 -1. BAL0178 1.
+ SH010878 COST 834.94 TRAN0108 1.
+ SH010878 BAL0183 -1. BAL0178 1.
+ SH010179 COST 779.35 TRAN0101 1.
+ SH010179 BAL0101 -1. BAL0179 1.
+ SH010279 COST 293.21 TRAN0102 1.
+ SH010279 BAL0102 -1. BAL0179 1.
+ SH010379 COST 753.19 TRAN0103 1.
+ SH010379 BAL0103 -1. BAL0179 1.
+ SH010479 COST 784.8 TRAN0104 1.
+ SH010479 BAL0104 -1. BAL0179 1.
+ SH010879 COST 769.54 TRAN0108 1.
+ SH010879 BAL0183 -1. BAL0179 1.
+ SH010180 COST 345.53 TRAN0101 1.
+ SH010180 BAL0101 -1. BAL0180 1.
+ SH010280 COST 430.55 TRAN0102 1.
+ SH010280 BAL0102 -1. BAL0180 1.
+ SH010380 COST 476.33 TRAN0103 1.
+ SH010380 BAL0103 -1. BAL0180 1.
+ SH010480 COST 407.66 TRAN0104 1.
+ SH010480 BAL0104 -1. BAL0180 1.
+ SH010580 COST 550.45 TRAN0105 1.
+ SH010580 BAL0105 -1. BAL0180 1.
+ SH010880 COST 261.6 TRAN0108 1.
+ SH010880 BAL0183 -1. BAL0180 1.
+ SH010182 COST 634.38 TRAN0101 1.
+ SH010182 BAL0101 -1. BAL0182 1.
+ SH010282 COST 358.61 TRAN0102 1.
+ SH010282 BAL0102 -1. BAL0182 1.
+ SH010382 COST 713.95 TRAN0103 1.
+ SH010382 BAL0103 -1. BAL0182 1.
+ SH010482 COST 769.54 TRAN0104 1.
+ SH010482 BAL0104 -1. BAL0182 1.
+ SH010582 COST 1250.23 TRAN0105 1.
+ SH010582 BAL0105 -1. BAL0182 1.
+ SH010882 COST 853.47 TRAN0108 1.
+ SH010882 BAL0183 -1. BAL0182 1.
+ SH010183 COST 192.93 TRAN0101 1.
+ SH010183 BAL0101 -1. BAL0183 1.
+ SH010283 COST 566.8 TRAN0102 1.
+ SH010283 BAL0102 -1. BAL0183 1.
+ SH010383 COST 296.48 TRAN0103 1.
+ SH010383 BAL0103 -1. BAL0183 1.
+ SH010483 COST 64.31 TRAN0104 1.
+ SH010483 BAL0104 -1. BAL0183 1.
+ SH010583 COST 378.23 TRAN0105 1.
+ SH010583 BAL0105 -1. BAL0183 1.
+ SH010683 COST 270.32 TRAN0106 1.
+ SH010683 BAL0152 -1. BAL0183 1.
+ SH010184 COST 331.36 TRAN0101 1.
+ SH010184 BAL0101 -1. BAL0184 1.
+ SH010284 COST 209.28 TRAN0102 1.
+ SH010284 BAL0102 -1. BAL0184 1.
+ SH010384 COST 396.76 TRAN0103 1.
+ SH010384 BAL0103 -1. BAL0184 1.
+ SH010484 COST 403.3 TRAN0104 1.
+ SH010484 BAL0104 -1. BAL0184 1.
+ SH010584 COST 534.1 TRAN0105 1.
+ SH010584 BAL0105 -1. BAL0184 1.
+ SH010684 COST 332.45 TRAN0106 1.
+ SH010684 BAL0152 -1. BAL0184 1.
+ SH010884 COST 422.92 TRAN0108 1.
+ SH010884 BAL0183 -1. BAL0184 1.
+ SH020201 COST 368.28 TRAN0202 1.
+ SH020201 BAL0202 -1. BAL0201 1.
+ SH020301 COST 141.36 TRAN0203 1.
+ SH020301 BAL0203 -1. BAL0201 1.
+ SH020401 COST 257.92 TRAN0204 1.
+ SH020401 BAL0204 -1. BAL0201 1.
+ SH020501 COST 293.88 TRAN0205 1.
+ SH020501 BAL0205 -1. BAL0201 1.
+ SH020601 COST 156.24 TRAN0206 1.
+ SH020601 BAL0252 -1. BAL0201 1.
+ SH020801 COST 177.32 TRAN0208 1.
+ SH020801 BAL0283 -1. BAL0201 1.
+ SH020102 COST 587.76 TRAN0201 1.
+ SH020102 BAL0201 -1. BAL0202 1.
+ SH020302 COST 517.08 TRAN0203 1.
+ SH020302 BAL0203 -1. BAL0202 1.
+ SH020402 COST 758.88 TRAN0204 1.
+ SH020402 BAL0204 -1. BAL0202 1.
+ SH020502 COST 918.84 TRAN0205 1.
+ SH020502 BAL0205 -1. BAL0202 1.
+ SH020602 COST 468.72 TRAN0206 1.
+ SH020602 BAL0252 -1. BAL0202 1.
+ SH020802 COST 646.04 TRAN0208 1.
+ SH020802 BAL0283 -1. BAL0202 1.
+ SH020103 COST 303.8 TRAN0201 1.
+ SH020103 BAL0201 -1. BAL0203 1.
+ SH020203 COST 587.76 TRAN0202 1.
+ SH020203 BAL0202 -1. BAL0203 1.
+ SH020403 COST 455.08 TRAN0204 1.
+ SH020403 BAL0204 -1. BAL0203 1.
+ SH020503 COST 352.16 TRAN0205 1.
+ SH020503 BAL0205 -1. BAL0203 1.
+ SH020603 COST 111.6 TRAN0206 1.
+ SH020603 BAL0252 -1. BAL0203 1.
+ SH020803 COST 316.2 TRAN0208 1.
+ SH020803 BAL0283 -1. BAL0203 1.
+ SH020104 COST 215.76 TRAN0201 1.
+ SH020104 BAL0201 -1. BAL0204 1.
+ SH020204 COST 623.72 TRAN0202 1.
+ SH020204 BAL0202 -1. BAL0204 1.
+ SH020304 COST 301.32 TRAN0203 1.
+ SH020304 BAL0203 -1. BAL0204 1.
+ SH020504 COST 395.56 TRAN0205 1.
+ SH020504 BAL0205 -1. BAL0204 1.
+ SH020604 COST 303.8 TRAN0206 1.
+ SH020604 BAL0252 -1. BAL0204 1.
+ SH020704 COST 333.56 TRAN0207 1.
+ SH020704 BAL0264 -1. BAL0204 1.
+ SH020804 COST 71.92 TRAN0208 1.
+ SH020804 BAL0283 -1. BAL0204 1.
+ SH020105 COST 334.8 TRAN0201 1.
+ SH020105 BAL0201 -1. BAL0205 1.
+ SH020205 COST 639.84 TRAN0202 1.
+ SH020205 BAL0202 -1. BAL0205 1.
+ SH020305 COST 352.16 TRAN0203 1.
+ SH020305 BAL0203 -1. BAL0205 1.
+ SH020405 COST 353.4 TRAN0204 1.
+ SH020405 BAL0204 -1. BAL0205 1.
+ SH020605 COST 404.24 TRAN0206 1.
+ SH020605 BAL0252 -1. BAL0205 1.
+ SH020705 COST 414.16 TRAN0207 1.
+ SH020705 BAL0264 -1. BAL0205 1.
+ SH020805 COST 336.04 TRAN0208 1.
+ SH020805 BAL0283 -1. BAL0205 1.
+ SH020106 COST 246.76 TRAN0201 1.
+ SH020106 BAL0201 -1. BAL0206 1.
+ SH020206 COST 517.08 TRAN0202 1.
+ SH020206 BAL0202 -1. BAL0206 1.
+ SH020306 COST 264.12 TRAN0203 1.
+ SH020306 BAL0203 -1. BAL0206 1.
+ SH020406 COST 271.56 TRAN0204 1.
+ SH020406 BAL0204 -1. BAL0206 1.
+ SH020506 COST 312.48 TRAN0205 1.
+ SH020506 BAL0205 -1. BAL0206 1.
+ SH020606 COST 255.44 TRAN0206 1.
+ SH020606 BAL0252 -1. BAL0206 1.
+ SH020706 COST 248. TRAN0207 1.
+ SH020706 BAL0264 -1. BAL0206 1.
+ SH020806 COST 187.24 TRAN0208 1.
+ SH020806 BAL0283 -1. BAL0206 1.
+ SH020107 COST 26.04 TRAN0201 1.
+ SH020107 BAL0201 -1. BAL0207 1.
+ SH020207 COST 362.08 TRAN0202 1.
+ SH020207 BAL0202 -1. BAL0207 1.
+ SH020307 COST 153.76 TRAN0203 1.
+ SH020307 BAL0203 -1. BAL0207 1.
+ SH020407 COST 256.68 TRAN0204 1.
+ SH020407 BAL0204 -1. BAL0207 1.
+ SH020507 COST 283.96 TRAN0205 1.
+ SH020507 BAL0205 -1. BAL0207 1.
+ SH020607 COST 155. TRAN0206 1.
+ SH020607 BAL0252 -1. BAL0207 1.
+ SH020707 COST 287.68 TRAN0207 1.
+ SH020707 BAL0264 -1. BAL0207 1.
+ SH020807 COST 192.2 TRAN0208 1.
+ SH020807 BAL0283 -1. BAL0207 1.
+ SH020108 COST 81.84 TRAN0201 1.
+ SH020108 BAL0201 -1. BAL0208 1.
+ SH020208 COST 466.24 TRAN0202 1.
+ SH020208 BAL0202 -1. BAL0208 1.
+ SH020308 COST 174.84 TRAN0203 1.
+ SH020308 BAL0203 -1. BAL0208 1.
+ SH020408 COST 306.28 TRAN0204 1.
+ SH020408 BAL0204 -1. BAL0208 1.
+ SH020508 COST 225.68 TRAN0205 1.
+ SH020508 BAL0205 -1. BAL0208 1.
+ SH020608 COST 205.84 TRAN0206 1.
+ SH020608 BAL0252 -1. BAL0208 1.
+ SH020808 COST 231.88 TRAN0208 1.
+ SH020808 BAL0283 -1. BAL0208 1.
+ SH020109 COST 171.12 TRAN0201 1.
+ SH020109 BAL0201 -1. BAL0209 1.
+ SH020209 COST 474.92 TRAN0202 1.
+ SH020209 BAL0202 -1. BAL0209 1.
+ SH020309 COST 208.32 TRAN0203 1.
+ SH020309 BAL0203 -1. BAL0209 1.
+ SH020409 COST 313.72 TRAN0204 1.
+ SH020409 BAL0204 -1. BAL0209 1.
+ SH020509 COST 296.36 TRAN0205 1.
+ SH020509 BAL0205 -1. BAL0209 1.
+ SH020709 COST 243.04 TRAN0207 1.
+ SH020709 BAL0264 -1. BAL0209 1.
+ SH020809 COST 240.56 TRAN0208 1.
+ SH020809 BAL0283 -1. BAL0209 1.
+ SH020110 COST 306.28 TRAN0201 1.
+ SH020110 BAL0201 -1. BAL0210 1.
+ SH020210 COST 195.92 TRAN0202 1.
+ SH020210 BAL0202 -1. BAL0210 1.
+ SH020310 COST 297.6 TRAN0203 1.
+ SH020310 BAL0203 -1. BAL0210 1.
+ SH020410 COST 445.16 TRAN0204 1.
+ SH020410 BAL0204 -1. BAL0210 1.
+ SH020510 COST 477.4 TRAN0205 1.
+ SH020510 BAL0205 -1. BAL0210 1.
+ SH020610 COST 279. TRAN0206 1.
+ SH020610 BAL0252 -1. BAL0210 1.
+ SH020810 COST 378.2 TRAN0208 1.
+ SH020810 BAL0283 -1. BAL0210 1.
+ SH020111 COST 131.44 TRAN0201 1.
+ SH020111 BAL0201 -1. BAL0211 1.
+ SH020211 COST 613.8 TRAN0202 1.
+ SH020211 BAL0202 -1. BAL0211 1.
+ SH020311 COST 307.52 TRAN0203 1.
+ SH020311 BAL0203 -1. BAL0211 1.
+ SH020411 COST 172.36 TRAN0204 1.
+ SH020411 BAL0204 -1. BAL0211 1.
+ SH020511 COST 422.84 TRAN0205 1.
+ SH020511 BAL0205 -1. BAL0211 1.
+ SH020611 COST 243.04 TRAN0206 1.
+ SH020611 BAL0252 -1. BAL0211 1.
+ SH020811 COST 126.48 TRAN0208 1.
+ SH020811 BAL0283 -1. BAL0211 1.
+ SH020112 COST 109.12 TRAN0201 1.
+ SH020112 BAL0201 -1. BAL0212 1.
+ SH020212 COST 420.36 TRAN0202 1.
+ SH020212 BAL0202 -1. BAL0212 1.
+ SH020312 COST 181.04 TRAN0203 1.
+ SH020312 BAL0203 -1. BAL0212 1.
+ SH020412 COST 248. TRAN0204 1.
+ SH020412 BAL0204 -1. BAL0212 1.
+ SH020512 COST 331.08 TRAN0205 1.
+ SH020512 BAL0205 -1. BAL0212 1.
+ SH020612 COST 179.8 TRAN0206 1.
+ SH020612 BAL0252 -1. BAL0212 1.
+ SH020812 COST 181.04 TRAN0208 1.
+ SH020812 BAL0283 -1. BAL0212 1.
+ SH020114 COST 176.08 TRAN0201 1.
+ SH020114 BAL0201 -1. BAL0214 1.
+ SH020214 COST 510.88 TRAN0202 1.
+ SH020214 BAL0202 -1. BAL0214 1.
+ SH020314 COST 243.04 TRAN0203 1.
+ SH020314 BAL0203 -1. BAL0214 1.
+ SH020414 COST 246.76 TRAN0204 1.
+ SH020414 BAL0204 -1. BAL0214 1.
+ SH020514 COST 436.48 TRAN0205 1.
+ SH020514 BAL0205 -1. BAL0214 1.
+ SH020614 COST 233.12 TRAN0206 1.
+ SH020614 BAL0252 -1. BAL0214 1.
+ SH020814 COST 156.24 TRAN0208 1.
+ SH020814 BAL0283 -1. BAL0214 1.
+ SH020115 COST 375.72 TRAN0201 1.
+ SH020115 BAL0201 -1. BAL0215 1.
+ SH020215 COST 197.16 TRAN0202 1.
+ SH020215 BAL0202 -1. BAL0215 1.
+ SH020315 COST 290.16 TRAN0203 1.
+ SH020315 BAL0203 -1. BAL0215 1.
+ SH020415 COST 590.24 TRAN0204 1.
+ SH020415 BAL0204 -1. BAL0215 1.
+ SH020515 COST 493.52 TRAN0205 1.
+ SH020515 BAL0205 -1. BAL0215 1.
+ SH020615 COST 233.12 TRAN0206 1.
+ SH020615 BAL0252 -1. BAL0215 1.
+ SH020815 COST 462.52 TRAN0208 1.
+ SH020815 BAL0283 -1. BAL0215 1.
+ SH020116 COST 195.92 TRAN0201 1.
+ SH020116 BAL0201 -1. BAL0216 1.
+ SH020216 COST 347.2 TRAN0202 1.
+ SH020216 BAL0202 -1. BAL0216 1.
+ SH020316 COST 281.48 TRAN0203 1.
+ SH020316 BAL0203 -1. BAL0216 1.
+ SH020416 COST 355.88 TRAN0204 1.
+ SH020416 BAL0204 -1. BAL0216 1.
+ SH020516 COST 395.56 TRAN0205 1.
+ SH020516 BAL0205 -1. BAL0216 1.
+ SH020616 COST 162.44 TRAN0206 1.
+ SH020616 BAL0252 -1. BAL0216 1.
+ SH020816 COST 254.2 TRAN0208 1.
+ SH020816 BAL0283 -1. BAL0216 1.
+ SH020117 COST 187.24 TRAN0201 1.
+ SH020117 BAL0201 -1. BAL0217 1.
+ SH020217 COST 626.2 TRAN0202 1.
+ SH020217 BAL0202 -1. BAL0217 1.
+ SH020317 COST 339.76 TRAN0203 1.
+ SH020317 BAL0203 -1. BAL0217 1.
+ SH020417 COST 70.68 TRAN0204 1.
+ SH020417 BAL0204 -1. BAL0217 1.
+ SH020517 COST 369.52 TRAN0205 1.
+ SH020517 BAL0205 -1. BAL0217 1.
+ SH020717 COST 365.8 TRAN0207 1.
+ SH020717 BAL0264 -1. BAL0217 1.
+ SH020817 COST 33.48 TRAN0208 1.
+ SH020817 BAL0283 -1. BAL0217 1.
+ SH020118 COST 217. TRAN0201 1.
+ SH020118 BAL0201 -1. BAL0218 1.
+ SH020218 COST 447.64 TRAN0202 1.
+ SH020218 BAL0202 -1. BAL0218 1.
+ SH020318 COST 334.8 TRAN0203 1.
+ SH020318 BAL0203 -1. BAL0218 1.
+ SH020418 COST 190.96 TRAN0204 1.
+ SH020418 BAL0204 -1. BAL0218 1.
+ SH020518 COST 504.68 TRAN0205 1.
+ SH020518 BAL0205 -1. BAL0218 1.
+ SH020618 COST 436.48 TRAN0206 1.
+ SH020618 BAL0252 -1. BAL0218 1.
+ SH020818 COST 127.72 TRAN0208 1.
+ SH020818 BAL0283 -1. BAL0218 1.
+ SH020119 COST 307.52 TRAN0201 1.
+ SH020119 BAL0201 -1. BAL0219 1.
+ SH020219 COST 851.88 TRAN0202 1.
+ SH020219 BAL0202 -1. BAL0219 1.
+ SH020319 COST 393.08 TRAN0203 1.
+ SH020319 BAL0203 -1. BAL0219 1.
+ SH020419 COST 197.16 TRAN0204 1.
+ SH020419 BAL0204 -1. BAL0219 1.
+ SH020519 COST 257.92 TRAN0205 1.
+ SH020519 BAL0205 -1. BAL0219 1.
+ SH020619 COST 427.8 TRAN0206 1.
+ SH020619 BAL0252 -1. BAL0219 1.
+ SH020819 COST 122.76 TRAN0208 1.
+ SH020819 BAL0283 -1. BAL0219 1.
+ SH020120 COST 254.2 TRAN0201 1.
+ SH020120 BAL0201 -1. BAL0220 1.
+ SH020220 COST 846.92 TRAN0202 1.
+ SH020220 BAL0202 -1. BAL0220 1.
+ SH020320 COST 368.28 TRAN0203 1.
+ SH020320 BAL0203 -1. BAL0220 1.
+ SH020420 COST 140.12 TRAN0204 1.
+ SH020420 BAL0204 -1. BAL0220 1.
+ SH020520 COST 360.84 TRAN0205 1.
+ SH020520 BAL0205 -1. BAL0220 1.
+ SH020820 COST 156.24 TRAN0208 1.
+ SH020820 BAL0283 -1. BAL0220 1.
+ SH020121 COST 499.72 TRAN0201 1.
+ SH020121 BAL0201 -1. BAL0221 1.
+ SH020221 COST 456.32 TRAN0202 1.
+ SH020221 BAL0202 -1. BAL0221 1.
+ SH020321 COST 553.04 TRAN0203 1.
+ SH020321 BAL0203 -1. BAL0221 1.
+ SH020421 COST 396.8 TRAN0204 1.
+ SH020421 BAL0204 -1. BAL0221 1.
+ SH020521 COST 682. TRAN0205 1.
+ SH020521 BAL0205 -1. BAL0221 1.
+ SH020821 COST 396.8 TRAN0208 1.
+ SH020821 BAL0283 -1. BAL0221 1.
+ SH020122 COST 307.52 TRAN0201 1.
+ SH020122 BAL0201 -1. BAL0222 1.
+ SH020222 COST 716.72 TRAN0202 1.
+ SH020222 BAL0202 -1. BAL0222 1.
+ SH020322 COST 370.76 TRAN0203 1.
+ SH020322 BAL0203 -1. BAL0222 1.
+ SH020422 COST 277.76 TRAN0204 1.
+ SH020422 BAL0204 -1. BAL0222 1.
+ SH020522 COST 221.96 TRAN0205 1.
+ SH020522 BAL0205 -1. BAL0222 1.
+ SH020622 COST 384.4 TRAN0206 1.
+ SH020622 BAL0252 -1. BAL0222 1.
+ SH020822 COST 172.36 TRAN0208 1.
+ SH020822 BAL0283 -1. BAL0222 1.
+ SH020123 COST 290.16 TRAN0201 1.
+ SH020123 BAL0201 -1. BAL0223 1.
+ SH020223 COST 670.84 TRAN0202 1.
+ SH020223 BAL0202 -1. BAL0223 1.
+ SH020323 COST 355.88 TRAN0203 1.
+ SH020323 BAL0203 -1. BAL0223 1.
+ SH020423 COST 207.08 TRAN0204 1.
+ SH020423 BAL0204 -1. BAL0223 1.
+ SH020523 COST 205.84 TRAN0205 1.
+ SH020523 BAL0205 -1. BAL0223 1.
+ SH020823 COST 172.36 TRAN0208 1.
+ SH020823 BAL0283 -1. BAL0223 1.
+ SH020124 COST 1780.64 TRAN0201 1.
+ SH020124 BAL0201 -1. BAL0224 1.
+ SH020125 COST 479.88 TRAN0201 1.
+ SH020125 BAL0201 -1. BAL0225 1.
+ SH020225 COST 529.48 TRAN0202 1.
+ SH020225 BAL0202 -1. BAL0225 1.
+ SH020325 COST 633.64 TRAN0203 1.
+ SH020325 BAL0203 -1. BAL0225 1.
+ SH020425 COST 431.52 TRAN0204 1.
+ SH020425 BAL0204 -1. BAL0225 1.
+ SH020525 COST 701.84 TRAN0205 1.
+ SH020525 BAL0205 -1. BAL0225 1.
+ SH020625 COST 499.72 TRAN0206 1.
+ SH020625 BAL0252 -1. BAL0225 1.
+ SH020825 COST 378.2 TRAN0208 1.
+ SH020825 BAL0283 -1. BAL0225 1.
+ SH020426 COST 334.8 TRAN0204 1.
+ SH020426 BAL0204 -1. BAL0226 1.
+ SH020127 COST 290.16 TRAN0201 1.
+ SH020127 BAL0201 -1. BAL0227 1.
+ SH020227 COST 352.16 TRAN0202 1.
+ SH020227 BAL0202 -1. BAL0227 1.
+ SH020327 COST 358.36 TRAN0203 1.
+ SH020327 BAL0203 -1. BAL0227 1.
+ SH020427 COST 415.4 TRAN0204 1.
+ SH020427 BAL0204 -1. BAL0227 1.
+ SH020527 COST 468.72 TRAN0205 1.
+ SH020527 BAL0205 -1. BAL0227 1.
+ SH020627 COST 332.32 TRAN0206 1.
+ SH020627 BAL0252 -1. BAL0227 1.
+ SH020827 COST 312.48 TRAN0208 1.
+ SH020827 BAL0283 -1. BAL0227 1.
+ SH020128 COST 301.32 TRAN0201 1.
+ SH020128 BAL0201 -1. BAL0228 1.
+ SH020228 COST 705.56 TRAN0202 1.
+ SH020228 BAL0202 -1. BAL0228 1.
+ SH020328 COST 367.04 TRAN0203 1.
+ SH020328 BAL0203 -1. BAL0228 1.
+ SH020428 COST 365.8 TRAN0204 1.
+ SH020428 BAL0204 -1. BAL0228 1.
+ SH020528 COST 126.48 TRAN0205 1.
+ SH020528 BAL0205 -1. BAL0228 1.
+ SH020628 COST 323.64 TRAN0206 1.
+ SH020628 BAL0252 -1. BAL0228 1.
+ SH020728 COST 132.68 TRAN0207 1.
+ SH020728 BAL0264 -1. BAL0228 1.
+ SH020828 COST 314.96 TRAN0208 1.
+ SH020828 BAL0283 -1. BAL0228 1.
+ SH020129 COST 276.52 TRAN0201 1.
+ SH020129 BAL0201 -1. BAL0229 1.
+ SH020229 COST 575.36 TRAN0202 1.
+ SH020229 BAL0202 -1. BAL0229 1.
+ SH020329 COST 298.84 TRAN0203 1.
+ SH020329 BAL0203 -1. BAL0229 1.
+ SH020429 COST 246.76 TRAN0204 1.
+ SH020429 BAL0204 -1. BAL0229 1.
+ SH020529 COST 533.2 TRAN0205 1.
+ SH020529 BAL0205 -1. BAL0229 1.
+ SH020629 COST 323.64 TRAN0206 1.
+ SH020629 BAL0252 -1. BAL0229 1.
+ SH020829 COST 178.56 TRAN0208 1.
+ SH020829 BAL0283 -1. BAL0229 1.
+ SH020130 COST 577.84 TRAN0201 1.
+ SH020130 BAL0201 -1. BAL0230 1.
+ SH020230 COST 540.64 TRAN0202 1.
+ SH020230 BAL0202 -1. BAL0230 1.
+ SH020330 COST 648.52 TRAN0203 1.
+ SH020330 BAL0203 -1. BAL0230 1.
+ SH020430 COST 376.96 TRAN0204 1.
+ SH020430 BAL0204 -1. BAL0230 1.
+ SH020530 COST 553.04 TRAN0205 1.
+ SH020530 BAL0205 -1. BAL0230 1.
+ SH020830 COST 473.68 TRAN0208 1.
+ SH020830 BAL0283 -1. BAL0230 1.
+ SH020131 COST 137.64 TRAN0201 1.
+ SH020131 BAL0201 -1. BAL0231 1.
+ SH020231 COST 435.24 TRAN0202 1.
+ SH020231 BAL0202 -1. BAL0231 1.
+ SH020331 COST 136.4 TRAN0203 1.
+ SH020331 BAL0203 -1. BAL0231 1.
+ SH020431 COST 313.72 TRAN0204 1.
+ SH020431 BAL0204 -1. BAL0231 1.
+ SH020531 COST 380.68 TRAN0205 1.
+ SH020531 BAL0205 -1. BAL0231 1.
+ SH020631 COST 138.88 TRAN0206 1.
+ SH020631 BAL0252 -1. BAL0231 1.
+ SH020831 COST 276.52 TRAN0208 1.
+ SH020831 BAL0283 -1. BAL0231 1.
+ SH020132 COST 370.76 TRAN0201 1.
+ SH020132 BAL0201 -1. BAL0232 1.
+ SH020232 COST 592.72 TRAN0202 1.
+ SH020232 BAL0202 -1. BAL0232 1.
+ SH020332 COST 524.52 TRAN0203 1.
+ SH020332 BAL0203 -1. BAL0232 1.
+ SH020432 COST 194.68 TRAN0204 1.
+ SH020432 BAL0204 -1. BAL0232 1.
+ SH020532 COST 486.08 TRAN0205 1.
+ SH020532 BAL0205 -1. BAL0232 1.
+ SH020832 COST 223.2 TRAN0208 1.
+ SH020832 BAL0283 -1. BAL0232 1.
+ SH020133 COST 611.32 TRAN0201 1.
+ SH020133 BAL0201 -1. BAL0233 1.
+ SH020233 COST 496. TRAN0202 1.
+ SH020233 BAL0202 -1. BAL0233 1.
+ SH020333 COST 673.32 TRAN0203 1.
+ SH020333 BAL0203 -1. BAL0233 1.
+ SH020433 COST 551.8 TRAN0204 1.
+ SH020433 BAL0204 -1. BAL0233 1.
+ SH020533 COST 782.44 TRAN0205 1.
+ SH020533 BAL0205 -1. BAL0233 1.
+ SH020833 COST 472.44 TRAN0208 1.
+ SH020833 BAL0283 -1. BAL0233 1.
+ SH020134 COST 478.64 TRAN0201 1.
+ SH020134 BAL0201 -1. BAL0234 1.
+ SH020234 COST 812.2 TRAN0202 1.
+ SH020234 BAL0202 -1. BAL0234 1.
+ SH020334 COST 623.72 TRAN0203 1.
+ SH020334 BAL0203 -1. BAL0234 1.
+ SH020434 COST 261.64 TRAN0204 1.
+ SH020434 BAL0204 -1. BAL0234 1.
+ SH020534 COST 546.84 TRAN0205 1.
+ SH020534 BAL0205 -1. BAL0234 1.
+ SH020834 COST 326.12 TRAN0208 1.
+ SH020834 BAL0283 -1. BAL0234 1.
+ SH020135 COST 571.64 TRAN0201 1.
+ SH020135 BAL0201 -1. BAL0235 1.
+ SH020235 COST 551.8 TRAN0202 1.
+ SH020235 BAL0202 -1. BAL0235 1.
+ SH020335 COST 467.48 TRAN0203 1.
+ SH020335 BAL0203 -1. BAL0235 1.
+ SH020435 COST 151.28 TRAN0204 1.
+ SH020435 BAL0204 -1. BAL0235 1.
+ SH020535 COST 534.44 TRAN0205 1.
+ SH020535 BAL0205 -1. BAL0235 1.
+ SH020835 COST 291.4 TRAN0208 1.
+ SH020835 BAL0283 -1. BAL0235 1.
+ SH020136 COST 254.2 TRAN0201 1.
+ SH020136 BAL0201 -1. BAL0236 1.
+ SH020236 COST 555.52 TRAN0202 1.
+ SH020236 BAL0202 -1. BAL0236 1.
+ SH020336 COST 131.44 TRAN0203 1.
+ SH020336 BAL0203 -1. BAL0236 1.
+ SH020436 COST 458.8 TRAN0204 1.
+ SH020436 BAL0204 -1. BAL0236 1.
+ SH020536 COST 429.04 TRAN0205 1.
+ SH020536 BAL0205 -1. BAL0236 1.
+ SH020636 COST 136.4 TRAN0206 1.
+ SH020636 BAL0252 -1. BAL0236 1.
+ SH020836 COST 398.04 TRAN0208 1.
+ SH020836 BAL0283 -1. BAL0236 1.
+ SH020137 COST 114.08 TRAN0201 1.
+ SH020137 BAL0201 -1. BAL0237 1.
+ SH020237 COST 424.08 TRAN0202 1.
+ SH020237 BAL0202 -1. BAL0237 1.
+ SH020337 COST 195.92 TRAN0203 1.
+ SH020337 BAL0203 -1. BAL0237 1.
+ SH020437 COST 376.96 TRAN0204 1.
+ SH020437 BAL0204 -1. BAL0237 1.
+ SH020537 COST 225.68 TRAN0205 1.
+ SH020537 BAL0205 -1. BAL0237 1.
+ SH020637 COST 240.56 TRAN0206 1.
+ SH020637 BAL0252 -1. BAL0237 1.
+ SH020837 COST 312.48 TRAN0208 1.
+ SH020837 BAL0283 -1. BAL0237 1.
+ SH020138 COST 168.64 TRAN0201 1.
+ SH020138 BAL0201 -1. BAL0238 1.
+ SH020238 COST 302.56 TRAN0202 1.
+ SH020238 BAL0202 -1. BAL0238 1.
+ SH020338 COST 117.8 TRAN0203 1.
+ SH020338 BAL0203 -1. BAL0238 1.
+ SH020438 COST 381.92 TRAN0204 1.
+ SH020438 BAL0204 -1. BAL0238 1.
+ SH020538 COST 344.72 TRAN0205 1.
+ SH020538 BAL0205 -1. BAL0238 1.
+ SH020638 COST 48.36 TRAN0206 1.
+ SH020638 BAL0252 -1. BAL0238 1.
+ SH020738 COST 267.84 TRAN0207 1.
+ SH020738 BAL0264 -1. BAL0238 1.
+ SH020838 COST 293.88 TRAN0208 1.
+ SH020838 BAL0283 -1. BAL0238 1.
+ SH020139 COST 161.2 TRAN0201 1.
+ SH020139 BAL0201 -1. BAL0239 1.
+ SH020239 COST 420.36 TRAN0202 1.
+ SH020239 BAL0202 -1. BAL0239 1.
+ SH020339 COST 198.4 TRAN0203 1.
+ SH020339 BAL0203 -1. BAL0239 1.
+ SH020439 COST 308.76 TRAN0204 1.
+ SH020439 BAL0204 -1. BAL0239 1.
+ SH020539 COST 531.96 TRAN0205 1.
+ SH020539 BAL0205 -1. BAL0239 1.
+ SH020639 COST 252.96 TRAN0206 1.
+ SH020639 BAL0252 -1. BAL0239 1.
+ SH020839 COST 208.32 TRAN0208 1.
+ SH020839 BAL0283 -1. BAL0239 1.
+ SH020140 COST 204.6 TRAN0201 1.
+ SH020140 BAL0201 -1. BAL0240 1.
+ SH020240 COST 468.72 TRAN0202 1.
+ SH020240 BAL0202 -1. BAL0240 1.
+ SH020340 COST 127.72 TRAN0203 1.
+ SH020340 BAL0203 -1. BAL0240 1.
+ SH020440 COST 368.28 TRAN0204 1.
+ SH020440 BAL0204 -1. BAL0240 1.
+ SH020540 COST 274.04 TRAN0205 1.
+ SH020540 BAL0205 -1. BAL0240 1.
+ SH020640 COST 162.44 TRAN0206 1.
+ SH020640 BAL0252 -1. BAL0240 1.
+ SH020840 COST 339.76 TRAN0208 1.
+ SH020840 BAL0283 -1. BAL0240 1.
+ SH020141 COST 243.04 TRAN0201 1.
+ SH020141 BAL0201 -1. BAL0241 1.
+ SH020241 COST 372. TRAN0202 1.
+ SH020241 BAL0202 -1. BAL0241 1.
+ SH020341 COST 186. TRAN0203 1.
+ SH020341 BAL0203 -1. BAL0241 1.
+ SH020441 COST 401.76 TRAN0204 1.
+ SH020441 BAL0204 -1. BAL0241 1.
+ SH020541 COST 456.32 TRAN0205 1.
+ SH020541 BAL0205 -1. BAL0241 1.
+ SH020641 COST 124. TRAN0206 1.
+ SH020641 BAL0252 -1. BAL0241 1.
+ SH020841 COST 370.76 TRAN0208 1.
+ SH020841 BAL0283 -1. BAL0241 1.
+ SH020142 COST 111.6 TRAN0201 1.
+ SH020142 BAL0201 -1. BAL0242 1.
+ SH020242 COST 513.36 TRAN0202 1.
+ SH020242 BAL0202 -1. BAL0242 1.
+ SH020342 COST 198.4 TRAN0203 1.
+ SH020342 BAL0203 -1. BAL0242 1.
+ SH020442 COST 241.8 TRAN0204 1.
+ SH020442 BAL0204 -1. BAL0242 1.
+ SH020542 COST 447.64 TRAN0205 1.
+ SH020542 BAL0205 -1. BAL0242 1.
+ SH020642 COST 199.64 TRAN0206 1.
+ SH020642 BAL0252 -1. BAL0242 1.
+ SH020842 COST 188.48 TRAN0208 1.
+ SH020842 BAL0283 -1. BAL0242 1.
+ SH020143 COST 197.16 TRAN0201 1.
+ SH020143 BAL0201 -1. BAL0243 1.
+ SH020243 COST 489.8 TRAN0202 1.
+ SH020243 BAL0202 -1. BAL0243 1.
+ SH020343 COST 31. TRAN0203 1.
+ SH020343 BAL0203 -1. BAL0243 1.
+ SH020443 COST 367.04 TRAN0204 1.
+ SH020443 BAL0204 -1. BAL0243 1.
+ SH020543 COST 319.92 TRAN0205 1.
+ SH020543 BAL0205 -1. BAL0243 1.
+ SH020643 COST 124. TRAN0206 1.
+ SH020643 BAL0252 -1. BAL0243 1.
+ SH020743 COST 298.84 TRAN0207 1.
+ SH020743 BAL0264 -1. BAL0243 1.
+ SH020843 COST 336.04 TRAN0208 1.
+ SH020843 BAL0283 -1. BAL0243 1.
+ SH020144 COST 197.16 TRAN0201 1.
+ SH020144 BAL0201 -1. BAL0244 1.
+ SH020244 COST 469.96 TRAN0202 1.
+ SH020244 BAL0202 -1. BAL0244 1.
+ SH020344 COST 158.72 TRAN0203 1.
+ SH020344 BAL0203 -1. BAL0244 1.
+ SH020444 COST 386.88 TRAN0204 1.
+ SH020444 BAL0204 -1. BAL0244 1.
+ SH020544 COST 384.4 TRAN0205 1.
+ SH020544 BAL0205 -1. BAL0244 1.
+ SH020644 COST 110.36 TRAN0206 1.
+ SH020644 BAL0252 -1. BAL0244 1.
+ SH020844 COST 369.52 TRAN0208 1.
+ SH020844 BAL0283 -1. BAL0244 1.
+ SH020145 COST 213.28 TRAN0201 1.
+ SH020145 BAL0201 -1. BAL0245 1.
+ SH020245 COST 540.64 TRAN0202 1.
+ SH020245 BAL0202 -1. BAL0245 1.
+ SH020345 COST 199.64 TRAN0203 1.
+ SH020345 BAL0203 -1. BAL0245 1.
+ SH020445 COST 362.08 TRAN0204 1.
+ SH020445 BAL0204 -1. BAL0245 1.
+ SH020545 COST 290.16 TRAN0205 1.
+ SH020545 BAL0205 -1. BAL0245 1.
+ SH020645 COST 236.84 TRAN0206 1.
+ SH020645 BAL0252 -1. BAL0245 1.
+ SH020745 COST 244.28 TRAN0207 1.
+ SH020745 BAL0264 -1. BAL0245 1.
+ SH020845 COST 378.2 TRAN0208 1.
+ SH020845 BAL0283 -1. BAL0245 1.
+ SH020146 COST 303.8 TRAN0201 1.
+ SH020146 BAL0201 -1. BAL0246 1.
+ SH020246 COST 338.52 TRAN0202 1.
+ SH020246 BAL0202 -1. BAL0246 1.
+ SH020346 COST 274.04 TRAN0203 1.
+ SH020346 BAL0203 -1. BAL0246 1.
+ SH020446 COST 554.28 TRAN0204 1.
+ SH020446 BAL0204 -1. BAL0246 1.
+ SH020546 COST 533.2 TRAN0205 1.
+ SH020546 BAL0205 -1. BAL0246 1.
+ SH020646 COST 318.68 TRAN0206 1.
+ SH020646 BAL0252 -1. BAL0246 1.
+ SH020846 COST 555.52 TRAN0208 1.
+ SH020846 BAL0283 -1. BAL0246 1.
+ SH020147 COST 136.4 TRAN0201 1.
+ SH020147 BAL0201 -1. BAL0247 1.
+ SH020247 COST 462.52 TRAN0202 1.
+ SH020247 BAL0202 -1. BAL0247 1.
+ SH020347 COST 197.16 TRAN0203 1.
+ SH020347 BAL0203 -1. BAL0247 1.
+ SH020447 COST 339.76 TRAN0204 1.
+ SH020447 BAL0204 -1. BAL0247 1.
+ SH020547 COST 288.92 TRAN0205 1.
+ SH020547 BAL0205 -1. BAL0247 1.
+ SH020647 COST 179.8 TRAN0206 1.
+ SH020647 BAL0252 -1. BAL0247 1.
+ SH020847 COST 302.56 TRAN0208 1.
+ SH020847 BAL0283 -1. BAL0247 1.
+ SH020148 COST 117.8 TRAN0201 1.
+ SH020148 BAL0201 -1. BAL0248 1.
+ SH020248 COST 420.36 TRAN0202 1.
+ SH020248 BAL0202 -1. BAL0248 1.
+ SH020348 COST 169.88 TRAN0203 1.
+ SH020348 BAL0203 -1. BAL0248 1.
+ SH020448 COST 285.2 TRAN0204 1.
+ SH020448 BAL0204 -1. BAL0248 1.
+ SH020548 COST 306.28 TRAN0205 1.
+ SH020548 BAL0205 -1. BAL0248 1.
+ SH020648 COST 142.6 TRAN0206 1.
+ SH020648 BAL0252 -1. BAL0248 1.
+ SH020848 COST 241.8 TRAN0208 1.
+ SH020848 BAL0283 -1. BAL0248 1.
+ SH020149 COST 407.96 TRAN0201 1.
+ SH020149 BAL0201 -1. BAL0249 1.
+ SH020249 COST 663.4 TRAN0202 1.
+ SH020249 BAL0202 -1. BAL0249 1.
+ SH020349 COST 411.68 TRAN0203 1.
+ SH020349 BAL0203 -1. BAL0249 1.
+ SH020449 COST 472.44 TRAN0204 1.
+ SH020449 BAL0204 -1. BAL0249 1.
+ SH020549 COST 188.48 TRAN0205 1.
+ SH020549 BAL0205 -1. BAL0249 1.
+ SH020649 COST 419.12 TRAN0206 1.
+ SH020649 BAL0252 -1. BAL0249 1.
+ SH020749 COST 166.16 TRAN0207 1.
+ SH020749 BAL0264 -1. BAL0249 1.
+ SH020849 COST 505.92 TRAN0208 1.
+ SH020849 BAL0283 -1. BAL0249 1.
+ SH020150 COST 298.84 TRAN0201 1.
+ SH020150 BAL0201 -1. BAL0250 1.
+ SH020250 COST 758.88 TRAN0202 1.
+ SH020250 BAL0202 -1. BAL0250 1.
+ SH020350 COST 305.04 TRAN0203 1.
+ SH020350 BAL0203 -1. BAL0250 1.
+ SH020450 COST 452.6 TRAN0204 1.
+ SH020450 BAL0204 -1. BAL0250 1.
+ SH020550 COST 291.4 TRAN0205 1.
+ SH020550 BAL0205 -1. BAL0250 1.
+ SH020750 COST 169.88 TRAN0207 1.
+ SH020750 BAL0264 -1. BAL0250 1.
+ SH020850 COST 503.44 TRAN0208 1.
+ SH020850 BAL0283 -1. BAL0250 1.
+ SH020151 COST 411.68 TRAN0201 1.
+ SH020151 BAL0201 -1. BAL0251 1.
+ SH020251 COST 682. TRAN0202 1.
+ SH020251 BAL0202 -1. BAL0251 1.
+ SH020351 COST 422.84 TRAN0203 1.
+ SH020351 BAL0203 -1. BAL0251 1.
+ SH020451 COST 419.12 TRAN0204 1.
+ SH020451 BAL0204 -1. BAL0251 1.
+ SH020551 COST 152.52 TRAN0205 1.
+ SH020551 BAL0205 -1. BAL0251 1.
+ SH020751 COST 122.76 TRAN0207 1.
+ SH020751 BAL0264 -1. BAL0251 1.
+ SH020851 COST 530.72 TRAN0208 1.
+ SH020851 BAL0283 -1. BAL0251 1.
+ SH020152 COST 138.88 TRAN0201 1.
+ SH020152 BAL0201 -1. BAL0252 1.
+ SH020252 COST 372. TRAN0202 1.
+ SH020252 BAL0202 -1. BAL0252 1.
+ SH020352 COST 101.68 TRAN0203 1.
+ SH020352 BAL0203 -1. BAL0252 1.
+ SH020452 COST 399.28 TRAN0204 1.
+ SH020452 BAL0204 -1. BAL0252 1.
+ SH020552 COST 365.8 TRAN0205 1.
+ SH020552 BAL0205 -1. BAL0252 1.
+ SH020852 COST 313.72 TRAN0208 1.
+ SH020852 BAL0283 -1. BAL0252 1.
+ SH020153 COST 445.16 TRAN0201 1.
+ SH020153 BAL0201 -1. BAL0253 1.
+ SH020253 COST 788.64 TRAN0202 1.
+ SH020253 BAL0202 -1. BAL0253 1.
+ SH020353 COST 403. TRAN0203 1.
+ SH020353 BAL0203 -1. BAL0253 1.
+ SH020453 COST 510.88 TRAN0204 1.
+ SH020453 BAL0204 -1. BAL0253 1.
+ SH020553 COST 228.16 TRAN0205 1.
+ SH020553 BAL0205 -1. BAL0253 1.
+ SH020653 COST 445.16 TRAN0206 1.
+ SH020653 BAL0252 -1. BAL0253 1.
+ SH020753 COST 181.04 TRAN0207 1.
+ SH020753 BAL0264 -1. BAL0253 1.
+ SH020853 COST 499.72 TRAN0208 1.
+ SH020853 BAL0283 -1. BAL0253 1.
+ SH020154 COST 229.4 TRAN0201 1.
+ SH020154 BAL0201 -1. BAL0254 1.
+ SH020254 COST 551.8 TRAN0202 1.
+ SH020254 BAL0202 -1. BAL0254 1.
+ SH020354 COST 269.08 TRAN0203 1.
+ SH020354 BAL0203 -1. BAL0254 1.
+ SH020454 COST 425.32 TRAN0204 1.
+ SH020454 BAL0204 -1. BAL0254 1.
+ SH020554 COST 264.12 TRAN0205 1.
+ SH020554 BAL0205 -1. BAL0254 1.
+ SH020654 COST 251.72 TRAN0206 1.
+ SH020654 BAL0252 -1. BAL0254 1.
+ SH020854 COST 498.48 TRAN0208 1.
+ SH020854 BAL0283 -1. BAL0254 1.
+ SH020155 COST 344.72 TRAN0201 1.
+ SH020155 BAL0201 -1. BAL0255 1.
+ SH020255 COST 593.96 TRAN0202 1.
+ SH020255 BAL0202 -1. BAL0255 1.
+ SH020355 COST 348.44 TRAN0203 1.
+ SH020355 BAL0203 -1. BAL0255 1.
+ SH020455 COST 364.56 TRAN0204 1.
+ SH020455 BAL0204 -1. BAL0255 1.
+ SH020555 COST 190.96 TRAN0205 1.
+ SH020555 BAL0205 -1. BAL0255 1.
+ SH020655 COST 359.6 TRAN0206 1.
+ SH020655 BAL0252 -1. BAL0255 1.
+ SH020755 COST 132.68 TRAN0207 1.
+ SH020755 BAL0264 -1. BAL0255 1.
+ SH020855 COST 364.56 TRAN0208 1.
+ SH020855 BAL0283 -1. BAL0255 1.
+ SH020156 COST 483.6 TRAN0201 1.
+ SH020156 BAL0201 -1. BAL0256 1.
+ SH020256 COST 717.96 TRAN0202 1.
+ SH020256 BAL0202 -1. BAL0256 1.
+ SH020356 COST 378.2 TRAN0203 1.
+ SH020356 BAL0203 -1. BAL0256 1.
+ SH020456 COST 452.6 TRAN0204 1.
+ SH020456 BAL0204 -1. BAL0256 1.
+ SH020556 COST 168.64 TRAN0205 1.
+ SH020556 BAL0205 -1. BAL0256 1.
+ SH020656 COST 420.36 TRAN0206 1.
+ SH020656 BAL0252 -1. BAL0256 1.
+ SH020756 COST 151.28 TRAN0207 1.
+ SH020756 BAL0264 -1. BAL0256 1.
+ SH020856 COST 442.68 TRAN0208 1.
+ SH020856 BAL0283 -1. BAL0256 1.
+ SH020157 COST 323.64 TRAN0201 1.
+ SH020157 BAL0201 -1. BAL0257 1.
+ SH020257 COST 644.8 TRAN0202 1.
+ SH020257 BAL0202 -1. BAL0257 1.
+ SH020357 COST 359.6 TRAN0203 1.
+ SH020357 BAL0203 -1. BAL0257 1.
+ SH020457 COST 290.16 TRAN0204 1.
+ SH020457 BAL0204 -1. BAL0257 1.
+ SH020557 COST 208.32 TRAN0205 1.
+ SH020557 BAL0205 -1. BAL0257 1.
+ SH020657 COST 395.56 TRAN0206 1.
+ SH020657 BAL0252 -1. BAL0257 1.
+ SH020757 COST 183.52 TRAN0207 1.
+ SH020757 BAL0264 -1. BAL0257 1.
+ SH020857 COST 286.44 TRAN0208 1.
+ SH020857 BAL0283 -1. BAL0257 1.
+ SH020158 COST 364.56 TRAN0201 1.
+ SH020158 BAL0201 -1. BAL0258 1.
+ SH020258 COST 646.04 TRAN0202 1.
+ SH020258 BAL0202 -1. BAL0258 1.
+ SH020358 COST 344.72 TRAN0203 1.
+ SH020358 BAL0203 -1. BAL0258 1.
+ SH020458 COST 425.32 TRAN0204 1.
+ SH020458 BAL0204 -1. BAL0258 1.
+ SH020558 COST 26.04 TRAN0205 1.
+ SH020558 BAL0205 -1. BAL0258 1.
+ SH020658 COST 404.24 TRAN0206 1.
+ SH020658 BAL0252 -1. BAL0258 1.
+ SH020758 COST 84.32 TRAN0207 1.
+ SH020758 BAL0264 -1. BAL0258 1.
+ SH020858 COST 314.96 TRAN0208 1.
+ SH020858 BAL0283 -1. BAL0258 1.
+ SH020159 COST 255.44 TRAN0201 1.
+ SH020159 BAL0201 -1. BAL0259 1.
+ SH020259 COST 617.52 TRAN0202 1.
+ SH020259 BAL0202 -1. BAL0259 1.
+ SH020359 COST 295.12 TRAN0203 1.
+ SH020359 BAL0203 -1. BAL0259 1.
+ SH020459 COST 302.56 TRAN0204 1.
+ SH020459 BAL0204 -1. BAL0259 1.
+ SH020559 COST 197.16 TRAN0205 1.
+ SH020559 BAL0205 -1. BAL0259 1.
+ SH020659 COST 368.28 TRAN0206 1.
+ SH020659 BAL0252 -1. BAL0259 1.
+ SH020759 COST 130.2 TRAN0207 1.
+ SH020759 BAL0264 -1. BAL0259 1.
+ SH020859 COST 316.2 TRAN0208 1.
+ SH020859 BAL0283 -1. BAL0259 1.
+ SH020160 COST 323.64 TRAN0201 1.
+ SH020160 BAL0201 -1. BAL0260 1.
+ SH020260 COST 682. TRAN0202 1.
+ SH020260 BAL0202 -1. BAL0260 1.
+ SH020360 COST 350.92 TRAN0203 1.
+ SH020360 BAL0203 -1. BAL0260 1.
+ SH020460 COST 386.88 TRAN0204 1.
+ SH020460 BAL0204 -1. BAL0260 1.
+ SH020560 COST 167.4 TRAN0205 1.
+ SH020560 BAL0205 -1. BAL0260 1.
+ SH020660 COST 400.52 TRAN0206 1.
+ SH020660 BAL0252 -1. BAL0260 1.
+ SH020760 COST 109.12 TRAN0207 1.
+ SH020760 BAL0264 -1. BAL0260 1.
+ SH020860 COST 370.76 TRAN0208 1.
+ SH020860 BAL0283 -1. BAL0260 1.
+ SH020163 COST 329.84 TRAN0201 1.
+ SH020163 BAL0201 -1. BAL0263 1.
+ SH020263 COST 612.56 TRAN0202 1.
+ SH020263 BAL0202 -1. BAL0263 1.
+ SH020363 COST 355.88 TRAN0203 1.
+ SH020363 BAL0203 -1. BAL0263 1.
+ SH020463 COST 457.56 TRAN0204 1.
+ SH020463 BAL0204 -1. BAL0263 1.
+ SH020563 COST 188.48 TRAN0205 1.
+ SH020563 BAL0205 -1. BAL0263 1.
+ SH020663 COST 390.6 TRAN0206 1.
+ SH020663 BAL0252 -1. BAL0263 1.
+ SH020763 COST 153.76 TRAN0207 1.
+ SH020763 BAL0264 -1. BAL0263 1.
+ SH020863 COST 496. TRAN0208 1.
+ SH020863 BAL0283 -1. BAL0263 1.
+ SH020164 COST 246.76 TRAN0201 1.
+ SH020164 BAL0201 -1. BAL0264 1.
+ SH020264 COST 652.24 TRAN0202 1.
+ SH020264 BAL0202 -1. BAL0264 1.
+ SH020364 COST 276.52 TRAN0203 1.
+ SH020364 BAL0203 -1. BAL0264 1.
+ SH020464 COST 416.64 TRAN0204 1.
+ SH020464 BAL0204 -1. BAL0264 1.
+ SH020564 COST 71.92 TRAN0205 1.
+ SH020564 BAL0205 -1. BAL0264 1.
+ SH020664 COST 393.08 TRAN0206 1.
+ SH020664 BAL0252 -1. BAL0264 1.
+ SH020864 COST 310. TRAN0208 1.
+ SH020864 BAL0283 -1. BAL0264 1.
+ SH020165 COST 535.68 TRAN0201 1.
+ SH020165 BAL0201 -1. BAL0265 1.
+ SH020265 COST 380.68 TRAN0202 1.
+ SH020265 BAL0202 -1. BAL0265 1.
+ SH020365 COST 626.2 TRAN0203 1.
+ SH020365 BAL0203 -1. BAL0265 1.
+ SH020465 COST 481.12 TRAN0204 1.
+ SH020465 BAL0204 -1. BAL0265 1.
+ SH020565 COST 748.96 TRAN0205 1.
+ SH020565 BAL0205 -1. BAL0265 1.
+ SH020865 COST 514.6 TRAN0208 1.
+ SH020865 BAL0283 -1. BAL0265 1.
+ SH020166 COST 694.4 TRAN0201 1.
+ SH020166 BAL0201 -1. BAL0266 1.
+ SH020266 COST 321.16 TRAN0202 1.
+ SH020266 BAL0202 -1. BAL0266 1.
+ SH020366 COST 716.72 TRAN0203 1.
+ SH020366 BAL0203 -1. BAL0266 1.
+ SH020466 COST 689.44 TRAN0204 1.
+ SH020466 BAL0204 -1. BAL0266 1.
+ SH020566 COST 880.4 TRAN0205 1.
+ SH020566 BAL0205 -1. BAL0266 1.
+ SH020866 COST 694.4 TRAN0208 1.
+ SH020866 BAL0283 -1. BAL0266 1.
+ SH020167 COST 527. TRAN0201 1.
+ SH020167 BAL0201 -1. BAL0267 1.
+ SH020267 COST 287.68 TRAN0202 1.
+ SH020267 BAL0202 -1. BAL0267 1.
+ SH020367 COST 611.32 TRAN0203 1.
+ SH020367 BAL0203 -1. BAL0267 1.
+ SH020467 COST 566.68 TRAN0204 1.
+ SH020467 BAL0204 -1. BAL0267 1.
+ SH020567 COST 748.96 TRAN0205 1.
+ SH020567 BAL0205 -1. BAL0267 1.
+ SH020867 COST 567.92 TRAN0208 1.
+ SH020867 BAL0283 -1. BAL0267 1.
+ SH020168 COST 736.56 TRAN0201 1.
+ SH020168 BAL0201 -1. BAL0268 1.
+ SH020268 COST 496. TRAN0202 1.
+ SH020268 BAL0202 -1. BAL0268 1.
+ SH020368 COST 694.4 TRAN0203 1.
+ SH020368 BAL0203 -1. BAL0268 1.
+ SH020468 COST 870.48 TRAN0204 1.
+ SH020468 BAL0204 -1. BAL0268 1.
+ SH020568 COST 1173.04 TRAN0205 1.
+ SH020568 BAL0205 -1. BAL0268 1.
+ SH020868 COST 931.24 TRAN0208 1.
+ SH020868 BAL0283 -1. BAL0268 1.
+ SH020169 COST 668.36 TRAN0201 1.
+ SH020169 BAL0201 -1. BAL0269 1.
+ SH020269 COST 274.04 TRAN0202 1.
+ SH020269 BAL0202 -1. BAL0269 1.
+ SH020369 COST 632.4 TRAN0203 1.
+ SH020369 BAL0203 -1. BAL0269 1.
+ SH020469 COST 771.28 TRAN0204 1.
+ SH020469 BAL0204 -1. BAL0269 1.
+ SH020569 COST 801.04 TRAN0205 1.
+ SH020569 BAL0205 -1. BAL0269 1.
+ SH020869 COST 815.92 TRAN0208 1.
+ SH020869 BAL0283 -1. BAL0269 1.
+ SH020171 COST 545.6 TRAN0201 1.
+ SH020171 BAL0201 -1. BAL0271 1.
+ SH020371 COST 649.76 TRAN0203 1.
+ SH020371 BAL0203 -1. BAL0271 1.
+ SH020471 COST 646.04 TRAN0204 1.
+ SH020471 BAL0204 -1. BAL0271 1.
+ SH020571 COST 720.44 TRAN0205 1.
+ SH020571 BAL0205 -1. BAL0271 1.
+ SH020671 COST 484.84 TRAN0206 1.
+ SH020671 BAL0252 -1. BAL0271 1.
+ SH020771 COST 872.96 TRAN0207 1.
+ SH020771 BAL0264 -1. BAL0271 1.
+ SH020871 COST 660.92 TRAN0208 1.
+ SH020871 BAL0283 -1. BAL0271 1.
+ SH020172 COST 727.88 TRAN0201 1.
+ SH020172 BAL0201 -1. BAL0272 1.
+ SH020272 COST 673.32 TRAN0202 1.
+ SH020272 BAL0202 -1. BAL0272 1.
+ SH020372 COST 765.08 TRAN0203 1.
+ SH020372 BAL0203 -1. BAL0272 1.
+ SH020472 COST 706.8 TRAN0204 1.
+ SH020472 BAL0204 -1. BAL0272 1.
+ SH020572 COST 946.12 TRAN0205 1.
+ SH020572 BAL0205 -1. BAL0272 1.
+ SH020872 COST 706.8 TRAN0208 1.
+ SH020872 BAL0283 -1. BAL0272 1.
+ SH020173 COST 483.6 TRAN0201 1.
+ SH020173 BAL0201 -1. BAL0273 1.
+ SH020273 COST 452.6 TRAN0202 1.
+ SH020273 BAL0202 -1. BAL0273 1.
+ SH020373 COST 419.12 TRAN0203 1.
+ SH020373 BAL0203 -1. BAL0273 1.
+ SH020473 COST 566.68 TRAN0204 1.
+ SH020473 BAL0204 -1. BAL0273 1.
+ SH020573 COST 699.36 TRAN0205 1.
+ SH020573 BAL0205 -1. BAL0273 1.
+ SH020673 COST 378.2 TRAN0206 1.
+ SH020673 BAL0252 -1. BAL0273 1.
+ SH020873 COST 624.96 TRAN0208 1.
+ SH020873 BAL0283 -1. BAL0273 1.
+ SH020174 COST 679.52 TRAN0201 1.
+ SH020174 BAL0201 -1. BAL0274 1.
+ SH020274 COST 260.4 TRAN0202 1.
+ SH020274 BAL0202 -1. BAL0274 1.
+ SH020374 COST 706.8 TRAN0203 1.
+ SH020374 BAL0203 -1. BAL0274 1.
+ SH020474 COST 789.88 TRAN0204 1.
+ SH020474 BAL0204 -1. BAL0274 1.
+ SH020574 COST 908.92 TRAN0205 1.
+ SH020574 BAL0205 -1. BAL0274 1.
+ SH020874 COST 767.56 TRAN0208 1.
+ SH020874 BAL0283 -1. BAL0274 1.
+ SH020275 COST 686.96 TRAN0202 1.
+ SH020275 BAL0202 -1. BAL0275 1.
+ SH020176 COST 572.88 TRAN0201 1.
+ SH020176 BAL0201 -1. BAL0276 1.
+ SH020276 COST 497.24 TRAN0202 1.
+ SH020276 BAL0202 -1. BAL0276 1.
+ SH020376 COST 499.72 TRAN0203 1.
+ SH020376 BAL0203 -1. BAL0276 1.
+ SH020476 COST 781.2 TRAN0204 1.
+ SH020476 BAL0204 -1. BAL0276 1.
+ SH020576 COST 781.2 TRAN0205 1.
+ SH020576 BAL0205 -1. BAL0276 1.
+ SH020676 COST 472.44 TRAN0206 1.
+ SH020676 BAL0252 -1. BAL0276 1.
+ SH020876 COST 963.48 TRAN0208 1.
+ SH020876 BAL0283 -1. BAL0276 1.
+ SH020177 COST 539.4 TRAN0201 1.
+ SH020177 BAL0201 -1. BAL0277 1.
+ SH020277 COST 337.28 TRAN0202 1.
+ SH020277 BAL0202 -1. BAL0277 1.
+ SH020377 COST 571.64 TRAN0203 1.
+ SH020377 BAL0203 -1. BAL0277 1.
+ SH020477 COST 497.24 TRAN0204 1.
+ SH020477 BAL0204 -1. BAL0277 1.
+ SH020577 COST 694.4 TRAN0205 1.
+ SH020577 BAL0205 -1. BAL0277 1.
+ SH020877 COST 396.8 TRAN0208 1.
+ SH020877 BAL0283 -1. BAL0277 1.
+ SH020178 COST 943.64 TRAN0201 1.
+ SH020178 BAL0201 -1. BAL0278 1.
+ SH020278 COST 548.08 TRAN0202 1.
+ SH020278 BAL0202 -1. BAL0278 1.
+ SH020378 COST 970.92 TRAN0203 1.
+ SH020378 BAL0203 -1. BAL0278 1.
+ SH020478 COST 849.4 TRAN0204 1.
+ SH020478 BAL0204 -1. BAL0278 1.
+ SH020578 COST 1089.96 TRAN0205 1.
+ SH020578 BAL0205 -1. BAL0278 1.
+ SH020878 COST 949.84 TRAN0208 1.
+ SH020878 BAL0283 -1. BAL0278 1.
+ SH020179 COST 886.6 TRAN0201 1.
+ SH020179 BAL0201 -1. BAL0279 1.
+ SH020279 COST 333.56 TRAN0202 1.
+ SH020279 BAL0202 -1. BAL0279 1.
+ SH020379 COST 856.84 TRAN0203 1.
+ SH020379 BAL0203 -1. BAL0279 1.
+ SH020479 COST 892.8 TRAN0204 1.
+ SH020479 BAL0204 -1. BAL0279 1.
+ SH020879 COST 875.44 TRAN0208 1.
+ SH020879 BAL0283 -1. BAL0279 1.
+ SH020180 COST 393.08 TRAN0201 1.
+ SH020180 BAL0201 -1. BAL0280 1.
+ SH020280 COST 489.8 TRAN0202 1.
+ SH020280 BAL0202 -1. BAL0280 1.
+ SH020380 COST 541.88 TRAN0203 1.
+ SH020380 BAL0203 -1. BAL0280 1.
+ SH020480 COST 463.76 TRAN0204 1.
+ SH020480 BAL0204 -1. BAL0280 1.
+ SH020580 COST 626.2 TRAN0205 1.
+ SH020580 BAL0205 -1. BAL0280 1.
+ SH020880 COST 297.6 TRAN0208 1.
+ SH020880 BAL0283 -1. BAL0280 1.
+ SH020182 COST 721.68 TRAN0201 1.
+ SH020182 BAL0201 -1. BAL0282 1.
+ SH020282 COST 407.96 TRAN0202 1.
+ SH020282 BAL0202 -1. BAL0282 1.
+ SH020382 COST 812.2 TRAN0203 1.
+ SH020382 BAL0203 -1. BAL0282 1.
+ SH020482 COST 875.44 TRAN0204 1.
+ SH020482 BAL0204 -1. BAL0282 1.
+ SH020582 COST 1422.28 TRAN0205 1.
+ SH020582 BAL0205 -1. BAL0282 1.
+ SH020882 COST 970.92 TRAN0208 1.
+ SH020882 BAL0283 -1. BAL0282 1.
+ SH020183 COST 219.48 TRAN0201 1.
+ SH020183 BAL0201 -1. BAL0283 1.
+ SH020283 COST 644.8 TRAN0202 1.
+ SH020283 BAL0202 -1. BAL0283 1.
+ SH020383 COST 337.28 TRAN0203 1.
+ SH020383 BAL0203 -1. BAL0283 1.
+ SH020483 COST 73.16 TRAN0204 1.
+ SH020483 BAL0204 -1. BAL0283 1.
+ SH020583 COST 430.28 TRAN0205 1.
+ SH020583 BAL0205 -1. BAL0283 1.
+ SH020683 COST 307.52 TRAN0206 1.
+ SH020683 BAL0252 -1. BAL0283 1.
+ SH020184 COST 376.96 TRAN0201 1.
+ SH020184 BAL0201 -1. BAL0284 1.
+ SH020284 COST 238.08 TRAN0202 1.
+ SH020284 BAL0202 -1. BAL0284 1.
+ SH020384 COST 451.36 TRAN0203 1.
+ SH020384 BAL0203 -1. BAL0284 1.
+ SH020484 COST 458.8 TRAN0204 1.
+ SH020484 BAL0204 -1. BAL0284 1.
+ SH020584 COST 607.6 TRAN0205 1.
+ SH020584 BAL0205 -1. BAL0284 1.
+ SH020684 COST 378.2 TRAN0206 1.
+ SH020684 BAL0252 -1. BAL0284 1.
+ SH020884 COST 481.12 TRAN0208 1.
+ SH020884 BAL0283 -1. BAL0284 1.
+ SH030201 COST 368.28 TRAN0302 1.
+ SH030201 BAL0302 -1. BAL0301 1.
+ SH030301 COST 141.36 TRAN0303 1.
+ SH030301 BAL0303 -1. BAL0301 1.
+ SH030401 COST 257.92 TRAN0304 1.
+ SH030401 BAL0304 -1. BAL0301 1.
+ SH030501 COST 293.88 TRAN0305 1.
+ SH030501 BAL0305 -1. BAL0301 1.
+ SH030601 COST 156.24 TRAN0306 1.
+ SH030601 BAL0352 -1. BAL0301 1.
+ SH030801 COST 177.32 TRAN0308 1.
+ SH030801 BAL0383 -1. BAL0301 1.
+ SH030102 COST 587.76 TRAN0301 1.
+ SH030102 BAL0301 -1. BAL0302 1.
+ SH030302 COST 517.08 TRAN0303 1.
+ SH030302 BAL0303 -1. BAL0302 1.
+ SH030402 COST 758.88 TRAN0304 1.
+ SH030402 BAL0304 -1. BAL0302 1.
+ SH030502 COST 918.84 TRAN0305 1.
+ SH030502 BAL0305 -1. BAL0302 1.
+ SH030602 COST 468.72 TRAN0306 1.
+ SH030602 BAL0352 -1. BAL0302 1.
+ SH030802 COST 646.04 TRAN0308 1.
+ SH030802 BAL0383 -1. BAL0302 1.
+ SH030103 COST 303.8 TRAN0301 1.
+ SH030103 BAL0301 -1. BAL0303 1.
+ SH030203 COST 587.76 TRAN0302 1.
+ SH030203 BAL0302 -1. BAL0303 1.
+ SH030403 COST 455.08 TRAN0304 1.
+ SH030403 BAL0304 -1. BAL0303 1.
+ SH030503 COST 352.16 TRAN0305 1.
+ SH030503 BAL0305 -1. BAL0303 1.
+ SH030603 COST 111.6 TRAN0306 1.
+ SH030603 BAL0352 -1. BAL0303 1.
+ SH030803 COST 316.2 TRAN0308 1.
+ SH030803 BAL0383 -1. BAL0303 1.
+ SH030104 COST 215.76 TRAN0301 1.
+ SH030104 BAL0301 -1. BAL0304 1.
+ SH030204 COST 623.72 TRAN0302 1.
+ SH030204 BAL0302 -1. BAL0304 1.
+ SH030304 COST 301.32 TRAN0303 1.
+ SH030304 BAL0303 -1. BAL0304 1.
+ SH030504 COST 395.56 TRAN0305 1.
+ SH030504 BAL0305 -1. BAL0304 1.
+ SH030604 COST 303.8 TRAN0306 1.
+ SH030604 BAL0352 -1. BAL0304 1.
+ SH030704 COST 333.56 TRAN0307 1.
+ SH030704 BAL0364 -1. BAL0304 1.
+ SH030804 COST 71.92 TRAN0308 1.
+ SH030804 BAL0383 -1. BAL0304 1.
+ SH030105 COST 334.8 TRAN0301 1.
+ SH030105 BAL0301 -1. BAL0305 1.
+ SH030205 COST 639.84 TRAN0302 1.
+ SH030205 BAL0302 -1. BAL0305 1.
+ SH030305 COST 352.16 TRAN0303 1.
+ SH030305 BAL0303 -1. BAL0305 1.
+ SH030405 COST 353.4 TRAN0304 1.
+ SH030405 BAL0304 -1. BAL0305 1.
+ SH030605 COST 404.24 TRAN0306 1.
+ SH030605 BAL0352 -1. BAL0305 1.
+ SH030705 COST 414.16 TRAN0307 1.
+ SH030705 BAL0364 -1. BAL0305 1.
+ SH030805 COST 336.04 TRAN0308 1.
+ SH030805 BAL0383 -1. BAL0305 1.
+ SH030106 COST 246.76 TRAN0301 1.
+ SH030106 BAL0301 -1. BAL0306 1.
+ SH030206 COST 517.08 TRAN0302 1.
+ SH030206 BAL0302 -1. BAL0306 1.
+ SH030306 COST 264.12 TRAN0303 1.
+ SH030306 BAL0303 -1. BAL0306 1.
+ SH030406 COST 271.56 TRAN0304 1.
+ SH030406 BAL0304 -1. BAL0306 1.
+ SH030506 COST 312.48 TRAN0305 1.
+ SH030506 BAL0305 -1. BAL0306 1.
+ SH030606 COST 255.44 TRAN0306 1.
+ SH030606 BAL0352 -1. BAL0306 1.
+ SH030706 COST 248. TRAN0307 1.
+ SH030706 BAL0364 -1. BAL0306 1.
+ SH030806 COST 187.24 TRAN0308 1.
+ SH030806 BAL0383 -1. BAL0306 1.
+ SH030107 COST 26.04 TRAN0301 1.
+ SH030107 BAL0301 -1. BAL0307 1.
+ SH030207 COST 362.08 TRAN0302 1.
+ SH030207 BAL0302 -1. BAL0307 1.
+ SH030307 COST 153.76 TRAN0303 1.
+ SH030307 BAL0303 -1. BAL0307 1.
+ SH030407 COST 256.68 TRAN0304 1.
+ SH030407 BAL0304 -1. BAL0307 1.
+ SH030507 COST 283.96 TRAN0305 1.
+ SH030507 BAL0305 -1. BAL0307 1.
+ SH030607 COST 155. TRAN0306 1.
+ SH030607 BAL0352 -1. BAL0307 1.
+ SH030707 COST 287.68 TRAN0307 1.
+ SH030707 BAL0364 -1. BAL0307 1.
+ SH030807 COST 192.2 TRAN0308 1.
+ SH030807 BAL0383 -1. BAL0307 1.
+ SH030108 COST 81.84 TRAN0301 1.
+ SH030108 BAL0301 -1. BAL0308 1.
+ SH030208 COST 466.24 TRAN0302 1.
+ SH030208 BAL0302 -1. BAL0308 1.
+ SH030308 COST 174.84 TRAN0303 1.
+ SH030308 BAL0303 -1. BAL0308 1.
+ SH030408 COST 306.28 TRAN0304 1.
+ SH030408 BAL0304 -1. BAL0308 1.
+ SH030508 COST 225.68 TRAN0305 1.
+ SH030508 BAL0305 -1. BAL0308 1.
+ SH030608 COST 205.84 TRAN0306 1.
+ SH030608 BAL0352 -1. BAL0308 1.
+ SH030808 COST 231.88 TRAN0308 1.
+ SH030808 BAL0383 -1. BAL0308 1.
+ SH030109 COST 171.12 TRAN0301 1.
+ SH030109 BAL0301 -1. BAL0309 1.
+ SH030209 COST 474.92 TRAN0302 1.
+ SH030209 BAL0302 -1. BAL0309 1.
+ SH030309 COST 208.32 TRAN0303 1.
+ SH030309 BAL0303 -1. BAL0309 1.
+ SH030409 COST 313.72 TRAN0304 1.
+ SH030409 BAL0304 -1. BAL0309 1.
+ SH030509 COST 296.36 TRAN0305 1.
+ SH030509 BAL0305 -1. BAL0309 1.
+ SH030709 COST 243.04 TRAN0307 1.
+ SH030709 BAL0364 -1. BAL0309 1.
+ SH030809 COST 240.56 TRAN0308 1.
+ SH030809 BAL0383 -1. BAL0309 1.
+ SH030110 COST 306.28 TRAN0301 1.
+ SH030110 BAL0301 -1. BAL0310 1.
+ SH030210 COST 195.92 TRAN0302 1.
+ SH030210 BAL0302 -1. BAL0310 1.
+ SH030310 COST 297.6 TRAN0303 1.
+ SH030310 BAL0303 -1. BAL0310 1.
+ SH030410 COST 445.16 TRAN0304 1.
+ SH030410 BAL0304 -1. BAL0310 1.
+ SH030510 COST 477.4 TRAN0305 1.
+ SH030510 BAL0305 -1. BAL0310 1.
+ SH030610 COST 279. TRAN0306 1.
+ SH030610 BAL0352 -1. BAL0310 1.
+ SH030810 COST 378.2 TRAN0308 1.
+ SH030810 BAL0383 -1. BAL0310 1.
+ SH030111 COST 131.44 TRAN0301 1.
+ SH030111 BAL0301 -1. BAL0311 1.
+ SH030211 COST 613.8 TRAN0302 1.
+ SH030211 BAL0302 -1. BAL0311 1.
+ SH030311 COST 307.52 TRAN0303 1.
+ SH030311 BAL0303 -1. BAL0311 1.
+ SH030411 COST 172.36 TRAN0304 1.
+ SH030411 BAL0304 -1. BAL0311 1.
+ SH030511 COST 422.84 TRAN0305 1.
+ SH030511 BAL0305 -1. BAL0311 1.
+ SH030611 COST 243.04 TRAN0306 1.
+ SH030611 BAL0352 -1. BAL0311 1.
+ SH030811 COST 126.48 TRAN0308 1.
+ SH030811 BAL0383 -1. BAL0311 1.
+ SH030112 COST 109.12 TRAN0301 1.
+ SH030112 BAL0301 -1. BAL0312 1.
+ SH030212 COST 420.36 TRAN0302 1.
+ SH030212 BAL0302 -1. BAL0312 1.
+ SH030312 COST 181.04 TRAN0303 1.
+ SH030312 BAL0303 -1. BAL0312 1.
+ SH030412 COST 248. TRAN0304 1.
+ SH030412 BAL0304 -1. BAL0312 1.
+ SH030512 COST 331.08 TRAN0305 1.
+ SH030512 BAL0305 -1. BAL0312 1.
+ SH030612 COST 179.8 TRAN0306 1.
+ SH030612 BAL0352 -1. BAL0312 1.
+ SH030812 COST 181.04 TRAN0308 1.
+ SH030812 BAL0383 -1. BAL0312 1.
+ SH030114 COST 176.08 TRAN0301 1.
+ SH030114 BAL0301 -1. BAL0314 1.
+ SH030214 COST 510.88 TRAN0302 1.
+ SH030214 BAL0302 -1. BAL0314 1.
+ SH030314 COST 243.04 TRAN0303 1.
+ SH030314 BAL0303 -1. BAL0314 1.
+ SH030414 COST 246.76 TRAN0304 1.
+ SH030414 BAL0304 -1. BAL0314 1.
+ SH030514 COST 436.48 TRAN0305 1.
+ SH030514 BAL0305 -1. BAL0314 1.
+ SH030614 COST 233.12 TRAN0306 1.
+ SH030614 BAL0352 -1. BAL0314 1.
+ SH030814 COST 156.24 TRAN0308 1.
+ SH030814 BAL0383 -1. BAL0314 1.
+ SH030115 COST 375.72 TRAN0301 1.
+ SH030115 BAL0301 -1. BAL0315 1.
+ SH030215 COST 197.16 TRAN0302 1.
+ SH030215 BAL0302 -1. BAL0315 1.
+ SH030315 COST 290.16 TRAN0303 1.
+ SH030315 BAL0303 -1. BAL0315 1.
+ SH030415 COST 590.24 TRAN0304 1.
+ SH030415 BAL0304 -1. BAL0315 1.
+ SH030515 COST 493.52 TRAN0305 1.
+ SH030515 BAL0305 -1. BAL0315 1.
+ SH030615 COST 233.12 TRAN0306 1.
+ SH030615 BAL0352 -1. BAL0315 1.
+ SH030815 COST 462.52 TRAN0308 1.
+ SH030815 BAL0383 -1. BAL0315 1.
+ SH030116 COST 195.92 TRAN0301 1.
+ SH030116 BAL0301 -1. BAL0316 1.
+ SH030216 COST 347.2 TRAN0302 1.
+ SH030216 BAL0302 -1. BAL0316 1.
+ SH030316 COST 281.48 TRAN0303 1.
+ SH030316 BAL0303 -1. BAL0316 1.
+ SH030416 COST 355.88 TRAN0304 1.
+ SH030416 BAL0304 -1. BAL0316 1.
+ SH030516 COST 395.56 TRAN0305 1.
+ SH030516 BAL0305 -1. BAL0316 1.
+ SH030616 COST 162.44 TRAN0306 1.
+ SH030616 BAL0352 -1. BAL0316 1.
+ SH030816 COST 254.2 TRAN0308 1.
+ SH030816 BAL0383 -1. BAL0316 1.
+ SH030117 COST 187.24 TRAN0301 1.
+ SH030117 BAL0301 -1. BAL0317 1.
+ SH030217 COST 626.2 TRAN0302 1.
+ SH030217 BAL0302 -1. BAL0317 1.
+ SH030317 COST 339.76 TRAN0303 1.
+ SH030317 BAL0303 -1. BAL0317 1.
+ SH030417 COST 70.68 TRAN0304 1.
+ SH030417 BAL0304 -1. BAL0317 1.
+ SH030517 COST 369.52 TRAN0305 1.
+ SH030517 BAL0305 -1. BAL0317 1.
+ SH030717 COST 365.8 TRAN0307 1.
+ SH030717 BAL0364 -1. BAL0317 1.
+ SH030817 COST 33.48 TRAN0308 1.
+ SH030817 BAL0383 -1. BAL0317 1.
+ SH030118 COST 217. TRAN0301 1.
+ SH030118 BAL0301 -1. BAL0318 1.
+ SH030218 COST 447.64 TRAN0302 1.
+ SH030218 BAL0302 -1. BAL0318 1.
+ SH030318 COST 334.8 TRAN0303 1.
+ SH030318 BAL0303 -1. BAL0318 1.
+ SH030418 COST 190.96 TRAN0304 1.
+ SH030418 BAL0304 -1. BAL0318 1.
+ SH030518 COST 504.68 TRAN0305 1.
+ SH030518 BAL0305 -1. BAL0318 1.
+ SH030618 COST 436.48 TRAN0306 1.
+ SH030618 BAL0352 -1. BAL0318 1.
+ SH030818 COST 127.72 TRAN0308 1.
+ SH030818 BAL0383 -1. BAL0318 1.
+ SH030119 COST 307.52 TRAN0301 1.
+ SH030119 BAL0301 -1. BAL0319 1.
+ SH030219 COST 851.88 TRAN0302 1.
+ SH030219 BAL0302 -1. BAL0319 1.
+ SH030319 COST 393.08 TRAN0303 1.
+ SH030319 BAL0303 -1. BAL0319 1.
+ SH030419 COST 197.16 TRAN0304 1.
+ SH030419 BAL0304 -1. BAL0319 1.
+ SH030519 COST 257.92 TRAN0305 1.
+ SH030519 BAL0305 -1. BAL0319 1.
+ SH030619 COST 427.8 TRAN0306 1.
+ SH030619 BAL0352 -1. BAL0319 1.
+ SH030819 COST 122.76 TRAN0308 1.
+ SH030819 BAL0383 -1. BAL0319 1.
+ SH030120 COST 254.2 TRAN0301 1.
+ SH030120 BAL0301 -1. BAL0320 1.
+ SH030220 COST 846.92 TRAN0302 1.
+ SH030220 BAL0302 -1. BAL0320 1.
+ SH030320 COST 368.28 TRAN0303 1.
+ SH030320 BAL0303 -1. BAL0320 1.
+ SH030420 COST 140.12 TRAN0304 1.
+ SH030420 BAL0304 -1. BAL0320 1.
+ SH030520 COST 360.84 TRAN0305 1.
+ SH030520 BAL0305 -1. BAL0320 1.
+ SH030820 COST 156.24 TRAN0308 1.
+ SH030820 BAL0383 -1. BAL0320 1.
+ SH030121 COST 499.72 TRAN0301 1.
+ SH030121 BAL0301 -1. BAL0321 1.
+ SH030221 COST 456.32 TRAN0302 1.
+ SH030221 BAL0302 -1. BAL0321 1.
+ SH030321 COST 553.04 TRAN0303 1.
+ SH030321 BAL0303 -1. BAL0321 1.
+ SH030421 COST 396.8 TRAN0304 1.
+ SH030421 BAL0304 -1. BAL0321 1.
+ SH030521 COST 682. TRAN0305 1.
+ SH030521 BAL0305 -1. BAL0321 1.
+ SH030821 COST 396.8 TRAN0308 1.
+ SH030821 BAL0383 -1. BAL0321 1.
+ SH030122 COST 307.52 TRAN0301 1.
+ SH030122 BAL0301 -1. BAL0322 1.
+ SH030222 COST 716.72 TRAN0302 1.
+ SH030222 BAL0302 -1. BAL0322 1.
+ SH030322 COST 370.76 TRAN0303 1.
+ SH030322 BAL0303 -1. BAL0322 1.
+ SH030422 COST 277.76 TRAN0304 1.
+ SH030422 BAL0304 -1. BAL0322 1.
+ SH030522 COST 221.96 TRAN0305 1.
+ SH030522 BAL0305 -1. BAL0322 1.
+ SH030622 COST 384.4 TRAN0306 1.
+ SH030622 BAL0352 -1. BAL0322 1.
+ SH030822 COST 172.36 TRAN0308 1.
+ SH030822 BAL0383 -1. BAL0322 1.
+ SH030123 COST 290.16 TRAN0301 1.
+ SH030123 BAL0301 -1. BAL0323 1.
+ SH030223 COST 670.84 TRAN0302 1.
+ SH030223 BAL0302 -1. BAL0323 1.
+ SH030323 COST 355.88 TRAN0303 1.
+ SH030323 BAL0303 -1. BAL0323 1.
+ SH030423 COST 207.08 TRAN0304 1.
+ SH030423 BAL0304 -1. BAL0323 1.
+ SH030523 COST 205.84 TRAN0305 1.
+ SH030523 BAL0305 -1. BAL0323 1.
+ SH030823 COST 172.36 TRAN0308 1.
+ SH030823 BAL0383 -1. BAL0323 1.
+ SH030124 COST 1780.64 TRAN0301 1.
+ SH030124 BAL0301 -1. BAL0324 1.
+ SH030125 COST 479.88 TRAN0301 1.
+ SH030125 BAL0301 -1. BAL0325 1.
+ SH030225 COST 529.48 TRAN0302 1.
+ SH030225 BAL0302 -1. BAL0325 1.
+ SH030325 COST 633.64 TRAN0303 1.
+ SH030325 BAL0303 -1. BAL0325 1.
+ SH030425 COST 431.52 TRAN0304 1.
+ SH030425 BAL0304 -1. BAL0325 1.
+ SH030525 COST 701.84 TRAN0305 1.
+ SH030525 BAL0305 -1. BAL0325 1.
+ SH030625 COST 499.72 TRAN0306 1.
+ SH030625 BAL0352 -1. BAL0325 1.
+ SH030825 COST 378.2 TRAN0308 1.
+ SH030825 BAL0383 -1. BAL0325 1.
+ SH030426 COST 334.8 TRAN0304 1.
+ SH030426 BAL0304 -1. BAL0326 1.
+ SH030127 COST 290.16 TRAN0301 1.
+ SH030127 BAL0301 -1. BAL0327 1.
+ SH030227 COST 352.16 TRAN0302 1.
+ SH030227 BAL0302 -1. BAL0327 1.
+ SH030327 COST 358.36 TRAN0303 1.
+ SH030327 BAL0303 -1. BAL0327 1.
+ SH030427 COST 415.4 TRAN0304 1.
+ SH030427 BAL0304 -1. BAL0327 1.
+ SH030527 COST 468.72 TRAN0305 1.
+ SH030527 BAL0305 -1. BAL0327 1.
+ SH030627 COST 332.32 TRAN0306 1.
+ SH030627 BAL0352 -1. BAL0327 1.
+ SH030827 COST 312.48 TRAN0308 1.
+ SH030827 BAL0383 -1. BAL0327 1.
+ SH030128 COST 301.32 TRAN0301 1.
+ SH030128 BAL0301 -1. BAL0328 1.
+ SH030228 COST 705.56 TRAN0302 1.
+ SH030228 BAL0302 -1. BAL0328 1.
+ SH030328 COST 367.04 TRAN0303 1.
+ SH030328 BAL0303 -1. BAL0328 1.
+ SH030428 COST 365.8 TRAN0304 1.
+ SH030428 BAL0304 -1. BAL0328 1.
+ SH030528 COST 126.48 TRAN0305 1.
+ SH030528 BAL0305 -1. BAL0328 1.
+ SH030628 COST 323.64 TRAN0306 1.
+ SH030628 BAL0352 -1. BAL0328 1.
+ SH030728 COST 132.68 TRAN0307 1.
+ SH030728 BAL0364 -1. BAL0328 1.
+ SH030828 COST 314.96 TRAN0308 1.
+ SH030828 BAL0383 -1. BAL0328 1.
+ SH030129 COST 276.52 TRAN0301 1.
+ SH030129 BAL0301 -1. BAL0329 1.
+ SH030229 COST 575.36 TRAN0302 1.
+ SH030229 BAL0302 -1. BAL0329 1.
+ SH030329 COST 298.84 TRAN0303 1.
+ SH030329 BAL0303 -1. BAL0329 1.
+ SH030429 COST 246.76 TRAN0304 1.
+ SH030429 BAL0304 -1. BAL0329 1.
+ SH030529 COST 533.2 TRAN0305 1.
+ SH030529 BAL0305 -1. BAL0329 1.
+ SH030629 COST 323.64 TRAN0306 1.
+ SH030629 BAL0352 -1. BAL0329 1.
+ SH030829 COST 178.56 TRAN0308 1.
+ SH030829 BAL0383 -1. BAL0329 1.
+ SH030130 COST 577.84 TRAN0301 1.
+ SH030130 BAL0301 -1. BAL0330 1.
+ SH030230 COST 540.64 TRAN0302 1.
+ SH030230 BAL0302 -1. BAL0330 1.
+ SH030330 COST 648.52 TRAN0303 1.
+ SH030330 BAL0303 -1. BAL0330 1.
+ SH030430 COST 376.96 TRAN0304 1.
+ SH030430 BAL0304 -1. BAL0330 1.
+ SH030530 COST 553.04 TRAN0305 1.
+ SH030530 BAL0305 -1. BAL0330 1.
+ SH030830 COST 473.68 TRAN0308 1.
+ SH030830 BAL0383 -1. BAL0330 1.
+ SH030131 COST 137.64 TRAN0301 1.
+ SH030131 BAL0301 -1. BAL0331 1.
+ SH030231 COST 435.24 TRAN0302 1.
+ SH030231 BAL0302 -1. BAL0331 1.
+ SH030331 COST 136.4 TRAN0303 1.
+ SH030331 BAL0303 -1. BAL0331 1.
+ SH030431 COST 313.72 TRAN0304 1.
+ SH030431 BAL0304 -1. BAL0331 1.
+ SH030531 COST 380.68 TRAN0305 1.
+ SH030531 BAL0305 -1. BAL0331 1.
+ SH030631 COST 138.88 TRAN0306 1.
+ SH030631 BAL0352 -1. BAL0331 1.
+ SH030831 COST 276.52 TRAN0308 1.
+ SH030831 BAL0383 -1. BAL0331 1.
+ SH030132 COST 370.76 TRAN0301 1.
+ SH030132 BAL0301 -1. BAL0332 1.
+ SH030232 COST 592.72 TRAN0302 1.
+ SH030232 BAL0302 -1. BAL0332 1.
+ SH030332 COST 524.52 TRAN0303 1.
+ SH030332 BAL0303 -1. BAL0332 1.
+ SH030432 COST 194.68 TRAN0304 1.
+ SH030432 BAL0304 -1. BAL0332 1.
+ SH030532 COST 486.08 TRAN0305 1.
+ SH030532 BAL0305 -1. BAL0332 1.
+ SH030832 COST 223.2 TRAN0308 1.
+ SH030832 BAL0383 -1. BAL0332 1.
+ SH030133 COST 611.32 TRAN0301 1.
+ SH030133 BAL0301 -1. BAL0333 1.
+ SH030233 COST 496. TRAN0302 1.
+ SH030233 BAL0302 -1. BAL0333 1.
+ SH030333 COST 673.32 TRAN0303 1.
+ SH030333 BAL0303 -1. BAL0333 1.
+ SH030433 COST 551.8 TRAN0304 1.
+ SH030433 BAL0304 -1. BAL0333 1.
+ SH030533 COST 782.44 TRAN0305 1.
+ SH030533 BAL0305 -1. BAL0333 1.
+ SH030833 COST 472.44 TRAN0308 1.
+ SH030833 BAL0383 -1. BAL0333 1.
+ SH030134 COST 478.64 TRAN0301 1.
+ SH030134 BAL0301 -1. BAL0334 1.
+ SH030234 COST 812.2 TRAN0302 1.
+ SH030234 BAL0302 -1. BAL0334 1.
+ SH030334 COST 623.72 TRAN0303 1.
+ SH030334 BAL0303 -1. BAL0334 1.
+ SH030434 COST 261.64 TRAN0304 1.
+ SH030434 BAL0304 -1. BAL0334 1.
+ SH030534 COST 546.84 TRAN0305 1.
+ SH030534 BAL0305 -1. BAL0334 1.
+ SH030834 COST 326.12 TRAN0308 1.
+ SH030834 BAL0383 -1. BAL0334 1.
+ SH030135 COST 571.64 TRAN0301 1.
+ SH030135 BAL0301 -1. BAL0335 1.
+ SH030235 COST 551.8 TRAN0302 1.
+ SH030235 BAL0302 -1. BAL0335 1.
+ SH030335 COST 467.48 TRAN0303 1.
+ SH030335 BAL0303 -1. BAL0335 1.
+ SH030435 COST 151.28 TRAN0304 1.
+ SH030435 BAL0304 -1. BAL0335 1.
+ SH030535 COST 534.44 TRAN0305 1.
+ SH030535 BAL0305 -1. BAL0335 1.
+ SH030835 COST 291.4 TRAN0308 1.
+ SH030835 BAL0383 -1. BAL0335 1.
+ SH030136 COST 254.2 TRAN0301 1.
+ SH030136 BAL0301 -1. BAL0336 1.
+ SH030236 COST 555.52 TRAN0302 1.
+ SH030236 BAL0302 -1. BAL0336 1.
+ SH030336 COST 131.44 TRAN0303 1.
+ SH030336 BAL0303 -1. BAL0336 1.
+ SH030436 COST 458.8 TRAN0304 1.
+ SH030436 BAL0304 -1. BAL0336 1.
+ SH030536 COST 429.04 TRAN0305 1.
+ SH030536 BAL0305 -1. BAL0336 1.
+ SH030636 COST 136.4 TRAN0306 1.
+ SH030636 BAL0352 -1. BAL0336 1.
+ SH030836 COST 398.04 TRAN0308 1.
+ SH030836 BAL0383 -1. BAL0336 1.
+ SH030137 COST 114.08 TRAN0301 1.
+ SH030137 BAL0301 -1. BAL0337 1.
+ SH030237 COST 424.08 TRAN0302 1.
+ SH030237 BAL0302 -1. BAL0337 1.
+ SH030337 COST 195.92 TRAN0303 1.
+ SH030337 BAL0303 -1. BAL0337 1.
+ SH030437 COST 376.96 TRAN0304 1.
+ SH030437 BAL0304 -1. BAL0337 1.
+ SH030537 COST 225.68 TRAN0305 1.
+ SH030537 BAL0305 -1. BAL0337 1.
+ SH030637 COST 240.56 TRAN0306 1.
+ SH030637 BAL0352 -1. BAL0337 1.
+ SH030837 COST 312.48 TRAN0308 1.
+ SH030837 BAL0383 -1. BAL0337 1.
+ SH030138 COST 168.64 TRAN0301 1.
+ SH030138 BAL0301 -1. BAL0338 1.
+ SH030238 COST 302.56 TRAN0302 1.
+ SH030238 BAL0302 -1. BAL0338 1.
+ SH030338 COST 117.8 TRAN0303 1.
+ SH030338 BAL0303 -1. BAL0338 1.
+ SH030438 COST 381.92 TRAN0304 1.
+ SH030438 BAL0304 -1. BAL0338 1.
+ SH030538 COST 344.72 TRAN0305 1.
+ SH030538 BAL0305 -1. BAL0338 1.
+ SH030638 COST 48.36 TRAN0306 1.
+ SH030638 BAL0352 -1. BAL0338 1.
+ SH030738 COST 267.84 TRAN0307 1.
+ SH030738 BAL0364 -1. BAL0338 1.
+ SH030838 COST 293.88 TRAN0308 1.
+ SH030838 BAL0383 -1. BAL0338 1.
+ SH030139 COST 161.2 TRAN0301 1.
+ SH030139 BAL0301 -1. BAL0339 1.
+ SH030239 COST 420.36 TRAN0302 1.
+ SH030239 BAL0302 -1. BAL0339 1.
+ SH030339 COST 198.4 TRAN0303 1.
+ SH030339 BAL0303 -1. BAL0339 1.
+ SH030439 COST 308.76 TRAN0304 1.
+ SH030439 BAL0304 -1. BAL0339 1.
+ SH030539 COST 531.96 TRAN0305 1.
+ SH030539 BAL0305 -1. BAL0339 1.
+ SH030639 COST 252.96 TRAN0306 1.
+ SH030639 BAL0352 -1. BAL0339 1.
+ SH030839 COST 208.32 TRAN0308 1.
+ SH030839 BAL0383 -1. BAL0339 1.
+ SH030140 COST 204.6 TRAN0301 1.
+ SH030140 BAL0301 -1. BAL0340 1.
+ SH030240 COST 468.72 TRAN0302 1.
+ SH030240 BAL0302 -1. BAL0340 1.
+ SH030340 COST 127.72 TRAN0303 1.
+ SH030340 BAL0303 -1. BAL0340 1.
+ SH030440 COST 368.28 TRAN0304 1.
+ SH030440 BAL0304 -1. BAL0340 1.
+ SH030540 COST 274.04 TRAN0305 1.
+ SH030540 BAL0305 -1. BAL0340 1.
+ SH030640 COST 162.44 TRAN0306 1.
+ SH030640 BAL0352 -1. BAL0340 1.
+ SH030840 COST 339.76 TRAN0308 1.
+ SH030840 BAL0383 -1. BAL0340 1.
+ SH030141 COST 243.04 TRAN0301 1.
+ SH030141 BAL0301 -1. BAL0341 1.
+ SH030241 COST 372. TRAN0302 1.
+ SH030241 BAL0302 -1. BAL0341 1.
+ SH030341 COST 186. TRAN0303 1.
+ SH030341 BAL0303 -1. BAL0341 1.
+ SH030441 COST 401.76 TRAN0304 1.
+ SH030441 BAL0304 -1. BAL0341 1.
+ SH030541 COST 456.32 TRAN0305 1.
+ SH030541 BAL0305 -1. BAL0341 1.
+ SH030641 COST 124. TRAN0306 1.
+ SH030641 BAL0352 -1. BAL0341 1.
+ SH030841 COST 370.76 TRAN0308 1.
+ SH030841 BAL0383 -1. BAL0341 1.
+ SH030142 COST 111.6 TRAN0301 1.
+ SH030142 BAL0301 -1. BAL0342 1.
+ SH030242 COST 513.36 TRAN0302 1.
+ SH030242 BAL0302 -1. BAL0342 1.
+ SH030342 COST 198.4 TRAN0303 1.
+ SH030342 BAL0303 -1. BAL0342 1.
+ SH030442 COST 241.8 TRAN0304 1.
+ SH030442 BAL0304 -1. BAL0342 1.
+ SH030542 COST 447.64 TRAN0305 1.
+ SH030542 BAL0305 -1. BAL0342 1.
+ SH030642 COST 199.64 TRAN0306 1.
+ SH030642 BAL0352 -1. BAL0342 1.
+ SH030842 COST 188.48 TRAN0308 1.
+ SH030842 BAL0383 -1. BAL0342 1.
+ SH030143 COST 197.16 TRAN0301 1.
+ SH030143 BAL0301 -1. BAL0343 1.
+ SH030243 COST 489.8 TRAN0302 1.
+ SH030243 BAL0302 -1. BAL0343 1.
+ SH030343 COST 31. TRAN0303 1.
+ SH030343 BAL0303 -1. BAL0343 1.
+ SH030443 COST 367.04 TRAN0304 1.
+ SH030443 BAL0304 -1. BAL0343 1.
+ SH030543 COST 319.92 TRAN0305 1.
+ SH030543 BAL0305 -1. BAL0343 1.
+ SH030643 COST 124. TRAN0306 1.
+ SH030643 BAL0352 -1. BAL0343 1.
+ SH030743 COST 298.84 TRAN0307 1.
+ SH030743 BAL0364 -1. BAL0343 1.
+ SH030843 COST 336.04 TRAN0308 1.
+ SH030843 BAL0383 -1. BAL0343 1.
+ SH030144 COST 197.16 TRAN0301 1.
+ SH030144 BAL0301 -1. BAL0344 1.
+ SH030244 COST 469.96 TRAN0302 1.
+ SH030244 BAL0302 -1. BAL0344 1.
+ SH030344 COST 158.72 TRAN0303 1.
+ SH030344 BAL0303 -1. BAL0344 1.
+ SH030444 COST 386.88 TRAN0304 1.
+ SH030444 BAL0304 -1. BAL0344 1.
+ SH030544 COST 384.4 TRAN0305 1.
+ SH030544 BAL0305 -1. BAL0344 1.
+ SH030644 COST 110.36 TRAN0306 1.
+ SH030644 BAL0352 -1. BAL0344 1.
+ SH030844 COST 369.52 TRAN0308 1.
+ SH030844 BAL0383 -1. BAL0344 1.
+ SH030145 COST 213.28 TRAN0301 1.
+ SH030145 BAL0301 -1. BAL0345 1.
+ SH030245 COST 540.64 TRAN0302 1.
+ SH030245 BAL0302 -1. BAL0345 1.
+ SH030345 COST 199.64 TRAN0303 1.
+ SH030345 BAL0303 -1. BAL0345 1.
+ SH030445 COST 362.08 TRAN0304 1.
+ SH030445 BAL0304 -1. BAL0345 1.
+ SH030545 COST 290.16 TRAN0305 1.
+ SH030545 BAL0305 -1. BAL0345 1.
+ SH030645 COST 236.84 TRAN0306 1.
+ SH030645 BAL0352 -1. BAL0345 1.
+ SH030745 COST 244.28 TRAN0307 1.
+ SH030745 BAL0364 -1. BAL0345 1.
+ SH030845 COST 378.2 TRAN0308 1.
+ SH030845 BAL0383 -1. BAL0345 1.
+ SH030146 COST 303.8 TRAN0301 1.
+ SH030146 BAL0301 -1. BAL0346 1.
+ SH030246 COST 338.52 TRAN0302 1.
+ SH030246 BAL0302 -1. BAL0346 1.
+ SH030346 COST 274.04 TRAN0303 1.
+ SH030346 BAL0303 -1. BAL0346 1.
+ SH030446 COST 554.28 TRAN0304 1.
+ SH030446 BAL0304 -1. BAL0346 1.
+ SH030546 COST 533.2 TRAN0305 1.
+ SH030546 BAL0305 -1. BAL0346 1.
+ SH030646 COST 318.68 TRAN0306 1.
+ SH030646 BAL0352 -1. BAL0346 1.
+ SH030846 COST 555.52 TRAN0308 1.
+ SH030846 BAL0383 -1. BAL0346 1.
+ SH030147 COST 136.4 TRAN0301 1.
+ SH030147 BAL0301 -1. BAL0347 1.
+ SH030247 COST 462.52 TRAN0302 1.
+ SH030247 BAL0302 -1. BAL0347 1.
+ SH030347 COST 197.16 TRAN0303 1.
+ SH030347 BAL0303 -1. BAL0347 1.
+ SH030447 COST 339.76 TRAN0304 1.
+ SH030447 BAL0304 -1. BAL0347 1.
+ SH030547 COST 288.92 TRAN0305 1.
+ SH030547 BAL0305 -1. BAL0347 1.
+ SH030647 COST 179.8 TRAN0306 1.
+ SH030647 BAL0352 -1. BAL0347 1.
+ SH030847 COST 302.56 TRAN0308 1.
+ SH030847 BAL0383 -1. BAL0347 1.
+ SH030148 COST 117.8 TRAN0301 1.
+ SH030148 BAL0301 -1. BAL0348 1.
+ SH030248 COST 420.36 TRAN0302 1.
+ SH030248 BAL0302 -1. BAL0348 1.
+ SH030348 COST 169.88 TRAN0303 1.
+ SH030348 BAL0303 -1. BAL0348 1.
+ SH030448 COST 285.2 TRAN0304 1.
+ SH030448 BAL0304 -1. BAL0348 1.
+ SH030548 COST 306.28 TRAN0305 1.
+ SH030548 BAL0305 -1. BAL0348 1.
+ SH030648 COST 142.6 TRAN0306 1.
+ SH030648 BAL0352 -1. BAL0348 1.
+ SH030848 COST 241.8 TRAN0308 1.
+ SH030848 BAL0383 -1. BAL0348 1.
+ SH030149 COST 407.96 TRAN0301 1.
+ SH030149 BAL0301 -1. BAL0349 1.
+ SH030249 COST 663.4 TRAN0302 1.
+ SH030249 BAL0302 -1. BAL0349 1.
+ SH030349 COST 411.68 TRAN0303 1.
+ SH030349 BAL0303 -1. BAL0349 1.
+ SH030449 COST 472.44 TRAN0304 1.
+ SH030449 BAL0304 -1. BAL0349 1.
+ SH030549 COST 188.48 TRAN0305 1.
+ SH030549 BAL0305 -1. BAL0349 1.
+ SH030649 COST 419.12 TRAN0306 1.
+ SH030649 BAL0352 -1. BAL0349 1.
+ SH030749 COST 166.16 TRAN0307 1.
+ SH030749 BAL0364 -1. BAL0349 1.
+ SH030849 COST 505.92 TRAN0308 1.
+ SH030849 BAL0383 -1. BAL0349 1.
+ SH030150 COST 298.84 TRAN0301 1.
+ SH030150 BAL0301 -1. BAL0350 1.
+ SH030250 COST 758.88 TRAN0302 1.
+ SH030250 BAL0302 -1. BAL0350 1.
+ SH030350 COST 305.04 TRAN0303 1.
+ SH030350 BAL0303 -1. BAL0350 1.
+ SH030450 COST 452.6 TRAN0304 1.
+ SH030450 BAL0304 -1. BAL0350 1.
+ SH030550 COST 291.4 TRAN0305 1.
+ SH030550 BAL0305 -1. BAL0350 1.
+ SH030750 COST 169.88 TRAN0307 1.
+ SH030750 BAL0364 -1. BAL0350 1.
+ SH030850 COST 503.44 TRAN0308 1.
+ SH030850 BAL0383 -1. BAL0350 1.
+ SH030151 COST 411.68 TRAN0301 1.
+ SH030151 BAL0301 -1. BAL0351 1.
+ SH030251 COST 682. TRAN0302 1.
+ SH030251 BAL0302 -1. BAL0351 1.
+ SH030351 COST 422.84 TRAN0303 1.
+ SH030351 BAL0303 -1. BAL0351 1.
+ SH030451 COST 419.12 TRAN0304 1.
+ SH030451 BAL0304 -1. BAL0351 1.
+ SH030551 COST 152.52 TRAN0305 1.
+ SH030551 BAL0305 -1. BAL0351 1.
+ SH030751 COST 122.76 TRAN0307 1.
+ SH030751 BAL0364 -1. BAL0351 1.
+ SH030851 COST 530.72 TRAN0308 1.
+ SH030851 BAL0383 -1. BAL0351 1.
+ SH030152 COST 138.88 TRAN0301 1.
+ SH030152 BAL0301 -1. BAL0352 1.
+ SH030252 COST 372. TRAN0302 1.
+ SH030252 BAL0302 -1. BAL0352 1.
+ SH030352 COST 101.68 TRAN0303 1.
+ SH030352 BAL0303 -1. BAL0352 1.
+ SH030452 COST 399.28 TRAN0304 1.
+ SH030452 BAL0304 -1. BAL0352 1.
+ SH030552 COST 365.8 TRAN0305 1.
+ SH030552 BAL0305 -1. BAL0352 1.
+ SH030852 COST 313.72 TRAN0308 1.
+ SH030852 BAL0383 -1. BAL0352 1.
+ SH030153 COST 445.16 TRAN0301 1.
+ SH030153 BAL0301 -1. BAL0353 1.
+ SH030253 COST 788.64 TRAN0302 1.
+ SH030253 BAL0302 -1. BAL0353 1.
+ SH030353 COST 403. TRAN0303 1.
+ SH030353 BAL0303 -1. BAL0353 1.
+ SH030453 COST 510.88 TRAN0304 1.
+ SH030453 BAL0304 -1. BAL0353 1.
+ SH030553 COST 228.16 TRAN0305 1.
+ SH030553 BAL0305 -1. BAL0353 1.
+ SH030653 COST 445.16 TRAN0306 1.
+ SH030653 BAL0352 -1. BAL0353 1.
+ SH030753 COST 181.04 TRAN0307 1.
+ SH030753 BAL0364 -1. BAL0353 1.
+ SH030853 COST 499.72 TRAN0308 1.
+ SH030853 BAL0383 -1. BAL0353 1.
+ SH030154 COST 229.4 TRAN0301 1.
+ SH030154 BAL0301 -1. BAL0354 1.
+ SH030254 COST 551.8 TRAN0302 1.
+ SH030254 BAL0302 -1. BAL0354 1.
+ SH030354 COST 269.08 TRAN0303 1.
+ SH030354 BAL0303 -1. BAL0354 1.
+ SH030454 COST 425.32 TRAN0304 1.
+ SH030454 BAL0304 -1. BAL0354 1.
+ SH030554 COST 264.12 TRAN0305 1.
+ SH030554 BAL0305 -1. BAL0354 1.
+ SH030654 COST 251.72 TRAN0306 1.
+ SH030654 BAL0352 -1. BAL0354 1.
+ SH030854 COST 498.48 TRAN0308 1.
+ SH030854 BAL0383 -1. BAL0354 1.
+ SH030155 COST 344.72 TRAN0301 1.
+ SH030155 BAL0301 -1. BAL0355 1.
+ SH030255 COST 593.96 TRAN0302 1.
+ SH030255 BAL0302 -1. BAL0355 1.
+ SH030355 COST 348.44 TRAN0303 1.
+ SH030355 BAL0303 -1. BAL0355 1.
+ SH030455 COST 364.56 TRAN0304 1.
+ SH030455 BAL0304 -1. BAL0355 1.
+ SH030555 COST 190.96 TRAN0305 1.
+ SH030555 BAL0305 -1. BAL0355 1.
+ SH030655 COST 359.6 TRAN0306 1.
+ SH030655 BAL0352 -1. BAL0355 1.
+ SH030755 COST 132.68 TRAN0307 1.
+ SH030755 BAL0364 -1. BAL0355 1.
+ SH030855 COST 364.56 TRAN0308 1.
+ SH030855 BAL0383 -1. BAL0355 1.
+ SH030156 COST 483.6 TRAN0301 1.
+ SH030156 BAL0301 -1. BAL0356 1.
+ SH030256 COST 717.96 TRAN0302 1.
+ SH030256 BAL0302 -1. BAL0356 1.
+ SH030356 COST 378.2 TRAN0303 1.
+ SH030356 BAL0303 -1. BAL0356 1.
+ SH030456 COST 452.6 TRAN0304 1.
+ SH030456 BAL0304 -1. BAL0356 1.
+ SH030556 COST 168.64 TRAN0305 1.
+ SH030556 BAL0305 -1. BAL0356 1.
+ SH030656 COST 420.36 TRAN0306 1.
+ SH030656 BAL0352 -1. BAL0356 1.
+ SH030756 COST 151.28 TRAN0307 1.
+ SH030756 BAL0364 -1. BAL0356 1.
+ SH030856 COST 442.68 TRAN0308 1.
+ SH030856 BAL0383 -1. BAL0356 1.
+ SH030157 COST 323.64 TRAN0301 1.
+ SH030157 BAL0301 -1. BAL0357 1.
+ SH030257 COST 644.8 TRAN0302 1.
+ SH030257 BAL0302 -1. BAL0357 1.
+ SH030357 COST 359.6 TRAN0303 1.
+ SH030357 BAL0303 -1. BAL0357 1.
+ SH030457 COST 290.16 TRAN0304 1.
+ SH030457 BAL0304 -1. BAL0357 1.
+ SH030557 COST 208.32 TRAN0305 1.
+ SH030557 BAL0305 -1. BAL0357 1.
+ SH030657 COST 395.56 TRAN0306 1.
+ SH030657 BAL0352 -1. BAL0357 1.
+ SH030757 COST 183.52 TRAN0307 1.
+ SH030757 BAL0364 -1. BAL0357 1.
+ SH030857 COST 286.44 TRAN0308 1.
+ SH030857 BAL0383 -1. BAL0357 1.
+ SH030158 COST 364.56 TRAN0301 1.
+ SH030158 BAL0301 -1. BAL0358 1.
+ SH030258 COST 646.04 TRAN0302 1.
+ SH030258 BAL0302 -1. BAL0358 1.
+ SH030358 COST 344.72 TRAN0303 1.
+ SH030358 BAL0303 -1. BAL0358 1.
+ SH030458 COST 425.32 TRAN0304 1.
+ SH030458 BAL0304 -1. BAL0358 1.
+ SH030558 COST 26.04 TRAN0305 1.
+ SH030558 BAL0305 -1. BAL0358 1.
+ SH030658 COST 404.24 TRAN0306 1.
+ SH030658 BAL0352 -1. BAL0358 1.
+ SH030758 COST 84.32 TRAN0307 1.
+ SH030758 BAL0364 -1. BAL0358 1.
+ SH030858 COST 314.96 TRAN0308 1.
+ SH030858 BAL0383 -1. BAL0358 1.
+ SH030159 COST 255.44 TRAN0301 1.
+ SH030159 BAL0301 -1. BAL0359 1.
+ SH030259 COST 617.52 TRAN0302 1.
+ SH030259 BAL0302 -1. BAL0359 1.
+ SH030359 COST 295.12 TRAN0303 1.
+ SH030359 BAL0303 -1. BAL0359 1.
+ SH030459 COST 302.56 TRAN0304 1.
+ SH030459 BAL0304 -1. BAL0359 1.
+ SH030559 COST 197.16 TRAN0305 1.
+ SH030559 BAL0305 -1. BAL0359 1.
+ SH030659 COST 368.28 TRAN0306 1.
+ SH030659 BAL0352 -1. BAL0359 1.
+ SH030759 COST 130.2 TRAN0307 1.
+ SH030759 BAL0364 -1. BAL0359 1.
+ SH030859 COST 316.2 TRAN0308 1.
+ SH030859 BAL0383 -1. BAL0359 1.
+ SH030160 COST 323.64 TRAN0301 1.
+ SH030160 BAL0301 -1. BAL0360 1.
+ SH030260 COST 682. TRAN0302 1.
+ SH030260 BAL0302 -1. BAL0360 1.
+ SH030360 COST 350.92 TRAN0303 1.
+ SH030360 BAL0303 -1. BAL0360 1.
+ SH030460 COST 386.88 TRAN0304 1.
+ SH030460 BAL0304 -1. BAL0360 1.
+ SH030560 COST 167.4 TRAN0305 1.
+ SH030560 BAL0305 -1. BAL0360 1.
+ SH030660 COST 400.52 TRAN0306 1.
+ SH030660 BAL0352 -1. BAL0360 1.
+ SH030760 COST 109.12 TRAN0307 1.
+ SH030760 BAL0364 -1. BAL0360 1.
+ SH030860 COST 370.76 TRAN0308 1.
+ SH030860 BAL0383 -1. BAL0360 1.
+ SH030163 COST 329.84 TRAN0301 1.
+ SH030163 BAL0301 -1. BAL0363 1.
+ SH030263 COST 612.56 TRAN0302 1.
+ SH030263 BAL0302 -1. BAL0363 1.
+ SH030363 COST 355.88 TRAN0303 1.
+ SH030363 BAL0303 -1. BAL0363 1.
+ SH030463 COST 457.56 TRAN0304 1.
+ SH030463 BAL0304 -1. BAL0363 1.
+ SH030563 COST 188.48 TRAN0305 1.
+ SH030563 BAL0305 -1. BAL0363 1.
+ SH030663 COST 390.6 TRAN0306 1.
+ SH030663 BAL0352 -1. BAL0363 1.
+ SH030763 COST 153.76 TRAN0307 1.
+ SH030763 BAL0364 -1. BAL0363 1.
+ SH030863 COST 496. TRAN0308 1.
+ SH030863 BAL0383 -1. BAL0363 1.
+ SH030164 COST 246.76 TRAN0301 1.
+ SH030164 BAL0301 -1. BAL0364 1.
+ SH030264 COST 652.24 TRAN0302 1.
+ SH030264 BAL0302 -1. BAL0364 1.
+ SH030364 COST 276.52 TRAN0303 1.
+ SH030364 BAL0303 -1. BAL0364 1.
+ SH030464 COST 416.64 TRAN0304 1.
+ SH030464 BAL0304 -1. BAL0364 1.
+ SH030564 COST 71.92 TRAN0305 1.
+ SH030564 BAL0305 -1. BAL0364 1.
+ SH030664 COST 393.08 TRAN0306 1.
+ SH030664 BAL0352 -1. BAL0364 1.
+ SH030864 COST 310. TRAN0308 1.
+ SH030864 BAL0383 -1. BAL0364 1.
+ SH030165 COST 535.68 TRAN0301 1.
+ SH030165 BAL0301 -1. BAL0365 1.
+ SH030265 COST 380.68 TRAN0302 1.
+ SH030265 BAL0302 -1. BAL0365 1.
+ SH030365 COST 626.2 TRAN0303 1.
+ SH030365 BAL0303 -1. BAL0365 1.
+ SH030465 COST 481.12 TRAN0304 1.
+ SH030465 BAL0304 -1. BAL0365 1.
+ SH030565 COST 748.96 TRAN0305 1.
+ SH030565 BAL0305 -1. BAL0365 1.
+ SH030865 COST 514.6 TRAN0308 1.
+ SH030865 BAL0383 -1. BAL0365 1.
+ SH030166 COST 694.4 TRAN0301 1.
+ SH030166 BAL0301 -1. BAL0366 1.
+ SH030266 COST 321.16 TRAN0302 1.
+ SH030266 BAL0302 -1. BAL0366 1.
+ SH030366 COST 716.72 TRAN0303 1.
+ SH030366 BAL0303 -1. BAL0366 1.
+ SH030466 COST 689.44 TRAN0304 1.
+ SH030466 BAL0304 -1. BAL0366 1.
+ SH030566 COST 880.4 TRAN0305 1.
+ SH030566 BAL0305 -1. BAL0366 1.
+ SH030866 COST 694.4 TRAN0308 1.
+ SH030866 BAL0383 -1. BAL0366 1.
+ SH030167 COST 527. TRAN0301 1.
+ SH030167 BAL0301 -1. BAL0367 1.
+ SH030267 COST 287.68 TRAN0302 1.
+ SH030267 BAL0302 -1. BAL0367 1.
+ SH030367 COST 611.32 TRAN0303 1.
+ SH030367 BAL0303 -1. BAL0367 1.
+ SH030467 COST 566.68 TRAN0304 1.
+ SH030467 BAL0304 -1. BAL0367 1.
+ SH030567 COST 748.96 TRAN0305 1.
+ SH030567 BAL0305 -1. BAL0367 1.
+ SH030867 COST 567.92 TRAN0308 1.
+ SH030867 BAL0383 -1. BAL0367 1.
+ SH030168 COST 736.56 TRAN0301 1.
+ SH030168 BAL0301 -1. BAL0368 1.
+ SH030268 COST 496. TRAN0302 1.
+ SH030268 BAL0302 -1. BAL0368 1.
+ SH030368 COST 694.4 TRAN0303 1.
+ SH030368 BAL0303 -1. BAL0368 1.
+ SH030468 COST 870.48 TRAN0304 1.
+ SH030468 BAL0304 -1. BAL0368 1.
+ SH030568 COST 1173.04 TRAN0305 1.
+ SH030568 BAL0305 -1. BAL0368 1.
+ SH030868 COST 931.24 TRAN0308 1.
+ SH030868 BAL0383 -1. BAL0368 1.
+ SH030169 COST 668.36 TRAN0301 1.
+ SH030169 BAL0301 -1. BAL0369 1.
+ SH030269 COST 274.04 TRAN0302 1.
+ SH030269 BAL0302 -1. BAL0369 1.
+ SH030369 COST 632.4 TRAN0303 1.
+ SH030369 BAL0303 -1. BAL0369 1.
+ SH030469 COST 771.28 TRAN0304 1.
+ SH030469 BAL0304 -1. BAL0369 1.
+ SH030569 COST 801.04 TRAN0305 1.
+ SH030569 BAL0305 -1. BAL0369 1.
+ SH030869 COST 815.92 TRAN0308 1.
+ SH030869 BAL0383 -1. BAL0369 1.
+ SH030171 COST 545.6 TRAN0301 1.
+ SH030171 BAL0301 -1. BAL0371 1.
+ SH030371 COST 649.76 TRAN0303 1.
+ SH030371 BAL0303 -1. BAL0371 1.
+ SH030471 COST 646.04 TRAN0304 1.
+ SH030471 BAL0304 -1. BAL0371 1.
+ SH030571 COST 720.44 TRAN0305 1.
+ SH030571 BAL0305 -1. BAL0371 1.
+ SH030671 COST 484.84 TRAN0306 1.
+ SH030671 BAL0352 -1. BAL0371 1.
+ SH030771 COST 872.96 TRAN0307 1.
+ SH030771 BAL0364 -1. BAL0371 1.
+ SH030871 COST 660.92 TRAN0308 1.
+ SH030871 BAL0383 -1. BAL0371 1.
+ SH030172 COST 727.88 TRAN0301 1.
+ SH030172 BAL0301 -1. BAL0372 1.
+ SH030272 COST 673.32 TRAN0302 1.
+ SH030272 BAL0302 -1. BAL0372 1.
+ SH030372 COST 765.08 TRAN0303 1.
+ SH030372 BAL0303 -1. BAL0372 1.
+ SH030472 COST 706.8 TRAN0304 1.
+ SH030472 BAL0304 -1. BAL0372 1.
+ SH030572 COST 946.12 TRAN0305 1.
+ SH030572 BAL0305 -1. BAL0372 1.
+ SH030872 COST 706.8 TRAN0308 1.
+ SH030872 BAL0383 -1. BAL0372 1.
+ SH030173 COST 483.6 TRAN0301 1.
+ SH030173 BAL0301 -1. BAL0373 1.
+ SH030273 COST 452.6 TRAN0302 1.
+ SH030273 BAL0302 -1. BAL0373 1.
+ SH030373 COST 419.12 TRAN0303 1.
+ SH030373 BAL0303 -1. BAL0373 1.
+ SH030473 COST 566.68 TRAN0304 1.
+ SH030473 BAL0304 -1. BAL0373 1.
+ SH030573 COST 699.36 TRAN0305 1.
+ SH030573 BAL0305 -1. BAL0373 1.
+ SH030673 COST 378.2 TRAN0306 1.
+ SH030673 BAL0352 -1. BAL0373 1.
+ SH030873 COST 624.96 TRAN0308 1.
+ SH030873 BAL0383 -1. BAL0373 1.
+ SH030174 COST 679.52 TRAN0301 1.
+ SH030174 BAL0301 -1. BAL0374 1.
+ SH030274 COST 260.4 TRAN0302 1.
+ SH030274 BAL0302 -1. BAL0374 1.
+ SH030374 COST 706.8 TRAN0303 1.
+ SH030374 BAL0303 -1. BAL0374 1.
+ SH030474 COST 789.88 TRAN0304 1.
+ SH030474 BAL0304 -1. BAL0374 1.
+ SH030574 COST 908.92 TRAN0305 1.
+ SH030574 BAL0305 -1. BAL0374 1.
+ SH030874 COST 767.56 TRAN0308 1.
+ SH030874 BAL0383 -1. BAL0374 1.
+ SH030275 COST 686.96 TRAN0302 1.
+ SH030275 BAL0302 -1. BAL0375 1.
+ SH030176 COST 572.88 TRAN0301 1.
+ SH030176 BAL0301 -1. BAL0376 1.
+ SH030276 COST 497.24 TRAN0302 1.
+ SH030276 BAL0302 -1. BAL0376 1.
+ SH030376 COST 499.72 TRAN0303 1.
+ SH030376 BAL0303 -1. BAL0376 1.
+ SH030476 COST 781.2 TRAN0304 1.
+ SH030476 BAL0304 -1. BAL0376 1.
+ SH030576 COST 781.2 TRAN0305 1.
+ SH030576 BAL0305 -1. BAL0376 1.
+ SH030676 COST 472.44 TRAN0306 1.
+ SH030676 BAL0352 -1. BAL0376 1.
+ SH030876 COST 963.48 TRAN0308 1.
+ SH030876 BAL0383 -1. BAL0376 1.
+ SH030177 COST 539.4 TRAN0301 1.
+ SH030177 BAL0301 -1. BAL0377 1.
+ SH030277 COST 337.28 TRAN0302 1.
+ SH030277 BAL0302 -1. BAL0377 1.
+ SH030377 COST 571.64 TRAN0303 1.
+ SH030377 BAL0303 -1. BAL0377 1.
+ SH030477 COST 497.24 TRAN0304 1.
+ SH030477 BAL0304 -1. BAL0377 1.
+ SH030577 COST 694.4 TRAN0305 1.
+ SH030577 BAL0305 -1. BAL0377 1.
+ SH030877 COST 396.8 TRAN0308 1.
+ SH030877 BAL0383 -1. BAL0377 1.
+ SH030178 COST 943.64 TRAN0301 1.
+ SH030178 BAL0301 -1. BAL0378 1.
+ SH030278 COST 548.08 TRAN0302 1.
+ SH030278 BAL0302 -1. BAL0378 1.
+ SH030378 COST 970.92 TRAN0303 1.
+ SH030378 BAL0303 -1. BAL0378 1.
+ SH030478 COST 849.4 TRAN0304 1.
+ SH030478 BAL0304 -1. BAL0378 1.
+ SH030578 COST 1089.96 TRAN0305 1.
+ SH030578 BAL0305 -1. BAL0378 1.
+ SH030878 COST 949.84 TRAN0308 1.
+ SH030878 BAL0383 -1. BAL0378 1.
+ SH030179 COST 886.6 TRAN0301 1.
+ SH030179 BAL0301 -1. BAL0379 1.
+ SH030279 COST 333.56 TRAN0302 1.
+ SH030279 BAL0302 -1. BAL0379 1.
+ SH030379 COST 856.84 TRAN0303 1.
+ SH030379 BAL0303 -1. BAL0379 1.
+ SH030479 COST 892.8 TRAN0304 1.
+ SH030479 BAL0304 -1. BAL0379 1.
+ SH030879 COST 875.44 TRAN0308 1.
+ SH030879 BAL0383 -1. BAL0379 1.
+ SH030180 COST 393.08 TRAN0301 1.
+ SH030180 BAL0301 -1. BAL0380 1.
+ SH030280 COST 489.8 TRAN0302 1.
+ SH030280 BAL0302 -1. BAL0380 1.
+ SH030380 COST 541.88 TRAN0303 1.
+ SH030380 BAL0303 -1. BAL0380 1.
+ SH030480 COST 463.76 TRAN0304 1.
+ SH030480 BAL0304 -1. BAL0380 1.
+ SH030580 COST 626.2 TRAN0305 1.
+ SH030580 BAL0305 -1. BAL0380 1.
+ SH030880 COST 297.6 TRAN0308 1.
+ SH030880 BAL0383 -1. BAL0380 1.
+ SH030182 COST 721.68 TRAN0301 1.
+ SH030182 BAL0301 -1. BAL0382 1.
+ SH030282 COST 407.96 TRAN0302 1.
+ SH030282 BAL0302 -1. BAL0382 1.
+ SH030382 COST 812.2 TRAN0303 1.
+ SH030382 BAL0303 -1. BAL0382 1.
+ SH030482 COST 875.44 TRAN0304 1.
+ SH030482 BAL0304 -1. BAL0382 1.
+ SH030582 COST 1422.28 TRAN0305 1.
+ SH030582 BAL0305 -1. BAL0382 1.
+ SH030882 COST 970.92 TRAN0308 1.
+ SH030882 BAL0383 -1. BAL0382 1.
+ SH030183 COST 219.48 TRAN0301 1.
+ SH030183 BAL0301 -1. BAL0383 1.
+ SH030283 COST 644.8 TRAN0302 1.
+ SH030283 BAL0302 -1. BAL0383 1.
+ SH030383 COST 337.28 TRAN0303 1.
+ SH030383 BAL0303 -1. BAL0383 1.
+ SH030483 COST 73.16 TRAN0304 1.
+ SH030483 BAL0304 -1. BAL0383 1.
+ SH030583 COST 430.28 TRAN0305 1.
+ SH030583 BAL0305 -1. BAL0383 1.
+ SH030683 COST 307.52 TRAN0306 1.
+ SH030683 BAL0352 -1. BAL0383 1.
+ SH030184 COST 376.96 TRAN0301 1.
+ SH030184 BAL0301 -1. BAL0384 1.
+ SH030284 COST 238.08 TRAN0302 1.
+ SH030284 BAL0302 -1. BAL0384 1.
+ SH030384 COST 451.36 TRAN0303 1.
+ SH030384 BAL0303 -1. BAL0384 1.
+ SH030484 COST 458.8 TRAN0304 1.
+ SH030484 BAL0304 -1. BAL0384 1.
+ SH030584 COST 607.6 TRAN0305 1.
+ SH030584 BAL0305 -1. BAL0384 1.
+ SH030684 COST 378.2 TRAN0306 1.
+ SH030684 BAL0352 -1. BAL0384 1.
+ SH030884 COST 481.12 TRAN0308 1.
+ SH030884 BAL0383 -1. BAL0384 1.
+ SH040201 COST 299.97 TRAN0402 1.
+ SH040201 BAL0402 -1. BAL0401 1.
+ SH040301 COST 115.14 TRAN0403 1.
+ SH040301 BAL0403 -1. BAL0401 1.
+ SH040401 COST 210.08 TRAN0404 1.
+ SH040401 BAL0404 -1. BAL0401 1.
+ SH040501 COST 239.37 TRAN0405 1.
+ SH040501 BAL0405 -1. BAL0401 1.
+ SH040601 COST 127.26 TRAN0406 1.
+ SH040601 BAL0452 -1. BAL0401 1.
+ SH040801 COST 144.43 TRAN0408 1.
+ SH040801 BAL0483 -1. BAL0401 1.
+ SH040102 COST 478.74 TRAN0401 1.
+ SH040102 BAL0401 -1. BAL0402 1.
+ SH040302 COST 421.17 TRAN0403 1.
+ SH040302 BAL0403 -1. BAL0402 1.
+ SH040402 COST 618.12 TRAN0404 1.
+ SH040402 BAL0404 -1. BAL0402 1.
+ SH040502 COST 748.41 TRAN0405 1.
+ SH040502 BAL0405 -1. BAL0402 1.
+ SH040602 COST 381.78 TRAN0406 1.
+ SH040602 BAL0452 -1. BAL0402 1.
+ SH040802 COST 526.21 TRAN0408 1.
+ SH040802 BAL0483 -1. BAL0402 1.
+ SH040103 COST 247.45 TRAN0401 1.
+ SH040103 BAL0401 -1. BAL0403 1.
+ SH040203 COST 478.74 TRAN0402 1.
+ SH040203 BAL0402 -1. BAL0403 1.
+ SH040403 COST 370.67 TRAN0404 1.
+ SH040403 BAL0404 -1. BAL0403 1.
+ SH040503 COST 286.84 TRAN0405 1.
+ SH040503 BAL0405 -1. BAL0403 1.
+ SH040603 COST 90.9 TRAN0406 1.
+ SH040603 BAL0452 -1. BAL0403 1.
+ SH040803 COST 257.55 TRAN0408 1.
+ SH040803 BAL0483 -1. BAL0403 1.
+ SH040104 COST 175.74 TRAN0401 1.
+ SH040104 BAL0401 -1. BAL0404 1.
+ SH040204 COST 508.03 TRAN0402 1.
+ SH040204 BAL0402 -1. BAL0404 1.
+ SH040304 COST 245.43 TRAN0403 1.
+ SH040304 BAL0403 -1. BAL0404 1.
+ SH040504 COST 322.19 TRAN0405 1.
+ SH040504 BAL0405 -1. BAL0404 1.
+ SH040604 COST 247.45 TRAN0406 1.
+ SH040604 BAL0452 -1. BAL0404 1.
+ SH040704 COST 271.69 TRAN0407 1.
+ SH040704 BAL0464 -1. BAL0404 1.
+ SH040804 COST 58.58 TRAN0408 1.
+ SH040804 BAL0483 -1. BAL0404 1.
+ SH040105 COST 272.7 TRAN0401 1.
+ SH040105 BAL0401 -1. BAL0405 1.
+ SH040205 COST 521.16 TRAN0402 1.
+ SH040205 BAL0402 -1. BAL0405 1.
+ SH040305 COST 286.84 TRAN0403 1.
+ SH040305 BAL0403 -1. BAL0405 1.
+ SH040405 COST 287.85 TRAN0404 1.
+ SH040405 BAL0404 -1. BAL0405 1.
+ SH040605 COST 329.26 TRAN0406 1.
+ SH040605 BAL0452 -1. BAL0405 1.
+ SH040705 COST 337.34 TRAN0407 1.
+ SH040705 BAL0464 -1. BAL0405 1.
+ SH040805 COST 273.71 TRAN0408 1.
+ SH040805 BAL0483 -1. BAL0405 1.
+ SH040106 COST 200.99 TRAN0401 1.
+ SH040106 BAL0401 -1. BAL0406 1.
+ SH040206 COST 421.17 TRAN0402 1.
+ SH040206 BAL0402 -1. BAL0406 1.
+ SH040306 COST 215.13 TRAN0403 1.
+ SH040306 BAL0403 -1. BAL0406 1.
+ SH040406 COST 221.19 TRAN0404 1.
+ SH040406 BAL0404 -1. BAL0406 1.
+ SH040506 COST 254.52 TRAN0405 1.
+ SH040506 BAL0405 -1. BAL0406 1.
+ SH040606 COST 208.06 TRAN0406 1.
+ SH040606 BAL0452 -1. BAL0406 1.
+ SH040706 COST 202. TRAN0407 1.
+ SH040706 BAL0464 -1. BAL0406 1.
+ SH040806 COST 152.51 TRAN0408 1.
+ SH040806 BAL0483 -1. BAL0406 1.
+ SH040107 COST 21.21 TRAN0401 1.
+ SH040107 BAL0401 -1. BAL0407 1.
+ SH040207 COST 294.92 TRAN0402 1.
+ SH040207 BAL0402 -1. BAL0407 1.
+ SH040307 COST 125.24 TRAN0403 1.
+ SH040307 BAL0403 -1. BAL0407 1.
+ SH040407 COST 209.07 TRAN0404 1.
+ SH040407 BAL0404 -1. BAL0407 1.
+ SH040507 COST 231.29 TRAN0405 1.
+ SH040507 BAL0405 -1. BAL0407 1.
+ SH040607 COST 126.25 TRAN0406 1.
+ SH040607 BAL0452 -1. BAL0407 1.
+ SH040707 COST 234.32 TRAN0407 1.
+ SH040707 BAL0464 -1. BAL0407 1.
+ SH040807 COST 156.55 TRAN0408 1.
+ SH040807 BAL0483 -1. BAL0407 1.
+ SH040108 COST 66.66 TRAN0401 1.
+ SH040108 BAL0401 -1. BAL0408 1.
+ SH040208 COST 379.76 TRAN0402 1.
+ SH040208 BAL0402 -1. BAL0408 1.
+ SH040308 COST 142.41 TRAN0403 1.
+ SH040308 BAL0403 -1. BAL0408 1.
+ SH040408 COST 249.47 TRAN0404 1.
+ SH040408 BAL0404 -1. BAL0408 1.
+ SH040508 COST 183.82 TRAN0405 1.
+ SH040508 BAL0405 -1. BAL0408 1.
+ SH040608 COST 167.66 TRAN0406 1.
+ SH040608 BAL0452 -1. BAL0408 1.
+ SH040808 COST 188.87 TRAN0408 1.
+ SH040808 BAL0483 -1. BAL0408 1.
+ SH040109 COST 139.38 TRAN0401 1.
+ SH040109 BAL0401 -1. BAL0409 1.
+ SH040209 COST 386.83 TRAN0402 1.
+ SH040209 BAL0402 -1. BAL0409 1.
+ SH040309 COST 169.68 TRAN0403 1.
+ SH040309 BAL0403 -1. BAL0409 1.
+ SH040409 COST 255.53 TRAN0404 1.
+ SH040409 BAL0404 -1. BAL0409 1.
+ SH040509 COST 241.39 TRAN0405 1.
+ SH040509 BAL0405 -1. BAL0409 1.
+ SH040709 COST 197.96 TRAN0407 1.
+ SH040709 BAL0464 -1. BAL0409 1.
+ SH040809 COST 195.94 TRAN0408 1.
+ SH040809 BAL0483 -1. BAL0409 1.
+ SH040110 COST 249.47 TRAN0401 1.
+ SH040110 BAL0401 -1. BAL0410 1.
+ SH040210 COST 159.58 TRAN0402 1.
+ SH040210 BAL0402 -1. BAL0410 1.
+ SH040310 COST 242.4 TRAN0403 1.
+ SH040310 BAL0403 -1. BAL0410 1.
+ SH040410 COST 362.59 TRAN0404 1.
+ SH040410 BAL0404 -1. BAL0410 1.
+ SH040510 COST 388.85 TRAN0405 1.
+ SH040510 BAL0405 -1. BAL0410 1.
+ SH040610 COST 227.25 TRAN0406 1.
+ SH040610 BAL0452 -1. BAL0410 1.
+ SH040810 COST 308.05 TRAN0408 1.
+ SH040810 BAL0483 -1. BAL0410 1.
+ SH040111 COST 107.06 TRAN0401 1.
+ SH040111 BAL0401 -1. BAL0411 1.
+ SH040211 COST 499.95 TRAN0402 1.
+ SH040211 BAL0402 -1. BAL0411 1.
+ SH040311 COST 250.48 TRAN0403 1.
+ SH040311 BAL0403 -1. BAL0411 1.
+ SH040411 COST 140.39 TRAN0404 1.
+ SH040411 BAL0404 -1. BAL0411 1.
+ SH040511 COST 344.41 TRAN0405 1.
+ SH040511 BAL0405 -1. BAL0411 1.
+ SH040611 COST 197.96 TRAN0406 1.
+ SH040611 BAL0452 -1. BAL0411 1.
+ SH040811 COST 103.02 TRAN0408 1.
+ SH040811 BAL0483 -1. BAL0411 1.
+ SH040112 COST 88.88 TRAN0401 1.
+ SH040112 BAL0401 -1. BAL0412 1.
+ SH040212 COST 342.39 TRAN0402 1.
+ SH040212 BAL0402 -1. BAL0412 1.
+ SH040312 COST 147.46 TRAN0403 1.
+ SH040312 BAL0403 -1. BAL0412 1.
+ SH040412 COST 202. TRAN0404 1.
+ SH040412 BAL0404 -1. BAL0412 1.
+ SH040512 COST 269.67 TRAN0405 1.
+ SH040512 BAL0405 -1. BAL0412 1.
+ SH040612 COST 146.45 TRAN0406 1.
+ SH040612 BAL0452 -1. BAL0412 1.
+ SH040812 COST 147.46 TRAN0408 1.
+ SH040812 BAL0483 -1. BAL0412 1.
+ SH040114 COST 143.42 TRAN0401 1.
+ SH040114 BAL0401 -1. BAL0414 1.
+ SH040214 COST 416.12 TRAN0402 1.
+ SH040214 BAL0402 -1. BAL0414 1.
+ SH040314 COST 197.96 TRAN0403 1.
+ SH040314 BAL0403 -1. BAL0414 1.
+ SH040414 COST 200.99 TRAN0404 1.
+ SH040414 BAL0404 -1. BAL0414 1.
+ SH040514 COST 355.52 TRAN0405 1.
+ SH040514 BAL0405 -1. BAL0414 1.
+ SH040614 COST 189.88 TRAN0406 1.
+ SH040614 BAL0452 -1. BAL0414 1.
+ SH040814 COST 127.26 TRAN0408 1.
+ SH040814 BAL0483 -1. BAL0414 1.
+ SH040115 COST 306.03 TRAN0401 1.
+ SH040115 BAL0401 -1. BAL0415 1.
+ SH040215 COST 160.59 TRAN0402 1.
+ SH040215 BAL0402 -1. BAL0415 1.
+ SH040315 COST 236.34 TRAN0403 1.
+ SH040315 BAL0403 -1. BAL0415 1.
+ SH040415 COST 480.76 TRAN0404 1.
+ SH040415 BAL0404 -1. BAL0415 1.
+ SH040515 COST 401.98 TRAN0405 1.
+ SH040515 BAL0405 -1. BAL0415 1.
+ SH040615 COST 189.88 TRAN0406 1.
+ SH040615 BAL0452 -1. BAL0415 1.
+ SH040815 COST 376.73 TRAN0408 1.
+ SH040815 BAL0483 -1. BAL0415 1.
+ SH040116 COST 159.58 TRAN0401 1.
+ SH040116 BAL0401 -1. BAL0416 1.
+ SH040216 COST 282.8 TRAN0402 1.
+ SH040216 BAL0402 -1. BAL0416 1.
+ SH040316 COST 229.27 TRAN0403 1.
+ SH040316 BAL0403 -1. BAL0416 1.
+ SH040416 COST 289.87 TRAN0404 1.
+ SH040416 BAL0404 -1. BAL0416 1.
+ SH040516 COST 322.19 TRAN0405 1.
+ SH040516 BAL0405 -1. BAL0416 1.
+ SH040616 COST 132.31 TRAN0406 1.
+ SH040616 BAL0452 -1. BAL0416 1.
+ SH040816 COST 207.05 TRAN0408 1.
+ SH040816 BAL0483 -1. BAL0416 1.
+ SH040117 COST 152.51 TRAN0401 1.
+ SH040117 BAL0401 -1. BAL0417 1.
+ SH040217 COST 510.05 TRAN0402 1.
+ SH040217 BAL0402 -1. BAL0417 1.
+ SH040317 COST 276.74 TRAN0403 1.
+ SH040317 BAL0403 -1. BAL0417 1.
+ SH040417 COST 57.57 TRAN0404 1.
+ SH040417 BAL0404 -1. BAL0417 1.
+ SH040517 COST 300.98 TRAN0405 1.
+ SH040517 BAL0405 -1. BAL0417 1.
+ SH040717 COST 297.95 TRAN0407 1.
+ SH040717 BAL0464 -1. BAL0417 1.
+ SH040817 COST 27.27 TRAN0408 1.
+ SH040817 BAL0483 -1. BAL0417 1.
+ SH040118 COST 176.75 TRAN0401 1.
+ SH040118 BAL0401 -1. BAL0418 1.
+ SH040218 COST 364.61 TRAN0402 1.
+ SH040218 BAL0402 -1. BAL0418 1.
+ SH040318 COST 272.7 TRAN0403 1.
+ SH040318 BAL0403 -1. BAL0418 1.
+ SH040418 COST 155.54 TRAN0404 1.
+ SH040418 BAL0404 -1. BAL0418 1.
+ SH040518 COST 411.07 TRAN0405 1.
+ SH040518 BAL0405 -1. BAL0418 1.
+ SH040618 COST 355.52 TRAN0406 1.
+ SH040618 BAL0452 -1. BAL0418 1.
+ SH040818 COST 104.03 TRAN0408 1.
+ SH040818 BAL0483 -1. BAL0418 1.
+ SH040119 COST 250.48 TRAN0401 1.
+ SH040119 BAL0401 -1. BAL0419 1.
+ SH040219 COST 693.87 TRAN0402 1.
+ SH040219 BAL0402 -1. BAL0419 1.
+ SH040319 COST 320.17 TRAN0403 1.
+ SH040319 BAL0403 -1. BAL0419 1.
+ SH040419 COST 160.59 TRAN0404 1.
+ SH040419 BAL0404 -1. BAL0419 1.
+ SH040519 COST 210.08 TRAN0405 1.
+ SH040519 BAL0405 -1. BAL0419 1.
+ SH040619 COST 348.45 TRAN0406 1.
+ SH040619 BAL0452 -1. BAL0419 1.
+ SH040819 COST 99.99 TRAN0408 1.
+ SH040819 BAL0483 -1. BAL0419 1.
+ SH040120 COST 207.05 TRAN0401 1.
+ SH040120 BAL0401 -1. BAL0420 1.
+ SH040220 COST 689.83 TRAN0402 1.
+ SH040220 BAL0402 -1. BAL0420 1.
+ SH040320 COST 299.97 TRAN0403 1.
+ SH040320 BAL0403 -1. BAL0420 1.
+ SH040420 COST 114.13 TRAN0404 1.
+ SH040420 BAL0404 -1. BAL0420 1.
+ SH040520 COST 293.91 TRAN0405 1.
+ SH040520 BAL0405 -1. BAL0420 1.
+ SH040820 COST 127.26 TRAN0408 1.
+ SH040820 BAL0483 -1. BAL0420 1.
+ SH040121 COST 407.03 TRAN0401 1.
+ SH040121 BAL0401 -1. BAL0421 1.
+ SH040221 COST 371.68 TRAN0402 1.
+ SH040221 BAL0402 -1. BAL0421 1.
+ SH040321 COST 450.46 TRAN0403 1.
+ SH040321 BAL0403 -1. BAL0421 1.
+ SH040421 COST 323.2 TRAN0404 1.
+ SH040421 BAL0404 -1. BAL0421 1.
+ SH040521 COST 555.5 TRAN0405 1.
+ SH040521 BAL0405 -1. BAL0421 1.
+ SH040821 COST 323.2 TRAN0408 1.
+ SH040821 BAL0483 -1. BAL0421 1.
+ SH040122 COST 250.48 TRAN0401 1.
+ SH040122 BAL0401 -1. BAL0422 1.
+ SH040222 COST 583.78 TRAN0402 1.
+ SH040222 BAL0402 -1. BAL0422 1.
+ SH040322 COST 301.99 TRAN0403 1.
+ SH040322 BAL0403 -1. BAL0422 1.
+ SH040422 COST 226.24 TRAN0404 1.
+ SH040422 BAL0404 -1. BAL0422 1.
+ SH040522 COST 180.79 TRAN0405 1.
+ SH040522 BAL0405 -1. BAL0422 1.
+ SH040622 COST 313.1 TRAN0406 1.
+ SH040622 BAL0452 -1. BAL0422 1.
+ SH040822 COST 140.39 TRAN0408 1.
+ SH040822 BAL0483 -1. BAL0422 1.
+ SH040123 COST 236.34 TRAN0401 1.
+ SH040123 BAL0401 -1. BAL0423 1.
+ SH040223 COST 546.41 TRAN0402 1.
+ SH040223 BAL0402 -1. BAL0423 1.
+ SH040323 COST 289.87 TRAN0403 1.
+ SH040323 BAL0403 -1. BAL0423 1.
+ SH040423 COST 168.67 TRAN0404 1.
+ SH040423 BAL0404 -1. BAL0423 1.
+ SH040523 COST 167.66 TRAN0405 1.
+ SH040523 BAL0405 -1. BAL0423 1.
+ SH040823 COST 140.39 TRAN0408 1.
+ SH040823 BAL0483 -1. BAL0423 1.
+ SH040124 COST 1450.36 TRAN0401 1.
+ SH040124 BAL0401 -1. BAL0424 1.
+ SH040125 COST 390.87 TRAN0401 1.
+ SH040125 BAL0401 -1. BAL0425 1.
+ SH040225 COST 431.27 TRAN0402 1.
+ SH040225 BAL0402 -1. BAL0425 1.
+ SH040325 COST 516.11 TRAN0403 1.
+ SH040325 BAL0403 -1. BAL0425 1.
+ SH040425 COST 351.48 TRAN0404 1.
+ SH040425 BAL0404 -1. BAL0425 1.
+ SH040525 COST 571.66 TRAN0405 1.
+ SH040525 BAL0405 -1. BAL0425 1.
+ SH040625 COST 407.03 TRAN0406 1.
+ SH040625 BAL0452 -1. BAL0425 1.
+ SH040825 COST 308.05 TRAN0408 1.
+ SH040825 BAL0483 -1. BAL0425 1.
+ SH040426 COST 272.7 TRAN0404 1.
+ SH040426 BAL0404 -1. BAL0426 1.
+ SH040127 COST 236.34 TRAN0401 1.
+ SH040127 BAL0401 -1. BAL0427 1.
+ SH040227 COST 286.84 TRAN0402 1.
+ SH040227 BAL0402 -1. BAL0427 1.
+ SH040327 COST 291.89 TRAN0403 1.
+ SH040327 BAL0403 -1. BAL0427 1.
+ SH040427 COST 338.35 TRAN0404 1.
+ SH040427 BAL0404 -1. BAL0427 1.
+ SH040527 COST 381.78 TRAN0405 1.
+ SH040527 BAL0405 -1. BAL0427 1.
+ SH040627 COST 270.68 TRAN0406 1.
+ SH040627 BAL0452 -1. BAL0427 1.
+ SH040827 COST 254.52 TRAN0408 1.
+ SH040827 BAL0483 -1. BAL0427 1.
+ SH040128 COST 245.43 TRAN0401 1.
+ SH040128 BAL0401 -1. BAL0428 1.
+ SH040228 COST 574.69 TRAN0402 1.
+ SH040228 BAL0402 -1. BAL0428 1.
+ SH040328 COST 298.96 TRAN0403 1.
+ SH040328 BAL0403 -1. BAL0428 1.
+ SH040428 COST 297.95 TRAN0404 1.
+ SH040428 BAL0404 -1. BAL0428 1.
+ SH040528 COST 103.02 TRAN0405 1.
+ SH040528 BAL0405 -1. BAL0428 1.
+ SH040628 COST 263.61 TRAN0406 1.
+ SH040628 BAL0452 -1. BAL0428 1.
+ SH040728 COST 108.07 TRAN0407 1.
+ SH040728 BAL0464 -1. BAL0428 1.
+ SH040828 COST 256.54 TRAN0408 1.
+ SH040828 BAL0483 -1. BAL0428 1.
+ SH040129 COST 225.23 TRAN0401 1.
+ SH040129 BAL0401 -1. BAL0429 1.
+ SH040229 COST 468.64 TRAN0402 1.
+ SH040229 BAL0402 -1. BAL0429 1.
+ SH040329 COST 243.41 TRAN0403 1.
+ SH040329 BAL0403 -1. BAL0429 1.
+ SH040429 COST 200.99 TRAN0404 1.
+ SH040429 BAL0404 -1. BAL0429 1.
+ SH040529 COST 434.3 TRAN0405 1.
+ SH040529 BAL0405 -1. BAL0429 1.
+ SH040629 COST 263.61 TRAN0406 1.
+ SH040629 BAL0452 -1. BAL0429 1.
+ SH040829 COST 145.44 TRAN0408 1.
+ SH040829 BAL0483 -1. BAL0429 1.
+ SH040130 COST 470.66 TRAN0401 1.
+ SH040130 BAL0401 -1. BAL0430 1.
+ SH040230 COST 440.36 TRAN0402 1.
+ SH040230 BAL0402 -1. BAL0430 1.
+ SH040330 COST 528.23 TRAN0403 1.
+ SH040330 BAL0403 -1. BAL0430 1.
+ SH040430 COST 307.04 TRAN0404 1.
+ SH040430 BAL0404 -1. BAL0430 1.
+ SH040530 COST 450.46 TRAN0405 1.
+ SH040530 BAL0405 -1. BAL0430 1.
+ SH040830 COST 385.82 TRAN0408 1.
+ SH040830 BAL0483 -1. BAL0430 1.
+ SH040131 COST 112.11 TRAN0401 1.
+ SH040131 BAL0401 -1. BAL0431 1.
+ SH040231 COST 354.51 TRAN0402 1.
+ SH040231 BAL0402 -1. BAL0431 1.
+ SH040331 COST 111.1 TRAN0403 1.
+ SH040331 BAL0403 -1. BAL0431 1.
+ SH040431 COST 255.53 TRAN0404 1.
+ SH040431 BAL0404 -1. BAL0431 1.
+ SH040531 COST 310.07 TRAN0405 1.
+ SH040531 BAL0405 -1. BAL0431 1.
+ SH040631 COST 113.12 TRAN0406 1.
+ SH040631 BAL0452 -1. BAL0431 1.
+ SH040831 COST 225.23 TRAN0408 1.
+ SH040831 BAL0483 -1. BAL0431 1.
+ SH040132 COST 301.99 TRAN0401 1.
+ SH040132 BAL0401 -1. BAL0432 1.
+ SH040232 COST 482.78 TRAN0402 1.
+ SH040232 BAL0402 -1. BAL0432 1.
+ SH040332 COST 427.23 TRAN0403 1.
+ SH040332 BAL0403 -1. BAL0432 1.
+ SH040432 COST 158.57 TRAN0404 1.
+ SH040432 BAL0404 -1. BAL0432 1.
+ SH040532 COST 395.92 TRAN0405 1.
+ SH040532 BAL0405 -1. BAL0432 1.
+ SH040832 COST 181.8 TRAN0408 1.
+ SH040832 BAL0483 -1. BAL0432 1.
+ SH040133 COST 497.93 TRAN0401 1.
+ SH040133 BAL0401 -1. BAL0433 1.
+ SH040233 COST 404. TRAN0402 1.
+ SH040233 BAL0402 -1. BAL0433 1.
+ SH040333 COST 548.43 TRAN0403 1.
+ SH040333 BAL0403 -1. BAL0433 1.
+ SH040433 COST 449.45 TRAN0404 1.
+ SH040433 BAL0404 -1. BAL0433 1.
+ SH040533 COST 637.31 TRAN0405 1.
+ SH040533 BAL0405 -1. BAL0433 1.
+ SH040833 COST 384.81 TRAN0408 1.
+ SH040833 BAL0483 -1. BAL0433 1.
+ SH040134 COST 389.86 TRAN0401 1.
+ SH040134 BAL0401 -1. BAL0434 1.
+ SH040234 COST 661.55 TRAN0402 1.
+ SH040234 BAL0402 -1. BAL0434 1.
+ SH040334 COST 508.03 TRAN0403 1.
+ SH040334 BAL0403 -1. BAL0434 1.
+ SH040434 COST 213.11 TRAN0404 1.
+ SH040434 BAL0404 -1. BAL0434 1.
+ SH040534 COST 445.41 TRAN0405 1.
+ SH040534 BAL0405 -1. BAL0434 1.
+ SH040834 COST 265.63 TRAN0408 1.
+ SH040834 BAL0483 -1. BAL0434 1.
+ SH040135 COST 465.61 TRAN0401 1.
+ SH040135 BAL0401 -1. BAL0435 1.
+ SH040235 COST 449.45 TRAN0402 1.
+ SH040235 BAL0402 -1. BAL0435 1.
+ SH040335 COST 380.77 TRAN0403 1.
+ SH040335 BAL0403 -1. BAL0435 1.
+ SH040435 COST 123.22 TRAN0404 1.
+ SH040435 BAL0404 -1. BAL0435 1.
+ SH040535 COST 435.31 TRAN0405 1.
+ SH040535 BAL0405 -1. BAL0435 1.
+ SH040835 COST 237.35 TRAN0408 1.
+ SH040835 BAL0483 -1. BAL0435 1.
+ SH040136 COST 207.05 TRAN0401 1.
+ SH040136 BAL0401 -1. BAL0436 1.
+ SH040236 COST 452.48 TRAN0402 1.
+ SH040236 BAL0402 -1. BAL0436 1.
+ SH040336 COST 107.06 TRAN0403 1.
+ SH040336 BAL0403 -1. BAL0436 1.
+ SH040436 COST 373.7 TRAN0404 1.
+ SH040436 BAL0404 -1. BAL0436 1.
+ SH040536 COST 349.46 TRAN0405 1.
+ SH040536 BAL0405 -1. BAL0436 1.
+ SH040636 COST 111.1 TRAN0406 1.
+ SH040636 BAL0452 -1. BAL0436 1.
+ SH040836 COST 324.21 TRAN0408 1.
+ SH040836 BAL0483 -1. BAL0436 1.
+ SH040137 COST 92.92 TRAN0401 1.
+ SH040137 BAL0401 -1. BAL0437 1.
+ SH040237 COST 345.42 TRAN0402 1.
+ SH040237 BAL0402 -1. BAL0437 1.
+ SH040337 COST 159.58 TRAN0403 1.
+ SH040337 BAL0403 -1. BAL0437 1.
+ SH040437 COST 307.04 TRAN0404 1.
+ SH040437 BAL0404 -1. BAL0437 1.
+ SH040537 COST 183.82 TRAN0405 1.
+ SH040537 BAL0405 -1. BAL0437 1.
+ SH040637 COST 195.94 TRAN0406 1.
+ SH040637 BAL0452 -1. BAL0437 1.
+ SH040837 COST 254.52 TRAN0408 1.
+ SH040837 BAL0483 -1. BAL0437 1.
+ SH040138 COST 137.36 TRAN0401 1.
+ SH040138 BAL0401 -1. BAL0438 1.
+ SH040238 COST 246.44 TRAN0402 1.
+ SH040238 BAL0402 -1. BAL0438 1.
+ SH040338 COST 95.95 TRAN0403 1.
+ SH040338 BAL0403 -1. BAL0438 1.
+ SH040438 COST 311.08 TRAN0404 1.
+ SH040438 BAL0404 -1. BAL0438 1.
+ SH040538 COST 280.78 TRAN0405 1.
+ SH040538 BAL0405 -1. BAL0438 1.
+ SH040638 COST 39.39 TRAN0406 1.
+ SH040638 BAL0452 -1. BAL0438 1.
+ SH040738 COST 218.16 TRAN0407 1.
+ SH040738 BAL0464 -1. BAL0438 1.
+ SH040838 COST 239.37 TRAN0408 1.
+ SH040838 BAL0483 -1. BAL0438 1.
+ SH040139 COST 131.3 TRAN0401 1.
+ SH040139 BAL0401 -1. BAL0439 1.
+ SH040239 COST 342.39 TRAN0402 1.
+ SH040239 BAL0402 -1. BAL0439 1.
+ SH040339 COST 161.6 TRAN0403 1.
+ SH040339 BAL0403 -1. BAL0439 1.
+ SH040439 COST 251.49 TRAN0404 1.
+ SH040439 BAL0404 -1. BAL0439 1.
+ SH040539 COST 433.29 TRAN0405 1.
+ SH040539 BAL0405 -1. BAL0439 1.
+ SH040639 COST 206.04 TRAN0406 1.
+ SH040639 BAL0452 -1. BAL0439 1.
+ SH040839 COST 169.68 TRAN0408 1.
+ SH040839 BAL0483 -1. BAL0439 1.
+ SH040140 COST 166.65 TRAN0401 1.
+ SH040140 BAL0401 -1. BAL0440 1.
+ SH040240 COST 381.78 TRAN0402 1.
+ SH040240 BAL0402 -1. BAL0440 1.
+ SH040340 COST 104.03 TRAN0403 1.
+ SH040340 BAL0403 -1. BAL0440 1.
+ SH040440 COST 299.97 TRAN0404 1.
+ SH040440 BAL0404 -1. BAL0440 1.
+ SH040540 COST 223.21 TRAN0405 1.
+ SH040540 BAL0405 -1. BAL0440 1.
+ SH040640 COST 132.31 TRAN0406 1.
+ SH040640 BAL0452 -1. BAL0440 1.
+ SH040840 COST 276.74 TRAN0408 1.
+ SH040840 BAL0483 -1. BAL0440 1.
+ SH040141 COST 197.96 TRAN0401 1.
+ SH040141 BAL0401 -1. BAL0441 1.
+ SH040241 COST 303. TRAN0402 1.
+ SH040241 BAL0402 -1. BAL0441 1.
+ SH040341 COST 151.5 TRAN0403 1.
+ SH040341 BAL0403 -1. BAL0441 1.
+ SH040441 COST 327.24 TRAN0404 1.
+ SH040441 BAL0404 -1. BAL0441 1.
+ SH040541 COST 371.68 TRAN0405 1.
+ SH040541 BAL0405 -1. BAL0441 1.
+ SH040641 COST 101. TRAN0406 1.
+ SH040641 BAL0452 -1. BAL0441 1.
+ SH040841 COST 301.99 TRAN0408 1.
+ SH040841 BAL0483 -1. BAL0441 1.
+ SH040142 COST 90.9 TRAN0401 1.
+ SH040142 BAL0401 -1. BAL0442 1.
+ SH040242 COST 418.14 TRAN0402 1.
+ SH040242 BAL0402 -1. BAL0442 1.
+ SH040342 COST 161.6 TRAN0403 1.
+ SH040342 BAL0403 -1. BAL0442 1.
+ SH040442 COST 196.95 TRAN0404 1.
+ SH040442 BAL0404 -1. BAL0442 1.
+ SH040542 COST 364.61 TRAN0405 1.
+ SH040542 BAL0405 -1. BAL0442 1.
+ SH040642 COST 162.61 TRAN0406 1.
+ SH040642 BAL0452 -1. BAL0442 1.
+ SH040842 COST 153.52 TRAN0408 1.
+ SH040842 BAL0483 -1. BAL0442 1.
+ SH040143 COST 160.59 TRAN0401 1.
+ SH040143 BAL0401 -1. BAL0443 1.
+ SH040243 COST 398.95 TRAN0402 1.
+ SH040243 BAL0402 -1. BAL0443 1.
+ SH040343 COST 25.25 TRAN0403 1.
+ SH040343 BAL0403 -1. BAL0443 1.
+ SH040443 COST 298.96 TRAN0404 1.
+ SH040443 BAL0404 -1. BAL0443 1.
+ SH040543 COST 260.58 TRAN0405 1.
+ SH040543 BAL0405 -1. BAL0443 1.
+ SH040643 COST 101. TRAN0406 1.
+ SH040643 BAL0452 -1. BAL0443 1.
+ SH040743 COST 243.41 TRAN0407 1.
+ SH040743 BAL0464 -1. BAL0443 1.
+ SH040843 COST 273.71 TRAN0408 1.
+ SH040843 BAL0483 -1. BAL0443 1.
+ SH040144 COST 160.59 TRAN0401 1.
+ SH040144 BAL0401 -1. BAL0444 1.
+ SH040244 COST 382.79 TRAN0402 1.
+ SH040244 BAL0402 -1. BAL0444 1.
+ SH040344 COST 129.28 TRAN0403 1.
+ SH040344 BAL0403 -1. BAL0444 1.
+ SH040444 COST 315.12 TRAN0404 1.
+ SH040444 BAL0404 -1. BAL0444 1.
+ SH040544 COST 313.1 TRAN0405 1.
+ SH040544 BAL0405 -1. BAL0444 1.
+ SH040644 COST 89.89 TRAN0406 1.
+ SH040644 BAL0452 -1. BAL0444 1.
+ SH040844 COST 300.98 TRAN0408 1.
+ SH040844 BAL0483 -1. BAL0444 1.
+ SH040145 COST 173.72 TRAN0401 1.
+ SH040145 BAL0401 -1. BAL0445 1.
+ SH040245 COST 440.36 TRAN0402 1.
+ SH040245 BAL0402 -1. BAL0445 1.
+ SH040345 COST 162.61 TRAN0403 1.
+ SH040345 BAL0403 -1. BAL0445 1.
+ SH040445 COST 294.92 TRAN0404 1.
+ SH040445 BAL0404 -1. BAL0445 1.
+ SH040545 COST 236.34 TRAN0405 1.
+ SH040545 BAL0405 -1. BAL0445 1.
+ SH040645 COST 192.91 TRAN0406 1.
+ SH040645 BAL0452 -1. BAL0445 1.
+ SH040745 COST 198.97 TRAN0407 1.
+ SH040745 BAL0464 -1. BAL0445 1.
+ SH040845 COST 308.05 TRAN0408 1.
+ SH040845 BAL0483 -1. BAL0445 1.
+ SH040146 COST 247.45 TRAN0401 1.
+ SH040146 BAL0401 -1. BAL0446 1.
+ SH040246 COST 275.73 TRAN0402 1.
+ SH040246 BAL0402 -1. BAL0446 1.
+ SH040346 COST 223.21 TRAN0403 1.
+ SH040346 BAL0403 -1. BAL0446 1.
+ SH040446 COST 451.47 TRAN0404 1.
+ SH040446 BAL0404 -1. BAL0446 1.
+ SH040546 COST 434.3 TRAN0405 1.
+ SH040546 BAL0405 -1. BAL0446 1.
+ SH040646 COST 259.57 TRAN0406 1.
+ SH040646 BAL0452 -1. BAL0446 1.
+ SH040846 COST 452.48 TRAN0408 1.
+ SH040846 BAL0483 -1. BAL0446 1.
+ SH040147 COST 111.1 TRAN0401 1.
+ SH040147 BAL0401 -1. BAL0447 1.
+ SH040247 COST 376.73 TRAN0402 1.
+ SH040247 BAL0402 -1. BAL0447 1.
+ SH040347 COST 160.59 TRAN0403 1.
+ SH040347 BAL0403 -1. BAL0447 1.
+ SH040447 COST 276.74 TRAN0404 1.
+ SH040447 BAL0404 -1. BAL0447 1.
+ SH040547 COST 235.33 TRAN0405 1.
+ SH040547 BAL0405 -1. BAL0447 1.
+ SH040647 COST 146.45 TRAN0406 1.
+ SH040647 BAL0452 -1. BAL0447 1.
+ SH040847 COST 246.44 TRAN0408 1.
+ SH040847 BAL0483 -1. BAL0447 1.
+ SH040148 COST 95.95 TRAN0401 1.
+ SH040148 BAL0401 -1. BAL0448 1.
+ SH040248 COST 342.39 TRAN0402 1.
+ SH040248 BAL0402 -1. BAL0448 1.
+ SH040348 COST 138.37 TRAN0403 1.
+ SH040348 BAL0403 -1. BAL0448 1.
+ SH040448 COST 232.3 TRAN0404 1.
+ SH040448 BAL0404 -1. BAL0448 1.
+ SH040548 COST 249.47 TRAN0405 1.
+ SH040548 BAL0405 -1. BAL0448 1.
+ SH040648 COST 116.15 TRAN0406 1.
+ SH040648 BAL0452 -1. BAL0448 1.
+ SH040848 COST 196.95 TRAN0408 1.
+ SH040848 BAL0483 -1. BAL0448 1.
+ SH040149 COST 332.29 TRAN0401 1.
+ SH040149 BAL0401 -1. BAL0449 1.
+ SH040249 COST 540.35 TRAN0402 1.
+ SH040249 BAL0402 -1. BAL0449 1.
+ SH040349 COST 335.32 TRAN0403 1.
+ SH040349 BAL0403 -1. BAL0449 1.
+ SH040449 COST 384.81 TRAN0404 1.
+ SH040449 BAL0404 -1. BAL0449 1.
+ SH040549 COST 153.52 TRAN0405 1.
+ SH040549 BAL0405 -1. BAL0449 1.
+ SH040649 COST 341.38 TRAN0406 1.
+ SH040649 BAL0452 -1. BAL0449 1.
+ SH040749 COST 135.34 TRAN0407 1.
+ SH040749 BAL0464 -1. BAL0449 1.
+ SH040849 COST 412.08 TRAN0408 1.
+ SH040849 BAL0483 -1. BAL0449 1.
+ SH040150 COST 243.41 TRAN0401 1.
+ SH040150 BAL0401 -1. BAL0450 1.
+ SH040250 COST 618.12 TRAN0402 1.
+ SH040250 BAL0402 -1. BAL0450 1.
+ SH040350 COST 248.46 TRAN0403 1.
+ SH040350 BAL0403 -1. BAL0450 1.
+ SH040450 COST 368.65 TRAN0404 1.
+ SH040450 BAL0404 -1. BAL0450 1.
+ SH040550 COST 237.35 TRAN0405 1.
+ SH040550 BAL0405 -1. BAL0450 1.
+ SH040750 COST 138.37 TRAN0407 1.
+ SH040750 BAL0464 -1. BAL0450 1.
+ SH040850 COST 410.06 TRAN0408 1.
+ SH040850 BAL0483 -1. BAL0450 1.
+ SH040151 COST 335.32 TRAN0401 1.
+ SH040151 BAL0401 -1. BAL0451 1.
+ SH040251 COST 555.5 TRAN0402 1.
+ SH040251 BAL0402 -1. BAL0451 1.
+ SH040351 COST 344.41 TRAN0403 1.
+ SH040351 BAL0403 -1. BAL0451 1.
+ SH040451 COST 341.38 TRAN0404 1.
+ SH040451 BAL0404 -1. BAL0451 1.
+ SH040551 COST 124.23 TRAN0405 1.
+ SH040551 BAL0405 -1. BAL0451 1.
+ SH040751 COST 99.99 TRAN0407 1.
+ SH040751 BAL0464 -1. BAL0451 1.
+ SH040851 COST 432.28 TRAN0408 1.
+ SH040851 BAL0483 -1. BAL0451 1.
+ SH040152 COST 113.12 TRAN0401 1.
+ SH040152 BAL0401 -1. BAL0452 1.
+ SH040252 COST 303. TRAN0402 1.
+ SH040252 BAL0402 -1. BAL0452 1.
+ SH040352 COST 82.82 TRAN0403 1.
+ SH040352 BAL0403 -1. BAL0452 1.
+ SH040452 COST 325.22 TRAN0404 1.
+ SH040452 BAL0404 -1. BAL0452 1.
+ SH040552 COST 297.95 TRAN0405 1.
+ SH040552 BAL0405 -1. BAL0452 1.
+ SH040852 COST 255.53 TRAN0408 1.
+ SH040852 BAL0483 -1. BAL0452 1.
+ SH040153 COST 362.59 TRAN0401 1.
+ SH040153 BAL0401 -1. BAL0453 1.
+ SH040253 COST 642.36 TRAN0402 1.
+ SH040253 BAL0402 -1. BAL0453 1.
+ SH040353 COST 328.25 TRAN0403 1.
+ SH040353 BAL0403 -1. BAL0453 1.
+ SH040453 COST 416.12 TRAN0404 1.
+ SH040453 BAL0404 -1. BAL0453 1.
+ SH040553 COST 185.84 TRAN0405 1.
+ SH040553 BAL0405 -1. BAL0453 1.
+ SH040653 COST 362.59 TRAN0406 1.
+ SH040653 BAL0452 -1. BAL0453 1.
+ SH040753 COST 147.46 TRAN0407 1.
+ SH040753 BAL0464 -1. BAL0453 1.
+ SH040853 COST 407.03 TRAN0408 1.
+ SH040853 BAL0483 -1. BAL0453 1.
+ SH040154 COST 186.85 TRAN0401 1.
+ SH040154 BAL0401 -1. BAL0454 1.
+ SH040254 COST 449.45 TRAN0402 1.
+ SH040254 BAL0402 -1. BAL0454 1.
+ SH040354 COST 219.17 TRAN0403 1.
+ SH040354 BAL0403 -1. BAL0454 1.
+ SH040454 COST 346.43 TRAN0404 1.
+ SH040454 BAL0404 -1. BAL0454 1.
+ SH040554 COST 215.13 TRAN0405 1.
+ SH040554 BAL0405 -1. BAL0454 1.
+ SH040654 COST 205.03 TRAN0406 1.
+ SH040654 BAL0452 -1. BAL0454 1.
+ SH040854 COST 406.02 TRAN0408 1.
+ SH040854 BAL0483 -1. BAL0454 1.
+ SH040155 COST 280.78 TRAN0401 1.
+ SH040155 BAL0401 -1. BAL0455 1.
+ SH040255 COST 483.79 TRAN0402 1.
+ SH040255 BAL0402 -1. BAL0455 1.
+ SH040355 COST 283.81 TRAN0403 1.
+ SH040355 BAL0403 -1. BAL0455 1.
+ SH040455 COST 296.94 TRAN0404 1.
+ SH040455 BAL0404 -1. BAL0455 1.
+ SH040555 COST 155.54 TRAN0405 1.
+ SH040555 BAL0405 -1. BAL0455 1.
+ SH040655 COST 292.9 TRAN0406 1.
+ SH040655 BAL0452 -1. BAL0455 1.
+ SH040755 COST 108.07 TRAN0407 1.
+ SH040755 BAL0464 -1. BAL0455 1.
+ SH040855 COST 296.94 TRAN0408 1.
+ SH040855 BAL0483 -1. BAL0455 1.
+ SH040156 COST 393.9 TRAN0401 1.
+ SH040156 BAL0401 -1. BAL0456 1.
+ SH040256 COST 584.79 TRAN0402 1.
+ SH040256 BAL0402 -1. BAL0456 1.
+ SH040356 COST 308.05 TRAN0403 1.
+ SH040356 BAL0403 -1. BAL0456 1.
+ SH040456 COST 368.65 TRAN0404 1.
+ SH040456 BAL0404 -1. BAL0456 1.
+ SH040556 COST 137.36 TRAN0405 1.
+ SH040556 BAL0405 -1. BAL0456 1.
+ SH040656 COST 342.39 TRAN0406 1.
+ SH040656 BAL0452 -1. BAL0456 1.
+ SH040756 COST 123.22 TRAN0407 1.
+ SH040756 BAL0464 -1. BAL0456 1.
+ SH040856 COST 360.57 TRAN0408 1.
+ SH040856 BAL0483 -1. BAL0456 1.
+ SH040157 COST 263.61 TRAN0401 1.
+ SH040157 BAL0401 -1. BAL0457 1.
+ SH040257 COST 525.2 TRAN0402 1.
+ SH040257 BAL0402 -1. BAL0457 1.
+ SH040357 COST 292.9 TRAN0403 1.
+ SH040357 BAL0403 -1. BAL0457 1.
+ SH040457 COST 236.34 TRAN0404 1.
+ SH040457 BAL0404 -1. BAL0457 1.
+ SH040557 COST 169.68 TRAN0405 1.
+ SH040557 BAL0405 -1. BAL0457 1.
+ SH040657 COST 322.19 TRAN0406 1.
+ SH040657 BAL0452 -1. BAL0457 1.
+ SH040757 COST 149.48 TRAN0407 1.
+ SH040757 BAL0464 -1. BAL0457 1.
+ SH040857 COST 233.31 TRAN0408 1.
+ SH040857 BAL0483 -1. BAL0457 1.
+ SH040158 COST 296.94 TRAN0401 1.
+ SH040158 BAL0401 -1. BAL0458 1.
+ SH040258 COST 526.21 TRAN0402 1.
+ SH040258 BAL0402 -1. BAL0458 1.
+ SH040358 COST 280.78 TRAN0403 1.
+ SH040358 BAL0403 -1. BAL0458 1.
+ SH040458 COST 346.43 TRAN0404 1.
+ SH040458 BAL0404 -1. BAL0458 1.
+ SH040558 COST 21.21 TRAN0405 1.
+ SH040558 BAL0405 -1. BAL0458 1.
+ SH040658 COST 329.26 TRAN0406 1.
+ SH040658 BAL0452 -1. BAL0458 1.
+ SH040758 COST 68.68 TRAN0407 1.
+ SH040758 BAL0464 -1. BAL0458 1.
+ SH040858 COST 256.54 TRAN0408 1.
+ SH040858 BAL0483 -1. BAL0458 1.
+ SH040159 COST 208.06 TRAN0401 1.
+ SH040159 BAL0401 -1. BAL0459 1.
+ SH040259 COST 502.98 TRAN0402 1.
+ SH040259 BAL0402 -1. BAL0459 1.
+ SH040359 COST 240.38 TRAN0403 1.
+ SH040359 BAL0403 -1. BAL0459 1.
+ SH040459 COST 246.44 TRAN0404 1.
+ SH040459 BAL0404 -1. BAL0459 1.
+ SH040559 COST 160.59 TRAN0405 1.
+ SH040559 BAL0405 -1. BAL0459 1.
+ SH040659 COST 299.97 TRAN0406 1.
+ SH040659 BAL0452 -1. BAL0459 1.
+ SH040759 COST 106.05 TRAN0407 1.
+ SH040759 BAL0464 -1. BAL0459 1.
+ SH040859 COST 257.55 TRAN0408 1.
+ SH040859 BAL0483 -1. BAL0459 1.
+ SH040160 COST 263.61 TRAN0401 1.
+ SH040160 BAL0401 -1. BAL0460 1.
+ SH040260 COST 555.5 TRAN0402 1.
+ SH040260 BAL0402 -1. BAL0460 1.
+ SH040360 COST 285.83 TRAN0403 1.
+ SH040360 BAL0403 -1. BAL0460 1.
+ SH040460 COST 315.12 TRAN0404 1.
+ SH040460 BAL0404 -1. BAL0460 1.
+ SH040560 COST 136.35 TRAN0405 1.
+ SH040560 BAL0405 -1. BAL0460 1.
+ SH040660 COST 326.23 TRAN0406 1.
+ SH040660 BAL0452 -1. BAL0460 1.
+ SH040760 COST 88.88 TRAN0407 1.
+ SH040760 BAL0464 -1. BAL0460 1.
+ SH040860 COST 301.99 TRAN0408 1.
+ SH040860 BAL0483 -1. BAL0460 1.
+ SH040163 COST 268.66 TRAN0401 1.
+ SH040163 BAL0401 -1. BAL0463 1.
+ SH040263 COST 498.94 TRAN0402 1.
+ SH040263 BAL0402 -1. BAL0463 1.
+ SH040363 COST 289.87 TRAN0403 1.
+ SH040363 BAL0403 -1. BAL0463 1.
+ SH040463 COST 372.69 TRAN0404 1.
+ SH040463 BAL0404 -1. BAL0463 1.
+ SH040563 COST 153.52 TRAN0405 1.
+ SH040563 BAL0405 -1. BAL0463 1.
+ SH040663 COST 318.15 TRAN0406 1.
+ SH040663 BAL0452 -1. BAL0463 1.
+ SH040763 COST 125.24 TRAN0407 1.
+ SH040763 BAL0464 -1. BAL0463 1.
+ SH040863 COST 404. TRAN0408 1.
+ SH040863 BAL0483 -1. BAL0463 1.
+ SH040164 COST 200.99 TRAN0401 1.
+ SH040164 BAL0401 -1. BAL0464 1.
+ SH040264 COST 531.26 TRAN0402 1.
+ SH040264 BAL0402 -1. BAL0464 1.
+ SH040364 COST 225.23 TRAN0403 1.
+ SH040364 BAL0403 -1. BAL0464 1.
+ SH040464 COST 339.36 TRAN0404 1.
+ SH040464 BAL0404 -1. BAL0464 1.
+ SH040564 COST 58.58 TRAN0405 1.
+ SH040564 BAL0405 -1. BAL0464 1.
+ SH040664 COST 320.17 TRAN0406 1.
+ SH040664 BAL0452 -1. BAL0464 1.
+ SH040864 COST 252.5 TRAN0408 1.
+ SH040864 BAL0483 -1. BAL0464 1.
+ SH040165 COST 436.32 TRAN0401 1.
+ SH040165 BAL0401 -1. BAL0465 1.
+ SH040265 COST 310.07 TRAN0402 1.
+ SH040265 BAL0402 -1. BAL0465 1.
+ SH040365 COST 510.05 TRAN0403 1.
+ SH040365 BAL0403 -1. BAL0465 1.
+ SH040465 COST 391.88 TRAN0404 1.
+ SH040465 BAL0404 -1. BAL0465 1.
+ SH040565 COST 610.04 TRAN0405 1.
+ SH040565 BAL0405 -1. BAL0465 1.
+ SH040865 COST 419.15 TRAN0408 1.
+ SH040865 BAL0483 -1. BAL0465 1.
+ SH040166 COST 565.6 TRAN0401 1.
+ SH040166 BAL0401 -1. BAL0466 1.
+ SH040266 COST 261.59 TRAN0402 1.
+ SH040266 BAL0402 -1. BAL0466 1.
+ SH040366 COST 583.78 TRAN0403 1.
+ SH040366 BAL0403 -1. BAL0466 1.
+ SH040466 COST 561.56 TRAN0404 1.
+ SH040466 BAL0404 -1. BAL0466 1.
+ SH040566 COST 717.1 TRAN0405 1.
+ SH040566 BAL0405 -1. BAL0466 1.
+ SH040866 COST 565.6 TRAN0408 1.
+ SH040866 BAL0483 -1. BAL0466 1.
+ SH040167 COST 429.25 TRAN0401 1.
+ SH040167 BAL0401 -1. BAL0467 1.
+ SH040267 COST 234.32 TRAN0402 1.
+ SH040267 BAL0402 -1. BAL0467 1.
+ SH040367 COST 497.93 TRAN0403 1.
+ SH040367 BAL0403 -1. BAL0467 1.
+ SH040467 COST 461.57 TRAN0404 1.
+ SH040467 BAL0404 -1. BAL0467 1.
+ SH040567 COST 610.04 TRAN0405 1.
+ SH040567 BAL0405 -1. BAL0467 1.
+ SH040867 COST 462.58 TRAN0408 1.
+ SH040867 BAL0483 -1. BAL0467 1.
+ SH040168 COST 599.94 TRAN0401 1.
+ SH040168 BAL0401 -1. BAL0468 1.
+ SH040268 COST 404. TRAN0402 1.
+ SH040268 BAL0402 -1. BAL0468 1.
+ SH040368 COST 565.6 TRAN0403 1.
+ SH040368 BAL0403 -1. BAL0468 1.
+ SH040468 COST 709.02 TRAN0404 1.
+ SH040468 BAL0404 -1. BAL0468 1.
+ SH040568 COST 955.46 TRAN0405 1.
+ SH040568 BAL0405 -1. BAL0468 1.
+ SH040868 COST 758.51 TRAN0408 1.
+ SH040868 BAL0483 -1. BAL0468 1.
+ SH040169 COST 544.39 TRAN0401 1.
+ SH040169 BAL0401 -1. BAL0469 1.
+ SH040269 COST 223.21 TRAN0402 1.
+ SH040269 BAL0402 -1. BAL0469 1.
+ SH040369 COST 515.1 TRAN0403 1.
+ SH040369 BAL0403 -1. BAL0469 1.
+ SH040469 COST 628.22 TRAN0404 1.
+ SH040469 BAL0404 -1. BAL0469 1.
+ SH040569 COST 652.46 TRAN0405 1.
+ SH040569 BAL0405 -1. BAL0469 1.
+ SH040869 COST 664.58 TRAN0408 1.
+ SH040869 BAL0483 -1. BAL0469 1.
+ SH040171 COST 444.4 TRAN0401 1.
+ SH040171 BAL0401 -1. BAL0471 1.
+ SH040371 COST 529.24 TRAN0403 1.
+ SH040371 BAL0403 -1. BAL0471 1.
+ SH040471 COST 526.21 TRAN0404 1.
+ SH040471 BAL0404 -1. BAL0471 1.
+ SH040571 COST 586.81 TRAN0405 1.
+ SH040571 BAL0405 -1. BAL0471 1.
+ SH040671 COST 394.91 TRAN0406 1.
+ SH040671 BAL0452 -1. BAL0471 1.
+ SH040771 COST 711.04 TRAN0407 1.
+ SH040771 BAL0464 -1. BAL0471 1.
+ SH040871 COST 538.33 TRAN0408 1.
+ SH040871 BAL0483 -1. BAL0471 1.
+ SH040172 COST 592.87 TRAN0401 1.
+ SH040172 BAL0401 -1. BAL0472 1.
+ SH040272 COST 548.43 TRAN0402 1.
+ SH040272 BAL0402 -1. BAL0472 1.
+ SH040372 COST 623.17 TRAN0403 1.
+ SH040372 BAL0403 -1. BAL0472 1.
+ SH040472 COST 575.7 TRAN0404 1.
+ SH040472 BAL0404 -1. BAL0472 1.
+ SH040572 COST 770.63 TRAN0405 1.
+ SH040572 BAL0405 -1. BAL0472 1.
+ SH040872 COST 575.7 TRAN0408 1.
+ SH040872 BAL0483 -1. BAL0472 1.
+ SH040173 COST 393.9 TRAN0401 1.
+ SH040173 BAL0401 -1. BAL0473 1.
+ SH040273 COST 368.65 TRAN0402 1.
+ SH040273 BAL0402 -1. BAL0473 1.
+ SH040373 COST 341.38 TRAN0403 1.
+ SH040373 BAL0403 -1. BAL0473 1.
+ SH040473 COST 461.57 TRAN0404 1.
+ SH040473 BAL0404 -1. BAL0473 1.
+ SH040573 COST 569.64 TRAN0405 1.
+ SH040573 BAL0405 -1. BAL0473 1.
+ SH040673 COST 308.05 TRAN0406 1.
+ SH040673 BAL0452 -1. BAL0473 1.
+ SH040873 COST 509.04 TRAN0408 1.
+ SH040873 BAL0483 -1. BAL0473 1.
+ SH040174 COST 553.48 TRAN0401 1.
+ SH040174 BAL0401 -1. BAL0474 1.
+ SH040274 COST 212.1 TRAN0402 1.
+ SH040274 BAL0402 -1. BAL0474 1.
+ SH040374 COST 575.7 TRAN0403 1.
+ SH040374 BAL0403 -1. BAL0474 1.
+ SH040474 COST 643.37 TRAN0404 1.
+ SH040474 BAL0404 -1. BAL0474 1.
+ SH040574 COST 740.33 TRAN0405 1.
+ SH040574 BAL0405 -1. BAL0474 1.
+ SH040874 COST 625.19 TRAN0408 1.
+ SH040874 BAL0483 -1. BAL0474 1.
+ SH040275 COST 559.54 TRAN0402 1.
+ SH040275 BAL0402 -1. BAL0475 1.
+ SH040176 COST 466.62 TRAN0401 1.
+ SH040176 BAL0401 -1. BAL0476 1.
+ SH040276 COST 405.01 TRAN0402 1.
+ SH040276 BAL0402 -1. BAL0476 1.
+ SH040376 COST 407.03 TRAN0403 1.
+ SH040376 BAL0403 -1. BAL0476 1.
+ SH040476 COST 636.3 TRAN0404 1.
+ SH040476 BAL0404 -1. BAL0476 1.
+ SH040576 COST 636.3 TRAN0405 1.
+ SH040576 BAL0405 -1. BAL0476 1.
+ SH040676 COST 384.81 TRAN0406 1.
+ SH040676 BAL0452 -1. BAL0476 1.
+ SH040876 COST 784.77 TRAN0408 1.
+ SH040876 BAL0483 -1. BAL0476 1.
+ SH040177 COST 439.35 TRAN0401 1.
+ SH040177 BAL0401 -1. BAL0477 1.
+ SH040277 COST 274.72 TRAN0402 1.
+ SH040277 BAL0402 -1. BAL0477 1.
+ SH040377 COST 465.61 TRAN0403 1.
+ SH040377 BAL0403 -1. BAL0477 1.
+ SH040477 COST 405.01 TRAN0404 1.
+ SH040477 BAL0404 -1. BAL0477 1.
+ SH040577 COST 565.6 TRAN0405 1.
+ SH040577 BAL0405 -1. BAL0477 1.
+ SH040877 COST 323.2 TRAN0408 1.
+ SH040877 BAL0483 -1. BAL0477 1.
+ SH040178 COST 768.61 TRAN0401 1.
+ SH040178 BAL0401 -1. BAL0478 1.
+ SH040278 COST 446.42 TRAN0402 1.
+ SH040278 BAL0402 -1. BAL0478 1.
+ SH040378 COST 790.83 TRAN0403 1.
+ SH040378 BAL0403 -1. BAL0478 1.
+ SH040478 COST 691.85 TRAN0404 1.
+ SH040478 BAL0404 -1. BAL0478 1.
+ SH040578 COST 887.79 TRAN0405 1.
+ SH040578 BAL0405 -1. BAL0478 1.
+ SH040878 COST 773.66 TRAN0408 1.
+ SH040878 BAL0483 -1. BAL0478 1.
+ SH040179 COST 722.15 TRAN0401 1.
+ SH040179 BAL0401 -1. BAL0479 1.
+ SH040279 COST 271.69 TRAN0402 1.
+ SH040279 BAL0402 -1. BAL0479 1.
+ SH040379 COST 697.91 TRAN0403 1.
+ SH040379 BAL0403 -1. BAL0479 1.
+ SH040479 COST 727.2 TRAN0404 1.
+ SH040479 BAL0404 -1. BAL0479 1.
+ SH040879 COST 713.06 TRAN0408 1.
+ SH040879 BAL0483 -1. BAL0479 1.
+ SH040180 COST 320.17 TRAN0401 1.
+ SH040180 BAL0401 -1. BAL0480 1.
+ SH040280 COST 398.95 TRAN0402 1.
+ SH040280 BAL0402 -1. BAL0480 1.
+ SH040380 COST 441.37 TRAN0403 1.
+ SH040380 BAL0403 -1. BAL0480 1.
+ SH040480 COST 377.74 TRAN0404 1.
+ SH040480 BAL0404 -1. BAL0480 1.
+ SH040580 COST 510.05 TRAN0405 1.
+ SH040580 BAL0405 -1. BAL0480 1.
+ SH040880 COST 242.4 TRAN0408 1.
+ SH040880 BAL0483 -1. BAL0480 1.
+ SH040182 COST 587.82 TRAN0401 1.
+ SH040182 BAL0401 -1. BAL0482 1.
+ SH040282 COST 332.29 TRAN0402 1.
+ SH040282 BAL0402 -1. BAL0482 1.
+ SH040382 COST 661.55 TRAN0403 1.
+ SH040382 BAL0403 -1. BAL0482 1.
+ SH040482 COST 713.06 TRAN0404 1.
+ SH040482 BAL0404 -1. BAL0482 1.
+ SH040582 COST 1158.47 TRAN0405 1.
+ SH040582 BAL0405 -1. BAL0482 1.
+ SH040882 COST 790.83 TRAN0408 1.
+ SH040882 BAL0483 -1. BAL0482 1.
+ SH040183 COST 178.77 TRAN0401 1.
+ SH040183 BAL0401 -1. BAL0483 1.
+ SH040283 COST 525.2 TRAN0402 1.
+ SH040283 BAL0402 -1. BAL0483 1.
+ SH040383 COST 274.72 TRAN0403 1.
+ SH040383 BAL0403 -1. BAL0483 1.
+ SH040483 COST 59.59 TRAN0404 1.
+ SH040483 BAL0404 -1. BAL0483 1.
+ SH040583 COST 350.47 TRAN0405 1.
+ SH040583 BAL0405 -1. BAL0483 1.
+ SH040683 COST 250.48 TRAN0406 1.
+ SH040683 BAL0452 -1. BAL0483 1.
+ SH040184 COST 307.04 TRAN0401 1.
+ SH040184 BAL0401 -1. BAL0484 1.
+ SH040284 COST 193.92 TRAN0402 1.
+ SH040284 BAL0402 -1. BAL0484 1.
+ SH040384 COST 367.64 TRAN0403 1.
+ SH040384 BAL0403 -1. BAL0484 1.
+ SH040484 COST 373.7 TRAN0404 1.
+ SH040484 BAL0404 -1. BAL0484 1.
+ SH040584 COST 494.9 TRAN0405 1.
+ SH040584 BAL0405 -1. BAL0484 1.
+ SH040684 COST 308.05 TRAN0406 1.
+ SH040684 BAL0452 -1. BAL0484 1.
+ SH040884 COST 391.88 TRAN0408 1.
+ SH040884 BAL0483 -1. BAL0484 1.
+ SH050201 COST 490.05 TRAN0502 1.
+ SH050201 BAL0502 -1. BAL0501 1.
+ SH050301 COST 188.1 TRAN0503 1.
+ SH050301 BAL0503 -1. BAL0501 1.
+ SH050401 COST 343.2 TRAN0504 1.
+ SH050401 BAL0504 -1. BAL0501 1.
+ SH050501 COST 391.05 TRAN0505 1.
+ SH050501 BAL0505 -1. BAL0501 1.
+ SH050601 COST 207.9 TRAN0506 1.
+ SH050601 BAL0552 -1. BAL0501 1.
+ SH050801 COST 235.95 TRAN0508 1.
+ SH050801 BAL0583 -1. BAL0501 1.
+ SH050102 COST 782.1 TRAN0501 1.
+ SH050102 BAL0501 -1. BAL0502 1.
+ SH050302 COST 688.05 TRAN0503 1.
+ SH050302 BAL0503 -1. BAL0502 1.
+ SH050402 COST 1009.8 TRAN0504 1.
+ SH050402 BAL0504 -1. BAL0502 1.
+ SH050502 COST 1222.65 TRAN0505 1.
+ SH050502 BAL0505 -1. BAL0502 1.
+ SH050602 COST 623.7 TRAN0506 1.
+ SH050602 BAL0552 -1. BAL0502 1.
+ SH050802 COST 859.65 TRAN0508 1.
+ SH050802 BAL0583 -1. BAL0502 1.
+ SH050103 COST 404.25 TRAN0501 1.
+ SH050103 BAL0501 -1. BAL0503 1.
+ SH050203 COST 782.1 TRAN0502 1.
+ SH050203 BAL0502 -1. BAL0503 1.
+ SH050403 COST 605.55 TRAN0504 1.
+ SH050403 BAL0504 -1. BAL0503 1.
+ SH050503 COST 468.6 TRAN0505 1.
+ SH050503 BAL0505 -1. BAL0503 1.
+ SH050603 COST 148.5 TRAN0506 1.
+ SH050603 BAL0552 -1. BAL0503 1.
+ SH050803 COST 420.75 TRAN0508 1.
+ SH050803 BAL0583 -1. BAL0503 1.
+ SH050104 COST 287.1 TRAN0501 1.
+ SH050104 BAL0501 -1. BAL0504 1.
+ SH050204 COST 829.95 TRAN0502 1.
+ SH050204 BAL0502 -1. BAL0504 1.
+ SH050304 COST 400.95 TRAN0503 1.
+ SH050304 BAL0503 -1. BAL0504 1.
+ SH050504 COST 526.35 TRAN0505 1.
+ SH050504 BAL0505 -1. BAL0504 1.
+ SH050604 COST 404.25 TRAN0506 1.
+ SH050604 BAL0552 -1. BAL0504 1.
+ SH050704 COST 443.85 TRAN0507 1.
+ SH050704 BAL0564 -1. BAL0504 1.
+ SH050804 COST 95.7 TRAN0508 1.
+ SH050804 BAL0583 -1. BAL0504 1.
+ SH050105 COST 445.5 TRAN0501 1.
+ SH050105 BAL0501 -1. BAL0505 1.
+ SH050205 COST 851.4 TRAN0502 1.
+ SH050205 BAL0502 -1. BAL0505 1.
+ SH050305 COST 468.6 TRAN0503 1.
+ SH050305 BAL0503 -1. BAL0505 1.
+ SH050405 COST 470.25 TRAN0504 1.
+ SH050405 BAL0504 -1. BAL0505 1.
+ SH050605 COST 537.9 TRAN0506 1.
+ SH050605 BAL0552 -1. BAL0505 1.
+ SH050705 COST 551.1 TRAN0507 1.
+ SH050705 BAL0564 -1. BAL0505 1.
+ SH050805 COST 447.15 TRAN0508 1.
+ SH050805 BAL0583 -1. BAL0505 1.
+ SH050106 COST 328.35 TRAN0501 1.
+ SH050106 BAL0501 -1. BAL0506 1.
+ SH050206 COST 688.05 TRAN0502 1.
+ SH050206 BAL0502 -1. BAL0506 1.
+ SH050306 COST 351.45 TRAN0503 1.
+ SH050306 BAL0503 -1. BAL0506 1.
+ SH050406 COST 361.35 TRAN0504 1.
+ SH050406 BAL0504 -1. BAL0506 1.
+ SH050506 COST 415.8 TRAN0505 1.
+ SH050506 BAL0505 -1. BAL0506 1.
+ SH050606 COST 339.9 TRAN0506 1.
+ SH050606 BAL0552 -1. BAL0506 1.
+ SH050706 COST 330. TRAN0507 1.
+ SH050706 BAL0564 -1. BAL0506 1.
+ SH050806 COST 249.15 TRAN0508 1.
+ SH050806 BAL0583 -1. BAL0506 1.
+ SH050107 COST 34.65 TRAN0501 1.
+ SH050107 BAL0501 -1. BAL0507 1.
+ SH050207 COST 481.8 TRAN0502 1.
+ SH050207 BAL0502 -1. BAL0507 1.
+ SH050307 COST 204.6 TRAN0503 1.
+ SH050307 BAL0503 -1. BAL0507 1.
+ SH050407 COST 341.55 TRAN0504 1.
+ SH050407 BAL0504 -1. BAL0507 1.
+ SH050507 COST 377.85 TRAN0505 1.
+ SH050507 BAL0505 -1. BAL0507 1.
+ SH050607 COST 206.25 TRAN0506 1.
+ SH050607 BAL0552 -1. BAL0507 1.
+ SH050707 COST 382.8 TRAN0507 1.
+ SH050707 BAL0564 -1. BAL0507 1.
+ SH050807 COST 255.75 TRAN0508 1.
+ SH050807 BAL0583 -1. BAL0507 1.
+ SH050108 COST 108.9 TRAN0501 1.
+ SH050108 BAL0501 -1. BAL0508 1.
+ SH050208 COST 620.4 TRAN0502 1.
+ SH050208 BAL0502 -1. BAL0508 1.
+ SH050308 COST 232.65 TRAN0503 1.
+ SH050308 BAL0503 -1. BAL0508 1.
+ SH050408 COST 407.55 TRAN0504 1.
+ SH050408 BAL0504 -1. BAL0508 1.
+ SH050508 COST 300.3 TRAN0505 1.
+ SH050508 BAL0505 -1. BAL0508 1.
+ SH050608 COST 273.9 TRAN0506 1.
+ SH050608 BAL0552 -1. BAL0508 1.
+ SH050808 COST 308.55 TRAN0508 1.
+ SH050808 BAL0583 -1. BAL0508 1.
+ SH050109 COST 227.7 TRAN0501 1.
+ SH050109 BAL0501 -1. BAL0509 1.
+ SH050209 COST 631.95 TRAN0502 1.
+ SH050209 BAL0502 -1. BAL0509 1.
+ SH050309 COST 277.2 TRAN0503 1.
+ SH050309 BAL0503 -1. BAL0509 1.
+ SH050409 COST 417.45 TRAN0504 1.
+ SH050409 BAL0504 -1. BAL0509 1.
+ SH050509 COST 394.35 TRAN0505 1.
+ SH050509 BAL0505 -1. BAL0509 1.
+ SH050709 COST 323.4 TRAN0507 1.
+ SH050709 BAL0564 -1. BAL0509 1.
+ SH050809 COST 320.1 TRAN0508 1.
+ SH050809 BAL0583 -1. BAL0509 1.
+ SH050110 COST 407.55 TRAN0501 1.
+ SH050110 BAL0501 -1. BAL0510 1.
+ SH050210 COST 260.7 TRAN0502 1.
+ SH050210 BAL0502 -1. BAL0510 1.
+ SH050310 COST 396. TRAN0503 1.
+ SH050310 BAL0503 -1. BAL0510 1.
+ SH050410 COST 592.35 TRAN0504 1.
+ SH050410 BAL0504 -1. BAL0510 1.
+ SH050510 COST 635.25 TRAN0505 1.
+ SH050510 BAL0505 -1. BAL0510 1.
+ SH050610 COST 371.25 TRAN0506 1.
+ SH050610 BAL0552 -1. BAL0510 1.
+ SH050810 COST 503.25 TRAN0508 1.
+ SH050810 BAL0583 -1. BAL0510 1.
+ SH050111 COST 174.9 TRAN0501 1.
+ SH050111 BAL0501 -1. BAL0511 1.
+ SH050211 COST 816.75 TRAN0502 1.
+ SH050211 BAL0502 -1. BAL0511 1.
+ SH050311 COST 409.2 TRAN0503 1.
+ SH050311 BAL0503 -1. BAL0511 1.
+ SH050411 COST 229.35 TRAN0504 1.
+ SH050411 BAL0504 -1. BAL0511 1.
+ SH050511 COST 562.65 TRAN0505 1.
+ SH050511 BAL0505 -1. BAL0511 1.
+ SH050611 COST 323.4 TRAN0506 1.
+ SH050611 BAL0552 -1. BAL0511 1.
+ SH050811 COST 168.3 TRAN0508 1.
+ SH050811 BAL0583 -1. BAL0511 1.
+ SH050112 COST 145.2 TRAN0501 1.
+ SH050112 BAL0501 -1. BAL0512 1.
+ SH050212 COST 559.35 TRAN0502 1.
+ SH050212 BAL0502 -1. BAL0512 1.
+ SH050312 COST 240.9 TRAN0503 1.
+ SH050312 BAL0503 -1. BAL0512 1.
+ SH050412 COST 330. TRAN0504 1.
+ SH050412 BAL0504 -1. BAL0512 1.
+ SH050512 COST 440.55 TRAN0505 1.
+ SH050512 BAL0505 -1. BAL0512 1.
+ SH050612 COST 239.25 TRAN0506 1.
+ SH050612 BAL0552 -1. BAL0512 1.
+ SH050812 COST 240.9 TRAN0508 1.
+ SH050812 BAL0583 -1. BAL0512 1.
+ SH050114 COST 234.3 TRAN0501 1.
+ SH050114 BAL0501 -1. BAL0514 1.
+ SH050214 COST 679.8 TRAN0502 1.
+ SH050214 BAL0502 -1. BAL0514 1.
+ SH050314 COST 323.4 TRAN0503 1.
+ SH050314 BAL0503 -1. BAL0514 1.
+ SH050414 COST 328.35 TRAN0504 1.
+ SH050414 BAL0504 -1. BAL0514 1.
+ SH050514 COST 580.8 TRAN0505 1.
+ SH050514 BAL0505 -1. BAL0514 1.
+ SH050614 COST 310.2 TRAN0506 1.
+ SH050614 BAL0552 -1. BAL0514 1.
+ SH050814 COST 207.9 TRAN0508 1.
+ SH050814 BAL0583 -1. BAL0514 1.
+ SH050115 COST 499.95 TRAN0501 1.
+ SH050115 BAL0501 -1. BAL0515 1.
+ SH050215 COST 262.35 TRAN0502 1.
+ SH050215 BAL0502 -1. BAL0515 1.
+ SH050315 COST 386.1 TRAN0503 1.
+ SH050315 BAL0503 -1. BAL0515 1.
+ SH050415 COST 785.4 TRAN0504 1.
+ SH050415 BAL0504 -1. BAL0515 1.
+ SH050515 COST 656.7 TRAN0505 1.
+ SH050515 BAL0505 -1. BAL0515 1.
+ SH050615 COST 310.2 TRAN0506 1.
+ SH050615 BAL0552 -1. BAL0515 1.
+ SH050815 COST 615.45 TRAN0508 1.
+ SH050815 BAL0583 -1. BAL0515 1.
+ SH050116 COST 260.7 TRAN0501 1.
+ SH050116 BAL0501 -1. BAL0516 1.
+ SH050216 COST 462. TRAN0502 1.
+ SH050216 BAL0502 -1. BAL0516 1.
+ SH050316 COST 374.55 TRAN0503 1.
+ SH050316 BAL0503 -1. BAL0516 1.
+ SH050416 COST 473.55 TRAN0504 1.
+ SH050416 BAL0504 -1. BAL0516 1.
+ SH050516 COST 526.35 TRAN0505 1.
+ SH050516 BAL0505 -1. BAL0516 1.
+ SH050616 COST 216.15 TRAN0506 1.
+ SH050616 BAL0552 -1. BAL0516 1.
+ SH050816 COST 338.25 TRAN0508 1.
+ SH050816 BAL0583 -1. BAL0516 1.
+ SH050117 COST 249.15 TRAN0501 1.
+ SH050117 BAL0501 -1. BAL0517 1.
+ SH050217 COST 833.25 TRAN0502 1.
+ SH050217 BAL0502 -1. BAL0517 1.
+ SH050317 COST 452.1 TRAN0503 1.
+ SH050317 BAL0503 -1. BAL0517 1.
+ SH050417 COST 94.05 TRAN0504 1.
+ SH050417 BAL0504 -1. BAL0517 1.
+ SH050517 COST 491.7 TRAN0505 1.
+ SH050517 BAL0505 -1. BAL0517 1.
+ SH050717 COST 486.75 TRAN0507 1.
+ SH050717 BAL0564 -1. BAL0517 1.
+ SH050817 COST 44.55 TRAN0508 1.
+ SH050817 BAL0583 -1. BAL0517 1.
+ SH050118 COST 288.75 TRAN0501 1.
+ SH050118 BAL0501 -1. BAL0518 1.
+ SH050218 COST 595.65 TRAN0502 1.
+ SH050218 BAL0502 -1. BAL0518 1.
+ SH050318 COST 445.5 TRAN0503 1.
+ SH050318 BAL0503 -1. BAL0518 1.
+ SH050418 COST 254.1 TRAN0504 1.
+ SH050418 BAL0504 -1. BAL0518 1.
+ SH050518 COST 671.55 TRAN0505 1.
+ SH050518 BAL0505 -1. BAL0518 1.
+ SH050618 COST 580.8 TRAN0506 1.
+ SH050618 BAL0552 -1. BAL0518 1.
+ SH050818 COST 169.95 TRAN0508 1.
+ SH050818 BAL0583 -1. BAL0518 1.
+ SH050119 COST 409.2 TRAN0501 1.
+ SH050119 BAL0501 -1. BAL0519 1.
+ SH050219 COST 1133.55 TRAN0502 1.
+ SH050219 BAL0502 -1. BAL0519 1.
+ SH050319 COST 523.05 TRAN0503 1.
+ SH050319 BAL0503 -1. BAL0519 1.
+ SH050419 COST 262.35 TRAN0504 1.
+ SH050419 BAL0504 -1. BAL0519 1.
+ SH050519 COST 343.2 TRAN0505 1.
+ SH050519 BAL0505 -1. BAL0519 1.
+ SH050619 COST 569.25 TRAN0506 1.
+ SH050619 BAL0552 -1. BAL0519 1.
+ SH050819 COST 163.35 TRAN0508 1.
+ SH050819 BAL0583 -1. BAL0519 1.
+ SH050120 COST 338.25 TRAN0501 1.
+ SH050120 BAL0501 -1. BAL0520 1.
+ SH050220 COST 1126.95 TRAN0502 1.
+ SH050220 BAL0502 -1. BAL0520 1.
+ SH050320 COST 490.05 TRAN0503 1.
+ SH050320 BAL0503 -1. BAL0520 1.
+ SH050420 COST 186.45 TRAN0504 1.
+ SH050420 BAL0504 -1. BAL0520 1.
+ SH050520 COST 480.15 TRAN0505 1.
+ SH050520 BAL0505 -1. BAL0520 1.
+ SH050820 COST 207.9 TRAN0508 1.
+ SH050820 BAL0583 -1. BAL0520 1.
+ SH050121 COST 664.95 TRAN0501 1.
+ SH050121 BAL0501 -1. BAL0521 1.
+ SH050221 COST 607.2 TRAN0502 1.
+ SH050221 BAL0502 -1. BAL0521 1.
+ SH050321 COST 735.9 TRAN0503 1.
+ SH050321 BAL0503 -1. BAL0521 1.
+ SH050421 COST 528. TRAN0504 1.
+ SH050421 BAL0504 -1. BAL0521 1.
+ SH050521 COST 907.5 TRAN0505 1.
+ SH050521 BAL0505 -1. BAL0521 1.
+ SH050821 COST 528. TRAN0508 1.
+ SH050821 BAL0583 -1. BAL0521 1.
+ SH050122 COST 409.2 TRAN0501 1.
+ SH050122 BAL0501 -1. BAL0522 1.
+ SH050222 COST 953.7 TRAN0502 1.
+ SH050222 BAL0502 -1. BAL0522 1.
+ SH050322 COST 493.35 TRAN0503 1.
+ SH050322 BAL0503 -1. BAL0522 1.
+ SH050422 COST 369.6 TRAN0504 1.
+ SH050422 BAL0504 -1. BAL0522 1.
+ SH050522 COST 295.35 TRAN0505 1.
+ SH050522 BAL0505 -1. BAL0522 1.
+ SH050622 COST 511.5 TRAN0506 1.
+ SH050622 BAL0552 -1. BAL0522 1.
+ SH050822 COST 229.35 TRAN0508 1.
+ SH050822 BAL0583 -1. BAL0522 1.
+ SH050123 COST 386.1 TRAN0501 1.
+ SH050123 BAL0501 -1. BAL0523 1.
+ SH050223 COST 892.65 TRAN0502 1.
+ SH050223 BAL0502 -1. BAL0523 1.
+ SH050323 COST 473.55 TRAN0503 1.
+ SH050323 BAL0503 -1. BAL0523 1.
+ SH050423 COST 275.55 TRAN0504 1.
+ SH050423 BAL0504 -1. BAL0523 1.
+ SH050523 COST 273.9 TRAN0505 1.
+ SH050523 BAL0505 -1. BAL0523 1.
+ SH050823 COST 229.35 TRAN0508 1.
+ SH050823 BAL0583 -1. BAL0523 1.
+ SH050124 COST 2369.4 TRAN0501 1.
+ SH050124 BAL0501 -1. BAL0524 1.
+ SH050125 COST 638.55 TRAN0501 1.
+ SH050125 BAL0501 -1. BAL0525 1.
+ SH050225 COST 704.55 TRAN0502 1.
+ SH050225 BAL0502 -1. BAL0525 1.
+ SH050325 COST 843.15 TRAN0503 1.
+ SH050325 BAL0503 -1. BAL0525 1.
+ SH050425 COST 574.2 TRAN0504 1.
+ SH050425 BAL0504 -1. BAL0525 1.
+ SH050525 COST 933.9 TRAN0505 1.
+ SH050525 BAL0505 -1. BAL0525 1.
+ SH050625 COST 664.95 TRAN0506 1.
+ SH050625 BAL0552 -1. BAL0525 1.
+ SH050825 COST 503.25 TRAN0508 1.
+ SH050825 BAL0583 -1. BAL0525 1.
+ SH050426 COST 445.5 TRAN0504 1.
+ SH050426 BAL0504 -1. BAL0526 1.
+ SH050127 COST 386.1 TRAN0501 1.
+ SH050127 BAL0501 -1. BAL0527 1.
+ SH050227 COST 468.6 TRAN0502 1.
+ SH050227 BAL0502 -1. BAL0527 1.
+ SH050327 COST 476.85 TRAN0503 1.
+ SH050327 BAL0503 -1. BAL0527 1.
+ SH050427 COST 552.75 TRAN0504 1.
+ SH050427 BAL0504 -1. BAL0527 1.
+ SH050527 COST 623.7 TRAN0505 1.
+ SH050527 BAL0505 -1. BAL0527 1.
+ SH050627 COST 442.2 TRAN0506 1.
+ SH050627 BAL0552 -1. BAL0527 1.
+ SH050827 COST 415.8 TRAN0508 1.
+ SH050827 BAL0583 -1. BAL0527 1.
+ SH050128 COST 400.95 TRAN0501 1.
+ SH050128 BAL0501 -1. BAL0528 1.
+ SH050228 COST 938.85 TRAN0502 1.
+ SH050228 BAL0502 -1. BAL0528 1.
+ SH050328 COST 488.4 TRAN0503 1.
+ SH050328 BAL0503 -1. BAL0528 1.
+ SH050428 COST 486.75 TRAN0504 1.
+ SH050428 BAL0504 -1. BAL0528 1.
+ SH050528 COST 168.3 TRAN0505 1.
+ SH050528 BAL0505 -1. BAL0528 1.
+ SH050628 COST 430.65 TRAN0506 1.
+ SH050628 BAL0552 -1. BAL0528 1.
+ SH050728 COST 176.55 TRAN0507 1.
+ SH050728 BAL0564 -1. BAL0528 1.
+ SH050828 COST 419.1 TRAN0508 1.
+ SH050828 BAL0583 -1. BAL0528 1.
+ SH050129 COST 367.95 TRAN0501 1.
+ SH050129 BAL0501 -1. BAL0529 1.
+ SH050229 COST 765.6 TRAN0502 1.
+ SH050229 BAL0502 -1. BAL0529 1.
+ SH050329 COST 397.65 TRAN0503 1.
+ SH050329 BAL0503 -1. BAL0529 1.
+ SH050429 COST 328.35 TRAN0504 1.
+ SH050429 BAL0504 -1. BAL0529 1.
+ SH050529 COST 709.5 TRAN0505 1.
+ SH050529 BAL0505 -1. BAL0529 1.
+ SH050629 COST 430.65 TRAN0506 1.
+ SH050629 BAL0552 -1. BAL0529 1.
+ SH050829 COST 237.6 TRAN0508 1.
+ SH050829 BAL0583 -1. BAL0529 1.
+ SH050130 COST 768.9 TRAN0501 1.
+ SH050130 BAL0501 -1. BAL0530 1.
+ SH050230 COST 719.4 TRAN0502 1.
+ SH050230 BAL0502 -1. BAL0530 1.
+ SH050330 COST 862.95 TRAN0503 1.
+ SH050330 BAL0503 -1. BAL0530 1.
+ SH050430 COST 501.6 TRAN0504 1.
+ SH050430 BAL0504 -1. BAL0530 1.
+ SH050530 COST 735.9 TRAN0505 1.
+ SH050530 BAL0505 -1. BAL0530 1.
+ SH050830 COST 630.3 TRAN0508 1.
+ SH050830 BAL0583 -1. BAL0530 1.
+ SH050131 COST 183.15 TRAN0501 1.
+ SH050131 BAL0501 -1. BAL0531 1.
+ SH050231 COST 579.15 TRAN0502 1.
+ SH050231 BAL0502 -1. BAL0531 1.
+ SH050331 COST 181.5 TRAN0503 1.
+ SH050331 BAL0503 -1. BAL0531 1.
+ SH050431 COST 417.45 TRAN0504 1.
+ SH050431 BAL0504 -1. BAL0531 1.
+ SH050531 COST 506.55 TRAN0505 1.
+ SH050531 BAL0505 -1. BAL0531 1.
+ SH050631 COST 184.8 TRAN0506 1.
+ SH050631 BAL0552 -1. BAL0531 1.
+ SH050831 COST 367.95 TRAN0508 1.
+ SH050831 BAL0583 -1. BAL0531 1.
+ SH050132 COST 493.35 TRAN0501 1.
+ SH050132 BAL0501 -1. BAL0532 1.
+ SH050232 COST 788.7 TRAN0502 1.
+ SH050232 BAL0502 -1. BAL0532 1.
+ SH050332 COST 697.95 TRAN0503 1.
+ SH050332 BAL0503 -1. BAL0532 1.
+ SH050432 COST 259.05 TRAN0504 1.
+ SH050432 BAL0504 -1. BAL0532 1.
+ SH050532 COST 646.8 TRAN0505 1.
+ SH050532 BAL0505 -1. BAL0532 1.
+ SH050832 COST 297. TRAN0508 1.
+ SH050832 BAL0583 -1. BAL0532 1.
+ SH050133 COST 813.45 TRAN0501 1.
+ SH050133 BAL0501 -1. BAL0533 1.
+ SH050233 COST 660. TRAN0502 1.
+ SH050233 BAL0502 -1. BAL0533 1.
+ SH050333 COST 895.95 TRAN0503 1.
+ SH050333 BAL0503 -1. BAL0533 1.
+ SH050433 COST 734.25 TRAN0504 1.
+ SH050433 BAL0504 -1. BAL0533 1.
+ SH050533 COST 1041.15 TRAN0505 1.
+ SH050533 BAL0505 -1. BAL0533 1.
+ SH050833 COST 628.65 TRAN0508 1.
+ SH050833 BAL0583 -1. BAL0533 1.
+ SH050134 COST 636.9 TRAN0501 1.
+ SH050134 BAL0501 -1. BAL0534 1.
+ SH050234 COST 1080.75 TRAN0502 1.
+ SH050234 BAL0502 -1. BAL0534 1.
+ SH050334 COST 829.95 TRAN0503 1.
+ SH050334 BAL0503 -1. BAL0534 1.
+ SH050434 COST 348.15 TRAN0504 1.
+ SH050434 BAL0504 -1. BAL0534 1.
+ SH050534 COST 727.65 TRAN0505 1.
+ SH050534 BAL0505 -1. BAL0534 1.
+ SH050834 COST 433.95 TRAN0508 1.
+ SH050834 BAL0583 -1. BAL0534 1.
+ SH050135 COST 760.65 TRAN0501 1.
+ SH050135 BAL0501 -1. BAL0535 1.
+ SH050235 COST 734.25 TRAN0502 1.
+ SH050235 BAL0502 -1. BAL0535 1.
+ SH050335 COST 622.05 TRAN0503 1.
+ SH050335 BAL0503 -1. BAL0535 1.
+ SH050435 COST 201.3 TRAN0504 1.
+ SH050435 BAL0504 -1. BAL0535 1.
+ SH050535 COST 711.15 TRAN0505 1.
+ SH050535 BAL0505 -1. BAL0535 1.
+ SH050835 COST 387.75 TRAN0508 1.
+ SH050835 BAL0583 -1. BAL0535 1.
+ SH050136 COST 338.25 TRAN0501 1.
+ SH050136 BAL0501 -1. BAL0536 1.
+ SH050236 COST 739.2 TRAN0502 1.
+ SH050236 BAL0502 -1. BAL0536 1.
+ SH050336 COST 174.9 TRAN0503 1.
+ SH050336 BAL0503 -1. BAL0536 1.
+ SH050436 COST 610.5 TRAN0504 1.
+ SH050436 BAL0504 -1. BAL0536 1.
+ SH050536 COST 570.9 TRAN0505 1.
+ SH050536 BAL0505 -1. BAL0536 1.
+ SH050636 COST 181.5 TRAN0506 1.
+ SH050636 BAL0552 -1. BAL0536 1.
+ SH050836 COST 529.65 TRAN0508 1.
+ SH050836 BAL0583 -1. BAL0536 1.
+ SH050137 COST 151.8 TRAN0501 1.
+ SH050137 BAL0501 -1. BAL0537 1.
+ SH050237 COST 564.3 TRAN0502 1.
+ SH050237 BAL0502 -1. BAL0537 1.
+ SH050337 COST 260.7 TRAN0503 1.
+ SH050337 BAL0503 -1. BAL0537 1.
+ SH050437 COST 501.6 TRAN0504 1.
+ SH050437 BAL0504 -1. BAL0537 1.
+ SH050537 COST 300.3 TRAN0505 1.
+ SH050537 BAL0505 -1. BAL0537 1.
+ SH050637 COST 320.1 TRAN0506 1.
+ SH050637 BAL0552 -1. BAL0537 1.
+ SH050837 COST 415.8 TRAN0508 1.
+ SH050837 BAL0583 -1. BAL0537 1.
+ SH050138 COST 224.4 TRAN0501 1.
+ SH050138 BAL0501 -1. BAL0538 1.
+ SH050238 COST 402.6 TRAN0502 1.
+ SH050238 BAL0502 -1. BAL0538 1.
+ SH050338 COST 156.75 TRAN0503 1.
+ SH050338 BAL0503 -1. BAL0538 1.
+ SH050438 COST 508.2 TRAN0504 1.
+ SH050438 BAL0504 -1. BAL0538 1.
+ SH050538 COST 458.7 TRAN0505 1.
+ SH050538 BAL0505 -1. BAL0538 1.
+ SH050638 COST 64.35 TRAN0506 1.
+ SH050638 BAL0552 -1. BAL0538 1.
+ SH050738 COST 356.4 TRAN0507 1.
+ SH050738 BAL0564 -1. BAL0538 1.
+ SH050838 COST 391.05 TRAN0508 1.
+ SH050838 BAL0583 -1. BAL0538 1.
+ SH050139 COST 214.5 TRAN0501 1.
+ SH050139 BAL0501 -1. BAL0539 1.
+ SH050239 COST 559.35 TRAN0502 1.
+ SH050239 BAL0502 -1. BAL0539 1.
+ SH050339 COST 264. TRAN0503 1.
+ SH050339 BAL0503 -1. BAL0539 1.
+ SH050439 COST 410.85 TRAN0504 1.
+ SH050439 BAL0504 -1. BAL0539 1.
+ SH050539 COST 707.85 TRAN0505 1.
+ SH050539 BAL0505 -1. BAL0539 1.
+ SH050639 COST 336.6 TRAN0506 1.
+ SH050639 BAL0552 -1. BAL0539 1.
+ SH050839 COST 277.2 TRAN0508 1.
+ SH050839 BAL0583 -1. BAL0539 1.
+ SH050140 COST 272.25 TRAN0501 1.
+ SH050140 BAL0501 -1. BAL0540 1.
+ SH050240 COST 623.7 TRAN0502 1.
+ SH050240 BAL0502 -1. BAL0540 1.
+ SH050340 COST 169.95 TRAN0503 1.
+ SH050340 BAL0503 -1. BAL0540 1.
+ SH050440 COST 490.05 TRAN0504 1.
+ SH050440 BAL0504 -1. BAL0540 1.
+ SH050540 COST 364.65 TRAN0505 1.
+ SH050540 BAL0505 -1. BAL0540 1.
+ SH050640 COST 216.15 TRAN0506 1.
+ SH050640 BAL0552 -1. BAL0540 1.
+ SH050840 COST 452.1 TRAN0508 1.
+ SH050840 BAL0583 -1. BAL0540 1.
+ SH050141 COST 323.4 TRAN0501 1.
+ SH050141 BAL0501 -1. BAL0541 1.
+ SH050241 COST 495. TRAN0502 1.
+ SH050241 BAL0502 -1. BAL0541 1.
+ SH050341 COST 247.5 TRAN0503 1.
+ SH050341 BAL0503 -1. BAL0541 1.
+ SH050441 COST 534.6 TRAN0504 1.
+ SH050441 BAL0504 -1. BAL0541 1.
+ SH050541 COST 607.2 TRAN0505 1.
+ SH050541 BAL0505 -1. BAL0541 1.
+ SH050641 COST 165. TRAN0506 1.
+ SH050641 BAL0552 -1. BAL0541 1.
+ SH050841 COST 493.35 TRAN0508 1.
+ SH050841 BAL0583 -1. BAL0541 1.
+ SH050142 COST 148.5 TRAN0501 1.
+ SH050142 BAL0501 -1. BAL0542 1.
+ SH050242 COST 683.1 TRAN0502 1.
+ SH050242 BAL0502 -1. BAL0542 1.
+ SH050342 COST 264. TRAN0503 1.
+ SH050342 BAL0503 -1. BAL0542 1.
+ SH050442 COST 321.75 TRAN0504 1.
+ SH050442 BAL0504 -1. BAL0542 1.
+ SH050542 COST 595.65 TRAN0505 1.
+ SH050542 BAL0505 -1. BAL0542 1.
+ SH050642 COST 265.65 TRAN0506 1.
+ SH050642 BAL0552 -1. BAL0542 1.
+ SH050842 COST 250.8 TRAN0508 1.
+ SH050842 BAL0583 -1. BAL0542 1.
+ SH050143 COST 262.35 TRAN0501 1.
+ SH050143 BAL0501 -1. BAL0543 1.
+ SH050243 COST 651.75 TRAN0502 1.
+ SH050243 BAL0502 -1. BAL0543 1.
+ SH050343 COST 41.25 TRAN0503 1.
+ SH050343 BAL0503 -1. BAL0543 1.
+ SH050443 COST 488.4 TRAN0504 1.
+ SH050443 BAL0504 -1. BAL0543 1.
+ SH050543 COST 425.7 TRAN0505 1.
+ SH050543 BAL0505 -1. BAL0543 1.
+ SH050643 COST 165. TRAN0506 1.
+ SH050643 BAL0552 -1. BAL0543 1.
+ SH050743 COST 397.65 TRAN0507 1.
+ SH050743 BAL0564 -1. BAL0543 1.
+ SH050843 COST 447.15 TRAN0508 1.
+ SH050843 BAL0583 -1. BAL0543 1.
+ SH050144 COST 262.35 TRAN0501 1.
+ SH050144 BAL0501 -1. BAL0544 1.
+ SH050244 COST 625.35 TRAN0502 1.
+ SH050244 BAL0502 -1. BAL0544 1.
+ SH050344 COST 211.2 TRAN0503 1.
+ SH050344 BAL0503 -1. BAL0544 1.
+ SH050444 COST 514.8 TRAN0504 1.
+ SH050444 BAL0504 -1. BAL0544 1.
+ SH050544 COST 511.5 TRAN0505 1.
+ SH050544 BAL0505 -1. BAL0544 1.
+ SH050644 COST 146.85 TRAN0506 1.
+ SH050644 BAL0552 -1. BAL0544 1.
+ SH050844 COST 491.7 TRAN0508 1.
+ SH050844 BAL0583 -1. BAL0544 1.
+ SH050145 COST 283.8 TRAN0501 1.
+ SH050145 BAL0501 -1. BAL0545 1.
+ SH050245 COST 719.4 TRAN0502 1.
+ SH050245 BAL0502 -1. BAL0545 1.
+ SH050345 COST 265.65 TRAN0503 1.
+ SH050345 BAL0503 -1. BAL0545 1.
+ SH050445 COST 481.8 TRAN0504 1.
+ SH050445 BAL0504 -1. BAL0545 1.
+ SH050545 COST 386.1 TRAN0505 1.
+ SH050545 BAL0505 -1. BAL0545 1.
+ SH050645 COST 315.15 TRAN0506 1.
+ SH050645 BAL0552 -1. BAL0545 1.
+ SH050745 COST 325.05 TRAN0507 1.
+ SH050745 BAL0564 -1. BAL0545 1.
+ SH050845 COST 503.25 TRAN0508 1.
+ SH050845 BAL0583 -1. BAL0545 1.
+ SH050146 COST 404.25 TRAN0501 1.
+ SH050146 BAL0501 -1. BAL0546 1.
+ SH050246 COST 450.45 TRAN0502 1.
+ SH050246 BAL0502 -1. BAL0546 1.
+ SH050346 COST 364.65 TRAN0503 1.
+ SH050346 BAL0503 -1. BAL0546 1.
+ SH050446 COST 737.55 TRAN0504 1.
+ SH050446 BAL0504 -1. BAL0546 1.
+ SH050546 COST 709.5 TRAN0505 1.
+ SH050546 BAL0505 -1. BAL0546 1.
+ SH050646 COST 424.05 TRAN0506 1.
+ SH050646 BAL0552 -1. BAL0546 1.
+ SH050846 COST 739.2 TRAN0508 1.
+ SH050846 BAL0583 -1. BAL0546 1.
+ SH050147 COST 181.5 TRAN0501 1.
+ SH050147 BAL0501 -1. BAL0547 1.
+ SH050247 COST 615.45 TRAN0502 1.
+ SH050247 BAL0502 -1. BAL0547 1.
+ SH050347 COST 262.35 TRAN0503 1.
+ SH050347 BAL0503 -1. BAL0547 1.
+ SH050447 COST 452.1 TRAN0504 1.
+ SH050447 BAL0504 -1. BAL0547 1.
+ SH050547 COST 384.45 TRAN0505 1.
+ SH050547 BAL0505 -1. BAL0547 1.
+ SH050647 COST 239.25 TRAN0506 1.
+ SH050647 BAL0552 -1. BAL0547 1.
+ SH050847 COST 402.6 TRAN0508 1.
+ SH050847 BAL0583 -1. BAL0547 1.
+ SH050148 COST 156.75 TRAN0501 1.
+ SH050148 BAL0501 -1. BAL0548 1.
+ SH050248 COST 559.35 TRAN0502 1.
+ SH050248 BAL0502 -1. BAL0548 1.
+ SH050348 COST 226.05 TRAN0503 1.
+ SH050348 BAL0503 -1. BAL0548 1.
+ SH050448 COST 379.5 TRAN0504 1.
+ SH050448 BAL0504 -1. BAL0548 1.
+ SH050548 COST 407.55 TRAN0505 1.
+ SH050548 BAL0505 -1. BAL0548 1.
+ SH050648 COST 189.75 TRAN0506 1.
+ SH050648 BAL0552 -1. BAL0548 1.
+ SH050848 COST 321.75 TRAN0508 1.
+ SH050848 BAL0583 -1. BAL0548 1.
+ SH050149 COST 542.85 TRAN0501 1.
+ SH050149 BAL0501 -1. BAL0549 1.
+ SH050249 COST 882.75 TRAN0502 1.
+ SH050249 BAL0502 -1. BAL0549 1.
+ SH050349 COST 547.8 TRAN0503 1.
+ SH050349 BAL0503 -1. BAL0549 1.
+ SH050449 COST 628.65 TRAN0504 1.
+ SH050449 BAL0504 -1. BAL0549 1.
+ SH050549 COST 250.8 TRAN0505 1.
+ SH050549 BAL0505 -1. BAL0549 1.
+ SH050649 COST 557.7 TRAN0506 1.
+ SH050649 BAL0552 -1. BAL0549 1.
+ SH050749 COST 221.1 TRAN0507 1.
+ SH050749 BAL0564 -1. BAL0549 1.
+ SH050849 COST 673.2 TRAN0508 1.
+ SH050849 BAL0583 -1. BAL0549 1.
+ SH050150 COST 397.65 TRAN0501 1.
+ SH050150 BAL0501 -1. BAL0550 1.
+ SH050250 COST 1009.8 TRAN0502 1.
+ SH050250 BAL0502 -1. BAL0550 1.
+ SH050350 COST 405.9 TRAN0503 1.
+ SH050350 BAL0503 -1. BAL0550 1.
+ SH050450 COST 602.25 TRAN0504 1.
+ SH050450 BAL0504 -1. BAL0550 1.
+ SH050550 COST 387.75 TRAN0505 1.
+ SH050550 BAL0505 -1. BAL0550 1.
+ SH050750 COST 226.05 TRAN0507 1.
+ SH050750 BAL0564 -1. BAL0550 1.
+ SH050850 COST 669.9 TRAN0508 1.
+ SH050850 BAL0583 -1. BAL0550 1.
+ SH050151 COST 547.8 TRAN0501 1.
+ SH050151 BAL0501 -1. BAL0551 1.
+ SH050251 COST 907.5 TRAN0502 1.
+ SH050251 BAL0502 -1. BAL0551 1.
+ SH050351 COST 562.65 TRAN0503 1.
+ SH050351 BAL0503 -1. BAL0551 1.
+ SH050451 COST 557.7 TRAN0504 1.
+ SH050451 BAL0504 -1. BAL0551 1.
+ SH050551 COST 202.95 TRAN0505 1.
+ SH050551 BAL0505 -1. BAL0551 1.
+ SH050751 COST 163.35 TRAN0507 1.
+ SH050751 BAL0564 -1. BAL0551 1.
+ SH050851 COST 706.2 TRAN0508 1.
+ SH050851 BAL0583 -1. BAL0551 1.
+ SH050152 COST 184.8 TRAN0501 1.
+ SH050152 BAL0501 -1. BAL0552 1.
+ SH050252 COST 495. TRAN0502 1.
+ SH050252 BAL0502 -1. BAL0552 1.
+ SH050352 COST 135.3 TRAN0503 1.
+ SH050352 BAL0503 -1. BAL0552 1.
+ SH050452 COST 531.3 TRAN0504 1.
+ SH050452 BAL0504 -1. BAL0552 1.
+ SH050552 COST 486.75 TRAN0505 1.
+ SH050552 BAL0505 -1. BAL0552 1.
+ SH050852 COST 417.45 TRAN0508 1.
+ SH050852 BAL0583 -1. BAL0552 1.
+ SH050153 COST 592.35 TRAN0501 1.
+ SH050153 BAL0501 -1. BAL0553 1.
+ SH050253 COST 1049.4 TRAN0502 1.
+ SH050253 BAL0502 -1. BAL0553 1.
+ SH050353 COST 536.25 TRAN0503 1.
+ SH050353 BAL0503 -1. BAL0553 1.
+ SH050453 COST 679.8 TRAN0504 1.
+ SH050453 BAL0504 -1. BAL0553 1.
+ SH050553 COST 303.6 TRAN0505 1.
+ SH050553 BAL0505 -1. BAL0553 1.
+ SH050653 COST 592.35 TRAN0506 1.
+ SH050653 BAL0552 -1. BAL0553 1.
+ SH050753 COST 240.9 TRAN0507 1.
+ SH050753 BAL0564 -1. BAL0553 1.
+ SH050853 COST 664.95 TRAN0508 1.
+ SH050853 BAL0583 -1. BAL0553 1.
+ SH050154 COST 305.25 TRAN0501 1.
+ SH050154 BAL0501 -1. BAL0554 1.
+ SH050254 COST 734.25 TRAN0502 1.
+ SH050254 BAL0502 -1. BAL0554 1.
+ SH050354 COST 358.05 TRAN0503 1.
+ SH050354 BAL0503 -1. BAL0554 1.
+ SH050454 COST 565.95 TRAN0504 1.
+ SH050454 BAL0504 -1. BAL0554 1.
+ SH050554 COST 351.45 TRAN0505 1.
+ SH050554 BAL0505 -1. BAL0554 1.
+ SH050654 COST 334.95 TRAN0506 1.
+ SH050654 BAL0552 -1. BAL0554 1.
+ SH050854 COST 663.3 TRAN0508 1.
+ SH050854 BAL0583 -1. BAL0554 1.
+ SH050155 COST 458.7 TRAN0501 1.
+ SH050155 BAL0501 -1. BAL0555 1.
+ SH050255 COST 790.35 TRAN0502 1.
+ SH050255 BAL0502 -1. BAL0555 1.
+ SH050355 COST 463.65 TRAN0503 1.
+ SH050355 BAL0503 -1. BAL0555 1.
+ SH050455 COST 485.1 TRAN0504 1.
+ SH050455 BAL0504 -1. BAL0555 1.
+ SH050555 COST 254.1 TRAN0505 1.
+ SH050555 BAL0505 -1. BAL0555 1.
+ SH050655 COST 478.5 TRAN0506 1.
+ SH050655 BAL0552 -1. BAL0555 1.
+ SH050755 COST 176.55 TRAN0507 1.
+ SH050755 BAL0564 -1. BAL0555 1.
+ SH050855 COST 485.1 TRAN0508 1.
+ SH050855 BAL0583 -1. BAL0555 1.
+ SH050156 COST 643.5 TRAN0501 1.
+ SH050156 BAL0501 -1. BAL0556 1.
+ SH050256 COST 955.35 TRAN0502 1.
+ SH050256 BAL0502 -1. BAL0556 1.
+ SH050356 COST 503.25 TRAN0503 1.
+ SH050356 BAL0503 -1. BAL0556 1.
+ SH050456 COST 602.25 TRAN0504 1.
+ SH050456 BAL0504 -1. BAL0556 1.
+ SH050556 COST 224.4 TRAN0505 1.
+ SH050556 BAL0505 -1. BAL0556 1.
+ SH050656 COST 559.35 TRAN0506 1.
+ SH050656 BAL0552 -1. BAL0556 1.
+ SH050756 COST 201.3 TRAN0507 1.
+ SH050756 BAL0564 -1. BAL0556 1.
+ SH050856 COST 589.05 TRAN0508 1.
+ SH050856 BAL0583 -1. BAL0556 1.
+ SH050157 COST 430.65 TRAN0501 1.
+ SH050157 BAL0501 -1. BAL0557 1.
+ SH050257 COST 858. TRAN0502 1.
+ SH050257 BAL0502 -1. BAL0557 1.
+ SH050357 COST 478.5 TRAN0503 1.
+ SH050357 BAL0503 -1. BAL0557 1.
+ SH050457 COST 386.1 TRAN0504 1.
+ SH050457 BAL0504 -1. BAL0557 1.
+ SH050557 COST 277.2 TRAN0505 1.
+ SH050557 BAL0505 -1. BAL0557 1.
+ SH050657 COST 526.35 TRAN0506 1.
+ SH050657 BAL0552 -1. BAL0557 1.
+ SH050757 COST 244.2 TRAN0507 1.
+ SH050757 BAL0564 -1. BAL0557 1.
+ SH050857 COST 381.15 TRAN0508 1.
+ SH050857 BAL0583 -1. BAL0557 1.
+ SH050158 COST 485.1 TRAN0501 1.
+ SH050158 BAL0501 -1. BAL0558 1.
+ SH050258 COST 859.65 TRAN0502 1.
+ SH050258 BAL0502 -1. BAL0558 1.
+ SH050358 COST 458.7 TRAN0503 1.
+ SH050358 BAL0503 -1. BAL0558 1.
+ SH050458 COST 565.95 TRAN0504 1.
+ SH050458 BAL0504 -1. BAL0558 1.
+ SH050558 COST 34.65 TRAN0505 1.
+ SH050558 BAL0505 -1. BAL0558 1.
+ SH050658 COST 537.9 TRAN0506 1.
+ SH050658 BAL0552 -1. BAL0558 1.
+ SH050758 COST 112.2 TRAN0507 1.
+ SH050758 BAL0564 -1. BAL0558 1.
+ SH050858 COST 419.1 TRAN0508 1.
+ SH050858 BAL0583 -1. BAL0558 1.
+ SH050159 COST 339.9 TRAN0501 1.
+ SH050159 BAL0501 -1. BAL0559 1.
+ SH050259 COST 821.7 TRAN0502 1.
+ SH050259 BAL0502 -1. BAL0559 1.
+ SH050359 COST 392.7 TRAN0503 1.
+ SH050359 BAL0503 -1. BAL0559 1.
+ SH050459 COST 402.6 TRAN0504 1.
+ SH050459 BAL0504 -1. BAL0559 1.
+ SH050559 COST 262.35 TRAN0505 1.
+ SH050559 BAL0505 -1. BAL0559 1.
+ SH050659 COST 490.05 TRAN0506 1.
+ SH050659 BAL0552 -1. BAL0559 1.
+ SH050759 COST 173.25 TRAN0507 1.
+ SH050759 BAL0564 -1. BAL0559 1.
+ SH050859 COST 420.75 TRAN0508 1.
+ SH050859 BAL0583 -1. BAL0559 1.
+ SH050160 COST 430.65 TRAN0501 1.
+ SH050160 BAL0501 -1. BAL0560 1.
+ SH050260 COST 907.5 TRAN0502 1.
+ SH050260 BAL0502 -1. BAL0560 1.
+ SH050360 COST 466.95 TRAN0503 1.
+ SH050360 BAL0503 -1. BAL0560 1.
+ SH050460 COST 514.8 TRAN0504 1.
+ SH050460 BAL0504 -1. BAL0560 1.
+ SH050560 COST 222.75 TRAN0505 1.
+ SH050560 BAL0505 -1. BAL0560 1.
+ SH050660 COST 532.95 TRAN0506 1.
+ SH050660 BAL0552 -1. BAL0560 1.
+ SH050760 COST 145.2 TRAN0507 1.
+ SH050760 BAL0564 -1. BAL0560 1.
+ SH050860 COST 493.35 TRAN0508 1.
+ SH050860 BAL0583 -1. BAL0560 1.
+ SH050163 COST 438.9 TRAN0501 1.
+ SH050163 BAL0501 -1. BAL0563 1.
+ SH050263 COST 815.1 TRAN0502 1.
+ SH050263 BAL0502 -1. BAL0563 1.
+ SH050363 COST 473.55 TRAN0503 1.
+ SH050363 BAL0503 -1. BAL0563 1.
+ SH050463 COST 608.85 TRAN0504 1.
+ SH050463 BAL0504 -1. BAL0563 1.
+ SH050563 COST 250.8 TRAN0505 1.
+ SH050563 BAL0505 -1. BAL0563 1.
+ SH050663 COST 519.75 TRAN0506 1.
+ SH050663 BAL0552 -1. BAL0563 1.
+ SH050763 COST 204.6 TRAN0507 1.
+ SH050763 BAL0564 -1. BAL0563 1.
+ SH050863 COST 660. TRAN0508 1.
+ SH050863 BAL0583 -1. BAL0563 1.
+ SH050164 COST 328.35 TRAN0501 1.
+ SH050164 BAL0501 -1. BAL0564 1.
+ SH050264 COST 867.9 TRAN0502 1.
+ SH050264 BAL0502 -1. BAL0564 1.
+ SH050364 COST 367.95 TRAN0503 1.
+ SH050364 BAL0503 -1. BAL0564 1.
+ SH050464 COST 554.4 TRAN0504 1.
+ SH050464 BAL0504 -1. BAL0564 1.
+ SH050564 COST 95.7 TRAN0505 1.
+ SH050564 BAL0505 -1. BAL0564 1.
+ SH050664 COST 523.05 TRAN0506 1.
+ SH050664 BAL0552 -1. BAL0564 1.
+ SH050864 COST 412.5 TRAN0508 1.
+ SH050864 BAL0583 -1. BAL0564 1.
+ SH050165 COST 712.8 TRAN0501 1.
+ SH050165 BAL0501 -1. BAL0565 1.
+ SH050265 COST 506.55 TRAN0502 1.
+ SH050265 BAL0502 -1. BAL0565 1.
+ SH050365 COST 833.25 TRAN0503 1.
+ SH050365 BAL0503 -1. BAL0565 1.
+ SH050465 COST 640.2 TRAN0504 1.
+ SH050465 BAL0504 -1. BAL0565 1.
+ SH050565 COST 996.6 TRAN0505 1.
+ SH050565 BAL0505 -1. BAL0565 1.
+ SH050865 COST 684.75 TRAN0508 1.
+ SH050865 BAL0583 -1. BAL0565 1.
+ SH050166 COST 924. TRAN0501 1.
+ SH050166 BAL0501 -1. BAL0566 1.
+ SH050266 COST 427.35 TRAN0502 1.
+ SH050266 BAL0502 -1. BAL0566 1.
+ SH050366 COST 953.7 TRAN0503 1.
+ SH050366 BAL0503 -1. BAL0566 1.
+ SH050466 COST 917.4 TRAN0504 1.
+ SH050466 BAL0504 -1. BAL0566 1.
+ SH050566 COST 1171.5 TRAN0505 1.
+ SH050566 BAL0505 -1. BAL0566 1.
+ SH050866 COST 924. TRAN0508 1.
+ SH050866 BAL0583 -1. BAL0566 1.
+ SH050167 COST 701.25 TRAN0501 1.
+ SH050167 BAL0501 -1. BAL0567 1.
+ SH050267 COST 382.8 TRAN0502 1.
+ SH050267 BAL0502 -1. BAL0567 1.
+ SH050367 COST 813.45 TRAN0503 1.
+ SH050367 BAL0503 -1. BAL0567 1.
+ SH050467 COST 754.05 TRAN0504 1.
+ SH050467 BAL0504 -1. BAL0567 1.
+ SH050567 COST 996.6 TRAN0505 1.
+ SH050567 BAL0505 -1. BAL0567 1.
+ SH050867 COST 755.7 TRAN0508 1.
+ SH050867 BAL0583 -1. BAL0567 1.
+ SH050168 COST 980.1 TRAN0501 1.
+ SH050168 BAL0501 -1. BAL0568 1.
+ SH050268 COST 660. TRAN0502 1.
+ SH050268 BAL0502 -1. BAL0568 1.
+ SH050368 COST 924. TRAN0503 1.
+ SH050368 BAL0503 -1. BAL0568 1.
+ SH050468 COST 1158.3 TRAN0504 1.
+ SH050468 BAL0504 -1. BAL0568 1.
+ SH050568 COST 1560.9 TRAN0505 1.
+ SH050568 BAL0505 -1. BAL0568 1.
+ SH050868 COST 1239.15 TRAN0508 1.
+ SH050868 BAL0583 -1. BAL0568 1.
+ SH050169 COST 889.35 TRAN0501 1.
+ SH050169 BAL0501 -1. BAL0569 1.
+ SH050269 COST 364.65 TRAN0502 1.
+ SH050269 BAL0502 -1. BAL0569 1.
+ SH050369 COST 841.5 TRAN0503 1.
+ SH050369 BAL0503 -1. BAL0569 1.
+ SH050469 COST 1026.3 TRAN0504 1.
+ SH050469 BAL0504 -1. BAL0569 1.
+ SH050569 COST 1065.9 TRAN0505 1.
+ SH050569 BAL0505 -1. BAL0569 1.
+ SH050869 COST 1085.7 TRAN0508 1.
+ SH050869 BAL0583 -1. BAL0569 1.
+ SH050171 COST 726. TRAN0501 1.
+ SH050171 BAL0501 -1. BAL0571 1.
+ SH050371 COST 864.6 TRAN0503 1.
+ SH050371 BAL0503 -1. BAL0571 1.
+ SH050471 COST 859.65 TRAN0504 1.
+ SH050471 BAL0504 -1. BAL0571 1.
+ SH050571 COST 958.65 TRAN0505 1.
+ SH050571 BAL0505 -1. BAL0571 1.
+ SH050671 COST 645.15 TRAN0506 1.
+ SH050671 BAL0552 -1. BAL0571 1.
+ SH050771 COST 1161.6 TRAN0507 1.
+ SH050771 BAL0564 -1. BAL0571 1.
+ SH050871 COST 879.45 TRAN0508 1.
+ SH050871 BAL0583 -1. BAL0571 1.
+ SH050172 COST 968.55 TRAN0501 1.
+ SH050172 BAL0501 -1. BAL0572 1.
+ SH050272 COST 895.95 TRAN0502 1.
+ SH050272 BAL0502 -1. BAL0572 1.
+ SH050372 COST 1018.05 TRAN0503 1.
+ SH050372 BAL0503 -1. BAL0572 1.
+ SH050472 COST 940.5 TRAN0504 1.
+ SH050472 BAL0504 -1. BAL0572 1.
+ SH050572 COST 1258.95 TRAN0505 1.
+ SH050572 BAL0505 -1. BAL0572 1.
+ SH050872 COST 940.5 TRAN0508 1.
+ SH050872 BAL0583 -1. BAL0572 1.
+ SH050173 COST 643.5 TRAN0501 1.
+ SH050173 BAL0501 -1. BAL0573 1.
+ SH050273 COST 602.25 TRAN0502 1.
+ SH050273 BAL0502 -1. BAL0573 1.
+ SH050373 COST 557.7 TRAN0503 1.
+ SH050373 BAL0503 -1. BAL0573 1.
+ SH050473 COST 754.05 TRAN0504 1.
+ SH050473 BAL0504 -1. BAL0573 1.
+ SH050573 COST 930.6 TRAN0505 1.
+ SH050573 BAL0505 -1. BAL0573 1.
+ SH050673 COST 503.25 TRAN0506 1.
+ SH050673 BAL0552 -1. BAL0573 1.
+ SH050873 COST 831.6 TRAN0508 1.
+ SH050873 BAL0583 -1. BAL0573 1.
+ SH050174 COST 904.2 TRAN0501 1.
+ SH050174 BAL0501 -1. BAL0574 1.
+ SH050274 COST 346.5 TRAN0502 1.
+ SH050274 BAL0502 -1. BAL0574 1.
+ SH050374 COST 940.5 TRAN0503 1.
+ SH050374 BAL0503 -1. BAL0574 1.
+ SH050474 COST 1051.05 TRAN0504 1.
+ SH050474 BAL0504 -1. BAL0574 1.
+ SH050574 COST 1209.45 TRAN0505 1.
+ SH050574 BAL0505 -1. BAL0574 1.
+ SH050874 COST 1021.35 TRAN0508 1.
+ SH050874 BAL0583 -1. BAL0574 1.
+ SH050275 COST 914.1 TRAN0502 1.
+ SH050275 BAL0502 -1. BAL0575 1.
+ SH050176 COST 762.3 TRAN0501 1.
+ SH050176 BAL0501 -1. BAL0576 1.
+ SH050276 COST 661.65 TRAN0502 1.
+ SH050276 BAL0502 -1. BAL0576 1.
+ SH050376 COST 664.95 TRAN0503 1.
+ SH050376 BAL0503 -1. BAL0576 1.
+ SH050476 COST 1039.5 TRAN0504 1.
+ SH050476 BAL0504 -1. BAL0576 1.
+ SH050576 COST 1039.5 TRAN0505 1.
+ SH050576 BAL0505 -1. BAL0576 1.
+ SH050676 COST 628.65 TRAN0506 1.
+ SH050676 BAL0552 -1. BAL0576 1.
+ SH050876 COST 1282.05 TRAN0508 1.
+ SH050876 BAL0583 -1. BAL0576 1.
+ SH050177 COST 717.75 TRAN0501 1.
+ SH050177 BAL0501 -1. BAL0577 1.
+ SH050277 COST 448.8 TRAN0502 1.
+ SH050277 BAL0502 -1. BAL0577 1.
+ SH050377 COST 760.65 TRAN0503 1.
+ SH050377 BAL0503 -1. BAL0577 1.
+ SH050477 COST 661.65 TRAN0504 1.
+ SH050477 BAL0504 -1. BAL0577 1.
+ SH050577 COST 924. TRAN0505 1.
+ SH050577 BAL0505 -1. BAL0577 1.
+ SH050877 COST 528. TRAN0508 1.
+ SH050877 BAL0583 -1. BAL0577 1.
+ SH050178 COST 1255.65 TRAN0501 1.
+ SH050178 BAL0501 -1. BAL0578 1.
+ SH050278 COST 729.3 TRAN0502 1.
+ SH050278 BAL0502 -1. BAL0578 1.
+ SH050378 COST 1291.95 TRAN0503 1.
+ SH050378 BAL0503 -1. BAL0578 1.
+ SH050478 COST 1130.25 TRAN0504 1.
+ SH050478 BAL0504 -1. BAL0578 1.
+ SH050578 COST 1450.35 TRAN0505 1.
+ SH050578 BAL0505 -1. BAL0578 1.
+ SH050878 COST 1263.9 TRAN0508 1.
+ SH050878 BAL0583 -1. BAL0578 1.
+ SH050179 COST 1179.75 TRAN0501 1.
+ SH050179 BAL0501 -1. BAL0579 1.
+ SH050279 COST 443.85 TRAN0502 1.
+ SH050279 BAL0502 -1. BAL0579 1.
+ SH050379 COST 1140.15 TRAN0503 1.
+ SH050379 BAL0503 -1. BAL0579 1.
+ SH050479 COST 1188. TRAN0504 1.
+ SH050479 BAL0504 -1. BAL0579 1.
+ SH050879 COST 1164.9 TRAN0508 1.
+ SH050879 BAL0583 -1. BAL0579 1.
+ SH050180 COST 523.05 TRAN0501 1.
+ SH050180 BAL0501 -1. BAL0580 1.
+ SH050280 COST 651.75 TRAN0502 1.
+ SH050280 BAL0502 -1. BAL0580 1.
+ SH050380 COST 721.05 TRAN0503 1.
+ SH050380 BAL0503 -1. BAL0580 1.
+ SH050480 COST 617.1 TRAN0504 1.
+ SH050480 BAL0504 -1. BAL0580 1.
+ SH050580 COST 833.25 TRAN0505 1.
+ SH050580 BAL0505 -1. BAL0580 1.
+ SH050880 COST 396. TRAN0508 1.
+ SH050880 BAL0583 -1. BAL0580 1.
+ SH050182 COST 960.3 TRAN0501 1.
+ SH050182 BAL0501 -1. BAL0582 1.
+ SH050282 COST 542.85 TRAN0502 1.
+ SH050282 BAL0502 -1. BAL0582 1.
+ SH050382 COST 1080.75 TRAN0503 1.
+ SH050382 BAL0503 -1. BAL0582 1.
+ SH050482 COST 1164.9 TRAN0504 1.
+ SH050482 BAL0504 -1. BAL0582 1.
+ SH050582 COST 1892.55 TRAN0505 1.
+ SH050582 BAL0505 -1. BAL0582 1.
+ SH050882 COST 1291.95 TRAN0508 1.
+ SH050882 BAL0583 -1. BAL0582 1.
+ SH050183 COST 292.05 TRAN0501 1.
+ SH050183 BAL0501 -1. BAL0583 1.
+ SH050283 COST 858. TRAN0502 1.
+ SH050283 BAL0502 -1. BAL0583 1.
+ SH050383 COST 448.8 TRAN0503 1.
+ SH050383 BAL0503 -1. BAL0583 1.
+ SH050483 COST 97.35 TRAN0504 1.
+ SH050483 BAL0504 -1. BAL0583 1.
+ SH050583 COST 572.55 TRAN0505 1.
+ SH050583 BAL0505 -1. BAL0583 1.
+ SH050683 COST 409.2 TRAN0506 1.
+ SH050683 BAL0552 -1. BAL0583 1.
+ SH050184 COST 501.6 TRAN0501 1.
+ SH050184 BAL0501 -1. BAL0584 1.
+ SH050284 COST 316.8 TRAN0502 1.
+ SH050284 BAL0502 -1. BAL0584 1.
+ SH050384 COST 600.6 TRAN0503 1.
+ SH050384 BAL0503 -1. BAL0584 1.
+ SH050484 COST 610.5 TRAN0504 1.
+ SH050484 BAL0504 -1. BAL0584 1.
+ SH050584 COST 808.5 TRAN0505 1.
+ SH050584 BAL0505 -1. BAL0584 1.
+ SH050684 COST 503.25 TRAN0506 1.
+ SH050684 BAL0552 -1. BAL0584 1.
+ SH050884 COST 640.2 TRAN0508 1.
+ SH050884 BAL0583 -1. BAL0584 1.
+ SH060201 COST 365.31 TRAN0602 1.
+ SH060201 BAL0602 -1. BAL0601 1.
+ SH060301 COST 140.22 TRAN0603 1.
+ SH060301 BAL0603 -1. BAL0601 1.
+ SH060401 COST 255.84 TRAN0604 1.
+ SH060401 BAL0604 -1. BAL0601 1.
+ SH060501 COST 291.51 TRAN0605 1.
+ SH060501 BAL0605 -1. BAL0601 1.
+ SH060601 COST 154.98 TRAN0606 1.
+ SH060601 BAL0652 -1. BAL0601 1.
+ SH060801 COST 175.89 TRAN0608 1.
+ SH060801 BAL0683 -1. BAL0601 1.
+ SH060102 COST 583.02 TRAN0601 1.
+ SH060102 BAL0601 -1. BAL0602 1.
+ SH060302 COST 512.91 TRAN0603 1.
+ SH060302 BAL0603 -1. BAL0602 1.
+ SH060402 COST 752.76 TRAN0604 1.
+ SH060402 BAL0604 -1. BAL0602 1.
+ SH060502 COST 911.43 TRAN0605 1.
+ SH060502 BAL0605 -1. BAL0602 1.
+ SH060602 COST 464.94 TRAN0606 1.
+ SH060602 BAL0652 -1. BAL0602 1.
+ SH060802 COST 640.83 TRAN0608 1.
+ SH060802 BAL0683 -1. BAL0602 1.
+ SH060103 COST 301.35 TRAN0601 1.
+ SH060103 BAL0601 -1. BAL0603 1.
+ SH060203 COST 583.02 TRAN0602 1.
+ SH060203 BAL0602 -1. BAL0603 1.
+ SH060403 COST 451.41 TRAN0604 1.
+ SH060403 BAL0604 -1. BAL0603 1.
+ SH060503 COST 349.32 TRAN0605 1.
+ SH060503 BAL0605 -1. BAL0603 1.
+ SH060603 COST 110.7 TRAN0606 1.
+ SH060603 BAL0652 -1. BAL0603 1.
+ SH060803 COST 313.65 TRAN0608 1.
+ SH060803 BAL0683 -1. BAL0603 1.
+ SH060104 COST 214.02 TRAN0601 1.
+ SH060104 BAL0601 -1. BAL0604 1.
+ SH060204 COST 618.69 TRAN0602 1.
+ SH060204 BAL0602 -1. BAL0604 1.
+ SH060304 COST 298.89 TRAN0603 1.
+ SH060304 BAL0603 -1. BAL0604 1.
+ SH060504 COST 392.37 TRAN0605 1.
+ SH060504 BAL0605 -1. BAL0604 1.
+ SH060604 COST 301.35 TRAN0606 1.
+ SH060604 BAL0652 -1. BAL0604 1.
+ SH060704 COST 330.87 TRAN0607 1.
+ SH060704 BAL0664 -1. BAL0604 1.
+ SH060804 COST 71.34 TRAN0608 1.
+ SH060804 BAL0683 -1. BAL0604 1.
+ SH060105 COST 332.1 TRAN0601 1.
+ SH060105 BAL0601 -1. BAL0605 1.
+ SH060205 COST 634.68 TRAN0602 1.
+ SH060205 BAL0602 -1. BAL0605 1.
+ SH060305 COST 349.32 TRAN0603 1.
+ SH060305 BAL0603 -1. BAL0605 1.
+ SH060405 COST 350.55 TRAN0604 1.
+ SH060405 BAL0604 -1. BAL0605 1.
+ SH060605 COST 400.98 TRAN0606 1.
+ SH060605 BAL0652 -1. BAL0605 1.
+ SH060705 COST 410.82 TRAN0607 1.
+ SH060705 BAL0664 -1. BAL0605 1.
+ SH060805 COST 333.33 TRAN0608 1.
+ SH060805 BAL0683 -1. BAL0605 1.
+ SH060106 COST 244.77 TRAN0601 1.
+ SH060106 BAL0601 -1. BAL0606 1.
+ SH060206 COST 512.91 TRAN0602 1.
+ SH060206 BAL0602 -1. BAL0606 1.
+ SH060306 COST 261.99 TRAN0603 1.
+ SH060306 BAL0603 -1. BAL0606 1.
+ SH060406 COST 269.37 TRAN0604 1.
+ SH060406 BAL0604 -1. BAL0606 1.
+ SH060506 COST 309.96 TRAN0605 1.
+ SH060506 BAL0605 -1. BAL0606 1.
+ SH060606 COST 253.38 TRAN0606 1.
+ SH060606 BAL0652 -1. BAL0606 1.
+ SH060706 COST 246. TRAN0607 1.
+ SH060706 BAL0664 -1. BAL0606 1.
+ SH060806 COST 185.73 TRAN0608 1.
+ SH060806 BAL0683 -1. BAL0606 1.
+ SH060107 COST 25.83 TRAN0601 1.
+ SH060107 BAL0601 -1. BAL0607 1.
+ SH060207 COST 359.16 TRAN0602 1.
+ SH060207 BAL0602 -1. BAL0607 1.
+ SH060307 COST 152.52 TRAN0603 1.
+ SH060307 BAL0603 -1. BAL0607 1.
+ SH060407 COST 254.61 TRAN0604 1.
+ SH060407 BAL0604 -1. BAL0607 1.
+ SH060507 COST 281.67 TRAN0605 1.
+ SH060507 BAL0605 -1. BAL0607 1.
+ SH060607 COST 153.75 TRAN0606 1.
+ SH060607 BAL0652 -1. BAL0607 1.
+ SH060707 COST 285.36 TRAN0607 1.
+ SH060707 BAL0664 -1. BAL0607 1.
+ SH060807 COST 190.65 TRAN0608 1.
+ SH060807 BAL0683 -1. BAL0607 1.
+ SH060108 COST 81.18 TRAN0601 1.
+ SH060108 BAL0601 -1. BAL0608 1.
+ SH060208 COST 462.48 TRAN0602 1.
+ SH060208 BAL0602 -1. BAL0608 1.
+ SH060308 COST 173.43 TRAN0603 1.
+ SH060308 BAL0603 -1. BAL0608 1.
+ SH060408 COST 303.81 TRAN0604 1.
+ SH060408 BAL0604 -1. BAL0608 1.
+ SH060508 COST 223.86 TRAN0605 1.
+ SH060508 BAL0605 -1. BAL0608 1.
+ SH060608 COST 204.18 TRAN0606 1.
+ SH060608 BAL0652 -1. BAL0608 1.
+ SH060808 COST 230.01 TRAN0608 1.
+ SH060808 BAL0683 -1. BAL0608 1.
+ SH060109 COST 169.74 TRAN0601 1.
+ SH060109 BAL0601 -1. BAL0609 1.
+ SH060209 COST 471.09 TRAN0602 1.
+ SH060209 BAL0602 -1. BAL0609 1.
+ SH060309 COST 206.64 TRAN0603 1.
+ SH060309 BAL0603 -1. BAL0609 1.
+ SH060409 COST 311.19 TRAN0604 1.
+ SH060409 BAL0604 -1. BAL0609 1.
+ SH060509 COST 293.97 TRAN0605 1.
+ SH060509 BAL0605 -1. BAL0609 1.
+ SH060709 COST 241.08 TRAN0607 1.
+ SH060709 BAL0664 -1. BAL0609 1.
+ SH060809 COST 238.62 TRAN0608 1.
+ SH060809 BAL0683 -1. BAL0609 1.
+ SH060110 COST 303.81 TRAN0601 1.
+ SH060110 BAL0601 -1. BAL0610 1.
+ SH060210 COST 194.34 TRAN0602 1.
+ SH060210 BAL0602 -1. BAL0610 1.
+ SH060310 COST 295.2 TRAN0603 1.
+ SH060310 BAL0603 -1. BAL0610 1.
+ SH060410 COST 441.57 TRAN0604 1.
+ SH060410 BAL0604 -1. BAL0610 1.
+ SH060510 COST 473.55 TRAN0605 1.
+ SH060510 BAL0605 -1. BAL0610 1.
+ SH060610 COST 276.75 TRAN0606 1.
+ SH060610 BAL0652 -1. BAL0610 1.
+ SH060810 COST 375.15 TRAN0608 1.
+ SH060810 BAL0683 -1. BAL0610 1.
+ SH060111 COST 130.38 TRAN0601 1.
+ SH060111 BAL0601 -1. BAL0611 1.
+ SH060211 COST 608.85 TRAN0602 1.
+ SH060211 BAL0602 -1. BAL0611 1.
+ SH060311 COST 305.04 TRAN0603 1.
+ SH060311 BAL0603 -1. BAL0611 1.
+ SH060411 COST 170.97 TRAN0604 1.
+ SH060411 BAL0604 -1. BAL0611 1.
+ SH060511 COST 419.43 TRAN0605 1.
+ SH060511 BAL0605 -1. BAL0611 1.
+ SH060611 COST 241.08 TRAN0606 1.
+ SH060611 BAL0652 -1. BAL0611 1.
+ SH060811 COST 125.46 TRAN0608 1.
+ SH060811 BAL0683 -1. BAL0611 1.
+ SH060112 COST 108.24 TRAN0601 1.
+ SH060112 BAL0601 -1. BAL0612 1.
+ SH060212 COST 416.97 TRAN0602 1.
+ SH060212 BAL0602 -1. BAL0612 1.
+ SH060312 COST 179.58 TRAN0603 1.
+ SH060312 BAL0603 -1. BAL0612 1.
+ SH060412 COST 246. TRAN0604 1.
+ SH060412 BAL0604 -1. BAL0612 1.
+ SH060512 COST 328.41 TRAN0605 1.
+ SH060512 BAL0605 -1. BAL0612 1.
+ SH060612 COST 178.35 TRAN0606 1.
+ SH060612 BAL0652 -1. BAL0612 1.
+ SH060812 COST 179.58 TRAN0608 1.
+ SH060812 BAL0683 -1. BAL0612 1.
+ SH060114 COST 174.66 TRAN0601 1.
+ SH060114 BAL0601 -1. BAL0614 1.
+ SH060214 COST 506.76 TRAN0602 1.
+ SH060214 BAL0602 -1. BAL0614 1.
+ SH060314 COST 241.08 TRAN0603 1.
+ SH060314 BAL0603 -1. BAL0614 1.
+ SH060414 COST 244.77 TRAN0604 1.
+ SH060414 BAL0604 -1. BAL0614 1.
+ SH060514 COST 432.96 TRAN0605 1.
+ SH060514 BAL0605 -1. BAL0614 1.
+ SH060614 COST 231.24 TRAN0606 1.
+ SH060614 BAL0652 -1. BAL0614 1.
+ SH060814 COST 154.98 TRAN0608 1.
+ SH060814 BAL0683 -1. BAL0614 1.
+ SH060115 COST 372.69 TRAN0601 1.
+ SH060115 BAL0601 -1. BAL0615 1.
+ SH060215 COST 195.57 TRAN0602 1.
+ SH060215 BAL0602 -1. BAL0615 1.
+ SH060315 COST 287.82 TRAN0603 1.
+ SH060315 BAL0603 -1. BAL0615 1.
+ SH060415 COST 585.48 TRAN0604 1.
+ SH060415 BAL0604 -1. BAL0615 1.
+ SH060515 COST 489.54 TRAN0605 1.
+ SH060515 BAL0605 -1. BAL0615 1.
+ SH060615 COST 231.24 TRAN0606 1.
+ SH060615 BAL0652 -1. BAL0615 1.
+ SH060815 COST 458.79 TRAN0608 1.
+ SH060815 BAL0683 -1. BAL0615 1.
+ SH060116 COST 194.34 TRAN0601 1.
+ SH060116 BAL0601 -1. BAL0616 1.
+ SH060216 COST 344.4 TRAN0602 1.
+ SH060216 BAL0602 -1. BAL0616 1.
+ SH060316 COST 279.21 TRAN0603 1.
+ SH060316 BAL0603 -1. BAL0616 1.
+ SH060416 COST 353.01 TRAN0604 1.
+ SH060416 BAL0604 -1. BAL0616 1.
+ SH060516 COST 392.37 TRAN0605 1.
+ SH060516 BAL0605 -1. BAL0616 1.
+ SH060616 COST 161.13 TRAN0606 1.
+ SH060616 BAL0652 -1. BAL0616 1.
+ SH060816 COST 252.15 TRAN0608 1.
+ SH060816 BAL0683 -1. BAL0616 1.
+ SH060117 COST 185.73 TRAN0601 1.
+ SH060117 BAL0601 -1. BAL0617 1.
+ SH060217 COST 621.15 TRAN0602 1.
+ SH060217 BAL0602 -1. BAL0617 1.
+ SH060317 COST 337.02 TRAN0603 1.
+ SH060317 BAL0603 -1. BAL0617 1.
+ SH060417 COST 70.11 TRAN0604 1.
+ SH060417 BAL0604 -1. BAL0617 1.
+ SH060517 COST 366.54 TRAN0605 1.
+ SH060517 BAL0605 -1. BAL0617 1.
+ SH060717 COST 362.85 TRAN0607 1.
+ SH060717 BAL0664 -1. BAL0617 1.
+ SH060817 COST 33.21 TRAN0608 1.
+ SH060817 BAL0683 -1. BAL0617 1.
+ SH060118 COST 215.25 TRAN0601 1.
+ SH060118 BAL0601 -1. BAL0618 1.
+ SH060218 COST 444.03 TRAN0602 1.
+ SH060218 BAL0602 -1. BAL0618 1.
+ SH060318 COST 332.1 TRAN0603 1.
+ SH060318 BAL0603 -1. BAL0618 1.
+ SH060418 COST 189.42 TRAN0604 1.
+ SH060418 BAL0604 -1. BAL0618 1.
+ SH060518 COST 500.61 TRAN0605 1.
+ SH060518 BAL0605 -1. BAL0618 1.
+ SH060618 COST 432.96 TRAN0606 1.
+ SH060618 BAL0652 -1. BAL0618 1.
+ SH060818 COST 126.69 TRAN0608 1.
+ SH060818 BAL0683 -1. BAL0618 1.
+ SH060119 COST 305.04 TRAN0601 1.
+ SH060119 BAL0601 -1. BAL0619 1.
+ SH060219 COST 845.01 TRAN0602 1.
+ SH060219 BAL0602 -1. BAL0619 1.
+ SH060319 COST 389.91 TRAN0603 1.
+ SH060319 BAL0603 -1. BAL0619 1.
+ SH060419 COST 195.57 TRAN0604 1.
+ SH060419 BAL0604 -1. BAL0619 1.
+ SH060519 COST 255.84 TRAN0605 1.
+ SH060519 BAL0605 -1. BAL0619 1.
+ SH060619 COST 424.35 TRAN0606 1.
+ SH060619 BAL0652 -1. BAL0619 1.
+ SH060819 COST 121.77 TRAN0608 1.
+ SH060819 BAL0683 -1. BAL0619 1.
+ SH060120 COST 252.15 TRAN0601 1.
+ SH060120 BAL0601 -1. BAL0620 1.
+ SH060220 COST 840.09 TRAN0602 1.
+ SH060220 BAL0602 -1. BAL0620 1.
+ SH060320 COST 365.31 TRAN0603 1.
+ SH060320 BAL0603 -1. BAL0620 1.
+ SH060420 COST 138.99 TRAN0604 1.
+ SH060420 BAL0604 -1. BAL0620 1.
+ SH060520 COST 357.93 TRAN0605 1.
+ SH060520 BAL0605 -1. BAL0620 1.
+ SH060820 COST 154.98 TRAN0608 1.
+ SH060820 BAL0683 -1. BAL0620 1.
+ SH060121 COST 495.69 TRAN0601 1.
+ SH060121 BAL0601 -1. BAL0621 1.
+ SH060221 COST 452.64 TRAN0602 1.
+ SH060221 BAL0602 -1. BAL0621 1.
+ SH060321 COST 548.58 TRAN0603 1.
+ SH060321 BAL0603 -1. BAL0621 1.
+ SH060421 COST 393.6 TRAN0604 1.
+ SH060421 BAL0604 -1. BAL0621 1.
+ SH060521 COST 676.5 TRAN0605 1.
+ SH060521 BAL0605 -1. BAL0621 1.
+ SH060821 COST 393.6 TRAN0608 1.
+ SH060821 BAL0683 -1. BAL0621 1.
+ SH060122 COST 305.04 TRAN0601 1.
+ SH060122 BAL0601 -1. BAL0622 1.
+ SH060222 COST 710.94 TRAN0602 1.
+ SH060222 BAL0602 -1. BAL0622 1.
+ SH060322 COST 367.77 TRAN0603 1.
+ SH060322 BAL0603 -1. BAL0622 1.
+ SH060422 COST 275.52 TRAN0604 1.
+ SH060422 BAL0604 -1. BAL0622 1.
+ SH060522 COST 220.17 TRAN0605 1.
+ SH060522 BAL0605 -1. BAL0622 1.
+ SH060622 COST 381.3 TRAN0606 1.
+ SH060622 BAL0652 -1. BAL0622 1.
+ SH060822 COST 170.97 TRAN0608 1.
+ SH060822 BAL0683 -1. BAL0622 1.
+ SH060123 COST 287.82 TRAN0601 1.
+ SH060123 BAL0601 -1. BAL0623 1.
+ SH060223 COST 665.43 TRAN0602 1.
+ SH060223 BAL0602 -1. BAL0623 1.
+ SH060323 COST 353.01 TRAN0603 1.
+ SH060323 BAL0603 -1. BAL0623 1.
+ SH060423 COST 205.41 TRAN0604 1.
+ SH060423 BAL0604 -1. BAL0623 1.
+ SH060523 COST 204.18 TRAN0605 1.
+ SH060523 BAL0605 -1. BAL0623 1.
+ SH060823 COST 170.97 TRAN0608 1.
+ SH060823 BAL0683 -1. BAL0623 1.
+ SH060124 COST 1766.28 TRAN0601 1.
+ SH060124 BAL0601 -1. BAL0624 1.
+ SH060125 COST 476.01 TRAN0601 1.
+ SH060125 BAL0601 -1. BAL0625 1.
+ SH060225 COST 525.21 TRAN0602 1.
+ SH060225 BAL0602 -1. BAL0625 1.
+ SH060325 COST 628.53 TRAN0603 1.
+ SH060325 BAL0603 -1. BAL0625 1.
+ SH060425 COST 428.04 TRAN0604 1.
+ SH060425 BAL0604 -1. BAL0625 1.
+ SH060525 COST 696.18 TRAN0605 1.
+ SH060525 BAL0605 -1. BAL0625 1.
+ SH060625 COST 495.69 TRAN0606 1.
+ SH060625 BAL0652 -1. BAL0625 1.
+ SH060825 COST 375.15 TRAN0608 1.
+ SH060825 BAL0683 -1. BAL0625 1.
+ SH060426 COST 332.1 TRAN0604 1.
+ SH060426 BAL0604 -1. BAL0626 1.
+ SH060127 COST 287.82 TRAN0601 1.
+ SH060127 BAL0601 -1. BAL0627 1.
+ SH060227 COST 349.32 TRAN0602 1.
+ SH060227 BAL0602 -1. BAL0627 1.
+ SH060327 COST 355.47 TRAN0603 1.
+ SH060327 BAL0603 -1. BAL0627 1.
+ SH060427 COST 412.05 TRAN0604 1.
+ SH060427 BAL0604 -1. BAL0627 1.
+ SH060527 COST 464.94 TRAN0605 1.
+ SH060527 BAL0605 -1. BAL0627 1.
+ SH060627 COST 329.64 TRAN0606 1.
+ SH060627 BAL0652 -1. BAL0627 1.
+ SH060827 COST 309.96 TRAN0608 1.
+ SH060827 BAL0683 -1. BAL0627 1.
+ SH060128 COST 298.89 TRAN0601 1.
+ SH060128 BAL0601 -1. BAL0628 1.
+ SH060228 COST 699.87 TRAN0602 1.
+ SH060228 BAL0602 -1. BAL0628 1.
+ SH060328 COST 364.08 TRAN0603 1.
+ SH060328 BAL0603 -1. BAL0628 1.
+ SH060428 COST 362.85 TRAN0604 1.
+ SH060428 BAL0604 -1. BAL0628 1.
+ SH060528 COST 125.46 TRAN0605 1.
+ SH060528 BAL0605 -1. BAL0628 1.
+ SH060628 COST 321.03 TRAN0606 1.
+ SH060628 BAL0652 -1. BAL0628 1.
+ SH060728 COST 131.61 TRAN0607 1.
+ SH060728 BAL0664 -1. BAL0628 1.
+ SH060828 COST 312.42 TRAN0608 1.
+ SH060828 BAL0683 -1. BAL0628 1.
+ SH060129 COST 274.29 TRAN0601 1.
+ SH060129 BAL0601 -1. BAL0629 1.
+ SH060229 COST 570.72 TRAN0602 1.
+ SH060229 BAL0602 -1. BAL0629 1.
+ SH060329 COST 296.43 TRAN0603 1.
+ SH060329 BAL0603 -1. BAL0629 1.
+ SH060429 COST 244.77 TRAN0604 1.
+ SH060429 BAL0604 -1. BAL0629 1.
+ SH060529 COST 528.9 TRAN0605 1.
+ SH060529 BAL0605 -1. BAL0629 1.
+ SH060629 COST 321.03 TRAN0606 1.
+ SH060629 BAL0652 -1. BAL0629 1.
+ SH060829 COST 177.12 TRAN0608 1.
+ SH060829 BAL0683 -1. BAL0629 1.
+ SH060130 COST 573.18 TRAN0601 1.
+ SH060130 BAL0601 -1. BAL0630 1.
+ SH060230 COST 536.28 TRAN0602 1.
+ SH060230 BAL0602 -1. BAL0630 1.
+ SH060330 COST 643.29 TRAN0603 1.
+ SH060330 BAL0603 -1. BAL0630 1.
+ SH060430 COST 373.92 TRAN0604 1.
+ SH060430 BAL0604 -1. BAL0630 1.
+ SH060530 COST 548.58 TRAN0605 1.
+ SH060530 BAL0605 -1. BAL0630 1.
+ SH060830 COST 469.86 TRAN0608 1.
+ SH060830 BAL0683 -1. BAL0630 1.
+ SH060131 COST 136.53 TRAN0601 1.
+ SH060131 BAL0601 -1. BAL0631 1.
+ SH060231 COST 431.73 TRAN0602 1.
+ SH060231 BAL0602 -1. BAL0631 1.
+ SH060331 COST 135.3 TRAN0603 1.
+ SH060331 BAL0603 -1. BAL0631 1.
+ SH060431 COST 311.19 TRAN0604 1.
+ SH060431 BAL0604 -1. BAL0631 1.
+ SH060531 COST 377.61 TRAN0605 1.
+ SH060531 BAL0605 -1. BAL0631 1.
+ SH060631 COST 137.76 TRAN0606 1.
+ SH060631 BAL0652 -1. BAL0631 1.
+ SH060831 COST 274.29 TRAN0608 1.
+ SH060831 BAL0683 -1. BAL0631 1.
+ SH060132 COST 367.77 TRAN0601 1.
+ SH060132 BAL0601 -1. BAL0632 1.
+ SH060232 COST 587.94 TRAN0602 1.
+ SH060232 BAL0602 -1. BAL0632 1.
+ SH060332 COST 520.29 TRAN0603 1.
+ SH060332 BAL0603 -1. BAL0632 1.
+ SH060432 COST 193.11 TRAN0604 1.
+ SH060432 BAL0604 -1. BAL0632 1.
+ SH060532 COST 482.16 TRAN0605 1.
+ SH060532 BAL0605 -1. BAL0632 1.
+ SH060832 COST 221.4 TRAN0608 1.
+ SH060832 BAL0683 -1. BAL0632 1.
+ SH060133 COST 606.39 TRAN0601 1.
+ SH060133 BAL0601 -1. BAL0633 1.
+ SH060233 COST 492. TRAN0602 1.
+ SH060233 BAL0602 -1. BAL0633 1.
+ SH060333 COST 667.89 TRAN0603 1.
+ SH060333 BAL0603 -1. BAL0633 1.
+ SH060433 COST 547.35 TRAN0604 1.
+ SH060433 BAL0604 -1. BAL0633 1.
+ SH060533 COST 776.13 TRAN0605 1.
+ SH060533 BAL0605 -1. BAL0633 1.
+ SH060833 COST 468.63 TRAN0608 1.
+ SH060833 BAL0683 -1. BAL0633 1.
+ SH060134 COST 474.78 TRAN0601 1.
+ SH060134 BAL0601 -1. BAL0634 1.
+ SH060234 COST 805.65 TRAN0602 1.
+ SH060234 BAL0602 -1. BAL0634 1.
+ SH060334 COST 618.69 TRAN0603 1.
+ SH060334 BAL0603 -1. BAL0634 1.
+ SH060434 COST 259.53 TRAN0604 1.
+ SH060434 BAL0604 -1. BAL0634 1.
+ SH060534 COST 542.43 TRAN0605 1.
+ SH060534 BAL0605 -1. BAL0634 1.
+ SH060834 COST 323.49 TRAN0608 1.
+ SH060834 BAL0683 -1. BAL0634 1.
+ SH060135 COST 567.03 TRAN0601 1.
+ SH060135 BAL0601 -1. BAL0635 1.
+ SH060235 COST 547.35 TRAN0602 1.
+ SH060235 BAL0602 -1. BAL0635 1.
+ SH060335 COST 463.71 TRAN0603 1.
+ SH060335 BAL0603 -1. BAL0635 1.
+ SH060435 COST 150.06 TRAN0604 1.
+ SH060435 BAL0604 -1. BAL0635 1.
+ SH060535 COST 530.13 TRAN0605 1.
+ SH060535 BAL0605 -1. BAL0635 1.
+ SH060835 COST 289.05 TRAN0608 1.
+ SH060835 BAL0683 -1. BAL0635 1.
+ SH060136 COST 252.15 TRAN0601 1.
+ SH060136 BAL0601 -1. BAL0636 1.
+ SH060236 COST 551.04 TRAN0602 1.
+ SH060236 BAL0602 -1. BAL0636 1.
+ SH060336 COST 130.38 TRAN0603 1.
+ SH060336 BAL0603 -1. BAL0636 1.
+ SH060436 COST 455.1 TRAN0604 1.
+ SH060436 BAL0604 -1. BAL0636 1.
+ SH060536 COST 425.58 TRAN0605 1.
+ SH060536 BAL0605 -1. BAL0636 1.
+ SH060636 COST 135.3 TRAN0606 1.
+ SH060636 BAL0652 -1. BAL0636 1.
+ SH060836 COST 394.83 TRAN0608 1.
+ SH060836 BAL0683 -1. BAL0636 1.
+ SH060137 COST 113.16 TRAN0601 1.
+ SH060137 BAL0601 -1. BAL0637 1.
+ SH060237 COST 420.66 TRAN0602 1.
+ SH060237 BAL0602 -1. BAL0637 1.
+ SH060337 COST 194.34 TRAN0603 1.
+ SH060337 BAL0603 -1. BAL0637 1.
+ SH060437 COST 373.92 TRAN0604 1.
+ SH060437 BAL0604 -1. BAL0637 1.
+ SH060537 COST 223.86 TRAN0605 1.
+ SH060537 BAL0605 -1. BAL0637 1.
+ SH060637 COST 238.62 TRAN0606 1.
+ SH060637 BAL0652 -1. BAL0637 1.
+ SH060837 COST 309.96 TRAN0608 1.
+ SH060837 BAL0683 -1. BAL0637 1.
+ SH060138 COST 167.28 TRAN0601 1.
+ SH060138 BAL0601 -1. BAL0638 1.
+ SH060238 COST 300.12 TRAN0602 1.
+ SH060238 BAL0602 -1. BAL0638 1.
+ SH060338 COST 116.85 TRAN0603 1.
+ SH060338 BAL0603 -1. BAL0638 1.
+ SH060438 COST 378.84 TRAN0604 1.
+ SH060438 BAL0604 -1. BAL0638 1.
+ SH060538 COST 341.94 TRAN0605 1.
+ SH060538 BAL0605 -1. BAL0638 1.
+ SH060638 COST 47.97 TRAN0606 1.
+ SH060638 BAL0652 -1. BAL0638 1.
+ SH060738 COST 265.68 TRAN0607 1.
+ SH060738 BAL0664 -1. BAL0638 1.
+ SH060838 COST 291.51 TRAN0608 1.
+ SH060838 BAL0683 -1. BAL0638 1.
+ SH060139 COST 159.9 TRAN0601 1.
+ SH060139 BAL0601 -1. BAL0639 1.
+ SH060239 COST 416.97 TRAN0602 1.
+ SH060239 BAL0602 -1. BAL0639 1.
+ SH060339 COST 196.8 TRAN0603 1.
+ SH060339 BAL0603 -1. BAL0639 1.
+ SH060439 COST 306.27 TRAN0604 1.
+ SH060439 BAL0604 -1. BAL0639 1.
+ SH060539 COST 527.67 TRAN0605 1.
+ SH060539 BAL0605 -1. BAL0639 1.
+ SH060639 COST 250.92 TRAN0606 1.
+ SH060639 BAL0652 -1. BAL0639 1.
+ SH060839 COST 206.64 TRAN0608 1.
+ SH060839 BAL0683 -1. BAL0639 1.
+ SH060140 COST 202.95 TRAN0601 1.
+ SH060140 BAL0601 -1. BAL0640 1.
+ SH060240 COST 464.94 TRAN0602 1.
+ SH060240 BAL0602 -1. BAL0640 1.
+ SH060340 COST 126.69 TRAN0603 1.
+ SH060340 BAL0603 -1. BAL0640 1.
+ SH060440 COST 365.31 TRAN0604 1.
+ SH060440 BAL0604 -1. BAL0640 1.
+ SH060540 COST 271.83 TRAN0605 1.
+ SH060540 BAL0605 -1. BAL0640 1.
+ SH060640 COST 161.13 TRAN0606 1.
+ SH060640 BAL0652 -1. BAL0640 1.
+ SH060840 COST 337.02 TRAN0608 1.
+ SH060840 BAL0683 -1. BAL0640 1.
+ SH060141 COST 241.08 TRAN0601 1.
+ SH060141 BAL0601 -1. BAL0641 1.
+ SH060241 COST 369. TRAN0602 1.
+ SH060241 BAL0602 -1. BAL0641 1.
+ SH060341 COST 184.5 TRAN0603 1.
+ SH060341 BAL0603 -1. BAL0641 1.
+ SH060441 COST 398.52 TRAN0604 1.
+ SH060441 BAL0604 -1. BAL0641 1.
+ SH060541 COST 452.64 TRAN0605 1.
+ SH060541 BAL0605 -1. BAL0641 1.
+ SH060641 COST 123. TRAN0606 1.
+ SH060641 BAL0652 -1. BAL0641 1.
+ SH060841 COST 367.77 TRAN0608 1.
+ SH060841 BAL0683 -1. BAL0641 1.
+ SH060142 COST 110.7 TRAN0601 1.
+ SH060142 BAL0601 -1. BAL0642 1.
+ SH060242 COST 509.22 TRAN0602 1.
+ SH060242 BAL0602 -1. BAL0642 1.
+ SH060342 COST 196.8 TRAN0603 1.
+ SH060342 BAL0603 -1. BAL0642 1.
+ SH060442 COST 239.85 TRAN0604 1.
+ SH060442 BAL0604 -1. BAL0642 1.
+ SH060542 COST 444.03 TRAN0605 1.
+ SH060542 BAL0605 -1. BAL0642 1.
+ SH060642 COST 198.03 TRAN0606 1.
+ SH060642 BAL0652 -1. BAL0642 1.
+ SH060842 COST 186.96 TRAN0608 1.
+ SH060842 BAL0683 -1. BAL0642 1.
+ SH060143 COST 195.57 TRAN0601 1.
+ SH060143 BAL0601 -1. BAL0643 1.
+ SH060243 COST 485.85 TRAN0602 1.
+ SH060243 BAL0602 -1. BAL0643 1.
+ SH060343 COST 30.75 TRAN0603 1.
+ SH060343 BAL0603 -1. BAL0643 1.
+ SH060443 COST 364.08 TRAN0604 1.
+ SH060443 BAL0604 -1. BAL0643 1.
+ SH060543 COST 317.34 TRAN0605 1.
+ SH060543 BAL0605 -1. BAL0643 1.
+ SH060643 COST 123. TRAN0606 1.
+ SH060643 BAL0652 -1. BAL0643 1.
+ SH060743 COST 296.43 TRAN0607 1.
+ SH060743 BAL0664 -1. BAL0643 1.
+ SH060843 COST 333.33 TRAN0608 1.
+ SH060843 BAL0683 -1. BAL0643 1.
+ SH060144 COST 195.57 TRAN0601 1.
+ SH060144 BAL0601 -1. BAL0644 1.
+ SH060244 COST 466.17 TRAN0602 1.
+ SH060244 BAL0602 -1. BAL0644 1.
+ SH060344 COST 157.44 TRAN0603 1.
+ SH060344 BAL0603 -1. BAL0644 1.
+ SH060444 COST 383.76 TRAN0604 1.
+ SH060444 BAL0604 -1. BAL0644 1.
+ SH060544 COST 381.3 TRAN0605 1.
+ SH060544 BAL0605 -1. BAL0644 1.
+ SH060644 COST 109.47 TRAN0606 1.
+ SH060644 BAL0652 -1. BAL0644 1.
+ SH060844 COST 366.54 TRAN0608 1.
+ SH060844 BAL0683 -1. BAL0644 1.
+ SH060145 COST 211.56 TRAN0601 1.
+ SH060145 BAL0601 -1. BAL0645 1.
+ SH060245 COST 536.28 TRAN0602 1.
+ SH060245 BAL0602 -1. BAL0645 1.
+ SH060345 COST 198.03 TRAN0603 1.
+ SH060345 BAL0603 -1. BAL0645 1.
+ SH060445 COST 359.16 TRAN0604 1.
+ SH060445 BAL0604 -1. BAL0645 1.
+ SH060545 COST 287.82 TRAN0605 1.
+ SH060545 BAL0605 -1. BAL0645 1.
+ SH060645 COST 234.93 TRAN0606 1.
+ SH060645 BAL0652 -1. BAL0645 1.
+ SH060745 COST 242.31 TRAN0607 1.
+ SH060745 BAL0664 -1. BAL0645 1.
+ SH060845 COST 375.15 TRAN0608 1.
+ SH060845 BAL0683 -1. BAL0645 1.
+ SH060146 COST 301.35 TRAN0601 1.
+ SH060146 BAL0601 -1. BAL0646 1.
+ SH060246 COST 335.79 TRAN0602 1.
+ SH060246 BAL0602 -1. BAL0646 1.
+ SH060346 COST 271.83 TRAN0603 1.
+ SH060346 BAL0603 -1. BAL0646 1.
+ SH060446 COST 549.81 TRAN0604 1.
+ SH060446 BAL0604 -1. BAL0646 1.
+ SH060546 COST 528.9 TRAN0605 1.
+ SH060546 BAL0605 -1. BAL0646 1.
+ SH060646 COST 316.11 TRAN0606 1.
+ SH060646 BAL0652 -1. BAL0646 1.
+ SH060846 COST 551.04 TRAN0608 1.
+ SH060846 BAL0683 -1. BAL0646 1.
+ SH060147 COST 135.3 TRAN0601 1.
+ SH060147 BAL0601 -1. BAL0647 1.
+ SH060247 COST 458.79 TRAN0602 1.
+ SH060247 BAL0602 -1. BAL0647 1.
+ SH060347 COST 195.57 TRAN0603 1.
+ SH060347 BAL0603 -1. BAL0647 1.
+ SH060447 COST 337.02 TRAN0604 1.
+ SH060447 BAL0604 -1. BAL0647 1.
+ SH060547 COST 286.59 TRAN0605 1.
+ SH060547 BAL0605 -1. BAL0647 1.
+ SH060647 COST 178.35 TRAN0606 1.
+ SH060647 BAL0652 -1. BAL0647 1.
+ SH060847 COST 300.12 TRAN0608 1.
+ SH060847 BAL0683 -1. BAL0647 1.
+ SH060148 COST 116.85 TRAN0601 1.
+ SH060148 BAL0601 -1. BAL0648 1.
+ SH060248 COST 416.97 TRAN0602 1.
+ SH060248 BAL0602 -1. BAL0648 1.
+ SH060348 COST 168.51 TRAN0603 1.
+ SH060348 BAL0603 -1. BAL0648 1.
+ SH060448 COST 282.9 TRAN0604 1.
+ SH060448 BAL0604 -1. BAL0648 1.
+ SH060548 COST 303.81 TRAN0605 1.
+ SH060548 BAL0605 -1. BAL0648 1.
+ SH060648 COST 141.45 TRAN0606 1.
+ SH060648 BAL0652 -1. BAL0648 1.
+ SH060848 COST 239.85 TRAN0608 1.
+ SH060848 BAL0683 -1. BAL0648 1.
+ SH060149 COST 404.67 TRAN0601 1.
+ SH060149 BAL0601 -1. BAL0649 1.
+ SH060249 COST 658.05 TRAN0602 1.
+ SH060249 BAL0602 -1. BAL0649 1.
+ SH060349 COST 408.36 TRAN0603 1.
+ SH060349 BAL0603 -1. BAL0649 1.
+ SH060449 COST 468.63 TRAN0604 1.
+ SH060449 BAL0604 -1. BAL0649 1.
+ SH060549 COST 186.96 TRAN0605 1.
+ SH060549 BAL0605 -1. BAL0649 1.
+ SH060649 COST 415.74 TRAN0606 1.
+ SH060649 BAL0652 -1. BAL0649 1.
+ SH060749 COST 164.82 TRAN0607 1.
+ SH060749 BAL0664 -1. BAL0649 1.
+ SH060849 COST 501.84 TRAN0608 1.
+ SH060849 BAL0683 -1. BAL0649 1.
+ SH060150 COST 296.43 TRAN0601 1.
+ SH060150 BAL0601 -1. BAL0650 1.
+ SH060250 COST 752.76 TRAN0602 1.
+ SH060250 BAL0602 -1. BAL0650 1.
+ SH060350 COST 302.58 TRAN0603 1.
+ SH060350 BAL0603 -1. BAL0650 1.
+ SH060450 COST 448.95 TRAN0604 1.
+ SH060450 BAL0604 -1. BAL0650 1.
+ SH060550 COST 289.05 TRAN0605 1.
+ SH060550 BAL0605 -1. BAL0650 1.
+ SH060750 COST 168.51 TRAN0607 1.
+ SH060750 BAL0664 -1. BAL0650 1.
+ SH060850 COST 499.38 TRAN0608 1.
+ SH060850 BAL0683 -1. BAL0650 1.
+ SH060151 COST 408.36 TRAN0601 1.
+ SH060151 BAL0601 -1. BAL0651 1.
+ SH060251 COST 676.5 TRAN0602 1.
+ SH060251 BAL0602 -1. BAL0651 1.
+ SH060351 COST 419.43 TRAN0603 1.
+ SH060351 BAL0603 -1. BAL0651 1.
+ SH060451 COST 415.74 TRAN0604 1.
+ SH060451 BAL0604 -1. BAL0651 1.
+ SH060551 COST 151.29 TRAN0605 1.
+ SH060551 BAL0605 -1. BAL0651 1.
+ SH060751 COST 121.77 TRAN0607 1.
+ SH060751 BAL0664 -1. BAL0651 1.
+ SH060851 COST 526.44 TRAN0608 1.
+ SH060851 BAL0683 -1. BAL0651 1.
+ SH060152 COST 137.76 TRAN0601 1.
+ SH060152 BAL0601 -1. BAL0652 1.
+ SH060252 COST 369. TRAN0602 1.
+ SH060252 BAL0602 -1. BAL0652 1.
+ SH060352 COST 100.86 TRAN0603 1.
+ SH060352 BAL0603 -1. BAL0652 1.
+ SH060452 COST 396.06 TRAN0604 1.
+ SH060452 BAL0604 -1. BAL0652 1.
+ SH060552 COST 362.85 TRAN0605 1.
+ SH060552 BAL0605 -1. BAL0652 1.
+ SH060852 COST 311.19 TRAN0608 1.
+ SH060852 BAL0683 -1. BAL0652 1.
+ SH060153 COST 441.57 TRAN0601 1.
+ SH060153 BAL0601 -1. BAL0653 1.
+ SH060253 COST 782.28 TRAN0602 1.
+ SH060253 BAL0602 -1. BAL0653 1.
+ SH060353 COST 399.75 TRAN0603 1.
+ SH060353 BAL0603 -1. BAL0653 1.
+ SH060453 COST 506.76 TRAN0604 1.
+ SH060453 BAL0604 -1. BAL0653 1.
+ SH060553 COST 226.32 TRAN0605 1.
+ SH060553 BAL0605 -1. BAL0653 1.
+ SH060653 COST 441.57 TRAN0606 1.
+ SH060653 BAL0652 -1. BAL0653 1.
+ SH060753 COST 179.58 TRAN0607 1.
+ SH060753 BAL0664 -1. BAL0653 1.
+ SH060853 COST 495.69 TRAN0608 1.
+ SH060853 BAL0683 -1. BAL0653 1.
+ SH060154 COST 227.55 TRAN0601 1.
+ SH060154 BAL0601 -1. BAL0654 1.
+ SH060254 COST 547.35 TRAN0602 1.
+ SH060254 BAL0602 -1. BAL0654 1.
+ SH060354 COST 266.91 TRAN0603 1.
+ SH060354 BAL0603 -1. BAL0654 1.
+ SH060454 COST 421.89 TRAN0604 1.
+ SH060454 BAL0604 -1. BAL0654 1.
+ SH060554 COST 261.99 TRAN0605 1.
+ SH060554 BAL0605 -1. BAL0654 1.
+ SH060654 COST 249.69 TRAN0606 1.
+ SH060654 BAL0652 -1. BAL0654 1.
+ SH060854 COST 494.46 TRAN0608 1.
+ SH060854 BAL0683 -1. BAL0654 1.
+ SH060155 COST 341.94 TRAN0601 1.
+ SH060155 BAL0601 -1. BAL0655 1.
+ SH060255 COST 589.17 TRAN0602 1.
+ SH060255 BAL0602 -1. BAL0655 1.
+ SH060355 COST 345.63 TRAN0603 1.
+ SH060355 BAL0603 -1. BAL0655 1.
+ SH060455 COST 361.62 TRAN0604 1.
+ SH060455 BAL0604 -1. BAL0655 1.
+ SH060555 COST 189.42 TRAN0605 1.
+ SH060555 BAL0605 -1. BAL0655 1.
+ SH060655 COST 356.7 TRAN0606 1.
+ SH060655 BAL0652 -1. BAL0655 1.
+ SH060755 COST 131.61 TRAN0607 1.
+ SH060755 BAL0664 -1. BAL0655 1.
+ SH060855 COST 361.62 TRAN0608 1.
+ SH060855 BAL0683 -1. BAL0655 1.
+ SH060156 COST 479.7 TRAN0601 1.
+ SH060156 BAL0601 -1. BAL0656 1.
+ SH060256 COST 712.17 TRAN0602 1.
+ SH060256 BAL0602 -1. BAL0656 1.
+ SH060356 COST 375.15 TRAN0603 1.
+ SH060356 BAL0603 -1. BAL0656 1.
+ SH060456 COST 448.95 TRAN0604 1.
+ SH060456 BAL0604 -1. BAL0656 1.
+ SH060556 COST 167.28 TRAN0605 1.
+ SH060556 BAL0605 -1. BAL0656 1.
+ SH060656 COST 416.97 TRAN0606 1.
+ SH060656 BAL0652 -1. BAL0656 1.
+ SH060756 COST 150.06 TRAN0607 1.
+ SH060756 BAL0664 -1. BAL0656 1.
+ SH060856 COST 439.11 TRAN0608 1.
+ SH060856 BAL0683 -1. BAL0656 1.
+ SH060157 COST 321.03 TRAN0601 1.
+ SH060157 BAL0601 -1. BAL0657 1.
+ SH060257 COST 639.6 TRAN0602 1.
+ SH060257 BAL0602 -1. BAL0657 1.
+ SH060357 COST 356.7 TRAN0603 1.
+ SH060357 BAL0603 -1. BAL0657 1.
+ SH060457 COST 287.82 TRAN0604 1.
+ SH060457 BAL0604 -1. BAL0657 1.
+ SH060557 COST 206.64 TRAN0605 1.
+ SH060557 BAL0605 -1. BAL0657 1.
+ SH060657 COST 392.37 TRAN0606 1.
+ SH060657 BAL0652 -1. BAL0657 1.
+ SH060757 COST 182.04 TRAN0607 1.
+ SH060757 BAL0664 -1. BAL0657 1.
+ SH060857 COST 284.13 TRAN0608 1.
+ SH060857 BAL0683 -1. BAL0657 1.
+ SH060158 COST 361.62 TRAN0601 1.
+ SH060158 BAL0601 -1. BAL0658 1.
+ SH060258 COST 640.83 TRAN0602 1.
+ SH060258 BAL0602 -1. BAL0658 1.
+ SH060358 COST 341.94 TRAN0603 1.
+ SH060358 BAL0603 -1. BAL0658 1.
+ SH060458 COST 421.89 TRAN0604 1.
+ SH060458 BAL0604 -1. BAL0658 1.
+ SH060558 COST 25.83 TRAN0605 1.
+ SH060558 BAL0605 -1. BAL0658 1.
+ SH060658 COST 400.98 TRAN0606 1.
+ SH060658 BAL0652 -1. BAL0658 1.
+ SH060758 COST 83.64 TRAN0607 1.
+ SH060758 BAL0664 -1. BAL0658 1.
+ SH060858 COST 312.42 TRAN0608 1.
+ SH060858 BAL0683 -1. BAL0658 1.
+ SH060159 COST 253.38 TRAN0601 1.
+ SH060159 BAL0601 -1. BAL0659 1.
+ SH060259 COST 612.54 TRAN0602 1.
+ SH060259 BAL0602 -1. BAL0659 1.
+ SH060359 COST 292.74 TRAN0603 1.
+ SH060359 BAL0603 -1. BAL0659 1.
+ SH060459 COST 300.12 TRAN0604 1.
+ SH060459 BAL0604 -1. BAL0659 1.
+ SH060559 COST 195.57 TRAN0605 1.
+ SH060559 BAL0605 -1. BAL0659 1.
+ SH060659 COST 365.31 TRAN0606 1.
+ SH060659 BAL0652 -1. BAL0659 1.
+ SH060759 COST 129.15 TRAN0607 1.
+ SH060759 BAL0664 -1. BAL0659 1.
+ SH060859 COST 313.65 TRAN0608 1.
+ SH060859 BAL0683 -1. BAL0659 1.
+ SH060160 COST 321.03 TRAN0601 1.
+ SH060160 BAL0601 -1. BAL0660 1.
+ SH060260 COST 676.5 TRAN0602 1.
+ SH060260 BAL0602 -1. BAL0660 1.
+ SH060360 COST 348.09 TRAN0603 1.
+ SH060360 BAL0603 -1. BAL0660 1.
+ SH060460 COST 383.76 TRAN0604 1.
+ SH060460 BAL0604 -1. BAL0660 1.
+ SH060560 COST 166.05 TRAN0605 1.
+ SH060560 BAL0605 -1. BAL0660 1.
+ SH060660 COST 397.29 TRAN0606 1.
+ SH060660 BAL0652 -1. BAL0660 1.
+ SH060760 COST 108.24 TRAN0607 1.
+ SH060760 BAL0664 -1. BAL0660 1.
+ SH060860 COST 367.77 TRAN0608 1.
+ SH060860 BAL0683 -1. BAL0660 1.
+ SH060163 COST 327.18 TRAN0601 1.
+ SH060163 BAL0601 -1. BAL0663 1.
+ SH060263 COST 607.62 TRAN0602 1.
+ SH060263 BAL0602 -1. BAL0663 1.
+ SH060363 COST 353.01 TRAN0603 1.
+ SH060363 BAL0603 -1. BAL0663 1.
+ SH060463 COST 453.87 TRAN0604 1.
+ SH060463 BAL0604 -1. BAL0663 1.
+ SH060563 COST 186.96 TRAN0605 1.
+ SH060563 BAL0605 -1. BAL0663 1.
+ SH060663 COST 387.45 TRAN0606 1.
+ SH060663 BAL0652 -1. BAL0663 1.
+ SH060763 COST 152.52 TRAN0607 1.
+ SH060763 BAL0664 -1. BAL0663 1.
+ SH060863 COST 492. TRAN0608 1.
+ SH060863 BAL0683 -1. BAL0663 1.
+ SH060164 COST 244.77 TRAN0601 1.
+ SH060164 BAL0601 -1. BAL0664 1.
+ SH060264 COST 646.98 TRAN0602 1.
+ SH060264 BAL0602 -1. BAL0664 1.
+ SH060364 COST 274.29 TRAN0603 1.
+ SH060364 BAL0603 -1. BAL0664 1.
+ SH060464 COST 413.28 TRAN0604 1.
+ SH060464 BAL0604 -1. BAL0664 1.
+ SH060564 COST 71.34 TRAN0605 1.
+ SH060564 BAL0605 -1. BAL0664 1.
+ SH060664 COST 389.91 TRAN0606 1.
+ SH060664 BAL0652 -1. BAL0664 1.
+ SH060864 COST 307.5 TRAN0608 1.
+ SH060864 BAL0683 -1. BAL0664 1.
+ SH060165 COST 531.36 TRAN0601 1.
+ SH060165 BAL0601 -1. BAL0665 1.
+ SH060265 COST 377.61 TRAN0602 1.
+ SH060265 BAL0602 -1. BAL0665 1.
+ SH060365 COST 621.15 TRAN0603 1.
+ SH060365 BAL0603 -1. BAL0665 1.
+ SH060465 COST 477.24 TRAN0604 1.
+ SH060465 BAL0604 -1. BAL0665 1.
+ SH060565 COST 742.92 TRAN0605 1.
+ SH060565 BAL0605 -1. BAL0665 1.
+ SH060865 COST 510.45 TRAN0608 1.
+ SH060865 BAL0683 -1. BAL0665 1.
+ SH060166 COST 688.8 TRAN0601 1.
+ SH060166 BAL0601 -1. BAL0666 1.
+ SH060266 COST 318.57 TRAN0602 1.
+ SH060266 BAL0602 -1. BAL0666 1.
+ SH060366 COST 710.94 TRAN0603 1.
+ SH060366 BAL0603 -1. BAL0666 1.
+ SH060466 COST 683.88 TRAN0604 1.
+ SH060466 BAL0604 -1. BAL0666 1.
+ SH060566 COST 873.3 TRAN0605 1.
+ SH060566 BAL0605 -1. BAL0666 1.
+ SH060866 COST 688.8 TRAN0608 1.
+ SH060866 BAL0683 -1. BAL0666 1.
+ SH060167 COST 522.75 TRAN0601 1.
+ SH060167 BAL0601 -1. BAL0667 1.
+ SH060267 COST 285.36 TRAN0602 1.
+ SH060267 BAL0602 -1. BAL0667 1.
+ SH060367 COST 606.39 TRAN0603 1.
+ SH060367 BAL0603 -1. BAL0667 1.
+ SH060467 COST 562.11 TRAN0604 1.
+ SH060467 BAL0604 -1. BAL0667 1.
+ SH060567 COST 742.92 TRAN0605 1.
+ SH060567 BAL0605 -1. BAL0667 1.
+ SH060867 COST 563.34 TRAN0608 1.
+ SH060867 BAL0683 -1. BAL0667 1.
+ SH060168 COST 730.62 TRAN0601 1.
+ SH060168 BAL0601 -1. BAL0668 1.
+ SH060268 COST 492. TRAN0602 1.
+ SH060268 BAL0602 -1. BAL0668 1.
+ SH060368 COST 688.8 TRAN0603 1.
+ SH060368 BAL0603 -1. BAL0668 1.
+ SH060468 COST 863.46 TRAN0604 1.
+ SH060468 BAL0604 -1. BAL0668 1.
+ SH060568 COST 1163.58 TRAN0605 1.
+ SH060568 BAL0605 -1. BAL0668 1.
+ SH060868 COST 923.73 TRAN0608 1.
+ SH060868 BAL0683 -1. BAL0668 1.
+ SH060169 COST 662.97 TRAN0601 1.
+ SH060169 BAL0601 -1. BAL0669 1.
+ SH060269 COST 271.83 TRAN0602 1.
+ SH060269 BAL0602 -1. BAL0669 1.
+ SH060369 COST 627.3 TRAN0603 1.
+ SH060369 BAL0603 -1. BAL0669 1.
+ SH060469 COST 765.06 TRAN0604 1.
+ SH060469 BAL0604 -1. BAL0669 1.
+ SH060569 COST 794.58 TRAN0605 1.
+ SH060569 BAL0605 -1. BAL0669 1.
+ SH060869 COST 809.34 TRAN0608 1.
+ SH060869 BAL0683 -1. BAL0669 1.
+ SH060171 COST 541.2 TRAN0601 1.
+ SH060171 BAL0601 -1. BAL0671 1.
+ SH060371 COST 644.52 TRAN0603 1.
+ SH060371 BAL0603 -1. BAL0671 1.
+ SH060471 COST 640.83 TRAN0604 1.
+ SH060471 BAL0604 -1. BAL0671 1.
+ SH060571 COST 714.63 TRAN0605 1.
+ SH060571 BAL0605 -1. BAL0671 1.
+ SH060671 COST 480.93 TRAN0606 1.
+ SH060671 BAL0652 -1. BAL0671 1.
+ SH060771 COST 865.92 TRAN0607 1.
+ SH060771 BAL0664 -1. BAL0671 1.
+ SH060871 COST 655.59 TRAN0608 1.
+ SH060871 BAL0683 -1. BAL0671 1.
+ SH060172 COST 722.01 TRAN0601 1.
+ SH060172 BAL0601 -1. BAL0672 1.
+ SH060272 COST 667.89 TRAN0602 1.
+ SH060272 BAL0602 -1. BAL0672 1.
+ SH060372 COST 758.91 TRAN0603 1.
+ SH060372 BAL0603 -1. BAL0672 1.
+ SH060472 COST 701.1 TRAN0604 1.
+ SH060472 BAL0604 -1. BAL0672 1.
+ SH060572 COST 938.49 TRAN0605 1.
+ SH060572 BAL0605 -1. BAL0672 1.
+ SH060872 COST 701.1 TRAN0608 1.
+ SH060872 BAL0683 -1. BAL0672 1.
+ SH060173 COST 479.7 TRAN0601 1.
+ SH060173 BAL0601 -1. BAL0673 1.
+ SH060273 COST 448.95 TRAN0602 1.
+ SH060273 BAL0602 -1. BAL0673 1.
+ SH060373 COST 415.74 TRAN0603 1.
+ SH060373 BAL0603 -1. BAL0673 1.
+ SH060473 COST 562.11 TRAN0604 1.
+ SH060473 BAL0604 -1. BAL0673 1.
+ SH060573 COST 693.72 TRAN0605 1.
+ SH060573 BAL0605 -1. BAL0673 1.
+ SH060673 COST 375.15 TRAN0606 1.
+ SH060673 BAL0652 -1. BAL0673 1.
+ SH060873 COST 619.92 TRAN0608 1.
+ SH060873 BAL0683 -1. BAL0673 1.
+ SH060174 COST 674.04 TRAN0601 1.
+ SH060174 BAL0601 -1. BAL0674 1.
+ SH060274 COST 258.3 TRAN0602 1.
+ SH060274 BAL0602 -1. BAL0674 1.
+ SH060374 COST 701.1 TRAN0603 1.
+ SH060374 BAL0603 -1. BAL0674 1.
+ SH060474 COST 783.51 TRAN0604 1.
+ SH060474 BAL0604 -1. BAL0674 1.
+ SH060574 COST 901.59 TRAN0605 1.
+ SH060574 BAL0605 -1. BAL0674 1.
+ SH060874 COST 761.37 TRAN0608 1.
+ SH060874 BAL0683 -1. BAL0674 1.
+ SH060275 COST 681.42 TRAN0602 1.
+ SH060275 BAL0602 -1. BAL0675 1.
+ SH060176 COST 568.26 TRAN0601 1.
+ SH060176 BAL0601 -1. BAL0676 1.
+ SH060276 COST 493.23 TRAN0602 1.
+ SH060276 BAL0602 -1. BAL0676 1.
+ SH060376 COST 495.69 TRAN0603 1.
+ SH060376 BAL0603 -1. BAL0676 1.
+ SH060476 COST 774.9 TRAN0604 1.
+ SH060476 BAL0604 -1. BAL0676 1.
+ SH060576 COST 774.9 TRAN0605 1.
+ SH060576 BAL0605 -1. BAL0676 1.
+ SH060676 COST 468.63 TRAN0606 1.
+ SH060676 BAL0652 -1. BAL0676 1.
+ SH060876 COST 955.71 TRAN0608 1.
+ SH060876 BAL0683 -1. BAL0676 1.
+ SH060177 COST 535.05 TRAN0601 1.
+ SH060177 BAL0601 -1. BAL0677 1.
+ SH060277 COST 334.56 TRAN0602 1.
+ SH060277 BAL0602 -1. BAL0677 1.
+ SH060377 COST 567.03 TRAN0603 1.
+ SH060377 BAL0603 -1. BAL0677 1.
+ SH060477 COST 493.23 TRAN0604 1.
+ SH060477 BAL0604 -1. BAL0677 1.
+ SH060577 COST 688.8 TRAN0605 1.
+ SH060577 BAL0605 -1. BAL0677 1.
+ SH060877 COST 393.6 TRAN0608 1.
+ SH060877 BAL0683 -1. BAL0677 1.
+ SH060178 COST 936.03 TRAN0601 1.
+ SH060178 BAL0601 -1. BAL0678 1.
+ SH060278 COST 543.66 TRAN0602 1.
+ SH060278 BAL0602 -1. BAL0678 1.
+ SH060378 COST 963.09 TRAN0603 1.
+ SH060378 BAL0603 -1. BAL0678 1.
+ SH060478 COST 842.55 TRAN0604 1.
+ SH060478 BAL0604 -1. BAL0678 1.
+ SH060578 COST 1081.17 TRAN0605 1.
+ SH060578 BAL0605 -1. BAL0678 1.
+ SH060878 COST 942.18 TRAN0608 1.
+ SH060878 BAL0683 -1. BAL0678 1.
+ SH060179 COST 879.45 TRAN0601 1.
+ SH060179 BAL0601 -1. BAL0679 1.
+ SH060279 COST 330.87 TRAN0602 1.
+ SH060279 BAL0602 -1. BAL0679 1.
+ SH060379 COST 849.93 TRAN0603 1.
+ SH060379 BAL0603 -1. BAL0679 1.
+ SH060479 COST 885.6 TRAN0604 1.
+ SH060479 BAL0604 -1. BAL0679 1.
+ SH060879 COST 868.38 TRAN0608 1.
+ SH060879 BAL0683 -1. BAL0679 1.
+ SH060180 COST 389.91 TRAN0601 1.
+ SH060180 BAL0601 -1. BAL0680 1.
+ SH060280 COST 485.85 TRAN0602 1.
+ SH060280 BAL0602 -1. BAL0680 1.
+ SH060380 COST 537.51 TRAN0603 1.
+ SH060380 BAL0603 -1. BAL0680 1.
+ SH060480 COST 460.02 TRAN0604 1.
+ SH060480 BAL0604 -1. BAL0680 1.
+ SH060580 COST 621.15 TRAN0605 1.
+ SH060580 BAL0605 -1. BAL0680 1.
+ SH060880 COST 295.2 TRAN0608 1.
+ SH060880 BAL0683 -1. BAL0680 1.
+ SH060182 COST 715.86 TRAN0601 1.
+ SH060182 BAL0601 -1. BAL0682 1.
+ SH060282 COST 404.67 TRAN0602 1.
+ SH060282 BAL0602 -1. BAL0682 1.
+ SH060382 COST 805.65 TRAN0603 1.
+ SH060382 BAL0603 -1. BAL0682 1.
+ SH060482 COST 868.38 TRAN0604 1.
+ SH060482 BAL0604 -1. BAL0682 1.
+ SH060582 COST 1410.81 TRAN0605 1.
+ SH060582 BAL0605 -1. BAL0682 1.
+ SH060882 COST 963.09 TRAN0608 1.
+ SH060882 BAL0683 -1. BAL0682 1.
+ SH060183 COST 217.71 TRAN0601 1.
+ SH060183 BAL0601 -1. BAL0683 1.
+ SH060283 COST 639.6 TRAN0602 1.
+ SH060283 BAL0602 -1. BAL0683 1.
+ SH060383 COST 334.56 TRAN0603 1.
+ SH060383 BAL0603 -1. BAL0683 1.
+ SH060483 COST 72.57 TRAN0604 1.
+ SH060483 BAL0604 -1. BAL0683 1.
+ SH060583 COST 426.81 TRAN0605 1.
+ SH060583 BAL0605 -1. BAL0683 1.
+ SH060683 COST 305.04 TRAN0606 1.
+ SH060683 BAL0652 -1. BAL0683 1.
+ SH060184 COST 373.92 TRAN0601 1.
+ SH060184 BAL0601 -1. BAL0684 1.
+ SH060284 COST 236.16 TRAN0602 1.
+ SH060284 BAL0602 -1. BAL0684 1.
+ SH060384 COST 447.72 TRAN0603 1.
+ SH060384 BAL0603 -1. BAL0684 1.
+ SH060484 COST 455.1 TRAN0604 1.
+ SH060484 BAL0604 -1. BAL0684 1.
+ SH060584 COST 602.7 TRAN0605 1.
+ SH060584 BAL0605 -1. BAL0684 1.
+ SH060684 COST 375.15 TRAN0606 1.
+ SH060684 BAL0652 -1. BAL0684 1.
+ SH060884 COST 477.24 TRAN0608 1.
+ SH060884 BAL0683 -1. BAL0684 1.
+ SH070201 COST 323.73 TRAN0702 1.
+ SH070201 BAL0702 -1. BAL0701 1.
+ SH070301 COST 124.26 TRAN0703 1.
+ SH070301 BAL0703 -1. BAL0701 1.
+ SH070401 COST 226.72 TRAN0704 1.
+ SH070401 BAL0704 -1. BAL0701 1.
+ SH070501 COST 258.33 TRAN0705 1.
+ SH070501 BAL0705 -1. BAL0701 1.
+ SH070601 COST 137.34 TRAN0706 1.
+ SH070601 BAL0752 -1. BAL0701 1.
+ SH070801 COST 155.87 TRAN0708 1.
+ SH070801 BAL0783 -1. BAL0701 1.
+ SH070102 COST 516.66 TRAN0701 1.
+ SH070102 BAL0701 -1. BAL0702 1.
+ SH070302 COST 454.53 TRAN0703 1.
+ SH070302 BAL0703 -1. BAL0702 1.
+ SH070402 COST 667.08 TRAN0704 1.
+ SH070402 BAL0704 -1. BAL0702 1.
+ SH070502 COST 807.69 TRAN0705 1.
+ SH070502 BAL0705 -1. BAL0702 1.
+ SH070602 COST 412.02 TRAN0706 1.
+ SH070602 BAL0752 -1. BAL0702 1.
+ SH070802 COST 567.89 TRAN0708 1.
+ SH070802 BAL0783 -1. BAL0702 1.
+ SH070103 COST 267.05 TRAN0701 1.
+ SH070103 BAL0701 -1. BAL0703 1.
+ SH070203 COST 516.66 TRAN0702 1.
+ SH070203 BAL0702 -1. BAL0703 1.
+ SH070403 COST 400.03 TRAN0704 1.
+ SH070403 BAL0704 -1. BAL0703 1.
+ SH070503 COST 309.56 TRAN0705 1.
+ SH070503 BAL0705 -1. BAL0703 1.
+ SH070603 COST 98.1 TRAN0706 1.
+ SH070603 BAL0752 -1. BAL0703 1.
+ SH070803 COST 277.95 TRAN0708 1.
+ SH070803 BAL0783 -1. BAL0703 1.
+ SH070104 COST 189.66 TRAN0701 1.
+ SH070104 BAL0701 -1. BAL0704 1.
+ SH070204 COST 548.27 TRAN0702 1.
+ SH070204 BAL0702 -1. BAL0704 1.
+ SH070304 COST 264.87 TRAN0703 1.
+ SH070304 BAL0703 -1. BAL0704 1.
+ SH070504 COST 347.71 TRAN0705 1.
+ SH070504 BAL0705 -1. BAL0704 1.
+ SH070604 COST 267.05 TRAN0706 1.
+ SH070604 BAL0752 -1. BAL0704 1.
+ SH070704 COST 293.21 TRAN0707 1.
+ SH070704 BAL0764 -1. BAL0704 1.
+ SH070804 COST 63.22 TRAN0708 1.
+ SH070804 BAL0783 -1. BAL0704 1.
+ SH070105 COST 294.3 TRAN0701 1.
+ SH070105 BAL0701 -1. BAL0705 1.
+ SH070205 COST 562.44 TRAN0702 1.
+ SH070205 BAL0702 -1. BAL0705 1.
+ SH070305 COST 309.56 TRAN0703 1.
+ SH070305 BAL0703 -1. BAL0705 1.
+ SH070405 COST 310.65 TRAN0704 1.
+ SH070405 BAL0704 -1. BAL0705 1.
+ SH070605 COST 355.34 TRAN0706 1.
+ SH070605 BAL0752 -1. BAL0705 1.
+ SH070705 COST 364.06 TRAN0707 1.
+ SH070705 BAL0764 -1. BAL0705 1.
+ SH070805 COST 295.39 TRAN0708 1.
+ SH070805 BAL0783 -1. BAL0705 1.
+ SH070106 COST 216.91 TRAN0701 1.
+ SH070106 BAL0701 -1. BAL0706 1.
+ SH070206 COST 454.53 TRAN0702 1.
+ SH070206 BAL0702 -1. BAL0706 1.
+ SH070306 COST 232.17 TRAN0703 1.
+ SH070306 BAL0703 -1. BAL0706 1.
+ SH070406 COST 238.71 TRAN0704 1.
+ SH070406 BAL0704 -1. BAL0706 1.
+ SH070506 COST 274.68 TRAN0705 1.
+ SH070506 BAL0705 -1. BAL0706 1.
+ SH070606 COST 224.54 TRAN0706 1.
+ SH070606 BAL0752 -1. BAL0706 1.
+ SH070706 COST 218. TRAN0707 1.
+ SH070706 BAL0764 -1. BAL0706 1.
+ SH070806 COST 164.59 TRAN0708 1.
+ SH070806 BAL0783 -1. BAL0706 1.
+ SH070107 COST 22.89 TRAN0701 1.
+ SH070107 BAL0701 -1. BAL0707 1.
+ SH070207 COST 318.28 TRAN0702 1.
+ SH070207 BAL0702 -1. BAL0707 1.
+ SH070307 COST 135.16 TRAN0703 1.
+ SH070307 BAL0703 -1. BAL0707 1.
+ SH070407 COST 225.63 TRAN0704 1.
+ SH070407 BAL0704 -1. BAL0707 1.
+ SH070507 COST 249.61 TRAN0705 1.
+ SH070507 BAL0705 -1. BAL0707 1.
+ SH070607 COST 136.25 TRAN0706 1.
+ SH070607 BAL0752 -1. BAL0707 1.
+ SH070707 COST 252.88 TRAN0707 1.
+ SH070707 BAL0764 -1. BAL0707 1.
+ SH070807 COST 168.95 TRAN0708 1.
+ SH070807 BAL0783 -1. BAL0707 1.
+ SH070108 COST 71.94 TRAN0701 1.
+ SH070108 BAL0701 -1. BAL0708 1.
+ SH070208 COST 409.84 TRAN0702 1.
+ SH070208 BAL0702 -1. BAL0708 1.
+ SH070308 COST 153.69 TRAN0703 1.
+ SH070308 BAL0703 -1. BAL0708 1.
+ SH070408 COST 269.23 TRAN0704 1.
+ SH070408 BAL0704 -1. BAL0708 1.
+ SH070508 COST 198.38 TRAN0705 1.
+ SH070508 BAL0705 -1. BAL0708 1.
+ SH070608 COST 180.94 TRAN0706 1.
+ SH070608 BAL0752 -1. BAL0708 1.
+ SH070808 COST 203.83 TRAN0708 1.
+ SH070808 BAL0783 -1. BAL0708 1.
+ SH070109 COST 150.42 TRAN0701 1.
+ SH070109 BAL0701 -1. BAL0709 1.
+ SH070209 COST 417.47 TRAN0702 1.
+ SH070209 BAL0702 -1. BAL0709 1.
+ SH070309 COST 183.12 TRAN0703 1.
+ SH070309 BAL0703 -1. BAL0709 1.
+ SH070409 COST 275.77 TRAN0704 1.
+ SH070409 BAL0704 -1. BAL0709 1.
+ SH070509 COST 260.51 TRAN0705 1.
+ SH070509 BAL0705 -1. BAL0709 1.
+ SH070709 COST 213.64 TRAN0707 1.
+ SH070709 BAL0764 -1. BAL0709 1.
+ SH070809 COST 211.46 TRAN0708 1.
+ SH070809 BAL0783 -1. BAL0709 1.
+ SH070110 COST 269.23 TRAN0701 1.
+ SH070110 BAL0701 -1. BAL0710 1.
+ SH070210 COST 172.22 TRAN0702 1.
+ SH070210 BAL0702 -1. BAL0710 1.
+ SH070310 COST 261.6 TRAN0703 1.
+ SH070310 BAL0703 -1. BAL0710 1.
+ SH070410 COST 391.31 TRAN0704 1.
+ SH070410 BAL0704 -1. BAL0710 1.
+ SH070510 COST 419.65 TRAN0705 1.
+ SH070510 BAL0705 -1. BAL0710 1.
+ SH070610 COST 245.25 TRAN0706 1.
+ SH070610 BAL0752 -1. BAL0710 1.
+ SH070810 COST 332.45 TRAN0708 1.
+ SH070810 BAL0783 -1. BAL0710 1.
+ SH070111 COST 115.54 TRAN0701 1.
+ SH070111 BAL0701 -1. BAL0711 1.
+ SH070211 COST 539.55 TRAN0702 1.
+ SH070211 BAL0702 -1. BAL0711 1.
+ SH070311 COST 270.32 TRAN0703 1.
+ SH070311 BAL0703 -1. BAL0711 1.
+ SH070411 COST 151.51 TRAN0704 1.
+ SH070411 BAL0704 -1. BAL0711 1.
+ SH070511 COST 371.69 TRAN0705 1.
+ SH070511 BAL0705 -1. BAL0711 1.
+ SH070611 COST 213.64 TRAN0706 1.
+ SH070611 BAL0752 -1. BAL0711 1.
+ SH070811 COST 111.18 TRAN0708 1.
+ SH070811 BAL0783 -1. BAL0711 1.
+ SH070112 COST 95.92 TRAN0701 1.
+ SH070112 BAL0701 -1. BAL0712 1.
+ SH070212 COST 369.51 TRAN0702 1.
+ SH070212 BAL0702 -1. BAL0712 1.
+ SH070312 COST 159.14 TRAN0703 1.
+ SH070312 BAL0703 -1. BAL0712 1.
+ SH070412 COST 218. TRAN0704 1.
+ SH070412 BAL0704 -1. BAL0712 1.
+ SH070512 COST 291.03 TRAN0705 1.
+ SH070512 BAL0705 -1. BAL0712 1.
+ SH070612 COST 158.05 TRAN0706 1.
+ SH070612 BAL0752 -1. BAL0712 1.
+ SH070812 COST 159.14 TRAN0708 1.
+ SH070812 BAL0783 -1. BAL0712 1.
+ SH070114 COST 154.78 TRAN0701 1.
+ SH070114 BAL0701 -1. BAL0714 1.
+ SH070214 COST 449.08 TRAN0702 1.
+ SH070214 BAL0702 -1. BAL0714 1.
+ SH070314 COST 213.64 TRAN0703 1.
+ SH070314 BAL0703 -1. BAL0714 1.
+ SH070414 COST 216.91 TRAN0704 1.
+ SH070414 BAL0704 -1. BAL0714 1.
+ SH070514 COST 383.68 TRAN0705 1.
+ SH070514 BAL0705 -1. BAL0714 1.
+ SH070614 COST 204.92 TRAN0706 1.
+ SH070614 BAL0752 -1. BAL0714 1.
+ SH070814 COST 137.34 TRAN0708 1.
+ SH070814 BAL0783 -1. BAL0714 1.
+ SH070115 COST 330.27 TRAN0701 1.
+ SH070115 BAL0701 -1. BAL0715 1.
+ SH070215 COST 173.31 TRAN0702 1.
+ SH070215 BAL0702 -1. BAL0715 1.
+ SH070315 COST 255.06 TRAN0703 1.
+ SH070315 BAL0703 -1. BAL0715 1.
+ SH070415 COST 518.84 TRAN0704 1.
+ SH070415 BAL0704 -1. BAL0715 1.
+ SH070515 COST 433.82 TRAN0705 1.
+ SH070515 BAL0705 -1. BAL0715 1.
+ SH070615 COST 204.92 TRAN0706 1.
+ SH070615 BAL0752 -1. BAL0715 1.
+ SH070815 COST 406.57 TRAN0708 1.
+ SH070815 BAL0783 -1. BAL0715 1.
+ SH070116 COST 172.22 TRAN0701 1.
+ SH070116 BAL0701 -1. BAL0716 1.
+ SH070216 COST 305.2 TRAN0702 1.
+ SH070216 BAL0702 -1. BAL0716 1.
+ SH070316 COST 247.43 TRAN0703 1.
+ SH070316 BAL0703 -1. BAL0716 1.
+ SH070416 COST 312.83 TRAN0704 1.
+ SH070416 BAL0704 -1. BAL0716 1.
+ SH070516 COST 347.71 TRAN0705 1.
+ SH070516 BAL0705 -1. BAL0716 1.
+ SH070616 COST 142.79 TRAN0706 1.
+ SH070616 BAL0752 -1. BAL0716 1.
+ SH070816 COST 223.45 TRAN0708 1.
+ SH070816 BAL0783 -1. BAL0716 1.
+ SH070117 COST 164.59 TRAN0701 1.
+ SH070117 BAL0701 -1. BAL0717 1.
+ SH070217 COST 550.45 TRAN0702 1.
+ SH070217 BAL0702 -1. BAL0717 1.
+ SH070317 COST 298.66 TRAN0703 1.
+ SH070317 BAL0703 -1. BAL0717 1.
+ SH070417 COST 62.13 TRAN0704 1.
+ SH070417 BAL0704 -1. BAL0717 1.
+ SH070517 COST 324.82 TRAN0705 1.
+ SH070517 BAL0705 -1. BAL0717 1.
+ SH070717 COST 321.55 TRAN0707 1.
+ SH070717 BAL0764 -1. BAL0717 1.
+ SH070817 COST 29.43 TRAN0708 1.
+ SH070817 BAL0783 -1. BAL0717 1.
+ SH070118 COST 190.75 TRAN0701 1.
+ SH070118 BAL0701 -1. BAL0718 1.
+ SH070218 COST 393.49 TRAN0702 1.
+ SH070218 BAL0702 -1. BAL0718 1.
+ SH070318 COST 294.3 TRAN0703 1.
+ SH070318 BAL0703 -1. BAL0718 1.
+ SH070418 COST 167.86 TRAN0704 1.
+ SH070418 BAL0704 -1. BAL0718 1.
+ SH070518 COST 443.63 TRAN0705 1.
+ SH070518 BAL0705 -1. BAL0718 1.
+ SH070618 COST 383.68 TRAN0706 1.
+ SH070618 BAL0752 -1. BAL0718 1.
+ SH070818 COST 112.27 TRAN0708 1.
+ SH070818 BAL0783 -1. BAL0718 1.
+ SH070119 COST 270.32 TRAN0701 1.
+ SH070119 BAL0701 -1. BAL0719 1.
+ SH070219 COST 748.83 TRAN0702 1.
+ SH070219 BAL0702 -1. BAL0719 1.
+ SH070319 COST 345.53 TRAN0703 1.
+ SH070319 BAL0703 -1. BAL0719 1.
+ SH070419 COST 173.31 TRAN0704 1.
+ SH070419 BAL0704 -1. BAL0719 1.
+ SH070519 COST 226.72 TRAN0705 1.
+ SH070519 BAL0705 -1. BAL0719 1.
+ SH070619 COST 376.05 TRAN0706 1.
+ SH070619 BAL0752 -1. BAL0719 1.
+ SH070819 COST 107.91 TRAN0708 1.
+ SH070819 BAL0783 -1. BAL0719 1.
+ SH070120 COST 223.45 TRAN0701 1.
+ SH070120 BAL0701 -1. BAL0720 1.
+ SH070220 COST 744.47 TRAN0702 1.
+ SH070220 BAL0702 -1. BAL0720 1.
+ SH070320 COST 323.73 TRAN0703 1.
+ SH070320 BAL0703 -1. BAL0720 1.
+ SH070420 COST 123.17 TRAN0704 1.
+ SH070420 BAL0704 -1. BAL0720 1.
+ SH070520 COST 317.19 TRAN0705 1.
+ SH070520 BAL0705 -1. BAL0720 1.
+ SH070820 COST 137.34 TRAN0708 1.
+ SH070820 BAL0783 -1. BAL0720 1.
+ SH070121 COST 439.27 TRAN0701 1.
+ SH070121 BAL0701 -1. BAL0721 1.
+ SH070221 COST 401.12 TRAN0702 1.
+ SH070221 BAL0702 -1. BAL0721 1.
+ SH070321 COST 486.14 TRAN0703 1.
+ SH070321 BAL0703 -1. BAL0721 1.
+ SH070421 COST 348.8 TRAN0704 1.
+ SH070421 BAL0704 -1. BAL0721 1.
+ SH070521 COST 599.5 TRAN0705 1.
+ SH070521 BAL0705 -1. BAL0721 1.
+ SH070821 COST 348.8 TRAN0708 1.
+ SH070821 BAL0783 -1. BAL0721 1.
+ SH070122 COST 270.32 TRAN0701 1.
+ SH070122 BAL0701 -1. BAL0722 1.
+ SH070222 COST 630.02 TRAN0702 1.
+ SH070222 BAL0702 -1. BAL0722 1.
+ SH070322 COST 325.91 TRAN0703 1.
+ SH070322 BAL0703 -1. BAL0722 1.
+ SH070422 COST 244.16 TRAN0704 1.
+ SH070422 BAL0704 -1. BAL0722 1.
+ SH070522 COST 195.11 TRAN0705 1.
+ SH070522 BAL0705 -1. BAL0722 1.
+ SH070622 COST 337.9 TRAN0706 1.
+ SH070622 BAL0752 -1. BAL0722 1.
+ SH070822 COST 151.51 TRAN0708 1.
+ SH070822 BAL0783 -1. BAL0722 1.
+ SH070123 COST 255.06 TRAN0701 1.
+ SH070123 BAL0701 -1. BAL0723 1.
+ SH070223 COST 589.69 TRAN0702 1.
+ SH070223 BAL0702 -1. BAL0723 1.
+ SH070323 COST 312.83 TRAN0703 1.
+ SH070323 BAL0703 -1. BAL0723 1.
+ SH070423 COST 182.03 TRAN0704 1.
+ SH070423 BAL0704 -1. BAL0723 1.
+ SH070523 COST 180.94 TRAN0705 1.
+ SH070523 BAL0705 -1. BAL0723 1.
+ SH070823 COST 151.51 TRAN0708 1.
+ SH070823 BAL0783 -1. BAL0723 1.
+ SH070124 COST 1565.24 TRAN0701 1.
+ SH070124 BAL0701 -1. BAL0724 1.
+ SH070125 COST 421.83 TRAN0701 1.
+ SH070125 BAL0701 -1. BAL0725 1.
+ SH070225 COST 465.43 TRAN0702 1.
+ SH070225 BAL0702 -1. BAL0725 1.
+ SH070325 COST 556.99 TRAN0703 1.
+ SH070325 BAL0703 -1. BAL0725 1.
+ SH070425 COST 379.32 TRAN0704 1.
+ SH070425 BAL0704 -1. BAL0725 1.
+ SH070525 COST 616.94 TRAN0705 1.
+ SH070525 BAL0705 -1. BAL0725 1.
+ SH070625 COST 439.27 TRAN0706 1.
+ SH070625 BAL0752 -1. BAL0725 1.
+ SH070825 COST 332.45 TRAN0708 1.
+ SH070825 BAL0783 -1. BAL0725 1.
+ SH070426 COST 294.3 TRAN0704 1.
+ SH070426 BAL0704 -1. BAL0726 1.
+ SH070127 COST 255.06 TRAN0701 1.
+ SH070127 BAL0701 -1. BAL0727 1.
+ SH070227 COST 309.56 TRAN0702 1.
+ SH070227 BAL0702 -1. BAL0727 1.
+ SH070327 COST 315.01 TRAN0703 1.
+ SH070327 BAL0703 -1. BAL0727 1.
+ SH070427 COST 365.15 TRAN0704 1.
+ SH070427 BAL0704 -1. BAL0727 1.
+ SH070527 COST 412.02 TRAN0705 1.
+ SH070527 BAL0705 -1. BAL0727 1.
+ SH070627 COST 292.12 TRAN0706 1.
+ SH070627 BAL0752 -1. BAL0727 1.
+ SH070827 COST 274.68 TRAN0708 1.
+ SH070827 BAL0783 -1. BAL0727 1.
+ SH070128 COST 264.87 TRAN0701 1.
+ SH070128 BAL0701 -1. BAL0728 1.
+ SH070228 COST 620.21 TRAN0702 1.
+ SH070228 BAL0702 -1. BAL0728 1.
+ SH070328 COST 322.64 TRAN0703 1.
+ SH070328 BAL0703 -1. BAL0728 1.
+ SH070428 COST 321.55 TRAN0704 1.
+ SH070428 BAL0704 -1. BAL0728 1.
+ SH070528 COST 111.18 TRAN0705 1.
+ SH070528 BAL0705 -1. BAL0728 1.
+ SH070628 COST 284.49 TRAN0706 1.
+ SH070628 BAL0752 -1. BAL0728 1.
+ SH070728 COST 116.63 TRAN0707 1.
+ SH070728 BAL0764 -1. BAL0728 1.
+ SH070828 COST 276.86 TRAN0708 1.
+ SH070828 BAL0783 -1. BAL0728 1.
+ SH070129 COST 243.07 TRAN0701 1.
+ SH070129 BAL0701 -1. BAL0729 1.
+ SH070229 COST 505.76 TRAN0702 1.
+ SH070229 BAL0702 -1. BAL0729 1.
+ SH070329 COST 262.69 TRAN0703 1.
+ SH070329 BAL0703 -1. BAL0729 1.
+ SH070429 COST 216.91 TRAN0704 1.
+ SH070429 BAL0704 -1. BAL0729 1.
+ SH070529 COST 468.7 TRAN0705 1.
+ SH070529 BAL0705 -1. BAL0729 1.
+ SH070629 COST 284.49 TRAN0706 1.
+ SH070629 BAL0752 -1. BAL0729 1.
+ SH070829 COST 156.96 TRAN0708 1.
+ SH070829 BAL0783 -1. BAL0729 1.
+ SH070130 COST 507.94 TRAN0701 1.
+ SH070130 BAL0701 -1. BAL0730 1.
+ SH070230 COST 475.24 TRAN0702 1.
+ SH070230 BAL0702 -1. BAL0730 1.
+ SH070330 COST 570.07 TRAN0703 1.
+ SH070330 BAL0703 -1. BAL0730 1.
+ SH070430 COST 331.36 TRAN0704 1.
+ SH070430 BAL0704 -1. BAL0730 1.
+ SH070530 COST 486.14 TRAN0705 1.
+ SH070530 BAL0705 -1. BAL0730 1.
+ SH070830 COST 416.38 TRAN0708 1.
+ SH070830 BAL0783 -1. BAL0730 1.
+ SH070131 COST 120.99 TRAN0701 1.
+ SH070131 BAL0701 -1. BAL0731 1.
+ SH070231 COST 382.59 TRAN0702 1.
+ SH070231 BAL0702 -1. BAL0731 1.
+ SH070331 COST 119.9 TRAN0703 1.
+ SH070331 BAL0703 -1. BAL0731 1.
+ SH070431 COST 275.77 TRAN0704 1.
+ SH070431 BAL0704 -1. BAL0731 1.
+ SH070531 COST 334.63 TRAN0705 1.
+ SH070531 BAL0705 -1. BAL0731 1.
+ SH070631 COST 122.08 TRAN0706 1.
+ SH070631 BAL0752 -1. BAL0731 1.
+ SH070831 COST 243.07 TRAN0708 1.
+ SH070831 BAL0783 -1. BAL0731 1.
+ SH070132 COST 325.91 TRAN0701 1.
+ SH070132 BAL0701 -1. BAL0732 1.
+ SH070232 COST 521.02 TRAN0702 1.
+ SH070232 BAL0702 -1. BAL0732 1.
+ SH070332 COST 461.07 TRAN0703 1.
+ SH070332 BAL0703 -1. BAL0732 1.
+ SH070432 COST 171.13 TRAN0704 1.
+ SH070432 BAL0704 -1. BAL0732 1.
+ SH070532 COST 427.28 TRAN0705 1.
+ SH070532 BAL0705 -1. BAL0732 1.
+ SH070832 COST 196.2 TRAN0708 1.
+ SH070832 BAL0783 -1. BAL0732 1.
+ SH070133 COST 537.37 TRAN0701 1.
+ SH070133 BAL0701 -1. BAL0733 1.
+ SH070233 COST 436. TRAN0702 1.
+ SH070233 BAL0702 -1. BAL0733 1.
+ SH070333 COST 591.87 TRAN0703 1.
+ SH070333 BAL0703 -1. BAL0733 1.
+ SH070433 COST 485.05 TRAN0704 1.
+ SH070433 BAL0704 -1. BAL0733 1.
+ SH070533 COST 687.79 TRAN0705 1.
+ SH070533 BAL0705 -1. BAL0733 1.
+ SH070833 COST 415.29 TRAN0708 1.
+ SH070833 BAL0783 -1. BAL0733 1.
+ SH070134 COST 420.74 TRAN0701 1.
+ SH070134 BAL0701 -1. BAL0734 1.
+ SH070234 COST 713.95 TRAN0702 1.
+ SH070234 BAL0702 -1. BAL0734 1.
+ SH070334 COST 548.27 TRAN0703 1.
+ SH070334 BAL0703 -1. BAL0734 1.
+ SH070434 COST 229.99 TRAN0704 1.
+ SH070434 BAL0704 -1. BAL0734 1.
+ SH070534 COST 480.69 TRAN0705 1.
+ SH070534 BAL0705 -1. BAL0734 1.
+ SH070834 COST 286.67 TRAN0708 1.
+ SH070834 BAL0783 -1. BAL0734 1.
+ SH070135 COST 502.49 TRAN0701 1.
+ SH070135 BAL0701 -1. BAL0735 1.
+ SH070235 COST 485.05 TRAN0702 1.
+ SH070235 BAL0702 -1. BAL0735 1.
+ SH070335 COST 410.93 TRAN0703 1.
+ SH070335 BAL0703 -1. BAL0735 1.
+ SH070435 COST 132.98 TRAN0704 1.
+ SH070435 BAL0704 -1. BAL0735 1.
+ SH070535 COST 469.79 TRAN0705 1.
+ SH070535 BAL0705 -1. BAL0735 1.
+ SH070835 COST 256.15 TRAN0708 1.
+ SH070835 BAL0783 -1. BAL0735 1.
+ SH070136 COST 223.45 TRAN0701 1.
+ SH070136 BAL0701 -1. BAL0736 1.
+ SH070236 COST 488.32 TRAN0702 1.
+ SH070236 BAL0702 -1. BAL0736 1.
+ SH070336 COST 115.54 TRAN0703 1.
+ SH070336 BAL0703 -1. BAL0736 1.
+ SH070436 COST 403.3 TRAN0704 1.
+ SH070436 BAL0704 -1. BAL0736 1.
+ SH070536 COST 377.14 TRAN0705 1.
+ SH070536 BAL0705 -1. BAL0736 1.
+ SH070636 COST 119.9 TRAN0706 1.
+ SH070636 BAL0752 -1. BAL0736 1.
+ SH070836 COST 349.89 TRAN0708 1.
+ SH070836 BAL0783 -1. BAL0736 1.
+ SH070137 COST 100.28 TRAN0701 1.
+ SH070137 BAL0701 -1. BAL0737 1.
+ SH070237 COST 372.78 TRAN0702 1.
+ SH070237 BAL0702 -1. BAL0737 1.
+ SH070337 COST 172.22 TRAN0703 1.
+ SH070337 BAL0703 -1. BAL0737 1.
+ SH070437 COST 331.36 TRAN0704 1.
+ SH070437 BAL0704 -1. BAL0737 1.
+ SH070537 COST 198.38 TRAN0705 1.
+ SH070537 BAL0705 -1. BAL0737 1.
+ SH070637 COST 211.46 TRAN0706 1.
+ SH070637 BAL0752 -1. BAL0737 1.
+ SH070837 COST 274.68 TRAN0708 1.
+ SH070837 BAL0783 -1. BAL0737 1.
+ SH070138 COST 148.24 TRAN0701 1.
+ SH070138 BAL0701 -1. BAL0738 1.
+ SH070238 COST 265.96 TRAN0702 1.
+ SH070238 BAL0702 -1. BAL0738 1.
+ SH070338 COST 103.55 TRAN0703 1.
+ SH070338 BAL0703 -1. BAL0738 1.
+ SH070438 COST 335.72 TRAN0704 1.
+ SH070438 BAL0704 -1. BAL0738 1.
+ SH070538 COST 303.02 TRAN0705 1.
+ SH070538 BAL0705 -1. BAL0738 1.
+ SH070638 COST 42.51 TRAN0706 1.
+ SH070638 BAL0752 -1. BAL0738 1.
+ SH070738 COST 235.44 TRAN0707 1.
+ SH070738 BAL0764 -1. BAL0738 1.
+ SH070838 COST 258.33 TRAN0708 1.
+ SH070838 BAL0783 -1. BAL0738 1.
+ SH070139 COST 141.7 TRAN0701 1.
+ SH070139 BAL0701 -1. BAL0739 1.
+ SH070239 COST 369.51 TRAN0702 1.
+ SH070239 BAL0702 -1. BAL0739 1.
+ SH070339 COST 174.4 TRAN0703 1.
+ SH070339 BAL0703 -1. BAL0739 1.
+ SH070439 COST 271.41 TRAN0704 1.
+ SH070439 BAL0704 -1. BAL0739 1.
+ SH070539 COST 467.61 TRAN0705 1.
+ SH070539 BAL0705 -1. BAL0739 1.
+ SH070639 COST 222.36 TRAN0706 1.
+ SH070639 BAL0752 -1. BAL0739 1.
+ SH070839 COST 183.12 TRAN0708 1.
+ SH070839 BAL0783 -1. BAL0739 1.
+ SH070140 COST 179.85 TRAN0701 1.
+ SH070140 BAL0701 -1. BAL0740 1.
+ SH070240 COST 412.02 TRAN0702 1.
+ SH070240 BAL0702 -1. BAL0740 1.
+ SH070340 COST 112.27 TRAN0703 1.
+ SH070340 BAL0703 -1. BAL0740 1.
+ SH070440 COST 323.73 TRAN0704 1.
+ SH070440 BAL0704 -1. BAL0740 1.
+ SH070540 COST 240.89 TRAN0705 1.
+ SH070540 BAL0705 -1. BAL0740 1.
+ SH070640 COST 142.79 TRAN0706 1.
+ SH070640 BAL0752 -1. BAL0740 1.
+ SH070840 COST 298.66 TRAN0708 1.
+ SH070840 BAL0783 -1. BAL0740 1.
+ SH070141 COST 213.64 TRAN0701 1.
+ SH070141 BAL0701 -1. BAL0741 1.
+ SH070241 COST 327. TRAN0702 1.
+ SH070241 BAL0702 -1. BAL0741 1.
+ SH070341 COST 163.5 TRAN0703 1.
+ SH070341 BAL0703 -1. BAL0741 1.
+ SH070441 COST 353.16 TRAN0704 1.
+ SH070441 BAL0704 -1. BAL0741 1.
+ SH070541 COST 401.12 TRAN0705 1.
+ SH070541 BAL0705 -1. BAL0741 1.
+ SH070641 COST 109. TRAN0706 1.
+ SH070641 BAL0752 -1. BAL0741 1.
+ SH070841 COST 325.91 TRAN0708 1.
+ SH070841 BAL0783 -1. BAL0741 1.
+ SH070142 COST 98.1 TRAN0701 1.
+ SH070142 BAL0701 -1. BAL0742 1.
+ SH070242 COST 451.26 TRAN0702 1.
+ SH070242 BAL0702 -1. BAL0742 1.
+ SH070342 COST 174.4 TRAN0703 1.
+ SH070342 BAL0703 -1. BAL0742 1.
+ SH070442 COST 212.55 TRAN0704 1.
+ SH070442 BAL0704 -1. BAL0742 1.
+ SH070542 COST 393.49 TRAN0705 1.
+ SH070542 BAL0705 -1. BAL0742 1.
+ SH070642 COST 175.49 TRAN0706 1.
+ SH070642 BAL0752 -1. BAL0742 1.
+ SH070842 COST 165.68 TRAN0708 1.
+ SH070842 BAL0783 -1. BAL0742 1.
+ SH070143 COST 173.31 TRAN0701 1.
+ SH070143 BAL0701 -1. BAL0743 1.
+ SH070243 COST 430.55 TRAN0702 1.
+ SH070243 BAL0702 -1. BAL0743 1.
+ SH070343 COST 27.25 TRAN0703 1.
+ SH070343 BAL0703 -1. BAL0743 1.
+ SH070443 COST 322.64 TRAN0704 1.
+ SH070443 BAL0704 -1. BAL0743 1.
+ SH070543 COST 281.22 TRAN0705 1.
+ SH070543 BAL0705 -1. BAL0743 1.
+ SH070643 COST 109. TRAN0706 1.
+ SH070643 BAL0752 -1. BAL0743 1.
+ SH070743 COST 262.69 TRAN0707 1.
+ SH070743 BAL0764 -1. BAL0743 1.
+ SH070843 COST 295.39 TRAN0708 1.
+ SH070843 BAL0783 -1. BAL0743 1.
+ SH070144 COST 173.31 TRAN0701 1.
+ SH070144 BAL0701 -1. BAL0744 1.
+ SH070244 COST 413.11 TRAN0702 1.
+ SH070244 BAL0702 -1. BAL0744 1.
+ SH070344 COST 139.52 TRAN0703 1.
+ SH070344 BAL0703 -1. BAL0744 1.
+ SH070444 COST 340.08 TRAN0704 1.
+ SH070444 BAL0704 -1. BAL0744 1.
+ SH070544 COST 337.9 TRAN0705 1.
+ SH070544 BAL0705 -1. BAL0744 1.
+ SH070644 COST 97.01 TRAN0706 1.
+ SH070644 BAL0752 -1. BAL0744 1.
+ SH070844 COST 324.82 TRAN0708 1.
+ SH070844 BAL0783 -1. BAL0744 1.
+ SH070145 COST 187.48 TRAN0701 1.
+ SH070145 BAL0701 -1. BAL0745 1.
+ SH070245 COST 475.24 TRAN0702 1.
+ SH070245 BAL0702 -1. BAL0745 1.
+ SH070345 COST 175.49 TRAN0703 1.
+ SH070345 BAL0703 -1. BAL0745 1.
+ SH070445 COST 318.28 TRAN0704 1.
+ SH070445 BAL0704 -1. BAL0745 1.
+ SH070545 COST 255.06 TRAN0705 1.
+ SH070545 BAL0705 -1. BAL0745 1.
+ SH070645 COST 208.19 TRAN0706 1.
+ SH070645 BAL0752 -1. BAL0745 1.
+ SH070745 COST 214.73 TRAN0707 1.
+ SH070745 BAL0764 -1. BAL0745 1.
+ SH070845 COST 332.45 TRAN0708 1.
+ SH070845 BAL0783 -1. BAL0745 1.
+ SH070146 COST 267.05 TRAN0701 1.
+ SH070146 BAL0701 -1. BAL0746 1.
+ SH070246 COST 297.57 TRAN0702 1.
+ SH070246 BAL0702 -1. BAL0746 1.
+ SH070346 COST 240.89 TRAN0703 1.
+ SH070346 BAL0703 -1. BAL0746 1.
+ SH070446 COST 487.23 TRAN0704 1.
+ SH070446 BAL0704 -1. BAL0746 1.
+ SH070546 COST 468.7 TRAN0705 1.
+ SH070546 BAL0705 -1. BAL0746 1.
+ SH070646 COST 280.13 TRAN0706 1.
+ SH070646 BAL0752 -1. BAL0746 1.
+ SH070846 COST 488.32 TRAN0708 1.
+ SH070846 BAL0783 -1. BAL0746 1.
+ SH070147 COST 119.9 TRAN0701 1.
+ SH070147 BAL0701 -1. BAL0747 1.
+ SH070247 COST 406.57 TRAN0702 1.
+ SH070247 BAL0702 -1. BAL0747 1.
+ SH070347 COST 173.31 TRAN0703 1.
+ SH070347 BAL0703 -1. BAL0747 1.
+ SH070447 COST 298.66 TRAN0704 1.
+ SH070447 BAL0704 -1. BAL0747 1.
+ SH070547 COST 253.97 TRAN0705 1.
+ SH070547 BAL0705 -1. BAL0747 1.
+ SH070647 COST 158.05 TRAN0706 1.
+ SH070647 BAL0752 -1. BAL0747 1.
+ SH070847 COST 265.96 TRAN0708 1.
+ SH070847 BAL0783 -1. BAL0747 1.
+ SH070148 COST 103.55 TRAN0701 1.
+ SH070148 BAL0701 -1. BAL0748 1.
+ SH070248 COST 369.51 TRAN0702 1.
+ SH070248 BAL0702 -1. BAL0748 1.
+ SH070348 COST 149.33 TRAN0703 1.
+ SH070348 BAL0703 -1. BAL0748 1.
+ SH070448 COST 250.7 TRAN0704 1.
+ SH070448 BAL0704 -1. BAL0748 1.
+ SH070548 COST 269.23 TRAN0705 1.
+ SH070548 BAL0705 -1. BAL0748 1.
+ SH070648 COST 125.35 TRAN0706 1.
+ SH070648 BAL0752 -1. BAL0748 1.
+ SH070848 COST 212.55 TRAN0708 1.
+ SH070848 BAL0783 -1. BAL0748 1.
+ SH070149 COST 358.61 TRAN0701 1.
+ SH070149 BAL0701 -1. BAL0749 1.
+ SH070249 COST 583.15 TRAN0702 1.
+ SH070249 BAL0702 -1. BAL0749 1.
+ SH070349 COST 361.88 TRAN0703 1.
+ SH070349 BAL0703 -1. BAL0749 1.
+ SH070449 COST 415.29 TRAN0704 1.
+ SH070449 BAL0704 -1. BAL0749 1.
+ SH070549 COST 165.68 TRAN0705 1.
+ SH070549 BAL0705 -1. BAL0749 1.
+ SH070649 COST 368.42 TRAN0706 1.
+ SH070649 BAL0752 -1. BAL0749 1.
+ SH070749 COST 146.06 TRAN0707 1.
+ SH070749 BAL0764 -1. BAL0749 1.
+ SH070849 COST 444.72 TRAN0708 1.
+ SH070849 BAL0783 -1. BAL0749 1.
+ SH070150 COST 262.69 TRAN0701 1.
+ SH070150 BAL0701 -1. BAL0750 1.
+ SH070250 COST 667.08 TRAN0702 1.
+ SH070250 BAL0702 -1. BAL0750 1.
+ SH070350 COST 268.14 TRAN0703 1.
+ SH070350 BAL0703 -1. BAL0750 1.
+ SH070450 COST 397.85 TRAN0704 1.
+ SH070450 BAL0704 -1. BAL0750 1.
+ SH070550 COST 256.15 TRAN0705 1.
+ SH070550 BAL0705 -1. BAL0750 1.
+ SH070750 COST 149.33 TRAN0707 1.
+ SH070750 BAL0764 -1. BAL0750 1.
+ SH070850 COST 442.54 TRAN0708 1.
+ SH070850 BAL0783 -1. BAL0750 1.
+ SH070151 COST 361.88 TRAN0701 1.
+ SH070151 BAL0701 -1. BAL0751 1.
+ SH070251 COST 599.5 TRAN0702 1.
+ SH070251 BAL0702 -1. BAL0751 1.
+ SH070351 COST 371.69 TRAN0703 1.
+ SH070351 BAL0703 -1. BAL0751 1.
+ SH070451 COST 368.42 TRAN0704 1.
+ SH070451 BAL0704 -1. BAL0751 1.
+ SH070551 COST 134.07 TRAN0705 1.
+ SH070551 BAL0705 -1. BAL0751 1.
+ SH070751 COST 107.91 TRAN0707 1.
+ SH070751 BAL0764 -1. BAL0751 1.
+ SH070851 COST 466.52 TRAN0708 1.
+ SH070851 BAL0783 -1. BAL0751 1.
+ SH070152 COST 122.08 TRAN0701 1.
+ SH070152 BAL0701 -1. BAL0752 1.
+ SH070252 COST 327. TRAN0702 1.
+ SH070252 BAL0702 -1. BAL0752 1.
+ SH070352 COST 89.38 TRAN0703 1.
+ SH070352 BAL0703 -1. BAL0752 1.
+ SH070452 COST 350.98 TRAN0704 1.
+ SH070452 BAL0704 -1. BAL0752 1.
+ SH070552 COST 321.55 TRAN0705 1.
+ SH070552 BAL0705 -1. BAL0752 1.
+ SH070852 COST 275.77 TRAN0708 1.
+ SH070852 BAL0783 -1. BAL0752 1.
+ SH070153 COST 391.31 TRAN0701 1.
+ SH070153 BAL0701 -1. BAL0753 1.
+ SH070253 COST 693.24 TRAN0702 1.
+ SH070253 BAL0702 -1. BAL0753 1.
+ SH070353 COST 354.25 TRAN0703 1.
+ SH070353 BAL0703 -1. BAL0753 1.
+ SH070453 COST 449.08 TRAN0704 1.
+ SH070453 BAL0704 -1. BAL0753 1.
+ SH070553 COST 200.56 TRAN0705 1.
+ SH070553 BAL0705 -1. BAL0753 1.
+ SH070653 COST 391.31 TRAN0706 1.
+ SH070653 BAL0752 -1. BAL0753 1.
+ SH070753 COST 159.14 TRAN0707 1.
+ SH070753 BAL0764 -1. BAL0753 1.
+ SH070853 COST 439.27 TRAN0708 1.
+ SH070853 BAL0783 -1. BAL0753 1.
+ SH070154 COST 201.65 TRAN0701 1.
+ SH070154 BAL0701 -1. BAL0754 1.
+ SH070254 COST 485.05 TRAN0702 1.
+ SH070254 BAL0702 -1. BAL0754 1.
+ SH070354 COST 236.53 TRAN0703 1.
+ SH070354 BAL0703 -1. BAL0754 1.
+ SH070454 COST 373.87 TRAN0704 1.
+ SH070454 BAL0704 -1. BAL0754 1.
+ SH070554 COST 232.17 TRAN0705 1.
+ SH070554 BAL0705 -1. BAL0754 1.
+ SH070654 COST 221.27 TRAN0706 1.
+ SH070654 BAL0752 -1. BAL0754 1.
+ SH070854 COST 438.18 TRAN0708 1.
+ SH070854 BAL0783 -1. BAL0754 1.
+ SH070155 COST 303.02 TRAN0701 1.
+ SH070155 BAL0701 -1. BAL0755 1.
+ SH070255 COST 522.11 TRAN0702 1.
+ SH070255 BAL0702 -1. BAL0755 1.
+ SH070355 COST 306.29 TRAN0703 1.
+ SH070355 BAL0703 -1. BAL0755 1.
+ SH070455 COST 320.46 TRAN0704 1.
+ SH070455 BAL0704 -1. BAL0755 1.
+ SH070555 COST 167.86 TRAN0705 1.
+ SH070555 BAL0705 -1. BAL0755 1.
+ SH070655 COST 316.1 TRAN0706 1.
+ SH070655 BAL0752 -1. BAL0755 1.
+ SH070755 COST 116.63 TRAN0707 1.
+ SH070755 BAL0764 -1. BAL0755 1.
+ SH070855 COST 320.46 TRAN0708 1.
+ SH070855 BAL0783 -1. BAL0755 1.
+ SH070156 COST 425.1 TRAN0701 1.
+ SH070156 BAL0701 -1. BAL0756 1.
+ SH070256 COST 631.11 TRAN0702 1.
+ SH070256 BAL0702 -1. BAL0756 1.
+ SH070356 COST 332.45 TRAN0703 1.
+ SH070356 BAL0703 -1. BAL0756 1.
+ SH070456 COST 397.85 TRAN0704 1.
+ SH070456 BAL0704 -1. BAL0756 1.
+ SH070556 COST 148.24 TRAN0705 1.
+ SH070556 BAL0705 -1. BAL0756 1.
+ SH070656 COST 369.51 TRAN0706 1.
+ SH070656 BAL0752 -1. BAL0756 1.
+ SH070756 COST 132.98 TRAN0707 1.
+ SH070756 BAL0764 -1. BAL0756 1.
+ SH070856 COST 389.13 TRAN0708 1.
+ SH070856 BAL0783 -1. BAL0756 1.
+ SH070157 COST 284.49 TRAN0701 1.
+ SH070157 BAL0701 -1. BAL0757 1.
+ SH070257 COST 566.8 TRAN0702 1.
+ SH070257 BAL0702 -1. BAL0757 1.
+ SH070357 COST 316.1 TRAN0703 1.
+ SH070357 BAL0703 -1. BAL0757 1.
+ SH070457 COST 255.06 TRAN0704 1.
+ SH070457 BAL0704 -1. BAL0757 1.
+ SH070557 COST 183.12 TRAN0705 1.
+ SH070557 BAL0705 -1. BAL0757 1.
+ SH070657 COST 347.71 TRAN0706 1.
+ SH070657 BAL0752 -1. BAL0757 1.
+ SH070757 COST 161.32 TRAN0707 1.
+ SH070757 BAL0764 -1. BAL0757 1.
+ SH070857 COST 251.79 TRAN0708 1.
+ SH070857 BAL0783 -1. BAL0757 1.
+ SH070158 COST 320.46 TRAN0701 1.
+ SH070158 BAL0701 -1. BAL0758 1.
+ SH070258 COST 567.89 TRAN0702 1.
+ SH070258 BAL0702 -1. BAL0758 1.
+ SH070358 COST 303.02 TRAN0703 1.
+ SH070358 BAL0703 -1. BAL0758 1.
+ SH070458 COST 373.87 TRAN0704 1.
+ SH070458 BAL0704 -1. BAL0758 1.
+ SH070558 COST 22.89 TRAN0705 1.
+ SH070558 BAL0705 -1. BAL0758 1.
+ SH070658 COST 355.34 TRAN0706 1.
+ SH070658 BAL0752 -1. BAL0758 1.
+ SH070758 COST 74.12 TRAN0707 1.
+ SH070758 BAL0764 -1. BAL0758 1.
+ SH070858 COST 276.86 TRAN0708 1.
+ SH070858 BAL0783 -1. BAL0758 1.
+ SH070159 COST 224.54 TRAN0701 1.
+ SH070159 BAL0701 -1. BAL0759 1.
+ SH070259 COST 542.82 TRAN0702 1.
+ SH070259 BAL0702 -1. BAL0759 1.
+ SH070359 COST 259.42 TRAN0703 1.
+ SH070359 BAL0703 -1. BAL0759 1.
+ SH070459 COST 265.96 TRAN0704 1.
+ SH070459 BAL0704 -1. BAL0759 1.
+ SH070559 COST 173.31 TRAN0705 1.
+ SH070559 BAL0705 -1. BAL0759 1.
+ SH070659 COST 323.73 TRAN0706 1.
+ SH070659 BAL0752 -1. BAL0759 1.
+ SH070759 COST 114.45 TRAN0707 1.
+ SH070759 BAL0764 -1. BAL0759 1.
+ SH070859 COST 277.95 TRAN0708 1.
+ SH070859 BAL0783 -1. BAL0759 1.
+ SH070160 COST 284.49 TRAN0701 1.
+ SH070160 BAL0701 -1. BAL0760 1.
+ SH070260 COST 599.5 TRAN0702 1.
+ SH070260 BAL0702 -1. BAL0760 1.
+ SH070360 COST 308.47 TRAN0703 1.
+ SH070360 BAL0703 -1. BAL0760 1.
+ SH070460 COST 340.08 TRAN0704 1.
+ SH070460 BAL0704 -1. BAL0760 1.
+ SH070560 COST 147.15 TRAN0705 1.
+ SH070560 BAL0705 -1. BAL0760 1.
+ SH070660 COST 352.07 TRAN0706 1.
+ SH070660 BAL0752 -1. BAL0760 1.
+ SH070760 COST 95.92 TRAN0707 1.
+ SH070760 BAL0764 -1. BAL0760 1.
+ SH070860 COST 325.91 TRAN0708 1.
+ SH070860 BAL0783 -1. BAL0760 1.
+ SH070163 COST 289.94 TRAN0701 1.
+ SH070163 BAL0701 -1. BAL0763 1.
+ SH070263 COST 538.46 TRAN0702 1.
+ SH070263 BAL0702 -1. BAL0763 1.
+ SH070363 COST 312.83 TRAN0703 1.
+ SH070363 BAL0703 -1. BAL0763 1.
+ SH070463 COST 402.21 TRAN0704 1.
+ SH070463 BAL0704 -1. BAL0763 1.
+ SH070563 COST 165.68 TRAN0705 1.
+ SH070563 BAL0705 -1. BAL0763 1.
+ SH070663 COST 343.35 TRAN0706 1.
+ SH070663 BAL0752 -1. BAL0763 1.
+ SH070763 COST 135.16 TRAN0707 1.
+ SH070763 BAL0764 -1. BAL0763 1.
+ SH070863 COST 436. TRAN0708 1.
+ SH070863 BAL0783 -1. BAL0763 1.
+ SH070164 COST 216.91 TRAN0701 1.
+ SH070164 BAL0701 -1. BAL0764 1.
+ SH070264 COST 573.34 TRAN0702 1.
+ SH070264 BAL0702 -1. BAL0764 1.
+ SH070364 COST 243.07 TRAN0703 1.
+ SH070364 BAL0703 -1. BAL0764 1.
+ SH070464 COST 366.24 TRAN0704 1.
+ SH070464 BAL0704 -1. BAL0764 1.
+ SH070564 COST 63.22 TRAN0705 1.
+ SH070564 BAL0705 -1. BAL0764 1.
+ SH070664 COST 345.53 TRAN0706 1.
+ SH070664 BAL0752 -1. BAL0764 1.
+ SH070864 COST 272.5 TRAN0708 1.
+ SH070864 BAL0783 -1. BAL0764 1.
+ SH070165 COST 470.88 TRAN0701 1.
+ SH070165 BAL0701 -1. BAL0765 1.
+ SH070265 COST 334.63 TRAN0702 1.
+ SH070265 BAL0702 -1. BAL0765 1.
+ SH070365 COST 550.45 TRAN0703 1.
+ SH070365 BAL0703 -1. BAL0765 1.
+ SH070465 COST 422.92 TRAN0704 1.
+ SH070465 BAL0704 -1. BAL0765 1.
+ SH070565 COST 658.36 TRAN0705 1.
+ SH070565 BAL0705 -1. BAL0765 1.
+ SH070865 COST 452.35 TRAN0708 1.
+ SH070865 BAL0783 -1. BAL0765 1.
+ SH070166 COST 610.4 TRAN0701 1.
+ SH070166 BAL0701 -1. BAL0766 1.
+ SH070266 COST 282.31 TRAN0702 1.
+ SH070266 BAL0702 -1. BAL0766 1.
+ SH070366 COST 630.02 TRAN0703 1.
+ SH070366 BAL0703 -1. BAL0766 1.
+ SH070466 COST 606.04 TRAN0704 1.
+ SH070466 BAL0704 -1. BAL0766 1.
+ SH070566 COST 773.9 TRAN0705 1.
+ SH070566 BAL0705 -1. BAL0766 1.
+ SH070866 COST 610.4 TRAN0708 1.
+ SH070866 BAL0783 -1. BAL0766 1.
+ SH070167 COST 463.25 TRAN0701 1.
+ SH070167 BAL0701 -1. BAL0767 1.
+ SH070267 COST 252.88 TRAN0702 1.
+ SH070267 BAL0702 -1. BAL0767 1.
+ SH070367 COST 537.37 TRAN0703 1.
+ SH070367 BAL0703 -1. BAL0767 1.
+ SH070467 COST 498.13 TRAN0704 1.
+ SH070467 BAL0704 -1. BAL0767 1.
+ SH070567 COST 658.36 TRAN0705 1.
+ SH070567 BAL0705 -1. BAL0767 1.
+ SH070867 COST 499.22 TRAN0708 1.
+ SH070867 BAL0783 -1. BAL0767 1.
+ SH070168 COST 647.46 TRAN0701 1.
+ SH070168 BAL0701 -1. BAL0768 1.
+ SH070268 COST 436. TRAN0702 1.
+ SH070268 BAL0702 -1. BAL0768 1.
+ SH070368 COST 610.4 TRAN0703 1.
+ SH070368 BAL0703 -1. BAL0768 1.
+ SH070468 COST 765.18 TRAN0704 1.
+ SH070468 BAL0704 -1. BAL0768 1.
+ SH070568 COST 1031.14 TRAN0705 1.
+ SH070568 BAL0705 -1. BAL0768 1.
+ SH070868 COST 818.59 TRAN0708 1.
+ SH070868 BAL0783 -1. BAL0768 1.
+ SH070169 COST 587.51 TRAN0701 1.
+ SH070169 BAL0701 -1. BAL0769 1.
+ SH070269 COST 240.89 TRAN0702 1.
+ SH070269 BAL0702 -1. BAL0769 1.
+ SH070369 COST 555.9 TRAN0703 1.
+ SH070369 BAL0703 -1. BAL0769 1.
+ SH070469 COST 677.98 TRAN0704 1.
+ SH070469 BAL0704 -1. BAL0769 1.
+ SH070569 COST 704.14 TRAN0705 1.
+ SH070569 BAL0705 -1. BAL0769 1.
+ SH070869 COST 717.22 TRAN0708 1.
+ SH070869 BAL0783 -1. BAL0769 1.
+ SH070171 COST 479.6 TRAN0701 1.
+ SH070171 BAL0701 -1. BAL0771 1.
+ SH070371 COST 571.16 TRAN0703 1.
+ SH070371 BAL0703 -1. BAL0771 1.
+ SH070471 COST 567.89 TRAN0704 1.
+ SH070471 BAL0704 -1. BAL0771 1.
+ SH070571 COST 633.29 TRAN0705 1.
+ SH070571 BAL0705 -1. BAL0771 1.
+ SH070671 COST 426.19 TRAN0706 1.
+ SH070671 BAL0752 -1. BAL0771 1.
+ SH070771 COST 767.36 TRAN0707 1.
+ SH070771 BAL0764 -1. BAL0771 1.
+ SH070871 COST 580.97 TRAN0708 1.
+ SH070871 BAL0783 -1. BAL0771 1.
+ SH070172 COST 639.83 TRAN0701 1.
+ SH070172 BAL0701 -1. BAL0772 1.
+ SH070272 COST 591.87 TRAN0702 1.
+ SH070272 BAL0702 -1. BAL0772 1.
+ SH070372 COST 672.53 TRAN0703 1.
+ SH070372 BAL0703 -1. BAL0772 1.
+ SH070472 COST 621.3 TRAN0704 1.
+ SH070472 BAL0704 -1. BAL0772 1.
+ SH070572 COST 831.67 TRAN0705 1.
+ SH070572 BAL0705 -1. BAL0772 1.
+ SH070872 COST 621.3 TRAN0708 1.
+ SH070872 BAL0783 -1. BAL0772 1.
+ SH070173 COST 425.1 TRAN0701 1.
+ SH070173 BAL0701 -1. BAL0773 1.
+ SH070273 COST 397.85 TRAN0702 1.
+ SH070273 BAL0702 -1. BAL0773 1.
+ SH070373 COST 368.42 TRAN0703 1.
+ SH070373 BAL0703 -1. BAL0773 1.
+ SH070473 COST 498.13 TRAN0704 1.
+ SH070473 BAL0704 -1. BAL0773 1.
+ SH070573 COST 614.76 TRAN0705 1.
+ SH070573 BAL0705 -1. BAL0773 1.
+ SH070673 COST 332.45 TRAN0706 1.
+ SH070673 BAL0752 -1. BAL0773 1.
+ SH070873 COST 549.36 TRAN0708 1.
+ SH070873 BAL0783 -1. BAL0773 1.
+ SH070174 COST 597.32 TRAN0701 1.
+ SH070174 BAL0701 -1. BAL0774 1.
+ SH070274 COST 228.9 TRAN0702 1.
+ SH070274 BAL0702 -1. BAL0774 1.
+ SH070374 COST 621.3 TRAN0703 1.
+ SH070374 BAL0703 -1. BAL0774 1.
+ SH070474 COST 694.33 TRAN0704 1.
+ SH070474 BAL0704 -1. BAL0774 1.
+ SH070574 COST 798.97 TRAN0705 1.
+ SH070574 BAL0705 -1. BAL0774 1.
+ SH070874 COST 674.71 TRAN0708 1.
+ SH070874 BAL0783 -1. BAL0774 1.
+ SH070275 COST 603.86 TRAN0702 1.
+ SH070275 BAL0702 -1. BAL0775 1.
+ SH070176 COST 503.58 TRAN0701 1.
+ SH070176 BAL0701 -1. BAL0776 1.
+ SH070276 COST 437.09 TRAN0702 1.
+ SH070276 BAL0702 -1. BAL0776 1.
+ SH070376 COST 439.27 TRAN0703 1.
+ SH070376 BAL0703 -1. BAL0776 1.
+ SH070476 COST 686.7 TRAN0704 1.
+ SH070476 BAL0704 -1. BAL0776 1.
+ SH070576 COST 686.7 TRAN0705 1.
+ SH070576 BAL0705 -1. BAL0776 1.
+ SH070676 COST 415.29 TRAN0706 1.
+ SH070676 BAL0752 -1. BAL0776 1.
+ SH070876 COST 846.93 TRAN0708 1.
+ SH070876 BAL0783 -1. BAL0776 1.
+ SH070177 COST 474.15 TRAN0701 1.
+ SH070177 BAL0701 -1. BAL0777 1.
+ SH070277 COST 296.48 TRAN0702 1.
+ SH070277 BAL0702 -1. BAL0777 1.
+ SH070377 COST 502.49 TRAN0703 1.
+ SH070377 BAL0703 -1. BAL0777 1.
+ SH070477 COST 437.09 TRAN0704 1.
+ SH070477 BAL0704 -1. BAL0777 1.
+ SH070577 COST 610.4 TRAN0705 1.
+ SH070577 BAL0705 -1. BAL0777 1.
+ SH070877 COST 348.8 TRAN0708 1.
+ SH070877 BAL0783 -1. BAL0777 1.
+ SH070178 COST 829.49 TRAN0701 1.
+ SH070178 BAL0701 -1. BAL0778 1.
+ SH070278 COST 481.78 TRAN0702 1.
+ SH070278 BAL0702 -1. BAL0778 1.
+ SH070378 COST 853.47 TRAN0703 1.
+ SH070378 BAL0703 -1. BAL0778 1.
+ SH070478 COST 746.65 TRAN0704 1.
+ SH070478 BAL0704 -1. BAL0778 1.
+ SH070578 COST 958.11 TRAN0705 1.
+ SH070578 BAL0705 -1. BAL0778 1.
+ SH070878 COST 834.94 TRAN0708 1.
+ SH070878 BAL0783 -1. BAL0778 1.
+ SH070179 COST 779.35 TRAN0701 1.
+ SH070179 BAL0701 -1. BAL0779 1.
+ SH070279 COST 293.21 TRAN0702 1.
+ SH070279 BAL0702 -1. BAL0779 1.
+ SH070379 COST 753.19 TRAN0703 1.
+ SH070379 BAL0703 -1. BAL0779 1.
+ SH070479 COST 784.8 TRAN0704 1.
+ SH070479 BAL0704 -1. BAL0779 1.
+ SH070879 COST 769.54 TRAN0708 1.
+ SH070879 BAL0783 -1. BAL0779 1.
+ SH070180 COST 345.53 TRAN0701 1.
+ SH070180 BAL0701 -1. BAL0780 1.
+ SH070280 COST 430.55 TRAN0702 1.
+ SH070280 BAL0702 -1. BAL0780 1.
+ SH070380 COST 476.33 TRAN0703 1.
+ SH070380 BAL0703 -1. BAL0780 1.
+ SH070480 COST 407.66 TRAN0704 1.
+ SH070480 BAL0704 -1. BAL0780 1.
+ SH070580 COST 550.45 TRAN0705 1.
+ SH070580 BAL0705 -1. BAL0780 1.
+ SH070880 COST 261.6 TRAN0708 1.
+ SH070880 BAL0783 -1. BAL0780 1.
+ SH070182 COST 634.38 TRAN0701 1.
+ SH070182 BAL0701 -1. BAL0782 1.
+ SH070282 COST 358.61 TRAN0702 1.
+ SH070282 BAL0702 -1. BAL0782 1.
+ SH070382 COST 713.95 TRAN0703 1.
+ SH070382 BAL0703 -1. BAL0782 1.
+ SH070482 COST 769.54 TRAN0704 1.
+ SH070482 BAL0704 -1. BAL0782 1.
+ SH070582 COST 1250.23 TRAN0705 1.
+ SH070582 BAL0705 -1. BAL0782 1.
+ SH070882 COST 853.47 TRAN0708 1.
+ SH070882 BAL0783 -1. BAL0782 1.
+ SH070183 COST 192.93 TRAN0701 1.
+ SH070183 BAL0701 -1. BAL0783 1.
+ SH070283 COST 566.8 TRAN0702 1.
+ SH070283 BAL0702 -1. BAL0783 1.
+ SH070383 COST 296.48 TRAN0703 1.
+ SH070383 BAL0703 -1. BAL0783 1.
+ SH070483 COST 64.31 TRAN0704 1.
+ SH070483 BAL0704 -1. BAL0783 1.
+ SH070583 COST 378.23 TRAN0705 1.
+ SH070583 BAL0705 -1. BAL0783 1.
+ SH070683 COST 270.32 TRAN0706 1.
+ SH070683 BAL0752 -1. BAL0783 1.
+ SH070184 COST 331.36 TRAN0701 1.
+ SH070184 BAL0701 -1. BAL0784 1.
+ SH070284 COST 209.28 TRAN0702 1.
+ SH070284 BAL0702 -1. BAL0784 1.
+ SH070384 COST 396.76 TRAN0703 1.
+ SH070384 BAL0703 -1. BAL0784 1.
+ SH070484 COST 403.3 TRAN0704 1.
+ SH070484 BAL0704 -1. BAL0784 1.
+ SH070584 COST 534.1 TRAN0705 1.
+ SH070584 BAL0705 -1. BAL0784 1.
+ SH070684 COST 332.45 TRAN0706 1.
+ SH070684 BAL0752 -1. BAL0784 1.
+ SH070884 COST 422.92 TRAN0708 1.
+ SH070884 BAL0783 -1. BAL0784 1.
+ SH080201 COST 513.81 TRAN0802 1.
+ SH080201 BAL0802 -1. BAL0801 1.
+ SH080301 COST 197.22 TRAN0803 1.
+ SH080301 BAL0803 -1. BAL0801 1.
+ SH080401 COST 359.84 TRAN0804 1.
+ SH080401 BAL0804 -1. BAL0801 1.
+ SH080501 COST 410.01 TRAN0805 1.
+ SH080501 BAL0805 -1. BAL0801 1.
+ SH080601 COST 217.98 TRAN0806 1.
+ SH080601 BAL0852 -1. BAL0801 1.
+ SH080801 COST 247.39 TRAN0808 1.
+ SH080801 BAL0883 -1. BAL0801 1.
+ SH080102 COST 820.02 TRAN0801 1.
+ SH080102 BAL0801 -1. BAL0802 1.
+ SH080302 COST 721.41 TRAN0803 1.
+ SH080302 BAL0803 -1. BAL0802 1.
+ SH080402 COST 1058.76 TRAN0804 1.
+ SH080402 BAL0804 -1. BAL0802 1.
+ SH080502 COST 1281.93 TRAN0805 1.
+ SH080502 BAL0805 -1. BAL0802 1.
+ SH080602 COST 653.94 TRAN0806 1.
+ SH080602 BAL0852 -1. BAL0802 1.
+ SH080802 COST 901.33 TRAN0808 1.
+ SH080802 BAL0883 -1. BAL0802 1.
+ SH080103 COST 423.85 TRAN0801 1.
+ SH080103 BAL0801 -1. BAL0803 1.
+ SH080203 COST 820.02 TRAN0802 1.
+ SH080203 BAL0802 -1. BAL0803 1.
+ SH080403 COST 634.91 TRAN0804 1.
+ SH080403 BAL0804 -1. BAL0803 1.
+ SH080503 COST 491.32 TRAN0805 1.
+ SH080503 BAL0805 -1. BAL0803 1.
+ SH080603 COST 155.7 TRAN0806 1.
+ SH080603 BAL0852 -1. BAL0803 1.
+ SH080803 COST 441.15 TRAN0808 1.
+ SH080803 BAL0883 -1. BAL0803 1.
+ SH080104 COST 301.02 TRAN0801 1.
+ SH080104 BAL0801 -1. BAL0804 1.
+ SH080204 COST 870.19 TRAN0802 1.
+ SH080204 BAL0802 -1. BAL0804 1.
+ SH080304 COST 420.39 TRAN0803 1.
+ SH080304 BAL0803 -1. BAL0804 1.
+ SH080504 COST 551.87 TRAN0805 1.
+ SH080504 BAL0805 -1. BAL0804 1.
+ SH080604 COST 423.85 TRAN0806 1.
+ SH080604 BAL0852 -1. BAL0804 1.
+ SH080704 COST 465.37 TRAN0807 1.
+ SH080704 BAL0864 -1. BAL0804 1.
+ SH080804 COST 100.34 TRAN0808 1.
+ SH080804 BAL0883 -1. BAL0804 1.
+ SH080105 COST 467.1 TRAN0801 1.
+ SH080105 BAL0801 -1. BAL0805 1.
+ SH080205 COST 892.68 TRAN0802 1.
+ SH080205 BAL0802 -1. BAL0805 1.
+ SH080305 COST 491.32 TRAN0803 1.
+ SH080305 BAL0803 -1. BAL0805 1.
+ SH080405 COST 493.05 TRAN0804 1.
+ SH080405 BAL0804 -1. BAL0805 1.
+ SH080605 COST 563.98 TRAN0806 1.
+ SH080605 BAL0852 -1. BAL0805 1.
+ SH080705 COST 577.82 TRAN0807 1.
+ SH080705 BAL0864 -1. BAL0805 1.
+ SH080805 COST 468.83 TRAN0808 1.
+ SH080805 BAL0883 -1. BAL0805 1.
+ SH080106 COST 344.27 TRAN0801 1.
+ SH080106 BAL0801 -1. BAL0806 1.
+ SH080206 COST 721.41 TRAN0802 1.
+ SH080206 BAL0802 -1. BAL0806 1.
+ SH080306 COST 368.49 TRAN0803 1.
+ SH080306 BAL0803 -1. BAL0806 1.
+ SH080406 COST 378.87 TRAN0804 1.
+ SH080406 BAL0804 -1. BAL0806 1.
+ SH080506 COST 435.96 TRAN0805 1.
+ SH080506 BAL0805 -1. BAL0806 1.
+ SH080606 COST 356.38 TRAN0806 1.
+ SH080606 BAL0852 -1. BAL0806 1.
+ SH080706 COST 346. TRAN0807 1.
+ SH080706 BAL0864 -1. BAL0806 1.
+ SH080806 COST 261.23 TRAN0808 1.
+ SH080806 BAL0883 -1. BAL0806 1.
+ SH080107 COST 36.33 TRAN0801 1.
+ SH080107 BAL0801 -1. BAL0807 1.
+ SH080207 COST 505.16 TRAN0802 1.
+ SH080207 BAL0802 -1. BAL0807 1.
+ SH080307 COST 214.52 TRAN0803 1.
+ SH080307 BAL0803 -1. BAL0807 1.
+ SH080407 COST 358.11 TRAN0804 1.
+ SH080407 BAL0804 -1. BAL0807 1.
+ SH080507 COST 396.17 TRAN0805 1.
+ SH080507 BAL0805 -1. BAL0807 1.
+ SH080607 COST 216.25 TRAN0806 1.
+ SH080607 BAL0852 -1. BAL0807 1.
+ SH080707 COST 401.36 TRAN0807 1.
+ SH080707 BAL0864 -1. BAL0807 1.
+ SH080807 COST 268.15 TRAN0808 1.
+ SH080807 BAL0883 -1. BAL0807 1.
+ SH080108 COST 114.18 TRAN0801 1.
+ SH080108 BAL0801 -1. BAL0808 1.
+ SH080208 COST 650.48 TRAN0802 1.
+ SH080208 BAL0802 -1. BAL0808 1.
+ SH080308 COST 243.93 TRAN0803 1.
+ SH080308 BAL0803 -1. BAL0808 1.
+ SH080408 COST 427.31 TRAN0804 1.
+ SH080408 BAL0804 -1. BAL0808 1.
+ SH080508 COST 314.86 TRAN0805 1.
+ SH080508 BAL0805 -1. BAL0808 1.
+ SH080608 COST 287.18 TRAN0806 1.
+ SH080608 BAL0852 -1. BAL0808 1.
+ SH080808 COST 323.51 TRAN0808 1.
+ SH080808 BAL0883 -1. BAL0808 1.
+ SH080109 COST 238.74 TRAN0801 1.
+ SH080109 BAL0801 -1. BAL0809 1.
+ SH080209 COST 662.59 TRAN0802 1.
+ SH080209 BAL0802 -1. BAL0809 1.
+ SH080309 COST 290.64 TRAN0803 1.
+ SH080309 BAL0803 -1. BAL0809 1.
+ SH080409 COST 437.69 TRAN0804 1.
+ SH080409 BAL0804 -1. BAL0809 1.
+ SH080509 COST 413.47 TRAN0805 1.
+ SH080509 BAL0805 -1. BAL0809 1.
+ SH080709 COST 339.08 TRAN0807 1.
+ SH080709 BAL0864 -1. BAL0809 1.
+ SH080809 COST 335.62 TRAN0808 1.
+ SH080809 BAL0883 -1. BAL0809 1.
+ SH080110 COST 427.31 TRAN0801 1.
+ SH080110 BAL0801 -1. BAL0810 1.
+ SH080210 COST 273.34 TRAN0802 1.
+ SH080210 BAL0802 -1. BAL0810 1.
+ SH080310 COST 415.2 TRAN0803 1.
+ SH080310 BAL0803 -1. BAL0810 1.
+ SH080410 COST 621.07 TRAN0804 1.
+ SH080410 BAL0804 -1. BAL0810 1.
+ SH080510 COST 666.05 TRAN0805 1.
+ SH080510 BAL0805 -1. BAL0810 1.
+ SH080610 COST 389.25 TRAN0806 1.
+ SH080610 BAL0852 -1. BAL0810 1.
+ SH080810 COST 527.65 TRAN0808 1.
+ SH080810 BAL0883 -1. BAL0810 1.
+ SH080111 COST 183.38 TRAN0801 1.
+ SH080111 BAL0801 -1. BAL0811 1.
+ SH080211 COST 856.35 TRAN0802 1.
+ SH080211 BAL0802 -1. BAL0811 1.
+ SH080311 COST 429.04 TRAN0803 1.
+ SH080311 BAL0803 -1. BAL0811 1.
+ SH080411 COST 240.47 TRAN0804 1.
+ SH080411 BAL0804 -1. BAL0811 1.
+ SH080511 COST 589.93 TRAN0805 1.
+ SH080511 BAL0805 -1. BAL0811 1.
+ SH080611 COST 339.08 TRAN0806 1.
+ SH080611 BAL0852 -1. BAL0811 1.
+ SH080811 COST 176.46 TRAN0808 1.
+ SH080811 BAL0883 -1. BAL0811 1.
+ SH080112 COST 152.24 TRAN0801 1.
+ SH080112 BAL0801 -1. BAL0812 1.
+ SH080212 COST 586.47 TRAN0802 1.
+ SH080212 BAL0802 -1. BAL0812 1.
+ SH080312 COST 252.58 TRAN0803 1.
+ SH080312 BAL0803 -1. BAL0812 1.
+ SH080412 COST 346. TRAN0804 1.
+ SH080412 BAL0804 -1. BAL0812 1.
+ SH080512 COST 461.91 TRAN0805 1.
+ SH080512 BAL0805 -1. BAL0812 1.
+ SH080612 COST 250.85 TRAN0806 1.
+ SH080612 BAL0852 -1. BAL0812 1.
+ SH080812 COST 252.58 TRAN0808 1.
+ SH080812 BAL0883 -1. BAL0812 1.
+ SH080114 COST 245.66 TRAN0801 1.
+ SH080114 BAL0801 -1. BAL0814 1.
+ SH080214 COST 712.76 TRAN0802 1.
+ SH080214 BAL0802 -1. BAL0814 1.
+ SH080314 COST 339.08 TRAN0803 1.
+ SH080314 BAL0803 -1. BAL0814 1.
+ SH080414 COST 344.27 TRAN0804 1.
+ SH080414 BAL0804 -1. BAL0814 1.
+ SH080514 COST 608.96 TRAN0805 1.
+ SH080514 BAL0805 -1. BAL0814 1.
+ SH080614 COST 325.24 TRAN0806 1.
+ SH080614 BAL0852 -1. BAL0814 1.
+ SH080814 COST 217.98 TRAN0808 1.
+ SH080814 BAL0883 -1. BAL0814 1.
+ SH080115 COST 524.19 TRAN0801 1.
+ SH080115 BAL0801 -1. BAL0815 1.
+ SH080215 COST 275.07 TRAN0802 1.
+ SH080215 BAL0802 -1. BAL0815 1.
+ SH080315 COST 404.82 TRAN0803 1.
+ SH080315 BAL0803 -1. BAL0815 1.
+ SH080415 COST 823.48 TRAN0804 1.
+ SH080415 BAL0804 -1. BAL0815 1.
+ SH080515 COST 688.54 TRAN0805 1.
+ SH080515 BAL0805 -1. BAL0815 1.
+ SH080615 COST 325.24 TRAN0806 1.
+ SH080615 BAL0852 -1. BAL0815 1.
+ SH080815 COST 645.29 TRAN0808 1.
+ SH080815 BAL0883 -1. BAL0815 1.
+ SH080116 COST 273.34 TRAN0801 1.
+ SH080116 BAL0801 -1. BAL0816 1.
+ SH080216 COST 484.4 TRAN0802 1.
+ SH080216 BAL0802 -1. BAL0816 1.
+ SH080316 COST 392.71 TRAN0803 1.
+ SH080316 BAL0803 -1. BAL0816 1.
+ SH080416 COST 496.51 TRAN0804 1.
+ SH080416 BAL0804 -1. BAL0816 1.
+ SH080516 COST 551.87 TRAN0805 1.
+ SH080516 BAL0805 -1. BAL0816 1.
+ SH080616 COST 226.63 TRAN0806 1.
+ SH080616 BAL0852 -1. BAL0816 1.
+ SH080816 COST 354.65 TRAN0808 1.
+ SH080816 BAL0883 -1. BAL0816 1.
+ SH080117 COST 261.23 TRAN0801 1.
+ SH080117 BAL0801 -1. BAL0817 1.
+ SH080217 COST 873.65 TRAN0802 1.
+ SH080217 BAL0802 -1. BAL0817 1.
+ SH080317 COST 474.02 TRAN0803 1.
+ SH080317 BAL0803 -1. BAL0817 1.
+ SH080417 COST 98.61 TRAN0804 1.
+ SH080417 BAL0804 -1. BAL0817 1.
+ SH080517 COST 515.54 TRAN0805 1.
+ SH080517 BAL0805 -1. BAL0817 1.
+ SH080717 COST 510.35 TRAN0807 1.
+ SH080717 BAL0864 -1. BAL0817 1.
+ SH080817 COST 46.71 TRAN0808 1.
+ SH080817 BAL0883 -1. BAL0817 1.
+ SH080118 COST 302.75 TRAN0801 1.
+ SH080118 BAL0801 -1. BAL0818 1.
+ SH080218 COST 624.53 TRAN0802 1.
+ SH080218 BAL0802 -1. BAL0818 1.
+ SH080318 COST 467.1 TRAN0803 1.
+ SH080318 BAL0803 -1. BAL0818 1.
+ SH080418 COST 266.42 TRAN0804 1.
+ SH080418 BAL0804 -1. BAL0818 1.
+ SH080518 COST 704.11 TRAN0805 1.
+ SH080518 BAL0805 -1. BAL0818 1.
+ SH080618 COST 608.96 TRAN0806 1.
+ SH080618 BAL0852 -1. BAL0818 1.
+ SH080818 COST 178.19 TRAN0808 1.
+ SH080818 BAL0883 -1. BAL0818 1.
+ SH080119 COST 429.04 TRAN0801 1.
+ SH080119 BAL0801 -1. BAL0819 1.
+ SH080219 COST 1188.51 TRAN0802 1.
+ SH080219 BAL0802 -1. BAL0819 1.
+ SH080319 COST 548.41 TRAN0803 1.
+ SH080319 BAL0803 -1. BAL0819 1.
+ SH080419 COST 275.07 TRAN0804 1.
+ SH080419 BAL0804 -1. BAL0819 1.
+ SH080519 COST 359.84 TRAN0805 1.
+ SH080519 BAL0805 -1. BAL0819 1.
+ SH080619 COST 596.85 TRAN0806 1.
+ SH080619 BAL0852 -1. BAL0819 1.
+ SH080819 COST 171.27 TRAN0808 1.
+ SH080819 BAL0883 -1. BAL0819 1.
+ SH080120 COST 354.65 TRAN0801 1.
+ SH080120 BAL0801 -1. BAL0820 1.
+ SH080220 COST 1181.59 TRAN0802 1.
+ SH080220 BAL0802 -1. BAL0820 1.
+ SH080320 COST 513.81 TRAN0803 1.
+ SH080320 BAL0803 -1. BAL0820 1.
+ SH080420 COST 195.49 TRAN0804 1.
+ SH080420 BAL0804 -1. BAL0820 1.
+ SH080520 COST 503.43 TRAN0805 1.
+ SH080520 BAL0805 -1. BAL0820 1.
+ SH080820 COST 217.98 TRAN0808 1.
+ SH080820 BAL0883 -1. BAL0820 1.
+ SH080121 COST 697.19 TRAN0801 1.
+ SH080121 BAL0801 -1. BAL0821 1.
+ SH080221 COST 636.64 TRAN0802 1.
+ SH080221 BAL0802 -1. BAL0821 1.
+ SH080321 COST 771.58 TRAN0803 1.
+ SH080321 BAL0803 -1. BAL0821 1.
+ SH080421 COST 553.6 TRAN0804 1.
+ SH080421 BAL0804 -1. BAL0821 1.
+ SH080521 COST 951.5 TRAN0805 1.
+ SH080521 BAL0805 -1. BAL0821 1.
+ SH080821 COST 553.6 TRAN0808 1.
+ SH080821 BAL0883 -1. BAL0821 1.
+ SH080122 COST 429.04 TRAN0801 1.
+ SH080122 BAL0801 -1. BAL0822 1.
+ SH080222 COST 999.94 TRAN0802 1.
+ SH080222 BAL0802 -1. BAL0822 1.
+ SH080322 COST 517.27 TRAN0803 1.
+ SH080322 BAL0803 -1. BAL0822 1.
+ SH080422 COST 387.52 TRAN0804 1.
+ SH080422 BAL0804 -1. BAL0822 1.
+ SH080522 COST 309.67 TRAN0805 1.
+ SH080522 BAL0805 -1. BAL0822 1.
+ SH080622 COST 536.3 TRAN0806 1.
+ SH080622 BAL0852 -1. BAL0822 1.
+ SH080822 COST 240.47 TRAN0808 1.
+ SH080822 BAL0883 -1. BAL0822 1.
+ SH080123 COST 404.82 TRAN0801 1.
+ SH080123 BAL0801 -1. BAL0823 1.
+ SH080223 COST 935.93 TRAN0802 1.
+ SH080223 BAL0802 -1. BAL0823 1.
+ SH080323 COST 496.51 TRAN0803 1.
+ SH080323 BAL0803 -1. BAL0823 1.
+ SH080423 COST 288.91 TRAN0804 1.
+ SH080423 BAL0804 -1. BAL0823 1.
+ SH080523 COST 287.18 TRAN0805 1.
+ SH080523 BAL0805 -1. BAL0823 1.
+ SH080823 COST 240.47 TRAN0808 1.
+ SH080823 BAL0883 -1. BAL0823 1.
+ SH080124 COST 2484.28 TRAN0801 1.
+ SH080124 BAL0801 -1. BAL0824 1.
+ SH080125 COST 669.51 TRAN0801 1.
+ SH080125 BAL0801 -1. BAL0825 1.
+ SH080225 COST 738.71 TRAN0802 1.
+ SH080225 BAL0802 -1. BAL0825 1.
+ SH080325 COST 884.03 TRAN0803 1.
+ SH080325 BAL0803 -1. BAL0825 1.
+ SH080425 COST 602.04 TRAN0804 1.
+ SH080425 BAL0804 -1. BAL0825 1.
+ SH080525 COST 979.18 TRAN0805 1.
+ SH080525 BAL0805 -1. BAL0825 1.
+ SH080625 COST 697.19 TRAN0806 1.
+ SH080625 BAL0852 -1. BAL0825 1.
+ SH080825 COST 527.65 TRAN0808 1.
+ SH080825 BAL0883 -1. BAL0825 1.
+ SH080426 COST 467.1 TRAN0804 1.
+ SH080426 BAL0804 -1. BAL0826 1.
+ SH080127 COST 404.82 TRAN0801 1.
+ SH080127 BAL0801 -1. BAL0827 1.
+ SH080227 COST 491.32 TRAN0802 1.
+ SH080227 BAL0802 -1. BAL0827 1.
+ SH080327 COST 499.97 TRAN0803 1.
+ SH080327 BAL0803 -1. BAL0827 1.
+ SH080427 COST 579.55 TRAN0804 1.
+ SH080427 BAL0804 -1. BAL0827 1.
+ SH080527 COST 653.94 TRAN0805 1.
+ SH080527 BAL0805 -1. BAL0827 1.
+ SH080627 COST 463.64 TRAN0806 1.
+ SH080627 BAL0852 -1. BAL0827 1.
+ SH080827 COST 435.96 TRAN0808 1.
+ SH080827 BAL0883 -1. BAL0827 1.
+ SH080128 COST 420.39 TRAN0801 1.
+ SH080128 BAL0801 -1. BAL0828 1.
+ SH080228 COST 984.37 TRAN0802 1.
+ SH080228 BAL0802 -1. BAL0828 1.
+ SH080328 COST 512.08 TRAN0803 1.
+ SH080328 BAL0803 -1. BAL0828 1.
+ SH080428 COST 510.35 TRAN0804 1.
+ SH080428 BAL0804 -1. BAL0828 1.
+ SH080528 COST 176.46 TRAN0805 1.
+ SH080528 BAL0805 -1. BAL0828 1.
+ SH080628 COST 451.53 TRAN0806 1.
+ SH080628 BAL0852 -1. BAL0828 1.
+ SH080728 COST 185.11 TRAN0807 1.
+ SH080728 BAL0864 -1. BAL0828 1.
+ SH080828 COST 439.42 TRAN0808 1.
+ SH080828 BAL0883 -1. BAL0828 1.
+ SH080129 COST 385.79 TRAN0801 1.
+ SH080129 BAL0801 -1. BAL0829 1.
+ SH080229 COST 802.72 TRAN0802 1.
+ SH080229 BAL0802 -1. BAL0829 1.
+ SH080329 COST 416.93 TRAN0803 1.
+ SH080329 BAL0803 -1. BAL0829 1.
+ SH080429 COST 344.27 TRAN0804 1.
+ SH080429 BAL0804 -1. BAL0829 1.
+ SH080529 COST 743.9 TRAN0805 1.
+ SH080529 BAL0805 -1. BAL0829 1.
+ SH080629 COST 451.53 TRAN0806 1.
+ SH080629 BAL0852 -1. BAL0829 1.
+ SH080829 COST 249.12 TRAN0808 1.
+ SH080829 BAL0883 -1. BAL0829 1.
+ SH080130 COST 806.18 TRAN0801 1.
+ SH080130 BAL0801 -1. BAL0830 1.
+ SH080230 COST 754.28 TRAN0802 1.
+ SH080230 BAL0802 -1. BAL0830 1.
+ SH080330 COST 904.79 TRAN0803 1.
+ SH080330 BAL0803 -1. BAL0830 1.
+ SH080430 COST 525.92 TRAN0804 1.
+ SH080430 BAL0804 -1. BAL0830 1.
+ SH080530 COST 771.58 TRAN0805 1.
+ SH080530 BAL0805 -1. BAL0830 1.
+ SH080830 COST 660.86 TRAN0808 1.
+ SH080830 BAL0883 -1. BAL0830 1.
+ SH080131 COST 192.03 TRAN0801 1.
+ SH080131 BAL0801 -1. BAL0831 1.
+ SH080231 COST 607.23 TRAN0802 1.
+ SH080231 BAL0802 -1. BAL0831 1.
+ SH080331 COST 190.3 TRAN0803 1.
+ SH080331 BAL0803 -1. BAL0831 1.
+ SH080431 COST 437.69 TRAN0804 1.
+ SH080431 BAL0804 -1. BAL0831 1.
+ SH080531 COST 531.11 TRAN0805 1.
+ SH080531 BAL0805 -1. BAL0831 1.
+ SH080631 COST 193.76 TRAN0806 1.
+ SH080631 BAL0852 -1. BAL0831 1.
+ SH080831 COST 385.79 TRAN0808 1.
+ SH080831 BAL0883 -1. BAL0831 1.
+ SH080132 COST 517.27 TRAN0801 1.
+ SH080132 BAL0801 -1. BAL0832 1.
+ SH080232 COST 826.94 TRAN0802 1.
+ SH080232 BAL0802 -1. BAL0832 1.
+ SH080332 COST 731.79 TRAN0803 1.
+ SH080332 BAL0803 -1. BAL0832 1.
+ SH080432 COST 271.61 TRAN0804 1.
+ SH080432 BAL0804 -1. BAL0832 1.
+ SH080532 COST 678.16 TRAN0805 1.
+ SH080532 BAL0805 -1. BAL0832 1.
+ SH080832 COST 311.4 TRAN0808 1.
+ SH080832 BAL0883 -1. BAL0832 1.
+ SH080133 COST 852.89 TRAN0801 1.
+ SH080133 BAL0801 -1. BAL0833 1.
+ SH080233 COST 692. TRAN0802 1.
+ SH080233 BAL0802 -1. BAL0833 1.
+ SH080333 COST 939.39 TRAN0803 1.
+ SH080333 BAL0803 -1. BAL0833 1.
+ SH080433 COST 769.85 TRAN0804 1.
+ SH080433 BAL0804 -1. BAL0833 1.
+ SH080533 COST 1091.63 TRAN0805 1.
+ SH080533 BAL0805 -1. BAL0833 1.
+ SH080833 COST 659.13 TRAN0808 1.
+ SH080833 BAL0883 -1. BAL0833 1.
+ SH080134 COST 667.78 TRAN0801 1.
+ SH080134 BAL0801 -1. BAL0834 1.
+ SH080234 COST 1133.15 TRAN0802 1.
+ SH080234 BAL0802 -1. BAL0834 1.
+ SH080334 COST 870.19 TRAN0803 1.
+ SH080334 BAL0803 -1. BAL0834 1.
+ SH080434 COST 365.03 TRAN0804 1.
+ SH080434 BAL0804 -1. BAL0834 1.
+ SH080534 COST 762.93 TRAN0805 1.
+ SH080534 BAL0805 -1. BAL0834 1.
+ SH080834 COST 454.99 TRAN0808 1.
+ SH080834 BAL0883 -1. BAL0834 1.
+ SH080135 COST 797.53 TRAN0801 1.
+ SH080135 BAL0801 -1. BAL0835 1.
+ SH080235 COST 769.85 TRAN0802 1.
+ SH080235 BAL0802 -1. BAL0835 1.
+ SH080335 COST 652.21 TRAN0803 1.
+ SH080335 BAL0803 -1. BAL0835 1.
+ SH080435 COST 211.06 TRAN0804 1.
+ SH080435 BAL0804 -1. BAL0835 1.
+ SH080535 COST 745.63 TRAN0805 1.
+ SH080535 BAL0805 -1. BAL0835 1.
+ SH080835 COST 406.55 TRAN0808 1.
+ SH080835 BAL0883 -1. BAL0835 1.
+ SH080136 COST 354.65 TRAN0801 1.
+ SH080136 BAL0801 -1. BAL0836 1.
+ SH080236 COST 775.04 TRAN0802 1.
+ SH080236 BAL0802 -1. BAL0836 1.
+ SH080336 COST 183.38 TRAN0803 1.
+ SH080336 BAL0803 -1. BAL0836 1.
+ SH080436 COST 640.1 TRAN0804 1.
+ SH080436 BAL0804 -1. BAL0836 1.
+ SH080536 COST 598.58 TRAN0805 1.
+ SH080536 BAL0805 -1. BAL0836 1.
+ SH080636 COST 190.3 TRAN0806 1.
+ SH080636 BAL0852 -1. BAL0836 1.
+ SH080836 COST 555.33 TRAN0808 1.
+ SH080836 BAL0883 -1. BAL0836 1.
+ SH080137 COST 159.16 TRAN0801 1.
+ SH080137 BAL0801 -1. BAL0837 1.
+ SH080237 COST 591.66 TRAN0802 1.
+ SH080237 BAL0802 -1. BAL0837 1.
+ SH080337 COST 273.34 TRAN0803 1.
+ SH080337 BAL0803 -1. BAL0837 1.
+ SH080437 COST 525.92 TRAN0804 1.
+ SH080437 BAL0804 -1. BAL0837 1.
+ SH080537 COST 314.86 TRAN0805 1.
+ SH080537 BAL0805 -1. BAL0837 1.
+ SH080637 COST 335.62 TRAN0806 1.
+ SH080637 BAL0852 -1. BAL0837 1.
+ SH080837 COST 435.96 TRAN0808 1.
+ SH080837 BAL0883 -1. BAL0837 1.
+ SH080138 COST 235.28 TRAN0801 1.
+ SH080138 BAL0801 -1. BAL0838 1.
+ SH080238 COST 422.12 TRAN0802 1.
+ SH080238 BAL0802 -1. BAL0838 1.
+ SH080338 COST 164.35 TRAN0803 1.
+ SH080338 BAL0803 -1. BAL0838 1.
+ SH080438 COST 532.84 TRAN0804 1.
+ SH080438 BAL0804 -1. BAL0838 1.
+ SH080538 COST 480.94 TRAN0805 1.
+ SH080538 BAL0805 -1. BAL0838 1.
+ SH080638 COST 67.47 TRAN0806 1.
+ SH080638 BAL0852 -1. BAL0838 1.
+ SH080738 COST 373.68 TRAN0807 1.
+ SH080738 BAL0864 -1. BAL0838 1.
+ SH080838 COST 410.01 TRAN0808 1.
+ SH080838 BAL0883 -1. BAL0838 1.
+ SH080139 COST 224.9 TRAN0801 1.
+ SH080139 BAL0801 -1. BAL0839 1.
+ SH080239 COST 586.47 TRAN0802 1.
+ SH080239 BAL0802 -1. BAL0839 1.
+ SH080339 COST 276.8 TRAN0803 1.
+ SH080339 BAL0803 -1. BAL0839 1.
+ SH080439 COST 430.77 TRAN0804 1.
+ SH080439 BAL0804 -1. BAL0839 1.
+ SH080539 COST 742.17 TRAN0805 1.
+ SH080539 BAL0805 -1. BAL0839 1.
+ SH080639 COST 352.92 TRAN0806 1.
+ SH080639 BAL0852 -1. BAL0839 1.
+ SH080839 COST 290.64 TRAN0808 1.
+ SH080839 BAL0883 -1. BAL0839 1.
+ SH080140 COST 285.45 TRAN0801 1.
+ SH080140 BAL0801 -1. BAL0840 1.
+ SH080240 COST 653.94 TRAN0802 1.
+ SH080240 BAL0802 -1. BAL0840 1.
+ SH080340 COST 178.19 TRAN0803 1.
+ SH080340 BAL0803 -1. BAL0840 1.
+ SH080440 COST 513.81 TRAN0804 1.
+ SH080440 BAL0804 -1. BAL0840 1.
+ SH080540 COST 382.33 TRAN0805 1.
+ SH080540 BAL0805 -1. BAL0840 1.
+ SH080640 COST 226.63 TRAN0806 1.
+ SH080640 BAL0852 -1. BAL0840 1.
+ SH080840 COST 474.02 TRAN0808 1.
+ SH080840 BAL0883 -1. BAL0840 1.
+ SH080141 COST 339.08 TRAN0801 1.
+ SH080141 BAL0801 -1. BAL0841 1.
+ SH080241 COST 519. TRAN0802 1.
+ SH080241 BAL0802 -1. BAL0841 1.
+ SH080341 COST 259.5 TRAN0803 1.
+ SH080341 BAL0803 -1. BAL0841 1.
+ SH080441 COST 560.52 TRAN0804 1.
+ SH080441 BAL0804 -1. BAL0841 1.
+ SH080541 COST 636.64 TRAN0805 1.
+ SH080541 BAL0805 -1. BAL0841 1.
+ SH080641 COST 173. TRAN0806 1.
+ SH080641 BAL0852 -1. BAL0841 1.
+ SH080841 COST 517.27 TRAN0808 1.
+ SH080841 BAL0883 -1. BAL0841 1.
+ SH080142 COST 155.7 TRAN0801 1.
+ SH080142 BAL0801 -1. BAL0842 1.
+ SH080242 COST 716.22 TRAN0802 1.
+ SH080242 BAL0802 -1. BAL0842 1.
+ SH080342 COST 276.8 TRAN0803 1.
+ SH080342 BAL0803 -1. BAL0842 1.
+ SH080442 COST 337.35 TRAN0804 1.
+ SH080442 BAL0804 -1. BAL0842 1.
+ SH080542 COST 624.53 TRAN0805 1.
+ SH080542 BAL0805 -1. BAL0842 1.
+ SH080642 COST 278.53 TRAN0806 1.
+ SH080642 BAL0852 -1. BAL0842 1.
+ SH080842 COST 262.96 TRAN0808 1.
+ SH080842 BAL0883 -1. BAL0842 1.
+ SH080143 COST 275.07 TRAN0801 1.
+ SH080143 BAL0801 -1. BAL0843 1.
+ SH080243 COST 683.35 TRAN0802 1.
+ SH080243 BAL0802 -1. BAL0843 1.
+ SH080343 COST 43.25 TRAN0803 1.
+ SH080343 BAL0803 -1. BAL0843 1.
+ SH080443 COST 512.08 TRAN0804 1.
+ SH080443 BAL0804 -1. BAL0843 1.
+ SH080543 COST 446.34 TRAN0805 1.
+ SH080543 BAL0805 -1. BAL0843 1.
+ SH080643 COST 173. TRAN0806 1.
+ SH080643 BAL0852 -1. BAL0843 1.
+ SH080743 COST 416.93 TRAN0807 1.
+ SH080743 BAL0864 -1. BAL0843 1.
+ SH080843 COST 468.83 TRAN0808 1.
+ SH080843 BAL0883 -1. BAL0843 1.
+ SH080144 COST 275.07 TRAN0801 1.
+ SH080144 BAL0801 -1. BAL0844 1.
+ SH080244 COST 655.67 TRAN0802 1.
+ SH080244 BAL0802 -1. BAL0844 1.
+ SH080344 COST 221.44 TRAN0803 1.
+ SH080344 BAL0803 -1. BAL0844 1.
+ SH080444 COST 539.76 TRAN0804 1.
+ SH080444 BAL0804 -1. BAL0844 1.
+ SH080544 COST 536.3 TRAN0805 1.
+ SH080544 BAL0805 -1. BAL0844 1.
+ SH080644 COST 153.97 TRAN0806 1.
+ SH080644 BAL0852 -1. BAL0844 1.
+ SH080844 COST 515.54 TRAN0808 1.
+ SH080844 BAL0883 -1. BAL0844 1.
+ SH080145 COST 297.56 TRAN0801 1.
+ SH080145 BAL0801 -1. BAL0845 1.
+ SH080245 COST 754.28 TRAN0802 1.
+ SH080245 BAL0802 -1. BAL0845 1.
+ SH080345 COST 278.53 TRAN0803 1.
+ SH080345 BAL0803 -1. BAL0845 1.
+ SH080445 COST 505.16 TRAN0804 1.
+ SH080445 BAL0804 -1. BAL0845 1.
+ SH080545 COST 404.82 TRAN0805 1.
+ SH080545 BAL0805 -1. BAL0845 1.
+ SH080645 COST 330.43 TRAN0806 1.
+ SH080645 BAL0852 -1. BAL0845 1.
+ SH080745 COST 340.81 TRAN0807 1.
+ SH080745 BAL0864 -1. BAL0845 1.
+ SH080845 COST 527.65 TRAN0808 1.
+ SH080845 BAL0883 -1. BAL0845 1.
+ SH080146 COST 423.85 TRAN0801 1.
+ SH080146 BAL0801 -1. BAL0846 1.
+ SH080246 COST 472.29 TRAN0802 1.
+ SH080246 BAL0802 -1. BAL0846 1.
+ SH080346 COST 382.33 TRAN0803 1.
+ SH080346 BAL0803 -1. BAL0846 1.
+ SH080446 COST 773.31 TRAN0804 1.
+ SH080446 BAL0804 -1. BAL0846 1.
+ SH080546 COST 743.9 TRAN0805 1.
+ SH080546 BAL0805 -1. BAL0846 1.
+ SH080646 COST 444.61 TRAN0806 1.
+ SH080646 BAL0852 -1. BAL0846 1.
+ SH080846 COST 775.04 TRAN0808 1.
+ SH080846 BAL0883 -1. BAL0846 1.
+ SH080147 COST 190.3 TRAN0801 1.
+ SH080147 BAL0801 -1. BAL0847 1.
+ SH080247 COST 645.29 TRAN0802 1.
+ SH080247 BAL0802 -1. BAL0847 1.
+ SH080347 COST 275.07 TRAN0803 1.
+ SH080347 BAL0803 -1. BAL0847 1.
+ SH080447 COST 474.02 TRAN0804 1.
+ SH080447 BAL0804 -1. BAL0847 1.
+ SH080547 COST 403.09 TRAN0805 1.
+ SH080547 BAL0805 -1. BAL0847 1.
+ SH080647 COST 250.85 TRAN0806 1.
+ SH080647 BAL0852 -1. BAL0847 1.
+ SH080847 COST 422.12 TRAN0808 1.
+ SH080847 BAL0883 -1. BAL0847 1.
+ SH080148 COST 164.35 TRAN0801 1.
+ SH080148 BAL0801 -1. BAL0848 1.
+ SH080248 COST 586.47 TRAN0802 1.
+ SH080248 BAL0802 -1. BAL0848 1.
+ SH080348 COST 237.01 TRAN0803 1.
+ SH080348 BAL0803 -1. BAL0848 1.
+ SH080448 COST 397.9 TRAN0804 1.
+ SH080448 BAL0804 -1. BAL0848 1.
+ SH080548 COST 427.31 TRAN0805 1.
+ SH080548 BAL0805 -1. BAL0848 1.
+ SH080648 COST 198.95 TRAN0806 1.
+ SH080648 BAL0852 -1. BAL0848 1.
+ SH080848 COST 337.35 TRAN0808 1.
+ SH080848 BAL0883 -1. BAL0848 1.
+ SH080149 COST 569.17 TRAN0801 1.
+ SH080149 BAL0801 -1. BAL0849 1.
+ SH080249 COST 925.55 TRAN0802 1.
+ SH080249 BAL0802 -1. BAL0849 1.
+ SH080349 COST 574.36 TRAN0803 1.
+ SH080349 BAL0803 -1. BAL0849 1.
+ SH080449 COST 659.13 TRAN0804 1.
+ SH080449 BAL0804 -1. BAL0849 1.
+ SH080549 COST 262.96 TRAN0805 1.
+ SH080549 BAL0805 -1. BAL0849 1.
+ SH080649 COST 584.74 TRAN0806 1.
+ SH080649 BAL0852 -1. BAL0849 1.
+ SH080749 COST 231.82 TRAN0807 1.
+ SH080749 BAL0864 -1. BAL0849 1.
+ SH080849 COST 705.84 TRAN0808 1.
+ SH080849 BAL0883 -1. BAL0849 1.
+ SH080150 COST 416.93 TRAN0801 1.
+ SH080150 BAL0801 -1. BAL0850 1.
+ SH080250 COST 1058.76 TRAN0802 1.
+ SH080250 BAL0802 -1. BAL0850 1.
+ SH080350 COST 425.58 TRAN0803 1.
+ SH080350 BAL0803 -1. BAL0850 1.
+ SH080450 COST 631.45 TRAN0804 1.
+ SH080450 BAL0804 -1. BAL0850 1.
+ SH080550 COST 406.55 TRAN0805 1.
+ SH080550 BAL0805 -1. BAL0850 1.
+ SH080750 COST 237.01 TRAN0807 1.
+ SH080750 BAL0864 -1. BAL0850 1.
+ SH080850 COST 702.38 TRAN0808 1.
+ SH080850 BAL0883 -1. BAL0850 1.
+ SH080151 COST 574.36 TRAN0801 1.
+ SH080151 BAL0801 -1. BAL0851 1.
+ SH080251 COST 951.5 TRAN0802 1.
+ SH080251 BAL0802 -1. BAL0851 1.
+ SH080351 COST 589.93 TRAN0803 1.
+ SH080351 BAL0803 -1. BAL0851 1.
+ SH080451 COST 584.74 TRAN0804 1.
+ SH080451 BAL0804 -1. BAL0851 1.
+ SH080551 COST 212.79 TRAN0805 1.
+ SH080551 BAL0805 -1. BAL0851 1.
+ SH080751 COST 171.27 TRAN0807 1.
+ SH080751 BAL0864 -1. BAL0851 1.
+ SH080851 COST 740.44 TRAN0808 1.
+ SH080851 BAL0883 -1. BAL0851 1.
+ SH080152 COST 193.76 TRAN0801 1.
+ SH080152 BAL0801 -1. BAL0852 1.
+ SH080252 COST 519. TRAN0802 1.
+ SH080252 BAL0802 -1. BAL0852 1.
+ SH080352 COST 141.86 TRAN0803 1.
+ SH080352 BAL0803 -1. BAL0852 1.
+ SH080452 COST 557.06 TRAN0804 1.
+ SH080452 BAL0804 -1. BAL0852 1.
+ SH080552 COST 510.35 TRAN0805 1.
+ SH080552 BAL0805 -1. BAL0852 1.
+ SH080852 COST 437.69 TRAN0808 1.
+ SH080852 BAL0883 -1. BAL0852 1.
+ SH080153 COST 621.07 TRAN0801 1.
+ SH080153 BAL0801 -1. BAL0853 1.
+ SH080253 COST 1100.28 TRAN0802 1.
+ SH080253 BAL0802 -1. BAL0853 1.
+ SH080353 COST 562.25 TRAN0803 1.
+ SH080353 BAL0803 -1. BAL0853 1.
+ SH080453 COST 712.76 TRAN0804 1.
+ SH080453 BAL0804 -1. BAL0853 1.
+ SH080553 COST 318.32 TRAN0805 1.
+ SH080553 BAL0805 -1. BAL0853 1.
+ SH080653 COST 621.07 TRAN0806 1.
+ SH080653 BAL0852 -1. BAL0853 1.
+ SH080753 COST 252.58 TRAN0807 1.
+ SH080753 BAL0864 -1. BAL0853 1.
+ SH080853 COST 697.19 TRAN0808 1.
+ SH080853 BAL0883 -1. BAL0853 1.
+ SH080154 COST 320.05 TRAN0801 1.
+ SH080154 BAL0801 -1. BAL0854 1.
+ SH080254 COST 769.85 TRAN0802 1.
+ SH080254 BAL0802 -1. BAL0854 1.
+ SH080354 COST 375.41 TRAN0803 1.
+ SH080354 BAL0803 -1. BAL0854 1.
+ SH080454 COST 593.39 TRAN0804 1.
+ SH080454 BAL0804 -1. BAL0854 1.
+ SH080554 COST 368.49 TRAN0805 1.
+ SH080554 BAL0805 -1. BAL0854 1.
+ SH080654 COST 351.19 TRAN0806 1.
+ SH080654 BAL0852 -1. BAL0854 1.
+ SH080854 COST 695.46 TRAN0808 1.
+ SH080854 BAL0883 -1. BAL0854 1.
+ SH080155 COST 480.94 TRAN0801 1.
+ SH080155 BAL0801 -1. BAL0855 1.
+ SH080255 COST 828.67 TRAN0802 1.
+ SH080255 BAL0802 -1. BAL0855 1.
+ SH080355 COST 486.13 TRAN0803 1.
+ SH080355 BAL0803 -1. BAL0855 1.
+ SH080455 COST 508.62 TRAN0804 1.
+ SH080455 BAL0804 -1. BAL0855 1.
+ SH080555 COST 266.42 TRAN0805 1.
+ SH080555 BAL0805 -1. BAL0855 1.
+ SH080655 COST 501.7 TRAN0806 1.
+ SH080655 BAL0852 -1. BAL0855 1.
+ SH080755 COST 185.11 TRAN0807 1.
+ SH080755 BAL0864 -1. BAL0855 1.
+ SH080855 COST 508.62 TRAN0808 1.
+ SH080855 BAL0883 -1. BAL0855 1.
+ SH080156 COST 674.7 TRAN0801 1.
+ SH080156 BAL0801 -1. BAL0856 1.
+ SH080256 COST 1001.67 TRAN0802 1.
+ SH080256 BAL0802 -1. BAL0856 1.
+ SH080356 COST 527.65 TRAN0803 1.
+ SH080356 BAL0803 -1. BAL0856 1.
+ SH080456 COST 631.45 TRAN0804 1.
+ SH080456 BAL0804 -1. BAL0856 1.
+ SH080556 COST 235.28 TRAN0805 1.
+ SH080556 BAL0805 -1. BAL0856 1.
+ SH080656 COST 586.47 TRAN0806 1.
+ SH080656 BAL0852 -1. BAL0856 1.
+ SH080756 COST 211.06 TRAN0807 1.
+ SH080756 BAL0864 -1. BAL0856 1.
+ SH080856 COST 617.61 TRAN0808 1.
+ SH080856 BAL0883 -1. BAL0856 1.
+ SH080157 COST 451.53 TRAN0801 1.
+ SH080157 BAL0801 -1. BAL0857 1.
+ SH080257 COST 899.6 TRAN0802 1.
+ SH080257 BAL0802 -1. BAL0857 1.
+ SH080357 COST 501.7 TRAN0803 1.
+ SH080357 BAL0803 -1. BAL0857 1.
+ SH080457 COST 404.82 TRAN0804 1.
+ SH080457 BAL0804 -1. BAL0857 1.
+ SH080557 COST 290.64 TRAN0805 1.
+ SH080557 BAL0805 -1. BAL0857 1.
+ SH080657 COST 551.87 TRAN0806 1.
+ SH080657 BAL0852 -1. BAL0857 1.
+ SH080757 COST 256.04 TRAN0807 1.
+ SH080757 BAL0864 -1. BAL0857 1.
+ SH080857 COST 399.63 TRAN0808 1.
+ SH080857 BAL0883 -1. BAL0857 1.
+ SH080158 COST 508.62 TRAN0801 1.
+ SH080158 BAL0801 -1. BAL0858 1.
+ SH080258 COST 901.33 TRAN0802 1.
+ SH080258 BAL0802 -1. BAL0858 1.
+ SH080358 COST 480.94 TRAN0803 1.
+ SH080358 BAL0803 -1. BAL0858 1.
+ SH080458 COST 593.39 TRAN0804 1.
+ SH080458 BAL0804 -1. BAL0858 1.
+ SH080558 COST 36.33 TRAN0805 1.
+ SH080558 BAL0805 -1. BAL0858 1.
+ SH080658 COST 563.98 TRAN0806 1.
+ SH080658 BAL0852 -1. BAL0858 1.
+ SH080758 COST 117.64 TRAN0807 1.
+ SH080758 BAL0864 -1. BAL0858 1.
+ SH080858 COST 439.42 TRAN0808 1.
+ SH080858 BAL0883 -1. BAL0858 1.
+ SH080159 COST 356.38 TRAN0801 1.
+ SH080159 BAL0801 -1. BAL0859 1.
+ SH080259 COST 861.54 TRAN0802 1.
+ SH080259 BAL0802 -1. BAL0859 1.
+ SH080359 COST 411.74 TRAN0803 1.
+ SH080359 BAL0803 -1. BAL0859 1.
+ SH080459 COST 422.12 TRAN0804 1.
+ SH080459 BAL0804 -1. BAL0859 1.
+ SH080559 COST 275.07 TRAN0805 1.
+ SH080559 BAL0805 -1. BAL0859 1.
+ SH080659 COST 513.81 TRAN0806 1.
+ SH080659 BAL0852 -1. BAL0859 1.
+ SH080759 COST 181.65 TRAN0807 1.
+ SH080759 BAL0864 -1. BAL0859 1.
+ SH080859 COST 441.15 TRAN0808 1.
+ SH080859 BAL0883 -1. BAL0859 1.
+ SH080160 COST 451.53 TRAN0801 1.
+ SH080160 BAL0801 -1. BAL0860 1.
+ SH080260 COST 951.5 TRAN0802 1.
+ SH080260 BAL0802 -1. BAL0860 1.
+ SH080360 COST 489.59 TRAN0803 1.
+ SH080360 BAL0803 -1. BAL0860 1.
+ SH080460 COST 539.76 TRAN0804 1.
+ SH080460 BAL0804 -1. BAL0860 1.
+ SH080560 COST 233.55 TRAN0805 1.
+ SH080560 BAL0805 -1. BAL0860 1.
+ SH080660 COST 558.79 TRAN0806 1.
+ SH080660 BAL0852 -1. BAL0860 1.
+ SH080760 COST 152.24 TRAN0807 1.
+ SH080760 BAL0864 -1. BAL0860 1.
+ SH080860 COST 517.27 TRAN0808 1.
+ SH080860 BAL0883 -1. BAL0860 1.
+ SH080163 COST 460.18 TRAN0801 1.
+ SH080163 BAL0801 -1. BAL0863 1.
+ SH080263 COST 854.62 TRAN0802 1.
+ SH080263 BAL0802 -1. BAL0863 1.
+ SH080363 COST 496.51 TRAN0803 1.
+ SH080363 BAL0803 -1. BAL0863 1.
+ SH080463 COST 638.37 TRAN0804 1.
+ SH080463 BAL0804 -1. BAL0863 1.
+ SH080563 COST 262.96 TRAN0805 1.
+ SH080563 BAL0805 -1. BAL0863 1.
+ SH080663 COST 544.95 TRAN0806 1.
+ SH080663 BAL0852 -1. BAL0863 1.
+ SH080763 COST 214.52 TRAN0807 1.
+ SH080763 BAL0864 -1. BAL0863 1.
+ SH080863 COST 692. TRAN0808 1.
+ SH080863 BAL0883 -1. BAL0863 1.
+ SH080164 COST 344.27 TRAN0801 1.
+ SH080164 BAL0801 -1. BAL0864 1.
+ SH080264 COST 909.98 TRAN0802 1.
+ SH080264 BAL0802 -1. BAL0864 1.
+ SH080364 COST 385.79 TRAN0803 1.
+ SH080364 BAL0803 -1. BAL0864 1.
+ SH080464 COST 581.28 TRAN0804 1.
+ SH080464 BAL0804 -1. BAL0864 1.
+ SH080564 COST 100.34 TRAN0805 1.
+ SH080564 BAL0805 -1. BAL0864 1.
+ SH080664 COST 548.41 TRAN0806 1.
+ SH080664 BAL0852 -1. BAL0864 1.
+ SH080864 COST 432.5 TRAN0808 1.
+ SH080864 BAL0883 -1. BAL0864 1.
+ SH080165 COST 747.36 TRAN0801 1.
+ SH080165 BAL0801 -1. BAL0865 1.
+ SH080265 COST 531.11 TRAN0802 1.
+ SH080265 BAL0802 -1. BAL0865 1.
+ SH080365 COST 873.65 TRAN0803 1.
+ SH080365 BAL0803 -1. BAL0865 1.
+ SH080465 COST 671.24 TRAN0804 1.
+ SH080465 BAL0804 -1. BAL0865 1.
+ SH080565 COST 1044.92 TRAN0805 1.
+ SH080565 BAL0805 -1. BAL0865 1.
+ SH080865 COST 717.95 TRAN0808 1.
+ SH080865 BAL0883 -1. BAL0865 1.
+ SH080166 COST 968.8 TRAN0801 1.
+ SH080166 BAL0801 -1. BAL0866 1.
+ SH080266 COST 448.07 TRAN0802 1.
+ SH080266 BAL0802 -1. BAL0866 1.
+ SH080366 COST 999.94 TRAN0803 1.
+ SH080366 BAL0803 -1. BAL0866 1.
+ SH080466 COST 961.88 TRAN0804 1.
+ SH080466 BAL0804 -1. BAL0866 1.
+ SH080566 COST 1228.3 TRAN0805 1.
+ SH080566 BAL0805 -1. BAL0866 1.
+ SH080866 COST 968.8 TRAN0808 1.
+ SH080866 BAL0883 -1. BAL0866 1.
+ SH080167 COST 735.25 TRAN0801 1.
+ SH080167 BAL0801 -1. BAL0867 1.
+ SH080267 COST 401.36 TRAN0802 1.
+ SH080267 BAL0802 -1. BAL0867 1.
+ SH080367 COST 852.89 TRAN0803 1.
+ SH080367 BAL0803 -1. BAL0867 1.
+ SH080467 COST 790.61 TRAN0804 1.
+ SH080467 BAL0804 -1. BAL0867 1.
+ SH080567 COST 1044.92 TRAN0805 1.
+ SH080567 BAL0805 -1. BAL0867 1.
+ SH080867 COST 792.34 TRAN0808 1.
+ SH080867 BAL0883 -1. BAL0867 1.
+ SH080168 COST 1027.62 TRAN0801 1.
+ SH080168 BAL0801 -1. BAL0868 1.
+ SH080268 COST 692. TRAN0802 1.
+ SH080268 BAL0802 -1. BAL0868 1.
+ SH080368 COST 968.8 TRAN0803 1.
+ SH080368 BAL0803 -1. BAL0868 1.
+ SH080468 COST 1214.46 TRAN0804 1.
+ SH080468 BAL0804 -1. BAL0868 1.
+ SH080568 COST 1636.58 TRAN0805 1.
+ SH080568 BAL0805 -1. BAL0868 1.
+ SH080868 COST 1299.23 TRAN0808 1.
+ SH080868 BAL0883 -1. BAL0868 1.
+ SH080169 COST 932.47 TRAN0801 1.
+ SH080169 BAL0801 -1. BAL0869 1.
+ SH080269 COST 382.33 TRAN0802 1.
+ SH080269 BAL0802 -1. BAL0869 1.
+ SH080369 COST 882.3 TRAN0803 1.
+ SH080369 BAL0803 -1. BAL0869 1.
+ SH080469 COST 1076.06 TRAN0804 1.
+ SH080469 BAL0804 -1. BAL0869 1.
+ SH080569 COST 1117.58 TRAN0805 1.
+ SH080569 BAL0805 -1. BAL0869 1.
+ SH080869 COST 1138.34 TRAN0808 1.
+ SH080869 BAL0883 -1. BAL0869 1.
+ SH080171 COST 761.2 TRAN0801 1.
+ SH080171 BAL0801 -1. BAL0871 1.
+ SH080371 COST 906.52 TRAN0803 1.
+ SH080371 BAL0803 -1. BAL0871 1.
+ SH080471 COST 901.33 TRAN0804 1.
+ SH080471 BAL0804 -1. BAL0871 1.
+ SH080571 COST 1005.13 TRAN0805 1.
+ SH080571 BAL0805 -1. BAL0871 1.
+ SH080671 COST 676.43 TRAN0806 1.
+ SH080671 BAL0852 -1. BAL0871 1.
+ SH080771 COST 1217.92 TRAN0807 1.
+ SH080771 BAL0864 -1. BAL0871 1.
+ SH080871 COST 922.09 TRAN0808 1.
+ SH080871 BAL0883 -1. BAL0871 1.
+ SH080172 COST 1015.51 TRAN0801 1.
+ SH080172 BAL0801 -1. BAL0872 1.
+ SH080272 COST 939.39 TRAN0802 1.
+ SH080272 BAL0802 -1. BAL0872 1.
+ SH080372 COST 1067.41 TRAN0803 1.
+ SH080372 BAL0803 -1. BAL0872 1.
+ SH080472 COST 986.1 TRAN0804 1.
+ SH080472 BAL0804 -1. BAL0872 1.
+ SH080572 COST 1319.99 TRAN0805 1.
+ SH080572 BAL0805 -1. BAL0872 1.
+ SH080872 COST 986.1 TRAN0808 1.
+ SH080872 BAL0883 -1. BAL0872 1.
+ SH080173 COST 674.7 TRAN0801 1.
+ SH080173 BAL0801 -1. BAL0873 1.
+ SH080273 COST 631.45 TRAN0802 1.
+ SH080273 BAL0802 -1. BAL0873 1.
+ SH080373 COST 584.74 TRAN0803 1.
+ SH080373 BAL0803 -1. BAL0873 1.
+ SH080473 COST 790.61 TRAN0804 1.
+ SH080473 BAL0804 -1. BAL0873 1.
+ SH080573 COST 975.72 TRAN0805 1.
+ SH080573 BAL0805 -1. BAL0873 1.
+ SH080673 COST 527.65 TRAN0806 1.
+ SH080673 BAL0852 -1. BAL0873 1.
+ SH080873 COST 871.92 TRAN0808 1.
+ SH080873 BAL0883 -1. BAL0873 1.
+ SH080174 COST 948.04 TRAN0801 1.
+ SH080174 BAL0801 -1. BAL0874 1.
+ SH080274 COST 363.3 TRAN0802 1.
+ SH080274 BAL0802 -1. BAL0874 1.
+ SH080374 COST 986.1 TRAN0803 1.
+ SH080374 BAL0803 -1. BAL0874 1.
+ SH080474 COST 1102.01 TRAN0804 1.
+ SH080474 BAL0804 -1. BAL0874 1.
+ SH080574 COST 1268.09 TRAN0805 1.
+ SH080574 BAL0805 -1. BAL0874 1.
+ SH080874 COST 1070.87 TRAN0808 1.
+ SH080874 BAL0883 -1. BAL0874 1.
+ SH080275 COST 958.42 TRAN0802 1.
+ SH080275 BAL0802 -1. BAL0875 1.
+ SH080176 COST 799.26 TRAN0801 1.
+ SH080176 BAL0801 -1. BAL0876 1.
+ SH080276 COST 693.73 TRAN0802 1.
+ SH080276 BAL0802 -1. BAL0876 1.
+ SH080376 COST 697.19 TRAN0803 1.
+ SH080376 BAL0803 -1. BAL0876 1.
+ SH080476 COST 1089.9 TRAN0804 1.
+ SH080476 BAL0804 -1. BAL0876 1.
+ SH080576 COST 1089.9 TRAN0805 1.
+ SH080576 BAL0805 -1. BAL0876 1.
+ SH080676 COST 659.13 TRAN0806 1.
+ SH080676 BAL0852 -1. BAL0876 1.
+ SH080876 COST 1344.21 TRAN0808 1.
+ SH080876 BAL0883 -1. BAL0876 1.
+ SH080177 COST 752.55 TRAN0801 1.
+ SH080177 BAL0801 -1. BAL0877 1.
+ SH080277 COST 470.56 TRAN0802 1.
+ SH080277 BAL0802 -1. BAL0877 1.
+ SH080377 COST 797.53 TRAN0803 1.
+ SH080377 BAL0803 -1. BAL0877 1.
+ SH080477 COST 693.73 TRAN0804 1.
+ SH080477 BAL0804 -1. BAL0877 1.
+ SH080577 COST 968.8 TRAN0805 1.
+ SH080577 BAL0805 -1. BAL0877 1.
+ SH080877 COST 553.6 TRAN0808 1.
+ SH080877 BAL0883 -1. BAL0877 1.
+ SH080178 COST 1316.53 TRAN0801 1.
+ SH080178 BAL0801 -1. BAL0878 1.
+ SH080278 COST 764.66 TRAN0802 1.
+ SH080278 BAL0802 -1. BAL0878 1.
+ SH080378 COST 1354.59 TRAN0803 1.
+ SH080378 BAL0803 -1. BAL0878 1.
+ SH080478 COST 1185.05 TRAN0804 1.
+ SH080478 BAL0804 -1. BAL0878 1.
+ SH080578 COST 1520.67 TRAN0805 1.
+ SH080578 BAL0805 -1. BAL0878 1.
+ SH080878 COST 1325.18 TRAN0808 1.
+ SH080878 BAL0883 -1. BAL0878 1.
+ SH080179 COST 1236.95 TRAN0801 1.
+ SH080179 BAL0801 -1. BAL0879 1.
+ SH080279 COST 465.37 TRAN0802 1.
+ SH080279 BAL0802 -1. BAL0879 1.
+ SH080379 COST 1195.43 TRAN0803 1.
+ SH080379 BAL0803 -1. BAL0879 1.
+ SH080479 COST 1245.6 TRAN0804 1.
+ SH080479 BAL0804 -1. BAL0879 1.
+ SH080879 COST 1221.38 TRAN0808 1.
+ SH080879 BAL0883 -1. BAL0879 1.
+ SH080180 COST 548.41 TRAN0801 1.
+ SH080180 BAL0801 -1. BAL0880 1.
+ SH080280 COST 683.35 TRAN0802 1.
+ SH080280 BAL0802 -1. BAL0880 1.
+ SH080380 COST 756.01 TRAN0803 1.
+ SH080380 BAL0803 -1. BAL0880 1.
+ SH080480 COST 647.02 TRAN0804 1.
+ SH080480 BAL0804 -1. BAL0880 1.
+ SH080580 COST 873.65 TRAN0805 1.
+ SH080580 BAL0805 -1. BAL0880 1.
+ SH080880 COST 415.2 TRAN0808 1.
+ SH080880 BAL0883 -1. BAL0880 1.
+ SH080182 COST 1006.86 TRAN0801 1.
+ SH080182 BAL0801 -1. BAL0882 1.
+ SH080282 COST 569.17 TRAN0802 1.
+ SH080282 BAL0802 -1. BAL0882 1.
+ SH080382 COST 1133.15 TRAN0803 1.
+ SH080382 BAL0803 -1. BAL0882 1.
+ SH080482 COST 1221.38 TRAN0804 1.
+ SH080482 BAL0804 -1. BAL0882 1.
+ SH080582 COST 1984.31 TRAN0805 1.
+ SH080582 BAL0805 -1. BAL0882 1.
+ SH080882 COST 1354.59 TRAN0808 1.
+ SH080882 BAL0883 -1. BAL0882 1.
+ SH080183 COST 306.21 TRAN0801 1.
+ SH080183 BAL0801 -1. BAL0883 1.
+ SH080283 COST 899.6 TRAN0802 1.
+ SH080283 BAL0802 -1. BAL0883 1.
+ SH080383 COST 470.56 TRAN0803 1.
+ SH080383 BAL0803 -1. BAL0883 1.
+ SH080483 COST 102.07 TRAN0804 1.
+ SH080483 BAL0804 -1. BAL0883 1.
+ SH080583 COST 600.31 TRAN0805 1.
+ SH080583 BAL0805 -1. BAL0883 1.
+ SH080683 COST 429.04 TRAN0806 1.
+ SH080683 BAL0852 -1. BAL0883 1.
+ SH080184 COST 525.92 TRAN0801 1.
+ SH080184 BAL0801 -1. BAL0884 1.
+ SH080284 COST 332.16 TRAN0802 1.
+ SH080284 BAL0802 -1. BAL0884 1.
+ SH080384 COST 629.72 TRAN0803 1.
+ SH080384 BAL0803 -1. BAL0884 1.
+ SH080484 COST 640.1 TRAN0804 1.
+ SH080484 BAL0804 -1. BAL0884 1.
+ SH080584 COST 847.7 TRAN0805 1.
+ SH080584 BAL0805 -1. BAL0884 1.
+ SH080684 COST 527.65 TRAN0806 1.
+ SH080684 BAL0852 -1. BAL0884 1.
+ SH080884 COST 671.24 TRAN0808 1.
+ SH080884 BAL0883 -1. BAL0884 1.
+ TRSH0101 COST 78. TRAN0101 -1.
+ TRSH0102 COST 78. TRAN0201 -1.
+ TRSH0103 COST 78. TRAN0301 -1.
+ TRSH0104 COST 101.5 TRAN0401 -1.
+ TRSH0105 COST 78. TRAN0501 -1.
+ TRSH0106 COST 78. TRAN0601 -1.
+ TRSH0107 COST 78. TRAN0701 -1.
+ TRSH0108 COST 101.5 TRAN0801 -1.
+ TRSH0201 COST 78. TRAN0102 -1.
+ TRSH0202 COST 78. TRAN0202 -1.
+ TRSH0203 COST 78. TRAN0302 -1.
+ TRSH0204 COST 101.5 TRAN0402 -1.
+ TRSH0205 COST 78. TRAN0502 -1.
+ TRSH0206 COST 78. TRAN0602 -1.
+ TRSH0207 COST 78. TRAN0702 -1.
+ TRSH0208 COST 101.5 TRAN0802 -1.
+ TRSH0301 COST 78. TRAN0103 -1.
+ TRSH0302 COST 78. TRAN0203 -1.
+ TRSH0303 COST 78. TRAN0303 -1.
+ TRSH0304 COST 101.5 TRAN0403 -1.
+ TRSH0305 COST 78. TRAN0503 -1.
+ TRSH0306 COST 78. TRAN0603 -1.
+ TRSH0307 COST 78. TRAN0703 -1.
+ TRSH0308 COST 101.5 TRAN0803 -1.
+ TRSH0401 COST 78. TRAN0104 -1.
+ TRSH0402 COST 78. TRAN0204 -1.
+ TRSH0403 COST 78. TRAN0304 -1.
+ TRSH0404 COST 101.5 TRAN0404 -1.
+ TRSH0405 COST 78. TRAN0504 -1.
+ TRSH0406 COST 78. TRAN0604 -1.
+ TRSH0407 COST 78. TRAN0704 -1.
+ TRSH0408 COST 101.5 TRAN0804 -1.
+ TRSH0501 COST 78. TRAN0105 -1.
+ TRSH0502 COST 78. TRAN0205 -1.
+ TRSH0503 COST 78. TRAN0305 -1.
+ TRSH0504 COST 101.5 TRAN0405 -1.
+ TRSH0505 COST 78. TRAN0505 -1.
+ TRSH0506 COST 78. TRAN0605 -1.
+ TRSH0507 COST 78. TRAN0705 -1.
+ TRSH0508 COST 101.5 TRAN0805 -1.
+ TRSH0601 COST 78. TRAN0106 -1.
+ TRSH0602 COST 78. TRAN0206 -1.
+ TRSH0603 COST 78. TRAN0306 -1.
+ TRSH0604 COST 101.5 TRAN0406 -1.
+ TRSH0605 COST 78. TRAN0506 -1.
+ TRSH0606 COST 78. TRAN0606 -1.
+ TRSH0607 COST 78. TRAN0706 -1.
+ TRSH0608 COST 101.5 TRAN0806 -1.
+ TRSH0701 COST 78. TRAN0107 -1.
+ TRSH0702 COST 78. TRAN0207 -1.
+ TRSH0703 COST 78. TRAN0307 -1.
+ TRSH0704 COST 101.5 TRAN0407 -1.
+ TRSH0705 COST 78. TRAN0507 -1.
+ TRSH0706 COST 78. TRAN0607 -1.
+ TRSH0707 COST 78. TRAN0707 -1.
+ TRSH0708 COST 101.5 TRAN0807 -1.
+ TRSH0801 COST 78. TRAN0108 -1.
+ TRSH0802 COST 78. TRAN0208 -1.
+ TRSH0803 COST 78. TRAN0308 -1.
+ TRSH0804 COST 101.5 TRAN0408 -1.
+ TRSH0805 COST 78. TRAN0508 -1.
+ TRSH0806 COST 78. TRAN0608 -1.
+ TRSH0807 COST 78. TRAN0708 -1.
+ TRSH0808 COST 101.5 TRAN0808 -1.
+RHS
+ RHS REGMAX 7. OVRMAX 126.
+ RHS REGMAX01 3. REGMAX02 3.
+ RHS REGMAX04 3. OVRMAX01 48.
+ RHS OVRMAX02 48. OVRMAX04 30.
+ RHS BAL0102 .105342 BAL0104 .316026
+ RHS BAL0106 .263355 BAL0107 1.15876
+ RHS BAL0108 .948077 BAL0109 .421368
+ RHS BAL0110 .57938 BAL0111 .632051
+ RHS BAL0112 .526709 BAL0114 .421368
+ RHS BAL0115 1.21143 BAL0116 .948077
+ RHS BAL0117 1.05342 BAL0118 .421368
+ RHS BAL0119 .684722 BAL0120 1.15876
+ RHS BAL0121 1.10609 BAL0122 .684722
+ RHS BAL0123 .57938 BAL0124 .0526709
+ RHS BAL0125 .684722 BAL0126 .210684
+ RHS BAL0127 .316026 BAL0128 .895406
+ RHS BAL0129 .474038 BAL0130 .842735
+ RHS BAL0131 .57938 BAL0132 1.00075
+ RHS BAL0133 1.15876 BAL0134 1.05342
+ RHS BAL0135 .632051 BAL0136 .368697
+ RHS BAL0137 1.94882 BAL0138 1.79081
+ RHS BAL0139 .368697 BAL0140 1.10609
+ RHS BAL0141 .737393 BAL0142 .263355
+ RHS BAL0143 1.52746 BAL0144 .895406
+ RHS BAL0145 1.36944 BAL0146 .895406
+ RHS BAL0147 .632051 BAL0148 .526709
+ RHS BAL0149 .368697 BAL0150 .526709
+ RHS BAL0151 .421368 BAL0153 1.00075
+ RHS BAL0154 .421368 BAL0155 1.10609
+ RHS BAL0156 .790064 BAL0157 .684722
+ RHS BAL0158 2.0015 BAL0159 1.21143
+ RHS BAL0160 1.21143 BAL0163 .526709
+ RHS BAL0165 .210684 BAL0166 .263355
+ RHS BAL0167 .210684 BAL0168 .105342
+ RHS BAL0169 .158013 BAL0171 .948077
+ RHS BAL0172 .210684 BAL0173 .158013
+ RHS BAL0174 .105342 BAL0175 .210684
+ RHS BAL0176 .0526709 BAL0177 1.00075
+ RHS BAL0178 .842735 BAL0179 .105342
+ RHS BAL0180 .263355 BAL0182 .316026
+ RHS BAL0184 .316026 BAL0201 .130917
+ RHS BAL0202 .261834 BAL0204 .785501
+ RHS BAL0206 1.17825 BAL0207 3.79659
+ RHS BAL0208 2.74925 BAL0209 1.571
+ RHS BAL0210 2.09467 BAL0211 1.96375
+ RHS BAL0212 1.83284 BAL0214 1.70192
+ RHS BAL0215 6.15309 BAL0216 2.09467
+ RHS BAL0217 2.09467 BAL0218 1.571
+ RHS BAL0219 3.01109 BAL0220 3.01109
+ RHS BAL0221 3.142 BAL0222 2.22559
+ RHS BAL0223 2.22559 BAL0224 .130917
+ RHS BAL0225 1.30917 BAL0226 .523667
+ RHS BAL0227 1.17825 BAL0228 1.571
+ RHS BAL0229 1.30917 BAL0230 1.571
+ RHS BAL0231 1.571 BAL0232 1.96375
+ RHS BAL0233 2.74925 BAL0234 2.09467
+ RHS BAL0235 1.30917 BAL0236 .654584
+ RHS BAL0237 3.66567 BAL0238 3.142
+ RHS BAL0239 1.571 BAL0240 1.70192
+ RHS BAL0241 1.17825 BAL0242 1.30917
+ RHS BAL0243 4.18934 BAL0244 1.17825
+ RHS BAL0245 2.22559 BAL0246 2.09467
+ RHS BAL0247 1.44009 BAL0248 1.04733
+ RHS BAL0249 .654584 BAL0250 .785501
+ RHS BAL0251 .523667 BAL0253 2.22559
+ RHS BAL0254 .654584 BAL0255 1.83284
+ RHS BAL0256 1.571 BAL0257 1.30917
+ RHS BAL0258 3.27292 BAL0259 2.3565
+ RHS BAL0260 1.83284 BAL0263 .785501
+ RHS BAL0265 .916418 BAL0266 .916418
+ RHS BAL0267 .785501 BAL0268 .261834
+ RHS BAL0269 .654584 BAL0271 3.27292
+ RHS BAL0272 .392751 BAL0273 1.04733
+ RHS BAL0274 .523667 BAL0275 .523667
+ RHS BAL0276 .392751 BAL0277 3.53475
+ RHS BAL0278 2.09467 BAL0279 .392751
+ RHS BAL0280 .654584 BAL0282 1.04733
+ RHS BAL0284 1.30917 BAL0302 .067364
+ RHS BAL0307 .471548 BAL0308 .404184
+ RHS BAL0309 .134728 BAL0310 1.48201
+ RHS BAL0311 .067364 BAL0312 .067364
+ RHS BAL0315 7.94895 BAL0316 .202092
+ RHS BAL0321 .134728 BAL0327 .875732
+ RHS BAL0329 .134728 BAL0331 .269456
+ RHS BAL0333 .269456 BAL0336 .875732
+ RHS BAL0337 .875732 BAL0338 .134728
+ RHS BAL0339 .134728 BAL0340 .33682
+ RHS BAL0341 .538912 BAL0342 .067364
+ RHS BAL0343 3.70502 BAL0344 1.54937
+ RHS BAL0345 .404184 BAL0346 3.03138
+ RHS BAL0347 .404184 BAL0348 .067364
+ RHS BAL0354 .067364 BAL0355 .134728
+ RHS BAL0358 .067364 BAL0365 .134728
+ RHS BAL0366 1.34728 BAL0367 .404184
+ RHS BAL0368 1.75146 BAL0369 1.88619
+ RHS BAL0371 5.72594 BAL0372 .67364
+ RHS BAL0373 3.70502 BAL0374 1.95356
+ RHS BAL0375 .269456 BAL0376 1.61674
+ RHS BAL0377 1.41464 BAL0378 2.22301
+ RHS BAL0379 3.16611 BAL0382 11.8561
+ RHS BAL0384 1.34728 BAL0502 .135821
+ RHS BAL0504 .543284 BAL0506 .543284
+ RHS BAL0507 2.5806 BAL0508 2.03731
+ RHS BAL0509 .814925 BAL0510 2.85224
+ RHS BAL0511 1.08657 BAL0512 1.22239
+ RHS BAL0514 1.35821 BAL0515 5.70448
+ RHS BAL0516 3.12388 BAL0517 1.49403
+ RHS BAL0518 1.35821 BAL0519 1.22239
+ RHS BAL0520 1.35821 BAL0521 6.24776
+ RHS BAL0522 .950746 BAL0523 1.08657
+ RHS BAL0525 2.71642 BAL0526 .407463
+ RHS BAL0527 1.90149 BAL0528 2.17313
+ RHS BAL0529 1.76567 BAL0530 1.22239
+ RHS BAL0531 1.49403 BAL0532 1.62985
+ RHS BAL0533 3.39552 BAL0534 2.03731
+ RHS BAL0535 .814925 BAL0536 .407463
+ RHS BAL0537 3.39552 BAL0538 2.5806
+ RHS BAL0539 1.08657 BAL0540 2.98806
+ RHS BAL0541 1.49403 BAL0542 .679104
+ RHS BAL0543 4.07463 BAL0544 .814925
+ RHS BAL0545 3.2597 BAL0546 4.34627
+ RHS BAL0547 2.03731 BAL0548 1.90149
+ RHS BAL0549 .543284 BAL0550 1.90149
+ RHS BAL0551 .407463 BAL0552 .135821
+ RHS BAL0553 1.22239 BAL0554 .950746
+ RHS BAL0555 3.2597 BAL0556 .950746
+ RHS BAL0557 1.49403 BAL0558 3.66716
+ RHS BAL0559 2.5806 BAL0560 2.17313
+ RHS BAL0563 1.62985 BAL0565 1.35821
+ RHS BAL0566 .679104 BAL0567 1.35821
+ RHS BAL0568 .407463 BAL0569 .679104
+ RHS BAL0571 4.21045 BAL0572 .679104
+ RHS BAL0573 .950746 BAL0574 .679104
+ RHS BAL0575 .271642 BAL0576 .407463
+ RHS BAL0577 4.61791 BAL0578 2.03731
+ RHS BAL0579 .407463 BAL0580 .543284
+ RHS BAL0582 1.22239 BAL0584 1.62985
+ RHS BAL0604 .0460795 BAL0606 .153598
+ RHS BAL0607 .122879 BAL0608 .291837
+ RHS BAL0609 .184318 BAL0610 .307197
+ RHS BAL0611 .291837 BAL0612 .0614393
+ RHS BAL0614 .445435 BAL0615 .368636
+ RHS BAL0616 .0614393 BAL0617 .138238
+ RHS BAL0618 .122879 BAL0619 .307197
+ RHS BAL0620 .215038 BAL0621 .522234
+ RHS BAL0622 .153598 BAL0623 .383996
+ RHS BAL0625 .383996 BAL0626 .0460795
+ RHS BAL0627 .0614393 BAL0628 .368636
+ RHS BAL0629 .122879 BAL0630 .0614393
+ RHS BAL0631 .0767991 BAL0632 .153598
+ RHS BAL0633 .353276 BAL0634 .245757
+ RHS BAL0635 .0460795 BAL0636 .0307197
+ RHS BAL0637 .583673 BAL0638 .368636
+ RHS BAL0639 .0767991 BAL0640 .122879
+ RHS BAL0641 .0767991 BAL0642 .0767991
+ RHS BAL0643 .215038 BAL0644 .0460795
+ RHS BAL0645 .491514 BAL0646 .261117
+ RHS BAL0647 .184318 BAL0648 .184318
+ RHS BAL0649 .138238 BAL0650 .107519
+ RHS BAL0651 .184318 BAL0653 .568314
+ RHS BAL0654 .0614393 BAL0655 .552954
+ RHS BAL0656 .276477 BAL0657 .153598
+ RHS BAL0658 .552954 BAL0659 .460795
+ RHS BAL0660 .460795 BAL0663 .138238
+ RHS BAL0665 .107519 BAL0666 .0767991
+ RHS BAL0667 .0614393 BAL0668 .0614393
+ RHS BAL0669 .0614393 BAL0671 .414715
+ RHS BAL0672 .107519 BAL0673 .0767991
+ RHS BAL0674 .0307197 BAL0676 .0767991
+ RHS BAL0677 .138238 BAL0678 .291837
+ RHS BAL0679 .0460795 BAL0680 .0460795
+ RHS BAL0682 .0614393 BAL0684 .168958
+ RHS BAL0706 .125786 BAL0707 .330189
+ RHS BAL0708 .188679 BAL0709 .125786
+ RHS BAL0710 .235849 BAL0711 .235849
+ RHS BAL0712 .141509 BAL0714 .204403
+ RHS BAL0715 .471698 BAL0716 .172956
+ RHS BAL0717 .204403 BAL0718 .235849
+ RHS BAL0719 .393082 BAL0720 .408805
+ RHS BAL0721 .361635 BAL0722 .188679
+ RHS BAL0723 .220126 BAL0725 .0786164
+ RHS BAL0726 .0786164 BAL0727 .0943396
+ RHS BAL0728 .267296 BAL0729 .157233
+ RHS BAL0730 .393082 BAL0731 .220126
+ RHS BAL0732 .188679 BAL0733 .204403
+ RHS BAL0734 .172956 BAL0735 .157233
+ RHS BAL0736 .0943396 BAL0737 .408805
+ RHS BAL0738 .707547 BAL0739 .141509
+ RHS BAL0740 .110063 BAL0741 .157233
+ RHS BAL0742 .125786 BAL0743 .283019
+ RHS BAL0744 .235849 BAL0745 .471698
+ RHS BAL0746 .220126 BAL0747 .125786
+ RHS BAL0748 .141509 BAL0749 .188679
+ RHS BAL0750 .235849 BAL0751 .251572
+ RHS BAL0753 .707547 BAL0754 .172956
+ RHS BAL0755 .314465 BAL0756 .424528
+ RHS BAL0757 .204403 BAL0758 .896226
+ RHS BAL0759 .220126 BAL0760 .550314
+ RHS BAL0763 .220126 BAL0765 .0786164
+ RHS BAL0766 .0628931 BAL0767 .0628931
+ RHS BAL0768 .0471698 BAL0769 .0314465
+ RHS BAL0771 .0943396 BAL0772 .0628931
+ RHS BAL0773 .0943396 BAL0774 .0157233
+ RHS BAL0776 .0471698 BAL0777 .0786164
+ RHS BAL0778 .141509 BAL0779 .0314465
+ RHS BAL0780 .0471698 BAL0782 .0786164
+ RHS BAL0784 .157233
+ENDATA
diff --git a/demos/ppl_lpsol/examples/unboundedmin.mps b/demos/ppl_lpsol/examples/unboundedmin.mps
new file mode 100644
index 0000000..9f3549d
--- /dev/null
+++ b/demos/ppl_lpsol/examples/unboundedmin.mps
@@ -0,0 +1,21 @@
+NAME from_lp_file
+ROWS
+ N r_000000
+ L C1
+ L r_000002
+COLUMNS
+ MARK0000 'MARKER' 'INTORG'
+ x1 r_000000 1
+ x1 C1 2
+ x1 r_000002 -4
+ x2 r_000000 -2
+ x2 C1 -1
+ x2 r_000002 -4
+ MARK0001 'MARKER' 'INTEND'
+RHS
+ RHS C1 0
+ RHS r_000002 0
+BOUNDS
+ PL FOO x1
+ PL FOO x2
+ENDATA
diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16
new file mode 100644
index 0000000..1d892f2
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16
@@ -0,0 +1,977 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int16_a b/demos/ppl_lpsol/expected_int16_a
new file mode 100644
index 0000000..2bfba03
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16_a
@@ -0,0 +1,183 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32 b/demos/ppl_lpsol/expected_int32
new file mode 100644
index 0000000..c87cc4d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32
@@ -0,0 +1,997 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32_a b/demos/ppl_lpsol/expected_int32_a
new file mode 100644
index 0000000..3db8071
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32_a
@@ -0,0 +1,165 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64 b/demos/ppl_lpsol/expected_int64
new file mode 100644
index 0000000..7123aa8
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64
@@ -0,0 +1,1046 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n rout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64_a b/demos/ppl_lpsol/expected_int64_a
new file mode 100644
index 0000000..61f3bf8
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64_a
@@ -0,0 +1,207 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8 b/demos/ppl_lpsol/expected_int8
new file mode 100644
index 0000000..cee5931
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8
@@ -0,0 +1,181 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8_a b/demos/ppl_lpsol/expected_int8_a
new file mode 100644
index 0000000..f00b5d1
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8_a
@@ -0,0 +1,161 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_mpz b/demos/ppl_lpsol/expected_mpz
new file mode 100644
index 0000000..2bb4f16
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz
@@ -0,0 +1,6171 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n egout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n lseu.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n markshare2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas76.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n noswot.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n p0033.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n pk1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n rout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+Optimum value: 225494.9632
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 0
+22 = 3.13818313
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 3.079217438
+62 = 0.795583754
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+Optimum value: 149.5887662
+Optimum location:
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.811823571
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112416
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968062
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496866
+BTO.3PBW = 0
+BAL.3RBW = 9.188176429
+BHC.3RBW = 20
+BLC.3RBW = 15.44903194
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378972
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088815
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741723
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646875
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695431
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.6033373468
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.09549689808
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647972
+x85 = 0
+x86 = 0.1119635576
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130219
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811414
+x123 = 0
+x124 = 0.5090665566
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413383
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716976
+x149 = 0
+x150 = 0.03629410141
+x151 = 38893.90349
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 1
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 1
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 1
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 1
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 1
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 1
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463423
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463423
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+Optimum value: -20.02139037
+Optimum location:
+x1 = 20.02139037
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0.003565062389
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 1
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 1
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0.005347593583
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 1
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 1
+x124 = 1
+x125 = 0.3368983957
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0.6631016043
+x162 = 0
+x163 = 0
+x164 = 0.6737967914
+x165 = 1
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 1
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 1
+x194 = 1
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.3368983957
+x210 = 1
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 0
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 0
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0
+x250 = 0
+x251 = 0
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 0.3368983957
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 1
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 1
+x304 = 0.3262032086
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0.3565062389
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0.6541889483
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 1
+x344 = 1
+x345 = 0.5026737968
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0.3368983957
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 1
+x403 = 1
+x404 = 1
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 0
+x430 = 0
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 0
+x455 = 0
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 1
+x464 = 0
+x465 = 0
+x466 = 1
+x467 = 0
+x468 = 0.5026737968
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0.6631016043
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 0
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 0
+x505 = 0
+x506 = 0
+x507 = 1
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0.7896613191
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0.6631016043
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 1
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 0
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 1
+x554 = 0.5026737968
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0.4973262032
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0.4973262032
+x584 = 1
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 0
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 0
+x595 = 0
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0.4973262032
+x603 = 0
+x604 = 0
+x605 = 0.3458110517
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 1
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 1
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0.5026737968
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 0
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 0
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0.5026737968
+x670 = 0
+x671 = 1
+x672 = 0
+x673 = 1
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 0
+x697 = 0
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 0
+x706 = 0
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0.6631016043
+x742 = 0.1408199643
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0.991087344
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 0
+x751 = 0
+x752 = 0
+x753 = 0.4973262032
+x754 = 0
+x755 = 0.2103386809
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 0
+x761 = 0
+x762 = 0
+x763 = 0
+x764 = 0
+x765 = 0
+x766 = 0
+x767 = 0
+x768 = 0
+x769 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+Optimum value: 981.8642857
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+Optimum value: 2430.87
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 0
+COL00051 = 0
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 0
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 0
+COL00062 = 0
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 0
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 0
+COL00073 = 0
+COL00074 = 0
+COL00075 = 0
+COL00076 = 0
+COL00077 = 0
+COL00078 = 0
+COL00079 = 0
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 0
+COL00084 = 0
+COL00085 = 0
+COL00086 = 0
+COL00087 = 0
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 0
+COL00092 = 0
+COL00093 = 0
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
+COL00097 = 0
+COL00098 = 0
+COL00099 = 0
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
+COL00103 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 60
+PBOSSFO1 = 73
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 70.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 0
+PLASYVR6 = 37
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 57
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 18
+PLAXTPE8 = 4.418604651
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 168
+PSEATPE0 = 15.81395349
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 49.60465116
+PSEATYO0 = 59.98837209
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 95.01162791
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 70.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 6
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 17
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 111
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065996
+N1011AC3 = 0.6951730236
+N1011AC4 = 0
+N1011AC5 = 3.897217244
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194147
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357964
+N1033AC2 = 0.5004769224
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 48
+PBOSSFO1 = 73
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 372
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 11.94690265
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 193
+PBOSYYZ1 = 0
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 543.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 0
+PLAXSEA8 = 66
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 842
+PLAXSFO2 = 0
+PLAXSFO3 = 168
+PLAXSFO4 = 168
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 36
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 574
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 168
+PSEASFO6 = 168
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 126
+PSEATYO3 = 27
+PSEAYVR0 = 104.2523364
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 0
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 545
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 99
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 2104.698113
+PYULYYZ4 = 0
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798016
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713663
+N1018AC2 = 6.749720385
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001305
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.79377625
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 4.108024927
+PBOSCLE1 = 137.8919751
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 34
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 268
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 470.294686
+PORDCLE1 = 148.705314
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 1162
+PLGABOS1 = 0
+PLGABOS2 = 458
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1123
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 409
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 0
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 1.5
+CORDBOS1 = 22.5
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 4.798925367
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 0
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 11.85714286
+N1008AC4 = 2
+N1010AC2 = 0
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 4.673469388
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 11.45918367
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+Optimum value: -73.3689691
+Optimum location:
+PBOSORD0 = 28
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 249
+PBOSLGA0 = 258.2518986
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810145
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 0
+PLGABOS3 = 686
+PLGABOS4 = 426.7481014
+PLGABOS5 = 918.2518986
+PLGAORD0 = 258.2518986
+PLGAORD1 = 0
+PLGAORD2 = 453.7481014
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 197
+PCLELGA1 = 70
+PCLELGA2 = 0
+PCLELGA3 = 142
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 19.2
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 10.4
+CLGAORD3 = 25.6
+CLGACLE0 = 12.8
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223455
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 2
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082668
+N1019AC4 = 0.9244444444
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 2
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 5.275510204
+N1012AC4 = 2
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572464
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 9.369917332
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.534748935
+x15 = 1
+x16 = 0
+x17 = 0.2426314982
+x18 = 0
+x19 = 0.6876932388
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849053
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.03253329909
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.8925534483
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190385
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.681178426
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158126
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.9733691137
+x150 = 0.5192990181
+x151 = 10482.79508
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 1
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 1
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 1
+x114 = 1
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 1
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 1
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 1
+x149 = 0
+x150 = 1
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785996
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611302
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673525
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.6859319
+x60 = 0
+x61 = 0
+x62 = 838.4627167
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049902
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68698
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355717
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089997
+x250 = 0
+x251 = 0.5115737543
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590274
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398225
+x262 = 0
+x263 = 0.06778383419
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.008229092659
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.0998539
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.0998539
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.0998539
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.0998539
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/expected_mpz_a b/demos/ppl_lpsol/expected_mpz_a
new file mode 100644
index 0000000..394fc13
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz_a
@@ -0,0 +1,4578 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n egout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n lseu.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n markshare2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n p0033.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+Optimum value: 225494.9632
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 3.079217438
+22 = 0.05896569207
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 0
+62 = 3.874801192
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+Optimum value: 149.5887662
+Optimum location:
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.8118235251
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112421
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968074
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496855
+BTO.3PBW = 0
+BAL.3RBW = 9.188176475
+BHC.3RBW = 20
+BLC.3RBW = 15.44903193
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378938
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088823
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741722
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646874
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695449
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.603337348
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.0954968974
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647951
+x85 = 0
+x86 = 0.1119635585
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130232
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811418
+x123 = 0
+x124 = 0.5090665575
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413368
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716954
+x149 = 0
+x150 = 0.03629410147
+x151 = 38893.90349
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 1
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 0
+COL00051 = 0
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 0
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 0
+COL00062 = 0
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 0
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 0
+COL00073 = 0
+COL00074 = 0
+COL00075 = 0
+COL00076 = 0
+COL00077 = 0
+COL00078 = 0
+COL00079 = 0
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 0
+COL00084 = 0
+COL00085 = 0
+COL00086 = 0
+COL00087 = 0
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 0
+COL00092 = 0
+COL00093 = 0
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
+COL00097 = 0
+COL00098 = 0
+COL00099 = 0
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
+COL00103 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 60
+PBOSSFO1 = 73
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 70.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 0
+PLASYVR6 = 37
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 57
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 18
+PLAXTPE8 = 4.418604651
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 168
+PSEATPE0 = 15.81395349
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 49.60465116
+PSEATYO0 = 59.98837209
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 95.01162791
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 70.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 6
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 17
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 111
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065996
+N1011AC3 = 0.6951730236
+N1011AC4 = 0
+N1011AC5 = 3.897217244
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194147
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357964
+N1033AC2 = 0.5004769224
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 48
+PBOSSFO1 = 73
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 372
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 11.94690265
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 193
+PBOSYYZ1 = 0
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 543.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 0
+PLAXSEA8 = 66
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 842
+PLAXSFO2 = 0
+PLAXSFO3 = 168
+PLAXSFO4 = 168
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 36
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 574
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 168
+PSEASFO6 = 168
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 126
+PSEATYO3 = 27
+PSEAYVR0 = 104.2523364
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 0
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 545
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 99
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 2104.698113
+PYULYYZ4 = 0
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798016
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713663
+N1018AC2 = 6.749720385
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001305
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.79377625
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 4.108024927
+PBOSCLE1 = 137.8919751
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 34
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 268
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 470.294686
+PORDCLE1 = 148.705314
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 1162
+PLGABOS1 = 0
+PLGABOS2 = 458
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1123
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 409
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 0
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 1.5
+CORDBOS1 = 22.5
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 4.798925367
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 0
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 11.85714286
+N1008AC4 = 2
+N1010AC2 = 0
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 4.673469388
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 11.45918367
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+Optimum value: -73.3689691
+Optimum location:
+PBOSORD0 = 28
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 249
+PBOSLGA0 = 258.2518986
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810145
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 0
+PLGABOS3 = 686
+PLGABOS4 = 426.7481014
+PLGABOS5 = 918.2518986
+PLGAORD0 = 258.2518986
+PLGAORD1 = 0
+PLGAORD2 = 453.7481014
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 197
+PCLELGA1 = 70
+PCLELGA2 = 0
+PCLELGA3 = 142
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 19.2
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 10.4
+CLGAORD3 = 25.6
+CLGACLE0 = 12.8
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223455
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 2
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082668
+N1019AC4 = 0.9244444444
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 2
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 5.275510204
+N1012AC4 = 2
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572464
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 9.369917332
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.5347489362
+x15 = 1
+x16 = 0
+x17 = 0.2426314989
+x18 = 0
+x19 = 0.6876932386
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849046
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.0325333004
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.892553448
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190333
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.6811784275
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158108
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.973369113
+x150 = 0.5192990175
+x151 = 10482.79508
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 1
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 1
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 1
+x114 = 1
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 1
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 1
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 1
+x149 = 0
+x150 = 1
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785996
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611302
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673525
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.6859319
+x60 = 0
+x61 = 0
+x62 = 838.4627167
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049902
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68698
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355717
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089997
+x250 = 0
+x251 = 0.5115737543
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590274
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398225
+x262 = 0
+x263 = 0.06778383419
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.008229092659
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.0998539
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.0998539
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.0998539
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.0998539
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/glpk_set_d_eps.c b/demos/ppl_lpsol/glpk_set_d_eps.c
new file mode 100644
index 0000000..397b48d
--- /dev/null
+++ b/demos/ppl_lpsol/glpk_set_d_eps.c
@@ -0,0 +1,263 @@
+/* Utilities extracted from GLPK's 4.44 (see below for copyright and
+ licensing information).
+
+ The code that comes from GLPK's 4.44 is delimited by "Begin GLPK code"
+ and "End GLPK code" marks. */
+
+#include <gmp.h>
+#include <assert.h>
+#include <math.h>
+#include <float.h>
+#include <stdlib.h>
+
+static int fp2rat(double x, double eps, double *p, double *q);
+
+#define static
+#define xassert assert
+
+/* Begin GLPK code */
+/* Extracted from GLPK's 4.44 glpapi07.c (exact simplex solver). */
+/***********************************************************************
+* This code is part of GLPK (GNU Linear Programming Kit).
+*
+* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+* 2009, 2010 Andrew Makhorin, Department for Applied Informatics,
+* Moscow Aviation Institute, Moscow, Russia. All rights reserved.
+* E-mail: <mao at gnu.org>.
+*
+* GLPK is free software: you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* GLPK is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+* License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with GLPK. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+static void set_d_eps(mpq_t x, double val)
+{ /* convert double val to rational x obtaining a more adequate
+ fraction than provided by mpq_set_d due to allowing a small
+ approximation error specified by a given relative tolerance;
+ for example, mpq_set_d would give the following
+ 1/3 ~= 0.333333333333333314829616256247391... ->
+ -> 6004799503160661/18014398509481984
+ while this routine gives exactly 1/3 */
+ int s, n, j;
+ double f, p, q, eps = 1e-9;
+ mpq_t temp;
+ xassert(-DBL_MAX <= val && val <= +DBL_MAX);
+#if 1 /* 30/VII-2008 */
+ if (val == floor(val))
+ { /* if val is integral, do not approximate */
+ mpq_set_d(x, val);
+ goto done;
+ }
+#endif
+ if (val > 0.0)
+ s = +1;
+ else if (val < 0.0)
+ s = -1;
+ else
+ { mpq_set_si(x, 0, 1);
+ goto done;
+ }
+ f = frexp(fabs(val), &n);
+ /* |val| = f * 2^n, where 0.5 <= f < 1.0 */
+ fp2rat(f, 0.1 * eps, &p, &q);
+ /* f ~= p / q, where p and q are integers */
+ mpq_init(temp);
+ mpq_set_d(x, p);
+ mpq_set_d(temp, q);
+ mpq_div(x, x, temp);
+ mpq_set_si(temp, 1, 1);
+ for (j = 1; j <= abs(n); j++)
+ mpq_add(temp, temp, temp);
+ if (n > 0)
+ mpq_mul(x, x, temp);
+ else if (n < 0)
+ mpq_div(x, x, temp);
+ mpq_clear(temp);
+ if (s < 0) mpq_neg(x, x);
+ /* check that the desired tolerance has been attained */
+ xassert(fabs(val - mpq_get_d(x)) <= eps * (1.0 + fabs(val)));
+done: return;
+}
+/* End GLPK code */
+
+#undef static
+#undef xassert
+
+void
+fatal(const char* format, ...);
+
+#define xassert assert
+#define xerror fatal
+static
+
+/* Begin GLPK code */
+/* Extracted from GLPK's 4.44 glplib03.c (miscellaneous library routines). */
+
+/***********************************************************************
+* This code is part of GLPK (GNU Linear Programming Kit).
+*
+* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+* 2009, 2010 Andrew Makhorin, Department for Applied Informatics,
+* Moscow Aviation Institute, Moscow, Russia. All rights reserved.
+* E-mail: <mao at gnu.org>.
+*
+* GLPK is free software: you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* GLPK is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+* License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with GLPK. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/***********************************************************************
+* NAME
+*
+* fp2rat - convert floating-point number to rational number
+*
+* SYNOPSIS
+*
+* #include "glplib.h"
+* int fp2rat(double x, double eps, double *p, double *q);
+*
+* DESCRIPTION
+*
+* Given a floating-point number 0 <= x < 1 the routine fp2rat finds
+* its "best" rational approximation p / q, where p >= 0 and q > 0 are
+* integer numbers, such that |x - p / q| <= eps.
+*
+* RETURNS
+*
+* The routine fp2rat returns the number of iterations used to achieve
+* the specified precision eps.
+*
+* EXAMPLES
+*
+* For x = sqrt(2) - 1 = 0.414213562373095 and eps = 1e-6 the routine
+* gives p = 408 and q = 985, where 408 / 985 = 0.414213197969543.
+*
+* BACKGROUND
+*
+* It is well known that every positive real number x can be expressed
+* as the following continued fraction:
+*
+* x = b[0] + a[1]
+* ------------------------
+* b[1] + a[2]
+* -----------------
+* b[2] + a[3]
+* ----------
+* b[3] + ...
+*
+* where:
+*
+* a[k] = 1, k = 0, 1, 2, ...
+*
+* b[k] = floor(x[k]), k = 0, 1, 2, ...
+*
+* x[0] = x,
+*
+* x[k] = 1 / frac(x[k-1]), k = 1, 2, 3, ...
+*
+* To find the "best" rational approximation of x the routine computes
+* partial fractions f[k] by dropping after k terms as follows:
+*
+* f[k] = A[k] / B[k],
+*
+* where:
+*
+* A[-1] = 1, A[0] = b[0], B[-1] = 0, B[0] = 1,
+*
+* A[k] = b[k] * A[k-1] + a[k] * A[k-2],
+*
+* B[k] = b[k] * B[k-1] + a[k] * B[k-2].
+*
+* Once the condition
+*
+* |x - f[k]| <= eps
+*
+* has been satisfied, the routine reports p = A[k] and q = B[k] as the
+* final answer.
+*
+* In the table below here is some statistics obtained for one million
+* random numbers uniformly distributed in the range [0, 1).
+*
+* eps max p mean p max q mean q max k mean k
+* -------------------------------------------------------------
+* 1e-1 8 1.6 9 3.2 3 1.4
+* 1e-2 98 6.2 99 12.4 5 2.4
+* 1e-3 997 20.7 998 41.5 8 3.4
+* 1e-4 9959 66.6 9960 133.5 10 4.4
+* 1e-5 97403 211.7 97404 424.2 13 5.3
+* 1e-6 479669 669.9 479670 1342.9 15 6.3
+* 1e-7 1579030 2127.3 3962146 4257.8 16 7.3
+* 1e-8 26188823 6749.4 26188824 13503.4 19 8.2
+*
+* REFERENCES
+*
+* W. B. Jones and W. J. Thron, "Continued Fractions: Analytic Theory
+* and Applications," Encyclopedia on Mathematics and Its Applications,
+* Addison-Wesley, 1980. */
+
+int fp2rat(double x, double eps, double *p, double *q)
+{ int k;
+ double xk, Akm1, Ak, Bkm1, Bk, ak, bk, fk, temp;
+ if (!(0.0 <= x && x < 1.0))
+ xerror("fp2rat: x = %g; number out of range\n", x);
+ for (k = 0; ; k++)
+ { xassert(k <= 100);
+ if (k == 0)
+ { /* x[0] = x */
+ xk = x;
+ /* A[-1] = 1 */
+ Akm1 = 1.0;
+ /* A[0] = b[0] = floor(x[0]) = 0 */
+ Ak = 0.0;
+ /* B[-1] = 0 */
+ Bkm1 = 0.0;
+ /* B[0] = 1 */
+ Bk = 1.0;
+ }
+ else
+ { /* x[k] = 1 / frac(x[k-1]) */
+ temp = xk - floor(xk);
+ xassert(temp != 0.0);
+ xk = 1.0 / temp;
+ /* a[k] = 1 */
+ ak = 1.0;
+ /* b[k] = floor(x[k]) */
+ bk = floor(xk);
+ /* A[k] = b[k] * A[k-1] + a[k] * A[k-2] */
+ temp = bk * Ak + ak * Akm1;
+ Akm1 = Ak, Ak = temp;
+ /* B[k] = b[k] * B[k-1] + a[k] * B[k-2] */
+ temp = bk * Bk + ak * Bkm1;
+ Bkm1 = Bk, Bk = temp;
+ }
+ /* f[k] = A[k] / B[k] */
+ fk = Ak / Bk;
+#if 0
+ print("%.*g / %.*g = %.*g", DBL_DIG, Ak, DBL_DIG, Bk, DBL_DIG,
+ fk);
+#endif
+ if (fabs(x - fk) <= eps) break;
+ }
+ *p = Ak;
+ *q = Bk;
+ return k;
+}
+/* End GLPK code */
diff --git a/demos/ppl_lpsol/ppl_lpsol.1 b/demos/ppl_lpsol/ppl_lpsol.1
new file mode 100644
index 0000000..039821d
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.1
@@ -0,0 +1,99 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11.
+.TH PPL_LPSOL "1" "October 2013" "ppl_lpsol 1.1" "User Commands"
+.SH NAME
+ppl_lpsol \- a PPL-based mixed integer programming problem solver
+.SH SYNOPSIS
+.B ppl_lpsol
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads a file in MPS format and attempts solution using the optimization
+algorithms provided by the PPL.
+.PP
+See the
+.IR "GNU Linear Programming Kit: Reference Manual (Version 4.31)"
+for information on the MPS format.
+.SH OPTIONS
+.TP
+\fB\-c\fR, \fB\-\-check\fR[=\fITHRESHOLD\fR] checks the obtained results using GLPK;
+optima are checked with a tolerance of
+THRESHOLD (default 1e\-09); input data
+are also perturbed the same way as GLPK does
+.TP
+\fB\-i\fR, \fB\-\-incremental\fR
+solves the problem incrementally
+.TP
+\fB\-m\fR, \fB\-\-min\fR
+minimizes the objective function
+.TP
+\fB\-M\fR, \fB\-\-max\fR
+maximizes the objective function (default)
+.TP
+\fB\-n\fR, \fB\-\-no\-optimization\fR
+checks for satisfiability only
+.TP
+\fB\-r\fR, \fB\-\-no\-mip\fR
+consider integer variables as real variables
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-e\fR, \fB\-\-enumerate\fR
+use the (expensive!) enumeration method
+.TP
+\fB\-pM\fR, \fB\-\-pricing\fR=\fIM\fR
+use pricing method M for simplex (assumes \fB\-s\fR);
+M is an int from 0 to 2, default 0:
+0 \fB\-\-\fR> steepest\-edge using floating point
+1 \fB\-\-\fR> steepest\-edge using exact arithmetic
+2 \fB\-\-\fR> textbook
+.TP
+\fB\-s\fR, \fB\-\-simplex\fR
+use the simplex method
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbosity\fR=\fILEVEL\fR
+sets verbosity level (from 0 to 4, default 3):
+0 \fB\-\-\fR> quiet: no output except for errors and
+.IP
+explicitly required notifications
+.IP
+1 \fB\-\-\fR> solver state only
+2 \fB\-\-\fR> state + optimal value
+3 \fB\-\-\fR> state + optimal value + optimum location
+4 \fB\-\-\fR> lots of output
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The options \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) and
+\fB\-t\fR (\fB\-\-timings\fR) are not available on some platforms.
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Andrew Makhorin.
+.IR "GNU Linear Programming Kit: Reference Manual (Version 4.31)".
diff --git a/demos/ppl_lpsol/ppl_lpsol.c b/demos/ppl_lpsol/ppl_lpsol.c
new file mode 100644
index 0000000..f9ad766
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.c
@@ -0,0 +1,1435 @@
+/* Solve linear programming problems by either vertex/point enumeration
+ or the primal simplex algorithm.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <ppl-config.h>
+#include "ppl_c.h"
+#include <gmp.h>
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include <time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+
+#if defined(PPL_HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(PPL_HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+#ifdef PPL_HAVE_GETOPT_H
+# include <getopt.h>
+
+/* Try to accommodate non-GNU implementations of `getopt()'. */
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif /* defined(PPL_HAVE_GETOPT_H) */
+
+#ifdef PPL_HAVE_UNISTD_H
+/* Include this for `getopt()': especially important if we do not have
+ <getopt.h>. */
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+/* This should be included after <time.h> and <sys/time.h> so as to make
+ sure we have the definitions for, e.g., `ru_utime'. */
+# include <sys/resource.h>
+#endif
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 10
+# error "PPL version 0.10 or following is required"
+#endif
+
+static const char* ppl_source_version = PPL_VERSION;
+
+#ifdef __GNUC__
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define ATTRIBUTE_UNUSED
+#endif
+
+#if PPL_HAVE_DECL_GETRUSAGE
+# define PPL_LPSOL_SUPPORTS_TIMINGS
+#endif
+
+#if defined(PPL_HAVE_SYS_RESOURCE_H) \
+ && PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+ && (defined(SA_ONESHOT) || defined(SA_RESETHAND))
+# define PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+#endif
+
+#ifdef PPL_HAVE_GETOPT_H
+static struct option long_options[] = {
+ {"check", optional_argument, 0, 'c'},
+ {"help", no_argument, 0, 'h'},
+ {"incremental", no_argument, 0, 'i'},
+ {"min", no_argument, 0, 'm'},
+ {"max", no_argument, 0, 'M'},
+ {"no-optimization", no_argument, 0, 'n'},
+ {"no-mip", no_argument, 0, 'r'},
+ {"max-cpu", required_argument, 0, 'C'},
+ {"max-memory", required_argument, 0, 'R'},
+ {"output", required_argument, 0, 'o'},
+ {"pricing", required_argument, 0, 'p'},
+ {"enumerate", no_argument, 0, 'e'},
+ {"simplex", no_argument, 0, 's'},
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+ {"timings", no_argument, 0, 't'},
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+ {"verbosity", required_argument, 0, 'v'},
+ {"version", no_argument, 0, 'V'},
+ {0, 0, 0, 0}
+};
+#endif
+
+#define USAGE_STRING0 \
+ "Usage: %s [OPTION]... [FILE]\n" \
+ "Reads a file in MPS format and attempts solution using the optimization\n" \
+ "algorithms provided by the PPL.\n\n" \
+ "Options:\n" \
+ " -c, --check[=THRESHOLD] checks the obtained results using GLPK;\n" \
+ " optima are checked with a tolerance of\n" \
+ " THRESHOLD (default %.10g); input data\n" \
+ " are also perturbed the same way as GLPK does\n" \
+ " -i, --incremental solves the problem incrementally\n"
+#define USAGE_STRING1 \
+ " -m, --min minimizes the objective function\n" \
+ " -M, --max maximizes the objective function (default)\n" \
+ " -n, --no-optimization checks for satisfiability only\n" \
+ " -r, --no-mip consider integer variables as real variables\n" \
+ " -CSECS, --max-cpu=SECS limits CPU usage to SECS seconds\n" \
+ " -RMB, --max-memory=MB limits memory usage to MB megabytes\n" \
+ " -h, --help prints this help text to stdout\n" \
+ " -oPATH, --output=PATH appends output to PATH\n"
+#define USAGE_STRING2 \
+ " -e, --enumerate use the (expensive!) enumeration method\n" \
+ " -pM, --pricing=M use pricing method M for simplex (assumes -s);\n" \
+ " M is an int from 0 to 2, default 0:\n" \
+ " 0 --> steepest-edge using floating point\n" \
+ " 1 --> steepest-edge using exact arithmetic\n" \
+ " 2 --> textbook\n" \
+ " -s, --simplex use the simplex method\n"
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+#define USAGE_STRING3 \
+ " -t, --timings prints timings to stderr\n"
+#else /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+#define USAGE_STRING3 \
+ ""
+#endif /* !defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+#define USAGE_STRING4 \
+ " -v, --verbosity=LEVEL sets verbosity level (from 0 to 4, default 3):\n" \
+ " 0 --> quiet: no output except for errors and\n" \
+ " explicitly required notifications\n" \
+ " 1 --> solver state only\n" \
+ " 2 --> state + optimal value\n" \
+ " 3 --> state + optimal value + optimum location\n" \
+ " 4 --> lots of output\n" \
+ " -V, --version prints version information to stdout\n"
+#ifndef PPL_HAVE_GETOPT_H
+#define USAGE_STRING5 \
+ "\n" \
+ "NOTE: this version does not support long options.\n"
+#else /* defined(PPL_HAVE_GETOPT_H) */
+#define USAGE_STRING5 \
+ ""
+#endif /* !defined(PPL_HAVE_GETOPT_H) */
+#define USAGE_STRING6 \
+ "\n" \
+ "Report bugs to <ppl-devel at cs.unipr.it>.\n"
+
+
+#define OPTION_LETTERS "bc::eimnMC:R:ho:p:rstVv:"
+
+static const char* program_name = 0;
+static unsigned long max_bytes_of_virtual_memory = 0;
+static const char* output_argument = 0;
+FILE* output_file = NULL;
+static int check_results = 0;
+static int use_simplex = 0;
+static int pricing_method = 0;
+static int verbosity = 3;
+static int maximize = 1;
+static int incremental = 0;
+static int no_optimization = 0;
+static int no_mip = 0;
+static int check_results_failed = 0;
+static double check_threshold = 0.0;
+static const double default_check_threshold = 0.000000001;
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+static unsigned long max_seconds_of_cpu_time = 0;
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+static int print_timings = 0;
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+static void
+my_exit(int status) {
+ (void) ppl_finalize();
+ exit(status);
+}
+
+void
+fatal(const char* format, ...) {
+ va_list ap;
+ fprintf(stderr, "%s: ", program_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ my_exit(1);
+}
+
+#if 0
+static void
+warning(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: warning: ", program_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+}
+#endif
+
+static void
+error(const char* format, ...) {
+ va_list ap;
+ fprintf(stderr, "%s: ", program_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ if (output_argument) {
+ va_start(ap, format);
+ vfprintf(output_file, format, ap);
+ va_end(ap);
+ fprintf(output_file, "\n");
+ }
+}
+
+static const char*
+get_ppl_version() {
+ const char* p;
+ (void) ppl_version(&p);
+ return p;
+}
+
+static const char*
+get_ppl_banner() {
+ const char* p;
+ (void) ppl_banner(&p);
+ return p;
+}
+
+static void
+process_options(int argc, char* argv[]) {
+#ifdef PPL_HAVE_GETOPT_H
+ int option_index;
+#endif
+ int enumerate_required = 0;
+ int simplex_required = 0;
+ int incremental_required = 0;
+ int no_optimization_required = 0;
+ int no_mip_required = 0;
+ int c;
+ char* endptr;
+ long l;
+ double d;
+
+ while (1) {
+#ifdef PPL_HAVE_GETOPT_H
+ option_index = 0;
+ c = getopt_long(argc, argv, OPTION_LETTERS, long_options, &option_index);
+#else
+ c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+ if (c == EOF)
+ break;
+
+ switch (c) {
+ case 0:
+ break;
+
+ case 'c':
+ check_results = 1;
+ if (optarg) {
+ d = strtod(optarg, &endptr);
+ if (*endptr || errno == ERANGE || d < 0.0)
+ fatal("only a non-negative floating point number can `-c'");
+ else
+ check_threshold = d;
+ }
+ else
+ check_threshold = default_check_threshold;
+ break;
+
+ case 'm':
+ maximize = 0;
+ break;
+
+ case 'M':
+ maximize = 1;
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, USAGE_STRING0, argv[0], default_check_threshold);
+ fputs(USAGE_STRING1, stdout);
+ fputs(USAGE_STRING2, stdout);
+ fputs(USAGE_STRING3, stdout);
+ fputs(USAGE_STRING4, stdout);
+ my_exit(0);
+ break;
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+ case 'C':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-C'");
+ else
+ max_seconds_of_cpu_time = l;
+ break;
+
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+ case 'R':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-R'");
+ else if (((unsigned long) l) > ULONG_MAX/(1024*1024))
+ max_bytes_of_virtual_memory = ULONG_MAX;
+ else
+ max_bytes_of_virtual_memory = l*1024*1024;
+ break;
+
+ case 'o':
+ output_argument = optarg;
+ break;
+
+ case 'p':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0 || l > 2)
+ fatal("0 or 1 or 2 must follow `-p'");
+ else
+ pricing_method = l;
+ break;
+
+ case 'e':
+ enumerate_required = 1;
+ break;
+
+ case 's':
+ simplex_required = 1;
+ break;
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ case 't':
+ print_timings = 1;
+ break;
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ case 'v':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0 || l > 4)
+ fatal("verbosity must be an integer between 0 and 4");
+ else
+ verbosity = l;
+ break;
+
+ case 'V':
+ fprintf(stdout, "%s\n", PPL_VERSION);
+ my_exit(0);
+ break;
+
+ case 'i':
+ incremental_required = 1;
+ break;
+
+ case 'n':
+ no_optimization_required = 1;
+ break;
+
+ case 'r':
+ no_mip_required = 1;
+ break;
+
+ default:
+ abort();
+ }
+ }
+
+ if (enumerate_required
+ && (simplex_required
+ || incremental_required))
+ fatal("-e option is incompatible with -i and -s");
+
+ if (enumerate_required)
+ use_simplex = 0;
+ else if (simplex_required)
+ use_simplex = 1;
+
+ if (incremental_required)
+ incremental = 1;
+
+ if (no_optimization_required)
+ no_optimization = 1;
+
+ if (no_mip_required)
+ no_mip = 1;
+
+ if (optind >= argc) {
+ if (verbosity >= 4)
+ fprintf(stderr,
+ "Parma Polyhedra Library version:\n%s\n\n"
+ "Parma Polyhedra Library banner:\n%s\n",
+ get_ppl_version(),
+ get_ppl_banner());
+ else
+ fatal("no input files");
+ }
+
+ if (argc - optind > 1)
+ /* We have multiple input files. */
+ fatal("only one input file is accepted");
+
+ if (output_argument) {
+ output_file = fopen(output_argument, "a");
+ if (output_file == NULL)
+ fatal("cannot open output file `%s'", output_argument);
+ }
+ else
+ output_file = stdout;
+}
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+/* To save the time when start_clock is called. */
+static struct timeval saved_ru_utime;
+
+static void
+start_clock() {
+ struct rusage rsg;
+ if (getrusage(RUSAGE_SELF, &rsg) != 0)
+ fatal("getrusage failed: %s", strerror(errno));
+ else
+ saved_ru_utime = rsg.ru_utime;
+}
+
+static void
+print_clock(FILE* f) {
+ struct rusage rsg;
+ if (getrusage(RUSAGE_SELF, &rsg) != 0)
+ fatal("getrusage failed: %s", strerror(errno));
+ else {
+ time_t current_secs = rsg.ru_utime.tv_sec;
+ time_t current_usecs = rsg.ru_utime.tv_usec;
+ time_t saved_secs = saved_ru_utime.tv_sec;
+ time_t saved_usecs = saved_ru_utime.tv_usec;
+ int secs;
+ int csecs;
+ if (current_usecs < saved_usecs) {
+ csecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+ secs = (current_secs - saved_secs) -1;
+ }
+ else {
+ csecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+ secs = current_secs - saved_secs;
+ }
+ assert(csecs >= 0 && csecs < 100 && secs >= 0);
+ fprintf(f, "%d.%.2d", secs, csecs);
+ }
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+void
+set_alarm_on_cpu_time(unsigned seconds, void (*handler)(int)) {
+ sigset_t mask;
+ struct sigaction s;
+ struct rlimit t;
+
+ sigemptyset(&mask);
+
+ s.sa_handler = handler;
+ s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+ s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+ s.sa_flags = SA_RESETHAND;
+#else
+# error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+ if (sigaction(SIGXCPU, &s, 0) != 0)
+ fatal("sigaction failed: %s", strerror(errno));
+
+ if (getrlimit(RLIMIT_CPU, &t) != 0)
+ fatal("getrlimit failed: %s", strerror(errno));
+
+ if (seconds < t.rlim_cur) {
+ t.rlim_cur = seconds;
+ if (setrlimit(RLIMIT_CPU, &t) != 0)
+ fatal("setrlimit failed: %s", strerror(errno));
+ }
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(unsigned long bytes) {
+ struct rlimit t;
+
+ if (getrlimit(RLIMIT_AS, &t) != 0)
+ fatal("getrlimit failed: %s", strerror(errno));
+
+ if (bytes < t.rlim_cur) {
+ t.rlim_cur = bytes;
+ if (setrlimit(RLIMIT_AS, &t) != 0)
+ fatal("setrlimit failed: %s", strerror(errno));
+ }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long bytes ATTRIBUTE_UNUSED) {
+}
+
+#endif /* !PPL_HAVE_DECL_RLIMIT_AS */
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+static void
+my_timeout(int dummy ATTRIBUTE_UNUSED) {
+ fprintf(stderr, "TIMEOUT\n");
+ if (output_argument)
+ fprintf(output_file, "TIMEOUT\n");
+ my_exit(0);
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+static mpz_t tmp_z;
+static mpq_t tmp1_q;
+static mpq_t tmp2_q;
+static ppl_Coefficient_t ppl_coeff;
+static glp_prob* glpk_lp;
+static int glpk_lp_num_int;
+static ppl_dimension_type* integer_variables;
+
+static void
+maybe_check_results(const int ppl_status, const double ppl_optimum_value) {
+ const char* ppl_status_string;
+ const char* glpk_status_string;
+ int glpk_status;
+ int treat_as_lp = 0;
+ glp_smcp glpk_smcp;
+
+ if (!check_results)
+ return;
+
+ if (no_mip || glpk_lp_num_int == 0)
+ treat_as_lp = 1;
+
+ glp_set_obj_dir(glpk_lp, (maximize ? GLP_MAX : GLP_MIN));
+
+ glp_init_smcp(&glpk_smcp);
+ /* Disable GLPK output. */
+ glpk_smcp.msg_lev = GLP_MSG_OFF;
+
+ if (treat_as_lp) {
+ /* Set the problem class to LP: MIP problems are thus treated as
+ LP ones. */
+ glp_exact(glpk_lp, &glpk_smcp);
+ glpk_status = glp_get_status(glpk_lp);
+ }
+ else {
+ /* MIP case. */
+ glp_simplex(glpk_lp, &glpk_smcp);
+ glpk_status = glp_get_status(glpk_lp);
+ if (glpk_status != GLP_NOFEAS && glpk_status != GLP_UNBND) {
+ glp_iocp glpk_iocp;
+ glp_init_iocp(&glpk_iocp);
+ /* Disable GLPK output. */
+ glpk_iocp.msg_lev = GLP_MSG_OFF;
+ glp_intopt(glpk_lp, &glpk_iocp);
+ glpk_status = glp_mip_status(glpk_lp);
+ }
+ }
+ /* If no_optimization is enabled, the second case is not possibile. */
+ if (!((ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE
+ && glpk_status == GLP_NOFEAS)
+ || (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED
+ && glpk_status == GLP_UNBND)
+ || (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED
+ && (glpk_status == GLP_OPT
+ /* If no_optimization is enabled, check if the problem is
+ unbounded for GLPK. */
+ || (no_optimization && (glpk_status == GLP_UNBND
+ || glpk_status == GLP_UNDEF)))))) {
+
+ if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)
+ ppl_status_string = "unfeasible";
+ else if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED)
+ ppl_status_string = "unbounded";
+ else if (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED)
+ ppl_status_string = "optimizable";
+ else
+ ppl_status_string = "<?>";
+
+ switch (glpk_status) {
+ case GLP_NOFEAS:
+ glpk_status_string = "unfeasible";
+ break;
+ case GLP_UNBND:
+ glpk_status_string = "unbounded";
+ break;
+ case GLP_OPT:
+ glpk_status_string = "optimizable";
+ break;
+ case GLP_UNDEF:
+ glpk_status_string = "undefined";
+ break;
+ default:
+ glpk_status_string = "<?>";
+ break;
+ }
+
+ error("check failed: for GLPK the problem is %s, not %s",
+ glpk_status_string, ppl_status_string);
+
+ check_results_failed = 1;
+ }
+ else if (!no_optimization
+ && ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+
+ double glpk_optimum_value
+ = (treat_as_lp ? glp_get_obj_val(glpk_lp) : glp_mip_obj_val(glpk_lp));
+
+ if (fabs(ppl_optimum_value - glpk_optimum_value) > check_threshold) {
+ error("check failed: for GLPK the problem's optimum is %.20g,"
+ " not %.20g", glpk_optimum_value, ppl_optimum_value);
+ check_results_failed = 1;
+ }
+ }
+ return;
+}
+
+
+static const char*
+variable_output_function(ppl_dimension_type var) {
+ const char* name = glp_get_col_name(glpk_lp, var+1);
+ if (name != NULL)
+ return name;
+ else
+ return 0;
+}
+
+static void
+add_constraints(ppl_Linear_Expression_t ppl_le,
+ int type, mpq_t rational_lb, mpq_t rational_ub, mpz_t den_lcm,
+ ppl_Constraint_System_t ppl_cs) {
+ ppl_Constraint_t ppl_c;
+ ppl_Linear_Expression_t ppl_le2;
+ switch (type) {
+ case GLP_FR:
+ break;
+
+ case GLP_LO:
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+ mpz_neg(tmp_z, tmp_z);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+ ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+ if (verbosity >= 4) {
+ ppl_io_fprint_Constraint(output_file, ppl_c);
+ fprintf(output_file, "\n");
+ }
+ ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+ ppl_delete_Constraint(ppl_c);
+ break;
+
+ case GLP_UP:
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+ mpz_neg(tmp_z, tmp_z);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+ ppl_new_Constraint(&ppl_c, ppl_le,
+ PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+ if (verbosity >= 4) {
+ ppl_io_fprint_Constraint(output_file, ppl_c);
+ fprintf(output_file, "\n");
+ }
+ ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+ ppl_delete_Constraint(ppl_c);
+ break;
+
+ case GLP_DB:
+ ppl_new_Linear_Expression_from_Linear_Expression(&ppl_le2, ppl_le);
+
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+ mpz_neg(tmp_z, tmp_z);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+ ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+ if (verbosity >= 4) {
+ ppl_io_fprint_Constraint(output_file, ppl_c);
+ fprintf(output_file, "\n");
+ }
+ ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+ ppl_delete_Constraint(ppl_c);
+
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+ mpz_neg(tmp_z, tmp_z);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_le2, ppl_coeff);
+ ppl_new_Constraint(&ppl_c, ppl_le2, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+ ppl_delete_Linear_Expression(ppl_le2);
+ if (verbosity >= 4) {
+ ppl_io_fprint_Constraint(output_file, ppl_c);
+ fprintf(output_file, "\n");
+ }
+ ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+ ppl_delete_Constraint(ppl_c);
+ break;
+
+ case GLP_FX:
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+ mpz_neg(tmp_z, tmp_z);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+ ppl_new_Constraint(&ppl_c, ppl_le,
+ PPL_CONSTRAINT_TYPE_EQUAL);
+ if (verbosity >= 4) {
+ ppl_io_fprint_Constraint(output_file, ppl_c);
+ fprintf(output_file, "\n");
+ }
+ ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+ ppl_delete_Constraint(ppl_c);
+ break;
+
+ default:
+ fatal("internal error");
+ break;
+ }
+}
+
+static int
+solve_with_generators(ppl_Constraint_System_t ppl_cs,
+ ppl_const_Linear_Expression_t ppl_objective_le,
+ ppl_Coefficient_t optimum_n,
+ ppl_Coefficient_t optimum_d,
+ ppl_Generator_t point) {
+ ppl_Polyhedron_t ppl_ph;
+ int optimum_found = 0;
+ int empty;
+ int unbounded;
+ int included;
+
+ /* Create the polyhedron (recycling the data structures of ppl_cs). */
+ ppl_new_C_Polyhedron_recycle_Constraint_System(&ppl_ph, ppl_cs);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to create a PPL polyhedron: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ empty = ppl_Polyhedron_is_empty(ppl_ph);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to check for emptiness: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ if (empty) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Unfeasible problem.\n");
+ maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNFEASIBLE, 0.0);
+ goto exit;
+ }
+
+ if (!empty && no_optimization) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Feasible problem.\n");
+ /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+ to let work `maybe_check_results'. */
+ maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
+ goto exit;
+ }
+
+ /* Check whether the problem is unbounded. */
+ unbounded = maximize
+ ? !ppl_Polyhedron_bounds_from_above(ppl_ph, ppl_objective_le)
+ : !ppl_Polyhedron_bounds_from_below(ppl_ph, ppl_objective_le);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to check for unboundedness: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ if (unbounded) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Unbounded problem.\n");
+ maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNBOUNDED, 0.0);
+ goto exit;
+ }
+
+ optimum_found = maximize
+ ? ppl_Polyhedron_maximize_with_point(ppl_ph, ppl_objective_le,
+ optimum_n, optimum_d, &included,
+ point)
+ : ppl_Polyhedron_minimize_with_point(ppl_ph, ppl_objective_le,
+ optimum_n, optimum_d, &included,
+ point);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to find the optimum: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ if (!optimum_found)
+ fatal("internal error");
+
+ if (!included)
+ fatal("internal error");
+
+ exit:
+ ppl_delete_Polyhedron(ppl_ph);
+ return optimum_found;
+}
+
+static int
+solve_with_simplex(ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t objective,
+ ppl_Coefficient_t optimum_n,
+ ppl_Coefficient_t optimum_d,
+ ppl_Generator_t point) {
+ ppl_MIP_Problem_t ppl_mip;
+ int optimum_found = 0;
+ int pricing = 0;
+ int status = 0;
+ int satisfiable = 0;
+ ppl_dimension_type space_dim;
+ ppl_const_Constraint_t c;
+ ppl_const_Generator_t g;
+ ppl_Constraint_System_const_iterator_t i;
+ ppl_Constraint_System_const_iterator_t iend;
+ int counter;
+ int mode = maximize
+ ? PPL_OPTIMIZATION_MODE_MAXIMIZATION
+ : PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+ ppl_Constraint_System_space_dimension(cs, &space_dim);
+ ppl_new_MIP_Problem_from_space_dimension(&ppl_mip, space_dim);
+ switch (pricing_method) {
+ case 0:
+ pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+ break;
+ case 1:
+ pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+ break;
+ case 2:
+ pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+ break;
+ default:
+ fatal("ppl_lpsol internal error");
+ }
+ ppl_MIP_Problem_set_control_parameter(ppl_mip, pricing);
+ ppl_MIP_Problem_set_objective_function(ppl_mip, objective);
+ ppl_MIP_Problem_set_optimization_mode(ppl_mip, mode);
+ if (!no_mip)
+ ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_mip, integer_variables,
+ glpk_lp_num_int);
+ if (incremental) {
+ /* Add the constraints of `cs' one at a time. */
+ ppl_new_Constraint_System_const_iterator(&i);
+ ppl_new_Constraint_System_const_iterator(&iend);
+ ppl_Constraint_System_begin(cs, i);
+ ppl_Constraint_System_end(cs, iend);
+
+ counter = 0;
+ while (!ppl_Constraint_System_const_iterator_equal_test(i, iend)) {
+ ++counter;
+ if (verbosity >= 4)
+ fprintf(output_file, "\nSolving constraint %d\n", counter);
+ ppl_Constraint_System_const_iterator_dereference(i, &c);
+ ppl_MIP_Problem_add_constraint(ppl_mip, c);
+
+ if (no_optimization) {
+ satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+ if (!satisfiable)
+ break;
+ }
+ else
+ status = ppl_MIP_Problem_solve(ppl_mip);
+ ppl_Constraint_System_const_iterator_increment(i);
+ }
+ ppl_delete_Constraint_System_const_iterator(i);
+ ppl_delete_Constraint_System_const_iterator(iend);
+ }
+
+ else {
+ ppl_MIP_Problem_add_constraints(ppl_mip, cs);
+ if (no_optimization)
+ satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+ else
+ status = ppl_MIP_Problem_solve(ppl_mip);
+ }
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to solve the problem: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ if ((no_optimization && !satisfiable)
+ || (!no_optimization && status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Unfeasible problem.\n");
+ maybe_check_results(status, 0.0);
+ goto exit;
+ }
+ else if (no_optimization && satisfiable) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Feasible problem.\n");
+ /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+ to let work `maybe_check_results'. */
+ maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
+ goto exit;
+ }
+ else if (status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED) {
+ if (verbosity >= 1)
+ fprintf(output_file, "Unbounded problem.\n");
+ maybe_check_results(status, 0.0);
+ goto exit;
+ }
+ else if (status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+ ppl_MIP_Problem_optimal_value(ppl_mip, optimum_n, optimum_d);
+ ppl_MIP_Problem_optimizing_point(ppl_mip, &g);
+ ppl_assign_Generator_from_Generator(point, g);
+ optimum_found = 1;
+ goto exit;
+ }
+ else
+ fatal("internal error");
+
+ exit:
+ ppl_delete_MIP_Problem(ppl_mip);
+ return optimum_found;
+}
+
+extern void set_d_eps(mpq_t x, double val);
+
+static void
+set_mpq_t_from_double(mpq_t q, double d) {
+ if (check_results)
+ set_d_eps(q, d);
+ else
+ mpq_set_d(q, d);
+}
+
+static void
+solve(char* file_name) {
+ ppl_Constraint_System_t ppl_cs;
+#ifndef NDEBUG
+ ppl_Constraint_System_t ppl_cs_copy;
+#endif
+ ppl_Generator_t optimum_location;
+ ppl_Linear_Expression_t ppl_le;
+ int dimension, row, num_rows, column, nz, i, j, type;
+ int* coefficient_index;
+ double lb, ub;
+ double* coefficient_value;
+ mpq_t rational_lb, rational_ub;
+ mpq_t* rational_coefficient;
+ mpq_t* objective;
+ ppl_Linear_Expression_t ppl_objective_le;
+ ppl_Coefficient_t optimum_n;
+ ppl_Coefficient_t optimum_d;
+ mpq_t optimum;
+ mpz_t den_lcm;
+ int optimum_found;
+ glp_mpscp glpk_mpscp;
+
+ glpk_lp = glp_create_prob();
+ glp_init_mpscp(&glpk_mpscp);
+
+ if (verbosity == 0) {
+ /* FIXME: find a way to suppress output from glp_read_mps. */
+ }
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings)
+ start_clock();
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ if (glp_read_mps(glpk_lp, GLP_MPS_FILE, &glpk_mpscp, file_name) != 0)
+ fatal("cannot read MPS file `%s'", file_name);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+ if (print_timings) {
+ fprintf(stderr, "Time to read the input file: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+ glpk_lp_num_int = glp_get_num_int(glpk_lp);
+
+ if (glpk_lp_num_int > 0 && !no_mip && !use_simplex)
+ fatal("the enumeration solving method can not handle MIP problems");
+
+ dimension = glp_get_num_cols(glpk_lp);
+
+ /* Read variables constrained to be integer. */
+ if (glpk_lp_num_int > 0 && !no_mip && use_simplex) {
+ if (verbosity >= 4)
+ fprintf(output_file, "Integer variables:\n");
+ integer_variables = (ppl_dimension_type*)
+ malloc((glpk_lp_num_int + 1)*sizeof(ppl_dimension_type));
+ for (i = 0, j = 0; i < dimension; ++i) {
+ int col_kind = glp_get_col_kind(glpk_lp, i+1);
+ if (col_kind == GLP_IV || col_kind == GLP_BV) {
+ integer_variables[j] = i;
+ if (verbosity >= 4) {
+ ppl_io_fprint_variable(output_file, i);
+ fprintf(output_file, " ");
+ }
+ ++j;
+ }
+ }
+ }
+ coefficient_index = (int*) malloc((dimension+1)*sizeof(int));
+ coefficient_value = (double*) malloc((dimension+1)*sizeof(double));
+ rational_coefficient = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+
+ ppl_new_Constraint_System(&ppl_cs);
+
+ mpq_init(rational_lb);
+ mpq_init(rational_ub);
+ for (i = 1; i <= dimension; ++i)
+ mpq_init(rational_coefficient[i]);
+
+ mpz_init(den_lcm);
+
+ if (verbosity >= 4)
+ fprintf(output_file, "\nConstraints:\n");
+
+ /* Set up the row (ordinary) constraints. */
+ num_rows = glp_get_num_rows(glpk_lp);
+ for (row = 1; row <= num_rows; ++row) {
+ /* Initialize the least common multiple computation. */
+ mpz_set_si(den_lcm, 1);
+ /* Set `nz' to the number of non-zero coefficients. */
+ nz = glp_get_mat_row(glpk_lp, row, coefficient_index, coefficient_value);
+ for (i = 1; i <= nz; ++i) {
+ set_mpq_t_from_double(rational_coefficient[i], coefficient_value[i]);
+ /* Update den_lcm. */
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i]));
+ }
+
+ lb = glp_get_row_lb(glpk_lp, row);
+ ub = glp_get_row_ub(glpk_lp, row);
+
+ set_mpq_t_from_double(rational_lb, lb);
+ set_mpq_t_from_double(rational_ub, ub);
+
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+ ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+
+ for (i = 1; i <= nz; ++i) {
+ mpz_mul(tmp_z, den_lcm, mpq_numref(rational_coefficient[i]));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_coefficient[i]));
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_coefficient(ppl_le, coefficient_index[i]-1,
+ ppl_coeff);
+ }
+
+ type = glp_get_row_type(glpk_lp, row);
+ add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+ ppl_delete_Linear_Expression(ppl_le);
+ }
+
+ free(coefficient_value);
+ for (i = 1; i <= dimension; ++i)
+ mpq_clear(rational_coefficient[i]);
+ free(rational_coefficient);
+ free(coefficient_index);
+
+#ifndef NDEBUG
+ ppl_new_Constraint_System_from_Constraint_System(&ppl_cs_copy, ppl_cs);
+#endif
+
+ /*
+ FIXME: here we could build the polyhedron and minimize it before
+ adding the variable bounds.
+ */
+
+ /* Set up the columns constraints, i.e., variable bounds. */
+ for (column = 1; column <= dimension; ++column) {
+
+ lb = glp_get_col_lb(glpk_lp, column);
+ ub = glp_get_col_ub(glpk_lp, column);
+
+ set_mpq_t_from_double(rational_lb, lb);
+ set_mpq_t_from_double(rational_ub, ub);
+
+ /* Initialize the least common multiple computation. */
+ mpz_set_si(den_lcm, 1);
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+ ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, den_lcm);
+ ppl_Linear_Expression_add_to_coefficient(ppl_le, column-1, ppl_coeff);
+
+ type = glp_get_col_type(glpk_lp, column);
+ add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+ ppl_delete_Linear_Expression(ppl_le);
+ }
+
+ mpq_clear(rational_ub);
+ mpq_clear(rational_lb);
+
+ /* Deal with the objective function. */
+ objective = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+ /* Initialize the least common multiple computation. */
+ mpz_set_si(den_lcm, 1);
+
+ mpq_init(objective[0]);
+ set_mpq_t_from_double(objective[0], glp_get_obj_coef(glpk_lp, 0));
+ for (i = 1; i <= dimension; ++i) {
+ mpq_init(objective[i]);
+ set_mpq_t_from_double(objective[i], glp_get_obj_coef(glpk_lp, i));
+ /* Update den_lcm. */
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(objective[i]));
+ }
+
+ /* Set the ppl_objective_le to be the objective function. */
+ ppl_new_Linear_Expression_with_dimension(&ppl_objective_le, dimension);
+ /* Set value for objective function's inhomogeneous term. */
+ mpz_mul(tmp_z, den_lcm, mpq_numref(objective[0]));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[0]));
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_inhomogeneous(ppl_objective_le, ppl_coeff);
+ /* Set values for objective function's variable coefficients. */
+ for (i = 1; i <= dimension; ++i) {
+ mpz_mul(tmp_z, den_lcm, mpq_numref(objective[i]));
+ mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[i]));
+ ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+ ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff);
+ }
+
+ if (verbosity >= 4) {
+ fprintf(output_file, "Objective function:\n");
+ if (mpz_cmp_si(den_lcm, 1) != 0)
+ fprintf(output_file, "(");
+ ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le);
+ }
+
+ for (i = 0; i <= dimension; ++i)
+ mpq_clear(objective[i]);
+ free(objective);
+
+ if (verbosity >= 4) {
+ if (mpz_cmp_si(den_lcm, 1) != 0) {
+ fprintf(output_file, ")/");
+ mpz_out_str(output_file, 10, den_lcm);
+ }
+ fprintf(output_file, "\n%s\n",
+ (maximize ? "Maximizing." : "Minimizing."));
+ }
+
+ ppl_new_Coefficient(&optimum_n);
+ ppl_new_Coefficient(&optimum_d);
+ ppl_new_Generator_zero_dim_point(&optimum_location);
+
+ optimum_found = use_simplex
+ ? solve_with_simplex(ppl_cs,
+ ppl_objective_le,
+ optimum_n,
+ optimum_d,
+ optimum_location)
+ : solve_with_generators(ppl_cs,
+ ppl_objective_le,
+ optimum_n,
+ optimum_d,
+ optimum_location);
+
+ ppl_delete_Linear_Expression(ppl_objective_le);
+
+ if (glpk_lp_num_int > 0)
+ free(integer_variables);
+
+ if (optimum_found) {
+ mpq_init(optimum);
+ ppl_Coefficient_to_mpz_t(optimum_n, tmp_z);
+ mpq_set_num(optimum, tmp_z);
+ ppl_Coefficient_to_mpz_t(optimum_d, tmp_z);
+ mpz_mul(tmp_z, tmp_z, den_lcm);
+ mpq_set_den(optimum, tmp_z);
+ if (verbosity == 1)
+ fprintf(output_file, "Optimized problem.\n");
+ if (verbosity >= 2)
+ fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
+ if (verbosity >= 3) {
+ fprintf(output_file, "Optimum location:\n");
+ ppl_Generator_divisor(optimum_location, ppl_coeff);
+ ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z);
+ for (i = 0; i < dimension; ++i) {
+ mpz_set(mpq_denref(tmp1_q), tmp_z);
+ ppl_Generator_coefficient(optimum_location, i, ppl_coeff);
+ ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q));
+ ppl_io_fprint_variable(output_file, i);
+ fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q));
+ }
+ }
+#ifndef NDEBUG
+ {
+ ppl_Polyhedron_t ph;
+ unsigned int relation;
+ ppl_new_C_Polyhedron_recycle_Constraint_System(&ph, ppl_cs_copy);
+ ppl_delete_Constraint_System(ppl_cs_copy);
+ relation = ppl_Polyhedron_relation_with_Generator(ph, optimum_location);
+ ppl_delete_Polyhedron(ph);
+ assert(relation == PPL_POLY_GEN_RELATION_SUBSUMES);
+ }
+#endif
+ maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+ mpq_get_d(optimum));
+ mpq_clear(optimum);
+ }
+
+ ppl_delete_Constraint_System(ppl_cs);
+ ppl_delete_Coefficient(optimum_d);
+ ppl_delete_Coefficient(optimum_n);
+ ppl_delete_Generator(optimum_location);
+
+ glp_delete_prob(glpk_lp);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+ const char* description) {
+ if (output_argument)
+ fprintf(output_file, "PPL error code %d: %s\n", code, description);
+ fatal("PPL error code %d: %s", code, description);
+}
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#if defined(NDEBUG)
+
+#if !(defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF))
+
+#if defined(PPL_GLPK_HAS_GLP_TERM_HOOK) \
+ || defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+
+static int
+glpk_message_interceptor(void* info, const char* msg) {
+ (void) info;
+ (void) msg;
+ return 1;
+}
+
+#elif defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK)
+
+static int
+glpk_message_interceptor(void* info, char* msg) {
+ (void) info;
+ (void) msg;
+ return 1;
+}
+
+#endif /* !(defined(PPL_GLPK_HAS_GLP_TERM_HOOK)
+ || defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK))
+ && defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK) */
+
+#endif /* !(defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF)) */
+
+#endif /* defined(NDEBUG) */
+
+int
+main(int argc, char* argv[]) {
+#if defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+ extern void _glp_lib_print_hook(int (*func)(void *info, const char *buf),
+ void *info);
+#endif
+ program_name = argv[0];
+ if (ppl_initialize() < 0)
+ fatal("cannot initialize the Parma Polyhedra Library");
+
+ /* The PPL solver does not use floating point numbers, except
+ perhaps for the steepest edge heuristics. In contrast, GLPK does
+ use them, so it is best to restore the rounding mode as it was
+ prior to the PPL initialization. */
+ if (ppl_restore_pre_PPL_rounding() < 0)
+ fatal("cannot restore the rounding mode");
+
+ if (ppl_set_error_handler(error_handler) < 0)
+ fatal("cannot install the custom error handler");
+
+ if (strcmp(ppl_source_version, get_ppl_version()) != 0)
+ fatal("was compiled with PPL version %s, but linked with version %s",
+ ppl_source_version, get_ppl_version());
+
+ if (ppl_io_set_variable_output_function(variable_output_function) < 0)
+ fatal("cannot install the custom variable output function");
+
+#if defined(NDEBUG)
+#if defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF)
+ glp_term_out(GLP_OFF);
+#elif defined(PPL_GLPK_HAS_GLP_TERM_HOOK)
+ glp_term_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+ _glp_lib_print_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK)
+ lib_set_print_hook(0, glpk_message_interceptor);
+#endif
+#endif
+
+ /* Process command line options. */
+ process_options(argc, argv);
+
+ /* Initialize globals. */
+ mpz_init(tmp_z);
+ mpq_init(tmp1_q);
+ mpq_init(tmp2_q);
+ ppl_new_Coefficient(&ppl_coeff);
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+ if (max_seconds_of_cpu_time > 0)
+ set_alarm_on_cpu_time(max_seconds_of_cpu_time, my_timeout);
+
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+ if (max_bytes_of_virtual_memory > 0)
+ limit_virtual_memory(max_bytes_of_virtual_memory);
+
+ while (optind < argc) {
+ if (check_results)
+ check_results_failed = 0;
+
+ solve(argv[optind++]);
+
+ if (check_results && check_results_failed)
+ break;
+ }
+
+ /* Finalize globals. */
+ ppl_delete_Coefficient(ppl_coeff);
+ mpq_clear(tmp2_q);
+ mpq_clear(tmp1_q);
+ mpz_clear(tmp_z);
+
+ /* Close output file, if any. */
+ if (output_argument)
+ fclose(output_file);
+
+ my_exit((check_results && check_results_failed) ? 1 : 0);
+
+ /* This is just to avoid a compiler warning. */
+ return 0;
+}
diff --git a/demos/ppl_pips/Makefile.am b/demos/ppl_pips/Makefile.am
new file mode 100644
index 0000000..81d0b5b
--- /dev/null
+++ b/demos/ppl_pips/Makefile.am
@@ -0,0 +1,127 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_pips
+ppl_pips_SOURCES = ppl_pips.cc
+ppl_pips_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_pips.1
+
+piplib_pips.o: $(srcdir)/ppl_pips.cc $(top_builddir)/utils/libppl_utils.a
+ $(CXXCOMPILE) -c -o $@ -DUSE_PIPLIB $(srcdir)/ppl_pips.cc
+
+piplib_pips: piplib_pips.o
+ $(CXXLINK) piplib_pips.o\
+ -lpip -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if HAVE_MD5SUM
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED =
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES = \
+$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+check-local: ppl_pips$(EXEEXT)
+ echo $(TOUGH_EXAMPLES) >tough_examples
+ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ export LC_ALL=C; \
+ for path in $(srcdir)/examples/*.dat; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ echo ppl_pips$(EXEEXT) -p $$path; \
+ $(CHECKER) ./ppl_pips$(EXEEXT) -p $$path \
+ | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ done
+ for path in $(srcdir)/examples/*.pip; \
+ do \
+ file=`basename $$path`; \
+ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ echo ppl_pips$(EXEEXT) -P $$path; \
+ $(CHECKER) ./ppl_pips$(EXEEXT) -P $$path \
+ | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ done
+ diff obtained $(srcdir)/$(EXPECTED)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/demos/ppl_pips/Makefile.in b/demos/ppl_pips/Makefile.in
new file mode 100644
index 0000000..bda0117
--- /dev/null
+++ b/demos/ppl_pips/Makefile.in
@@ -0,0 +1,1012 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_pips$(EXEEXT)
+subdir = demos/ppl_pips
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_pips_OBJECTS = ppl_pips.$(OBJEXT)
+ppl_pips_OBJECTS = $(am_ppl_pips_OBJECTS)
+ppl_pips_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ $(top_builddir)/utils/libppl_utils.a
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ppl_pips_SOURCES)
+DIST_SOURCES = $(ppl_pips_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+ppl_pips_SOURCES = ppl_pips.cc
+ppl_pips_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_pips.1
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED =
+ at ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \
+ at HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+ at HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \
+ at HAVE_MD5SUM_TRUE@tough_examples \
+ at HAVE_MD5SUM_TRUE@obtained
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_pips/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_pips/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ppl_pips$(EXEEXT): $(ppl_pips_OBJECTS) $(ppl_pips_DEPENDENCIES) $(EXTRA_ppl_pips_DEPENDENCIES)
+ @rm -f ppl_pips$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ppl_pips_OBJECTS) $(ppl_pips_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pips.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(dist_man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ at HAVE_MD5SUM_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am check-local clean clean-binPROGRAMS clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-man1 install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+
+piplib_pips.o: $(srcdir)/ppl_pips.cc $(top_builddir)/utils/libppl_utils.a
+ $(CXXCOMPILE) -c -o $@ -DUSE_PIPLIB $(srcdir)/ppl_pips.cc
+
+piplib_pips: piplib_pips.o
+ $(CXXLINK) piplib_pips.o\
+ -lpip -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_pips$(EXEEXT)
+ at HAVE_MD5SUM_TRUE@ echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@ export LC_ALL=C; \
+ at HAVE_MD5SUM_TRUE@ for path in $(srcdir)/examples/*.dat; \
+ at HAVE_MD5SUM_TRUE@ do \
+ at HAVE_MD5SUM_TRUE@ file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@ echo ppl_pips$(EXEEXT) -p $$path; \
+ at HAVE_MD5SUM_TRUE@ $(CHECKER) ./ppl_pips$(EXEEXT) -p $$path \
+ at HAVE_MD5SUM_TRUE@ | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@ done
+ at HAVE_MD5SUM_TRUE@ for path in $(srcdir)/examples/*.pip; \
+ at HAVE_MD5SUM_TRUE@ do \
+ at HAVE_MD5SUM_TRUE@ file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@ echo ppl_pips$(EXEEXT) -P $$path; \
+ at HAVE_MD5SUM_TRUE@ $(CHECKER) ./ppl_pips$(EXEEXT) -P $$path \
+ at HAVE_MD5SUM_TRUE@ | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@ done
+ at HAVE_MD5SUM_TRUE@ diff obtained $(srcdir)/$(EXPECTED)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_pips/examples/Makefile.am b/demos/ppl_pips/examples/Makefile.am
new file mode 100644
index 0000000..ed5525d
--- /dev/null
+++ b/demos/ppl_pips/examples/Makefile.am
@@ -0,0 +1,48 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+DAT_FILES = \
+invert.dat \
+linear.dat \
+lineri.dat \
+loz.dat \
+max.dat \
+maxb.dat \
+pairi.dat \
+petit.dat \
+rairoi.dat \
+test02.dat \
+test12i.dat
+
+PIP_FILES = \
+big.pip \
+brisebarre.pip \
+cg1.pip \
+esced.pip \
+ex2.pip \
+fimmel.pip \
+max.pip \
+sor1d.pip \
+square.pip
+
+dist_noinst_DATA = $(DAT_FILES) $(PIP_FILES)
diff --git a/demos/ppl_pips/examples/Makefile.in b/demos/ppl_pips/examples/Makefile.in
new file mode 100644
index 0000000..d5667af
--- /dev/null
+++ b/demos/ppl_pips/examples/Makefile.in
@@ -0,0 +1,571 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_pips/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+DAT_FILES = \
+invert.dat \
+linear.dat \
+lineri.dat \
+loz.dat \
+max.dat \
+maxb.dat \
+pairi.dat \
+petit.dat \
+rairoi.dat \
+test02.dat \
+test12i.dat
+
+PIP_FILES = \
+big.pip \
+brisebarre.pip \
+cg1.pip \
+esced.pip \
+ex2.pip \
+fimmel.pip \
+max.pip \
+sor1d.pip \
+square.pip
+
+dist_noinst_DATA = $(DAT_FILES) $(PIP_FILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_pips/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign demos/ppl_pips/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_pips/examples/README b/demos/ppl_pips/examples/README
new file mode 100644
index 0000000..6b46816
--- /dev/null
+++ b/demos/ppl_pips/examples/README
@@ -0,0 +1,8 @@
+The examples in this directory have been taken from PipLib 1.4.0 [1],
+which is released under the GNU Lesser General Public License, version 2.1
+or later [2].
+
+--------
+
+[1] http://www.piplib.org/
+[2] http://www.gnu.org/licenses/lgpl-2.1.html
diff --git a/demos/ppl_pips/examples/big.pip b/demos/ppl_pips/examples/big.pip
new file mode 100644
index 0000000..c93c08f
--- /dev/null
+++ b/demos/ppl_pips/examples/big.pip
@@ -0,0 +1,9 @@
+0 3
+
+1
+
+4 5
+1 -1 0 1 0
+1 0 -1 1 0
+1 -1 3 -2 12
+1 2 -1 -1 3
diff --git a/demos/ppl_pips/examples/brisebarre.pip b/demos/ppl_pips/examples/brisebarre.pip
new file mode 100644
index 0000000..f5a8397
--- /dev/null
+++ b/demos/ppl_pips/examples/brisebarre.pip
@@ -0,0 +1,33 @@
+# ---------------------- CONTEXT ----------------------
+0 2
+
+-1
+
+# ----------------------- DOMAIN ----------------------
+26 6
+1 3 0 0 0 -98300
+1 -3 0 0 0 98308
+1 432 36 6 1 -14757611
+1 -432 -36 -6 -1 14758510
+1 54 9 3 1 -1923190
+1 -54 -9 -3 -1 1923303
+1 48 12 6 3 -1782238
+1 -48 -12 -6 -3 1782339
+1 27 9 6 4 -1045164
+1 -27 -9 -6 -4 1045221
+1 432 180 150 125 -17434139
+1 -432 -180 -150 -125 17435038
+1 6 3 3 3 -252443
+1 -6 -3 -3 -3 252456
+1 432 252 294 343 -18949275
+1 -432 -252 -294 -343 18950174
+1 27 18 24 32 -1234720
+1 -27 -18 -24 -32 1234777
+1 48 36 54 81 -2288453
+1 -48 -36 -54 -81 2288554
+1 54 45 75 125 -2684050
+1 -54 -45 -75 -125 2684163
+1 432 396 726 1331 -22386005
+1 -432 -396 -726 -1331 22386904
+1 3 3 6 12 -162072
+1 -3 -3 -6 -12 162080
diff --git a/demos/ppl_pips/examples/cg1.pip b/demos/ppl_pips/examples/cg1.pip
new file mode 100644
index 0000000..78e31f1
--- /dev/null
+++ b/demos/ppl_pips/examples/cg1.pip
@@ -0,0 +1,15 @@
+2 4
+ 1 1 0 -1
+ 1 -1 1 0
+
+-1
+
+8 7
+ 1 0 1 0 -1 0 0
+ 1 0 -1 0 1 0 0
+ 1 1 0 0 0 -1 0
+ 1 -1 0 0 0 1 0
+ 1 0 1 0 0 0 -1
+ 1 0 -1 0 0 1 0
+ 1 0 -1 1 0 0 -1
+ 1 0 0 -1 0 1 0
diff --git a/demos/ppl_pips/examples/esced.pip b/demos/ppl_pips/examples/esced.pip
new file mode 100644
index 0000000..891c281
--- /dev/null
+++ b/demos/ppl_pips/examples/esced.pip
@@ -0,0 +1,21 @@
+0 2
+
+-1
+
+16 18
+1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0
+0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0
+0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0
+0 0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0
+0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
+0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0
+1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
+1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
diff --git a/demos/ppl_pips/examples/ex2.pip b/demos/ppl_pips/examples/ex2.pip
new file mode 100644
index 0000000..bb59848
--- /dev/null
+++ b/demos/ppl_pips/examples/ex2.pip
@@ -0,0 +1,9 @@
+1 5
+1 -1 1 1 0
+
+-1
+
+3 7
+1 0 -1 0 1 0 0
+1 -1 0 0 0 1 0
+1 1 1 -1 0 0 0
diff --git a/demos/ppl_pips/examples/fimmel.pip b/demos/ppl_pips/examples/fimmel.pip
new file mode 100644
index 0000000..a6dee41
--- /dev/null
+++ b/demos/ppl_pips/examples/fimmel.pip
@@ -0,0 +1,12 @@
+0 4
+
+-1
+
+7 6
+1 2 6 0 0 -9
+1 5 -3 0 0 0
+1 2 -10 0 0 15
+1 -2 6 0 0 -3
+1 -2 -6 0 0 17
+1 0 1 -1 0 0
+1 1 0 0 -1 0
diff --git a/demos/ppl_pips/examples/invert.dat b/demos/ppl_pips/examples/invert.dat
new file mode 100644
index 0000000..8f472fc
--- /dev/null
+++ b/demos/ppl_pips/examples/invert.dat
@@ -0,0 +1,10 @@
+( (Lower bound on j after loop inversion
+ (unknowns j i)
+ (parameters k m n))
+ 2 3 3 1 -1 1
+ ( #[0 -1 0 0 1 0]
+ #[-1 0 0 0 0 1]
+ #[1 1 0 -1 0 0]
+ )
+ ( #[-1 1 1 0])
+)
diff --git a/demos/ppl_pips/examples/linear.dat b/demos/ppl_pips/examples/linear.dat
new file mode 100644
index 0000000..65d5a51
--- /dev/null
+++ b/demos/ppl_pips/examples/linear.dat
@@ -0,0 +1,10 @@
+((linearisation d'un tableau 100 100)
+ 2 1 4 1 -1 1
+ (#[100 1 0 -1]
+ #[-100 -1 0 1]
+ #[-1 0 99 0]
+ #[0 -1 99 0]
+ )
+ (#[-1 9999]
+ )
+)
diff --git a/demos/ppl_pips/examples/lineri.dat b/demos/ppl_pips/examples/lineri.dat
new file mode 100644
index 0000000..4c13e66
--- /dev/null
+++ b/demos/ppl_pips/examples/lineri.dat
@@ -0,0 +1,9 @@
+((linearisation d'un tableau 100 100)
+ 1 1 3 1 -1 1
+ (#[-1 99 0]
+ #[-100 0 1]
+ #[100 99 -1]
+ )
+ (#[-1 9999]
+ )
+)
diff --git a/demos/ppl_pips/examples/loz.dat b/demos/ppl_pips/examples/loz.dat
new file mode 100644
index 0000000..234dd9c
--- /dev/null
+++ b/demos/ppl_pips/examples/loz.dat
@@ -0,0 +1,15 @@
+(
+ ( Solving MIN(i-2.j) under the following constraints:
+ Unknowns may be negative.
+ Order:
+ f' i' j' constant G P n'
+ )
+ 3 3 5 0 4 1
+ (
+ #[ 0 1 1 20 -2 -4 4 ]
+ #[ 1 -1 2 0 -2 0 0 ]
+ #[ 0 -1 -1 0 2 0 0 ]
+ #[ 0 1 -1 10 0 -2 2 ]
+ #[ 0 -1 1 10 0 -2 2 ]
+ )
+ ( ))
diff --git a/demos/ppl_pips/examples/max.dat b/demos/ppl_pips/examples/max.dat
new file mode 100644
index 0000000..fdb71c5
--- /dev/null
+++ b/demos/ppl_pips/examples/max.dat
@@ -0,0 +1,9 @@
+((a maximization problem)
+ 2 1 4 0 -1 1
+ (#[-1 0 0 1]
+ #[0 -1 0 1]
+ #[-1 3 12 -2]
+ #[2 -1 3 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/max.pip b/demos/ppl_pips/examples/max.pip
new file mode 100644
index 0000000..e8af57b
--- /dev/null
+++ b/demos/ppl_pips/examples/max.pip
@@ -0,0 +1,9 @@
+0 3
+
+-1
+
+4 5
+1 -1 0 1 0
+1 0 -1 1 0
+1 -1 3 -2 12
+1 2 -1 -1 3
diff --git a/demos/ppl_pips/examples/maxb.dat b/demos/ppl_pips/examples/maxb.dat
new file mode 100644
index 0000000..02db81a
--- /dev/null
+++ b/demos/ppl_pips/examples/maxb.dat
@@ -0,0 +1,9 @@
+((a maximization problem)
+ 2 1 4 0 3 1
+ (#[-1 0 0 1]
+ #[0 -1 0 1]
+ #[-1 3 12 -2]
+ #[2 -1 3 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/pairi.dat b/demos/ppl_pips/examples/pairi.dat
new file mode 100644
index 0000000..9f604cd
--- /dev/null
+++ b/demos/ppl_pips/examples/pairi.dat
@@ -0,0 +1,7 @@
+((les nombres pairs)
+ 1 1 2 0 -1 1
+ (#[2 0 -1]
+ #[-6 1 3]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/petit.dat b/demos/ppl_pips/examples/petit.dat
new file mode 100644
index 0000000..5d23e19
--- /dev/null
+++ b/demos/ppl_pips/examples/petit.dat
@@ -0,0 +1,9 @@
+((( a b c d e f g h i j k l m n o p q r s t u v w x y z 1)())
+ 3 0 3 0 -1 1
+ (#[1 0 0 -2]
+ #[1 2 0 -3]
+ #[1 2 3 -7]
+ )
+ ()
+ )
+
diff --git a/demos/ppl_pips/examples/rairoi.dat b/demos/ppl_pips/examples/rairoi.dat
new file mode 100644
index 0000000..09f6d0b
--- /dev/null
+++ b/demos/ppl_pips/examples/rairoi.dat
@@ -0,0 +1,9 @@
+((test du papier RAIRO)
+ 2 3 4 0 -1 1
+ (#[-1 0 0 0 1 0]
+ #[0 -1 0 0 0 1]
+ #[-2 -1 0 -1 2 1]
+ #[2 1 0 1 -2 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/sor1d.pip b/demos/ppl_pips/examples/sor1d.pip
new file mode 100644
index 0000000..3b3dc61
--- /dev/null
+++ b/demos/ppl_pips/examples/sor1d.pip
@@ -0,0 +1,28 @@
+2 4
+ 1 1 0 0
+ 1 0 1 0
+
+-1
+
+20 8
+
+ 0 -1 0 0 0 0 0 2
+ 0 0 -1 0 0 0 0 1
+ 0 0 0 -1 0 0 0 2
+ 0 0 0 0 -1 0 0 4
+ 1 0 0 0 1 0 0 -2
+ 1 -2 0 2 1 0 0 -4
+ 1 0 0 0 -1 0 1 -1
+ 1 2 0 -2 -1 0 0 5
+ 1 0 0 1 0 0 0 -1
+ 1 0 -2 1 0 0 0 0
+ 1 -2 0 2 0 0 1 -5
+ 1 0 0 -1 0 1 0 0
+ 1 0 2 -1 0 0 0 1
+ 1 2 0 -2 0 0 0 3
+ 1 0 1 0 0 0 0 0
+ 1 -2 4 0 0 0 1 -3
+ 1 0 -2 0 0 1 0 0
+ 1 2 -4 0 0 0 0 3
+ 1 2 0 0 0 0 0 1
+ 1 -2 0 0 0 2 1 -5
diff --git a/demos/ppl_pips/examples/square.pip b/demos/ppl_pips/examples/square.pip
new file mode 100644
index 0000000..7bb3f0c
--- /dev/null
+++ b/demos/ppl_pips/examples/square.pip
@@ -0,0 +1,9 @@
+0 3
+
+-1
+
+4 5
+1 1 0 0 0
+1 -1 0 1 0
+1 0 1 0 0
+1 0 -1 1 0
diff --git a/demos/ppl_pips/examples/test02.dat b/demos/ppl_pips/examples/test02.dat
new file mode 100644
index 0000000..f0f8e18
--- /dev/null
+++ b/demos/ppl_pips/examples/test02.dat
@@ -0,0 +1,20 @@
+( ( Four parts in the file:
+ - comments (here !),
+ - Information line: here "2 2 5 0 -1 1" meaning 2 unknown,
+ 2 parameters, 5 inequalities for domain, 1 ineq. for context,
+ no big parameter (-1) and integer solution requested (1).
+ - List of domain inequalities: #[ 2 3 -8 0 0] meaning
+ (2)*i + (3)*j + (-8)*1 + (0)*m + (0)*n >= 0.
+ - List of context inequalities: #[ 0 1 -3] meaning
+ (0)*m + (1)*n + (-3)*1 >= 0.
+ )
+ 2 2 5 1 -1 1
+ ( #[ 2 3 -8 0 0]
+ #[ 4 -1 -4 0 0]
+ #[-1 0 0 0 1]
+ #[ 0 1 0 0 0]
+ #[ 0 -1 0 1 0]
+ )
+ ( #[ 0 1 -3]
+ )
+)
diff --git a/demos/ppl_pips/examples/test12i.dat b/demos/ppl_pips/examples/test12i.dat
new file mode 100644
index 0000000..5881897
--- /dev/null
+++ b/demos/ppl_pips/examples/test12i.dat
@@ -0,0 +1,17 @@
+((variables : a b c d ...., pas de parametres)
+ 12 0 12 0 -1 1
+ (#[1 0 0 0 0 0 0 0 0 0 0 0 -2]
+ #[1 2 0 0 0 0 0 0 0 0 0 0 -3]
+ #[1 2 3 0 0 0 0 0 0 0 0 0 -7]
+ #[1 2 3 4 0 0 0 0 0 0 0 0 -25]
+ #[1 2 3 4 5 0 0 0 0 0 0 0 -121]
+ #[1 2 3 4 5 6 0 0 0 0 0 0 -721]
+ #[1 2 3 4 5 6 7 0 0 0 0 0 -5041]
+ #[1 2 3 4 5 6 7 8 0 0 0 0 -40321]
+ #[1 2 3 4 5 6 7 8 9 0 0 0 -362881]
+ #[1 2 3 4 5 6 7 8 9 10 0 0 -3628801]
+ #[1 2 3 4 5 6 7 8 9 10 11 0 -39916801]
+ #[1 2 3 4 5 6 7 8 9 10 11 12 -479001601]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/expected_int16 b/demos/ppl_pips/expected_int16
new file mode 100644
index 0000000..b471d6b
--- /dev/null
+++ b/demos/ppl_pips/expected_int16
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat d41d8cd98f00b204e9800998ecf8427e -
+lineri.dat d41d8cd98f00b204e9800998ecf8427e -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip d41d8cd98f00b204e9800998ecf8427e -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int16_a b/demos/ppl_pips/expected_int16_a
new file mode 100644
index 0000000..b471d6b
--- /dev/null
+++ b/demos/ppl_pips/expected_int16_a
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat d41d8cd98f00b204e9800998ecf8427e -
+lineri.dat d41d8cd98f00b204e9800998ecf8427e -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip d41d8cd98f00b204e9800998ecf8427e -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int32 b/demos/ppl_pips/expected_int32
new file mode 100644
index 0000000..cb13f0d
--- /dev/null
+++ b/demos/ppl_pips/expected_int32
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int32_a b/demos/ppl_pips/expected_int32_a
new file mode 100644
index 0000000..cb13f0d
--- /dev/null
+++ b/demos/ppl_pips/expected_int32_a
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int64 b/demos/ppl_pips/expected_int64
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_int64
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat 9c4f4bd2f5327b9ba442e4e294078282 -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip 3051dbe7ea7bf04e8890ddd41013a9dc -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int64_a b/demos/ppl_pips/expected_int64_a
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_int64_a
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat 9c4f4bd2f5327b9ba442e4e294078282 -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip 3051dbe7ea7bf04e8890ddd41013a9dc -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int8 b/demos/ppl_pips/expected_int8
new file mode 100644
index 0000000..3d0d199
--- /dev/null
+++ b/demos/ppl_pips/expected_int8
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat d41d8cd98f00b204e9800998ecf8427e -
+lineri.dat d41d8cd98f00b204e9800998ecf8427e -
+loz.dat d41d8cd98f00b204e9800998ecf8427e -
+max.dat d41d8cd98f00b204e9800998ecf8427e -
+maxb.dat d41d8cd98f00b204e9800998ecf8427e -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat d41d8cd98f00b204e9800998ecf8427e -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip d41d8cd98f00b204e9800998ecf8427e -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip d41d8cd98f00b204e9800998ecf8427e -
+max.pip d41d8cd98f00b204e9800998ecf8427e -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_int8_a b/demos/ppl_pips/expected_int8_a
new file mode 100644
index 0000000..3d0d199
--- /dev/null
+++ b/demos/ppl_pips/expected_int8_a
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat d41d8cd98f00b204e9800998ecf8427e -
+lineri.dat d41d8cd98f00b204e9800998ecf8427e -
+loz.dat d41d8cd98f00b204e9800998ecf8427e -
+max.dat d41d8cd98f00b204e9800998ecf8427e -
+maxb.dat d41d8cd98f00b204e9800998ecf8427e -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat d41d8cd98f00b204e9800998ecf8427e -
+test12i.dat d41d8cd98f00b204e9800998ecf8427e -
+big.pip d41d8cd98f00b204e9800998ecf8427e -
+brisebarre.pip d41d8cd98f00b204e9800998ecf8427e -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip d41d8cd98f00b204e9800998ecf8427e -
+max.pip d41d8cd98f00b204e9800998ecf8427e -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_mpz b/demos/ppl_pips/expected_mpz
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_mpz
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat 9c4f4bd2f5327b9ba442e4e294078282 -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip 3051dbe7ea7bf04e8890ddd41013a9dc -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/expected_mpz_a b/demos/ppl_pips/expected_mpz_a
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_mpz_a
@@ -0,0 +1,20 @@
+invert.dat 89eb267478eb8675de9602be9bb92f9e -
+linear.dat 1f73e09130d92979eb4388cbbab7f389 -
+lineri.dat 7b21035f6f07e68b8c0e2893a649f0ef -
+loz.dat 558273607bb0eec59c713980a8722ac8 -
+max.dat 2c3f32340ed2ea04d070dd311e9ca188 -
+maxb.dat bc9d718f581cd7da4bbd7f0293749315 -
+pairi.dat 205989eb31ec0705adce45b63d5bebfe -
+petit.dat dd796c3d2afd2b7fb25a661c4137973f -
+rairoi.dat 6aa01aa8b58429c4dfe33fad609306d5 -
+test02.dat be9c80fb6dda6212d060a2295771f8cb -
+test12i.dat 9c4f4bd2f5327b9ba442e4e294078282 -
+big.pip bc9d718f581cd7da4bbd7f0293749315 -
+brisebarre.pip 3051dbe7ea7bf04e8890ddd41013a9dc -
+cg1.pip 2571d40371dd1f1661348b08945e8a98 -
+esced.pip 7f4b69aed82cc0f498e7931ac1dbf92f -
+ex2.pip 89eb267478eb8675de9602be9bb92f9e -
+fimmel.pip 2dd9b24df50572c15981dd3faf8c74a4 -
+max.pip 2c3f32340ed2ea04d070dd311e9ca188 -
+sor1d.pip 80f93132ed5d70b6371d5bf5fa627376 -
+square.pip 65a57d1e7ccb8196f81fa6e701164b69 -
diff --git a/demos/ppl_pips/ppl_pips.1 b/demos/ppl_pips/ppl_pips.1
new file mode 100644
index 0000000..c15f2d2
--- /dev/null
+++ b/demos/ppl_pips/ppl_pips.1
@@ -0,0 +1,137 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11.
+.TH PPL_PIPS "1" "October 2013" "ppl_pips 1.1" "User Commands"
+.SH NAME
+ppl_pips \- a PPL-based parametric integer programming problem solver
+.SH SYNOPSIS
+.B ppl_pips
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads the definition of a Parametric Integer Programming problem
+and displays the lexicographic minimum in terms of the values of the
+parameters.
+.SH OPTIONS
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-P\fR, \fB\-\-polylib\fR
+reads problem in PolyLib format (default)
+.TP
+\fB\-p\fR, \fB\-\-piplib\fR
+reads problem in PipLib format
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+produces lots of output
+.TP
+\fB\-i\fR, \fB\-\-iterations\fR=\fIN\fR
+executes the resolution N times (default=1)
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
+checks if the result is equal to what is in PATH
+.SS "Cut generation options:"
+.TP
+\fB\-f\fR, \fB\-\-cut\-first\fR
+uses the first non\-integer row (default)
+.TP
+\fB\-d\fR, \fB\-\-cut\-deepest\fR
+tries to generate the deepest cut
+.TP
+\fB\-a\fR, \fB\-\-cut\-all\fR
+always generates all possible cuts
+.SS "Pivot row strategy options:"
+.TP
+\fB\-F\fR, \fB\-\-row\-first\fR
+uses the first row with negative parameter (default)
+.TP
+\fB\-M\fR, \fB\-\-row\-max\fR
+chooses row generating the lexico\-maximal pivot column
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The options \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) and
+\fB\-t\fR (\fB\-\-timings\fR) are not available on some platforms.
+.sp
+The PolyLib format is as follows:
+.TP
+-
+The first row describes the context matrix (i.e., constraints on the
+parameters). The first value is the number of rows (which can be zero)
+and the second value is the number of columns. The number of parameters
+is the number of columns minus 2.
+.TP
+-
+Starting from the second row, there are the rows of the context matrix,
+if any. Each row, which represents a constraint of the form
+.B "c1*p1 + ... + cn*pn + c0 =/>= 0",
+contains:
+the value 0 if the constraint is an equality, 1 if it is an inequality;
+the coefficients of the parameters
+.B "c1, ..., cn";
+the constant term
+.B "c0".
+For example, the inequality constraint on two parameters
+.B "p1 + 2*p2 - 1 >= 0"
+is encoded by the row
+.B "1 1 2 -1".
+.TP
+-
+The following row contains the parameter number for the so-called
+.IR "big parameter".
+If no big parameter is used, the value is -1.
+.TP
+-
+The following rows encode the problem inequality matrix.
+As for the context matrix, the first two values are the dimensions of the
+matrix. The number of variables is the number of columns in the matrix
+minus the number of parameters minus 2.
+Each row, which represents a constraint of the form
+.B "d1*v1 + ... + dm*vm + c1*p1 + ... + cn*pn + c0 =/>= 0",
+contains:
+the value 0 if the constraint is an equality, 1 if it is an inequality;
+the coefficients of the variables
+.B "d1, ..., dm";
+the coefficients of the parameters
+.B "c1, ..., cn";
+the constant term
+.B "c0".
+.sp
+The PipLib format is described in Section 2.2 of
+.IR "PIP/PipLib: A Solver for Parametric Integer Programming Problems"
+(see below).
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Paul Feautrier.
+.IR "Parametric Integer Programming".
+RAIRO Recherche Operationnelle, 22(3):243-268, 1988.
+.sp
+Paul Feautrier, Jean-Francois Collard, and Cedric Bastoul.
+.IR "PIP/PipLib: A Solver for Parametric Integer Programming Problems",
+5.0 edition, July 2007.
+Distributed with PIP/PipLib 1.4.0.
diff --git a/demos/ppl_pips/ppl_pips.cc b/demos/ppl_pips/ppl_pips.cc
new file mode 100644
index 0000000..3538cef
--- /dev/null
+++ b/demos/ppl_pips/ppl_pips.cc
@@ -0,0 +1,827 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+//#define USE_PIPLIB 1
+
+#if (!defined(USE_PPL) && !defined(USE_PIPLIB))
+#define USE_PPL 1
+#elif (defined(USE_PPL) && defined(USE_PIPLIB))
+#error "Exactly one among USE_PPL and USE_PIPLIB must be defined"
+#endif
+
+#if defined(USE_PPL)
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11
+#error "PPL version 0.11 or following is required"
+#endif
+
+typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_PIPLIB)
+
+#error "PipLib not supported yet"
+
+#endif
+
+#include "timings.hh"
+#include <gmpxx.h>
+#include <vector>
+#include <set>
+#include <climits>
+#include <cassert>
+#include <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+#include <memory>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+namespace {
+
+PPL::PIP_Problem::Control_Parameter_Value cutting_strategy
+ = PPL::PIP_Problem::CUTTING_STRATEGY_FIRST;
+
+PPL::PIP_Problem::Control_Parameter_Value pivot_row_strategy
+ = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+
+long loop_iterations = 1;
+
+void
+pip_display_sol(std::ostream& out,
+ const Parma_Polyhedra_Library::PIP_Tree pip,
+ const Parma_Polyhedra_Library::Variables_Set& parameters,
+ const Parma_Polyhedra_Library::Variables_Set& vars,
+ Parma_Polyhedra_Library::dimension_type space_dimension,
+ int indent = 0) {
+ using namespace std;
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ if (!pip) {
+ out << setw(indent*2) << "" << "_|_" << endl;
+ }
+ else {
+ for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+ i = pip->art_parameter_begin(),
+ i_end = pip->art_parameter_end();
+ i != i_end;
+ ++i) {
+ out << setw(indent*2) << "" << "Parameter "
+ << Linear_Expression(Variable(space_dimension++))
+ << " = " << *i << endl;
+ }
+ const Constraint_System &constraints = pip->constraints();
+ const bool constraints_empty = constraints.empty();
+ if (!constraints_empty) {
+ out << setw(indent*2) << "" << "if ";
+ for (Constraint_System::const_iterator
+ cs_begin = constraints.begin(),
+ cs_end = constraints.end(),
+ i = cs_begin; i != cs_end; ++i)
+ out << ((i == cs_begin) ? "" : " and ") << *i;
+ out << " then" << endl;
+ }
+ const PIP_Decision_Node* const decision_node_p = pip->as_decision();
+ if (decision_node_p) {
+ pip_display_sol(out, decision_node_p->child_node(true),
+ parameters, vars, space_dimension, indent+1);
+ out << setw(indent*2) << "" << "else" << endl;
+ pip_display_sol(out, decision_node_p->child_node(false),
+ parameters, vars, space_dimension, indent+1);
+ }
+ else {
+ const PIP_Solution_Node* const solution_node_p = pip->as_solution();
+ out << setw(indent*2 + (constraints_empty ? 0 : 2)) << "" << "{";
+ for (Variables_Set::const_iterator
+ v_begin = vars.begin(),
+ v_end = vars.end(),
+ i = v_begin; i != v_end; ++i)
+ out << ((i == v_begin) ? "" : " ; ")
+ << solution_node_p->parametric_values(Variable(*i));
+ out << "}" << endl;
+ if (!constraints_empty) {
+ out << setw(indent*2) << "" << "else" << endl;
+ out << setw(indent*2 + 2) << "" << "_|_" << endl;
+ }
+ }
+ }
+}
+
+class PIP_Parser {
+public:
+ PIP_Parser() : pip() {
+ pip.set_control_parameter(cutting_strategy);
+ pip.set_control_parameter(pivot_row_strategy);
+ }
+
+ virtual ~PIP_Parser() {
+ }
+
+ const PPL::PIP_Problem& problem() const {
+ return pip;
+ }
+
+ virtual bool read(std::istream& in) = 0;
+
+ //! Output the solution in "if-then-else" format.
+ void output_solution_tree(std::ostream& out) {
+ const PPL::Variables_Set& params = pip.parameter_space_dimensions();
+ PPL::Variables_Set vars;
+ for (PPL::dimension_type i = 0; i < pip.space_dimension(); ++i) {
+ if (params.count(i) == 0)
+ vars.insert(i);
+ }
+ const PPL::PIP_Tree solution = pip.solution();
+ pip_display_sol(out, solution, params, vars, pip.space_dimension());
+ }
+
+ typedef std::vector<PPL::Coefficient> Coeff_Vector;
+ typedef std::vector<int> Int_Vector;
+
+ bool update_pip(PPL::dimension_type num_vars,
+ PPL::dimension_type num_params,
+ PPL::dimension_type num_constraints,
+ PPL::dimension_type num_ctx_rows,
+ const Coeff_Vector& constraints,
+ const Coeff_Vector& context,
+ const Int_Vector& constraint_type,
+ const Int_Vector& ctx_type,
+ PPL::dimension_type bignum_column) {
+ pip.add_space_dimensions_and_embed(num_vars, num_params);
+ for (PPL::dimension_type k = 0, i = 0; i < num_constraints; ++i) {
+ PPL::Linear_Expression expr;
+ for (PPL::dimension_type j = 0; j < num_vars + num_params; ++j)
+ add_mul_assign(expr, constraints[k++], PPL::Variable(j));
+ expr += constraints[k++];
+ if (constraint_type[i])
+ pip.add_constraint(PPL::Constraint(expr >= 0));
+ else
+ pip.add_constraint(PPL::Constraint(expr == 0));
+ }
+ if (num_params > 0) {
+ for (PPL::dimension_type k = 0, i = 0; i < num_ctx_rows; ++i) {
+ PPL::Linear_Expression expr;
+ for (PPL::dimension_type j = 0; j < num_params; ++j)
+ add_mul_assign(expr, context[k++], PPL::Variable(num_vars+j));
+ expr += context[k++];
+ if (ctx_type[i])
+ pip.add_constraint(PPL::Constraint(expr >= 0));
+ else
+ pip.add_constraint(PPL::Constraint(expr == 0));
+ }
+ }
+ if (bignum_column != PPL::not_a_dimension())
+ pip.set_big_parameter_dimension(bignum_column);
+ return true;
+ }
+
+protected:
+ //! The problem object.
+ PPL::PIP_Problem pip;
+}; // class PIP_Parser
+
+class PIP_PolyLib_Parser : public PIP_Parser {
+public:
+ PIP_PolyLib_Parser(): PIP_Parser() {
+ }
+
+ bool read(std::istream& in) {
+ std::string line;
+
+ PPL::dimension_type num_ctx_rows;
+ PPL::dimension_type num_params;
+ getline_no_comment(in, line);
+ {
+ std::istringstream iss(line);
+ iss >> num_ctx_rows >> num_params;
+ }
+ PPL_ASSERT(num_params >= 2);
+ num_params -= 2;
+
+ Coeff_Vector context(num_ctx_rows * (1+num_params));
+ Int_Vector ctx_type(num_ctx_rows);
+ for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i) {
+ getline_no_comment(in, line);
+ std::istringstream iss(line);
+ iss >> ctx_type[i];
+ for (PPL::dimension_type j = 0; j <= num_params; ++j) {
+ iss >> context[i*num_ctx_rows + j];
+ }
+ }
+
+ int bignum_column_coding;
+ getline_no_comment(in, line);
+ {
+ std::istringstream iss(line);
+ iss >> bignum_column_coding;
+ }
+ PPL_ASSERT(bignum_column_coding >= -1);
+
+ PPL::dimension_type num_constraints;
+ PPL::dimension_type constraint_width;
+ PPL::dimension_type num_vars;
+ getline_no_comment(in, line);
+ {
+ std::istringstream iss(line);
+ iss >> num_constraints >> constraint_width;
+ }
+ constraint_width -= 1;
+ num_vars = constraint_width - num_params - 1;
+
+ Coeff_Vector constraints(num_constraints * constraint_width);
+ Int_Vector constraint_type(num_constraints);
+ for (PPL::dimension_type i = 0; i < num_constraints; ++i) {
+ getline_no_comment(in, line);
+ std::istringstream iss(line);
+ iss >> constraint_type[i];
+ for (PPL::dimension_type j = 0; j < constraint_width; ++j) {
+ iss >> constraints[i*constraint_width + j];
+ }
+ }
+
+ const PPL::dimension_type bignum_column
+ = (bignum_column_coding == -1)
+ ? PPL::not_a_dimension()
+ : (num_vars + PPL::dimension_type(bignum_column_coding - 1));
+
+ const bool result = update_pip(num_vars, num_params,
+ num_constraints, num_ctx_rows,
+ constraints, context,
+ constraint_type, ctx_type,
+ bignum_column);
+ return result;
+ }
+
+protected:
+ static void getline_no_comment(std::istream& in, std::string& s) {
+ do {
+ getline(in, s);
+ } while (s.size() == 0 || s[0] == '\r' || s[0] == '#');
+ }
+}; // class PIP_PolyLib_Parser
+
+class PIP_PipLib_Parser : public PIP_Parser {
+public:
+ PIP_PipLib_Parser()
+ : PIP_Parser(), comment() {
+ }
+
+ bool read(std::istream& in) {
+ if (!expect(in, '('))
+ return false;
+ if (!expect(in, '('))
+ return false;
+ if (!read_comment(in))
+ return false;
+
+ PPL::dimension_type num_vars;
+ PPL::dimension_type num_params;
+ in >> num_vars >> num_params;
+
+ PPL::dimension_type num_constraints;
+ PPL::dimension_type num_ctx_rows;
+ in >> num_constraints >> num_ctx_rows;
+
+ int bignum_column_coding;
+ in >> bignum_column_coding;
+ PPL_ASSERT(bignum_column_coding >= -1);
+ const PPL::dimension_type bignum_column
+ = (bignum_column_coding == -1)
+ ? PPL::not_a_dimension()
+ : PPL::dimension_type(bignum_column_coding - 1);
+
+ int solve_integer;
+ in >> solve_integer;
+ if (solve_integer != 1) {
+ std::cerr << "Can only solve integer problems." << std::endl;
+ return false;
+ }
+
+ if (!expect(in, '('))
+ return false;
+ const PPL::dimension_type constraint_width = num_vars+num_params+1;
+ Coeff_Vector constraints(num_constraints * constraint_width);
+ Int_Vector constraint_type(num_constraints);
+ for (PPL::dimension_type i = 0; i < num_constraints; ++i)
+ constraint_type[i] = 1;
+ for (PPL::dimension_type i = 0; i < num_constraints; ++i)
+ if (!read_vector(in, i, constraint_width, num_vars, constraints))
+ return false;
+
+ Coeff_Vector context(num_ctx_rows * (1+num_params));
+ Int_Vector ctx_type(num_ctx_rows);
+ for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i)
+ ctx_type[i] = 1;
+ for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i)
+ if (!read_vector(in, i, num_params+1, num_params, context))
+ return false;
+
+ const bool result = update_pip(num_vars, num_params,
+ num_constraints, num_ctx_rows,
+ constraints, context,
+ constraint_type, ctx_type,
+ bignum_column);
+ return result;
+ }
+
+protected:
+ bool read_comment(std::istream& in) {
+ comment = "";
+ int count = 1;
+ do {
+ char c;
+ if (!in.get(c))
+ return false;
+ if (c == '(')
+ ++count;
+ else if (c == ')')
+ --count;
+ if (count > 0)
+ comment += c;
+ } while (count > 0);
+ return true;
+ }
+
+ static bool expect(std::istream& in, char c) {
+ char a;
+ do {
+ in >> a;
+ } while (a != c && in.good());
+ return a == c;
+ }
+
+ static bool read_vector(std::istream& in,
+ PPL::dimension_type row_index,
+ PPL::dimension_type row_size,
+ PPL::dimension_type cst_col,
+ Coeff_Vector& tab) {
+ if (!expect(in, '#'))
+ return false;
+ if (!expect(in, '['))
+ return false;
+ std::string s;
+ getline(in, s, ']');
+ if (in.fail())
+ return false;
+ std::istringstream iss(s);
+ const PPL::dimension_type start_index = row_index * row_size;
+ PPL::dimension_type k = start_index;
+ for (PPL::dimension_type i = 0; i < cst_col; ++i, ++k) {
+ iss >> tab[k];
+ if (iss.fail())
+ return false;
+ }
+ iss >> tab[start_index + row_size - 1];
+ if (iss.fail())
+ return false;
+ for (PPL::dimension_type i = cst_col + 1; i < row_size; ++i, ++k) {
+ iss >> tab[k];
+ if (iss.fail())
+ return false;
+ }
+ return true;
+ }
+
+ // The comment string in the source file
+ std::string comment;
+}; // class PIP_PipLib_Parser
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+ {"max-cpu", required_argument, 0, 'C'},
+ {"max-memory", required_argument, 0, 'R'},
+ {"help", no_argument, 0, 'h'},
+ {"output", required_argument, 0, 'o'},
+ {"polylib", no_argument, 0, 'P'},
+ {"piplib", no_argument, 0, 'p'},
+ {"timings", no_argument, 0, 't'},
+ {"verbose", no_argument, 0, 'v'},
+ {"iterations", required_argument, 0, 'i'},
+#if defined(USE_PPL)
+ {"version", no_argument, 0, 'V'},
+ {"check", required_argument, 0, 'c'},
+#endif
+ {"cut-first", no_argument, 0, 'f'},
+ {"cut-deepest", no_argument, 0, 'd'},
+ {"cut-all", no_argument, 0, 'a'},
+ {"row-first", no_argument, 0, 'F'},
+ {"row-max", no_argument, 0, 'M'},
+ {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]\n"
+"Reads the definition of a Parametric Integer Programming problem\n"
+"and displays the lexicographic minimum in terms of the values of the\n"
+"parameters.\n\n"
+"Options:\n"
+" -RMB, --max-memory=MB limits memory usage to MB megabytes\n"
+" -h, --help prints this help text to stdout\n"
+" -oPATH, --output=PATH appends output to PATH\n"
+" -P, --polylib reads problem in PolyLib format (default)\n"
+" -p, --piplib reads problem in PipLib format\n"
+" -t, --timings prints timings to stderr\n"
+" -v, --verbose produces lots of output\n"
+" -i, --iterations=N executes the resolution N times (default=1)\n"
+#if defined(USE_PPL)
+" -V, --version prints version information to stdout\n"
+" -cPATH, --check=PATH checks if the result is equal to what is in PATH\n"
+#endif
+"\nCut generation options:\n"
+" -f, --cut-first uses the first non-integer row (default)\n"
+" -d, --cut-deepest tries to generate the deepest cut\n"
+" -a, --cut-all always generates all possible cuts\n"
+"\nPivot row strategy options:\n"
+" -F, --row-first uses the first row with negative parameter (default)\n"
+" -M, --row-max chooses row generating the lexico-maximal pivot column\n"
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#if defined(USE_PPL)
+#define OPTION_LETTERS "R:ho:Pptvi:Vc:fdaFM"
+#else
+#define OPTION_LETTERS "R:ho:Pptvi:fdaFM"
+#endif
+
+const char* program_name = 0;
+
+unsigned long max_bytes_of_virtual_memory = 0;
+bool print_timings = false;
+bool verbose = false;
+const char* check_file_name = 0;
+
+void
+fatal(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+const char* input_file_name = 0;
+std::istream* input_stream_p = 0;
+
+void
+set_input(const char* file_name) {
+ if (input_stream_p && *input_stream_p != std::cin)
+ delete input_stream_p;
+
+ if (file_name) {
+ input_stream_p = new std::ifstream(file_name, std::ios_base::in);
+ if (!*input_stream_p)
+ fatal("cannot open input file `%s'", file_name);
+ input_file_name = file_name;
+ }
+ else {
+ input_stream_p = &std::cin;
+ input_file_name = "<cin>";
+ }
+}
+
+const char* output_file_name = 0;
+std::ostream* output_stream_p = 0;
+
+void
+set_output(const char* file_name) {
+ if (output_stream_p && *output_stream_p != std::cout)
+ delete output_stream_p;
+
+ if (file_name) {
+ output_stream_p = new std::ofstream(file_name,
+ std::ios_base::out
+ | std::ios_base::app);
+ if (!*output_stream_p)
+ fatal("cannot open output file `%s'", file_name);
+ output_file_name = file_name;
+ }
+ else {
+ output_stream_p = &std::cout;
+ output_file_name = "<cout>";
+ }
+}
+
+bool piplib_format = false;
+
+} // namespace
+
+void
+error(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: in `%s': ", program_name, input_file_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+void
+warning(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+}
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(const unsigned long bytes) {
+ struct rlimit t;
+
+ if (getrlimit(RLIMIT_AS, &t) != 0)
+ fatal("getrlimit failed: %s", strerror(errno));
+
+ if (bytes < t.rlim_cur) {
+ t.rlim_cur = bytes;
+ if (setrlimit(RLIMIT_AS, &t) != 0)
+ fatal("setrlimit failed: %s", strerror(errno));
+ }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long) {
+}
+
+#endif // !PPL_HAVE_DECL_RLIMIT_AS
+
+void
+process_options(int argc, char* argv[]) {
+ while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+ int option_index = 0;
+ const int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+ &option_index);
+#else
+ const int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+ if (c == EOF)
+ break;
+
+ char* endptr;
+ switch (c) {
+ case 0:
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, usage_string, argv[0]);
+ exit(0);
+ break;
+
+ case 'R':
+ {
+ const unsigned long MEGA = 1024U*1024U;
+ const long l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-R'");
+ else if (static_cast<unsigned long>(l) > ULONG_MAX/MEGA)
+ max_bytes_of_virtual_memory = ULONG_MAX;
+ else
+ max_bytes_of_virtual_memory = static_cast<unsigned long>(l)*MEGA;
+ }
+ break;
+
+ case 'o':
+ output_file_name = optarg;
+ break;
+
+ case 'P':
+ piplib_format = false;
+ break;
+
+ case 'p':
+ piplib_format = true;
+ break;
+
+ case 't':
+ print_timings = true;
+ break;
+
+ case 'v':
+ verbose = true;
+ break;
+
+ case 'i':
+ loop_iterations = strtol(optarg, &endptr, 10);
+ if (*endptr || loop_iterations < 1)
+ fatal("a positive integer must follow `-i'");
+ break;
+
+#if defined(USE_PPL)
+
+ case 'V':
+ fprintf(stdout, "%s\n", PPL_VERSION);
+ exit(0);
+ break;
+
+ case 'c':
+ check_file_name = optarg;
+ break;
+
+#endif
+
+ case 'f':
+ cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_FIRST;
+ break;
+
+ case 'd':
+ cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+ break;
+
+ case 'a':
+ cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_ALL;
+ break;
+
+ case 'F':
+ pivot_row_strategy = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+ break;
+
+ case 'M':
+ pivot_row_strategy = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+ break;
+
+ default:
+ abort();
+ }
+ }
+
+ if (argc - optind > 1)
+ // We have multiple input files.
+ fatal("at most one input file is accepted");
+
+ // We have one input files.
+ if (optind < argc)
+ input_file_name = argv[optind];
+ else
+ // If no input files have been specified: we will read from standard input.
+ assert(input_file_name == 0);
+}
+
+void
+maybe_start_clock() {
+ if (print_timings)
+ start_clock();
+}
+
+void
+maybe_print_clock() {
+ if (print_timings) {
+ std::cerr << input_file_name << " ";
+ print_clock(std::cerr);
+ std::cerr << std::endl;
+ }
+}
+
+int
+main(int argc, char* argv[]) try {
+ program_name = argv[0];
+
+#if defined(USE_PPL)
+ if (strcmp(PPL_VERSION, PPL::version()) != 0)
+ fatal("was compiled with PPL version %s, but linked with version %s",
+ PPL_VERSION, PPL::version());
+
+ if (verbose)
+ std::cerr << "Parma Polyhedra Library version:\n" << PPL::version()
+ << "\n\nParma Polyhedra Library banner:\n" << PPL::banner()
+ << std::endl;
+#endif
+
+ // Process command line options.
+ process_options(argc, argv);
+
+ if (max_bytes_of_virtual_memory > 0)
+ limit_virtual_memory(max_bytes_of_virtual_memory);
+
+ // Set up the input and output streams.
+ set_input(input_file_name);
+ set_output(output_file_name);
+
+// POLYHEDRON_TYPE ph;
+// Representation rep = read_polyhedron(input(), ph);
+ std::auto_ptr<PIP_Parser> parser;
+ if (piplib_format)
+ parser.reset(new PIP_PipLib_Parser);
+ else
+ parser.reset(new PIP_PolyLib_Parser);
+ if (!parser->read(*input_stream_p))
+ return 1;
+
+ maybe_start_clock();
+
+ const PPL::PIP_Problem& pip = parser->problem();
+
+ if (loop_iterations == 1) {
+ // Compute the dual simplex on the problem.
+ pip.solve();
+ // Write the solution.
+ parser->output_solution_tree(*output_stream_p);
+ }
+ else {
+ std::auto_ptr<PPL::PIP_Problem> pip_p;
+ // Perform a time benchmark loop executing the resolution several times.
+ for (long i = 0; i < loop_iterations; ++i) {
+ pip_p.reset(new PPL::PIP_Problem(pip));
+ pip_p->solve();
+ }
+ }
+
+#if defined(USE_PPL) || defined(USE_PIPLIB)
+ maybe_print_clock();
+#endif
+
+ return 0;
+}
+catch (const std::bad_alloc&) {
+ fatal("out of memory");
+ exit(1);
+}
+catch (const std::overflow_error& e) {
+ fatal("arithmetic overflow (%s)", e.what());
+ exit(1);
+}
+catch (...) {
+ fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+ exit(1);
+}
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..4ebd5b3
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputting dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'. On the theory
+## that the space means something, we add a space to the output as
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts '$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for ':'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+ "$@" $dashmflag |
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..8d5ce89
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,1736 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# All the documentation in docdir.
+docdir = @docdir@
+htmldir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+txtdir = $(docdir)
+
+DOXYGEN = doxygen
+
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+BIBLIOGRAPHIES = \
+ppl.bib \
+ppl_citations.bib
+
+##### Library Core Manuals (C++ Interface) #####
+
+USER_CORE_HTML_MANUAL = ppl-user- at VERSION@-html.tar.gz
+DEVREF_CORE_HTML_MANUAL = ppl-devref- at VERSION@-html.tar.gz
+
+USER_CORE_PDF_MANUAL = ppl-user- at VERSION@.pdf
+DEVREF_CORE_PDF_MANUAL = ppl-devref- at VERSION@.pdf
+
+USER_CORE_PS_MANUAL = ppl-user- at VERSION@.ps.gz
+DEVREF_CORE_PS_MANUAL = ppl-devref- at VERSION@.ps.gz
+
+USER_CORE_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_CORE_HTML_DIR = ppl-devref- at VERSION@-html
+
+# NOTE: this variable is used to record Makefile dependencies.
+# The file path is that of the source directory.
+DOX_LICENSE_FILES = \
+gpl.dox \
+fdl.dox
+
+# NOTE: this variable is used to populate Doxygen configuration tag INPUT.
+# The file path is that of the build directory, hence we cannot use
+# variable DOX_LICENSE_FILES defined above.
+DOX_LICENSE_INPUT = \
+$(srcdir)/gpl.dox \
+$(srcdir)/fdl.dox
+
+DOX_FILES = \
+$(DOX_LICENSE_FILES) \
+definitions.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+../src/ppl_header.hh ../src/ppl_include_files.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+if BUILD_C_INTERFACE
+
+# C Language Interface Manuals
+
+USER_C_INTERFACE_HTML_MANUAL = \
+ppl-user-c-interface- at VERSION@-html.tar.gz
+DEVREF_C_INTERFACE_HTML_MANUAL = \
+ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+USER_C_INTERFACE_PDF_MANUAL = \
+ppl-user-c-interface- at VERSION@.pdf
+DEVREF_C_INTERFACE_PDF_MANUAL = \
+ppl-devref-c-interface- at VERSION@.pdf
+
+USER_C_INTERFACE_PS_MANUAL = \
+ppl-user-c-interface- at VERSION@.ps.gz
+DEVREF_C_INTERFACE_PS_MANUAL = \
+ppl-devref-c-interface- at VERSION@.ps.gz
+
+USER_C_INTERFACE_HTML_DIR = \
+ppl-user-c-interface- at VERSION@-html
+DEVREF_C_INTERFACE_HTML_DIR = \
+ppl-devref-c-interface- at VERSION@-html
+
+COMMON_C_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+ppl.sty \
+../configure.ac \
+../interfaces/C/ppl_c_version.h.in \
+../interfaces/C/ppl_c_header.h \
+../interfaces/C/C_interface.dox
+
+USER_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+user-language-interface.tex
+
+DEVREF_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+devref-language-interface.tex \
+../interfaces/C/ppl_c_implementation_common_defs.hh \
+../interfaces/C/ppl_c_implementation_common_inlines.hh \
+../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Configuration Dependent C Language Interface Manuals.
+
+USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@.pdf
+
+USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ppl-user-configured-c-interface- at VERSION@-html
+DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ppl-devref-configured-c-interface- at VERSION@-html
+
+USER_CONFIGURED_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/C/ppl_c.h
+
+DEVREF_CONFIGURED_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/C/ppl_c.h \
+../interfaces/C/ppl_c_implementation_common_defs.hh \
+../interfaces/C/ppl_c_implementation_common_inlines.hh \
+../interfaces/C/ppl_c_implementation_common.cc
+
+endif BUILD_C_INTERFACE
+
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+# Prolog Language Interface Manuals
+
+USER_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-user-prolog-interface- at VERSION@-html.tar.gz
+DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+USER_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-user-prolog-interface- at VERSION@.pdf
+DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@.pdf
+
+USER_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-user-prolog-interface- at VERSION@.ps.gz
+DEVREF_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+USER_PROLOG_INTERFACE_HTML_DIR = \
+ppl-user-prolog-interface- at VERSION@-html
+DEVREF_PROLOG_INTERFACE_HTML_DIR = \
+ppl-devref-prolog-interface- at VERSION@-html
+
+
+PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES = \
+../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+../interfaces/Prolog/Prolog_interface_compilation.dox \
+../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+USER_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+DEVREF_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+../interfaces/Prolog/ppl_prolog_common_defs.hh \
+../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration Dependent Prolog Language Interface Manuals
+
+USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@.pdf
+
+USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ppl-user-configured-prolog-interface- at VERSION@-html
+DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ppl-devref-configured-prolog-interface- at VERSION@-html
+
+USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_configured_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_configured_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+../interfaces/Prolog/ppl_prolog_common_defs.hh \
+../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+../interfaces/Prolog/ppl_prolog_common.cc \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc.stamp
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+if BUILD_OCAML_INTERFACE
+
+# OCaml Language Interface Manuals
+
+USER_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+DEVREF_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+USER_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@.pdf
+DEVREF_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@.pdf
+
+USER_OCAML_INTERFACE_PS_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@.ps.gz
+DEVREF_OCAML_INTERFACE_PS_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+USER_OCAML_INTERFACE_HTML_DIR = \
+ppl-user-ocaml-interface- at VERSION@-html
+DEVREF_OCAML_INTERFACE_HTML_DIR = \
+ppl-devref-ocaml-interface- at VERSION@-html
+
+USER_OCAML_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/OCaml/OCaml_interface.dox \
+../interfaces/OCaml/ppl_ocaml_globals.mli
+
+DEVREF_OCAML_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/OCaml/OCaml_interface.dox \
+../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+../interfaces/OCaml/ppl_ocaml_common_inlines.hh \
+../interfaces/OCaml/ppl_ocaml_common.cc \
+../interfaces/OCaml/ppl_ocaml_globals.mli
+
+
+# Configuration Dependent OCaml Language Interface Manuals.
+
+USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@.pdf
+
+USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ppl-user-configured-ocaml-interface- at VERSION@-html
+DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ppl-devref-configured-ocaml-interface- at VERSION@-html
+
+USER_CONFIGURED_OCAML_INTERFACE_STUFF = \
+$(USER_OCAML_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF = \
+$(DEVREF_OCAML_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+
+# Java Language Interface Manuals
+
+USER_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-user-java-interface- at VERSION@-html.tar.gz
+DEVREF_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+USER_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-user-java-interface- at VERSION@.pdf
+DEVREF_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-devref-java-interface- at VERSION@.pdf
+
+USER_JAVA_INTERFACE_PS_MANUAL = \
+ppl-user-java-interface- at VERSION@.ps.gz
+DEVREF_JAVA_INTERFACE_PS_MANUAL = \
+ppl-devref-java-interface- at VERSION@.ps.gz
+
+USER_JAVA_INTERFACE_HTML_DIR = \
+ppl-user-java-interface- at VERSION@-html
+DEVREF_JAVA_INTERFACE_HTML_DIR = \
+ppl-devref-java-interface- at VERSION@-html
+
+JAVA_INTERFACE_JAVA_FILES = \
+../interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java \
+../interfaces/Java/parma_polyhedra_library/By_Reference.java \
+../interfaces/Java/parma_polyhedra_library/Coefficient.java \
+../interfaces/Java/parma_polyhedra_library/Complexity_Class.java \
+../interfaces/Java/parma_polyhedra_library/Congruence.java \
+../interfaces/Java/parma_polyhedra_library/Congruence_System.java \
+../interfaces/Java/parma_polyhedra_library/Constraint.java \
+../interfaces/Java/parma_polyhedra_library/Constraint_System.java \
+../interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java \
+../interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java \
+../interfaces/Java/parma_polyhedra_library/Degenerate_Element.java \
+../interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Generator.java \
+../interfaces/Java/parma_polyhedra_library/Generator_System.java \
+../interfaces/Java/parma_polyhedra_library/Generator_Type.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java \
+../interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java \
+../interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/MIP_Problem.java \
+../interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java \
+../interfaces/Java/parma_polyhedra_library/Optimization_Mode.java \
+../interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Pair.java \
+../interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java \
+../interfaces/Java/parma_polyhedra_library/Partial_Function.java \
+../interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java \
+../interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java \
+../interfaces/Java/parma_polyhedra_library/PPL_Object.java \
+../interfaces/Java/parma_polyhedra_library/Relation_Symbol.java \
+../interfaces/Java/parma_polyhedra_library/Variable.java \
+../interfaces/Java/parma_polyhedra_library/Variables_Set.java
+
+USER_JAVA_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES)
+
+DEVREF_JAVA_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES) \
+../interfaces/Java/jni/ppl_java_common.cc \
+../interfaces/Java/jni/ppl_java_common_defs.hh \
+../interfaces/Java/jni/ppl_java_common_inlines.hh \
+../interfaces/Java/jni/ppl_java_globals.cc
+
+
+# Configuration Dependent Java Language Interface Manuals.
+
+USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@.pdf
+
+USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ppl-user-configured-java-interface- at VERSION@-html
+DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ppl-devref-configured-java-interface- at VERSION@-html
+
+USER_CONFIGURED_JAVA_INTERFACE_STUFF = \
+$(USER_JAVA_INTERFACE_STUFF)
+
+DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF = \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+
+endif BUILD_JAVA_INTERFACE
+
+###################################################################
+
+# Grouping of dirs and manuals.
+
+USER_HTML_DIRS = \
+$(USER_CORE_HTML_DIR) \
+$(USER_C_INTERFACE_HTML_DIR) \
+$(USER_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_OCAML_INTERFACE_HTML_DIR) \
+$(USER_JAVA_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+DEVREF_HTML_DIRS = \
+$(DEVREF_CORE_HTML_DIR) \
+$(DEVREF_C_INTERFACE_HTML_DIR) \
+$(DEVREF_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_JAVA_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+HTML_DIRS = $(USER_HTML_DIRS) $(DEVREF_HTML_DIRS)
+
+##### Distributed documentation #####
+
+DIST_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+NONDIST_MANUALS = \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+dist_man_MANS = \
+libppl.3 \
+libppl_c.3 \
+ppl-config.1
+
+##### Build Targets #####
+
+# Do nothing by default.
+all:
+
+user-html: \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+user-pdf: \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+user-ps: \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+user: user-html user-pdf user-ps
+
+devref-html: \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-pdf: \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-ps: \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL)
+
+devref: devref-html devref-pdf devref-ps
+
+user-configured-html: \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+user-configured-pdf: \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+user-configured-ps: \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+user-configured: \
+user-configured-html \
+user-configured-pdf \
+user-configured-ps
+
+devref-configured-html: \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-configured-pdf: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-configured-ps: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+devref-configured: \
+devref-configured-html \
+devref-configured-pdf \
+devref-configured-ps
+
+user-all: user user-configured
+devref-all: devref devref-configured
+
+world: user-all devref-all
+
+# Installation: all the distributed *core* docs, as well as
+# the distributed docs for all the *enabled* language interfaces.
+
+if BUILD_C_INTERFACE
+
+INSTALL_C_INTERFACE_HTML_DOCS = $(USER_C_INTERFACE_HTML_MANUAL)
+INSTALL_C_INTERFACE_PDF_DOCS = $(USER_C_INTERFACE_PDF_MANUAL)
+INSTALL_C_INTERFACE_PS_DOCS = $(USER_C_INTERFACE_PS_MANUAL)
+
+endif BUILD_C_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+
+INSTALL_JAVA_INTERFACE_HTML_DOCS = $(USER_JAVA_INTERFACE_HTML_MANUAL)
+INSTALL_JAVA_INTERFACE_PDF_DOCS = $(USER_JAVA_INTERFACE_PDF_MANUAL)
+INSTALL_JAVA_INTERFACE_PS_DOCS = $(USER_JAVA_INTERFACE_PS_MANUAL)
+
+endif BUILD_JAVA_INTERFACE
+
+if BUILD_OCAML_INTERFACE
+
+INSTALL_OCAML_INTERFACE_HTML_DOCS = $(USER_OCAML_INTERFACE_HTML_MANUAL)
+INSTALL_OCAML_INTERFACE_PDF_DOCS = $(USER_OCAML_INTERFACE_PDF_MANUAL)
+INSTALL_OCAML_INTERFACE_PS_DOCS = $(USER_OCAML_INTERFACE_PS_MANUAL)
+
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+INSTALL_PROLOG_INTERFACE_HTML_DOCS = $(USER_PROLOG_INTERFACE_HTML_MANUAL)
+INSTALL_PROLOG_INTERFACE_PDF_DOCS = $(USER_PROLOG_INTERFACE_PDF_MANUAL)
+INSTALL_PROLOG_INTERFACE_PS_DOCS = $(USER_PROLOG_INTERFACE_PS_MANUAL)
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+INSTALL_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(INSTALL_C_INTERFACE_HTML_DOCS) \
+$(INSTALL_JAVA_INTERFACE_HTML_DOCS) \
+$(INSTALL_OCAML_INTERFACE_HTML_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_HTML_DOCS)
+
+INSTALL_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(INSTALL_C_INTERFACE_PDF_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PDF_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PDF_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PDF_DOCS)
+
+INSTALL_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(INSTALL_C_INTERFACE_PS_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PS_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PS_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PS_DOCS)
+
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+
+if BUILD_DOCUMENTATION
+
+CONTINUE_IF_NO_DOC = true
+
+else !BUILD_DOCUMENTATION
+
+CONTINUE_IF_NO_DOC = continue
+
+endif !BUILD_DOCUMENTATION
+
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ test -f $$ball || test -f $(srcdir)/$$ball \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$ball; \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+ if test -d $$dir/ocamldoc; then \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir/ocamldoc; \
+ for file in $$dir/ocamldoc/*; do \
+ $(INSTALL_DATA) $$file \
+ $(DESTDIR)$(htmldir)/$$dir/ocamldoc/`basename $$file`; \
+ done; \
+ fi; \
+ for file in $$dir/*; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+ done; \
+ done
+
+installdirs-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+uninstall-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
+ for file in $(INSTALL_PDF_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+ $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+ done
+
+installdirs-pdf:
+ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+ for file in $(INSTALL_PDF_DOCS); do \
+ rm -f $(DESTDIR)$(pdfdir)/$$file; \
+ done
+
+# Installation and uninstallation of PostScript documentation.
+# The PostScript documentation is obtained from the PDF one;
+# the dependency is needed so as to make sure the PDF documentation
+# is fully built before the conversion is performed.
+install-ps: install-pdf
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+ for file in $(INSTALL_PS_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+ $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+ done
+
+installdirs-ps:
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+ for file in $(INSTALL_PS_DOCS); do \
+ rm -f $(DESTDIR)$(psdir)/$$file; \
+ done
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+ $(mkinstalldirs) $(DESTDIR)$(txtdir)
+ for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+ done
+ for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+ $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+installdirs-txt:
+ $(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+ rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+ for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+ rm -f $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir \
+user-configured-c-interface.latex-dir \
+devref-configured-c-interface.latex-dir \
+user-configured-prolog-interface.latex-dir \
+devref-configured-prolog-interface.latex-dir \
+user-configured-ocaml-interface.latex-dir \
+devref-configured-ocaml-interface.latex-dir \
+user-configured-java-interface.latex-dir \
+devref-configured-java-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) user.doxyconf-latex
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) devref.doxyconf-latex
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+ $(TEX_ENV) make -C user.latex-dir refman.pdf \
+ && mv -f user.latex-dir/refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+ $(TEX_ENV) make -C devref.latex-dir refman.pdf \
+ && mv -f devref.latex-dir/refman.pdf $@
+
+$(USER_CORE_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) user.doxyconf-html
+
+$(DEVREF_CORE_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) devref.doxyconf-html
+
+############################################################################
+
+##### Configuration Independent Language Interface Targets #####
+
+SED_HTML_OPTION = -f $(srcdir)/interfaces-html.sed
+SED_LATEX_OPTION = -f $(srcdir)/interfaces-latex.sed
+
+SED_USER_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html|'
+
+SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html|'
+
+SED_USER_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+SED_DEVREF_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+# C Language Interface Targets
+
+SED_C_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/C/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/c-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox
+
+SED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+user-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-latex
+
+devref-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex
+
+ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+ $(TEX_ENV) make -C user-c-interface.latex-dir refman.pdf \
+ && mv -f user-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+ $(TEX_ENV) make -C devref-c-interface.latex-dir refman.pdf \
+ && mv -f devref-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html
+
+ppl-devref-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html
+
+# (System Independent) Prolog Language Interface Targets
+
+SED_PROLOG_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Prolog/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/prolog-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+user-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-latex
+
+devref-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex
+
+ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+ $(TEX_ENV) make -C user-prolog-interface.latex-dir refman.pdf \
+ && mv -f user-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+ $(TEX_ENV) make -C devref-prolog-interface.latex-dir refman.pdf \
+ && mv -f devref-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html
+
+ppl-devref-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf > \
+ Doxyfile.devref-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html
+
+# OCaml Language Interface Targets
+
+SED_OCAML_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/OCaml/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/ocaml-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+OCAMLDOC_HTML_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml -html
+
+OCAMLDOC_LATEX_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml \
+-latex -noheader -notrailer -notoc
+
+user-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf > \
+ Doxyfile.user-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+devref-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C user-ocaml-interface.latex-dir refman.pdf \
+ && mv -f user-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C devref-ocaml-interface.latex-dir refman.pdf \
+ && mv -f devref-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-devref-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+# Java Language Interface Targets
+
+SED_JAVA_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Java/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/java-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_JAVA_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library
+
+SED_JAVA_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common.cc \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_defs.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_inlines.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_globals.cc
+
+user-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-latex
+
+devref-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex
+
+ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+ $(TEX_ENV) make -C user-java-interface.latex-dir refman.pdf \
+ && mv -f user-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+ $(TEX_ENV) make -C devref-java-interface.latex-dir refman.pdf \
+ && mv -f devref-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html
+
+ppl-devref-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html
+
+############################################################################
+
+##### Configuration Dependent Language Interface Targets #####
+
+# Configuration-Dependent C Language Interface Targets
+if BUILD_C_INTERFACE
+
+SED_CONFIGURED_C_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured C/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/configured-c-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/C/C_interface.dox \
+../interfaces/C/ppl_c.h
+
+SED_CONFIGURED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/C/C_interface.dox \
+../interfaces/C/ppl_c.h \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+# FIXME add generated files
+
+user-configured-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-c-interface.tex
+ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-latex
+
+devref-configured-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-c-interface.tex
+ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex
+
+ppl-user-configured-c-interface- at VERSION@.pdf: \
+user-configured-c-interface.latex-dir
+ $(TEX_ENV) make -C user-configured-c-interface.latex-dir refman.pdf \
+ && mv -f user-configured-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-c-interface- at VERSION@.pdf: \
+devref-configured-c-interface.latex-dir
+ $(TEX_ENV) make -C devref-configured-c-interface.latex-dir refman.pdf \
+ && mv -f devref-configured-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-c-interface.tex
+ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html
+
+ppl-devref-configured-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-c-interface.tex
+ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html
+
+endif BUILD_C_INTERFACE
+
+# Configuration-Dependent Prolog Language Interface Targets
+if BUILD_SOME_PROLOG_INTERFACES
+
+SED_CONFIGURED_PROLOG_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Prolog/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/configured-prolog-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_configured_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_CONFIGURED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_configured_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+# FIXME: add appropriate generated files.
+
+user-configured-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-prolog-interface.tex
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-latex
+
+devref-configured-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-prolog-interface.tex
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex
+
+ppl-user-configured-prolog-interface- at VERSION@.pdf: \
+user-configured-prolog-interface.latex-dir
+ $(TEX_ENV) make -C user-configured-prolog-interface.latex-dir \
+ refman.pdf \
+ && mv -f user-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-prolog-interface- at VERSION@.pdf: \
+devref-configured-prolog-interface.latex-dir
+ $(TEX_ENV) make -C devref-configured-prolog-interface.latex-dir \
+ refman.pdf \
+ && mv -f devref-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-prolog-interface.tex
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html
+
+ppl-devref-configured-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-prolog-interface.tex
+ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+# Configuration-Dependent OCaml Language Interface Targets
+if BUILD_OCAML_INTERFACE
+
+SED_CONFIGURED_OCAML_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured OCaml/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/configured-ocaml-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_CONFIGURED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_CONFIGURED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+user-configured-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-ocaml-interface.tex
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ ../interfaces/OCaml/ppl_ocaml.mli
+
+devref-configured-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-ocaml-interface.tex
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ ../interfaces/OCaml/ppl_ocaml.mli
+
+ppl-user-configured-ocaml-interface- at VERSION@.pdf: \
+user-configured-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C user-configured-ocaml-interface.latex-dir \
+ refman.pdf \
+ && mv -f user-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-ocaml-interface- at VERSION@.pdf: \
+devref-configured-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C devref-configured-ocaml-interface.latex-dir \
+ refman.pdf \
+ && mv -f devref-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-ocaml-interface.tex
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ ../interfaces/OCaml/ppl_ocaml.mli
+
+ppl-devref-configured-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-ocaml-interface.tex
+ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ ../interfaces/OCaml/ppl_ocaml.mli
+
+endif BUILD_OCAML_INTERFACE
+
+# Configuration-Dependent Java Language Interface Targets
+if BUILD_JAVA_INTERFACE
+
+SED_CONFIGURED_JAVA_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Java/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/configured-java-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_JAVA_INPUT_USER = \
+$(SED_JAVA_INPUT_USER) \
+../interfaces/Java/parma_polyhedra_library
+
+SED_CONFIGURED_JAVA_INPUT_DEVREF = \
+$(SED_JAVA_INPUT_DEVREF) \
+../interfaces/Java/parma_polyhedra_library
+# FIXME add generated files
+
+# NOTE: as an exception to the common policy,
+# for the user-configured-java case we override the setting
+# for Doxygen configuration variables HIDE_UNDOC_MEMBERS (set to NO)
+# and EXCLUDE (set to Fake_Class_for_Doxygen.java)
+
+user-configured-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-java-interface.tex
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-java-interface-latex
+ echo "HIDE_UNDOC_MEMBERS = NO" \
+ >> Doxyfile.user-configured-java-interface-latex
+ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ >> Doxyfile.user-configured-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-latex
+
+devref-configured-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-java-interface.tex
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-java-interface-latex
+ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ >> Doxyfile.devref-configured-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-latex
+
+ppl-user-configured-java-interface- at VERSION@.pdf: \
+user-configured-java-interface.latex-dir
+ $(TEX_ENV) make -C user-configured-java-interface.latex-dir \
+ refman.pdf \
+ && mv -f user-configured-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-java-interface- at VERSION@.pdf: \
+devref-configured-java-interface.latex-dir
+ $(TEX_ENV) make -C devref-configured-java-interface.latex-dir \
+ refman.pdf \
+ && mv -f devref-configured-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-configured-java-interface.tex
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-configured-java-interface-html
+ echo "HIDE_UNDOC_MEMBERS = NO" \
+ >> Doxyfile.user-configured-java-interface-html
+ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ >> Doxyfile.user-configured-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-html
+
+ppl-devref-configured-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-configured-java-interface.tex
+ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-configured-java-interface-html
+ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ >> Doxyfile.devref-configured-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-html
+
+endif BUILD_JAVA_INTERFACE
+
+############################################################################
+
+# Ad-hoc rules for distributed HTML manuals.
+# These follow the guidelines of Section 27.5 of the Automake manual
+# (distributed files should never depend upon non-distributed built files).
+
+$(USER_CORE_HTML_MANUAL): user.doxyconf-html $(USER_CORE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_CORE_HTML_DIR)
+ tar c $(USER_CORE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_C_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_C_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_C_INTERFACE_HTML_DIR)
+ tar c $(USER_C_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_PROLOG_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_PROLOG_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_PROLOG_INTERFACE_HTML_DIR)
+ tar c $(USER_PROLOG_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_OCAML_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_OCAML_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_OCAML_INTERFACE_HTML_DIR)
+ tar c $(USER_OCAML_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_JAVA_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_JAVA_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_JAVA_INTERFACE_HTML_DIR)
+ tar c $(USER_JAVA_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+############################################################################
+
+%.tar: %
+ tar cf $@ $<
+
+%.gz: %
+ gzip --best --force $<
+
+%.pdf: %.tex
+ $(TEX_ENV) pdflatex $<
+
+%.ps: %.pdf
+ pdftops $< $@
+
+EXTRA_DIST= \
+$(BIBLIOGRAPHIES) \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+README.doc \
+bugseng_logo.pdf \
+devref-language-interface.tex \
+devref.tex \
+fdl.tex \
+gpl.tex \
+interfaces-html.sed \
+interfaces-latex.sed \
+ppl.sty \
+ppl_logo.pdf \
+ppl_logo_no_ppl.pdf \
+user-language-interface.tex \
+user.tex
+
+GENERATED_LATEX_HEADER_FILES = \
+devref-configured-c-interface.tex \
+devref-configured-java-interface.tex \
+devref-configured-ocaml-interface.tex \
+devref-configured-prolog-interface.tex \
+devref-c-interface.tex \
+devref-java-interface.tex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.tex \
+user-configured-c-interface.tex \
+user-configured-java-interface.tex \
+user-configured-ocaml-interface.tex \
+user-configured-prolog-interface.tex \
+user-c-interface.tex \
+user-java-interface.tex \
+user-ocaml-interface.tex \
+user-prolog-interface.tex
+
+mostlyclean-local:
+ rm -rf $(HTML_DIRS) $(LATEX_DIRS) $(NONDIST_MANUALS) *.aux *.log
+ rm -rf $(GENERATED_LATEX_HEADER_FILES) Doxyfile.*
+
+CLEANFILES = \
+$(USER_CORE_HTML_DIR).tag \
+$(DEVREF_CORE_HTML_DIR).tag
+
+../src/ppl_include_files.hh:
+ $(MAKE) $(AM_MAKEFLAGS) -C ../src ppl_include_files.hh
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..ac9d8d0
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,2354 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(srcdir)/user.doxyconf-latex.in \
+ $(srcdir)/devref.doxyconf-latex.in \
+ $(srcdir)/user.doxyconf-html.in \
+ $(srcdir)/devref.doxyconf-html.in \
+ $(srcdir)/user-language-interface.doxyconf.in \
+ $(srcdir)/devref-language-interface.doxyconf.in \
+ $(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \
+ user.doxyconf-html devref.doxyconf-html \
+ user-language-interface.doxyconf \
+ devref-language-interface.doxyconf
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(dist_man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+
+# All the documentation in docdir.
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = $(docdir)
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = $(docdir)
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = $(docdir)
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+txtdir = $(docdir)
+DOXYGEN = doxygen
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+BIBLIOGRAPHIES = \
+ppl.bib \
+ppl_citations.bib
+
+
+##### Library Core Manuals (C++ Interface) #####
+USER_CORE_HTML_MANUAL = ppl-user- at VERSION@-html.tar.gz
+DEVREF_CORE_HTML_MANUAL = ppl-devref- at VERSION@-html.tar.gz
+USER_CORE_PDF_MANUAL = ppl-user- at VERSION@.pdf
+DEVREF_CORE_PDF_MANUAL = ppl-devref- at VERSION@.pdf
+USER_CORE_PS_MANUAL = ppl-user- at VERSION@.ps.gz
+DEVREF_CORE_PS_MANUAL = ppl-devref- at VERSION@.ps.gz
+USER_CORE_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_CORE_HTML_DIR = ppl-devref- at VERSION@-html
+
+# NOTE: this variable is used to record Makefile dependencies.
+# The file path is that of the source directory.
+DOX_LICENSE_FILES = \
+gpl.dox \
+fdl.dox
+
+
+# NOTE: this variable is used to populate Doxygen configuration tag INPUT.
+# The file path is that of the build directory, hence we cannot use
+# variable DOX_LICENSE_FILES defined above.
+DOX_LICENSE_INPUT = \
+$(srcdir)/gpl.dox \
+$(srcdir)/fdl.dox
+
+DOX_FILES = \
+$(DOX_LICENSE_FILES) \
+definitions.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+../src/ppl_header.hh ../src/ppl_include_files.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+# C Language Interface Manuals
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@COMMON_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_C_INTERFACE_TRUE@ppl.sty \
+ at BUILD_C_INTERFACE_TRUE@../configure.ac \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_version.h.in \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_header.h \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/C_interface.dox
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.tex
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_inlines.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Configuration Dependent C Language Interface Manuals.
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_inlines.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Prolog Language Interface Manuals
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration Dependent Prolog Language Interface Manuals
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc.stamp
+
+
+# OCaml Language Interface Manuals
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common_inlines.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common.cc \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_globals.mli
+
+
+# Configuration Dependent OCaml Language Interface Manuals.
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_OCAML_INTERFACE_STUFF) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_OCAML_INTERFACE_STUFF) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+
+# Java Language Interface Manuals
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_INTERFACE_JAVA_FILES = \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/By_Reference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Complexity_Class.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Congruence.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Congruence_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Constraint.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Constraint_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Degenerate_Element.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/MIP_Problem.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Optimization_Mode.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Pair.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Partial_Function.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/PPL_Object.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Relation_Symbol.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Variables_Set.java
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES)
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common.cc \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common_defs.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common_inlines.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_globals.cc
+
+
+# Configuration Dependent Java Language Interface Manuals.
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_JAVA_INTERFACE_STUFF)
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_JAVA_INTERFACE_STUFF)
+
+
+###################################################################
+
+# Grouping of dirs and manuals.
+USER_HTML_DIRS = \
+$(USER_CORE_HTML_DIR) \
+$(USER_C_INTERFACE_HTML_DIR) \
+$(USER_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_OCAML_INTERFACE_HTML_DIR) \
+$(USER_JAVA_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+DEVREF_HTML_DIRS = \
+$(DEVREF_CORE_HTML_DIR) \
+$(DEVREF_C_INTERFACE_HTML_DIR) \
+$(DEVREF_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_JAVA_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+HTML_DIRS = $(USER_HTML_DIRS) $(DEVREF_HTML_DIRS)
+
+##### Distributed documentation #####
+DIST_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+NONDIST_MANUALS = \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+dist_man_MANS = \
+libppl.3 \
+libppl_c.3 \
+ppl-config.1
+
+
+# Installation: all the distributed *core* docs, as well as
+# the distributed docs for all the *enabled* language interfaces.
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_HTML_DOCS = $(USER_C_INTERFACE_HTML_MANUAL)
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PDF_DOCS = $(USER_C_INTERFACE_PDF_MANUAL)
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PS_DOCS = $(USER_C_INTERFACE_PS_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_HTML_DOCS = $(USER_JAVA_INTERFACE_HTML_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PDF_DOCS = $(USER_JAVA_INTERFACE_PDF_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PS_DOCS = $(USER_JAVA_INTERFACE_PS_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_HTML_DOCS = $(USER_OCAML_INTERFACE_HTML_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PDF_DOCS = $(USER_OCAML_INTERFACE_PDF_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PS_DOCS = $(USER_OCAML_INTERFACE_PS_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_HTML_DOCS = $(USER_PROLOG_INTERFACE_HTML_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_PDF_DOCS = $(USER_PROLOG_INTERFACE_PDF_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_PS_DOCS = $(USER_PROLOG_INTERFACE_PS_MANUAL)
+INSTALL_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(INSTALL_C_INTERFACE_HTML_DOCS) \
+$(INSTALL_JAVA_INTERFACE_HTML_DOCS) \
+$(INSTALL_OCAML_INTERFACE_HTML_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_HTML_DOCS)
+
+INSTALL_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(INSTALL_C_INTERFACE_PDF_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PDF_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PDF_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PDF_DOCS)
+
+INSTALL_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(INSTALL_C_INTERFACE_PS_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PS_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PS_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PS_DOCS)
+
+ at BUILD_DOCUMENTATION_FALSE@CONTINUE_IF_NO_DOC = continue
+ at BUILD_DOCUMENTATION_TRUE@CONTINUE_IF_NO_DOC = true
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir \
+user-configured-c-interface.latex-dir \
+devref-configured-c-interface.latex-dir \
+user-configured-prolog-interface.latex-dir \
+devref-configured-prolog-interface.latex-dir \
+user-configured-ocaml-interface.latex-dir \
+devref-configured-ocaml-interface.latex-dir \
+user-configured-java-interface.latex-dir \
+devref-configured-java-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+############################################################################
+
+##### Configuration Independent Language Interface Targets #####
+SED_HTML_OPTION = -f $(srcdir)/interfaces-html.sed
+SED_LATEX_OPTION = -f $(srcdir)/interfaces-latex.sed
+SED_USER_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html|'
+
+SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html|'
+
+SED_USER_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+SED_DEVREF_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+
+# C Language Interface Targets
+SED_C_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/C/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/c-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox
+
+SED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+
+# (System Independent) Prolog Language Interface Targets
+SED_PROLOG_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Prolog/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/prolog-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# OCaml Language Interface Targets
+SED_OCAML_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/OCaml/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/ocaml-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+OCAMLDOC_HTML_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml -html
+
+OCAMLDOC_LATEX_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml \
+-latex -noheader -notrailer -notoc
+
+
+# Java Language Interface Targets
+SED_JAVA_OPTION = \
+ -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+ -e 's/<PPL_SED_LANGUAGE_NAME>/Java/' \
+ -e 's/<PPL_SED_INTERFACE_NAME>/java-interface/' \
+ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_JAVA_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library
+
+SED_JAVA_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common.cc \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_defs.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_inlines.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_globals.cc
+
+
+############################################################################
+
+##### Configuration Dependent Language Interface Targets #####
+
+# Configuration-Dependent C Language Interface Targets
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_OPTION = \
+ at BUILD_C_INTERFACE_TRUE@ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_C_INTERFACE_TRUE@ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured C/' \
+ at BUILD_C_INTERFACE_TRUE@ -e 's/<PPL_SED_INTERFACE_NAME>/configured-c-interface/' \
+ at BUILD_C_INTERFACE_TRUE@ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_USER = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h
+
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_DEVREF = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+
+# Configuration-Dependent Prolog Language Interface Targets
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_OPTION = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Prolog/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's/<PPL_SED_INTERFACE_NAME>/configured-prolog-interface/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_USER = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_DEVREF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration-Dependent OCaml Language Interface Targets
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_OPTION = \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured OCaml/' \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's/<PPL_SED_INTERFACE_NAME>/configured-ocaml-interface/' \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_USER = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_DEVREF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+
+# Configuration-Dependent Java Language Interface Targets
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_OPTION = \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Java/' \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's/<PPL_SED_INTERFACE_NAME>/configured-java-interface/' \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_USER = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_USER) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library
+
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_DEVREF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_DEVREF) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library
+
+EXTRA_DIST = \
+$(BIBLIOGRAPHIES) \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+README.doc \
+bugseng_logo.pdf \
+devref-language-interface.tex \
+devref.tex \
+fdl.tex \
+gpl.tex \
+interfaces-html.sed \
+interfaces-latex.sed \
+ppl.sty \
+ppl_logo.pdf \
+ppl_logo_no_ppl.pdf \
+user-language-interface.tex \
+user.tex
+
+GENERATED_LATEX_HEADER_FILES = \
+devref-configured-c-interface.tex \
+devref-configured-java-interface.tex \
+devref-configured-ocaml-interface.tex \
+devref-configured-prolog-interface.tex \
+devref-c-interface.tex \
+devref-java-interface.tex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.tex \
+user-configured-c-interface.tex \
+user-configured-java-interface.tex \
+user-configured-ocaml-interface.tex \
+user-configured-prolog-interface.tex \
+user-c-interface.tex \
+user-java-interface.tex \
+user-ocaml-interface.tex \
+user-prolog-interface.tex
+
+CLEANFILES = \
+$(USER_CORE_HTML_DIR).tag \
+$(DEVREF_CORE_HTML_DIR).tag
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-language-interface.doxyconf: $(top_builddir)/config.status $(srcdir)/user-language-interface.doxyconf.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-language-interface.doxyconf: $(top_builddir)/config.status $(srcdir)/devref-language-interface.doxyconf.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(dist_man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-man3: $(dist_man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(dist_man_MANS)'; \
+ test -n "$(man3dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.3[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man3:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man3dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.3[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(MANS)
+installdirs: installdirs-local
+ for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1 install-man3
+
+install-pdf-am:
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-man
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am \
+ install-data-local install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-man1 install-man3 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-local maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-local pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-local uninstall-man uninstall-man1 \
+ uninstall-man3
+
+
+##### Build Targets #####
+
+# Do nothing by default.
+all:
+
+user-html: \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+user-pdf: \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+user-ps: \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+user: user-html user-pdf user-ps
+
+devref-html: \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-pdf: \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-ps: \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL)
+
+devref: devref-html devref-pdf devref-ps
+
+user-configured-html: \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+user-configured-pdf: \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+user-configured-ps: \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+user-configured: \
+user-configured-html \
+user-configured-pdf \
+user-configured-ps
+
+devref-configured-html: \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-configured-pdf: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-configured-ps: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+devref-configured: \
+devref-configured-html \
+devref-configured-pdf \
+devref-configured-ps
+
+user-all: user user-configured
+devref-all: devref devref-configured
+
+world: user-all devref-all
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ test -f $$ball || test -f $(srcdir)/$$ball \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$ball; \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+ if test -d $$dir/ocamldoc; then \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir/ocamldoc; \
+ for file in $$dir/ocamldoc/*; do \
+ $(INSTALL_DATA) $$file \
+ $(DESTDIR)$(htmldir)/$$dir/ocamldoc/`basename $$file`; \
+ done; \
+ fi; \
+ for file in $$dir/*; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+ done; \
+ done
+
+installdirs-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+uninstall-html:
+ for ball in $(INSTALL_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
+ for file in $(INSTALL_PDF_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+ $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+ done
+
+installdirs-pdf:
+ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+ for file in $(INSTALL_PDF_DOCS); do \
+ rm -f $(DESTDIR)$(pdfdir)/$$file; \
+ done
+
+# Installation and uninstallation of PostScript documentation.
+# The PostScript documentation is obtained from the PDF one;
+# the dependency is needed so as to make sure the PDF documentation
+# is fully built before the conversion is performed.
+install-ps: install-pdf
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+ for file in $(INSTALL_PS_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file \
+ || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+ $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+ done
+
+installdirs-ps:
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+ for file in $(INSTALL_PS_DOCS); do \
+ rm -f $(DESTDIR)$(psdir)/$$file; \
+ done
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+ $(mkinstalldirs) $(DESTDIR)$(txtdir)
+ for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+ done
+ for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+ $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+installdirs-txt:
+ $(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+ rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+ for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+ rm -f $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) user.doxyconf-latex
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) devref.doxyconf-latex
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+ $(TEX_ENV) make -C user.latex-dir refman.pdf \
+ && mv -f user.latex-dir/refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+ $(TEX_ENV) make -C devref.latex-dir refman.pdf \
+ && mv -f devref.latex-dir/refman.pdf $@
+
+$(USER_CORE_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) user.doxyconf-html
+
+$(DEVREF_CORE_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) devref.doxyconf-html
+
+user-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-latex
+
+devref-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-c-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex
+
+ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+ $(TEX_ENV) make -C user-c-interface.latex-dir refman.pdf \
+ && mv -f user-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+ $(TEX_ENV) make -C devref-c-interface.latex-dir refman.pdf \
+ && mv -f devref-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html
+
+ppl-devref-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_C_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-c-interface.tex
+ $(SED) $(SED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-c-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html
+
+user-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-latex
+
+devref-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-prolog-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex
+
+ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+ $(TEX_ENV) make -C user-prolog-interface.latex-dir refman.pdf \
+ && mv -f user-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+ $(TEX_ENV) make -C devref-prolog-interface.latex-dir refman.pdf \
+ && mv -f devref-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html
+
+ppl-devref-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_PROLOG_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-prolog-interface.tex
+ $(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf > \
+ Doxyfile.devref-prolog-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html
+
+user-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf > \
+ Doxyfile.user-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+devref-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-ocaml-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-latex
+ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C user-ocaml-interface.latex-dir refman.pdf \
+ && mv -f user-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+ $(TEX_ENV) make -C devref-ocaml-interface.latex-dir refman.pdf \
+ && mv -f devref-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-devref-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_OCAML_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-ocaml-interface.tex
+ $(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-ocaml-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html
+ mkdir $@/ocamldoc
+ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+user-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-latex
+
+devref-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-java-interface-latex
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex
+
+ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+ $(TEX_ENV) make -C user-java-interface.latex-dir refman.pdf \
+ && mv -f user-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+ $(TEX_ENV) make -C devref-java-interface.latex-dir refman.pdf \
+ && mv -f devref-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/user-language-interface.tex \
+ > user-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+ user-language-interface.doxyconf \
+ > Doxyfile.user-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html
+
+ppl-devref-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ rm -rf $@
+ $(SED) $(SED_JAVA_OPTION) \
+ $(srcdir)/devref-language-interface.tex \
+ > devref-java-interface.tex
+ $(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+ devref-language-interface.doxyconf \
+ > Doxyfile.devref-java-interface-html
+ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html
+# FIXME add generated files
+
+ at BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(USER_CONFIGURED_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ > user-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ at BUILD_C_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@ > Doxyfile.user-configured-c-interface-latex
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-latex
+
+ at BUILD_C_INTERFACE_TRUE@devref-configured-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ > devref-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ at BUILD_C_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@ > Doxyfile.devref-configured-c-interface-latex
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.pdf: \
+ at BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) make -C user-configured-c-interface.latex-dir refman.pdf \
+ at BUILD_C_INTERFACE_TRUE@ && mv -f user-configured-c-interface.latex-dir/refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.pdf: \
+ at BUILD_C_INTERFACE_TRUE@devref-configured-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) make -C devref-configured-c-interface.latex-dir refman.pdf \
+ at BUILD_C_INTERFACE_TRUE@ && mv -f devref-configured-c-interface.latex-dir/refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(USER_CONFIGURED_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ > user-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ at BUILD_C_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@ > Doxyfile.user-configured-c-interface-html
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ > devref-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ at BUILD_C_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@ > Doxyfile.devref-configured-c-interface-html
+ at BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html
+# FIXME: add appropriate generated files.
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > user-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > Doxyfile.user-configured-prolog-interface-latex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-latex
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-configured-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > devref-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > Doxyfile.devref-configured-prolog-interface-latex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.pdf: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) make -C user-configured-prolog-interface.latex-dir \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ refman.pdf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ && mv -f user-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.pdf: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-configured-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) make -C devref-configured-prolog-interface.latex-dir \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ refman.pdf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ && mv -f devref-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > user-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > Doxyfile.user-configured-prolog-interface-html
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > devref-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ > Doxyfile.devref-configured-prolog-interface-html
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_CONFIGURED_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ > user-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@ > Doxyfile.user-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@devref-configured-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ > devref-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@ > Doxyfile.devref-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.pdf: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) make -C user-configured-ocaml-interface.latex-dir \
+ at BUILD_OCAML_INTERFACE_TRUE@ refman.pdf \
+ at BUILD_OCAML_INTERFACE_TRUE@ && mv -f user-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.pdf: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-configured-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) make -C devref-configured-ocaml-interface.latex-dir \
+ at BUILD_OCAML_INTERFACE_TRUE@ refman.pdf \
+ at BUILD_OCAML_INTERFACE_TRUE@ && mv -f devref-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_CONFIGURED_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ > user-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@ > Doxyfile.user-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@ mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ at BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ > devref-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@ > Doxyfile.devref-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@ mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@ $(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ at BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli
+# FIXME add generated files
+
+# NOTE: as an exception to the common policy,
+# for the user-configured-java case we override the setting
+# for Doxygen configuration variables HIDE_UNDOC_MEMBERS (set to NO)
+# and EXCLUDE (set to Fake_Class_for_Doxygen.java)
+
+ at BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_CONFIGURED_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ > user-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@ > Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "HIDE_UNDOC_MEMBERS = NO" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-latex
+
+ at BUILD_JAVA_INTERFACE_TRUE@devref-configured-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ > devref-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@ > Doxyfile.devref-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.devref-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-latex
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.pdf: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) make -C user-configured-java-interface.latex-dir \
+ at BUILD_JAVA_INTERFACE_TRUE@ refman.pdf \
+ at BUILD_JAVA_INTERFACE_TRUE@ && mv -f user-configured-java-interface.latex-dir/refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.pdf: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-configured-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) make -C devref-configured-java-interface.latex-dir \
+ at BUILD_JAVA_INTERFACE_TRUE@ refman.pdf \
+ at BUILD_JAVA_INTERFACE_TRUE@ && mv -f devref-configured-java-interface.latex-dir/refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_CONFIGURED_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ > user-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@ user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@ > Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "HIDE_UNDOC_MEMBERS = NO" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ > devref-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@ -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@ devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@ > Doxyfile.devref-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.devref-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-html
+
+############################################################################
+
+# Ad-hoc rules for distributed HTML manuals.
+# These follow the guidelines of Section 27.5 of the Automake manual
+# (distributed files should never depend upon non-distributed built files).
+
+$(USER_CORE_HTML_MANUAL): user.doxyconf-html $(USER_CORE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_CORE_HTML_DIR)
+ tar c $(USER_CORE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_C_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_C_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_C_INTERFACE_HTML_DIR)
+ tar c $(USER_C_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_PROLOG_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_PROLOG_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_PROLOG_INTERFACE_HTML_DIR)
+ tar c $(USER_PROLOG_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_OCAML_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_OCAML_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_OCAML_INTERFACE_HTML_DIR)
+ tar c $(USER_OCAML_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_JAVA_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_JAVA_INTERFACE_STUFF)
+ $(MAKE) $(AM_MAKEFLAGS) $(USER_JAVA_INTERFACE_HTML_DIR)
+ tar c $(USER_JAVA_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+############################################################################
+
+%.tar: %
+ tar cf $@ $<
+
+%.gz: %
+ gzip --best --force $<
+
+%.pdf: %.tex
+ $(TEX_ENV) pdflatex $<
+
+%.ps: %.pdf
+ pdftops $< $@
+
+mostlyclean-local:
+ rm -rf $(HTML_DIRS) $(LATEX_DIRS) $(NONDIST_MANUALS) *.aux *.log
+ rm -rf $(GENERATED_LATEX_HEADER_FILES) Doxyfile.*
+
+../src/ppl_include_files.hh:
+ $(MAKE) $(AM_MAKEFLAGS) -C ../src ppl_include_files.hh
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/README.doc b/doc/README.doc
new file mode 100644
index 0000000..1c86a95
--- /dev/null
+++ b/doc/README.doc
@@ -0,0 +1,167 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+How To Get (More) PPL Documentation
+===================================
+
+Do you have all the documentation you need? If you don't or if you are
+unsure, the following is for you.
+
+There are two versions of the Parma Polyhedra Library's documentation:
+
+ + a `user' manual, containing all and only the information needed by
+ people wishing to use the library;
+ + a `devref' (developer reference) manual, also containing details
+ about the library implementation.
+
+Each of these versions can be obtained in several formats:
+
+ + a PDF file suitable for browsing on the screen;
+ + a (gzipped) PostScript file suitable for printing;
+ + a (tarred and gzipped) collection of HTML pages suitable for browsing.
+
+
+The Documentation You May Already Have
+======================================
+
+First of all, you may already have some documentation and all you need
+to do is to find it.
+
+If you have downloaded a source (tar or zip) archive for PPL version
+X.Y.Z, you will find in the doc subdirectory the following set of user
+manuals:
+
+ ppl-user-X.Y.Z.pdf
+ ppl-user-X.Y.Z.ps.gz
+
+If you have installed a binary RPM package, then you have the same set
+of manuals. You can find them with the command `rpm -ql ppl' which
+will print, among other things, something like
+
+ /usr/share/doc/ppl-X.Y.Z
+ /usr/share/doc/ppl-X.Y.Z/README
+ /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.pdf
+ /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.ps.gz
+
+
+The Documentation You May Download
+==================================
+
+If you are using the latest released version of the library, you will
+find all the documentation in all formats at
+http://bugseng.com/products/ppl/Documentation/ .
+
+
+The Documentation You May Build Yourself
+========================================
+
+When all else fails (which is the case, for example, when you are
+using a Git version [1]) then you may build the documentation by
+yourself. In order to do that, you should have a recent version of
+Doxygen [2] and, if you want to build the HTML documentation, a recent
+version of Graphviz [3]. When you have all the tools installed and
+running, you should follow the following procedure.
+
+First, you should determine which version of the library you are
+working with. The safest way is to go to the top source directory of
+the library and to locate the unique line in the file configure.ac
+containing the string "AC_INIT". This will look like
+
+ AC_INIT([the Parma Polyhedra Library], 0.6.3pre4, ppl-devel at cs.unipr.it, ppl)
+
+from which you determine that the version is 0.6.3pre4 (a.k.a. the 4th
+beta version before release 0.6.3).
+
+Then, if you have not yet done it, build the library itself (see the
+building instructions in the file INSTALL [4] in the top source
+directory. The default build process, while essential in order to
+produce the documentation, will not generate it directly. For this
+reason you should go to the doc subdirectory of your build directory
+(i.e., the one where you compiled the library) and build all the
+documents you want by executing a command of the form
+
+ make doc1 doc2 ...
+
+Here, doc1, doc2 and so forth are the names of the documents to be built.
+Document names may be obtained from the following list by replacing
+X.Y.Z with the version number you have already determined, and by
+replacing KIND with either `user' or `devref':
+
+ ppl-KIND-X.Y.Z.pdf
+ ppl-KIND-X.Y.Z.ps.gz
+ ppl-KIND-X.Y.Z-html.tar.gz
+
+For example, the command
+
+ make ppl-user-0.6.3pre4.pdf ppl-devref-0.6.3pre4.pdf
+
+will build both kinds of manuals in a PDF format. Alternatively, the
+command `make world' will build all the available documentation in all
+of the above formats.
+
+It is possible that, while compiling some PostScript or PDF
+documentation, TeX dies with a "TeX capacity exceeded" error
+message. The error should contain the indication of the TeX buffer
+whose capacity has been exceeded, e.g.:
+
+ ! TeX capacity exceeded, sorry [save size=5000].
+
+You then need to edit the TeX configuration file that defines the
+buffer sizes so as to increase the value of the relevant buffer.
+Note: the actual name and location of the configuration file will vary
+depending on the available TeX distribution: possible names include
+texmf.cnf, texmf.cfg and 20sizes.cnf. Continuing our example, we can
+double save_size by editing the configuration file so that the
+relevant line becomes
+
+ save_size = 10000 % for saving values outside current group
+
+Any change to such configuration files should be followed by running
+a command like
+
+ texconfig init
+
+for the change to become effective (on some systems the `texconfig-sys'
+command should be used to configure TeX system-wide).
+
+--------
+
+[1] http://bugseng.com/products/ppl/Download/Git
+[2] http://www.doxygen.org/
+[3] http://www.research.att.com/sw/tools/graphviz/
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/doc/bugseng_logo.pdf b/doc/bugseng_logo.pdf
new file mode 100644
index 0000000..f6aaf87
Binary files /dev/null and b/doc/bugseng_logo.pdf differ
diff --git a/doc/definitions.dox b/doc/definitions.dox
new file mode 100644
index 0000000..6565e52
--- /dev/null
+++ b/doc/definitions.dox
@@ -0,0 +1,5028 @@
+// Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+// Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+//
+// This document describes the Parma Polyhedra Library (PPL).
+//
+// Permission is granted to copy, distribute and/or modify this document
+// under the terms of the GNU Free Documentation License, Version 1.2
+// or any later version published by the Free Software Foundation;
+// with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+// The license is included, in various formats, in the `doc' subdirectory
+// of each distribution of the PPL in files named `fdl.*'.
+//
+// The PPL is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3 of the License, or (at your
+// option) any later version. The license is included, in various
+// formats, in the `doc' subdirectory of each distribution of the PPL in
+// files named `gpl.*'.
+//
+// The PPL is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// If you have not received a copy of one or both the above mentioned
+// licenses along with the PPL, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+//
+// For the most up-to-date information see the Parma Polyhedra Library
+// site: http://bugseng.com/products/ppl/ .
+
+
+/*!
+ \defgroup PPL_CXX_interface C++ Language Interface
+ \brief
+ The core implementation of the Parma Polyhedra Library
+ is written in C++.
+
+ See Namespace, Hierarchical and Compound indexes
+ for additional information about each single data type.
+*/
+
+/*! \mainpage General Information on the PPL
+\section preamble The Main Features
+
+The Parma Polyhedra Library (PPL) is a modern C++ library for the
+manipulation of numerical information that can be represented by
+points in some \f$n\f$-dimensional vector space. For instance, one of
+the key domains the PPL supports is that of rational convex polyhedra
+(Section \ref convex_polys). Such domains
+are employed in several systems for the analysis and verification of
+hardware and software components, with applications spanning
+imperative, functional and logic programming languages, synchronous
+languages and synchronization protocols, real-time and hybrid systems.
+Even though the PPL library is not meant to target a particular
+problem, the design of its interface has been largely influenced by
+the needs of the above class of applications. That is the reason why
+the library implements a few operators that are more or less specific
+to static analysis applications, while lacking some other operators
+that might be useful when working, e.g., in the field of computational
+geometry.
+
+The main features of the library are the following:
+- it is user friendly:
+ you write <CODE>x + 2*y + 5*z \<= 7</CODE> when you mean it;
+- it is fully dynamic:
+ available virtual memory is the only limitation to the
+ dimension of anything;
+- it provides full support for the manipulation of convex polyhedra
+ that are not topologically closed;
+- it is written in standard C++: meant to be portable;
+- it is exception-safe: never leaks resources or leaves invalid object
+ fragments around;
+- it is rather efficient: and we hope to make it even more so;
+- it is thoroughly documented:
+ perhaps not literate programming but close enough;
+- it has interfaces to other programming languages: including C, Java, OCaml
+ and a number of Prolog systems;
+- it is free software: distributed under the terms of the
+ GNU General Public License.
+
+In the following section we describe all the domains available to the PPL user.
+More detailed descriptions of these domains and the operations provided
+will be found in subsequent sections.
+
+In the final section of this chapter (Section \ref use_of_library),
+we provide some additional advice on the use of the library.
+
+\subsection Semantic_Geometric_Descriptors Semantic Geometric Descriptors
+
+A <EM>semantic geometric descriptor</EM> is a subset of \f$ \Rset^n \f$.
+The PPL provides several classes of semantic GDs. These are
+identified by their C++ class name, together with the class template
+parameters, if any. These classes include the <EM>simple classes</EM>:
+ - \link Parma_Polyhedra_Library::C_Polyhedron \c C_Polyhedron \endlink,
+ - \link Parma_Polyhedra_Library::NNC_Polyhedron \c NNC_Polyhedron \endlink,
+ - \link Parma_Polyhedra_Library::BD_Shape \c BD_Shape\<T\> \endlink,
+ - \link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape\<T\> \endlink,
+ - \link Parma_Polyhedra_Library::Box \c Box\<ITV\> \endlink, and
+ - \link Parma_Polyhedra_Library::Grid \c Grid \endlink,
+
+where:
+ - \c T is a numeric type chosen among
+ \c mpz_class, \c mpq_class,
+ <CODE>signed char</CODE>, \c short, \c int, \c long, \c long long
+ (or any of the C99 exact width integer equivalents \c int8_t, int16_t,
+ and so forth); and
+ - \c ITV is an instance of the
+ \link Parma_Polyhedra_Library::Interval \c Interval \endlink
+ template class.
+
+Other semantic GDs, the <EM>compound classes</EM>, can be constructed
+(also recursively) from all the GDs classes.
+These include:
+ - \link Parma_Polyhedra_Library::Pointset_Powerset \c Pointset_Powerset\<PSET\> \endlink,
+ - \link Parma_Polyhedra_Library::Partially_Reduced_Product <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> \endlink,
+ .
+where \c PSET, \c D1 and \c D2 can be any semantic GD classes and \c R is the
+reduction operation to be applied to the component domains of the
+product class.
+
+A uniform set of operations is provided for creating, testing and
+maintaining each of the semantic GDs. However, as many of these
+depend on one or more syntactic GDs, we first describe the syntactic GDs.
+
+
+\subsection Syntactic_Geometric_Descriptors Syntactic Geometric Descriptors
+
+A <EM>syntactic geometric descriptor</EM> is for defining, modifying
+and inspecting a semantic GD. There are three kinds of
+<EM>syntactic GDs</EM>: <EM>basic GDs</EM>, <EM>constraint GDs</EM> and
+<EM>generator GDs</EM>.
+Some of these are <EM>generic</EM> and some <EM>specific</EM>.
+A generic syntactic GD can be used (in the appropriate context)
+with any semantic GD; clearly, different semantic GDs will usually
+provide different levels of support for the different subclasses
+of generic GDs. In contrast, the use of a specific GD may be
+restricted to apply to a given subset of the semantic GDs
+(i.e., some semantic GDs provide no support at all for them).
+
+
+\subsubsection Basic_Geometric_Descriptors Basic Geometric Descriptors
+
+The following basic GDs currently supported by the PPL are:
+ - space dimension;
+ - variable and variable set;
+ - coefficient;
+ - linear expression;
+ - relation symbol;
+ - vector point.
+
+These classes, which are all generic syntactic GDs, are used
+to build the constraint and generator GDs as
+well as support many generic operations on the semantic GDs.
+
+
+\subsubsection Constraint_Geometric_Descriptors Constraint Geometric Descriptors
+
+The PPL currently supports the following classes of \e generic constraint GDs:
+ - linear constraint;
+ - linear congruence.
+
+Each linear constraint can be further classified to belong to one or more
+of the following syntactic subclasses:
+ - inconsistent constraints (e.g., \f$0 \geq 2\f$);
+ - tautological constraints (e.g., \f$0 \leq 2\f$);
+ - interval constraints (e.g., \f$x \leq 2\f$);
+ - bounded-difference constraints (e.g., \f$x - y \leq 2\f$);
+ - octagonal constraints (e.g., \f$x + y \leq 2\f$);
+ - linear equality constraints (e.g., \f$x = 2\f$);
+ - non-strict linear inequality constraints (e.g., \f$x - 3y \leq 2\f$);
+ - strict linear inequality constraints (e.g., \f$x - 3y < 2\f$).
+
+Note that the subclasses are not disjoint.
+
+Similarly, each linear congruence can be classified to belong
+to one or more of the following syntactic subclasses:
+ - inconsistent congruences (e.g., \f$0 \equiv_2 1\f$);
+ - tautological congruences (e.g., \f$0 \equiv_2 2\f$);
+ - linear equality, i.e., non-proper congruences
+ (e.g., \f$x + 3y \equiv_0 0\f$);
+ - proper congruences (e.g., \f$x + 3y \equiv_5 0\f$).
+
+The library also supports systems, i.e., finite collections, of either
+linear constraints or linear congruences (but see the note below).
+
+Each semantic GD provides \e optimal support for some of the subclasses
+of generic syntactic GDs listed above: here, the word "optimal" means that
+the considered semantic GD computes the <em>best upward approximation</em>
+of the exact meaning of the linear constraint or congruence.
+When a semantic GD operation is applied to a syntactic GD that is not
+optimally supported, it will either indicate its unsuitability
+(e.g., by throwing an exception) or it will apply an upward approximation
+semantics (possibly not the best one).
+
+For instance, the semantic GD of topologically closed convex polyhedra
+provides optimal support for non-strict linear inequality and equality
+constraints, but it does not provide optimal support for strict inequalities.
+Some of its operations (e.g., \c add_constraint and \c add_congruence)
+will throw an exception if supplied with a non-trivial strict inequality
+constraint or a proper congruence; some other operations
+(e.g., \c refine_with_constraint or \c refine_with_congruence)
+will compute an over-approximation.
+
+Similarly, the semantic GD of rational boxes (i.e., multi-dimensional
+intervals) having integral values as interval boundaries provides optimal
+support for all interval constraints: even though the interval constraint
+\f$2x \leq 5\f$ cannot be represented exactly, it will be optimally
+approximated by the constraint \f$x \leq 3\f$.
+
+\note
+When providing an upward approximation for a constraint or congruence,
+we consider it in isolation: in particular, the approximation of each
+element of a system of GDs is independent from the other elements;
+also, the approximation is independent from the current value of
+the semantic GD.
+
+
+\subsubsection Generator_Geometric_Descriptors Generator Geometric Descriptors
+
+The PPL currently supports two classes of generator GDs:
+ - polyhedra generator: these are polyhedra points, rays and lines;
+ - grid generator: these are grid points, parameters and lines.
+
+Rays, lines and parameters are specific of the mentioned semantic GDs
+and, therefore, they cannot be used by other semantic GDs.
+In contrast, as already mentioned above, points are basic geometric
+descriptors since they are also used in <EM>generic</EM> PPL operations.
+
+
+\subsection Generic_Operations_on_Semantic_Geometric_Descriptors Generic Operations on Semantic Geometric Descriptors
+
+<OL>
+<LI>
+ Constructors of a universe or empty semantic GD with the given
+ space dimension.
+</LI>
+<LI>
+ Operations on a semantic GD that do not depend on the syntactic GDs.
+ <UL>
+ <LI>
+ <CODE>is_empty()</CODE>, <CODE>is_universe()</CODE>,
+ <CODE>is_topologically_closed()</CODE>, <CODE>is_discrete()</CODE>,
+ <CODE>is_bounded()</CODE>, <CODE>contains_integer_point()</CODE>
+
+ test for the named properties of the semantic GD.
+ </LI>
+ <LI>
+ <CODE>%total_memory_in_bytes()</CODE>,
+ <CODE>%external_memory_in_bytes()</CODE>
+
+ return the total and external memory size in bytes.
+ </LI>
+ <LI>
+ <CODE>OK()</CODE>
+
+ checks that the semantic GD has a valid internal representation.
+ (Some GDs provide this method with an optional Boolean argument
+ that, when true, requires to also check for non-emptiness.)
+ </LI>
+ <LI>
+ <CODE>space_dimension()</CODE>, <CODE>affine_dimension()</CODE>
+
+ return, respectively, the space and affine dimensions of the GD.
+ </LI>
+ <LI>
+ <CODE>add_space_dimensions_and_embed()</CODE>,
+ <CODE>add_space_dimensions_and_project()</CODE>,
+ <CODE>expand_space_dimension()</CODE>,
+ <CODE>remove_space_dimensions()</CODE>,
+ <CODE>fold_space_dimensions()</CODE>, <CODE>map_space_dimensions()</CODE>
+
+ modify the space dimensions of the semantic GD; where, depending on the
+ operation, the arguments can include the number of space dimensions
+ to be added or removed a variable or set of variables denoting the
+ actual dimensions to be used and a partial function defining a mapping
+ between the dimensions.
+ </LI>
+ <LI>
+ <CODE>contains()</CODE>, <CODE>strictly_contains()</CODE>,
+ <CODE>is_disjoint_from()</CODE>
+
+ compare the semantic GD with an argument semantic GD of the same class.
+ </LI>
+ <LI>
+ <CODE>topological_closure_assign()</CODE>,
+ <CODE>intersection_assign()</CODE>,
+ <CODE>upper_bound_assign()</CODE>, <CODE>difference_assign()</CODE>,
+ <CODE>time_elapse_assign()</CODE>, <CODE>widening_assign()</CODE>,
+ <CODE>concatenate_assign()</CODE>, <CODE>m_swap()</CODE>
+
+ modify the semantic GD, possibly with an argument semantic GD of
+ the same class.
+ </LI>
+ <LI>
+ <CODE>constrains()</CODE>, <CODE>bounds_from_above()</CODE>,
+ <CODE>bounds_from_below()</CODE>, <CODE>maximize()</CODE>,
+ <CODE>minimize()</CODE>.
+
+ These find information about the bounds of the semantic GD where
+ the argument variable or linear expression define the direction
+ of the bound.
+ </LI>
+ <LI>
+ <CODE>affine_image()</CODE>, <CODE>affine_preimage()</CODE>,
+ <CODE>generalized_affine_image()</CODE>,
+ <CODE>generalized_affine_preimage()</CODE>,
+ <CODE>bounded_affine_image()</CODE>,
+ <CODE>bounded_affine_preimage()</CODE>.
+
+ These perform several variations of the affine image and preimage
+ operations where, depending on the operation, the arguments can
+ include a variable representing the space dimension to which the
+ transformation will be applied and linear expressions
+ with possibly a relation symbol and denominator value
+ that define the exact form of the transformation.
+ </LI>
+ <LI>
+ <CODE>ascii_load()</CODE>, <CODE>ascii_dump()</CODE>
+
+ are the ascii input and output operations.
+ </UL>
+</LI>
+<LI>
+ Constructors of a semantic GD of one class from a semantic GD of any
+ other class.
+ These constructors obey an <EM>upward approximation semantics</EM>,
+ meaning that the constructed semantic GD is guaranteed to contain
+ all the points of the source semantic GD, but possibly more.
+ Some of these constructors provide a complexity parameter with which
+ the application can control the complexity/precision trade-off
+ for the construction operation: by using the complexity parameter,
+ it is possible to keep the construction operation in the polynomial
+ or the simplex worst-case complexity class, possibly incurring into
+ a further upward approximation if the precise constructor is based
+ on an algorithm having exponential complexity.
+</LI>
+<LI>
+ Constructors of a semantic GD from a constraint GD;
+ either a linear constraint system or a linear congruence system.
+ These constructors assume that the given semantic GD provides optimal
+ support for the argument syntactic GD: if that is not the case,
+ an invalid argument exception is thrown.
+</LI>
+<LI>
+ Other interaction between the semantic GDs and constraint GDs.
+ <UL>
+ <LI>
+ <CODE>add_constraint()</CODE>, <CODE>add_constraints()</CODE>,
+ <CODE>add_recycled_constraints()</CODE>,
+ <CODE>add_congruence()</CODE>, <CODE>add_congruences()</CODE>,
+ <CODE>add_recycled_congruences()</CODE>.
+
+ These methods assume that the given semantic GD provides optimal
+ support for the argument syntactic GD: if that is not the case,
+ an invalid argument exception is thrown.
+
+ For <CODE>add_recycled_constraints()</CODE> and
+ <CODE>add_recycled_congruences()</CODE>,
+ the only assumption that can be made on the constraint GD
+ after return (successful or exceptional) is that
+ it can be safely destroyed.
+ </LI>
+ <LI>
+ <CODE>refine_with_constraint()</CODE>,
+ <CODE>refine_with_constraints()</CODE>,
+ <CODE>refine_with_congruence()</CODE>,
+ <CODE>refine_with_congruences()</CODE>.
+
+ If the argument constraint GD is optimally supported by the
+ semantic GD, the methods behave the same as the corresponding
+ \c add_* methods listed above. Otherwise the constraint GD
+ is used only to a limited extent to refine the semantic GD;
+ possibly not at all. Notice that, while repeating an add operation
+ is pointless, this is not true for the refine operations.
+ For example, in those cases where
+\code
+ Semantic_GD.add_constraint(c)
+\endcode
+ raises an exception, a fragment of the form
+\code
+ Semantic_GD.refine_with_constraint(c)
+ // Other add_constraint(s) or refine_with_constraint(s) operations
+ // on Semantic_GD.
+ Semantic_GD.refine_with_constraint(c)
+\endcode
+ may give more precise results than a single
+\code
+ Semantic_GD.refine_with_constraint(c).
+ // Other add_constraint(s) or refine_with_constraint(s) operations
+ // on Semantic_GD.
+\endcode
+ </LI>
+ <LI>
+ <CODE>constraints()</CODE>, <CODE>minimized_constraints()</CODE>,
+ <CODE>congruences()</CODE>, <CODE>minimized_congruences()</CODE>.
+
+ Returns the indicated system of constraint GDs satisfied by
+ the semantic GD.
+ </LI>
+ <LI>
+ <CODE>can_recycle_constraint_systems()</CODE>,
+ <CODE>can_recycle_congruence_systems()</CODE>.
+
+ Return true if and only if the semantic GD can recycle the
+ indicated constraint GD.
+ </LI>
+ <LI>
+ <CODE>relation_with()</CODE>.
+
+ This takes a constraint GD as an argument and returns the relations holding
+ between the semantic GD and the constraint GD.
+ The possible relations are:
+ <CODE>IS_INCLUDED()</CODE>, <CODE>SATURATES()</CODE>,
+ <CODE>STRICTLY_INTERSECTS()</CODE>, <CODE>IS_DISJOINT()</CODE>
+ and <CODE>NOTHING()</CODE>.
+ This operator also can take a polyhedron generator GD as an argument
+ and returns the relation <CODE>SUBSUMES()</CODE> or <CODE>NOTHING()</CODE>
+ that holds between the generator GD and the semantic GD.
+ </LI>
+ </UL>
+</LI>
+</OL>
+
+
+\section Upward_Approximation Upward Approximation
+
+The Parma Polyhedra Library, for those cases where an exact result
+cannot be computed within the specified complexity limits, computes an
+<EM>upward approximation</EM> of the exact result. For semantic GDs this
+means that the computed result is a possibly strict superset of the set of
+points of \f$ \Rset^n \f$ that constitutes the exact result. Notice
+that the PPL does not provide direct support to compute <EM>downward
+approximations</EM> (i.e., possibly strict subsets of the exact
+results). While downward approximations can often be computed from
+upward ones, the required algorithms and the conditions upon which
+they are correct are outside the current scope of the PPL.
+Beware, in particular, of the following possible pitfall:
+the library provides methods to compute upward approximations
+of set-theoretic difference, which is antitone in its second
+argument. Applying a difference method to a second argument
+that is not an exact representation or a downward approximation of
+reality, would yield a result that, of course, is not an upward
+approximation of reality. It is the responsibility of the
+library user to provide the PPL's method with approximations of reality
+that are consistent with respect to the desired results.
+
+
+\section Approximating_Integers Approximating Integers
+
+The Parma Polyhedra Library provides support for approximating
+integer computations using the geometric descriptors it provides.
+In this section we briefly explain these facilities.
+
+
+\subsection Dropping_Non_Integer_Points Dropping Non-Integer Points
+
+When a geometric descriptor is used to approximate integer quantities,
+all the points with non-integral coordinates represent an imprecision
+of the description. Of course, removing all these points may be
+impossible (because of convexity) or too expensive. The PPL provides
+the operator <CODE>drop_some_non_integer_points</CODE> to possibly
+tighten a descriptor by dropping some points with non-integer
+coordinates, using algorithms whose complexity is bounded by
+a parameter. The set of dimensions that represent integer quantities
+can be optionally specified. It is worth to stress the role of
+<EM>some</EM> in the operator name: in general no optimality guarantee
+is provided.
+
+
+\subsection Approximating_Bounded_Integers Approximating Bounded Integers
+
+The Parma Polyhedra Library provides services that allow to compute
+correct approximations of bounded arithmetic as available in widespread
+programming languages. Supported bit-widths are 8, 16, 32 and 64 bits,
+with some limited support for 128 bits.
+Supported representations are binary unsigned and two's complement signed.
+Supported overflow behaviors are:
+<DL>
+ <DT>Wrapping:</DT>
+ <DD>
+ this means that, for a \f$w\textrm{-bit}\f$ bounded integer, the
+ computation
+ happens modulo \f$2^w\f$. In turn, this signifies that the computation
+ happens <EM>as if</EM> the unbounded arithmetic result was computed
+ and then wrapped. For unsigned integers, the wrapping function is
+ simply \f$x \bmod 2^w\f$, most conveniently defined as
+ \f[
+ \mathrm{wrap}^\mathrm{u}_w(x)
+ \defeq
+ x - 2^w \lfloor x/2^w \rfloor.
+ \f]
+ For signed integers the wrapping function is, instead,
+ \f[
+ \mathrm{wrap}^\mathrm{s}_w(x)
+ \defeq
+ \begin{cases}
+ \mathrm{wrap}^\mathrm{u}_w(x),
+ &\text{if $\mathrm{wrap}^\mathrm{u}_w(x) < 2^{w-1}$;} \\
+ \mathrm{wrap}^\mathrm{u}_w(x) - 2^w,
+ &\text{otherwise.}
+ \end{cases}
+ \f]
+ </DD>
+ <DT>Undefined:</DT>
+ <DD>
+ this means that the result of the operation resulting in an
+ overflow can take any value. This is useful to partially
+ model systems where overflow has unspecified effects on
+ the computed result.
+ Even though something more serious can happen in the system
+ being analyzed ---due to, e.g., C's undefined behavior---, here we
+ are only concerned with the results of arithmetic operations.
+ It is the responsibility of the analyzer to ensure that other
+ manifestations of undefined behavior are conservatively approximated.
+ </DD>
+ <DT>Impossible:</DT>
+ <DD>
+ this is for the analysis of languages where overflow is trapped
+ before it affects the state, for which, thus, any indication that
+ an overflow may have affected the state is necessarily due to
+ the imprecision of the analysis.
+ </DD>
+</DL>
+
+
+\subsubsection Wrapping_Operator Wrapping Operator
+
+One possibility for precisely approximating the semantics of programs that
+operate on bounded integer variables is to follow the approach described
+in \ref SK07 "[SK07]". The idea is to associate space dimensions to the
+<EM>unwrapped values</EM> of bounded variables. Suppose <CODE>j</CODE>
+is a \f$w\textrm{-bit}\f$, unsigned program variable associated to a space
+dimension
+labeled by the variable \f$x\f$. If \f$x\f$ is constrained by some
+numerical abstraction to take values in a set \f$S \sseq \Rset\f$, then
+the program variable <CODE>j</CODE> can only take values in
+\f$\bigl\{\, \mathrm{wrap}^\mathrm{u}_w(z) \bigm| z \in S \,\bigr\}\f$.
+There are two reasons why this is interesting: firstly, this allows for
+the retention of relational information by using a single numerical abstraction
+tracking multiple program variables. Secondly, the integers modulo
+\f$2^w\f$ form a ring of equivalence classes on which addition
+and multiplication are well defined. This means, e.g., that assignments
+with affine right-hand sides and involving only variables with the same
+bit-width and representation can be safely modeled by affine images.
+While upper bounds and widening can be used without any precaution,
+anything that can be reconducted to intersection requires a preliminary
+<EM>wrapping</EM> phase, where the dimensions corresponding to bounded
+integer types are brought back to their natural domain.
+This necessity arises naturally for the analysis of conditionals
+and conversion operators, as well as in the realization of domain
+combinations.
+
+The PPL provides a general wrapping operator that is parametric with
+respect to the set of space dimensions (variables) to be wrapped,
+the width, representation and overflow behavior of all these variables.
+An optional constraint system can, when given, improve the
+precision. This constraint system, which must only depend on variables
+with respect to which wrapping is performed, is assumed to represent
+the conditional or looping construct guard with respect to which
+wrapping is performed. Since wrapping requires the computation of
+upper bounds and due to non-distributivity of constraint refinement
+over upper bounds, passing a constraint system in this way can be more
+precise than refining the result of the wrapping operation afterwards.
+The general wrapping operator offered by the PPL also allows control of
+the complexity/precision ratio by means of two additional parameters:
+an unsigned integer encoding a complexity threshold, with higher values
+resulting in possibly improved precision; and a Boolean controlling
+whether space dimensions should be wrapped individually, something that
+results in much greater efficiency to the detriment of precision,
+or collectively.
+
+Note that the PPL assumes that any space dimension subject to wrapping
+is being used to capture the value of bounded integer values. As a
+consequence the library is free to drop, from the involved numerical
+abstraction, any point having a non-integer coordinate that corresponds
+to a space dimension subject to wrapping. It must be stressed that
+freedom to drop such points does not constitute an obligation to remove
+all of them (especially because this would be extraordinarily expensive
+on some numerical abstractions).
+The PPL provides operators for the more systematic
+\ref Dropping_Non_Integer_Points
+"removal of points with non-integral coordinates".
+
+The wrapping operator will only remove some of these points
+as a by-product of its main task and only when this comes at a negligible
+extra cost.
+
+
+\section convex_polys Convex Polyhedra
+
+In this section we introduce convex polyhedra,
+as considered by the library, in more detail.
+For more information about the definitions and results stated here see
+\ref BRZH02b "[BRZH02b]",
+\ref Fuk98 "[Fuk98]",
+\ref NW88 "[NW88]", and
+\ref Wil93 "[Wil93]".
+
+\subsection Vectors_Matrices_and_Scalar_Products Vectors, Matrices and Scalar Products
+
+We denote by \f$\Rset^n\f$ the \f$n\textrm{-dimensional}\f$ vector space on the field
+of real numbers \f$\Rset\f$, endowed with the standard topology.
+The set of all non-negative reals is denoted by \f$\nonnegRset\f$.
+For each \f$i \in \{0, \ldots, n-1\}\f$, \f$v_i\f$ denotes
+the \f$i\textrm{-th}\f$ component of the (column) vector
+\f$\vect{v} = (v_0, \ldots, v_{n-1})^\transpose \in \Rset^n\f$.
+We denote by \f$\vect{0}\f$ the vector of \f$\Rset^n\f$,
+called <EM>the origin</EM>, having all components equal to zero.
+A vector \f$\vect{v} \in \Rset^n\f$ can be also interpreted
+as a matrix in \f$\Rset^{n \times 1}\f$ and manipulated accordingly
+using the usual definitions for addition, multiplication
+(both by a scalar and by another matrix), and transposition,
+denoted by \f$\vect{v}^\transpose\f$.
+
+The <EM>scalar product</EM> of \f$\vect{v},\vect{w} \in \Rset^n\f$,
+denoted \f$\langle \vect{v}, \vect{w} \rangle\f$,
+is the real number
+\f[
+ \vect{v}^\transpose \vect{w} = \sum_{i=0}^{n-1} v_i w_i.
+\f]
+
+For any \f$S_1, S_2 \sseq \Rset^n\f$, the <EM>Minkowski's sum</EM> of
+\f$S_1\f$ and \f$S_2\f$ is:
+\f$S_1 + S_2 = \{\, \vect{v}_1 + \vect{v}_2 \mid
+ \vect{v}_1 \in S_1, \vect{v}_2 \in S_2 \,\}.\f$
+
+
+\subsection Affine_Hyperplanes_and_Half_spaces Affine Hyperplanes and Half-spaces
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+where \f$\vect{a} \neq \vect{0}\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+defines:
+- an affine hyperplane if it is an equality constraint,
+ i.e., if \f$\mathord{\relsym} \in \{ = \}\f$;
+- a topologically closed affine half-space if it is
+ a non-strict inequality constraint,
+ i.e., if \f$\mathord{\relsym} \in \{ \geq \}\f$;
+- a topologically open affine half-space if it is
+ a strict inequality constraint,
+ i.e., if \f$\mathord{\relsym} \in \{ > \}\f$.
+
+Note that each hyperplane \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+can be defined as the intersection of the two closed affine half-spaces
+\f$\langle \vect{a}, \vect{x} \rangle \geq b\f$ and
+\f$\langle -\vect{a}, \vect{x} \rangle \geq -b\f$.
+Also note that, when \f$\vect{a} = \vect{0}\f$,
+the constraint \f$\langle \vect{0}, \vect{x} \rangle \relsym b\f$
+is either a tautology (i.e., always true)
+or inconsistent (i.e., always false), so that it defines
+either the whole vector space \f$\Rset^n\f$ or the empty set \f$\emptyset\f$.
+
+
+\subsection Convex_Polyhedra Convex Polyhedra
+
+The set \f$\cP \sseq \Rset^n\f$ is a
+<EM>not necessarily closed convex polyhedron</EM>
+(<EM>NNC polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of (open or closed) affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all NNC polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\Pset_n\f$.
+
+The set \f$\cP \in \Pset_n\f$ is a <EM>closed convex polyhedron</EM>
+(<EM>closed polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of closed affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all closed polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\CPset_n\f$.
+
+When ordering NNC polyhedra by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+are, respectively, the smallest and the biggest elements of both
+\f$\Pset_n\f$ and \f$\CPset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> polyhedron.
+
+In theoretical terms,
+\f$\Pset_n\f$ is a <EM>lattice</EM> under set inclusion and
+\f$\CPset_n\f$ is a <EM>sub-lattice</EM> of \f$\Pset_n\f$.
+
+\note
+In the following, we will usually specify operators on the domain
+\f$\Pset_n\f$ of NNC polyhedra. Unless an explicit distinction is
+made, these operators are provided with the same specification when
+applied to the domain \f$\CPset_n\f$ of topologically closed
+polyhedra. The implementation maintains a clearer separation between
+the two domains of polyhedra
+(see \ref Topologies_and_Topological_compatibility "Topologies and Topological-compatibility"):
+while computing polyhedra in \f$\Pset_n\f$ may provide more precise
+results, polyhedra in \f$\CPset_n\f$ can be represented and
+manipulated more efficiently. As a rule of thumb, if your application
+will only manipulate polyhedra that are topologically closed, then it
+should use the simpler domain \f$\CPset_n\f$. Using NNC polyhedra is
+only recommended if you are going to actually benefit from the
+increased accuracy.
+
+
+\subsection Bounded_Polyhedra Bounded Polyhedra
+
+An NNC polyhedron \f$\cP \in \Pset_n\f$ is <EM>bounded</EM>
+if there exists a \f$\lambda \in \nonnegRset\f$ such that:
+\f[
+ \cP
+ \sseq
+ \bigl\{\,
+ \vect{x} \in \Rset^n
+ \bigm|
+ - \lambda \leq x_j \leq \lambda \text{ for } j = 0, \ldots, n-1
+ \,\bigr\}.
+\f]
+A bounded polyhedron is also called a <EM>polytope</EM>.
+
+
+\section representation Representations of Convex Polyhedra
+
+NNC polyhedra can be specified by using two possible representations,
+the constraints (or implicit) representation and
+the generators (or parametric) representation.
+
+
+\subsection Constraints_Representation Constraints Representation
+
+In the sequel, we will simply write ``equality'' and ``inequality''
+to mean ``linear equality'' and ``linear inequality'', respectively;
+also, we will refer to either an equality or an inequality
+as a <EM>constraint</EM>.
+
+By definition, each polyhedron \f$\cP \in \Pset_n\f$ is the set of solutions
+to a <EM>constraint system</EM>, i.e., a finite number of constraints.
+By using matrix notation, we have
+\f[
+ \cP
+ \defeq
+ \{\,
+ \vect{x} \in \Rset^n
+ \mid
+ A_1 \vect{x} = \vect{b}_1,
+ A_2 \vect{x} \geq \vect{b}_2,
+ A_3 \vect{x} > \vect{b}_3
+ \,\},
+\f]
+where, for all \f$i \in \{1, 2, 3\}\f$,
+\f$A_i \in \Rset^{m_i} \times \Rset^n\f$ and \f$\vect{b}_i \in \Rset^{m_i}\f$,
+and \f$m_1, m_2, m_3 \in \Nset\f$ are
+the number of equalities,
+the number of non-strict inequalities, and
+the number of strict inequalities,
+respectively.
+
+
+\subsection Combinations_and_Hulls Combinations and Hulls
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \lambda_j \vect{x}_j\f$
+is said to be a <EM>linear</EM> combination of the vectors in \f$S\f$.
+Such a combination is said to be
+- a <EM>positive</EM> (or <EM>conic</EM>) combination,
+ if \f$\forall j \in \{ 1, \ldots, k \} \itc \lambda_j \in \nonnegRset\f$;
+- an <EM>affine</EM> combination, if \f$\sum_{j = 1}^k \lambda_j = 1\f$;
+- a <EM>convex</EM> combination, if it is both positive and affine.
+
+We denote by \f$\linearhull(S)\f$
+(resp., \f$\conichull(S)\f$, \f$\affinehull(S)\f$, \f$\convexhull(S)\f$)
+the set of all the linear (resp., positive, affine, convex)
+combinations of the vectors in \f$S\f$.
+
+Let \f$P, C \sseq \Rset^n\f$, where \f$P \union C = S\f$.
+We denote by \f$\NNChull(P, C)\f$ the set of all convex combinations
+of the vectors in \f$S\f$
+such that \f$\lambda_j > 0\f$ for some \f$\vect{x}_j \in P\f$
+(informally, we say that there exists a vector of \f$P\f$ that
+plays an active role in the convex combination).
+Note that \f$\NNChull(P, C) = \NNChull(P, P \union C)\f$
+so that, if \f$C \sseq P\f$,
+\f[
+ \convexhull(P)
+ = \NNChull(P, \emptyset)
+ = \NNChull(P, P)
+ = \NNChull(P, C).
+\f]
+It can be observed that
+\f$\linearhull(S)\f$ is an affine space,
+\f$\conichull(S)\f$ is a topologically closed convex cone,
+\f$\convexhull(S)\f$ is a topologically closed polytope, and
+\f$\NNChull(P, C)\f$ is an NNC polytope.
+
+
+\subsection Points_Closure_Points_Rays_and_Lines Points, Closure Points, Rays and Lines
+
+Let \f$\cP \in \Pset_n\f$ be an NNC polyhedron. Then
+- a vector \f$\vect{p} \in \cP\f$ is called a <EM>point</EM> of \f$\cP\f$;
+- a vector \f$\vect{c} \in \Rset^n\f$ is called a
+ <EM>closure point</EM> of \f$\cP\f$ if it is a point
+ of the topological closure of \f$\cP\f$;
+- a vector \f$\vect{r} \in \Rset^n\f$, where \f$\vect{r} \neq \vect{0}\f$,
+ is called a <EM>ray</EM> (or direction of infinity) of \f$\cP\f$
+ if \f$\cP \neq \emptyset\f$ and \f$\vect{p} + \lambda \vect{r} \in \cP\f$,
+ for all points \f$\vect{p} \in \cP\f$ and all \f$\lambda \in \nonnegRset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>line</EM> of \f$\cP\f$
+ if both \f$\vect{l}\f$ and \f$-\vect{l}\f$ are rays of \f$\cP\f$.
+
+A point of an NNC polyhedron \f$\cP \in \Pset_n\f$ is a
+<EM>vertex</EM> if and only if
+it cannot be expressed as a convex combination of any other pair of
+distinct points in \f$\cP\f$.
+A ray \f$\vect{r}\f$ of a polyhedron \f$\cP\f$ is an <EM>extreme ray</EM>
+if and only if it cannot be expressed as
+a positive combination of any other pair
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ of rays of \f$\cP\f$,
+where
+\f$\vect{r} \neq \lambda \vect{r}_1\f$,
+\f$\vect{r} \neq \lambda \vect{r}_2\f$ and
+\f$\vect{r}_1 \neq \lambda \vect{r}_2\f$
+for all \f$\lambda \in \nonnegRset\f$
+(i.e., rays differing by a positive scalar factor are considered
+to be the same ray).
+
+
+\subsection Generators_Representation Generators Representation
+
+Each NNC polyhedron \f$\cP \in \Pset_n\f$ can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$,
+points \f$P\f$ and closure points \f$C\f$ of \f$\cP\f$.
+The 4-tuple \f$\cG = (L, R, P, C)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$,
+in the sense that
+\f[
+ \cP = \linearhull(L) + \conichull(R) + \NNChull(P, C),
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum.
+
+When \f$\cP \in \CPset_n\f$ is a closed polyhedron,
+then it can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$ and
+points \f$P\f$ of \f$\cP\f$.
+In this case, the 3-tuple \f$\cG = (L, R, P)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$ since we have
+\f[
+ \cP = \linearhull(L) + \conichull(R) + \convexhull(P).
+\f]
+Thus, in this case,
+every closure point of \f$\cP\f$ is a point of \f$\cP\f$.
+
+For any \f$\cP \in \Pset_n\f$ and generator system \f$\cG = (L, R, P, C)\f$
+for \f$\cP\f$, we have
+ \f$\cP = \emptyset\f$ if and only if \f$P = \emptyset\f$.
+Also \f$P\f$ must contain all the vertices of \f$\cP\f$
+although \f$\cP\f$ can be non-empty and have no vertices.
+In this case, as \f$P\f$ is necessarily non-empty, it must
+contain points of \f$\cP\f$ that are <EM>not</EM> vertices.
+For instance, the half-space of \f$\Rset^2\f$ corresponding to the single
+constraint \f$y \geq 0\f$ can be represented by the generator system
+\f$\cG = (L, R, P, C)\f$ such that
+\f$L = \bigl\{ (1, 0)^\transpose \bigr\}\f$,
+\f$R = \bigl\{ (0, 1)^\transpose \bigr\}\f$,
+\f$P = \bigl\{ (0, 0)^\transpose \bigr\}\f$, and
+\f$C = \emptyset\f$.
+It is also worth noting that the only ray in \f$R\f$
+is <EM>not</EM> an extreme ray of \f$\cP\f$.
+
+\subsection Minimized_Representations Minimized Representations
+
+A constraints system \f$\cC\f$ for an NNC polyhedron \f$\cP \in \Pset_n\f$
+is said to be <EM>minimized</EM> if no proper subset of \f$\cC\f$ is
+a constraint system for \f$\cP\f$.
+
+Similarly, a generator system \f$\cG = (L, R, P, C)\f$
+for an NNC polyhedron \f$\cP \in \Pset_n\f$ is said to be <EM>minimized</EM>
+if there does not exist a generator system
+\f$\cG' = (L', R', P', C') \neq \cG\f$ for \f$\cP\f$
+such that \f$L' \sseq L\f$, \f$R' \sseq R\f$, \f$P' \sseq P\f$ and
+\f$C' \sseq C\f$.
+
+
+\subsection Double_Description Double Description
+
+Any NNC polyhedron \f$\cP\f$ can be described by using
+a constraint system \f$\cC\f$, a generator system \f$\cG\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> is a collection
+of well-known as well as novel theoretical results showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations by removing
+redundant constraints/generators.
+
+Such changes of representation form a key step
+in the implementation of many operators on NNC polyhedra:
+this is because some operators, such as intersections and poly-hulls,
+are provided with a natural and efficient implementation
+when using one of the representations in a DD pair,
+while being rather cumbersome when using the other.
+
+
+\subsection Topologies_and_Topological_compatibility Topologies and Topological-compatibility
+
+As indicated above, when an NNC polyhedron \f$\cP\f$ is necessarily closed,
+we can ignore the closure points contained in its generator system
+\f$\cG = (L, R, P, C)\f$ (as every closure point is also a point)
+and represent \f$\cP\f$ by the triple \f$(L, R, P)\f$.
+Similarly, \f$\cP\f$ can be represented by a constraint system
+that has no strict inequalities.
+Thus a necessarily closed polyhedron can have a smaller representation
+than one that is not necessarily closed.
+Moreover, operators restricted to work on closed polyhedra only
+can be implemented more efficiently.
+For this reason the library provides two alternative
+``topological kinds'' for a polyhedron, <EM>NNC</EM> and <EM>C</EM>.
+We shall abuse terminology by referring to the topological kind of
+a polyhedron as its <EM>topology</EM>.
+
+In the library, the topology of each polyhedron object is fixed
+once for all at the time of its creation and must be respected
+when performing operations on the polyhedron.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following <EM>topological-compatibility</EM> rules:
+- polyhedra are topologically-compatible if and only if they have
+ the same topology;
+- all constraints except for strict inequality constraints
+ and all generators except for closure points are
+ topologically-compatible with both C and NNC polyhedra;
+- strict inequality constraints and closure points are
+ topologically-compatible with a polyhedron if and only if it is NNC.
+
+Wherever possible,
+the library provides methods that, starting from a polyhedron of
+a given topology, build the corresponding polyhedron having
+the other topology.
+
+
+\subsection Space_Dimensions_and_Dimension_Compatibility Space Dimensions and Dimension Compatibility
+
+The <EM>space dimension</EM> of an NNC polyhedron \f$\cP \in \Pset_n\f$
+(resp., a C polyhedron \f$\cP \in \CPset_n\f$) is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of constraints, generators and other objects
+of the library is defined similarly.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following (space) <EM>dimension-compatibility</EM> rules:
+- polyhedra are dimension-compatible if and only if they have
+ the same space dimension;
+- the constraint
+ \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+ where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+ and \f$\vect{a}, \vect{x} \in \Rset^m\f$, is dimension-compatible
+ with a polyhedron having space dimension \f$n\f$
+ if and only if \f$m \leq n\f$;
+- the generator \f$\vect{x} \in \Rset^m\f$ is dimension-compatible
+ with a polyhedron having space dimension \f$n\f$
+ if and only if \f$m \leq n\f$;
+- a system of constraints (resp., generators) is dimension-compatible with
+ a polyhedron if and only if all the constraints (resp., generators)
+ in the system are dimension-compatible with the polyhedron.
+
+While the space dimension of a constraint, a generator or a system thereof
+is automatically adjusted when needed, the space dimension of a polyhedron
+can only be changed by explicit calls to operators provided for that
+purpose.
+
+\subsection Affine_Independence_and_Affine_Dimension Affine Independence and Affine Dimension
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$ is
+<EM>affinely independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the system of equations
+\f[
+ \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0},
+ \quad
+ \sum_{i = 1}^k \lambda_i = 0
+\f]
+implies that, for each \f$i = 1, \ldots, k\f$, \f$\lambda_i = 0\f$.
+
+The maximum number of affinely independent points in \f$\Rset^n\f$
+is \f$n + 1\f$.
+
+A <EM>non-empty</EM> NNC polyhedron \f$\cP \in \Pset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cP) = k\f$,
+if the maximum number of affinely independent points in \f$\cP\f$ is
+\f$k + 1\f$.
+
+We remark that the above definition only applies to polyhedra
+that are not empty, so that \f$0 \leq \pdim(\cP) \leq n\f$.
+By convention, the affine dimension of an empty polyhedron is 0
+(even though the ``natural'' generalization of the definition above
+would imply that the affine dimension of an empty polyhedron is \f$-1\f$).
+
+\note
+The affine dimension \f$k \leq n\f$ of an NNC polyhedron \f$\cP \in \Pset_n\f$
+must not be confused with the space dimension \f$n\f$ of \f$\cP\f$,
+which is the dimension of the enclosing vector space \f$\Rset^n\f$.
+In particular, we can have \f$\pdim(\cP) \neq \pdim(\cQ)\f$ even though
+\f$\cP\f$ and \f$\cQ\f$ are dimension-compatible;
+and vice versa, \f$\cP\f$ and \f$\cQ\f$ may be dimension-incompatible
+polyhedra even though \f$\pdim(\cP) = \pdim(\cQ)\f$.
+
+
+\subsection Rational_Polyhedra Rational Polyhedra
+
+An NNC polyhedron is called <EM>rational</EM>
+if it can be represented by a constraint system where
+all the constraints have rational coefficients.
+It has been shown that an NNC polyhedron is rational
+if and only if it can be represented by a generator system where
+all the generators have rational coefficients.
+
+The library only supports rational polyhedra.
+The restriction to rational numbers applies not only to polyhedra,
+but also to the other numeric arguments that may be required
+by the operators considered, such as the coefficients defining
+(rational) affine transformations.
+
+
+\section Operations_on_Convex_Polyhedra Operations on Convex Polyhedra
+
+In this section we briefly describe operations on NNC polyhedra
+that are provided by the library.
+
+\subsection Intersection_and_Convex_Polyhedral_Hull Intersection and Convex Polyhedral Hull
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>intersection</EM> of \f$\cP_1\f$ and \f$\cP_2\f$,
+defined as the set intersection \f$\cP_1 \inters \cP_2\f$,
+is the biggest NNC polyhedron included in both \f$\cP_1\f$ and \f$\cP_2\f$;
+similarly, the <EM>convex polyhedral hull</EM> (or <EM>poly-hull</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$, denoted by \f$\cP_1 \uplus \cP_2\f$,
+is the smallest NNC polyhedron that includes both
+\f$\cP_1\f$ and \f$\cP_2\f$.
+The intersection and poly-hull of any pair of closed polyhedra
+in \f$\CPset_n\f$ is also closed.
+
+In theoretical terms,
+the intersection and poly-hull operators defined above
+are the binary <EM>meet</EM> and the binary <EM>join</EM>
+operators on the lattices \f$\Pset_n\f$ and \f$\CPset_n\f$.
+
+\subsection Convex_Polyhedral_Difference Convex Polyhedral Difference
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>convex polyhedral difference</EM> (or <EM>poly-difference</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$ is defined as the smallest
+convex polyhedron containing the set-theoretic difference
+of \f$\cP_1\f$ and \f$\cP_2\f$.
+
+In general, even though \f$\cP_1, \cP_2 \in \CPset_n\f$
+are topologically closed polyhedra, their poly-difference may be
+a convex polyhedron that is not topologically closed.
+For this reason, when computing the poly-difference of two
+C polyhedra, the library will enforce the topological closure
+of the result.
+
+\subsection Concatenating_Polyhedra Concatenating Polyhedra
+
+Viewing a polyhedron as a set of tuples (its points), it is sometimes
+useful to consider the set of tuples obtained by concatenating
+an ordered pair of polyhedra.
+Formally, the <EM>concatenation</EM> of the polyhedra
+\f$\cP \in \Pset_n\f$ and \f$\cQ \in \Pset_m\f$ (taken in this order)
+is the polyhedron \f$\cR \in \Pset_{n+m}\f$ such that
+\f[
+ \cR
+ \defeq
+ \Bigl\{\,
+ (x_0, \ldots, x_{n-1}, y_0, \ldots, y_{m-1})^\transpose
+ \in \Rset^{n+m}
+ \Bigm|
+ (x_0, \ldots, x_{n-1})^\transpose \in \cP,
+ (y_0, \ldots, y_{m-1})^\transpose \in \cQ
+ \,\Bigl\}.
+\f]
+Another way of seeing it is as follows: first embed polyhedron \f$\cP\f$
+into a vector space of dimension \f$n+m\f$ and then add a suitably
+renamed-apart version of the constraints defining \f$\cQ\f$.
+
+\subsection Adding_New_Dimensions_to_the_Vector_Space Adding New Dimensions to the Vector Space
+
+The library provides two operators for adding a number \f$i\f$ of
+space dimensions to an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_{n+i}\f$.
+In both cases, the added dimensions of the vector space
+are those having the highest indices.
+
+The operator <CODE>add_space_dimensions_and_embed</CODE>
+\e embeds the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+defined by all and only the constraints defining \f$\cP\f$
+(the variables corresponding to the added dimensions are unconstrained).
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+ \cQ = \bigl\{\,
+ (x_0, x_1, x_2)^\transpose \in \Rset^3
+ \bigm|
+ (x_0, x_1)^\transpose \in \cP
+ \,\bigr\}.
+\f]
+
+In contrast, the operator <CODE>add_space_dimensions_and_project</CODE>
+\e projects the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+whose constraint system, besides the constraints defining \f$\cP\f$,
+will include additional constraints on the added dimensions.
+Namely, the corresponding variables are all constrained to be equal to 0.
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+ \cQ = \bigl\{\,
+ (x_0, x_1, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x_0, x_1)^\transpose \in \cP
+ \,\bigr\}.
+\f]
+
+\subsection Removing_Dimensions_from_the_Vector_Space Removing Dimensions from the Vector Space
+
+The library provides two operators for removing
+space dimensions from an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_m\f$ where \f$m \leq n\f$.
+
+Given a set of variables, the operator <CODE>remove_space_dimensions</CODE>
+removes all the space dimensions specified by the variables in the set.
+For instance, letting \f$\cP \in \Pset_4\f$ be the singleton set
+\f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$,
+then after invoking this operator with the set of variables
+\f$\{x_1, x_2\}\f$ the resulting polyhedron is
+\f[
+ \cQ = \bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+Given a space dimension \f$m\f$ less than or equal to that of the polyhedron,
+the operator <CODE>remove_higher_space_dimensions</CODE> removes
+the space dimensions having indices greater than or equal to \f$m\f$.
+For instance, letting \f$\cP \in \Pset_4\f$ defined as before,
+by invoking this operator with \f$m = 2\f$ the resulting polyhedron
+will be
+\f[
+ \cQ = \bigl\{ (3, 1)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+\subsection Mapping_the_Dimensions_of_the_Vector_Space Mapping the Dimensions of the Vector Space
+
+The operator <CODE>map_space_dimensions</CODE> provided by the library
+maps the dimensions of the vector space \f$\Rset^n\f$ according
+to a partial injective function \f$\pard{\rho}{\{0, \ldots, n-1\}}{\Nset}\f$
+such that \f$\rho\bigl(\{0, \ldots, n-1\}\bigr) = \{0, \ldots, m-1\}\f$
+with \f$m \leq n\f$.
+Dimensions corresponding to indices that are not mapped
+by \f$\rho\f$ are removed.
+
+If \f$m = 0\f$, i.e., if the function \f$\rho\f$ is undefined everywhere,
+then the operator projects the argument polyhedron \f$\cP \in \Pset_n\f$
+onto the zero-dimension space \f$\Rset^0\f$;
+otherwise the result is \f$\cQ \in \Pset_m\f$ given by
+\f[
+ \cQ
+ \defeq
+ \Bigl\{\,
+ \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose
+ \Bigm|
+ (v_0, \ldots, v_{n-1})^\transpose \in \cP
+ \,\Bigr\}.
+\f]
+
+\anchor expand_space_dimension
+\subsection Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions Expanding One Dimension of the Vector Space to Multiple Dimensions
+
+The operator <CODE>expand_space_dimension</CODE> provided by the library
+adds \f$m\f$ new space dimensions to a polyhedron \f$\cP \in \Pset_n\f$,
+with \f$n > 0\f$, so that dimensions
+\f$n\f$, \f$n+1\f$, \f$\ldots\f$, \f$n+m-1\f$
+of the result \f$\cQ\f$ are exact copies of the \f$i\f$-th space dimension
+of \f$\cP\f$. More formally,
+\f[
+ \cQ
+ \defeq
+ \sset{
+ \vect{u} \in \Rset^{n+m}
+ }{
+ \exists \vect{v}, \vect{w} \in \cP
+ \st u_i = v_i \\
+ \qquad \mathord{} \land \forall j = n, n+1, \ldots, n+m-1
+ \itc u_j = w_i \\
+ \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+ \itc k \neq i \implies u_k = v_k = w_k
+ }.
+\f]
+This operation has been proposed in \ref GDDetal04 "[GDDetal04]".
+
+
+\anchor fold_space_dimensions
+\subsection Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension Folding Multiple Dimensions of the Vector Space into One Dimension
+
+The operator <CODE>fold_space_dimensions</CODE> provided by the library,
+given a polyhedron \f$\cP \in \Pset_n\f$, with \f$n > 0\f$,
+folds a set of space dimensions \f$J = \{ j_0, \ldots, j_{m-1} \}\f$,
+with \f$m < n\f$ and \f$j < n\f$ for each \f$j \in J\f$,
+into space dimension \f$i < n\f$, where \f$i \notin J\f$.
+The result is given by
+\f[
+ \cQ \defeq \biguplus_{d = 0}^m \cQ_d
+\f]
+where
+\f[
+ \cQ_m
+ \defeq
+ \sset{
+ \vect{u} \in \Rset^{n-m}
+ }{
+ \exists \vect{v} \in \cP
+ \st u_{i'} = v_i \\
+ \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+ \itc k \neq i \implies u_{k'} = v_k
+ }
+\f]
+and, for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$,
+\f[
+ \cQ_d
+ \defeq
+ \sset{
+ \vect{u} \in \Rset^{n-m}
+ }{
+ \exists \vect{v} \in \cP
+ \st u_{i'} = v_{j_d} \\
+ \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+ \itc k \neq i \implies u_{k'} = v_k
+ },
+\f]
+and, finally, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$,
+\f[
+ k'
+ \defeq
+ k - \card \{\, j \in J \mid k > j \,\},
+\f]
+(\f$\card S\f$ denotes the cardinality of the finite set \f$S\f$).
+
+This operation has been proposed in \ref GDDetal04 "[GDDetal04]".
+
+
+\anchor affine_relation
+\subsection Images_and_Preimages_of_Affine_Transfer_Relations Images and Preimages of Affine Transfer Relations
+
+For each relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$,
+we denote by \f$\phi(S) \sseq \Rset^m\f$ the <EM>image</EM>
+under \f$\phi\f$ of the set \f$S \sseq \Rset^n\f$; formally,
+\f[
+ \phi(S)
+ \defeq
+ \bigl\{\,
+ \vect{w} \in \Rset^m
+ \bigm|
+ \exists \vect{v} \in S \st
+ (\vect{v}, \vect{w}) \in \phi
+ \,\bigr\}.
+\f]
+Similarly, we denote by \f$\phi^{-1}(S') \sseq \Rset^n\f$
+the <EM>preimage</EM> under \f$\phi\f$ of \f$S' \sseq \Rset^m\f$,
+that is
+\f[
+ \phi^{-1}(S')
+ \defeq
+ \bigl\{\,
+ \vect{v} \in \Rset^n
+ \bigm|
+ \exists \vect{w} \in S' \st
+ (\vect{v}, \vect{w}) \in \phi
+ \,\bigr\}.
+\f]
+If \f$n = m\f$, then the relation \f$\phi\f$ is said to be
+<EM>space dimension preserving</EM>.
+
+The relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is said to be an <EM>affine relation</EM>
+if there exists \f$\ell \in \Nset\f$ such that
+\f[
+ \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ \bigland_{i=1}^{\ell}
+ \bigl(
+ \langle \vect{c}_i, \vect{w} \rangle
+ \relsym_i
+ \langle \vect{a}_i, \vect{v} \rangle + b_i
+ \bigr),
+\f]
+where
+\f$\vect{a}_i \in \Rset^n\f$,
+\f$\vect{c}_i \in \Rset^m\f$,
+\f$b_i \in \Rset\f$ and
+\f$\mathord{\relsym}_i \in \{ <, \leq, =, \geq, > \}\f$,
+for each \f$i = 1, \ldots, \ell\f$.
+
+As a special case, the relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is an <EM>affine function</EM> if and only if there exist
+a matrix \f$A \in \Rset^m \times \Rset^n\f$ and
+a vector \f$\vect{b} \in \Rset^m\f$ such that,
+\f[
+ \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ \vect{w} = A\vect{v} + \vect{b}.
+\f]
+
+The set \f$\Pset_n\f$ of NNC polyhedra is closed under the application
+of images and preimages of any space dimension preserving affine relation.
+The same property holds for the set \f$\CPset_n\f$ of closed polyhedra,
+provided the affine relation makes no use of the strict relation symbols
+\f$<\f$ and \f$>\f$.
+Images and preimages of affine relations can be used to model
+several kinds of transition relations, including
+deterministic assignments of affine expressions,
+(affinely constrained) nondeterministic assignments and
+affine conditional guards.
+
+A space dimension preserving relation
+\f$\reld{\phi}{\Rset^n}{\Rset^n}\f$
+can be specified by means of a shorthand notation:
+ - the vector \f$\vect{x} = (x_0, \ldots, x_{n-1})^\transpose\f$
+ of <EM>unprimed</EM> variables is used to represent the
+ space dimensions of the domain of \f$\phi\f$;
+ - the vector \f$\vect{x}' = (x'_0, \ldots, x'_{n-1})^\transpose\f$
+ of <EM>primed</EM> variables is used to represent the
+ space dimensions of the range of \f$\phi\f$;
+ - any primed variable that ``does not occur'' in the shorthand
+ specification is meant to be <EM>unaffected</EM> by the relation;
+ namely, for each index \f$i \in \{0, \ldots, n-1\}\f$,
+ if in the syntactic specification of the relation
+ the primed variable \f$x'_i\f$ only occurs (if ever) with
+ coefficient 0, then it is assumed that the specification also
+ contains the constraint \f$x'_i = x_i\f$.
+
+As an example, assuming \f$\reld{\phi}{\Rset^3}{\Rset^3}\f$,
+the notation \f$x'_0 - x'_2 \geq 2 x_0 - x_1\f$, where the primed
+variable \f$x'_1\f$ does not occur, is meant to specify
+the affine relation defined by
+\f[
+ \forall \vect{v} \in \Rset^3, \vect{w} \in \Rset^3
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ (w_0 - w_2 \geq 2 v_0 - v_1) \land (w_1 = v_1).
+\f]
+The same relation is specified by
+\f$x'_0 + 0 \cdot x'_1 - x'_2 \geq 2 x_0 - x_1\f$,
+since \f$x'_1\f$ occurs with coefficient 0.
+
+The library allows for the computation of images and preimages
+of polyhedra under restricted subclasses of space dimension preserving
+affine relations, as described in the following.
+
+\subsection Single_Update_Affine_Functions Single-Update Affine Functions.
+Given a primed variable \f$x'_k\f$ and an unprimed affine expression
+\f$\langle \vect{a}, \vect{x} \rangle + b\f$,
+the <EM>affine function</EM>
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+ {\Rset^n}{\Rset^n}\f$
+is defined by
+\f[
+ \forall \vect{v} \in \Rset^n \itc
+ \phi(\vect{v}) = A\vect{v} + \vect{b},
+\f]
+where
+\f[
+ A =
+ \begin{pmatrix}
+ 1 & & 0 & 0 & \cdots & \cdots & 0 \\
+ & \ddots & & \vdots & & & \vdots \\
+ 0 & & 1 & 0 & \cdots & \cdots & 0 \\
+ a_0 & \cdots & a_{k-1} & a_k & a_{k+1} & \cdots & a_{n-1} \\
+ 0 & \cdots & \cdots & 0 & 1 & & 0 \\
+ \vdots & & & \vdots & & \ddots & \\
+ 0 & \cdots & \cdots & 0 & 0 & & 1
+ \end{pmatrix}, \qquad
+ \vect{b} =
+ \begin{pmatrix}
+ 0 \\
+ \vdots \\
+ 0 \\
+ b \\
+ 0 \\
+ \vdots \\
+ 0
+ \end{pmatrix}
+\f]
+and the \f$a_i\f$ (resp., \f$b\f$) occur in the \f$(k+1)\f$st row
+in \f$A\f$ (resp., position in \f$\vect{b}\f$).
+Thus function \f$\phi\f$ maps any vector
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+to
+\f[
+ \Bigl(v_0, \ldots,
+ \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+ \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance, suppose the polyhedron \f$\cP\f$
+to be transformed is the square in \f$\Rset^2\f$
+generated by the set of points
+\f$\bigl\{
+ (0, 0)^\transpose,
+ (0, 3)^\transpose,
+ (3, 0)^\transpose,
+ (3, 3)^\transpose
+ \bigr\}\f$.
+Then, if the primed variable is \f$x_0\f$ and
+the affine expression is \f$x_0 + 2 x_1 + 4\f$
+(so that \f$k = 0\f$, \f$a_0 = 1, a_1 = 2, b = 4\f$),
+the affine image operator will translate \f$\cP\f$
+to the parallelogram \f$\cP_1\f$ generated by the set of points
+\f$\bigl\{
+ (4, 0)^\transpose,
+ (10, 3)^\transpose,
+ (7, 0)^\transpose,
+ (13, 3)^\transpose
+ \bigr\}\f$
+with height equal to the side of the square
+and oblique sides parallel to the line \f$x_0 - 2 x_1\f$.
+If the primed variable is as before (i.e., \f$k = 0\f$)
+but the affine expression is \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting polyhedron \f$\cP_2\f$
+is the positive diagonal of the square.
+
+The <EM>affine preimage</EM> operator computes the affine preimage
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using primed variable \f$x_0\f$
+and affine expression \f$x_0 + 2 x_1 + 4\f$
+to the parallelogram \f$\cP_1\f$;
+then we get the original square \f$\cP\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using primed variable \f$x_0\f$ and affine expression \f$x_1\f$
+to \f$\cP_2\f$, then the resulting polyhedron is the stripe obtained
+by adding the line \f$(1, 0)^\transpose\f$ to polyhedron \f$\cP_2\f$.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the affine expression is non-zero, the affine function is invertible.
+
+\subsection Single_Update_Bounded_Affine_Relations Single-Update Bounded Affine Relations.
+Given a primed variable \f$x'_k\f$ and
+two unprimed affine expressions
+\f$\mathrm{lb} = \langle \vect{a}, \vect{x} \rangle + b\f$ and
+\f$\mathrm{ub} = \langle \vect{c}, \vect{x} \rangle + d\f$,
+the <EM>bounded affine relation</EM>
+\f$\phi = (\mathrm{lb} \leq x'_k \leq \mathrm{ub})\f$
+is defined as
+\f[
+ \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ \bigl(
+ \langle \vect{a}, \vect{v} \rangle + b
+ \leq w_k
+ \leq \langle \vect{c}, \vect{v} \rangle + d
+ \bigr)
+ \land
+ \Bigl(
+ \bigland_{0 \leq i < n, i \neq k}
+ w_i = v_i
+ \Bigr).
+\f]
+
+\subsection affine_form_relation Affine Form Relations.
+Let \f$\mathbb{F}_{\mathrm{f}}\f$ be the set of floating point numbers
+representables in a certain
+format \f$\mathrm{f}\f$ and let \f$\mathbb{I}_\mathrm{f}\f$ be the set of
+real intervals with bounds in \f$\mathbb{F}_{\mathrm{f}}\f$.
+We can define a <EM>floating-point interval linear form</EM>
+\f$\langle\vect{\alpha}, \vect{x}\rangle
+ + \beta\f$
+as:
+ \f[\left<\vect{\alpha}, \vect{x}\right> + \beta =
+ \alpha_0x_0 + \ldots +
+ \alpha_{n-1}x_{n-1} + \beta,\f]
+
+where \f$\beta\f$, \f$\vect{\alpha}_k \in \mathbb{I}_{\mathrm{f}}\f$
+for each \f$k = 0, \ldots, n - 1\f$.
+
+Given a such linear form \f$\mathrm{lf}\f$ and a primed variable \f$x'_k\f$ the
+<EM>affine form image</EM> operator computes the bounded affine image of a
+polyhedron \f$\cP\f$ under \f$\mathrm{lb} \leq x'_k \leq \mathrm{ub}\f$, where
+\f$\mathrm{lb}\f$ and \f$\mathrm{ub}\f$ are the upper and lower bound
+of \f$\mathrm{lf}\f$ respectively.
+
+\subsection Generalized_Affine_Relations Generalized Affine Relations.
+Similarly, the <EM>generalized affine relation</EM>
+\f$\phi = (\mathrm{lhs}' \relsym \mathrm{rhs})\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and
+\f$\mathord{\relsym} \in \{ <, \leq, =, \geq, > \}\f$
+is a relation symbol, is defined as
+\f[
+ \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ \bigl(
+ \langle \vect{c}, \vect{w} \rangle + d
+ \relsym \langle \vect{a}, \vect{v} \rangle + b
+ \bigr)
+ \land
+ \Bigl(
+ \bigland_{0 \leq i < n, c_i = 0}
+ w_i = v_i
+ \Bigr).
+\f]
+When \f$\mathrm{lhs} = x_k\f$ and \f$\mathord{\relsym} \in \{ = \}\f$,
+then the above affine relation becomes equivalent to the
+single-update affine function \f$x'_k = \mathrm{rhs}\f$
+(hence the name given to this operator).
+It is worth stressing that the notation is not symmetric, because
+the variables occurring in expression \f$\mathrm{lhs}\f$ are interpreted
+as primed variables, whereas those occurring in \f$\mathrm{rhs}\f$
+are unprimed; for instance, the transfer relations
+\f$\mathrm{lhs}' \leq \mathrm{rhs}\f$ and
+\f$\mathrm{rhs}' \geq \mathrm{lhs}\f$
+are not equivalent in general.
+
+\subsection Cylindrification Cylindrification Operator
+
+The operator <CODE>unconstrain</CODE> computes
+the <EM>cylindrification</EM> \ref HMT71 "[HMT71]"
+of a polyhedron with respect to one of its variables.
+Formally, the cylindrification \f$\cQ \in \Pset_n\f$
+of an NNC polyhedron \f$\cP \in \Pset_n\f$ with respect to
+variable index \f$i \in \{ 0, \ldots, n-1 \}\f$ is defined as follows:
+\f[
+ \cQ
+ = \bigl\{\,
+ \vect{w} \in \Rset^n
+ \bigm|
+ \exists \vect{v} \in \cP \st
+ \forall j \in \{0, \ldots, n-1\} \itc
+ j \neq i \implies w_j = v_j
+ \,\bigr\}.
+\f]
+Cylindrification is an idempotent operation; in particular, note that
+the computed result has the same space dimension of the original polyhedron.
+A variant of the operator above allows for the cylindrification of
+a polyhedron with respect to a finite set of variables.
+
+\subsection Time_Elapse_Operator Time-Elapse Operator
+
+The <EM>time-elapse</EM> operator has been defined in
+\ref HPR97 "[HPR97]".
+Actually, the time-elapse operator provided by the library
+is a slight generalization of that one,
+since it also works on NNC polyhedra.
+For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$,
+the time-elapse between \f$\cP\f$ and \f$\cQ\f$,
+denoted \f$ \cP \nearrow \cQ\f$,
+is the smallest NNC polyhedron containing the set
+\f[
+ \bigl\{\,
+ \vect{p} + \lambda \vect{q} \in \Rset^n
+ \bigm|
+ \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \nonnegRset
+ \,\bigr\}.
+\f]
+Note that the above set might not be an NNC polyhedron.
+
+
+\subsection Positive_Time_Elapse_Operator Positive Time-Elapse Operator
+
+The <EM>positive time-elapse</EM> operator has been defined in
+\ref BFM11 "[BFM11,BFM13]".
+The operator provided by the library works on NNC
+polyhedra. For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$, the
+positive time-elapse between \f$\cP\f$ and \f$\cQ\f$, denoted \f$ \cP
+\nearrow_{>0} \cQ\f$, is the NNC polyhedron containing exactly the set
+\f[
+ \bigl\{\,
+ \vect{p} + \lambda \vect{q} \in \Rset^n
+ \bigm|
+ \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \Rset^{>0}
+ \,\bigr\},
+\f]
+where \f$\Rset^{>0}\f$ denotes the set of strictly positive
+reals. Notice that, differently from the case of the time-elapse
+operator, the set \f$ \cP \nearrow_{>0} \cQ\f$ is always an NNC
+polyhedron, if \f$\cP\f$ and \f$\cQ\f$ are.
+
+The exact version of the time-elapse operator \f$\cP \nearrow \cQ\f$
+defined in Section \ref Time_Elapse_Operator,
+which may not be an NNC polyhedron, can be computed as
+the union of two NNC polyhedra, according to the following equation:
+\f$\cP \nearrow \cQ = \cP \cup \left(\cP \nearrow_{>0} \cQ\right)\f$.
+
+
+\subsection Meet_Preserving_Simplification Meet-Preserving Enlargement and Simplification
+
+Let \f$\cP, \cQ, \cR \in \Pset_n\f$ be NNC polyhedra. Then:
+
+ - \f$\cR\f$ is <EM>meet-preserving</EM> with respect to \f$\cP\f$
+ using context \f$\cQ\f$ if \f$\cR \inters \cQ = \cP \inters \cQ\f$;
+
+ - \f$\cR\f$ is an <EM>enlargement</EM> of \f$\cP\f$ if \f$\cR \Sseq \cP\f$.
+
+ - \f$\cR\f$ is a <EM>simplification</EM> with respect to \f$\cP\f$
+ if \f$r \leq p\f$, where \f$r\f$ and \f$p\f$ are the cardinalities
+ of minimized constraint representations for \f$\cR\f$ and \f$\cP\f$,
+ respectively.
+
+Notice that an enlargement need not be a simplification, and vice versa;
+moreover, the identity function is (trivially)
+a meet-preserving enlargement and simplification.
+
+The library provides a binary operator (<CODE>simplify_using_context</CODE>)
+for the domain of NNC polyhedra that returns a polyhedron which is a
+meet-preserving enlargement simplification of its first argument
+using the second argument as context.
+
+The concept of meet-preserving enlargement and simplification also
+applies to the other basic domains (boxes, grids, BD and octagonal shapes).
+See below for a definition of the concept of
+\ref Powerset_Meet_Preserving_Simplification "meet-preserving simplification for powerset domains".
+
+\anchor relation_with
+\subsection Relation_With_Operators Relation-With Operators
+
+The library provides operators for checking the relation holding
+between an NNC polyhedron and
+either a constraint or a generator.
+
+Suppose \f$\cP\f$ is an NNC polyhedron
+and \f$\cC\f$ an arbitrary constraint system representing \f$\cP\f$.
+Suppose also that
+\f$
+ c = \bigl(
+ \langle \vect{a}, \vect{x} \rangle \relsym b
+ \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points
+that satisfy \f$c\f$.
+The possible relations between \f$\cP\f$ and \f$c\f$ are as follows.
+- \f$\cP\f$ <EM>is disjoint</EM> from \f$c\f$ if
+ \f$\cP \inters \cQ = \emptyset\f$; that is, adding \f$c\f$
+ to \f$\cC\f$ gives us the empty polyhedron.
+- \f$\cP\f$ <EM>strictly intersects</EM> \f$c\f$ if
+ \f$\cP \inters \cQ \neq \emptyset\f$ and \f$\cP \inters \cQ \subset \cP\f$;
+ that is, adding \f$c\f$ to \f$\cC\f$
+ gives us a non-empty polyhedron strictly smaller than \f$\cP\f$.
+- \f$\cP\f$ <EM>is included</EM> in \f$c\f$ if \f$\cP \sseq \cQ\f$;
+ that is, adding \f$c\f$ to \f$\cC\f$
+ leaves \f$\cP\f$ unchanged.
+- \f$\cP\f$ <EM>saturates</EM> \f$c\f$ if \f$\cP \sseq \cH\f$,
+ where \f$\cH\f$ is the hyperplane induced by constraint \f$c\f$,
+ i.e., the set of points satisfying the equality constraint
+ \f$\langle \vect{a}, \vect{x} \rangle = b\f$;
+ that is, adding the constraint \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+ to \f$\cC\f$ leaves \f$\cP\f$ unchanged.
+
+The polyhedron \f$\cP\f$ <EM>subsumes</EM> the generator \f$g\f$ if
+adding \f$g\f$ to any generator system representing \f$\cP\f$
+does not change \f$\cP\f$.
+
+\subsection Widening_Operators Widening Operators
+
+The library provides two widening operators for the domain of polyhedra.
+\anchor H79_widening
+The first one, that we call <EM>H79-widening</EM>, mainly
+follows the specification provided in the PhD thesis of N. Halbwachs
+\ref Hal79 "[Hal79]", also described in \ref HPR97 "[HPR97]".
+Note that in the computation of the H79-widening \f$\cP \widen \cQ\f$
+of two polyhedra \f$\cP, \cQ \in \CPset_n\f$ it is required as a
+precondition that \f$\cP \sseq \cQ\f$ (the same assumption was implicitly
+present in the cited papers).
+
+\anchor BHRZ03_widening
+The second widening operator, that we call <EM>BHRZ03-widening</EM>,
+is an instance of the specification provided in \ref BHRZ03a "[BHRZ03a]".
+This operator also requires as a precondition that \f$\cP \sseq \cQ\f$
+and it is guaranteed to provide a result which is at least as precise as
+the H79-widening.
+
+Both widening operators can be applied to NNC polyhedra.
+The user is warned that, in such a case, the results may not closely
+match the geometric intuition which is at the base of the
+specification of the two widenings. The reason is that, in the current
+implementation, the widenings are not directly applied to the NNC
+polyhedra, but rather to their internal representations.
+Implementation work is in progress and future versions of the library
+may provide an even better integration of the two widenings with the
+domain of NNC polyhedra.
+
+\note
+As is the case for the other operators on polyhedra, the
+implementation overwrites one of the two polyhedra arguments with the
+result of the widening application. To avoid trivial
+misunderstandings, it is worth stressing that if polyhedra \f$\cP\f$
+and \f$\cQ\f$ (where \f$\cP \sseq \cQ\f$) are identified by program
+variables <CODE>p</CODE> and <CODE>q</CODE>, respectively, then the
+call <CODE>q.H79_widening_assign(p)</CODE> will assign the polyhedron
+\f$\cP \widen \cQ\f$ to variable <CODE>q</CODE>. Namely, it is the
+bigger polyhedron \f$\cQ\f$ which is overwritten by the result of the
+widening. The smaller polyhedron is not modified, so as to lead to an
+easier coding of the usual convergence test
+(\f$\cP \Sseq \cP \widen \cQ\f$ can be coded as <CODE>p.contains(q)</CODE>).
+Note that, in the above context, a call such as
+<CODE>p.H79_widening_assign(q)</CODE> is likely to result in undefined
+behavior, since the precondition \f$\cQ \sseq \cP\f$ will be missed
+(unless it happens that \f$\cP = \cQ\f$).
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the language
+interfaces.
+
+
+\subsection Widening_with_Tokens Widening with Tokens
+
+When approximating a fixpoint computation using widening operators,
+a common tactic to improve the precision of the final result is to delay
+the application of widening operators. The usual approach is to fix
+a parameter \f$k\f$ and only apply widenings starting from the
+\f$k\f$-th iteration.
+
+The library also supports an improved widening delay strategy,
+that we call <EM>widening with tokens</EM> \ref BHRZ03a "[BHRZ03a]".
+A token is a sort of wild card allowing for the replacement of the widening
+application by the exact upper bound computation: the token is used
+(and thus consumed) only when the widening would have resulted in an
+actual precision loss (as opposed to the <EM>potential</EM> precision loss
+of the classical delay strategy).
+Thus, all widening operators can be supplied with an optional argument,
+recording the number of available tokens, which is decremented when
+tokens are used. The approximated fixpoint computation will start with
+a fixed number \f$k\f$ of tokens, which will be used if and when needed.
+When there are no tokens left, the widening is always applied.
+
+\subsection Extrapolation_Operators Extrapolation Operators
+
+Besides the two widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+\anchor limited_extrapolation
+In particular, for each of the two widenings there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a constraint system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that a convergence guarantee
+can only be obtained by suitably restricting the set of constraints that
+can occur in this additional parameter. For instance, in \ref HPR97 "[HPR97]"
+this set is fixed once and for all before starting the computation of
+the upward iteration sequence.
+
+\anchor bounded_extrapolation
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above by
+intersecting the result of the limited extrapolation operation
+with the box obtained as a result of applying the
+\ref CC76_interval_widening "CC76-widening"
+to the smallest \ref Intervals_and_Boxes "boxes"
+enclosing the two argument polyhedra.
+
+\section Intervals_and_Boxes Intervals and Boxes
+
+The PPL provides support for computations on non-relational domains,
+called boxes, and also the interval domains used for their representation.
+
+\anchor intervals
+An <EM>interval</EM> in \f$\Rset\f$ is a pair of <EM>bounds</EM>,
+called <EM>lower</EM> and <EM>upper</EM>.
+Each bound can be either (1) <EM>closed and bounded</EM>,
+(2) <EM>open and bounded</EM>, or
+(3) <EM>open and unbounded</EM>.
+If the bound is <EM>bounded</EM>, then it has a value in \f$\Rset\f$.
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq, >\}\f$,
+the constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be a <EM>interval constraint</EM> if there exist an index
+\f$i \in \{ 0, \ldots, n-1 \}\f$ such that, for all
+\f$k \in \{ 0, \ldots, i-1, i+1, \ldots, n-1 \}\f$, \f$a_k = 0\f$.
+Thus each interval constraint that is not a tautology or
+inconsistent has the form
+\f$x = r\f$, \f$x \leq r\f$, \f$x \geq r\f$,
+\f$x < r\f$ or \f$x > r\f$, with \f$r \in \Rset\f$.
+
+Letting \f$\cB\f$ be a sequence of
+\f$n\f$ intervals and \f$\vect{e}_i = (0, \ldots, 1, \ldots, 0)^\transpose\f$
+be the vector in \f$\Rset^n\f$ with 1 in the \f$i\f$'th position
+and zeroes in every other position;
+if the lower bound of the \f$i\f$'th interval in \f$\cB\f$
+is bounded, the corresponding interval constraint is defined as
+\f$\langle \vect{e}_i, \vect{x} \rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\geq}\f$ if it is a closed bound and
+\f$\mathord{>}\f$ if it is an open bound.
+Similarly,
+if the upper bound of the \f$i\f$'th interval in \f$\cB\f$ is bounded,
+the corresponding interval constraint is defined as
+\f$\langle\vect{e}_i,\vect{x}\rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\leq}\f$ if it is a closed bound and
+\f$\mathord{<}\f$ if it is an open bound.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
+<EM>box</EM> if and only if
+either \f$\cP\f$ is the set of solutions to a finite set
+of interval constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+Therefore any \f$n\f$-dimensional <EM>box</EM> \f$\cP\f$ in \f$\Rset^n\f$
+where \f$n > 0\f$ can be represented by a sequence of \f$n\f$ intervals
+\f$\cB\f$ in \f$\Rset\f$ and \f$\cP\f$ is a closed polyhedron
+if every bound in the intervals in \f$\cB\f$
+is either closed and bounded or open and unbounded.
+
+\anchor CC76_interval_widening
+\subsection Widening_and_Extrapolation_Operators_on_Boxes Widening and Extrapolation Operators on Boxes
+
+The library provides a widening operator for boxes.
+Given two sequences of intervals defining two \f$n\f$-dimensional boxes, the
+<EM>CC76-widening</EM> applies, for each corresponding interval and bound, the
+interval constraint widening defined in \ref CC76 "[CC76]".
+For extra precision, this incorporates the widening with thresholds
+as defined in \ref BCCetal02 "[BCCetal02]" with
+\f$\{-2, -1, 0, 1, 2\}\f$ as the set of default threshold values.
+
+\section Weakly_Relational_Shapes Weakly-Relational Shapes
+
+The PPL provides support for computations on numerical domains that,
+in selected contexts, can achieve a better precision/efficiency ratio
+with respect to the corresponding computations on a ``fully
+relational'' domain of convex polyhedra. This is achieved by
+restricting the syntactic form of the constraints that can be used to
+describe the domain elements.
+
+\subsection Bounded_Difference_Shapes Bounded Difference Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be a <EM>bounded difference</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+ - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$ and \f$a_i \neq a_j\f$;
+ - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
+<EM>bounded difference shape</EM> (BDS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of bounded difference constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+\subsection Octagonal_Shapes Octagonal Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be an <EM>octagonal</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+ - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$;
+ - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be an
+<EM>octagonal shape</EM> (OS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of octagonal constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+Note that, since any bounded difference is also an octagonal constraint,
+any BDS is also an OS. The name ``octagonal'' comes from the fact that,
+in a vector space of dimension 2, a bounded OS can have eight sides
+at most.
+
+\subsection Weakly_Relational_Shape_Interface Weakly-Relational Shapes Interface
+By construction, any BDS or OS is always topologically closed.
+Under the usual set inclusion ordering, the set of all BDSs (resp., OSs)
+on the vector space \f$\Rset^n\f$ is a lattice having the empty set
+\f$\emptyset\f$ and the universe \f$\Rset^n\f$ as the smallest and
+the biggest elements, respectively.
+In theoretical terms, it is a meet sub-lattice of \f$\CPset_n\f$;
+moreover, the lattice of BDSs is a meet sublattice of the lattice of OSs.
+The least upper bound of a finite set of BDSs (resp., OSs) is said to be
+their <EM>bds-hull</EM> (resp., <EM>oct-hull</EM>).
+
+As far as the representation of the rational inhomogeneous term of
+each bounded difference or octagonal constraint is concerned, several
+<EM>rounding-aware</EM> implementation choices are available, including:
+ - bounded precision integer types;
+ - bounded precision floating point types;
+ - unbounded precision integer and rational types, as provided by GMP.
+
+The user interface for BDSs and OSs is meant to be as similar as
+possible to the one developed for the domain of closed polyhedra: in
+particular, all operators on polyhedra are also available for the
+domains of BDSs and OSs, even though they are typically characterized
+by a lower degree of precision.
+For instance, the <EM>bds-difference</EM> and <EM>oct-difference</EM>
+operators return (the smallest) over-approximations of the set-theoretical
+difference operator on the corresponding domains.
+In the case of (generalized) images and preimages of affine relations,
+suitable (possibly not-optimal) over-approximations are computed when
+the considered relations cannot be precisely modeled by only using
+bounded differences or octagonal constraints.
+
+\subsection Widening_and_Extrapolation_Operators_on_WR_Shapes Widening and Extrapolation Operators on Weakly-Relational Shapes
+
+\anchor BHMZ05_widening
+For the domains of BDSs and OSs, the library provides a variant of
+the widening operator for convex polyhedra defined in \ref CH78 "[CH78]".
+The implementation follows the specification
+in \ref BHMZ05a "[BHMZ05a,BHMZ05b]",
+resulting in an operator which is well-defined on the corresponding domain
+(i.e., it does not depend on the internal representation of BDSs or OSs),
+while still ensuring convergence in a finite number of steps.
+
+\anchor CC76_extrapolation
+The library also implements an extension of the widening operator for
+intervals as defined in \ref CC76 "[CC76]". The reader is warned that
+such an extension, even though being well-defined on the domain of BDSs
+and OSs, is not provided with a convergence guarantee and is therefore an
+extrapolation operator.
+
+
+\section sect_rational_grids Rational Grids
+
+In this section we introduce rational grids
+as provided by the library.
+See also \ref BDHetal05 "[BDHetal05]" for a detailed description of this domain.
+
+The library supports two representations for the grids domain;
+<EM>congruence systems</EM> and <EM>grid generator systems</EM>.
+We first describe <EM>linear congruence relations</EM> which form the elements
+of a congruence system.
+
+\subsection Congruence_Relations Congruences and Congruence Relations
+
+For any \f$a, b, f \in \Rset\f$,
+\f$a \equiv_f b\f$ denotes the <EM>congruence</EM>
+\f$\exists \mu \in \Zset \st a - b = \mu f\f$.
+
+Let \f$\Sset \in \{ \Qset, \Rset \}\f$.
+For each vector
+\f$\vect{a} \in \Sset^n \setdiff \{\vect{0}\}\f$ and scalars
+\f$b, f \in \Sset\f$,
+the notation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+stands for the <EM>linear congruence relation in \f$\Sset^n\f$</EM>
+defined by the set of vectors
+\f[
+ \bigl\{\,
+ \vect{v} \in \Rset^n
+ \bigm|
+ \exists \mu \in \Zset \st
+ \langle \vect{a}, \vect{v} \rangle = b + \mu f
+ \,\bigr\};
+\f]
+when \f$f \neq 0\f$, the relation is said to be
+<EM>proper</EM>;
+\f$\langle \vect{a}, \vect{x} \rangle \equiv_0 b\f$ (i.e., when \f$f = 0\f$)
+denotes the equality \f$\langle \vect{a}, \vect{x} \rangle = b\f$.
+\f$f\f$ is called the <EM>frequency</EM> or <EM>modulus</EM> and
+\f$b\f$ the <EM>base value</EM> of the relation.
+Thus, provided \f$\vect{a} \neq \vect{0}\f$,
+the relation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+defines the set of affine hyperplanes
+\f[
+ \big\{\,
+ \bigl(\langle \vect{a}, \vect{x} \rangle = b + \mu f\bigr)
+ \bigm|
+ \mu \in \Zset
+ \,\bigr\};
+\f]
+if \f$b \equiv_f 0\f$, \f$\langle \vect{0}, \vect{x} \rangle \equiv_f b\f$
+defines the universe \f$\Rset^n\f$ and the empty set, otherwise.
+
+\subsection Rational_Grids Rational Grids
+
+The set \f$\cL \sseq \Rset^n\f$ is a <EM>rational grid</EM>
+if and only if either \f$\cL\f$ is the set of vectors in
+\f$\Rset^n\f$ that satisfy
+a finite system \f$\cC\f$ of congruence relations in \f$\Qset^n\f$
+or \f$n = 0\f$ and \f$\cL = \emptyset\f$.
+
+We also say that <EM>\f$\cL\f$ is described by \f$\cC\f$</EM>
+and that <EM>\f$\cC\f$ is a congruence system for \f$\cL\f$</EM>.
+
+The <EM>grid domain</EM> \f$\Gset_{n}\f$ is the set of all rational grids
+described by finite sets of congruence relations in \f$\Qset^n\f$.
+
+If the congruence system \f$\cC\f$ describes the \f$\emptyset\f$,
+the <EM>empty</EM> grid,
+then we say that \f$\cC\f$ is <EM>inconsistent</EM>.
+For example, the congruence systems
+\f$\bigl\{\langle\vect{0}, \vect{x}\rangle \equiv_0 1\bigr\}\f$
+meaning that \f$0 = 1\f$ and
+\f$\bigl\{\langle\vect{a}, \vect{x}\rangle \equiv_2 0,
+ \langle\vect{a}, \vect{x}\rangle \equiv_2 1\bigr\}\f$,
+for any \f$\vect{a} \in \Rset^n\f$,
+meaning that the value of an expression must be both even and odd
+are both inconsistent since both describe the empty grid.
+
+When ordering grids by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+(which is described by the empty set of congruence relations)
+are, respectively, the smallest and the biggest elements of
+\f$\Gset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> grid.
+
+In set theoretical terms,
+\f$\Gset_n\f$ is a <EM>lattice</EM> under set inclusion.
+
+\subsection Integer_Combinations Integer Combinations
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\mu_1, \ldots, \mu_k \in \Zset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \mu_j \vect{x}_j\f$
+is said to be a <EM>integer</EM> combination of the vectors in \f$S\f$.
+
+We denote by \f$\inthull(S)\f$
+(resp., \f$\intaffinehull(S)\f$)
+the set of all the integer (resp., integer and affine)
+combinations of the vectors in \f$S\f$.
+
+\subsection Points_Parameters_Lines Points, Parameters and Lines
+
+Let \f$\cL\f$ be a grid.
+Then
+- a vector \f$\vect{p} \in \cL\f$ is called a <EM>grid point</EM> of \f$\cL\f$;
+- a vector \f$\vect{q} \in \Rset^n\f$, where \f$\vect{q} \neq \vect{0}\f$,
+ is called a <EM>parameter</EM> of \f$\cL\f$
+ if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \mu \vect{q} \in \cL\f$,
+ for all points \f$\vect{p} \in \cL\f$ and all \f$\mu \in \Zset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>grid line</EM> of
+ \f$\cL\f$ if \f$\cL \neq \emptyset\f$ and
+ \f$\vect{p} + \lambda \vect{l} \in \cL\f$,
+ for all points \f$\vect{p} \in \cL\f$ and all \f$\lambda \in \Rset\f$.
+
+
+\subsection Grid_Generator_Representation The Grid Generator Representation
+
+We can generate any rational grid in \f$\Gset_n\f$
+from a finite subset of its points, parameters and lines;
+each point in a grid is obtained by adding a linear combination of
+its generating lines to an integral combination of its parameters
+and an integral affine combination of its generating points.
+
+If \f$L, Q, P\f$ are each finite subsets of \f$\Qset^n\f$ and
+\f[
+ \cL = \linearhull(L) + \inthull(Q) + \intaffinehull(P)
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum,
+then \f$\cL \in \Gset_n\f$ is a rational grid
+(see Section 4.4 in \ref Sch99 "[Sch99]" and
+also Proposition 8 in \ref BDHetal05 "[BDHetal05]").
+The 3-tuple \f$(L, Q, P)\f$
+is said to be a <EM>grid generator system</EM> for \f$\cL\f$
+and we write \f$\cL = \ggen(L, Q, P)\f$.
+
+Note that the grid \f$\cL = \ggen(L, Q, P) = \emptyset\f$
+if and only if the set of grid points \f$P = \emptyset\f$.
+If \f$P \neq \emptyset\f$, then
+\f$\cL = \ggen(L, \emptyset, Q_{\vect{p}} \union P)\f$
+where, for some \f$\vect{p} \in P\f$,
+\f$Q_{\vect{p}} = \{\, \vect{p} + \vect{q} \mid \vect{q} \in Q \,\}\f$.
+
+\subsection Grid_Minimized_Representations Minimized Grid Representations
+
+A <EM>minimized</EM> congruence system \f$\cC\f$ for \f$\cL\f$
+is such that, if \f$\cC'\f$ is another congruence system for \f$\cL\f$,
+then \f$\card \cC \leq \card \cC'\f$.
+Note that a minimized congruence system for a non-empty grid
+has at most \f$n\f$ congruence relations.
+
+Similarly, a <EM>minimized</EM> grid generator system
+\f$\cG = (L, Q, P)\f$ for \f$\cL\f$
+is such that, if \f$\cG' = (L', Q', P')\f$ is
+another grid generator system for \f$\cL\f$,
+then \f$\card L \leq \card L'\f$ and
+\f$\card Q + \card P \leq \card Q' + \card P'\f$.
+Note that a minimized grid generator system for a grid
+has no more than a total of \f$n+1\f$ grid lines, parameters and points.
+
+\subsection Grids_Double_Description_Grids Double Description for Grids
+
+As for convex polyhedra, any grid \f$\cL\f$ can be described by using
+a congruence system \f$\cC\f$ for \f$\cL\f$,
+a grid generator system \f$\cG\f$ for \f$\cL\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> for grids is a collection of
+theoretical results very similar to those for convex polyhedra showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations.
+
+As for convex polyhedra, such changes of representation form a key step
+in the implementation of many operators on grids such as, for example,
+intersection and grid join.
+
+\subsection Grid_Space_Dimensions Space Dimensions and Dimension-compatibility for Grids
+
+The <EM>space dimension</EM> of a grid \f$\cL \in \Gset_n\f$
+is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of congruence relations, grid generators and other objects
+of the library is defined similarly.
+
+\subsection Grid_Affine_Dimension Affine Independence and Affine Dimension for Grids
+
+A <EM>non-empty</EM> grid \f$\cL \in \Gset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cG) = k\f$,
+if the maximum number of affinely independent points in \f$\cG\f$ is
+\f$k + 1\f$.
+The affine dimension of an empty grid is defined to be 0.
+Thus we have \f$0 \leq \pdim(\cG) \leq n\f$.
+
+\section rational_grid_operations Operations on Rational Grids
+
+In general, the operations on rational grids are the same as those for the other
+PPL domains and the definitions of these can be found in
+Section \ref Operations_on_Convex_Polyhedra.
+Below we just describe those operations that have features or behavior
+that is in some way special to the grid domain.
+
+\subsection Grid_Affine_Transformation Affine Images and Preimages
+
+As for convex polyhedra (see \ref Single_Update_Affine_Functions
+"Single-Update Affine Functions"),
+the library provides affine image and preimage operators for grids:
+given a variable \f$x_k\f$ and
+linear expression \f$\mathrm{expr} = \langle \vect{a}, \vect{x} \rangle + b\f$,
+these determine the affine transformation
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+ {\Rset^n}{\Rset^n}\f$
+that transforms any point
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+in a grid \f$\cL\f$ to
+\f[
+ \Bigl(v_0, \ldots, \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+ \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a grid \f$\cL\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose the grid \f$\cL\f$
+to be transformed is the non-relational grid in \f$\Rset^2\f$
+generated by the set of grid points
+\f$\bigl\{
+ (0, 0)^\transpose,
+ (0, 3)^\transpose,
+ (3, 0)^\transpose
+ \bigr\}\f$.
+Then, if the considered variable is \f$x_0\f$ and
+the linear expression is \f$3x_0 + 2 x_1 + 1\f$
+(so that \f$k = 0\f$, \f$a_0 = 3, a_1 = 2, b = 1\f$),
+the affine image operator will translate \f$\cL\f$
+to the grid \f$\cL_1\f$ generated by the set of grid points
+\f$\bigl\{
+ (1, 0)^\transpose,
+ (7, 3)^\transpose,
+ (10, 0)^\transpose
+ \bigr\}\f$
+which is the grid generated by the grid point \f$(1, 0)\f$
+and parameters \f$(3, -3), (0, 9)\f$; or, alternatively defined by the
+congruence system \f$\{x \equiv_3 1, x + y \equiv_9 1\}\f$.
+If the considered variable is as before (i.e., \f$k = 0\f$)
+but the linear expression is \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting grid \f$\cL_2\f$
+is the grid containing all the points
+whose coordinates are integral multiples of 3 and lie on
+line \f$x = y\f$.
+
+The affine preimage operator computes the affine preimage
+of a grid \f$\cL\f$ under \f$\phi\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using variable \f$x_0\f$
+and linear expression \f$3x_0 + 2 x_1 + 1\f$
+to the grid \f$\cL_1\f$;
+then we get the original grid \f$\cL\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using variable \f$x_0\f$ and linear expression \f$x_1\f$ to \f$\cL_2\f$,
+then the resulting grid will consist of
+all the points in \f$\Rset^2\f$ where the \f$y\f$
+coordinate is an integral multiple of 3.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the linear expression is non-zero, the affine transformation is invertible.
+
+\subsection Grid_Generalized_Image Generalized Affine Images
+
+Similarly to convex polyhedra (see \ref Generalized_Affine_Relations
+"Generalized Affine Relations"), the library provides two other grid operators
+that are generalizations of the single update affine image and
+preimage operators for grids.
+The <EM>generalized affine image</EM> operator
+\f$\fund{\phi = (\mathrm{lhs}', \mathrm{rhs}, f)}{\Rset^n}{\Rset^n}\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and \f$f \in \Qset\f$, is defined as
+\f[
+ \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+ \itc
+ (\vect{v}, \vect{w}) \in \phi
+ \iff
+ \bigl(
+ \langle \vect{c}, \vect{w} \rangle + d
+ \equiv_f \langle \vect{a}, \vect{v} \rangle + b
+ \bigr)
+ \land
+ \Bigl(
+ \bigland_{0 \leq i < n, c_i = 0}
+ w_i = v_i
+ \Bigr).
+\f]
+Note that, when \f$\mathrm{lhs} = x_k\f$ and \f$f = 0\f$,
+so that the transfer function is an equality,
+then the above operator
+is equivalent to the application of the standard affine image
+of \f$\cL\f$ with respect to the variable \f$x_k\f$ and the
+affine expression \f$\mathrm{rhs}\f$.
+
+\subsection Grid_Frequency Frequency Operator
+
+Let \f$\cL \in \Gset_n\f$ be any non-empty grid and
+\f$\mathrm{expr} = \bigl(\langle \vect{a}, \vect{x} \rangle + b\bigr)\f$
+be a linear expression. Then if, for
+some \f$c, f \in \Rset\f$, all the points in \f$\cL\f$ satisfy the
+congruence \f$\cg = ( \mathrm{expr} \equiv_f c )\f$, then the maximum
+\f$f\f$ such that this holds is called the <EM>frequency</EM> of
+\f$\cL\f$ with respect to \f$\mathrm{expr}\f$.
+
+The frequency operator provided by the library returns both
+the frequency \f$f\f$ and a value
+\f$\mathrm{val} = \langle \vect{a}, \vect{w} \rangle + b\f$
+where \f$\vect{w} \in \cL\f$ and
+\f[
+ \lvert\mathrm{val}\rvert
+ = \min\Bigl\{\,
+ \bigl\lvert\langle \vect{a}, \vect{v} \rangle + b \bigr\rvert
+ \Bigm|
+ \vect{v} \in \cL
+ \,\Bigr\}.
+\f]
+
+Observe that the above definition is also applied to other simple objects in
+the library like polyhedra, octagonal shapes, bd-shapes and boxes
+and in such cases the definition of frequency can be simplified.
+For instance, the frequency for an object \f$\cP \in \Pset_n\f$ is
+defined if and only if there is a unique value \f$c\f$ such that
+\f$\cP\f$ saturates the equality \f$( \mathrm{expr} = c )\f$;
+in this case the frequency is \f$0\f$ and the value returned is \f$c\f$.
+
+\subsection Grid_Time_Elapse Time-Elapse Operator
+
+For any two grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>time-elapse</EM> between \f$\cL_1\f$ and \f$\cL_2\f$,
+denoted \f$ \cL_1 \nearrow \cL_2\f$,
+is the grid
+\f[
+ \bigl\{\,
+ \vect{p} + \mu \vect{q} \in \Rset^n
+ \bigm|
+ \vect{p} \in \cL_1, \vect{q} \in \cL_2, \mu \in \Zset
+ \,\bigr\}.
+\f]
+
+\subsection Grid_Relation_With Relation-with Operators
+
+The library provides operators for checking the relation holding
+between a grid and
+a congruence, a grid generator, a constraint or a (polyhedron) generator.
+
+Suppose \f$\cL\f$ is a grid
+and \f$\cC\f$ an arbitrary congruence system representing \f$\cL\f$.
+Suppose also that
+\f$
+ \cg = \bigl(
+ \langle \vect{a}, \vect{x} \rangle \equiv_f b
+ \bigr)
+\f$
+is a congruence relation
+with \f$\cL_{\cg} = \gcon\bigl(\{\cg\}\bigr)\f$.
+The possible relations between \f$\cL\f$ and \f$\cg\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$\cg\f$ if
+ \f$\cL \inters \cL_{\cg} = \emptyset\f$; that is, adding \f$\cg\f$
+ to \f$\cC\f$ gives us the empty grid.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$\cg\f$ if
+ \f$\cL \inters \cL_{\cg} \neq \emptyset\f$ and
+ \f$\cL \inters \cL_{\cg} \subset \cL\f$;
+ that is, adding \f$\cg\f$ to \f$\cC\f$
+ gives us a non-empty grid strictly smaller than \f$\cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$\cg\f$ if \f$\cL \sseq \cL_{\cg}\f$;
+ that is, adding \f$\cg\f$ to \f$\cC\f$ leaves \f$\cL\f$ unchanged.
+- \f$\cL\f$ <EM>saturates</EM> \f$\cg\f$ if \f$\cL\f$ <EM>is included</EM>
+ in \f$\cg\f$ and \f$f = 0\f$, i.e., \f$\cg\f$ is an equality congruence.
+
+For the relation between \f$\cL\f$ and a constraint, suppose that
+\f$
+ c = \bigl(
+ \langle \vect{a}, \vect{x} \rangle \relsym b
+ \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points that satisfy \f$c\f$.
+The possible relations between \f$\cL\f$ and \f$c\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$c\f$ if
+ \f$\cL \inters \cQ = \emptyset\f$.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$c\f$ if
+ \f$\cL \inters \cQ \neq \emptyset\f$ and \f$\cL \inters \cQ \subset \cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$c\f$ if \f$\cL \sseq \cQ\f$.
+- \f$\cL\f$ <EM>saturates</EM> \f$c\f$ if \f$\cL\f$ <EM>is included</EM>
+ in \f$c\f$ and \f$\mathord{\relsym}\f$ is \f$=\f$.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a grid generator \f$g\f$
+if adding \f$g\f$ to any grid generator system representing \f$\cL\f$
+does not change \f$\cL\f$.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) point or closure point
+\f$g\f$ if adding the corresponding grid point to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) ray or line
+\f$g\f$ if adding the corresponding grid line to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+
+\subsection Grid_Wrapping_Operator Wrapping Operator
+
+The operator <CODE>wrap_assign</CODE> provided by the library, allows
+for the \ref Wrapping_Operator "wrapping" of a subset of the set of
+space dimensions so as to fit the given bounded integer type and have
+the specified overflow behavior. In order to maximize the precision
+of this operator for grids, the exact behavior differs in some
+respects from the other simple classes of geometric descriptors.
+
+Suppose \f$\cL \in \Gset_n\f$ is a grid and \f$J\f$ a subset of the
+set of space dimensions \f$\{0, \ldots, n-1\}\f$.
+Suppose also that the width of the bounded integer type is \f$w\f$ so that
+the range of values \f$R = \{r \in \Rset \mid 0 \leq r < 2^w\}\f$
+if the type is unsigned
+and \f$R = \{r \in \Rset \mid -2^{w-1} \leq r < 2^{w-1}\}\f$ otherwise.
+Consider a space dimension \f$j \in J\f$ and a variable \f$v_j\f$
+for dimension \f$j\f$.
+
+If the value in \f$\cL\f$ for the variable \f$v_j\f$ is a constant in
+the range \f$R\f$, then it is unchanged. Otherwise the result
+\f$\cL'\f$ of the operation on \f$\cL\f$ will depend on the specified
+overflow behavior.
+
+- Overflow impossible. In this case, it is known that no wrapping can
+ occur. If the grid \f$\cL\f$ has no value for the variable \f$v_j\f$ in the
+ range \f$R\f$, then \f$\cL\f$ is set empty. If \f$v_j\f$ has exactly
+ one value \f$a \in R\f$ in \f$\cL\f$, then \f$v_j\f$ is set
+ equal to \f$a\f$. Otherwise, \f$\cL' = \cL\f$.
+
+- Overflow undefined. In this case, for each value \f$a\f$ for
+ \f$v_j\f$ in the grid \f$\cL\f$, the wrapped value can be any value
+ \f$a + z \in R\f$ where \f$z \in \Zset\f$.
+ Therefore \f$\cL'\f$ is obtained by adding the parameter
+ \f$(0, \ldots, 0, v_j, 0, \ldots, 0)\f$,
+ where \f$v_j = 1\f$, to the generator system for \f$\cL\f$.
+
+- Overflow wraps. In this case, if \f$\cL\f$ already satisfies the
+ congruence \f$v_j = a \mod 2^w\f$, for some \f$a \in \Rset\f$, then
+ \f$v_j\f$ is set equal to \f$a'\f$ where \f$a' = a \mod 2^w\f$ and
+ \f$a'\in R\f$. Otherwise, \f$\cL'\f$ is obtained by adding the
+ parameter \f$(0, \ldots, 0, v_j, 0, \ldots, 0)\f$, where
+ \f$v_j = 2^w\f$, to the generator system for \f$\cL\f$.
+
+\subsection Grid_Widening Widening Operators
+
+The library provides <EM>grid widening</EM> operators for the domain of grids.
+The congruence widening and generator widening
+follow the specifications provided in \ref BDHetal05 "[BDHetal05]".
+The third widening uses either
+the congruence or the generator widening, the exact rule governing this choice
+at the time of the call is left to the implementation.
+Note that, as for the widenings provided for convex polyhedra,
+all the operations provided by the library
+for computing a widening \f$\cL_1 \widen \cL_2\f$ of
+grids \f$\cL_1, \cL_2 \in \Gset_n\f$ require as a precondition that
+\f$\cL_1 \sseq \cL_2\f$.
+
+\note
+As is the case for the other operators on grids, the
+implementation overwrites one of the two grid arguments with the
+result of the widening application.
+It is worth stressing that, in any widening operation that computes the
+widening \f$\cL_1 \widen \cL_2\f$, the resulting grid will be assigned
+to overwrite the store containing the bigger grid \f$\cL_2\f$.
+The smaller grid \f$\cL_1\f$ is not modified.
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the language
+interfaces.
+
+\subsection Grid_Widening_with_Tokens Widening with Tokens
+
+This is as for \ref Widening_with_Tokens "widening with tokens"
+for convex polyhedra.
+
+\subsection Grid_Extrapolation Extrapolation Operators
+
+Besides the widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+In particular, for each grid widening that is provided,
+there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a congruence system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that,
+as in the case for convex polyhedra, a convergence guarantee
+can only be obtained by suitably restricting the set of
+congruence relations that can occur in this additional parameter.
+
+\section powerset The Powerset Construction
+
+The PPL provides the finite powerset construction; this takes a
+pre-existing domain and upgrades it to one that can represent
+disjunctive information (by using a <EM>finite</EM> number of
+disjuncts). The construction follows the approach described in
+\ref Bag98 "[Bag98]", also summarized in \ref BHZ04 "[BHZ04]" where there
+is an account of generic widenings for the powerset domain (some of
+which are supported in the pointset powerset domain instantiation
+of this construction described in Section \ref pointset_powerset).
+
+\anchor powerset_domain
+\subsection The_Powerset_Domain The Powerset Domain
+
+The domain is built from a pre-existing base-level domain
+\f$D\f$ which must include an entailment relation `\f$\mathord{\entails}\f$',
+meet operation `\f$\mathord{\meet}\f$', a top element `\f$\true\f$' and
+bottom element `\f$\false\f$'.
+
+A set \f$\cS \in \wp(D)\f$ is called <EM>non-redundant</EM>
+with respect to `\f$\mathord{\entails}\f$' if and only if
+\f$\false \notin \cS\f$
+and \f$\forall d_1, d_2 \in \cS \itc d_1 \entails d_2 \implies d_1 = d_2\f$.
+The set of finite non-redundant subsets of \f$D\f$
+(with respect to `\f$\mathord{\entails}\f$')
+is denoted by \f$\wpfn{D}{\entails}\f$.
+The function
+\f$\fund{\nonredmap}{\wpf(D)}{\wpfn{D}{\entails}}\f$,
+called <EM>Omega-reduction</EM>,
+maps a finite set into its non-redundant counterpart;
+it is defined, for each \f$\cS \in \wpf(D)\f$, by
+\f[
+ \nonredmap(\cS)
+ \defeq
+ \cS \setdiff \{\,
+ d \in \cS
+ \mid
+ d = \false \text{ or } \exists d' \in \cS \st d \sentails d'
+ \,\}.
+\f]
+where \f$d \sentails d'\f$ denotes \f$d \entails d' \land d \ne d'\f$.
+
+As the intended semantics of a powerset domain element \f$\cS \in \wpf(D)\f$
+is that of disjunction of the semantics of \f$D\f$,
+the finite set \f$\cS\f$ is semantically equivalent
+to the non-redundant set \f$\nonredmap(\cS)\f$;
+and elements of \f$\cS\f$ will be called <EM>disjuncts</EM>.
+The restriction to the finite subsets reflects the fact that here
+disjunctions are implemented by explicit collections of disjuncts.
+As a consequence of this restriction, for any \f$\cS \in \wpf(D)\f$
+such that \f$\cS \neq \{ \false \}\f$, \f$\nonredmap(\cS)\f$ is the (finite)
+set of the maximal elements of \f$\cS\f$.
+
+The <EM>finite powerset domain</EM> over a domain \f$D\f$ is the set
+of all finite non-redundant sets of \f$D\f$ and denoted by \f$D_{\smallP}\f$.
+The domain includes an approximation ordering
+`\f$\mathord{\entailsP}\f$' defined so that,
+for any \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$,
+\f$\cS_1 \entailsP \cS_2\f$ if and only if
+\f[
+ \forall d_1 \in \cS_1 \itc
+ \exists d_2 \in \cS_2 \st
+ d_1 \entails d_2.
+\f]
+Therefore the top element is \f$\{\true\}\f$ and the bottom element is the
+emptyset.
+
+\note
+As far as Omega-reduction is concerned, the library adopts a
+<EM>lazy</EM> approach: an element of the powerset domain is
+represented by a potentially redundant sequence of disjuncts.
+Redundancies can be eliminated by explicitly invoking the operator
+<CODE>omega_reduce()</CODE>, e.g., before performing the output of a
+powerset element. Note that all the documented operators automatically
+perform Omega-reductions on their arguments, when needed or appropriate.
+
+\section ps_operations Operations on the Powerset Construction
+
+In this section we briefly describe the generic operations on Powerset Domains
+that are provided by the library for any given base-level domain \f$D\f$.
+
+\anchor ps_meet_upper_bound
+\subsection Meet_and_Upper_Bound Meet and Upper Bound
+
+Given the sets \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$, the
+<EM>meet</EM> and <EM>upper bound</EM> operators provided by the
+library returns the set
+\f$
+ \nonredmap
+ \bigl(
+ \{\,
+ d_1 \meet d_2
+ \mid
+ d_1 \in \cS_1, d_2 \in \cS_2
+ \,\}
+ \bigr)
+\f$
+and Omega-reduced set union \f$\nonredmap(\cS_1 \union \cS_2)\f$ respectively.
+
+\anchor ps_add_disjunct
+\subsection Adding_a_Disjunct Adding a Disjunct
+
+Given the powerset element \f$\cS \in D_{\smallP}\f$ and the base-level
+element \f$d \in D\f$, the <EM>add disjunct</EM> operator provided by
+the library returns the powerset element
+\f$\nonredmap\bigl(\cS \union \{d\}\bigr)\f$.
+
+\anchor ps_collapse
+\subsection Collapsing_a_Powerset_Element Collapsing a Powerset Element
+
+If the given powerset element is not empty, then the
+<EM>collapse</EM> operator returns the
+singleton powerset consisting of an upper-bound of all the disjuncts.
+
+\section pointset_powerset The Pointset Powerset Domain
+
+The pointset powerset domain provided by the PPL is the finite
+powerset domain (defined in Section \ref powerset) whose base-level domain
+\f$D\f$ is one of the classes of semantic geometric descriptors listed in
+Section \ref Semantic_Geometric_Descriptors.
+
+In addition to the operations described for the generic powerset
+domain in Section \ref ps_operations, the PPL provides
+all the generic operations
+listed in \ref Generic_Operations_on_Semantic_Geometric_Descriptors.
+Here we just describe those operations that
+are particular to the pointset powerset domain.
+
+\subsection Powerset_Meet_Preserving_Simplification Meet-Preserving Simplification
+
+Let \f$\cS_1 = \{ d_1, \ldots, d_m \}\f$,
+\f$\cS_2 = \{ c_1, \ldots, c_n \}\f$ and
+\f$\cS = \{ s_1, \ldots, s_q \}\f$
+be Omega-reduced elements of a pointset powerset domain
+over the same base-level domain.
+Then:
+
+ - \f$\cS\f$ is <EM>powerset meet-preserving</EM>
+ with respect to \f$\cS_1\f$ using context \f$\cS_2\f$ if
+ the meet of \f$\cS\f$ and \f$\cS_2\f$
+ is equal to
+ the meet of \f$\cS_1\f$ and \f$\cS_2\f$;
+
+ - \f$\cS\f$ is a <EM>powerset simplification</EM> with respect to
+ \f$\cS_1\f$ if \f$q \leq m\f$.
+
+ - \f$\cS\f$ is a <EM>disjunct meet-preserving simplification</EM>
+ with respect to \f$\cS_1\f$
+ if, for each \f$s_k \in \cS\f$,
+ there exists \f$d_i \in \cS_1\f$ such that, for each \f$c_j \in \cS_2\f$,
+ \f$s_k\f$ is a meet-preserving enlargement and simplification
+ of \f$d_i\f$ using context \f$c_j\f$.
+
+The library provides a binary operator (<CODE>simplify_using_context</CODE>)
+for the pointset powerset domain that returns a powerset which is a
+powerset meet-preserving, powerset simplification and
+disjunct meet-preserving simplification
+of its first argument using the second argument as context.
+
+Notice that, due to the powerset simplification property, in general
+a meet-preserving powerset simplification is <em>not</em> an enlargement
+with respect to the ordering defined on the powerset lattice.
+Because of this, the operator provided by the library
+is only well-defined when the base-level domain
+is not itself a powerset domain.
+
+
+\anchor pps_geometric
+\subsection Geometric_Comparisons Geometric Comparisons
+
+Given the pointset powersets \f$\cS_1, \cS_2\f$ over the same base-level domain
+and with the same space dimension, then
+we say that \f$\cS_1\f$ <EM>geometrically covers</EM> \f$\cS_2\f$
+if every point (in some disjunct) of \f$\cS_2\f$ is also
+a point in a disjunct of \f$\cS_1\f$.
+If \f$\cS_1\f$ geometrically covers \f$\cS_2\f$
+and \f$\cS_2\f$ geometrically covers \f$\cS_1\f$,
+then we say that they are <EM>geometrically equal</EM>.
+
+
+\anchor pps_pairwise_merge
+\subsection Pairwise_Merge Pairwise Merge
+
+Given the pointset powerset \f$\cS\f$ over a base-level semantic GD domain
+\f$D\f$, then the
+<EM>pairwise merge</EM> operator takes pairs of distinct elements in
+\f$\cS\f$ whose upper bound (denoted here by \f$\uplus\f$) in \f$D\f$
+(using the PPL operator <CODE>upper_bound_assign()</CODE> for \f$D\f$)
+is the same as their set-theoretical union
+and replaces them by their union. This replacement is done
+recursively so that, for each pair \f$c, d\f$ of distinct
+disjuncts in the result set, we have
+\f$c \uplus d \neq c \union d\f$.
+
+\anchor pps_bgp99_extrapolation
+\subsection Powerset_Extrapolation_Operators Powerset Extrapolation Operators
+
+The library implements a generalization of the extrapolation operator
+for powerset domains proposed in \ref BGP99 "[BGP99]".
+The operator <CODE>BGP99_extrapolation_assign</CODE> is made parametric
+by allowing for the specification of any PPL extrapolation operator
+for the base-level domain.
+Note that, even when the extrapolation operator for the
+base-level domain \f$D\f$ is known to be a widening on \f$D\f$,
+the <CODE>BGP99_extrapolation_assign</CODE> operator cannot guarantee the
+convergence of the iteration sequence in a finite number of steps
+(for a counter-example, see \ref BHZ04 "[BHZ04]").
+
+\anchor pps_certificate_widening
+\subsection Certificate_Based_Widenings Certificate-Based Widenings
+
+The PPL library provides support for the specification of proper widening
+operators on the pointset powerset domain. In particular,
+this version of the library implements an instance of the
+<EM>certificate-based widening framework</EM> proposed in
+\ref BHZ03b "[BHZ03b]".
+
+A <EM>finite convergence certificate</EM> for an extrapolation operator
+is a formal way of ensuring that such an operator is indeed a widening
+on the considered domain. Given a widening operator on the base-level
+domain \f$D\f$, together with the corresponding convergence certificate,
+the BHZ03 framework is able to lift this widening on \f$D\f$
+to a widening on the pointset powerset domain; ensuring
+convergence in a finite number of iterations.
+
+Being highly parametric, the BHZ03 widening framework can be
+instantiated in many ways. The current implementation provides
+the templatic operator
+<CODE>BHZ03_widening_assign\<Certificate, Widening\></CODE>
+which only exploits a fraction of this generality, by allowing the
+user to specify the base-level widening function and the corresponding
+certificate. The widening strategy is fixed and uses two extrapolation
+heuristics: first, the upper bound operator for the base-level domain
+is tried; second,
+the \ref pps_bgp99_extrapolation "BGP99 extrapolation operator" is tried,
+possibly applying \ref pps_pairwise_merge "pairwise merging".
+If both heuristics fail to converge according to the convergence
+certificate, then an attempt is made to apply the base-level widening
+to the upper bound of the two arguments, possibly improving the result
+obtained by means of the difference operator for the base-level domain.
+For more details and a justification of the overall approach,
+see \ref BHZ03b "[BHZ03b]" and \ref BHZ04 "[BHZ04]".
+
+The library provides several convergence certificates.
+Note that, for the domain of Polyhedra, while
+\ref Parma_Polyhedra_Library::BHRZ03_Certificate the "BHRZ03_Certificate"
+is compatible with both the BHRZ03 and the H79 widenings,
+\ref Parma_Polyhedra_Library::H79_Certificate "H79_Certificate"
+is only compatible with the latter.
+Note that using different certificates will change the results obtained,
+even when using the same base-level widening operator.
+It is also worth stressing that it is up to the user
+to see that the widening operator is actually compatible with
+a given convergence certificate. If such a requirement is not met,
+then an extrapolation operator will be obtained.
+
+\section floating_point Analysis of floating point computations
+
+This section describes the PPL abstract domains that are used for
+approximating floating point computations in software analysis. We follow
+the approch described in \ref Min04 "[Min04]" and more detailedly in
+\ref Min05 "[Min05]". We will denote by \f$\cV\f$ the set of all floating
+point variables in the analyzed program. We will also denote by
+\f$\mathbb{F}_a\f$ the set of floating point numbers in the format used by the
+analyzer (that is, the machine running the PPL) and by \f$\mathbb{F}_t\f$
+the set of floating point numbers in the format used by the machine that is
+expected to run the analyzed program. Recall that floating point numbers
+include the infinities \f$-\infty\f$ and \f$+\infty\f$.
+
+\subsection interval_linear_forms Linear forms with interval coefficients
+
+Generic concrete <EM>floating point expressions</EM> on
+\f$\mathbb{F}_t\f$ are represented by the
+\link Parma_Polyhedra_Library::Floating_Point_Expression \c Floating_Point_Expression \endlink
+abstract class. Its concrete derivate classes are:
+ - \link Parma_Polyhedra_Library::Cast_Floating_Point_Expression \c Cast_Floating_Point_Expression \endlink,
+ - \link Parma_Polyhedra_Library::Constant_Floating_Point_Expression \c Constant_Floating_Point_Expression \endlink,
+ - \link Parma_Polyhedra_Library::Variable_Floating_Point_Expression \c Variable_Floating_Point_Expression \endlink,
+ - \link Parma_Polyhedra_Library::Opposite_Floating_Point_Expression \c Opposite_Floating_Point_Expression \endlink,
+ that is the negation (unary minus) of a floating point expression,
+ - \link Parma_Polyhedra_Library::Sum_Floating_Point_Expression \c Sum_Floating_Point_Expression \endlink,
+ that is the sum of two floating point expressions,
+ - \link Parma_Polyhedra_Library::Difference_Floating_Point_Expression \c Difference_Floating_Point_Expression \endlink,
+ that is the difference of two floating point expressions,
+ - \link Parma_Polyhedra_Library::Multiplication_Floating_Point_Expression \c Multiplication_Floating_Point_Expression \endlink,
+ that is the product of two floating point expressions, and
+ - \link Parma_Polyhedra_Library::Division_Floating_Point_Expression \c Division_Floating_Point_Expression \endlink,
+ that is the division of two floating point expressions.
+
+The set of all the possible values in \f$\mathbb{F}_t\f$ of a floating point
+expression at a given program point in a given abstract store can be
+overapproximated by a <EM>linear form</EM> with interval coefficients, that is
+a linear expression of this kind:
+
+\f[
+ i + \sum_{v \in \cV}i_{v}v,
+\f]
+
+where all \f$v\f$ are free floating point variables and \f$i\f$ and all
+\f$i_{v}\f$ are elements of \f$\mathbb{I}_a\f$, defined as the set of all
+intervals with boundaries in \f$\mathbb{F}_a\f$. This operation is called
+<EM>linearization</EM> and is performed by the method linearize of floating
+point expression classes.
+
+Even though the intervals may be open, we will always use closed intervals
+in the documentation for the sake of simplicity, with the exception of unbounded
+intervals that have \f$\infty\f$ boundaries. We denote the set of all linear
+forms on \f$\mathbb{F}_a\f$ by \f$\mathbb{L}_a\f$.
+
+The \link Parma_Polyhedra_Library::Linear_Form \c Linear_Form \endlink class
+provides common algebraic operations on linear forms: you can add or
+subtract two linear forms, and multiply or divide a linear form by a scalar.
+We are writing only about interval linear forms in this section, so our
+scalars will always be intervals with floating point boundaries.
+The operations on interval linear forms are intuitively defined as follows:
+
+\f[
+
+ \left(i + \sum_{v \in V}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in V}i'_{v}v\right)
+ \defeq
+ \left(i \asifp i'\right) +
+ \sum_{v \in V}\left(i_{v} \asifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+ \left(i + \sum_{v \in V}i_{v}v\right)
+ \adlf
+ \left(i' + \sum_{v \in V}i'_{v}v\right)
+ \defeq
+ \left(i \adifp i'\right) +
+ \sum_{v \in V}\left(i_{v} \adifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+ i
+ \amlf
+ \left(i' + \sum_{v \in V}i'_{v}v\right)
+ \defeq
+ \left(i \amifp i'\right) +
+ \sum_{v \in V}\left(i \amifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+ \left(i + \sum_{v \in V}i_{v}v\right)
+ \adivlf
+ i'
+ \defeq
+ \left(i \adivifp i'\right) +
+ \sum_{v \in V}\left(i_{v} \adivifp i'\right)v.
+
+\f]
+
+Where \f$\asifp, \adifp, \amifp,\f$ and \f$\adivifp\f$ are the corresponding
+operations on intervals. Note that these operations always round the
+interval's lower bound towards \f$-\infty\f$ and the upper bound towards
+\f$+\infty\f$ in order to obtain a correct overapproximation.
+
+A <EM>(composite) floating point abstract store</EM> is used to associate each
+floating point variable with its currently known approximation. The store is
+composed by two parts:
+ - an <EM>interval abstract store</EM>
+ \f$\fund{\rho^{\#}}{\cV}{\mathbb{I}_a}\f$
+ associating each variable with its current approximating interval, and
+ - a <EM>linear form abstract store</EM>
+ \f$\fund{\rho^{\#}_l}{\cV}{\mathbb{L}_a}\f$
+ associating each variable with its current approximating linear form.
+
+An interval abstract store is represented by a
+\link Parma_Polyhedra_Library::Box \c Box \endlink with floating point
+boundaries, while a linear form abstract store is a map
+of the Standard Template Library. The <CODE>linearize</CODE> method requires
+both stores as its arguments. Please see the documentation of floating point
+expression classes for more information.
+
+The linearization of a floating point expression \f$e\f$ in the composite
+abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$ will
+be denoted by \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$. There are two ways a linearization attempt can fail:
+ - whenever an interval boundary overflows to \f$+\infty\f$ or \f$-\infty\f$,
+ and
+ - when we try to divide by an interval that contains \f$0\f$.
+
+\subsection fp_abstract_domains Use of other abstract domains for floating point analysis
+
+Three of the other abstract domains of the PPL (
+\link Parma_Polyhedra_Library::BD_Shape \c BD_Shape \endlink,
+\link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape \endlink,
+and \link Parma_Polyhedra_Library::Polyhedron \c Polyhedron \endlink)
+provide a few optimized methods to be used in the analysis of floating point
+computations. They are recognized by the fact that they take interval
+linear forms and/or an interval abstract stores as their parameters.
+
+Please see the methods' documentation for more information.
+
+\section use_of_library Using the Library
+
+\subsection A_Note_on_the_Implementation_of_the_Operators A Note on the Implementation of the Operators
+
+When adopting the double description method for the representation of
+convex polyhedra, the implementation of most of the operators may
+require an explicit conversion from one of the two representations
+into the other one, leading to algorithms having a worst-case
+exponential complexity. However, thanks to the adoption of lazy and
+incremental computation techniques, the library turns out to be rather
+efficient in many practical cases.
+
+In earlier versions of the library, a number of operators were introduced
+in two flavors: a <EM>lazy</EM> version and an <EM>eager</EM> version,
+the latter having the operator name ending with <CODE>_and_minimize</CODE>.
+In principle, only the lazy versions should be used.
+The eager versions were added to help a knowledgeable user obtain better
+performance in particular cases. Basically, by invoking the eager version
+of an operator, the user is trading laziness to better exploit the
+incrementality of the inner library computations.
+Starting from version 0.5, the lazy and incremental computation techniques
+have been refined to achieve a better integration: as a consequence,
+the lazy versions of the operators are now almost always more efficient
+than the eager versions.
+
+One of the cases when an eager computation might still make sense
+is when the well-known <EM>fail-first</EM> principle comes into play.
+For instance, if you have to compute the intersection of several
+polyhedra and you strongly suspect that the result will become empty
+after a few of these intersections, then you may obtain a better
+performance by calling the eager version of the intersection operator,
+since the minimization process also enforces an emptiness check.
+Note anyway that the same effect can be obtained by interleaving
+the calls of the lazy operator with explicit emptiness checks.
+
+\warning
+For the reasons mentioned above, starting from version 0.10 of the
+library, the usage of the eager versions (i.e., the ones having a
+name ending with <CODE>_and_minimize</CODE>) of these operators is
+\em deprecated; this is in preparation of their complete removal,
+which will occur starting from version 0.11.
+
+\subsection On_Pointset_Powerset_and_Partially_Reduced_Product_Domains_A_Warning On Pointset_Powerset and Partially_Reduced_Product Domains: A Warning
+
+ For future versions of the PPL library all practical instantiations
+for the disjuncts for a pointset_powerset and component domains for
+the partially_reduced_product domains will be fully
+supported. However, for version 0.10, these compound domains should
+not themselves occur as one of their argument domains. Therefore their
+use comes with the following warning.
+
+\warning
+The <CODE>Pointset_Powerset<PSET></CODE> and
+<CODE>Partially_Reduced_Product<D1, D2, R></CODE>
+should only be used with the following instantiations
+for the disjunct domain template \p PSET and component domain
+templates \p D1 and \p D2:
+<CODE>C_Polyhedron</CODE>,
+<CODE>NNC_Polyhedron</CODE>,
+<CODE>Grid</CODE>,
+<CODE>Octagonal_Shape<T></CODE>,
+<CODE>BD_Shape<T></CODE>,
+<CODE>Box<T></CODE>.
+
+\subsection On_Object_Orientation_and_Polymorphism_A_Disclaimer On Object-Orientation and Polymorphism: A Disclaimer
+
+The PPL library is mainly a collection of so-called ``concrete data
+types'': while providing the user with a clean and friendly interface,
+these types are not meant to --- i.e., they should not --- be used
+polymorphically (since, e.g., most of the destructors are not declared
+<CODE>virtual</CODE>). In practice, this restriction means that the
+library types should not be used as <EM>public base classes</EM> to be
+derived from. A user willing to extend the library types, adding new
+functionalities, often can do so by using <EM>containment</EM> instead
+of inheritance; even when there is the need to override a
+<CODE>protected</CODE> method, non-public inheritance should suffice.
+
+\subsection On_Const_Correctness_A_Warning_about_the_Use_of_References_and_Iterators On Const-Correctness: A Warning about the Use of References and Iterators
+
+Most operators of the library depend on one or more parameters
+that are declared ``const'', meaning that they will not be changed
+by the application of the considered operator.
+Due to the adoption of lazy computation techniques, in many cases
+such a const-correctness guarantee only holds at the semantic level,
+whereas it does not necessarily hold at the implementation level.
+For a typical example, consider the extraction from a polyhedron
+of its constraint system representation.
+While this operation is not going to change the polyhedron,
+it might actually invoke the internal conversion algorithm
+and modify the generators representation of the polyhedron object,
+e.g., by reordering the generators and removing those that are
+detected as redundant. Thus, any previously computed reference
+to the generators of the polyhedron (be it a direct reference object
+or an indirect one, such as an iterator) will no longer be valid.
+For this reason, code fragments such as the following should be
+avoided, as they may result in undefined behavior:
+\code
+// Find a reference to the first point of the non-empty polyhedron `ph'.
+const Generator_System& gs = ph.generators();
+Generator_System::const_iterator i = gs.begin();
+for (Generator_System::const_iterator gs_end = gs.end(); i != gs_end; ++i)
+ if (i->is_point())
+ break;
+const Generator& p = *i;
+// Get the constraints of `ph'.
+const Constraint_System& cs = ph.constraints();
+// Both the const iterator `i' and the reference `p'
+// are no longer valid at this point.
+cout << p.divisor() << endl; // Undefined behavior!
+++i; // Undefined behavior!
+\endcode
+As a rule of thumb, if a polyhedron plays any role in a computation
+(even as a const parameter), then any previously computed reference
+to parts of the polyhedron may have been invalidated.
+Note that, in the example above, the computation of the constraint system
+could have been placed after the uses of the iterator <CODE>i</CODE>
+and the reference <CODE>p</CODE>.
+Anyway, if really needed, it is always possible to take a copy of,
+instead of a reference to, the parts of interest of the polyhedron;
+in the case above, one may have taken a copy of the generator system
+by replacing the second line of code with the following:
+\code
+Generator_System gs = ph.generators();
+\endcode
+The same observations, modulo syntactic sugar, apply to the operators
+defined in the C interface of the library.
+
+\section bibliography Bibliography
+
+<DL>
+
+<DT>[Anc91]</DT>
+<DD>
+\anchor Anc91
+C. Ancourt.
+ <em>Génération automatique de codes de transfert pour
+ multiprocesseurs à mémoires locales</em>.
+ PhD thesis, Université de Paris VI, Paris, France, March 1991.
+
+</DD>
+
+
+<DT>[BA05]</DT>
+<DD>
+\anchor BA05
+J. M. Bjorndalen and O. Anshus.
+ Lessons learned in benchmarking - Floating point benchmarks: Can
+ you trust them?
+ In <em>Proceedings of the <em>Norsk informatikkonferanse 2005</em>
+ (NIK 2005)</em>, pages 89-100, Bergen, Norway, 2005. Tapir Akademisk Forlag.
+
+
+</DD>
+
+
+<DT>[Bag97]</DT>
+<DD>
+\anchor Bag97
+R. Bagnara.
+ <em>Data-Flow Analysis for Constraint Logic-Based Languages</em>.
+ PhD thesis, Dipartimento di Informatica, Università di Pisa, Pisa,
+ Italy, March 1997.
+ Printed as Report TD-1/97.
+
+</DD>
+
+
+<DT>[Bag98]</DT>
+<DD>
+\anchor Bag98
+R. Bagnara.
+ A hierarchy of constraint systems for data-flow analysis of
+ constraint logic-based languages.
+ <em>Science of Computer Programming</em>, 30(1-2):119-155, 1998.
+
+
+</DD>
+
+
+<DT>[BCC<sup>+</sup>02]</DT>
+<DD>
+\anchor BCCetal02
+B. Blanchet, P. Cousot, R. Cousot, J. Feret, L. Mauborgne, A. Miné,
+ D. Monniaux, and X. Rival.
+ Design and implementation of a special-purpose static program
+ analyzer for safety-critical real-time embedded software.
+ In T. Æ. Mogensen, D. A. Schmidt, and I. Hal Sudborough,
+ editors, <em>The Essence of Computation, Complexity, Analysis,
+ Transformation. Essays Dedicated to Neil D. Jones [on occasion of his 60th
+ birthday]</em>, volume 2566 of <em>Lecture Notes in Computer Science</em>, pages
+ 85-108. Springer-Verlag, Berlin, 2002.
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>05]</DT>
+<DD>
+\anchor BDHetal05
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ A linear domain for analyzing the distribution of numerical values.
+ Report 2005.06, School of Computing, University of Leeds, UK, 2005.
+
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>06]</DT>
+<DD>
+\anchor BDHetal06
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ A practical tool for analyzing the distribution of numerical values,
+ 2006.
+ Available at
+ <a href="http://www.comp.leeds.ac.uk/hill/Papers/papers.html">http://www.comp.leeds.ac.uk/hill/Papers/papers.html</a>.
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>07]</DT>
+<DD>
+\anchor BDHetal07
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ Grids: A domain for analyzing the distribution of numerical values.
+ In G. Puebla, editor, <em>Logic-based Program Synthesis and
+ Transformation, 16th International Symposium</em>, volume 4407 of <em>Lecture
+ Notes in Computer Science</em>, pages 219-235, Venice, Italy, 2007.
+ Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BFM11]</DT>
+<DD>
+\anchor BFM11
+M. Benerecetti, M. Faella, and S. Minopoli.
+ Towards efficient exact synthesis for linear hybrid systems.
+ In <em>Proceedings of 2nd International Symposium on Games,
+ Automata, Logics and Formal Verification (GandALF 2011)</em>, volume 54 of <em>
+ Electronic Proceedings in Theoretical Computer Science</em>, pages 263-277,
+ Minori, Amalfi Coast, Italy, 2011.
+
+</DD>
+
+
+<DT>[BFM13]</DT>
+<DD>
+\anchor BFM13
+M. Benerecetti, M. Faella, and S. Minopoli.
+ Automatic synthesis of switching controllers for linear hybrid
+ systems: Safety control.
+ <em>Theoretical Computer Science</em>, 493:116-138, 2013.
+
+</DD>
+
+
+<DT>[BFT00]</DT>
+<DD>
+\anchor BFT00
+A. Bemporad, K. Fukuda, and F. D. Torrisi.
+ Convexity recognition of the union of polyhedra.
+ Report AUT00-13, Automatic Control Laboratory, ETHZ, Zurich,
+ Switzerland, 2000.
+
+
+</DD>
+
+
+<DT>[BFT01]</DT>
+<DD>
+\anchor BFT01
+A. Bemporad, K. Fukuda, and F. D. Torrisi.
+ Convexity recognition of the union of polyhedra.
+ <em>Computational Geometry: Theory and Applications</em>,
+ 18(3):141-154, 2001.
+
+</DD>
+
+
+<DT>[BGP99]</DT>
+<DD>
+\anchor BGP99
+T. Bultan, R. Gerber, and W. Pugh.
+ Model-checking concurrent systems with unbounded integer variables:
+ Symbolic representations, approximations, and experimental results.
+ <em>ACM Transactions on Programming Languages and Systems</em>,
+ 21(4):747-789, 1999.
+
+
+</DD>
+
+
+<DT>[BHMZ04]</DT>
+<DD>
+\anchor BHMZ04
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ Report <tt>arXiv:cs.PL/0412043</tt>, 2004.
+ Extended abstract. Contribution to the <em>International workshop
+ on “Numerical & Symbolic Abstract Domains”</em> (NSAD'05, Paris, January 21,
+ 2005). Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+ <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>.
+
+
+</DD>
+
+
+<DT>[BHMZ05a]</DT>
+<DD>
+\anchor BHMZ05a
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ Quaderno 399, Dipartimento di Matematica, Università di Parma,
+ Italy, 2005.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+
+</DD>
+
+
+<DT>[BHMZ05b]</DT>
+<DD>
+\anchor BHMZ05b
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ In C. Hankin and I. Siveroni, editors, <em>Static Analysis:
+ Proceedings of the 12th International Symposium</em>, volume 3672 of <em>Lecture
+ Notes in Computer Science</em>, pages 3-18, London, UK, 2005. Springer-Verlag,
+ Berlin.
+
+</DD>
+
+
+<DT>[BHRZ03a]</DT>
+<DD>
+\anchor BHRZ03a
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ In R. Cousot, editor, <em>Static Analysis: Proceedings of the 10th
+ International Symposium</em>, volume 2694 of <em>Lecture Notes in Computer
+ Science</em>, pages 337-354, San Diego, California, USA, 2003. Springer-Verlag,
+ Berlin.
+
+
+</DD>
+
+
+<DT>[BHRZ03b]</DT>
+<DD>
+\anchor BHRZ03b
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ Quaderno 312, Dipartimento di Matematica, Università di Parma,
+ Italy, 2003.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHRZ05]</DT>
+<DD>
+\anchor BHRZ05
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ <em>Science of Computer Programming</em>, 58(1-2):28-56, 2005.
+
+
+</DD>
+
+
+<DT>[BHZ02a]</DT>
+<DD>
+\anchor BHZ02a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding and implementation of not necessarily closed convex
+ polyhedra.
+ Quaderno 305, Dipartimento di Matematica, Università di Parma,
+ Italy, 2002.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHZ02b]</DT>
+<DD>
+\anchor BHZ02b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding of not necessarily closed convex polyhedra.
+ In M. Carro, C. Vacheret, and K.-K. Lau, editors, <em>Proceedings of
+ the 1st CoLogNet Workshop on Component-based Software Development and
+ Implementation Technology for Computational Logic Systems</em>, pages 147-153,
+ Madrid, Spain, 2002.
+ Published as TR Number CLIP4/02.0, Universidad Politécnica de
+ Madrid, Facultad de Informática.
+
+
+</DD>
+
+
+<DT>[BHZ03a]</DT>
+<DD>
+\anchor BHZ03a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding and implementation of not necessarily closed convex
+ polyhedra.
+ In M. Leuschel, S. Gruner, and S. Lo Presti, editors, <em>
+ Proceedings of the 3rd Workshop on Automated Verification of Critical
+ Systems</em>, pages 161-176, Southampton, UK, 2003.
+ Published as TR Number DSSE-TR-2003-2, University of Southampton.
+
+
+</DD>
+
+
+<DT>[BHZ03b]</DT>
+<DD>
+\anchor BHZ03b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ In B. Steffen and G. Levi, editors, <em>Verification, Model Checking
+ and Abstract Interpretation: Proceedings of the 5th International Conference
+ (VMCAI 2004)</em>, volume 2937 of <em>Lecture Notes in Computer Science</em>, pages
+ 135-148, Venice, Italy, 2003. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BHZ04]</DT>
+<DD>
+\anchor BHZ04
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ Quaderno 349, Dipartimento di Matematica, Università di Parma,
+ Italy, 2004.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHZ05]</DT>
+<DD>
+\anchor BHZ05
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Not necessarily closed convex polyhedra and the double description
+ method.
+ <em>Formal Aspects of Computing</em>, 17(2):222-257, 2005.
+
+</DD>
+
+
+<DT>[BHZ06a]</DT>
+<DD>
+\anchor BHZ06a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ The Parma Polyhedra Library: Toward a complete set of numerical
+ abstractions for the analysis and verification of hardware and software
+ systems.
+ Quaderno 457, Dipartimento di Matematica, Università di Parma,
+ Italy, 2006.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+ published as <tt>arXiv:cs.MS/0612085</tt>, available from
+ <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ06b]</DT>
+<DD>
+\anchor BHZ06b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ <em>Software Tools for Technology Transfer</em>, 8(4/5):449-466, 2006.
+ In the printed version of this article, all the figures have been
+ improperly printed (rendering them useless). See
+ \ref BHZ07c "[BHZ07c]".
+
+
+</DD>
+
+
+<DT>[BHZ07a]</DT>
+<DD>
+\anchor BHZ07a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Applications of polyhedral computations to the analysis and
+ verification of hardware and software systems.
+ Quaderno 458, Dipartimento di Matematica, Università di Parma,
+ Italy, 2007.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+ published as <tt>arXiv:cs.CG/0701122</tt>, available from
+ <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ07b]</DT>
+<DD>
+\anchor BHZ07b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ An improved tight closure algorithm for integer octagonal
+ constraints.
+ Quaderno 467, Dipartimento di Matematica, Università di Parma,
+ Italy, 2007.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+ published as <tt>arXiv:0705.4618v2 [cs.DS]</tt>, available from
+ <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ07c]</DT>
+<DD>
+\anchor BHZ07c
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ <em>Software Tools for Technology Transfer</em>, 9(3/4):413-414, 2007.
+ Erratum to \ref BHZ06b "[BHZ06b]" containing all the figures properly
+ printed.
+
+</DD>
+
+
+<DT>[BHZ08a]</DT>
+<DD>
+\anchor BHZ08a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ An improved tight closure algorithm for integer octagonal
+ constraints.
+ In F. Logozzo, D. Peled, and L. Zuck, editors, <em>Verification,
+ Model Checking and Abstract Interpretation: Proceedings of the 9th
+ International Conference (VMCAI 2008)</em>, volume 4905 of <em>Lecture Notes in
+ Computer Science</em>, pages 8-21, San Francisco, USA, 2008. Springer-Verlag,
+ Berlin.
+
+
+</DD>
+
+
+<DT>[BHZ08b]</DT>
+<DD>
+\anchor BHZ08b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ The Parma Polyhedra Library: Toward a complete set of numerical
+ abstractions for the analysis and verification of hardware and software
+ systems.
+ <em>Science of Computer Programming</em>, 72(1-2):3-21, 2008.
+
+
+</DD>
+
+
+<DT>[BHZ09a]</DT>
+<DD>
+\anchor BHZ09a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Applications of polyhedral computations to the analysis and
+ verification of hardware and software systems.
+ <em>Theoretical Computer Science</em>, 410(46):4672-4691, 2009.
+
+
+</DD>
+
+
+<DT>[BHZ09b]</DT>
+<DD>
+\anchor BHZ09b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+ abstractions.
+ Quaderno 492, Dipartimento di Matematica, Università di Parma,
+ Italy, 2009.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. A corrected
+ and improved version (corrected an error in the statement of condition (3) of
+ Theorem 3.6, typos corrected in statement and proof of Theorem 6.8) has been
+ published in \ref BHZ09c "[BHZ09c]".
+
+
+</DD>
+
+
+<DT>[BHZ09c]</DT>
+<DD>
+\anchor BHZ09c
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+ abstractions.
+ Report <tt>arXiv:cs.CG/0904.1783</tt>, 2009.
+ Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+ <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ09d]</DT>
+<DD>
+\anchor BHZ09d
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Weakly-relational shapes for numeric abstractions: Improved
+ algorithms and proofs of correctness.
+ <em>Formal Methods in System Design</em>, 35(3):279-323, 2009.
+
+
+</DD>
+
+
+<DT>[BHZ10]</DT>
+<DD>
+\anchor BHZ10
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+ abstractions.
+ <em>Computational Geometry: Theory and Applications</em>,
+ 43(5):453-473, 2010.
+
+
+</DD>
+
+
+<DT>[BJT99]</DT>
+<DD>
+\anchor BJT99
+F. Besson, T. P. Jensen, and J.-P. Talpin.
+ Polyhedral analysis for synchronous languages.
+ In A. Cortesi and G. Filé, editors, <em>Static Analysis:
+ Proceedings of the 6th International Symposium</em>, volume 1694 of <em>Lecture
+ Notes in Computer Science</em>, pages 51-68, Venice, Italy, 1999.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[BK89]</DT>
+<DD>
+\anchor BK89
+V. Balasundaram and K. Kennedy.
+ A technique for summarizing data access and its use in parallelism
+ enhancing transformations.
+ In B. Knobe, editor, <em>Proceedings of the ACM SIGPLAN'89
+ Conference on Programming Language Design and Implementation (PLDI)</em>, volume
+ 24(7) of <em>ACM SIGPLAN Notices</em>, pages 41-53, Portland, Oregon, USA,
+ 1989. ACM Press.
+
+</DD>
+
+
+<DT>[BMPZ10]</DT>
+<DD>
+\anchor BMPZ10
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ The automatic synthesis of linear ranking functions: The complete
+ unabridged version.
+ Quaderno 498, Dipartimento di Matematica, Università di Parma,
+ Italy, 2010.
+ Superseded by \ref BMPZ12a "[BMPZ12a]".
+
+</DD>
+
+
+<DT>[BMPZ12a]</DT>
+<DD>
+\anchor BMPZ12a
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ The automatic synthesis of linear ranking functions: The complete
+ unabridged version.
+ Report <tt>arXiv:cs.PL/1004.0944v2</tt>, 2012.
+ Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+ <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>. Improved version of
+ \ref BMPZ10 "[BMPZ10]".
+
+</DD>
+
+
+<DT>[BMPZ12b]</DT>
+<DD>
+\anchor BMPZ12b
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ A new look at the automatic synthesis of linear ranking functions.
+ <em>Information and Computation</em>, 215:47-67, 2012.
+
+</DD>
+
+
+<DT>[BRZH02a]</DT>
+<DD>
+\anchor BRZH02a
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Possibly not closed convex polyhedra and the Parma Polyhedra
+ Library.
+ In M. V. Hermenegildo and G. Puebla, editors, <em>Static Analysis:
+ Proceedings of the 9th International Symposium</em>, volume 2477 of <em>Lecture
+ Notes in Computer Science</em>, pages 213-229, Madrid, Spain, 2002.
+ Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BRZH02b]</DT>
+<DD>
+\anchor BRZH02b
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Possibly not closed convex polyhedra and the Parma Polyhedra
+ Library.
+ Quaderno 286, Dipartimento di Matematica, Università di Parma,
+ Italy, 2002.
+ See also \ref BRZH02c "[BRZH02c]". Available at
+ <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BRZH02c]</DT>
+<DD>
+\anchor BRZH02c
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Errata for technical report “Quaderno 286”.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>,
+ 2002.
+ See \ref BRZH02b "[BRZH02b]".
+
+</DD>
+
+
+<DT>[CC76]</DT>
+<DD>
+\anchor CC76
+P. Cousot and R. Cousot.
+ Static determination of dynamic properties of programs.
+ In B. Robinet, editor, <em>Proceedings of the Second International
+ Symposium on Programming</em>, pages 106-130, Paris, France, 1976. Dunod, Paris,
+ France.
+
+
+</DD>
+
+
+<DT>[CC79]</DT>
+<DD>
+\anchor CC79
+P. Cousot and R. Cousot.
+ Systematic design of program analysis frameworks.
+ In <em>Proceedings of the Sixth Annual ACM Symposium on Principles
+ of Programming Languages</em>, pages 269-282, San Antonio, TX, USA, 1979. ACM
+ Press.
+
+
+</DD>
+
+
+<DT>[CC92]</DT>
+<DD>
+\anchor CC92
+P. Cousot and R. Cousot.
+ Comparing the Galois connection and widening/narrowing approaches
+ to abstract interpretation.
+ In M. Bruynooghe and M. Wirsing, editors, <em>Proceedings of the 4th
+ International Symposium on Programming Language Implementation and Logic
+ Programming</em>, volume 631 of <em>Lecture Notes in Computer Science</em>, pages
+ 269-295, Leuven, Belgium, 1992. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[CH78]</DT>
+<DD>
+\anchor CH78
+P. Cousot and N. Halbwachs.
+ Automatic discovery of linear restraints among variables of a
+ program.
+ In <em>Conference Record of the Fifth Annual ACM Symposium on
+ Principles of Programming Languages</em>, pages 84-96, Tucson, Arizona, 1978.
+ ACM Press.
+
+
+</DD>
+
+
+<DT>[Che64]</DT>
+<DD>
+\anchor Che64
+N. V. Chernikova.
+ Algorithm for finding a general formula for the non-negative
+ solutions of system of linear equations.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+ 4(4):151-158, 1964.
+
+</DD>
+
+
+<DT>[Che65]</DT>
+<DD>
+\anchor Che65
+N. V. Chernikova.
+ Algorithm for finding a general formula for the non-negative
+ solutions of system of linear inequalities.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+ 5(2):228-233, 1965.
+
+</DD>
+
+
+<DT>[Che68]</DT>
+<DD>
+\anchor Che68
+N. V. Chernikova.
+ Algorithm for discovering the set of all solutions of a linear
+ programming problem.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+ 8(6):282-293, 1968.
+
+</DD>
+
+
+<DT>[Dan63]</DT>
+<DD>
+\anchor Dan63
+G. B. Dantzig.
+ <em>Linear Programming and Extensions</em>.
+ Princeton University Press, Princeton, NJ, 1963.
+
+</DD>
+
+
+<DT>[FCB07]</DT>
+<DD>
+\anchor FCB07
+P. Feautrier, J.-F. Collard, and C. Bastoul.
+ <em>PIP/PipLib: A Solver for Parametric Integer Programming
+ Problems</em>, 5.0 edition, July 2007.
+ Distributed with PIP/PipLib 1.4.0.
+
+</DD>
+
+
+<DT>[Fea88]</DT>
+<DD>
+\anchor Fea88
+P. Feautrier.
+ Parametric integer programming.
+ <em>RAIRO Recherche Opérationnelle</em>, 22(3):243-268, 1988.
+
+</DD>
+
+
+<DT>[FP96]</DT>
+<DD>
+\anchor FP96
+K. Fukuda and A. Prodon.
+ Double description method revisited.
+ In M. Deza, R. Euler, and Y. Manoussakis, editors, <em>Combinatorics
+ and Computer Science, 8th Franco-Japanese and 4th Franco-Chinese Conference,
+ Brest, France, July 3-5, 1995, Selected Papers</em>, volume 1120 of <em>Lecture
+ Notes in Computer Science</em>, pages 91-111. Springer-Verlag, Berlin, 1996.
+
+
+</DD>
+
+
+<DT>[Fuk98]</DT>
+<DD>
+\anchor Fuk98
+K. Fukuda.
+ Polyhedral computation FAQ.
+ Swiss Federal Institute of Technology, Lausanne and Zurich,
+ Switzerland, available at
+ <a href="http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html">http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html</a>, 1998.
+
+</DD>
+
+
+<DT>[GDD<sup>+</sup>04]</DT>
+<DD>
+\anchor GDDetal04
+D. Gopan, F. DiMaio, N. Dor, T. W. Reps, and M. Sagiv.
+ Numeric domains with summarized dimensions.
+ In K. Jensen and A. Podelski, editors, <em>Tools and Algorithms for
+ the Construction and Analysis of Systems, 10th International Conference,
+ TACAS 2004</em>, volume 2988 of <em>Lecture Notes in Computer Science</em>, pages
+ 512-529, Barcelona, Spain, 2004. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[GJ00]</DT>
+<DD>
+\anchor GJ00
+E. Gawrilow and M. Joswig.
+ <tt>polymake</tt>: A framework for analyzing convex polytopes.
+ In G. Kalai and G. M. Ziegler, editors, <em>Polytopes -
+ Combinatorics and Computation</em>, pages 43-74. Birkhäuser, 2000.
+
+</DD>
+
+
+<DT>[GJ01]</DT>
+<DD>
+\anchor GJ01
+E. Gawrilow and M. Joswig.
+ <tt>polymake</tt>: An approach to modular software design in
+ computational geometry.
+ In <em>Proceedings of the 17th Annual Symposium on Computational
+ Geometry</em>, pages 222-231, Medford, MA, USA, 2001. ACM.
+
+</DD>
+
+
+<DT>[GR77]</DT>
+<DD>
+\anchor GR77
+D. Goldfarb and J. K. Reid.
+ A practical steepest-edge simplex algorithm.
+ <em>Mathematical Proramming</em>, 12(1):361-371, 1977.
+
+</DD>
+
+
+<DT>[Gra91]</DT>
+<DD>
+\anchor Gra91
+P. Granger.
+ Static analysis of linear congruence equalities among variables of a
+ program.
+ In S. Abramsky and T. S. E. Maibaum, editors, <em>TAPSOFT'91:
+ Proceedings of the International Joint Conference on Theory and Practice of
+ Software Development, Volume 1: Colloquium on Trees in Algebra and
+ Programming (CAAP'91)</em>, volume 493 of <em>Lecture Notes in Computer
+ Science</em>, pages 169-192, Brighton, UK, 1991. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Gra97]</DT>
+<DD>
+\anchor Gra97
+P. Granger.
+ Static analyses of congruence properties on rational numbers
+ (extended abstract).
+ In P. Van Hentenryck, editor, <em>Static Analysis: Proceedings of
+ the 4th International Symposium</em>, volume 1302 of <em>Lecture Notes in
+ Computer Science</em>, pages 278-292, Paris, France, 1997. Springer-Verlag,
+ Berlin.
+
+</DD>
+
+
+<DT>[Hal79]</DT>
+<DD>
+\anchor Hal79
+N. Halbwachs.
+ <em>Détermination Automatique de Relations Linéaires
+ Vérifiées par les Variables d'un Programme</em>.
+ Thèse de 3ème cycle d'informatique,
+ Université scientifique et médicale de Grenoble, Grenoble, France, March
+ 1979.
+
+</DD>
+
+
+<DT>[Hal93]</DT>
+<DD>
+\anchor Hal93
+N. Halbwachs.
+ Delay analysis in synchronous programs.
+ In C. Courcoubetis, editor, <em>Computer Aided Verification:
+ Proceedings of the 5th International Conference (CAV'93)</em>, volume 697 of <em>
+ Lecture Notes in Computer Science</em>, pages 333-346, Elounda, Greece, 1993.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[HH95]</DT>
+<DD>
+\anchor HH95
+T. A. Henzinger and P.-H. Ho.
+ A note on abstract interpretation strategies for hybrid automata.
+ In P. J. Antsaklis, W. Kohn, A. Nerode, and S. Sastry, editors, <em>
+ Hybrid Systems II</em>, volume 999 of <em>Lecture Notes in Computer Science</em>,
+ pages 252-264. Springer-Verlag, Berlin, 1995.
+
+
+</DD>
+
+
+<DT>[HHL90]</DT>
+<DD>
+\anchor HHL90
+L. Huelsbergen, D. Hahn, and J. Larus.
+ Exact dependence analysis using data access descriptors.
+ Technical Report 945, Department of Computer Science, University of
+ Wisconsin, Madison, 1990.
+
+</DD>
+
+
+<DT>[HKP95]</DT>
+<DD>
+\anchor HKP95
+N. Halbwachs, A. Kerbrat, and Y.-E. Proy.
+ <em>POLyhedra INtegrated Environment</em>.
+ Verimag, France, version 1.0 of POLINE edition, September 1995.
+ Documentation taken from source code.
+
+</DD>
+
+
+<DT>[HLW94]</DT>
+<DD>
+\anchor HLW94
+V. Van Dongen H. Le Verge and D. K. Wilde.
+ Loop nest synthesis using the polyhedral library.
+ <em>Publication interne</em> 830, IRISA, Campus de Beaulieu, Rennes,
+ France, 1994.
+
+</DD>
+
+
+<DT>[HMT71]</DT>
+<DD>
+\anchor HMT71
+L. Henkin, J. D. Monk, and A. Tarski.
+ <em>Cylindric Algebras: Part I</em>.
+ North-Holland, Amsterdam, 1971.
+
+</DD>
+
+
+<DT>[HPR94]</DT>
+<DD>
+\anchor HPR94
+N. Halbwachs, Y.-E. Proy, and P. Raymond.
+ Verification of linear hybrid systems by means of convex
+ approximations.
+ In B. Le Charlier, editor, <em>Static Analysis: Proceedings of the
+ 1st International Symposium</em>, volume 864 of <em>Lecture Notes in Computer
+ Science</em>, pages 223-237, Namur, Belgium, 1994. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[HPR97]</DT>
+<DD>
+\anchor HPR97
+N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+ Verification of real-time systems using linear relation analysis.
+ <em>Formal Methods in System Design</em>, 11(2):157-185, 1997.
+
+</DD>
+
+
+<DT>[HPWT01]</DT>
+<DD>
+\anchor HPWT01
+T. A. Henzinger, J. Preussig, and H. Wong-Toi.
+ Some lessons from the hytech experience.
+ In <em>Proceedings of the 40th Annual Conference on Decision and
+ Control</em>, pages 2887-2892. IEEE Computer Society Press, 2001.
+
+
+</DD>
+
+
+<DT>[Jea02]</DT>
+<DD>
+\anchor Jea02
+B. Jeannet.
+ <em>Convex Polyhedra Library</em>, release 1.1.3c edition, March 2002.
+ Documentation of the “New Polka” library.
+
+</DD>
+
+
+<DT>[JMSY94]</DT>
+<DD>
+\anchor JMSY94
+J. Jaffar, M. J. Maher, P. J. Stuckey, and R. H. C. Yap.
+ Beyond finite domains.
+ In A. Borning, editor, <em>Principles and Practice of Constraint
+ Programming: Proceedings of the Second International Workshop</em>, volume 874 of
+ <em>Lecture Notes in Computer Science</em>, pages 86-94, Rosario, Orcas Island,
+ Washington, USA, 1994. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[KBB<sup>+</sup>06]</DT>
+<DD>
+\anchor KBBetal06
+L. Khachiyan, E. Boros, K. Borys, K. Elbassioni, and V. Gurvich.
+ Generating all vertices of a polyhedron is hard.
+ <em>Discrete and Computational Geometry</em>, 2006.
+ Invited contribution.
+
+</DD>
+
+
+<DT>[Kuh56]</DT>
+<DD>
+\anchor Kuh56
+H. W. Kuhn.
+ Solvability and consistency for linear equations and inequalities.
+ <em>American Mathematical Monthly</em>, 63:217-232, 1956.
+
+</DD>
+
+
+<DT>[Le 92]</DT>
+<DD>
+\anchor Le 92
+H. Le Verge.
+ A note on Chernikova's algorithm.
+ <em>Publication interne</em> 635, IRISA, Campus de Beaulieu, Rennes,
+ France, 1992.
+
+
+</DD>
+
+
+<DT>[Loe99]</DT>
+<DD>
+\anchor Loe99
+V. Loechner.
+ <i>PolyLib</i>: A library for manipulating parameterized polyhedra.
+ Available at <a href="http://icps.u-strasbg.fr/~loechner/polylib/">http://icps.u-strasbg.fr/~loechner/polylib/</a>, March
+ 1999.
+ Declares itself to be a continuation of \ref Wil93 "[Wil93]".
+
+</DD>
+
+
+<DT>[LW97]</DT>
+<DD>
+\anchor LW97
+V. Loechner and D. K. Wilde.
+ Parameterized polyhedra and their vertices.
+ <em>International Journal of Parallel Programming</em>, 25(6):525-549,
+ 1997.
+
+</DD>
+
+
+<DT>[Mas92]</DT>
+<DD>
+\anchor Mas92
+F. Masdupuy.
+ Array operations abstraction using semantic analysis of trapezoid
+ congruences.
+ In <em>Proceedings of the 6th ACM International Conference on
+ Supercomputing</em>, pages 226-235, Washington, DC, USA, 1992. ACM Press.
+
+</DD>
+
+
+<DT>[Mas93]</DT>
+<DD>
+\anchor Mas93
+F. Masdupuy.
+ <em>Array Indices Relational Semantic Analysis Using Rational Cosets
+ and Trapezoids</em>.
+ Thèse d'informatique, École Polytechnique, Palaiseau, France,
+ December 1993.
+
+</DD>
+
+
+<DT>[Min01a]</DT>
+<DD>
+\anchor Min01a
+A. Miné.
+ A new numerical abstract domain based on difference-bound matrices.
+ In O. Danvy and A. Filinski, editors, <em>Proceedings of the 2nd
+ Symposium on Programs as Data Objects (PADO 2001)</em>, volume 2053 of <em>
+ Lecture Notes in Computer Science</em>, pages 155-172, Aarhus, Denmark, 2001.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min01b]</DT>
+<DD>
+\anchor Min01b
+A. Miné.
+ The octagon abstract domain.
+ In <em>Proceedings of the Eighth Working Conference on Reverse
+ Engineering (WCRE'01)</em>, pages 310-319, Stuttgart, Germany, 2001. IEEE
+ Computer Society Press.
+
+</DD>
+
+
+<DT>[Min02]</DT>
+<DD>
+\anchor Min02
+A. Miné.
+ A few graph-based relational numerical abstract domains.
+ In M. V. Hermenegildo and G. Puebla, editors, <em>Static Analysis:
+ Proceedings of the 9th International Symposium</em>, volume 2477 of <em>Lecture
+ Notes in Computer Science</em>, pages 117-132, Madrid, Spain, 2002.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min04]</DT>
+<DD>
+\anchor Min04
+A. Miné.
+ Relational abstract domains for the detection of floating-point
+ run-time errors.
+ In D. Schmidt, editor, <em>Programming Languages and Systems:
+ Proceedings of the 13th European Symposium on Programming</em>, volume 2986 of
+ <em>Lecture Notes in Computer Science</em>, pages 3-17, Barcelona, Spain, 2004.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min05]</DT>
+<DD>
+\anchor Min05
+A. Miné.
+ <em>Weakly Relational Numerical Abstract Domains</em>.
+ PhD thesis, École Polytechnique, Paris, France, March 2005.
+
+</DD>
+
+
+<DT>[MRTT53]</DT>
+<DD>
+\anchor MRTT53
+T. S. Motzkin, H. Raiffa, G. L. Thompson, and R. M. Thrall.
+ The double description method.
+ In H. W. Kuhn and A. W. Tucker, editors, <em>Contributions to the
+ Theory of Games - Volume II</em>, number 28 in Annals of Mathematics Studies,
+ pages 51-73. Princeton University Press, Princeton, New Jersey, 1953.
+
+</DD>
+
+
+<DT>[NF01]</DT>
+<DD>
+\anchor NF01
+T. Nakanishi and A. Fukuda.
+ Modulo interval arithmetic and its application to program analysis.
+ <em>Transactions of Information Processing Society of Japan</em>,
+ 42(4):829-837, 2001.
+
+</DD>
+
+
+<DT>[NJPF99]</DT>
+<DD>
+\anchor NJPF99
+T. Nakanishi, K. Joe, C. D. Polychronopoulos, and A. Fukuda.
+ The modulo interval: A simple and practical representation for
+ program analysis.
+ In <em>Proceedings of the 1999 International Conference on Parallel
+ Architectures and Compilation Techniques</em>, pages 91-96, Newport Beach,
+ California, USA, 1999. IEEE Computer Society.
+
+</DD>
+
+
+<DT>[NO77]</DT>
+<DD>
+\anchor NO77
+G. Nelson and D. C. Oppen.
+ Fast decision algorithms based on Union and Find.
+ In <em>Proceedings of the 18th Annual Symposium on Foundations of
+ Computer Science (FOCS'77)</em>, pages 114-119, Providence, RI, USA, 1977. IEEE
+ Computer Society Press.
+ The journal version of this paper is \ref NO80 "[NO80]".
+
+</DD>
+
+
+<DT>[NO80]</DT>
+<DD>
+\anchor NO80
+G. Nelson and D. C. Oppen.
+ Fast decision procedures based on congruence closure.
+ <em>Journal of the ACM</em>, 27(2):356-364, 1980.
+ An earlier version of this paper is \ref NO77 "[NO77]".
+
+</DD>
+
+
+<DT>[NR00]</DT>
+<DD>
+\anchor NR00
+S. P. K. Nookala and T. Risset.
+ A library for Z-polyhedral operations.
+ <em>Publication interne</em> 1330, IRISA, Campus de Beaulieu, Rennes,
+ France, 2000.
+
+</DD>
+
+
+<DT>[NW88]</DT>
+<DD>
+\anchor NW88
+G. L. Nemhauser and L. A. Wolsey.
+ <em>Integer and Combinatorial Optimization</em>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+ John Wiley & Sons, 1988.
+
+</DD>
+
+
+<DT>[Pra77]</DT>
+<DD>
+\anchor Pra77
+V. R. Pratt.
+ Two easy theories whose combination is hard.
+ Memo sent to Nelson and Oppen concerning a preprint of their paper
+ \ref NO77 "[NO77]", September 1977.
+
+</DD>
+
+
+<DT>[PS98]</DT>
+<DD>
+\anchor PS98
+C. H. Papadimitriou and K. Steiglitz.
+ <em>Combinatorial Optimization: Algorithms and Complexity</em>.
+ Dover Publications, second edition, 1998.
+
+</DD>
+
+
+<DT>[QRR96]</DT>
+<DD>
+\anchor QRR96
+P. Quinton, S. Rajopadhye, and T. Risset.
+ On manipulating Z-polyhedra.
+ Technical Report 1016, IRISA, Campus Universitaire de Bealieu,
+ Rennes, France, July 1996.
+
+</DD>
+
+
+<DT>[QRR97]</DT>
+<DD>
+\anchor QRR97
+P. Quinton, S. Rajopadhye, and T. Risset.
+ On manipulating Z-polyhedra using a canonic representation.
+ <em>Parallel Processing Letters</em>, 7(2):181-194, 1997.
+
+</DD>
+
+
+<DT>[QRW00]</DT>
+<DD>
+\anchor QRW00
+F. Quilleré, S. V. Rajopadhye, and D. Wilde.
+ Generation of efficient nested loops from polyhedra.
+ <em>International Journal of Parallel Programming</em>, 28(5):469-498,
+ 2000.
+
+</DD>
+
+
+<DT>[RBL06]</DT>
+<DD>
+\anchor RBL06
+T. W. Reps, G. Balakrishnan, and J. Lim.
+ Intermediate-representation recovery from low-level code.
+ In J. Hatcliff and F. Tip, editors, <em>Proceedings of the 2006 ACM
+ SIGPLAN Workshop on Partial Evaluation and Semantics-based Program
+ Manipulation</em>, pages 100-111, Charleston, South Carolina, USA, 2006. ACM
+ Press.
+
+</DD>
+
+
+<DT>[Ric02]</DT>
+<DD>
+\anchor Ric02
+E. Ricci.
+ Rappresentazione e manipolazione di poliedri convessi per l'analisi e
+ la verifica di programmi.
+ Laurea dissertation, University of Parma, Parma, Italy, July 2002.
+ In Italian.
+
+
+</DD>
+
+
+<DT>[Sch99]</DT>
+<DD>
+\anchor Sch99
+A. Schrijver.
+ <em>Theory of Linear and Integer Programming</em>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+ John Wiley & Sons, 1999.
+
+</DD>
+
+
+<DT>[Sho81]</DT>
+<DD>
+\anchor Sho81
+R. E. Shostak.
+ Deciding linear inequalities by computing loop residues.
+ <em>Journal of the ACM</em>, 28(4):769-779, 1981.
+
+</DD>
+
+
+<DT>[SK07]</DT>
+<DD>
+\anchor SK07
+A. Simon and A. King.
+ Taming the wrapping of integer arithmetic.
+ In H. Riis Nielson and G. Filé, editors, <em>Static Analysis:
+ Proceedings of the 14th International Symposium</em>, volume 4634 of <em>Lecture
+ Notes in Computer Science</em>, pages 121-136, Kongens Lyngby, Denmark, 2007.
+ Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Sri93]</DT>
+<DD>
+\anchor Sri93
+D. Srivastava.
+ Subsumption and indexing in constraint query languages with linear
+ arithmetic constraints.
+ <em>Annals of Mathematics and Artificial Intelligence</em>,
+ 8(3-4):315-343, 1993.
+
+
+</DD>
+
+
+<DT>[SS07a]</DT>
+<DD>
+\anchor SS07a
+R. Sen and Y. N. Srikant.
+ Executable analysis using abstract interpretation with circular
+ linear progressions.
+ In <em>Proceedings of the 5th IEEE/ACM International Conference on
+ Formal Methods and Models for Co-Design (MEMOCODE 2007)</em>, pages 39-48, Nice,
+ France, 2007. IEEE Computer Society Press.
+
+</DD>
+
+
+<DT>[SS07b]</DT>
+<DD>
+\anchor SS07b
+R. Sen and Y. N. Srikant.
+ Executable analysis with circular linear progressions.
+ Technical Report IISc-CSA-TR-2007-3, Department of Computer Science
+ and Automation, Indian Institute of Science, Bangalore, India, 2007.
+
+</DD>
+
+
+<DT>[SW70]</DT>
+<DD>
+\anchor SW70
+J. Stoer and C. Witzgall.
+ <em>Convexity and Optimization in Finite Dimensions I</em>.
+ Springer-Verlag, Berlin, 1970.
+
+</DD>
+
+
+<DT>[War03]</DT>
+<DD>
+\anchor War03
+H. S. Warren, Jr.
+ <em>Hacker's Delight</em>.
+ Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 2003.
+
+</DD>
+
+
+<DT>[Wey35]</DT>
+<DD>
+\anchor Wey35
+H. Weyl.
+ Elementare theorie der konvexen polyeder.
+ <em>Commentarii Mathematici Helvetici</em>, 7:290-306, 1935.
+ English translation in \ref Wey50 "[Wey50]".
+
+</DD>
+
+
+<DT>[Wey50]</DT>
+<DD>
+\anchor Wey50
+H. Weyl.
+ The elementary theory of convex polyhedra.
+ In H. W. Kuhn, editor, <em>Contributions to the Theory of Games -
+ Volume I</em>, number 24 in Annals of Mathematics Studies, pages 3-18. Princeton
+ University Press, Princeton, New Jersey, 1950.
+ Translated from \ref Wey35 "[Wey35]" by H. W. Kuhn.
+
+</DD>
+
+
+<DT>[Wil93]</DT>
+<DD>
+\anchor Wil93
+D. K. Wilde.
+ A library for doing polyhedral operations.
+ Master's thesis, Oregon State University, Corvallis, Oregon,
+ December 1993.
+ Also published as IRISA <em>Publication interne</em> 785, Rennes,
+ France, 1993.
+
+
+</DD>
+</DL>
+
+
+\if Include_Implementation_Details
+
+\section prelims Further Notation and Terminology
+
+\subsection Linear_Independence Linear Independence
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+is <EM>linearly independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the set of equations
+\f[
+ \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0}
+\f]
+implies that, for each \f$i = 1\f$, \f$\ldots\f$, \f$k\f$,
+\f$\lambda_i = 0\f$.
+
+The maximum number of linearly independent points in \f$\Rset^n\f$ is \f$n\f$.
+Note that linear independence implies affine independence,
+but the converse is not true.
+
+<B><EM>Proposition</EM></B>
+
+If \f$A\f$ is an \f$m \times n\f$ matrix, the maximum number of
+linearly independent rows of \f$A\f$, viewed as vectors of \f$\Rset^n\f$,
+equals the maximum number of linearly independent columns of \f$A\f$,
+viewed as vectors of \f$\Rset^m\f$.
+
+\subsection Rank Rank
+
+The maximum number of linearly independent rows (columns) of a
+matrix \f$A\f$ is the <EM>rank</EM> of \f$A\f$ and is denoted by
+\f$\prank(A)\f$.
+
+<B><EM>Proposition</EM></B>
+
+A polyhedron is a convex set.
+
+\subsection Minkowskis_Theorem Minkowski's Theorem
+
+Let
+\f$\cP = \{\, \vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b} \,\}\f$
+be a non-empty polyhedron where \f$\prank(A) = n\f$.
+Let \f$V\f$ be the set of vertices and
+\f$R\f$ the set of extreme rays of \f$\cP\f$.
+Let also \f$\mathcal{V}\f$ be the set of convex combinations of \f$V\f$
+and \f$\mathcal{R}\f$ the set of positive combinations of \f$R\f$.
+Then
+\f[
+ \cP = \mathcal{V} + \mathcal{R}.
+\f]
+
+Informally, this theorem states that,
+whenever a polyhedron \f$\cP\f$ has a vertex,
+there exists a decomposition such that
+- \f$V\f$ is the set of all <EM>vertices</EM> of \f$\cP\f$;
+- \f$R\f$ is the set of all <EM>extreme</EM> rays of \f$\cP\f$; and
+- \f$L = \emptyset\f$.
+
+The conditions that \f$\cP\f$ is not empty and \f$\prank(A) = n\f$
+are equivalent to the condition that \f$\cP\f$ has a vertex.
+(See also Nemhauser and Wolsey - Integer and Combinatorial Optimization -
+propositions 4.1 and 4.2 on pages 92 and 93).
+
+<B><EM>Proposition</EM></B>
+
+Under the same hypotheses of Minkowski's theorem,
+if \f$\cP\f$ is a rational polyhedron then
+all the vertices in \f$V\f$ have rational coefficients and
+we can consider a set \f$R\f$ of extreme rays having
+rational coefficients only.
+
+The second theorem, called Weyl's theorem, states that any system of
+generators having rational coefficients defines a rational polyhedron:
+
+\subsection Weyls_Theorem Weyl's Theorem
+
+If \f$A\f$ is a rational \f$m \times n\f$ matrix,
+\f$B\f$ is a rational \f$m' \times n\f$ matrix and
+\f[
+ \cQ = \sset{
+ \vect{x} \in \Rset^n
+ }{
+ \vect{x}^\transpose = \vect{y}^\transpose A
+ + \vect{z}^\transpose B, \\
+ \vect{y} = (y_0, \ldots, y_{m-1})^\transpose \in \nonnegRset^{m},
+ \sum_{k=0}^{m-1} y_k = 1, \\
+ \vect{z} \in \nonnegRset^{m'}
+ },
+\f]
+then \f$\cQ\f$ is a rational polyhedron.
+
+In fact, since \f$\cQ\f$ consists of the sum of convex combinations of
+the rows of \f$A\f$ with positive combinations of the rows of \f$B\f$,
+we can think of \f$A\f$ as the matrix of vertices and \f$B\f$ as
+the matrix of rays.
+
+\subsection Cone Cone
+
+A set \f$C \sseq \Rset^n\f$ is a <EM>cone</EM> if
+\f[
+ \vect{x} \in C \Rightarrow \lambda \vect{x} \in C
+ \text{ for all } \lambda \in \nonnegRset.
+\f]
+
+\subsection Polyhedral_Cone Polyhedral Cone
+
+The polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{0}\,\}\f$
+is a convex cone and is called <EM>polyhedral cone</EM>.
+
+A polyhedral cone is either <EM>pointed</EM>,
+having the origin as its only vertex, or has no vertices at all.
+
+\subsection Lineality_Space Lineality Space
+
+Given a polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b}\,\}\f$,
+the <EM>lineality space</EM> of \f$\cP\f$ is the set
+\f[
+ \{\, \vect{x} \in \cP \mid A\vect{x} = \vect{0} \,\}
+\f]
+and it is denoted by \f$\linspace(\cP)\f$.
+
+
+\section homogeneous Homogeneous Systems
+
+To simplify the operations on polyhedra,
+each polyhedron is first transformed to a homogeneous cone
+in which the original polyhedron is embedded.
+
+\subsection Corresponding_Polyhedral_Cone Corresponding Polyhedral Cone
+
+The transformation changes the inhomogeneous system of constraints
+in \f$n\f$ variables, representing a polyhedron \f$\cP \in \Rset^n\f$,
+into a homogeneous system in \f$n + 1\f$ variables, representing a
+polyhedral cone \f$C \in \Rset^{n + 1}\f$,
+so that each point \f$\vect{x} \in \cP\f$
+corresponds to a point
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in C\f$
+where \f$\xi \geq 0\f$. That is,
+\f[
+ \cP = \{\,\vect{x} \mid A\vect{x} \geq \vect{b}\,\}
+ = \{\,\vect{x} \mid A\vect{x} - \vect{b} \geq \vect{0}\,\}
+\f]
+\f[
+ C = \{\,
+ (\xi \vect{x}^\transpose, \xi)^\transpose
+ \mid
+ \xi A\vect{x} - \xi \vect{b}
+ \geq \vect{0}, \xi \geq 0
+ \,\}
+ = \{\,\vect{x}' \mid A'\vect{x}' \geq \vect{0}\,\}
+\f]
+where:
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in \Rset^{n + 1}\f$;
+\f$A'\f$ is the \f$(m+1) \times (n+1)\f$ matrix having, for
+its first \f$m\f$ rows, the submatrix
+\f$(A, -\vect{b}) \in \Rset^m \times \Rset^{n + 1}\f$;
+and, for the (\f$m + 1\f$)'st row,
+\f$(\vect{0}^\transpose, 1)\f$ where \f$\vect{0} \in \Rset^n\f$.
+We call \f$C\f$ the
+<EM>corresponding polyhedral cone for \f$\cP\f$</EM>.
+
+The (\f$m+1\f$)'st row
+\f$(\vect{0}^\transpose, 1)\f$
+represents the <EM>positivity constraint</EM> \f$1 \geq 0\f$.
+
+Note that \f$\cP\f$ is contained in \f$C\f$
+since the intersection of \f$C\f$ with
+the hyperplane defined by the equality \f$\xi = 1\f$ is \f$\cP\f$.
+Therefore, it is always possible to
+transform a polyhedron \f$\cP\f$ to its corresponding polyhedral cone
+\f$C\f$ and then recover \f$\cP\f$ by means of this intersection.
+
+As \f$C\f$ always includes the origin and, hence, is non-empty,
+by Minkowski's theorem,
+it can also be represented by a system of generators.
+
+The systems of generators for \f$\cP\f$ and \f$C\f$ are such that:
+- Each vertex \f$\vect{v}\f$ in \f$\cP\f$
+ corresponds to a ray \f$(\vect{v}^\transpose, d)^\transpose\f$
+ with \f$d \neq 0\f$, in \f$C\f$.
+- Each ray \f$\vect{r}\f$ in \f$\cP\f$
+ corresponds to the ray \f$(\vect{r}^\transpose, 0)^\transpose\f$
+ in \f$C\f$.
+- Every ray in \f$C\f$ corresponds to a vertex or ray in \f$\cP\f$.
+- The origin in \f$\Rset^{n+1}\f$ is a point in \f$C\f$.
+
+Thus, in the cone \f$C\f$, a ray derived from a vertex
+in \f$\cP\f$ differs from a ray derived from a ray in \f$\cP\f$
+only in that, for a vertex,
+the (\f$n+1\f$)'st term is different from zero and,
+for a ray, it is zero.
+
+\subsection Devref_Double_Description Double Description
+
+Let \f$\cP \in \Rset^n \f$ be a polyhedron and \f$C \in \Rset^{n+1} \f$
+the corresponding polyhedral cone.
+Then the dual representations, the systems of constraints
+and generators representing \f$C\f$, form the
+<EM>double description</EM> for \f$\cP\f$.
+
+Note that, in a double description for a non-empty polyhedron,
+the system of constraints subsumes the positivity constraint \f$1 \geq 0\f$
+while the system of generators (which has only rays and lines
+corresponding to the vertices, rays and lines for \f$\cP\f$)
+implicitly assumes the origin in \f$\Rset^{n+1}\f$
+as a point so that the cone \f$C\f$ represented by the generators is non-empty.
+
+\subsection PPL_Polyhedron_Representation PPL Polyhedron Representation
+
+In the PPL,
+a polyhedron is represented by one or both of the representations in
+its double description.
+Thus, in the sequel, by <EM>PPL representation of a polyhedra</EM>,
+we are referring to the corresponding representation of
+its corresponding polyhedral cone.
+
+\subsection Valid_Linear_Inequalities Valid Linear Inequalities
+
+Let \f$\cP\f$ be a convex polyhedron (or polytope) in
+\f$\Rset^n\f$. For a real \f$n\f$-vector \f$\vect{c}\f$ and a real number
+\f$b\f$, a linear inequality \f$\langle \vect{c}, \vect{x} \rangle \geq b\f$
+(briefly denoted by \f$(\vect{c},b)\f$) is called <EM>valid</EM>
+for \f$\cP\f$ if it is satisfied by all points \f$\vect{x} \in \cP\f$.
+
+\subsection Redundancy Redundancy
+
+-# In a system of equalities, if an equality is a linear combination
+ of the others, it is said to be <EM>dependent</EM> upon them;
+ the dependent equality is called <EM>redundant</EM>.
+ A system containing no redundant equality is called <EM>independent</EM>.
+-# In a system of inequalities, an inequality is said to be <EM>redundant</EM>
+ if it can be eliminated from the system obtaining a system
+ equivalent to the previous one, i.e., having the same solutions.
+
+Given a polyhedron \f$\cP\f$ generated by \f$V\f$ vertices,
+\f$R\f$ rays and \f$L\f$ lines, we say that:
+
+-# \f$L\f$ is <EM>irredundant</EM> if
+ \f$L\f$ is a set of linearly independent lines; and
+-# a ray \f$\vect{r}_1\in R\f$ is <EM>redundant</EM>
+ if there exists another ray \f$\vect{r}_2 \in R\f$ and
+ there exists \f$\lambda \in \Rset, \lambda > 0\f$
+ such that \f$\vect{r}_1 = \lambda \vect{r}_2\f$.
+
+Note that, in the PPL representation of a polyhedron \f$\cP\f$,
+vertices are represented as rays so that
+this concept of a redundant ray also applies to the vertices of \f$\cP\f$.
+
+
+\subsection Face Face
+
+If \f$(\vect{c},b)\f$ is a valid inequality for \f$\cP\f$, and
+\f$F = \{\,\vect{x} \in \cP \mid \langle \vect{c}, \vect{x} \rangle = b\,\}\f$,
+\f$F\f$ is called a <EM>face</EM> of \f$\cP\f$ and we say that the inequality
+represents \f$F\f$.
+A face \f$F\f$ is said to be <EM>proper</EM> if \f$F \neq \emptyset\f$ and
+\f$F \neq \cP\f$.
+
+When \f$F\f$ is non-empty, we say that \f$(\vect{c},b)\f$ <EM>supports</EM>
+\f$\cP\f$.
+
+The empty polyhedron and the universe polyhedron both have no proper faces,
+because the only face of an empty polyhedron is itself, while the faces of
+the universe polyhedron are itself and the emptyset.
+
+Let \f$\cP\f$ be a non-empty polyhedron. The set
+\f[
+ F = \{ \vect{p} \} + \linspace(\cP),
+\f]
+where \f$\vect{p}\f$ is a point of \f$\cP\f$ and the symbol
+'\f$+\f$' denotes the Minkowski's sum, is a <EM>minimal proper face</EM> of
+the polyhedron if \f$F\f$ is a proper face of \f$\cP\f$.
+
+\subsection Facet Facet
+
+A proper face \f$F\f$ of \f$\cP\f$ is a <EM>facet</EM> (or <EM>maximal proper
+face</EM>) of \f$\cP\f$ if it is not strictly included into any other proper
+face of \f$\cP\f$.
+The affine dimension of a facet is equal to \f$\pdim(\cP) - 1\f$.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP\f$ a polyhedron in \f$\Rset^n\f$. The set of all faces is a lattice
+under inclusion: the minimal face is the emptyset, while the maximal face
+is the polyhedron.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP \neq \emptyset\f$ be a polyhedron in \f$\Rset^n\f$ and
+\f$C\f$ be the polyhedral cone in \f$\Rset^{n+1}\f$ obtained from \f$\cP\f$
+by homogenization, then:
+-# the only <EM>minimal proper face</EM> of \f$C\f$ is
+ \f$\linspace(C)\f$;
+-# let \f$\vect{y} \in C\f$ be different from \f$\vect{0}\f$ and
+ \f$\cone\{\vect{y}\}\f$ be defined as
+ \f$\{\, \lambda \vect{y} \mid \lambda \geq 0 \,\}\f$. If the set
+ \f$F = \cone\{\vect{y}\} + \linspace(C)\f$ is
+ a proper face of \f$C\f$, then \f$\vect{y}\f$ is an <EM>extremal ray</EM>
+ of \f$C\f$.
+
+\subsection Ray_Space Ray Space
+
+Given the decomposition \f$\mathcal{V} + \mathcal{R} + \mathcal{L}\f$
+of a polyhedron \f$\cP\f$ the set \f$\mathcal{V} + \mathcal{R}\f$
+is called the <EM>ray space</EM> of \f$\cP\f$
+and denoted by \f$\mathop{\mathrm{ray space}}(\cP)\f$.
+
+Thus a polyhedron \f$\cP\f$ can be always decomposed in its
+\f$\linspace\f$ and its \f$\mathop{\mathrm{ray space}}\f$.
+
+Note that, since \f$\linspace(\cP)\f$ and
+\f$\mathop{\mathrm{ray space}}(\cP)\f$ are polyhedra, their
+affine dimensions can be computed using the definition of affine
+dimension given for polyhedra.
+
+The spaces defined are connected by some consistency rules shown below.
+
+\subsection Dimensionality_Rules Dimensionality Rules
+
+In \f$\Rset^n\f$
+
+- The dimension of the \f$\linspace\f$
+ is the rank of any set of lines that span the space.
+- The dimension of the polyhedron is the dimension of the
+ \f$\mathop{\mathrm{ray space}}\f$ plus the dimension of the
+ \f$\linspace\f$.
+- The dimension of the \f$\mathop{\mathrm{ray space}}\f$
+ is \f$n\f$ minus the number of irredundant
+ lines minus the number of irredundant equalities.
+
+The proofs of these properties can be obtained considering the definitions of
+affine dimension and the decomposition of a polyhedron.
+
+\subsection Saturation Saturation
+
+Let us consider a ray \f$\vect{r} \in \Rset^n\f$ and an inequality
+\f$(\vect{a}, 0)\f$ where \f$\vect{a} \in \Rset^n\f$.
+Then we say that:
+- \f$r\f$ <EM>saturates</EM> the inequality
+ if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$r\f$ <EM>verifies</EM> the inequality
+ if \f$\langle \vect{a}, \vect{r} \rangle > 0\f$;
+- \f$r\f$ <EM>violates</EM> the inequality
+ if \f$\langle \vect{a}, \vect{r} \rangle < 0\f$.
+
+Similarly, considering an equality
+\f$\langle \vect{a}, \vect{x} \rangle = 0\f$:
+- \f$\vect{r}\f$ <EM>saturates</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$\vect{r}\f$ <EM>does not verify</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle \neq 0\f$.
+
+A constraint (i.e., an equality or an inequality) is
+<EM>satisfied</EM> by a ray if the ray saturates or verifies the constraint.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C \sseq \Rset^n\f$ be a polyhedral cone and
+\f$\vect{y}_1, \vect{y}_2 \in C\f$. If the sets
+\f$F_i = \cone\{\vect{y}_i\} + \linspace(C)\f$ with
+\f$i = 1, 2\f$ are proper faces of \f$C\f$, \f$F_1\f$ is equal to \f$F_2\f$
+if and only if the set of constraints that are saturated by \f$\vect{y}_1\f$
+is equal to the set of constraints that are saturated by \f$\vect{y}_2\f$.
+
+
+\subsection Saturation_Matrix Saturation Matrix
+
+A <EM>saturation matrix</EM> is a bit matrix that represents
+the connection between constraints and generators of a polyhedron.
+There are two kinds of saturation matrices, one having rows indexed
+by constraints and columns indexed by generators (<EM>sat_g</EM>),
+and one (that is the transposed version of the previous one) having
+rows indexed by generators and columns indexed by constraints (<EM>sat_c</EM>).
+
+For instance, in the saturation matrix sat_g, the elements are defined
+as follows:
+\f[
+s_{ij} =
+\begin{cases}
+0, \text{if the constraint indexed by } i \text{ is saturated by
+ the generator indexed by } j;\\
+1, \text{if the constraint indexed by } i \text{ is only
+ verified by the generator indexed by } j.
+\end{cases}
+\f]
+For efficiency reasons, the PPL uses both the sat_g and sat_c matrices.
+
+\subsection Saturation_Rule Saturation Rule
+
+In an \f$n\f$-dimensional \f$\mathop{\mathrm{ray space}}\f$,
+-# Every inequality must be saturated by at least \f$n\f$ vertices/rays.
+-# Every vertex must saturate at least \f$n\f$ inequalities and a ray
+ must saturate at least \f$n - 1\f$ inequalities plus the
+ positivity constraint.
+-# Every equality must be saturated by all lines and vertices/rays.
+-# Every line must saturate all equalities and inequalities.
+
+These rules are a consequence of the saturation concept.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C = \{\vect{x} \mid A\vect{x} \geq \vect{0}\}\f$ be a polyhedral cone.
+Then the minimal proper face of \f$C\f$ in an \f$n\f$-dimensional space can
+also be represented as
+\f$
+ F = \{\,\vect{x} \mid A\vect{x} = \vect{0}\,\}.
+\f$
+
+To see this, note that the minimal proper face of a polyhedral cone is equal
+to its lineality space. This for definition is composed by all \f$\vect{y}\f$
+of \f$C\f$ that satisfies \f$A \vect{x} = \vect{0}.\f$
+
+\subsection Adjacent_Rays Adjacent Rays
+
+Let \f$A\f$ be representing matrix of constraints of a cone \f$C\f$
+and \f$Q\f$ the set of rays that generate \f$C\f$. Then two rays
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are <EM>adjacent rays</EM> if
+-# there exists at least a row of \f$A\f$ (i.e., a constraint) that
+ is saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+-# and none of the rays of \f$Q\f$, except \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$, saturates all the constraints saturated by both
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+
+\subsection Independence_Rule Independence Rule
+
+-# No inequality is a positive combination of any other two inequalities
+ or equalities.
+-# No ray is a linear combination of any other two rays or lines.
+-# The set of equalities must be linearly independent.
+-# The set of lines must be linearly independent.
+
+To remove redundant constraints/generators we will use the following
+characterization:
+
+\subsection Redundancy_Rules Redundancy Rules
+
+- An inequality is not redundant if it
+ satisfies both point (1) of the saturation rule and point (1)
+ of the independence rule.
+- A vertex/ray is irredundant if it satisfies
+ both point (2) of the saturation rule and point (2) of the independence rule.
+
+It is useful to note that:
+- All rays saturate the positivity constraint and no vertex saturates
+ the positivity constraint; in fact in the homogeneous form
+ the positivity constraint is represented by the vector
+ \f$\vect{a}^\transpose = (0, \ldots, 0, 1)\f$, rays are of the form
+ \f$\vect{r} = (r_0, \ldots, r_{n-1}, 0)^\transpose\f$ and vertices
+ \f$\vect{v} = (v_0, \ldots, v_{n-1}, d)^\transpose\f$ with \f$d \neq 0\f$,
+ thus \f$\langle \vect{a}, \vect{r} \rangle = 0\f$ for each ray
+ \f$\vect{r}\f$ and \f$\langle \vect{a}, \vect{v} \rangle \neq 0\f$
+ for each vertex \f$\vect{v}\f$.
+- The positivity constraint will be irredundant if and only if
+ the size of the set
+ of rays is \f$\geq n\f$, where \f$n\f$ is the dimension of the ray space,
+ and the rank of the ray set is \f$n\f$; in fact a constraint is
+ irredundant if it is saturated by at least \f$n\f$ vertices/rays (see
+ above), but since only rays saturate the positivity constraint, then in
+ a system with \f$n\f$ vertices/rays the positivity constraint
+ is irredundant.
+
+\section integer_floats Integers Represented by Floating Point Numbers
+
+Floating point numbers can be used to represent finite families
+of integer numbers. In this section we collect some closure properties
+of these families that are exploited in the PPL.
+
+In order not to depend on the particular family of floating point
+numbers considered, we consider an abstraction that is parametric
+in the number \f$b\f$ of bits in the mantissa and gives no limit
+to the magnitude of the exponent \f$e\f$.
+For \f$b \in \Nset \setminus \{ 0 \}\f$ let
+\f[
+\begin{aligned}
+ F_b^+
+ &=
+ \bigl\{\,
+ x \in \Nset
+ \bigm|
+ x = (1 + m / 2^b) \cdot 2^e,
+ e \in \Nset,
+ m \in \Nset \cap [0, 2^b - 1]
+ \,\bigr\}, \\
+ F_b
+ &=
+ F_b^+ \cup \{ 0 \} \cup \{\, -x \mid x \in F_b^+ \,\}.
+\end{aligned}
+\f]
+
+Let \f$\phi \colon \Rset \to \Zset\f$ denote the function defined by
+\f[
+ \phi(t)
+ =
+ \begin{cases}
+ \lfloor t \rfloor, & \text{if $t \ge 0$;} \\
+ \lceil t \rceil, & \text{if $t < 0$.}
+ \end{cases}
+\f]
+Notice that \f$\phi\f$ is an <EM>odd</EM> function, that is, it satisfies
+\f$\phi(-t) = -\phi(t)\f$ for all \f$t \in \Rset\f$.
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we also write
+\f[
+\begin{aligned}
+ x \bdiv y &= \phi(x / y), \\
+ x \brem y &= x - (x \bdiv y) y.
+\end{aligned}
+\f]
+These are the integer division and remainder function as defined by
+the C99 standard
+[ISO/IEC 9899:1999(E), Programming Languages - C (ISO and ANSI C99 Standard)].
+
+<B><EM>Proposition A</EM></B>
+If \f$x\f$, \f$y \in F_b\f$ and \f$y \ne 0\f$, then \f$x \brem y \in F_b\f$.
+
+The proof is given in the next three lemmas.
+
+<B><EM>Lemma 1</EM></B>
+Let \f$G_b = \{\, n \in F_b^+ \mid \text{$n$ is odd} \,\}\f$.
+Then \f$G_b = \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+Furthermore, if \f$x \in F_b^+\f$ then there exist \f$n \in G_b\f$ and
+\f$f \in \Nset\f$ such that \f$x = n \cdot 2^f\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$n \in \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+There is a non negative integer \f$\beta \le b\f$ such that
+\f$2^\beta \le n < 2^{\beta + 1}\f$.
+Then \f$n = (1 + m / 2^b) \cdot 2^e\f$ with
+\f$m = (n - 2^\beta) \cdot 2^{b - \beta}\f$ and \f$e = \beta\f$.
+Here \f$m < (2^{\beta + 1} - 2^\beta) \cdot 2^{b - \beta} = 2^b\f$
+so that \f$n \in G_b\f$.
+The same argument shows that odd integers larger than \f$2^{b+1}\f$ do not
+in fact belong to \f$G_b\f$, since the corresponding value of \f$m\f$ would
+exceed the bound \f$2^b - 1\f$ in the definition.
+
+For the second part, let \f$x = (1 + m / 2^b) \cdot 2^e \in F_b^+\f$.
+Let \f$m = 2^d \cdot m_1\f$ with \f$m_1\f$ odd and \f$d < b\f$.
+Then \f$n = 2^{b - d} + m_1\f$ is an odd integer that belongs to \f$G_b\f$
+since \f$2^{b - d} + m_1 \le 2^{b - d} + (2^b - 1) / 2^d < 2^{b - d + 1}
+\le 2^{b + 1}\f$, using the first part.
+Hence we may take \f$f = e + d - b\f$ which is non negative since
+otherwise \f$m \cdot 2^{e - b} = m_1 \cdot 2^{e + d - b}\f$ would not be
+an integer as assumed.
+
+<B><EM>Lemma 2</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ and \f$y\f$ does not divide \f$x\f$, then
+\f$x \bmod y \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+By Lemma 1 above we may assume that \f$x = n \cdot 2^e\f$ and
+\f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$ odd integers, and \f$e\f$,
+\f$f \in \Nset\f$.
+Let \f$k = \lfloor x / y \rfloor\f$.
+The goal is to prove that \f$x - k y \in F_b^+\f$: we may assume that
+\f$k > 0\f$, that is, that \f$x > y\f$ for otherwise \f$x \bmod y = x\f$
+and there is nothing to prove.
+- If \f$e < f\f$ then \f$x - k y = 2^e (n - k m \cdot 2^{f - e})\f$.
+ The integer \f$n - k m \cdot 2^{f - e}\f$ is positive, odd and smaller
+ than \f$n\f$, and therefore belongs to \f$G_b\f$.
+- If \f$e = f\f$ then \f$x - k y = 2^e (n - k m)\f$.
+ The integer \f$n - k m\f$ is positive and smaller than \f$n\f$, and therefore
+ belongs to \f$F_b^+\f$.
+- If \f$e > f\f$ then \f$x - k y = 2^f (n \cdot 2^{e - f} - k m)\f$.
+ The integer \f$n \cdot 2^{e - f} - k m\f$ is positive and smaller
+ than \f$m\f$, and therefore belongs to \f$F_b^+\f$: in fact
+ \f[
+ n \cdot 2^{e - f} - k m
+ =
+ n \cdot 2^{e - f} - \Bigl\lfloor \frac xy \Bigr\rfloor m
+ =
+ n \cdot 2^{e - f} - \Bigl\lfloor \frac{n \cdot 2^{e - f}}m \Bigr\rfloor m.
+ \f]
+ In other words, this integer is \f$n \cdot 2^{e - f} \bmod m\f$ and
+ therefore it is smaller than \f$m\f$.
+
+In all cases, we wrote \f$x - k y\f$ as the product of a power of 2 and an
+element of \f$F_b^+\f$, and this product is another element of \f$F_b^+\f$.
+
+
+<B><EM>Lemma 3</EM></B>
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we have
+\f[
+ x \brem y
+ =
+ \begin{cases}
+ x \brem \abs{y}, & \text{if $x \ge 0$;} \\
+ -(\abs{x} \brem \abs{y}), & \text{if $x < 0$.}
+ \end{cases}
+\f]
+
+<B><EM>Proof</EM></B>
+Throughout the proof we write \f$x_0 = \abs{x}\f$ and \f$y_0 = \abs{y}\f$.
+First, assume that \f$x \ge 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x / y_0) = - \phi(x / y)\f$, by the property above.
+We have
+\f[
+ x \brem y
+ =
+ x - (x \bdiv y) y
+ =
+ x - (-k) y
+ =
+ x - k (-y)
+ =
+ x - k y_0.
+\f]
+Next, assume that \f$x < 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x_0 / y_0) = \phi(x / y)\f$.
+We have
+\f[
+ x \brem y
+ =
+ x - (x \bdiv y) y
+ =
+ x - k y
+ =
+ -( -x - k (-y))
+ =
+ -(x_0 - k y_0).
+\f]
+Finally, assume that \f$x < 0\f$ and that \f$y > 0\f$.
+Let \f$k = \phi(x_0 / y) = -\phi(x / y)\f$, again by the property above.
+We have
+\f[
+ x \brem y
+ =
+ x - (x \bdiv y) y
+ =
+ x - (-k) y
+ =
+ -( -x - k y)
+ =
+ -(x_0 - k y).
+\f]
+This completes the proof.
+
+<B><EM>Lemma 4</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ then \f$\gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$x = n \cdot 2^e\f$ and \f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$
+odd integers, and \f$e\f$, \f$f \in \Nset\f$.
+Then \f$\gcd(x, y) = \gcd(n, m) \cdot 2^{\min(e, f)}\f$, and therefore it
+belongs to \f$F_b^+\f$, since \f$\gcd(n, m) \le \min(n, m)\f$ so that it belongs
+to \f$G_b\f$.
+
+<B><EM>Lemma 5</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$, then \f$x / \gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+With the same notation as in the previous Lemma, both \f$n\f$ and
+\f$\gcd(n, m) \in G_b\f$: but all positive odd integers up to and
+including \f$n\f$ belong to \f$G_b\f$, so that \f$n / \gcd(n, m)\f$
+does as well.
+By Lemma 1
+\f$x / \gcd(x, y) = n \cdot 2^e / (\gcd(n, m) \cdot 2^{\min(e, f)})
+ = (n / \gcd(n, m)) \cdot 2^{e - \min(e, f)} \in F_b^+\f$.
+
+\endif
+
+*/ /* \mainpage */
diff --git a/doc/devref-language-interface.doxyconf.in b/doc/devref-language-interface.doxyconf.in
new file mode 100644
index 0000000..a2467d9
--- /dev/null
+++ b/doc/devref-language-interface.doxyconf.in
@@ -0,0 +1,308 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "PPL <PPL_SED_LANGUAGE_NAME> Language Interface"
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES = <PPL_SED_ALIASES>
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS = Include_Implementation_Details
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = <PPL_SED_INPUT>
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = <PPL_SED_GENERATE_HTML>
+HTML_OUTPUT = ppl-devref-<PPL_SED_INTERFACE_NAME>- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = <PPL_SED_GENERATE_LATEX>
+LATEX_OUTPUT = devref-<PPL_SED_INTERFACE_NAME>.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = devref-<PPL_SED_INTERFACE_NAME>.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED = <PPL_SED_CONFIGURED_MANUAL> \
+ PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+ PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED = DECLARE_CONVERSIONS \
+ CATCH_ALL \
+ PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = <PPL_SED_TAGFILES>
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/devref-language-interface.tex b/doc/devref-language-interface.tex
new file mode 100644
index 0000000..fb734e6
--- /dev/null
+++ b/doc/devref-language-interface.tex
@@ -0,0 +1,175 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version. The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\else
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+<PPL_SED_USEPACKAGE_OCAMLDOC>
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\scriptsize The PPL <PPL_SED_LANGUAGE_NAME> Language Interface Developer's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+<PPL_SED_LANGUAGE_NAME> Language Interface \\
+Developer's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+ University of Parma's FIL scientific research project (ex 60\%)
+ ``Pure and Applied Mathematics'';
+ MURST project
+ ``Automatic Program Certification by Abstract Interpretation'';
+ MURST project
+ ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+ MURST project
+ ``Automatic Aggregate- and Number-Reasoning for Computing: from
+ Decision Algorithms to Constraint Programming with Multisets,
+ Sets, and Maps'';
+ MURST project
+ ``Constraint Based Verification of Reactive Systems'';
+ MURST project
+ ``Abstract Interpretation: Design and Applications'';
+ EPSRC project
+ ``Numerical Domains for Software Analysis'';
+ EPSRC project
+ ``Geometric Abstractions for Scalable Program Analyzers''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+ BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+ BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in
new file mode 100644
index 0000000..fd8dc87
--- /dev/null
+++ b/doc/devref.doxyconf-html.in
@@ -0,0 +1,333 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = PPL
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS = Include_Implementation_Details
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @srcdir@/definitions.dox \
+ ../src/version.hh \
+ @srcdir@/../src/ \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *_types.hh \
+ *_defs.hh \
+ *_inlines.hh \
+ *_templates.hh \
+ *.cc \
+ C_Integer.hh \
+ Coefficient_traits_template.hh \
+ Has_Assign_Or_Swap.hh \
+ Integer_Interval.hh \
+ Rational_Box.hh \
+ Rational_Interval.hh \
+ Slow_Copy.hh \
+ algorithms.hh \
+ assert.hh \
+ assign_or_swap.hh \
+ checked_numeric_limits.hh \
+ compiler.hh \
+ initializer.hh \
+ linearize.hh \
+ max_space_dimension.hh \
+ meta_programming.hh \
+ namespaces.hh \
+ wrap_assign.hh \
+ wrap_string.hh
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = *.am \
+ *.in
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = YES
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = ppl-devref- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = devref.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = @srcdir@/devref.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED = PPL_OUTPUT_DECLARATIONS \
+ PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = ppl-devref- at VERSION@-html.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in
new file mode 100644
index 0000000..96bf8d8
--- /dev/null
+++ b/doc/devref.doxyconf-latex.in
@@ -0,0 +1,332 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = PPL
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS = Include_Implementation_Details
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @srcdir@/definitions.dox \
+ ../src/version.hh \
+ @srcdir@/../src/ \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *_types.hh \
+ *_defs.hh \
+ *_inlines.hh \
+ *_templates.hh \
+ *.cc \
+ C_Integer.hh \
+ Coefficient_traits_template.hh \
+ Has_Assign_Or_Swap.hh \
+ Integer_Interval.hh \
+ Rational_Box.hh \
+ Rational_Interval.hh \
+ Slow_Copy.hh \
+ algorithms.hh \
+ assert.hh \
+ assign_or_swap.hh \
+ checked_numeric_limits.hh \
+ compiler.hh \
+ initializer.hh \
+ linearize.hh \
+ max_space_dimension.hh \
+ meta_programming.hh \
+ namespaces.hh \
+ wrap_assign.hh \
+ wrap_string.hh
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = NO
+HTML_OUTPUT = ppl-devref- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = devref.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = @srcdir@/devref.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED = PPL_OUTPUT_DECLARATIONS \
+ PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/devref.tex b/doc/devref.tex
new file mode 100644
index 0000000..e0d2e14
--- /dev/null
+++ b/doc/devref.tex
@@ -0,0 +1,173 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version. The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\else
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\small The PPL Developer's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+Developer's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+ University of Parma's FIL scientific research project (ex 60\%)
+ ``Pure and Applied Mathematics'';
+ MURST project
+ ``Automatic Program Certification by Abstract Interpretation'';
+ MURST project
+ ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+ MURST project
+ ``Automatic Aggregate- and Number-Reasoning for Computing: from
+ Decision Algorithms to Constraint Programming with Multisets,
+ Sets, and Maps'';
+ MURST project
+ ``Constraint Based Verification of Reactive Systems'';
+ MURST project
+ ``Abstract Interpretation: Design and Applications'';
+ EPSRC project
+ ``Numerical Domains for Software Analysis'';
+ EPSRC project
+ ``Geometric Abstractions for Scalable Program Analyzers''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+ BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+ BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/fdl.dox b/doc/fdl.dox
new file mode 100644
index 0000000..b3bc174
--- /dev/null
+++ b/doc/fdl.dox
@@ -0,0 +1,412 @@
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GFDL_different_HTML_tag GNU Free Documentation License
+\else
+\page GFDL GNU Free Documentation License
+\endif
+
+\anchor GFDL
+
+Version 1.2, November 2002
+
+<PRE>
+Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+<P>
+<STRONG>0. PREAMBLE</STRONG>
+<P>
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+<P>
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+<P>
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+<P>
+
+<STRONG>1. APPLICABILITY AND DEFINITIONS</STRONG>
+<P>
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+<P>
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+<P>
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+<P>
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+<P>
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+<P>
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+<P>
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+<P>
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+<p>
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+<p>
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+<P>
+<STRONG>2. VERBATIM COPYING</STRONG>
+<P>
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+<P>
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+<P>
+
+<STRONG>3. COPYING IN QUANTITY</STRONG>
+<P>
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+<P>
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+<P>
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+<P>
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+<P>
+
+<STRONG>4. MODIFICATIONS</STRONG>
+<P>
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+<P>
+<UL>
+<LI><STRONG>A.</STRONG> Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+<LI><STRONG>B.</STRONG> List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+<LI><STRONG>C.</STRONG> State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+<LI><STRONG>D.</STRONG> Preserve all the copyright notices of the Document.
+<LI><STRONG>E.</STRONG> Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+<LI><STRONG>F.</STRONG> Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+<LI><STRONG>G.</STRONG> Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+<LI><STRONG>H.</STRONG> Include an unaltered copy of this License.
+<LI><STRONG>I.</STRONG> Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+<LI><STRONG>J.</STRONG> Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+<LI><STRONG>K.</STRONG> For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+<LI><STRONG>L.</STRONG> Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+<LI><STRONG>M.</STRONG> Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+<LI><STRONG>N.</STRONG> Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+<LI><STRONG>O.</STRONG> Preserve any Warranty Disclaimers.
+</UL>
+<P>
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+<P>
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+<P>
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+<P>
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+<P>
+
+<STRONG>5. COMBINING DOCUMENTS</STRONG>
+<P>
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+<P>
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+<P>
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements."
+<P>
+
+<STRONG>6. COLLECTIONS OF DOCUMENTS</STRONG>
+<P>
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+<P>
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+<P>
+
+
+<STRONG>7. AGGREGATION WITH INDEPENDENT WORKS</STRONG>
+<P>
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+<P>
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+<P>
+
+<STRONG>8. TRANSLATION</STRONG>
+<P>
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+<p>
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+<P>
+
+<STRONG>9. TERMINATION</STRONG>
+<P>
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+<P>
+
+<STRONG>10. FUTURE REVISIONS OF THIS LICENSE</STRONG>
+<P>
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+<P>
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+<P>
+
+<H2>How to use this License for your documents</H2>
+<P>
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+<P>
+<PRE>
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled
+ "GNU Free Documentation License".
+</PRE>
+<P>
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+<p>
+<pre>
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+</pre>
+<p>
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+<p>
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+*/
diff --git a/doc/fdl.pdf b/doc/fdl.pdf
new file mode 100644
index 0000000..b4757ae
Binary files /dev/null and b/doc/fdl.pdf differ
diff --git a/doc/fdl.ps.gz b/doc/fdl.ps.gz
new file mode 100644
index 0000000..950c040
Binary files /dev/null and b/doc/fdl.ps.gz differ
diff --git a/doc/fdl.tex b/doc/fdl.tex
new file mode 100644
index 0000000..fa38f28
--- /dev/null
+++ b/doc/fdl.tex
@@ -0,0 +1,454 @@
+\documentclass[a4paper,12pt]{article}
+
+\usepackage[english]{babel}
+
+\begin{document}
+
+
+\title{GNU Free Documentation License}
+\date{}
+\author{}
+\maketitle
+
+ \begin{center}
+
+ Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002 Free Software Foundation, Inc.
+
+ \bigskip
+
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+ \bigskip
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\section*{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\section{Applicability and Definitions}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The \textbf{"Document"}, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as \textbf{"you"}. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\section{Verbatim Copying}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\section{Copying in Quantity}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\section{Modifications}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.]
+ Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+
+\item[B.]
+ List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+
+\item[C.]
+ State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+\item[D.]
+ Preserve all the copyright notices of the Document.
+
+\item[E.]
+ Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+\item[F.]
+ Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+
+\item[G.]
+ Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+
+\item[H.]
+ Include an unaltered copy of this License.
+
+\item[I.]
+ Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+
+\item[J.]
+ Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+
+\item[K.]
+ For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+
+\item[L.]
+ Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+
+\item[M.]
+ Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+\item[N.]
+ Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+
+\item[O.]
+ Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\section{Combining Documents}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+\section{Collections of Documents}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\section{Aggregation with Independent Works}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\section{Translation}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\section{Termination}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+\section{Future Revisions of this License}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\section*{Addendum: How To Use this License for Your Documents}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\begin{quote}
+ Copyright \copyright YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+\end{quote}
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\begin{quote}
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+\end{document}
diff --git a/doc/fdl.txt b/doc/fdl.txt
new file mode 100644
index 0000000..a988da5
--- /dev/null
+++ b/doc/fdl.txt
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/doc/gpl.dox b/doc/gpl.dox
new file mode 100644
index 0000000..0d155d9
--- /dev/null
+++ b/doc/gpl.dox
@@ -0,0 +1,691 @@
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GPL_different_HTML_tag GNU General Public License
+\else
+\page GPL GNU General Public License
+\endif
+
+\anchor GPL
+
+Version 3, 29 June 2007
+
+<p>Copyright (C) 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<h1>Preamble</h1>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h1>TERMS AND CONDITIONS</h1>
+
+<h2>0. Definitions.</h2>
+
+<p>“This License” refers to version 3 of the GNU General Public License.</p>
+
+<p>“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+
+<p>“The Program” refers to any copyrightable work licensed under this
+License. Each licensee is addressed as “you”. “Licensees” and
+“recipients” may be individuals or organizations.</p>
+
+<p>To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.</p>
+
+<p>A “covered work” means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<h2>1. Source Code.</h2>
+
+<p>The “source code” for a work means the preferred form of the work
+for making modifications to it. “Object code” means any non-source
+form of a work.</p>
+
+<p>A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h2>2. Basic Permissions.</h2>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h2>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h2>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<h2>4. Conveying Verbatim Copies.</h2>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<h2>5. Conveying Modified Source Versions.</h2>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ “keep intact all notices”.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<h2>6. Conveying Non-Source Forms.</h2>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<h2>7. Additional Terms.</h2>
+
+<p>“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<h2>8. Termination.</h2>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<h2>9. Acceptance Not Required for Having Copies.</h2>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<h2>10. Automatic Licensing of Downstream Recipients.</h2>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<h2>11. Patents.</h2>
+
+<p>A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's “contributor version”.</p>
+
+<p>A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<h2>12. No Surrender of Others' Freedom.</h2>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<h2>13. Use with the GNU Affero General Public License.</h2>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<h2>14. Revised Versions of this License.</h2>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<h2>15. Disclaimer of Warranty.</h2>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<h2>16. Limitation of Liability.</h2>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<h2>17. Interpretation of Sections 15 and 16.</h2>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h1>How to Apply These Terms to Your New Programs</h1>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.</p>
+
+<pre> <var>one line to give the program's name and a brief idea of what it does.</var>
+ Copyright (C) <var>year</var> <var>name of author</var>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre> <var>program</var> Copyright (C) <var>year</var> <var>name of author</var>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an “about box”.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>.</p>
+*/
diff --git a/doc/gpl.pdf b/doc/gpl.pdf
new file mode 100644
index 0000000..b8f0b6a
Binary files /dev/null and b/doc/gpl.pdf differ
diff --git a/doc/gpl.ps.gz b/doc/gpl.ps.gz
new file mode 100644
index 0000000..cee9e53
Binary files /dev/null and b/doc/gpl.ps.gz differ
diff --git a/doc/gpl.tex b/doc/gpl.tex
new file mode 100644
index 0000000..1e867c3
--- /dev/null
+++ b/doc/gpl.tex
@@ -0,0 +1,728 @@
+\documentclass[a4paper,12pt]{article}
+\usepackage{a4wide}
+\usepackage{times}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+
+\title{GNU GENERAL PUBLIC LICENSE}
+\date{Version 3, 29 June 2007}
+
+\begin{document}
+\maketitle
+
+\begin{center}
+{\parindent 0in
+
+Copyright \copyright\ 2007 Free Software Foundation, Inc. http://fsf.org/
+
+\bigskip
+Everyone is permitted to copy and distribute verbatim copies of this
+
+license document, but changing it is not allowed.}
+
+\end{center}
+
+\renewcommand{\abstractname}{Preamble}
+\begin{abstract}
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+\end{abstract}
+
+\begin{center}
+{\Large \sc Terms and Conditions}
+\end{center}
+
+
+\begin{enumerate}
+
+\addtocounter{enumi}{-1}
+
+\item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License. Each licensee is addressed as ``you''. ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a ``modified version'' of the
+earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices''
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+\item Source Code.
+
+The ``source code'' for a work means the preferred form of the work
+for making modifications to it. ``Object code'' means any non-source
+form of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+The Corresponding Source for a work in source code form is that
+same work.
+
+\item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+\item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+\item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+\item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+ \begin{enumerate}
+ \item The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ \item The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ ``keep intact all notices''.
+
+ \item You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ \item If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+\end{enumerate}
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+\item Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+ \begin{enumerate}
+ \item Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ \item Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ \item Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ \item Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ \item Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+ \end{enumerate}
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, ``normally used'' refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+\item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+ \begin{enumerate}
+ \item Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ \item Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ \item Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ \item Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ \item Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ \item Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+ \end{enumerate}
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+\item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+\item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+\item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+\item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+\item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+\item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+\item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License ``or any later version'' applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+\item Disclaimer of Warranty.
+
+\begin{sloppypar}
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS''
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
+ RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
+\end{sloppypar}
+
+\item Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+ AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+ DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+ DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
+ (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+ INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
+ OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+ HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+\item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+\begin{center}
+{\Large\sc End of Terms and Conditions}
+
+How to Apply These Terms to Your New Programs
+
+\end{center}
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+\begin{quote}
+ <one line to give the program's name and a brief idea of what it does.>
+
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ http://www.gnu.org/licenses/.
+
+\end{quote}
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+\begin{quote}
+ <program> Copyright (C) <year> <name of author>
+
+ This program comes with ABSOLUTELY NO WARRANTY; for details type
+{\tt show w}.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type {\tt show c} for details.
+\end{quote}
+
+The hypothetical commands {\tt show w} and {\tt show c} should show
+the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. For more information on this, and how to apply and follow
+the GNU GPL, see http://www.gnu.org/licenses/.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use
+the GNU Lesser General Public License instead of this License. But
+first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
+
+\end{enumerate}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
+
diff --git a/doc/gpl.txt b/doc/gpl.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/doc/gpl.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/doc/interfaces-html.sed b/doc/interfaces-html.sed
new file mode 100644
index 0000000..57da416
--- /dev/null
+++ b/doc/interfaces-html.sed
@@ -0,0 +1,4 @@
+s/<PPL_SED_ALIASES>/"extref{2}=\\ref \\1 \\"\\2\\""/
+s/<PPL_SED_ENABLED_SECTIONS>/PPL_HTML_Tag_Documentation_of_Interfaces/
+s/<PPL_SED_GENERATE_HTML>/YES/
+s/<PPL_SED_GENERATE_LATEX>/NO/
diff --git a/doc/interfaces-latex.sed b/doc/interfaces-latex.sed
new file mode 100644
index 0000000..bea34f5
--- /dev/null
+++ b/doc/interfaces-latex.sed
@@ -0,0 +1,4 @@
+s/<PPL_SED_ALIASES>/"extref{2}=<EM>\\2<\/EM>"/
+s/<PPL_SED_ENABLED_SECTIONS>//
+s/<PPL_SED_GENERATE_HTML>/NO/
+s/<PPL_SED_GENERATE_LATEX>/YES/
diff --git a/doc/libppl.3 b/doc/libppl.3
new file mode 100644
index 0000000..03c9c55
--- /dev/null
+++ b/doc/libppl.3
@@ -0,0 +1,226 @@
+.TH libppl "3" "June 2012" "PPL 1.0" "libppl overview"
+
+.SH NAME
+libppl \- the C++ interface of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B #include <ppl.hh>
+.sp
+c++ file.cc
+.B -lppl
+
+.SH DESCRIPTION
+This is a short overview on how to use the Parma Polyhedra Library (PPL)
+in your C++ programs on Unix-like operating systems.
+Note that the PPL has interfaces also for C, Java, OCaml and a number
+of Prolog systems: look elsewhere for documentation on those.
+Note also that the present document does not describe the library
+functionality, its classes or its methods and functions: see
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+for this kind of information.
+
+.SH "INCLUDING THE HEADER FILE"
+The C++ interface of the PPL has only one header file, named
+\fIppl.hh\fP. So your program should contain a directive of the form
+.sp
+.B #include <ppl.hh>
+.sp
+Of course, you must make sure you installed the PPL in a place where
+the compiler can find it, either by itself or with the help of a suitable
+.B -Idir
+command line option (see the file \fIINSTALL\fP for information
+on how to configure the library so that it is installed in the
+place of your choice).
+
+.SH "INITIALIZING AND FINALIZING THE LIBRARY"
+The mere inclusion of \fIppl.hh\fP in at least one file of your
+project will cause the automatic initialization and finalization
+of the library.
+However, there are situations in which automatic initialization
+and finalization is not desirable (e.g., if the application fiddles
+with the GMP's memory allocation functions). In those cases,
+.B every
+inclusion of \fIppl.hh\fP must take the form
+.sp
+.nf
+.B #define PPL_NO_AUTOMATIC_INITIALIZATION
+.B #include <ppl.hh>
+.fi
+.sp
+When automatic initialization and finalization is disabled you must
+.B absolutely
+call the function
+.sp
+.B void Parma_Polyhedra_Library::initialize()
+.sp
+before using the library.
+It is also a good norm to call the function
+.sp
+.B void Parma_Polyhedra_Library::finalize()
+.sp
+when you are done with the library.
+
+.SH "USING THE LIBRARY"
+Keeping in mind that there is no substitute for a careful reading of
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+you can find many examples of use in the directories
+.B tests
+(see the
+.B README
+file in that directory)
+and
+.B demos/ppl_lcdd
+of the source distribution.
+
+.SH "LINKING WITH THE LIBRARY"
+Linking with the C++ interface of the Parma Polyhedra Library is best done
+using the C++ compiler itself: usually, specifying the
+.B -lppl
+command line option is enough. In fact, if you use a shared version
+of the library, this automatically records the dependency from the GMP
+library, something that the linker ought to deal with gracefully.
+Otherwise you will have to add
+.B -lgmpxx -lgmp
+to the command line.
+Things are more complex if you installed the PPL into some nonstandard
+place. In this case you will have to use the
+.B -Ldir
+option and, if you use a shared version of the library,
+possible take further steps: see the documentation of your system
+for more information on this subject
+(the
+.IR "Program Library HOWTO"
+is especially valuable for GNU/Linux users).
+
+.SH "IMPLEMENTING MEMORY-GUARDED COMPUTATIONS"
+One of the interesting features of the Parma Polyhedra Library is the
+possibility to implement memory-guarded computations. The idea is that
+you can limit the amount of virtual memory available to the process,
+launch a PPL computation, and be ready to catch an
+.B std::bad_alloc
+exception. Since the library is exception-safe, you can take the
+appropriate corrective measures (e.g., simplify the polyhedra and/or select
+less precise though less complex algorithms), and restart the computation.
+In order to do that, you should define alternative memory allocation functions
+for GMP that throw
+.B std::bad_alloc
+upon memory exhaustion.
+For instance:
+.sp
+.nf
+#include <new>
+#include <cstdlib>
+
+extern "C" void*
+cxx_malloc(size_t size) {
+ void* p = malloc(size);
+ if (p != 0 || size == 0)
+ return p;
+
+ throw std::bad_alloc();
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t, size_t new_size) {
+ void* p = realloc(q, new_size);
+ if (p != 0 || new_size == 0)
+ return p;
+
+ throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+ free(p);
+}
+.fi
+.sp
+Then you must install these functions and this can be done in two different
+ways:
+.IP (1)
+If your C++ compiler supports
+.B __attribute__ ((weak))
+and you do not have any other special needs, then you can simply link
+to your application a C function
+.B ppl_set_GMP_memory_allocation_functions(void)
+such as
+.sp
+.nf
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+.fi
+.sp
+This is all that you have to do, whether or not you use the automatic
+initialization feature of the library (see above): in any case
+the initialization procedure will automatically call
+.B ppl_set_GMP_memory_allocation_functions(void).
+.IP (2)
+If your C++ compiler does not support
+.B __attribute__ ((weak))
+then you cannot use the automatic initialization feature of the library
+(see above) and should write a main program of the form
+.sp
+.nf
+int main() {
+ // The ordering of the following function calls is important.
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+ Parma_Polyhedra_Library::initialize();
+ ...
+.fi
+.sp
+
+.SH "USING NATIVE FLOATING POINT NUMBERS"
+At initialization time, the Parma Polyhedra Library sets the FPU rounding
+mode in a way that allows its floating-point-based computations to be
+conservative (i.e., possibly approximated but correct) and reasonably
+efficient. In case your application itself uses native floating point
+numbers and relies on a particular rounding mode (if you are in doubt,
+assume that it does rely on round-to-nearest to be in effect), you should
+use the function
+.sp
+.B void Parma_Polyhedra_Library::restore_pre_PPL_rounding()
+.sp
+after the PPL initialization and before using native floating point numbers
+in the application.
+If your application does not use any floating-point-based PPL abstraction,
+no further measure should be taken.
+Otherwise, it is imperative to call the function
+.sp
+.B void Parma_Polyhedra_Library::set_rounding_for_PPL()
+.sp
+before invoking any PPL interface related to such abstractions.
+
+
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+David A. Wheeler.
+.IR "Program Library HOWTO",
+available (in several formats) at
+\fBhttp://www.dwheeler.com/program-library/\fR .
+
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/libppl_c.3 b/doc/libppl_c.3
new file mode 100644
index 0000000..3db0351
--- /dev/null
+++ b/doc/libppl_c.3
@@ -0,0 +1,162 @@
+.TH libppl_c "3" "June 2012" "PPL 1.0" "libppl_c overview"
+
+.SH NAME
+libppl_c \- the C interface of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B #include <ppl_c.h>
+.sp
+cc file.c
+.B -lppl
+
+.SH DESCRIPTION
+This is a short overview on how to use the Parma Polyhedra Library (PPL)
+in your C programs on Unix-like operating systems.
+Note that the PPL has interfaces also for C++, Java, OCaml and a number
+of Prolog systems: look elsewhere for documentation on those.
+Note also that the present document does not describe the library
+functionality, its classes or its methods and functions: see
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+and
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+for this kind of information.
+
+.SH "INCLUDING THE HEADER FILE"
+The C interface of the PPL has only one header file, named
+\fIppl_c.h\fP. So your program should contain a directive of the form
+.sp
+.B #include <ppl_c.h>
+.sp
+Of course, you must make sure you installed the PPL in a place where
+the compiler can find it, either by itself or with the help of a suitable
+.B -Idir
+command line option (see the file \fIINSTALL\fP for information
+on how to configure the library so that it is installed in the
+place of your choice).
+
+.SH "INITIALIZING AND FINALIZING THE LIBRARY"
+In order to initialize the Parma Polyhedra Library you must
+call the function
+.sp
+.B int ppl_initialize(void)
+.sp
+before using any of its functionalities.
+It is also a good norm to call the function
+.sp
+.B int ppl_finalize(void)
+.sp
+when you are done with the library.
+
+.SH "USING THE LIBRARY"
+Keeping in mind that there is no substitute for a careful reading of
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+and
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+you can find examples of use in the directories
+.B interfaces/C/tests
+and
+.B demos/ppl_lpsol
+of the source distribution.
+
+.SH "LINKING WITH THE LIBRARY"
+Linking with the C interface of the Parma Polyhedra Library is best done
+using the C compiler itself: usually, specifying the
+.B -lppl_c
+command line option is enough. In fact, if you use a shared version
+of the library, this automatically records the dependency from the
+PPL core and the GMP libraries, something that the linker ought to deal
+with gracefully.
+Otherwise you will have to add
+.B -lppl -lgmpxx -lgmp
+to the command line.
+Things are more complex if you installed the PPL into some nonstandard
+place. In this case you will have to use the
+.B -Ldir
+option and, if you use a shared version of the library,
+possible take further steps: see the documentation of your system
+for more information on this subject
+(the
+.IR "Program Library HOWTO"
+is especially valuable for GNU/Linux users).
+
+.SH "RETURN VALUES"
+All the PPL C interface functions return an int: a negative value means
+that an error occurred. See
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+for the error codes.
+
+.SH "IMPLEMENTING MEMORY-GUARDED COMPUTATIONS"
+One of the interesting features of the Parma Polyhedra Library is the
+possibility to implement memory-guarded computations. The idea is that
+you can limit the amount of virtual memory available to the process,
+launch a PPL computation, and be ready to be returned a
+.B PPL_ERROR_OUT_OF_MEMORY
+error code. You can then take the
+appropriate corrective measures (e.g., simplify the polyhedra and/or select
+less precise though less complex algorithms), and restart the computation.
+In order to do that, you should define alternative memory allocation functions
+for GMP that throw
+.B std::bad_alloc
+upon memory exhaustion.
+See \fB\f(BIlibppl\fB\|(3)\fR for instructions on how to do that.
+
+.SH "USING NATIVE FLOATING POINT NUMBERS"
+At initialization time, the Parma Polyhedra Library sets the FPU rounding
+mode in a way that allows its floating-point-based computations to be
+conservative (i.e., possibly approximated but correct) and reasonably
+efficient. In case your application itself uses native floating point
+numbers and relies on a particular rounding mode (if you are in doubt,
+assume that it does rely on round-to-nearest to be in effect), you should
+use the function
+.sp
+.B int ppl_restore_pre_PPL_rounding()
+.sp
+after the PPL initialization and before using native floating point numbers
+in the application.
+If your application does not use any floating-point-based PPL abstraction,
+no further measure should be taken.
+Otherwise, it is imperative to call the function
+.sp
+.B int ppl_set_rounding_for_PPL()
+.sp
+before invoking any PPL interface related to such abstractions.
+
+
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+.BR libppl(3)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+David A. Wheeler.
+.IR "Program Library HOWTO",
+available (in several formats) at
+\fBhttp://www.dwheeler.com/program-library/\fR .
+
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/ppl-config.1 b/doc/ppl-config.1
new file mode 100644
index 0000000..92d7d49
--- /dev/null
+++ b/doc/ppl-config.1
@@ -0,0 +1,142 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11.
+.TH PPL-CONFIG "1" "October 2013" "ppl-config 1.1" "User Commands"
+.SH NAME
+ppl-config \- obtain information about an installation of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B ppl-config
+[\fIOPTION\fR]...
+.SH DESCRIPTION
+Displays information, in various formats, about an installation
+of the Parma Polyhedra Library.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-FFMT\fR, \fB\-\-format\fR=\fIFMT\fR
+sets the output format to FMT
+(one of `plain', `makefile', `sh' or `csh')
+.TP
+\fB\-IINT\fR, \fB\-\-interface\fR=\fIINT\fR
+selects a library interface (one of `C++', `C',
+`Ciao\-Prolog', `GNU\-Prolog', `SICStus\-Prolog',
+`SWI\-Prolog', `XSB\-Prolog', `YAP\-Prolog',
+`OCaml' or `Java')
+.TP
+\fB\-A\fR, \fB\-\-application\fR
+selects output for building an application
+.TP
+\fB\-L\fR, \fB\-\-library\fR
+selects output for building a library
+.TP
+\fB\-p[PFX]\fR, \fB\-\-prefix\fR[=\fIPFX\fR]
+prints or sets library prefix information
+.TP
+\fB\-e[PFX]\fR, \fB\-\-exec\-prefix\fR[=\fIPFX\fR]
+prints or sets library exec\-prefix information
+.TP
+\fB\-O\fR, \fB\-\-configure\-options\fR
+prints configuration options
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information
+.TP
+\fB\-M\fR, \fB\-\-version\-major\fR
+prints version major number
+.TP
+\fB\-N\fR, \fB\-\-version\-minor\fR
+prints version minor number
+.TP
+\fB\-R\fR, \fB\-\-version\-revision\fR
+prints version revision number
+.TP
+\fB\-B\fR, \fB\-\-version\-beta\fR
+prints version beta number
+.TP
+\fB\-E\fR, \fB\-\-banner\fR
+prints library banner
+.TP
+\fB\-n\fR, \fB\-\-coefficients\fR
+prints type of library coefficients
+.TP
+\fB\-i\fR, \fB\-\-includedir\fR
+prints include files directory
+.TP
+\fB\-b\fR, \fB\-\-bindir\fR
+prints binary executables directory
+.TP
+\fB\-l\fR, \fB\-\-libdir\fR
+prints library files directory
+.TP
+\fB\-P\fR, \fB\-\-cppflags\fR
+prints preprocessor flags
+.TP
+\fB\-C\fR, \fB\-\-cflags\fR
+prints C compiler flags
+.TP
+\fB\-X\fR, \fB\-\-cxxflags\fR
+prints C++ compiler flags
+.TP
+\fB\-D\fR, \fB\-\-ldflags\fR
+prints linker flags
+.TP
+\fB\-g\fR, \fB\-\-license\fR
+prints synthetic licensing information
+.TP
+\fB\-c\fR, \fB\-\-copying\fR
+prints detailed licensing information
+.TP
+\fB\-u\fR, \fB\-\-bugs\fR
+prints bug reporting information
+.TP
+\fB\-r\fR, \fB\-\-credits\fR
+prints credits
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR.
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions. There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH "SEE ALSO"
+.BR libppl(3)
+.sp
+.BR libppl_c(3)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library Java Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library OCaml Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library Prolog Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
diff --git a/doc/ppl-user-1.1-html.tar.gz b/doc/ppl-user-1.1-html.tar.gz
new file mode 100644
index 0000000..42c11a8
Binary files /dev/null and b/doc/ppl-user-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-1.1.pdf b/doc/ppl-user-1.1.pdf
new file mode 100644
index 0000000..d6d22f8
Binary files /dev/null and b/doc/ppl-user-1.1.pdf differ
diff --git a/doc/ppl-user-1.1.ps.gz b/doc/ppl-user-1.1.ps.gz
new file mode 100644
index 0000000..5f3f5ca
Binary files /dev/null and b/doc/ppl-user-1.1.ps.gz differ
diff --git a/doc/ppl-user-c-interface-1.1-html.tar.gz b/doc/ppl-user-c-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..285759c
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-c-interface-1.1.pdf b/doc/ppl-user-c-interface-1.1.pdf
new file mode 100644
index 0000000..954d442
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1.pdf differ
diff --git a/doc/ppl-user-c-interface-1.1.ps.gz b/doc/ppl-user-c-interface-1.1.ps.gz
new file mode 100644
index 0000000..2e790e4
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-java-interface-1.1-html.tar.gz b/doc/ppl-user-java-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..eaf5bab
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-java-interface-1.1.pdf b/doc/ppl-user-java-interface-1.1.pdf
new file mode 100644
index 0000000..add9354
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1.pdf differ
diff --git a/doc/ppl-user-java-interface-1.1.ps.gz b/doc/ppl-user-java-interface-1.1.ps.gz
new file mode 100644
index 0000000..c9d009f
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-ocaml-interface-1.1-html.tar.gz b/doc/ppl-user-ocaml-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..0bb2d34
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-ocaml-interface-1.1.pdf b/doc/ppl-user-ocaml-interface-1.1.pdf
new file mode 100644
index 0000000..2597e1c
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1.pdf differ
diff --git a/doc/ppl-user-ocaml-interface-1.1.ps.gz b/doc/ppl-user-ocaml-interface-1.1.ps.gz
new file mode 100644
index 0000000..b5e07e5
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-prolog-interface-1.1-html.tar.gz b/doc/ppl-user-prolog-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..e8b647b
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-prolog-interface-1.1.pdf b/doc/ppl-user-prolog-interface-1.1.pdf
new file mode 100644
index 0000000..83062b5
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1.pdf differ
diff --git a/doc/ppl-user-prolog-interface-1.1.ps.gz b/doc/ppl-user-prolog-interface-1.1.ps.gz
new file mode 100644
index 0000000..0693032
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1.ps.gz differ
diff --git a/doc/ppl.bib b/doc/ppl.bib
new file mode 100644
index 0000000..cbb16bb
--- /dev/null
+++ b/doc/ppl.bib
@@ -0,0 +1,3246 @@
+A bibliography of papers that were consulted and/or written
+for the design and implementation of the Parma Polyhedra Library.
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara AT cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This BibTeX database is made available under the Open Data Commons
+Attribution License (ODC-By) v1.0, which is reproduced below for your
+convenience and available at http://opendatacommons.org/licenses/by/1.0/
+Summarizing:
+
+- You are free: to copy, distribute and use the database; to produce
+ works from the database; to modify, transform and build upon the database.
+
+- You must attribute any public use of the database, or works produced
+ from the database, in the manner specified in the license. For any
+ use or redistribution of the database, or works produced from it,
+ you must make clear to others the license of the database and keep
+ intact any notices on the original database.
+
+
+ at PREAMBLE{ "\newcommand{\noopsort}[1]{}" }
+
+ at PhdThesis{Ancourt91th,
+ Author = "C. Ancourt",
+ Title = "G\'en\'eration automatique de codes de transfert
+ pour multiprocesseurs \`a m\'emoires locales",
+ School = "Universit\'e de Paris VI",
+ Address = "Paris, France",
+ Month = mar,
+ Year = 1991,
+ Abstract = "Parallel tasks generated by automatic parallelizers do
+ not take advantage of supercomputer memory
+ hierarchies. This thesis presents algorithms to
+ transform a parallel task into an equivalent one that
+ uses data with fast access memory. Algorithms to
+ automatically generate code to move data between two
+ different memory levels of (super)computer are
+ presented. These copy codes should move back and forth
+ array elements that are accessed when an elementary
+ processor execute an array reference located in a set of
+ loops. This set of array elements is characterized by a
+ set of integer points in $\mathcal{Z}^p$ that is not
+ necessarily a convex polyhedron.
+ In the case of data transfers from global memory to
+ local memory, it is possible to copy a superset of
+ accessed elements, for instance its convex hull. A
+ trade-off has to be made between local memory space,
+ transfer volume and loop bound complexity.
+ To copy data back from local memory to global memory is
+ more difficult because global memory consistency must be
+ preserved. Each processor (or processus) should only
+ copy its own results to avoid errors and, secondarily,
+ to decrease global memory traffic.
+ The input of our main algorithm is an integer convex
+ polyhedron defining the computation space and an affine
+ function representing the index expressions. Its output
+ is set of nested loops containing a new array reference
+ whose execution copies exactly accessed elements. Each
+ element is copied only once. Loop bound expressions use
+ integer divisions to generate non-convex sets.
+ For most practical programs this algorithm provides
+ optimal code in number of data movements and control
+ overhead. Associated with a dependence analysis phase,
+ it can be used to generate data movements in distributed
+ memory multiprocessors. When data partitionning in local
+ memories is specified, it eliminates most of execution
+ guards used to compute only local values on each
+ processor."
+}
+
+ at PhdThesis{Bagnara97th,
+ Author = "R. Bagnara",
+ Title = "Data-Flow Analysis for Constraint Logic-Based Languages",
+ School = "Dipartimento di Informatica, Universit\`a di Pisa",
+ Address = "Pisa, Italy",
+ Month = mar,
+ Year = 1997,
+ Note = "Printed as Report TD-1/97",
+ Abstract = "We aim at the the development of precise, practical, and
+ theoretically well-founded data-flow analyzers for
+ constraint logic-based languages. The design and
+ development of such an analyzer fostered a number of
+ research problems that we had to address. A hierarchy of
+ constraint systems is introduced that is suitable for
+ designing and combining abstract domains. The rational
+ construction of a generic domain for the structural
+ analysis of CLP programs is presented. We also address
+ the problem of the ``missing \emph{occur-check}'' in many
+ implemented languages. We introduce a new family of
+ domains, based on constraint propagation techniques, for
+ the abstraction of the numerical leaves that occur in the
+ terms of CLP languages. Despite the fact that groundness
+ analysis for logic-based languages is a widely studied
+ subject, a novel domain for groundness analysis is
+ presented that outperforms the existing domains from
+ several points of view. Finally, we present a bottom-up
+ analysis technique for CLP languages that allows for the
+ precise derivation of both call- and success-patterns
+ preserving the connection between them."
+}
+
+ at Article{Bagnara98SCP,
+ Author = "R. Bagnara",
+ Title = "A Hierarchy of Constraint Systems for Data-Flow Analysis
+ of Constraint Logic-Based Languages",
+ Journal = "Science of Computer Programming",
+ Volume = 30,
+ Number = "1--2",
+ Publisher = "Elsevier",
+ Year = 1998,
+ Pages = "119--155",
+ Abstract = "Many interesting analyses for constraint logic-based
+ languages are aimed at the detection of \emph{monotonic}
+ properties, that is to say, properties that are
+ preserved as the computation progresses. Our basic
+ claim is that most, if not all, of these analyses can be
+ described within a unified notion of constraint domains.
+ We present a class of constraint systems that allows for
+ a smooth integration within an appropriate framework for
+ the definition of non-standard semantics of constraint
+ logic-based languages. Such a framework is also
+ presented and motivated. We then show how such domains
+ can be built, as well as construction techniques that
+ induce a hierarchy of domains with interesting
+ properties. In particular, we propose a general
+ methodology for domain combination with asynchronous
+ interaction (i.e., the interaction is not necessarily
+ synchronized with the domains' operations). By
+ following this methodology, interesting combinations of
+ domains can be expressed with all the the semantic
+ elegance of concurrent constraint programming
+ languages.",
+ URL = "http://bugseng.com/products/ppl/documentation/Bagnara98SCP.pdf"
+}
+
+ at Techreport{BagnaraDHMZ05TR,
+ Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+ and E. Zaffanella",
+ Title = "A Linear Domain for Analyzing the Distribution of Numerical Values",
+ Number = "2005.06",
+ Type = "Report",
+ Institution = "School of Computing, University of Leeds, UK",
+ Year = 2005,
+ Abstract = "This paper explores the abstract domain of \emph{grids},
+ a domain that is able to represent sets of equally
+ spaced points and hyperplanes over an $n$-dimensional
+ vector space. Such a domain is useful for the static
+ analysis of the patterns of distribution of the values
+ program variables can take. Besides the bare abstract
+ domain, we present a complete set of operations on grids
+ that includes all that is necessary to define the
+ abstract semantics and the widening operators required
+ to compute it in a finite number of steps. The
+ definition of the domain and its operations exploit
+ well-known techniques from linear algebra as well as a
+ dual representation that allows, among other things, for
+ a concise and efficient implementation.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraDHMZ05TR.pdf",
+}
+
+ at InProceedings{BagnaraDHMZ07,
+ Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+ and E. Zaffanella",
+ Title = "Grids: A Domain for Analyzing the Distribution of Numerical Values",
+ Booktitle = "Logic-based Program Synthesis and Transformation,
+ 16th International Symposium",
+ Address = "Venice, Italy",
+ Editor = "G. Puebla",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4407,
+ ISBN = "3-540-71409-X",
+ Year = 2007,
+ Pages = "219--235",
+ Abstract = "This paper explores the abstract domain of \emph{grids},
+ a domain that is able to represent sets of equally
+ spaced points and hyperplanes over an $n$-dimensional
+ vector space. Such a domain is useful for the static
+ analysis of the patterns of distribution of the values
+ program variables can take. We present the domain, its
+ representation and the basic operations on grids
+ necessary to define the abstract semantics. We show how
+ the definition of the domain and its operations exploit
+ well-known techniques from linear algebra as well as a
+ dual representation that allows, among other things, for
+ a concise and efficient implementation.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraDHMZ07.pdf"
+}
+
+ at Misc{BagnaraDHMZ06b,
+ Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+ and E. Zaffanella",
+ Title = "A Practical Tool for Analyzing the Distribution
+ of Numerical Values",
+ Year = 2006,
+ Note = "Available at
+ \url{http://www.comp.leeds.ac.uk/hill/Papers/papers.html}.",
+ Abstract = "The abstract domain of grids (or lattices) is a domain
+ that is able to represent sets of equally spaced points and
+ hyperplanes over an n-dimensional vector space. Such a
+ domain is useful for the static analysis of the patterns of
+ distribution of the values that program variables can take.
+ This paper explores how this domain may be used in program
+ analysis, describing grid operations such as affine image,
+ affine preimage and widenings needed by such an application.
+ The paper also shows how any grid may be approximated by a
+ less precise non-relational grid and describes how such an
+ approximation can be computed. Illustrative examples show
+ how the domain may be used in the analysis of programs
+ containing simple assignment statements, while loops and
+ recursive procedures."
+}
+
+ at Misc{BagnaraHMZ04EA,
+ Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+ Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+ Howpublished = "Report {\tt arXiv:cs.PL/0412043}",
+ Year = 2004,
+ Note = "Extended abstract.
+ Contribution to the \emph{International workshop on
+ ``Numerical \& Symbolic Abstract Domains''}
+ (NSAD'05, Paris, January 21, 2005).
+ Available at \url{http://arxiv.org/}
+ and \url{http://bugseng.com/products/ppl/}",
+ Abstract = "We discuss the divergence problems recently identified
+ in some extrapolation operators for weakly-relational
+ numeric domains. We identify the cause of the
+ divergences and point out that resorting to more
+ concrete, syntactic domains can be avoided by
+ researching suitable algorithms for the elimination of
+ redundant constraints in the chosen representation.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHMZ04EA.pdf"
+}
+
+ at InProceedings{BagnaraHZ02a,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "A New Encoding of Not Necessarily Closed Convex Polyhedra",
+ Booktitle = "Proceedings of the 1st CoLogNet Workshop on Component-based
+ Software Development and Implementation Technology
+ for Computational Logic Systems",
+ Address = "Madrid, Spain",
+ Editor = "M. Carro and C. Vacheret and K.-K. Lau",
+ Year = 2002,
+ Pages = "147--153",
+ Note = "Published as TR Number CLIP4/02.0, Universidad Polit\'ecnica
+ de Madrid, Facultad de Inform\'atica",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ02a.pdf"
+}
+
+ at TechReport{BagnaraHZ02TR,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "A New Encoding and Implementation
+ of Not Necessarily Closed Convex Polyhedra",
+ Number = 305,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2002,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+ Abstract = "Convex polyhedra, commonly employed for the analysis and
+ verification of both hardware and software, may be
+ defined either by a finite set of linear inequality
+ constraints or by finite sets of generating points and
+ rays of the polyhedron. Although most implementations
+ of the polyhedral operations assume that the polyhedra
+ are topologically closed (i.e., all the constraints
+ defining them are non-strict), several analyzers and
+ verifiers need to compute on a domain of convex
+ polyhedra that are not necessarily closed (NNC). The
+ usual approach to implementing NNC polyhedra is to embed
+ them into closed polyhedra in a vector space having one
+ extra dimension and reuse the tools and techniques
+ already available for closed polyhedra. Previously,
+ this embedding has been designed so that a constant
+ number of constraints and a linear number of generators
+ have to be added to the original NNC specification of
+ the polyhedron. In this paper we explore an alternative
+ approach: while still using an extra dimension to
+ represent the NNC polyhedron by a closed polyhedron, the
+ new embedding adds a linear number of constraints and a
+ constant number of generators. We discuss the relative
+ benefits of these two implementations and how the choice
+ of representation can affect the efficiency of the
+ polyhedral operations. As far as the issue of providing
+ a non-redundant description of the NNC polyhedron is
+ concerned, we generalize the results established in a
+ previous paper so that they apply to both encodings."
+}
+
+ at Article{BagnaraHRZ05SCP,
+ Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+ Title = "Precise Widening Operators for Convex Polyhedra",
+ Journal = "Science of Computer Programming",
+ Volume = 58,
+ Number = "1--2",
+ Publisher = "Elsevier",
+ Year = 2005,
+ Pages = "28--56",
+ Abstract = "In the context of static analysis via abstract
+ interpretation, convex polyhedra constitute the most
+ used abstract domain among those capturing numerical
+ relational information. Since the domain of convex
+ polyhedra admits infinite ascending chains, it has to be
+ used in conjunction with appropriate mechanisms for
+ enforcing and accelerating the convergence of fixpoint
+ computations. Widening operators provide a simple and
+ general characterization for such mechanisms. For the
+ domain of convex polyhedra, the original widening
+ operator proposed by Cousot and Halbwachs amply deserves
+ the name of \emph{standard widening} since most analysis
+ and verification tools that employ convex polyhedra also
+ employ that operator. Nonetheless, there is an
+ unfulfilled demand for more precise widening operators.
+ In this paper, after a formal introduction to the
+ standard widening where we clarify some aspects that are
+ often overlooked, we embark on the challenging task of
+ improving on it. We present a framework for the
+ systematic definition of new widening operators that are
+ never less precise than a given widening. The framework
+ is then instantiated on the domain of convex polyhedra
+ so as to obtain a new widening operator that improves on
+ the standard widening by combining several heuristics.
+ A preliminary experimental evaluation has yielded
+ promising results. We also suggest an improvement to
+ the well-known widening delay technique that allows to
+ gain precision while preserving its overall
+ simplicity.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHRZ05SCP.pdf"
+}
+
+ at TechReport{BagnaraHMZ05TR,
+ Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+ Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+ Number = 399,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2005,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+ Abstract = "We discuss the construction of proper widening operators
+ on several weakly-relational numeric abstractions. Our
+ proposal differs from previous ones in that we actually
+ consider the semantic abstract domains, whose elements
+ are \emph{geometric shapes}, instead of the (more
+ concrete) syntactic abstract domains of constraint
+ networks and matrices. Since the closure by entailment
+ operator preserves geometric shapes, but not their
+ syntactic expressions, our widenings are immune from the
+ divergence issues that could be faced by the previous
+ approaches when interleaving the applications of
+ widening and closure. The new widenings, which are
+ variations of the \emph{standard widening} for convex
+ polyhedra defined by Cousot and Halbwachs, can be made
+ as precise as the previous proposals working on the
+ syntactic domains. The implementation of each new
+ widening relies on the availability of an effective
+ reduction procedure for the considered constraint
+ description: we provide such an algorithm for the domain
+ of \emph{octagonal shapes}.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHMZ05TR.pdf"
+}
+
+ at InProceedings{BagnaraHMZ05,
+ Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+ Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+ Booktitle = "Static Analysis:
+ Proceedings of the 12th International Symposium",
+ Address = "London, UK",
+ Editor = "C. Hankin and I. Siveroni",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3672,
+ ISBN = "3-540-28584-9",
+ Year = 2005,
+ Pages = "3--18",
+ Abstract = "We discuss the construction of proper widening operators
+ on several weakly-relational numeric abstractions. Our
+ proposal differs from previous ones in that we actually
+ consider the semantic abstract domains, whose elements are
+ \emph{geometric shapes}, instead of the (more concrete)
+ syntactic abstract domains of constraint networks and
+ matrices. Since the closure by entailment operator preserves
+ geometric shapes, but not their syntactic expressions, our
+ widenings are immune from the divergence issues that could
+ be faced by the previous approaches when interleaving the
+ applications of widening and closure. The new widenings,
+ which are variations of the \emph{standard widening} for
+ convex polyhedra defined by Cousot and Halbwachs, can be
+ made as precise as the previous proposals working on the
+ syntactic domains. The implementation of each new widening
+ relies on the availability of an effective reduction procedure
+ for the considered constraint description: we provide such an
+ algorithm for the domain of \emph{octagonal shapes}.",
+}
+
+ at Techreport{BagnaraMPZ10TR,
+ Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+ Title = "The Automatic Synthesis of Linear Ranking Functions:
+ The Complete Unabridged Version",
+ Number = 498,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2010,
+ Note = "Superseded by \cite{BagnaraMPZ12TR}.",
+ Abstract = "The classical technique for proving termination of a
+ generic sequential computer program involves the
+ synthesis of a \emph{ranking function} for each loop of
+ the program. \emph{Linear} ranking functions are
+ particularly interesting because many terminating loops
+ admit one and algorithms exist to automatically
+ synthesize it. In this paper we present two such
+ algorithms: one based on work dated 1991 by Sohn and
+ Van~Gelder; the other, due to Podelski and Rybalchenko,
+ dated 2004. Remarkably, while the two algorithms will
+ synthesize a linear ranking function under exactly the
+ same set of conditions, the former is mostly unknown to
+ the community of termination analysis and its general
+ applicability has never been put forward before the
+ present paper. In this paper we thoroughly justify both
+ algorithms, we prove their correctness, we compare their
+ worst-case complexity and experimentally evaluate their
+ efficiency, and we present an open-source implementation
+ of them that will make it very easy to include
+ termination-analysis capabilities in automatic program
+ verifiers."
+}
+
+ at Misc{BagnaraMPZ12TR,
+ Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+ Title = "The Automatic Synthesis of Linear Ranking Functions:
+ The Complete Unabridged Version",
+ Howpublished = "Report {\tt arXiv:cs.PL/1004.0944v2}",
+ Year = 2012,
+ Note = "Available at \url{http://arxiv.org/}
+ and \url{http://bugseng.com/products/ppl/}.
+ Improved version of \cite{BagnaraMPZ10TR}.",
+ Abstract = "The classical technique for proving termination of a
+ generic sequential computer program involves the
+ synthesis of a \emph{ranking function} for each loop of
+ the program. \emph{Linear} ranking functions are
+ particularly interesting because many terminating loops
+ admit one and algorithms exist to automatically
+ synthesize it. In this paper we present two such
+ algorithms: one based on work dated 1991 by Sohn and
+ Van~Gelder; the other, due to Podelski and Rybalchenko,
+ dated 2004. Remarkably, while the two algorithms will
+ synthesize a linear ranking function under exactly the
+ same set of conditions, the former is mostly unknown to
+ the community of termination analysis and its general
+ applicability has never been put forward before the
+ present paper. In this paper we thoroughly justify both
+ algorithms, we prove their correctness, we compare their
+ worst-case complexity and experimentally evaluate their
+ efficiency, and we present an open-source implementation
+ of them that will make it very easy to include
+ termination-analysis capabilities in automatic program
+ verifiers."
+}
+
+ at Article{BagnaraMPZ12IC,
+ Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+ Title = "A New Look at the Automatic Synthesis of Linear Ranking Functions",
+ Journal = "Information and Computation",
+ Publisher = "Elsevier Science B.V.",
+ Year = 2012,
+ Volume = 215,
+ Pages = "47--67",
+ Abstract = "The classical technique for proving termination of a
+ generic sequential computer program involves the
+ synthesis of a \emph{ranking function} for each loop of
+ the program. \emph{Linear} ranking functions are
+ particularly interesting because many terminating loops
+ admit one and algorithms exist to automatically
+ synthesize it. In this paper we present two such
+ algorithms: one based on work dated 1991 by Sohn and
+ Van~Gelder; the other, due to Podelski and Rybalchenko,
+ dated 2004. Remarkably, while the two algorithms will
+ synthesize a linear ranking function under exactly the
+ same set of conditions, the former is mostly unknown to
+ the community of termination analysis and its general
+ applicability has never been put forward before the
+ present paper. In this paper we thoroughly justify both
+ algorithms, we prove their correctness, we compare their
+ worst-case complexity and experimentally evaluate their
+ efficiency, and we present an open-source implementation
+ of them that will make it very easy to include
+ termination-analysis capabilities in automatic program
+ verifiers."
+}
+
+ at InProceedings{BagnaraRZH02,
+ Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+ Title = "Possibly Not Closed Convex Polyhedra
+ and the {Parma Polyhedra Library}",
+ Booktitle = "Static Analysis:
+ Proceedings of the 9th International Symposium",
+ Address = "Madrid, Spain",
+ Editor = "M. V. Hermenegildo and G. Puebla",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2477,
+ ISBN = "3-540-44235-9",
+ Pages = "213--229",
+ Year = 2002,
+ Abstract = "The domain of convex polyhedra is employed in several
+ systems for the analysis and verification of hardware
+ and software components. Current applications span
+ imperative, functional and logic languages, synchronous
+ languages and synchronization protocols, real-time and
+ hybrid systems. Since the seminal work of P.~Cousot and
+ N.~Halbwachs, convex polyhedra have thus played an
+ important role in the formal methods community and
+ several critical tasks rely on their software
+ implementations. Despite this, existing libraries for
+ the manipulation of convex polyhedra are still research
+ prototypes and suffer from limitations that make their
+ usage problematic, especially in critical applications.
+ Furthermore, there is inadequate support for polyhedra
+ that are not necessarily closed (NNC), i.e., polyhedra
+ that are described by systems of constraints where strict
+ inequalities are allowed to occur. This paper presents
+ the Parma Polyhedra Library, a new, robust and complete
+ implementation of NNC convex polyhedra, concentrating on
+ the distinctive features of the library and on the novel
+ theoretical underpinnings.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraRZH02.pdf"
+}
+
+ at TechReport{BagnaraRZH02TR,
+ Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+ Title = "Possibly Not Closed Convex Polyhedra
+ and the {Parma Polyhedra Library}",
+ Number = 286,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = "{\noopsort{a}}2002",
+ Note = "See also \cite{BagnaraRZH02TRerrata}.
+ Available at \url{http://www.cs.unipr.it/Publications/}",
+ Abstract = "The domain of convex polyhedra is employed in several
+ systems for the analysis and verification of hardware
+ and software components. Current applications span imperative,
+ functional and logic languages, synchronous languages and
+ synchronization protocols, real-time and hybrid systems.
+ Since the seminal work of P.~Cousot and N.~Halbwachs,
+ convex polyhedra have thus played an important role
+ in the formal methods community and several critical tasks
+ rely on their software implementations. Despite this,
+ existing libraries for the manipulation of convex polyhedra
+ are still research prototypes and suffer from limitations
+ that make their usage problematic, especially in critical
+ applications. These limitations concern inaccuracies in
+ the documentation of the underlying theory, code and
+ interfaces; numeric overflow and underflow; use of not
+ fully dynamic data-structures and poor mechanisms
+ for error handling and recovery. In addition, there is
+ inadequate support for polyhedra that are not necessarily
+ closed (NNC), i.e., polyhedra that are described by systems
+ of constraints where strict inequalities are allowed to
+ occur. This paper presents the Parma Polyhedra Library,
+ a new, robust and complete implementation of NNC convex
+ polyhedra, concentrating on the distinctive features
+ of the library and on the novel theoretical underpinnings."
+}
+
+ at Misc{BagnaraRZH02TRerrata,
+ Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+ Title = "Errata for Technical Report {``Quaderno 286''}",
+ Howpublished = "Available at \url{http://www.cs.unipr.it/Publications/}",
+ Year = "{\noopsort{b}}2002",
+ Note = "See \cite{BagnaraRZH02TR}"
+}
+
+ at InProceedings{BagnaraHRZ03,
+ Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+ Title = "Precise Widening Operators for Convex Polyhedra",
+ Booktitle = "Static Analysis:
+ Proceedings of the 10th International Symposium",
+ Address = "San Diego, California, USA",
+ Editor = "R. Cousot",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2694,
+ Year = 2003,
+ Pages = "337--354",
+ Abstract = "Convex polyhedra constitute the most used abstract
+ domain among those capturing numerical relational
+ information. Since the domain of convex polyhedra
+ admits infinite ascending chains, it has to be used in
+ conjunction with appropriate mechanisms for enforcing
+ and accelerating convergence of the fixpoint
+ computation. Widening operators provide a simple and
+ general characterization for such mechanisms. For the
+ domain of convex polyhedra, the original widening
+ operator proposed by Cousot and Halbwachs amply deserves
+ the name of \emph{standard widening} since most analysis
+ and verification tools that employ convex polyhedra also
+ employ that operator. Nonetheless, there is an
+ unfulfilled demand for more precise widening operators.
+ In this paper, after a formal introduction to the
+ standard widening where we clarify some aspects that are
+ often overlooked, we embark on the challenging task of
+ improving on it. We present a framework for the
+ systematic definition of new and precise widening
+ operators for convex polyhedra. The framework is then
+ instantiated so as to obtain a new widening operator
+ that combines several heuristics and uses the standard
+ widening as a last resort so that it is never less
+ precise. A preliminary experimental evaluation has
+ yielded promising results.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHRZ03.pdf"
+}
+
+ at TechReport{BagnaraHRZ03TR,
+ Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+ Title = "Precise Widening Operators for Convex Polyhedra",
+ Number = 312,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2003,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+ Abstract = "Convex polyhedra constitute the most used abstract
+ domain among those capturing numerical relational
+ information. Since the domain of convex polyhedra
+ admits infinite ascending chains, it has to be used in
+ conjunction with appropriate mechanisms for enforcing
+ and accelerating convergence of the fixpoint
+ computation. Widening operators provide a simple and
+ general characterization for such mechanisms. For the
+ domain of convex polyhedra, the original widening
+ operator proposed by Cousot and Halbwachs amply deserves
+ the name of \emph{standard widening} since most analysis
+ and verification tools that employ convex polyhedra also
+ employ that operator. Nonetheless, there is demand for
+ more precise widening operators that still has not been
+ fulfilled. In this paper, after a formal introduction
+ to the standard widening where we clarify some aspects
+ that are often overlooked, we embark on the challenging
+ task of improving on it. We present a framework for the
+ systematic definition of new and precise widening
+ operators for convex polyhedra. The framework is then
+ instantiated so as to obtain a new widening operator
+ that combines several heuristics and uses the standard
+ widening as a last resort so that it is never less
+ precise. A preliminary experimental evaluation has
+ yielded promising results. We also suggest an
+ improvement to the well-known widening delay technique
+ that allows to gain precision while preserving its
+ overall simplicity."
+}
+
+ at InProceedings{BagnaraHZ03a,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "A New Encoding and Implementation
+ of Not Necessarily Closed Convex Polyhedra",
+ Booktitle = "Proceedings of the 3rd Workshop on Automated Verification
+ of Critical Systems",
+ Address = "Southampton, UK",
+ Editor = "M. Leuschel and S. Gruner and S. {Lo Presti}",
+ Year = 2003,
+ Pages = "161--176",
+ Note = "Published as TR Number DSSE-TR-2003-2, University of Southampton",
+ Abstract = "Convex polyhedra, commonly employed for the analysis and
+ verification of both hardware and software, may be
+ defined either by a finite set of linear inequality
+ constraints or by finite sets of generating points and
+ rays of the polyhedron. Although most implementations
+ of the polyhedral operations assume that the polyhedra
+ are topologically closed (i.e., all the constraints
+ defining them are non-strict), several analyzers and
+ verifiers need to compute on a domain of convex
+ polyhedra that are not necessarily closed (NNC). The
+ usual approach to implementing NNC polyhedra is to embed
+ them into closed polyhedra in a vector space having one
+ extra dimension and reuse the tools and techniques
+ already available for closed polyhedra. Previously,
+ this embedding has been designed so that a constant
+ number of constraints and a linear number of generators
+ have to be added to the original NNC specification of
+ the polyhedron. In this paper we explore an alternative
+ approach: while still using an extra dimension to
+ represent the NNC polyhedron by a closed polyhedron, the
+ new embedding adds a linear number of constraints and a
+ constant number of generators. We discuss the relative
+ benefits of these two implementations and how the choice
+ of representation can affect the efficiency of the
+ polyhedral operations. As far as the issue of providing
+ a non-redundant description of the NNC polyhedron is
+ concerned, we generalize the results established in a
+ previous paper so that they apply to both encodings.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ03a.pdf"
+}
+
+ at InProceedings{BagnaraHZ03b,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Widening Operators for Powerset Domains",
+ Booktitle = "Verification, Model Checking and Abstract Interpretation:
+ Proceedings of the 5th International Conference (VMCAI 2004)",
+ Address = "Venice, Italy",
+ Editor = "B. Steffen and G. Levi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2937,
+ ISBN = "3-540-20803-8",
+ Year = 2003,
+ Pages = "135--148",
+ Abstract = "The \emph{finite powerset construction} upgrades an
+ abstract domain by allowing for the representation of
+ finite disjunctions of its elements. In this paper we
+ define two generic widening operators for the finite
+ powerset abstract domain. Both widenings are obtained
+ by lifting any widening operator defined on the
+ base-level abstract domain and are parametric with
+ respect to the specification of a few additional
+ operators. We illustrate the proposed techniques by
+ instantiating our widenings on powersets of convex
+ polyhedra, a domain for which no non-trivial widening
+ operator was previously known.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ03b.pdf"
+}
+
+ at TechReport{BagnaraHZ04TR,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Widening Operators for Powerset Domains",
+ Number = 349,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2004,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+ Abstract = "The \emph{finite powerset construction} upgrades an
+ abstract domain by allowing for the representation of
+ finite disjunctions of its elements. In this paper we
+ define two generic widening operators for the finite
+ powerset abstract domain. Both widenings are obtained
+ by lifting any widening operator defined on the
+ base-level abstract domain and are parametric with
+ respect to the specification of a few additional
+ operators. We illustrate the proposed techniques by
+ instantiating our widenings on powersets of convex
+ polyhedra, a domain for which no non-trivial widening
+ operator was previously known.",
+}
+
+ at Article{BagnaraHZ05FAC,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Not Necessarily Closed Convex Polyhedra
+ and the Double Description Method",
+ Journal = "Formal Aspects of Computing",
+ Publisher = "Springer-Verlag, London",
+ Volume = "17",
+ Number = "2",
+ Pages = "222--257",
+ Year = 2005,
+ ISSN = "0934-5043",
+ Abstract = "Since the seminal work of Cousot and Halbwachs, the domain
+ of convex polyhedra has been employed in several systems
+ for the analysis and verification of hardware and software
+ components. Although most implementations of the polyhedral
+ operations assume that the polyhedra are topologically
+ closed (i.e., all the constraints defining them are
+ non-strict), several analyzers and verifiers need to
+ compute on a domain of convex polyhedra that are not
+ necessarily closed (NNC). The usual approach to
+ implementing NNC polyhedra is to embed them into closed
+ polyhedra in a higher dimensional vector space and reuse
+ the tools and techniques already available for closed
+ polyhedra. In this work we highlight and discuss the issues
+ underlying such an embedding for those implementations that
+ are based on the \emph{double description} method, where a
+ polyhedron may be described by a system of linear
+ constraints or by a system of generating rays and points.
+ Two major achievements are the definition of a
+ theoretically clean, high-level user interface and the
+ specification of an efficient procedure for removing
+ redundancies from the descriptions of NNC polyhedra.",
+}
+
+ at Article{BagnaraHZ06STTT,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Widening Operators for Powerset Domains",
+ Journal = "Software Tools for Technology Transfer",
+ Publisher = "Springer-Verlag, Berlin",
+ Volume = 8,
+ Number = "4/5",
+ Pages = "449--466",
+ Year = 2006,
+ Note = "In the printed version of this article, all the figures
+ have been improperly printed (rendering them useless).
+ See \cite{BagnaraHZ06STTTerratum}.",
+ Abstract = "The \emph{finite powerset construction} upgrades an
+ abstract domain by allowing for the representation of
+ finite disjunctions of its elements. While most of the
+ operations on the finite powerset abstract domain are
+ easily obtained by ``lifting'' the corresponding
+ operations on the base-level domain, the problem of
+ endowing finite powersets with a provably correct
+ widening operator is still open. In this paper we
+ define three generic widening methodologies for the
+ finite powerset abstract domain. The widenings are
+ obtained by lifting any widening operator defined on the
+ base-level abstract domain and are parametric with
+ respect to the specification of a few additional
+ operators that allow all the flexibility required to
+ tune the complexity/precision trade-off. As far as we
+ know, this is the first time that the problem of
+ deriving non-trivial, provably correct widening
+ operators in a domain refinement is tackled
+ successfully. We illustrate the proposed techniques by
+ instantiating our widening methodologies on powersets of
+ convex polyhedra, a domain for which no non-trivial
+ widening operator was previously known.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ06STTT.pdf"
+}
+
+ at Article{BagnaraHZ06STTTerratum,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Widening Operators for Powerset Domains",
+ Journal = "Software Tools for Technology Transfer",
+ Publisher = "Springer-Verlag, Berlin",
+ Volume = 9,
+ Number = "3/4",
+ Pages = "413--414",
+ Year = 2007,
+ Note = "Erratum to \cite{BagnaraHZ06STTT} containing all the figures
+ properly printed."
+}
+
+ at TechReport{BagnaraHZ06TR,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "The {Parma Polyhedra Library}: Toward a Complete Set of Numerical
+ Abstractions for the Analysis and Verification
+ of Hardware and Software Systems",
+ Number = 457,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2006,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+ Also published as {\tt arXiv:cs.MS/0612085},
+ available from \url{http://arxiv.org/}.",
+ Abstract = "Since its inception as a student project in 2001,
+ initially just for the handling (as the name implies) of
+ convex polyhedra, the \emph{Parma Polyhedra Library} has
+ been continuously improved and extended by joining
+ scrupulous research on the theoretical foundations of
+ (possibly non-convex) numerical abstractions to a total
+ adherence to the best available practices in software
+ development. Even though it is still not fully mature
+ and functionally complete, the Parma Polyhedra Library
+ already offers a combination of functionality,
+ reliability, usability and performance that is not
+ matched by similar, freely available libraries. In this
+ paper, we present the main features of the current
+ version of the library, emphasizing those that
+ distinguish it from other similar libraries and those
+ that are important for applications in the field of
+ analysis and verification of hardware and software
+ systems.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ06TR.pdf"
+}
+
+ at TechReport{BagnaraHZ07TRa,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Applications of Polyhedral Computations to the Analysis
+ and Verification of Hardware and Software Systems",
+ Number = 458,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2007,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+ Also published as {\tt arXiv:cs.CG/0701122},
+ available from \url{http://arxiv.org/}.",
+ Abstract = "Convex polyhedra are the basis for several abstractions
+ used in static analysis and computer-aided verification
+ of complex and sometimes mission critical systems. For
+ such applications, the identification of an appropriate
+ complexity-precision trade-off is a particularly acute
+ problem, so that the availability of a wide spectrum of
+ alternative solutions is mandatory. We survey the range
+ of applications of polyhedral computations in this area;
+ give an overview of the different classes of polyhedra
+ that may be adopted; outline the main polyhedral
+ operations required by automatic analyzers and
+ verifiers; and look at some possible combinations of
+ polyhedra with other numerical abstractions that have
+ the potential to improve the precision of the analysis.
+ Areas where further theoretical investigations can
+ result in important contributions are highlighted.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ07TRa.pdf"
+}
+
+ at TechReport{BagnaraHZ07TRb,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "An Improved Tight Closure Algorithm
+ for Integer Octagonal Constraints",
+ Number = 467,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2007,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+ Also published as {\tt arXiv:0705.4618v2 [cs.DS]},
+ available from \url{http://arxiv.org/}.",
+ Abstract = "Integer octagonal constraints (a.k.a.\ \emph{Unit Two
+ Variables Per Inequality} or \emph{UTVPI integer
+ constraints}) constitute an interesting class of
+ constraints for the representation and solution of
+ integer problems in the fields of constraint programming
+ and formal analysis and verification of software and
+ hardware systems, since they couple algorithms having
+ polynomial complexity with a relatively good expressive
+ power. The main algorithms required for the
+ manipulation of such constraints are the satisfiability
+ check and the computation of the inferential closure of
+ a set of constraints. The latter is called \emph{tight}
+ closure to mark the difference with the (incomplete)
+ closure algorithm that does not exploit the integrality
+ of the variables. In this paper we present and fully
+ justify an $O(n^3)$ algorithm to compute the tight
+ closure of a set of UTVPI integer constraints.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ07TRb.pdf"
+}
+
+ at Inproceedings{BagnaraHZ08,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "An Improved Tight Closure Algorithm
+ for Integer Octagonal Constraints",
+ Booktitle = "Verification, Model Checking and Abstract Interpretation:
+ Proceedings of the 9th International Conference (VMCAI 2008)",
+ Address = "San Francisco, USA",
+ Editor = "F. Logozzo and D. Peled and L. Zuck",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4905,
+ ISBN = "3-540-78162-2",
+ Year = 2008,
+ Pages = "8--21",
+ Abstract = "Integer octagonal constraints(a.k.a.\ \emph{Unit Two
+ Variables Per Inequality} or \emph{UTVPI integer
+ constraints}) constitute an interesting class of
+ constraints for the representation and solution of
+ integer problems in the fields of constraint programming
+ and formal analysis and verification of software and
+ hardware systems, since they couple algorithms having
+ polynomial complexity with a relatively good expressive
+ power. The main algorithms required for the
+ manipulation of such constraints are the satisfiability
+ check and the computation of the inferential closure of
+ a set of constraints. The latter is called \emph{tight}
+ closure to mark the difference with the (incomplete)
+ closure algorithm that does not exploit the integrality
+ of the variables. In this paper we present and fully
+ justify an $O(n^3)$ algorithm to compute the tight
+ closure of a set of UTVPI integer constraints.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ08.pdf"
+}
+
+ at Article{BagnaraHZ08SCP,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "The {Parma Polyhedra Library}: Toward a Complete Set of Numerical
+ Abstractions for the Analysis and Verification
+ of Hardware and Software Systems",
+ Journal = "Science of Computer Programming",
+ Volume = 72,
+ Number = "1--2",
+ Pages = "3--21",
+ Publisher = "Elsevier",
+ Year = 2008,
+ Abstract = "Since its inception as a student project in 2001,
+ initially just for the handling (as the name implies) of
+ convex polyhedra, the \emph{Parma Polyhedra Library} has
+ been continuously improved and extended by joining
+ scrupulous research on the theoretical foundations
+ of (possibly non-convex) numerical abstractions to a
+ total adherence to the best available practices in
+ software development. Even though it is still not
+ fully mature and functionally complete, the Parma
+ Polyhedra Library already offers a combination of
+ functionality, reliability, usability and performance
+ that is not matched by similar, freely available
+ libraries. In this paper, we present the main features
+ of the current version of the library, emphasizing those
+ that distinguish it from other similar libraries and
+ those that are important for applications in the field
+ of analysis and verification of hardware and software
+ systems.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ08SCP.pdf"
+}
+
+ at Article{BagnaraHZ10CGTA,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Exact Join Detection for Convex Polyhedra
+ and Other Numerical Abstractions",
+ Journal = "Computational Geometry: Theory and Applications",
+ Volume = 43,
+ Number = 5,
+ Pages = "453--473",
+ Publisher = "Elsevier",
+ Year = 2010,
+ Abstract = "Deciding whether the union of two convex polyhedra is
+ itself a convex polyhedron is a basic problem in
+ polyhedral computations; having important applications
+ in the field of constrained control and in the
+ synthesis, analysis, verification and optimization of
+ hardware and software systems. In such application
+ fields though, general convex polyhedra are just one
+ among many, so-called, \emph{numerical abstractions},
+ which range from restricted families of (not necessarily
+ closed) convex polyhedra to non-convex geometrical
+ objects. We thus tackle the problem from an abstract
+ point of view: for a wide range of numerical
+ abstractions that can be modeled as bounded
+ join-semilattices ---that is, partial orders where any
+ finite set of elements has a least upper bound---, we
+ show necessary and sufficient conditions for the
+ equivalence between the lattice-theoretic join and the
+ set-theoretic union. For the case of closed convex
+ polyhedra ---which, as far as we know, is the only one
+ already studied in the literature--- we improve upon the
+ state-of-the-art by providing a new algorithm with a
+ better worst-case complexity. The results and
+ algorithms presented for the other numerical
+ abstractions are new to this paper. All the algorithms
+ have been implemented, experimentally validated, and
+ made available in the Parma Polyhedra Library.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ10CGTA.pdf"
+}
+
+ at Article{BagnaraHZ09TCS,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Applications of Polyhedral Computations to the Analysis
+ and Verification of Hardware and Software Systems",
+ Journal = "Theoretical Computer Science",
+ Volume = 410,
+ Number = 46,
+ Pages = "4672--4691",
+ Publisher = "Elsevier",
+ Year = 2009,
+ Abstract = "Convex polyhedra are the basis for several abstractions
+ used in static analysis and computer-aided verification
+ of complex and sometimes mission critical systems. For
+ such applications, the identification of an appropriate
+ complexity-precision trade-off is a particularly acute
+ problem, so that the availability of a wide spectrum of
+ alternative solutions is mandatory. We survey the range
+ of applications of polyhedral computations in this area;
+ give an overview of the different classes of polyhedra
+ that may be adopted; outline the main polyhedral
+ operations required by automatic analyzers and
+ verifiers; and look at some possible combinations of
+ polyhedra with other numerical abstractions that have
+ the potential to improve the precision of the analysis.
+ Areas where further theoretical investigations can
+ result in important contributions are highlighted.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TCS.pdf"
+}
+
+ at Article{BagnaraHZ09FMSD,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Weakly-Relational Shapes for Numeric Abstractions: Improved
+ Algorithms and Proofs of Correctness",
+ Journal = "Formal Methods in System Design",
+ Volume = 35,
+ Number = 3,
+ Publisher = "Springer-Verlag, Berlin",
+ Year = 2009,
+ Pages = "279--323",
+ Abstract = "Weakly-relational numeric constraints provide a
+ compromise between complexity and expressivity that is
+ adequate for several applications in the field of formal
+ analysis and verification of software and hardware systems.
+ We address the problems to be solved for the construction
+ of full-fledged, efficient and provably correct abstract
+ domains based on such constraints. We first propose to work
+ with \emph{semantic} abstract domains, whose elements are
+ \emph{geometric shapes}, instead of the (more concrete)
+ syntactic abstract domains of constraint networks and
+ matrices on which the previous proposals are based.
+ This allows to solve, once and for all, the problem whereby
+ \emph{closure by entailment}, a crucial operation for the
+ realization of such domains, seemed to impede the
+ realization of proper widening operators. In our approach,
+ the implementation of widenings relies on the availability
+ of an effective reduction procedure for the considered
+ constraint description: one for the domain of \emph{bounded
+ difference shapes} already exists in the literature; we
+ provide algorithms for the significantly more complex cases
+ of rational and integer \emph{octagonal shapes}.
+ We also improve upon the state-of-the-art by presenting,
+ along with their proof of correctness, closure by entailment
+ algorithms of reduced complexity for domains based on
+ rational and integer octagonal constraints.
+ The consequences of implementing weakly-relational numerical
+ domains with floating point numbers are also discussed.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09FMSD.pdf"
+}
+
+ at Techreport{BagnaraHZ09TRa,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Exact Join Detection for Convex Polyhedra
+ and Other Numerical Abstractions",
+ Number = 492,
+ Type = "Quaderno",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Year = 2009,
+ Note = "Available at \url{http://www.cs.unipr.it/Publications/}. A
+ corrected and improved version (corrected an error in the
+ statement of condition (3) of Theorem~3.6, typos corrected
+ in statement and proof of Theorem~6.8) has been published
+ in \cite{BagnaraHZ09TRb}.",
+ Abstract = "Deciding whether the union of two convex polyhedra is a
+ convex polyhedron is a basic problem in polyhedral
+ computation having important applications in the field
+ of constrained control and in the synthesis, analysis,
+ verification and optimization of hardware and software
+ systems. In these application fields, though, general
+ convex polyhedra are only one among many so-called
+ \emph{numerical abstractions}: these range from
+ restricted families of (not necessarily closed) convex
+ polyhedra to non-convex geometrical objects. We thus
+ tackle the problem from an abstract point of view: for a
+ wide range of numerical abstractions that can be modeled
+ as bounded join-semilattices ---that is, partial orders
+ where any finite set of elements has a least upper
+ bound---, we show necessary and sufficient conditions
+ for the equivalence between the lattice-theoretic join
+ and the set-theoretic union. For the case of closed
+ convex polyhedra ---which, as far as we know, is the
+ only one already studied in the literature--- we improve
+ upon the state-of-the-art by providing a new algorithm
+ with a better worst-case complexity. The results and
+ algorithms presented for the other numerical
+ abstractions are new to this paper. All the algorithms
+ have been implemented, experimentally validated, and
+ made available in the Parma Polyhedra Library.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TRa.pdf"
+}
+
+ at Misc{BagnaraHZ09TRb,
+ Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+ Title = "Exact Join Detection for Convex Polyhedra
+ and Other Numerical Abstractions",
+ Howpublished = "Report {\tt arXiv:cs.CG/0904.1783}",
+ Year = 2009,
+ Note = "Available at \url{http://arxiv.org/}
+ and \url{http://bugseng.com/products/ppl/}",
+ Abstract = "Deciding whether the union of two convex polyhedra is
+ itself a convex polyhedron is a basic problem in
+ polyhedral computations; having important applications
+ in the field of constrained control and in the
+ synthesis, analysis, verification and optimization of
+ hardware and software systems. In such application
+ fields though, general convex polyhedra are just one
+ among many, so-called, \emph{numerical abstractions},
+ which range from restricted families of (not necessarily
+ closed) convex polyhedra to non-convex geometrical
+ objects. We thus tackle the problem from an abstract
+ point of view: for a wide range of numerical
+ abstractions that can be modeled as bounded
+ join-semilattices ---that is, partial orders where any
+ finite set of elements has a least upper bound---, we
+ show necessary and sufficient conditions for the
+ equivalence between the lattice-theoretic join and the
+ set-theoretic union. For the case of closed convex
+ polyhedra ---which, as far as we know, is the only one
+ already studied in the literature--- we improve upon the
+ state-of-the-art by providing a new algorithm with a
+ better worst-case complexity. The results and
+ algorithms presented for the other numerical
+ abstractions are new to this paper. All the algorithms
+ have been implemented, experimentally validated, and
+ made available in the Parma Polyhedra Library.",
+ URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TRb.pdf"
+}
+
+ at InProceedings{BalasundaramK89,
+ Author = "V. Balasundaram and K. Kennedy",
+ Title = "A Technique for Summarizing Data Access
+ and Its Use in Parallelism Enhancing Transformations",
+ Booktitle = "Proceedings of the ACM SIGPLAN'89 Conference
+ on Programming Language Design and Implementation (PLDI)",
+ Address = "Portland, Oregon, USA",
+ Editor = "B. Knobe",
+ Series = "ACM SIGPLAN Notices",
+ Volume = "24(7)",
+ Publisher = "ACM Press",
+ Year = 1989,
+ Pages = "41--53",
+}
+
+ at Techreport{BemporadFT00TR,
+ Author = "A. Bemporad and K. Fukuda and F. D. Torrisi",
+ Title = "Convexity Recognition of the Union of Polyhedra",
+ Number = "AUT00-13",
+ Type = "Report",
+ Institution = "Automatic Control Laboratory, ETHZ",
+ Address = "Zurich, Switzerland",
+ Year = 2000,
+ Abstract = "In this paper we consider the following basic problem in
+ polyhedral computation: Given two polyhedra in $R^d$,
+ $P$ and $Q$, decide whether their union is convex, and,
+ if so, compute it. We consider the three natural
+ specializations of the problem: (1) when the polyhedra are
+ given by half-spaces (H-polyhedra) (2) when they are given
+ by vertices and extreme rays (V-polyhedra) (3) when both
+ H- and V-polyhedral representations are available. Both the
+ bounded (polytopes) and the unbounded case are considered.
+ We show that the first two problems are polynomially solvable,
+ and that the third problem is strongly-polynomially solvable.",
+ URL = "http://control.ee.ethz.ch/index.cgi?page=publications;action=details;id=62"
+}
+
+ at Article{BemporadFT01,
+ Author = "A. Bemporad and K. Fukuda and F. D. Torrisi",
+ Title = "Convexity Recognition of the Union of Polyhedra",
+ Journal = "Computational Geometry: Theory and Applications",
+ Volume = 18,
+ Number = 3,
+ Publisher = "Elsevier",
+ Year = 2001,
+ ISSN = "0925-7721",
+ Pages = "141--154",
+ Abstract = "In this paper we consider the following basic problem in
+ polyhedral computation: Given two polyhedra in $R^d$,
+ $P$ and $Q$, decide whether their union is convex, and,
+ if so, compute it. We consider the three natural
+ specializations of the problem: (1) when the polyhedra are
+ given by halfspaces (H-polyhedra), (2) when they are given
+ by vertices and extreme rays (V-polyhedra), and (3) when both
+ H- and V-polyhedral representations are available. Both the
+ bounded (polytopes) and the unbounded case are considered.
+ We show that the first two problems are polynomially solvable,
+ and that the third problem is strongly-polynomially solvable.",
+}
+
+ at Inproceedings{BenerecettiFM11,
+ Author = "M. Benerecetti and M. Faella and S. Minopoli",
+ Title = "Towards Efficient Exact Synthesis for Linear Hybrid Systems",
+ Booktitle = "Proceedings of 2nd International Symposium on Games,
+ Automata, Logics and Formal Verification (GandALF 2011)",
+ Address = "Minori, Amalfi Coast, Italy",
+ Series = "Electronic Proceedings in Theoretical Computer Science",
+ Volume = 54,
+ Pages = "263--277",
+ Year = 2011,
+ Abstract = "We study the problem of automatically computing the
+ controllable region of a Linear Hybrid Automaton, with
+ respect to a safety objective. We describe the
+ techniques that are needed to effectively and
+ efficiently implement a recently-proposed solution
+ procedure, based on polyhedral abstractions of the state
+ space. Supporting experimental results are presented,
+ based on an implementation of the proposed techniques on
+ top of the tool PHAVer."
+}
+
+ at Article{BenerecettiFM13,
+ Author = "M. Benerecetti and M. Faella and S. Minopoli",
+ Title = "Automatic Synthesis of Switching Controllers for Linear Hybrid Systems: Safety Control",
+ Journal = "Theoretical Computer Science",
+ Volume = 493,
+ Pages = "116--138",
+ Publisher = "Elsevier",
+ Year = 2013,
+ Abstract = "In this paper we study the problem of automatically
+ generating switching controllers for the class of Linear
+ Hybrid Automata, with respect to safety
+ objectives. While the same problem has been already
+ considered in the literature, no sound and complete
+ solution has been provided so far. We identify and solve
+ inaccuracies contained in previous characterizations of
+ the problem, providing a sound and complete symbolic
+ fixpoint procedure to compute the set of states from
+ which a controller can keep the system in a given set of
+ desired states. While the overall procedure may not
+ terminate, we prove the termination of each iteration,
+ thus paving the way to an effective implementation. The
+ techniques needed to effectively and efficiently
+ implement the proposed solution procedure, based on
+ polyhedral abstractions of the state space, are
+ thoroughly illustrated and discussed. Finally, some
+ supporting and promising experimental results, based on
+ the implementation of the proposed techniques on top of
+ the tool PHAVer, are presented."
+}
+
+ at InProceedings{BessonJT99,
+ Author = "F. Besson and T. P. Jensen and J.-P. Talpin",
+ Title = "Polyhedral Analysis for Synchronous Languages",
+ Booktitle = "Static Analysis:
+ Proceedings of the 6th International Symposium",
+ Address = "Venice, Italy",
+ Editor = "A. Cortesi and G. Fil\'e",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 1694,
+ ISBN = "3-540-66459-9",
+ Year = 1999,
+ Pages = "51--68",
+ Abstract = "We define an operational semantics for the \textsc{Signal}
+ language and design an analysis which allows to verify
+ properties pertaining to the relation between values of
+ the numeric and boolean variables of a reactive
+ system. A distinguished feature of the analysis is that
+ it is expressed and proved correct with respect to the
+ source program rather than on an intermediate
+ representation of the program. The analysis calculates a
+ safe approximation to the set of reachable states by a
+ symbolic fixed point computation in the domain of convex
+ polyhedra using a novel widening operator based on the
+ convex hull representation of polyhedra."
+}
+
+ at InProceedings{BjorndalenA05,
+ Author = "J. M. Bj{\o}rndalen and O. Anshus",
+ Title = "Lessons Learned in Benchmarking
+ --- {Floating} Point Benchmarks: Can You Trust Them?",
+ Booktitle = "Proceedings of the \emph{Norsk informatikkonferanse 2005}
+ (NIK 2005)",
+ Address = "Bergen, Norway",
+ Publisher = "Tapir Akademisk Forlag",
+ ISBN = "82-519-2081-7",
+ Year = 2005,
+ Pages = "89--100",
+ Abstract = "Benchmarks are important tools for understanding the
+ implication of design choices for systems, and for
+ studying increasingly complex hardware architectures and
+ software systems. One of the assumptions for
+ benchmarking within systems research seems to be that
+ the execution time of floating point operations do not
+ change much with different input values. We report on a
+ problem where a textbook benchmark showed significant
+ variation in execution time depending on the input
+ values, and how a small fraction of \emph{denormalized}
+ floating point values (a representation automatically
+ used by the CPU to represent values close to zero) in
+ the benchmark could lead to the wrong conclusions about
+ the relative efficiency of PowerPC and Intel P4
+ machines. Furthermore, a parallel version of the same
+ benchmark is demonstrated to incorrectly indicate
+ scalability problems in the application or communication
+ subsystem. There is significant overhead in handling
+ these exceptions on-chip on modern Intel hardware, even
+ if the program can continue uninterrupted. We have
+ observed that the execution time of benchmarks can
+ increase by up to two orders of magnitude. In one
+ benchmark, 3.88\% denormalized numbers in a matrix
+ slowed down the benchmark by a factor 3.83. We suggest
+ some remedies and guidelines for avoiding the problem.",
+ URL = "http://www.cs.uit.no/~johnm/publications/pdf/bjorndalen2005lessons.pdf"
+}
+
+ at InCollection{BlanchetCCFMMMR02,
+ Author = "B. Blanchet and P. Cousot and R. Cousot and J. Feret
+ and L. Mauborgne and A. Min\'e and D. Monniaux
+ and X. Rival",
+ Title = "Design and Implementation of a Special-Purpose Static Program
+ Analyzer for Safety-Critical Real-Time Embedded Software",
+ Booktitle = "The Essence of Computation, Complexity, Analysis,
+ Transformation. Essays Dedicated to Neil D. Jones
+ [on occasion of his 60th birthday]",
+ Editor = "T. {\AE.} Mogensen and D. A. Schmidt and I. {Hal Sudborough}",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2566,
+ ISBN = "3-540-00326-6",
+ Year = 2002,
+ Pages = "85--108",
+ Abstract = "We report on a successful preliminary experience in the design
+ and implementation of a special-purpose Abstract Interpretation
+ based static program analyzer for the verification of safety
+ critical embedded real-time software.
+ The analyzer is both precise (zero false alarm in the considered
+ experiment) and efficient (less than one minute of analysis for
+ 10,000 lines of code).
+ Even if it is based on a simple interval analysis, many
+ features have been added to obtain the desired precision:
+ expansion of small arrays, widening with several thresholds,
+ loop unrolling, trace partitioning, relations between loop
+ counters and other variables. The efficiency of the tool mainly
+ comes from a clever representation of abstract environments
+ based on balanced binary search trees."
+}
+
+ at Article{BultanGP99,
+ Author = "T. Bultan and R. Gerber and W. Pugh",
+ Title = "Model-Checking Concurrent Systems with Unbounded Integer
+ Variables: Symbolic Representations, Approximations, and
+ Experimental Results",
+ Journal = "ACM Transactions on Programming Languages and Systems",
+ Volume = 21,
+ Number = 4,
+ Publisher = "ACM Press",
+ Year = 1999,
+ ISSN = "0164-0925",
+ Pages = "747--789",
+ Abstract = "Model checking is a powerful technique for analyzing
+ large, finite-state systems. In an infinite state
+ system, however, many basic properties are
+ undecidable. In this article, we present a new symbolic
+ model checker which conservatively evaluates safety and
+ liveness properties on programs with unbounded integer
+ variables. We use Presburger formulas to symbolically
+ encode a program's transition system, as well as its
+ model-checking computations. All fixpoint calculations
+ are executed symbolically, and their convergence is
+ guaranteed by using approximation techniques. We
+ demonstrate the promise of this technology on some
+ well-known infinite-state concurrency problems.",
+ URL = "http://www.cs.ucsb.edu/~bultan/publications/toplas.ps"
+}
+
+ at Article{Chernikova64,
+ Author = "N. V. Chernikova",
+ Title = "Algorithm for Finding a General Formula for the Non-Negative
+ Solutions of System of Linear Equations",
+ Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+ Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+ Volume = 4,
+ Number = 4,
+ Pages = "151--158",
+ Year = 1964
+}
+
+ at Article{Chernikova65,
+ Author = "N. V. Chernikova",
+ Title = "Algorithm for Finding a General Formula for the Non-Negative
+ Solutions of System of Linear Inequalities",
+ Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+ Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+ Volume = 5,
+ Number = 2,
+ Pages = "228--233",
+ Year = 1965,
+ Abstract = "The present note proposes a computational scheme
+ for finding a general formula for the non-negative
+ solutions of a system of linear inequalities
+ analogous to the scheme described in \cite{Chernikova64}
+ for finding a general formula for the non-negative
+ solutions of a system of linear equations."
+}
+
+ at Article{Chernikova68,
+ Author = "N. V. Chernikova",
+ Title = "Algorithm for Discovering the Set of all Solutions
+ of a Linear Programming Problem",
+ Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+ Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+ Volume = 8,
+ Number = 6,
+ Pages = "282--293",
+ Year = 1968,
+ Abstract = "In this paper two versions of a canonical algorithm for
+ discovering all the optimal solutions of a linear
+ programming problem with the condition of non-negativeness
+ of the variables are presented: the first for the case
+ of canonical notation, the second for the standard notation."
+}
+
+ at InProceedings{CousotC76,
+ Author = "P. Cousot and R. Cousot",
+ Title = "Static Determination of Dynamic Properties of Programs",
+ Booktitle = "Proceedings of the Second International
+ Symposium on Programming",
+ Editor = "B. Robinet",
+ Address = "Paris, France",
+ Publisher = "Dunod, Paris, France",
+ Pages = "106--130",
+ Year = 1976,
+ Abstract = "In high level languages, compile time type verifications are
+ usually incomplete, and dynamic coherence checks must be
+ inserted in object code. For example, in PASCAL one must
+ dynamically verify that the values assigned to subrange type
+ variables, or index expressions lie between two bounds, or
+ that pointers are not \texttt{nil}, ...
+ We present here a general algorithm allowing most of these
+ certifications to be done at compile time.",
+ URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-ISOP-76-Dunod-p106--130-1976.pdf"
+}
+
+ at InProceedings{CousotC79,
+ Author = "P. Cousot and R. Cousot",
+ Title = "Systematic Design of Program Analysis Frameworks",
+ Booktitle = "Proceedings of the Sixth Annual ACM
+ Symposium on Principles of Programming Languages",
+ Publisher = "ACM Press",
+ Address = "San Antonio, TX, USA",
+ Pages = "269--282",
+ Year = 1979,
+ Abstract = "Semantic analysis of programs is essential in optimizing
+ compilers and program verification systems. It encompasses
+ data flow analysis, data type determination, generation of
+ approximate invariant assertions, etc.
+ Several recent papers (among others Cousot \& Cousot[77a],
+ Graham & Wegman[76], Kam & Ullmann[76], Killdall[73],
+ Rosen[78], Tarjan[76], Wegbreit[75]) have introduced abstract
+ approaches to program analysis which are tantamount to the
+ use of a \emph{program analysis framework} $(A, t, \gamma)$
+ where $A$ is a lattice of (approximate) assertions,
+ $t$ is an (approximate) predicate transformer and
+ $\gamma$ is an often implicit function specifying the
+ meaning of the elements of $A$. This paper is devoted to
+ the systematic and correct design of program analysis
+ frameworks with respect to a formal semantics.",
+ URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-POPL-79-ACM-p269--282-1979.pdf"
+}
+
+ at InProceedings{CousotC92-PLILP,
+ Author = "P. Cousot and R. Cousot",
+ Title = "Comparing the {Galois} Connection and Widening/Narrowing
+ Approaches to Abstract Interpretation",
+ Booktitle = "Proceedings of the 4th International Symposium
+ on Programming Language Implementation and Logic Programming",
+ Address = "Leuven, Belgium",
+ Editor = "M. Bruynooghe and M. Wirsing",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 631,
+ ISBN = "3-540-55844-6",
+ Pages = "269--295",
+ Year = 1992,
+ Abstract = "The use of infinite abstract domains with widening and
+ narrowing for accelerating the convergence of abstract
+ interpretations is shown to be more powerful than the Galois
+ connection approach restricted to finite lattices (or lattices
+ satisfying the chain condition).",
+ URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-PLILP-92-LNCS-n631-p269--295-1992.pdf"
+}
+
+ at InProceedings{CousotH78,
+ Author = "P. Cousot and N. Halbwachs",
+ Title = "Automatic Discovery of Linear Restraints Among
+ Variables of a Program",
+ Booktitle = "Conference Record of the Fifth Annual ACM
+ Symposium on Principles of Programming Languages",
+ Address = "Tucson, Arizona",
+ Publisher = "ACM Press",
+ Pages = "84--96",
+ Year = 1978,
+ Abstract = "The model of abstract interpretation of programs developed
+ by Cousot & Cousot [1976] and Cousot & Cousot [1977]
+ is applied to the static determination of linear equality
+ or inequality relations among variables of programs.",
+ URL = "http://www.di.ens.fr/~cousot/publications.www/CousotHalbwachs-POPL-78-ACM-p84--97-1978.pdf"
+}
+
+ at Book{Dantzig63,
+ Author = "G. B. Dantzig",
+ Title = "Linear Programming and Extensions",
+ Publisher = "Princeton University Press",
+ Address = "Princeton, NJ",
+ Year = 1963
+}
+
+ at Article{Feautrier88,
+ Author = "P. Feautrier",
+ Title = "Parametric Integer Programming",
+ Journal = "RAIRO Recherche Op\'erationnelle",
+ Year = 1988,
+ Volume = 22,
+ Number = 3,
+ Pages = "243--268",
+ Abstract = "When analysing computer programs (especially numerical
+ programs in which arrays are used extensively), one is
+ often confronted with integer programming problems.
+ These problems have three peculiarities:
+ feasible points are ranked according to lexicographic
+ order rather than the usual linear economic function;
+ the feasible set depends on integer parameters;
+ one is interested only in exact solutions.
+ The difficulty is somewhat alleviated by the fact that
+ problems sizes are usually quite small. In this paper we
+ show that: the classical simplex algorithm has no
+ difficulty in handling lexicographic ordering; the
+ algorithm may be executed in symbolic mode, thus giving
+ the solution of continuous parametric problems; the
+ method may be extended to problems in integers. We prove
+ that the resulting algorithm always terminate and give
+ an estimate of its complexity."
+}
+
+ at Manual{FeautrierCB07,
+ Author = "P. Feautrier and J.-F. Collard and C. Bastoul",
+ Title = "{PIP/PipLib}: A Solver for Parametric Integer Programming Problems",
+ Edition = "5.0",
+ Note = "Distributed with {PIP/PipLib} 1.4.0",
+ Month = jul,
+ Year = 2007,
+ Abstract = "This manual is for PIP and PipLib version 1.4.0, a
+ software which solves Parametric Integer Programming
+ problems. That is, PIP finds the lexicographic minimum
+ of the set of integer points which lie inside a convex
+ polyhedron, when that polyhedron depends linearly on one
+ or more integral parameters."
+}
+
+ at Misc{Fukuda98,
+ Author = "K. Fukuda",
+ Title = "Polyhedral Computation {FAQ}",
+ Howpublished = "Swiss Federal Institute of Technology,
+ Lausanne and Zurich, Switzerland,
+ available at
+ \url{http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html}",
+ Year = 1998,
+ Abstract = "This is an FAQ to answer some basic questions arising
+ from certain geometric computation in general dimensional
+ (mostly Euclidean) space. The main areas to be covered are
+ the convex hull computation of a finite point set, the
+ vertex enumeration for a convex polytope, the computation
+ of Voronoi diagram and Delaunay triangulation, in $R^d$.
+ We illustrate typical solution processes with small examples
+ and publicly available codes such as cdd+ and lrs.",
+}
+
+ at InProceedings{FukudaP96,
+ Author = "K. Fukuda and A. Prodon",
+ Title = "Double Description Method Revisited",
+ Booktitle = "Combinatorics and Computer Science,
+ 8th Franco-Japanese and 4th Franco-Chinese Conference,
+ Brest, France, July 3-5, 1995, Selected Papers",
+ Editor = "M. Deza and R. Euler and Y. Manoussakis",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 1120,
+ Pages = "91--111",
+ Year = 1996,
+ ISBN = "3-540-61576-8",
+ Abstract = "The double description method is a simple and useful
+ algorithm for enumerating all extreme rays of a general
+ polyhedral cone in $R^d$, despite the fact that
+ we can hardly state any interesting theorems on its time
+ and space complexities. In this paper, we reinvestigate
+ this method, introduce some new ideas for efficient
+ implementations, and show some empirical results indicating
+ its practicality in solving highly degenerate problems.",
+ URL = "ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/ddrev960315.ps.gz"
+}
+
+ at InCollection{GawrilowJ00,
+ Author = "E. Gawrilow and M. Joswig",
+ Title = "{\tt polymake}: A Framework for Analyzing Convex Polytopes",
+ Booktitle = "Polytopes - Combinatorics and Computation",
+ Editor = "G. Kalai and G. M. Ziegler",
+ Publisher = "Birkh{\"a}user",
+ Pages = "43--74",
+ Year = 2000,
+ Abstract = "{\tt polymake} is a software tool designed for the algorithmic
+ treatment of polytopes and polyhedra. We give an overview of the
+ functionally as well as for the structure. This paper can be seen
+ as a first approximation to a {\tt polymake} handbook.
+ The tutorial starts with the very basic and ends with a few
+ {\tt polymake} applications to research problems. Then we
+ present the main features of the system including the interfaces
+ to other software products."
+}
+
+ at InProceedings{GawrilowJ01,
+ Author = "E. Gawrilow and M. Joswig",
+ Title = "{\tt polymake}: An Approach to Modular Software Design in
+ Computational Geometry",
+ Booktitle = "Proceedings of the 17th Annual Symposium on Computational
+ Geometry",
+ Organization = "ACM",
+ Address = "Medford, MA, USA",
+ Pages = "222--231",
+ Year = 2001,
+ Abstract = "{\tt polymake} is a software package designed for the study of
+ the combinatorics and the geometry of convex polytopes and
+ polyhedra. It offers access to a wide variety of algorithms and
+ tools within a common framework. As a key design feature it
+ allows to incorporate the functionality of a great variety of
+ other software packages in a modular way."
+}
+
+ at InProceedings{GopanDMDRS04,
+ Author = "D. Gopan and F. DiMaio and N. Dor and T. W. Reps and M. Sagiv",
+ Title = "Numeric Domains with Summarized Dimensions",
+ Booktitle = "Tools and Algorithms for the Construction and Analysis
+ of Systems, 10th International Conference, TACAS 2004",
+ Address = "Barcelona, Spain",
+ Editor = "K. Jensen and A. Podelski",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2988,
+ Pages = "512--529",
+ Year = 2004,
+ ISBN = "3-540-21299-X",
+ Abstract = "We introduce a systematic approach to designing
+ summarizing abstract numeric domains from existing
+ numeric domains. Summarizing domains use summary
+ dimensions to represent potentially unbounded
+ collections of numeric objects. Such domains are of
+ benefit to analyses that verify properties of systems
+ with an unbounded number of numeric objects, such as
+ shape analysis, or systems in which the number of
+ numeric objects is bounded, but large."
+}
+
+ at InProceedings{Granger91,
+ Author = "P. Granger",
+ Title = "Static Analysis of Linear Congruence Equalities
+ among Variables of a Program",
+ Booktitle = "TAPSOFT'91: Proceedings of the International Joint Conference
+ on Theory and Practice of Software Development,
+ Volume 1: Colloquium on Trees in Algebra and Programming
+ (CAAP'91)",
+ Address = "Brighton, UK",
+ Year = 1991,
+ Editor = "S. Abramsky and T. S. E. Maibaum",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 493,
+ ISBN = "3-540-53982-4",
+ Pages = "169--192",
+ Abstract = "In this paper, a new kind of static (or semantic)
+ analysis is defined: congruence analysis, which is
+ conceived to discover the properties of the following
+ type: ``the integer valued variable $X$ is congruent to
+ $c$ modulo $m$'', where $c$ and $m$ are automatically
+ determined integers. This analysis is then related to an
+ algebraic framework and wholly characterized. Moreover,
+ we show an example how it can be useful for automatic
+ vectorization. Finally, we present some extensions of it,
+ namely its combination with the analysis of bounds, and
+ also some analysis defined when the modulus of
+ congruences is given \emph{a priori}.",
+}
+
+ at InProceedings{Granger97,
+ Author = "P. Granger",
+ Title = "Static Analyses of Congruence Properties on Rational Numbers
+ (Extended Abstract)",
+ Booktitle = "Static Analysis: Proceedings of the 4th International
+ Symposium",
+ Address = "Paris, France",
+ Year = 1997,
+ Editor = "P. {Van Hentenryck}",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 1302,
+ ISBN = "3-540-63468-1",
+ Pages = "278--292",
+ Abstract = "We present several new static analysis frameworks
+ applying to rational numbers, and more precisely,
+ designed for discovering congruence properties satisfied
+ by rational (or real) variables of programs. Two of them
+ deal with additive congruence properties and generalize
+ linear equation analysis [M. Karr, \emph{Affine
+ Relationships among Variables of a Program}, Acta
+ Informatica, 6:133--151, 1976] and congruence analysis on
+ integer numbers [P. Granger, \emph{Static Analysis of
+ Arithmetical Congruences}, International Journal of
+ Computer Mathematics, 30:165--190, 1989], [P. Granger,
+ \emph{Static Analysis of Linear Congruence Equalities
+ among Variables of a Program}, TAPSOFT'91: Proceedings of
+ the International Joint Conference on Theory and Practice
+ of Software Development, Volume 1: Colloquium on Trees in
+ Algebra and Programming (CAAP'91), Lecture Notes in
+ Computer Science, 493, pp. 169--192]. The others are
+ based on multiplicative congruence properties in the set
+ of positive rational numbers. Among other potential
+ applications, we exemplify the interest of all these
+ analyses for optimizing the representation of rational or
+ real valued variables."
+}
+
+ at Article{GoldfarbR77,
+ Author = "D. Goldfarb and J. K. Reid",
+ Title = "A Practical Steepest-Edge Simplex Algorithm",
+ Journal = "Mathematical Proramming",
+ Volume = 12,
+ Number = 1,
+ Pages = "361--371",
+ Year = 1977,
+ Abstract = "It is shown that suitable recurrences may be used in
+ order to implement in practice the steepest-edge simplex
+ linear programming algorithm. In this algorithm each
+ iteration is along an edge of the polytope of feasible
+ solutions on which the objective function decreases most
+ rapidly with respect to distance in the space of all the
+ variables. Results of computer comparisons on
+ medium-scale problems indicate that the resulting
+ algorithm requires less iterations but about the same
+ overall time as the algorithm of Harris [8], which may
+ be regarded as approximating the steepest-edge
+ algorithm. Both show a worthwhile advantage over the
+ standard algorithm."
+}
+
+ at PhdThesis{Halbwachs79th,
+ Author = "N. Halbwachs",
+ Title = "D\'etermination Automatique de Relations Lin\'eaires
+ V\'erifi\'ees par les Variables d'un Programme",
+ Type = "{Th\`ese de 3\textsuperscript{\`eme} cycle d'informatique}",
+ School = "Universit\'e scientifique et m\'edicale de Grenoble",
+ Address = "Grenoble, France",
+ Month = mar,
+ Year = 1979
+}
+
+ at InProceedings{Halbwachs93,
+ Author = "N. Halbwachs",
+ Title = "Delay Analysis in Synchronous Programs",
+ Pages = "333--346",
+ Booktitle = "Computer Aided Verification:
+ Proceedings of the 5th International Conference (CAV'93)",
+ Address = "Elounda, Greece",
+ Editor = "C. Courcoubetis",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 697,
+ Year = 1993,
+ ISBN = "3-540-56922-7",
+ Abstract = "Linear relation analysis [CH78, Hal79] has been proposed
+ a long time ago as an abstract interpretation which
+ permits to discover linear relations invariantly
+ satisfied by the variables of a program. Here, we
+ propose to apply this general method to variables used
+ to count delays in synchronous programs. The ``regular''
+ behavior of these counters makes the results of the
+ analysis especially precise. These results can be
+ applied to code optimization and to the verification of
+ real-time properties of programs.",
+}
+
+ at InProceedings{HalbwachsPR94,
+ Author = "N. Halbwachs and Y.-E. Proy and P. Raymond",
+ Title = "Verification of Linear Hybrid Systems
+ by Means of Convex Approximations",
+ Booktitle = "Static Analysis:
+ Proceedings of the 1st International Symposium",
+ Address = "Namur, Belgium",
+ Editor = "B. {Le Charlier}",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 864,
+ ISBN = "3-540-58485-4",
+ Pages = "223--237",
+ Year = 1994,
+ Abstract = "We present a new application of the abstract interpretation
+ by means of convex polyhedra, to a class of hybrid systems,
+ i.e., systems involving both discrete and continuous variables.
+ The result is an efficient automatic tool for approximate,
+ but conservative, verification of reachability properties
+ of these systems.",
+ URL = "http://www-verimag.imag.fr/~halbwach/hybrid.html"
+}
+
+ at Manual{HalbwachsKP95,
+ Author = "N. Halbwachs and A. Kerbrat and Y.-E. Proy",
+ Title = "{POLyhedra INtegrated Environment}",
+ Organization = "Verimag",
+ Address = "France",
+ Edition = "version 1.0 of {POLINE}",
+ Month = sep,
+ Year = 1995,
+ Note = "Documentation taken from source code.",
+}
+
+ at Article{HalbwachsPR97,
+ Author = "N. Halbwachs and Y.-E. Proy and P. Roumanoff",
+ Title = "Verification of Real-Time Systems using
+ Linear Relation Analysis",
+ Journal = "Formal Methods in System Design",
+ Publisher = "Kluwer Academic Publishers",
+ Volume = 11,
+ Number = 2,
+ Pages = "157--185",
+ Year = 1997,
+ Abstract = "Linear Relation Analysis [11] is an abstract interpretation
+ devoted to the automatic discovery of invariant linear
+ inequalities among numerical variables of a program. In this
+ paper, we apply such an analysis to the verification of
+ quantitative time properties of two kinds of systems:
+ synchronous programs and linear hybrid systems.",
+}
+
+ at Book{HenkinMT71,
+ Author = "L. Henkin and J. D. Monk and A. Tarski",
+ Title = "Cylindric Algebras: Part I",
+ Publisher = "North-Holland",
+ Address = "Amsterdam",
+ ISBN = "978-0-7204-2043-2",
+ Year = 1971,
+}
+
+ at InProceedings{HenzingerH95,
+ Author = "T. A. Henzinger and P.-H. Ho",
+ Title = "A Note on Abstract Interpretation Strategies for Hybrid Automata",
+ Booktitle = "Hybrid Systems II",
+ Editor = "P. J. Antsaklis and W. Kohn and A. Nerode and S. Sastry",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 999,
+ Pages = "252--264",
+ Year = 1995,
+ Abstract = "We report on several abstract interpretation strategies
+ that are designed to improve the performance of {\sc
+ HyTech}, a symbolic model checker for linear hybrid
+ systems. We (1) simultaneously compute the target region
+ from different directions, (2) conservatively
+ approximate the target region by dropping constraints,
+ and (3) iteratively refine the approximation until
+ sufficient precision is obtained. We consider the
+ standard abstract convex-hull operator and a novel
+ abstract extrapolation operator.",
+ URL = "http://pub.ist.ac.at/~tah/Publications/abstract-interpretation_strategies_for_hybrid_automata.html"
+}
+
+ at InProceedings{HenzingerPW01,
+ Author = "T. A. Henzinger and J. Preussig and H. Wong-Toi",
+ Title = "Some Lessons from the {\sc HyTech} Experience",
+ Booktitle = "Proceedings of the 40th Annual Conference
+ on Decision and Control",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "2887--2892",
+ Year = 2001,
+ Abstract = "We provide an overview of the current status of the tool
+ {\sc HyTech}, and reflect on some of the lessons learned
+ from our experiences with the tool. HyTech is a symbolic
+ model checker for mixed discrete-continuous systems that
+ are modeled as automata with piecewise-constant
+ polyhedral differential inclusions. The use of a formal
+ input language and automated procedures for state-space
+ traversal lay the foundation for formally verifying
+ properties of hybrid dynamical systems. We describe some
+ recent experiences analyzing three hybrid systems. We
+ point out the successes and limitations of the tool. The
+ analysis procedure has been extended in a number of ways
+ to address some of the tool's shortcomings. We evaluate
+ these extensions, and conclude with some desiderata for
+ verification tools for hybrid systems.",
+ URL = "http://pub.ist.ac.at/~tah/Publications/some_lessons_from_the_hytech_experience.html"
+}
+
+ at TechReport{HuelsbergenHL90,
+ Author = "L. Huelsbergen and D. Hahn and J. Larus",
+ Title = "Exact Dependence Analysis Using Data Access Descriptors",
+ Number = 945,
+ Institution = "Department of Computer Science, University of Wisconsin",
+ Address = "Madison",
+ Year = 1990,
+ Abstract = "\emph{Data Access Descriptors} provide a method for
+ summarizing and representing the portion of an array
+ accessed by a program statement. A Data Access
+ Descriptor does not, however, indicate if its
+ characterization is exact or conservative, nor does it
+ record the temporal order of accesses. Exactness is
+ necessary to expose maximal parallelism. Temporal
+ information is necessary to calculate \emph{direction
+ vectors} for inter-loop dependences.
+ This paper presents an extension to basic Data Access
+ Descriptors that identies exact representations. We
+ illustrate the value of extended Data Access Descriptors
+ by showing how to calculate information typically
+ provided by direction vectors and by refining potential
+ conflicts between statements with \emph{array kill}
+ information."
+}
+
+ at InProceedings{JaffarMSY94,
+ Author = "J. Jaffar and M. J. Maher and P. J. Stuckey and R. H. C. Yap",
+ Title = "Beyond Finite Domains",
+ Booktitle = "Principles and Practice of Constraint Programming:
+ Proceedings of the Second International Workshop",
+ Publisher = "Springer-Verlag, Berlin",
+ Editor = "A. Borning",
+ Address = "Rosario, Orcas Island, Washington, USA",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 874,
+ Pages = "86--94",
+ Year = 1994,
+}
+
+ at Article{KhachiyanBBEG06,
+ Author = "L. Khachiyan and E. Boros and K. Borys
+ and K. Elbassioni and V. Gurvich",
+ Title = "Generating All Vertices of a Polyhedron Is Hard",
+ Journal = "Discrete and Computational Geometry",
+ Publisher = "Springer",
+ Address = "New York",
+ Year = 2006,
+ Note = "Invited contribution.",
+ Abstract = "We show that generating all negative cycles of a
+ weighted graph is a hard enumeration problem, in both
+ the directed and undirected cases. More precisely, given
+ a family of such cycles, it is NP-complete problem to
+ decide whether this family can be extended or there is
+ no other negative directed cycles in the graph, implying
+ that directed negative cycles cannot be generated in
+ polynomial output time, unless P=NP. As a corollary, we
+ solve in the negative two well-known generating problems
+ from linear programming: (i) Given an (infeasible)
+ system of linear inequalities, generating all minimal
+ infeasible subsystems is hard. Yet, for generating
+ maximal feasible subsystems the complexity remains
+ open. (ii) Given a (feasible) system of linear
+ inequalities, generating all vertices of the
+ corresponding polyhedron is hard. Yet, in case of
+ bounded polyhedra the complexity remains open."
+}
+
+ at Inproceedings{NakanishiJPF99,
+ Author = "T. Nakanishi and K. Joe and C. D. Polychronopoulos and A. Fukuda",
+ Title = "The Modulo Interval: A Simple and Practical Representation
+ for Program Analysis",
+ Booktitle = "Proceedings of the 1999 International Conference on
+ Parallel Architectures and Compilation Techniques",
+ Address = "Newport Beach, California, USA",
+ Publisher = "IEEE Computer Society",
+ Year = 1999,
+ Pages = "91--96",
+ Abstract = "In this paper, the modulo interval, an extension of the
+ traditional interval on real numbers, and its useful
+ mathematical properties are presented as a
+ representation for program analysis Only with two
+ additional parameters to the interval on real numbers,
+ namely the modulus and the residue, the modulo interval
+ can represent information on program having cyclicity
+ such as loop indices, array subscripts etc. at
+ reasonable complexity and more accuracy. Well-defined
+ arithmetic and set operations on the modulo interval
+ make implementation of compilers simple and
+ reliable. Moreover, application of the modulo interval
+ to program analysis for parallelizing compilers is
+ discussed in this paper."
+}
+
+ at Article{NakanishiF01,
+ Author = "T. Nakanishi and A. Fukuda",
+ Title = "Modulo Interval Arithmetic and Its Application to Program Analysis",
+ Journal = "Transactions of Information Processing Society of Japan",
+ Volume = 42,
+ Number = 4,
+ Pages = "829--837",
+ Year = 2001,
+}
+
+ at Manual{NEW-POLKA-1-1-3c,
+ Author = "B. Jeannet",
+ Title = "Convex Polyhedra Library",
+ Edition = "release 1.1.3c",
+ Month = mar,
+ Year = 2002,
+ Note = "Documentation of the ``New Polka'' library.",
+}
+
+ at Article{Kuhn56,
+ Author = "H. W. Kuhn",
+ Title = "Solvability and Consistency for Linear Equations and Inequalities",
+ Journal = "American Mathematical Monthly",
+ Volume = 63,
+ Pages = "217--232",
+ Year = 1956,
+}
+
+ at TechReport{LeVerge92,
+ Author = "H. {Le Verge}",
+ Title = "A note on {Chernikova's} Algorithm",
+ Type = "\emph{Publication interne}",
+ Number = 635,
+ Institution = "IRISA",
+ Address = "Campus de Beaulieu, Rennes, France",
+ Year = 1992,
+ Abstract = "This paper describes an implementation of Chernikova's
+ algorithm for finding an irredundant set of vertices for a
+ given polyhedron defined by a set of linear inequalities and
+ equations. This algorithm can also be used for the dual
+ problem: given a set of extremal rays and vertices, find the
+ associated irredundant set of facet supporting hyperplanes.
+ The method is an extension of initial Chernikova's
+ algorithm (non negative domain), and is mainly based on the
+ polyhedral cone duality principle. A new enhancement for
+ extremal ray detection together with its effects on a class
+ of polyhedra.",
+ Source = "chernikova.c"
+}
+
+ at TechReport{LeVergeVDW94,
+ Author = "H. {Le Verge}, V. {Van Dongen} and D. K. Wilde",
+ Title = "Loop Nest Synthesis Using the Polyhedral Library",
+ Type = "\emph{Publication interne}",
+ Number = 830,
+ Institution = "IRISA",
+ Address = "Campus de Beaulieu, Rennes, France",
+ Year = 1994,
+ Abstract = "A new method to synthesis loop nests given a polyhedral
+ domain, the context domain, and the loop nesting order is
+ described. The method is based on functions in the IRISA
+ polyhedral library."
+}
+
+ at Article{LoechnerW97,
+ Author = "V. Loechner and D. K. Wilde",
+ Title = "Parameterized Polyhedra and Their Vertices",
+ Journal = "International Journal of Parallel Programming",
+ Volume = 25,
+ Number = 6,
+ Pages = "525--549",
+ Year = 1997,
+ Abstract = "Algorithms specified for parametrically sized problems are more
+ general purpose and more reusable than algorithms for fixed sized
+ problems. For this reason, there is a need for representing and
+ symbolically analyzing linearly parameterized algorithms.
+ An important class of parallel algorithms can be described as
+ systems of parameterized affine recurrence equations (PARE).
+ In this representation, linearly parameterized polyhedra are
+ used to described the domains of variables. This paper describes
+ an algorithm which computes the set of parameterized vertices of
+ a polyhedron, given its representation as a system of
+ parameterized inequalities. This provides an important tool for
+ the symbolic analysis of the parameterized domains used to define
+ variables and computation domains in PARE's.
+ A library of operations on parameterized polyhedra based on the
+ Polyhedral Library has been written in C and is freely
+ distributed."
+}
+
+ at Misc{Loechner99,
+ Author = "V. Loechner",
+ Title = "{\it PolyLib\/}:
+ A Library for Manipulating Parameterized Polyhedra",
+ Howpublished = "Available at
+ \url{http://icps.u-strasbg.fr/~loechner/polylib/}",
+ Year = 1999,
+ Month = mar,
+ Note = "Declares itself to be a continuation of \cite{Wilde93th}"
+}
+
+ at InProceedings{Masdupuy92,
+ Author = "F. Masdupuy",
+ Title = "Array Operations Abstraction Using Semantic Analysis
+ of Trapezoid Congruences",
+ Booktitle = "Proceedings of the 6th ACM International Conference
+ on Supercomputing",
+ Address = "Washington, DC, USA",
+ Publisher = "ACM Press",
+ Pages = "226--235",
+ Year = 1992,
+ Abstract = "With the growing use of vector supercomputers, efficient
+ and accurate data structure analyses are needed. What we
+ propose in this paper is to use the quite general
+ framework of Cousot's abstract interpretation for the
+ particular analysis of multi-dimensional array
+ indexes. While such indexes are integer tuples, a
+ relational integer analysis is first required. This
+ analysis results of a combination of existing ones that
+ are interval and congruence based. Two orthogonal
+ problems are directly concerned with the results of such
+ an analysis, that are the parallelization/vectorization
+ with the dependence analysis and the data locality
+ problem used for array storage management. After
+ introducing the analysis algorithm, this paper describes
+ on a complete example how to use it in order to optimize
+ array storage."
+}
+
+ at PhdThesis{Masdupuy93th,
+ Author = "F. Masdupuy",
+ Title = "Array Indices Relational Semantic Analysis
+ Using Rational Cosets and Trapezoids",
+ Type = "{Th\`ese d'informatique}",
+ School = "\'Ecole Polytechnique",
+ Address = "Palaiseau, France",
+ Month = dec,
+ Year = 1993,
+ Abstract = "Semantic analysis of program numerical variables
+ consists in statically and automatically discovering
+ properties verified at execution time. Different sets of
+ properties (equality, inequality and congruence
+ relations) have already been studied. This thesis
+ proposes a generalization of some of the below
+ patterns. More specifically, the abstract interpretation
+ is used to design on the one hand a set of properties
+ generalizing intervals and cosets on $\mathbbb{Z}$ and
+ on the other hand, a generalization of trapezoids and
+ linear congruence equation systems on $\mathbbb{Z}^n$.
+ A rational abstraction of these properties is defined to
+ get safe approximations, with a polynomial complexity in
+ the number of the considered variables, of the integer
+ properties operators. Those analyses, more precise than
+ the combination of the analysis they come from in
+ general, allow to dynamically choose the kind of
+ properties (inequality or congruence relations) leading
+ to relevant information for the considered program. The
+ described relationnal analysis corresponds to numerous
+ patterns encountered in the field of scientific
+ computation. It is very well adapted to the analysis of
+ array indices variables and also to the abstract
+ description of integer arrays."
+}
+
+ at InProceedings{Mine01a,
+ Author = "A. Min\'e",
+ Title = "A New Numerical Abstract Domain Based on Difference-Bound Matrices",
+ Booktitle = "Proceedings of the 2nd Symposium on Programs as Data Objects
+ (PADO 2001)",
+ Address = "Aarhus, Denmark",
+ Editor = "O. Danvy and A. Filinski",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2053,
+ Pages = "155--172",
+ Year = 2001,
+ Abstract = "This paper presents a new numerical domain for static
+ analysis by abstract interpretation. This domain allows
+ us to represent invariants of the form and , where and
+ are variables values and is an integer or real
+ constant. Abstract elements are represented by
+ Difference-Bound Matrices, widely used by
+ model-checkers, but we had to design new operators to
+ meet the needs of abstract interpretation. The result is
+ a complete lattice of infinite height featuring
+ widening, narrowing and common transfer functions. We
+ focus on giving an efficient representation and
+ graph-based algorithms---where is the number of
+ variables---and claim that this domain always performs
+ more precisely than the well-known interval domain. To
+ illustrate the precision/cost tradeoff of this domain,
+ we have implemented simple abstract interpreters for toy
+ imperative and parallel languages which allowed us to
+ prove some non-trivial algorithms correct."
+}
+
+ at InProceedings{Mine01b,
+ Author = "A. Min\'e",
+ Title = "The Octagon Abstract Domain",
+ Booktitle = "Proceedings of the Eighth Working Conference
+ on Reverse Engineering (WCRE'01)",
+ Address = "Stuttgart, Germany",
+ Year = 2001,
+ Publisher = "IEEE Computer Society Press",
+ Pages = "310--319",
+ Abstract = "This article presents a new numerical abstract domain
+ for static analysis by abstract interpretation. It
+ extends our previously proposed DBM-based numerical
+ abstract domain and allows us to represent invariants of
+ the form ($\pm x \pm y \leq c$), where $x$ and $y$ are
+ program variables and $c$ is a real constant. We focus
+ on giving an efficient representation based on
+ Difference-Bound Matrices---$\mathcal{O}(n^2)$ memory
+ cost, where $n$ is the number of variables---and
+ graph-based algorithms for all common abstract
+ operators---$\mathcal{O}(n^3)$ time cost. This includes
+ a normal form algorithm to test equivalence of
+ representation and a widening operator to compute least
+ fixpoint approximations."
+}
+
+ at InProceedings{Mine02,
+ Author = "A. Min\'e",
+ Title = "A Few Graph-Based Relational Numerical Abstract Domains",
+ Booktitle = "Static Analysis:
+ Proceedings of the 9th International Symposium",
+ Address = "Madrid, Spain",
+ Editor = "M. V. Hermenegildo and G. Puebla",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2477,
+ ISBN = "3-540-44235-9",
+ Pages = "117--132",
+ Year = 2002,
+ Abstract = "This article presents the systematic design of a class
+ of relational numerical abstract domains from
+ non-relational ones. Constructed domains represent sets
+ of invariants of the form $(v_j-v_i\in C)$, where vj and
+ vi are two variables, and $C$ lives in an abstraction of
+ $\mathcal{P}(\mathbb {Z})$, $\mathcal{P}(\mathbb {Q})$,
+ or $\mathcal{P}(\mathbb {R})$. We will call this family
+ of domains weakly relational domains. The underlying
+ concept allowing this construction is an extension of
+ potential graphs and shortest-path closure algorithms in
+ exotic-like algebras. Example constructions are given
+ in order to retrieve well-known domains as well as new
+ ones. Such domains can then be used in the Abstract
+ Interpretation framework in order to design various
+ static analyses. A major benefit of this construction is
+ its modularity, allowing to quickly implement new
+ abstract domains from existing ones."
+}
+
+ at InProceedings{Mine04,
+ Author = "A. Min\'e",
+ Title = "Relational Abstract Domains for the Detection
+ of Floating-Point Run-Time Errors",
+ Booktitle = "Programming Languages and Systems: Proceedings of the 13th
+ European Symposium on Programming",
+ Address = "Barcelona, Spain",
+ Editor = "D. Schmidt",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2986,
+ ISBN = "3-540-213213-9",
+ Year = 2004,
+ Pages = "3--17",
+ Abstract = "We present a new idea to adapt relational abstract
+ domains to the analysis of IEEE 754-compliant
+ floating-point numbers in order to statically detect,
+ through Abstract Interpretation-based static analyses,
+ potential floating-point run-time exceptions such as
+ overflows or invalid operations. In order to take the
+ non-linearity of rounding into account, expressions are
+ modeled as linear forms with interval coefficients. We
+ show how to extend already existing numerical abstract
+ domains, such as the octagon abstract domain, to
+ efficiently abstract transfer functions based on
+ interval linear forms. We discuss specific fixpoint
+ stabilization techniques and give some experimental
+ results."
+}
+
+ at PhdThesis{Mine05th,
+ Author = "A. Min\'e",
+ Title = "Weakly Relational Numerical Abstract Domains",
+ School = "\'Ecole Polytechnique",
+ Address = "Paris, France",
+ Month = mar,
+ Year = 2005,
+ Abstract = "The goal of this thesis is to design techniques related
+ to the automatic analysis of computer programs. One major
+ application is the creation of tools to discover bugs
+ before they actually happen, an important goal in a time
+ when critical yet complex tasks are performed by computers.
+ We will work in the Abstract Interpretation framework, a
+ theory of sound approximations of program semantics. We
+ will focus, in particular, on numerical abstract domains
+ that specialise in the automatic discovery of properties
+ of the numerical variables of programs. In this thesis,
+ we introduce new numerical abstract domains: the zone
+ abstract domain (that can discover invariants of the form
+ $X - Y \leq c$), the zone congruence domain
+ ($X \equiv Y + a [b]$), and the octagon domain
+ ($\pm X \pm Y \leq c$), among others. These domains rely
+ on the classical notions of potential graphs, difference
+ bound matrices, and algorithms for the shortest-path
+ closure computation. They are in-between, in terms of
+ cost and precision, between nonrelational domains (such
+ as the interval domain), that are very imprecise, and
+ classical relational domains (such as the polyhedron
+ domain), that are very costly. We will call them ``weakly
+ relational''. We also introduce some methods to apply
+ relational domains to the analysis of floating-point
+ numbers, which was previously only possible using
+ imprecise, non-relational, domains. Finally, we introduce
+ the so-called linearisation and symbolic constant
+ propagation generic symbolic methods to enhance the
+ precision of any numerical domain, for only a slight
+ increase in cost. The techniques presented in this thesis
+ have been integrated within Astr\'ee, an analyser for
+ critical embedded avionic software, and were instrumental
+ in proving the absence of run-time errors in fly-by-wire
+ softwares used in Airbus A340 and A380 planes. Experimental
+ results show the usability of our methods of real-life
+ applications.",
+}
+
+ at InCollection{MotzkinRTT53,
+ Author = "T. S. Motzkin and H. Raiffa and G. L. Thompson and R. M. Thrall",
+ Title = "The Double Description Method",
+ Booktitle = "Contributions to the Theory of Games -- Volume II",
+ Editor = "H. W. Kuhn and A. W. Tucker",
+ Series = "Annals of Mathematics Studies",
+ Number = 28,
+ Publisher = "Princeton University Press",
+ Address = "Princeton, New Jersey",
+ Year = 1953,
+ Pages = "51--73",
+ Abstract = "The purpose of this paper is to present a computational
+ method for the determination of the value and of all
+ solutions of a two-person zero-sum game with a finite
+ number of pure strategies, and for the solution of
+ general finite systems of linear inequalities and
+ corresponding maximization problems."
+}
+
+ at InProceedings{NelsonO77,
+ Author = "G. Nelson and D. C. Oppen",
+ Title = "Fast Decision Algorithms based on {Union} and {Find}",
+ Booktitle = "Proceedings of the 18th Annual Symposium on Foundations
+ of Computer Science (FOCS'77)",
+ Address = "Providence, RI, USA",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "114--119",
+ Year = 1977,
+ Note = "The journal version of this paper is \cite{NelsonO80}"
+}
+
+ at Article{NelsonO80,
+ Author = "G. Nelson and D. C. Oppen",
+ Title = "Fast Decision Procedures Based on Congruence Closure",
+ Journal = "Journal of the ACM",
+ Publisher = "ACM Press",
+ Volume = 27,
+ Number = 2,
+ Pages = "356--364",
+ Year = 1980,
+ Note = "An earlier version of this paper is \cite{NelsonO77}",
+ Abstract = "The notion of the congruence closure of a relation on a
+ graph is defined and several algorithms for computing
+ it are surveyed. A simple proof is given that the
+ congruence closure algorithm provides a decision
+ procedure for the quantifier-free theory of equality. A
+ decision procedure is then given for the
+ quantifier-free theory of LISP list structure based on
+ the congruence closure algorithm. Both decision
+ procedures determine the satisfiability of a
+ conjunction of literals of length n in average time
+ $O(n \log n)$ using the fastest known congruence closure
+ algorithm. It is also shown that if the axiomatization
+ of the theory of list structure is changed slightly,
+ the problem of determining the satisfiability of a
+ conjunction of literals becomes NP-complete. The
+ decision procedures have been implemented in the
+ authors' simplifier for the Stanford Pascal Verifier."
+}
+
+ at Book{NemhauserW88,
+ Author = "G. L. Nemhauser and L. A. Wolsey",
+ Title = "Integer and Combinatorial Optimization",
+ Publisher = "John Wiley \& Sons",
+ Series = "Wiley Interscience Series
+ in Discrete Mathematics and Optimization",
+ Year = 1988
+}
+
+ at TechReport{NookalaR00,
+ Author = "S. P. K. Nookala and T. Risset",
+ Title = "A Library for {Z}-Polyhedral Operations",
+ Type = "\emph{Publication interne}",
+ Number = 1330,
+ Institution = "IRISA",
+ Address = "Campus de Beaulieu, Rennes, France",
+ Year = 2000,
+ Abstract = "Polyhedra are commonly used for representing iteration
+ domains of loop nests with unit stride: the iteration
+ domain of a loop is associated with the set of integer
+ points contained in a polyhedron. ${\cal Z}$-polyhedra
+ are natural extension of polyhedra, in the sense that
+ they represent iteration domains of loop nests with
+ non-unit stride (they are polyhedra intersected with
+ integral lattices). The polyhedral library (Polylib) has
+ been developed for computing on polyhedra, it is now
+ widely used in the automatic parallelization research
+ community. This report describes the implementation of
+ the extension of Polylib to ${\cal Z}$-polyhedra. We
+ describe algorithms used for computing on lattices and
+ ${\cal Z}$-polyhedra, and we provide technical
+ documentation for the ${\cal Z}$-polyhedral library
+ (data structures, functions available)."
+}
+
+ at Book{PapadimitriouS98,
+ Author = "C. H. Papadimitriou and K. Steiglitz",
+ Title = "Combinatorial Optimization: Algorithms and Complexity",
+ Edition = "Second",
+ Publisher = "Dover Publications",
+ ISBN = "0-486-40258-4",
+ Year = 1998,
+}
+
+ at Unpublished{Pratt77,
+ Author = "V. R. Pratt",
+ Title="Two Easy Theories whose Combination is Hard",
+ Note = "Memo sent to Nelson and Oppen
+ concerning a preprint of their paper \cite{NelsonO77}",
+ Month = sep,
+ Year = 1977,
+ Abstract = "We restrict attention to the validity problem for
+ unquantified disjunctions of literals (possibly negated
+ atomic formulae) over the domain of integers, or what is
+ just as good, the satisfiability problem for
+ unquantified conjunctions. When $=$ is the only
+ predicate symbol and all function symbols are left
+ uninterpreted, or when $\geq$ is the only predicate
+ symbol (taking its standard interpretation on the
+ integers) and the only terms are variables and integers,
+ then satisfiability is decidable in polynomial
+ time. However when $\geq$ and uninterpreted function
+ symbols are allowed to appear together, satisfiability
+ becomes an NP-complete problem. This combination of the
+ two theories can arise for example when reasoning about
+ arrays (the uninterpreted function symbols) and
+ subscript manipulation (where $\geq$ arises in
+ considering subscript bounds). These results are
+ unaffected by the presence of successor, which also
+ arises commonly in reasoning about subscript
+ manipulation."
+}
+
+ at Article{QuillereRW00,
+ Author = "F. Quiller{\'e} and S. V. Rajopadhye and D. Wilde",
+ Title = "Generation of Efficient Nested Loops from Polyhedra",
+ Journal = "International Journal of Parallel Programming",
+ Volume = 28,
+ Number = 5,
+ Year = 2000,
+ Pages = "469--498",
+ Abstract = "Automatic parallelization in the polyhedral model is based
+ on affine transformations from an original computation
+ domain (iteration space) to a target space-time domain,
+ often with a different transformation for each
+ variable. Code generation is an often ignored step in
+ this process that has a significant impact on the
+ quality of the final code. It involves making a
+ trade-off between code size and control code
+ simplification/optimization. Previous methods of doing
+ code generation are based on loop splitting, however
+ they have nonoptimal behavior when working on
+ parameterized programs. We present a general
+ parameterized method for code generation based on dual
+ representation of polyhedra. Our algorithm uses a simple
+ recursion on the dimensions of the domains, and enables
+ fine control over the tradeoff between code size and
+ control overhead."
+}
+
+ at TechReport{QuintonRR96,
+ Author = "P. Quinton and S. Rajopadhye and T. Risset",
+ Title = "On Manipulating {Z}-Polyhedra",
+ Year = 1996,
+ Month = jul,
+ Institution = "IRISA, Campus Universitaire de Bealieu, Rennes, France",
+ Number = 1016,
+ Abstract = "We address the problem of computation upon Z-Polyhedra
+ which are intersections of polyhedra and integral
+ lattices. We introduce a canonic representation for
+ Z-polyhedra which allow to perform comparisons and
+ transformations of Z-polyhedra with the help of a
+ computational kernal on polyhedra. This contribution is a
+ step towards the manipulation of images of polyhedra by
+ affine functions, and has application in the domain of
+ automatic parallelization and parallel VLSI synthesis.",
+}
+
+ at Article{QuintonRR97,
+ Author = "P. Quinton and S. Rajopadhye and T. Risset",
+ Title = "On Manipulating {Z}-Polyhedra Using a Canonic Representation",
+ Journal = "Parallel Processing Letters",
+ Publisher = "World Scientific Publishing Company",
+ Volume = 7,
+ Number = 2,
+ Pages = "181--194",
+ Year = 1997,
+ Abstract = "Z-Polyhedra are intersections of polyhedra and integral
+ lattices. They arise in the domain of automatic
+ parallelization and VLSI array synthesis. In this paper,
+ we address the problem of computation on Z-polyhedra.
+ We introduce a canonical representation for Z-polyhedra
+ which allows one to perform comparisons and transformations
+ of Z-polyhedra with the help of a computational kernal on
+ polyhedra.",
+}
+
+ at Inproceedings{RepsBL06,
+ Author = "T. W. Reps and G. Balakrishnan and J. Lim",
+ Title = "Intermediate-representation Recovery from Low-level Code",
+ Booktitle = "Proceedings of the 2006 ACM SIGPLAN Workshop on Partial
+ Evaluation and Semantics-based Program Manipulation",
+ Address = "Charleston, South Carolina, USA",
+ Editor = "J. Hatcliff and F. Tip",
+ Publisher = "ACM Press",
+ ISBN = "1-59593-196-1",
+ Year = 2006,
+ Pages = "100--111",
+ Abstract = "The goal of our work is to create tools that an analyst
+ can use to understand the workings of COTS
+ components, plugins, mobile code, and DLLs, as well
+ as memory snapshots of worms and virus-infected
+ code. This paper describes how static analysis
+ provides techniques that can be used to recover
+ intermediate representations that are similar to
+ those that can be created for a program written in a
+ high-level language."
+}
+
+ at MastersThesis{Ricci02th,
+ Author = "E. Ricci",
+ Title = "Rappresentazione e manipolazione di poliedri convessi
+ per l'analisi e la verifica di programmi",
+ Type = "Laurea dissertation",
+ School = "University of Parma",
+ Address = "Parma, Italy",
+ Month = jul,
+ Year = 2002,
+ Note = "In Italian",
+ URL = "http://bugseng.com/products/ppl/documentation/Ricci02th.pdf"
+}
+
+ at Inproceedings{SenS07,
+ Author = "R. Sen and Y. N. Srikant",
+ Title = "Executable Analysis using Abstract Interpretation with Circular
+ Linear Progressions",
+ Booktitle = "Proceedings of the 5th IEEE/ACM International Conference
+ on Formal Methods and Models for Co-Design (MEMOCODE 2007)",
+ Address = "Nice, France",
+ Publisher = "IEEE Computer Society Press",
+ Year = 2007,
+ Pages = "39--48",
+ Abstract = "We propose a new abstract domain for static analysis of
+ executable code. Concrete states are abstracted
+ using Circular Linear Progressions (CLPs). CLPs
+ model computations using a finite word length as is
+ seen in any real life processor. The finite
+ abstraction allows handling over-flow scenarios in a
+ natural and straight-forward manner. Abstract
+ transfer functions have been defined for a wide
+ range of operations which makes this domain easily
+ applicable for analyzing code for a wide range of
+ ISAs. CLPs combine the scalability of interval
+ domains with the discreteness of linear congruence
+ domains. We also present a novel, lightweight method
+ to track linear equality relations between static
+ objects that is used by the analysis to improve
+ precision. The analysis is efficient, the total
+ space and time overhead being quadratic in the
+ number of static objects being tracked."
+}
+
+ at Techreport{SenS07TR,
+ Author = "R. Sen and Y. N. Srikant",
+ Title = "Executable Analysis with Circular Linear Progressions",
+ Number = "IISc-CSA-TR-2007-3",
+ Institution = "Department of Computer Science and Automation,
+ Indian Institute of Science",
+ Address = "Bangalore, India",
+ Year = 2007,
+ Abstract = "We propose a new abstract domain for static analysis of
+ executable code. Concrete state is abstracted using
+ Circular Linear Progressions (CLPs). CLPs model
+ computations using a finite word length as is seen in
+ any real life processor. The finite abstraction allows
+ handling overflow scenarios in a natural and
+ straight-forward manner. Abstract transfer functions
+ have been defined for a wide range of operations which
+ makes this domain easily applicable for analysing code
+ for a wide range of ISAs. CLPs combine the scalability
+ of interval domains with the discreteness of linear
+ congruence domains. We also present a novel, lightweight
+ method to track linear equality relations between static
+ objects that is used by the analysis to improve
+ precision. The analysis is efficient, the total space
+ and time overhead being quadratic in the number of
+ static objects being tracked."
+}
+
+ at Article{Shostak81,
+ Author = "R. E. Shostak",
+ Title = "Deciding Linear Inequalities by Computing Loop Residues",
+ Journal = "Journal of the ACM",
+ Publisher = "ACM Press",
+ Volume = 28,
+ Number = 4,
+ Pages = "769--779",
+ Year = 1981,
+ Abstract = "V.~R.~Pratt has shown that the real and integer
+ feasibility of sets of linear inequalities of the form
+ $x \leq y + c$ can be decided quickly by examining the
+ loops in certain graphs. Pratt's method is generalized,
+ first to real feasibility of inequalities in two
+ variables and arbitrary coefficients, and ultimately to
+ real feasibility of arbitrary sets of linear
+ inequalities. The method is well suited to applications
+ in program verification."
+}
+
+ at Book{Schrijver99,
+ Author = "A. Schrijver",
+ Title = "Theory of Linear and Integer Programming",
+ Publisher = "John Wiley \& Sons",
+ Series = "Wiley Interscience Series
+ in Discrete Mathematics and Optimization",
+ ISBN = "0-471-98232-6",
+ Year = 1999
+}
+
+ at InProceedings{SimonK07,
+ Author = "A. Simon and A. King",
+ Title = "Taming the Wrapping of Integer Arithmetic",
+ Booktitle = "Static Analysis:
+ Proceedings of the 14th International Symposium",
+ Address = "Kongens Lyngby, Denmark",
+ Editor = "H. {Riis Nielson} and G. Fil{\'e}",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4634,
+ ISBN = "978-3-540-74060-5",
+ Year = 2007,
+ Pages = "121--136",
+ Abstract = "Variables in programs are usually confined to a fixed
+ number of bits and results that require more bits
+ are truncated. Due to the use of 32-bit and 64-bit
+ variables, inadvertent overflows are rare. However,
+ a sound static analysis must reason about
+ overflowing calculations and conversions between
+ unsigned and signed integers; the latter remaining a
+ common source of subtle programming errors. Rather
+ than polluting an analysis with the low-level
+ details of modelling two's complement wrapping
+ behaviour, this paper presents a computationally
+ light-weight solution based on polyhedral analysis
+ which eliminates the need to check for wrapping when
+ evaluating most (particularly linear) assignments."
+}
+
+ at Article{Srivastava93,
+ Author = "D. Srivastava",
+ Title = "Subsumption and Indexing in Constraint Query Languages
+ with Linear Arithmetic Constraints",
+ Journal = "Annals of Mathematics and Artificial Intelligence",
+ Volume = 8,
+ Number = "3--4",
+ Pages = "315--343",
+ Year = 1993,
+ Abstract = "Bottom-up evaluation of a program-query pair in a
+ constraint query language (CQL) starts with the facts in
+ the database and repeatedly applies the rules of the
+ program, in iterations, to compute new facts, until we
+ have reached a fixpoint. Checking if a fixpoint has
+ been reached amounts to checking if any ``new'' facts
+ were computed in an iteration. Such a check also
+ enhances efficiency in that subsumed facts can be
+ discarded, and not be used to make any further
+ derivations in subsequent iterations, if we use
+ Semi-naive evaluation.
+ We show that the problem of subsumption in CQLs with
+ linear arithmetic constraints is co-NP complete, and
+ present a deterministic algorithm, based on the divide
+ and conquer strategy, for this problem. We also
+ identify polynomial-time sufficient conditions for
+ subsumption and non-subsumption in CQLs with linear
+ arithmetic constraints. We adapt indexing strategies
+ from spatial databases for efficiently indexing facts in
+ such a CQL: such indexing is crucial for performance in
+ the presence of large databases. Based on a recent
+ algorithm by Lassez and Lassez [LL] for quantifier
+ elimination, we present an incremental version of the
+ algorithm to check for subsumption in CQLs with linear
+ arithmetic constraints.",
+ URL = "http://www.research.att.com/~divesh/papers/s93-cqlsubsum-journal.ps"
+}
+
+ at Book{StoerW70,
+ Author = "J. Stoer and C. Witzgall",
+ Title = "Convexity and Optimization in Finite Dimensions {I}",
+ Publisher = "Springer-Verlag, Berlin",
+ Year = 1970
+}
+
+ at Book{Warren03,
+ Author = "Warren, Jr., H. S.",
+ Title = "Hacker's Delight",
+ Publisher = "Addison-Wesley Longman Publishing Co., Inc.",
+ Address = "Boston, MA, USA",
+ Year = 2003,
+ ISBN = "0-201-91465-4",
+ }
+
+ at MastersThesis{Wilde93th,
+ Author = "D. K. Wilde",
+ Title = "A Library for Doing Polyhedral Operations",
+ Type = "{Master's thesis}",
+ School = "Oregon State University",
+ Address = "Corvallis, Oregon",
+ Month = dec,
+ Year = 1993,
+ Note = "Also published as IRISA \emph{Publication interne} 785,
+ Rennes, France, 1993",
+ Abstract = "Polyhedra are geometric representations of linear
+ systems of equations and inequalities. Since polyhedra
+ are used to represent the iteration domains of nested
+ loop programs, procedures for operating on polyhedra are
+ useful for doing loop transformations and other program
+ restructuring transformations which are needed in
+ parallelizing compilers. Thus a need for a library of
+ polyhedral operations has recently been recognized in
+ the parallelizing compiler community. Polyhedra are
+ also used in the definition of domains of variables in
+ systems of affine recurrence equations (SARE). {\sc
+ Alpha} is a language which is based on the SARE
+ formalism in which all variables are declared over
+ finite unions of polyhedra. This report describes a
+ library of polyhedral functions which was developed to
+ support the {\sc Alpha} language environment, and which
+ is general enough to satisfy the needs of researchers
+ doing parallelizing compilers. This report describes
+ the data structures used to represent domains, gives
+ motivations for the major design decisions, and presents
+ the algorithms used for doing polyhedral operations.
+ This library has been written and tested, and has been
+ in use since the beginning of 1993 by research
+ facilities in Europe and Canada. The library is freely
+ distributed by ftp.",
+ URL = "http://www.irisa.fr/polylib/document/Polylib.ps"
+}
+
+ at Article{Weyl35,
+ Author = "H. Weyl",
+ Title = "Elementare Theorie der konvexen Polyeder",
+ Journal = "Commentarii Mathematici Helvetici",
+ Publisher = "{Birkh\"auser} Publishing Ltd., Basel, Switzerland",
+ Volume = 7,
+ Pages = "290--306",
+ Year = 1935,
+ Note = "English translation in \cite{Weyl50}"
+}
+
+ at InCollection{Weyl50,
+ Author = "H. Weyl",
+ Title = "The Elementary Theory of Convex Polyhedra",
+ Booktitle = "Contributions to the Theory of Games -- Volume I",
+ Editor = "H. W. Kuhn",
+ Series = "Annals of Mathematics Studies",
+ Number = 24,
+ Publisher = "Princeton University Press",
+ Address = "Princeton, New Jersey",
+ Year = 1950,
+ Pages = "3--18",
+ Note = "Translated from \cite{Weyl35} by H. W. Kuhn"
+}
+
+
+==============================================================================
+
+<h2>ODC Attribution License (ODC-By)</h2>
+
+### Preamble
+
+The Open Data Commons Attribution License is a license agreement
+intended to allow users to freely share, modify, and use this Database
+subject only to the attribution requirements set out in Section 4.
+
+Databases can contain a wide variety of types of content (images,
+audiovisual material, and sounds all in the same database, for example),
+and so this license only governs the rights over the Database, and not
+the contents of the Database individually. Licensors may therefore wish
+to use this license together with another license for the contents.
+
+Sometimes the contents of a database, or the database itself, can be
+covered by other rights not addressed here (such as private contracts,
+trademark over the name, or privacy rights / data protection rights
+over information in the contents), and so you are advised that you may
+have to consult other documents or clear other rights before doing
+activities not covered by this License.
+
+------
+
+The Licensor (as defined below)
+
+and
+
+You (as defined below)
+
+agree as follows:
+
+### 1.0 Definitions of Capitalised Words
+
+"Collective Database" - Means this Database in unmodified form as part
+of a collection of independent databases in themselves that together are
+assembled into a collective whole. A work that constitutes a Collective
+Database will not be considered a Derivative Database.
+
+"Convey" - As a verb, means Using the Database, a Derivative Database,
+or the Database as part of a Collective Database in any way that enables
+a Person to make or receive copies of the Database or a Derivative
+Database. Conveying does not include interaction with a user through a
+computer network, or creating and Using a Produced Work, where no
+transfer of a copy of the Database or a Derivative Database occurs.
+
+"Contents" - The contents of this Database, which includes the
+information, independent works, or other material collected into the
+Database. For example, the contents of the Database could be factual
+data or works such as images, audiovisual material, text, or sounds.
+
+"Database" - A collection of material (the Contents) arranged in a
+systematic or methodical way and individually accessible by electronic
+or other means offered under the terms of this License.
+
+"Database Directive" - Means Directive 96/9/EC of the European
+Parliament and of the Council of 11 March 1996 on the legal protection
+of databases, as amended or succeeded.
+
+"Database Right" - Means rights resulting from the Chapter III ("sui
+generis") rights in the Database Directive (as amended and as transposed
+by member states), which includes the Extraction and Re-utilisation of
+the whole or a Substantial part of the Contents, as well as any similar
+rights available in the relevant jurisdiction under Section 10.4.
+
+"Derivative Database" - Means a database based upon the Database, and
+includes any translation, adaptation, arrangement, modification, or any
+other alteration of the Database or of a Substantial part of the
+Contents. This includes, but is not limited to, Extracting or
+Re-utilising the whole or a Substantial part of the Contents in a new
+Database.
+
+"Extraction" - Means the permanent or temporary transfer of all or a
+Substantial part of the Contents to another medium by any means or in
+any form.
+
+"License" - Means this license agreement and is both a license of rights
+such as copyright and Database Rights and an agreement in contract.
+
+"Licensor" - Means the Person that offers the Database under the terms
+of this License.
+
+"Person" - Means a natural or legal person or a body of persons
+corporate or incorporate.
+
+"Produced Work" - a work (such as an image, audiovisual material, text,
+or sounds) resulting from using the whole or a Substantial part of the
+Contents (via a search or other query) from this Database, a Derivative
+Database, or this Database as part of a Collective Database.
+
+"Publicly" - means to Persons other than You or under Your control by
+either more than 50% ownership or by the power to direct their
+activities (such as contracting with an independent consultant).
+
+"Re-utilisation" - means any form of making available to the public all
+or a Substantial part of the Contents by the distribution of copies, by
+renting, by online or other forms of transmission.
+
+"Substantial" - Means substantial in terms of quantity or quality or a
+combination of both. The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may amount to the
+Extraction or Re-utilisation of a Substantial part of the Contents.
+
+"Use" - As a verb, means doing any act that is restricted by copyright
+or Database Rights whether in the original medium or any other; and
+includes without limitation distributing, copying, publicly performing,
+publicly displaying, and preparing derivative works of the Database, as
+well as modifying the Database as may be technically necessary to use it
+in a different mode or format.
+
+"You" - Means a Person exercising rights under this License who has not
+previously violated the terms of this License with respect to the
+Database, or who has received express permission from the Licensor to
+exercise rights under this License despite a previous violation.
+
+Words in the singular include the plural and vice versa.
+
+### 2.0 What this License covers
+
+2.1. Legal effect of this document. This License is:
+
+ a. A license of applicable copyright and neighbouring rights;
+
+ b. A license of the Database Right; and
+
+ c. An agreement in contract between You and the Licensor.
+
+2.2 Legal rights covered. This License covers the legal rights in the
+Database, including:
+
+ a. Copyright. Any copyright or neighbouring rights in the Database.
+ The copyright licensed includes any individual elements of the
+ Database, but does not cover the copyright over the Contents
+ independent of this Database. See Section 2.4 for details. Copyright
+ law varies between jurisdictions, but is likely to cover: the Database
+ model or schema, which is the structure, arrangement, and organisation
+ of the Database, and can also include the Database tables and table
+ indexes; the data entry and output sheets; and the Field names of
+ Contents stored in the Database;
+
+ b. Database Rights. Database Rights only extend to the Extraction and
+ Re-utilisation of the whole or a Substantial part of the Contents.
+ Database Rights can apply even when there is no copyright over the
+ Database. Database Rights can also apply when the Contents are removed
+ from the Database and are selected and arranged in a way that would
+ not infringe any applicable copyright; and
+
+ c. Contract. This is an agreement between You and the Licensor for
+ access to the Database. In return you agree to certain conditions of
+ use on this access as outlined in this License.
+
+2.3 Rights not covered.
+
+ a. This License does not apply to computer programs used in the making
+ or operation of the Database;
+
+ b. This License does not cover any patents over the Contents or the
+ Database; and
+
+ c. This License does not cover any trademarks associated with the
+ Database.
+
+2.4 Relationship to Contents in the Database. The individual items of
+the Contents contained in this Database may be covered by other rights,
+including copyright, patent, data protection, privacy, or personality
+rights, and this License does not cover any rights (other than Database
+Rights or in contract) in individual Contents contained in the Database.
+For example, if used on a Database of images (the Contents), this
+License would not apply to copyright over individual images, which could
+have their own separate licenses, or one single license covering all of
+the rights over the images.
+
+### 3.0 Rights granted
+
+3.1 Subject to the terms and conditions of this License, the Licensor
+grants to You a worldwide, royalty-free, non-exclusive, terminable (but
+only under Section 9) license to Use the Database for the duration of
+any applicable copyright and Database Rights. These rights explicitly
+include commercial use, and do not exclude any field of endeavour. To
+the extent possible in the relevant jurisdiction, these rights may be
+exercised in all media and formats whether now known or created in the
+future.
+
+The rights granted cover, for example:
+
+ a. Extraction and Re-utilisation of the whole or a Substantial part of
+ the Contents;
+
+ b. Creation of Derivative Databases;
+
+ c. Creation of Collective Databases;
+
+ d. Creation of temporary or permanent reproductions by any means and
+ in any form, in whole or in part, including of any Derivative
+ Databases or as a part of Collective Databases; and
+
+ e. Distribution, communication, display, lending, making available, or
+ performance to the public by any means and in any form, in whole or in
+ part, including of any Derivative Database or as a part of Collective
+ Databases.
+
+3.2 Compulsory license schemes. For the avoidance of doubt:
+
+ a. Non-waivable compulsory license schemes. In those jurisdictions in
+ which the right to collect royalties through any statutory or
+ compulsory licensing scheme cannot be waived, the Licensor reserves
+ the exclusive right to collect such royalties for any exercise by You
+ of the rights granted under this License;
+
+ b. Waivable compulsory license schemes. In those jurisdictions in
+ which the right to collect royalties through any statutory or
+ compulsory licensing scheme can be waived, the Licensor waives the
+ exclusive right to collect such royalties for any exercise by You of
+ the rights granted under this License; and,
+
+ c. Voluntary license schemes. The Licensor waives the right to collect
+ royalties, whether individually or, in the event that the Licensor is
+ a member of a collecting society that administers voluntary licensing
+ schemes, via that society, from any exercise by You of the rights
+ granted under this License.
+
+3.3 The right to release the Database under different terms, or to stop
+distributing or making available the Database, is reserved. Note that
+this Database may be multiple-licensed, and so You may have the choice
+of using alternative licenses for this Database. Subject to Section
+10.4, all other rights not expressly granted by Licensor are reserved.
+
+### 4.0 Conditions of Use
+
+4.1 The rights granted in Section 3 above are expressly made subject to
+Your complying with the following conditions of use. These are important
+conditions of this License, and if You fail to follow them, You will be
+in material breach of its terms.
+
+4.2 Notices. If You Publicly Convey this Database, any Derivative
+Database, or the Database as part of a Collective Database, then You
+must:
+
+ a. Do so only under the terms of this License;
+
+ b. Include a copy of this License or its Uniform Resource Identifier (URI)
+ with the Database or Derivative Database, including both in the
+ Database or Derivative Database and in any relevant documentation;
+
+ c. Keep intact any copyright or Database Right notices and notices
+ that refer to this License; and
+
+ d. If it is not possible to put the required notices in a particular
+ file due to its structure, then You must include the notices in a
+ location (such as a relevant directory) where users would be likely to
+ look for it.
+
+4.3 Notice for using output (Contents). Creating and Using a Produced
+Work does not require the notice in Section 4.2. However, if you
+Publicly Use a Produced Work, You must include a notice associated with
+the Produced Work reasonably calculated to make any Person that uses,
+views, accesses, interacts with, or is otherwise exposed to the Produced
+Work aware that Content was obtained from the Database, Derivative
+Database, or the Database as part of a Collective Database, and that it
+is available under this License.
+
+ a. Example notice. The following text will satisfy notice under
+ Section 4.3:
+
+ Contains information from DATABASE NAME which is made available
+ under the ODC Attribution License.
+
+DATABASE NAME should be replaced with the name of the Database and a
+hyperlink to the location of the Database. "ODC Attribution License"
+should contain a hyperlink to the URI of the text of this License. If
+hyperlinks are not possible, You should include the plain text of the
+required URI's with the above notice.
+
+4.4 Licensing of others. You may not sublicense the Database. Each time
+You communicate the Database, the whole or Substantial part of the
+Contents, or any Derivative Database to anyone else in any way, the
+Licensor offers to the recipient a license to the Database on the same
+terms and conditions as this License. You are not responsible for
+enforcing compliance by third parties with this License, but You may
+enforce any rights that You have over a Derivative Database. You are
+solely responsible for any modifications of a Derivative Database made
+by You or another Person at Your direction. You may not impose any
+further restrictions on the exercise of the rights granted or affirmed
+under this License.
+
+### 5.0 Moral rights
+
+5.1 Moral rights. This section covers moral rights, including any rights
+to be identified as the author of the Database or to object to treatment
+that would otherwise prejudice the author's honour and reputation, or
+any other derogatory treatment:
+
+ a. For jurisdictions allowing waiver of moral rights, Licensor waives
+ all moral rights that Licensor may have in the Database to the fullest
+ extent possible by the law of the relevant jurisdiction under Section
+ 10.4;
+
+ b. If waiver of moral rights under Section 5.1 a in the relevant
+ jurisdiction is not possible, Licensor agrees not to assert any moral
+ rights over the Database and waives all claims in moral rights to the
+ fullest extent possible by the law of the relevant jurisdiction under
+ Section 10.4; and
+
+ c. For jurisdictions not allowing waiver or an agreement not to assert
+ moral rights under Section 5.1 a and b, the author may retain their
+ moral rights over certain aspects of the Database.
+
+Please note that some jurisdictions do not allow for the waiver of moral
+rights, and so moral rights may still subsist over the Database in some
+jurisdictions.
+
+### 6.0 Fair dealing, Database exceptions, and other rights not affected
+
+6.1 This License does not affect any rights that You or anyone else may
+independently have under any applicable law to make any use of this
+Database, including without limitation:
+
+ a. Exceptions to the Database Right including: Extraction of Contents
+ from non-electronic Databases for private purposes, Extraction for
+ purposes of illustration for teaching or scientific research, and
+ Extraction or Re-utilisation for public security or an administrative
+ or judicial procedure.
+
+ b. Fair dealing, fair use, or any other legally recognised limitation
+ or exception to infringement of copyright or other applicable laws.
+
+6.2 This License does not affect any rights of lawful users to Extract
+and Re-utilise insubstantial parts of the Contents, evaluated
+quantitatively or qualitatively, for any purposes whatsoever, including
+creating a Derivative Database (subject to other rights over the
+Contents, see Section 2.4). The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may however amount
+to the Extraction or Re-utilisation of a Substantial part of the
+Contents.
+
+### 7.0 Warranties and Disclaimer
+
+7.1 The Database is licensed by the Licensor "as is" and without any
+warranty of any kind, either express, implied, or arising by statute,
+custom, course of dealing, or trade usage. Licensor specifically
+disclaims any and all implied warranties or conditions of title,
+non-infringement, accuracy or completeness, the presence or absence of
+errors, fitness for a particular purpose, merchantability, or otherwise.
+Some jurisdictions do not allow the exclusion of implied warranties, so
+this exclusion may not apply to You.
+
+### 8.0 Limitation of liability
+
+8.1 Subject to any liability that may not be excluded or limited by law,
+the Licensor is not liable for, and expressly excludes, all liability
+for loss or damage however and whenever caused to anyone by any use
+under this License, whether by You or by anyone else, and whether caused
+by any fault on the part of the Licensor or not. This exclusion of
+liability includes, but is not limited to, any special, incidental,
+consequential, punitive, or exemplary damages such as loss of revenue,
+data, anticipated profits, and lost business. This exclusion applies
+even if the Licensor has been advised of the possibility of such
+damages.
+
+8.2 If liability may not be excluded by law, it is limited to actual and
+direct financial loss to the extent it is caused by proved negligence on
+the part of the Licensor.
+
+### 9.0 Termination of Your rights under this License
+
+9.1 Any breach by You of the terms and conditions of this License
+automatically terminates this License with immediate effect and without
+notice to You. For the avoidance of doubt, Persons who have received the
+Database, the whole or a Substantial part of the Contents, Derivative
+Databases, or the Database as part of a Collective Database from You
+under this License will not have their licenses terminated provided
+their use is in full compliance with this License or a license granted
+under Section 4.8 of this License. Sections 1, 2, 7, 8, 9 and 10 will
+survive any termination of this License.
+
+9.2 If You are not in breach of the terms of this License, the Licensor
+will not terminate Your rights under it.
+
+9.3 Unless terminated under Section 9.1, this License is granted to You
+for the duration of applicable rights in the Database.
+
+9.4 Reinstatement of rights. If you cease any breach of the terms and
+conditions of this License, then your full rights under this License
+will be reinstated:
+
+ a. Provisionally and subject to permanent termination until the 60th
+ day after cessation of breach;
+
+ b. Permanently on the 60th day after cessation of breach unless
+ otherwise reasonably notified by the Licensor; or
+
+ c. Permanently if reasonably notified by the Licensor of the
+ violation, this is the first time You have received notice of
+ violation of this License from the Licensor, and You cure the
+ violation prior to 30 days after your receipt of the notice.
+
+9.5 Notwithstanding the above, Licensor reserves the right to release
+the Database under different license terms or to stop distributing or
+making available the Database. Releasing the Database under different
+license terms or stopping the distribution of the Database will not
+withdraw this License (or any other license that has been, or is
+required to be, granted under the terms of this License), and this
+License will continue in full force and effect unless terminated as
+stated above.
+
+### 10.0 General
+
+10.1 If any provision of this License is held to be invalid or
+unenforceable, that must not affect the validity or enforceability of
+the remainder of the terms and conditions of this License and each
+remaining provision of this License shall be valid and enforced to the
+fullest extent permitted by law.
+
+10.2 This License is the entire agreement between the parties with
+respect to the rights granted here over the Database. It replaces any
+earlier understandings, agreements or representations with respect to
+the Database.
+
+10.3 If You are in breach of the terms of this License, You will not be
+entitled to rely on the terms of this License or to complain of any
+breach by the Licensor.
+
+10.4 Choice of law. This License takes effect in and will be governed by
+the laws of the relevant jurisdiction in which the License terms are
+sought to be enforced. If the standard suite of rights granted under
+applicable copyright law and Database Rights in the relevant
+jurisdiction includes additional rights not granted under this License,
+these additional rights are granted in this License in order to meet the
+terms of this License.
diff --git a/doc/ppl.sty b/doc/ppl.sty
new file mode 100644
index 0000000..369a0bc
--- /dev/null
+++ b/doc/ppl.sty
@@ -0,0 +1,200 @@
+%% LaTeX package providing macros for typesetting the PPL manuals.
+%% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+%% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%%
+%% This file is part of the Parma Polyhedra Library (PPL).
+%%
+%% The PPL is free software; you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% The PPL is distributed in the hope that it will be useful, but WITHOUT
+%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software Foundation,
+%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%%
+%% For the most up-to-date information see the Parma Polyhedra Library
+%% site: http://bugseng.com/products/ppl/ .
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ppl}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+\RequirePackage{stmaryrd}
+
+%% Calligraphic alphabet
+\newcommand*{\cA}{\ensuremath{\mathcal{A}}}
+\newcommand*{\cB}{\ensuremath{\mathcal{B}}}
+\newcommand*{\cC}{\ensuremath{\mathcal{C}}}
+\newcommand*{\cD}{\ensuremath{\mathcal{D}}}
+\newcommand*{\cE}{\ensuremath{\mathcal{E}}}
+\newcommand*{\cF}{\ensuremath{\mathcal{F}}}
+\newcommand*{\cG}{\ensuremath{\mathcal{G}}}
+\newcommand*{\cH}{\ensuremath{\mathcal{H}}}
+\newcommand*{\cI}{\ensuremath{\mathcal{I}}}
+\newcommand*{\cJ}{\ensuremath{\mathcal{J}}}
+\newcommand*{\cK}{\ensuremath{\mathcal{K}}}
+\newcommand*{\cL}{\ensuremath{\mathcal{L}}}
+\newcommand*{\cM}{\ensuremath{\mathcal{M}}}
+\newcommand*{\cN}{\ensuremath{\mathcal{N}}}
+\newcommand*{\cO}{\ensuremath{\mathcal{O}}}
+\newcommand*{\cP}{\ensuremath{\mathcal{P}}}
+\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}}
+\newcommand*{\cR}{\ensuremath{\mathcal{R}}}
+\newcommand*{\cS}{\ensuremath{\mathcal{S}}}
+\newcommand*{\cT}{\ensuremath{\mathcal{T}}}
+\newcommand*{\cU}{\ensuremath{\mathcal{U}}}
+\newcommand*{\cV}{\ensuremath{\mathcal{V}}}
+\newcommand*{\cW}{\ensuremath{\mathcal{W}}}
+\newcommand*{\cX}{\ensuremath{\mathcal{X}}}
+\newcommand*{\cY}{\ensuremath{\mathcal{Y}}}
+\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}}
+
+%% Special letters denoting sets and algebras.
+\providecommand*{\Nset}{\mathbb{N}} % Naturals
+\newcommand*{\extNset}{\mathbb{N}_\infty} % Extended naturals
+\providecommand*{\Oset}{\mathbb{O}} % Ordinals
+\providecommand*{\Qset}{\mathbb{Q}} % Rationals
+\providecommand*{\Rset}{\mathbb{R}} % Reals
+\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}}
+ % Non-negative reals
+\newcommand*{\extRset}{\Rset_\infty} % Extended reals
+\providecommand*{\Zset}{\mathbb{Z}} % Integers
+\providecommand*{\CPset}{\mathbb{CP}} % Closed polyhedra
+\providecommand*{\Pset}{\mathbb{P}} % (NNC) polyhedra
+\providecommand*{\Sset}{\mathbb{S}} % Reals or rationals
+
+%% Grid notation
+\providecommand*{\Gset}{\mathbb{G}} % Grid
+\providecommand*{\cg}{\mathord{\mathrm{cg}}} % Congruence
+\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits}
+ % Grid from congruence system
+\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits}
+ % Grid from generator system
+
+%% Function notation
+\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3}
+\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3}
+
+%% Relation notation
+\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3}
+
+%% Set theory.
+\renewcommand*{\emptyset}{\mathord{\varnothing}}
+\newcommand*{\sseq}{\subseteq}
+\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}}
+\newcommand*{\sslt}{\subset}
+\newcommand*{\Sseq}{\supseteq}
+\newcommand*{\Ssgt}{\supset}
+\newcommand*{\inters}{\cap}
+\newcommand*{\setdiff}{\setminus}
+\newcommand*{\union}{\cup}
+\newcommand*{\card}{\mathop{\#}\nolimits}
+\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2}
+ \left\{\,#1 \,\left|\,
+ \begin{array}{@{}l@{}}#2\end{array}
+ \right. \,\right\}}}
+\newcommand*{\meet}{\mathbin{\otimes}}
+\newcommand*{\join}{\mathbin{\oplus}}
+
+%% Logic notation.
+\newcommand*{\entails}{\mathrel{\vdash}}
+\newcommand*{\sentails}{\mathrel{\Vdash}}
+\newcommand*{\Nentails}{\mathrel{\nvdash}}
+\newcommand*{\Nsentails}{\mathrel{\nVdash}}
+\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}}
+\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}}
+\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}}
+\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}}
+\newcommand*{\bigland}{\mathop{\bigwedge}\limits}
+\newcommand*{\biglor}{\mathop{\bigvee}\limits}
+\newcommand*{\piff}{\mathrel{\leftrightarrow}}
+\newcommand*{\pimplies}{\mathrel{\rightarrow}}
+\newcommand*{\pimplied}{\mathrel{\leftarrow}}
+\newcommand*{\st}{\mathrel{.}}
+\newcommand*{\itc}{\mathrel{:}}
+
+%% Integer division and reminder binary operators.
+\newcommand*{\bdiv}{\mathbin{\mathrm{div}}}
+\newcommand*{\brem}{\mathbin{\mathrm{rem}}}
+
+
+%% True and false
+\newcommand*{\false}{\mathord{\textbf{\textup{0}}}}
+\newcommand*{\true}{\mathord{\textbf{\textup{1}}}}
+
+%% Things that hold by definition.
+\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}}
+\newcommand*{\defeq}{\defrel{=}}
+\newcommand*{\defiff}{\defrel{\Longleftrightarrow}}
+
+% Arbitrary relation symbol.
+\newcommand*{\relsym}{\mathrel{\bowtie}}
+\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}}
+
+% Absolute value.
+\newcommand*{\abs}[1]{\lvert #1 \rvert}
+
+% Vectors.
+\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+
+\newcommand*{\vect}[1]{\vec{#1}}
+
+% Matrix functions.
+\newcommand*{\transpose}{\mathrm{T}}
+
+% Hulls.
+\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}}
+\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}}
+\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}}
+\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}}
+\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}}
+\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}}
+\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}}
+
+% Polyhedron functions.
+\newcommand*{\prank}{\mathop{\mathrm{rank}}}
+\newcommand*{\pdim}{\mathop{\mathrm{dim}}}
+\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}}
+\newcommand*{\cone}{\mathop{\mathrm{cone}}}
+
+% Widening
+\newcommand*{\widen}{\mathrel{\nabla}}
+
+% Powerset notation
+\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits}
+\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits}
+\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits}
+
+\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits}
+\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)}
+
+\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}}
+\newcommand*{\entailsP}{\entailss{\smallP}}
+\newcommand*{\NentailsP}{\Nentailss{\smallP}}
+\newcommand*{\sentailsP}{\sentailss{\smallP}}
+
+
+% Interval floating point arithmetics
+
+\newcommand*{\asifp}{\oplus^{\#}}
+\newcommand*{\adifp}{\ominus^{\#}}
+\newcommand*{\adivifp}{\oslash^{\#}}
+\newcommand*{\amifp}{\otimes^{\#}}
+
+% Linear form arithmetics
+
+\newcommand*{\aslf}{\boxplus^{\#}}
+\newcommand*{\adlf}{\boxminus^{\#}}
+\newcommand*{\adivlf}{\boxslash^{\#}}
+\newcommand*{\amlf}{\boxtimes^{\#}}
+\newcommand*{\linexpr}[1]{\llparenthesis #1 \rrparenthesis}
+\newcommand*{\linexprenv}[3]{\llparenthesis #1 \rrparenthesis \left \llbracket #2, #3 \right \rrbracket}
diff --git a/doc/ppl_citations.bib b/doc/ppl_citations.bib
new file mode 100644
index 0000000..9b11cbe
--- /dev/null
+++ b/doc/ppl_citations.bib
@@ -0,0 +1,4272 @@
+A bibliography of papers that cite the Parma Polyhedra Library
+and/or the works that defined the theory upon which it is based.
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara AT cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This BibTeX database is made available under the Open Data Commons
+Attribution License (ODC-By) v1.0, which is reproduced below for your
+convenience and available at http://opendatacommons.org/licenses/by/1.0/
+Summarizing:
+
+- You are free: to copy, distribute and use the database; to produce
+ works from the database; to modify, transform and build upon the database.
+
+- You must attribute any public use of the database, or works produced
+ from the database, in the manner specified in the license. For any
+ use or redistribution of the database, or works produced from it,
+ you must make clear to others the license of the database and keep
+ intact any notices on the original database.
+
+
+ at Inproceedings{AlbertACGPZ08,
+ Author = "E. Albert and P. Arenas and M. Codish and S. Genaim
+ and G. Puebla and D. Zanardini",
+ Title = "Termination Analysis of {Java} Bytecode",
+ Booktitle = "Proceedings of the 10th IFIP WG 6.1 International Conference
+ on Formal Methods for Open Object-Based Distributed Systems
+ (FMOODS 2008)",
+ Address = "Oslo, Norway",
+ Editor = "G. Barthe and F. S. de Boer",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5051,
+ Year = 2008,
+ Pages = "2--18",
+ ISBN = "978-3-540-68862-4",
+ Abstract = "Termination analysis has received considerable
+ attention, traditionally in the context of declarative
+ programming, and recently also for imperative
+ languages. In existing approaches, termination is
+ performed on source programs. However, there are many
+ situations, including mobile code, where only the
+ compiled code is available. In this work we present an
+ automatic termination analysis for sequential Java
+ Bytecode programs. Such analysis presents all of the
+ challenges of analyzing a low-level language as well as
+ those introduced by object-oriented languages.
+ Interestingly, given a bytecode program, we produce a
+ \emph{constraint logic program}, CLP, whose termination
+ entails termination of the bytecode program. This allows
+ applying the large body of work in termination of CLP
+ programs to termination of Java bytecode. A prototype
+ analyzer is described and initial experimentation is
+ reported."
+}
+
+ at Article{AlbertACGPZ12,
+ Author = "E. Albert and P. Arenas and S. Genaim and G. Puebla
+ and D. Zanardini",
+ Title = "Cost Analysis of Object-Oriented Bytecode Programs",
+ Journal = "Theoretical Computer Science",
+ Volume = 413,
+ Number = 1,
+ Pages = "142--159",
+ Year = 2012,
+ Note = "Quantitative Aspects of Programming Languages (QAPL 2010)",
+ ISSN = "0304-3975",
+ URL = "http://www.sciencedirect.com/science/article/pii/S0304397511006190",
+ Abstract = "Cost analysis statically approximates the cost of
+ programs in terms of their input data size. This paper
+ presents, to the best of our knowledge, the first
+ approach to the automatic cost analysis of
+ object-oriented bytecode programs. In languages such as
+ Java and C#, analyzing bytecode has a much wider
+ application area than analyzing source code since the
+ latter is often not available. Cost analysis in this
+ context has to consider, among others, dynamic dispatch,
+ jumps, the operand stack, and the heap. Our method takes
+ a bytecode program and a cost model specifying the
+ resource of interest, and generates cost relations which
+ approximate the execution cost of the program with
+ respect to such resource. We report on COSTA, an
+ implementation for Java bytecode which can obtain upper
+ bounds on cost for a large class of programs and
+ complexity classes. Our basic techniques can be directly
+ applied to infer cost relations for other
+ object-oriented imperative languages, not necessarily in
+ bytecode form."
+}
+
+ at Inproceedings{AlbertAGP08,
+ Author = "E. Albert and P. Arenas and S. Genaim and G. Puebla",
+ Title = "Automatic Inference of Upper Bounds for Recurrence Relations
+ in Cost Analysis",
+ Booktitle = "Static Analysis:
+ Proceedings of the 15th International Symposium",
+ Address = "Valencia, Spain",
+ Editor = "M. Alpuente and G. Vidal",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5079,
+ Year = 2008,
+ Pages = "221--237",
+ ISBN = "978-3-540-69163-1",
+ Abstract = "The classical approach to automatic cost analysis
+ consists of two phases. Given a program and some measure
+ of cost, we first produce \emph{recurrence relations}
+ (RRs) which capture the cost of our program in terms of
+ the size of its input data. Second, we convert such RRs
+ into \emph{closed form} (i.e., without
+ recurrences). Whereas the first phase has received
+ considerable attention, with a number of cost analyses
+ available for a variety of programming languages, the
+ second phase has received comparatively little
+ attention. In this paper we first study the features of
+ RRs generated by automatic cost analysis and discuss why
+ existing computer algebra systems are not appropriate
+ for automatically obtaining closed form solutions nor
+ upper bounds of them. Then we present, to our knowledge,
+ the first practical framework for the fully automatic
+ generation of reasonably accurate upper bounds of RRs
+ originating from cost analysis of a wide range of
+ programs. It is based on the inference of \emph{ranking
+ functions} and \emph{loop invariants} and on
+ \emph{partial evaluation}."
+}
+
+ at Incollection{AlbertAGPZ08,
+ Author = "E. Albert and P. Arenas and S. Genaim
+ and G. Puebla and D. Zanardini",
+ Title = "{COSTA}: Design and Implementation of a Cost and Termination
+ Analyzer for {Java} Bytecode",
+ Booktitle = "Formal Methods for Components and Objects",
+ Editor = "Frank S. {de Boer} and M. M. Bonsangue
+ and S. Graf and W. P. {de Roever}",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Year = 2008,
+ Volume = 5382,
+ Pages = "113--132",
+ ISBN = "978-3-540-92187-5",
+ Note = "Revised papers presented at the 6th International Symposium on
+ Formal Methods for Components and Objects (FMCO 2007),
+ Amsterdam, The Netherlands, October 24--26, 2007",
+ Abstract = "This paper describes the architecture of COSTA, an
+ abstract interpretation based COST and termination
+ Analyzer for Java bytecode. The system receives as
+ input a bytecode program, (a choice of) a
+ \emph{resource} of interest and tries to obtain an upper
+ bound of the resource consumption of the program. COSTA
+ provides several non-trivial notions of cost, as the
+ consumption of the heap, the number of bytecode
+ instructions executed and the number of calls to a
+ specific method. Additionally, COSTA tries to prove
+ \emph{termination} of the bytecode program which implies
+ the boundedness of any resource consumption. Having cost
+ and termination together is interesting, as both
+ analyses share most of the machinery to, respectively,
+ infer cost \emph{upper bounds} and to prove that the
+ execution length is always \emph{finite} (i.e., the
+ program terminates). We report on experimental results
+ which show that COSTA can deal with programs of
+ realistic size and complexity, including programs which
+ use Java libraries. To the best of our knowledge, this
+ system provides for the first time evidence that
+ resource usage analysis can be applied to a realistic
+ object-oriented, bytecode programming language."
+}
+
+ at Inproceedings{AlonsoAG11,
+ Author = "D. Alonso and P. Arenas and S. Genaim",
+ Title = "Handling Non-linear Operations in the Value Analysis of {COSTA}",
+ Booktitle = "Proceedings of the 6th Workshop on Bytecode Semantics,
+ Verification, Analysis and Transformation (Bytecode 2011)",
+ Address = "Saarbrucken, Germany",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 279,
+ Number = 1,
+ Pages = "3--17",
+ Year = 2011,
+ ISSN = "1571-0661",
+ Abstract = "Inferring precise relations between (the values of)
+ program variables at different program points is
+ essential for termination and resource usage
+ analysis. In both cases, this information is used to
+ synthesize ranking functions that imply the program's
+ termination and bound the number of iterations of its
+ loops. For efficiency, it is common to base value
+ analysis on non-disjunctive abstract domains such as
+ Polyhedra, Octagon, etc. While these domains are
+ efficient and able to infer complex relations for a wide
+ class of programs, they are often not sufficient for
+ modeling the effect of non-linear and bit arithmetic
+ operations. Modeling such operations precisely can be
+ done by using more sophisticated abstract domains, at
+ the price of performance overhead. In this paper we
+ report on the value analysis of COSTA that is based on
+ the idea of encoding the disjunctive nature of
+ non-linear operations into the (abstract) program
+ itself, instead of using more sophisticated abstract
+ domains. Our experiments demonstrate that COSTA is able
+ to prove termination and infer bounds on resource
+ consumption for programs that could not be handled
+ before."
+}
+
+ at Inproceedings{Alur11,
+ Author = "R. Alur",
+ Title = "Formal Verification of Hybrid Systems",
+ Booktitle = "Proceedings of the 11th International Conference
+ on Embedded Software (EMSOFT 2011)",
+ Address = "Taipei, Taiwan",
+ Editor = "S. Chakraborty and A. Jerraya and S. K. Baruah
+ and S. Fischmeister",
+ Publisher = "ACM Press",
+ Year = 2011,
+ Pages = "273--278",
+ ISBN = "978-1-4503-0714-7",
+ Abstract = "In formal verification, a designer first constructs a
+ model, with mathematically precise semantics, of the
+ system under design, and performs extensive analysis
+ with respect to correctness requirements. The
+ appropriate mathematical model for embedded control
+ systems is hybrid systems that combines the traditional
+ state-machine based models for discrete control with
+ classical differential-equations based models for
+ continuously evolving physical activities. In this
+ article, we briefly review selected existing approaches
+ to formal verification of hybrid systems, along with
+ directions for future research."
+}
+
+ at Inproceedings{AlurKRS08,
+ Author = "R. Alur and A. Kanade and S. Ramesh and K. Shashidhar",
+ Title = "Symbolic Analysis for Improving Simulation Coverage
+ of Simulink/Stateflow Models",
+ Booktitle = "Proceedings of the 8th ACM {\&} IEEE International Conference
+ on Embedded Software (EMSOFT 2008)",
+ Address = "Atlanta, Georgia, USA",
+ Editor = "L. {de Alfaro} and J. Palsberg",
+ Publisher = "ACM Press",
+ Pages = "89--98",
+ Year = 2008,
+ ISBN = "978-1-60558-468-3",
+ Abstract = "Aimed at verifying safety properties and improving
+ simulation coverage for hybrid systems models of
+ embedded controlsoftware, we propose a technique that
+ combines numerical simulation and symbolic methods for
+ computing state-sets. We consider systems with linear
+ dynamics described in the commercial modeling tool
+ Simulink/Stateflow. Given an initial state $x$,
+ and a discrete-time simulation trajectory, our
+ method computes a set of initial states that are
+ guaranteed to be equivalent to $x$, where two initial
+ states are considered to be equivalent if the resulting
+ simulation trajectories contain the same discrete
+ components at each step of the simulation. We illustrate
+ the benefits of our method on two case studies.
+ One case study is a benchmark proposed in the literature
+ for hybrid systems verification and another is a Simulink
+ demo model from Mathworks."
+}
+
+ at Inproceedings {AmatoPS10,
+ Author = "G. Amato and M. Parton and F. Scozzari",
+ Title = "A Tool Which Mines Partial Execution Traces to Improve
+ Static Analysis",
+ Booktitle = "Proceedings of the 1st International Conference on
+ Runtime Verification (RV 2010)",
+ Address = "Balluta Bay, St Julians, Malta",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "H. Barringer and Y. Falcone and B. Finkbeiner and K. Havelund
+ and I. Lee and G. Pace and G. Rosu and O. Sokolsky and
+ N. Tillmann",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-16611-2",
+ Pages = "475--479",
+ Volume = 6418,
+ Year = 2010,
+ Abstract = "We present a tool which performs abstract interpretation
+ based static analysis of numerical variables. The
+ novelty is that the analysis is parametric, and
+ parameters are chosen by applying a variant of principal
+ component analysis to partial execution traces of
+ programs."
+}
+
+ at Article{AmatoPS12,
+ Author = "G. Amato and M. Parton and F. Scozzari",
+ Title = "Discovering Invariants via Simple Component Analysis",
+ Journal = "Journal of Symbolic Computation",
+ Volume = 47,
+ Number = 12,
+ Year = 2012,
+ Pages = "1533--1560",
+ Abstract = "We propose a new technique combining dynamic and static
+ analysis of programs to find linear invariants. We use a
+ statistical tool, called simple component analysis, to
+ analyze partial execution traces of a given program. We
+ get a new coordinate system in the vector space of
+ program variables, which is used to specialize numerical
+ abstract domains. As an application, we instantiate our
+ technique to interval analysis of simple imperative
+ programs and show some experimental evaluations."
+}
+
+ at Inproceedings{AmatoS12,
+ Author = "G. Amato and F. Scozzari",
+ Title = "Random: R-Based Analyzer for Numerical Domains",
+ Booktitle = "Proceedings of the 18th International Conference
+ on Logic for Programming, Artificial Intelligence,
+ and Reasoning (LPAR 2012)",
+ Address = "M\'erida, Venezuela",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "N. Bj{\o}rner and A. Voronkov",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-28716-9",
+ Pages = "375--382",
+ Volume = 7180,
+ Year = 2012,
+ Abstract = "We present the tool Random (R-based Analyzer for
+ Numerical DOMains) for static analysis of imperative
+ programs. The tool is based on the theory of abstract
+ interpretation and implements several abstract
+ domains for detecting numerical properties, in
+ particular integer loop invariants. The tool
+ combines a statistical dynamic analysis with a static
+ analysis on the new domain of parallelotopes. The
+ tool has a graphical interface for tuning the
+ parameters of the analysis and visualizing partial
+ traces."
+}
+
+ at Inproceedings{Andre10,
+ Author = "{\'E}. Andr{\'e}",
+ Title = "{IMITATOR~II}:
+ A Tool for Solving the Good Parameters Problem in Timed Automata",
+ Booktitle = "Proceedings of the 12th International Workshop
+ on Verification of Infinite State Systems (INFINITY'10)",
+ Editor = "Y.-F. Chen and A. Rezine",
+ Address = "Singapore",
+ Pages = "91--99",
+ Series = "Electronic Proceedings in Theoretical Computer Science",
+ Volume = 39,
+ Year = 2010,
+ Abstract = "We present here \textsc{Imitator}~II, a new version of
+ \textsc{Imitator}, a tool implementing the ``inverse
+ method'' for parametric timed automata: given a reference
+ valuation of the parameters, it synthesizes a constraint
+ such that, for any valuation satisfying this constraint,
+ the system behaves the same as under the reference
+ valuation in terms of traces, i.e., alternating sequences
+ of locations and actions. \textsc{Imitator}~II also
+ implements the ``behavioral cartography algorithm'',
+ allowing us to solve the following good parameters
+ problem: find a set of valuations within a given bounded
+ parametric domain for which the system behaves well. We
+ present new features and optimizations of the tool, and
+ give results of applications to various examples of
+ asynchronous circuits and communication protocols."
+}
+
+ at Techreport{AndreFS11TR,
+ Author = "{\'E}. Andr{\'e} and L. Fribourg and R. Soulat",
+ Title = "Enhancing the Inverse Method with State Merging",
+ Type = "Research report",
+ Number = "LSV-11-26",
+ Year = 2011,
+ Month = dec,
+ Institution = "Laboratoire Sp\'ecification \& V\'erification",
+ Address = "\'Ecole Normale Sup\'erieure de Cachan, Paris, France",
+ Abstract = "Keeping the state space small is essential when
+ verifying realtime systems using Timed Automata (TA). In
+ the model-checker Uppaal, the merging operation has been
+ used extensively in order to reduce the number of
+ states. Actually, Uppaal's merging technique applies
+ within the more general setting of Parametric Timed
+ Automata (PTA). The Inverse Method (IM) for a PTA A is a
+ procedure that synthesizes a zone around a given point
+ 0 (parameter valuation) over which A is guaranteed to
+ behave similarly. We show that the integration of
+ merging into IM leads to the synthesis of larger zones
+ around 0. It also often improves the performance of
+ IM, both in terms of computational space and time, as
+ shown by our experimental results."
+}
+
+ at Inproceedings{ArmandoBM07,
+ Author = "A. Armando and M. Benerecetti and J. Mantovani",
+ Title = "Abstraction Refinement of Linear Programs with Arrays",
+ Booktitle = "Proceedings of the 13th International Conference on
+ Tools and Algorithms for the Construction and Analysis
+ of Systems (TACAS 2007)",
+ Address = "Braga, Portugal",
+ Editor = "O. Grumberg and M. Huth",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4424,
+ Pages = "373--388",
+ Year = 2007,
+ ISBN = "3-540-71208-4",
+ Abstract = "In previous work we presented a model checking procedure
+ for linear programs, i.e. programs in which variables
+ range over a numeric domain and expressions involve
+ linear combinations of the variables. In this paper we
+ lift our model checking procedure for linear programs to
+ deal with arrays via iterative abstraction
+ refinement. While most approaches are based on predicate
+ abstraction and therefore the abstraction is relative to
+ sets of predicates, in our approach the abstraction is
+ relative to sets of variables and array indexes, and the
+ abstract program can express complex correlations
+ between program variables and array elements. Thus,
+ while arrays are problematic for most of the approaches
+ based on predicate abstraction, our approach treats them
+ in a precise way. This is an important feature as arrays
+ are ubiquitous in programming. We provide a detailed
+ account of both the abstraction and the refinement
+ processes, discuss their implementation in the eureka
+ tool, and present experimental results that confirm the
+ effectiveness of our approach on a number of programs of
+ interest."
+}
+
+ at Inproceedings{AsarinDFGLGM06,
+ Author = "E. Asarin and T. Dang and G. Frehse and A. Girard
+ and C. {Le Guernic} and O. Maler",
+ Title = "Recent Progress in Continuous and Hybrid Reachability Analysis",
+ Booktitle = "Proceedings of the IEEE International Symposium
+ on Computer-Aided Control Systems Design",
+ Address = "Technische Universit{\"a}t M{\"u}nchen, Munich, Germany",
+ Year = 2006,
+ Abstract = "Set-based reachability analysis computes all possible
+ states a system may attain, and in this sense provides
+ knowledge about the system with a completeness, or
+ coverage, that a finite number of simulation runs can
+ not deliver. Due to its inherent complexity, the
+ application of reachability analysis has been limited so
+ far to simple systems, both in the continuous and the
+ hybrid domain. In this paper we present recent advances
+ that, in combination, significantly improve this
+ applicability, and allow us to find better balance
+ between computational cost and accuracy. The
+ presentation covers, in a unified manner, a variety of
+ methods handling increasingly complex types of
+ continuous dynamics (constant derivative, linear,
+ nonlinear). The improvements include new geometrical
+ objects for representing sets, new approximation
+ schemes, and more flexible combinations of graph-search
+ algorithm and partition refinement. We report briefly
+ some preliminary experiments that have enabled the
+ analysis of systems previously beyond reach."
+}
+
+ at Inproceedings{Avery06,
+ Author = "J. Avery",
+ Title = "Size-Change Termination and Bound Analysis",
+ Booktitle = "Proceedings of the 8th International Symposium
+ on Functional and Logic Programming (FLOPS 2006)",
+ Address = "Fuji-Susono, Japan",
+ Editor = "M. Hagiya and P. Wadler",
+ Pages = "192--207",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3945,
+ Year = 2006,
+ ISBN = "3-540-33438-6",
+ Abstract = "Despite its simplicity, the size-change termination
+ principle, presented by Lee, Jones and Ben-Amram in
+ [LJB01], is surprisingly strong and is able to show
+ termination for a large class of programs. A significant
+ limitation for its use, however, is the fact that the
+ SCT requires data types to be well-founded, and that all
+ mechanisms used to determine termination must involve
+ decreases in these global, well-founded partial orders.
+ Following is an extension of the size-change principle
+ that allows for non-well founded data types, and a
+ realization of this principle for integer data
+ types. The extended size-change principle is realized
+ through combining abstract interpretation over the
+ domain of convex polyhedra with the use of size-change
+ graphs. In the cases when data types \emph{are} well
+ founded, the method handles every case that is handled
+ by LJB size-change termination. The method has been
+ implemented in a subject language independent shared
+ library, \texttt{libesct} (available at [Ave05a]), as
+ well as for the ANSI C specializer
+ $\texttt{C-Mix}_\texttt{II}$, handling a
+ subset of its internal language \texttt{Core-C}."
+}
+
+ at Inproceedings{BagnaraR-CZ05,
+ Author = "R. Bagnara and E. Rodr{\'\i}guez-Carbonell and E. Zaffanella",
+ Title = "Generation of Basic Semi-algebraic Invariants
+ Using Convex Polyhedra",
+ Booktitle = "Static Analysis:
+ Proceedings of the 12th International Symposium",
+ Address = "London, UK",
+ Editor = "C. Hankin and I. Siveroni",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3672,
+ ISBN = "3-540-28584-9",
+ Year = 2005,
+ Pages = "19--34",
+ Abstract = "A technique for generating invariant polynomial
+ \emph{inequalities} of bounded degree is presented using
+ the abstract interpretation framework. It is based on
+ overapproximating basic semi-algebraic sets, i.e., sets
+ defined by conjunctions of polynomial inequalities, by
+ means of convex polyhedra. While improving on the
+ existing methods for generating invariant polynomial
+ \emph{equalities}, since polynomial inequalities are
+ allowed in the guards of the transition system, the
+ approach does not suffer from the prohibitive complexity
+ of the methods based on quantifier-elimination. The
+ application of our implementation to benchmark programs
+ shows that the method produces non-trivial invariants in
+ reasonable time. In some cases the generated invariants
+ are essential to verify safety properties that cannot be
+ proved with classical linear invariants."
+}
+
+ at Techreport{BagnaraR-CZ05TR,
+ Author = "R. Bagnara and E. Rodr{\'\i}guez-Carbonell and E. Zaffanella",
+ Title = "Generation of Basic Semi-algebraic Invariants
+ Using Convex Polyhedra",
+ Number = "LSI-05-14-R",
+ Type = "Report de recerca",
+ Institution = "Departament de Llenguatges i Sistemes Inform{\`a}tics,
+ Universitat Polit{\`e}cnica de Catalunya, Barcelona, Spain",
+ Year = 2005,
+ Note = "Available at \url{http://www.lsi.upc.edu/dept/techreps/techreps.html}"
+}
+
+ at Incollection{BandaG09,
+ Author = "G. Banda and J. P. Gallagher",
+ Title = "Analysis of Linear Hybrid Systems in {CLP}",
+ Booktitle = "Logic-Based Program Synthesis and Transformation",
+ Editor = "M. Hanus",
+ Pages = "55--70",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5438,
+ Year = 2009,
+ ISBN = "978-3-642-00514-5",
+ Note = "Revised selected papers presented at the 18th International
+ Symposium on Logic-Based Program Synthesis and Transformation
+ (LOPSTR 2008), Valencia, Spain, July 17--18, 2008",
+ Abstract = "In this paper we present a procedure for representing
+ the semantics of linear hybrid automata (LHAs) as
+ constraint logic programs (CLP); flexible and accurate
+ analysis and verification of LHAs can then be performed
+ using generic CLP analysis and transformation
+ tools. LHAs provide an expressive notation for
+ specifying real-time systems. The main contributions are
+ (i) a technique for capturing the reachable states of
+ the continuously changing state variables of the LHA as
+ CLP constraints; (ii) a way of representing events in
+ the LHA as constraints in CLP, along with a product
+ construction on the CLP representation including
+ synchronisation on shared events; (iii) a framework in
+ which various kinds of reasoning about an LHA can be
+ flexibly performed by combining standard CLP
+ transformation and analysis techniques. We give
+ experimental results to support the usefulness of the
+ approach and argue that we contribute to the general
+ field of using static analysis tools for verification."
+}
+
+ at Inproceedings{BerendsenJV10,
+ Author = "J. Berendsen and D. N. Jansen and F. W. Vaandrager",
+ Title = "Fortuna: Model Checking Priced Probabilistic Timed Automata",
+ Booktitle = "Proceedings of the 7th International Conference on the
+ Quantitative Evaluation of Systems (QEST 2010)",
+ Address = "Williamsburg, Virginia, USA",
+ Publisher = "IEEE Computer Society",
+ Year = 2010,
+ Pages = "273--281",
+ ISBN = "978-0-7695-4188-4",
+ Abstract = "Fortuna is the first tool for model checking priced
+ probabilistic timed automata (PPTAs). PPTAs are an
+ important model that can handle the combination of
+ real-time, probabilistic and cost features. Only model
+ checkers that incorporate all these features can
+ address the key design trade-offs that arise in many
+ practical applications such as: the Zeroconf,
+ Bluetooth, IEEE802.11 and Firewire protocols, protocols
+ for sensor networks, and scheduling problems with
+ failures. PPTAs are an extension of probabilistic timed
+ automata (PTAs), by having cost-rates and discrete cost
+ increments on states. Fortuna is able to compute the
+ maximal probability by which a class of states can be
+ reached under a certain cost-bound (and time bound.)
+ Although the problem is undecidable in general, there
+ exists a semi-algorithm that produces a non-decreasing
+ sequence of maximal probabilities. This paper enhances
+ that algorithm. We compared the performance of Fortuna
+ with existing approaches for PTAs. Surprisingly,
+ although PPTAs are more general, our techniques exhibit
+ superior performance.",
+}
+
+ at TechReport{BeyL11TR,
+ Author = "A. Bey S. Leue",
+ Title = "Modeling and Analyzing Spike Timing Dependent Plasticity
+ with Linear Hybrid Automata",
+ Number = "soft-11-03",
+ Institution = "University of Konstanz, Germany",
+ Year = 2011,
+ Month = may,
+ Abstract = "We propose a model for synaptic plasticity according to
+ the Spike Timing Dependent Plasticity (STDP) theory
+ using Linear Hybrid Au- tomata (LHA). We first present a
+ compositional LHA model in which each component
+ corresponds to some process in STDP. We then ab- stract
+ this model into a monolithic LHA model in order to
+ enable formal analysis using hybrid model checking. We
+ discuss how the avail- ability of an LHA model as well
+ as its formal analysis using the tool PHAVer can support
+ a better understanding of the dynamics of STDP."
+}
+
+ at Inproceedings{BeyerG11,
+ Author = "M. Beyer and S. Glesner",
+ Title = "Static Run-Time Mode Extraction by State Partitioning
+ in Synchronous Process Networks",
+ Booktitle = "Proceedings of the 14th International Workshop on
+ Software and Compilers for Embedded Systems (SCOPES 2011)",
+ Year = 2011,
+ ISBN = "978-1-4503-0763-5",
+ Pages = "28--37",
+ URL = "http://doi.acm.org/10.1145/1988932.1988938",
+ Publisher = "ACM Press",
+ Address = "New York, NY, USA",
+ Abstract = "Process Networks (PNs) are used for modeling
+ streaming-oriented applications with changing behavior,
+ which must be mapped on a concurrent architecture to
+ meet the performance and energy constraints of embedded
+ devices. Finding an optimal mapping of Process Networks
+ to the constrained architecture presumes that the
+ behavior of the PN is statically known. In this paper we
+ present a static analysis for synchronous PNs that
+ partitions the state space according to extract run-time
+ modes based on a Data Augmented Control Flow Automaton
+ (DACFA). The result is a mode automaton whose nodes
+ describe identified program modes and whose edges
+ represent transitions among them. Optimizing back-ends
+ mapping from PNs to concurrent architectures can be
+ guided by these analysis results."
+}
+
+ at Inproceedings{BeyerG12,
+ Author = "M. Beyer and S. Glesner",
+ Title = "Static Analysis of Run-Time Modes in Synchronous Process Network",
+ Booktitle = "Perspectives of Systems Informatics: Proceedings of the
+ 8th International Andrei Ershov Memorial Conference",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "E. Clarke and I. Virbitskaite and A. Voronkov",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-29708-3",
+ Pages = "55--67",
+ Volume = 7162,
+ Year = 2012,
+ Abstract = "For modeling modern streaming-oriented applications,
+ Process Networks (PNs) are used to describe systems with
+ changing behavior, which must be mapped on a concurrent
+ architecture to meet the performance and energy
+ constraints of embedded devices. Finding an optimal
+ mapping of Process Networks to the constrained
+ architecture presumes that the behavior of the Process
+ Network is statically known. In this paper we present a
+ static analysis for synchronous PNs that extracts
+ different run-time modes by using polyhedral
+ abstraction. The result is a Mealy machine whose states
+ describe different run-time modes and the edges among
+ them represent transitions. This machine can be used to
+ guide optimizing backend mappings from PNs to concurrent
+ architectures."
+}
+
+ at Inproceedings{BouchyFL08,
+ Author = "F. Bouchy and A. Finkel and J. Leroux",
+ Title = "Decomposition of Decidable First-Order Logics
+ over Integers and Reals",
+ Booktitle = "Proceedings of the 15th International Symposium on
+ Temporal Representation and Reasoning (TIME '08)",
+ Address = "Montreal, Canada",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "147--155",
+ Year = 2008,
+ Abstract = "We tackle the issue of representing infinite sets of
+ real-valued vectors. This paper introduces an
+ operator for combining integer and real sets. Using
+ this operator, we decompose three well-known logics
+ extending Presburger with reals. Our decomposition
+ splits a logic into two parts : one integer, and one
+ decimal (i.e. on the interval $[0, 1[$). We also give
+ a basis for an implementation of our representation."
+}
+
+ at Inproceedings{BozgaGI09,
+ Author = "M. Bozga and C. G\^{\i}rlea and R. Iosif",
+ Title = "Iterating Octagons",
+ Booktitle = "Proceedings of the 15th International Conference on
+ Tools and Algorithms for the Construction and Analysis
+ of Systems (TACAS 2009)",
+ Address = "York, UK",
+ Editor = "S. Kowalewski and A. Philippou",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5505,
+ Pages = "337-351",
+ Year = 2009,
+ ISBN = "978-3-642-00767-5",
+ Abstract = "In this paper we prove that the transitive closure of a
+ nondeterministic octagonal relation using integer
+ counters can be expressed in Presburger arithmetic. The
+ direct consequence of this fact is that the reachability
+ problem is decidable for flat counter automata with
+ octagonal transition relations. This result improves the
+ previous results of Comon and Jurski [Hubert Comon and
+ Yan Jurski. Multiple counters automata, safety analysis
+ and presburger arithmetic. In \emph{CAV}, LNCS 1427, pages
+ 268-279, 1998] and Bozga, Iosif and Lakhnech [Marius Bozga,
+ Radu Iosif, and Yassine Lakhnech. Flat parametric counter
+ automata. In \emph{ICALP}, LNCS 4052, pages 577-588.
+ Springer-Verlag, 2006] concerning the computation of
+ transitive closures for difference bound relations.
+ The importance of this result is justified by the wide
+ use of octagons to computing sound abstractions of
+ real-life systems [A. Min\'e. The octagon abstract domain.
+ \emph{Higher-Order and Symbolic Computation}, 19(1):31-100,
+ 2006]. We have implemented the octagonal transitive closure
+ algorithm in a prototype system for the analysis of counter
+ automata, called FLATA, and we have experimented with a
+ number of test cases."
+}
+
+ at Inproceedings{BramanM08,
+ Title = "Safety Verification of Fault Tolerant Goal-based Control Programs
+ with Estimation Uncertainty",
+ Author = "J. M. B. Braman and R. M. Murray",
+ Booktitle = "Proceedings of the 2008 American Control Conference",
+ Address = "Seattle, Washington, USA",
+ Publisher = "IEEE Press",
+ Year = 2008,
+ Pages = "27--32",
+ ISSN = "0743-1619",
+ ISBN = "978-1-4244-2078-0",
+ Abstract = "Fault tolerance and safety verification of control
+ systems that have state variable estimation uncertainty
+ are essential for the success of autonomous robotic
+ systems. A software control architecture called mission
+ data system, developed at the Jet Propulsion Laboratory,
+ uses goal networks as the control program for autonomous
+ systems. Certain types of goal networks can be converted
+ into linear hybrid systems and verified for safety using
+ existing symbolic model checking software. A process for
+ calculating the probability of failure of certain
+ classes of verifiable goal networks due to state
+ estimation uncertainty is presented. A verifiable
+ example task is presented and the failure probability of
+ the control program based on estimation uncertainty is
+ found."
+}
+
+ at Techreport{Braun12TR,
+ Author = "V. Braun",
+ Title = "Counting Points and {Hilbert} Series in String Theory",
+ Institution = "University of Pennsylvania in Philadelphia, USA",
+ Number = "arXiv:1206.2236v1 [hep-th]",
+ Note = "Available from \url{http://arxiv.org/}",
+ Year = 2012,
+ Month = jun,
+ URL = "http://arxiv.org/abs/1206.2236v1",
+ Abstract = "The problem of counting points is revisited from the
+ perspective of reflexive 4-dimensional polytopes. As an
+ application, the Hilbert series of the 473,800,776
+ reflexive polytopes (equivalently, their Calabi-Yau
+ hypersurfaces) are computed."
+}
+
+
+ at Techreport{CacheraM-A05,
+ Author = "D. Cachera and K. Morin-Allory",
+ Title = "Proving Parameterized Systems: The Use of a Widening Operator
+ and Pseudo-Pipelines in Polyhedral Logic",
+ Type = "Research Report",
+ Number = "ISRN TIMA--RR-05/04-01--FR",
+ Institution = "TIMA Laboratory",
+ Address = "Grenoble, France",
+ Year = 2005,
+ Abstract = "We propose proof techniques and tools for the formal
+ verification of regular parameterized systems. These
+ systems are expressed in the polyhedral model, which
+ combines affine recurrence equations with index sets of
+ polyhedral shape. We extend a previously defined proof
+ system based on a polyhedral logic with the detection of
+ pseudo-pipelines, that are particular patterns in the
+ variable definitions generalizing the notion of
+ pipeline. The combination of pseudo-pipeline detection
+ with the use of a simple widening operator greatly
+ improves the effectiveness of our proof techniques."
+}
+
+ at Article{CarloniPPS-V06,
+ Author = "L. P. Carloni and R. Passerone and A. Pinto
+ and A. L. Sangiovanni-Vincentelli",
+ Title = "Languages and Tools for Hybrid Systems Design",
+ Journal = "Foundations and Trends. in Electronic Design Automation",
+ Volume = 1,
+ Number = "1/2",
+ Pages = "1--193",
+ Year = 2006,
+ Abstract = "The explosive growth of embedded electronics is bringing
+ information and control systems of increasing complexity
+ to every aspects of our lives. The most challenging
+ designs are safety-critical systems, such as
+ transportation systems (e.g., airplanes, cars, and
+ trains), industrial plants and health care
+ monitoring. The difficulties reside in accommodating
+ constraints both on functionality and
+ implementation. The correct behavior must be guaranteed
+ under diverse states of the environment and potential
+ failures; implementation has to meet cost, size, and
+ power consumption requirements. The design is therefore
+ subject to extensive mathematical analysis and
+ simulation. However, traditional models of information
+ systems do not interface well to the continuous evolving
+ nature of the environment in which these devices
+ operate. Thus, in practice, different mathematical
+ representations have to be mixed to analyze the overall
+ behavior of the system. \emph{Hybrid systems} are a
+ particular class of mixed models that focus on the
+ combination of discrete and continuous subsystems. There
+ is a wealth of tools and languages that have been
+ proposed over the years to handle hybrid
+ systems. However, each tool makes different assumptions
+ on the environment, resulting in somewhat different
+ notions of hybrid system. This makes it difficult to
+ share information among tools. Thus, the community
+ cannot maximally leverage the substantial amount of work
+ that has been directed to this important topic. In this
+ paper, we review and compare hybrid system tools by
+ highlighting their differences in terms of their
+ underlying semantics, expressive power and mathematical
+ mechanisms. We conclude our review with a comparative
+ summary, which suggests the need for a unifying approach
+ to hybrid systems design. As a step in this direction,
+ we make the case for a \emph{semantic-aware interchange
+ format}, which would enable the use of joint techniques,
+ make a formal comparison between different approaches
+ possible, and facilitate exporting and importing design
+ representations."
+}
+
+ at Article{ChakrabortyMS06,
+ Title = "Reasoning about Synchronization in {GALS} Systems",
+ Author = "S. Chakraborty and J. Mekie and D. K. Sharma",
+ Journal = "Formal Methods in System Design",
+ Publisher = "Springer Netherlands",
+ Volume = 28,
+ Number = 2,
+ Pages = "153--169",
+ Year = 2006,
+ Abstract = "Correct design of interface circuits is crucial for the
+ development of System-on-Chips (SoC) using off-the-shelf
+ IP cores. For correct operation, an interface circuit
+ must meet strict synchronization timing constraints, and
+ also respect sequencing constraints between events
+ dictated by interfacing protocols and rational clock
+ relations. In this paper, we propose a technique for
+ automatically analyzing the interaction between
+ independently specified synchronization constraints and
+ sequencing constraints between events. We show how this
+ analysis can be used to derive delay constraints for
+ correct operation of interface circuits in a GALS
+ system. Our methodology allows an SoC designer to mix
+ and match different interfacing protocols, rational
+ clock relations and synchronization constraints for
+ communication between a pair of modules, and
+ automatically explore their implications on correct
+ interface circuit design."
+}
+
+ at Inproceedings{ChenMC08,
+ Author = "L. Chen and A. Min{\'e} and P. Cousot",
+ Title = "A Sound Floating-Point Polyhedra Abstract Domain",
+ Booktitle = "Proceedings of the 6th Asian Symposium on
+ Programming Languages and Systems (APLAS 2008)",
+ Address = "Bangalore, India",
+ Editor = "G. Ramalingam",
+ Year = 2008,
+ Pages = "3--18",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5356,
+ ISBN = "978-3-540-89329-5",
+ Abstract = "The polyhedra abstract domain is one of the most
+ powerful and commonly used numerical abstract domains in
+ the field of static program analysis based on abstract
+ interpretation. In this paper, we present an
+ implementation of the polyhedra domain using
+ floating-point arithmetic without sacrificing soundness.
+ Floating-point arithmetic allows a compact memory
+ representation and an efficient implementation on
+ current hardware, at the cost of some loss of precision
+ due to rounding. Our domain is based on a
+ constraint-only representation and employs sound
+ floating-point variants of Fourier-Motzkin elimination
+ and linear programming. The preliminary experimental
+ results of our prototype are encouraging. To our
+ knowledge, this is the first time that the polyhedra
+ domain is adapted to floating-point arithmetic in a
+ sound way."
+}
+
+
+ at Inproceedings{ColonS11,
+ Author = "M. Col{\'o}n and S. Sankaranarayanan",
+ Title = "Generalizing the Template Polyhedral Domain",
+ Booktitle = "Proceedings of the 20th European Symposium on Programming
+ (ESOP 2011)",
+ Address = "Saarbr{\"u}cken, Germany",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "G. Barthe",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-19717-8",
+ Pages = "176--195",
+ Volume = 6602,
+ Year = 2011,
+ Abstract = "Template polyhedra generalize weakly relational domains
+ by specifying arbitrary fixed linear expressions on the
+ left-hand sides of inequalities and undetermined
+ constants on the right. The domain operations required
+ for analysis over template polyhedra can be computed in
+ polynomial time using linear programming. In this paper,
+ we introduce the generalized template polyhedral domain
+ that extends template polyhedra using fixed left-hand
+ side expressions with bilinear forms involving program
+ variables and unknown parameters to the right. We prove
+ that the domain operations over generalized templates
+ can be defined as the ``best possible abstractions'' of
+ the corresponding polyhedral domain operations. The
+ resulting analysis can straddle the entire space of
+ linear relation analysis starting from the template
+ domain to the full polyhedral domain. We show that
+ analysis in the generalized template domain can be
+ performed by dualizing the join, post-condition and
+ widening operations. We also investigate the special
+ case of template polyhedra wherein each bilinear form
+ has at most two parameters. For this domain, we use the
+ special properties of two dimensional polyhedra and
+ techniques from fractional linear programming to derive
+ domain operations that can be implemented in polynomial
+ time over the number of variables in the program and the
+ size of the polyhedra. We present applications of
+ generalized template polyhedra to strengthen previously
+ obtained invariants by converting them into
+ templates. We describe an experimental evaluation of an
+ implementation over several benchmark systems."
+}
+
+ at Inproceedings{CovaFBV06,
+ Author = "M. Cova and V. Felmetsger and G. Banks and G. Vigna",
+ Title = "Static Detection of Vulnerabilities in x86 Executables",
+ Booktitle = "Proceedings of the 22nd Annual Computer Security Applications
+ Conference (ACSAC 22)",
+ Address = "Miami, Florida, USA",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "269--278",
+ Year = 2006,
+ Abstract = "In the last few years, several approaches have been
+ proposed to perform vulnerability analysis of
+ applications written in high-level languages. However,
+ little has been done to automatically identify
+ security-relevant flaws in binary code.
+
+ In this paper, we present a novel approach to the
+ identification of vulnerabilities in x86 executables in
+ ELF binary format. Our approach is based on static
+ analysis and symbolic execution techniques. We
+ implemented our approach in a proof-of-concept tool and
+ used it to detect taint-style vulnerabilities in binary
+ code. The results of our evaluation show that our
+ approach is both practical and effective."
+}
+
+ at Inproceedings{DenmatGD07,
+ Author = "T. Denmat and A. Gotlieb and M. Ducass{\'e}",
+ Title = "An Abstract Interpretation Based Combinator for Modelling
+ While Loops in Constraint Programming",
+ Booktitle = "Proceedings of the 13th International Conference on
+ Principles and Practice of Constraint Programming (CP 2007)",
+ Address = "Providence, Rhode Island, USA",
+ Editor = "C. Bessiere",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4741,
+ Year = 2007,
+ Pages = "241--255",
+ ISBN = "978-3-540-74969-1",
+ Abstract = "We present the $w$ constraint combinator that models
+ while loops in Constraint Programming. Embedded in a
+ finite domain constraint solver, it allows programmers
+ to develop non-trivial arithmetical relations using
+ loops, exactly as in an imperative language style. The
+ deduction capabilities of this combinator come from
+ abstract interpretation over the polyhedra abstract
+ domain. This combinator has already demonstrated its
+ utility in constraint-based verification and we argue
+ that it also facilitates the rapid prototyping of
+ arithmetic constraints (e.g. power, gcd or sum)."
+}
+
+ at Inproceedings{DooseM05,
+ Author = "D. Doose and Z. Mammeri",
+ Title = "Polyhedra-Based Approach for Incremental Validation
+ of Real-Time Systems",
+ Booktitle = "Proceedings of the International Conference on
+ Embedded and Ubiquitous Computing (EUC 2005)",
+ Address = "Nagasaki, Japan",
+ Editor = "L. T. Yang and M. Amamiya and Z. Liu and M. Guo and F. J. Rammig",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3824,
+ Year = 2005,
+ Pages = "184--193",
+ ISBN = "3-540-30807-5",
+ Abstract = "Real-time embedded systems can be used in hightly
+ important or even vital tasks (avionic and medical
+ systems, etc.), thus having strict temporal constraints
+ that need to be validated. Existing solutions use
+ temporal logic, automata or scheduling
+ techniques. However, scheduling techniques are often
+ pessimistic and require an almost complete knowledge of
+ the system, and formal methods can be ill-fitted to
+ manipulate some of the concepts involved in real-time
+ systems. In this article, we propose a method that
+ gives to the designer the advantages of formal methods
+ and some simplicity in manipulating real-time systems
+ notions. This method is able to model and validate all
+ the classical features of real-time systems, without any
+ pessimism, while guaranteeing the terminaison of the
+ validation process. Moreover, its formalism enables to
+ study systems of which we have only a partial knowledge,
+ and thus to validate or invalidate a system still under
+ design. This latest point is very important, since it
+ greatly decreases the cost of design backtracks."
+}
+
+ at Inproceedings{DoyenHR05,
+ Author = "L. Doyen and T. A. Henzinger and J.-F. Raskin",
+ Title = "Automatic Rectangular Refinement of Affine Hybrid Systems",
+ Booktitle = "Proceedings of the 3rd International Conference
+ on Formal Modeling and Analysis of Timed Systems (FORMATS 2005)",
+ Address = "Uppsala, Sweden",
+ Editor = "P. Pettersson and W. Yi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3829,
+ Pages = "144--161",
+ Year = 2005,
+ ISBN = "3-540-30946-2",
+ Abstract = "We show how to automatically construct and refine
+ rectangular abstractions of systems of linear
+ differential equations. From a hybrid automaton whose
+ dynamics are given by a system of linear differential
+ equations, our method computes automatically a sequence
+ of rectangular hybrid automata that are increasingly
+ precise overapproximations of the original hybrid
+ automaton. We prove an optimality criterion for
+ successive refinements. We also show that this method
+ can take into account a safety property to be verified,
+ refining only relevant parts of the state space. The
+ practicability of the method is illustrated on a
+ benchmark case study."
+}
+
+ at Techreport{DoyenHR05TR,
+ Author = "L. Doyen and T. A. Henzinger and J.-F. Raskin",
+ Title = "Automatic Rectangular Refinement of Affine Hybrid Systems",
+ Number = "2005.47",
+ Institution = "Centre F\'ed\'er\'e en V\'erification,
+ Universit\'e Libre de Bruxelles, Belgium",
+ Year = 2005,
+ Abstract = "We show how to automatically construct and refine
+ rectangular abstractions of systems of linear
+ differential equations. From a hybrid automaton whose
+ dynamics are given by a system of linear differential
+ equations, our method computes automatically a sequence
+ of rectangular hybrid automata that are increasingly
+ precise overapproximations of the original hybrid
+ automaton. We prove an optimality criterion for
+ successive refinements. We also show that this method
+ can take into account a safety property to be verified,
+ refining only relevant parts of the state space. The
+ practicability of the method is illustrated on a
+ benchmark case study."
+}
+
+ at PhdThesis{Doyen06th,
+ Author = "L. Doyen",
+ Title = "Algorithmic Analysis of Complex Semantics
+ for Timed and Hybrid Automata",
+ School = "Universit\'e Libre de Bruxelles",
+ Address = "Bruxelles, Belgium",
+ Month = jun,
+ Year = 2006,
+ Abstract = "In the field of formal verification of real-time
+ systems, major developments have been recorded in the
+ last fifteen years. It is about logics, automata,
+ process algebra, programming languages, etc. From the
+ beginning, a formalism has played an important role:
+ \emph{timed automata} and their natural extension,
+ \emph{hybrid automata}. Those models allow the
+ definition of real-time constraints using real-valued
+ \emph{clocks}, or more generally \emph{analog variables}
+ whose evolution is governed by differential
+ equations. They generalize finite automata in that their
+ semantics defines \emph{timed words} where each symbol
+ is associated with an occurrence timestamp.
+
+ The \emph{decidability} and \emph{algorithmic analysis}
+ of timed and hybrid automata have been intensively
+ studied in the literature. The central result for timed
+ automata is that they are positively decidable. This is
+ not the case for hybrid automata, but semi-algorithmic
+ methods are known when the dynamics is relatively
+ simple, namely a linear relation between the derivatives
+ of the variables. With the increasing complexity of
+ nowadays systems, those models are however limited in
+ their classical semantics, for modelling realistic
+ implementations or dynamical systems.
+
+ In this thesis, we study the algorithmics of
+ \emph{complex semantics} for timed and hybrid automata.
+ On the one hand, we propose implementable semantics for
+ timed automata and we study their computational
+ properties: by contrast with other works, we identify a
+ semantics that is implementable and that has decidable
+ properties. On the other hand, we give new algorithmic
+ approaches to the analysis of hybrid automata whose
+ dynamics is given by an affine function of its
+ variables."
+}
+
+ at MastersThesis{Ellenbogen04th,
+ Author = "R. Ellenbogen",
+ Title = "Fully Automatic Verification of Absence of Errors
+ via Interprocedural Integer Analysis",
+ School = "School of Computer Science, Tel-Aviv University",
+ Address = "Tel-Aviv, Israel",
+ Month = dec,
+ Year = 2004,
+ Abstract = "We present a interprocedural C String Static Verifier
+ (iCSSV), a whole program analysis algorithm for
+ verifying the safety of string operations in C
+ programs. The algorithm automatically proves linear
+ relationships among pointer expressions. The algorithm
+ is conservative, i.e., it infers only valid
+ relationships although it may fail to detect some of
+ them. The algorithm is targeted to programs with
+ ``shallow'' pointers and complex integer
+ relationships. Therefore, the algorithm combines
+ context-sensitive flow-insensitive pointer analysis of
+ pointer updates with contextsensitive and flow-sensitive
+ integer analysis of properties of allocation
+ sites. Context-sensitivity is achieved by specializing
+ pointer aliases to the context and functional integer
+ analysis. The algorithm is powerful enough to verify the
+ absence of string manipulation errors such as accesses
+ beyond buffer length and null terminating
+ character. Here the interprocedural analysis guarantees
+ that our algorithm is fully automatic, i.e., does not
+ require user annotations or any other intervention. A
+ prototype of the algorithm was implemented. Several
+ novel techniques are employed to make the
+ interprocedural analysis of realistic programs
+ feasible."
+}
+
+ at Inproceedings{FagesR09,
+ Author = "F. Fages and A. Rizk",
+ Title = "From Model-Checking to Temporal Logic Constraint Solving",
+ Booktitle = "Proceedings of the 15th International Conference
+ on Principles and Practice of Constraint Programming (CP 2009)",
+ Address = "Lisbon, Portugal",
+ Editor = "I. P. Gent",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5732,
+ Year = 2009,
+ Pages = "319--334",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-04243-0",
+ Abstract = "In this paper, we show how model-checking can be
+ generalized to temporal logic constraint solving, by
+ considering temporal logic formulae with free variables
+ over some domain ${\mathcal D}$, and by computing a
+ validity domain for the variables rather than a truth
+ value for the formula. This allows us to define a
+ continuous degree of satisfaction for a temporal logic
+ formula in a given structure, opening up the field of
+ model-checking to optimization. We illustrate this
+ approach with reverse-engineering problems coming from
+ systems biology, and provide some performance figures on
+ parameter optimization problems with respect to temporal
+ logic specifications."
+}
+
+ at Inproceedings{FenacciM11,
+ Author = "D. Fenacci and K. MacKenzie",
+ Title = "Static Resource Analysis for {Java} Bytecode Using Amortisation
+ and Separation Logic",
+ Booktitle = "Proceedings of the 6th Workshop on Bytecode Semantics,
+ Verification, Analysis and Transformation (Bytecode 2011)",
+ Address = "Saarbrucken, Germany",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 279,
+ Number = 1,
+ Pages = "19--32",
+ Year = 2011,
+ ISSN = "1571-0661",
+ Abstract = "In this paper we describe a static analyser for Java
+ bytecode which uses a combination of amortised analysis
+ and Separation Logic due to Robert Atkey. With the help
+ of Java annotations we are able to give precise resource
+ utilisation constraints for Java methods which
+ manipulate various heap-based data structures."
+}
+
+ at MastersThesis{Flexeder05th,
+ Author = "A. Flexeder",
+ Title = "{Interprozedurale Analyse linearer Ungleichungen}",
+ Type = "Diploma thesis",
+ School = "Technische {Universit\"at} {M\"unchen}",
+ Address = "{M\"unchen}, Germany",
+ Month = jul,
+ Year = 2005,
+ Note = "In German",
+ Abstract = "{Diese Arbeit beschreibt eine intra- und auch
+ interprozedurale Datenflussanalyse, welche an jedem
+ Programmpunkt statisch die Beziehungen, die zwischen den
+ Programmvariablen gelten, bestimmen k\"onnen. Die
+ intraprozeduralen Analyse, beruhend auf einem Modell von
+ Cousot [P.~Cousot and N.~Halbwachs. Automatic discovery
+ of linear restraints among variables of a program.
+ Conference Record of the 5th Annunal ACM Symposium on
+ Principles of Programming Languages, pages 84--96, 1978]
+ interpretiert lineare Zuweisungen und Bedingungen und
+ betrachtet die nicht linearen Konstrukte mit Hilfe von
+ nicht linearen Zuweisungen. Mit dieser Abstraktion
+ versucht man lineare Gleichheits- und
+ Ungleichheitsbeziehungen zwischen den Programmvariablen
+ in Form von Polyedern rauszufinden. Da man nicht nur
+ eine Funktion, sondern ganze Programme als Zusammenspiel
+ mehrerer Funktionen, analysieren m\"ochte, ist eine
+ interprozedurale Analyse n\"otig [M.~Mueller-Olm and
+ H.~Seidl. Precise Interprocedural Analysis through
+ Linear Algebra. POPL, 2004]. Diese soll mit den Mitteln
+ der linearen Algebra die affinen Beziehungen, welche
+ zwischen den Programmvariablen an einem bestimmten
+ Programmpunkt gelten, erkennen. Die Behandlung von
+ Prozeduraufrufen steht dabei im Vordergrund.}"
+}
+
+ at MastersThesis{FrankM02th,
+ Author = "S. Frank and P. R. Mai",
+ Title = "Strategies for Cooperating Constraint Solvers",
+ Type = "Diploma thesis",
+ School = "Technische {Universit\"at} Berlin",
+ Address = "Berlin, Germany",
+ Month = jul,
+ Year = 2002,
+ Abstract = "Cooperative constraint solving has been investigated by
+ several different research groups and individuals as it
+ provides a comfortable mechanism to attack multi-domain
+ constraint problems. The theoretical framework of
+ Hofstedt [P.~Hofstedt. Cooperation and Coordination of
+ Constraint Solvers. PhD thesis, Technische
+ {Universit\"at} Dresden, March 2001. Shaker Verlag,
+ Aachen] provided the basis for the prototypical
+ implementation described in [E.~Godehardt and
+ D.~Seifert. Kooperation und Koordination von Constraint
+ Solvern --- Implementierung eines Prototyps. Master's
+ thesis, Technische Universit{\"a}t Berlin, January
+ 2001]. Taking aboard the lessons learned in the
+ prototype, we introduce a revised implementation of the
+ framework, to serve as a flexible basis for the
+ conception and evaluation of advanced strategies for
+ solver cooperation. Several additional enhancements and
+ optimisations over the preceding implementation or the
+ underlying theoretical framework are described, proving
+ the correctness of those changes where necessary. Using
+ the newly implemented framework, we propose and
+ benchmark a set of new cooperation strategies,
+ iteratively refining them to the point where we can
+ offer a set of generally useful (i.e. non-problem
+ specific) strategies. Finally we introduce a strategy
+ language, that allows the user to define
+ problem-specific strategies, either from scratch or
+ derived from other strategies, and demonstrate the
+ effectiveness of the language on a well-known example
+ problem."
+}
+
+ at Inproceedings{Frehse04,
+ Author = "G. Frehse",
+ Title = "Compositional Verification of Hybrid Systems
+ with Discrete Interaction Using Simulation Relations",
+ Booktitle = "Proceedings of the IEEE Conference on Computer Aided
+ Control Systems Design (CACSD 2004)",
+ Address = "Taipei, Taiwan",
+ Year = 2004,
+ Abstract = "Simulation relations can be used to verify refinement
+ between a system and its specification, or between
+ models of different complexity. It is known that for the
+ verification of safety properties, simulation between
+ hybrid systems can be defined based on their labeled
+ transition system semantics. We show that for hybrid
+ systems without shared variables, which therefore only
+ interact at discrete events, this simulation preorder is
+ compositional, and present assume-guarantee rules that
+ help to counter the state explosion problem. Some
+ experimental results for simulation checking of linear
+ hybrid automata are provided using a prototype tool with
+ exact arithmetic and unlimited digits."
+}
+
+ at Inproceedings{FrehseHK04,
+ Author = "G. Frehse and Z. Han and B. Krogh",
+ Title = "Assume-Guarantee Reasoning for Hybrid {I/O}-Automata
+ by Over-Approximation of Continuous Interaction",
+ Booktitle = "Proceedings of the
+ 43rd IEEE Conference on Decision and Control (CDC 2004)",
+ Address = "Atlantis, Paradise Island, Bahamas",
+ Year = 2004,
+ Abstract = "This paper extends assume-guarantee reasoning (AGR) to
+ hybrid dynamic systems that interact through continuous
+ state variables. We use simulation relations for timed
+ transition systems to analyze compositions of hybrid I/O
+ automata. This makes it possible to perform
+ compositional reasoning that is conservative in the
+ sense of over approximating the composed behaviors. In
+ contrast to previous approaches that require global
+ receptivity conditions, circularity is broken in our
+ approach by a state-based nonblocking condition that can
+ be checked in the course of computing the AGR simulation
+ relations. The proposed procedures for AGR are
+ implemented in a computational tool for the case of
+ linear hybrid I/O automata, and the approach is
+ illustrated with a simple example."
+}
+
+ at Inproceedings{Frehse05,
+ Author = "G. Frehse",
+ Title = "{PHAVer}: Algorithmic Verification of Hybrid Systems Past {HyTech}",
+ Booktitle = "Hybrid Systems: Computation and Control:
+ Proceedings of the 8th International Workshop (HSCC 2005)",
+ Address = "Z{\"u}rich, Switzerland",
+ Editor = "M. Morari and L. Thiele",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3414,
+ Pages = "258--273",
+ Year = 2005,
+ Abstract = "In 1995, HyTech broke new ground as a potentially
+ powerful tool for verifying hybrid systems --- yet it has
+ remained severely limited in its applicability to more
+ complex systems. We address the main problems of HyTech
+ with PHAVer, a new tool for the exact verification of
+ safety properties of hybrid systems with piecewise
+ constant bounds on the derivatives. Affine dynamics are
+ handled by on-the-fly overapproximation and by
+ partitioning the state space based on user-definable
+ constraints and the dynamics of the system. PHAVer's
+ exact arithmetic is robust due to the use of the Parma
+ Polyhedra Library, which supports arbitrarily large
+ numbers. To manage the complexity of the polyhedral
+ computations, we propose methods to conservatively limit
+ the number of bits and constraints of polyhedra.
+ Experimental results for a navigation benchmark and a
+ tunnel diode circuit show the effectiveness of the
+ approach."
+}
+
+ at PhdThesis{Frehse05th,
+ Author = "G. Frehse",
+ Title = "Compositional Verification of Hybrid Systems
+ using Simulation Relations",
+ School = "Radboud Universiteit Nijmegen",
+ Address = "Nijmegen, The Netherlands",
+ Month = oct,
+ Year = 2005,
+}
+
+ at Article{Frehse08,
+ Author = "G. Frehse",
+ Title = "{PHAVer}: Algorithmic Verification of Hybrid Systems Past {HyTech}",
+ Journal = "Software Tools for Technology Transfer",
+ Publisher = "Springer-Verlag, Berlin",
+ Volume = 10,
+ Number = 3,
+ Year = 2008,
+ Pages = "263--279",
+ Abstract = "In 1995, HyTech broke new ground as a potentially
+ powerful tool for verifying hybrid systems --- yet its
+ appicability remains limited to relatively simple
+ systems. We address the main problems of HyTech with
+ PHAVer, a new tool for the exact verification of safety
+ properties of hybrid systems with piecewise constant
+ bounds on the derivatives. Affine dynamics are handled
+ by on-the-fly overapproximation, partitioning the state
+ space based on user-definable constraints and the
+ dynamics of the system. PHAVer features exact arithmetic
+ in a robust implementation that, based on the Parma
+ Polyhedra Library, supports arbitrarily large
+ numbers. To manage the complexity of the polyhedral
+ computations, we propose methods to conservatively limit
+ the number of bits and constraints of
+ polyhedra. Experimental results for a navigation
+ benchmark and a tunnel diode circuit show the
+ effectiveness of the approach."
+}
+
+ at Inproceedings{FrehseKRM06,
+ Author = "G. Frehse and B. H. Krogh and R. A. Rutenbar and O. Maler",
+ Title = "Time Domain Verification of Oscillator Circuit Properties",
+ Booktitle = "Proceedings of the First Workshop on Formal Verification
+ of Analog Circuits (FAC 2005)",
+ Address = "Edinburgh, Scotland",
+ Pages = "9--22",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 153,
+ Number = 3,
+ Year = 2006,
+ Abstract = "The application of formal methods to analog and mixed
+ signal circuits requires efficient methods for
+ constructing abstractions of circuit behaviors. This
+ paper concerns the verification of properties of
+ oscillator circuits. Generic monitor automata are
+ proposed to facilitate the application of hybrid system
+ reachability computations to characterize time domain
+ features of oscillatory behavior, such as bounds on the
+ signal amplitude and jitter. The approach is illustrated
+ for a nonlinear tunnel-diode circuit model using PHAVer,
+ a hybrid system analysis tool that provides sound
+ verification results based on linear hybrid automata
+ approximations and infinite precision computations."
+}
+
+ at Inproceedings{FrehseKR06,
+ Author = "G. Frehse and B. H. Krogh and R. A. Rutenbar",
+ Title = "Verifying Analog Oscillator Circuits Using Forward/Backward
+ Refinement",
+ Booktitle = "Proceedings of the 9th Conference on Design, Automation
+ and Test in Europe (DATE 06)",
+ Address = "Munich, Germany",
+ Publisher = "ACM SIGDA",
+ Year = 2006,
+ Note = "{CD-ROM} publication",
+ Abstract = "Properties of analog circuits can be verified formally
+ by partitioning the continuous state space and applying
+ hybrid system verification techniques to the resulting
+ abstraction. To verify properties of oscillator
+ circuits, cyclic invariants need to be computed. Methods
+ based on forward reachability have proven to be
+ inefficient and in some cases inadequate in constructing
+ these invariant sets. In this paper we propose a novel
+ approach combining forward- and backward-reachability
+ while iteratively refining partitions at each step. The
+ technique can yield dramatic memory and runtime
+ reductions. We illustrate the effectiveness by
+ verifying, for the first time, the limit cycle
+ oscillation behavior of a third-order model of a
+ differential VCO circuit."
+}
+
+ at Inproceedings{FribourgK11,
+ author = "L. Fribourg and U. K{\"u}hne",
+ title = "Parametric Verification and Test Coverage for Hybrid Automata
+ Using the Inverse Method",
+ Booktitle = "In Proceedings of the 5th International Workshop
+ on Reachability Problems (RP 2011)",
+ Address = "Genova, Italy",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "G. Delzanno and I. Potapov",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-24287-8",
+ Pages = "191--204",
+ Volume = 6945,
+ Year = 2011,
+ Abstract = "Hybrid systems combine continuous and discrete
+ behavior. Hybrid Automata are a powerful formalism for
+ the modeling and verification of such systems. A common
+ problem in hybrid system verification is the good
+ parameters problem, which consists in identifying a set
+ of parameter valuations which guarantee a certain
+ behavior of a system. Recently, a method has been
+ presented for attacking this problem for Timed
+ Automata. In this paper, we show the extension of this
+ methodology for hybrid automata with linear and affine
+ dynamics. The method is demonstrated with a hybrid
+ system benchmark from the literature."
+}
+
+ at PhdThesis{Gobert07th,
+ Author = "F. Gobert",
+ Title = "Towards putting abstract interpretation of {Prolog} into practice:
+ design, implementation, and evaluation of a tool to verify
+ and optimise Prolog programs",
+ School = "Universit\'e catholique de Louvain",
+ Address = "Louvain-la-Neuve, Belgium",
+ Month = dec,
+ Year = 2007,
+ Abstract = "Logic programming is an attractive paradigm that allows
+ the programmer to concentrate on the meaning (the logic)
+ of the problem to be solved - the \emph{declarative layer}.
+ An execution model is then used as the problem solver - the
+ \emph{operational layer}. In practice, for efficiency reasons,
+ the semantics of the two layers do not always match. For
+ instance, in Prolog, the computation of solutions is based
+ on an incomplete depth-first search rule, unifications and
+ negations may be unsound, some builtin language primitives
+ are not multidirectional, and there exist extralogical
+ features like the cut or dynamic predicates. A large number
+ of work has been realised to reconcile the declarative and
+ operational features of Prolog. Methodologies have been
+ proposed to construct operationally correct and efficient
+ Prolog code. Researchers have designed methods to automate
+ the verification of specific operational properties on which
+ optimisation of logic programs can be based. A few tools have
+ been implemented but there is a lack of a unified framework.
+ The goal and topic of this thesis is the design, implementation,
+ and evaluation of a static analyser of Prolog programs to
+ integrate `state-of-the-art' techniques into a unified abstract
+ interpretation framework. Abstract interpretation is an
+ adequate methodology to design, justify, and combine complex
+ analyses. The analyser that we present in this thesis is based
+ on a non-implemented original proposal. The original framework
+ defines the notion of \emph{abstract sequence}, which allows
+ one to verify many desirable operational properties of a logic
+ procedure. The properties include verifying type, mode, and
+ sharing of terms, proving termination, sure success or failure,
+ and determinacy of logic procedures, as well as linear
+ relations between the size of input/output terms and the
+ number of solutions to a call. An abstract sequence maintains
+ information about the input and output terms, as well as the
+ non-failure conditions on input terms, and the number of
+ solutions for such inputs. The domains of abstract sequences
+ cooperate together and improve each other. The abstract
+ execution is performed during a single global analysis,
+ and abstract sequences are derived at each program point
+ (the information of the various domains are computed
+ simultaneously). The intended operational properties of a
+ procedure are written in formal specifications.
+ The original framework is an interesting starting point for
+ combining several analyses inside a unified framework.
+ However, it is limited and inaccurate in many ways: it is
+ not implemented, and therefore, it has not been validated
+ by experiments, it accepts only a subset of Prolog (without
+ negation, cut, conditional and disjunctive constructs), and
+ some of the proposed domains are not precise enough.
+ The basic framework is only oriented towards the verification
+ of Prolog programs, but it cannot always prove the desirable
+ properties. In this thesis, we implement and evaluate the
+ basic framework, and, more importantly, we overcome its
+ limitations to make it accurate and usable in practice:
+ the improved framework accepts any Prolog program with modules,
+ new abstract domains and operations are added, and the
+ language of specifications is more expressive. We also
+ design and implement an optimiser that generates specialised
+ code. Optimisation is essential in Prolog, but it is not easy
+ to perform by hand and it is error prone. The optimiser uses
+ the information to safely apply source-to-source
+ transformations. Code transformations include clause and
+ literal reordering, introduction of cuts, and removal
+ of redundant literals. The optimiser follows a precise
+ strategy to choose the most rewarding transformations in best
+ order.
+ This thesis shows the feasibility of a unified framework
+ that integrates many complex analyses in a single global
+ analysis. Practically and theoretically, a single global
+ analysis is more attractive than a combination of a lot of
+ separate analyses and frameworks. Many extensions have been
+ performed to obtain an accurate and usable tool devoted to
+ verification and optimisation of Prolog programs."
+}
+
+ at Inproceedings{GobertLC07,
+ Author = "F. Gobert and B. {Le Charlier}",
+ Title = "A System to Check Operational Properties of Logic Programs",
+ Pages = "245--259",
+ Booktitle = "Approches Formelles dans l'Assistance au D\'eveloppement
+ de Logiciels: Actes de la 8e conf\'erence",
+ Publisher = "Universit\'e de Namur, Belgium",
+ Editor = "M.-L. Potet and P.-Y. Schobbens and H. Toussaint and G. Saval",
+ Year = 2007,
+ ISBN = "978-2-87037-559-4",
+ Abstract = "An implemented static analyser of logic programs is presented.
+ The system is based on a unied abstract interpretation
+ framework, which allows the integration of several analyses
+ devoted to verication and optimisation. The analyser is able
+ to verify many desirable properties of logic programs executed
+ with the search-rule and other specic features of Prolog.
+ Such operational properties include verifying type, mode,
+ sharing, and linearity of terms, proving termination,
+ occur-check freeness, sure success or failure, and determinacy
+ of logic procedures, as well as linear relations between the
+ size of input/output terms and the number of solutions to a
+ call. It is emphasized how each analysis may contribute to
+ each other.",
+}
+
+ at Inproceedings{GonnordH06,
+ Author = "L. Gonnord and N. Halbwachs",
+ Title = "Combining Widening and Acceleration in Linear Relation Analysis",
+ Booktitle = "Static Analysis:
+ Proceedings of the 13th International Symposium",
+ Address = "Seoul, Korea",
+ Editor = "K. Yi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4134,
+ Pages = "144--160",
+ Year = 2006,
+ ISBN = "3-540-37756-5",
+ Abstract = "Linear Relation Analysis [CH78,Hal79] is one of the
+ first, but still one of the most powerful, abstract
+ interpretations working in an infinite lattice. As such,
+ it makes use of a widening operator to enforce the
+ convergence of fixpoint computations. While the
+ approximation due to widening can be arbitrarily refined
+ by delaying the application of widening, the analysis
+ quickly becomes too expensive with the increase of
+ delay. Previous attempts at improving the precision of
+ widening are not completely satisfactory, since none of
+ them is guaranteed to improve the precision of the
+ result, and they can nevertheless increase the cost of
+ the analysis. In this paper, we investigate an
+ improvement of Linear Relation Analysis consisting in
+ computing, when possible, the exact (abstract) effect of
+ a loop. This technique is fully compatible with the use
+ of widening, and whenever it applies, it improves both
+ the precision and the performance of the analysis.",
+}
+
+ at PhdThesis{Gopan07th,
+ Author = "D. Gopan",
+ Title = "Numeric Program Analysis Techniques with Applications
+ to Array Analysis and Library Summarization",
+ School = "University of Wisconsin",
+ Address = "Madison, Wisconsin, USA",
+ Month = aug,
+ Year = 2007,
+ Abstract = "Numeric program analysis is of great importance for the
+ areas of software engineering, software
+ verification, and security: to identify many program
+ errors, such as out-of-bounds array accesses and
+ integer overflows, which constitute the lion's share
+ of security vulnerabilities reported by CERT, an
+ analyzer needs to establish numeric properties of
+ program variables. Many important program analyses,
+ such as low-level code analysis, memory-cleanness
+ analysis, and shape analysis, rely in some ways on
+ numeric-program-analysis techniques. However,
+ existing numeric abstractions are complex (numeric
+ abstract domains are typically non-distributive, and
+ form infinite-height lattices); thus, obtaining
+ precise numeric-analysis results is by no means a
+ trivial undertaking.
+ In this thesis, we develop a suite of techniques with
+ the common goal of improving the precision and applicability
+ of numeric program analysis. The techniques address
+ various aspects of numeric analysis, such as
+ handling dynamically-allocated memory, dealing with
+ programs that manipulate arrays, improving the
+ precision of extrapolation (widening), and
+ performing interprocedural analysis. The techniques
+ use existing numeric abstractions as building
+ blocks. The communication with existing abstractions
+ is done strictly through a generic abstract-domain
+ interface. The abstractions constructed by our
+ techniques also expose that same interface, and
+ thus, are compatible with existing analysis
+ engines. As a result, our techniques are independent
+ from specific abstractions and specific analysis
+ engines, can be easily incorporated into existing
+ program-analysis tools, and should be readily
+ compatible with new abstractions to be introduced in
+ the future.
+ A practical application of numeric analysis that we consider
+ in this thesis is the automatic generation of summaries for
+ library functions from their low-level
+ implementation (that is, from a library's
+ binary). The source code for library functions is
+ typically not available. This poses a stumbling
+ block for many source-level program
+ analyses. Automatic generation of summary functions
+ will both speed up and improve the accuracy of
+ library-modeling, a process that is currently
+ carried out by hand. This thesis addresses the
+ automatic generation of summaries for memory-safety
+ analysis."
+}
+
+ at Inproceedings{GopanR06,
+ Author = "D. Gopan and T. W. Reps",
+ Title = "Lookahead Widening",
+ Booktitle = "Computer Aided Verification:
+ Proceedings of the 18th International Conference (CAV 2006)",
+ Address = "Seattle, Washington, USA",
+ Editor = "T. Ball and R. B. Jones",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4144,
+ Pages = "452--466",
+ Year = 2006,
+ Abstract = "We present \emph{lookahead widening}, a novel technique
+ for using existing widening and narrowing operators to
+ improve the precision of static analysis. This technique
+ is both self-contained and fully-automatic in the sense
+ that it does not rely on separate analyzes or human
+ involvement. We show how to integrate lookahead widening
+ into existing analyzers with minimal
+ effort. Experimental results indicate that the technique
+ is able to achieve sizable precision improvements at
+ reasonable costs.",
+}
+
+ at Inproceedings{GopanR07a,
+ Author = "D. Gopan and T. W. Reps",
+ Title = "Low-Level Library Analysis and Summarization",
+ Booktitle = "Computer Aided Verification:
+ Proceedings of the 19th International Conference (CAV 2007)",
+ Address = "Berlin, Germany",
+ Editor = "W. Damm and H. Holger",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4590,
+ Pages = "68--81",
+ Year = 2007,
+ ISBN = "3-540-73367-6",
+ Abstract = "Programs typically make extensive use of libraries,
+ including dynamically linked libraries, which are often
+ not available in source-code form, and hence not
+ analyzable by tools that work at source level (i.e.,
+ that analyze intermediate representations created from
+ source code). A common approach is to write
+ \emph{library models} by hand. A library model is a
+ collection of function stubs and variable declarations
+ that capture some aspect of the library code's
+ behavior. Because these are hand-crafted, they are
+ likely to contain errors, which may cause an analysis to
+ return incorrect results.
+
+ This paper presents a method to construct summary
+ information for a library function automatically by
+ analyzing its low-level implementation (i.e., the
+ library's binary).",
+}
+
+ at Inproceedings{GopanR07b,
+ Author = "D. Gopan and T. W. Reps",
+ Title = "Guided Static Analysis",
+ Booktitle = "Static Analysis:
+ Proceedings of the 14th International Symposium",
+ Address = "Kongens Lyngby, Denmark",
+ Editor = "G. Fil\'e and H. R. Nielson",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4634,
+ ISBN = "978-3-540-74060-5",
+ Pages = "349--365",
+ Year = 2007,
+ Abstract = "In static analysis, the semantics of the program is
+ expressed as a set of equations. The equations are
+ solved iteratively over some abstract domain. If the
+ abstract domain is distributive and satisfies the
+ ascending-chain condition, an iterative technique yields
+ the most precise solution for the equations. However, if
+ the above properties are not satisfied, the solution
+ obtained is typically imprecise. Moreover, due to
+ the properties of widening operators, the precision loss
+ is sensitive to the order in which the state-space is
+ explored.
+
+ In this paper, we introduce \emph{guided static analysis},
+ a framework for controlling the exploration of the
+ state-space of a program. The framework guides the
+ state-space exploration by applying standard
+ static-analysis techniques to a sequence of modified
+ versions of the analyzed program. As such, the framework
+ does not require any modifications to existing analysis
+ techniques, and thus can be easily integrated into
+ existing static-analysis tools.
+
+ We present two instantiations of the framework, which
+ improve the precision of widening in (i) loops with
+ multiple phases and (ii) loops in which the transformation
+ performed on each iteration is chosen non-deterministically.",
+}
+
+ at Inproceedings{GopanRS05,
+ Author = "D. Gopan and T. W. Reps and M. Sagiv",
+ Title = "A Framework for Numeric Analysis of Array Operations",
+ Booktitle = "Proceedings of the 32nd ACM SIGPLAN-SIGACT Symposium
+ on Principles of Programming Languages",
+ Address = "Long Beach, California, USA",
+ Pages = "338--350",
+ Year = 2005,
+ Abstract = "Automatic discovery of relationships among values of
+ array elements is a challenging problem due to the
+ unbounded nature of arrays. We present a framework for
+ analyzing array operations that is capable of capturing
+ numeric properties of array elements. In particular, the
+ analysis is able to establish that all array elements
+ are initialized by an array-initialization loop, as well
+ as to discover numeric constraints on the values of
+ initialized elements. The analysis is based on the
+ combination of canonical abstraction and summarizing
+ numeric domains. We describe a prototype implementation
+ of the analysis and discuss our experience with applying
+ the prototype to several examples, including the
+ verification of correctness of an insertion-sort
+ procedure."
+}
+
+ at Inproceedings{BandaG10a,
+ Author = "G. Banda and J. P. Gallagher",
+ Title = "Constraint-Based Abstraction of a Model Checker
+ for Infinite State Systems",
+ Booktitle = "Proceedings of the 23rd Workshop on (Constraint)
+ Logic Programming (WLP 2009)",
+ Editor = "U. Geske and A. Wolf",
+ Address = "Potsdam, Germany",
+ Publisher = "Potsdam Universit{\"a}tsverlag",
+ Year = 2010,
+ Pages = "109--124",
+ Abstract = "Abstract interpretation-based model checking provides an
+ approach to verifying properties of infinite-state
+ systems. In practice, most previous work on abstract
+ model checking is either restricted to verifying
+ universal properties, or develops special techniques for
+ temporal logics such as modal transition systems or
+ other dual transition systems. By contrast we apply
+ completely standard techniques for constructing abstract
+ interpretations to the abstraction of a CTL semantic
+ function, without restricting the kind of properties
+ that can be verified. Furthermore we show that this
+ leads directly to implementation of abstract model
+ checking algorithms for abstract domains based on
+ constraints, making use of an SMT solver."
+}
+
+ at Inproceedings{BandaG10b,
+ Author = "G. Banda and J. P. Gallagher",
+ Title = "Constraint-Based Abstract Semantics for Temporal Logic:
+ A Direct Approach to Design and Implementation",
+ Booktitle = "Proceedings of the 17th International Conference
+ on Logic for Programming,
+ Artificial Intelligence, and Reasoning (LPAR 2010)",
+ Address = "Yogyakarta, Indonesia",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "E. Clarke and A. Voronkov",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-17510-7",
+ Year = 2010,
+ Pages = "27--45",
+ Volume = 6355,
+ Abstract = "Abstract interpretation provides a practical approach
+ to verifying properties of infinite-state systems. We
+ apply the framework of abstract interpretation to
+ derive an abstract semantic function for the modal ?
+ -calculus, which is the basis for abstract model
+ checking. The abstract semantic function is constructed
+ directly from the standard concrete semantics together
+ with a Galois connection between the concrete
+ state-space and an abstract domain. There is no need
+ for mixed or modal transition systems to abstract
+ arbitrary temporal properties, as in previous work in
+ the area of abstract model checking. Using the modal ?
+ -calculus to implement CTL, the abstract semantics
+ gives an over-approximation of the set of states in
+ which an arbitrary CTL formula holds. Then we show that
+ this leads directly to an effective implementation of
+ an abstract model checking algorithm for CTL using
+ abstract domains based on linear constraints. The
+ implementation of the abstract semantic function makes
+ use of an SMT solver. We describe an implemented system
+ for proving properties of linear hybrid automata and
+ give some experimental results."
+}
+
+ at Inproceedings{Grosser09,
+ Author = "T. Grosser",
+ Title = "Optimization opportunities based on the polyhedral model in
+ {GRAPHITE}. How much impact has {GRAPHITE} already?",
+ Booktitle = "Proceedings of the {GCC} Developers' Summit",
+ Address = "Montreal, Quebec, Canada",
+ Year = 2009,
+ Month = jun,
+ Pages = "33--46",
+ URL = "http://www.gccsummit.org/2009/gcc09-proceedings.pdf",
+ Abstract = "The polytope model is used since many years to describe
+ standard loop optimizations like blocking, interchange
+ or fusion, but also advanced memory access optimizations
+ and automatic parallelization. Its exact mathematical
+ description of memory accesses and loop iterations
+ allows to concentrate on the optimization problem and to
+ take advantage of professional problem solving tools
+ developed for operational research. Up to today the
+ polytope model was limited to research compilers or
+ source to source transformations. Graphite generates a
+ polytope description of all programs compiled by the
+ gcc. Therefore polytope optimization techniques are not
+ limited anymore to hand selected code pieces, but can
+ actually be applied in large scale on real world
+ programs. By showing the impact of GRAPHITE on important
+ benchmarks --- ``How much runtime is actually spent in
+ code, that can be optimized by polytope optimization
+ techniques?'' --- we invite people to base their current
+ polytope research on GRAPHITE to make these
+ optimizations available to the large set of gcc compiled
+ applications."
+}
+
+ at Inproceedings{GulavaniR06,
+ Author = "B. S. Gulavani and S. K. Rajamani",
+ Title = "Counterexample Driven Refinement for Abstract Interpretation",
+ Booktitle = "Proceedings of the 12th International Conference on
+ Tools and Algorithms for the Construction and Analysis
+ of Systems (TACAS 2006)",
+ Address = "Vienna, Austria",
+ Editor = "H. Hermanns and J. Palsberg",
+ Pages = "474--488",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3920,
+ Year = 2006,
+ ISBN = "3-540-33056-9",
+ Abstract = "Abstract interpretation techniques prove properties of
+ programs by computing abstract fixpoints. All such
+ analyses suffer from the possibility of false errors. We
+ present a new counterexample driven refinement technique
+ to reduce false errors in abstract interpretations. Our
+ technique keeps track of the precision losses during
+ forward fixpoint computation, and does a precise
+ backward propagation from the error to either confirm
+ the error as a true error, or identify a refinement so
+ as to avoid the false error. Our technique is quite
+ simple, and is independent of the specific abstract
+ domain used. An implementation of our technique for
+ affine transition systems is able to prove invariants
+ generated by the StInG tool [19] without doing any
+ specialized analysis for linear relations. Thus, we hope
+ that the technique can work for other abstract domains
+ as well.We sketch how our technique can be used to
+ perform shape analysis by simply defining an appropriate
+ widening operator over shape graphs."
+}
+
+ at Inproceedings{GulwaniL-AS09,
+ Author = "S. Gulwani and T. Lev-Ami and S. Sagiv",
+ Title = "A Combination Framework for Tracking Partition Sizes",
+ Booktitle = "Proceedings of the 36th ACM SIGPLAN-SIGACT Symposium on
+ Principles of Programming Languages (POPL 2009)",
+ Address = "Savannah, Georgia, USA",
+ Editor = "Z. Shao and B. C. Pierce",
+ Publisher = "ACM Press",
+ Pages = "239--251",
+ Year = 2009,
+ ISBN = "978-1-60558-379-2",
+ Abstract = "We describe an abstract interpretation based framework
+ for proving relationships between sizes of memory
+ partitions. Instances of this framework can prove
+ traditional properties such as memory safety and program
+ termination but can also establish upper bounds on usage
+ of dynamically allocated memory. Our framework also
+ stands out in its ability to prove properties of
+ programs manipulating both heap and arrays which is
+ considered a difficult task. Technically, we define an
+ abstract domain that is parameterized by an abstract
+ domain for tracking memory partitions (sets of memory
+ locations) and by a numerical abstract domain for
+ tracking relationships between cardinalities of the
+ partitions. We describe algorithms to construct the
+ transfer functions for the abstract domain in terms of
+ the corresponding transfer functions of the
+ parameterized abstract domains. A prototype of the
+ framework was implemented and used to prove interesting
+ properties of realistic programs, including programs
+ that could not have been automatically analyzed before."
+}
+
+ at Article{HalbwachsMG06,
+ Author = "N. Halbwachs and D. Merchat and L. Gonnord",
+ Title = "Some Ways To Reduce the Space Dimension in Polyhedra Computations",
+ Journal = "Formal Methods in System Design",
+ Publisher = "Springer Netherlands",
+ Volume = 29,
+ Number = 1,
+ Pages = "79--95",
+ Year = 2006,
+ Abstract = "Convex polyhedra are often used to approximate sets of
+ states of programs involving numerical variables. The
+ manipulation of convex polyhedra relies on the so-called
+ \emph{double description}, consisting of viewing a
+ polyhedron both as the set of solutions of a system of
+ linear inequalities, and as the convex hull of a
+ \emph{system of generators}, i.e., a set of vertices and
+ rays. The cost of these manipulations is highly
+ dependent on the number of numerical variables, since
+ the size of each representation can be exponential in
+ the dimension of the space. In this paper, we
+ investigate some ways for reducing the dimension: On one
+ hand, when a polyhedron satisfies \emph{affine
+ equations}, these equations can obviously be used to
+ eliminate some variables. On the other hand, when groups
+ of variables are unrelated with each other, this means
+ that the polyhedron is in fact a \emph{Cartesian
+ product} of polyhedra of lower dimensions. Detecting
+ such Cartesian factoring is not very difficult, but we
+ adapt also the operations to work on Cartesian
+ products. Finally, we extend the applicability of
+ Cartesian factoring by applying suitable \emph{variable
+ change}, in order to maximize the factoring."
+}
+
+ at Inproceedings{HalbwachsMP-V03,
+ Author = "N. Halbwachs and D. Merchat and C. Parent-Vigouroux",
+ Title = "Cartesian Factoring of Polyhedra in Linear Relation Analysis",
+ Booktitle = "Static Analysis:
+ Proceedings of the 10th International Symposium",
+ Address = "San Diego, California, USA",
+ Editor = "R. Cousot",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2694,
+ Year = 2003,
+ Pages = "355--365",
+ Abstract = "Linear Relation Analysis [CH78] suffers from the cost of
+ operations on convex polyhedra, which can be exponential
+ with the number of involved variables. In order to
+ reduce this cost, we propose to detect when a polyhedron
+ is a Cartesian product of polyhedra of lower dimensions,
+ i.e., when groups of variables are unrelated with each
+ other. Classical operations are adapted to work on such
+ factored polyhedra. Our implementation shows encouraging
+ experimental results."
+}
+
+ at Inproceedings{HenriksenG06,
+ Author = "K. S. Henriksen and J. P. Gallagher",
+ Title = "Abstract Interpretation of {PIC} Programs
+ through Logic Programming",
+ Booktitle = "Proceedings of the 6th IEEE International Workshop
+ on Source Code Analysis and Manipulation",
+ Address = "Sheraton Society Hill, Philadelphia, PA, USA",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "184--196",
+ Year = 2006,
+ Abstract = "A logic based general approach to abstract
+ interpretation of low-level machine programs is
+ reported. It is based on modelling the behavior of the
+ machine as a logic program. General purpose program
+ analysis and transformation of logic programs, such as
+ partial evaluation and convex hull analysis, are applied
+ to the logic based model of the machine.
+
+ A small PIC microcontroller is used as a case study. An
+ emulator for this microcontroller is written in Prolog,
+ and standard programming transformations and analysis
+ techniques are used to specialise this emulator with
+ respect to a given PIC program. The specialised emulator
+ can now be further analysed to gain insight into the
+ given program for the PIC microcontroller.
+
+ The method describes a general framework for applying
+ abstractions, illustrated here by linear constraints and
+ convex hull analysis, to logic programs. Using these
+ techniques on the specialised PIC emulator, it is
+ possible to obtain constraints on and linear relations
+ between data registers, enabling detection of for
+ instance overflows, branch conditions and so on."
+}
+
+ at PhdThesis{Henriksen07th,
+ Author = "K. S. Henriksen",
+ Title = "A Logic Programming Based Approach to Applying
+ Abstract Interpretation to Embedded Software",
+ School = "Computer Science, Roskilde University",
+ Month = oct,
+ Address = "Roskilde, Denmark",
+ Year = 2007,
+ Note = "Published as Computer Science Research Report \#117",
+ Abstract = "Abstract interpretation is a general framework for
+ static program analysis. In recent years this framework
+ has been used outside academia for verification of
+ embedded and real-time systems. Airbus and the European
+ Space Agency are examples of organisations that have
+ successfully adapted this analysis framework
+ for verification of critical components.
+ Logic programming is a programming paradigm with a sound
+ mathematical foundation. One of its characteristics is
+ the separation of logic (the meaning of a program) and
+ control (how it is executed); hence logic programming,
+ and in particular its extension with constraints, is a
+ language comparatively well suited for program analysis.
+ In this thesis logic programming is used to analyse
+ software developed for embedded systems. The particular
+ embedded system is modeled as an emulator written as a
+ constraint logic program. The emulator is specialised
+ with respect to some object program in order to obtain
+ a constraint logic program isomorphic to this object
+ program. Applying abstract interpretation based
+ analysers to the specialised emulator will provide
+ analysis results that can directly be related back
+ to the object program due to the isomorphism maintained
+ between the object program and the specialised emulator.
+ Two abstract interpretation based analysers for logic
+ programs have been developed. The first is a convex
+ polyhedron analyser for constraint logic programs
+ implementing a set of widening techniques for improved
+ precision of the analysis. The second analyser is a type
+ analysis tool for logic programs that automatically
+ derives a pre-interpretation from a regular type definition.
+ Additionallly, a framework for using a restricted form of
+ logic programming, namely Datalog, to express and check
+ program properties is described. At the end of the thesis
+ it is shown how instrumenting the semantics of the emulator
+ can be used to obtain, for instance, a fully automatic
+ Worst Case Execution Time analysis by applying the convex
+ polyhedron analyser to the instrumented and specialised
+ emulator. The tools developed in this thesis have all
+ been made available online for demonstration."
+}
+
+ at Inproceedings{HymansU04,
+ Author = "C. Hymans and E. Upton",
+ Title = "Static Analysis of Gated Data Dependence Graphs",
+ Booktitle = "Static Analysis:
+ Proceedings of the 11th International Symposium",
+ Address = "Verona, Italy",
+ Editor = "R. Giacobazzi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3148,
+ Year = 2004,
+ Pages = "197--211",
+ Abstract = "Several authors have advocated the use of the gated data
+ dependence graph as a compiler intermediate
+ representation. If this representation is to gain
+ acceptance, it is important to show that we may
+ construct static analyses which operate directly on
+ it. In this paper we present the first example of such
+ an analysis, developed using the methodology of abstract
+ interpretation. The analysis is shown to be sound with
+ respect to a concrete semantics for the representation.
+ Experimental results are presented which indicate that
+ the analysis performs well in comparison to conventional
+ techniques."
+}
+
+ at Article{JhalaM09,
+ Author = "R. Jhala and R. Majumdar",
+ Title = "Software Model Checking",
+ Journal = "ACM Computing Surveys",
+ Volume = 41,
+ Number = 4,
+ Year = 2009,
+ Pages = "1--54",
+ Publisher = "ACM Press",
+ Address = "New York, NY, USA",
+ Abstract = "We survey recent progress in software model checking."
+}
+
+ at Inproceedings{Jeannet10,
+ Author = "B. Jeannet",
+ Title = "Some Experience on the Software Engineering of
+ Abstract Interpretation Tools",
+ Booktitle = "Proceedings of Tools for Automatic Program AnalysiS
+ (TAPAS 2010)",
+ Address = "Perpignan, France",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 267,
+ Number = 2,
+ Pages = "29--42",
+ Year = 2010,
+ ISSN = "1571-0661",
+ Abstract = "The ``right'' way of writing and structuring compilers is
+ well-known. The situation is a bit less clear for static
+ analysis tools. It seems to us that a static analysis
+ tool is ideally decomposed into three building blocks:
+ (1) a front-end, which parses programs, generates
+ semantic equations, and supervises the analysis process;
+ (2) a fixpoint equation solver, which takes equations
+ and solves them; (3) and an abstract domain, on which
+ equations are interpreted. The expected advantages of
+ such a modular structure is the ability of sharing
+ development efforts between analyzers for different
+ languages, using common solvers and abstract
+ domains. However putting in practice such ideal concepts
+ is not so easy, and some static analyzers merge for
+ instance the blocks (1) and (2).
+
+ We show how we instantiated these principles with three
+ different static analyzers (addressing resp. imperative
+ sequential programs, imperative concurrent programs, and
+ synchronous dataflow programs), a generic fixpoint
+ solver (Fixpoint), and two different abstract
+ domains. We discussed our experience on the advantages
+ and the limits of this approach compared to related
+ work."
+}
+
+ at Inproceedings{JeannetM09,
+ Author = "B. Jeannet and A. Min{\'e}",
+ Title = "Apron: A Library of Numerical Abstract Domains for Static
+ Analysis",
+ Booktitle = "Computer Aided Verification,
+ Proceedings of the 21st International Conference (CAV 2009)",
+ Address = "Grenoble, France",
+ Editor = "A. Bouajjani and O. Maler",
+ Publisher = "Springer",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5643,
+ Pages = "661--667",
+ Year = 2009,
+ ISBN = "978-3-642-02657-7",
+ Abstract = "This article describes \textsc{Apron}, a freely
+ available library dedicated to the static analysis of
+ the numerical variables of programs by abstract
+ interpretation. Its goal is threefold: provide analysis
+ implementers with ready-to-use numerical abstractions
+ under a unified API, encourage the research in numerical
+ abstract domains by providing a platform for integration
+ and comparison, and provide teaching and demonstration
+ tools to disseminate knowledge on abstract
+ interpretation."
+}
+
+ at Incollection {KhalilGP09,
+ Author = "G. Khalil and E. Goubault and S. Putot",
+ Title = "The Zonotope Abstract Domain {Taylor1+}",
+ Booktitle = "Computer Aided Verification",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "A. Bouajjani and O. Maler",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-02657-7",
+ Pages = "627--633",
+ Volume = 5643,
+ Year = 2009,
+ Abstract = "Static analysis by abstract interpretation [1] aims it
+ automatically inferring properties on the behaviour of
+ programs. We focus here on a specific kind of numerical
+ invariants: the set of values taken by numerical
+ variables, with a real numbers semantics, at each
+ control point of a program."
+}
+ at Incollection{KimGR07,
+ Author = "D. Kim and G. Gupta and S. V. Rajopadhye",
+ Title = "On Control Signals for Multi-Dimensional Time",
+ Booktitle = "Languages and Compilers for Parallel Computing",
+ Editor = "G. Alm{\'a}si and C. Ca\c{s}caval and P. Wu",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Year = 2007,
+ Volume = 4382,
+ Pages = "141--155",
+ ISBN = "978-3-540-72520-6",
+ Note = "Revised papers presented at the 19th International Workshop
+ on Languages and Compilers for Parallel Computing (LCPC 2006),
+ New Orleans, Louisiana, USA, November 2--4, 2006",
+ Abstract = "Affine control loops (ACLs) comprise an important class
+ of compute- and data-intensive computations. The
+ theoretical framework for the automatic parallelization
+ of ACLs is well established. However, the hardware
+ compilation of arbitrary ACLs is still in its
+ infancy. An important component for an efficient
+ hardware implementation is a control mechanism that
+ informs each processing element (PE) which computation
+ needs to be performed and when. We formulate this
+ \emph{control signal problem} in the context of
+ compiling arbitrary ACLs parallelized with a
+ multi-dimensional schedule into hardware. We
+ characterize the logical time instants when PEs need a
+ control signal indicating which particular computations
+ need to be performed. Finally, we present an algorithm
+ to compute the minimal set of logical time instants for
+ these control signals."
+}
+
+ at Inproceedings{KruegelKMRV05,
+ Author = "C. Kruegel and E. Kirda and D. Mutz and W. Robertson and G. Vigna",
+ Title = "Automating Mimicry Attacks Using Static Binary Analysis",
+ Booktitle = "Proceedings of Security~'05,
+ the 14th USENIX Security Symposium",
+ Address = "Baltimore, MD, USA",
+ Year = 2005,
+ Pages = "161--176",
+ Abstract = "Intrusion detection systems that monitor sequences of
+ system calls have recently become more sophisticated in
+ defining legitimate application behavior. In particular,
+ additional information, such as the value of the program
+ counter and the configuration of the program's call
+ stack at each system call, has been used to achieve
+ better characterization of program behavior. While there
+ is common agreement that this additional information
+ complicates the task for the attacker, it is less clear
+ to which extent an intruder is constrained.
+ In this paper, we present a novel technique to evade the
+ extended detection features of state-of-the-art
+ intrusion detection systems and reduce the task of the
+ intruder to a traditional mimicry attack. Given a
+ legitimate sequence of system calls, our technique
+ allows the attacker to execute each system call in the
+ correct execution context by obtaining and relinquishing
+ the control of the application's execution flow through
+ manipulation of code pointers.
+ We have developed a static analysis tool for Intel x86
+ binaries that uses symbolic execution to automatically
+ identify instructions that can be used to redirect
+ control flow and to compute the necessary modifications
+ to the environment of the process. We used our tool to
+ successfully exploit three vulnerable programs and evade
+ detection by existing state-of-the-art system call
+ monitors. In addition, we analyzed three real-world
+ applications to verify the general applicability of our
+ techniques."
+}
+
+ at Inproceedings{LagoonMS03,
+ Author = "V. Lagoon and F. Mesnard and P. J. Stuckey",
+ Title = "Termination Analysis with Types Is More Accurate",
+ Booktitle = "Logic Programming: Proceedings of the
+ 19th International Conference (ICLP 2003)",
+ Address = "Mumbai, India",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 2916,
+ Year = 2003,
+ Pages = "254--268",
+ Abstract = "In this paper we show how we can use size and groundness
+ analyses lifted to regular and (polymorphic)
+ Hindley/Milner typed programs to determine more accurate
+ termination of (type correct) programs. Type information
+ for programs may be either inferred automatically or
+ declared by the programmer. The analysis of the typed
+ logic programs is able to completely reuse a framework
+ for termination analysis of untyped logic programs by
+ using abstract compilation of the type abstraction. We
+ show that our typed termination analysis is uniformly
+ more accurate than untyped termination analysis for
+ regularly typed programs, and demonstrate how it is able
+ to prove termination of programs which the untyped
+ analysis can not."
+}
+
+ at Inproceedings{LavironL09,
+ Author = "V. Laviron and F. Logozzo",
+ Title = "SubPolyhedra: A (More) Scalable Approach to Infer Linear
+ Inequalities",
+ Booktitle = "Verification, Model Checking, and Abstract Interpretation:
+ Proceedings of the 10th International Conference (VMCAI 2009)",
+ Address = "Savannah, Georgia, USA",
+ Editor = "N. D. Jones and M. M{\"u}ller-Olm",
+ Pages = "229--244",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5403,
+ Year = 2009,
+ ISBN = "978-3-540-93899-6",
+ Abstract = "We introduce Subpolyhedra (\textsf{SubPoly}) a new
+ numerical abstract domain to infer and propagate linear
+ inequalities. \textsf{SubPoly} is as expressive as
+ Polyhedra, but it drops some of the deductive power to
+ achieve scalability. \textsf{SubPoly} is based on the
+ insight that the reduced product of linear equalities
+ and intervals produces powerful yet scalable analyses.
+ Precision can be recovered using hints. Hints can be
+ automatically generated or provided by the user in the
+ form of annotations. We implemented \textsf{SubPoly} on
+ the top of \texttt{Clousot}, a generic abstract
+ interpreter for \texttt{.Net}. \texttt{Clousot} with
+ \textsf{SubPoly} analyzes very large and complex code
+ bases in few minutes. \textsf{SubPoly} can efficiently
+ capture linear inequalities among hundreds of variables,
+ a result well-beyond state-of-the-art implementations of
+ Polyhedra."
+}
+
+ at Inproceedings{LeconteB06,
+ Author = "M. Leconte and B. Berstel",
+ Title = "Extending a {CP} Solver with Congruences
+ as Domains for Program Verification",
+ Booktitle = "Proceedings of the 1st workshop on Constraints
+ in Software Testing, Verification and Analysis (CSTVA '06)",
+ Address = "Nantes, France",
+ Editor = "B. Blanc and A. Gotlieb and C. Michel",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "22--33",
+ Year = 2006,
+ Abstract = "Constraints generated for Program Verification tasks
+ very often involve integer variables ranging on all the
+ machine-representable integer values. Thus, if the
+ propagation takes a time that is linear in the size of
+ the domains, it will not reach a fix point in practical
+ time. Indeed, the propagation time needed to reduce the
+ interval domains for as simple equations as $x = 2y + 1$
+ and $x = 2z$ is proportional to the size of the initial
+ domains of the variables. To avoid this \emph{slow
+ convergence} phenomenon, we propose to enrich a
+ Constraint Programming Solver (CP Solver) with
+ \emph{congruence domains}. This idea has been introduced
+ by [Granger, P.: Static analysis of arithmetic congruences.
+ International Journal of Computer Math (1989) 165--199]
+ in the abstract interpretation community and we show how
+ a CP Solver can benefit from it, for example in
+ discovering immediately that $12x + |y| = 3$ and
+ $4z + 7y = 0$ have no integer solution.",
+ Note = "Available at
+ \url{http://www.irisa.fr/manifestations/2006/CSTVA06/}."
+}
+
+ at Inproceedings{LimeRST09,
+ Author = "D. Lime and O. H. Roux and C. Seidner and L.-M. Traonouez",
+ Title = "Romeo: A Parametric Model-Checker for {Petri} Nets
+ with Stopwatches",
+ Booktitle = "Proceedings of the 15th International Conference
+ Tools and Algorithms for the Construction and Analysis
+ of Systems (TACAS 2009)",
+ Address = "York, UK",
+ Editor = "S. Kowalewski and A. Philippou",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5505,
+ Pages = "54--57",
+ Year = 2009,
+ ISBN = "978-3-642-00767-5",
+ Abstract = "Last time we reported on Romeo, analyses with this tool
+ were mostly based on translations to other tools. This
+ new version provides an integrated TCTL model-checker
+ and has gained in expressivity with the addition of
+ parameters. Although there exists other tools to compute
+ the state-space of stopwatch models, Romeo is the first
+ one that performs TCTL model-checking on stopwatch
+ models. Moreover, it is the first tool that performs
+ TCTL model-checking on timed parametric models. Indeed,
+ Romeo now features an efficient model-checking of time
+ Petri nets using the Uppaal DBM Library, the
+ model-checking of stopwatch Petri nets and parametric
+ stopwatch Petri nets using the Parma Polyhedra Library
+ and a graphical editor and simulator of these
+ models. Furthermore, its audience has increased leading
+ to several industrial contracts. This paper reports on
+ these recent developments of Romeo."
+}
+
+ at Inproceedings{LogozzoF08,
+ Author = "F. Logozzo and M. F{\"a}hndrich",
+ Title = "Pentagons: A Weakly Relational Abstract Domain for the
+ Efficient Validation of Array Accesses",
+ Booktitle = "Proceedings of the 2008 ACM Symposium on Applied Computing
+ (SAC 2008)",
+ Address = "Fortaleza, Cear\'a, Brazil",
+ Aditor = "R. L. Wainwright and H. Haddad",
+ Year = 2008,
+ Pages = "184--188",
+ Publisher = "ACM Press",
+ ISBN = "978-1-59593-753-7",
+ Abstract = "We introduce Pentagons (\textsf{Pntg}), a weakly
+ relational numerical abstract domain useful for the
+ validation of array accesses in byte-code and
+ intermediate languages (IL). This abstract domain
+ captures properties of the form of
+ $x \in [a. b] \wedge x < y$. It is more precise than the
+ well known Interval domain, but it is less precise than
+ the Octagon domain. The goal of \textsf{Pntg} is to be
+ a lightweight numerical domain useful for adaptive
+ static analysis, where \textsf{Pntg} is used to quickly
+ prove the safety of most array accesses, restricting the
+ use of more precise (but also more expensive) domains to
+ only a small fraction of the code. We implemented the
+ \textsf{Pntg} abstract domain in \texttt{Clousot}, a
+ generic abstract interpreter for .NET assemblies. Using
+ it, we were able to validate 83\% of array accesses in
+ the core runtime library \texttt{mscorlib.dll} in less
+ than 8 minutes."
+}
+
+ at Inproceedings{MakhloufK06,
+ Author = "I. B. Makhlouf and S. Kowalewski",
+ Title = "An Evaluation of Two Recent Reachability Analysis Tools
+ for Hybrid Systems",
+ Booktitle = "Proceedings of the 2nd IFAC Conference on Analysis
+ and Design of Hybrid Systems",
+ Address = "Alghero, Italy",
+ Editor = "C. Cassandras and A. Giua and C. Seatzu and J. Zaytoon",
+ Publisher = "Elsevier Science B.V.",
+ Year = 2006,
+ Abstract = "The hybrid systems community is still struggling to
+ provide practically applicable verification
+ tools. Recently, two new tools, PHAVer and Hsolver, were
+ introduced which promise to be a further step in this
+ direction. We evaluate and compare both tools with the
+ help of several benchmark examples. The results show
+ that both have their strengths and weaknesses, and that
+ there still is no all-purpose reachability analysis tool
+ for hybrid systems."
+}
+
+ at Inproceedings{ManevichSRF04,
+ Author = "R. Manevich and M. Sagiv and G. Ramalingam and J. Field",
+ Title = "Partially Disjunctive Heap Abstraction",
+ Booktitle = "Static Analysis:
+ Proceedings of the 11th International Symposium",
+ Address = "Verona, Italy",
+ Editor = "R. Giacobazzi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3148,
+ Year = 2004,
+ Pages = "265--279",
+ Abstract = "One of the continuing challenges in abstract
+ interpretation is the creation of abstractions that
+ yield analyses that are both tractable and precise
+ enough to prove interesting properties about real-world
+ programs. One source of difficulty is the need to handle
+ programs with different behaviors along different
+ execution paths. Disjunctive (powerset) abstractions
+ capture such distinctions in a natural way. However, in
+ general, powerset abstractions increase the space and
+ time by an exponential factor. Thus, powerset
+ abstractions are generally perceived as being very
+ costly. In this paper we partially address this
+ challenge by presenting and empirically evaluating a new
+ heap abstraction. The new heap abstraction works by
+ merging shape descriptors according to a partial
+ isomorphism similarity criteria, resulting in a
+ partially disjunctive abstraction. We implemented this
+ abstraction in TVLA --- a generic system for
+ implementing program analyses. We conducted an empirical
+ evaluation of the new abstraction and compared it with
+ the powerset heap abstraction. The experiments show that
+ analyses based on the partially disjunctive abstraction
+ are as precise as the ones based on the fully
+ disjunctive abstraction. In terms of performance,
+ analyses based on the partially disjunctive abstraction
+ are often superior to analyses based on the fully
+ disjunctive heap abstraction. The empirical results show
+ considerable speedups, up to 2 orders of magnitude,
+ enabling previously non-terminating analyses, such as
+ verification of the Deutsch-Schorr-Waite marking
+ algorithm, to terminate with no negative effect on the
+ overall precision. Indeed, experience indicates that the
+ partially disjunctive shape abstraction improves
+ performance across all TVLA analyses uniformly, and in
+ many cases is essential for making precise shape
+ analysis feasible."
+}
+
+ at Techreport{McCloskeyS09TR,
+ Author = "B. McCloskey and M. Sagiv",
+ Title = "Combining Quantified Domains",
+ Number = "EECS-2009-106",
+ Year = 2009,
+ Month = jul,
+ Institution = "EECS Department University of California",
+ Address = "Berkeley USA",
+ URL = "http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-106.pdf",
+ Abstract = "We develop general algorithms for reasoning about
+ numerical properties of programs manipulating the heap
+ via pointers. We automatically infer quantified
+ invariants regarding unbounded sets of memory locations
+ and unbounded numeric values. As an example, we can
+ infer that for every node in a data structure, the
+ node's length field is less than its capacity field. We
+ can also infer per-node statements about cardinality,
+ such as that each node's count field is equal to the
+ number of elements reachable from it. This additional
+ power allows us to prove properties about reference
+ counted data structures and B-trees that were previously
+ unattainable. Besides the ability to verify more
+ programs, we believe that our work sheds new light on
+ the interaction between heap and numerical reasoning.
+
+ Our algorithms are parametric in the heap and the
+ numeric abstractions. They permit heap and numerical
+ abstractions to be combined into a single abstraction
+ while maintaining correlations between these
+ abstractions. In certain combinations not involving
+ cardinality, we prove that our combination technique is
+ complete, which is surprising in the presence of
+ quantification."
+}
+
+ at PhdThesis{Meijer10th,
+ Author = "S. Meijer",
+ Title = "Transformations for Polyhedral Process Networks",
+ School = "Leiden Institute of Advanced Computer Science (LIACS),
+ Faculty of Science, Leiden University",
+ Address = "Leiden, The Netherlands",
+ Year = 2010,
+ ISBN = "978-90-9025792-1",
+ Abstract = "We use the polyhedral process network (PPN) model of
+ computation to program and map streaming applications
+ onto embedded Multi-Processor Systems on Chip (MPSoCs)
+ platforms. The PPNs, which can be automatically derived
+ from sequential program applications, do not necessarily
+ meet the performance/resource constraints. A designer
+ can therefore apply the process splitting
+ transformations to increase program performance, and the
+ process merging transformation to reduce the number of
+ processes in a PPN. These transformations were defined,
+ but a designer had many possibilities to apply a
+ particular transformation, and these transformations can
+ also be ordered in many different ways. In this
+ dissertation, we define compile-time solution approaches
+ that assist the designer in evaluating and applying
+ process splitting and merging transformations in the
+ most effective way."
+}
+
+ at Article{MesnardB05TPLP,
+ Author = "F. Mesnard and R. Bagnara",
+ Title = "{cTI}: A Constraint-Based Termination Inference Tool
+ for {ISO-Prolog}",
+ Journal = "Theory and Practice of Logic Programming",
+ Publisher = "Cambridge University Press",
+ Address = "New York",
+ Volume = 5,
+ Number = "1{\&}2",
+ Pages = "243--257",
+ Year = 2005,
+ Abstract = "We present cTI, the first system for universal
+ left-termination inference of logic programs.
+ Termination inference generalizes termination analysis
+ and checking. Traditionally, a termination analyzer
+ tries to prove that a given class of queries terminates.
+ This class must be provided to the system, for instance
+ by means of user annotations. Moreover, the analysis
+ must be redone every time the class of queries of
+ interest is updated. Termination inference, in
+ contrast, requires neither user annotations nor
+ recomputation. In this approach, terminating classes
+ for all predicates are inferred at once. We describe
+ the architecture of cTI and report an extensive
+ experimental evaluation of the system covering many
+ classical examples from the logic programming
+ termination literature and several Prolog programs of
+ respectable size and complexity."
+}
+
+ at Inproceedings{MonniauxG11,
+ Author = "D. Monniaux and J. {Le Guen}",
+ Title = "Stratified Static Analysis Based on Variable Dependencies",
+ Booktitle = "Proceedings of the Third International Workshop on
+ Numerical and Symbolic Abstract Domains (NSAD 2011)",
+ Address = "Venice, Italy",
+ Year = 2011,
+ URL = "http://arxiv.org/abs/1109.2405",
+ Abstract = "In static analysis by abstract interpretation, one often
+ uses \emph{widening operators} in order to enforce
+ convergence within finite time to an inductive
+ invariant. Certain widening operators, including the
+ classical one over finite polyhedra, exhibit an
+ unintuitive behavior: analyzing the program over a
+ subset of its variables may lead a more precise result
+ than analyzing the original program! In this article, we
+ present simple workarounds for such behavior."
+
+}
+
+ at Inproceedings{MoserKK07,
+ Author = "A. Moser and C. Kr{\"u}gel and E. Kirda",
+ Title = "Exploring Multiple Execution Paths for Malware Analysis",
+ Booktitle = "Proceedings of the 2007 IEEE Symposium on Security and Privacy
+ (S{\&}P 2007)",
+ Address = "Oakland, California, USA",
+ Publisher = "IEEE Computer Society Press",
+ Pages = "231--245",
+ Year = 2007,
+ Abstract = "Malicious code (or malware) is defined as software that
+ fulfills the deliberately harmful intent of an
+ attacker. Malware analysis is the process of determining
+ the behavior and purpose of a given malware sample (such
+ as a virus, worm, or Trojan horse). This process is a
+ necessary step to be able to develop effective detection
+ techniques and removal tools. Currently, malware
+ analysis is mostly a manual process that is tedious and
+ time-intensive. To mitigate this problem, a number of
+ analysis tools have been proposed that automatically
+ extract the behavior of an unknown program by executing
+ it in a restricted environment and recording the
+ operating system calls that are invoked. The problem of
+ dynamic analysis tools is that only a single program
+ execution is observed. Unfortunately, however, it is
+ possible that certain malicious actions are only
+ triggered under specific circumstances (e.g., on a
+ particular day, when a certain file is present, or when
+ a certain command is received). In this paper, we
+ propose a system that allows us to explore multiple
+ execution paths and identify malicious actions that are
+ executed only when certain conditions are met. This
+ enables us to automatically extract a more complete view
+ of the program under analysis and identify under which
+ circumstances suspicious actions are carried out. Our
+ experimental results demonstrate that many malware
+ samples show different behavior depending on input read
+ from the environment. Thus, by exploring multiple
+ execution paths, we can obtain a more complete picture
+ of their actions."
+}
+
+ at Inproceedings{NavasMH09,
+ Author = "J. Navas and M. M{\'e}ndez-Lojo and M. V. Hermenegildo",
+ Title = "User-Definable Resource Usage Bounds Analysis for {Java} Bytecode",
+ Booktitle = "Proceedings of the 4th Workshop on Bytecode Semantics,
+ Verification, Analysis and Transformation (Bytecode 2009)",
+ Address = "York, UK",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 253,
+ Number = 5,
+ Pages = "65--82",
+ Year = 2009,
+ ISSN = "1571-0661",
+ Abstract = "Automatic cost analysis of programs has been
+ traditionally concentrated on a reduced number of
+ resources such as execution steps, time, or
+ memory. However, the increasing relevance of analysis
+ applications such as static debugging and/or
+ certification of user-level properties (including for
+ mobile code) makes it interesting to develop analyses
+ for resource notions that are actually
+ application-dependent. This may include, for example,
+ bytes sent or received by an application, number of
+ files left open, number of SMSs sent or received, number
+ of accesses to a database, money spent, energy
+ consumption, etc. We present a fully automated analysis
+ for inferring upper bounds on the usage that a Java
+ bytecode program makes of a set of application
+ programmer-definable resources. In our context, a
+ resource is defined by programmer-provided annotations
+ which state the basic consumption that certain program
+ elements make of that resource. From these definitions
+ our analysis derives functions which return an upper
+ bound on the usage that the whole program (and
+ individual blocks) make of that resource for any given
+ set of input data sizes. The analysis proposed is
+ independent of the particular resource. We also present
+ some experimental results from a prototype
+ implementation of the approach covering a significant
+ set of interesting resources."
+}
+
+ at Inproceedings{CuervoParrinoNVM12,
+ Author = "B. {Cuervo Parrino} and J. Narboux and E. Violard and N. Magaud",
+ Title = "Dealing with Arithmetic Overflows in the Polyhedral Model",
+ Booktitle = "Proceedings of the 2nd International Workshop
+ on Polyhedral Compilation Techniques (IMPACT 2012)",
+ Address = "Paris, France",
+ Editor = "U. Bondhugula and V. Loechner ",
+ Year = 2012,
+ URL = "http://hal.inria.fr/hal-00655485",
+ Abstract = "The polyhedral model provides techniques to optimize
+ Static Control Programs (SCoP) using some complex
+ transforma- tions which improve data-locality and which
+ can exhibit parallelism. These advanced
+ transformations are now available in both GCC and
+ LLVM. In this paper, we focus on the cor- rectness of
+ these transformations and in particular on the problem
+ of integer overflows. Indeed, the strength of the
+ polyhedral model is to produce an abstract mathematical
+ representation of a loop nest which allows high-level
+ trans- formations. But this abstract representation is
+ valid only when we ignore the fact that our integers are
+ only machine integers. In this paper, we present a
+ method to deal with this problem of mismatch between the
+ mathematical and concrete representations of loop
+ nests. We assume the exis- tence of polyhedral
+ optimization transformations which are proved to be
+ correct in a world without overflows and we provide a
+ self-verifying compilation function. Rather than
+ verifying the correctness of this function, we use an
+ approach based on a validator, which is a tool that is
+ run by the com- piler after the transformation itself
+ and which confirms that the code produced is equivalent
+ to the original code. As we aim at the formal proof of
+ the validator we implement this validator using the Coq
+ proof assistant as a programming language [4]."
+
+}
+
+ at Inproceedings{PayetS07,
+ Author = "E. Payet and F. Spoto",
+ Title = " Magic-Sets Transformation for the Analysis of {Java} Bytecode",
+ Booktitle = "Static Analysis:
+ Proceedings of the 14th International Symposium",
+ Address = "Kongens Lyngby, Denmark",
+ Editor = "G. Fil\'e and H. R. Nielson",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4634,
+ ISBN = "978-3-540-74060-5",
+ Pages = "452--467",
+ Year = 2007,
+ Abstract = "Denotational static analysis of Java bytecode has a nice
+ and clean compositional definition and an efficient
+ implementation with binary decision diagrams. But it
+ models only the \emph{functional} i.e., input/output
+ behaviour of a program $P$, not enough if one needs $P$'s
+ \emph{internal} behaviours i.e., from the input to some
+ internal program points. We overcome this limitation
+ with a technique used up to now for logic programs
+ only. It adds new \emph{magic} blocks of code to P, whose
+ functional behaviours are the internal behaviours of
+ $P$. We prove this transformation correct with an
+ operational semantics. We define an equivalent
+ denotational semantics, whose denotations for the
+ magic blocks are hence the internal behaviours of
+ $P$. We implement our transformation and instantiate
+ it with abstract domains modelling \emph{sharing} of two
+ variables and \emph{non-cyclicity} of variables. We get a
+ static analyser for full Java bytecode that is
+ faster and scales better than another operational
+ pair-sharing analyser and a constraint-based pointer
+ analyser."
+}
+
+ at Inproceedings{PerezRS09,
+ Author = "J. A. {Navarro P{\'e}rez} and A. Rybalchenko and A. Singh",
+ Title = "Cardinality Abstraction for Declarative Networking Applications",
+ Booktitle = "Computer Aided Verification,
+ Proceedings of the 21st International Conference (CAV 2009)",
+ Address = "Grenoble, France",
+ Editor = "A. Bouajjani and O. Maler",
+ Publisher = "Springer",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5643,
+ Pages = "584--598",
+ Year = 2009,
+ ISBN = "978-3-642-02657-7",
+ Abstract = "Declarative Networking is a recent, viable approach to
+ make distributed programming easier, which is becoming
+ increasingly popular in systems and networking
+ community. It offers the programmer a declarative,
+ rule-based language, called P2, for writing distributed
+ applications in an abstract, yet expressive way. This
+ approach, however, imposes new challenges on analysis
+ and verification methods when they are applied to P2
+ programs. Reasoning about P2 computations is beyond the
+ scope of existing tools since it requires handling of
+ program states defined in terms of collections of
+ relations, which store the application data, together
+ with multisets of tuples, which represent communication
+ events in-flight. In this paper, we propose a
+ cardinality abstraction technique that can be used to
+ analyze and verify P2 programs. It keeps track of the
+ size of relations (together with projections thereof)
+ and multisets defining P2 states, and provides an
+ appropriate treatment of declarative operations, e.g.,
+ indexing, unification, variable binding, and
+ negation. Our cardinality abstraction-based verifier
+ successfully proves critical safety properties of a P2
+ implementation of the Byzantine fault tolerance protocol
+ Zyzzyva, which is a representative and complex
+ declarative networking application."
+}
+
+ at Inproceedings{PhamTTC11,
+ Author = "T.-H. Pham and M.-T. Trinh and A.-H. Truong and W.-N. Chin",
+ Title = "{FixBag:} A Fixpoint Calculator for Quantified Bag Constraints",
+ Booktitle = "Proceedings of the 23rd International Conference on
+ Computer Aided Verification (CAV 2011)",
+ Address = "Snowbird, UT, USA",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "G. Gopalakrishnan and S. Qadeer",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-22109-5",
+ Pages = "656--662",
+ Volume = 6806,
+ Year = 2011,
+ Abstract = "Abstract interpretation techniques have played a major
+ role in advancing the state-of-the-art in program
+ analysis. Traditionally, stand-alone tools for these
+ techniques have been developed for the numerical domains
+ which may be sufficient for lower levels of program
+ correctness. To analyze a wider range of programs, we
+ have developed a tool to compute symbolic fixpoints for
+ quantified bag domain . This domain is useful for
+ programs that deal with collections of values. Our tool
+ is able to derive both loop invariants and method
+ pre/post conditions via fixpoint analysis of recursive
+ bag constraints. To support better precision, we have
+ allowed disjunctive formulae to be inferred, where
+ appropriate. As a stand-alone tool, we have tested it on
+ a range of small but challenging examples with
+ acceptable precision and performance."
+}
+
+ at Techreport{Pop06,
+ Author = "S. Pop and G.-A. Silber and A. Cohen and C. Bastoul
+ and S. Girbal and N. Vasilache",
+ Title = "{GRAPHITE}: Polyhedral Analyses and Optimizations for {GCC}",
+ Number = "A/378/CRI",
+ Institution = "Centre de Recherche en Informatique,
+ \'Ecole des Mines de Paris",
+ Address = "Fontainebleau, France",
+ Year = 2006,
+ Note = "Contribution to the GNU Compilers Collection Developers Summit 2006
+ (GCC Summit 06), Ottawa, Canada, June 28--30, 2006",
+ Abstract = "We present a plan to add loop nest optimizations in GCC
+ based on polyhedral representations of loop nests. We
+ advocate a static analysis approach based on a hierarchy
+ of interchangeable abstractions with solvers that range
+ from the exact solvers such as OMEGA, to faster but less
+ precise solvers based on more coarse abstractions. The
+ intermediate representation GRAPHITE (GIMPLE Represented
+ as Polyhedra with Interchangeable Envelopes), built on
+ GIMPLE and the natural loops, hosts the high level loop
+ transformations. We base this presentation on the
+ WRaP-IT project developed in the Alchemy group at INRIA
+ Futurs and Paris-Sud University, on the PIPS compiler
+ developed at \'Ecole des mines de Paris, and on a joint
+ work with several members of the static analysis and
+ polyhedral compilation community in France.
+
+ The main goal of this project is to bring more high
+ level loop optimizations to GCC: loop fusion, tiling,
+ strip mining, etc. Thanks to the WRaP-IT experience, we
+ know that the polyhedral analyzes and transformations
+ are affordable in a production compiler. A second goal
+ of this project is to experiment with compile time
+ reduction versus attainable precision when replacing
+ operations on polyhedra with faster operations on more
+ abstract domains. However, the use of a too coarse
+ representation for computing might also result in an
+ over approximated solution that cannot be used in
+ subsequent computations. There exists a trade off
+ between speed of the computation and the attainable
+ precision that has not yet been analyzed for real world
+ programs."
+}
+
+ at Incollection{PopeeaC08,
+ Author = "C. Popeea and W.-N. Chin",
+ Title = "Inferring Disjunctive Postconditions",
+ Booktitle = "Advances in Computer Science --- ASIAN 2006. Secure Software
+ and Related Issues",
+ Editor = "M. Okada and I. Satoh",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Year = 2008,
+ Volume = 4435,
+ Pages = "331--345",
+ ISBN = "978-3-540-77504-1",
+ Note = "Revised selected papers presented at the 11th Asian Computing
+ Science Conference, Tokyo, Japan, December 6--8, 2006",
+ Abstract = "Polyhedral analysis [9] is an abstract interpretation
+ used for automatic discovery of invariant linear
+ inequalities among numerical variables of a
+ program. Convexity of this abstract domain allows
+ efficient analysis but also loses precision via
+ convex-hull and widening operators. To selectively
+ recover the loss of precision, sets of polyhedra
+ (disjunctive elements) may be used to capture more
+ precise invariants. However a balance must be struck
+ between precision and cost.
+ We introduce the notion of affinity to characterize how
+ closely related is a pair of polyhedra. Finding related
+ elements in the polyhedron (base) domain allows the
+ formulation of precise hull and widening operators
+ lifted to the disjunctive (powerset extension of the)
+ polyhedron domain. We have implemented a modular static
+ analyzer based on the disjunctive polyhedral analysis
+ where the relational domain and the proposed operators
+ can progressively enhance precision at a reasonable
+ cost."
+}
+
+ at Article{RizkBFS09,
+ Author = "A. Rizk and G. Batt and F. Fages and S. Soliman",
+ Title = "A General Computational Method for Robustness Analysis
+ with Applications to Synthetic Gene Networks",
+ Journal = "Bioinformatics",
+ Publisher = "Oxford University Press",
+ Volume = 25,
+ Number = "12",
+ Pages = "i169--i178",
+ Year = 2009,
+ Note = "Paper accepted for presentation at the 2009 ISMB/ECCB Conference,
+ Stockholm, Sweden, June 27--July 2, 2009.
+ Available at
+ \url{http://bioinformatics.oxfordjournals.org/cgi/content/abstract/25/12/i169}",
+ Abstract = "\textbf{Motivation:} Robustness is the capacity of a
+ system to maintain a function in the face of
+ perturbations. It is essential for the correct
+ functioning of natural and engineered biological
+ systems. Robustness is generally defined in an \emph{ad hoc},
+ problem-dependent manner, thus hampering the fruitful
+ development of a theory of biological robustness,
+ recently advocated by Kitano.
+
+ \textbf{Results:} In this article, we propose a general
+ definition of robustness that applies to any biological
+ function expressible in temporal logic LTL (linear
+ temporal logic), and to broad model classes and
+ perturbation types. Moreover, we propose a computational
+ approach and an implementation in BIOCHAM 2.8 for the
+ automated estimation of the robustness of a given
+ behavior with respect to a given set of
+ perturbations. The applicability and biological relevance
+ of our approach is demonstrated by testing and improving
+ the robustness of the timed behavior of a synthetic
+ transcriptional cascade that could be used as a
+ biological timer for synthetic biology applications.
+
+ \textbf{Availability:} Version 2.8 of BIOCHAM and the
+ transcriptional cascade model are available at
+ \url{http://contraintes.inria.fr/BIOCHAM/}"
+}
+
+ at Article{RizkBFS11,
+ Author = "A. Rizk and G. Batt and F. Fages and S. Soliman",
+ Title = "Continuous Valuations of Temporal Logic Specifications with
+ Applications to Parameter Optimization and Robustness
+ Measures",
+ Journal = "Theoretical Computer Science",
+ Publisher = "Elsevier",
+ Volume = 412,
+ Number = 26,
+ Pages = "2827--2839",
+ Year = 2011,
+ ISSN = "0304-3975",
+ Abstract = "Finding mathematical models satisfying a specification
+ built from the formalization of biological experiments,
+ is a common task of the modeler that techniques like
+ model-checking help solving, in the qualitative but also
+ in the quantitative case. In this article we define a
+ continuous degree of satisfaction of temporal logic
+ formulae with constraints. We show how such a
+ satisfaction measure can be used as a fitness function
+ with state-of-the-art evolutionary optimization methods
+ in order to find biochemical kinetic parameter values
+ satisfying a set of biological properties formalized in
+ temporal logic. We also show how it can be used to
+ define a measure of robustness of a biological model
+ with respect to some temporal specification. These
+ methods are evaluated on models of the cell cycle and of
+ the MAPK signaling cascade."
+}
+
+ at Inproceedings{SankaranarayananIG07,
+ Author = "S. Sankaranarayanan and F. Ivancic and A. Gupta",
+ Title = "Program Analysis Using Symbolic Ranges",
+ Booktitle = "Static Analysis:
+ Proceedings of the 14th International Symposium",
+ Address = "Kongens Lyngby, Denmark",
+ Editor = "G. Fil\'e and H. R. Nielson",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4634,
+ ISBN = "978-3-540-74060-5",
+ Pages = "366--383",
+ Year = 2007,
+ Abstract = "Interval analysis seeks static lower and upper bounds on
+ the values of program variables. These bounds are
+ useful, especially for inferring invariants to prove buffer
+ overflow checks. In practice, however, intervals by
+ themselves are often inadequate as invariants due to the
+ lack of relational information among program variables.
+ In this paper, we present a technique for deriving symbolic
+ bounds on variable values. We study a restricted class of
+ polyhedra whose constraints are stratified with respect to
+ some variable ordering provided by the user, or chosen
+ heuristically. We define a notion of normalization for
+ such constraints and demonstrate polynomial time domain
+ operations on the resulting domain of symbolic range
+ constraints. The abstract domain is intended to complement
+ widely used domains such as intervals and octagons
+ for use in buffer overflow analysis. Finally, we study
+ the impact of our analysis on commercial software using
+ an overflow analyzer for the C language."
+}
+
+ at Inproceedings{SankaranarayananSM04,
+ Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+ Title = "Constraint-Based Linear-Relations Analysis",
+ Booktitle = "Static Analysis:
+ Proceedings of the 11th International Symposium",
+ Address = "Verona, Italy",
+ Editor = "R. Giacobazzi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3148,
+ Year = 2004,
+ Pages = "53--68",
+ Abstract = "Linear-relations analysis of transition systems
+ discovers linear invariant relationships among the
+ variables of the system. These relationships help
+ establish important safety and liveness
+ properties. Efficient techniques for the analysis of
+ systems using polyhedra have been explored, leading to
+ the development of successful tools like
+ HyTech. However, existing techniques rely on the use of
+ approximations such as widening and extrapolation in
+ order to ensure termination. In an earlier paper, we
+ demonstrated the use of Farkas' Lemma to provide a
+ translation from the linear-relations analysis problem
+ into a system of constraints on the unknown coefficients
+ of a candidate invariant. However, since the constraints
+ in question are non-linear, a naive application of the
+ method does not scale. In this paper, we show that by
+ some efficient simplifications and approximations to the
+ quantifier elimination, not only does the method scale
+ to higher dimensions, but also enjoys performance
+ advantages for some larger examples."
+}
+
+ at Inproceedings{SankaranarayananSM05,
+ Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+ Title = "Scalable Analysis of Linear Systems using Mathematical Programming",
+ Booktitle = "Verification, Model Checking and Abstract Interpretation:
+ Proceedings of the 6th International Conference (VMCAI 2005)",
+ Address = "Paris, France",
+ Editor = "R. Cousot",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3385,
+ Year = 2005,
+ Pages = "25--41",
+ Abstract = "We present a method for generating linear invariants for
+ large systems. The method performs forward propagation
+ in an abstract domain consisting of arbitrary polyhedra
+ of a predefined fixed shape. The basic operations on the
+ domain like abstraction, intersection, join and
+ inclusion tests are all posed as linear optimization
+ queries, which can be solved efficiently by existing LP
+ solvers. The number and dimensionality of the LP queries
+ are polynomial in the program dimensionality, size and
+ the number of target invariants. The method generalizes
+ similar analyses in the interval, octagon, and octahedra
+ domains, without resorting to polyhedral
+ manipulations. We demonstrate the performance of our
+ method on some benchmark programs."
+}
+
+ at Inproceedings{SankaranarayananCSM06,
+ Author = "S. Sankaranarayanan and M. Col{\'o}n
+ and H. B. Sipma and Z. Manna",
+ Title = "Efficient Strongly Relational Polyhedral Analysis",
+ Booktitle = "Verification, Model Checking and Abstract Interpretation:
+ Proceedings of the 7th International Conference (VMCAI 2006)",
+ Address = "Charleston, SC, USA",
+ Editor = "E. A. Emerson and K. S. Namjoshi",
+ Pages = "111--125",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3855,
+ Year = 2006,
+ ISBN = "3-540-31139-4",
+ Abstract = "Polyhedral analysis infers invariant linear equalities
+ and inequalities of imperative programs. However, the
+ exponential complexity of polyhedral operations such as
+ image computation and convex hull limits the
+ applicability of polyhedral analysis. Weakly relational
+ domains such as intervals and octagons address the
+ scalability issue by considering polyhedra whose
+ constraints are drawn from a restricted, user-specified
+ class. On the other hand, these domains rely solely on
+ candidate expressions provided by the user. Therefore,
+ they often fail to produce strong invariants. We
+ propose a polynomial time approach to strongly
+ relational analysis. We provide efficient
+ implementations of join and post condition operations,
+ achieving a trade off between performance and
+ accuracy. We have implemented a strongly relational
+ polyhedral analyzer for a subset of the C
+ language. Initial experimental results on benchmark
+ examples are encouraging."
+}
+
+ at Inproceedings{SankaranarayananSM06,
+ Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+ Title = "Fixed Point Iteration for Computing the Time Elapse Operator",
+ Booktitle = "Hybrid Systems: Computation and Control:
+ Proceedings of the 9th International Workshop (HSCC 2006)",
+ Address = "Santa Barbara, CA, USA",
+ Editor = "J. Hespanha and A. Tiwari",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 3927,
+ Pages = "537--551",
+ Year = 2006,
+ ISBN = "3-540-33170-0",
+ Abstract = "We investigate techniques for automatically generating
+ symbolic approximations to the time solution of a system
+ of differential equations. This is an important
+ primitive operation for the safety analysis of
+ continuous and hybrid systems. In this paper we design a
+ \emph{time elapse} operator that computes a symbolic
+ over-approximation of time solutions to a continuous
+ system starting from a given initial region. Our
+ approach is iterative over the cone of functions (drawn
+ from a suitable universe) that are non negative over the
+ initial region. At each stage, we iteratively remove
+ functions from the cone whose Lie derivatives do not lie
+ inside the current iterate. If the iteration converges,
+ the set of states defined by the final iterate is shown
+ to contain all the time successors of the initial
+ region. The convergence of the iteration can be forced
+ using abstract interpretation operations such as
+ widening and narrowing. We instantiate our technique to
+ linear hybrid systems with piecewise-affine dynamics to
+ compute polyhedral approximations to the time
+ successors. Using our prototype implementation TimePass,
+ we demonstrate the performance of our technique on
+ benchmark examples."
+}
+
+ at Inproceedings{SankaranarayananISG06,
+ Author = "S. Sankaranarayanan and F. Ivan\v{c}i\'{c}
+ and I. Shlyakhter and A. Gupta",
+ Title = "Static Analysis in Disjunctive Numerical Domains",
+ Booktitle = "Static Analysis:
+ Proceedings of the 13th International Symposium",
+ Address = "Seoul, Korea",
+ Editor = "K. Yi",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4134,
+ Pages = "3--17",
+ Year = 2006,
+ ISBN = "3-540-37756-5",
+ Abstract = "The convexity of numerical domains such as polyhedra,
+ octagons, intervals and linear equalities enables
+ tractable analysis of software for buffer overflows,
+ null pointer dereferences and floating point
+ errors. However, convexity also causes the analysis to
+ fail in many common cases. Powerset extensions can
+ remedy this shortcoming by considering disjunctions of
+ predicates. Unfortunately, analysis using powerset
+ domains can be exponentially more expensive as compared
+ to analysis on the base domain. In this paper, we prove
+ structural properties of fixed points computed in
+ commonly used powerset extensions. We show that a fixed
+ point computed on a powerset extension is also a fixed
+ point in the base domain computed on an ``elaboration''
+ of the program's CFG structure. Using this insight, we
+ build analysis algorithms that approach path sensitive
+ static analysis algorithms by performing the fixed point
+ computation on the base domain while discovering an
+ ``elaboration'' on the fly. Using restrictions on the
+ nature of the elaborations, we design algorithms that
+ scale polynomially in terms of the number of
+ disjuncts. We have implemented a light-weight static
+ analyzer for C programs with encouraging initial
+ results."
+}
+
+ at Inproceedings{Simon10a,
+ Author = "A. Simon",
+ Title = "A Note on the Inversion Join for Polyhedral Analysis",
+ Booktitle = "Proceedings of the 2nd International Workshop on
+ Numerical and Symbolic Abstract Domains (NSAD 2010)",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 267,
+ Pages = "115--126",
+ Year = 2010,
+ ISSN = "1571-0661",
+ Abstract = "Linear invariants are essential in many optimization and
+ verification tasks. The domain of convex polyhedra (sets
+ of linear inequalities) has the potential to infer all
+ linear relationships. Yet, it is rarely applied to
+ larger problems due to the join operation whose most
+ precise result is given by the convex hull of two
+ polyhedra which, in turn, may be of exponential
+ size. Recently, Sankaranarayanan et al. proposed an
+ operation called inversion join to efficiently
+ approximate the convex hull. While their proposal has an
+ ad-hoc flavour, we show that it is quite principled and,
+ indeed, complete for planar polyhedra and, for general
+ polyhedra, complete on over 70% of our benchmarks."
+}
+
+ at Inproceedings{Simon10b,
+ Author = "A. Simon",
+ Title = "Speeding up Polyhedral Analysis by Identifying Common Constraints",
+ Booktitle = "Proceedings of the 2nd International Workshop on
+ Numerical and Symbolic Abstract Domains (NSAD 2010)",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 267,
+ Pages = "127--138",
+ Year = 2010,
+ ISSN = "1571-0661",
+ Abstract = "Sets of linear inequalities are an expressive reasoning
+ tool for approximating the reachable states of a
+ program. However, the most precise way to join two
+ states is to calculate the convex hull of the two
+ polyhedra that are represented by the inequality sets,
+ an operation that is exponential in the dimension of the
+ polyhedra. We investigate how similarities in the two
+ input polyhedra can be exploited to improve the
+ performance of this costly operation. In particular, we
+ discuss how common equalities and certain inequalities
+ can be omitted from the calculation without affecting
+ the result. We expose a maximum of common equalities and
+ inequalities by converting the polyhedra into a normal
+ form and give experimental evidence of the merit of our
+ method."
+}
+
+ at Inproceedings{SimonL10,
+ Author = "A. Simon and L. Chen",
+ Title = "Simple and Precise Widenings for {H-Polyhedra}",
+ Booktitle = "Proceedings of the 8th Asian Symposium
+ on the Programming Languages and Systems (APLAS 2010)",
+ Address = "Shanghai, China",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "K. Ueda",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-17163-5",
+ Pages = "139--155",
+ Volume = 6461,
+ Year = 2010,
+ Abstract = "While the definition of the revised widening for
+ polyhedra is defined in terms of inequalities, most
+ implementations use the double description method as a
+ means to an efficient implementation. We show how
+ standard widening can be implemented in a simple and
+ efficient way using a normalized H -representation
+ (constraint-only) which has become popular in recent
+ approximations to polyhedral analysis. We then detail a
+ novel heuristic for this representation that is tuned
+ to capture linear transformations of the state space
+ while ensuring quick convergence for non-linear
+ transformations for which no precise linear invariants
+ exist."
+}
+
+ at Techreport{SlaninaSSM07TR,
+ Author = "M. Slanina and S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+ Title = "Controller Synthesis of Discrete Linear Plants Using Polyhedra",
+ Number = "REACT-TR-2007-01",
+ Institution = "Computer Science Department, Stanford University",
+ Address = "Stanford, California, USA",
+ Year = 2007,
+ Abstract = "We study techniques for synthesizing synchronous
+ controllers for affine plants with disturbances, based
+ on safety specifications. Our plants are modeled in
+ terms of discrete linear systems whose variables are
+ partitioned into system, control, and disturbance
+ variables. We synthesize non-blocking controllers that
+ satisfy a user-provided safety specification by means of
+ a fixed point iteration over the control precondition
+ state transformer. Using convex polyhedra to represent
+ sets of states, we present both precise and approximate
+ algorithms for computing control preconditions and
+ discuss strategies for forcing convergence of the
+ iteration. We present technique for automatically
+ deriving controllers from the result of the analysis,
+ and demonstrate our approach on examples."
+}
+
+ at TechReport{Soffia08TR,
+ Author = "S. Soffia",
+ Title = "Definition and Implementation of a Points-To Analysis
+ for C-like Languages",
+ Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+ Number = "arXiv:cs.PL/0810.0753",
+ Year = 2008,
+ Note = "Available from \url{http://arxiv.org/}",
+ Abstract = "The points-to problem is the problem of determining the
+ possible run-time targets of pointer variables and is
+ usually considered part of the more general aliasing
+ problem, which consists in establishing whether and when
+ different expressions can refer to the same memory address.
+ Aliasing information is essential to every tool that needs
+ to reason about the semantics of programs. However, due to
+ well-known undecidability results, for all interesting
+ languages that admit aliasing, the exact solution of
+ nontrivial aliasing problems is not generally computable.
+ This work focuses on approximated solutions to this problem
+ by presenting a store-based, flow-sensitive points-to
+ analysis, for applications in the field of automated software
+ verification. In contrast to software testing procedures,
+ which heuristically check the program against a finite set
+ of executions, the methods considered in this work are static
+ analyses, where the computed results are valid for all the
+ possible executions of the analyzed program. We present a
+ simplified programming language and its execution model;
+ then an approximated execution model is developed using the
+ ideas of abstract interpretation theory. Finally, the
+ soundness of the approximation is formally proved. The aim
+ of developing a realistic points-to analysis is pursued by
+ presenting some extensions to the initial simplified model
+ and discussing the correctness of their formulation.
+ This work contains original contributions to the issue of
+ points-to analysis, as it provides a formulation of a filter
+ operation on the points-to abstract domain and a formal proof
+ of the soundness of the defined abstract operations:
+ these, as far as we now, are lacking from the previous
+ literature."
+}
+
+ at Inproceedings{Starynkevitch07,
+ Author = "B. Starynkevitch",
+ Title = "Multi-Stage Construction of a Global Static Analyzer",
+ Booktitle = "Proceedings of the 2007 {GCC} Developers' Summit",
+ Address = "Ottawa, Canada",
+ Pages = "143--151",
+ Year = 2007,
+ Abstract = "We describe ongoing work about global static analysis
+ for GCC4 within the GlobalGCC European project,
+ funded thru the ITEA Programme. The aim of this
+ work is to provide global (whole program) static
+ analysis, notably based upon abstract interpretation
+ and knowledge based techniques, within the GCC
+ compiler, targeted for analysis of medium sized C,
+ Fortran or C++ programs. This will facilitate the
+ adoption of GCC in the area of safetycritical
+ software development, by providing features found in
+ a few expensive commercial tools (PolySpace, AbsInt)
+ or research prototypes (Astree). In this
+ perspective, the emphasis is on the quality of
+ analysis, at the expense of much bigger compilation
+ times, without sacrificing scalability. Such
+ analysis can be used for several purposes:
+ statically compute some interesting properties of
+ the program at most control points (possibly
+ reporting them the user); provide clever,
+ contextual, warnings about possible hazards in the
+ user program (null pointer dereferences, zero
+ divide, conversion loss, out of bound array access,
+ \dots) while avoiding too much false alarms; enable
+ additional optimisations, like conditional
+ contextual constant folding, C++ method call
+ devirtualization, an other contextual optimizations.
+ The compiler's rich program manipulation
+ infrastructure facilitates the development of these
+ advanced analysis capabilities. To facilitate the
+ development high-level semantical analyses, a domain
+ specific language has been developped, and is
+ translated (thru C) into dynamically loaded code. It
+ uses the Parma Polyhedra Library (also used in the
+ GRAPHITE project) for relational analysis on scalars
+ and gives more expressivity to develop analaysis
+ algorithms. It permits multi-staged generation of
+ the specific analysis tailored to the analyzed
+ source code. Presenting this work at the 2007 GCC
+ summit will allow us to stress the importance of all
+ outputs of the compiler, not only object-code, and
+ to expose the complementary contribution of static
+ analyses and dynamic/instrumentation approaches like
+ mudflap."
+}
+
+ at Inproceedings{SongCR06,
+ Author = "H. Song and K. J. Compton and W. C. Rounds",
+ Title = "{SPHIN:} A Model Checker for Reconfigurable Hybrid Systems
+ Based on {SPIN}",
+ Booktitle = "Proceedings of the 5th International Workshop on
+ Automated Verification of Critical Systems",
+ Address = "University of Warwick, UK",
+ Editor = "R. Lazic and R. Nagarajan",
+ Series = "Electronic Notes in Theoretical Computer Science",
+ Publisher = "Elsevier Science B.V.",
+ Volume = 145,
+ Pages = "167--183",
+ Year = 2006,
+ Abstract = "We present SPHIN, a model checker for reconfigurable
+ hybrid systems based on the model checker SPIN. We
+ observe that physical (analog) mobility can be modeled
+ in the same way as logical (discrete) mobility is
+ modeled in the $\pi$-calculus by means of channel name
+ passing. We chose SPIN because it supports channel name
+ passing and can model reconfigurations. We extend the
+ syntax of PROMELA and the verification algorithms based
+ on the expected semantics. We demonstrate the tool's
+ capabilities by modeling and verifying a reconfigurable
+ hybrid system."
+}
+
+ at Inproceedings{TraonouezLR08,
+ Author = "L.-M. Traonouez and D. Lime and O. H. Roux",
+ Title = "Parametric Model-Checking of Time {Petri} Nets with Stopwatches
+ Using the State-Class Graph",
+ Booktitle = "Proceedings of the 6th International Conference on
+ Formal Modeling and Analysis of Timed Systems (FORMATS 2008)",
+ Editor = "F. Cassez and C. Jard",
+ Address = "Saint Malo, France",
+ Pages = "280--294",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 5215,
+ Year = 2008,
+ ISBN = "978-3-540-85777-8",
+ Abstract = "In this paper, we propose a new framework for the
+ parametric verification of time Petri nets with
+ stopwatches controlled by inhibitor arcs. We first
+ introduce an extension of time Petri nets with inhibitor
+ arcs (ITPNs) with temporal parameters. Then, we define a
+ symbolic representation of the parametric state space
+ based on the classical state class graph method. The
+ parameters of the model are embedded into the firing
+ domains of the classes, that are represented by convex
+ polyhedra. Finally, we propose semi-algorithms for the
+ parametric model-checking of a subset of parametric TCTL
+ formulae on ITPNs. We can thus generate the set of the
+ parameter valuations that satisfy the formulae."
+}
+
+ at Article{TraonouezLR09,
+ Author = "L.-M. Traonouez and D. Lime and O. H. Roux",
+ Title = "Parametric Model-Checking of Stopwatch Petri Nets",
+ Journal = "Journal of Universal Computer Science",
+ Year = 2009,
+ Volume = 15,
+ Number = 17,
+ Pages = "3273--3304",
+ Abstract = "At the border between control and verification,
+ parametric verification can be used to synthesize
+ constraints on the parameters to ensure that a system
+ verifies given specifications. In this paper we propose
+ a new framework for the parametric verification of time
+ Petri nets with stopwatches. We first introduce a
+ parametric extension of time Petri nets with inhibitor
+ arcs (ITPNs) with temporal parameters and we define a
+ symbolic representation of the parametric state-space
+ based on the classical state-class graph method. Then,
+ we propose semi-algorithms for the parametric
+ modelchecking of a subset of parametric TCTL formulae on
+ ITPNs. These results have been implemented in the tool
+ Romeo and we illustrate them in a case-study based on a
+ scheduling problem.", } Abstract: At the border between
+ control and verification, parametric verification can be
+ used to synthesize constraints on the parameters to
+ ensure that a system verifies given specifications. In
+ this paper we propose a new framework for the parametric
+ verification of time Petri nets with stopwatches. We
+ first introduce a parametric extension of time Petri
+ nets with inhibitor arcs (ITPNs) with temporal
+ parameters and we define a symbolic representation of
+ the parametric state-space based on the classical
+ state-class graph method. Then, we propose
+ semi-algorithms for the parametric modelchecking of a
+ subset of parametric TCTL formulae on ITPNs. These
+ results have been implemented in the tool Romeo and we
+ illustrate them in a case-study based on a scheduling
+ problem."
+}
+
+ at Inproceedings{TrifunovicCEFG+10,
+ Author = "K. Trifunovic and A. Cohen and D. Edelsohn and L. Feng
+ and T. Grosser and H. Jagasia and R. Ladelsky and S. Pop
+ and J. Sj{\"o}din and R. Upadrasta",
+ Title = "{GRAPHITE} Two Years After:
+ First Lessons Learned From Real-World Polyhedral Compilation",
+ Booktitle = "Proceedings of the 2nd International Workshop on
+ GCC Research Opportunities (GROW'10)",
+ Address = "Pisa, Italy",
+ Year = 2010,
+ Pages = "4--19",
+ Abstract = "Modern compilers are responsible for adapting the
+ semantics of source programs into a form that makes
+ efficient use of a highly complex, heterogeneous
+ machine. This adaptation amounts to solve an
+ optimization problem in a huge and unstructured search
+ space, while predicting the performance outcome of
+ complex sequences of program transformations. The
+ polyhedral model of compilation is aimed at these
+ challenges. Its geometrical, non-inductive semantics
+ enables the construction of better-structured
+ optimization problems and precise analytical
+ models. Recent work demonstrated the scalability of the
+ main polyhedral algorithms to real-world programs. Its
+ integration into production compilers is under way,
+ pioneered by the graphite branch of the GNU Compiler
+ Collection (GCC). Two years after the effective
+ beginning of the project, this paper reports on original
+ questions and innovative solutions that arose during the
+ design and implementation of \textsc{graphite}."
+}
+
+ at Techreport{UchoaFLPPdAA06TR,
+ Author = "E. Uchoa and R. Fukasawa and J. Lysgaard and A. Pessoa
+ and M. {Poggi de Arag\~ao} and D. Andrade",
+ Title = "Robust Branch-Cut-and-Price for the Capacitated
+ Minimum Spanning Tree Problem over a Large Extended Formulation",
+ Number = "RPEP, Vol.~6, No.~9",
+ Institution = "Universidade Federal Fluminense, Engenharia de Produ\c{c}ao",
+ Address = "Niteroi, Brazil",
+ Year = 2006,
+ Abstract = "This paper presents a robust branch-cut-and-price
+ algorithm for the Capacitated Minimum Spanning Tree
+ Problem (CMST). The variables are associated to
+ $q$-arbs, a structure that arises from a relaxation of
+ the capacitated prize-collecting arborescence probem in
+ order to make it solvable in pseudo-polynomial
+ time. Traditional inequalities over the arc formulation,
+ like Capacity Cuts, are also used. Moreover, a novel
+ feature is introduced in such kind of
+ algorithms. Powerful new cuts expressed over a very
+ large set of variables could be added, without
+ increasing the complexity of the pricing subproblem or
+ the size of the LPs that are actually
+ solved. Computational results on benchmark instances
+ from the OR-Library show very significant improvements
+ over previous algorithms. Several open instances could
+ be solved to optimality."
+}
+
+ at Inproceedings{vanHeeOSV06,
+ Author = "K. {van Hee} and O. Oanea and N. Sidorova and M. Voorhoeve",
+ Title = "Verifying Generalized Soundness for Workflow Nets",
+ Booktitle = "Perspectives of System Informatics: Proceedings of the
+ 6th International Andrei Ershov Memorial Conference",
+ Address = "Akademgorodok, Novosibirsk, Russia",
+ Editor = "I. Virbitskaite and A. Voronkov",
+ Publisher = "Springer-Verlag, Berlin",
+ Series = "Lecture Notes in Computer Science",
+ Volume = 4378,
+ Pages = "231--244",
+ Year = 2006,
+ Abstract = "We improve the decision procedure from [K. van Hee,
+ N. Sidorova, and M. Voorhoeve. Generalized soundness of
+ workflow nets is decidable. In Proc. of ICATPN'2004,
+ volume 3099 of LNCS, pages 197--216, 2004] for the
+ problem of generalized soundness for workflow nets:
+ ``Every marking reachable from an initial marking with
+ $k$ tokens on the initial place terminates properly,
+ i.e. it can reach a marking with $k$ tokens on the final
+ place, for an arbitrary natural number $k$''. Moreover,
+ our new decision procedure returns a counterexample in
+ case the workflow net is not generalized sound. We also
+ report on experimental results obtained with the
+ prototype we made and explain how the procedure can be
+ used for the compositional verification of large
+ workflows."
+}
+
+ at PhdThesis{Vasconcelos08th,
+ Author = "P. B. Vasconcelos",
+ Title = "Space Cost Analysis Using Sized Types",
+ School = "School of Computer Science, University of St Andrews",
+ Address = "St Andrews, UK",
+ Month = aug,
+ Year = 2008,
+ Abstract = "Programming resource-sensitive systems, such as
+ real-time embedded systems, requires guaranteeing both
+ the functional correctness of computations and also that
+ time and space usage fit within constraints imposed
+ by hardware limits or the environment. Functional
+ programming languages have proved very good at
+ meeting the former logical kind of guarantees but
+ not the latter resource guarantees.
+
+ This thesis contributes to demonstrate the applicability
+ of functional programming in resource-sensitive
+ systems with an automatic program analysis for
+ obtaining guaranteed upper bounds on dynamic space
+ usage of functional programs.
+
+ Our analysis is developed for a core subset of
+ \emph{Hume}, a domain-specific functional language
+ targeting resource-sensitive systems (Hammond et
+ al. 2007), and presented as a type and effeect
+ system that builds on previous sized type systems
+ (Hughes et al. 1996, Chin and Khoo 2001) and effeect
+ systems for costs (Dornic et al. 1992, Reistad and
+ Gifford 1994, Hughes and Pareto 1999). It extends
+ previous approaches by using abstract interpretation
+ techniques to \emph{automatically} infer linear
+ approximations of the sizes of recursive data types
+ and the stack and heap costs of recursive functions.
+
+ The correctness of the analysis is formally proved with
+ respect to an operational semantics for the language
+ and an inferrence algorithm that automatically
+ reconstructs size and cost bounds is presented.
+
+ A prototype implementation of the analysis and
+ operational semantics has been constructed and used
+ to experimentally assess the quality of the cost
+ bounds with some examples, including implementations
+ of textbook functional programming algorithms and
+ simplified embedded systems."
+}
+
+ at Inproceedings{Verdoolaege10,
+ Author = "S. Verdoolaege",
+ Title = "An Integer Set Library for the Polyhedral Model",
+ Booktitle = "Proceedings of the 3rd International Congress
+ on Mathematical Software (ICMS 2010)",
+ Address = "Kobe, Japan",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "K. Fukuda and J. Hoeven and M. Joswig and N. Takayama",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-15581-9",
+ Pages = "299--302",
+ Volume = 6327,
+ ISBN = "978-3-642-15581-9",
+ Year = 2010,
+ Abstract = "In compiler research, polytopes and related mathematical
+ objects have been successfully used for several decades
+ to represent and manipulate computer programs in an
+ approach that has become known as the polyhedral
+ model. The key insight is that the kernels of many
+ compute-intensive applications are composed of loops
+ with bounds that are affine combinations of symbolic
+ constants and outer loop iterators. The iterations of a
+ loop nest can then be represented as the integer points
+ in a (parametric) polytope and manipulated as a whole,
+ rather than as individual iterations. A similar
+ reasoning holds for the elements of an array and for
+ mappings between loop iterations and array elements."
+}
+
+ at Incollection{Vigna07,
+ Author = "G. Vigna",
+ Editor = "M. Christodorescu and S. Jha and D. Maughan
+ and D. Song and C. Wang",
+ Booktitle = "Malware Detection",
+ Title = "Static Disassembly and Code Analysis",
+ Publisher = "Springer-Verlag, Berlin",
+ Year = 2007,
+ Series = "Advances in Information Security",
+ Volume = 27,
+ ISBN = "0-387-32720-4",
+ Abstract = "The classification of an unknown binary program as
+ malicious or benign requires two steps. In the first
+ step, the stream of bytes that constitutes the program
+ has to be transformed (or disassembled) into the
+ corresponding sequence of machine instructions. In the
+ second step, based on this machine code representation,
+ static or dynamic code analysis techniques can be
+ applied to determine the properties and function of the
+ program. Both the disassembly and code analysis steps
+ can be foiled by techniques that obfuscate the binary
+ representation of a program. Thus, robust techniques are
+ required that deliver reliable results under such
+ adverse circumstances. In this chapter, we introduce a
+ disassemble technique that can deal with obfuscated
+ binaries. Also, we introduce a static code analysis
+ approach that can identify high-level semantic
+ properties of code that are difficult to conceal."
+}
+
+ at Inproceedings{YangWGI06,
+ Author = "Z. Yang and C. Wang and A. Gupta and F. Ivan\v{c}i\'{c}",
+ Title = "Mixed Symbolic Representations for Model Checking
+ Software Programs",
+ Booktitle = "Proceedings of the 4th ACM {\&} IEEE International Conference
+ on Formal Methods and Models for Co-Design (MEMOCODE 2006)",
+ Address = "Embassy Suites, Napa, California, USA",
+ Pages = "17--26",
+ Publisher = "IEEE Press",
+ Year = 2006,
+ ISBN = "1-4244-0421-5",
+ Abstract = "We present an efficient symbolic search algorithm for
+ software model checking. The algorithm combines multiple
+ symbolic representations to efficiently represent the
+ transition relation and reachable states and uses a
+ combination of decision procedures for Boolean and
+ integer representations. Our main contributions include:
+ (1) mixed symbolic representations to model C programs
+ with rich data types and complex expressions; and (2)
+ new symbolic search strategies and optimization
+ techniques specific to sequential programs that can
+ significantly improve the scalability of model checking
+ algorithms. Our controlled experiments on real-world
+ software programs show that the new symbolic search
+ algorithm can achieve several orders-of-magnitude
+ improvements over existing methods. The proposed
+ techniques are extremely competitive in handling
+ sequential models of non-trivial sizes, and also compare
+ favorably to popular Boolean-level model checking
+ algorithms based on BDDs and SAT.",
+}
+
+ at Article{YangWGI09,
+ Author = "Z. Yang and C. Wang and A. Gupta and F. Ivan\v{c}i\'{c}",
+ Title = "Model Checking Sequential Software Programs
+ Via Mixed Symbolic Analysis",
+ Journal = "ACM Transactions on Design Automation of Electronic Systems",
+ Volume = 14,
+ Number = 1,
+ Pages = "1--26",
+ Year = 2009,
+ ISSN = "1084-4309",
+ Publisher = "ACM Press",
+ Address = "New York, NY, USA",
+ Abstract = "We present an efficient symbolic search algorithm for
+ software model checking. Our algorithms perform
+ word-level reasoning by using a combination of decision
+ procedures in Boolean and integer and real domains, and
+ use novel symbolic search strategies optimized
+ specifically for sequential programs to improve
+ scalability. Experiments on real-world C programs show
+ that the new symbolic search algorithms can achieve
+ several orders-of-magnitude improvements over existing
+ methods based on bit-level (Boolean) reasoning."
+}
+
+ at Incollection{ZanioliC11,
+ Author = "M. Zanioli and A. Cortesi",
+ Title = "Information Leakage Analysis by Abstract Interpretation",
+ Booktitle = "SOFTSEM 2011: Theory and Practice of Computer Science",
+ Series = "Lecture Notes in Computer Science",
+ Editor = "I. Cern{\'a} and T. Gyim{\'o}thy and J. Hromkovic and K. Jefferey
+ and R. Kr{\'a}lovic and M. Vukolic and S. Wolf",
+ Publisher = "Springer-Verlag, Berlin",
+ ISBN = "978-3-642-18380-5",
+ Pages = "545--557",
+ Volume = 6543,
+ Year = 2011,
+ Abstract = "Protecting the confidentiality of information stored in
+ a computer system or transmitted over a public network
+ is a relevant problem in computer security. The
+ approach of information flow analysis involves
+ performing a static analysis of the program with the
+ aim of proving that there will not be leaks of
+ sensitive information. In this paper we propose a new
+ domain that combines variable dependency analysis,
+ based on propositional formulas, and variables' value
+ analysis, based on polyhedra. The resulting analysis is
+ strictly more accurate than the state of the art
+ abstract interpretation based analyses for information
+ leakage detection. Its modular construction allows to
+ deal with the tradeoff between efficiency and accuracy
+ by tuning the granularity of the abstraction and the
+ complexity of the abstract operators."
+}
+
+==============================================================================
+
+<h2>ODC Attribution License (ODC-By)</h2>
+
+### Preamble
+
+The Open Data Commons Attribution License is a license agreement
+intended to allow users to freely share, modify, and use this Database
+subject only to the attribution requirements set out in Section 4.
+
+Databases can contain a wide variety of types of content (images,
+audiovisual material, and sounds all in the same database, for example),
+and so this license only governs the rights over the Database, and not
+the contents of the Database individually. Licensors may therefore wish
+to use this license together with another license for the contents.
+
+Sometimes the contents of a database, or the database itself, can be
+covered by other rights not addressed here (such as private contracts,
+trademark over the name, or privacy rights / data protection rights
+over information in the contents), and so you are advised that you may
+have to consult other documents or clear other rights before doing
+activities not covered by this License.
+
+------
+
+The Licensor (as defined below)
+
+and
+
+You (as defined below)
+
+agree as follows:
+
+### 1.0 Definitions of Capitalised Words
+
+"Collective Database" - Means this Database in unmodified form as part
+of a collection of independent databases in themselves that together are
+assembled into a collective whole. A work that constitutes a Collective
+Database will not be considered a Derivative Database.
+
+"Convey" - As a verb, means Using the Database, a Derivative Database,
+or the Database as part of a Collective Database in any way that enables
+a Person to make or receive copies of the Database or a Derivative
+Database. Conveying does not include interaction with a user through a
+computer network, or creating and Using a Produced Work, where no
+transfer of a copy of the Database or a Derivative Database occurs.
+
+"Contents" - The contents of this Database, which includes the
+information, independent works, or other material collected into the
+Database. For example, the contents of the Database could be factual
+data or works such as images, audiovisual material, text, or sounds.
+
+"Database" - A collection of material (the Contents) arranged in a
+systematic or methodical way and individually accessible by electronic
+or other means offered under the terms of this License.
+
+"Database Directive" - Means Directive 96/9/EC of the European
+Parliament and of the Council of 11 March 1996 on the legal protection
+of databases, as amended or succeeded.
+
+"Database Right" - Means rights resulting from the Chapter III ("sui
+generis") rights in the Database Directive (as amended and as transposed
+by member states), which includes the Extraction and Re-utilisation of
+the whole or a Substantial part of the Contents, as well as any similar
+rights available in the relevant jurisdiction under Section 10.4.
+
+"Derivative Database" - Means a database based upon the Database, and
+includes any translation, adaptation, arrangement, modification, or any
+other alteration of the Database or of a Substantial part of the
+Contents. This includes, but is not limited to, Extracting or
+Re-utilising the whole or a Substantial part of the Contents in a new
+Database.
+
+"Extraction" - Means the permanent or temporary transfer of all or a
+Substantial part of the Contents to another medium by any means or in
+any form.
+
+"License" - Means this license agreement and is both a license of rights
+such as copyright and Database Rights and an agreement in contract.
+
+"Licensor" - Means the Person that offers the Database under the terms
+of this License.
+
+"Person" - Means a natural or legal person or a body of persons
+corporate or incorporate.
+
+"Produced Work" - a work (such as an image, audiovisual material, text,
+or sounds) resulting from using the whole or a Substantial part of the
+Contents (via a search or other query) from this Database, a Derivative
+Database, or this Database as part of a Collective Database.
+
+"Publicly" - means to Persons other than You or under Your control by
+either more than 50% ownership or by the power to direct their
+activities (such as contracting with an independent consultant).
+
+"Re-utilisation" - means any form of making available to the public all
+or a Substantial part of the Contents by the distribution of copies, by
+renting, by online or other forms of transmission.
+
+"Substantial" - Means substantial in terms of quantity or quality or a
+combination of both. The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may amount to the
+Extraction or Re-utilisation of a Substantial part of the Contents.
+
+"Use" - As a verb, means doing any act that is restricted by copyright
+or Database Rights whether in the original medium or any other; and
+includes without limitation distributing, copying, publicly performing,
+publicly displaying, and preparing derivative works of the Database, as
+well as modifying the Database as may be technically necessary to use it
+in a different mode or format.
+
+"You" - Means a Person exercising rights under this License who has not
+previously violated the terms of this License with respect to the
+Database, or who has received express permission from the Licensor to
+exercise rights under this License despite a previous violation.
+
+Words in the singular include the plural and vice versa.
+
+### 2.0 What this License covers
+
+2.1. Legal effect of this document. This License is:
+
+ a. A license of applicable copyright and neighbouring rights;
+
+ b. A license of the Database Right; and
+
+ c. An agreement in contract between You and the Licensor.
+
+2.2 Legal rights covered. This License covers the legal rights in the
+Database, including:
+
+ a. Copyright. Any copyright or neighbouring rights in the Database.
+ The copyright licensed includes any individual elements of the
+ Database, but does not cover the copyright over the Contents
+ independent of this Database. See Section 2.4 for details. Copyright
+ law varies between jurisdictions, but is likely to cover: the Database
+ model or schema, which is the structure, arrangement, and organisation
+ of the Database, and can also include the Database tables and table
+ indexes; the data entry and output sheets; and the Field names of
+ Contents stored in the Database;
+
+ b. Database Rights. Database Rights only extend to the Extraction and
+ Re-utilisation of the whole or a Substantial part of the Contents.
+ Database Rights can apply even when there is no copyright over the
+ Database. Database Rights can also apply when the Contents are removed
+ from the Database and are selected and arranged in a way that would
+ not infringe any applicable copyright; and
+
+ c. Contract. This is an agreement between You and the Licensor for
+ access to the Database. In return you agree to certain conditions of
+ use on this access as outlined in this License.
+
+2.3 Rights not covered.
+
+ a. This License does not apply to computer programs used in the making
+ or operation of the Database;
+
+ b. This License does not cover any patents over the Contents or the
+ Database; and
+
+ c. This License does not cover any trademarks associated with the
+ Database.
+
+2.4 Relationship to Contents in the Database. The individual items of
+the Contents contained in this Database may be covered by other rights,
+including copyright, patent, data protection, privacy, or personality
+rights, and this License does not cover any rights (other than Database
+Rights or in contract) in individual Contents contained in the Database.
+For example, if used on a Database of images (the Contents), this
+License would not apply to copyright over individual images, which could
+have their own separate licenses, or one single license covering all of
+the rights over the images.
+
+### 3.0 Rights granted
+
+3.1 Subject to the terms and conditions of this License, the Licensor
+grants to You a worldwide, royalty-free, non-exclusive, terminable (but
+only under Section 9) license to Use the Database for the duration of
+any applicable copyright and Database Rights. These rights explicitly
+include commercial use, and do not exclude any field of endeavour. To
+the extent possible in the relevant jurisdiction, these rights may be
+exercised in all media and formats whether now known or created in the
+future.
+
+The rights granted cover, for example:
+
+ a. Extraction and Re-utilisation of the whole or a Substantial part of
+ the Contents;
+
+ b. Creation of Derivative Databases;
+
+ c. Creation of Collective Databases;
+
+ d. Creation of temporary or permanent reproductions by any means and
+ in any form, in whole or in part, including of any Derivative
+ Databases or as a part of Collective Databases; and
+
+ e. Distribution, communication, display, lending, making available, or
+ performance to the public by any means and in any form, in whole or in
+ part, including of any Derivative Database or as a part of Collective
+ Databases.
+
+3.2 Compulsory license schemes. For the avoidance of doubt:
+
+ a. Non-waivable compulsory license schemes. In those jurisdictions in
+ which the right to collect royalties through any statutory or
+ compulsory licensing scheme cannot be waived, the Licensor reserves
+ the exclusive right to collect such royalties for any exercise by You
+ of the rights granted under this License;
+
+ b. Waivable compulsory license schemes. In those jurisdictions in
+ which the right to collect royalties through any statutory or
+ compulsory licensing scheme can be waived, the Licensor waives the
+ exclusive right to collect such royalties for any exercise by You of
+ the rights granted under this License; and,
+
+ c. Voluntary license schemes. The Licensor waives the right to collect
+ royalties, whether individually or, in the event that the Licensor is
+ a member of a collecting society that administers voluntary licensing
+ schemes, via that society, from any exercise by You of the rights
+ granted under this License.
+
+3.3 The right to release the Database under different terms, or to stop
+distributing or making available the Database, is reserved. Note that
+this Database may be multiple-licensed, and so You may have the choice
+of using alternative licenses for this Database. Subject to Section
+10.4, all other rights not expressly granted by Licensor are reserved.
+
+### 4.0 Conditions of Use
+
+4.1 The rights granted in Section 3 above are expressly made subject to
+Your complying with the following conditions of use. These are important
+conditions of this License, and if You fail to follow them, You will be
+in material breach of its terms.
+
+4.2 Notices. If You Publicly Convey this Database, any Derivative
+Database, or the Database as part of a Collective Database, then You
+must:
+
+ a. Do so only under the terms of this License;
+
+ b. Include a copy of this License or its Uniform Resource Identifier (URI)
+ with the Database or Derivative Database, including both in the
+ Database or Derivative Database and in any relevant documentation;
+
+ c. Keep intact any copyright or Database Right notices and notices
+ that refer to this License; and
+
+ d. If it is not possible to put the required notices in a particular
+ file due to its structure, then You must include the notices in a
+ location (such as a relevant directory) where users would be likely to
+ look for it.
+
+4.3 Notice for using output (Contents). Creating and Using a Produced
+Work does not require the notice in Section 4.2. However, if you
+Publicly Use a Produced Work, You must include a notice associated with
+the Produced Work reasonably calculated to make any Person that uses,
+views, accesses, interacts with, or is otherwise exposed to the Produced
+Work aware that Content was obtained from the Database, Derivative
+Database, or the Database as part of a Collective Database, and that it
+is available under this License.
+
+ a. Example notice. The following text will satisfy notice under
+ Section 4.3:
+
+ Contains information from DATABASE NAME which is made available
+ under the ODC Attribution License.
+
+DATABASE NAME should be replaced with the name of the Database and a
+hyperlink to the location of the Database. "ODC Attribution License"
+should contain a hyperlink to the URI of the text of this License. If
+hyperlinks are not possible, You should include the plain text of the
+required URI's with the above notice.
+
+4.4 Licensing of others. You may not sublicense the Database. Each time
+You communicate the Database, the whole or Substantial part of the
+Contents, or any Derivative Database to anyone else in any way, the
+Licensor offers to the recipient a license to the Database on the same
+terms and conditions as this License. You are not responsible for
+enforcing compliance by third parties with this License, but You may
+enforce any rights that You have over a Derivative Database. You are
+solely responsible for any modifications of a Derivative Database made
+by You or another Person at Your direction. You may not impose any
+further restrictions on the exercise of the rights granted or affirmed
+under this License.
+
+### 5.0 Moral rights
+
+5.1 Moral rights. This section covers moral rights, including any rights
+to be identified as the author of the Database or to object to treatment
+that would otherwise prejudice the author's honour and reputation, or
+any other derogatory treatment:
+
+ a. For jurisdictions allowing waiver of moral rights, Licensor waives
+ all moral rights that Licensor may have in the Database to the fullest
+ extent possible by the law of the relevant jurisdiction under Section
+ 10.4;
+
+ b. If waiver of moral rights under Section 5.1 a in the relevant
+ jurisdiction is not possible, Licensor agrees not to assert any moral
+ rights over the Database and waives all claims in moral rights to the
+ fullest extent possible by the law of the relevant jurisdiction under
+ Section 10.4; and
+
+ c. For jurisdictions not allowing waiver or an agreement not to assert
+ moral rights under Section 5.1 a and b, the author may retain their
+ moral rights over certain aspects of the Database.
+
+Please note that some jurisdictions do not allow for the waiver of moral
+rights, and so moral rights may still subsist over the Database in some
+jurisdictions.
+
+### 6.0 Fair dealing, Database exceptions, and other rights not affected
+
+6.1 This License does not affect any rights that You or anyone else may
+independently have under any applicable law to make any use of this
+Database, including without limitation:
+
+ a. Exceptions to the Database Right including: Extraction of Contents
+ from non-electronic Databases for private purposes, Extraction for
+ purposes of illustration for teaching or scientific research, and
+ Extraction or Re-utilisation for public security or an administrative
+ or judicial procedure.
+
+ b. Fair dealing, fair use, or any other legally recognised limitation
+ or exception to infringement of copyright or other applicable laws.
+
+6.2 This License does not affect any rights of lawful users to Extract
+and Re-utilise insubstantial parts of the Contents, evaluated
+quantitatively or qualitatively, for any purposes whatsoever, including
+creating a Derivative Database (subject to other rights over the
+Contents, see Section 2.4). The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may however amount
+to the Extraction or Re-utilisation of a Substantial part of the
+Contents.
+
+### 7.0 Warranties and Disclaimer
+
+7.1 The Database is licensed by the Licensor "as is" and without any
+warranty of any kind, either express, implied, or arising by statute,
+custom, course of dealing, or trade usage. Licensor specifically
+disclaims any and all implied warranties or conditions of title,
+non-infringement, accuracy or completeness, the presence or absence of
+errors, fitness for a particular purpose, merchantability, or otherwise.
+Some jurisdictions do not allow the exclusion of implied warranties, so
+this exclusion may not apply to You.
+
+### 8.0 Limitation of liability
+
+8.1 Subject to any liability that may not be excluded or limited by law,
+the Licensor is not liable for, and expressly excludes, all liability
+for loss or damage however and whenever caused to anyone by any use
+under this License, whether by You or by anyone else, and whether caused
+by any fault on the part of the Licensor or not. This exclusion of
+liability includes, but is not limited to, any special, incidental,
+consequential, punitive, or exemplary damages such as loss of revenue,
+data, anticipated profits, and lost business. This exclusion applies
+even if the Licensor has been advised of the possibility of such
+damages.
+
+8.2 If liability may not be excluded by law, it is limited to actual and
+direct financial loss to the extent it is caused by proved negligence on
+the part of the Licensor.
+
+### 9.0 Termination of Your rights under this License
+
+9.1 Any breach by You of the terms and conditions of this License
+automatically terminates this License with immediate effect and without
+notice to You. For the avoidance of doubt, Persons who have received the
+Database, the whole or a Substantial part of the Contents, Derivative
+Databases, or the Database as part of a Collective Database from You
+under this License will not have their licenses terminated provided
+their use is in full compliance with this License or a license granted
+under Section 4.8 of this License. Sections 1, 2, 7, 8, 9 and 10 will
+survive any termination of this License.
+
+9.2 If You are not in breach of the terms of this License, the Licensor
+will not terminate Your rights under it.
+
+9.3 Unless terminated under Section 9.1, this License is granted to You
+for the duration of applicable rights in the Database.
+
+9.4 Reinstatement of rights. If you cease any breach of the terms and
+conditions of this License, then your full rights under this License
+will be reinstated:
+
+ a. Provisionally and subject to permanent termination until the 60th
+ day after cessation of breach;
+
+ b. Permanently on the 60th day after cessation of breach unless
+ otherwise reasonably notified by the Licensor; or
+
+ c. Permanently if reasonably notified by the Licensor of the
+ violation, this is the first time You have received notice of
+ violation of this License from the Licensor, and You cure the
+ violation prior to 30 days after your receipt of the notice.
+
+9.5 Notwithstanding the above, Licensor reserves the right to release
+the Database under different license terms or to stop distributing or
+making available the Database. Releasing the Database under different
+license terms or stopping the distribution of the Database will not
+withdraw this License (or any other license that has been, or is
+required to be, granted under the terms of this License), and this
+License will continue in full force and effect unless terminated as
+stated above.
+
+### 10.0 General
+
+10.1 If any provision of this License is held to be invalid or
+unenforceable, that must not affect the validity or enforceability of
+the remainder of the terms and conditions of this License and each
+remaining provision of this License shall be valid and enforced to the
+fullest extent permitted by law.
+
+10.2 This License is the entire agreement between the parties with
+respect to the rights granted here over the Database. It replaces any
+earlier understandings, agreements or representations with respect to
+the Database.
+
+10.3 If You are in breach of the terms of this License, You will not be
+entitled to rely on the terms of this License or to complain of any
+breach by the Licensor.
+
+10.4 Choice of law. This License takes effect in and will be governed by
+the laws of the relevant jurisdiction in which the License terms are
+sought to be enforced. If the standard suite of rights granted under
+applicable copyright law and Database Rights in the relevant
+jurisdiction includes additional rights not granted under this License,
+these additional rights are granted in this License in order to meet the
+terms of this License.
diff --git a/doc/ppl_logo.pdf b/doc/ppl_logo.pdf
new file mode 100644
index 0000000..540fdbf
Binary files /dev/null and b/doc/ppl_logo.pdf differ
diff --git a/doc/ppl_logo_no_ppl.pdf b/doc/ppl_logo_no_ppl.pdf
new file mode 100644
index 0000000..3ff221f
Binary files /dev/null and b/doc/ppl_logo_no_ppl.pdf differ
diff --git a/doc/user-language-interface.doxyconf.in b/doc/user-language-interface.doxyconf.in
new file mode 100644
index 0000000..881087c
--- /dev/null
+++ b/doc/user-language-interface.doxyconf.in
@@ -0,0 +1,311 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "PPL <PPL_SED_LANGUAGE_NAME> Language Interface"
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = NO
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES = <PPL_SED_ALIASES>
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+HIDE_FRIEND_COMPOUNDS = YES
+HIDE_IN_BODY_DOCS = YES
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = NO
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS = <PPL_SED_ENABLED_SECTIONS>
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = NO
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = <PPL_SED_INPUT>
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = <PPL_SED_GENERATE_HTML>
+HTML_OUTPUT = ppl-user-<PPL_SED_INTERFACE_NAME>- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = <PPL_SED_GENERATE_LATEX>
+LATEX_OUTPUT = user-<PPL_SED_INTERFACE_NAME>.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = user-<PPL_SED_INTERFACE_NAME>.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED = <PPL_SED_CONFIGURED_MANUAL> \
+ PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED = PPL_TYPE_DECLARATION \
+ PPL_DECLARE_PRINT_FUNCTIONS \
+ PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS \
+ PPL_DECLARE_IO_FUNCTIONS \
+ PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS \
+ PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS \
+ PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = <PPL_SED_TAGFILES>
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = NO
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/user-language-interface.tex b/doc/user-language-interface.tex
new file mode 100644
index 0000000..05b2b3d
--- /dev/null
+++ b/doc/user-language-interface.tex
@@ -0,0 +1,174 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version. The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\else
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+<PPL_SED_USEPACKAGE_OCAMLDOC>
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\scriptsize The PPL <PPL_SED_LANGUAGE_NAME> Language Interface User's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+<PPL_SED_LANGUAGE_NAME> Language Interface \\
+User's Manual\thanks{This work
+ has been partly supported by:
+ University of Parma's FIL scientific research project (ex 60\%)
+ ``Pure and Applied Mathematics'';
+ MURST project
+ ``Automatic Program Certification by Abstract Interpretation'';
+ MURST project
+ ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+ MURST project
+ ``Automatic Aggregate- and Number-Reasoning for Computing: from
+ Decision Algorithms to Constraint Programming with Multisets,
+ Sets, and Maps'';
+ MURST project
+ ``Constraint Based Verification of Reactive Systems'';
+ MURST project
+ ``Abstract Interpretation: Design and Applications'';
+ EPSRC project
+ ``Numerical Domains for Software Analysis'';
+ EPSRC project
+ ``Geometric Abstractions for Scalable Program Analyzers''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+ BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+ BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in
new file mode 100644
index 0000000..6a55adf
--- /dev/null
+++ b/doc/user.doxyconf-html.in
@@ -0,0 +1,307 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = PPL
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = NO
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+HIDE_FRIEND_COMPOUNDS = YES
+HIDE_IN_BODY_DOCS = YES
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = NO
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = NO
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @srcdir@/definitions.dox \
+ ../src/ppl.hh \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = ppl-user- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = user.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = @srcdir@/user.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED = PPL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = ppl-user- at VERSION@-html.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = NO
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in
new file mode 100644
index 0000000..f168217
--- /dev/null
+++ b/doc/user.doxyconf-latex.in
@@ -0,0 +1,307 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = PPL
+PROJECT_NUMBER = @VERSION@
+PROJECT_BRIEF =
+PROJECT_LOGO =
+OUTPUT_DIRECTORY = .
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = NO
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+HIDE_FRIEND_COMPOUNDS = YES
+HIDE_IN_BODY_DOCS = YES
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = NO
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 5
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = YES
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = NO
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text "
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = @srcdir@/definitions.dox \
+ ../src/ppl.hh \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = NO
+HTML_OUTPUT = ppl-user- at VERSION@-html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = user.latex-dir
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = YES
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = ppl
+LATEX_HEADER = @srcdir@/user.tex
+LATEX_FOOTER =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = YES
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = YES
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED = PPL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = NO
+DIRECTORY_GRAPH = NO
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
diff --git a/doc/user.tex b/doc/user.tex
new file mode 100644
index 0000000..52ab7ee
--- /dev/null
+++ b/doc/user.tex
@@ -0,0 +1,173 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version. The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\else
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue,
+ unicode
+ ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\small The PPL User's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+User's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+ University of Parma's FIL scientific research project (ex 60\%)
+ ``Pure and Applied Mathematics'';
+ MURST project
+ ``Automatic Program Certification by Abstract Interpretation'';
+ MURST project
+ ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+ MURST project
+ ``Automatic Aggregate- and Number-Reasoning for Computing: from
+ Decision Algorithms to Constraint Programming with Multisets,
+ Sets, and Maps'';
+ MURST project
+ ``Constraint Based Verification of Reactive Systems'';
+ MURST project
+ ``Abstract Interpretation: Design and Applications'';
+ EPSRC project
+ ``Numerical Domains for Software Analysis'';
+ EPSRC project
+ ``Geometric Abstractions for Scalable Program Analyzers''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+ BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy,
+ and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+ BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..377bb86
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-11-20.07; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/instchk.hh b/instchk.hh
new file mode 100644
index 0000000..93702b0
--- /dev/null
+++ b/instchk.hh
@@ -0,0 +1,389 @@
+/* Fake declarations to test the validity of the arguments of the
+ --enabled-instantiations option defined in configure.ac.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#include "gmpxx.h"
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+};
+
+class C_Polyhedron {
+public:
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class NNC_Polyhedron {
+public:
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Grid {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Rational_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Z_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+#if PPL_SUPPORTED_FLOAT
+class Float_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+class Double_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+class Long_Double_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+class Int8_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Int16_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Int32_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Int64_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Uint8_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Uint16_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Uint32_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+class Uint64_Box {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+template <typename PSET>
+class Pointset_Powerset {
+public:
+ static bool valid_instantiation() {
+ return PSET::valid_Pointset_Powerset_argument();
+ }
+};
+
+template <typename T>
+bool
+valid_BD_Shape_argument(void);
+
+template <>
+bool
+valid_BD_Shape_argument<signed char>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<short>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<long>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<long long>() {
+ return true;
+}
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+bool
+valid_BD_Shape_argument<float>() {
+ return true;
+}
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+bool
+valid_BD_Shape_argument<double>() {
+ return true;
+}
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+bool
+valid_BD_Shape_argument<long double>() {
+ return true;
+}
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+template <>
+bool
+valid_BD_Shape_argument<mpz_class>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<mpq_class>() {
+ return true;
+}
+
+template <typename T>
+class BD_Shape {
+public:
+ static bool valid_instantiation() {
+ return valid_BD_Shape_argument<T>();
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+template <typename T>
+class Octagonal_Shape {
+public:
+ static bool valid_instantiation() {
+ return valid_BD_Shape_argument<T>();
+ }
+ static bool valid_Pointset_Powerset_argument() {
+ return true;
+ }
+ static bool valid_Product_argument() {
+ return true;
+ }
+};
+
+template <typename D1, typename D2>
+class Direct_Product {
+public:
+ static bool valid_instantiation() {
+ return D1::valid_Product_argument() && D2::valid_Product_argument();
+ }
+};
+
+template <typename D1, typename D2>
+class Smash_Product {
+public:
+ static bool valid_instantiation() {
+ return D1::valid_Product_argument() && D2::valid_Product_argument();
+ }
+};
+
+template <typename D1, typename D2>
+class Constraints_Product {
+public:
+ static bool valid_instantiation() {
+ return D1::valid_Product_argument() && D2::valid_Product_argument();
+ }
+};
+
+template <typename D1, typename D2>
+class Shape_Preserving_Product {
+public:
+ static bool valid_instantiation() {
+ return D1::valid_Product_argument() && D2::valid_Product_argument();
+ }
+};
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/C/C_interface.dox b/interfaces/C/C_interface.dox
new file mode 100644
index 0000000..5351b21
--- /dev/null
+++ b/interfaces/C/C_interface.dox
@@ -0,0 +1,1754 @@
+/* Doxumentation for the C language interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \interface ppl_Polyhedron_tag
+ \brief
+ Types and functions for the domains of C and NNC convex polyhedra.
+
+ The types and functions for convex polyhedra provide a single interface
+ for accessing both topologically closed (C) and not necessarily closed
+ (NNC) convex polyhedra.
+ The distinction between C and NNC polyhedra need only be explicitly
+ stated when <em>creating</em> or <em>assigning</em> a polyhedron object,
+ by means of one of the functions <code>ppl_new_*</code> and
+ <code>ppl_assign_*</code>.
+
+ Having a single datatype does not mean that C and NNC polyhedra can be
+ freely interchanged: as specified in the main manual, most library
+ functions require their arguments to be topologically and/or
+ space-dimension compatible.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag* ppl_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag const* ppl_const_Polyhedron_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Constructors and Assignment for C_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron of dimension \p d and writes an handle to it
+ at address \p pph. If \p empty is different from zero, the newly created
+ polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_C_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of \p ph; writes a handle
+ for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument is ignored.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of congruences \p cs
+ and writes a handle for the newly created polyhedron at address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for C_Polyhedron */
+
+/*! \brief \name Constructors and Assignment for NNC_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron of dimension \p d and writes an handle to it
+ at address \p pph. If \p empty is different from zero, the newly created
+ polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+ for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument is ignored.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns a copy of the NNC polyhedron \p src to the NNC
+ polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for NNC Polyhedron */
+
+/*! \name Constructors Behaving as Conversion Operators
+ Besides the conversions listed here below, the library also
+ provides conversion operators that build a semantic geometric
+ description starting from \b any other semantic geometric
+ description (e.g., ppl_new_Grid_from_C_Polyhedron,
+ ppl_new_C_Polyhedron_from_BD_Shape_mpq_class, etc.).
+ Clearly, the conversion operators are only available if both
+ the source and the target semantic geometric descriptions have
+ been enabled when configuring the library.
+ The conversions also taking as argument a complexity class
+ sometimes provide non-trivial precision/efficiency trade-offs.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of the topological closure
+ of the NNC polyhedron \p ph; writes a handle for the newly created
+ polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that approximates NNC_Polyhedron \p ph,
+ using an algorithm whose complexity does not exceed \p complexity;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument, which can take values
+ \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+ and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+ has polynomial complexity.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that approximates C_Polyhedron \p ph,
+ using an algorithm whose complexity does not exceed \p complexity;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument, which can take values
+ \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+ and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+ has polynomial complexity.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*@}*/ /* Constructors Behaving as Conversion Operators */
+
+/*! \brief \name Destructor for (C or NNC) Polyhedra */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Invalidates the handle \p ph: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Destructor for (C or NNC) Polyhedra */
+
+/*! \brief \name Functions that Do Not Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p m the affine dimension of \p ph (not to be confused with the
+ dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+ If successful, returns a non-negative integer that is
+ obtained as the bitwise or of the bits (chosen among
+ PPL_POLY_CON_RELATION_IS_DISJOINT
+ PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+ PPL_POLY_CON_RELATION_IS_INCLUDED, and
+ PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+ \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Checks the relation between the polyhedron \p ph and the generator \p g.
+
+ If successful, returns a non-negative integer that is
+ obtained as the bitwise or of the bits (only
+ PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+ relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_t g);
+
+int
+ppl_Polyhedron_relation_with_Congruence
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes at address \p pcs a const handle to a system of congruences
+ approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the minimized constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_minimized_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes at address \p pcs a const handle to a system of minimized
+ congruences approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_minimized_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+ not empty.
+*/
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is a universe polyhedron;
+ returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+ unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph contains at least one integer
+ point; returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_contains_integer_point(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is topologically closed;
+ returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is a discrete set;
+ returns 0 if \p ph is not a discrete set.
+*/
+int
+ppl_Polyhedron_is_discrete(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph constrains \p var;
+ returns 0 if \p ph does not constrain \p var.
+*/
+int
+ppl_Polyhedron_constrains
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p le is bounded from above in \p ph;
+ returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p le is bounded from below in \p ph;
+ returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is not empty
+ and \p le is bounded from above in \p ph, in which case
+ the supremum value and a point where \p le reaches it are computed.
+
+ \param ph
+ The polyhedron constraining \p le;
+
+ \param le
+ The linear expression to be maximized subject to \p ph;
+
+ \param sup_n
+ Will be assigned the numerator of the supremum value;
+
+ \param sup_d
+ Will be assigned the denominator of the supremum value;
+
+ \param pmaximum
+ Will store 1 in this location if the supremum is also the maximum,
+ will store 0 otherwise;
+
+ \param point
+ Will be assigned the point or closure point where \p le reaches the
+ extremum value.
+
+ If \p ph is empty or \p le is not bounded from above,
+ 0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+ will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ The same as ppl_Polyhedron_maximize_with_point, but without the
+ output argument for the location where the supremum value is reached.
+*/
+int
+ppl_Polyhedron_maximize
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is not empty
+ and \p le is bounded from below in \p ph, in which case
+ the infimum value and a point where \p le reaches it are computed.
+
+ \param ph
+ The polyhedron constraining \p le;
+
+ \param le
+ The linear expression to be minimized subject to \p ph;
+
+ \param inf_n
+ Will be assigned the numerator of the infimum value;
+
+ \param inf_d
+ Will be assigned the denominator of the infimum value;
+
+ \param pminimum
+ Will store 1 in this location if the infimum is also the minimum,
+ will store 0 otherwise;
+
+ \param point
+ Will be assigned the point or closure point where \p le reaches the
+ extremum value.
+
+ If \p ph is empty or \p le is not bounded from below,
+ 0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+ will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ The same as ppl_Polyhedron_minimize_with_point, but without the
+ output argument for the location where the infimum value is reached.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x contains or is equal to \p y;
+ returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x strictly contains \p y; returns 0
+ if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x and \p y are disjoint; returns 0
+ if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x and \p y are the same polyhedron;
+ returns 0 if they are different.
+
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p ph is broken. Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p sz a lower bound to the size in bytes of the memory
+ managed by \p ph.
+*/
+int
+ppl_Polyhedron_external_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p sz a lower bound to the size in bytes of the memory
+ managed by \p ph.
+*/
+int
+ppl_Polyhedron_total_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*@}*/ /* Functions that Do Not Modify the Polyhedron */
+
+
+/*! \brief \name Space Dimension Preserving Functions that May Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the constraint \p c to the system of constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the congruence \p c to polyhedron of \p ph.
+*/
+int
+ppl_Polyhedron_add_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of constraints \p cs to the system of
+ constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of congruences \p cs to the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of constraints \p cs to the system of constraints of
+ \p ph.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of congruences \p cs to the polyhedron \p ph.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_congruences
+(ppl_Polyhedron_t ph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using constraint \p c.
+*/
+int
+ppl_Polyhedron_refine_with_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using congruence \p c.
+*/
+int
+ppl_Polyhedron_refine_with_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using the constraints in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using the congruences in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x an upper bound of \p x and \p y.
+
+ For the domain of polyhedra, this is the same as
+ <CODE>ppl_Polyhedron_poly_hull_assign(x, y)</CODE>.
+*/
+int
+ppl_Polyhedron_upper_bound_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Same as ppl_Polyhedron_poly_difference_assign(x, y).
+*/
+int
+ppl_Polyhedron_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the
+ \extref{Meet_Preserving_Simplification, meet-preserving simplification}
+ of \p x with respect to context \p y. Returns a positive integer if
+ \p x and \p y have a nonempty intersection; returns \c 0 if they
+ are disjoint.
+*/
+int
+ppl_Polyhedron_simplify_using_context_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the \extref{Time_Elapse_Operator, time-elapse} between
+ the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{Cylindrification, unconstraining}
+ the space dimension \p var.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{Cylindrification, unconstraining}
+ the space dimensions that are specified in the first \p n positions
+ of the array \p ds.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Transforms the polyhedron \p ph, assigning an affine expression
+ to the specified variable.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param le
+ The numerator of the affine expression;
+
+ \param d
+ The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Transforms the polyhedron \p ph, substituting an affine expression
+ to the specified variable.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param le
+ The numerator of the affine expression;
+
+ \param d
+ The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\frac{\mathrm{lb}}{\mathrm{d}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable bounded by the generalized affine transfer relation;
+
+ \param lb
+ The numerator of the lower bounding affine expression;
+
+ \param ub
+ The numerator of the upper bounding affine expression;
+
+ \param d
+ The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\frac{\mathrm{lb}}{\mathrm{d}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable bounded by the generalized affine transfer relation;
+
+ \param lb
+ The numerator of the lower bounding affine expression;
+
+ \param ub
+ The numerator of the upper bounding affine expression;
+
+ \param d
+ The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The left hand side variable of the generalized affine transfer relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param le
+ The numerator of the right hand side affine expression;
+
+ \param d
+ The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The left hand side variable of the generalized affine transfer relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param le
+ The numerator of the right hand side affine expression;
+
+ \param d
+ The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*@}*/ /* Space Dimension Preserving Functions that May Modify [...] */
+
+
+/*! \brief \name Functions that May Modify the Dimension of the Vector Space */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Seeing a polyhedron as a set of tuples (its points), assigns
+ to \p x all the tuples that can be obtained by concatenating,
+ in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+ and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Removes from the vector space enclosing \p ph the space dimensions that
+ are specified in first \p n positions of the array \p ds. The presence
+ of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Removes the higher dimensions from the vector space enclosing \p ph
+ so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Remaps the dimensions of the vector space according to a
+ \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+ This function is specified by means of the \p maps array,
+ which has \p n entries.
+
+ The partial function is defined on dimension <CODE>i</CODE>
+ if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+ otherwise it is undefined on dimension <CODE>i</CODE>.
+ If the function is defined on dimension <CODE>i</CODE>, then dimension
+ <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+ The result is undefined if \p maps does not encode a partial
+ function with the properties described in the
+ \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+ specification of the mapping operator}.
+*/
+int
+ppl_Polyhedron_map_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type maps[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ \extref{expand_space_dimension, Expands} the \f$d\f$-th dimension of
+ the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type d, ppl_dimension_type m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{fold_space_dimensions, folding} the
+ space dimensions contained in the first \p n positions of the array \p ds
+ into dimension \p d. The presence of duplicates in \p ds is a waste
+ but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d);
+
+/*@}*/ /* Functions that May Modify the Dimension of the Vector Space */
+
+/*! \brief \name Input/Output Functions */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Prints \p x to \c stdout.
+*/
+int
+ppl_io_print_Polyhedron(ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Prints \p x to the given output \p stream.
+*/
+int
+ppl_io_fprint_Polyhedron(FILE* stream, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Prints \p x to a malloc-allocated string, a pointer to which
+ is returned via \p strp.
+*/
+int
+ppl_io_asprint_Polyhedron(char** strp, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Dumps an ascii representation of \p x on \p stream.
+*/
+int
+ppl_Polyhedron_ascii_dump(ppl_const_Polyhedron_t x, FILE* stream);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Loads an ascii representation of \p x from \p stream.
+*/
+int
+ppl_Polyhedron_ascii_load(ppl_Polyhedron_t x, FILE* stream);
+
+/*@}*/ /* Input-Output Functions */
+
+
+/*! \name Ad Hoc Functions for (C or NNC) Polyhedra
+ The functions listed here below, being specific of the polyhedron domains,
+ do not have a correspondence in other semantic geometric descriptions.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the minimized generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_minimized_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the generator \p g to the system of generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generator
+(ppl_Polyhedron_t ph, ppl_const_Generator_t g);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of generators \p gs to the system of
+ generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of generators \p gs to the system of generators of
+ \p ph.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators
+(ppl_Polyhedron_t ph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the \extref{Convex_Polyhedral_Difference, poly-difference}
+ of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the polyhedron obtained from \p ph by "wrapping" the vector
+ space defined by the first \p n space dimensions in \p ds[].
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param ds[]
+ Specifies the space dimensions to be wrapped.
+
+ \param n
+ The first \p n space dimensions in the array \p ds[] will be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param pcs
+ Possibly null pointer to a constraint system whose space dimensions
+ are the first \p n dimensions in \p ds[]. If <CODE>*pcs</CODE>
+ depends on variables not in \p vars, the behavior is undefined.
+ When non-null, the constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>cs</CODE>.
+
+ \param complexity_threshold
+ A precision parameter where higher values result in possibly improved
+ precision.
+
+ \param wrap_individually
+ Non-zero if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+ */
+ int wrap_assign(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_enum_Bounded_Integer_Type_Width w,
+ ppl_enum_Bounded_Integer_Type_Representation r,
+ ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y. If \p tp is not the null pointer, the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y. If \p tp is not the null pointer, the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique is
+ applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x. If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x. If \p tp is not the null
+ pointer, the \extref{Widening_with_Tokens, widening with tokens} delay
+ technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+ x. If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+ If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*@}*/ /* Ad Hoc Functions for (C or NNC) Polyhedra */
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_tag
+ \brief
+ Types and functions for the Pointset_Powerset of C_Polyhedron objects.
+
+ The powerset domains can be instantiated by taking as a base domain
+ any fixed semantic geometric description
+ (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+ An element of the powerset domain represents a disjunctive collection
+ of base objects (its disjuncts), all having the same space dimension.
+
+ Besides the functions that are available in all semantic geometric
+ descriptions (whose documentation is not repeated here),
+ the powerset domain also provides several ad hoc functions.
+ In particular, the iterator types allow for the examination and
+ manipulation of the collection of disjuncts.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_iterator_tag
+ \brief
+ Types and functions for iterating on the disjuncts of a
+ ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag
+ \brief
+ Types and functions for iterating on the disjuncts of a
+ const ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Construction, Initialization and Destruction */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Builds a new `iterator' and writes a handle to it
+ at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it
+ at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator_from_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Assigns to \p psit an iterator "pointing" to the beginning of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_begin
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Assigns to \p psit a const iterator "pointing" to the beginning of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Assigns to \p psit an iterator "pointing" past the end of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_end
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Assigns to \p psit a const iterator "pointing" past the end of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Invalidates the handle \p it: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Invalidates the handle \p it: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*@}*/ /* Construction, Initialization and Destruction */
+
+/*! \brief \name Dereferencing, Increment, Decrement and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Dereferences \p it writing a const handle to the resulting disjunct
+ at address \p d.
+
+ \note
+ Even though \p it is an non-const iterator, dereferencing it results
+ in a handle to a \b const disjunct. This is because mutable iterators
+ are meant to allow for the modification of the sequence of disjuncts
+ (e.g., by dropping elements), while preventing direct modifications
+ of the disjuncts they point to.
+
+ \warning
+ On exit, the disjunct \p d is still owned by the powerset object:
+ any function call on the owning powerset object may invalidate it.
+ Moreover, \p d should \b not be deleted directly: its resources will
+ be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Dereferences \p it writing a const handle to the resulting disjunct
+ at address \p d.
+
+ \warning
+ On exit, the disjunct \p d is still owned by the powerset object:
+ any function call on the owning powerset object may invalidate it.
+ Moreover, \p d should \b not be deleted directly: its resources will
+ be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*@}*/ /* Dereferencing, Increment, Decrement and Equality Testing */
+
+
+/*! \brief \name Ad Hoc Functions for Pointset_Powerset domains */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from the sequence of disjuncts in \p ps all the
+ non-maximal elements so that \p ps is non-redundant.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_omega_reduce
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Writes to \p sz the number of disjuncts in \p ps.
+
+ \note
+ If present, Omega-redundant elements will be counted too.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_size
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps, size_t* sz);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Returns a positive integer if powerset \p x geometrically covers
+ powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Returns a positive integer if powerset \p x is geometrically
+ equal to powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Adds to \p ps a copy of disjunct \p d.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps, ppl_const_Polyhedron_t d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from \p ps the disjunct pointed to by \p cit,
+ assigning to \p it an iterator to the disjunct following \p cit.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from \p ps all the disjuncts from \p first to \p last (excluded).
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t last);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Modifies \p ps by (recursively) merging together the pairs of
+ disjuncts whose upper-bound is the same as their set-theoretical union.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce
+(ppl_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*@}*/ /* Ad Hoc Functions for Pointset_Powerset domains */
diff --git a/interfaces/C/Makefile.am b/interfaces/C/Makefile.am
new file mode 100644
index 0000000..407ac02
--- /dev/null
+++ b/interfaces/C/Makefile.am
@@ -0,0 +1,268 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = . tests
+
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_cc_files.m4 \
+ppl_interface_generator_c_hh_files.m4 \
+ppl_interface_generator_c_cc_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_c_header.h \
+C_interface.dox
+
+# Libtool -version-info for libppl_c.la.
+#
+# 1. Start with version information of `0:0:0' for each Libtool library.
+#
+# 2. Update the version information only immediately before a public
+# release of your software. More frequent updates are unnecessary,
+# and only guarantee that the current interface number gets larger
+# faster.
+#
+# 3. If the library source code has changed at all since the last
+# update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+# 4. If any interfaces have been added, removed, or changed since the
+# last update, increment CURRENT, and set REVISION to 0.
+#
+# 5. If any interfaces have been added since the last public release,
+# then increment AGE.
+#
+# 6. If any interfaces have been removed since the last public release,
+# then set AGE to 0.
+#
+# PPL release -version-info
+# 0.1 -----
+# 0.2 -----
+# 0.3 -----
+# 0.4 0:0:0
+# 0.5 1:0:1
+# 0.6 1:0:1
+# 0.6.1 1:0:1
+# 0.7 1:0:1
+# 0.8 1:0:1
+# 0.9 1:0:1
+# 0.10 2:0:0
+# 0.10.1 2:0:0 (was not updated by mistake)
+# 0.10.2 3:0:1
+# 0.11 4:0:0
+
+LIBPPL_C_LT_CURRENT = 4
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE = 0
+
+
+if HAVE_PERL
+
+ppl_c.h: ppl_c_header.h ppl_c_version.h ppl_c_domains.h Makefile $(top_builddir)/utils/build_header
+ $(top_builddir)/utils/build_header \
+ -I $(top_builddir)/interfaces/C -I $(top_srcdir)/src \
+ $(top_srcdir)/interfaces/C/ppl_c_header.h >$@
+
+else !HAVE_PERL
+
+ppl_c.h: ppl_c.h.dist
+ cp -f ppl_c.h.dist $@
+
+endif !HAVE_PERL
+
+BUILT_SOURCES = \
+ppl_c.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+# ppl_c.h is not distributed.
+# ppl_c.h.dist, which is distributed, is a copy of ppl_c.h.
+dist-hook:
+ mv -f $(distdir)/ppl_c.h $(distdir)/ppl_c.h.dist
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+ppl_c_domains.h: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ppl_c_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_cc_files.m4 \
+ > ppl_c_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_c_cc_blob
+ rm -f ppl_c_cc_blob
+ echo timestamp >$@
+
+ppl_c_implementation_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_hh_files.m4 \
+ > ppl_c_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_c_hh_blob
+ rm -f ppl_c_hh_blob
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/interfaces/C \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+
+libppl_c_la_SOURCES = \
+ppl_c_implementation_common_defs.hh \
+ppl_c_implementation_common_inlines.hh \
+ppl_c_implementation_common.cc
+
+nodist_libppl_c_la_SOURCES =
+
+nodist_EXTRA_libppl_c_la_SOURCES = \
+ppl_c_Int8_Box.cc \
+ppl_c_Int16_Box.cc \
+ppl_c_Int32_Box.cc \
+ppl_c_Int64_Box.cc \
+ppl_c_Uint8_Box.cc \
+ppl_c_Uint16_Box.cc \
+ppl_c_Uint32_Box.cc \
+ppl_c_Uint64_Box.cc \
+ppl_c_Float_Box.cc \
+ppl_c_Double_Box.cc \
+ppl_c_Long_Double_Box.cc \
+ppl_c_Rational_Box.cc \
+ppl_c_Z_Box.cc \
+ppl_c_BD_Shape_int8_t.cc \
+ppl_c_BD_Shape_int16_t.cc \
+ppl_c_BD_Shape_int32_t.cc \
+ppl_c_BD_Shape_int64_t.cc \
+ppl_c_BD_Shape_float.cc \
+ppl_c_BD_Shape_double.cc \
+ppl_c_BD_Shape_long_double.cc \
+ppl_c_BD_Shape_mpq_class.cc \
+ppl_c_BD_Shape_mpz_class.cc \
+ppl_c_Octagonal_Shape_int8_t.cc \
+ppl_c_Octagonal_Shape_int16_t.cc \
+ppl_c_Octagonal_Shape_int32_t.cc \
+ppl_c_Octagonal_Shape_int64_t.cc \
+ppl_c_Octagonal_Shape_float.cc \
+ppl_c_Octagonal_Shape_double.cc \
+ppl_c_Octagonal_Shape_long_double.cc \
+ppl_c_Octagonal_Shape_mpq_class.cc \
+ppl_c_Octagonal_Shape_mpz_class.cc \
+ppl_c_Polyhedron.cc \
+ppl_c_Grid.cc \
+ppl_c_Pointset_Powerset_Int8_Box.cc \
+ppl_c_Pointset_Powerset_Int16_Box.cc \
+ppl_c_Pointset_Powerset_Int32_Box.cc \
+ppl_c_Pointset_Powerset_Int64_Box.cc \
+ppl_c_Pointset_Powerset_Uint8_Box.cc \
+ppl_c_Pointset_Powerset_Uint16_Box.cc \
+ppl_c_Pointset_Powerset_Uint32_Box.cc \
+ppl_c_Pointset_Powerset_Uint64_Box.cc \
+ppl_c_Pointset_Powerset_Float_Box.cc \
+ppl_c_Pointset_Powerset_Double_Box.cc \
+ppl_c_Pointset_Powerset_Long_Double_Box.cc \
+ppl_c_Pointset_Powerset_Rational_Box.cc \
+ppl_c_Pointset_Powerset_Z_Box.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_float.cc \
+ppl_c_Pointset_Powerset_BD_Shape_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_C_Polyhedron.cc \
+ppl_c_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_c_Pointset_Powerset_Grid.cc \
+ppl_c_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_c_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_c_la_LIBADD = \
+ at required_instantiations_c_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_c_la_DEPENDENCIES = \
+ at required_instantiations_c_cxx_objects@
+
+libppl_c_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+
+nodist_noinst_HEADERS = \
+ppl_c_domains.h \
+ppl_c_version.h
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_c_cxx_objects@
+
+CLEANFILES = \
+ at required_instantiations_c_cxx_sources@ \
+ at required_instantiations_c_cxx_headers@ \
+ppl_c.h \
+ppl_c_domains.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+DISTCLEANFILES = \
+ppl_c_version.h
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+$(top_builddir)/utils/build_header:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_c_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_c_la_SOURCES):
diff --git a/interfaces/C/Makefile.in b/interfaces/C/Makefile.in
new file mode 100644
index 0000000..166d346
--- /dev/null
+++ b/interfaces/C/Makefile.in
@@ -0,0 +1,1222 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/C
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(srcdir)/ppl_c_version.h.in \
+ $(top_srcdir)/depcomp $(include_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = ppl_c_version.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am_libppl_c_la_OBJECTS = ppl_c_implementation_common.lo
+nodist_libppl_c_la_OBJECTS =
+libppl_c_la_OBJECTS = $(am_libppl_c_la_OBJECTS) \
+ $(nodist_libppl_c_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_c_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libppl_c_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_c_la_SOURCES) $(nodist_libppl_c_la_SOURCES) \
+ $(nodist_EXTRA_libppl_c_la_SOURCES)
+DIST_SOURCES = $(libppl_c_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = . tests
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_cc_files.m4 \
+ppl_interface_generator_c_hh_files.m4 \
+ppl_interface_generator_c_cc_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_c_header.h \
+C_interface.dox
+
+
+# Libtool -version-info for libppl_c.la.
+#
+# 1. Start with version information of `0:0:0' for each Libtool library.
+#
+# 2. Update the version information only immediately before a public
+# release of your software. More frequent updates are unnecessary,
+# and only guarantee that the current interface number gets larger
+# faster.
+#
+# 3. If the library source code has changed at all since the last
+# update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+# 4. If any interfaces have been added, removed, or changed since the
+# last update, increment CURRENT, and set REVISION to 0.
+#
+# 5. If any interfaces have been added since the last public release,
+# then increment AGE.
+#
+# 6. If any interfaces have been removed since the last public release,
+# then set AGE to 0.
+#
+# PPL release -version-info
+# 0.1 -----
+# 0.2 -----
+# 0.3 -----
+# 0.4 0:0:0
+# 0.5 1:0:1
+# 0.6 1:0:1
+# 0.6.1 1:0:1
+# 0.7 1:0:1
+# 0.8 1:0:1
+# 0.9 1:0:1
+# 0.10 2:0:0
+# 0.10.1 2:0:0 (was not updated by mistake)
+# 0.10.2 3:0:1
+# 0.11 4:0:0
+LIBPPL_C_LT_CURRENT = 4
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE = 0
+BUILT_SOURCES = \
+ppl_c.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/interfaces/C \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+libppl_c_la_SOURCES = \
+ppl_c_implementation_common_defs.hh \
+ppl_c_implementation_common_inlines.hh \
+ppl_c_implementation_common.cc
+
+nodist_libppl_c_la_SOURCES =
+nodist_EXTRA_libppl_c_la_SOURCES = \
+ppl_c_Int8_Box.cc \
+ppl_c_Int16_Box.cc \
+ppl_c_Int32_Box.cc \
+ppl_c_Int64_Box.cc \
+ppl_c_Uint8_Box.cc \
+ppl_c_Uint16_Box.cc \
+ppl_c_Uint32_Box.cc \
+ppl_c_Uint64_Box.cc \
+ppl_c_Float_Box.cc \
+ppl_c_Double_Box.cc \
+ppl_c_Long_Double_Box.cc \
+ppl_c_Rational_Box.cc \
+ppl_c_Z_Box.cc \
+ppl_c_BD_Shape_int8_t.cc \
+ppl_c_BD_Shape_int16_t.cc \
+ppl_c_BD_Shape_int32_t.cc \
+ppl_c_BD_Shape_int64_t.cc \
+ppl_c_BD_Shape_float.cc \
+ppl_c_BD_Shape_double.cc \
+ppl_c_BD_Shape_long_double.cc \
+ppl_c_BD_Shape_mpq_class.cc \
+ppl_c_BD_Shape_mpz_class.cc \
+ppl_c_Octagonal_Shape_int8_t.cc \
+ppl_c_Octagonal_Shape_int16_t.cc \
+ppl_c_Octagonal_Shape_int32_t.cc \
+ppl_c_Octagonal_Shape_int64_t.cc \
+ppl_c_Octagonal_Shape_float.cc \
+ppl_c_Octagonal_Shape_double.cc \
+ppl_c_Octagonal_Shape_long_double.cc \
+ppl_c_Octagonal_Shape_mpq_class.cc \
+ppl_c_Octagonal_Shape_mpz_class.cc \
+ppl_c_Polyhedron.cc \
+ppl_c_Grid.cc \
+ppl_c_Pointset_Powerset_Int8_Box.cc \
+ppl_c_Pointset_Powerset_Int16_Box.cc \
+ppl_c_Pointset_Powerset_Int32_Box.cc \
+ppl_c_Pointset_Powerset_Int64_Box.cc \
+ppl_c_Pointset_Powerset_Uint8_Box.cc \
+ppl_c_Pointset_Powerset_Uint16_Box.cc \
+ppl_c_Pointset_Powerset_Uint32_Box.cc \
+ppl_c_Pointset_Powerset_Uint64_Box.cc \
+ppl_c_Pointset_Powerset_Float_Box.cc \
+ppl_c_Pointset_Powerset_Double_Box.cc \
+ppl_c_Pointset_Powerset_Long_Double_Box.cc \
+ppl_c_Pointset_Powerset_Rational_Box.cc \
+ppl_c_Pointset_Powerset_Z_Box.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_float.cc \
+ppl_c_Pointset_Powerset_BD_Shape_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_C_Polyhedron.cc \
+ppl_c_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_c_Pointset_Powerset_Grid.cc \
+ppl_c_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_c_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_c_la_LIBADD = \
+ at required_instantiations_c_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_c_la_DEPENDENCIES = \
+ at required_instantiations_c_cxx_objects@
+
+libppl_c_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+nodist_noinst_HEADERS = \
+ppl_c_domains.h \
+ppl_c_version.h
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_c_cxx_objects@
+
+CLEANFILES = \
+ at required_instantiations_c_cxx_sources@ \
+ at required_instantiations_c_cxx_headers@ \
+ppl_c.h \
+ppl_c_domains.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+DISTCLEANFILES = \
+ppl_c_version.h
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/C/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+ppl_c_version.h: $(top_builddir)/config.status $(srcdir)/ppl_c_version.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES) $(EXTRA_libppl_c_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_c_la_LINK) -rpath $(libdir) $(libppl_c_la_OBJECTS) $(libppl_c_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_implementation_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libLTLIBRARIES \
+ clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-includeHEADERS install-info \
+ install-info-am install-libLTLIBRARIES install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+
+ at HAVE_PERL_TRUE@ppl_c.h: ppl_c_header.h ppl_c_version.h ppl_c_domains.h Makefile $(top_builddir)/utils/build_header
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/build_header \
+ at HAVE_PERL_TRUE@ -I $(top_builddir)/interfaces/C -I $(top_srcdir)/src \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/interfaces/C/ppl_c_header.h >$@
+
+ at HAVE_PERL_FALSE@ppl_c.h: ppl_c.h.dist
+ at HAVE_PERL_FALSE@ cp -f ppl_c.h.dist $@
+
+# ppl_c.h is not distributed.
+# ppl_c.h.dist, which is distributed, is a copy of ppl_c.h.
+dist-hook:
+ mv -f $(distdir)/ppl_c.h $(distdir)/ppl_c.h.dist
+
+ppl_c_domains.h: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ppl_c_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_cc_files.m4 \
+ > ppl_c_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_c_cc_blob
+ rm -f ppl_c_cc_blob
+ echo timestamp >$@
+
+ppl_c_implementation_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_c_hh_files.m4 \
+ > ppl_c_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_c_hh_blob
+ rm -f ppl_c_hh_blob
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+$(top_builddir)/utils/build_header:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_c_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_c_la_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/C/ppl_c.h.dist b/interfaces/C/ppl_c.h.dist
new file mode 100644
index 0000000..a81d612
--- /dev/null
+++ b/interfaces/C/ppl_c.h.dist
@@ -0,0 +1,16187 @@
+/* This is the header file of the C interface of the Parma Polyhedra Library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*!
+ \defgroup PPL_C_interface C Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface
+ for the C language.
+*/
+
+/*! \mainpage
+
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures. The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+\note
+All functions taking as input argument an opaque pointer datatype assume
+that such an argument is actually <em>referring to a valid PPL object</em>.
+For instance, a function with an argument having type
+<code>ppl_MIP_Problem_t</code> will expect a valid MIP_Problem object,
+previously initialized by calling, e.g., <code>ppl_new_MIP_Problem</code>.
+If that is not the case (e.g., if a null pointer is passed in),
+the behavior is undefined.
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function. This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used. The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version. This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking. Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core). On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line. For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects. Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location. In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms. Consult your
+compiler's documentation for details. Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase. See Libtool's documentation for details. Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution. It contains a <EM>Mixed Integer (Linear)
+Programming</EM> solver written in C. In order to use this solver
+you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/ /* \mainpage */
+
+/*
+ For some reason, GMP up to and including version 4.1.3 requires
+ <stdio.h> to be included before <gmp.h>.
+*/
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+ PPL_PROTO is a macro used to wrap function prototypes, so that
+ compilers that don't understand ANSI C prototypes still work, and
+ ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__) \
+ || defined(__cplusplus) \
+ || defined (_AIX) \
+ || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+ || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \defgroup Init Library Initialization and Finalization
+ Functions for initialization/finalization of the library,
+ as well as setting/resetting of floating-point rounding mode.
+*/
+/*@{*/
+
+/*! \brief
+ Initializes the Parma Polyhedra Library.
+ This function must be called before any other function.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+ was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+ Finalizes the Parma Polyhedra Library.
+ This function must be called after any other function.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+ was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has been
+ previously called.
+*/
+int
+ppl_set_rounding_for_PPL PPL_PROTO((void));
+
+/*! \brief
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.
+*/
+int
+ppl_restore_pre_PPL_rounding PPL_PROTO((void));
+
+/*! \brief
+ Writes to \p p the precision parameter used for irrational calculations.
+*/
+int
+ppl_irrational_precision PPL_PROTO((unsigned* p));
+
+/*! \brief
+ Sets the precision parameter used for irrational calculations.
+
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for irrational calculations to \p p.
+ Then, in the irrational calculations returning an unbounded rational,
+ (e.g., when computing a square root), the lesser between numerator
+ and denominator will be limited to 2**\p p.
+*/
+int
+ppl_set_irrational_precision PPL_PROTO((unsigned p));
+
+/*@}*/ /* Init */
+
+/*! \defgroup Version Version Checking
+ Symbolic constants and functions related to library version checking.
+*/
+/*@{*/
+
+/* Automatically generated from PPL source file ../../interfaces/C/ppl_c_version.h line 1. */
+/* Header file providing version information for the C interface. -*- C -*-
+*/
+
+/*! \brief
+ A string containing the PPL version.
+
+ \ingroup Version
+ Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+ to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The
+ format of PPL_VERSION is <CODE>M "." m</CODE> if both
+ PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+ (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+ PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+ <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+ PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+ neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "1.1"
+
+/*! \brief
+ The major number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_MAJOR 1
+
+/*! \brief
+ The minor number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_MINOR 1
+
+/*! \brief
+ The revision number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+ The beta number of the PPL version. This is zero for official
+ releases and nonzero for development snapshots.
+ \ingroup Version
+*/
+#define PPL_VERSION_BETA 0
+
+/*! \brief
+ Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+ Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+ Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+ Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+ Writes to \c *p a pointer to a character string containing the
+ PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+ Writes to \c *p a pointer to a character string containing the PPL banner.
+
+ The banner provides information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \defgroup Error Error Handling
+ Symbolic constants and functions related to error reporting/handling.
+*/
+/*@{*/
+
+/*! \brief
+ Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+ /*! \hideinitializer
+ The virtual memory available to the process has been exhausted. */
+ PPL_ERROR_OUT_OF_MEMORY = -2,
+ /*! \hideinitializer
+ A function has been invoked with an invalid argument. */
+ PPL_ERROR_INVALID_ARGUMENT = -3,
+ /*! \hideinitializer
+ A function has been invoked outside its domain of definition. */
+ PPL_ERROR_DOMAIN_ERROR = -4,
+ /*! \hideinitializer
+ The construction of an object that would exceed its maximum
+ permitted size was attempted. */
+ PPL_ERROR_LENGTH_ERROR = -5,
+ /*! \hideinitializer
+ An arithmetic overflow occurred and the computation was consequently
+ interrupted. This can <EM>only</EM> happen in library's incarnations
+ using bounded integers as coefficients. */
+ PPL_ARITHMETIC_OVERFLOW = -6,
+ /*! \hideinitializer
+ An error occurred during a C input/output operation. A more
+ precise indication of what went wrong is available via
+ <CODE>errno</CODE>. */
+ PPL_STDIO_ERROR = -7,
+ /*! \hideinitializer
+ An internal error that was diagnosed by the PPL itself.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_INTERNAL_ERROR = -8,
+ /*! \hideinitializer
+ A standard exception has been raised by the C++ run-time environment.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+ /*! \hideinitializer
+ A totally unknown, totally unexpected error happened.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_UNEXPECTED_ERROR = -10,
+ /*! \hideinitializer
+ An exception has been raised by the PPL as a timeout previously set
+ by the user has expired.
+ */
+ PPL_TIMEOUT_EXCEPTION = -11,
+ /*! \hideinitializer
+ The client program attempted to use the PPL in a way that violates
+ its internal logic. This happens, for instance, when the client
+ attempts to use the timeout facilities on a system that does not
+ support them. */
+ PPL_ERROR_LOGIC_ERROR = -12
+};
+
+/*! \brief
+ Installs the user-defined error handler pointed at by \p h.
+
+ The error handler takes an error code and a textual description that
+ gives further information about the actual error. The C string
+ containing the textual description is read-only and its existence is
+ not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+ const char* description)));
+
+/*@}*/ /* Error */
+
+/*! \defgroup Timeout Timeout Handling
+ Functions for setting and resetting timeouts.
+*/
+/*@{*/
+
+/*! \brief
+ Sets the timeout for computations whose completion could require
+ an exponential amount of time.
+
+ \param csecs
+ The number of centiseconds sometimes after which a timeout will occur;
+ it must be strictly greater than zero.
+
+ Computations taking exponential time will be interrupted some time
+ after \p csecs centiseconds have elapsed since the call to
+ the timeout setting function. If the computation is interrupted that
+ way, the interrupted function will return error code
+ <code>PPL_TIMEOUT_EXCEPTION</code>.
+ Otherwise, if the computation completes without being interrupted,
+ then the timeout should be reset by calling
+ <code>ppl_reset_timeout()</code>.
+*/
+int
+ppl_set_timeout PPL_PROTO((unsigned csecs));
+
+/*! \brief
+ Resets the timeout time so that the computation is not interrupted.
+*/
+int
+ppl_reset_timeout PPL_PROTO((void));
+
+/*! \brief
+ Sets a threshold for computations whose completion could require
+ an exponential amount of time.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if \p unscaled_weight is zero
+ or if the computed weight threshold exceeds the maximum allowed value.
+
+ \param unscaled_weight
+ The unscaled maximum computational weight; it has to be non-zero.
+
+ \param scale
+ The scaling factor to be applied to \p unscaled_weight.
+
+ If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+ then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+ Computations taking exponential time will be interrupted some time
+ after reaching the complexity threshold \f$w\f$.
+ If the computation is interrupted that way, the interrupted function
+ will return error code <code>PPL_TIMEOUT_EXCEPTION</code>.
+ Otherwise, if the computation completes without being interrupted,
+ then the deterministic timeout should be reset by calling
+ <code>ppl_reset_deterministic_timeout()</code>.
+
+ \note
+ This "timeout" checking functionality is said to be \e deterministic
+ because it is not based on actual elapsed time. Its behavior will
+ only depend on (some of the) computations performed in the PPL library
+ and it will be otherwise independent from the computation environment
+ (CPU, operating system, compiler, etc.).
+
+ \warning
+ The weight mechanism is under beta testing. In particular,
+ there is still no clear relation between the weight threshold and
+ the actual computational complexity. As a consequence, client
+ applications should be ready to reconsider the tuning of these
+ weight thresholds when upgrading to newer version of the PPL.
+*/
+int
+ppl_set_deterministic_timeout PPL_PROTO((unsigned long unscaled_weight,
+ unsigned scale));
+
+/*! \brief
+ Resets the deterministic timeout so that the computation is not interrupted.
+*/
+int
+ppl_reset_deterministic_timeout PPL_PROTO((void));
+
+/*@}*/ /* Timeout */
+
+/*! \defgroup Datatypes Library Datatypes
+ \brief
+ Typedefs for the library datatypes and related symbolic constants.
+
+ The datatypes provided by the library should be manipulated
+ by means of the corresponding opaque pointer types and
+ the functions working on them.
+
+ \note
+ To simplify the detection of common programming mistakes,
+ we provide both pointer-to-const and pointer-to-nonconst
+ opaque pointers, with implicit conversions mapping each
+ pointer-to-nonconst to the corresponding pointer-to-const when needed.
+ The user of the C interface is therefore recommended to adopt
+ the pointer-to-const type whenever read-only access is meant.
+*/
+/*@{*/
+
+/*! \brief
+ An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \brief
+ Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+ Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+ Pretty-prints \p var to <CODE>stdout</CODE>.
+*/
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief
+ Pretty-prints \p var to the given output \p stream.
+*/
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+/*! \brief
+ Pretty-prints \p var to a malloc-allocated string, a pointer to which
+ is returned via \p strp.
+*/
+int
+ppl_io_asprint_variable PPL_PROTO((char** strp, ppl_dimension_type var));
+
+/*! \brief
+ The type of output functions used for printing variables.
+
+ An output function for variables must write a textual representation
+ for \p var to a character buffer, null-terminate it, and return a
+ pointer to the beginning of the buffer. In case the operation fails,
+ 0 should be returned and perhaps <CODE>errno</CODE> should be set
+ in a meaningful way. The library does nothing with the buffer, besides
+ printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+ Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+ Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*! \brief Utility function for the wrapping of lines of text.
+
+ \param src
+ The source string holding the text to wrap.
+
+ \param indent_depth
+ The indentation depth.
+
+ \param preferred_first_line_length
+ The preferred length for the first line of text.
+
+ \param preferred_line_length
+ The preferred length for all the lines but the first one.
+
+ \return
+ The wrapped string in a malloc-allocated buffer.
+*/
+char*
+ppl_io_wrap_string(const char* src,
+ unsigned indent_depth,
+ unsigned preferred_first_line_length,
+ unsigned preferred_line_length);
+
+/*@}*/ /* Datatypes */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) \
+/*! \brief Opaque pointer \ingroup Datatypes */ \
+typedef struct ppl_##Type##_tag* ppl_##Type##_t; \
+/*! \brief Opaque pointer to const object \ingroup Datatypes */ \
+typedef struct ppl_##Type##_tag const* ppl_const_##Type##_t;
+
+/*! \interface ppl_Coefficient_tag
+ \brief
+ Types and functions for coefficients.
+
+ The types and functions for coefficients provide an interface towards
+ \extref{Parma_Polyhedra_Library::Coefficient, Coefficient}.
+ Depending on configuration, the PPL coefficients may be implemented
+ by the unbounded precision integers provided by GMP (default),
+ or by bounded precision integers (with checks for overflows).
+*/
+PPL_TYPE_DECLARATION(Coefficient)
+
+/*! \interface ppl_Linear_Expression_tag
+ \brief
+ Types and functions for linear expressions.
+
+ The types and functions for linear expression provide an interface towards
+ \extref{Parma_Polyhedra_Library::Linear_Expression, Linear_Expression}.
+*/
+PPL_TYPE_DECLARATION(Linear_Expression)
+
+/*! \interface ppl_Constraint_tag
+ \brief
+ Types and functions for constraints.
+
+ The types and functions for constraints provide an interface towards
+ \extref{Parma_Polyhedra_Library::Constraint, Constraint}.
+*/
+PPL_TYPE_DECLARATION(Constraint)
+
+/*! \interface ppl_Constraint_System_tag
+ \brief
+ Types and functions for constraint systems.
+
+ The types and functions for constraint systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Constraint_System, Constraint_System}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System)
+
+/*! \interface ppl_Constraint_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on constraint systems.
+
+ The types and functions for constraint systems iterators provide
+ read-only access to the elements of a constraint system by interfacing
+ \extref{Parma_Polyhedra_Library::Constraint_System_const_iterator,
+ Constraint_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator)
+
+/*! \interface ppl_Generator_tag
+ \brief
+ Types and functions for generators.
+
+ The types and functions for generators provide an interface
+ towards \extref{Parma_Polyhedra_Library::Generator, Generator}.
+*/
+PPL_TYPE_DECLARATION(Generator)
+
+/*! \interface ppl_Generator_System_tag
+ \brief
+ Types and functions for generator systems.
+
+ The types and functions for generator systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Generator_System, Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Generator_System)
+
+/*! \interface ppl_Generator_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on generator systems.
+
+ The types and functions for generator systems iterators provide
+ read-only access to the elements of a generator system by interfacing
+ \extref{Parma_Polyhedra_Library::Generator_System_const_iterator,
+ Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Generator_System_const_iterator)
+
+/*! \interface ppl_Congruence_tag
+ \brief
+ Types and functions for congruences.
+
+ The types and functions for congruences provide an interface
+ towards \extref{Parma_Polyhedra_Library::Congruence, Congruence}.
+*/
+PPL_TYPE_DECLARATION(Congruence)
+
+/*! \interface ppl_Congruence_System_tag
+ \brief
+ Types and functions for congruence systems.
+
+ The types and functions for congruence systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Congruence_System, Congruence_System}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System)
+
+/*! \interface ppl_Congruence_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on congruence systems.
+
+ The types and functions for congruence systems iterators provide
+ read-only access to the elements of a congruence system by interfacing
+ \extref{Parma_Polyhedra_Library::Congruence_System::const_iterator,
+ Congruence_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System_const_iterator)
+
+/*! \interface ppl_Grid_Generator_tag
+ \brief
+ Types and functions for grid generators.
+
+ The types and functions for grid generators provide an interface
+ towards \extref{Parma_Polyhedra_Library::Grid_Generator, Grid_Generator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator)
+
+/*! \interface ppl_Grid_Generator_System_tag
+ \brief
+ Types and functions for grid generator systems.
+
+ The types and functions for grid generator systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Grid_Generator_System,
+ Grid_Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System)
+
+/*! \interface ppl_Grid_Generator_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on grid generator systems.
+
+ The types and functions for grid generator systems iterators provide
+ read-only access to the elements of a grid generator system by interfacing
+ \extref{Parma_Polyhedra_Library::Grid_Generator_System::const_iterator,
+ Grid_Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System_const_iterator)
+
+/*! \interface ppl_MIP_Problem_tag
+ \brief
+ Types and functions for MIP problems.
+
+ The types and functions for MIP problems provide an interface
+ towards \extref{Parma_Polyhedra_Library::MIP_Problem, MIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(MIP_Problem)
+
+/*! \interface ppl_PIP_Problem_tag
+ \brief
+ Types and functions for PIP problems.
+
+ The types and functions for PIP problems provide an interface
+ towards \extref{Parma_Polyhedra_Library::PIP_Problem, PIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(PIP_Problem)
+
+/*! \interface ppl_PIP_Tree_Node_tag
+ \brief
+ Types and functions for generic PIP tree nodes.
+
+ The types and functions for tree nodes provide an interface
+ towards \extref{Parma_Polyhedra_Library::PIP_Tree_Node, PIP_Tree_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Tree_Node)
+
+/*! \interface ppl_PIP_Decision_Node_tag
+ \brief
+ Types and functions for PIP decision nodes.
+
+ The types and functions for decision nodes provide an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Decision_Node, PIP_Decision_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Decision_Node)
+
+/*! \interface ppl_PIP_Solution_Node_tag
+ \brief
+ Types and functions for PIP solution nodes.
+
+ The types and functions for solution nodes provide an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Solution_Node, PIP_Solution_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Solution_Node)
+
+/*! \interface ppl_Artificial_Parameter_tag
+ \brief
+ Types and functions for PIP artificial parameters.
+
+ The types and functions for PIP artificial parameters provide
+ an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter, Artificial_Parameter}.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter)
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence)
+
+/*! \interface ppl_Artificial_Parameter_Sequence_const_iterator_tag
+ \brief
+ Types and functions for iterating on PIP artificial parameters.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence_const_iterator)
+
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+#define PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_##Type##_ascii_dump \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_##Type##_ascii_load \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_IO_FUNCTIONS(Type) \
+PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#define PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to \c stdout. */ \
+int \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to a malloc-allocated string, a pointer to which is returned via \p strp. */ \
+int \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+
+#define PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Dumps an ascii representation of \p x on \p stream. */ \
+int \
+ppl_##Type##_ascii_dump \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream)); \
+/*! \relates ppl_##Type##_tag \brief Loads an ascii representation of \p x from \p stream. */ \
+int \
+ppl_##Type##_ascii_load \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Type) \
+/*! \brief \name Input/Output Functions */ \
+/*@{*/ \
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type) \
+PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*@}*/ /* Input/Output Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+ Creates a new coefficient with value 0 and writes a handle for the
+ newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Creates a new coefficient with the value given by the GMP integer
+ \p z and writes a handle for the newly created coefficient
+ at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Builds a coefficient that is a copy of \p c; writes a handle
+ for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+ ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Read-Only Accessor Functions */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+ Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded; returns 0
+ otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded, in which case
+ \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded, in which case
+ \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Read-Only Accessor Functions */
+
+/* No ascii dump for Coefficient */
+/*! \brief \name I/O Functions */
+/*@{*/
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Coefficient)
+/*@}*/ /* I/O Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Creates a new linear expression corresponding to the constant 0 in a
+ zero-dimensional space; writes a handle for the new linear
+ expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Creates a new linear expression corresponding to the constant 0 in a
+ <TT>d</TT>-dimensional space; writes a handle for the new linear
+ expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression that is a copy of \p le; writes a handle
+ for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to constraint \p c;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to generator \p g;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to congruence \p c;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Congruence
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to grid generator \p g;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Grid_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Invalidates the handle \p le: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns a positive integer if \p le is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p le is broken. Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+*/
+int
+ppl_Linear_Expression_is_zero PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+*/
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions that Do Not Modify the Linear Expression */
+
+/*! \brief \name Functions that May Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds \p n to the coefficient of variable \p var in the linear
+ expression \p le. The space dimension is set to be the maximum
+ between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds \p n to the inhomogeneous term of the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*@}*/ /* Functions that May Modify the Linear Expression */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Linear_Expression)
+
+/*! \brief \ingroup Datatypes
+ Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+ /*! The constraint is of the form \f$e < 0\f$. */
+ PPL_CONSTRAINT_TYPE_LESS_THAN,
+ /*! The constraint is of the form \f$e \leq 0\f$. */
+ PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL,
+ /*! The constraint is of the form \f$e = 0\f$. */
+ PPL_CONSTRAINT_TYPE_EQUAL,
+ /*! The constraint is of the form \f$e \geq 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL,
+ /*! The constraint is of the form \f$e > 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the new constraint `\p le \p rel 0' and writes a handle for
+ it at address \p pc. The space dimension of the new constraint is
+ equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Constraint_Type rel));
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+ also known as <EM>positivity constraint</EM>.
+ A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+ Builds a constraint that is a copy of \p c; writes a handle
+ for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+ Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+ ppl_const_Constraint_t src));
+
+/*! \relates ppl_Constraint_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+ Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_tag \brief
+ Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+ Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds an empty system of constraints and writes a handle to it at
+ address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds a zero-dimensional, unsatisfiable constraint system and
+ writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds the singleton constraint system containing only a copy of
+ constraint \p c; writes a handle for the newly created system at
+ address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds a constraint system that is a copy of \p cs; writes a handle
+ for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Invalidates the handle \p cs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs contains no (non-trivial) constraint;
+ returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_empty
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs contains any (non-trivial) strict
+ inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" to the beginning of
+ the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" past the end of the
+ constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p cs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint System */
+
+/*! \brief \name Functions that May Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Removes all the constraints from the constraint system \p cs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Inserts a copy of the constraint \p c into \p cs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+ ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that May Modify the Constraint System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p cit; writes a
+ handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Invalidates the handle \p cit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Dereference \p cit writing a const handle to the resulting
+ constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+ /*! The generator is a line. */
+ PPL_GENERATOR_TYPE_LINE,
+ /*! The generator is a ray. */
+ PPL_GENERATOR_TYPE_RAY,
+ /*! The generator is a point. */
+ PPL_GENERATOR_TYPE_POINT,
+ /*! The generator is a closure point. */
+ PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+ Creates a new generator of direction \p le and type \p t. If the
+ generator to be created is a point or a closure point, the divisor
+ \p d is applied to \p le. For other types of generators \p d is
+ simply disregarded. A handle for the new generator is written at
+ address \p pg. The space dimension of the new generator is equal to
+ the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Generator_Type t,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Generator_tag \brief
+ Creates the point that is the origin of the zero-dimensional space
+ \f$\Rset^0\f$. Writes a handle for the new generator at address
+ \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+ Creates, as a closure point, the point that is the origin of the
+ zero-dimensional space \f$\Rset^0\f$. Writes a handle for the new
+ generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+ Builds a generator that is a copy of \p g; writes a handle
+ for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+ ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+ Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+ ppl_const_Generator_t src));
+
+/*! \relates ppl_Generator_tag \brief
+ Invalidates the handle \p g: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+ Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_tag \brief
+ Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+ Copies into \p n the coefficient of variable \p var in generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+ If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+ Returns a positive integer if \p g is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p g is broken. Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds an empty system of generators and writes a handle to it at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+ Creates the universe zero-dimensional system of generators (i.e.,
+ containing the origin only). Writes a handle to the new system at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds the singleton generator system containing only a copy of
+ generator \p g; writes a handle for the newly created system at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+ ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds a generator system that is a copy of \p gs; writes a handle
+ for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Invalidates the handle \p gs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Returns a positive integer if \p gs contains no generators;
+ returns 0 otherwise.
+*/
+int
+ppl_Generator_System_empty
+PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" to the beginning of
+ the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" past the end of the
+ generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Returns a positive integer if \p gs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p gs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Generator System */
+
+/*! \brief \name Functions that May Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Removes all the generators from the generator system \p gs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Inserts a copy of the generator \p g into \p gs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+ ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p git; writes a
+ handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Invalidates the handle \p git: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Dereference \p git writing a const handle to the resulting
+ generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the new congruence \f$le = 0 \pmod{m}\f$ and writes a handle for
+ it at address \p pc. The space dimension of the new congruence is
+ equal to the space dimension of \p le.
+*/
+int
+ppl_new_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the unsatisfiable (zero-dimension space) congruence
+ \f$0 = 1 \pmod{0}\f$ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_false PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+ also known as <EM>integrality congruence</EM>.
+ A handle for the newly created congruence is written at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_integrality PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+ Builds a congruence that is a copy of \p c; writes a handle
+ for the newly created congruence at address \p pc.
+*/
+int
+ppl_new_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+ ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_tag \brief
+ Assigns a copy of the congruence \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t dst,
+ ppl_const_Congruence_t src));
+
+/*! \relates ppl_Congruence_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+ Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Congruence_space_dimension PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ congruence \p c.
+*/
+int
+ppl_Congruence_coefficient PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p n the inhomogeneous term of congruence \p c.
+*/
+int
+ppl_Congruence_inhomogeneous_term PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p m the modulus of congruence \p c.
+*/
+int
+ppl_Congruence_modulus PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Congruence_OK PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds an empty system of congruences and writes a handle to it at
+ address \p pcs.
+*/
+int
+ppl_new_Congruence_System PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds a zero-dimensional, unsatisfiable congruence system and
+ writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_zero_dim_empty
+PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds the singleton congruence system containing only a copy of
+ congruence \p c; writes a handle for the newly created system at
+ address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds a congruence system that is a copy of \p cs; writes a handle
+ for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns a copy of the congruence system \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Invalidates the handle \p cs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Congruence_System_space_dimension
+PPL_PROTO((ppl_const_Congruence_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Returns a positive integer if \p cs contains no (non-trivial) congruence;
+ returns 0 otherwise.
+*/
+int
+ppl_Congruence_System_empty
+PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" to the beginning of
+ the congruence system \p cs.
+*/
+int
+ppl_Congruence_System_begin
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" past the end of the
+ congruence system \p cs.
+*/
+int
+ppl_Congruence_System_end
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Returns a positive integer if \p cs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p cs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Congruence_System_OK PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence System */
+
+/*! \brief \name Functions that May Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Removes all the congruences from the congruence system \p cs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Congruence_System_clear PPL_PROTO((ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Inserts a copy of the congruence \p c into \p cs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Congruence_System_insert_Congruence PPL_PROTO((ppl_Congruence_System_t cs,
+ ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that May Modify the Congruence System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p cit; writes a
+ handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit,
+ ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t dst,
+ ppl_const_Congruence_System_const_iterator_t src));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Invalidates the handle \p cit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System_const_iterator
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Dereference \p cit writing a const handle to the resulting
+ congruence at address \p pc.
+*/
+int
+ppl_Congruence_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit,
+ ppl_const_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Increment \p cit so that it "points" to the next congruence.
+*/
+int
+ppl_Congruence_System_const_iterator_increment
+PPL_PROTO((ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Congruence_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t x,
+ ppl_const_Congruence_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Describes the different kinds of grid generators.
+*/
+enum ppl_enum_Grid_Generator_Type {
+ /*! The grid generator is a line. */
+ PPL_GRID_GENERATOR_TYPE_LINE,
+ /*! The grid generator is a parameter. */
+ PPL_GRID_GENERATOR_TYPE_PARAMETER,
+ /*! The grid generator is a point. */
+ PPL_GRID_GENERATOR_TYPE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Creates a new grid generator of direction \p le and type \p t. If the
+ grid generator to be created is a point or a parameter, the divisor
+ \p d is applied to \p le. If it is a line, \p d is simply disregarded.
+ A handle for the new grid generator is written at address \p pg.
+ The space dimension of the new grid generator is equal to the space
+ dimension of \p le.
+*/
+int
+ppl_new_Grid_Generator PPL_PROTO((ppl_Grid_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Grid_Generator_Type t,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Creates the point that is the origin of the zero-dimensional space
+ \f$\Rset^0\f$. Writes a handle for the new grid generator at address
+ \p pg.
+*/
+int
+ppl_new_Grid_Generator_zero_dim_point PPL_PROTO((ppl_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Builds a grid generator that is a copy of \p g; writes a handle
+ for the newly created grid generator at address \p pg.
+*/
+int
+ppl_new_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t* pg, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Assigns a copy of the grid generator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t dst,
+ ppl_const_Grid_Generator_t src));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Invalidates the handle \p g: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Grid_Generator_space_dimension PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Returns the type of grid generator \p g.
+*/
+int
+ppl_Grid_Generator_type PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ grid generator \p g.
+*/
+int
+ppl_Grid_Generator_coefficient PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ If \p g is a point or a parameter assigns its divisor to \p n.
+*/
+int
+ppl_Grid_Generator_divisor PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Returns a positive integer if \p g is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p g is broken. Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_OK PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds an empty system of grid generators and writes a handle to it at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*
+ Creates the universe zero-dimensional system of grid generators (i.e.,
+ containing the origin only). Writes a handle to the new system at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds the singleton grid generator system containing only a copy of
+ generator \p g; writes a handle for the newly created system at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+ ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds a grid generator system that is a copy of \p gs; writes a handle
+ for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+ ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns a copy of the grid generator system \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t dst,
+ ppl_const_Grid_Generator_System_t src));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Invalidates the handle \p gs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Grid_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Returns a positive integer if \p gs contains no generator;
+ returns 0 otherwise.
+*/
+int
+ppl_Grid_Generator_System_empty
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" to the beginning of
+ the grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_begin
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" past the end of the
+ grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_end
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Returns a positive integer if \p gs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p gs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_System_OK PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Grid Generator System */
+
+/*! \brief \name Functions that May Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Removes all the generators from the grid generator system \p gs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Grid_Generator_System_clear PPL_PROTO((ppl_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Inserts a copy of the grid generator \p g into \p gs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t gs,
+ ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Grid Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p git; writes a
+ handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit,
+ ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t dst,
+ ppl_const_Grid_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Invalidates the handle \p git: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Dereference \p git writing a const handle to the resulting
+ grid generator at address \p pg.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git,
+ ppl_const_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Increment \p git so that it "points" to the next grid generator.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t x,
+ ppl_const_Grid_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief \ingroup Datatypes
+ Code of the worst-case exponential but typically polynomial
+ complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief \ingroup Datatypes
+ Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron and the set of points
+ satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron intersects the set of
+ points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron is included in the set of
+ points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron is included in the set of
+ points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that adding the generator would not change the
+ polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+
+/*! \brief \ingroup Datatypes
+ Widths of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Width {
+ /*! \hideinitializer 8 bits. */
+ PPL_BITS_8 = 8,
+ /*! \hideinitializer 16 bits. */
+ PPL_BITS_16 = 16,
+ /*! \hideinitializer 32 bits. */
+ PPL_BITS_32 = 32,
+ /*! \hideinitializer 64 bits. */
+ PPL_BITS_64 = 64,
+ /*! \hideinitializer 128 bits. */
+ PPL_BITS_128 = 128
+};
+
+/*! \brief \ingroup Datatypes
+ Representation of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Representation {
+ /*! Unsigned binary. */
+ PPL_UNSIGNED,
+ /*! \brief
+ Signed binary where negative values are represented by the two's
+ complement of the absolute value.
+ */
+ PPL_SIGNED_2_COMPLEMENT
+};
+
+/*! \brief \ingroup Datatypes
+ Overflow behavior of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Overflow {
+ /*! \brief
+ On overflow, wrapping takes place.
+
+ This means that, for a \f$w\f$-bit bounded integer, the computation
+ happens modulo \f$2^w\f$.
+ */
+ PPL_OVERFLOW_WRAPS,
+
+ /*! \brief
+ On overflow, the result is undefined.
+
+ This simply means that the result of the operation resulting in an
+ overflow can take any value.
+
+ \note
+ Even though something more serious can happen in the system
+ being analyzed ---due to, e.g., C's undefined behavior---, here we
+ are only concerned with the results of arithmetic operations.
+ It is the responsibility of the analyzer to ensure that other
+ manifestations of undefined behavior are conservatively approximated.
+ */
+ PPL_OVERFLOW_UNDEFINED,
+
+ /*! \brief
+ Overflow is impossible.
+
+ This is for the analysis of languages where overflow is trapped
+ before it affects the state, for which, thus, any indication that
+ an overflow may have affected the state is necessarily due to
+ the imprecision of the analysis.
+ */
+ PPL_OVERFLOW_IMPOSSIBLE
+};
+
+/*! \brief \name Symbolic Constants */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "maximization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "minimization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "unfeasible MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "unbounded MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "optimized MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code for the MIP problem's "pricing" control parameter name.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "textbook" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "exact steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "float steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+
+
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of the "unfeasible PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of the "optimized PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code for the PIP problem's "cutting strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code for the PIP problem's "pivot row strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "first" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "deepest" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "all" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "first" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "max column" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+/*@}*/ /* Symbolic Constants */
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a trivial MIP problem of dimension \p d and writes a
+ handle to it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_space_dimension PPL_PROTO((ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a MIP problem of space dimension \p d having feasible region \p cs,
+ objective function \p le and optimization mode \p m; writes a handle to
+ it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem PPL_PROTO((ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d,
+ ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t le,
+ int m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a MIP problem that is a copy of \p mip; writes a handle
+ for the newly created system at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t* pmip, ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Assigns a copy of the MIP problem \p src to \p dst.
+*/
+int
+ppl_assign_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t dst, ppl_const_MIP_Problem_t src));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Invalidates the handle \p mip: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_MIP_Problem PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for MIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p mip.
+*/
+int
+ppl_MIP_Problem_space_dimension
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the number of integer space dimensions of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes in the first positions of the array \p ds all the integer space
+ dimensions of problem \p mip. If the array is not big enough to hold
+ all of the integer space dimensions, the behavior is undefined.
+*/
+int
+ppl_MIP_Problem_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the number of constraints defining
+ the feasible region of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_constraints PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes at address \p pc a const handle to the \p i-th constraint
+ defining the feasible region of the MIP problem \p mip
+*/
+int
+ppl_MIP_Problem_constraint_at_index PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to the linear expression defining the
+ objective function of the MIP problem \p mip at address \p ple.
+*/
+int
+ppl_MIP_Problem_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Linear_Expression_t* ple));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the optimization mode of the MIP problem \p mip.
+*/
+int
+ppl_MIP_Problem_optimization_mode PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns a positive integer if \p mip is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p mip is broken. Useful for debugging purposes.
+*/
+int
+ppl_MIP_Problem_OK PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+/*! \brief \name Functions that May Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Resets the MIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_MIP_Problem_clear PPL_PROTO((ppl_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Adds \p d new dimensions to the space enclosing the MIP problem \p mip
+ and to \p mip itself.
+*/
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the space dimensions that are specified in first \p n positions
+ of the array \p ds to be integer dimensions of problem \p mip.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Modifies the feasible region of the MIP problem \p mip by adding a copy
+ of the constraint \p c.
+*/
+int
+ppl_MIP_Problem_add_constraint PPL_PROTO((ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Modifies the feasible region of the MIP problem \p mip by adding a copy
+ of the constraints in \p cs.
+*/
+int
+ppl_MIP_Problem_add_constraints PPL_PROTO((ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the objective function of the MIP problem \p mip to a copy of \p le.
+*/
+int
+ppl_MIP_Problem_set_objective_function
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the optimization mode of the MIP problem \p mip to \p mode.
+*/
+int
+ppl_MIP_Problem_set_optimization_mode PPL_PROTO((ppl_MIP_Problem_t mip,
+ int mode));
+
+/*@}*/ /* Functions that May Modify the MIP_Problem */
+
+/*! \brief \name Computing the Solution of the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns a positive integer if \p mip is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_MIP_Problem_is_satisfiable PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Solves the MIP problem \p mip, returning an exit status.
+
+ \return
+ <CODE>PPL_MIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the MIP problem
+ is not satisfiable;
+ <CODE>PPL_MIP_PROBLEM_STATUS_UNBOUNDED</CODE> if the MIP problem
+ is satisfiable but there is no finite bound to the value of
+ the objective function;
+ <CODE>PPL_MIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the MIP problem
+ admits an optimal solution.
+*/
+int
+ppl_MIP_Problem_solve PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Evaluates the objective function of \p mip on point \p g.
+
+ \param mip
+ The MIP problem defining the objective function;
+
+ \param g
+ The generator on which the objective function will be evaluated;
+
+ \param num
+ Will be assigned the numerator of the objective function value;
+
+ \param den
+ Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_MIP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Generator_t g,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to a feasible point for the MIP problem \p mip
+ at address \p pg.
+*/
+int
+ppl_MIP_Problem_feasible_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to an optimizing point for the MIP problem \p mip
+ at address \p pg.
+*/
+int
+ppl_MIP_Problem_optimizing_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the optimal value for \p mip.
+
+ \param mip
+ The MIP problem;
+
+ \param num
+ Will be assigned the numerator of the optimal value;
+
+ \param den
+ Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_MIP_Problem_optimal_value
+PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*@}*/ /* Computing the Solution of the MIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the value of control parameter \p name in problem \p mip.
+*/
+int
+ppl_MIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_MIP_Problem_t mip, int name));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets control parameter \p value in problem \p mip.
+*/
+int
+ppl_MIP_Problem_set_control_parameter
+PPL_PROTO((ppl_MIP_Problem_t mip, int value));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory occupied by \p mip.
+*/
+int
+ppl_MIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory managed by \p mip.
+*/
+int
+ppl_MIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a trivial PIP problem of dimension \p d and writes a
+ handle to it at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_space_dimension PPL_PROTO((ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a PIP problem that is a copy of \p pip; writes a handle
+ for the newly created problem at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t* ppip, ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Assigns a copy of the PIP problem \p src to \p dst.
+*/
+int
+ppl_assign_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t dst, ppl_const_PIP_Problem_t src));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a PIP problem having space dimension \p d from the sequence
+ of constraints in the range \f$[\mathrm{first}, \mathrm{last})\f$;
+ the \p n dimensions whose indices occur in \p ds are interpreted as
+ parameters.
+*/
+int
+ppl_new_PIP_Problem_from_constraints
+PPL_PROTO((ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d,
+ ppl_Constraint_System_const_iterator_t first,
+ ppl_Constraint_System_const_iterator_t last,
+ size_t n,
+ ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Invalidates the handle \p pip: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Problem PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for PIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p pip.
+
+ The vector space dimensions includes both the problem variables
+ and the problem parameters, but they do not include the artificial
+ parameters.
+*/
+int
+ppl_PIP_Problem_space_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the number of parameter space dimensions of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes in the first positions of the array \p ds all the parameter space
+ dimensions of problem \p pip. If the array is not big enough to hold
+ all of the parameter space dimensions, the behavior is undefined.
+*/
+int
+ppl_PIP_Problem_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *pd the big parameter dimension of PIP problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_big_parameter_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* pd));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the number of constraints defining
+ the feasible region of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_constraints PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes at address \p pc a const handle to the \p i-th constraint
+ defining the feasible region of the PIP problem \p pip
+*/
+int
+ppl_PIP_Problem_constraint_at_index PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory occupied by \p pip.
+*/
+int
+ppl_PIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory managed by \p pip.
+*/
+int
+ppl_PIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns a positive integer if \p pip is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p pip is broken. Useful for debugging purposes.
+*/
+int
+ppl_PIP_Problem_OK PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Functions that Do Not Modify the PIP_Problem */
+
+/*! \brief \name Functions that May Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Resets the PIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_PIP_Problem_clear PPL_PROTO((ppl_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+ and embeds the PIP problem \p pip in the new vector space.
+
+ \param pip
+ The PIP problem to be embedded in the new vector space.
+
+ \param pip_vars
+ The number of space dimensions to add that are interpreted as
+ PIP problem variables (i.e., non parameters). These are added
+ \e before adding the \p pip_params parameters.
+
+ \param pip_params
+ The number of space dimensions to add that are interpreted as
+ PIP problem parameters. These are added \e after having added the
+ \p pip_vars problem variables.
+
+ The new space dimensions will be those having the highest indexes
+ in the new PIP problem; they are initially unconstrained.
+*/
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_dimension_type pip_vars,
+ ppl_dimension_type pip_params));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets the space dimensions that are specified in first \p n positions
+ of the array \p ds to be parameter dimensions of problem \p pip.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets the big parameter dimension of PIP problem \p pip to \p d.
+*/
+int
+ppl_PIP_Problem_set_big_parameter_dimension
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Modifies the feasible region of the PIP problem \p pip by adding a copy
+ of the constraint \p c.
+*/
+int
+ppl_PIP_Problem_add_constraint PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Modifies the feasible region of the PIP problem \p pip by adding a copy
+ of the constraints in \p cs.
+*/
+int
+ppl_PIP_Problem_add_constraints PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that May Modify the PIP_Problem */
+
+/*! \brief \name Computing and Printing the Solution of the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns a positive integer if \p pip is satisfiable and an optimal
+ solution can be found; returns 0 otherwise.
+*/
+int
+ppl_PIP_Problem_is_satisfiable PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Solves the PIP problem \p pip, returning an exit status.
+
+ \return
+ <CODE>PPL_PIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the PIP problem
+ is not satisfiable;
+ <CODE>PPL_PIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the PIP problem
+ admits an optimal solution.
+*/
+int
+ppl_PIP_Problem_solve PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p pip_tree a solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p pip_tree an optimizing solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_optimizing_solution
+PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*@}*/ /* Computing the Solution of the PIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns the value of control parameter \p name in problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_PIP_Problem_t pip, int name));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets control parameter \p value in problem \p pip.
+*/
+int
+ppl_PIP_Problem_set_control_parameter
+PPL_PROTO((ppl_PIP_Problem_t pip, int value));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p dpip_tree the solution node if \p spip_tree is
+ a solution node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_solution
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Solution_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p dpip_tree the decision node if \p spip_tree
+ is a decision node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_decision
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Decision_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p pcs the local system of parameter constraints
+ at the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_get_constraints
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Returns a positive integer if \p pip_tree is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p pip_tree is broken. Useful for debugging purposes.
+*/
+int
+ppl_PIP_Tree_Node_OK PPL_PROTO((ppl_const_PIP_Tree_Node_t pip));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p m the number of elements in the artificial parameter sequence
+ in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_number_of_artificials
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Assigns to \p pit a const iterator "pointing" to the beginning of
+ the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_begin
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Assigns to \p pit a const iterator "pointing" to the end of
+ the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_end
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Solution_Node_tag \brief
+ Writes to \p le a const pointer to the parametric expression of the values
+ of variable \p var in solution node \p pip_sol.
+
+ The linear expression assigned to \p le will only refer to
+ (problem or artificial) parameters.
+
+ \param pip_sol
+ The solution tree node.
+
+ \param var
+ The variable which is queried about.
+
+ \param le
+ The returned expression for variable \p var.
+
+ \return PPL_ERROR_INVALID_ARGUMENT
+ Returned if \p var is dimension-incompatible with \p *this
+ or if \p var is a problem parameter.
+*/
+int
+ppl_PIP_Solution_Node_get_parametric_values
+PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t* le));
+
+/*! \relates ppl_PIP_Decision_Node_tag \brief
+ Writes to \p pip_tree a const pointer to either the true branch
+ (if \p b is not zero) or the false branch (if \p b is zero) of \p pip_dec.
+*/
+int
+ppl_PIP_Decision_Node_get_child_node
+PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec,
+ int b,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p le the linear expression in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Linear_Expression_t le));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ the artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_coefficient
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the inhomogeneous term of the artificial
+ parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_inhomogeneous_term
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the denominator in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_denominator
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Coefficient_t n));
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p apit; writes a
+ handle for the newly created const iterator at address \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t src));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Invalidates the handle \p apit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Dereference \p apit writing a const handle to the resulting
+ artificial parameter at address \p pap.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+ ppl_const_Artificial_Parameter_t* pap));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Increment \p apit so that it "points" to the next artificial parameter.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(MIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Tree_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Solution_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Decision_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Artificial_Parameter)
+
+/* Automatically generated from PPL source file ../../interfaces/C/ppl_c_domains.h line 1. */
+/*C interface code: header file.
+*/
+
+PPL_TYPE_DECLARATION(Polyhedron)
+PPL_TYPE_DECLARATION(Grid)
+PPL_TYPE_DECLARATION(Rational_Box)
+PPL_TYPE_DECLARATION(BD_Shape_mpz_class)
+PPL_TYPE_DECLARATION(BD_Shape_mpq_class)
+PPL_TYPE_DECLARATION(Octagonal_Shape_mpz_class)
+PPL_TYPE_DECLARATION(Octagonal_Shape_mpq_class)
+PPL_TYPE_DECLARATION(Constraints_Product_C_Polyhedron_Grid)
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron)
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron)
+PPL_TYPE_DECLARATION(Double_Box)
+PPL_TYPE_DECLARATION(BD_Shape_double)
+PPL_TYPE_DECLARATION(Octagonal_Shape_double)
+
+/*! \interface ppl_Polyhedron_tag
+ \brief Types and functions for ppl_Polyhedron_tag
+*/
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_delete_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Grid
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Grid
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Rational_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Rational_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Double_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Double_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Grid_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Grid_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_congruences
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_congruences
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_maximize
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_minimize
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_frequency
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_equals_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_OK
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_constraint
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_congruence
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_generator
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_generators
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_difference_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_hull_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_difference_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_hull_assign_if_exact
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_positive_time_elapse_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_constrains
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Polyhedron_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Polyhedron_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Polyhedron_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_H79_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_linear_partition
+PPL_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_Polyhedron_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_wrap_assign
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_generators
+PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+ ppl_const_Polyhedron_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Polyhedron)
+
+/* End of Functions Related to ppl_Polyhedron_tag */
+
+/*! \interface ppl_Grid_tag
+ \brief Types and functions for ppl_Grid_tag
+*/
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_delete_Grid
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_space_dimension
+PPL_PROTO((ppl_Grid_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_C_Polyhedron
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_NNC_Polyhedron
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Rational_Box
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Double_Box
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_double
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Constraint_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Congruence_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_space_dimension
+PPL_PROTO((ppl_const_Grid_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_dimension
+PPL_PROTO((ppl_const_Grid_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Constraint
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Generator
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Congruence
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Grid_Generator
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Grid_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_constraints
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_congruences
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_grid_generators
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Grid_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_constraints
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_congruences
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_grid_generators
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Grid_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_empty
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_universe
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_bounded
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_contains_integer_point
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_topologically_closed
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_discrete
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_topological_closure_assign
+PPL_PROTO((ppl_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounds_from_above
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounds_from_below
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_maximize
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_minimize
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_maximize_with_point
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_minimize_with_point
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_frequency
+PPL_PROTO((ppl_const_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_contains_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_strictly_contains_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_disjoint_from_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_equals_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_OK
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_constraint
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_grid_generator
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Grid_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_constraints
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_congruences
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_grid_generators
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Grid_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_constraint
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_constraints
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_congruences
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_intersection_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_upper_bound_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_difference_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_concatenate_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_time_elapse_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_simplify_using_context_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_constrains
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_unconstrain_space_dimension
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_unconstrain_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounded_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounded_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_lhs_rhs_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_lhs_rhs_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_space_dimensions_and_project
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_remove_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_remove_higher_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_expand_space_dimension
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_fold_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_map_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_drop_some_non_integer_points
+PPL_PROTO((ppl_Grid_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_external_memory_in_bytes
+PPL_PROTO((ppl_const_Grid_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_total_memory_in_bytes
+PPL_PROTO((ppl_const_Grid_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_congruence_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ unsigned* tp));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generator_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_congruence_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generator_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_congruence_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ ppl_const_Congruence_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_generator_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ ppl_const_Congruence_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_congruence_extrapolation_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_generator_extrapolation_assign
+PPL_PROTO((ppl_Grid_t x,
+ ppl_const_Grid_t y,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_wrap_assign
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Constraint_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Congruence_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Grid_Generator_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Grid_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_assign_Grid_from_Grid
+PPL_PROTO((ppl_Grid_t dst, ppl_const_Grid_t src));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_constraints
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_congruences
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_grid_generators
+PPL_PROTO((ppl_Grid_t ph,
+ ppl_Grid_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before, ppl_const_Grid_t pset_after));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before, ppl_const_Grid_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+ ppl_const_Grid_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+ ppl_const_Grid_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+ ppl_const_Grid_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+ ppl_const_Grid_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Grid)
+
+/* End of Functions Related to ppl_Grid_tag */
+
+/*! \interface ppl_Rational_Box_tag
+ \brief Types and functions for ppl_Rational_Box_tag
+*/
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_delete_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_space_dimension
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_C_Polyhedron
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_NNC_Polyhedron
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Grid
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Rational_Box
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Double_Box
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_double
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Grid_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Constraint_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Congruence_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Generator_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_space_dimension
+PPL_PROTO((ppl_const_Rational_Box_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_dimension
+PPL_PROTO((ppl_const_Rational_Box_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Constraint
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Generator
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Congruence
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_constraints
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_congruences
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_minimized_constraints
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_minimized_congruences
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_empty
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_universe
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_bounded
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_contains_integer_point
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_topologically_closed
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_discrete
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_topological_closure_assign
+PPL_PROTO((ppl_Rational_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounds_from_above
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounds_from_below
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_upper_bound
+PPL_PROTO((ppl_Rational_Box_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_lower_bound
+PPL_PROTO((ppl_Rational_Box_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_maximize
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_minimize
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_maximize_with_point
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_minimize_with_point
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_frequency
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_contains_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_strictly_contains_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_disjoint_from_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_equals_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_OK
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_constraint
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_congruence
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_constraint
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_congruence
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_intersection_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_upper_bound_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_difference_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_concatenate_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_time_elapse_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_simplify_using_context_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_constrains
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_unconstrain_space_dimension
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_unconstrain_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounded_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounded_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_space_dimensions_and_project
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_remove_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_remove_higher_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_expand_space_dimension
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_fold_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_map_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_drop_some_non_integer_points
+PPL_PROTO((ppl_Rational_Box_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_external_memory_in_bytes
+PPL_PROTO((ppl_const_Rational_Box_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_total_memory_in_bytes
+PPL_PROTO((ppl_const_Rational_Box_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_widening_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_widening_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_widening_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_widening_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_narrowing_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+ ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_linear_partition
+PPL_PROTO((ppl_const_Rational_Box_t x,
+ ppl_const_Rational_Box_t y,
+ ppl_Rational_Box_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_wrap_assign
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Constraint_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Congruence_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Generator_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_assign_Rational_Box_from_Rational_Box
+PPL_PROTO((ppl_Rational_Box_t dst, ppl_const_Rational_Box_t src));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_recycled_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_recycled_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before, ppl_const_Rational_Box_t pset_after));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before, ppl_const_Rational_Box_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+ ppl_const_Rational_Box_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+ ppl_const_Rational_Box_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+ ppl_const_Rational_Box_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+ ppl_const_Rational_Box_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Rational_Box)
+
+/* End of Functions Related to ppl_Rational_Box_tag */
+
+/*! \interface ppl_BD_Shape_mpz_class_tag
+ \brief Types and functions for ppl_BD_Shape_mpz_class_tag
+*/
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_delete_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Grid
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_empty
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_universe
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_maximize
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_minimize
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_frequency
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_contains_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_strictly_contains_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_disjoint_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_equals_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_OK
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_constraint
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_congruence
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_intersection_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_difference_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_constrains
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ps,
+ size_t* sz));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+ ppl_const_BD_Shape_mpz_class_t y,
+ ppl_BD_Shape_mpz_class_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_wrap_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_assign_BD_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t dst, ppl_const_BD_Shape_mpz_class_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before, ppl_const_BD_Shape_mpz_class_t pset_after));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before, ppl_const_BD_Shape_mpz_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+ ppl_const_BD_Shape_mpz_class_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+ ppl_const_BD_Shape_mpz_class_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+ ppl_const_BD_Shape_mpz_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+ ppl_const_BD_Shape_mpz_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_mpz_class)
+
+/* End of Functions Related to ppl_BD_Shape_mpz_class_tag */
+
+/*! \interface ppl_BD_Shape_mpq_class_tag
+ \brief Types and functions for ppl_BD_Shape_mpq_class_tag
+*/
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_delete_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Grid
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_empty
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_universe
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_maximize
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_minimize
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_frequency
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_contains_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_strictly_contains_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_disjoint_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_equals_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_OK
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_constraint
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_congruence
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_intersection_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_difference_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_constrains
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ps,
+ size_t* sz));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+ ppl_const_BD_Shape_mpq_class_t y,
+ ppl_BD_Shape_mpq_class_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_wrap_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_assign_BD_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t dst, ppl_const_BD_Shape_mpq_class_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before, ppl_const_BD_Shape_mpq_class_t pset_after));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before, ppl_const_BD_Shape_mpq_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+ ppl_const_BD_Shape_mpq_class_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+ ppl_const_BD_Shape_mpq_class_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+ ppl_const_BD_Shape_mpq_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+ ppl_const_BD_Shape_mpq_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_mpq_class)
+
+/* End of Functions Related to ppl_BD_Shape_mpq_class_tag */
+
+/*! \interface ppl_Octagonal_Shape_mpz_class_tag
+ \brief Types and functions for ppl_Octagonal_Shape_mpz_class_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_delete_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_contains_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_strictly_contains_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_disjoint_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_equals_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_constrains
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+ ppl_const_Octagonal_Shape_mpz_class_t y,
+ ppl_Octagonal_Shape_mpz_class_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_assign_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t dst, ppl_const_Octagonal_Shape_mpz_class_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before, ppl_const_Octagonal_Shape_mpz_class_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before, ppl_const_Octagonal_Shape_mpz_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_mpz_class)
+
+/* End of Functions Related to ppl_Octagonal_Shape_mpz_class_tag */
+
+/*! \interface ppl_Octagonal_Shape_mpq_class_tag
+ \brief Types and functions for ppl_Octagonal_Shape_mpq_class_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_delete_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_contains_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_strictly_contains_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_disjoint_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_equals_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_constrains
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+ ppl_const_Octagonal_Shape_mpq_class_t y,
+ ppl_Octagonal_Shape_mpq_class_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_assign_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t dst, ppl_const_Octagonal_Shape_mpq_class_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before, ppl_const_Octagonal_Shape_mpq_class_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before, ppl_const_Octagonal_Shape_mpq_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+ ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_mpq_class)
+
+/* End of Functions Related to ppl_Octagonal_Shape_mpq_class_tag */
+
+/*! \interface ppl_Constraints_Product_C_Polyhedron_Grid_tag
+ \brief Types and functions for ppl_Constraints_Product_C_Polyhedron_Grid_tag
+*/
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_delete_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_C_Polyhedron
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_NNC_Polyhedron
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Grid
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Rational_Box
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Double_Box
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_double
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Grid_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraints_Product_C_Polyhedron_Grid_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraint_System
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Congruence_System
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_space_dimension
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_dimension
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Constraint
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Generator
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Congruence
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_empty
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_universe
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_bounded
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_topologically_closed
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_discrete
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_topological_closure_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounds_from_above
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounds_from_below
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_maximize
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_minimize
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_maximize_with_point
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_minimize_with_point
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_contains_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_strictly_contains_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_disjoint_from_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_equals_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_OK
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_constraint
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_congruence
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_constraints
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_congruences
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_constraint
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_congruence
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_constraints
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_congruences
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_intersection_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_upper_bound_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_difference_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_concatenate_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_time_elapse_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_constrains
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_unconstrain_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_unconstrain_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounded_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounded_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_space_dimensions_and_project
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_remove_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_remove_higher_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_expand_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_fold_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_map_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_drop_some_non_integer_points
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_external_memory_in_bytes
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_total_memory_in_bytes
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_widening_assign_with_tokens
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_widening_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+ ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Constraints_Product_C_Polyhedron_Grid)
+
+/* End of Functions Related to ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_tag
+ \brief Types and functions for ppl_Pointset_Powerset_C_Polyhedron_tag
+*/
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ const ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron_iterator)
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron_const_iterator)
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Pointset_Powerset_C_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_omega_reduce
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_maximize
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_minimize
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_contains_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_strictly_contains_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_disjoint_from_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_equals_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_OK
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_constraint
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_congruence
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_constraints
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_congruences
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_difference_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_constrains
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_size
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t* px,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator_from_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* px,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_begin
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_end
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t ps,
+ ppl_const_Polyhedron_t* d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t ps,
+ ppl_const_Polyhedron_t* d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Polyhedron_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t it));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t last));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y,
+ int disjuncts));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y,
+ int disjuncts));
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Pointset_Powerset_C_Polyhedron)
+
+/* End of Functions Related to ppl_Pointset_Powerset_C_Polyhedron_tag */
+
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_tag
+ \brief Types and functions for ppl_Pointset_Powerset_NNC_Polyhedron_tag
+*/
+
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ ppl_Pointset_Powerset_NNC_Polyhedron_tag.
+*/
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ const ppl_Pointset_Powerset_NNC_Polyhedron_tag.
+*/
+
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron_iterator)
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron_const_iterator)
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t* pit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t* pit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Pointset_Powerset_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_pairwise_reduce
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_omega_reduce
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_maximize
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_minimize
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_contains_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_strictly_contains_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_disjoint_from_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_geometrically_covers_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_geometrically_equals_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_equals_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_OK
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_constraint
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_congruence
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_constraints
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_congruences
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_difference_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_constrains
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_size
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_iterator_from_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t* px,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_const_iterator_from_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t* px,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_begin
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_begin
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_end
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_end
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t ps,
+ ppl_const_Polyhedron_t* d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t ps,
+ ppl_const_Polyhedron_t* d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron_const_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_const_Polyhedron_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t it));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_disjuncts
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t last));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BHZ03_H79_H79_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BGP99_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y,
+ int disjuncts));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BGP99_H79_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_t y,
+ int disjuncts));
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Pointset_Powerset_NNC_Polyhedron)
+
+/* End of Functions Related to ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+
+/*! \interface ppl_Double_Box_tag
+ \brief Types and functions for ppl_Double_Box_tag
+*/
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_delete_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_space_dimension
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_C_Polyhedron
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_NNC_Polyhedron
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Grid
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Rational_Box
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Double_Box
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_double
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Grid_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Constraint_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Congruence_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Generator_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_space_dimension
+PPL_PROTO((ppl_const_Double_Box_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_dimension
+PPL_PROTO((ppl_const_Double_Box_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Constraint
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Generator
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Congruence
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_constraints
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_congruences
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_minimized_constraints
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_minimized_congruences
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_empty
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_universe
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_bounded
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_contains_integer_point
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_topologically_closed
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_discrete
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_topological_closure_assign
+PPL_PROTO((ppl_Double_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounds_from_above
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounds_from_below
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_upper_bound
+PPL_PROTO((ppl_Double_Box_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_lower_bound
+PPL_PROTO((ppl_Double_Box_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_maximize
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_minimize
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_maximize_with_point
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_minimize_with_point
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_frequency
+PPL_PROTO((ppl_const_Double_Box_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_contains_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_strictly_contains_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_disjoint_from_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_equals_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_OK
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_constraint
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_congruence
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_constraint
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_congruence
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_intersection_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_upper_bound_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_difference_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_concatenate_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_time_elapse_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_simplify_using_context_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_constrains
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_unconstrain_space_dimension
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_unconstrain_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounded_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounded_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_space_dimensions_and_project
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_remove_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_remove_higher_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_expand_space_dimension
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_fold_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_map_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_drop_some_non_integer_points
+PPL_PROTO((ppl_Double_Box_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_external_memory_in_bytes
+PPL_PROTO((ppl_const_Double_Box_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_total_memory_in_bytes
+PPL_PROTO((ppl_const_Double_Box_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_widening_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_widening_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_widening_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_widening_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_narrowing_assign
+PPL_PROTO((ppl_Double_Box_t x,
+ ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_linear_partition
+PPL_PROTO((ppl_const_Double_Box_t x,
+ ppl_const_Double_Box_t y,
+ ppl_Double_Box_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_wrap_assign
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Constraint_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Congruence_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Generator_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_assign_Double_Box_from_Double_Box
+PPL_PROTO((ppl_Double_Box_t dst, ppl_const_Double_Box_t src));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_recycled_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_recycled_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before, ppl_const_Double_Box_t pset_after));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before, ppl_const_Double_Box_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+ ppl_const_Double_Box_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+ ppl_const_Double_Box_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+ ppl_const_Double_Box_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+ ppl_const_Double_Box_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Double_Box)
+
+/* End of Functions Related to ppl_Double_Box_tag */
+
+/*! \interface ppl_BD_Shape_double_tag
+ \brief Types and functions for ppl_BD_Shape_double_tag
+*/
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_delete_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Grid
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_double_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_double_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_empty
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_universe
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_maximize
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_minimize
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_frequency
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_contains_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_strictly_contains_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_disjoint_from_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_equals_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_OK
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_constraint
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_congruence
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_intersection_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_difference_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_constrains
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_double_t ps,
+ size_t* sz));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_double_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+ ppl_const_BD_Shape_double_t y,
+ ppl_BD_Shape_double_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_wrap_assign
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_assign_BD_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t dst, ppl_const_BD_Shape_double_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before, ppl_const_BD_Shape_double_t pset_after));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before, ppl_const_BD_Shape_double_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+ ppl_const_BD_Shape_double_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+ ppl_const_BD_Shape_double_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+ ppl_const_BD_Shape_double_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+ ppl_const_BD_Shape_double_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_double)
+
+/* End of Functions Related to ppl_BD_Shape_double_tag */
+
+/*! \interface ppl_Octagonal_Shape_double_tag
+ \brief Types and functions for ppl_Octagonal_Shape_double_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_delete_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_contains_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_strictly_contains_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_disjoint_from_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_equals_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_constrains
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ps,
+ size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ps,
+ size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+ ppl_const_Octagonal_Shape_double_t y,
+ ppl_Octagonal_Shape_double_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_assign_Octagonal_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t dst, ppl_const_Octagonal_Shape_double_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+ ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before, ppl_const_Octagonal_Shape_double_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before, ppl_const_Octagonal_Shape_double_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+ ppl_const_Octagonal_Shape_double_t pset_after,
+ ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+ ppl_const_Octagonal_Shape_double_t pset_after,
+ ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+ ppl_const_Octagonal_Shape_double_t pset_after,
+ ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+ ppl_const_Octagonal_Shape_double_t pset_after,
+ ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_double)
+
+/* End of Functions Related to ppl_Octagonal_Shape_double_tag */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_TYPE_DECLARATION
+#undef PPL_PROTO
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c_header.h b/interfaces/C/ppl_c_header.h
new file mode 100644
index 0000000..71ba536
--- /dev/null
+++ b/interfaces/C/ppl_c_header.h
@@ -0,0 +1,3272 @@
+/* This is the header file of the C interface of the Parma Polyhedra Library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*!
+ \defgroup PPL_C_interface C Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface
+ for the C language.
+*/
+
+/*! \mainpage
+
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures. The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+\note
+All functions taking as input argument an opaque pointer datatype assume
+that such an argument is actually <em>referring to a valid PPL object</em>.
+For instance, a function with an argument having type
+<code>ppl_MIP_Problem_t</code> will expect a valid MIP_Problem object,
+previously initialized by calling, e.g., <code>ppl_new_MIP_Problem</code>.
+If that is not the case (e.g., if a null pointer is passed in),
+the behavior is undefined.
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function. This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used. The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version. This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking. Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core). On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line. For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects. Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location. In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms. Consult your
+compiler's documentation for details. Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase. See Libtool's documentation for details. Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution. It contains a <EM>Mixed Integer (Linear)
+Programming</EM> solver written in C. In order to use this solver
+you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/ /* \mainpage */
+
+/*
+ For some reason, GMP up to and including version 4.1.3 requires
+ <stdio.h> to be included before <gmp.h>.
+*/
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+ PPL_PROTO is a macro used to wrap function prototypes, so that
+ compilers that don't understand ANSI C prototypes still work, and
+ ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__) \
+ || defined(__cplusplus) \
+ || defined (_AIX) \
+ || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+ || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \defgroup Init Library Initialization and Finalization
+ Functions for initialization/finalization of the library,
+ as well as setting/resetting of floating-point rounding mode.
+*/
+/*@{*/
+
+/*! \brief
+ Initializes the Parma Polyhedra Library.
+ This function must be called before any other function.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+ was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+ Finalizes the Parma Polyhedra Library.
+ This function must be called after any other function.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+ was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has been
+ previously called.
+*/
+int
+ppl_set_rounding_for_PPL PPL_PROTO((void));
+
+/*! \brief
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.
+*/
+int
+ppl_restore_pre_PPL_rounding PPL_PROTO((void));
+
+/*! \brief
+ Writes to \p p the precision parameter used for irrational calculations.
+*/
+int
+ppl_irrational_precision PPL_PROTO((unsigned* p));
+
+/*! \brief
+ Sets the precision parameter used for irrational calculations.
+
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for irrational calculations to \p p.
+ Then, in the irrational calculations returning an unbounded rational,
+ (e.g., when computing a square root), the lesser between numerator
+ and denominator will be limited to 2**\p p.
+*/
+int
+ppl_set_irrational_precision PPL_PROTO((unsigned p));
+
+/*@}*/ /* Init */
+
+/*! \defgroup Version Version Checking
+ Symbolic constants and functions related to library version checking.
+*/
+/*@{*/
+
+#include "ppl_c_version.h"
+
+/*! \brief
+ Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+ Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+ Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+ Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+ Writes to \c *p a pointer to a character string containing the
+ PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+ Writes to \c *p a pointer to a character string containing the PPL banner.
+
+ The banner provides information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \defgroup Error Error Handling
+ Symbolic constants and functions related to error reporting/handling.
+*/
+/*@{*/
+
+/*! \brief
+ Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+ /*! \hideinitializer
+ The virtual memory available to the process has been exhausted. */
+ PPL_ERROR_OUT_OF_MEMORY = -2,
+ /*! \hideinitializer
+ A function has been invoked with an invalid argument. */
+ PPL_ERROR_INVALID_ARGUMENT = -3,
+ /*! \hideinitializer
+ A function has been invoked outside its domain of definition. */
+ PPL_ERROR_DOMAIN_ERROR = -4,
+ /*! \hideinitializer
+ The construction of an object that would exceed its maximum
+ permitted size was attempted. */
+ PPL_ERROR_LENGTH_ERROR = -5,
+ /*! \hideinitializer
+ An arithmetic overflow occurred and the computation was consequently
+ interrupted. This can <EM>only</EM> happen in library's incarnations
+ using bounded integers as coefficients. */
+ PPL_ARITHMETIC_OVERFLOW = -6,
+ /*! \hideinitializer
+ An error occurred during a C input/output operation. A more
+ precise indication of what went wrong is available via
+ <CODE>errno</CODE>. */
+ PPL_STDIO_ERROR = -7,
+ /*! \hideinitializer
+ An internal error that was diagnosed by the PPL itself.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_INTERNAL_ERROR = -8,
+ /*! \hideinitializer
+ A standard exception has been raised by the C++ run-time environment.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+ /*! \hideinitializer
+ A totally unknown, totally unexpected error happened.
+ This indicates a bug in the PPL. */
+ PPL_ERROR_UNEXPECTED_ERROR = -10,
+ /*! \hideinitializer
+ An exception has been raised by the PPL as a timeout previously set
+ by the user has expired.
+ */
+ PPL_TIMEOUT_EXCEPTION = -11,
+ /*! \hideinitializer
+ The client program attempted to use the PPL in a way that violates
+ its internal logic. This happens, for instance, when the client
+ attempts to use the timeout facilities on a system that does not
+ support them. */
+ PPL_ERROR_LOGIC_ERROR = -12
+};
+
+/*! \brief
+ Installs the user-defined error handler pointed at by \p h.
+
+ The error handler takes an error code and a textual description that
+ gives further information about the actual error. The C string
+ containing the textual description is read-only and its existence is
+ not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+ const char* description)));
+
+/*@}*/ /* Error */
+
+/*! \defgroup Timeout Timeout Handling
+ Functions for setting and resetting timeouts.
+*/
+/*@{*/
+
+/*! \brief
+ Sets the timeout for computations whose completion could require
+ an exponential amount of time.
+
+ \param csecs
+ The number of centiseconds sometimes after which a timeout will occur;
+ it must be strictly greater than zero.
+
+ Computations taking exponential time will be interrupted some time
+ after \p csecs centiseconds have elapsed since the call to
+ the timeout setting function. If the computation is interrupted that
+ way, the interrupted function will return error code
+ <code>PPL_TIMEOUT_EXCEPTION</code>.
+ Otherwise, if the computation completes without being interrupted,
+ then the timeout should be reset by calling
+ <code>ppl_reset_timeout()</code>.
+*/
+int
+ppl_set_timeout PPL_PROTO((unsigned csecs));
+
+/*! \brief
+ Resets the timeout time so that the computation is not interrupted.
+*/
+int
+ppl_reset_timeout PPL_PROTO((void));
+
+/*! \brief
+ Sets a threshold for computations whose completion could require
+ an exponential amount of time.
+
+ \return
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if \p unscaled_weight is zero
+ or if the computed weight threshold exceeds the maximum allowed value.
+
+ \param unscaled_weight
+ The unscaled maximum computational weight; it has to be non-zero.
+
+ \param scale
+ The scaling factor to be applied to \p unscaled_weight.
+
+ If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+ then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+ Computations taking exponential time will be interrupted some time
+ after reaching the complexity threshold \f$w\f$.
+ If the computation is interrupted that way, the interrupted function
+ will return error code <code>PPL_TIMEOUT_EXCEPTION</code>.
+ Otherwise, if the computation completes without being interrupted,
+ then the deterministic timeout should be reset by calling
+ <code>ppl_reset_deterministic_timeout()</code>.
+
+ \note
+ This "timeout" checking functionality is said to be \e deterministic
+ because it is not based on actual elapsed time. Its behavior will
+ only depend on (some of the) computations performed in the PPL library
+ and it will be otherwise independent from the computation environment
+ (CPU, operating system, compiler, etc.).
+
+ \warning
+ The weight mechanism is under beta testing. In particular,
+ there is still no clear relation between the weight threshold and
+ the actual computational complexity. As a consequence, client
+ applications should be ready to reconsider the tuning of these
+ weight thresholds when upgrading to newer version of the PPL.
+*/
+int
+ppl_set_deterministic_timeout PPL_PROTO((unsigned long unscaled_weight,
+ unsigned scale));
+
+/*! \brief
+ Resets the deterministic timeout so that the computation is not interrupted.
+*/
+int
+ppl_reset_deterministic_timeout PPL_PROTO((void));
+
+/*@}*/ /* Timeout */
+
+/*! \defgroup Datatypes Library Datatypes
+ \brief
+ Typedefs for the library datatypes and related symbolic constants.
+
+ The datatypes provided by the library should be manipulated
+ by means of the corresponding opaque pointer types and
+ the functions working on them.
+
+ \note
+ To simplify the detection of common programming mistakes,
+ we provide both pointer-to-const and pointer-to-nonconst
+ opaque pointers, with implicit conversions mapping each
+ pointer-to-nonconst to the corresponding pointer-to-const when needed.
+ The user of the C interface is therefore recommended to adopt
+ the pointer-to-const type whenever read-only access is meant.
+*/
+/*@{*/
+
+/*! \brief
+ An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \brief
+ Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+ Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+ Pretty-prints \p var to <CODE>stdout</CODE>.
+*/
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief
+ Pretty-prints \p var to the given output \p stream.
+*/
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+/*! \brief
+ Pretty-prints \p var to a malloc-allocated string, a pointer to which
+ is returned via \p strp.
+*/
+int
+ppl_io_asprint_variable PPL_PROTO((char** strp, ppl_dimension_type var));
+
+/*! \brief
+ The type of output functions used for printing variables.
+
+ An output function for variables must write a textual representation
+ for \p var to a character buffer, null-terminate it, and return a
+ pointer to the beginning of the buffer. In case the operation fails,
+ 0 should be returned and perhaps <CODE>errno</CODE> should be set
+ in a meaningful way. The library does nothing with the buffer, besides
+ printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+ Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+ Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*! \brief Utility function for the wrapping of lines of text.
+
+ \param src
+ The source string holding the text to wrap.
+
+ \param indent_depth
+ The indentation depth.
+
+ \param preferred_first_line_length
+ The preferred length for the first line of text.
+
+ \param preferred_line_length
+ The preferred length for all the lines but the first one.
+
+ \return
+ The wrapped string in a malloc-allocated buffer.
+*/
+char*
+ppl_io_wrap_string(const char* src,
+ unsigned indent_depth,
+ unsigned preferred_first_line_length,
+ unsigned preferred_line_length);
+
+/*@}*/ /* Datatypes */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) \
+/*! \brief Opaque pointer \ingroup Datatypes */ \
+typedef struct ppl_##Type##_tag* ppl_##Type##_t; \
+/*! \brief Opaque pointer to const object \ingroup Datatypes */ \
+typedef struct ppl_##Type##_tag const* ppl_const_##Type##_t;
+
+/*! \interface ppl_Coefficient_tag
+ \brief
+ Types and functions for coefficients.
+
+ The types and functions for coefficients provide an interface towards
+ \extref{Parma_Polyhedra_Library::Coefficient, Coefficient}.
+ Depending on configuration, the PPL coefficients may be implemented
+ by the unbounded precision integers provided by GMP (default),
+ or by bounded precision integers (with checks for overflows).
+*/
+PPL_TYPE_DECLARATION(Coefficient)
+
+/*! \interface ppl_Linear_Expression_tag
+ \brief
+ Types and functions for linear expressions.
+
+ The types and functions for linear expression provide an interface towards
+ \extref{Parma_Polyhedra_Library::Linear_Expression, Linear_Expression}.
+*/
+PPL_TYPE_DECLARATION(Linear_Expression)
+
+/*! \interface ppl_Constraint_tag
+ \brief
+ Types and functions for constraints.
+
+ The types and functions for constraints provide an interface towards
+ \extref{Parma_Polyhedra_Library::Constraint, Constraint}.
+*/
+PPL_TYPE_DECLARATION(Constraint)
+
+/*! \interface ppl_Constraint_System_tag
+ \brief
+ Types and functions for constraint systems.
+
+ The types and functions for constraint systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Constraint_System, Constraint_System}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System)
+
+/*! \interface ppl_Constraint_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on constraint systems.
+
+ The types and functions for constraint systems iterators provide
+ read-only access to the elements of a constraint system by interfacing
+ \extref{Parma_Polyhedra_Library::Constraint_System_const_iterator,
+ Constraint_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator)
+
+/*! \interface ppl_Generator_tag
+ \brief
+ Types and functions for generators.
+
+ The types and functions for generators provide an interface
+ towards \extref{Parma_Polyhedra_Library::Generator, Generator}.
+*/
+PPL_TYPE_DECLARATION(Generator)
+
+/*! \interface ppl_Generator_System_tag
+ \brief
+ Types and functions for generator systems.
+
+ The types and functions for generator systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Generator_System, Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Generator_System)
+
+/*! \interface ppl_Generator_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on generator systems.
+
+ The types and functions for generator systems iterators provide
+ read-only access to the elements of a generator system by interfacing
+ \extref{Parma_Polyhedra_Library::Generator_System_const_iterator,
+ Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Generator_System_const_iterator)
+
+/*! \interface ppl_Congruence_tag
+ \brief
+ Types and functions for congruences.
+
+ The types and functions for congruences provide an interface
+ towards \extref{Parma_Polyhedra_Library::Congruence, Congruence}.
+*/
+PPL_TYPE_DECLARATION(Congruence)
+
+/*! \interface ppl_Congruence_System_tag
+ \brief
+ Types and functions for congruence systems.
+
+ The types and functions for congruence systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Congruence_System, Congruence_System}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System)
+
+/*! \interface ppl_Congruence_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on congruence systems.
+
+ The types and functions for congruence systems iterators provide
+ read-only access to the elements of a congruence system by interfacing
+ \extref{Parma_Polyhedra_Library::Congruence_System::const_iterator,
+ Congruence_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System_const_iterator)
+
+/*! \interface ppl_Grid_Generator_tag
+ \brief
+ Types and functions for grid generators.
+
+ The types and functions for grid generators provide an interface
+ towards \extref{Parma_Polyhedra_Library::Grid_Generator, Grid_Generator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator)
+
+/*! \interface ppl_Grid_Generator_System_tag
+ \brief
+ Types and functions for grid generator systems.
+
+ The types and functions for grid generator systems provide an interface
+ towards
+ \extref{Parma_Polyhedra_Library::Grid_Generator_System,
+ Grid_Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System)
+
+/*! \interface ppl_Grid_Generator_System_const_iterator_tag
+ \brief
+ Types and functions for iterating on grid generator systems.
+
+ The types and functions for grid generator systems iterators provide
+ read-only access to the elements of a grid generator system by interfacing
+ \extref{Parma_Polyhedra_Library::Grid_Generator_System::const_iterator,
+ Grid_Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System_const_iterator)
+
+/*! \interface ppl_MIP_Problem_tag
+ \brief
+ Types and functions for MIP problems.
+
+ The types and functions for MIP problems provide an interface
+ towards \extref{Parma_Polyhedra_Library::MIP_Problem, MIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(MIP_Problem)
+
+/*! \interface ppl_PIP_Problem_tag
+ \brief
+ Types and functions for PIP problems.
+
+ The types and functions for PIP problems provide an interface
+ towards \extref{Parma_Polyhedra_Library::PIP_Problem, PIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(PIP_Problem)
+
+/*! \interface ppl_PIP_Tree_Node_tag
+ \brief
+ Types and functions for generic PIP tree nodes.
+
+ The types and functions for tree nodes provide an interface
+ towards \extref{Parma_Polyhedra_Library::PIP_Tree_Node, PIP_Tree_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Tree_Node)
+
+/*! \interface ppl_PIP_Decision_Node_tag
+ \brief
+ Types and functions for PIP decision nodes.
+
+ The types and functions for decision nodes provide an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Decision_Node, PIP_Decision_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Decision_Node)
+
+/*! \interface ppl_PIP_Solution_Node_tag
+ \brief
+ Types and functions for PIP solution nodes.
+
+ The types and functions for solution nodes provide an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Solution_Node, PIP_Solution_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Solution_Node)
+
+/*! \interface ppl_Artificial_Parameter_tag
+ \brief
+ Types and functions for PIP artificial parameters.
+
+ The types and functions for PIP artificial parameters provide
+ an interface towards
+ \extref{Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter, Artificial_Parameter}.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter)
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence)
+
+/*! \interface ppl_Artificial_Parameter_Sequence_const_iterator_tag
+ \brief
+ Types and functions for iterating on PIP artificial parameters.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence_const_iterator)
+
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+#define PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_##Type##_ascii_dump \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream)); \
+/*! \relates ppl_##Type##_tag */ \
+int \
+ppl_##Type##_ascii_load \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_IO_FUNCTIONS(Type) \
+PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#define PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to \c stdout. */ \
+int \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to a malloc-allocated string, a pointer to which is returned via \p strp. */ \
+int \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+
+#define PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Dumps an ascii representation of \p x on \p stream. */ \
+int \
+ppl_##Type##_ascii_dump \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream)); \
+/*! \relates ppl_##Type##_tag \brief Loads an ascii representation of \p x from \p stream. */ \
+int \
+ppl_##Type##_ascii_load \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Type) \
+/*! \brief \name Input/Output Functions */ \
+/*@{*/ \
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type) \
+PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*@}*/ /* Input/Output Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+ Creates a new coefficient with value 0 and writes a handle for the
+ newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Creates a new coefficient with the value given by the GMP integer
+ \p z and writes a handle for the newly created coefficient
+ at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Builds a coefficient that is a copy of \p c; writes a handle
+ for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+ ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Read-Only Accessor Functions */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+ Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded; returns 0
+ otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded, in which case
+ \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \relates ppl_Coefficient_tag \brief
+ Returns a positive integer if coefficients are bounded, in which case
+ \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Read-Only Accessor Functions */
+
+/* No ascii dump for Coefficient */
+/*! \brief \name I/O Functions */
+/*@{*/
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Coefficient)
+/*@}*/ /* I/O Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Creates a new linear expression corresponding to the constant 0 in a
+ zero-dimensional space; writes a handle for the new linear
+ expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Creates a new linear expression corresponding to the constant 0 in a
+ <TT>d</TT>-dimensional space; writes a handle for the new linear
+ expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression that is a copy of \p le; writes a handle
+ for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to constraint \p c;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to generator \p g;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to congruence \p c;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Congruence
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Builds a linear expression corresponding to grid generator \p g;
+ writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Grid_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Invalidates the handle \p le: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns a positive integer if \p le is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p le is broken. Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+*/
+int
+ppl_Linear_Expression_is_zero PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+*/
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions that Do Not Modify the Linear Expression */
+
+/*! \brief \name Functions that May Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds \p n to the coefficient of variable \p var in the linear
+ expression \p le. The space dimension is set to be the maximum
+ between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds \p n to the inhomogeneous term of the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+ Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*@}*/ /* Functions that May Modify the Linear Expression */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Linear_Expression)
+
+/*! \brief \ingroup Datatypes
+ Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+ /*! The constraint is of the form \f$e < 0\f$. */
+ PPL_CONSTRAINT_TYPE_LESS_THAN,
+ /*! The constraint is of the form \f$e \leq 0\f$. */
+ PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL,
+ /*! The constraint is of the form \f$e = 0\f$. */
+ PPL_CONSTRAINT_TYPE_EQUAL,
+ /*! The constraint is of the form \f$e \geq 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL,
+ /*! The constraint is of the form \f$e > 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the new constraint `\p le \p rel 0' and writes a handle for
+ it at address \p pc. The space dimension of the new constraint is
+ equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Constraint_Type rel));
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+ Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+ also known as <EM>positivity constraint</EM>.
+ A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+ Builds a constraint that is a copy of \p c; writes a handle
+ for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+ Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+ ppl_const_Constraint_t src));
+
+/*! \relates ppl_Constraint_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+ Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_tag \brief
+ Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+ Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds an empty system of constraints and writes a handle to it at
+ address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds a zero-dimensional, unsatisfiable constraint system and
+ writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds the singleton constraint system containing only a copy of
+ constraint \p c; writes a handle for the newly created system at
+ address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Builds a constraint system that is a copy of \p cs; writes a handle
+ for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Invalidates the handle \p cs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs contains no (non-trivial) constraint;
+ returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_empty
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs contains any (non-trivial) strict
+ inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" to the beginning of
+ the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" past the end of the
+ constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Returns a positive integer if \p cs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p cs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint System */
+
+/*! \brief \name Functions that May Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Removes all the constraints from the constraint system \p cs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+ Inserts a copy of the constraint \p c into \p cs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+ ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that May Modify the Constraint System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p cit; writes a
+ handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Invalidates the handle \p cit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Dereference \p cit writing a const handle to the resulting
+ constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+ /*! The generator is a line. */
+ PPL_GENERATOR_TYPE_LINE,
+ /*! The generator is a ray. */
+ PPL_GENERATOR_TYPE_RAY,
+ /*! The generator is a point. */
+ PPL_GENERATOR_TYPE_POINT,
+ /*! The generator is a closure point. */
+ PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+ Creates a new generator of direction \p le and type \p t. If the
+ generator to be created is a point or a closure point, the divisor
+ \p d is applied to \p le. For other types of generators \p d is
+ simply disregarded. A handle for the new generator is written at
+ address \p pg. The space dimension of the new generator is equal to
+ the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Generator_Type t,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Generator_tag \brief
+ Creates the point that is the origin of the zero-dimensional space
+ \f$\Rset^0\f$. Writes a handle for the new generator at address
+ \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+ Creates, as a closure point, the point that is the origin of the
+ zero-dimensional space \f$\Rset^0\f$. Writes a handle for the new
+ generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+ Builds a generator that is a copy of \p g; writes a handle
+ for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+ ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+ Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+ ppl_const_Generator_t src));
+
+/*! \relates ppl_Generator_tag \brief
+ Invalidates the handle \p g: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+ Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_tag \brief
+ Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+ Copies into \p n the coefficient of variable \p var in generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+ If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+ Returns a positive integer if \p g is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p g is broken. Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds an empty system of generators and writes a handle to it at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+ Creates the universe zero-dimensional system of generators (i.e.,
+ containing the origin only). Writes a handle to the new system at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds the singleton generator system containing only a copy of
+ generator \p g; writes a handle for the newly created system at
+ address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+ ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Builds a generator system that is a copy of \p gs; writes a handle
+ for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Invalidates the handle \p gs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Returns a positive integer if \p gs contains no generators;
+ returns 0 otherwise.
+*/
+int
+ppl_Generator_System_empty
+PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" to the beginning of
+ the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" past the end of the
+ generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Returns a positive integer if \p gs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p gs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Generator System */
+
+/*! \brief \name Functions that May Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+ Removes all the generators from the generator system \p gs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+ Inserts a copy of the generator \p g into \p gs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+ ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p git; writes a
+ handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Invalidates the handle \p git: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Dereference \p git writing a const handle to the resulting
+ generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the new congruence \f$le = 0 \pmod{m}\f$ and writes a handle for
+ it at address \p pc. The space dimension of the new congruence is
+ equal to the space dimension of \p le.
+*/
+int
+ppl_new_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the unsatisfiable (zero-dimension space) congruence
+ \f$0 = 1 \pmod{0}\f$ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_false PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+ Creates the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+ also known as <EM>integrality congruence</EM>.
+ A handle for the newly created congruence is written at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_integrality PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+ Builds a congruence that is a copy of \p c; writes a handle
+ for the newly created congruence at address \p pc.
+*/
+int
+ppl_new_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+ ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_tag \brief
+ Assigns a copy of the congruence \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t dst,
+ ppl_const_Congruence_t src));
+
+/*! \relates ppl_Congruence_tag \brief
+ Invalidates the handle \p c: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+ Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Congruence_space_dimension PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ congruence \p c.
+*/
+int
+ppl_Congruence_coefficient PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p n the inhomogeneous term of congruence \p c.
+*/
+int
+ppl_Congruence_inhomogeneous_term PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+ Copies into \p m the modulus of congruence \p c.
+*/
+int
+ppl_Congruence_modulus PPL_PROTO((ppl_const_Congruence_t c,
+ ppl_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+ Returns a positive integer if \p c is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p c is broken. Useful for debugging purposes.
+*/
+int
+ppl_Congruence_OK PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds an empty system of congruences and writes a handle to it at
+ address \p pcs.
+*/
+int
+ppl_new_Congruence_System PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds a zero-dimensional, unsatisfiable congruence system and
+ writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_zero_dim_empty
+PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds the singleton congruence system containing only a copy of
+ congruence \p c; writes a handle for the newly created system at
+ address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Builds a congruence system that is a copy of \p cs; writes a handle
+ for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns a copy of the congruence system \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Invalidates the handle \p cs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Congruence_System_space_dimension
+PPL_PROTO((ppl_const_Congruence_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Returns a positive integer if \p cs contains no (non-trivial) congruence;
+ returns 0 otherwise.
+*/
+int
+ppl_Congruence_System_empty
+PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" to the beginning of
+ the congruence system \p cs.
+*/
+int
+ppl_Congruence_System_begin
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Assigns to \p cit a const iterator "pointing" past the end of the
+ congruence system \p cs.
+*/
+int
+ppl_Congruence_System_end
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Returns a positive integer if \p cs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p cs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Congruence_System_OK PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence System */
+
+/*! \brief \name Functions that May Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Removes all the congruences from the congruence system \p cs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Congruence_System_clear PPL_PROTO((ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+ Inserts a copy of the congruence \p c into \p cs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Congruence_System_insert_Congruence PPL_PROTO((ppl_Congruence_System_t cs,
+ ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that May Modify the Congruence System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p cit; writes a
+ handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit,
+ ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t dst,
+ ppl_const_Congruence_System_const_iterator_t src));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Invalidates the handle \p cit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System_const_iterator
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Dereference \p cit writing a const handle to the resulting
+ congruence at address \p pc.
+*/
+int
+ppl_Congruence_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit,
+ ppl_const_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Increment \p cit so that it "points" to the next congruence.
+*/
+int
+ppl_Congruence_System_const_iterator_increment
+PPL_PROTO((ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Congruence_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t x,
+ ppl_const_Congruence_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Describes the different kinds of grid generators.
+*/
+enum ppl_enum_Grid_Generator_Type {
+ /*! The grid generator is a line. */
+ PPL_GRID_GENERATOR_TYPE_LINE,
+ /*! The grid generator is a parameter. */
+ PPL_GRID_GENERATOR_TYPE_PARAMETER,
+ /*! The grid generator is a point. */
+ PPL_GRID_GENERATOR_TYPE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Creates a new grid generator of direction \p le and type \p t. If the
+ grid generator to be created is a point or a parameter, the divisor
+ \p d is applied to \p le. If it is a line, \p d is simply disregarded.
+ A handle for the new grid generator is written at address \p pg.
+ The space dimension of the new grid generator is equal to the space
+ dimension of \p le.
+*/
+int
+ppl_new_Grid_Generator PPL_PROTO((ppl_Grid_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Grid_Generator_Type t,
+ ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Creates the point that is the origin of the zero-dimensional space
+ \f$\Rset^0\f$. Writes a handle for the new grid generator at address
+ \p pg.
+*/
+int
+ppl_new_Grid_Generator_zero_dim_point PPL_PROTO((ppl_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Builds a grid generator that is a copy of \p g; writes a handle
+ for the newly created grid generator at address \p pg.
+*/
+int
+ppl_new_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t* pg, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Assigns a copy of the grid generator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t dst,
+ ppl_const_Grid_Generator_t src));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Invalidates the handle \p g: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Grid_Generator_space_dimension PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Returns the type of grid generator \p g.
+*/
+int
+ppl_Grid_Generator_type PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ grid generator \p g.
+*/
+int
+ppl_Grid_Generator_coefficient PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ If \p g is a point or a parameter assigns its divisor to \p n.
+*/
+int
+ppl_Grid_Generator_divisor PPL_PROTO((ppl_const_Grid_Generator_t g,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+ Returns a positive integer if \p g is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p g is broken. Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_OK PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds an empty system of grid generators and writes a handle to it at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*
+ Creates the universe zero-dimensional system of grid generators (i.e.,
+ containing the origin only). Writes a handle to the new system at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds the singleton grid generator system containing only a copy of
+ generator \p g; writes a handle for the newly created system at
+ address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+ ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Builds a grid generator system that is a copy of \p gs; writes a handle
+ for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+ ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns a copy of the grid generator system \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t dst,
+ ppl_const_Grid_Generator_System_t src));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Invalidates the handle \p gs: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Grid_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Returns a positive integer if \p gs contains no generator;
+ returns 0 otherwise.
+*/
+int
+ppl_Grid_Generator_System_empty
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" to the beginning of
+ the grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_begin
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Assigns to \p git a const iterator "pointing" past the end of the
+ grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_end
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Returns a positive integer if \p gs is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p gs is broken. Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_System_OK PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Grid Generator System */
+
+/*! \brief \name Functions that May Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Removes all the generators from the grid generator system \p gs
+ and sets its space dimension to 0.
+*/
+int
+ppl_Grid_Generator_System_clear PPL_PROTO((ppl_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+ Inserts a copy of the grid generator \p g into \p gs; the space
+ dimension is increased, if necessary.
+*/
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t gs,
+ ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Grid Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p git; writes a
+ handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit,
+ ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t dst,
+ ppl_const_Grid_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Invalidates the handle \p git: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Dereference \p git writing a const handle to the resulting
+ grid generator at address \p pg.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git,
+ ppl_const_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Increment \p git so that it "points" to the next grid generator.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t x,
+ ppl_const_Grid_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+ Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief \ingroup Datatypes
+ Code of the worst-case exponential but typically polynomial
+ complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief \ingroup Datatypes
+ Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron and the set of points
+ satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron intersects the set of
+ points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron is included in the set of
+ points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that the polyhedron is included in the set of
+ points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief \ingroup Datatypes
+ Individual bit saying that adding the generator would not change the
+ polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+
+/*! \brief \ingroup Datatypes
+ Widths of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Width {
+ /*! \hideinitializer 8 bits. */
+ PPL_BITS_8 = 8,
+ /*! \hideinitializer 16 bits. */
+ PPL_BITS_16 = 16,
+ /*! \hideinitializer 32 bits. */
+ PPL_BITS_32 = 32,
+ /*! \hideinitializer 64 bits. */
+ PPL_BITS_64 = 64,
+ /*! \hideinitializer 128 bits. */
+ PPL_BITS_128 = 128
+};
+
+/*! \brief \ingroup Datatypes
+ Representation of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Representation {
+ /*! Unsigned binary. */
+ PPL_UNSIGNED,
+ /*! \brief
+ Signed binary where negative values are represented by the two's
+ complement of the absolute value.
+ */
+ PPL_SIGNED_2_COMPLEMENT
+};
+
+/*! \brief \ingroup Datatypes
+ Overflow behavior of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Overflow {
+ /*! \brief
+ On overflow, wrapping takes place.
+
+ This means that, for a \f$w\f$-bit bounded integer, the computation
+ happens modulo \f$2^w\f$.
+ */
+ PPL_OVERFLOW_WRAPS,
+
+ /*! \brief
+ On overflow, the result is undefined.
+
+ This simply means that the result of the operation resulting in an
+ overflow can take any value.
+
+ \note
+ Even though something more serious can happen in the system
+ being analyzed ---due to, e.g., C's undefined behavior---, here we
+ are only concerned with the results of arithmetic operations.
+ It is the responsibility of the analyzer to ensure that other
+ manifestations of undefined behavior are conservatively approximated.
+ */
+ PPL_OVERFLOW_UNDEFINED,
+
+ /*! \brief
+ Overflow is impossible.
+
+ This is for the analysis of languages where overflow is trapped
+ before it affects the state, for which, thus, any indication that
+ an overflow may have affected the state is necessarily due to
+ the imprecision of the analysis.
+ */
+ PPL_OVERFLOW_IMPOSSIBLE
+};
+
+/*! \brief \name Symbolic Constants */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "maximization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "minimization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "unfeasible MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "unbounded MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of the "optimized MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code for the MIP problem's "pricing" control parameter name.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "textbook" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "exact steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Code of MIP problem's "float steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+
+
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of the "unfeasible PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of the "optimized PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code for the PIP problem's "cutting strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code for the PIP problem's "pivot row strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "first" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "deepest" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "all" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "first" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Code of PIP problem's "max column" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+/*@}*/ /* Symbolic Constants */
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a trivial MIP problem of dimension \p d and writes a
+ handle to it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_space_dimension PPL_PROTO((ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a MIP problem of space dimension \p d having feasible region \p cs,
+ objective function \p le and optimization mode \p m; writes a handle to
+ it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem PPL_PROTO((ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d,
+ ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t le,
+ int m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Builds a MIP problem that is a copy of \p mip; writes a handle
+ for the newly created system at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t* pmip, ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Assigns a copy of the MIP problem \p src to \p dst.
+*/
+int
+ppl_assign_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t dst, ppl_const_MIP_Problem_t src));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Invalidates the handle \p mip: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_MIP_Problem PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for MIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p mip.
+*/
+int
+ppl_MIP_Problem_space_dimension
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the number of integer space dimensions of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes in the first positions of the array \p ds all the integer space
+ dimensions of problem \p mip. If the array is not big enough to hold
+ all of the integer space dimensions, the behavior is undefined.
+*/
+int
+ppl_MIP_Problem_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes to \p m the number of constraints defining
+ the feasible region of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_constraints PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes at address \p pc a const handle to the \p i-th constraint
+ defining the feasible region of the MIP problem \p mip
+*/
+int
+ppl_MIP_Problem_constraint_at_index PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to the linear expression defining the
+ objective function of the MIP problem \p mip at address \p ple.
+*/
+int
+ppl_MIP_Problem_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Linear_Expression_t* ple));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the optimization mode of the MIP problem \p mip.
+*/
+int
+ppl_MIP_Problem_optimization_mode PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns a positive integer if \p mip is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p mip is broken. Useful for debugging purposes.
+*/
+int
+ppl_MIP_Problem_OK PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+/*! \brief \name Functions that May Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Resets the MIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_MIP_Problem_clear PPL_PROTO((ppl_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Adds \p d new dimensions to the space enclosing the MIP problem \p mip
+ and to \p mip itself.
+*/
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the space dimensions that are specified in first \p n positions
+ of the array \p ds to be integer dimensions of problem \p mip.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Modifies the feasible region of the MIP problem \p mip by adding a copy
+ of the constraint \p c.
+*/
+int
+ppl_MIP_Problem_add_constraint PPL_PROTO((ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Modifies the feasible region of the MIP problem \p mip by adding a copy
+ of the constraints in \p cs.
+*/
+int
+ppl_MIP_Problem_add_constraints PPL_PROTO((ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the objective function of the MIP problem \p mip to a copy of \p le.
+*/
+int
+ppl_MIP_Problem_set_objective_function
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets the optimization mode of the MIP problem \p mip to \p mode.
+*/
+int
+ppl_MIP_Problem_set_optimization_mode PPL_PROTO((ppl_MIP_Problem_t mip,
+ int mode));
+
+/*@}*/ /* Functions that May Modify the MIP_Problem */
+
+/*! \brief \name Computing the Solution of the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns a positive integer if \p mip is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_MIP_Problem_is_satisfiable PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Solves the MIP problem \p mip, returning an exit status.
+
+ \return
+ <CODE>PPL_MIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the MIP problem
+ is not satisfiable;
+ <CODE>PPL_MIP_PROBLEM_STATUS_UNBOUNDED</CODE> if the MIP problem
+ is satisfiable but there is no finite bound to the value of
+ the objective function;
+ <CODE>PPL_MIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the MIP problem
+ admits an optimal solution.
+*/
+int
+ppl_MIP_Problem_solve PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Evaluates the objective function of \p mip on point \p g.
+
+ \param mip
+ The MIP problem defining the objective function;
+
+ \param g
+ The generator on which the objective function will be evaluated;
+
+ \param num
+ Will be assigned the numerator of the objective function value;
+
+ \param den
+ Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_MIP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Generator_t g,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to a feasible point for the MIP problem \p mip
+ at address \p pg.
+*/
+int
+ppl_MIP_Problem_feasible_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes a const handle to an optimizing point for the MIP problem \p mip
+ at address \p pg.
+*/
+int
+ppl_MIP_Problem_optimizing_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the optimal value for \p mip.
+
+ \param mip
+ The MIP problem;
+
+ \param num
+ Will be assigned the numerator of the optimal value;
+
+ \param den
+ Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_MIP_Problem_optimal_value
+PPL_PROTO((ppl_const_MIP_Problem_t mip,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*@}*/ /* Computing the Solution of the MIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Returns the value of control parameter \p name in problem \p mip.
+*/
+int
+ppl_MIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_MIP_Problem_t mip, int name));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Sets control parameter \p value in problem \p mip.
+*/
+int
+ppl_MIP_Problem_set_control_parameter
+PPL_PROTO((ppl_MIP_Problem_t mip, int value));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory occupied by \p mip.
+*/
+int
+ppl_MIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory managed by \p mip.
+*/
+int
+ppl_MIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a trivial PIP problem of dimension \p d and writes a
+ handle to it at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_space_dimension PPL_PROTO((ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a PIP problem that is a copy of \p pip; writes a handle
+ for the newly created problem at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t* ppip, ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Assigns a copy of the PIP problem \p src to \p dst.
+*/
+int
+ppl_assign_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t dst, ppl_const_PIP_Problem_t src));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Builds a PIP problem having space dimension \p d from the sequence
+ of constraints in the range \f$[\mathrm{first}, \mathrm{last})\f$;
+ the \p n dimensions whose indices occur in \p ds are interpreted as
+ parameters.
+*/
+int
+ppl_new_PIP_Problem_from_constraints
+PPL_PROTO((ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d,
+ ppl_Constraint_System_const_iterator_t first,
+ ppl_Constraint_System_const_iterator_t last,
+ size_t n,
+ ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Invalidates the handle \p pip: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Problem PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for PIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p pip.
+
+ The vector space dimensions includes both the problem variables
+ and the problem parameters, but they do not include the artificial
+ parameters.
+*/
+int
+ppl_PIP_Problem_space_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the number of parameter space dimensions of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes in the first positions of the array \p ds all the parameter space
+ dimensions of problem \p pip. If the array is not big enough to hold
+ all of the parameter space dimensions, the behavior is undefined.
+*/
+int
+ppl_PIP_Problem_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *pd the big parameter dimension of PIP problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_big_parameter_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* pd));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p m the number of constraints defining
+ the feasible region of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_constraints PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes at address \p pc a const handle to the \p i-th constraint
+ defining the feasible region of the PIP problem \p pip
+*/
+int
+ppl_PIP_Problem_constraint_at_index PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory occupied by \p pip.
+*/
+int
+ppl_PIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes into \p *sz the size in bytes of the memory managed by \p pip.
+*/
+int
+ppl_PIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns a positive integer if \p pip is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p pip is broken. Useful for debugging purposes.
+*/
+int
+ppl_PIP_Problem_OK PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Functions that Do Not Modify the PIP_Problem */
+
+/*! \brief \name Functions that May Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Resets the PIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_PIP_Problem_clear PPL_PROTO((ppl_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+ and embeds the PIP problem \p pip in the new vector space.
+
+ \param pip
+ The PIP problem to be embedded in the new vector space.
+
+ \param pip_vars
+ The number of space dimensions to add that are interpreted as
+ PIP problem variables (i.e., non parameters). These are added
+ \e before adding the \p pip_params parameters.
+
+ \param pip_params
+ The number of space dimensions to add that are interpreted as
+ PIP problem parameters. These are added \e after having added the
+ \p pip_vars problem variables.
+
+ The new space dimensions will be those having the highest indexes
+ in the new PIP problem; they are initially unconstrained.
+*/
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_dimension_type pip_vars,
+ ppl_dimension_type pip_params));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets the space dimensions that are specified in first \p n positions
+ of the array \p ds to be parameter dimensions of problem \p pip.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets the big parameter dimension of PIP problem \p pip to \p d.
+*/
+int
+ppl_PIP_Problem_set_big_parameter_dimension
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Modifies the feasible region of the PIP problem \p pip by adding a copy
+ of the constraint \p c.
+*/
+int
+ppl_PIP_Problem_add_constraint PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_t c));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Modifies the feasible region of the PIP problem \p pip by adding a copy
+ of the constraints in \p cs.
+*/
+int
+ppl_PIP_Problem_add_constraints PPL_PROTO((ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that May Modify the PIP_Problem */
+
+/*! \brief \name Computing and Printing the Solution of the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns a positive integer if \p pip is satisfiable and an optimal
+ solution can be found; returns 0 otherwise.
+*/
+int
+ppl_PIP_Problem_is_satisfiable PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Solves the PIP problem \p pip, returning an exit status.
+
+ \return
+ <CODE>PPL_PIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the PIP problem
+ is not satisfiable;
+ <CODE>PPL_PIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the PIP problem
+ admits an optimal solution.
+*/
+int
+ppl_PIP_Problem_solve PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p pip_tree a solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Writes to \p pip_tree an optimizing solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_optimizing_solution
+PPL_PROTO((ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*@}*/ /* Computing the Solution of the PIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Returns the value of control parameter \p name in problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_PIP_Problem_t pip, int name));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+ Sets control parameter \p value in problem \p pip.
+*/
+int
+ppl_PIP_Problem_set_control_parameter
+PPL_PROTO((ppl_PIP_Problem_t pip, int value));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p dpip_tree the solution node if \p spip_tree is
+ a solution node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_solution
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Solution_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p dpip_tree the decision node if \p spip_tree
+ is a decision node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_decision
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Decision_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p pcs the local system of parameter constraints
+ at the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_get_constraints
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Returns a positive integer if \p pip_tree is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p pip_tree is broken. Useful for debugging purposes.
+*/
+int
+ppl_PIP_Tree_Node_OK PPL_PROTO((ppl_const_PIP_Tree_Node_t pip));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Writes to \p m the number of elements in the artificial parameter sequence
+ in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_number_of_artificials
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Assigns to \p pit a const iterator "pointing" to the beginning of
+ the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_begin
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+ Assigns to \p pit a const iterator "pointing" to the end of
+ the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_end
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Solution_Node_tag \brief
+ Writes to \p le a const pointer to the parametric expression of the values
+ of variable \p var in solution node \p pip_sol.
+
+ The linear expression assigned to \p le will only refer to
+ (problem or artificial) parameters.
+
+ \param pip_sol
+ The solution tree node.
+
+ \param var
+ The variable which is queried about.
+
+ \param le
+ The returned expression for variable \p var.
+
+ \return PPL_ERROR_INVALID_ARGUMENT
+ Returned if \p var is dimension-incompatible with \p *this
+ or if \p var is a problem parameter.
+*/
+int
+ppl_PIP_Solution_Node_get_parametric_values
+PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t* le));
+
+/*! \relates ppl_PIP_Decision_Node_tag \brief
+ Writes to \p pip_tree a const pointer to either the true branch
+ (if \p b is not zero) or the false branch (if \p b is zero) of \p pip_dec.
+*/
+int
+ppl_PIP_Decision_Node_get_child_node
+PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec,
+ int b,
+ ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p le the linear expression in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Linear_Expression_t le));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the coefficient of variable \p var in
+ the artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_coefficient
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the inhomogeneous term of the artificial
+ parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_inhomogeneous_term
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+ Copies into \p n the denominator in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_denominator
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+ ppl_Coefficient_t n));
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it at address
+ \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Builds a const iterator that is a copy of \p apit; writes a
+ handle for the newly created const iterator at address \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t src));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Invalidates the handle \p apit: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Dereference \p apit writing a const handle to the resulting
+ artificial parameter at address \p pap.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+ ppl_const_Artificial_Parameter_t* pap));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Increment \p apit so that it "points" to the next artificial parameter.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(MIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Tree_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Solution_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Decision_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Artificial_Parameter)
+
+#include "ppl_c_domains.h"
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_TYPE_DECLARATION
+#undef PPL_PROTO
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c_implementation_common.cc b/interfaces/C/ppl_c_implementation_common.cc
new file mode 100644
index 0000000..85b027a
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common.cc
@@ -0,0 +1,2642 @@
+/* Implementation of the C interface: variables and non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/* Interface for Coefficient. */
+
+#include "ppl_c_implementation_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+error_handler_type user_error_handler = 0;
+
+extern "C" const char*
+c_variable_default_output_function(ppl_dimension_type var) {
+#if PPL_SIZEOF_SIZE_T == PPL_SIZEOF_INT
+# define FORMAT "%u"
+# define CONVERSION (unsigned)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG
+# define FORMAT "%lu"
+# define CONVERSION (unsigned long)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG_LONG
+# define FORMAT "%llu"
+# define CONVERSION (unsigned long long)
+#else
+# error "Unsupported definition for `size_t'."
+#endif
+ // On a 64-bits architecture, `var' will not be more than 2^64-1,
+ // (2^64-1)/26 is written with 18 decimal digits, plus one letter,
+ // plus one terminator makes 20.
+#if defined(ULLONG_MAX) && ULLONG_MAX > 18446744073709551615ULL
+# error "Please enlarge the buffer in the following line."
+#endif
+ static char buffer[20];
+ buffer[0] = static_cast<char>('A' + var % 26);
+ if (ppl_dimension_type i = var / 26) {
+ int r = sprintf(buffer+1, FORMAT, CONVERSION i);
+ if (r < 0)
+ return 0;
+ else if (r >= 19) {
+ errno = ERANGE;
+ return 0;
+ }
+ }
+ else
+ buffer[1] = '\0';
+ return buffer;
+}
+
+// Holds a pointer to the C current output function.
+ppl_io_variable_output_function_type* c_variable_output_function;
+
+void
+cxx_Variable_output_function(std::ostream& s, const Variable v) {
+ const char* b = c_variable_output_function(v.id());
+ if (b == 0)
+ // Something went wrong in the client's output function.
+ // Client code will know what to do: we do nothing.
+ return;
+ s << b;
+}
+
+extern "C" typedef const char*
+c_variable_output_function_type(ppl_dimension_type var);
+
+// Holds a pointer to the C++ saved output function.
+Variable::output_function_type* saved_cxx_Variable_output_function;
+
+void
+notify_error(enum ppl_enum_error_code code, const char* description) {
+ if (user_error_handler != 0)
+ user_error_handler(code, description);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+ if (p_timeout_object != 0) {
+ delete p_timeout_object;
+ p_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+void
+reset_deterministic_timeout() {
+ if (p_deterministic_timeout_object != 0) {
+ delete p_deterministic_timeout_object;
+ p_deterministic_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::C;
+
+unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+int
+ppl_set_error_handler(error_handler_type h) {
+ user_error_handler = h;
+ return 0;
+}
+
+int
+ppl_initialize(void) try {
+ initialize();
+
+ PPL_POLY_CON_RELATION_IS_DISJOINT
+ = Poly_Con_Relation::is_disjoint().get_flags();
+ PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS
+ = Poly_Con_Relation::strictly_intersects().get_flags();
+ PPL_POLY_CON_RELATION_IS_INCLUDED
+ = Poly_Con_Relation::is_included().get_flags();
+ PPL_POLY_CON_RELATION_SATURATES
+ = Poly_Con_Relation::saturates().get_flags();
+
+ PPL_POLY_GEN_RELATION_SUBSUMES
+ = Poly_Gen_Relation::subsumes().get_flags();
+
+ PPL_COMPLEXITY_CLASS_POLYNOMIAL = POLYNOMIAL_COMPLEXITY;
+ PPL_COMPLEXITY_CLASS_SIMPLEX = SIMPLEX_COMPLEXITY;
+ PPL_COMPLEXITY_CLASS_ANY = ANY_COMPLEXITY;
+
+ PPL_MIP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_MIP_PROBLEM;
+ PPL_MIP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_MIP_PROBLEM;
+ PPL_MIP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_MIP_PROBLEM;
+
+ PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING
+ = MIP_Problem::PRICING;
+ PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT
+ = MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+ PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT
+ = MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+ PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK
+ = MIP_Problem::PRICING_TEXTBOOK;
+
+ PPL_PIP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_PIP_PROBLEM;
+ PPL_PIP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_PIP_PROBLEM;
+
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY
+ = PIP_Problem::CUTTING_STRATEGY;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST
+ = PIP_Problem::CUTTING_STRATEGY_FIRST;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST
+ = PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL
+ = PIP_Problem::CUTTING_STRATEGY_ALL;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY
+ = PIP_Problem::PIVOT_ROW_STRATEGY;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST
+ = PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+ PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN
+ = PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+ PPL_OPTIMIZATION_MODE_MINIMIZATION = MINIMIZATION;
+ PPL_OPTIMIZATION_MODE_MAXIMIZATION = MAXIMIZATION;
+
+ c_variable_output_function = c_variable_default_output_function;
+ saved_cxx_Variable_output_function = Variable::get_output_function();
+ Variable::set_output_function(cxx_Variable_output_function);
+
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_finalize(void) try {
+ Variable::set_output_function(saved_cxx_Variable_output_function);
+
+ finalize();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_timeout(unsigned csecs) try {
+ // In case a timeout was already set.
+ reset_timeout();
+ static timeout_exception e;
+ using Parma_Polyhedra_Library::Watchdog;
+ p_timeout_object = new Watchdog(csecs, abandon_expensive_computations, e);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_reset_timeout(void) try {
+ reset_timeout();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_deterministic_timeout(unsigned long unscaled_weight,
+ unsigned scale) try {
+ // In case a deterministic timeout was already set.
+ reset_deterministic_timeout();
+ static timeout_exception e;
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+ p_deterministic_timeout_object
+ = new Weightwatch(Traits::compute_delta(unscaled_weight, scale),
+ abandon_expensive_computations, e);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_reset_deterministic_timeout(void) try {
+ reset_deterministic_timeout();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_rounding_for_PPL(void) try {
+ set_rounding_for_PPL();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_restore_pre_PPL_rounding(void) try {
+ restore_pre_PPL_rounding();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_irrational_precision(unsigned* p) try {
+ *p = irrational_precision();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_irrational_precision(unsigned p) try {
+ set_irrational_precision(p);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_version_major(void) try {
+ return static_cast<int>(version_major());
+}
+CATCH_ALL
+
+int
+ppl_version_minor(void) try {
+ return static_cast<int>(version_minor());
+}
+CATCH_ALL
+
+int
+ppl_version_revision(void) try {
+ return static_cast<int>(version_revision());
+}
+CATCH_ALL
+
+int
+ppl_version_beta(void) try {
+ return static_cast<int>(version_beta());
+}
+CATCH_ALL
+
+int
+ppl_version(const char** p) try {
+ // Note: use explicit qualification to avoid clashes on, e.g.,
+ // Solaris 2.9, where `version' is the name of an enum defined in
+ // math.h.
+ *p = Parma_Polyhedra_Library::version();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_banner(const char** p) try {
+ *p = banner();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_max_space_dimension(ppl_dimension_type* m) try {
+ *m = max_space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_not_a_dimension(ppl_dimension_type* m) try {
+ *m = not_a_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient(ppl_Coefficient_t* pc) try {
+ *pc = to_nonconst(new Coefficient(0));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_mpz_t(ppl_Coefficient_t* pc, mpz_t z) try {
+ *pc = to_nonconst(new Coefficient(reinterpret_mpz_class(z)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_Coefficient(ppl_Coefficient_t* pc,
+ ppl_const_Coefficient_t c) try {
+ const Coefficient& cc = *to_const(c);
+ *pc = to_nonconst(new Coefficient(cc));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_to_mpz_t(ppl_const_Coefficient_t c, mpz_t z) try {
+ assign_r(reinterpret_mpz_class(z), *to_const(c), ROUND_NOT_NEEDED);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Coefficient(ppl_const_Coefficient_t c) try {
+ delete to_const(c);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_mpz_t(ppl_Coefficient_t dst, mpz_t z) try {
+ Coefficient& ddst = *to_nonconst(dst);
+ ddst = reinterpret_mpz_class(z);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_Coefficient(ppl_Coefficient_t dst,
+ ppl_const_Coefficient_t src) try {
+ const Coefficient& ssrc = *to_const(src);
+ Coefficient& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_OK(ppl_const_Coefficient_t /* c */) try {
+ return 1;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_is_bounded(void) try {
+ return std::numeric_limits<Coefficient>::is_bounded ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_min(mpz_t min) try {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ assign_r(reinterpret_mpz_class(min),
+ std::numeric_limits<Coefficient>::min(),
+ ROUND_NOT_NEEDED);
+ return 1;
+ }
+ else
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_max(mpz_t max) try {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ assign_r(reinterpret_mpz_class(max),
+ std::numeric_limits<Coefficient>::max(),
+ ROUND_NOT_NEEDED);
+ return 1;
+ }
+ else
+ return 0;
+}
+CATCH_ALL
+
+/* Interface for Linear_Expression. */
+
+int
+ppl_new_Linear_Expression(ppl_Linear_Expression_t* ple) try {
+ *ple = to_nonconst(new Linear_Expression());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_with_dimension(ppl_Linear_Expression_t* ple,
+ ppl_dimension_type d) try {
+ *ple = to_nonconst(d == 0
+ ? new Linear_Expression(0)
+ : new Linear_Expression(0*Variable(d-1)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le) try {
+ const Linear_Expression& lle = *to_const(le);
+ *ple = to_nonconst(new Linear_Expression(lle));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Linear_Expression(ppl_const_Linear_Expression_t le) try {
+ delete to_const(le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+ const Linear_Expression& ssrc = *to_const(src);
+ Linear_Expression& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_coefficient(ppl_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_const_Coefficient_t n) try {
+ Linear_Expression& lle = *to_nonconst(le);
+ const Coefficient& nn = *to_const(n);
+ add_mul_assign(lle, nn, Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_inhomogeneous(ppl_Linear_Expression_t le,
+ ppl_const_Coefficient_t n) try {
+ Linear_Expression& lle = *to_nonconst(le);
+ const Coefficient& nn = *to_const(n);
+ lle += nn;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+ Linear_Expression& ddst = *to_nonconst(dst);
+ const Linear_Expression& ssrc = *to_const(src);
+ ddst += ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+ Linear_Expression& ddst = *to_nonconst(dst);
+ const Linear_Expression& ssrc = *to_const(src);
+ ddst -= ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_multiply_Linear_Expression_by_Coefficient(ppl_Linear_Expression_t le,
+ ppl_const_Coefficient_t n) try {
+ Linear_Expression& lle = *to_nonconst(le);
+ const Coefficient& nn = *to_const(n);
+ lle *= nn;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_space_dimension(ppl_const_Linear_Expression_t le,
+ ppl_dimension_type* m) try {
+ *m = to_const(le)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_coefficient(ppl_const_Linear_Expression_t le,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& nn = *to_nonconst(n);
+ nn = lle.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_inhomogeneous_term(ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t n) try {
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& nn = *to_nonconst(n);
+ nn = lle.inhomogeneous_term();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_OK(ppl_const_Linear_Expression_t le) try {
+ return to_const(le)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_is_zero(ppl_const_Linear_Expression_t le) try {
+ return to_const(le)->is_zero() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+ (ppl_const_Linear_Expression_t le) try {
+ return to_const(le)->all_homogeneous_terms_are_zero() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint. */
+
+int
+ppl_new_Constraint(ppl_Constraint_t* pc,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Constraint_Type t) try {
+ Constraint* ppc;
+ const Linear_Expression& lle = *to_const(le);
+ switch (t) {
+ case PPL_CONSTRAINT_TYPE_EQUAL:
+ ppc = new Constraint(lle == 0);
+ break;
+ case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+ ppc = new Constraint(lle >= 0);
+ break;
+ case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+ ppc = new Constraint(lle > 0);
+ break;
+ case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+ ppc = new Constraint(lle <= 0);
+ break;
+ case PPL_CONSTRAINT_TYPE_LESS_THAN:
+ ppc = new Constraint(lle < 0);
+ break;
+ default:
+ throw std::invalid_argument("ppl_new_Constraint(pc, le, t): "
+ "t invalid");
+ }
+ *pc = to_nonconst(ppc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_false(ppl_Constraint_t* pc) try {
+ *pc = to_nonconst(new Constraint(Constraint::zero_dim_false()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_positivity(ppl_Constraint_t* pc) try {
+ *pc = to_nonconst(new Constraint(Constraint::zero_dim_positivity()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_from_Constraint(ppl_Constraint_t* pc,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ *pc = to_nonconst(new Constraint(cc));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint(ppl_const_Constraint_t le) try {
+ delete to_const(le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_from_Constraint(ppl_Constraint_t dst,
+ ppl_const_Constraint_t src) try {
+ const Constraint& ssrc = *to_const(src);
+ Constraint& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_space_dimension(ppl_const_Constraint_t c,
+ ppl_dimension_type* m) try {
+ *m = to_const(c)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_type(ppl_const_Constraint_t c) try {
+ switch (to_const(c)->type()) {
+ case Constraint::EQUALITY:
+ return PPL_CONSTRAINT_TYPE_EQUAL;
+ case Constraint::NONSTRICT_INEQUALITY:
+ return PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL;
+ case Constraint::STRICT_INEQUALITY:
+ return PPL_CONSTRAINT_TYPE_GREATER_THAN;
+ }
+ PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_coefficient(ppl_const_Constraint_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Constraint& cc = *to_const(c);
+ Coefficient& nn = *to_nonconst(n);
+ nn = cc.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c,
+ ppl_Coefficient_t n) try {
+ const Constraint& cc = *to_const(c);
+ Coefficient& nn = *to_nonconst(n);
+ nn = cc.inhomogeneous_term();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_OK(ppl_const_Constraint_t c) try {
+ return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Constraint(ppl_Linear_Expression_t* ple,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ *ple = to_nonconst(new Linear_Expression(cc.expression()));
+ return 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint_System. */
+
+int
+ppl_new_Constraint_System(ppl_Constraint_System_t* pcs) try {
+ *pcs = to_nonconst(new Constraint_System());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_zero_dim_empty(ppl_Constraint_System_t* pcs) try {
+ *pcs = to_nonconst(new
+ Constraint_System(Constraint_System::zero_dim_empty()));
+ return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System_from_Constraint(ppl_Constraint_System_t* pcs,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ *pcs = to_nonconst(new Constraint_System(cc));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ *pcs = to_nonconst(new Constraint_System(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System(ppl_const_Constraint_System_t cs) try {
+ delete to_const(cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src) try {
+ const Constraint_System& ssrc = *to_const(src);
+ Constraint_System& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_space_dimension(ppl_const_Constraint_System_t cs,
+ ppl_dimension_type* m) try {
+ *m = to_const(cs)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_empty
+(ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_has_strict_inequalities
+(ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ return ccs.has_strict_inequalities() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_clear(ppl_Constraint_System_t cs) try {
+ to_nonconst(cs)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_insert_Constraint(ppl_Constraint_System_t cs,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ Constraint_System& ccs = *to_nonconst(cs);
+ ccs.insert(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_OK(ppl_const_Constraint_System_t cs) try {
+ return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint_System::const_iterator. */
+
+int
+ppl_new_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit) try {
+ *pcit = to_nonconst(new Constraint_System::const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit) try {
+ *pcit = to_nonconst(new Constraint_System::const_iterator(*to_const(cit)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System_const_iterator
+(ppl_const_Constraint_System_const_iterator_t cit)
+ try {
+ delete to_const(cit);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src) try {
+ const Constraint_System::const_iterator& ssrc = *to_const(src);
+ Constraint_System::const_iterator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_begin(ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit) try {
+ const Constraint_System& ccs = *to_const(cs);
+ Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+ ccit = ccs.begin();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_end(ppl_const_Constraint_System_t cs,
+ ppl_Constraint_System_const_iterator_t cit) try {
+ const Constraint_System& ccs = *to_const(cs);
+ Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+ ccit = ccs.end();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_dereference
+(ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc) try {
+ const Constraint_System::const_iterator& ccit = *to_const(cit);
+ const Constraint& c = *ccit;
+ *pc = to_const(&c);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_increment
+(ppl_Constraint_System_const_iterator_t cit) try {
+ Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+ ++ccit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_equal_test
+(ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y) try {
+ const Constraint_System::const_iterator& xx = *to_const(x);
+ const Constraint_System::const_iterator& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Generator. */
+
+int
+ppl_new_Generator(ppl_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Generator_Type t,
+ ppl_const_Coefficient_t d) try {
+ Generator* ppg;
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ switch (t) {
+ case PPL_GENERATOR_TYPE_POINT:
+ ppg = new Generator(Generator::point(lle, dd));
+ break;
+ case PPL_GENERATOR_TYPE_CLOSURE_POINT:
+ ppg = new Generator(Generator::closure_point(lle, dd));
+ break;
+ case PPL_GENERATOR_TYPE_RAY:
+ ppg = new Generator(Generator::ray(lle));
+ break;
+ case PPL_GENERATOR_TYPE_LINE:
+ ppg = new Generator(Generator::line(lle));
+ break;
+ default:
+ throw std::invalid_argument("ppl_new_Generator(pg, le, t, d): t invalid");
+ }
+ *pg = to_nonconst(ppg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_point(ppl_Generator_t* pg) try {
+ *pg = to_nonconst(new Generator(Generator::zero_dim_point()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_closure_point(ppl_Generator_t* pg) try {
+ *pg = to_nonconst(new Generator(Generator::zero_dim_closure_point()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_from_Generator(ppl_Generator_t* pg,
+ ppl_const_Generator_t g) try {
+ const Generator& gg = *to_const(g);
+ *pg = to_nonconst(new Generator(gg));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator(ppl_const_Generator_t le) try {
+ delete to_const(le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_from_Generator(ppl_Generator_t dst,
+ ppl_const_Generator_t src) try {
+ const Generator& ssrc = *to_const(src);
+ Generator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_space_dimension(ppl_const_Generator_t g,
+ ppl_dimension_type* m) try {
+ *m = to_const(g)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_type(ppl_const_Generator_t g) try {
+ switch (to_const(g)->type()) {
+ case Generator::LINE:
+ return PPL_GENERATOR_TYPE_LINE;
+ case Generator::RAY:
+ return PPL_GENERATOR_TYPE_RAY;
+ case Generator::POINT:
+ return PPL_GENERATOR_TYPE_POINT;
+ case Generator::CLOSURE_POINT:
+ return PPL_GENERATOR_TYPE_CLOSURE_POINT;
+ }
+ PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Generator_coefficient(ppl_const_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Generator& gg = *to_const(g);
+ Coefficient& nn = *to_nonconst(n);
+ nn = gg.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_divisor(ppl_const_Generator_t g,
+ ppl_Coefficient_t n) try {
+ const Generator& gg = *to_const(g);
+ Coefficient& nn = *to_nonconst(n);
+ nn = gg.divisor();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_OK(ppl_const_Generator_t g) try {
+ return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Generator(ppl_Linear_Expression_t* ple,
+ ppl_const_Generator_t g) try {
+ const Generator& gg = *to_const(g);
+ *ple = to_nonconst(new Linear_Expression(gg.expression()));
+ return 0;
+}
+CATCH_ALL
+
+/* Interface for Generator_System. */
+
+int
+ppl_new_Generator_System(ppl_Generator_System_t* pgs) try {
+ *pgs = to_nonconst(new Generator_System());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_zero_dim_univ(ppl_Generator_System_t* pgs) try {
+ *pgs = to_nonconst(new Generator_System(Generator_System::zero_dim_univ()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator(ppl_Generator_System_t* pgs,
+ ppl_const_Generator_t g) try {
+ const Generator& gg = *to_const(g);
+ *pgs = to_nonconst(new Generator_System(gg));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator_System
+(ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs) try {
+ const Generator_System& ggs = *to_const(gs);
+ *pgs = to_nonconst(new Generator_System(ggs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System(ppl_const_Generator_System_t gs) try {
+ delete to_const(gs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_from_Generator_System
+(ppl_Generator_System_t dst, ppl_const_Generator_System_t src) try {
+ const Generator_System& ssrc = *to_const(src);
+ Generator_System& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_space_dimension(ppl_const_Generator_System_t gs,
+ ppl_dimension_type* m) try {
+ *m = to_const(gs)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_empty
+(ppl_const_Generator_System_t gs) try {
+ const Generator_System& cgs = *to_const(gs);
+ return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_clear(ppl_Generator_System_t gs) try {
+ to_nonconst(gs)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_insert_Generator(ppl_Generator_System_t gs,
+ ppl_const_Generator_t g) try {
+ const Generator& gg = *to_const(g);
+ Generator_System& ggs = *to_nonconst(gs);
+ ggs.insert(gg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_OK(ppl_const_Generator_System_t gs) try {
+ return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Generator_System::const_iterator. */
+
+int
+ppl_new_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit) try {
+ *pgit = to_nonconst(new Generator_System::const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git) try {
+ *pgit = to_nonconst(new Generator_System::const_iterator(*to_const(git)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System_const_iterator
+(ppl_const_Generator_System_const_iterator_t git) try {
+ delete to_const(git);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src) try {
+ const Generator_System::const_iterator& ssrc = *to_const(src);
+ Generator_System::const_iterator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_begin(ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git) try {
+ const Generator_System& ggs = *to_const(gs);
+ Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ggit = ggs.begin();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_end(ppl_const_Generator_System_t gs,
+ ppl_Generator_System_const_iterator_t git) try {
+ const Generator_System& ggs = *to_const(gs);
+ Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ggit = ggs.end();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_dereference
+(ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg) try {
+ const Generator_System::const_iterator& ggit = *to_const(git);
+ const Generator& c = *ggit;
+ *pg = to_const(&c);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_increment
+(ppl_Generator_System_const_iterator_t git) try {
+ Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ++ggit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_equal_test
+(ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y) try {
+ const Generator_System::const_iterator& xx = *to_const(x);
+ const Generator_System::const_iterator& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence. */
+
+int
+ppl_new_Congruence(ppl_Congruence_t* pc,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t m) try {
+ Congruence* ppc;
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& mm = *to_const(m);
+ ppc = new Congruence((lle %= 0) / mm);
+ *pc = to_nonconst(ppc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_false(ppl_Congruence_t* pc) try {
+ *pc = to_nonconst(new Congruence(Congruence::zero_dim_false()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_integrality(ppl_Congruence_t* pc) try {
+ *pc = to_nonconst(new Congruence(Congruence::zero_dim_integrality()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_from_Congruence(ppl_Congruence_t* pc,
+ ppl_const_Congruence_t c) try {
+ const Congruence& cc = *to_const(c);
+ *pc = to_nonconst(new Congruence(cc));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence(ppl_const_Congruence_t le) try {
+ delete to_const(le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_from_Congruence(ppl_Congruence_t dst,
+ ppl_const_Congruence_t src) try {
+ const Congruence& ssrc = *to_const(src);
+ Congruence& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_space_dimension(ppl_const_Congruence_t c,
+ ppl_dimension_type* m) try {
+ *m = to_const(c)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_coefficient(ppl_const_Congruence_t c,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Congruence& cc = *to_const(c);
+ Coefficient& nn = *to_nonconst(n);
+ nn = cc.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_inhomogeneous_term(ppl_const_Congruence_t c,
+ ppl_Coefficient_t n) try {
+ const Congruence& cc = *to_const(c);
+ Coefficient& nn = *to_nonconst(n);
+ nn = cc.inhomogeneous_term();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_modulus(ppl_const_Congruence_t c,
+ ppl_Coefficient_t m) try {
+ const Congruence& cc = *to_const(c);
+ Coefficient& mm = *to_nonconst(m);
+ mm = cc.modulus();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_OK(ppl_const_Congruence_t c) try {
+ return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Congruence(ppl_Linear_Expression_t* ple,
+ ppl_const_Congruence_t c) try {
+ const Congruence& cc = *to_const(c);
+ *ple = to_nonconst(new Linear_Expression(cc.expression()));
+ return 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence_System. */
+
+int
+ppl_new_Congruence_System(ppl_Congruence_System_t* pcs) try {
+ *pcs = to_nonconst(new Congruence_System());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_zero_dim_empty(ppl_Congruence_System_t* pcs) try {
+ *pcs = to_nonconst(new
+ Congruence_System(Congruence_System::zero_dim_empty()));
+ return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Congruence_System_from_Congruence(ppl_Congruence_System_t* pcs,
+ ppl_const_Congruence_t c) try {
+ const Congruence& cc = *to_const(c);
+ *pcs = to_nonconst(new Congruence_System(cc));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs) try {
+ const Congruence_System& ccs = *to_const(cs);
+ *pcs = to_nonconst(new Congruence_System(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System(ppl_const_Congruence_System_t cs) try {
+ delete to_const(cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src) try {
+ const Congruence_System& ssrc = *to_const(src);
+ Congruence_System& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_space_dimension(ppl_const_Congruence_System_t cs,
+ ppl_dimension_type* m) try {
+ *m = to_const(cs)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_empty
+(ppl_const_Congruence_System_t cs) try {
+ const Congruence_System& ccs = *to_const(cs);
+ return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_clear(ppl_Congruence_System_t cs) try {
+ to_nonconst(cs)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_insert_Congruence(ppl_Congruence_System_t cs,
+ ppl_const_Congruence_t c) try {
+ const Congruence& cc = *to_const(c);
+ Congruence_System& ccs = *to_nonconst(cs);
+ ccs.insert(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_OK(ppl_const_Congruence_System_t cs) try {
+ return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence_System::const_iterator. */
+
+int
+ppl_new_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit) try {
+ *pcit = to_nonconst(new Congruence_System::const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit,
+ ppl_const_Congruence_System_const_iterator_t cit) try {
+ *pcit = to_nonconst(new Congruence_System::const_iterator(*to_const(cit)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System_const_iterator
+(ppl_const_Congruence_System_const_iterator_t cit)
+ try {
+ delete to_const(cit);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t dst,
+ ppl_const_Congruence_System_const_iterator_t src) try {
+ const Congruence_System::const_iterator& ssrc = *to_const(src);
+ Congruence_System::const_iterator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_begin(ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit) try {
+ const Congruence_System& ccs = *to_const(cs);
+ Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+ ccit = ccs.begin();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_end(ppl_const_Congruence_System_t cs,
+ ppl_Congruence_System_const_iterator_t cit) try {
+ const Congruence_System& ccs = *to_const(cs);
+ Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+ ccit = ccs.end();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_dereference
+(ppl_const_Congruence_System_const_iterator_t cit,
+ ppl_const_Congruence_t* pc) try {
+ const Congruence_System::const_iterator& ccit = *to_const(cit);
+ const Congruence& c = *ccit;
+ *pc = to_const(&c);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_increment
+(ppl_Congruence_System_const_iterator_t cit) try {
+ Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+ ++ccit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_equal_test
+(ppl_const_Congruence_System_const_iterator_t x,
+ ppl_const_Congruence_System_const_iterator_t y) try {
+ const Congruence_System::const_iterator& xx = *to_const(x);
+ const Congruence_System::const_iterator& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Grid_Generator. */
+
+int
+ppl_new_Grid_Generator(ppl_Grid_Generator_t* pg,
+ ppl_const_Linear_Expression_t le,
+ enum ppl_enum_Grid_Generator_Type t,
+ ppl_const_Coefficient_t d) try {
+ Grid_Generator* ppg;
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ switch (t) {
+ case PPL_GRID_GENERATOR_TYPE_LINE:
+ ppg = new Grid_Generator(Grid_Generator::grid_line(lle));
+ break;
+ case PPL_GRID_GENERATOR_TYPE_PARAMETER:
+ ppg = new Grid_Generator(Grid_Generator::parameter(lle));
+ break;
+ case PPL_GRID_GENERATOR_TYPE_POINT:
+ ppg = new Grid_Generator(Grid_Generator::grid_point(lle, dd));
+ break;
+ default:
+ throw std::invalid_argument("ppl_new_Grid_Generator(pg, le, t, d): "
+ "t invalid");
+ }
+ *pg = to_nonconst(ppg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_zero_dim_point(ppl_Grid_Generator_t* pg) try {
+ *pg = to_nonconst(new Grid_Generator(Grid_Generator::zero_dim_point()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_from_Grid_Generator(ppl_Grid_Generator_t* pg,
+ ppl_const_Grid_Generator_t g) try {
+ const Grid_Generator& gg = *to_const(g);
+ *pg = to_nonconst(new Grid_Generator(gg));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator(ppl_const_Grid_Generator_t le) try {
+ delete to_const(le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+(ppl_Grid_Generator_t dst,
+ ppl_const_Grid_Generator_t src) try {
+ const Grid_Generator& ssrc = *to_const(src);
+ Grid_Generator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_space_dimension(ppl_const_Grid_Generator_t g,
+ ppl_dimension_type* m) try {
+ *m = to_const(g)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_type(ppl_const_Grid_Generator_t g) try {
+ switch (to_const(g)->type()) {
+ case Grid_Generator::LINE:
+ return PPL_GRID_GENERATOR_TYPE_LINE;
+ case Grid_Generator::PARAMETER:
+ return PPL_GRID_GENERATOR_TYPE_PARAMETER;
+ case Grid_Generator::POINT:
+ return PPL_GRID_GENERATOR_TYPE_POINT;
+ }
+ PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_coefficient(ppl_const_Grid_Generator_t g,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Grid_Generator& gg = *to_const(g);
+ Coefficient& nn = *to_nonconst(n);
+ nn = gg.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_divisor(ppl_const_Grid_Generator_t g,
+ ppl_Coefficient_t n) try {
+ const Grid_Generator& gg = *to_const(g);
+ Coefficient& nn = *to_nonconst(n);
+ nn = gg.divisor();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_OK(ppl_const_Grid_Generator_t g) try {
+ return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+// FIXME: to be restored soon.
+// int
+// ppl_new_Linear_Expression_from_Grid_Generator
+// (ppl_Linear_Expression_t* ple,
+// ppl_const_Grid_Generator_t g) try {
+// const Grid_Generator& gg = *to_const(g);
+// *ple = to_nonconst(new Linear_Expression(gg));
+// return 0;
+// }
+// CATCH_ALL
+
+/* Interface for Grid_Generator_System. */
+
+int
+ppl_new_Grid_Generator_System(ppl_Grid_Generator_System_t* pgs) try {
+ *pgs = to_nonconst(new Grid_Generator_System());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+(ppl_Grid_Generator_System_t* pgs) try {
+ *pgs = to_nonconst
+ (new Grid_Generator_System(Grid_Generator_System::zero_dim_univ()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_t g) try {
+ const Grid_Generator& gg = *to_const(g);
+ *pgs = to_nonconst(new Grid_Generator_System(gg));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_System_t gs) try {
+ const Grid_Generator_System& ggs = *to_const(gs);
+ *pgs = to_nonconst(new Grid_Generator_System(ggs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System(ppl_const_Grid_Generator_System_t gs) try {
+ delete to_const(gs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t dst, ppl_const_Grid_Generator_System_t src) try {
+ const Grid_Generator_System& ssrc = *to_const(src);
+ Grid_Generator_System& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_space_dimension(ppl_const_Grid_Generator_System_t gs,
+ ppl_dimension_type* m) try {
+ *m = to_const(gs)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_empty
+(ppl_const_Grid_Generator_System_t gs) try {
+ const Grid_Generator_System& cgs = *to_const(gs);
+ return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_clear(ppl_Grid_Generator_System_t gs) try {
+ to_nonconst(gs)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+(ppl_Grid_Generator_System_t gs,
+ ppl_const_Grid_Generator_t g) try {
+ const Grid_Generator& gg = *to_const(g);
+ Grid_Generator_System& ggs = *to_nonconst(gs);
+ ggs.insert(gg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_OK(ppl_const_Grid_Generator_System_t gs) try {
+ return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Grid_Generator_System::const_iterator. */
+
+int
+ppl_new_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit) try {
+ *pgit = to_nonconst(new Grid_Generator_System::const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit,
+ ppl_const_Grid_Generator_System_const_iterator_t git) try {
+ *pgit = to_nonconst
+ (new Grid_Generator_System::const_iterator(*to_const(git)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System_const_iterator
+(ppl_const_Grid_Generator_System_const_iterator_t git) try {
+ delete to_const(git);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t dst,
+ ppl_const_Grid_Generator_System_const_iterator_t src) try {
+ const Grid_Generator_System::const_iterator& ssrc = *to_const(src);
+ Grid_Generator_System::const_iterator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_begin
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+ const Grid_Generator_System& ggs = *to_const(gs);
+ Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ggit = ggs.begin();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_end
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+ const Grid_Generator_System& ggs = *to_const(gs);
+ Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ggit = ggs.end();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+(ppl_const_Grid_Generator_System_const_iterator_t git,
+ ppl_const_Grid_Generator_t* pg) try {
+ const Grid_Generator_System::const_iterator& ggit = *to_const(git);
+ const Grid_Generator& g = *ggit;
+ *pg = to_const(&g);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_increment
+(ppl_Grid_Generator_System_const_iterator_t git) try {
+ Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+ ++ggit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+(ppl_const_Grid_Generator_System_const_iterator_t x,
+ ppl_const_Grid_Generator_System_const_iterator_t y) try {
+ const Grid_Generator_System::const_iterator& xx = *to_const(x);
+ const Grid_Generator_System::const_iterator& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem_from_space_dimension(ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d) try {
+ *pmip = to_nonconst(new MIP_Problem(d));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem(ppl_MIP_Problem_t* pmip,
+ ppl_dimension_type d,
+ ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t le, int m) try {
+ const Constraint_System& ccs = *to_const(cs);
+ const Linear_Expression& lle = *to_const(le);
+ Optimization_Mode mm = (m == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+ ? MINIMIZATION : MAXIMIZATION;
+ *pmip = to_nonconst(new MIP_Problem(d, ccs, lle, mm));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t* pmip,
+ ppl_const_MIP_Problem_t mip) try {
+ const MIP_Problem& mmip = *to_const(mip);
+ *pmip = to_nonconst(new MIP_Problem(mmip));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_MIP_Problem(ppl_const_MIP_Problem_t mip) try {
+ delete to_const(mip);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t dst,
+ ppl_const_MIP_Problem_t src) try {
+ const MIP_Problem& ssrc = *to_const(src);
+ MIP_Problem& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_space_dimension(ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type* m) try {
+ *m = to_const(mip)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type* m) try {
+ const MIP_Problem& mmip = *to_const(mip);
+ *m = mmip.integer_space_dimensions().size();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type ds[]) try {
+ const Variables_Set& vars = to_const(mip)->integer_space_dimensions();
+ ppl_dimension_type* ds_i = ds;
+ for (Variables_Set::const_iterator v_iter = vars.begin(),
+ v_end = vars.end(); v_iter != v_end; ++v_iter, ++ds_i)
+ *ds_i = *v_iter;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_constraints(ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type* m) try {
+ const MIP_Problem& mmip = *to_const(mip);
+ *m = static_cast<ppl_dimension_type>(mmip.constraints_end() - mmip.constraints_begin());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_constraint_at_index(ppl_const_MIP_Problem_t mip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc) try {
+#ifndef NDEBUG
+ ppl_dimension_type num_constraints;
+ ppl_MIP_Problem_number_of_constraints(mip, &num_constraints);
+ assert(i < num_constraints);
+#endif
+ const MIP_Problem& mmip = *to_const(mip);
+ const Constraint& c = *(mmip.constraints_begin() + i);
+ *pc = to_const(&c);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_objective_function(ppl_const_MIP_Problem_t mip,
+ ppl_const_Linear_Expression_t* ple) try {
+ const Linear_Expression& le = to_const(mip)->objective_function();
+ *ple = to_const(&le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimization_mode(ppl_const_MIP_Problem_t mip) try {
+ return to_const(mip)->optimization_mode();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_clear(ppl_MIP_Problem_t mip) try {
+ to_nonconst(mip)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed(ppl_MIP_Problem_t mip,
+ ppl_dimension_type d) try {
+ MIP_Problem& mmip = *to_nonconst(mip);
+ mmip.add_space_dimensions_and_embed(d);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_MIP_Problem_t mip,
+ ppl_dimension_type ds[],
+ size_t n) try {
+ MIP_Problem& mmip = *to_nonconst(mip);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ mmip.add_to_integer_space_dimensions(vars);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraint(ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ MIP_Problem& mmip = *to_nonconst(mip);
+ mmip.add_constraint(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraints(ppl_MIP_Problem_t mip,
+ ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ MIP_Problem& mmip = *to_nonconst(mip);
+ mmip.add_constraints(ccs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_objective_function(ppl_MIP_Problem_t mip,
+ ppl_const_Linear_Expression_t le) try {
+ const Linear_Expression& lle = *to_const(le);
+ MIP_Problem& mmip = *to_nonconst(mip);
+ mmip.set_objective_function(lle);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_optimization_mode(ppl_MIP_Problem_t mip, int mode) try {
+ MIP_Problem& mmip = *to_nonconst(mip);
+ Optimization_Mode m = (mode == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+ ? MINIMIZATION : MAXIMIZATION;
+ mmip.set_optimization_mode(m);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_is_satisfiable(ppl_const_MIP_Problem_t mip) try {
+ return to_const(mip)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_solve(ppl_const_MIP_Problem_t mip) try {
+ return to_const(mip)->solve();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_evaluate_objective_function(ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t g,
+ ppl_Coefficient_t num,
+ ppl_Coefficient_t den) try {
+ const MIP_Problem& mmip = *to_const(mip);
+ const Generator& gg = *to_const(g);
+ Coefficient& nnum = *to_nonconst(num);
+ Coefficient& dden = *to_nonconst(den);
+ mmip.evaluate_objective_function(gg, nnum, dden);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_feasible_point(ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg) try {
+ const Generator& g = to_const(mip)->feasible_point();
+ *pg = to_const(&g);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimizing_point(ppl_const_MIP_Problem_t mip,
+ ppl_const_Generator_t* pg) try {
+ const Generator& g = to_const(mip)->optimizing_point();
+ *pg = to_const(&g);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimal_value(ppl_const_MIP_Problem_t mip,
+ ppl_Coefficient_t num,
+ ppl_Coefficient_t den) try {
+ Coefficient& nnum = *to_nonconst(num);
+ Coefficient& dden = *to_nonconst(den);
+ to_const(mip)->optimal_value(nnum, dden);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_get_control_parameter(ppl_const_MIP_Problem_t mip,
+ int name) try {
+ MIP_Problem::Control_Parameter_Name n
+ = static_cast<MIP_Problem::Control_Parameter_Name>(name);
+ return to_const(mip)->get_control_parameter(n);
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_control_parameter(ppl_MIP_Problem_t mip,
+ int value) try {
+ MIP_Problem::Control_Parameter_Value v
+ = static_cast<MIP_Problem::Control_Parameter_Value>(value);
+ to_nonconst(mip)->set_control_parameter(v);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_OK(ppl_const_MIP_Problem_t mip) try {
+ return to_const(mip)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_total_memory_in_bytes(ppl_const_MIP_Problem_t mip,
+ size_t* sz) try {
+ *sz = to_const(mip)->total_memory_in_bytes();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_external_memory_in_bytes(ppl_const_MIP_Problem_t mip,
+ size_t* sz) try {
+ *sz = to_const(mip)->external_memory_in_bytes();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_space_dimension(ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d) try {
+ *ppip = to_nonconst(new PIP_Problem(d));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_PIP_Problem(ppl_PIP_Problem_t* dpip,
+ ppl_const_PIP_Problem_t pip) try {
+ const PIP_Problem& spip = *to_const(pip);
+ *dpip = to_nonconst(new PIP_Problem(spip));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_constraints
+(ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d,
+ ppl_Constraint_System_const_iterator_t first,
+ ppl_Constraint_System_const_iterator_t last,
+ size_t n,
+ ppl_dimension_type ds[]) try {
+ Variables_Set p_vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ p_vars.insert(ds[i]);
+ *ppip = to_nonconst(new PIP_Problem(d, *to_const(first),
+ *to_const(last), p_vars));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_PIP_Problem_from_PIP_Problem(ppl_PIP_Problem_t dst,
+ ppl_const_PIP_Problem_t src) try {
+ const PIP_Problem& ssrc = *to_const(src);
+ PIP_Problem& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_PIP_Problem(ppl_const_PIP_Problem_t pip) try {
+ delete to_const(pip);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_space_dimension(ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type* m) try {
+ *m = to_const(pip)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+(ppl_const_PIP_Problem_t pip, ppl_dimension_type* m) try {
+ const PIP_Problem& ppip = *to_const(pip);
+ *m = ppip.parameter_space_dimensions().size();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_parameter_space_dimensions(ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type ds[]) try {
+ const Variables_Set& vars = to_const(pip)->parameter_space_dimensions();
+ ppl_dimension_type* ds_i = ds;
+ for (Variables_Set::const_iterator v_iter = vars.begin(),
+ v_end = vars.end(); v_iter != v_end; ++v_iter, ++ds_i)
+ *ds_i = *v_iter;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_number_of_constraints(ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type* m) try {
+ const PIP_Problem& ppip = *to_const(pip);
+ *m = static_cast<ppl_dimension_type>(ppip.constraints_end() - ppip.constraints_begin());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_constraint_at_index(ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type i,
+ ppl_const_Constraint_t* pc) try {
+#ifndef NDEBUG
+ ppl_dimension_type num_constraints;
+ ppl_PIP_Problem_number_of_constraints(pip, &num_constraints);
+ assert(i < num_constraints);
+#endif
+ const PIP_Problem& ppip = *to_const(pip);
+ const Constraint& c = *(ppip.constraints_begin() + i);
+ *pc = to_const(&c);
+ return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_clear(ppl_PIP_Problem_t pip) try {
+ to_nonconst(pip)->clear();
+ return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed(ppl_PIP_Problem_t pip,
+ ppl_dimension_type pip_vars,
+ ppl_dimension_type pip_params)
+ try {
+ PIP_Problem& spip = *to_nonconst(pip);
+ spip.add_space_dimensions_and_embed(pip_vars,pip_params);
+ return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions(ppl_PIP_Problem_t pip,
+ ppl_dimension_type ds[],
+ size_t n) try {
+ PIP_Problem& ppip = *to_nonconst(pip);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ ppip.add_to_parameter_space_dimensions(vars);
+ return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_constraint(ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ PIP_Problem& ppip = *to_nonconst(pip);
+ ppip.add_constraint(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_add_constraints(ppl_PIP_Problem_t pip,
+ ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ PIP_Problem& ppip = *to_nonconst(pip);
+ ppip.add_constraints(ccs);
+ return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_is_satisfiable(ppl_const_PIP_Problem_t pip) try {
+ return to_const(pip)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_solve(ppl_const_PIP_Problem_t pip) try {
+ return to_const(pip)->solve();
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_solution(ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* ppip_tree) try {
+ *ppip_tree = to_const(to_const(pip)->solution());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_optimizing_solution(ppl_const_PIP_Problem_t pip,
+ ppl_const_PIP_Tree_Node_t* ppip_tree) try {
+ *ppip_tree = to_const(to_const(pip)->optimizing_solution());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_OK(ppl_const_PIP_Problem_t pip) try {
+ return to_const(pip)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_get_control_parameter(ppl_const_PIP_Problem_t pip,
+ int name) try {
+ PIP_Problem::Control_Parameter_Name n
+ = static_cast<PIP_Problem::Control_Parameter_Name>(name);
+ return to_const(pip)->get_control_parameter(n);
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_set_control_parameter(ppl_PIP_Problem_t pip,
+ int value) try {
+ PIP_Problem::Control_Parameter_Value v
+ = static_cast<PIP_Problem::Control_Parameter_Value>(value);
+ to_nonconst(pip)->set_control_parameter(v);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_get_big_parameter_dimension(ppl_const_PIP_Problem_t pip,
+ ppl_dimension_type* pd) try {
+ *pd = to_const(pip)->get_big_parameter_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_set_big_parameter_dimension(ppl_PIP_Problem_t pip,
+ ppl_dimension_type d) try {
+ to_nonconst(pip)->set_big_parameter_dimension(d);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_total_memory_in_bytes(ppl_const_PIP_Problem_t pip,
+ size_t* sz) try {
+ *sz = to_const(pip)->total_memory_in_bytes();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_external_memory_in_bytes(ppl_const_PIP_Problem_t pip,
+ size_t* sz) try {
+ *sz = to_const(pip)->external_memory_in_bytes();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_as_solution(ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Solution_Node_t* dpip_tree) try {
+ *dpip_tree = to_const(to_const(spip_tree)->as_solution());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_as_decision(ppl_const_PIP_Tree_Node_t spip_tree,
+ ppl_const_PIP_Decision_Node_t* dpip_tree) try {
+ *dpip_tree = to_const(to_const(spip_tree)->as_decision());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_get_constraints(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_const_Constraint_System_t* pcs) try {
+ const PIP_Tree_Node& spip_tree = *to_const(pip_tree);
+ const Constraint_System& cs = spip_tree.constraints();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_OK(ppl_const_PIP_Tree_Node_t pip_tree) try {
+ return to_const(pip_tree)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_number_of_artificials(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_dimension_type* m) try {
+ const PIP_Tree_Node& node = *to_const(pip_tree);
+ *m = node.art_parameter_count();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_begin
+(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit) try {
+ PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator& spit
+ = *to_nonconst(pit);
+ spit = to_const(pip_tree)->art_parameter_begin();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_end
+(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit) try {
+ PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator& spit
+ = *to_nonconst(pit);
+ spit = to_const(pip_tree)->art_parameter_end();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_get_parametric_values
+ (ppl_const_PIP_Solution_Node_t pip_sol,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t* le) try {
+ const PIP_Solution_Node& spip_sol = *to_const(pip_sol);
+ const Linear_Expression& lle = spip_sol.parametric_values(Variable(var));
+ *le = to_const(&lle);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_OK(ppl_const_PIP_Solution_Node_t pip_sol) try {
+ return to_const(pip_sol)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_OK(ppl_const_PIP_Decision_Node_t pip_dec) try {
+ return to_const(pip_dec)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_get_child_node(ppl_const_PIP_Decision_Node_t pip_dec,
+ int b,
+ ppl_const_PIP_Tree_Node_t* pip_tree) try {
+ *pip_tree = to_const(to_const(pip_dec)->child_node(b != 0));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+(ppl_const_Artificial_Parameter_t ap,
+ ppl_Linear_Expression_t le) try {
+ const Artificial_Parameter& sap = *to_const(ap);
+ Linear_Expression& lle = *to_nonconst(le);
+ lle = sap;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_coefficient(ppl_const_Artificial_Parameter_t ap,
+ ppl_dimension_type var,
+ ppl_Coefficient_t n) try {
+ const Artificial_Parameter& sap = *to_const(ap);
+ Coefficient& nn = *to_nonconst(n);
+ nn = sap.coefficient(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_inhomogeneous_term
+(ppl_const_Artificial_Parameter_t ap, ppl_Coefficient_t n) try {
+ const Artificial_Parameter& sap = *to_const(ap);
+ Coefficient& nn = *to_nonconst(n);
+ nn = sap.inhomogeneous_term();
+ return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_Artificial_Parameter_denominator(ppl_const_Artificial_Parameter_t ap,
+ ppl_Coefficient_t n) try {
+ const Artificial_Parameter& sap = *to_const(ap);
+ Coefficient& nn = *to_nonconst(n);
+ nn = sap.denominator();
+ return 0;
+}
+CATCH_ALL
+
+
+/* Interface for Artificial_Parameter_Sequence::const_iterator. */
+
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t* papit) try {
+ *papit = to_nonconst(new Artificial_Parameter_Sequence::const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit) try {
+ *papit = to_nonconst(new Artificial_Parameter_Sequence::const_iterator(*to_const(apit)));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit)
+ try {
+ delete to_const(apit);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t src) try {
+ const Artificial_Parameter_Sequence::const_iterator& ssrc = *to_const(src);
+ Artificial_Parameter_Sequence::const_iterator& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+ ppl_const_Artificial_Parameter_t* pap) try {
+ const Artificial_Parameter_Sequence::const_iterator& papit = *to_const(apit);
+ const Artificial_Parameter& ap = *papit;
+ *pap = to_const(&ap);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+(ppl_Artificial_Parameter_Sequence_const_iterator_t apit) try {
+ Artificial_Parameter_Sequence::const_iterator& papit = *to_nonconst(apit);
+ ++papit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t y) try {
+ const Artificial_Parameter_Sequence::const_iterator& xx = *to_const(x);
+ const Artificial_Parameter_Sequence::const_iterator& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_io_print_variable(ppl_dimension_type var) try {
+ const char* b = c_variable_output_function(var);
+ if (b == 0 || puts(b) < 0)
+ return PPL_STDIO_ERROR;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_fprint_variable(FILE* stream, ppl_dimension_type var) try {
+ const char* b = c_variable_output_function(var);
+ if (b == 0 || fputs(b, stream) < 0)
+ return PPL_STDIO_ERROR;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_asprint_variable(char** strp, ppl_dimension_type var) try {
+ const char* b = c_variable_output_function(var);
+ if (b == 0)
+ return PPL_STDIO_ERROR;
+ *strp = strdup(b);
+ if (*strp == 0)
+ return PPL_ERROR_OUT_OF_MEMORY;
+ return 0;
+}
+CATCH_ALL
+
+/* No ascii dump for Coefficient. */
+DEFINE_PRINT_FUNCTIONS(Coefficient)
+
+DEFINE_OUTPUT_FUNCTIONS(Linear_Expression)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(MIP_Problem)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Problem)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Tree_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Decision_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Solution_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(Artificial_Parameter)
+
+char*
+ppl_io_wrap_string(const char* src,
+ unsigned indent_depth,
+ unsigned preferred_first_line_length,
+ unsigned preferred_line_length) {
+ using namespace IO_Operators;
+ return strdup(wrap_string(src, indent_depth,
+ preferred_first_line_length,
+ preferred_line_length).c_str());
+}
+
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p)
+try {
+ c_variable_output_function = p;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp)
+try {
+ *pp = c_variable_output_function;
+ return 0;
+}
+CATCH_ALL
diff --git a/interfaces/C/ppl_c_implementation_common_defs.hh b/interfaces/C/ppl_c_implementation_common_defs.hh
new file mode 100644
index 0000000..cc4d36e
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common_defs.hh
@@ -0,0 +1,259 @@
+/* Implementation of the C interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_implementation_common_defs_hh
+#define PPL_ppl_c_implementation_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#include "ppl_c.h"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+extern "C" typedef void
+(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
+
+extern error_handler_type user_error_handler;
+
+void notify_error(enum ppl_enum_error_code code, const char* description);
+
+Relation_Symbol relation_symbol(enum ppl_enum_Constraint_Type t);
+
+Bounded_Integer_Type_Width
+bounded_integer_type_width(enum ppl_enum_Bounded_Integer_Type_Width w);
+
+Bounded_Integer_Type_Representation
+bounded_integer_type_representation(enum ppl_enum_Bounded_Integer_Type_Representation r);
+
+/*! \brief
+ A class to wrap an array of fixed length into a partial function interface
+ suitable for the map_space_dimension() methods.
+*/
+class Array_Partial_Function_Wrapper {
+public:
+ /*! \brief
+ Construct a partial function wrapping the first \p n positions of
+ \p v.
+ */
+ Array_Partial_Function_Wrapper(dimension_type* v, size_t n);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ */
+ bool has_empty_codomain() const;
+
+ /*! \brief
+ Returns the maximum value that belongs to the codomain
+ of the partial function.
+ */
+ dimension_type max_in_codomain() const;
+
+ /*! \brief
+ Assigns to \p j the value associated to \p i by \p *this, if any.
+
+ Let \f$f\f$ be the function represented by \p *this and \f$k\f$ be
+ the value of \p i. If \f$f\f$ is defined in \f$k\f$, then
+ \f$f(k)\f$ is assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+ */
+ bool maps(dimension_type i, dimension_type& j) const;
+
+private:
+ //! Holds the vector implementing the map.
+ dimension_type* vec;
+
+ //! Holds the size of \p vec.
+ size_t vec_size;
+
+ //! Cache for computing the maximum dimension in the codomain.
+ mutable dimension_type max_in_codomain_;
+
+ //! Cache for computing emptiness:
+ //! -1 if we still don't know, 0 if not empty, 1 if empty.
+ mutable int empty;
+};
+
+class timeout_exception : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+void reset_timeout();
+
+class deterministic_timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+void reset_deterministic_timeout();
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define CATCH_STD_EXCEPTION(exception, code) \
+catch (const std::exception& e) { \
+ notify_error(code, e.what()); \
+ return code; \
+}
+
+#define CATCH_ALL \
+CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \
+CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \
+CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \
+CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \
+CATCH_STD_EXCEPTION(logic_error, PPL_ERROR_LOGIC_ERROR) \
+CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
+CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
+CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
+catch (timeout_exception&) { \
+ reset_timeout(); \
+ notify_error(PPL_TIMEOUT_EXCEPTION, "PPL timeout expired"); \
+ return PPL_TIMEOUT_EXCEPTION; \
+} \
+catch (deterministic_timeout_exception&) { \
+ reset_deterministic_timeout(); \
+ notify_error(PPL_TIMEOUT_EXCEPTION, "PPL deterministic timeout expired"); \
+ return PPL_TIMEOUT_EXCEPTION; \
+} \
+catch (...) { \
+ notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
+ "completely unexpected error: a bug in the PPL"); \
+ return PPL_ERROR_UNEXPECTED_ERROR; \
+}
+
+#define DECLARE_CONVERSIONS(Type, CPP_Type) \
+ inline const CPP_Type* \
+ to_const(ppl_const_##Type##_t x) { \
+ return reinterpret_cast<const CPP_Type*>(x); \
+ } \
+ \
+ inline CPP_Type* \
+ to_nonconst(ppl_##Type##_t x) { \
+ return reinterpret_cast<CPP_Type*>(x); \
+ } \
+ \
+ inline ppl_const_##Type##_t \
+ to_const(const CPP_Type* x) { \
+ return reinterpret_cast<ppl_const_##Type##_t>(x); \
+ } \
+ \
+ inline ppl_##Type##_t \
+ to_nonconst(CPP_Type* x) { \
+ return reinterpret_cast<ppl_##Type##_t>(x); \
+ }
+
+#define DEFINE_PRINT_FUNCTIONS(Type) \
+ int \
+ ppl_io_print_##Type(ppl_const_##Type##_t x) try { \
+ using namespace IO_Operators; \
+ stdiobuf sb(stdout); \
+ std::ostream os(&sb); \
+ os << *to_const(x); \
+ if (!os) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+ } \
+ CATCH_ALL \
+ \
+ int \
+ ppl_io_fprint_##Type(FILE* file, ppl_const_##Type##_t x) try { \
+ using namespace IO_Operators; \
+ stdiobuf sb(file); \
+ std::ostream os(&sb); \
+ os << *to_const(x); \
+ if (!os) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+ } \
+ CATCH_ALL \
+ \
+ int \
+ ppl_io_asprint_##Type(char** strp, ppl_const_##Type##_t x) try { \
+ using namespace IO_Operators; \
+ std::ostringstream os; \
+ os << *to_const(x); \
+ if (!os) \
+ return PPL_STDIO_ERROR; \
+ *strp = strdup(os.str().c_str()); \
+ if (*strp == 0) \
+ return PPL_ERROR_OUT_OF_MEMORY; \
+ return 0; \
+ } \
+ CATCH_ALL
+
+#define DEFINE_ASCII_DUMP_FUNCTIONS(Type) \
+ int \
+ ppl_##Type##_ascii_dump(ppl_const_##Type##_t x, FILE* file) try { \
+ stdiobuf sb(file); \
+ std::ostream os(&sb); \
+ to_const(x)->ascii_dump(os); \
+ if (!os) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+ } \
+ CATCH_ALL
+
+#define DEFINE_ASCII_LOAD_FUNCTIONS(Type) \
+ int \
+ ppl_##Type##_ascii_load(ppl_##Type##_t x, FILE* file) try { \
+ stdiobuf sb(file); \
+ std::istream is(&sb); \
+ if (!to_nonconst(x)->ascii_load(is)) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+ } \
+ CATCH_ALL
+
+#define DEFINE_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+ DEFINE_ASCII_DUMP_FUNCTIONS(Type) \
+ DEFINE_ASCII_LOAD_FUNCTIONS(Type)
+
+#define DEFINE_OUTPUT_FUNCTIONS(Type) \
+ DEFINE_PRINT_FUNCTIONS(Type) \
+ DEFINE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#include "ppl_c_implementation_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_c_implementation_common_defs_hh)
diff --git a/interfaces/C/ppl_c_implementation_common_inlines.hh b/interfaces/C/ppl_c_implementation_common_inlines.hh
new file mode 100644
index 0000000..35af8d3
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common_inlines.hh
@@ -0,0 +1,214 @@
+/* Implementation of the C interface: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_implementation_common_inlines_hh
+#define PPL_ppl_c_implementation_common_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+// FIXME: this same function is used also in the OCaml interface.
+// It should be placed in some common header file in the interfaces
+// directory.
+//! Reinterpret an mpz_t as mpz_class.
+inline mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+ return reinterpret_cast<mpz_class&>(*n);
+}
+
+DECLARE_CONVERSIONS(Coefficient, Coefficient)
+
+DECLARE_CONVERSIONS(Linear_Expression, Linear_Expression)
+
+DECLARE_CONVERSIONS(Constraint, Constraint)
+
+DECLARE_CONVERSIONS(Constraint_System, Constraint_System)
+
+DECLARE_CONVERSIONS(Constraint_System_const_iterator,
+ Constraint_System_const_iterator)
+
+DECLARE_CONVERSIONS(Generator, Generator)
+
+DECLARE_CONVERSIONS(Generator_System, Generator_System)
+
+DECLARE_CONVERSIONS(Generator_System_const_iterator,
+ Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(Congruence, Congruence)
+
+DECLARE_CONVERSIONS(Congruence_System, Congruence_System)
+
+typedef Congruence_System::const_iterator Congruence_System_const_iterator;
+DECLARE_CONVERSIONS(Congruence_System_const_iterator,
+ Congruence_System_const_iterator)
+
+DECLARE_CONVERSIONS(Grid_Generator, Grid_Generator)
+
+DECLARE_CONVERSIONS(Grid_Generator_System, Grid_Generator_System)
+
+typedef Grid_Generator_System::const_iterator
+Grid_Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Grid_Generator_System_const_iterator,
+ Grid_Generator_System_const_iterator)
+
+typedef PIP_Tree_Node::Artificial_Parameter
+Artificial_Parameter;
+DECLARE_CONVERSIONS(Artificial_Parameter, Artificial_Parameter)
+
+typedef PIP_Tree_Node::Artificial_Parameter_Sequence
+Artificial_Parameter_Sequence;
+DECLARE_CONVERSIONS(Artificial_Parameter_Sequence,
+ Artificial_Parameter_Sequence)
+
+typedef PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+Artificial_Parameter_Sequence_const_iterator;
+DECLARE_CONVERSIONS(Artificial_Parameter_Sequence_const_iterator,
+ Artificial_Parameter_Sequence_const_iterator)
+
+DECLARE_CONVERSIONS(MIP_Problem, MIP_Problem)
+
+DECLARE_CONVERSIONS(PIP_Problem, PIP_Problem)
+
+DECLARE_CONVERSIONS(PIP_Tree_Node, PIP_Tree_Node)
+
+DECLARE_CONVERSIONS(PIP_Decision_Node, PIP_Decision_Node)
+
+DECLARE_CONVERSIONS(PIP_Solution_Node, PIP_Solution_Node)
+
+inline Relation_Symbol
+relation_symbol(enum ppl_enum_Constraint_Type t) {
+ switch (t) {
+ case PPL_CONSTRAINT_TYPE_LESS_THAN:
+ return LESS_THAN;
+ case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+ return LESS_OR_EQUAL;
+ case PPL_CONSTRAINT_TYPE_EQUAL:
+ return EQUAL;
+ case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+ return GREATER_OR_EQUAL;
+ case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+ return GREATER_THAN;
+ default:
+ return static_cast<Relation_Symbol>(t);
+ }
+}
+
+inline Bounded_Integer_Type_Width
+bounded_integer_type_width(enum ppl_enum_Bounded_Integer_Type_Width w) {
+ switch (w) {
+ case PPL_BITS_8:
+ return BITS_8;
+ case PPL_BITS_16:
+ return BITS_16;
+ case PPL_BITS_32:
+ return BITS_32;
+ case PPL_BITS_64:
+ return BITS_64;
+ case PPL_BITS_128:
+ return BITS_128;
+ default:
+ return static_cast<Bounded_Integer_Type_Width>(w);
+ }
+}
+
+inline Bounded_Integer_Type_Representation
+bounded_integer_type_representation(enum ppl_enum_Bounded_Integer_Type_Representation r) {
+ switch (r) {
+ case PPL_UNSIGNED:
+ return UNSIGNED;
+ case PPL_SIGNED_2_COMPLEMENT:
+ return SIGNED_2_COMPLEMENT;
+ default:
+ return static_cast<Bounded_Integer_Type_Representation>(r);
+ }
+}
+
+inline Bounded_Integer_Type_Overflow
+bounded_integer_type_overflow(enum ppl_enum_Bounded_Integer_Type_Overflow o) {
+ switch (o) {
+ case PPL_OVERFLOW_WRAPS:
+ return OVERFLOW_WRAPS;
+ case PPL_OVERFLOW_UNDEFINED:
+ return OVERFLOW_UNDEFINED;
+ case PPL_OVERFLOW_IMPOSSIBLE:
+ return OVERFLOW_IMPOSSIBLE;
+ default:
+ return static_cast<Bounded_Integer_Type_Overflow>(o);
+ }
+}
+
+inline
+Array_Partial_Function_Wrapper
+::Array_Partial_Function_Wrapper(dimension_type* v, size_t n)
+ : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
+}
+
+inline bool
+Array_Partial_Function_Wrapper::has_empty_codomain() const {
+ if (empty < 0) {
+ empty = 1;
+ for (size_t i = vec_size; i-- > 0; )
+ if (vec[i] != not_a_dimension()) {
+ empty = 0;
+ break;
+ }
+ }
+ return (empty != 0);
+}
+
+inline dimension_type
+Array_Partial_Function_Wrapper::max_in_codomain() const {
+ if (max_in_codomain_ == not_a_dimension()) {
+ for (size_t i = vec_size; i-- > 0; ) {
+ dimension_type vec_i = vec[i];
+ if (vec_i != not_a_dimension()
+ && (max_in_codomain_ == not_a_dimension()
+ || vec_i > max_in_codomain_))
+ max_in_codomain_ = vec_i;
+ }
+ }
+ return max_in_codomain_;
+}
+
+inline bool
+Array_Partial_Function_Wrapper::maps(dimension_type i,
+ dimension_type& j) const {
+ if (i >= vec_size)
+ return false;
+ dimension_type vec_i = vec[i];
+ if (vec_i == not_a_dimension())
+ return false;
+ j = vec_i;
+ return true;
+}
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_c_implementation_common_inlines_hh)
diff --git a/interfaces/C/ppl_c_version.h.in b/interfaces/C/ppl_c_version.h.in
new file mode 100644
index 0000000..f3db745
--- /dev/null
+++ b/interfaces/C/ppl_c_version.h.in
@@ -0,0 +1,63 @@
+/* Header file providing version information for the C interface. -*- C -*-
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \brief
+ A string containing the PPL version.
+
+ \ingroup Version
+ Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+ to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The
+ format of PPL_VERSION is <CODE>M "." m</CODE> if both
+ PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+ (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+ PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+ <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+ PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+ neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+/*! \brief
+ The major number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+/*! \brief
+ The minor number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+/*! \brief
+ The revision number of the PPL version.
+ \ingroup Version
+*/
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+ The beta number of the PPL version. This is zero for official
+ releases and nonzero for development snapshots.
+ \ingroup Version
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
diff --git a/interfaces/C/ppl_interface_generator_c_cc_code.m4 b/interfaces/C/ppl_interface_generator_c_cc_code.m4
new file mode 100644
index 0000000..2c45fc1
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_code.m4
@@ -0,0 +1,1437 @@
+dnl -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program implementation code for generating the
+files ppl_c_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the C interface.
+
+m4_define(`ppl_ at CLASS@_swap_code', `')
+m4_define(`ppl_ at CLASS@_ascii_dump_code', `')
+
+dnl There is no code at present for these procedures in the C interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+(ppl_ at CLASS@_t* pph,
+ ppl_dimension_type d,
+ int empty) try {
+ const Degenerate_Element e = (empty != 0) ? EMPTY : UNIVERSE;
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(d, e));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+(ppl_ at CLASS@_t* pph,
+ ppl_const_ at A_FRIEND@_t ph) try {
+ const @B_FRIEND@& phh
+ = *static_cast<const @B_FRIEND@*>(to_const(ph));
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity
+(ppl_ at CLASS@_t* pph,
+ ppl_const_ at A_FRIEND@_t ph,
+ int complexity) try {
+ const @B_FRIEND@& phh
+ = *static_cast<const @B_FRIEND@*>(to_const(ph));
+ switch (complexity) {
+ case 0:
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, POLYNOMIAL_COMPLEXITY));
+ break;
+ case 1:
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, SIMPLEX_COMPLEXITY));
+ break;
+ case 2:
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, ANY_COMPLEXITY));
+ break;
+ }
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@!BUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT at _System_t cs) try {
+ const @!BUILD_REPRESENT at _System& ccs = *to_const(cs);
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@!BUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_@!BUILD_REPRESENT at _System_t cs) try {
+ @!BUILD_REPRESENT at _System& ccs = *to_nonconst(cs);
+ *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs at RECYCLE@));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`int
+ppl_delete_ at CLASS@(ppl_const_ at CLASS@_t ph) try {
+ delete to_const(ph);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+(ppl_ at CLASS@_t dst,
+ ppl_const_ at CLASS@_t src) try {
+ const @TOPOLOGY@@CPP_CLASS@& ssrc
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(src));
+ @TOPOLOGY@@CPP_CLASS@& ddst
+ = *static_cast<@TOPOLOGY@@CPP_CLASS@*>(to_nonconst(dst));
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`int
+ppl_ at CLASS@_ at DIMENSION@
+(ppl_const_ at CLASS@_t ph,
+ ppl_dimension_type* m) try {
+ *m = to_const(ph)->@DIMENSION@();
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const @!CLASS_REPRESENT at _System& cs = pph. at CLASS_REPRESENT@s();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const @!CLASS_REPRESENT at _System& cs = pph.minimized_ at CLASS_REPRESENT@s();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`int
+ppl_ at CLASS@_relation_with_@!RELATION_REPRESENT@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!RELATION_REPRESENT at _t c) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const @!RELATION_REPRESENT@& cc = *to_const(c);
+ return static_cast<int>(pph.relation_with(cc).get_flags());
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`int
+ppl_ at CLASS@_ at HAS_PROPERTY@(ppl_const_ at CLASS@_t ph) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ return pph. at HAS_PROPERTY@() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ return pph.bounds_from_ at ABOVEBELOW@(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* poptimum) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& ssup_n = *to_nonconst(sup_n);
+ Coefficient& ssup_d = *to_nonconst(sup_d);
+ bool optimum;
+ const bool ok = pph. at MAXMIN@(lle, ssup_n, ssup_d, optimum);
+ if (ok)
+ *poptimum = optimum ? 1 : 0;
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@_with_point
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* poptimum,
+ ppl_Generator_t point) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& ssup_n = *to_nonconst(sup_n);
+ Coefficient& ssup_d = *to_nonconst(sup_d);
+ Generator& ppoint = *to_nonconst(point);
+ bool optimum;
+ const bool ok = pph. at MAXMIN@(lle, ssup_n, ssup_d, optimum, ppoint);
+ if (ok)
+ *poptimum = optimum ? 1 : 0;
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`int
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound
+(ppl_ at CLASS@_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed) try {
+ const @CPP_CLASS@& pps = *to_const(ps);
+ Coefficient& eext_n = *to_nonconst(ext_n);
+ Coefficient& eext_d = *to_nonconst(ext_d);
+ bool closed;
+ const bool bounded
+ = pps.has_ at UPPERLOWER@_bound(Variable(var), eext_n, eext_d, closed);
+ if (bounded)
+ *pclosed = closed ? 1 : 0;
+ return bounded ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`int
+ppl_ at CLASS@_frequency
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t freq_n,
+ ppl_Coefficient_t freq_d,
+ ppl_Coefficient_t val_n,
+ ppl_Coefficient_t val_d) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& pfreq_n = *to_nonconst(freq_n);
+ Coefficient& pfreq_d = *to_nonconst(freq_d);
+ Coefficient& pval_n = *to_nonconst(val_n);
+ Coefficient& pval_d = *to_nonconst(val_d);
+ return pph.frequency(lle, pfreq_n, pfreq_d, pval_n, pval_d) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ const @CPP_CLASS@& xx = *to_const(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ return xx. at COMPARISON@(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`int
+ppl_ at CLASS@_equals_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ const @CPP_CLASS@& xx = *to_const(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`int
+ppl_ at CLASS@_OK(ppl_const_ at CLASS@_t ph) try {
+ return to_const(ph)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`int
+ppl_ at CLASS@_ at SIMPLIFY@(ppl_ at CLASS@_t ph) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ pph. at SIMPLIFY@();
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ pph.unconstrain(Variable(var));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ pph.unconstrain(vars);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`int
+ppl_ at CLASS@_constrains
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+ const @CPP_CLASS@& pph = *to_const(ph);
+ return pph.constrains(Variable(var)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`int
+ppl_ at CLASS@_ at BINOP@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx. at BINOP@(yy);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`int
+ppl_ at CLASS@_positive_time_elapse_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+ C_Polyhedron& xx = static_cast<C_Polyhedron&>(*to_nonconst(x));
+ const C_Polyhedron& yy = static_cast<const C_Polyhedron&>(*to_const(y));
+ xx.positive_time_elapse_assign(yy);
+ }
+ else {
+ NNC_Polyhedron& xx = static_cast<NNC_Polyhedron&>(*to_nonconst(x));
+ const NNC_Polyhedron& yy = static_cast<const NNC_Polyhedron&>(*to_const(y));
+ xx.positive_time_elapse_assign(yy);
+ }
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`int
+ppl_ at CLASS@_ at UB_EXACT@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_ub_exact_for_polyhedron_domains',
+ `m4_ub_exact_for_non_polyhedron_domains')'
+}
+CATCH_ALL
+
+ ')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+` if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+ C_Polyhedron& xx = static_cast<C_Polyhedron&>(*to_nonconst(x));
+ const C_Polyhedron& yy = static_cast<const C_Polyhedron&>(*to_const(y));
+ return xx.upper_bound_assign_if_exact(yy) ? 1 : 0;
+ }
+ else {
+ NNC_Polyhedron& xx = static_cast<NNC_Polyhedron&>(*to_nonconst(x));
+ const NNC_Polyhedron& yy = static_cast<const NNC_Polyhedron&>(*to_const(y));
+ return xx.upper_bound_assign_if_exact(yy) ? 1 : 0;
+ }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+` @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ return xx. at UB_EXACT@(yy) ? 1 : 0;
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`int
+ppl_ at CLASS@_simplify_using_context_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ return xx.simplify_using_context_assign(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _t c) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const @!CLASS_REPRESENT@& cc = *to_const(c);
+ pph.add_ at CLASS_REPRESENT@(cc);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _t c) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const @!REFINE_REPRESENT@& cc = *to_const(c);
+ pph.refine_with_ at REFINE_REPRESENT@(cc);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t cs) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const @!CLASS_REPRESENT at _System& ccs = *to_const(cs);
+ pph.add_ at CLASS_REPRESENT@s(ccs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _System_t cs) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const @!REFINE_REPRESENT at _System& ccs = *to_const(cs);
+ pph.refine_with_ at REFINE_REPRESENT@s(ccs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_@!CLASS_REPRESENT at _System_t cs) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ @!CLASS_REPRESENT at _System& ccs = *to_nonconst(cs);
+ pph.add_recycled_ at CLASS_REPRESENT@s(ccs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph. at AFFIMAGE@(Variable(var), lle, dd);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& llb = *to_const(lb);
+ const Linear_Expression& uub = *to_const(ub);
+ const Coefficient& dd = *to_const(d);
+ pph.bounded_ at AFFIMAGE@(Variable(var), llb, uub, dd);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph.generalized_ at AFFIMAGE@
+ (Variable(var), relation_symbol(relsym), lle, dd);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& llhs = *to_const(lhs);
+ const Linear_Expression& rrhs = *to_const(rhs);
+ pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ const Coefficient& mm = *to_const(m);
+ pph.generalized_ at AFFIMAGE@
+ (Variable(var), relation_symbol(relsym), lle, dd, mm);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Linear_Expression& llhs = *to_const(lhs);
+ const Linear_Expression& rrhs = *to_const(rhs);
+ const Coefficient& mm = *to_const(m);
+ pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs, mm);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx. at WIDEN@_widening_assign(yy, tp);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ return ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_widening_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx.widening_assign(yy, tp);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`int
+ppl_ at CLASS@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ return ppl_ at CLASS@_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs,
+ unsigned* tp) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ const @!CONSTRAINER at _System& ccs = *to_const(cs);
+ xx. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(yy, ccs, tp);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs) try {
+ return
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+ (x, y, cs, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx. at EXTRAPOLATION@_extrapolation_assign(yy, tp);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ return
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+ (x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx. at EXTRAPOLATION@_narrowing_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+ m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+int
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx.BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>(yy,
+ widen_fun_ref(
+ &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned disjuncts) try {
+ @CPP_CLASS@& xx = *to_nonconst(x);
+ const @CPP_CLASS@& yy = *to_const(y);
+ xx.BGP99_extrapolation_assign(yy,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::
+ @DISJUNCT_WIDEN at _widening_assign),
+ disjuncts);
+ return 0;
+}
+CATCH_ALL
+
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ pph.add_space_dimensions_ at EMBEDPROJECT@(d);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ pph.remove_space_dimensions(vars);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_higher_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ pph.remove_higher_space_dimensions(d);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`int
+ppl_ at CLASS@_map_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type maps[],
+ size_t n) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ const Array_Partial_Function_Wrapper function(maps, n);
+ pph.map_space_dimensions(function);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`int
+ppl_ at CLASS@_expand_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ pph.expand_space_dimension(Variable(d), m);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`int
+ppl_ at CLASS@_fold_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ pph.fold_space_dimensions(vars, Variable(d));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`int
+ppl_ at CLASS@_drop_some_non_integer_points
+(ppl_ at CLASS@_t ph,
+ int complexity) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ switch (complexity) {
+ case 0:
+ pph.drop_some_non_integer_points(POLYNOMIAL_COMPLEXITY);
+ break;
+ case 1:
+ pph.drop_some_non_integer_points(SIMPLEX_COMPLEXITY);
+ break;
+ case 2:
+ pph.drop_some_non_integer_points(ANY_COMPLEXITY);
+ break;
+ }
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`int
+ppl_ at CLASS@_drop_some_non_integer_points_2
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ switch (complexity) {
+ case 0:
+ pph.drop_some_non_integer_points(vars, POLYNOMIAL_COMPLEXITY);
+ break;
+ case 1:
+ pph.drop_some_non_integer_points(vars, SIMPLEX_COMPLEXITY);
+ break;
+ case 2:
+ pph.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ break;
+ }
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`int
+ppl_ at CLASS@_ at MEMBYTES@
+(ppl_const_ at CLASS@_t ps,
+ size_t* sz) try {
+ *sz = to_const(ps)->@MEMBYTES@();
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_code',
+`dnl
+
+typedef @CPP_CLASS@::iterator
+ @CLASS at _iterator;
+typedef @CPP_CLASS@::const_iterator
+ @CLASS at _const_iterator;
+
+DECLARE_CONVERSIONS(@CLASS at _iterator,
+ @CLASS at _iterator)
+DECLARE_CONVERSIONS(@CLASS at _const_iterator,
+ @CLASS at _const_iterator)
+
+int
+ppl_new_ at CLASS@_iterator
+(ppl_ at CLASS@_iterator_t* pit) try {
+ *pit = to_nonconst(new @CLASS at _iterator());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_ at CLASS@_const_iterator
+(ppl_ at CLASS@_const_iterator_t* pit) try {
+ *pit = to_nonconst(new @CLASS at _const_iterator());
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+
+int
+ppl_new_ at CLASS@_iterator_from_iterator
+(ppl_ at CLASS@_iterator_t* px, ppl_const_ at CLASS@_iterator_t y) try {
+ const @CLASS at _iterator& yy
+ = *static_cast<const @CLASS at _iterator*>(to_const(y));
+ *px = to_nonconst(new @CLASS at _iterator(yy));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_ at CLASS@_const_iterator_from_const_iterator
+(ppl_ at CLASS@_const_iterator_t* px,
+ ppl_const_ at CLASS@_const_iterator_t y) try {
+ const @CLASS at _const_iterator& yy
+ = *static_cast<const @CLASS at _const_iterator*>(to_const(y));
+ *px = to_nonconst(new @CLASS at _const_iterator(yy));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_equal_test
+(ppl_const_ at CLASS@_iterator_t x,
+ ppl_const_ at CLASS@_iterator_t y) try {
+ return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_equal_test
+(ppl_const_ at CLASS@_const_iterator_t x,
+ ppl_const_ at CLASS@_const_iterator_t y) try {
+ return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at BEGINEND@
+(ppl_ at CLASS@_t ps,
+ ppl_ at CLASS@_iterator_t psit) try {
+ @CPP_CLASS@::iterator& ppsit = *to_nonconst(psit);
+ ppsit = to_nonconst(ps)->@BEGINEND@();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_ at BEGINEND@
+(ppl_const_ at CLASS@_t ps,
+ ppl_ at CLASS@_const_iterator_t psit) try {
+ @CPP_CLASS@::const_iterator& ppsit = *to_nonconst(psit);
+ ppsit = to_const(ps)->@BEGINEND@();
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+int
+ppl_delete_ at CLASS@_iterator
+(ppl_const_ at CLASS@_iterator_t it)
+ try {
+ delete to_const(it);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_ at CLASS@_const_iterator
+(ppl_const_ at CLASS@_const_iterator_t it)
+ try {
+ delete to_const(it);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+(ppl_ at CLASS@_iterator_t it)
+ try {
+ @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+ @B_INCDEC at iit;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+(ppl_ at CLASS@_const_iterator_t it)
+ try {
+ @CPP_CLASS@::const_iterator& iit = *to_nonconst(it);
+ @B_INCDEC at iit;
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it) try {
+ @CPP_CLASS@& pps = *to_nonconst(ps);
+ const @CPP_CLASS@::iterator& ccit = *to_const(cit);
+ @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+ iit = pps.drop_disjunct(ccit);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjuncts
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last) try {
+ @CPP_CLASS@& pps = *to_nonconst(ps);
+ const @CPP_CLASS@::iterator& ffirst = *to_const(first);
+ const @CPP_CLASS@::iterator& llast = *to_const(last);
+ pps.drop_disjuncts(ffirst, llast);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_add_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at DISJUNCT@_t d) try {
+ @CPP_CLASS@& pps = *to_nonconst(ps);
+ const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& dd
+ = *static_cast<const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(to_const(d));
+ pps.add_disjunct(dd);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_dereference
+(ppl_const_ at CLASS@_iterator_t psit,
+ ppl_const_ at DISJUNCT@_t* cd) try {
+ const @CPP_CLASS@::iterator& cpsit = *to_const(psit);
+ const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->pointset();
+ *cd = to_const(&d);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_dereference
+(ppl_const_ at CLASS@_const_iterator_t psit,
+ ppl_const_ at DISJUNCT@_t* cd) try {
+ const @CPP_CLASS@::const_iterator& cpsit = *to_const(psit);
+ const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->pointset();
+ *cd = to_const(&d);
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+int
+ppl_ at CLASS@_linear_ at PARTITION@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest) try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_linear_partition_for_polyhedron_domains',
+ `m4_linear_partition_for_non_polyhedron_domains')'
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+`dnl
+ if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+ const C_ at CPP_CLASS@& xx
+ = static_cast<const C_ at CPP_CLASS@&>(*to_const(x));
+ const C_ at CPP_CLASS@& yy
+ = static_cast<const C_ at CPP_CLASS@&>(*to_const(y));
+ std::pair<C_ at CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(xx, yy);
+ *p_inters = to_nonconst(&r.first);
+ *p_rest = to_nonconst(&r.second);
+ }
+ else {
+ const C_ at CPP_CLASS@& xx
+ = static_cast<const C_ at CPP_CLASS@&>(*to_const(x));
+ const C_ at CPP_CLASS@& yy
+ = static_cast<const C_ at CPP_CLASS@&>(*to_const(y));
+ std::pair<C_ at CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(xx, yy);
+ *p_inters = to_nonconst(&r.first);
+ *p_rest = to_nonconst(&r.second);
+}
+ return 0;
+
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+`dnl
+ const @CPP_CLASS@& xx
+ = static_cast<const @CPP_CLASS@&>(*to_const(x));
+ const @CPP_CLASS@& yy
+ = static_cast<const @CPP_CLASS@&>(*to_const(y));
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(xx, yy);
+ *p_inters = to_nonconst(&r.first);
+ *p_rest = to_nonconst(&r.second);
+ return 0;
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+int
+ppl_ at CLASS@_approximate_ at PARTITION@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_Grid_t* p_rest,
+ int* p_finite) try {
+ const @CPP_CLASS@& xx
+ = static_cast<const @CPP_CLASS@&>(*to_const(x));
+ const @CPP_CLASS@& yy
+ = static_cast<const @CPP_CLASS@&>(*to_const(y));
+ bool finite;
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+ r = approximate_partition(xx, yy, finite);
+ *p_inters = to_nonconst(&r.first);
+ *p_rest = to_nonconst(&r.second);
+ *p_finite = finite ? 1 : 0;
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+ return termination_test_ at TERMINATION_ID@(ppset) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before, ppl_const_ at CLASS@_t pset_after) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+ return termination_test_ at TERMINATION_ID@_2(ppset_before, ppset_after) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Generator_t point) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+ Generator& ppoint = *to_nonconst(point);
+ const bool ok = one_affine_ranking_function_ at TERMINATION_ID@(ppset, ppoint);
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Generator_t point) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+ Generator& ppoint = *to_nonconst(point);
+ const bool ok = one_affine_ranking_function_ at TERMINATION_ID@_2(ppset_before,
+ ppset_after,
+ ppoint);
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+ all_affine_ranking_functions_ at TERMINATION_ID@
+ (ppset, *static_cast<@A_TERMINATION_ID at Polyhedron*> (to_nonconst(ph)));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+ all_affine_ranking_functions_ at TERMINATION_ID@_2
+ (ppset_before, ppset_after,
+ *static_cast<@A_TERMINATION_ID at Polyhedron*>(to_nonconst(ph)));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+ all_affine_quasi_ranking_functions_MS(ppset,
+ *static_cast<C_Polyhedron*>(to_nonconst(ph_decreasing)),
+ *static_cast<C_Polyhedron*>(to_nonconst(ph_bounded)));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded) try {
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+ all_affine_quasi_ranking_functions_MS_2(ppset_before, ppset_after,
+ *static_cast<C_Polyhedron*>(to_nonconst(ph_decreasing)),
+ *static_cast<C_Polyhedron*>(to_nonconst(ph_bounded)));
+ return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`int
+ppl_ at CLASS@_wrap_assign
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually) try {
+ @CPP_CLASS@& pph = *to_nonconst(ph);
+ Variables_Set vars;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ vars.insert(ds[i]);
+ const Constraint_System* const ccs = to_const(*pcs);
+ const bool b = (wrap_individually != 0);
+ pph.wrap_assign(vars,
+ bounded_integer_type_width(w),
+ bounded_integer_type_representation(r),
+ bounded_integer_type_overflow(o),
+ ccs, complexity_threshold, b);
+ return 0;
+}
+CATCH_ALL
+
+')
diff --git a/interfaces/C/ppl_interface_generator_c_cc_files.m4 b/interfaces/C/ppl_interface_generator_c_cc_files.m4
new file mode 100644
index 0000000..7e5e135
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_files.m4
@@ -0,0 +1,70 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_cc
+dnl using the code in ppl_interface_generator_c_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_cc_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+m4_define(`m4_pattern_extensions', `, A_, B_')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* C m4_current_interface interface code: definitions.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_c_implementation_common_defs.hh"
+`#'include "interfaced_boxes.hh"
+`#'include "ppl_c_implementation_domains.hh"
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::C;
+
+')
+
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+DEFINE_OUTPUT_FUNCTIONS(m4_interface_class`'$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Output the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_h.m4 b/interfaces/C/ppl_interface_generator_c_h.m4
new file mode 100644
index 0000000..98d61c8
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h.m4
@@ -0,0 +1,72 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_domains.h
+dnl using the code in ppl_interface_generator_c_h_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_h_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+dnl m4_one_class_code(Class)
+m4_pushdef(`m4_one_class_code', `dnl
+PPL_TYPE_DECLARATION(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Output conversion declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+/*C interface code: header file.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl m4_pre_all_classes_code
+m4_define(`m4_pre_extra_class_code', `
+/*! \interface ppl_`'m4_interface_class$1`'_tag
+ \brief Types and functions for ppl_`'m4_interface_class$1`'_tag
+*/
+
+')
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+PPL_DECLARE_IO_FUNCTIONS(m4_interface_class$1)
+
+/* End of Functions Related to ppl_`'m4_interface_class$1`'_tag */
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_h_code.m4 b/interfaces/C/ppl_interface_generator_c_h_code.m4
new file mode 100644
index 0000000..14f8e99
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h_code.m4
@@ -0,0 +1,872 @@
+dnl -*- C -*-
+m4_divert(-1)
+
+This m4 file contains the program header code for generating the
+files ppl_c_domains.h.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the C interface.
+dnl
+m4_define(`ppl_ at CLASS@_swap_code', `')
+m4_define(`ppl_ at CLASS@_ascii_dump_code', `')
+
+dnl There is no code at present for these procedures in the C interface.
+dnl Remove the macro if its definition is added.
+dnl
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset));
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before, ppl_const_ at CLASS@_t pset_after));
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+ ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph));
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph));
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded));
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded));
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_linear_ at PARTITION@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_approximate_ at PARTITION@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_Grid_t* p_rest,
+ int* p_finite));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_dimension_type d, int empty));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at A_FRIEND@_t ph));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at A_FRIEND@_t ph, int complexity));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@!BUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@!BUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_@!BUILD_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_delete_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_ at CLASS@_t dst, ppl_const_ at CLASS@_t src));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at DIMENSION@
+PPL_PROTO((ppl_const_ at CLASS@_t ph, ppl_dimension_type* m));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_relation_with_@!RELATION_REPRESENT@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_@!RELATION_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at HAS_PROPERTY@
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MAXMIN@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MAXMIN@_with_point
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* poptimum,
+ ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_ at UPPERLOWER@_bound
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed));
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_frequency
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t ext_fn,
+ ppl_Coefficient_t ext_fd,
+ ppl_Coefficient_t ext_vn,
+ ppl_Coefficient_t ext_vd));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_equals_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_OK
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at SIMPLIFY@
+PPL_PROTO((ppl_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_constrains
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_unconstrain_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_unconstrain_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at BINOP@
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_positive_time_elapse_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at UB_EXACT@
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_simplify_using_context_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_@!CLASS_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_widening_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs,
+ unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ int disjuncts));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_remove_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_remove_higher_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_map_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_expand_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_fold_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_some_non_integer_points
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ int complexity));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_some_non_integer_points_2
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity));
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_wrap_assign
+PPL_PROTO((ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually));
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MEMBYTES@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+ size_t* sz));
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_code',
+`dnl
+/*! \interface ppl_ at CLASS@_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ ppl_ at CLASS@_tag.
+*/
+/*! \interface ppl_ at CLASS@_const_iterator_tag
+ \brief Types and functions for iterating on the disjuncts of a
+ const ppl_ at CLASS@_tag.
+*/
+
+PPL_TYPE_DECLARATION(@CLASS at _iterator)
+PPL_TYPE_DECLARATION(@CLASS at _const_iterator)
+
+/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_new_ at CLASS@_iterator
+PPL_PROTO((ppl_ at CLASS@_iterator_t* pit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_new_ at CLASS@_const_iterator
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t* pit));
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_new_ at CLASS@_iterator_from_iterator
+PPL_PROTO((ppl_ at CLASS@_iterator_t* px,
+ ppl_const_ at CLASS@_iterator_t y));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_new_ at CLASS@_const_iterator_from_const_iterator
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t* px,
+ ppl_const_ at CLASS@_const_iterator_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t x,
+ ppl_const_ at CLASS@_iterator_t y));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t x,
+ ppl_const_ at CLASS@_const_iterator_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_ at BEGINEND@
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_ at BEGINEND@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+ ppl_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_delete_ at CLASS@_iterator
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_delete_ at CLASS@_const_iterator
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+PPL_PROTO((ppl_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_disjuncts
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at DISJUNCT@_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_dereference
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t ps,
+ ppl_const_ at DISJUNCT@_t* d));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_dereference
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t ps,
+ ppl_const_ at DISJUNCT@_t* d));
+
+')
diff --git a/interfaces/C/ppl_interface_generator_c_hh_files.m4 b/interfaces/C/ppl_interface_generator_c_hh_files.m4
new file mode 100644
index 0000000..36b95bd
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_hh_files.m4
@@ -0,0 +1,85 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_h
+dnl using the code in ppl_interface_generator_c_h_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_implementation_domains.hh << ___END_OF_FILE___
+/* C interface code: inclusion of all the domain-dependent declarations.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_divert(-1)
+
+m4_define(`m4_declaration_code', `dnl
+m4_ifelse(m4_class_group$1, product,
+ typedef Domain_Product<`'m4_class_body_1st$1|COMMA|`'m4_class_body_2nd$1 >::`'m4_class_kind$1 m4_interface_class`'$1;
+)
+m4_ifelse(m4_class_group$1, box,
+ DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_interface_class`'$1),
+ m4_class_group$1, product,
+ DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_interface_class`'$1),
+ DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_cplusplus_class`'$1)`'dnl
+)`'dnl
+')
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_implementation_domains.hh << ___END_OF_FILE___
+`#'include "ppl_c_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_`'m4_current_interface.hh << ___END_OF_FILE___
+/* C m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+m4_declaration_code($1)
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+dnl Generate the non-fixed part of the file.
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_procedure_generators.m4 b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
new file mode 100644
index 0000000..7b021ad
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
@@ -0,0 +1,54 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the C interface; this includes:
+dnl - the list in the imported file and any C specific procedures.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This is the main procedure for generating the C code.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list',
+ `m4_echo_unquoted(ppl_new_ at CLASS@_iterator +pointset_powerset,
+`m4_common_procedure_list',
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s +simple,
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@ +simple,
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+)
+')
diff --git a/interfaces/C/tests/Makefile.am b/interfaces/C/tests/Makefile.am
new file mode 100644
index 0000000..ac529aa
--- /dev/null
+++ b/interfaces/C/tests/Makefile.am
@@ -0,0 +1,141 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@ \
+ at debug_flag@
+
+if GCC
+
+if HOST_OS_MINGW
+
+# MinGW's <stdlib.h> cannot be compiled in c89 mode.
+AM_CFLAGS = -pedantic -std=gnu89
+
+else !HOST_OS_MINGW
+
+if ICC
+
+AM_CFLAGS = -std=c89
+
+else !ICC
+
+AM_CFLAGS = -pedantic -std=c89
+
+endif !ICC
+
+endif !HOST_OS_MINGW
+
+endif GCC
+
+check_LIBRARIES = libppl_c_tests.a
+
+libppl_c_tests_a_SOURCES = \
+ppl_c_test.cc
+
+# Dummy C++ source to cause C++ linking.
+nodist_EXTRA_libppl_c_tests_a_SOURCES = \
+dummy.cc
+
+libppl_c_tests_a_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+LDADD = \
+libppl_c_tests.a \
+$(top_builddir)/interfaces/C/libppl_c.la \
+ at extra_libraries@
+
+TESTS = \
+formatted_output \
+pip_test \
+watchdog1 \
+weightwatch1
+
+
+#
+# Sources for the tests
+#
+
+formatted_output_SOURCES = \
+formatted_output.c \
+print_to_buffer.h \
+print_to_buffer.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_formatted_output_SOURCES = \
+dummy.cc
+
+pip_test_SOURCES = \
+pip_test.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_pip_test_SOURCES = \
+dummy.cc
+
+watchdog1_SOURCES = \
+watchdog1.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_watchdog1_SOURCES = \
+dummy.cc
+
+weightwatch1_SOURCES = \
+weightwatch1.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_weightwatch1_SOURCES = \
+dummy.cc
+
+
+noinst_HEADERS = \
+ppl_c_test.h
+
+XFAIL_TESTS =
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+BUGS =
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
diff --git a/interfaces/C/tests/Makefile.in b/interfaces/C/tests/Makefile.in
new file mode 100644
index 0000000..fd2601c
--- /dev/null
+++ b/interfaces/C/tests/Makefile.in
@@ -0,0 +1,1304 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = formatted_output$(EXEEXT) pip_test$(EXEEXT) watchdog1$(EXEEXT) \
+ weightwatch1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = interfaces/C/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(noinst_HEADERS) $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libppl_c_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_c_tests_a_LIBADD =
+am_libppl_c_tests_a_OBJECTS = libppl_c_tests_a-ppl_c_test.$(OBJEXT)
+libppl_c_tests_a_OBJECTS = $(am_libppl_c_tests_a_OBJECTS)
+am__EXEEXT_1 = formatted_output$(EXEEXT) pip_test$(EXEEXT) \
+ watchdog1$(EXEEXT) weightwatch1$(EXEEXT)
+am__EXEEXT_2 =
+am_formatted_output_OBJECTS = formatted_output.$(OBJEXT) \
+ print_to_buffer.$(OBJEXT)
+formatted_output_OBJECTS = $(am_formatted_output_OBJECTS)
+formatted_output_LDADD = $(LDADD)
+formatted_output_DEPENDENCIES = libppl_c_tests.a \
+ $(top_builddir)/interfaces/C/libppl_c.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_pip_test_OBJECTS = pip_test.$(OBJEXT)
+pip_test_OBJECTS = $(am_pip_test_OBJECTS)
+pip_test_LDADD = $(LDADD)
+pip_test_DEPENDENCIES = libppl_c_tests.a \
+ $(top_builddir)/interfaces/C/libppl_c.la
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = libppl_c_tests.a \
+ $(top_builddir)/interfaces/C/libppl_c.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = libppl_c_tests.a \
+ $(top_builddir)/interfaces/C/libppl_c.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libppl_c_tests_a_SOURCES) \
+ $(nodist_EXTRA_libppl_c_tests_a_SOURCES) \
+ $(formatted_output_SOURCES) \
+ $(nodist_EXTRA_formatted_output_SOURCES) $(pip_test_SOURCES) \
+ $(nodist_EXTRA_pip_test_SOURCES) $(watchdog1_SOURCES) \
+ $(nodist_EXTRA_watchdog1_SOURCES) $(weightwatch1_SOURCES) \
+ $(nodist_EXTRA_weightwatch1_SOURCES)
+DIST_SOURCES = $(libppl_c_tests_a_SOURCES) $(formatted_output_SOURCES) \
+ $(pip_test_SOURCES) $(watchdog1_SOURCES) \
+ $(weightwatch1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@ \
+ at debug_flag@
+
+ at GCC_TRUE@@HOST_OS_MINGW_FALSE@@ICC_FALSE at AM_CFLAGS = -pedantic -std=c89
+ at GCC_TRUE@@HOST_OS_MINGW_FALSE@@ICC_TRUE at AM_CFLAGS = -std=c89
+
+# MinGW's <stdlib.h> cannot be compiled in c89 mode.
+ at GCC_TRUE@@HOST_OS_MINGW_TRUE at AM_CFLAGS = -pedantic -std=gnu89
+check_LIBRARIES = libppl_c_tests.a
+libppl_c_tests_a_SOURCES = \
+ppl_c_test.cc
+
+
+# Dummy C++ source to cause C++ linking.
+nodist_EXTRA_libppl_c_tests_a_SOURCES = \
+dummy.cc
+
+libppl_c_tests_a_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+LDADD = \
+libppl_c_tests.a \
+$(top_builddir)/interfaces/C/libppl_c.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+formatted_output_SOURCES = \
+formatted_output.c \
+print_to_buffer.h \
+print_to_buffer.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_formatted_output_SOURCES = \
+dummy.cc
+
+pip_test_SOURCES = \
+pip_test.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_pip_test_SOURCES = \
+dummy.cc
+
+watchdog1_SOURCES = \
+watchdog1.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_watchdog1_SOURCES = \
+dummy.cc
+
+weightwatch1_SOURCES = \
+weightwatch1.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_weightwatch1_SOURCES = \
+dummy.cc
+
+noinst_HEADERS = \
+ppl_c_test.h
+
+BUGS =
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/C/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkLIBRARIES:
+ -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+
+libppl_c_tests.a: $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_DEPENDENCIES) $(EXTRA_libppl_c_tests_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libppl_c_tests.a
+ $(AM_V_AR)$(libppl_c_tests_a_AR) libppl_c_tests.a $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libppl_c_tests.a
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+formatted_output$(EXEEXT): $(formatted_output_OBJECTS) $(formatted_output_DEPENDENCIES) $(EXTRA_formatted_output_DEPENDENCIES)
+ @rm -f formatted_output$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(formatted_output_OBJECTS) $(formatted_output_LDADD) $(LIBS)
+
+pip_test$(EXEEXT): $(pip_test_OBJECTS) $(pip_test_DEPENDENCIES) $(EXTRA_pip_test_DEPENDENCIES)
+ @rm -f pip_test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pip_test_OBJECTS) $(pip_test_LDADD) $(LIBS)
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES)
+ @rm -f watchdog1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES)
+ @rm -f weightwatch1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/formatted_output.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libppl_c_tests_a-dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pip_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/print_to_buffer.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+libppl_c_tests_a-ppl_c_test.o: ppl_c_test.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-ppl_c_test.o -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo -c -o libppl_c_tests_a-ppl_c_test.o `test -f 'ppl_c_test.cc' || echo '$(srcdir)/'`ppl_c_test.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-ppl_c_test.o `test -f 'ppl_c_test.cc' || echo '$(srcdir)/'`ppl_c_test.cc
+
+libppl_c_tests_a-ppl_c_test.obj: ppl_c_test.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-ppl_c_test.obj -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo -c -o libppl_c_tests_a-ppl_c_test.obj `if test -f 'ppl_c_test.cc'; then $(CYGPATH_W) 'ppl_c_test.cc'; else $(CYGPATH_W) '$(srcdir)/ppl_c_test.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-ppl_c_test.obj `if test -f 'ppl_c_test.cc'; then $(CYGPATH_W) 'ppl_c_test.cc'; else $(CYGPATH_W) '$(srcdir)/ppl_c_test.cc'; fi`
+
+libppl_c_tests_a-dummy.o: dummy.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-dummy.o -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-dummy.Tpo -c -o libppl_c_tests_a-dummy.o `test -f 'dummy.cc' || echo '$(srcdir)/'`dummy.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dummy.cc' object='libppl_c_tests_a-dummy.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-dummy.o `test -f 'dummy.cc' || echo '$(srcdir)/'`dummy.cc
+
+libppl_c_tests_a-dummy.obj: dummy.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-dummy.obj -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-dummy.Tpo -c -o libppl_c_tests_a-dummy.obj `if test -f 'dummy.cc'; then $(CYGPATH_W) 'dummy.cc'; else $(CYGPATH_W) '$(srcdir)/dummy.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dummy.cc' object='libppl_c_tests_a-dummy.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-dummy.obj `if test -f 'dummy.cc'; then $(CYGPATH_W) 'dummy.cc'; else $(CYGPATH_W) '$(srcdir)/dummy.cc'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_LIBRARIES) $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+formatted_output.log: formatted_output$(EXEEXT)
+ @p='formatted_output$(EXEEXT)'; \
+ b='formatted_output'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+pip_test.log: pip_test$(EXEEXT)
+ @p='pip_test$(EXEEXT)'; \
+ b='pip_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+watchdog1.log: watchdog1$(EXEEXT)
+ @p='watchdog1$(EXEEXT)'; \
+ b='watchdog1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+ @p='weightwatch1$(EXEEXT)'; \
+ b='weightwatch1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+ uninstall-am
+
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/C/tests/formatted_output.c b/interfaces/C/tests/formatted_output.c
new file mode 100644
index 0000000..34ee030
--- /dev/null
+++ b/interfaces/C/tests/formatted_output.c
@@ -0,0 +1,64 @@
+/* Test the use of C++ output facilities from C code.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+
+#include "print_to_buffer.h"
+#include <stdio.h>
+
+#define DIMENSION 100
+
+int
+main() {
+ int i;
+ mpz_t z;
+ ppl_Coefficient_t coeff;
+ ppl_Linear_Expression_t le;
+ ppl_Constraint_t c;
+ ppl_Constraint_System_t cs;
+ char* p;
+
+ mpz_init_set_si(z, 1);
+ ppl_initialize();
+ ppl_new_Coefficient(&coeff);
+ ppl_assign_Coefficient_from_mpz_t(coeff, z);
+ ppl_new_Constraint_System(&cs);
+ for (i = 0; i < DIMENSION; ++i) {
+ ppl_new_Linear_Expression_with_dimension(&le, DIMENSION);
+ ppl_Linear_Expression_add_to_coefficient(le, i, coeff);
+ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+ ppl_Constraint_System_insert_Constraint(cs, c);
+ ppl_delete_Constraint(c);
+ ppl_delete_Linear_Expression(le);
+ }
+ p = print_ppl_Constraint_System_to_buffer(cs, 4, 64, 64);
+ if (check_noisy()) {
+ if (p == 0)
+ printf("print_ppl_Constraint_System_to_buffer() returned NULL!\n");
+ else
+ printf(" %s\n", p);
+ }
+ ppl_delete_Constraint_System(cs);
+ ppl_finalize();
+ return 0;
+}
diff --git a/interfaces/C/tests/pip_test.c b/interfaces/C/tests/pip_test.c
new file mode 100644
index 0000000..6d72200
--- /dev/null
+++ b/interfaces/C/tests/pip_test.c
@@ -0,0 +1,272 @@
+/* Test the use of the PPL PIP solver from C code.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+ (void) ppl_finalize();
+ exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+ va_list ap;
+ fprintf(stderr, "%s: ", program_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+ const char* description) {
+ fatal("PPL error code %d: %s", code, description);
+}
+
+static void
+display_solution_i(ppl_const_PIP_Tree_Node_t node,
+ ppl_dimension_type n_vars,
+ ppl_dimension_type n_params,
+ const ppl_dimension_type vars[],
+ const ppl_dimension_type parameters[],
+ int indent) {
+ if (!node) {
+ /* A null pointer indicates the polyhedron is empty. */
+ printf("%*s_|_\n", indent*2, "");
+ }
+ else {
+ ppl_dimension_type space_dimension = n_vars + n_params;
+ ppl_dimension_type new_params;
+ ppl_const_Constraint_System_t constraints;
+ ppl_const_PIP_Decision_Node_t dn;
+ int constraints_empty;
+ ppl_PIP_Tree_Node_number_of_artificials(node, &new_params);
+ if (new_params > 0) {
+ /* Display the artificial parameters. */
+ ppl_Artificial_Parameter_Sequence_const_iterator_t i, i_end;
+ ppl_new_Artificial_Parameter_Sequence_const_iterator(&i);
+ ppl_new_Artificial_Parameter_Sequence_const_iterator(&i_end);
+ ppl_PIP_Tree_Node_begin(node, i);
+ ppl_PIP_Tree_Node_end(node, i_end);
+ while (!ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+ (i,i_end)) {
+ ppl_const_Artificial_Parameter_t ap;
+ ppl_Artificial_Parameter_Sequence_const_iterator_dereference(i, &ap);
+ printf("%*sParameter ", indent*2, "");
+ ppl_io_print_variable(space_dimension++);
+ printf(" = ");
+ ppl_io_print_Artificial_Parameter(ap);
+ printf("\n");
+ ppl_Artificial_Parameter_Sequence_const_iterator_increment(i);
+ }
+ ppl_delete_Artificial_Parameter_Sequence_const_iterator(i_end);
+ ppl_delete_Artificial_Parameter_Sequence_const_iterator(i);
+ }
+
+ ppl_PIP_Tree_Node_get_constraints(node, &constraints);
+ constraints_empty = ppl_Constraint_System_empty(constraints);
+ if (!constraints_empty) {
+ /* Display the constraints on the parameters. */
+ int notfirst = 0;
+ ppl_Constraint_System_const_iterator_t end, i;
+ ppl_new_Constraint_System_const_iterator(&i);
+ ppl_new_Constraint_System_const_iterator(&end);
+ ppl_Constraint_System_begin(constraints, i);
+ ppl_Constraint_System_end(constraints, end);
+ printf("%*sif ", indent*2, "");
+ for (; !ppl_Constraint_System_const_iterator_equal_test(i,end);
+ ppl_Constraint_System_const_iterator_increment(i)) {
+ ppl_const_Constraint_t c;
+ if (notfirst)
+ printf(" and ");
+ ppl_Constraint_System_const_iterator_dereference(i, &c);
+ ppl_io_print_Constraint(c);
+ notfirst = 1;
+ }
+ printf(" then\n");
+ }
+ ppl_PIP_Tree_Node_as_decision(node, &dn);
+ if (dn) {
+ /* The node is a decision Node: display the children nodes. */
+ ppl_const_PIP_Tree_Node_t child;
+ ppl_PIP_Decision_Node_get_child_node(dn, 1, &child);
+ display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+ printf("%*selse\n", indent*2, "");
+ ppl_PIP_Decision_Node_get_child_node(dn, 0, &child);
+ display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+ }
+ else {
+ /* The node is a solution Node: display the expression of the vars. */
+ int notfirst = 0;
+ ppl_const_PIP_Solution_Node_t sn;
+ ppl_dimension_type i;
+ ppl_const_Linear_Expression_t le;
+ ppl_PIP_Tree_Node_as_solution(node, &sn);
+ printf("%*s{", indent*2+(constraints_empty?0:2), "");
+ for (i=0; i<n_vars; ++i) {
+ if (notfirst)
+ printf(" ; ");
+ ppl_PIP_Solution_Node_get_parametric_values(sn, vars[i], &le);
+ ppl_io_print_Linear_Expression(le);
+ notfirst = 1;
+ }
+ printf("}\n");
+ if (!constraints_empty)
+ printf("%*selse\n%*s_|_\n", indent*2, "", indent*2+2, "");
+ }
+ }
+}
+
+static void
+display_solution(ppl_const_PIP_Tree_Node_t node,
+ ppl_dimension_type n_vars,
+ ppl_dimension_type n_params,
+ const ppl_dimension_type params[]) {
+ ppl_dimension_type* vars;
+ ppl_dimension_type i, j, k, dim;
+ vars = malloc(n_vars*sizeof(ppl_dimension_type));
+ dim = n_vars+n_params;
+
+ /* Construct the array of variable space indices. This requires the
+ params array to be sorted in ascending order. */
+ for (i = 0, j = 0, k = 0; i < dim; ++i) {
+ if (k == n_params || i < params[k])
+ vars[j++] = i;
+ else
+ ++k;
+ }
+ display_solution_i(node, n_vars, n_params, vars, params, 0);
+ free(vars);
+}
+
+#define N_VARS 2
+#define N_PARAMETERS 2
+#define N_CONSTRAINTS 4
+
+int
+main(int argc, char **argv) {
+ ppl_PIP_Problem_t pip;
+ ppl_Constraint_t ct;
+ ppl_Coefficient_t c;
+ ppl_Linear_Expression_t le;
+ ppl_dimension_type i, j;
+ mpz_t mpc;
+ int ok;
+ size_t sz = 0;
+
+ static ppl_dimension_type parameter_dim[N_PARAMETERS];
+
+ static int coef[N_CONSTRAINTS][N_VARS+N_PARAMETERS+1] = {
+ { 2, 3, 0, 0, -8 },
+ { 4, -1, 0, 0, -4 },
+ { 0, -1, 0, 1, 0 },
+ { -1, 0, 1, 0, 0 },
+ };
+
+ program_name = argv[0];
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", program_name);
+ exit(1);
+ }
+
+ if (ppl_initialize() < 0)
+ fatal("cannot initialize the Parma Polyhedra Library");
+
+ if (ppl_set_error_handler(error_handler) < 0)
+ fatal("cannot install the custom error handler");
+
+ mpz_init(mpc);
+
+ /* At least 32-bit coefficients are needed. */
+ if (ppl_Coefficient_max(mpc) > 0 && mpz_fits_sshort_p(mpc)) {
+ mpz_clear(mpc);
+ ppl_finalize();
+ return 0;
+ }
+
+ for (i = 0; i < N_PARAMETERS; ++i)
+ parameter_dim[i] = i + N_VARS;
+
+ ppl_new_PIP_Problem_from_space_dimension(&pip, N_VARS+N_PARAMETERS);
+ ppl_PIP_Problem_add_to_parameter_space_dimensions(pip, parameter_dim,
+ N_PARAMETERS);
+ ppl_new_Coefficient(&c);
+ for (i = 0; i < N_CONSTRAINTS; ++i) {
+ ppl_new_Linear_Expression(&le);
+ for (j = 0; j < N_VARS+N_PARAMETERS; ++j) {
+ mpz_set_si(mpc, coef[i][j]);
+ ppl_assign_Coefficient_from_mpz_t(c, mpc);
+ ppl_Linear_Expression_add_to_coefficient(le, j, c);
+ }
+ mpz_set_si(mpc, coef[i][j]);
+ ppl_assign_Coefficient_from_mpz_t(c, mpc);
+ ppl_Linear_Expression_add_to_inhomogeneous(le, c);
+ ppl_new_Constraint(&ct, le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+ ppl_PIP_Problem_add_constraint(pip, ct);
+ ppl_delete_Linear_Expression(le);
+ }
+ ppl_delete_Coefficient(c);
+ mpz_clear(mpc);
+
+ ppl_PIP_Problem_total_memory_in_bytes(pip, &sz);
+ ppl_PIP_Problem_external_memory_in_bytes(pip, &sz);
+
+ ok = (ppl_PIP_Problem_solve(pip) == PPL_PIP_PROBLEM_STATUS_OPTIMIZED);
+ if (ok) {
+ ppl_dimension_type dim;
+ ppl_const_PIP_Tree_Node_t solution;
+ ppl_PIP_Problem_t pip0;
+ ppl_Constraint_System_t constraints;
+ ppl_Constraint_System_const_iterator_t begin, end;
+
+ ppl_PIP_Problem_space_dimension(pip, &dim);
+ ppl_PIP_Problem_solution(pip, &solution);
+ if (check_noisy() || check_very_noisy())
+ display_solution(solution, N_VARS, N_PARAMETERS, parameter_dim);
+ ppl_new_Constraint_System_const_iterator(&begin);
+ ppl_new_Constraint_System_const_iterator(&end);
+ ppl_new_Constraint_System_from_Constraint(&constraints, ct);
+ ppl_Constraint_System_begin(constraints, begin);
+ ppl_Constraint_System_end(constraints, end);
+ ppl_new_PIP_Problem_from_constraints(&pip0, N_VARS+N_PARAMETERS,
+ begin, end, N_PARAMETERS,
+ parameter_dim);
+ ok = ppl_PIP_Problem_OK(pip0);
+ ppl_delete_Constraint(ct);
+ ppl_delete_Constraint_System(constraints);
+ }
+
+ ppl_delete_PIP_Problem(pip);
+ ppl_finalize();
+ return ok ? 0 : 1;
+}
diff --git a/interfaces/C/tests/ppl_c_test.cc b/interfaces/C/tests/ppl_c_test.cc
new file mode 100644
index 0000000..759208d
--- /dev/null
+++ b/interfaces/C/tests/ppl_c_test.cc
@@ -0,0 +1,71 @@
+/* Implementation of utility functions used in test programs
+ of the C interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+// The following inclusion of <cstdio> prior to "ppl_c_test.h" is to
+// work around a bug whereby some versions of <stdio.h> do not obey
+// clause D.5.2 of the C++ standard: "Each C header, whose name has
+// the form name.h, behaves as if each name placed in the Standard
+// library namespace by the corresponding cname header is also placed
+// within the namespace scope of the namespace std and is followed by
+// an explicit using-declaration (7.3.3)." By including <cstdio>
+// prior to "ppl_c_test.h" we ensure std::FILE is defined at the time
+// when "ppl_c.h" will include <gmp.h>.
+#include <cstdio>
+
+#include "ppl_c_test.h"
+#include <cstdlib>
+
+namespace {
+
+static int
+check_noisy_variable(const char* environment_variable) {
+#if PPL_HAVE_DECL_GETENV
+ return getenv(environment_variable) != 0;
+#else
+#if NOISY
+ if (strcmp(environment_variable, "PPL_NOISY_TESTS") == 0)
+ return 1;
+#endif
+#if VERY_NOISY
+ if (strcmp(environment_variable, "PPL_VERY_NOISY_TESTS") == 0)
+ return 1;
+#endif
+ return 0;
+#endif
+}
+
+} // namespace
+
+int
+check_noisy() {
+ return check_noisy_variable("PPL_NOISY_TESTS");
+}
+
+int
+check_very_noisy() {
+ return check_noisy_variable("PPL_VERY_NOISY_TESTS");
+}
+
diff --git a/interfaces/C/tests/ppl_c_test.h b/interfaces/C/tests/ppl_c_test.h
new file mode 100644
index 0000000..b6bd8af
--- /dev/null
+++ b/interfaces/C/tests/ppl_c_test.h
@@ -0,0 +1,41 @@
+/* Header file for C test programs.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_test_h
+#define PPL_ppl_c_test_h 1
+
+#include "ppl_c.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int check_noisy(void);
+
+int check_very_noisy(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !defined(PPL_ppl_c_test_h) */
diff --git a/interfaces/C/tests/print_to_buffer.c b/interfaces/C/tests/print_to_buffer.c
new file mode 100644
index 0000000..88dde25
--- /dev/null
+++ b/interfaces/C/tests/print_to_buffer.c
@@ -0,0 +1,68 @@
+/* Definitions of print_ppl_*_to_buffer() functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c.h"
+#include "print_to_buffer.h"
+#include <stdlib.h>
+#include <string.h>
+
+#define DEFINE_PRINT_TO_BUFFER(Type) \
+char* \
+ print_ppl_##Type##_to_buffer(ppl_const_##Type##_t p, \
+ unsigned indent_depth, \
+ unsigned preferred_first_line_length, \
+ unsigned preferred_line_length) { \
+ char *buf, *ret; \
+ int r = ppl_io_asprint_##Type(&buf, p); \
+ if (r != 0) \
+ return 0; \
+ ret = ppl_io_wrap_string(buf, indent_depth, \
+ preferred_first_line_length, \
+ preferred_line_length); \
+ free(buf); \
+ return ret; \
+}
+
+DEFINE_PRINT_TO_BUFFER(Coefficient)
+
+DEFINE_PRINT_TO_BUFFER(Linear_Expression)
+
+DEFINE_PRINT_TO_BUFFER(Constraint)
+
+DEFINE_PRINT_TO_BUFFER(Constraint_System)
+
+DEFINE_PRINT_TO_BUFFER(Generator)
+
+DEFINE_PRINT_TO_BUFFER(Generator_System)
+
+DEFINE_PRINT_TO_BUFFER(Congruence)
+
+DEFINE_PRINT_TO_BUFFER(Congruence_System)
+
+DEFINE_PRINT_TO_BUFFER(Grid_Generator)
+
+DEFINE_PRINT_TO_BUFFER(Grid_Generator_System)
+
+DEFINE_PRINT_TO_BUFFER(MIP_Problem)
+
+DEFINE_PRINT_TO_BUFFER(PIP_Problem)
diff --git a/interfaces/C/tests/print_to_buffer.h b/interfaces/C/tests/print_to_buffer.h
new file mode 100644
index 0000000..15512ad
--- /dev/null
+++ b/interfaces/C/tests/print_to_buffer.h
@@ -0,0 +1,82 @@
+/* Declarations of print_ppl_*_to_buffer() functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_print_to_buffer_h
+#define PPL_print_to_buffer_h 1
+
+#include "ppl_c.h"
+
+/*
+ Returns a buffer allocated with malloc() containing a printable
+ representation of the PPL object referenced by `p', where each
+ newline is followed by `indent_depth' blank spaces and the preferred
+ maximum length of the first and the following lines are given by
+ `preferred_first_line_length' and `preferred_line_length',
+ respectively.
+*/
+#define DECLARE_PRINT_TO_BUFFER(Type) \
+char* \
+print_ppl_##Type##_to_buffer(ppl_const_##Type##_t p, \
+ unsigned indent_depth, \
+ unsigned preferred_first_line_length, \
+ unsigned preferred_line_length);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DECLARE_PRINT_TO_BUFFER(Coefficient)
+
+DECLARE_PRINT_TO_BUFFER(Linear_Expression)
+
+DECLARE_PRINT_TO_BUFFER(Constraint)
+
+DECLARE_PRINT_TO_BUFFER(Constraint_System)
+
+DECLARE_PRINT_TO_BUFFER(Constraint_System_const_iterator)
+
+DECLARE_PRINT_TO_BUFFER(Generator)
+
+DECLARE_PRINT_TO_BUFFER(Generator_System)
+
+DECLARE_PRINT_TO_BUFFER(Generator_System_const_iterator)
+
+DECLARE_PRINT_TO_BUFFER(Congruence)
+
+DECLARE_PRINT_TO_BUFFER(Congruence_System)
+
+DECLARE_PRINT_TO_BUFFER(Grid_Generator)
+
+DECLARE_PRINT_TO_BUFFER(Grid_Generator_System)
+
+DECLARE_PRINT_TO_BUFFER(MIP_Problem)
+
+DECLARE_PRINT_TO_BUFFER(PIP_Problem)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef DECLARE_PRINT_TO_BUFFER
+
+#endif /* !defined(PPL_print_to_buffer_h) */
diff --git a/interfaces/C/tests/watchdog1.c b/interfaces/C/tests/watchdog1.c
new file mode 100644
index 0000000..fd429e8
--- /dev/null
+++ b/interfaces/C/tests/watchdog1.c
@@ -0,0 +1,149 @@
+/* Test the timeout facility of the PPL C interface library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+ (void) ppl_finalize();
+ exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+ va_list ap;
+ fprintf(stderr, "%s: ", program_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+ const char* description) {
+ if (check_noisy() || check_very_noisy())
+ fprintf(stderr, "PPL error code %d: %s\n", code, description);
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ /* If Watchdog objects are not supported, a logic error will occur:
+ this is normal. */
+ if (code == PPL_ERROR_LOGIC_ERROR)
+ my_exit(0);
+#endif /* !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED */
+}
+
+void
+open_hypercube(int dimension, ppl_Polyhedron_t ph) {
+ int i;
+ mpz_t z_one;
+ mpz_t z_minus_one;
+ ppl_Coefficient_t coeff_one;
+ ppl_Coefficient_t coeff_minus_one;
+ ppl_Linear_Expression_t le;
+ ppl_Constraint_t c;
+ ppl_Constraint_System_t cs;
+
+ mpz_init_set_si(z_one, 1);
+ mpz_init_set_si(z_minus_one, -1);
+ ppl_new_Coefficient(&coeff_one);
+ ppl_assign_Coefficient_from_mpz_t(coeff_one, z_one);
+ ppl_new_Coefficient(&coeff_minus_one);
+ ppl_assign_Coefficient_from_mpz_t(coeff_minus_one, z_minus_one);
+ ppl_new_Linear_Expression_with_dimension(&le, dimension);
+ ppl_new_Constraint_System(&cs);
+ for (i = 0; i < dimension; ++i) {
+ ppl_Linear_Expression_add_to_coefficient(le, i, coeff_one);
+ /* Variable(i) > 0 */
+ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_THAN);
+ ppl_Constraint_System_insert_Constraint(cs, c);
+ ppl_delete_Constraint(c);
+ /* Variable(i) < 1 */
+ ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_minus_one);
+ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_LESS_THAN);
+ ppl_Constraint_System_insert_Constraint(cs, c);
+ ppl_delete_Constraint(c);
+ /* Zero `le' */
+ ppl_Linear_Expression_add_to_coefficient(le, i, coeff_minus_one);
+ ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_one);
+ }
+ ppl_Polyhedron_add_constraints(ph, cs);
+ ppl_delete_Constraint_System(cs);
+ ppl_delete_Linear_Expression(le);
+ ppl_delete_Coefficient(coeff_minus_one);
+ ppl_delete_Coefficient(coeff_one);
+ mpz_clear(z_minus_one);
+ mpz_clear(z_one);
+}
+
+void
+timed_compute_open_hypercube_generators(int csecs, int max_dimension) {
+ int i;
+ int result;
+ ppl_const_Generator_System_t gs;
+ ppl_Polyhedron_t ph;
+
+ for (i = 0; i <= max_dimension; ++i) {
+ ppl_new_NNC_Polyhedron_from_space_dimension(&ph, i, 0);
+ open_hypercube(i, ph);
+ ppl_set_timeout(csecs);
+ result = ppl_Polyhedron_get_generators(ph, &gs);
+ ppl_reset_timeout();
+ ppl_delete_Polyhedron(ph);
+ if (result == PPL_TIMEOUT_EXCEPTION)
+ /* Timeout expired */
+ return;
+ else if (result != 0)
+ /* Unexpected error */
+ exit(1);
+ }
+ /* Should not reach this point */
+ exit(1);
+}
+
+int
+main(int argc, char **argv) {
+ program_name = argv[0];
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", program_name);
+ exit(1);
+ }
+
+ if (ppl_initialize() < 0)
+ fatal("cannot initialize the Parma Polyhedra Library");
+
+ if (ppl_set_error_handler(error_handler) < 0)
+ fatal("cannot install the custom error handler");
+
+ timed_compute_open_hypercube_generators(200, 20);
+
+ ppl_finalize();
+ return 0;
+}
+
diff --git a/interfaces/C/tests/weightwatch1.c b/interfaces/C/tests/weightwatch1.c
new file mode 100644
index 0000000..92cfa69
--- /dev/null
+++ b/interfaces/C/tests/weightwatch1.c
@@ -0,0 +1,144 @@
+/* Test the deterministic timeout facility of the PPL C interface library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+ (void) ppl_finalize();
+ exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+ va_list ap;
+ fprintf(stderr, "%s: ", program_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+ const char* description) {
+ if (check_noisy() || check_very_noisy())
+ fprintf(stderr, "PPL error code %d: %s\n", code, description);
+}
+
+void
+open_hypercube(int dimension, ppl_Polyhedron_t ph) {
+ int i;
+ mpz_t z_one;
+ mpz_t z_minus_one;
+ ppl_Coefficient_t coeff_one;
+ ppl_Coefficient_t coeff_minus_one;
+ ppl_Linear_Expression_t le;
+ ppl_Constraint_t c;
+ ppl_Constraint_System_t cs;
+
+ mpz_init_set_si(z_one, 1);
+ mpz_init_set_si(z_minus_one, -1);
+ ppl_new_Coefficient(&coeff_one);
+ ppl_assign_Coefficient_from_mpz_t(coeff_one, z_one);
+ ppl_new_Coefficient(&coeff_minus_one);
+ ppl_assign_Coefficient_from_mpz_t(coeff_minus_one, z_minus_one);
+ ppl_new_Linear_Expression_with_dimension(&le, dimension);
+ ppl_new_Constraint_System(&cs);
+ for (i = 0; i < dimension; ++i) {
+ ppl_Linear_Expression_add_to_coefficient(le, i, coeff_one);
+ /* Variable(i) > 0 */
+ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_THAN);
+ ppl_Constraint_System_insert_Constraint(cs, c);
+ ppl_delete_Constraint(c);
+ /* Variable(i) < 1 */
+ ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_minus_one);
+ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_LESS_THAN);
+ ppl_Constraint_System_insert_Constraint(cs, c);
+ ppl_delete_Constraint(c);
+ /* Zero `le' */
+ ppl_Linear_Expression_add_to_coefficient(le, i, coeff_minus_one);
+ ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_one);
+ }
+ ppl_Polyhedron_add_constraints(ph, cs);
+ ppl_delete_Constraint_System(cs);
+ ppl_delete_Linear_Expression(le);
+ ppl_delete_Coefficient(coeff_minus_one);
+ ppl_delete_Coefficient(coeff_one);
+ mpz_clear(z_minus_one);
+ mpz_clear(z_one);
+}
+
+void
+weighted_compute_open_hypercube_generators(unsigned long weight,
+ int max_dimension) {
+ int i;
+ int result;
+ ppl_const_Generator_System_t gs;
+ ppl_Polyhedron_t ph;
+
+ for (i = 0; i <= max_dimension; ++i) {
+ ppl_new_NNC_Polyhedron_from_space_dimension(&ph, i, 0);
+ open_hypercube(i, ph);
+ ppl_set_deterministic_timeout(weight, 0);
+ result = ppl_Polyhedron_get_generators(ph, &gs);
+ ppl_reset_deterministic_timeout();
+ ppl_delete_Polyhedron(ph);
+ if (result == PPL_TIMEOUT_EXCEPTION)
+ /* Deterministic timeout expired */
+ return;
+ else if (result != 0)
+ /* Unexpected error */
+ exit(1);
+ }
+ /* Should not reach this point */
+ exit(1);
+}
+
+int
+main(int argc, char **argv) {
+ program_name = argv[0];
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", program_name);
+ exit(1);
+ }
+
+ if (ppl_initialize() < 0)
+ fatal("cannot initialize the Parma Polyhedra Library");
+
+ if (ppl_set_error_handler(error_handler) < 0)
+ fatal("cannot install the custom error handler");
+
+ weighted_compute_open_hypercube_generators(1000, 20);
+
+ ppl_finalize();
+ return 0;
+}
+
diff --git a/interfaces/Java/Makefile.am b/interfaces/Java/Makefile.am
new file mode 100644
index 0000000..204bafe
--- /dev/null
+++ b/interfaces/Java/Makefile.am
@@ -0,0 +1,46 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = parma_polyhedra_library jni . tests
+
+EXTRA_DIST = \
+ppl_interface_generator_java_procedure_generators.m4 \
+README.java
+
+interface_generator_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_java_procedure_generators.m4
+
+jardir = $(pkglibdir)
+jar_DATA = ppl_java.jar
+
+ppl_java.jar: parma_polyhedra_library/java_classes.stamp
+ $(JAR) cf ppl_java.jar parma_polyhedra_library/*.class
+
+CLEANFILES = ppl_java.jar
+
+parma_polyhedra_library/java_classes.stamp:
+ $(MAKE) $(AM_MAKEFLAGS) -C parma_polyhedra_library java_classes.stamp
diff --git a/interfaces/Java/Makefile.in b/interfaces/Java/Makefile.in
new file mode 100644
index 0000000..1af349b
--- /dev/null
+++ b/interfaces/Java/Makefile.in
@@ -0,0 +1,801 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(jardir)"
+DATA = $(jar_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = parma_polyhedra_library jni . tests
+EXTRA_DIST = \
+ppl_interface_generator_java_procedure_generators.m4 \
+README.java
+
+interface_generator_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_java_procedure_generators.m4
+
+jardir = $(pkglibdir)
+jar_DATA = ppl_java.jar
+CLEANFILES = ppl_java.jar
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Java/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-jarDATA: $(jar_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(jar_DATA)'; test -n "$(jardir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(jardir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(jardir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(jardir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(jardir)" || exit $$?; \
+ done
+
+uninstall-jarDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(jar_DATA)'; test -n "$(jardir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(jardir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(jardir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-jarDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-jarDATA
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-jarDATA \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-jarDATA
+
+
+ppl_java.jar: parma_polyhedra_library/java_classes.stamp
+ $(JAR) cf ppl_java.jar parma_polyhedra_library/*.class
+
+parma_polyhedra_library/java_classes.stamp:
+ $(MAKE) $(AM_MAKEFLAGS) -C parma_polyhedra_library java_classes.stamp
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/README.java b/interfaces/Java/README.java
new file mode 100644
index 0000000..48a6ee5
--- /dev/null
+++ b/interfaces/Java/README.java
@@ -0,0 +1,58 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Java interface of the Parma Polyhedra Library has been tested
+with both Sun's JDK 6 (http://java.sun.com/javase/downloads/)
+and the open-source OpenJDK 6 (http://openjdk.java.net/).
+
+The Java interface provides the `parma_polyhedra_library' package:
+after installing the Parma Polyhedra Library in <PPL prefix>,
+the ppl_java.jar JAR file and the JNI shared object will be installed
+in directory <PPL prefix>/<libdir>/ppl.
+
+The Java compilation command for `My_Test.java' should then be
+something like:
+
+$ javac -classpath .:<PPL prefix>/<libdir>/ppl/ppl_java.jar My_Test.java
+
+This will produce class file My_Test.class, which can then be executed
+by issuing a command like:
+
+$ java -classpath .:<PPL prefix>/<libdir>/ppl/ppl_java.jar My_Test
+
+Note that the source code in My_Test.java should take care of:
+
+a) Load the PPL interface library, by calling `System.load' and
+ passing the full path of the dynamic shared object. For instance,
+ on a Linux machine and assuming <PPL prefix>=/usr/local/, the call
+ will be something like:
+
+ System.load("/usr/local/lib/ppl/libppl_java.so");
+
+b) Make sure that only the intended version(s) of the library has been
+ loaded, e.g., by calling static method
+
+ Parma_Polyhedra_Library.version();
+
+c) Starting from PPL version 0.11, before calling any other method from
+ other PPL package classes, initialize the Java interface by calling
+ the static method
+
+ Parma_Polyhedra_Library.initialize_library();
+
+ When done using the library, finalize it by calling the static method
+
+ Parma_Polyhedra_Library.finalize_library();
+
+ After finalization no other method of the library may be used (except
+ for those in class Parma_Polyhedra_Library), unless the library
+ is re-initialized by calling initialize_library().
diff --git a/interfaces/Java/jni/Makefile.am b/interfaces/Java/jni/Makefile.am
new file mode 100644
index 0000000..33a9d0e
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.am
@@ -0,0 +1,205 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+interface_generator_files = \
+ppl_interface_generator_java_classes_cc_files.m4 \
+ppl_interface_generator_java_classes_cc_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files)
+
+if HOST_OS_MINGW
+
+JNI_DEFINE_OPTIONS = -D_JNI_IMPLEMENTATION_
+
+endif HOST_OS_MINGW
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/src \
+-I../parma_polyhedra_library \
+-I$(top_srcdir)/src \
+ at extra_includes@ @JNIFLAGS@ $(JNI_DEFINE_OPTIONS)
+
+BUILT_SOURCES = \
+ppl_java_implementation_domains.cc.stamp
+
+pkglib_LTLIBRARIES = libppl_java.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+if HOST_OS_DARWIN
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-avoid-version \
+-shrext .jnilib
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_MINGW
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version \
+-Wl,--kill-at
+
+else !HOST_OS_MINGW
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+endif !HOST_OS_MINGW
+
+endif !HOST_OS_DARWIN
+
+libppl_java_la_SOURCES = \
+ppl_java_common_defs.hh \
+ppl_java_common_inlines.hh \
+ppl_java_common.cc \
+ppl_java_globals.cc
+
+nodist_EXTRA_libppl_java_la_SOURCES = \
+ppl_java_Termination.cc \
+ppl_java_Int8_Box.cc \
+ppl_java_Int16_Box.cc \
+ppl_java_Int32_Box.cc \
+ppl_java_Int64_Box.cc \
+ppl_java_Uint8_Box.cc \
+ppl_java_Uint16_Box.cc \
+ppl_java_Uint32_Box.cc \
+ppl_java_Uint64_Box.cc \
+ppl_java_Float_Box.cc \
+ppl_java_Double_Box.cc \
+ppl_java_Long_Double_Box.cc \
+ppl_java_Rational_Box.cc \
+ppl_java_Z_Box.cc \
+ppl_java_BD_Shape_int8_t.cc \
+ppl_java_BD_Shape_int16_t.cc \
+ppl_java_BD_Shape_int32_t.cc \
+ppl_java_BD_Shape_int64_t.cc \
+ppl_java_BD_Shape_float.cc \
+ppl_java_BD_Shape_double.cc \
+ppl_java_BD_Shape_long_double.cc \
+ppl_java_BD_Shape_mpq_class.cc \
+ppl_java_BD_Shape_mpz_class.cc \
+ppl_java_Octagonal_Shape_int8_t.cc \
+ppl_java_Octagonal_Shape_int16_t.cc \
+ppl_java_Octagonal_Shape_int32_t.cc \
+ppl_java_Octagonal_Shape_int64_t.cc \
+ppl_java_Octagonal_Shape_float.cc \
+ppl_java_Octagonal_Shape_double.cc \
+ppl_java_Octagonal_Shape_long_double.cc \
+ppl_java_Octagonal_Shape_mpq_class.cc \
+ppl_java_Octagonal_Shape_mpz_class.cc \
+ppl_java_Polyhedron.cc \
+ppl_java_Grid.cc \
+ppl_java_Pointset_Powerset_Int8_Box.cc \
+ppl_java_Pointset_Powerset_Int16_Box.cc \
+ppl_java_Pointset_Powerset_Int32_Box.cc \
+ppl_java_Pointset_Powerset_Int64_Box.cc \
+ppl_java_Pointset_Powerset_Uint8_Box.cc \
+ppl_java_Pointset_Powerset_Uint16_Box.cc \
+ppl_java_Pointset_Powerset_Uint32_Box.cc \
+ppl_java_Pointset_Powerset_Uint64_Box.cc \
+ppl_java_Pointset_Powerset_Float_Box.cc \
+ppl_java_Pointset_Powerset_Double_Box.cc \
+ppl_java_Pointset_Powerset_Long_Double_Box.cc \
+ppl_java_Pointset_Powerset_Rational_Box.cc \
+ppl_java_Pointset_Powerset_Z_Box.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_float.cc \
+ppl_java_Pointset_Powerset_BD_Shape_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_C_Polyhedron.cc \
+ppl_java_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_java_Pointset_Powerset_Grid.cc \
+ppl_java_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_java_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_java_la_LIBADD = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_java_la_DEPENDENCIES = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@
+
+ppl_java_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_java_classes_cc_files.m4 \
+ > ppl_java_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_java_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_java_cc_blob
+ rm -f ppl_java_cc_blob
+ echo timestamp >$@
+
+CLEANFILES = \
+ppl_java_Termination.cc \
+ at required_instantiations_java_cxx_sources@ \
+ppl_java_implementation_domains.cc.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_java_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_java_la_SOURCES):
diff --git a/interfaces/Java/jni/Makefile.in b/interfaces/Java/jni/Makefile.in
new file mode 100644
index 0000000..fed5b4c
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.in
@@ -0,0 +1,1006 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/jni
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am_libppl_java_la_OBJECTS = ppl_java_common.lo ppl_java_globals.lo
+libppl_java_la_OBJECTS = $(am_libppl_java_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_java_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_java_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_java_la_SOURCES) \
+ $(nodist_EXTRA_libppl_java_la_SOURCES)
+DIST_SOURCES = $(libppl_java_la_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+interface_generator_files = \
+ppl_interface_generator_java_classes_cc_files.m4 \
+ppl_interface_generator_java_classes_cc_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files)
+
+ at HOST_OS_MINGW_TRUE@JNI_DEFINE_OPTIONS = -D_JNI_IMPLEMENTATION_
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/src \
+-I../parma_polyhedra_library \
+-I$(top_srcdir)/src \
+ at extra_includes@ @JNIFLAGS@ $(JNI_DEFINE_OPTIONS)
+
+BUILT_SOURCES = \
+ppl_java_implementation_domains.cc.stamp
+
+pkglib_LTLIBRARIES = libppl_java.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at -module \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at -avoid-version
+
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -module \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -avoid-version \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -Wl,--kill-at
+
+ at HOST_OS_DARWIN_TRUE@libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_TRUE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_TRUE@-avoid-version \
+ at HOST_OS_DARWIN_TRUE@-shrext .jnilib
+
+libppl_java_la_SOURCES = \
+ppl_java_common_defs.hh \
+ppl_java_common_inlines.hh \
+ppl_java_common.cc \
+ppl_java_globals.cc
+
+nodist_EXTRA_libppl_java_la_SOURCES = \
+ppl_java_Termination.cc \
+ppl_java_Int8_Box.cc \
+ppl_java_Int16_Box.cc \
+ppl_java_Int32_Box.cc \
+ppl_java_Int64_Box.cc \
+ppl_java_Uint8_Box.cc \
+ppl_java_Uint16_Box.cc \
+ppl_java_Uint32_Box.cc \
+ppl_java_Uint64_Box.cc \
+ppl_java_Float_Box.cc \
+ppl_java_Double_Box.cc \
+ppl_java_Long_Double_Box.cc \
+ppl_java_Rational_Box.cc \
+ppl_java_Z_Box.cc \
+ppl_java_BD_Shape_int8_t.cc \
+ppl_java_BD_Shape_int16_t.cc \
+ppl_java_BD_Shape_int32_t.cc \
+ppl_java_BD_Shape_int64_t.cc \
+ppl_java_BD_Shape_float.cc \
+ppl_java_BD_Shape_double.cc \
+ppl_java_BD_Shape_long_double.cc \
+ppl_java_BD_Shape_mpq_class.cc \
+ppl_java_BD_Shape_mpz_class.cc \
+ppl_java_Octagonal_Shape_int8_t.cc \
+ppl_java_Octagonal_Shape_int16_t.cc \
+ppl_java_Octagonal_Shape_int32_t.cc \
+ppl_java_Octagonal_Shape_int64_t.cc \
+ppl_java_Octagonal_Shape_float.cc \
+ppl_java_Octagonal_Shape_double.cc \
+ppl_java_Octagonal_Shape_long_double.cc \
+ppl_java_Octagonal_Shape_mpq_class.cc \
+ppl_java_Octagonal_Shape_mpz_class.cc \
+ppl_java_Polyhedron.cc \
+ppl_java_Grid.cc \
+ppl_java_Pointset_Powerset_Int8_Box.cc \
+ppl_java_Pointset_Powerset_Int16_Box.cc \
+ppl_java_Pointset_Powerset_Int32_Box.cc \
+ppl_java_Pointset_Powerset_Int64_Box.cc \
+ppl_java_Pointset_Powerset_Uint8_Box.cc \
+ppl_java_Pointset_Powerset_Uint16_Box.cc \
+ppl_java_Pointset_Powerset_Uint32_Box.cc \
+ppl_java_Pointset_Powerset_Uint64_Box.cc \
+ppl_java_Pointset_Powerset_Float_Box.cc \
+ppl_java_Pointset_Powerset_Double_Box.cc \
+ppl_java_Pointset_Powerset_Long_Double_Box.cc \
+ppl_java_Pointset_Powerset_Rational_Box.cc \
+ppl_java_Pointset_Powerset_Z_Box.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_float.cc \
+ppl_java_Pointset_Powerset_BD_Shape_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_C_Polyhedron.cc \
+ppl_java_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_java_Pointset_Powerset_Grid.cc \
+ppl_java_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_java_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_java_la_LIBADD = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_java_la_DEPENDENCIES = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@
+
+CLEANFILES = \
+ppl_java_Termination.cc \
+ at required_instantiations_java_cxx_sources@ \
+ppl_java_implementation_domains.cc.stamp
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/jni/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Java/jni/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+ }
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_java.la: $(libppl_java_la_OBJECTS) $(libppl_java_la_DEPENDENCIES) $(EXTRA_libppl_java_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_java_la_LINK) -rpath $(pkglibdir) $(libppl_java_la_OBJECTS) $(libppl_java_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Termination.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_globals.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+ for dir in "$(DESTDIR)$(pkglibdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkglibLTLIBRARIES
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pkglibLTLIBRARIES install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-pkglibLTLIBRARIES
+
+
+ppl_java_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_java_classes_cc_files.m4 \
+ > ppl_java_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_java_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_java_cc_blob
+ rm -f ppl_java_cc_blob
+ echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_java_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_java_la_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4 b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
new file mode 100644
index 0000000..875936e
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
@@ -0,0 +1,1607 @@
+m4_dnl -*- C++ -*-
+m4_define(`dnl', `m4_dnl')
+m4_divert(-1)
+This m4 file contains the code for generating ppl_java_<CLASS_NAME>.cc
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+#include "parma_polyhedra_library_ at CLASS@_Iterator.h"
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_build_1cpp_1object
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @CPP_CLASS@::iterator* y_ptr
+ = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_y));
+ @CPP_CLASS@::iterator* this_ptr
+ = new @CPP_CLASS@::iterator(*y_ptr);
+ set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_equals
+(JNIEnv* env, jobject j_this, jobject j_y) {
+ try {
+ @CPP_CLASS@::iterator* this_ptr
+ = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+ @CPP_CLASS@::iterator* y_ptr
+ = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_y));
+ return *this_ptr == *y_ptr;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _@BEGINEND at _1iterator
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ jclass j_it_class
+ = env->FindClass("parma_polyhedra_library/@TOPOLOGY@@CLASS at _Iterator");
+ CHECK_RESULT_ASSERT(env, j_it_class);
+ jmethodID j_it_ctr_id = env->GetMethodID(j_it_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_it_ctr_id);
+ jobject j_it = env->NewObject(j_it_class, j_it_ctr_id);
+ CHECK_RESULT_RETURN(env, j_it, 0);
+ @TOPOLOGY@@CPP_CLASS@::iterator* ppl_it
+ = new @TOPOLOGY@@CPP_CLASS@::iterator(this_ptr->@BEGINEND@());
+ set_ptr(env, j_it, ppl_it);
+ return j_it;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_free
+(JNIEnv* env, jobject j_this) try {
+ if (!is_java_marked(env, j_this)) {
+ @CPP_CLASS@::iterator* this_ptr
+ = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+ delete this_ptr;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+CATCH_ALL
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_finalize
+(JNIEnv* env, jobject j_this) try {
+ if (!is_java_marked(env, j_this)) {
+ @CPP_CLASS@::iterator* this_ptr
+ = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+ delete this_ptr;
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _1Iterator_@A_INCDEC@
+(JNIEnv* env, jobject j_this) try {
+ @TOPOLOGY@@CPP_CLASS@::iterator* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+ m4_ at INCDEC@_cpp_name()(*this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_increment_cpp_name', `++')
+m4_define(`m4_decrement_cpp_name', `--')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _1Iterator_get_1disjunct
+(JNIEnv* env, jobject j_this) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@::iterator* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+ jclass j_class = env->FindClass("parma_polyhedra_library/@DISJUNCT_TOPOLOGY@@DISJUNCT@");
+ CHECK_RESULT_ASSERT(env, j_class);
+ jmethodID j_ctr_id = env->GetMethodID(j_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id);
+ jobject j_obj = env->NewObject(j_class, j_ctr_id);
+ CHECK_RESULT_RETURN(env, j_obj, 0);
+ set_ptr(env, j_obj, &((*this_ptr)->pointset()), true);
+ return j_obj;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _drop_1disjunct
+(JNIEnv* env, jobject j_this, jobject j_it) try {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ @TOPOLOGY@@CPP_CLASS@::iterator& itr
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_it)));
+ itr = this_ptr->drop_disjunct(itr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _drop_1disjuncts
+(JNIEnv* env, jobject j_this, jobject j_first, jobject j_last) try {
+ @TOPOLOGY@@CPP_CLASS@::iterator* first_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_first));
+ @TOPOLOGY@@CPP_CLASS@::iterator* last_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_last));
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ this_ptr->drop_disjuncts(*first_ptr, *last_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _add_1disjunct
+(JNIEnv* env, jobject j_this, jobject j_d) try {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* d_ptr
+ = reinterpret_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(get_ptr(env, j_d));
+ this_ptr->add_disjunct(*d_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__JLparma_1polyhedra_1library_Degenerate_1Element_2
+(JNIEnv* env, jobject j_this, jlong j_dim, jobject j_degenerate_element) try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ jint j_degenerate_element_int
+ = env->CallIntMethod(j_degenerate_element,
+ cached_FMIDs.Degenerate_Element_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ @TOPOLOGY@@CPP_CLASS@* this_ptr;
+ switch (j_degenerate_element_int) {
+ case 0:
+ this_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, UNIVERSE);
+ break;
+ case 1:
+ this_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, EMPTY);
+ break;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ break;
+ }
+ set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND at _2
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @B_FRIEND@* y_ptr
+ = reinterpret_cast<@B_FRIEND@*>(get_ptr(env, j_y));
+ @TOPOLOGY@@CPP_CLASS@* this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr);
+ set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND at _2Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_complexity) try {
+ @B_FRIEND@* y_ptr
+ = reinterpret_cast<@B_FRIEND@*>(get_ptr(env, j_y));
+ jint j_complexity_int
+ = env->CallIntMethod(j_complexity,
+ cached_FMIDs.Complexity_Class_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ @TOPOLOGY@@CPP_CLASS@* this_ptr;
+ switch (j_complexity_int) {
+ case 0:
+ this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, POLYNOMIAL_COMPLEXITY);
+ break;
+ case 1:
+ this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, SIMPLEX_COMPLEXITY);
+ break;
+ case 2:
+ this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, ANY_COMPLEXITY);
+ break;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ break;
+ }
+ set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1!BUILD_REPRESENT at _1System_2
+(JNIEnv* env, jobject j_this, jobject j_iterable) try {
+ @!BUILD_REPRESENT at _System cs
+ = build_cxx_ at BUILD_REPRESENT@_system(env, j_iterable);
+ @TOPOLOGY@@CPP_CLASS@* this_ptr = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+ set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _@1UB_EXACT@
+(JNIEnv* env, jobject j_this, jobject j_y) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ @TOPOLOGY@@CPP_CLASS@* y_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_y));
+ return this_ptr->@UB_EXACT@(*y_ptr);
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _finalize
+(JNIEnv* env, jobject j_this) try {
+ if (!is_java_marked(env, j_this)) {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ delete this_ptr;
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _free
+(JNIEnv* env, jobject j_this) try {
+ if (!is_java_marked(env, j_this)) {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ delete this_ptr;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_swap
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ swap(*this_ptr, *y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1DIMENSION@
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return this_ptr->@DIMENSION@();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return build_java_ at CLASS_REPRESENT@_system(env, this_ptr->@CLASS_REPRESENT at s());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_minimized_1 at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return build_java_ at CLASS_REPRESENT@_system(env,
+ this_ptr->minimized_ at CLASS_REPRESENT@s());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_relation_1with__Lparma_1polyhedra_1library_ at 1!RELATION_REPRESENT at _2
+(JNIEnv* env, jobject j_this, jobject j_c) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @!RELATION_REPRESENT@ c = build_cxx_ at RELATION_REPRESENT@(env, j_c);
+ Poly_@!A_RELATION_REPRESENT at _Relation pcr = this_ptr->relation_with(c);
+ return build_java_poly_ at A_RELATION_REPRESENT@_relation(env, pcr);
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1HAS_PROPERTY@
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return this_ptr->@HAS_PROPERTY@();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1SIMPLIFY@
+(JNIEnv* env, jobject j_this) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ this_ptr->@SIMPLIFY@();
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_unconstrain_1space_1dimension
+(JNIEnv* env, jobject j_this, jobject j_var) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_var);
+ this_ptr->unconstrain(v);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_unconstrain_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+ this_ptr->unconstrain(v_set);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_bounds_1from_1 at 1ABOVEBELOW@
+(JNIEnv* env, jobject j_this, jobject j_le) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ return this_ptr->bounds_from_ at ABOVEBELOW@(le);
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_has_1 at UPPERLOWER@_1bound
+(JNIEnv* env, jobject j_this, jobject j_var,
+ jobject j_num, jobject j_den, jobject j_ref_boolean) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable var = build_cxx_variable(env, j_var);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ num = build_cxx_coeff(env, j_num);
+ den = build_cxx_coeff(env, j_den);
+ bool b_value;
+ if (this_ptr->has_ at UPPERLOWER@_bound(var, num, den, b_value)) {
+ set_coefficient(env, j_num, build_java_coeff(env, num));
+ set_coefficient(env, j_den, build_java_coeff(env, den));
+ jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+ set_by_reference(env, j_ref_boolean, j_boolean);
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MAXMIN@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_By_1Reference_2
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_num, jobject j_den, jobject j_ref_boolean) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ num = build_cxx_coeff(env, j_num);
+ den = build_cxx_coeff(env, j_den);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ bool b_value;
+ if (this_ptr->@MAXMIN@(le, num, den, b_value)) {
+ set_coefficient(env, j_num, build_java_coeff(env, num));
+ set_coefficient(env, j_den, build_java_coeff(env, den));
+ jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+ set_by_reference(env, j_ref_boolean, j_boolean);
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MAXMIN@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_By_1Reference_2Lparma_1polyhedra_1library_Generator_2
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_num, jobject j_den, jobject j_ref_boolean, jobject j_g) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ num = build_cxx_coeff(env, j_num);
+ den = build_cxx_coeff(env, j_den);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ bool b_value;
+ Generator g = point();
+ if (this_ptr->@MAXMIN@(le, num, den, b_value, g)) {
+ set_coefficient(env, j_num, build_java_coeff(env, num));
+ set_coefficient(env, j_den, build_java_coeff(env, den));
+ jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+ set_by_reference(env, j_ref_boolean, j_boolean);
+ jobject j_g_result = build_java_generator(env, g);
+ set_generator(env, j_g, j_g_result);
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_frequency
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_freqn, jobject j_freqd, jobject j_valn, jobject j_vald) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ PPL_DIRTY_TEMP_COEFFICIENT(freqn);
+ PPL_DIRTY_TEMP_COEFFICIENT(freqd);
+ PPL_DIRTY_TEMP_COEFFICIENT(valn);
+ PPL_DIRTY_TEMP_COEFFICIENT(vald);
+ freqn = build_cxx_coeff(env, j_freqn);
+ freqd = build_cxx_coeff(env, j_freqd);
+ valn = build_cxx_coeff(env, j_valn);
+ vald = build_cxx_coeff(env, j_vald);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ if (this_ptr->frequency(le, freqn, freqd, valn, vald)) {
+ set_coefficient(env, j_freqn, build_java_coeff(env, freqn));
+ set_coefficient(env, j_freqd, build_java_coeff(env, freqd));
+ set_coefficient(env, j_valn, build_java_coeff(env, valn));
+ set_coefficient(env, j_vald, build_java_coeff(env, vald));
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1COMPARISON@
+(JNIEnv* env, jobject j_this, jobject j_y) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ return this_ptr->@COMPARISON@(*y_ptr);
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_equals
+(JNIEnv* env, jobject j_this, jobject j_y) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ return *this_ptr == *y_ptr;
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_hashCode
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return this_ptr->hash_code();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_OK
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return this_ptr->OK();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1 at 1CLASS_REPRESENT@
+(JNIEnv* env, jobject j_this, jobject j_c) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @!CLASS_REPRESENT@ c = build_cxx_ at CLASS_REPRESENT@(env, j_c);
+ this_ptr->add_ at CLASS_REPRESENT@(c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@
+(JNIEnv* env, jobject j_this, jobject j_c) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @!REFINE_REPRESENT@ c = build_cxx_ at REFINE_REPRESENT@(env, j_c);
+ this_ptr->refine_with_ at REFINE_REPRESENT@(c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1 at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this, jobject j_cs) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @!CLASS_REPRESENT at _System cs = build_cxx_ at CLASS_REPRESENT@_system(env, j_cs);
+ this_ptr->add_ at CLASS_REPRESENT@s(cs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@s
+(JNIEnv* env, jobject j_this, jobject j_cs) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @!REFINE_REPRESENT at _System cs
+ = build_cxx_ at REFINE_REPRESENT@_system(env, j_cs);
+ this_ptr->refine_with_ at REFINE_REPRESENT@s(cs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1BINOP@
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ this_ptr->@BINOP@(*y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _positive_1time_1elapse_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @TOPOLOGY@@CPP_CLASS@* this_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+ @TOPOLOGY@@CPP_CLASS@* y_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_y));
+ this_ptr->positive_time_elapse_assign(*y_ptr);
+}
+CATCH_ALL;
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_simplify_1using_1context_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ return this_ptr->simplify_using_context_assign(*y_ptr);
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this, jobject j_v, jobject j_le, jobject j_c) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_v);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ c = build_cxx_coeff(env, j_c);
+ this_ptr->@AFFIMAGE@(v, le, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Relation_1Symbol_2Lparma_1polyhedra_1library_Linear_1Expression_2
+(JNIEnv* env, jobject j_this,
+ jobject j_lhs, jobject j_relsym, jobject j_rhs) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+ Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+ Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+ this_ptr->generalized_ at AFFIMAGE@(lhs, relsym, rhs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lparma_1polyhedra_1library_Variable_2Lparma_1polyhedra_1library_Relation_1Symbol_2Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_relsym, jobject j_le, jobject j_c) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_v);
+ Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ c = build_cxx_coeff(env, j_c);
+ this_ptr->generalized_ at AFFIMAGE@(v, relsym, le, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@_1lhs_1rhs_1with_1congruence
+(JNIEnv* env, jobject j_this,
+ jobject j_lhs, jobject j_relsym, jobject j_rhs, jobject j_modulus) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+ Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+ Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+ PPL_DIRTY_TEMP_COEFFICIENT(modulus);
+ modulus = build_cxx_coeff(env, j_modulus);
+ this_ptr->generalized_ at AFFIMAGE@(lhs, relsym, rhs, modulus);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at CLASS@_generalized_1 at 1AFFIMAGE@_1with_1congruence
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_relsym, jobject j_le, jobject j_c,
+ jobject j_modulus) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_v);
+ Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ PPL_DIRTY_TEMP_COEFFICIENT(modulus);
+ c = build_cxx_coeff(env, j_c);
+ modulus = build_cxx_coeff(env, j_modulus);
+ this_ptr->generalized_ at AFFIMAGE@(v, relsym, le, c, modulus);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_bounded_1 at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_lhs, jobject j_rhs, jobject j_c) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_v);
+ Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+ Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ c = build_cxx_coeff(env, j_c);
+ this_ptr->bounded_ at AFFIMAGE@(v, lhs, rhs, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_wrap_1assign
+(JNIEnv* env, jobject j_this, jobject j_vars,
+ jobject j_w, jobject j_r, jobject j_o, jobject j_cs,
+ jlong j_cx, jboolean j_wrap_individually) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variables_Set vars = build_cxx_variables_set(env, j_vars);
+ Bounded_Integer_Type_Width w = build_cxx_bounded_width(env, j_w);
+ Bounded_Integer_Type_Representation r = build_cxx_bounded_rep(env, j_r);
+ Bounded_Integer_Type_Overflow o = build_cxx_bounded_overflow(env, j_o);
+ Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+ unsigned cx = jtype_to_unsigned<unsigned int>(j_cx);
+ this_ptr->wrap_assign(vars, w, r, o, &cs, cx, j_wrap_individually);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1WIDEN@_1widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ if (j_by_ref_int == NULL)
+ this_ptr->@WIDEN at _widening_assign(*y_ptr);
+ else {
+ jobject j_integer = get_by_reference(env, j_by_ref_int);
+ unsigned int tokens =
+ jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+ this_ptr->@WIDEN at _widening_assign(*y_ptr, &tokens);
+ j_integer = j_int_to_j_integer(env, tokens);
+ set_by_reference(env, j_by_ref_int, j_integer);
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ if (j_by_ref_int == NULL)
+ this_ptr->widening_assign(*y_ptr);
+ else {
+ jobject j_integer = get_by_reference(env, j_by_ref_int);
+ unsigned int tokens =
+ jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+ this_ptr->widening_assign(*y_ptr, &tokens);
+ j_integer = j_int_to_j_integer(env, tokens);
+ set_by_reference(env, j_by_ref_int, j_integer);
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1EXTRAPOLATION@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ if (j_by_ref_int == NULL)
+ this_ptr->@EXTRAPOLATION at _extrapolation_assign(*y_ptr);
+ else {
+ jobject j_integer = get_by_reference(env, j_by_ref_int);
+ unsigned int tokens =
+ jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+ this_ptr->@EXTRAPOLATION at _extrapolation_assign(*y_ptr, &tokens);
+ j_integer = j_int_to_j_integer(env, tokens);
+ set_by_reference(env, j_by_ref_int, j_integer);
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1EXTRAPOLATION@_1narrowing_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ this_ptr->@EXTRAPOLATION at _narrowing_assign(*y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1LIMITEDBOUNDED@_1 at 1WIDENEXPN@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y,
+ jobject j_cs, jobject j_by_ref_int) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ @!CONSTRAINER at _System cs = build_cxx_ at CONSTRAINER@_system(env, j_cs);
+ if (j_by_ref_int == NULL)
+ this_ptr->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*y_ptr, cs);
+ else {
+ jobject j_integer = get_by_reference(env, j_by_ref_int);
+ unsigned int tokens =
+ jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+ this_ptr->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign
+ (*y_ptr, cs, &tokens);
+ j_integer = j_int_to_j_integer(env, tokens);
+ set_by_reference(env, j_by_ref_int, j_integer);
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_BGP99_1 at 1DISJUNCT_WIDEN@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_disjuncts) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ unsigned int disjuncts =
+ jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_disjuncts));
+ this_ptr->BGP99_extrapolation_assign
+ (*y_ptr,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+ disjuncts);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_BHZ03_1 at 1A_DISJUNCT_WIDEN@_1 at 1DISJUNCT_WIDEN@_1widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ @CPP_CLASS@* y_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+ this_ptr->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+ (*y_ptr,
+ widen_fun_ref(
+ &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1space_1dimensions_1 at 1EMBEDPROJECT@
+(JNIEnv* env, jobject j_this, jlong dim) try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ this_ptr->add_space_dimensions_ at EMBEDPROJECT@(ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_remove_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+ this_ptr->remove_space_dimensions(v_set);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_remove_1higher_1space_1dimensions
+(JNIEnv* env, jobject j_this, jlong dim) try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ this_ptr->remove_higher_space_dimensions(ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_expand_1space_1dimension
+(JNIEnv* env, jobject j_this, jobject j_variable, jlong dim) try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_variable);
+ this_ptr->expand_space_dimension(v, ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_fold_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set, jobject j_var) try {
+ Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_var);
+ this_ptr->fold_space_dimensions(v_set, v);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_map_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_p_func) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Partial_Function* p_func_ptr
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_p_func));
+ this_ptr->map_space_dimensions(*p_func_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_drop_1some_1non_1integer_1points__Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_complexity) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ jint j_complexity_int
+ = env->CallIntMethod(j_complexity,
+ cached_FMIDs.Complexity_Class_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (j_complexity_int) {
+ case 0:
+ this_ptr->drop_some_non_integer_points(POLYNOMIAL_COMPLEXITY);
+ break;
+ case 1:
+ this_ptr->drop_some_non_integer_points(SIMPLEX_COMPLEXITY);
+ break;
+ case 2:
+ this_ptr->drop_some_non_integer_points(ANY_COMPLEXITY);
+ break;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ break;
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_drop_1some_1non_1integer_1points__Lparma_1polyhedra_1library_Variables_1Set_2Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_v_set, jobject j_complexity) try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+ jint j_complexity_int
+ = env->CallIntMethod(j_complexity,
+ cached_FMIDs.Complexity_Class_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (j_complexity_int) {
+ case 0:
+ this_ptr->drop_some_non_integer_points(v_set, POLYNOMIAL_COMPLEXITY);
+ break;
+ case 1:
+ this_ptr->drop_some_non_integer_points(v_set, SIMPLEX_COMPLEXITY);
+ break;
+ case 2:
+ this_ptr->drop_some_non_integer_points(v_set, ANY_COMPLEXITY);
+ break;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ break;
+ }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_toString
+(JNIEnv* env, jobject j_this) {
+ try {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ std::ostringstream s;
+ s << *this_ptr;
+ std::string str = s.str();
+ return env->NewStringUTF(str.c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MEMBYTES@
+(JNIEnv* env, jobject j_this) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ return this_ptr->@MEMBYTES@();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_constrains
+(JNIEnv* env, jobject j_this, jobject j_var) {
+ try {
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_var);
+ return this_ptr->constrains(v);
+ }
+ CATCH_ALL;
+ return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ @CPP_CLASS@* this_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+ std::ostringstream s;
+ this_ptr->ascii_dump(s);
+ std::string str = s.str();
+ return env->NewStringUTF(str.c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _linear_1@PARTITION@
+(JNIEnv* env, jclass, jobject j_p, jobject j_q) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+ @TOPOLOGY@@CPP_CLASS@* q_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_q));
+ std::pair<@TOPOLOGY@@CPP_CLASS@|COMMA|
+ Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(*p_ptr, *q_ptr);
+
+ @TOPOLOGY@@CPP_CLASS@* r1
+ = new @TOPOLOGY@@CPP_CLASS@(0, EMPTY);
+ Pointset_Powerset<NNC_Polyhedron>* r2
+ = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*r1, r.first);
+ swap(*r2, r.second);
+
+ jclass j_pair_class = env->FindClass("parma_polyhedra_library/Pair");
+ CHECK_RESULT_ASSERT(env, j_pair_class);
+ jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_pair);
+ jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair);
+ CHECK_RESULT_RETURN(env, j_pair_obj, 0);
+
+ jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@TOPOLOGY@@CLASS@");
+ CHECK_RESULT_ASSERT(env, j_class_r1);
+ jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_r1);
+ jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1);
+ CHECK_RESULT_RETURN(env, j_obj_r1, 0);
+ set_ptr(env, j_obj_r1, r1);
+
+ jclass j_class_r2 = env->FindClass("parma_polyhedra_library/Pointset_Powerset_NNC_Polyhedron");
+ CHECK_RESULT_ASSERT(env, j_class_r2);
+ jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_r2);
+ jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2);
+ CHECK_RESULT_RETURN(env, j_obj_r2, 0);
+ set_ptr(env, j_obj_r2, r2);
+ set_pair_element(env, j_pair_obj, 0, j_obj_r1);
+ set_pair_element(env, j_pair_obj, 1, j_obj_r2);
+ return j_pair_obj;
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_approximate_1 at PARTITION@
+(JNIEnv* env, jclass, jobject j_p, jobject j_q, jobject j_ref_finite_bool) {
+ try {
+ @CPP_CLASS@* p_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_p));
+ @CPP_CLASS@* q_ptr
+ = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_q));
+ bool b_finite_val;
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+ r = approximate_partition(*p_ptr, *q_ptr, b_finite_val);
+
+ @CPP_CLASS@* r1 = new @CPP_CLASS@(0, EMPTY);
+ Pointset_Powerset<Grid>* r2 = new Pointset_Powerset<Grid>(0, EMPTY);
+ swap(*r1, r.first);
+ swap(*r2, r.second);
+
+ jclass j_pair_class = env->FindClass("parma_polyhedra_library/Pair");
+ CHECK_RESULT_ASSERT(env, j_pair_class);
+ jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_pair);
+ jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair);
+ CHECK_RESULT_RETURN(env, j_pair_obj, 0);
+
+ jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@CLASS@");
+ CHECK_RESULT_ASSERT(env, j_class_r1);
+ jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_r1);
+ jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1);
+ CHECK_RESULT_RETURN(env, j_obj_r1, 0);
+ set_ptr(env, j_obj_r1, r1);
+
+ jclass j_class_r2
+ = env->FindClass("parma_polyhedra_library/Pointset_Powerset_Grid");
+ CHECK_RESULT_ASSERT(env, j_class_r2);
+ jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_r2);
+ jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2);
+ CHECK_RESULT_RETURN(env, j_obj_r2, 0);
+ set_ptr(env, j_obj_r2, r2);
+ set_pair_element(env, j_pair_obj, 0, j_obj_r1);
+ set_pair_element(env, j_pair_obj, 1, j_obj_r2);
+ jobject j_finite_bool = bool_to_j_boolean_class(env, b_finite_val);
+ set_by_reference(env, j_ref_finite_bool, j_finite_bool);
+ return j_pair_obj;
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_termination_1test_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+ return termination_test_ at TERMINATION_ID@(*p_ptr);
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_termination_1test_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+ return termination_test_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after);
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_one_1affine_1ranking_1function_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p, jobject j_g) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+ Generator g(point());
+ if (one_affine_ranking_function_ at TERMINATION_ID@(*p_ptr, g)) {
+ jobject j_g_result = build_java_generator(env, g);;
+ set_generator(env, j_g, j_g_result);
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_one_1affine_1ranking_1function_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after, jobject j_g) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+ Generator g(point());
+ if (one_affine_ranking_function_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after, g)) {
+ jobject j_g_result = build_java_generator(env, g);;
+ set_generator(env, j_g, j_g_result);
+ return true;
+ }
+ return false;
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1ranking_1functions_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p, jobject j_ph) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ all_affine_ranking_functions_ at TERMINATION_ID@(*p_ptr, *ph);
+ set_ptr(env, j_ph, ph);
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1ranking_1functions_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after, jobject j_ph) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ all_affine_ranking_functions_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after, *ph);
+ set_ptr(env, j_ph, ph);
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1quasi_1ranking_1functions_1MS_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p,
+ jobject j_ph_decreasing, jobject j_ph_bounded) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ all_affine_quasi_ranking_functions_MS(*p_ptr, *ph_decreasing, *ph_bounded);
+ set_ptr(env, j_ph_decreasing, ph_decreasing);
+ set_ptr(env, j_ph_bounded, ph_bounded);
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1quasi_1ranking_1functions_1MS_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after,
+ jobject j_ph_decreasing, jobject j_ph_bounded) {
+ try {
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+ @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ all_affine_quasi_ranking_functions_MS_2(*p_ptr_before, *p_ptr_after,
+ *ph_decreasing, *ph_bounded);
+ set_ptr(env, j_ph_decreasing, ph_decreasing);
+ set_ptr(env, j_ph_bounded, ph_bounded);
+ }
+ CATCH_ALL;
+}
+
+')
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4 b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
new file mode 100644
index 0000000..6b1486d
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
@@ -0,0 +1,88 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file parma_polyhedra_library_classes.cc
+dnl using the code in ppl_interface_generator_java_classes_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_classes_cc_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+dnl The macro m4_java_prefix_one_annotation is defined in
+dnl ppl_interfaces_generatos_common.m4 and will expand to the
+dnl extra pattern annotations for "1" and "1!";
+dnl that will insert a "1" after the "_" in the replacements.
+m4_java_prefix_one_annotation
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+/* Java Termination interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_java_common_defs.hh"
+`#'include "parma_polyhedra_library_Termination.h"
+`#'include "parma_polyhedra_library_C_Polyhedron.h"
+`#'include "parma_polyhedra_library_NNC_Polyhedron.h"
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', `m4_interface_class$1')`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* Java m4_current_interface interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_java_common_defs.hh"
+`#'include "parma_polyhedra_library_`'m4_current_interface`'.h"
+m4_ifelse(m4_current_interface, Polyhedron,
+`#'include "parma_polyhedra_library_C_Polyhedron.h"
+`#'include "parma_polyhedra_library_NNC_Polyhedron.h"
+)`'dnl
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/Java/jni/ppl_java_common.cc b/interfaces/Java/jni/ppl_java_common.cc
new file mode 100644
index 0000000..c357cd6
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common.cc
@@ -0,0 +1,1249 @@
+/* PPL Java interface common routines implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_java_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+// Define class and field/method ID caches.
+Java_Class_Cache cached_classes;
+Java_FMID_Cache cached_FMIDs;
+
+Java_Class_Cache::Java_Class_Cache() {
+ // Java Virtual Machine pointer.
+ jvm = NULL;
+ // Non-PPL classes.
+ Boolean = NULL;
+ Integer = NULL;
+ Long = NULL;
+ Iterator = NULL;
+ // PPL classes.
+ Artificial_Parameter = NULL;
+ Artificial_Parameter_Sequence = NULL;
+ Bounded_Integer_Type_Overflow = NULL;
+ Bounded_Integer_Type_Representation = NULL;
+ Bounded_Integer_Type_Width = NULL;
+ By_Reference = NULL;
+ Coefficient = NULL;
+ Congruence = NULL;
+ Constraint = NULL;
+ Generator = NULL;
+ Grid_Generator = NULL;
+ Generator_Type = NULL;
+ Grid_Generator_Type = NULL;
+ Constraint_System = NULL;
+ Congruence_System = NULL;
+ Generator_System = NULL;
+ Grid_Generator_System = NULL;
+ Linear_Expression = NULL;
+ Linear_Expression_Coefficient = NULL;
+ Linear_Expression_Difference = NULL;
+ Linear_Expression_Sum = NULL;
+ Linear_Expression_Times = NULL;
+ Linear_Expression_Unary_Minus = NULL;
+ Linear_Expression_Variable = NULL;
+ MIP_Problem_Status = NULL;
+ Optimization_Mode = NULL;
+ Pair = NULL;
+ PIP_Problem_Control_Parameter_Name = NULL;
+ PIP_Problem_Control_Parameter_Value = NULL;
+ PIP_Problem_Status = NULL;
+ Poly_Con_Relation = NULL;
+ Poly_Gen_Relation = NULL;
+ PPL_Object = NULL;
+ Relation_Symbol = NULL;
+ Variable = NULL;
+ Variable_Stringifier = NULL;
+ Variables_Set = NULL;
+}
+
+void
+Java_Class_Cache::init_cache(JNIEnv* env, jclass& field, const char* name) {
+ assert(env != NULL);
+ if (field != NULL) {
+ env->DeleteGlobalRef(field);
+ }
+ jclass jni_class = env->FindClass(name);
+ CHECK_RESULT_ASSERT(env, jni_class);
+ field = (jclass) env->NewGlobalRef(jni_class);
+ CHECK_RESULT_ASSERT(env, field);
+}
+
+void
+Java_Class_Cache::init_cache(JNIEnv* env) {
+ assert(env != NULL);
+ // Java Virtual Machine pointer.
+ env->GetJavaVM(&jvm);
+ // Non-PPL classes.
+ init_cache(env, Boolean, "java/lang/Boolean");
+ init_cache(env, Integer, "java/lang/Integer");
+ init_cache(env, Long, "java/lang/Long");
+ init_cache(env, Iterator, "java/util/Iterator");
+ // PPL classes.
+ init_cache(env, Artificial_Parameter,
+ "parma_polyhedra_library/Artificial_Parameter");
+ init_cache(env, Artificial_Parameter_Sequence,
+ "parma_polyhedra_library/Artificial_Parameter_Sequence");
+ init_cache(env, Bounded_Integer_Type_Overflow, "parma_polyhedra_library/Bounded_Integer_Type_Overflow");
+ init_cache(env, Bounded_Integer_Type_Representation, "parma_polyhedra_library/Bounded_Integer_Type_Representation");
+ init_cache(env, Bounded_Integer_Type_Width, "parma_polyhedra_library/Bounded_Integer_Type_Width");
+ init_cache(env, By_Reference, "parma_polyhedra_library/By_Reference");
+ init_cache(env, Coefficient, "parma_polyhedra_library/Coefficient");
+ init_cache(env, Congruence, "parma_polyhedra_library/Congruence");
+ init_cache(env, Constraint, "parma_polyhedra_library/Constraint");
+ init_cache(env, Generator, "parma_polyhedra_library/Generator");
+ init_cache(env, Grid_Generator, "parma_polyhedra_library/Grid_Generator");
+ init_cache(env, Generator_Type, "parma_polyhedra_library/Generator_Type");
+ init_cache(env, Grid_Generator_Type,
+ "parma_polyhedra_library/Grid_Generator_Type");
+ init_cache(env, Constraint_System,
+ "parma_polyhedra_library/Constraint_System");
+ init_cache(env, Congruence_System,
+ "parma_polyhedra_library/Congruence_System");
+ init_cache(env, Generator_System,
+ "parma_polyhedra_library/Generator_System");
+ init_cache(env, Grid_Generator_System,
+ "parma_polyhedra_library/Grid_Generator_System");
+ init_cache(env, Linear_Expression,
+ "parma_polyhedra_library/Linear_Expression");
+ init_cache(env, Linear_Expression_Coefficient,
+ "parma_polyhedra_library/Linear_Expression_Coefficient");
+ init_cache(env, Linear_Expression_Difference,
+ "parma_polyhedra_library/Linear_Expression_Difference");
+ init_cache(env, Linear_Expression_Sum,
+ "parma_polyhedra_library/Linear_Expression_Sum");
+ init_cache(env, Linear_Expression_Times,
+ "parma_polyhedra_library/Linear_Expression_Times");
+ init_cache(env, Linear_Expression_Unary_Minus,
+ "parma_polyhedra_library/Linear_Expression_Unary_Minus");
+ init_cache(env, Linear_Expression_Variable,
+ "parma_polyhedra_library/Linear_Expression_Variable");
+ init_cache(env, MIP_Problem_Status,
+ "parma_polyhedra_library/MIP_Problem_Status");
+ init_cache(env, Optimization_Mode,
+ "parma_polyhedra_library/Optimization_Mode");
+ init_cache(env, Pair, "parma_polyhedra_library/Pair");
+ init_cache(env, PIP_Problem_Control_Parameter_Name,
+ "parma_polyhedra_library/PIP_Problem_Control_Parameter_Name");
+ init_cache(env, PIP_Problem_Control_Parameter_Value,
+ "parma_polyhedra_library/PIP_Problem_Control_Parameter_Value");
+ init_cache(env, PIP_Problem_Status,
+ "parma_polyhedra_library/PIP_Problem_Status");
+ init_cache(env, Poly_Con_Relation,
+ "parma_polyhedra_library/Poly_Con_Relation");
+ init_cache(env, Poly_Gen_Relation,
+ "parma_polyhedra_library/Poly_Gen_Relation");
+ init_cache(env, PPL_Object, "parma_polyhedra_library/PPL_Object");
+ init_cache(env, Relation_Symbol, "parma_polyhedra_library/Relation_Symbol");
+ init_cache(env, Variable, "parma_polyhedra_library/Variable");
+ // NOTE: initialization of concrete Variable_Stringifier is responsibility
+ // of static (native) method Variable.setStringifier.
+ init_cache(env, Variables_Set, "parma_polyhedra_library/Variables_Set");
+}
+
+void
+Java_Class_Cache::clear_cache(JNIEnv* env, jclass& field) {
+ assert(env != NULL);
+ if (field != NULL) {
+ env->DeleteGlobalRef(field);
+ field = NULL;
+ }
+}
+
+void
+Java_Class_Cache::clear_cache(JNIEnv* env) {
+ assert(env != NULL);
+ // Clearing the JVM pointer.
+ jvm = NULL;
+ // Non-PPL classes.
+ clear_cache(env, Boolean);
+ clear_cache(env, Integer);
+ clear_cache(env, Long);
+ clear_cache(env, Iterator);
+ // PPL classes.
+ clear_cache(env, Artificial_Parameter);
+ clear_cache(env, Artificial_Parameter_Sequence);
+ clear_cache(env, Bounded_Integer_Type_Overflow);
+ clear_cache(env, Bounded_Integer_Type_Representation);
+ clear_cache(env, Bounded_Integer_Type_Width);
+ clear_cache(env, By_Reference);
+ clear_cache(env, Coefficient);
+ clear_cache(env, Congruence);
+ clear_cache(env, Constraint);
+ clear_cache(env, Generator);
+ clear_cache(env, Grid_Generator);
+ clear_cache(env, Generator_Type);
+ clear_cache(env, Grid_Generator_Type);
+ clear_cache(env, Constraint_System);
+ clear_cache(env, Congruence_System);
+ clear_cache(env, Generator_System);
+ clear_cache(env, Grid_Generator_System);
+ clear_cache(env, Linear_Expression);
+ clear_cache(env, Linear_Expression_Coefficient);
+ clear_cache(env, Linear_Expression_Difference);
+ clear_cache(env, Linear_Expression_Sum);
+ clear_cache(env, Linear_Expression_Times);
+ clear_cache(env, Linear_Expression_Unary_Minus);
+ clear_cache(env, Linear_Expression_Variable);
+ clear_cache(env, MIP_Problem_Status);
+ clear_cache(env, Optimization_Mode);
+ clear_cache(env, PIP_Problem_Status);
+ clear_cache(env, Pair);
+ clear_cache(env, Poly_Con_Relation);
+ clear_cache(env, Poly_Gen_Relation);
+ clear_cache(env, PPL_Object);
+ clear_cache(env, Relation_Symbol);
+ clear_cache(env, Variable);
+ clear_cache(env, Variable_Stringifier);
+ clear_cache(env, Variables_Set);
+}
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e) {
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Overflow_Error_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e) {
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Invalid_Argument_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e) {
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Logic_Error_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e) {
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Length_Error_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e) {
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Domain_Error_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&) {
+ jclass newExcCls
+ = env->FindClass("java/lang/RuntimeException");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, "Out of memory");
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::exception& e) {
+ jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, e.what());
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const timeout_exception&) {
+ reset_timeout();
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Timeout_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, "PPL timeout expired");
+ CHECK_RESULT_ABORT(env, (ret == 0));
+}
+
+void
+handle_exception(JNIEnv* env, const deterministic_timeout_exception&) {
+ reset_deterministic_timeout();
+ jclass newExcCls
+ = env->FindClass("parma_polyhedra_library/Timeout_Exception");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, "PPL deterministic timeout expired");
+ CHECK_RESULT_ABORT(env, (ret == 0));
+}
+
+void
+handle_exception(JNIEnv* env) {
+ jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+ CHECK_RESULT_ASSERT(env, newExcCls);
+ jint ret = env->ThrowNew(newExcCls, "PPL bug: unknown exception raised");
+ CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+ if (p_timeout_object) {
+ delete p_timeout_object;
+ p_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+void
+reset_deterministic_timeout() {
+ if (p_deterministic_timeout_object) {
+ delete p_deterministic_timeout_object;
+ p_deterministic_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+jobject
+build_java_poly_gen_relation(JNIEnv* env, Poly_Gen_Relation& r) {
+ jint j_value = 0;
+ while (r != Poly_Gen_Relation::nothing()) {
+ if (r.implies(Poly_Gen_Relation::subsumes())) {
+ j_value += 1;
+ r = r - Poly_Gen_Relation::subsumes();
+ }
+ }
+ jobject ret = env->NewObject(cached_classes.Poly_Gen_Relation,
+ cached_FMIDs.Poly_Gen_Relation_init_ID,
+ j_value);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+jobject
+build_java_poly_con_relation(JNIEnv* env, Poly_Con_Relation& r) {
+ jint j_value = 0;
+ while (r != Poly_Con_Relation::nothing()) {
+ if (r.implies(Poly_Con_Relation::is_disjoint())) {
+ j_value += 1;
+ r = r - Poly_Con_Relation::is_disjoint();
+ }
+ else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+ j_value += 2;
+ r = r - Poly_Con_Relation::strictly_intersects();
+ }
+ else if (r.implies(Poly_Con_Relation::is_included())) {
+ j_value += 4;
+ r = r - Poly_Con_Relation::is_included();
+ }
+ else if (r.implies(Poly_Con_Relation::saturates())) {
+ j_value += 8;
+ r = r - Poly_Con_Relation::saturates();
+ }
+ }
+ jobject ret = env->NewObject(cached_classes.Poly_Con_Relation,
+ cached_FMIDs.Poly_Con_Relation_init_ID,
+ j_value);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+
+Congruence
+build_cxx_congruence(JNIEnv* env, jobject j_congruence) {
+ jobject j_mod
+ = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_mod_ID);
+ jobject j_lhs
+ = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_lhs_ID);
+ jobject j_rhs
+ = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_rhs_ID);
+ PPL_DIRTY_TEMP_COEFFICIENT(ppl_modulus);
+ ppl_modulus = build_cxx_coeff(env, j_mod);
+ Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+ Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+ return (lhs %= rhs) / ppl_modulus;
+}
+
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_artificial_parameter) {
+ jobject j_le
+ = env->GetObjectField(j_artificial_parameter,
+ cached_FMIDs.Artificial_Parameter_le_ID);
+ jobject j_den
+ = env->GetObjectField(j_artificial_parameter,
+ cached_FMIDs.Artificial_Parameter_den_ID);
+ PPL_DIRTY_TEMP_COEFFICIENT(ppl_den);
+ ppl_den = build_cxx_coeff(env, j_den);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ PIP_Tree_Node::Artificial_Parameter art_param(le, ppl_den);
+ return art_param;
+}
+
+jobject
+bool_to_j_boolean_class(JNIEnv* env, const bool value) {
+ jobject ret = env->CallStaticObjectMethod(cached_classes.Boolean,
+ cached_FMIDs.Boolean_valueOf_ID,
+ static_cast<jboolean>(value));
+ CHECK_EXCEPTION_ASSERT(env);
+ return ret;
+}
+
+jobject
+j_long_to_j_long_class(JNIEnv* env, jlong jlong_value) {
+ jobject ret = env->CallStaticObjectMethod(cached_classes.Long,
+ cached_FMIDs.Long_valueOf_ID,
+ jlong_value);
+ CHECK_EXCEPTION_THROW(env);
+ return ret;
+}
+
+jlong
+j_long_class_to_j_long(JNIEnv* env, jobject j_long) {
+ jlong ret = env->CallLongMethod(j_long, cached_FMIDs.Long_longValue_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ return ret;
+}
+
+jobject
+j_int_to_j_integer(JNIEnv* env, jint jint_value) {
+ jobject ret = env->CallStaticObjectMethod(cached_classes.Integer,
+ cached_FMIDs.Integer_valueOf_ID,
+ jint_value);
+ CHECK_EXCEPTION_THROW(env);
+ return ret;
+}
+
+jint
+j_integer_to_j_int(JNIEnv* env, jobject j_integer) {
+ jint ret = env->CallIntMethod(j_integer, cached_FMIDs.Integer_intValue_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ return ret;
+}
+
+Variables_Set
+build_cxx_variables_set(JNIEnv* env, jobject j_v_set) {
+ // Get the iterator.
+ jobject j_iter
+ = env->CallObjectMethod(j_v_set, cached_FMIDs.Variables_Set_iterator_ID);
+ CHECK_EXCEPTION_THROW(env);
+ // Get method IDs from cache.
+ jmethodID has_next_ID = cached_FMIDs.Variables_Set_Iterator_has_next_ID;
+ jmethodID next_ID = cached_FMIDs.Variables_Set_Iterator_next_ID;
+ // Initialize an empty set of variables.
+ Variables_Set v_set;
+ jobject j_variable;
+ jboolean has_next_value = env->CallBooleanMethod(j_iter, has_next_ID);
+ while (has_next_value) {
+ j_variable = env->CallObjectMethod(j_iter, next_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ v_set.insert(build_cxx_variable(env, j_variable));
+ has_next_value = env->CallBooleanMethod(j_iter, has_next_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ }
+ return v_set;
+}
+
+jobject
+build_java_variables_set(JNIEnv* env, const Variables_Set& v_set) {
+ jobject j_vs = env->NewObject(cached_classes.Variables_Set,
+ cached_FMIDs.Variables_Set_init_ID);
+ CHECK_RESULT_THROW(env, j_vs);
+ for (Variables_Set::const_iterator v_begin = v_set.begin(),
+ v_end = v_set.end(); v_begin != v_end; ++v_begin) {
+ Variable var(*v_begin);
+ jobject j_variable = build_java_variable(env, var);
+ env->CallBooleanMethod(j_vs,
+ cached_FMIDs.Variables_Set_add_ID,
+ j_variable);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ return j_vs;
+}
+
+Bounded_Integer_Type_Overflow
+build_cxx_bounded_overflow(JNIEnv* env, jobject j_bounded_overflow) {
+ jint bounded_overflow
+ = env->CallIntMethod(j_bounded_overflow, cached_FMIDs.Bounded_Integer_Type_Overflow_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (bounded_overflow) {
+ case 0:
+ return OVERFLOW_WRAPS;
+ case 1:
+ return OVERFLOW_UNDEFINED;
+ case 2:
+ return OVERFLOW_IMPOSSIBLE;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Bounded_Integer_Type_Representation
+build_cxx_bounded_rep(JNIEnv* env, jobject j_bounded_rep) {
+ jint bounded_rep
+ = env->CallIntMethod(j_bounded_rep, cached_FMIDs.Bounded_Integer_Type_Representation_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (bounded_rep) {
+ case 0:
+ return UNSIGNED;
+ case 1:
+ return SIGNED_2_COMPLEMENT;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Bounded_Integer_Type_Width
+build_cxx_bounded_width(JNIEnv* env, jobject j_bounded_width) {
+ jint bounded_width
+ = env->CallIntMethod(j_bounded_width, cached_FMIDs.Bounded_Integer_Type_Width_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (bounded_width) {
+ case 0:
+ return BITS_8;
+ case 1:
+ return BITS_16;
+ case 2:
+ return BITS_32;
+ case 3:
+ return BITS_64;
+ case 4:
+ return BITS_128;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Relation_Symbol
+build_cxx_relsym(JNIEnv* env, jobject j_relsym) {
+ jint rel_sym
+ = env->CallIntMethod(j_relsym, cached_FMIDs.Relation_Symbol_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (rel_sym) {
+ case 0:
+ return LESS_THAN;
+ case 1:
+ return LESS_OR_EQUAL;
+ case 2:
+ return EQUAL;
+ case 3:
+ return GREATER_OR_EQUAL;
+ case 4:
+ return GREATER_THAN;
+ case 5:
+ return NOT_EQUAL;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Optimization_Mode
+build_cxx_optimization_mode(JNIEnv* env, jobject j_opt_mode) {
+ jint opt_mode
+ = env->CallIntMethod(j_opt_mode, cached_FMIDs.Optimization_Mode_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (opt_mode) {
+ case 0:
+ return MINIMIZATION;
+ case 1:
+ return MAXIMIZATION;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status) {
+ jfieldID fID;
+ switch (mip_status) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ fID = cached_FMIDs.MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID;
+ break;
+ case UNBOUNDED_MIP_PROBLEM:
+ fID = cached_FMIDs.MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID;
+ break;
+ case OPTIMIZED_MIP_PROBLEM:
+ fID = cached_FMIDs.MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ return env->GetStaticObjectField(cached_classes.MIP_Problem_Status, fID);
+}
+
+jobject
+build_java_pip_status(JNIEnv* env, const PIP_Problem_Status& pip_status) {
+ jfieldID fID;
+ switch (pip_status) {
+ case UNFEASIBLE_PIP_PROBLEM:
+ fID = cached_FMIDs.PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID;
+ break;
+ case OPTIMIZED_PIP_PROBLEM:
+ fID = cached_FMIDs.PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ return env->GetStaticObjectField(cached_classes.PIP_Problem_Status, fID);
+}
+
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode) {
+ jfieldID fID;
+ switch (opt_mode) {
+ case MINIMIZATION:
+ fID = cached_FMIDs.Optimization_Mode_MINIMIZATION_ID;
+ break;
+ case MAXIMIZATION:
+ fID = cached_FMIDs.Optimization_Mode_MAXIMIZATION_ID;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ return env->GetStaticObjectField(cached_classes.Optimization_Mode, fID);
+}
+
+MIP_Problem::Control_Parameter_Name
+build_cxx_control_parameter_name(JNIEnv* env, jobject j_cp_name) {
+ jclass cp_name_class = env->GetObjectClass(j_cp_name);
+ CHECK_RESULT_ASSERT(env, cp_name_class);
+ jmethodID cp_name_ordinal_id
+ = env->GetMethodID(cp_name_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, cp_name_ordinal_id);
+ jint cp_name = env->CallIntMethod(j_cp_name, cp_name_ordinal_id);
+ CHECK_EXCEPTION_ASSERT(env);
+ if (cp_name == 0)
+ return MIP_Problem::PRICING;
+ else
+ PPL_JAVA_UNEXPECTED;
+}
+
+jobject
+build_java_control_parameter_name
+(JNIEnv* env,const MIP_Problem::Control_Parameter_Name& cp_name) {
+ jclass j_cp_name_class
+ = env->FindClass("parma_polyhedra_library/Control_Parameter_Name");
+ CHECK_RESULT_ASSERT(env, j_cp_name_class);
+ jfieldID cp_name_pricing_get_id
+ = env->GetStaticFieldID(j_cp_name_class, "PRICING",
+ "Lparma_polyhedra_library/Control_Parameter_Name;");
+ CHECK_RESULT_ASSERT(env, cp_name_pricing_get_id);
+ if (cp_name == MIP_Problem::PRICING)
+ return env->GetStaticObjectField(j_cp_name_class,
+ cp_name_pricing_get_id);
+ else
+ PPL_UNREACHABLE;
+}
+
+MIP_Problem::Control_Parameter_Value
+build_cxx_control_parameter_value(JNIEnv* env, jobject j_cp_value) {
+ jclass cp_value_class = env->GetObjectClass(j_cp_value);
+ CHECK_RESULT_ASSERT(env, cp_value_class);
+ jmethodID cp_value_ordinal_id
+ = env->GetMethodID(cp_value_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, cp_value_ordinal_id);
+ jint cp_value = env->CallIntMethod(j_cp_value, cp_value_ordinal_id);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (cp_value) {
+ case 0:
+ return MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+ case 1:
+ return MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+ case 2:
+ return MIP_Problem::PRICING_TEXTBOOK;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_control_parameter_value
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Value& cp_value) {
+ jclass j_cp_value_class
+ = env->FindClass("parma_polyhedra_library/Control_Parameter_Value");
+ CHECK_RESULT_ASSERT(env, j_cp_value_class);
+ const char* field_name;
+ switch (cp_value) {
+ case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+ field_name = "PRICING_STEEPEST_EDGE_FLOAT";
+ break;
+ case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+ field_name = "PRICING_STEEPEST_EDGE_EXACT";
+ break;
+ case MIP_Problem::PRICING_TEXTBOOK:
+ field_name = "PRICING_TEXTBOOK";
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ jfieldID fID = env->GetStaticFieldID(j_cp_value_class, field_name,
+ "Lparma_polyhedra_library/Control_Parameter_Value;");
+ CHECK_RESULT_ASSERT(env, fID);
+ return env->GetStaticObjectField(j_cp_value_class, fID);
+}
+
+PIP_Problem::Control_Parameter_Name
+build_cxx_pip_problem_control_parameter_name(JNIEnv* env, jobject j_cp_name) {
+ jclass cp_name_class = env->GetObjectClass(j_cp_name);
+ CHECK_RESULT_ASSERT(env, cp_name_class);
+ jmethodID cp_name_ordinal_id
+ = env->GetMethodID(cp_name_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, cp_name_ordinal_id);
+ jint cp_name = env->CallIntMethod(j_cp_name, cp_name_ordinal_id);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (cp_name) {
+ case 0:
+ return PIP_Problem::CUTTING_STRATEGY;
+ case 1:
+ return PIP_Problem::PIVOT_ROW_STRATEGY;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_pip_problem_control_parameter_name
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Name& cp_name) {
+ jclass j_cp_name_class
+ = env->FindClass("parma_polyhedra_library/PIP_Problem_Control_Parameter_Name");
+ CHECK_RESULT_ASSERT(env, j_cp_name_class);
+ jfieldID cp_name_cutting_strategy_get_id
+ = env->GetStaticFieldID(j_cp_name_class, "CUTTING_STRATEGY",
+ "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Name;");
+ CHECK_RESULT_ASSERT(env, cp_name_cutting_strategy_get_id);
+ jfieldID cp_name_pivot_row_strategy_get_id
+ = env->GetStaticFieldID(j_cp_name_class, "PIVOT_ROW_STRATEGY",
+ "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Name;");
+ CHECK_RESULT_ASSERT(env, cp_name_pivot_row_strategy_get_id);
+ switch (cp_name) {
+ case PIP_Problem::CUTTING_STRATEGY:
+ return env->GetStaticObjectField(j_cp_name_class,
+ cp_name_cutting_strategy_get_id);
+ case PIP_Problem::PIVOT_ROW_STRATEGY:
+ return env->GetStaticObjectField(j_cp_name_class,
+ cp_name_pivot_row_strategy_get_id);
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PIP_Problem::Control_Parameter_Value
+build_cxx_pip_problem_control_parameter_value(JNIEnv* env, jobject j_cp_value) {
+ jclass cp_value_class = env->GetObjectClass(j_cp_value);
+ CHECK_RESULT_ASSERT(env, cp_value_class);
+ jmethodID cp_value_ordinal_id
+ = env->GetMethodID(cp_value_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, cp_value_ordinal_id);
+ jint cp_value = env->CallIntMethod(j_cp_value, cp_value_ordinal_id);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (cp_value) {
+ case 0:
+ return PIP_Problem::CUTTING_STRATEGY_FIRST;
+ case 1:
+ return PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+ case 2:
+ return PIP_Problem::CUTTING_STRATEGY_ALL;
+ case 3:
+ return PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+ case 4:
+ return PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_pip_problem_control_parameter_value
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Value& cp_value) {
+ jclass j_cp_value_class
+ = env->FindClass("parma_polyhedra_library/PIP_Problem_Control_Parameter_Value");
+ CHECK_RESULT_ASSERT(env, j_cp_value_class);
+ const char* field_name;
+ switch (cp_value) {
+ case PIP_Problem::CUTTING_STRATEGY_FIRST:
+ field_name = "CUTTING_STRATEGY_FIRST";
+ break;
+ case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+ field_name = "CUTTING_STRATEGY_DEEPEST";
+ break;
+ case PIP_Problem::CUTTING_STRATEGY_ALL:
+ field_name = "CUTTING_STRATEGY_ALL";
+ break;
+ case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+ field_name = "PIVOT_ROW_STRATEGY_FIRST";
+ break;
+ case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+ field_name = "PIVOT_ROW_STRATEGY_MAX_COLUMN";
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ jfieldID fID = env->GetStaticFieldID(j_cp_value_class, field_name,
+ "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Value;");
+ CHECK_RESULT_ASSERT(env, fID);
+ return env->GetStaticObjectField(j_cp_value_class, fID);
+}
+
+Constraint
+build_cxx_constraint(JNIEnv* env, jobject j_constraint) {
+ jobject lhs_value
+ = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_lhs_ID);
+ jobject rhs_value
+ = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_rhs_ID);
+ jobject kind
+ = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_kind_ID);
+ Linear_Expression first_le = build_cxx_linear_expression(env, lhs_value);
+ Linear_Expression second_le = build_cxx_linear_expression(env, rhs_value);
+ jint rel_sym
+ = env->CallIntMethod(kind, cached_FMIDs.Relation_Symbol_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (rel_sym) {
+ case 0:
+ return Constraint(first_le < second_le);
+ case 1:
+ return Constraint(first_le <= second_le);
+ case 2:
+ return Constraint(first_le == second_le);
+ case 3:
+ return Constraint(first_le >= second_le);
+ case 4:
+ return Constraint(first_le > second_le);
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Linear_Expression
+build_cxx_linear_expression(JNIEnv* env, jobject j_le) {
+ jfieldID fID;
+ jclass current_class = env->GetObjectClass(j_le);
+ // LE_Variable
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Variable)) {
+ jmethodID mID = cached_FMIDs.Linear_Expression_Variable_var_id_ID;
+ jlong var_id = env->CallLongMethod(j_le, mID);
+ return Linear_Expression(Variable(var_id));
+ }
+ // LE_Coefficient
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Coefficient)) {
+ fID = cached_FMIDs.Linear_Expression_Coefficient_coeff_ID;
+ jobject ppl_coeff = env->GetObjectField(j_le, fID);
+ return Linear_Expression(build_cxx_coeff(env, ppl_coeff));
+ }
+ // LE_Sum
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Sum)) {
+ fID = cached_FMIDs.Linear_Expression_Sum_lhs_ID;
+ jobject l_value = env->GetObjectField(j_le, fID);
+ fID = cached_FMIDs.Linear_Expression_Sum_rhs_ID;
+ jobject r_value = env->GetObjectField(j_le, fID);
+ return build_cxx_linear_expression(env, l_value)
+ + build_cxx_linear_expression(env, r_value);
+ }
+ // LE_Times
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Times)) {
+ fID = cached_FMIDs.Linear_Expression_Times_coeff_ID;
+ jobject coeff_value = env->GetObjectField(j_le, fID);
+ fID = cached_FMIDs.Linear_Expression_Times_lin_expr_ID;
+ jobject le_value = env->GetObjectField(j_le, fID);
+ return build_cxx_coeff(env, coeff_value)
+ * build_cxx_linear_expression(env, le_value);
+ }
+ // LE_Difference
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Difference)) {
+ fID = cached_FMIDs.Linear_Expression_Difference_lhs_ID;
+ jobject l_value = env->GetObjectField(j_le,fID);
+ fID = cached_FMIDs.Linear_Expression_Difference_rhs_ID;
+ jobject r_value = env->GetObjectField(j_le, fID);
+ return build_cxx_linear_expression(env, l_value)
+ - build_cxx_linear_expression(env, r_value);
+ }
+ // LE_Unary_Minus
+ if (env->IsAssignableFrom(current_class,
+ cached_classes.Linear_Expression_Unary_Minus)) {
+ fID = cached_FMIDs.Linear_Expression_Unary_Minus_arg_ID;
+ jobject le_value = env->GetObjectField(j_le, fID);
+ return -build_cxx_linear_expression(env, le_value);
+ }
+ // All cases dealt with above.
+ PPL_JAVA_UNEXPECTED;
+}
+
+Generator
+build_cxx_generator(JNIEnv* env, jobject j_generator) {
+ jobject j_le
+ = env->GetObjectField(j_generator, cached_FMIDs.Generator_le_ID);
+ jobject generator_type
+ = env->GetObjectField(j_generator, cached_FMIDs.Generator_gt_ID);
+ jint generator_type_ordinal
+ = env->CallIntMethod(generator_type,
+ cached_FMIDs.Generator_Type_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (generator_type_ordinal) {
+ case 0:
+ return line(build_cxx_linear_expression(env, j_le));
+ case 1:
+ return ray(build_cxx_linear_expression(env, j_le));
+ case 2:
+ {
+ jobject j_div
+ = env->GetObjectField(j_generator, cached_FMIDs.Generator_div_ID);
+ return point(build_cxx_linear_expression(env, j_le),
+ build_cxx_coeff(env, j_div));
+ }
+ case 3:
+ {
+ jobject j_div
+ = env->GetObjectField(j_generator, cached_FMIDs.Generator_div_ID);
+ return closure_point(build_cxx_linear_expression(env, j_le),
+ build_cxx_coeff(env, j_div));
+ }
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+Grid_Generator
+build_cxx_grid_generator(JNIEnv* env, jobject j_grid_generator) {
+ jobject j_le
+ = env->GetObjectField(j_grid_generator, cached_FMIDs.Grid_Generator_le_ID);
+ jobject grid_generator_type
+ = env->GetObjectField(j_grid_generator, cached_FMIDs.Grid_Generator_gt_ID);
+ jint grid_generator_type_ordinal
+ = env->CallIntMethod(grid_generator_type,
+ cached_FMIDs.Grid_Generator_Type_ordinal_ID);
+ CHECK_EXCEPTION_ASSERT(env);
+ switch (grid_generator_type_ordinal) {
+ case 0:
+ return grid_line(build_cxx_linear_expression(env, j_le));
+ case 1:
+ {
+ jobject j_div = env->GetObjectField(j_grid_generator,
+ cached_FMIDs.Grid_Generator_div_ID);
+ return parameter(build_cxx_linear_expression(env, j_le),
+ build_cxx_coeff(env, j_div));
+ }
+ case 2:
+ {
+ jobject j_div = env->GetObjectField(j_grid_generator,
+ cached_FMIDs.Grid_Generator_div_ID);
+ return grid_point(build_cxx_linear_expression(env, j_le),
+ build_cxx_coeff(env, j_div));
+ }
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_linear_expression_coefficient(JNIEnv* env, const Coefficient& c) {
+ jobject j_coeff = build_java_coeff(env, c);
+ jobject ret
+ = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+ cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+ j_coeff);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+void
+set_generator(JNIEnv* env, jobject dst, jobject src) {
+ jobject src_gt = env->GetObjectField(src, cached_FMIDs.Generator_gt_ID);
+ env->SetObjectField(dst, cached_FMIDs.Generator_gt_ID, src_gt);
+ jobject src_le = env->GetObjectField(src, cached_FMIDs.Generator_le_ID);
+ env->SetObjectField(dst, cached_FMIDs.Generator_le_ID, src_le);
+ jobject src_div = env->GetObjectField(src, cached_FMIDs.Generator_div_ID);
+ env->SetObjectField(dst, cached_FMIDs.Generator_div_ID, src_div);
+}
+
+void
+set_pair_element(JNIEnv* env, jobject dst_pair, int arg, jobject src) {
+ switch (arg) {
+ case 0:
+ env->SetObjectField(dst_pair, cached_FMIDs.Pair_first_ID, src);
+ break;
+ case 1:
+ env->SetObjectField(dst_pair, cached_FMIDs.Pair_second_ID, src);
+ break;
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+get_pair_element(JNIEnv* env, int arg, jobject j_pair) {
+ switch (arg) {
+ case 0:
+ return env->GetObjectField(j_pair, cached_FMIDs.Pair_first_ID);
+ case 1:
+ return env->GetObjectField(j_pair, cached_FMIDs.Pair_second_ID);
+ default:
+ PPL_JAVA_UNEXPECTED;
+ }
+}
+
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c) {
+ jobject lhs = build_linear_expression(env, c);
+ jobject rhs
+ = build_java_linear_expression_coefficient(env, -c.inhomogeneous_term());
+ jfieldID fID;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ fID = cached_FMIDs.Relation_Symbol_EQUAL_ID;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ fID = cached_FMIDs.Relation_Symbol_GREATER_OR_EQUAL_ID;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ fID = cached_FMIDs.Relation_Symbol_GREATER_THAN_ID;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+ jobject relation
+ = env->GetStaticObjectField(cached_classes.Relation_Symbol, fID);
+ jobject ret = env->NewObject(cached_classes.Constraint,
+ cached_FMIDs.Constraint_init_ID,
+ lhs, relation, rhs);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg) {
+ jobject j_mod = build_java_coeff(env, cg.modulus());
+ jobject j_lhs = build_linear_expression(env, cg);
+ jobject j_rhs
+ = build_java_linear_expression_coefficient(env, -cg.inhomogeneous_term());
+ jobject ret = env->NewObject(cached_classes.Congruence,
+ cached_FMIDs.Congruence_init_ID,
+ j_lhs, j_rhs, j_mod);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+jobject
+build_java_generator(JNIEnv* env, const Generator& g) {
+ jobject j_g_le = build_linear_expression(env, g);
+ jobject ret;
+ switch (g.type()) {
+ case Generator::LINE:
+ ret = env->CallStaticObjectMethod(cached_classes.Generator,
+ cached_FMIDs.Generator_line_ID,
+ j_g_le);
+ break;
+ case Generator::RAY:
+ ret = env->CallStaticObjectMethod(cached_classes.Generator,
+ cached_FMIDs.Generator_ray_ID,
+ j_g_le);
+ break;
+ case Generator::POINT:
+ {
+ const Coefficient& divisor = g.divisor();
+ jobject j_div = build_java_coeff(env, divisor);
+ ret = env->CallStaticObjectMethod(cached_classes.Generator,
+ cached_FMIDs.Generator_point_ID,
+ j_g_le, j_div);
+ break;
+ }
+ case Generator::CLOSURE_POINT:
+ {
+ const Coefficient& divisor = g.divisor();
+ jobject j_div = build_java_coeff(env, divisor);
+ ret = env->CallStaticObjectMethod(cached_classes.Generator,
+ cached_FMIDs.Generator_closure_point_ID,
+ j_g_le, j_div);
+ break;
+ }
+ default:
+ PPL_UNREACHABLE;
+ }
+ CHECK_EXCEPTION_THROW(env);
+ return ret;
+}
+
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& g) {
+ jobject j_g_le = build_linear_expression(env, g);
+ jobject ret;
+ switch (g.type()) {
+ case Grid_Generator::LINE:
+ ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+ cached_FMIDs.Grid_Generator_grid_line_ID,
+ j_g_le);
+ break;
+ case Grid_Generator::PARAMETER:
+ {
+ const Coefficient& divisor = g.divisor();
+ jobject j_div = build_java_coeff(env, divisor);
+ ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+ cached_FMIDs.Grid_Generator_parameter_ID,
+ j_g_le, j_div);
+ break;
+ }
+ case Grid_Generator::POINT:
+ {
+ const Coefficient& divisor = g.divisor();
+ jobject j_div = build_java_coeff(env, divisor);
+ ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+ cached_FMIDs.Grid_Generator_grid_point_ID,
+ j_g_le, j_div);
+ break;
+ }
+ default:
+ PPL_UNREACHABLE;
+ }
+ CHECK_EXCEPTION_THROW(env);
+ return ret;
+}
+
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs) {
+ jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+ cached_FMIDs.Constraint_System_init_ID);
+ CHECK_RESULT_THROW(env, j_cs);
+ for (Constraint_System::const_iterator v_begin = cs.begin(),
+ v_end = cs.end(); v_begin != v_end; ++v_begin) {
+ jobject j_constraint = build_java_constraint(env, *v_begin);
+ env->CallBooleanMethod(j_cs,
+ cached_FMIDs.Constraint_System_add_ID,
+ j_constraint);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ return j_cs;
+}
+
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs) {
+ jobject j_gs = env->NewObject(cached_classes.Generator_System,
+ cached_FMIDs.Generator_System_init_ID);
+ CHECK_RESULT_THROW(env, j_gs);
+ for (Generator_System::const_iterator v_begin = gs.begin(),
+ v_end = gs.end(); v_begin != v_end; ++v_begin) {
+ jobject j_generator = build_java_generator(env, *v_begin);
+ env->CallBooleanMethod(j_gs,
+ cached_FMIDs.Generator_System_add_ID,
+ j_generator);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ return j_gs;
+}
+
+jobject
+build_java_grid_generator_system(JNIEnv* env,
+ const Grid_Generator_System& gs) {
+ jobject j_gs = env->NewObject(cached_classes.Grid_Generator_System,
+ cached_FMIDs.Grid_Generator_System_init_ID);
+ CHECK_RESULT_THROW(env, j_gs);
+ for (Grid_Generator_System::const_iterator v_begin = gs.begin(),
+ v_end = gs.end(); v_begin != v_end; ++v_begin) {
+ jobject j_generator = build_java_grid_generator(env, *v_begin);
+ env->CallBooleanMethod(j_gs,
+ cached_FMIDs.Grid_Generator_System_add_ID,
+ j_generator);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ return j_gs;
+}
+
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs) {
+ jobject j_cgs = env->NewObject(cached_classes.Congruence_System,
+ cached_FMIDs.Congruence_System_init_ID);
+ CHECK_RESULT_THROW(env, j_cgs);
+ for (Congruence_System::const_iterator v_begin = cgs.begin(),
+ v_end = cgs.end(); v_begin != v_end; ++v_begin) {
+ jobject j_congruence = build_java_congruence(env,*v_begin);
+ env->CallBooleanMethod(j_cgs,
+ cached_FMIDs.Congruence_System_add_ID,
+ j_congruence);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ return j_cgs;
+}
+
+jobject
+build_java_artificial_parameter
+(JNIEnv* env, const PIP_Tree_Node::Artificial_Parameter& art) {
+ jobject j_le = build_linear_expression(env, art);
+ jobject j_den = build_java_coeff(env, art.denominator());
+ jobject ret = env->NewObject(cached_classes.Artificial_Parameter,
+ cached_FMIDs.Artificial_Parameter_init_ID,
+ j_le, j_den);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+void
+Java_Variable_output_function(std::ostream& s, Variable v) {
+ // Use cached Java Virtual Machine pointer to retrieve JNI env.
+ JavaVM* jvm = cached_classes.jvm;
+ JNIEnv *env = 0;
+ jvm->AttachCurrentThread((void **)&env, NULL);
+ CHECK_EXCEPTION_ASSERT(env);
+ // Retrieve stringifier object.
+ jclass var_class = cached_classes.Variable;
+ jfieldID fID = cached_FMIDs.Variable_stringifier_ID;
+ jobject stringifier = env->GetStaticObjectField(var_class, fID);
+ CHECK_RESULT_THROW(env, stringifier);
+ // Use it to get the Java string for the variable.
+ jmethodID mID = cached_FMIDs.Variable_Stringifier_stringify_ID;
+#ifndef NDEBUG
+ {
+ // Dynamically retrieve stringifier class and use it to compute
+ // the corresponding method ID, so as to compare it with cached one.
+ jclass dyn_class = env->GetObjectClass(stringifier);
+ jmethodID dyn_mID = env->GetMethodID(dyn_class, "stringify",
+ "(J)Ljava/lang/String;");
+ CHECK_RESULT_ASSERT(env, mID == dyn_mID);
+ }
+#endif // #ifndef NDEBUG
+ jlong j_var_id = v.id();
+ jstring bi_string
+ = (jstring) env->CallObjectMethod(stringifier, mID, j_var_id);
+ CHECK_EXCEPTION_THROW(env);
+ // Convert the string and print it on C++ stream.
+ const char* nativeString = env->GetStringUTFChars(bi_string, 0);
+ CHECK_RESULT_THROW(env, nativeString);
+ s << nativeString;
+ env->ReleaseStringUTFChars(bi_string, nativeString);
+}
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Java/jni/ppl_java_common_defs.hh b/interfaces/Java/jni/ppl_java_common_defs.hh
new file mode 100644
index 0000000..fb33500
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common_defs.hh
@@ -0,0 +1,899 @@
+/* Domain-independent part of the Java interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_java_common_defs_hh
+#define PPL_ppl_java_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+
+#include <jni.h>
+#include "interfaced_boxes.hh"
+#include "marked_pointers.hh"
+
+#define PPL_JAVA_UNEXPECTED \
+ throw std::runtime_error("PPL Java interface internal error")
+
+#define CATCH_ALL \
+ catch(const Java_ExceptionOccurred& e) { \
+ } \
+ catch(const std::overflow_error& e) { \
+ handle_exception(env, e); \
+ } \
+ catch(const std::length_error& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const std::bad_alloc& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const std::domain_error& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const std::invalid_argument& e) { \
+ handle_exception(env, e); \
+ } \
+ catch(const std::logic_error& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const std::exception& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const timeout_exception& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (const deterministic_timeout_exception& e) { \
+ handle_exception(env, e); \
+ } \
+ catch (...) { \
+ handle_exception(env); \
+ }
+
+#define CHECK_EXCEPTION_ASSERT(env) \
+ assert(!env->ExceptionOccurred())
+#define CHECK_EXCEPTION_THROW(env) \
+ do { \
+ if (env->ExceptionOccurred()) \
+ throw Java_ExceptionOccurred(); \
+ } while (0)
+#define CHECK_EXCEPTION_RETURN(env, val) \
+ do { \
+ if (env->ExceptionOccurred()) \
+ return val; \
+ } while (0)
+#define CHECK_EXCEPTION_RETURN_VOID(env) \
+ do { \
+ if (env->ExceptionOccurred()) \
+ return; \
+ } while (0)
+#define CHECK_RESULT_ABORT(env, cond) \
+ do { \
+ if (!(cond)) \
+ abort(); \
+ } while (0)
+#define CHECK_RESULT_ASSERT(env, cond) \
+ assert(cond)
+#define CHECK_RESULT_THROW(env, cond) \
+ do { \
+ if (!(cond)) \
+ throw Java_ExceptionOccurred(); \
+ } while (0)
+#define CHECK_RESULT_RETURN(env, cond, val) \
+ do { \
+ if (!(cond)) \
+ return val; \
+ } while (0)
+#define CHECK_RESULT_RETURN_VOID(env, cond) \
+ do { \
+ if (!(cond)) \
+ return; \
+ } while (0)
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+struct Java_ExceptionOccurred : public std::exception {
+};
+
+class timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+class deterministic_timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+extern Parma_Polyhedra_Library::Watchdog* p_timeout_object;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+extern Weightwatch* p_deterministic_timeout_object;
+
+void reset_timeout();
+
+void reset_deterministic_timeout();
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e);
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&);
+
+void
+handle_exception(JNIEnv* env, const std::exception& e);
+
+void
+handle_exception(JNIEnv* env, const timeout_exception& e);
+
+void
+handle_exception(JNIEnv* env, const deterministic_timeout_exception& e);
+
+void
+handle_exception(JNIEnv* env);
+
+//! A cache for global references to Java classes.
+/*!
+ The cache is loaded by \c Parma_Polyhedra_Library.initialize_library();
+ It is cleared by \c Parma_Polyhedra_Library.finalize_library().
+*/
+class Java_Class_Cache {
+public:
+ // The Java VM pointer (not a class, but sometimes needed).
+ JavaVM* jvm;
+ // Non-PPL types.
+ jclass Boolean;
+ jclass Integer;
+ jclass Long;
+ jclass Iterator;
+ // PPL types.
+ jclass Artificial_Parameter;
+ jclass Artificial_Parameter_Sequence;
+ jclass Bounded_Integer_Type_Overflow;
+ jclass Bounded_Integer_Type_Representation;
+ jclass Bounded_Integer_Type_Width;
+ jclass By_Reference;
+ jclass Coefficient;
+ jclass Congruence;
+ jclass Constraint;
+ jclass Generator;
+ jclass Grid_Generator;
+ jclass Generator_Type;
+ jclass Grid_Generator_Type;
+ jclass Constraint_System;
+ jclass Congruence_System;
+ jclass Generator_System;
+ jclass Grid_Generator_System;
+ jclass Linear_Expression;
+ jclass Linear_Expression_Coefficient;
+ jclass Linear_Expression_Difference;
+ jclass Linear_Expression_Sum;
+ jclass Linear_Expression_Times;
+ jclass Linear_Expression_Unary_Minus;
+ jclass Linear_Expression_Variable;
+ jclass MIP_Problem_Status;
+ jclass Optimization_Mode;
+ jclass Pair;
+ jclass PIP_Problem_Control_Parameter_Name;
+ jclass PIP_Problem_Control_Parameter_Value;
+ jclass PIP_Problem_Status;
+ jclass Poly_Con_Relation;
+ jclass Poly_Gen_Relation;
+ jclass PPL_Object;
+ jclass Relation_Symbol;
+ jclass Variable;
+ jclass Variable_Stringifier;
+ jclass Variables_Set;
+
+ //! Default constructor.
+ Java_Class_Cache();
+
+ //! Initializes all cache fields.
+ void init_cache(JNIEnv* env);
+
+ //! Resets all fields to \c NULL.
+ void clear_cache(JNIEnv* env);
+
+private:
+ //! Sets \p field to a global reference to Java class called \p name.
+ void init_cache(JNIEnv* env, jclass& field, const char* name);
+
+ //! Resets \p field to \c NULL, deleting the global reference (if any).
+ void clear_cache(JNIEnv* env, jclass& field);
+
+ // Private and not implemented: copy construction not allowed.
+ Java_Class_Cache(const Java_Class_Cache&);
+ // Private and not implemented: copy assignment not allowed.
+ Java_Class_Cache& operator=(const Java_Class_Cache&);
+};
+
+//! A cache for field and method IDs of Java classes.
+/*!
+ The IDs for fields and methods of PPL Java classes are automatically
+ by the static initializer of the corresponding Java class.
+ The static initializers of some PPL Java class also stores the IDs
+ for fields and methods of non-PPL classes (e.g., Boolean, Long, etc.).
+*/
+struct Java_FMID_Cache {
+ // Non-PPL type method IDs: stored when loading Coefficient.
+ jmethodID Boolean_valueOf_ID;
+ jmethodID Boolean_boolValue_ID;
+ jmethodID Integer_valueOf_ID;
+ jmethodID Integer_intValue_ID;
+ jmethodID Long_valueOf_ID;
+ jmethodID Long_longValue_ID;
+
+ // PPL type field and method IDs.
+ // Artificial_Parameter.
+ jfieldID Artificial_Parameter_le_ID;
+ jfieldID Artificial_Parameter_den_ID;
+ jmethodID Artificial_Parameter_init_ID;
+ jmethodID Artificial_Parameter_Sequence_init_ID;
+ jmethodID Artificial_Parameter_Sequence_add_ID;
+ // Bounded_Integer_Type_Overflow.
+ jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_WRAPS_ID;
+ jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_UNDEFINED_ID;
+ jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_IMPOSSIBLE_ID;
+ jmethodID Bounded_Integer_Type_Overflow_ordinal_ID;
+ // Bounded_Integer_Type_Representation.
+ jfieldID Bounded_Integer_Type_Representation_UNSIGNED_ID;
+ jfieldID Bounded_Integer_Type_Representation_SIGNED_2_COMPLEMENT_ID;
+ jmethodID Bounded_Integer_Type_Representation_ordinal_ID;
+ // Bounded_Integer_Type_Width.
+ jfieldID Bounded_Integer_Type_Width_BITS_8_ID;
+ jfieldID Bounded_Integer_Type_Width_BITS_16_ID;
+ jfieldID Bounded_Integer_Type_Width_BITS_32_ID;
+ jfieldID Bounded_Integer_Type_Width_BITS_64_ID;
+ jfieldID Bounded_Integer_Type_Width_BITS_128_ID;
+ jmethodID Bounded_Integer_Type_Width_ordinal_ID;
+ // By_Reference.
+ jfieldID By_Reference_obj_ID;
+ jmethodID By_Reference_init_ID;
+ // Coefficient.
+ jfieldID Coefficient_value_ID;
+ jmethodID Coefficient_init_from_String_ID;
+ jmethodID Coefficient_toString_ID;
+ // Complexity_Class.
+ jmethodID Complexity_Class_ordinal_ID;
+ // Congruence.
+ jfieldID Congruence_mod_ID;
+ jfieldID Congruence_lhs_ID;
+ jfieldID Congruence_rhs_ID;
+ jmethodID Congruence_init_ID;
+ // Constraint.
+ jfieldID Constraint_lhs_ID;
+ jfieldID Constraint_rhs_ID;
+ jfieldID Constraint_kind_ID;
+ jmethodID Constraint_init_ID;
+ // Degenerate_Element.
+ jmethodID Degenerate_Element_ordinal_ID;
+ // Generator.
+ jfieldID Generator_gt_ID;
+ jfieldID Generator_le_ID;
+ jfieldID Generator_div_ID;
+ jmethodID Generator_line_ID;
+ jmethodID Generator_ray_ID;
+ jmethodID Generator_point_ID;
+ jmethodID Generator_closure_point_ID;
+ // Grid_Generator.
+ jfieldID Grid_Generator_gt_ID;
+ jfieldID Grid_Generator_le_ID;
+ jfieldID Grid_Generator_div_ID;
+ jmethodID Grid_Generator_grid_line_ID;
+ jmethodID Grid_Generator_parameter_ID;
+ jmethodID Grid_Generator_grid_point_ID;
+ // (Grid_) Generator_Type.
+ jmethodID Generator_Type_ordinal_ID;
+ jmethodID Grid_Generator_Type_ordinal_ID;
+ // Systems of Constraint, Congruence, Generator and Grid_Generator.
+ jmethodID Constraint_System_init_ID;
+ jmethodID Constraint_System_add_ID;
+ jmethodID Congruence_System_init_ID;
+ jmethodID Congruence_System_add_ID;
+ jmethodID Generator_System_init_ID;
+ jmethodID Generator_System_add_ID;
+ jmethodID Grid_Generator_System_init_ID;
+ jmethodID Grid_Generator_System_add_ID;
+ // System_Iterator: stored when loading Constraint_System.
+ jmethodID System_iterator_ID;
+ jmethodID System_Iterator_has_next_ID;
+ jmethodID System_Iterator_next_ID;
+ // Linear_Expression.
+ jmethodID Linear_Expression_sum_ID;
+ jmethodID Linear_Expression_times_ID;
+ // Classes extending Linear_Expression.
+ jfieldID Linear_Expression_Coefficient_coeff_ID;
+ jmethodID Linear_Expression_Coefficient_init_ID;
+ jfieldID Linear_Expression_Difference_lhs_ID;
+ jfieldID Linear_Expression_Difference_rhs_ID;
+ jfieldID Linear_Expression_Sum_lhs_ID;
+ jfieldID Linear_Expression_Sum_rhs_ID;
+ jfieldID Linear_Expression_Times_coeff_ID;
+ jfieldID Linear_Expression_Times_lin_expr_ID;
+ jmethodID Linear_Expression_Times_init_from_coeff_var_ID;
+ jfieldID Linear_Expression_Unary_Minus_arg_ID;
+ jmethodID Linear_Expression_Variable_init_ID;
+ jmethodID Linear_Expression_Variable_var_id_ID;
+ // MIP_Problem_Status.
+ jfieldID MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID;
+ jfieldID MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID;
+ jfieldID MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID;
+ jmethodID MIP_Problem_Status_ordinal_ID;
+ // Optmization_Mode.
+ jfieldID Optimization_Mode_MAXIMIZATION_ID;
+ jfieldID Optimization_Mode_MINIMIZATION_ID;
+ jmethodID Optimization_Mode_ordinal_ID;
+ // PIP_Problem_Control_Parameter_Name.
+ jfieldID PIP_Problem_Control_Parameter_Name_CUTTING_STRATEGY_ID;
+ jfieldID PIP_Problem_Control_Parameter_Name_PIVOT_ROW_STRATEGY;
+ jmethodID PIP_Problem_Control_Parameter_Name_ordinal_ID;
+ // PIP_Problem_Control_Parameter_Value.
+ jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_FIRST_ID;
+ jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_DEEPEST_ID;
+ jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_ALL_ID;
+ jfieldID PIP_Problem_Control_Parameter_Value_PIVOT_ROW_STRATEGY_FIRST_ID;
+ jfieldID PIP_Problem_Control_Parameter_Value_PIVOT_ROW_STRATEGY_MAX_COLUMN_ID;
+ jmethodID PIP_Problem_Control_Parameter_Value_ordinal_ID;
+ // PIP_Problem_Status.
+ jfieldID PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID;
+ jfieldID PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID;
+ jmethodID PIP_Problem_Status_ordinal_ID;
+ // Pair.
+ jfieldID Pair_first_ID;
+ jfieldID Pair_second_ID;
+ // Poly_Con_Relation and Poly_Gen_Relation.
+ jmethodID Poly_Con_Relation_init_ID;
+ jmethodID Poly_Gen_Relation_init_ID;
+ // PPL_Object.
+ jfieldID PPL_Object_ptr_ID;
+ // Relation_Symbol.
+ jfieldID Relation_Symbol_EQUAL_ID;
+ jfieldID Relation_Symbol_GREATER_OR_EQUAL_ID;
+ jfieldID Relation_Symbol_GREATER_THAN_ID;
+ jmethodID Relation_Symbol_ordinal_ID;
+ // Variable.
+ jfieldID Variable_varid_ID;
+ jfieldID Variable_stringifier_ID;
+ jmethodID Variable_init_ID;
+ // Variable_Stringifier.
+ jmethodID Variable_Stringifier_stringify_ID;
+ // Variables_Set.
+ jmethodID Variables_Set_init_ID;
+ jmethodID Variables_Set_add_ID;
+ jmethodID Variables_Set_iterator_ID;
+ // Iterators on Variables_Set.
+ jmethodID Variables_Set_Iterator_has_next_ID;
+ jmethodID Variables_Set_Iterator_next_ID;
+};
+
+//! The cached class references.
+extern Java_Class_Cache cached_classes;
+
+//! The field and method ID cache.
+extern Java_FMID_Cache cached_FMIDs;
+
+
+/*! \brief
+ Builds an unsigned C++ number from the Java native number \p value.
+
+ \param value
+ The Java native number of type V to be converted.
+
+ \exception std::invalid_argument
+ Thrown if \p value is negative.
+*/
+template <typename U, typename V>
+U
+jtype_to_unsigned(const V& value);
+
+//! Builds a Java Boolean from C++ bool \p value.
+jobject
+bool_to_j_boolean_class(JNIEnv* env, const bool value);
+
+//! Returns the Java int stored in Java Integer \p j_integer.
+jint
+j_integer_to_j_int(JNIEnv* env, jobject j_integer);
+
+//! Builds a Java Integer from Java int \p value.
+jobject
+j_int_to_j_integer(JNIEnv* env, jint value);
+
+//! Returns the Java long stored in Java Long \p j_long.
+jlong
+j_long_class_to_j_long(JNIEnv* env, jobject j_long);
+
+//! Builds a Java Long from Java long \p value.
+jobject
+j_long_to_j_long_class(JNIEnv* env, jlong value);
+
+/*! \brief
+ Returns \c true if and only if the Java object \p ppl_object
+ refers to a C++ object.
+*/
+bool
+is_java_marked(JNIEnv* env, jobject ppl_object);
+
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Poly_Gen_Relation
+ from C++ Poly_Gen_Relation \p r.
+*/
+jobject
+build_java_poly_gen_relation(JNIEnv* env, Poly_Gen_Relation& r);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Poly_Con_Relation
+ from C++ Poly_Con_Relation \p r.
+*/
+jobject
+build_java_poly_con_relation(JNIEnv* env, Poly_Con_Relation& r);
+
+/*! \brief
+ Builds a C++ Variables_Set
+ from Java parma_polyhedra_library::Variables_Set \p v_set.
+*/
+Variables_Set
+build_cxx_variables_set(JNIEnv* env, jobject v_set);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Variables_Set
+ from C++ Variables_Set \p v_set.
+*/
+jobject
+build_java_variables_set(JNIEnv* env, const Variables_Set& v_set);
+
+/*! \brief
+ Builds a C++ Relation_Symbol
+ from Java parma_polyhedra_library::Relation_Symbol \p j_relsym.
+*/
+Relation_Symbol
+build_cxx_relsym(JNIEnv* env, jobject j_relsym);
+
+/*! \brief
+ Builds a C++ Bounded_Integer_Type_Overflow
+ from Java parma_polyhedra_library::Bounded_Integer_Type_Overflow
+ \p j_bounded_overflow.
+*/
+Bounded_Integer_Type_Overflow
+build_cxx_bounded_overflow(JNIEnv* env, jobject j_bounded_overflow);
+
+/*! \brief
+ Builds a C++ Bounded_Integer_Type_Width
+ from Java parma_polyhedra_library::Bounded_Integer_Type_Width
+ \p j_bounded_width.
+*/
+Bounded_Integer_Type_Width
+build_cxx_bounded_width(JNIEnv* env, jobject j_bounded_width);
+
+/*! \brief
+ Builds a C++ Bounded_Integer_Type_Representation
+ from Java parma_polyhedra_library::Bounded_Integer_Type_Representation
+ \p j_bounded_rep.
+*/
+Bounded_Integer_Type_Representation
+build_cxx_bounded_rep(JNIEnv* env, jobject j_bounded_rep);
+
+/*! \brief
+ Builds a C++ Optimization_Mode
+ from Java parma_polyhedra_library::Optimization_Mode \p j_opt_mode.
+*/
+Optimization_Mode
+build_cxx_optimization_mode(JNIEnv* env, jobject j_opt_mode);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Optimization_Mode
+ from C++ Optimization_Mode \p opt_mode.
+*/
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode);
+
+/*! \brief
+ Builds a C++ MIP_Problem::Control_Parameter_Name
+ from Java parma_polyhedra_library::Control_Parameter_Name \p j_cp_name.
+*/
+MIP_Problem::Control_Parameter_Name
+build_cxx_control_parameter_name(JNIEnv* env, jobject j_cp_name);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Control_Parameter_Name
+ from C++ MIP_Problem::Control_Parameter_Name \p cp_name.
+*/
+jobject
+build_java_control_parameter_name
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Name& cp_name);
+
+/*! \brief
+ Builds a C++ MIP_Problem::Control_Parameter_Value
+ from Java parma_polyhedra_library::Control_Parameter_Value \p j_cp_value.
+*/
+MIP_Problem::Control_Parameter_Value
+build_cxx_control_parameter_value(JNIEnv* env, jobject j_cp_value);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Control_Parameter_Value
+ from C++ MIP_Problem::Control_Parameter_Value \p cp_value.
+*/
+jobject
+build_java_control_parameter_value
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Value& cp_value);
+
+/*! \brief
+ Builds a C++ PIP_Problem::Control_Parameter_Name
+ from Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Name
+ \p j_cp_name.
+*/
+PIP_Problem::Control_Parameter_Name
+build_cxx_pip_problem_control_parameter_name(JNIEnv* env, jobject j_cp_name);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Name
+ from C++ PIP_Problem::Control_Parameter_Name \p cp_name.
+*/
+jobject
+build_java_pip_problem_control_parameter_name
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Name& cp_name);
+
+/*! \brief
+ Builds a C++ PIP_Problem::Control_Parameter_Value
+ from Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Value
+ \p j_cp_value.
+*/
+PIP_Problem::Control_Parameter_Value
+build_cxx_pip_problem_control_parameter_value(JNIEnv* env, jobject j_cp_value);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Control_Parameter_Value
+ from C++ PIP_Problem::Control_Parameter_Value \p cp_value.
+*/
+jobject
+build_java_pip_problem_control_parameter_value
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Value& cp_value);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::MIP_Problem_Status
+ from C++ MIP_Problem_Status \p mip_status.
+*/
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::PIP_Problem_Status
+ from C++ PIP_Problem_Status \p pip_status.
+*/
+jobject
+build_java_pip_status(JNIEnv* env, const PIP_Problem_Status& pip_status);
+
+/*! \brief
+ Builds a C++ Variable
+ from Java parma_polyhedra_library::Variable \p j_var.
+*/
+Variable
+build_cxx_variable(JNIEnv* env, jobject j_var);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Variable
+ from C++ Variable \p var.
+*/
+jobject
+build_java_variable(JNIEnv* env, const Variable var);
+
+/*! \brief
+ The customizable variable output function for Java interface.
+
+ Customization is obtained by providing an object implementing interface
+ <CODE>Variable_Stringifier</CODE> and attaching it to class
+ <CODE>Variable</CODE> using static method <CODE>setStringifier</CODE>.
+*/
+void
+Java_Variable_output_function(std::ostream& s, Variable v);
+
+/*! \brief
+ Builds a C++ Coefficient
+ from Java parma_polyhedra_library::Coefficient \p j_coeff.
+*/
+Coefficient
+build_cxx_coeff(JNIEnv* env, jobject j_coeff);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Coefficient
+ from C++ Coefficient \p ppl_coeff.
+*/
+jobject
+build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff);
+
+/*! \brief
+ Builds a C++ Constraint
+ from Java parma_polyhedra_library::Constraint \p j_constraint.
+*/
+Constraint
+build_cxx_constraint(JNIEnv* env, jobject j_constraint);
+
+/*! \brief
+ Builds a C++ Artificial_Parameter
+ from Java parma_polyhedra_library::Artificial_Parameter
+ \p j_artificial_parameter.
+*/
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_ap);
+
+/*! \brief
+ Builds a C++ Linear_Expression
+ from Java parma_polyhedra_library::Linear_Expression \p j_le.
+*/
+Linear_Expression
+build_cxx_linear_expression(JNIEnv* env, jobject j_le);
+
+/*! \brief
+ Builds a C++ Congruence
+ from Java parma_polyhedra_library::Congruence \p j_cg.
+*/
+Congruence
+build_cxx_congruence(JNIEnv* env, jobject j_cg);
+
+/*! \brief
+ Builds a C++ Generator
+ from Java parma_polyhedra_library::Generator \p j_g.
+*/
+Generator
+build_cxx_generator(JNIEnv* env, jobject j_g);
+
+/*! \brief
+ Builds a C++ Grid_Generator
+ from Java parma_polyhedra_library::Grid_Generator \p j_g.
+*/
+Grid_Generator
+build_cxx_grid_generator(JNIEnv* env, jobject j_g);
+
+/*! \brief
+ Builds a C++ Grid_Generator_System
+ from Java parma_polyhedra_library::Grid_Generator_System \p j_gs.
+*/
+Grid_Generator_System
+build_cxx_grid_generator_system(JNIEnv* env, jobject j_gs);
+
+/*! \brief
+ Builds a C++ Constraint_System
+ from Java parma_polyhedra_library::Constraint_System \p j_cs.
+*/
+Constraint_System
+build_cxx_constraint_system(JNIEnv* env, jobject j_cs);
+
+/*! \brief
+ Builds a C++ Artificial_Parameter
+ from Java parma_polyhedra_library::Artificial_Parameter \p j_art_param.
+*/
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_art_param);
+
+/*! \brief
+ Builds a C++ Artificial_Parameter_Sequence
+ from Java parma_polyhedra_library::Artificial_Parameter_Sequence \p j_aps.
+*/
+PIP_Tree_Node::Artificial_Parameter_Sequence
+build_cxx_artificial_parameter_sequence(JNIEnv* env, jobject j_aps);
+
+/*! \brief
+ Builds a C++ Generator_System
+ from Java parma_polyhedra_library::Generator_System \p j_gs.
+*/
+Generator_System
+build_cxx_generator_system(JNIEnv* env, jobject j_gs);
+
+/*! \brief
+ Builds a C++ Congruence_System
+ from Java parma_polyhedra_library::Congruence_System \p j_cgs.
+*/
+Congruence_System
+build_cxx_congruence_system(JNIEnv* env, jobject j_cgs);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Constraint
+ from C++ Constraint \p c.
+*/
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Artificial_Parameter
+ from C++ Artificial_Parameter \p ap.
+*/
+jobject
+build_java_artificial_parameter(JNIEnv* env,
+ const PIP_Tree_Node::Artificial_Parameter& ap);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Congruence
+ from C++ Congruence \p cg.
+*/
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Generator
+ from C++ Generator \p g.
+*/
+jobject
+build_java_generator(JNIEnv* env, const Generator& g);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Grid_Generator
+ from C++ Grid_Generator \p g.
+*/
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& g);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Constraint_System
+ from C++ Constraint_System \p cs.
+*/
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Artificial_Parameter_Sequence
+ from C++ Artificial_Parameter_Sequence \p aps.
+*/
+jobject
+build_java_artificial_parameter_sequence
+(JNIEnv* env, const PIP_Tree_Node::Artificial_Parameter_Sequence& aps);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Grid_Generator_System
+ from C++ Grid_Generator_System \p gs.
+*/
+jobject
+build_java_grid_generator_system(JNIEnv* env, const Grid_Generator_System& gs);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Generator_System
+ from C++ Generator_System \p gs.
+*/
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Congruence_System
+ from C++ Congruence_System \p cgs.
+*/
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Linear_Expression_Coefficient
+ from C++ Coefficient \p coeff.
+*/
+jobject
+build_java_linear_expression_coefficient(JNIEnv* env, const Coefficient& coeff);
+
+/*! \brief
+ Sets Java parma_polyhedra_library::Generator \p dst
+ to have the same value as \p src.
+*/
+void
+set_generator(JNIEnv* env, jobject dst, jobject src);
+
+/*! \brief
+ Sets Java Coefficient \p dst to have the same value as \p src.
+*/
+void
+set_coefficient(JNIEnv* env, jobject dst, jobject src);
+
+/*! \brief
+ Modifies parma_polyhedra_library::By_Reference object \p by_ref_dst
+ so that it references object \p src.
+*/
+void
+set_by_reference(JNIEnv* env, jobject by_ref_dst, jobject src);
+
+/*! \brief
+ Returns the object referenced by
+ parma_polyhedra_library::By_Reference object \p by_reference.
+*/
+jobject
+get_by_reference(JNIEnv* env, jobject by_reference);
+
+
+/*! \brief
+ Assigns \p src to one of the fields of
+ parma_polyhedra_library::Pair object \p dst_pair.
+
+ If \p arg is 0, the first element of \p dst_pair is overwritten;
+ if \p arg is 1, the second element of \p dst_pair is overwritten.
+
+ \exception std::runtime_error
+ Thrown if \p arg is neither 0 nor 1.
+*/
+void
+set_pair_element(JNIEnv* env, jobject dst_pair, int arg, jobject src);
+
+/*! \brief
+ Returns one of the fields of the
+ parma_polyhedra_library::Pair object \p pair.
+
+ If \p arg is 0, the first element of \p pair is returned;
+ if \p arg is 1, the second element of \p pair is returned.
+
+ \exception std::runtime_error
+ Thrown if \p arg is neither 0 nor 1.
+*/
+jobject
+get_pair_element(JNIEnv* env, int arg, jobject pair);
+
+//! Returns a pointer to the C++ object wrapped by \p ppl_object.
+void*
+get_ptr(JNIEnv* env, jobject ppl_object);
+
+//! Sets the pointer of the underlying C++ object in the Java object.
+template <typename T>
+void
+set_ptr(JNIEnv* env, jobject ppl_object,
+ const T* address, bool to_be_marked = false);
+
+/*! \brief
+ Builds a Java parma_polyhedra_library::Linear_Expression
+ from the C++ constraint/congruence \p r.
+*/
+template <typename R>
+jobject
+build_linear_expression(JNIEnv* env, const R& r);
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "ppl_java_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/Java/jni/ppl_java_common_inlines.hh b/interfaces/Java/jni/ppl_java_common_inlines.hh
new file mode 100644
index 0000000..d23cd30
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common_inlines.hh
@@ -0,0 +1,246 @@
+/* Domain-independent part of the Java interface: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_java_common_inlines_hh
+#define PPL_ppl_java_common_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+template <typename U, typename V>
+U
+jtype_to_unsigned(const V& value) {
+ if (value < 0)
+ throw std::invalid_argument("not an unsigned integer.");
+
+ if (sizeof(U) < sizeof(V)) {
+ if (value > static_cast<V>(std::numeric_limits<U>::max()))
+ throw std::invalid_argument("unsigned integer out of range.");
+ }
+
+ return value;
+}
+
+template <typename T>
+inline void
+set_ptr(JNIEnv* env, jobject ppl_object,
+ const T* address, bool to_be_marked) {
+ const T* ptr = (to_be_marked ? mark(address) : address);
+ jlong pointer_value = reinterpret_cast<jlong>(ptr);
+ assert(reinterpret_cast<const T*>(pointer_value) == ptr);
+ env->SetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID, pointer_value);
+}
+
+inline void*
+get_ptr(JNIEnv* env, jobject ppl_object) {
+ jlong pointer_value
+ = env->GetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID);
+ void* ptr = reinterpret_cast<void*>(pointer_value);
+ assert(reinterpret_cast<jlong>(ptr) == pointer_value);
+ return unmark(ptr);
+}
+
+inline bool
+is_java_marked(JNIEnv* env, jobject ppl_object) {
+ jlong pointer_value
+ = env->GetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID);
+ const void* ptr = reinterpret_cast<const void*>(pointer_value);
+ assert(reinterpret_cast<jlong>(ptr) == pointer_value);
+ return marked(ptr);
+}
+
+inline void
+set_coefficient(JNIEnv* env, jobject dst, jobject src) {
+ jobject src_bi
+ = env->GetObjectField(src, cached_FMIDs.Coefficient_value_ID);
+ env->SetObjectField(dst, cached_FMIDs.Coefficient_value_ID, src_bi);
+}
+
+inline void
+set_by_reference(JNIEnv* env, jobject by_ref_dst, jobject src) {
+ env->SetObjectField(by_ref_dst,
+ cached_FMIDs.By_Reference_obj_ID,
+ src);
+}
+
+inline jobject
+get_by_reference(JNIEnv* env, jobject by_reference) {
+ return env->GetObjectField(by_reference, cached_FMIDs.By_Reference_obj_ID);
+}
+
+template <typename R>
+jobject
+build_linear_expression(JNIEnv* env, const R& r) {
+ jobject j_ret;
+ PPL_DIRTY_TEMP_COEFFICIENT(coefficient);
+ dimension_type varid = 0;
+ dimension_type space_dimension = r.space_dimension();
+ while (varid < space_dimension
+ && (coefficient = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension) {
+ jobject j_coefficient_zero = build_java_coeff(env, Coefficient(0));
+ j_ret = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+ cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+ j_coefficient_zero);
+ CHECK_RESULT_THROW(env, j_ret);
+ }
+ else {
+ jmethodID coeff_var_init_ID
+ = cached_FMIDs.Linear_Expression_Times_init_from_coeff_var_ID;
+ jobject j_coefficient = build_java_coeff(env, coefficient);
+ jobject j_variable = build_java_variable(env, Variable(varid));
+ jclass j_le_times_class = cached_classes.Linear_Expression_Times;
+ jobject j_coeff_var = env->NewObject(j_le_times_class,
+ coeff_var_init_ID,
+ j_coefficient, j_variable);
+ CHECK_EXCEPTION_THROW(env);
+ j_ret = j_coeff_var;
+ while (true) {
+ ++varid;
+ while (varid < space_dimension
+ && (coefficient = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension)
+ break;
+ else {
+ j_coefficient = build_java_coeff(env, coefficient);
+ j_variable = build_java_variable(env, Variable(varid));
+ j_coeff_var = env->NewObject(j_le_times_class,
+ coeff_var_init_ID,
+ j_coefficient, j_variable);
+ CHECK_EXCEPTION_THROW(env);
+ j_ret = env->CallObjectMethod(j_ret,
+ cached_FMIDs.Linear_Expression_sum_ID,
+ j_coeff_var);
+ CHECK_EXCEPTION_THROW(env);
+ }
+ }
+ }
+ return j_ret;
+}
+
+inline Variable
+build_cxx_variable(JNIEnv* env, jobject j_var) {
+ return Variable(env->GetIntField(j_var, cached_FMIDs.Variable_varid_ID));
+}
+
+inline jobject
+build_java_variable(JNIEnv* env, const Variable var) {
+ jlong j_var_id = var.id();
+ jobject ret = env->NewObject(cached_classes.Variable,
+ cached_FMIDs.Variable_init_ID,
+ j_var_id);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+inline Coefficient
+build_cxx_coeff(JNIEnv* env, jobject j_coeff) {
+ jstring bi_string
+ = (jstring) env->CallObjectMethod(j_coeff,
+ cached_FMIDs.Coefficient_toString_ID);
+ CHECK_EXCEPTION_THROW(env);
+ const char *nativeString = env->GetStringUTFChars(bi_string, 0);
+ CHECK_RESULT_THROW(env, nativeString);
+ PPL_DIRTY_TEMP_COEFFICIENT(ppl_coeff);
+ ppl_coeff = Coefficient(nativeString);
+ env->ReleaseStringUTFChars(bi_string, nativeString);
+ return ppl_coeff;
+}
+
+inline jobject
+build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff) {
+ std::ostringstream s;
+ s << ppl_coeff;
+ std::string str = s.str();
+ jstring coeff_string = env->NewStringUTF(str.c_str());
+ CHECK_RESULT_THROW(env, coeff_string);
+ jobject ret = env->NewObject(cached_classes.Coefficient,
+ cached_FMIDs.Coefficient_init_from_String_ID,
+ coeff_string);
+ CHECK_RESULT_THROW(env, ret);
+ return ret;
+}
+
+template <typename System, typename Elem_Builder>
+System
+build_cxx_system(JNIEnv* env, jobject j_iterable, Elem_Builder build_cxx_elem) {
+ // Get the iterator.
+ jobject j_iter
+ = env->CallObjectMethod(j_iterable, cached_FMIDs.System_iterator_ID);
+ CHECK_EXCEPTION_THROW(env);
+ // Get the iterator method IDs.
+ jmethodID has_next_mID = cached_FMIDs.System_Iterator_has_next_ID;
+ jmethodID next_mID = cached_FMIDs.System_Iterator_next_ID;
+ // Initialize an empty system.
+ System cxx_sys;
+ jobject j_element;
+ jboolean has_next_value = env->CallBooleanMethod(j_iter, has_next_mID);
+ CHECK_EXCEPTION_ASSERT(env);
+ while (has_next_value) {
+ j_element = env->CallObjectMethod(j_iter, next_mID);
+ CHECK_EXCEPTION_ASSERT(env);
+ cxx_sys.insert(build_cxx_elem(env, j_element));
+ has_next_value = env->CallBooleanMethod(j_iter, has_next_mID);
+ CHECK_EXCEPTION_ASSERT(env);
+ }
+ return cxx_sys;
+}
+
+inline Congruence_System
+build_cxx_congruence_system(JNIEnv* env, jobject j_iterable) {
+ return
+ build_cxx_system<Congruence_System>(env, j_iterable, build_cxx_congruence);
+}
+
+inline Constraint_System
+build_cxx_constraint_system(JNIEnv* env, jobject j_iterable) {
+ return
+ build_cxx_system<Constraint_System>(env, j_iterable, build_cxx_constraint);
+}
+
+inline Generator_System
+build_cxx_generator_system(JNIEnv* env, jobject j_iterable) {
+ return
+ build_cxx_system<Generator_System>(env, j_iterable, build_cxx_generator);
+}
+
+inline Grid_Generator_System
+build_cxx_grid_generator_system(JNIEnv* env, jobject j_iterable) {
+ return build_cxx_system<Grid_Generator_System> (env, j_iterable,
+ build_cxx_grid_generator);
+}
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_java_common_inlines_hh)
diff --git a/interfaces/Java/jni/ppl_java_globals.cc b/interfaces/Java/jni/ppl_java_globals.cc
new file mode 100644
index 0000000..7ee4ce7
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_globals.cc
@@ -0,0 +1,2228 @@
+/* PPL Java interface: domain-independent functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_java_common_defs.hh"
+#include "parma_polyhedra_library_Artificial_Parameter.h"
+#include "parma_polyhedra_library_Artificial_Parameter_Sequence.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Overflow.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Representation.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Width.h"
+#include "parma_polyhedra_library_By_Reference.h"
+#include "parma_polyhedra_library_Coefficient.h"
+#include "parma_polyhedra_library_Complexity_Class.h"
+#include "parma_polyhedra_library_Congruence.h"
+#include "parma_polyhedra_library_Congruence_System.h"
+#include "parma_polyhedra_library_Constraint.h"
+#include "parma_polyhedra_library_Constraint_System.h"
+#include "parma_polyhedra_library_Degenerate_Element.h"
+#include "parma_polyhedra_library_Generator.h"
+#include "parma_polyhedra_library_Generator_System.h"
+#include "parma_polyhedra_library_Generator_Type.h"
+#include "parma_polyhedra_library_Grid_Generator.h"
+#include "parma_polyhedra_library_Grid_Generator_System.h"
+#include "parma_polyhedra_library_Grid_Generator_Type.h"
+#include "parma_polyhedra_library_IO.h"
+#include "parma_polyhedra_library_Linear_Expression.h"
+#include "parma_polyhedra_library_Linear_Expression_Coefficient.h"
+#include "parma_polyhedra_library_Linear_Expression_Difference.h"
+#include "parma_polyhedra_library_Linear_Expression_Sum.h"
+#include "parma_polyhedra_library_Linear_Expression_Times.h"
+#include "parma_polyhedra_library_Linear_Expression_Unary_Minus.h"
+#include "parma_polyhedra_library_Linear_Expression_Variable.h"
+#include "parma_polyhedra_library_MIP_Problem.h"
+#include "parma_polyhedra_library_MIP_Problem_Status.h"
+#include "parma_polyhedra_library_Optimization_Mode.h"
+#include "parma_polyhedra_library_Pair.h"
+#include "parma_polyhedra_library_Parma_Polyhedra_Library.h"
+#include "parma_polyhedra_library_Partial_Function.h"
+#include "parma_polyhedra_library_PIP_Problem.h"
+#include "parma_polyhedra_library_PIP_Problem_Status.h"
+#include "parma_polyhedra_library_PIP_Decision_Node.h"
+#include "parma_polyhedra_library_PIP_Solution_Node.h"
+#include "parma_polyhedra_library_PIP_Tree_Node.h"
+#include "parma_polyhedra_library_Poly_Con_Relation.h"
+#include "parma_polyhedra_library_Poly_Gen_Relation.h"
+#include "parma_polyhedra_library_PPL_Object.h"
+#include "parma_polyhedra_library_Relation_Symbol.h"
+#include "parma_polyhedra_library_Variable.h"
+#include "parma_polyhedra_library_Variables_Set.h"
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_initialize_1library
+(JNIEnv* env, jclass /* ppl_class */) {
+ initialize();
+ cached_classes.init_cache(env);
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_finalize_1library
+(JNIEnv* env, jclass /* ppl_class */) {
+ cached_classes.clear_cache(env);
+ finalize();
+}
+
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_By_1Reference_initIDs
+(JNIEnv* env, jclass j_by_ref_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_by_ref_class, "obj", "Ljava/lang/Object;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.By_Reference_obj_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_by_ref_class, "<init>", "(Ljava/lang/Object;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.By_Reference_init_ID = mID;
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Coefficient_bits(JNIEnv*, jclass) {
+ return PPL_COEFFICIENT_BITS;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Coefficient_initIDs
+(JNIEnv* env, jclass j_coeff_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_coeff_class, "value", "Ljava/math/BigInteger;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Coefficient_value_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_coeff_class, "<init>", "(Ljava/lang/String;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Coefficient_init_from_String_ID = mID;
+ mID = env->GetMethodID(j_coeff_class, "toString", "()Ljava/lang/String;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Coefficient_toString_ID = mID;
+ // Boolean.
+ mID = env->GetStaticMethodID(cached_classes.Boolean, "valueOf",
+ "(Z)Ljava/lang/Boolean;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Boolean_valueOf_ID = mID;
+ // Integer.
+ mID = env->GetStaticMethodID(cached_classes.Integer, "valueOf",
+ "(I)Ljava/lang/Integer;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Integer_valueOf_ID = mID;
+ mID = env->GetMethodID(cached_classes.Integer, "intValue", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Integer_intValue_ID = mID;
+ // Long.
+ mID = env->GetStaticMethodID(cached_classes.Long, "valueOf",
+ "(J)Ljava/lang/Long;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Long_valueOf_ID = mID;
+ mID = env->GetMethodID(cached_classes.Long, "longValue", "()J");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Long_longValue_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Complexity_1Class_initIDs
+(JNIEnv* env, jclass j_complexity_class) {
+ jmethodID mID = env->GetMethodID(j_complexity_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Complexity_Class_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Congruence_initIDs
+(JNIEnv* env, jclass j_congruence_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_congruence_class, "mod",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Congruence_mod_ID = fID;
+ fID = env->GetFieldID(j_congruence_class, "lhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Congruence_lhs_ID = fID;
+ fID = env->GetFieldID(j_congruence_class, "rhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Congruence_rhs_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_congruence_class, "<init>",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Congruence_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_initIDs
+(JNIEnv* env, jclass j_con_sys_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_con_sys_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Congruence_System_init_ID = mID;
+ mID = env->GetMethodID(j_con_sys_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Congruence_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Constraint_initIDs
+(JNIEnv* env, jclass j_constraint_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_constraint_class, "lhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Constraint_lhs_ID = fID;
+ fID = env->GetFieldID(j_constraint_class, "rhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Constraint_rhs_ID = fID;
+ fID = env->GetFieldID(j_constraint_class, "kind",
+ "Lparma_polyhedra_library/Relation_Symbol;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Constraint_kind_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_constraint_class, "<init>",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Relation_Symbol;"
+ "Lparma_polyhedra_library/Linear_Expression;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Constraint_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_initIDs
+(JNIEnv* env, jclass j_con_sys_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_con_sys_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Constraint_System_init_ID = mID;
+ mID = env->GetMethodID(j_con_sys_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Constraint_System_add_ID = mID;
+ // NOTE: initialize the iterator method IDs common to all *_System classes.
+ mID = env->GetMethodID(j_con_sys_class, "iterator",
+ "()Ljava/util/Iterator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.System_iterator_ID = mID;
+ mID = env->GetMethodID(cached_classes.Iterator, "hasNext", "()Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.System_Iterator_has_next_ID = mID;
+ assert(cached_classes.Iterator != NULL);
+ mID = env->GetMethodID(cached_classes.Iterator, "next",
+ "()Ljava/lang/Object;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.System_Iterator_next_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Degenerate_1Element_initIDs
+(JNIEnv* env, jclass j_degenerate_class) {
+ jmethodID mID = env->GetMethodID(j_degenerate_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Degenerate_Element_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_initIDs
+(JNIEnv* env, jclass j_generator_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_generator_class, "gt",
+ "Lparma_polyhedra_library/Generator_Type;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Generator_gt_ID = fID;
+ fID = env->GetFieldID(j_generator_class, "le",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Generator_le_ID = fID;
+ fID = env->GetFieldID(j_generator_class, "div",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Generator_div_ID = fID;
+ jmethodID mID;
+ mID = env->GetStaticMethodID(j_generator_class, "line",
+ "(Lparma_polyhedra_library/Linear_Expression;)"
+ "Lparma_polyhedra_library/Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_line_ID = mID;
+ mID = env->GetStaticMethodID(j_generator_class, "ray",
+ "(Lparma_polyhedra_library/Linear_Expression;)"
+ "Lparma_polyhedra_library/Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_ray_ID = mID;
+ mID = env->GetStaticMethodID(j_generator_class, "point",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)"
+ "Lparma_polyhedra_library/Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_point_ID = mID;
+ mID = env->GetStaticMethodID(j_generator_class, "closure_point",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)"
+ "Lparma_polyhedra_library/Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_closure_point_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_initIDs
+(JNIEnv* env, jclass j_gen_sys_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_gen_sys_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_System_init_ID = mID;
+ mID = env->GetMethodID(j_gen_sys_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_1Type_initIDs
+(JNIEnv* env, jclass j_gen_type_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_gen_type_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Generator_Type_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_initIDs
+(JNIEnv* env, jclass j_grid_generator_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_grid_generator_class, "gt",
+ "Lparma_polyhedra_library/Grid_Generator_Type;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Grid_Generator_gt_ID = fID;
+ fID = env->GetFieldID(j_grid_generator_class, "le",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Grid_Generator_le_ID = fID;
+ fID = env->GetFieldID(j_grid_generator_class, "div",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Grid_Generator_div_ID = fID;
+ jmethodID mID;
+ mID = env->GetStaticMethodID(j_grid_generator_class, "grid_line",
+ "(Lparma_polyhedra_library/Linear_Expression;)"
+ "Lparma_polyhedra_library/Grid_Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_grid_line_ID = mID;
+ mID = env->GetStaticMethodID(j_grid_generator_class, "parameter",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)"
+ "Lparma_polyhedra_library/Grid_Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_parameter_ID = mID;
+ mID = env->GetStaticMethodID(j_grid_generator_class, "grid_point",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)"
+ "Lparma_polyhedra_library/Grid_Generator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_grid_point_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_initIDs
+(JNIEnv* env, jclass j_gen_sys_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_gen_sys_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_System_init_ID = mID;
+ mID = env->GetMethodID(j_gen_sys_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1Type_initIDs
+(JNIEnv* env, jclass j_grid_gen_type_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_grid_gen_type_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Grid_Generator_Type_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_initIDs
+(JNIEnv* env, jclass j_le_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_le_class, "sum",
+ "(Lparma_polyhedra_library/Linear_Expression;)"
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_sum_ID = mID;
+ mID = env->GetMethodID(j_le_class, "times",
+ "(Lparma_polyhedra_library/Coefficient;)"
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_times_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Coefficient_initIDs
+(JNIEnv* env, jclass j_le_coeff_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_le_coeff_class, "coeff",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Coefficient_coeff_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_le_coeff_class, "<init>",
+ "(Lparma_polyhedra_library/Coefficient;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_Coefficient_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Difference_initIDs
+(JNIEnv* env, jclass j_le_diff_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_le_diff_class, "lhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Difference_lhs_ID = fID;
+ fID = env->GetFieldID(j_le_diff_class, "rhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Difference_rhs_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Sum_initIDs
+(JNIEnv* env, jclass j_le_sum_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_le_sum_class, "lhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Sum_lhs_ID = fID;
+ fID = env->GetFieldID(j_le_sum_class, "rhs",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Sum_rhs_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Times_initIDs
+(JNIEnv* env, jclass j_le_times_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_le_times_class, "coeff",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Times_coeff_ID = fID;
+ fID = env->GetFieldID(j_le_times_class, "lin_expr",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Times_lin_expr_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_le_times_class, "<init>",
+ "(Lparma_polyhedra_library/Coefficient;"
+ "Lparma_polyhedra_library/Variable;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_Times_init_from_coeff_var_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Unary_1Minus_initIDs
+(JNIEnv* env, jclass j_le_uminus_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_le_uminus_class, "arg",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Linear_Expression_Unary_Minus_arg_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Variable_initIDs
+(JNIEnv* env, jclass j_le_var_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_le_var_class, "<init>",
+ "(Lparma_polyhedra_library/Variable;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_Variable_init_ID = mID;
+ mID = env->GetMethodID(j_le_var_class, "var_id", "()J");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Linear_Expression_Variable_var_id_ID = mID;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_is_1zero
+(JNIEnv* env, jobject j_this) {
+ try {
+ return build_cxx_linear_expression(env, j_this).is_zero();
+ }
+ CATCH_ALL
+ return false;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_all_1homogeneous_1terms_1are_1zero
+(JNIEnv* env, jobject j_this) {
+ try {
+ return build_cxx_linear_expression(env, j_this).all_homogeneous_terms_are_zero();
+ }
+ CATCH_ALL
+ return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_1Status_initIDs
+(JNIEnv* env, jclass j_mip_status_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_mip_status_class, "UNFEASIBLE_MIP_PROBLEM",
+ "Lparma_polyhedra_library/MIP_Problem_Status;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID = fID;
+ fID = env->GetStaticFieldID(j_mip_status_class, "UNBOUNDED_MIP_PROBLEM",
+ "Lparma_polyhedra_library/MIP_Problem_Status;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID = fID;
+ fID = env->GetStaticFieldID(j_mip_status_class, "OPTIMIZED_MIP_PROBLEM",
+ "Lparma_polyhedra_library/MIP_Problem_Status;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_mip_status_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.MIP_Problem_Status_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_1Status_initIDs
+(JNIEnv* env, jclass j_mip_status_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_mip_status_class, "UNFEASIBLE_PIP_PROBLEM",
+ "Lparma_polyhedra_library/PIP_Problem_Status;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID = fID;
+ fID = env->GetStaticFieldID(j_mip_status_class, "OPTIMIZED_PIP_PROBLEM",
+ "Lparma_polyhedra_library/PIP_Problem_Status;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_mip_status_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.PIP_Problem_Status_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Optimization_1Mode_initIDs
+(JNIEnv* env, jclass j_opt_mode_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_opt_mode_class, "MAXIMIZATION",
+ "Lparma_polyhedra_library/Optimization_Mode;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Optimization_Mode_MAXIMIZATION_ID = fID;
+ fID = env->GetStaticFieldID(j_opt_mode_class, "MINIMIZATION",
+ "Lparma_polyhedra_library/Optimization_Mode;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Optimization_Mode_MINIMIZATION_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_opt_mode_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Optimization_Mode_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Pair_initIDs
+(JNIEnv* env, jclass j_pair_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_pair_class, "first", "Ljava/lang/Object;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Pair_first_ID = fID;
+ fID = env->GetFieldID(j_pair_class, "second", "Ljava/lang/Object;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Pair_second_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Poly_1Con_1Relation_initIDs
+(JNIEnv* env, jclass j_poly_con_relation_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_poly_con_relation_class, "<init>", "(I)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Poly_Con_Relation_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Poly_1Gen_1Relation_initIDs
+(JNIEnv* env, jclass j_poly_gen_relation_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_poly_gen_relation_class, "<init>", "(I)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Poly_Gen_Relation_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PPL_1Object_initIDs
+(JNIEnv* env, jclass j_ppl_object_class) {
+ jfieldID fID = env->GetFieldID(j_ppl_object_class, "ptr", "J");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.PPL_Object_ptr_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Relation_1Symbol_initIDs
+(JNIEnv* env, jclass j_rel_sym_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_rel_sym_class, "EQUAL",
+ "Lparma_polyhedra_library/Relation_Symbol;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Relation_Symbol_EQUAL_ID = fID;
+ fID = env->GetStaticFieldID(j_rel_sym_class, "GREATER_THAN",
+ "Lparma_polyhedra_library/Relation_Symbol;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Relation_Symbol_GREATER_THAN_ID = fID;
+ fID = env->GetStaticFieldID(j_rel_sym_class, "GREATER_OR_EQUAL",
+ "Lparma_polyhedra_library/Relation_Symbol;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Relation_Symbol_GREATER_OR_EQUAL_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_rel_sym_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Relation_Symbol_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Overflow_initIDs
+(JNIEnv* env, jclass j_bounded_overflow_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_WRAPS",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_WRAPS_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_UNDEFINED",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_UNDEFINED_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_IMPOSSIBLE",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_IMPOSSIBLE_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_bounded_overflow_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Bounded_Integer_Type_Overflow_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Representation_initIDs
+(JNIEnv* env, jclass j_bounded_rep_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_bounded_rep_class, "UNSIGNED",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Representation;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Representation_UNSIGNED_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_rep_class, "SIGNED_2_COMPLEMENT",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Representation;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Representation_SIGNED_2_COMPLEMENT_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_bounded_rep_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Bounded_Integer_Type_Representation_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Width_initIDs
+(JNIEnv* env, jclass j_bounded_width_class) {
+ jfieldID fID;
+ fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_8",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Width_BITS_8_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_16",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Width_BITS_16_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_32",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Width_BITS_32_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_64",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Width_BITS_64_ID = fID;
+ fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_128",
+ "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Bounded_Integer_Type_Width_BITS_128_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_bounded_width_class, "ordinal", "()I");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Bounded_Integer_Type_Width_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variable_initIDs
+(JNIEnv* env, jclass j_variable_class) {
+ jfieldID fID = env->GetFieldID(j_variable_class, "varid", "J");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Variable_varid_ID = fID;
+ fID = env->GetStaticFieldID(j_variable_class, "stringifier",
+ "Lparma_polyhedra_library/Variable_Stringifier;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Variable_stringifier_ID = fID;
+ jmethodID mID = env->GetMethodID(j_variable_class, "<init>", "(J)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variable_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variables_1Set_initIDs
+(JNIEnv* env, jclass j_vset_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_vset_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variables_Set_init_ID = mID;
+ mID = env->GetMethodID(j_vset_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variables_Set_add_ID = mID;
+ mID = env->GetMethodID(j_vset_class, "iterator", "()Ljava/util/Iterator;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variables_Set_iterator_ID = mID;
+ // Iterator on Variables_Set.
+ jclass j_vset_iter_class = env->FindClass("java/util/Iterator");
+ CHECK_RESULT_ASSERT(env, j_vset_iter_class);
+ mID = env->GetMethodID(j_vset_iter_class, "hasNext", "()Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variables_Set_Iterator_has_next_ID = mID;
+ mID = env->GetMethodID(j_vset_iter_class, "next", "()Ljava/lang/Object;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variables_Set_Iterator_next_ID = mID;
+}
+
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1major
+(JNIEnv *, jclass) {
+ return version_major();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1minor
+(JNIEnv *, jclass) {
+ return version_minor();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1revision
+(JNIEnv *, jclass) {
+ return version_revision();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1beta
+(JNIEnv *, jclass) {
+ return version_beta();
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version
+(JNIEnv* env, jclass) {
+#if defined(__sun) || defined(__sun__)
+
+ // Some versions of Solaris declare a version() function that causes
+ // the following function call to be ambiguous.
+ return env->NewStringUTF(Parma_Polyhedra_Library::version());
+
+#else // !(defined(__sun) || defined(__sun__))
+
+ return env->NewStringUTF(version());
+
+#endif // !(defined(__sun) || defined(__sun__))
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_banner
+(JNIEnv* env, jclass) {
+ return env->NewStringUTF(banner());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1rounding_1for_1PPL
+(JNIEnv* env, jclass) {
+ try {
+ set_rounding_for_PPL();
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_restore_1pre_1PPL_1rounding
+(JNIEnv* env, jclass) {
+ try {
+ restore_pre_PPL_rounding();
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_irrational_1precision
+(JNIEnv* env , jclass) {
+ try {
+ return irrational_precision();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1irrational_1precision
+(JNIEnv* env , jclass, jint p) {
+ try {
+ unsigned cxx_p = jtype_to_unsigned<unsigned>(p);
+ set_irrational_precision(cxx_p);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1timeout
+(JNIEnv* env, jclass, jint csecs) {
+ try {
+ // In case a timeout was already set.
+ reset_timeout();
+ assert(csecs > 0);
+ unsigned cxx_csecs = jtype_to_unsigned<unsigned>(csecs);
+ assert(cxx_csecs > 0);
+ static timeout_exception e;
+ using Parma_Polyhedra_Library::Watchdog;
+ p_timeout_object
+ = new Watchdog(cxx_csecs, abandon_expensive_computations, e);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_reset_1timeout
+(JNIEnv* env, jclass) {
+ try {
+ reset_timeout();
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1deterministic_1timeout
+(JNIEnv* env, jclass, jint unscaled_weight, jint scale) {
+ try {
+ // In case a timeout was already set.
+ reset_deterministic_timeout();
+ // Note: let `unscaled_weight == 0' result in an exception.
+ assert(unscaled_weight >= 0 && scale >= 0);
+ unsigned long cxx_unscaled_weight
+ = jtype_to_unsigned<unsigned long>(unscaled_weight);
+ unsigned cxx_scale = jtype_to_unsigned<unsigned>(scale);
+ static deterministic_timeout_exception e;
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+ p_deterministic_timeout_object
+ = new Weightwatch(Traits::compute_delta(cxx_unscaled_weight, cxx_scale),
+ abandon_expensive_computations, e);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_reset_1deterministic_1timeout
+(JNIEnv* env, jclass) {
+ try {
+ reset_deterministic_timeout();
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_max_1space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return mip->max_space_dimension();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return mip->space_dimension();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return build_java_variables_set(env, mip->integer_space_dimensions());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_objective_1function
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ PPL_DIRTY_TEMP_COEFFICIENT(inhomogeneous_term);
+ inhomogeneous_term = mip->objective_function().inhomogeneous_term();
+ jobject j_coeff_inhomogeneous_term
+ = build_java_coeff(env, inhomogeneous_term);
+ jobject j_le_coeff
+ = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+ cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+ j_coeff_inhomogeneous_term);
+ CHECK_RESULT_RETURN(env, j_le_coeff, 0);
+
+ jobject j_le = build_linear_expression(env, mip->objective_function());
+ return env->CallObjectMethod(j_le,
+ cached_FMIDs.Linear_Expression_sum_ID,
+ j_le_coeff);
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return build_java_optimization_mode(env, mip->optimization_mode());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_get_1control_1parameter
+(JNIEnv* env , jobject j_this_mip_problem,
+ jobject j_cpn) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ MIP_Problem::Control_Parameter_Name cpn
+ = build_cxx_control_parameter_name(env, j_cpn);
+ return
+ build_java_control_parameter_value(env,
+ mip->get_control_parameter(cpn));
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1control_1parameter
+(JNIEnv* env , jobject j_this_mip_problem,
+ jobject j_cpv) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ MIP_Problem::Control_Parameter_Value cpv
+ = build_cxx_control_parameter_value(env, j_cpv);
+ mip->set_control_parameter(cpv);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_constraints
+(JNIEnv* env, jobject j_this_mip_problem) {
+ try {
+ jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+ cached_FMIDs.Constraint_System_init_ID);
+ CHECK_RESULT_RETURN(env, j_cs, 0);
+
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ for (MIP_Problem::const_iterator cs_it = mip->constraints_begin(),
+ cs_end = mip->constraints_end(); cs_it != cs_end; ++cs_it) {
+ jobject j_constraint = build_java_constraint(env, *cs_it);
+ env->CallBooleanMethod(j_cs,
+ cached_FMIDs.Constraint_System_add_ID,
+ j_constraint);
+ CHECK_EXCEPTION_RETURN(env, 0);
+ }
+ return j_cs;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_clear
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ mip->clear();
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1space_1dimensions_1and_1embed
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ mip->add_space_dimensions_and_embed(ppl_dim);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1to_1integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_vset) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Variables_Set v_set = build_cxx_variables_set(env, j_vset);
+ mip->add_to_integer_space_dimensions(v_set);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1constraint
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_c) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Constraint c = build_cxx_constraint(env, j_c);
+ mip->add_constraint(c);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1constraints
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_cs) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+ mip->add_constraints(cs);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1objective_1function
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_le) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ mip->set_objective_function(le);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_opt_mode) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Optimization_Mode opt_mode = build_cxx_optimization_mode(env, j_opt_mode);
+ mip->set_optimization_mode(opt_mode);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_is_1satisfiable
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return mip->is_satisfiable();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_MIP_1Problem_solve
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return build_java_mip_status(env, mip->solve());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_evaluate_1objective_1function
+(JNIEnv* env, jobject j_this_mip_problem, jobject j_gen,
+ jobject j_coeff_num, jobject j_coeff_den) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Generator g = build_cxx_generator(env, j_gen);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ mip->evaluate_objective_function(g, num, den);
+ set_coefficient(env, j_coeff_num, build_java_coeff(env, num));
+ set_coefficient(env, j_coeff_den, build_java_coeff(env, den));
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_feasible_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Generator g = mip->feasible_point();
+ return build_java_generator(env, g);
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimizing_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ Generator g = mip->optimizing_point();
+ return build_java_generator(env, g);
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimal_1value
+(JNIEnv* env, jobject j_this_mip_problem,
+ jobject j_coeff_num, jobject j_coeff_den) {
+ try {
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff_num);
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff_den);
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ mip->optimal_value(coeff_num, coeff_den);
+ set_coefficient(env, j_coeff_num, build_java_coeff(env, coeff_num));
+ set_coefficient(env, j_coeff_den, build_java_coeff(env, coeff_den));
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_OK
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return mip->OK();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__J
+(JNIEnv* env, jobject j_this_mip_problem, jlong j_dim) {
+ try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim);
+ set_ptr(env, j_this_mip_problem, mip_ptr);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__JLparma_1polyhedra_1library_Constraint_1System_2Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Optimization_1Mode_2
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim, jobject j_cs,
+ jobject j_le, jobject j_opt_mode) {
+ try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+ Linear_Expression le = build_cxx_linear_expression(env, j_le);
+ Optimization_Mode opt_mode = build_cxx_optimization_mode(env, j_opt_mode);
+ MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim, cs, le, opt_mode);
+ set_ptr(env, j_this_mip_problem, mip_ptr);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__Lparma_1polyhedra_1library_MIP_1Problem_2
+(JNIEnv* env, jobject j_this, jobject j_y)
+{
+ MIP_Problem* y_ptr = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_y));
+ MIP_Problem* this_ptr = new MIP_Problem(*y_ptr);
+ set_ptr(env, j_this, this_ptr);
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_free
+(JNIEnv* env, jobject j_this) {
+ MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this)) {
+ delete mip;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_finalize
+(JNIEnv* env, jobject j_this) {
+ MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this))
+ delete mip;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_total_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_mip_problem) {
+ try {
+ MIP_Problem* mip
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+ return mip->total_memory_in_bytes();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_toString
+(JNIEnv* env, jobject j_this) {
+ MIP_Problem* this_ptr
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ s << *this_ptr;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ MIP_Problem* this_ptr
+ = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+ std::ostringstream s;
+ this_ptr->ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Variable_toString
+(JNIEnv* env, jobject j_this) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ Variable ppl_var = build_cxx_variable(env, j_this);
+ std::ostringstream s;
+ s << ppl_var;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variable_setStringifier
+(JNIEnv* env, jclass j_variable_class, jobject j_stringifier) {
+ // Store j_stringifier in the corresponding static field.
+ env->SetStaticObjectField(j_variable_class,
+ cached_FMIDs.Variable_stringifier_ID,
+ j_stringifier);
+ if (j_stringifier == NULL) {
+ // No stringifier object: reset cache values.
+ cached_classes.Variable_Stringifier = NULL;
+ cached_FMIDs.Variable_Stringifier_stringify_ID = NULL;
+ // Reset default C++ output function.
+ Variable::set_output_function(&Variable::default_output_function);
+ }
+ else {
+ // Update cache with values computed for concrete class.
+ jclass vs_class = env->GetObjectClass(j_stringifier);
+ CHECK_RESULT_ASSERT(env, vs_class);
+ cached_classes.Variable_Stringifier = vs_class;
+ jmethodID mID = env->GetMethodID(vs_class, "stringify",
+ "(J)Ljava/lang/String;");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Variable_Stringifier_stringify_ID = mID;
+ // Set C++ output function to the Java wrapper.
+ Variable::set_output_function(&Java_Variable_output_function);
+ }
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_toString
+(JNIEnv* env, jobject j_this) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ Linear_Expression ppl_le = build_cxx_linear_expression(env, j_this);
+ std::ostringstream s;
+ s << ppl_le;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Linear_Expression le = build_cxx_linear_expression(env, j_this);
+ le.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_toString
+(JNIEnv* env, jobject g) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Generator ppl_g = build_cxx_generator(env, g);
+ s << ppl_g;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Generator g = build_cxx_generator(env, j_this);
+ g.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_toString
+(JNIEnv* env, jobject c) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Constraint ppl_c = build_cxx_constraint(env, c);
+ s << ppl_c;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Constraint c = build_cxx_constraint(env, j_this);
+ c.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_toString
+(JNIEnv* env, jobject g) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Grid_Generator ppl_g = build_cxx_grid_generator(env, g);
+ s << ppl_g;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Grid_Generator g = build_cxx_grid_generator(env, j_this);
+ g.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_toString
+(JNIEnv* env, jobject g) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Congruence ppl_g = build_cxx_congruence(env, g);
+ s << ppl_g;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Congruence c = build_cxx_congruence(env, j_this);
+ c.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_toString
+(JNIEnv* env, jobject ggs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Grid_Generator_System ppl_ggs = build_cxx_grid_generator_system(env, ggs);
+ s << ppl_ggs;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Grid_Generator_System gs = build_cxx_grid_generator_system(env, j_this);
+ gs.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_toString
+(JNIEnv* env, jobject gs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Generator_System ppl_gs = build_cxx_generator_system(env, gs);
+ s << ppl_gs;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Generator_System gs = build_cxx_generator_system(env, j_this);
+ gs.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_toString
+(JNIEnv* env, jobject cs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Constraint_System ppl_cs = build_cxx_constraint_system(env, cs);
+ s << ppl_cs;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Constraint_System cs = build_cxx_constraint_system(env, j_this);
+ cs.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_toString
+(JNIEnv* env, jobject cgs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ Congruence_System ppl_cgs = build_cxx_congruence_system(env, cgs);
+ s << ppl_cgs;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ Congruence_System cs = build_cxx_congruence_system(env, j_this);
+ cs.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_IO_wrap_1string
+(JNIEnv* env, jclass, jstring str, jint indent_depth,
+ jint preferred_first_line_length, jint preferred_line_length) {
+ try {
+ unsigned ind = jtype_to_unsigned<unsigned int>(indent_depth);
+ unsigned pfll = jtype_to_unsigned<unsigned int>
+ (preferred_first_line_length);
+ unsigned pll = jtype_to_unsigned<unsigned int>(preferred_line_length);
+ const char* chars = env->GetStringUTFChars(str, 0);
+ CHECK_RESULT_RETURN(env, chars, 0);
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::string s = wrap_string(chars, ind, pfll, pll);
+ env->ReleaseStringUTFChars(str, chars);
+ return env->NewStringUTF(s.c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__J
+(JNIEnv* env, jobject j_this_pip_problem, jlong j_dim) {
+ try {
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ PIP_Problem* pip_ptr = new PIP_Problem(ppl_dim);
+ set_ptr(env, j_this_pip_problem, pip_ptr);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__JLparma_1polyhedra_1library_Constraint_1System_2Lparma_1polyhedra_1library_Variables_1Set_2
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim,
+ jobject j_cs, jobject j_vars) {
+ try {
+ dimension_type p_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ Constraint_System p_cs = build_cxx_constraint_system(env, j_cs);
+ Variables_Set p_vars = build_cxx_variables_set(env, j_vars);
+ PIP_Problem* pip_ptr = new PIP_Problem(p_dim, p_cs.begin(),
+ p_cs.end(), p_vars);
+ set_ptr(env, j_this_pip_problem, pip_ptr);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__Lparma_1polyhedra_1library_PIP_1Problem_2
+(JNIEnv* env, jobject j_this, jobject j_y)
+{
+ PIP_Problem* y_ptr = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_y));
+ PIP_Problem* this_ptr = new PIP_Problem(*y_ptr);
+ set_ptr(env, j_this, this_ptr);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_OK
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->OK();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_total_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->total_memory_in_bytes();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_external_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->external_memory_in_bytes();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_toString
+(JNIEnv* env, jobject j_this) {
+ PIP_Problem* this_ptr
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ s << *this_ptr;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ PIP_Problem* this_ptr
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+ std::ostringstream s;
+ this_ptr->ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_free
+(JNIEnv* env, jobject j_this) {
+ PIP_Problem* pip = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this)) {
+ delete pip;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1_problem_finalize
+(JNIEnv* env, jobject j_this) {
+ PIP_Problem* pip = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this))
+ delete pip;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_max_1space_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->max_space_dimension();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_space_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->space_dimension();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_get_1big_1parameter_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->get_big_parameter_dimension();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return build_java_variables_set(env, pip->parameter_space_dimensions());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_set_1big_1parameter_1dimension
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+ pip->set_big_parameter_dimension(ppl_dim);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_number_1of_1parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->parameter_space_dimensions().size();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1space_1dimensions_1and_1embed
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim_vars, jlong j_dim_pars) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ dimension_type ppl_dim_vars = jtype_to_unsigned<dimension_type>(j_dim_vars);
+ dimension_type ppl_dim_pars = jtype_to_unsigned<dimension_type>(j_dim_pars);
+ pip->add_space_dimensions_and_embed(ppl_dim_vars, ppl_dim_pars);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1to_1parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_vars) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ Variables_Set ppl_vars = build_cxx_variables_set(env, j_vars);
+ pip->add_to_parameter_space_dimensions(ppl_vars);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_number_1of_1constraints
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->constraints_end() - pip->constraints_begin();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1constraint
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_c) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ Constraint c = build_cxx_constraint(env, j_c);
+ pip->add_constraint(c);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1constraints
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_cs) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+ pip->add_constraints(cs);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_is_1satisfiable
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return pip->is_satisfiable();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_PIP_1Problem_solve
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ return build_java_pip_status(env, pip->solve());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_PIP_1Problem_solution
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ const PIP_Tree_Node* solution = pip->solution();
+
+ jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+ CHECK_RESULT_ASSERT(env, j_class_s);
+ jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+ jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+ CHECK_RESULT_RETURN(env, j_obj_s, 0);
+ set_ptr(env, j_obj_s, solution);
+ return j_obj_s;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_optimizing_1solution
+(JNIEnv* env , jobject j_this_pip_problem) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ const PIP_Tree_Node* solution = pip->optimizing_solution();
+
+ jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+ CHECK_RESULT_ASSERT(env, j_class_s);
+ jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+ jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+ CHECK_RESULT_RETURN(env, j_obj_s, 0);
+ set_ptr(env, j_obj_s, solution);
+ return j_obj_s;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_get_1pip_1problem_1control_1parameter
+(JNIEnv* env , jobject j_this_pip_problem,
+ jobject j_cpn) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ PIP_Problem::Control_Parameter_Name ppl_cpn
+ = build_cxx_pip_problem_control_parameter_name(env, j_cpn);
+ return
+ build_java_pip_problem_control_parameter_value
+ (env, pip->get_control_parameter(ppl_cpn));
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_constraint_1at_1index
+(JNIEnv* env, jobject j_this_pip_problem, jlong j_index) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ dimension_type p_index = jtype_to_unsigned<dimension_type>(j_index);
+ return build_java_constraint(env, *(pip->constraints_begin() + p_index));
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_constraints
+(JNIEnv* env, jobject j_this_pip_problem) {
+ try {
+ jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+ cached_FMIDs.Constraint_System_init_ID);
+ CHECK_RESULT_RETURN(env, j_cs, 0);
+
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ for (PIP_Problem::const_iterator cs_it = pip->constraints_begin(),
+ cs_end = pip->constraints_end(); cs_it != cs_end; ++cs_it) {
+ jobject j_constraint = build_java_constraint(env, *cs_it);
+ env->CallBooleanMethod(j_cs,
+ cached_FMIDs.Constraint_System_add_ID,
+ j_constraint);
+ CHECK_EXCEPTION_RETURN(env, 0);
+ }
+ return j_cs;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_set_1pip_1problem_1control_1parameter
+(JNIEnv* env, jobject j_this_pip_problem, jobject j_cpv) {
+ try {
+ PIP_Problem* pip
+ = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+ PIP_Problem::Control_Parameter_Value ppl_cpv
+ = build_cxx_pip_problem_control_parameter_value(env, j_cpv);
+ pip->set_control_parameter(ppl_cpv);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_OK
+(JNIEnv* env, jobject j_this_pip_tree) {
+ try {
+ PIP_Tree_Node* pip
+ = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this_pip_tree));
+ return pip->OK();
+ }
+ CATCH_ALL;
+ return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_free
+(JNIEnv* env, jobject j_this) {
+ PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this)) {
+ delete pip;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_finalize
+(JNIEnv* env, jobject j_this) {
+ PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this))
+ delete pip;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_constraints
+(JNIEnv* env, jobject j_this_pip_node) {
+ try {
+ jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+ cached_FMIDs.Constraint_System_init_ID);
+ CHECK_RESULT_RETURN(env, j_cs, 0);
+
+ PIP_Tree_Node* pip
+ = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this_pip_node));
+ return build_java_constraint_system(env, pip->constraints());
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_as_1solution
+(JNIEnv* env, jobject j_this) {
+ try {
+ PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ const PIP_Solution_Node* solution = pip->as_solution();
+ if (solution == 0) {
+ jobject null = 0;
+ return null;
+ }
+ // Here we have a solution node.
+ jclass j_class_s
+ = env->FindClass("parma_polyhedra_library/PIP_Solution_Node");
+ CHECK_RESULT_ASSERT(env, j_class_s);
+ jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+ jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+ CHECK_RESULT_RETURN(env, j_obj_s, 0);
+ set_ptr(env, j_obj_s, solution);
+ return j_obj_s;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_as_1decision
+(JNIEnv* env, jobject j_this) {
+ try {
+ PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ const PIP_Decision_Node* decision = pip->as_decision();
+ if (decision == 0) {
+ jobject null = 0;
+ return null;
+ }
+ // Here we have a decision node.
+ jclass j_class_d
+ = env->FindClass("parma_polyhedra_library/PIP_Decision_Node");
+ CHECK_RESULT_ASSERT(env, j_class_d);
+ jmethodID j_ctr_id_d = env->GetMethodID(j_class_d, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_d);
+ jobject j_obj_d = env->NewObject(j_class_d, j_ctr_id_d);
+ CHECK_RESULT_RETURN(env, j_obj_d, 0);
+ set_ptr(env, j_obj_d, decision);
+ return j_obj_d;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_number_1of_1artificials
+(JNIEnv* env , jobject j_this) {
+ try {
+ PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ return pip->art_parameter_count();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_artificials
+(JNIEnv* env, jobject j_this_pip_node) {
+ try {
+ jobject j_arts
+ = env->NewObject(cached_classes.Artificial_Parameter_Sequence,
+ cached_FMIDs.Artificial_Parameter_Sequence_init_ID);
+ CHECK_RESULT_RETURN(env, j_arts, 0);
+
+ const PIP_Tree_Node* pip_node
+ = reinterpret_cast<const PIP_Tree_Node*>(get_ptr(env, j_this_pip_node));
+ for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+ i = pip_node->art_parameter_begin(),
+ i_end = pip_node->art_parameter_end(); i != i_end; ++i) {
+ jobject j_art = build_java_artificial_parameter(env, *i);
+ env->CallBooleanMethod(j_arts,
+ cached_FMIDs.Artificial_Parameter_Sequence_add_ID,
+ j_art);
+ CHECK_EXCEPTION_RETURN(env, 0);
+ }
+ return j_arts;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_toString
+(JNIEnv* env, jobject j_this) {
+ PIP_Tree_Node* this_ptr
+ = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ s << *this_ptr;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Decision_1Node_child_1node
+(JNIEnv* env, jobject j_this, jboolean j_branch) {
+ try {
+ PIP_Decision_Node* dec_node
+ = reinterpret_cast<PIP_Decision_Node*>(get_ptr(env, j_this));
+ const PIP_Tree_Node* child = dec_node->child_node(j_branch);
+ if (child == 0) {
+ jobject null = 0;
+ return null;
+ }
+ jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+ CHECK_RESULT_ASSERT(env, j_class_s);
+ jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+ jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+ CHECK_RESULT_RETURN(env, j_obj_s, 0);
+ set_ptr(env, j_obj_s, child);
+ return j_obj_s;
+ }
+ CATCH_ALL;
+ jobject null = 0;
+ return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Solution_1Node_parametric_1values
+(JNIEnv* env, jobject j_this, jobject j_var) {
+ PIP_Solution_Node* pip
+ = reinterpret_cast<PIP_Solution_Node*>(get_ptr(env, j_this));
+ Variable v = build_cxx_variable(env, j_var);
+ return build_linear_expression(env, pip->parametric_values(v));
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_initIDs
+(JNIEnv* env, jclass j_artificial_parameter_class) {
+ jfieldID fID;
+ fID = env->GetFieldID(j_artificial_parameter_class, "le",
+ "Lparma_polyhedra_library/Linear_Expression;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Artificial_Parameter_le_ID = fID;
+ fID = env->GetFieldID(j_artificial_parameter_class, "den",
+ "Lparma_polyhedra_library/Coefficient;");
+ CHECK_RESULT_ASSERT(env, fID);
+ cached_FMIDs.Artificial_Parameter_den_ID = fID;
+ jmethodID mID;
+ mID = env->GetMethodID(j_artificial_parameter_class, "<init>",
+ "(Lparma_polyhedra_library/Linear_Expression;"
+ "Lparma_polyhedra_library/Coefficient;)V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Artificial_Parameter_init_ID = mID;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+ try {
+ std::ostringstream s;
+ PIP_Tree_Node::Artificial_Parameter art
+ = build_cxx_artificial_parameter(env, j_this);
+ art.ascii_dump(s);
+ return env->NewStringUTF(s.str().c_str());
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_toString
+(JNIEnv* env, jobject j_this) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::ostringstream s;
+ PIP_Tree_Node::Artificial_Parameter ppl_art
+ = build_cxx_artificial_parameter(env, j_this);
+ s << ppl_art;
+ return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_1Sequence_initIDs
+(JNIEnv* env, jclass j_aps_class) {
+ jmethodID mID;
+ mID = env->GetMethodID(j_aps_class, "<init>", "()V");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Artificial_Parameter_Sequence_init_ID = mID;
+ mID = env->GetMethodID(j_aps_class, "add", "(Ljava/lang/Object;)Z");
+ CHECK_RESULT_ASSERT(env, mID);
+ cached_FMIDs.Artificial_Parameter_Sequence_add_ID = mID;
+}
+
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_build_1cpp_1object
+(JNIEnv* env, jobject j_this_pfunc) {
+ try {
+ Partial_Function* pfunc_ptr = new Partial_Function;
+ set_ptr(env, j_this_pfunc, pfunc_ptr);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_has_1empty_1codomain
+(JNIEnv* env , jobject j_this_pfunc) {
+ try {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+ return pfunc->has_empty_codomain();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_max_1in_1codomain
+(JNIEnv* env , jobject j_this_pfunc) {
+ try {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+ return pfunc->max_in_codomain();
+ }
+ CATCH_ALL;
+ return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_maps
+(JNIEnv* env, jobject j_this_pfunc, jlong j_i) {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+ dimension_type i = jtype_to_unsigned<dimension_type>(j_i);
+ dimension_type j;
+ if (pfunc->maps(i, j))
+ return j;
+ else
+ return -1;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_insert
+(JNIEnv* env , jobject j_this_pfunc, jlong i, jlong j) {
+ try {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+ pfunc->insert(i, j);
+ }
+ CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_free
+(JNIEnv* env, jobject j_this) {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this)) {
+ delete pfunc;
+ void* null_ptr = 0;
+ set_ptr(env, j_this, null_ptr);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_finalize
+(JNIEnv* env, jobject j_this) {
+ Partial_Function* pfunc
+ = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this));
+ if (!is_java_marked(env, j_this))
+ delete pfunc;
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java
new file mode 100644
index 0000000..2fb8b28
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java
@@ -0,0 +1,87 @@
+/* Artificial_Parameter Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+/*!
+ An Artificial_Parameter object represents the result
+ of the integer division of a Linear_Expression (on the other
+ parameters, including the previously-defined artificials)
+ by an integer denominator (a Coefficient object).
+ The dimensions of the artificial parameters (if any) in a tree node
+ have consecutive indices starting from <code>dim+1</code>, where the value
+ of \c dim is computed as follows:
+ - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+ - for any other node of the tree, it is recusrively obtained by adding
+ the value of \c dim computed for the parent node to the number of
+ artificial parameters defined in the parent node.
+ \par
+ Since the numbering of dimensions for artificial parameters follows
+ the rule above, the addition of new problem variables and/or new problem
+ parameters to an already solved PIP_Problem object (as done when
+ incrementally solving a problem) will result in the systematic
+ renumbering of all the existing artificial parameters.
+*/
+public class Artificial_Parameter {
+
+ //! The value of the linear expression of \p this.
+ private Linear_Expression le;
+
+ //! The value of the denominatir of \p this.
+ private Coefficient den;
+
+ /*! \brief
+ Builds an artificial parameter from a linear expression
+ and a denominator.
+ */
+ public Artificial_Parameter(Linear_Expression e, Coefficient d) {
+ le = e.clone();
+ den = new Coefficient(d);
+ }
+
+ /*! \brief
+ Returns the linear expression in artificial parameter \p this.
+ */
+ public Linear_Expression linear_expression() {
+ return le;
+ }
+
+ /*! \brief
+ Returns the denominator in artificial parameter \p this.
+ */
+ public Coefficient denominator() {
+ return den;
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java
new file mode 100644
index 0000000..ec8dca6
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java
@@ -0,0 +1,42 @@
+/* Artificial_Parameter_Sequence Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A sequence of artificial parameters.
+/*! \ingroup PPL_Java_interface
+ An object of the class Artificial_Parameter_Sequence is a
+ sequence of artificial parameters.
+*/
+public class Artificial_Parameter_Sequence
+ extends java.util.ArrayList<Artificial_Parameter> {
+
+ //! Default constructor: builds an empty sequence of artificial parameters.
+ public Artificial_Parameter_Sequence() {
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java
new file mode 100644
index 0000000..40fd8f1
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java
@@ -0,0 +1,40 @@
+/* Bounded_Integer_Type_Overflow enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Overflow behavior of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Overflow {
+ //! On overflow, wrapping takes place.
+ OVERFLOW_WRAPS,
+ //! On overflow, the result is undefined.
+ OVERFLOW_UNDEFINED,
+ //! Overflow is impossible.
+ OVERFLOW_IMPOSSIBLE;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java
new file mode 100644
index 0000000..16a37b8
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java
@@ -0,0 +1,41 @@
+/* Bounded_Integer_Type_Representation enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Representation of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Representation {
+ //! Unsigned binary.
+ UNSIGNED,
+ /*! \brief
+ Signed binary where negative values are represented by the two's
+ complement of the absolute value.
+ */
+ SIGNED_2_COMPLEMENT;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java
new file mode 100644
index 0000000..3587f3f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java
@@ -0,0 +1,44 @@
+/* Bounded_Integer_Type_Width enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Widths of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Width {
+ //! Minimization is requested.
+ BITS_8,
+ //! \hideinitializer 16 bits.
+ BITS_16,
+ //! \hideinitializer 32 bits.
+ BITS_32,
+ //! \hideinitializer 64 bits.
+ BITS_64,
+ //! \hideinitializer 128 bits.
+ BITS_128;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/By_Reference.java b/interfaces/Java/parma_polyhedra_library/By_Reference.java
new file mode 100644
index 0000000..0390b6b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/By_Reference.java
@@ -0,0 +1,51 @@
+/* By_Reference Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! An utility class implementing mutable and non-mutable call-by-reference.
+/*! \ingroup PPL_Java_interface */
+public class By_Reference<T> {
+ //! Stores the object.
+ T obj;
+
+ //! Builds an object encapsulating \p object_value.
+ public By_Reference(T object_value) {
+ obj = object_value;
+ }
+
+ //! Set an object to value \p object_value.
+ public void set(T y) {
+ obj = y;
+ }
+
+ //! Returns the value held by \p this.
+ public T get() {
+ return obj;
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Coefficient.java b/interfaces/Java/parma_polyhedra_library/Coefficient.java
new file mode 100644
index 0000000..34a3f4b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Coefficient.java
@@ -0,0 +1,85 @@
+/* Coefficient Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import java.math.BigInteger;
+
+//! A PPL coefficient.
+/*! \ingroup PPL_Java_interface
+ Objects of type Coefficient are used to implement the integral valued
+ coefficients occurring in linear expressions, constraints, generators
+ and so on.
+*/
+public class Coefficient {
+
+ //! Holds the value of \p this.
+ private BigInteger value;
+
+ //! Builds a coefficient valued \p i.
+ public Coefficient(int i) {
+ value = BigInteger.valueOf(i);
+ }
+
+ //! Builds a coefficient valued \p l.
+ public Coefficient(long l) {
+ value = BigInteger.valueOf(l);
+ }
+
+ //! Builds a coefficient valued \p bi.
+ public Coefficient(BigInteger bi) {
+ value = bi;
+ }
+
+ //! Builds a coefficient from the decimal representation in \p s.
+ /*!
+ \exception java.lang.NumberFormatException
+ Thrown if \p s does not contain a valid decimal representation.
+ */
+ public Coefficient(String s) {
+ value = new BigInteger(s);
+ }
+
+ //! Builds a copy of \p c.
+ public Coefficient(Coefficient c) {
+ value = c.value;
+ }
+
+ //! Returns a String representation of \p this.
+ public String toString() {
+ return value.toString();
+ }
+
+ //! Returns the value held by \p this.
+ public BigInteger getBigInteger() {
+ return value;
+ }
+
+ //! Returns the number of bits of PPL coefficients; 0 if unbounded.
+ public static native int bits();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Complexity_Class.java b/interfaces/Java/parma_polyhedra_library/Complexity_Class.java
new file mode 100644
index 0000000..406497d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Complexity_Class.java
@@ -0,0 +1,40 @@
+/* Complexity_Class enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible Complexities.
+/*! \ingroup PPL_Java_interface */
+public enum Complexity_Class {
+ //! Worst-case polynomial complexity.
+ POLYNOMIAL_COMPLEXITY,
+ //! Worst-case exponential complexity but typically polynomial behavior.
+ SIMPLEX_COMPLEXITY,
+ //! Any complexity.
+ ANY_COMPLEXITY;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Congruence.java b/interfaces/Java/parma_polyhedra_library/Congruence.java
new file mode 100644
index 0000000..35a29bc
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Congruence.java
@@ -0,0 +1,86 @@
+/* Congruence Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear congruence.
+/*! \ingroup PPL_Java_interface
+ An object of the class Congruence is an object represeting a congruence:
+ - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\f$
+
+ where \f$n\f$ is the dimension of the space,
+ \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+ \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+ if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+ \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+ and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+ said to be a proper congruence.
+*/
+public class Congruence {
+
+ //! The modulus of the congruence.
+ protected Coefficient mod;
+
+ //! The value of the left hand side of \p this.
+ Linear_Expression lhs;
+
+ //! The value of the right hand side of \p this.
+ Linear_Expression rhs;
+
+ /*! \brief
+ Returns the congruence
+ \f$\mathtt{e1} = \mathtt{e2} \pmod{\mathtt{m}}\f$.
+ */
+ public Congruence(Linear_Expression e1, Linear_Expression e2,
+ Coefficient m) {
+ mod = new Coefficient(m);
+ lhs = e1.clone();
+ rhs = e2.clone();
+ }
+
+ //! Returns the left hand side of \p this.
+ public Linear_Expression left_hand_side() {
+ return lhs;
+ }
+
+ //! Returns the right hand side of \p this.
+ public Linear_Expression right_hand_side() {
+ return rhs;
+ }
+
+ //! Returns the relation symbol of \p this.
+ public Coefficient modulus() {
+ return mod;
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Congruence_System.java b/interfaces/Java/parma_polyhedra_library/Congruence_System.java
new file mode 100644
index 0000000..f7f43be
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Congruence_System.java
@@ -0,0 +1,46 @@
+/* Congruence_System Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of congruences.
+/*! \ingroup PPL_Java_interface
+ An object of the class Congruence_System is a system of congruences,
+ i.e., a multiset of objects of the class Congruence.
+*/
+public class Congruence_System extends java.util.ArrayList<Congruence> {
+ //! Default constructor: builds an empty system of congruences.
+ public Congruence_System() {
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Constraint.java b/interfaces/Java/parma_polyhedra_library/Constraint.java
new file mode 100644
index 0000000..d1862ee
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Constraint.java
@@ -0,0 +1,80 @@
+/* Constraint Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_Java_interface
+ An object of the class Constraint is either:
+ - a linear equality;
+ - a non-strict linear inequality;
+ - a strict linear inequality.
+*/
+public class Constraint {
+
+ //! The value of the left hand side of \p this.
+ private Linear_Expression lhs;
+
+ //! The value of the right hand side of \p this.
+ private Linear_Expression rhs;
+
+ //! The relation symbol of \p this.
+ private Relation_Symbol kind;
+
+ /*! \brief
+ Builds a constraint from two linear expressions with a specified
+ relation symbol.
+ */
+ public Constraint(Linear_Expression le1, Relation_Symbol rel_sym,
+ Linear_Expression le2) {
+ lhs = le1.clone();
+ rhs = le2.clone();
+ kind = rel_sym;
+ }
+
+ //! Returns the left hand side of \p this.
+ public Linear_Expression left_hand_side() {
+ return lhs;
+ }
+
+ //! Returns the right hand side of \p this.
+ public Linear_Expression right_hand_side() {
+ return rhs;
+ }
+
+ //! Returns the relation symbol of \p this.
+ public Relation_Symbol kind() {
+ return kind;
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Constraint_System.java b/interfaces/Java/parma_polyhedra_library/Constraint_System.java
new file mode 100644
index 0000000..cff9954
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Constraint_System.java
@@ -0,0 +1,47 @@
+/* Constraint_System Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of constraints.
+/*! \ingroup PPL_Java_interface
+ An object of the class Constraint_System is a system of constraints,
+ i.e., a multiset of objects of the class Constraint.
+*/
+public class Constraint_System extends java.util.ArrayList<Constraint> {
+
+ //! Default constructor: builds an empty system of constraints.
+ public Constraint_System() {
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
new file mode 100644
index 0000000..dcf0aad
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
@@ -0,0 +1,31 @@
+/* MIP_Problem Control_Parameter_Name enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Names of MIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum Control_Parameter_Name {
+ //! The pricing rule.
+ PRICING
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
new file mode 100644
index 0000000..da1ffb3
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
@@ -0,0 +1,35 @@
+/* MIP_Problem's Control_Parameter_Value enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible values for MIP problem's control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum Control_Parameter_Value {
+ //! Steepest edge pricing method, using floating points (default).
+ PRICING_STEEPEST_EDGE_FLOAT,
+ //! Steepest edge pricing method, using Coefficient.
+ PRICING_STEEPEST_EDGE_EXACT,
+ //! Textbook pricing method.
+ PRICING_TEXTBOOK
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java b/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
new file mode 100644
index 0000000..5d0da10
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
@@ -0,0 +1,38 @@
+/* Degenerate_Element enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_Java_interface */
+public enum Degenerate_Element {
+ //! The universe element, i.e., the whole vector space.
+ UNIVERSE,
+ //! The empty element, i.e., the empty set.
+ EMPTY;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
new file mode 100644
index 0000000..8d07af3
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
@@ -0,0 +1,33 @@
+/* Domain_Error_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by domain errors.
+/*! \ingroup PPL_Java_interface */
+public class Domain_Error_Exception extends RuntimeException {
+ //! Constructor.
+ public Domain_Error_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java b/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
new file mode 100644
index 0000000..87dd72d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
@@ -0,0 +1,1291 @@
+/* Doxumentation for the Java interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+// A fake class, just to cheat Doxygen.
+public class Fake_Class_For_Doxygen {}
+
+//! The Java base class for (C and NNC) convex polyhedra.
+/*! \ingroup PPL_Java_interface
+ The base class Polyhedron provides declarations for most of
+ the methods common to classes C_Polyhedron and NNC_Polyhedron.
+ Note that the user should always use the derived classes.
+ Moreover, C and NNC polyhedra can not be freely interchanged:
+ as specified in the main manual, most library functions require
+ their arguments to be topologically compatible.
+*/
+public class Polyhedron extends PPL_Object {
+
+ //! \name Member Functions that Do Not Modify the Polyhedron
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p this.
+ public native long space_dimension();
+
+ /*! \brief
+ Returns \f$0\f$, if \p this is empty; otherwise, returns the
+ \extref{Affine_Independence_and_Affine_Dimension, affine dimension}
+ of \p this.
+ */
+ public native long affine_dimension();
+
+ //! Returns the system of constraints.
+ public native Constraint_System constraints();
+
+ //! Returns a system of (equality) congruences satisfied by \p this.
+ public native Congruence_System congruences();
+
+ //! Returns the system of constraints, with no redundant constraint.
+ public native Constraint_System minimized_constraints();
+
+ /*! \brief
+ Returns a system of (equality) congruences satisfied by \p this,
+ with no redundant congruences and having the same affine dimension
+ as \p this.
+ */
+ public native Congruence_System minimized_congruences();
+
+ //! Returns \c true if and only if \p this is an empty polyhedron.
+ public native boolean is_empty();
+
+ //! Returns \c true if and only if \p this is a universe polyhedron.
+ public native boolean is_universe();
+
+ /*! \brief
+ Returns \c true if and only if \p this
+ is a bounded polyhedron.
+ */
+ public native boolean is_bounded();
+
+ //! Returns \c true if and only if \p this is discrete.
+ public native boolean is_discrete();
+
+ /*! \brief
+ Returns \c true if and only if \p this
+ is a topologically closed subset of the vector space.
+ */
+ public native boolean is_topologically_closed();
+
+ /*! \brief
+ Returns \c true if and only if \p this
+ contains at least one integer point.
+ */
+ public native boolean contains_integer_point();
+
+ /*! \brief
+ Returns \c true if and only if \p var is constrained in
+ \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p var is not a space dimension of \p this.
+ */
+ public native boolean constrains(Variable var);
+
+ /*! \brief
+ Returns \c true if and only if \p expr is
+ bounded from above in \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+ */
+ public native boolean bounds_from_above(Linear_Expression expr);
+
+ /*! \brief
+ Returns \c true if and only if \p expr is
+ bounded from below in \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+ */
+ public native boolean bounds_from_below(Linear_Expression expr);
+
+ /*! \brief
+ Returns \c true if and only if \p this is not empty
+ and \p expr is bounded from above in \p this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ \c true if and only if the supremum is also the maximum value.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+
+ If \p this is empty or \p expr is not bounded from above,
+ \c false is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ public native boolean maximize(Linear_Expression expr,
+ Coefficient sup_n, Coefficient sup_d,
+ By_Reference<Boolean> maximum);
+
+ /*! \brief
+ Returns \c true if and only if \p this is not empty
+ and \p expr is bounded from below in \p this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ \c true if and only if the infimum is also the minimum value.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+
+ If \p this is empty or \p expr is not bounded from below,
+ \c false is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ public native boolean minimize(Linear_Expression expr,
+ Coefficient inf_n, Coefficient inf_d,
+ By_Reference<Boolean> minimum);
+
+ /*! \brief
+ Returns \c true if and only if \p this is not empty
+ and \p expr is bounded from above in \p this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ \c true if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+
+ If \p this is empty or \p expr is not bounded from above,
+ \c false is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ public native boolean maximize(Linear_Expression expr,
+ Coefficient sup_n, Coefficient sup_d,
+ By_Reference<Boolean> maximum,
+ Generator g);
+
+ /*! \brief
+ Returns \c true if and only if \p this is not empty
+ and \p expr is bounded from below in \p this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ \c true if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p expr and \p this are dimension-incompatible.
+
+ If \p this is empty or \p expr is not bounded from below,
+ \c false is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ public native boolean minimize(Linear_Expression expr,
+ Coefficient inf_n, Coefficient inf_d,
+ By_Reference<Boolean> minimum,
+ Generator g);
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p this
+ and the constraint \p c.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and constraint \p c are dimension-incompatible.
+ */
+ public native Poly_Con_Relation relation_with(Constraint c);
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p this
+ and the generator \p g.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and generator \p g are dimension-incompatible.
+ */
+ public native Poly_Gen_Relation relation_with(Generator c);
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p this
+ and the congruence \p c.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and congruence \p c are dimension-incompatible.
+ */
+ public native Poly_Con_Relation relation_with(Congruence c);
+
+ //! Returns \c true if and only if \p this contains \p y.
+ /*!
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native boolean contains(Polyhedron y);
+
+ //! Returns \c true if and only if \p this strictly contains \p y.
+ /*!
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native boolean strictly_contains(Polyhedron y);
+
+ //! Returns \c true if and only if \p this and \p y are disjoint.
+ /*!
+ \exception Invalid_Argument_Exception
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native boolean is_disjoint_from(Polyhedron y);
+
+ //! Returns \c true if and only if \p this and \p y are equal.
+ public native boolean equals(Polyhedron y);
+
+ //! Returns \c true if and only if \p this and \p y are equal.
+ public boolean equals(Object y);
+
+ //! Returns a hash code for \p this.
+ /*!
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ public native int hashCode();
+
+ //! Returns the size in bytes of the memory managed by \p this.
+ public native long external_memory_in_bytes();
+
+ //! Returns the total size in bytes of the memory occupied by \p this.
+ public native long total_memory_in_bytes();
+
+ //! Returns a string representing \p this.
+ public native String toString();
+
+ /*! \brief
+ Returns a string containing a low-level representation of \p this.
+
+ Useful for debugging purposes.
+ */
+ public native String ascii_dump();
+
+ //! Checks if all the invariants are satisfied.
+ public native boolean OK();
+
+ //@} // Member Functions that Do Not Modify the Polyhedron
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ of \p this (without minimizing the result).
+
+ \param c
+ The constraint that will be added to the system of
+ constraints of \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ public native void add_constraint(Constraint c);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to \p this,
+ if \p cg can be exactly represented by a polyhedron.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and congruence \p cg are dimension-incompatible,
+ of if \p cg is a proper congruence which is neither a tautology,
+ nor a contradiction.
+ */
+ public native void add_congruence(Congruence cg);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the system
+ of constraints of \p this (without minimizing the result).
+
+ \param cs
+ Contains the constraints that will be added to the system of
+ constraints of \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void add_constraints(Constraint_System cs);
+
+ /*! \brief
+ Adds a copy of the congruences in \p cgs to \p this,
+ if all the congruences can be exactly represented by a polyhedron.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p cgs are dimension-incompatible,
+ of if there exists in \p cgs a proper congruence which is
+ neither a tautology, nor a contradiction.
+ */
+ public native void add_congruences(Congruence_System cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and constraint \p c are dimension-incompatible.
+ */
+ public native void refine_with_constraint(Constraint c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and congruence \p cg are dimension-incompatible.
+ */
+ public native void refine_with_congruence(Congruence cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine \p this.
+
+ \param cs
+ Contains the constraints used to refine the system of
+ constraints of \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p cs are dimension-incompatible.
+ */
+ public native void refine_with_constraints(Constraint_System cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine \p this.
+
+ \param cgs
+ Contains the congruences used to refine the system of
+ constraints of \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p cgs are dimension-incompatible.
+ */
+ public native void refine_with_congruences(Congruence_System cgs);
+
+ /*! \brief
+ Assigns to \p this the intersection of \p this and \p y.
+ The result is not guaranteed to be minimized.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void intersection_assign(Polyhedron y);
+
+ /*! \brief
+ Assigns to \p this the upper bound of \p this and \p y.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void upper_bound_assign(Polyhedron y);
+
+ /*! \brief
+ Assigns to \p this
+ the \extref{Convex_Polyhedral_Difference, poly-difference}
+ of \p this and \p y. The result is not guaranteed to be minimized.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void difference_assign(Polyhedron y);
+
+ /*! \brief
+ Assigns to \p this the result of computing the
+ \extref{Time_Elapse_Operator, time-elapse} between \p this and \p y.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void time_elapse_assign(Polyhedron y);
+
+ //! Assigns to \p this its topological closure.
+ public native void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p this a \extref{Meet_Preserving_Simplification,
+ meet-preserving simplification} of \p this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native boolean simplify_using_context_assign(Polyhedron y);
+
+ /*! \brief
+ Assigns to \p this the
+ \extref{Single_Update_Affine_Functions, affine image}
+ of \p this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p expr and \p this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p this.
+ */
+ public native void affine_image(Variable var, Linear_Expression expr,
+ Coefficient denominator);
+
+ /*! \brief
+ Assigns to \p this the
+ \extref{Single_Update_Affine_Functions, affine preimage}
+ of \p this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p expr and \p this are
+ dimension-incompatible or if \p var is not a space dimension of \p this.
+ */
+ public native void affine_preimage(Variable var, Linear_Expression expr,
+ Coefficient denominator);
+
+ /*!
+ \brief
+ Assigns to \p this the image of \p this with respect to the
+ \extref{Single_Update_Bounded_Affine_Relations, bounded affine relation}
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p this are dimension-incompatible or if \p var is not a space
+ dimension of \p this.
+ */
+ public native void bounded_affine_image(Variable var,
+ Linear_Expression lb_expr,
+ Linear_Expression ub_expr,
+ Coefficient denominator);
+
+ /*! \brief
+ Assigns to \p this the preimage of \p this with respect to the
+ \extref{Single_Update_Bounded_Affine_Relations, bounded affine relation}
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p this are dimension-incompatible or if \p var is not a space
+ dimension of \p this.
+ */
+ public native void bounded_affine_preimage(Variable var,
+ Linear_Expression lb_expr,
+ Linear_Expression ub_expr,
+ Coefficient denominator);
+
+ /*! \brief
+ Assigns to \p this the image of \p this with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p expr and \p this are
+ dimension-incompatible or if \p var is not a space dimension of \p this
+ or if \p this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ public native void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ Linear_Expression expr,
+ Coefficient denominator);
+
+ /*! \brief
+ Assigns to \p this the preimage of \p this with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p denominator is zero or if \p expr and \p this are
+ dimension-incompatible or if \p var is not a space dimension of \p this
+ or if \p this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ public native void generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ Linear_Expression expr,
+ Coefficient denominator);
+
+ /*! \brief
+ Assigns to \p this the image of \p this with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this is dimension-incompatible with \p lhs or \p rhs
+ or if \p this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ public native void generalized_affine_image(Linear_Expression lhs,
+ Relation_Symbol relsym,
+ Linear_Expression rhs);
+
+ /*! \brief
+ Assigns to \p this the preimage of \p this with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this is dimension-incompatible with \p lhs or \p rhs
+ or if \p this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ public native void generalized_affine_preimage(Linear_Expression lhs,
+ Relation_Symbol relsym,
+ Linear_Expression rhs);
+
+ /*! \brief
+ Computes the \extref{Cylindrification, cylindrification} of \p this
+ with respect to space dimension \p var, assigning the result to \p this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p var is not a space dimension of \p this.
+ */
+ public native void unconstrain_space_dimension(Variable var);
+
+ /*! \brief
+ Computes the \extref{Cylindrification, cylindrification} of \p this
+ with respect to the set of space dimensions \p vars,
+ assigning the result to \p this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ public native void unconstrain_space_dimensions(Variables_Set vars);
+
+ /*! \brief
+ Assigns to \p this the result of computing the
+ \extref{H79_widening, H79-widening} between \p this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void widening_assign(Polyhedron y,
+ By_Reference<Integer> tp);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ Swaps \p this with polyhedron \p y.
+ (\p this and \p y can be dimension-incompatible.)
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p x and \p y are topology-incompatible.
+ */
+ public native void swap(Polyhedron y);
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old polyhedron
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception Length_Error_Exception
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ public native void add_space_dimensions_and_embed(long m);
+
+ /*! \brief
+ Adds \p m new space dimensions to the polyhedron
+ and does not embed it in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception Length_Error_Exception
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ public native void add_space_dimensions_and_project(long m);
+
+ /*! \brief
+ Assigns to \p this the \extref{Concatenating_Polyhedra, concatenation}
+ of \p this and \p y, taken in this order.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible.
+
+ \exception Length_Error_Exception
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ public native void concatenate_assign(Polyhedron y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ public native void remove_space_dimensions(Variables_Set vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that
+ the resulting space will have dimension \p new_dimension.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p this.
+ */
+ public native void remove_higher_space_dimensions(long
+ new_dimension);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception Length_Error_Exception
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ public native void expand_space_dimension(Variable var, long m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+ */
+ public native void fold_space_dimensions(Variables_Set vars,
+ Variable dest);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+
+ \param pfunc
+ The partial function specifying the destiny of each space dimension.
+ */
+ public native void map_space_dimensions(Partial_Function pfunc);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ /*! \name Ad Hoc Functions for (C or NNC) Polyhedra
+ The functions listed here below, being specific of the polyhedron
+ domains, do not have a correspondence in other semantic geometric
+ descriptions.
+ */
+ //@{
+
+ //! Returns the system of generators.
+ public native Generator_System generators();
+
+ //! Returns the system of generators, with no redundant generator.
+ public native Generator_System minimized_generators();
+
+ /*! \brief
+ Adds a copy of generator \p g to the system of generators
+ of \p this (without minimizing the result).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and generator \p g are topology-incompatible or
+ dimension-incompatible, or if \p this is an empty polyhedron and
+ \p g is not a point.
+ */
+ public native void add_generator(Generator g);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system
+ of generators of \p this (without minimizing the result).
+
+ \param gs
+ Contains the generators that will be added to the system of
+ generators of \p this.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p gs are topology-incompatible or
+ dimension-incompatible, or if \p this is empty and the system of
+ generators \p gs is not empty, but has no points.
+ */
+ public native void add_generators(Generator_System gs);
+
+ //! Same as upper_bound_assign.
+ public native void poly_hull_assign(Polyhedron y);
+
+ //! Same as difference_assign.
+ public native void poly_difference_assign(Polyhedron y);
+
+ /*! \brief
+ Assigns to \p this the result of computing the
+ \extref{BHRZ03_widening, BHRZ03-widening} between \p this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void BHRZ03_widening_assign(Polyhedron y,
+ By_Reference<Integer> tp);
+
+ /*! \brief
+ Assigns to \p this the result of computing the
+ \extref{H79_widening, H79-widening} between \p this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native void H79_widening_assign(Polyhedron y,
+ By_Reference<Integer> tp);
+
+ /*! \brief
+ Improves the result of the \extref{BHRZ03_widening, BHRZ03-widening}
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p this.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native
+ void limited_BHRZ03_extrapolation_assign(Polyhedron y,
+ Constraint_System cs,
+ By_Reference<Integer> tp);
+
+ /*! \brief
+ Improves the result of the \extref{H79_widening, H79-widening}
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p this.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native
+ void limited_H79_extrapolation_assign(Polyhedron y,
+ Constraint_System cs,
+ By_Reference<Integer> tp);
+
+ /*! \brief
+ Improves the result of the \extref{BHRZ03_widening, BHRZ03-widening}
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p this, plus all the constraints
+ of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+ \f$r \in \Qset\f$, that are satisfied by all the points of \p this.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native
+ void bounded_BHRZ03_extrapolation_assign(Polyhedron y,
+ Constraint_System cs,
+ By_Reference<Integer> tp);
+
+ /*! \brief
+ Improves the result of the \extref{H79_widening, H79-widening}
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p this, plus all the constraints
+ of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+ \f$r \in \Qset\f$, that are satisfied by all the points of \p this.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ A reference to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ public native
+ void bounded_H79_extrapolation_assign(Polyhedron y,
+ Constraint_System cs,
+ By_Reference<Integer> tp);
+
+ //@} // Ad Hoc Functions for (C or NNC) Polyhedra
+
+} // class Polyhedron
+
+
+//! A topologically closed convex polyhedron.
+/*! \ingroup PPL_Java_interface */
+public class C_Polyhedron extends Polyhedron {
+
+ //! \name Standard Constructors and Destructor
+ //@{
+
+ //! Builds a new C polyhedron of dimension \p d.
+ /*!
+ If \p kind is \c EMPTY, the newly created polyhedron will be empty;
+ otherwise, it will be a universe polyhedron.
+ */
+ public C_Polyhedron(long d, Degenerate_Element kind);
+
+ //! Builds a new C polyhedron that is copy of \p y.
+ public C_Polyhedron(C_Polyhedron y);
+
+ //! Builds a new C polyhedron that is a copy of \p ph.
+ /*!
+ The complexity argument is ignored.
+ */
+ public C_Polyhedron(C_Polyhedron y, Complexity_Class complexity);
+
+ //! Builds a new C polyhedron from the system of constraints \p cs.
+ /*!
+ The new polyhedron will inherit the space dimension of \p cs.
+ */
+ public C_Polyhedron(Constraint_System cs);
+
+ //! Builds a new C polyhedron from the system of congruences \p cgs.
+ /*!
+ The new polyhedron will inherit the space dimension of \p cgs.
+ */
+ public C_Polyhedron(Congruence_System cgs);
+
+ /*! \brief
+ Releases all resources managed by \p this,
+ also resetting it to a null reference.
+ */
+ public native void free();
+
+ //@} // Standard Constructors and Destructor
+
+ /*! \name Constructors Behaving as Conversion Operators
+ Besides the conversions listed here below, the library also
+ provides conversion operators that build a semantic geometric
+ description starting from \b any other semantic geometric
+ description (e.g., <code>Grid(C_Polyhedron y)</code>,
+ <code>C_Polyhedron(BD_Shape_mpq_class y)</code>, etc.).
+ Clearly, the conversion operators are only available if both
+ the source and the target semantic geometric descriptions have
+ been enabled when configuring the library.
+ The conversions also taking as argument a complexity class
+ sometimes provide non-trivial precision/efficiency trade-offs.
+ */
+ //@{
+
+ /*! \brief
+ Builds a C polyhedron that is a copy of the topological closure
+ of the NNC polyhedron \p y.
+ */
+ public C_Polyhedron(NNC_Polyhedron y);
+
+ /*! \brief
+ Builds a C polyhedron that is a copy of the topological closure
+ of the NNC polyhedron \p y.
+
+ The complexity argument is ignored, since the exact constructor
+ has polynomial complexity.
+ */
+ public C_Polyhedron(NNC_Polyhedron y, Complexity_Class complexity);
+
+ //! Builds a new C polyhedron from the system of generators \p gs.
+ /*!
+ The new polyhedron will inherit the space dimension of \p gs.
+ */
+ public C_Polyhedron(Generator_System gs);
+
+ //@} // Constructors Behaving as Conversion Operators
+
+ //! \name Other Methods
+ //@{
+
+ /*! \brief
+ If the upper bound of \p this and \p y is exact it is assigned
+ to \p this and \c true is returned; otherwise \c false is returned.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p y are dimension-incompatible.
+ */
+ public native boolean upper_bound_assign_if_exact(C_Polyhedron y);
+
+ //@} // Other Methods.
+
+ //! Partitions \p q with respect to \p p.
+ /*!
+ Let \p p and \p q be two polyhedra.
+ The function returns a pair object \p r such that
+ - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+ - <CODE>r.second</CODE> has the property that all its elements are
+ pairwise disjoint and disjoint from \p p;
+ - the set-theoretical union of <CODE>r.first</CODE> with all the
+ elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+ is the representation of a partition of \p q).
+ */
+ public static native
+ Pair<C_Polyhedron, Pointset_Powerset_NNC_Polyhedron>
+ linear_partition(C_Polyhedron p, C_Polyhedron q);
+
+ //! Releases all resources managed by \p this.
+ protected native void finalize();
+
+} // class C_Polyhedron
+
+
+//! A powerset of C_Polyhedron objects.
+/*! \ingroup PPL_Java_interface
+ The powerset domains can be instantiated by taking as a base domain
+ any fixed semantic geometric description
+ (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+ An element of the powerset domain represents a disjunctive collection
+ of base objects (its disjuncts), all having the same space dimension.
+
+ Besides the methods that are available in all semantic geometric
+ descriptions (whose documentation is not repeated here),
+ the powerset domain also provides several ad hoc methods.
+ In particular, the iterator types allow for the examination and
+ manipulation of the collection of disjuncts.
+*/
+public class Pointset_Powerset_C_Polyhedron extends PPL_Object {
+
+ //! \name Ad Hoc Functions for Pointset_Powerset domains
+ /*@{*/
+
+ /*! \brief
+ Drops from the sequence of disjuncts in \p this all the non-maximal
+ elements, so that a non-redundant powerset if obtained.
+ */
+ public native void omega_reduce();
+
+ //! Returns the number of disjuncts.
+ /*!
+ If present, Omega-redundant elements will be counted too.
+ */
+ public native long size();
+
+ //! Returns \c true if and only if \p this geometrically covers \p y.
+ public native boolean
+ geometrically_covers(Pointset_Powerset_C_Polyhedron y);
+
+ //! Returns \c true if and only if \p this is geometrically equal to \p y.
+ public native boolean
+ geometrically_equals(Pointset_Powerset_C_Polyhedron y);
+
+ /*! \brief
+ Returns an iterator referring to the beginning of the sequence
+ of disjuncts of \p this.
+ */
+ public native Pointset_Powerset_C_Polyhedron_Iterator begin_iterator();
+
+ /*! \brief
+ Returns an iterator referring to past the end of the sequence
+ of disjuncts of \p this.
+ */
+ public native Pointset_Powerset_C_Polyhedron_Iterator end_iterator();
+
+ //! Adds to \p this a copy of disjunct \p d.
+ public native void add_disjunct(C_Polyhedron d);
+
+ // FIXME: this method needs correction, as it returns nothing.
+ /*! \brief
+ Drops from \p this the disjunct referred by \p iter; returns an
+ iterator referring to the disjunct following the dropped one.
+ */
+ public native void
+ drop_disjunct(Pointset_Powerset_C_Polyhedron_Iterator iter);
+
+
+ /*! \brief
+ Drops from \p this all the disjuncts from \p first to \p last
+ (excluded).
+ */
+ public native void
+ drop_disjuncts(Pointset_Powerset_C_Polyhedron_Iterator first,
+ Pointset_Powerset_C_Polyhedron_Iterator last);
+
+
+ /*! \brief
+ Modifies \p this by (recursively) merging together the pairs of
+ disjuncts whose upper-bound is the same as their set-theoretical union.
+ */
+ public native void pairwise_reduce();
+
+ /*@}*/ /* Ad Hoc Functions for Pointset_Powerset domains */
+
+} // class Pointset_Powerset_C_Polyhedron
+
+
+//! An iterator class for the disjuncts of a Pointset_Powerset_C_Polyhedron.
+/*! \ingroup PPL_Java_interface */
+public class Pointset_Powerset_C_Polyhedron_Iterator extends PPL_Object {
+
+ //! Builds a copy of iterator \p y.
+ public Pointset_Powerset_C_Polyhedron_Iterator
+ (Pointset_Powerset_C_Polyhedron_Iterator y);
+
+ //! Returns \c true if and only if \p this and \p itr are equal.
+ public native boolean equals(Pointset_Powerset_C_Polyhedron_Iterator itr);
+
+ //! Modifies \p this so that it refers to the next disjunct.
+ public native void next();
+
+ //! Modifies \p this so that it refers to the previous disjunct.
+ public native void prev();
+
+ //! Returns the disjunct referenced by \p this.
+ /*!
+ \warning
+ On exit, the C_Polyhedron disjunct is still owned by the powerset
+ object: any function call on the owning powerset object may
+ invalidate it. Moreover, the disjunct is meant to be immutable
+ and should not be modified in any way (its resources will
+ be released when deleting the owning powerset). If really needed,
+ the disjunct may be copied into a new object, which will be under
+ control of the user.
+ */
+ public native C_Polyhedron get_disjunct();
+
+ //! Releases resources and resets \p this to a null reference.
+ public native void free();
+
+ //! Releases the resources managed by \p this.
+ protected native void finalize();
+
+} // class Pointset_Powerset_C_Polyhedron_Iterator
diff --git a/interfaces/Java/parma_polyhedra_library/Generator.java b/interfaces/Java/parma_polyhedra_library/Generator.java
new file mode 100644
index 0000000..6001ad7
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator.java
@@ -0,0 +1,145 @@
+/* Generator Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_Java_interface
+ An object of the class Generator is one of the following:
+ - a line;
+ - a ray;
+ - a point;
+ - a closure point.
+*/
+public class Generator {
+ //! The generator type.
+ private Generator_Type gt;
+
+ //! The linear expression.
+ private Linear_Expression le;
+
+ //! The divisor (valid if the generator is a point or a closure point).
+ private Coefficient div;
+
+ /*! \brief
+ Builds a generator of type \p g_type,
+ stealing the coefficients from \p e.
+ */
+ private Generator(Linear_Expression e, Generator_Type g_type) {
+ le = e.clone();
+ gt = g_type;
+ }
+
+ //! Returns the closure point at \p e / \p d.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p d is zero.
+ */
+ public static Generator closure_point(Linear_Expression e, Coefficient d) {
+ if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+ Error cause = new Error("parma_polyhedra_library.Generator::"
+ + "Generator(e, d):\n"
+ + "the divisor can not be zero.");
+ throw new RuntimeErrorException(cause);
+ }
+ Generator g = new Generator(e, Generator_Type.CLOSURE_POINT);
+ g.div = new Coefficient(d);
+ return g;
+ }
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ public static Generator line(Linear_Expression e) {
+ return new Generator(e, Generator_Type.LINE);
+ }
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p d is zero.
+ */
+ public static Generator point(Linear_Expression e, Coefficient d) {
+ if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+ Error cause = new Error("parma_polyhedra_library.Generator::"
+ + "Generator(e, d):\n"
+ + "the divisor can not be zero.");
+ throw new RuntimeErrorException(cause);
+ }
+
+ Generator g = new Generator(e, Generator_Type.POINT);
+ g.div = new Coefficient(d);
+ return g;
+ }
+
+ //! Returns the ray of direction \p e.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ public static Generator ray(Linear_Expression e) {
+ return new Generator(e, Generator_Type.RAY);
+ }
+
+ //! Returns the generator type.
+ public Generator_Type type() {
+ return gt;
+ }
+
+ //! Returns the linear expression in \p this.
+ public Linear_Expression linear_expression() {
+ return le;
+ }
+
+ //! If \p this is either a point or a closure point, returns its divisor.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p this is neither a point nor a closure point.
+ */
+ public Coefficient divisor() {
+ if (this.gt == Generator_Type.POINT
+ || this.gt == Generator_Type.CLOSURE_POINT)
+ return div;
+ Error cause = new Error("parma_polyhedra_library.Generator::divisor:\n"
+ + "this is neither a point"
+ + " nor a closure point.");
+ throw new RuntimeErrorException(cause);
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Generator_System.java b/interfaces/Java/parma_polyhedra_library/Generator_System.java
new file mode 100644
index 0000000..7175f2d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator_System.java
@@ -0,0 +1,48 @@
+/* Generator_System Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of generators.
+/*! \ingroup PPL_Java_interface
+ An object of the class Generator_System is a system of generators,
+ i.e., a multiset of objects of the class Generator
+ (lines, rays, points and closure points).
+*/
+public class Generator_System extends java.util.ArrayList<Generator> {
+
+ //! Default constructor: builds an empty system of generators.
+ public Generator_System() {
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Generator_Type.java b/interfaces/Java/parma_polyhedra_library/Generator_Type.java
new file mode 100644
index 0000000..7e2342d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator_Type.java
@@ -0,0 +1,42 @@
+/* Generator_Type enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The generator type.
+/*! \ingroup PPL_Java_interface */
+public enum Generator_Type {
+ //! The generator is a line.
+ LINE,
+ //! The generator is a ray.
+ RAY,
+ //! The generator is a point.
+ POINT,
+ //! The generator is a closure point.
+ CLOSURE_POINT;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator.java
new file mode 100644
index 0000000..3caad9e
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator.java
@@ -0,0 +1,123 @@
+/* Grid Generator Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_Java_interface
+ An object of the class Grid_Generator is one of the following:
+ - a grid_line;
+ - a parameter;
+ - a grid_point.
+*/
+public class Grid_Generator {
+
+ //! The grid generator type.
+ private Grid_Generator_Type gt;
+
+ //! The linear expression.
+ private Linear_Expression le;
+
+ /*! \brief
+ The coefficient used if the grid generator is a
+ parameter or a grid point a parameter.
+ */
+ private Coefficient div;
+
+ private Grid_Generator(Linear_Expression e, Coefficient d,
+ Grid_Generator_Type generator_type) {
+ le = e.clone();
+ div = new Coefficient(d);
+ gt = generator_type;
+ }
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ public static Grid_Generator grid_line(Linear_Expression e) {
+ return new Grid_Generator(e, new Coefficient(0),
+ Grid_Generator_Type.LINE);
+ }
+
+ //! Returns the parameter at \p e / \p d.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p d is zero.
+ */
+ public static Grid_Generator parameter(Linear_Expression e,
+ Coefficient d) {
+ return new Grid_Generator(e, d, Grid_Generator_Type.PARAMETER);
+ }
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p d is zero.
+ */
+ public static Grid_Generator grid_point(Linear_Expression e,
+ Coefficient d) {
+ return new Grid_Generator(e, d, Grid_Generator_Type.POINT);
+ }
+
+ //! Returns the generator type.
+ public Grid_Generator_Type type() {
+ return gt;
+ }
+
+ //! Returns the linear expression in \p this.
+ public Linear_Expression linear_expression() {
+ return le;
+ }
+
+ //! If \p this is either a grid point or a parameter, returns its divisor.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if \p this is a line.
+ */
+ public Coefficient divisor() {
+ if (this.gt != Grid_Generator_Type.LINE)
+ return div;
+ Error cause = new Error("parma_polyhedra_library."
+ + "Grid_Generator::divisor:\n"
+ + "this is neither a grid point"
+ + " nor a parameter.");
+ throw new RuntimeErrorException(cause);
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
new file mode 100644
index 0000000..d9cb51f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
@@ -0,0 +1,49 @@
+/* Grid Generator_System Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A system of grid generators.
+/*! \ingroup PPL_Java_interface
+ An object of the class Grid_Generator_System is a system of grid
+ generators, i.e., a multiset of objects of the class Grid_Generator.
+*/
+public class Grid_Generator_System
+ extends java.util.ArrayList<Grid_Generator> {
+
+ //! Default constructor: builds an empty system of grid generators.
+ public Grid_Generator_System() {
+ }
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
new file mode 100644
index 0000000..2efdca2
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
@@ -0,0 +1,40 @@
+/* Grid_Generator_Type enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The grid generator type.
+/*! \ingroup PPL_Java_interface */
+public enum Grid_Generator_Type {
+ //! The generator is a line.
+ LINE,
+ //! The generator is a parameter.
+ PARAMETER,
+ //! The generator is a point.
+ POINT;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/IO.java b/interfaces/Java/parma_polyhedra_library/IO.java
new file mode 100644
index 0000000..12b868b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/IO.java
@@ -0,0 +1,48 @@
+/* IO Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A class collecting I/O functions.
+/*! \ingroup PPL_Java_interface */
+public class IO {
+ //! Utility function for the wrapping of lines of text.
+ /*!
+ \param str
+ The source string holding the lines to wrap.
+
+ \param indent_depth
+ The indentation depth.
+
+ \param preferred_first_line_length
+ The preferred length for the first line of text.
+
+ \param preferred_line_length
+ The preferred length for all the lines but the first one.
+
+ \return
+ The wrapped string.
+ */
+ public static native String wrap_string(String str, int indent_depth,
+ int preferred_first_line_length, int preferred_line_length);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java b/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
new file mode 100644
index 0000000..abc803a
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
@@ -0,0 +1,34 @@
+/* Invalid_Argument_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by invalid arguments.
+/*! \ingroup PPL_Java_interface */
+public class Invalid_Argument_Exception extends RuntimeException {
+ //! Constructor.
+ public Invalid_Argument_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
new file mode 100644
index 0000000..85170da
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
@@ -0,0 +1,33 @@
+/* Length_Error_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by too big length/size values.
+/*! \ingroup PPL_Java_interface */
+public class Length_Error_Exception extends RuntimeException {
+ //! Constructor.
+ public Length_Error_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression.java
new file mode 100644
index 0000000..4f224cd
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression.java
@@ -0,0 +1,76 @@
+/* Linear_Expression Java declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression.
+/*! \ingroup PPL_Java_interface
+ An object of the class Linear_Expression represents a linear expression
+ that can be built from a Linear_Expression_Variable,
+ Linear_Expression_Coefficient, Linear_Expression_Sum,
+ Linear_Expression_Difference, Linear_Expression_Unary_Minus.
+*/
+public abstract class Linear_Expression implements Cloneable {
+
+ //! Returns the sum of \p this and \p y.
+ public Linear_Expression sum(Linear_Expression y) {
+ return new Linear_Expression_Sum(this, y);
+ }
+
+ //! Returns the difference of \p this and \p y.
+ public Linear_Expression subtract(Linear_Expression y) {
+ return new Linear_Expression_Difference(this, y);
+ }
+
+ //! Returns the product of \p this times \p c.
+ public Linear_Expression times(Coefficient c) {
+ return new Linear_Expression_Times(this, c);
+ }
+
+ //! Returns the negation of \p this.
+ public Linear_Expression unary_minus() {
+ return new Linear_Expression_Unary_Minus(this);
+ }
+
+ //! Returns a copy of the linear expression.
+ public abstract Linear_Expression clone();
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ //! Returns <CODE>true</CODE> if and only if \p this is \f$0\f$.
+ public native boolean is_zero();
+
+ /*! \brief Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p this are \f$0\f$.
+ */
+ public native boolean all_homogeneous_terms_are_zero();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
new file mode 100644
index 0000000..aa0f9f5
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
@@ -0,0 +1,54 @@
+/* Linear_Expression_Coefficient class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression built from a coefficient.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Coefficient
+ extends Linear_Expression {
+
+ //! The coefficient representing the linear expression.
+ protected Coefficient coeff;
+
+ //! Builds the object corresponding to a copy of the coefficient \p c.
+ public Linear_Expression_Coefficient(Coefficient c) {
+ coeff = new Coefficient(c);
+ }
+
+ //! Returns coefficient representing the linear expression.
+ public Coefficient argument() {
+ return coeff;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Coefficient clone() {
+ return new Linear_Expression_Coefficient(coeff);
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
new file mode 100644
index 0000000..614bb02
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
@@ -0,0 +1,66 @@
+/* Linear_Expression_Difference class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The difference of two linear expressions.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Difference
+ extends Linear_Expression {
+
+ //! The value of the left hand side of \p this.
+ protected Linear_Expression lhs;
+
+ //! The value of the right hand side of \p this.
+ protected Linear_Expression rhs;
+
+ /*! \brief
+ Builds an object that represents the difference of the copy \p x and
+ \p y.
+ */
+ public Linear_Expression_Difference(Linear_Expression x,
+ Linear_Expression y) {
+ lhs = x.clone();
+ rhs = y.clone();
+ }
+
+ //! Returns the left hand side of \p this.
+ public Linear_Expression left_hand_side() {
+ return lhs;
+ }
+
+ //! Returns the left hand side of \p this.
+ public Linear_Expression right_hand_side() {
+ return rhs;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Difference clone() {
+ return new Linear_Expression_Difference(lhs, rhs);
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
new file mode 100644
index 0000000..70f3930
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
@@ -0,0 +1,62 @@
+/* Linear_Expression_Sum class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The sum of two linear expressions.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Sum
+ extends Linear_Expression {
+
+ //! The value of the left hand side of \p this.
+ protected Linear_Expression lhs;
+
+ //! The value of the right hand side of \p this.
+ protected Linear_Expression rhs;
+
+ //! Builds an object that represents the sum of the copy of \p x and \p y.
+ public Linear_Expression_Sum(Linear_Expression x, Linear_Expression y) {
+ lhs = x.clone();
+ rhs = y.clone();
+ }
+
+ //! Returns the left hand side of \p this.
+ public Linear_Expression left_hand_side() {
+ return lhs;
+ }
+
+ //! Returns the right hand side of \p this.
+ public Linear_Expression right_hand_side() {
+ return rhs;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Sum clone() {
+ return new Linear_Expression_Sum(lhs, rhs);
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
new file mode 100644
index 0000000..3cc64f6
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
@@ -0,0 +1,74 @@
+/* Linear_Expression_Times class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The product of a linear expression and a coefficient.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Times
+ extends Linear_Expression {
+
+ //! The value of the coefficient.
+ protected Coefficient coeff;
+
+ //! The value of the inner linear expression.
+ protected Linear_Expression lin_expr;
+
+ //! Builds an object cloning the input arguments.
+ public Linear_Expression_Times(Coefficient c, Variable v) {
+ coeff = new Coefficient(c);
+ lin_expr = new Linear_Expression_Variable(v);
+ }
+
+ //! Builds an object cloning the input arguments.
+ public Linear_Expression_Times(Coefficient c, Linear_Expression l) {
+ coeff = new Coefficient(c);
+ lin_expr = l.clone();
+ }
+
+ //! Builds an object cloning the input arguments.
+ public Linear_Expression_Times(Linear_Expression l, Coefficient c) {
+ coeff = new Coefficient(c);
+ lin_expr = l.clone();
+ }
+
+ //! Returns the coefficient of \p this.
+ public Coefficient coefficient() {
+ return coeff;
+ }
+
+ //! Returns the linear expression subobject of \p this.
+ public Linear_Expression linear_expression() {
+ return lin_expr;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Times clone() {
+ return new Linear_Expression_Times(coeff, lin_expr);
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
new file mode 100644
index 0000000..dae5a35
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
@@ -0,0 +1,54 @@
+/* Linear_Expression_Unary_Minus class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The negation of a linear expression.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Unary_Minus
+ extends Linear_Expression {
+
+ //! The value that \p this negates.
+ protected Linear_Expression arg;
+
+ //! Builds an object that represents the negation of the copy \p x.
+ public Linear_Expression_Unary_Minus(Linear_Expression x) {
+ arg = x.clone();
+ }
+
+ //! Returns the value that \p this negates.
+ public Linear_Expression argument() {
+ return arg;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Unary_Minus clone() {
+ return new Linear_Expression_Unary_Minus(arg);
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
new file mode 100644
index 0000000..b2afb29
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
@@ -0,0 +1,57 @@
+/* Linear_Expression_Variable class definition and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression built from a variable.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Variable
+extends Linear_Expression {
+
+ protected Variable arg;
+
+ //! Builds the object associated to the copy of \p v.
+ public Linear_Expression_Variable(Variable v) {
+ arg = new Variable(v.id());
+ }
+
+ //! Returns the variable representing the linear expression.
+ public Variable argument() {
+ return arg;
+ }
+
+ //! Builds a copy of this.
+ public Linear_Expression_Variable clone() {
+ return new Linear_Expression_Variable(arg);
+ }
+
+ private long var_id() {
+ return arg.id();
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
new file mode 100644
index 0000000..3fc2cc1
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
@@ -0,0 +1,37 @@
+/* Logic_Error_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions due to errors in low-level routines.
+/*! \ingroup PPL_Java_interface
+ These exceptions may be generated, for instance, by the inability
+ of querying/controlling the FPU behavior with respect to rounding modes.
+*/
+public class Logic_Error_Exception extends RuntimeException {
+
+ //! Constructor.
+ public Logic_Error_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/MIP_Problem.java b/interfaces/Java/parma_polyhedra_library/MIP_Problem.java
new file mode 100644
index 0000000..13c2159
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem.java
@@ -0,0 +1,322 @@
+/* MIP_Problem Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_Java_interface
+ An object of this class encodes a mixed integer (linear) programming problem.
+ The MIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the feasible region, by means of a finite set of linear equality
+ and non-strict inequality constraints;
+ - the subset of the unknown variables that range over the integers
+ (the other variables implicitly ranging over the reals);
+ - the objective function, described by a Linear_Expression;
+ - the optimization mode (either maximization or minimization).
+
+ The class provides support for the (incremental) solution of the
+ MIP problem based on variations of the revised simplex method and
+ on branch-and-bound techniques. The result of the resolution
+ process is expressed in terms of an enumeration, encoding the
+ feasibility and the unboundedness of the optimization problem.
+ The class supports simple feasibility tests (i.e., no optimization),
+ as well as the extraction of an optimal (resp., feasible) point,
+ provided the MIP_Problem is optimizable (resp., feasible).
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given MIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of constraints,
+ the change of objective function and the change of optimization mode.
+*/
+public class MIP_Problem extends PPL_Object {
+
+ //! \name Constructors and Destructor
+ /*@{*/
+
+ //! Builds a trivial MIP problem.
+ /*!
+ A trivial MIP problem requires to maximize the objective function
+ \f$0\f$ on a vector space under no constraints at all:
+ the origin of the vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p this.
+
+ \exception Length_Error_Exception
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ public MIP_Problem(long dim) {
+ build_cpp_object(dim);
+ }
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim from the constraint
+ system \p cs, the objective function \p obj and optimization mode
+ \p mode.
+
+ \param dim
+ The dimension of the vector space enclosing \p this.
+
+ \param cs
+ The constraint system defining the feasible region.
+
+ \param obj
+ The objective function.
+
+ \param mode
+ The optimization mode.
+
+ \exception Length_Error_Exception
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the constraint system contains any strict inequality
+ or if the space dimension of the constraint system (resp., the
+ objective function) is strictly greater than \p dim.
+ */
+ public MIP_Problem(long dim, Constraint_System cs, Linear_Expression obj,
+ Optimization_Mode mode) {
+ build_cpp_object(dim, cs, obj, mode);
+ }
+
+ //! Builds a copy of \p y.
+ public MIP_Problem(MIP_Problem y) {
+ build_cpp_object(y);
+ }
+
+ /*! \brief
+ Releases all resources managed by \p this,
+ also resetting it to a null reference.
+ */
+ public native void free();
+
+ //! Releases all resources managed by \p this.
+ protected native void finalize();
+
+ /*@}*/ /* Constructors and Destructor */
+
+ //! \name Functions that Do Not Modify the MIP_Problem
+ /*@{*/
+
+ //! Returns the maximum space dimension an MIP_Problem can handle.
+ public native long max_space_dimension();
+
+ //! Returns the space dimension of the MIP problem.
+ public native long space_dimension();
+
+ /*! \brief
+ Returns a set containing all the variables' indexes constrained
+ to be integral.
+ */
+ public native Variables_Set integer_space_dimensions();
+
+ //! Returns the constraints .
+ public native Constraint_System constraints();
+
+ //! Returns the objective function.
+ public native Linear_Expression objective_function();
+
+ //! Returns the optimization mode.
+ public native Optimization_Mode optimization_mode();
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ /*! \brief
+ Returns the total size in bytes of the memory occupied by the
+ underlying C++ object.
+ */
+ public native long total_memory_in_bytes();
+
+ //! Checks if all the invariants are satisfied.
+ public native boolean OK();
+
+ /*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+ //! \name Functions that May Modify the MIP_Problem
+ /*@{*/
+
+ //! Resets \p this to be equal to the trivial MIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ public native void clear();
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old MIP problem
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception Length_Error_Exception
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new MIP problem; they are initially unconstrained.
+ */
+ public native void add_space_dimensions_and_embed(long m);
+
+ /*! \brief
+ Sets the variables whose indexes are in set \p i_vars to be
+ integer space dimensions.
+
+ \exception Invalid_Argument_Exception
+ Thrown if some index in \p i_vars does not correspond to
+ a space dimension in \p this.
+ */
+ public native void add_to_integer_space_dimensions(Variables_Set i_vars);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the MIP problem.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the constraint \p c is a strict inequality or if its space
+ dimension is strictly greater than the space dimension of \p this.
+ */
+ public native void add_constraint(Constraint c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the MIP problem.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the constraint system \p cs contains any strict inequality
+ or if its space dimension is strictly greater than the space dimension
+ of \p this.
+ */
+ public native void add_constraints(Constraint_System cs);
+
+ //! Sets the objective function to \p obj.
+ /*!
+ \exception Invalid_Argument_Exception
+ Thrown if the space dimension of \p obj is strictly greater than
+ the space dimension of \p this.
+ */
+ public native void set_objective_function(Linear_Expression obj);
+
+ //! Sets the optimization mode to \p mode.
+ public native void set_optimization_mode(Optimization_Mode mode);
+
+ /*@}*/ /* Functions that May Modify the MIP_Problem */
+
+ //! \name Computing the Solution of the MIP_Problem
+ /*@{*/
+
+ //! Checks satisfiability of \p this.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+ */
+ public native boolean is_satisfiable();
+
+ //! Optimizes the MIP problem.
+ /*!
+ \return
+ An MIP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible, unbounded or optimized problem).
+ */
+ public native MIP_Problem_Status solve();
+
+ /*! \brief
+ Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+ of evaluating the objective function on \p evaluating_point.
+
+ \param evaluating_point
+ The point on which the objective function will be evaluated.
+
+ \param num
+ On exit will contain the numerator of the evaluated value.
+
+ \param den
+ On exit will contain the denominator of the evaluated value.
+
+ \exception Invalid_Argument_Exception
+ Thrown if \p this and \p evaluating_point are dimension-incompatible
+ or if the generator \p evaluating_point is not a point.
+ */
+ public native void evaluate_objective_function(Generator evaluating_point,
+ Coefficient num,
+ Coefficient den);
+
+ //! Returns a feasible point for \p this, if it exists.
+ /*!
+ \exception Domain_Error_Exception
+ Thrown if the MIP problem is not satisfiable.
+ */
+ public native Generator feasible_point();
+
+ //! Returns an optimal point for \p this, if it exists.
+ /*!
+ \exception Domain_Error_Exception
+ Thrown if \p this doesn't not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ public native Generator optimizing_point();
+
+ /*! \brief
+ Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+ the solution of the optimization problem.
+
+ \exception Domain_Error_Exception
+ Thrown if \p this doesn't not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ public native void optimal_value(Coefficient num, Coefficient den);
+
+ /*@}*/ /* Computing the Solution of the MIP_Problem */
+
+ //! \name Querying/Setting Control Parameters
+ /*@{*/
+
+ /*! \brief
+ Returns the value of control parameter \p name.
+ */
+ public native Control_Parameter_Value
+ get_control_parameter(Control_Parameter_Name name);
+
+ /*! \brief
+ Sets control parameter \p value.
+ */
+ public native void set_control_parameter(Control_Parameter_Value value);
+
+ /*@}*/ /* Querying/Setting Control Parameters */
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(long dim);
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(long dim,
+ Constraint_System cs,
+ Linear_Expression obj,
+ Optimization_Mode mode);
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(MIP_Problem y);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java b/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
new file mode 100644
index 0000000..810d8be
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
@@ -0,0 +1,40 @@
+/* MIP_Problem_Status enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_Java_interface */
+public enum MIP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_MIP_PROBLEM,
+ //! The problem is unbounded.
+ UNBOUNDED_MIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_MIP_PROBLEM;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Makefile.am b/interfaces/Java/parma_polyhedra_library/Makefile.am
new file mode 100644
index 0000000..90a4801
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Makefile.am
@@ -0,0 +1,309 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+JAVAROOT = ../
+
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+parma_polyhedra_library.Artificial_Parameter \
+parma_polyhedra_library.Artificial_Parameter_Sequence \
+parma_polyhedra_library.Bounded_Integer_Type_Overflow \
+parma_polyhedra_library.Bounded_Integer_Type_Representation \
+parma_polyhedra_library.Bounded_Integer_Type_Width \
+parma_polyhedra_library.By_Reference \
+parma_polyhedra_library.Coefficient \
+parma_polyhedra_library.Complexity_Class \
+parma_polyhedra_library.Congruence \
+parma_polyhedra_library.Congruence_System \
+parma_polyhedra_library.Constraint \
+parma_polyhedra_library.Constraint_System \
+parma_polyhedra_library.Degenerate_Element \
+parma_polyhedra_library.Generator \
+parma_polyhedra_library.Generator_System \
+parma_polyhedra_library.Generator_Type \
+parma_polyhedra_library.Grid_Generator \
+parma_polyhedra_library.Grid_Generator_System \
+parma_polyhedra_library.Grid_Generator_Type \
+parma_polyhedra_library.IO \
+parma_polyhedra_library.Linear_Expression \
+parma_polyhedra_library.Linear_Expression_Coefficient \
+parma_polyhedra_library.Linear_Expression_Difference \
+parma_polyhedra_library.Linear_Expression_Sum \
+parma_polyhedra_library.Linear_Expression_Times \
+parma_polyhedra_library.Linear_Expression_Unary_Minus \
+parma_polyhedra_library.Linear_Expression_Variable \
+parma_polyhedra_library.MIP_Problem \
+parma_polyhedra_library.MIP_Problem_Status \
+parma_polyhedra_library.Optimization_Mode \
+parma_polyhedra_library.Pair \
+parma_polyhedra_library.Parma_Polyhedra_Library \
+parma_polyhedra_library.Partial_Function \
+parma_polyhedra_library.PIP_Problem \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Name \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Value \
+parma_polyhedra_library.PIP_Problem_Status \
+parma_polyhedra_library.PIP_Decision_Node \
+parma_polyhedra_library.PIP_Solution_Node \
+parma_polyhedra_library.PIP_Tree_Node \
+parma_polyhedra_library.Poly_Con_Relation \
+parma_polyhedra_library.Poly_Gen_Relation \
+parma_polyhedra_library.PPL_Object \
+parma_polyhedra_library.Relation_Symbol \
+parma_polyhedra_library.Termination \
+parma_polyhedra_library.Variable \
+parma_polyhedra_library.Variables_Set
+
+fixed_java_cxx_headers_sources = \
+parma_polyhedra_library_Artificial_Parameter.h \
+parma_polyhedra_library_Artificial_Parameter_Sequence.h \
+parma_polyhedra_library_Bounded_Integer_Type_Overflow.h \
+parma_polyhedra_library_Bounded_Integer_Type_Representation.h \
+parma_polyhedra_library_Bounded_Integer_Type_Width.h \
+parma_polyhedra_library_By_Reference.h \
+parma_polyhedra_library_Coefficient.h \
+parma_polyhedra_library_Complexity_Class.h \
+parma_polyhedra_library_Congruence.h \
+parma_polyhedra_library_Congruence_System.h \
+parma_polyhedra_library_Constraint.h \
+parma_polyhedra_library_Constraint_System.h \
+parma_polyhedra_library_Degenerate_Element.h \
+parma_polyhedra_library_Generator.h \
+parma_polyhedra_library_Generator_System.h \
+parma_polyhedra_library_Generator_Type.h \
+parma_polyhedra_library_Grid_Generator.h \
+parma_polyhedra_library_Grid_Generator_System.h \
+parma_polyhedra_library_Grid_Generator_Type.h \
+parma_polyhedra_library_IO.h \
+parma_polyhedra_library_Linear_Expression.h \
+parma_polyhedra_library_Linear_Expression_Coefficient.h \
+parma_polyhedra_library_Linear_Expression_Difference.h \
+parma_polyhedra_library_Linear_Expression_Sum.h \
+parma_polyhedra_library_Linear_Expression_Times.h \
+parma_polyhedra_library_Linear_Expression_Unary_Minus.h \
+parma_polyhedra_library_Linear_Expression_Variable.h \
+parma_polyhedra_library_MIP_Problem.h \
+parma_polyhedra_library_MIP_Problem_Status.h \
+parma_polyhedra_library_Optimization_Mode.h \
+parma_polyhedra_library_Pair.h \
+parma_polyhedra_library_Parma_Polyhedra_Library.h \
+parma_polyhedra_library_Partial_Function.h \
+parma_polyhedra_library_PIP_Problem.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Name.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Value.h \
+parma_polyhedra_library_PIP_Problem_Status.h \
+parma_polyhedra_library_PIP_Decision_Node.h \
+parma_polyhedra_library_PIP_Solution_Node.h \
+parma_polyhedra_library_PIP_Tree_Node.h \
+parma_polyhedra_library_Poly_Con_Relation.h \
+parma_polyhedra_library_Poly_Gen_Relation.h \
+parma_polyhedra_library_PPL_Object.h \
+parma_polyhedra_library_Relation_Symbol.h \
+parma_polyhedra_library_Termination.h \
+parma_polyhedra_library_Variable.h \
+parma_polyhedra_library_Variables_Set.h
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+fixed_java_sources = \
+$(srcdir)/Artificial_Parameter.java \
+$(srcdir)/Artificial_Parameter_Sequence.java \
+$(srcdir)/Bounded_Integer_Type_Overflow.java \
+$(srcdir)/Bounded_Integer_Type_Representation.java \
+$(srcdir)/Bounded_Integer_Type_Width.java \
+$(srcdir)/By_Reference.java \
+$(srcdir)/Coefficient.java \
+$(srcdir)/Complexity_Class.java \
+$(srcdir)/Congruence.java \
+$(srcdir)/Congruence_System.java \
+$(srcdir)/Constraint.java \
+$(srcdir)/Constraint_System.java \
+$(srcdir)/Control_Parameter_Name.java \
+$(srcdir)/Control_Parameter_Value.java \
+$(srcdir)/Degenerate_Element.java \
+$(srcdir)/Domain_Error_Exception.java \
+$(srcdir)/Generator.java \
+$(srcdir)/Generator_System.java \
+$(srcdir)/Generator_Type.java \
+$(srcdir)/Grid_Generator.java \
+$(srcdir)/Grid_Generator_System.java \
+$(srcdir)/Grid_Generator_Type.java \
+$(srcdir)/Invalid_Argument_Exception.java \
+$(srcdir)/IO.java \
+$(srcdir)/Length_Error_Exception.java \
+$(srcdir)/Linear_Expression.java \
+$(srcdir)/Linear_Expression_Coefficient.java \
+$(srcdir)/Linear_Expression_Difference.java \
+$(srcdir)/Linear_Expression_Sum.java \
+$(srcdir)/Linear_Expression_Times.java \
+$(srcdir)/Linear_Expression_Unary_Minus.java \
+$(srcdir)/Linear_Expression_Variable.java \
+$(srcdir)/Logic_Error_Exception.java \
+$(srcdir)/MIP_Problem.java \
+$(srcdir)/MIP_Problem_Status.java \
+$(srcdir)/Optimization_Mode.java \
+$(srcdir)/Overflow_Error_Exception.java \
+$(srcdir)/Pair.java \
+$(srcdir)/Parma_Polyhedra_Library.java \
+$(srcdir)/Partial_Function.java \
+$(srcdir)/PIP_Problem.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Name.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Value.java \
+$(srcdir)/PIP_Problem_Status.java \
+$(srcdir)/PIP_Decision_Node.java \
+$(srcdir)/PIP_Solution_Node.java \
+$(srcdir)/PIP_Tree_Node.java \
+$(srcdir)/Poly_Con_Relation.java \
+$(srcdir)/Poly_Gen_Relation.java \
+$(srcdir)/PPL_Object.java \
+$(srcdir)/Relation_Symbol.java \
+$(srcdir)/Timeout_Exception.java \
+$(srcdir)/Variable.java \
+$(srcdir)/Variable_Stringifier.java \
+$(srcdir)/Variables_Set.java
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources) \
+Termination.java
+
+# NOTE: Fake_Class_for_Doxygen.java should be added here.
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources) \
+$(srcdir)/Fake_Class_for_Doxygen.java
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+BUILT_SOURCES = \
+java_classes.stamp \
+java_cxx_headers.stamp
+
+java_classes.stamp: $(all_java_sources)
+ $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+ $(AM_JAVACFLAGS) $(JAVACFLAGS) \
+ $(all_java_sources)
+ echo timestamp >$@
+
+java_cxx_headers.stamp: java_classes.stamp
+ $(JAVAH) -classpath .. \
+ $(fixed_java_cxx_headers) \
+ $(required_instantiations_java_cxx_headers)
+ echo timestamp >$@
+
+source_generation.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+ > java_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./java_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./java_blob
+ rm -f java_blob
+ echo timestamp >$@
+
+$(required_instantiations_java_sources): source_generation.stamp
+
+Termination.java: source_generation.stamp
+
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_classes) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp \
+Termination.java \
+Artificial_Parameter.class \
+Artificial_Parameter_Sequence.class \
+Bounded_Integer_Type_Overflow.class \
+Bounded_Integer_Type_Representation.class \
+Bounded_Integer_Type_Width.class \
+By_Reference.class \
+Coefficient.class \
+Complexity_Class.class \
+Congruence.class \
+Congruence_System.class \
+Constraint.class \
+Constraint_System.class \
+Control_Parameter_Name.class \
+Control_Parameter_Value.class \
+Degenerate_Element.class \
+Domain_Error_Exception.class \
+Generator.class \
+Generator_System.class \
+Generator_Type.class \
+Grid_Generator.class \
+Grid_Generator_System.class \
+Grid_Generator_Type.class \
+Invalid_Argument_Exception.class \
+IO.class \
+Length_Error_Exception.class \
+Linear_Expression.class \
+Linear_Expression_Coefficient.class \
+Linear_Expression_Difference.class \
+Linear_Expression_Sum.class \
+Linear_Expression_Times.class \
+Linear_Expression_Unary_Minus.class \
+Linear_Expression_Variable.class \
+Logic_Error_Exception.class \
+MIP_Problem.class \
+MIP_Problem_Status.class \
+Optimization_Mode.class \
+Overflow_Error_Exception.class \
+Pair.class \
+Parma_Polyhedra_Library.class \
+Partial_Function.class \
+PIP_Problem.class \
+PIP_Problem_Control_Parameter_Name.class \
+PIP_Problem_Control_Parameter_Value.class \
+PIP_Problem_Status.class \
+PIP_Decision_Node.class \
+PIP_Solution_Node.class \
+PIP_Tree_Node.class \
+Poly_Con_Relation.class \
+Poly_Gen_Relation.class \
+PPL_Object.class \
+Relation_Symbol.class \
+Termination.class \
+Timeout_Exception.class \
+Variable.class \
+Variables_Set.class
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Java/parma_polyhedra_library/Makefile.in b/interfaces/Java/parma_polyhedra_library/Makefile.in
new file mode 100644
index 0000000..9e4e596
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Makefile.in
@@ -0,0 +1,836 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/parma_polyhedra_library
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+JAVAROOT = ../
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+parma_polyhedra_library.Artificial_Parameter \
+parma_polyhedra_library.Artificial_Parameter_Sequence \
+parma_polyhedra_library.Bounded_Integer_Type_Overflow \
+parma_polyhedra_library.Bounded_Integer_Type_Representation \
+parma_polyhedra_library.Bounded_Integer_Type_Width \
+parma_polyhedra_library.By_Reference \
+parma_polyhedra_library.Coefficient \
+parma_polyhedra_library.Complexity_Class \
+parma_polyhedra_library.Congruence \
+parma_polyhedra_library.Congruence_System \
+parma_polyhedra_library.Constraint \
+parma_polyhedra_library.Constraint_System \
+parma_polyhedra_library.Degenerate_Element \
+parma_polyhedra_library.Generator \
+parma_polyhedra_library.Generator_System \
+parma_polyhedra_library.Generator_Type \
+parma_polyhedra_library.Grid_Generator \
+parma_polyhedra_library.Grid_Generator_System \
+parma_polyhedra_library.Grid_Generator_Type \
+parma_polyhedra_library.IO \
+parma_polyhedra_library.Linear_Expression \
+parma_polyhedra_library.Linear_Expression_Coefficient \
+parma_polyhedra_library.Linear_Expression_Difference \
+parma_polyhedra_library.Linear_Expression_Sum \
+parma_polyhedra_library.Linear_Expression_Times \
+parma_polyhedra_library.Linear_Expression_Unary_Minus \
+parma_polyhedra_library.Linear_Expression_Variable \
+parma_polyhedra_library.MIP_Problem \
+parma_polyhedra_library.MIP_Problem_Status \
+parma_polyhedra_library.Optimization_Mode \
+parma_polyhedra_library.Pair \
+parma_polyhedra_library.Parma_Polyhedra_Library \
+parma_polyhedra_library.Partial_Function \
+parma_polyhedra_library.PIP_Problem \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Name \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Value \
+parma_polyhedra_library.PIP_Problem_Status \
+parma_polyhedra_library.PIP_Decision_Node \
+parma_polyhedra_library.PIP_Solution_Node \
+parma_polyhedra_library.PIP_Tree_Node \
+parma_polyhedra_library.Poly_Con_Relation \
+parma_polyhedra_library.Poly_Gen_Relation \
+parma_polyhedra_library.PPL_Object \
+parma_polyhedra_library.Relation_Symbol \
+parma_polyhedra_library.Termination \
+parma_polyhedra_library.Variable \
+parma_polyhedra_library.Variables_Set
+
+fixed_java_cxx_headers_sources = \
+parma_polyhedra_library_Artificial_Parameter.h \
+parma_polyhedra_library_Artificial_Parameter_Sequence.h \
+parma_polyhedra_library_Bounded_Integer_Type_Overflow.h \
+parma_polyhedra_library_Bounded_Integer_Type_Representation.h \
+parma_polyhedra_library_Bounded_Integer_Type_Width.h \
+parma_polyhedra_library_By_Reference.h \
+parma_polyhedra_library_Coefficient.h \
+parma_polyhedra_library_Complexity_Class.h \
+parma_polyhedra_library_Congruence.h \
+parma_polyhedra_library_Congruence_System.h \
+parma_polyhedra_library_Constraint.h \
+parma_polyhedra_library_Constraint_System.h \
+parma_polyhedra_library_Degenerate_Element.h \
+parma_polyhedra_library_Generator.h \
+parma_polyhedra_library_Generator_System.h \
+parma_polyhedra_library_Generator_Type.h \
+parma_polyhedra_library_Grid_Generator.h \
+parma_polyhedra_library_Grid_Generator_System.h \
+parma_polyhedra_library_Grid_Generator_Type.h \
+parma_polyhedra_library_IO.h \
+parma_polyhedra_library_Linear_Expression.h \
+parma_polyhedra_library_Linear_Expression_Coefficient.h \
+parma_polyhedra_library_Linear_Expression_Difference.h \
+parma_polyhedra_library_Linear_Expression_Sum.h \
+parma_polyhedra_library_Linear_Expression_Times.h \
+parma_polyhedra_library_Linear_Expression_Unary_Minus.h \
+parma_polyhedra_library_Linear_Expression_Variable.h \
+parma_polyhedra_library_MIP_Problem.h \
+parma_polyhedra_library_MIP_Problem_Status.h \
+parma_polyhedra_library_Optimization_Mode.h \
+parma_polyhedra_library_Pair.h \
+parma_polyhedra_library_Parma_Polyhedra_Library.h \
+parma_polyhedra_library_Partial_Function.h \
+parma_polyhedra_library_PIP_Problem.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Name.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Value.h \
+parma_polyhedra_library_PIP_Problem_Status.h \
+parma_polyhedra_library_PIP_Decision_Node.h \
+parma_polyhedra_library_PIP_Solution_Node.h \
+parma_polyhedra_library_PIP_Tree_Node.h \
+parma_polyhedra_library_Poly_Con_Relation.h \
+parma_polyhedra_library_Poly_Gen_Relation.h \
+parma_polyhedra_library_PPL_Object.h \
+parma_polyhedra_library_Relation_Symbol.h \
+parma_polyhedra_library_Termination.h \
+parma_polyhedra_library_Variable.h \
+parma_polyhedra_library_Variables_Set.h
+
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+fixed_java_sources = \
+$(srcdir)/Artificial_Parameter.java \
+$(srcdir)/Artificial_Parameter_Sequence.java \
+$(srcdir)/Bounded_Integer_Type_Overflow.java \
+$(srcdir)/Bounded_Integer_Type_Representation.java \
+$(srcdir)/Bounded_Integer_Type_Width.java \
+$(srcdir)/By_Reference.java \
+$(srcdir)/Coefficient.java \
+$(srcdir)/Complexity_Class.java \
+$(srcdir)/Congruence.java \
+$(srcdir)/Congruence_System.java \
+$(srcdir)/Constraint.java \
+$(srcdir)/Constraint_System.java \
+$(srcdir)/Control_Parameter_Name.java \
+$(srcdir)/Control_Parameter_Value.java \
+$(srcdir)/Degenerate_Element.java \
+$(srcdir)/Domain_Error_Exception.java \
+$(srcdir)/Generator.java \
+$(srcdir)/Generator_System.java \
+$(srcdir)/Generator_Type.java \
+$(srcdir)/Grid_Generator.java \
+$(srcdir)/Grid_Generator_System.java \
+$(srcdir)/Grid_Generator_Type.java \
+$(srcdir)/Invalid_Argument_Exception.java \
+$(srcdir)/IO.java \
+$(srcdir)/Length_Error_Exception.java \
+$(srcdir)/Linear_Expression.java \
+$(srcdir)/Linear_Expression_Coefficient.java \
+$(srcdir)/Linear_Expression_Difference.java \
+$(srcdir)/Linear_Expression_Sum.java \
+$(srcdir)/Linear_Expression_Times.java \
+$(srcdir)/Linear_Expression_Unary_Minus.java \
+$(srcdir)/Linear_Expression_Variable.java \
+$(srcdir)/Logic_Error_Exception.java \
+$(srcdir)/MIP_Problem.java \
+$(srcdir)/MIP_Problem_Status.java \
+$(srcdir)/Optimization_Mode.java \
+$(srcdir)/Overflow_Error_Exception.java \
+$(srcdir)/Pair.java \
+$(srcdir)/Parma_Polyhedra_Library.java \
+$(srcdir)/Partial_Function.java \
+$(srcdir)/PIP_Problem.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Name.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Value.java \
+$(srcdir)/PIP_Problem_Status.java \
+$(srcdir)/PIP_Decision_Node.java \
+$(srcdir)/PIP_Solution_Node.java \
+$(srcdir)/PIP_Tree_Node.java \
+$(srcdir)/Poly_Con_Relation.java \
+$(srcdir)/Poly_Gen_Relation.java \
+$(srcdir)/PPL_Object.java \
+$(srcdir)/Relation_Symbol.java \
+$(srcdir)/Timeout_Exception.java \
+$(srcdir)/Variable.java \
+$(srcdir)/Variable_Stringifier.java \
+$(srcdir)/Variables_Set.java
+
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources) \
+Termination.java
+
+
+# NOTE: Fake_Class_for_Doxygen.java should be added here.
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources) \
+$(srcdir)/Fake_Class_for_Doxygen.java
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+BUILT_SOURCES = \
+java_classes.stamp \
+java_cxx_headers.stamp
+
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_classes) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp \
+Termination.java \
+Artificial_Parameter.class \
+Artificial_Parameter_Sequence.class \
+Bounded_Integer_Type_Overflow.class \
+Bounded_Integer_Type_Representation.class \
+Bounded_Integer_Type_Width.class \
+By_Reference.class \
+Coefficient.class \
+Complexity_Class.class \
+Congruence.class \
+Congruence_System.class \
+Constraint.class \
+Constraint_System.class \
+Control_Parameter_Name.class \
+Control_Parameter_Value.class \
+Degenerate_Element.class \
+Domain_Error_Exception.class \
+Generator.class \
+Generator_System.class \
+Generator_Type.class \
+Grid_Generator.class \
+Grid_Generator_System.class \
+Grid_Generator_Type.class \
+Invalid_Argument_Exception.class \
+IO.class \
+Length_Error_Exception.class \
+Linear_Expression.class \
+Linear_Expression_Coefficient.class \
+Linear_Expression_Difference.class \
+Linear_Expression_Sum.class \
+Linear_Expression_Times.class \
+Linear_Expression_Unary_Minus.class \
+Linear_Expression_Variable.class \
+Logic_Error_Exception.class \
+MIP_Problem.class \
+MIP_Problem_Status.class \
+Optimization_Mode.class \
+Overflow_Error_Exception.class \
+Pair.class \
+Parma_Polyhedra_Library.class \
+Partial_Function.class \
+PIP_Problem.class \
+PIP_Problem_Control_Parameter_Name.class \
+PIP_Problem_Control_Parameter_Value.class \
+PIP_Problem_Status.class \
+PIP_Decision_Node.class \
+PIP_Solution_Node.class \
+PIP_Tree_Node.class \
+Poly_Con_Relation.class \
+Poly_Gen_Relation.class \
+PPL_Object.class \
+Relation_Symbol.class \
+Termination.class \
+Timeout_Exception.class \
+Variable.class \
+Variables_Set.class
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/parma_polyhedra_library/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Java/parma_polyhedra_library/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile
+installdirs:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
+
+
+java_classes.stamp: $(all_java_sources)
+ $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+ $(AM_JAVACFLAGS) $(JAVACFLAGS) \
+ $(all_java_sources)
+ echo timestamp >$@
+
+java_cxx_headers.stamp: java_classes.stamp
+ $(JAVAH) -classpath .. \
+ $(fixed_java_cxx_headers) \
+ $(required_instantiations_java_cxx_headers)
+ echo timestamp >$@
+
+source_generation.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+ > java_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./java_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./java_blob
+ rm -f java_blob
+ echo timestamp >$@
+
+$(required_instantiations_java_sources): source_generation.stamp
+
+Termination.java: source_generation.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java b/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
new file mode 100644
index 0000000..a5ef51f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
@@ -0,0 +1,38 @@
+/* Optimization_Mode enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible optimization modes.
+/*! \ingroup PPL_Java_interface */
+public enum Optimization_Mode {
+ //! Minimization is requested.
+ MINIMIZATION,
+ //! Maximization is requested.
+ MAXIMIZATION;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
new file mode 100644
index 0000000..b66bf15
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
@@ -0,0 +1,36 @@
+/* Overflow_Error_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions due to overflow errors.
+/*! \ingroup PPL_Java_interface
+ These exceptions can be obtained when the library has been configured
+ to use integer coefficients having bounded size.
+*/
+public class Overflow_Error_Exception extends RuntimeException {
+ //! Constructor.
+ public Overflow_Error_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java
new file mode 100644
index 0000000..ad6f6c9
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java
@@ -0,0 +1,35 @@
+/* PIP_Decision_Node Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! An internal node of the PIP solution tree.
+public class PIP_Decision_Node extends PIP_Tree_Node {
+
+ /*! \brief
+ Returns the true branch (if \p branch is true)
+ or the false branch (if \p branch is false) of \p this.
+ */
+ public native PIP_Tree_Node child_node(boolean branch);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem.java
new file mode 100644
index 0000000..9a0df31
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem.java
@@ -0,0 +1,323 @@
+/* PIP_Problem Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A Parametric Integer Programming problem.
+/*! \ingroup PPL_Java_interface
+ An object of this class encodes a parametric integer (linear)
+ programming problem. The PIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the subset of those dimensions of the vector space that are
+ interpreted as integer parameters (the other space dimensions
+ are interpreted as non-parameter integer variables);
+ - a finite set of linear equality and (strict or non-strict)
+ inequality constraints involving variables and/or parameters;
+ these constraints are used to define:
+ - the <EM>feasible region</EM>, if they involve one or more
+ problem variable (and maybe some parameters);
+ - the <EM>initial context</EM>, if they only involve the
+ parameters;
+ - optionally, the so-called <EM>big parameter</EM>,
+ i.e., a problem parameter to be considered arbitrarily big.
+
+ Note that all problem variables and problem parameters are assumed
+ to take non-negative integer values, so that there is no need
+ to specify non-negativity constraints.
+
+ The class provides support for the (incremental) solution of the
+ PIP problem based on variations of the revised simplex method and
+ on Gomory cut generation techniques.
+
+ The solution for a PIP problem is the lexicographic minimum of the
+ integer points of the feasible region, expressed in terms of the
+ parameters. As the problem to be solved only involves non-negative
+ variables and parameters, the problem will always be either unfeasible
+ or optimizable.
+
+ As the feasibility and the solution value of a PIP problem depend on the
+ values of the parameters, the solution is a binary decision tree,
+ dividing the context parameter set into subsets.
+ The tree nodes are of two kinds:
+ - \e Decision nodes.
+ These are internal tree nodes encoding one or more linear tests
+ on the parameters; if all the tests are satisfied, then the solution
+ is the node's \e true child; otherwise, the solution is the node's
+ \e false child;
+ - \e Solution nodes.
+ These are leaf nodes in the tree, encoding the solution of the problem
+ in the current context subset, where each variable is defined in terms
+ of a linear expression of the parameters.
+ Solution nodes also optionally embed a set of parameter constraints:
+ if all these constraints are satisfied, the solution is described by
+ the node, otherwise the problem has no solution.
+
+ It may happen that a decision node has no \e false child. This means
+ that there is no solution if at least one of the corresponding
+ constraints is not satisfied. Decision nodes having two or more linear
+ tests on the parameters cannot have a \e false child. Decision nodes
+ always have a \e true child.
+
+ Both kinds of tree nodes may also contain the definition of extra
+ parameters which are artificially introduced by the solver to enforce
+ an integral solution. Such artificial parameters are defined by
+ the integer division of a linear expression on the parameters
+ by an integer coefficient.
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given PIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of parameters
+ and the addition of constraints.
+*/
+public class PIP_Problem extends PPL_Object {
+
+ //! Builds a trivial PIP problem.
+ /*!
+ A trivial PIP problem requires to compute the lexicographic minimum
+ on a vector space under no constraints and with no parameters:
+ due to the implicit non-negativity constraints, the origin of the
+ vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p this
+ (optional argument with default value \f$0\f$).
+
+ \exception Length_Error_Exception
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ public PIP_Problem(long dim) {
+ build_cpp_object(dim);
+ }
+
+ //! Builds a PIP problem from a sequence of constraints.
+ /*!
+ Builds a PIP problem having space dimension \p dim from the
+ constraint system cs; the dimensions \p vars are interpreted as
+ parameters.
+ */
+ public PIP_Problem(long dim, Constraint_System cs, Variables_Set params) {
+ build_cpp_object(dim, cs, params);
+ }
+
+ //! Builds a copy of \p y.
+ public PIP_Problem(PIP_Problem y) {
+ build_cpp_object(y);
+ }
+
+ /*! \brief
+ Releases all resources managed by \p this,
+ also resetting it to a null reference.
+ */
+ public native void free();
+
+ //! Releases all resources managed by \p this.
+ protected native void finalize();
+
+ /*@}*/ /* Constructors and Destructor */
+
+ //! \name Functions that Do Not Modify the PIP_Problem
+ /*@{*/
+
+ //! Returns the maximum space dimension an PIP_Problem can handle.
+ public native long max_space_dimension();
+
+ //! Returns the space dimension of the PIP problem.
+ public native long space_dimension();
+
+ //! Returns the number of parameter space dimensions of the PIP problem.
+ public native long number_of_parameter_space_dimensions();
+
+ /*! \brief
+ Returns all the parameter space dimensions of problem \p pip.
+ */
+ public native Variables_Set parameter_space_dimensions();
+
+ //! Returns the big parameter dimension of PIP problem \p pip.
+ public native long get_big_parameter_dimension();
+
+ /*! \brief
+ Returns the number of constraints defining the feasible
+ region of \p pip.
+ */
+ public native long number_of_constraints();
+
+ /*! \brief
+ Returns the \p i-th constraint defining the feasible region
+ of the PIP problem \p pip.
+ */
+ public native Constraint constraint_at_index(long dim);
+
+ //! Returns the constraints .
+ public native Constraint_System constraints();
+
+ //! Returns an ascii formatted internal representation of \p this.
+ public native String ascii_dump();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+ /*! \brief
+ Returns the size in bytes of the memory occupied by the
+ underlying C++ object.
+ */
+ public native long total_memory_in_bytes();
+
+ /*! \brief
+ Returns the size in bytes of the memory managed by the
+ underlying C++ object.
+ */
+ public native long external_memory_in_bytes();
+
+ /*! \brief
+ Returns true if the pip problem is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if broken. Useful for debugging purposes.
+ */
+ public native boolean OK();
+
+ /*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+
+ //! \name Functions that May Modify the PIP_Problem
+ /*@{*/
+
+ //! Resets \p this to be equal to the trivial PIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ public native void clear();
+
+
+ /*! \brief
+ Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+ and embeds the PIP problem in the new vector space.
+
+ \param pip_vars
+ The number of space dimensions to add that are interpreted as
+ PIP problem variables (i.e., non parameters). These are added
+ before adding the \p pip_params parameters.
+
+ \param pip_params
+ The number of space dimensions to add that are interpreted as
+ PIP problem parameters. These are added after having added the
+ \p pip_vars problem variables.
+
+ The new space dimensions will be those having the highest indexes
+ in the new PIP problem; they are initially unconstrained.
+ */
+ public native void add_space_dimensions_and_embed(long pip_vars,
+ long pip_params);
+
+ /*! \brief
+ Sets the space dimensions in \p vars to be parameter dimensions of
+ the PIP problem.
+ */
+ public native void add_to_parameter_space_dimensions(Variables_Set vars);
+
+ /*! \brief
+ Sets the big parameter dimension of PIP problem to \p d.
+ */
+ public native void set_big_parameter_dimension(long d);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the PIP problem.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the constraint \p c is a strict inequality or if its space
+ dimension is strictly greater than the space dimension of \p this.
+ */
+ public native void add_constraint(Constraint c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the PIP problem.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the constraint system \p cs contains any strict inequality
+ or if its space dimension is strictly greater than the space dimension
+ of \p this.
+ */
+ public native void add_constraints(Constraint_System cs);
+
+ /*@}*/ /* Functions that May Modify the PIP_Problem */
+
+ //! \name Computing the Solution of the PIP_Problem
+ /*@{*/
+
+ //! Checks satisfiability of \p this.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if the PIP problem is satisfiable.
+ */
+ public native boolean is_satisfiable();
+
+ //! Optimizes the PIP problem.
+ /*!
+ Solves the PIP problem, returning an exit status.
+
+ \return
+ <CODE>UNFEASIBLE_PIP_PROBLEM</CODE> if the PIP problem
+ is not satisfiable;
+ <CODE>OPTIMIZED_PIP_PROBLEM</CODE> if the PIP problem
+ admits an optimal solution.
+ */
+ public native PIP_Problem_Status solve();
+
+ //! Returns a solution for the PIP problem, if it exists.
+ public native PIP_Tree_Node solution();
+
+ //! Returns an optimizing solution for the PIP problem, if it exists.
+ public native PIP_Tree_Node optimizing_solution();
+
+ /*@}*/ /* Computing the Solution of the PIP_Problem */
+
+ //! \name Querying/Setting Control Parameters
+ /*@{*/
+
+ /*! \brief
+ Returns the value of control parameter \p name.
+ */
+ public native PIP_Problem_Control_Parameter_Value
+ get_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Name name);
+
+ /*! \brief
+ Sets control parameter \p value.
+ */
+ public native void set_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Value value);
+
+ /*@}*/ /* Querying/Setting Control Parameters */
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(long dim);
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(long dim,
+ Constraint_System cs,
+ Variables_Set vars);
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object(PIP_Problem y);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java
new file mode 100644
index 0000000..2a2d2df
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java
@@ -0,0 +1,33 @@
+/* PIP_Problem PIP_Problem_Control_Parameter_Name enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Names of PIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Control_Parameter_Name {
+ //! The cutting strategy rule.
+ CUTTING_STRATEGY,
+ //! The pivot row strategy rule.
+ PIVOT_ROW_STRATEGY
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java
new file mode 100644
index 0000000..44fa3f7
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java
@@ -0,0 +1,39 @@
+/* PIP_Problem PIP_Problem_Control_Parameter_Value enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible values for PIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Control_Parameter_Value {
+ //! Choose the first non-integer row
+ CUTTING_STRATEGY_FIRST,
+ //! Choose row which generates the deepest cut
+ CUTTING_STRATEGY_DEEPEST,
+ //! Always generate all possible cuts
+ CUTTING_STRATEGY_ALL,
+ //! Choose the first row with negative parameter sign
+ PIVOT_ROW_STRATEGY_FIRST,
+ //! Choose the row which generates the lexico-maximal pivot column
+ PIVOT_ROW_STRATEGY_MAX_COLUMN
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java
new file mode 100644
index 0000000..ae2b022
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java
@@ -0,0 +1,38 @@
+/* PIP_Problem_Status enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Status {
+ //! The problem is unsatisfiable.
+ UNFEASIBLE_PIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_PIP_PROBLEM;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java
new file mode 100644
index 0000000..958cfa2
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java
@@ -0,0 +1,41 @@
+/* PIP_Solution_Node Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A leaf node of the PIP solution tree.
+public class PIP_Solution_Node extends PIP_Tree_Node {
+
+ /*! \brief
+ Returns the parametric expression of the values of variable
+ \p var in solution node \p this.
+
+ The returned parametric expression will only refer to
+ (problem or artificial) parameters.
+
+ \param var
+ The variable being queried.
+ */
+ public native Linear_Expression parametric_values(Variable var);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java
new file mode 100644
index 0000000..1addb94
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java
@@ -0,0 +1,79 @@
+/* PIP_Tree_Node Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A node of the PIP solution tree.
+/*!
+ This is the base class for the nodes of the binary trees representing
+ the solutions of PIP problems. From this one, two classes are derived:
+ - PIP_Decision_Node, for the internal nodes of the tree;
+ - PIP_Solution_Node, for the leaves of the tree.
+*/
+public class PIP_Tree_Node extends PPL_Object {
+
+ /*! \brief
+ Returns the solution node if \p this is a solution node,
+ and 0 otherwise.
+ */
+ public native PIP_Solution_Node as_solution();
+
+ /*! \brief
+ Returns the decision node if \p this is a decision node,
+ and 0 otherwise.
+ */
+ public native PIP_Decision_Node as_decision();
+
+ /*! \brief
+ Returns true if the pip tree is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if broken. Useful for debugging purposes.
+ */
+ public native boolean OK();
+
+ /*! \brief
+ Returns the number of artificial parameters in the PIP_Tree_Node.
+ */
+ public native long number_of_artificials();
+
+ /*! \brief
+ Returns the sequence of (Java) artificial parameters
+ in the PIP_Tree_Node.
+ */
+ public native Artificial_Parameter_Sequence artificials();
+
+ /*! \brief
+ Returns the system of parameter constraints controlling the
+ PIP_Tree_Node.
+
+ The indices in the constraints are the same as the original
+ variables and parameters. Coefficients in indices corresponding
+ to variables always are zero.
+ */
+ public native Constraint_System constraints();
+
+ //! Returns a string representation of \p this.
+ public native String toString();
+
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PPL_Object.java b/interfaces/Java/parma_polyhedra_library/PPL_Object.java
new file mode 100644
index 0000000..1aa23e4
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PPL_Object.java
@@ -0,0 +1,46 @@
+/* PPL_Object Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+/*!
+ \cond Include_Implementation_Details
+ \brief Smart pointer to a PPL, C++ object.
+ \ingroup PPL_Java_interface
+ \endcond
+*/
+public class PPL_Object {
+
+ //! Stores the value of the C++ pointer.
+ long ptr;
+
+ //! Builds an object that points to `null'.
+ protected PPL_Object() {
+ ptr = 0;
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Pair.java b/interfaces/Java/parma_polyhedra_library/Pair.java
new file mode 100644
index 0000000..c3f986f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Pair.java
@@ -0,0 +1,52 @@
+/* Pair Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A pair of values of type K and V.
+/*! \ingroup PPL_Java_interface
+ An object of this class holds an ordered pair of values of type K and V.
+*/
+public class Pair<K, V> {
+
+ //! Stores an object of type K.
+ private K first;
+
+ //! Stores an object of type V.
+ private V second;
+
+ //! Returns the object of type K.
+ public K getFirst() {
+ return first;
+ }
+
+ //! Returns the object of type V.
+ public V getSecond() {
+ return second;
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java b/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
new file mode 100644
index 0000000..b2b34f0
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
@@ -0,0 +1,327 @@
+/* Parma_Polyhedra_Library Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+ \defgroup PPL_Java_interface Java Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface for the
+ Java language.
+*/
+
+/*! \mainpage
+ The Parma Polyhedra Library comes equipped with an interface for the
+ Java language.
+ The Java interface provides access to the numerical abstractions
+ (convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+ by the PPL library.
+ A general introduction to the numerical abstractions,
+ their representation in the PPL and the operations provided
+ by the PPL is given in the main \extref{preamble, PPL user manual}.
+ Here we just describe those aspects that are specific to the Java interface.
+ In the sequel, <CODE>prefix</CODE> is the path prefix under which
+ the library has been installed (typically <CODE>/usr</CODE> or
+ <CODE>/usr/local</CODE>).
+
+ <H2>Overview</H2>
+
+ Here is a list of notes with general information and advice
+ on the use of the Java interface.
+
+ - When the Parma Polyhedra Library is configured, it will automatically
+ test for the existence of the Java system (unless configuration options
+ are passed to disable the build of the Java interface;
+ see configuration option <CODE>--enable-interfaces</CODE>).
+ If Java is correctly installed in a standard location, things will be
+ arranged so that the Java interface is built and installed
+ (see configuration option <CODE>--with-java</CODE> if you need to
+ specify a non-standard location for the Java system).
+
+ - The Java interface files are all installed in the directory
+ <CODE>prefix/lib/ppl</CODE>. Since this includes shared and
+ dynamically loaded libraries, you must make your dynamic
+ linker/loader aware of this fact. If you use a GNU/Linux system,
+ try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+ for more information.
+
+ - Any application using the PPL should:
+ - Load the PPL interface library by calling <CODE>System.load</CODE>
+ and passing the full path of the dynamic shared object;
+ - Make sure that only the intended version(s) of the library has
+ been loaded, e.g., by calling static method <CODE>version()</CODE>
+ in class <CODE>parma_polyhedra_library.Parma_Polyhedra_Library</CODE>;
+ - Starting from version 0.11, initialize the interface by calling
+ static method <CODE>initialize_library()</CODE>;
+ when all library work is done, finalize the interface by calling
+ <CODE>finalize_library()</CODE>.
+
+ - The numerical abstract domains available to the Java user as
+ Java classes consist of the <EM>simple</EM> domains,
+ <EM>powersets</EM> of a simple domain and <EM>products</EM>
+ of simple domains. Note that the default configuration will
+ only enable a subset of these domains (if you need a different
+ set of domains, see configuration option
+ <CODE>--enable-instantiations</CODE>).
+ - The simple domains are:
+ - convex polyhedra, which consist of C_Polyhedron and
+ NNC_Polyhedron;<BR>
+ - weakly relational, which consist of BD_Shape_N and
+ Octagonal_Shape_N
+ where N is one of the numeric types
+ signed_char, short, int, long, long_long,
+ mpz_class, mpq_class;<BR>
+ - boxes which consist of
+ Int8_Box, Int16_Box, Int32_Box, Int64_Box,
+ Uint8_Box, Uint16_Box, Uint32_Box, Uint64_Box,
+ Float_Box, Double_Box, Long_Double_Box,
+ Z_Box, Rational_Box; and<BR>
+ - the Grid domain.
+ - The powerset domains are Pointset_Powerset_S where S is
+ a simple domain.
+ - The product domains consist of
+ Direct_Product_S_T,
+ Smash_Product_S_T and
+ Constraints_Product_S_T where S
+ and T are simple domains.
+
+ - In the following, any of the above numerical
+ abstract domains is called a PPL <EM>domain</EM>
+ and any element of a PPL domain is called a PPL <EM>object</EM>.
+
+ - A Java program can create a new object for a PPL domain by
+ using the constructors for the class corresponding to the domain.
+
+ - For a PPL object with space dimension \p k,
+ the identifiers used for the PPL variables
+ must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+ associated Cartesian axes.
+ For example, when using methods that combine PPL polyhedra
+ or add constraints or generators to a representation of
+ a PPL polyhedron,
+ the polyhedra referenced and any constraints or generators in the call
+ should follow all the (space) dimension-compatibility rules stated in
+ Section \extref{representation, Representations of Convex Polyhedra}
+ of the main PPL user manual.
+
+ - As explained above, a polyhedron has a fixed topology C or NNC,
+ that is determined at the time of its initialization.
+ All subsequent operations on the polyhedron must respect all the
+ topological compatibility rules stated in Section
+ \extref{representation, Representations of Convex Polyhedra}
+ of the main PPL user manual.
+
+ - A <EM>system</EM> of constraints (i.e., an instance of class
+ <CODE>parma_polyhedra_library.Constraint_System</CODE>)
+ is implemented by extending class <CODE>java.util.ArrayList</CODE>
+ (note: <CODE>java.util.Vector</CODE> was used up to version 1.0.)
+ As a consequence, it is possible to iterate over the constraints
+ in the system by using corresponding inherited methods. Similarly,
+ it is possible to modify a system of constraints by using methods
+ such as <CODE>add</CODE>; be warned, however, that the constraint
+ system obtained from a PPL object is a <EM>copy</EM> of the (C++)
+ data structure used in the object itself: any modification will not
+ directly affect the original PPL object; clearly, the modified
+ constraint system can be used with appropriate methods to,
+ e.g., build a new PPL object or modify an existing one.
+ The same observations apply to systems of congruences and
+ systems of (grid) generators.
+
+*/ /* \mainpage */
+
+/*! \brief The PPL Java interface package.
+
+ \ingroup PPL_Java_interface
+ All classes, interfaces and enums related to the Parma Polyhedra Library
+ Java interface are included in this package.
+*/
+package parma_polyhedra_library;
+
+//! A class collecting library-level functions.
+/*! \ingroup PPL_Java_interface */
+public class Parma_Polyhedra_Library {
+
+ //! \name Library initialization and finalization
+ //@{
+
+ /*! \brief
+ Initializes the Parma Polyhedra Library.
+
+ This method must be called after loading the library and
+ before calling any other method from any other PPL package class.
+ */
+ public static native void initialize_library();
+
+ /*! \brief
+ Finalizes the Parma Polyhedra Library.
+
+ This method must be called when work with the library is done.
+ After finalization, no other library method can be called
+ (except those in class Parma_Polyhedra_Library), unless the library
+ is re-initialized by calling <CODE>initialize_library()</CODE>.
+ */
+ public static native void finalize_library();
+
+ //@} // Library initialization and finalization
+
+ //! \name Version Checking
+ //@{
+
+ //! Returns the major number of the PPL version.
+ public static native int version_major();
+
+ //! Returns the minor number of the PPL version.
+ public static native int version_minor();
+
+ //! Returns the revision number of the PPL version.
+ public static native int version_revision();
+
+ //! Returns the beta number of the PPL version.
+ public static native int version_beta();
+
+ //! Returns a string containing the PPL version.
+ public static native String version();
+
+ //! Returns a string containing the PPL banner.
+ /*!
+ The banner provides information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+ */
+ public static native String banner();
+
+ //@} // Version Checking
+
+ //! \name Floating-point rounding and precision settings.
+ //@{
+
+ /*! \brief
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has been
+ previously called.
+ */
+ public static native void set_rounding_for_PPL();
+
+ /*! \brief
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.
+ */
+ public static native void restore_pre_PPL_rounding();
+
+ //! Returns the precision parameter for irrational calculations.
+ public static native int irrational_precision();
+
+ //! Sets the precision parameter used for irrational calculations.
+ /*!
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for irrational calculations to \p p.
+ Then, in the irrational calculations returning an unbounded rational,
+ (e.g., when computing a square root), the lesser between numerator
+ and denominator will be limited to 2**\p p.
+ */
+ public static native void set_irrational_precision(int p);
+
+ //@} // Floating-point rounding and precision settings.
+
+ //! \name Timeout handling
+ //@{
+
+ /*! \brief
+ Sets the timeout for computations whose completion could require
+ an exponential amount of time.
+
+ \param csecs
+ The number of centiseconds sometimes after which a timeout will occur;
+ it must be strictly greater than zero.
+
+ Computations taking exponential time will be interrupted some time
+ after \p csecs centiseconds have elapsed since the call to
+ the timeout setting function, by throwing a
+ <CODE>Timeout_Exception</CODE> object.
+ Otherwise, if the computation completes without being interrupted,
+ then the timeout should be reset by calling
+ <CODE>reset_timeout()</CODE>.
+ */
+ public static native void set_timeout(int csecs);
+
+ /*! \brief
+ Resets the timeout time so that the computation is not interrupted.
+ */
+ public static native void reset_timeout();
+
+ /*! \brief
+ Sets a threshold for computations whose completion could require
+ an exponential amount of time.
+
+ If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+ then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+ Computations taking exponential time will be interrupted some time
+ after reaching the complexity threshold \f$w\f$, by throwing a
+ <CODE>Timeout_Exception</CODE> object.
+ Otherwise, if the computation completes without being interrupted,
+ then the deterministic timeout should be reset by calling
+ <CODE>reset_deterministic_timeout()</CODE>.
+
+ \param unscaled_weight
+ The unscaled maximum computational weight; it has to be strictly
+ greater than zero.
+
+ \param scale
+ The scaling factor to be applied to \p unscaled_weight; it has
+ to be non-negative.
+
+ \exception Invalid_Argument_Exception
+ Thrown if the computation of the weight threshold exceeds the
+ maximum allowed value.
+
+ \note
+ This "timeout" checking functionality is said to be \e deterministic
+ because it is not based on actual elapsed time. Its behavior will
+ only depend on (some of the) computations performed in the PPL library
+ and it will be otherwise independent from the computation environment
+ (CPU, operating system, compiler, etc.).
+
+ \warning
+ The weight mechanism is under beta testing. In particular,
+ there is still no clear relation between the weight threshold and
+ the actual computational complexity. As a consequence, client
+ applications should be ready to reconsider the tuning of these
+ weight thresholds when upgrading to newer version of the PPL.
+ */
+ public static native void set_deterministic_timeout(int unscaled_weight,
+ int scale);
+
+ /*! \brief
+ Resets the deterministic timeout so that the computation is not
+ interrupted.
+ */
+ public static native void reset_deterministic_timeout();
+
+ //@} // Timeout handling.
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Partial_Function.java b/interfaces/Java/parma_polyhedra_library/Partial_Function.java
new file mode 100644
index 0000000..c8e926d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Partial_Function.java
@@ -0,0 +1,80 @@
+/* Partial_Function Java interface declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A partial function on space dimension indices.
+/*! \ingroup PPL_Java_interface
+ This class is used in order to specify how space dimensions should
+ be mapped by methods named \c map_space_dimensions.
+*/
+public class Partial_Function extends PPL_Object {
+
+ /*! \brief
+ Builds the empty map.
+ */
+ public Partial_Function() {
+ build_cpp_object();
+ }
+
+ /*! \brief
+ Inserts mapping from \p i to \p j.
+ */
+ public native void insert(long i, long j);
+
+ /*! \brief
+ Returns \c true if and only if the partial function has
+ an empty codomain (i.e., it is always undefined).
+
+ This method will always be called before the other methods
+ of the interface. Moreover, if \c true is returned, then
+ none of the other interface methods will be called.
+ */
+ public native boolean has_empty_codomain();
+
+ /*! \brief
+ Returns the maximum value that belongs to the codomain
+ of the partial function.
+ */
+ public native long max_in_codomain();
+
+ /*! \brief
+ If the partial function is defined on index \p i, returns its value.
+
+ The function returns a negative value if the partial function
+ is not defined on domain value \p i.
+ */
+ public native long maps(long i);
+
+ /*! \brief
+ Releases all resources managed by \p this,
+ also resetting it to a null reference.
+ */
+ public native void free();
+
+ //! Releases all resources managed by \p this.
+ protected native void finalize();
+
+ //! Builds the underlying C++ object.
+ private native void build_cpp_object();
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java b/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
new file mode 100644
index 0000000..e1dc9fd
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
@@ -0,0 +1,93 @@
+/* Poly_Con_Relation Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_Java_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a constraint.
+*/
+public class Poly_Con_Relation {
+
+ public static final int NOTHING = 0;
+ public static final int IS_DISJOINT = 1;
+ public static final int STRICTLY_INTERSECTS = 2;
+ public static final int IS_INCLUDED = 4;
+ public static final int SATURATES = 8;
+
+ //! Holds the value of the possible relations.
+ private int mask_value;
+
+ //! Constructs from a integer value.
+ public Poly_Con_Relation(int val) {
+ mask_value = val;
+ }
+
+ //! The assertion that says nothing.
+ public static Poly_Con_Relation nothing() {
+ return new Poly_Con_Relation(Poly_Con_Relation.NOTHING);
+ }
+
+ /*! \brief
+ The polyhedron and the set of points satisfying
+ the constraint are disjoint.
+ */
+ public static Poly_Con_Relation is_disjoint() {
+ return new Poly_Con_Relation(Poly_Con_Relation.IS_DISJOINT);
+ }
+
+ /*! \brief
+ The polyhedron intersects the set of points satisfying
+ the constraint, but it is not included in it.
+ */
+ public static Poly_Con_Relation strictly_intersects() {
+ return new Poly_Con_Relation(Poly_Con_Relation.STRICTLY_INTERSECTS);
+ }
+
+ /*! \brief
+ The polyhedron is included in the set of points satisfying
+ the constraint.
+ */
+ public static Poly_Con_Relation is_included() {
+ return new Poly_Con_Relation(Poly_Con_Relation.IS_INCLUDED);
+ }
+
+ /*! \brief
+ The polyhedron is included in the set of points saturating
+ the constraint.
+ */
+ public static Poly_Con_Relation saturates() {
+ return new Poly_Con_Relation(Poly_Con_Relation.SATURATES);
+ }
+
+ //! True if and only if \p this implies \p y.
+ public boolean implies(Poly_Con_Relation y) {
+ return (this.mask_value & y.mask_value) == y.mask_value;
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java b/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
new file mode 100644
index 0000000..1ae906d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
@@ -0,0 +1,63 @@
+/* Poly_Gen_Relation Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a generator.
+*/
+public class Poly_Gen_Relation {
+
+ public static final int NOTHING = 0;
+ public static final int SUBSUMES = 1;
+
+ //! Holds the value of the possible relations.
+ private int mask_value;
+
+ //! Constructs from a integer value.
+ public Poly_Gen_Relation(int val) {
+ mask_value = val;
+ }
+
+ //! The assertion that says nothing.
+ public static Poly_Gen_Relation nothing() {
+ return new Poly_Gen_Relation(Poly_Gen_Relation.NOTHING);
+ }
+
+ //! Adding the generator would not change the polyhedron.
+ public static Poly_Gen_Relation subsumes() {
+ return new Poly_Gen_Relation(Poly_Gen_Relation.SUBSUMES);
+ }
+
+ //! True if and only if \p this implies \p y.
+ public boolean implies(Poly_Gen_Relation y) {
+ return (this.mask_value & y.mask_value) == y.mask_value;
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java b/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
new file mode 100644
index 0000000..f696016
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
@@ -0,0 +1,46 @@
+/* Relation_Symbol enum declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Relation symbols.
+/*! \ingroup PPL_Java_interface */
+public enum Relation_Symbol {
+ //! Less than.
+ LESS_THAN,
+ //! Less than or equal to.
+ LESS_OR_EQUAL,
+ //! Equal to.
+ EQUAL,
+ //! Greater than or equal to.
+ GREATER_OR_EQUAL,
+ //! Greater than.
+ GREATER_THAN,
+ //! Not equal to.
+ NOT_EQUAL;
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java b/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java
new file mode 100644
index 0000000..a5da527
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java
@@ -0,0 +1,33 @@
+/* Timeout_Exception Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by timeout expiring.
+/*! \ingroup PPL_Java_interface */
+public class Timeout_Exception extends RuntimeException {
+ //! Constructor.
+ public Timeout_Exception(String s) {
+ super(s);
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variable.java b/interfaces/Java/parma_polyhedra_library/Variable.java
new file mode 100644
index 0000000..2ebe8ac
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variable.java
@@ -0,0 +1,95 @@
+/* Variable Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_Java_interface
+ An object of the class Variable represents a dimension of the space,
+ that is one of the Cartesian axes.
+ Variables are used as basic blocks in order to build
+ more complex linear expressions.
+ Each variable is identified by a non-negative integer,
+ representing the index of the corresponding Cartesian axis
+ (the first axis has index 0).
+*/
+public class Variable implements Comparable<Variable> {
+ //! The index of the Cartesian axis.
+ private long varid;
+
+ //! Builds the variable corresponding to the Cartesian axis of index \p i.
+ /*!
+ \exception RuntimeErrorException
+ Thrown if <CODE>i</CODE> is has negative value.
+ */
+ public Variable(long i) {
+ if (i < 0)
+ throw new
+ RuntimeErrorException(new Error("parma_polyhedra_library.Variable::"
+ + "Variable:"
+ + " an index variable"
+ + " cannot be negative."));
+ varid = i;
+ }
+
+ //! Returns the index of the Cartesian axis associated to \p this.
+ public long id() {
+ return varid;
+ }
+
+ /*! \brief
+ Returns a negative number if \p this is smaller than \p v,
+ a zero if \p this equals \p v, a positive number if \p v
+ is greater than \p v.
+ */
+ public int compareTo(Variable v) {
+ if (varid < v.varid)
+ return -1;
+ else if (varid == v.varid)
+ return 0;
+ else
+ return 1;
+ }
+
+ //! Optional customization provider for \c toString.
+ private static Variable_Stringifier stringifier;
+
+ /*! \brief
+ Sets the variable stringifier object.
+
+ A variable stringifier object provides customization for the
+ \c toString method; if no variable stringifier object is set
+ (or if it is set to a null refeerence value), the PPL default
+ variable output function will be used.
+ */
+ public static native void setStringifier(Variable_Stringifier vs);
+
+ public native String toString();
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java b/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java
new file mode 100644
index 0000000..5349c98
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java
@@ -0,0 +1,33 @@
+/* Variable_Stringifier Java interface.
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! An interface for objects converting a Variable id to a string.
+/*! \ingroup PPL_Java_interface
+ If customized variable output is required, the user should implement
+ this interface and pass a corresponding instance to Variable's static
+ method \c setStringifier.
+*/
+public interface Variable_Stringifier {
+ public String stringify(long var_id);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variables_Set.java b/interfaces/Java/parma_polyhedra_library/Variables_Set.java
new file mode 100644
index 0000000..8140a1e
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variables_Set.java
@@ -0,0 +1,37 @@
+/* Variables_Set Java class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A java.util.TreeSet of variables' indexes.
+public class Variables_Set extends java.util.TreeSet<Variable>{
+
+ //! Builds the empty set of variable indexes.
+ public Variables_Set() {
+ }
+
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4 b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
new file mode 100644
index 0000000..3f7424f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
@@ -0,0 +1,169 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the files <CLASS_NAME>.java
+dnl using the code in ppl_interface_generator_java_classes_java_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_classes_java_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+/* PPL Java interface: Termination definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+public class Termination {`'dnl
+
+m4_divert(-1)
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_cplusplus_class', `Parma_Polyhedra_Library::`'m4_cplusplus_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')`'dnl
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'.java << ___END_OF_FILE___
+/* PPL Java interface: m4_this_class definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+ Java class interfacing C++ m4_this_cplusplus_class
+ \ingroup PPL_java_interface
+*/
+public class m4_this_class extends PPL_Object {`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+ `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ C_Polyhedron.java << ___END_OF_FILE___
+/* PPL Java interface: C_Polyhedron definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+ Java class interfacing C++ Parma_Polyhedra_Library::C_Polyhedron
+ \ingroup PPL_java_interface
+*/
+public class C_Polyhedron extends Polyhedron {
+___END_OF_FILE___
+___BEGIN_OF_FILE___ NNC_Polyhedron.java << ___END_OF_FILE___
+/* PPL Java interface: NNC_Polyhedron definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+ Java class interfacing C++ Parma_Polyhedra_Library::NNC_Polyhedron
+ \ingroup PPL_java_interface
+*/
+public class NNC_Polyhedron extends Polyhedron {
+',
+m4_this_class_kind, Pointset_Powerset,
+`
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'_Iterator.java << ___END_OF_FILE___
+/* PPL Java interface: m4_this_class`'_Iterator definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+ Java class interfacing C++ m4_this_cplusplus_class`':: iterator
+ \ingroup PPL_java_interface
+*/
+public class m4_this_class`'_Iterator extends PPL_Object {
+
+ private m4_this_class`'_Iterator() {};
+
+ private native void build_ppl_object(m4_this_class obj);
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_cplusplus_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+m4_divert(-1)
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object1_code)`'dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object2_code)`'dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object3_code)`'dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'.java << ___END_OF_FILE___
+}`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+ `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ C_Polyhedron.java << ___END_OF_FILE___
+}
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ NNC_Polyhedron.java << ___END_OF_FILE___
+}
+',
+m4_this_class_kind, Pointset_Powerset,
+ `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'_Iterator.java << ___END_OF_FILE___
+}`'dnl
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+m4_divert(-1)
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+}
+___END_OF_FILE___
+m4_divert(-1)
+dnl End of file generation.
diff --git a/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4 b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
new file mode 100644
index 0000000..8bdf04b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
@@ -0,0 +1,771 @@
+dnl -*- java -*-
+m4_divert(-1)
+
+This m4 file contains the code for generating files <CLASS_NAME>.java
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`m4_class_build_cpp_object1_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ private native void build_cpp_object(@!BUILD_REPRESENT at _System cs);
+
+')
+
+m4_define(`m4_class_build_cpp_object2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ private native void build_cpp_object(long num_dimensions,
+ Degenerate_Element kind);
+
+')
+
+m4_define(`m4_class_build_cpp_object3_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ private native void build_cpp_object(@FRIEND@ y);
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ private native void build_cpp_object(@FRIEND@ y,
+ Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public @TOPOLOGY@@CLASS@(long num_dimensions,
+ Degenerate_Element kind) {
+ build_cpp_object(num_dimensions, kind);
+ }
+
+ private @TOPOLOGY@@CLASS@() {
+ }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public @TOPOLOGY@@CLASS@(@FRIEND@ y) {
+ build_cpp_object(y);
+ }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public @TOPOLOGY@@CLASS@(@FRIEND@ y, Complexity_Class complexity) {
+ build_cpp_object(y, complexity);
+ }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public @TOPOLOGY@@CLASS@(@!BUILD_REPRESENT at _System cs) {
+ build_cpp_object(cs);
+ }
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ protected native void finalize();
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public native void free();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public native boolean @UB_EXACT@(@TOPOLOGY@@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void swap(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native long @DIMENSION@();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native @!CLASS_REPRESENT at _System @CLASS_REPRESENT at s();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native @!CLASS_REPRESENT at _System minimized_ at CLASS_REPRESENT@s();
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native Poly_@!A_RELATION_REPRESENT at _Relation relation_with(@!RELATION_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean @HAS_PROPERTY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void @SIMPLIFY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void unconstrain_space_dimension(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void
+ unconstrain_space_dimensions(Variables_Set vars);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean bounds_from_ at ABOVEBELOW@(Linear_Expression expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean has_ at UPPERLOWER@_bound(Variable var,
+ Coefficient bound_n, Coefficient bound_d,
+ By_Reference<Boolean> closed);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean @MAXMIN@(Linear_Expression expr,
+ Coefficient sup_n, Coefficient sup_d,
+ By_Reference<Boolean> maximum);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean @MAXMIN@(Linear_Expression expr,
+ Coefficient sup_n, Coefficient sup_d,
+ By_Reference<Boolean> maximum,
+ Generator point);
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean frequency(Linear_Expression expr,
+ Coefficient freq_n, Coefficient freq_d,
+ Coefficient val_n, Coefficient val_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean @COMPARISON@(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean equals(@CLASS@ p);
+
+ public boolean equals(Object y) {
+ if (this == y)
+ return true;
+ if (y == null || y.getClass() != this.getClass())
+ return false;
+ return this.equals((@CLASS@) y);
+ }
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native int hashCode();
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean OK();
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void add_ at CLASS_REPRESENT@(@!CLASS_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void refine_with_ at REFINE_REPRESENT@(@!REFINE_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void add_ at CLASS_REPRESENT@s(@!CLASS_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void refine_with_ at REFINE_REPRESENT@s(@!REFINE_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void @BINOP@(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+ public native void positive_time_elapse_assign(@TOPOLOGY@@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean simplify_using_context_assign(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void @AFFIMAGE@(Variable var, Linear_Expression expr,
+ Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void bounded_ at AFFIMAGE@(Variable var,
+ Linear_Expression lb_expr,
+ Linear_Expression ub_expr,
+ Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void generalized_ at AFFIMAGE@(Variable var,
+ Relation_Symbol relsym,
+ Linear_Expression expr,
+ Coefficient denominator);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void generalized_ at AFFIMAGE@(Linear_Expression lhs,
+ Relation_Symbol relsym,
+ Linear_Expression rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void
+ @EXTRAPOLATION at _extrapolation_assign(@TOPOLOGY@@CLASS@ arg,
+ By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void
+ @EXTRAPOLATION at _narrowing_assign(@TOPOLOGY@@CLASS@ arg);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void generalized_ at AFFIMAGE@_with_congruence(Variable var,
+ Relation_Symbol relsym,
+ Linear_Expression expr,
+ Coefficient denominator,
+ Coefficient modulus);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(Linear_Expression lhs,
+ Relation_Symbol relsym,
+ Linear_Expression rhs,
+ Coefficient modulus);
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void wrap_assign(Variables_Set vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ Constraint_System cs,
+ long complexity_threshold,
+ boolean wrap_individually);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+public native void @WIDEN at _widening_assign(@CLASS@ y,
+ By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+public native void widening_assign(@CLASS@ y,
+ By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native
+ void @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(@CLASS@ y,
+ @!CONSTRAINER at _System cs,
+ By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native
+ void BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(@CLASS@ y,
+ Integer d);
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void
+ BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void add_space_dimensions_ at EMBEDPROJECT@(long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void remove_space_dimensions(Variables_Set vars);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void remove_higher_space_dimensions(long new_dimension);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void expand_space_dimension(Variable var, long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void fold_space_dimensions(Variables_Set vars,
+ Variable dest);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void drop_some_non_integer_points
+ (Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void drop_some_non_integer_points
+ (Variables_Set vars, Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void map_space_dimensions(Partial_Function pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native String toString();
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+ public @CLASS at _Iterator(@CLASS at _Iterator y) {
+ build_cpp_object(y);
+ }
+
+ private native void
+ build_cpp_object(@CLASS at _Iterator y);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native @CLASS at _Iterator @BEGINEND at _iterator();
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+ public native void free();
+
+ protected native void finalize();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+ public native @DISJUNCT_TOPOLOGY@@DISJUNCT@ get_disjunct();
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void drop_disjunct(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+ public native void drop_disjuncts(@CLASS at _Iterator itr1,
+ @CLASS at _Iterator itr2);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native void add_disjunct(@DISJUNCT_TOPOLOGY@@DISJUNCT@ j_disj);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+ public native boolean equals(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+ public native void @A_INCDEC@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native long @MEMBYTES@();
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native boolean constrains(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+ public native String ascii_dump();
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+
+ public static native
+ Pair <@TOPOLOGY@@CLASS@|COMMA| Pointset_Powerset_NNC_Polyhedron >
+ linear_ at PARTITION@(@TOPOLOGY@@CLASS@ p, @TOPOLOGY@@CLASS@ q);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+
+ public static native Pair <@CLASS@|COMMA| Pointset_Powerset_Grid >
+ approximate_ at PARTITION@(@CLASS@ p,
+ @CLASS@ q,
+ By_Reference<Boolean> finite);
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native boolean
+ termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(@TOPOLOGY@@CLASS@ p);
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native boolean
+ termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after);
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native boolean
+ one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (@TOPOLOGY@@CLASS@ p, Generator g);
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native boolean
+ one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after, Generator g);
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native void
+ all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (@TOPOLOGY@@CLASS@ p, Polyhedron ph);
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native void
+ all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after, Polyhedron ph);
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native void
+ all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+ (@TOPOLOGY@@CLASS@ p, Polyhedron ph_decreasing, Polyhedron ph_bounded);
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+ public static native void
+ all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+ (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after,
+ Polyhedron ph_decreasing, Polyhedron ph_bounded);
+')
diff --git a/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
new file mode 100644
index 0000000..a05b5ae
--- /dev/null
+++ b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
@@ -0,0 +1,55 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of methods
+dnl for the Java interface; this includes:
+dnl - the list in the imported file and any Java specific methods.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list',
+`m4_echo_unquoted(`m4_common_procedure_list',
+ppl_free_ at CLASS@/1 +all,
+ppl_ at CLASS@_hashcode/2 +all,
+ppl_ at CLASS@_string/1 +all,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3 +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4 +simple,)dnl
+')
diff --git a/interfaces/Java/tests/C_Polyhedron_test1.java b/interfaces/Java/tests/C_Polyhedron_test1.java
new file mode 100644
index 0000000..a55840d
--- /dev/null
+++ b/interfaces/Java/tests/C_Polyhedron_test1.java
@@ -0,0 +1,137 @@
+/* Test C_Polyhedron Java test class of the Parma Polyhedra Library Java
+ interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class C_Polyhedron_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // This code tests the method `map_space_dimension(pfunc)'.
+ public static boolean test01() {
+ Partial_Function partial_function = new Partial_Function();
+ partial_function.insert(0, 2);
+ partial_function.insert(2, 0);
+ partial_function.insert(1, 1);
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Variable C = new Variable(2);
+ Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+ Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Linear_Expression_Sum le_a_plus_b
+ = new Linear_Expression_Sum(le_a, le_b);
+ Linear_Expression_Sum le_a_plus_c
+ = new Linear_Expression_Sum(le_a, le_c);
+ Linear_Expression_Sum le_c_plus_b
+ = new Linear_Expression_Sum(le_c, le_b);
+ Linear_Expression_Sum le_c_plus_a
+ = new Linear_Expression_Sum(le_c, le_a);
+ Linear_Expression_Coefficient le_two
+ = new Linear_Expression_Coefficient(new Coefficient(2));
+ Linear_Expression_Times le_2c
+ = new Linear_Expression_Times(le_c, new Coefficient(2));
+ Linear_Expression_Times le_2a
+ = new Linear_Expression_Times(le_a, new Coefficient(2));
+
+ Generator_System gs = new Generator_System();
+ gs.add(Generator.point(le_2c, new Coefficient(1)));
+ gs.add(Generator.line(le_a_plus_b));
+ gs.add(Generator.ray(le_a_plus_c));
+
+ C_Polyhedron poly1 = new C_Polyhedron(gs);
+ poly1.map_space_dimensions(partial_function);
+
+ Generator_System known_gs = new Generator_System();
+ known_gs.add(Generator.point(le_2a, new Coefficient(1)));
+ known_gs.add(Generator.line(le_c_plus_b));
+ known_gs.add(Generator.ray(le_c_plus_a));
+
+ C_Polyhedron known_result = new C_Polyhedron(known_gs);
+ return known_result.equals(poly1);
+ }
+
+
+ public static boolean test02() {
+ // Test if `minimized_constraints' returns an empty Constraint_System
+ // if the Polyhedron is built from universe with a dimension greater
+ // than zero.
+ Variable X = new Variable(0);
+ Variable Y = new Variable(1);
+ Variable Z = new Variable(2);
+ C_Polyhedron ph = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ Constraint_System cs = ph.minimized_constraints();
+ return cs.isEmpty();
+ }
+
+ public static boolean test03() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Generator_System gs = new Generator_System();
+ gs.add(Generator.point(new Linear_Expression_Variable(A),
+ new Coefficient(2)));
+ gs.add(Generator.point(new Linear_Expression_Variable(B),
+ new Coefficient(2)));
+ C_Polyhedron ph = new C_Polyhedron(gs);
+ Variables_Set var_set = new Variables_Set();
+ var_set.add(B);
+ ph.drop_some_non_integer_points(var_set,
+ Complexity_Class.ANY_COMPLEXITY);
+ Generator_System gs_out = ph.minimized_generators();
+ boolean ok = (gs_out.size() == 1);
+ ph.drop_some_non_integer_points(Complexity_Class.ANY_COMPLEXITY);
+ gs_out = ph.minimized_generators();
+ ok = ok && gs_out.isEmpty();
+ return ok;
+ }
+
+ public static boolean test04() {
+ Coefficient freq_n = new Coefficient(0);
+ Coefficient freq_d = new Coefficient(0);
+ Coefficient val_n = new Coefficient(0);
+ Coefficient val_d = new Coefficient(0);
+ Linear_Expression le
+ = new Linear_Expression_Coefficient(new Coefficient(0));
+ C_Polyhedron ph = new C_Polyhedron(0, Degenerate_Element.UNIVERSE);
+ return ph.frequency(le, freq_n, freq_d, val_n, val_d);
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(C_Polyhedron_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/interfaces/Java/tests/Custom_Variable_Stringifier.java b/interfaces/Java/tests/Custom_Variable_Stringifier.java
new file mode 100644
index 0000000..899107c
--- /dev/null
+++ b/interfaces/Java/tests/Custom_Variable_Stringifier.java
@@ -0,0 +1,29 @@
+/* A class providing customized variable output for Java.
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Custom_Variable_Stringifier implements Variable_Stringifier {
+ public String stringify(long var_id) {
+ return "Var_" + var_id;
+ }
+}
diff --git a/interfaces/Java/tests/MIP_Problem_test1.java b/interfaces/Java/tests/MIP_Problem_test1.java
new file mode 100644
index 0000000..23019be
--- /dev/null
+++ b/interfaces/Java/tests/MIP_Problem_test1.java
@@ -0,0 +1,274 @@
+/* Test MIP_Problem Java test class of the Parma Polyhedra Library Java
+ interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class MIP_Problem_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // This code tests the MIP_Problem methods.
+ public static boolean test01() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Variable C = new Variable(2);
+ Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+ Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_3 = new Coefficient(3);
+ Coefficient coeff_5 = new Coefficient(5);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+
+ // Constraint declarations.
+ Constraint c_a_geq_1
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_a_leq_5
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+ Constraint c_b_geq_3
+ = new Constraint(le_b, Relation_Symbol.GREATER_OR_EQUAL, le_3);
+ Constraint constraint1 = c_a_geq_1;
+ Constraint constraint2 = c_b_geq_3;
+ Constraint_System constraints1 = new Constraint_System();
+ constraints1.add(constraint1);
+ C_Polyhedron ph1 = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ ph1.add_constraints(constraints1);
+ C_Polyhedron ph2 = new C_Polyhedron(4, Degenerate_Element.UNIVERSE);
+ ph2.add_constraints(constraints1);
+ ph2.add_constraint(constraint2);
+
+ MIP_Problem mip1
+ = new MIP_Problem(3, constraints1, le_a,
+ Optimization_Mode.MAXIMIZATION);
+ Constraint_System mip1_constraints = mip1.constraints();
+ long mip1_dim = mip1.space_dimension();
+ Linear_Expression mip1_obj = mip1.objective_function();
+ Optimization_Mode mip1_opt = mip1.optimization_mode();
+
+ MIP_Problem mip2 = new MIP_Problem(mip1_dim);
+ mip2.add_constraints(mip1_constraints);
+ mip2.set_objective_function(mip1_obj);
+ mip2.set_optimization_mode(mip1_opt);
+
+ boolean ok = (mip2.space_dimension() == 3)
+ && (mip2.optimization_mode() == Optimization_Mode.MAXIMIZATION);
+ C_Polyhedron mip2_ph = new C_Polyhedron(3,
+ Degenerate_Element.UNIVERSE);
+ mip2_ph.add_constraints(mip1_constraints);
+ ok = ok && new Boolean(mip2_ph.equals(ph1));
+ if (!ok)
+ return false;
+
+ MIP_Problem mip3 = new MIP_Problem(3);
+ mip3.add_constraints(constraints1);
+ mip3.add_space_dimensions_and_embed(1);
+ mip3.set_objective_function(le_b);
+ mip3.add_constraint(constraint2);
+ mip3.set_optimization_mode(Optimization_Mode.MINIMIZATION);
+ ok = ok && (mip3.space_dimension() == 4)
+ && (mip3.optimization_mode() == Optimization_Mode.MINIMIZATION);
+ Constraint_System mip3_constraints = mip3.constraints();
+ C_Polyhedron mip3_ph = new C_Polyhedron(4,
+ Degenerate_Element.UNIVERSE);
+ mip3_ph.add_constraints(mip3_constraints);
+ ok = ok && mip3_ph.equals(ph2);
+
+ return ok;
+ }
+
+ // This code tests more MIP_Problem methods.
+ public static boolean test02() {
+ Variable A = new Variable(0);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Coefficient coeff_0 = new Coefficient(0);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_5 = new Coefficient(5);
+ Coefficient coeff_8 = new Coefficient(8);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+ Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+ // Constraint declarations.
+ Constraint c_a_geq_1
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_a_leq_5
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+ Constraint c_a_eq_8
+ = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+ Constraint constraint1 = c_a_geq_1;
+ Constraint_System constraints1 = new Constraint_System();
+ constraints1.add(constraint1);
+
+ Variables_Set var_set_A = new Variables_Set();
+ var_set_A.add(A);
+
+ MIP_Problem mip1
+ = new MIP_Problem(1, constraints1, le_a,
+ Optimization_Mode.MAXIMIZATION);
+ Constraint_System mip1_constraints = mip1.constraints();
+ long mip1_dim = mip1.space_dimension();
+ Linear_Expression mip1_obj = mip1.objective_function();
+ Optimization_Mode mip1_opt = mip1.optimization_mode();
+
+ Variables_Set var_set = mip1.integer_space_dimensions();
+ boolean ok = var_set.isEmpty();
+ mip1.add_to_integer_space_dimensions(var_set_A);
+ Variables_Set var_set1 = mip1.integer_space_dimensions();
+ ok = ok && (var_set1.contains(A));
+ if (!ok)
+ return false;
+
+ ok = mip1.is_satisfiable();
+ if (!ok)
+ return false;
+
+ MIP_Problem_Status mip1_status;
+ mip1_status = mip1.solve();
+ ok = ok && (mip1_status == MIP_Problem_Status.UNBOUNDED_MIP_PROBLEM);
+
+ MIP_Problem_Status mip2_status;
+ mip1.add_constraint(c_a_leq_5);
+ mip2_status = mip1.solve();
+ ok = ok && (mip2_status == MIP_Problem_Status.OPTIMIZED_MIP_PROBLEM);
+ if (!ok)
+ return false;
+
+ MIP_Problem mip3
+ = new MIP_Problem(1, constraints1, le_a,
+ Optimization_Mode.MAXIMIZATION);
+ MIP_Problem_Status mip3_status;
+ mip3.add_constraint(c_a_leq_5);
+ mip3.add_constraint(c_a_eq_8);
+
+ Constraint_System cs = mip3.constraints();
+ mip3_status = mip3.solve();
+ ok = !mip3.is_satisfiable();
+ ok = ok && (mip3_status == MIP_Problem_Status.UNFEASIBLE_MIP_PROBLEM);
+ if (!ok)
+ return false;
+
+ Generator g1 = Generator.point(le_a, coeff_1);
+ Coefficient num = coeff_1;
+ Coefficient den = coeff_1;
+ mip1.evaluate_objective_function(g1, num, den);
+ ok = (num == coeff_1 && den == coeff_1);
+ if (!ok)
+ return false;
+
+ Linear_Expression le_5a = le_a.times(coeff_5);
+
+ Generator f_point = mip1.feasible_point();
+ C_Polyhedron f_ph = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ f_ph.add_generator(f_point);
+ Generator expected_f_point = Generator.point(le_5a, coeff_1);
+ C_Polyhedron expected_f_ph
+ = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ expected_f_ph.add_generator(expected_f_point);
+ ok = f_ph.equals(expected_f_ph);
+
+ Generator o_point = mip1.optimizing_point();
+ C_Polyhedron o_ph = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ o_ph.add_generator(o_point);
+ Generator expected_o_point = Generator.point(le_5a, coeff_1);
+ C_Polyhedron expected_o_ph
+ = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ expected_o_ph.add_generator(expected_o_point);
+ ok = o_ph.equals(expected_o_ph);
+
+ Coefficient ov_num = new Coefficient(0);
+ Coefficient ov_den = new Coefficient(0);
+ mip1.optimal_value(ov_num, ov_den);
+ Linear_Expression le_ov_num
+ = new Linear_Expression_Coefficient(ov_num);
+ Linear_Expression le_ov_den
+ = new Linear_Expression_Coefficient(ov_den);
+ // ok = (le_ov_num == le_5 && le_ov_den == le_1);
+ C_Polyhedron ov_ph
+ = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ Constraint c_a_leq_ov_num
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_ov_num);
+ Constraint c_a_geq_ov_num
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_ov_den);
+ ov_ph.add_constraint(c_a_leq_ov_num);
+ C_Polyhedron expected_ov_ph
+ = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+ expected_ov_ph.add_constraint(c_a_leq_5);
+ expected_ov_ph.add_constraint(c_a_geq_1);
+ ok = (ov_ph.equals(expected_ov_ph));
+
+ PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+ PPL_Test.println_if_noisy(IO.wrap_string(mip1.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+
+ PPL_Test.print_if_noisy("Testing max_space_dimension(): ");
+ long max_space_dim = mip1.max_space_dimension();
+ PPL_Test.println_if_noisy(max_space_dim);
+
+ Control_Parameter_Value cp_value
+ = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+ mip1.set_control_parameter(
+ Control_Parameter_Value.PRICING_STEEPEST_EDGE_FLOAT);
+ Control_Parameter_Value cp_value1
+ = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+ ok = ok
+ && (cp_value1
+ == Control_Parameter_Value.PRICING_STEEPEST_EDGE_FLOAT);
+ mip1.set_control_parameter(
+ Control_Parameter_Value.PRICING_STEEPEST_EDGE_EXACT);
+ Control_Parameter_Value cp_value2
+ = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+ ok = ok
+ && (cp_value2
+ == Control_Parameter_Value.PRICING_STEEPEST_EDGE_EXACT);
+ mip1.set_control_parameter(
+ Control_Parameter_Value.PRICING_TEXTBOOK);
+ Control_Parameter_Value cp_value3
+ = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+ ok = ok
+ && (cp_value3
+ == Control_Parameter_Value.PRICING_TEXTBOOK);
+
+ return ok && mip1.OK();
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(MIP_Problem_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/interfaces/Java/tests/Makefile.am b/interfaces/Java/tests/Makefile.am
new file mode 100644
index 0000000..990b0ed
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.am
@@ -0,0 +1,103 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+JAVAROOT = .
+
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+ppl_java_tests_common
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+PPL_Test.java \
+ppl_java_tests_common \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java
+
+if ENABLE_SHARED
+
+check_JAVA = \
+ppl_java_generated_tests.java \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java \
+PPL_Test.java
+
+CLASSPATH = ../ppl_java.jar:.
+JAVACFLAGS = -classpath $(CLASSPATH)
+
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+
+java_test_environment = \
+$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_DLOPEN) \
+ $(JAVA) -classpath .:../ppl_java.jar \
+ -Djava.library.path=../jni/.libs
+
+ppl_java_generated_tests.java: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_java_test_java.m4 \
+ > $@
+
+check-local: ppl_java_generated_tests.java
+ $(java_test_environment) ppl_java_generated_tests
+ $(java_test_environment) C_Polyhedron_test1
+ $(java_test_environment) NNC_Polyhedron_test1
+ $(java_test_environment) MIP_Problem_test1
+ $(java_test_environment) PIP_Problem_test1
+ $(java_test_environment) Parma_Polyhedra_Library_test1
+ $(java_test_environment) Parma_Polyhedra_Library_test2
+ $(java_test_environment) Variable_Output_test1
+
+CLEANFILES = \
+ppl_java_generated_tests.java
+
+endif ENABLE_SHARED
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Java/tests/Makefile.in b/interfaces/Java/tests/Makefile.in
new file mode 100644
index 0000000..2303224
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.in
@@ -0,0 +1,640 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT)$${CLASSPATH:+":$$CLASSPATH"}
+am__java_sources = $(check_JAVA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+JAVAROOT = .
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+ppl_java_tests_common
+
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+PPL_Test.java \
+ppl_java_tests_common \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java
+
+ at ENABLE_SHARED_TRUE@check_JAVA = \
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java \
+ at ENABLE_SHARED_TRUE@Test_Executor.java \
+ at ENABLE_SHARED_TRUE@C_Polyhedron_test1.java \
+ at ENABLE_SHARED_TRUE@NNC_Polyhedron_test1.java \
+ at ENABLE_SHARED_TRUE@MIP_Problem_test1.java \
+ at ENABLE_SHARED_TRUE@PIP_Problem_test1.java \
+ at ENABLE_SHARED_TRUE@Parma_Polyhedra_Library_test1.java \
+ at ENABLE_SHARED_TRUE@Parma_Polyhedra_Library_test2.java \
+ at ENABLE_SHARED_TRUE@Custom_Variable_Stringifier.java \
+ at ENABLE_SHARED_TRUE@Variable_Output_test1.java \
+ at ENABLE_SHARED_TRUE@PPL_Test.java
+
+ at ENABLE_SHARED_TRUE@CLASSPATH = ../ppl_java.jar:.
+ at ENABLE_SHARED_TRUE@JAVACFLAGS = -classpath $(CLASSPATH)
+ at ENABLE_SHARED_TRUE@PPL_DLOPEN = -dlopen ../../../src/libppl.la
+ at ENABLE_SHARED_TRUE@java_test_environment = \
+ at ENABLE_SHARED_TRUE@$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_DLOPEN) \
+ at ENABLE_SHARED_TRUE@ $(JAVA) -classpath .:../ppl_java.jar \
+ at ENABLE_SHARED_TRUE@ -Djava.library.path=../jni/.libs
+
+ at ENABLE_SHARED_TRUE@CLEANFILES = \
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Java/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+classcheck.stamp: $(am__java_sources)
+ @list1='$?'; list2=; if test -n "$$list1"; then \
+ for p in $$list1; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ list2="$$list2 $$d$$p"; \
+ done; \
+ echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) '"$$list2"; \
+ $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $$list2; \
+ else :; fi
+ echo timestamp > $@
+
+clean-checkJAVA:
+ -rm -f *.class classcheck.stamp
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_JAVA) classcheck.stamp
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkJAVA clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-checkJAVA \
+ clean-generic clean-libtool cscopelist-am ctags-am distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am
+
+
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@ $(M4) --prefix-builtin -I../.. \
+ at ENABLE_SHARED_TRUE@ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@ $(srcdir)/ppl_interface_generator_java_test_java.m4 \
+ at ENABLE_SHARED_TRUE@ > $@
+
+ at ENABLE_SHARED_TRUE@check-local: ppl_java_generated_tests.java
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) ppl_java_generated_tests
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) C_Polyhedron_test1
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) NNC_Polyhedron_test1
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) MIP_Problem_test1
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) PIP_Problem_test1
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) Parma_Polyhedra_Library_test1
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) Parma_Polyhedra_Library_test2
+ at ENABLE_SHARED_TRUE@ $(java_test_environment) Variable_Output_test1
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/tests/NNC_Polyhedron_test1.java b/interfaces/Java/tests/NNC_Polyhedron_test1.java
new file mode 100644
index 0000000..d55220e
--- /dev/null
+++ b/interfaces/Java/tests/NNC_Polyhedron_test1.java
@@ -0,0 +1,123 @@
+/* Test NNC_Polyhedron Java test class of the Parma Polyhedra Library Java
+ interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class NNC_Polyhedron_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ public static boolean test01() {
+ Variable X = new Variable(0);
+ Variable Y = new Variable(1);
+ Variable Z = new Variable(2);
+ NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ Linear_Expression le_X = new Linear_Expression_Variable(X);
+ Linear_Expression le_Y = new Linear_Expression_Variable(Y);
+ Linear_Expression le_Z = new Linear_Expression_Variable(Z);
+ Linear_Expression le_2Y = le_Y.times(new Coefficient(2));
+ Linear_Expression le_5Z = le_Z.times(new Coefficient(5));
+ Linear_Expression le_7
+ = new Linear_Expression_Coefficient(new Coefficient(7));
+ Linear_Expression le_5
+ = new Linear_Expression_Coefficient(new Coefficient(5));
+ Linear_Expression lhs1 = le_X.sum(le_2Y.sum(le_5Z));
+ NNC_Polyhedron ph1
+ = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ ph1.add_constraint(new Constraint(lhs1,
+ Relation_Symbol.GREATER_OR_EQUAL,
+ le_7));
+ ph1.add_constraint(new Constraint(le_X,
+ Relation_Symbol.LESS_THAN,
+ le_5Z));
+ PPL_Test.println_if_noisy(ph1.constraints().toString());
+ Constraint c = new Constraint(le_5Z,
+ Relation_Symbol.GREATER_THAN,
+ le_X);
+ Poly_Con_Relation rel = ph1.relation_with(c);
+ return rel.implies(Poly_Con_Relation.is_included());
+ }
+
+ public static boolean test02() {
+ // Test if `minimized_constraints' returns an empty Constraint_System
+ // if the Polyhedron is built from universe with a dimension greater
+ // than zero.
+ Variable X = new Variable(0);
+ Variable Y = new Variable(1);
+ Variable Z = new Variable(2);
+ NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ Constraint_System cs = ph.minimized_constraints();
+ return cs.isEmpty();
+ }
+
+ public static boolean test03() {
+ // Test termination methods.
+ Variable X1 = new Variable(0);
+ Variable X2 = new Variable(1);
+ Variable XP1 = new Variable(2);
+ Variable XP2 = new Variable(3);
+ NNC_Polyhedron ph = new NNC_Polyhedron(4, Degenerate_Element.UNIVERSE);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_0 = new Coefficient(0);
+ Linear_Expression le_X1 = new Linear_Expression_Variable(X1);
+ Linear_Expression le_X2 = new Linear_Expression_Variable(X2);
+ Linear_Expression le_XP1 = new Linear_Expression_Variable(XP1);
+ Linear_Expression le_XP2 = new Linear_Expression_Variable(XP2);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+ Linear_Expression le_X1_difference_XP1 = le_X1.sum(le_XP1);
+ Constraint c_XP2_eq_1
+ = new Constraint(le_XP2, Relation_Symbol.EQUAL, le_1);
+ Constraint c_X1_geq_1
+ = new Constraint(le_X1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_X1_minus_XP1_geq_1
+ = new Constraint(le_X1_difference_XP1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_X2_leq_0
+ = new Constraint(le_X2, Relation_Symbol.LESS_OR_EQUAL, le_0);
+ ph.add_constraint(c_XP2_eq_1);
+ ph.add_constraint(c_X1_geq_1);
+ ph.add_constraint(c_X1_minus_XP1_geq_1);
+ ph.add_constraint(c_X2_leq_0);
+ return Termination.termination_test_MS_NNC_Polyhedron(ph);
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(NNC_Polyhedron_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+
+}
diff --git a/interfaces/Java/tests/PIP_Problem_test1.java b/interfaces/Java/tests/PIP_Problem_test1.java
new file mode 100644
index 0000000..bde8178
--- /dev/null
+++ b/interfaces/Java/tests/PIP_Problem_test1.java
@@ -0,0 +1,480 @@
+/* Test PIP_Problem Java test class of the Parma Polyhedra Library Java
+ interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class PIP_Problem_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // This code tests the PIP_Problem methods.
+ public static boolean test01() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Variable C = new Variable(2);
+ Variable D = new Variable(3);
+ Variables_Set var_set_D = new Variables_Set();
+ var_set_D.add(D);
+ Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+ Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Linear_Expression_Variable le_d = new Linear_Expression_Variable(D);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_3 = new Coefficient(3);
+ Coefficient coeff_5 = new Coefficient(5);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+
+ // Constraint declarations.
+ Constraint c_a_geq_1
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_a_leq_5
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+ Constraint c_b_geq_3
+ = new Constraint(le_b, Relation_Symbol.GREATER_OR_EQUAL, le_3);
+ Constraint c_d_leq_1
+ = new Constraint(le_d, Relation_Symbol.LESS_OR_EQUAL, le_1);
+ Constraint constraint1 = c_a_geq_1;
+ Constraint constraint2 = c_b_geq_3;
+ Constraint_System constraints1 = new Constraint_System();
+ constraints1.add(constraint1);
+ C_Polyhedron ph1 = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+ ph1.add_constraints(constraints1);
+ C_Polyhedron ph2 = new C_Polyhedron(4, Degenerate_Element.UNIVERSE);
+ ph2.add_constraints(constraints1);
+ ph2.add_constraint(constraint2);
+
+ PIP_Problem pip1 = new PIP_Problem(3);
+ pip1.add_constraints(constraints1);
+ Constraint pip1_c1 = pip1.constraint_at_index(0);
+ long pip1_dim = pip1.space_dimension();
+
+ PIP_Problem pip2 = new PIP_Problem(pip1_dim);
+ pip2.add_constraints(constraints1);
+
+ boolean ok = (pip2.space_dimension() == 3);
+ if (!ok)
+ return false;
+
+ PIP_Problem pip3 = new PIP_Problem(3);
+ pip3.add_constraints(constraints1);
+ pip3.add_space_dimensions_and_embed(0, 1);
+ pip3.add_constraint(constraint2);
+ ok = ok && (pip3.space_dimension() == 4);
+
+ Constraint constraint4 = c_d_leq_1;
+ Constraint_System constraints4 = new Constraint_System();
+ constraints4.add(constraint1);
+ constraints4.add(constraint4);
+ PIP_Problem pip4 = new PIP_Problem(4, constraints4, var_set_D);
+ ok = ok
+ && (pip4.space_dimension() == 4)
+ && (pip4.number_of_parameter_space_dimensions() == 1);
+
+ return ok;
+ }
+
+ // This code tests more PIP_Problem methods.
+ public static boolean test02() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Coefficient coeff_0 = new Coefficient(0);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_5 = new Coefficient(5);
+ Coefficient coeff_8 = new Coefficient(8);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+ Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+ // Constraint declarations.
+ Constraint c_a_geq_1
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_a_leq_5
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+ Constraint c_a_eq_8
+ = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+ Constraint constraint1 = c_a_geq_1;
+ Constraint_System constraints1 = new Constraint_System();
+ constraints1.add(constraint1);
+
+ Variables_Set var_set_B = new Variables_Set();
+ var_set_B.add(B);
+
+ PIP_Problem pip1 = new PIP_Problem(2);
+ pip1.add_constraints(constraints1);
+ long pip1_dim = pip1.space_dimension();
+ pip1.add_to_parameter_space_dimensions(var_set_B);
+ Variables_Set var_set1 = pip1.parameter_space_dimensions();
+ boolean ok = (var_set1.contains(B));
+ if (!ok)
+ return false;
+ ok = pip1.is_satisfiable();
+ if (!ok)
+ return false;
+
+ PIP_Problem_Status pip1_status;
+ pip1_status = pip1.solve();
+ ok = ok && (pip1_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+
+ PIP_Problem_Status pip2_status;
+ pip1.add_constraint(c_a_leq_5);
+ pip2_status = pip1.solve();
+ ok = ok && (pip2_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+ if (!ok)
+ return false;
+
+ PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+ PPL_Test.println_if_noisy(IO.wrap_string(pip1.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+
+ PPL_Test.print_if_noisy("Testing max_space_dimension(): ");
+ long max_space_dim = pip1.max_space_dimension();
+ PPL_Test.println_if_noisy(max_space_dim);
+
+ PIP_Problem_Control_Parameter_Value cp_value1
+ = pip1.get_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+ pip1.set_pip_problem_control_parameter(
+ PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_FIRST);
+ PIP_Problem_Control_Parameter_Value cp_value2
+ = pip1.get_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+ ok = ok
+ && (cp_value2
+ == PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_FIRST);
+ if (!ok)
+ return false;
+
+ pip1.set_pip_problem_control_parameter(
+ PIP_Problem_Control_Parameter_Value.PIVOT_ROW_STRATEGY_MAX_COLUMN);
+ PIP_Problem_Control_Parameter_Value cp_value3
+ = pip1.get_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Name.PIVOT_ROW_STRATEGY);
+ ok = ok
+ && (cp_value3
+ == PIP_Problem_Control_Parameter_Value
+ .PIVOT_ROW_STRATEGY_MAX_COLUMN);
+
+ pip1.set_pip_problem_control_parameter(
+ PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_ALL);
+ PIP_Problem_Control_Parameter_Value cp_value4
+ = pip1.get_pip_problem_control_parameter
+ (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+ ok = ok
+ && (cp_value4
+ == PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_ALL);
+
+ return ok && pip1.OK();
+ }
+
+
+ // This code tests PIP_Tree and its methods.
+ public static boolean test03() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Variable C = new Variable(2);
+ Variable D = new Variable(3);
+ Variables_Set var_set_D = new Variables_Set();
+ var_set_D.add(D);
+ Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+ Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Linear_Expression_Variable le_d = new Linear_Expression_Variable(D);
+ Coefficient coeff_0 = new Coefficient(0);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_3 = new Coefficient(3);
+ Coefficient coeff_5 = new Coefficient(5);
+ Coefficient coeff_8 = new Coefficient(8);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+ Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+ // Constraint declarations.
+ Constraint c_a_geq_1
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ Constraint c_a_leq_5
+ = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+ Constraint c_a_eq_8
+ = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+ Constraint c_d_leq_1
+ = new Constraint(le_d, Relation_Symbol.LESS_OR_EQUAL, le_1);
+ Constraint constraint1 = c_a_geq_1;
+ Constraint_System constraints1 = new Constraint_System();
+ constraints1.add(constraint1);
+
+ Variables_Set var_set_B = new Variables_Set();
+ var_set_B.add(B);
+
+ PIP_Problem pip1 = new PIP_Problem(2);
+ pip1.add_constraints(constraints1);
+ long pip1_dim = pip1.space_dimension();
+ pip1.add_to_parameter_space_dimensions(var_set_B);
+ Variables_Set var_set1 = pip1.parameter_space_dimensions();
+ boolean ok = pip1.is_satisfiable();
+ if (!ok)
+ return false;
+ PIP_Tree_Node ptree1 = pip1.solution();
+ long num_of_arts1 = ptree1.number_of_artificials();
+ Artificial_Parameter_Sequence arts1 = ptree1.artificials();
+ ok = ptree1.OK() && num_of_arts1 == 0 && arts1.size() == 0;
+ if (!ok)
+ return false;
+ PIP_Solution_Node psol1 = ptree1.as_solution();
+ PIP_Decision_Node pdec1 = ptree1.as_decision();
+ if (psol1 == null || pdec1 != null)
+ return false;
+ Constraint_System ptree1_constraints = ptree1.constraints();
+ C_Polyhedron pip1_ph = new C_Polyhedron(pip1_dim,
+ Degenerate_Element.UNIVERSE);
+ C_Polyhedron ph1 = new C_Polyhedron(pip1_dim,
+ Degenerate_Element.UNIVERSE);
+ ph1.add_constraint(constraint1);
+ pip1_ph.add_constraints(ptree1_constraints);
+ ok = ok && !pip1_ph.equals(ph1);
+ if (!ok)
+ return false;
+
+ PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+ PPL_Test.println_if_noisy(IO.wrap_string(ptree1.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+
+ Constraint constraint2 = c_d_leq_1;
+ Constraint_System constraints2 = new Constraint_System();
+ constraints2.add(constraint1);
+ constraints2.add(constraint2);
+ PIP_Problem pip2 = new PIP_Problem(4, constraints2, var_set_D);
+ PIP_Tree_Node ptree2 = pip2.solution();
+ long num_of_arts2 = ptree2.number_of_artificials();
+ ok = (ptree2.OK() && (num_of_arts2 == 0));
+ if (!ok)
+ return false;
+ PIP_Solution_Node psol2 = ptree2.as_solution();
+ PIP_Decision_Node pdec2 = ptree2.as_decision();
+ Artificial_Parameter_Sequence arts2 = ptree2.artificials();
+ if (psol2 == null || pdec2 != null)
+ return false;
+ ok = arts2.isEmpty();
+ if (!ok)
+ return false;
+
+ PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+ PPL_Test.println_if_noisy(IO.wrap_string(ptree2.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+
+ return true;
+ }
+
+ // This code is based on test02 in pipproblem1.cc.
+ public static boolean test04() {
+ Variable I = new Variable(0);
+ Variable J = new Variable(1);
+ Variable N = new Variable(2);
+ Variable M = new Variable(3);
+ Variables_Set params = new Variables_Set();
+ params.add(N);
+ params.add(M);
+ Linear_Expression_Variable le_i = new Linear_Expression_Variable(I);
+ Linear_Expression_Variable le_j = new Linear_Expression_Variable(J);
+ Linear_Expression_Variable le_n = new Linear_Expression_Variable(N);
+ Linear_Expression_Variable le_m = new Linear_Expression_Variable(M);
+ Coefficient coeff_0 = new Coefficient(0);
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_2 = new Coefficient(2);
+ Coefficient coeff_3 = new Coefficient(3);
+ Coefficient coeff_4 = new Coefficient(4);
+ Coefficient coeff_7 = new Coefficient(7);
+ Coefficient coeff_8 = new Coefficient(8);
+ Coefficient coeff_10 = new Coefficient(10);
+ Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Linear_Expression le_2 = new Linear_Expression_Coefficient(coeff_2);
+ Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+ Linear_Expression le_4 = new Linear_Expression_Coefficient(coeff_4);
+ Linear_Expression le_7 = new Linear_Expression_Coefficient(coeff_7);
+ Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+ Linear_Expression le_10 = new Linear_Expression_Coefficient(coeff_10);
+ Linear_Expression le_2i = le_i.times(coeff_2);
+ Linear_Expression le_3j = le_j.times(coeff_3);
+ Linear_Expression le_2i_plus_3j = le_2i.sum(le_3j);
+ Linear_Expression le_4i = le_i.times(coeff_4);
+ Linear_Expression le_4i_diff_j = le_4i.subtract(le_j);
+ Linear_Expression le_m_diff_j = le_m.subtract(le_j);
+ Linear_Expression le_n_diff_i = le_n.subtract(le_i);
+
+ // Constraint declarations.
+ Constraint c_1
+ = new Constraint(le_2i_plus_3j, Relation_Symbol.GREATER_OR_EQUAL,
+ le_8);
+ Constraint c_2
+ = new Constraint(le_4i_diff_j, Relation_Symbol.GREATER_OR_EQUAL,
+ le_4);
+ Constraint c_3
+ = new Constraint(le_m_diff_j, Relation_Symbol.GREATER_OR_EQUAL,
+ le_0);
+ Constraint c_4
+ = new Constraint(le_n_diff_i, Relation_Symbol.GREATER_OR_EQUAL,
+ le_0);
+ Constraint_System cs = new Constraint_System();
+ cs.add(c_1);
+ cs.add(c_2);
+ cs.add(c_3);
+ cs.add(c_4);
+
+ PIP_Problem pip = new PIP_Problem(4, cs, params);
+
+ // Known to overflow if PPL uses 8-bits checked integers.
+ try {
+ pip.solve();
+ }
+ catch (Overflow_Error_Exception ex) {
+ if (Coefficient.bits() != 8)
+ throw ex;
+ PPL_Test.println_if_noisy("Expected overflow exception caught:");
+ PPL_Test.println_if_noisy(ex.getMessage());
+ return true;
+ }
+
+ PIP_Problem_Status pip_status = pip.solve();
+ boolean ok = (pip_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+ if (!ok)
+ return false;
+ PIP_Tree_Node solution = pip.solution();
+ ok = solution.OK();
+ if (!ok)
+ return false;
+
+ PPL_Test.println_if_noisy();
+ PPL_Test.println_if_noisy("Testing toString():");
+ PPL_Test.println_if_noisy(solution.toString());
+ PPL_Test.println_if_noisy();
+
+ PIP_Decision_Node root = solution.as_decision();
+ if (root == null || !root.OK())
+ return false;
+ if (root.number_of_artificials() != 0)
+ return false;
+ Constraint_System cs1 = root.constraints();
+ if (cs1.size() != 1)
+ return false;
+ Constraint c = cs.get(0);
+ Linear_Expression le_left = c.left_hand_side();
+ Linear_Expression le_right = c.right_hand_side();
+ Relation_Symbol relsym = c.kind();
+ if (relsym != Relation_Symbol.GREATER_OR_EQUAL
+ || (le_left.is_zero()) || (le_right.is_zero()))
+ return false;
+ PIP_Tree_Node root_true_branch = root.child_node(true);
+ if (root_true_branch == null)
+ return false;
+
+ PPL_Test.println_if_noisy("PIP Tree root node Constraint: ");
+ PPL_Test.println_if_noisy(IO.wrap_string(c.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+
+ PIP_Decision_Node t_child = root_true_branch.as_decision();
+ if (t_child == null || !t_child.OK())
+ return false;
+
+ // Check t_child node context.
+ if (t_child.number_of_artificials() != 0)
+ return false;
+ Constraint_System cs2 = t_child.constraints();
+ if (cs2.size() != 1)
+ return false;
+ Constraint c2 = cs2.get(0);
+ Linear_Expression le_left2 = c2.left_hand_side();
+ Linear_Expression le_right2 = c2.right_hand_side();
+ Relation_Symbol relsym2 = c2.kind();
+ if (relsym2 != Relation_Symbol.GREATER_OR_EQUAL
+ || (le_left2.is_zero()) || (le_right2.is_zero()))
+ return false;
+
+ if (t_child.child_node(true) == null)
+ return false;
+ PIP_Solution_Node t_t_child = t_child.child_node(true).as_solution();
+ if (t_t_child == null || !t_t_child.OK())
+ return false;
+
+ // Check t_t_child node.
+ if (t_t_child.number_of_artificials() != 0)
+ return false;
+ Constraint_System cs3 = t_t_child.constraints();
+ if (cs3.size() != 0)
+ return false;
+ Linear_Expression v_i = t_t_child.parametric_values(I);
+ Linear_Expression v_j = t_t_child.parametric_values(J);
+
+ PIP_Solution_Node t_f_child = t_child.child_node(false).as_solution();
+ if (t_f_child == null || !t_f_child.OK())
+ return false;
+
+ // Check t_f_child node.
+ // Check artificial parameter.
+ if (t_f_child.number_of_artificials() != 1)
+ return false;
+ Artificial_Parameter ap = t_f_child.artificials().get(0);
+ Linear_Expression ap_le = ap.linear_expression();
+ Coefficient ap_den = ap.denominator();
+
+ PPL_Test.println_if_noisy("Artificial_Parameter linear_expression: ");
+ PPL_Test.println_if_noisy(IO.wrap_string(ap_le.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+ PPL_Test.println_if_noisy("Artificial_Parameter denominator: ");
+ PPL_Test.println_if_noisy(IO.wrap_string(ap_den.toString(), 4, 64, 60));
+ PPL_Test.println_if_noisy();
+ // Check context.
+ Constraint_System cs4 = t_f_child.constraints();
+ if (cs4.size() != 1)
+ return false;
+ Constraint c4 = cs4.get(0);
+ if (c4.kind() != Relation_Symbol.GREATER_OR_EQUAL)
+ return false;
+ // Check parametric values.
+ Linear_Expression v_i4 = t_f_child.parametric_values(I);
+ Linear_Expression v_j4 = t_f_child.parametric_values(J);
+
+ return true;
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(PIP_Problem_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/interfaces/Java/tests/PPL_Test.java b/interfaces/Java/tests/PPL_Test.java
new file mode 100644
index 0000000..370ed97
--- /dev/null
+++ b/interfaces/Java/tests/PPL_Test.java
@@ -0,0 +1,90 @@
+/* Test helper class of the Parma Polyhedra Library Java interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+public class PPL_Test {
+
+ static boolean NOISY = false;
+ static boolean VERY_NOISY = false;
+
+ // Common initialization.
+ public static void initialize() {
+ String noisy_value = System.getenv("PPL_NOISY_TESTS");
+ String vnoisy_value = System.getenv("PPL_VERY_NOISY_TESTS");
+ if (vnoisy_value != null) {
+ VERY_NOISY = true;
+ NOISY = true;
+ }
+ if (noisy_value != null)
+ NOISY = true;
+ }
+
+ public static void print_if_noisy(String str) {
+ if (NOISY)
+ System.out.print(str);
+ }
+
+ public static void println_if_noisy(String str) {
+ if (NOISY)
+ System.out.println(str);
+ }
+
+ public static void print_if_noisy(long l) {
+ if (NOISY)
+ System.out.print(l);
+ }
+
+ public static void println_if_noisy(long l) {
+ if (NOISY)
+ System.out.println(l);
+ }
+
+ public static void println_if_noisy() {
+ if (NOISY)
+ System.out.println();
+ }
+
+ public static void print_if_vnoisy(String str) {
+ if (VERY_NOISY)
+ System.out.print(str);
+ }
+
+ public static void println_if_vnoisy(String str) {
+ if (VERY_NOISY)
+ System.out.println(str);
+ }
+
+ public static void print_if_vnoisy(long l) {
+ if (VERY_NOISY)
+ System.out.print(l);
+ }
+
+ public static void println_if_vnoisy(long l) {
+ if (VERY_NOISY)
+ System.out.println(l);
+ }
+
+ public static void println_if_vnoisy() {
+ if (VERY_NOISY)
+ System.out.println();
+ }
+}
diff --git a/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java b/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
new file mode 100644
index 0000000..a66f757
--- /dev/null
+++ b/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
@@ -0,0 +1,72 @@
+/* Parma_Polyhedra_Library Java test class of the
+ Parma Polyhedra Library Java interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Parma_Polyhedra_Library_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // This code tests the Parma_Polyhedra_Library methods.
+ public static boolean test01() {
+
+ PPL_Test.print_if_noisy("Version Major: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_major());
+ PPL_Test.print_if_noisy("Version Minor: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_minor());
+ PPL_Test.print_if_noisy("Version Revision: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_revision());
+ PPL_Test.print_if_noisy("Version Beta: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_beta());
+ PPL_Test.print_if_noisy("Version: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version());
+ PPL_Test.print_if_vnoisy("Banner: ");
+ PPL_Test.println_if_vnoisy(Parma_Polyhedra_Library.banner());
+ Parma_Polyhedra_Library.set_rounding_for_PPL();
+ Parma_Polyhedra_Library.restore_pre_PPL_rounding();
+ PPL_Test.print_if_noisy("Irrational precision: ");
+ PPL_Test.println_if_noisy(Parma_Polyhedra_Library.irrational_precision());
+
+ return true;
+ }
+
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(Parma_Polyhedra_Library_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java b/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java
new file mode 100644
index 0000000..0f2af4e
--- /dev/null
+++ b/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java
@@ -0,0 +1,142 @@
+/* Parma_Polyhedra_Library Java test class of the
+ Parma Polyhedra Library Java interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Parma_Polyhedra_Library_test2 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // This code tests the timeout functions.
+ public static boolean test01() {
+ int csecs = 50;
+ int max_dimension = 20;
+ return timed_compute_open_hypercube_generators(csecs, max_dimension);
+ }
+
+ // This code tests the deterministic timeout functions.
+ public static boolean test02() {
+ int weight = 2000;
+ int max_dimension = 20;
+ return weighted_compute_open_hypercube_generators(weight,
+ max_dimension);
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(Parma_Polyhedra_Library_test2.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+
+ private static void open_hypercube(int dimension, Polyhedron ph) {
+ Linear_Expression le_zero
+ = new Linear_Expression_Coefficient(new Coefficient("0"));
+ Linear_Expression le_one
+ = new Linear_Expression_Coefficient(new Coefficient("1"));
+
+ Constraint_System cs = new Constraint_System();
+ Linear_Expression le;
+ Constraint c;
+ for (int i = 0; i < dimension; ++i) {
+ // Variable(i) > 0.
+ le = new Linear_Expression_Variable(new Variable(i));
+ c = new Constraint(le, Relation_Symbol.GREATER_THAN, le_zero);
+ cs.add(c);
+ // Variable(i) < 1.
+ c = new Constraint(le, Relation_Symbol.LESS_THAN, le_one);
+ cs.add(c);
+ }
+ ph.add_constraints(cs);
+ }
+
+ private static boolean
+ timed_compute_open_hypercube_generators(int csecs,
+ int max_dimension) {
+ for (int i = 0; i <= max_dimension; ++i) {
+ Polyhedron ph = new NNC_Polyhedron(i, Degenerate_Element.UNIVERSE);
+ open_hypercube(i, ph);
+ PPL_Test.println_if_noisy("Hypercube of dimension " + i);
+ try {
+ Parma_Polyhedra_Library.set_timeout(csecs);
+ try {
+ ph.generators();
+ } finally {
+ Parma_Polyhedra_Library.reset_timeout();
+ }
+ } catch (Timeout_Exception e) {
+ PPL_Test.println_if_noisy("Expected timeout exception caught:");
+ PPL_Test.println_if_noisy(e.getMessage());
+ return true;
+ } catch (Exception e) {
+ PPL_Test.println_if_noisy("Unexpected exception caught:");
+ PPL_Test.println_if_noisy(e.getMessage());
+ return false;
+ }
+ }
+ // Should not reach this point.
+ PPL_Test.println_if_noisy("Expected timeout exception NOT caught!");
+ return false;
+ }
+
+ private static boolean
+ weighted_compute_open_hypercube_generators(int weight,
+ int max_dimension) {
+ for (int i = 0; i <= max_dimension; ++i) {
+ Polyhedron ph = new NNC_Polyhedron(i, Degenerate_Element.UNIVERSE);
+ open_hypercube(i, ph);
+ PPL_Test.println_if_noisy("Hypercube of dimension " + i);
+ try {
+ Parma_Polyhedra_Library.set_deterministic_timeout(weight, 0);
+ try {
+ ph.generators();
+ } finally {
+ Parma_Polyhedra_Library.reset_deterministic_timeout();
+ }
+ } catch (Timeout_Exception e) {
+ PPL_Test.println_if_noisy("Expected timeout exception caught:");
+ PPL_Test.println_if_noisy(e.getMessage());
+ return true;
+ } catch (Exception e) {
+ PPL_Test.println_if_noisy("Unexpected exception caught:");
+ PPL_Test.println_if_noisy(e.getMessage());
+ return false;
+ }
+ }
+ // Should not reach this point.
+ PPL_Test.println_if_noisy("Expected timeout exception NOT caught!");
+ return false;
+ }
+}
diff --git a/interfaces/Java/tests/Test_Executor.java b/interfaces/Java/tests/Test_Executor.java
new file mode 100644
index 0000000..fabb2ef
--- /dev/null
+++ b/interfaces/Java/tests/Test_Executor.java
@@ -0,0 +1,65 @@
+/* Test helper class of the Parma Polyhedra Library Java interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import java.lang.reflect.Method;
+
+public class Test_Executor {
+
+ /*! \brief
+ Executes all the static methods of class \p c whose name starts
+ with "test". It is expected that these methods have no parameters
+ and return a Boolean value.
+
+ \return
+ \c true if and only if all the tests defined in class \p c
+ return \c true.
+
+ \param c
+ The class whose test methods are execute.
+ */
+ public static boolean executeTests(Class c) {
+ PPL_Test.initialize();
+ boolean global_test_result_ok = true;
+ System.out.println("Checking " + c.getName());
+ Method methods[] = c.getDeclaredMethods();
+ Object[] no_args = new Object[0];
+ for (Method currentMethod:methods) {
+ try {
+ if (currentMethod.getName().startsWith("test")) {
+ System.out.println("Executing " + currentMethod.getName());
+ boolean ok = (Boolean) currentMethod.invoke(null, no_args);
+ if (!ok) {
+ global_test_result_ok = false;
+ System.out.println(currentMethod.getName() + " failed");
+ }
+ }
+ }
+ catch (Exception e) {
+ System.out.println("Unexpected exception caught:");
+ System.out.println(e.getMessage());
+ return false;
+ }
+ }
+ return global_test_result_ok;
+ }
+}
diff --git a/interfaces/Java/tests/Variable_Output_test1.java b/interfaces/Java/tests/Variable_Output_test1.java
new file mode 100644
index 0000000..ad26dd8
--- /dev/null
+++ b/interfaces/Java/tests/Variable_Output_test1.java
@@ -0,0 +1,94 @@
+/* Test customization of variable output in Java.
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Variable_Output_test1 {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ public static boolean test01() {
+ Variable A = new Variable(0);
+ Variable B = new Variable(1);
+ Variable C = new Variable(2);
+ Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+ Coefficient coeff_1 = new Coefficient(1);
+ Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+ Constraint con
+ = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+ C_Polyhedron ph = new C_Polyhedron(1, Degenerate_Element.UNIVERSE);
+ ph.add_constraint(con);
+ boolean ok = false;
+
+ // Printing with default output function.
+ ok = (A.toString().equals("A") &&
+ B.toString().equals("B") &&
+ C.toString().equals("C") &&
+ con.toString().equals("A >= 1") &&
+ ph.toString().equals("A >= 1"));
+ if (!ok)
+ return false;
+
+ // Changing output function to custom one.
+ Variable_Stringifier vs = new Custom_Variable_Stringifier();
+ Variable.setStringifier(vs);
+
+ ok = (A.toString().equals("Var_0") &&
+ B.toString().equals("Var_1") &&
+ C.toString().equals("Var_2") &&
+ con.toString().equals("Var_0 >= 1") &&
+ ph.toString().equals("Var_0 >= 1"));
+ if (!ok)
+ return false;
+
+ // Restoring default output function.
+ Variable.setStringifier(null);
+
+ ok = (A.toString().equals("A") &&
+ B.toString().equals("B") &&
+ C.toString().equals("C") &&
+ con.toString().equals("A >= 1") &&
+ ph.toString().equals("A >= 1"));
+ if (!ok)
+ return false;
+
+ return ok;
+ }
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ boolean test_result_ok =
+ Test_Executor.executeTests(Variable_Output_test1.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+}
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
new file mode 100644
index 0000000..b5fbcf2
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
@@ -0,0 +1,103 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_java_classes_test.java
+dnl using the code in ppl_interface_generator_java_test_code.m4.
+dnl
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+m4_include(`ppl_interface_generator_java_test_java_code.m4')
+
+dnl ==================================================================
+dnl Copyright and Domain independent code is added first
+dnl ==================================================================
+m4_divert
+/* Java code for checking all classes. -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright') */
+
+m4_include(`ppl_java_tests_common')
+
+ public static void main(String[] args) {
+ Parma_Polyhedra_Library.initialize_library();
+ ppl_java_generated_tests.initialize();
+ boolean test_result_ok =
+ Test_Executor.executeTests(ppl_java_generated_tests.class);
+ Parma_Polyhedra_Library.finalize_library();
+ if (!test_result_ok)
+ System.exit(1);
+ System.exit(0);
+ }
+
+dnl ==================================================================
+dnl Add the code for domain dependent tests.
+dnl ==================================================================
+ // Here generated tests are defined.
+m4_divert(2)`'dnl
+}
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Define a test statement for each domain, for m4_divert(1)
+dnl ==================================================================
+m4_pushdef(`m4_one_class_code', `')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl ==================================================================
+dnl Define code for all tests to check all methods, for m4_divert(2)
+dnl ==================================================================
+dnl Prefix extra code for each domain.
+m4_pushdef(`m4_pre_extra_class_code', `
+ public static boolean test_`'m4_interface_class$1`'() {
+ globally_ok = true;
+ try {
+
+')
+dnl Postfix extra code for each domain.
+m4_pushdef(`m4_post_extra_class_code', `dnl
+}
+catch (parma_polyhedra_library.Overflow_Error_Exception e) {
+ System.out.println("Overflow exception caught:");
+ System.out.println(e.getMessage());
+}
+System.gc();
+return globally_ok;
+
+ }
+
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(2)`'dnl
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
new file mode 100644
index 0000000..784f292
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
@@ -0,0 +1,955 @@
+dnl -*- java -*-
+m4_divert(-1)
+
+This m4 file contains the code for generating ppl_java_generated_tests.java
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+FIXME: This is the pattern used for finalize() which is protected.
+m4_define(`ppl_delete_ at CLASS@_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+{
+ PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS at _from_space_dimension: ");
+ @TOPOLOGY@@CLASS@ new_0_universe
+ = new @TOPOLOGY@@CLASS@(0, Degenerate_Element.UNIVERSE);
+ @TOPOLOGY@@CLASS@ new_6_universe
+ = new @TOPOLOGY@@CLASS@(6, Degenerate_Element.UNIVERSE);
+ @TOPOLOGY@@CLASS@ new_0_empty
+ = new @TOPOLOGY@@CLASS@(0, Degenerate_Element.EMPTY);
+ @TOPOLOGY@@CLASS@ new_6_empty
+ = new @TOPOLOGY@@CLASS@(6, Degenerate_Element.EMPTY);
+ report_success_or_failure(new_0_universe.OK() && new_6_universe.OK()
+ && new_0_empty.OK() && new_6_empty.OK());
+ new_0_universe.free();
+ new_6_universe.free();
+ new_0_empty.free();
+ new_6_empty.free();
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+{
+ PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @FRIEND@: ");
+ @FRIEND@ friend_gd = new @FRIEND@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ new_gd = new @TOPOLOGY@@CLASS@(friend_gd);
+ report_success_or_failure(new_gd.OK());
+ friend_gd.free();
+ new_gd.free();
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+ `dnl
+{
+ if (("@FRIEND@" != "@TOPOLOGY@@CLASS@")) {
+ PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @FRIEND@ with complexity: ");
+ @FRIEND@ friend_gd
+ = new @FRIEND@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ new_gd_pc
+ = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.POLYNOMIAL_COMPLEXITY);
+ @TOPOLOGY@@CLASS@ new_gd_sc
+ = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.SIMPLEX_COMPLEXITY);
+ @TOPOLOGY@@CLASS@ new_gd_ac
+ = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.ANY_COMPLEXITY);
+ report_success_or_failure(new_gd_ac.OK());
+ friend_gd.free();
+ new_gd_pc.free();
+ new_gd_sc.free();
+ new_gd_ac.free();
+ }
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @BUILD_REPRESENT at s: ");
+ @TOPOLOGY@@CLASS@ new_gd1 = new @TOPOLOGY@@CLASS@(@BUILD_REPRESENT at s1);
+ report_success_or_failure(new_gd1.OK());
+ new_gd1.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing swap: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ gd1.swap(gd2);
+ report_success_or_failure(gd1.OK() && gd2.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing bounds_from_ at ABOVEBELOW@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean bounds_from_ at ABOVEBELOW@
+ = gd.bounds_from_ at ABOVEBELOW@(le_A);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing hashcode: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ PPL_Test.print_if_noisy("The hashcode is: " + gd.hashCode());
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @HAS_PROPERTY@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ if (gd. at HAS_PROPERTY@())
+ PPL_Test.println_if_noisy("@HAS_PROPERTY@ is true for gd.");
+ else
+ PPL_Test.println_if_noisy("@HAS_PROPERTY@ is false for gd.");
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @DIMENSION@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ PPL_Test.print_if_noisy("@DIMENSION@ of gd = ");
+ PPL_Test.println_if_noisy(gd. at DIMENSION@());
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @BINOP@: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ gd1. at BINOP@(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing positive_time_elapse_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ gd1.positive_time_elapse_assign(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing simplify_using_context_assign: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean gd_simplify_using_context_assign
+ = gd.simplify_using_context_assign(gd);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing get_ at CLASS_REPRESENT@s: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @!CLASS_REPRESENT at _System gd_ at CLASS_REPRESENT@ = gd. at CLASS_REPRESENT@s();
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing get_minimized_ at CLASS_REPRESENT@s: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @!CLASS_REPRESENT at _System gr = gd.minimized_ at CLASS_REPRESENT@s();
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @COMPARISON@: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ boolean gd1_ at COMPARISON@ = gd2. at COMPARISON@(gd1);
+ report_success_or_failure(gd1.OK() && gd2.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _narrowing_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ gd1. at EXTRAPOLATION@_narrowing_assign(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing relation_with_ at RELATION_REPRESENT@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ Poly_@!A_RELATION_REPRESENT at _Relation
+ poly_relation = gd.relation_with(@RELATION_REPRESENT at 1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing add_@!CLASS_REPRESENT@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.add_ at CLASS_REPRESENT@(@CLASS_REPRESENT at 1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing refine_with_ at REFINE_REPRESENT@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.refine_with_ at REFINE_REPRESENT@(@REFINE_REPRESENT at 1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing add_ at CLASS_REPRESENT@s: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.add_ at CLASS_REPRESENT@s(@CLASS_REPRESENT at s1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing refine_with_ at REFINE_REPRESENT@s: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.refine_with_ at REFINE_REPRESENT@s(@REFINE_REPRESENT at s1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @UB_EXACT@: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean is_exact = gd1. at UB_EXACT@(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @AFFIMAGE@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd. at AFFIMAGE@(var_C, le_A, coeff_5);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.generalized_ at AFFIMAGE@(var_C, Relation_Symbol.EQUAL, le_A, coeff_5);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_lhs_rhs: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.generalized_ at AFFIMAGE@(le_A, Relation_Symbol.EQUAL, le_A);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_with_congruence: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.generalized_ at AFFIMAGE@_with_congruence(var_C, Relation_Symbol.EQUAL,
+ le_A, coeff_5, coeff_5);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_lhs_rhs_with_congruence: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(le_A,
+ Relation_Symbol.EQUAL,
+ le_A, coeff_5);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing equals: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean equals = gd.equals(gd);
+ if (!gd.equals(new Object()))
+ PPL_Test.println_if_noisy("A generic object is not equal to gd");
+ report_success_or_failure(equals && gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing OK: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean ok = gd.OK();
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing bounded_ at AFFIMAGE@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.bounded_ at AFFIMAGE@(var_C, le_A, le_A, coeff_5);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @SIMPLIFY@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd. at SIMPLIFY@();
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing unconstrain_space_dimension: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.unconstrain_space_dimension(var_C);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing unconstrain_space_dimensions: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.unconstrain_space_dimensions(var_set_A);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing constrains: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean constrains = gd.constrains(var_C);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing has_ at UPPERLOWER@_bound: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean has_ at UPPERLOWER@
+ = gd.has_ at UPPERLOWER@_bound(var_C, coeff_0, coeff_5, bool_by_ref1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @MAXMIN@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean @MAXMIN@
+ = gd. at MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @MAXMIN at _with_point: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean @MAXMIN at _with_point
+ = gd. at MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref2, generator1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing add_space_dimensions_ at EMBEDPROJECT@: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.add_space_dimensions_ at EMBEDPROJECT@(2);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing remove_higher_space_dimensions: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.remove_higher_space_dimensions(2);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing remove_space_dimensions: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.remove_space_dimensions(var_set_A);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing expand_space_dimension: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.expand_space_dimension(var_C, 1);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing fold_space_dimensions: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.fold_space_dimensions(var_set_A, var_C);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing map_space_dimensions: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd.map_space_dimensions(partial_function);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @WIDEN at _widening_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1. at WIDEN@_widening_assign(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing : ppl_ at CLASS@_ at WIDEN@_widening_assign");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1. at WIDEN@_widening_assign(gd2, int_by_ref1);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing widening_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1.widening_assign(gd2, int_by_ref1);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _extrapolation_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1. at EXTRAPOLATION@_extrapolation_assign(gd2, int_by_ref1);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _narrowing_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1. at EXTRAPOLATION@_narrowing_assign(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(gd2, @CONSTRAINER at s1,
+ zero_by_ref1);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1.BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(gd2, 2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ gd1.BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(gd2);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing toString(): ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ PPL_Test.println_if_noisy(gd.toString());
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+');
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @MEMBYTES@(): ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ PPL_Test.println_if_noisy("@MEMBYTES@ of gd: ");
+ PPL_Test.println_if_noisy(gd. at MEMBYTES@());
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing ascii_dump(): ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ PPL_Test.println_if_noisy(gd.ascii_dump());
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing linear_ at PARTITION@: ");
+ @TOPOLOGY@@CLASS@ gd1
+ = new @TOPOLOGY@@CLASS@(constraints1);
+ @TOPOLOGY@@CLASS@ gd2
+ = new @TOPOLOGY@@CLASS@(constraints1);
+ Pair p = @TOPOLOGY@@CLASS at .linear_partition(gd1, gd2);
+ report_success_or_failure(gd1.OK());
+ PPL_Test.print_if_noisy("Printing Pair from linear_partition: ");
+ PPL_Test.print_if_noisy((p.getFirst()).toString());
+ PPL_Test.print_if_noisy(", ");
+ PPL_Test.println_if_noisy((p.getSecond()).toString());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_partition_code',
+ `dnl
+ at SUPERPOWER_EXISTS@`'dnl
+{
+ PPL_Test.print_if_noisy("Testing @CLASS at _approximate_partition: ");
+ @CLASS@ gd1
+ = new @CLASS@(constraints1);
+ @CLASS@ gd2
+ = new @CLASS@(constraints1);
+ Pair p
+ = @CLASS at .approximate_partition(gd1, gd2, bool_by_ref1);
+ report_success_or_failure(gd1.OK());
+ PPL_Test.print_if_noisy("Printing Pair from approximate_partition: ");
+ PPL_Test.print_if_noisy((p.getFirst()).toString());
+ PPL_Test.print_if_noisy(", ");
+ PPL_Test.print_if_noisy((p.getSecond()).toString());
+ PPL_Test.print_if_noisy(", ");
+ PPL_Test.println_if_noisy(bool_by_ref1);
+ PPL_Test.println_if_noisy();
+ gd1.free();
+ gd2.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @BEGINEND at _iterator: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS at _Iterator it_gd = gd. at BEGINEND@_iterator();
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing @INCDEC at _iterator: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ if ("@INCDEC@" == "increment") {
+ @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+ it_gd. at A_INCDEC@();
+ }
+ else {
+ @TOPOLOGY@@CLASS at _Iterator it_gd = gd.end_iterator();
+ it_gd. at A_INCDEC@();
+ }
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing get_disjunct: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+ @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd.get_disjunct();
+ report_success_or_failure(gd.OK() && gd_disjunct.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing new_iterator_from_iterator: ");
+ @CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @CLASS at _Iterator it_gd = gd.begin_iterator();
+ @CLASS at _Iterator it_gd_copy = new @CLASS at _Iterator(it_gd);
+ @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd_copy.get_disjunct();
+ report_success_or_failure(gd.OK() && gd_disjunct.OK());
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing drop_disjunct: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+ gd.drop_disjunct(it_gd);
+ report_success_or_failure(gd.OK());
+ gd.free();
+}
+
+{
+ PPL_Test.print_if_noisy("Testing drop_disjuncts: ");
+ @CLASS@ gd1 = new @CLASS@(@CONSTRAINER at s1);
+ @CLASS@ gd2 = new @CLASS@(@CONSTRAINER at s2);
+ gd1.upper_bound_assign(gd2);
+ @CLASS at _Iterator it_gd1 = gd1.begin_iterator();
+ @CLASS at _Iterator it_gd1_end = gd1.end_iterator();
+ gd1.drop_disjuncts(it_gd1, it_gd1_end);
+ report_success_or_failure(gd1.OK());
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing add_disjunct: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @DISJUNCT_TOPOLOGY@@DISJUNCT@ gd_disjunct
+ = new @DISJUNCT_TOPOLOGY@@DISJUNCT@(@CONSTRAINER at s1);
+ gd.add_disjunct(gd_disjunct);
+ report_success_or_failure(gd.OK());
+ gd.free();
+ gd_disjunct.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing iterator_equals_iterator: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS at _Iterator it_gd1 = gd.begin_iterator();
+ @TOPOLOGY@@CLASS at _Iterator it_gd2 = gd.begin_iterator();
+ boolean equals = it_gd1.equals(it_gd2);
+ report_success_or_failure(gd.OK() && equals);
+ gd.free();
+}
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing free: ");
+ @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(gd);
+ gd1.free();
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(gd);
+ gd2 = null;
+ report_success_or_failure(true);
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _codexxx',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing termination_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ boolean term = Termination.termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(gd1);
+ report_success_or_failure(gd1.OK() && term);
+ gd1.free();
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_codexxx',
+ `dnl
+{
+ PPL_Test.print_if_noisy("Testing termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ");
+ @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+ @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+ boolean term = Termination.termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(gd1, gd2);
+ report_success_or_failure(gd1.OK() && gd2.OK() && term);
+ gd1.free();
+ gd2.free();
+}
+
+')
+
+m4_divert`'dnl
diff --git a/interfaces/Java/tests/ppl_java_tests_common b/interfaces/Java/tests/ppl_java_tests_common
new file mode 100644
index 0000000..5c1c32c
--- /dev/null
+++ b/interfaces/Java/tests/ppl_java_tests_common
@@ -0,0 +1,197 @@
+/* Common code for the PPL Java interface tests.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class ppl_java_generated_tests {
+ static {
+ try {
+ System.loadLibrary("ppl_java");
+ }
+ catch (UnsatisfiedLinkError e) {
+ System.out.println("Unable to load the library");
+ System.out.println(e.getMessage());
+ System.exit(-1);
+ }
+ }
+
+ // Success state.
+ static boolean globally_ok;
+
+ // Common stuff. We can add other objects if we need them later.
+ static Coefficient coeff_0;
+ static Coefficient coeff_5;
+ static Variable var_C;
+ static Variables_Set var_set_A;
+ static Linear_Expression le_A;
+
+ static Constraint constraint1;
+ static Constraint constraint2;
+ static Congruence congruence1;
+ static Generator generator1;
+ static Grid_Generator grid_generator1;
+
+ static Constraint_System constraints1;
+ static Constraint_System constraints2;
+ static Congruence_System congruences1;
+ static Congruence_System congruences2;
+ static Generator_System generators1;
+ static Grid_Generator_System grid_generators1;
+
+ static By_Reference<Boolean> bool_by_ref1;
+ static By_Reference<Boolean> bool_by_ref2;
+ static By_Reference<Integer> int_by_ref1;
+ static By_Reference<Integer> zero_by_ref1;
+
+ static Partial_Function partial_function;
+
+ // Common initialization.
+ public static void initialize() {
+
+ // Initialize output variables.
+ PPL_Test.initialize();
+
+ // Coefficient declaration.
+ coeff_0 = new Coefficient("0");
+ Coefficient coeff_1 = new Coefficient(1);
+ Coefficient coeff_2 = new Coefficient(2);
+ Coefficient coeff_4 = new Coefficient(4);
+ coeff_5 = new Coefficient("5");
+ Coefficient coeff_10 = new Coefficient("10");
+
+ // Variable declarations.
+ Variable A = new Variable(0);
+ Variable C = new Variable(2);
+ var_C = C;
+ var_set_A = new Variables_Set();
+ var_set_A.add(A);
+
+ // Linear_Expression declarations.
+ Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+ Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+ le_A = new Linear_Expression_Variable(A);
+ Linear_Expression le_2A = le_A.times(coeff_2);
+ Linear_Expression le_C = new Linear_Expression_Variable(C);
+ Linear_Expression le_2A_plus_C = le_2A.sum(le_C);
+ Linear_Expression le_40A_plus_10C = le_2A_plus_C.times(coeff_10);
+
+ PPL_Test.print_if_noisy("Printing a linear expression (2A + C): ");
+ PPL_Test.println_if_noisy(le_2A_plus_C.toString());
+
+ // Constraint declarations.
+ Constraint c_5_geq_0
+ = new Constraint(le_5, Relation_Symbol.GREATER_OR_EQUAL, le_0);
+ constraint1 = c_5_geq_0;
+ Constraint c_C_eq_5
+ = new Constraint(le_C, Relation_Symbol.EQUAL, le_5);
+ Constraint c_2A_eq_5
+ = new Constraint(le_2A, Relation_Symbol.EQUAL, le_5);
+ Constraint c_2A_plus_C_eq_2A
+ = new Constraint(le_2A_plus_C, Relation_Symbol.EQUAL, le_2A);
+ Constraint c_2A_plus_C_geq_5
+ = new Constraint(le_2A_plus_C,
+ Relation_Symbol.GREATER_OR_EQUAL,
+ le_5);
+ PPL_Test.print_if_noisy("Printing a constraint (2A + C >= 5): ");
+ PPL_Test.println_if_noisy(c_2A_plus_C_geq_5.toString());
+
+ Congruence cg_2A_eq_5 = new Congruence(le_2A, le_5, coeff_0);
+ Congruence cg_C_eq_5 = new Congruence(le_C, le_5, coeff_0);
+ Congruence cg_C_int = new Congruence(le_C, le_0, coeff_1);
+ congruence1 = cg_2A_eq_5;
+ PPL_Test.print_if_noisy("Printing a congruence (2A == 5): ");
+ PPL_Test.println_if_noisy(cg_2A_eq_5.toString());
+
+ // Constraint_System declarations.
+ constraints1 = new Constraint_System();
+ constraints1.add(c_5_geq_0);
+ constraints1.add(c_C_eq_5);
+ PPL_Test.print_if_noisy("Printing a constraint system (C == 5):");
+ PPL_Test.println_if_noisy(constraints1.toString());
+
+ constraints2 = new Constraint_System();
+ constraints2.add(c_2A_plus_C_eq_2A);
+ constraints2.add(c_2A_eq_5);
+
+ congruences1 = new Congruence_System();
+ congruences1.add(cg_2A_eq_5);
+ congruences1.add(cg_C_eq_5);
+ PPL_Test.print_if_noisy("Printing a congruence system: ");
+ PPL_Test.println_if_noisy(congruences1.toString());
+
+ congruences2 = new Congruence_System();
+ congruences2.add(cg_C_int);
+
+ // Generator declarations.
+ Generator g1 = Generator.point(le_40A_plus_10C, coeff_1);
+ generator1 = g1;
+ Generator g2 = Generator.point(le_40A_plus_10C, coeff_2);
+ Generator g4 = Generator.point(le_A, coeff_4);
+ PPL_Test.print_if_noisy("Printing a generator (p(40A + 10C)):");
+ PPL_Test.println_if_noisy(g1.toString());
+
+ // Generator_System declaration.
+ generators1 = new Generator_System();
+ generators1.add(g1);
+ generators1.add(g2);
+ generators1.add(g4);
+ PPL_Test.print_if_noisy("Printing a generator system: ");
+ PPL_Test.println_if_noisy(generators1.toString());
+
+ // Grid_Generator declarations.
+ Grid_Generator gg1
+ = Grid_Generator.grid_point(le_40A_plus_10C, coeff_1);
+ grid_generator1 = gg1;
+ Grid_Generator gg2
+ = Grid_Generator.grid_point(le_40A_plus_10C, coeff_2);
+ Grid_Generator gg4
+ = Grid_Generator.grid_point(le_A, coeff_4);
+
+ // Grid_Generator_System declaration.
+ grid_generators1 = new Grid_Generator_System();
+ grid_generators1.add(gg1);
+ grid_generators1.add(gg2);
+ grid_generators1.add(gg4);
+
+ bool_by_ref1 = new By_Reference<Boolean>(true);
+ bool_by_ref2 = new By_Reference<Boolean>(true);
+
+ int_by_ref1 = new By_Reference<Integer>(1);
+ zero_by_ref1 = new By_Reference<Integer>(0);
+
+ partial_function = new Partial_Function();
+ partial_function.insert(0, 2);
+ partial_function.insert(2, 0);
+ partial_function.insert(1, 1);
+ }
+
+ // Helper method.
+ static void report_success_or_failure(boolean locally_ok) {
+ if (locally_ok)
+ PPL_Test.println_if_noisy("Success");
+ else {
+ PPL_Test.println_if_noisy("Failure");
+ globally_ok = false;
+ }
+ }
+
diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am
new file mode 100644
index 0000000..c467f3d
--- /dev/null
+++ b/interfaces/Makefile.am
@@ -0,0 +1,65 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_C_INTERFACE
+C_SUBDIR = C
+endif BUILD_C_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+JAVA_SUBDIR = Java
+endif BUILD_JAVA_INTERFACE
+
+if BUILD_OCAML_INTERFACE
+OCAML_SUBDIR = OCaml
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_SOME_PROLOG_INTERFACES
+PROLOG_SUBDIR = Prolog
+endif BUILD_SOME_PROLOG_INTERFACES
+
+SUBDIRS = . $(C_SUBDIR) $(JAVA_SUBDIR) $(OCAML_SUBDIR) $(PROLOG_SUBDIR)
+
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+
+ppl_interface_instantiations.m4: Makefile
+ echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+ echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
+
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+CLEANFILES = \
+ppl_interface_instantiations.m4
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
new file mode 100644
index 0000000..ce098a5
--- /dev/null
+++ b/interfaces/Makefile.in
@@ -0,0 +1,761 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(noinst_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = . C Java OCaml Prolog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_C_INTERFACE_TRUE@C_SUBDIR = C
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_SUBDIR = Java
+ at BUILD_OCAML_INTERFACE_TRUE@OCAML_SUBDIR = OCaml
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_SUBDIR = Prolog
+SUBDIRS = . $(C_SUBDIR) $(JAVA_SUBDIR) $(OCAML_SUBDIR) $(PROLOG_SUBDIR)
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+CLEANFILES = \
+ppl_interface_instantiations.m4
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+
+ppl_interface_instantiations.m4: Makefile
+ echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+ echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/Makefile.am b/interfaces/OCaml/Makefile.am
new file mode 100644
index 0000000..b5e05ac
--- /dev/null
+++ b/interfaces/OCaml/Makefile.am
@@ -0,0 +1,292 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = . tests
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_hh_files.m4 \
+ppl_interface_generator_ocaml_cc_files.m4 \
+ppl_interface_generator_ocaml_hh_code.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.mli \
+ppl_ocaml_globals.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+OCaml_interface.dox \
+README.ocaml
+
+ocamldir = $(pkglibdir)
+
+if HAVE_OCAMLC
+
+PPL_OCAMLC_LIBRARY = ppl_ocaml.cma
+
+endif HAVE_OCAMLC
+
+if HAVE_OCAMLOPT
+
+PPL_OCAMLOPT_LIBRARY = ppl_ocaml.cmxa ppl_ocaml.a
+
+endif HAVE_OCAMLOPT
+
+ocaml_DATA = \
+ppl_ocaml.cmi \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+$(PPL_OCAMLC_LIBRARY) \
+$(PPL_OCAMLOPT_LIBRARY)
+
+BUILT_SOURCES = \
+ppl_ocaml_domains.hh \
+ppl_ocaml_domains_cc_files.stamp
+
+pkglib_LIBRARIES = libppl_ocaml.a
+
+libppl_ocaml_a_SOURCES = \
+ppl_ocaml_common_defs.hh \
+ppl_ocaml_common_inlines.hh \
+ppl_ocaml_common.cc
+
+nodist_EXTRA_libppl_ocaml_a_SOURCES = \
+ppl_ocaml_Int8_Box.cc \
+ppl_ocaml_Int16_Box.cc \
+ppl_ocaml_Int32_Box.cc \
+ppl_ocaml_Int64_Box.cc \
+ppl_ocaml_Uint8_Box.cc \
+ppl_ocaml_Uint16_Box.cc \
+ppl_ocaml_Uint32_Box.cc \
+ppl_ocaml_Uint64_Box.cc \
+ppl_ocaml_Float_Box.cc \
+ppl_ocaml_Double_Box.cc \
+ppl_ocaml_Long_Double_Box.cc \
+ppl_ocaml_Rational_Box.cc \
+ppl_ocaml_Z_Box.cc \
+ppl_ocaml_BD_Shape_int8_t.cc \
+ppl_ocaml_BD_Shape_int16_t.cc \
+ppl_ocaml_BD_Shape_int32_t.cc \
+ppl_ocaml_BD_Shape_int64_t.cc \
+ppl_ocaml_BD_Shape_float.cc \
+ppl_ocaml_BD_Shape_double.cc \
+ppl_ocaml_BD_Shape_long_double.cc \
+ppl_ocaml_BD_Shape_mpq_class.cc \
+ppl_ocaml_BD_Shape_mpz_class.cc \
+ppl_ocaml_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Octagonal_Shape_float.cc \
+ppl_ocaml_Octagonal_Shape_double.cc \
+ppl_ocaml_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Polyhedron.cc \
+ppl_ocaml_Grid.cc \
+ppl_ocaml_Pointset_Powerset_Int8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Float_Box.cc \
+ppl_ocaml_Pointset_Powerset_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Long_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Rational_Box.cc \
+ppl_ocaml_Pointset_Powerset_Z_Box.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_C_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_Grid.cc \
+ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_ocaml_a_LIBADD = \
+ at required_instantiations_ocaml_cxx_objects@
+
+libppl_ocaml_a_DEPENDENCIES = \
+ at required_instantiations_ocaml_cxx_objects@
+
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+
+AM_CPPFLAGS = \
+-I$(OCAMLLIB) \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright
+
+ppl_ocaml.cma: ppl_ocaml_globals.cmo ppl_ocaml.cmo libppl_ocaml.a
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -a -custom \
+ ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+ $(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+ $(OCAMLC_LINK_FLAGS)
+
+ppl_ocaml.cmxa: \
+ ppl_ocaml_globals.cmx ppl_ocaml_globals.o \
+ ppl_ocaml.cmx ppl_ocaml.o libppl_ocaml.a
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -a \
+ ppl_ocaml_globals.cmx ppl_ocaml.cmx \
+ $(OCAMLOPT_COMPILE_FLAGS) -cclib -lppl_ocaml \
+ $(OCAMLOPT_LINK_FLAGS)
+
+ppl_ocaml.a: ppl_ocaml.cmxa
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml.cmxa; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmxa; \
+ fi
+
+ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ppl_ocaml.cmx: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+ ppl_ocaml.ml
+
+ppl_ocaml.o: ppl_ocaml.cmx
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml.cmx; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmx; \
+ fi
+
+ppl_ocaml.cmi: ppl_ocaml.mli
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.mli
+
+ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.cmx: \
+ ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.o: ppl_ocaml_globals.cmx
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml_globals.cmx; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmx; \
+ fi
+
+ppl_ocaml_globals.cmi: ppl_ocaml_globals.mli
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.mli
+
+ppl_ocaml.ml: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ppl_ocaml.mli: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+
+ppl_ocaml_domains_cc_files.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_cc_files.m4 \
+ > ppl_ocaml_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_cc_blob
+ rm -f ppl_ocaml_cc_blob
+ echo timestamp >$@
+
+ppl_ocaml_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_hh_files.m4 \
+ > ppl_ocaml_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_hh_blob
+ rm -f ppl_ocaml_hh_blob
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_ocaml_cxx_objects@ \
+ppl_ocaml.cma \
+ppl_ocaml.cmxa \
+ppl_ocaml.a \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.cmx \
+ppl_ocaml.o \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_globals.cmx \
+ppl_ocaml_globals.o
+
+CLEANFILES = \
+ at required_instantiations_ocaml_cxx_sources@ \
+ at required_instantiations_ocaml_cxx_headers@ \
+ppl_ocaml_domains.hh \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_domains_cc_files.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_ocaml_domains_cc_files.stamp' target.
+$(nodist_EXTRA_libppl_ocaml_a_SOURCES):
diff --git a/interfaces/OCaml/Makefile.in b/interfaces/OCaml/Makefile.in
new file mode 100644
index 0000000..b16e392
--- /dev/null
+++ b/interfaces/OCaml/Makefile.in
@@ -0,0 +1,1239 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/OCaml
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(ocamldir)"
+LIBRARIES = $(pkglib_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libppl_ocaml_a_AR = $(AR) $(ARFLAGS)
+am_libppl_ocaml_a_OBJECTS = ppl_ocaml_common.$(OBJEXT)
+libppl_ocaml_a_OBJECTS = $(am_libppl_ocaml_a_OBJECTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_ocaml_a_SOURCES) \
+ $(nodist_EXTRA_libppl_ocaml_a_SOURCES)
+DIST_SOURCES = $(libppl_ocaml_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(ocaml_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = . tests
+interface_generator_files = \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_hh_files.m4 \
+ppl_interface_generator_ocaml_cc_files.m4 \
+ppl_interface_generator_ocaml_hh_code.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.mli \
+ppl_ocaml_globals.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+OCaml_interface.dox \
+README.ocaml
+
+ocamldir = $(pkglibdir)
+ at HAVE_OCAMLC_TRUE@PPL_OCAMLC_LIBRARY = ppl_ocaml.cma
+ at HAVE_OCAMLOPT_TRUE@PPL_OCAMLOPT_LIBRARY = ppl_ocaml.cmxa ppl_ocaml.a
+ocaml_DATA = \
+ppl_ocaml.cmi \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+$(PPL_OCAMLC_LIBRARY) \
+$(PPL_OCAMLOPT_LIBRARY)
+
+BUILT_SOURCES = \
+ppl_ocaml_domains.hh \
+ppl_ocaml_domains_cc_files.stamp
+
+pkglib_LIBRARIES = libppl_ocaml.a
+libppl_ocaml_a_SOURCES = \
+ppl_ocaml_common_defs.hh \
+ppl_ocaml_common_inlines.hh \
+ppl_ocaml_common.cc
+
+nodist_EXTRA_libppl_ocaml_a_SOURCES = \
+ppl_ocaml_Int8_Box.cc \
+ppl_ocaml_Int16_Box.cc \
+ppl_ocaml_Int32_Box.cc \
+ppl_ocaml_Int64_Box.cc \
+ppl_ocaml_Uint8_Box.cc \
+ppl_ocaml_Uint16_Box.cc \
+ppl_ocaml_Uint32_Box.cc \
+ppl_ocaml_Uint64_Box.cc \
+ppl_ocaml_Float_Box.cc \
+ppl_ocaml_Double_Box.cc \
+ppl_ocaml_Long_Double_Box.cc \
+ppl_ocaml_Rational_Box.cc \
+ppl_ocaml_Z_Box.cc \
+ppl_ocaml_BD_Shape_int8_t.cc \
+ppl_ocaml_BD_Shape_int16_t.cc \
+ppl_ocaml_BD_Shape_int32_t.cc \
+ppl_ocaml_BD_Shape_int64_t.cc \
+ppl_ocaml_BD_Shape_float.cc \
+ppl_ocaml_BD_Shape_double.cc \
+ppl_ocaml_BD_Shape_long_double.cc \
+ppl_ocaml_BD_Shape_mpq_class.cc \
+ppl_ocaml_BD_Shape_mpz_class.cc \
+ppl_ocaml_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Octagonal_Shape_float.cc \
+ppl_ocaml_Octagonal_Shape_double.cc \
+ppl_ocaml_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Polyhedron.cc \
+ppl_ocaml_Grid.cc \
+ppl_ocaml_Pointset_Powerset_Int8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Float_Box.cc \
+ppl_ocaml_Pointset_Powerset_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Long_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Rational_Box.cc \
+ppl_ocaml_Pointset_Powerset_Z_Box.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_C_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_Grid.cc \
+ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_ocaml_a_LIBADD = \
+ at required_instantiations_ocaml_cxx_objects@
+
+libppl_ocaml_a_DEPENDENCIES = \
+ at required_instantiations_ocaml_cxx_objects@
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+AM_CPPFLAGS = \
+-I$(OCAMLLIB) \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_ocaml_cxx_objects@ \
+ppl_ocaml.cma \
+ppl_ocaml.cmxa \
+ppl_ocaml.a \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.cmx \
+ppl_ocaml.o \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_globals.cmx \
+ppl_ocaml_globals.o
+
+CLEANFILES = \
+ at required_instantiations_ocaml_cxx_sources@ \
+ at required_instantiations_ocaml_cxx_headers@ \
+ppl_ocaml_domains.hh \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_domains_cc_files.stamp
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/OCaml/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-pkglibLIBRARIES: $(pkglib_LIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(pkglibdir)" || exit $$?; }
+ @$(POST_INSTALL)
+ @list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ if test -f $$p; then \
+ $(am__strip_dir) \
+ echo " ( cd '$(DESTDIR)$(pkglibdir)' && $(RANLIB) $$f )"; \
+ ( cd "$(DESTDIR)$(pkglibdir)" && $(RANLIB) $$f ) || exit $$?; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkglibdir)'; $(am__uninstall_files_from_dir)
+
+clean-pkglibLIBRARIES:
+ -test -z "$(pkglib_LIBRARIES)" || rm -f $(pkglib_LIBRARIES)
+
+libppl_ocaml.a: $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_DEPENDENCIES) $(EXTRA_libppl_ocaml_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libppl_ocaml.a
+ $(AM_V_AR)$(libppl_ocaml_a_AR) libppl_ocaml.a $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libppl_ocaml.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Float_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Long_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_C_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Float_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Long_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Rational_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Z_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Rational_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Z_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_common.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-ocamlDATA: $(ocaml_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(ocaml_DATA)'; test -n "$(ocamldir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(ocamldir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(ocamldir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ocamldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(ocamldir)" || exit $$?; \
+ done
+
+uninstall-ocamlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(ocaml_DATA)'; test -n "$(ocamldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(ocamldir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LIBRARIES) $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(ocamldir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-pkglibLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-ocamlDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-ocamlDATA uninstall-pkglibLIBRARIES
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool \
+ clean-pkglibLIBRARIES cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-ocamlDATA install-pdf install-pdf-am \
+ install-pkglibLIBRARIES install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-ocamlDATA uninstall-pkglibLIBRARIES
+
+
+ppl_ocaml.cma: ppl_ocaml_globals.cmo ppl_ocaml.cmo libppl_ocaml.a
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -a -custom \
+ ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+ $(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+ $(OCAMLC_LINK_FLAGS)
+
+ppl_ocaml.cmxa: \
+ ppl_ocaml_globals.cmx ppl_ocaml_globals.o \
+ ppl_ocaml.cmx ppl_ocaml.o libppl_ocaml.a
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -a \
+ ppl_ocaml_globals.cmx ppl_ocaml.cmx \
+ $(OCAMLOPT_COMPILE_FLAGS) -cclib -lppl_ocaml \
+ $(OCAMLOPT_LINK_FLAGS)
+
+ppl_ocaml.a: ppl_ocaml.cmxa
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml.cmxa; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmxa; \
+ fi
+
+ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ppl_ocaml.cmx: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+ ppl_ocaml.ml
+
+ppl_ocaml.o: ppl_ocaml.cmx
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml.cmx; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmx; \
+ fi
+
+ppl_ocaml.cmi: ppl_ocaml.mli
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.mli
+
+ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.cmx: \
+ ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.o: ppl_ocaml_globals.cmx
+ @if test -f $@; then :; else \
+ rm -f ppl_ocaml_globals.cmx; \
+ $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmx; \
+ fi
+
+ppl_ocaml_globals.cmi: ppl_ocaml_globals.mli
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+ $(srcdir)/ppl_ocaml_globals.mli
+
+ppl_ocaml.ml: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ppl_ocaml.mli: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+
+ppl_ocaml_domains_cc_files.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_cc_files.m4 \
+ > ppl_ocaml_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_cc_blob
+ rm -f ppl_ocaml_cc_blob
+ echo timestamp >$@
+
+ppl_ocaml_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_ocaml_hh_files.m4 \
+ > ppl_ocaml_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_hh_blob
+ rm -f ppl_ocaml_hh_blob
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_ocaml_domains_cc_files.stamp' target.
+$(nodist_EXTRA_libppl_ocaml_a_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/OCaml_interface.dox b/interfaces/OCaml/OCaml_interface.dox
new file mode 100644
index 0000000..56ceff4
--- /dev/null
+++ b/interfaces/OCaml/OCaml_interface.dox
@@ -0,0 +1,1269 @@
+/* Documentation for the OCaml interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+ \defgroup PPL_OCaml_interface OCaml Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface for the
+ OCaml language.
+*/
+
+/*! \mainpage OCaml Language Interface
+
+The Parma Polyhedra Library comes equipped with an interface for the
+OCaml language.
+
+The main features of the library are described in
+Section \ref OCaml_Features "OCaml Interface Features".
+Section \ref OCamldoc_Documentation "OCamldoc Documentation"
+lists all the functions available to the default generated domains
+in the OCaml interface.
+Section \ref OI_Compilation "Compilation and Installation"
+explains how the OCaml interface is compiled and installed.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor OCaml_Features
+<H1>OCaml Interface Features</H1>
+
+The OCaml interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
+Here we just describe those aspects that are specific to the OCaml interface.
+
+\anchor OCaml_Interface_Overview
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the OCaml interface.
+
+- The numerical abstract domains available to the OCaml user consist
+ of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+ <EM>products</EM> of simple domains.
+ - The simple domains are:
+ - convex polyhedra, which consist of C_Polyhedron and
+ NNC_Polyhedron;<BR>
+ - weakly relational, which consist of BD_Shape_N and
+ Octagonal_Shape_N
+ where N is one of the numeric types
+ short, signed_char, int, long, long_long,
+ mpz_class, mpq_class;<BR>
+ - boxes which consist of
+ Int8_Box, Int16_Box,
+ Int32_Box, Int64_Box,
+ Uint8_Box, Uint16_Box,
+ Uint32_Box, Uint64_Box,
+ Double_Box, Long_Double_Box,
+ Z_Box, Rational_Box, Float_Box; and<BR>
+ - the Grid domain.
+ - The powerset domains are Pointset_Powerset_S where S is
+ a simple domain.
+ - The product domains consist of
+ Direct_Product_S_T,
+ Smash_Product_S_T and
+ Constraints_Product_S_T where S
+ and T are simple domains.
+- In the following, any of the above numerical
+ abstract domains is called a PPL <EM>domain</EM>
+ and any element of a PPL domain is called a <EM>PPL object</EM>.
+- The OCaml interface files are all installed in the directory
+ <CODE>prefix/lib/ppl</CODE>. Since this includes shared and
+ dynamically loaded libraries, you must make your dynamic
+ linker/loader aware of this fact. If you use a GNU/Linux system,
+ try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+ for more information.
+- A PPL object such as a polyhedron can only be accessed
+ by means of a OCaml term called a <EM>handle</EM>.
+ Note, however, that the data structure of a handle,
+ is implementation-dependent, system-dependent and
+ version-dependent, and, for this reason, deliberately left unspecified.
+ What we do guarantee is that the handle requires very little memory.
+- An OCaml program can obtain a valid handle for a
+ PPL object by using functions such as
+\code
+ ppl_new_C_Polyhedron_from_space_dimension,
+ ppl_new_C_Polyhedron_from_C_Polyhedron,
+ ppl_new_C_Polyhedron_from_constraints,
+ ppl_new_C_Polyhedron_from_generators.
+\endcode
+ These functions will return a new handle for referencing a PPL polyhedron.
+- For a PPL object with space dimension \p k,
+ the identifiers used for the PPL variables
+ must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+ associated Cartesian axes.
+ For example, when using the functions that combine PPL polyhedra
+ or add constraints or generators to a representation of
+ a PPL polyhedron,
+ the polyhedra referenced and any constraints or generators in the call
+ should follow all the (space) dimension-compatibility rules stated in
+ Section \extref{representation, Representations of Convex Polyhedra}
+ of the main PPL user manual.
+- As explained above, a polyhedron has a fixed topology C or NNC,
+ that is determined at the time of its initialization.
+ All subsequent operations on the polyhedron must respect all the
+ topological compatibility rules stated in Section
+ \extref{representation, Representations of Convex Polyhedra}
+ of the main PPL user manual.
+- Any application using the PPL should make sure that only the
+ intended version(s) of the library are ever used.
+ Functions
+\code
+ ppl_version_major,
+ ppl_version_minor,
+ ppl_version_revision,
+ ppl_version_beta,
+ ppl_version,
+ ppl_banner.
+\endcode
+ allow run-time checking of information about the version being used.
+
+\anchor OCaml_function_descriptions
+<H2> Function Descriptions </H2>
+
+Below is a short description of many of the interface functions.
+For full definitions of terminology used here, see the main PPL user manual.
+
+\anchor di_functions
+<H1> Domain Independent Functions </H1>
+
+First we describe some domain independent functions
+included with all instantiations of the OCaml interfaces.
+
+<H2><CODE> ppl_version_major </CODE></H2>
+ Returns the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor </CODE></H2>
+ Returns the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision </CODE></H2>
+ Returns the revision number of the PPL version.
+
+<H2><CODE> ppl_version_beta </CODE></H2>
+ Returns the beta number of the PPL version.
+
+<H2><CODE> ppl_version </CODE></H2>
+ Returns the PPL version.
+
+<H2><CODE> ppl_banner </CODE></H2>
+ Returns information about the PPL version, the licensing, the lack of any
+ warranty whatsoever, the C++ compiler used to build the library,
+ where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_max_space_dimension </CODE></H2>
+ Returns the maximum space dimension the C++ interface can handle.
+
+<H2><CODE> ppl_Coefficient_bits </CODE></H2>
+ Returns the number of bits used in the C++ interface for PPL coefficients;
+ 0 if unbounded.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+ Returns true if and only if the coefficients in the C++ interface
+ are bounded.
+
+<H2><CODE> ppl_Coefficient_max </CODE></H2>
+ If the coefficients are bounded, returns the maximum coefficient
+ the C++ interface can handle.
+
+<H2><CODE> ppl_Coefficient_min </CODE></H2>
+ If the coefficients are bounded, returns the minimum coefficient
+ the C++ interface can handle.
+
+<H2><CODE> ppl_io_wrap_string source_string indent_depth
+ preferred_first_line_length preferred_line_length </CODE></H2>
+ Utility function for the wrapping of lines of text.
+ The function wraps the lines of text stored in its first string argument
+ according to the next three integer arguments, which are interpreted as
+ the indentation depth, the preferred length for the first line and the
+ preferred length for all the other lines, respecively; it returns a
+ string containing the wrapped text.
+
+<H2><CODE> ppl_set_timeout csecs </CODE></H2>
+ Computations taking exponential time will be interrupted some time
+ after <CODE>csecs</CODE> centiseconds after that call.
+ If the computation is interrupted that way, a timeout exception
+ will be thrown.
+ An exception is immediately thrown if <CODE>csecs</CODE> is not strictly
+ greater than zero, or if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+ Resets the timeout time so that the computation is not interrupted.
+ An exception is thrown if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_set_deterministic_timeout unscaled_weight scale</CODE></H2>
+ Computations taking exponential time will be interrupted some time
+ after reaching the complexity threshold
+ \f$\mathrm{weight} = \mathrm{unscaled\_weight} \cdot 2^\mathrm{scale}\f$.
+ If the computation is interrupted that way, a timeout exception will
+ be thrown. <CODE>unscaled_weight</CODE> must be strictly greater than
+ zero; <CODE>scale</CODE> must be non-negative; an exception is thrown
+ if the computed weight threshold exceeds the maximum allowed value.
+ <EM>NOTE:</EM> This "timeout" checking functionality is said to be
+ <EM>deterministic</EM> because it is not based on actual elapsed time.
+ Its behavior will only depend on (some of the) computations performed
+ in the PPL library and it will be otherwise independent from the
+ computation environment (CPU, operating system, compiler, etc.).
+ The weight mechanism is under beta testing: client applications
+ should be ready to reconsider the tuning of these weight thresholds
+ when upgrading to newer version of the PPL.
+
+<H2><CODE> ppl_reset_deterministic_timeout </CODE></H2>
+ Resets the timeout time so that the computation is not interrupted.
+ An exception is thrown if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_set_rounding_for_PPL </CODE></H2>
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if <CODE>restore_pre_PPL_rounding</CODE>
+ has previously been called.
+
+<H2><CODE> ppl_restore_pre_PPL_rounding </CODE></H2>
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+ After calling this function it is absolutely necessary to call
+ <CODE>set_rounding_for_PPL</CODE> before using any PPL abstractions
+ based on floating point numbers.
+ This is performed automatically at finalization-time.
+
+<H2><CODE> ppl_irrational_precision </CODE></H2>
+ Returns the precision parameter for irrational calculations.
+
+<H2><CODE> ppl_set_irrational_precision </CODE></H2>
+ Sets the precision parameter <CODE>p</CODE> for irrational calculations.
+ In the following irrational calculations returning an unbounded
+ rational (e.g., when computing a square root), the lesser between
+ numerator and denominator will be limited to <CODE>2**p</CODE>.
+
+<BR>
+
+\anchor OCaml_mip_functions
+<H1> MIP Functions </H1>
+Here we describe some functions available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<H2><CODE>
+ ppl_new_MIP_Problem_from_space_dimension dimension
+</CODE></H2>
+ Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ with the
+ feasible region the vector space of dimension <CODE>dimension</CODE>,
+ objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE>
+ ppl_new_MIP_Problem dimension constraint_system lin_expr optimization_mode
+</CODE></H2>
+ Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ having space
+ dimension <CODE>dimension</CODE>, a feasible region represented by
+ <CODE>constraint_system</CODE>, objective function <CODE>lin_expr</CODE>
+ and optimization mode <CODE>optimization_mode</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_get_control_parameter handle param_name
+</CODE></H2>
+ Returns the value of the control parameter named <CODE>param_name</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_set_control_parameter handle param_value
+</CODE></H2>
+ Sets control parameter value <CODE>param_value</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_swap handle_1 handle_2
+</CODE></H2>
+ Swaps the MIP Problem referenced by <CODE>handle_1</CODE>
+ with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_space_dimension handle
+</CODE></H2>
+ Returns the dimension of the vector space in which the
+ MIP Problem referenced by <CODE>handle</CODE> is embedded.
+
+<H2><CODE>
+ ppl_MIP_Problem_integer_space_dimensions handle
+</CODE></H2>
+ Returns a list of variables representing
+ representing the integer space dimensions of the MIP Problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_constraints handle
+</CODE></H2>
+ Returns a list of the constraints in the constraints system
+ representing the feasible region for the MIP Problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_objective_function handle
+</CODE></H2>
+ Returns the objective function for the MIP Problem referenced
+ by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_optimization_mode handle
+</CODE></H2>
+ Returns the optimization mode
+ for the MIP Problem referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_clear handle
+</CODE></H2>
+ Resets the MIP problem referenced by <CODE>handle</CODE>
+ to be the trivial problem with
+ the feasible region the \f$0\f$-dimensional universe,
+ objective function \f$0\f$ and optimization mode <CODE>Maximization</CODE>.
+
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed
+ handle dimension
+ </CODE></H2>
+ Embeds the MIP problem referenced by <CODE>handle</CODE>
+ in a space that is enlarged by <CODE>dimension</CODE> dimensions,
+
+<H2><CODE>
+ ppl_MIP_Problem_add_to_integer_space_dimensions handle vars_list
+</CODE></H2>
+ Updates the MIP Problem referenced by <CODE>handle</CODE>
+ so that the variables in <CODE>vars_list</CODE> are added to
+ the set of integer space dimensions.
+
+<H2><CODE>
+ ppl_MIP_Problem_add_constraint handle constraint
+</CODE></H2>
+ Updates the MIP Problem referenced by <CODE>handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with the constraint <CODE>constraint</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_add_constraints handle constraint_system
+</CODE></H2>
+ Updates the MIP Problem referenced by <CODE>handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with all the constraints in <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_set_objective_function handle lin_expr
+</CODE></H2>
+ Updates the MIP Problem referenced by <CODE>handle</CODE>
+ so that the objective function is changed to <CODE>lin_expr</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_set_optimization_mode handle optimization_mode
+</CODE></H2>
+ Updates the MIP Problem referenced by <CODE>handle</CODE>
+ so that the optimization mode is changed to <CODE>optimization_mode</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_is_satisfiable handle
+</CODE></H2>
+ Returns true if the MIP Problem referenced by
+ <CODE>handle</CODE> is satisfiable and false otherwise.
+
+<H2><CODE>
+ ppl_MIP_Problem_solve handle
+</CODE></H2>
+ Solves the MIP problem referenced by
+ <CODE>handle</CODE> and returns 0, if the MIP problem is not satisfiable;
+ 1, if the MIP problem is satisfiable but
+ there is no finite bound to the value of the objective function;
+ 2, if the MIP problem admits an optimal solution.
+
+<H2><CODE>
+ ppl_MIP_Problem_feasible_point handle
+</CODE></H2>
+ Returns a feasible point for the MIP problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_optimizing_point handle
+</CODE></H2>
+ Returns an optimizing point for the MIP problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_optimal_value handle
+</CODE></H2>
+ Returns a pair of numbers, the first being the numerator and
+ the second the denominator, for the optimal value
+ for the MIP problem referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_evaluate_objective_function handle generator
+</CODE></H2>
+ Evaluates the objective function of the MIP problem referenced by
+ <CODE>handle</CODE> at point <CODE>generator</CODE>.
+ Returns a pair of numbers, the first being the numerator and
+ the second the denominator, for the objective function value
+ for the MIP problem referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_MIP_Problem_OK handle
+</CODE></H2>
+ Returns true if the MIP Problem referenced by
+ <CODE>handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants and false,
+ otherwise. Useful for debugging purposes.
+
+<H2><CODE>
+ ppl_MIP_Problem_ascii_dump handle
+</CODE></H2>
+ Returns a string containing an ASCII dump of the internal representation
+ of the MIP_Problem referenced by <CODE>handle</CODE>. Useful for
+ debugging purposes.
+
+<BR>
+
+\anchor OCaml_pip_functions
+<H1> PIP Functions </H1>
+Here we describe some functions available for PPL objects
+defining parametric integer programming problems.
+
+<H2><CODE>
+ ppl_new_PIP_Problem_from_space_dimension dimension
+</CODE></H2>
+ Return a handle to a PIP Problem \f$\mathrm{PIP}\f$ with the
+ feasible region the vector space of dimension <CODE>dimension</CODE>,
+ empty constraint_system and empty set of parametric variables.
+
+<H2><CODE>
+ ppl_new_PIP_Problem dimension constraint_system vars_list
+</CODE></H2>
+ Return a handle to a PIP Problem \f$\mathrm{PIP}\f$ having space
+ dimension <CODE>dimension</CODE>, a feasible region represented by
+ <CODE>constraint_system</CODE> and parametric variables represented
+ by <CODE>vars_list</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_get_control_parameter handle param_name
+</CODE></H2>
+ Returns the value of the control parameter named <CODE>param_name</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_set_control_parameter handle param_value
+</CODE></H2>
+ Sets control parameter value <CODE>param_value</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_swap handle_1 handle_2
+</CODE></H2>
+ Swaps the PIP Problem referenced by <CODE>handle_1</CODE>
+ with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_space_dimension handle
+</CODE></H2>
+ Returns the dimension of the vector space in which the
+ PIP Problem referenced by <CODE>handle</CODE> is embedded.
+
+<H2><CODE>
+ ppl_PIP_Problem_parameter_space_dimensions handle
+</CODE></H2>
+ Returns a list of variables representing
+ representing the parameter space dimensions of the PIP Problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_constraints handle
+</CODE></H2>
+ Returns a list of the constraints in the constraints system
+ representing the feasible region for the PIP Problem
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_clear handle
+</CODE></H2>
+ Resets the PIP problem referenced by <CODE>handle</CODE>
+ to be the trivial problem with space dimension \f$0\f$.
+
+<H2><CODE> ppl_PIP_Problem_add_space_dimensions_and_embed
+ handle dimension_0 dimension_1
+ </CODE></H2>
+ Embeds the PIP problem referenced by <CODE>handle</CODE>
+ in a space that is enlarged by <CODE>dimension_0</CODE>
+ non-parameter dimensions and <CODE>dimension_1</CODE> parameter dimensions,
+
+<H2><CODE>
+ ppl_PIP_Problem_add_to_parameter_space_dimensions handle vars_list
+</CODE></H2>
+ Sets the space dimensions whose indexes are in \p vars_list
+ to be parameter space dimensions.
+
+<H2><CODE>
+ ppl_PIP_Problem_add_constraint handle constraint
+</CODE></H2>
+ Updates the PIP Problem referenced by <CODE>handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with the constraint <CODE>constraint</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_add_constraints handle constraint_system
+</CODE></H2>
+ Updates the PIP Problem referenced by <CODE>handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with all the constraints in <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Problem_set_big_parameter_dimension handle dimension
+</CODE></H2>
+ Sets the dimension for the big parameter to \p dimension.
+
+<H2><CODE>
+ ppl_PIP_Problem_get_big_parameter_dimension handle
+</CODE></H2>
+ Returns the dimension for the big parameter.
+ Exception is thrown if no big parameter dimension has been set.
+
+<H2><CODE>
+ ppl_PIP_Problem_has_big_parameter_dimension handle
+</CODE></H2>
+ Returns true if and only if the dimension for the big parameter has been set.
+
+<H2><CODE>
+ ppl_PIP_Problem_is_satisfiable handle
+</CODE></H2>
+ Returns true if the PIP Problem referenced by
+ <CODE>handle</CODE> is satisfiable and false otherwise.
+
+<H2><CODE>
+ ppl_PIP_Problem_solve handle
+</CODE></H2>
+ Solves the PIP problem referenced by
+ <CODE>handle</CODE> and returns
+ a status flag indicating the outcome of the optimization attempt:
+ \p Optimized_Pip_Problem if the optimization attempt succeeds;
+ \p Unfeasible_Pip_Problem otherwise.
+
+<H2><CODE>
+ ppl_PIP_Problem_solution handle
+</CODE></H2>
+ Solves the PIP problem referenced by <CODE>handle</CODE> and
+ returns a handle to a PIP_Tree representing a feasible solution,
+ if it exists and bottom otherwise.
+
+<H2><CODE>
+ ppl_PIP_Problem_optimizing_solution handle
+</CODE></H2>
+ Solves the PIP problem referenced by <CODE>handle</CODE> and
+ returns a handle to a PIP_Tree representing an optimizing_solution,
+ if it exists and bottom otherwise.
+
+<H2><CODE>
+ ppl_PIP_Problem_OK handle
+</CODE></H2>
+ Returns true if the PIP Problem referenced by
+ <CODE>handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants and false,
+ otherwise. Useful for debugging purposes.
+
+<H2><CODE>
+ ppl_PIP_Problem_ascii_dump handle
+</CODE></H2>
+ Returns a string containing an ASCII dump of the internal representation
+ of the PIP_Problem referenced by <CODE>handle</CODE>. Useful for
+ debugging purposes.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_swap handle_1 handle_2
+</CODE></H2>
+ Swaps the PIP tree node referenced by <CODE>handle_1</CODE>
+ with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_OK handle
+</CODE></H2>
+ Returns true if the PIP tree node referenced by
+ <CODE>handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants and false,
+ otherwise. Useful for debugging purposes.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_ascii_dump handle
+</CODE></H2>
+ Returns a string containing an ASCII dump of the internal representation
+ of the Pip tree node referenced by <CODE>handle</CODE>. Useful for
+ debugging purposes.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_constraints handle
+</CODE></H2>
+ Returns a list of the parameter constraints in the PIP tree node
+ referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_artificials handle
+</CODE></H2>
+ Returns a list of the artificial parameters in the PIP
+ tree node referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_is_bottom handle
+</CODE></H2>
+ Returns true if and only if <CODE>handle</CODE> represents bottom.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_is_decision handle
+</CODE></H2>
+ Returns true if and only if <CODE>handle</CODE> represents a decision node.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_is_solution handle
+</CODE></H2>
+ Returns true if and only if <CODE>handle</CODE> represents a solution node.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_parametric_values handle var
+</CODE></H2>
+ Returns a linear expression representing the values of problem variable
+ \p var in the solution node represented by <CODE>handle</CODE>.
+ The returned linear expression may involve problem parameters
+ as well as artificial parameters.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_true_child handle var
+</CODE></H2>
+ Returns a handle to the child on the true branch of the
+ PIP tree node represented by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_PIP_Tree_Node_false_child handle var
+</CODE></H2>
+ Returns a handle to the child on the false branch of the
+ PIP tree node represented by <CODE>handle</CODE>.
+
+<BR>
+
+\anchor main_OCaml_C_polyhedron_functions
+<H1> C_Polyhedron Functions </H1>
+Here we describe the main functions available for PPL objects
+defining convex and closed polyhedra.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_space_dimension space_dimension universe_or_empty
+</CODE>
+</H2>
+ Returns a handle to a C polyhedron \f$\cP\f$
+ with <CODE>space_dimension</CODE> dimensions; it is empty
+ or the universe polyhedron depending on whether
+ <CODE>universe_or_empty</CODE>
+ is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron handle
+ </CODE></H2>
+ If <CODE>handle</CODE> refers to a C polyhedron \f$\cP_1\f$,
+ then the expression will returns a handle to a
+ copy \f$\cP_2\f$ of \f$\cP_1\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron handle
+ </CODE></H2>
+ If <CODE>handle</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+ then the expression returns a handle to a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+
+ When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+ care must be taken that the source polyhedron referenced by
+ <CODE>handle</CODE> is topologically closed.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_constraints constraint_system
+ </CODE></H2>
+ Returns a handle to a C polyhedron \f$\cP\f$ represented by
+ <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_generators generator_system
+ </CODE></H2>
+ Returns a handle to a C polyhedron \f$\cP\f$ represented by
+ <CODE>generator_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_swap handle_1 handle_2 </CODE></H2>
+ Swaps the polyhedron \f$\cP\f$ referenced by <CODE>handle_1</CODE>
+ with the polyhedron \f$\cQ\f$ referenced by <CODE>handle_2</CODE>.
+ The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_Polyhedron_space_dimension handle </CODE></H2>
+ Returns the dimension of the vector space in which the
+ polyhedron referenced by
+ <CODE>handle</CODE> is embedded.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension handle
+</CODE></H2>
+ Returns the actual dimension of the polyhedron referenced by
+ <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints handle
+ </CODE></H2>
+ Return a list of the constraints in the constraints system
+ representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints handle
+ </CODE></H2>
+ Returns a minimized list of the constraints in the constraints system
+ representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators handle
+ </CODE></H2>
+ Returns a list of the generators in the generators system
+ representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators handle
+ </CODE></H2>
+ Returns a minimized list of the generators in the generators system
+ representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint handle constraint
+</CODE></H2>
+ Returns the list of relations the polyhedron referenced by
+ <CODE>handle</CODE> has with <CODE>constraint</CODE>.
+ The possible relations and their meaning is given in Section
+ \extref{relation_with, Relation-With Operators}
+ of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator handle generator
+</CODE></H2>
+ Returns the list of relations the polyhedron referenced by
+ <CODE>handle</CODE> has with <CODE>generator</CODE>.
+ The possible relations and their meaning is given in Section
+ \extref{relation_with, Relation-With Operators}
+ of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_is_empty handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is empty and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_universe handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is the universe and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_bounded handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is bounded and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_contains_integer_point handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> contains at least one integer point and false,
+ otherwise.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above handle lin_expr </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is bounded from above by <CODE>lin_expr</CODE>
+ and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below handle lin_expr </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is bounded from below by <CODE>lin_expr</CODE>
+ and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_maximize handle lin_expr </CODE></H2>
+ Returns a record
+ <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE> where:
+ <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+ <CODE>handle</CODE> is not empty
+ and <CODE>lin_expr</CODE> is bounded from above in \f$P\f$ and
+ false, otherwise.
+ <CODE>coefficient_1</CODE> is the numerator of
+ the supremum value and <CODE>coefficient_2</CODE> the denominator
+ of the supremum value.
+ If the supremum is also the maximum, <CODE>bool_2</CODE> is true
+ and false, otherwise.
+
+<H2><CODE>
+ ppl_Polyhedron_maximize_with_point handle lin_expr
+ </CODE></H2>
+ Returns a record
+ <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2 * Point</CODE>
+ <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+ <CODE>handle</CODE> is not empty
+ and <CODE>lin_expr</CODE> is bounded from above in \f$P\f$ and
+ false, otherwise.
+ <CODE>coefficient_1</CODE> is the numerator of
+ the supremum value and <CODE>coefficient_2</CODE> the denominator
+ of the supremum value.
+ If the supremum is also the maximum, <CODE>bool_2</CODE> is true
+ and false, otherwise.
+ <CODE>Point</CODE> is the point or closure point where
+ <CODE>lin_expr</CODE> reaches the supremum.
+
+<H2><CODE>
+ ppl_Polyhedron_minimize handle lin_expr
+</CODE></H2>
+ Returns a record
+ <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE>
+ <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+ <CODE>handle</CODE> is not empty
+ and <CODE>lin_expr</CODE> is bounded from below in \f$P\f$ and
+ false, otherwise.
+ <CODE>coefficient_1</CODE> is the numerator of
+ the infinum value and <CODE>coefficient_2</CODE> the denominator
+ of the infinum value.
+ If the infinum is also the minimum, <CODE>bool_2</CODE> is true
+ and false, otherwise.
+
+<H2><CODE>
+ ppl_Polyhedron_minimize_with_point handle lin_expr
+</CODE></H2>
+ Returns a record
+ <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE>
+ <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+ <CODE>handle</CODE> is not empty
+ and <CODE>lin_expr</CODE> is bounded from below in \f$P\f$ and
+ false, otherwise.
+ <CODE>coefficient_1</CODE> is the numerator of
+ the infinum value and <CODE>coefficient_2</CODE> the denominator
+ of the infinum value.
+ If the infinum is also the minimum, <CODE>bool_2</CODE> is true
+ and false, otherwise.
+ <CODE>Point</CODE> is the point or closure point where
+ <CODE>lin_expr</CODE> reaches the infinum.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is topologically closed and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron handle_1 handle_2
+</CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle_2</CODE> is included in or
+ equal to the polyhedron referenced by <CODE>handle_1</CODE>
+ and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron handle_1 handle_2
+</CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle_2</CODE> is included in but not
+ equal to the polyhedron referenced by <CODE>handle_1</CODE>
+ and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron handle_1 handle_2
+ </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle_1</CODE> is disjoint from the polyhedron referenced by
+ <CODE>handle_2</CODE> and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron handle_1 handle_2 </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle_1</CODE> is equal to the polyhedron referenced by
+ <CODE>handle_2</CODE> and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_OK handle </CODE></H2>
+ Returns true if the polyhedron referenced by
+ <CODE>handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants and false, otherwise.
+ Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint handle constraint </CODE></H2>
+ Updates the polyhedron referenced by <CODE>handle</CODE> to
+ one obtained by adding
+ <CODE>constraint</CODE> to its constraint system.
+
+<H2><CODE> ppl_Polyhedron_add_generator handle generator </CODE></H2>
+ Updates the polyhedron referenced by <CODE>handle</CODE> to
+ one obtained by adding
+ <CODE>generator</CODE> to its generator system.
+
+<H2><CODE> ppl_Polyhedron_add_constraints handle constraint_system
+ </CODE></H2>
+ Updates the polyhedron referenced by <CODE>handle</CODE> to
+ one obtained by adding to its constraint system the constraints in
+ <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_C_Polyhedron_add_generators handle generator_system
+ </CODE></H2>
+ Updates the polyhedron referenced by <CODE>handle</CODE> to
+ one obtained by adding to its generator system the generators in
+ <CODE>generator_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_intersection_assign handle_1 handle_2
+</CODE></H2>
+ Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+ its intersection with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign handle_1 handle_2 </CODE></H2>
+ Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+ its poly-hull with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign handle_1 handle_2
+</CODE></H2>
+ Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+ its poly-difference with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image handle var
+ lin_expr coefficient
+</CODE></H2>
+ Transforms the polyhedron referenced by <CODE>handle</CODE>
+ assigning the affine expression
+ <CODE>lin_expr</CODE>/<CODE>coefficient</CODE> to <CODE>var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage handle var
+ lin_expr coefficient
+</CODE></H2>
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image handle
+ var
+ lin_expr_1
+ lin_expr_2
+ coefficient
+</CODE></H2>
+ Transforms the polyhedron referenced by <CODE>handle</CODE>
+ assigning the image with respect to the transfer relation
+ <CODE>lin_expr_1/coefficient <= var <= lin_expr_2/coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image handle
+ var
+ Relation_Symbol
+ lin_expr
+ coefficient
+</CODE></H2>
+ Transforms the polyhedron referenced by <CODE>handle</CODE>
+ assigning the generalized
+ affine image with respect to the transfer function
+ <CODE>var</CODE> <CODE>Relation_Symbol</CODE>
+ <CODE>lin_expr</CODE>/<CODE>coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs handle
+ lin_expr_1
+ Relation_Symbol
+ lin_expr_2
+</CODE></H2>
+ Transforms the polyhedron referenced by <CODE>handle</CODE>
+ assigning the generalized
+ affine image with respect to the transfer function
+ <CODE>lin_expr_1</CODE> <CODE>Relation_Symbol</CODE>
+ <CODE>lin_expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign handle_1 handle_2 </CODE></H2>
+ Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>handle_1</CODE>
+ the time-elapse \f$ (\cP \nearrow \cQ)\f$
+ with the polyhedron \f$\cQ\f$ referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign handle_1 handle_2
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens handle_1
+ handle_2
+ c_unsigned_1
+</CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the BHRZ03-widening of
+ \f$\cP_1\f$ with \f$\cP_2\f$,
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ Then this function will return the number of tokens remaining at the
+ end of the operation.
+
+<H2><CODE>
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign handle_1
+ handle_2
+ constraint_system
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+ improved by enforcing the constraints in
+ <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+ handle_1
+ handle_2
+ constraint_system
+ c_unsigned_1 </CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the BHRZ03-extrapolation of
+ \f$\cP_1\f$ with \f$\cP_2\f$,
+ improved by enforcing those constraints in <CODE>constraint_system</CODE>.
+ <BR>
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ then this function will return the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+ handle_1
+ handle_2
+ constraint_system
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+ improved by enforcing the constraints in
+ <CODE>constraint_system</CODE> together with all constraints of
+ the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+ by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+ handle_1
+ handle_2
+ constraint_system
+ c_unsigned_1
+</CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+ \f$\cP_2\f$ improved by enforcing those constraints in
+ <CODE>constraint_system</CODE> together with all constraints of
+ the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+ by every point in \f$\cP_1\f$.
+ <BR>
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ this function will return the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign handle_1 handle_2
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens handle_1
+ handle_2
+ c_unsigned_1
+</CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the H79-widening of
+ \f$\cP_1\f$ with \f$\cP_2\f$,
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ Then this function will return the number of tokens remaining at the
+ end of the operation.
+
+<H2><CODE>
+ ppl_Polyhedron_limited_H79_extrapolation_assign handle_1
+ handle_2
+ constraint_system
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+ improved by enforcing the constraints in
+ <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+ handle_1
+ handle_2
+ constraint_system
+ c_unsigned_1 </CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the H79-extrapolation of
+ \f$\cP_1\f$ with \f$\cP_2\f$,
+ improved by enforcing those constraints in <CODE>constraint_system</CODE>.
+ <BR>
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ then this function will return the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign
+ handle_1
+ handle_2
+ constraint_system
+</CODE></H2>
+ If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ then <CODE>handle_1</CODE> will refer to
+ the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+ improved by enforcing the constraints in
+ <CODE>constraint_system</CODE> together with all constraints of
+ the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+ by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+ handle_1
+ handle_2
+ constraint_system
+ c_unsigned_1
+</CODE></H2>
+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+ <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+ referenced by <CODE>handle_2</CODE>;
+ let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+ \f$\cP_2\f$, improved by enforcing those constraints in
+ <CODE>constraint_system</CODE> together with all constraints of
+ the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+ by every point in \f$\cP_1\f$.
+ <BR>
+ Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+ is the number of tokens available,
+ this function will return the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign handle </CODE></H2>
+ Assigns to the polyhedron referenced by <CODE>handle</CODE>
+ its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed handle
+ space_dimension
+ </CODE></H2>
+ Embeds the polyhedron referenced by <CODE>handle</CODE>
+ in a space that is enlarged by <CODE>space_dimension</CODE> dimensions,
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign handle_1 handle_2 </CODE></H2>
+ Updates the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+ by first embedding \f$\cP_1\f$ in a new space enlarged by
+ the space dimensions
+ of the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+ and then adds to its system of constraints
+ a renamed-apart version of the constraints of \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project handle
+ space_dimension
+ </CODE></H2>
+
+ Projects the polyhedron referenced by <CODE>handle</CODE>
+ onto a space that is enlarged by <CODE>space_dimension</CODE> dimensions,
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions handle
+ Int_List
+</CODE></H2>
+ Removes the space dimensions given by the identifiers of the
+ PPL variables in list <CODE>Int_List</CODE>
+ from the polyhedron referenced by <CODE>handle</CODE>.
+ The identifiers for the remaining PPL variables are renumbered so that
+ they are consecutive and the maximum index is less than the number
+ of dimensions.
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions handle
+ space_dimension
+</CODE></H2>
+ Projects the polyhedron referenced to by <CODE>handle</CODE>
+ onto the first <CODE>space_dimension</CODE> dimensions.
+
+<H2><CODE>
+ ppl_Polyhedron_expand_space_dimension handle var space_dimension
+</CODE></H2>
+ <CODE>space_dimension</CODE> copies of the space dimension referenced by
+ variable <CODE>var</CODE> are added to the polyhedron
+ referenced to by <CODE>handle</CODE>.
+
+<H2><CODE>
+ ppl_Polyhedron_fold_space_dimensions handle list_of_vars var
+</CODE></H2>
+ The space dimensions referenced by the PPL variables in list
+ <CODE>list_of_vars</CODE> are folded into the dimension referenced
+ by <CODE>var</CODE> and removed.
+ The result is undefined if <CODE>list_of_vars</CODE>
+ does not have the properties described in Section
+ \extref{fold_space_dimensions,
+ Folding Multiple Dimensions of the Vector Space into One Dimension}
+ of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions handle p_func </CODE></H2>
+ Maps the space dimensions of the polyhedron referenced by
+ <CODE>handle</CODE>
+ using the partial function defined by a list of pairs of integers
+ <CODE>p_func</CODE>.
+ The result is undefined if \p p_func does not encode a partial
+ function with the properties described in
+ Section \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+ Mapping the Dimensions of the Vector Space}
+ of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_wrap_assign handle
+ list_of_vars
+ width
+ representation
+ overflow
+ constraint_system
+ complexity_threshold
+ wrap_indicator
+</CODE></H2>
+
+ Transforms the polyhedron referenced by <CODE>handle</CODE> by
+ wrapping the dimensions given by <CODE>list_of_vars</CODE> while
+ respecting the specified <CODE>width</CODE>,
+ <CODE>representation</CODE> and <CODE>overflow</CODE> behavior of
+ all these variables. The parameter <CODE>constraint_system</CODE>
+ represents the conditional or looping construct guard with respect
+ to which wrapping is performed. The non-negative integer
+ <CODE>complexity_threshold</CODE> and Boolean
+ <CODE>wrap_indicator</CODE> allow control of the
+ complexity/precision ratio; higher values for
+ <CODE>complexity_threshold</CODE> will lead to possibly greater
+ precision while a true value for <CODE>wrap_indicator</CODE>
+ indicates that the space dimensions should be wrapped
+ individually. See Section \extref{Wrapping_Operator, Wrapping
+ Operator} for a more detailed description of this operator.
+
+<H2><CODE>
+ ppl_Polyhedron_ascii_dump handle
+</CODE></H2>
+ Returns a string containing an ASCII dump of the internal representation
+ of the polyhedron referenced by <CODE>handle</CODE>. Useful for
+ debugging purposes.
+
+
+\anchor OCamldoc_Documentation
+<H1>OCamldoc Documentation</H1>
+
+\htmlonly
+For a list of the PPL functions available to the generated domains
+for the OCaml interface, see the
+<A HREF="ocamldoc/index.html">OCamldoc-generated documentation</a>.
+<P>
+\endhtmlonly
+
+<strong>NOTE:</strong>
+the complete documentation for module <code>Ppl_ocaml</code>, including
+all the types and functions that were enabled at configuration time, is
+only available in the <em>configuration dependent</em> OCamldoc
+documentation.
+The configuration independent OCamldoc documentation only contains
+those types and functions that are always enabled, which are grouped
+into module <code>Ppl_ocaml_globals</code>.
+Also note that module <code>Ppl_ocaml</code> automatically includes
+module <code>Ppl_ocaml_globals</code>.
+
+\latexonly
+\input ocamldoc.tex
+\endlatexonly
+
+\anchor OI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of the OCaml system. If OCaml is correctly installed in a standard location,
+things are arranged so that the OCaml interface is built and installed.
+
+*/ /* \mainpage */
diff --git a/interfaces/OCaml/README.ocaml b/interfaces/OCaml/README.ocaml
new file mode 100644
index 0000000..b88415d
--- /dev/null
+++ b/interfaces/OCaml/README.ocaml
@@ -0,0 +1,55 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Objective Caml interface of the Parma Polyhedra Library requires
+OCaml version 3.09 or higher and the MLGMP wrapper to the GMP library
+(http://caml.inria.fr/cgi-bin/hump.en.cgi?contrib=278). Note that
+MLGMP, by default, requires the MPFR library (http://www.mpfr.org/) in
+addition to GMP.
+
+In order to install MLGMP you should make sure that GMP_INCLUDES and
+GMP_LIBDIR are correctly set (these variables are defined at the
+beginning of Makefile in the MLGMP's root directory). A `make'
+followed by `make install' (using GNU Make) should now be enough.
+
+The Objective Caml interface provides the module Ppl_ocaml.
+The implementation of the module relies on a library of interface
+functions (libppl_ocaml.a): see the Makefile.am file in directory
+`tests' for an example of how to compile and link an OCaml program
+accessing the Parma Polyhedra Library via this interface.
+
+After installing the Parma Polyhedra Library in <PPL prefix>,
+the OCaml interface files will be installed in <PPL-OCaml libdir>,
+where either <PPL-OCaml libdir> = <PPL prefix>/lib/ppl or
+<PPL-OCaml libdir> = <PPL prefix>/lib64/ppl, depending on the
+architecture and on the system/distribution conventions.
+The OCaml compilation command for `my_program.ml' should then be
+something like:
+
+$ ocamlc -o my_program.cmo -c -I +gmp -I <PPL-OCaml libdir> my_program.ml
+
+A possible link command is the following (we refer the reader to the
+Objective Caml documentation for a reference to the many available
+linking options):
+
+$ ocamlc -o my_program -custom -cc g++ -I +gmp -I <PPL-OCaml libdir> \
+ -cclib -lppl -cclib -lm -cclib -lgmpxx -cclib -lgmp \
+ ppl_ocaml.cma gmp.cma my_program.cmo
+
+If native compilation of OCaml code is supported by the build platform,
+then `my_program.ml' can also be compiled/linked to native code as follows:
+
+$ ocamlopt -o my_program.cmx \
+ -c -I +gmp -I <PPL-OCaml libdir> my_program.ml
+$ ocamlopt -o my_program.opt -cc g++ -I +gmp -I <PPL-OCaml libdir> \
+ -cclib -lppl -cclib -lm -cclib -lgmpxx -cclib -lgmp \
+ ppl_ocaml.cmxa gmp.cmxa my_program.cmx
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
new file mode 100644
index 0000000..89a3b2a
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
@@ -0,0 +1,1544 @@
+dnl -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program implementation code for generating the
+files ppl_ocaml_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+dnl There is no code at present for these procedures in the OCaml interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`m4_custom_operations_class_code',
+`dnl
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+struct custom_operations m4_current_interface`'_custom_operations = {
+ "com.bugseng.ppl" "." PPL_VERSION "." "m4_current_interface"|COMMA|
+ custom_`'m4_current_interface`'_finalize|COMMA|
+ custom_compare_default|COMMA|
+ custom_hash_default|COMMA|
+ custom_serialize_default|COMMA|
+ custom_deserialize_default|COMMA|
+ custom_compare_ext_default
+};
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(value d, value caml_de) try {
+ CAMLparam2(d, caml_de);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ const Degenerate_Element ppl_de = build_ppl_Degenerate_Element(caml_de);
+ @TOPOLOGY@@CPP_CLASS@& ppl_value = *new @TOPOLOGY@@CPP_CLASS@(dd, ppl_de);
+ CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(value cl) try {
+ CAMLparam1(cl);
+ @!BUILD_REPRESENT at _System cs = build_ppl_@!BUILD_REPRESENT at _System(cl);
+ @TOPOLOGY@@CPP_CLASS@& ppl_value = *new @TOPOLOGY@@CPP_CLASS@(cs);
+ CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(value ph, value c) try {
+ CAMLparam2(ph, c);
+ const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ @!RELATION_REPRESENT@ ppl_c = build_ppl_@!RELATION_REPRESENT@(c);
+ Poly_@!A_RELATION_REPRESENT at _Relation r = pph.relation_with(ppl_c);
+ CAMLreturn(build_ocaml_poly_ at A_RELATION_REPRESENT@_relation(r));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at DIMENSION@(value ph) try {
+ CAMLparam1(ph);
+ const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ dimension_type d = pph. at DIMENSION@();
+ CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at HAS_PROPERTY@(value ph) try {
+ CAMLparam1(ph);
+ const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(Val_bool(pph. at HAS_PROPERTY@()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at SIMPLIFY@(value ph) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph. at SIMPLIFY@();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(value ph, value le) try {
+ CAMLparam2(ph, le);
+ const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Linear_Expression ple = build_ppl_Linear_Expression(le);
+ CAMLreturn(Val_bool(pph.bounds_from_ at ABOVEBELOW@(ple)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@(value ph, value c) try {
+ CAMLparam2(ph, c);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ @!CLASS_REPRESENT@ pc = build_ppl_@!CLASS_REPRESENT@(c);
+ pph.add_ at CLASS_REPRESENT@(pc);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(value ph, value cs) try {
+ CAMLparam2(ph, cs);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ @!CLASS_REPRESENT at _System pcs = build_ppl_@!CLASS_REPRESENT at _System(cs);
+ pph.add_ at CLASS_REPRESENT@s(pcs);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(value ph, value c) try {
+ CAMLparam2(ph, c);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ @!REFINE_REPRESENT@ pc = build_ppl_@!REFINE_REPRESENT@(c);
+ pph.refine_with_ at REFINE_REPRESENT@(pc);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(value ph, value cs) try {
+ CAMLparam2(ph, cs);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ @!REFINE_REPRESENT at _System pcs = build_ppl_@!REFINE_REPRESENT at _System(cs);
+ pph.refine_with_ at REFINE_REPRESENT@s(pcs);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ const @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ CAMLreturn(Val_bool(pph1. at COMPARISON@(pph2)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_equals_ at CLASS@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ const @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ CAMLreturn(Val_bool(pph1 == pph2));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at BINOP@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1. at BINOP@(pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_positive_time_elapse_assign(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ if (Interfaces::is_necessarily_closed_for_interfaces
+ (*p_Polyhedron_val(ph1))) {
+ C_Polyhedron& xx
+ = static_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+ const C_Polyhedron& yy
+ = static_cast<const C_Polyhedron&>(*p_Polyhedron_val(ph2));
+ xx.positive_time_elapse_assign(yy);
+ }
+ else {
+ NNC_Polyhedron& xx
+ = static_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+ const NNC_Polyhedron& yy
+ = static_cast<const NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+ xx.positive_time_elapse_assign(yy);
+ }
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_simplify_using_context_assign(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ CAMLreturn(Val_bool(pph1.simplify_using_context_assign(pph2)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+(value ph, value d) try {
+ CAMLparam2(ph, d);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.add_space_dimensions_and_embed(dd);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_remove_space_dimensions(value ph, value caml_vset) try {
+ CAMLparam2(ph, caml_vset);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.remove_space_dimensions(build_ppl_Variables_Set(caml_vset));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_remove_higher_space_dimensions(value ph, value d) try {
+ CAMLparam2(ph, d);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.remove_higher_space_dimensions(dd);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_fold_space_dimensions
+(value ph, value caml_vset, value caml_dim) try {
+ CAMLparam1(ph);
+ const dimension_type ppl_dim = Int_val(caml_dim);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Variables_Set ppl_vset;
+ if (Int_val(caml_vset) == 0)
+ CAMLreturn(Val_unit);
+ while (true) {
+ ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+ if (Int_val(Field(caml_vset, 1)) == 0)
+ break;
+ caml_vset = Field(caml_vset, 1);
+ }
+ pph.fold_space_dimensions(ppl_vset, Variable(ppl_dim));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_map_space_dimensions(value ph, value caml_mapped_dims) try {
+ CAMLparam2(ph, caml_mapped_dims);
+ CAMLlocal1(head);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Partial_Function pfunc;
+ while (caml_mapped_dims != Val_emptylist) {
+ head = Field(caml_mapped_dims, 0);
+ const dimension_type domain_dim = value_to_ppl_dimension(Field(head, 0));
+ const dimension_type codomain_dim = value_to_ppl_dimension(Field(head, 1));
+ pfunc.insert(domain_dim, codomain_dim);
+ caml_mapped_dims = Field(caml_mapped_dims, 1);
+ }
+ pph.map_space_dimensions(pfunc);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_expand_space_dimension
+(value ph, value var_index, value m) try {
+ CAMLparam3(ph, var_index, m);
+ const Variable var = build_ppl_Variable(var_index);
+ const dimension_type c_m = value_to_ppl_dimension(m);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.expand_space_dimension(var, c_m);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_some_non_integer_points
+(value ph, value caml_cc) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+ pph.drop_some_non_integer_points(ppl_cc);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_some_non_integer_points_2
+(value ph, value caml_vset, value caml_cc) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Variables_Set ppl_vset;
+ if (Int_val(caml_vset) == 0)
+ CAMLreturn(Val_unit);
+ while (true) {
+ ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+ if (Int_val(Field(caml_vset, 1)) == 0)
+ break;
+ caml_vset = Field(caml_vset, 1);
+ }
+ const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+ pph.drop_some_non_integer_points(ppl_vset, ppl_cc);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(value ph) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(build_ocaml_ at CLASS_REPRESENT@_system(pph. at CLASS_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(value ph) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(build_ocaml_ at CLASS_REPRESENT@_system(pph.minimized_ at CLASS_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_constrains(value ph, value var) try {
+ CAMLparam2(ph, var);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(Val_bool(pph.constrains(build_ppl_Variable(var))));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_unconstrain_space_dimension(value ph, value var) try {
+ CAMLparam2(ph, var);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.unconstrain(build_ppl_Variable(var));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_unconstrain_space_dimensions(value ph, value caml_vset) try {
+ CAMLparam2(ph, caml_vset);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.unconstrain(build_ppl_Variables_Set(caml_vset));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_bounded_ at AFFIMAGE@(value ph, value var, value lb_expr,
+ value ub_expr, value coeff) try {
+ CAMLparam5(ph, var, lb_expr, ub_expr, coeff);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.bounded_ at AFFIMAGE@(build_ppl_Variable(var),
+ build_ppl_Linear_Expression(lb_expr),
+ build_ppl_Linear_Expression(ub_expr),
+ build_ppl_Coefficient(coeff));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at AFFIMAGE@
+(value ph, value var, value expr, value coeff) try {
+ CAMLparam4(ph, var, expr, coeff);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ build_ppl_Linear_Expression(expr);
+ pph. at AFFIMAGE@(build_ppl_Variable(var),
+ build_ppl_Linear_Expression(expr),
+ build_ppl_Coefficient(coeff));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1
+(value ph, value le1, value rel_sym, value le2) try {
+ CAMLparam4(ph, le1, rel_sym, le2);
+ build_ppl_relsym(rel_sym);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+ build_ppl_relsym(rel_sym),
+ build_ppl_Linear_Expression(le2));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@2
+(value ph, value int_val, value rel_sym, value le, value caml_coeff) try {
+ CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+ build_ppl_relsym(rel_sym),
+ build_ppl_Linear_Expression(le),
+ build_ppl_Coefficient(caml_coeff));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence
+(value ph, value int_val, value rel_sym, value le,
+ value caml_coeff, value caml_modulus) try {
+ CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+ CAMLxparam1(caml_modulus);
+ build_ppl_relsym(rel_sym);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+ build_ppl_relsym(rel_sym),
+ build_ppl_Linear_Expression(le),
+ build_ppl_Coefficient(caml_coeff),
+ build_ppl_Coefficient(caml_modulus));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence_bytecode
+(value* argv, int /*argn*/) try {
+ return ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence
+ (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_lhs_rhs_with_congruence
+(value ph, value le1, value rel_sym, value le2, value caml_modulus) try {
+ CAMLparam5(ph, le1, rel_sym, le2, caml_modulus);
+ build_ppl_relsym(rel_sym);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+ build_ppl_relsym(rel_sym),
+ build_ppl_Linear_Expression(le2),
+ build_ppl_Coefficient(caml_modulus));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at WIDEN@_widening_assign(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1. at WIDEN@_widening_assign(pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+ CAMLparam3(ph1, ph2, tokens);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+ pph1. at WIDEN@_widening_assign(pph2, &u_tokens);
+ CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_widening_assign(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1.widening_assign(pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_widening_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+ CAMLparam3(ph1, ph2, tokens);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+ pph1.widening_assign(pph2, &u_tokens);
+ CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(value ph1, value ph2, value caml_cs, value tokens) try {
+ CAMLparam4(ph1, ph2, caml_cs, tokens);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ const @!CONSTRAINER at _System ppl_cs = build_ppl_@!CONSTRAINER at _System(caml_cs);
+ unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+ pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs,
+ &u_tokens);
+ CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(value ph1,
+ value ph2,
+ value caml_cs) try {
+ CAMLparam3(ph1, ph2, caml_cs);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ const @!CONSTRAINER at _System ppl_cs = build_ppl_@!CONSTRAINER at _System(caml_cs);
+ pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound(value ph, value var) try {
+ CAMLparam2(ph, var);
+ CAMLlocal1(caml_return_value);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Variable vv = build_ppl_Variable(var);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ bool is_closed = false;
+ bool ppl_return_value = pph.has_ at UPPERLOWER@_bound(vv, num, den, is_closed);
+ caml_return_value = caml_alloc(4, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+ Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+ Store_field(caml_return_value, 3, Val_bool(is_closed));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MAXMIN@(value ph, value caml_le) try {
+ CAMLparam2(ph, caml_le);
+ CAMLlocal1(caml_return_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ bool is_supremum = false;
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+ num, den, is_supremum);
+ caml_return_value = caml_alloc(4, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+ Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+ Store_field(caml_return_value, 3, Val_bool(is_supremum));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MAXMIN@_with_point(value ph, value caml_le) try {
+ CAMLparam2(ph, caml_le);
+ CAMLlocal1(caml_return_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ bool is_supremum = false;
+ Generator g = point();
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+ num, den, is_supremum, g);
+ caml_return_value = caml_alloc(5, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+ Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+ Store_field(caml_return_value, 3, Val_bool(is_supremum));
+ Store_field(caml_return_value, 4, build_ocaml_generator(g));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_frequency(value ph, value caml_le) try {
+ CAMLparam2(ph, caml_le);
+ CAMLlocal1(caml_return_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(f_num);
+ PPL_DIRTY_TEMP_COEFFICIENT(f_den);
+ PPL_DIRTY_TEMP_COEFFICIENT(v_num);
+ PPL_DIRTY_TEMP_COEFFICIENT(v_den);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ bool ppl_return_value = pph.frequency(build_ppl_Linear_Expression(caml_le),
+ f_num, f_den, v_num, v_den);
+ caml_return_value = caml_alloc(5, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(f_num));
+ Store_field(caml_return_value, 2, build_ocaml_coefficient(f_den));
+ Store_field(caml_return_value, 3, build_ocaml_coefficient(v_num));
+ Store_field(caml_return_value, 4, build_ocaml_coefficient(v_den));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_OK(value ph) try {
+ CAMLparam1(ph);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(Val_bool(pph.OK()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MEMBYTES@(value ph) try {
+ CAMLparam1(ph);
+ const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ CAMLreturn(Val_long(pph. at MEMBYTES@()));
+}
+CATCH_ALL
+
+ ')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_swap(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ swap(pph1, pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(value ph) try {
+ CAMLparam1(ph);
+ @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>(p_ at A_FRIEND@_val(ph)));
+ const @CPP_CLASS@& ppl_value
+ = *(reinterpret_cast<@CPP_CLASS@*>(new @TOPOLOGY@@CPP_CLASS@(pph)));
+ CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(value ph, value caml_cc) try {
+ CAMLparam1(ph);
+ @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>( p_ at A_FRIEND@_val(ph)));
+ const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+ @CPP_CLASS@& ppl_value
+ = *(reinterpret_cast<@CPP_CLASS@*>(new @TOPOLOGY@@CPP_CLASS@(pph, ppl_cc)));
+ CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at UB_EXACT@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_ub_exact_for_polyhedron_domains',
+ `m4_ub_exact_for_non_polyhedron_domains')'dnl
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+`dnl
+ if (Interfaces::is_necessarily_closed_for_interfaces
+ (*p_Polyhedron_val(ph1))) {
+ C_Polyhedron& xx
+ = static_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+ const C_Polyhedron& yy
+ = static_cast<const C_Polyhedron&>(*p_Polyhedron_val(ph2));
+ CAMLreturn(Val_bool(xx.upper_bound_assign_if_exact(yy)));
+ }
+ else {
+ NNC_Polyhedron& xx
+ = static_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+ const NNC_Polyhedron& yy
+ = static_cast<const NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+ CAMLreturn(Val_bool(xx.upper_bound_assign_if_exact(yy)));
+ }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+`dnl
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+
+ CAMLreturn(Val_bool(pph1. at UB_EXACT@(pph2)));
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1. at EXTRAPOLATION@_extrapolation_assign(pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+ CAMLparam3(ph1, ph2, tokens);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+ pph1. at EXTRAPOLATION@_extrapolation_assign(pph2, &u_tokens);
+ CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(value ph1,
+ value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1. at EXTRAPOLATION@_narrowing_assign(pph2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at BEGINEND@_iterator(value t_pps) try {
+ CAMLparam1(t_pps);
+ @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+ @CPP_CLASS@::iterator& ppl_value
+ = *new @CPP_CLASS@::iterator(pps. at BEGINEND@());
+ CAMLreturn(unregistered_value_p_ at CLASS@_iterator(ppl_value));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_disjunct(value caml_it) try {
+ CAMLparam1(caml_it);
+ CAMLlocal1(caml_return_value);
+ @CPP_CLASS@::iterator& cpp_it = *p_ at CLASS@_iterator_val(caml_it);
+ const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& disjunct = cpp_it->pointset();
+ caml_return_value = unregistered_value_p_ at DISJUNCT@(disjunct);
+ actual_p_ at DISJUNCT@_val(caml_return_value)
+ = const_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(mark(&disjunct));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_disjunct(value t_pps, value caml_item_to_add) try {
+ CAMLparam2(t_pps, caml_item_to_add);
+ @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+ @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& item
+ = *(reinterpret_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>
+ (p_ at DISJUNCT@_val(caml_item_to_add)));
+ pps.add_disjunct(item);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_disjunct(value t_pps, value caml_item_to_drop) try {
+ CAMLparam2(t_pps, caml_item_to_drop);
+ @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+ @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_item_to_drop);
+ itr = pps.drop_disjunct(itr);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_disjuncts
+(value t_pps, value caml_item1_to_drop, value caml_item2_to_drop) try {
+ CAMLparam3(t_pps, caml_item1_to_drop, caml_item2_to_drop);
+ @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+ @CPP_CLASS@::iterator& itr1 = *p_ at CLASS@_iterator_val(caml_item1_to_drop);
+ @CPP_CLASS@::iterator& itr2 = *p_ at CLASS@_iterator_val(caml_item2_to_drop);
+ pps.drop_disjuncts(itr1, itr2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@::iterator*&
+p_ at CLASS@_iterator_val(value v) {
+ return *reinterpret_cast<@CPP_CLASS@::iterator**>(Data_custom_val(v));
+}
+
+void
+custom_ at CLASS@_iterator_finalize(value v) {
+ delete p_ at CLASS@_iterator_val(v);
+}
+
+struct custom_operations @CLASS at _iterator_custom_operations = {
+ "com.bugseng.ppl" "." PPL_VERSION "." "@CLASS at _iterator"|COMMA|
+ custom_ at CLASS@_iterator_finalize|COMMA|
+ custom_compare_default|COMMA|
+ custom_hash_default|COMMA|
+ custom_serialize_default|COMMA|
+ custom_deserialize_default|COMMA|
+ custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_ at CLASS@_iterator(const @CPP_CLASS@::iterator& ph) {
+ value v = caml_alloc_custom(&@CLASS at _iterator_custom_operations,
+ sizeof(@CPP_CLASS@::iterator*), 0, 1);
+ p_ at CLASS@_iterator_val(v) = const_cast<@CPP_CLASS@::iterator*>(&ph);
+ return v;
+}
+
+extern "C"
+CAMLprim value
+ppl_new_ at CLASS@_iterator_from_iterator(value y) try {
+ CAMLparam1(y);
+ @CPP_CLASS@::iterator& yy
+ = *(reinterpret_cast<@CPP_CLASS@::iterator*>( p_ at CLASS@_iterator_val(y)));
+ @CPP_CLASS@::iterator& ppl_value
+ = *(reinterpret_cast<@CPP_CLASS@::iterator*>(new @CPP_CLASS@::iterator(yy)));
+ CAMLreturn(unregistered_value_p_ at CLASS@_iterator(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at INCDEC@_iterator(value caml_itr) try {
+ CAMLparam1(caml_itr);
+ @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_itr);
+ m4_ at INCDEC@_cpp_name()itr;
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_increment_cpp_name', `++')
+m4_define(`m4_decrement_cpp_name', `--')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_iterator_equals_iterator(value caml_itr1, value caml_itr2) try {
+ CAMLparam2(caml_itr1, caml_itr2);
+ @CPP_CLASS@::iterator& itr1 = *p_ at CLASS@_iterator_val(caml_itr1);
+ @CPP_CLASS@::iterator& itr2 = *p_ at CLASS@_iterator_val(caml_itr2);
+ if (itr1 == itr2)
+ CAMLreturn(Val_bool(true));
+ else
+ CAMLreturn(Val_bool(false));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ pph1.BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+ (pph2,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));;
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+(value ph1, value ph2, value max_disj) try {
+ CAMLparam2(ph1, ph2);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+ unsigned cpp_max_disj
+ = value_to_unsigned<unsigned>(max_disj);
+ pph1.BGP99_extrapolation_assign
+ (pph2,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+ cpp_max_disj);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ascii_dump(value ph1) try {
+ CAMLparam1(ph1);
+ @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+ std::ostringstream s;
+ pph1.ascii_dump(s);
+ CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code', `
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_linear_ at PARTITION@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ CAMLlocal1(caml_return_value);
+ @CPP_CLASS@* rfh;
+ Pointset_Powerset<NNC_Polyhedron>* rsh;
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_linear_partition_for_polyhedron_domains',
+ `m4_linear_partition_for_non_polyhedron_domains')'dnl
+ caml_return_value = caml_alloc(2, 0);
+ Store_field(caml_return_value, 0,
+ unregistered_value_p_ at CLASS@(*rfh));
+ Store_field(caml_return_value, 1,
+ unregistered_value_p_Pointset_Powerset_NNC_Polyhedron(*rsh));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+`dnl
+ if (Interfaces::is_necessarily_closed_for_interfaces
+ (*p_Polyhedron_val(ph1))) {
+ C_Polyhedron& pph1
+ = reinterpret_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+ C_Polyhedron& pph2
+ = reinterpret_cast<C_Polyhedron&>(*p_Polyhedron_val(ph2));
+ std::pair<C_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(pph1, pph2);
+ rfh = new C_Polyhedron(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+ }
+ else {
+ NNC_Polyhedron& pph1
+ = reinterpret_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+ NNC_Polyhedron& pph2
+ = reinterpret_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+ std::pair<NNC_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(pph1, pph2);
+ rfh = new NNC_Polyhedron(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+ }
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+`dnl
+ @CPP_CLASS@& pph1
+ = reinterpret_cast<@CPP_CLASS@&>(*p_ at CLASS@_val(ph1));
+ @CPP_CLASS@& pph2
+ = reinterpret_cast<@CPP_CLASS@&>(*p_ at CLASS@_val(ph2));
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(pph1, pph2);
+ rfh = new @CPP_CLASS@(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code', `
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_approximate_ at PARTITION@(value ph1, value ph2) try {
+ CAMLparam2(ph1, ph2);
+ CAMLlocal1(caml_return_value);
+ @CPP_CLASS@& pph1
+ = reinterpret_cast<@CPP_CLASS@&>(*p_ at CPP_CLASS@_val(ph1));
+ @CPP_CLASS@& pph2
+ = reinterpret_cast<@CPP_CLASS@&>(*p_ at CPP_CLASS@_val(ph2));
+ bool is_finite = false;
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+ r = approximate_partition(pph1, pph2, is_finite);
+ @CPP_CLASS@* rfh = new @CPP_CLASS@(0, EMPTY);
+ Pointset_Powerset<Grid>* rsh = new Pointset_Powerset<Grid>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+ caml_return_value = caml_alloc(3, 0);
+ Store_field(caml_return_value, 0,
+ unregistered_value_p_ at CLASS@(*rfh));
+ Store_field(caml_return_value, 1,
+ unregistered_value_p_Pointset_Powerset_Grid(*rsh));
+ Store_field(caml_return_value, 2, Val_bool(is_finite));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(value pset) try {
+ CAMLparam1(pset);
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+ CAMLreturn(Val_bool(termination_test_ at TERMINATION_ID@(ppset)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(value pset_before,
+ value pset_after)
+ try {
+ CAMLparam2(pset_before, pset_after);
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+ CAMLreturn(Val_bool(termination_test_ at TERMINATION_ID@_2(ppset_before,
+ ppset_after)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (value pset)
+ try {
+ CAMLparam1(pset);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+ Generator g(point());
+ bool ppl_return_value = one_affine_ranking_function_ at TERMINATION_ID@
+ (ppset, g);
+ caml_return_value = caml_alloc(2, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_generator(g));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (value pset_before, value pset_after)
+ try {
+ CAMLparam2(pset_before, pset_after);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+ Generator g(point());
+ bool ppl_return_value = one_affine_ranking_function_ at TERMINATION_ID@_2
+ (ppset_before, ppset_after, g);
+ caml_return_value = caml_alloc(2, 0);
+ Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+ Store_field(caml_return_value, 1, build_ocaml_generator(g));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (value pset)
+ try {
+ CAMLparam1(pset);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ all_affine_ranking_functions_ at TERMINATION_ID@(ppset, *ph);
+ CAMLreturn(unregistered_value_p_Polyhedron(*ph));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (value pset_before, value pset_after)
+ try {
+ CAMLparam2(pset_before, pset_after);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ all_affine_ranking_functions_ at TERMINATION_ID@_2(ppset_before, ppset_after, *ph);
+ CAMLreturn(unregistered_value_p_Polyhedron(*ph));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+ (value pset)
+ try {
+ CAMLparam1(pset);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ all_affine_quasi_ranking_functions_MS(ppset, *ph_decreasing, *ph_bounded);
+ caml_return_value = caml_alloc(2, 0);
+ Store_field(caml_return_value, 0,
+ unregistered_value_p_Polyhedron(*ph_decreasing));
+ Store_field(caml_return_value, 1,
+ unregistered_value_p_Polyhedron(*ph_bounded));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+ (value pset_before, value pset_after)
+ try {
+ CAMLparam2(pset_before, pset_after);
+ CAMLlocal1(caml_return_value);
+ const @TOPOLOGY@@CPP_CLASS@& ppset_before
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+ const @TOPOLOGY@@CPP_CLASS@& ppset_after
+ = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ all_affine_quasi_ranking_functions_MS_2(ppset_before, ppset_after,
+ *ph_decreasing, *ph_bounded);
+ caml_return_value = caml_alloc(2, 0);
+ Store_field(caml_return_value, 0,
+ unregistered_value_p_Polyhedron(*ph_decreasing));
+ Store_field(caml_return_value, 1,
+ unregistered_value_p_Polyhedron(*ph_bounded));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_wrap_assign_native
+ (value ph, value caml_vset, value width, value rep, value oflow,
+ value cs, value complexity, value wrap_ind) try {
+ CAMLparam5(ph, caml_vset, width, rep, oflow);
+ CAMLxparam3(cs, complexity, wrap_ind);
+ @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+ Variables_Set ppl_vset;
+ if (Int_val(caml_vset) == 0)
+ CAMLreturn(Val_unit);
+ while (true) {
+ ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+ if (Int_val(Field(caml_vset, 1)) == 0)
+ break;
+ caml_vset = Field(caml_vset, 1);
+ }
+ build_ppl_bounded_integer_type_representation(rep);
+ build_ppl_bounded_integer_type_overflow(oflow);
+ const Constraint_System ppl_cs = build_ppl_Constraint_System(cs);
+ const unsigned ppl_complexity = value_to_unsigned<unsigned>(complexity);
+ const bool ppl_wrap_ind = Bool_val(wrap_ind);
+ pph.wrap_assign(ppl_vset,
+ build_ppl_bounded_integer_type_width(width),
+ build_ppl_bounded_integer_type_representation(rep),
+ build_ppl_bounded_integer_type_overflow(oflow),
+ &ppl_cs, ppl_complexity, ppl_wrap_ind);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_wrap_assign_bytecode(value * argv, int)
+{
+ return ppl_ at CLASS@_wrap_assign_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6], argv[7]);
+}
+
+')
+
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
new file mode 100644
index 0000000..a8d2204
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
@@ -0,0 +1,66 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)dnl
+
+dnl This m4 file generates the file ppl_ocaml.cc
+dnl using the code in ppl_interface_generator_ocaml_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_cc_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+m4_define(`m4_current_cplusplus', m4_cplusplus_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* OCaml m4_current_interface interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_ocaml_domains.hh"
+
+m4_custom_operations_class_code
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::OCaml;
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
new file mode 100644
index 0000000..cc6a57c
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
@@ -0,0 +1,66 @@
+dnl Used by ppl_interfaces_generator_ocaml_hh_files.m4
+dnl for generating the access code for the OCaml interface.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`m4_access_class_code',
+`dnl
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@*
+p_ at CLASS@_val(value v) {
+ return unmark(*reinterpret_cast<@CPP_CLASS@**>(Data_custom_val(v)));
+}
+
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@*&
+actual_p_ at CLASS@_val(value v) {
+ return *reinterpret_cast<@CPP_CLASS@**>(Data_custom_val(v));
+}
+
+inline void
+custom_ at CLASS@_finalize(value v) {
+ if (!marked(actual_p_ at CLASS@_val(v)))
+ delete actual_p_ at CLASS@_val(v);
+}
+
+inline value
+unregistered_value_p_ at CLASS@(const @CPP_CLASS@& ph) {
+ extern struct custom_operations @CLASS at _custom_operations;
+ value v = caml_alloc_custom(&@CLASS at _custom_operations,
+ sizeof(@CPP_CLASS@*), 0, 1);
+ actual_p_ at CLASS@_val(v) = const_cast<@CPP_CLASS@*>(&ph);
+ return v;
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
new file mode 100644
index 0000000..c39ae9f
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)dnl
+
+dnl This m4 file is used to generate ppl_ocaml_domains.hh
+dnl and files ppl_ocaml_DOMAIN.hh, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_ocaml_hh_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_hh_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_domains.hh << ___END_OF_FILE___
+`#'include "ppl_ocaml_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_`'m4_current_interface.hh << ___END_OF_FILE___
+/* OCaml m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+m4_replace_all_patterns($1, m4_access_class_code)`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_domains.hh << ___END_OF_FILE___
+/* OCaml interface code: inclusion of all the domain-dependent declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_ocaml_common_defs.hh"
+m4_all_code
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
new file mode 100644
index 0000000..7546b40
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
@@ -0,0 +1,62 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.ml
+dnl using the code in ppl_interface_generator_ocaml_ml_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_ml_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+(* OCaml interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*)
+
+open Gmp
+include Ppl_ocaml_globals
+
+m4_divert(-1)
+m4_pushdef(`m4_one_class_code', `type m4_downcase(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert`'dnl
+m4_all_code
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
new file mode 100644
index 0000000..18de75e
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
@@ -0,0 +1,668 @@
+dnl -*- Tuareg -*-
+sm4_divert(-1)
+
+This m4 file contains the program code for generating ppl_ocaml.ml
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+dnl There is no code at present for these procedures in the OCaml interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+ int -> degenerate_element -> @!CLASS@
+ = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+ @BUILD_REPRESENT at _system -> @!CLASS@
+ = "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@:
+ @!CLASS@ -> linear_ at RELATION_REPRESENT@
+ -> poly_ at A_RELATION_REPRESENT@_relation list
+ = "ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+external ppl_ at CLASS@_ at DIMENSION@:
+ @!CLASS@ -> int = "ppl_ at CLASS@_ at DIMENSION@"
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+external ppl_ at CLASS@_ at HAS_PROPERTY@:
+ @!CLASS@ -> bool = "ppl_ at CLASS@_ at HAS_PROPERTY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+external ppl_ at CLASS@_ at SIMPLIFY@:
+ @!CLASS@ -> unit = "ppl_ at CLASS@_ at SIMPLIFY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+external ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@:
+ @!CLASS@ -> linear_expression -> bool
+ = "ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_add_ at CLASS_REPRESENT@:
+ @!CLASS@ -> linear_ at CLASS_REPRESENT@ -> unit
+ = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_add_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system -> unit
+ = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@:
+ @!CLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+ = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s:
+ @!CLASS@ -> @REFINE_REPRESENT at _system -> unit
+ = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+external ppl_ at CLASS@_ at COMPARISON@_ at CLASS@:
+ @!CLASS@ -> @!CLASS@ -> bool
+ = "ppl_ at CLASS@_ at COMPARISON@_ at CLASS@"
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+external ppl_ at CLASS@_equals_ at CLASS@:
+ @!CLASS@ -> @!CLASS@ -> bool
+ = "ppl_ at CLASS@_equals_ at CLASS@"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+external ppl_ at CLASS@_ at BINOP@:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_ at BINOP@"
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+external ppl_ at CLASS@_positive_time_elapse_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_positive_time_elapse_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+external ppl_ at CLASS@_simplify_using_context_assign:
+ @!CLASS@ -> @!CLASS@ -> bool
+ = "ppl_ at CLASS@_simplify_using_context_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+external ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@:
+ @!CLASS@ -> int -> unit
+ = "ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_remove_space_dimensions:
+ @!CLASS@ -> int list -> unit
+ = "ppl_ at CLASS@_remove_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_remove_higher_space_dimensions:
+ @!CLASS@ -> int -> unit
+ = "ppl_ at CLASS@_remove_higher_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_fold_space_dimensions:
+ @!CLASS@ -> int list -> int -> unit
+ = "ppl_ at CLASS@_fold_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_map_space_dimensions:
+ @!CLASS@ -> (int*int) list -> unit
+ = "ppl_ at CLASS@_map_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+external ppl_ at CLASS@_expand_space_dimension:
+ @!CLASS@ -> int -> int -> unit
+ = "ppl_ at CLASS@_expand_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+external ppl_ at CLASS@_drop_some_non_integer_points:
+ @!CLASS@ -> complexity_class -> unit
+ = "ppl_ at CLASS@_drop_some_non_integer_points"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+external ppl_ at CLASS@_drop_some_non_integer_points_2:
+ @!CLASS@ -> int list -> complexity_class -> unit
+ = "ppl_ at CLASS@_drop_some_non_integer_points_2"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_get_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system
+ = "ppl_ at CLASS@_get_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system
+ = "ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+external ppl_ at CLASS@_constrains:
+ @!CLASS@ -> int -> bool
+ = "ppl_ at CLASS@_constrains"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+external ppl_ at CLASS@_unconstrain_space_dimension:
+ @!CLASS@ -> int -> unit
+ = "ppl_ at CLASS@_unconstrain_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_unconstrain_space_dimensions:
+ @!CLASS@ -> int list -> unit
+ = "ppl_ at CLASS@_unconstrain_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_bounded_ at AFFIMAGE@:
+ @!CLASS@ -> int -> linear_expression
+ -> linear_expression -> Z.t -> unit
+ = "ppl_ at CLASS@_bounded_ at AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_ at AFFIMAGE@:
+ @!CLASS@ -> int -> linear_expression -> Z.t -> unit
+ = "ppl_ at CLASS@_ at AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs:
+ @!CLASS@ -> linear_expression
+ -> relation_symbol -> linear_expression -> unit
+ = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@:
+ @!CLASS@ -> int -> relation_symbol
+ -> linear_expression -> Z.t -> unit
+ = "ppl_ at CLASS@_generalized_ at AFFIMAGE@2"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence:
+ @!CLASS@ -> int -> relation_symbol
+ -> linear_expression -> Z.t -> Z.t -> unit
+ = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence_bytecode" "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence:
+ @!CLASS@ -> linear_expression -> relation_symbol
+ -> linear_expression -> Z.t -> unit
+ = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_lhs_rhs_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_ at WIDEN@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_ at WIDEN@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+ = "ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens"
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_widening_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+ = "ppl_ at CLASS@_widening_assign_with_tokens"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+external ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@ -> @CONSTRAINER at _system -> unit
+ = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> @CONSTRAINER at _system -> int -> int
+ = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+external ppl_ at CLASS@_has_ at UPPERLOWER@_bound:
+ @!CLASS@ -> int
+ -> bool * Z.t * Z.t * bool
+ = "ppl_ at CLASS@_has_ at UPPERLOWER@_bound"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * bool
+ = "ppl_ at CLASS@_ at MAXMIN@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@_with_point:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * bool * linear_generator
+ = "ppl_ at CLASS@_ at MAXMIN@_with_point"
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+external ppl_ at CLASS@_frequency:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * Z.t * Z.t
+ = "ppl_ at CLASS@_frequency"
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+external ppl_ at CLASS@_OK:
+ @!CLASS@ -> bool = "ppl_ at CLASS@_OK"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `
+external ppl_ at CLASS@_ at MEMBYTES@:
+ @!CLASS@ -> int = "ppl_ at CLASS@_ at MEMBYTES@"
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+external ppl_ at CLASS@_swap:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_swap"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+ @!A_FRIEND@ -> @!CLASS@
+ = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity:
+ @!A_FRIEND@ -> complexity_class -> @!CLASS@
+ = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+ `dnl
+ external ppl_ at CLASS@_ at UB_EXACT@:
+ @!CLASS@ -> @!CLASS@ -> bool
+ = "ppl_ at CLASS@_ at UB_EXACT@"
+
+ ')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+ = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens"
+
+ ')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `
+external ppl_ at CLASS@_ at BEGINEND@_iterator:
+ @!CLASS@ -> @!CLASS at _iterator
+ = "ppl_ at CLASS@_ at BEGINEND@_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `
+external ppl_ at CLASS@_get_disjunct:
+ @!CLASS at _iterator -> @!DISJUNCT@
+ = "ppl_ at CLASS@_get_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `
+external ppl_ at CLASS@_add_disjunct:
+ @!CLASS@ -> @!DISJUNCT@ -> unit
+ = "ppl_ at CLASS@_add_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `
+ external ppl_ at CLASS@_drop_disjunct:
+ @!CLASS@ -> @!CLASS at _iterator -> unit
+ = "ppl_ at CLASS@_drop_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+ `
+ external ppl_ at CLASS@_drop_disjuncts:
+ @!CLASS@ -> @!CLASS at _iterator -> @!CLASS at _iterator -> unit
+ = "ppl_ at CLASS@_drop_disjuncts"
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+type @!CLASS at _iterator
+
+external ppl_new_ at CLASS@_iterator_from_iterator:
+ @!CLASS at _iterator -> @!CLASS at _iterator
+ = "ppl_new_ at CLASS@_iterator_from_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `
+ external ppl_ at CLASS@_ at INCDEC@_iterator:
+ @!CLASS at _iterator -> unit
+ = "ppl_ at CLASS@_ at INCDEC@_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `
+external ppl_ at CLASS@_iterator_equals_iterator:
+ @!CLASS at _iterator -> @!CLASS at _iterator -> bool
+ = "ppl_ at CLASS@_iterator_equals_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+ = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+external ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@ -> int -> unit
+ = "ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+external ppl_ at CLASS@_ascii_dump:
+ @!CLASS@ -> string = "ppl_ at CLASS@_ascii_dump"
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+external ppl_ at CLASS@_linear_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron
+ = "ppl_ at CLASS@_linear_partition"
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+external ppl_ at CLASS@_approximate_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ ->
+ @!CLASS@ * pointset_powerset_grid * bool
+ = "ppl_ at CLASS@_approximate_partition"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * bool
+ = "ppl_ at CLASS@_ at MAXMIN@"
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> bool = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> bool
+ = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> bool * linear_generator
+ = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> bool * linear_generator
+ = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> polyhedron
+ = "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> polyhedron
+ = "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> polyhedron * polyhedron
+ = "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> polyhedron * polyhedron
+ = "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+external ppl_ at CLASS@_wrap_assign: @!CLASS@
+ -> int list
+ -> bounded_integer_type_width
+ -> bounded_integer_type_representation
+ -> bounded_integer_type_overflow
+ -> constraint_system
+ -> int -> int -> unit
+ = "ppl_ at CLASS@_wrap_assign_bytecode"
+ "ppl_ at CLASS@_wrap_assign_native"
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
new file mode 100644
index 0000000..9208bde
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
@@ -0,0 +1,60 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.mli
+dnl using the code in ppl_interface_generator_ocaml_mli_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_mli_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+m4_include(ppl_ocaml_globals.mli)
+m4_divert(-1)
+m4_pushdef(`m4_one_class_code', `type m4_downcase(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+dnl m4_pre_all_classes_code
+dnl
+m4_divert
+m4_define(`m4_pre_all_classes_code', `')
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
new file mode 100644
index 0000000..cad3390
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
@@ -0,0 +1,588 @@
+dnl -*- Tuareg -*-
+m4_divert(-1)
+
+This m4 file contains the program code for generating ppl_ocaml.mli
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+ int -> degenerate_element -> @!CLASS@
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+ @BUILD_REPRESENT at _system -> @!CLASS@
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@:
+ @!CLASS@ -> linear_ at RELATION_REPRESENT@
+ -> poly_ at A_RELATION_REPRESENT@_relation list
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+val ppl_ at CLASS@_ at DIMENSION@:
+ @!CLASS@ -> int
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+val ppl_ at CLASS@_ at HAS_PROPERTY@:
+ @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+val ppl_ at CLASS@_ at SIMPLIFY@:
+ @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+val ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@:
+ @!CLASS@ -> linear_expression -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_add_ at CLASS_REPRESENT@:
+ @!CLASS@ -> linear_ at CLASS_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_add_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@:
+ @!CLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s:
+ @!CLASS@ -> @REFINE_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+val ppl_ at CLASS@_ at COMPARISON@_ at CLASS@:
+ @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+val ppl_ at CLASS@_equals_ at CLASS@:
+ @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+val ppl_ at CLASS@_ at BINOP@:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+val ppl_ at CLASS@_positive_time_elapse_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+val ppl_ at CLASS@_simplify_using_context_assign:
+ @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+val ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@:
+ @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_remove_space_dimensions:
+ @!CLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_remove_higher_space_dimensions:
+ @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_fold_space_dimensions:
+ @!CLASS@ -> int list -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_map_space_dimensions:
+ @!CLASS@ -> (int*int) list -> unit
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+val ppl_ at CLASS@_expand_space_dimension:
+ @!CLASS@ -> int -> int -> unit
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+val ppl_ at CLASS@_drop_some_non_integer_points:
+ @!CLASS@ -> complexity_class -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+val ppl_ at CLASS@_drop_some_non_integer_points_2:
+ @!CLASS@ -> int list -> complexity_class -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_get_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s:
+ @!CLASS@ -> @CLASS_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+val ppl_ at CLASS@_constrains:
+ @!CLASS@ -> int -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+val ppl_ at CLASS@_unconstrain_space_dimension:
+ @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_unconstrain_space_dimensions:
+ @!CLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_bounded_ at AFFIMAGE@:
+ @!CLASS@ -> int
+ -> linear_expression -> linear_expression
+ -> Z.t -> unit
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_ at AFFIMAGE@:
+ @!CLASS@ -> int -> linear_expression -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs:
+ @!CLASS@ -> linear_expression
+ -> relation_symbol -> linear_expression
+ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@:
+ @!CLASS@ -> int -> relation_symbol -> linear_expression
+ -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence:
+ @!CLASS@ -> int -> relation_symbol -> linear_expression
+ -> Z.t -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence:
+ @!CLASS@ -> linear_expression
+ -> relation_symbol -> linear_expression -> Z.t
+ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_ at WIDEN@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_widening_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@
+ -> @CONSTRAINER at _system -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@
+ -> @CONSTRAINER at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+val ppl_ at CLASS@_has_ at UPPERLOWER@_bound:
+ @!CLASS@ -> int
+ -> bool * Z.t * Z.t * bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+val ppl_ at CLASS@_ at MAXMIN@:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+val ppl_ at CLASS@_ at MAXMIN@_with_point:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * bool * linear_generator
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+val ppl_ at CLASS@_frequency:
+ @!CLASS@ -> linear_expression
+ -> bool * Z.t * Z.t * Z.t * Z.t
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+val ppl_ at CLASS@_OK:
+ @!CLASS@ -> bool
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+val ppl_ at CLASS@_ at MEMBYTES@:
+ @!CLASS@ -> int
+
+')
+
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+val ppl_ at CLASS@_swap:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+ @!A_FRIEND@ -> @!CLASS@
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity:
+ @!A_FRIEND@ -> complexity_class -> @!CLASS@
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+val ppl_ at CLASS@_ at UB_EXACT@:
+ @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+ @!CLASS@ -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+val ppl_ at CLASS@_ at BEGINEND@_iterator:
+ @!CLASS@ -> @!CLASS at _iterator
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+val ppl_ at CLASS@_get_disjunct:
+ @!CLASS at _iterator -> @!DISJUNCT@
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+val ppl_ at CLASS@_add_disjunct:
+ @!CLASS@ -> @!DISJUNCT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+val ppl_ at CLASS@_drop_disjunct:
+ @!CLASS@ -> @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+val ppl_ at CLASS@_drop_disjuncts:
+ @!CLASS@ -> @!CLASS at _iterator -> @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+type @!CLASS at _iterator
+
+val ppl_new_ at CLASS@_iterator_from_iterator:
+ @!CLASS at _iterator -> @!CLASS at _iterator
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+
+val ppl_ at CLASS@_iterator_equals_iterator:
+ @!CLASS at _iterator -> @!CLASS at _iterator -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+val ppl_ at CLASS@_ at INCDEC@_iterator:
+ @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign:
+ @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign:
+ @!CLASS@ -> @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+
+val ppl_ at CLASS@_ascii_dump:
+ @!CLASS@ -> string
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+val ppl_ at CLASS@_linear_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+val ppl_ at CLASS@_approximate_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ ->
+ @!CLASS@ * pointset_powerset_grid * bool
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> bool * linear_generator
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> bool * linear_generator
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> polyhedron
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> polyhedron
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@:
+ @!CLASS@ -> polyhedron * polyhedron
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2:
+ @!CLASS@ -> @!CLASS@ -> polyhedron * polyhedron
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+val ppl_ at CLASS@_wrap_assign: @!CLASS@
+ -> int list
+ -> bounded_integer_type_width
+ -> bounded_integer_type_representation
+ -> bounded_integer_type_overflow
+ -> constraint_system
+ -> int -> int -> unit
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
new file mode 100644
index 0000000..47dfada
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
@@ -0,0 +1,57 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the OCaml interface; this includes:
+dnl - the list in the imported file and any OCaml specific procedures.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+dnl
+
+m4_define(`m4_procedure_list',
+ `m4_echo_unquoted(ppl_new_ at CLASS@_iterator +pointset_powerset,
+`m4_common_procedure_list',
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@ +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2 +simple,
+)
+')
+
diff --git a/interfaces/OCaml/ppl_ocaml_common.cc b/interfaces/OCaml/ppl_ocaml_common.cc
new file mode 100644
index 0000000..6ddc47c
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common.cc
@@ -0,0 +1,1814 @@
+/* Domain-independent part of the OCaml interface: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_ocaml_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+ if (p_timeout_object) {
+ delete p_timeout_object;
+ p_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+void
+reset_deterministic_timeout() {
+ if (p_deterministic_timeout_object) {
+ delete p_deterministic_timeout_object;
+ p_deterministic_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+namespace {
+
+inline mpz_ptr
+mpz_ptr_val(value val) {
+ return static_cast<mpz_ptr>(Data_custom_val(val));
+}
+
+inline mpz_class&
+mpz_class_val(value val) {
+ return reinterpret_cast<mpz_class&>(*mpz_ptr_val(val));
+}
+
+// Function for the management of mpz_t integers.
+extern "C" struct custom_operations _mlgmp_custom_z;
+
+inline value
+unregistered_value_p_zero_mpz(void) {
+ value zero_mpz = caml_alloc_custom(&_mlgmp_custom_z, sizeof(mpz_t), 0, 1);
+ mpz_init(mpz_ptr_val(zero_mpz));
+ return zero_mpz;
+}
+
+} // anonymous namespace
+
+value
+build_ocaml_coefficient(const Coefficient& ppl_coeff) {
+ CAMLparam0();
+ CAMLlocal1(ml_coeff);
+ ml_coeff = unregistered_value_p_zero_mpz();
+ assign_r(mpz_class_val(ml_coeff), ppl_coeff, ROUND_NOT_NEEDED);
+ CAMLreturn(ml_coeff);
+}
+
+Coefficient
+build_ppl_Coefficient(value coeff) {
+ mpz_class z(mpz_ptr_val(coeff));
+ return Coefficient(z);
+}
+
+Linear_Expression
+build_ppl_Linear_Expression(value e) {
+ switch (Tag_val(e)) {
+ case 0:
+ // Variable
+ return build_ppl_Variable(Field(e, 0));
+ case 1: {
+ // Coefficient
+ mpz_class z(mpz_ptr_val(Field(e, 0)));
+ return Linear_Expression(Coefficient(z));
+ }
+ case 2:
+ // Unary_Plus
+ return build_ppl_Linear_Expression(Field(e, 0));
+ case 3:
+ // Unary_Minus
+ return -build_ppl_Linear_Expression(Field(e, 0));
+ case 4:
+ // Plus
+ return build_ppl_Linear_Expression(Field(e, 0))
+ + build_ppl_Linear_Expression(Field(e, 1));
+ case 5:
+ // Minus
+ return build_ppl_Linear_Expression(Field(e, 0))
+ - build_ppl_Linear_Expression(Field(e, 1));
+ case 6: {
+ // Times
+ mpz_class z(mpz_ptr_val(Field(e, 0)));
+ return Coefficient(z) * build_ppl_Linear_Expression(Field(e, 1));
+ }
+ default:
+ throw std::invalid_argument("PPL OCaml interface invalid_argument\n:"
+ "error building PPL::Linear_Expression");
+ }
+}
+
+Relation_Symbol
+build_ppl_relsym(value caml_relsym) {
+ assert(Is_long(caml_relsym));
+ switch (Int_val(caml_relsym)) {
+ case 0:
+ return LESS_THAN;
+ case 1:
+ return LESS_OR_EQUAL;
+ case 2:
+ return EQUAL;
+ case 3:
+ return GREATER_OR_EQUAL;
+ case 4:
+ return GREATER_THAN;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_relsym(rel)");
+ }
+}
+
+Bounded_Integer_Type_Width
+build_ppl_bounded_integer_type_width(value caml_width) {
+ assert(Is_long(caml_width));
+ switch (Int_val(caml_width)) {
+ case 0:
+ return BITS_8;
+ case 1:
+ return BITS_16;
+ case 2:
+ return BITS_32;
+ case 3:
+ return BITS_64;
+ case 4:
+ return BITS_128;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+ "width(width)");
+ }
+}
+
+Bounded_Integer_Type_Representation
+build_ppl_bounded_integer_type_representation(value caml_rep) {
+ assert(Is_long(caml_rep));
+ switch (Int_val(caml_rep)) {
+ case 0:
+ return UNSIGNED;
+ case 1:
+ return SIGNED_2_COMPLEMENT;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+ "representation(rep)");
+ }
+}
+
+Bounded_Integer_Type_Overflow
+build_ppl_bounded_integer_type_overflow(value caml_oflow) {
+ assert(Is_long(caml_oflow));
+ switch (Int_val(caml_oflow)) {
+ case 0:
+ return OVERFLOW_WRAPS;
+ case 1:
+ return OVERFLOW_UNDEFINED;
+ case 2:
+ return OVERFLOW_IMPOSSIBLE;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+ "overflow(oflow)");
+ }
+}
+
+Optimization_Mode
+build_ppl_opt_mode(value caml_opt_mode) {
+ assert(Is_long(caml_opt_mode));
+ switch (Int_val(caml_opt_mode)) {
+ case 0:
+ return MINIMIZATION;
+ case 1:
+ return MAXIMIZATION;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_opt_mode(opt)");
+ }
+}
+
+Degenerate_Element
+build_ppl_Degenerate_Element(value de) {
+ assert(Is_long(de));
+ switch (Int_val(de)) {
+ case 0:
+ return UNIVERSE;
+ case 1:
+ return EMPTY;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_Degenerate_Element(de)");
+ }
+}
+
+Complexity_Class
+build_ppl_Complexity_Class(value cc) {
+ assert(Is_long(cc));
+ switch (Int_val(cc)) {
+ case 0:
+ return POLYNOMIAL_COMPLEXITY;
+ case 1:
+ return SIMPLEX_COMPLEXITY;
+ case 2:
+ return ANY_COMPLEXITY;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_Complexity_Class(cc)");
+ }
+}
+
+MIP_Problem::Control_Parameter_Name
+build_ppl_mip_problem_control_parameter_name(value caml_cp_name) {
+ assert(Is_long(caml_cp_name));
+ if (Int_val(caml_cp_name) == 0)
+ return MIP_Problem::PRICING;
+ else
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_mip_problem_"
+ "control_parameter_name(cpn)");
+}
+
+MIP_Problem::Control_Parameter_Value
+build_ppl_control_parameter_value(value caml_cp_value) {
+ assert(Is_long(caml_cp_value));
+ switch (Int_val(caml_cp_value)) {
+ case 0:
+ return MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+ case 1:
+ return MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+ case 2:
+ return MIP_Problem::PRICING_TEXTBOOK;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_control_parameter_value(cpv)");
+ }
+}
+
+PIP_Problem::Control_Parameter_Name
+build_ppl_pip_problem_control_parameter_name(value caml_cp_name) {
+ assert(Is_long(caml_cp_name));
+ switch (Int_val(caml_cp_name)) {
+ case 0:
+ return PIP_Problem::CUTTING_STRATEGY;
+ case 1:
+ return PIP_Problem::PIVOT_ROW_STRATEGY;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_pip_problem_"
+ "control_parameter_name(cpn)");
+ }
+}
+
+PIP_Problem::Control_Parameter_Value
+build_ppl_pip_problem_control_parameter_value(value caml_cp_value) {
+ assert(Is_long(caml_cp_value));
+ switch (Int_val(caml_cp_value)) {
+ case 0:
+ return PIP_Problem::CUTTING_STRATEGY_FIRST;
+ case 1:
+ return PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+ case 2:
+ return PIP_Problem::CUTTING_STRATEGY_ALL;
+ case 3:
+ return PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+ case 4:
+ return PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+ default:
+ PPL_OCAML_UNEXPECTED_MSG("build_ppl_pip_problem_"
+ "control_parameter_value(cpv)");
+ }
+}
+
+Variables_Set
+build_ppl_Variables_Set(value caml_vset) {
+ Variables_Set ppl_vset;
+ while (caml_vset != Val_emptylist) {
+ ppl_vset.insert(value_to_ppl_dimension(Field(caml_vset, 0)));
+ caml_vset = Field(caml_vset, 1);
+ }
+ return ppl_vset;
+}
+
+Constraint
+build_ppl_Constraint(value c) {
+ value e1 = Field(c, 0);
+ value e2 = Field(c, 1);
+ switch (Tag_val(c)) {
+ case 0:
+ // Less_Than
+ return build_ppl_Linear_Expression(e1) < build_ppl_Linear_Expression(e2);
+ case 1:
+ // Less_Or_Equal
+ return build_ppl_Linear_Expression(e1) <= build_ppl_Linear_Expression(e2);
+ case 2:
+ // Equal
+ return build_ppl_Linear_Expression(e1) == build_ppl_Linear_Expression(e2);
+ case 3:
+ // Greater_Than
+ return build_ppl_Linear_Expression(e1) > build_ppl_Linear_Expression(e2);
+ case 4:
+ // Greater_Or_Equal
+ return build_ppl_Linear_Expression(e1) >= build_ppl_Linear_Expression(e2);
+ default:
+ throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+ "error building PPL::Constraint");
+ }
+}
+
+
+template <typename R>
+CAMLprim value
+get_inhomogeneous_term(const R& r) {
+ CAMLparam0();
+ CAMLlocal1(coeff_term);
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ neg_assign(coeff, r.inhomogeneous_term());
+ coeff_term = caml_alloc(1,1);
+ Store_field(coeff_term, 0, build_ocaml_coefficient(coeff));
+ CAMLreturn(coeff_term);
+}
+
+// Takes from constraints, generators... the embedded linear
+// expression.
+template <typename R>
+CAMLprim value
+get_linear_expression(const R& r) {
+ CAMLparam0();
+ CAMLlocal2(zero_term, zero_mpz);
+ CAMLlocal5(sum, term1, ml_le_var1, term2, ml_le_var2);
+ dimension_type space_dimension = r.space_dimension();
+ dimension_type varid = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ while (varid < space_dimension
+ && (coeff = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension) {
+ zero_mpz = unregistered_value_p_zero_mpz();
+ zero_term = caml_alloc(1,1);
+ Store_field(zero_term, 0, zero_mpz);
+ CAMLreturn(zero_term);
+ }
+ else {
+ ml_le_var1 = caml_alloc(1,0);
+ Store_field(ml_le_var1, 0, ppl_dimension_to_value(varid));
+ term1 = caml_alloc(2,6);
+ PPL_DIRTY_TEMP_COEFFICIENT(ppl_coeff);
+ ppl_coeff = r.coefficient(Variable(varid));
+ Store_field(term1, 0, build_ocaml_coefficient(ppl_coeff));
+ Store_field(term1, 1, ml_le_var1);
+ while (true) {
+ ++varid;
+ while (varid < space_dimension
+ && (coeff = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension)
+ CAMLreturn(term1);
+ else {
+ ml_le_var2 = caml_alloc(1,0);
+ Store_field(ml_le_var2, 0, ppl_dimension_to_value(varid));
+ term2 = caml_alloc(2,6);
+ ppl_coeff = r.coefficient(Variable(varid));
+ Store_field(term2, 0, build_ocaml_coefficient(ppl_coeff));
+ Store_field(term2, 1, ml_le_var2);
+ sum = caml_alloc(2,4);
+ Store_field(sum, 0, term1);
+ Store_field(sum, 1, term2);
+ term1 = sum;
+ }
+ }
+ }
+}
+
+value
+build_ocaml_generator(const Generator& ppl_generator) {
+ CAMLparam0();
+ CAMLlocal1(caml_generator);
+ switch (ppl_generator.type()) {
+ case Generator::LINE: {
+ // Store the linear expression. (1,0) stands for
+ // allocate one block (the linear expression) with Tag 0 (a line here).
+ caml_generator = caml_alloc(1,0);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+ CAMLreturn(caml_generator);
+ }
+ case Generator::RAY: {
+ caml_generator = caml_alloc(1,1);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+ CAMLreturn(caml_generator);
+ }
+ case Generator::POINT: {
+ // Allocates two blocks (the linear expression and the divisor)
+ // of tag 2 (Point).
+ caml_generator = caml_alloc(2,2);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+ const Coefficient& divisor = ppl_generator.divisor();
+ Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+ CAMLreturn(caml_generator);
+ }
+ case Generator::CLOSURE_POINT: {
+ caml_generator = caml_alloc(2,3);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+ const Coefficient& divisor = ppl_generator.divisor();
+ Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+ CAMLreturn(caml_generator);
+ }
+ } // switch (ppl_generator.type())
+ PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_grid_generator(const Grid_Generator& ppl_grid_generator) {
+ CAMLparam0();
+ CAMLlocal1(caml_generator);
+ switch (ppl_grid_generator.type()) {
+ case Grid_Generator::LINE: {
+ // Store the linear expression. (1,0) stands for
+ // allocate one block (the linear expression) with Tag 0 (a line here).
+ caml_generator = caml_alloc(1,0);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+ CAMLreturn(caml_generator);
+ }
+ case Grid_Generator::PARAMETER: {
+ caml_generator = caml_alloc(2,1);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+ const Coefficient& divisor = ppl_grid_generator.divisor();
+ Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+ CAMLreturn(caml_generator);
+ }
+ case Grid_Generator::POINT: {
+ // Allocates two blocks (the linear expression and the divisor)
+ // of tag 2 (Point).
+ caml_generator = caml_alloc(2,2);
+ Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+ const Coefficient& divisor = ppl_grid_generator.divisor();
+ Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+ CAMLreturn(caml_generator);
+ }
+ } // switch (ppl_grid_generator.type())
+ PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_constraint(const Constraint& ppl_constraint) {
+ CAMLparam0();
+ CAMLlocal1(caml_constraint);
+ switch (ppl_constraint.type()) {
+ case Constraint::EQUALITY: {
+ caml_constraint = caml_alloc(2,2);
+ Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+ Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+ CAMLreturn(caml_constraint);
+ }
+ case Constraint::STRICT_INEQUALITY: {
+ caml_constraint = caml_alloc(2,3);
+ Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+ Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+ CAMLreturn(caml_constraint);
+ }
+ case Constraint::NONSTRICT_INEQUALITY: {
+ caml_constraint = caml_alloc(2,4);
+ Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+ Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+ CAMLreturn(caml_constraint);
+ }
+ } // switch (ppl_constraint.type())
+ PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_congruence(const Congruence& ppl_congruence) {
+ CAMLparam0();
+ CAMLlocal1(caml_congruence);
+ caml_congruence = caml_alloc(3,0);
+ Store_field(caml_congruence, 0, get_linear_expression(ppl_congruence));
+ Store_field(caml_congruence, 1, get_inhomogeneous_term(ppl_congruence));
+ const Coefficient& modulus = ppl_congruence.modulus();
+ Store_field(caml_congruence, 2, build_ocaml_coefficient(modulus));
+ CAMLreturn(caml_congruence);
+}
+
+value
+build_ocaml_congruence_system(const Congruence_System& ppl_cgs) {
+ CAMLparam0();
+ CAMLlocal2(result, new_tail);
+ result = Val_emptylist;
+ for (Congruence_System::const_iterator v_begin = ppl_cgs.begin(),
+ v_end = ppl_cgs.end(); v_begin != v_end; ++v_begin) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, build_ocaml_congruence(*v_begin));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+
+value
+build_ocaml_constraint_system(const Constraint_System& ppl_cs) {
+ CAMLparam0();
+ CAMLlocal2(result, new_tail);
+ result = Val_emptylist;
+ for (Constraint_System::const_iterator v_begin = ppl_cs.begin(),
+ v_end = ppl_cs.end(); v_begin != v_end; ++v_begin) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, build_ocaml_constraint(*v_begin));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+
+value
+build_ocaml_generator_system(const Generator_System& ppl_gs) {
+ CAMLparam0();
+ CAMLlocal2(result, new_tail);
+ result = Val_emptylist;
+ for (Generator_System::const_iterator v_begin = ppl_gs.begin(),
+ v_end = ppl_gs.end(); v_begin != v_end; ++v_begin) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, build_ocaml_generator(*v_begin));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+
+value
+build_ocaml_grid_generator_system(const Grid_Generator_System& ppl_ggs) {
+ CAMLparam0();
+ CAMLlocal2(result, new_tail);
+ result = Val_emptylist;
+ for (Grid_Generator_System::const_iterator v_begin = ppl_ggs.begin(),
+ v_end = ppl_ggs.end(); v_begin != v_end; ++v_begin) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, build_ocaml_grid_generator(*v_begin));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+
+value
+build_ocaml_poly_con_relation(Poly_Con_Relation& r) {
+ CAMLparam0();
+ CAMLlocal2(result, cons);
+ result = Val_emptylist;
+ while (r != Poly_Con_Relation::nothing()) {
+ if (r.implies(Poly_Con_Relation::is_disjoint())) {
+ cons = caml_alloc_tuple(2);
+ Store_field(cons, 0, Val_int(0));
+ Store_field(cons, 1, result);
+ result = cons;
+ r = r - Poly_Con_Relation::is_disjoint();
+ }
+ else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+ cons = caml_alloc_tuple(2);
+ Store_field(cons, 0, Val_int(1));
+ Store_field(cons, 1, result);
+ result = cons;
+ r = r - Poly_Con_Relation::strictly_intersects();
+ }
+ else if (r.implies(Poly_Con_Relation::is_included())) {
+ cons = caml_alloc_tuple(2);
+ Store_field(cons, 0, Val_int(2));
+ Store_field(cons, 1, result);
+ result = cons;
+ r = r - Poly_Con_Relation::is_included();
+ }
+ else if (r.implies(Poly_Con_Relation::saturates())) {
+ cons = caml_alloc_tuple(2);
+ Store_field(cons, 0, Val_int(3));
+ Store_field(cons, 1, result);
+ result = cons;
+ r = r - Poly_Con_Relation::saturates();
+ }
+ }
+ CAMLreturn(result);
+}
+
+value
+build_ocaml_poly_gen_relation(Poly_Gen_Relation& r) {
+ CAMLparam0();
+ CAMLlocal2(result, cons);
+ result = Val_emptylist;
+ while (r != Poly_Gen_Relation::nothing()) {
+ if (r.implies(Poly_Gen_Relation::subsumes())) {
+ cons = caml_alloc_tuple(2);
+ Store_field(cons, 0, Val_int(0));
+ Store_field(cons, 1, result);
+ result = cons;
+ r = r - Poly_Gen_Relation::subsumes();
+ }
+ }
+ CAMLreturn(result);
+}
+
+Congruence
+build_ppl_Congruence(value c) {
+ value e1 = Field(c, 0);
+ value e2 = Field(c, 1);
+ mpz_class z(mpz_ptr_val(Field(c, 2)));
+ Linear_Expression lhs = build_ppl_Linear_Expression(e1);
+ Linear_Expression rhs = build_ppl_Linear_Expression(e2);
+ return (lhs %= rhs) / z;
+}
+
+Generator
+build_ppl_Generator(value g) {
+ switch (Tag_val(g)) {
+ case 0:
+ // Line
+ return Generator::line(build_ppl_Linear_Expression(Field(g, 0)));
+ case 1:
+ // Ray
+ return Generator::ray(build_ppl_Linear_Expression(Field(g, 0)));
+ case 2: {
+ // Point
+ mpz_class z(mpz_ptr_val(Field(g, 1)));
+ return Generator::point(build_ppl_Linear_Expression(Field(g, 0)),
+ Coefficient(z));
+ }
+ case 3: {
+ // Closure_point
+ mpz_class z(mpz_ptr_val(Field(g, 1)));
+ return Generator::closure_point(build_ppl_Linear_Expression(Field(g, 0)),
+ Coefficient(z));
+ }
+ default:
+ throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+ "error building PPL::Generator");
+ }
+}
+
+Grid_Generator
+build_ppl_Grid_Generator(value gg) {
+ switch (Tag_val(gg)) {
+ case 0:
+ // Line
+ return grid_line(build_ppl_Linear_Expression(Field(gg, 0)));
+ case 1: {
+ // Parameter
+ mpz_class z(mpz_ptr_val(Field(gg, 1)));
+ return parameter(build_ppl_Linear_Expression(Field(gg, 0)),
+ Coefficient(z));
+ }
+ case 2: {
+ // Point
+ mpz_class z(mpz_ptr_val(Field(gg, 1)));
+ return grid_point(build_ppl_Linear_Expression(Field(gg, 0)),
+ Coefficient(z));
+ }
+ default:
+ // We should not be here!
+ throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+ "error building PPL::Grid_Generator");
+ }
+}
+
+Constraint_System
+build_ppl_Constraint_System(value cl) {
+ Constraint_System cs;
+ while (cl != Val_emptylist) {
+ cs.insert(build_ppl_Constraint(Field(cl, 0)));
+ cl = Field(cl, 1);
+ }
+ return cs;
+}
+
+Generator_System
+build_ppl_Generator_System(value gl) {
+ Generator_System gs;
+ while (gl != Val_emptylist) {
+ gs.insert(build_ppl_Generator(Field(gl, 0)));
+ gl = Field(gl, 1);
+ }
+ return gs;
+}
+
+Congruence_System
+build_ppl_Congruence_System(value cgl) {
+ Congruence_System cgs;
+ while (cgl != Val_emptylist) {
+ cgs.insert(build_ppl_Congruence(Field(cgl, 0)));
+ cgl = Field(cgl, 1);
+ }
+ return cgs;
+}
+
+Grid_Generator_System
+build_ppl_Grid_Generator_System(value caml_ggs) {
+ Grid_Generator_System ggs;
+ while (caml_ggs != Val_emptylist) {
+ ggs.insert(build_ppl_Grid_Generator(Field(caml_ggs, 0)));
+ caml_ggs = Field(caml_ggs, 1);
+ }
+ return ggs;
+}
+
+//! Give access to the embedded MIP_Problem* in \p v.
+inline MIP_Problem*&
+p_MIP_Problem_val(value v) {
+ return *reinterpret_cast<MIP_Problem**>(Data_custom_val(v));
+}
+
+void
+custom_MIP_Problem_finalize(value v) {
+ delete p_MIP_Problem_val(v);
+}
+
+static struct custom_operations MIP_Problem_custom_operations = {
+ "com.bugseng.ppl" "." PPL_VERSION "." "MIP_Problem",
+ custom_MIP_Problem_finalize,
+ custom_compare_default,
+ custom_hash_default,
+ custom_serialize_default,
+ custom_deserialize_default,
+ custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_MIP_Problem(const MIP_Problem& ph) {
+ value v = caml_alloc_custom(&MIP_Problem_custom_operations,
+ sizeof(MIP_Problem*), 0, 1);
+ p_MIP_Problem_val(v) = const_cast<MIP_Problem*>(&ph);
+ return v;
+}
+
+//! Give access to the embedded PIP_Problem* in \p v.
+inline PIP_Problem*&
+p_PIP_Problem_val(value v) {
+ return *reinterpret_cast<PIP_Problem**>(Data_custom_val(v));
+}
+
+void
+custom_PIP_Problem_finalize(value v) {
+ delete p_PIP_Problem_val(v);
+}
+
+static struct custom_operations PIP_Problem_custom_operations = {
+ "com.bugseng.ppl" "." PPL_VERSION "." "PIP_Problem",
+ custom_PIP_Problem_finalize,
+ custom_compare_default,
+ custom_hash_default,
+ custom_serialize_default,
+ custom_deserialize_default,
+ custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_PIP_Problem(const PIP_Problem& ph) {
+ value v = caml_alloc_custom(&PIP_Problem_custom_operations,
+ sizeof(PIP_Problem*), 0, 1);
+ p_PIP_Problem_val(v) = const_cast<PIP_Problem*>(&ph);
+ return v;
+}
+
+// NOTE: the finalization of each PIP_Tree_Node object is delegated
+// to the owning PIP_Problem object, hence we should not provide a custom
+// finalization function (the default one is fine).
+// In principle, we could directly store a PIP_Tree_Node* in a Caml 'value':
+// the use of a Custom_tag block is anyway recommended by Caml manual.
+static struct custom_operations PIP_Tree_Node_custom_operations = {
+ "com.bugseng.ppl" "." PPL_VERSION "." "PIP_Tree_Node",
+ custom_finalize_default,
+ custom_compare_default,
+ custom_hash_default,
+ custom_serialize_default,
+ custom_deserialize_default,
+ custom_compare_ext_default
+};
+
+//! Give access to the embedded const PIP_Tree_Node* in \p v.
+inline const PIP_Tree_Node*&
+p_PIP_Tree_Node_val(value v) {
+ return *reinterpret_cast<const PIP_Tree_Node**>(Data_custom_val(v));
+}
+
+inline value
+unregistered_value_p_PIP_Tree_Node(const PIP_Tree_Node* pip_tree) {
+ value v = caml_alloc_custom(&PIP_Tree_Node_custom_operations,
+ sizeof(PIP_Tree_Node*), 0, 1);
+ p_PIP_Tree_Node_val(v) = pip_tree;
+ return v;
+}
+
+inline const PIP_Tree_Node*
+ppl_PIP_Tree_Node_get_child(const PIP_Tree_Node* parent, bool branch) {
+ if (parent == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_get_child(node):\n"
+ "node is bottom.");
+ if (const PIP_Decision_Node* ppl_dec = parent->as_decision())
+ return ppl_dec->child_node(branch);
+ else
+ throw std::invalid_argument("ppl_PIP_Tree_Node_get_child(node):\n"
+ "node is not a decision node (solution).");
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::OCaml;
+
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem_from_space_dimension(value d) try {
+ CAMLparam1(d);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ MIP_Problem& ppl_mip = *new MIP_Problem(dd);
+ CAMLreturn(unregistered_value_p_MIP_Problem(ppl_mip));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem(value d, value caml_cs, value caml_cost,
+ value caml_opt_mode) try {
+ CAMLparam4(d, caml_cs, caml_cost, caml_opt_mode);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ const Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs);
+ const Linear_Expression ppl_cost = build_ppl_Linear_Expression(caml_cost);
+ const Optimization_Mode ppl_opt_mode = build_ppl_opt_mode(caml_opt_mode);
+ MIP_Problem& ppl_mip = *new MIP_Problem(dd, ppl_cs, ppl_cost, ppl_opt_mode);
+ CAMLreturn(unregistered_value_p_MIP_Problem(ppl_mip));
+}
+CATCH_ALL
+
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_space_dimension(value ph) try {
+ CAMLparam1(ph);
+ const MIP_Problem& pph = *p_MIP_Problem_val(ph);
+ dimension_type d = pph.space_dimension();
+ CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_integer_space_dimensions(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ CAMLlocal2(result, new_tail);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ const Variables_Set& ppl_ivars = ppl_mip.integer_space_dimensions();
+ result = Val_emptylist;
+ for (Variables_Set::const_reverse_iterator i = ppl_ivars.rbegin(),
+ i_end = ppl_ivars.rend(); i != i_end; ++i) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, ppl_dimension_to_value(*i));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_constraints(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ const MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ Constraint_System cs;
+ for (MIP_Problem::const_iterator cs_it = ppl_mip.constraints_begin(),
+ cs_end = ppl_mip.constraints_end(); cs_it != cs_end; ++cs_it) {
+ cs.insert(*cs_it);
+ }
+ CAMLreturn(build_ocaml_constraint_system(cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_space_dimensions_and_embed(value caml_mip, value dim) try {
+ CAMLparam2(caml_mip, dim);
+ const dimension_type ppl_dim = value_to_ppl_dimension(dim);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.add_space_dimensions_and_embed(ppl_dim);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_to_integer_space_dimensions(value caml_mip,
+ value caml_ivars) try {
+ CAMLparam2(caml_mip, caml_ivars);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.add_to_integer_space_dimensions(build_ppl_Variables_Set(caml_ivars));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_constraint(value caml_mip,
+ value caml_constraint) try {
+ CAMLparam2(caml_mip, caml_constraint);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.add_constraint(build_ppl_Constraint(caml_constraint));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_constraints(value caml_mip,
+ value caml_constraints) try {
+ CAMLparam2(caml_mip, caml_constraints);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.add_constraints(build_ppl_Constraint_System(caml_constraints));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_objective_function(value caml_mip,
+ value caml_cost) try {
+ CAMLparam2(caml_mip, caml_cost);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.set_objective_function(build_ppl_Linear_Expression(caml_cost));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_is_satisfiable(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ CAMLreturn(ppl_mip.is_satisfiable());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_solve(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ MIP_Problem_Status mip_status = ppl_mip.solve();
+ switch (mip_status) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ CAMLreturn(Val_int(0));
+ case UNBOUNDED_MIP_PROBLEM:
+ CAMLreturn(Val_int(1));
+ case OPTIMIZED_MIP_PROBLEM:
+ CAMLreturn(Val_int(2));
+ }
+ PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimization_mode(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ Optimization_Mode opt_mode = ppl_mip.optimization_mode();
+ switch (opt_mode) {
+ case MINIMIZATION:
+ CAMLreturn(Val_int(0));
+ case MAXIMIZATION:
+ CAMLreturn(Val_int(1));
+ }
+ PPL_UNREACHABLE;
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_control_parameter(value caml_mip,
+ value caml_cp_value) try {
+ CAMLparam2(caml_mip, caml_cp_value);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ MIP_Problem::Control_Parameter_Value ppl_cp_value
+ = build_ppl_control_parameter_value(caml_cp_value);
+ ppl_mip.set_control_parameter(ppl_cp_value);
+ CAMLreturn(Val_unit);
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_get_control_parameter(value caml_mip,
+ value caml_cp_name) try {
+ CAMLparam2(caml_mip, caml_cp_name);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ MIP_Problem::Control_Parameter_Name ppl_cp_name
+ = build_ppl_mip_problem_control_parameter_name(caml_cp_name);
+ MIP_Problem::Control_Parameter_Value ppl_cp_value
+ = ppl_mip.get_control_parameter(ppl_cp_name);
+ switch (ppl_cp_value) {
+ case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+ CAMLreturn(Val_int(0));
+ case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+ CAMLreturn(Val_int(1));
+ case MIP_Problem::PRICING_TEXTBOOK:
+ CAMLreturn(Val_int(2));
+ }
+ PPL_UNREACHABLE;
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_feasible_point(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ CAMLreturn(build_ocaml_generator(ppl_mip.feasible_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimizing_point(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ CAMLreturn(build_ocaml_generator(ppl_mip.optimizing_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimal_value(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ CAMLlocal1(caml_return_value);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ ppl_mip.optimal_value(num, den);
+ caml_return_value = caml_alloc(2,0);
+ Store_field(caml_return_value, 0, build_ocaml_coefficient(num));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(den));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_evaluate_objective_function(value caml_mip,
+ value caml_generator) try {
+ CAMLparam2(caml_mip, caml_generator);
+ CAMLlocal1(caml_return_value);
+ Generator g = build_ppl_Generator(caml_generator);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ PPL_DIRTY_TEMP_COEFFICIENT(num);
+ PPL_DIRTY_TEMP_COEFFICIENT(den);
+ ppl_mip.evaluate_objective_function(g, num, den);
+ caml_return_value = caml_alloc(2,0);
+ Store_field(caml_return_value, 0, build_ocaml_coefficient(num));
+ Store_field(caml_return_value, 1, build_ocaml_coefficient(den));
+ CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_OK(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ CAMLreturn(ppl_mip.OK());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_objective_function(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ CAMLlocal4(homogeneous_term, inhomogeneous_term, sum, coeff);
+ const MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ const Linear_Expression& ppl_obj_func = ppl_mip.objective_function();
+ homogeneous_term = get_linear_expression(ppl_obj_func);
+ inhomogeneous_term
+ = build_ocaml_coefficient(ppl_obj_func.inhomogeneous_term());
+ coeff = caml_alloc(1,1);
+ Store_field(coeff, 0, inhomogeneous_term);
+ sum = caml_alloc(2,4);
+ Store_field(sum, 0, homogeneous_term);
+ Store_field(sum, 1, coeff);
+ CAMLreturn(sum);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_clear(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.clear();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_optimization_mode(value caml_mip, value caml_opt_mode) try{
+ CAMLparam2(caml_mip, caml_opt_mode);
+ Optimization_Mode ppl_opt_mode= build_ppl_opt_mode(caml_opt_mode);
+ MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+ ppl_mip.set_optimization_mode(ppl_opt_mode);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_swap(value caml_mip1, value caml_mip2) try{
+ CAMLparam2(caml_mip1, caml_mip2);
+ MIP_Problem& ppl_mip1 = *p_MIP_Problem_val(caml_mip1);
+ MIP_Problem& ppl_mip2 = *p_MIP_Problem_val(caml_mip2);
+ swap(ppl_mip1, ppl_mip2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_ascii_dump(value caml_mip) try {
+ CAMLparam1(caml_mip);
+ MIP_Problem& mip = *p_MIP_Problem_val(caml_mip);
+ std::ostringstream s;
+ mip.ascii_dump(s);
+ CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_PIP_Problem_from_space_dimension(value d) try {
+ CAMLparam1(d);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ PIP_Problem& ppl_pip = *new PIP_Problem(dd);
+ CAMLreturn(unregistered_value_p_PIP_Problem(ppl_pip));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_PIP_Problem(value d, value caml_cs, value caml_vset) try {
+ CAMLparam3(d, caml_cs, caml_vset);
+ const dimension_type dd = value_to_ppl_dimension(d);
+ const Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs);
+ Variables_Set ppl_vset;
+ if (Int_val(caml_vset) == 0)
+ CAMLreturn(Val_unit);
+ while (true) {
+ ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+ if (Int_val(Field(caml_vset, 1)) == 0)
+ break;
+ caml_vset = Field(caml_vset, 1);
+ }
+ PIP_Problem& ppl_pip = *new PIP_Problem(dd, ppl_cs.begin(), ppl_cs.end(),
+ ppl_vset);
+ CAMLreturn(unregistered_value_p_PIP_Problem(ppl_pip));
+}
+CATCH_ALL
+
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_space_dimension(value pip) try {
+ CAMLparam1(pip);
+ const PIP_Problem& ppip = *p_PIP_Problem_val(pip);
+ const dimension_type d = ppip.space_dimension();
+ CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_parameter_space_dimensions(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ CAMLlocal2(result, new_tail);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ const Variables_Set& ppl_ivars = ppl_pip.parameter_space_dimensions();
+ result = Val_emptylist;
+ for (Variables_Set::const_reverse_iterator i = ppl_ivars.rbegin(),
+ i_end = ppl_ivars.rend(); i != i_end; ++i) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, ppl_dimension_to_value(*i));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_constraints(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ const PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ Constraint_System cs;
+ for (PIP_Problem::const_iterator cs_it = ppl_pip.constraints_begin(),
+ cs_end = ppl_pip.constraints_end(); cs_it != cs_end; ++cs_it) {
+ cs.insert(*cs_it);
+ }
+ CAMLreturn(build_ocaml_constraint_system(cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_space_dimensions_and_embed(value caml_pip,
+ value vdim, value pdim) try {
+ CAMLparam3(caml_pip, vdim, pdim);
+ dimension_type ppl_vdim = value_to_ppl_dimension(vdim);
+ dimension_type ppl_pdim = value_to_ppl_dimension(pdim);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.add_space_dimensions_and_embed(ppl_vdim, ppl_pdim);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_to_parameter_space_dimensions(value caml_pip,
+ value caml_ivars) try {
+ CAMLparam2(caml_pip, caml_ivars);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.add_to_parameter_space_dimensions
+ (build_ppl_Variables_Set(caml_ivars));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_constraint(value caml_pip,
+ value caml_constraint) try {
+ CAMLparam2(caml_pip, caml_constraint);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.add_constraint(build_ppl_Constraint(caml_constraint));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_constraints(value caml_pip,
+ value caml_constraints) try {
+ CAMLparam2(caml_pip, caml_constraints);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.add_constraints(build_ppl_Constraint_System(caml_constraints));
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_set_big_parameter_dimension(value caml_pip,
+ value caml_dim) try {
+ CAMLparam2(caml_pip, caml_dim);
+ const dimension_type ppl_dim = value_to_ppl_dimension(caml_dim);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.set_big_parameter_dimension(ppl_dim);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_get_big_parameter_dimension(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ dimension_type d = ppl_pip.get_big_parameter_dimension();
+ if (d == not_a_dimension())
+ throw std::invalid_argument("ppl_PIP_Problem_get_big_parameter_dimension"
+ "(pip):\n"
+ "big parameter dimension has not been set.");
+ CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_has_big_parameter_dimension(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ dimension_type d = ppl_pip.get_big_parameter_dimension();
+ CAMLreturn(Val_bool(d != not_a_dimension()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_is_satisfiable(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ CAMLreturn(ppl_pip.is_satisfiable());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_solve(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ PIP_Problem_Status pip_status = ppl_pip.solve();
+ switch (pip_status) {
+ case UNFEASIBLE_PIP_PROBLEM:
+ CAMLreturn(Val_int(0));
+ case OPTIMIZED_PIP_PROBLEM:
+ CAMLreturn(Val_int(1));
+ }
+ PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_set_control_parameter(value caml_pip,
+ value caml_cp_value) try {
+ CAMLparam2(caml_pip, caml_cp_value);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ PIP_Problem::Control_Parameter_Value ppl_cp_value
+ = build_ppl_pip_problem_control_parameter_value(caml_cp_value);
+ ppl_pip.set_control_parameter(ppl_cp_value);
+ CAMLreturn(Val_unit);
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_get_control_parameter(value caml_pip,
+ value caml_cp_name) try {
+ CAMLparam2(caml_pip, caml_cp_name);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ PIP_Problem::Control_Parameter_Name ppl_cp_name
+ = build_ppl_pip_problem_control_parameter_name(caml_cp_name);
+ PIP_Problem::Control_Parameter_Value ppl_cp_value
+ = ppl_pip.get_control_parameter(ppl_cp_name);
+ switch (ppl_cp_value) {
+ case PIP_Problem::CUTTING_STRATEGY_FIRST:
+ CAMLreturn(Val_int(0));
+ case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+ CAMLreturn(Val_int(1));
+ case PIP_Problem::CUTTING_STRATEGY_ALL:
+ CAMLreturn(Val_int(2));
+ case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+ CAMLreturn(Val_int(3));
+ case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+ CAMLreturn(Val_int(4));
+ default:
+ PPL_UNREACHABLE;
+ CAMLreturn(Val_int(5));
+ }
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_solution(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ const PIP_Tree_Node* ppl_node = ppl_pip.solution();
+ CAMLreturn(unregistered_value_p_PIP_Tree_Node(ppl_node));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_optimizing_solution(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ const PIP_Tree_Node* ppl_node = ppl_pip.optimizing_solution();
+ CAMLreturn(unregistered_value_p_PIP_Tree_Node(ppl_node));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_OK(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ CAMLreturn(Val_bool(ppl_pip.OK()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_clear(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+ ppl_pip.clear();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_swap(value caml_pip1, value caml_pip2) try{
+ CAMLparam2(caml_pip1, caml_pip2);
+ PIP_Problem& ppl_pip1 = *p_PIP_Problem_val(caml_pip1);
+ PIP_Problem& ppl_pip2 = *p_PIP_Problem_val(caml_pip2);
+ swap(ppl_pip1, ppl_pip2);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_ascii_dump(value caml_pip) try {
+ CAMLparam1(caml_pip);
+ PIP_Problem& pip = *p_PIP_Problem_val(caml_pip);
+ std::ostringstream s;
+ pip.ascii_dump(s);
+ CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+value
+build_ocaml_artificial_parameter(const PIP_Tree_Node::Artificial_Parameter&
+ ppl_artificial_parameter) {
+ CAMLparam0();
+ CAMLlocal1(caml_artificial_parameter);
+ caml_artificial_parameter = caml_alloc(2,0);
+ Store_field(caml_artificial_parameter, 0,
+ get_linear_expression(ppl_artificial_parameter));
+ const Coefficient& denominator = ppl_artificial_parameter.denominator();
+ Store_field(caml_artificial_parameter, 1,
+ build_ocaml_coefficient(denominator));
+ CAMLreturn(caml_artificial_parameter);
+}
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_constraints(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ if (ppl_node == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_constraints(node):\n"
+ "node is bottom.");
+ const Constraint_System& ppl_cs = ppl_node->constraints();
+ CAMLreturn(build_ocaml_constraint_system(ppl_cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_bottom(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ CAMLreturn(Val_bool(ppl_node == 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_solution(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ CAMLreturn(Val_bool(ppl_node != 0
+ && ppl_node->as_solution() != 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_decision(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ CAMLreturn(Val_bool(ppl_node != 0
+ && ppl_node->as_decision() != 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_artificials(value caml_node) try {
+ CAMLparam1(caml_node);
+ CAMLlocal2(result, new_tail);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ if (ppl_node == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_artificials(node):\n"
+ "node is bottom.");
+ for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+ v_begin = ppl_node->art_parameter_begin(),
+ v_end = ppl_node->art_parameter_end(); v_begin != v_end; ++v_begin) {
+ new_tail = caml_alloc_tuple(2);
+ Store_field(new_tail, 0, build_ocaml_artificial_parameter(*v_begin));
+ Store_field(new_tail, 1, result);
+ result = new_tail;
+ }
+ CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_OK(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ if (ppl_node == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_OK(node):\n"
+ "node is bottom.");
+ CAMLreturn(Val_bool(ppl_node->OK()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_ascii_dump(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ if (ppl_node == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_ascii_dump(node):\n"
+ "node is bottom.");
+ std::ostringstream s;
+ ppl_node->ascii_dump(s);
+ CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_parametric_values(value caml_node,
+ value caml_dim) try {
+ CAMLparam2(caml_node, caml_dim);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ if (ppl_node == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_get_parametric_values"
+ "(node, dim):\n"
+ "node is not a solution node (bottom).");
+ const PIP_Solution_Node* ppl_sol = ppl_node->as_solution();
+ if (ppl_sol == 0)
+ throw std::invalid_argument("ppl_PIP_Tree_Node_get_parametric_values"
+ "(node, dim):\n"
+ "node is not a solution node (decision).");
+ Variable var(Int_val(caml_dim));
+ const Linear_Expression& ppl_le = ppl_sol->parametric_values(var);
+ CAMLreturn(get_linear_expression(ppl_le));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_true_child(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ const PIP_Tree_Node* child = ppl_PIP_Tree_Node_get_child(ppl_node, true);
+ CAMLreturn(unregistered_value_p_PIP_Tree_Node(child));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_false_child(value caml_node) try {
+ CAMLparam1(caml_node);
+ const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+ const PIP_Tree_Node* child = ppl_PIP_Tree_Node_get_child(ppl_node, false);
+ CAMLreturn(unregistered_value_p_PIP_Tree_Node(child));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_major(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(version_major()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_minor(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(version_minor()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_revision(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(version_revision()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_beta(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(version_beta()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(caml_copy_string(version()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_banner(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(caml_copy_string(banner()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_io_wrap_string(value src,
+ value indent_depth,
+ value preferred_first_line_length,
+ value preferred_line_length) try {
+ CAMLparam4(src, indent_depth, preferred_first_line_length,
+ preferred_line_length);
+ unsigned cpp_indent_depth
+ = value_to_unsigned<unsigned>(indent_depth);
+ unsigned cpp_preferred_first_line_length
+ = value_to_unsigned<unsigned>(preferred_first_line_length);
+ unsigned cpp_preferred_line_length
+ = value_to_unsigned<unsigned>(preferred_line_length);
+ using IO_Operators::wrap_string;
+ CAMLreturn(caml_copy_string(wrap_string(String_val(src),
+ cpp_indent_depth,
+ cpp_preferred_first_line_length,
+ cpp_preferred_line_length
+ ).c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_bits(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(PPL_COEFFICIENT_BITS));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_is_bounded(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(std::numeric_limits<Coefficient>::is_bounded
+ ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_min(value unit) try {
+ CAMLparam1(unit);
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ const Coefficient& min = std::numeric_limits<Coefficient>::min();
+ CAMLreturn(build_ocaml_coefficient(min));
+ }
+ else
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_max(value unit) try {
+ CAMLparam1(unit);
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ const Coefficient& max = std::numeric_limits<Coefficient>::max();
+ CAMLreturn(build_ocaml_coefficient(max));
+ }
+ else
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_max_space_dimension(value unit) try {
+ CAMLparam1(unit);
+ dimension_type d = max_space_dimension();
+ CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Linear_Expression_is_zero(value ocaml_le) try {
+ CAMLparam1(ocaml_le);
+ CAMLreturn(build_ppl_Linear_Expression(ocaml_le).is_zero()
+ ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Linear_Expression_all_homogeneous_terms_are_zero(value ocaml_le) try {
+ CAMLparam1(ocaml_le);
+ CAMLreturn(build_ppl_Linear_Expression(ocaml_le).
+ all_homogeneous_terms_are_zero()
+ ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_rounding_for_PPL(value unit) try {
+ CAMLparam1(unit);
+ set_rounding_for_PPL();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_restore_pre_PPL_rounding(value unit) try {
+ CAMLparam1(unit);
+ restore_pre_PPL_rounding();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_irrational_precision(value unit) try {
+ CAMLparam1(unit);
+ CAMLreturn(Val_long(irrational_precision()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_irrational_precision(value p) try {
+ CAMLparam1(p);
+ unsigned cxx_p = value_to_unsigned<unsigned>(p);
+ set_irrational_precision(cxx_p);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_timeout(value time) try {
+ CAMLparam1(time);
+ // In case a timeout was already set.
+ reset_timeout();
+ unsigned cpp_time = value_to_unsigned<unsigned>(time);
+ static timeout_exception e;
+ using Parma_Polyhedra_Library::Watchdog;
+ p_timeout_object = new Watchdog(cpp_time, abandon_expensive_computations, e);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_reset_timeout(value unit) try {
+ CAMLparam1(unit);
+ reset_timeout();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_deterministic_timeout(value unscaled_weight, value scale) try {
+ CAMLparam2(unscaled_weight, scale);
+ // In case a timeout was already set.
+ reset_deterministic_timeout();
+ unsigned long cpp_unscaled_weight
+ = value_to_unsigned<unsigned long>(unscaled_weight);
+ unsigned cpp_scale = value_to_unsigned<unsigned>(scale);
+ static deterministic_timeout_exception e;
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+ p_deterministic_timeout_object
+ = new Weightwatch(Traits::compute_delta(cpp_unscaled_weight, cpp_scale),
+ abandon_expensive_computations, e);
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_reset_deterministic_timeout(value unit) try {
+ CAMLparam1(unit);
+ reset_deterministic_timeout();
+ CAMLreturn(Val_unit);
+}
+CATCH_ALL
diff --git a/interfaces/OCaml/ppl_ocaml_common_defs.hh b/interfaces/OCaml/ppl_ocaml_common_defs.hh
new file mode 100644
index 0000000..c6cde29
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common_defs.hh
@@ -0,0 +1,234 @@
+/* Domain-independent part of the OCaml interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_ocaml_common_defs_hh
+#define PPL_ppl_ocaml_common_defs_hh 1
+
+#include "ppl.hh"
+#include "interfaced_boxes.hh"
+#include "marked_pointers.hh"
+
+// Note: throw exception if the error is at the OCaml interface level.
+#define PPL_OCAML_UNEXPECTED \
+ throw std::runtime_error("PPL OCaml interface internal error")
+#define PPL_OCAML_UNEXPECTED_MSG(msg) \
+ throw std::runtime_error("PPL OCaml interface internal error:\n" msg)
+
+
+// OCaml include files.
+extern "C" {
+
+#define CAML_NAME_SPACE
+#include "caml/mlvalues.h"
+#include "caml/memory.h"
+#include "caml/custom.h"
+#include "caml/fail.h"
+#include "caml/callback.h"
+#include "caml/alloc.h"
+#undef CAML_NAME_SPACE
+
+} // extern "C"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+template <typename U_Int>
+U_Int value_to_unsigned(value v);
+
+value
+ppl_dimension_to_value(dimension_type dim);
+
+dimension_type
+value_to_ppl_dimension(value dim);
+
+Variable
+build_ppl_Variable(value var);
+
+Degenerate_Element
+build_ppl_Degenerate_Element(value de);
+
+Complexity_Class
+build_ppl_Complexity_Class(value cc);
+
+Relation_Symbol
+build_ppl_relsym(value caml_relsym);
+
+Bounded_Integer_Type_Overflow
+build_ppl_bounded_integer_type_overflow(value caml_oflow);
+
+Bounded_Integer_Type_Representation
+build_ppl_bounded_integer_type_representation(value caml_rep);
+
+Bounded_Integer_Type_Width
+build_ppl_bounded_integer_type_width(value caml_width);
+
+Coefficient
+build_ppl_Coefficient(value coeff);
+
+Variable
+build_ppl_Variable(value caml_var);
+
+Variables_Set
+build_ppl_Variables_Set(value caml_vset);
+
+Linear_Expression
+build_ppl_Linear_Expression(value e);
+
+Constraint
+build_ppl_Constraint(value c);
+
+Congruence
+build_ppl_Congruence(value c);
+
+Generator
+build_ppl_Generator(value g);
+
+Grid_Generator
+build_ppl_Grid_Generator(value gg);
+
+Constraint_System
+build_ppl_Constraint_System(value cl);
+
+Congruence_System
+build_ppl_Congruence_System(value cgl);
+
+Generator_System
+build_ppl_Generator_System(value gl);
+
+Grid_Generator_System
+build_ppl_Grid_Generator_System(value ggs);
+
+value
+build_ocaml_poly_con_relation(Poly_Con_Relation& r);
+
+value
+build_ocaml_poly_gen_relation(Poly_Gen_Relation& r);
+
+value
+build_ocaml_coefficient(const Coefficient& c);
+
+value
+build_ocaml_constraint(const Constraint& c);
+
+value
+build_ocaml_congruence(const Congruence& cg);
+
+value
+build_ocaml_generator(const Generator& g);
+
+value
+build_ocaml_constraint_system(const Constraint_System& cs);
+
+value
+build_ocaml_congruence_system(const Congruence_System& cgs);
+
+value
+build_ocaml_grid_generator(const Grid_Generator& gg);
+
+value
+build_ocaml_generator_system(const Generator_System& gs);
+
+value
+build_ocaml_grid_generator_system(const Grid_Generator_System& ggs);
+
+class timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+class deterministic_timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+void reset_timeout();
+
+void reset_deterministic_timeout();
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#define CATCH_ALL \
+catch(std::bad_alloc&) { \
+ caml_raise_out_of_memory(); \
+} \
+catch(std::invalid_argument& e) { \
+ caml_invalid_argument(const_cast<char*>(e.what())); \
+} \
+catch(std::overflow_error& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_arithmetic_overflow"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(std::domain_error& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_domain_error"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(std::length_error& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_length_error"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(std::logic_error& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_logic_error"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(std::runtime_error& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_internal_error"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(std::exception& e) { \
+ caml_raise_with_string(*caml_named_value("PPL_unknown_standard_exception"), \
+ (const_cast<char*>(e.what()))); \
+} \
+catch(timeout_exception&) { \
+ reset_timeout(); \
+ caml_raise_constant(*caml_named_value("PPL_timeout_exception")); \
+} \
+catch(deterministic_timeout_exception&) { \
+ reset_deterministic_timeout(); \
+ caml_raise_constant(*caml_named_value("PPL_timeout_exception")); \
+} \
+catch(...) { \
+ caml_raise_constant(*caml_named_value("PPL_unexpected_error")); \
+}
+
+#include "ppl_ocaml_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/OCaml/ppl_ocaml_common_inlines.hh b/interfaces/OCaml/ppl_ocaml_common_inlines.hh
new file mode 100644
index 0000000..ddfd0b5
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common_inlines.hh
@@ -0,0 +1,82 @@
+/* Domain-independent part of the OCaml interface: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_ocaml_common_inlines_hh
+#define PPL_ppl_ocaml_common_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+template <typename U_Int>
+U_Int
+value_to_unsigned(value v) {
+ // FIXME: check the following at compile time.
+ assert(std::numeric_limits<U_Int>::is_integer
+ && !std::numeric_limits<U_Int>::is_signed);
+ if (!Is_long(v)) {
+ const char* what = "PPL OCaml interface invalid argument error:\n"
+ "argument is not an integer (expecting a non-negative integer).";
+ throw std::invalid_argument(what);
+ }
+ intnat vv = Long_val(v);
+ if (vv < 0) {
+ const char* what = "PPL OCaml interface invalid argument error:\n"
+ "argument is negative (expecting a non-negative integer).";
+ throw std::invalid_argument(what);
+ }
+ const uintnat u_max = std::numeric_limits<U_Int>::max();
+ if (static_cast<uintnat>(vv) > u_max) {
+ const char* what = "PPL OCaml interface invalid argument:\n"
+ "argument value is too big (expecting a smaller non-negative integer).";
+ throw std::invalid_argument(what);
+ }
+ return static_cast<U_Int>(vv);
+}
+
+inline dimension_type
+value_to_ppl_dimension(value v) {
+ return value_to_unsigned<dimension_type>(v);
+}
+
+inline value
+ppl_dimension_to_value(dimension_type dim) {
+ // FIXME: what if this assertion fails?
+ assert(static_cast<uintnat>(dim) <= static_cast<uintnat>(Max_long));
+ return Val_long(dim);
+}
+
+inline Variable
+build_ppl_Variable(value caml_var) {
+ return Variable(value_to_ppl_dimension(caml_var));
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_ocaml_common_inlines_hh)
diff --git a/interfaces/OCaml/ppl_ocaml_globals.ml b/interfaces/OCaml/ppl_ocaml_globals.ml
new file mode 100644
index 0000000..1dd95b5
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.ml
@@ -0,0 +1,438 @@
+(* OCaml interface: domain-independent functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Gmp
+
+exception PPL_arithmetic_overflow of string
+let _ = Callback.register_exception "PPL_arithmetic_overflow"
+ (PPL_arithmetic_overflow "any string")
+
+exception PPL_timeout_exception
+let _ = Callback.register_exception "PPL_timeout_exception"
+ (PPL_timeout_exception)
+
+exception PPL_internal_error of string
+let _ = Callback.register_exception "PPL_internal_error"
+ (PPL_internal_error "any string")
+
+exception PPL_unknown_standard_exception of string
+let _ = Callback.register_exception "PPL_unknown_standard_exception"
+ (PPL_unknown_standard_exception "any string")
+
+exception PPL_unexpected_error of string
+let _ = Callback.register_exception "PPL_unexpected_error"
+ (PPL_unexpected_error "any string")
+
+type degenerate_element =
+ Universe
+ | Empty
+
+type linear_expression =
+ Variable of int
+ | Coefficient of Z.t
+ | Unary_Plus of linear_expression
+ | Unary_Minus of linear_expression
+ | Plus of linear_expression * linear_expression
+ | Minus of linear_expression * linear_expression
+ | Times of Z.t * linear_expression
+
+type linear_constraint =
+ Less_Than of linear_expression * linear_expression
+ | Less_Or_Equal of linear_expression * linear_expression
+ | Equal of linear_expression * linear_expression
+ | Greater_Than of linear_expression * linear_expression
+ | Greater_Or_Equal of linear_expression * linear_expression
+
+type linear_generator =
+ Line of linear_expression
+ | Ray of linear_expression
+ | Point of linear_expression * Z.t
+ | Closure_Point of linear_expression * Z.t
+
+type linear_grid_generator =
+ Grid_Line of linear_expression
+ | Grid_Parameter of linear_expression * Z.t
+ | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+ Subsumes
+
+type poly_con_relation =
+ Is_Disjoint
+ | Strictly_Intersects
+ | Is_Included
+ | Saturates
+
+type relation_with_congruence =
+ Is_Disjoint
+ | Strictly_Intersects
+ | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Note: the "_RS" suffix is to avoid name clashes with the declaration
+ of linear_constraint. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+ | Greater_Than_RS | Greater_Or_Equal_RS
+
+type bounded_integer_type_overflow = Overflow_Wraps
+ | Overflow_Undefined
+ | Overflow_Impossible
+
+type bounded_integer_type_representation = Unsigned
+ | Signed_2_Complement
+
+type bounded_integer_type_width = Bits_8
+ | Bits_16
+ | Bits_32
+ | Bits_64
+ | Bits_128
+
+type complexity_class = Polynomial_Complexity
+ | Simplex_Complexity
+ | Any_Complexity
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+ | Optimized_Mip_Problem
+
+type control_parameter_name = Pricing
+
+type control_parameter_value = Pricing_Steepest_Edge_Float
+ | Pricing_Steepest_Edge_Exact
+ | Pricing_Textbook
+
+type mip_problem
+
+external ppl_version_major:
+unit -> int = "ppl_version_major"
+
+external ppl_version_minor:
+unit -> int = "ppl_version_minor"
+
+external ppl_version_revision:
+unit -> int = "ppl_version_revision"
+
+external ppl_version_beta:
+unit -> int = "ppl_version_beta"
+
+external ppl_version:
+unit -> string = "ppl_version"
+
+external ppl_banner:
+unit -> string = "ppl_banner"
+
+external ppl_io_wrap_string:
+string -> int -> int -> int -> string = "ppl_io_wrap_string"
+
+external ppl_max_space_dimension:
+unit -> int = "ppl_max_space_dimension"
+
+external ppl_Coefficient_bits:
+unit -> int = "ppl_Coefficient_bits"
+
+external ppl_Coefficient_is_bounded:
+unit -> bool = "ppl_Coefficient_is_bounded"
+
+external ppl_Coefficient_max:
+unit -> Z.t = "ppl_Coefficient_max"
+
+external ppl_Coefficient_min:
+unit -> Z.t = "ppl_Coefficient_min"
+
+external ppl_Linear_Expression_is_zero:
+linear_expression -> bool = "ppl_Linear_Expression_is_zero"
+
+external ppl_Linear_Expression_all_homogeneous_terms_are_zero:
+linear_expression -> bool
+ = "ppl_Linear_Expression_all_homogeneous_terms_are_zero"
+
+external ppl_set_rounding_for_PPL:
+unit -> unit = "ppl_set_rounding_for_PPL"
+
+external ppl_restore_pre_PPL_rounding:
+unit -> unit = "ppl_restore_pre_PPL_rounding"
+
+external ppl_irrational_precision:
+unit -> int = "ppl_irrational_precision"
+
+external ppl_set_irrational_precision:
+int -> unit = "ppl_set_irrational_precision"
+
+external ppl_set_timeout:
+int -> unit = "ppl_set_timeout"
+
+external ppl_reset_timeout:
+unit -> unit = "ppl_reset_timeout"
+
+external ppl_set_deterministic_timeout:
+int -> int -> unit = "ppl_set_deterministic_timeout"
+
+external ppl_reset_deterministic_timeout:
+unit -> unit = "ppl_reset_deterministic_timeout"
+
+external ppl_new_MIP_Problem_from_space_dimension:
+ int -> mip_problem = "ppl_new_MIP_Problem_from_space_dimension"
+
+external ppl_new_MIP_Problem:
+ int -> constraint_system -> linear_expression
+ -> optimization_mode -> mip_problem
+ = "ppl_new_MIP_Problem"
+
+external ppl_MIP_Problem_space_dimension:
+ mip_problem -> int = "ppl_MIP_Problem_space_dimension"
+
+external ppl_MIP_Problem_integer_space_dimensions:
+ mip_problem -> int list = "ppl_MIP_Problem_integer_space_dimensions"
+
+external ppl_MIP_Problem_constraints:
+ mip_problem -> constraint_system = "ppl_MIP_Problem_constraints"
+
+external ppl_MIP_Problem_add_space_dimensions_and_embed:
+ mip_problem -> int -> unit
+ = "ppl_MIP_Problem_add_space_dimensions_and_embed"
+
+external ppl_MIP_Problem_add_to_integer_space_dimensions:
+ mip_problem -> int list -> unit
+ = "ppl_MIP_Problem_add_to_integer_space_dimensions"
+
+external ppl_MIP_Problem_add_constraint:
+ mip_problem -> linear_constraint -> unit
+ = "ppl_MIP_Problem_add_constraint"
+
+external ppl_MIP_Problem_add_constraints:
+ mip_problem -> constraint_system -> unit
+ = "ppl_MIP_Problem_add_constraints"
+
+external ppl_MIP_Problem_set_objective_function:
+ mip_problem -> linear_expression -> unit
+ = "ppl_MIP_Problem_set_objective_function"
+
+external ppl_MIP_Problem_is_satisfiable:
+ mip_problem -> bool
+ = "ppl_MIP_Problem_is_satisfiable"
+
+external ppl_MIP_Problem_solve:
+ mip_problem -> mip_problem_status
+ = "ppl_MIP_Problem_solve"
+
+external ppl_MIP_Problem_optimization_mode:
+ mip_problem -> optimization_mode
+ = "ppl_MIP_Problem_optimization_mode"
+
+external ppl_MIP_Problem_feasible_point:
+ mip_problem -> linear_generator
+ = "ppl_MIP_Problem_feasible_point"
+
+external ppl_MIP_Problem_optimizing_point:
+ mip_problem -> linear_generator
+ = "ppl_MIP_Problem_optimizing_point"
+
+external ppl_MIP_Problem_objective_function:
+ mip_problem -> linear_expression
+ = "ppl_MIP_Problem_objective_function"
+
+external ppl_MIP_Problem_optimal_value:
+ mip_problem -> Z.t * Z.t
+ = "ppl_MIP_Problem_optimal_value"
+
+external ppl_MIP_Problem_evaluate_objective_function:
+ mip_problem -> linear_generator -> Z.t * Z.t
+ = "ppl_MIP_Problem_evaluate_objective_function"
+
+external ppl_MIP_Problem_OK:
+ mip_problem -> bool
+ = "ppl_MIP_Problem_OK"
+
+external ppl_MIP_Problem_clear:
+ mip_problem -> unit
+ = "ppl_MIP_Problem_clear"
+
+external ppl_MIP_Problem_set_optimization_mode:
+ mip_problem -> optimization_mode -> unit
+ = "ppl_MIP_Problem_set_optimization_mode"
+
+external ppl_MIP_Problem_set_control_parameter:
+ mip_problem -> control_parameter_value -> unit
+ = "ppl_MIP_Problem_set_control_parameter"
+
+external ppl_MIP_Problem_get_control_parameter:
+ mip_problem -> control_parameter_name -> control_parameter_value
+ = "ppl_MIP_Problem_get_control_parameter"
+
+external ppl_MIP_Problem_swap:
+ mip_problem -> mip_problem -> unit
+ = "ppl_MIP_Problem_swap"
+
+external ppl_MIP_Problem_ascii_dump:
+ mip_problem -> string
+ = "ppl_MIP_Problem_ascii_dump"
+
+
+type pip_problem_status = Unfeasible_Pip_Problem
+ | Optimized_Pip_Problem
+
+type pip_problem_control_parameter_name = Cutting_Strategy | Pivot_Row_Strategy
+
+type pip_problem_control_parameter_value = Cutting_Strategy_First
+ | Cutting_Strategy_Deepest
+ | Cutting_Strategy_All
+ | Pivot_Row_Strategy_First
+ | Pivot_Row_Strategy_Max_Column
+
+type artificial_parameter = linear_expression * Z.t
+
+type pip_tree_node
+
+type pip_problem
+
+external ppl_new_PIP_Problem_from_space_dimension:
+ int -> pip_problem = "ppl_new_PIP_Problem_from_space_dimension"
+
+external ppl_new_PIP_Problem:
+ int -> constraint_system -> int list -> pip_problem
+ = "ppl_new_PIP_Problem"
+
+external ppl_PIP_Problem_space_dimension:
+ pip_problem -> int = "ppl_PIP_Problem_space_dimension"
+
+external ppl_PIP_Problem_parameter_space_dimensions:
+ pip_problem -> int list = "ppl_PIP_Problem_parameter_space_dimensions"
+
+external ppl_PIP_Problem_constraints:
+ pip_problem -> constraint_system = "ppl_PIP_Problem_constraints"
+
+external ppl_PIP_Problem_add_space_dimensions_and_embed:
+ pip_problem -> int -> int -> unit
+ = "ppl_PIP_Problem_add_space_dimensions_and_embed"
+
+external ppl_PIP_Problem_add_to_parameter_space_dimensions:
+ pip_problem -> int list -> unit
+ = "ppl_PIP_Problem_add_to_parameter_space_dimensions"
+
+external ppl_PIP_Problem_add_constraint:
+ pip_problem -> linear_constraint -> unit
+ = "ppl_PIP_Problem_add_constraint"
+
+external ppl_PIP_Problem_add_constraints:
+ pip_problem -> constraint_system -> unit
+ = "ppl_PIP_Problem_add_constraints"
+
+external ppl_PIP_Problem_is_satisfiable:
+ pip_problem -> bool
+ = "ppl_PIP_Problem_is_satisfiable"
+
+external ppl_PIP_Problem_solve:
+ pip_problem -> pip_problem_status
+ = "ppl_PIP_Problem_solve"
+
+external ppl_PIP_Problem_solution:
+ pip_problem -> pip_tree_node
+ = "ppl_PIP_Problem_solution"
+
+external ppl_PIP_Problem_optimizing_solution:
+ pip_problem -> pip_tree_node
+ = "ppl_PIP_Problem_optimizing_solution"
+
+external ppl_PIP_Problem_get_big_parameter_dimension:
+ pip_problem -> int = "ppl_PIP_Problem_get_big_parameter_dimension"
+
+external ppl_PIP_Problem_has_big_parameter_dimension:
+ pip_problem -> bool = "ppl_PIP_Problem_has_big_parameter_dimension"
+
+external ppl_PIP_Problem_set_big_parameter_dimension:
+ pip_problem -> int -> unit = "ppl_PIP_Problem_set_big_parameter_dimension"
+
+external ppl_PIP_Problem_OK:
+ pip_problem -> bool
+ = "ppl_PIP_Problem_OK"
+
+external ppl_PIP_Problem_clear:
+ pip_problem -> unit
+ = "ppl_PIP_Problem_clear"
+
+external ppl_PIP_Problem_set_control_parameter:
+ pip_problem -> pip_problem_control_parameter_value -> unit
+ = "ppl_PIP_Problem_set_control_parameter"
+
+external ppl_PIP_Problem_get_control_parameter:
+ pip_problem -> pip_problem_control_parameter_name
+ -> pip_problem_control_parameter_value
+ = "ppl_PIP_Problem_get_control_parameter"
+
+external ppl_PIP_Problem_swap:
+ pip_problem -> pip_problem -> unit
+ = "ppl_PIP_Problem_swap"
+
+external ppl_PIP_Problem_ascii_dump:
+ pip_problem -> string
+ = "ppl_PIP_Problem_ascii_dump"
+
+external ppl_PIP_Tree_Node_constraints:
+ pip_tree_node -> constraint_system
+ = "ppl_PIP_Tree_Node_constraints"
+
+external ppl_PIP_Tree_Node_artificials:
+ pip_tree_node -> artificial_parameter list
+ = "ppl_PIP_Tree_Node_artificials"
+
+external ppl_PIP_Tree_Node_OK:
+ pip_tree_node -> bool
+ = "ppl_PIP_Tree_Node_OK"
+
+external ppl_PIP_Tree_Node_ascii_dump:
+ pip_tree_node -> string
+ = "ppl_PIP_Tree_Node_ascii_dump"
+
+external ppl_PIP_Tree_Node_is_bottom:
+ pip_tree_node -> bool
+ = "ppl_PIP_Tree_Node_is_bottom"
+
+external ppl_PIP_Tree_Node_is_solution:
+ pip_tree_node -> bool
+ = "ppl_PIP_Tree_Node_is_solution"
+
+external ppl_PIP_Tree_Node_parametric_values:
+ pip_tree_node -> int -> linear_expression
+ = "ppl_PIP_Tree_Node_parametric_values"
+
+external ppl_PIP_Tree_Node_is_decision:
+ pip_tree_node -> bool
+ = "ppl_PIP_Tree_Node_is_decision"
+
+external ppl_PIP_Tree_Node_true_child:
+ pip_tree_node -> pip_tree_node
+ = "ppl_PIP_Tree_Node_true_child"
+
+external ppl_PIP_Tree_Node_false_child:
+ pip_tree_node -> pip_tree_node
+ = "ppl_PIP_Tree_Node_false_child"
diff --git a/interfaces/OCaml/ppl_ocaml_globals.mli b/interfaces/OCaml/ppl_ocaml_globals.mli
new file mode 100644
index 0000000..f387e41
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.mli
@@ -0,0 +1,376 @@
+(* OCaml interface: module inteface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Gmp
+
+exception PPL_arithmetic_overflow of string
+exception PPL_timeout_exception
+exception PPL_internal_error of string
+exception PPL_unknown_standard_exception of string
+exception PPL_unexpected_error of string
+
+type degenerate_element =
+ Universe
+ | Empty
+
+type linear_expression =
+ Variable of int
+ | Coefficient of Z.t
+ | Unary_Plus of linear_expression
+ | Unary_Minus of linear_expression
+ | Plus of linear_expression * linear_expression
+ | Minus of linear_expression * linear_expression
+ | Times of Z.t * linear_expression
+
+type linear_constraint =
+ Less_Than of linear_expression * linear_expression
+ | Less_Or_Equal of linear_expression * linear_expression
+ | Equal of linear_expression * linear_expression
+ | Greater_Than of linear_expression * linear_expression
+ | Greater_Or_Equal of linear_expression * linear_expression
+
+type linear_generator =
+ Line of linear_expression
+ | Ray of linear_expression
+ | Point of linear_expression * Z.t
+ | Closure_Point of linear_expression * Z.t
+
+type linear_grid_generator =
+ Grid_Line of linear_expression
+ | Grid_Parameter of linear_expression * Z.t
+ | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+ Subsumes
+
+type poly_con_relation =
+ Is_Disjoint
+ | Strictly_Intersects
+ | Is_Included
+ | Saturates
+
+type relation_with_congruence =
+ Is_Disjoint
+ | Strictly_Intersects
+ | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Note: the "_RS" suffix is to avoid name clashes with the declaration
+ of linear_constraint. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+ | Greater_Than_RS | Greater_Or_Equal_RS
+
+type bounded_integer_type_overflow = Overflow_Wraps
+ | Overflow_Undefined
+ | Overflow_Impossible
+
+type bounded_integer_type_representation = Unsigned
+ | Signed_2_Complement
+
+type bounded_integer_type_width = Bits_8
+ | Bits_16
+ | Bits_32
+ | Bits_64
+ | Bits_128
+
+type complexity_class = Polynomial_Complexity
+ | Simplex_Complexity
+ | Any_Complexity
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+ | Optimized_Mip_Problem
+
+type control_parameter_name = Pricing
+
+type control_parameter_value = Pricing_Steepest_Edge_Float
+ | Pricing_Steepest_Edge_Exact
+ | Pricing_Textbook
+
+type pip_problem_status = Unfeasible_Pip_Problem
+ | Optimized_Pip_Problem
+
+type pip_problem_control_parameter_name = Cutting_Strategy | Pivot_Row_Strategy
+
+type pip_problem_control_parameter_value = Cutting_Strategy_First
+ | Cutting_Strategy_Deepest
+ | Cutting_Strategy_All
+ | Pivot_Row_Strategy_First
+ | Pivot_Row_Strategy_Max_Column
+
+val ppl_version_major:
+ unit -> int
+
+val ppl_version_minor:
+ unit -> int
+
+val ppl_version_revision:
+ unit -> int
+
+val ppl_version_beta:
+ unit -> int
+
+val ppl_version:
+ unit -> string
+
+val ppl_banner:
+ unit -> string
+
+val ppl_io_wrap_string:
+ string -> int -> int -> int -> string
+
+val ppl_max_space_dimension:
+ unit -> int
+
+val ppl_Coefficient_bits:
+ unit -> int
+
+val ppl_Coefficient_is_bounded:
+ unit -> bool
+
+val ppl_Coefficient_max:
+ unit -> Z.t
+
+val ppl_Coefficient_min:
+ unit -> Z.t
+
+val ppl_Linear_Expression_is_zero:
+ linear_expression -> bool
+
+val ppl_Linear_Expression_all_homogeneous_terms_are_zero:
+ linear_expression -> bool
+
+val ppl_set_rounding_for_PPL:
+ unit -> unit
+
+val ppl_restore_pre_PPL_rounding:
+ unit -> unit
+
+val ppl_irrational_precision:
+ unit -> int
+
+val ppl_set_irrational_precision:
+ int -> unit
+
+val ppl_set_timeout:
+ int -> unit
+
+val ppl_reset_timeout:
+ unit -> unit
+
+val ppl_set_deterministic_timeout:
+ int -> int -> unit
+
+val ppl_reset_deterministic_timeout:
+ unit -> unit
+
+type mip_problem
+
+val ppl_new_MIP_Problem_from_space_dimension:
+ int -> mip_problem
+
+val ppl_new_MIP_Problem:
+ int -> constraint_system -> linear_expression
+ -> optimization_mode -> mip_problem
+
+val ppl_MIP_Problem_space_dimension:
+ mip_problem -> int
+
+val ppl_MIP_Problem_integer_space_dimensions:
+ mip_problem -> int list
+
+val ppl_MIP_Problem_constraints:
+ mip_problem -> constraint_system
+
+val ppl_MIP_Problem_add_space_dimensions_and_embed:
+ mip_problem -> int -> unit
+
+val ppl_MIP_Problem_add_to_integer_space_dimensions:
+ mip_problem -> int list -> unit
+
+val ppl_MIP_Problem_add_constraint:
+ mip_problem -> linear_constraint -> unit
+
+val ppl_MIP_Problem_add_constraints:
+ mip_problem -> constraint_system -> unit
+
+val ppl_MIP_Problem_set_objective_function:
+ mip_problem -> linear_expression -> unit
+
+val ppl_MIP_Problem_is_satisfiable:
+ mip_problem -> bool
+
+val ppl_MIP_Problem_solve:
+ mip_problem -> mip_problem_status
+
+val ppl_MIP_Problem_optimization_mode:
+ mip_problem -> optimization_mode
+
+val ppl_MIP_Problem_feasible_point:
+ mip_problem -> linear_generator
+
+val ppl_MIP_Problem_optimizing_point:
+ mip_problem -> linear_generator
+
+val ppl_MIP_Problem_objective_function:
+ mip_problem -> linear_expression
+
+val ppl_MIP_Problem_optimal_value:
+ mip_problem -> Z.t * Z.t
+
+val ppl_MIP_Problem_evaluate_objective_function:
+ mip_problem -> linear_generator -> Z.t * Z.t
+
+val ppl_MIP_Problem_OK:
+ mip_problem -> bool
+
+val ppl_MIP_Problem_clear:
+ mip_problem -> unit
+
+val ppl_MIP_Problem_set_optimization_mode:
+ mip_problem -> optimization_mode -> unit
+
+val ppl_MIP_Problem_set_control_parameter:
+ mip_problem -> control_parameter_value -> unit
+
+val ppl_MIP_Problem_get_control_parameter:
+ mip_problem -> control_parameter_name -> control_parameter_value
+
+val ppl_MIP_Problem_swap:
+ mip_problem -> mip_problem -> unit
+
+val ppl_MIP_Problem_ascii_dump:
+ mip_problem -> string
+
+type pip_problem
+
+type pip_tree_node
+
+type artificial_parameter = linear_expression * Z.t
+
+val ppl_new_PIP_Problem_from_space_dimension:
+ int -> pip_problem
+
+val ppl_new_PIP_Problem:
+ int -> constraint_system -> int list -> pip_problem
+
+val ppl_PIP_Problem_space_dimension:
+ pip_problem -> int
+
+val ppl_PIP_Problem_parameter_space_dimensions:
+ pip_problem -> int list
+
+val ppl_PIP_Problem_constraints:
+ pip_problem -> constraint_system
+
+val ppl_PIP_Problem_add_space_dimensions_and_embed:
+ pip_problem -> int -> int -> unit
+
+val ppl_PIP_Problem_add_to_parameter_space_dimensions:
+ pip_problem -> int list -> unit
+
+val ppl_PIP_Problem_add_constraint:
+ pip_problem -> linear_constraint -> unit
+
+val ppl_PIP_Problem_add_constraints:
+ pip_problem -> constraint_system -> unit
+
+val ppl_PIP_Problem_is_satisfiable:
+ pip_problem -> bool
+
+val ppl_PIP_Problem_solve:
+ pip_problem -> pip_problem_status
+
+val ppl_PIP_Problem_solution:
+ pip_problem -> pip_tree_node
+
+val ppl_PIP_Problem_optimizing_solution:
+ pip_problem -> pip_tree_node
+
+val ppl_PIP_Problem_get_big_parameter_dimension:
+ pip_problem -> int
+
+val ppl_PIP_Problem_set_big_parameter_dimension:
+ pip_problem -> int -> unit
+
+val ppl_PIP_Problem_has_big_parameter_dimension:
+ pip_problem -> bool
+
+val ppl_PIP_Problem_OK:
+ pip_problem -> bool
+
+val ppl_PIP_Problem_clear:
+ pip_problem -> unit
+
+val ppl_PIP_Problem_set_control_parameter:
+ pip_problem -> pip_problem_control_parameter_value -> unit
+
+val ppl_PIP_Problem_get_control_parameter:
+ pip_problem -> pip_problem_control_parameter_name
+ -> pip_problem_control_parameter_value
+
+val ppl_PIP_Problem_swap:
+ pip_problem -> pip_problem -> unit
+
+val ppl_PIP_Problem_ascii_dump:
+ pip_problem -> string
+
+val ppl_PIP_Tree_Node_constraints:
+ pip_tree_node -> constraint_system
+
+val ppl_PIP_Tree_Node_artificials:
+ pip_tree_node -> artificial_parameter list
+
+val ppl_PIP_Tree_Node_ascii_dump:
+ pip_tree_node -> string
+
+val ppl_PIP_Tree_Node_OK:
+ pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_is_bottom:
+ pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_is_solution:
+ pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_parametric_values:
+ pip_tree_node -> int -> linear_expression
+
+val ppl_PIP_Tree_Node_is_decision:
+ pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_true_child:
+ pip_tree_node -> pip_tree_node
+
+val ppl_PIP_Tree_Node_false_child:
+ pip_tree_node -> pip_tree_node
diff --git a/interfaces/OCaml/tests/Makefile.am b/interfaces/OCaml/tests/Makefile.am
new file mode 100644
index 0000000..20e0034
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.am
@@ -0,0 +1,176 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(srcdir)/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = \
+ $(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(CHECKER)
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_ocaml_procedure_generators.m4 \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+-cclib -lmlgmp -cclib -lmpfr \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+
+if ENABLE_SHARED
+
+BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl$(SHREXT)
+
+else !ENABLE_SHARED
+
+BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT)
+
+endif !ENABLE_SHARED
+
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+
+.ml.cmo:
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) $<
+
+.ml.cmx:
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) $<
+
+if HAVE_OCAMLC
+
+OCAMLC_TESTS = \
+test1 \
+ppl_ocaml_generated_test
+
+endif HAVE_OCAMLC
+
+if HAVE_OCAMLOPT
+
+OCAMLOPT_TESTS = \
+test1_opt \
+ppl_ocaml_generated_test_opt
+
+endif HAVE_OCAMLOPT
+
+TESTS = $(OCAMLC_TESTS) $(OCAMLOPT_TESTS)
+
+check_PROGRAMS = $(TESTS)
+
+test1_SOURCES = test1.ml
+
+test1$(EXEEXT): test1.cmo ../ppl_ocaml.cma
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ \
+ -cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+ ppl_ocaml.cma test1.cmo
+
+test1_opt_SOURCES = test1.ml
+
+test1_opt$(EXEEXT): test1.cmx ../ppl_ocaml.cmxa
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+ -cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+ ppl_ocaml.cmxa test1.cmx
+
+
+nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+
+nodist_ppl_ocaml_generated_test_opt_SOURCES = ppl_ocaml_generated_test.ml
+
+ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+ > $@
+
+ppl_ocaml_generated_test$(EXEEXT): \
+ppl_ocaml_generated_test.cmo ../ppl_ocaml.cma
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ \
+ -cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+ ppl_ocaml.cma ppl_ocaml_generated_test.cmo
+
+ppl_ocaml_generated_test_opt$(EXEEXT): \
+ppl_ocaml_generated_test.cmx ../ppl_ocaml.cmxa
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+ -cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+ ppl_ocaml.cmxa ppl_ocaml_generated_test.cmx
+
+MOSTLYCLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1.cmx \
+test1.o \
+test1 \
+test1_opt \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test.cmx \
+ppl_ocaml_generated_test.o \
+ppl_ocaml_generated_test \
+ppl_ocaml_generated_test_opt
+
+CLEANFILES = ppl_ocaml_generated_test.ml
+
+../ppl_ocaml.cma:
+ $(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cma
+
+../ppl_ocaml.cmxa:
+ $(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cmxa
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
diff --git a/interfaces/OCaml/tests/Makefile.in b/interfaces/OCaml/tests/Makefile.in
new file mode 100644
index 0000000..f67cc01
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.in
@@ -0,0 +1,1188 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+check_PROGRAMS = $(am__EXEEXT_3)
+subdir = interfaces/OCaml/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at HAVE_OCAMLC_TRUE@am__EXEEXT_1 = test1$(EXEEXT) \
+ at HAVE_OCAMLC_TRUE@ ppl_ocaml_generated_test$(EXEEXT)
+ at HAVE_OCAMLOPT_TRUE@am__EXEEXT_2 = test1_opt$(EXEEXT) \
+ at HAVE_OCAMLOPT_TRUE@ ppl_ocaml_generated_test_opt$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+nodist_ppl_ocaml_generated_test_OBJECTS =
+ppl_ocaml_generated_test_OBJECTS = \
+ $(nodist_ppl_ocaml_generated_test_OBJECTS)
+ppl_ocaml_generated_test_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+nodist_ppl_ocaml_generated_test_opt_OBJECTS =
+ppl_ocaml_generated_test_opt_OBJECTS = \
+ $(nodist_ppl_ocaml_generated_test_opt_OBJECTS)
+ppl_ocaml_generated_test_opt_LDADD = $(LDADD)
+am_test1_OBJECTS =
+test1_OBJECTS = $(am_test1_OBJECTS)
+test1_LDADD = $(LDADD)
+am_test1_opt_OBJECTS =
+test1_opt_OBJECTS = $(am_test1_opt_OBJECTS)
+test1_opt_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(nodist_ppl_ocaml_generated_test_SOURCES) \
+ $(nodist_ppl_ocaml_generated_test_opt_SOURCES) \
+ $(test1_SOURCES) $(test1_opt_SOURCES)
+DIST_SOURCES = $(test1_SOURCES) $(test1_opt_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(srcdir)/valgrind_suppressions
+
+TESTS_ENVIRONMENT = \
+ $(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(CHECKER)
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_ocaml_procedure_generators.m4 \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+-cclib -lmlgmp -cclib -lmpfr \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+ at ENABLE_SHARED_FALSE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT)
+ at ENABLE_SHARED_TRUE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl$(SHREXT)
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+ at HAVE_OCAMLC_TRUE@OCAMLC_TESTS = \
+ at HAVE_OCAMLC_TRUE@test1 \
+ at HAVE_OCAMLC_TRUE@ppl_ocaml_generated_test
+
+ at HAVE_OCAMLOPT_TRUE@OCAMLOPT_TESTS = \
+ at HAVE_OCAMLOPT_TRUE@test1_opt \
+ at HAVE_OCAMLOPT_TRUE@ppl_ocaml_generated_test_opt
+
+test1_SOURCES = test1.ml
+test1_opt_SOURCES = test1.ml
+nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+nodist_ppl_ocaml_generated_test_opt_SOURCES = ppl_ocaml_generated_test.ml
+MOSTLYCLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1.cmx \
+test1.o \
+test1 \
+test1_opt \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test.cmx \
+ppl_ocaml_generated_test.o \
+ppl_ocaml_generated_test \
+ppl_ocaml_generated_test_opt
+
+CLEANFILES = ppl_ocaml_generated_test.ml
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cmo .cmx .log .ml .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/OCaml/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test1.log: test1$(EXEEXT)
+ @p='test1$(EXEEXT)'; \
+ b='test1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ppl_ocaml_generated_test.log: ppl_ocaml_generated_test$(EXEEXT)
+ @p='ppl_ocaml_generated_test$(EXEEXT)'; \
+ b='ppl_ocaml_generated_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test1_opt.log: test1_opt$(EXEEXT)
+ @p='test1_opt$(EXEEXT)'; \
+ b='test1_opt'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ppl_ocaml_generated_test_opt.log: ppl_ocaml_generated_test_opt$(EXEEXT)
+ @p='ppl_ocaml_generated_test_opt$(EXEEXT)'; \
+ b='ppl_ocaml_generated_test_opt'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+.ml.cmo:
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) $<
+
+.ml.cmx:
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) $<
+
+test1$(EXEEXT): test1.cmo ../ppl_ocaml.cma
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ \
+ -cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+ ppl_ocaml.cma test1.cmo
+
+test1_opt$(EXEEXT): test1.cmx ../ppl_ocaml.cmxa
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+ -cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+ ppl_ocaml.cmxa test1.cmx
+
+ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+ > $@
+
+ppl_ocaml_generated_test$(EXEEXT): \
+ppl_ocaml_generated_test.cmo ../ppl_ocaml.cma
+ $(OCAMLC_ENV) $(OCAMLC) -o $@ \
+ -cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+ ppl_ocaml.cma ppl_ocaml_generated_test.cmo
+
+ppl_ocaml_generated_test_opt$(EXEEXT): \
+ppl_ocaml_generated_test.cmx ../ppl_ocaml.cmxa
+ $(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+ -cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+ $(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+ ppl_ocaml.cmxa ppl_ocaml_generated_test.cmx
+
+../ppl_ocaml.cma:
+ $(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cma
+
+../ppl_ocaml.cmxa:
+ $(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cmxa
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
new file mode 100644
index 0000000..74cf925
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
@@ -0,0 +1,61 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+dnl
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+m4_include(`ppl_interface_generator_ocaml_test_ml_code.m4')
+dnl
+dnl This file generates ppl_ocaml_test.ml.
+
+dnl ==================================================================
+dnl Print name of domain being tested
+dnl ==================================================================
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+print_string_if_noisy "\n";;
+print_string_if_noisy "\n";;
+print_string_if_noisy "m4_current_interface";;
+print_string_if_noisy "\n";;
+m4_undefine(`m4_current_interface')`'dnl
+m4_replace_all_patterns($1, m4_add_init_class_code($1))`'dnl
+')
+
+dnl ==================================================================
+dnl Test all methods
+dnl ==================================================================
+
+m4_divert`'dnl
+m4_include(`ppl_ocaml_tests_common')
+m4_all_code`'dnl
+
+print_string_if_noisy "\n";;
+at_exit Gc.full_major;;
+print_string_if_noisy "Bye!\n"
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
new file mode 100644
index 0000000..56b4280
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
@@ -0,0 +1,967 @@
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+m4_divert(-1)
+
+dnl Code for generating the domain elements to be used in the tests.
+dnl Note that if a test may change these at all, then a copy should be used.
+m4_define(`m4_add_init_class_code', `dnl
+let @!TOPOLOGY@@!CLASS at 01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+ @!TOPOLOGY@@!CLASS at 01 @CONSTRAINER at s01;;
+let @!TOPOLOGY@@!CLASS at 02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+ @!TOPOLOGY@@!CLASS at 02 @CONSTRAINER at s02;;
+let @!TOPOLOGY@@!CLASS at 03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+ @!TOPOLOGY@@!CLASS at 03 @CONSTRAINER at s03;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension" ;;
+print_string_if_noisy "\n";;
+print_string_if_noisy ("space_dimension: ");;
+for i = 6 downto 0 do
+ (let @!TOPOLOGY@@!CLASS@
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension i Empty
+ in let dimension
+ = ppl_ at CLASS@_space_dimension(@!TOPOLOGY@@!CLASS@)
+ in (print_int_if_noisy dimension;
+ print_string_if_noisy "@COMMA@ "))
+done;;
+print_string_if_noisy "\n";;
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@: " ;;
+let ps
+ = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps1
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(ps);;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps1)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+print_string_if_noisy
+ "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity: " ;;
+print_string_if_noisy "\n";;
+let ps
+ = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps_pc
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Polynomial_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_pc)
+ then "with Polynomial_Complexity - success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let ps_sc
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Simplex_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_sc)
+ then "with Simplex_Complexity - success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let ps_ac
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Any_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_ac)
+ then "with Any_Complexity - success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s: " ;;
+let @!TOPOLOGY@@!CLASS@
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(@BUILD_REPRESENT at s1);;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS@)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at UB_EXACT@: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let _result
+ = ppl_ at CLASS@_ at UB_EXACT@ copy01 copy02;;
+let out
+ = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_swap: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_swap copy01 copy02;;
+let out
+ = if (u = () & ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at DIMENSION@: " ;;
+let dim
+ = ppl_ at CLASS@_ at DIMENSION@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@DIMENSION@: ";;
+print_int_if_noisy dim ;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@: " ;;
+let _result
+ = ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@
+ @!TOPOLOGY@@!CLASS at 01 @RELATION_REPRESENT at 1;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_get_ at CLASS_REPRESENT@s: ";;
+let @CLASS_REPRESENT at s = ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+List.iter print_ at CLASS_REPRESENT@ @CLASS_REPRESENT at s;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at HAS_PROPERTY@: ";;
+let result = ppl_ at CLASS@_ at HAS_PROPERTY@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@HAS_PROPERTY@: ";;
+print_bool_if_noisy result;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at SIMPLIFY@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at SIMPLIFY@ copy01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@: " ;;
+let _result
+ = ppl_ at CLASS@_bounds_from_above @!TOPOLOGY@@!CLASS at 01 e2;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MAXMIN@: ";;
+let (is_bounded, num, den, is_supremum)
+ = ppl_ at CLASS@_ at MAXMIN@ @!TOPOLOGY@@!CLASS at 01 e3;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy (", bound: ");;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy (", sup: ");;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MAXMIN@_with_point: ";;
+let (is_bounded, num, den, is_supremum, pt)
+ = ppl_ at CLASS@_ at MAXMIN@_with_point @!TOPOLOGY@@!CLASS at 01 e3;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy (", bound: ");;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy (", sup: ");;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy (", ");;
+print_generator(pt);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at COMPARISON@_ at CLASS@: " ;;
+let b = ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+ @!TOPOLOGY@@!CLASS at 01 @!TOPOLOGY@@!CLASS at 02;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+ & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_equals_ at CLASS@: " ;;
+let b = ppl_ at CLASS@_equals_ at CLASS@
+ @!TOPOLOGY@@!CLASS at 01 @!TOPOLOGY@@!CLASS at 02;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+ & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_OK: ";;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+ & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_ at CLASS_REPRESENT@: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_ at CLASS_REPRESENT@ copy01 @CLASS_REPRESENT at 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_ at CLASS_REPRESENT@s: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_ at CLASS_REPRESENT@s copy01 @CLASS_REPRESENT at s1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`
+print_string_if_noisy
+ "testing ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+ copy01 @REFINE_REPRESENT at 01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`
+print_string_if_noisy
+ "testing ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+ copy01 @REFINE_REPRESENT at s01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at BINOP@: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at BINOP@ copy01 copy02;;
+let out
+ = if (u = () & ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_simplify_using_context_assign: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let b = ppl_ at CLASS@_simplify_using_context_assign copy01 copy02;;
+let out
+ = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at AFFIMAGE@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at AFFIMAGE@ copy01 1 ((Z.of_int 2) */ v2) (Z.from_int 2);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_bounded_ at AFFIMAGE@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_bounded_ at AFFIMAGE@ copy01 1
+ ((Z.of_int 2) */ v2) v2 (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@
+ copy01 1 Equal_RS v1 (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+ copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+ copy01 1 Equal_RS v1 (Z.from_int 1) (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+ copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7) (Z.from_int 1);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@ copy01 2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_remove_space_dimensions: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_remove = [2;0];;
+let u = ppl_ at CLASS@_remove_space_dimensions copy01 dimensions_to_remove;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_remove_higher_space_dimensions: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_remove_higher_space_dimensions copy01 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_expand_space_dimension: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_expand_space_dimension copy01 1 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_fold_space_dimensions: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_fold = [1];;
+let u = ppl_ at CLASS@_fold_space_dimensions copy01 dimensions_to_fold 0;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_map_space_dimensions: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+let u = ppl_ at CLASS@_map_space_dimensions copy01 dimensions_to_map;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_constrains: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+ppl_ at CLASS@_constrains copy01 1;;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+ppl_ at CLASS@_map_space_dimensions copy01 dimensions_to_map;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_unconstrain_space_dimension: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_unconstrain_space_dimension copy01 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_unconstrain_space_dimensions: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_unconstrain = [1];;
+let u = ppl_ at CLASS@_unconstrain_space_dimensions
+ copy01 dimensions_to_unconstrain;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MEMBYTES@: " ;;
+let mb
+ = ppl_ at CLASS@_ at MEMBYTES@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@MEMBYTES@: ";;
+print_int_if_noisy mb;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at WIDEN@_widening_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at WIDEN@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+ = ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_widening_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_widening_assign_with_tokens_code: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+ = ppl_ at CLASS@_widening_assign_with_tokens copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+print_string_if_noisy
+ "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+ copy01 copy03 @CONSTRAINER at s04;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+print_string_if_noisy
+ "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+ = ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+ copy01 copy03 @CONSTRAINER at s04 10;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+ = ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+ copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after extrapolation = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign copy03 copy01 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign: ";;
+let copy01
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 03);;
+let u = ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign: ";;
+let copy01
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let copy03
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 03);;
+let u = ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign copy01 copy03 2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at BEGINEND@_iterator: " ;;
+let it = ppl_ at CLASS@_ at BEGINEND@_iterator @!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_iterator_equals_iterator: " ;;
+let it = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let b = ppl_ at CLASS@_iterator_equals_iterator it it_begin;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+print_string_if_noisy "testing ppl_new_ at CLASS@_iterator_from_iterator: " ;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_copy = ppl_new_ at CLASS@_iterator_from_iterator it_begin;;
+let b = ppl_ at CLASS@_iterator_equals_iterator it_copy it_begin;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at INCDEC@_iterator: " ;;
+let itb = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let ite = ppl_ at CLASS@_end_iterator @!CLASS at 01;;
+let it_end = ppl_ at CLASS@_end_iterator @!CLASS at 01;;
+let size = ppl_ at CLASS@_size @!CLASS at 01 in
+if (size > 0)
+ then (
+ ppl_ at CLASS@_increment_iterator itb;
+ ppl_ at CLASS@_decrement_iterator itb;
+ ppl_ at CLASS@_decrement_iterator ite;
+ ppl_ at CLASS@_increment_iterator ite;
+ );;
+let out = if ((ppl_ at CLASS@_OK @!CLASS at 01)
+ & (ppl_ at CLASS@_iterator_equals_iterator itb it_begin)
+ & (ppl_ at CLASS@_iterator_equals_iterator ite it_end))
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_get_disjunct: " ;;
+let it = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let d = ppl_ at CLASS@_get_disjunct it;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_disjunct: " ;;
+let copy01
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let it = ppl_ at CLASS@_begin_iterator copy01;;
+let u = ppl_ at CLASS@_drop_disjunct copy01 it;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_disjuncts: " ;;
+let copy01
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let it1 = ppl_ at CLASS@_begin_iterator copy01;;
+let it2 = ppl_ at CLASS@_begin_iterator copy01;;
+let u = ppl_ at CLASS@_drop_disjuncts copy01 it1 it2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ascii_dump: " ;;
+print_string_if_noisy (ppl_ at CLASS@_ascii_dump @!TOPOLOGY@@!CLASS at 01);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_linear_ at PARTITION@: " ;;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let (intsn, ptt)
+ = ppl_ at CLASS@_linear_partition copy01 copy02;;
+let out
+ = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_linear_ at PARTITION@: " ;;
+let copy01
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let copy02
+ = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let (intsn, ptt, is_finite)
+ = ppl_ at CLASS@_approximate_partition copy01 copy02;;
+let out
+ = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_some_non_integer_points: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_drop_some_non_integer_points copy01 Any_Complexity ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_some_non_integer_points: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_integer = [1];;
+let u = ppl_ at CLASS@_drop_some_non_integer_points_2 copy01 dimensions_integer Any_Complexity ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_wrap_assign: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_integer = [1];;
+let u = ppl_ at CLASS@_wrap_assign copy01 [] Bits_8 Unsigned Overflow_Wraps
+ [] 0 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+print_string_if_noisy
+ "testing ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let univ
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 2 Universe;;
+let u = ppl_ at CLASS@_concatenate_assign copy01 @!TOPOLOGY@@!CLASS at 01;;
+let result1 = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ univ;;
+let result2
+ = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ copy01;;
+let out = if (not result1 & not result2 & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+print_string_if_noisy
+ "testing ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2: ";;
+let copy01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 02);;
+let u = ppl_ at CLASS@_concatenate_assign copy02 @!TOPOLOGY@@!CLASS at 02;;
+let result1
+ = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 copy01 copy02;;
+let univ01
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 2 Universe;;
+let univ02
+ = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 4 Universe;;
+let result2
+ = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 univ01 univ02;;
+let out = if (not result1 & not result2 & ppl_ at CLASS@_OK copy01)
+ then "success" else "failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
diff --git a/interfaces/OCaml/tests/ppl_ocaml_tests_common b/interfaces/OCaml/tests/ppl_ocaml_tests_common
new file mode 100644
index 0000000..01efb26
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_ocaml_tests_common
@@ -0,0 +1,293 @@
+(* Common part of the OCaml generated tests. -*- Tuareg -*-
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let print_string_if_very_noisy = function str ->
+ let less_noisy = "LESS_NOISY"
+ in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+ with Not_found -> less_noisy
+ in
+ if (very_noisy != less_noisy)
+ then print_string str;
+;;
+
+let print_string_if_noisy = function str ->
+ let quiet = "QUIET"
+ in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+ with Not_found -> quiet
+ in
+ if (noisy != quiet)
+ then print_string str
+ else print_string_if_very_noisy str;
+;;
+
+let print_int_if_very_noisy = function num ->
+ let less_noisy = "LESS_NOISY"
+ in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+ with Not_found -> less_noisy
+ in
+ if (very_noisy != less_noisy)
+ then print_int num;
+;;
+
+let print_int_if_noisy = function num ->
+ let quiet = "QUIET"
+ in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+ with Not_found -> quiet
+ in
+ if (noisy != quiet)
+ then print_int num
+ else print_int_if_very_noisy num;
+;;
+
+let print_bool_if_very_noisy = function b ->
+ let less_noisy = "LESS_NOISY"
+ in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+ with Not_found -> less_noisy
+ in
+ if (very_noisy != less_noisy)
+ then printf "%b" b;
+;;
+
+let print_bool_if_noisy = function b ->
+ let quiet = "QUIET"
+ in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+ with Not_found -> quiet
+ in
+ if (noisy != quiet)
+ then printf "%b" b
+ else print_bool_if_very_noisy b;
+;;
+
+let rec print_linear_expression = function
+ Variable v ->
+ print_string_if_noisy "V(";
+ print_int_if_noisy v;
+ print_string_if_noisy ")";
+ | Coefficient c ->
+ print_int_if_noisy(Z.to_int c)
+ | Unary_Minus e ->
+ print_string_if_noisy "-(";
+ print_linear_expression e;
+ print_string_if_noisy ")";
+ | Unary_Plus e ->
+ print_linear_expression e
+ | Plus (e1, e2) ->
+ print_string_if_noisy "(";
+ print_linear_expression e1;
+ print_string_if_noisy " + ";
+ print_linear_expression e2;
+ print_string_if_noisy ")";
+ | Minus (e1, e2) ->
+ print_string_if_noisy "(";
+ print_linear_expression e1;
+ print_string_if_noisy " - ";
+ print_linear_expression e2;
+ print_string_if_noisy ")";
+ | Times (c, e) ->
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy "*(";
+ print_linear_expression e;
+ print_string_if_noisy ")";
+;;
+
+let print_constraint = function
+ Less_Than (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " < ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Less_Or_Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " <= ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " == ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Greater_Than (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " > ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Greater_Or_Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " >= ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+;;
+
+let print_generator = function
+ Ray (le1) ->
+ print_string_if_noisy "Ray: ";
+ print_linear_expression le1;
+ print_string_if_noisy ", ";
+ | Line (le1) ->
+ print_string_if_noisy "Line: ";
+ print_linear_expression le1;
+ print_string_if_noisy ", ";
+ | Point (le1, c) ->
+ print_string_if_noisy "Point: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";
+ | Closure_Point (le1, c) ->
+ print_string_if_noisy "Closure_Point: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";;
+
+let print_congruence = function x,y,z ->
+ print_linear_expression x;
+ print_string_if_noisy " %= ";
+ print_linear_expression y;
+ print_string_if_noisy " mod ";
+ print_int_if_noisy(Z.to_int z);
+ print_string_if_noisy ", ";;
+
+
+let print_grid_generator = function
+ | Grid_Line (le1) ->
+ print_string_if_noisy "Line: ";
+ print_linear_expression le1;
+ print_string_if_noisy ", ";
+ | Grid_Point (le1, c) ->
+ print_string_if_noisy "Point: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";
+ | Grid_Parameter (le1, c) ->
+ print_string_if_noisy "Parameter: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";;
+
+(* Build linear expressions the hard way. *)
+
+print_string_if_noisy "Build linear expressions manually:\n" ;;
+
+let rec v0 = Variable 0
+and v1 = Variable 1
+and v2 = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (v2, v2)
+and e2 = Times ((Z.from_int 7), v0)
+and e3 = Plus (n, v2)
+;;
+
+print_linear_expression v0; print_string_if_noisy "\n" ;;
+print_linear_expression v1; print_string_if_noisy "\n" ;;
+print_linear_expression v2; print_string_if_noisy "\n" ;;
+print_linear_expression n; print_string_if_noisy "\n" ;;
+print_linear_expression e1; print_string_if_noisy "\n" ;;
+print_linear_expression e2; print_string_if_noisy "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string_if_noisy "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times v2 e = Times (v2, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+ (Z.of_int 3) */ v0
+ +/
+ (Z.of_int 4) */ v1
+ -/
+ (linear_expression_of_int 7)
+;;
+
+print_linear_expression e3; print_string_if_noisy "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+ the Camlp4 preprocessor: see
+ http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e1 =/ n; e1 <=/ e1; e1 >=/ e1 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e1, (linear_expression_of_int 5), (Z.from_int 0)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+let grid_generators1 = [Grid_Point (e3, (Z.from_int 1))];;
+
+let mip1 = ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_string_if_noisy "\n";;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_string_if_noisy "\n";;
+print_int_if_noisy i;;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_string_if_noisy "\n";;
+List.iter print_constraint i;;
+
+let constraint01 = (v0 >=/ (linear_expression_of_int 1));;
+let constraints01 = [(v0 >=/ (linear_expression_of_int 1));
+ (v1 >=/ (linear_expression_of_int 1));
+ (v2 >=/ (linear_expression_of_int 1))];;
+let constraints02 = [(v0 <=/ (linear_expression_of_int 1));
+ (v1 >=/ (linear_expression_of_int 1))];;
+let constraints03 = [(v0 >=/ (linear_expression_of_int 2));
+ (v1 >=/ (linear_expression_of_int 1));
+ (v2 >=/ (linear_expression_of_int 1))];;
+let constraints04 = [(v0 >=/ (linear_expression_of_int 2))];;
+let congruence01 = (v0, (linear_expression_of_int 0), (Z.from_int 2));;
+let congruences01 = [(v0, (linear_expression_of_int 0), (Z.from_int 2));
+ (v1, (linear_expression_of_int 0), (Z.from_int 1));
+ (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences02 = [(v0, (linear_expression_of_int 1), (Z.from_int 3));
+ (v1, (linear_expression_of_int 0), (Z.from_int 1));
+ (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences03 = [(v0, (linear_expression_of_int 0), (Z.from_int 4));
+ (v1, (linear_expression_of_int 0), (Z.from_int 1));
+ (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences04 = [(v0, (linear_expression_of_int 0), (Z.from_int 4))];;
diff --git a/interfaces/OCaml/tests/test1.ml b/interfaces/OCaml/tests/test1.ml
new file mode 100644
index 0000000..184b4f1
--- /dev/null
+++ b/interfaces/OCaml/tests/test1.ml
@@ -0,0 +1,690 @@
+(* Simple program testing the PPL OCaml interface on a few random things.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let print_string_if_very_noisy = function str ->
+ let less_noisy = "LESS_NOISY"
+ in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+ with Not_found -> less_noisy
+ in
+ if (very_noisy != less_noisy)
+ then print_string str;
+;;
+
+let print_string_if_noisy = function str ->
+ let quiet = "QUIET"
+ in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+ with Not_found -> quiet
+ in
+ if (noisy != quiet)
+ then print_string str
+ else print_string_if_very_noisy str;
+;;
+
+let print_int_if_very_noisy = function num ->
+ let less_noisy = "LESS_NOISY"
+ in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+ with Not_found -> less_noisy
+ in
+ if (very_noisy != less_noisy)
+ then print_int num;
+;;
+
+let print_int_if_noisy = function num ->
+ let quiet = "QUIET"
+ in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+ with Not_found -> quiet
+ in
+ if (noisy != quiet)
+ then print_int num
+ else print_int_if_very_noisy num;
+;;
+
+let rec print_linear_expression = function
+ Variable v ->
+ print_string_if_noisy "V(";
+ print_int_if_noisy v;
+ print_string_if_noisy ")";
+ | Coefficient c ->
+ print_int_if_noisy(Z.to_int c)
+ | Unary_Minus e ->
+ print_string_if_noisy "-(";
+ print_linear_expression e;
+ print_string_if_noisy ")";
+ | Unary_Plus e ->
+ print_linear_expression e
+ | Plus (e1, e2) ->
+ print_string_if_noisy "(";
+ print_linear_expression e1;
+ print_string_if_noisy " + ";
+ print_linear_expression e2;
+ print_string_if_noisy ")";
+ | Minus (e1, e2) ->
+ print_string_if_noisy "(";
+ print_linear_expression e1;
+ print_string_if_noisy " - ";
+ print_linear_expression e2;
+ print_string_if_noisy ")";
+ | Times (c, e) ->
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy "*(";
+ print_linear_expression e;
+ print_string_if_noisy ")";
+;;
+
+let rec print_constraint = function
+ Less_Than (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " < ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Less_Or_Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " <= ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " == ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Greater_Than (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " > ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+ | Greater_Or_Equal (le1, le2) ->
+ print_linear_expression le1;
+ print_string_if_noisy " >= ";
+ print_linear_expression le2;
+ print_string_if_noisy ", ";
+;;
+
+let rec print_generator = function
+ Ray (le1) ->
+ print_string_if_noisy "Ray: ";
+ print_linear_expression le1;
+ print_string_if_noisy ", ";
+ | Line (le1) ->
+ print_string_if_noisy "Line: ";
+ print_linear_expression le1;
+ print_string_if_noisy ", ";
+ | Point (le1, c) ->
+ print_string_if_noisy "Point: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";
+| Closure_Point (le1, c) ->
+ print_string_if_noisy "Closure_Point: ";
+ print_linear_expression le1;
+ print_string_if_noisy " den: ";
+ print_int_if_noisy(Z.to_int c);
+ print_string_if_noisy ", ";;
+
+let print_congruence = function x,y,z ->
+ print_linear_expression x;
+ print_string_if_noisy " %= ";
+ print_linear_expression y;
+ print_string_if_noisy " mod ";
+ print_int_if_noisy(Z.to_int z);
+ print_string_if_noisy ", ";;
+
+let print_artificial_parameter = function x,y ->
+ print_linear_expression x;
+ print_string_if_noisy " / ";
+ print_int_if_noisy(Z.to_int y);
+ print_string_if_noisy ", ";;
+
+(* Build linear expressions the hard way. *)
+
+print_string_if_noisy "Build linear expressions manually:\n" ;;
+
+let rec a = Variable 0
+and b = Variable 1
+and c = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (c, c)
+and e2 = Times ((Z.from_int 7), a)
+and e3 = Plus (n, c)
+;;
+
+print_linear_expression a; print_string_if_noisy "\n" ;;
+print_linear_expression b; print_string_if_noisy "\n" ;;
+print_linear_expression c; print_string_if_noisy "\n" ;;
+print_linear_expression n; print_string_if_noisy "\n" ;;
+print_linear_expression e1; print_string_if_noisy "\n" ;;
+print_linear_expression e2; print_string_if_noisy "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string_if_noisy "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times c e = Times (c, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+ (Z.of_int 3) */ a
+ +/
+ (Z.of_int 4) */ b
+ -/
+ (linear_expression_of_int 7)
+;;
+print_linear_expression e3; print_string_if_noisy "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+ the Camlp4 preprocessor: see
+ http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e3 >=/ e1; e1 >=/ e2; e1 <=/ e2 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e3, e2 , (Z.from_int 20)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+
+let mip1 = ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_string_if_noisy "\n";;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_string_if_noisy "\n";;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_string_if_noisy "\n";;
+List.iter print_constraint i;;
+let i = ppl_MIP_Problem_get_control_parameter mip1 Pricing;;
+print_string_if_noisy "\n";;
+ppl_MIP_Problem_set_control_parameter mip1 Pricing_Textbook;;
+let i = ppl_MIP_Problem_get_control_parameter mip1 Pricing;;
+let out = if (i == Pricing_Textbook)
+ then "Control Parameter test succeeded"
+ else "Control Parameter test failed"
+ in (print_string_if_noisy out);;
+
+print_string_if_noisy "\n";;
+print_string_if_noisy ("space dimensions: ");;
+for i = 6 downto 0 do
+ let polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension i Empty
+ in let dimension = ppl_Polyhedron_space_dimension(polyhedron1)
+ in (print_int_if_noisy dimension;
+ print_string_if_noisy ", ")
+done;;
+print_string_if_noisy "\n";;
+
+let c1 = (a >=/ linear_expression_of_int 0);;
+let c2 = (a <=/ linear_expression_of_int 2);;
+let c2a = (a <=/ linear_expression_of_int 3);;
+let c3 = (b >=/ linear_expression_of_int 0);;
+let c4 = (b <=/ linear_expression_of_int 2);;
+let cs1 = [c1; c2; c3; c4];;
+let cs2 = [c1; c2a; c3; c4];;
+let poly1 = ppl_new_C_Polyhedron_from_constraints(cs1);;
+let poly2 = ppl_new_C_Polyhedron_from_constraints(cs2);;
+
+let polyhedron1 = ppl_new_C_Polyhedron_from_constraints(constraints1);;
+let polyhedron2 = ppl_new_C_Polyhedron_from_generators(generators1);;
+let result = ppl_Polyhedron_bounds_from_above polyhedron1 e2;;
+let p = Ppl_ocaml.ppl_new_C_Polyhedron_from_constraints [];;
+let u = Ppl_ocaml.ppl_Polyhedron_add_constraints p [];;
+let out = if (u == ())
+ then "ppl_Polyhedron_add_constraints returns unit"
+ else "ppl_Polyhedron_add_constraints does not return unit"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+
+ppl_Polyhedron_add_constraint polyhedron1 constraint1;;
+ppl_Polyhedron_add_generator polyhedron1 generator1;;
+let b = ppl_Polyhedron_is_disjoint_from_Polyhedron
+ polyhedron1 polyhedron2;;
+ppl_Polyhedron_concatenate_assign polyhedron1 polyhedron2;;
+let congruences = ppl_Polyhedron_get_congruences polyhedron1 in
+List.iter print_congruence congruences;;
+print_string_if_noisy "\n";;
+
+print_string_if_noisy "\nTesting affine transformations \n";;
+ppl_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_Polyhedron_affine_image polyhedron1 1 e1 (Z.from_int 10);;
+
+print_string_if_noisy "\nTesting widenings and extrapolations \n";;
+let tokens_l_BHRZ03 =
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+ polyhedron1 polyhedron1 constraints1 10;;
+let tokens_b_BHRZ03 =
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+ polyhedron1 polyhedron1 constraints1 10;;
+let tokens_b_H79 = ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+ polyhedron1 polyhedron1 constraints1 10;;
+let tokens_H79 = ppl_Polyhedron_H79_widening_assign_with_tokens poly2 poly1 2;;
+ppl_Polyhedron_H79_widening_assign polyhedron1 polyhedron1 ;;
+print_string_if_noisy "tokens b_H79 = ";;
+print_int_if_noisy tokens_b_H79;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens b_BHRZ03 = ";;
+print_int_if_noisy tokens_b_BHRZ03;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens H79 = ";;
+print_int_if_noisy tokens_H79;;
+print_string_if_noisy "\n";;
+
+let b = ppl_Polyhedron_OK polyhedron1;;
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+ polyhedron1 e1 Equal_RS e1;;
+ppl_Polyhedron_generalized_affine_image
+ polyhedron1 1 Equal_RS e2 (Z.from_int 10);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Testing minimization";;
+let is_bounded, num, den, is_supremum, gen
+ = ppl_Polyhedron_minimize_with_point polyhedron1 e3;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Value: ";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy ", is_bounded: ";;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy ", is_supremum: ";;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy ", generator: ";;
+print_generator(gen);;
+print_string_if_noisy "\n";;
+let dimensions_to_remove = [3;0];;
+ppl_Polyhedron_remove_space_dimensions polyhedron1 dimensions_to_remove;;
+let dimensions_to_fold = [1];;
+ppl_Polyhedron_fold_space_dimensions polyhedron1 dimensions_to_fold 0;;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+let i = ppl_Polyhedron_space_dimension polyhedron1;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Space dimension is: ";
+print_int_if_noisy i;;
+print_string_if_noisy "\n";;
+ppl_Polyhedron_map_space_dimensions polyhedron1 dimensions_to_map;;
+ppl_Polyhedron_constrains polyhedron1 1;;
+ppl_Polyhedron_unconstrain_space_dimension polyhedron1 1;;
+let dimensions_to_unconstrain = [1];;
+ppl_Polyhedron_unconstrain_space_dimensions
+ polyhedron1 dimensions_to_unconstrain;;
+print_string_if_noisy "\n";;
+ppl_Polyhedron_swap polyhedron1 polyhedron2;;
+let result = ppl_Polyhedron_simplify_using_context_assign
+ polyhedron1 polyhedron2;;
+let c_polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_Polyhedron_get_minimized_constraints c_polyhedron1;;
+let cs_size = List.length constraints;;
+print_string_if_noisy "\nSize of minimized constraints get from a C_Polyhedron built from Universe : ";;
+print_int_if_noisy(cs_size);;
+let nnc_polyhedron1 = ppl_new_NNC_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_Polyhedron_get_minimized_constraints nnc_polyhedron1;;
+let cs_size = List.length constraints;;
+print_string_if_noisy "\nSize of minimized constraints get from a NNC_Polyhedron built from Universe : ";;
+print_int_if_noisy(cs_size);;
+ppl_set_rounding_for_PPL ();;
+ppl_restore_pre_PPL_rounding ();;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Major version is: ";
+print_int_if_noisy(ppl_version_major ());;
+print_string_if_noisy ", minor version is: ";
+print_int_if_noisy(ppl_version_minor ());;
+print_string_if_noisy ", revision is: ";
+print_int_if_noisy(ppl_version_revision ());;
+print_string_if_noisy ", beta is: ";
+print_int_if_noisy(ppl_version_beta ());;
+print_string_if_noisy "\n";;
+let v = ppl_version ();;
+print_string_if_noisy "Version is: ";
+print_string_if_noisy(v);;
+let b = ppl_banner ();;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Banner is: ";
+print_string_if_noisy(b);;
+print_string_if_noisy "\n\n";;
+print_string_if_noisy "PPL Coefficient integer datatype is " ;;
+if (ppl_Coefficient_is_bounded())
+then print_string_if_noisy "bounded\n"
+else print_string_if_noisy "unbounded\n" ;;
+print_string_if_noisy "Maximum space dimension is: ";
+let i = ppl_max_space_dimension()
+in print_int_if_noisy i;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Irrational precision is: ";
+let p = ppl_irrational_precision()
+in print_int_if_noisy(p);;
+print_string_if_noisy "\n";;
+
+(* Testing exceptions *)
+try
+ let _ = ppl_new_MIP_Problem_from_space_dimension (-10)
+ in print_string_if_noisy "Exception test failed"
+with Invalid_argument what ->
+ print_string_if_noisy "Exception test succeeded; caught exception is:\n";
+ print_string_if_noisy what;
+ print_string_if_noisy "\n";;
+
+(* Testing timeouts *)
+let lower = Coefficient(Gmp.Z.of_int 0)
+and upper = Coefficient(Gmp.Z.of_int 1)
+in let rec hypercube_cs dim =
+ if dim < 0
+ then []
+ else Greater_Or_Equal(Variable dim, lower)
+ :: Less_Or_Equal(Variable dim, upper)
+ :: hypercube_cs (dim-1)
+and hypercube_ph dim =
+ ppl_new_C_Polyhedron_from_constraints (hypercube_cs dim)
+and compute_timeout_hypercube dim_in dim_out =
+ if dim_in < dim_out then (
+ let _ = ppl_Polyhedron_get_minimized_constraints (hypercube_ph dim_in)
+ in (
+ print_string_if_noisy "Built hypercube of dimension ";
+ print_int_if_noisy dim_in;
+ print_string_if_noisy "\n"
+ );
+ compute_timeout_hypercube (dim_in + 1) dim_out
+ )
+in (
+ begin
+ (* FIXME: in the following try/with, the timeouts should be reset
+ unconditionally. Is there a way to implement try/finally? *)
+ try
+ print_string_if_noisy "\nStarting ppl_reset_timeout test:\n";
+ ppl_set_timeout 100;
+ compute_timeout_hypercube 0 2;
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_reset_timeout test succeeded.\n"
+ with
+ | PPL_timeout_exception ->
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_reset_timeout test seems to be failed:\n";
+ print_string_if_noisy "Unexpected PPL timeout exception caught.\n"
+ | _ ->
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_reset_timeout test seems to be failed.";
+ (* FIXME: print the contents of the exception. *)
+ print_string_if_noisy "\n"
+ end;
+ begin
+ try
+ print_string_if_noisy "\nStarting ppl_set_timeout test:\n";
+ ppl_set_timeout 100;
+ compute_timeout_hypercube 0 100;
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_set_timeout test seems to be failed!\n"
+ with
+ | PPL_timeout_exception ->
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_set_timeout test succeded\n";
+ print_string_if_noisy "Expected PPL timeout exception caught.\n"
+ | _ ->
+ ppl_reset_timeout ();
+ print_string_if_noisy "ppl_set_timeout test failed:\n";
+ print_string_if_noisy "generic exception caught.\n"
+ end;
+ begin
+ try
+ print_string_if_noisy "\nStarting ppl_reset_deterministic_timeout test:\n";
+ ppl_set_deterministic_timeout 2000 0;
+ compute_timeout_hypercube 0 2;
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_reset_deterministic_timeout test succeeded.\n"
+ with
+ | PPL_timeout_exception ->
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_reset_deterministic_timeout test seems to be failed:\n";
+ print_string_if_noisy "Unexpected PPL timeout exception caught.\n"
+ | _ ->
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_reset_deterministic_timeout test seems to be failed.";
+ (* FIXME: print the contents of the exception. *)
+ print_string_if_noisy "\n"
+ end;
+ begin
+ try
+ print_string_if_noisy "\nStarting ppl_set_deterministic_timeout test:\n";
+ ppl_set_deterministic_timeout 2000 0;
+ compute_timeout_hypercube 0 100;
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_set_deterministic_timeout test seems to be failed!\n"
+ with
+ | PPL_timeout_exception ->
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_set_deterministic_timeout test succeded\n";
+ print_string_if_noisy "Expected PPL timeout exception caught.\n"
+ | _ ->
+ ppl_reset_deterministic_timeout ();
+ print_string_if_noisy "ppl_set_deterministic_timeout test failed:\n";
+ print_string_if_noisy "generic exception caught.\n"
+ end
+);;
+
+
+print_string_if_noisy "\nStarting PIP_Problem \n";;
+
+print_string_if_noisy "PIP_Problem 1 \n";;
+print_string_if_noisy "testing PIP_Problem_solution, ";;
+print_string_if_noisy "PIP_Problem_OK ";;
+print_string_if_noisy "and PIP_Tree_Node_is_bottom \n";;
+let pip = ppl_new_PIP_Problem 3
+ [e1 >=/ e2; e1 <=/ e2 -/ (linear_expression_of_int 7)] [2];;
+
+begin
+try
+ let ptree = ppl_PIP_Problem_solution pip
+ in let out = if (ppl_PIP_Problem_OK pip & ppl_PIP_Tree_Node_is_bottom ptree)
+ then "success" else "failed"
+ in (print_string_if_noisy out)
+with PPL_arithmetic_overflow what ->
+ let unexpected = (ppl_Coefficient_bits() != 8)
+ in if (unexpected)
+ then raise (PPL_arithmetic_overflow(what));
+ print_string_if_noisy "Expected overflow exception caught: ";
+ print_string_if_noisy what;
+ print_string_if_noisy "\n"
+end;;
+print_string_if_noisy "\n";;
+
+print_string_if_noisy "PIP_Problem 2 \n";;
+let params = [7];;
+let pip2 = ppl_new_PIP_Problem 10 constraints1 params;;
+let i = ppl_PIP_Problem_space_dimension pip2;;
+let i = ppl_PIP_Problem_constraints pip2;;
+print_string_if_noisy "PIP_Problem constraints are \n";;
+List.iter print_constraint i;;
+print_string_if_noisy "\n";;
+ppl_PIP_Problem_add_constraint pip2 constraint1;;
+ppl_PIP_Problem_add_constraints pip2 constraints1;;
+let i = ppl_PIP_Problem_parameter_space_dimensions pip2;;
+let i = ppl_PIP_Problem_get_control_parameter pip2 Cutting_Strategy;;
+ppl_PIP_Problem_set_control_parameter pip2 Cutting_Strategy_First;;
+let i = ppl_PIP_Problem_get_control_parameter pip2 Cutting_Strategy;;
+let out = if (i == Cutting_Strategy_First)
+ then "PIP Problem Control Parameter test succeeded"
+ else "PIP Problem Control Parameter test failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let b0 = ppl_PIP_Problem_has_big_parameter_dimension pip2;;
+ppl_PIP_Problem_set_big_parameter_dimension pip2 7;;
+let big_par = ppl_PIP_Problem_get_big_parameter_dimension pip2;;
+let b1 = ppl_PIP_Problem_has_big_parameter_dimension pip2;;
+let out = if (not b0 & b1 & (big_par = 7))
+ then "ppl_PIP_Problem big parameter dimension tests succeeded"
+ else "ppl_PIP_Problem big parameter dimension tests failed"
+ in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+
+begin
+try
+ let out = if (ppl_PIP_Problem_is_satisfiable pip2)
+ then "ppl_PIP_Problem_is_satisfiable test succeeded"
+ else "ppl_PIP_Problem_is_satisfiable test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ print_string_if_noisy "testing ppl_PIP_Problem_ascii_dump: ";
+ print_string_if_noisy (ppl_PIP_Problem_ascii_dump pip2);
+ print_string_if_noisy "\n";
+ let ptree2 = ppl_PIP_Problem_solution pip2
+ in let out2 = if (ppl_PIP_Tree_Node_is_bottom ptree2)
+ then "ppl_PIP_Tree_Node_is_bottom test succeeded"
+ else "ppl_PIP_Tree_Node_is_bottom test failed"
+ in (print_string_if_noisy out2);
+ print_string_if_noisy "\n"
+with PPL_arithmetic_overflow what ->
+ let unexpected = (ppl_Coefficient_bits() != 8)
+ in if (unexpected)
+ then raise (PPL_arithmetic_overflow(what));
+ print_string_if_noisy "Expected overflow exception caught: ";
+ print_string_if_noisy what;
+ print_string_if_noisy "\n"
+end;;
+
+print_string_if_noisy "\nPIP_Problem 3 \n";;
+let i = Variable 0
+and j = Variable 1
+and n = Variable 2
+and m = Variable 3
+and v2 = Z.from_int 2
+and v3 = Z.from_int 3
+and v4 = Z.from_int 4
+and v8 = Z.from_int 8
+and inhomogeneous n = linear_expression_of_int n
+;;
+
+let pip_c1 = v3 */ j +/ v2 */ i >=/ (inhomogeneous 8);;
+print_constraint pip_c1; print_string_if_noisy "\n" ;;
+let pip_c2 = v4 */ i -/ j >=/ (inhomogeneous 4);;
+print_constraint pip_c2; print_string_if_noisy "\n" ;;
+let pip_c3 = m >=/ j;;
+print_constraint pip_c3; print_string_if_noisy "\n" ;;
+let pip_c4 = n >=/ i;;
+print_constraint pip_c4; print_string_if_noisy "\n" ;;
+let pip_cs = [pip_c1; pip_c2; pip_c3; pip_c4] ;;
+
+let ps = [2; 3];;
+let pip3 = ppl_new_PIP_Problem 4 pip_cs ps;;
+
+begin
+try
+ let result = ppl_PIP_Problem_solve pip3 in
+ let out = if (result == Optimized_Pip_Problem)
+ then "PIP Problem_solve pip3 test succeeded"
+ else "PIP Problem_solve pip3 test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let node = ppl_PIP_Problem_solution pip3 in
+ begin
+ let out = if (ppl_PIP_Tree_Node_OK node)
+ then "ppl_PIP_Tree_Node_OK node test succeeded"
+ else "ppl_PIP_Tree_Node_OK node test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let out = if (ppl_PIP_Tree_Node_is_decision node)
+ then "ppl_PIP_Tree_Node_is_decision node test succeeded"
+ else "ppl_PIP_Tree_Node_is_decision node test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let out = if (ppl_PIP_Tree_Node_artificials node = [])
+ then "ppl_PIP_Tree_Node_artificials node test succeeded"
+ else "ppl_PIP_Tree_Node_artificials node test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let _node_cs = ppl_PIP_Tree_Node_constraints node in ();
+ let
+ _fchild = ppl_PIP_Tree_Node_false_child node
+ and
+ tchild = (ppl_PIP_Tree_Node_true_child node)
+ in (
+ let out = if (ppl_PIP_Tree_Node_is_decision tchild)
+ then "ppl_PIP_Tree_Node_is_decision tchild test succeeded"
+ else "ppl_PIP_Tree_Node_is_decision tchild test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let
+ ttchild = (ppl_PIP_Tree_Node_true_child tchild)
+ and
+ ftchild = (ppl_PIP_Tree_Node_false_child tchild)
+ in (
+ let out = if (ppl_PIP_Tree_Node_is_solution ttchild)
+ then "ppl_PIP_Tree_Node_is_decision ttchild test succeeded"
+ else "ppl_PIP_Tree_Node_is_decision ttchild test failed"
+ in (print_string_if_noisy out);
+ print_string_if_noisy "\n";
+ let _par_vals = ppl_PIP_Tree_Node_parametric_values ttchild 0 in ();
+ let _ftchild_arts = ppl_PIP_Tree_Node_artificials ftchild in ()
+ )
+ );
+ print_string_if_noisy "\n"
+ end
+with PPL_arithmetic_overflow what ->
+ let unexpected = (ppl_Coefficient_bits() != 8)
+ in if (unexpected)
+ then raise (PPL_arithmetic_overflow(what));
+ print_string_if_noisy "Expected overflow exception caught: ";
+ print_string_if_noisy what;
+ print_string_if_noisy "\n"
+end;;
+
+(* Pointset_Powerset_Grid is not enabled by default, the following code is *)
+(* commented *)
+(* let pps = ppl_new_Pointset_Powerset_Grid_from_space_dimension 3;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* ppl_Pointset_Powerset_Grid_add_constraints pps constraints1;; *)
+(* let caml_grid_it = ppl_Pointset_Powerset_Grid_begin_iterator pps;; *)
+(* let grid1 = ppl_Pointset_Powerset_Grid_iterator_get_disjunct caml_grid_it;; *)
+(* let space_dim = ppl_Grid_space_dimension grid1;; *)
+(* let grid2 = ppl_new_Grid_from_space_dimension 3;; *)
+(* ppl_Pointset_Powerset_Grid_add_disjunct pps grid2;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* let caml_grid_it1 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* let caml_grid_it2 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_decrement caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_drop_disjunct pps caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_equals_iterator caml_grid_it1 caml_grid_it1;; *)
+(* print_int_if_noisy space_dim;; *)
+(* print_string_if_noisy "\n";; *)
+(* print_string_if_noisy "PPS size : ";; *)
+(* let size = ppl_Pointset_Powerset_Grid_size pps;; *)
+(* print_int_if_noisy size;; *)
+
+at_exit Gc.full_major;;
+print_string_if_noisy "\nBye!\n"
diff --git a/interfaces/Prolog/Ciao/Makefile.am b/interfaces/Prolog/Ciao/Makefile.am
new file mode 100644
index 0000000..53ffe88
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.am
@@ -0,0 +1,317 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+CIAO_CFLI_FILES = ciao_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4 \
+README.ciao
+
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(CIAO_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_ciao_pl.m4 \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+
+pkglib_LTLIBRARIES = libppl_ciao.la
+
+libppl_ciao_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+ciao_efli.hh \
+ciao_efli.cc
+
+nodist_libppl_ciao_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_ciao_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_ciao_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_ciao_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_ciao_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_ciao.po
+
+ppl_ciao.pl: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ciao_prolog_generated_test.pl: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 > $@
+
+ppl_ciao.po: ppl_ciao.pl
+ ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq',
+# `ciao_clpq2' and 'ciao_prolog_generated_test' will try to build
+# identical glue files (e.g., `ppl_ciao_LINUXi86.so').
+# On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all; after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/ciao_pl_check.pl .; \
+ fi
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ ciaoc -o $@ ciao_pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f ciao_pl_check.pl; \
+ fi
+ rm -f pl_check.pl
+
+ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/ciao_clpq.pl .; \
+ fi
+ cp -f $(srcdir)/../tests/clpq.pl .
+ ciaoc -o $@ ciao_clpq.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f ciao_clpq.pl; \
+ fi
+ rm -f clpq.pl
+
+ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/ciao_clpq2.pl .; \
+ fi
+ cp -f $(srcdir)/../tests/clpq2.pl .
+ ciaoc -o $@ ciao_clpq2.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f ciao_clpq2.pl; \
+ fi
+ rm -f clpq2.pl
+
+
+ciao_prolog_generated_test: .libs/libppl_ciao.so ppl_ciao.po ciao_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl | ciao_pl_check
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ ciaoc -o $@ ciao_prolog_generated_test.pl
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: ppl_prolog_generated_test
+
+pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_pl_check \
+ >obtained_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ GLOBALSTKSIZE=1000000 \
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_clpq \
+ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ GLOBALSTKSIZE=100000 \
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_clpq2 \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ciao_prolog_generated_test$(EXEEXT) .libs/libppl_ciao.so ../tests/expected_pgt
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_prolog_generated_test \
+ >obtained_pgt
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+endif ENABLE_SHARED
+
+CLEANFILES = \
+ppl_ciao.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_prolog_generated_test \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_ciao_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: the dependencies from .libs/libppl_ciao.so in this Makefile.am
+# are probably all wrong.
+.libs/libppl_ciao.so: libppl_ciao.la
diff --git a/interfaces/Prolog/Ciao/Makefile.in b/interfaces/Prolog/Ciao/Makefile.in
new file mode 100644
index 0000000..3e393f7
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.in
@@ -0,0 +1,1681 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/Ciao
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__libppl_ciao_la_SOURCES_DIST = ppl_prolog_sysdep.hh ciao_efli.hh \
+ ciao_efli.cc
+ at ENABLE_SHARED_TRUE@am_libppl_ciao_la_OBJECTS = ciao_efli.lo
+ at ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_OBJECTS = \
+ at ENABLE_SHARED_TRUE@ ppl_prolog_common.lo
+libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS) \
+ $(nodist_libppl_ciao_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_ciao_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_ciao_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+ at ENABLE_SHARED_TRUE@am_libppl_ciao_la_rpath = -rpath $(pkglibdir)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_ciao_la_SOURCES) $(nodist_libppl_ciao_la_SOURCES) \
+ $(nodist_EXTRA_libppl_ciao_la_SOURCES)
+DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+CIAO_CFLI_FILES = ciao_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4 \
+README.ciao
+
+ at ENABLE_SHARED_TRUE@AM_CPPFLAGS = \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_builddir)/src \
+ at ENABLE_SHARED_TRUE@$(CIAO_PROLOG_INCLUDE_OPTIONS) \
+ at ENABLE_SHARED_TRUE@@extra_includes@
+
+ at ENABLE_SHARED_TRUE@interface_generator_dependencies = \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_copyright \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_pl.m4 \
+ at ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+
+ at ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = libppl_ciao.la
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \
+ at ENABLE_SHARED_TRUE@ciao_efli.hh \
+ at ENABLE_SHARED_TRUE@ciao_efli.cc
+
+ at ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_common.cc
+
+ at ENABLE_SHARED_TRUE@nodist_EXTRA_libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_LIBADD = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_DEPENDENCIES = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_LDFLAGS = \
+ at ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \
+ at ENABLE_SHARED_TRUE@-module \
+ at ENABLE_SHARED_TRUE@-avoid-version
+
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_ciao.po
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at ENABLE_SHARED_TRUE@ack.clpq \
+ at ENABLE_SHARED_TRUE@ackn.clpq \
+ at ENABLE_SHARED_TRUE@fib.clpq \
+ at ENABLE_SHARED_TRUE@mc91.clpq \
+ at ENABLE_SHARED_TRUE@smm.clpq \
+ at ENABLE_SHARED_TRUE@sumto.clpq \
+ at ENABLE_SHARED_TRUE@tak.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \
+ at ENABLE_SHARED_TRUE@schedule.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_ciao.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_prolog_generated_test \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+ }
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES) $(EXTRA_libppl_ciao_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_ciao_la_LINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ciao_efli.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-pkgdataDATA \
+ uninstall-pkglibLTLIBRARIES
+
+
+ at ENABLE_SHARED_TRUE@ppl_ciao.pl: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@ $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ciao_prolog_generated_test.pl: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@ $(srcdir)/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ppl_ciao.po: ppl_ciao.pl
+ at ENABLE_SHARED_TRUE@ ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq',
+# `ciao_clpq2' and 'ciao_prolog_generated_test' will try to build
+# identical glue files (e.g., `ppl_ciao_LINUXi86.so').
+# On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all; after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ at ENABLE_SHARED_TRUE@ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_pl_check.pl .; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl .
+ at ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_pl_check.pl
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ rm -f ciao_pl_check.pl; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ rm -f pl_check.pl
+
+ at ENABLE_SHARED_TRUE@ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq.pl .; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq.pl .
+ at ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq.pl
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ rm -f ciao_clpq.pl; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ rm -f clpq.pl
+
+ at ENABLE_SHARED_TRUE@ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq2.pl .; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq2.pl .
+ at ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq2.pl
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ rm -f ciao_clpq2.pl; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ rm -f clpq2.pl
+
+ at ENABLE_SHARED_TRUE@ciao_prolog_generated_test: .libs/libppl_ciao.so ppl_ciao.po ciao_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ at ENABLE_SHARED_TRUE@ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ at ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_prolog_generated_test.pl
+ at ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_common.pl
+ at ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_main.pl
+
+ at ENABLE_SHARED_TRUE@check-local: ppl_prolog_generated_test
+
+ at ENABLE_SHARED_TRUE@pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@ ./ciao_pl_check \
+ at ENABLE_SHARED_TRUE@ >obtained_pchk
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at ENABLE_SHARED_TRUE@$(CLPQ_TESTS):
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/$@ .
+
+ at ENABLE_SHARED_TRUE@clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=1000000 \
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@ ./ciao_clpq \
+ at ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at ENABLE_SHARED_TRUE@clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=100000 \
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@ ./ciao_clpq2 \
+ at ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at ENABLE_SHARED_TRUE@ppl_prolog_generated_test: ciao_prolog_generated_test$(EXEEXT) .libs/libppl_ciao.so ../tests/expected_pgt
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@ ./ciao_prolog_generated_test \
+ at ENABLE_SHARED_TRUE@ >obtained_pgt
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_ciao_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: the dependencies from .libs/libppl_ciao.so in this Makefile.am
+# are probably all wrong.
+.libs/libppl_ciao.so: libppl_ciao.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Ciao/README.ciao b/interfaces/Prolog/Ciao/README.ciao
new file mode 100644
index 0000000..5814d90
--- /dev/null
+++ b/interfaces/Prolog/Ciao/README.ciao
@@ -0,0 +1,16 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Ciao Prolog interface to the PPL only supports versions of Ciao
+Prolog dated later than Octber 15th, 2008 (corresponding to SVN
+revision 9859). If in doubt, please check with the Ciao developers
+(ciao at clip.dia.fi.upm.es) how to obtain such a version.
diff --git a/interfaces/Prolog/Ciao/ciao_cfli.hh b/interfaces/Prolog/Ciao/ciao_cfli.hh
new file mode 100644
index 0000000..d9b48cb
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_cfli.hh
@@ -0,0 +1,341 @@
+/* Ciao Prolog Common Foreign Language Interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_ciao_cfli_hh
+#define PCFLI_ciao_cfli_hh 1
+
+#include <ciao_prolog.h>
+#include <cassert>
+#include <sstream>
+
+typedef ciao_term Prolog_term_ref;
+typedef const char* Prolog_atom;
+typedef ciao_bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
+const Prolog_foreign_return_type PROLOG_FAILURE = 0;
+
+/*!
+ Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+ return 0;
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+ t = u;
+ return 1;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+ t = ciao_integer(l);
+ return 1;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+ if (ul < INT_MAX)
+ t = ciao_integer(ul);
+ else {
+ std::ostringstream s;
+ s << ul;
+ std::string str = s.str();
+ // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+ t = ciao_put_number_chars(const_cast<char*>(str.c_str()));
+ }
+ return 1;
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+ t = ciao_atom(s);
+ return 1;
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+ t = ciao_atom(a);
+ return 1;
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+ t = ciao_pointer_to_address(ciao_implicit_state, p);
+ return 1;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return ciao_atom_name(ciao_atom(s));
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1) {
+ Prolog_term_ref args[1];
+ args[0] = a1;
+ t = ciao_structure_a(f, 1, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+ Prolog_term_ref args[2];
+ args[0] = a1;
+ args[1] = a2;
+ t = ciao_structure_a(f, 2, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+ Prolog_term_ref args[3];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ t = ciao_structure_a(f, 3, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+ Prolog_term_ref args[4];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ args[3] = a4;
+ t = ciao_structure_a(f, 4, args);
+ return 1;
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+ c = ciao_list(h, t);
+ return 1;
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+ ciao_raise_exception(t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+ return ciao_is_variable(t);
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+ return ciao_is_atom(t);
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+ return ciao_is_integer(t);
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+ return ciao_is_address(ciao_implicit_state, t);
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+ return ciao_is_structure(t);
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ return ciao_is_list(t);
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(ciao_is_integer(t));
+ if (ciao_fits_in_int(t)) {
+ *lp = ciao_to_integer(t);
+ return 1;
+ }
+ else {
+ char* s = ciao_get_number_chars(t);
+ mpz_class n(s);
+ ciao_free(s);
+ if (!n.fits_slong_p())
+ return 0;
+ else {
+ *lp = n.get_si();
+ return 1;
+ }
+ }
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ *vpp = ciao_address_to_pointer(ciao_implicit_state, t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ *ap = ciao_atom_name(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ *ap = ciao_structure_name(t);
+ *ip = ciao_structure_arity(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+ assert(Prolog_is_compound(t));
+ a = ciao_structure_arg(t, i);
+ return 1;
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+ assert(Prolog_is_cons(c));
+ h = ciao_list_head(c);
+ t = ciao_list_tail(c);
+ return 1;
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+ return ciao_unify(t, u);
+}
+
+#endif // !defined(PCFLI_ciao_cfli_hh)
diff --git a/interfaces/Prolog/Ciao/ciao_clpq.pl b/interfaces/Prolog/Ciao/ciao_clpq.pl
new file mode 100644
index 0000000..3b4f15f
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq.pl
@@ -0,0 +1,56 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao,
+ [
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2
+ ]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq.pl').
+
+main :-
+ ppl_initialize,
+ common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_clpq2.pl b/interfaces/Prolog/Ciao/ciao_clpq2.pl
new file mode 100644
index 0000000..a3cae5a
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq2.pl
@@ -0,0 +1,56 @@
+/* Prolog main program for the 2nd toy PPL/CIAO-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(iso_misc)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(sort)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_remove_space_dimensions/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq2.pl').
+
+main :-
+ ppl_initialize,
+ common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_efli.cc b/interfaces/Prolog/Ciao/ciao_efli.cc
new file mode 100644
index 0000000..437edf0
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_efli.cc
@@ -0,0 +1,100 @@
+/* Ciao Prolog extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ciao_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace Ciao {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ assert(Prolog_is_integer(t));
+ if (ciao_fits_in_int(t))
+ n = ciao_to_integer(t);
+ else {
+ const char* s = ciao_get_number_chars(t);
+ n = Coefficient(s);
+ // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+ ciao_free(const_cast<char*>(s));
+ }
+ return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+ int i;
+ Result r = assign_r(i, n, ROUND_IGNORE);
+ if (!result_overflow(r))
+ t = ciao_integer(i);
+ else {
+ std::ostringstream s;
+ s << n;
+ std::string str = s.str();
+ // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+ t = ciao_put_number_chars(const_cast<char*>(str.c_str()));
+ }
+ return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ Prolog_term_ref u = Prolog_new_term_ref();
+ Prolog_put_Coefficient(u, n);
+ return ciao_unify(t, u);
+}
+
+} // namespace Ciao
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+extern "C" void
+init() {
+ ppl_initialize();
+}
diff --git a/interfaces/Prolog/Ciao/ciao_efli.hh b/interfaces/Prolog/Ciao/ciao_efli.hh
new file mode 100644
index 0000000..267796e
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_efli.hh
@@ -0,0 +1,92 @@
+/* Ciao Prolog extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ciao_efli_hh
+#define PPL_ciao_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "ciao_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace Ciao {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace Ciao
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ciao_efli_hh)
diff --git a/interfaces/Prolog/Ciao/ciao_pl_check.pl b/interfaces/Prolog/Ciao/ciao_pl_check.pl
new file mode 100644
index 0000000..5590465
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl
@@ -0,0 +1,170 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+ ppl_version_major/1,
+ ppl_version_minor/1,
+ ppl_version_revision/1,
+ ppl_version_beta/1,
+ ppl_version/1,
+ ppl_banner/1,
+ ppl_max_space_dimension/1,
+ ppl_Coefficient_is_bounded/0,
+ ppl_Coefficient_max/1,
+ ppl_Coefficient_min/1,
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_set_timeout_exception_atom/1,
+ ppl_timeout_exception_atom/1,
+ ppl_set_timeout/1,
+ ppl_reset_timeout/0,
+ ppl_set_rounding_for_PPL/0,
+ ppl_restore_pre_PPL_rounding/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity/3,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity/3,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity/3,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity/3,
+ ppl_new_C_Polyhedron_from_constraints/2,
+ ppl_new_NNC_Polyhedron_from_constraints/2,
+ ppl_new_C_Polyhedron_from_generators/2,
+ ppl_new_NNC_Polyhedron_from_generators/2,
+ ppl_Polyhedron_swap/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_affine_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_get_minimized_constraints/2,
+ ppl_Polyhedron_get_generators/2,
+ ppl_Polyhedron_get_minimized_generators/2,
+ ppl_Polyhedron_relation_with_constraint/3,
+ ppl_Polyhedron_relation_with_generator/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/1,
+ ppl_Polyhedron_contains_integer_point/1,
+ ppl_Polyhedron_bounds_from_above/2,
+ ppl_Polyhedron_bounds_from_below/2,
+ ppl_Polyhedron_maximize/5,
+ ppl_Polyhedron_maximize_with_point/6,
+ ppl_Polyhedron_minimize/5,
+ ppl_Polyhedron_minimize_with_point/6,
+ ppl_Polyhedron_is_topologically_closed/1,
+ ppl_Polyhedron_contains_Polyhedron/2,
+ ppl_Polyhedron_strictly_contains_Polyhedron/2,
+ ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+ ppl_Polyhedron_equals_Polyhedron/2,
+ ppl_Polyhedron_OK/1,
+ ppl_Polyhedron_add_constraint/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_difference_assign/2,
+ ppl_Polyhedron_affine_image/4,
+ ppl_Polyhedron_affine_preimage/4,
+ ppl_Polyhedron_bounded_affine_image/5,
+ ppl_Polyhedron_bounded_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image/5,
+ ppl_Polyhedron_generalized_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+ ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+ ppl_Polyhedron_time_elapse_assign/2,
+ ppl_Polyhedron_topological_closure_assign/1,
+ ppl_Polyhedron_constrains/2,
+ ppl_Polyhedron_unconstrain_space_dimension/2,
+ ppl_Polyhedron_unconstrain_space_dimensions/2,
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+ ppl_Polyhedron_BHRZ03_widening_assign/2,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+ ppl_Polyhedron_H79_widening_assign/2,
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+ ppl_Polyhedron_add_space_dimensions_and_project/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_concatenate_assign/2,
+ ppl_Polyhedron_remove_space_dimensions/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2,
+ ppl_Polyhedron_expand_space_dimension/3,
+ ppl_Polyhedron_fold_space_dimensions/3,
+ ppl_Polyhedron_map_space_dimensions/2,
+ ppl_new_MIP_Problem_from_space_dimension/2,
+ ppl_new_MIP_Problem/5,
+ ppl_new_MIP_Problem_from_MIP_Problem/2,
+ ppl_MIP_Problem_swap/2,
+ ppl_delete_MIP_Problem/1,
+ ppl_MIP_Problem_space_dimension/2,
+ ppl_MIP_Problem_integer_space_dimensions/2,
+ ppl_MIP_Problem_constraints/2,
+ ppl_MIP_Problem_objective_function/2,
+ ppl_MIP_Problem_optimization_mode/2,
+ ppl_MIP_Problem_clear/1,
+ ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+ ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+ ppl_MIP_Problem_add_constraint/2,
+ ppl_MIP_Problem_add_constraints/2,
+ ppl_MIP_Problem_set_objective_function/2,
+ ppl_MIP_Problem_set_optimization_mode/2,
+ ppl_MIP_Problem_is_satisfiable/1,
+ ppl_MIP_Problem_solve/2,
+ ppl_MIP_Problem_feasible_point/2,
+ ppl_MIP_Problem_optimizing_point/2,
+ ppl_MIP_Problem_optimal_value/3,
+ ppl_MIP_Problem_evaluate_objective_function/4,
+ ppl_MIP_Problem_OK/1,
+ ppl_MIP_Problem_get_control_parameter/3,
+ ppl_MIP_Problem_set_control_parameter/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:- include('pl_check.pl').
+
+prolog_system('Ciao').
+
+main:-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
new file mode 100644
index 0000000..33368bc
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
@@ -0,0 +1,88 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ciao.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* Ciao Prolog interface: Ciao Prolog part.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+:- module(ppl_ciao,
+[
+m4_divert(1)
+],
+[
+ assertions,
+ basicmodes,
+ regtypes,
+ foreign_interface
+]).
+
+m4_divert(2)dnl
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+m4_divert(3)
+]).
+
+:- comment(version_maintenance,off).
+
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+') $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)`'dnl
+m4_divert`'dnl
+m4_define(`check_fail', `m4_ifelse(m4_index($1, nofail), -1, failok, nofail)')
+m4_define(`term', `Term$1')dnl
+m4_define(`anyterm', `any_term')dnl
+m4_define(`interm', `in(Term$1)')dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse(check_fail($3), nofail,
+ `:- true pred $1`'m4_ifelse(`$2', 0, ,(`'m4_term_sequence($2, `interm'))
+ :: `'m4_term_sequence($2, `anyterm', ` *')) + foreign.
+
+',
+ `:- true pred $1_2(`'m4_term_sequence($2, `interm')`'m4_ifelse(`$2', 0, `go(Success)', `, go(Success)'))
+ :: `'m4_term_sequence($2, `anyterm', ` *')`'m4_ifelse(`$2', 0, ` int', ` * int')
+ + (returns(Success), foreign($1)).
+
+$1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `term'))') :-
+ $1_2(`'m4_term_sequence($2, `term')`'m4_ifelse(`$2', 0, `1', `, 1')).
+
+')')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(2)dnl
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema',
+ `m4_ifelse(check_fail($3), nofail, ,m4_ifelse($4, 0, , `COMMA
+') `'$1_2/m4_incr($2))')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
new file mode 100644
index 0000000..ce52953
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Ciao dependent code for ciao_prolog_generated_test.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+') $1/$2')
+
+m4_divert`'dnl
+/* Ciao Prolog interface: Ciao Prolog part for checking all predicates.
+m4_include(`../../../../ppl/interfaces/ppl_interface_generator_copyright')
+*/
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao,
+[
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:- `include'('ppl_prolog_generated_test_main.pl').
+
+prolog_system('Ciao').
+
+main:-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh b/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..a6b53a2
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for Ciao Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ciao_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::Ciao;
diff --git a/interfaces/Prolog/GNU/Makefile.am b/interfaces/Prolog/GNU/Makefile.am
new file mode 100644
index 0000000..94286b0
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.am
@@ -0,0 +1,309 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+gnu_prolog_generated_test.pl \
+README.gprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_gprolog_pl.m4
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+
+libppl_gprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+gprolog_efli.hh \
+gprolog_efli.cc
+
+nodist_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_gprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_gprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_gprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+ppl_gprolog.pl: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
+
+pkgdata_DATA = ppl_gprolog.pl
+
+bin_PROGRAMS = ppl_gprolog
+
+ppl_gprolog_SOURCES =
+
+
+# Note: since `libppl_gprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'. Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+if ENABLE_STATIC
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+
+else !ENABLE_STATIC
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+endif !ENABLE_STATIC
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+SCRIPT_CLPQ= $(srcdir)/../tests/script_clpq
+
+if USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+
+else !USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+
+endif !USE_INT8
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+ >script_pchk
+ echo "main." >>script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./ppl_gprolog <script_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: gnu_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/gnu_prolog_generated_test.pl . ; \
+ fi
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ echo "['ppl_prolog_generated_test_main.pl', 'gnu_prolog_generated_test.pl']." \
+ >script_pgt
+ echo "main." >>script_pgt
+ GLOBALSZ=131072 $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./ppl_gprolog <script_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f gnu_prolog_generated_test.pl; \
+ fi
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_gprolog.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_gprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/GNU/Makefile.in b/interfaces/Prolog/GNU/Makefile.in
new file mode 100644
index 0000000..008db9b
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.in
@@ -0,0 +1,1713 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_gprolog$(EXEEXT)
+subdir = interfaces/Prolog/GNU
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am_libppl_gprolog_la_OBJECTS = gprolog_efli.lo
+nodist_libppl_gprolog_la_OBJECTS = ppl_prolog_common.lo
+libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS) \
+ $(nodist_libppl_gprolog_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_gprolog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_gprolog_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_gprolog_OBJECTS =
+ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS)
+ppl_gprolog_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_gprolog_la_SOURCES) \
+ $(nodist_libppl_gprolog_la_SOURCES) \
+ $(nodist_EXTRA_libppl_gprolog_la_SOURCES) \
+ $(ppl_gprolog_SOURCES)
+DIST_SOURCES = $(libppl_gprolog_la_SOURCES) $(ppl_gprolog_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+gnu_prolog_generated_test.pl \
+README.gprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_gprolog_pl.m4
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+libppl_gprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+gprolog_efli.hh \
+gprolog_efli.cc
+
+nodist_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_gprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_gprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_gprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_gprolog.pl
+ppl_gprolog_SOURCES =
+ at ENABLE_STATIC_FALSE@LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+# Note: since `libppl_gprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'. Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+ at ENABLE_STATIC_TRUE@LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+SCRIPT_CLPQ = $(srcdir)/../tests/script_clpq
+ at USE_INT8_FALSE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+ at USE_INT8_TRUE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_gprolog.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+ }
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES) $(EXTRA_libppl_gprolog_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_gprolog_la_LINK) -rpath $(pkglibdir) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gprolog_efli.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA \
+ uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pkgdataDATA install-pkglibLTLIBRARIES install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA \
+ uninstall-pkglibLTLIBRARIES
+
+
+ppl_gprolog.pl: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+ >script_pchk
+ echo "main." >>script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./ppl_gprolog <script_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: gnu_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/gnu_prolog_generated_test.pl . ; \
+ fi
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ echo "['ppl_prolog_generated_test_main.pl', 'gnu_prolog_generated_test.pl']." \
+ >script_pgt
+ echo "main." >>script_pgt
+ GLOBALSZ=131072 $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_gprolog.la \
+ ./ppl_gprolog <script_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f gnu_prolog_generated_test.pl; \
+ fi
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_gprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/GNU/README.gprolog b/interfaces/Prolog/GNU/README.gprolog
new file mode 100644
index 0000000..96e9ff4
--- /dev/null
+++ b/interfaces/Prolog/GNU/README.gprolog
@@ -0,0 +1,59 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The GNU Prolog interface to the Parma Polyhedra Library (PPL)
+is available both as a PPL-enhanced GNU Prolog interpreter and as a
+library that can be linked to GNU Prolog programs. Only GNU Prolog
+version 1.3.2(20100322) and later versions are supported.
+
+So that it can be used with the GNU Prolog PPL interface (and, for
+that matter, with any foreign code), the GNU Prolog installation must
+be configured with the `--disable-regs' option.
+
+
+Configuring the PPL for Building the GNU Prolog Interface
+---------------------------------------------------------
+
+To build and install the GNU Prolog interface, you will need to set
+the environment variable CPPFLAGS with the path to the GNU Prolog
+include directory: this is the directory containing the file
+`gprolog.h'. Thus you need to configure the PPL with a command like
+
+ CPPFLAGS=-I/path/to/gprolog/include /path/to/ppl-x.y/configure \
+ --interfaces = "gnu-prolog ..." ...
+
+
+The `ppl_gprolog' Executable
+----------------------------
+
+The `ppl_gprolog' executable is simply the GNU Prolog interpreter with
+the PPL statically linked. The only thing you should do to use the
+library is to call `ppl_initialize/0' before any other PPL predicate
+and to call `ppl_finalize/0' when you are done with the library.
+
+
+Linking the Library To GNU Prolog Programs
+------------------------------------------
+
+In order to allow linking GNU Prolog programs to the PPL, the
+following files are installed in the directory `<prefix>/lib/ppl',
+where <prefix> is the root of your installation (`/usr' or
+`/usr/local' in most cases): `ppl_gprolog.pl' contains the required
+foreign declarations; `libppl_gprolog.*' contain the executable code
+for the GNU Prolog interface in various formats (static library,
+shared library, libtool library). If your GNU Prolog program is
+constituted by, say, `source1.pl' and `source2.pl' and you want to
+create the executable `myprog', your compilation command may look like
+
+ gplc -o myprog <prefix>/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+ -L '-Wl,-rpath=<prefix>/lib/ppl -L<prefix>/lib/ppl -lppl_gprolog \
+ -L<prefix>/lib -lppl -lgmpxx -lgmp -lstdc++'
diff --git a/interfaces/Prolog/GNU/gnu_pl_check.pl b/interfaces/Prolog/GNU/gnu_pl_check.pl
new file mode 100644
index 0000000..f38db5e
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_pl_check.pl
@@ -0,0 +1,37 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('GNU').
+
+main :-
+ current_output(Old_Stream),
+ open(obtained_pchk, write, Stream),
+ set_output(Stream),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ close(Stream),
+ set_output(Old_Stream).
diff --git a/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
new file mode 100644
index 0000000..b4504c7
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
@@ -0,0 +1,37 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('GNU').
+
+main :-
+ current_output(Old_Stream),
+ open(obtained_pgt, write, Stream),
+ set_output(Stream),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ close(Stream),
+ set_output(Old_Stream).
diff --git a/interfaces/Prolog/GNU/gp_clpq.pl b/interfaces/Prolog/GNU/gp_clpq.pl
new file mode 100644
index 0000000..bd863aa
--- /dev/null
+++ b/interfaces/Prolog/GNU/gp_clpq.pl
@@ -0,0 +1,32 @@
+/* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- initialization(main).
+
+eat_eol.
+
+main :-
+ ppl_initialize,
+ common_main,
+ ppl_finalize,
+ halt.
diff --git a/interfaces/Prolog/GNU/gprolog_cfli.hh b/interfaces/Prolog/GNU/gprolog_cfli.hh
new file mode 100644
index 0000000..451d201
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_cfli.hh
@@ -0,0 +1,461 @@
+/* GNU Prolog Common Foreign Language Interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_gprolog_cfli_hh
+#define PCFLI_gprolog_cfli_hh 1
+
+#if SIZEOF_FP == SIZEOF_INTP
+// Horrible kludge working around an horrible bug in <gprolog.h> (see
+// http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+#define byte_code byte_code(void)
+#define last_read_line last_read_line(void)
+#define last_read_col last_read_col(void)
+#include <gprolog.h>
+#undef byte_code
+#undef last_read_line
+#undef last_read_col
+#else
+#include <gprolog.h>
+#endif
+
+#if defined(__GPROLOG_VERSION__) && __GPROLOG_VERSION__ >= 10301
+#define PPL_GPROLOG_H_IS_CLEAN
+#endif
+
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+// <gprolog.h> pollutes the namespace: try to clean up
+// (see http://www.cs.unipr.it/pipermail/ppl-devel/2004-April/004270.html).
+#ifdef B
+#undef B
+#endif
+#ifdef H
+#undef H
+#endif
+#ifdef CP
+#undef CP
+#endif
+#ifdef E
+#undef E
+#endif
+#ifdef CS
+#undef CS
+#endif
+#ifdef S
+#undef S
+#endif
+#ifdef STAMP
+#undef STAMP
+#endif
+#endif
+
+#include <cassert>
+#include <cstdlib>
+
+typedef PlTerm Prolog_term_ref;
+typedef int Prolog_atom;
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+typedef Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+#else
+typedef PlBool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = PL_TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = PL_FALSE;
+#endif
+
+namespace {
+
+inline Prolog_atom
+a_dollar_address() {
+ // We use the `name' variable, instead of directly using the string
+ // literal, in order to avoid a compiler warning.
+ static char name[] = "$address";
+ static Prolog_atom atom = Create_Allocate_Atom(name);
+ return atom;
+}
+
+inline Prolog_atom
+a_throw() {
+ // We use the `name' variable, instead of directly using the string
+ // literal, in order to avoid a compiler warning.
+ static char name[] = "throw";
+ static Prolog_atom a = Find_Atom(name);
+ return a;
+}
+
+} // namespace
+
+/*!
+ Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+ return 0;
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+ t = u;
+ return 1;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+ if (l < INT_LOWEST_VALUE || l > INT_GREATEST_VALUE)
+ return 0;
+ else {
+ t = Mk_Integer(l);
+ return 1;
+ }
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+ if (ul > static_cast<unsigned long>(INT_GREATEST_VALUE))
+ return 0;
+ else {
+ t = Mk_Integer(ul);
+ return 1;
+ }
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+ t = Mk_Atom(Create_Allocate_Atom(const_cast<char*>(s)));
+ return 1;
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+ t = Mk_Atom(a);
+ return 1;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return Create_Allocate_Atom(const_cast<char*>(s));
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1) {
+ Prolog_term_ref args[1];
+ args[0] = a1;
+ t = Mk_Compound(f, 1, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+ Prolog_term_ref args[2];
+ args[0] = a1;
+ args[1] = a2;
+ t = Mk_Compound(f, 2, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+ Prolog_term_ref args[3];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ t = Mk_Compound(f, 3, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+ Prolog_term_ref args[4];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ args[3] = a4;
+ t = Mk_Compound(f, 4, args);
+ return 1;
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+ Prolog_term_ref args[2];
+ args[0] = h;
+ args[1] = t;
+ c = Mk_List(args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+ union {
+ void* l;
+ unsigned short s[sizeof(void*)/sizeof(unsigned short)];
+ } u;
+ u.l = reinterpret_cast<void*>(p);
+ if (sizeof(unsigned short)*2 == sizeof(void*))
+ return Prolog_construct_compound(t, a_dollar_address(),
+ Mk_Positive(u.s[0]),
+ Mk_Positive(u.s[1]));
+ else if (sizeof(unsigned short)*4 == sizeof(void*))
+ return Prolog_construct_compound(t, a_dollar_address(),
+ Mk_Positive(u.s[0]),
+ Mk_Positive(u.s[1]),
+ Mk_Positive(u.s[2]),
+ Mk_Positive(u.s[3]));
+ else
+ abort();
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+ Pl_Exec_Continuation(a_throw(), 1, &t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+ return Blt_Var(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+ return Blt_Atom(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+ return Blt_Integer(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+ return Blt_Compound(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ if (Blt_Compound(t) == FALSE)
+ return 0;
+ Prolog_atom name;
+ int arity;
+ Rd_Compound(t, &name, &arity);
+ return name == ATOM_CHAR('.') && arity == 2;
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(Prolog_is_integer(t));
+ *lp = Rd_Integer_Check(t);
+ return 1;
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+ if (!Prolog_is_compound(t))
+ return 0;
+ Prolog_atom name;
+ int arity;
+ Prolog_term_ref* a = Rd_Compound_Check(t, &name, &arity);
+ if (name != a_dollar_address()
+ || sizeof(unsigned short)*arity != sizeof(void*))
+ return 0;
+ for (unsigned i = 0; i < sizeof(void*)/sizeof(unsigned short); ++i) {
+ if (!Prolog_is_integer(a[i]))
+ return 0;
+ long l;
+ if (!Prolog_get_long(a[i], &l))
+ return 0;
+ if (l < 0 || l > USHRT_MAX)
+ return 0;
+ }
+ return 1;
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ static Prolog_atom dummy_name;
+ static int dummy_arity;
+ Prolog_term_ref* a = Rd_Compound_Check(t, &dummy_name, &dummy_arity);
+ union {
+ void* l;
+ unsigned short s[sizeof(void*)/sizeof(unsigned short)];
+ } u;
+ assert(dummy_arity >= 2);
+ u.s[0] = Rd_Integer_Check(a[0]);
+ u.s[1] = Rd_Integer_Check(a[1]);
+ if (sizeof(unsigned short)*4 == sizeof(void*)) {
+ assert(dummy_arity == 4);
+ u.s[2] = Rd_Integer_Check(a[2]);
+ u.s[3] = Rd_Integer_Check(a[3]);
+ }
+ *vpp = reinterpret_cast<void*>(u.l);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ *ap = Rd_Atom_Check(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ Rd_Compound_Check(t, ap, ip);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+ assert(Prolog_is_compound(t));
+ static Prolog_atom dummy_name;
+ static int dummy_arity;
+ a = Rd_Compound_Check(t, &dummy_name, &dummy_arity)[i-1];
+ return 1;
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+ assert(Prolog_is_cons(c));
+ Prolog_term_ref* ht = Rd_List_Check(c);
+ h = ht[0];
+ t = ht[1];
+ return 1;
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+ return Unify(t, u) != FALSE;
+#else
+ return Pl_Unif(t, u) != PL_FALSE;
+#endif
+}
+
+#endif // !defined(PCFLI_gprolog_cfli_hh)
diff --git a/interfaces/Prolog/GNU/gprolog_efli.cc b/interfaces/Prolog/GNU/gprolog_efli.cc
new file mode 100644
index 0000000..8e19593
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.cc
@@ -0,0 +1,83 @@
+/* GNU Prolog extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "gprolog_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace GNU {
+
+bool Prolog_has_unbounded_integers;
+
+PlLong Prolog_min_integer;
+
+PlLong Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = false;
+ Prolog_min_integer = INT_LOWEST_VALUE;
+ Prolog_max_integer = INT_GREATEST_VALUE;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ assert(Prolog_is_integer(t));
+ PlLong v = Pl_Rd_Integer_Check(t);
+ n = v;
+ return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+ PlLong l = 0;
+ Result r = assign_r(l, n, ROUND_IGNORE);
+ if (result_overflow(r) || l < INT_LOWEST_VALUE || l > INT_GREATEST_VALUE)
+ throw PPL_integer_out_of_range(n);
+ t = Pl_Mk_Integer(l);
+ return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ Prolog_term_ref u = Prolog_new_term_ref();
+ Prolog_put_Coefficient(u, n);
+ return Prolog_unify(t, u);
+}
+
+} // namespace GNU
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/GNU/gprolog_efli.hh b/interfaces/Prolog/GNU/gprolog_efli.hh
new file mode 100644
index 0000000..88f8d3c
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.hh
@@ -0,0 +1,89 @@
+/* GNU Prolog extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_gprolog_efli_hh
+#define PPL_gprolog_efli_hh 1
+
+#include "ppl.hh"
+#include "gprolog_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace GNU {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-initialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace GNU
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_gprolog_efli_hh)
diff --git a/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
new file mode 100644
index 0000000..34a11bb
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
@@ -0,0 +1,47 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_gprolog.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* GNU Prolog interface: GNU Prolog part.
+m4_include(`ppl_interface_generator_copyright')
+*/
+m4_divert(-1)
+
+m4_define(`tm', ``+term'')
+
+m4_define(`start', 0)
+
+m4_define(`m4_expanded_procedure_schema',
+ `:- foreign($1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `tm'))')).
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..b0e1fe9
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for GNU Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "gprolog_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::GNU;
diff --git a/interfaces/Prolog/Makefile.am b/interfaces/Prolog/Makefile.am
new file mode 100644
index 0000000..9548c15
--- /dev/null
+++ b/interfaces/Prolog/Makefile.am
@@ -0,0 +1,139 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_CIAO_PROLOG_INTERFACE
+CIAO_PROLOG_SUBDIR = Ciao
+endif BUILD_CIAO_PROLOG_INTERFACE
+
+if BUILD_GNU_PROLOG_INTERFACE
+GNU_PROLOG_SUBDIR = GNU
+endif BUILD_GNU_PROLOG_INTERFACE
+
+if BUILD_SICSTUS_PROLOG_INTERFACE
+SICSTUS_PROLOG_SUBDIR = SICStus
+endif BUILD_SICSTUS_PROLOG_INTERFACE
+
+if BUILD_SWI_PROLOG_INTERFACE
+SWI_PROLOG_SUBDIR = SWI
+endif BUILD_SWI_PROLOG_INTERFACE
+
+if BUILD_XSB_PROLOG_INTERFACE
+XSB_PROLOG_SUBDIR = XSB
+endif BUILD_XSB_PROLOG_INTERFACE
+
+if BUILD_YAP_PROLOG_INTERFACE
+YAP_PROLOG_SUBDIR = YAP
+endif BUILD_YAP_PROLOG_INTERFACE
+
+SUBDIRS = \
+. tests \
+$(CIAO_PROLOG_SUBDIR) \
+$(GNU_PROLOG_SUBDIR) \
+$(SICSTUS_PROLOG_SUBDIR) \
+$(SWI_PROLOG_SUBDIR) \
+$(XSB_PROLOG_SUBDIR) \
+$(YAP_PROLOG_SUBDIR)
+
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4
+
+interface_generator_dox_files = \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_prolog_common_defs.hh \
+ppl_prolog_common_inlines.hh \
+ppl_prolog_common.cc \
+Prolog_configured_interface.dox \
+$(interface_generator_dox_files) \
+Prolog_interface.dox \
+Prolog_interface_sysindep.dox \
+Prolog_interface_sysindep_domains.dox \
+Prolog_interface_compilation.dox \
+Prolog_interface_sysdep.dox
+
+
+interface_generator_dox_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+Prolog_configured_domains.dox: \
+$(interface_generator_dox_dependencies) Makefile
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+ > Prolog_configured_domains.dox
+
+BUILT_SOURCES = \
+ppl_prolog_domains.hh \
+ppl_prolog_domains.cc.stamp
+
+nodist_noinst_DATA = Prolog_configured_domains.dox
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+
+ppl_prolog_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+ > ppl_prolog_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_hh_blob
+ rm -f ppl_prolog_hh_blob
+
+ppl_prolog_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+ > ppl_prolog_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_cc_blob
+ rm -f ppl_prolog_cc_blob
+ echo timestamp >$@
+
+CLEANFILES = \
+ at required_instantiations_prolog_cxx_headers@ \
+ at required_instantiations_prolog_cxx_sources@ \
+ppl_prolog_domains.cc.stamp \
+ppl_prolog_domains.hh \
+Prolog_configured_domains.dox
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Prolog/Makefile.in b/interfaces/Prolog/Makefile.in
new file mode 100644
index 0000000..c31d7a0
--- /dev/null
+++ b/interfaces/Prolog/Makefile.in
@@ -0,0 +1,827 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(nodist_noinst_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = . tests Ciao GNU SICStus SWI XSB YAP
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@CIAO_PROLOG_SUBDIR = Ciao
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@GNU_PROLOG_SUBDIR = GNU
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@SICSTUS_PROLOG_SUBDIR = SICStus
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@SWI_PROLOG_SUBDIR = SWI
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@XSB_PROLOG_SUBDIR = XSB
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@YAP_PROLOG_SUBDIR = YAP
+SUBDIRS = \
+. tests \
+$(CIAO_PROLOG_SUBDIR) \
+$(GNU_PROLOG_SUBDIR) \
+$(SICSTUS_PROLOG_SUBDIR) \
+$(SWI_PROLOG_SUBDIR) \
+$(XSB_PROLOG_SUBDIR) \
+$(YAP_PROLOG_SUBDIR)
+
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4
+
+interface_generator_dox_files = \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_prolog_common_defs.hh \
+ppl_prolog_common_inlines.hh \
+ppl_prolog_common.cc \
+Prolog_configured_interface.dox \
+$(interface_generator_dox_files) \
+Prolog_interface.dox \
+Prolog_interface_sysindep.dox \
+Prolog_interface_sysindep_domains.dox \
+Prolog_interface_compilation.dox \
+Prolog_interface_sysdep.dox
+
+interface_generator_dox_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+BUILT_SOURCES = \
+ppl_prolog_domains.hh \
+ppl_prolog_domains.cc.stamp
+
+nodist_noinst_DATA = Prolog_configured_domains.dox
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+CLEANFILES = \
+ at required_instantiations_prolog_cxx_headers@ \
+ at required_instantiations_prolog_cxx_sources@ \
+ppl_prolog_domains.cc.stamp \
+ppl_prolog_domains.hh \
+Prolog_configured_domains.dox
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+
+Prolog_configured_domains.dox: \
+$(interface_generator_dox_dependencies) Makefile
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+ > Prolog_configured_domains.dox
+
+ppl_prolog_domains.hh: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+ > ppl_prolog_hh_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_hh_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_hh_blob
+ rm -f ppl_prolog_hh_blob
+
+ppl_prolog_domains.cc.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+ > ppl_prolog_cc_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_cc_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_cc_blob
+ rm -f ppl_prolog_cc_blob
+ echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Prolog_configured_interface.dox b/interfaces/Prolog/Prolog_configured_interface.dox
new file mode 100644
index 0000000..87df134
--- /dev/null
+++ b/interfaces/Prolog/Prolog_configured_interface.dox
@@ -0,0 +1,63 @@
+/* Configuration Dependent Documentation for Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+ \defgroup PPL_Prolog_interface Prolog Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface
+ for the Prolog language.
+*/
+
+/*! \mainpage Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such system.
+
+The structure of the Prolog interface manual is as follows:
+- System-Independent Features
+ - \ref prolog_interface_overview "Overview"
+ - \ref predicate_specifications "Predicate Specifications"
+ - \ref di_predicates "Domain Independent Predicates"
+ - \ref mip_predicates "Predicates for MIP_Problem"
+ - \ref pip_predicates "Predicates for PIP_Problem"
+ - \ref configured_domains_predicates "Predicates for Configured Domains"
+- \ref PI_Compilation "Compilation and Installation"
+- \ref PI_SD_Features "System-Dependent Features"
+ - \ref GNU_Prolog "GNU Prolog"
+ - \ref CIAO_Prolog "CIAO Prolog"
+ - \ref SICStus_Prolog "SICStus Prolog"
+ - \ref SWI_Prolog "SWI Prolog"
+ - \ref XSB_Prolog "XSB"
+ - \ref YAP_Prolog "YAP"
+
+In all the Prolog interface documentation pages,
+<CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+*/ /* \mainpage */
+
+
diff --git a/interfaces/Prolog/Prolog_interface.dox b/interfaces/Prolog/Prolog_interface.dox
new file mode 100644
index 0000000..e2830d2
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface.dox
@@ -0,0 +1,64 @@
+/* Configuration Independent Documentation for Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+ \defgroup PPL_Prolog_interface Prolog Language Interface
+
+ The Parma Polyhedra Library comes equipped with an interface
+ for the Prolog language.
+*/
+
+/*! \mainpage Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such system.
+
+The structure of the Prolog interface manual is as follows:
+- System-Independent Features
+ - \ref prolog_interface_overview "Overview"
+ - \ref predicate_specifications "Predicate Specifications"
+ - \ref di_predicates "Domain Independent Predicates"
+ - \ref mip_predicates "Predicates for MIP_Problem"
+ - \ref pip_predicates "Predicates for PIP_Problem"
+ - \ref c_polyhedron_predicates "Predicates for C Polyhedra"
+ - \ref other_domains_predicates "Ad hoc Predicates for Other Domains"
+- \ref PI_Compilation "Compilation and Installation"
+- \ref PI_SD_Features "System-Dependent Features"
+ - \ref GNU_Prolog "GNU Prolog"
+ - \ref CIAO_Prolog "CIAO Prolog"
+ - \ref SICStus_Prolog "SICStus Prolog"
+ - \ref SWI_Prolog "SWI Prolog"
+ - \ref XSB_Prolog "XSB"
+ - \ref YAP_Prolog "YAP"
+
+In all the Prolog interface documentation pages,
+<CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+*/ /* \mainpage */
+
+
diff --git a/interfaces/Prolog/Prolog_interface_compilation.dox b/interfaces/Prolog/Prolog_interface_compilation.dox
new file mode 100644
index 0000000..ce3509c
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_compilation.dox
@@ -0,0 +1,59 @@
+// Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+// Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+//
+// This document describes the Parma Polyhedra Library (PPL).
+//
+// Permission is granted to copy, distribute and/or modify this document
+// under the terms of the GNU Free Documentation License, Version 1.2
+// or any later version published by the Free Software Foundation;
+// with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+// The license is included, in various formats, in the `doc' subdirectory
+// of each distribution of the PPL in files named `fdl.*'.
+//
+// The PPL is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3 of the License, or (at your
+// option) any later version. The license is included, in various
+// formats, in the `doc' subdirectory of each distribution of the PPL in
+// files named `gpl.*'.
+//
+// The PPL is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// If you have not received a copy of one or both the above mentioned
+// licenses along with the PPL, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+//
+// For the most up-to-date information see the Parma Polyhedra Library
+// site: http://bugseng.com/products/ppl/ .
+
+
+/*! \page PI_Compilation Compilation and Installation
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of each supported Prolog system. If a supported Prolog system is
+correctly installed in a standard location, things are arranged
+so that the corresponding interface is built and installed.
+
+The Prolog interface files are all installed in the directory
+<CODE>prefix/lib/ppl</CODE>. Since this includes shared and
+dynamically loaded libraries, you must make your dynamic
+linker/loader aware of this fact. If you use a GNU/Linux system,
+try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+for more information.
+
+As an option, the Prolog interface can track the creation and disposal
+of polyhedra. In fact, differently from native Prolog data, PPL polyhedra
+must be explicitly disposed and forgetting to do so is a very common mistake.
+To enable this option, configure the library adding
+<CODE>-DPROLOG_TRACK_ALLOCATION</CODE> to the options passed to the
+C++ compiler.
+Your configure command would then look like
+\code
+ path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ...
+\endcode
+
+*/ /* \page PROLOG_INTERFACE_COMPILATION */
+
diff --git a/interfaces/Prolog/Prolog_interface_sysdep.dox b/interfaces/Prolog/Prolog_interface_sysdep.dox
new file mode 100644
index 0000000..a565ba7
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysdep.dox
@@ -0,0 +1,235 @@
+/* System-Dependent Documentation for Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page PI_SD_Features Prolog Interface System-Dependent Features
+
+\anchor CIAO_Prolog
+<H2>CIAO Prolog</H2>
+
+The Ciao Prolog interface to the PPL is available
+both as ``PPL enhanced'' Ciao Prolog interpreter
+and as a library that can be linked to Ciao Prolog programs.
+Only Ciao Prolog versions 1.10 `#5 and later are supported.'
+
+So that it can be used with the Ciao Prolog PPL interface, the
+Ciao Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_ciao</CODE> Executable</H3>
+
+If an appropriate version of Ciao Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_ciao</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_ciao</CODE> executable is simply the Ciao Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To Ciao Prolog Programs</H3>
+
+In order to allow linking Ciao Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_ciao.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_ciao.*</CODE> contain the executable code for the
+Ciao Prolog interface in various formats (static library, shared library,
+libtool library).
+If your Ciao Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+ciaoc -o myprog prefix/lib/ppl/ppl_ciao.pl ciao_pl_check.pl \
+ -L '-Lprefix/lib/ppl -lppl_ciao -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+\anchor GNU_Prolog
+<H2>GNU Prolog</H2>
+
+The GNU Prolog interface to the PPL is available both as a
+``PPL enhanced'' GNU Prolog interpreter and as a library that can be
+linked to GNU Prolog programs.
+The only GNU Prolog version that is known to work is a patched
+version of the ``unstable version'' tagged
+<A HREF="ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz">20040608</A>
+(which unpacks to a directory called <CODE>gprolog-1.2.18</CODE>).
+The patch is contained in the
+<CODE>interfaces/Prolog/GNU/README</CODE> file of the PPL's distribution.
+
+So that it can be used with the GNU Prolog PPL interface
+(and, for that matter, with any foreign code),
+the GNU Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_gprolog</CODE> Executable</H3>
+
+If an appropriate version of GNU Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_gprolog</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_gprolog</CODE> executable is simply the GNU Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To GNU Prolog Programs</H3>
+
+In order to allow linking GNU Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_gprolog.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_gprolog.*</CODE> contain the executable code for the
+GNU Prolog interface in various formats (static library, shared library,
+libtool library).
+If your GNU Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+ -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+GNU Prolog uses several stacks to execute a Prolog program each with a
+pre-defined default size. If the size of a stack is too small for the
+application an overflow will occur. To change the default size of a
+stack, the user has to set the value of the relevant environment
+variable; in particular, to execute some of the tests, we found it
+necessary to increase the size of GLOBALSZ.
+Thus, for the above example, the compilation command would be
+\code
+GLOBALSZ=32768 gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+ -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+More information on
+adjusting the size of the stacks can be found in Section 3.3 in the
+<A HREF="http://www.gprolog.org/manual/gprolog.html">GNU Prolog
+Manual</A>
+
+\anchor SICStus_Prolog
+<H2>SICStus Prolog</H2>
+
+The SICStus Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SICStus Prolog versions 3.9.0 and later are supported.
+
+<H3>The Statically Linked <CODE>ppl_sicstus</CODE> Executable</H3>
+
+If an appropriate version of SICStus Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_sicstus</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_sicstus</CODE> executable is simply the SICStus Prolog
+system with the Parma Polyhedra Library statically linked.
+The only thing you should do to use the library is to
+load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+
+<H3>Loading the SICStus Interface Dynamically</H3>
+
+In order to dynamically load the library from SICStus Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+\anchor SWI_Prolog
+<H2>SWI-Prolog</H2>
+
+The SWI-Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SWI-Prolog version 5.6.0 and later versions are supported.
+
+<H3>The <CODE>ppl_pl</CODE> Executable</H3>
+
+If an appropriate version of SWI-Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_pl</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_pl</CODE> executable is simply the SWI-Prolog
+shell with the Parma Polyhedra Library statically linked:
+from within <CODE>ppl_pl</CODE> all the services of the library
+are available without further action.
+
+<H3>Loading the SWI-Prolog Interface Dynamically</H3>
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_swiprolog.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> and
+<CODE>ppl_finalize/0</CODE> automatically.
+Alternatively, you can load the library directly with
+\code
+:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+This will call <CODE>ppl_initialize/0</CODE> automatically.
+Analogously,
+\code
+:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+will, as part of the unload process, invoke <CODE>ppl_finalize/0</CODE>.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+\anchor XSB_Prolog
+<H2>XSB</H2>
+
+The XSB Prolog interface to the PPL is available
+as a dynamically linked module.
+Only some CVS versions of XSB starting from 2 July 2005 are known to work.
+CVS versions starting from 11 November 2005 are known not to work.
+
+In order to dynamically load the library from XSB you should
+load the <CODE>ppl_xsb</CODE> module and import the predicates
+you need.
+For things to work, you may have to copy the files
+<CODE>prefix/lib/ppl/ppl_xsb.xwam</CODE>
+and
+<CODE>prefix/lib/ppl/ppl_xsb.so</CODE>
+in your current directory or in one of the XSB library directories.
+
+
+\anchor YAP_Prolog
+<H2>YAP</H2>
+
+The YAP Prolog interface to the PPL is available
+as a dynamically linked module.
+Only YAP versions following 5.1.0 and CVS HEAD versions starting from
+4 January 2006 are supported. Notice that support for unbounded
+integers in YAP is young and may have errors that could affect
+programs using the PPL (see, e.g.,
+<A HREF="http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html">http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html</A>).
+
+In order to dynamically load the library from YAP you should
+simply load <CODE>prefix/lib/ppl/ppl_yap.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> automatically;
+it is the programmer's responsibility to call <CODE>ppl_finalize/0</CODE>
+when the PPL library is no longer needed.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+*/ /* \page PI_SD_Features */
+
diff --git a/interfaces/Prolog/Prolog_interface_sysindep.dox b/interfaces/Prolog/Prolog_interface_sysindep.dox
new file mode 100644
index 0000000..0edc71d
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysindep.dox
@@ -0,0 +1,949 @@
+/* Configuration Independent Documentation for Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page PI_SI_Features System-Independent Features
+
+\anchor pi_si_features
+<H1>System-Independent Features</H1>
+
+The Prolog interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
+Here we just describe those aspects that are specific to the Prolog interface.
+
+\anchor prolog_interface_overview
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The numerical abstract domains available to the Prolog user consist
+ of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+ <EM>products</EM> of simple domains.
+ - The simple domains are:
+ - convex polyhedra, which consist of C_Polyhedron and
+ NNC_Polyhedron;<BR>
+ - weakly relational, which consist of BD_Shape_N and
+ Octagonal_Shape_N
+ where N is one of the numeric types
+ int8, int16, int32, int64, mpz_class, mpq_class,
+ float, double, long_double;<BR>
+ - boxes which consist of
+ Int8_Box, Int16_Box,
+ Int32_Box, Int64_Box,
+ Uint8_Box, Uint16_Box,
+ Uint32_Box, Uint64_Box,
+ Double_Box, Long_Double_Box,
+ Z_Box, Rational_Box, Float_Box; and<BR>
+ - the Grid domain.
+ - The powerset domains are Pointset_Powerset_S where S is
+ a simple domain.
+ - The product domains consist of
+ Direct_Product_S_T,
+ Smash_Product_S_T,
+ Constraints_Product_S_T and
+ Shape_Preserving_Product_S_T where S
+ and T are simple domains.
+- In the following, any of the above numerical
+ abstract domains is called a PPL <EM>domain</EM>
+ and any element of a PPL domain is called a <EM>PPL object</EM>.
+- The Prolog interface to the PPL is initialized and finalized by the
+ predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+ Thus the only interface predicates callable after
+ <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+ (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+ after which the interface's services are usable again.
+ Some Prolog systems allow the specification of initialization
+ and deinitialization functions in their foreign language interfaces.
+ The corresponding incarnations of the Prolog interface
+ have been written so that <CODE>ppl_initialize/0</CODE> and/or
+ <CODE>ppl_finalize/0</CODE> are called automatically.
+ Section \ref PI_SD_Features "System-Dependent Features" will detail
+ in which cases initialization and finalization is automatically
+ performed or is left to the Prolog programmer's responsibility.
+ However, for portable applications, it is best
+ to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+ explicitly: since they can be called multiple times without problems,
+ this will result in enhanced portability at a cost that is, by all means,
+ negligible.
+- A PPL object such as a polyhedron can only be accessed
+ by means of a Prolog term called a <EM>handle</EM>.
+ Note, however, that the data structure of a handle,
+ is implementation-dependent, system-dependent and
+ version-dependent, and, for this reason, deliberately left unspecified.
+ What we do guarantee is that the handle requires very little memory.
+- A Prolog term can be bound to a valid handle for a PPL object by using
+ predicates such as
+\code
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_constraints/2,
+ ppl_new_C_Polyhedron_from_generators/2,
+\endcode
+ These predicates will create or copy a PPL polyhedron
+ and construct a valid handle for referencing it.
+ The last argument is a Prolog term that is
+ unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL object is no longer required,
+ the memory occupied by it should be released
+ using the PPL predicate such as <CODE>ppl_delete_Polyhedron/1</CODE>.
+ To understand why this is important,
+ consider a Prolog program and a variable that is bound to
+ a Herbrand term.
+ When the variable dies (goes out of scope) or is uninstantiated
+ (on backtracking), the term it is bound to is amenable to garbage collection.
+ But this only applies for the standard domain of the language:
+ Herbrand terms.
+ In Prolog+PPL, when, for example,
+ a variable bound to a handle for a Polyhedron dies
+ or is uninstantiated,
+ the handle can be garbage-collected, but the polyhedron to which
+ the handle refers will not be released.
+ Once a handle has been used as an argument in
+ <CODE>ppl_delete_Polyhedron/1</CODE>,
+ it becomes invalid.
+- For a PPL object with space dimension \p k,
+ the identifiers used for the PPL variables
+ must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+ associated Cartesian axes.
+ For example, when using the predicates that combine PPL polyhedra
+ or add constraints or generators to a representation of
+ a PPL polyhedron,
+ the polyhedra referenced and any constraints or generators in the call
+ should follow all the (space) dimension-compatibility rules stated in
+ Section \extref{representation, Representations of Convex Polyhedra}
+ of the main \extref{preamble, PPL user manual}.
+- As explained above, a polyhedron has a fixed topology C or NNC,
+ that is determined at the time of its initialization.
+ All subsequent operations on the polyhedron must respect all the
+ topological compatibility rules stated in Section
+ \extref{representation, Representations of Convex Polyhedra}
+ of the main \extref{preamble, PPL user manual}.
+- Any application using the PPL should make sure that only the
+ intended version(s) of the library are ever used.
+ Predicates
+\code
+ ppl_version_major/1,
+ ppl_version_minor/1,
+ ppl_version_revision/1,
+ ppl_version_beta/1,
+ ppl_version/1,
+ ppl_banner.
+\endcode
+ allow run-time checking of information about the version being used.
+
+\anchor predicate_specifications
+<H2>Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number --> unsigned integer ranging from 0 to an upper bound
+ depending on the actual Prolog system.
+
+ C_int --> Number | - Number C integer
+
+ C_unsigned --> Number C unsigned integer
+
+ Coeff --> Number used in linear expressions;
+ the upper bound will depend on how
+ the PPL has been configured
+
+ Dimension_Type
+ --> Number used for the number of affine and
+ space dimensions and the names of
+ the dimensions;
+ the upper bound will depend on
+ the maximum number of dimensions
+ allowed by the PPL
+ (see ppl_max_space_dimensions/1)
+
+ Boolean --> true | false
+
+ Handle --> Prolog term used to identify a Polyhedron
+
+ Topology --> c | nnc Polyhedral kind;
+ c is closed and nnc is NNC
+
+ VarId --> Dimension_Type variable identifier
+
+ PPL_Var --> '$VAR'(VarId) PPL variable
+
+ Lin_Expr --> PPL_Var PPL variable
+ | Coeff
+ | Lin_Expr unary plus
+ | - Lin_Expr unary minus
+ | Lin_Expr + Lin_Expr addition
+ | Lin_Expr - Lin_Expr subtraction
+ | Coeff * Lin_Expr multiplication
+ | Lin_Expr * Coeff multiplication
+
+ Relation_Symbol --> = equals
+ | =< less than or equal
+ | >= greater than or equal
+ | < strictly less than
+ | > strictly greater than
+
+ Constraint --> Lin_Expr Relation_Symbol Lin_Expr
+ constraint
+
+ Constraint_System list of constraints
+ --> []
+ | [Constraint | Constraint_System]
+
+ Modulus --> Coeff | - Coeff
+
+ Congruence --> Lin_Expr =:= Lin_Expr congruence with modulo 1
+ | (Lin_Expr =:= Lin_Expr) / Modulus
+ congruence with modulo Modulus
+
+ Congruence_System list of congruences
+ --> []
+ | [Congruence | Congruence_System]
+
+ Generator_Denominator --> Coeff must be non-zero
+ | - Coeff
+
+ Generator --> point(Lin_Expr) point
+ | point(Lin_Expr, Generator_Denominator)
+ point
+ | closure_point(Lin_Expr) closure point
+ | closure_point(Lin_Expr, Generator_Denominator)
+ closure point
+ | ray(Lin_Expr) ray
+ | line(Lin_Expr) line
+
+ Generator_System list of generators
+ --> []
+ | [Generator | Generator_System]
+
+ Grid_Generator
+ --> grid_point(Lin_Expr) grid point
+ | grid_point(Lin_Expr, Generator_Denominator)
+ grid point
+ | parameter(Lin_Expr) parameter
+ | parameter(Lin_Expr, Generator_Denominator)
+ parameter
+ | grid_line(Lin_Expr) grid line
+
+ Grid_Generator_System list of grid generators
+ --> []
+ | [Grid_Generator | Grid_Generator_System]
+
+ Artificial_Parameter --> Lin_Expr / Coeff
+
+ Artificial_Parameter_List --> []
+ | [Artificial_Parameter | Artificial_Parameter_List]
+
+ Atom --> Prolog atom
+
+ Universe_or_Empty PPL object
+ --> universe | empty
+
+ Poly_Relation --> is_disjoint with a constraint or congruence
+ | strictly_intersects with a constraint or congruence
+ | is_included with a constraint or congruence
+ | saturates with a constraint or congruence
+ | subsumes with a (grid) generator
+
+ Relation_List --> []
+ | [Poly_Relation | Relation_List]
+
+ Complexity --> polynomial | simplex | any
+
+ Vars_Pair --> PPL_Var - PPL_Var map relation
+
+ P_Func --> [] list of map relations
+ | [Vars_Pair | P_Func].
+
+ Width --> bits_8 | bits_16 | bits_32 | bits_64 | bits_128
+
+ Representation --> unsigned | signed_2_complement
+
+ Overflow --> overflow_wraps | overflow_undefined | overflow_impossible
+
+ Optimization_Mode --> max | min
+
+ Problem_Status --> unfeasible
+ | unbounded
+ | optimized
+
+ Control_Parameter_Name --> pricing for MIP problems
+ | control_strategy for PIP problems
+ | pivot_row_strategy for PIP problems
+
+ Control_Parameter_Value
+ --> pricing_steepest_edge_float
+ | pricing_steepest_edge_exact
+ | pricing_textbook
+ | control_strategy_first
+ | control_strategy_deepest
+ | control_strategy_all
+ | pivot_row_strategy_first
+ | pivot_row_strategy_max_column
+
+ Vars_List --> [] list of PPL variables
+ | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicate_descriptions
+<H2> Predicate Descriptions </H2>
+
+Below is a short description of many of the interface predicates.
+For full definitions of terminology used here,
+see the main \extref{preamble, PPL user manual}.
+
+\anchor di_predicates
+<H3> Domain Independent Predicates </H3>
+
+First we describe the domain independent predicates
+that are included with all instantiations of the Prolog interfaces.
+
+<P><CODE> ppl_version_major(?C_int) </CODE><BR>
+ <EM>Unifies <CODE>C_int</CODE> with the major number of the PPL version.</EM>
+
+<P><CODE> ppl_version_minor(?C_int) </CODE><BR>
+ <EM>Unifies <CODE>C_int</CODE> with the minor number of the PPL version.</EM>
+
+<P><CODE> ppl_version_revision(?C_int) </CODE><BR>
+ <EM>Unifies <CODE>C_int</CODE> with the revision number
+ of the PPL version.</EM>
+
+<P><CODE> ppl_version_beta(?C_int) </CODE><BR>
+ <EM>Unifies <CODE>C_int</CODE> with the beta number of the PPL version.</EM>
+
+<P><CODE> ppl_version(?Atom) </CODE><BR>
+ <EM>Unifies <CODE>Atom</CODE> with the PPL version.</EM>
+
+<P><CODE> ppl_banner(?Atom) </CODE><BR>
+ <EM>Unifies <CODE>Atom</CODE> with
+ information about the PPL version, the licensing, the lack of any
+ warranty whatsoever, the C++ compiler used to build the library,
+ where to report bugs and where to look for further information.</EM>
+
+<P><CODE> ppl_Coefficient_bits(?Bits) </CODE><BR>
+
+ <EM>Unifies <CODE>Bits</CODE> with the number of bits used to encode a
+ Coefficient in the C++ interface; 0 if unbounded.</EM>
+
+<P><CODE> ppl_Coefficient_is_bounded </CODE><BR>
+
+ <EM>Succeeds if and only if the Coefficients in the C++ interface are bounded.</EM>
+
+<P><CODE> ppl_Coefficient_max(Max) </CODE><BR>
+
+ <EM>If the Coefficients in the C++ interface are bounded,
+ then the maximum coefficient the C++ interface can handle is
+ unified with <CODE>Max</Code>.
+ If the Prolog system cannot handle this coefficient, then
+ an exception is thrown.
+ It fails if the Coefficients in the C++ interface are unbounded.</EM>
+
+<P><CODE> ppl_Coefficient_min(Min) </CODE><BR>
+
+ <EM>If the Coefficients in the C++ interface are bounded,
+ then the minimum coefficient the C++ interface can handle is
+ unified with <CODE>Min</Code>.
+ If the Prolog system cannot handle this coefficient, then
+ an exception is thrown.
+ It fails if the Coefficients in the C++ interface are unbounded.</EM>
+
+<P><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE><BR>
+
+ <EM>Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+ this library can handle.</EM>
+
+<P><CODE>
+ ppl_initialize
+ </CODE><BR>
+
+ <EM>Initializes the PPL interface.
+ Multiple calls to <CODE>ppl_initialize</CODE> does no harm.</EM>
+
+<P><CODE>
+ ppl_finalize
+ </CODE><BR>
+
+ <EM>Finalizes the PPL interface.
+ Once this is executed, the next call to an interface predicate must
+ either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+ Multiple calls to <CODE>ppl_finalize</CODE> does no harm.</EM>
+
+<P><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE><BR>
+
+ <EM>Sets the atom to be thrown by timeout exceptions
+ to <CODE>Atom</CODE>.
+ The default value is <CODE>time_out</CODE>.</EM>
+
+<P><CODE> ppl_timeout_exception_atom(?Atom) </CODE><BR>
+
+ <EM>The atom to be thrown by timeout exceptions
+ is unified with <CODE>Atom</CODE>.</EM>
+
+<P><CODE> ppl_set_timeout(+Csecs) </CODE><BR>
+
+ <EM>Computations taking exponential time will be interrupted
+ some time after <CODE>Csecs</CODE> centiseconds after that call.
+ If the computation is interrupted that way, the current timeout
+ exception atom will be thrown.
+ <CODE>Csecs</CODE> must be strictly greater than zero.</EM>
+
+<P><CODE> ppl_reset_timeout </CODE><BR>
+
+ <EM>Resets the timeout time so that the computation is not interrupted.</EM>
+
+<P><CODE> ppl_set_deterministic_timeout(+Unscaled_Weight, +Scale) </CODE><BR>
+
+ <EM>Computations taking exponential time will be interrupted
+ some time after reaching the complexity threshold
+ \f$\mathrm{Weight} = \mathrm{Unscaled\_Weight} \cdot 2^\mathrm{Scale}\f$.
+ If the computation is interrupted that way, the current timeout
+ exception atom will be thrown.
+ <CODE>Unscaled_Weight</CODE> must be strictly greater than zero;
+ <CODE>Scale</CODE> must be non-negative;
+ an exception is thrown if the computed weight threshold exceeds
+ the maximum allowed value.</EM>
+ <P>
+ <EM>NOTE:</EM> This "timeout" checking functionality is said to be
+ <EM>deterministic</EM> because it is not based on actual elapsed time.
+ Its behavior will only depend on (some of the) computations performed
+ in the PPL library and it will be otherwise independent from the
+ computation environment (CPU, operating system, compiler, etc.).
+ The weight mechanism is under beta testing: client applications
+ should be ready to reconsider the tuning of these weight thresholds
+ when upgrading to newer version of the PPL.
+
+<P><CODE> ppl_reset_deterministic_timeout </CODE><BR>
+
+ <EM>Resets the deterministic timeout so that the computation is not
+ interrupted.</EM>
+
+<P><CODE> ppl_set_rounding_for_PPL </CODE><BR>
+
+ <EM>Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has
+ previously been called.</EM>
+
+
+<P><CODE> ppl_restore_pre_PPL_rounding </CODE><BR>
+
+ <EM>Sets the FPU rounding mode as it was before initialization of the PPL.
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.</EM>
+
+<P><CODE> ppl_irrational_precision(?Precision) </CODE><BR>
+
+ <EM>Unifies <CODE>Precision</CODE> with the precision parameter for
+ irrational calculations.</EM>
+
+<P><CODE> ppl_set_irrational_precision(+Precision) </CODE><BR>
+
+ <EM>Sets the precision parameter for irrational calculations to
+ <CODE>Precision</CODE>. In the following irrational calculations
+ returning an unbounded rational (e.g., when computing a square root),
+ the lesser between numerator and denominator will be limited to
+ <CODE>2**Precision</CODE>.</EM>
+
+
+\anchor mip_predicates
+<H3> Predicates for MIP_Problem </H3>
+Here we describe the predicates available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<P><CODE>
+ ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE><BR>
+
+ <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+ the vector space of dimension <CODE>Dimension_Type</CODE>,
+ objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+ ppl_new_MIP_Problem(+Dimension_Type, +Constraint_System, +Lin_Expr,
+ +Optimization_Mode, -Handle)
+</CODE><BR>
+
+ <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+ the feasible region the vector space of dimension
+ <CODE>Dimension_Type</CODE>, represented by <CODE>Constraint_System</CODE>,
+ objective function <CODE>Lin_Expr</CODE> and optimization mode
+ <CODE>Optimization_Mode</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+ ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2)
+</CODE><BR>
+
+ <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ from the MIP Problem
+ referenced by \c Handle_1.
+ \c Handle_2 is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE><BR>
+
+ <EM>Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+ with the one referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>
+ ppl_delete_MIP_Problem(+Handle)
+</CODE><BR>
+
+ <EM>Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+ After execution,
+ <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE><BR>
+
+ <EM>Unifies the dimension of the vector space in which the
+ MIP Problem referenced by <CODE>Handle</CODE> is embedded
+ with <CODE>Dimension_Type</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_integer_space_dimensions(+Handle, ?Vars_List)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Vars_List</CODE> with a list of variables representing
+ the integer space dimensions of the MIP Problem
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+ the constraints in the constraints system
+ representing the feasible region for the MIP Problem
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_objective_function(+Handle, ?Lin_Expr)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Lin_Expr</CODE> with the objective function
+ for the MIP Problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+ for the MIP Problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_clear(+Handle)
+</CODE><BR>
+
+ <EM>Resets the MIP problem referenced by <CODE>Handle</CODE>
+ to be the trivial problem with
+ the feasible region the \f$0\f$-dimensional universe,
+ objective function \f$0\f$ and optimization mode <CODE>max</CODE>.</EM>
+
+<P><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+ +Handle, +Dimension_Type)
+ </CODE><BR>
+
+ <EM>Embeds the MIP problem referenced by <CODE>Handle</CODE>
+ in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the variables in <CODE>Vars_List</CODE> are added to
+ the set of integer space dimensions.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with the constraint <CODE>Constraint</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with all the constraints in
+ <CODE>Constraint_System</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the objective function is changed to <CODE>Lin_Expr</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the value for the relevant control parameter name is
+ changed to <CODE>Control_Parameter_Value</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name,
+ ?Control_Parameter_Value)
+</CODE><BR>
+
+ <EM>Unifies \c Control_Parameter_Value with the value of the
+ control parameter \c Control_Parameter_Name.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE><BR>
+
+ <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+ so that the optimization mode is changed to
+ <CODE>Optimization_Mode</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE><BR>
+
+ <EM>Succeeds if and only if the MIP Problem referenced by
+ <CODE>Handle</CODE> is satisfiable.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE><BR>
+
+ <EM>Solves the MIP problem referenced by
+ <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+ with:
+ <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+ <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+ there is no finite bound to the value of the objective function;
+ <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Generator</CODE> with a feasible point
+ for the MIP problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Generator</CODE> with an optimizing point for
+ the MIP problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_optimal_value(+Handle, ?Coeff_1, ?Coeff_2)
+</CODE><BR>
+
+ <EM>Unifies <CODE>Coeff_1</CODE> and <CODE>Coeff_2</CODE>
+ with the numerator and denominator, respectively, for the optimal value
+ for the MIP problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+ ?Coeff_1, ?Coeff_2)
+</CODE><BR>
+ <EM>Evaluates the objective function of the MIP problem referenced by
+ <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+ <CODE>Coefficient_1</CODE> is unified with the numerator and
+ <CODE>Coefficient_2</CODE> is unified with the denominator of the
+ objective function value at <CODE>Generator</CODE>.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_OK(+Handle)
+</CODE><BR>
+
+ <EM>Succeeds only if the MIP Problem referenced by
+ <CODE>Handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants.
+ Useful for debugging purposes.</EM>
+
+<P><CODE>
+ ppl_MIP_Problem_ascii_dump(+Handle)
+</CODE><BR>
+
+ <EM>Dumps an ascii representation of the PPL internal state for
+ the MIP problem referenced by <CODE>Handle</CODE> on
+ the standard output.</EM>
+
+<BR>
+
+\anchor pip_predicates
+<H3> Predicates for PIP_Problem </H3>
+Here we describe some functions available for PPL objects
+defining parametric integer programming problems.
+
+<P><CODE>
+ ppl_new_PIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE><BR>
+
+ <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ with the
+ feasible region the vector space of dimension <CODE>dimension</CODE>,
+ empty constraint_system and empty set of parametric variables.
+ <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+ ppl_new_PIP_Problem_from_PIP_Problem(+Handle_1, -Handle_2)
+</CODE><BR>
+ <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ from the PIP Problem
+ referenced by \c Handle_1.
+ \c Handle_2 is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+ ppl_new_PIP_Problem(+Dimension_Type, +Constraint_System, +Vars_List,
+ -Handle)
+</CODE><BR>
+
+ <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ having space
+ dimension <CODE>dimension</CODE>, a feasible region represented by
+ <CODE>constraint_system</CODE> and parametric variables represented
+ by <CODE>Vars_List</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE><BR>
+ <EM>Swaps the PIP Problem referenced by <CODE>Handle_1</CODE>
+ with the one referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>
+ ppl_delete_PIP_Problem(+Handle)
+</CODE><BR>
+ <EM>Deletes the PIP Problem referenced by <CODE>Handle</CODE>.
+ After execution,
+ <CODE>Handle</CODE> is no longer a valid handle for a PPL PIP Problem.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE><BR>
+ <EM>Unifies the dimension of the vector space in which the
+ PIP Problem referenced by <CODE>Handle</CODE> is embedded
+ with <CODE>Dimension_Type</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_parameter_space_dimensions(+Handle, ?Vars_List)
+</CODE><BR>
+ <EM>Unifies <CODE>Vars_List</CODE> with a list of variables representing
+ the parameter space dimensions of the PIP Problem
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_constraints(+Handle, ?Constraint_System)
+</CODE><BR>
+ <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+ the constraints in the constraints system
+ representing the feasible region for the PIP Problem
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name,
+ ?Control_Parameter_Value)
+</CODE><BR>
+
+ <EM>Unifies \c Control_Parameter_Value with the value of the
+ control parameter \c Control_Parameter_Name.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_clear(+Handle)
+</CODE><BR>
+ <EM>Resets the PIP problem referenced by <CODE>Handle</CODE>
+ to be the trivial problem with
+ the feasible region the \f$0\f$-dimensional universe.</EM>
+
+<P><CODE> ppl_PIP_Problem_add_space_dimensions_and_embed(
+ +Handle, +Dimension_Type1, +Dimension_Type2)
+ </CODE><BR>
+ <EM>Embeds the PIP problem referenced by <CODE>handle</CODE>
+ in a space that is enlarged by <CODE>dimension1</CODE> non-parameter
+ dimensions and <CODE>dimension2</CODE> parameter dimensions.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_add_to_parameter_space_dimensions(+Handle, +Vars_List)
+</CODE><BR>
+ <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+ so that the variables in <CODE>Vars_List</CODE> are added to
+ the set of parameter space dimensions.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE><BR>
+ <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with the constraint <CODE>Constraint</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE><BR>
+ <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+ so that the feasible region is represented by the original constraint
+ system together with all the constraints in
+ <CODE>Constraint_System</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value)
+</CODE><BR>
+
+ <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+ so that the value for the relevant control parameter name is
+ changed to <CODE>Control_Parameter_Value</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_is_satisfiable(+Handle)
+</CODE><BR>
+ <EM>Succeeds if and only if the PIP Problem referenced by
+ <CODE>Handle</CODE> is satisfiable.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_solve(+Handle, ?PIP_Problem_Status)
+</CODE><BR>
+ <EM>Solves the PIP problem referenced by
+ <CODE>Handle</CODE> and unifies <CODE>PIP_Problem_Status</CODE>
+ with:
+ <CODE>unfeasible</CODE>, if the PIP problem is not satisfiable;
+ <CODE>optimized</CODE>, if the PIP problem admits an optimal solution.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_solution(+Handle1, ?Handle2)
+</CODE><BR>
+ <EM>Solves the PIP problem referenced by <CODE>Handle1</CODE> and
+ creates a PIP tree node \f$\mathrm{Node}\f$ representing this a solution
+ if it exists and bottom otherwise
+ \c Handle_2 is unified with the handle for \f$\mathrm{Sol}\f$.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_optimizing_solution(+Handle, ?PIP_Tree_Node)
+</CODE><BR>
+ <EM>Solves the PIP problem referenced by <CODE>Handle1</CODE> and
+ creates a PIP tree node \f$\mathrm{Node}\f$ representing this an optimizing
+ solution if a solution exists and bottom otherwise
+ \c Handle_2 is unified with the handle for \f$\mathrm{Sol}\f$.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_has_big_parameter_dimension(+Handle, +Dimension_Type)
+</CODE><BR>
+ <EM>Succeeds if and only if the PIP Problem referenced by
+ <CODE>Handle</CODE> has a dimension \p dim for the big parameter
+ and \p Dimension_Type unifies with \p dim.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_set_big_parameter_dimension(+Handle, +Dimension_Type)
+</CODE><BR>
+
+ <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+ so that the dimension for the big parameter is \p Dimension_Type.</EM>
+
+<P><CODE>
+ ppl_PIP_Problem_OK(+Handle)
+</CODE><BR>
+ <EM>Succeeds only if the PIP Problem referenced by
+ <CODE>Handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants.
+ Useful for debugging purposes.</EM>
+
+<P><CODE>ppl_PIP_Problem_ascii_dump(+Handle)</CODE><BR>
+ <EM>Dumps an ascii representation of the PPL internal state for
+ the PIP problem referenced by \c Handle on the standard output.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_constraints(+Handle, ?Constraint_System)
+</CODE><BR>
+ <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+ the parameter constraints in the PIP tree node
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_is_solution(+Handle)
+</CODE><BR>
+ <EM>Succeeds if and only if <CODE>handle</CODE> represents
+ a solution node.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_is_decision(+Handle)
+</CODE><BR>
+ <EM>Succeeds if and only if <CODE>handle</CODE> represents
+ a decision node.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_is_bottom(+Handle)
+</CODE><BR>
+ <EM>Succeeds if and only if <CODE>handle</CODE> represents bottom.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_artificials(+Handle, ?Artificial_Parameter_List)
+</CODE><BR>
+ <EM>Unifies <CODE>Artificial_Parameter_List</CODE> with a list of
+ the artificial parameters in the PIP tree node
+ referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_OK(+Handle)
+</CODE><BR>
+ <EM>Succeeds only if the PIP tree node referenced by
+ <CODE>Handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants.
+ Useful for debugging purposes.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_parametric_values(+Handle, +Var, ?Lin_Expr)
+</CODE><BR>
+ <EM>Unifies \p Lin_Expr with a linear expression representing
+ the values of problem variable \p Var in the solution node
+ represented by <CODE>Handle</CODE>.
+ The linear expression may involve problem parameters
+ as well as artificial parameters.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_true_child(+Handle1, ?Handle2)
+</CODE><BR>
+ <EM>If the PIP_Tree_Node represented by \p Handle1 is a decision node
+ unifies the PIP tree node referenced by <CODE>Handle2</CODE>
+ with the child on the true branch of the
+ PIP tree node represented by <CODE>Handle1</CODE>.
+ An exception is thrown if this is not a decision node.</EM>
+
+<P><CODE>
+ ppl_PIP_Tree_Node_false_child(+Handle1, ?Handle2)
+</CODE><BR>
+ <EM>If the PIP_Tree_Node represented by \p Handle1 is a decision node
+ unifies the PIP tree node referenced by <CODE>Handle2</CODE>
+ with the child on the false branch of the
+ PIP tree node represented by <CODE>Handle1</CODE>.
+ An exception is thrown if this is not a decision node.</EM>
+
+*/ /* \page PI_SI_Features */
diff --git a/interfaces/Prolog/Prolog_interface_sysindep_domains.dox b/interfaces/Prolog/Prolog_interface_sysindep_domains.dox
new file mode 100644
index 0000000..a6b488f
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysindep_domains.dox
@@ -0,0 +1,914 @@
+/* Configuration Independent Documentation for Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page domains_predicates Domains Predicates
+
+The structure of this section is as follows:
+ - \ref c_polyhedron_predicates "Predicates for C Polyhedra"
+ - \ref other_domains_predicates "Ad hoc Predicates for Other Domains"
+
+<BR>
+
+\anchor c_polyhedron_predicates
+<H1>Predicates for the C Polyhedron Domain</H1>
+ Here we provide a short description for each of the predicates
+ available for the domain of C polyhedra.
+Note that predicates for other domains will follow a similar pattern.
+
+<H2>Constructor, copy, conversion and destructor predicates</H2>
+<H3>Constructor predicates for C polyhedra</H3>
+The constructor predicates build a
+C polyhedron from a specification
+and binds the given variable to a handle for future referencing.
+The specification can be:
+- the number of space dimensions and an atom indicating if it
+ is to be the universe or empty element.
+- a representation for the particular class of semantic geometric
+ descriptors to which the element being built belongs.
+For example,
+ a C Polyhedron can be built from a list of
+ non-strict inequality or equality constraints or a list of equality
+ congruences or a list of generators that contains no closure points.
+
+<P><CODE>ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \f$\cP\f$
+ with \c Dimension_Type dimensions; it is empty
+ or the universe depending on whether \c Atom
+ is \c empty or \c universe, respectively.
+ \c Handle is unified with the handle for \f$\cP\f$.
+ Thus the query
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+ creates the C polyhedron defining the
+ 3-dimensional vector space
+ \f$\Rset^3\f$ with \c X bound to a valid handle for accessing it.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P from
+ \c Constraint_System.
+ \c Handle is unified with the handle for \p P.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_congruences(+Congruence_System, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P from
+ \c Congruence_System.
+ \c Handle is unified with the handle for \p P.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P from
+ \c Generator_System.
+ \c Handle is unified with the handle for \p P.</EM>
+
+
+<H3>Predicates that build new C polyhedra
+ by copying or converting from
+ other semantic geometric descriptions</H3>
+ Besides the constructors listed above, the library also
+ provides:
+- copy constructors that will copy an element belonging
+ to the same class of semantic geometric descriptions
+- conversion operators that build a new semantic geometric
+ description starting from a \b friend;
+ that is, a semantic geometric description in different class
+ (e.g., ppl_new_Grid_from_C_Polyhedron,
+ ppl_new_C_Polyhedron_from_BD_Shape_mpq_class, etc.).<BR>
+
+ The copy and conversion predicates have two versions,
+ one with arity 2 for the source and target handles and one
+ with an extra argument denoting the maximum complexity to be used
+ in the conversion;
+ this complexity argument is ignored when the
+ the friend and the element being built are in the same class.
+
+<P><CODE>ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P_1 from
+ the c polyhedron referenced by handle \c Handle_1.
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P_1 from
+ the nnc polyhedron referenced by handle \c Handle_1.
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P_1 from
+ the c polyhedron referenced by handle \c Handle_1
+ using an algorithm whose complexity does not exceed \c Complexity;
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+ <EM>Builds a new C polyhedron \p P_1 from
+ the nnc polyhedron referenced by handle \c Handle_1
+ using an algorithm whose complexity does not exceed \c Complexity;
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+
+<H3>Destructor predicate</H3>
+Below is the destructor predicate for the Polyhedron domain.
+
+<P><CODE>ppl_delete_Polyhedron(+Handle)</CODE><BR>
+ <EM>Invalidates the handle referenced by \c Handle:
+ this makes sure the corresponding resources will eventually be released.</EM>
+
+
+<H2>Predicates that do not change the polyhedron</H2>
+<H3>Test Predicates</H3>
+These predicates test the polyhedron for different properties
+and succeed or fail depending on the outcome.
+
+<P><CODE>ppl_Polyhedron_is_empty(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle is empty.</EM>
+
+<P><CODE>ppl_Polyhedron_is_universe(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle is the universe.</EM>
+
+<P><CODE>ppl_Polyhedron_is_bounded(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle is bounded.</EM>
+
+<P><CODE>ppl_Polyhedron_contains_integer_point(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle contains an integer point.</EM>
+
+<P><CODE>ppl_Polyhedron_is_topologically_closed(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle is topologically closed.</EM>
+
+<P><CODE>ppl_Polyhedron_is_discrete(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle is discrete.</EM>
+
+<P><CODE>ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+ <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above
+ in the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+ <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below
+ in the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_2</CODE> is included in or equal to
+ the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_2</CODE> is included in but not equal to
+ the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_2</CODE> is disjoint from
+ the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_1</CODE> is
+ equal to the polyhedron referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_OK(+Handle)</CODE><BR>
+ <EM>Succeeds only if the polyhedron referenced by
+ \c Handle is well formed, i.e., if it
+ satisfies all its implementation invariants.
+ Useful for debugging purposes.</EM>
+
+<P><CODE>ppl_Polyhedron_constrains(+Handle, +PPL_Var)</CODE><BR>
+ <EM>Succeeds if and only if the polyhedron referenced by
+ \c Handle constrains the dimension \c PPL_Var.</EM>
+
+
+<H3>Predicates that return information about the polyhedron</H3>
+These predicates will obtain more detailed information about the
+polyhedron
+unifying some of their arguments with the results.
+
+<P><CODE>ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+ <EM>Unifies \c Dimension_Type with the dimension of the vector space enclosing
+ the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+ <EM>Unifies \c Dimension_Type with the affine dimension of
+ the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+ <EM>Unifies \c Relation_List with the list of relations the
+ polyhedron referenced by \c Handle has with \c Constraint.
+ The possible relations are listed in the
+ grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+ <EM>Unifies \c Relation_List with the list of relations the
+ polyhedron referenced by \c Handle has with \c Generator.
+ The possible relations are listed in the
+ grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+ <EM>Unifies \c Relation_List with the list of relations the
+ polyhedron referenced by \c Handle has with \c Congruence.
+ The possible relations are listed in the
+ grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)</CODE><BR>
+ <EM>Unifies \c Constraint_System with
+ the constraints (in the form of a list) in the constraint system
+ satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_congruences(+Handle, ?Congruence_System)</CODE><BR>
+ <EM>Unifies \c Congruence_System with
+ the congruences (in the form of a list) in the congruence system
+ satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_generators(+Handle, ?Generator_System)</CODE><BR>
+ <EM>Unifies \c Generator_System with
+ the generators (in the form of a list) in the generator system
+ for the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_constraints(+Handle, ?Constraint_System)</CODE><BR>
+ <EM>Unifies \c Constraint_System with
+ the constraints (in the form of a list)
+ in the minimized constraint system
+ satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_congruences(+Handle, ?Congruence_System)</CODE><BR>
+ <EM>Unifies \c Congruence_System with
+ the congruences (in the form of a list)
+ in the minimized congruence system
+ for the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_generators(+Handle, ?Generator_System)</CODE><BR>
+ <EM>Unifies \c Generator_System with
+ the generators (in the form of a list)
+ in the minimized generator system
+ satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from above in \p P.
+
+ \c Coeff_1 is unified with the numerator of the supremum value
+ and \c Coeff_2 with the denominator of the supremum value.
+ If the supremum is also the maximum, \c Boolean is unified
+ with the atom \c true and, otherwise, unified with
+ the atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from below in \p P.
+
+ \c Coeff_1 is unified with the numerator of the infinum value
+ and \c Coeff_2 with the denominator of the infinum value.
+ If the infinum is also the minimum, \c Boolean is unified
+ with the atom \c true and, otherwise, unified with
+ the atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+ <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from above in \p P.
+
+ \c Coeff_1 is unified with the numerator of the supremum value
+ and \c Coeff_2 with the denominator of the supremum value
+ and \c Point with a point or closure point where \c Lin_Expr reaches
+ this value.
+ If the supremum is also the maximum, \c Boolean is unified
+ with the atom \c true and, otherwise, unified with the
+ atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+ <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from below in \p P.
+
+ \c Coeff_1 is unified with the numerator of the infinum value
+ and \c Coeff_2 with the denominator of the infinum value
+ and \c Point with a point or closure point where \c Lin_Expr reaches
+ this value.
+ If the infinum is also the minimum, \c Boolean is unified
+ with the atom \c true and, otherwise, unified with the
+ atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the total memory in
+bytes occupied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the external memory in
+bytes occupied by the polyhedron referenced by \c Handle.</EM>
+
+
+<H3>Ascii dump predicate</H3>
+This output predicate is useful for debugging.
+
+<P><CODE>ppl_Polyhedron_ascii_dump(+Handle)</CODE><BR>
+ <EM>Dumps an ascii representation of the PPL internal state for
+ the polyhedron referenced by \c Handle on the standard output.</EM>
+
+
+<H2>Space-dimension preserving predicates that may change
+ the polyhedron</H2>
+These predicates may modify the polyhedron referred to
+by the handle in first argument;
+the (dimension of the) vector space in which it is embedded is unchanged.
+<H3>Predicates that may change the polyhedron by adding
+to its constraint or generator descriptions</H3>
+Note that there are two forms of these predicates
+differentiated in the names by the
+words "add" or "refine with";
+see Section \extref{Generic_Operations_on_Semantic_Geometric_Descriptors, Generic Operations on Semantic Geometric Descriptors} in the
+main \extref{preamble, PPL User Manual}
+for the differences in the semantics and therefore, the expected behavior,
+between these forms.
+
+<P><CODE>ppl_Polyhedron_add_constraint(+Handle, +Constraint)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding
+ \c Constraint to its constraint system.
+ For a C polyhedron, \c Constraint must be
+ an equality or a non-strict inequality.</EM>
+
+<P><CODE>ppl_Polyhedron_add_congruence(+Handle, +Congruence)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding
+ \c Congruence to its congruence system.
+ For a C polyhedron, \c Congruence must be
+ an equality.</EM>
+
+<P><CODE>ppl_Polyhedron_add_generator(+Handle, +Generator)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding
+ \c Generator to its generator system.
+ For a C polyhedron, \c Generator must be
+ a line, ray or point.</EM>
+
+<P><CODE>ppl_Polyhedron_add_constraints(
+ +Handle,
+ +Constraint_System)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding to its constraint system the constraints in
+ \c Constraint_System.
+ For a C polyhedron, \c Constraints must be a list of
+ equalities and non-strict inequalities.</EM>
+
+<P><CODE>ppl_Polyhedron_add_congruences(
+ +Handle,
+ +Congruence_System)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding to its congruence system the congruences in
+ \c Congruence_System.
+ For a C polyhedron, \c Congruences must be a list of
+ equalities.</EM>
+
+<P><CODE>ppl_Polyhedron_add_generators(
+ +Handle,
+ +Generator_System)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by adding to its generator system the generators in
+ \c Generator_System.
+ For a C polyhedron, \c Generators must be a list of
+ lines, rays and points.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_constraint(
+ +Handle,
+ +Constraint)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by refining its constraint system with
+ \c Constraint.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_congruence(
+ +Handle,
+ +Congruence)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by refining its congruence system with
+ \c Congruence.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_constraints(
+ +Handle,
+ +Constraint_System)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by refining its constraint system with
+ the constraints in \c Constraint_System.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_congruences(
+ +Handle,
+ +Congruence_System)</CODE><BR>
+ <EM>Updates the polyhedron referenced by \c Handle to
+ one obtained by refining its congruence system with
+ the congruences in \c Congruence_System.</EM>
+
+
+<H3>Predicates that transform the polyhedron</H3>
+These predicates enable transformations
+such as taking the topological closure (which for the domain of
+C polyhedron is the identity transformation),
+unconstraining a specified dimension
+as explained in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Cylindrification, Cylindrification Operator}
+and several different image and preimage affine transfer relations;
+for details of the latter see Sections
+\extref{Images_and_Preimages_of_Affine_Transfer_Relations, Images and Preimages of Affine Transfer Relations}
+and
+\extref{Generalized_Affine_Relations, Generalized Affine Relations}
+<P><CODE>ppl_Polyhedron_topological_closure_assign(+Handle)</CODE><BR>
+ <EM>Assigns to the polyhedron referenced by \c Handle
+ its topological closure.</EM>
+
+<P><CODE>ppl_Polyhedron_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+ <EM>Modifies the polyhedron \p P referenced by \c Handle by unconstraining
+ the space dimension \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+ <EM>Modifies the polyhedron \p P referenced by \c Handle by unconstraining
+ the space dimensions that are specified in \c List_of_PPL_Var.
+ The presence of duplicates in \c List_of_PPL_Var is a waste
+ but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Transforms the polyhedron referenced by \c Handle
+ assigning the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Transforms the polyhedron referenced by \c Handle
+ substituting the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized image with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1/Coeff
+ \f$\leq\f$ \c PPL_Var
+ \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized preimage with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1/Coeff
+ \f$\leq\f$ \c PPL_Var
+ \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized image with respect to the
+ generalized affine transfer relation
+ \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff,
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized preimage with respect to the
+ generalized affine transfer relation
+ \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff,
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized image with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2,
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+ <EM>Assigns to polyhedron \p P referenced by \c Handle
+ the generalized preimage with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2,
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+
+<H3>Predicates whose results depend on more than one polyhedron</H3>
+These predicates include the binary operators which will assign to the
+polyhedron referred to by the first argument
+its combination with the polyhedron referred to by the second argument
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Intersection_and_Convex_Polyhedral_Hull, Intersection and Convex Polyhedral Hull}
+and
+\extref{Convex_Polyhedral_Difference, Convex Polyhedral Difference};
+and a linear partitioning operator described below.
+
+<P><CODE>ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the intersection of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the upper bound of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the difference of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the time elapse of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_hull(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the poly-hull of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_difference(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the poly-difference of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_upper_bound_assign_if_exact(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if the least upper bound of the
+ polyhedron \p P_1 referenced by \c Handle_1
+ with the polyhedron referenced by \c Handle_2 is exact;
+ in which case the least upper bound is assigned
+ to \p P_1;
+ fails otherwise.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_hull_assign_if_exact(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if the least upper bound of the
+ polyhedron \p P_1 referenced by \c Handle_1
+ with the polyhedron referenced by \c Handle_2 is exact;
+ in which case the least upper bound is assigned
+ to \p P_1;
+ fails otherwise.</EM>
+
+<P><CODE>ppl_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if the intersection of polyhedron \p P_1
+ referenced by \c Handle_1 and the polyhedron \p P_2 referenced by \c Handle_2
+ is non-empty.
+ Assigns to \p P_1 its meet-preserving simplification with
+ respect to \p P_2.</EM>
+
+<P><CODE>ppl_Polyhedron_linear_partition(+Handle_1, +Handle_2, -Handle_3,
+ -Handle_4)</CODE><BR>
+ <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+ in the Polyhedron domain. The predicate unifies handle
+ \c Handle_3 to a reference to the intersection of
+ \p P_1 and \p P_2 and \c Handle_4 to a reference to
+ a pointset powerset of nnc polyhedra \p P_4;
+ where \p P_4 is the linear partition of \p P_1 with respect to \p P_2.
+ This predicate is only provided if the
+ class \c Pointset_Powerset_NNC_Polyhedron
+ has been enabled when configuring the library.</EM>
+
+
+<H3>Predicates for widening and extrapolation</H3>
+In addition to the above binary operators, there are also a number
+of widening, extrapolation and narrowing operators
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Widening_Operators, Widening Operators},
+\extref{Widening_with_Tokens, Widening with Tokens} and
+\extref{Extrapolation_Operators, Extrapolation Operators}.
+Note that for all these widening and extrapolation predicates
+to behave as specified
+the polyhedron referred to by the second argument has to be
+contained in (or equal to) the polyhedron referred to by the first argument.
+
+<P><CODE>ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<EM>Same as predicate <CODE>ppl_Polyhedron_H79_widening_assign_with_tokens</CODE>/4</EM>
+
+<P><CODE>ppl_Polyhedron_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<EM>Same as predicate <CODE>ppl_Polyhedron_H79_widening_assign</CODE>/2</EM>
+
+<P><CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the BHRZ03-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+ the H79-widening of \p P_1 with the polyhedron
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.</EM>
+
+
+<H2>Predicates that may modify the vector space</H2>
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+<H3>Predicate for concatenation</H3>
+For more information on this operation, see Section
+\extref{Concatenating_Polyhedra, Concatenating Polyhedra},
+of the main \extref{preamble, PPL User Manual}.
+
+<P><CODE>ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+ the concatenation of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+
+<H3>Predicates for mapping dimensions or changing the vector space</H3>
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Adding_New_Dimensions_to_the_Vector_Space, Adding New Dimensions to the Vector Space},
+\extref{Removing_Dimensions_from_the_Vector_Space, Removing Dimensions from the Vector Space},
+\extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space},
+\extref{expand_space_dimension, Expanding One Dimension of the Vector Space to Multiple Dimensions}
+and
+\extref{Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension, Folding Multiple Dimensions of the Vector Space into One Dimension}.
+
+<P><CODE>ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+ <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+ the polyhedron \p P referenced by \c Handle
+ and and_embeds \p P in this space.</EM>
+
+<P><CODE>ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+ <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+ the polyhedron \p P referenced by \c Handle
+ and and_projects \p P in this space.</EM>
+
+<P><CODE>ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+ <EM>Removes from the vector space enclosing
+ the polyhedron \p P referenced by \c Handle the space dimensions that
+ are specified in \c List_of_PPL_Var. The presence
+ of duplicates in \c List_of_PPL_Var is a waste but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+ <EM>Removes the higher dimensions from the vector space enclosing
+ the polyhedron \p P referenced by \c Handle
+ so that, upon successful return, the new space dimension is
+ \c Dimension_Type.</EM>
+
+<P><CODE>ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+ <EM>Expands the \c PPL_Var-th
+ dimension of the vector space enclosing
+ the polyhedron referenced by \c Handle to
+ \c Dimension_Type new space dimensions.</EM>
+
+<P><CODE>ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+ <EM>Modifies the polyhedron referenced by \c Handle
+ by folding the
+ space dimensions contained in \c List_of_PPL_Vars
+ into dimension \c PPL_Var.
+ The presence of duplicates in \c List_of_PPL_Vars is a waste
+ but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+ <EM>Remaps the dimensions of the vector space according to a
+ partial function.
+ This function is specified by means of the \c P_Func,
+ which has \p n entries.
+ The result is undefined if \c P_Func does not encode a partial
+ function.</EM>
+
+
+\anchor other_domains_predicates
+<H1>Ad hoc Predicates for Other Domains</H1>
+<H2>Extra Predicates Specifically for the Pointset Powerset Domains</H2>
+ The powerset domains can be instantiated by taking as a base domain
+ any fixed semantic geometric description
+ (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+ An element of the powerset domain represents a disjunctive collection
+ of base objects (its disjuncts), all having the same space dimension.
+ For more information on this construct,
+ see Section \extref{The_Powerset_Domain, The Powerset Domain}
+ in the main \extref{preamble, PPL User Manual}.
+
+ Besides the predicates that are available in all semantic geometric
+ descriptions (whose documentation is not repeated here),
+ the powerset domain also provides several ad hoc predicates.
+ These are specified below, instantiated for the
+ PPL domain Pointset_Powerset_C_Polyhedron.
+ Note that predicates for other pointset powerset domains
+ will follow similar patterns.
+
+ <H3>Predicates for pointset powerset iterators and disjuncts.</H3>
+Iterators allow the user to examine and change individual elements
+(called here disjuncts) of a pointset powerset.
+Detailed descriptions for adding and removing disjuncts can be found in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Adding_a_Disjunct, Adding a Disjunct}.
+The following predicates support useful operations
+on these iterators and disjuncts via the usual handles.
+
+<P><CODE>ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator(+Iterator_1, -Iterator_2)</CODE><BR>
+ <EM>Builds a new iterator \p it from the iterator referenced by
+ \c Iterator_1. <CODE>Iterator_2</CODE> is unified with the handle
+ for \p it.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_begin_iterator(+Handle, -Iterator)</CODE><BR>
+ <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+ to the beginning of
+ the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_end_iterator(+Handle, -Iterator)</CODE><BR>
+ <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+ to the end of
+ the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+ <EM>Succeeds if and only if the iterator referenced by
+ \c Iterator_1 is equal to the iterator referenced by
+ \c Iterator_2.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_increment(+Iterator)</CODE><BR>
+ <EM>Increments the iterator referenced by \c Iterator
+ so that it "points" to the next disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement(+Iterator)</CODE><BR>
+ <EM>Decrements the iterator referenced by \c Iterator
+ so that it "points" to the previous disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_get_disjunct(+Iterator, -Handle)</CODE><BR>
+ <EM>Unifies with \c Handle a reference to the disjunct referred
+ to by \c Iterator_1.</EM>
+
+<P><CODE>ppl_delete_Pointset_Powerset_C_Polyhedron_iterator(+Iterator)</CODE><BR>
+ <EM>Invalidates the handle referenced by <CODE>Iterator</CODE>:
+ this makes sure the corresponding resources
+ will eventually be released.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Adds to the pointset powerset referenced by \c Handle_1 a disjunct
+ referred to by \c Handle_2.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+ <EM>If \p it is the iterator referred to by \c Iterator,
+ drops from the pointset powerset referenced by \c Handle
+ the disjunct pointed to by \p it and
+ assigns to \p it an iterator to the next disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)</CODE><BR>
+ <EM>If \p it_1 and \p it_2 are the iterators referred to by \c Iterator_1
+ and \c Iterator_2, respectively,
+ drops from the pointset powerset referenced by \c Handle
+ all the disjuncts from \p it_1 to \p it_2 (excluded).</EM>
+
+ <H3>Other Ad Hoc Predicates for the pointset powerset domains.</H3>
+Collected here are some other predicates that are specific to
+pointset powersets of C polyhedra;
+these provide operations for
+simplifying the powerset,
+geometric comparisons
+and widening and extrapolation.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Geometric_Comparisons, Geometric Comparisons},
+\extref{Certificate_Based_Widenings, Certificate-Based Widenings},
+\extref{Powerset_Extrapolation_Operators, Powerset Extrapolation Operators}.
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce(+Handle)</CODE><BR>
+ <EM>Assigns the result of pairwise reduction on
+ the pointset powerset referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_omega_reduce(+Handle)</CODE><BR>
+ <EM>Assigns the result of omega reduction on
+ the pointset powerset referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the pointset powerset referenced by
+ \c Handle_2 geometrically covers
+ the pointset powerset referenced by \c Handle_1;
+ see Section \extref{Geometric_Comparisons, Geometric Comparisons}
+ in the main \extref{preamble, PPL User Manual}.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the pointset powerset referenced by
+ \c Handle_2 geometrically equals
+ the pointset powerset referenced by \c Handle_1;
+ see Section \extref{Geometric_Comparisons, Geometric Comparisons}
+ in the main \extref{preamble, PPL User Manual}.</EM>
+
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the \extref{pps_certificate_widening, BHZ03-widening}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2, using the BHRZ03-widening
+ certified by the convergence certificate for BHRZ03.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the \extref{pps_certificate_widening, BHZ03-widening}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2, using the H79-widening
+ certified by the convergence certificate for H79.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the result of applying the
+ \extref{pps_bgp99_extrapolation, BGP99 extrapolation operator}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2, using the BHRZ03-widening
+ and the cardinality threshold \c C_unsigned.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the result of applying the
+ \extref{pps_bgp99_extrapolation, BGP99 extrapolation operator}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2, using the H79-widening
+ and the cardinality threshold \c C_unsigned.</EM>
+
+*/ /* \page domains_predicates */
diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am
new file mode 100644
index 0000000..b70d47d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.am
@@ -0,0 +1,320 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+
+EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl \
+sp_prolog_generated_test.pl
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_sicstus_sd_cc.m4
+
+ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
+bin_PROGRAMS = ppl_sicstus
+ppl_sicstus_SOURCES =
+
+
+if ENABLE_SHARED
+
+pkgdata_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+
+ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la libppl_sicstus.la
+ $(LIBTOOL) --mode=link --tag=CXX \
+ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ $(srcdir)/ppl_sicstus.pl \
+ libppl_sicstus.la \
+ @extra_libraries@
+
+# @required_instantiations_prolog_cxx_objects@
+
+install-data-local: ppl_sicstus.so
+ $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ ppl_sicstus.so $(DESTDIR)$(pkglibdir)/ppl_sicstus.so
+
+else !ENABLE_SHARED
+
+pkgdata_DATA = ppl_sicstus.pl
+
+endif !ENABLE_SHARED
+
+noinst_LTLIBRARIES = libppl_sicstus.la
+
+libppl_sicstus_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+sicstus_efli.hh \
+sicstus_efli.cc
+
+nodist_libppl_sicstus_la_SOURCES = \
+ppl_sicstus_sd.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_sicstus_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_sicstus_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_sicstus_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la
+ $(LIBTOOL) --mode=link --tag=CXX \
+ spld --main=prolog \
+ --cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ --resources=ppl_sicstus.s.o -o $@ \
+ $(top_builddir)/src/libppl.la \
+ @extra_libraries@
+
+if ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+ $(srcdir)/ppl_sicstus.pl \
+ ppl_sicstus_sd.o \
+ sicstus_efli.o \
+ ppl_prolog_common.o \
+ `echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\.lo/.o/g"`
+
+else !ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ $(srcdir)/ppl_sicstus.pl \
+ .libs/ppl_sicstus_sd.o \
+ .libs/sicstus_efli.o \
+ .libs/ppl_prolog_common.o \
+ `echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
+
+endif !ENABLE_STATIC
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ --goal "main." \
+ >obtained_pchk
+ rm -f pl_check.pl
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) | pl_check_test
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) | clpq_test
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ppl_sicstus ppl_sicstus.pl sp_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \
+ --goal "main." \
+ >obtained_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_sicstus_sd.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_sicstus_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: check whether the dependencies from `libppl.la' in this Makefile.am
+# are actually required.
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in
new file mode 100644
index 0000000..18dce55
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.in
@@ -0,0 +1,1704 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_sicstus$(EXEEXT)
+subdir = interfaces/Prolog/SICStus
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am_libppl_sicstus_la_OBJECTS = sicstus_efli.lo
+nodist_libppl_sicstus_la_OBJECTS = ppl_sicstus_sd.lo \
+ ppl_prolog_common.lo
+libppl_sicstus_la_OBJECTS = $(am_libppl_sicstus_la_OBJECTS) \
+ $(nodist_libppl_sicstus_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_sicstus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_sicstus_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_sicstus_OBJECTS =
+ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS)
+ppl_sicstus_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_sicstus_la_SOURCES) \
+ $(nodist_libppl_sicstus_la_SOURCES) \
+ $(nodist_EXTRA_libppl_sicstus_la_SOURCES) \
+ $(ppl_sicstus_SOURCES)
+DIST_SOURCES = $(libppl_sicstus_la_SOURCES) $(ppl_sicstus_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl \
+sp_prolog_generated_test.pl
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_sicstus_sd_cc.m4
+
+ppl_sicstus_SOURCES =
+ at ENABLE_SHARED_FALSE@pkgdata_DATA = ppl_sicstus.pl
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+noinst_LTLIBRARIES = libppl_sicstus.la
+libppl_sicstus_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+sicstus_efli.hh \
+sicstus_efli.cc
+
+nodist_libppl_sicstus_la_SOURCES = \
+ppl_sicstus_sd.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_sicstus_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_sicstus_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_sicstus_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_sicstus_sd.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_sicstus.la: $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_DEPENDENCIES) $(EXTRA_libppl_sicstus_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_sicstus_la_LINK) $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_sicstus_sd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sicstus_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ at ENABLE_SHARED_FALSE@install-data-local:
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-pkgdataDATA install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-pkgdataDATA
+
+
+ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la libppl_sicstus.la
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=link --tag=CXX \
+ at ENABLE_SHARED_TRUE@ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_SHARED_TRUE@ $(srcdir)/ppl_sicstus.pl \
+ at ENABLE_SHARED_TRUE@ libppl_sicstus.la \
+ at ENABLE_SHARED_TRUE@ @extra_libraries@
+
+# @required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@install-data-local: ppl_sicstus.so
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ at ENABLE_SHARED_TRUE@ ppl_sicstus.so $(DESTDIR)$(pkglibdir)/ppl_sicstus.so
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la
+ $(LIBTOOL) --mode=link --tag=CXX \
+ spld --main=prolog \
+ --cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ --resources=ppl_sicstus.s.o -o $@ \
+ $(top_builddir)/src/libppl.la \
+ @extra_libraries@
+
+ at ENABLE_STATIC_TRUE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at ENABLE_STATIC_TRUE@ splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_STATIC_TRUE@ $(srcdir)/ppl_sicstus.pl \
+ at ENABLE_STATIC_TRUE@ ppl_sicstus_sd.o \
+ at ENABLE_STATIC_TRUE@ sicstus_efli.o \
+ at ENABLE_STATIC_TRUE@ ppl_prolog_common.o \
+ at ENABLE_STATIC_TRUE@ `echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\.lo/.o/g"`
+
+ at ENABLE_STATIC_FALSE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at ENABLE_STATIC_FALSE@ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_STATIC_FALSE@ $(srcdir)/ppl_sicstus.pl \
+ at ENABLE_STATIC_FALSE@ .libs/ppl_sicstus_sd.o \
+ at ENABLE_STATIC_FALSE@ .libs/sicstus_efli.o \
+ at ENABLE_STATIC_FALSE@ .libs/ppl_prolog_common.o \
+ at ENABLE_STATIC_FALSE@ `echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ --goal "main." \
+ >obtained_pchk
+ rm -f pl_check.pl
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) | pl_check_test
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) | clpq_test
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ppl_sicstus ppl_sicstus.pl sp_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \
+ --goal "main." \
+ >obtained_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_sicstus_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: check whether the dependencies from `libppl.la' in this Makefile.am
+# are actually required.
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
new file mode 100644
index 0000000..fe06db1
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
@@ -0,0 +1,250 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_sicstus_sd.cc.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include common macros for generating system dependent code.
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+
+m4_divert`'dnl
+/* SICStus Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define SP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref /* goal */, void*) { \
+ return name(); \
+}
+
+#define SP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ return name(arg1); \
+}
+
+#define SP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2); \
+}
+
+#define SP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3); \
+}
+
+#define SP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(4, goal, arg4)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3, arg4); \
+}
+
+#define SP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(4, goal, arg4)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(5, goal, arg5)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define SP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(4, goal, arg4)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(5, goal, arg5)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(6, goal, arg6)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define SP_STUB_7(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(4, goal, arg4)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(5, goal, arg5)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(6, goal, arg6)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg7 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(7, goal, arg7)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define SP_STUB_8(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+ Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(1, goal, arg1)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(2, goal, arg2)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(3, goal, arg3)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(4, goal, arg4)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(5, goal, arg5)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(6, goal, arg6)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg7 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(7, goal, arg7)) \
+ return PROLOG_FAILURE; \
+ Prolog_term_ref arg8 = Prolog_new_term_ref(); \
+ if (!Prolog_get_arg(8, goal, arg8)) \
+ return PROLOG_FAILURE; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+m4_divert(1)
+#define SP_DEFINE_C_PREDICATE(name, arity) \
+ SP_define_c_predicate(#name, arity, "user", sp_stub_##name, NULL)
+
+extern "C" void
+ppl_sicstus_init(int /* when */) {
+ ppl_initialize();
+ for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+ if (SP_register_atom(*prolog_interface_atoms[i].p_atom) == 0) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom_chars(et, "Cannot initialize the PPL interface");
+ Prolog_raise_exception(et);
+ return;
+ }
+ }
+m4_divert(2)dnl
+}
+
+extern "C" void
+ppl_sicstus_deinit(int /* when */) {
+ for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i)
+ // SP_unregister_atom can fail.
+ // We ignore such failures: what else can we do?
+ (void) SP_unregister_atom(*prolog_interface_atoms[i].p_atom);
+ ppl_finalize();
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_expanded_procedure_schema to generate SICStus stubs.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+SP_STUB_$2($1)
+')dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+
+dnl Redefine m4_extension to generate SICStus user predicates.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+ SP_DEFINE_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..996977e
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for SICStus Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::SICStus;
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus.pl b/interfaces/Prolog/SICStus/ppl_sicstus.pl
new file mode 100644
index 0000000..0f43913
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl
@@ -0,0 +1,30 @@
+/* Loader for the SICStus Prolog interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+foreign_resource(ppl_sicstus,
+[
+ init(ppl_sicstus_init),
+ deinit(ppl_sicstus_deinit)
+]).
+
+:- load_foreign_resource(ppl_sicstus).
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc
new file mode 100644
index 0000000..0ad4b28
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc
@@ -0,0 +1,28 @@
+/* SICStus Prolog Common Foreign Language Interface: implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_cfli.h"
+
+#ifndef PCFLI_EXTERN_INLINE
+#include "sicstus_cfli.ic"
+#endif
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.h b/interfaces/Prolog/SICStus/sicstus_cfli.h
new file mode 100644
index 0000000..0ec2027
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.h
@@ -0,0 +1,156 @@
+/* SICStus Prolog Common Foreign Language Interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_sicstus_cfli_h
+#define PCFLI_sicstus_cfli_h 1
+
+#include <sicstus/sicstus.h>
+
+#ifdef __GNUC__
+# define PCFLI_EXTERN_INLINE extern __inline__
+# define PCFLI_INLINE_PROTOTYPES 1
+#endif
+
+#if defined(__cplusplus) && !defined(PCFLI_EXTERN_INLINE)
+# define PCFLI_EXTERN_INLINE inline
+#endif
+
+#ifdef PCFLI_EXTERN_INLINE
+# ifndef PCFLI_INLINE_PROTOTYPES
+# define PCFLI_INLINE_PROTOTYPES 0
+# endif
+#else
+# define PCFLI_INLINE_PROTOTYPES 1
+#endif
+
+/* Temporary. */
+#define PCFLI_DECLSPEC
+
+#ifdef __cplusplus
+//extern "C" {
+#endif
+
+typedef SP_term_ref Prolog_term_ref;
+typedef SP_atom Prolog_atom;
+typedef int Prolog_foreign_return_type;
+
+static const Prolog_foreign_return_type PROLOG_SUCCESS = SP_SUCCESS;
+static const Prolog_foreign_return_type PROLOG_FAILURE = SP_FAILURE;
+
+#if PCFLI_INLINE_PROTOTYPES
+
+PCFLI_DECLSPEC Prolog_term_ref
+Prolog_new_term_ref();
+
+PCFLI_DECLSPEC int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u);
+
+PCFLI_DECLSPEC int
+Prolog_put_long(Prolog_term_ref t, long i);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a);
+
+PCFLI_DECLSPEC int
+Prolog_put_address(Prolog_term_ref t, void* p);
+
+Prolog_atom
+Prolog_atom_from_string(const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4);
+
+PCFLI_DECLSPEC int
+Prolog_construct_cons(Prolog_term_ref c,
+ Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC void
+Prolog_raise_exception(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_variable(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_atom(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_integer(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_address(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_compound(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_cons(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_get_long(Prolog_term_ref t, long& v);
+
+PCFLI_DECLSPEC int
+Prolog_get_address(Prolog_term_ref t, void*& p);
+
+PCFLI_DECLSPEC int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom& name);
+
+PCFLI_DECLSPEC int
+Prolog_get_compound_name_arity(Prolog_term_ref t,
+ Prolog_atom& name, int& arity);
+
+PCFLI_DECLSPEC int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a);
+
+PCFLI_DECLSPEC int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u);
+
+#endif /* !PCFLI_INLINE_PROTOTYPES */
+
+#include "sicstus_cfli.ic"
+
+#ifdef __cplusplus
+//} /* extern "C" */
+#endif
+
+#endif // !defined(PCFLI_sicstus_cfli_h)
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.ic b/interfaces/Prolog/SICStus/sicstus_cfli.ic
new file mode 100644
index 0000000..56101c9
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic
@@ -0,0 +1,300 @@
+/* SICStus Common Foreign Language Interface: definitions. -*- C -*-
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <assert.h>
+#include <limits.h>
+
+/*!
+ Return a new term reference.
+*/
+PCFLI_EXTERN_INLINE Prolog_term_ref
+Prolog_new_term_ref() {
+ return SP_new_term_ref();
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+ return SP_put_term(t, u);
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_long(Prolog_term_ref t, long l) {
+ return SP_put_integer(t, l);
+}
+
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+ static unsigned char uc_buffer[sizeof(unsigned long) + 1];
+ static unsigned n;
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
+ static long long ll_buffer;
+#endif
+
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
+ ll_buffer = ul;
+ if (SP_put_integer_bytes(t, &ll_buffer, sizeof(ll_buffer), 1))
+ return 1;
+#endif
+ n = 0;
+ do {
+ uc_buffer[n++] = ul & 0xff;
+ ul >>= 8;
+ } while (ul);
+ if (uc_buffer[n-1] & 0x80)
+ uc_buffer[n++] = 0;
+ return SP_put_integer_bytes(t, &uc_buffer, n, 0);
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+ return
+ (ul <= LONG_MAX)
+ ? SP_put_integer(t, (long) ul)
+ : Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+ return SP_put_string(t, s);
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+ return SP_put_atom(t, a);
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+ return SP_put_address(t, p);
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+PCFLI_EXTERN_INLINE Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return SP_atom_from_string(s);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1) {
+ return SP_cons_functor(t, f, 1, a1);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+ return SP_cons_functor(t, f, 2, a1, a2);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+ return SP_cons_functor(t, f, 3, a1, a2, a3);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+ return SP_cons_functor(t, f, 4, a1, a2, a3, a4);
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_cons(Prolog_term_ref c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+ return SP_cons_list(c, h, t);
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+PCFLI_EXTERN_INLINE void
+Prolog_raise_exception(Prolog_term_ref t) {
+ SP_raise_exception(t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_variable(Prolog_term_ref t) {
+ return SP_is_variable(t);
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_atom(Prolog_term_ref t) {
+ return SP_is_atom(t);
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_integer(Prolog_term_ref t) {
+ return SP_is_integer(t);
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_address(Prolog_term_ref t) {
+ return SP_is_integer(t);
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_compound(Prolog_term_ref t) {
+ return SP_is_compound(t);
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_cons(Prolog_term_ref t) {
+ return SP_is_list(t);
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(Prolog_is_integer(t));
+ return SP_get_integer(t, lp);
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into to \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ return SP_get_address(t, vpp);
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ return SP_get_atom(t, ap);
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ return SP_get_functor(t, ap, ip);
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+ assert(Prolog_is_compound(t));
+ return SP_get_arg(i, t, a);
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+ assert(Prolog_is_cons(c));
+ return SP_get_list(c, h, t);
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+ return SP_unify(t, u);
+}
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.cc b/interfaces/Prolog/SICStus/sicstus_efli.cc
new file mode 100644
index 0000000..39d6827
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.cc
@@ -0,0 +1,108 @@
+/* SICStus Prolog extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SICStus {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ assert(SP_is_integer(t));
+ long v;
+ if (SP_get_integer(t, &v) == SP_SUCCESS)
+ n = v;
+ else {
+#if SICSTUS_MAJOR_VERSION == 3
+ char* s;
+ if (SP_get_number_chars(t, &s) == SP_SUCCESS)
+ n = Coefficient(s);
+ else
+ return SP_FAILURE;
+#else
+ const char* s;
+ if (SP_get_number_codes(t, &s) == SP_SUCCESS)
+ n = Coefficient(s);
+ else
+ return SP_FAILURE;
+#endif
+ }
+ return SP_SUCCESS;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ long l = 0;
+ Result r = assign_r(l, n, ROUND_IGNORE);
+ if (!result_overflow(r))
+ return SP_put_integer(t, l);
+ else {
+ std::ostringstream s;
+ s << n;
+ std::string str = s.str();
+#if SICSTUS_MAJOR_VERSION == 3
+ return SP_put_number_chars(t, str.c_str());
+#else
+ return SP_put_number_codes(t, str.c_str());
+#endif
+ }
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ Prolog_term_ref u = Prolog_new_term_ref();
+ if (Prolog_put_Coefficient(u, n) == SP_SUCCESS)
+ return SP_unify(t, u);
+ else
+ return SP_FAILURE;
+}
+
+} // namespace SICStus
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.hh b/interfaces/Prolog/SICStus/sicstus_efli.hh
new file mode 100644
index 0000000..df4bc32
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.hh
@@ -0,0 +1,92 @@
+/* SICStus Prolog extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_sicstus_efli_hh
+#define PPL_sicstus_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "sicstus_cfli.h"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SICStus {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace SICStus
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_sicstus_efli_hh)
diff --git a/interfaces/Prolog/SICStus/sp_clpq.pl b/interfaces/Prolog/SICStus/sp_clpq.pl
new file mode 100644
index 0000000..abfcfa0
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_clpq.pl
@@ -0,0 +1,44 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+ prolog_flag(version, V),
+ atom_codes(V, VList),
+ VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+ (N is "4" ->
+ true
+ ;
+ set_prolog_flag(language, iso),
+ use_module(library(lists), [append/3, member/2])
+ ).
+
+eat_eol :-
+ get_code(user_input, _EOL).
+
+main(CLPQ) :-
+ version_dependent_declarations,
+ ensure_loaded(CLPQ),
+ set_prolog_flag(fileerrors, off),
+ common_main.
diff --git a/interfaces/Prolog/SICStus/sp_pl_check.pl b/interfaces/Prolog/SICStus/sp_pl_check.pl
new file mode 100644
index 0000000..73f6ff3
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_pl_check.pl
@@ -0,0 +1,49 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+ prolog_flag(version, V),
+ atom_codes(V, VList),
+ VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+ (N is "4" ->
+ true
+ ;
+ set_prolog_flag(language, iso),
+ use_module(library(lists), [append/3, member/2])
+ ).
+
+main :-
+ version_dependent_declarations,
+ ensure_loaded('pl_check.pl'),
+ set_prolog_flag(fileerrors, off),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ halt.
diff --git a/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl b/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
new file mode 100644
index 0000000..56171e8
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
@@ -0,0 +1,49 @@
+/* Main program for the PPL/SICStus-Prolog generated tests.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+ prolog_flag(version, V),
+ atom_codes(V, VList),
+ VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+ (N is "4" ->
+ true
+ ;
+ set_prolog_flag(language, iso),
+ use_module(library(lists), [append/3, member/2])
+ ).
+
+main :-
+ version_dependent_declarations,
+ ensure_loaded('ppl_prolog_generated_test_main.pl'),
+ set_prolog_flag(fileerrors, off),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ halt.
diff --git a/interfaces/Prolog/SWI/Makefile.am b/interfaces/Prolog/SWI/Makefile.am
new file mode 100644
index 0000000..e522422
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.am
@@ -0,0 +1,332 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+SWI_CFLI_FILES = swi_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl \
+swi_prolog_generated_test.pl \
+README.swiprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_swiprolog_cc.m4
+
+ppl_swiprolog.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+
+libppl_swiprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+swi_efli.hh \
+swi_efli.cc
+
+nodist_libppl_swiprolog_la_SOURCES = \
+ppl_swiprolog.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_swiprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@ \
+$(SWI_PROLOG_LD_OPTIONS)
+
+libppl_swiprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_swiprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_swiprolog.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+check_PROGRAMS = ppl_pl pl_clpq pl_clpq2
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+if HOST_OS_CYGWIN
+
+# Under Cygwin, $(SWI_PROLOG_LD) gets the link options wrong:
+# -lpl (PLLIB) comes before -lppl_swiprolog, with the result that all
+# the symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
+
+endif HOST_OS_CYGWIN
+
+# Note: since `libppl_swiprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'. Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+if ENABLE_STATIC
+
+LIBPPL_SWIPROLOG_LINK_OPTIONS = .libs/libppl_swiprolog.a
+
+else !ENABLE_STATIC
+
+LIBPPL_SWIPROLOG_LINK_OPTIONS = -L.libs -lppl_swiprolog
+
+endif !ENABLE_STATIC
+
+# Apart from the internal testing purposes, `ppl_pl' only makes
+# sense when shared libraries are disabled.
+if !ENABLE_SHARED
+bin_PROGRAMS = ppl_pl
+endif !ENABLE_SHARED
+
+ppl_pl_SOURCES = ppl_pl.cc
+
+
+ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc "$(CC)" -c++ "$(CXX)" -ld "$(CXX)" \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) ppl_pl.o \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+ $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+
+pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+ $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./ppl_pl < script_pchk
+ rm -f pl_check.pl
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: swi_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/ppl_prolog_generated_test_common.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ echo "ensure_loaded('$(srcdir)/swi_prolog_generated_test'). main." > script_pgt
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./ppl_pl <script_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_swiprolog.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_swiprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/SWI/Makefile.in b/interfaces/Prolog/SWI/Makefile.in
new file mode 100644
index 0000000..c2961ae
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.in
@@ -0,0 +1,1750 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = ppl_pl$(EXEEXT) pl_clpq$(EXEEXT) pl_clpq2$(EXEEXT)
+ at ENABLE_SHARED_FALSE@bin_PROGRAMS = ppl_pl$(EXEEXT)
+subdir = interfaces/Prolog/SWI
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libppl_swiprolog_la_OBJECTS = swi_efli.lo
+nodist_libppl_swiprolog_la_OBJECTS = ppl_swiprolog.lo \
+ ppl_prolog_common.lo
+libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS) \
+ $(nodist_libppl_swiprolog_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_swiprolog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_swiprolog_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_pl_clpq_OBJECTS = pl_clpq.$(OBJEXT)
+pl_clpq_OBJECTS = $(am_pl_clpq_OBJECTS)
+pl_clpq_LDADD = $(LDADD)
+am_pl_clpq2_OBJECTS = pl_clpq.$(OBJEXT)
+pl_clpq2_OBJECTS = $(am_pl_clpq2_OBJECTS)
+pl_clpq2_LDADD = $(LDADD)
+am_ppl_pl_OBJECTS = ppl_pl.$(OBJEXT)
+ppl_pl_OBJECTS = $(am_ppl_pl_OBJECTS)
+ppl_pl_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_swiprolog_la_SOURCES) \
+ $(nodist_libppl_swiprolog_la_SOURCES) \
+ $(nodist_EXTRA_libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+ $(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+DIST_SOURCES = $(libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+ $(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+SWI_CFLI_FILES = swi_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl \
+swi_prolog_generated_test.pl \
+README.swiprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_swiprolog_cc.m4
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+libppl_swiprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+swi_efli.hh \
+swi_efli.cc
+
+nodist_libppl_swiprolog_la_SOURCES = \
+ppl_swiprolog.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_swiprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@ \
+$(SWI_PROLOG_LD_OPTIONS)
+
+libppl_swiprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_swiprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_swiprolog.pl
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+# Under Cygwin, $(SWI_PROLOG_LD) gets the link options wrong:
+# -lpl (PLLIB) comes before -lppl_swiprolog, with the result that all
+# the symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+ at HOST_OS_CYGWIN_TRUE@EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
+ at ENABLE_STATIC_FALSE@LIBPPL_SWIPROLOG_LINK_OPTIONS = -L.libs -lppl_swiprolog
+
+# Note: since `libppl_swiprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'. Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+ at ENABLE_STATIC_TRUE@LIBPPL_SWIPROLOG_LINK_OPTIONS = .libs/libppl_swiprolog.a
+ppl_pl_SOURCES = ppl_pl.cc
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_swiprolog.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+ }
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES) $(EXTRA_libppl_swiprolog_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_swiprolog_la_LINK) -rpath $(pkglibdir) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pl_clpq.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_swiprolog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swi_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-libtool clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA \
+ uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+
+ppl_swiprolog.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
+ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc "$(CC)" -c++ "$(CXX)" -ld "$(CXX)" \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) ppl_pl.o \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+ $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+ $(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ -o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+ $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
+ -L$(top_builddir)/src/.libs \
+ -lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./ppl_pl < script_pchk
+ rm -f pl_check.pl
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: swi_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/ppl_prolog_generated_test_common.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ echo "ensure_loaded('$(srcdir)/swi_prolog_generated_test'). main." > script_pgt
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen libppl_swiprolog.la \
+ $(CHECKER) ./ppl_pl <script_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_swiprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SWI/README.swiprolog b/interfaces/Prolog/SWI/README.swiprolog
new file mode 100644
index 0000000..d3c5a7c
--- /dev/null
+++ b/interfaces/Prolog/SWI/README.swiprolog
@@ -0,0 +1,50 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The SWI-Prolog interface to the Parma Polyhedra Library (PPL) is
+available both as a statically linked module or as a dynamically
+linked one. Only SWI-Prolog version 5.6.0 and later versions are
+supported.
+
+
+The `ppl_pl' Executable
+-----------------------
+
+The `ppl_pl' executable is simply the SWI-Prolog shell with the PPL
+statically linked: from within `ppl_pl' all the services of the
+library are available without further action.
+Notice that, in case the PPL was configured with the
+`--disable-static' option, in order to use `ppl_pl' you must make sure
+your linker looks into the `<prefix>/lib/ppl' directory, where
+<prefix> is the root of your installation (`/usr' or `/usr/local' in
+most cases).
+
+
+Loading the SWI-Prolog Interface Dynamically
+--------------------------------------------
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load `<prefix>/lib/ppl/ppl_swiprolog.pl'.
+This will invoke `ppl_initialize/0' and `ppl_finalize/0'
+automatically. Alternatively, you can load the library directly with
+
+ :- load_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+This will call `ppl_initialize/0' automatically. Analogously,
+
+ :- unload_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+will, as part of the unload process, invoke `ppl_finalize/0'.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the `--enable-shared' option (on most platforms this
+is the default).
diff --git a/interfaces/Prolog/SWI/pl_clpq.cc b/interfaces/Prolog/SWI/pl_clpq.cc
new file mode 100644
index 0000000..04fd85c
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.cc
@@ -0,0 +1,48 @@
+/* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int, char** argv) {
+#if PLVERSION > 50643
+ // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+ PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
+ char* pl_args[2];
+ pl_args[0] = argv[0];
+ pl_args[1] = 0;
+ if (!PL_initialise(1, pl_args))
+ PL_halt(1);
+
+ install();
+ predicate_t pred = PL_predicate("main", 0, "user");
+ term_t h0 = PL_new_term_refs(0);
+ int ret_val = PL_call_predicate(0, PL_Q_NORMAL, pred, h0);
+ uninstall();
+ PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/pl_clpq.pl b/interfaces/Prolog/SWI/pl_clpq.pl
new file mode 100644
index 0000000..246ddfe
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.pl
@@ -0,0 +1,33 @@
+/* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+eat_eol.
+
+main :-
+ % FIXME: clearing the prompt as it is done here is a temporary workaround.
+ % In SWI-Prolog versions up to and including 5.4.1, the prompt is written
+ % to the output stream even if it is not connected to an actual terminal.
+ % See http://www.cs.unipr.it/pipermail/ppl-devel/2004-October/005078.html.
+ prompt(Old_Prompt, ''),
+ common_main,
+ prompt(_, Old_Prompt).
diff --git a/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
new file mode 100644
index 0000000..fa71c76
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
@@ -0,0 +1,72 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_swiprolog.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* SWI-Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+
+namespace {
+
+PL_extension predicates[] = {
+m4_divert(1)dnl
+ { NULL, 0, NULL, 0 }
+};
+
+} // namespace
+
+extern "C" install_t
+install() {
+ ppl_initialize();
+ PL_register_extensions(predicates);
+}
+
+extern "C" install_t
+uninstall() {
+ ppl_finalize();
+}
+m4_divert(-1)
+dnl Include common macros for generating system dependent code.
+dnl
+dnl Redefine m4_expanded_procedure_schema as useful for SWI-Prolog.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+dnl Note: SPACES is just a marker to generated the two spaces of
+dnl indentation following it.
+m4_define(`m4_expanded_procedure_schema', `dnl
+SPACES PL_EXTENSION_ENTRY($1, $2)
+')
+
+dnl Now remove the marker SPACES.
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, SPACES, `')dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/SWI/ppl_pl.cc b/interfaces/Prolog/SWI/ppl_pl.cc
new file mode 100644
index 0000000..a2d279a
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_pl.cc
@@ -0,0 +1,44 @@
+/* Main program for SWI-Prolog with the PPL statically linked.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int argc, char **argv) {
+#if PLVERSION > 50643
+ // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+ PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
+ if (!PL_initialise(argc, argv))
+ PL_halt(1);
+ PL_install_readline();
+
+ install();
+ int ret_val = PL_toplevel();
+ uninstall();
+ PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..0830c7d
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for SWI Prolog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "swi_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::SWI;
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.pl b/interfaces/Prolog/SWI/ppl_swiprolog.pl
new file mode 100644
index 0000000..4c19beb
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl
@@ -0,0 +1,24 @@
+/* Loader for the SWI-Prolog interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- load_foreign_library('libppl_swiprolog').
diff --git a/interfaces/Prolog/SWI/swi_cfli.hh b/interfaces/Prolog/SWI/swi_cfli.hh
new file mode 100644
index 0000000..4fe3071
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_cfli.hh
@@ -0,0 +1,376 @@
+/* SWI-Prolog Common Foreign Language Interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_swi_cfli_hh
+#define PCFLI_swi_cfli_hh 1
+
+/* Include gmp.h before SWI-Prolog.h. This is required in order to
+ get access to interface functions dealing with GMP numbers and
+ SWI-Prolog terms. */
+#include <gmp.h>
+#include <SWI-Prolog.h>
+#include <cassert>
+#include <climits>
+
+typedef term_t Prolog_term_ref;
+typedef atom_t Prolog_atom;
+typedef foreign_t Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+ Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+ return PL_new_term_ref();
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+#if PLVERSION >= 50800
+ return PL_put_term(t, u);
+#else
+ PL_put_term(t, u);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref t, long l) {
+#if PLVERSION >= 50800
+ return PL_put_integer(t, l);
+#else
+ PL_put_integer(t, l);
+ return 1;
+#endif
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+ assert(ul > LONG_MAX && ul > (uint64_t) INT64_MAX);
+ if (!tmp_mpz_t_initialized) {
+ mpz_init_set_ui(tmp_mpz_t, ul);
+ tmp_mpz_t_initialized = 1;
+ }
+ else
+ mpz_set_ui(tmp_mpz_t, ul);
+ return PL_unify_mpz(t, tmp_mpz_t);
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+ if (ul <= LONG_MAX) {
+#if PLVERSION >= 50800
+ return PL_put_integer(t, ul);
+#else
+ PL_put_integer(t, ul);
+ return 1;
+#endif
+ }
+ else if (ul <= (uint64_t) INT64_MAX) {
+#if PLVERSION >= 50800
+ return PL_put_int64(t, (int64_t) ul);
+#else
+ PL_put_int64(t, (int64_t) ul);
+ return 1;
+#endif
+ }
+ else
+ return Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+#if PLVERSION >= 50800
+ return PL_put_atom_chars(t, s);
+#else
+ PL_put_atom_chars(t, s);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+#if PLVERSION >= 50800
+ return PL_put_atom(t, a);
+#else
+ PL_put_atom(t, a);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+#if PLVERSION >= 50800
+ return PL_put_pointer(t, p);
+#else
+ PL_put_pointer(t, p);
+ return 1;
+#endif
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return PL_new_atom(s);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1) {
+#if PLVERSION >= 50800
+ return PL_cons_functor(t, PL_new_functor(f, 1), a1);
+#else
+ PL_cons_functor(t, PL_new_functor(f, 1), a1);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+#if PLVERSION >= 50800
+ return PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+#else
+ PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+#if PLVERSION >= 50800
+ return PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+#else
+ PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+#if PLVERSION >= 50800
+ return PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+#else
+ PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+ return 1;
+#endif
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+#if PLVERSION >= 50800
+ return PL_cons_list(c, h, t);
+#else
+ PL_cons_list(c, h, t);
+ return 1;
+#endif
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+ (void) PL_raise_exception(t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+ return PL_is_variable(t);
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+ return PL_is_atom(t);
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+ return PL_is_integer(t);
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+ return PL_is_integer(t);
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+ return PL_is_compound(t);
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ return (!PL_is_atom(t) && PL_is_list(t)) ? 1 : 0;
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(Prolog_is_integer(t));
+ return PL_get_long(t, lp);
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into to \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ return PL_get_pointer(t, vpp);
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ return PL_get_atom(t, ap);
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ return PL_get_name_arity(t, ap, ip);
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+ assert(Prolog_is_compound(t));
+ return PL_get_arg(i, t, a);
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+ assert(Prolog_is_cons(c));
+ return PL_get_list(c, h, t);
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+ return PL_unify(t, u);
+}
+
+#endif // !defined(PCFLI_swi_cfli_hh)
diff --git a/interfaces/Prolog/SWI/swi_efli.cc b/interfaces/Prolog/SWI/swi_efli.cc
new file mode 100644
index 0000000..9ba49ca
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.cc
@@ -0,0 +1,86 @@
+/* SWI-Prolog extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "swi_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SWI {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ assert(Prolog_is_integer(t));
+ // FIXME: avoid the temporary when Coefficient is mpz_class.
+ PPL_DIRTY_TEMP(mpz_class, tmp);
+ int r;
+#if PLVERSION >= 50800
+ r = PL_get_mpz(t, tmp.get_mpz_t());
+#else
+ PL_get_mpz(t, tmp.get_mpz_t());
+ r = 1;
+#endif
+ n = tmp;
+ return r;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ PPL_DIRTY_TEMP(mpz_class, tmp);
+ assign_r(tmp, n, ROUND_NOT_NEEDED);
+ return PL_unify_mpz(t, tmp.get_mpz_t());
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ PL_put_variable(t);
+ return Prolog_unify_Coefficient(t, n);
+}
+
+} // namespace SWI
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SWI/swi_efli.hh b/interfaces/Prolog/SWI/swi_efli.hh
new file mode 100644
index 0000000..037f3ac
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.hh
@@ -0,0 +1,92 @@
+/* SWI-Prolog extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_swi_efli_hh
+#define PPL_swi_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "swi_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SWI {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace SWI
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_swi_efli_hh)
diff --git a/interfaces/Prolog/SWI/swi_pl_check.pl b/interfaces/Prolog/SWI/swi_pl_check.pl
new file mode 100644
index 0000000..c64957a
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_pl_check.pl
@@ -0,0 +1,39 @@
+/* Main program for the PPL/SWI-Prolog checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('pl_check.pl').
+
+prolog_system('SWI').
+
+main :-
+ current_output(Old_Stream),
+ open(obtained_pchk, write, Stream),
+ set_output(Stream),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ close(Stream),
+ set_output(Old_Stream).
diff --git a/interfaces/Prolog/SWI/swi_prolog_generated_test.pl b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl
new file mode 100644
index 0000000..79484ad
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl
@@ -0,0 +1,47 @@
+/* Main program for the PPL/SWI-Prolog generated tests.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+member(X, [X|_]).
+member(X, [_|T]) :-
+ member(X, T).
+
+append([], L, L).
+append([H|T], L, [H|R]) :-
+ append(T, L, R).
+
+:- ensure_loaded('ppl_prolog_generated_test_main.pl').
+
+prolog_system('SWI').
+
+main :-
+ current_output(Old_Stream),
+ open(obtained_pgt, write, Stream),
+ set_output(Stream),
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl,
+ close(Stream),
+ set_output(Old_Stream).
diff --git a/interfaces/Prolog/XSB/Makefile.am b/interfaces/Prolog/XSB/Makefile.am
new file mode 100644
index 0000000..42d464a
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.am
@@ -0,0 +1,308 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+XSB_CFLI_FILES = xsb_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+xsb_prolog_generated_test.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_prolog_generated_test_P.m4 > $@
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+noinst_LTLIBRARIES = libppl_xsb.la
+
+libppl_xsb_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+xsb_efli.hh \
+xsb_efli.cc
+
+nodist_libppl_xsb_la_SOURCES = \
+ppl_xsb.hh \
+../ppl_prolog_common.cc
+
+BUILT_SOURCES = \
+ppl_xsb.hh
+
+nodist_EXTRA_libppl_xsb_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_xsb_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_xsb_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_xsb_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_xsb.xwam
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+ cp -f ppl_xsb.cc ppl_xsb.c
+ echo "consult(ppl_xsb," \
+ "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+ "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+ "-L.libs -lppl_xsb" \
+ "-L../../../src/.libs')])." \
+ | $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb
+ rm -f ppl_xsb.c
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test ppl_prolog_generated_test $(CLPQ_TESTS)
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_clpq.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/clpq.pl .
+ rm -f xsb_clpq.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_clpq \
+ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ rm -f clpq.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_clpq.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_clpq2.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/clpq2.pl .
+ rm -f xsb_clpq2.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_clpq2 \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ rm -f clpq2.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_clpq2.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_pl_check.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ rm -f xsb_pl_check.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_pl_check \
+ >obtained_pchk
+ rm -f pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_pl_check.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ppl_prolog_generated_test: libppl_xsb.la ppl_xsb.xwam xsb_prolog_generated_test.P ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ rm -f xsb_prolog_generated_test.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_prolog_generated_test \
+ >obtained_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+
+CLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc \
+xsb_prolog_generated_test.P
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_efli.lo xsb_efli.o \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam xsb_prolog_generated_test.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_xsb_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/XSB/Makefile.in b/interfaces/Prolog/XSB/Makefile.in
new file mode 100644
index 0000000..44dcf06
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.in
@@ -0,0 +1,1650 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/XSB
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am_libppl_xsb_la_OBJECTS = xsb_efli.lo
+nodist_libppl_xsb_la_OBJECTS = ppl_prolog_common.lo
+libppl_xsb_la_OBJECTS = $(am_libppl_xsb_la_OBJECTS) \
+ $(nodist_libppl_xsb_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_xsb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_xsb_la_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_xsb_la_SOURCES) $(nodist_libppl_xsb_la_SOURCES) \
+ $(nodist_EXTRA_libppl_xsb_la_SOURCES)
+DIST_SOURCES = $(libppl_xsb_la_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkgdatadir)"
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+XSB_CFLI_FILES = xsb_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+noinst_LTLIBRARIES = libppl_xsb.la
+libppl_xsb_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+xsb_efli.hh \
+xsb_efli.cc
+
+nodist_libppl_xsb_la_SOURCES = \
+ppl_xsb.hh \
+../ppl_prolog_common.cc
+
+BUILT_SOURCES = \
+ppl_xsb.hh
+
+nodist_EXTRA_libppl_xsb_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_xsb_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_xsb_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_xsb_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_xsb.xwam
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc \
+xsb_prolog_generated_test.P
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_efli.lo xsb_efli.o \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam xsb_prolog_generated_test.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl_xsb.la: $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_DEPENDENCIES) $(EXTRA_libppl_xsb_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_xsb_la_LINK) $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xsb_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-pkgdataDATA install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-pkgdataDATA
+
+
+ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+xsb_prolog_generated_test.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_prolog_generated_test_P.m4
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_xsb_prolog_generated_test_P.m4 > $@
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+ cp -f ppl_xsb.cc ppl_xsb.c
+ echo "consult(ppl_xsb," \
+ "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+ "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+ "-L.libs -lppl_xsb" \
+ "-L../../../src/.libs')])." \
+ | $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb
+ rm -f ppl_xsb.c
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test ppl_prolog_generated_test $(CLPQ_TESTS)
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_clpq.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/clpq.pl .
+ rm -f xsb_clpq.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_clpq \
+ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ rm -f clpq.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_clpq.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_clpq2.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/clpq2.pl .
+ rm -f xsb_clpq2.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_clpq2 \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ rm -f clpq2.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_clpq2.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/xsb_pl_check.P . ; \
+ fi
+ cp -f $(srcdir)/../tests/pl_check.pl .
+ rm -f xsb_pl_check.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_pl_check \
+ >obtained_pchk
+ rm -f pl_check.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f xsb_pl_check.P; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ppl_prolog_generated_test: libppl_xsb.la ppl_xsb.xwam xsb_prolog_generated_test.P ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ rm -f xsb_prolog_generated_test.xwam
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ xsb xsb_prolog_generated_test \
+ >obtained_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_xsb_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
new file mode 100644
index 0000000..b346f41
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
@@ -0,0 +1,47 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.H.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: declarations. -*- Prolog -*-
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+:- export
+m4_divert(1)
+
+:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/.libs -lpwl -lgmp -lgmpxx').
+
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, ` $1/$2', `COMMA
+ $1/$2')')
+m4_divert(-1)
+
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`.'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
new file mode 100644
index 0000000..e97d8cb
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
@@ -0,0 +1,146 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+m4_divert(1)dnl
+
+#define XSB_ENTRY_0(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ return xsb_stub_##name(); \
+}
+
+#define XSB_ENTRY_1(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ return xsb_stub_##name(arg1); \
+}
+
+#define XSB_ENTRY_2(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ return xsb_stub_##name(arg1, arg2); \
+}
+
+#define XSB_ENTRY_3(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ return xsb_stub_##name(arg1, arg2, arg3); \
+}
+
+#define XSB_ENTRY_4(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ Prolog_term_ref arg4 = reg_term(4); \
+ return xsb_stub_##name(arg1, arg2, arg3, arg4); \
+}
+
+#define XSB_ENTRY_5(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ Prolog_term_ref arg4 = reg_term(4); \
+ Prolog_term_ref arg5 = reg_term(5); \
+ return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define XSB_ENTRY_6(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ Prolog_term_ref arg4 = reg_term(4); \
+ Prolog_term_ref arg5 = reg_term(5); \
+ Prolog_term_ref arg6 = reg_term(6); \
+ return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define XSB_ENTRY_7(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ Prolog_term_ref arg4 = reg_term(4); \
+ Prolog_term_ref arg5 = reg_term(5); \
+ Prolog_term_ref arg6 = reg_term(6); \
+ Prolog_term_ref arg7 = reg_term(7); \
+ return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define XSB_ENTRY_8(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+ Prolog_term_ref arg1 = reg_term(1); \
+ Prolog_term_ref arg2 = reg_term(2); \
+ Prolog_term_ref arg3 = reg_term(3); \
+ Prolog_term_ref arg4 = reg_term(4); \
+ Prolog_term_ref arg5 = reg_term(5); \
+ Prolog_term_ref arg6 = reg_term(6); \
+ Prolog_term_ref arg7 = reg_term(7); \
+ Prolog_term_ref arg8 = reg_term(8); \
+ return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+m4_divert(2)dnl
+
+extern "C" void
+init() {
+ ppl_initialize();
+}
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `#undef $1
+')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+m4_define(`m4_expanded_procedure_schema', `XSB_ENTRY_$2($1)
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
new file mode 100644
index 0000000..2465c68
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
@@ -0,0 +1,39 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `#define $1 xsb_stub_$1
+')dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
new file mode 100644
index 0000000..1e4dedd
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
@@ -0,0 +1,86 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the XSB dependent code for xsb_prolog_generated_test.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: XSB Prolog part for checking all predicates.
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+#include "ppl_prolog_generated_test_main.pl"
+#include "ppl_prolog_generated_test_common.pl"
+m4_divert(-1)
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns($1,
+ `#includeSPACE"../tests/ppl_prolog_generated_test_'`'m4_interface_class$1`'`.pl"
+')`'dnl
+')`'dnl
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate #include declarations for all the classes.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert
+m4_patsubst(m4_patsubst(m4_all_code, ` ', `'), SPACE, ` ')`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+m4_divert(1)
+ from ppl_xsb.
+
+:- [ppl_xsb].
+
+prolog_system('XSB').
+
+discontiguous(_).
+include(_).
+
+main :-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
+
+:- main.
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+') $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..83eede1
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
@@ -0,0 +1,27 @@
+/* System-dependent part of the Prolog interfaces: stub for XSB.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_xsb.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::XSB;
diff --git a/interfaces/Prolog/XSB/xsb_cfli.hh b/interfaces/Prolog/XSB/xsb_cfli.hh
new file mode 100644
index 0000000..fa6c8f0
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_cfli.hh
@@ -0,0 +1,351 @@
+/* XSB Prolog Common Foreign Language Interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_xsb_cfli_hh
+#define PCFLI_xsb_cfli_hh 1
+
+#include <cinterf.h>
+
+// In XSB versions up to and including 2.7.1, <error_xsb.h> does not
+// come with the extern "C" wrapper.
+extern "C" {
+#include <error_xsb.h>
+}
+
+#include <cassert>
+
+typedef prolog_term Prolog_term_ref;
+typedef char* Prolog_atom;
+typedef xsbBool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+// XSB people claim XSB supports 32-bit integers. However, experiments
+// suggest this is not the case.
+// See http://sourceforge.net/tracker/index.php?func=detail&aid=1400271&group_id=1176&atid=101176
+#if 0
+#define XSB_min_integer (-2147483647-1)
+#define XSB_max_integer 2147483647
+#else
+#define XSB_min_integer -268435456
+#define XSB_max_integer 268435455
+#endif
+
+/*!
+ Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+ return p2p_new();
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+ t = u;
+ return 1;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+ assert(is_var(t) == TRUE);
+ if (l < XSB_min_integer || l > XSB_max_integer)
+ return 0;
+ return c2p_int(l, t) != FALSE;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+ assert(is_var(t) == TRUE);
+ if (ul > static_cast<unsigned long>(XSB_max_integer))
+ return 0;
+ return c2p_int(ul, t) != FALSE;
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+ assert(is_var(t) == TRUE);
+ return c2p_string(string_find(const_cast<char*>(s), 1), t) != FALSE;
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+ assert(is_var(t) == TRUE);
+ return c2p_string(a, t) != FALSE;
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+ assert(is_var(t) == TRUE);
+ return c2p_int(reinterpret_cast<long>(p), t) != FALSE;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return string_find(const_cast<char*>(s), 1);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1) {
+ prolog_term new_compound = p2p_new();
+ c2p_functor(f, 1, new_compound);
+ p2p_unify(p2p_arg(new_compound, 1), a1);
+ t = new_compound;
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+ prolog_term new_compound = p2p_new();
+ c2p_functor(f, 2, new_compound);
+ p2p_unify(p2p_arg(new_compound, 1), a1);
+ p2p_unify(p2p_arg(new_compound, 2), a2);
+ t = new_compound;
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+ prolog_term new_compound = p2p_new();
+ c2p_functor(f, 3, new_compound);
+ p2p_unify(p2p_arg(new_compound, 1), a1);
+ p2p_unify(p2p_arg(new_compound, 2), a2);
+ p2p_unify(p2p_arg(new_compound, 3), a3);
+ t = new_compound;
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+ prolog_term new_compound = p2p_new();
+ c2p_functor(f, 4, new_compound);
+ p2p_unify(p2p_arg(new_compound, 1), a1);
+ p2p_unify(p2p_arg(new_compound, 2), a2);
+ p2p_unify(p2p_arg(new_compound, 3), a3);
+ p2p_unify(p2p_arg(new_compound, 4), a4);
+ t = new_compound;
+ return 1;
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+ prolog_term new_cons = p2p_new();
+ c2p_list(new_cons);
+ p2p_unify(p2p_car(new_cons), h);
+ p2p_unify(p2p_cdr(new_cons), t);
+ c = new_cons;
+ return 1;
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+ xsb_throw(t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+ return is_var(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+ return is_string(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+ return is_int(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+ return is_int(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+ return is_functor(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ return is_list(t) != FALSE;
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(Prolog_is_integer(t));
+ *lp = p2c_int(t);
+ return 1;
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ *vpp = reinterpret_cast<void*>(p2c_int(t));
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ *ap = p2c_string(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ *ap = p2c_functor(t);
+ *ip = p2c_arity(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+ assert(Prolog_is_compound(t));
+ a = p2p_arg(t, i);
+ return 1;
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+ assert(Prolog_is_cons(c));
+ h = p2p_car(c);
+ t = p2p_cdr(c);
+ return 1;
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+ return p2p_unify(t, u) != FALSE;
+}
+
+
+
+#endif // !defined(PCFLI_xsb_cfli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_clpq.P b/interfaces/Prolog/XSB/xsb_clpq.P
new file mode 100644
index 0000000..dd0e452
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq.P
@@ -0,0 +1,54 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2
+ from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq.pl"
+
+eat_eol.
+
+main :-
+ common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_clpq2.P b/interfaces/Prolog/XSB/xsb_clpq2.P
new file mode 100644
index 0000000..4218630
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq2.P
@@ -0,0 +1,55 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_remove_space_dimensions/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2
+ from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq2.pl"
+
+eat_eol.
+
+main :-
+ common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_efli.cc b/interfaces/Prolog/XSB/xsb_efli.cc
new file mode 100644
index 0000000..689eb90
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.cc
@@ -0,0 +1,82 @@
+/* XSB extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace XSB {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = false;
+ Prolog_min_integer = XSB_min_integer;
+ Prolog_max_integer = XSB_max_integer;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ // XSB supports only 32-bit integers.
+ long l;
+ Prolog_get_long(t, &l);
+ n = l;
+ return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+ long l = 0;
+ Result r = assign_r(l, n, ROUND_IGNORE);
+ if (result_overflow(r))
+ throw PPL_integer_out_of_range(n);
+ return Prolog_put_long(t, l);
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ Prolog_term_ref u = Prolog_new_term_ref();
+ return Prolog_put_Coefficient(u, n) && Prolog_unify(t, u);
+}
+
+} // namespace XSB
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/XSB/xsb_efli.hh b/interfaces/Prolog/XSB/xsb_efli.hh
new file mode 100644
index 0000000..5dc4336
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.hh
@@ -0,0 +1,89 @@
+/* XSB extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_xsb_efli_hh
+#define PPL_xsb_efli_hh 1
+
+#include "ppl.hh"
+#include "xsb_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace XSB {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace XSB
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_xsb_efli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_pl_check.P b/interfaces/Prolog/XSB/xsb_pl_check.P
new file mode 100644
index 0000000..76b13e9
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_pl_check.P
@@ -0,0 +1,205 @@
+/* Prolog main program for the PPL/XSB-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+ ppl_version_major/1,
+ ppl_version_minor/1,
+ ppl_version_revision/1,
+ ppl_version_beta/1,
+ ppl_version/1,
+ ppl_banner/1,
+ ppl_max_space_dimension/1,
+ ppl_Coefficient_bits/1,
+ ppl_Coefficient_is_bounded/0,
+ ppl_Coefficient_max/1,
+ ppl_Coefficient_min/1,
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_set_irrational_precision/1,
+ ppl_irrational_precision/1,
+ ppl_set_timeout_exception_atom/1,
+ ppl_timeout_exception_atom/1,
+ ppl_set_timeout/1,
+ ppl_reset_timeout/0,
+ ppl_set_rounding_for_PPL/0,
+ ppl_restore_pre_PPL_rounding/0,
+ ppl_new_C_Polyhedron_from_space_dimension/3,
+ ppl_new_NNC_Polyhedron_from_space_dimension/3,
+ ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+ ppl_new_C_Polyhedron_from_constraints/2,
+ ppl_new_NNC_Polyhedron_from_constraints/2,
+ ppl_new_C_Polyhedron_from_generators/2,
+ ppl_new_NNC_Polyhedron_from_generators/2,
+ ppl_C_Polyhedron_upper_bound_assign_if_exact/2,
+ ppl_NNC_Polyhedron_upper_bound_assign_if_exact/2,
+ ppl_Polyhedron_swap/2,
+ ppl_delete_Polyhedron/1,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_affine_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_get_minimized_constraints/2,
+ ppl_Polyhedron_get_generators/2,
+ ppl_Polyhedron_get_minimized_generators/2,
+ ppl_Polyhedron_relation_with_constraint/3,
+ ppl_Polyhedron_relation_with_generator/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/1,
+ ppl_Polyhedron_contains_integer_point/1,
+ ppl_Polyhedron_bounds_from_above/2,
+ ppl_Polyhedron_bounds_from_below/2,
+ ppl_Polyhedron_maximize/5,
+ ppl_Polyhedron_maximize_with_point/6,
+ ppl_Polyhedron_minimize/5,
+ ppl_Polyhedron_minimize_with_point/6,
+ ppl_Polyhedron_is_topologically_closed/1,
+ ppl_Polyhedron_contains_Polyhedron/2,
+ ppl_Polyhedron_strictly_contains_Polyhedron/2,
+ ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+ ppl_Polyhedron_equals_Polyhedron/2,
+ ppl_Polyhedron_OK/1,
+ ppl_Polyhedron_add_constraint/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_difference_assign/2,
+ ppl_Polyhedron_affine_image/4,
+ ppl_Polyhedron_affine_preimage/4,
+ ppl_Polyhedron_bounded_affine_image/5,
+ ppl_Polyhedron_bounded_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image/5,
+ ppl_Polyhedron_generalized_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+ ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+ ppl_Polyhedron_time_elapse_assign/2,
+ ppl_Polyhedron_topological_closure_assign/1,
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+ ppl_Polyhedron_BHRZ03_widening_assign/2,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+ ppl_Polyhedron_H79_widening_assign/2,
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+ ppl_Polyhedron_add_space_dimensions_and_project/2,
+ ppl_Polyhedron_add_space_dimensions_and_embed/2,
+ ppl_Polyhedron_concatenate_assign/2,
+ ppl_Polyhedron_remove_space_dimensions/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2,
+ ppl_Polyhedron_expand_space_dimension/3,
+ ppl_Polyhedron_fold_space_dimensions/3,
+ ppl_Polyhedron_map_space_dimensions/2,
+ ppl_Polyhedron_constrains/2,
+ ppl_Polyhedron_unconstrain_space_dimension/2,
+ ppl_Polyhedron_unconstrain_space_dimensions/2,
+ ppl_termination_test_C_Polyhedron_MS/1,
+ ppl_termination_test_C_Polyhedron_PR/1,
+ ppl_new_MIP_Problem_from_space_dimension/2,
+ ppl_new_MIP_Problem/5,
+ ppl_new_MIP_Problem_from_MIP_Problem/2,
+ ppl_MIP_Problem_swap/2,
+ ppl_delete_MIP_Problem/1,
+ ppl_MIP_Problem_space_dimension/2,
+ ppl_MIP_Problem_integer_space_dimensions/2,
+ ppl_MIP_Problem_constraints/2,
+ ppl_MIP_Problem_objective_function/2,
+ ppl_MIP_Problem_optimization_mode/2,
+ ppl_MIP_Problem_clear/1,
+ ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+ ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+ ppl_MIP_Problem_add_constraint/2,
+ ppl_MIP_Problem_add_constraints/2,
+ ppl_MIP_Problem_set_objective_function/2,
+ ppl_MIP_Problem_set_optimization_mode/2,
+ ppl_MIP_Problem_is_satisfiable/1,
+ ppl_MIP_Problem_solve/2,
+ ppl_MIP_Problem_feasible_point/2,
+ ppl_MIP_Problem_optimizing_point/2,
+ ppl_MIP_Problem_optimal_value/3,
+ ppl_MIP_Problem_evaluate_objective_function/4,
+ ppl_MIP_Problem_OK/1,
+ ppl_MIP_Problem_get_control_parameter/3,
+ ppl_MIP_Problem_set_control_parameter/2,
+ ppl_new_PIP_Problem_from_space_dimension/2,
+ ppl_new_PIP_Problem/4,
+ ppl_new_PIP_Problem_from_PIP_Problem/2,
+ ppl_PIP_Problem_swap/2,
+ ppl_delete_PIP_Problem/1,
+ ppl_PIP_Problem_space_dimension/2,
+ ppl_PIP_Problem_parameter_space_dimensions/2,
+ ppl_PIP_Problem_constraints/2,
+ ppl_PIP_Problem_clear/1,
+ ppl_PIP_Problem_add_space_dimensions_and_embed/3,
+ ppl_PIP_Problem_add_to_parameter_space_dimensions/2,
+ ppl_PIP_Problem_add_constraint/2,
+ ppl_PIP_Problem_add_constraints/2,
+ ppl_PIP_Problem_set_control_parameter/2,
+ ppl_PIP_Problem_get_control_parameter/3,
+ ppl_PIP_Problem_has_big_parameter_dimension/2,
+ ppl_PIP_Problem_set_big_parameter_dimension/2,
+ ppl_PIP_Problem_is_satisfiable/1,
+ ppl_PIP_Problem_solve/2,
+ ppl_PIP_Problem_solution/2,
+ ppl_PIP_Problem_optimizing_solution/2,
+ ppl_PIP_Problem_OK/1,
+ ppl_PIP_Problem_ascii_dump/1,
+ ppl_PIP_Tree_Node_constraints/2,
+ ppl_PIP_Tree_Node_is_solution/1,
+ ppl_PIP_Tree_Node_is_decision/1,
+ ppl_PIP_Tree_Node_is_bottom/1,
+ ppl_PIP_Tree_Node_artificials/2,
+ ppl_PIP_Tree_Node_OK/1,
+ ppl_PIP_Tree_Node_parametric_values/3,
+ ppl_PIP_Tree_Node_true_child/2,
+ ppl_PIP_Tree_Node_false_child/2
+ from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "pl_check.pl"
+
+prolog_system('XSB').
+
+main :-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
+
+:- main.
diff --git a/interfaces/Prolog/YAP/Makefile.am b/interfaces/Prolog/YAP/Makefile.am
new file mode 100644
index 0000000..419ce60
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.am
@@ -0,0 +1,278 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+YAP_CFLI_FILES = yap_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+yap_prolog_generated_test.pl \
+README.yap
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_yap_cc.m4
+
+ppl_yap.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
+
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(YAP_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+pkglib_LTLIBRARIES = ppl_yap.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+
+ppl_yap_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+yap_efli.hh \
+yap_efli.cc
+
+nodist_ppl_yap_la_SOURCES = \
+ppl_yap.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_ppl_yap_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ppl_yap_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(YAP_PROLOG_LD_OPTIONS) \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ppl_yap_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+ppl_yap_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_yap.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ echo "main." >script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ppl_yap.la \
+ $(YAP_PROLOG) -l $(srcdir)/yap_pl_check.pl \
+ <script_pchk >obtained_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+ cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ echo "main." >script_clpq
+ cat $(srcdir)/../tests/script_clpq >>script_clpq
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ppl_yap.la \
+ $(YAP_PROLOG) -l $(srcdir)/yap_clpq.pl \
+ <script_clpq >obtained_clpq
+ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ echo "main." >script_clpq2
+ cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ppl_yap.la \
+ $(YAP_PROLOG) -l $(srcdir)/yap_clpq2.pl \
+ <script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: yap_prolog_generated_test.pl ppl_yap.pl ../tests/expected_pgt
+ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/yap_prolog_generated_test.pl . ; \
+ cp -f $(srcdir)/ppl_yap.pl . ; \
+ fi
+ cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \
+ echo "main." >script_pgt
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ppl_yap.la \
+ $(YAP_PROLOG) -l yap_prolog_generated_test.pl \
+ <script_pgt >obtained_pgt
+ rm -f ppl_prolog_generated_test_common.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f yap_prolog_generated_test.pl; \
+ rm -f ppl_yap.pl; \
+ fi
+ rm -f ppl_prolog_generated_test_main.pl
+ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+endif ENABLE_SHARED
+
+CLEANFILES = \
+ppl_yap.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+script_clpq script_clpq2 script_pchk script_pgt \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_ppl_yap_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/YAP/Makefile.in b/interfaces/Prolog/YAP/Makefile.in
new file mode 100644
index 0000000..5375b9f
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.in
@@ -0,0 +1,1644 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/YAP
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am__ppl_yap_la_SOURCES_DIST = ppl_prolog_sysdep.hh yap_efli.hh \
+ yap_efli.cc
+ at ENABLE_SHARED_TRUE@am_ppl_yap_la_OBJECTS = yap_efli.lo
+ at ENABLE_SHARED_TRUE@nodist_ppl_yap_la_OBJECTS = ppl_yap.lo \
+ at ENABLE_SHARED_TRUE@ ppl_prolog_common.lo
+ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS) \
+ $(nodist_ppl_yap_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+ppl_yap_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(ppl_yap_la_LDFLAGS) $(LDFLAGS) -o $@
+ at ENABLE_SHARED_TRUE@am_ppl_yap_la_rpath = -rpath $(pkglibdir)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(ppl_yap_la_SOURCES) $(nodist_ppl_yap_la_SOURCES) \
+ $(nodist_EXTRA_ppl_yap_la_SOURCES)
+DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+YAP_CFLI_FILES = yap_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+yap_prolog_generated_test.pl \
+README.yap
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_yap_cc.m4
+
+ at ENABLE_SHARED_TRUE@AM_CPPFLAGS = \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_builddir)/src \
+ at ENABLE_SHARED_TRUE@$(YAP_PROLOG_INCLUDE_OPTIONS) \
+ at ENABLE_SHARED_TRUE@@extra_includes@
+
+ at ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = ppl_yap.la
+
+# There is no point in generating the static version.
+ at ENABLE_SHARED_TRUE@AM_LIBTOOLFLAGS = --tag=disable-static
+ at ENABLE_SHARED_TRUE@ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \
+ at ENABLE_SHARED_TRUE@yap_efli.hh \
+ at ENABLE_SHARED_TRUE@yap_efli.cc
+
+ at ENABLE_SHARED_TRUE@nodist_ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_yap.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_common.cc
+
+ at ENABLE_SHARED_TRUE@nodist_EXTRA_ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_LIBADD = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \
+ at ENABLE_SHARED_TRUE@$(YAP_PROLOG_LD_OPTIONS) \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_DEPENDENCIES = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_LDFLAGS = \
+ at ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \
+ at ENABLE_SHARED_TRUE@-module \
+ at ENABLE_SHARED_TRUE@-avoid-version
+
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_yap.pl
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at ENABLE_SHARED_TRUE@ack.clpq \
+ at ENABLE_SHARED_TRUE@ackn.clpq \
+ at ENABLE_SHARED_TRUE@fib.clpq \
+ at ENABLE_SHARED_TRUE@mc91.clpq \
+ at ENABLE_SHARED_TRUE@smm.clpq \
+ at ENABLE_SHARED_TRUE@sumto.clpq \
+ at ENABLE_SHARED_TRUE@tak.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \
+ at ENABLE_SHARED_TRUE@schedule.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_yap.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+script_clpq script_clpq2 script_pchk script_pgt \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+ }
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES) $(EXTRA_ppl_yap_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(ppl_yap_la_LINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_OBJECTS) $(ppl_yap_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_yap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/yap_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-pkgdataDATA \
+ uninstall-pkglibLTLIBRARIES
+
+
+ppl_yap.cc: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
+
+ at ENABLE_SHARED_TRUE@check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+ at ENABLE_SHARED_TRUE@pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at ENABLE_SHARED_TRUE@ echo "main." >script_pchk
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@ $(YAP_PROLOG) -l $(srcdir)/yap_pl_check.pl \
+ at ENABLE_SHARED_TRUE@ <script_pchk >obtained_pchk
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at ENABLE_SHARED_TRUE@$(CLPQ_TESTS):
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/$@ .
+
+ at ENABLE_SHARED_TRUE@clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@ echo "main." >script_clpq
+ at ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq >>script_clpq
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@ $(YAP_PROLOG) -l $(srcdir)/yap_clpq.pl \
+ at ENABLE_SHARED_TRUE@ <script_clpq >obtained_clpq
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at ENABLE_SHARED_TRUE@clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@ echo "main." >script_clpq2
+ at ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@ $(YAP_PROLOG) -l $(srcdir)/yap_clpq2.pl \
+ at ENABLE_SHARED_TRUE@ <script_clpq2 >obtained_clpq2
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at ENABLE_SHARED_TRUE@ppl_prolog_generated_test: yap_prolog_generated_test.pl ppl_yap.pl ../tests/expected_pgt
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/yap_prolog_generated_test.pl . ; \
+ at ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ppl_yap.pl . ; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \
+ at ENABLE_SHARED_TRUE@ echo "main." >script_pgt
+ at ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@ $(YAP_PROLOG) -l yap_prolog_generated_test.pl \
+ at ENABLE_SHARED_TRUE@ <script_pgt >obtained_pgt
+ at ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_common.pl
+ at ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@ rm -f yap_prolog_generated_test.pl; \
+ at ENABLE_SHARED_TRUE@ rm -f ppl_yap.pl; \
+ at ENABLE_SHARED_TRUE@ fi
+ at ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_main.pl
+ at ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_ppl_yap_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/YAP/README.yap b/interfaces/Prolog/YAP/README.yap
new file mode 100644
index 0000000..01c9fda
--- /dev/null
+++ b/interfaces/Prolog/YAP/README.yap
@@ -0,0 +1,23 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The YAP Prolog interface to the PPL is available as a dynamically
+linked module. Only YAP version 5.1.1 and following are supported.
+
+In order to dynamically load the library from YAP you should simply
+load `<prefix>/lib/ppl/ppl_yap.pl', where <prefix> is the root of your
+installation (`/usr' or `/usr/local' in most cases). This will invoke
+`ppl_initialize/0' automatically; it is the programmer's
+responsibility to call `ppl_finalize/0' when the PPL library is no
+longer needed. Notice that, for dynamic linking to work, you should
+have configured the library with the `--enable-shared' option (on most
+platforms this is the default).
diff --git a/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
new file mode 100644
index 0000000..3141f40
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
@@ -0,0 +1,165 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_yap.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* YAP Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define YAP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ return name(); \
+}
+
+#define YAP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ return name(arg1); \
+}
+
+#define YAP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ return name(arg1, arg2); \
+}
+
+#define YAP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ return name(arg1, arg2, arg3); \
+}
+
+#define YAP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ Prolog_term_ref arg4 = YAP_ARG4; \
+ return name(arg1, arg2, arg3, arg4); \
+}
+
+#define YAP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ Prolog_term_ref arg4 = YAP_ARG4; \
+ Prolog_term_ref arg5 = YAP_ARG5; \
+ return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define YAP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ Prolog_term_ref arg4 = YAP_ARG4; \
+ Prolog_term_ref arg5 = YAP_ARG5; \
+ Prolog_term_ref arg6 = YAP_ARG6; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define YAP_STUB_7(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ Prolog_term_ref arg4 = YAP_ARG4; \
+ Prolog_term_ref arg5 = YAP_ARG5; \
+ Prolog_term_ref arg6 = YAP_ARG6; \
+ Prolog_term_ref arg7 = YAP_ARG7; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define YAP_STUB_8(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+ Prolog_term_ref arg1 = YAP_ARG1; \
+ Prolog_term_ref arg2 = YAP_ARG2; \
+ Prolog_term_ref arg3 = YAP_ARG3; \
+ Prolog_term_ref arg4 = YAP_ARG4; \
+ Prolog_term_ref arg5 = YAP_ARG5; \
+ Prolog_term_ref arg6 = YAP_ARG6; \
+ Prolog_term_ref arg7 = YAP_ARG7; \
+ Prolog_term_ref arg8 = YAP_ARG8; \
+ return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+dnl
+dnl Place here YAP_STUB macros.
+dnl
+m4_divert(1)dnl
+
+#define YAP_USER_C_PREDICATE(name, arity) \
+ YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
+
+extern "C" void
+init() {
+ ppl_initialize();
+
+dnl
+dnl Place here YAP_USER_C_PREDICATE macros.
+dnl
+m4_divert(2)dnl
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_expanded_procedure_schema to generate YAP stubs.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+YAP_STUB_$2($1)
+')`'dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+dnl Redefine m4_expanded_procedure_schema to generate YAP user predicates.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+ YAP_USER_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..82b0ffb
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for YAP.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "yap_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::YAP;
diff --git a/interfaces/Prolog/YAP/ppl_yap.pl b/interfaces/Prolog/YAP/ppl_yap.pl
new file mode 100644
index 0000000..9cfdcad
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.pl
@@ -0,0 +1,24 @@
+/* Loader for the YAP Prolog interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- load_foreign_files(['ppl_yap'],[],init).
diff --git a/interfaces/Prolog/YAP/yap_cfli.hh b/interfaces/Prolog/YAP/yap_cfli.hh
new file mode 100644
index 0000000..d0dbbc2
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_cfli.hh
@@ -0,0 +1,349 @@
+/* YAP Prolog Common Foreign Language Interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_yap_cfli_hh
+#define PCFLI_yap_cfli_hh 1
+
+#include <Yap/YapInterface.h>
+#include <cassert>
+#include <climits>
+#include <gmp.h>
+
+typedef YAP_Term Prolog_term_ref;
+typedef YAP_Atom Prolog_atom;
+typedef YAP_Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+ Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+ return 0;
+}
+
+/*!
+ Make \p t be a reference to the same term referenced by \p u,
+ i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+ t = u;
+ return 1;
+}
+
+/*!
+ Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+ t = YAP_MkIntTerm(l);
+ return 1;
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+ Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+ if (ul <= LONG_MAX)
+ t = YAP_MkIntTerm(ul);
+ else {
+ if (!tmp_mpz_t_initialized) {
+ mpz_init_set_ui(tmp_mpz_t, ul);
+ tmp_mpz_t_initialized = 1;
+ }
+ else
+ mpz_set_ui(tmp_mpz_t, ul);
+ t = YAP_MkBigNumTerm(tmp_mpz_t);
+ }
+ return 1;
+}
+
+/*!
+ Assign to \p t an atom whose name is given
+ by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+ t = YAP_MkAtomTerm(YAP_FullLookupAtom(s));
+ return 1;
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+ t = YAP_MkAtomTerm(a);
+ return 1;
+}
+
+/*!
+ Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+ assert(sizeof(long) >= sizeof(void*));
+ t = YAP_MkIntTerm(reinterpret_cast<long>(p));
+ return 1;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return YAP_FullLookupAtom(s);
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1) {
+ YAP_Term args[1];
+ args[0] = a1;
+ t = YAP_MkApplTerm(YAP_MkFunctor(f, 1), 1, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2) {
+ YAP_Term args[2];
+ args[0] = a1;
+ args[1] = a2;
+ t = YAP_MkApplTerm(YAP_MkFunctor(f, 2), 2, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3) {
+ YAP_Term args[3];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ t = YAP_MkApplTerm(YAP_MkFunctor(f, 3), 3, args);
+ return 1;
+}
+
+/*!
+ Assign to \p t a compound term whose principal functor is \p f
+ of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+ Prolog_term_ref a1, Prolog_term_ref a2,
+ Prolog_term_ref a3, Prolog_term_ref a4) {
+ YAP_Term args[4];
+ args[0] = a1;
+ args[1] = a2;
+ args[2] = a3;
+ args[3] = a4;
+ t = YAP_MkApplTerm(YAP_MkFunctor(f, 4), 4, args);
+ return 1;
+}
+
+/*!
+ Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+ Prolog_term_ref h, Prolog_term_ref t) {
+ c = YAP_MkPairTerm(h, t);
+ return 1;
+}
+
+/*!
+ Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+ YAP_Throw(t);
+}
+
+/*!
+ Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+ return YAP_IsVarTerm(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+ return YAP_IsAtomTerm(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+ return YAP_IsIntTerm(t) != FALSE || YAP_IsBigNumTerm(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+ return YAP_IsIntTerm(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+ return YAP_IsApplTerm(t) != FALSE;
+}
+
+/*!
+ Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ return YAP_IsPairTerm(t) != FALSE;
+}
+
+/*!
+ Assuming \p t is a Prolog integer, return true if its value fits
+ in a long, in which case the value is assigned to \p v,
+ return false otherwise. The behavior is undefined if \p t is
+ not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+ assert(Prolog_is_integer(t));
+ if (YAP_IsBigNumTerm(t) != FALSE) {
+ if (!tmp_mpz_t_initialized) {
+ mpz_init(tmp_mpz_t);
+ tmp_mpz_t_initialized = 1;
+ }
+ YAP_BigNumOfTerm(t, tmp_mpz_t);
+ if (mpz_cmp_si(tmp_mpz_t, LONG_MIN) >= 0
+ && mpz_cmp_si(tmp_mpz_t, LONG_MAX) <= 0)
+ *lp = mpz_get_si(tmp_mpz_t);
+ else
+ return 0;
+ }
+ else
+ *lp = YAP_IntOfTerm(t);
+ return 1;
+}
+
+/*!
+ If \p t is the Prolog representation for a memory address, return
+ true and store that address into to \p v; return false otherwise.
+ The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+ assert(Prolog_is_address(t));
+ *vpp = reinterpret_cast<void*>(YAP_IntOfTerm(t));
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog atom, return true and store its name into \p name.
+ The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+ assert(Prolog_is_atom(t));
+ *ap = YAP_AtomOfTerm(t);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term, return true and store its name
+ and arity into \p name and \p arity, respectively.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+ assert(Prolog_is_compound(t));
+ YAP_Functor f = YAP_FunctorOfTerm(t);
+ *ap = YAP_NameOfFunctor(f);
+ *ip = YAP_ArityOfFunctor(f);
+ return 1;
+}
+
+/*!
+ If \p t is a Prolog compound term and \p i is a positive integer
+ less than or equal to its arity, return true and assign to \p a the
+ i-th (principal) argument of \p t.
+ The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+ assert(Prolog_is_compound(t));
+ a = YAP_ArgOfTerm(i, t);
+ return 1;
+}
+
+/*!
+ If \p c is a Prolog cons (list constructor), assign its head and
+ tail to \p h and \p t, respectively.
+ The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+ assert(Prolog_is_cons(c));
+ h = YAP_HeadOfTerm(c);
+ t = YAP_TailOfTerm(c);
+ return 1;
+}
+
+/*!
+ Unify the terms referenced by \p t and \p u and return true
+ if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+ return YAP_Unify(t, u) != FALSE;
+}
+
+#endif // !defined(PCFLI_yap_cfli_hh)
diff --git a/interfaces/Prolog/YAP/yap_clpq.pl b/interfaces/Prolog/YAP/yap_clpq.pl
new file mode 100644
index 0000000..c72793c
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq.pl
@@ -0,0 +1,31 @@
+/* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+ common_main.
diff --git a/interfaces/Prolog/YAP/yap_clpq2.pl b/interfaces/Prolog/YAP/yap_clpq2.pl
new file mode 100644
index 0000000..e582fe3
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq2.pl
@@ -0,0 +1,31 @@
+/* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq2.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+ common_main.
diff --git a/interfaces/Prolog/YAP/yap_efli.cc b/interfaces/Prolog/YAP/yap_efli.cc
new file mode 100644
index 0000000..196f815
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.cc
@@ -0,0 +1,95 @@
+/* YAP extended foreign language interface: definitions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "yap_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace YAP {
+
+Prolog_atom a_throw;
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+mpz_class tmp_mpz_class;
+
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+
+ a_throw = YAP_LookupAtom("throw");
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+ assert(Prolog_is_integer(t));
+ if (YAP_IsBigNumTerm(t) != FALSE) {
+ YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+ n = tmp_mpz_class;
+ }
+ else
+ n = YAP_IntOfTerm(t);
+ return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+ if (n >= LONG_MIN && n <= LONG_MAX) {
+ long l = 0;
+ assign_r(l, n, ROUND_NOT_NEEDED);
+ t = YAP_MkIntTerm(l);
+ }
+ else {
+ assign_r(tmp_mpz_class, n, ROUND_NOT_NEEDED);
+ t = YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+ }
+ return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+ Prolog_term_ref u = Prolog_new_term_ref();
+ return Prolog_put_Coefficient(u, n) && YAP_Unify(t, u);
+}
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/YAP/yap_efli.hh b/interfaces/Prolog/YAP/yap_efli.hh
new file mode 100644
index 0000000..98fb20d
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.hh
@@ -0,0 +1,91 @@
+/* YAP extended foreign language interface: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_yap_efli_hh
+#define PPL_yap_efli_hh 1
+
+#include "ppl.hh"
+#include "yap_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace YAP {
+
+//extern Prolog_atom a_throw;
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the minimum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+ If \p Prolog_has_unbounded_integers is false, holds the maximum
+ integer value representable by a Prolog integer.
+ Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_yap_efli_hh)
diff --git a/interfaces/Prolog/YAP/yap_pl_check.pl b/interfaces/Prolog/YAP/yap_pl_check.pl
new file mode 100644
index 0000000..40adbb8
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_pl_check.pl
@@ -0,0 +1,35 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/pl_check.pl').
+
+prolog_system('YAP').
+
+main :-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
diff --git a/interfaces/Prolog/YAP/yap_prolog_generated_test.pl b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl
new file mode 100644
index 0000000..af68b4b
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl
@@ -0,0 +1,36 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('ppl_prolog_generated_test_main.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+prolog_system('YAP').
+
+main :-
+ (check_all ->
+ write('OK')
+ ;
+ write('FAILURE')
+ ),
+ nl.
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
new file mode 100644
index 0000000..3038173
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
@@ -0,0 +1,2156 @@
+dnl -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program code for generating the
+files ppl_prolog_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+ Prolog_term_ref t_uoe,
+ Prolog_term_ref t_ph) {
+ static const char* where = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* ph;
+ Prolog_atom uoe = term_to_universe_or_empty(t_uoe, where);
+
+ if (uoe == a_empty)
+ ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+ where),
+ EMPTY);
+ else
+ ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+ where),
+ UNIVERSE);
+
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+ m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+(Prolog_term_ref t_ph_source, Prolog_term_ref t_ph)
+{
+ static const char* where
+ = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* ph;
+ const @B_FRIEND@* const ph_source
+ = static_cast<const @B_FRIEND@*>
+ (term_to_handle<@B_FRIEND@ >(t_ph_source, where));
+ PPL_CHECK(ph_source);
+ ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+ m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+ Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph,
+ Prolog_term_ref t_cc)
+{
+ static const char* where =
+ "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* ph;
+ const @B_FRIEND@* ph_source
+ = static_cast<const @B_FRIEND@*>
+ (term_to_handle<@B_FRIEND@ >(t_ph_source, where));
+
+ Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+ Complexity_Class cc;
+ if (p_cc == a_polynomial)
+ cc = POLYNOMIAL_COMPLEXITY;
+ else if (p_cc == a_simplex)
+ cc = SIMPLEX_COMPLEXITY;
+ else
+ cc = ANY_COMPLEXITY;
+
+ PPL_CHECK(ph_source);
+ ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source, cc);
+
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+ Prolog_term_ref t_ph)
+{
+ static const char* where =
+ "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2";
+ try {
+ @!BUILD_REPRESENT at _System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_ at BUILD_REPRESENT@(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ @TOPOLOGY@@CPP_CLASS@* ph;
+ ph = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+ m4_define(`ppl_ at CLASS@_swap_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_swap/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ swap(*lhs, *rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_delete_ at CLASS@(Prolog_term_ref t_ph) {
+ static const char* where = "ppl_delete_ at CLASS@/1";
+ try {
+ const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_UNREGISTER(ph);
+ delete ph;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+ static const char* where = "ppl_ at CLASS@_ at DIMENSION@/2";
+ try {
+ const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ if (unify_ulong(t_sd, ph->@DIMENSION@()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ static const char* where = "ppl_ at CLASS@_get_ at CLASS_REPRESENT@s/2";
+ try {
+ const @CPP_CLASS@* const ph
+ = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const @!CLASS_REPRESENT at _System& gs = ph->@CLASS_REPRESENT at s();
+ for (@!CLASS_REPRESENT at _System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ Prolog_construct_cons(tail, @CLASS_REPRESENT at _term(*i), tail);
+
+ if (Prolog_unify(t_glist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ static const char* where = "ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s/2";
+ try {
+ const @CPP_CLASS@* const ph
+ = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const @!CLASS_REPRESENT at _System& gs = ph->minimized_ at CLASS_REPRESENT@s();
+ for (@!CLASS_REPRESENT at _System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ Prolog_construct_cons(tail, @CLASS_REPRESENT at _term(*i), tail);
+
+ if (Prolog_unify(t_glist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it) {
+ static const char* where = "ppl_ at CLASS@_ at BEGINEND@_iterator/2";
+ try {
+ @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+ PPL_CHECK(pps);
+
+ @CPP_CLASS@::iterator* i = new @CPP_CLASS@::iterator(pps->@BEGINEND@());
+ Prolog_term_ref t_i = Prolog_new_term_ref();
+ Prolog_put_address(t_i, i);
+
+ if (Prolog_unify(t_it, t_i)) {
+ PPL_REGISTER(i);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete i;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at CLASS@_iterator_from_iterator(Prolog_term_ref t_source,
+ Prolog_term_ref t_it) {
+ static const char* where = "ppl_new_ at CLASS@_iterator_from_iterator/2";
+ try {
+ const @CPP_CLASS@::iterator* source
+ = term_to_handle<const @CPP_CLASS@::iterator>(t_source, where);
+ PPL_CHECK(source);
+
+ @CPP_CLASS@::iterator* it = new @CPP_CLASS@::iterator(*source);
+ Prolog_term_ref t_i = Prolog_new_term_ref();
+ Prolog_put_address(t_i, it);
+
+ if (Prolog_unify(t_it, t_i)) {
+ PPL_REGISTER(it);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete it;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_delete_ at CLASS@_iterator(Prolog_term_ref t_it) {
+ static const char* where = "ppl_delete_ at CLASS@_iterator/1";
+ try {
+ const @CPP_CLASS@::iterator* it
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+ PPL_UNREGISTER(it);
+ delete it;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it) {
+ static const char* where = "ppl_ at CLASS@_ at INCDEC@_iterator/2";
+ try {
+ @CPP_CLASS@::iterator* it
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+ PPL_CHECK(it);
+ @B_INCDEC@(*it);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+ Prolog_term_ref t_it2) {
+ static const char* where = "ppl_ at CLASS@_iterator_equals_iterator/2";
+ try {
+ @CPP_CLASS@::iterator* it1
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it1, where);
+ PPL_CHECK(it1);
+ @CPP_CLASS@::iterator* it2
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it2, where);
+ PPL_CHECK(it2);
+ if (*it1 == *it2)
+ return PROLOG_SUCCESS;
+ else
+ return PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+ Prolog_term_ref t_disj) {
+ static const char* where = "ppl_ at CLASS@_get_disjunct/2";
+ try {
+ const @CPP_CLASS@::iterator* it
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+ PPL_CHECK(it);
+
+ @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* disj
+ = const_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(&((*it)->pointset()));
+ Prolog_term_ref t_d = Prolog_new_term_ref();
+ Prolog_put_address(t_d, disj);
+
+ if (Prolog_unify(t_disj, t_d)) {
+ PPL_WEAK_REGISTER(disj);
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it) {
+ static const char* where = "ppl_ at CLASS@_drop_disjuncts/2";
+ try {
+ @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+ PPL_CHECK(pps);
+
+ @CPP_CLASS@::iterator* it
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+ PPL_CHECK(it);
+
+ @CPP_CLASS@::iterator& i = *it;
+ i = pps->drop_disjunct(i);
+
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_disjuncts(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it1,
+ Prolog_term_ref t_it2) {
+ static const char* where = "ppl_ at CLASS@_drop_disjuncts/3";
+ try {
+ @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+ PPL_CHECK(pps);
+
+ @CPP_CLASS@::iterator* it1
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it1, where);
+ PPL_CHECK(it1);
+ @CPP_CLASS@::iterator* it2
+ = term_to_handle<@CPP_CLASS@::iterator >(t_it2, where);
+ PPL_CHECK(it2);
+
+ @CPP_CLASS@::iterator& i1 = *it1;
+ @CPP_CLASS@::iterator& i2 = *it2;
+ pps->drop_disjuncts(i1, i2);
+
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d) {
+ static const char* where = "ppl_ at CLASS@_add_disjunct/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* d =
+ static_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>
+ (term_to_handle<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@ >(t_d, where));
+ PPL_CHECK(d);
+ ph->add_disjunct(*d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_linear_ at PARTITION@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_qh,
+ Prolog_term_ref t_inters,
+ Prolog_term_ref t_pset) {
+ try {
+ static const char* where = "ppl_ at CLASS@_linear_partition/4";
+ @CPP_CLASS@* rfh;
+ Pointset_Powerset<NNC_Polyhedron>* rsh;
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_linear_partition_for_polyhedron_domains',
+ `m4_linear_partition_for_non_polyhedron_domains')'
+ Prolog_term_ref t_r_first = Prolog_new_term_ref();
+ Prolog_term_ref t_r_second = Prolog_new_term_ref();
+ Prolog_put_address(t_r_first, rfh);
+ Prolog_put_address(t_r_second, rsh);
+ if (Prolog_unify(t_inters, t_r_first)
+ && Prolog_unify(t_pset, t_r_second)) {
+ PPL_REGISTER(rfh);
+ PPL_REGISTER(rsh);
+ return PROLOG_SUCCESS;
+ }
+ else {
+ delete rfh;
+ delete rsh;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+` const Polyhedron* xph = term_to_handle<Polyhedron>(t_ph, where);
+ if (Interfaces::is_necessarily_closed_for_interfaces(*xph)) {
+ const C_Polyhedron* ph = term_to_handle<C_Polyhedron>(t_ph, where);
+ const C_Polyhedron* qh = term_to_handle<C_Polyhedron>(t_qh, where);
+ PPL_CHECK(ph);
+ PPL_CHECK(qh);
+ std::pair<C_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(*ph, *qh);
+ rfh = new C_Polyhedron(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+ }
+ else {
+ const NNC_Polyhedron* ph = term_to_handle<NNC_Polyhedron>(t_ph, where);
+ const NNC_Polyhedron* qh = term_to_handle<NNC_Polyhedron>(t_qh, where);
+ PPL_CHECK(ph);
+ PPL_CHECK(qh);
+ std::pair<NNC_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(*ph, *qh);
+ rfh = new NNC_Polyhedron(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+ }
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+` const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ const @CPP_CLASS@* qh = term_to_handle<@CPP_CLASS@ >(t_qh, where);
+ PPL_CHECK(ph);
+ PPL_CHECK(qh);
+ std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+ r = linear_partition(*ph, *qh);
+ rfh = new @CPP_CLASS@(0, EMPTY);
+ rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+ swap(*rfh, r.first);
+ swap(*rsh, r.second);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+ `dnl
+ extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_approximate_ at PARTITION@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_qh,
+ Prolog_term_ref t_finite,
+ Prolog_term_ref t_inters,
+ Prolog_term_ref t_pset) {
+ static const char* where = "ppl_ at CLASS@_approximate_partition/5";
+ try {
+ const @CLASS@* ph =
+ term_to_handle<@CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const @CLASS@* qh =
+ term_to_handle<@CLASS@ >(t_qh, where);
+ PPL_CHECK(qh);
+ bool finite;
+
+ std::pair<@CLASS@|COMMA| Pointset_Powerset<Grid> > r =
+ approximate_partition(*ph, *qh, finite);
+
+ @CLASS@* rfh = new @CLASS@(EMPTY);
+ swap(*rfh, r.first);
+
+ Pointset_Powerset<Grid>* rsh =
+ new Pointset_Powerset<Grid>(EMPTY);
+ swap(*rsh, r.second);
+
+ Prolog_term_ref t_b = Prolog_new_term_ref();
+ Prolog_term_ref t_r_first = Prolog_new_term_ref();
+ Prolog_term_ref t_r_second = Prolog_new_term_ref();
+ Prolog_atom a = (finite ? a_true : a_false);
+ Prolog_put_atom(t_b, a);
+
+ Prolog_put_address(t_r_first, rfh);
+ Prolog_put_address(t_r_second, rsh);
+
+ if (Prolog_unify(t_inters, t_r_first)
+ && Prolog_unify(t_pset, t_r_second
+ && Prolog_unify(t_finite, t_b)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_c,
+ Prolog_term_ref t_r) {
+ static const char* where =
+ "ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+relation_with_ at RELATION_REPRESENT@_code
+ if (Prolog_unify(t_r, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`relation_with_constraint_code', `
+ Poly_Con_Relation r = ph->relation_with(build_constraint(t_c, where));
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ while (r != Poly_Con_Relation::nothing()) {
+ if (r.implies(Poly_Con_Relation::is_disjoint())) {
+ Prolog_term_ref t_dis = Prolog_new_term_ref();
+ Prolog_put_atom(t_dis, a_is_disjoint);
+ Prolog_construct_cons(tail, t_dis, tail);
+ r = r - Poly_Con_Relation::is_disjoint();
+ }
+ else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+ Prolog_term_ref t_sin = Prolog_new_term_ref();
+ Prolog_put_atom(t_sin, a_strictly_intersects);
+ Prolog_construct_cons(tail, t_sin, tail);
+ r = r - Poly_Con_Relation::strictly_intersects();
+ }
+ else if (r.implies(Poly_Con_Relation::is_included())) {
+ Prolog_term_ref t_inc = Prolog_new_term_ref();
+ Prolog_put_atom(t_inc, a_is_included);
+ Prolog_construct_cons(tail, t_inc, tail);
+ r = r - Poly_Con_Relation::is_included();
+ }
+ else if (r.implies(Poly_Con_Relation::saturates())) {
+ Prolog_term_ref t_sat = Prolog_new_term_ref();
+ Prolog_put_atom(t_sat, a_saturates);
+ Prolog_construct_cons(tail, t_sat, tail);
+ r = r - Poly_Con_Relation::saturates();
+ }
+ }
+')
+
+m4_define(`relation_with_congruence_code', `
+ Poly_Con_Relation r = ph->relation_with(build_congruence(t_c, where));
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ while (r != Poly_Con_Relation::nothing()) {
+ if (r.implies(Poly_Con_Relation::is_disjoint())) {
+ Prolog_term_ref t_dis = Prolog_new_term_ref();
+ Prolog_put_atom(t_dis, a_is_disjoint);
+ Prolog_construct_cons(tail, t_dis, tail);
+ r = r - Poly_Con_Relation::is_disjoint();
+ }
+ else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+ Prolog_term_ref t_sin = Prolog_new_term_ref();
+ Prolog_put_atom(t_sin, a_strictly_intersects);
+ Prolog_construct_cons(tail, t_sin, tail);
+ r = r - Poly_Con_Relation::strictly_intersects();
+ }
+ else if (r.implies(Poly_Con_Relation::is_included())) {
+ Prolog_term_ref t_inc = Prolog_new_term_ref();
+ Prolog_put_atom(t_inc, a_is_included);
+ Prolog_construct_cons(tail, t_inc, tail);
+ r = r - Poly_Con_Relation::is_included();
+ }
+ else if (r.implies(Poly_Con_Relation::saturates())) {
+ Prolog_term_ref t_sat = Prolog_new_term_ref();
+ Prolog_put_atom(t_sat, a_saturates);
+ Prolog_construct_cons(tail, t_sat, tail);
+ r = r - Poly_Con_Relation::saturates();
+ }
+ else
+ break;
+ }
+')
+
+m4_define(`relation_with_generator_code', `
+ Poly_Gen_Relation r = ph->relation_with(build_generator(t_c, where));
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Gen_Relation::nothing()) {
+ if (r.implies(Poly_Gen_Relation::subsumes())) {
+ Prolog_term_ref t_sub = Prolog_new_term_ref();
+ Prolog_put_atom(t_sub, a_subsumes);
+ Prolog_construct_cons(tail, t_sub, tail);
+ r = r - Poly_Gen_Relation::subsumes();
+ }
+ }
+')
+
+m4_define(`relation_with_grid_generator_code', `
+ Poly_Gen_Relation r = ph->relation_with(build_grid_generator(t_c, where));
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ while (r != Poly_Gen_Relation::nothing()) {
+ if (r.implies(Poly_Gen_Relation::subsumes())) {
+ Prolog_term_ref t_sub = Prolog_new_term_ref();
+ Prolog_put_atom(t_sub, a_subsumes);
+ Prolog_construct_cons(tail, t_sub, tail);
+ r = r - Poly_Gen_Relation::subsumes();
+ }
+ }
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph) {
+ static const char* where = "ppl_ at CLASS@_ at HAS_PROPERTY@/1";
+ try {
+ const @CPP_CLASS@* const ph
+ = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ if (ph->@HAS_PROPERTY@())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph) {
+ static const char* where = "ppl_ at CLASS@_ at SIMPLIFY@/1";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->@SIMPLIFY@();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v) {
+ static const char* where = "ppl_ at CLASS@__unconstrain/1";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->unconstrain(term_to_Variable(t_v, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_vlist) {
+ static const char* where = "ppl_ at CLASS@__unconstrain/1";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Variables_Set unconstrain_variables;
+ Prolog_term_ref v = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ unconstrain_variables.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+ ph->unconstrain(unconstrain_variables);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v) {
+ static const char* where = "ppl_ at CLASS@__constrains/1";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ if (ph->constrains(term_to_Variable(t_v, where)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_expr) {
+ static const char* where = "ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const Linear_Expression l = build_linear_expression(t_expr, where);
+ if (ph->bounds_from_ at ABOVEBELOW@(l))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_has_ at UPPERLOWER@_bound(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_closed) {
+ static const char* where = "ppl_ at CLASS@_has_ at UPPERLOWER@_bound/5";
+ try {
+ const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const Variable v = term_to_Variable(t_v, where);
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ bool closed;
+ if (ph->has_ at UPPERLOWER@_bound(v, n, d, closed)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (closed ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify_Coefficient(t_n, n)
+ && Prolog_unify_Coefficient(t_d, d)
+ && Prolog_unify(t_closed, t))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_maxmin) {
+ static const char* where = "ppl_ at CLASS@_ at MAXMIN@/5";
+ try {
+ const @CPP_CLASS@* const ph
+ = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr, where);
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ bool maxmin;
+ if (ph->@MAXMIN@(le, n, d, maxmin)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ const Prolog_atom a = (maxmin ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify_Coefficient(t_n, n)
+ && Prolog_unify_Coefficient(t_d, d)
+ && Prolog_unify(t_maxmin, t))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_ at MAXMIN@_with_point
+(Prolog_term_ref t_ph,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_maxmin, Prolog_term_ref t_g) {
+ static const char* where = "ppl_ at CLASS@_ at MAXMIN@_with_point/6";
+ try {
+ const @CPP_CLASS@* const ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr, where);
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ bool maxmin;
+ Generator g(point());
+ if (ph->@MAXMIN@(le, n, d, maxmin, g)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ const Prolog_atom a = (maxmin ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify_Coefficient(t_n, n)
+ && Prolog_unify_Coefficient(t_d, d)
+ && Prolog_unify(t_maxmin, t)
+ && Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2";
+ try {
+ const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ if (lhs->@COMPARISON@(*rhs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_equals_ at CLASS@/2";
+ try {
+ const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ if (*lhs == *rhs)
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_OK(Prolog_term_ref t_ph) {
+ static const char* where = "ppl_ at CLASS@_OK/1";
+ try {
+ const @CPP_CLASS@* const ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ if (ph->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+ static const char* where = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->add_ at CLASS_REPRESENT@(build_ at CLASS_REPRESENT@(t_c, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_c) {
+ static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->refine_with_ at REFINE_REPRESENT@(build_ at REFINE_REPRESENT@(t_c, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@s/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ @!CLASS_REPRESENT at _System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_ at CLASS_REPRESENT@(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ ph->add_ at CLASS_REPRESENT@s(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ @!REFINE_REPRESENT at _System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_ at REFINE_REPRESENT@(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ ph->refine_with_ at REFINE_REPRESENT@s(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`bop_assign_code',
+`namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+Prolog_foreign_return_type
+bop_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ void (@CPP_CLASS@::* bop_assign)(const @CPP_CLASS@&),
+ const char* where) {
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ (lhs->*bop_assign)(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at BINOP@
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at BINOP@";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->@BINOP@(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_positive_time_elapse_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_positive_time_elapse_assign";
+ try {
+ const Polyhedron* xlhs = term_to_handle<Polyhedron >(t_lhs, where);
+ if (Interfaces::is_necessarily_closed_for_interfaces(*xlhs)) {
+ C_Polyhedron* lhs = term_to_handle<C_Polyhedron >(t_lhs, where);
+ const C_Polyhedron* rhs = term_to_handle<C_Polyhedron >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->positive_time_elapse_assign(*rhs);
+ }
+ else {
+ NNC_Polyhedron* lhs = term_to_handle<NNC_Polyhedron >(t_lhs, where);
+ const NNC_Polyhedron* rhs = term_to_handle<NNC_Polyhedron >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->positive_time_elapse_assign(*rhs);
+ }
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_simplify_using_context_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b) {
+ static const char* where = "ppl_ at CLASS@_simplify_using_context_assign";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ Prolog_term_ref t_is_intersect = Prolog_new_term_ref();
+ Prolog_atom is_intersect
+ = (lhs->simplify_using_context_assign(*rhs) ? a_true : a_false);
+ Prolog_put_atom(t_is_intersect, is_intersect);
+ if (Prolog_unify(t_b, t_is_intersect))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at UB_EXACT@
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at UB_EXACT@";
+ try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+ `m4_ub_exact_for_polyhedron_domains',
+ `m4_ub_exact_for_non_polyhedron_domains')'
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+` const Polyhedron* xlhs = term_to_handle<Polyhedron >(t_lhs, where);
+ if (Interfaces::is_necessarily_closed_for_interfaces(*xlhs)) {
+ C_Polyhedron* lhs = term_to_handle<C_Polyhedron >(t_lhs, where);
+ const C_Polyhedron* rhs = term_to_handle<C_Polyhedron >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+ }
+ else {
+ NNC_Polyhedron* lhs = term_to_handle<NNC_Polyhedron >(t_lhs, where);
+ const NNC_Polyhedron* rhs = term_to_handle<NNC_Polyhedron >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+ }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+` @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d) {
+ const char* where = "ppl_ at CLASS@_ at AFFIMAGE@/4";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->@AFFIMAGE@(term_to_Variable(t_v, where),
+ build_linear_expression(t_le, where),
+ term_to_Coefficient(t_d, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+ Prolog_term_ref t_d, Prolog_term_ref t_m) {
+ static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/6";
+ try {
+ @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+ PPL_CHECK(ph);
+ ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+ term_to_relation_symbol(t_r, where),
+ build_linear_expression(t_le, where),
+ term_to_Coefficient(t_d, where),
+ term_to_Coefficient(t_m, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/5";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+ term_to_relation_symbol(t_r, where),
+ build_linear_expression(t_le, where),
+ term_to_Coefficient(t_d, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_m) {
+ static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/5";
+ try {
+ @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+ PPL_CHECK(ph);
+ ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+ term_to_relation_symbol(t_r, where),
+ build_linear_expression(t_rhs, where),
+ term_to_Coefficient(t_m, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Relation_Symbol r = term_to_relation_symbol(t_r, where);
+ ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+ r,
+ build_linear_expression(t_rhs, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_ at CLASS@_bounded_ at AFFIMAGE@/5";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->bounded_ at AFFIMAGE@(term_to_Variable(t_v, where),
+ build_linear_expression(t_lb_le, where),
+ build_linear_expression(t_ub_le, where),
+ term_to_Coefficient(t_d, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset) {
+ static const char* where = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+ PPL_CHECK(pset);
+ if (Parma_Polyhedra_Library::termination_test_ at TERMINATION_ID@(*pset))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before, Prolog_term_ref t_pset_after) {
+ static const char* where
+ = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset_before
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+ @TOPOLOGY@@CPP_CLASS@* pset_after
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+ PPL_CHECK(pset_before);
+ PPL_CHECK(pset_after);
+ if (Parma_Polyhedra_Library
+ ::termination_test_ at TERMINATION_ID@_2(*pset_before, *pset_after))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_g) {
+ static const char* where
+ = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+ Generator gg(point());
+ PPL_CHECK(pset);
+ if (Parma_Polyhedra_Library
+ ::one_affine_ranking_function_ at TERMINATION_ID@(*pset, gg)
+ && Prolog_unify(t_g, generator_term(gg)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_g) {
+ static const char* where
+ = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset_before
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+ @TOPOLOGY@@CPP_CLASS@* pset_after
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+ Generator gg(point());
+ PPL_CHECK(pset_before);
+ PPL_CHECK(pset_after);
+ if (Parma_Polyhedra_Library
+ ::one_affine_ranking_function_ at TERMINATION_ID@_2(*pset_before,
+ *pset_after,
+ gg)
+ && Prolog_unify(t_g, generator_term(gg)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_ph) {
+ static const char* where =
+ "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+ PPL_CHECK(pset);
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ Parma_Polyhedra_Library
+ ::all_affine_ranking_functions_ at TERMINATION_ID@(*pset, *ph);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_ph) {
+ static const char* where =
+ "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset_before
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+ @TOPOLOGY@@CPP_CLASS@* pset_after
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+ PPL_CHECK(pset_before);
+ PPL_CHECK(pset_after);
+ @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+ Parma_Polyhedra_Library
+ ::all_affine_ranking_functions_ at TERMINATION_ID@_2(*pset_before,
+ *pset_after,
+ *ph);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ PPL_REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_ph_decreasing,
+ Prolog_term_ref t_ph_bounded) {
+ static const char* where =
+ "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+ PPL_CHECK(pset);
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ Parma_Polyhedra_Library
+ ::all_affine_quasi_ranking_functions_MS(*pset,
+ *ph_decreasing, *ph_bounded);
+ Prolog_term_ref tmp_decreasing = Prolog_new_term_ref();
+ Prolog_put_address(tmp_decreasing, ph_decreasing);
+ Prolog_term_ref tmp_bounded = Prolog_new_term_ref();
+ Prolog_put_address(tmp_bounded, ph_bounded);
+ if (Prolog_unify(t_ph_decreasing, tmp_decreasing)
+ && Prolog_unify(t_ph_bounded, tmp_bounded)) {
+ PPL_REGISTER(ph_decreasing);
+ PPL_REGISTER(ph_bounded);
+ return PROLOG_SUCCESS;
+ }
+ else {
+ delete ph_decreasing;
+ delete ph_bounded;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_ph_decreasing,
+ Prolog_term_ref t_ph_bounded) {
+ static const char* where =
+ "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4";
+ try {
+ @TOPOLOGY@@CPP_CLASS@* pset_before
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+ @TOPOLOGY@@CPP_CLASS@* pset_after
+ = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+ PPL_CHECK(pset_before);
+ PPL_CHECK(pset_after);
+ C_Polyhedron* ph_decreasing = new C_Polyhedron();
+ C_Polyhedron* ph_bounded = new C_Polyhedron();
+ Parma_Polyhedra_Library
+ ::all_affine_quasi_ranking_functions_MS_2(*pset_before, *pset_after,
+ *ph_decreasing, *ph_bounded);
+ Prolog_term_ref tmp_decreasing = Prolog_new_term_ref();
+ Prolog_put_address(tmp_decreasing, ph_decreasing);
+ Prolog_term_ref tmp_bounded = Prolog_new_term_ref();
+ Prolog_put_address(tmp_bounded, ph_bounded);
+ if (Prolog_unify(t_ph_decreasing, tmp_decreasing)
+ && Prolog_unify(t_ph_bounded, tmp_bounded)) {
+ PPL_REGISTER(ph_decreasing);
+ PPL_REGISTER(ph_bounded);
+ return PROLOG_SUCCESS;
+ }
+ else {
+ delete ph_decreasing;
+ delete ph_bounded;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+ static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+ lhs->@WIDEN at _widening_assign(*rhs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at WIDEN@_widening_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->@WIDEN at _widening_assign(*rhs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_widening_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+ static const char* where = "ppl_ at CLASS@_widening_assign_with_tokens/4";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+ lhs->widening_assign(*rhs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_widening_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_widening_assign/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->widening_assign(*rhs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+ static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+
+ unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+ lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+
+ lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ lhs->@EXTRAPOLATION at _narrowing_assign(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+ static const char* where = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens/4";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ PPL_CHECK(lhs);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(rhs);
+
+ unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+ lhs->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+ (*rhs,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+ &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ PPL_CHECK(lhs);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(rhs);
+
+ lhs->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+ (*rhs,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ PPL_CHECK(lhs);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(rhs);
+
+ lhs->BGP99_extrapolation_assign
+ (*rhs,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+ term_to_unsigned<unsigned>(t_d, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ PPL_CHECK(lhs);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(rhs);
+
+ lhs->BGP99_extrapolation_assign
+ (*rhs,
+ widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_EXTRAPOLATION at _extrapolation_assign),
+ term_to_unsigned<unsigned>(t_d, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+ static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ @!CONSTRAINER at _System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_ at CONSTRAINER@(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+ lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist) {
+ static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3";
+ try {
+ @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+ const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ @!CONSTRAINER at _System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_ at CONSTRAINER@(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+ (Prolog_term_ref t_ph, Prolog_term_ref t_nnd) {
+ static const char* where = "ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+ ph->add_space_dimensions_ at EMBEDPROJECT@(d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_remove_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist) {
+ static const char* where = "ppl_ at CLASS@_remove_space_dimensions/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Variables_Set dead_variables;
+ Prolog_term_ref v = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ dead_variables.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+
+ ph->remove_space_dimensions(dead_variables);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_remove_higher_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_nd) {
+ static const char* where = "ppl_ at CLASS@_remove_higher_space_dimensions/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd,
+ where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_expand_space_dimension
+ (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd) {
+ static const char* where = "ppl_ at CLASS@_expand_space_dimension/3";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->expand_space_dimension(term_to_Variable(t_v, where),
+ term_to_unsigned<dimension_type>(t_nd, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_fold_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v) {
+ static const char* where = "ppl_ at CLASS@_fold_space_dimensions/3";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Variables_Set fold_variables;
+ Prolog_term_ref v = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ fold_variables.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+
+ ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_map_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc) {
+ static const char* where = "ppl_ at CLASS@_map_space_dimensions/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ dimension_type space_dim = ph->space_dimension();
+ PPL_CHECK(ph);
+ Partial_Function pfunc;
+ Prolog_term_ref t_pair = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_pfunc)) {
+ Prolog_get_cons(t_pfunc, t_pair, t_pfunc);
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t_pair, &functor, &arity);
+ if (arity != 2 || functor != a_minus)
+ return PROLOG_FAILURE;
+ Prolog_term_ref t_i = Prolog_new_term_ref();
+ Prolog_term_ref t_j = Prolog_new_term_ref();
+ Prolog_get_arg(1, t_pair, t_i);
+ Prolog_get_arg(2, t_pair, t_j);
+ dimension_type i = term_to_Variable(t_i, where).id();
+ dimension_type j = term_to_Variable(t_j, where).id();
+ if (i >= space_dim)
+ return PROLOG_FAILURE;
+ pfunc.insert(i, j);
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_pfunc, where);
+
+ ph->map_space_dimensions(pfunc);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_some_non_integer_points
+ (Prolog_term_ref t_ph, Prolog_term_ref t_cc) {
+ static const char* where = "ppl_ at CLASS@_drop_some_non_integer_points/2";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+ Complexity_Class cc;
+ if (p_cc == a_polynomial)
+ cc = POLYNOMIAL_COMPLEXITY;
+ else if (p_cc == a_simplex)
+ cc = SIMPLEX_COMPLEXITY;
+ else
+ cc = ANY_COMPLEXITY;
+
+ ph->drop_some_non_integer_points(cc);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_some_non_integer_points_2
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_cc) {
+ static const char* where = "ppl_ at CLASS@_drop_some_non_integer_points_2/3";
+ try {
+ @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ Variables_Set variables;
+ Prolog_term_ref v = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ variables.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+
+ Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+ Complexity_Class cc;
+ if (p_cc == a_polynomial)
+ cc = POLYNOMIAL_COMPLEXITY;
+ else if (p_cc == a_simplex)
+ cc = SIMPLEX_COMPLEXITY;
+ else
+ cc = ANY_COMPLEXITY;
+
+ ph->drop_some_non_integer_points(variables, cc);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ascii_dump
+ (Prolog_term_ref t_ph) {
+ static const char* where = "ppl_ at CLASS@_ascii_dump/1";
+ try {
+ const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ ph->ascii_dump(std::cout);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+ Prolog_term_ref t_m) {
+ static const char* where = "ppl_ at CLASS@_ at MEMBYTES@/2";
+ try {
+ @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+ PPL_CHECK(pps);
+
+ if (unify_ulong(t_m, pps->@MEMBYTES@()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_wrap_assign
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_vars,
+ Prolog_term_ref t_w,
+ Prolog_term_ref t_r,
+ Prolog_term_ref t_o,
+ Prolog_term_ref t_cs,
+ Prolog_term_ref t_complexity,
+ Prolog_term_ref t_ind) {
+ static const char* where = "ppl_ at CLASS@_wrap_assign/8";
+ try {
+ @CPP_CLASS@* pph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+
+ Variables_Set vars;
+ Prolog_term_ref v = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_vars)) {
+ Prolog_get_cons(t_vars, v, t_vars);
+ vars.insert(term_to_Variable(v, where).id());
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vars, where);
+
+ Prolog_atom p_w = term_to_bounded_integer_type_width(t_w, where);
+ Bounded_Integer_Type_Width w;
+ if (p_w == a_bits_8)
+ w = BITS_8;
+ else if (p_w == a_bits_16)
+ w = BITS_16;
+ else if (p_w == a_bits_32)
+ w = BITS_32;
+ else if (p_w == a_bits_64)
+ w = BITS_64;
+ else
+ w = BITS_128;
+
+ Prolog_atom p_r = term_to_bounded_integer_type_representation(t_r, where);
+ Bounded_Integer_Type_Representation r;
+ if (p_r == a_unsigned)
+ r = UNSIGNED;
+ else
+ r = SIGNED_2_COMPLEMENT;
+ Prolog_atom p_o = term_to_bounded_integer_type_overflow(t_o, where);
+ Bounded_Integer_Type_Overflow o;
+ if (p_o == a_overflow_wraps)
+ o = OVERFLOW_WRAPS;
+ else if (p_o == a_overflow_undefined)
+ o = OVERFLOW_UNDEFINED;
+ else
+ o = OVERFLOW_IMPOSSIBLE;
+
+ Constraint_System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_cs)) {
+ Prolog_get_cons(t_cs, c, t_cs);
+ cs.insert(build_constraint(c, where));
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_cs, where);
+
+ unsigned complexity = term_to_unsigned<unsigned>(t_complexity, where);
+
+ Prolog_atom p_ind = term_to_boolean(t_ind, where);
+ bool ind = (p_ind == a_true) ? true : false;
+
+ pph->wrap_assign(vars, w, r, o, &cs, complexity, ind);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+ }
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_frequency(Prolog_term_ref t_ph,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_freqn, Prolog_term_ref t_freqd,
+ Prolog_term_ref t_valn, Prolog_term_ref t_vald) {
+ static const char* where = "ppl_ at CLASS@_frequency/6";
+ try {
+ const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+ PPL_CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr, where);
+ PPL_DIRTY_TEMP_COEFFICIENT(freqn);
+ PPL_DIRTY_TEMP_COEFFICIENT(freqd);
+ PPL_DIRTY_TEMP_COEFFICIENT(valn);
+ PPL_DIRTY_TEMP_COEFFICIENT(vald);
+ if (ph->frequency(le, freqn, freqd, valn, vald)) {
+ if (Prolog_unify_Coefficient(t_freqn, freqn)
+ && Prolog_unify_Coefficient(t_freqd, freqd)
+ && Prolog_unify_Coefficient(t_valn, valn)
+ && Prolog_unify_Coefficient(t_vald, vald))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
new file mode 100644
index 0000000..8068595
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
@@ -0,0 +1,61 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file is used to generate ppl_prlog_domains.cc
+dnl and files ppl_prolog_DOMAIN.cc, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_prolog_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_prolog_cc_code.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_procedure_schema_debug', `m4_dumpdef($1`'_code)')
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_`'m4_current_interface.cc << ___END_OF_FILE___
+/* Prolog m4_current_interface interface code: definitions.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "ppl_prolog_sysdep.hh"
+#include "ppl_prolog_common_defs.hh"
+
+')
+
+m4_divert`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
new file mode 100644
index 0000000..2d1523c
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
@@ -0,0 +1,295 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file Prolog_configured_domains.dox
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl FIXME: This should be in the main m4 generator file.
+
+dnl -----------------------------------------------------------------
+dnl Include the needed m4 files.
+dnl -----------------------------------------------------------------
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+m4_include(`ppl_interface_generator_prolog_dox_code.m4')
+
+dnl =================================================================
+dnl Description of file and copyright notice
+dnl =================================================================
+m4_divert`'dnl
+/* Configuration Dependent Documentation for Prolog.
+m4_include(`ppl_interface_generator_copyright')*/
+
+/*! \page configured_domains_predicates Predicates for Configured Domains
+
+The structure of this section is as follows:
+m4_pushdef(`m4_one_class_code',`dnl
+ - \ref m4_interface_class$1`'_predicates "Predicates for the m4_interface_class$1 Domain"
+')`'dnl
+m4_all_code`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+m4_divert(-1)
+
+dnl =================================================================
+dnl DOMAIN DEPENDENT DOCUMENTATION.
+dnl =================================================================
+
+dnl -----------------------------------------------------------------
+dnl Initialize the class definitions
+dnl as we do not use m4_all_code to generate the documentation,
+dnl this must be done here.
+dnl -----------------------------------------------------------------
+m4_initialize_all
+
+dnl -----------------------------------------------------------------
+dnl For the documentation, the predicates for a single class are
+dnl divinided into categories and then into subcategories.
+dnl Each category and subcategory can have its own introduction.
+dnl -----------------------------------------------------------------
+
+dnl -----------------------------------------------------------------
+dnl Define documentation for one subcategory.
+dnl This requires that m4_ext is defined.
+dnl -----------------------------------------------------------------
+m4_define(`m4_one_subcategory', `dnl
+m4_define(`m4_procedure_schema_extension', m4_ext`'_doc)`'dnl
+m4_echo_unquoted(m4_subcategory_`'m4_ext)
+m4_ifdef(m4_interface_class`'$1,
+`m4_patsubst(m4_one_class_code($1), |COMMA|, `,')`'dnl
+')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Define the documentation for all categories for simple domains;
+dnl -----------------------------------------------------------------
+m4_define(`m4_all_simple_categories', `dnl
+m4_category_constr_destr`'dnl
+m4_define(`m4_ext', build)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', convert)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', destruct)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_constr_destr`'dnl
+m4_category_const`'dnl
+m4_define(`m4_ext', testpoly)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', constpoly)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', dump)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_const`'dnl
+m4_category_nonconst`'dnl
+m4_define(`m4_ext', addto)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', trans)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', binop)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', widen)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_nonconst`'dnl
+m4_category_varspace`'dnl
+m4_define(`m4_ext', concat)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', spacemod)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_varspace`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Define the documentation for an extra category for powerset domains;
+dnl -----------------------------------------------------------------
+m4_define(`m4_iter_pps_categories', `dnl
+m4_define(`m4_ext', pps_iter)`'dnl
+m4_one_subcategory($1)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for one simple class.
+dnl -----------------------------------------------------------------
+m4_define(`m4_one_simple_class_code', `dnl
+\anchor m4_this_interface_class`'_predicates
+<H1>Predicates for the m4_this_topology m4_this_interface_class Domain</H1>
+ Here we provide a short description for each of the predicates
+ available for the domain of m4_this_topology m4_this_ppl_objects.
+m4_ifdef(`m4_prolog_ci_documentation',
+ `Note that predicates for other domains will follow a similar pattern.')
+
+m4_all_simple_categories($1)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl FIXME: Some experimental macros for text processing to try
+dnl and make the documentation a bit more grammatically correct!
+dnl -----------------------------------------------------------------
+
+dnl m4_underscore_to_space(String)
+dnl
+dnl Changes an underscore to space.
+dnl Example: m4_underscore_to_space(`xyz_abc') ==> xyz abc
+m4_define(`m4_underscore_to_space', `m4_translit(`$1', `_', ` ')')
+
+dnl Changes an underscore to space and upper to lower case
+dnl It also tries to change a powerset name into English!
+m4_define(`m4_PPL_domain2text', `dnl
+ m4_patsubst(m4_patsubst(m4_downcase(m4_underscore_to_space($1)),
+ ` c polyhedron', ` of C polyhedra'),
+ ` nnc polyhedron', ` of NNC polyhedra')')
+
+dnl m4_plural(String)
+dnl
+dnl Very simple macro for making domains (lowercase) plural.
+m4_define(`m4_plural', `dnl
+m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst($1,
+ polyhedron, polyhedra),
+ grid, grids),
+ shape, shapes),
+ box, boxes),
+ powerset, powersets),
+ product, products)`'dnl
+')
+
+dnl =================================================================
+dnl Now the generation of the documentation.
+dnl =================================================================
+
+dnl -----------------------------------------------------------------
+dnl CONFIGURATION INDEPENDENT
+dnl -----------------------------------------------------------------
+
+dnl -----------------------------------------------------------------
+dnl Additional ad hoc predicates for the configure independent manual.
+dnl
+dnl Note that currently this only describes predicates for the
+dnl pointset powerset domains but allows for other ad hoc predicates
+dnl for other domains to be added later.
+dnl -----------------------------------------------------------------
+m4_define(`m4_ci_pps_class_code', `dnl
+\anchor other_domains
+<H1>Ad hoc Predicates for Other Domains</H1>
+dnl The pointset powerset domains.
+m4_category_pps
+dnl The predicates for iterators and disjuncts for the powerset domain.
+m4_iter_pps_categories($1)`'dnl
+dnl Other adhoc predicates for the powerset domain.
+m4_define(`m4_ext', pps_other)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_pushdef(`m4_subcategory_widen', `')`'dnl
+m4_define(`m4_ext', widen)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_popdef(`m4_subcategory_widen')`'dnl
+m4_finalize_category_pps`'dnl
+')
+
+m4_divert`'dnl
+m4_ifdef(`m4_prolog_ci_documentation', `dnl
+m4_define(`m4_this_interface_class', Polyhedron)`'dnl
+m4_pushdef(`m4_a_class_replacements', `polyhedron')`'dnl
+m4_pushdef(`m4_Polyhedron_topology_replacements', `C_')`'dnl
+m4_pushdef(`m4_Polyhedron_a_topology_replacements', `C ')`'dnl
+m4_pushdef(`m4_this_ppl_one_object', `polyhedron')`'dnl
+m4_pushdef(`m4_this_ppl_objects', `polyhedra')`'dnl
+m4_pushdef(`m4_this_ppl_group', `polyhedra')`'dnl
+m4_pushdef(`m4_this_topology', `C')`'dnl
+m4_pushdef(`m4_Polyhedron_friend_replacements',
+ `C_Polyhedron, NNC_Polyhedron')`'dnl
+m4_pushdef(`m4_Polyhedron_a_friend_replacements',
+ `C polyhedron, NNC polyhedron')`'dnl
+m4_patsubst(`m4_one_simple_class_code(1)', |COMMA|, `,')`'dnl
+m4_popdef(`m4_Polyhedron_topology_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_topology_replacements')`'dnl
+m4_popdef(`m4_this_ppl_objects')`'dnl
+m4_popdef(`m4_this_topology')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_comparison_replacements',
+ `geometrically_covers, geometrically_equals')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements',
+ `geometrically covers, geometrically equals')`'dnl
+m4_patsubst(`m4_ci_pps_class_code(2)', |COMMA|, `,')`'dnl
+')`'dnl
+m4_divert(-1)
+
+dnl -----------------------------------------------------------------
+dnl CONFIGURATION DEPENDENT
+dnl -----------------------------------------------------------------
+
+dnl m4_all_classes_code(Class_Counter)
+dnl
+dnl Class_Counter - The index for the current class.
+dnl This iterates through the classes to define the documentation.
+dnl Note that at the end of this stage, commas are still to be substituted.
+m4_define(`m4_all_classes_doc', `dnl
+dnl
+dnl Check for class counter in range. If so, generate the documentation
+dnl for the current class. If not finish.
+m4_ifdef(m4_interface_class`'$1, `dnl
+dnl
+dnl First some temporary definitions.
+m4_define(`m4_this_interface_class', m4_interface_class`'$1)`'dnl
+m4_pushdef(`m4_a_class_replacement', `dnl
+m4_PPL_domain2text(m4_this_interface_class)')
+m4_pushdef(`m4_this_topology', `')`'dnl
+m4_pushdef(`m4_this_ppl_group', m4_class_group`'$1)`'dnl
+m4_pushdef(`m4_this_ppl_kind', m4_class_kind`'$1)`'dnl
+m4_pushdef(`m4_this_ppl_disjunct_kind', m4_class_body_kind`'$1)`'dnl
+m4_define(`m4_disjunct_topology', `dnl
+m4_upcase(m4_get_class_topology(m4_cplusplus_class_body$1))')`'dnl
+m4_pushdef(`m4_this_ppl_one_object', `dnl
+m4_PPL_domain2text(m4_this_ppl_kind)')
+m4_pushdef(`m4_this_ppl_objects', `dnl
+m4_ifelse(m4_this_ppl_group, box,
+ m4_plural(m4_PPL_domain2text(m4_this_interface_class)),
+ m4_this_ppl_group, pointset_powerset,
+ pointset powersets of m4_plural(m4_PPL_domain2text(m4_disjunct_topology m4_this_ppl_disjunct_kind)),
+ m4_plural(m4_PPL_domain2text(m4_this_ppl_kind)))')`'dnl
+dnl
+dnl Generate documentation for current class.
+m4_one_simple_class_code($1)`'dnl
+m4_ifelse(m4_this_ppl_group,
+ pointset_powerset, `m4_iter_pps_categories($1)')`'dnl
+dnl
+dnl Remove temporary definition.
+m4_popdef(`m4_this_ppl_objects')`'dnl
+m4_popdef(`m4_this_topology')`'dnl
+m4_popdef(`m4_this_ppl_group')`'dnl
+m4_popdef(`m4_this_ppl_kind')`'dnl
+m4_popdef(`m4_this_ppl_disjunct_kind')`'dnl
+m4_popdef(`m4_disjunct_topology')`'dnl
+dnl
+dnl Increment class counter and repeat.
+m4_all_classes_doc(m4_incr($1))')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate all documentation for all the classes
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_ifdef(`m4_prolog_ci_documentation', `',
+ `m4_patsubst(`m4_all_classes_doc(1)', |COMMA|, `,')`'dnl
+')`'dnl
+m4_divert(-1)
+
+m4_divert`'dnl
+*/ /* \page configured_domains_predicates */
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
new file mode 100644
index 0000000..fdc7c4b
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
@@ -0,0 +1,1191 @@
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating Prolog_interface.dox
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl category and subcategory headers and descriptions
+
+dnl -----------------------------------------------------------------
+dnl *** The constructor, copy, convert and destructor predicates. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_constr_destr', `dnl
+<H2>Constructor, copy, conversion and destructor predicates</H2>
+m4_pushdef(`m4_topology_a_replacements', `')`'dnl
+m4_pushdef(`m4_Polyhedron_a_topology_replacements', `C , NNC ')`'dnl
+')
+
+m4_define(`m4_finalize_category_constr_destr', `dnl
+m4_popdef(`m4_a_topology_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_topology_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl The constructor predicates.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_build', `dnl
+<H3>Constructor predicates for m4_this_topology m4_this_ppl_objects</H3>
+The constructor predicates build a
+m4_this_topology m4_this_ppl_one_object from a specification
+and binds the given variable to a handle for future referencing.
+The specification can be:
+- the number of space dimensions and an atom indicating if it
+ is to be the universe or empty element.
+- a representation for the particular class of semantic geometric
+ descriptors to which the element being built belongs.
+m4_ifelse(m4_this_interface_class, Polyhedron,
+ `For example`,'
+ a C Polyhedron can be built from a list of
+ non-strict inequality or equality constraints or a list of equality
+ congruences or a list of generators that contains no closure points.')
+')
+
+dnl -----------------------------------------------------------------
+dnl The copy and conversion constructor predicates.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_convert', `dnl
+<H3>Predicates that build new m4_this_topology m4_this_ppl_objects
+ by copying or converting from
+ other semantic geometric descriptions</H3>
+ Besides the constructors listed above, the library also
+ provides:
+- copy constructors that will copy an element belonging
+ to the same class of semantic geometric descriptions
+- conversion operators that build a new semantic geometric
+ description starting from a \b friend;
+ that is`,' a semantic geometric description in different class
+m4_ifelse(m4_this_interface_class, Polyhedron, `dnl
+ (e.g.`,' ppl_new_Grid_from_C_Polyhedron`,'
+ ppl_new_C_Polyhedron_from_BD_Shape_mpq_class`,' etc.)').<BR>
+
+ The copy and conversion predicates have two versions,
+ one with arity 2 for the source and target handles and one
+ with an extra argument denoting the maximum complexity to be used
+ in the conversion;
+ this complexity argument is ignored when the
+ the friend and the element being built are in the same class.
+')
+
+dnl -----------------------------------------------------------------
+dnl The destructor predicate
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_destruct', `dnl
+<H3>Destructor predicate</H3>
+Below is the destructor predicate for the m4_this_interface_class domain.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Predicates that do not modify the polyhedron. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_const', `dnl
+<H2>Predicates that do not change the m4_this_ppl_one_object</H2>
+m4_pushdef(`m4_a_has_property_replacements', `dnl
+ is empty, is the universe, is bounded, contains an integer point,
+ is topologically closed, is discrete')`'dnl
+m4_pushdef(`m4_product_a_has_property_replacements', `dnl
+ is empty, is the universe, is bounded,
+ is topologically closed, is discrete')`'dnl
+m4_pushdef(`m4_a_comparison_replacements', `dnl
+ is included in or equal to, is included in but not equal to,
+ is disjoint from')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements', `dnl
+ m4_a_comparison_replacements,
+ geometrically covers, geometrically equals')`'dnl
+m4_pushdef(`m4_maxmin_replacements', `max, min')`'dnl
+m4_pushdef(`m4_a_maxmin_replacements', `above, below')`'dnl
+m4_pushdef(`m4_b_maxmin_replacements', `supremum, infinum')`'dnl
+m4_pushdef(`m4_maxmin_replacements', `max, min')`'dnl
+m4_pushdef(`m4_a_maxmin_replacements', `above, below')`'dnl
+m4_pushdef(`m4_b_maxmin_replacements', `supremum, infinum')`'dnl
+m4_pushdef(`m4_a_dimension_replacements', `dnl
+ dimension of the vector space enclosing, affine dimension of')`'dnl
+')
+
+m4_define(`m4_finalize_category_const', `dnl
+m4_popdef(`m4_has_a_property_replacements')`'dnl
+m4_popdef(`m4_product_a_has_property_replacements')`'dnl
+m4_popdef(`m4_a_comparison_replacements')`'dnl
+m4_popdef(`m4_Pointset_Powerset_a_comparison_replacements')`'dnl
+m4_popdef(`m4_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_maxmin_replacements')`'dnl
+m4_popdef(`m4_b_maxmin_replacements')`'dnl
+m4_popdef(`m4_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_maxmin_replacements')`'dnl
+m4_popdef(`m4_b_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_dimension_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that test a property
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_testpoly', `dnl
+<H3>Test Predicates</H3>
+These predicates test the m4_this_ppl_one_object for different properties
+and succeed or fail depending on the outcome.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that get information about the polyhedron.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_constpoly', `dnl
+<H3>Predicates that return information about the m4_this_ppl_one_object</H3>
+These predicates will obtain more detailed information about the
+m4_this_ppl_one_object
+unifying some of their arguments with the results.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicate that dumps.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_dump', `dnl
+<H3>Ascii dump predicate</H3>
+This output predicate is useful for debugging.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Space dimension preserving predicates that may modify the ***
+dnl *** polyhedron. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_nonconst', `dnl
+<H2>Space-dimension preserving predicates that may change
+ the m4_this_ppl_one_object</H2>
+These predicates may modify the m4_this_ppl_one_object referred to
+by the handle in first argument;
+the (dimension of the) vector space in which it is embedded is unchanged.
+m4_pushdef(`m4_binop_replacements', `dnl
+ intersection_assign, upper_bound_assign, difference_assign,
+ time_elapse_assign')`'dnl
+m4_pushdef(`m4_Polyhedron_binop_replacements', `dnl
+ m4_binop_replacements, poly_hull, poly_difference')`'dnl
+m4_pushdef(`m4_a_binop_replacements', `dnl
+ intersection, upper bound, difference, time elapse')`'dnl
+m4_pushdef(`m4_Polyhedron_a_binop_replacements', `dnl
+ m4_a_binop_replacements, poly-hull, poly-difference')`'dnl
+m4_pushdef(`m4_a_simplify_replacements', `topological closure')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_simplify_replacements', `dnl
+ topological closure, pairwise reduction, omega reduction')`'dnl
+')
+
+m4_define(`m4_finalize_category_nonconst', `dnl
+m4_popdef(`m4_binop_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_binop_replacements')`'dnl
+m4_popdef(`m4_a_binop_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_binop_replacements')`'dnl
+m4_popdef(`m4_a_simplify_replacements')`'dnl
+m4_popdef(`m4_Pointset_Powerset_a_simplify_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that may change the polyhedron by adding
+dnl to the polyhedron's constraint or generator descriptions.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_addto', `dnl
+<H3>Predicates that may change the m4_this_ppl_one_object by adding
+to its constraint or generator descriptions</H3>
+Note that there are two forms of these predicates
+differentiated in the names by the
+words "add" or "refine with";
+see Section \extref{Generic_Operations_on_Semantic_Geometric_Descriptors, Generic Operations on Semantic Geometric Descriptors} in the
+main \extref{preamble, PPL User Manual}
+for the differences in the semantics and therefore, the expected behavior,
+between these forms.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that transform a polyhedron.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_trans', `dnl
+<H3>Predicates that transform the m4_this_ppl_one_object</H3>
+These predicates enable transformations
+such as taking the topological closure (which for the domain of
+m4_this_topology m4_this_ppl_one_object is the identity transformation),
+unconstraining a specified dimension
+as explained in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Cylindrification, Cylindrification Operator}
+and several different image and preimage affine transfer relations;
+for details of the latter see Sections
+\extref{Images_and_Preimages_of_Affine_Transfer_Relations, Images and Preimages of Affine Transfer Relations}
+and
+\extref{Generalized_Affine_Relations, Generalized Affine Relations}')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that act as binary operators.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_binop', `dnl
+<H3>Predicates whose results depend on more than one m4_this_ppl_one_object</H3>
+These predicates include the binary operators which will assign to the
+m4_this_ppl_one_object referred to by the first argument
+its combination with the m4_this_ppl_one_object referred to by the second argument
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Intersection_and_Convex_Polyhedral_Hull, Intersection and Convex Polyhedral Hull}
+and
+\extref{Convex_Polyhedral_Difference, Convex Polyhedral Difference};
+and a linear partitioning operator described below.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for widening and extrapolation.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_widen', `dnl
+<H3>Predicates for widening and extrapolation</H3>
+In addition to the above binary operators, there are also a number
+of widening, extrapolation and narrowing operators
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Widening_Operators, Widening Operators},
+\extref{Widening_with_Tokens, Widening with Tokens} and
+\extref{Extrapolation_Operators, Extrapolation Operators}.
+Note that for all these widening and extrapolation predicates
+to behave as specified
+the m4_this_ppl_one_object referred to by the second argument has to be
+contained in (or equal to) the m4_this_ppl_one_object referred to by the first argument.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Predicates that may modify the dimension of the vector space. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_varspace', `dnl
+<H2>Predicates that may modify the vector space</H2>
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+')
+
+m4_define(`m4_finalize_category_varspace', `dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Concatenate predicate
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_concat', `dnl
+<H3>Predicate for concatenation</H3>
+For more information on this operation, see Section
+\extref{Concatenating_Polyhedra, Concatenating Polyhedra},
+of the main \extref{preamble, PPL User Manual}.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for mapping or changing the space dimensions
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_spacemod', `dnl
+<H3>Predicates for mapping dimensions or changing the vector space</H3>
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Adding_New_Dimensions_to_the_Vector_Space, Adding New Dimensions to the Vector Space},
+\extref{Removing_Dimensions_from_the_Vector_Space, Removing Dimensions from the Vector Space},
+\extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space},
+\extref{expand_space_dimension, Expanding One Dimension of the Vector Space to Multiple Dimensions}
+and
+\extref{Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension, Folding Multiple Dimensions of the Vector Space into One Dimension}.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Pointset powerset domains. ***
+dnl Note that this is only used for the configure independent manual.
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_pps', `dnl
+<H2>Extra Predicates Specifically for the Pointset Powerset Domains</H2>
+ The powerset domains can be instantiated by taking as a base domain
+ any fixed semantic geometric description
+ (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+ An element of the powerset domain represents a disjunctive collection
+ of base objects (its disjuncts), all having the same space dimension.
+ For more information on this construct,
+ see Section \extref{The_Powerset_Domain, The Powerset Domain}
+ in the main \extref{preamble, PPL User Manual}.
+
+ Besides the predicates that are available in all semantic geometric
+ descriptions (whose documentation is not repeated here),
+ the powerset domain also provides several ad hoc predicates.
+ These are specified below, instantiated for the
+ PPL domain Pointset_Powerset_C_Polyhedron.
+ Note that predicates for other pointset powerset domains
+ will follow similar patterns.
+')
+
+m4_define(`m4_finalize_category_pps', `dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for pointset powerset iterators and disjuncts.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_pps_iter', `dnl
+ <H3>Predicates for pointset powerset iterators and disjuncts.</H3>
+Iterators allow the user to examine and change individual elements
+(called here disjuncts) of a pointset powerset.
+Detailed descriptions for adding and removing disjuncts can be found in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Adding_a_Disjunct, Adding a Disjunct}.
+The following predicates support useful operations
+on these iterators and disjuncts via the usual handles.
+m4_pushdef(`m4_Pointset_Powerset_a_beginend_replacements',
+ `beginning, end')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Other ad hoc predicates for the pointset_powerset domains.
+dnl Note that these are only used for the configure independent manual.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_pps_other', `dnl
+ <H3>Other Ad Hoc Predicates for the pointset powerset domains.</H3>
+Collected here are some other predicates that are specific to
+pointset powersets of C polyhedra;
+these provide operations for
+simplifying the powerset,
+geometric comparisons
+and widening and extrapolation.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Geometric_Comparisons, Geometric Comparisons},
+\extref{Certificate_Based_Widenings, Certificate-Based Widenings},
+\extref{Powerset_Extrapolation_Operators, Powerset Extrapolation Operators}.
+')
+
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the build predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_build_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+ <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \f$\cP\f$
+ with \c Dimension_Type dimensions; it is empty
+ or the universe depending on whether \c Atom
+ is \c empty or \c universe|COMMA| respectively.
+ \c Handle is unified with the handle for \f$\cP\f$.
+ Thus the query
+\code
+ ?- ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3|COMMA| universe|COMMA| X).
+\endcode
+ creates the @A_TOPOLOGY@`'m4_this_ppl_one_object defining the
+ 3-dimensional vector space
+ \f$\Rset^3\f$ with \c X bound to a valid handle for accessing it.</EM>
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_build_doc',
+`dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(+@!BUILD_REPRESENT at _System, -Handle)</CODE><BR>
+ <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P from
+ \c @!BUILD_REPRESENT at _System.
+ \c Handle is unified with the handle for \p P.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the convert predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _convert_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(+Handle_1, -Handle_2)</CODE><BR>
+ <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P_1 from
+ the @!A_FRIEND@ referenced by handle \c Handle_1.
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_convert_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+ <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P_1 from
+ the @!A_FRIEND@ referenced by handle \c Handle_1
+ using an algorithm whose complexity does not exceed \c Complexity;
+ \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the desctructor;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_delete_ at CLASS@_destruct_doc',
+`dnl
+<P><CODE>ppl_delete_ at CLASS@(+Handle)</CODE><BR>
+ <EM>Invalidates the handle referenced by \c Handle:
+ this makes sure the corresponding resources will eventually be released.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the simple test predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at HAS_PROPERTY@(+Handle)</CODE><BR>
+ <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+ \c Handle @A_HAS_PROPERTY at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(+Handle, +Lin_Expr)</CODE><BR>
+ <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from @ABOVEBELOW@
+ in the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+ <CODE>Handle_2</CODE> @A_COMPARISON@
+ the m4_this_ppl_one_object referenced by <CODE>Handle_1</CODE>.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_equals_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+ <CODE>Handle_1</CODE> is
+ equal to the m4_this_ppl_one_object referenced by <CODE>Handle_2</CODE>.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_constrains(+Handle, +PPL_Var)</CODE><BR>
+ <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+ \c Handle constrains the dimension \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_OK(+Handle)</CODE><BR>
+ <EM>Succeeds only if the m4_this_ppl_one_object referenced by
+ \c Handle is well formed|COMMA| i.e.|COMMA| if it
+ satisfies all its implementation invariants.
+ Useful for debugging purposes.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the "get information" predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_has_ at UPPERLOWER@_bound(+Handle, +Var, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if \c Var is @UPPERLOWER@ bounded in
+ m4_this_ppl_one_object \p P referenced by \c Handle. It is assumed
+ that \p P is not empty and its space dimension is greater than or equal
+ to that of \c Var|COMMA| otherwise the behavior is undefined.
+
+ \c Coeff_1 is unified with the numerator of the @UPPERLOWER@ bound
+ and \c Coeff_2 with the denominator of the @UPPERLOWER@ bound.
+ If the @UPPERLOWER@ is included in \p P|COMMA| then \c Boolean is unified
+ with the atom \c true and|COMMA| otherwise|COMMA| unified with
+ the atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at MAXMIN@imize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if m4_this_ppl_one_object \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from @A_MAXMIN@ in \p P.
+
+ \c Coeff_1 is unified with the numerator of the @B_MAXMIN@ value
+ and \c Coeff_2 with the denominator of the @B_MAXMIN@ value.
+ If the @B_MAXMIN@ is also the @MAXMIN at imum|COMMA| \c Boolean is unified
+ with the atom \c true and|COMMA| otherwise|COMMA| unified with
+ the atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at MAXMIN@imize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+ <EM>Succeeds if and only if m4_this_ppl_one_object \p P referenced by \c Handle
+ is not empty and \c Lin_Expr is bounded from @A_MAXMIN@ in \p P.
+
+ \c Coeff_1 is unified with the numerator of the @B_MAXMIN@ value
+ and \c Coeff_2 with the denominator of the @B_MAXMIN@ value
+ and \c Point with a point or closure point where \c Lin_Expr reaches
+ this value.
+ If the @B_MAXMIN@ is also the @MAXMIN at imum|COMMA| \c Boolean is unified
+ with the atom \c true and|COMMA| otherwise|COMMA| unified with the
+ atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at DIMENSION@(+Handle, ?Dimension_Type)</CODE><BR>
+ <EM>Unifies \c Dimension_Type with the @A_DIMENSION@
+ the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(+Handle, +@!RELATION_REPRESENT@, ?Relation_List)</CODE><BR>
+ <EM>Unifies \c Relation_List with the list of relations the
+ m4_this_ppl_one_object referenced by \c Handle has with \c @!RELATION_REPRESENT at .
+ The possible relations are listed in the
+ grammar rules above.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_constpoly_doc',
+`dnl
+m4_pushdef(`m4_b_class_represent_replacements', `satisfied by, satisfied by')
+m4_pushdef(`m4_Polyhedron_b_class_represent_replacements',
+ `satisfied by, satisfied by, for')
+m4_pushdef(`m4_Grid_b_class_represent_replacements',
+ `satisfied by, satisfied by, for')
+<P><CODE>ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT at _System)</CODE><BR>
+ <EM>Unifies \c @!CLASS_REPRESENT at _System with
+ the @CLASS_REPRESENT at s (in the form of a list) in the @CLASS_REPRESENT@ system
+ @B_CLASS_REPRESENT@ the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_constpoly_doc',
+`dnl
+m4_pushdef(`m4_Polyhedron_b_class_represent_replacements',
+ `satisfied by, for, satisfied by')
+<P><CODE>ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT at _System)</CODE><BR>
+ <EM>Unifies \c @!CLASS_REPRESENT at _System with
+ the @CLASS_REPRESENT at s (in the form of a list)
+ in the minimized @CLASS_REPRESENT@ system
+ @B_CLASS_REPRESENT@ the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_constpoly_doc',
+ `dnl
+m4_pushdef(`m4_a_membytes_replacements', `total, external')
+<P><CODE>ppl_ at CLASS@_ at MEMBYTES@(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the @A_MEMBYTES@ memory in
+bytes occupied by the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the ascii dump;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ascii_dump_dump_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ascii_dump(+Handle)</CODE><BR>
+ <EM>Dumps an ascii representation of the PPL internal state for
+ the m4_this_ppl_one_object referenced by \c Handle on the standard output.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the "add to" predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_addto_doc',
+`dnl
+m4_popdef(`m4_a_class_represent_replacements')`'dnl
+m4_pushdef(`m4_a_class_represent_replacements',
+ `an equality or a non-strict inequality,
+ an equality, a line|COMMA| ray or point')`'dnl
+<P><CODE>ppl_ at CLASS@_add_ at CLASS_REPRESENT@(+Handle, +@!CLASS_REPRESENT@)</CODE><BR>
+ <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+ one obtained by adding
+ \c @!CLASS_REPRESENT@ to its @CLASS_REPRESENT@ system.
+ For a C polyhedron|COMMA| \c @!CLASS_REPRESENT@ must be
+ @A_CLASS_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_addto_doc',
+`dnl
+m4_popdef(`m4_a_class_represent_replacements')`'dnl
+m4_pushdef(`m4_a_class_represent_replacements',
+ `equalities and non-strict inequalities,
+ equalities, lines|COMMA| rays and points')`'dnl
+<P><CODE>ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(
+ +Handle,
+ +@!CLASS_REPRESENT at _System)</CODE><BR>
+ <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+ one obtained by adding to its @CLASS_REPRESENT@ system the @CLASS_REPRESENT at s in
+ \c @!CLASS_REPRESENT at _System.
+ For a C polyhedron|COMMA| \c @!CLASS_REPRESENT at s must be a list of
+ @A_CLASS_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_addto_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(
+ +Handle,
+ +@!REFINE_REPRESENT@)</CODE><BR>
+ <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+ one obtained by refining its @REFINE_REPRESENT@ system with
+ \c @!REFINE_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_addto_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(
+ +Handle,
+ +@!REFINE_REPRESENT at _System)</CODE><BR>
+ <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+ one obtained by refining its @REFINE_REPRESENT@ system with
+ the @REFINE_REPRESENT at s in \c @!REFINE_REPRESENT at _System.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the binary operator predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at BINOP@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P referenced by \c Handle_1
+ the @A_BINOP@ of \p P and the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at UB_EXACT@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if the least upper bound of the
+ m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ with the m4_this_ppl_one_object referenced by \c Handle_2 is exact;
+ in which case the least upper bound is assigned
+ to \p P_1;
+ fails otherwise.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_binop_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_linear_ at PARTITION@(+Handle_1, +Handle_2, -Handle_3,
+ -Handle_4)</CODE><BR>
+ <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+ in the @CLASS@ domain. The predicate unifies handle
+ \c Handle_3 to a reference to the intersection of
+ \p P_1 and \p P_2 and \c Handle_4 to a reference to
+ a pointset powerset of nnc polyhedra \p P_4;
+ where \p P_4 is the linear partition of \p P_1 with respect to \p P_2.
+ This predicate is only provided if the
+ class \c Pointset_Powerset_NNC_Polyhedron
+ has been enabled when configuring the library.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_binop_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_approximate_ at PARTITION@(+Handle_1, +Handle_2, ?Boolean,
+ -Handle_3, -Handle_4)</CODE><BR>
+ <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+ in the @CLASS@ domain. The predicate unifies handle
+ \c Handle_3 to a reference to the intersection of
+ \p P_1 and \p P_2 and \c Handle_4 to a reference to
+ a pointset powerset of grids \p P_4 where:<BR>
+ if there is a finite linear partition of \p P_1 wrt \p P_2
+ \c Boolean is unified with the atom \c true and
+ \p P_4 is the linear partition;<BR>
+ otherwise \c Boolean is unified with the atom \c false
+ and \p P_4 is set to the singleton set that contains \p P_2.<BR>
+ This predicate is only provided if the
+ class \c Pointset_Powerset_Grid
+ has been enabled when configuring the library.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+ <EM>Succeeds if and only if the intersection of m4_this_ppl_one_object \p P_1
+ referenced by \c Handle_1 and the m4_this_ppl_one_object \p P_2 referenced by \c Handle_2
+ is non-empty.
+ Assigns to \p P_1 its meet-preserving simplification with
+ respect to \p P_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the widen and extrapolation predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<EM>Same as predicate `'dnl
+m4_ifelse(
+ m4_this_interface_class, Polyhedron,
+ <CODE>ppl_ at CLASS@_H79_widening_assign_with_tokens</CODE>/4,
+ m4_this_interface_class, Grid,
+ <CODE>ppl_ at CLASS@_congruence_widening_assign_with_tokens</CODE>/4,
+ m4_this_ppl_group, box,
+ <CODE>ppl_ at CLASS@_CC76_widening_assign_with_tokens</CODE>/4,
+ m4_this_ppl_group, wr_shape,
+ <CODE>ppl_ at CLASS@_H79_widening_assign_with_tokens</CODE>/4)</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<EM>Same as predicate `'dnl
+m4_ifelse(
+ m4_this_interface_class, Polyhedron,
+ <CODE>ppl_ at CLASS@_H79_widening_assign</CODE>/2,
+ m4_this_interface_class, Grid,
+ <CODE>ppl_ at CLASS@_congruence_widening_assign</CODE>/2,
+ m4_this_ppl_group, box,
+ <CODE>ppl_ at CLASS@_CC76_widening_assign</CODE>/2,
+ m4_this_ppl_group, wr_shape,
+ <CODE>ppl_ at CLASS@_H79_widening_assign</CODE>/2)</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ the @WIDEN at -widening of \p P_1 with the m4_this_ppl_one_object
+ referenced by \c Handle_2.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ the @WIDEN at -widening of \p P_1 with the m4_this_ppl_one_object
+ referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_widen_doc',
+`dnl
+m4_pushdef(`m4_a_limitedbounded_replacements', `,
+ |COMMA| further intersected with the smallest box containing \\p P_1')
+<P><CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ the @WIDENEXPN at -widening of \p P_1 with the m4_this_ppl_one_object
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1 at A_LIMITEDBOUNDED@.
+ The widening with tokens delay
+ technique is applied with \c C_unsigned_1 tokens;
+ \c C_unsigned_2 is unified with the number of tokens
+ remaining at the end of the operation.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_widen_doc',
+`dnl
+m4_pushdef(`m4_a_limitedbounded_replacements', `,
+ |COMMA| further intersected with the smallest box containing \\p P_1')
+<P><CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ the @WIDENEXPN at -widening of \p P_1 with the m4_this_ppl_one_object
+ referenced by \c Handle_2 intersected with the constraints in
+ \c Constraint_System that are
+ satisfied by all the points of \p P_1 at A_LIMITEDBOUNDED@.</EM>
+
+')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+ the @EXTRAPOLATION at -narrowing of \p P_1 and the m4_this_ppl_one_object
+ referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the \extref{pps_certificate_widening|COMMA| BHZ03-widening}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2|COMMA| using the @DISJUNCT_WIDEN at -widening
+ certified by the convergence certificate for @A_DISJUNCT_WIDEN at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+ <EM>Assigns to the pointset powerset \p P_1 referenced by
+ \c Handle_1 the result of applying the
+ \extref{pps_bgp99_extrapolation|COMMA| BGP99 extrapolation operator}
+ between \p P_1 and the pointset powerset referenced by
+ \c Handle_2|COMMA| using the @DISJUNCT_WIDEN at -widening
+ and the cardinality threshold \c C_unsigned.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the transform predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_swap_build_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_swap(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Swaps the m4_this_ppl_one_object referenced by \c Handle_1
+ with the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at SIMPLIFY@(+Handle)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object referenced by \c Handle
+ its @A_SIMPLIFY at .</EM>
+
+')
+
+m4_define(`m4_a_affimage_replacements',
+ `image, preimage')
+m4_define(`m4_b_affimage_replacements',
+ `assigning the affine, substituting the affine')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_trans_doc',
+`dnl
+m4_define(`m4_a_affimage_replacements',
+ `image, preimage')`'dnl
+m4_define(`m4_b_affimage_replacements',
+ `assigning the affine, substituting the affine')`'dnl
+<P><CODE>ppl_ at CLASS@_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Transforms the m4_this_ppl_one_object referenced by \c Handle
+ @B_AFFIMAGE@ expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_bounded_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+ <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+ the generalized @A_AFFIMAGE@ with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1/Coeff
+ \f$\leq\f$ \c PPL_Var
+ \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+ <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+ the generalized @A_AFFIMAGE@ with respect to the
+ generalized affine transfer relation
+ \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff|COMMA|
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+ <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+ the generalized @A_AFFIMAGE@ with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2|COMMA|
+ where \f$\bowtie\f$ is the symbol
+ represented by \c Relation_Symbol.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_trans_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff_1, +Coeff_2)</CODE><BR>
+ <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+ the generalized @A_AFFIMAGE@ with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1 \f$\equiv_f\f$ \c Lin_Expr_2/\c Coeff_1|COMMA|
+ where \c Coeff_2 is bound to the modulus \p f.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coeff)</CODE><BR>
+ <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+ the generalized @A_AFFIMAGE@ with respect to the
+ generalized affine transfer relation
+ \c Lin_Expr_1 \f$\equiv_f\f$ \c Lin_Expr_2.
+ where \c Coeff is bound to the modulus \p f.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+ <EM>Modifies the m4_this_ppl_one_object \p P referenced by \c Handle by unconstraining
+ the space dimension \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+ <EM>Modifies the m4_this_ppl_one_object \p P referenced by \c Handle by unconstraining
+ the space dimensions that are specified in \c List_of_PPL_Var.
+ The presence of duplicates in \c List_of_PPL_Var is a waste
+ but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_wrap_assign(+Handle, +List_of_PPL_Var, +Width, +Representation, +Overflow, +Constraint_System, +C_unsigned, +Boolean)</CODE><BR>
+ <EM>Transforms the m4_this_ppl_one_object \p P referenced by
+ <CODE>Handle</CODE> by wrapping the dimensions given by
+ <CODE>List_of_PPL_Vars</CODE> while respecting the specified
+ <CODE>Width</CODE>|COMMA| <CODE>Representation</CODE> and
+ <CODE>Overflow</CODE> behavior of all these variables. The
+ <CODE>Constraint_System</CODE> represents the conditional or
+ looping construct guard with respect to which wrapping is
+ performed. The non-negative integer <CODE>C_unsigned</CODE> and
+ <CODE>Boolean</CODE> allow control of the complexity/precision
+ ratio; higher values for <CODE>C_unsigned</CODE> will lead to
+ possibly greater precision while a true value for
+ <CODE>Boolean</CODE> indicates that the space dimensions should be
+ wrapped individually. See Section \extref{Wrapping_Operator|COMMA|
+ Wrapping Operator} for a more detailed description of this
+ operator.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the concatenation predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_concat_doc',
+`dnl
+m4_popdef(`m4_binop_replacements')
+m4_popdef(`m4_Polyhedron_binop_replacements')
+m4_popdef(`m4_a_binop_replacements')
+m4_popdef(`m4_Polyhedron_a_binop_replacements')
+m4_pushdef(`m4_binop_replacements', `concatenate_assign')
+m4_pushdef(`m4_Polyhedron_binop_replacements', `concatenate_assign')
+m4_pushdef(`m4_a_binop_replacements', `concatenation')
+m4_pushdef(`m4_Polyhedron_a_binop_replacements', `concatenation')
+ <P><CODE>ppl_ at CLASS@_ at BINOP@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Assigns to the m4_this_ppl_one_object \p P referenced by \c Handle_1
+ the @A_BINOP@ of \p P and the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the space changing predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(+Handle, +Dimension_Type)</CODE><BR>
+ <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+ the m4_this_ppl_one_object \p P referenced by \c Handle
+ and @EMBEDPROJECT at s \p P in this space.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+ <EM>Removes from the vector space enclosing
+ the m4_this_ppl_one_object \p P referenced by \c Handle the space dimensions that
+ are specified in \c List_of_PPL_Var. The presence
+ of duplicates in \c List_of_PPL_Var is a waste but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+ <EM>Removes the higher dimensions from the vector space enclosing
+ the m4_this_ppl_one_object \p P referenced by \c Handle
+ so that|COMMA| upon successful return|COMMA| the new space dimension is
+ \c Dimension_Type.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+ <EM>Expands the \c PPL_Var-th
+ dimension of the vector space enclosing
+ the m4_this_ppl_one_object referenced by \c Handle to
+ \c Dimension_Type new space dimensions.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+ <EM>Modifies the m4_this_ppl_one_object referenced by \c Handle
+ by folding the
+ space dimensions contained in \c List_of_PPL_Vars
+ into dimension \c PPL_Var.
+ The presence of duplicates in \c List_of_PPL_Vars is a waste
+ but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+ <EM>Remaps the dimensions of the vector space according to a
+ partial function.
+ This function is specified by means of the \c P_Func|COMMA|
+ which has \p n entries.
+ The result is undefined if \c P_Func does not encode a partial
+ function.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the powerset predicates involving
+dnl iterators and disjuncts;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_pps_iter_doc',
+`dnl
+<P><CODE>ppl_new_ at CLASS@_iterator_from_iterator(+Iterator_1, -Iterator_2)</CODE><BR>
+ <EM>Builds a new iterator \p it from the iterator referenced by
+ \c Iterator_1. <CODE>Iterator_2</CODE> is unified with the handle
+ for \p it.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_pps_other_doc',
+`dnl
+m4_pushdef(`m4_Pointset_Powerset_simplify_replacements',
+ `pairwise_reduce, omega_reduce')
+m4_pushdef(`m4_Pointset_Powerset_a_simplify_replacements',
+ `pairwise reduction, omega reduction')
+<P><CODE>ppl_ at CLASS@_ at SIMPLIFY@(+Handle)</CODE><BR>
+ <EM>Assigns the result of @A_SIMPLIFY@ on
+ the pointset powerset referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+ <EM>Succeeds if and only if the iterator referenced by
+ \c Iterator_1 is equal to the iterator referenced by
+ \c Iterator_2.</EM>
+
+')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ at BEGINEND@_iterator(+Handle, -Iterator)</CODE><BR>
+ <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+ to the @A_BEGINEND@ of
+ the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_delete_ at CLASS@_iterator(+Iterator)</CODE><BR>
+ <EM>Invalidates the handle referenced by <CODE>Iterator</CODE>:
+ this makes sure the corresponding resources
+ will eventually be released.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_pps_iter_doc',
+ `dnl
+m4_pushdef(`m4_Pointset_Powerset_a_incdec_replacements',
+ `next, previous')
+<P><CODE>ppl_ at CLASS@_iterator_ at INCDEC@(+Iterator)</CODE><BR>
+ <EM>@!INCDEC at s the iterator referenced by \c Iterator
+ so that it "points" to the @A_INCDEC@ disjunct.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_iterator_get_disjunct(+Iterator, -Handle)</CODE><BR>
+ <EM>Unifies with \c Handle a reference to the disjunct referred
+ to by \c Iterator_1.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+ <EM>If \p it is the iterator referred to by \c Iterator|COMMA|
+ drops from the pointset powerset referenced by \c Handle
+ the disjunct pointed to by \p it and
+ assigns to \p it an iterator to the next disjunct.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)</CODE><BR>
+ <EM>If \p it_1 and \p it_2 are the iterators referred to by \c Iterator_1
+ and \c Iterator_2|COMMA| respectively|COMMA|
+ drops from the pointset powerset referenced by \c Handle
+ all the disjuncts from \p it_1 to \p it_2 (excluded).</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Adds to the pointset powerset referenced by \c Handle_1 a disjunct
+ referred to by \c Handle_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for _other_ ad hoc powerset predicates;
+dnl Note: this is only needed for the configure independent manual.
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_pps_other_doc',
+`dnl
+m4_pushdef(`m4_Pointset_Powerset_comparison_replacements',
+ `geometrically_covers, geometrically_equals')
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements',
+ `geometrically covers, geometrically equals')
+<P><CODE>ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+ <EM>Succeeds if and only if the pointset powerset referenced by
+ \c Handle_2 @A_COMPARISON@
+ the pointset powerset referenced by \c Handle_1;
+ see Section \extref{Geometric_Comparisons|COMMA| Geometric Comparisons}
+ in the main \extref{preamble|COMMA| PPL User Manual}.</EM>
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
new file mode 100644
index 0000000..054ac33
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
@@ -0,0 +1,631 @@
+dnl -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating the
+dnl files ppl_prolog_DOMAIN.hh for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_linear_ at PARTITION@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_qh,
+ Prolog_term_ref t_inters,
+ Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+ Prolog_term_ref t_uoe,
+ Prolog_term_ref t_ph);
+
+')
+
+ m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(
+ Prolog_term_ref t_ph_source, Prolog_term_ref t_ph);
+
+')
+
+ m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+ Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph,
+ Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+ Prolog_term_ref t_ph);
+')
+
+ m4_define(`ppl_ at CLASS@_swap_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_delete_ at CLASS@(Prolog_term_ref t_ph);
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd);
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at CLASS@_iterator_from_iterator(Prolog_term_ref t_source,
+ Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_delete_ at CLASS@_iterator(Prolog_term_ref t_it);
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+ Prolog_term_ref t_it2);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+ Prolog_term_ref t_disj);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_disjuncts(Prolog_term_ref t_pps,
+ Prolog_term_ref t_it1,
+ Prolog_term_ref t_it2);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+ `dnl
+ extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_approximate_ at PARTITION@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_qh,
+ Prolog_term_ref t_finite,
+ Prolog_term_ref t_inters,
+ Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_c,
+ Prolog_term_ref t_r);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+ Prolog_term_ref t_expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_has_ at UPPERLOWER@_bound(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_closed);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_maxmin);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at MAXMIN@_with_point(Prolog_term_ref t_ph,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d,
+ Prolog_term_ref t_maxmin,
+ Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_OK(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at BINOP@
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_positive_time_elapse_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_simplify_using_context_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at UB_EXACT@
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+ Prolog_term_ref t_d, Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+ Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+ Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at WIDEN@_widening_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_widening_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_widening_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+ Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+ Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+ Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+ (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+ (Prolog_term_ref t_ph, Prolog_term_ref t_nnd);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_remove_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_remove_higher_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_expand_space_dimension
+ (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_fold_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_map_space_dimensions
+ (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_some_non_integer_points
+ (Prolog_term_ref t_ph, Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_drop_some_non_integer_points_2
+ (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ascii_dump
+ (Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+ Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after);
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+ (Prolog_term_ref t_pset,
+ Prolog_term_ref t_ph_decreasing,
+ Prolog_term_ref t_ph_bounded);
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+ (Prolog_term_ref t_pset_before,
+ Prolog_term_ref t_pset_after,
+ Prolog_term_ref t_ph_decreasing,
+ Prolog_term_ref t_ph_bounded);
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_wrap_assign
+ (Prolog_term_ref t_ph,
+ Prolog_term_ref t_vars,
+ Prolog_term_ref t_w,
+ Prolog_term_ref t_r,
+ Prolog_term_ref t_o,
+ Prolog_term_ref t_cs,
+ Prolog_term_ref t_complexity,
+ Prolog_term_ref t_ind);
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+ `extern "C" Prolog_foreign_return_type
+ ppl_ at CLASS@_frequency(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_freqn, Prolog_term_ref t_freqd,
+ Prolog_term_ref t_valn, Prolog_term_ref t_vald);
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
new file mode 100644
index 0000000..2212ad8
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
@@ -0,0 +1,71 @@
+m4_divert(-1)
+m4_define(`dnl', `m4_dnl')
+
+dnl This m4 file is used to generate ppl_prolog_domains.hh
+dnl and files ppl_prolog_DOMAIN.hh, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_prolog_hh_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(ppl_interface_generator_prolog_hh_code.m4)
+m4_include(ppl_interface_generator_prolog_procedure_generators.m4)
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_domains.hh << ___END_OF_FILE___
+/* Prolog interface code: inclusion of all domain declarations.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+m4_divert(-1)
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_procedure_schema_debug', `m4_dumpdef($1`'_code)')
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_domains.hh << ___END_OF_FILE___
+`#'include "ppl_prolog_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_`'m4_current_interface.hh << ___END_OF_FILE___
+/* Prolog m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+m4_divert`'dnl
+
+`#'include "ppl_prolog_common_defs.hh"`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
new file mode 100644
index 0000000..ed54e60
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
@@ -0,0 +1,133 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of predicates
+dnl for the Prolog interfaces; this includes:
+dnl - the list in the imported file and any Prolog specific predicates;
+dnl ppl_interface_generator_common_procedure_generators.m4;
+dnl - the list of library predicates needed for the system dependent files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(ppl_interface_generator_common.m4)
+m4_include(ppl_interface_generator_common_dat.m4)
+m4_include(ppl_interface_generator_common_procedure_generators.m4)
+
+dnl Library predicate list.
+m4_define(`m4_library_predicate_list', `dnl
+ppl_version_major/1,
+ppl_version_minor/1,
+ppl_version_revision/1,
+ppl_version_beta/1,
+ppl_version/1,
+ppl_banner/1,
+ppl_max_space_dimension/1,
+ppl_Coefficient_bits/1,
+ppl_Coefficient_is_bounded/0,
+ppl_Coefficient_max/1,
+ppl_Coefficient_min/1,
+ppl_initialize/0 *nofail,
+ppl_finalize/0 *nofail,
+ppl_set_rounding_for_PPL/0 *nofail,
+ppl_restore_pre_PPL_rounding/0 *nofail,
+ppl_irrational_precision/1,
+ppl_set_irrational_precision/1,
+ppl_set_timeout_exception_atom/1 *nofail,
+ppl_timeout_exception_atom/1,
+ppl_set_timeout/1 *nofail,
+ppl_reset_timeout/0 *nofail,
+ppl_set_deterministic_timeout/2 *nofail,
+ppl_reset_deterministic_timeout/0 *nofail,
+ppl_new_MIP_Problem_from_space_dimension/2,
+ppl_new_MIP_Problem/5,
+ppl_new_MIP_Problem_from_MIP_Problem/2,
+ppl_MIP_Problem_swap/2 *nofail,
+ppl_delete_MIP_Problem/1 *nofail,
+ppl_MIP_Problem_space_dimension/2,
+ppl_MIP_Problem_integer_space_dimensions/2,
+ppl_MIP_Problem_constraints/2,
+ppl_MIP_Problem_objective_function/2,
+ppl_MIP_Problem_optimization_mode/2,
+ppl_MIP_Problem_clear/1,
+ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+ppl_MIP_Problem_add_constraint/2,
+ppl_MIP_Problem_add_constraints/2,
+ppl_MIP_Problem_set_objective_function/2,
+ppl_MIP_Problem_set_optimization_mode/2,
+ppl_MIP_Problem_set_control_parameter/2 *nofail,
+ppl_MIP_Problem_get_control_parameter/3,
+ppl_MIP_Problem_is_satisfiable/1,
+ppl_MIP_Problem_solve/2,
+ppl_MIP_Problem_feasible_point/2,
+ppl_MIP_Problem_optimizing_point/2,
+ppl_MIP_Problem_optimal_value/3,
+ppl_MIP_Problem_evaluate_objective_function/4,
+ppl_MIP_Problem_OK/1
+ppl_MIP_Problem_ascii_dump/1,
+ppl_new_PIP_Problem_from_space_dimension/2,
+ppl_new_PIP_Problem/4,
+ppl_new_PIP_Problem_from_PIP_Problem/2,
+ppl_PIP_Problem_swap/2 *nofail,
+ppl_delete_PIP_Problem/1 *nofail,
+ppl_PIP_Problem_space_dimension/2,
+ppl_PIP_Problem_parameter_space_dimensions/2,
+ppl_PIP_Problem_constraints/2,
+ppl_PIP_Problem_clear/1,
+ppl_PIP_Problem_add_space_dimensions_and_embed/3,
+ppl_PIP_Problem_add_to_parameter_space_dimensions/2,
+ppl_PIP_Problem_add_constraint/2,
+ppl_PIP_Problem_add_constraints/2,
+ppl_PIP_Problem_set_control_parameter/2 *nofail,
+ppl_PIP_Problem_get_control_parameter/3,
+ppl_PIP_Problem_has_big_parameter_dimension/2,
+ppl_PIP_Problem_set_big_parameter_dimension/2,
+ppl_PIP_Problem_is_satisfiable/1,
+ppl_PIP_Problem_solve/2,
+ppl_PIP_Problem_solution/2,
+ppl_PIP_Problem_optimizing_solution/2,
+ppl_PIP_Problem_OK/1,
+ppl_PIP_Problem_ascii_dump/1,
+ppl_PIP_Tree_Node_constraints/2,
+ppl_PIP_Tree_Node_is_solution/1,
+ppl_PIP_Tree_Node_is_decision/1,
+ppl_PIP_Tree_Node_is_bottom/1,
+ppl_PIP_Tree_Node_artificials/2,
+ppl_PIP_Tree_Node_OK/1,
+ppl_PIP_Tree_Node_parametric_values/3,
+ppl_PIP_Tree_Node_true_child/2,
+ppl_PIP_Tree_Node_false_child/2`'dnl
+')
+
+m4_define(`m4_procedure_list',
+ `m4_echo_unquoted(`m4_common_procedure_list',
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3 +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4 +simple,
+)
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
new file mode 100644
index 0000000..eb7476c
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
@@ -0,0 +1,79 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Prolog system-dependent code files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+dnl m4_separator(String)
+dnl
+dnl String is returned unless if it is empty, then use `,'
+m4_define(`m4_separator', `m4_ifelse($1, `', `,', `$1')')`'dnl
+dnl
+dnl m4_pattern_delimiter(String)
+dnl
+dnl For the system files we use the macro names
+dnl where the patterns have no delimiters
+dnl FIXME The `@' is temporary.
+dnl This needs to be replaced by the empty string `'
+dnl when the dat.m4 and code.m4 files are changed.
+m4_define(`m4_pattern_delimiter', `@')`'dnl
+dnl
+dnl m4_term_sequence(Number of Iterations, String to be Repeated)
+dnl
+dnl generates a sequence of strings with the option of
+dnl identifying each string uniquely and the option of
+dnl changing the separator from the default `,'.
+m4_define(`m4_term_sequence',
+ `m4_ifelse(`$1', 0, ,
+ `$2(1)`'m4_ifelse(`$1', 1, ,
+ `m4_forloop(`i', 2, `$1', `m4_separator(`$3') $2(i)')')')')
+
+dnl m4_library_names_to_code(Class_Kind,
+dnl Procedure_Name1, Procedure_Name2, ...)
+dnl
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_library_names_to_code', `dnl
+m4_ifelse($#, 0, ,$#, 1, ,$#, 2, m4_get_schematic_code($2, $1),
+ `dnl
+m4_get_schematic_code($2, $1)`'dnl
+m4_library_names_to_code(m4_incr($1), m4_shift(m4_shift($@)))`'dnl
+')`'dnl
+')
+
+dnl ppl_prolog_sys_code
+dnl
+dnl For each recognised class in the "classes" list,
+dnl takes main predicate input list and sends one line at a time to
+dnl a macro that adds extensions for the result of
+dnl a macro that sets the class and the schema(s).
+m4_define(`ppl_prolog_sys_code', `dnl
+m4_library_names_to_code(0, m4_library_predicate_list)`'dnl
+m4_all_code`'dnl
+')
diff --git a/interfaces/Prolog/ppl_prolog_common.cc b/interfaces/Prolog/ppl_prolog_common.cc
new file mode 100644
index 0000000..d0dc23f
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common.cc
@@ -0,0 +1,3115 @@
+/* Common part of the Prolog interfaces: variables and non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_prolog_common_defs.hh"
+#include <exception>
+#include <stdexcept>
+#include <sstream>
+#include <climits>
+#include <typeinfo>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+Allocation_Tracker::Allocation_Tracker() {
+}
+
+Allocation_Tracker::~Allocation_Tracker() {
+ Set::size_type n = s.size();
+ if (n > 0)
+ std::cerr
+ << "Interfaces::Prolog::Allocation_Tracker: "
+ << n << " object(s) leaked!"
+ << std::endl;
+}
+
+Allocation_Tracker allocation_tracker;
+
+#endif // PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+
+
+// For the out-of-memory exception.
+Prolog_atom out_of_memory_exception_atom;
+
+// For Prolog lists.
+Prolog_atom a_nil;
+
+// For variables.
+Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+Prolog_atom a_plus;
+Prolog_atom a_minus;
+Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+Prolog_atom a_slash;
+
+// For constraints.
+Prolog_atom a_less_than;
+Prolog_atom a_equal_less_than;
+Prolog_atom a_equal;
+Prolog_atom a_greater_than_equal;
+Prolog_atom a_greater_than;
+
+// For congruences.
+Prolog_atom a_is_congruent_to;
+Prolog_atom a_modulo;
+
+// For generators.
+Prolog_atom a_line;
+Prolog_atom a_ray;
+Prolog_atom a_point;
+Prolog_atom a_closure_point;
+
+// For grid_generators.
+Prolog_atom a_grid_line;
+Prolog_atom a_parameter;
+Prolog_atom a_grid_point;
+
+// For artificial_parameters.
+Prolog_atom a_divided_by;
+
+// For the relation between a polyhedron and a constraint.
+Prolog_atom a_is_disjoint;
+Prolog_atom a_strictly_intersects;
+Prolog_atom a_is_included;
+Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+Prolog_atom a_empty;
+
+// Denotes the universe polyhedron.
+Prolog_atom a_universe;
+
+// Denotes the maximization mode for optimization problems.
+Prolog_atom a_max;
+
+// Denotes the minimization mode for optimization problems.
+Prolog_atom a_min;
+
+// Denote possible widths of bounded integer types.
+Prolog_atom a_bits_8;
+Prolog_atom a_bits_16;
+Prolog_atom a_bits_32;
+Prolog_atom a_bits_64;
+Prolog_atom a_bits_128;
+
+// Denote possible representations of bounded integer types.
+Prolog_atom a_unsigned;
+Prolog_atom a_signed_2_complement;
+
+// Denote possible overflow behavior of bounded integer types.
+Prolog_atom a_overflow_wraps;
+Prolog_atom a_overflow_undefined;
+Prolog_atom a_overflow_impossible;
+
+// Denote possible outcomes of MIP and PIP problems solution attempts.
+Prolog_atom a_unfeasible;
+Prolog_atom a_unbounded;
+Prolog_atom a_optimized;
+
+// Denotes an open interval boundary.
+Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+Prolog_atom a_minf;
+Prolog_atom a_pinf;
+
+// Denote complexity classes.
+Prolog_atom a_polynomial;
+Prolog_atom a_simplex;
+Prolog_atom a_any;
+
+// Denote control_parameters.
+Prolog_atom a_pricing;
+Prolog_atom a_pricing_steepest_edge_float;
+Prolog_atom a_pricing_steepest_edge_exact;
+Prolog_atom a_pricing_textbook;
+
+Prolog_atom a_cutting_strategy;
+Prolog_atom a_cutting_strategy_first;
+Prolog_atom a_cutting_strategy_deepest;
+Prolog_atom a_cutting_strategy_all;
+
+Prolog_atom a_pivot_row_strategy;
+Prolog_atom a_pivot_row_strategy_first;
+Prolog_atom a_pivot_row_strategy_max_column;
+
+// Default timeout exception atom.
+Prolog_atom a_time_out;
+
+// "Out of memory" exception atom.
+Prolog_atom a_out_of_memory;
+
+// Boolean constants.
+Prolog_atom a_true;
+Prolog_atom a_false;
+
+// To build exception terms.
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_invalid_argument;
+Prolog_atom a_ppl_logic_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+
+const Prolog_Interface_Atom prolog_interface_atoms[] = {
+ { &a_nil, "[]" },
+
+ { &a_dollar_VAR, "$VAR" },
+
+ { &a_plus, "+" },
+ { &a_minus, "-" },
+ { &a_asterisk, "*" },
+
+ { &a_slash, "/" },
+
+ { &a_equal, "=" },
+ { &a_greater_than_equal, ">=" },
+ { &a_equal_less_than, "=<" },
+ { &a_greater_than, ">" },
+ { &a_less_than, "<" },
+
+ { &a_is_congruent_to, "=:=" },
+ { &a_modulo, "/" },
+
+ { &a_divided_by, "/" },
+
+ { &a_line, "line" },
+ { &a_ray, "ray" },
+ { &a_point, "point" },
+ { &a_closure_point, "closure_point" },
+
+ { &a_grid_line, "grid_line" },
+ { &a_parameter, "parameter" },
+ { &a_grid_point, "grid_point" },
+
+ { &a_is_disjoint, "is_disjoint" },
+ { &a_strictly_intersects, "strictly_intersects" },
+ { &a_is_included, "is_included" },
+ { &a_saturates, "saturates" },
+
+ { &a_subsumes, "subsumes" },
+
+ { &a_c, "c" },
+
+ { &a_empty, "empty" },
+ { &a_universe, "universe" },
+
+ { &a_max, "max" },
+ { &a_min, "min" },
+
+ { &a_bits_8, "bits_8" },
+ { &a_bits_16, "bits_16" },
+ { &a_bits_32, "bits_32" },
+ { &a_bits_64, "bits_64" },
+ { &a_bits_128, "bits_128" },
+
+ { &a_unsigned, "unsigned" },
+ { &a_signed_2_complement, "signed_2_complement" },
+
+ { &a_overflow_wraps, "overflow_wraps" },
+ { &a_overflow_undefined, "overflow_undefined" },
+ { &a_overflow_impossible, "overflow_impossible" },
+
+ { &a_unfeasible, "unfeasible" },
+ { &a_unbounded, "unbounded" },
+ { &a_optimized, "optimized" },
+
+ { &a_o, "o" },
+ { &a_i, "i" },
+
+ { &a_minf, "minf" },
+ { &a_pinf, "pinf" },
+
+ { &a_polynomial, "polynomial" },
+ { &a_simplex, "simplex" },
+ { &a_any, "any" },
+
+ { &a_pricing, "pricing" },
+ { &a_pricing_steepest_edge_float,
+ "pricing_steepest_edge_float" },
+ { &a_pricing_steepest_edge_exact,
+ "pricing_steepest_edge_exact" },
+ { &a_pricing_textbook, "pricing_textbook" },
+
+ { &a_cutting_strategy, "cutting_strategy" },
+ { &a_cutting_strategy_first, "cutting_strategy_first" },
+ { &a_cutting_strategy_deepest, "cutting_strategy_deepest" },
+ { &a_cutting_strategy_all, "cutting_strategy_all" },
+
+ { &a_pivot_row_strategy, "pivot_row_strategy" },
+ { &a_pivot_row_strategy_first, "pivot_row_strategy_first" },
+ { &a_pivot_row_strategy_max_column,
+ "pivot_row_strategy_max_column" },
+
+ { &a_time_out, "time_out" },
+ { &a_out_of_memory, "out_of_memory" },
+
+ { &a_true, "true" },
+ { &a_false, "false" },
+
+ { &a_ppl_invalid_argument, "ppl_invalid_argument" },
+ { &a_ppl_overflow_error, "ppl_overflow_error" },
+ { &a_ppl_domain_error, "ppl_domain_error" },
+ { &a_ppl_length_error, "ppl_length_error" },
+ { &a_ppl_invalid_argument, "ppl_invalid_argument" },
+ { &a_ppl_logic_error, "ppl_logic_error" },
+ { &a_ppl_representation_error, "ppl_representation_error" },
+ { &a_expected, "expected" },
+ { &a_found, "found" },
+ { &a_where, "where" },
+ { 0, 0 }
+};
+
+Prolog_term_ref
+Prolog_atom_term_from_string(const char* s) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_put_atom(t, Prolog_atom_from_string(s));
+ return t;
+}
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref max = Prolog_new_term_ref();
+ Prolog_put_ulong(max, e.max());
+ Prolog_construct_compound(max,
+ Prolog_atom_from_string("unsigned_integer"
+ "_less_or_equal"),
+ max);
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected, max);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_unsigned_integer& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string("unsigned_integer"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const non_linear& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string
+ ("linear_expression_or_constraint"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_variable& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found,
+ e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string
+ ("$VAR(unsigned_integer)"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_integer& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string("integer"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const ppl_handle_mismatch& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string("handle"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_optimization_mode& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("max"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("min"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_complexity_class& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("polynomial"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("simplex"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("any"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+ handle_exception(const not_a_control_parameter_name& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pricing"), expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+ handle_exception(const not_a_control_parameter_value& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pricing_steepest_edge_float"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pricing_steepest_edge_exact"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pricing_textbook"),
+ expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+ handle_exception(const not_a_pip_problem_control_parameter_name& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("cutting_strategy"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pivot_row_strategy"),
+ expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+ handle_exception(const not_a_pip_problem_control_parameter_value& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("cutting_strategy_first"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("cutting_strategy_deepest"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("cutting_strategy_all"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pivot_row_strategy_first"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("pivot_row_strategy_max_column"),
+ expected);
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_universe_or_empty& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("universe"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("empty"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_boolean& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("true"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("false"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_width& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("bits_8"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("bits_16"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("bits_32"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("bits_64"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("bits_128"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_representation& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("unsigned"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("signed_2_complement"),
+ expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_overflow& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("overflow_wraps"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("overflow_undefined"),
+ expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("overflow_impossible"),
+ expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_relation& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("="), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string(">="), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("=<"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string(">"), expected);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string("<"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_nil_terminated_list& e) {
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, e.term());
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_put_atom(expected, a_nil);
+ Prolog_construct_cons(expected,
+ Prolog_atom_term_from_string
+ ("Prolog_list"), expected);
+ Prolog_construct_compound(expected, a_expected, expected);
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string(e.where()));
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const PPL_integer_out_of_range& e) {
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string("Coefficient_to_integer_term"));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ std::ostringstream s;
+ s << e.value();
+ std::string str = s.str();
+ Prolog_construct_compound(exception_term, a_ppl_representation_error,
+ Prolog_atom_term_from_string(str.c_str()),
+ where);
+ Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const unknown_interface_error& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom_chars(et, e.where());
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::overflow_error& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_construct_compound(et, a_ppl_overflow_error,
+ Prolog_atom_term_from_string(e.what()));
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::domain_error& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_construct_compound(et, a_ppl_domain_error,
+ Prolog_atom_term_from_string(e.what()));
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::length_error& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_construct_compound(et, a_ppl_length_error,
+ Prolog_atom_term_from_string(e.what()));
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::invalid_argument& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_construct_compound(et, a_ppl_invalid_argument,
+ Prolog_atom_term_from_string(e.what()));
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::logic_error& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_construct_compound(et, a_ppl_logic_error,
+ Prolog_atom_term_from_string(e.what()));
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::bad_alloc&) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom(et, out_of_memory_exception_atom);
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::exception& e) {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom_chars(et, e.what());
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception() {
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom_chars(et, "PPL bug: unknown exception raised");
+ Prolog_raise_exception(et);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+ if (p_timeout_object) {
+ delete p_timeout_object;
+ p_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+void
+reset_deterministic_timeout() {
+ if (p_deterministic_timeout_object) {
+ delete p_deterministic_timeout_object;
+ p_deterministic_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+Prolog_atom timeout_exception_atom;
+
+void
+handle_exception(const timeout_exception&) {
+ assert(p_timeout_object);
+ reset_timeout();
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom(et, timeout_exception_atom);
+ Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const deterministic_timeout_exception&) {
+ assert(p_deterministic_timeout_object);
+ reset_deterministic_timeout();
+ Prolog_term_ref et = Prolog_new_term_ref();
+ Prolog_put_atom(et, timeout_exception_atom);
+ Prolog_raise_exception(et);
+}
+
+Prolog_term_ref
+variable_term(dimension_type varid) {
+ Prolog_term_ref v = Prolog_new_term_ref();
+ Prolog_put_ulong(v, varid);
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_construct_compound(t, a_dollar_VAR, v);
+ return t;
+}
+
+Prolog_atom
+term_to_boolean(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_true || name == a_false))
+ return name;
+ }
+ throw not_a_boolean(t, where);
+}
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_universe || name == a_empty))
+ return name;
+ }
+ throw not_universe_or_empty(t, where);
+}
+
+Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ assert(Prolog_is_integer(t));
+ if (!Prolog_get_Coefficient(t, n))
+ abort();
+ return n;
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Coefficient& n) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ if (!Prolog_put_Coefficient(t, n))
+ abort();
+ return t;
+}
+
+bool
+unify_long(Prolog_term_ref t, long l) {
+ Prolog_term_ref t_l = Prolog_new_term_ref();
+ return Prolog_put_long(t_l, l) && Prolog_unify(t, t_l);
+}
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l) {
+ Prolog_term_ref t_l = Prolog_new_term_ref();
+ return Prolog_put_ulong(t_l, l) && Prolog_unify(t, t_l);
+}
+
+Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_integer(t))
+ return Linear_Expression(integer_term_to_Coefficient(t));
+ else if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ switch (arity) {
+ case 1:
+ {
+ Prolog_term_ref arg = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg);
+ if (functor == a_minus)
+ // Unary minus.
+ return -build_linear_expression(arg, where);
+ else if (functor == a_dollar_VAR)
+ // Variable.
+ return Variable(term_to_unsigned<dimension_type>(arg, where));
+ }
+ break;
+ case 2:
+ {
+ Prolog_term_ref arg1 = Prolog_new_term_ref();
+ Prolog_term_ref arg2 = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg1);
+ Prolog_get_arg(2, t, arg2);
+ if (functor == a_plus)
+ // Plus.
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ + build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ + integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ + build_linear_expression(arg2, where);
+ else if (functor == a_minus)
+ // Minus.
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ - build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ - integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ - build_linear_expression(arg2, where);
+ else if (functor == a_asterisk) {
+ // Times.
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ * build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ * integer_term_to_Coefficient(arg2);
+ }
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear(t, where);
+}
+
+Constraint
+build_constraint(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ if (arity == 2) {
+ Prolog_term_ref arg1 = Prolog_new_term_ref();
+ Prolog_term_ref arg2 = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg1);
+ Prolog_get_arg(2, t, arg2);
+ if (functor == a_equal)
+ // =
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ == build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ == integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ == build_linear_expression(arg2, where);
+ else if (functor == a_equal_less_than)
+ // =<
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ <= build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ <= integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ <= build_linear_expression(arg2, where);
+ else if (functor == a_greater_than_equal)
+ // >=
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ >= build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ >= integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ >= build_linear_expression(arg2, where);
+ else if (functor == a_less_than)
+ // <
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ < build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ < integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ < build_linear_expression(arg2, where);
+ else if (functor == a_greater_than) {
+ // >
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ > build_linear_expression(arg2, where);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ > integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ > build_linear_expression(arg2, where);
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear(t, where);
+}
+
+Congruence
+build_congruence(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ if (arity == 2) {
+ Prolog_term_ref arg1 = Prolog_new_term_ref();
+ Prolog_term_ref arg2 = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg1);
+ Prolog_get_arg(2, t, arg2);
+ if (functor == a_modulo) {
+ // /
+ if (Prolog_is_integer(arg2)) {
+ Prolog_atom functor1;
+ int arity1;
+ Prolog_get_compound_name_arity(arg1, &functor1, &arity1);
+ if (arity1 == 2) {
+ if (functor1 == a_is_congruent_to) {
+ // =:=
+ Prolog_term_ref arg11 = Prolog_new_term_ref();
+ Prolog_term_ref arg12 = Prolog_new_term_ref();
+ Prolog_get_arg(1, arg1, arg11);
+ Prolog_get_arg(2, arg1, arg12);
+ if (Prolog_is_integer(arg12))
+ return (build_linear_expression(arg11, where)
+ %= integer_term_to_Coefficient(arg12))
+ / integer_term_to_Coefficient(arg2);
+ else
+ return (build_linear_expression(arg11, where)
+ %= build_linear_expression(arg12, where))
+ / integer_term_to_Coefficient(arg2);
+ }
+ }
+ }
+ }
+ else
+ if (functor == a_is_congruent_to)
+ // =:=
+ if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1, where)
+ %= integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1, where)
+ %= build_linear_expression(arg2, where);
+ else
+ if (functor == a_equal) {
+ // =
+ if (Prolog_is_integer(arg1))
+ return (build_linear_expression(arg2, where)
+ %= integer_term_to_Coefficient(arg1)) / 0;
+ else if (Prolog_is_integer(arg2))
+ return (build_linear_expression(arg1, where)
+ %= integer_term_to_Coefficient(arg2)) / 0;
+ else
+ return (build_linear_expression(arg1, where)
+ %= build_linear_expression(arg2, where)) / 0;
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear(t, where);
+}
+
+Generator
+build_generator(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ if (arity == 1) {
+ Prolog_term_ref arg = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg);
+ if (functor == a_line)
+ return Generator::line(build_linear_expression(arg, where));
+ else if (functor == a_ray)
+ return Generator::ray(build_linear_expression(arg, where));
+ else if (functor == a_point)
+ return Generator::point(build_linear_expression(arg, where));
+ else if (functor == a_closure_point)
+ return Generator::closure_point(build_linear_expression(arg, where));
+ }
+ else if (arity == 2) {
+ Prolog_term_ref arg1 = Prolog_new_term_ref();
+ Prolog_term_ref arg2 = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg1);
+ Prolog_get_arg(2, t, arg2);
+ if (Prolog_is_integer(arg2)) {
+ if (functor == a_point)
+ return Generator::point(build_linear_expression(arg1, where),
+ integer_term_to_Coefficient(arg2));
+ else if (functor == a_closure_point)
+ return Generator::closure_point(build_linear_expression(arg1, where),
+ integer_term_to_Coefficient(arg2));
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear(t, where);
+}
+
+Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ if (arity == 1) {
+ Prolog_term_ref arg = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg);
+ if (functor == a_grid_line)
+ return Grid_Generator::grid_line(build_linear_expression(arg, where));
+ else if (functor == a_parameter)
+ return Grid_Generator::parameter(build_linear_expression(arg, where));
+ else if (functor == a_grid_point)
+ return Grid_Generator::grid_point(build_linear_expression(arg, where));
+ }
+ else if (arity == 2) {
+ Prolog_term_ref arg1 = Prolog_new_term_ref();
+ Prolog_term_ref arg2 = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg1);
+ Prolog_get_arg(2, t, arg2);
+ if (Prolog_is_integer(arg2)) {
+ if (functor == a_grid_point)
+ return Grid_Generator::grid_point(build_linear_expression(arg1,
+ where),
+ integer_term_to_Coefficient(arg2));
+ else if (functor == a_parameter)
+ return Grid_Generator::parameter(build_linear_expression(arg1,
+ where),
+ integer_term_to_Coefficient(arg2));
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear(t, where);
+}
+
+template <typename R>
+Prolog_term_ref
+get_homogeneous_expression(const R& r) {
+ Prolog_term_ref so_far = Prolog_new_term_ref();
+ PPL_DIRTY_TEMP_COEFFICIENT(coefficient);
+ dimension_type varid = 0;
+ dimension_type space_dimension = r.space_dimension();
+ while (varid < space_dimension
+ && (coefficient = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension) {
+ Prolog_put_long(so_far, 0);
+ }
+ else {
+ Prolog_construct_compound(so_far, a_asterisk,
+ Coefficient_to_integer_term(coefficient),
+ variable_term(varid));
+ while (true) {
+ ++varid;
+ while (varid < space_dimension
+ && (coefficient = r.coefficient(Variable(varid))) == 0)
+ ++varid;
+ if (varid >= space_dimension)
+ break;
+ else {
+ Prolog_term_ref addendum = Prolog_new_term_ref();
+ Prolog_construct_compound(addendum, a_asterisk,
+ Coefficient_to_integer_term(coefficient),
+ variable_term(varid));
+ Prolog_term_ref new_so_far = Prolog_new_term_ref();
+ Prolog_construct_compound(new_so_far, a_plus,
+ so_far, addendum);
+ so_far = new_so_far;
+ }
+ }
+ }
+ return so_far;
+}
+
+Prolog_term_ref
+get_linear_expression(const Linear_Expression& le) {
+ Prolog_term_ref t_homo = get_homogeneous_expression(le);
+ if (le.inhomogeneous_term() == 0)
+ return t_homo;
+ else {
+ Prolog_term_ref t_in
+ = Coefficient_to_integer_term(le.inhomogeneous_term());
+ if (unify_long(t_homo, 0))
+ return t_in;
+ else {
+ Prolog_term_ref t_le = Prolog_new_term_ref();
+ Prolog_construct_compound(t_le, a_plus, t_homo, t_in);
+ return t_le;
+ }
+ }
+}
+
+Prolog_term_ref
+constraint_term(const Constraint& c) {
+ Prolog_atom relation = 0;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ relation = a_equal;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ relation = a_greater_than_equal;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ relation = a_greater_than;
+ break;
+ default:
+ throw unknown_interface_error("generator_term()");
+ }
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_construct_compound
+ (t,
+ relation,
+ get_homogeneous_expression(c),
+ Coefficient_to_integer_term(-c.inhomogeneous_term()));
+ return t;
+}
+
+Prolog_term_ref
+congruence_term(const Congruence& cg) {
+ Prolog_atom relation1 = a_is_congruent_to;
+ Prolog_atom relation2 = a_modulo;
+ Prolog_term_ref t_tmp = Prolog_new_term_ref();
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_construct_compound
+ (t_tmp,
+ relation1,
+ get_homogeneous_expression(cg),
+ Coefficient_to_integer_term(-cg.inhomogeneous_term()));
+ Prolog_construct_compound
+ (t,
+ relation2,
+ t_tmp,
+ Coefficient_to_integer_term(cg.modulus()));
+ return t;
+}
+
+Prolog_term_ref
+generator_term(const Generator& g) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom constructor = 0;
+ switch (g.type()) {
+ case Generator::LINE:
+ constructor = a_line;
+ break;
+ case Generator::RAY:
+ constructor = a_ray;
+ break;
+ case Generator::POINT:
+ {
+ constructor = a_point;
+ const Coefficient& divisor = g.divisor();
+ if (divisor == 1)
+ break;
+ else {
+ Prolog_construct_compound(t, constructor,
+ get_homogeneous_expression(g),
+ Coefficient_to_integer_term(divisor));
+ return t;
+ }
+ }
+ case Generator::CLOSURE_POINT:
+ {
+ constructor = a_closure_point;
+ const Coefficient& divisor = g.divisor();
+ if (divisor == 1)
+ break;
+ else {
+ Prolog_construct_compound(t, constructor,
+ get_homogeneous_expression(g),
+ Coefficient_to_integer_term(divisor));
+ return t;
+ }
+ }
+ default:
+ throw unknown_interface_error("generator_term()");
+ }
+ Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+ return t;
+}
+
+Prolog_term_ref
+grid_generator_term(const Grid_Generator& g) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom constructor = 0;
+ switch (g.type()) {
+ case Grid_Generator::LINE:
+ constructor = a_grid_line;
+ break;
+ case Grid_Generator::PARAMETER:
+ {
+ constructor = a_parameter;
+ const Coefficient& divisor = g.divisor();
+ if (divisor == 1)
+ break;
+ else {
+ Prolog_construct_compound(t, constructor,
+ get_homogeneous_expression(g),
+ Coefficient_to_integer_term(divisor));
+ return t;
+ }
+ }
+ case Grid_Generator::POINT:
+ {
+ constructor = a_grid_point;
+ const Coefficient& divisor = g.divisor();
+ if (divisor == 1)
+ break;
+ else {
+ Prolog_construct_compound(t, constructor,
+ get_homogeneous_expression(g),
+ Coefficient_to_integer_term(divisor));
+ return t;
+ }
+ }
+ default:
+ throw unknown_interface_error("grid_generator_term()");
+ }
+ Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+ return t;
+}
+
+Prolog_term_ref
+artificial_parameter_term(const PIP_Tree_Node::Artificial_Parameter& art) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_construct_compound(t, a_divided_by,
+ get_linear_expression(art),
+ Coefficient_to_integer_term(art.denominator()));
+ return t;
+}
+
+Variable
+term_to_Variable(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_compound(t)) {
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t, &functor, &arity);
+ if (functor == a_dollar_VAR && arity == 1) {
+ Prolog_term_ref arg = Prolog_new_term_ref();
+ Prolog_get_arg(1, t, arg);
+ return
+ Variable(term_to_unsigned<dimension_type>(arg, "term_to_Variable"));
+ }
+ }
+ throw not_a_variable(t, where);
+}
+
+Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_integer(t))
+ return integer_term_to_Coefficient(t);
+ else
+ throw not_an_integer(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_width(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_bits_8 || name == a_bits_16
+ || name == a_bits_32 || name == a_bits_64
+ || name == a_bits_128))
+ return name;
+ }
+ throw not_a_bounded_integer_type_width(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_representation(Prolog_term_ref t,
+ const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_unsigned || name == a_signed_2_complement))
+ return name;
+ }
+ throw not_a_bounded_integer_type_representation(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_overflow(Prolog_term_ref t,
+ const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_overflow_wraps
+ || name == a_overflow_undefined
+ || name == a_overflow_impossible))
+ return name;
+ }
+ throw not_a_bounded_integer_type_overflow(t, where);
+}
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_max || name == a_min))
+ return name;
+ }
+ throw not_an_optimization_mode(t, where);
+}
+
+Prolog_atom
+term_to_control_parameter_name(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_pricing || name == a_cutting_strategy))
+ return name;
+ }
+ throw not_a_control_parameter_name(t, where);
+}
+
+Prolog_atom
+term_to_pip_problem_control_parameter_name(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_cutting_strategy || name == a_pivot_row_strategy))
+ return name;
+ }
+ throw not_a_pip_problem_control_parameter_name(t, where);
+}
+
+Prolog_atom
+term_to_control_parameter_value(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_pricing_steepest_edge_float
+ || name == a_pricing_steepest_edge_exact
+ || name == a_pricing_textbook
+ || name == a_cutting_strategy_first
+ || name == a_cutting_strategy_deepest))
+ return name;
+ }
+ throw not_a_control_parameter_value(t, where);
+}
+
+Prolog_atom
+term_to_pip_problem_control_parameter_value(Prolog_term_ref t,
+ const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_cutting_strategy_first
+ || name == a_cutting_strategy_deepest
+ || name == a_cutting_strategy_all
+ || name == a_pivot_row_strategy_first
+ || name == a_pivot_row_strategy_max_column))
+ return name;
+ }
+ throw not_a_pip_problem_control_parameter_value(t, where);
+}
+
+bool Prolog_interface_initialized = false;
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom a;
+ Prolog_get_atom_name(t, &a);
+ if (a == a_nil)
+ return;
+ }
+ throw not_a_nil_terminated_list(t, where);
+}
+
+inline dimension_type
+max_representable_dimension(dimension_type d) {
+ return
+ Prolog_has_unbounded_integers
+ ? d
+ : std::min(d, static_cast<dimension_type>(Prolog_max_integer));
+}
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+ bool& finite, bool& closed,
+ Coefficient& n, Coefficient& d) {
+ if (!Prolog_is_compound(t_b))
+ return false;
+
+ Prolog_atom functor;
+ int arity;
+
+ Prolog_get_compound_name_arity(t_b, &functor, &arity);
+ // A boundary term is either of the form c(Limit) or o(Limit).
+ if (arity != 1 || (functor != a_c && functor != a_o))
+ return false;
+
+ Prolog_atom open_closed_atom = functor;
+
+ Prolog_term_ref t_limit = Prolog_new_term_ref();
+ Prolog_get_arg(1, t_b, t_limit);
+ if (Prolog_is_integer(t_limit)) {
+ // A finite, integral limit.
+ finite = true;
+ closed = (open_closed_atom == a_c);
+ n = integer_term_to_Coefficient(t_limit);
+ d = 1;
+ }
+ else if (Prolog_is_atom(t_limit)) {
+ Prolog_atom a;
+ Prolog_get_atom_name(t_limit, &a);
+ Prolog_atom allowed_infinity = (kind == LOWER_BOUNDARY ? a_minf : a_pinf);
+ // Only open bounds may be unbounded.
+ if (a != allowed_infinity || open_closed_atom != a_o)
+ return false;
+
+ finite = false;
+ }
+ else if (Prolog_is_compound(t_limit)) {
+ Prolog_get_compound_name_arity(t_limit, &functor, &arity);
+ if (arity != 2 || functor != a_slash)
+ return false;
+
+ Prolog_term_ref t_n = Prolog_new_term_ref();
+ Prolog_term_ref t_d = Prolog_new_term_ref();
+ Prolog_get_arg(1, t_limit, t_n);
+ Prolog_get_arg(2, t_limit, t_d);
+
+ if (!Prolog_is_integer(t_n) || !Prolog_is_integer(t_d))
+ return false;
+ else {
+ finite = true;
+ closed = (open_closed_atom == a_c);
+ n = integer_term_to_Coefficient(t_n);
+ d = integer_term_to_Coefficient(t_d);
+ // Catch negative denominators and divisions by zero here.
+ if (d <= 0)
+ return false;
+ }
+ }
+ return true;
+}
+
+Prolog_atom
+term_to_relation(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_equal
+ || name == a_greater_than_equal
+ || name == a_equal_less_than
+ || name == a_greater_than
+ || name == a_less_than))
+ return name;
+ }
+ throw not_a_relation(t, where);
+}
+
+Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where) {
+ Prolog_atom ra = term_to_relation(t_r, where);
+ Relation_Symbol r;
+ if (ra == a_less_than)
+ r = LESS_THAN;
+ else if (ra == a_equal_less_than)
+ r = LESS_OR_EQUAL;
+ else if (ra == a_equal)
+ r = EQUAL;
+ else if (ra == a_greater_than_equal)
+ r = GREATER_OR_EQUAL;
+ else {
+ assert(ra == a_greater_than);
+ r = GREATER_THAN;
+ }
+ return r;
+}
+
+Prolog_term_ref
+rational_term(const Rational_Box::interval_type::boundary_type& q) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+ PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+ numerator = q.get_num();
+ denominator = q.get_den();
+ if (denominator == 1)
+ Prolog_put_Coefficient(t, numerator);
+ else
+ Prolog_construct_compound(t, a_slash,
+ Coefficient_to_integer_term(numerator),
+ Coefficient_to_integer_term(denominator));
+ return t;
+}
+
+Prolog_term_ref
+interval_term(const Rational_Box::interval_type& i) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ if (i.is_empty())
+ Prolog_put_atom(t, a_empty);
+ else {
+ // Lower bound.
+ const Prolog_atom& l_oc = i.lower_is_open() ? a_o : a_c;
+ Prolog_term_ref l_b = Prolog_new_term_ref();
+ if (i.lower_is_boundary_infinity())
+ Prolog_put_atom(l_b, a_minf);
+ else
+ Prolog_put_term(l_b, rational_term(i.lower()));
+ Prolog_term_ref l_t = Prolog_new_term_ref();
+ Prolog_construct_compound(l_t, l_oc, l_b);
+
+ // Upper bound.
+ const Prolog_atom& u_oc = i.upper_is_open() ? a_o : a_c;
+ Prolog_term_ref u_b = Prolog_new_term_ref();
+ if (i.upper_is_boundary_infinity())
+ Prolog_put_atom(u_b, a_pinf);
+ else
+ Prolog_put_term(u_b, rational_term(i.upper()));
+ Prolog_term_ref u_t = Prolog_new_term_ref();
+ Prolog_construct_compound(u_t, u_oc, u_b);
+
+ Prolog_construct_compound(t, a_i, l_t, u_t);
+ }
+ return t;
+}
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_atom(t)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t, &name)
+ && (name == a_polynomial || name == a_simplex || name == a_any))
+ return name;
+ }
+ throw not_a_complexity_class(t, where);
+}
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v) {
+ try {
+ if (unify_ulong(t_v, version_major()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v) {
+ try {
+ if (unify_ulong(t_v, version_minor()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v) {
+ try {
+ if (unify_ulong(t_v, version_revision()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v) {
+ try {
+ if (unify_ulong(t_v, version_beta()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v) {
+ try {
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_atom_chars(tmp, version());
+ if (Prolog_unify(t_v, tmp))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b) {
+ try {
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_atom_chars(tmp, banner());
+ if (Prolog_unify(t_b, tmp))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd) {
+ try {
+ if (unify_ulong(t_msd, max_representable_dimension(max_space_dimension())))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize() {
+ try {
+ if (Prolog_interface_initialized)
+ return PROLOG_SUCCESS;
+ // Initialize the core library.
+ initialize();
+ for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+ Prolog_atom a = Prolog_atom_from_string(prolog_interface_atoms[i].name);
+ *prolog_interface_atoms[i].p_atom = a;
+ }
+ timeout_exception_atom = a_time_out;
+ out_of_memory_exception_atom = a_out_of_memory;
+ ppl_Prolog_sysdep_init();
+ Prolog_interface_initialized = true;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize() {
+ try {
+ if (!Prolog_interface_initialized)
+ return PROLOG_SUCCESS;
+
+ Prolog_interface_initialized = false;
+ // Finalize the core library.
+ finalize();
+ // Release the pending timeout object, if any.
+ reset_timeout();
+ ppl_Prolog_sysdep_deinit();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL() {
+ try {
+ set_rounding_for_PPL();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding() {
+ try {
+ restore_pre_PPL_rounding();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_irrational_precision(Prolog_term_ref t_p) {
+ try {
+ if (unify_ulong(t_p, irrational_precision()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_irrational_precision(Prolog_term_ref t_p) {
+ try {
+ unsigned p
+ = term_to_unsigned<unsigned>(t_p, "ppl_set_irrational_precision/1");
+ set_irrational_precision(p);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea) {
+ try {
+ if (Prolog_is_atom(t_tea)) {
+ Prolog_atom tea;
+ if (Prolog_get_atom_name(t_tea, &tea)) {
+ timeout_exception_atom = tea;
+ return PROLOG_SUCCESS;
+ }
+ }
+ Prolog_term_ref found = Prolog_new_term_ref();
+ Prolog_construct_compound(found, a_found, t_tea);
+
+ Prolog_term_ref expected = Prolog_new_term_ref();
+ Prolog_construct_compound(expected, a_expected,
+ Prolog_atom_term_from_string("atom"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string
+ ("ppl_set_timeout_exception_atom"));
+
+ Prolog_term_ref exception_term = Prolog_new_term_ref();
+ Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+ found, expected, where);
+ Prolog_raise_exception(exception_term);
+ return PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t) {
+ try {
+ Prolog_term_ref t_tea = Prolog_new_term_ref();
+ Prolog_put_atom(t_tea, timeout_exception_atom);
+ return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_csecs) {
+ try {
+ // In case a timeout was already set.
+ reset_timeout();
+ static timeout_exception e;
+ unsigned csecs = term_to_unsigned<unsigned>(t_csecs, "ppl_set_timeout/1");
+ p_timeout_object =
+ new Parma_Polyhedra_Library::Watchdog(csecs,
+ abandon_expensive_computations,
+ e);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout() {
+ try {
+ reset_timeout();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_deterministic_timeout(Prolog_term_ref t_unscaled_weight,
+ Prolog_term_ref t_scale) {
+ try {
+ // In case a deterministic timeout was already set.
+ reset_deterministic_timeout();
+ static deterministic_timeout_exception e;
+ unsigned long unscaled_weight
+ = term_to_unsigned<unsigned long>(t_unscaled_weight,
+ "ppl_set_deterministic_timeout/2");
+ unsigned scale
+ = term_to_unsigned<unsigned>(t_scale, "ppl_set_deterministic_timeout/2");
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+ p_deterministic_timeout_object
+ = new Weightwatch(Traits::compute_delta(unscaled_weight, scale),
+ abandon_expensive_computations, e);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_deterministic_timeout() {
+ try {
+ reset_deterministic_timeout();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_bits(Prolog_term_ref t_bits) {
+ try {
+ if (unify_ulong(t_bits, PPL_COEFFICIENT_BITS))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded() {
+ try {
+ if (std::numeric_limits<Coefficient>::is_bounded)
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min) {
+ try {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ PPL_DIRTY_TEMP_COEFFICIENT(min);
+ min = std::numeric_limits<Coefficient>::min();
+ if (Prolog_has_unbounded_integers
+ || (min >= Prolog_min_integer && min <= Prolog_min_integer))
+ return Prolog_unify_Coefficient(t_min, min)
+ ? PROLOG_SUCCESS : PROLOG_FAILURE;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max) {
+ try {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ PPL_DIRTY_TEMP_COEFFICIENT(max);
+ max = std::numeric_limits<Coefficient>::max();
+ if (Prolog_has_unbounded_integers
+ || (max >= Prolog_min_integer && max <= Prolog_min_integer))
+ return Prolog_unify_Coefficient(t_max, max)
+ ? PROLOG_SUCCESS : PROLOG_FAILURE;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip) {
+ static const char* where = "ppl_MIP_Problem_from_space_dimension/2";
+ try {
+ dimension_type d = term_to_unsigned<dimension_type>(t_nd, where);
+ MIP_Problem* mip = new MIP_Problem(d);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, mip);
+ if (Prolog_unify(t_mip, tmp)) {
+ PPL_REGISTER(mip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete mip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+ Prolog_term_ref t_clist,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_opt,
+ Prolog_term_ref t_mip) {
+ static const char* where = "ppl_new_MIP_Problem/5";
+ try {
+ Constraint_System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_constraint(c, where));
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ const Linear_Expression le = build_linear_expression(t_le_expr, where);
+ Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+ Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+
+ MIP_Problem* mip
+ = new MIP_Problem(term_to_unsigned<dimension_type>(t_nd, where),
+ cs, le, mode);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, mip);
+ if (Prolog_unify(t_mip, tmp)) {
+ PPL_REGISTER(mip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete mip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+ Prolog_term_ref t_mip) {
+ static const char* where = "ppl_new_MIP_Problem_from_MIP_Problem/2";
+ try {
+ const MIP_Problem* mip_source
+ = static_cast<const MIP_Problem*>
+ (term_to_handle<MIP_Problem>(t_mip_source, where));
+ PPL_CHECK(mip_source);
+ MIP_Problem* mip = new MIP_Problem(*mip_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, mip);
+ if (Prolog_unify(t_mip, tmp)) {
+ PPL_REGISTER(mip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete mip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_MIP_Problem_swap/2";
+ try {
+ MIP_Problem* lhs = term_to_handle<MIP_Problem>(t_lhs, where);
+ MIP_Problem* rhs = term_to_handle<MIP_Problem>(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ swap(*lhs, *rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip) {
+ static const char* where = "ppl_delete_MIP_Problem/1";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_UNREGISTER(mip);
+ delete mip;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd) {
+ static const char* where = "ppl_MIP_Problem_space_dimension/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ if (unify_ulong(t_sd, mip->space_dimension()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+ Prolog_term_ref t_vlist) {
+ static const char* where = "ppl_MIP_Problem_integer_space_dimensions/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Variables_Set& i_vars = mip->integer_space_dimensions();
+
+ for (Variables_Set::const_iterator i = i_vars.begin(),
+ i_end = i_vars.end(); i != i_end; ++i)
+ Prolog_construct_cons(tail, variable_term(*i), tail);
+
+ if (Prolog_unify(t_vlist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_MIP_Problem_constraints/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ for (MIP_Problem::const_iterator i = mip->constraints_begin(),
+ i_end = mip->constraints_end(); i != i_end; ++i)
+ Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+ if (Prolog_unify(t_clist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_le_expr) {
+ static const char* where = "ppl_MIP_Problem_objective_function/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ const Linear_Expression& le = mip->objective_function();
+ Prolog_term_ref t = get_linear_expression(le);
+
+ if (Prolog_unify(t_le_expr, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+ Prolog_term_ref t_opt) {
+ static const char* where = "ppl_MIP_Problem_optimization_mode/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Optimization_Mode mode = mip->optimization_mode();
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (mode == MAXIMIZATION) ? a_max : a_min;
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_opt, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip) {
+ static const char* where = "ppl_MIP_Problem_clear/1";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ mip->clear();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd) {
+ static const char* where
+ = "ppl_MIP_Problem_add_space_dimensions_and_embed/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+ mip->add_space_dimensions_and_embed(d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+ Prolog_term_ref t_vlist) {
+ static const char* where
+ = "ppl_MIP_Problem_add_to_integer_space_dimensions/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ Variables_Set i_vars;
+ Prolog_term_ref v = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ i_vars.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+
+ mip->add_to_integer_space_dimensions(i_vars);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c) {
+ static const char* where = "ppl_MIP_Problem_add_constraint/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ mip->add_constraint(build_constraint(t_c, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_MIP_Problem_add_constraints/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ Constraint_System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_constraint(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ mip->add_constraints(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_le_expr) {
+ static const char* where = "ppl_MIP_Problem_set_objective_function/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ mip->set_objective_function(build_linear_expression(t_le_expr, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+ Prolog_term_ref t_opt) {
+ static const char* where = "ppl_MIP_Problem_set_optimization_mode/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+ Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+ mip->set_optimization_mode(mode);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_control_parameter(Prolog_term_ref t_mip,
+ Prolog_term_ref t_cp_value) {
+ static const char* where = "ppl_MIP_Problem_set_control_parameter/2";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Prolog_atom cp_value = term_to_control_parameter_value(t_cp_value, where);
+ if (cp_value == a_pricing_steepest_edge_float)
+ mip->set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT);
+ else if (cp_value == a_pricing_steepest_edge_exact)
+ mip->set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_EXACT);
+ else if (cp_value == a_pricing_textbook)
+ mip->set_control_parameter(MIP_Problem::PRICING_TEXTBOOK);
+ else
+ throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_get_control_parameter(Prolog_term_ref t_mip,
+ Prolog_term_ref t_cp_name,
+ Prolog_term_ref t_cp_value) {
+ static const char* where = "ppl_MIP_Problem_get_control_parameter/3";
+ try {
+ MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ Prolog_atom cp_name = term_to_control_parameter_name(t_cp_name, where);
+ MIP_Problem::Control_Parameter_Value ppl_cp_value;
+ if (cp_name == a_pricing)
+ ppl_cp_value = mip->get_control_parameter(MIP_Problem::PRICING);
+ else
+ throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a;
+ switch (ppl_cp_value) {
+ case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+ a = a_pricing_steepest_edge_float;
+ break;
+ case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+ a = a_pricing_steepest_edge_exact;
+ break;
+ case MIP_Problem::PRICING_TEXTBOOK:
+ a = a_pricing_textbook;
+ break;
+ default:
+ throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+ }
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_cp_value, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip) {
+ static const char* where = "ppl_MIP_Problem_is_satisfiable/1";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ if (mip->is_satisfiable())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status) {
+ static const char* where = "ppl_MIP_Problem_solve/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+
+ Prolog_atom a;
+ switch (mip->solve()) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ a = a_unfeasible;
+ break;
+ case UNBOUNDED_MIP_PROBLEM:
+ a = a_unbounded;
+ break;
+ case OPTIMIZED_MIP_PROBLEM:
+ a = a_optimized;
+ break;
+ default:
+ throw unknown_interface_error("ppl_MIP_Problem_solve()");
+ }
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_status, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g) {
+ static const char* where = "ppl_MIP_Problem_feasible_point/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ const Generator& g = mip->feasible_point();
+ if (Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g) {
+ static const char* where = "ppl_MIP_Problem_optimizing_point/2";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ const Generator& g = mip->optimizing_point();
+ if (Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_MIP_Problem_optimal_value/3";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ mip->optimal_value(n, d);
+ if (Prolog_unify_Coefficient(t_n, n)
+ && Prolog_unify_Coefficient(t_d, d))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_MIP_Problem_evaluate_objective_function/4";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ mip->evaluate_objective_function(build_generator(t_g, where), n, d);
+ if (Prolog_unify_Coefficient(t_n, n)
+ && Prolog_unify_Coefficient(t_d, d))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip) {
+ static const char* where = "ppl_MIP_Problem_OK/1";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ if (mip->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_ascii_dump(Prolog_term_ref t_mip) {
+ static const char* where = "ppl_MIP_Problem_ascii_dump/1";
+ try {
+ const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+ PPL_CHECK(mip);
+ mip->ascii_dump(std::cout);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Problem_from_space_dimension/2";
+ try {
+ dimension_type d = term_to_unsigned<dimension_type>(t_nd, where);
+ PIP_Problem* pip = new PIP_Problem(d);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, pip);
+ if (Prolog_unify(t_pip, tmp)) {
+ PPL_REGISTER(pip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete pip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem(Prolog_term_ref t_dim,
+ Prolog_term_ref t_cs,
+ Prolog_term_ref t_params,
+ Prolog_term_ref t_pip) {
+ static const char* where = "ppl_new_PIP_Problem/4";
+ try {
+ dimension_type dim = term_to_unsigned<dimension_type>(t_dim, where);
+ Constraint_System cs;
+ Prolog_term_ref t_c = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_cs)) {
+ Prolog_get_cons(t_cs, t_c, t_cs);
+ cs.insert(build_constraint(t_c, where));
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_cs, where);
+
+ Variables_Set params;
+ Prolog_term_ref t_par = Prolog_new_term_ref();
+ while (Prolog_is_cons(t_params)) {
+ Prolog_get_cons(t_params, t_par, t_params);
+ params.insert(term_to_Variable(t_par, where).id());
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_params, where);
+
+ PIP_Problem* pip = new PIP_Problem(dim, cs.begin(), cs.end(), params);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, pip);
+ if (Prolog_unify(t_pip, tmp)) {
+ PPL_REGISTER(pip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete pip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_PIP_Problem(Prolog_term_ref t_pip_source,
+ Prolog_term_ref t_pip) {
+ static const char* where = "ppl_new_PIP_Problem_from_PIP_Problem/2";
+ try {
+ const PIP_Problem* pip_source
+ = static_cast<const PIP_Problem*>
+ (term_to_handle<PIP_Problem>(t_pip_source, where));
+ PPL_CHECK(pip_source);
+ PIP_Problem* pip = new PIP_Problem(*pip_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, pip);
+ if (Prolog_unify(t_pip, tmp)) {
+ PPL_REGISTER(pip);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete pip;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ static const char* where = "ppl_PIP_Problem_swap/2";
+ try {
+ PIP_Problem* lhs = term_to_handle<PIP_Problem>(t_lhs, where);
+ PIP_Problem* rhs = term_to_handle<PIP_Problem>(t_rhs, where);
+ PPL_CHECK(lhs);
+ PPL_CHECK(rhs);
+ swap(*lhs, *rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_PIP_Problem(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_delete_PIP_Problem/1";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_UNREGISTER(pip);
+ delete pip;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_space_dimension(Prolog_term_ref t_pip, Prolog_term_ref t_sd) {
+ static const char* where = "ppl_PIP_Problem_space_dimension/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ if (unify_ulong(t_sd, pip->space_dimension()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_parameter_space_dimensions(Prolog_term_ref t_pip,
+ Prolog_term_ref t_vlist) {
+ static const char* where = "ppl_PIP_Problem_parameter_space_dimensions/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Variables_Set& params = pip->parameter_space_dimensions();
+
+ for (Variables_Set::const_iterator i = params.begin(),
+ i_end = params.end(); i != i_end; ++i)
+ Prolog_construct_cons(tail, variable_term(*i), tail);
+
+ if (Prolog_unify(t_vlist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_constraints(Prolog_term_ref t_pip,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_PIP_Problem_constraints/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ for (PIP_Problem::const_iterator i = pip->constraints_begin(),
+ i_end = pip->constraints_end(); i != i_end; ++i)
+ Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+ if (Prolog_unify(t_clist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_clear(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Problem_clear/1";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ pip->clear();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_pip,
+ Prolog_term_ref t_num_vars,
+ Prolog_term_ref t_num_params) {
+ static const char* where
+ = "ppl_PIP_Problem_add_space_dimensions_and_embed/3";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ dimension_type nv = term_to_unsigned<dimension_type>(t_num_vars, where);
+ dimension_type np = term_to_unsigned<dimension_type>(t_num_params, where);
+ pip->add_space_dimensions_and_embed(nv, np);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_to_parameter_space_dimensions(Prolog_term_ref t_pip,
+ Prolog_term_ref t_vlist) {
+ static const char* where
+ = "ppl_PIP_Problem_add_to_parameter_space_dimensions/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ Variables_Set params;
+ Prolog_term_ref v = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_vlist)) {
+ Prolog_get_cons(t_vlist, v, t_vlist);
+ params.insert(term_to_Variable(v, where).id());
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist, where);
+
+ pip->add_to_parameter_space_dimensions(params);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraint(Prolog_term_ref t_pip, Prolog_term_ref t_c) {
+ static const char* where = "ppl_PIP_Problem_add_constraint/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ pip->add_constraint(build_constraint(t_c, where));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraints(Prolog_term_ref t_pip,
+ Prolog_term_ref t_clist) {
+ static const char* where = "ppl_PIP_Problem_add_constraints/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ Constraint_System cs;
+ Prolog_term_ref c = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_clist)) {
+ Prolog_get_cons(t_clist, c, t_clist);
+ cs.insert(build_constraint(c, where));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist, where);
+
+ pip->add_constraints(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_get_control_parameter(Prolog_term_ref t_pip,
+ Prolog_term_ref t_cp_name,
+ Prolog_term_ref t_cp_value) {
+ static const char* where = "ppl_PIP_Problem_get_control_parameter/3";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ Prolog_atom cp_name = term_to_pip_problem_control_parameter_name(t_cp_name, where);
+ PIP_Problem::Control_Parameter_Value ppl_cp_value;
+ Prolog_atom a;
+ if (cp_name == a_cutting_strategy) {
+ ppl_cp_value
+ = pip->get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+ switch (ppl_cp_value) {
+ case PIP_Problem::CUTTING_STRATEGY_FIRST:
+ a = a_cutting_strategy_first;
+ break;
+ case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+ a = a_cutting_strategy_deepest;
+ break;
+ case PIP_Problem::CUTTING_STRATEGY_ALL:
+ a = a_cutting_strategy_all;
+ break;
+ default:
+ throw unknown_interface_error(
+ "ppl_PIP_Problem_get_control_parameter()");
+ }
+ }
+ else if (cp_name == a_pivot_row_strategy) {
+ ppl_cp_value
+ = pip->get_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY);
+ switch (ppl_cp_value) {
+ case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+ a = a_pivot_row_strategy_first;
+ break;
+ case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+ a = a_pivot_row_strategy_max_column;
+ break;
+ default:
+ throw unknown_interface_error(
+ "ppl_PIP_Problem_get_control_parameter()");
+ }
+ }
+ else
+ throw unknown_interface_error("ppl_PIP_Problem_get_control_parameter()");
+
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_cp_value, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_control_parameter(Prolog_term_ref t_pip,
+ Prolog_term_ref t_cp_value) {
+ static const char* where = "ppl_PIP_Problem_set_control_parameter/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+
+ Prolog_atom cp_value = term_to_pip_problem_control_parameter_value(t_cp_value, where);
+ if (cp_value == a_cutting_strategy_first)
+ pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_FIRST);
+ else if (cp_value == a_cutting_strategy_deepest)
+ pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+ else if (cp_value == a_cutting_strategy_all)
+ pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+ else if (cp_value == a_pivot_row_strategy_first)
+ pip->set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_FIRST);
+ else if (cp_value == a_pivot_row_strategy_max_column)
+ pip->set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+ else
+ throw unknown_interface_error("ppl_PIP_Problem_set_control_parameter()");
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_has_big_parameter_dimension(Prolog_term_ref t_pip,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_PIP_Problem_get_big_parameter_dimension/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ dimension_type dim = pip->get_big_parameter_dimension();
+ if (dim == not_a_dimension())
+ return PROLOG_FAILURE;
+ if (unify_ulong(t_d, dim))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_big_parameter_dimension(Prolog_term_ref t_pip,
+ Prolog_term_ref t_d) {
+ static const char* where = "ppl_MIP_Problem_set_big_parameter_dimension/2";
+ try {
+ PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ dimension_type d = term_to_unsigned<dimension_type>(t_d, where);
+ pip->set_big_parameter_dimension(d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_is_satisfiable(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Problem_is_satisfiable/1";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ if (pip->is_satisfiable())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solve(Prolog_term_ref t_pip, Prolog_term_ref t_status) {
+ static const char* where = "ppl_PIP_Problem_solve/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+
+ Prolog_atom a;
+ switch (pip->solve()) {
+ case UNFEASIBLE_PIP_PROBLEM:
+ a = a_unfeasible;
+ break;
+ case OPTIMIZED_PIP_PROBLEM:
+ a = a_optimized;
+ break;
+ default:
+ throw unknown_interface_error("ppl_PIP_Problem_solve()");
+ }
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_status, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solution(Prolog_term_ref t_pip,
+ Prolog_term_ref t_pip_tree) {
+ static const char* where = "ppl_PIP_Problem_solution/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ PIP_Tree_Node* sol = const_cast<PIP_Tree_Node*>(pip->solution());
+ Prolog_term_ref t_sol = Prolog_new_term_ref();
+ Prolog_put_address(t_sol, sol);
+ if (Prolog_unify(t_pip_tree, t_sol)) {
+ PPL_WEAK_REGISTER(sol);
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_optimizing_solution(Prolog_term_ref t_pip,
+ Prolog_term_ref t_pip_tree) {
+ static const char* where = "ppl_PIP_Problem_optimizing_solution/2";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ PIP_Tree_Node* sol = const_cast<PIP_Tree_Node*>(pip->optimizing_solution());
+ Prolog_term_ref t_sol = Prolog_new_term_ref();
+ Prolog_put_address(t_sol, sol);
+ if (Prolog_unify(t_pip_tree, t_sol)) {
+ PPL_WEAK_REGISTER(sol);
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_OK(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Problem_OK/1";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ if (pip->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_ascii_dump(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Problem_ascii_dump/1";
+ try {
+ const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+ PPL_CHECK(pip);
+ pip->ascii_dump(std::cout);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_constraints(Prolog_term_ref t_pip,
+ Prolog_term_ref t_cs) {
+ static const char* where = "ppl_PIP_Tree_Node_constraints/2";
+ try {
+ const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+ PPL_CHECK(pip);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Constraint_System& ppl_cs = pip->constraints();
+ for (Constraint_System::const_iterator i = ppl_cs.begin(),
+ ppl_cs_end = ppl_cs.end(); i != ppl_cs_end; ++i)
+ Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+ if (Prolog_unify(t_cs, tail)) {
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_solution(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Tree_Node_as_solution/2";
+ try {
+ const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+ PPL_CHECK(pip);
+
+ if (pip != 0 && pip->as_solution() != 0)
+ return PROLOG_SUCCESS;
+ return PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_decision(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Tree_Node_as_decision/2";
+ try {
+ const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+ PPL_CHECK(pip);
+
+ if (pip != 0 && pip->as_decision() != 0)
+ return PROLOG_SUCCESS;
+ return PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_bottom(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Tree_Node_as_decision/2";
+ try {
+ const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+ PPL_CHECK(pip);
+
+ if (pip == 0)
+ return PROLOG_SUCCESS;
+ return PROLOG_FAILURE;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_artificials(Prolog_term_ref t_tree_node,
+ Prolog_term_ref t_artlist) {
+ static const char* where = "ppl_PIP_Tree_Node_artificials/2";
+ try {
+ const PIP_Tree_Node* node
+ = term_to_handle<PIP_Tree_Node>(t_tree_node, where);
+ PPL_CHECK(node);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+ i = node->art_parameter_begin(),
+ arts_end = node->art_parameter_end(); i != arts_end; ++i)
+ Prolog_construct_cons(tail, artificial_parameter_term(*i), tail);
+
+ if (Prolog_unify(t_artlist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_parametric_values(Prolog_term_ref t_pip,
+ Prolog_term_ref t_var,
+ Prolog_term_ref t_le) {
+ static const char* where = "ppl_PIP_Solution_Node_get_parametric_values/3";
+ try {
+ const PIP_Solution_Node* pip
+ = term_to_handle<PIP_Solution_Node>(t_pip, where);
+ PPL_CHECK(pip);
+ Variable var = term_to_Variable(t_var, where);
+ if (Prolog_unify(t_le, get_linear_expression(pip->parametric_values(var))))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_true_child(Prolog_term_ref t_pip,
+ Prolog_term_ref t_ptree) {
+ static const char* where = "ppl_PIP_Decision_Node_get_true_child/2";
+ try {
+ const PIP_Decision_Node* pip
+ = term_to_handle<PIP_Decision_Node>(t_pip, where);
+ PPL_CHECK(pip);
+ bool b = true;
+ PIP_Tree_Node* ppl_ptree = const_cast<PIP_Tree_Node*>(pip->child_node(b));
+ Prolog_term_ref t_ppl_ptree = Prolog_new_term_ref();
+ Prolog_put_address(t_ppl_ptree, ppl_ptree);
+ if (Prolog_unify(t_ptree, t_ppl_ptree)) {
+ PPL_WEAK_REGISTER(ppl_ptree);
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_false_child(Prolog_term_ref t_pip,
+ Prolog_term_ref t_ptree) {
+ static const char* where = "ppl_PIP_Decision_Node_get_false_child/2";
+ try {
+ const PIP_Decision_Node* pip
+ = term_to_handle<PIP_Decision_Node>(t_pip, where);
+ PPL_CHECK(pip);
+ bool b = false;
+ PIP_Tree_Node* ppl_ptree = const_cast<PIP_Tree_Node*>(pip->child_node(b));
+ Prolog_term_ref t_ppl_ptree = Prolog_new_term_ref();
+ Prolog_put_address(t_ppl_ptree, ppl_ptree);
+ if (Prolog_unify(t_ptree, t_ppl_ptree)) {
+ PPL_WEAK_REGISTER(ppl_ptree);
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_OK(Prolog_term_ref t_pip) {
+ static const char* where = "ppl_PIP_Tree_Node_OK/1";
+ try {
+ const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+ PPL_CHECK(pip);
+ if (pip->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
diff --git a/interfaces/Prolog/ppl_prolog_common_defs.hh b/interfaces/Prolog/ppl_prolog_common_defs.hh
new file mode 100644
index 0000000..3f85ef2
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common_defs.hh
@@ -0,0 +1,1084 @@
+/* Common part of the Prolog interfaces: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_defs_hh
+#define PPL_ppl_prolog_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#include "ppl_prolog_sysdep.hh"
+#include "interfaced_boxes.hh"
+#include <set>
+#include <vector>
+#include <exception>
+#include <stdexcept>
+#include <iostream>
+
+#ifndef PROLOG_TRACK_ALLOCATION
+#define PROLOG_TRACK_ALLOCATION 0
+#endif
+#ifndef NOISY_PROLOG_TRACK_ALLOCATION
+#define NOISY_PROLOG_TRACK_ALLOCATION 0
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+class Allocation_Tracker {
+public:
+ //! Construct an allocation tracker with no registered objects.
+ Allocation_Tracker();
+
+ /*! \brief
+ Register an object whose deletion is under the Prolog programmer
+ responsibility.
+ */
+ template <typename T>
+ void insert(const T* p);
+
+ /*! \brief
+ Register an object whose deletion is under the PPL library
+ responsibility.
+ */
+ template <typename T>
+ void weak_insert(const T* p);
+
+ //! Check whether the object was correctly registered.
+ template <typename T>
+ void check(const T* p) const;
+
+ /*! \brief
+ Unregister an object whose deletion is under the Prolog programmer
+ responsibility.
+ */
+ template <typename T>
+ void remove(const T* p);
+
+ /*! \brief
+ Destroy the allocation tracker: an error message will be output
+ if there still are registered objects whose deletion was under
+ the Prolog programmer responsibility.
+ */
+ ~Allocation_Tracker();
+
+private:
+ //! The type for recording a set of pointers to PPL library objects.
+ typedef std::set<const void*, std::less<const void*> > Set;
+
+ /*! \brief
+ A set of pointers to objects whose deallocation is under the
+ rensponsibility of the Prolog programmer: they should be deallocated
+ before the termination of the program.
+ */
+ Set s;
+
+ /*! \brief
+ A set of pointers to objects whose deallocation is under the
+ rensponsibility of the PPL library: they should not be deallocated
+ by the Prolog programmer.
+ */
+ Set weak_s;
+};
+
+extern Allocation_Tracker allocation_tracker;
+
+#define PPL_REGISTER(x) \
+ Parma_Polyhedra_Library::Interfaces::Prolog \
+ ::allocation_tracker.insert(x)
+#define PPL_WEAK_REGISTER(x) \
+ Parma_Polyhedra_Library::Interfaces::Prolog \
+ ::allocation_tracker.weak_insert(x)
+#define PPL_UNREGISTER(x) \
+ Parma_Polyhedra_Library::Interfaces::Prolog \
+ ::allocation_tracker.remove(x)
+#define PPL_CHECK(x) \
+ Parma_Polyhedra_Library::Interfaces::Prolog \
+ ::allocation_tracker.check(x)
+
+#else // !PROLOG_TRACK_ALLOCATION && !NOISY_PROLOG_TRACK_ALLOCATION
+
+#define PPL_REGISTER(x)
+#define PPL_WEAK_REGISTER(x)
+#define PPL_UNREGISTER(x)
+#define PPL_CHECK(x)
+
+#endif // !PROLOG_TRACK_ALLOCATION && !NOISY_PROLOG_TRACK_ALLOCATION
+
+class internal_exception {
+private:
+ Prolog_term_ref t;
+ const char* w;
+
+public:
+ internal_exception(Prolog_term_ref term, const char* where)
+ : t(term),
+ w(where) {
+ }
+
+ virtual ~internal_exception() {
+ }
+
+ virtual Prolog_term_ref term() const {
+ return t;
+ }
+
+ virtual const char* where() const {
+ return w;
+ }
+};
+
+class Prolog_unsigned_out_of_range : public internal_exception {
+private:
+ unsigned long m;
+
+public:
+ Prolog_unsigned_out_of_range(Prolog_term_ref term,
+ const char* where,
+ unsigned long max)
+ : internal_exception(term, where),
+ m(max) {
+ }
+
+ unsigned long max() const {
+ return m;
+ }
+};
+
+class non_linear : public internal_exception {
+public:
+ non_linear(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_an_integer : public internal_exception {
+public:
+ not_an_integer(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_unsigned_integer : public internal_exception {
+public:
+ not_unsigned_integer(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_boolean : public internal_exception {
+public:
+ not_a_boolean(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_variable : public internal_exception {
+public:
+ not_a_variable(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_an_optimization_mode : public internal_exception {
+public:
+ not_an_optimization_mode(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_bounded_integer_type_width : public internal_exception {
+public:
+ not_a_bounded_integer_type_width(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_bounded_integer_type_representation : public internal_exception {
+public:
+ not_a_bounded_integer_type_representation(Prolog_term_ref term,
+ const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_bounded_integer_type_overflow : public internal_exception {
+public:
+ not_a_bounded_integer_type_overflow(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_complexity_class : public internal_exception {
+public:
+ not_a_complexity_class(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_control_parameter_name : public internal_exception {
+public:
+ not_a_control_parameter_name(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_control_parameter_value : public internal_exception {
+public:
+ not_a_control_parameter_value(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_pip_problem_control_parameter_name : public internal_exception {
+public:
+ not_a_pip_problem_control_parameter_name(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_pip_problem_control_parameter_value : public internal_exception {
+public:
+ not_a_pip_problem_control_parameter_value(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_universe_or_empty : public internal_exception {
+public:
+ not_universe_or_empty(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_relation : public internal_exception {
+public:
+ not_a_relation(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class not_a_nil_terminated_list : public internal_exception {
+public:
+ not_a_nil_terminated_list(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class PPL_integer_out_of_range {
+private:
+ Parma_Polyhedra_Library::Coefficient n;
+
+public:
+ PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& value)
+ : n(value) {
+ }
+
+ const Parma_Polyhedra_Library::Coefficient value() const {
+ return n;
+ }
+};
+
+class ppl_handle_mismatch : public internal_exception {
+public:
+ ppl_handle_mismatch(Prolog_term_ref term, const char* where)
+ : internal_exception(term, where) {
+ }
+};
+
+class unknown_interface_error {
+private:
+ const char* w;
+
+public:
+ unknown_interface_error(const char* s)
+ : w(s) {
+ }
+
+ const char* where() const {
+ return w;
+ }
+};
+
+// For Prolog lists.
+extern Prolog_atom a_nil;
+
+// For variables.
+extern Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+extern Prolog_atom a_plus;
+extern Prolog_atom a_minus;
+extern Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+extern Prolog_atom a_slash;
+
+// For constraints.
+extern Prolog_atom a_less_than;
+extern Prolog_atom a_equal_less_than;
+extern Prolog_atom a_equal;
+extern Prolog_atom a_greater_than_equal;
+extern Prolog_atom a_greater_than;
+
+// For congruences.
+extern Prolog_atom a_is_congruent_to;
+extern Prolog_atom a_modulo;
+
+// For generators.
+extern Prolog_atom a_line;
+extern Prolog_atom a_ray;
+extern Prolog_atom a_point;
+extern Prolog_atom a_closure_point;
+
+// For grid_generators.
+extern Prolog_atom a_grid_line;
+extern Prolog_atom a_parameter;
+extern Prolog_atom a_grid_point;
+
+// For the relation between a polyhedron and a constraint.
+extern Prolog_atom a_is_disjoint;
+extern Prolog_atom a_strictly_intersects;
+extern Prolog_atom a_is_included;
+extern Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+extern Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+extern Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+extern Prolog_atom a_empty;
+
+// Denotes an open interval boundary.
+extern Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+extern Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+extern Prolog_atom a_minf;
+extern Prolog_atom a_pinf;
+
+// Denote complexity classes.
+extern Prolog_atom a_polynomial;
+extern Prolog_atom a_simplex;
+extern Prolog_atom a_any;
+
+// Denote possible widths of bounded integer types.
+extern Prolog_atom a_bits_8;
+extern Prolog_atom a_bits_16;
+extern Prolog_atom a_bits_32;
+extern Prolog_atom a_bits_64;
+extern Prolog_atom a_bits_128;
+
+// Denote possible representations of bounded integer types.
+extern Prolog_atom a_unsigned;
+extern Prolog_atom a_signed_2_complement;
+
+// Denote possible overflow behavior of bounded integer types.
+extern Prolog_atom a_overflow_wraps;
+extern Prolog_atom a_overflow_undefined;
+extern Prolog_atom a_overflow_impossible;
+
+// Boolean constants.
+extern Prolog_atom a_true;
+extern Prolog_atom a_false;
+
+
+struct Prolog_Interface_Atom {
+ Prolog_atom* p_atom;
+ const char* name;
+};
+
+extern const Prolog_Interface_Atom prolog_interface_atoms[];
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e);
+
+void
+handle_exception(const not_unsigned_integer& e);
+
+void
+handle_exception(const not_a_boolean& e);
+
+void
+handle_exception(const non_linear& e);
+
+void
+handle_exception(const not_a_variable& e);
+
+void
+handle_exception(const not_an_integer& e);
+
+void
+handle_exception(const ppl_handle_mismatch& e);
+
+void
+handle_exception(const not_an_optimization_mode& e);
+
+void
+handle_exception(const not_a_complexity_class& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_width& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_representation& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_overflow& e);
+
+void
+handle_exception(const not_a_control_parameter_name& e);
+
+void
+handle_exception(const not_a_control_parameter_value& e);
+
+void
+handle_exception(const not_a_pip_problem_control_parameter_name& e);
+
+void
+handle_exception(const not_a_pip_problem_control_parameter_value& e);
+
+void
+handle_exception(const not_universe_or_empty& e);
+
+void
+handle_exception(const not_a_relation& e);
+
+void
+handle_exception(const not_a_nil_terminated_list& e);
+
+void
+handle_exception(const PPL_integer_out_of_range& e);
+
+void
+handle_exception(const unknown_interface_error& e);
+
+void
+handle_exception(const std::overflow_error& e);
+
+void
+handle_exception(const std::domain_error& e);
+
+void
+handle_exception(const std::length_error& e);
+
+void
+handle_exception(const std::invalid_argument& e);
+
+void
+handle_exception(const std::logic_error& e);
+
+void
+handle_exception(const std::bad_alloc&);
+
+void
+handle_exception(const std::exception& e);
+
+void
+handle_exception();
+
+class timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+void
+handle_exception(const timeout_exception&);
+
+class deterministic_timeout_exception
+ : public Parma_Polyhedra_Library::Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+};
+
+void
+handle_exception(const deterministic_timeout_exception&);
+
+#define CATCH_ALL \
+ catch (const Prolog_unsigned_out_of_range& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_unsigned_integer& e) { \
+ handle_exception(e); \
+ } \
+ catch (const non_linear& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_variable& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_an_integer& e) { \
+ handle_exception(e); \
+ } \
+ catch (const ppl_handle_mismatch& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_an_optimization_mode& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_complexity_class& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_bounded_integer_type_width& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_bounded_integer_type_representation& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_bounded_integer_type_overflow& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_control_parameter_name& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_control_parameter_value& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_pip_problem_control_parameter_name& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_pip_problem_control_parameter_value& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_universe_or_empty& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_relation& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_nil_terminated_list& e) { \
+ handle_exception(e); \
+ } \
+ catch (const PPL_integer_out_of_range& e) { \
+ handle_exception(e); \
+ } \
+ catch (const unknown_interface_error& e) { \
+ handle_exception(e); \
+ } \
+ catch (const timeout_exception& e) { \
+ handle_exception(e); \
+ } \
+ catch (const deterministic_timeout_exception& e) { \
+ handle_exception(e); \
+ } \
+ catch(const std::overflow_error& e) { \
+ handle_exception(e); \
+ } \
+ catch(const std::domain_error& e) { \
+ handle_exception(e); \
+ } \
+ catch(const std::length_error& e) { \
+ handle_exception(e); \
+ } \
+ catch(const std::invalid_argument& e) { \
+ handle_exception(e); \
+ } \
+ catch (const std::logic_error& e) { \
+ handle_exception(e); \
+ } \
+ catch (const std::bad_alloc& e) { \
+ handle_exception(e); \
+ } \
+ catch (const std::exception& e) { \
+ handle_exception(e); \
+ } \
+ catch (...) { \
+ handle_exception(); \
+ } \
+ return PROLOG_FAILURE
+
+
+Prolog_term_ref
+variable_term(dimension_type varid);
+
+template <typename U>
+U
+term_to_unsigned(Prolog_term_ref t, const char* where) {
+ using namespace Parma_Polyhedra_Library;
+ using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+ if (!Prolog_is_integer(t))
+ throw not_unsigned_integer(t, where);
+
+ U d = 0;
+ long l;
+ if (Prolog_get_long(t, &l))
+ if (l < 0)
+ throw not_unsigned_integer(t, where);
+ else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
+ throw Prolog_unsigned_out_of_range(t, where,
+ std::numeric_limits<U>::max());
+ else
+ d = l;
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(v);
+ Prolog_get_Coefficient(t, v);
+ if (v < 0)
+ throw not_unsigned_integer(t, where);
+ Result r = assign_r(d, raw_value(v), ROUND_IGNORE);
+ if (result_overflow(r))
+ throw Prolog_unsigned_out_of_range(t, where,
+ std::numeric_limits<U>::max());
+ }
+ return d;
+}
+
+Prolog_atom
+term_to_boolean(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+interval_term(const Parma_Polyhedra_Library::Rational_Box::interval_type& i);
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_width(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_representation(Prolog_term_ref t,
+ const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_overflow(Prolog_term_ref t, const char* where);
+
+template <typename T>
+T*
+term_to_handle(Prolog_term_ref t, const char* where) {
+ if (Prolog_is_address(t)) {
+ void* p;
+ if (Prolog_get_address(t, &p))
+ return static_cast<T*>(p);
+ }
+ throw ppl_handle_mismatch(t, where);
+}
+
+enum Boundary_Kind {
+ LOWER_BOUNDARY,
+ UPPER_BOUNDARY
+};
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+ bool& finite, bool& closed,
+ Parma_Polyhedra_Library::Coefficient& n, Parma_Polyhedra_Library::Coefficient& d);
+
+Parma_Polyhedra_Library::Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t);
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Parma_Polyhedra_Library::Coefficient& n);
+
+bool
+unify_long(Prolog_term_ref t, long l);
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l);
+
+Parma_Polyhedra_Library::Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Constraint
+build_constraint(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Congruence
+build_congruence(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Generator
+build_generator(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+get_linear_expression(const Parma_Polyhedra_Library::Linear_Expression& le);
+
+Prolog_term_ref
+constraint_term(const Parma_Polyhedra_Library::Constraint& c);
+
+Prolog_term_ref
+congruence_term(const Parma_Polyhedra_Library::Congruence& cg);
+
+Prolog_term_ref
+generator_term(const Parma_Polyhedra_Library::Generator& g);
+
+Prolog_term_ref
+grid_generator_term(const Parma_Polyhedra_Library::Grid_Generator& g);
+
+Parma_Polyhedra_Library::Variable
+term_to_Variable(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_control_parameter_name(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_control_parameter_value(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_pip_problem_control_parameter_name(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_pip_problem_control_parameter_value(Prolog_term_ref t, const char* where);
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where);
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b);
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd);
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize();
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL();
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding();
+
+extern "C" Prolog_foreign_return_type
+ppl_irrational_precision(Prolog_term_ref t_p);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_irrational_precision(Prolog_term_ref t_p);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea);
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_csecs);
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_deterministic_timeout(Prolog_term_ref t_unscaled_weight,
+ Prolog_term_ref t_scale);
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_deterministic_timeout();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_bits(Prolog_term_ref t_bits);
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min);
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+ Prolog_term_ref t_clist,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_opt,
+ Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+ Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+ Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+ Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+ Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_get_control_parameter(Prolog_term_ref t_mip,
+ Prolog_term_ref t_cp_name,
+ Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+ Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+ Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+ Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_control_parameter(Prolog_term_ref t_mip,
+ Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+ Prolog_term_ref t_g,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_ascii_dump(Prolog_term_ref t_mip);
+
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_space_dimension(Prolog_term_ref t_nd,
+ Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_PIP_Problem(Prolog_term_ref t_pip_source,
+ Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem(Prolog_term_ref t_dim,
+ Prolog_term_ref t_cs,
+ Prolog_term_ref t_params,
+ Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_PIP_Problem(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_space_dimension(Prolog_term_ref t_pip, Prolog_term_ref t_sd);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_parameter_space_dimensions(Prolog_term_ref t_pip,
+ Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_constraints(Prolog_term_ref t_pip, Prolog_term_ref t_cs);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_get_control_parameter(Prolog_term_ref t_pip,
+ Prolog_term_ref t_cp_name,
+ Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_clear(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_pip,
+ Prolog_term_ref t_num_vars,
+ Prolog_term_ref t_num_params);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_to_parameter_space_dimensions(Prolog_term_ref t_pip,
+ Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraint(Prolog_term_ref t_pip, Prolog_term_ref t_c);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraints(Prolog_term_ref t_pip,
+ Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_control_parameter(Prolog_term_ref t_pip,
+ Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_is_satisfiable(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solve(Prolog_term_ref t_pip, Prolog_term_ref t_status);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solution(Prolog_term_ref t_pip,
+ Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_optimizing_solution(Prolog_term_ref t_pip,
+ Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_has_big_parameter_dimension(Prolog_term_ref t_pip,
+ Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_big_parameter_dimension(Prolog_term_ref t_pip,
+ Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_OK(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_ascii_dump(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_constraints(Prolog_term_ref t_tree_node,
+ Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_solution(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_decision(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_bottom(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_artificials(Prolog_term_ref t_tree_node,
+ Prolog_term_ref t_artlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_OK(Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_parametric_values(Prolog_term_ref t_pip_sol,
+ Prolog_term_ref t_var,
+ Prolog_term_ref t_pvalue_list);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_true_child(Prolog_term_ref t_pip_dec,
+ Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_false_child(Prolog_term_ref t_pip_dec,
+ Prolog_term_ref t_pip_tree);
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+#include "ppl_prolog_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/Prolog/ppl_prolog_common_inlines.hh b/interfaces/Prolog/ppl_prolog_common_inlines.hh
new file mode 100644
index 0000000..e759bb4
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common_inlines.hh
@@ -0,0 +1,88 @@
+/* Common part of the Prolog interfaces: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_inlines_hh
+#define PPL_ppl_prolog_common_inlines_hh 1
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+#include <typeinfo>
+#include <iomanip>
+
+template <typename T>
+void
+Allocation_Tracker::insert(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+ std::cerr << "inserting " << typeid(*p).name()
+ << " at " << std::hex << (void*) p << std::endl;
+#endif
+ std::pair<Set::iterator, bool> stat = s.insert(p);
+ if (!stat.second) {
+ std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+ " two objects at the same address at the same time?!"
+ << std::endl;
+ abort();
+ }
+}
+
+template <typename T>
+void
+Allocation_Tracker::weak_insert(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+ std::cerr << "inserting weak " << typeid(*p).name()
+ << " at " << std::hex << (void*) p << std::endl;
+#endif
+ weak_s.insert(p);
+}
+
+template <typename T>
+void
+Allocation_Tracker::remove(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+ std::cerr << "removing " << typeid(*p).name()
+ << " at " << std::hex << (void*) p << std::endl;
+#endif
+ if (s.erase(p) != 1) {
+ std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+ " attempt to deallocate a nonexistent polyhedron."
+ << std::endl;
+ abort();
+ }
+}
+
+template <typename T>
+void
+Allocation_Tracker::check(const T* p) const {
+ if (s.find(p) == s.end()
+ && weak_s.find(p) == weak_s.end()) {
+ std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+ " attempt to access a nonexistent "
+ << typeid(*p).name()
+ << " at " << std::hex << (void*) p << std::endl;
+ abort();
+ }
+}
+
+#endif // PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+#endif // !defined(PPL_ppl_prolog_common_inlines_hh)
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am
new file mode 100644
index 0000000..dc574e6
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.am
@@ -0,0 +1,87 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+ppl_prolog_generated_test_common.pl \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4 \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+expected_pgt
+
+check-local: ppl_prolog_generated_test.stamp
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4
+
+ppl_prolog_generated_test.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_prolog_generated_test_pl.m4 \
+ > ppl_prolog_generated_test_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_generated_test_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_generated_test_blob
+ rm -f ppl_prolog_generated_test_blob
+ echo timestamp >$@
+
+CLEANFILES = \
+ at required_instantiations_prolog_generated_test_sources@ \
+ppl_prolog_generated_test.stamp \
+ppl_prolog_generated_test_main.pl
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Prolog/tests/Makefile.in b/interfaces/Prolog/tests/Makefile.in
new file mode 100644
index 0000000..121bcae
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.in
@@ -0,0 +1,611 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+ppl_prolog_generated_test_common.pl \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4 \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+expected_pgt
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4
+
+CLEANFILES = \
+ at required_instantiations_prolog_generated_test_sources@ \
+ppl_prolog_generated_test.stamp \
+ppl_prolog_generated_test_main.pl
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-generic \
+ clean-libtool cscopelist-am ctags-am distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am
+
+
+check-local: ppl_prolog_generated_test.stamp
+
+ppl_prolog_generated_test.stamp: $(interface_generator_dependencies)
+ $(M4) --prefix-builtin -I../.. \
+ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ $(srcdir)/ppl_interface_generator_prolog_generated_test_pl.m4 \
+ > ppl_prolog_generated_test_blob
+ $(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_generated_test_blob
+ $(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_generated_test_blob
+ rm -f ppl_prolog_generated_test_blob
+ echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/tests/ack.clpq b/interfaces/Prolog/tests/ack.clpq
new file mode 100644
index 0000000..9e3c4e3
--- /dev/null
+++ b/interfaces/Prolog/tests/ack.clpq
@@ -0,0 +1,5 @@
+ack(0, N, N+1).
+ack(M, 0, R) :-
+ { M >= 1 }, ack(M-1, 1, R).
+ack(M, N, R) :-
+ { M >= 1, N >= 1 }, ack(M, N-1, T), ack(M-1, T, R).
diff --git a/interfaces/Prolog/tests/ackn.clpq b/interfaces/Prolog/tests/ackn.clpq
new file mode 100644
index 0000000..3f25deb
--- /dev/null
+++ b/interfaces/Prolog/tests/ackn.clpq
@@ -0,0 +1,6 @@
+ack(M, N, R) :-
+ { M = 0, R = N+1 }.
+ack(M, N, R) :-
+ { M >= 1, N = 0, M = M1+1 }, ack(M1, 1, R).
+ack(M, N, R) :-
+ { M >= 1, N >= 1, M = M1+1, N = N1+1 }, ack(M, N1, T), ack(M1, T, R).
diff --git a/interfaces/Prolog/tests/clpq.pl b/interfaces/Prolog/tests/clpq.pl
new file mode 100644
index 0000000..776dba3
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq.pl
@@ -0,0 +1,805 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% Used to store the names of variables occurring in the original goal
+% as a list of the form [ Name1 = Variable1, ... ]
+:- dynamic(original_goal_variables/1).
+
+
+% solve(+Goals, +Variable_Names)
+%
+% Tries to solve the query `Goals' and to present the results
+% to the user by referring to the original variable names
+% contained in `Variable_Names'.
+
+solve(Goals, Variable_Names) :-
+ numvars(Goals, 0, Dims),
+ assertz(original_goal_variables(Variable_Names)),
+ % The initial polyhedron is initialised with
+ % `Dims' dimensions, the number of variables in `Goals'.
+ ppl_new_C_Polyhedron_from_space_dimension(Dims, universe, Polyhedron),
+ % Try to reduce `Goals' to the empty continuation.
+ (solve(Goals, true, Polyhedron) ->
+ Failed = no
+ ;
+ Failed = yes
+ ),
+ % On failure, cleanup must occur anyway.
+ % The one who creates the polyhedron must delete it.
+ ppl_delete_Polyhedron(Polyhedron),
+ % Further cleaning.
+ retract(original_goal_variables(_)),
+ Failed == no.
+
+
+solve(true, true, Polyhedron) :-
+ !,
+ % It is time to print the result and see if the user
+ % wants to look for more solutions.
+ ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Q),
+ original_goal_variables(Variable_Names),
+ length(Variable_Names, Dims),
+ ppl_Polyhedron_remove_higher_space_dimensions(Q, Dims),
+ ppl_Polyhedron_get_constraints(Q, CS),
+ write_constraints(CS, Variable_Names),
+ ppl_delete_Polyhedron(Q),
+ % More?
+ % If query_next_solution succeeds,
+ % then no more solutions are required.
+ query_next_solution.
+
+solve(true, (G, Goals), Polyhedron) :-
+ !,
+ solve(G, Goals, Polyhedron).
+
+solve((A, B), Goals, Polyhedron) :-
+ !,
+ solve(A, (B, Goals), Polyhedron).
+
+solve({}, Goals, Polyhedron) :-
+ !,
+ % The empty set of constraints is equivalent to true.
+ solve(true, Goals, Polyhedron).
+
+solve({ Constraints }, Goals, Polyhedron) :-
+ !,
+ % Solve the constraints using the constraint solver.
+ solve_constraints(Constraints, Polyhedron),
+ solve(true, Goals, Polyhedron).
+
+% Built-ins may be added here.
+
+solve(Atom, Goals, Polyhedron) :-
+ % Here is a choicepoint: possibly different clauses
+ % will be selected on backtracking.
+ % NOTE: we may fail to find (another) clause,
+ % but we have allocated nothing yet.
+ select_clause(Atom, Head, Body),
+
+ % Copy the current polyhedron and work on the copy.
+ % NOTE: the copy is under our responsibility, i.e.,
+ % it is our job to delete it, sooner or later.
+ ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Poly_Copy),
+
+ % Rename the selected clause apart and extend the polyhedron.
+ ppl_Polyhedron_space_dimension(Poly_Copy, Dims),
+ numvars((Head, Body), Dims, New_Dims),
+ Added_Dims is New_Dims - Dims,
+ ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+ % Parameter passing.
+ parameter_passing(Atom, Head, PP_Constraints),
+
+ % Try to solve the body augmented with the parameter passing equations.
+ (solve(PP_Constraints, (Body, Goals), Poly_Copy) ->
+ Failed = no
+ ;
+ Failed = yes
+ ),
+ % Our copy must be thrown anyway.
+ ppl_delete_Polyhedron(Poly_Copy),
+ Failed == no.
+
+
+parameter_passing(Atom, Head, PP_Constraints) :-
+ Atom =.. [_|Actuals],
+ Head =.. [_|Formals],
+ (Actuals == [] ->
+ PP_Constraints = true
+ ;
+ build_pp_constraints(Actuals, Formals, Equations),
+ PP_Constraints = ({ Equations })
+ ).
+
+build_pp_constraints([A|Actuals], [F|Formals], Equations) :-
+ (Actuals == [] ->
+ Equations = (A = F)
+ ;
+ Equations = ((A = F), More_Equations),
+ build_pp_constraints(Actuals, Formals, More_Equations)
+ ).
+
+select_clause(Atom, Head, Body) :-
+ functor(Atom, F, N),
+ functor(Head, F, N),
+ user_clause(Head, Body).
+
+% The constraints are solved by adding them into the polyhedron.
+solve_constraints(Constraints, Polyhedron) :-
+ listize_constraints(Constraints, Constraints_List),
+ ppl_Polyhedron_add_constraints(Polyhedron, Constraints_List),
+ % Fail if `Polyhedron' became empty.
+ \+ ppl_Polyhedron_is_empty(Polyhedron).
+
+
+listize_constraints(C, LC) :-
+ listize_constraints(C, [], LC).
+
+listize_constraints((A, B), Rest, LC) :-
+ !,
+ listize_constraints(B, Rest, BRest),
+ listize_constraints(A, BRest, LC).
+listize_constraints(C, Rest, [C|Rest]).
+
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+ write(' more? '),
+ repeat,
+ flush_output(user_output),
+ get_code(user_input, C),
+ (
+ C == 59,
+ % Get rid of the EOL character.
+ get_code(user_input, _EOL)
+ ;
+ C == 10
+ ;
+ write('Action (";" for more choices, otherwise <return>): '),
+ eat_to_eol,
+ fail
+ ),
+ !,
+ C = 10.
+
+eat_to_eol :-
+ get_code(user_input, C),
+ (C == 10 ->
+ true
+ ;
+ eat_to_eol
+ ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+ catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+ read_program(P),
+ read_programs(Ps).
+
+read_program(Program) :-
+ (atom(Program) ->
+ true
+ ;
+ write_error(['read_program/1 - arg 1: expected file name, found ',
+ Program]),
+ fail
+ ),
+ (open_file_for_reading(Program, Stream) ->
+ File_Name = Program
+ ;
+ atom_concat(Program, '.clpq', File_Name),
+ (open_file_for_reading(File_Name, Stream) ->
+ true
+ ;
+ write_error(['read_program/1 - arg 1: file ',
+ Program, ' does not exist']),
+ fail
+ )
+ ),
+ (read_clauses(Stream) ->
+ close(Stream)
+ ;
+ write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+ close(Stream),
+ fail
+ ).
+
+read_clauses(Stream) :-
+ read(Stream, Clause),
+ (Clause \== end_of_file ->
+ (Clause = (Head :- Body) ->
+ assertz(user_clause(Head, Body))
+ ;
+ assertz(user_clause(Clause, true))
+ ),
+ read_clauses(Stream)
+ ;
+ true
+ ).
+
+%%%%%%%%%%%%%%%%%%%%% The User's Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+ write('clpq error: '),
+ write_error_aux(Message).
+
+write_error_aux([]) :-
+ nl.
+write_error_aux([H|T]) :-
+ write(H),
+ write_error_aux(T).
+
+main_loop :-
+ write('PPL clpq ?- '),
+ read_term(Command, [variable_names(VN)]),
+ % The above read leaves an EOL character in the input buffer:
+ % get rid of it.
+ eat_eol,
+ catch(do_command(Command, VN),
+ Exception,
+ (print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+ nl,
+ write('Error: an overflow has been detected by the PPL: '),
+ write(Cause),
+ nl,
+ !.
+
+print_exception_term(Exception) :-
+ nl,
+ writeq(Exception),
+ nl.
+
+clear_program :-
+ retract(user_clause(_, _)),
+ fail.
+clear_program.
+
+list_program :-
+ user_clause(Head, Body),
+ pp(Head, Body),
+ fail.
+list_program.
+
+pp(Head, Body) :-
+ % write(Head),
+ (Body == true ->
+ % write('.')
+ portray_clause(Head)
+ ;
+ % write(' :- '),
+ % write(Body)
+ portray_clause((Head :- Body))
+ ),
+ nl.
+
+do_command(end_of_file, _VN) :-
+ !.
+do_command(halt, _VN) :-
+ !.
+do_command(warranty, _VN) :-
+ !,
+ show_warranty,
+ main_loop_yes.
+do_command(copying, _VN) :-
+ !,
+ show_copying,
+ main_loop_yes.
+do_command(trace, _VN) :-
+ !,
+ trace,
+ main_loop_yes.
+do_command(notrace, _VN) :-
+ !,
+ notrace,
+ main_loop_yes.
+do_command(debug, _VN) :-
+ !,
+ debug,
+ main_loop_yes.
+do_command(nodebug, _VN) :-
+ !,
+ nodebug,
+ main_loop_yes.
+do_command(spy(Spec), _VN) :-
+ !,
+ spy(Spec),
+ main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+ !,
+ nospy(Spec),
+ main_loop_yes.
+do_command(nospyall, _VN) :-
+ !,
+ nospyall,
+ main_loop_yes.
+do_command([], _VN) :-
+ !,
+ (read_programs([]) ; true),
+ main_loop_yes.
+do_command([H|T], _VN) :-
+ !,
+ (read_programs([H|T]) ; true),
+ main_loop_yes.
+do_command(consult(Program), _VN) :-
+ !,
+ (read_program(Program) ; true),
+ main_loop_yes.
+do_command(reconsult(Program), VN) :-
+ !,
+ clear_program,
+ do_command(consult(Program), VN).
+do_command(listing, _VN) :-
+ !,
+ list_program,
+ main_loop_yes.
+do_command(statistics, _VN) :-
+ !,
+ statistics,
+ main_loop_yes.
+do_command(Query, VN) :-
+ solve(Query, VN),
+ main_loop_yes.
+do_command(_, _VN) :-
+ main_loop_no.
+
+main_loop_no :-
+ write(no),
+ nl,
+ main_loop.
+
+main_loop_yes :-
+ write(yes),
+ nl,
+ main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var(Var, Variable_Names) :-
+ member(Name=Var, Variable_Names),
+ !,
+ write(Name).
+
+negate_expr(Num*Var, Neg_Expr) :-
+ (Num < 0 ->
+ Neg_Num is -Num,
+ Neg_Expr = Neg_Num*Var
+ ;
+ Neg_Expr = Num*Var
+ ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+ negate_expr(Expr1, Neg_Expr1),
+ negate_expr(Expr2, Neg_Expr2).
+
+write_expr(Num*Var, Variable_Names) :-
+ (Num =:= 1 ->
+ true
+ ;
+ (Num =:= -1 ->
+ write('-')
+ ;
+ write(Num),
+ write('*')
+ )
+ ),
+ write_var(Var, Variable_Names).
+write_expr(E + Num*Var, Variable_Names) :-
+ write_expr(E, Variable_Names),
+ (Num < 0 ->
+ write(' - '),
+ Neg_Num is -Num,
+ write_expr(Neg_Num*Var, Variable_Names)
+ ;
+ write(' + '),
+ write_expr(Num*Var, Variable_Names)
+ ).
+
+write_constraint(Expr = Num, Variable_Names) :-
+ write_expr(Expr, Variable_Names),
+ write(' = '),
+ write(Num).
+write_constraint(Expr >= Num, Variable_Names) :-
+ (Num < 0 ->
+ negate_expr(Expr, Neg_Expr),
+ write_expr(Neg_Expr, Variable_Names),
+ write(' =< '),
+ Neg_Num is -Num,
+ write(Neg_Num)
+ ;
+ write_expr(Expr, Variable_Names),
+ write(' >= '),
+ write(Num)
+ ).
+
+write_constraints([], _Variable_Names).
+write_constraints([C|CS], Variable_Names) :-
+ write_constraint(C, Variable_Names),
+ nl,
+ write_constraints(CS, Variable_Names).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% numvars(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+
+numvars('$VAR'(In_N), In_N, Out_N) :-
+ !,
+ Out_N is In_N + 1.
+numvars(Term, In_N, Out_N) :-
+ Term =.. [_|Args],
+ numvars_list(Args, In_N, Out_N).
+
+numvars_list([], In_N, In_N).
+numvars_list([Arg|Args], In_N, Out_N) :-
+ numvars(Arg, In_N, Tmp_N),
+ numvars_list(Args, Tmp_N, Out_N).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+ write('---Type <return> to continue, or q <return> to quit---'),
+ flush_output(user_output),
+ get_code(user_input, C),
+ (
+ C == 10
+ ;
+ eat_eol
+ ),
+ !,
+ C \== 113.
+
+show_copying :-
+ eat_eol,
+ write('\
+ GNU GENERAL PUBLIC LICENSE\n\
+ Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+ Preamble\n\
+\n\
+ The licenses for most software are designed to take away your\n\
+freedom to share and change it. By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users. This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it. (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.) You can apply it to\n\
+your programs, too.\n\
+\n\
+ When we speak of free software, we are referring to freedom, not\n\
+price. Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+ next_or_quit,
+ write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+ To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+ For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have. You must make sure that they, too, receive or can get the\n\
+source code. And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+ We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+ Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software. If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+ next_or_quit,
+ write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+ Finally, any free program is threatened constantly by software\n\
+patents. We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary. To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+ The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+ GNU GENERAL PUBLIC LICENSE\n\
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+ 0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License. The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language. (Hereinafter, translation is included without limitation in\n'),
+ next_or_quit,
+ write('\
+the term "modification".) Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope. The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+ 1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+ 2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+ next_or_quit,
+ write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+ a) You must cause the modified files to carry prominent notices\n\
+ stating that you changed the files and the date of any change.\n\
+\n\
+ b) You must cause any work that you distribute or publish, that in\n\
+ whole or in part contains or is derived from the Program or any\n\
+ part thereof, to be licensed as a whole at no charge to all third\n\
+ parties under the terms of this License.\n\
+\n\
+ c) If the modified program normally reads commands interactively\n\
+ when run, you must cause it, when started running for such\n\
+ interactive use in the most ordinary way, to print or display an\n\
+ announcement including an appropriate copyright notice and a\n\
+ notice that there is no warranty (or else, saying that you provide\n\
+ a warranty) and that users may redistribute the program under\n\
+ these conditions, and telling the user how to view a copy of this\n\
+ License. (Exception: if the Program itself is interactive but\n\
+ does not normally print such an announcement, your work based on\n\
+ the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole. If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+ next_or_quit,
+ write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works. But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+ 3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+ a) Accompany it with the complete corresponding machine-readable\n'),
+ next_or_quit,
+ write('\
+ source code, which must be distributed under the terms of Sections\n\
+ 1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+ b) Accompany it with a written offer, valid for at least three\n\
+ years, to give any third party, for a charge no more than your\n\
+ cost of physically performing source distribution, a complete\n\
+ machine-readable copy of the corresponding source code, to be\n\
+ distributed under the terms of Sections 1 and 2 above on a medium\n\
+ customarily used for software interchange; or,\n\
+\n\
+ c) Accompany it with the information you received as to the offer\n\
+ to distribute corresponding source code. (This alternative is\n\
+ allowed only for noncommercial distribution and only if you\n\
+ received the program in object code or executable form with such\n\
+ an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it. For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable. However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+ next_or_quit,
+ write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+ 4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License. Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+ 5. You are not required to accept this License, since you have not\n\
+signed it. However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works. These actions are\n\
+prohibited by law if you do not accept this License. Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+ next_or_quit,
+ write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+ 6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions. You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+ 7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License. If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all. For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+ next_or_quit,
+ write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices. Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+ 8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+ next_or_quit,
+ write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded. In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+ 9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time. Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number. If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation. If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+ 10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission. For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+ next_or_quit,
+ write('\
+make exceptions for this. Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+ !.
+show_copying.
+
+show_warranty :-
+ write('\
+ NO WARRANTY\n\
+\n\
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+ write('\
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+ main_loop.
diff --git a/interfaces/Prolog/tests/clpq2.pl b/interfaces/Prolog/tests/clpq2.pl
new file mode 100644
index 0000000..be5b062
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq2.pl
@@ -0,0 +1,1122 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% solve_query(+Goals, +Variable_Name_Table, -Polyhedra)
+%
+% Tries to solve the query 'Goals'.
+% 'Variable_Name_Table' is a list of input variable names and
+% the corresponding variable.
+% 'Polyhedra' are the live polyhedra; the head of the list
+% represents the result of the computation.
+
+solve_query(Goals, VN, Polys_Out) :-
+ % The initial polyhedron is initialised with 0 dimensions
+ % We use the NNC topology so that we can handle strict constraints.
+ Topology = nnc,
+ ppl_new_NNC_Polyhedron_from_space_dimension(0, universe, Poly),
+ % On backtracking, clean up the unwanted polyhedron
+ cleanup(Poly),
+
+ % Try to reduce `Goals'.
+ solve(Topology, Goals, [Poly], Polys_Out2),
+
+ % Use the last polyhedron `Poly_Out' that has been added to the list
+ % for generating the resulting set of constraints.
+ Polys_Out2 = [Poly_Out|_],
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly_Out, Q),
+ % On backtracking, clean up the unwanted polyhedron
+ cleanup(Q),
+
+ % Now find and sort all the PPL dimensions for variables
+ % that occur in bindings to external variables.
+ terms_to_wanted_dims(VN, [], Num_List),
+ sort(Num_List, Sorted_Num_List),
+
+ % We want to remove (project away) all other dimensions.
+ ppl_Polyhedron_space_dimension(Q, Dims),
+ get_unwanted_dims(Sorted_Num_List, Dims, Unwanted_PPL_Vars),
+ ppl_Polyhedron_remove_space_dimensions(Q, Unwanted_PPL_Vars),
+
+ % Get the constraints.
+ ppl_Polyhedron_get_constraints(Q, CS),
+
+ % Print the result.
+ write_bindings(VN, Sorted_Num_List),
+ write_constraints(CS, Sorted_Num_List, VN),
+ Polys_Out = [Q|Polys_Out2].
+
+solve(_, true, Polys, Polys) :-
+ % If the goal is true, we can return the input list of
+ % non-empty polyhedron as output.
+ % The head of the list will contain the solution to the query.
+ !.
+
+solve(T, (A, B), Polys_In, Polys_Out) :-
+ !,
+ % Conjunction is solved using the output list of non-empty
+ % polyhedra from the first component for input to the second.
+ solve(T, A, Polys_In, Polys_Tmp),
+ solve(T, B, Polys_Tmp, Polys_Out).
+
+solve(T, (A; B), Polys_In, Polys_Out) :-
+ !,
+ % Disjunction is dealt with by making a copy of the polyhedron
+ % before starting each branch.
+ Polys_In = [Poly|_],
+ (
+ (
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+ % On backtracking, clean up the unwanted polyhedron
+ cleanup(Q),
+ solve(T, A, [Q|Polys_In], Polys_Out)
+ )
+ ;
+ (
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+ % On backtracking, we clean up the unwanted polyhedron
+ cleanup(Q),
+ solve(T, B, [Q|Polys_In], Polys_Out)
+ )
+ ).
+
+solve(_, {}, Polys, Polys) :-
+ % If the goal is an empty set of constraints, then this is
+ % the same as for `true' and we can return the input list of
+ % non-empty polyhedron as output.
+ !.
+
+solve(_, { Constraints }, [Poly|Polys], [Poly|Polys]) :-
+ !,
+ % Solve the constraints using the constraint solver.
+ % Rename the selected clause apart and extend the polyhedron.
+ ppl_Polyhedron_space_dimension(Poly, Dims),
+
+ % Change any free variables into PPL variables.
+ term_to_PPL_term(Constraints, Dims, New_Dims),
+ Added_Dims is New_Dims - Dims,
+ ppl_Polyhedron_add_space_dimensions_and_embed(Poly, Added_Dims),
+
+ % Make the sequence of constraints into a list
+ % and check we do have constraints.
+ constraints_to_list(Constraints, Constraints_List),
+
+ ppl_Polyhedron_add_constraints(Poly, Constraints_List),
+
+ % Fail if `Poly' became empty.
+ \+ ppl_Polyhedron_is_empty(Poly).
+
+% Built-ins may be added here.
+
+% read/1
+solve(_, read(N), Polys, Polys) :-
+ !,
+ read(N),
+ get_code(user_input, _C).
+
+% write/1
+solve(_, write(Message), Polys, Polys) :-
+ !,
+ write(Message).
+
+% nl/0
+solve(_, nl, Polys, Polys) :-
+ !,
+ nl.
+
+solve(Topology, Atom, [Poly|Polys], Polys_Out) :-
+ % Here is a choicepoint: possibly different clauses
+ % will be selected on backtracking.
+ % NOTE: we may fail to find (another) clause,
+ % but we have allocated nothing yet.
+ select_clause(Atom, Head, Body),
+ ppl_Polyhedron_space_dimension(Poly, Dims),
+
+ % Copy the current polyhedron and work on the copy.
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Poly_Copy),
+ % On backtracking, clean up the unwanted polyhedron
+ cleanup(Poly_Copy),
+
+ % Parameter passing.
+ parameter_passing(Atom, Head, Binding_Constraints),
+
+ % Change any free variables into PPL variables.
+ terms_to_PPL_terms(Binding_Constraints, Dims, New_Dims),
+ Added_Dims is New_Dims - Dims,
+ ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+
+ % First solve the parameter passing equations.
+ ppl_Polyhedron_add_constraints(Poly_Copy, Binding_Constraints),
+ \+ ppl_Polyhedron_is_empty(Poly_Copy),
+ % Then solve the body.
+ solve(Topology, Body, [Poly_Copy, Poly|Polys], Polys_Soln_Out),
+
+ % Now remove any dimensions that are higher than
+ % previously and higher than any PPL variables in the atom.
+ term_to_wanted_dims(Atom, [], Num_List),
+ Max_Wanted1 is Dims - 1,
+ max(Num_List, Max_Wanted1, Max_Wanted),
+ Un_Wanted is Max_Wanted + 1,
+
+ % Copy the current polyhedron and work on the copy.
+ Polys_Soln_Out = [Poly_Soln|_],
+ ppl_new_C_Polyhedron_from_C_Polyhedron(Poly_Soln, Poly_Soln_Copy),
+ % On backtracking, clean up the unwanted polyhedron
+ cleanup(Poly_Soln_Copy),
+
+ % We want to remove (project away) all other dimensions.
+ ppl_Polyhedron_remove_higher_space_dimensions(Poly_Soln_Copy, Un_Wanted),
+
+ % The list of live polyhedra must be returned.
+ Polys_Out = [Poly_Soln_Copy|Polys_Soln_Out].
+
+parameter_passing(Atom, Head, Bindings) :-
+ Atom =.. [_|Actuals],
+ Head =.. [_|Formals],
+ parameter_passing_terms(Actuals, Formals, Bindings).
+
+% When the direct binding exists, we use unification.
+% Otherwise, we add the constraint.
+% By only adding new variables when needed, the computation
+% is much more efficient.
+parameter_passing_terms([], [], []).
+parameter_passing_terms([A|Actuals], [F|Formals], New_Bindings) :-
+ parameter_passing_terms(Actuals, Formals, Bindings),
+ (int_expr(F) ->
+ F1 is F
+ ;
+ F1 = F
+ ),
+ (A = F1 ->
+ New_Bindings = Bindings
+ ;
+ parameter_passing_term(A, F1, Bindings, New_Bindings)
+ ).
+
+parameter_passing_term(A, F, Bindings, New_Bindings) :-
+ ((int_expr(A) ; int_expr(F) ; A = '$VAR'(_) ; F = '$VAR'(_)) ->
+ New_Bindings = [(A = F)|Bindings]
+ ;
+ A =.. [AFunct|Aargs],
+ F =.. [FFunct|Fargs],
+ (AFunct == FFunct ->
+ % Functors agree so we process the arguments.
+ parameter_passing_terms(Aargs, Fargs, Bindings1),
+ append(Bindings1, Bindings, New_Bindings)
+ ;
+ % Unification fails so we force the constraints to fail.
+ New_Bindings = [0 = 1]
+ )
+ ).
+
+select_clause(Atom, Head, Body) :-
+ functor(Atom, F, N),
+ functor(Head, F, N),
+ user_clause(Head, Body).
+
+delete_all_polyhedra([]).
+delete_all_polyhedra([Polyhedron|Polyhedra]):-
+ ppl_delete_Polyhedron(Polyhedron),
+ delete_all_polyhedra(Polyhedra).
+
+% To prevent leaks:
+% First succeed and then, on backtracking,
+% remove the unwanted polyhedron before failing.
+cleanup(_Polyhedron).
+cleanup(Polyhedron) :-
+ ppl_delete_Polyhedron(Polyhedron),
+ fail.
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+ write(' more? '),
+ repeat,
+ flush_output(user_output),
+ get_code(user_input, C),
+ (
+ C == 59,
+ % Get rid of the EOL character.
+ get_code(user_input, _EOL)
+ ;
+ C == 10
+ ;
+ write('Action (";" for more choices, otherwise <return>): '),
+ eat_to_eol,
+ fail
+ ),
+ !,
+ C = 10.
+
+eat_to_eol :-
+ get_code(user_input, C),
+ (C == 10 ->
+ true
+ ;
+ eat_to_eol
+ ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+ catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+ read_program(P),
+ read_programs(Ps).
+
+read_program(Program) :-
+ (atom(Program) ->
+ true
+ ;
+ write_error(['read_program/1 - arg 1: expected file name, found ',
+ Program]),
+ fail
+ ),
+ (open_file_for_reading(Program, Stream) ->
+ File_Name = Program
+ ;
+ atom_concat(Program, '.clpq', File_Name),
+ (open_file_for_reading(File_Name, Stream) ->
+ true
+ ;
+ write_error(['read_program/1 - arg 1: file ',
+ Program, ' does not exist']),
+ fail
+ )
+ ),
+ (read_clauses(Stream) ->
+ close(Stream)
+ ;
+ write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+ close(Stream),
+ fail
+ ).
+
+read_clauses(Stream) :-
+ read(Stream, Clause),
+ (Clause \== end_of_file ->
+ (Clause = (Head :- Body) ->
+ assertz(user_clause(Head, Body))
+ ;
+ assertz(user_clause(Clause, true))
+ ),
+ read_clauses(Stream)
+ ;
+ true
+ ).
+
+%%%%%%%%%%%%%%%%%%%%% The Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+ write('clpq error: '),
+ write_error_aux(Message).
+
+write_error_aux([]) :-
+ nl.
+write_error_aux([H|T]) :-
+ write(H),
+ write_error_aux(T).
+
+main_loop :-
+ write('PPL clpq ?- '),
+ read_term(Command, [variable_names(VN)]),
+ eat_eol,
+ catch(do_command(Command, VN),
+ Exception,
+ (print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+ nl,
+ write('Error: an overflow has been detected by the PPL: '),
+ write(Cause),
+ nl,
+ !.
+
+print_exception_term(Exception) :-
+ nl,
+ writeq(Exception),
+ nl.
+
+clear_program :-
+ retract(user_clause(_, _)),
+ fail.
+clear_program.
+
+list_program :-
+ user_clause(Head, Body),
+ pp(Head, Body),
+ fail.
+list_program.
+
+pp(Head, Body) :-
+ (Body == true ->
+ portray_clause(Head)
+ ;
+ portray_clause((Head :- Body))
+ ),
+ nl.
+
+do_command(end_of_file, _VN) :-
+ !.
+do_command(halt, _VN) :-
+ !,
+ clear_program.
+do_command(warranty, _VN) :-
+ !,
+ show_warranty,
+ main_loop_yes.
+do_command(copying, _VN) :-
+ !,
+ show_copying,
+ main_loop_yes.
+do_command(trace, _VN) :-
+ !,
+ trace,
+ main_loop_yes.
+do_command(notrace, _VN) :-
+ !,
+ notrace,
+ main_loop_yes.
+do_command(debug, _VN) :-
+ !,
+ debug,
+ main_loop_yes.
+do_command(nodebug, _VN) :-
+ !,
+ nodebug,
+ main_loop_yes.
+do_command(spy(Spec), _VN) :-
+ !,
+ spy(Spec),
+ main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+ !,
+ nospy(Spec),
+ main_loop_yes.
+do_command(nospyall, _VN) :-
+ !,
+ nospyall,
+ main_loop_yes.
+do_command([], _VN) :-
+ !,
+ (read_programs([]) ; true),
+ main_loop_yes.
+do_command([H|T], _VN) :-
+ !,
+ (read_programs([H|T]); true),
+ main_loop_yes.
+do_command(consult(Program), _VN) :-
+ !,
+ (read_program(Program) ; true),
+ main_loop_yes.
+do_command(reconsult(Program), VN) :-
+ !,
+ clear_program,
+ do_command(consult(Program), VN).
+do_command(listing, _VN) :-
+ !,
+ list_program,
+ main_loop_yes.
+do_command(statistics, _VN) :-
+ !,
+ statistics,
+ main_loop_yes.
+
+do_command(Query, VN) :-
+ solve_query(Query, VN, Polys_Out),
+ % See if the user wants to look for more solutions.
+ query_next_solution,
+ % When finished, remove remaining polyhedra.
+ delete_all_polyhedra(Polys_Out),
+ main_loop_yes.
+
+do_command(_, _VN) :-
+ main_loop_no.
+
+main_loop_no :-
+ write(no),
+ nl,
+ main_loop.
+
+main_loop_yes :-
+ write(yes),
+ nl,
+ main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var('$VAR'(N), _Name_List) :-
+ write('_'),
+ write('$VAR'(N)).
+
+negate_expr(Num*Var, Neg_Expr) :-
+ (Num < 0 ->
+ Neg_Num is -Num,
+ Neg_Expr = Neg_Num*Var
+ ;
+ Neg_Expr = Num*Var
+ ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+ negate_expr(Expr1, Neg_Expr1),
+ negate_expr(Expr2, Neg_Expr2).
+
+write_expr('$VAR'(N), Var_List, VN) :-
+ !,
+ position2element(N, Var_List, M),
+ (member((A = '$VAR'(M)), VN) ->
+ write(A)
+ ;
+ write('_'),
+ write('$VAR'(N))
+ ).
+write_expr(Num*Var, Variable_Names, VN) :-
+ (Num =:= 1 ->
+ true
+ ;
+ (Num =:= -1 ->
+ write('-')
+ ;
+ write(Num),
+ write('*')
+ )
+ ),
+ write_expr(Var, Variable_Names, VN).
+write_expr(E + Num*Var, Variable_Names, VN) :-
+ write_expr(E, Variable_Names, VN),
+ (Num < 0 ->
+ write(' - '),
+ Neg_Num is -Num,
+ write_expr(Neg_Num*Var, Variable_Names, VN)
+ ;
+ write(' + '),
+ write_expr(Num*Var, Variable_Names, VN)
+ ).
+
+write_constraint(Expr = Num, Variable_Names, VN) :-
+ (var(Num) ->
+ fail
+ ;
+ write_expr(Expr, Variable_Names, VN),
+ write(' = '),
+ (integer(Num) ->
+ write(Num)
+ ;
+ Num = rat(Int, 1),
+ write(Int)
+ )
+ ).
+write_constraint(Expr >= Num, Variable_Names, VN) :-
+ (Num < 0 ->
+ negate_expr(Expr, Neg_Expr),
+ write_expr(Neg_Expr, Variable_Names, VN),
+ write(' =< '),
+ Neg_Num is -Num,
+ write(Neg_Num)
+ ;
+ write_expr(Expr, Variable_Names, VN),
+ write(' >= '),
+ write(Num)
+ ).
+write_constraint(Expr > Num, Variable_Names, VN) :-
+ (Num < 0 ->
+ negate_expr(Expr, Neg_Expr),
+ write_expr(Neg_Expr, Variable_Names, VN),
+ write(' < '),
+ Neg_Num is -Num,
+ write(Neg_Num)
+ ;
+ write_expr(Expr, Variable_Names, VN),
+ write(' > '),
+ write(Num)
+ ).
+
+write_constraints([], _Variable_Names, _VN).
+write_constraints([C|CS], Variable_Names, VN) :-
+ (write_constraint(C, Variable_Names, VN) ->
+ nl
+ ;
+ true
+ ),
+ write_constraints(CS, Variable_Names, VN).
+
+write_bindings([], _Var_List).
+write_bindings([(A = Term)|VN], Var_List) :-
+ (var(Term) ->
+ (write(A), write(' = '), write(Term),
+ nl)
+ ;
+ (Term = '$VAR'(_) ->
+ true
+ ;
+ (write(A),
+ write(' = '),
+ write_termexpr(Term, Var_List),
+ nl)
+ )
+ ),
+ write_bindings(VN, Var_List).
+
+write_termexpr('$VAR'(N), Var_List) :-
+ !,
+ element2position(N, Var_List, M),
+ write('_'),
+ write('$VAR'(M)).
+write_termexpr(Term, _Var_List) :-
+ int_expr(Term),
+ !,
+ % FIXME: restore the original `N is Term' as soon as XSB is fixed.
+ % See http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html
+ call(N is Term),
+ write(N).
+write_termexpr(Term, Var_List) :-
+ Term = [_|_],
+ !,
+ write('['),
+ write_listexprs(Term, Var_List),
+ write(']').
+write_termexpr(Term, Var_List) :-
+ Term =.. [F|Args],
+ (Args = [] ->
+ write(F)
+ ;
+ write(F),
+ write('('),
+ write_termexprs(Args, Var_List),
+ write(')')
+ ).
+write_termexprs([], _Var_List).
+write_termexprs([Term|Terms], Var_List) :-
+ write_termexpr(Term, Var_List),
+ (Terms \= [] ->
+ write(',')
+ ;
+ true
+ ),
+ write_termexprs(Terms, Var_List).
+
+write_listexprs(Terms, _Var_List) :-
+ var(Terms),
+ !,
+ write('|'),
+ write(Terms).
+write_listexprs([], _Var_List) :-
+ !.
+write_listexprs([Term|Terms], Var_List) :-
+ write_termexpr(Term, Var_List),
+ ((Terms == []; var(Terms)) ->
+ true
+ ;
+ write(',')
+ ),
+ write_listexprs(Terms, Var_List).
+
+int_expr(I) :-
+ nonvar(I),
+ int_expr_aux(I).
+int_expr_aux(I) :-
+ integer(I),
+ !.
+int_expr_aux(I+J) :-
+ !,
+ int_expr(I),
+ int_expr(J).
+int_expr_aux(I-J) :-
+ !,
+ int_expr(I),
+ int_expr(J).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% term_to_wanted_dims(?Term, -List_of_Integers)
+%
+% Takes a term and returns list of numbers in the PPL variables
+% of the form '$VAR'(k).
+
+term_to_wanted_dims(V, Ns, Ns) :-
+ var(V),
+ !.
+term_to_wanted_dims('$VAR'(N), Ns, [N|Ns]) :-
+ !.
+term_to_wanted_dims(Term, Ns_In, Ns_Out) :-
+ Term =.. [_F|Args],
+ terms_to_wanted_dims(Args, Ns_In, Ns_Out).
+
+terms_to_wanted_dims([], Ns, Ns).
+terms_to_wanted_dims([Arg|Args], Ns_In, Ns_Out) :-
+ term_to_wanted_dims(Arg, Ns_In, Ns1),
+ terms_to_wanted_dims(Args, Ns1, Ns_Out).
+
+constraints_to_list(C, LC) :-
+ constraints_to_list(C, [], LC).
+
+constraints_to_list((A, B), Rest, LC) :-
+ !,
+ constraints_to_list(B, Rest, BRest),
+ constraints_to_list(A, BRest, LC).
+constraints_to_list(C, Rest, Rest1) :-
+ (check_constraint(C) ->
+ Rest1 = [C|Rest]
+ ;
+ Rest1 = [0 = 1]
+ ).
+
+
+% term_to_PPL_term(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+
+term_to_PPL_term('$VAR'(In_N), In_N, Out_N) :-
+ !,
+ Out_N is In_N + 1.
+term_to_PPL_term(Term, In_N, Out_N) :-
+ Term =.. [_|Args],
+ terms_to_PPL_terms(Args, In_N, Out_N).
+
+terms_to_PPL_terms([], In_N, In_N).
+terms_to_PPL_terms([Arg|Args], In_N, Out_N) :-
+ term_to_PPL_term(Arg, In_N, Tmp_N),
+ terms_to_PPL_terms(Args, Tmp_N, Out_N).
+
+build_equality_constraints([], []).
+build_equality_constraints([Var = Num|Eqs], All_Eq_Constrs) :-
+ build_equality_constraints(Eqs, Eq_Constrs),
+ (nonvar(Num) ->
+ Num = rat(Int, 1),
+ All_Eq_Constrs = [Var = Int|Eq_Constrs]
+ ;
+ All_Eq_Constrs = Eq_Constrs
+ ).
+
+check_expr('$VAR'(_)).
+check_expr(Num) :-
+ integer(Num).
+check_expr(Num*Var) :-
+ integer(Num),
+ check_expr(Var).
+check_expr(Var*Num) :-
+ integer(Num),
+ check_expr(Var).
+check_expr(E + F) :-
+ check_expr(E),
+ check_expr(F).
+check_expr(E - F) :-
+ check_expr(E),
+ check_expr(F).
+
+check_constraint(Expr = Expr1) :-
+ check_expr(Expr),
+ check_expr(Expr1).
+check_constraint(Expr >= Expr1) :-
+ check_expr(Expr),
+ check_expr(Expr1).
+check_constraint(Expr > Expr1) :-
+ check_expr(Expr),
+ check_expr(Expr1).
+check_constraint(Expr =< Expr1) :-
+ check_expr(Expr),
+ check_expr(Expr1).
+check_constraint(Expr < Expr1) :-
+ check_expr(Expr),
+ check_expr(Expr1).
+
+get_unwanted_dims(Wanted, D, Unwanted) :-
+ get_unwanted_dims(Wanted, 0, D, Unwanted).
+
+get_unwanted_dims(_, S, D, []) :-
+ S >= D,
+ !.
+get_unwanted_dims(Wanted, S, D, Unwanted) :-
+ S1 is S + 1,
+ get_unwanted_dims(Wanted, S1, D, Unwanted1),
+ (member(S, Wanted) ->
+ Unwanted = Unwanted1
+ ;
+ Unwanted = ['$VAR'(S)|Unwanted1]
+ ).
+
+element2position(N, Ns, I) :-
+ element2position(N, Ns, 0, I).
+element2position(N, [N|_], I, I) :-
+ !.
+element2position(N, [_M|Ns], Iin, Iout) :-
+ I1 is Iin + 1,
+ element2position(N, Ns, I1, Iout).
+
+position2element(0, [N|_], N) :-
+ !.
+position2element(I, [_M|Ns], N) :-
+ I1 is I - 1,
+ position2element(I1, Ns, N).
+
+max([], M, M) :- !.
+max([L|Ls], M, Max) :-
+ L =< M,
+ !,
+ max(Ls, M, Max).
+max([L|Ls], M, Max) :-
+ L > M,
+ max(Ls, L, Max).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+ write('---Type <return> to continue, or q <return> to quit---'),
+ flush_output(user_output),
+ get_code(user_input, C),
+ (
+ C == 10
+ ;
+ eat_eol
+ ),
+ !,
+ C \== 113.
+
+show_copying :-
+ eat_eol,
+ write('\
+ GNU GENERAL PUBLIC LICENSE\n\
+ Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+ Preamble\n\
+\n\
+ The licenses for most software are designed to take away your\n\
+freedom to share and change it. By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users. This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it. (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.) You can apply it to\n\
+your programs, too.\n\
+\n\
+ When we speak of free software, we are referring to freedom, not\n\
+price. Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+ next_or_quit,
+ write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+ To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+ For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have. You must make sure that they, too, receive or can get the\n\
+source code. And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+ We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+ Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software. If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+ next_or_quit,
+ write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+ Finally, any free program is threatened constantly by software\n\
+patents. We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary. To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+ The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+ GNU GENERAL PUBLIC LICENSE\n\
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+ 0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License. The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language. (Hereinafter, translation is included without limitation in\n'),
+ next_or_quit,
+ write('\
+the term "modification".) Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope. The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+ 1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+ 2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+ next_or_quit,
+ write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+ a) You must cause the modified files to carry prominent notices\n\
+ stating that you changed the files and the date of any change.\n\
+\n\
+ b) You must cause any work that you distribute or publish, that in\n\
+ whole or in part contains or is derived from the Program or any\n\
+ part thereof, to be licensed as a whole at no charge to all third\n\
+ parties under the terms of this License.\n\
+\n\
+ c) If the modified program normally reads commands interactively\n\
+ when run, you must cause it, when started running for such\n\
+ interactive use in the most ordinary way, to print or display an\n\
+ announcement including an appropriate copyright notice and a\n\
+ notice that there is no warranty (or else, saying that you provide\n\
+ a warranty) and that users may redistribute the program under\n\
+ these conditions, and telling the user how to view a copy of this\n\
+ License. (Exception: if the Program itself is interactive but\n\
+ does not normally print such an announcement, your work based on\n\
+ the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole. If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+ next_or_quit,
+ write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works. But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+ 3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+ a) Accompany it with the complete corresponding machine-readable\n'),
+ next_or_quit,
+ write('\
+ source code, which must be distributed under the terms of Sections\n\
+ 1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+ b) Accompany it with a written offer, valid for at least three\n\
+ years, to give any third party, for a charge no more than your\n\
+ cost of physically performing source distribution, a complete\n\
+ machine-readable copy of the corresponding source code, to be\n\
+ distributed under the terms of Sections 1 and 2 above on a medium\n\
+ customarily used for software interchange; or,\n\
+\n\
+ c) Accompany it with the information you received as to the offer\n\
+ to distribute corresponding source code. (This alternative is\n\
+ allowed only for noncommercial distribution and only if you\n\
+ received the program in object code or executable form with such\n\
+ an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it. For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable. However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+ next_or_quit,
+ write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+ 4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License. Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+ 5. You are not required to accept this License, since you have not\n\
+signed it. However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works. These actions are\n\
+prohibited by law if you do not accept this License. Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+ next_or_quit,
+ write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+ 6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions. You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+ 7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License. If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all. For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+ next_or_quit,
+ write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices. Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+ 8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+ next_or_quit,
+ write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded. In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+ 9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time. Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number. If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation. If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+ 10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission. For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+ next_or_quit,
+ write('\
+make exceptions for this. Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+ !.
+show_copying.
+
+show_warranty :-
+ write('\
+ NO WARRANTY\n\
+\n\
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+ write('\
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+ main_loop.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16 b/interfaces/Prolog/tests/expected_clpq2_int16
new file mode 100644
index 0000000..e9a54c1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a
new file mode 100644
index 0000000..f6ffe89
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16_a
@@ -0,0 +1,104 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32 b/interfaces/Prolog/tests/expected_clpq2_int32
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32_a b/interfaces/Prolog/tests/expected_clpq2_int32_a
new file mode 100644
index 0000000..8342abe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32_a
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64 b/interfaces/Prolog/tests/expected_clpq2_int64
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64_a b/interfaces/Prolog/tests/expected_clpq2_int64_a
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64_a
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8 b/interfaces/Prolog/tests/expected_clpq2_int8
new file mode 100644
index 0000000..58a46aa
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8_a b/interfaces/Prolog/tests/expected_clpq2_int8_a
new file mode 100644
index 0000000..58a46aa
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8_a
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz b/interfaces/Prolog/tests/expected_clpq2_mpz
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz_a b/interfaces/Prolog/tests/expected_clpq2_mpz_a
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16 b/interfaces/Prolog/tests/expected_clpq_int16
new file mode 100644
index 0000000..1c4f9a1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16_a b/interfaces/Prolog/tests/expected_clpq_int16_a
new file mode 100644
index 0000000..1c4f9a1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32 b/interfaces/Prolog/tests/expected_clpq_int32
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32_a b/interfaces/Prolog/tests/expected_clpq_int32_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64 b/interfaces/Prolog/tests/expected_clpq_int64
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64_a b/interfaces/Prolog/tests/expected_clpq_int64_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8 b/interfaces/Prolog/tests/expected_clpq_int8
new file mode 100644
index 0000000..d3a38b7
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8
@@ -0,0 +1,30 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8_a b/interfaces/Prolog/tests/expected_clpq_int8_a
new file mode 100644
index 0000000..d3a38b7
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8_a
@@ -0,0 +1,30 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?-
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz b/interfaces/Prolog/tests/expected_clpq_mpz
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz_a b/interfaces/Prolog/tests/expected_clpq_mpz_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_pchk_int16 b/interfaces/Prolog/tests/expected_pchk_int16
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int16_a b/interfaces/Prolog/tests/expected_pchk_int16_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32 b/interfaces/Prolog/tests/expected_pchk_int32
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32_a b/interfaces/Prolog/tests/expected_pchk_int32_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64 b/interfaces/Prolog/tests/expected_pchk_int64
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64_a b/interfaces/Prolog/tests/expected_pchk_int64_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8 b/interfaces/Prolog/tests/expected_pchk_int8
new file mode 100644
index 0000000..c1a4555
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8
@@ -0,0 +1,7 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8_a b/interfaces/Prolog/tests/expected_pchk_int8_a
new file mode 100644
index 0000000..c1a4555
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8_a
@@ -0,0 +1,7 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz b/interfaces/Prolog/tests/expected_pchk_mpz
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz_a b/interfaces/Prolog/tests/expected_pchk_mpz_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pgt b/interfaces/Prolog/tests/expected_pgt
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pgt
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/fib.clpq b/interfaces/Prolog/tests/fib.clpq
new file mode 100644
index 0000000..8858d5f
--- /dev/null
+++ b/interfaces/Prolog/tests/fib.clpq
@@ -0,0 +1,6 @@
+fib(X, Y) :-
+ { X >= 0, X =< 1, Y = 1 }.
+fib(X, Y) :-
+ { X >= 2, Xm1 = X-1, Xm2 = X-2, Y = Y1+Y2 },
+ fib(Xm1, Y1),
+ fib(Xm2, Y2).
diff --git a/interfaces/Prolog/tests/mc91.clpq b/interfaces/Prolog/tests/mc91.clpq
new file mode 100644
index 0000000..6827c58
--- /dev/null
+++ b/interfaces/Prolog/tests/mc91.clpq
@@ -0,0 +1,6 @@
+mc(N, M) :-
+ { N >= 101, M = N-10 }.
+mc(N, M) :-
+ { N =< 100, T = N+11 },
+ mc(T, U),
+ mc(U, M).
diff --git a/interfaces/Prolog/tests/pl_check.pl b/interfaces/Prolog/tests/pl_check.pl
new file mode 100644
index 0000000..6f1cd84
--- /dev/null
+++ b/interfaces/Prolog/tests/pl_check.pl
@@ -0,0 +1,3610 @@
+/* Various tests on the Prolog interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+% noisy(F)
+% When F = 1, a message is displayed if a time out occurs
+% when running the `timeout'` predicate.
+% Also, the values of the PPL versions and banner are displayed.
+% When F = 0, no 'time out' message or versions are displayed.
+% When F = 2, if a test fails and the backtracking returns to a polyhedron
+% constructor, the caught error will cause the constraint and generator systems
+% for the polyhedron to be displayed.
+% noisy/1 can be reset by calling make_noisy/0 or make_quiet/0.
+
+:- dynamic(noisy/1).
+
+% check_all/0
+% This executes all the test predicates which, together, check all
+% the ppl interface predicates.
+
+check_all :-
+ (noisy(_) -> true ; make_quiet),
+ list_groups(Groups),
+ catch(run_all(Groups), Exception,
+ (print_exception_term(Exception), fail)).
+
+% check_quiet/0
+% This also executes all the test predicates with no output.
+
+check_quiet :-
+ make_quiet,
+ check_all.
+
+% check_noisy/0
+% check_extra_noisy/0
+%
+% These also execute all the test predicates but also outputs
+% information including the banner, version numbers and expected
+% output from the exception tests.
+
+check_noisy :-
+ make_noisy,
+ check_all.
+
+check_extra_noisy :-
+ make_extra_noisy,
+ check_all.
+
+% run_all/1
+% This executes all the given list of tests, catching any exceptions.
+% If any test fails then an error message is output and then it fails.
+
+run_all([Group|Groups]):-
+ ppl_initialize,
+ (catch(run_one(Group), Exception, run_exception(Group, Exception)) ->
+ ppl_finalize,
+ run_all(Groups)
+ ;
+ run_fail(Group)
+ ).
+run_all([]).
+
+% run_fail/1
+% This is used when a test in run_all/1 fails.
+% A message is output saying which group of tests has failed;
+% then it finalizes the ppl and fails.
+
+run_fail(Group) :-
+ group_predicates(Group, Predicates),
+ prolog_system(System),
+ error_message(['Error occurred while performing test', Group,
+ 'which checks predicates:', Predicates]),
+ error_message(['Prolog interface checks failed on', System,
+ 'Prolog.']),
+ ppl_finalize,
+ fail.
+
+% run_exception/2
+% This is used when a test in run_all/1 causes an exception to be thrown.
+% A message is output saying which group of tests was being run when
+% the exception was thrown and then it fails.
+
+run_exception(Group, Exception) :-
+ group_predicates(Group, Predicates),
+ (Exception = ppl_overflow_error(_) ->
+ Kind = 'Overflow exception'
+ ;
+ Kind = 'Exception'
+ ),
+ prolog_system(System),
+ display_message([Kind, 'occurred while performing test ', Group,
+ 'which checks predicates ', nl, Predicates]),
+ display_message(['Prolog interface checks failed on', System,
+ 'Prolog.']),
+ print_exception_term(Exception),
+ % Do fail for all but overflow exceptions.
+ Exception = ppl_overflow_error(_).
+
+% run_one/1
+% Runs the named group of tests.
+
+% Tests predicates that return PPL version information and the PPL banner.
+% If noisy(0) holds, there is no output but if not,
+% all the versions are printed and the banner is pretty printed.
+run_one(all_versions_and_banner) :-
+ \+ ppl_version_major(-1),
+ ppl_version_major(Vmajor),
+ ppl_version_minor(Vminor),
+ ppl_version_revision(Vrevision),
+ ppl_version_beta(Vbeta),
+ ppl_version(V),
+ ppl_banner(B),
+ (noisy(0) -> true ;
+ (
+ nl,
+ write('Version major is '), write(Vmajor), nl,
+ write('Version minor is '), write(Vminor), nl,
+ write('Version revision is '), write(Vrevision), nl,
+ write('Version beta is '), write(Vbeta), nl,
+ write('Version is '), write(V), nl,
+ banner_pp(B), nl
+ )
+ ).
+
+% Tests predicates that return the maximum allowed dimension and coefficients.
+% If noisy(0) holds, there is no output but if not, the maximums/minimums
+% are printed.
+run_one(numeric_bounds) :-
+ max_dimension,
+ coefficient_bounds,
+ set_restore_rounding,
+ set_restore_irrational_precision.
+
+run_one(new_polyhedron_from_dimension) :-
+ new_polyhedron_from_dim.
+
+run_one(new_polyhedron_from_polyhedron) :-
+ new_polyhedron_from_polyhedron.
+
+run_one(new_polyhedron_from_representations) :-
+ new_polyhedron_from_cons,
+ new_polyhedron_from_gens.
+
+run_one(swap_polyhedra) :-
+ swap.
+
+run_one(polyhedron_dimension) :-
+ space,
+ affine_dim,
+ constrains,
+ unconstrain_space_dimension,
+ unconstrain_space_dimensions.
+
+run_one(basic_operators) :-
+ inters_assign,
+ polyhull_assign,
+ polydiff_assign,
+ time_elapse,
+ top_close_assign.
+
+run_one(add_to_system) :-
+ add_con,
+ add_gen,
+ add_cons,
+ add_gens.
+
+run_one(revise_dimensions) :-
+ project,
+ embed,
+ conc_assign,
+ remove_dim,
+ remove_high_dim,
+ expand_dim,
+ map_dim,
+ fold_dims.
+
+run_one(transform_polyhedron) :-
+ affine_image,
+ affine_preimage,
+ bounded_affine_image,
+ bounded_affine_preimage,
+ affine_image_gen,
+ affine_preimage_gen,
+ affine_image_genlr,
+ affine_preimage_genlr.
+
+run_one(extrapolation_operators) :-
+ widen_BHRZ03,
+ widen_BHRZ03_with_tokens,
+ lim_extrapolate_BHRZ03,
+ lim_extrapolate_BHRZ03_with_tokens,
+ bound_extrapolate_BHRZ03,
+ bound_extrapolate_BHRZ03_with_tokens,
+ widen_H79,
+ widen_H79_with_tokens,
+ lim_extrapolate_H79,
+ lim_extrapolate_H79_with_tokens,
+ bound_extrapolate_H79,
+ bound_extrapolate_H79_with_tokens.
+
+run_one(get_system) :-
+ get_cons,
+ get_min_cons,
+ get_gens,
+ get_min_gens.
+
+run_one(check_polyhedron) :-
+ rel_cons,
+ rel_gens,
+ checks,
+ bounds_from_above,
+ bounds_from_below.
+
+run_one(minmax_polyhedron) :-
+ maximize,
+ minimize,
+ maximize_with_point,
+ minimize_with_point.
+
+run_one(compare_polyhedra) :-
+ contains,
+ strict_contains,
+ disjoint_from,
+ equals,
+ ok.
+
+run_one(catch_time) :-
+ time_out.
+
+run_one(mip_problem) :-
+ mip_problem.
+
+run_one(pip_problem) :-
+ pip_problem.
+
+% Checks how the PPL Prolog system performs with large integers
+% XSB has problems with large numbers - hence tests for XSB disallowed.
+% We catch the exception if it is caused by integer overflow in C++
+% and suppress output as this is expected when C++ uses checked_integers.
+run_one(large_integers) :-
+ prolog_system(Prolog_System),
+ (Prolog_System \== 'XSB' ->
+ catch(large_integers, ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause)))
+ ;
+ true
+ ).
+
+% Checks the handling of exceptions.
+run_one(handle_exceptions) :-
+ exceptions.
+
+%%%%%%%%%%%%%%%%% numeric bounds %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+max_dimension :-
+ ppl_max_space_dimension(M),
+ (noisy(0) -> true ;
+ display_message(['Maximum possible dimension is', M, nl])
+ ).
+
+% coefficient_bounds/0
+% This is mainly to check ppl_Coefficient_is_bounded/0,
+% ppl_Coefficient_max/1, ppl_Coefficient_min/1.
+% But it has to catch the case when the numeric bounds in the
+% prolog system are smaller than any finite bounds in C++
+% As the test does not know the configuration, all that can be tested
+% here is that the results are consistent and the bounds are
+% in a list of possible bounds.
+
+coefficient_bounds :-
+ (pl_check_prolog_flag(bounded, true) ->
+ (pl_check_prolog_flag(max_integer, PLMax),
+ pl_check_prolog_flag(min_integer, PLMin))
+ ;
+ PLMax = 0, PLMin = 0
+ ),
+ (ppl_Coefficient_is_bounded ->
+ (cpp_bounded_values(Max, Min) -> true
+ ;
+ (Max = PLMax, Min = PLMin)
+ )
+ ;
+ (cpp_unbounded_check, Max = PLMax, Min = PLMin)
+ ),
+ (noisy(0) -> true ;
+ display_message(['Maximum possible coefficient is', Max, nl]),
+ display_message(['Minimum possible coefficient is', Min, nl])
+ ).
+
+cpp_unbounded_check :-
+ \+ ppl_Coefficient_max(_),
+ \+ ppl_Coefficient_min(_).
+
+cpp_bounded_values(Max, Min) :-
+ ppl_Coefficient_max(Max),
+ ppl_Coefficient_min(Min).
+
+set_restore_rounding :-
+ ppl_set_rounding_for_PPL,
+ ppl_restore_pre_PPL_rounding.
+
+set_restore_irrational_precision :-
+ ppl_irrational_precision(Default),
+ Default == 128,
+ Non_Default = 100,
+ ppl_set_irrational_precision(Non_Default),
+ ppl_irrational_precision(Changed),
+ Changed == Non_Default,
+ ppl_set_irrational_precision(Default),
+ ppl_irrational_precision(Restored),
+ Restored == Default.
+
+%%%%%%%%%%%%%%%%% New Polyhedron %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Note that throughout the tests, all "new_Polyhedron_from_...(...,P)" calls
+% are made in such a way that, if the test fails, P is deleted.
+% This is done by using special "clean_new_Polyhedron_from_...(...,P)"
+% forms of the predicates that are defined later.
+%
+% As we also delete P on success of the test, to prevent trying to
+% delete P again when a later test fails, we always have a cut before these
+% in-line calls to ppl_Polyhedron_delete(P).
+
+% Tests new_C_Polyhedron_from_space_dimension/3,
+% new_NNC_Polyhedron_from_space_dimension/3 and
+% ppl_delete_Polyhedron/1.
+new_polyhedron_from_dim :-
+ new_polyhedron_from_dim(c, universe),
+ new_polyhedron_from_dim(nnc, universe),
+ new_polyhedron_from_dim(c, empty),
+ new_polyhedron_from_dim(nnc, empty).
+
+% This also uses ppl_Polyhedron_is_universe/1
+% and ppl_Polyhedron_is_empty.
+new_polyhedron_from_dim(T, Universe_Or_Empty) :-
+ \+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, 0),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, P),
+ (Universe_Or_Empty = universe ->
+ (ppl_Polyhedron_is_universe(P),
+ \+ ppl_Polyhedron_is_empty(P))
+ ;
+ (ppl_Polyhedron_is_empty(P),
+ \+ ppl_Polyhedron_is_universe(P))
+ ),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+% ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+% ppl_new_NNC_Polyhedron_from_C_Polyhedron/2, and
+% ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+new_polyhedron_from_polyhedron :-
+ new_polyhedron_from_polyhedron(c, c),
+ new_polyhedron_from_polyhedron(nnc, nnc),
+ new_polyhedron_from_polyhedron(c, nnc),
+ new_polyhedron_from_polyhedron(nnc, c).
+
+% This also uses ppl_new_Polyhedron_from_constraints/3 and
+% ppl_Polyhedron_equals_Polyhedron/2.
+new_polyhedron_from_polyhedron(T1, T2) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T1, 3, universe, P1),
+ \+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, 0),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, P2),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T2, P2, T1, P1a),
+ ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1a, T2, P2a),
+ ppl_Polyhedron_equals_Polyhedron(P2, P2a),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P1a),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P2a),
+ make_vars(3, [A, B, C]),
+ (T1 = c
+ -> CS = [3 >= A, 4 >= A, 4*A + B - 2*C >= 5]
+ ; CS = [3 >= A, 4 > A, 4*A + B - 2*C >= 5]
+ ),
+ clean_ppl_new_Polyhedron_from_constraints(T1, CS, P3),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3, T2, P4),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T2, P4, T1, P3a),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3a, T2, P4a),
+ ppl_Polyhedron_equals_Polyhedron(P3, P3a),
+ ppl_Polyhedron_equals_Polyhedron(P4, P4a),
+ !,
+ ppl_delete_Polyhedron(P3),
+ ppl_delete_Polyhedron(P4),
+ ppl_delete_Polyhedron(P3a),
+ ppl_delete_Polyhedron(P4a).
+
+% Tests ppl_new_Polyhedron_from_constraints/2
+% ppl_new_Polyhedron_from_constraints/2.
+new_polyhedron_from_cons :-
+ new_polyhedron_from_cons(c, [3 >= '$VAR'(1)]),
+ make_vars(4, [A, B, C, D]),
+ new_polyhedron_from_cons(c, [3 >= A, 4*A + B - 2*C >= 5, D = 1]),
+ new_polyhedron_from_cons(c, [B >= A, 4*A + B - 2*C >= 5, D = 1]),
+ new_polyhedron_from_cons(nnc, [3 > A, 4*A + B - 2*C >= 5, D = 1]),
+ new_polyhedron_from_cons(nnc, [B > A, 4*A + B - 2*C >= 5, D = 1]).
+
+new_polyhedron_from_cons(T, CS) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, [], P),
+ \+ clean_ppl_new_Polyhedron_from_constraints(T, [], 0),
+ ppl_Polyhedron_is_universe(P),
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, Pa),
+ \+ ppl_Polyhedron_is_universe(Pa),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Pa).
+
+% Tests ppl_new_Polyhedron_from_generators/2 and
+% ppl_new_Polyhedron_from_generators/2.
+new_polyhedron_from_gens :-
+ make_vars(3, [A, B, C]),
+ new_polyhedron_from_gens(c,[point(A + B + C, 1), point(A + B + C)] ),
+ new_polyhedron_from_gens(nnc, [point(A + B + C), closure_point(A + B + C)]).
+
+new_polyhedron_from_gens(T, GS) :-
+ \+ clean_ppl_new_Polyhedron_from_generators(T, [], 0),
+ clean_ppl_new_Polyhedron_from_generators(T, [], P),
+ ppl_Polyhedron_is_empty(P),
+ clean_ppl_new_Polyhedron_from_generators(T, GS, Pa),
+ \+ ppl_Polyhedron_is_empty(Pa),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Pa).
+
+
+%%%%%%%%%%%%%%%%% Swap Polyhedra %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_swap/2.
+swap :-
+ swap(c), swap(nnc).
+
+swap(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Q),
+ ppl_Polyhedron_swap(P, Q),
+ ppl_Polyhedron_is_empty(P),
+ ppl_Polyhedron_is_universe(Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+%%%%%%%%%%%%%%%%%% Poly Dimension %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_space_dimension/2.
+space :-
+ space(c), space(nnc).
+
+space(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_space_dimension(P, N),
+ N = 3,
+ \+ ppl_Polyhedron_space_dimension(P, 4),
+ clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+ ppl_Polyhedron_space_dimension(Q, M),
+ M == 0,
+ clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+ ppl_Polyhedron_space_dimension(Q1, M1),
+ M1 == 0,
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q),
+ ppl_delete_Polyhedron(Q1).
+
+
+% Tests ppl_Polyhedron_affine_dimension/2.
+affine_dim :-
+ affine_dim(c), affine_dim(nnc).
+
+affine_dim(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_affine_dimension(P, N),
+ N == 3,
+ \+ ppl_Polyhedron_affine_dimension(P, 2),
+ clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+ ppl_Polyhedron_affine_dimension(Q, M),
+ M == 0,
+ clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+ ppl_Polyhedron_affine_dimension(Q1, M1),
+ M1 == 0,
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q),
+ ppl_delete_Polyhedron(Q1),
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(A), ray(B)],
+ P1),
+ ppl_Polyhedron_space_dimension(P1, 2),
+ ppl_Polyhedron_affine_dimension(P1, 1),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(A + B, 2)],
+ P2),
+ ppl_Polyhedron_space_dimension(P2, 2),
+ ppl_Polyhedron_affine_dimension(P2, 0),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B >= 0, B >= 0,
+ A + B =< 1, B =< 0],
+ P3),
+ ppl_Polyhedron_space_dimension(P3, 2),
+ ppl_Polyhedron_affine_dimension(P3, 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B >= 0, B >= 1,
+ A + B =< 1],
+ P4),
+ (T = c ->
+ ppl_Polyhedron_add_constraint(P4, B =< 0)
+ ;
+ ppl_Polyhedron_add_constraint(P4, B < 1)
+ ),
+ ppl_Polyhedron_space_dimension(P4, 2),
+ ppl_Polyhedron_affine_dimension(P4, 0),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3),
+ ppl_delete_Polyhedron(P4).
+
+% Tests ppl_Polyhedron_constrains/2.
+constrains :-
+ constrains(c), constrains(nnc).
+
+constrains(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+ ppl_Polyhedron_constrains(P, B),
+ \+ppl_Polyhedron_constrains(P, A),
+ ppl_Polyhedron_OK(P),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimension/2.
+unconstrain_space_dimension :-
+ unconstrain_space_dimension(c), unconstrain_space_dimension(nnc).
+
+unconstrain_space_dimension(T) :-
+ make_vars(3, [_A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+ ppl_Polyhedron_unconstrain_space_dimension(P, B),
+ \+ppl_Polyhedron_constrains(P, B),
+ ppl_Polyhedron_OK(P),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimensions/2.
+unconstrain_space_dimensions :-
+ unconstrain_space_dimensions(c), unconstrain_space_dimensions(nnc).
+
+unconstrain_space_dimensions(T) :-
+ make_vars(3, [_A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+ ppl_Polyhedron_unconstrain_space_dimensions(P, []),
+ ppl_Polyhedron_constrains(P, B),
+ ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+ \+ppl_Polyhedron_constrains(P, B),
+ ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+ \+ppl_Polyhedron_constrains(P, B),
+ ppl_Polyhedron_OK(P),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%% Basic Operators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_intersection_assign/2.
+inters_assign :-
+ inters_assign(c), inters_assign(nnc).
+
+inters_assign(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(0), point(B),
+ point(A), point(A, 2)],
+ P1),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(0), point(A),
+ point(A + B), point(A, 2)],
+ P2),
+ ppl_Polyhedron_intersection_assign(P1, P2),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(A + B, 2),
+ point(A), point(0)],
+ P1a),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B >= 0, B >= 0,
+ A + B =< 1],
+ P1b),
+ ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+ ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+ clean_ppl_new_Polyhedron_from_constraints(T, [A =< -1, B =< -1], P3),
+ ppl_Polyhedron_intersection_assign(P1, P3),
+ ppl_Polyhedron_is_empty(P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3),
+ ppl_delete_Polyhedron(P1a),
+ ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_concatenate_assign/2.
+conc_assign :-
+ conc_assign(c), conc_assign(nnc).
+
+conc_assign(T) :-
+ make_vars(5, [A, B, C, D, E]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ clean_ppl_new_Polyhedron_from_constraints(T, [A >= 1, B >= 0, C >= 0], Q),
+ ppl_Polyhedron_concatenate_assign(P, Q),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [C >= 1, D >= 0, E >= 0],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_poly_hull_assign/2.
+polyhull_assign :-
+ polyhull_assign(c), polyhull_assign(nnc).
+
+polyhull_assign(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(0), point(B),
+ point(A), point(A,2)],
+ P1),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(0), point(A),
+ point(A + B), point(A, 2)],
+ P2),
+ ppl_Polyhedron_poly_hull_assign(P1, P2),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b),
+ ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+ ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P1a),
+ ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_poly_difference_assign/2.
+polydiff_assign :-
+ make_vars(2, [A, B]),
+ GS0 = [point(2*A)],
+ GS1 = [point(0), point(2*A)],
+ GS2 = [point(0), point(A)],
+ GS3 = [point(A), point(2*A)],
+ GS4 = [closure_point(A), point(2*A)],
+ GS4a = [closure_point(A), point(3*A, 2), closure_point(2*A)],
+ polydiff_assign(c, GS1, GS2, GS3),
+ polydiff_assign(c, GS1, GS3, GS2),
+ polydiff_assign(c, GS3, GS0, GS3),
+ polydiff_assign(nnc, GS1, GS2, GS4),
+ polydiff_assign(nnc, GS1, GS4, GS2),
+ polydiff_assign(nnc, GS4, GS0, GS4a),
+ GS5 = [point(0), point(B), point(A)],
+ GS6 = [point(0), point(A), point(A + B)],
+ GS6a = [point(0), point(A), point(A + B, 2)],
+ GS7 = [point(A + B, 2), point(B), point(0)],
+ GS8 = [closure_point(A + B, 2), point(B), closure_point(0)],
+ polydiff_assign(c, GS5, GS6, GS7),
+ polydiff_assign(c, GS5, GS7, GS6a),
+ polydiff_assign(nnc, GS5, GS6, GS8),
+ polydiff_assign(nnc, GS5, GS8, GS6a),
+ GS_empty = [],
+ polydiff_assign(c, GS0, GS0, GS_empty),
+ polydiff_assign(nnc, GS4, GS4, GS_empty),
+ polydiff_assign(nnc, GS4, GS3, GS_empty).
+
+polydiff_assign(T, GS1, GS2, GS3) :-
+ clean_ppl_new_Polyhedron_from_generators(T, GS1, P1),
+ ppl_Polyhedron_space_dimension(P1, Dim),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P2),
+ ppl_Polyhedron_add_generators(P2, GS2),
+ ppl_Polyhedron_poly_difference_assign(P1, P2),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P3),
+ ppl_Polyhedron_add_generators(P3, GS3),
+ ppl_Polyhedron_equals_Polyhedron(P1, P3),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_time_elapse_assign/2.
+time_elapse :-
+ time_elapse(c), time_elapse(nnc).
+
+% Tests ppl_Polyhedron_time_elapse for C Polyhedra.
+time_elapse(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P,
+ [A >= 1, A =< 3, B >= 1, B =< 3]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Q),
+ ppl_Polyhedron_add_constraints(Q, [B = 5]),
+ ppl_Polyhedron_time_elapse_assign(P, Q),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Pa),
+ ppl_Polyhedron_add_constraints(Pa, [B >= 1]),
+ clean_ppl_new_Polyhedron_from_constraints(T, [B = 5], Qa),
+ ppl_Polyhedron_equals_Polyhedron(Q, Qa),
+ ppl_Polyhedron_equals_Polyhedron(P, Pa),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q),
+ ppl_delete_Polyhedron(Pa),
+ ppl_delete_Polyhedron(Qa).
+
+% Tests ppl_Polyhedron_topological_closure_assign/1.
+top_close_assign :-
+ make_vars(3, [A, B, C]),
+ GS_close = [point(A + B), point(0), ray(A), ray(B)],
+ GS_not_close = [point(A + B), closure_point(0), ray(A), ray(B)],
+ CS_close = [4*A + B + -2*C >= 5, A =< 3],
+ CS_not_close = [4*A + B - 2*C >= 5, A < 3],
+ top_close_assign(c, gensys, GS_close, GS_close),
+ top_close_assign(nnc, gensys, GS_not_close, GS_close),
+ top_close_assign(c, consys, CS_close, CS_close),
+ top_close_assign(nnc, consys, CS_not_close, CS_close).
+
+top_close_assign(T, gensys, GS, GS_close) :-
+ clean_ppl_new_Polyhedron_from_generators(T, GS, P),
+ ppl_Polyhedron_topological_closure_assign(P),
+ clean_ppl_new_Polyhedron_from_generators(T, GS_close, Pa),
+ ppl_Polyhedron_equals_Polyhedron(P, Pa),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Pa).
+
+top_close_assign(T, consys, CS, CS_close) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+ ppl_Polyhedron_topological_closure_assign(P),
+ clean_ppl_new_Polyhedron_from_constraints(T, CS_close, Pa),
+ ppl_Polyhedron_equals_Polyhedron(P, Pa),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Pa).
+
+
+%%%%%%%%%%%%%%%%%% Add Constraints or Generators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_constraint/2.
+add_con :-
+ add_con(c), add_con(nnc).
+
+add_con(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A - B >= 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B >= 1],
+ Pa),
+ ppl_Polyhedron_equals_Polyhedron(P, Pa),
+ ppl_Polyhedron_add_constraint(P, A = 0),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A = 0, B =< -1],
+ Pb),
+ ppl_Polyhedron_equals_Polyhedron(P, Pb),
+ ppl_Polyhedron_add_constraint(P, A = 1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Pc),
+ ppl_Polyhedron_equals_Polyhedron(P, Pc),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Pa),
+ ppl_delete_Polyhedron(Pb),
+ ppl_delete_Polyhedron(Pc).
+
+% Tests ppl_Polyhedron_add_generator/2.
+add_gen :-
+ add_gen(c), add_gen(nnc).
+
+add_gen(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_generator(P, point(A + B)),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(A + B), point(0),
+ line(A), line(B)], P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_constraints/2.
+add_cons :-
+ make_vars(3, [A, B, C]),
+ add_cons(c, [A >= 1, B >= 0, 4*A + B - 2*C >= 5], [A =< 0]),
+ add_cons(nnc, [A > 1, B >= 0, 4*A + B - 2*C > 5], [A < 0]).
+
+add_cons(T, CS, CS1) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, CS),
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_Polyhedron_add_constraints(P, CS1),
+ ppl_Polyhedron_is_empty(P),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generators/2.
+add_gens :-
+ make_vars(3, [A, B, C]),
+ add_gens(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+ point(100*A + 5*B, -8)]),
+ add_gens(nnc, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+ closure_point(100*A + 5*B, -8)]).
+
+add_gens(T, GS) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+ ppl_Polyhedron_add_generators(P, GS),
+ clean_ppl_new_Polyhedron_from_generators(T, GS, P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Change Dimensions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_project/2.
+project :-
+ project(c), project(nnc).
+
+project(T) :-
+ make_vars(4, [A, B, C, D]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+ ppl_Polyhedron_add_space_dimensions_and_project(P, 0),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0],
+ P0),
+ ppl_Polyhedron_equals_Polyhedron(P, P0),
+ ppl_delete_Polyhedron(P0),
+ ppl_Polyhedron_add_space_dimensions_and_project(P, 2),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0, C = 0, D = 0],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_embed/2.
+embed :-
+ embed(c), embed(nnc).
+
+embed(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+ ppl_Polyhedron_add_space_dimensions_and_embed(P, 0),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0],
+ P0),
+ ppl_Polyhedron_equals_Polyhedron(P, P0),
+ ppl_delete_Polyhedron(P0),
+ ppl_Polyhedron_add_space_dimensions_and_embed(P, 2),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0]),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_space_dimensions/2.
+remove_dim :-
+ remove_dim(c), remove_dim(nnc).
+
+remove_dim(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+ ppl_Polyhedron_remove_space_dimensions(P, []),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0, C >= 2],
+ P0),
+ ppl_Polyhedron_equals_Polyhedron(P, P0),
+ ppl_delete_Polyhedron(P0),
+ ppl_Polyhedron_remove_space_dimensions(P,[B]),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 2],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_delete_Polyhedron(P1),
+ % Note: now 'B' refers to the old 'C' variable.
+ ppl_Polyhedron_remove_space_dimensions(P,[A, B]),
+ ppl_Polyhedron_space_dimension(P, 0),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_higher_space_dimensions/2.
+remove_high_dim :-
+ remove_high_dim(c), remove_high_dim(nnc).
+
+remove_high_dim(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 0]),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0, C >= 0],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1],
+ P2),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ ppl_Polyhedron_remove_higher_space_dimensions(P, 0),
+ ppl_Polyhedron_space_dimension(P, 0),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_expand_space_dimension/3.
+expand_dim :-
+ expand_dim(c), expand_dim(nnc).
+
+expand_dim(T) :-
+ make_vars(4, [A, B, C, D]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+ ppl_Polyhedron_expand_space_dimension(P, B, 1),
+ ppl_Polyhedron_space_dimension(P, 4),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 1, B >= 0, C >= 2, D >= 0],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_delete_Polyhedron(P1),
+ ppl_Polyhedron_remove_higher_space_dimensions(P, 2),
+ ppl_Polyhedron_expand_space_dimension(P, A, 2),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [D >= 1, C >= 1, A >= 1, B >= 0],
+ P2),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ ppl_delete_Polyhedron(P2),
+ ppl_Polyhedron_space_dimension(P, 4),
+ !,
+ ppl_delete_Polyhedron(P),
+% Example taken from [GopanDMDRS04], page 519.
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Ptacas),
+ ppl_Polyhedron_add_generators(Ptacas,
+ [point(A + 2*B), point(A + 3*B), point(A + 4*B)]),
+ ppl_Polyhedron_expand_space_dimension(Ptacas, B, 1),
+ ppl_Polyhedron_space_dimension(Ptacas, 3),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(A + 2*B + 2*C), point(A + 2*B + 3*C), point(A + 2*B + 4*C),
+ point(A + 3*B + 2*C), point(A + 3*B + 3*C), point(A + 3*B + 4*C),
+ point(A + 4*B + 2*C), point(A + 4*B + 3*C), point(A + 4*B + 4*C)],
+ Ptacas1),
+ ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+ !,
+ ppl_delete_Polyhedron(Ptacas1),
+ ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_fold_space_dimension/3.
+fold_dims :-
+ fold_dims(c), fold_dims(nnc).
+
+fold_dims(T) :-
+ make_vars(4, [A, B, C, D]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2, D >= 0]),
+ ppl_Polyhedron_fold_space_dimensions(P, [D], B),
+ ppl_Polyhedron_space_dimension(P, 3),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0, C >= 2]),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_Polyhedron_fold_space_dimensions(P, [A, C], B),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, P2),
+ ppl_Polyhedron_add_constraints(P2, [A >= 0]),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ ppl_delete_Polyhedron(P2),
+ ppl_Polyhedron_space_dimension(P, 1),
+ !,
+ ppl_delete_Polyhedron(P),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Ptacas),
+ ppl_Polyhedron_add_constraints(Ptacas, [A >= 1, A =< 3, B >= 7, B =< 12]),
+ ppl_Polyhedron_fold_space_dimensions(Ptacas, [A], B),
+ ppl_Polyhedron_space_dimension(Ptacas, 1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, Ptacas1),
+ ppl_Polyhedron_add_constraints(Ptacas1, [A >= 1, A =< 12]),
+ ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+ !,
+ ppl_delete_Polyhedron(Ptacas1),
+ ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_map_space_dimensions/2.
+map_dim:-
+ map_dim(c), map_dim(nnc).
+
+map_dim(T) :-
+ make_vars(7, [A, B, C, D, E, F, G]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 2, B >= 1, C >= 0]),
+ ppl_Polyhedron_map_space_dimensions(P, [A-B, B-C, C-A]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, Q),
+ ppl_Polyhedron_add_constraints(Q, [A >= 0, B >= 2, C >= 1]),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P0),
+ ppl_Polyhedron_add_generators(P0, [point(2*C), line(A+B), ray(A+C)]),
+ ppl_delete_Polyhedron(P0),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P1),
+ ppl_Polyhedron_add_generators(P1, [point(2*C), line(A+B), ray(A+C)]),
+ ppl_Polyhedron_map_space_dimensions(P1, [A-C, C-A, B-B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, Q1),
+ ppl_Polyhedron_add_generators(Q1, [point(2*A), ray(A+C), line(B+C)]),
+ ppl_Polyhedron_equals_Polyhedron(P1, Q1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(Q1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 5, universe, P2),
+ ppl_Polyhedron_add_constraints(P2, [B = 2, E = 8]),
+ ppl_Polyhedron_add_space_dimensions_and_embed(P2, 2),
+ ppl_Polyhedron_map_space_dimensions(P2, [A-A, B-B, C-E, D-F, E-G, F-C, G-D]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 7, universe, Q2),
+ ppl_Polyhedron_add_constraints(Q2, [B = 2, G = 8]),
+ ppl_Polyhedron_equals_Polyhedron(P2, Q2),
+ !,
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(Q2).
+
+
+%%%%%%%%%%%%%%%%%% Affine Transformations %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_affine_image/4.
+affine_image :-
+ affine_image(c), affine_image(nnc).
+
+affine_image(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A - B = 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B = 1],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B = 2],
+ P2),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_affine_preimage/4.
+affine_preimage :-
+ affine_preimage(c), affine_preimage(nnc).
+
+affine_preimage(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A + B >= 10),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A + B >= 10],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ ppl_Polyhedron_affine_preimage(P, A, A + 1, 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A + B >= 9],
+ P2),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_image/5
+bounded_affine_image :-
+ bounded_affine_image(c), bounded_affine_image(nnc).
+
+bounded_affine_image(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A - B = 1),
+ ppl_Polyhedron_bounded_affine_image(P, B, A - 1, A + 1, 2),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - 2*B =< 1, 2*B - A =< 1],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_preimage/5
+bounded_affine_preimage :-
+ bounded_affine_preimage(c), bounded_affine_preimage(nnc).
+
+bounded_affine_preimage(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+ P),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T, P, T, P1),
+ ppl_Polyhedron_add_space_dimensions_and_embed(P1, 1),
+ ppl_Polyhedron_bounded_affine_preimage(P, B, 7 - A, A + 3, 1),
+ ppl_Polyhedron_add_constraint(P1, 7 - A =< B),
+ ppl_Polyhedron_add_constraint(P1, B =< A + 3),
+ ppl_Polyhedron_remove_space_dimensions(P1, [B]),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+ Q),
+ clean_ppl_new_Polyhedron_from_Polyhedron(T, Q, T, Q1),
+ ppl_Polyhedron_add_space_dimensions_and_embed(Q1, 1),
+ ppl_Polyhedron_bounded_affine_preimage(Q, B, 7 - 3*A + 2*B, B + 5*A - 3, 1),
+ ppl_Polyhedron_add_constraint(Q1, 7 - 3*A + 2*C =< B),
+ ppl_Polyhedron_add_constraint(Q1, B =< C + 5*A - 3),
+ ppl_Polyhedron_remove_space_dimensions(Q1, [B]),
+ ppl_Polyhedron_equals_Polyhedron(Q, Q1),
+ !,
+ ppl_delete_Polyhedron(Q1),
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_generalized_affine_image/5.
+affine_image_gen :-
+ affine_image_gen(c), affine_image_gen(nnc).
+
+affine_image_gen(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A - B = 1),
+ ppl_Polyhedron_generalized_affine_image(P, A, =<, A + 1, 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B =< 2],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_preimage/5.
+affine_preimage_gen :-
+ affine_preimage_gen(c), affine_preimage_gen(nnc).
+
+affine_preimage_gen(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A >= 0, A =< 4, B =< 5, A =< B]),
+ ppl_Polyhedron_generalized_affine_preimage(P, B, >=, A+2, 1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 3]),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+affine_image_genlr :-
+ make_vars(2, [A, B]),
+ affine_image_genlr(c, =<, [B - A =< 2], [A,B]),
+ affine_image_genlr(c, =, [B - A = 2], [A,B]),
+ affine_image_genlr(nnc, <, [B - A < 2], [A,B]),
+ affine_image_genlr(nnc, =<, [B - A =< 2], [A,B]).
+
+affine_image_genlr(T, R, CS, [A,B]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint(P, A - B = 1),
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, R, A + 1),
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+% % Tests ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4.
+affine_preimage_genlr :-
+ make_vars(2, [A, B]),
+ affine_preimage_genlr(c, B - 1, =<, A + 1,
+ [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+ affine_preimage_genlr(c, B + 1, =, A + 1,
+ [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+ affine_preimage_genlr(nnc, B - 1, <, A + 1,
+ [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+ affine_preimage_genlr(nnc, B - 1, =<, A + 1,
+ [A >= 0, A =< 4, B >= 0, B =< A], [A,B]).
+
+affine_preimage_genlr(T, LHS, R, RHS, CS, [A,_B]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, CS),
+ ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(P, LHS, R, RHS),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 4]),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Widen and Extrapolation Operators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign/2.
+widen_BHRZ03 :-
+ make_vars(2, [A, B]),
+ widen_BHRZ03(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1]
+ ),
+ widen_BHRZ03(nnc, [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1], [A > 1, B > 1]
+ ).
+
+widen_BHRZ03(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_BHRZ03_widening_assign(P, Q),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4.
+widen_BHRZ03_with_tokens :-
+ make_vars(2, [A, B]),
+ widen_BHRZ03_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1], 1, 1
+ ),
+ widen_BHRZ03_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1], 1, 0
+ ),
+ widen_BHRZ03_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+ [A > 1], [A > 1, B > 1], 2, 2
+ ),
+ widen_BHRZ03_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+ [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+ ).
+
+widen_BHRZ03_with_tokens(Topology,
+ CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+ Token_i, 4),
+ \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+ Token_i, not_a_number),
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, Token_i, X),
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3.
+lim_extrapolate_BHRZ03 :-
+ make_vars(2, [A, B]),
+ lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0]
+ ),
+ lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 2], []
+ ),
+ lim_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0]
+ ),
+ lim_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+ [A >= 2], []
+ ).
+
+lim_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5.
+lim_extrapolate_BHRZ03_with_tokens :-
+ make_vars(2, [A, B]),
+ lim_extrapolate_BHRZ03_with_tokens(c,
+ [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+ ),
+ lim_extrapolate_BHRZ03_with_tokens(nnc,
+ [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0], 1, 0
+ ).
+
+lim_extrapolate_BHRZ03_with_tokens(Topology,
+ CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ Wrong_Token is Token_i + 1,
+ \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, Wrong_Token),
+ \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, not_a_number),
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, X),
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+bound_extrapolate_BHRZ03 :-
+ make_vars(2, [A, B]),
+ bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0]
+ ),
+ bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 2], [A >= 1, B >= 0]
+ ),
+ bound_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0]
+ ),
+ bound_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+ [A >= 2], [A > 1, B >= 0]
+ ).
+
+bound_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5.
+bound_extrapolate_BHRZ03_with_tokens :-
+ make_vars(2, [A, B]),
+ bound_extrapolate_BHRZ03_with_tokens(c,
+ [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+ ),
+ bound_extrapolate_BHRZ03_with_tokens(nnc,
+ [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0], 1, 0
+ ).
+
+bound_extrapolate_BHRZ03_with_tokens(Topology,
+ CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ Wrong_Token is Token_i + 1,
+ \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, Wrong_Token),
+ \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, not-a_number),
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, X),
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_H79_widening_assign/2.
+widen_H79 :-
+ make_vars(2, [A, B]),
+ widen_H79(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1]
+ ),
+ widen_H79(nnc, [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1], [A > 1, B > 1]
+ ),
+ widen_H79(c, [A >= 0, A =< 1], [A = 0],
+ [A >= 0], [A = 0]
+ ),
+ widen_H79(nnc, [A >= 0, A =< 1], [A = 0],
+ [A >= 0], [A = 0]
+ ).
+
+widen_H79(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_H79_widening_assign(P, Q),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_H79_widening_assign_with_tokens/4.
+widen_H79_with_tokens :-
+ make_vars(2, [A, B]),
+ widen_H79_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1], 1, 1
+ ),
+ widen_H79_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1], [A >= 1, B >= 1], 1, 0
+ ),
+ widen_H79_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+ [A > 1], [A > 1, B > 1], 2, 2
+ ),
+ widen_H79_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+ [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+ ).
+
+widen_H79_with_tokens(Topology,
+ CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+ Token_i, 4),
+ \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+ Token_i, not_a_number),
+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, Token_i, X),
+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign/3.
+lim_extrapolate_H79 :-
+ make_vars(2, [A, B]),
+ lim_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0]
+ ),
+ lim_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 2], []
+ ),
+ lim_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0]
+ ),
+ lim_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+ [A >= 2], []
+ ),
+ lim_extrapolate_H79(c, [A >= 0, A =< 1], [A = 0],
+ [A >= 0], [A >= 0]
+ ),
+ lim_extrapolate_H79(nnc, [A >= 0, A =< 1], [A = 0],
+ [A >= 0], [A >= 0]
+ ).
+
+lim_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_limited_H79_extrapolation_assign(P, Q, CS_lim),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5.
+lim_extrapolate_H79_with_tokens :-
+ make_vars(2, [A, B]),
+ lim_extrapolate_H79_with_tokens(c,
+ [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+ ),
+ lim_extrapolate_H79_with_tokens(nnc,
+ [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0], 1, 0
+ ).
+
+lim_extrapolate_H79_with_tokens(Topology,
+ CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ Wrong_Token is Token_i + 1,
+ \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, Wrong_Token),
+ \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, not_a_number),
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, X),
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign/3.
+bound_extrapolate_H79 :-
+ make_vars(2, [A, B]),
+ bound_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0]
+ ),
+ bound_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+ [A >= 2], [A >= 1, B >= 0]
+ ),
+ bound_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0]
+ ),
+ bound_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+ [A >= 2], [A > 1, B >= 0]
+ ).
+
+bound_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ ppl_Polyhedron_bounded_H79_extrapolation_assign(P, Q, CS_lim),
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5.
+bound_extrapolate_H79_with_tokens :-
+ make_vars(2, [A, B]),
+ bound_extrapolate_H79_with_tokens(c,
+ [A >= 1, B >= 0], [A >= 1, B >= 1],
+ [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+ ),
+ bound_extrapolate_H79_with_tokens(nnc,
+ [A > 1, B > 0], [A > 1, B > 1],
+ [A > 1, B > 0], [A > 1, B > 0], 1, 0
+ ).
+
+bound_extrapolate_H79_with_tokens(Topology,
+ CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+ widen_extrapolation_init(P, CS_P, Topology),
+ widen_extrapolation_init(Q, CS_Q, Topology),
+ Wrong_Token is Token_i + 1,
+ \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, Wrong_Token),
+ \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, not_a_number),
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, Token_i, X),
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+ CS_lim, X, Y),
+ Y == Token_o,
+ widen_extrapolation_final(P, CS_Pa, Topology),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+% widen_extrapolation_init/3 and widen_extrapolation_final/3
+% are used in the tests for widening and extrapolation predicates.
+widen_extrapolation_init(P, CS, Topology):-
+ clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, CS).
+
+widen_extrapolation_final(P,CS, Topology):-
+ clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, CS),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Get Constraint or Generator System %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_get_constraints/2.
+get_cons :-
+ get_cons(c), get_cons(nnc).
+
+get_cons(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_get_constraints(P, []),
+ ppl_Polyhedron_add_constraint(P, A - B >= 1),
+ \+ ppl_Polyhedron_get_constraints(P, []),
+ ppl_Polyhedron_get_constraints(P, [C]),
+ clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_constraints/2.
+get_min_cons :-
+ get_min_cons(c), get_min_cons(nnc).
+
+get_min_cons(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_get_minimized_constraints(P, []),
+ ppl_Polyhedron_add_constraints(P, [A - B >= 1, A - B >= 0]),
+ ppl_Polyhedron_get_minimized_constraints(P, [C]),
+ clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ ppl_Polyhedron_add_constraints(P, [A - B =< 0]),
+ \+ppl_Polyhedron_get_minimized_constraints(P, [C]),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_generators/2.
+get_gens :-
+ get_gens(c), get_gens(nnc).
+
+get_gens(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+ ppl_Polyhedron_get_generators(P, []),
+ \+ ppl_Polyhedron_get_generators(P, [_]),
+ ppl_Polyhedron_add_generator(P, point(A+B)),
+ ppl_Polyhedron_get_generators(P, [G]),
+ clean_ppl_new_Polyhedron_from_generators(T, [G], Q),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ ppl_Polyhedron_add_generator(P, point(A+B, 2)),
+ ppl_Polyhedron_get_generators(P, GS1),
+ ppl_Polyhedron_add_generators(Q, GS1),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ ppl_Polyhedron_add_generator(P, line(A)),
+ ppl_Polyhedron_get_generators(P, GS2),
+ ppl_Polyhedron_add_generators(Q, GS2),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_generators/2.
+get_min_gens :-
+ get_min_gens(c), get_min_gens(nnc).
+
+get_min_gens(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+ ppl_Polyhedron_add_generators(P, [point(2*A), point(A+B), point(2*B)]),
+ \+ ppl_Polyhedron_get_minimized_generators(P, [_]),
+ ppl_Polyhedron_get_minimized_generators(P, [G1, G2]),
+ clean_ppl_new_Polyhedron_from_generators(T, [G1, G2], Q),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+
+%%%%%%%%%%%%%%%%%% Polyhedral Relations %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_relation_with_constraint/3.
+rel_cons :-
+ make_vars(3, [A, B, C]),
+ rel_cons(c, [A >= 1, B >= 0, C = 0], [A, B, C]),
+ rel_cons(nnc, [A > 1, B >= 0, C = 0], [A, B, C]).
+
+rel_cons(T, CS, [A, B, C]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ ppl_Polyhedron_add_constraints(P, CS),
+ \+ ppl_Polyhedron_relation_with_constraint(P, A = 0, x),
+ ppl_Polyhedron_relation_with_constraint(P, A = 0, R),
+ R = [is_disjoint],
+ ppl_Polyhedron_relation_with_constraint(P, B = 0, R1),
+ R1 = [strictly_intersects],
+ ppl_Polyhedron_relation_with_constraint(P, A >= 0, R2),
+ R2 = [is_included],
+ ppl_Polyhedron_relation_with_constraint(P, C >= 0, R3),
+ (R3 = [is_included, saturates] ; R3 = [saturates, is_included]),
+ ppl_Polyhedron_relation_with_constraint(P, A = B, R4),
+ R4 = [strictly_intersects],
+ ppl_Polyhedron_add_constraint(P, A = B),
+ ppl_Polyhedron_relation_with_constraint(P, A = B, R5),
+ (R5 = [is_included, saturates] ; R5 = [saturates, is_included]),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_relation_with_generator/3.
+rel_gens :-
+ make_vars(3, [A, B, C]),
+ rel_gens(c, [point(A + B + C), ray(A)], [A, B, C]),
+ rel_gens(nnc, [point(A + B + C), ray(A)], [A, B, C]).
+
+rel_gens(T, GS, [A, _, _]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+ ppl_Polyhedron_add_generators(P, GS),
+ \+ppl_Polyhedron_relation_with_generator(P, point(A), x),
+ ppl_Polyhedron_relation_with_generator(P, point(A), R),
+ R = [],
+ ppl_Polyhedron_relation_with_generator(P, ray(A), R1),
+ R1 = [subsumes],
+ !,
+ ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Check Properties %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% tests ppl_Polyhedron_is_universe/1,
+% ppl_Polyhedron_is_empty/1,
+% ppl_Polyhedron_is_bounded/1,
+% ppl_Polyhedron_is_topologically_closed/1,
+% ppl_Polyhedron_contains_integer_point/2.
+checks :-
+ checks(c), checks(nnc).
+
+checks(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P1),
+ ppl_Polyhedron_is_universe(P),
+ ppl_Polyhedron_is_empty(P1),
+ \+ppl_Polyhedron_is_universe(P1),
+ \+ppl_Polyhedron_is_empty(P),
+ \+ppl_Polyhedron_contains_integer_point(P1),
+ ppl_Polyhedron_contains_integer_point(P),
+ ppl_Polyhedron_add_generators(P1, [point(A + B + C, 2)]),
+ \+ppl_Polyhedron_contains_integer_point(P1),
+ ppl_Polyhedron_add_generators(P1, [point(A + B + C)]),
+ ppl_Polyhedron_is_bounded(P1),
+ ppl_Polyhedron_contains_integer_point(P1),
+ ppl_Polyhedron_add_generators(P1, [ray(A + B + C)]),
+ \+ ppl_Polyhedron_is_bounded(P1),
+ ppl_Polyhedron_add_constraints(P, [A >= 1, B =< 3, A =< 2]),
+ ppl_Polyhedron_contains_integer_point(P),
+ ppl_Polyhedron_is_topologically_closed(P),
+ (T = nnc ->
+ (ppl_Polyhedron_add_constraints(P, [A > 1, B =< 3, A =< 2]),
+ \+ ppl_Polyhedron_is_topologically_closed(P),
+ ppl_Polyhedron_contains_integer_point(P),
+ ppl_Polyhedron_add_constraints(P, [A > 2]),
+ ppl_Polyhedron_is_topologically_closed(P))
+ ; true
+ ),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_contains_Polyhedron/2.
+contains :-
+ contains(c), contains(nnc).
+
+contains(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+ ppl_Polyhedron_contains_Polyhedron(P1, P2),
+ \+ppl_Polyhedron_contains_Polyhedron(P2, P1),
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_strictly_contains_Polyhedron for C/2.
+strict_contains :-
+ strict_contains(c), strict_contains(nnc).
+
+strict_contains(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+ ppl_Polyhedron_strictly_contains_Polyhedron(P1, P2),
+ \+ppl_Polyhedron_strictly_contains_Polyhedron(P1, P1),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_is_disjoint_from_Polyhedron/2.
+disjoint_from :-
+ disjoint_from(c), disjoint_from(nnc).
+
+disjoint_from(T) :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [3 >= A, 4*A + B - 2*C >= 5],
+ P1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [4 =< A, 4*A + B - 2*C >= 5],
+ P2),
+ ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2),
+ \+ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P1),
+ (T = nnc ->
+ (clean_ppl_new_Polyhedron_from_constraints(nnc,
+ [3 < A, 4*A + B - 2*C >= 5],
+ P2a),
+ ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2a),
+ ppl_delete_Polyhedron(P2a))
+ ; true
+ ),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_equals_Polyhedron/2.
+equals :-
+ equals(c), equals(nnc).
+
+equals(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P3),
+ ppl_Polyhedron_equals_Polyhedron(P1, P2),
+ \+ ppl_Polyhedron_equals_Polyhedron(P1, P3),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_OK/1.
+ok :-
+ ok(c), ok(nnc).
+
+ok(T) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 0, universe, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 0, empty, P3),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P4),
+ ppl_Polyhedron_OK(P1),
+ ppl_Polyhedron_OK(P2),
+ ppl_Polyhedron_OK(P3),
+ ppl_Polyhedron_OK(P4),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3),
+ ppl_delete_Polyhedron(P4).
+
+% Tests ppl_termination_test_C_Polyhedron_MS/2,
+% ppl_termination_test_C_Polyhedron_PR/2.
+% ppl_termination_test_NNC_Polyhedron_MS/2,
+% ppl_termination_test_NNC_Polyhedron_PR/2.
+termination_test :-
+ make_vars(4, [A, B, C, D]),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A - C >= 0,
+ -A + C >= 0,
+ -B + D >= 1,
+ B >= 0,
+ A >= 1], P1),
+ ppl_termination_test_C_Polyhedron_MS(P1),
+ ppl_termination_test_C_Polyhedron_PR(P1),
+ clean_ppl_new_Polyhedron_from_constraints(nnc,
+ [A - C >= 0,
+ -A + C >= 0,
+ -B + D >= 1,
+ B >= 0],
+ P2),
+ ppl_termination_test_NNC_Polyhedron_MS(P2),
+ ppl_termination_test_NNC_Polyhedron_PR(P2),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Polyhedron Bounding Values %%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_bounds_from_above/2.
+bounds_from_above :-
+ make_vars(2, [A, B]),
+ bounds_from_above(c, [A >= 1, B >= 0], [B =< 2], B),
+ bounds_from_above(nnc, [A > 1, B > 0, B < 1], [A < 2], A).
+
+bounds_from_above(T, CS1, CS2, Var) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+ \+ ppl_Polyhedron_bounds_from_above(P, Var),
+ ppl_Polyhedron_add_constraints(P, CS2),
+ ppl_Polyhedron_bounds_from_above(P, Var),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounds_from_below/2.
+bounds_from_below :-
+ make_vars(2, [A, B]),
+ bounds_from_below(c, [B >= 0, B =< 1], [A >= 1], A),
+ bounds_from_below(nnc, [B > 0, B < 1], [A > 2], A).
+
+bounds_from_below(T, CS1, CS2, Var) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+ \+ ppl_Polyhedron_bounds_from_below(P, Var),
+ ppl_Polyhedron_add_constraints(P, CS2),
+ ppl_Polyhedron_bounds_from_below(P, Var),
+ ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Maximize and Minimize %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_maximize/5.
+maximize :-
+ make_vars(2, [A, B]),
+ maximize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, 2, 1, true),
+ maximize(c, [B >= -1, B =< 1], B, 1, 1, true),
+ maximize(nnc, [A > -1, A < 1, B > -1, B < 1], A + B -1, 1, 1, false),
+ maximize(nnc, [B > -1, B < 1], B, 1, 1, false).
+
+maximize(T, CS, LE, N, D, Max) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+ ppl_Polyhedron_maximize(P, LE, N, D, Max),
+ ppl_Polyhedron_add_generator(P, ray(LE)),
+ \+ ppl_Polyhedron_maximize(P, LE, _, _, _),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_maximize_with_point/5.
+maximize_with_point :-
+ make_vars(2, [A, B]),
+ maximize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+ A + B, 2, 1, true, point(A+B)),
+ maximize_with_point(c, [A =< 0],
+ A, 0, 1, true, point(0)),
+ maximize_with_point(nnc, [A > -1, A < 1, B > -1, B < 1],
+ A + B -1, 1, 1, false, point(A+B)).
+
+maximize_with_point(T, CS, LE, N, D, Max, Point) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+ ppl_Polyhedron_maximize_with_point(P, LE, N, D, Max, Point_Max),
+ (Point_Max = closure_point(E) ; Point_Max = point(E)),
+ clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+ clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+ ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+ !,
+ ppl_delete_Polyhedron(Pm),
+ ppl_delete_Polyhedron(Qm),
+ \+ ppl_Polyhedron_maximize_with_point(P, LE, _N, 0, _, _),
+ !,
+ ppl_delete_Polyhedron(P).
+
+
+% Tests ppl_Polyhedron_minimize/5.
+minimize :-
+ make_vars(2, [A, B]),
+ minimize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, -2, 1, true),
+ minimize(c, [B >= -1, B =< 1], B, -1, 1, true),
+ minimize(nnc, [A > -2, A =< 2, B > -2, B =< 2], A + B + 1, -3, 1, false),
+ minimize(nnc, [B > -1, B < 1], B, -1, 1, false).
+
+minimize(T, CS, LE, N, D, Min) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+ ppl_Polyhedron_minimize(P, LE, N, D, Min),
+ ppl_Polyhedron_add_generator(P, ray(-LE)),
+ \+ ppl_Polyhedron_minimize(P, LE, _, _, _),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_minimize_with_point/5.
+minimize_with_point :-
+ make_vars(2, [A, B]),
+ minimize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+ A + B, -2, 1, true, point(-A-B)),
+ minimize_with_point(c, [A >= 0],
+ A, 0, 1, true, point(0)),
+ minimize_with_point(nnc, [A > -2, A =< 2, B > -2, B =< 2],
+ A + B, -4, 1, false, point(-2*A-2*B)).
+
+minimize_with_point(T, CS, LE, N, D, Min, Point) :-
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+ ppl_Polyhedron_minimize_with_point(P, LE, N, D, Min, Point_Min),
+ (Point_Min = closure_point(E) ; Point_Min = point(E)),
+ clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+ clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+ ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+ !,
+ ppl_delete_Polyhedron(Pm),
+ ppl_delete_Polyhedron(Qm),
+ \+ ppl_Polyhedron_minimize_with_point(P, LE, _N, 0, _, _),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%% Watchdog tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests Watchdog predicates
+% ppl_set_timeout/1
+% ppl_set_timeout_exception_atom/1
+% ppl_timeout_exception_atom/1
+% ppl_reset_timeout/0
+%
+
+time_out :-
+ %% FIXME!
+ %% Ciao does not throw a timeout exception.
+ prolog_system('Ciao'), !.
+time_out :-
+ time_out(c), time_out(nnc).
+
+add_constraints_and_get_minimized_constraints(P, CS) :-
+ ppl_Polyhedron_add_constraints(P, CS),
+ ppl_Polyhedron_get_minimized_constraints(P, _).
+
+% Find the constraints for a hypercube for a given dimension.
+build_hypercube_constraints(0, [], []).
+build_hypercube_constraints(Dim, [V|Vars], [V >= 0, V =< 1|CS]) :-
+ Dim1 is Dim - 1,
+ build_hypercube_constraints(Dim1, Vars, CS).
+
+% Find the dimension and constraints for
+% a hypercube that causes a timeout exception.
+compute_timeout_hypercube(Csecs, T, Dim_in, Dim_out, CS_out) :-
+ Dim_in =< 100,
+ clean_ppl_new_Polyhedron_from_space_dimension(T, Dim_in, universe, P),
+ make_vars(Dim_in, Vars),
+ build_hypercube_constraints(Dim_in, Vars, CS),
+ ppl_timeout_exception_atom(Time_Out_Atom),
+ catch((ppl_set_timeout(Csecs),
+ add_constraints_and_get_minimized_constraints(P, CS)),
+ Time_Out_Atom, Catch_Exception = ok),
+ ppl_reset_timeout,
+ (Catch_Exception == ok ->
+ Dim_out = Dim_in,
+ ppl_delete_Polyhedron(P),
+ CS_out = CS
+ ;
+ Dim1 is Dim_in+1,
+ ppl_delete_Polyhedron(P),
+ compute_timeout_hypercube(Csecs, T, Dim1, Dim_out, CS_out)
+ ).
+
+time_out(T) :-
+ ppl_set_timeout_exception_atom(pl_time_out),
+ \+ ppl_timeout_exception_atom(pl_x),
+ ppl_timeout_exception_atom(pl_time_out),
+ compute_timeout_hypercube(10, T, 1, Dim, CS),
+ !,
+ N1 is 1,
+ clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, P),
+ catch((ppl_set_timeout(N1),
+ add_constraints_and_get_minimized_constraints(P, CS)),
+ pl_time_out, Catch_Exception = ok),
+ ppl_reset_timeout,
+ (Catch_Exception == ok ->
+ display_message(['while testing time_out, polyhedron with topology',
+ T, 'timeout after', N1, ms])
+ ;
+ display_message(['while testing time_out, polyhedron with topology',
+ T, 'no timeout after', N1, ms]),
+ fail
+ ),
+ ppl_Polyhedron_OK(P),
+ !,
+ ppl_delete_Polyhedron(P),
+ N2 is 40,
+ clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, Q),
+ catch((ppl_set_timeout(N2),
+ ppl_Polyhedron_is_universe(Q)),
+ pl_time_out, Catch_Exception = not_ok),
+ ppl_reset_timeout,
+ (Catch_Exception == not_ok ->
+ display_message(['while testing time_out, polyhedron with topology',
+ T, 'timeout after', N2, ms]),
+ fail
+ ;
+ display_message(['while testing time_out, polyhedron with topology',
+ T, 'no timeout after', N2, ms])
+ ),
+ ppl_Polyhedron_OK(Q),
+ !,
+ ppl_delete_Polyhedron(Q).
+
+%%%%%%%%%%%%%%%%% MIP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+mip_problem :-
+ mip_from_cons,
+ mip_from_mip,
+ mip_swap,
+ mip_get,
+ mip_control_parameters,
+ mip_clear,
+ mip_satisfiable,
+ mip_add,
+ mip_set,
+ mip_solve,
+ mip_eval.
+
+mip_from_cons :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+ ppl_MIP_Problem_space_dimension(MIP, 3),
+ ppl_MIP_Problem_constraints(MIP, CS),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_MIP_Problem_optimization_mode(MIP, max),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_MIP_Problem(MIP).
+
+mip_from_mip :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+ clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_MIP_Problem_optimization_mode(MIP, max),
+ ppl_MIP_Problem_constraints(MIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_MIP_Problem_constraints(MIP1, Expect_CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_MIP_Problem(MIP1),
+ ppl_delete_MIP_Problem(MIP).
+
+mip_swap :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(0, [], 0, max, MIP),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+ ppl_MIP_Problem_swap(MIP, MIP1),
+ ppl_MIP_Problem_constraints(MIP, CS),
+ ppl_MIP_Problem_constraints(MIP1, CS1),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
+ ppl_Polyhedron_is_universe(PH1),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(PH1),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_MIP_Problem(MIP1),
+ ppl_delete_MIP_Problem(MIP).
+
+mip_get :-
+ make_vars(3, [A, B, C]),
+
+ ppl_new_MIP_Problem(3, [], A + 3, min, MIP0),
+ ppl_MIP_Problem_objective_function(MIP0, Obj0),
+ compare_lin_expressions(Obj0, A + 3),
+
+ ppl_new_MIP_Problem(3, [], 3, min, MIP1),
+ ppl_MIP_Problem_objective_function(MIP1, Obj1),
+ compare_lin_expressions(Obj1, 3),
+
+ clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+ ppl_MIP_Problem_constraints(MIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_MIP_Problem_optimization_mode(MIP, Opt),
+ Opt = max,
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_MIP_Problem(MIP0),
+ ppl_delete_MIP_Problem(MIP1),
+ ppl_delete_MIP_Problem(MIP).
+
+mip_control_parameters :-
+ make_vars(1, [A]),
+
+ ppl_new_MIP_Problem(3, [], A + 3, min, MIP0),
+ clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP0, MIP1),
+ ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value0),
+ ppl_MIP_Problem_set_control_parameter(MIP1, Cp_value0),
+ ppl_MIP_Problem_get_control_parameter(MIP1, pricing, Cp_value1),
+ Cp_value0 == Cp_value1,
+ ppl_MIP_Problem_set_control_parameter(MIP0, pricing_steepest_edge_float),
+ ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value2),
+ Cp_value2 == pricing_steepest_edge_float,
+ ppl_MIP_Problem_set_control_parameter(MIP0, pricing_steepest_edge_exact),
+ ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value3),
+ Cp_value3 == pricing_steepest_edge_exact,
+ ppl_MIP_Problem_set_control_parameter(MIP0, pricing_textbook),
+ ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value4),
+ Cp_value4 == pricing_textbook,
+ !,
+ ppl_delete_MIP_Problem(MIP0),
+ ppl_delete_MIP_Problem(MIP1).
+
+mip_clear :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, min, MIP),
+ ppl_MIP_Problem_clear(MIP),
+ ppl_MIP_Problem_space_dimension(MIP, D),
+ D == 0,
+ ppl_MIP_Problem_constraints(MIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_Polyhedron_is_universe(PH),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ compare_lin_expressions(Obj, 0),
+ ppl_MIP_Problem_optimization_mode(MIP, Opt),
+ Opt == max,
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_MIP_Problem(MIP).
+
+mip_satisfiable :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+ ppl_MIP_Problem_is_satisfiable(MIP),
+ ppl_MIP_Problem_add_constraint(MIP, A + B =< 0),
+ \+ ppl_MIP_Problem_is_satisfiable(MIP),
+ !,
+ ppl_delete_MIP_Problem(MIP).
+
+mip_add :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem_from_space_dimension(0, MIP),
+ ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 1),
+ ppl_MIP_Problem_add_constraint(MIP, A >= 0),
+ ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 2),
+ ppl_MIP_Problem_add_constraints(
+ MIP,[A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, max, MIP1),
+ ppl_MIP_Problem_solve(MIP, Status),
+ Status == optimized,
+ ppl_MIP_Problem_solve(MIP1, Status1),
+ Status1 == unbounded,
+ ppl_MIP_Problem_optimal_value(MIP, N, D),
+ N == 0,
+ D == 1,
+ ppl_MIP_Problem_constraints(MIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_MIP_Problem_constraints(MIP1, Expect_CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_MIP_Problem(MIP),
+ ppl_delete_MIP_Problem(MIP1).
+
+mip_set :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+ ppl_MIP_Problem_objective_function(MIP, 0),
+ ppl_MIP_Problem_optimization_mode(MIP, max),
+ ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+ ppl_MIP_Problem_set_optimization_mode(MIP, min),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ compare_lin_expressions(Obj, 2*B-C),
+ ppl_MIP_Problem_optimization_mode(MIP, min),
+ ppl_MIP_Problem_solve(MIP, optimized),
+ !,
+ ppl_delete_MIP_Problem(MIP).
+
+mip_solve :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+ ppl_MIP_Problem_objective_function(MIP, 0),
+ ppl_MIP_Problem_optimization_mode(MIP, max),
+ ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+ ppl_MIP_Problem_set_optimization_mode(MIP, min),
+ ppl_MIP_Problem_solve(MIP, optimized),
+ ppl_MIP_Problem_set_objective_function(MIP, C),
+ ppl_MIP_Problem_solve(MIP, unbounded),
+ ppl_MIP_Problem_add_constraint(MIP, B = 0),
+ ppl_MIP_Problem_solve(MIP, unfeasible),
+ \+ppl_MIP_Problem_solve(MIP, invalid_status),
+ !,
+ ppl_delete_MIP_Problem(MIP).
+
+mip_eval :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_MIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, min, MIP),
+ \+ ppl_MIP_Problem_optimizing_point(MIP, closure_point(_X)),
+ ppl_MIP_Problem_optimizing_point(MIP, Point),
+ ppl_MIP_Problem_feasible_point(MIP, Point),
+ \+ ppl_MIP_Problem_feasible_point(MIP, point(B)),
+ clean_ppl_new_Polyhedron_from_generators(c, [Point], PH),
+ clean_ppl_new_Polyhedron_from_generators(c, [point(5*B+5*C)], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ \+ ppl_MIP_Problem_optimal_value(MIP, 2, 1),
+ ppl_MIP_Problem_optimal_value(MIP, N, D),
+ \+ ppl_MIP_Problem_evaluate_objective_function(MIP, Point, 2, 1),
+ ppl_MIP_Problem_evaluate_objective_function(MIP, Point, N1, D1),
+ N == N1,
+ D == D1,
+ ppl_MIP_Problem_OK(MIP),
+ !,
+ ppl_delete_MIP_Problem(MIP),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_Polyhedron(PH).
+
+%%%%%%%%%%%%%%%%% PIP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pip_problem :-
+ pip_from_cons,
+ pip_from_pip,
+ pip_swap,
+ pip_control_parameters,
+ pip_clear,
+ pip_satisfiable,
+ pip_add,
+ pip_set,
+ pip_solve,
+ pip_solution.
+
+pip_from_cons :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem_from_space_dimension(3, PIP1),
+ ppl_PIP_Problem_space_dimension(PIP1, 3),
+ ppl_PIP_Problem_OK(PIP1),
+ clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+ ppl_PIP_Problem_space_dimension(PIP, 3),
+ ppl_PIP_Problem_parameter_space_dimensions(PIP, [C]),
+ ppl_PIP_Problem_constraints(PIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_PIP_Problem(PIP1),
+ ppl_delete_PIP_Problem(PIP).
+
+pip_from_pip :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem(
+ 3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP1),
+ clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP),
+ ppl_PIP_Problem_constraints(PIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_PIP_Problem_constraints(PIP1, Expect_CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_PIP_Problem(PIP1),
+ ppl_delete_PIP_Problem(PIP).
+
+pip_swap :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem_from_space_dimension(0, PIP),
+ clean_ppl_new_PIP_Problem(
+ 3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP1),
+ ppl_PIP_Problem_swap(PIP, PIP1),
+ ppl_PIP_Problem_constraints(PIP, CS),
+ ppl_PIP_Problem_constraints(PIP1, CS1),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
+ ppl_Polyhedron_is_universe(PH1),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(PH1),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_PIP_Problem(PIP1),
+ ppl_delete_PIP_Problem(PIP).
+
+pip_control_parameters :-
+ make_vars(1, [A]),
+
+ ppl_new_PIP_Problem(3, [], [A], PIP0),
+ clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP0, PIP1),
+ ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value0),
+ ppl_PIP_Problem_set_control_parameter(PIP1, Cp_value0),
+ ppl_PIP_Problem_get_control_parameter(PIP1, cutting_strategy, Cp_value1),
+ Cp_value0 == Cp_value1,
+ ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_first),
+ ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value2),
+ Cp_value2 == cutting_strategy_first,
+ ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_deepest),
+ ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value3),
+ Cp_value3 == cutting_strategy_deepest,
+ ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_all),
+ ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value4),
+ Cp_value4 == cutting_strategy_all,
+
+ ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value5),
+ ppl_PIP_Problem_set_control_parameter(PIP1, Cp_value5),
+ ppl_PIP_Problem_get_control_parameter(PIP1, pivot_row_strategy, Cp_value6),
+ Cp_value5 == Cp_value6,
+ ppl_PIP_Problem_set_control_parameter(PIP0, pivot_row_strategy_first),
+ ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value7),
+ Cp_value7 == pivot_row_strategy_first,
+ ppl_PIP_Problem_set_control_parameter(PIP0, pivot_row_strategy_max_column),
+ ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value8),
+ Cp_value8 == pivot_row_strategy_max_column,
+ !,
+ ppl_delete_PIP_Problem(PIP0),
+ ppl_delete_PIP_Problem(PIP1).
+
+pip_clear :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+ ppl_PIP_Problem_clear(PIP),
+ ppl_PIP_Problem_space_dimension(PIP, D),
+ D == 0,
+ ppl_PIP_Problem_constraints(PIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_Polyhedron_is_universe(PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_PIP_Problem(PIP).
+
+pip_satisfiable :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+ ppl_PIP_Problem_is_satisfiable(PIP),
+ ppl_PIP_Problem_add_constraint(PIP, A + B =< 0),
+ \+ ppl_PIP_Problem_is_satisfiable(PIP),
+ !,
+ ppl_delete_PIP_Problem(PIP).
+
+pip_add :-
+ make_vars(4, [A, B, C, D]),
+ clean_ppl_new_PIP_Problem_from_space_dimension(0, PIP),
+ ppl_PIP_Problem_add_space_dimensions_and_embed(PIP, 1, 0),
+ ppl_PIP_Problem_add_constraint(PIP, A >= 0),
+ ppl_PIP_Problem_add_space_dimensions_and_embed(PIP, 2, 1),
+ ppl_PIP_Problem_add_constraints(
+ PIP, [A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+ clean_ppl_new_PIP_Problem(
+ 4, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [D], PIP1),
+ ppl_PIP_Problem_constraints(PIP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_PIP_Problem_constraints(PIP1, Expect_CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+ ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_PIP_Problem(PIP),
+ ppl_delete_PIP_Problem(PIP1).
+
+pip_set :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B], PIP),
+ \+ ppl_PIP_Problem_has_big_parameter_dimension(PIP, _X),
+ ppl_PIP_Problem_solve(PIP, optimized),
+ !,
+ ppl_delete_PIP_Problem(PIP),
+
+ make_vars(4, [X, Y, P, M]),
+ clean_ppl_new_PIP_Problem(
+ 4, [Y - M >= -2*X + 2*M - 4, 2*Y - 2*M =< X - M + 2*P], [P, M], PIP1),
+ ppl_PIP_Problem_set_big_parameter_dimension(PIP1, 3),
+ ppl_PIP_Problem_has_big_parameter_dimension(PIP1, 3),
+ ppl_PIP_Problem_solve(PIP1, optimized),
+ !,
+ ppl_delete_PIP_Problem(PIP1).
+
+pip_solve :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_PIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B], PIP),
+ ppl_PIP_Problem_solve(PIP, Status),
+ Status == optimized,
+ clean_ppl_new_PIP_Problem(
+ 3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B,C], PIP1),
+ ppl_PIP_Problem_add_constraint(PIP1, C >= 6),
+ ppl_PIP_Problem_solve(PIP1, Status1),
+ Status1 == unfeasible,
+ ppl_PIP_Problem_add_constraint(PIP, B = 0),
+ ppl_PIP_Problem_solve(PIP, unfeasible),
+ \+ppl_PIP_Problem_solve(PIP, invalid_status),
+ !,
+ ppl_delete_PIP_Problem(PIP),
+ ppl_delete_PIP_Problem(PIP1).
+
+pip_solution :-
+ make_vars(4, [I, J, M, N]),
+ clean_ppl_new_PIP_Problem(
+ 4, [3*J >= -2*I + 8, J =< 4*I - 4, J =< M, I =< N], [M,N], PIP),
+ ppl_PIP_Problem_solution(PIP, Node),
+ ppl_PIP_Tree_Node_artificials(Node, Artificials),
+ Artificials = [],
+ \+ ppl_PIP_Tree_Node_is_solution(Node),
+ ppl_PIP_Tree_Node_constraints(Node, _CS),
+ ppl_PIP_Tree_Node_is_decision(Node),
+ ppl_PIP_Tree_Node_constraints(Node, _CS1),
+ ppl_PIP_Tree_Node_true_child(Node, TChild),
+ ppl_PIP_Tree_Node_false_child(Node, _FChild),
+ ppl_PIP_Tree_Node_is_decision(TChild),
+ ppl_PIP_Tree_Node_true_child(TChild, TTChild),
+ \+ ppl_PIP_Tree_Node_is_decision(TTChild),
+ ppl_PIP_Tree_Node_is_solution(TTChild),
+ ppl_PIP_Tree_Node_parametric_values(TTChild, I, _TPV),
+ ppl_PIP_Tree_Node_false_child(TChild, FTChild),
+ ppl_PIP_Tree_Node_artificials(FTChild, FTChild_Artificials),
+ FTChild_Artificials = [Art_LinExpr/Art_Den],
+ compare_lin_expressions(Art_LinExpr, M),
+ Art_Den = 2,
+ ppl_PIP_Tree_Node_is_solution(FTChild),
+ ppl_PIP_Tree_Node_parametric_values(FTChild, I, _FPV),
+ ppl_PIP_Problem_OK(PIP),
+ ppl_PIP_Tree_Node_OK(Node),
+ !,
+ ppl_delete_PIP_Problem(PIP).
+
+%%%%%%%%%%%%%%%% Tool to compare linear expressions %%%%%%%%%%%%%%%%%%%%%%%
+
+% compare_lin_expressions/2 checks if 2 linear expressions
+% are semantically the same.
+%
+% If we need to compare 2 linear expressions, then this is better
+% than a syntactic check- since we want 1*C equal to C.
+
+compare_lin_expressions(LE1, LE2) :-
+ clean_ppl_new_Polyhedron_from_constraints(c, [LE1 = 0], PH1),
+ clean_ppl_new_Polyhedron_from_constraints(c, [LE2 = 0], PH2),
+ ppl_Polyhedron_equals_Polyhedron(PH1, PH2),
+ !,
+ ppl_delete_Polyhedron(PH1),
+ ppl_delete_Polyhedron(PH2).
+
+%%%%%%%%%%%%%%%% Check C++ <--> Prolog numbers %%%%%%%%%%%%%%%%%%%%%%%
+
+/*
+ This test checks the transfer of large numbers between Prolog and C++.
+ We test all numbers (BigNum) which are +/- (2^E +/- A) where E is one of
+ the numbers in the list defined by large_integers_exponents/1 and
+ A is one of the numbers in the list defined by large_integers_additions/1.
+
+ Thus we pass a BigNum from the Prolog to C++ and construct a polyhedron
+ P (space dimension = 1) consisting of a single point A = BigNum.
+ We also get the constraint defining P and then construct a second
+ polyhedron P1 from this constraint; P is then compared with P1.
+ To ensure that errors from Prolog to C++ and C++ to Prolog do not cancel
+ each other out, we also construct a polyhedron P2 consisting of just
+ the point A = 1 and use affine transformations (on polyhedra) to change P2
+ to a polyhedron with the point A = BigNum; then P2 is compared with P.
+
+ To see exactly which numbers are tested, first make the test "extra noisy"
+ using make_extra_noisy/0; i.e., type:
+ make_extra_noisy, large_integers.
+*/
+
+large_integers_exponents([0, 7, 8, 15, 16, 27, 28, 29, 30, 31, 32, 63, 64]).
+
+large_integers_additions([-3, -2, -1, 0, 1, 2, 3]).
+
+large_integers :-
+ large_integers_exponents(Exps),
+ large_integers_additions(Adds),
+ out(large_int, init),
+ pl_check_prolog_flag(bounded, Y),
+ (Y == true ->
+ large_integers_prolog_cpp_bounded(Exps, Adds, 0),
+ out(sys_large_int, init),
+ large_integers_sys_prolog_cpp(Adds)
+ ;
+ large_integers_prolog_cpp_unbounded(Exps, Adds)
+ ).
+
+large_integers_prolog_cpp_bounded([], _, _).
+large_integers_prolog_cpp_bounded([Exp|Exps], Adds, Prev_value) :-
+ /* If the test value is too large, it may be wrap.
+ So we compare it with the previous value that was ok
+ as well as checking it against the maximum value. */
+ Test_value is 1 << Exp + 3,
+ ( ( Test_value =< Prev_value ;
+ (pl_check_prolog_flag(max_integer, Max_int),
+ Max_int >> 1 =< Test_value)
+ ) ->
+ true
+ ;
+ large_integers_prolog_cpp1(Adds, Exp),
+ large_integers_prolog_cpp_bounded(Exps, Adds, Test_value)
+ ).
+
+large_integers_prolog_cpp_unbounded([], _).
+large_integers_prolog_cpp_unbounded([Exp|Exps], Adds) :-
+ large_integers_prolog_cpp1(Adds, Exp),
+ large_integers_prolog_cpp_unbounded(Exps, Adds).
+
+large_integers_prolog_cpp1([], _).
+large_integers_prolog_cpp1([Add|Adds], Exp) :-
+ large_integers_prolog_cpp2(Exp, Add, 1),
+ large_integers_prolog_cpp2(Exp, Add, -1),
+ large_integers_prolog_cpp1(Adds, Exp).
+
+large_integers_prolog_cpp2(Exp, Add, Sign) :-
+ Inhomo is Sign * ((1 << Exp) + Add),
+ out(large_int, Inhomo, Sign, Add, Exp),
+ make_vars(1, [A]),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+ ppl_Polyhedron_get_constraints(P, CS),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, CS),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+ ppl_Polyhedron_add_constraint(P2, A = 1),
+ large_integers_affine_transform_loop(Exp, P2, A),
+ ppl_Polyhedron_affine_image(P2, A, Sign * (A + Add), 1),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+large_integers_sys_prolog_cpp([]).
+large_integers_sys_prolog_cpp([Add|Adds]) :-
+ pl_check_prolog_flag(max_integer, Max_int),
+ pl_check_prolog_flag(min_integer, Min_int),
+ Max is Max_int-3,
+ Min is Min_int+3,
+ large_integers_sys_prolog_cpp2(Max, Add, 1),
+ large_integers_sys_prolog_cpp2(Min, Add, -1),
+ large_integers_sys_prolog_cpp(Adds).
+
+large_integers_sys_prolog_cpp2(MaxMin, Add, Sign) :-
+ make_vars(1, [A]),
+ Inhomo is MaxMin + Sign* Add,
+ out(sys_large_int, Inhomo),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+ ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+ ppl_Polyhedron_get_constraints(P, CS),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+ ppl_Polyhedron_add_constraints(P1, CS),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+ InhomoDiv2 is Inhomo // 2,
+ InhomoMod2 is Inhomo mod 2,
+ ppl_Polyhedron_add_constraint(P2, A = InhomoDiv2),
+ ppl_Polyhedron_affine_image(P2, A, 2*A + Sign* InhomoMod2, 1),
+ ppl_Polyhedron_equals_Polyhedron(P, P2),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+large_integers_affine_transform_loop(0, _P, _).
+large_integers_affine_transform_loop(Exp, P, A) :-
+ Exp >= 1,
+ ppl_Polyhedron_affine_image(P, A, 2*A, 1),
+ Exp1 is Exp - 1,
+ large_integers_affine_transform_loop(Exp1, P, A).
+
+%%%%%%%%%%%%%%%%% Exceptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% exceptions/0 tests both Prolog and C++ exceptions using:
+%
+% exception_prolog(+N, +V)
+% exception_sys_prolog(+N, +V)
+% exception_cplusplus(+N, +V)
+%
+% N is the number of the test while V is a list of 3 PPL variables
+%
+% In exceptions/0, the calls to these predicates should fail
+% so that all the tests are tried on backtracking.
+% When all the tests have been tried,
+% (and, for the Prolog interface, providing the correct
+% exception message),
+% the call to exceptions/0 succeeds.
+% If one of the tests succeeds or a Prolog interface exception
+% has a wrong exception message, then exceptions/0 will fail.
+
+exceptions :-
+ pl_check_prolog_flag(bounded, Y),
+ make_vars(3, V),
+ exception_prolog(V),
+ ((Y == true,\+prolog_system('XSB')) -> exception_sys_prolog(V) ; true),
+ exception_cplusplus(V),
+ !.
+exceptions :-
+ prolog_system('XSB').
+
+%% TEST: Prolog_unsigned_out_of_range
+exception_yap :-
+ I = 21474836470, J = 3, K = 0,
+ ppl_new_C_Polyhedron_from_generators(
+ [point('$VAR'(I)),point('$VAR'(J))], P),
+ ppl_Polyhedron_get_generators(P, GS),
+ nl, write(GS), nl,
+ ppl_new_C_Polyhedron_from_generators(
+ [point('$VAR'(I)),point('$VAR'(K))], P1),
+ ppl_Polyhedron_get_generators(P1, GS1),
+ nl, write(GS1), nl,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+% exception_prolog(+N, +V) checks exceptions thrown by the Prolog interface.
+% It does not check those that are dependent on a specific Prolog system.
+
+exception_prolog(V) :-
+ exception_prolog1(14, V).
+
+exception_prolog1(0, _) :- !.
+exception_prolog1(N, V) :-
+ exception_prolog(N, V),
+ N1 is N - 1,
+ exception_prolog1(N1, V).
+
+%% TEST: Prolog_unsigned_out_of_range.
+%% This test accepts any one of three exceptions:
+%% ppl_invalid_argument: with a 32 bit system, the number 1 << 59 is expected
+%% to throw this Prolog exception;
+%% out_of_memory: with a 64 bit system, the number 1 << 59 does not
+%% throw an exception on the Prolog side, but the
+%% large number of dimensions will cause a bad_alloc
+%% exception in C++.
+%%
+exception_prolog(1, _) :-
+ pl_check_prolog_flag(bounded, Y),
+ (Y == true ->
+ true
+ ;
+ (I is 1 << 59,
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(I))], _),
+ prolog_exception_error)
+ )
+ ).
+
+%% TEST: not_unsigned_integer
+exception_prolog(2, _) :-
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(n, universe, _),
+ ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(-1, universe, _),
+ ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(n))], _),
+ ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(-1))], _),
+ ppl_invalid_argument).
+
+%% TEST: not_unsigned_integer
+exception_prolog(3, _) :-
+ must_catch(ppl_set_timeout(-1), ppl_invalid_argument).
+
+%% TEST: not_unsigned_integer
+exception_prolog(4, _) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, Q),
+ must_catch(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
+ Q, P, -1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_H79_widening_assign_with_tokens(
+ Q, P, -1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _), ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+%% TEST: non_linear
+exception_prolog(5, [A,B,C]) :-
+ must_catch(ppl_new_C_Polyhedron_from_generators([point(B + A*C)], _),
+ ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point(C), ray(B + C, 1)], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point(_D)], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [_E >= 3], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A*B = 0], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A], _), ppl_invalid_argument).
+
+%% TEST: not_a_variable
+exception_prolog(6, [A,_,_]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+ must_catch(ppl_Polyhedron_remove_space_dimensions(P, [A,1]),
+ ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%% TEST: not_an_integer
+exception_prolog(7, [A,B,_]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A + B), ray(A), ray(B)], P),
+ must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, i),
+ ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%% TEST: not_a_polyhedron_handle
+exception_prolog(8, _) :-
+ must_catch(ppl_Polyhedron_space_dimension(_, _N), ppl_invalid_argument).
+
+%% TEST: not_a_complexity_class
+exception_prolog(9, [A, _, _]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A)], P),
+ must_catch(
+ clean_ppl_new_Polyhedron_from_Polyhedron_with_complexity(a, c, P,
+ c, _P_copy),
+ ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%% TEST: not_universe_or_empty
+exception_prolog(10, _) :-
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(3, xxx, _),
+ ppl_invalid_argument).
+
+%% TEST: not_relation
+exception_prolog(11, [A, B, _]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A)], P),
+ must_catch(ppl_Polyhedron_generalized_affine_image(P, A, x, A + 1, 1),
+ ppl_invalid_argument),
+ must_catch(
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1),
+ ppl_invalid_argument),
+ must_catch(
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1),
+ ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P).
+
+%% TEST: not_a_nil_terminated_list
+exception_prolog(12, [A, B, C]) :-
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point(A + B + C, 1) | not_a_list], _), ppl_invalid_argument),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A = 0, B >= C | not_a_list], _), ppl_invalid_argument),
+ clean_ppl_new_Polyhedron_from_space_dimension(nnc, 3, universe, P),
+ must_catch(ppl_Polyhedron_add_constraints(P, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_add_constraints(P, not_a_list),
+ ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_add_generators(P, not_a_list),
+ ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_add_generators(P, _), ppl_invalid_argument),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 3, empty, Q),
+ must_catch(ppl_Polyhedron_map_space_dimensions(Q, not_a_list),
+ ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_fold_space_dimensions(Q, not_a_list, B),
+ ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_remove_space_dimensions(Q, not_a_list),
+ ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign(
+ Q, P, not_a_list), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign(
+ Q, P, not_a_list), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(
+ Q, P, not_a_list), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(
+ Q, P, not_a_list), ppl_invalid_argument),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _), ppl_invalid_argument),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+%% TEST: not_an_mip_problem_handle
+exception_prolog(13, _) :-
+ must_catch(ppl_MIP_Problem_space_dimension(_, _N), ppl_invalid_argument),
+ must_catch(ppl_MIP_Problem_constraints(p, []), ppl_invalid_argument).
+
+%% TEST: not_an_pip_problem_handle
+exception_prolog(14, _) :-
+ must_catch(ppl_PIP_Problem_space_dimension(_, _N), ppl_invalid_argument),
+ must_catch(ppl_PIP_Problem_constraints(p, []), ppl_invalid_argument).
+
+% exception_sys_prolog(+N, +V) checks exceptions thrown by Prolog interfaces
+% that are dependent on a specific Prolog system.
+% These are only checked if current_prolog_flag(bounded, true) holds.
+
+exception_sys_prolog(V) :-
+ exception_sys_prolog1(4, V).
+
+exception_sys_prolog1(0, _) :- !.
+exception_sys_prolog1(N, V) :-
+ exception_sys_prolog(N, V),
+ N1 is N - 1,
+ exception_sys_prolog1(N1, V).
+
+exception_sys_prolog(1, [A,B,_]) :-
+ pl_check_prolog_flag(max_integer, Max_Int),
+ catch((
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [Max_Int * A - B =< 0, 3 >= A], P),
+ must_catch(ppl_Polyhedron_get_generators(P, _GS),
+ ppl_sys_prolog_error),
+ !,
+ ppl_delete_Polyhedron(P)
+ ),
+ ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause))
+ ).
+
+ exception_sys_prolog(2, [A,B,_]) :-
+ pl_check_prolog_flag(min_integer, Min_Int),
+ catch((
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [Min_Int * A - B =< 0, 2 >= A], P),
+ must_catch(ppl_Polyhedron_get_generators(P, _GS),
+ ppl_sys_prolog_error),
+ !,
+ ppl_delete_Polyhedron(P)
+ ),
+ ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause))
+ ).
+
+exception_sys_prolog(3, [A,B,_]) :-
+ pl_check_prolog_flag(max_integer, Max_Int),
+ catch((
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(Max_Int * A + B)], P),
+ ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+ must_catch(ppl_Polyhedron_get_generators(P, _GS),
+ ppl_sys_prolog_error),
+ !,
+ ppl_delete_Polyhedron(P)
+ ),
+ ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause))
+ ).
+
+exception_sys_prolog(4, [A,_,_]) :-
+ pl_check_prolog_flag(min_integer, Min_Int),
+ catch((
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(Min_Int*A)], P),
+ ppl_Polyhedron_affine_image(P, A, A - 1, 1),
+ must_catch(ppl_Polyhedron_get_generators(P, _GS),
+ ppl_sys_prolog_error),
+ !,
+ ppl_delete_Polyhedron(P)
+ ),
+ ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause))
+ ).
+
+% exception_cplusplus(+N, +V) checks exceptions thrown by the C++
+% interface for the PPL.
+
+exception_cplusplus(V) :-
+ exception_cplusplus1(10, V).
+
+exception_cplusplus1(0, _) :- !.
+exception_cplusplus1(N, V) :-
+ exception_cplusplus(N, V),
+ N1 is N - 1,
+ exception_cplusplus1(N1, V).
+
+exception_cplusplus(1, [A, B, C]) :-
+ must_catch(ppl_new_C_Polyhedron_from_generators([point(A + B + C, 0)], _),
+ cpp_error).
+
+exception_cplusplus(2, [A, B, _]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A + B), ray(A), ray(B)], P),
+ must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, 0),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+exception_cplusplus(3, [A, B, _]) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 0, universe, P1),
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A + B)], P2),
+ must_catch(ppl_Polyhedron_poly_hull_assign(P1, P2),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2).
+
+exception_cplusplus(4, [A, B, C]) :-
+ must_catch(ppl_new_C_Polyhedron_from_generators([line(A + B + C)], _),
+ cpp_error).
+
+exception_cplusplus(5, [A,B,C]) :-
+ clean_ppl_new_Polyhedron_from_generators(c, [point(B + 2*C)], P),
+ ppl_Polyhedron_remove_space_dimensions(P, [C]),
+ must_catch(ppl_Polyhedron_remove_space_dimensions(P, [A, C]),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+exception_cplusplus(6, [A, B, _]) :-
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= 1], P),
+ must_catch(ppl_Polyhedron_affine_image(P, B, A + 1, 1),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+exception_cplusplus(7, [A, B, C]) :-
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= 1, B>= 1], P),
+ must_catch(ppl_Polyhedron_affine_image(P, B, A + C + 1, 1),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+exception_cplusplus(8, [A, B, _]) :-
+ clean_ppl_new_Polyhedron_from_constraints(c,
+ [A >= B], P),
+ must_catch(ppl_Polyhedron_affine_preimage(P, A, A + B + 1, 0),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+exception_cplusplus(9, [A, B, C]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(0), ray(A + B), ray(A)], P),
+ must_catch(ppl_Polyhedron_affine_preimage(P, C, A + 1, 1),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+
+exception_cplusplus(10, [A, B, C]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(0), point(A), line(A + B)], P),
+ must_catch(ppl_Polyhedron_affine_preimage(P, B, A + C, 1),
+ cpp_error),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% must_catch(+Call) calls Call using catch and checks exception.
+% If expected exception is caught, it succeeds and fails if not.
+
+must_catch(Call, prolog_exception_error) :-
+ !,
+ catch( Call, Message, format_exception_message( Message ) ),
+ ( \+var(Message) ->
+ ((
+ Message =.. [ppl_invalid_argument|_]
+ ;
+ Message =.. [ppl_length_error|_]
+ ;
+ Message = out_of_memory
+ ) ->
+ true
+ ;
+ check_exception_term(Message)
+ )
+ ;
+ fail
+ ).
+must_catch(Call, cpp_error) :-
+ !,
+ catch( Call, Message, format_exception_message( cpp_error(Message) ) ),
+ ( ( \+ var(Message),
+ functor(Message, ppl_invalid_argument, _) ) ->
+ true
+ ;
+ fail
+ ).
+must_catch(Call, ppl_sys_prolog_error) :-
+ !,
+ catch( Call, Message, format_exception_message(Message) ),
+ ( ( \+ var(Message),
+ (Message =.. [ppl_representation_error|_] )) ->
+ true
+ ;
+ fail
+ ).
+must_catch(Call, Expected) :-
+ catch(Call, Message, format_exception_message(Message) ),
+ (\+ var(Message), Message = ppl_overflow_error(_) ->
+ true
+ ;
+ ( \+ var(Message), Message =.. [Expected|_] ->
+ true
+ ;
+ fail
+ )
+ ).
+
+%%%%%%%%%%%% predicate for making list of ppl variables %%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List):-
+ make_var_list(0, Dim, Var_List).
+make_var_list(Dim,Dim,[]):- !.
+make_var_list(I,Dim,['$VAR'(I)|Var_List]):-
+ I1 is I + 1,
+ make_var_list(I1,Dim,Var_List).
+
+%%%%%%%%%%%% predicate for safely deleting polyhedra on failure %
+
+cleanup_ppl_Polyhedron(_).
+cleanup_ppl_Polyhedron(P) :-
+ out(cs, P),
+ out(gs, P),
+ ppl_delete_Polyhedron(P), fail.
+
+cleanup_ppl_Polyhedra([]).
+cleanup_ppl_Polyhedra([_|_]).
+cleanup_ppl_Polyhedra([P|Ps]) :-
+ delete_all_ppl_Polyhedra([P|Ps]).
+
+delete_all_ppl_Polyhedra([]).
+delete_all_ppl_Polyhedra([P|Ps]) :-
+ ppl_delete_Polyhedron(P),
+ delete_all_ppl_Polyhedra(Ps).
+
+cleanup_ppl_MIP_Problem(_).
+cleanup_ppl_MIP_Problem(MIP) :-
+ out(mip, MIP),
+ ppl_delete_MIP_Problem(MIP), fail.
+
+cleanup_ppl_PIP_Problem(_).
+cleanup_ppl_PIP_Problem(PIP) :-
+ out(pip, PIP),
+ ppl_delete_PIP_Problem(PIP), fail.
+
+out(cs, P):-
+ ((noisy(N), N < 2) -> true ;
+ ppl_Polyhedron_get_constraints(P, CS),
+ nl, write(CS), nl
+ ).
+
+out(gs, P):-
+ ((noisy(N), N < 2) -> true ;
+ ppl_Polyhedron_get_generators(P, GS),
+ nl, write(GS), nl
+ ).
+
+out(mip, MIP):-
+ ((noisy(N), N < 2) -> true ;
+ ppl_MIP_Problem_constraints(MIP, CS),
+ ppl_MIP_Problem_objective_function(MIP, Obj),
+ ppl_MIP_Problem_optimization_mode(MIP, Opt),
+ ppl_MIP_Problem_get_control_parameter(MIP, pricing, Cp_value),
+ nl,
+ write(' constraint system is: '), write(CS), nl,
+ write(' objective function is: '), write(Obj), nl,
+ write(' optimization mode is: '), write(Opt),
+ write(' control_parameter_value is: '), write(Cp_value),
+ nl
+ ).
+
+out(pip, PIP):-
+ ((noisy(N), N < 2) -> true ;
+ ppl_PIP_Problem_constraints(PIP, CS),
+ ppl_PIP_Problem_parameter_space_dimensions(PIP, Dims),
+ ppl_PIP_Problem_get_control_parameter(PIP, cutting_strategy, Cp_value),
+ nl,
+ write(' constraint system is: '), write(CS), nl,
+ write(' parameter space dimensions are: '), write(Dims), nl,
+ write(' control_parameter_value is: '), write(Cp_value),
+ nl
+ ).
+
+out(sys_large_int, init):-
+ !,
+ prolog_system(System),
+ ((noisy(N), N < 2) -> true ;
+ nl, write_all([' At the Prolog/C++ interface, for', System, 'Prolog', nl,
+ ' the extra numbers tested are: ']),
+ nl
+ ).
+
+out(sys_large_int, Num):-
+ ((noisy(N), N < 2) -> true ;
+ write_all([Num, ', '])
+ ).
+
+out(large_int, init):-
+ !,
+ ((noisy(N), N < 2) -> true ;
+ nl, write(' At the Prolog/C++ interface, the numbers tested are: '),
+ nl
+ ).
+
+out(large_int, Num, Sign, Add, Exp):-
+ ((noisy(N), N < 2) -> true ;
+ write_all([Num, ' = ', Sign, ' * ', '((1 << ', Exp, ') + ', Add, '), '])
+ ).
+
+%%% predicates for ensuring new polyhedra are always deleted on failure %
+
+clean_ppl_new_Polyhedron_from_space_dimension(T, D, Universe_or_Empty, P) :-
+ (T = c ->
+ ppl_new_C_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_constraints(T, CS, P) :-
+ (T = c ->
+ ppl_new_C_Polyhedron_from_constraints(CS, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_constraints(CS, P)
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_generators(T, GS, P) :-
+ (T = c ->
+ ppl_new_C_Polyhedron_from_generators(GS, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_generators(GS, P)
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_Polyhedron(TQ, Q, TP, P) :-
+ ((TP == c, TQ == c) ->
+ ppl_new_C_Polyhedron_from_C_Polyhedron(Q, P)
+ ;
+ ((TP == c, TQ == nnc) ->
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron(Q, P)
+ ;
+ ((TP == nnc, TQ == c) ->
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron(Q, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Q, P)
+ )
+ )
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_Polyhedron_with_complexity(C, TQ, Q, TP, P) :-
+ ((TP == c, TQ == c) ->
+ ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity(C, Q, P)
+ ;
+ ((TP == c, TQ == nnc) ->
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity(C, Q, P)
+ ;
+ ((TP == nnc, TQ == c) ->
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity(C, Q, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity(C, Q, P)
+ )
+ )
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_MIP_Problem_from_space_dimension(Dim, MIP) :-
+ ppl_new_MIP_Problem_from_space_dimension(Dim, MIP),
+ cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP) :-
+ ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP),
+ cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP) :-
+ ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+ cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_PIP_Problem_from_space_dimension(Dim, PIP) :-
+ ppl_new_PIP_Problem_from_space_dimension(Dim, PIP),
+ cleanup_ppl_PIP_Problem(PIP).
+
+clean_ppl_new_PIP_Problem(Dim, CS, Vars, PIP) :-
+ ppl_new_PIP_Problem(Dim, CS, Vars, PIP),
+ cleanup_ppl_PIP_Problem(PIP).
+
+clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP) :-
+ ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP),
+ cleanup_ppl_PIP_Problem(PIP).
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+ (retract(noisy(_)) ->
+ make_extra_noisy
+ ;
+ assertz(noisy(2))
+ ).
+
+make_noisy :-
+ (retract(noisy(_)) ->
+ make_noisy
+ ;
+ assertz(noisy(1))
+ ).
+
+make_quiet :-
+ (retract(noisy(_)) ->
+ make_quiet
+ ; assertz(noisy(0))
+ ).
+
+%%%%%%%%%%%% predicates for pretty printing the PPL banner %%%%%%%%%%
+%
+% The banner is read as an atom with"/n" denoting where there should
+% new lines. Here we print the banner as intended with new lines instead
+% of "/n".
+%
+
+banner_pp(B) :-
+ name(B,Bcodes),
+ nl,
+ !,
+ format_banner(Bcodes).
+
+format_banner([]) :- nl.
+format_banner([C]) :- put_code(C), nl.
+format_banner([C,C1|Chars]):-
+ ([C,C1] == "/n" ->
+ (nl,
+ format_banner(Chars))
+ ;
+ (put_code(C),
+ format_banner([C1|Chars]))
+ ).
+
+%%%%%%%%%%%% predicate for handling an unintended exception %%%%
+
+check_exception_term(ppl_overflow_error(Cause)) :-
+ ((Cause == 'Negative overflow.'; Cause == 'Positive overflow.') ->
+ true
+ ;
+ print_exception_term(ppl_overflow_error(Cause))
+ ),
+ !.
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+ nl,
+ write('Error: an overflow has been detected by the PPL: '),
+ write(Cause),
+ nl,
+ !.
+
+print_exception_term(Exception) :-
+ write('exception'), nl,
+ nl,
+ writeq(Exception),
+ nl.
+
+%%%%%%%%%%%% predicate for printing exception messages %%%%%%%%%%
+
+format_exception_message(
+ ppl_invalid_argument( found(F), expected(E), where(W))
+ ) :-
+ !,
+ display_message(['PPL Prolog Interface Exception:', nl, ' ',
+ F, 'is an invalid argument for', W, nl, ' ',
+ F, 'should be', E, '.']).
+
+format_exception_message(ppl_length_error(Error)) :-
+ !,
+ display_message(['PPL Prolog Interface Exception: ', nl, ' ',
+ 'ppl_length_error', Error]).
+
+format_exception_message(
+ ppl_representation_error(I, where(W))
+ ) :-
+ !,
+ display_message(['PPL Prolog Interface Exception:', nl, ' ',
+ 'This Prolog system has bounded integers', nl, ' ',
+ I, 'is not in the allowed range of integers', nl, ' ',
+ 'in call to', W, '.']).
+
+format_exception_message(out_of_memory) :-
+ !,
+ display_message(['PPL Prolog Interface Exception: ', nl, ' ',
+ 'out of memory']).
+
+format_exception_message(ppl_overflow_error(Type)) :-
+ !,
+ display_message(['PPL Prolog Interface Exception: ', nl, ' ',
+ 'ppl_overflow_error: ', Type]).
+
+format_exception_message(cpp_error(Error)) :-
+ !,
+ display_message(['PPL C++ Interface Exception:', nl, ' ', Error]).
+
+format_exception_message(Error) :-
+ display_message(['Unknown exception: ', Error]), fail.
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+ write_all(Message).
+
+display_message(Message):-
+ noisy(_),
+ (noisy(0) -> true ;
+ (nl, write_all(Message))
+ ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+ (Phrase == nl ->
+ nl
+ ;
+ write(Phrase),
+ write(' ')
+ ),
+ write_all(Phrases).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% list_groups(G)
+% The interface predicates are partitioned into related sets called
+% groups and here is a list of the groups.
+
+list_groups( [
+ large_integers,
+ all_versions_and_banner,
+ numeric_bounds,
+ new_polyhedron_from_dimension,
+ new_polyhedron_from_polyhedron,
+ new_polyhedron_from_representations,
+ swap_polyhedra,
+ polyhedron_dimension,
+ basic_operators,
+% transform_polyhedron,
+ extrapolation_operators,
+ get_system,
+% add_to_system,
+ revise_dimensions,
+ check_polyhedron,
+ minmax_polyhedron,
+ compare_polyhedra,
+ mip_problem,
+ pip_problem,
+ transform_polyhedron,
+ add_to_system,
+ catch_time,
+ handle_exceptions
+ ] ).
+
+% group_predicates(G, P)
+% P is a list of the interface predicates checked by test for group G.
+% This is used to generate more informative error and exception messages.
+
+group_predicates(all_versions_and_banner,
+ [ppl_version_major/1,
+ ppl_version_minor/1,
+ ppl_version_revision/1,
+ ppl_version_beta/1,
+ ppl_version/1,
+ ppl_banner/1
+ ]).
+
+group_predicates(numeric_bounds,
+ [ppl_max_space_dimension/1,
+ ppl_Coefficient_is_bounded/0,
+ ppl_Coefficient_max/1,
+ ppl_Coefficient_min/1,
+ ppl_set_rounding_for_PPL/0,
+ ppl_restore_pre_PPL_rounding/0
+ ]).
+
+group_predicates(new_polyhedron_from_dimension,
+ [ppl_new_C_Polyhedron_from_space_dimension/4,
+ ppl_new_NNC_Polyhedron_from_space_dimension/4,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_empty/1,
+ ppl_delete_polyhedron/1
+ ]).
+
+group_predicates(new_polyhedron_from_polyhedron,
+ [ppl_new_C_Polyhedron_from_C_Polyhedron/3,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron/3,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron/3,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/3,
+ ppl_new_C_Polyhedron_from_constraints/2,
+ ppl_new_NNC_Polyhedron_from_constraints/2,
+ ppl_Polyhedron_equals_Polyhedron/2
+ ]).
+
+group_predicates(new_polyhedron_from_representations,
+ [ppl_new_C_Polyhedron_from_constraints/2,
+ ppl_new_NNC_Polyhedron_from_constraints/2,
+ ppl_new_C_Polyhedron_from_generators/2,
+ ppl_new_NNC_Polyhedron_from_generators/2
+ ]).
+
+group_predicates(swap_polyhedra,
+ [ppl_Polyhedron_swap/2
+ ]).
+
+group_predicates(polyhedron_dimension,
+ [ppl_Polyhedron_affine_dimension/2,
+ ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_constrains/2,
+ ppl_Polyhedron_unconstrain_space_dimension/2,
+ ppl_Polyhedron_unconstrain_space_dimensions/2]).
+
+group_predicates(basic_operators,
+ [ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_difference_assign/2,
+ ppl_Polyhedron_time_elapse_assign/2,
+ ppl_Polyhedron_topological_closure_assign/1
+ ]).
+
+group_predicates(add_to_system,
+ [ppl_Polyhedron_add_constraint/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_generators/2
+ ]).
+
+group_predicates(revise_dimensions,
+ [ppl_Polyhedron_remove_space_dimensions/2,
+ ppl_Polyhedron_remove_higher_space_dimensions/2,
+ ppl_Polyhedron_expand_space_dimension/3,
+ ppl_Polyhedron_fold_space_dimensions/3,
+ ppl_Polyhedron_map_space_dimensions/2,
+ ppl_Polyhedron_concatenate_assign/2
+ ]).
+
+group_predicates(transform_polyhedron,
+ [ppl_Polyhedron_affine_image/4,
+ ppl_Polyhedron_affine_preimage/4,
+ ppl_Polyhedron_bounded_affine_image/5,
+ ppl_Polyhedron_bounded_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image/5,
+ ppl_Polyhedron_generalized_affine_preimage/5,
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+ ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4
+ ]).
+
+group_predicates(extrapolation_operators,
+ [ppl_Polyhedron_BHRZ03_widening_assign_with_token/3,
+ ppl_Polyhedron_BHRZ03_widening_assign/2,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+ ppl_Polyhedron_H79_widening_assign_with_token/3,
+ ppl_Polyhedron_H79_widening_assign/2,
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4,
+ ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+ ]).
+
+group_predicates(get_system,
+ [ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_get_minimized_constraints/2,
+ ppl_Polyhedron_get_generators/2,
+ ppl_Polyhedron_get_minimized_generators/2
+ ]).
+
+group_predicates(check_polyhedron,
+ [ppl_Polyhedron_relation_with_constraint/3,
+ ppl_Polyhedron_relation_with_generator/3,
+ ppl_Polyhedron_is_topologically_closed/1,
+ ppl_Polyhedron_is_universe,
+ ppl_Polyhedron_is_empty,
+ ppl_Polyhedron_is_bounded,
+ ppl_Polyhedron_contains_integer_point,
+ ppl_Polyhedron_contains_Polyhedron/2,
+ ppl_Polyhedron_strictly_contains_Polyhedron/2,
+ ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+ ppl_Polyhedron_equals_Polyhedron/2,
+ ppl_Polyhedron_termination_test_MS/2,
+ ppl_Polyhedron_termination_test_PR/2,
+ ppl_Polyhedron_OK/1
+ ]).
+
+group_predicates(minmax_polyhedron,
+ [ppl_Polyhedron_maximize/5,
+ ppl_Polyhedron_maximize_with_point/6,
+ ppl_Polyhedron_minimize/5,
+ ppl_Polyhedron_minimize_with_point/6
+ ]).
+
+group_predicates(compare_polyhedra,
+ [ppl_Polyhedron_contains_Polyhedron/2,
+ ppl_Polyhedron_strictly_contains_Polyhedron/2,
+ ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+ ppl_Polyhedron_equals_Polyhedron/2
+ ]).
+
+group_predicates(catch_time,
+ [ppl_set_timeout_exception_atom/1,
+ ppl_timeout_exception_atom/1,
+ ppl_set_timeout/1,
+ ppl_reset_timeout/0
+ ]).
+
+group_predicates(mip_problem,
+ ['all MIP_Prolog predicates'
+ ]).
+
+group_predicates(pip_problem,
+ ['all PIP_Prolog predicates'
+ ]).
+
+group_predicates(large_integers,
+ ['large integer tests '
+ ]).
+
+group_predicates(handle_exceptions,
+ 'all predicates'' exception handling.'
+ ).
+
+%%%%%%%%%%%%%%%%%%%%%%% System flags %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% pl_check_prolog_flag/2
+% returns true or false (if the 1st argument is 'bounded')
+% or (if the 1st argument is 'max_integer' or 'min_integer')
+% the maximum or minimum integer for Prolog
+% systems that have bounded integers.
+% Note that 268435456 is 2^28.
+
+pl_check_prolog_flag(bounded, TF) :-
+ current_prolog_flag(bounded, TF).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+ \+ prolog_system('XSB'),
+ current_prolog_flag(max_integer, Max_Int).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+ prolog_system('XSB'), Max_Int is 268435455.
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+ \+ prolog_system('XSB'),
+ current_prolog_flag(min_integer, Min_Int).
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+ prolog_system('XSB'), Min_Int is -268435456.
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4 b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
new file mode 100644
index 0000000..4dd1b2d
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
@@ -0,0 +1,372 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the test files
+dnl ppl_prolog_generated_test_<CLASS_NAME>.pl using the code in
+dnl ppl_interface_generator_prolog_generated_test_pl_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_main.pl << ___END_OF_FILE___
+/* Prolog code for checking all predicates. -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+m4_include(`ppl_interface_generator_prolog_generated_test_pl_code.m4')
+
+dnl The build represent needs alternative replacements.
+dnl
+dnl The different kinds of alternative objects that can build
+dnl the same class so that we can check one build against another.
+m4_define(`m4_a_build_represent_replacements',
+ `generator, congruence, constraint')
+m4_define(`m4_Grid_a_build_represent_replacements',
+ `constraint, grid_generator, congruence')
+m4_define(`m4_Pointset_Powerset_a_build_represent_replacements',
+ `constraint, congruence')
+m4_define(`m4_product_a_build_represent_replacements',
+ `constraint, congruence')
+
+dnl ==================================================================
+dnl Useful macros needed to generate the test code.
+dnl ==================================================================
+
+dnl m4_filter_code(Schema_Code, Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_filter_code', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+ `m4_ifelse(`$2', `', keep,
+ `m4_ifelse(m4_index($1, `m4_regexp($2, `ppl_[^ /]+', `\&')'), -1,
+ keep, throw)')',
+ `m4_ifelse(m4_index($1, m4_regexp($2, `ppl_[^ /]+', `\&')), -1,
+ `m4_filter_code($1, m4_shift(m4_shift($@)))', throw)')')`'dnl
+
+dnl m4_check_test_usability(Procedure_name,
+dnl Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_check_test_usability', `dnl
+m4_filter_code(m4_indir($1_code),
+ m4_filter_all_procedures($2, 0, m4_procedure_list))`'dnl
+')
+dnl
+dnl
+dnl ==================================================================
+dnl Now generate the test code.
+dnl ==================================================================
+dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the include statements.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions needed
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code',
+`m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+:- include(QUOTE../tests/ppl_prolog_generated_test_`'m4_current_interface`'.plQUOTE).
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code for the include statements.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_main.pl << ___END_OF_FILE___
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Include the common code and all class dependent files %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+:- include('ppl_prolog_generated_test_common.pl').
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+m4_patsubst(m4_all_code`'m4_changequote(`[*[', `]*]')[*[]*],
+ QUOTE, [*[']*])[*[]*]dnl
+m4_changequote`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the top-level call
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code', `
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+test_`'m4_current_interface`'COMMA`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code
+dnl -----------------------------------------------------------------
+m4_define(`m4_gen_code', m4_all_code)
+m4_divert`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Main call for tests %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+check_all :-
+ (noisy(_) -> true; make_quiet),
+ ppl_initialize, `'dnl
+m4_patsubst(m4_gen_code, COMMA, `,')
+ ppl_finalize.
+m4_popdef(`m4_one_class_code')`'dnl
+dnl ==================================================================
+dnl Generate code for defining test_<class_name>.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+m4_divert(-1)`'dnl
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+m4_define(`m4_start1', 0)`'dnl
+m4_pushdef(`m4_check_test_usability', keep)`'dnl
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+ `m4_ifelse(m4_check_test_usability($1, $5), keep,
+ `m4_ifelse(m4_start1, 0,
+ `m4_undefine(`m4_start1') ', `
+')' `` '($1_$2_test
+ -> (!COMMA write_error($1))
+ ; write_success($1))COMMA
+` '')')`'dnl
+')`'dnl
+dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Main call for tests %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+test_`'m4_current_interface :-
+m4_undefine(`m4_current_interface')`'dnl
+')
+m4_pushdef(`m4_post_extra_class_code', `
+ true.
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_popdef(`m4_expanded_procedure_schema')`'dnl
+m4_popdef(`m4_pre_extra_class_code')`'dnl
+m4_popdef(`m4_post_extra_class_code')`'dnl
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Generate code for the declarations
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+ `m4_ifelse(m4_check_test_usability($1, $5), keep,
+:- dynamic($1_$2_test/0).
+:- discontiguous($1_$2_test/0).)')
+')`'dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_undefine(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% discontiguous declarations %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code for the class dependent predicate tests
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+m4_include(`ppl_interface_generator_prolog_generated_test_pl_code.m4')
+
+m4_define(`m4_arg_sequence',
+ `m4_ifelse(`$1', 0, ,
+ `Arg1`'m4_ifelse(`$1', 1, ,
+ `m4_forloop(`i', 2, `$1', `m4_separator Arg`'i')')')')
+
+m4_define(`m4_find_name',
+ `m4_regexp($1, `\(ppl_[^ /]+\)', `\1')`'dnl
+')
+
+m4_define(`m4_find_arity',
+ `m4_regexp($1, `ppl_[^ /]+\(.*\)', `m4_get_arity(\1)')`'dnl
+')
+
+
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_pushdef(`m4_current_interface', m4_interface_class`'$1)`'dnl
+m4_pushdef(`m4_current_group', m4_class_group`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_popdef(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% class dependent predicate tests %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+m4_replace_all_patterns($1, m4_add_build_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_comparison_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_wdn_exn_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_cleanup_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_out_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_out_extra_class_code($1))`'dnl
+')
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+`m4_ifelse(m4_check_test_usability($1, $5), keep, `
+m4_indir(`$1_code')`'dnl
+')', `')
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code,
+dnl defining the argument of "all_class_dependent_predicates/1",
+dnl a list of all the class dependent predicates that are implemented.
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_undefine(`m4_current_interface')`'dnl
+m4_define(`m4_start1', 0)`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% class dependent predicate tests %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_class_dependent_predicates(
+ [
+ ')
+
+m4_pushdef(`m4_post_extra_class_code', `
+ ]
+).
+')
+m4_define(`m4_start1', 0)
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifelse(m4_start1, 0,
+ `m4_undefine(`m4_start1')', `COMMA
+') `$1'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+m4_popdef(`m4_post_extra_class_code')
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% build using cleanup code %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_pushdef(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+')
+m4_pushdef(`m4_post_extra_class_code', `')
+m4_pushdef(`m4_expanded_procedure_schema', `
+m4_ifelse(m4_index($1, new), `-1', ,
+ clean_$1`'m4_ifelse($2, 0, , `(`'m4_arg_sequence($2))') :-
+ ($1`'m4_ifelse($2, 0, , `(`'m4_arg_sequence($2))'),
+ ppl_cleanup_`'m4_current_interface`'(Arg`'$2)).
+
+)`'dnl
+')
+
+m4_divert`'dnl
+m4_all_code
+___END_OF_FILE___
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+dnl End of file generation.
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4 b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
new file mode 100644
index 0000000..60b940c
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
@@ -0,0 +1,1974 @@
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating the test files
+dnl ppl_prolog_generated_test_<CLASS_NAME>.pl, which test
+dnl the generated Prolog interface predicates
+dnl and the main file ppl_prolog_generated_test_main.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`m4_add_build_class_code', `dnl
+ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim) :-
+ (clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, universe, PS),
+ ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+ ppl_ at CLASS@_refine_with_ at CONSTRAINER@s(PS, RS)).
+
+')
+
+m4_define(`m4_add_comparison_class_code', `dnl
+ppl_ at CLASS@_comparison_check(is_disjoint_from, PS1, PS2, Result) :-
+ (
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+ (ppl_ at CLASS@_is_empty(PS1_Copy)
+ ->
+ Result = true
+ ;
+ Result = false
+ ),
+ ppl_delete_ at CLASS@(PS1_Copy)
+ ).
+
+ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result) :-
+ (
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+ (ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS2)
+ ->
+ Result = true
+ ;
+ Result = false
+ ),
+ ppl_delete_ at CLASS@(PS1_Copy)
+ ).
+
+ppl_ at CLASS@_comparison_check(strictly_contains, PS1, PS2, Result) :-
+ (
+ (ppl_ at CLASS@_equals_ at CLASS@(PS1, PS2)
+ ->
+ Result = false
+ ;
+ ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result)
+ )
+ ).
+
+ppl_ at CLASS@_comparison_check(geometrically_covers, _PS1, _PS2, _).
+
+ppl_ at CLASS@_comparison_check(geometrically_equals, _PS1, _PS2, _).
+
+')
+
+m4_define(`m4_add_wdn_exn_class_code', `dnl
+ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) :-
+ (
+ ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+ ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS2_Copy)
+ ).
+
+ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, PS2, PS2_Copy,
+ T, T1) :-
+ (
+ ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1_Copy),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1),
+ ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+ (T == 1
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a)
+ ;
+ T == 0,
+ ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy)
+ ),
+ T1 == 0,
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS1a),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1a),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS2_Copy)
+ ).
+
+')
+
+m4_define(`m4_add_cleanup_class_code', `dnl
+ppl_cleanup_ at CLASS@(_).
+ppl_cleanup_ at CLASS@(P) :-
+ (out_ at CLASS@(P), fail).
+
+ppl_cleanup_all_ at CLASS@([]).
+ppl_cleanup_all_ at CLASS@([_|_]).
+ppl_cleanup_all_ at CLASS@([P|Ps]) :-
+ ppl_delete_all_ at CLASS@([P|Ps]).
+
+ppl_delete_all_ at CLASS@([]).
+ppl_delete_all_ at CLASS@([P|Ps]) :-
+ (ppl_delete_ at CLASS@(P),
+ ppl_delete_all_ at CLASS@(Ps)).
+
+')
+
+m4_define(`m4_add_out_class_code', `dnl
+out_ at CLASS@(P):-
+ ((noisy(N), N < 2) -> true ;
+ m4_ifelse(m4_current_group, pointset_powerset,
+ `display_message([nl, @!CLASS@, P, representation,
+ cannot ,be, displayed, nl]),',
+ m4_current_group, product,
+ `display_message([nl, @!CLASS@, P, representation,
+ cannot ,be, displayed, nl]),',
+` ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(P, RS),
+ display_message([nl, @CLASS_REPRESENT at s, are, nl, RS, nl]),')
+ fail
+ ).
+
+')
+
+m4_define(`m4_add_out_extra_class_code', `dnl
+out_ at CLASS@(P) :-
+ ppl_delete_ at CLASS@(P).
+
+')
+
+dnl Note that to avoid m4 treating commas as m4 argument separators,
+dnl all tests must be between `(' and `)'.
+m4_divert(-1)
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_3_test :-
+ (
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, empty, PS),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, empty, PS1),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, universe, PS2),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS3),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS3)
+ ->
+ fail ; true).
+
+')
+
+m4_define(`ppl_C_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+m4_define(`ppl_NNC_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+
+m4_define(`ppl_delete_C_Polyhedron', ppl_delete_Polyhedron`'$1)
+m4_define(`ppl_delete_NNC_Polyhedron', ppl_delete_Polyhedron`'$1)
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _2_test :-
+ (
+ clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+ ppl_ at FRIEND@_OK(`(PS)'),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at FRIEND@(`(PS)'),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_2_test :-
+ (
+ clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+ ppl_ at FRIEND@_OK(`(PS)'),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at FRIEND@(`(PS)'),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_2_test :-
+ (
+ member(TEST_DATA, [test00, test02, test03, test04, test05]),
+ (
+ ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+ @BUILD_REPRESENT at s, RS1),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(RS1, PS1),
+ ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+ @A_BUILD_REPRESENT at s, RS1a),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@A_BUILD_REPRESENT at s(RS1a, PS1a),
+%% ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1a)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`
+ppl_ at CLASS@_ at UB_EXACT@_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ (ppl_ at CLASS@_ at UB_EXACT@(PS1_Copy, PS2) ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2a),
+m4_ifelse(m4_current_group, pointset_powerset, `dnl
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS1),
+ ppl_ at CLASS@_upper_bound_assign(PS2a, PS1),
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS2a, PS1_Copy)',
+` true')
+ ;
+ ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS1),
+ ppl_ at CLASS@_equals_ at CLASS@(PS2a, PS2)
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS1_Copy),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS2a)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+ppl_ at CLASS@_swap_2_test :-
+ (
+ (
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, universe, PS),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, empty, PS1),
+ ppl_ at CLASS@_swap(PS, PS1),
+ (predicate_exists(ppl_ at CLASS@_is_empty)
+ ->
+ ppl_ at CLASS@_is_empty(PS),
+ ppl_ at CLASS@_is_universe(PS1)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+ppl_ at CLASS@_ at DIMENSION@_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim), TEST_DATA \= test07,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ \+ppl_ at CLASS@_ at DIMENSION@(PS, 3),
+ ppl_ at CLASS@_ at DIMENSION@(PS, Dim),
+ ppl_dimension_test_data(TEST_DATA, @DIMENSION@, Dim1),
+ ((TEST_DATA == test05, @DIMENSION@ == affine_dimension)
+ ->
+ true
+ ;
+ Dim == Dim1
+ ),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(PS, RS),
+ (predicate_exists(ppl_ at CLASS@_add_ at CLASS_REPRESENT@s)
+ ->
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(PS, RS),
+ ( predicate_exists(ppl_ at CLASS@_add_ at CLASS_REPRESENT@s)
+ ->
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+ppl_ at CLASS@_ at MEMBYTES@_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PH, Space_Dim),
+ ppl_ at CLASS@_ at MEMBYTES@(PH, S),
+ ((noisy(N), N < 2) -> true ;
+ display_message([nl, for, TEST_DATA, the, @MEMBYTES@, is, S, nl])
+ ),
+ ppl_delete_ at CLASS@(PH)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+ppl_ at CLASS@_ at BEGINEND@_iterator_2_test :-
+ (
+ choose_test(TEST_DATA, _Space_Dim),
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ ppl_ at CLASS@_ at BEGINEND@_iterator(PPS, It_x),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It_x),
+ ppl_delete_ at CLASS@(PPS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+ppl_ at CLASS@_iterator_equals_iterator_2_test :-
+ (
+ choose_test(TEST_DATA, _Space_Dim),
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ ppl_ at CLASS@_begin_iterator(PPS, It),
+ ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+ ppl_ at CLASS@_iterator_equals_iterator(It, It_begin),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It),
+ ppl_delete_ at CLASS@_iterator(It_begin),
+ ppl_delete_ at CLASS@(PPS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+ppl_ at CLASS@_ at INCDEC@_iterator_1_test :-
+ (
+ choose_test(TEST_DATA, _Space_Dim),
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ ppl_ at CLASS@_begin_iterator(PPS, Itb),
+ ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+ ppl_ at CLASS@_size(PPS, S),
+ (S > 0
+ ->
+ ppl_ at CLASS@_increment_iterator(Itb),
+ ppl_ at CLASS@_decrement_iterator(Itb)
+ ),
+ ppl_ at CLASS@_iterator_equals_iterator(Itb, It_begin),
+ ppl_ at CLASS@_end_iterator(PPS, Ite),
+ ppl_ at CLASS@_end_iterator(PPS, It_end),
+ (S > 0
+ ->
+ ppl_ at CLASS@_decrement_iterator(Ite),
+ ppl_ at CLASS@_increment_iterator(Ite)
+ ),
+ ppl_ at CLASS@_iterator_equals_iterator(Ite, It_end),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(Itb),
+ ppl_delete_ at CLASS@_iterator(It_begin),
+ ppl_delete_ at CLASS@_iterator(Ite),
+ ppl_delete_ at CLASS@_iterator(It_end),
+ ppl_delete_ at CLASS@(PPS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+ppl_new_ at CLASS@_iterator_from_iterator_2_test :-
+ (
+ TEST_DATA = test06, TEST_DATA1 = test07,
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+ ppl_ at CLASS@_add_disjunct(PPS, PS),
+ ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+ ppl_new_ at CLASS@_iterator_from_iterator(It_begin, It1),
+ ppl_ at CLASS@_increment_iterator(It1),
+ \+ppl_ at CLASS@_iterator_equals_iterator(It1, It_begin),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It_begin),
+ ppl_delete_ at CLASS@_iterator(It1),
+ ppl_delete_ at CLASS@(PPS),
+ ppl_delete_ at DISJUNCT@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+ppl_ at CLASS@_drop_disjunct_2_test :-
+ (
+ TEST_DATA = test06, TEST_DATA1 = test07,
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+ ppl_ at CLASS@_add_disjunct(PPS, PS),
+ ppl_ at CLASS@_size(PPS, S),
+ S > 1,
+ ppl_ at CLASS@_begin_iterator(PPS, It),
+ ppl_ at CLASS@_increment_iterator(It),
+ ppl_ at CLASS@_drop_disjunct(PPS, It),
+ S1 is S - 1,
+ ppl_ at CLASS@_size(PPS, S1),
+ ppl_ at CLASS@_decrement_iterator(It),
+ ppl_ at CLASS@_drop_disjunct(PPS, It),
+ S2 is S1 - 1,
+ ppl_ at CLASS@_size(PPS, S2),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It),
+ ppl_delete_ at CLASS@(PPS),
+ ppl_delete_ at DISJUNCT@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`
+ppl_ at CLASS@_drop_disjuncts_3_test :-
+ (
+ TEST_DATA = test06, TEST_DATA1 = test07,
+ ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+ (
+ clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+ clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+ ppl_ at CLASS@_add_disjunct(PPS, PS),
+ ppl_ at CLASS@_size(PPS, S),
+ ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+ ppl_new_ at CLASS@_iterator_from_iterator(It_begin, It1),
+ (S > 1
+ ->
+ ppl_ at CLASS@_increment_iterator(It1),
+ S1 is S - 1
+ ;
+ S1 = S
+ ),
+ ppl_ at CLASS@_drop_disjuncts(PPS, It_begin, It1),
+ S1 is S - 1,
+ ppl_ at CLASS@_size(PPS, S1),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It_begin),
+ ppl_delete_ at CLASS@_iterator(It1),
+ ppl_delete_ at CLASS@(PPS),
+ ppl_delete_ at DISJUNCT@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+ppl_ at CLASS@_get_disjunct_2_test :-
+ (
+ all_tests(Space_Dim, Tests),
+ (
+ clean_ppl_new_ at CLASS@_from_space_dimension(Space_Dim, empty, PPS),
+ ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+ ppl_ at CLASS@_begin_iterator(PPS, It),
+ ppl_ at CLASS@_end_iterator(PPS, It_end),
+ ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim),
+ ppl_ at CLASS@_OK(PPS),
+ ppl_delete_ at CLASS@_iterator(It),
+ ppl_delete_ at CLASS@_iterator(It_end),
+ ppl_delete_ at CLASS@(PPS)
+ ->
+ fail ; true)
+ ).
+
+ppl_ at CLASS@_get_disjunct_2_test1(_, []).
+ppl_ at CLASS@_get_disjunct_2_test1(PPS, [Test|Tests]) :-
+ (
+ ppl_build_test_data(Test, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+ clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS, PS),
+ ppl_ at CLASS@_add_disjunct(PPS, PS),
+ ppl_delete_ at DISJUNCT@(PS),
+ ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+ !
+ ).
+
+ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim) :-
+ (
+ (ppl_ at CLASS@_iterator_equals_iterator(It, It_end)
+ ->
+ true
+ ;
+ ppl_ at CLASS@_get_disjunct(It, PS),
+ ppl_ at CLASS@_increment_iterator(It),
+ ppl_ at DISJUNCT@_OK(PS),
+ ppl_ at DISJUNCT@_space_dimension(PS, D),
+ D = Space_Dim,
+ ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim)
+ )
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+ppl_ at CLASS@_linear_ at PARTITION@_4_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_linear_partition(PS1, PS2, PS3, PPS),
+ ppl_ at CLASS@_OK(PS3),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS3),
+ ppl_delete_Pointset_Powerset_NNC_Polyhedron(PPS)
+ ->
+ fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+ppl_ at CLASS@_approximate_ at PARTITION@_4_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_approximate_partition(PS1, PS2, PS3, PPS, _Is_finite),
+ ppl_ at CLASS@_OK(PS3),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS3),
+ ppl_delete_Pointset_Powerset_NNC_Polyhedron(PPS)
+ ->
+ fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_3_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ class_ at CLASS@ \== class_BD_Shape_int8_t,
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_relation_test_data(TEST_DATA, @RELATION_REPRESENT@, R, Rel_Expected),
+ ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(PS, R, Rel),
+ (class_ at CLASS@ == class_Polyhedron ; class_ at CLASS@ == class_Grid
+ ->
+ Rel = Rel_Expected
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+ppl_ at CLASS@_ at HAS_PROPERTY@_1_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ (ppl_property_test_data(TEST_DATA, t_ at TOPOLOGY@,
+ @CONSTRAINER@, @HAS_PROPERTY@)
+ ->
+ ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+ ;
+ \+ ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+ ),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+ppl_ at CLASS@_ at SIMPLIFY@_1_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ TEST_DATA = test04,
+ \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ ppl_ at CLASS@_ at SIMPLIFY@(PS),
+ ppl_ at CLASS@_OK(PS),
+ (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+ ->
+ ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_unconstrain_space_dimensions(PS, [Var]),
+ ppl_ at CLASS@_OK(PS),
+ (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+ ->
+ ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+ (
+ choose_test(TEST_DATA, 0),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, 0),
+ ppl_ at CLASS@_unconstrain_space_dimensions(PS, []),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimension_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_unconstrain_space_dimension(PS, Var),
+ ppl_ at CLASS@_OK(PS),
+ (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+ ->
+ ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+ppl_ at CLASS@_constrains_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_constrains_test_data(TEST_DATA, _, Bool),
+ (ppl_ at CLASS@_constrains(PS, Var)
+ -> Bool = true
+ ; Bool = false
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_2_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ TEST_DATA \= test05,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ((
+ class_ at DISJUNCT@ \= class_Grid,
+ ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE,
+ @ABOVEBELOW@, true))
+ ->
+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE)
+ ;
+ true
+ ),
+ ((
+ class_ at DISJUNCT@ \= class_Grid,
+ ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE1,
+ @ABOVEBELOW@, false))
+ ->
+ \+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE1)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound_5_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ((
+ Space_Dim = 0
+ ;
+ ppl_ at CLASS@_is_empty(PS)
+ ) ->
+ true
+ ;
+ make_vars(Space_Dim, [Var| _Var_List]),
+ (ppl_ at CLASS@_has_ at UPPERLOWER@_bound(PS, Var, _, _, _) -> true ; true)
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_5_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+ LE, Nexptd, Dexptd, Bexptd, _, SuccessFlag),
+ (SuccessFlag == true
+ ->
+ (ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B),
+ B == Bexptd, N == Nexptd, D == Dexptd)
+ ;
+ \+ ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B)
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_with_point_6_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+ LE, Nexptd, Dexptd, Bexptd, Gexptd, SuccessFlag),
+ (SuccessFlag == true
+ ->
+ (ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, D, B, G),
+ B == Bexptd, N == Nexptd, D == Dexptd,
+ (predicate_exists(ppl_Polyhedron_add_generator)
+ ->
+ clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+ empty, PSG),
+ clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+ empty, PSGexptd),
+ (G =.. [closure_point|CP]
+ ->
+ Gexptd =.. [closure_point|CPexptd],
+ G_Point =.. [point|CP],
+ Gexptd_Point =.. [point|CPexptd],
+ ppl_Polyhedron_add_generator(PSG, G_Point),
+ ppl_Polyhedron_add_generator(PSGexptd, Gexptd_Point)
+ ;
+ (ppl_Polyhedron_add_generator(PSG, G),
+ ppl_Polyhedron_add_generator(PSGexptd, Gexptd))
+ ),
+ ppl_C_Polyhedron_equals_C_Polyhedron(PSG, PSGexptd),
+ ppl_delete_Polyhedron(PSG),
+ ppl_delete_Polyhedron(PSGexptd)
+ ;
+ true
+ ))
+ ;
+ \+ ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, _, _, _)
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+m4_define(`ppl_ at CLASS@_frequency_code',
+`
+ppl_ at CLASS@_frequency_6_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_frequency_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@,
+ LE, F_Nexptd, F_Dexptd, V_Nexptd, V_Dexptd,
+ SuccessFlag),
+ (SuccessFlag == true
+ ->
+ (ppl_ at CLASS@_frequency(PS, LE, F_N, F_D, V_N, V_D),
+ F_N == F_Nexptd, F_D == F_Dexptd,
+ V_N == V_Nexptd, V_D == V_Dexptd)
+ ;
+ \+ ppl_ at CLASS@_frequency(PS, LE, F_N, F_D, V_N, V_D)
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ (ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(PS1, PS2)
+ ->
+ ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, true)
+ ;
+ ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, false)
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`
+:- discontiguous(ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1/3).
+
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test :-
+ (
+ member(TEST_DATA, [test00, test02, test03, test04, test05]),
+ choose_test(TEST_DATA, Space_Dim),
+ ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS),
+ ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+ (ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, RS)
+ ->
+ fail ; true)
+ ).
+
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, []) :-
+ (
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1)
+ ).
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, [R | RS]) :-
+ (
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@(PS1, R),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, RS)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_2_test :-
+ (
+ member(TEST_DATA1, [test00, test02, test03, test04, test05]),
+ member(TEST_DATA2, [test00, test02, test03, test04, test05]),
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_build_test_data(TEST_DATA1, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS),
+ ppl_build_test_data(TEST_DATA2, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS1),
+ ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS1),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS1),
+ ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`
+ppl_ at CLASS@_add_disjunct_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PPS1, Space_Dim),
+ ppl_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_add_disjunct(PPS1, PS2),
+ ppl_ at CLASS@_OK(PPS1),
+ ppl_ at DISJUNCT@_OK(PS2),
+ ppl_delete_ at DISJUNCT@(PS2),
+ ppl_delete_ at CLASS@(PPS1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+ppl_ at CLASS@_ at BINOP@_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_ at BINOP@(PS1_Copy, PS2),
+ ((@BINOP@ == upper_bound_assign ; @BINOP@ == poly_hull_assign)
+ ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS1),
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS2)',
+` ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS1),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS2)')
+ ;
+ true
+ ),
+ (@BINOP@ == intersection_assign
+ ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS2, PS1_Copy)',
+` ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_contains_ at CLASS@(PS2, PS1_Copy)')
+ ;
+ true
+ ),
+ (@BINOP@ == difference_assign ; @BINOP@ == poly_difference_assign
+ ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+ ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1, PS1_Copy)',
+` ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy)')
+ ;
+ true
+ ),
+ (@BINOP@ == concatenate_assign
+ ->
+ ppl_ at CLASS@_space_dimension(PS1, Dim1),
+ ppl_ at CLASS@_space_dimension(PS2, Dim2),
+ Dim_Conc is Dim1 + Dim2,
+ ppl_ at CLASS@_space_dimension(PS1_Copy, Dim_Conc)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS1_Copy),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS2a)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+ppl_ at CLASS@_simplify_using_context_assign_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_simplify_using_context_assign(PS1_Copy, PS2,
+ _Is_Intersection),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS1_Copy),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`ppl_ at CLASS@_ at AFFIMAGE@_4_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ Space_Dim > 0,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var + 5, 1),
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var - 5, 1),
+ (@AFFIMAGE@ == affine_image
+ ->
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 2*Var, 1),
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 2)
+ ;
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 2),
+ ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 2*Var, 1)
+ ),
+dnl FIXME: This fails with Uint??_Box domains for many of the tests
+dnl (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+dnl ->
+dnl ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+dnl ;
+dnl true
+dnl ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_bounded_ at AFFIMAGE@_5_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ ppl_dimension_test_data(TEST_DATA, space_dimension, Space_Dim),
+ Space_Dim > 0,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, Var, 2*Var, 4),
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, 4*Var, 4*Var, 1),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, 4*Var, 4*Var, 1),
+ ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, Var, 2*Var, 2),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_OK(PS_Copy),
+ ppl_delete_ at CLASS@(PS_Copy),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_5_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ Space_Dim > 0,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, >=, 2*Var, 2),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, >=, Var + 2, 1),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, >=, Var + 2, 1),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, >=, 2*Var, 2),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS_Copy),
+ ppl_delete_ at CLASS@(PS_Copy),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_6_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ Space_Dim > 0,
+ (
+ ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS, Var, =, 2*Var, 3, 5),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS, Var, =, Var + 2, 1, 0),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS_Copy, Var, =, Var + 2, 1, 0),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS_Copy, Var, =, 2*Var, 3, 5),
+%% ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_OK(PS_Copy),
+ ppl_delete_ at CLASS@(PS_Copy),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_4_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ Space_Dim > 0,
+ (t_ at TOPOLOGY@ == t_NNC_
+ ->
+ member(Op, [>=, =<, =, >, <])
+ ;
+ member(Op, [>=, =<, =])
+ ),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 2*Var, Op, 2*(Var + 2)),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, Var, Op, Var + 2),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS_Copy),
+ ppl_delete_ at CLASS@(PS_Copy),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_5_test :-
+ (
+ choose_test(TEST_DATA, Space_Dim),
+ Space_Dim > 0,
+ (
+ ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+ ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+ make_vars(Space_Dim, [Var| _Var_List]),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, Var + 2, =, 2*Var, 5),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 1 - Var, =, Var + 2, 0),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+ 1 - Var, =, Var + 2, 0),
+ ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+ Var + 2, =, 2*Var, 5),
+%% ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_OK(PS_Copy),
+ ppl_delete_ at CLASS@(PS_Copy),
+ ppl_delete_ at CLASS@(PS)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_ at WIDEN@_widening_assign(PS1, PS2),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_4_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+ ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1, PS2, 1, T),
+ ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1a, PS2, 0, T1),
+ ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+ PS2, PS2_Copy, T, T1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_code',
+`
+ppl_ at CLASS@_BHZ03_ at DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+ PS1, PS2),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+ PS1, PS2, 3),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+ PS1, PS2, 3),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at EXTRAPOLATION@_extrapolation_assign_3_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+ Dim > 0,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ make_vars(Dim, [Var|_]),
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(
+ PS1, PS2, [Var = 1]),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_5_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+ Dim > 0,
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+ make_vars(Dim, [Var|_]),
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+ PS1, PS2, [Var = 1], 1, T),
+ ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+ PS1a, PS2, [Var = 1], 0, T1),
+ ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+ PS2, PS2_Copy, T, T1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign(PS1, PS2),
+ ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_4_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1, PS2,
+ 1, T),
+ ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1a, PS2,
+ 0, T1),
+ ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+ PS2, PS2_Copy, T, T1)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(PS2, PS1),
+ ppl_ at CLASS@_contains_ at CLASS@(PS2, PS2_Copy),
+ ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+ ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS1_Copy),
+ ppl_delete_ at CLASS@(PS2),
+ ppl_delete_ at CLASS@(PS2_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_2_test :-
+ (
+ (
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS),
+ ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(PS, 1),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_space_dimension(PS, 2),
+ (@EMBEDPROJECT@ == and_embed
+ ->
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(2, universe, PS1)
+ ;
+ make_vars(2, [Var0, Var1]),
+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(
+ [Var0 = Var0, Var1 = 0], PS1)
+ ),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS1),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS)
+ ;
+ true
+ ),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS)
+
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_higher_space_dimensions_2_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ ppl_ at CLASS@_OK(PS),
+ ppl_ at CLASS@_space_dimension(PS, Dim1),
+ Dim1 is Dim + 1,
+ ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim),
+ ppl_ at CLASS@_space_dimension(PS, Dim),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_remove_higher_space_dimensions(PS, 0),
+ ppl_ at CLASS@_space_dimension(PS, 0),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_space_dimensions_2_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ Dim1 is Dim + 1,
+ ppl_ at CLASS@_remove_space_dimensions(PS, []),
+ ppl_ at CLASS@_space_dimension(PS, Dim1),
+ make_vars(Dim1, Var_List),
+ append(_, [Var], Var_List),
+ ppl_ at CLASS@_remove_space_dimensions(PS, [Var]),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+ppl_ at CLASS@_expand_space_dimension_3_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ Dim1 is Dim + 1,
+ make_vars(1, [Var]),
+ ppl_ at CLASS@_expand_space_dimension(PS, Var, 0),
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ make_vars(Dim1, Var_List),
+ append(_, [Var1], Var_List),
+ ppl_ at CLASS@_expand_space_dimension(PS, Var1, 1),
+ Dim2 is Dim1 + 1,
+ ppl_ at CLASS@_space_dimension(PS, Dim2),
+ ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim1),
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+ppl_ at CLASS@_fold_space_dimensions_3_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ Dim1 is Dim + 1,
+ make_vars(Dim1, [Var | _]),
+ ppl_ at CLASS@_fold_space_dimensions(PS, [], Var),
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ Dim2 is Dim1 + 1,
+ make_vars(Dim2, Var_List),
+ append(_, [Var1], Var_List),
+ ppl_ at CLASS@_fold_space_dimensions(PS, [Var], Var1),
+ ppl_ at CLASS@_space_dimension(PS, Dim1),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+ppl_ at CLASS@_map_space_dimensions_2_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+ ppl_ at CLASS@_add_space_dimensions_and_project(PS, 1),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PSa),
+ Dim1 is Dim + 2,
+ ppl_ at CLASS@_map_space_dimensions(PSa, []),
+ ppl_ at CLASS@_space_dimension(PSa, 0),
+ make_vars(Dim1, Var_List),
+ append(_, [Var, Var1], Var_List),
+ make_map_vars(Dim, Var_Map_List),
+ append(Var_Map_List, [Var-Var1, Var1-Var], Var_Map_List1),
+ ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+ ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+ ppl_ at CLASS@_space_dimension(PS, Dim1),
+ (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+ ->
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PSa),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`
+ppl_ at CLASS@_wrap_assign_8_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_wrap_assign(PS, [], bits_8, unsigned, overflow_wraps,
+ [], 0, true),
+ ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`
+ppl_ at CLASS@_drop_some_non_integer_points_2_test :-
+ (
+ choose_test(TEST_DATA, Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+ ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+ ppl_ at CLASS@_drop_some_non_integer_points(PS, any),
+ ppl_ at CLASS@_OK(PS),
+ ppl_delete_ at CLASS@(PS),
+ ppl_delete_ at CLASS@(PS_Copy)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _1_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ (ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1) ->
+ true
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ (ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2, PS1) ->
+ true
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ (ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1,
+ _Pt)
+ ->
+ true
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ (ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2,
+ PS1,
+ _Pt)
+ ->
+ true
+ ;
+ true
+ ),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1,
+ Ph),
+ ppl_Polyhedron_OK(Ph),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2,
+ PS1,
+ Ph),
+ ppl_Polyhedron_OK(Ph),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _3_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@(PS1, Ph1, Ph2),
+ ppl_Polyhedron_OK(Ph1),
+ ppl_Polyhedron_OK(Ph2),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+m4_define(
+ `ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_4_test :-
+ (
+ choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+ (
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+ ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+ ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+ ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2(PS2, PS1,
+ Ph1, Ph2),
+ ppl_Polyhedron_OK(Ph1),
+ ppl_Polyhedron_OK(Ph2),
+ ppl_ at CLASS@_OK(PS1),
+ ppl_ at CLASS@_OK(PS2),
+ ppl_delete_ at CLASS@(PS1),
+ ppl_delete_ at CLASS@(PS2)
+ ->
+ fail ; true)
+ ).
+
+')
+
+dnl ppl_ at CLASS@_ at NARROWING@_narrowing_assign/2,
diff --git a/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl b/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
new file mode 100644
index 0000000..985f2cf
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
@@ -0,0 +1,648 @@
+% Extra test code for the generated tests for the Prolog interfaces.
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+:- dynamic(noisy/1).
+
+% check_noisy
+% This also executes all the test predicates but also prints some messages
+% including the banner, version numbers and expected output from
+% the exception tests.
+
+check_noisy :-
+ make_noisy,
+ check_all,
+ make_quiet.
+
+check_extra_noisy :-
+ make_extra_noisy,
+ check_all,
+ make_quiet.
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+ (retract(noisy(_)) ->
+ make_extra_noisy
+ ;
+ assertz(noisy(2))
+ ).
+
+make_noisy :-
+ (retract(noisy(_)) ->
+ make_noisy
+ ;
+ assertz(noisy(1))
+ ).
+
+make_quiet :-
+ (retract(noisy(_)) ->
+ make_quiet
+ ; assertz(noisy(0))
+ ).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+ write_all(Message),
+ fail.
+
+display_message(Message):-
+ noisy(_),
+ (noisy(0) -> true ;
+ (write_all(Message))
+ ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+ (Phrase == nl ->
+ nl
+ ;
+ (write(Phrase),
+ write(' '))
+ ),
+ write_all(Phrases).
+
+%%%%%%%%%%%% predicates for variable generation %%%%%%%%%%%%%%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List) :-
+ make_var_list(0, Dim, Var_List).
+make_var_list(Dim, Dim, []) :- !.
+make_var_list(I, Dim, ['$VAR'(I)|Var_List]) :-
+ I < Dim,
+ (I1 is I + 1,
+ make_var_list(I1, Dim, Var_List)).
+
+make_map_vars(Dim, Var_Map_List) :-
+ make_map_var_list(0, Dim, Var_Map_List).
+make_map_var_list(Dim, Dim, []) :- !.
+make_map_var_list(I, Dim, ['$VAR'(I)-'$VAR'(I)|Var_Map_List]) :-
+ I < Dim,
+ (I1 is I + 1,
+ make_map_var_list(I1, Dim, Var_Map_List)).
+
+%%%%%%%%%%%% predicates for success and errors. %%%%%%%%%%%%%%%%%
+
+write_success(Predicate_name) :-
+ display_message([test, for, Predicate_name, 'succeeded.']).
+
+write_error(Predicate_name) :-
+ write_all([test, for, Predicate_name, 'failed.']).
+
+
+%%%%%%%%%%%% test data selection %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_tests(0, [test00, test02]).
+all_tests(1, [test01, test03, test04, test05, test06, test07]).
+
+choose_test(TEST_DATA, Dim) :-
+ all_tests(_, Tests),
+ member(TEST_DATA, Tests),
+ ppl_dimension_test_data(TEST_DATA, space_dimension, Dim).
+
+choose_2_tests(TEST_DATA1, TEST_DATA2, Dim) :-
+ all_tests(0, Tests0),
+ all_tests(1, Tests1),
+ (
+ (member(TEST_DATA1, Tests0),
+ member(TEST_DATA2, Tests0)) ;
+ (member(TEST_DATA1, Tests1),
+ member(TEST_DATA2, Tests1))
+ ),
+ ppl_dimension_test_data(TEST_DATA1, space_dimension, Dim),
+ ppl_dimension_test_data(TEST_DATA2, space_dimension, Dim).
+
+:- discontiguous(ppl_build_test_data/4).
+:- discontiguous(ppl_dimension_test_data/3).
+:- discontiguous(ppl_relation_test_data/4).
+:- discontiguous(ppl_property_test_data/4).
+:- discontiguous(ppl_bounds_test_data/5).
+:- discontiguous(ppl_maxmin_test_data/10).
+:- discontiguous(ppl_frequency_test_data/9).
+:- discontiguous(ppl_constrains_test_data/3).
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+
+ppl_initial_test_system(constraint, universe).
+ppl_initial_test_system(congruence, universe).
+ppl_initial_test_system(generator, empty).
+ppl_initial_test_system(grid_generator, empty).
+
+predicate_exists(Predicate) :-
+ all_class_dependent_predicates(List_of_Predicates),
+ member(Predicate, List_of_Predicates).
+
+
+%%%%%%%%%%%% predicates for test data %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/* Test data for test test00 (an empty object in 0 dimensions) */
+
+ppl_build_test_data(test00, _Topology, constraints, [0 = 1]).
+ppl_build_test_data(test00, _Topology, generators, []).
+ppl_build_test_data(test00, _Topology, congruences, [(0 =:= 1) / 0]).
+ppl_build_test_data(test00, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test00, _, 0).
+
+ppl_relation_test_data(test00, constraint, 0 = 1, Rel) :-
+ Rel = [saturates, is_included, is_disjoint]
+ ; Rel = [saturates, is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint, saturates]
+ ; Rel = [is_included, saturates, is_disjoint]
+ ; Rel = [is_disjoint, is_included, saturates]
+ ; Rel = [is_disjoint, saturates, is_included]
+ ; Rel = [is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, generator, point(0), []).
+ppl_relation_test_data(test00, congruence, (0 =:= 1) / 0, Rel) :-
+ Rel = [saturates, is_included, is_disjoint]
+ ; Rel = [saturates, is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint, saturates]
+ ; Rel = [is_included, saturates, is_disjoint]
+ ; Rel = [is_disjoint, is_included, saturates]
+ ; Rel = [is_disjoint, saturates, is_included]
+ ; Rel = [is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test00, _, _, is_empty).
+ppl_property_test_data(test00, _, _, is_bounded).
+ppl_property_test_data(test00, _, _, is_topologically_closed).
+ppl_property_test_data(test00, _, _, is_discrete).
+
+ppl_bounds_test_data(test00, _, 0, _, true).
+
+ppl_maxmin_test_data(test00, _Topology, _, _, 0, _, _, _, _, false).
+
+ppl_frequency_test_data(test00, _Topology, _, 0, _, _, _, _, false).
+
+/* Test data for test test01 (an empty object in 1 dimension) */
+
+ppl_build_test_data(test01, _Topology, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A >= 1, A =< 0]).
+ppl_build_test_data(test01, _Topology, generators, []).
+ppl_build_test_data(test01, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(A =:= 1) / 2, (A =:= 0) / 2]).
+ppl_build_test_data(test01, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test01, space_dimension, 1).
+ppl_dimension_test_data(test01, affine_dimension, 0).
+
+ppl_relation_test_data(test01, constraint, 0 = 1, Rel) :-
+ Rel = [saturates, is_included, is_disjoint]
+ ; Rel = [saturates, is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint, saturates]
+ ; Rel = [is_included, saturates, is_disjoint]
+ ; Rel = [is_disjoint, is_included, saturates]
+ ; Rel = [is_disjoint, saturates, is_included]
+ ; Rel = [is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, generator, point(0), []).
+ppl_relation_test_data(test01, congruence, (0 =:= 1) / 0, Rel) :-
+ Rel = [saturates, is_included, is_disjoint]
+ ; Rel = [saturates, is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint, saturates]
+ ; Rel = [is_included, saturates, is_disjoint]
+ ; Rel = [is_disjoint, is_included, saturates]
+ ; Rel = [is_disjoint, saturates, is_included]
+ ; Rel = [is_disjoint, is_included]
+ ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test01, _, _, is_empty).
+ppl_property_test_data(test01, _, _, is_bounded).
+ppl_property_test_data(test01, _, _, is_topologically_closed).
+ppl_property_test_data(test01, _, _, is_discrete).
+
+ppl_bounds_test_data(test01, _, A, _, true) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test01, _Topology, _, _, 0, _, _, _, _, false).
+
+ppl_frequency_test_data(test01, _Topology, _, 0, _, _, _, _, false).
+
+ppl_constrains_test_data(test01, _, true).
+
+/* Test data for test test02 (a universe object in 0 dimensions) */
+
+ppl_build_test_data(test02, _Topology, constraints, []).
+ppl_build_test_data(test02, _Topology, generators, [point(0)]).
+ppl_build_test_data(test02, _Topology, congruences, []).
+ppl_build_test_data(test02, _Topology, grid_generators, [grid_point(0)]).
+
+ppl_dimension_test_data(test02, _, 0).
+
+ppl_relation_test_data(test02, constraint, 0 = 0, Rel) :-
+ Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+ ; Rel = [is_included].
+ppl_relation_test_data(test02, generator, point(0), [subsumes]).
+ppl_relation_test_data(test02, congruence, (0 =:= 0) / 0, Rel) :-
+ Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+ ; Rel = [is_included].
+ppl_relation_test_data(test02, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test02, _, _, is_universe).
+ppl_property_test_data(test02, _, _, is_bounded).
+ppl_property_test_data(test02, _, _, is_topologically_closed).
+ppl_property_test_data(test02, _, _, is_discrete).
+ppl_property_test_data(test02, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test02, _, 0, _, true).
+
+ppl_maxmin_test_data(test02, _Topology, constraint, _, 0, 0, 1, true,
+ point(0), true).
+ppl_maxmin_test_data(test02, _Topology, congruence, _, 0, 0, 1, true,
+ grid_point(0), true).
+
+ppl_frequency_test_data(test02, _Topology, _, 0, 0, 1, 0, 1, true).
+
+/* Test data for test test03 (a universe object in 1 dimension) */
+
+ppl_build_test_data(test03, _Topology, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A = A]).
+ppl_build_test_data(test03, _Topology, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(0), line(A)]).
+ppl_build_test_data(test03, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(A =:= A) / 0]).
+ppl_build_test_data(test03, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(0), grid_line(A)]).
+
+ppl_dimension_test_data(test03, _, 1).
+
+ppl_relation_test_data(test03, constraint, A = 0, [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test03, generator, point(0), [subsumes]).
+ppl_relation_test_data(test03, congruence, (A =:= 0) / 0, [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test03, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test03, _, _, is_universe).
+ppl_property_test_data(test03, _, _, is_topologically_closed).
+ppl_property_test_data(test03, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test03, _, A, _, false) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test03, _Topology, _, _, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test03, _Topology, _, 0, 0, 1, 0, 1, true).
+
+ppl_constrains_test_data(test03, _, false).
+
+/* Test data for test test04 and test05
+ (an object in 1 dimension with a single point) */
+
+ppl_build_test_data(test04, _Topology, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A = 1]).
+
+ppl_build_test_data(test04, _Topology, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(1*A)]).
+ppl_build_test_data(test04, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(A =:= 1) / 0]).
+ppl_build_test_data(test04, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(1*A)]).
+
+ppl_dimension_test_data(test04, space_dimension, 1).
+ppl_dimension_test_data(test04, affine_dimension, 0).
+
+ppl_relation_test_data(test04, constraint, A = 0, [is_disjoint]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test04, generator, point(0), []).
+ppl_relation_test_data(test04, congruence, (A =:= 0) / 0, [is_disjoint]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test04, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test04, _, _, is_bounded).
+ppl_property_test_data(test04, _, _, is_topologically_closed).
+ppl_property_test_data(test04, _, _, contains_integer_point).
+ppl_property_test_data(test04, _, _, is_discrete).
+
+ppl_bounds_test_data(test04, _, A, _, true) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test04, _Topology, constraint, _, A, 1, 1, true,
+ point(A), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test04, _Topology, congruence, _, A, 1, 1, true,
+ grid_point(A), true) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test04, _Topology, _, A, 0, 1, 1, 1, true) :-
+ make_vars(1, [A]).
+
+ppl_constrains_test_data(test04, _, true).
+
+ppl_build_test_data(test05, _Topology, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A = -1]).
+ppl_build_test_data(test05, _Topology, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(-1*A)]).
+ppl_build_test_data(test05, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(A =:= -1) / 0]).
+ppl_build_test_data(test05, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(-1*A)]).
+
+ppl_dimension_test_data(test05, space_dimension, 1).
+ppl_dimension_test_data(test05, affine_dimension, 0).
+
+ppl_relation_test_data(test05, constraint, A = 0, [is_disjoint]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test05, generator, point(0), []).
+ppl_relation_test_data(test05, congruence, (A =:= 0) / 0, [is_disjoint]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test05, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test05, _, _, is_bounded).
+ppl_property_test_data(test05, _, _, is_topologically_closed).
+ppl_property_test_data(test05, _, _, contains_integer_point).
+ppl_property_test_data(test05, _, _, is_discrete).
+
+ppl_bounds_test_data(test05, _, A, _, true) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test05, _Topology, constraint, _, A, -1, 1, true,
+ point(-1*A), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test05, _Topology, congruence, _, A, -1, 1, true,
+ grid_point(-1*A), true) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test05, _Topology, _, A, 0, 1, -1, 1, true) :-
+ make_vars(1, [A]).
+
+ppl_constrains_test_data(test05, _, true).
+
+/* Test data for test test06,
+ a non-universe object in 1 dimension with no upper bound */
+
+ppl_build_test_data(test06, T, constraints, CS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ CS = [A >= 0]).
+ppl_build_test_data(test06, T, generators, GS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ GS = [point(0*A), ray(A)]).
+ppl_build_test_data(test06, t_NNC_, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A > 0]).
+ppl_build_test_data(test06, t_NNC_, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(A), closure_point(0*A), ray(A)]).
+ppl_build_test_data(test06, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [A =:= 0]).
+ppl_build_test_data(test06, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(0*A), parameter(1*A)]).
+
+ppl_dimension_test_data(test06, _, 1).
+
+ppl_relation_test_data(test06, constraint, A =< 3, [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test06, generator, point(3*A), [subsumes]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test06, congruence, (2*A =:= 1) / 3,
+ [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test06, grid_generator, grid_point(3*A), [subsumes]) :-
+ make_vars(1, [A]).
+
+ppl_property_test_data(test06, T, _, is_topologically_closed) :-
+ \+ T == t_NNC_.
+ppl_property_test_data(test06, _, _, contains_integer_point).
+ppl_property_test_data(test06, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test06, _, A, above, false) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test06, constraint, A, below, true) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test06, congruence, A, below, false) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, maximize, A, _, _, _, _, false) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, minimize, A, 0, 1, true,
+ point(0), true) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, maximize, A, _, _, _,
+ _, false) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, minimize, A, 0, 1, false,
+ closure_point(0), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test06, _, congruence, _, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test06, _Topology, constraint, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test06, _Topology, congruence, A, 1, 1, 0, 1, true) :-
+ make_vars(1, [A]).
+
+ppl_constrains_test_data(test06, _, true).
+
+/* Test data for test test07,
+ a non-universe object in 1 dimension with no lower bound */
+
+ppl_build_test_data(test07, T, constraints, CS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ CS = [A =< 0]).
+ppl_build_test_data(test07, T, generators, GS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ GS = [point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, t_NNC_, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [A < 0]).
+ppl_build_test_data(test07, t_NNC_, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(A), closure_point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(A =:= 0) / 2]).
+ppl_build_test_data(test07, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(0*A), parameter(-2*A)]).
+
+ppl_dimension_test_data(test07, _, 1).
+
+ppl_relation_test_data(test07, constraint, A >= -3, [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test07, generator, point(-4*A), [subsumes]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test07, congruence, (2*A =:= 1) / 3,
+ [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test07, grid_generator, grid_point(6*A), [subsumes]) :-
+ make_vars(1, [A]).
+
+ppl_property_test_data(test07, T, _, is_topologically_closed) :-
+ \+ T == t_NNC_.
+ppl_property_test_data(test07, _, _, contains_integer_point).
+ppl_property_test_data(test07, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test07, _, A, below, false) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test07, constraint, A, above, true) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test07, congruence, A, above, false) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, minimize, A, _, _, _, _, false) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, maximize, A, 0, 1, true,
+ point(0), true) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, minimize, A, _, _, _,
+ _, false) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, maximize, A, 0, 1, false,
+ closure_point(0), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test07, _, congruence, _, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, constraint, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, congruence, A, 2, 1, 0, 1, true) :-
+ make_vars(1, [A]).
+
+ppl_constrains_test_data(test07, _, true).
+
+/* Test data for test test08,
+ a non-universe bounded object in 1 dimension */
+
+ppl_build_test_data(test08, T, constraints, CS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ CS = [2*A >= 3, A =< 5]).
+ppl_build_test_data(test08, T, generators, GS) :-
+ (\+ T == t_NNC_,
+ make_vars(1, [A]),
+ GS = [point(3*A, 2), point(5*A)]).
+ppl_build_test_data(test08, t_NNC_, constraints, CS) :-
+ (make_vars(1, [A]),
+ CS = [2*A > 3, A < 5]).
+ppl_build_test_data(test08, t_NNC_, generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [point(2*A), closure_point(3*A, 2), closure_point(5*A)]).
+ppl_build_test_data(test08, _Topology, congruences, CS) :-
+ (make_vars(1, [A]),
+ CS = [(2*A =:= 3) / 7]).
+ppl_build_test_data(test08, _Topology, grid_generators, GS) :-
+ (make_vars(1, [A]),
+ GS = [grid_point(3*A, 2), parameter(7*A, 2)]).
+
+ppl_dimension_test_data(test08, _, 1).
+
+ppl_relation_test_data(test08, constraint, A >= 3, [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test08, generator, point(5*A, 2), [subsumes]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test08, congruence, (2*A =:= 1) / 3,
+ [strictly_intersects]) :-
+ make_vars(1, [A]).
+ppl_relation_test_data(test08, grid_generator, grid_point(5*A), [subsumes]) :-
+ make_vars(1, [A]).
+
+ppl_property_test_data(test08, T, _, is_topologically_closed) :-
+ \+ T == t_NNC_.
+ppl_property_test_data(test08, _, _, contains_integer_point).
+ppl_property_test_data(test08, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test08, constraint, A, above, true) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, above, false) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test08, constraint, A, below, true) :-
+ make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, below, false) :-
+ make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, minimize, A, 3, 2, true,
+ point(3*A, 2), true) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, maximize, A, 5, 1, true,
+ point(5*A), true) :-
+ (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, minimize, A, 3, 2, false,
+ closure_point(3*A, 2), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, maximize, A, 5, 1, false,
+ closure_point(5*A), true) :-
+ make_vars(1, [A]).
+ppl_maxmin_test_data(test08, _, congruence, _, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, constraint, A, _, _, _, _, false) :-
+ make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, congruence, A, 7, 2, 3, 2, true) :-
+ make_vars(1, [A]).
+
+ppl_constrains_test_data(test08, _, true).
+
+/* boxes */
+
+ppl_dimension_test_data(test10, _, 2).
+ppl_dimension_test_data(test11, _, 2).
+ppl_dimension_test_data(test12, _, 2).
+
+ppl_build_test_data(test00, _Topology, box, [empty]).
+ppl_build_test_data(test01, _Topology, box, [empty]).
+ppl_build_test_data(test02, _Topology, box, []).
+ppl_build_test_data(test03, _Topology, box, [i(o(minf), o(pinf))]).
+ppl_build_test_data(test04, _Topology, box, [i(c(1), c(1))]).
+ppl_build_test_data(test05, _Topology, box, [i(c(-1), c(-1))]).
+ppl_build_test_data(test06, _Topology, box, [i(c(0), o(pinf))]).
+ppl_build_test_data(test07, _Topology, box, [i(o(minf), c(0))]).
+ppl_build_test_data(test08, _Topology, box, [i(c(3/2), c(5))]).
+ppl_build_test_data(test10, _Topology, box,
+ [i(c(1/2), o(pinf)), i(o(minf), c(-1/2))]).
+ppl_build_test_data(test11, _Topology, box, [i(c(-4), c(1)), i(c(-1), c(1))]).
+ppl_build_test_data(test12, T, box, [i(c(0/2), o(pinf)), i(o(minf), c(1))]) :-
+ \+ T == t_NNC_.
+ppl_build_test_data(test12, t_NNC_, box, [i(o(0/2), o(pinf)), i(o(minf), o(1))]).
diff --git a/interfaces/Prolog/tests/schedule.clpq b/interfaces/Prolog/tests/schedule.clpq
new file mode 100644
index 0000000..6281d5b
--- /dev/null
+++ b/interfaces/Prolog/tests/schedule.clpq
@@ -0,0 +1,22 @@
+into(task(S1, D1), task(S2, D2)) :-
+ {S2 =< S1, S1 + D1 = SD1, S2 + D2 = SD2, SD1 =< SD2}.
+
+noOverlap(_, []).
+noOverlap(task(S1, D1), [task(S2, D2)|Tasks]) :-
+ (
+ {S1 + D1 = SD1, SD1 < S2}
+ ;
+ {S2 + D2 = SD2, SD2 < S1}
+ ),
+ noOverlap(task(S1, D1), Tasks).
+
+schedule([], _).
+schedule([Task|Tasks], Supertask) :-
+ into(Task, Supertask),
+ noOverlap(Task, Tasks),
+ schedule(Tasks, Supertask).
+
+test1(S) :-
+ schedule([task(0, 1), task(3, 1), task(S, 1)], task(0, 6)).
+test2(S) :-
+ schedule([task(0, 28), task(70, 40), task(S, 35)], task(0, 240)).
diff --git a/interfaces/Prolog/tests/script_clpq b/interfaces/Prolog/tests/script_clpq
new file mode 100644
index 0000000..0434ccf
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq
@@ -0,0 +1,18 @@
+reconsult('ack.clpq').
+ack(2, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
diff --git a/interfaces/Prolog/tests/script_clpq2 b/interfaces/Prolog/tests/script_clpq2
new file mode 100644
index 0000000..9ea257c
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2
@@ -0,0 +1,36 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+;
+;
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/script_clpq2_int8 b/interfaces/Prolog/tests/script_clpq2_int8
new file mode 100644
index 0000000..4ca8087
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2_int8
@@ -0,0 +1,34 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/smm.clpq b/interfaces/Prolog/tests/smm.clpq
new file mode 100644
index 0000000..d6c608b
--- /dev/null
+++ b/interfaces/Prolog/tests/smm.clpq
@@ -0,0 +1,31 @@
+% *************************************
+% CLP(R) Version 1.1 - Example Programs
+% *************************************
+%
+% The classic cryptarithmetic puzzle:
+%
+% S E N D
+% + M O R E
+% ---------
+% M O N E Y
+
+solve(S, E, N, D, M, O, R, Y) :-
+ constraints(S, E, N, D, M, O, R, Y).
+
+constraints(S, E, N, D, M, O, R, Y) :-
+{
+ S >= 0, E >= 0, N >= 0, D >= 0, M >= 0, O >= 0, R >= 0, Y >= 0,
+ S =< 9, E =< 9, N =< 9, D =< 9, M =< 9, O =< 9, R =< 9, Y =< 9,
+ S >= 1, M >= 1,
+ C1 >= 0, C2 >= 0, C3 >= 0, C4 >= 0,
+ C1 =< 1, C2 =< 1, C3 =< 1, C4 =< 1,
+ M = C1,
+ C2 + S + M = O + C1 * 10,
+ C3 + E + O = N + 10 * C2,
+ C4 + N + R = E + 10 * C3,
+ D + E = Y + 10*C4
+},
+ bit(C1), bit(C2), bit(C3), bit(C4).
+
+bit(0).
+bit(1).
diff --git a/interfaces/Prolog/tests/sumto.clpq b/interfaces/Prolog/tests/sumto.clpq
new file mode 100644
index 0000000..329ef1b
--- /dev/null
+++ b/interfaces/Prolog/tests/sumto.clpq
@@ -0,0 +1,4 @@
+sumto(N, S) :-
+ { N = 0, S = 0 }.
+sumto(N, S) :-
+ { N = N1+1, S = N+S1 }, sumto(N1, S1).
diff --git a/interfaces/Prolog/tests/tak.clpq b/interfaces/Prolog/tests/tak.clpq
new file mode 100644
index 0000000..6defd26
--- /dev/null
+++ b/interfaces/Prolog/tests/tak.clpq
@@ -0,0 +1,20 @@
+% Evan Tick (from Lisp version by R. P. Gabriel)
+%
+% (almost) Takeuchi function (recursive arithmetic)
+
+tak(R) :- tak(18, 12, 6, R).
+
+tak(X, Y, Z, A) :-
+ {
+ X =< Y,
+ Z = A
+ }.
+
+tak(X, Y, Z, A) :-
+ {
+ X >= Y+1
+ },
+ tak(X-1, Y, Z, A1),
+ tak(Y-1, Z, X, A2),
+ tak(Z-1, X, Y, A3),
+ tak(A1, A2, A3, A ).
diff --git a/interfaces/interfaced_boxes.hh b/interfaces/interfaced_boxes.hh
new file mode 100644
index 0000000..7293f5b
--- /dev/null
+++ b/interfaces/interfaced_boxes.hh
@@ -0,0 +1,108 @@
+/* Declarations for the Box instantiations offered by the non-templatic
+ language interfaces.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_interfaced_boxes_hh
+#define PPL_interfaced_boxes_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+struct Z_Box_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Z_Box_Interval_Info_Policy> Z_Box_Interval_Info;
+
+typedef Box<Interval<mpz_class, Z_Box_Interval_Info> > Z_Box;
+
+struct Floating_Point_Box_Interval_Info_Policy {
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset <unsigned int,
+ Floating_Point_Box_Interval_Info_Policy> Floating_Point_Box_Interval_Info;
+
+typedef
+Box<Interval<float, Floating_Point_Box_Interval_Info> >
+Float_Box;
+
+typedef Box<Interval<double, Floating_Point_Box_Interval_Info> >
+Double_Box;
+
+typedef Box<Interval<long double, Floating_Point_Box_Interval_Info> >
+Long_Double_Box;
+
+struct Native_Integer_Box_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Native_Integer_Box_Interval_Info_Policy> Native_Integer_Box_Interval_Info;
+
+typedef Box<Interval<int8_t, Native_Integer_Box_Interval_Info> > Int8_Box;
+
+typedef Box<Interval<int16_t, Native_Integer_Box_Interval_Info> > Int16_Box;
+
+typedef Box<Interval<int32_t, Native_Integer_Box_Interval_Info> > Int32_Box;
+
+typedef Box<Interval<int64_t, Native_Integer_Box_Interval_Info> > Int64_Box;
+
+typedef Box<Interval<uint8_t, Native_Integer_Box_Interval_Info> > Uint8_Box;
+
+typedef Box<Interval<uint16_t, Native_Integer_Box_Interval_Info> > Uint16_Box;
+
+typedef Box<Interval<uint32_t, Native_Integer_Box_Interval_Info> > Uint32_Box;
+
+typedef Box<Interval<uint64_t, Native_Integer_Box_Interval_Info> > Uint64_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_interfaced_boxes_hh)
diff --git a/interfaces/marked_pointers.hh b/interfaces/marked_pointers.hh
new file mode 100644
index 0000000..86a365d
--- /dev/null
+++ b/interfaces/marked_pointers.hh
@@ -0,0 +1,64 @@
+/* Implementation of marked pointers for use in some PPL non-templatic
+ language interfaces.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_marked_pointers_hh
+#define PPL_marked_pointers_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#define PPL_MARKED_POINTERS_MASK ((uintptr_t) 1)
+
+/*! \brief
+ Returns the marked pointer corresponding to \p p.
+
+ The marking consists in setting the least significant bit to 1.
+*/
+template <typename T>
+inline T*
+mark(T* p) {
+ uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+ return reinterpret_cast<T*>(uint_p | (PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns the unmarked pointer corresponding to \p p.
+template <typename T>
+inline T*
+unmark(T* p) {
+ uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+ return reinterpret_cast<T*>(uint_p & ~(PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns <CODE>true</CODE> if and only if \p p is marked.
+template <typename T>
+inline bool
+marked(T* p) {
+ uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+ return (uint_p & (PPL_MARKED_POINTERS_MASK)) != 0;
+}
+
+#undef PPL_MARKED_POINTERS_MASK
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_marked_pointers_hh)
diff --git a/interfaces/ppl_interface_generator_common.m4 b/interfaces/ppl_interface_generator_common.m4
new file mode 100644
index 0000000..8b3cd1a
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common.m4
@@ -0,0 +1,925 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - application independent helper macros used here and by other m4 files.
+dnl - defining the main code generation macro m4_all_code.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl ---------------------------------------------------------------------
+dnl --- MACRO GROUPS and DEPENDENCIES ---
+dnl
+dnl For ease of keeping track of these macros and their dependencies,
+dnl the macro definitions are separated by the "===" comments into groups.
+dnl
+dnl Where a macro is only used within the group, it is labelled as "LOCAL".
+dnl Where it is used in this file but by another macro group, it is
+dnl labelled as "PRIVATE" and an indication of which group uses it.
+dnl Where it may be used in the generator files, it is labelled
+dnl as "PUBLIC".
+dnl
+dnl Some simple macros may be redefined by generator files and we
+dnl indicate that here is the default definition by the label
+dnl "DEFAULT DEF".
+dnl
+dnl The macro groups and the dependencies are:
+dnl
+dnl HELPERS (m4_forloop, m4_upcase, m4_downcase, m4_capfirstletter,
+dnl m4_capfirstletters, m4_changecase, m4_add_one_after_underscore,
+dnl m4_ifndef, m4_nargs, m4_arg, m4_arg_counter, m4_echo_unquoted,
+dnl m4_echo_quoted, m4_seq_intersection, m4_seq_difference
+dnl are all public.)
+dnl WARNING: some may not be used and may not be fully tested.
+dnl
+dnl ALL_CLASSES (m4_all_code is public)
+dnl |-- m4_interface_generator_common_dat.m4 (m4_init_class_definitions)
+dnl `-- ONE_CLASS (m4_one_class_code)
+dnl |-- FILTER_PROCEDURES (m4_filter_all_procedures)
+dnl | `-- m4_interface_generator_common_dat.m4 (m4_group_names)
+dnl |-- PATTERNS_TO_REPLACEMENTS (m4_replace_all_patterns_in_string)
+dnl |-- PATTERNS (m4_pattern_annotation0, ...)
+dnl |-- REPLACEMENT_TEXT (m4_annotated_pattern_replacement,
+dnl | | m4_def_replacements_for_extended_patterns,
+dnl | | m4_def_extended_replacements)
+dnl | |-- PATTERNS (m4_pattern_extension0, ...)
+dnl | `-- m4_interface_generator_common_dat.m4
+dnl | (m4_class_pattern_replacements)
+dnl |-- m4_interface_generator_<interface>_procedure_generator.m4
+dnl | (m4_procedure_list)
+dnl `-- EXPAND_PROCEDURES (m4_get_schematic_code)
+dnl
+dnl Note that the macro names indicate that they are used by the parent
+dnl macro group.
+dnl ---------------------------------------------------------------------
+
+dnl =====================================================================
+dnl *** HELPERS ****
+dnl The following are application independent helper macros
+dnl =====================================================================
+
+dnl All these helper macros are intended to be "PUBLIC"
+dnl except for auxiliary macros, labelled as "LOCAL".
+
+dnl m4_forloop(Iteration_Var, From_Value, To_Value, Loop_Body)
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_forloop',
+ `m4_pushdef(`$1', `$2')_m4_forloop(`$1', `$2', `$3', `$4')m4_popdef(`$1')')
+m4_define(`_m4_forloop',
+ `$4`'m4_ifelse($1, `$3', ,
+ `m4_define(`$1', m4_incr($1))_m4_forloop(`$1', `$2', `$3', `$4')')')
+
+
+dnl m4_upcase(String), m4_downcase(String)
+dnl
+dnl Code copied from m4 documentation.
+dnl Examples: m4_upcase(`abCd') ==> ABCD
+dnl m4_downcase(`abCd') ==> abcd
+m4_define(`m4_upcase', `m4_translit(`$*', `a-z', `A-Z')')
+m4_define(`m4_downcase', `m4_translit(`$*', `A-Z', `a-z')')
+
+dnl m4_capfirstletter(String)
+dnl
+dnl Capitalises first letter of words that can have letters and underscores.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_abc
+m4_define(`m4_capfirstletter',
+ `m4_regexp(`$1', `^\(\w\)\([\w_]*\)',
+ m4_upcase(`\1')`\2')')
+
+dnl m4_capfirstletters(String)
+dnl
+dnl Capitalises first letter of subwords that can have letters only.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_Abc
+m4_define(`m4_capfirstletters',
+ `m4_ifelse(m4_index(`$1', `_'), -1,
+ `m4_regexp(`$1', `^\(\w\)\(\w*\)',
+ `m4_upcase(`\1')`\2'')',
+ m4_regexp(`$1', `^\(\w\)\(\w*_\)\(\w\)\(\w*\)',
+ `m4_upcase(`\1')`\2'm4_upcase(`\3')`\4''))')
+
+m4_define(`m4_changecase',
+ `m4_ifelse(m4_regexp(`$1', `[A-Z]'), -1,
+ m4_capfirstletters($1),
+ m4_downcase($1))`'dnl
+')
+
+
+dnl m4_add_one_after_underscore(String)
+dnl
+dnl Adds a 1 after any underscore (needed for Java interface code)..
+dnl Example: m4_capfirstletter(`xyz_abc') ==> xyz_1abc
+m4_define(`m4_add_one_after_underscore', `m4_patsubst(`$1', `_', `_1')')
+
+dnl m4_ifndef(Macro, Default Definition)
+dnl
+dnl If Macro is defined, use that definition;
+dnl otherwise use the Default Definition.
+m4_define(`m4_ifndef', `m4_ifdef(`$1', $1, $2)')
+
+dnl m4_nargs expands to the number of arguments.
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_nargs', `$#')
+
+dnl m4_arg(Ind, Arg1, Arg2, ...)
+dnl
+dnl m4_arg expands to Arg`'Ind
+m4_define(`m4_arg',
+`m4_ifelse($1, 0, , $1, 1, $2, `m4_arg(m4_decr($1), m4_shift(m4_shift($@)))')')
+
+dnl m4_arg_counter(String, Arg1, Arg2, ...)
+dnl
+dnl If String = Arg`'Counter, m4_arg_counter expands to Counter
+dnl where Counter is the least index for which this holds.
+dnl Otherwise it expands to the empty string.
+m4_define(`m4_arg_counter', `m4_arg_counter_aux(1, $@)')
+
+dnl LOCAL
+m4_define(`m4_arg_counter_aux', `dnl
+m4_ifelse($#, 0, ,$#, 1, , $#, 2, ,
+ $2, $3, $1,
+ $#, 3, ,
+ `m4_arg_counter_aux(m4_incr($1), $2, m4_shift(m4_shift(m4_shift($@))))')`'dnl
+')
+
+dnl m4_echo_unquoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo1.
+m4_define(`m4_echo_unquoted', `$*')
+dnl m4_echo_quoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo2.
+m4_define(`m4_echo_quoted', `$@')
+
+dnl ----------------------------------------------------------------------
+dnl m4_two_seq_intersection,
+dnl m4_three_seq_intersection and helper macros
+dnl
+dnl These find the intersection of two and three sequences, respectively.
+dnl ----------------------------------------------------------------------
+dnl
+dnl m4_seq_intersection
+dnl
+dnl This macro with its helper macros below,
+dnl intersects two or three sequences that must be previously defined
+dnl as `m4_1st_sequence', `m4_2nd_sequence' and, if there is a third,
+dnl `m4_3rd_sequence'. The number of sequences (2 or 3) must also be defined
+dnl by the macro `m4_number_of_sequences'. The order of the
+dnl intersected sequence is that of m4_1st_sequence.
+dnl
+dnl For example, if m4_1st_sequence is defined to be `a, b, c, d' and
+dnl m4_2nd_sequence is defined to be `b, d, e, a, f',
+dnl this macro is defined to be `a, b, d'.
+m4_define(`m4_seq_intersection', `dnl
+m4_define(`m4_add_one_first', 1)`'dnl
+m4_patsubst(m4_seq_intersection_aux(m4_1st_sequence),
+ |COMMA|, `, ')`'dnl
+')
+
+dnl LOCAL
+dnl m4_seq_intersection_aux(...)
+dnl
+dnl The arguments are the first sequence to be intersected.
+dnl It calls either the helper macro for 3 sequences or the helper
+dnl macro for 2 sequences (depending on the number of sequences).
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1,
+ m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence),
+ m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence)`'dnl
+`m4_seq_intersection_aux(m4_shift($@))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_3_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position
+dnl as well as in m4_3rd_sequence.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_3_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+ `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)')',
+ `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)',
+`m4_3_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_2_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_2_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+ `m4_ifelse($1, $2, `m4_add_one($1)')',
+ `m4_ifelse($1, $2, `m4_add_one($1)',
+`m4_2_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_add_one(String)
+dnl
+dnl This separates the new sequence temporarily with |COMMA| to avoid
+dnl the `,' being mis-interpreted by m4.
+m4_define(`m4_add_one', `dnl
+m4_ifelse(m4_add_one_first, 1,
+ $1`'m4_undefine(`m4_add_one_first'), |COMMA|$1)`'dnl
+')
+
+dnl ----------------------------------------------------------------------
+dnl m4_seq_difference and helper macros
+dnl
+dnl This finds the difference of two sequences.
+dnl ----------------------------------------------------------------------
+dnl
+dnl m4_seq_difference
+dnl
+dnl CHECKME: Currently this macro is not used.
+dnl This macro with its helper macros below,
+dnl finds the difference of two sequences that must be previously defined
+dnl as `m4_1st_sequence', `m4_2nd_sequence'. The order of the
+dnl difference sequence is that of m4_1st_sequence.
+dnl
+dnl For example, if m4_1st_sequence is defined to be `a, b, c, d' and
+dnl m4_2nd_sequence is defined to be `d, e, a, f',
+dnl this macro is defined to be `b, c'.
+m4_define(`m4_seq_difference', `dnl
+m4_patsubst(m4_seq_difference_aux(m4_1st_sequence),
+ `^|COMMA|', `')`'dnl
+')
+m4_define(`m4_seq_differencexx', `dnl
+m4_patsubst(m4_patsubst(m4_seq_difference_aux(m4_1st_sequence),
+ `^|COMMA|', `'),
+ |COMMA|, `, ')`'dnl
+')
+
+dnl LOCAL
+dnl m4_seq_difference_aux(...)
+dnl
+dnl The arguments are the first sequence to be intersected.
+dnl It calls either the helper macro for 3 sequences or the helper
+dnl macro for 2 sequences (depending on the number of sequences).
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_seq_difference_aux', `dnl
+m4_ifelse($#, 0, , $#, 1,
+ m4_2_seq_difference_aux($1, m4_2nd_sequence),
+ `m4_2_seq_difference_aux($1, m4_2nd_sequence)`'dnl
+m4_seq_difference_aux(m4_shift($@))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_2_seq_difference_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' does not occur
+dnl in the 2nd or in a later argument position.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_2_seq_difference_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, `m4_add_one($1)', $#, 2,
+ `m4_ifelse($1, $2, , `m4_add_one($1)')',
+ `m4_ifelse($1, $2, ,
+`m4_2_seq_difference_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl =====================================================================
+dnl *** PATTERNS ***
+dnl Some processing that just involves the patterns themselves.
+dnl =====================================================================
+
+dnl ----------- General Info on Patterns --------------------------------
+dnl Each pattern can be plain, have an extension (eg "A_") and/or
+dnl be annotated by "!", and, for Java "1" where the
+dnl latter can be combined with a "!".
+dnl In the text being replaced, all patterns, extensions, and annotations
+dnl are in upper case and the complete pattern is bracketed by the pattern
+dnl delimiter.
+dnl ---------------------------------------------------------------------
+
+dnl PRIVATE
+dnl Used in macro-group "REPLACEMENT_TEXT"
+dnl
+dnl DEFAULT_DEF
+dnl m4_pattern_extension`'EIndex
+dnl
+dnl is defined for each allowed extension.
+dnl These options can be added to as needed by any of the generator files.
+dnl
+m4_define(`m4_pattern_extension0', `')
+m4_define(`m4_pattern_extension1', `A_')
+m4_define(`m4_pattern_extension2', `B_')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS"
+dnl
+dnl m4_pattern_annotation`'AIndex
+dnl
+dnl is defined here for AIndex values 0 and 1.
+dnl - 0, which has the empty annotation,
+dnl means that the actual replacement must be unchanged:
+dnl - 1, which has annotation !,
+dnl means that the actual replacement must be:
+dnl - lowercase, if the original has the first character uppercase, and
+dnl - the first letter of each word ("_" separated) uppercase, otherwise.
+m4_define(`m4_pattern_annotation0', `')
+m4_define(`m4_pattern_annotation1', `!')
+
+dnl PUBLIC
+dnl m4_java_prefix_one_annotation
+dnl Only used by Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+dnl as the extra annotations are only needed there.
+dnl PRIVATE
+dnl m4_pattern_annotation`'AIndex
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS"
+dnl
+dnl m4_pattern_annotation`'AIndex is defined here for AIndex values 2 and 3:
+dnl - 2, which has annotation 1,
+dnl means that the actual replacement must have a 1 after
+dnl the underscore;
+dnl - 3, which has annotation 1!,
+dnl means that the actual replacement must have a 1 after
+dnl the underscore with the same change of case as for the annotation "!".
+m4_define(`m4_java_prefix_one_annotation',
+`m4_define(`m4_pattern_annotation2', `1')
+m4_define(`m4_pattern_annotation3', `1!')')
+
+dnl =====================================================================
+dnl *** REPLACEMENT_TEXT ***
+dnl The precise replacing text is defined in
+dnl m4_interfaces_generator_common_dat.m4
+dnl We first retrieve this text by constructing the correct macro
+dnl for the extended pattern. We then define the additional text
+dnl processing needed based on the annotation of the pattern.
+dnl =====================================================================
+
+dnl LOCAL
+dnl DEFAULT_DEF
+dnl m4_replacement_extension`'EIndex
+dnl
+dnl is defined for each allowed extension EIndex.
+dnl This should correspond in lowercase to m4_pattern_extension.
+dnl
+m4_define(`m4_replacement_extension0', `')
+m4_define(`m4_replacement_extension1', `a_')
+m4_define(`m4_replacement_extension2', `b_')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_def_replacements_for_extended_patterns(RIndex, EIndex)
+dnl m4_replace`'EIndex
+dnl
+dnl RIndex - is the index of the replacement;
+dnl EIndex - is the index of the extension.
+dnl For each possible EIndex value, m4_replace`'EIndex
+dnl is defined for the RIndex replacement.
+dnl
+m4_define(`m4_def_replacements_for_extended_patterns', `dnl
+m4_ifdef(`m4_pattern_extension$2',
+ `m4_define(`m4_replace$2',
+ `m4_arg($1, m4_replacements$2)')`'dnl
+m4_def_replacements_for_extended_patterns($1, m4_incr($2))`'dnl
+')`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_annotated_pattern_replacement`'AIndex(EIndex)
+dnl
+dnl where AIndex in {0..3}
+dnl Note that annotations 2 and 3 are only used by the Java interface.
+dnl
+dnl EIndex - is the index of the extension.
+dnl
+dnl For each annotation and, for the single replacement
+dnl m4_replace`'EIndex (already defined for the current pattern),
+dnl this macro defines an exact replacement string to be used to
+dnl replace the annotated and extended pattern.
+dnl
+m4_define(`m4_annotated_pattern_replacement0',
+ `m4_replace$1')
+m4_define(`m4_annotated_pattern_replacement1',
+ `m4_changecase(m4_replace$1)')
+m4_define(`m4_annotated_pattern_replacement2',
+ `m4_add_one_after_underscore(m4_replace$1)')
+m4_define(`m4_annotated_pattern_replacement3',
+ `m4_add_one_after_underscore(m4_changecase(m4_replace$1))')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_def_extended_replacements(Class_Counter, Pattern, EIndex)
+dnl m4_replacements`'EIndex
+dnl
+dnl Class_Counter - The current class counter;
+dnl Pattern - The current pattern;
+dnl EIndex - is the index of the replacement macro name extension.
+dnl
+dnl m4_replacements`'EIndex is defined to be the list
+dnl of the replacements for Pattern with the EIndex extension
+dnl and for the class indicated by Class_Counter.
+dnl This uses m4_class_pattern_replacements/3 that is defined in
+dnl ppl_interface_generator_common_dat.m4 and uses the data for
+dnl the replacements defined in the same file.
+dnl
+m4_define(`m4_def_extended_replacements', `dnl
+m4_ifdef(m4_replacement_extension`'$3, `dnl
+m4_define(`m4_replacements$3',
+ `m4_class_pattern_replacements($1, $2, m4_replacement_extension$3)`'dnl
+m4_def_extended_replacements($1, $2, m4_incr($3))')')`'dnl
+')
+
+dnl =====================================================================
+dnl *** EXPAND_PROCEDURES ***
+dnl The next macros deal with expanding the schematic procedures.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_get_arity(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags.
+dnl
+dnl If the substring "/Arity" is found in the Procedure_Flags,
+dnl this macro expands to Arity.
+m4_define(`m4_get_arity', `m4_regexp(`$1', `/\([0-9]*\)', \1)')
+
+dnl LOCAL
+dnl m4_get_attribute(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags.
+dnl
+dnl If the substring "*nofail" is found in the Procedure_Flags,
+dnl this macro expands to "nofail"
+dnl This is only needed for the Ciao system code.
+m4_define(`m4_get_attribute', `m4_regexp(`$1', `\*\(nofail\)', \1)')
+
+dnl We next define the default values for two extra macros
+dnl giving us more dynamic control by the individual code generators.
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_procedure_schema_extension
+dnl
+dnl Normally, the procedure schema is defined using the extension `code'
+dnl but in the (Prolog) documentation this is varied according to the type of
+dnl the procedure.
+m4_define(`m4_procedure_schema_extension', `code')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_procedure_schema_debug
+dnl
+dnl the default is to do nothing;
+dnl However, by locally defining this to be
+dnl m4_dumpdef($1, m4_procedure_schema_extension, we can check
+dnl that all the procedure schemas are defined with the given extension.
+m4_define(`m4_procedure_schema_debug', `')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_expanded_procedure_schema(Procedure_Name,
+dnl [Arity, Attribute],
+dnl Start_Flag)
+dnl
+dnl Procedure_Name - The schematic name;
+dnl Arity - The arity of the procedure;
+dnl Attribute - The attribute `nofail' or `';
+dnl Start_Flag - 0 suppresses any separator
+dnl (needed for expanding a comma separated list).
+dnl
+dnl The default definition.
+dnl Appends "_code" to Procedure_Name so that it can match the name
+dnl of one of the macros defined (if ever) in file *_code.m4 and get
+dnl therefore expanded to the corresponding code schema.
+dnl
+dnl Here arguments Arity and Attribute are ignored.
+dnl This macro is redefined when a different extension is needed.
+dnl (e.g., in the Prolog system files).
+dnl
+dnl Note: the macro `$1_code' has to be called using builtin `indir'
+dnl because it is not a legal m4 identifier (it contains `@').
+dnl
+dnl Some test generators and the Prolog system file generators redefine this
+dnl macro to construct the code directly from the schema name, arity
+dnl and its attributes.
+m4_define(`m4_expanded_procedure_schema',
+ `m4_ifdef($1_`'m4_procedure_schema_extension,
+ `m4_indir($1_`'m4_procedure_schema_extension)',
+ `m4_procedure_schema_debug($1)')`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "ONE_CLASS".
+dnl
+dnl m4_get_schematic_code(Procedure_Spec, Start_Flag, Class_Kind)
+dnl
+dnl Procedure_Spec - The schematic procedure name, complete with any flags;
+dnl Start_Flag - 0 suppresses any separator
+dnl (needed for expanding a comma separated list);
+dnl Class_Kind - The current class kind.
+dnl
+dnl Procedure_Spec has the flags removed and expanded to the extended code.
+m4_define(`m4_get_schematic_code', `dnl
+m4_patsubst(`$1',
+ `[ ]*\(ppl_[^ /]+\)\(.*\)',
+ `m4_expanded_procedure_schema(\1, m4_get_arity(\2),
+ m4_get_attribute(\2), $2, $3)')`'dnl
+')
+
+dnl =====================================================================
+dnl *** FILTER_PROCEDURES ***
+dnl ====== The next set of macros filter the procedure specifications =
+dnl ====== according to the +/-group names in the extra flags in the =
+dnl ====== procedure specification. =
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_keep_or_throw_for_one_group(
+dnl Class_Counter, Procedure_Spec, +_or_-, Group)
+dnl
+dnl Class_Counter - The current class counter;
+dnl Procedure_Spec - A schematic procedure name with flags still attached;
+dnl +_or_- - + or -;
+dnl Group - A group name.
+dnl
+dnl This checks if Class_Kind is in the list of class kinds defined
+dnl by Group (in ppl_interface_generator_common_dat.m4);
+dnl if it is, it checks if +Group or -Group
+dnl (depending if +_or_- is + or -) is included in the Procedure_Spec;
+dnl if it is, then it expands to 1, otherwise, expands to 0.
+m4_define(`m4_keep_or_throw_for_one_group', `dnl
+m4_ifelse(m4_arg_counter($1, m4_$4_group), `', 0,
+ `m4_ifelse(m4_index($2, $3$4), -1, 0, 1)')`'dnl
+')
+
+dnl LOCAL
+dnl m4_keep_or_throw(
+dnl Class_Counter, Procedure_Spec, +_or_-, Group1, Group2, ...)
+dnl
+dnl Class_Counter - The current class counter;
+dnl Procedure_Spec - A schematic procedure name with flags still attached;
+dnl +_or_- - + or -;
+dnl Group1 - A group name;
+dnl ....
+dnl Groupk - A group name.
+m4_define(`m4_keep_or_throw', `dnl
+m4_ifelse($#, 0, 0, $#, 1, 0, $#, 2, 0, $#, 3, 0,
+ $#, 4, `m4_keep_or_throw_for_one_group($1, $2, $3, $4)',
+ `m4_ifelse(m4_keep_or_throw_for_one_group($1, $2, $3, $4), 1, 1,
+ `m4_keep_or_throw($1, $2, $3,
+ m4_shift(m4_shift(m4_shift(m4_shift($@)))))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_filter_one_procedure(Class_Counter, Procedure_Spec)
+dnl
+dnl Class_Counter - The current class counter;
+dnl Procedure_Spec - A schematic procedure name with flags still attached.
+dnl
+dnl Keeps just those procedures that are wanted for the given class kind.
+dnl It first checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "-",
+dnl if so, it expands to the empty string;
+dnl otherwise, it checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "+",
+dnl if so, it expands to Procedure_Spec.
+m4_define(`m4_filter_one_procedure', `dnl
+m4_define(`m4_proc_info_string',
+ `m4_patsubst(`$2', `[ ]*ppl_[^ ]+ \(.*\)', \1)')`'dnl
+m4_ifelse(m4_keep_or_throw(m4_class_kind$1,
+ m4_proc_info_string, -,
+ m4_group_names),
+ 1, 0,
+ m4_keep_or_throw(m4_class_body_kind$1,
+ m4_proc_info_string, \,
+ m4_group_names),
+ 1, 0,
+ m4_keep_or_throw(m4_class_body_2nd_kind$1,
+ m4_proc_info_string, ?,
+ m4_group_names),
+ 1, 0,
+ `m4_keep_or_throw(m4_class_kind$1,
+ m4_proc_info_string, +,
+ m4_group_names)')`'dnl
+m4_undefine(m4_proc_info_string)`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "ONE_CLASS".
+dnl
+dnl m4_filter_all_procedures(Class_Counter, keep_or_throw_flag,
+dnl Procedure_Spec1, ProcedureSpec2, ...)
+dnl
+dnl Class_Counter - The current class kind;
+dnl keep_or_throw_flag
+dnl - has value 1 or 0;
+dnl Procedure_Spec1 - A schematic procedure name with flags still attached;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name with flags still attached;
+dnl Keeps just those procedure names that are needed for the given class kind.
+dnl The classes to be kept or filtered away are determined by extra info
+dnl included with each Procedure_Name
+dnl The keep_or_throw_flag determines if the filtered procedures
+dnl are the wanted (value 1) procedures or the unwanted ones (value 0);
+dnl Here we only use the wanted procedures list.
+dnl The unwanted list is used when generating the Prolog tests.
+m4_define(`m4_filter_all_procedures', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, ,
+ $#, 3,
+ `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+ `$3')',
+ `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+ `$3,
+')`'dnl
+m4_filter_all_procedures($1, $2, m4_shift(m4_shift(m4_shift($@))))`'dnl
+')`'dnl
+')
+
+dnl =====================================================================
+dnl *** PATTERNS_TO_REPLACEMENTS ***
+dnl The string has all its patterns replaced by the corresponding
+dnl replacements. If there are several alternative replacements
+dnl then several versions of the pattern-replaced string are generated.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_annotated_extended_pattern_replacement(String, EIndex, AIndex)
+dnl
+dnl String - is the string that has the patterns for replacing;
+dnl EIndex - is the index of the extension;
+dnl AIndex - is the index of the annotation.
+dnl
+dnl One pattern with an optional extension and annotation is replaced
+dnl by the corresponding replacement.
+dnl This is the key inner step for each string
+dnl (usually this string is the expanded procedure schema).
+dnl
+m4_define(`m4_annotated_extended_pattern_replacement', `dnl
+m4_ifdef(`m4_pattern_annotation$3',
+ `m4_define(`m4_annotated_extended_pattern',
+ m4_pattern_annotation$3`'m4_extended_pattern)`'dnl
+m4_annotated_extended_pattern_replacement(m4_patsubst($1,
+ @`'m4_annotated_extended_pattern`'@,
+ m4_annotated_pattern_replacement$3($2)), $2, m4_incr($3))',
+ `$1')`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_one_replacement(String, RIndex)
+dnl
+dnl String - is the string;
+dnl RIndex - is the index of the replacement.
+dnl
+dnl The patterns in the string are replaced by the replacement
+dnl indexed by RIndex.
+dnl
+dnl It first defines the m4_replace`'EIndex macros for each EIndex
+dnl extension using the macro m4_def_replacements_for_extended_patterns/2.
+dnl If m4_replace0 is defined to be different from "NONE",
+dnl the macro m4_expand_pattern_by_one_replacement_aux/2 is called
+dnl to do the replacements, iterating through the extensions.
+dnl When m4_replace0 is NONE, then the code is replaced by the
+dnl the empty string.
+dnl
+m4_define(`m4_expand_pattern_by_one_replacement', `dnl
+m4_def_replacements_for_extended_patterns($2, 0)`'dnl
+m4_ifelse(m4_replace0, NONE, `',
+ m4_expand_pattern_by_one_replacement_aux($1, 0)`'dnl
+)`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_one_replacement_aux(String, EIndex)
+dnl m4_extended_pattern(EIndex)
+dnl
+dnl String - is the string;
+dnl EIndex - is the index of the pattern extension.
+dnl
+dnl Iterates through EIndex values, defining m4_extended_pattern(EIndex)
+dnl and calling an auxiliary macro to replace the (delimited, possibly
+dnl extended and annotated) m4_PATTERN in String.
+dnl
+dnl If there are no replacements for EIndex, stop the replacements.
+dnl
+m4_define(`m4_expand_pattern_by_one_replacement_aux', `dnl
+m4_ifelse(`m4_replacements$2', `', `$1',
+ `m4_ifdef(`m4_pattern_extension$2',
+ `m4_define(`m4_extended_pattern', m4_pattern_extension$2`'m4_PATTERN)`'dnl
+m4_expand_pattern_by_one_replacement_aux(
+ m4_annotated_extended_pattern_replacement($1, $2, 0),
+ m4_incr($2))',
+ `$1')`'dnl
+')`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_all_replacements(String, RIndex)
+dnl
+dnl String - is the string;
+dnl RIndex - is the index of the replacement.
+dnl
+dnl This iteratively calls m4_expand_pattern_by_one_replacement/2 to replace
+dnl (a delimited form of possibly extended and annotated) m4_PATTERN by the
+dnl arguments of m4_replacements`'RIndex.
+m4_define(`m4_expand_pattern_by_all_replacements', `dnl
+m4_ifelse($2, m4_nargs(m4_replacements0),
+ m4_expand_pattern_by_one_replacement($1, $2),
+ `m4_expand_pattern_by_one_replacement($1, $2)`'dnl
+m4_expand_pattern_by_all_replacements($1, m4_incr($2))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_replace_one_pattern_in_string(Class_Number, String, Pattern)
+dnl
+dnl Class_Number - is the index to Class in Class_List;
+dnl String - is the code to be changed;
+dnl Pattern - is the pattern to be replaced.
+dnl
+dnl Replaces all occurrences of the capitalised form of Pattern
+dnl in String by the required replacement
+dnl (determined both by the class kind of Class and Pattern).
+m4_define(`m4_replace_one_pattern_in_string', `dnl
+dnl the m4_PATTERN (in uppercase) is the string to be replaced.
+m4_define(`m4_PATTERN', m4_upcase($3))`'dnl
+m4_def_extended_replacements($1, $3, 0)`'dnl
+m4_expand_pattern_by_all_replacements($2, 1)`'dnl
+dnl Cleanup temporary definitions.
+m4_undefine(`m4_PATTERN')`'dnl
+')
+
+dnl PUBLIC
+dnl Used in macro-group "ONE_CLASS" and by other m4 generator files.
+dnl
+dnl m4_replace_all_patterns(Class_Number, String)
+dnl
+dnl A (recursive) macro to replace, inside the second argument String,
+dnl all of the patterns.
+dnl
+dnl This is public because it is used by some code generators to replace
+dnl patterns used in some additional text provided locally.
+m4_define(`m4_replace_all_patterns', `dnl
+m4_define(`m4_ann_ext_pattern_in_string',
+ `m4_regexp($2, `[.]*@[^@_A-Z]*\([_A-Z]+\)@.*', `\1')')`'dnl
+m4_ifelse(m4_ann_ext_pattern_in_string, `', $2,
+ `m4_replace_all_patterns($1,
+ m4_replace_one_pattern_in_string($1, $2,
+ m4_downcase(m4_patsubst(m4_ann_ext_pattern_in_string, ^[A-E]_, `'))))')
+')
+
+dnl =====================================================================
+dnl *** ONE_CLASS ***
+dnl The next set of macros process a single class.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_replace_procedure_spec_by_code(Class_Number, Procedure_Spec)
+dnl
+dnl Class_Number - The current class counter;
+dnl Procedure_Spec - The schematic procedure name, complete with any flags.
+dnl
+dnl The procedure specification is replaced with the code and then
+dnl the patterns in the code are replaced by the required replacements.
+dnl
+dnl Note: one schematic specification will replaced by a single
+dnl matching schematic code item; which is then replaced by several
+dnl instances.
+m4_define(`m4_replace_procedure_spec_by_code', `dnl
+m4_patsubst(`$2', `\(.*\)', `dnl
+m4_replace_all_patterns($1,
+ m4_get_schematic_code(\1, 1, $1))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_replace_all_procedure_specs_by_code(Class_Number,
+dnl Procedure_Spec1, Procedure_Spec2, ...)
+dnl
+dnl Class_Number - The current class counter;
+dnl Procedure_Spec1 - A schematic procedure name;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name.
+dnl
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_replace_all_procedure_specs_by_code', `dnl
+m4_ifelse($#, 0, , $#, 1, ,
+ $#, 2, `m4_replace_procedure_spec_by_code($1, $2)',
+ `dnl
+m4_replace_procedure_spec_by_code($1, $2)`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_shift(m4_shift($@)))`'dnl
+')dnl
+')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl m4_post_extra_class_code(Class_Counter)
+dnl
+dnl Class_Counter - The index for the current class.
+dnl
+dnl Default (empty) definitions for pre- and post- code for each class.
+dnl These should be redefined as needed.
+m4_define(`m4_pre_extra_class_code', `')
+m4_define(`m4_post_extra_class_code', `')
+
+dnl PRIVATE
+dnl Used by macro-group "ALL_CLASSES".
+dnl
+dnl DEFAULT DEF
+dnl m4_one_class_code(Class_Counter)
+dnl
+dnl Class_Counter - The index for the current class.
+dnl
+dnl First, any necessary prefix code for the procedures in
+dnl that class is added.
+dnl Then, the main procedure input list is filtered according to
+dnl the current class kind and the +/- codes included with the procedure.
+dnl Each procedure that is not filtered away is checked to see if
+dnl there is a macro with "_code" extension that defines the code.
+dnl Then a macro sets the class and other schematic components.
+dnl Finally, any necessary postfix code for the procedures in
+dnl that class is added.
+m4_define(`m4_one_class_code', `dnl
+dnl m4_this_class_stuff($1)`'dnl
+m4_pre_extra_class_code($1)`'dnl
+m4_define(`m4_filtered_proc_list',
+ `m4_filter_all_procedures($1, 1, m4_procedure_list)')`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_filtered_proc_list)`'dnl
+m4_undefine(`m4_filtered_proc_list')`'dnl
+m4_post_extra_class_code($1)`'dnl
+')
+
+dnl =====================================================================
+dnl *** ALL_CLASSES ***
+dnl The final set of macros process all the classes, one at a time.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_pre_all_classes_code
+dnl
+dnl Default (empty) definitions for code that must be placed before all
+dnl the generated code.
+dnl This is required for code that depends on the instantiated classes
+dnl (so must be generated from a schema) but has to be included before
+dnl all classes (as in ppl_prolog_icc.m4).
+m4_define(`m4_pre_all_classes_code', `')
+
+dnl LOCAL
+dnl m4_all_classes_code(Class_Counter)
+dnl
+dnl Class_Counter - The index for the current class;
+dnl This iterates through the classes to generate the code.
+dnl The actual code for each class is generated by m4_one_class_code.
+dnl The generated code then has the pattern "|COMMA|" replaced by ",".
+m4_define(`m4_all_classes_code', `dnl
+m4_ifdef(m4_interface_class`'$1,
+ `m4_patsubst(m4_one_class_code($1), `|COMMA|', `,')`'dnl
+m4_all_classes_code(m4_incr($1))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_class_definitions_initialized/0
+dnl
+dnl Avoids initializing the class macro definitions more than once
+dnl when the main macro m4_all_code/0 is called more than once in a
+dnl file generation.
+m4_define(`m4_class_initialized', `false')
+
+m4_define(`m4_initialize_all', `dnl
+m4_init_class_definitions`'dnl
+m4_define(`m4_class_initialized', `true')`'dnl
+')
+
+dnl PUBLIC
+dnl m4_all_code
+dnl
+dnl The macros for names of the classes are first initialized:
+dnl
+dnl The main loop macro m4_all_classes_loop is called to generate
+dnl code for all the required classes.
+m4_define(`m4_all_code', `dnl
+m4_ifelse(m4_class_initialized, `false', `m4_initialize_all')`'dnl
+m4_pre_all_classes_code`'dnl
+m4_all_classes_code(1)`'dnl
+')
diff --git a/interfaces/ppl_interface_generator_common_dat.m4 b/interfaces/ppl_interface_generator_common_dat.m4
new file mode 100644
index 0000000..d887eb8
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_dat.m4
@@ -0,0 +1,1006 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - processing the class list in ppl_interface_instantiations.m4;
+dnl - the control of the procedures to be generated for each class;
+dnl - the replacements for the patterns in the code files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Classes to be implemented and C++ versions of these classes.
+dnl If generating the documentation, the instantiations are fixed and defined locally.
+m4_ifdef(`m4_configuration_independent', `',
+ `m4_include(ppl_interface_instantiations.m4)')
+
+dnl =====================================================================
+dnl ===== The first set of macros here initialise the class names =====
+dnl ===== using "@" separated lists and defined =====
+dnl ===== by macros in ppl_interface_instantiations.m4. =====
+dnl =====================================================================
+
+
+dnl m4_init_class_definitions
+dnl
+dnl Macro called by m4_all_code in m4_interface_generators_common.m4
+dnl
+dnl For all the classes required by the configuration and specified
+dnl by m4_interface_classes_names and m4_cplusplus_classes_names
+dnl in <build_dir>/interfaces/m4_interface_instantiations.m4
+dnl this defines macros for their interface and cplusplus names,
+dnl their components and 'entities' related to these components.
+dnl
+dnl The Boolean flag m4_class_definitions_initialized is set to true
+dnl to avoid repeated generation when more than one set of code is
+dnl generated for any one file.
+m4_define(`m4_init_class_definitions', `dnl
+m4_init_interface_classes(m4_interface_classes_names)`'dnl
+m4_init_cplusplus_classes(m4_cplusplus_classes_names)`'dnl
+')
+dnl ---------------------------------------------------------------------
+dnl ===== any extra macros needed for both interfaces and =====
+dnl ===== cplusplus names go here . =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_prefix_polyhedron(Class, String)
+dnl
+dnl Every occurrence of Polyhedron in the name is replaced by
+dnl String_Polyhedron.
+m4_define(`m4_prefix_polyhedron', `dnl
+m4_patsubst($1, Polyhedron, $2_Polyhedron)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl ===== Macros for m4_interface_class<class_num> are defined =====
+dnl ===== here. =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_interface_classes(Class_List)
+dnl
+dnl Parses the @-separated list of class names Class_List
+dnl for the names of the classes used to form the names of procedures
+dnl in the user interface.
+m4_define(`m4_init_interface_classes', `dnl
+m4_init_interface_classes_aux(1, $1)')
+
+dnl m4_init_interface_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class_List - is a tail part of the input list of interface
+dnl class names.
+dnl The macro also defines m4_num_classes to be the number of classes
+dnl in the full list (ie counter + number in the current list - 1).
+dnl The macro calls m4_init_interface_names to define the next
+dnl interface names and then to to call this macro to recursively
+dnl process the rest of the list.
+m4_define(`m4_init_interface_classes_aux', `dnl
+m4_ifelse($2, `', `m4_define(m4_num_classes, m4_decr($1))',
+ m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+ `m4_init_interface_names($1, \1, \2)'))`'dnl
+')
+
+dnl m4_init_interface_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class - is the interface class name, as input;
+dnl Class_List - is a tail part of the input list of interface
+dnl class names.
+m4_define(`m4_init_interface_names', `dnl
+m4_define(m4_interface_class`'$1, $2)`'dnl
+m4_init_interface_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl ===== Macros for m4_cplusplus_class<class_num> and =====
+dnl ===== its components are defined here. =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_cplusplus_classes(Class_List)
+dnl
+dnl Parses the "@"-separated list of class names Class_List
+dnl to be used in the C++ code implementing the interface procedures.
+dnl Note that first the "," is replaced by |COMMA| using the macro
+dnl m4_subst_comma because the ',' in the product class is wrongly
+dnl parsed by m4.
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined and then the components are parsed and their entities
+dnl defined by additional macros.
+m4_define(`m4_init_cplusplus_classes', `dnl
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined.
+m4_init_cplusplus_classes_aux(1, m4_subst_comma($@))`'dnl
+dnl Then the components are parsed and their entities are
+dnl defined by additional macros.
+m4_init_all_cplusplus_class_components(1)`'dnl
+')
+
+dnl m4_subst_comma(String1, String2,...)
+dnl
+dnl String1, String2,... is the "@"-separated list of C++ class names
+dnl provided by the configuration.
+dnl As the product classes have their arguments ","-separated,
+dnl the "," separates the list into macro arguments.
+dnl This macro iterates through these macro arguments, replacing the
+dnl "," by |COMMA| so that the C++ names are handled as intended.
+m4_define(`m4_subst_comma',
+`m4_ifelse($#, 0, , $#, 1, $1,
+ `$1`'COMMA`'m4_subst_comma(m4_shift($@))')')
+
+dnl m4_init_cplusplus_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class_List - is a tail part of the input list of cplusplus
+dnl class names.
+dnl The macro calls m4_init_cplusplus_names to define the
+dnl cplusplus names (which calls this macro recursively).
+dnl The COMMA pattern is revised to |COMMA| as soon as a class name
+dnl has been separated from the @-separated list of classes.
+m4_define(`m4_init_cplusplus_classes_aux', `dnl
+m4_ifelse($2, `', `',
+ m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+ `m4_init_cplusplus_names(`$1',
+ m4_patsubst(\1, COMMA, |COMMA|), `\2')'))`'dnl
+')
+
+dnl m4_init_cplusplus_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class - is the cplusplus class name, as input;
+dnl Class_List - is a tail part of the input list of cplusplus
+dnl class names.
+dnl This defines m4_cplusplus_class`'Class_Counter
+dnl and then calls m4_init_cplusplus_classes_aux to process the rest
+dnl of the list of classes.
+m4_define(`m4_init_cplusplus_names', `dnl
+m4_define(m4_cplusplus_class`'$1, `$2')`'dnl
+m4_init_cplusplus_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl m4_init_all_cplusplus_class_components(Class_Counter)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl
+dnl For each class, this parses the name, finding and defining
+dnl schemas for its class kind and group.
+dnl For classes that have a sub-component "<...>" part
+dnl this also parses and defines macros for these components.
+m4_define(`m4_init_all_cplusplus_class_components', `dnl
+m4_init_cplusplus_class_components($1, m4_cplusplus_class`'$1, class)`'dnl
+m4_ifelse($1, m4_num_classes, ,
+ `m4_init_all_cplusplus_class_components(m4_incr($1))')`'dnl
+')
+
+dnl m4_init_cplusplus_class_components(Class_Counter,
+dnl String, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Class - is the cplusplus class name, as input;
+dnl Macro_Specifier
+dnl - is the component of the macro name that
+dnl determines the precise component it refers to.
+dnl
+dnl Initially (at the top level), the Macro_Specifier is just "class".
+dnl For each component in the name the string "_body" is added.
+dnl Thus for Pointset_Powerset<BD_Shape<long> > with Class_Counter = 4
+dnl and interface names Pointset_Powerset_BD_Shape_long
+dnl with BD_Shape_long defined for the component:
+dnl
+dnl m4_cplusplus_class4 = Pointset_Powerset<BD_Shape<long> >
+dnl m4_interface_class4 = Pointset_Powerset_BD_Shape_long
+dnl m4_class_kind4 = Pointset_Powerset
+dnl m4_class_group4 = pointset_powerset
+dnl m4_class_body_body4 = BD_Shape<long>
+dnl m4_cplusplus_class_body4 = BD_Shape<long>
+dnl m4_interface_class_body4 = BD_Shape_long
+dnl m4_class_body_kind4 = BD_Shape
+dnl m4_class_body_group4 = bd_shape
+dnl m4_class_body_body4 = long
+dnl
+dnl For the Product classes, the body is parsed into a "1st"
+dnl and "2nd" component:
+dnl Thus for Direct_Product<Grid,BD_Shape<long> > with Class_Counter = 5
+dnl and interface names Product_BD_Shape_long
+dnl with Grid and BD_Shape_long for the components:
+dnl m4_cplusplus_class5 = Direct_Product<Grid|COMMA|BD_Shape<long> >
+dnl m4_interface_class5 = Direct_Product_Grid_BD_Shape_long
+dnl m4_class_kind5 = Direct_Product
+dnl m4_class_group5 = product
+dnl m4_class_body5 = Grid|COMMA|BD_Shape<long>
+dnl m4_class_body_1st5 = Grid
+dnl m4_cplusplus_class_body_1st5 = Grid
+dnl m4_interface_class_body_1st5 = Grid
+dnl m4_class_body_1st_kind5 = Grid
+dnl m4_class_body_1st_group5 = grid
+dnl m4_class_body_2nd5 = BD_Shape<long>
+dnl m4_cplusplus_class_body_2nd5 = BD_Shape<long>
+dnl m4_interface_class_body_2nd5 = BD_Shape_long
+dnl m4_class_body_2nd_kind5 = BD_Shape
+dnl m4_class_body_2nd_group5 = bd_shape
+dnl m4_class_body_2nd_body5 = long
+dnl
+m4_define(`m4_init_cplusplus_class_components', `dnl
+m4_get_kind($1, $2, $3)`'dnl
+m4_get_group($1, $3)`'dnl
+m4_get_body($1, $2, $3)`'dnl
+m4_get_counter($1, $2, $3)`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, pointset_powerset,
+ `m4_parse_body_for_powerset($1, $3)')`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, product,
+ `m4_parse_body_for_product($1, $3)')`'dnl
+dnl
+')
+
+dnl m4_get_kind(Class_Counter, String, Macro_Specifier)
+dnl m4_get_body(Class_Counter, String, Macro_Specifier)
+dnl m4_get_group(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl String - a cplusplus class name.
+dnl Macro_Specifier
+dnl - is the component of the macro name that
+dnl determines the precise component it refers to.
+dnl
+dnl The head (Macro_Specifier_kind) and the body of
+dnl the C++ class name in String are separated out.
+dnl m4_Macro_Specifier_kind`'Class_Counter = the first part before the "<"
+dnl m4_Macro_Specifier_body`'Class_Counter = the rest
+dnl and m4_Macro_Specifier_body`'Class_Counter defines the group to which this
+dnl class belongs.
+dnl
+dnl For example:
+dnl If Macro_Specifier = class, String = Polyhedron and Class_Counter = 1
+dnl m4_class_kind1 => `Polyhedron'
+dnl m4_class_body1 => `'
+dnl If String = Pointset_Powerset<BD_Shape<signed char> >
+dnl and Class_Counter = 2
+dnl m4_class_kind2 => `Pointset_Powerset'
+dnl m4_class_body2 => `BD_Shape<signed char>'
+dnl m4_class_group2 => `pointset_powerset'
+m4_define(`m4_get_body',
+ `m4_define(m4_$3_body`'$1,
+ m4_ifelse($2, `', ,
+ m4_index(`$2', <), -1, `',
+ m4_regexp(`$2', `[^ <]+[<]\(.*\w>?\)[ ]*[>]', `\1')))`'dnl
+')
+
+m4_define(`m4_get_kind',
+ `m4_define(m4_$3_kind`'$1,
+ `m4_ifelse($2, `', ,
+ m4_index($2, <), -1, m4_remove_topology($2),
+ m4_regexp($2, `\([^ <]+\)[.]*', `\1'))')`'dnl
+')
+
+m4_define(`m4_get_counter',
+ `m4_define(m4_$3_counter`'$1,
+ m4_ifelse($2, `', ,
+ m4_get_class_counter($2)))`'dnl
+')
+
+m4_define(`m4_get_group',
+ `m4_define(m4_$2_group`'$1, `')`'dnl
+m4_get_group_aux($1, $2, m4_class_groups)`'dnl
+')
+
+m4_define(`m4_get_group_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, , $#, 3,
+ m4_get_group_aux2($1, $2, $3, m4_$3_group),
+ `m4_ifelse(m4_get_group_aux2($1, $2, $3, m4_$3_group), 0,
+ `m4_get_group_aux($1, $2, m4_shift(m4_shift(m4_shift($@))))')')`'dnl
+')
+
+m4_define(`m4_get_group_aux2', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, 0, $#, 3, 0, $#, 4,
+ `m4_ifelse(`$4', m4_$2_kind$1,
+ `m4_define(m4_$2_group`'$1, `$3')', 0)',
+ `m4_ifelse(`$4', m4_$2_kind$1,
+ `m4_define(m4_$2_group`'$1, `$3')',
+ m4_get_group_aux2($1, $2, $3,
+ m4_shift(m4_shift(m4_shift(m4_shift($@))))))')`'dnl
+')
+
+
+dnl m4_get_class_counter(String)
+dnl
+dnl String - a cplusplus class name.
+dnl
+dnl This finds the class counter from the cpp name.
+m4_define(`m4_get_class_counter', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_remove_topology($1),
+ m4_echo_unquoted(m4_cplusplus_class`'m4_ind),
+ m4_ind)`'dnl
+')`'dnl
+')
+
+dnl m4_get_interface_name_counter(String)
+dnl
+dnl String - an interface class name.
+dnl
+dnl This finds the class counter from the interface name.
+m4_define(`m4_get_interface_name_counter', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_remove_topology($1),
+ m4_echo_unquoted(m4_interface_class`'m4_ind),
+ m4_ind)`'dnl
+')`'dnl
+')
+
+dnl m4_parse_body_for_powerset(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl - is the component of the macro name that
+dnl determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_powerset', `dnl
+m4_define(`m4_interface_$2_body$1',
+ m4_interface_class`'m4_get_class_counter(m4_$2_body$1))`'dnl
+m4_define(`m4_cplusplus_$2_body$1', m4_$2_body$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body$1, $2_body)`'dnl
+')
+
+dnl m4_parse_body_for_product(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl - is the component of the macro name that
+dnl determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_product', `dnl
+m4_define(`m4_$2_body_1st$1',
+ `m4_regexp(m4_$2_body$1, `\([^|]*\).*', `\1')')`'dnl
+m4_define(`m4_$2_body_2nd$1',
+ `m4_regexp(m4_$2_body$1, `\([^@]*\)|COMMA|\(.*\)', `\2')')`'dnl
+m4_define(`m4_interface_$2_body_1st$1',
+ m4_interface_class`'m4_get_class_counter(m4_$2_body_1st$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_1st$1', m4_$2_body_1st$1)`'dnl
+m4_define(`m4_interface_$2_body_2nd$1',
+ m4_interface_class`'m4_get_class_counter(m4_$2_body_2nd$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_2nd$1', m4_$2_body_2nd$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_1st$1, $2_body_1st)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_2nd$1, $2_body_2nd)`'dnl
+')
+
+dnl m4_get_class_topology(Class)
+dnl
+dnl expands to the empty string unless the class is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "C_" or "NNC_" respectively.
+m4_define(`m4_get_class_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, C_,
+m4_index($1, NNC_), 0, NNC_)`'dnl
+')
+
+dnl m4_remove_topology(Class_Name)
+dnl
+dnl expands to the class name unless it is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "Polyhedron".
+m4_define(`m4_remove_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, Polyhedron,
+ m4_index($1, NNC_), 0, Polyhedron, $1)`'dnl
+')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the groups used to =====
+dnl ===== specify to which classes the schematic procedures apply; =====
+dnl ===== see ppl_interface_generators_common_procedure_list.m4 =====
+dnl ===== and <interface>/ppl_interface_generators_<interface>_dat.m4 ===
+dnl =====================================================================
+
+dnl m4_group_names expands to all the group names.
+dnl
+dnl Each group_name in the expansion should
+dnl have a corresponding definition for
+dnl "m4_`'group_name`'_group
+dnl which must be defined as a (comma separated) list of class kinds.
+dnl
+dnl If more groups are wanted, then these must be added to this list.
+dnl and the list of class_kinds they include be defined.
+dnl If a group_name occurs in the extra text preceded by a - after
+dnl a procedure name, then no code for any classes in that group is generated.
+dnl Conversely, if a group_name preceded by a + occurs in the extra text after
+dnl a procedure name, then code for those classes in that group that are
+dnl not covered by a - is generated.
+dnl
+dnl More formally, if the extra text for a procedure includes
+dnl +g1 +g2 ''' +gm and -h1 -h2 ... -hn
+dnl where g1,g2, ..., gm and h1, h2, ..., hn are group names,
+dnl then the actual class kinds that code will be generated for
+dnl will be determined using set difference "\":
+dnl (m4_g1_group union m4_g2_group union ... union m4_gm_group)\
+dnl (m4_h1_group union m4_h2_group union ... union m4_hn_group)
+dnl
+dnl That is: in case of conflict between the + and - groups,
+dnl the - takes precedence over the +;
+dnl all class kinds for group_names preceded by - are filtered away.
+dnl For instance, with:
+dnl "+shape -bd_shape"
+dnl following a procedure name, only code (for that procedure)
+dnl for the Polyhedron and Octagonal_Shape class will be generated.
+m4_define(`m4_group_names', `dnl
+all,
+simple_pps,
+simple,
+shape,
+wr_shape,
+polyhedron,
+grid,
+bd_shape,
+octagonal_shape,
+box,
+pointset_powerset,
+product')
+
+dnl A sublist of the same groups whose elements are disjoint.
+dnl These are used to define the m4_class_group`'class_index
+dnl which is used for the "pattern" replacements (see below).
+m4_define(`m4_class_groups', `dnl
+polyhedron,
+grid,
+wr_shape,
+box,
+pointset_powerset,
+product')
+
+m4_define(`m4_all_group',
+ `Polyhedron, Grid, BD_Shape, Octagonal_Shape, m4_box_group,
+ Pointset_Powerset, m4_product_group')
+m4_define(`m4_simple_pps_group', `m4_simple_group, Pointset_Powerset')
+m4_define(`m4_simple_group', `Grid, m4_shape_group')
+m4_define(`m4_shape_group', `Polyhedron, m4_wr_shape_group, m4_box_group')
+m4_define(`m4_wr_shape_group', `BD_Shape, Octagonal_Shape')
+m4_define(`m4_polyhedron_group', Polyhedron)
+m4_define(`m4_grid_group', Grid)
+m4_define(`m4_bd_shape_group', BD_Shape)
+m4_define(`m4_octagonal_shape_group', Octagonal_Shape)
+m4_define(`m4_box_group',
+ `Rational_Box, Z_Box, Float_Box, Double_Box, Long_Double_Box,
+ Int8_Box, Int16_Box, Int32_Box, Int64_Box,
+ Uint8_Box, Uint16_Box, Uint32_Box, Uint64_Box')
+m4_define(`m4_pointset_powerset_group', Pointset_Powerset)
+m4_define(`m4_product_group',
+ `Direct_Product, Smash_Product, Constraints_Product,
+ Shape_Preserving_Product')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the replacements =====
+dnl ===== for the patterns used =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl First the list of patterns. Note that the order is important.
+dnl ---------------------------------------------------------------------
+
+dnl m4_pattern_list
+dnl
+dnl Returns a list of patterns (in lowercase) used for the generation
+dnl of procedure names and code schemas.
+dnl This is no longer used as a macro but is a list of all patterns.
+m4_define(`m4_pattern_list', `dnl
+class,
+topology,
+friend,
+build_represent,
+dimension,
+relation_represent,
+class_represent,
+has_property,
+simplify,
+abovebelow,
+upperlower,
+maxmin,
+comparison,
+refine_represent,
+binop,
+ub_exact,
+affimage,
+embedproject,
+membytes,
+widen,
+limitedbounded,
+widenexpn,
+extrapolation,
+beginend,
+incdec,
+partition,
+disjunct_widen,
+recycle,
+cpp_class,
+generator,
+point,
+constrainer,
+disjunct,
+disjunct_topology,
+disjunct_extrapolation,
+termination_id')
+
+dnl ---------------------------------------------------------------------
+dnl Define the replacement macros for all patterns
+dnl ---------------------------------------------------------------------
+
+dnl m4_class_pattern_replacement(Class_Counter, Pattern, Replacement_Id)
+dnl
+dnl Class_Counter: counter of class for which we want the replacements.
+dnl Pattern: pattern to be replaced (lower-case);
+dnl Replacement_Id: Can be the empty string, `a_' or `b_'
+dnl depending on the required group of replacements.
+dnl
+dnl To find any sequence of replacements the macro
+dnl "m4_replace_one_pattern_in_string"
+dnl defined in "m4_interface_generators_common.m4"
+dnl calls this macro.
+dnl
+m4_define(`m4_class_pattern_replacements', `dnl
+ m4_ifdef(m4_`'m4_class_kind$1`'_$3$2_replacements,
+ m4_`'m4_class_kind$1`'_$3$2_replacements($1),
+ `m4_ifdef(m4_`'m4_class_group$1`'_$3$2_replacements,
+ m4_`'m4_class_group$1`'_$3$2_replacements($1),
+ `m4_ifdef(`m4_$3$2_replacements',
+ `m4_$3$2_replacements($1)')')')`'dnl
+')
+
+dnl =====================================================================
+dnl ===== Define the individual replacements for each pattern =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl pattern == class
+dnl The class being generated
+dnl ---------------------------------------------------------------------
+
+dnl The interface class name.
+m4_define(`m4_class_replacements', m4_interface_class`'$1)
+
+dnl The cplusplus name.
+m4_define(`m4_cpp_class_replacements', m4_cplusplus_class`'$1)
+
+dnl The product full cplusplus name.
+m4_define(`m4_product_cpp_class_replacements',
+ Domain_Product<`'m4_class_body_1st$1|COMMA|`'m4_class_body_2nd$1 >::`'m4_class_kind$1)
+
+dnl The defined cplusplus name (the default is as before).
+dnl This is only used in the C interface.
+m4_define(`m4_cppdef_class_replacements', m4_cplusplus_class`'$1)
+
+dnl The defined product cplusplus name.
+m4_define(`m4_product_cppdef_class_replacements',
+m4_interface_class`'$1)
+
+dnl The defined box cplusplus name.
+m4_define(`m4_box_cppdef_class_replacements',
+m4_interface_class`'$1)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == friend
+dnl A class can be built from any other class named as a "friend".
+dnl A friend must be one of the classes named in the instantiations
+dnl ---------------------------------------------------------------------
+
+dnl The friend class name.
+dnl There is the interface name as default friend,
+dnl the interface name but where "Polyhedron" does not include
+dnl the topology (a_friend), and the C++ name (b_friend).
+dnl
+dnl To allow for other classes to be friends,
+dnl we cannot just take a predefined list of friends as some
+dnl may not be instantiated and available.
+m4_define(`m4_friend_replacements', `m4_all_friends(interface)')
+
+m4_define(`m4_a_friend_replacements', `dnl
+m4_all_friends(interface, no_topology)`'dnl
+')
+
+m4_define(`m4_b_friend_replacements',`m4_all_friends(cplusplus)')
+
+m4_define(`m4_all_friends', `dnl
+m4_patsubst(m4_all_friends_aux($1, $2), `|COMMA|', `, ')`'dnl
+')
+m4_define(`m4_all_friends_aux', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_echo_unquoted(m4_class_kind`'m4_ind), Pointset_Powerset, ,
+m4_echo_unquoted(m4_class_group`'m4_ind), product, , `dnl
+m4_define(`m4_friend_class', m4_`'$1`'_class`'m4_ind)`'dnl
+m4_ifelse(m4_friend_class, Polyhedron,
+ `m4_ifelse($2, `',
+ `m4_one_friend(C_`'m4_friend_class|COMMA|NNC_`'m4_friend_class)',
+ `m4_one_friend(m4_friend_class|COMMA|m4_friend_class)')',
+ `m4_one_friend(m4_friend_class)')`'dnl
+m4_undefine(`m4_friend_class')')')`'dnl
+')
+
+m4_define(`m4_one_friend', `dnl
+m4_ifelse(m4_ind, 1, `$1', |COMMA|`'$1)`'dnl
+')
+
+dnl For Pointset_Powerset class kind, if the body is C_Polyhedron
+dnl or NNC_Polyhedron, and Polyhedron is generated, then C_Polyhedron
+dnl (if the body is C_Polyhedron) or NNC_Polyhedron
+dnl (if the body is NNC_Polyhedron) is a friend.
+dnl
+m4_define(`m4_Pointset_Powerset_friend_replacements', `dnl
+dnl
+m4_interface_class$1,
+m4_get_class_topology(m4_cplusplus_class_body$1)`'dnl
+m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_a_friend_replacements', `dnl
+dnl
+m4_interface_class$1, m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_b_friend_replacements', `dnl
+dnl
+m4_cplusplus_class$1, m4_cplusplus_class_body$1`'dnl
+')
+
+dnl For product class kinds, C_Polyhedron, NNC_Polyhedron, BD_Shape,
+dnl Octagonal_Shape and other products are all friends.
+dnl
+m4_define(`m4_product_friend_replacements',
+ `m4_all_friends(interface), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_a_friend_replacements',
+ `m4_all_friends(interface, no_topology), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_b_friend_replacements',
+ `m4_all_friends(cplusplus),
+ Domain_Product<`'m4_cplusplus_class_body_1st$1`'|COMMA|`'m4_cplusplus_class_body_2nd$1`' >::`'m4_class_kind$1')
+)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == topology or intopology
+dnl This is C_ or NNC_ if the class is Polyhedron and `' otherwise
+dnl ---------------------------------------------------------------------
+
+dnl The topology of the domain element. The default is the empty string.
+m4_define(`m4_topology_replacements', `')
+m4_define(`m4_Polyhedron_topology_replacements', `C_, NNC_')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widen
+dnl ---------------------------------------------------------------------
+dnl The widening operators.
+m4_define(`m4_widen_replacements', `')
+m4_define(`m4_Polyhedron_widen_replacements', `BHRZ03, H79')
+m4_define(`m4_Grid_widen_replacements', `congruence, generator')
+m4_define(`m4_BD_Shape_widen_replacements', `BHMZ05, H79')
+m4_define(`m4_Octagonal_Shape_widen_replacements', `BHMZ05')
+m4_define(`m4_box_widen_replacements', `CC76')
+m4_define(`m4_Pointset_Powerset_widen_replacements', `BHZ03')
+dnl The a replacement defines the certificates for the widenings
+m4_define(`m4_Polyhedron_a_widen_replacements', `BHRZ03, H79')
+m4_define(`m4_BD_Shape_a_widen_replacements', `H79, H79')
+m4_define(`m4_Octagonal_Shape_a_widen_replacements', `H79')
+m4_define(`m4_Grid_a_widen_replacements', `Grid, Grid')
+dnl FIXME: This is not in the C++ box domain and will fail if used.
+m4_define(`m4_box_a_widen_replacements', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == extrapolation
+dnl ---------------------------------------------------------------------
+m4_define(`m4_extrapolation_replacements', `NONE')
+m4_define(`m4_BD_Shape_extrapolation_replacements',
+ `CC76')
+m4_define(`m4_Octagonal_Shape_extrapolation_replacements',
+ `CC76')
+m4_define(`m4_box_extrapolation_replacements',
+ `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widenexp
+dnl The limited/bounded extrapolation operators.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_widenexpn_replacements', `m4_widen_replacements')
+m4_define(`m4_Polyhedron_widenexpn_replacements',
+ `m4_Polyhedron_widen_replacements')
+m4_define(`m4_Grid_widenexpn_replacements', `m4_Grid_widen_replacements')
+m4_define(`m4_BD_Shape_widenexpn_replacements',
+ `m4_BD_Shape_widen_replacements,
+ m4_BD_Shape_extrapolation_replacements')
+m4_define(`m4_Octagonal_Shape_widenexpn_replacements',
+ `m4_Octagonal_Shape_widen_replacements,
+ m4_Octagonal_Shape_extrapolation_replacements')
+m4_define(`m4_box_widenexpn_replacements', `m4_box_widen_replacements')
+m4_define(`m4_Pointset_Powerset_widenexpn_replacements',
+ `m4_Pointset_Powerset_widen_replacements')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == narrow
+dnl ---------------------------------------------------------------------
+m4_define(`m4_narrow_replacements', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == limitedbounded
+dnl limited/bounded are qualifiers for widening and extrapolation
+dnl operations.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_limitedbounded_replacements', `limited')
+m4_define(`m4_Polyhedron_limitedbounded_replacements', `limited, bounded')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == dimension
+dnl ---------------------------------------------------------------------
+m4_define(`m4_dimension_replacements', `space_dimension, affine_dimension')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == generator
+dnl The different kinds of objects use to generate a class.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_generator_replacements', `generator')
+m4_define(`m4_Grid_generator_replacements', `grid_generator')
+
+dnl The different kinds of points.
+m4_define(`m4_point_replacements', `point')
+m4_define(`m4_Grid_point_replacements', `grid_point')
+
+dnl The constrainer objects used to describe a class.
+m4_define(`m4_constrainer_replacements', `constraint')
+m4_define(`m4_Grid_constrainer_replacements', `congruence')
+m4_define(`m4_Pointset_Powerset_constrainer_replacements',
+ `m4_class_pattern_replacements(m4_class_body_counter$1,
+ constrainer, `')')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct
+dnl The different kinds of objects that are elements of a Pointset_Powerset.
+dnl ---------------------------------------------------------------------
+
+dnl If the interface disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_disjunct_replacements', `')
+m4_define(`m4_Pointset_Powerset_disjunct_replacements',
+ `m4_remove_topology(m4_interface_class_body$1)')
+
+dnl If the cplusplus disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_a_disjunct_replacements',
+ `m4_remove_topology(m4_cplusplus_class_body$1)')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_topology
+dnl The topology of the disjunct of the current class
+dnl If the class is not Pointset_Powerset, it is `'.
+dnl ---------------------------------------------------------------------
+dnl The disjunct topology replacement.
+m4_define(`m4_disjunct_topology_replacements',
+ `m4_get_class_topology(m4_cplusplus_class_body$1)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_widen
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_widen_replacements',
+ `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_widen_replacements)')
+
+m4_define(`m4_a_disjunct_widen_replacements',
+ `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_a_widen_replacements)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_extrapolation
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_extrapolation_replacements',
+ `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_extrapolation_replacements)')
+
+m4_define(`m4_a_disjunct_extrapolation_replacements',
+ `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_a_extrapolation_replacements)')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == relation_represent
+dnl The different kinds of objects that can have a relation with a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_relation_represent_replacements',
+ `constraint, generator, congruence')
+m4_define(`m4_Grid_relation_represent_replacements',
+ `m4_relation_represent_replacements, grid_generator')
+
+dnl The type of these relations with a class.
+m4_define(`m4_a_relation_represent_replacements', `con, gen, con')
+m4_define(`m4_Grid_a_relation_represent_replacements',
+ `con, gen, con, gen')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == build_represent
+dnl The different kinds of objects that can build a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_build_represent_replacements',
+ `constraint, congruence, generator')
+m4_define(`m4_Grid_build_represent_replacements',
+ `constraint, congruence, grid_generator')
+m4_define(`m4_Pointset_Powerset_build_represent_replacements',
+ `constraint, congruence')
+m4_define(`m4_product_build_represent_replacements',
+ `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == class_represent
+dnl The different kinds of geometric descriptors that can be added to
+dnl a class or we can get from a class.
+dnl Note that a class can be built from generators when the add and get
+dnl can only use constraints or congruences (eg BD_Shape).
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_class_represent_replacements', `constraint, congruence')
+m4_define(`m4_Polyhedron_class_represent_replacements',
+ `m4_class_represent_replacements, generator')
+m4_define(`m4_Grid_class_represent_replacements',
+ `m4_class_represent_replacements, grid_generator')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == refine_represent
+dnl The different kinds of objects that can refine a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_refine_represent_replacements', `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == recycle_represent
+dnl The recycling argument which is only needed for the Polyhedron
+dnl or Grid class in the C interface.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_recycle_replacements', `')
+m4_define(`m4_Polyhedron_recycle_replacements',
+ `|COMMA| Recycle_Input()')
+m4_define(`m4_Grid_recycle_replacements',
+ `|COMMA| Recycle_Input()')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == partition
+dnl The "partition" is replaced by "NONE" if the powerset is not
+dnl in the list of instantiations; in which case
+dnl no code is generated, otherwise it is replaced by partition.
+dnl This is used for the linear_partition and approximate_partition only.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_partition_replacements',
+ `m4_ifelse(m4_get_interface_name_counter(`Pointset_Powerset_NNC_Polyhedron'),
+ `', NONE, ``partition'')')
+m4_define(`m4_Grid_partition_replacements',
+ `m4_ifelse(m4_get_interface_name_counter(`Pointset_Powerset_Grid'),
+ `', NONE, ``partition'')')
+m4_define(`m4_Pointset_Powerset_partition_replacements', `NONE')
+m4_define(`m4_Product_partition_replacements', `NONE')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == has_property
+dnl The unary "has_property" predicates check properties of the domains
+dnl The check "contains_integer_point" is not available for the
+dnl product domains.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_has_property_replacements', `is_empty, is_universe,
+ is_bounded, contains_integer_point, is_topologically_closed,
+ is_discrete')
+
+dnl For products, contains_integer_point is not yet implemented.
+m4_define(`m4_product_has_property_replacements', `dnl
+ is_empty, is_universe, is_bounded, is_topologically_closed, is_discrete')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == simplify
+dnl This just groups two methods that modify a domain element.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_simplify_replacements', `topological_closure_assign')
+m4_define(`m4_Pointset_Powerset_simplify_replacements', `dnl
+m4_simplify_replacements, pairwise_reduce, omega_reduce`'dnl
+')
+
+m4_define(`m4_product_simplify_replacements', `dnl
+m4_define(`m4_1st_sequence',
+ `m4_simplify_replacements')`'dnl
+m4_define(`m4_2nd_sequence',
+ `m4_class_pattern_replacements(m4_class_body_1st_counter$1,
+ simplify, `')')`'dnl
+m4_define(`m4_3rd_sequence',
+ `m4_class_pattern_replacements(m4_class_body_2nd_counter$1,
+ simplify, `')')`'dnl
+m4_define(`m4_num_of_sequences', 3)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_3rd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl pattern -- above/below
+dnl Used for the bounds_from_above and bounds_from_below methods.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_abovebelow_replacements', `above, below')
+
+dnl ---------------------------------------------------------------------
+dnl pattern -- upper/lower
+dnl Used for has_upper_bound and has_lower_bound methods (Box domains).
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_upperlower_replacements', `upper, lower')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == maxmin
+dnl Maximize or Minimize
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_maxmin_replacements', `maximize, minimize')
+
+dnl Embed or project
+m4_define(`m4_embedproject_replacements', `and_embed, and_project')
+
+dnl Affine_image or affine_preimage
+m4_define(`m4_affimage_replacements', `affine_image, affine_preimage')
+
+dnl One object can be contained, strictly contained or disjoint in the other.
+m4_define(`m4_comparison_replacements',
+ `contains, strictly_contains, is_disjoint_from')
+m4_define(`m4_Pointset_Powerset_comparison_replacements',
+ `m4_comparison_replacements,
+ geometrically_covers, geometrically_equals')
+
+dnl The different kinds of binary operators.
+m4_define(`m4_binop_replacements',
+ `intersection_assign, upper_bound_assign, difference_assign,
+ concatenate_assign, time_elapse_assign')
+m4_define(`m4_Polyhedron_binop_replacements',
+ `m4_binop_replacements, poly_hull_assign, poly_difference_assign')
+
+dnl The different kinds of "upper_bound_if_exact" binary operators.
+m4_define(`m4_ub_exact_replacements', `upper_bound_assign_if_exact')
+m4_define(`m4_Polyhedron_ub_exact_replacements',
+ `m4_ub_exact_replacements, poly_hull_assign_if_exact')
+
+dnl The iterators for the Powerset domains can increment or decrement
+m4_define(`m4_incdec_replacements', `increment, decrement')
+
+dnl The Java replacements for the increment/decrement operators.
+m4_define(`m4_a_incdec_replacements', `next, prev')
+
+dnl The C++ replacements for the increment/decrement operators.
+m4_define(`m4_b_incdec_replacements', `++, --')
+
+dnl The iterators for the Powerset domains have a begin and end iterator
+m4_define(`m4_beginend_replacements', `begin, end')
+
+dnl The total and external memory query methods for all the domains
+dnl and the size query to the pointset powerset domain.
+m4_define(`m4_membytes_replacements',
+ `external_memory_in_bytes, total_memory_in_bytes')
+m4_define(`m4_Pointset_Powerset_membytes_replacements',
+ `m4_membytes_replacements, size')
+
+dnl The termination algorithms are either sourced from MS or PR.
+m4_define(`m4_termination_id_replacements', `MS, PR')
+
+dnl If sourced from MS, the last argument is C_Polyhedron,
+dnl If sourced from PR, the last argument is NNC_Polyhedron.
+m4_define(`m4_a_termination_id_replacements', `C_, NNC_')
diff --git a/interfaces/ppl_interface_generator_common_procedure_generators.m4 b/interfaces/ppl_interface_generator_common_procedure_generators.m4
new file mode 100644
index 0000000..0d0d226
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_procedure_generators.m4
@@ -0,0 +1,140 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of the procedures generated
+dnl that are independent of the interface being generated.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl m4_procedure_list
+dnl This class using patterns wherever possible.
+dnl Which classes the schema applies to is determined by +/-group_name.
+dnl The group_names represent sets of PPL classes +group1 and -group2.
+dnl These are defined in ../ppl_interface_generator_common_dat.m4.
+dnl The actual classes the schema applies to is the set difference
+dnl +group1 \ -group2 where a missing +group1 or -group2 is
+dnl assumed to be the empty set.
+dnl For the pointset-powerset classes, the schema they apply to may also
+dnl depend on the disjunct. In this case, a schema with
+dnl "+pointset_powerset \group" will apply to any powerset
+dnl whose disjunct is not in "group".
+dnl Where "@CLASS@" is replaced by the class name, then that class only
+dnl is applicable for that schema.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_common_procedure_list', `dnl
+ppl_delete_ at CLASS@/1 *nofail +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2 +all,
+ppl_ at CLASS@_swap/2 *nofail +all,
+ppl_ at CLASS@_ at DIMENSION@/2 +all,
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3 +all,
+dnl
+dnl NOTE: The next two schemas are only for simple domains since
+dnl we can only "get" a meaningful system (such as a set of
+dnl constraints) that represents a domain from a simple domain.
+dnl
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s/2 +simple,
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s/2 +simple,
+ppl_ at CLASS@_ at HAS_PROPERTY@/1 +all,
+ppl_ at CLASS@_ at SIMPLIFY@/1 *nofail +all,
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2 +all,
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound/5 +box,
+ppl_ at CLASS@_ at MAXMIN@/5 +all,
+ppl_ at CLASS@_ at MAXMIN@_with_point/6 +all,
+ppl_ at CLASS@_frequency/6 +simple,
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2 +all,
+ppl_ at CLASS@_equals_ at CLASS@/2 +all,
+ppl_ at CLASS@_OK/1 +all,
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_ at BINOP@/2 *nofail +all,
+ppl_ at CLASS@_ at UB_EXACT@/2 +all,
+ppl_ at CLASS@_positive_time_elapse_assign/2 *nofail +polyhedron,
+ppl_ at CLASS@_simplify_using_context_assign/3 +simple_pps,
+ppl_ at CLASS@_constrains/2 +all,
+ppl_ at CLASS@_unconstrain_space_dimension/2 +all,
+ppl_ at CLASS@_unconstrain_space_dimensions/2 +all,
+ppl_ at CLASS@_ at AFFIMAGE@/4 *nofail +all,
+ppl_ at CLASS@_bounded_ at AFFIMAGE@/5 *nofail +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@/5 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence/6 +grid,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence/5 +grid,
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2 *nofail +all,
+ppl_ at CLASS@_remove_space_dimensions/2 +all,
+ppl_ at CLASS@_remove_higher_space_dimensions/2 *nofail +all,
+ppl_ at CLASS@_expand_space_dimension/3 *nofail +all,
+ppl_ at CLASS@_fold_space_dimensions/3 +all,
+ppl_ at CLASS@_map_space_dimensions/2 +all,
+ppl_ at CLASS@_drop_some_non_integer_points/2 +all,
+ppl_ at CLASS@_drop_some_non_integer_points_2/3 +all,
+ppl_ at CLASS@_ascii_dump/1 +all,
+ppl_ at CLASS@_ at MEMBYTES@/2 +all,
+dnl
+dnl NOTE: The next few schemas provide special widenings and
+dnl extrapolations that depend on the domains.
+dnl
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4 +simple,
+ppl_ at CLASS@_ at WIDEN@_widening_assign/2 *nofail +simple,
+dnl
+dnl FIXME: We do not have a default widening for the
+dnl pointset_powerset domain.
+dnl
+ppl_ at CLASS@_widening_assign_with_tokens/4 +simple +product,
+ppl_ at CLASS@_widening_assign/2 *nofail +simple +product,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5 +simple,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3 *nofail +simple,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4 +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2 *nofail +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2 +shape_group,
+dnl
+dnl NOTE: The next few schemas provide procedures specifically for
+dnl the pointset_powerset domains.
+dnl
+ppl_new_ at CLASS@_iterator_from_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_ at BEGINEND@_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_iterator_equals_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_ at INCDEC@_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_get_disjunct/2 +pointset_powerset,
+ppl_delete_ at CLASS@_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_add_disjunct/2 *nofail +pointset_powerset,
+ppl_ at CLASS@_drop_disjunct/2 +pointset_powerset,
+ppl_ at CLASS@_drop_disjuncts/3 +pointset_powerset,
+ppl_ at CLASS@_linear_ at PARTITION@/4 +simple -grid,
+ppl_ at CLASS@_approximate_ at PARTITION@/5 +grid,
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2 +pointset_powerset \box,
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3 +pointset_powerset \box,
+dnl
+dnl CHECKME: This is not implemented.
+dnl
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3 -pointset_powerset,
+ppl_ at CLASS@_wrap_assign/8 +simple,
+
+')
diff --git a/interfaces/ppl_interface_generator_copyright b/interfaces/ppl_interface_generator_copyright
new file mode 100644
index 0000000..ec4176b
--- /dev/null
+++ b/interfaces/ppl_interface_generator_copyright
@@ -0,0 +1,21 @@
+` Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . 'dnl
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100755
index 0000000..63ae69d
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,9655 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING. If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+# --config show all configuration variables
+# --debug enable verbose shell tracing
+# -n, --dry-run display commands without modifying any files
+# --features display basic configuration information and exit
+# --mode=MODE use operation mode MODE
+# --preserve-dup-deps don't remove duplicate dependency libraries
+# --quiet, --silent don't print informational messages
+# --no-quiet, --no-silent
+# print informational messages (default)
+# --no-warn don't display warning messages
+# --tag=TAG use configuration variables from tag TAG
+# -v, --verbose print more informational messages than default
+# --no-verbose don't print the extra informational messages
+# --version print version information
+# -h, --help, --help-all print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+# clean remove files from the build directory
+# compile compile a source file into a libtool object
+# execute automatically set library path, then run a program
+# finish complete the installation of libtool libraries
+# install install libraries or executables
+# link create a library or an executable
+# uninstall remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE. When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+# host-triplet: $host
+# shell: $SHELL
+# compiler: $LTCC
+# compiler flags: $LTCFLAGS
+# linker: $LD (gnu? $with_gnu_ld)
+# $progname: (GNU libtool) 2.4.2
+# automake: $automake_version
+# autoconf: $autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4.2
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+ eval "if test \"\${$lt_var+set}\" = set; then
+ save_$lt_var=\$$lt_var
+ $lt_var=C
+ export $lt_var
+ lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+ lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+ fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" $lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE. If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+ func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+ if test "X$func_dirname_result" = "X${1}"; then
+ func_dirname_result="${3}"
+ else
+ func_dirname_result="$func_dirname_result${2}"
+ fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+ func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+# dirname: Compute the dirname of FILE. If nonempty,
+# add APPEND to the result, otherwise set result
+# to NONDIR_REPLACEMENT.
+# value returned in "$func_dirname_result"
+# basename: Compute filename of FILE.
+# value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+ # Extract subdirectory from the argument.
+ func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+ if test "X$func_dirname_result" = "X${1}"; then
+ func_dirname_result="${3}"
+ else
+ func_dirname_result="$func_dirname_result${2}"
+ fi
+ func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+ case ${2} in
+ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+ s@/\./@/@g
+ t dotsl
+ s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+# value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+ # Start from root dir and reassemble the path.
+ func_normal_abspath_result=
+ func_normal_abspath_tpath=$1
+ func_normal_abspath_altnamespace=
+ case $func_normal_abspath_tpath in
+ "")
+ # Empty path, that just means $cwd.
+ func_stripname '' '/' "`pwd`"
+ func_normal_abspath_result=$func_stripname_result
+ return
+ ;;
+ # The next three entries are used to spot a run of precisely
+ # two leading slashes without using negated character classes;
+ # we take advantage of case's first-match behaviour.
+ ///*)
+ # Unusual form of absolute path, do nothing.
+ ;;
+ //*)
+ # Not necessarily an ordinary path; POSIX reserves leading '//'
+ # and for example Cygwin uses it to access remote file shares
+ # over CIFS/SMB, so we conserve a leading double slash if found.
+ func_normal_abspath_altnamespace=/
+ ;;
+ /*)
+ # Absolute path, do nothing.
+ ;;
+ *)
+ # Relative path, prepend $cwd.
+ func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+ ;;
+ esac
+ # Cancel out all the simple stuff to save iterations. We also want
+ # the path to end with a slash for ease of parsing, so make sure
+ # there is one (and only one) here.
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+ while :; do
+ # Processed it all yet?
+ if test "$func_normal_abspath_tpath" = / ; then
+ # If we ascended to the root using ".." the result may be empty now.
+ if test -z "$func_normal_abspath_result" ; then
+ func_normal_abspath_result=/
+ fi
+ break
+ fi
+ func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$pathcar"`
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$pathcdr"`
+ # Figure out what to do with it
+ case $func_normal_abspath_tcomponent in
+ "")
+ # Trailing empty path component, ignore it.
+ ;;
+ ..)
+ # Parent dir; strip last assembled component from result.
+ func_dirname "$func_normal_abspath_result"
+ func_normal_abspath_result=$func_dirname_result
+ ;;
+ *)
+ # Actual path component, append it.
+ func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+ ;;
+ esac
+ done
+ # Restore leading double-slash if one was found on entry.
+ func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+# value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+ func_relative_path_result=
+ func_normal_abspath "$1"
+ func_relative_path_tlibdir=$func_normal_abspath_result
+ func_normal_abspath "$2"
+ func_relative_path_tbindir=$func_normal_abspath_result
+
+ # Ascend the tree starting from libdir
+ while :; do
+ # check if we have found a prefix of bindir
+ case $func_relative_path_tbindir in
+ $func_relative_path_tlibdir)
+ # found an exact match
+ func_relative_path_tcancelled=
+ break
+ ;;
+ $func_relative_path_tlibdir*)
+ # found a matching prefix
+ func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+ func_relative_path_tcancelled=$func_stripname_result
+ if test -z "$func_relative_path_result"; then
+ func_relative_path_result=.
+ fi
+ break
+ ;;
+ *)
+ func_dirname $func_relative_path_tlibdir
+ func_relative_path_tlibdir=${func_dirname_result}
+ if test "x$func_relative_path_tlibdir" = x ; then
+ # Have to descend all the way to the root!
+ func_relative_path_result=../$func_relative_path_result
+ func_relative_path_tcancelled=$func_relative_path_tbindir
+ break
+ fi
+ func_relative_path_result=../$func_relative_path_result
+ ;;
+ esac
+ done
+
+ # Now calculate path; take care to avoid doubling-up slashes.
+ func_stripname '' '/' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ func_stripname '/' '/' "$func_relative_path_tcancelled"
+ if test "x$func_stripname_result" != x ; then
+ func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+ fi
+
+ # Normalisation. If bindir is libdir, return empty string,
+ # else relative path ending with a slash; either way, target
+ # file name can be directly appended.
+ if test ! -z "$func_relative_path_result"; then
+ func_stripname './' '' "$func_relative_path_result/"
+ func_relative_path_result=$func_stripname_result
+ fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+ [\\/]*|[A-Za-z]:\\*) ;;
+ *[\\/]*)
+ progdir=$func_dirname_result
+ progdir=`cd "$progdir" && pwd`
+ progpath="$progdir/$progname"
+ ;;
+ *)
+ save_IFS="$IFS"
+ IFS=${PATH_SEPARATOR-:}
+ for progdir in $PATH; do
+ IFS="$save_IFS"
+ test -x "$progdir/$progname" && break
+ done
+ IFS="$save_IFS"
+ test -n "$progdir" || progdir=`pwd`
+ progpath="$progdir/$progname"
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes. A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+ s/$bs4/&\\
+/g
+ s/^$bs2$dollar/$bs&/
+ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+ s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+ $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+ $opt_verbose && func_echo ${1+"$@"}
+
+ # A bug in bash halts the script if the last line of a function
+ # fails when set -e is in force, so we need another command to
+ # work around that:
+ :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+ $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+ $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+ # bash bug again:
+ :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+ func_error ${1+"$@"}
+ exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+ func_error ${1+"$@"}
+ func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information." ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+ $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+ my_directory_path="$1"
+ my_dir_list=
+
+ if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+ # Protect directory names starting with `-'
+ case $my_directory_path in
+ -*) my_directory_path="./$my_directory_path" ;;
+ esac
+
+ # While some portion of DIR does not yet exist...
+ while test ! -d "$my_directory_path"; do
+ # ...make a list in topmost first order. Use a colon delimited
+ # list incase some portion of path contains whitespace.
+ my_dir_list="$my_directory_path:$my_dir_list"
+
+ # If the last portion added has no slash in it, the list is done
+ case $my_directory_path in */*) ;; *) break ;; esac
+
+ # ...otherwise throw away the child directory and loop
+ my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+ done
+ my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+ save_mkdir_p_IFS="$IFS"; IFS=':'
+ for my_dir in $my_dir_list; do
+ IFS="$save_mkdir_p_IFS"
+ # mkdir can fail with a `File exist' error if two processes
+ # try to create one of the directories concurrently. Don't
+ # stop in that case!
+ $MKDIR "$my_dir" 2>/dev/null || :
+ done
+ IFS="$save_mkdir_p_IFS"
+
+ # Bail out if we (or some other process) failed to create a directory.
+ test -d "$my_directory_path" || \
+ func_fatal_error "Failed to create \`$1'"
+ fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible. If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+ my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+ if test "$opt_dry_run" = ":"; then
+ # Return a directory name, but don't create it in dry-run mode
+ my_tmpdir="${my_template}-$$"
+ else
+
+ # If mktemp works, use that first and foremost
+ my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+ if test ! -d "$my_tmpdir"; then
+ # Failing that, at least try and use $RANDOM to avoid a race
+ my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+ save_mktempdir_umask=`umask`
+ umask 0077
+ $MKDIR "$my_tmpdir"
+ umask $save_mktempdir_umask
+ fi
+
+ # If we're not in dry-run mode, bomb out on failure
+ test -d "$my_tmpdir" || \
+ func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+ fi
+
+ $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+ case $1 in
+ *[\\\`\"\$]*)
+ func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+ *)
+ func_quote_for_eval_unquoted_result="$1" ;;
+ esac
+
+ case $func_quote_for_eval_unquoted_result in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and and variable
+ # expansion for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+ ;;
+ *)
+ func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+ esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+ case $1 in
+ *[\\\`\"]*)
+ my_arg=`$ECHO "$1" | $SED \
+ -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+ *)
+ my_arg="$1" ;;
+ esac
+
+ case $my_arg in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting and command substitution for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ my_arg="\"$my_arg\""
+ ;;
+ esac
+
+ func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
+# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+ my_cmd="$1"
+ my_fail_exp="${2-:}"
+
+ ${opt_silent-false} || {
+ func_quote_for_expand "$my_cmd"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+
+ if ${opt_dry_run-false}; then :; else
+ eval "$my_cmd"
+ my_status=$?
+ if test "$my_status" -eq 0; then :; else
+ eval "(exit $my_status); $my_fail_exp"
+ fi
+ fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
+# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it. Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+ my_cmd="$1"
+ my_fail_exp="${2-:}"
+
+ ${opt_silent-false} || {
+ func_quote_for_expand "$my_cmd"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+
+ if ${opt_dry_run-false}; then :; else
+ eval "$lt_user_locale
+ $my_cmd"
+ my_status=$?
+ eval "$lt_safe_locale"
+ if test "$my_status" -eq 0; then :; else
+ eval "(exit $my_status); $my_fail_exp"
+ fi
+ fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result. All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+ case $1 in
+ [0-9]* | *[!a-zA-Z0-9_]*)
+ func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+ ;;
+ * )
+ func_tr_sh_result=$1
+ ;;
+ esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $opt_debug
+
+ $SED -n '/(C)/!b go
+ :more
+ /\./!{
+ N
+ s/\n# / /
+ b more
+ }
+ :go
+ /^# '$PROGRAM' (GNU /,/# warranty; / {
+ s/^# //
+ s/^# *$//
+ s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+ p
+ }' < "$progpath"
+ exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+ $opt_debug
+
+ $SED -n '/^# Usage:/,/^# *.*--help/ {
+ s/^# //
+ s/^# *$//
+ s/\$progname/'$progname'/
+ p
+ }' < "$progpath"
+ echo
+ $ECHO "run \`$progname --help | more' for full usage"
+ exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+ $opt_debug
+
+ $SED -n '/^# Usage:/,/# Report bugs to/ {
+ :print
+ s/^# //
+ s/^# *$//
+ s*\$progname*'$progname'*
+ s*\$host*'"$host"'*
+ s*\$SHELL*'"$SHELL"'*
+ s*\$LTCC*'"$LTCC"'*
+ s*\$LTCFLAGS*'"$LTCFLAGS"'*
+ s*\$LD*'"$LD"'*
+ s/\$with_gnu_ld/'"$with_gnu_ld"'/
+ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+ p
+ d
+ }
+ /^# .* home page:/b print
+ /^# General help using/b print
+ ' < "$progpath"
+ ret=$?
+ if test -z "$1"; then
+ exit $ret
+ fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+ $opt_debug
+
+ func_error "missing argument for $1."
+ exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+ my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+ my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+ func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+ func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+ my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+ my_sed_long_arg='1s/^--[^=]*=//'
+
+ func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+ func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+ func_quote_for_eval "${2}"
+ eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+ func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+ func_error ${1+"$@"}
+ func_error "See the $PACKAGE documentation for more information."
+ func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+ re_begincf='^# ### BEGIN LIBTOOL'
+ re_endcf='^# ### END LIBTOOL'
+
+ # Default configuration.
+ $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+ done
+
+ exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+ echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ echo "enable shared libraries"
+ else
+ echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ echo "enable static libraries"
+ else
+ echo "disable static libraries"
+ fi
+
+ exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+ # Global variable:
+ tagname="$1"
+
+ re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+ re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+ sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+ # Validate tagname.
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ func_fatal_error "invalid tag name: $tagname"
+ ;;
+ esac
+
+ # Don't test for the "default" C tag, as we know it's
+ # there but not specially marked.
+ case $tagname in
+ CC) ;;
+ *)
+ if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+ taglist="$taglist $tagname"
+
+ # Evaluate the configuration. Be careful to quote the path
+ # and the sed script, to avoid splitting on whitespace, but
+ # also don't use non-portable quotes within backquotes within
+ # quotes we have to do it in 2 steps:
+ extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+ eval "$extractedcf"
+ else
+ func_error "ignoring unknown tag $tagname"
+ fi
+ ;;
+ esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+ if test "$package_revision" != "$macro_revision"; then
+ if test "$VERSION" != "$macro_version"; then
+ if test -z "$macro_version"; then
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ fi
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+ fi
+
+ exit $EXIT_MISMATCH
+ fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+ shift; set dummy --mode clean ${1+"$@"}; shift
+ ;;
+compile|compil|compi|comp|com|co|c)
+ shift; set dummy --mode compile ${1+"$@"}; shift
+ ;;
+execute|execut|execu|exec|exe|ex|e)
+ shift; set dummy --mode execute ${1+"$@"}; shift
+ ;;
+finish|finis|fini|fin|fi|f)
+ shift; set dummy --mode finish ${1+"$@"}; shift
+ ;;
+install|instal|insta|inst|ins|in|i)
+ shift; set dummy --mode install ${1+"$@"}; shift
+ ;;
+link|lin|li|l)
+ shift; set dummy --mode link ${1+"$@"}; shift
+ ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+ shift; set dummy --mode uninstall ${1+"$@"}; shift
+ ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly. This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+ # this just eases exit handling
+ while test $# -gt 0; do
+ opt="$1"
+ shift
+ case $opt in
+ --debug|-x) opt_debug='set -x'
+ func_echo "enabling shell trace mode"
+ $opt_debug
+ ;;
+ --dry-run|--dryrun|-n)
+ opt_dry_run=:
+ ;;
+ --config)
+ opt_config=:
+func_config
+ ;;
+ --dlopen|-dlopen)
+ optarg="$1"
+ opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+ shift
+ ;;
+ --preserve-dup-deps)
+ opt_preserve_dup_deps=:
+ ;;
+ --features)
+ opt_features=:
+func_features
+ ;;
+ --finish)
+ opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+ ;;
+ --help)
+ opt_help=:
+ ;;
+ --help-all)
+ opt_help_all=:
+opt_help=': help-all'
+ ;;
+ --mode)
+ test $# = 0 && func_missing_arg $opt && break
+ optarg="$1"
+ opt_mode="$optarg"
+case $optarg in
+ # Valid mode arguments:
+ clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+ # Catch anything else as an error
+ *) func_error "invalid argument for $opt"
+ exit_cmd=exit
+ break
+ ;;
+esac
+ shift
+ ;;
+ --no-silent|--no-quiet)
+ opt_silent=false
+func_append preserve_args " $opt"
+ ;;
+ --no-warning|--no-warn)
+ opt_warning=false
+func_append preserve_args " $opt"
+ ;;
+ --no-verbose)
+ opt_verbose=false
+func_append preserve_args " $opt"
+ ;;
+ --silent|--quiet)
+ opt_silent=:
+func_append preserve_args " $opt"
+ opt_verbose=false
+ ;;
+ --verbose|-v)
+ opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+ ;;
+ --tag)
+ test $# = 0 && func_missing_arg $opt && break
+ optarg="$1"
+ opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+ shift
+ ;;
+
+ -\?|-h) func_usage ;;
+ --help) func_help ;;
+ --version) func_version ;;
+
+ # Separate optargs to long options:
+ --*=*)
+ func_split_long_opt "$opt"
+ set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate non-argument short options:
+ -\?*|-h*|-n*|-v*)
+ func_split_short_opt "$opt"
+ set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ --) break ;;
+ -*) func_fatal_help "unrecognized option \`$opt'" ;;
+ *) set dummy "$opt" ${1+"$@"}; shift; break ;;
+ esac
+ done
+
+ # Validate options:
+
+ # save first non-option argument
+ if test "$#" -gt 0; then
+ nonopt="$opt"
+ shift
+ fi
+
+ # preserve --debug
+ test "$opt_debug" = : || func_append preserve_args " --debug"
+
+ case $host in
+ *cygwin* | *mingw* | *pw32* | *cegcc*)
+ # don't eliminate duplications in $postdeps and $predeps
+ opt_duplicate_compiler_generated_deps=:
+ ;;
+ *)
+ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+ ;;
+ esac
+
+ $opt_help || {
+ # Sanity checks first:
+ func_check_version_match
+
+ if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ func_fatal_configuration "not configured to build any kind of library"
+ fi
+
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+ func_error "unrecognized option \`-dlopen'"
+ $ECHO "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$progname --help --mode=$opt_mode' for more information."
+ }
+
+
+ # Bail if the options were screwed
+ $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+## Main. ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+ test -f "$1" &&
+ $SED -e 4q "$1" 2>/dev/null \
+ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs. To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway. Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+ lalib_p=no
+ if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+ for lalib_p_l in 1 2 3 4
+ do
+ read lalib_p_line
+ case "$lalib_p_line" in
+ \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+ esac
+ done
+ exec 0<&5 5<&-
+ fi
+ test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+ func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+ func_ltwrapper_exec_suffix=
+ case $1 in
+ *.exe) ;;
+ *) func_ltwrapper_exec_suffix=.exe ;;
+ esac
+ $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+ func_dirname_and_basename "$1" "" "."
+ func_stripname '' '.exe' "$func_basename_result"
+ func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+ func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+ $opt_debug
+ save_ifs=$IFS; IFS='~'
+ for cmd in $1; do
+ IFS=$save_ifs
+ eval cmd=\"$cmd\"
+ func_show_eval "$cmd" "${2-:}"
+ done
+ IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)! Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+ $opt_debug
+ case $1 in
+ */* | *\\*) . "$1" ;;
+ *) . "./$1" ;;
+ esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot. Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+ func_resolve_sysroot_result=$1
+ case $func_resolve_sysroot_result in
+ =*)
+ func_stripname '=' '' "$func_resolve_sysroot_result"
+ func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+ ;;
+ esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+ case "$lt_sysroot:$1" in
+ ?*:"$lt_sysroot"*)
+ func_stripname "$lt_sysroot" '' "$1"
+ func_replace_sysroot_result="=$func_stripname_result"
+ ;;
+ *)
+ # Including no sysroot.
+ func_replace_sysroot_result=$1
+ ;;
+ esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+ $opt_debug
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ func_append_quoted CC_quoted "$arg"
+ done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ func_append_quoted CC_quoted "$arg"
+ done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
+ case "$@ " in
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ func_echo "unable to infer tagged configuration"
+ func_fatal_error "specify a tag with \`--tag'"
+# else
+# func_verbose "using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+ write_libobj=${1}
+ if test "$build_libtool_libs" = yes; then
+ write_lobj=\'${2}\'
+ else
+ write_lobj=none
+ fi
+
+ if test "$build_old_libs" = yes; then
+ write_oldobj=\'${3}\'
+ else
+ write_oldobj=none
+ fi
+
+ $opt_dry_run || {
+ cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+ $MV "${write_libobj}T" "${write_libobj}"
+ }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+ $opt_debug
+ func_convert_core_file_wine_to_w32_result="$1"
+ if test -n "$1"; then
+ # Unfortunately, winepath does not exit with a non-zero error code, so we
+ # are forced to check the contents of stdout. On the other hand, if the
+ # command is not found, the shell will set an exit code of 127 and print
+ # *an error message* to stdout. So we must check for both error code of
+ # zero AND non-empty stdout, which explains the odd construction:
+ func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+ if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+ func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+ $SED -e "$lt_sed_naive_backslashify"`
+ else
+ func_convert_core_file_wine_to_w32_result=
+ fi
+ fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+ $opt_debug
+ # unfortunately, winepath doesn't convert paths, only file names
+ func_convert_core_path_wine_to_w32_result=""
+ if test -n "$1"; then
+ oldIFS=$IFS
+ IFS=:
+ for func_convert_core_path_wine_to_w32_f in $1; do
+ IFS=$oldIFS
+ func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+ if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+ if test -z "$func_convert_core_path_wine_to_w32_result"; then
+ func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+ else
+ func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+ fi
+ fi
+ done
+ IFS=$oldIFS
+ fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+ $opt_debug
+ if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+ func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+ if test "$?" -ne 0; then
+ # on failure, ensure result is empty
+ func_cygpath_result=
+ fi
+ else
+ func_cygpath_result=
+ func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+ fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format. Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+ $opt_debug
+ # awkward: cmd appends spaces to result
+ func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+ $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+ $opt_debug
+ if test -z "$2" && test -n "$1" ; then
+ func_error "Could not determine host file name corresponding to"
+ func_error " \`$1'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback:
+ func_to_host_file_result="$1"
+ fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+ $opt_debug
+ if test -z "$4" && test -n "$3"; then
+ func_error "Could not determine the host path corresponding to"
+ func_error " \`$3'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback. This is a deliberately simplistic "conversion" and
+ # should not be "improved". See libtool.info.
+ if test "x$1" != "x$2"; then
+ lt_replace_pathsep_chars="s|$1|$2|g"
+ func_to_host_path_result=`echo "$3" |
+ $SED -e "$lt_replace_pathsep_chars"`
+ else
+ func_to_host_path_result="$3"
+ fi
+ fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+ $opt_debug
+ case $4 in
+ $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+ ;;
+ esac
+ case $4 in
+ $2 ) func_append func_to_host_path_result "$3"
+ ;;
+ esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+ $opt_debug
+ $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result. If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+ $opt_debug
+ case ,$2, in
+ *,"$to_tool_file_cmd",*)
+ func_to_tool_file_result=$1
+ ;;
+ *)
+ $to_tool_file_cmd "$1"
+ func_to_tool_file_result=$func_to_host_file_result
+ ;;
+ esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+ func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+ # LT_CYGPATH in this case.
+ func_to_host_file_result=`cygpath -m "$1"`
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format. Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_file_wine_to_w32 "$1"
+ func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_msys_to_w32_result"
+ func_to_host_file_result="$func_cygpath_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set. Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+ func_convert_core_file_wine_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+ func_to_host_file_result="$func_cygpath_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format. If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+# file name conversion function : func_convert_file_X_to_Y ()
+# path conversion function : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same. If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+ $opt_debug
+ if test -z "$to_host_path_cmd"; then
+ func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+ to_host_path_cmd="func_convert_path_${func_stripname_result}"
+ fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+ $opt_debug
+ func_init_to_host_path_cmd
+ $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+ func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from ARG. MSYS
+ # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+ # and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format. Requires a wine environment and
+# a working winepath. Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+ func_to_host_path_result="$func_cygpath_result"
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set. Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from
+ # ARG. msys behavior is inconsistent here, cygpath turns them
+ # into '.;' and ';.', and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+ func_to_host_path_result="$func_cygpath_result"
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+ $opt_debug
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+ pie_flag=
+
+ for arg
+ do
+ case $arg_mode in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg="$arg"
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj="$arg"
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ test -n "$libobj" && \
+ func_fatal_error "you cannot specify \`-o' more than once"
+ arg_mode=target
+ continue
+ ;;
+
+ -pie | -fpie | -fPIE)
+ func_append pie_flag " $arg"
+ continue
+ ;;
+
+ -shared | -static | -prefer-pic | -prefer-non-pic)
+ func_append later " $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ func_stripname '-Wc,' '' "$arg"
+ args=$func_stripname_result
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+ func_append_quoted lastarg "$arg"
+ done
+ IFS="$save_ifs"
+ func_stripname ' ' '' "$lastarg"
+ lastarg=$func_stripname_result
+
+ # Add the arguments to base_compile.
+ func_append base_compile " $lastarg"
+ continue
+ ;;
+
+ *)
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg="$srcfile"
+ srcfile="$arg"
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ func_append_quoted base_compile "$lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ func_fatal_error "you must specify an argument for -Xcompile"
+ ;;
+ target)
+ func_fatal_error "you must specify a target with \`-o'"
+ ;;
+ *)
+ # Get the name of the library object.
+ test -z "$libobj" && {
+ func_basename "$srcfile"
+ libobj="$func_basename_result"
+ }
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ case $libobj in
+ *.[cCFSifmso] | \
+ *.ada | *.adb | *.ads | *.asm | \
+ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+ func_xform "$libobj"
+ libobj=$func_xform_result
+ ;;
+ esac
+
+ case $libobj in
+ *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+ *)
+ func_fatal_error "cannot determine name of library object from \`$libobj'"
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -shared)
+ test "$build_libtool_libs" != yes && \
+ func_fatal_configuration "can not build a shared library"
+ build_old_libs=no
+ continue
+ ;;
+
+ -static)
+ build_libtool_libs=no
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ func_quote_for_eval "$libobj"
+ test "X$libobj" != "X$func_quote_for_eval_result" \
+ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && func_warning "libobj name \`$libobj' may not contain shell special characters."
+ func_dirname_and_basename "$obj" "/" ""
+ objname="$func_basename_result"
+ xdir="$func_dirname_result"
+ lobj=${xdir}$objdir/$objname
+
+ test -z "$base_compile" && \
+ func_fatal_help "you must specify a compilation command"
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2* | cegcc*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+ func_echo "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ $ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+ func_append removelist " $output_obj"
+ $ECHO "$srcfile" > "$lockfile"
+ fi
+
+ $opt_dry_run || $RM $removelist
+ func_append removelist " $lockfile"
+ trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+ func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+ srcfile=$func_to_tool_file_result
+ func_quote_for_eval "$srcfile"
+ qsrcfile=$func_quote_for_eval_result
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ command="$base_compile $qsrcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ fi
+
+ func_mkdir_p "$xdir$objdir"
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ func_append command " -o $lobj"
+ fi
+
+ func_show_eval_locale "$command" \
+ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ func_show_eval '$MV "$output_obj" "$lobj"' \
+ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+ fi
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $qsrcfile$pie_flag"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ func_append command " -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ func_append command "$suppress_output"
+ func_show_eval_locale "$command" \
+ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ func_show_eval '$MV "$output_obj" "$obj"' \
+ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+ fi
+ fi
+
+ $opt_dry_run || {
+ func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ removelist=$lockfile
+ $RM "$lockfile"
+ fi
+ }
+
+ exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+ test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+ # We need to display help for each of the modes.
+ case $opt_mode in
+ "")
+ # Generic help is extracted from the usage comments
+ # at the start of this file.
+ func_help
+ ;;
+
+ clean)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+ compile)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -no-suppress do not suppress compiler output for multiple passes
+ -prefer-pic try to build PIC objects only
+ -prefer-non-pic try to build non-PIC objects only
+ -shared do not build a \`.o' file suitable for static linking
+ -static only build a \`.o' file suitable for static linking
+ -Wc,FLAG pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+ execute)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+ finish)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+ install)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+ -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+ link)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -bindir BINDIR specify path to binaries directory (for systems where
+ libraries must be found in the PATH setting at runtime)
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE Use a list of object files found in FILE to specify objects
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -shared only do dynamic linking of libtool libraries
+ -shrext SUFFIX override the standard shared library file extension
+ -static do not do any dynamic linking of uninstalled libtool libraries
+ -static-libtool-libs
+ do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+ -weak LIBNAME declare that the target provides the LIBNAME interface
+ -Wc,FLAG
+ -Xcompiler FLAG pass linker-specific FLAG directly to the compiler
+ -Wl,FLAG
+ -Xlinker FLAG pass linker-specific FLAG directly to the linker
+ -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+ uninstall)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+ *)
+ func_fatal_help "invalid operation mode \`$opt_mode'"
+ ;;
+ esac
+
+ echo
+ $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+ if test "$opt_help" = :; then
+ func_mode_help
+ else
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ func_mode_help
+ done
+ } | sed -n '1p; 2,$s/^Usage:/ or: /p'
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ echo
+ func_mode_help
+ done
+ } |
+ sed '1d
+ /^When reporting/,/^Report/{
+ H
+ d
+ }
+ $x
+ /information about other modes/d
+ /more detailed .*MODE/d
+ s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+ fi
+ exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+ $opt_debug
+ # The first argument is the command name.
+ cmd="$nonopt"
+ test -z "$cmd" && \
+ func_fatal_help "you must specify a COMMAND"
+
+ # Handle -dlopen flags immediately.
+ for file in $opt_dlopen; do
+ test -f "$file" \
+ || func_fatal_help "\`$file' is not a file"
+
+ dir=
+ case $file in
+ *.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$file" \
+ || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+ func_source "$file"
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && \
+ func_warning "\`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ func_dirname "$file" "" "."
+ dir="$func_dirname_result"
+
+ if test -f "$dir/$objdir/$dlname"; then
+ func_append dir "/$objdir"
+ else
+ if test ! -f "$dir/$dlname"; then
+ func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ func_dirname "$file" "" "."
+ dir="$func_dirname_result"
+ ;;
+
+ *)
+ func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -* | *.la | *.lo ) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if func_ltwrapper_script_p "$file"; then
+ func_source "$file"
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ elif func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ func_source "$func_ltwrapper_scriptname_result"
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ func_append_quoted args "$file"
+ done
+
+ if test "X$opt_dry_run" = Xfalse; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+ do
+ eval "if test \"\${save_$lt_var+set}\" = set; then
+ $lt_var=\$save_$lt_var; export $lt_var
+ else
+ $lt_unset $lt_var
+ fi"
+ done
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+ echo "export $shlibpath_var"
+ fi
+ $ECHO "$cmd$args"
+ exit $EXIT_SUCCESS
+ fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+ $opt_debug
+ libs=
+ libdirs=
+ admincmds=
+
+ for opt in "$nonopt" ${1+"$@"}
+ do
+ if test -d "$opt"; then
+ func_append libdirs " $opt"
+
+ elif test -f "$opt"; then
+ if func_lalib_unsafe_p "$opt"; then
+ func_append libs " $opt"
+ else
+ func_warning "\`$opt' is not a valid libtool archive"
+ fi
+
+ else
+ func_fatal_error "invalid argument \`$opt'"
+ fi
+ done
+
+ if test -n "$libs"; then
+ if test -n "$lt_sysroot"; then
+ sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+ sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+ else
+ sysroot_cmd=
+ fi
+
+ # Remove sysroot references
+ if $opt_dry_run; then
+ for lib in $libs; do
+ echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+ done
+ else
+ tmpdir=`func_mktempdir`
+ for lib in $libs; do
+ sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+ > $tmpdir/tmp-la
+ mv -f $tmpdir/tmp-la $lib
+ done
+ ${RM}r "$tmpdir"
+ fi
+ fi
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $opt_dry_run || eval "$cmds" || func_append admincmds "
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ $opt_silent && exit $EXIT_SUCCESS
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ echo "----------------------------------------------------------------------"
+ echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $ECHO " $libdir"
+ done
+ echo
+ echo "If you ever happen to want to link against installed libraries"
+ echo "in a given directory, LIBDIR, you must either use libtool, and"
+ echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $ECHO " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $ECHO " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ echo
+
+ echo "See any operating system documentation about shared libraries for"
+ case $host in
+ solaris2.[6789]|solaris2.1[0-9])
+ echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+ echo "pages."
+ ;;
+ *)
+ echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ ;;
+ esac
+ echo "----------------------------------------------------------------------"
+ fi
+ exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+ $opt_debug
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ case $nonopt in *shtool*) :;; *) false;; esac; then
+ # Aesthetically quote it.
+ func_quote_for_eval "$nonopt"
+ install_prog="$func_quote_for_eval_result "
+ arg=$1
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ func_quote_for_eval "$arg"
+ func_append install_prog "$func_quote_for_eval_result"
+ install_shared_prog=$install_prog
+ case " $install_prog " in
+ *[\\\ /]cp\ *) install_cp=: ;;
+ *) install_cp=false ;;
+ esac
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ no_mode=:
+ for arg
+ do
+ arg2=
+ if test -n "$dest"; then
+ func_append files " $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ if $install_cp; then :; else
+ prev=$arg
+ fi
+ ;;
+ -g | -m | -o)
+ prev=$arg
+ ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ if test "x$prev" = x-m && test -n "$install_override_mode"; then
+ arg2=$install_override_mode
+ no_mode=false
+ fi
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ func_quote_for_eval "$arg"
+ func_append install_prog " $func_quote_for_eval_result"
+ if test -n "$arg2"; then
+ func_quote_for_eval "$arg2"
+ fi
+ func_append install_shared_prog " $func_quote_for_eval_result"
+ done
+
+ test -z "$install_prog" && \
+ func_fatal_help "you must specify an install program"
+
+ test -n "$prev" && \
+ func_fatal_help "the \`$prev' option requires an argument"
+
+ if test -n "$install_override_mode" && $no_mode; then
+ if $install_cp; then :; else
+ func_quote_for_eval "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_for_eval_result"
+ fi
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ func_fatal_help "no file or destination specified"
+ else
+ func_fatal_help "you must specify a destination"
+ fi
+ fi
+
+ # Strip any trailing slash from the destination.
+ func_stripname '' '/' "$dest"
+ dest=$func_stripname_result
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ func_dirname_and_basename "$dest" "" "."
+ destdir="$func_dirname_result"
+ destname="$func_basename_result"
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files; shift
+ test "$#" -gt 1 && \
+ func_fatal_help "\`$dest' is not a directory"
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ func_fatal_help "\`$destdir' must be an absolute directory name"
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ func_append staticlibs " $file"
+ ;;
+
+ *.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$file" \
+ || func_fatal_help "\`$file' is not a valid libtool archive"
+
+ library_names=
+ old_library=
+ relink_command=
+ func_source "$file"
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) func_append current_libdirs " $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) func_append future_libdirs " $libdir" ;;
+ esac
+ fi
+
+ func_dirname "$file" "/" ""
+ dir="$func_dirname_result"
+ func_append dir "$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ test "$inst_prefix_dir" = "$destdir" && \
+ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+ fi
+
+ func_warning "relinking \`$file'"
+ func_show_eval "$relink_command" \
+ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names; shift
+ if test -n "$1"; then
+ realname="$1"
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+ 'exit $?'
+ tstripme="$stripme"
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $realname in
+ *.dll.a)
+ tstripme=""
+ ;;
+ esac
+ ;;
+ esac
+ if test -n "$tstripme" && test -n "$striplib"; then
+ func_show_eval "$striplib $destdir/$realname" 'exit $?'
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ # Try `ln -sf' first, because the `ln' binary might depend on
+ # the symlink we replace! Solaris /bin/ln does not understand -f,
+ # so we also need to try rm && ln -s.
+ for linkname
+ do
+ test "$linkname" != "$realname" \
+ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ func_execute_cmds "$postinstall_cmds" 'exit $?'
+ fi
+
+ # Install the pseudo-library for information purposes.
+ func_basename "$file"
+ name="$func_basename_result"
+ instname="$dir/$name"i
+ func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ func_basename "$file"
+ destfile="$func_basename_result"
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ func_lo2o "$destfile"
+ staticdest=$func_lo2o_result
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ func_fatal_help "cannot copy a libtool object to \`$destfile'"
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ test -n "$destfile" && \
+ func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ func_lo2o "$file"
+ staticobj=$func_lo2o_result
+ func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ func_basename "$file"
+ destfile="$func_basename_result"
+ destfile="$destdir/$destfile"
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=""
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ func_stripname '' '.exe' "$file"
+ file=$func_stripname_result
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin* | *mingw*)
+ if func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ wrapper=$func_ltwrapper_scriptname_result
+ else
+ func_stripname '' '.exe' "$file"
+ wrapper=$func_stripname_result
+ fi
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if func_ltwrapper_script_p "$wrapper"; then
+ notinst_deplibs=
+ relink_command=
+
+ func_source "$wrapper"
+
+ # Check the variables that should have been set.
+ test -z "$generated_by_libtool_version" && \
+ func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ func_source "$lib"
+ fi
+ libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ func_warning "\`$lib' has not been installed in \`$libdir'"
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ func_source "$wrapper"
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ $opt_dry_run || {
+ if test "$finalize" = yes; then
+ tmpdir=`func_mktempdir`
+ func_basename "$file$stripped_ext"
+ file="$func_basename_result"
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $opt_silent || {
+ func_quote_for_expand "$relink_command"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+ if eval "$relink_command"; then :
+ else
+ func_error "error: relink \`$file' with the above command before installing it"
+ $opt_dry_run || ${RM}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ func_warning "cannot relink \`$file'"
+ fi
+ }
+ else
+ # Install the binary that we compiled earlier.
+ file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyway
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ func_stripname '' '.exe' "$destfile"
+ destfile=$func_stripname_result
+ ;;
+ esac
+ ;;
+ esac
+ func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+ $opt_dry_run || if test -n "$outputname"; then
+ ${RM}r "$tmpdir"
+ fi
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ func_basename "$file"
+ name="$func_basename_result"
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
+
+ func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+ fi
+
+ # Do each command in the postinstall commands.
+ func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+ done
+
+ test -n "$future_libdirs" && \
+ func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ $opt_dry_run && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+ $opt_debug
+ my_outputname="$1"
+ my_originator="$2"
+ my_pic_p="${3-no}"
+ my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+ my_dlsyms=
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ my_dlsyms="${my_outputname}S.c"
+ else
+ func_error "not configured to extract global symbols from dlpreopened files"
+ fi
+ fi
+
+ if test -n "$my_dlsyms"; then
+ case $my_dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${my_outputname}.nm"
+
+ func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+ # Parse the name list into a source file.
+ func_verbose "creating $output_objdir/$my_dlsyms"
+
+ $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ func_verbose "generating symbol list for \`$output'"
+
+ $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ for progfile in $progfiles; do
+ func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+ func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+ $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $opt_dry_run || {
+ eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ }
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $opt_dry_run || {
+ eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ }
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$outputname.exp"
+ $opt_dry_run || {
+ $RM $export_symbols
+ eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ }
+ else
+ $opt_dry_run || {
+ eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ }
+ fi
+ fi
+
+ for dlprefile in $dlprefiles; do
+ func_verbose "extracting global C symbols from \`$dlprefile'"
+ func_basename "$dlprefile"
+ name="$func_basename_result"
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ # if an import library, we need to obtain dlname
+ if func_win32_import_lib_p "$dlprefile"; then
+ func_tr_sh "$dlprefile"
+ eval "curr_lafile=\$libfile_$func_tr_sh_result"
+ dlprefile_dlbasename=""
+ if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+ # Use subshell, to avoid clobbering current variable values
+ dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+ if test -n "$dlprefile_dlname" ; then
+ func_basename "$dlprefile_dlname"
+ dlprefile_dlbasename="$func_basename_result"
+ else
+ # no lafile. user explicitly requested -dlpreopen <import library>.
+ $sharedlib_from_linklib_cmd "$dlprefile"
+ dlprefile_dlbasename=$sharedlib_from_linklib_result
+ fi
+ fi
+ $opt_dry_run || {
+ if test -n "$dlprefile_dlbasename" ; then
+ eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+ else
+ func_warning "Could not compute DLL name from $name"
+ eval '$ECHO ": $name " >> "$nlist"'
+ fi
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ }
+ else # not an import lib
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ fi
+ ;;
+ *)
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ ;;
+ esac
+ done
+
+ $opt_dry_run || {
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $MV "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if $GREP -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ $GREP -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+ else
+ echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+ fi
+
+ echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols. */
+typedef struct {
+ const char *name;
+ void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+ { \"$my_originator\", (void *) 0 },"
+
+ case $need_lib_prefix in
+ no)
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+ ;;
+ *)
+ eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+ ;;
+ esac
+ echo >> "$output_objdir/$my_dlsyms" "\
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ } # !$opt_dry_run
+
+ pic_flag_for_symtable=
+ case "$compile_command " in
+ *" -static "*) ;;
+ *)
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+ *-*-hpux*)
+ pic_flag_for_symtable=" $pic_flag" ;;
+ *)
+ if test "X$my_pic_p" != Xno; then
+ pic_flag_for_symtable=" $pic_flag"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ symtab_cflags=
+ for arg in $LTCFLAGS; do
+ case $arg in
+ -pie | -fpie | -fPIE) ;;
+ *) func_append symtab_cflags " $arg" ;;
+ esac
+ done
+
+ # Now compile the dynamic symbol file.
+ func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+ # Clean up the generated files.
+ func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+ # Transform the symbol file into the correct name.
+ symfileobj="$output_objdir/${my_outputname}S.$objext"
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ if test -f "$output_objdir/$my_outputname.def"; then
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ else
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ fi
+ ;;
+ *)
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ ;;
+ esac
+ ;;
+ *)
+ func_fatal_error "unknown suffix for \`$my_dlsyms'"
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+ fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+ $opt_debug
+ win32_libid_type="unknown"
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+ $SED -n -e '
+ 1,100{
+ / I /{
+ s,.*,import,
+ p
+ q
+ }
+ }'`
+ case $win32_nmres in
+ import*) win32_libid_type="x86 archive import";;
+ *) win32_libid_type="x86 archive static";;
+ esac
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+ $opt_debug
+ sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+ $opt_debug
+ match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+ $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+ $SED '/^Contents of section '"$match_literal"':/{
+ # Place marker at beginning of archive member dllname section
+ s/.*/====MARK====/
+ p
+ d
+ }
+ # These lines can sometimes be longer than 43 characters, but
+ # are always uninteresting
+ /:[ ]*file format pe[i]\{,1\}-/d
+ /^In archive [^:]*:/d
+ # Ensure marker is printed
+ /^====MARK====/p
+ # Remove all lines with less than 43 characters
+ /^.\{43\}/!d
+ # From remaining lines, remove first 43 characters
+ s/^.\{43\}//' |
+ $SED -n '
+ # Join marker and all lines until next marker into a single line
+ /^====MARK====/ b para
+ H
+ $ b para
+ b
+ :para
+ x
+ s/\n//g
+ # Remove the marker
+ s/^====MARK====//
+ # Remove trailing dots and whitespace
+ s/[\. \t]*$//
+ # Print
+ /./p' |
+ # we now have a list, one entry per line, of the stringified
+ # contents of the appropriate section of all members of the
+ # archive which possess that section. Heuristic: eliminate
+ # all those which have a first or second character that is
+ # a '.' (that is, objdump's representation of an unprintable
+ # character.) This should work for all archives with less than
+ # 0x302f exports -- but will fail for DLLs whose name actually
+ # begins with a literal '.' or a single character followed by
+ # a '.'.
+ #
+ # Of those that remain, print the first one.
+ $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+ $opt_debug
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+ test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+ $opt_debug
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+ test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+ $opt_debug
+ if func_cygming_gnu_implib_p "$1" ; then
+ # binutils import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+ elif func_cygming_ms_implib_p "$1" ; then
+ # ms-generated import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+ else
+ # unknown
+ sharedlib_from_linklib_result=""
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ $opt_debug
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+ if test "$lock_old_archive_extraction" = yes; then
+ lockfile=$f_ex_an_ar_oldlib.lock
+ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+ func_echo "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ fi
+ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+ 'stat=$?; rm -f "$lockfile"; exit $stat'
+ if test "$lock_old_archive_extraction" = yes; then
+ $opt_dry_run || rm -f "$lockfile"
+ fi
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+ fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ $opt_debug
+ my_gentop="$1"; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=""
+ my_xlib=""
+ my_xabs=""
+ my_xdir=""
+
+ for my_xlib in $my_oldlibs; do
+ # Extract the objects.
+ case $my_xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+ *) my_xabs=`pwd`"/$my_xlib" ;;
+ esac
+ func_basename "$my_xlib"
+ my_xlib="$func_basename_result"
+ my_xlib_u=$my_xlib
+ while :; do
+ case " $extracted_archives " in
+ *" $my_xlib_u "*)
+ func_arith $extracted_serial + 1
+ extracted_serial=$func_arith_result
+ my_xlib_u=lt$extracted_serial-$my_xlib ;;
+ *) break ;;
+ esac
+ done
+ extracted_archives="$extracted_archives $my_xlib_u"
+ my_xdir="$my_gentop/$my_xlib_u"
+
+ func_mkdir_p "$my_xdir"
+
+ case $host in
+ *-darwin*)
+ func_verbose "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ $opt_dry_run || {
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ darwin_base_archive=`basename "$darwin_archive"`
+ darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches ; do
+ func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+ cd "$darwin_curdir"
+ $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+ done # $darwin_arches
+ ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+ $LIPO -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ $RM -rf unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd $darwin_orig_dir
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ } # !$opt_dry_run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+ done
+
+ func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable. Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take. If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory. This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+ func_emit_wrapper_arg1=${1-no}
+
+ $ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='$macro_version'
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$ECHO are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ file=\"\$0\""
+
+ qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+ $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+ ECHO=\"$qECHO\"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=\$0
+ shift
+ for lt_opt
+ do
+ case \"\$lt_opt\" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+ test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+ lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+ cat \"\$lt_dump_D/\$lt_dump_F\"
+ exit 0
+ ;;
+ --lt-*)
+ \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n \"\$lt_option_debug\"; then
+ echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+ lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2* | *-cegcc*)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $ECHO "\
+ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ case \" \$* \" in
+ *\\ --lt-*)
+ for lt_wr_arg
+ do
+ case \$lt_wr_arg in
+ --lt-*) ;;
+ *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+ esac
+ shift
+ done ;;
+ esac
+ func_exec_program_core \${1+\"\$@\"}
+}
+
+ # Parse options
+ func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+ if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+ # special case for '.'
+ if test \"\$thisdir\" = \".\"; then
+ thisdir=\`pwd\`
+ fi
+ # remove .libs from thisdir
+ case \"\$thisdir\" in
+ *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+ $objdir ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $ECHO "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" ||
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $MKDIR \"\$progdir\"
+ else
+ $RM \"\$progdir/\$file\"
+ fi"
+
+ $ECHO "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $ECHO \"\$relink_command_output\" >&2
+ $RM \"\$progdir/\$file\"
+ exit 1
+ fi
+ fi
+
+ $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $RM \"\$progdir/\$program\";
+ $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $RM \"\$progdir/\$file\"
+ fi"
+ else
+ $ECHO "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $ECHO "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # fixup the dll searchpath if we need to.
+ #
+ # Fix the DLL searchpath if we need to. Do this before prepending
+ # to shlibpath, because on Windows, both are PATH and uninstalled
+ # libraries must come first.
+ if test -n "$dllsearchpath"; then
+ $ECHO "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $ECHO "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ $ECHO "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+ func_exec_program \${1+\"\$@\"}
+ fi
+ else
+ # The program doesn't exist.
+ \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+ \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+ \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit 1
+ fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+ cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+*/
+EOF
+ cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+# include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+# define _INTPTR_T_DEFINED
+# define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+# define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+# define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+ cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ func_to_host_path "$temp_rpath"
+ cat <<EOF
+const char * LIB_PATH_VALUE = "$func_to_host_path_result";
+EOF
+ else
+ cat <<"EOF"
+const char * LIB_PATH_VALUE = "";
+EOF
+ fi
+
+ if test -n "$dllsearchpath"; then
+ func_to_host_path "$dllsearchpath:"
+ cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE = "$func_to_host_path_result";
+EOF
+ else
+ cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE = "";
+EOF
+ fi
+
+ if test "$fast_install" = yes; then
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+ else
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+ fi
+
+
+ cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int newargc;
+ char *tmp_pathspec;
+ char *actual_cwrapper_path;
+ char *actual_cwrapper_name;
+ char *target_name;
+ char *lt_argv_zero;
+ intptr_t rval = 127;
+
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ newargz = XMALLOC (char *, argc + 1);
+
+ /* very simple arg parsing; don't want to rely on getopt
+ * also, copy all non cwrapper options to newargz, except
+ * argz[0], which is handled differently
+ */
+ newargc=0;
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp (argv[i], dumpscript_opt) == 0)
+ {
+EOF
+ case "$host" in
+ *mingw* | *cygwin* )
+ # make stdout use "unix" line endings
+ echo " setmode(1,_O_BINARY);"
+ ;;
+ esac
+
+ cat <<"EOF"
+ lt_dump_script (stdout);
+ return 0;
+ }
+ if (strcmp (argv[i], debug_opt) == 0)
+ {
+ lt_debug = 1;
+ continue;
+ }
+ if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+ {
+ /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+ namespace, but it is not one of the ones we know about and
+ have already dealt with, above (inluding dump-script), then
+ report an error. Otherwise, targets might begin to believe
+ they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+ namespace. The first time any user complains about this, we'll
+ need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+ or a configure.ac-settable value.
+ */
+ lt_fatal (__FILE__, __LINE__,
+ "unrecognized %s option: '%s'",
+ ltwrapper_option_prefix, argv[i]);
+ }
+ /* otherwise ... */
+ newargz[++newargc] = xstrdup (argv[i]);
+ }
+ newargz[++newargc] = NULL;
+
+EOF
+ cat <<EOF
+ /* The GNU banner must be the first non-error debug message */
+ lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+ cat <<"EOF"
+ lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+ tmp_pathspec = find_executable (argv[0]);
+ if (tmp_pathspec == NULL)
+ lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (before symlink chase) at: %s\n",
+ tmp_pathspec);
+
+ actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (after symlink chase) at: %s\n",
+ actual_cwrapper_path);
+ XFREE (tmp_pathspec);
+
+ actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+ strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+ /* wrapper name transforms */
+ strendzap (actual_cwrapper_name, ".exe");
+ tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+ XFREE (actual_cwrapper_name);
+ actual_cwrapper_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ /* target_name transforms -- use actual target program name; might have lt- prefix */
+ target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+ strendzap (target_name, ".exe");
+ tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+ XFREE (target_name);
+ target_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) libtool target name: %s\n",
+ target_name);
+EOF
+
+ cat <<EOF
+ newargz[0] =
+ XMALLOC (char, (strlen (actual_cwrapper_path) +
+ strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+ strcpy (newargz[0], actual_cwrapper_path);
+ strcat (newargz[0], "$objdir");
+ strcat (newargz[0], "/");
+EOF
+
+ cat <<"EOF"
+ /* stop here, and copy so we don't have to do this twice */
+ tmp_pathspec = xstrdup (newargz[0]);
+
+ /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+ strcat (newargz[0], actual_cwrapper_name);
+
+ /* DO want the lt- prefix here if it exists, so use target_name */
+ lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+ XFREE (tmp_pathspec);
+ tmp_pathspec = NULL;
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ {
+ char* p;
+ while ((p = strchr (newargz[0], '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ }
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+ XFREE (target_name);
+ XFREE (actual_cwrapper_path);
+ XFREE (actual_cwrapper_name);
+
+ lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+ lt_setenv ("DUALCASE", "1"); /* for MSK sh */
+ /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must
+ be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+ because on Windows, both *_VARNAMEs are PATH but uninstalled
+ libraries must come first. */
+ lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+ lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+ lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+ nonnull (lt_argv_zero));
+ for (i = 0; i < newargc; i++)
+ {
+ lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+ i, nonnull (newargz[i]));
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ /* execv doesn't actually work on mingw as expected on unix */
+ newargz = prepare_spawn (newargz);
+ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+ if (rval == -1)
+ {
+ /* failed to start process */
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) failed to launch target \"%s\": %s\n",
+ lt_argv_zero, nonnull (strerror (errno)));
+ return 127;
+ }
+ return rval;
+EOF
+ ;;
+ *)
+ cat <<"EOF"
+ execv (lt_argv_zero, newargz);
+ return rval; /* =127, but avoids unused variable warning */
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void *p = (void *) malloc (num);
+ if (!p)
+ lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+ string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return base;
+}
+
+int
+check_executable (const char *path)
+{
+ struct stat st;
+
+ lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+ nonempty (path));
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0)
+ && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+ return 1;
+ else
+ return 0;
+}
+
+int
+make_executable (const char *path)
+{
+ int rval = 0;
+ struct stat st;
+
+ lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+ nonempty (path));
+ if ((!path) || (!*path))
+ return 0;
+
+ if (stat (path, &st) >= 0)
+ {
+ rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+ }
+ return rval;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise
+ Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+ int has_slash = 0;
+ const char *p;
+ const char *p_next;
+ /* static buffer for getcwd */
+ char tmp[LT_PATHMAX + 1];
+ int tmp_len;
+ char *concat_name;
+
+ lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+ nonempty (wrapper));
+
+ if ((wrapper == NULL) || (*wrapper == '\0'))
+ return NULL;
+
+ /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+ else
+ {
+#endif
+ if (IS_DIR_SEPARATOR (wrapper[0]))
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ }
+#endif
+
+ for (p = wrapper; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = 1;
+ break;
+ }
+ if (!has_slash)
+ {
+ /* no slashes; search PATH */
+ const char *path = getenv ("PATH");
+ if (path != NULL)
+ {
+ for (p = path; *p; p = p_next)
+ {
+ const char *q;
+ size_t p_len;
+ for (q = p; *q; q++)
+ if (IS_PATH_SEPARATOR (*q))
+ break;
+ p_len = q - p;
+ p_next = (*q == '\0' ? q : q + 1);
+ if (p_len == 0)
+ {
+ /* empty path: current directory */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
+ tmp_len = strlen (tmp);
+ concat_name =
+ XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+ }
+ else
+ {
+ concat_name =
+ XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, wrapper);
+ }
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+ }
+ /* not found in PATH; assume curdir */
+ }
+ /* Relative path | not found in path: prepend cwd */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
+ tmp_len = strlen (tmp);
+ concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+ return xstrdup (pathspec);
+#else
+ char buf[LT_PATHMAX];
+ struct stat s;
+ char *tmp_pathspec = xstrdup (pathspec);
+ char *p;
+ int has_symlinks = 0;
+ while (strlen (tmp_pathspec) && !has_symlinks)
+ {
+ lt_debugprintf (__FILE__, __LINE__,
+ "checking path component for symlinks: %s\n",
+ tmp_pathspec);
+ if (lstat (tmp_pathspec, &s) == 0)
+ {
+ if (S_ISLNK (s.st_mode) != 0)
+ {
+ has_symlinks = 1;
+ break;
+ }
+
+ /* search backwards for last DIR_SEPARATOR */
+ p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+ while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+ p--;
+ if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+ {
+ /* no more DIR_SEPARATORS left */
+ break;
+ }
+ *p = '\0';
+ }
+ else
+ {
+ lt_fatal (__FILE__, __LINE__,
+ "error accessing file \"%s\": %s",
+ tmp_pathspec, nonnull (strerror (errno)));
+ }
+ }
+ XFREE (tmp_pathspec);
+
+ if (!has_symlinks)
+ {
+ return xstrdup (pathspec);
+ }
+
+ tmp_pathspec = realpath (pathspec, buf);
+ if (tmp_pathspec == 0)
+ {
+ lt_fatal (__FILE__, __LINE__,
+ "could not follow symlinks for %s", pathspec);
+ }
+ return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert (str != NULL);
+ assert (pat != NULL);
+
+ len = strlen (str);
+ patlen = strlen (pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp (str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+ va_list args;
+ if (lt_debug)
+ {
+ (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+ va_start (args, fmt);
+ (void) vfprintf (stderr, fmt, args);
+ va_end (args);
+ }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+ int line, const char *mode,
+ const char *message, va_list ap)
+{
+ fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+ va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+ return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+ return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_setenv) setting '%s' to '%s'\n",
+ nonnull (name), nonnull (value));
+ {
+#ifdef HAVE_SETENV
+ /* always make a copy, for consistency with !HAVE_SETENV */
+ char *str = xstrdup (value);
+ setenv (name, str, 1);
+#else
+ int len = strlen (name) + 1 + strlen (value) + 1;
+ char *str = XMALLOC (char, len);
+ sprintf (str, "%s=%s", name, value);
+ if (putenv (str) != EXIT_SUCCESS)
+ {
+ XFREE (str);
+ }
+#endif
+ }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+ char *new_value;
+ if (orig_value && *orig_value)
+ {
+ int orig_value_len = strlen (orig_value);
+ int add_len = strlen (add);
+ new_value = XMALLOC (char, add_len + orig_value_len + 1);
+ if (to_end)
+ {
+ strcpy (new_value, orig_value);
+ strcpy (new_value + orig_value_len, add);
+ }
+ else
+ {
+ strcpy (new_value, add);
+ strcpy (new_value + add_len, orig_value);
+ }
+ }
+ else
+ {
+ new_value = xstrdup (add);
+ }
+ return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
+
+ if (name && *name && value && *value)
+ {
+ char *new_value = lt_extend_str (getenv (name), value, 0);
+ /* some systems can't cope with a ':'-terminated path #' */
+ int len = strlen (new_value);
+ while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+ {
+ new_value[len-1] = '\0';
+ }
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
+
+ if (name && *name && value && *value)
+ {
+ char *new_value = lt_extend_str (getenv (name), value, 0);
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ }
+}
+
+EOF
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Win32 CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+ size_t argc;
+ char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = XMALLOC (char *, argc + 1);
+
+ /* Put quoted arguments into the new argument vector. */
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ if (string[0] == '\0')
+ new_argv[i] = xstrdup ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+ char *quoted_string;
+ char *p;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ quoted_string = XMALLOC (char, length + 1);
+
+ p = quoted_string;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p = '\0';
+
+ new_argv[i] = quoted_string;
+ }
+ else
+ new_argv[i] = (char *) string;
+ }
+ new_argv[argc] = NULL;
+
+ return new_argv;
+}
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+ func_emit_wrapper yes |
+ $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/ fputs ("\1", f);/p
+g
+D'
+ cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+ $opt_debug
+ case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+ *import*) : ;;
+ *) false ;;
+ esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+ $opt_debug
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args=$nonopt
+ base_compile="$nonopt $@"
+ compile_command=$nonopt
+ finalize_command=$nonopt
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+ new_inherited_linker_flags=
+
+ avoid_version=no
+ bindir=
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+ weak_libs=
+ single_module="${wl}-single_module"
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -shared)
+ test "$build_libtool_libs" != yes && \
+ func_fatal_configuration "can not build a shared library"
+ build_old_libs=no
+ break
+ ;;
+ -all-static | -static | -static-libtool-libs)
+ case $arg in
+ -all-static)
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ func_warning "complete static linking is impossible in this configuration"
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ -static)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ ;;
+ -static-libtool-libs)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ esac
+ build_libtool_libs=no
+ build_old_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg="$1"
+ shift
+ func_quote_for_eval "$arg"
+ qarg=$func_quote_for_eval_unquoted_result
+ func_append libtool_args " $func_quote_for_eval_result"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ func_append compile_command " @OUTPUT@"
+ func_append finalize_command " @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ bindir)
+ bindir="$arg"
+ prev=
+ continue
+ ;;
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ func_append compile_command " @SYMFILE@"
+ func_append finalize_command " @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ func_append dlfiles " $arg"
+ else
+ func_append dlprefiles " $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ test -f "$arg" \
+ || func_fatal_error "symbol file \`$arg' does not exist"
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ framework)
+ case $host in
+ *-*-darwin*)
+ case "$deplibs " in
+ *" $qarg.ltframework "*) ;;
+ *) func_append deplibs " $qarg.ltframework" # this is fixed later
+ ;;
+ esac
+ ;;
+ esac
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat "$save_arg"`
+ do
+# func_append moreargs " $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if func_lalib_unsafe_p "$arg"; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ func_source "$arg"
+
+ if test -z "$pic_object" ||
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none &&
+ test "$non_pic_object" = none; then
+ func_fatal_error "cannot find name of object for \`$arg'"
+ fi
+
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir="$func_dirname_result"
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ func_append dlfiles " $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ func_append dlprefiles " $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ func_append libobjs " $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ func_append non_pic_objects " $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if $opt_dry_run; then
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir="$func_dirname_result"
+
+ func_lo2o "$arg"
+ pic_object=$xdir$objdir/$func_lo2o_result
+ non_pic_object=$xdir$func_lo2o_result
+ func_append libobjs " $pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ else
+ func_fatal_error "\`$arg' is not a valid libtool object"
+ fi
+ fi
+ done
+ else
+ func_fatal_error "link input file \`$arg' does not exist"
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ func_fatal_error "only absolute run-paths are allowed"
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) func_append rpath " $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) func_append xrpath " $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ weak)
+ func_append weak_libs " $arg"
+ prev=
+ continue
+ ;;
+ xcclinker)
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xcompiler)
+ func_append compiler_flags " $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xlinker)
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $wl$qarg"
+ prev=
+ func_append compile_command " $wl$qarg"
+ func_append finalize_command " $wl$qarg"
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ # See comment for -static flag below, for more details.
+ func_append compile_command " $link_static_flag"
+ func_append finalize_command " $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -bindir)
+ prev=bindir
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ func_fatal_error "more than one -exported-symbols argument is not allowed"
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework)
+ prev=framework
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ func_stripname "-L" '' "$arg"
+ if test -z "$func_stripname_result"; then
+ if test "$#" -gt 0; then
+ func_fatal_error "require no space between \`-L' and \`$1'"
+ else
+ func_fatal_error "need path for \`-L' option"
+ fi
+ fi
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ test -z "$absdir" && \
+ func_fatal_error "cannot determine absolute directory name of \`$dir'"
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "* | *" $arg "*)
+ # Will only happen for absolute or sysroot arguments
+ ;;
+ *)
+ # Preserve sysroot, but never include relative directories
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+ *) func_append deplibs " -L$dir" ;;
+ esac
+ func_append lib_search_path " $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ ::) dllsearchpath=$dir;;
+ *) func_append dllsearchpath ":$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) func_append dllsearchpath ":$testbindir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ func_append deplibs " System.ltframework"
+ continue
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ test "X$arg" = "X-lc" && continue
+ ;;
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ func_append deplibs " $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ # Darwin uses the -arch flag to determine output architecture.
+ -model|-arch|-isysroot|--sysroot)
+ func_append compiler_flags " $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ prev=xcompiler
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ func_append compiler_flags " $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
+ esac
+ continue
+ ;;
+
+ -multi_module)
+ single_module="${wl}-multi_module"
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # and Darwin in order for the loader to find any dlls it needs.
+ func_warning "\`-no-install' is ignored for $host"
+ func_warning "assuming \`-no-fast-install' instead"
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ func_stripname '-R' '' "$arg"
+ dir=$func_stripname_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ =*)
+ func_stripname '=' '' "$dir"
+ dir=$lt_sysroot$func_stripname_result
+ ;;
+ *)
+ func_fatal_error "only absolute run-paths are allowed"
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) func_append xrpath " $dir" ;;
+ esac
+ continue
+ ;;
+
+ -shared)
+ # The effects of -shared are defined in a previous loop.
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -static | -static-libtool-libs)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -weak)
+ prev=weak
+ continue
+ ;;
+
+ -Wc,*)
+ func_stripname '-Wc,' '' "$arg"
+ args=$func_stripname_result
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ func_quote_for_eval "$flag"
+ func_append arg " $func_quote_for_eval_result"
+ func_append compiler_flags " $func_quote_for_eval_result"
+ done
+ IFS="$save_ifs"
+ func_stripname ' ' '' "$arg"
+ arg=$func_stripname_result
+ ;;
+
+ -Wl,*)
+ func_stripname '-Wl,' '' "$arg"
+ args=$func_stripname_result
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ func_quote_for_eval "$flag"
+ func_append arg " $wl$func_quote_for_eval_result"
+ func_append compiler_flags " $wl$func_quote_for_eval_result"
+ func_append linker_flags " $func_quote_for_eval_result"
+ done
+ IFS="$save_ifs"
+ func_stripname ' ' '' "$arg"
+ arg=$func_stripname_result
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # -msg_* for osf cc
+ -msg_*)
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ ;;
+
+ # Flags to be passed through unchanged, with rationale:
+ # -64, -mips[0-9] enable 64-bit mode for the SGI compiler
+ # -r[0-9][0-9]* specify processor for the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+ # +DA*, +DD* enable 64-bit mode for the HP compiler
+ # -q* compiler args for the IBM compiler
+ # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+ # -F/path path to uninstalled frameworks, gcc on darwin
+ # -p, -pg, --coverage, -fprofile-* profiling flags for GCC
+ # @file GCC response files
+ # -tp=* Portland pgcc target processor selection
+ # --sysroot=* for sysroot support
+ # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+ -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ func_append compiler_flags " $arg"
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ ;;
+
+ *.$objext)
+ # A standard object.
+ func_append objs " $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if func_lalib_unsafe_p "$arg"; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ func_source "$arg"
+
+ if test -z "$pic_object" ||
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none &&
+ test "$non_pic_object" = none; then
+ func_fatal_error "cannot find name of object for \`$arg'"
+ fi
+
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir="$func_dirname_result"
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ func_append dlfiles " $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ func_append dlprefiles " $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ func_append libobjs " $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ func_append non_pic_objects " $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if $opt_dry_run; then
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir="$func_dirname_result"
+
+ func_lo2o "$arg"
+ pic_object=$xdir$objdir/$func_lo2o_result
+ non_pic_object=$xdir$func_lo2o_result
+ func_append libobjs " $pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ else
+ func_fatal_error "\`$arg' is not a valid libtool object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ func_append deplibs " $arg"
+ func_append old_deplibs " $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ func_resolve_sysroot "$arg"
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ func_append dlfiles " $func_resolve_sysroot_result"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ func_append dlprefiles " $func_resolve_sysroot_result"
+ prev=
+ else
+ func_append deplibs " $func_resolve_sysroot_result"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ func_quote_for_eval "$arg"
+ arg="$func_quote_for_eval_result"
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ fi
+ done # argument parsing loop
+
+ test -n "$prev" && \
+ func_fatal_help "the \`$prevarg' option requires an argument"
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ func_basename "$output"
+ outputname="$func_basename_result"
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ func_dirname "$output" "/" ""
+ output_objdir="$func_dirname_result$objdir"
+ func_to_tool_file "$output_objdir/"
+ tool_output_objdir=$func_to_tool_file_result
+ # Create the object directory.
+ func_mkdir_p "$output_objdir"
+
+ # Determine the type of output
+ case $output in
+ "")
+ func_fatal_help "you must specify an output file"
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if $opt_preserve_dup_deps ; then
+ case "$libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append libs " $deplib"
+ done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if $opt_duplicate_compiler_generated_deps; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+ esac
+ func_append pre_post_deps " $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ notinst_path= # paths that contain not-installed libtool libraries
+
+ case $linkmode in
+ lib)
+ passes="conv dlpreopen link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+
+ for pass in $passes; do
+ # The preopen pass in lib mode reverses $deplibs; put it back here
+ # so that -L comes before libs that need it for instance...
+ if test "$linkmode,$pass" = "lib,link"; then
+ ## FIXME: Find the place where the list is rebuilt in the wrong
+ ## order, and fix it there properly
+ tmp_deplibs=
+ for deplib in $deplibs; do
+ tmp_deplibs="$deplib $tmp_deplibs"
+ done
+ deplibs="$tmp_deplibs"
+ fi
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan"; then
+ libs="$deplibs"
+ deplibs=
+ fi
+ if test "$linkmode" = prog; then
+ case $pass in
+ dlopen) libs="$dlfiles" ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test "$linkmode,$pass" = "lib,dlpreopen"; then
+ # Collect and forward deplibs of preopened libtool libs
+ for lib in $dlprefiles; do
+ # Ignore non-libtool-libs
+ dependency_libs=
+ func_resolve_sysroot "$lib"
+ case $lib in
+ *.la) func_source "$func_resolve_sysroot_result" ;;
+ esac
+
+ # Collect preopened libtool deplibs, except any this library
+ # has declared as weak libs
+ for deplib in $dependency_libs; do
+ func_basename "$deplib"
+ deplib_base=$func_basename_result
+ case " $weak_libs " in
+ *" $deplib_base "*) ;;
+ *) func_append deplibs " $deplib" ;;
+ esac
+ done
+ done
+ libs="$dlprefiles"
+ fi
+ if test "$pass" = dlopen; then
+ # Collect dlpreopened libraries
+ save_deplibs="$deplibs"
+ deplibs=
+ fi
+
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ func_append compiler_flags " $deplib"
+ if test "$linkmode" = lib ; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
+ esac
+ fi
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ func_warning "\`-l' is ignored for archives/objects"
+ continue
+ fi
+ func_stripname '-l' '' "$deplib"
+ name=$func_stripname_result
+ if test "$linkmode" = lib; then
+ searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+ else
+ searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+ fi
+ for searchdir in $searchdirs; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}${search_ext}"
+ if test -f "$lib"; then
+ if test "$search_ext" = ".la"; then
+ found=yes
+ else
+ found=no
+ fi
+ break 2
+ fi
+ done
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ else # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if func_lalib_p "$lib"; then
+ library_names=
+ old_library=
+ func_source "$lib"
+ for l in $old_library $library_names; do
+ ll="$l"
+ done
+ if test "X$ll" = "X$old_library" ; then # only static version available
+ found=no
+ func_dirname "$lib" "" "."
+ ladir="$func_dirname_result"
+ lib=$ladir/$old_library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ fi
+ ;; # -l
+ *.ltframework)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ if test "$linkmode" = lib ; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
+ esac
+ fi
+ fi
+ continue
+ ;;
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ *)
+ func_warning "\`-L' is ignored for archives/objects"
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ func_stripname '-R' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) func_append xrpath " $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la)
+ func_resolve_sysroot "$deplib"
+ lib=$func_resolve_sysroot_result
+ ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ # Linking convenience modules into shared libraries is allowed,
+ # but linking other static libraries is non-portable.
+ case " $dlpreconveniencelibs " in
+ *" $deplib "*) ;;
+ *)
+ valid_a_lib=no
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method; shift
+ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ valid_a_lib=yes
+ fi
+ ;;
+ pass_all)
+ valid_a_lib=yes
+ ;;
+ esac
+ if test "$valid_a_lib" != yes; then
+ echo
+ $ECHO "*** Warning: Trying to link with static lib archive $deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because the file extensions .$libext of this argument makes me believe"
+ echo "*** that it is just a static archive that I should not use here."
+ else
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the"
+ $ECHO "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ ;;
+ esac
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ elif test "$linkmode" = prog; then
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ func_append newdlprefiles " $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ func_append newdlfiles " $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+ fi
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$lib" \
+ || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+ func_dirname "$lib" "" "."
+ ladir="$func_dirname_result"
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ inherited_linker_flags=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+ avoidtemprpath=
+
+
+ # Read the .la file
+ func_source "$lib"
+
+ # Convert "-framework foo" to "foo.ltframework"
+ if test -n "$inherited_linker_flags"; then
+ tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+ for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+ case " $new_inherited_linker_flags " in
+ *" $tmp_inherited_linker_flag "*) ;;
+ *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+ esac
+ done
+ fi
+ dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && func_append dlfiles " $dlopen"
+ test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ func_fatal_error "cannot find name of link library for \`$lib'"
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ func_append convenience " $ladir/$objdir/$old_library"
+ func_append old_convenience " $ladir/$objdir/$old_library"
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ func_fatal_error "\`$lib' is not a convenience library"
+ fi
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if $opt_preserve_dup_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append tmp_libs " $deplib"
+ done
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ if test -n "$old_library" &&
+ { test "$prefer_static_libs" = yes ||
+ test "$prefer_static_libs,$installed" = "built,no"; }; then
+ linklib=$old_library
+ else
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ fi
+ if test -z "$linklib"; then
+ func_fatal_error "cannot find name of link library for \`$lib'"
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+ fi
+ if test -z "$dlname" ||
+ test "$dlopen_support" != yes ||
+ test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ func_append dlprefiles " $lib $dependency_libs"
+ else
+ func_append newdlfiles " $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ func_warning "cannot determine absolute directory name of \`$ladir'"
+ func_warning "passing it literally to the linker, although it might fail"
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ func_basename "$lib"
+ laname="$func_basename_result"
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ func_warning "library \`$lib' was moved."
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$lt_sysroot$libdir"
+ absdir="$lt_sysroot$libdir"
+ fi
+ test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+ else
+ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ dir="$ladir"
+ absdir="$abs_ladir"
+ # Remove this search path later
+ func_append notinst_path " $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ func_append notinst_path " $abs_ladir"
+ fi
+ fi # $installed = yes
+ func_stripname 'lib' '.la' "$laname"
+ name=$func_stripname_result
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir" && test "$linkmode" = prog; then
+ func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+ fi
+ case "$host" in
+ # special handling for platforms with PE-DLLs.
+ *cygwin* | *mingw* | *cegcc* )
+ # Linker will automatically link against shared library if both
+ # static and shared are present. Therefore, ensure we extract
+ # symbols from the import library if a shared library is present
+ # (otherwise, the dlopen module name will be incorrect). We do
+ # this by putting the import library name into $newdlprefiles.
+ # We recover the dlopen module name by 'saving' the la file
+ # name in a special purpose variable, and (later) extracting the
+ # dlname from the la file.
+ if test -n "$dlname"; then
+ func_tr_sh "$dir/$linklib"
+ eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+ func_append newdlprefiles " $dir/$linklib"
+ else
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ fi
+ ;;
+ * )
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ func_append newdlprefiles " $dir/$dlname"
+ else
+ func_append newdlprefiles " $dir/$linklib"
+ fi
+ ;;
+ esac
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ func_append newlib_search_path " $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if $opt_preserve_dup_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append tmp_libs " $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test "$linkmode,$pass" = "prog,link"; then
+ if test -n "$library_names" &&
+ { { test "$prefer_static_libs" = no ||
+ test "$prefer_static_libs,$installed" = "built,yes"; } ||
+ test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath:" in
+ *"$absdir:"*) ;;
+ *) func_append temp_rpath "$absdir:" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) func_append compile_rpath " $absdir" ;;
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ use_static_libs=$prefer_static_libs
+ if test "$use_static_libs" = built && test "$installed" = yes; then
+ use_static_libs=no
+ fi
+ if test -n "$library_names" &&
+ { test "$use_static_libs" = no || test -z "$old_library"; }; then
+ case $host in
+ *cygwin* | *mingw* | *cegcc*)
+ # No point in relinking DLLs because paths are not encoded
+ func_append notinst_deplibs " $lib"
+ need_relink=no
+ ;;
+ *)
+ if test "$installed" = no; then
+ func_append notinst_deplibs " $lib"
+ need_relink=yes
+ fi
+ ;;
+ esac
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on some
+ # systems (darwin). Don't bleat about dlopened modules though!
+ dlopenmodule=""
+ for dlpremoduletest in $dlprefiles; do
+ if test "X$dlpremoduletest" = "X$lib"; then
+ dlopenmodule="$dlpremoduletest"
+ break
+ fi
+ done
+ if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+ echo
+ if test "$linkmode" = prog; then
+ $ECHO "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $ECHO "*** $linklib is not portable!"
+ fi
+ if test "$linkmode" = lib &&
+ test "$hardcode_into_libs" = yes; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) func_append compile_rpath " $absdir" ;;
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ shift
+ realname="$1"
+ shift
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw* | *cegcc*)
+ func_arith $current - $age
+ major=$func_arith_result
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ func_basename "$soroot"
+ soname="$func_basename_result"
+ func_stripname 'lib' '.dll' "$soname"
+ newlib=libimp-$func_stripname_result.a
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ func_verbose "extracting exported symbol list from \`$soname'"
+ func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ func_verbose "generating import library for \`$soname'"
+ func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$opt_mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ case $host in
+ *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+ *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+ *-*-unixware7*) add_dir="-L$dir" ;;
+ *-*-darwin* )
+ # if the lib is a (non-dlopened) module then we can not
+ # link against it, someone is ignoring the earlier warnings
+ if /usr/bin/file -L $add 2> /dev/null |
+ $GREP ": [^:]* bundle" >/dev/null ; then
+ if test "X$dlopenmodule" != "X$lib"; then
+ $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+ if test -z "$old_library" ; then
+ echo
+ echo "*** And there doesn't seem to be a static archive available"
+ echo "*** The link will probably fail, sorry"
+ else
+ add="$dir/$old_library"
+ fi
+ elif test -n "$old_library"; then
+ add="$dir/$old_library"
+ fi
+ fi
+ esac
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes &&
+ test "$hardcode_direct_absolute" = no; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$absdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ func_append add_dir " -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ func_fatal_configuration "unsupported hardcode properties"
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) func_append compile_shlibpath "$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes &&
+ test "$hardcode_minus_L" != yes &&
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$opt_mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes &&
+ test "$hardcode_direct_absolute" = no; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ add="-l$name"
+ elif test "$hardcode_automatic" = yes; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib" ; then
+ add="$inst_prefix_dir$libdir/$linklib"
+ else
+ add="$libdir/$linklib"
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ func_append add_dir " -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ echo
+ $ECHO "*** Warning: This system can not link to static lib archive $lib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ echo "*** But as you try to build a module library, libtool will still create "
+ echo "*** a static module, that should work as long as the dlopening application"
+ echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes ||
+ test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) func_stripname '-R' '' "$libdir"
+ temp_xrpath=$func_stripname_result
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) func_append xrpath " $temp_xrpath";;
+ esac;;
+ *) func_append temp_deplibs " $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ func_append newlib_search_path " $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ case $deplib in
+ -L*) func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result";;
+ *) func_resolve_sysroot "$deplib" ;;
+ esac
+ if $opt_preserve_dup_deps ; then
+ case "$tmp_libs " in
+ *" $func_resolve_sysroot_result "*)
+ func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+ esac
+ fi
+ func_append tmp_libs " $func_resolve_sysroot_result"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ path=
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ func_resolve_sysroot "$deplib"
+ deplib=$func_resolve_sysroot_result
+ func_dirname "$deplib" "" "."
+ dir=$func_dirname_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ func_warning "cannot determine absolute directory name of \`$dir'"
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if $GREP "^installed=no" $deplib > /dev/null; then
+ case $host in
+ *-*-darwin*)
+ depdepl=
+ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names" ; then
+ for tmp in $deplibrary_names ; do
+ depdepl=$tmp
+ done
+ if test -f "$absdir/$objdir/$depdepl" ; then
+ depdepl="$absdir/$objdir/$depdepl"
+ darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ if test -z "$darwin_install_name"; then
+ darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ fi
+ func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+ func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+ path=
+ fi
+ fi
+ ;;
+ *)
+ path="-L$absdir/$objdir"
+ ;;
+ esac
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ test -z "$libdir" && \
+ func_fatal_error "\`$deplib' is not a valid libtool archive"
+ test "$absdir" != "$libdir" && \
+ func_warning "\`$deplib' seems to be moved"
+
+ path="-L$absdir"
+ fi
+ ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ if test "$pass" = link; then
+ if test "$linkmode" = "prog"; then
+ compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+ finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ fi
+ fi
+ dependency_libs="$newdependency_libs"
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) func_append lib_search_path " $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) func_append tmp_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append tmp_libs " $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs ; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=""
+ ;;
+ esac
+ if test -n "$i" ; then
+ func_append tmp_libs " $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ fi
+ if test "$linkmode" = prog || test "$linkmode" = lib; then
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ func_warning "\`-dlopen' is ignored for archives"
+ fi
+
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ func_warning "\`-l' and \`-L' are ignored for archives" ;;
+ esac
+
+ test -n "$rpath" && \
+ func_warning "\`-rpath' is ignored for archives"
+
+ test -n "$xrpath" && \
+ func_warning "\`-R' is ignored for archives"
+
+ test -n "$vinfo" && \
+ func_warning "\`-version-info/-version-number' is ignored for archives"
+
+ test -n "$release" && \
+ func_warning "\`-release' is ignored for archives"
+
+ test -n "$export_symbols$export_symbols_regex" && \
+ func_warning "\`-export-symbols' is ignored for archives"
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ func_append objs "$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ func_stripname 'lib' '.la' "$outputname"
+ name=$func_stripname_result
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ test "$module" = no && \
+ func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ func_stripname '' '.la' "$outputname"
+ name=$func_stripname_result
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ func_stripname '' '.la' "$outputname"
+ libname=$func_stripname_result
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+ else
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+ $ECHO "*** objects $objs is not portable!"
+ func_append libobjs " $objs"
+ fi
+ fi
+
+ test "$dlself" != no && \
+ func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+ set dummy $rpath
+ shift
+ test "$#" -gt 1 && \
+ func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+ install_libdir="$1"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a `.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ test -n "$vinfo" && \
+ func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+ test -n "$release" && \
+ func_warning "\`-release' is ignored for convenience libraries"
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ shift
+ IFS="$save_ifs"
+
+ test -n "$7" && \
+ func_fatal_help "too many parameters to \`-version-info'"
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major="$1"
+ number_minor="$2"
+ number_revision="$3"
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # which has an extra 1 added just for fun
+ #
+ case $version_type in
+ # correct linux to gnu/linux during the next big refactor
+ darwin|linux|osf|windows|none)
+ func_arith $number_major + $number_minor
+ current=$func_arith_result
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|qnx|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ func_arith $number_major + $number_minor
+ current=$func_arith_result
+ age="$number_minor"
+ revision="$number_minor"
+ lt_irix_increment=no
+ ;;
+ esac
+ ;;
+ no)
+ current="$1"
+ revision="$2"
+ age="$3"
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "CURRENT \`$current' must be a nonnegative integer"
+ func_fatal_error "\`$vinfo' is not valid version information"
+ ;;
+ esac
+
+ case $revision in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "REVISION \`$revision' must be a nonnegative integer"
+ func_fatal_error "\`$vinfo' is not valid version information"
+ ;;
+ esac
+
+ case $age in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "AGE \`$age' must be a nonnegative integer"
+ func_fatal_error "\`$vinfo' is not valid version information"
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ func_error "AGE \`$age' is greater than the current interface number \`$current'"
+ func_fatal_error "\`$vinfo' is not valid version information"
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ func_arith $current + 1
+ minor_current=$func_arith_result
+ xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current"
+ ;;
+
+ irix | nonstopux)
+ if test "X$lt_irix_increment" = "Xno"; then
+ func_arith $current - $age
+ else
+ func_arith $current - $age + 1
+ fi
+ major=$func_arith_result
+
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring="$verstring_prefix$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ func_arith $revision - $loop
+ iface=$func_arith_result
+ func_arith $loop - 1
+ loop=$func_arith_result
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux) # correct to gnu/linux during the next big refactor
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ func_arith $current - $loop
+ iface=$func_arith_result
+ func_arith $loop - 1
+ loop=$func_arith_result
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ func_append verstring ":${current}.0"
+ ;;
+
+ qnx)
+ major=".$current"
+ versuffix=".$current"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ func_arith $current - $age
+ major=$func_arith_result
+ versuffix="-$major"
+ ;;
+
+ *)
+ func_fatal_configuration "unknown library version type \`$version_type'"
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ func_warning "undefined symbols not allowed in $host shared libraries"
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+
+ fi
+
+ func_generate_dlsyms "$libname" "$libname" "yes"
+ func_append libobjs " $symfileobj"
+ test "X$libobjs" = "X " && libobjs=
+
+ if test "$opt_mode" != relink; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$ECHO "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext | *.gcno)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+ if test "X$precious_files_regex" != "X"; then
+ if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ func_append removelist " $p"
+ ;;
+ *) ;;
+ esac
+ done
+ test -n "$removelist" && \
+ func_show_eval "${RM}r \$removelist"
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ func_append oldlibs " $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ #for path in $notinst_path; do
+ # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+ # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+ # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+ #done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ func_replace_sysroot "$libdir"
+ func_append temp_xrpath " -R$func_replace_sysroot_result"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) func_append dlfiles " $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) func_append dlprefiles " $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ func_append deplibs " System.ltframework"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ func_append deplibs " -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $opt_dry_run || $RM conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ func_append newdeplibs " $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ func_append newdeplibs " $i"
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which I believe you do not have"
+ echo "*** because a test_compile did reveal that the linker did not use it for"
+ echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ ;;
+ *)
+ func_append newdeplibs " $i"
+ ;;
+ esac
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ func_append newdeplibs " $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ func_append newdeplibs " $i"
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because a test_compile did reveal that the linker did not use this one"
+ echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
+ echo "*** make it link in! You will probably need to install it or some"
+ echo "*** library that it depends on before this library will be fully"
+ echo "*** functional. Installing it before continuing would be even better."
+ fi
+ ;;
+ *)
+ func_append newdeplibs " $i"
+ ;;
+ esac
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method; shift
+ file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ for a_deplib in $deplibs; do
+ case $a_deplib in
+ -l*)
+ func_stripname -l '' "$a_deplib"
+ name=$func_stripname_result
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ func_append newdeplibs " $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ if test -n "$file_magic_glob"; then
+ libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+ else
+ libnameglob=$libname
+ fi
+ test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ if test "$want_nocaseglob" = yes; then
+ shopt -s nocaseglob
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ $nocaseglob
+ else
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ fi
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null |
+ $GREP " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+ $SED -e 10q |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ func_append newdeplibs " $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $ECHO "*** with $libname and none of the candidates passed a file format test"
+ $ECHO "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ ;;
+ *)
+ # Add a -L argument.
+ func_append newdeplibs " $a_deplib"
+ ;;
+ esac
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method; shift
+ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ for a_deplib in $deplibs; do
+ case $a_deplib in
+ -l*)
+ func_stripname -l '' "$a_deplib"
+ name=$func_stripname_result
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ func_append newdeplibs " $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib="$potent_lib" # see symlink-check above in file_magic test
+ if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+ $EGREP "$match_pattern_regex" > /dev/null; then
+ func_append newdeplibs " $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $ECHO "*** with $libname and none of the candidates passed a file format test"
+ $ECHO "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ ;;
+ *)
+ # Add a -L argument.
+ func_append newdeplibs " $a_deplib"
+ ;;
+ esac
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ for i in $predeps $postdeps ; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+ done
+ fi
+ case $tmp_deplibs in
+ *[!\ \ ]*)
+ echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ ;;
+ esac
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library with the System framework
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ echo
+ echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
+ echo "*** a static module, that should work as long as the dlopening"
+ echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ echo "*** The inter-library dependencies that have been dropped here will be"
+ echo "*** automatically added whenever a program is linked with this library"
+ echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ echo
+ echo "*** Since this library must not contain undefined symbols,"
+ echo "*** because either the platform does not support them or"
+ echo "*** it was explicitly requested with -no-undefined,"
+ echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+ case $host in
+ *-*-darwin*)
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ ;;
+ esac
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $deplibs " in
+ *" -L$path/$objdir "*)
+ func_append new_libs " -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ done
+ deplibs="$new_libs"
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ # Remove ${wl} instances when linking with ld.
+ # FIXME: should test the right _cmds variable.
+ case $archive_cmds in
+ *\$LD\ *) wl= ;;
+ esac
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ func_replace_sysroot "$libdir"
+ libdir=$func_replace_sysroot_result
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append dep_rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append perm_rpath " $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ shift
+ realname="$1"
+ shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib="$output_objdir/$realname"
+ linknames=
+ for link
+ do
+ func_append linknames " $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ test "X$libobjs" = "X " && libobjs=
+
+ delfiles=
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+ export_symbols="$output_objdir/$libname.uexp"
+ func_append delfiles " $export_symbols"
+ fi
+
+ orig_export_symbols=
+ case $host_os in
+ cygwin* | mingw* | cegcc*)
+ if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+ # exporting using user supplied symfile
+ if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+ # and it's NOT already a .def file. Must figure out
+ # which of the given symbols are data symbols and tag
+ # them as such. So, trigger use of export_symbols_cmds.
+ # export_symbols gets reassigned inside the "prepare
+ # the list of exported symbols" if statement, so the
+ # include_expsyms logic still works.
+ orig_export_symbols="$export_symbols"
+ export_symbols=
+ always_export_symbols=yes
+ fi
+ fi
+ ;;
+ esac
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ func_verbose "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $opt_dry_run || $RM $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd1 in $cmds; do
+ IFS="$save_ifs"
+ # Take the normal branch if the nm_file_list_spec branch
+ # doesn't work or if tool conversion is not needed.
+ case $nm_file_list_spec~$to_tool_file_cmd in
+ *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+ try_normal_branch=yes
+ eval cmd=\"$cmd1\"
+ func_len " $cmd"
+ len=$func_len_result
+ ;;
+ *)
+ try_normal_branch=no
+ ;;
+ esac
+ if test "$try_normal_branch" = yes \
+ && { test "$len" -lt "$max_cmd_len" \
+ || test "$max_cmd_len" -le -1; }
+ then
+ func_show_eval "$cmd" 'exit $?'
+ skipped_export=false
+ elif test -n "$nm_file_list_spec"; then
+ func_basename "$output"
+ output_la=$func_basename_result
+ save_libobjs=$libobjs
+ save_output=$output
+ output=${output_objdir}/${output_la}.nm
+ func_to_tool_file "$output"
+ libobjs=$nm_file_list_spec$func_to_tool_file_result
+ func_append delfiles " $output"
+ func_verbose "creating $NM input file list: $output"
+ for obj in $save_libobjs; do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > "$output"
+ eval cmd=\"$cmd1\"
+ func_show_eval "$cmd" 'exit $?'
+ output=$save_output
+ libobjs=$save_libobjs
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ func_verbose "using reloadable object file for export list..."
+ skipped_export=:
+ # Break out early, otherwise skipped_export may be
+ # set to false by a later but shorter cmd.
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ tmp_export_symbols="$export_symbols"
+ test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+ fi
+
+ if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+ # The given exports_symbols file has to be filtered, so filter it.
+ func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+ # FIXME: $output_objdir/$libname.filter potentially contains lots of
+ # 's' commands which not all seds can handle. GNU sed should be fine
+ # though. Also, the filter scales superlinearly with the number of
+ # global variables. join(1) would be nice here, but unfortunately
+ # isn't a blessed tool.
+ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+ export_symbols=$output_objdir/$libname.def
+ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ func_append tmp_deplibs " $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec" &&
+ test "$compiler_needs_object" = yes &&
+ test -z "$libobjs"; then
+ # extract the archives, so we have objects to list.
+ # TODO: could optimize this to just extract one archive.
+ whole_archive_flag_spec=
+ fi
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ test "X$libobjs" = "X " && libobjs=
+ else
+ gentop="$output_objdir/${outputname}x"
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $convenience
+ func_append libobjs " $func_extract_archives_result"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ func_append linker_flags " $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$opt_mode" = relink; then
+ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test "X$skipped_export" != "X:" &&
+ func_len " $test_cmds" &&
+ len=$func_len_result &&
+ test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise
+ # or, if using GNU ld and skipped_export is not :, use a linker
+ # script.
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+ func_basename "$output"
+ output_la=$func_basename_result
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ last_robj=
+ k=1
+
+ if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+ output=${output_objdir}/${output_la}.lnkscript
+ func_verbose "creating GNU ld script: $output"
+ echo 'INPUT (' > $output
+ for obj in $save_libobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ echo ')' >> $output
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$func_to_tool_file_result
+ elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+ output=${output_objdir}/${output_la}.lnk
+ func_verbose "creating linker input file list: $output"
+ : > $output
+ set x $save_libobjs
+ shift
+ firstobj=
+ if test "$compiler_needs_object" = yes; then
+ firstobj="$1 "
+ shift
+ fi
+ for obj
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+ else
+ if test -n "$save_libobjs"; then
+ func_verbose "creating reloadable object files..."
+ output=$output_objdir/$output_la-${k}.$objext
+ eval test_cmds=\"$reload_cmds\"
+ func_len " $test_cmds"
+ len0=$func_len_result
+ len=$len0
+
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ func_len " $obj"
+ func_arith $len + $func_len_result
+ len=$func_arith_result
+ if test "X$objlist" = X ||
+ test "$len" -lt "$max_cmd_len"; then
+ func_append objlist " $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test "$k" -eq 1 ; then
+ # The first file doesn't have a previous command to add.
+ reload_objs=$objlist
+ eval concat_cmds=\"$reload_cmds\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-${k}.$objext
+ func_arith $k + 1
+ k=$func_arith_result
+ output=$output_objdir/$output_la-${k}.$objext
+ objlist=" $obj"
+ func_len " $last_robj"
+ func_arith $len0 + $func_len_result
+ len=$func_arith_result
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+ if test -n "$last_robj"; then
+ eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+ fi
+ func_append delfiles " $output"
+
+ else
+ output=
+ fi
+
+ if ${skipped_export-false}; then
+ func_verbose "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $opt_dry_run || $RM $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+ if test -n "$last_robj"; then
+ eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+ fi
+ fi
+
+ test -n "$save_libobjs" &&
+ func_verbose "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS="$save_ifs"
+ $opt_silent || {
+ func_quote_for_expand "$cmd"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+ $opt_dry_run || eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$opt_mode" = relink; then
+ ( cd "$output_objdir" && \
+ $RM "${realname}T" && \
+ $MV "${realname}U" "$realname" )
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+
+ if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+
+ if ${skipped_export-false}; then
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ tmp_export_symbols="$export_symbols"
+ test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+ fi
+
+ if test -n "$orig_export_symbols"; then
+ # The given exports_symbols file has to be filtered, so filter it.
+ func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+ # FIXME: $output_objdir/$libname.filter potentially contains lots of
+ # 's' commands which not all seds can handle. GNU sed should be fine
+ # though. Also, the filter scales superlinearly with the number of
+ # global variables. join(1) would be nice here, but unfortunately
+ # isn't a blessed tool.
+ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+ export_symbols=$output_objdir/$libname.def
+ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+ fi
+ fi
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+ fi
+
+ if test -n "$delfiles"; then
+ # Append the command to remove temporary files to $cmds.
+ eval cmds=\"\$cmds~\$RM $delfiles\"
+ fi
+
+ # Add any objects from preloaded convenience libraries
+ if test -n "$dlprefiles"; then
+ gentop="$output_objdir/${outputname}x"
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ func_append libobjs " $func_extract_archives_result"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $opt_silent || {
+ func_quote_for_expand "$cmd"
+ eval "func_echo $func_quote_for_expand_result"
+ }
+ $opt_dry_run || eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$opt_mode" = relink; then
+ ( cd "$output_objdir" && \
+ $RM "${realname}T" && \
+ $MV "${realname}U" "$realname" )
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$opt_mode" = relink; then
+ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+ if test -n "$convenience"; then
+ if test -z "$whole_archive_flag_spec"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ func_warning "\`-dlopen' is ignored for objects"
+ fi
+
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ func_warning "\`-l' and \`-L' are ignored for objects" ;;
+ esac
+
+ test -n "$rpath" && \
+ func_warning "\`-rpath' is ignored for objects"
+
+ test -n "$xrpath" && \
+ func_warning "\`-R' is ignored for objects"
+
+ test -n "$vinfo" && \
+ func_warning "\`-version-info' is ignored for objects"
+
+ test -n "$release" && \
+ func_warning "\`-release' is ignored for objects"
+
+ case $output in
+ *.lo)
+ test -n "$objs$old_deplibs" && \
+ func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+ libobj=$output
+ func_lo2o "$libobj"
+ obj=$func_lo2o_result
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $opt_dry_run || $RM $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec and hope we can get by with
+ # turning comma into space..
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+ reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+ else
+ gentop="$output_objdir/${obj}x"
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # If we're not building shared, we need to use non_pic_objs
+ test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ func_execute_cmds "$reload_cmds" 'exit $?'
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ func_execute_cmds "$reload_cmds" 'exit $?'
+ fi
+
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) func_stripname '' '.exe' "$output"
+ output=$func_stripname_result.exe;;
+ esac
+ test -n "$vinfo" && \
+ func_warning "\`-version-info' is ignored for programs"
+
+ test -n "$release" && \
+ func_warning "\`-release' is ignored for programs"
+
+ test "$preload" = yes \
+ && test "$dlopen_support" = unknown \
+ && test "$dlopen_self" = unknown \
+ && test "$dlopen_self_static" = unknown && \
+ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+ ;;
+ esac
+
+ case $host in
+ *-*-darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ # But is supposedly fixed on 10.4 or later (yay!).
+ if test "$tagname" = CXX ; then
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+ 10.[0123])
+ func_append compile_command " ${wl}-bind_at_load"
+ func_append finalize_command " ${wl}-bind_at_load"
+ ;;
+ esac
+ fi
+ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ ;;
+ esac
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $compile_deplibs " in
+ *" -L$path/$objdir "*)
+ func_append new_libs " -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ func_append compile_command " $compile_deplibs"
+ func_append finalize_command " $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append perm_rpath " $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ ::) dllsearchpath=$libdir;;
+ *) func_append dllsearchpath ":$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) func_append dllsearchpath ":$testbindir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_perm_rpath " $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ fi
+
+ func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+ # template prelinking step
+ if test -n "$prelink_cmds"; then
+ func_execute_cmds "$prelink_cmds" 'exit $?'
+ fi
+
+ wrappers_required=yes
+ case $host in
+ *cegcc* | *mingw32ce*)
+ # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+ wrappers_required=no
+ ;;
+ *cygwin* | *mingw* )
+ if test "$build_libtool_libs" != yes; then
+ wrappers_required=no
+ fi
+ ;;
+ *)
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ wrappers_required=no
+ fi
+ ;;
+ esac
+ if test "$wrappers_required" = no; then
+ # Replace the output file specification.
+ compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ exit_status=0
+ func_show_eval "$link_command" 'exit_status=$?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ # Delete the generated files.
+ if test -f "$output_objdir/${outputname}S.${objext}"; then
+ func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+ fi
+
+ exit $exit_status
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $opt_dry_run || $RM $output
+ # Link the executable and exit
+ func_show_eval "$link_command" 'exit $?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ func_warning "this platform does not like uninstalled shared libraries"
+ func_warning "\`$output' will be relinked during installation"
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ func_show_eval "$link_command" 'exit $?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output_objdir/$outputname"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ # Now create the wrapper script.
+ func_verbose "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ func_quote_for_eval "$var_value"
+ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if not in dry run mode.
+ $opt_dry_run || {
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) func_stripname '' '.exe' "$output"
+ output=$func_stripname_result ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ func_stripname '' '.exe' "$outputname"
+ outputname=$func_stripname_result ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ func_dirname_and_basename "$output" "" "."
+ output_name=$func_basename_result
+ output_path=$func_dirname_result
+ cwrappersource="$output_path/$objdir/lt-$output_name.c"
+ cwrapper="$output_path/$output_name.exe"
+ $RM $cwrappersource $cwrapper
+ trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ func_emit_cwrapperexe_src > $cwrappersource
+
+ # The wrapper executable is built using the $host compiler,
+ # because it contains $host paths and files. If cross-
+ # compiling, it, like the target executable, must be
+ # executed on the $host or under an emulation environment.
+ $opt_dry_run || {
+ $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+ $STRIP $cwrapper
+ }
+
+ # Now, create the wrapper script for func_source use:
+ func_ltwrapper_scriptname $cwrapper
+ $RM $func_ltwrapper_scriptname_result
+ trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+ $opt_dry_run || {
+ # note: this script will not be executed, so do not chmod.
+ if test "x$build" = "x$host" ; then
+ $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+ else
+ func_emit_wrapper no > $func_ltwrapper_scriptname_result
+ fi
+ }
+ ;;
+ * )
+ $RM $output
+ trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+ func_emit_wrapper no > $output
+ chmod +x $output
+ ;;
+ esac
+ }
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save $symfileobj"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$old_deplibs $non_pic_objects"
+ if test "$preload" = yes && test -f "$symfileobj"; then
+ func_append oldobjs " $symfileobj"
+ fi
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $addlibs
+ func_append oldobjs " $func_extract_archives_result"
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ cmds=$old_archive_from_new_cmds
+ else
+
+ # Add any objects from preloaded convenience libraries
+ if test -n "$dlprefiles"; then
+ gentop="$output_objdir/${outputname}x"
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ func_append oldobjs " $func_extract_archives_result"
+ fi
+
+ # POSIX demands no paths to be encoded in archives. We have
+ # to avoid creating archives with duplicate basenames if we
+ # might have to extract them afterwards, e.g., when creating a
+ # static archive out of a convenience library, or when linking
+ # the entirety of a libtool archive into another (currently
+ # not supported by libtool).
+ if (for obj in $oldobjs
+ do
+ func_basename "$obj"
+ $ECHO "$func_basename_result"
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ echo "copying selected object files to avoid basename conflicts..."
+ gentop="$output_objdir/${outputname}x"
+ func_append generated " $gentop"
+ func_mkdir_p "$gentop"
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ func_basename "$obj"
+ objbase="$func_basename_result"
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ func_arith $counter + 1
+ counter=$func_arith_result
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ func_append oldobjs " $gentop/$newobj"
+ ;;
+ *) func_append oldobjs " $obj" ;;
+ esac
+ done
+ fi
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
+ eval cmds=\"$old_archive_cmds\"
+
+ func_len " $cmds"
+ len=$func_len_result
+ if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ elif test -n "$archiver_list_spec"; then
+ func_verbose "using command file archive linking..."
+ for obj in $oldobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > $output_objdir/$libname.libcmd
+ func_to_tool_file "$output_objdir/$libname.libcmd"
+ oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ func_verbose "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+ oldobjs=
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ eval test_cmds=\"$old_archive_cmds\"
+ func_len " $test_cmds"
+ len0=$func_len_result
+ len=$len0
+ for obj in $save_oldobjs
+ do
+ func_len " $obj"
+ func_arith $len + $func_len_result
+ len=$func_arith_result
+ func_append objlist " $obj"
+ if test "$len" -lt "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj" ; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ objlist=
+ len=$len0
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test "X$oldobjs" = "X" ; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ func_execute_cmds "$cmds" 'exit $?'
+ done
+
+ test -n "$generated" && \
+ func_show_eval "${RM}r$generated"
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ func_verbose "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ func_quote_for_eval "$var_value"
+ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+ # Only create the output if not a dry run.
+ $opt_dry_run || {
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ func_basename "$deplib"
+ name="$func_basename_result"
+ func_resolve_sysroot "$deplib"
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+ test -z "$libdir" && \
+ func_fatal_error "\`$deplib' is not a valid libtool archive"
+ func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ -L*)
+ func_stripname -L '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -L$func_replace_sysroot_result"
+ ;;
+ -R*)
+ func_stripname -R '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -R$func_replace_sysroot_result"
+ ;;
+ *) func_append newdependency_libs " $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+
+ for lib in $dlfiles; do
+ case $lib in
+ *.la)
+ func_basename "$lib"
+ name="$func_basename_result"
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ test -z "$libdir" && \
+ func_fatal_error "\`$lib' is not a valid libtool archive"
+ func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ *) func_append newdlfiles " $lib" ;;
+ esac
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ *.la)
+ # Only pass preopened files to the pseudo-archive (for
+ # eventual linking with the app. that links it) if we
+ # didn't already link the preopened objects directly into
+ # the library:
+ func_basename "$lib"
+ name="$func_basename_result"
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ test -z "$libdir" && \
+ func_fatal_error "\`$lib' is not a valid libtool archive"
+ func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ esac
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ func_append newdlfiles " $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ func_append newdlprefiles " $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $RM $output
+ # place dlname in correct position for cygwin
+ # In fact, it would be nice if we could use this code for all target
+ # systems that can't hard-code library paths into their executables
+ # and that have no shared library path variable independent of PATH,
+ # but it turns out we can't easily determine that from inspecting
+ # libtool variables, so we have to hard-code the OSs to which it
+ # applies here; at the moment, that means platforms that use the PE
+ # object format with DLL files. See the long comment at the top of
+ # tests/bindir.at for full details.
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+ # If a -bindir argument was supplied, place the dll there.
+ if test "x$bindir" != x ;
+ then
+ func_relative_path "$install_libdir" "$bindir"
+ tdlname=$func_relative_path_result$dlname
+ else
+ # Otherwise fall back on heuristic.
+ tdlname=../bin/$dlname
+ fi
+ ;;
+ esac
+ $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $ECHO >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ }
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+ func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+ $opt_debug
+ RM="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) func_append RM " $arg"; rmforce=yes ;;
+ -*) func_append RM " $arg" ;;
+ *) func_append files " $arg" ;;
+ esac
+ done
+
+ test -z "$RM" && \
+ func_fatal_help "you must specify an RM program"
+
+ rmdirs=
+
+ for file in $files; do
+ func_dirname "$file" "" "."
+ dir="$func_dirname_result"
+ if test "X$dir" = X.; then
+ odir="$objdir"
+ else
+ odir="$dir/$objdir"
+ fi
+ func_basename "$file"
+ name="$func_basename_result"
+ test "$opt_mode" = uninstall && odir="$dir"
+
+ # Remember odir for removal later, being careful to avoid duplicates
+ if test "$opt_mode" = clean; then
+ case " $rmdirs " in
+ *" $odir "*) ;;
+ *) func_append rmdirs " $odir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if { test -L "$file"; } >/dev/null 2>&1 ||
+ { test -h "$file"; } >/dev/null 2>&1 ||
+ test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if func_lalib_p "$file"; then
+ func_source $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ func_append rmfiles " $odir/$n"
+ done
+ test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+ case "$opt_mode" in
+ clean)
+ case " $library_names " in
+ *" $dlname "*) ;;
+ *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+ esac
+ test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if func_lalib_p "$file"; then
+
+ # Read the .lo file
+ func_source $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" &&
+ test "$pic_object" != none; then
+ func_append rmfiles " $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" &&
+ test "$non_pic_object" != none; then
+ func_append rmfiles " $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$opt_mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ func_stripname '' '.exe' "$file"
+ file=$func_stripname_result
+ func_stripname '' '.exe' "$name"
+ noexename=$func_stripname_result
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ func_append rmfiles " $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if func_ltwrapper_p "$file"; then
+ if func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ relink_command=
+ func_source $func_ltwrapper_scriptname_result
+ func_append rmfiles " $func_ltwrapper_scriptname_result"
+ else
+ relink_command=
+ func_source $dir/$noexename
+ fi
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ func_append rmfiles " $odir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ func_append rmfiles " $odir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ func_show_eval "$RM $rmfiles" 'exit_status=1'
+ done
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ func_show_eval "rmdir $dir >/dev/null 2>&1"
+ fi
+ done
+
+ exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+ func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+ help="$generic_help"
+ func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+ func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+ eval exec "$exec_cmd"
+ exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..397ae4a
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,59 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = \
+ppl.m4 \
+ppl_c.m4
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_ciao.m4 \
+ac_check_classpath.m4 \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_zero_length_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_ieee_inexact_flag.m4 \
+ac_cxx_limit_memory.m4 \
+ac_cxx_long_double_binary_format.m4 \
+ac_cxx_plain_char_is_signed.m4 \
+ac_cxx_proper_long_double.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ac_text_md5sum.m4 \
+libtool.m4 \
+ltoptions.m4 \
+ltsugar.m4 \
+ltversion.m4 \
+lt~obsolete.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..e2b24c7
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,637 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(m4datadir)"
+DATA = $(m4data_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = \
+ppl.m4 \
+ppl_c.m4
+
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_ciao.m4 \
+ac_check_classpath.m4 \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_zero_length_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_ieee_inexact_flag.m4 \
+ac_cxx_limit_memory.m4 \
+ac_cxx_long_double_binary_format.m4 \
+ac_cxx_plain_char_is_signed.m4 \
+ac_cxx_proper_long_double.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ac_text_md5sum.m4 \
+libtool.m4 \
+ltoptions.m4 \
+ltsugar.m4 \
+ltversion.m4 \
+lt~obsolete.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-m4dataDATA: $(m4data_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \
+ done
+
+uninstall-m4dataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(m4datadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-m4dataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-m4dataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am \
+ install-m4dataDATA install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-m4dataDATA
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/ac_check_ciao.m4 b/m4/ac_check_ciao.m4
new file mode 100644
index 0000000..265596c
--- /dev/null
+++ b/m4/ac_check_ciao.m4
@@ -0,0 +1,89 @@
+dnl A function to check for the existence and usability of Ciao-Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_CIAO_PROLOG],
+[
+AC_PATH_PROG(ciao_prolog, ciao)
+if test x$ciao_prolog != x
+then
+ # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+ # Use mktemp if possible; otherwise fall back on mkdir,
+ # with $RANDOM to make collisions less likely.
+ : ${TMPDIR=/tmp}
+ {
+ tmp=`
+ (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+ ` &&
+ test -n "$tmp" && test -d "$tmp"
+ } || {
+ tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } || exit $?
+ cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+ ciaolibdir(Lib_Dir),
+ get_os(Os),
+ get_arch(Arch),
+ format("~p/include/~p~p", [[Lib_Dir, Os, Arch]]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+ ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+ rm -rf $tmp
+
+ CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+ AC_LANG_PUSH(C++)
+ AC_CHECK_HEADER(ciao_prolog.h,
+ AC_MSG_CHECKING([for Ciao Prolog version x.y.z or later])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <ciao_prolog.h>
+
+int
+main() {
+ return 0;
+}
+ ]])],
+ AC_MSG_RESULT(yes),
+ ciao_prolog=""
+ AC_MSG_RESULT(no)
+ ),
+ ciao_prolog="")
+
+ dnl Additional version checks could be inserted here, if necessary.
+
+ AC_LANG_POP(C++)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CIAO_PROLOG="$ciao_prolog"
+ AC_SUBST(CIAO_PROLOG)
+ AC_SUBST(CIAO_PROLOG_INCLUDE_OPTIONS)
+ dnl AC_SUBST(CIAO_PROLOG_LD_OPTIONS)
+fi
+
+if test x$ciao_prolog != x
+then
+ have_ciao_prolog=yes
+else
+ have_ciao_prolog=no
+fi
+])
diff --git a/m4/ac_check_classpath.m4 b/m4/ac_check_classpath.m4
new file mode 100644
index 0000000..bfbdda4
--- /dev/null
+++ b/m4/ac_check_classpath.m4
@@ -0,0 +1,63 @@
+##### http://autoconf-archive.cryp.to/ac_check_classpath.html
+#
+# SYNOPSIS
+#
+# AC_CHECK_CLASSPATH
+#
+# DESCRIPTION
+#
+# AC_CHECK_CLASSPATH just displays the CLASSPATH, for the edification
+# of the user.
+#
+# Note: This is part of the set of autoconf M4 macros for Java
+# programs. It is VERY IMPORTANT that you download the whole set,
+# some macros depend on other. Unfortunately, the autoconf archive
+# does not support the concept of set of macros, so I had to break it
+# for submission. The general documentation, as well as the sample
+# configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+# 2000-07-19
+#
+# COPYLEFT
+#
+# Copyright (c) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# As a special exception, the respective Autoconf Macro's copyright
+# owner gives unlimited permission to copy, distribute and modify the
+# configure scripts that are the output of Autoconf when processing
+# the Macro. You need not follow the terms of the GNU General Public
+# License when using or distributing such scripts, even though
+# portions of the text of the Macro appear in them. The GNU General
+# Public License (GPL) does govern all other use of the material that
+# constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the
+# Autoconf Macro released by the Autoconf Macro Archive. When you
+# make and distribute a modified version of the Autoconf Macro, you
+# may extend this special exception to the GPL to apply to your
+# modified version as well.
+
+AC_DEFUN([AC_CHECK_CLASSPATH],[
+if test "x$CLASSPATH" = x; then
+ echo "You have no CLASSPATH, I hope it is good"
+else
+ echo "You have CLASSPATH $CLASSPATH, hope it is correct"
+fi
+])
diff --git a/m4/ac_check_fpu_control.m4 b/m4/ac_check_fpu_control.m4
new file mode 100644
index 0000000..806d2f0
--- /dev/null
+++ b/m4/ac_check_fpu_control.m4
@@ -0,0 +1,145 @@
+dnl A function to check for the possibility to control the FPU.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_FPU_CONTROL],
+[
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADERS([fenv.h ieeefp.h])
+AC_MSG_CHECKING([if it is possible to control the FPU])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if i386
+
+int
+main() {
+ return 0;
+}
+
+#elif defined(HAVE_FENV_H)
+
+# include <fenv.h>
+
+# if !defined(FE_UPWARD) || !defined(FE_DOWNWARD)
+
+ choke me
+
+# elif defined(__arm__) \
+ && (!defined(PPL_ARM_CAN_CONTROL_FPU) || !PPL_ARM_CAN_CONTROL_FPU)
+
+ choke me
+
+#else
+
+ float nf1 = -3, pf1 = 3, f2 = 5;
+ double nd1 = -7, pd1 = 7, d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+ float nf[2], pf[2];
+ double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+ int r = 0;
+ if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+ r |= 1;
+ if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+ r |= 2;
+ if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+ r |= 4;
+ return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+ return fesetround(rounding_mode);
+}
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+int
+main() {
+ if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+ return 255;
+
+ nf[0] = nf1 / f2;
+ nd[0] = nd1 / d2;
+ nl[0] = nl1 / l2;
+ pf[0] = pf1 / f2;
+ pd[0] = pd1 / d2;
+ pl[0] = pl1 / l2;
+
+ if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+ return 255;
+
+ nf[1] = nf1 / f2;
+ nd[1] = nd1 / d2;
+ nl[1] = nl1 / l2;
+ pf[1] = pf1 / f2;
+ pd[1] = pd1 / d2;
+ pl[1] = pl1 / l2;
+
+ return (*ppl_check_function_p)();
+}
+
+# endif
+
+#elif sparc && defined(HAVE_IEEEFP_H)
+
+int
+main() {
+ return 0;
+}
+
+#else
+
+ choke me
+
+#endif
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_can_control_fpu=1,
+ AC_MSG_RESULT(no)
+ ac_cv_can_control_fpu=0,
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#if i386 || (sparc && defined(HAVE_IEEEFP_H))
+
+int
+main() {
+ return 0;
+}
+
+#else
+
+ choke me
+
+#endif
+ ]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_can_control_fpu=1,
+ AC_MSG_RESULT(no)
+ ac_cv_can_control_fpu=0
+ )
+)
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4
new file mode 100644
index 0000000..39b6513
--- /dev/null
+++ b/m4/ac_check_gmp.m4
@@ -0,0 +1,235 @@
+dnl A function to check for the existence and usability of GMP.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_GMP],
+[
+AC_ARG_WITH(gmp,
+ AS_HELP_STRING([--with-gmp=DIR],
+ [search for libgmp/libgmpxx in DIR/include and DIR/lib]))
+
+AC_ARG_WITH(gmp-include,
+ AS_HELP_STRING([--with-gmp-include=DIR],
+ [search for libgmp/libgmpxx headers in DIR]))
+
+AC_ARG_WITH(gmp-lib,
+ AS_HELP_STRING([--with-gmp-lib=DIR],
+ [search for libgmp/libgmpxx library objects in DIR]))
+
+if test -n "$with_gmp"
+then
+ gmp_include_options="-I$with_gmp/include"
+ gmp_library_paths="$with_gmp/lib"
+ gmp_library_options="-L$gmp_library_paths"
+fi
+
+if test -n "$with_gmp_include"
+then
+ gmp_include_options="-I$with_gmp_include"
+fi
+
+if test -n "$with_gmp_lib"
+then
+ gmp_library_paths="$with_gmp_lib"
+ gmp_library_options="-L$gmp_library_paths"
+fi
+
+gmp_libs="-lgmpxx -lgmp"
+
+AC_ARG_WITH(gmp-build,
+ AS_HELP_STRING([--with-gmp-build=DIR],
+ [use a non-installed build of GMP in DIR]),
+ gmp_build_dir=$with_gmp_build
+ if test -n "$with_gmp" \
+ || test -n "$with_gmp_include" || test -n "$with_gmp_lib"
+ then
+ AC_MSG_ERROR([cannot use --with-gmp-build and other --with-gmp* options together])
+ else
+ gmp_srcdir=`echo @abs_srcdir@ | $gmp_build_dir/config.status --file=-`
+ gmp_include_options="-I$gmp_build_dir -I$gmp_build_dir/tune -I$gmp_srcdir"
+ gmp_libs="$gmp_build_dir/libgmp.la $gmp_build_dir/libgmpxx.la"
+ fi)
+
+gmp_library_options="$gmp_library_options $gmp_libs"
+
+if test -n "$with_gmp_build"
+then
+ ac_save_CXX="$CXX"
+ CXX="libtool --mode=link --tag=CXX $CXX"
+fi
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $gmp_include_options"
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $gmp_library_options"
+eval ac_save_shared_library_path="\$$shared_library_path_env_var"
+eval $shared_library_path_env_var=\"$gmp_library_paths:$ac_save_shared_library_path\"
+export $shared_library_path_env_var
+
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([for the GMP library version 4.1.3 or above])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+#include <climits>
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+#ifndef BITS_PER_MP_LIMB
+#define BITS_PER_MP_LIMB GMP_LIMB_BITS
+#endif
+
+int
+main() {
+ std::string header_version;
+ {
+ std::ostringstream s(header_version);
+ s << __GNU_MP_VERSION << "." << __GNU_MP_VERSION_MINOR;
+ // Starting from GMP version 4.3.0, the gmp_version variable
+ // always contains three parts. In previous versions the
+ // patchlevel was omitted if it was 0.
+ if (__GNU_MP_VERSION_PATCHLEVEL != 0
+ || __GNU_MP_VERSION > 4
+ || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 3))
+ s << "." << __GNU_MP_VERSION_PATCHLEVEL;
+ header_version = s.str();
+ }
+
+ std::string library_version = gmp_version;
+
+ if (header_version != library_version) {
+ std::cerr
+ << "GMP header (gmpxx.h) and library (ligmpxx.*) version mismatch:\n"
+ << "header gives " << header_version << ";\n"
+ << "library gives " << library_version << "." << std::endl;
+ return 1;
+ }
+
+ if (sizeof(mp_limb_t)*CHAR_BIT != BITS_PER_MP_LIMB
+ || BITS_PER_MP_LIMB != mp_bits_per_limb) {
+ std::cerr
+ << "GMP header (gmpxx.h) and library (ligmpxx.*) bits-per-limb mismatch:\n"
+ << "header gives " << BITS_PER_MP_LIMB << ";\n"
+ << "library gives " << mp_bits_per_limb << ".\n"
+ << "This probably means you are on a bi-arch system and\n"
+ << "you are compiling with the wrong header or linking with\n"
+ << "the wrong library." << std::endl;
+ return 1;
+ }
+
+ mpz_class n("3141592653589793238462643383279502884");
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_have_gmp=yes,
+ AC_MSG_RESULT(no)
+ ac_cv_have_gmp=no,
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+int
+main() {
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_have_gmp=yes,
+ AC_MSG_RESULT(no)
+ ac_cv_have_gmp=no))
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+AC_CHECK_SIZEOF(mp_limb_t, , [#include <gmpxx.h>])
+
+AC_MSG_CHECKING([whether GMP has been compiled with support for exceptions])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+ throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+ throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+ mp_set_memory_functions(x_malloc, x_realloc, x_free);
+ try {
+ mpz_class n("3141592653589793238462643383279502884");
+ }
+ catch (std::bad_alloc&) {
+ return 0;
+ }
+ return 1;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_gmp_supports_exceptions=yes,
+ AC_MSG_RESULT(no)
+ ac_cv_gmp_supports_exceptions=no,
+ AC_MSG_RESULT([assuming yes])
+ ac_cv_gmp_supports_exceptions=yes)
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_GMP_SUPPORTS_EXCEPTIONS, $value,
+ [Not zero if GMP has been compiled with support for exceptions.])
+
+fi
+
+AC_LANG_POP(C++)
+eval $shared_library_path_env_var=\"$ac_save_shared_library_path\"
+LIBS="$ac_save_LIBS"
+CPPFLAGS="$ac_save_CPPFLAGS"
+
+if test -n "$with_gmp_build"
+then
+ CXX="$ac_save_CXX"
+fi
+])
diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4
new file mode 100644
index 0000000..764e9d7
--- /dev/null
+++ b/m4/ac_check_sicstus_prolog.m4
@@ -0,0 +1,61 @@
+dnl A function to check for the existence and usability of SICStus Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_SICSTUS_PROLOG],
+[
+AC_PATH_PROG(sicstus_prolog, sicstus)
+if test x$sicstus_prolog != x
+then
+ sicstus_prolog_app_dir=`$sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."`
+ sicstus_prolog_base=`dirname $sicstus_prolog_app_dir`
+ SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+ AC_LANG_PUSH(C++)
+ # We require SICStus Prolog 3.9.1 or later.
+ AC_CHECK_HEADER(sicstus/sicstus.h,
+ AC_MSG_CHECKING([for SICStus version 3.9.1 or later])
+ AC_EGREP_CPP(yes,
+ [
+ #include <sicstus/sicstus.h>
+ #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+ yes
+ #endif
+ ],
+ AC_MSG_RESULT(yes),
+ sicstus_prolog=""
+ AC_MSG_RESULT(no)
+ ),
+ sicstus_prolog="")
+ AC_LANG_POP(C++)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ AC_SUBST(SICSTUS_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$sicstus_prolog != x
+then
+ have_sicstus_prolog=yes
+else
+ have_sicstus_prolog=no
+fi
+])
diff --git a/m4/ac_check_swi_prolog.m4 b/m4/ac_check_swi_prolog.m4
new file mode 100644
index 0000000..e6df9b0
--- /dev/null
+++ b/m4/ac_check_swi_prolog.m4
@@ -0,0 +1,109 @@
+dnl A function to check for the existence and usability of SWI-Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_SWI_PROLOG],
+[
+dnl By default, old versions of SWI-Prolog were installed as `pl',
+dnl though some administrators called it `swipl' or `swi-prolog'.
+dnl In particular, on Mac OS X `pl' is the name of another program.
+dnl On Windows, the console version of SWI-Prolog was called `plcon'.
+dnl Since SWI-Prolog 5.9.9, by default and on all systems, the
+dnl interpreter is called `swipl' and `plld' is called `swipl-ld'
+
+AC_PATH_PROG(swi_prolog, swipl$EXEEXT)
+if test -z $swi_prolog
+then
+ AC_PATH_PROG(swi_prolog, swi-prolog$EXEEXT)
+ if test -z $swi_prolog
+ then
+ AC_PATH_PROG(swi_prolog, pl$EXEEXT)
+ if test -z $swi_prolog
+ then
+ AC_PATH_PROG(swi_prolog, plcon$EXEEXT)
+ fi
+ fi
+fi
+if test x$swi_prolog != x
+then
+ swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\([[a-z]]:\)\{0,1\}\(.*\)";.*/\2/'`
+ swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";.*/\1/'`
+ swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";.*/\1/'`
+ swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";.*/\1/'`
+ swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";.*/\1/'`
+
+ dnl Additional version checks could be inserted here, if necessary.
+
+ AC_PATH_PROG(swi_prolog_ld, swipl-ld$EXEEXT)
+ if test -z $swi_prolog_ld
+ then
+ AC_PATH_PROG(swi_prolog_ld, plld$EXEEXT)
+ fi
+
+ # In Fedora, SWI-Prolog.h is installed only in /usr/include/pl, which,
+ # IMHO, is a bug (https://bugzilla.redhat.com/show_bug.cgi?id=471071).
+ SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include -I/usr/include/pl"
+ # If SWI-Prolog was configured with `--disable-libdirversion', then
+ # the files are not in the `${swi_prolog_arch}' subdirectory. Since
+ # currently there is no way to know that, we look in both places.
+ SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} -L${swi_prolog_base}/lib ${swi_prolog_lib} ${swi_prolog_libs}"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+ AC_LANG_PUSH(C++)
+ # We require SWI-Prolog 5.6.0 or later.
+ AC_CHECK_HEADER(SWI-Prolog.h,
+ AC_MSG_CHECKING([for SWI-Prolog version 5.6.0 or later])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+ ]])],
+ AC_MSG_RESULT(yes),
+ swi_prolog=""
+ AC_MSG_RESULT(no)
+ ),
+ swi_prolog="")
+ AC_LANG_POP(C++)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ SWI_PROLOG="$swi_prolog"
+ SWI_PROLOG_LD="$swi_prolog_ld"
+ AC_SUBST(SWI_PROLOG)
+ AC_SUBST(SWI_PROLOG_LD)
+ AC_SUBST(SWI_PROLOG_INCLUDE_OPTIONS)
+ AC_SUBST(SWI_PROLOG_LD_OPTIONS)
+fi
+
+if test x$swi_prolog != x
+then
+ have_swi_prolog=yes
+else
+ have_swi_prolog=no
+fi
+])
diff --git a/m4/ac_check_xsb_prolog.m4 b/m4/ac_check_xsb_prolog.m4
new file mode 100644
index 0000000..c0ff9ad
--- /dev/null
+++ b/m4/ac_check_xsb_prolog.m4
@@ -0,0 +1,50 @@
+dnl A function to check for the existence and usability of XSB Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_XSB_PROLOG],
+[
+AC_PATH_PROG(xsb_prolog, xsb)
+if test x$xsb_prolog != x
+then
+ dnl The foreign language interface include file is `cinterf.h',
+ dnl but this resides in the emulator directory and is not installed
+ dnl in any standard place.
+ xsb_emu_dir=`xsb --nobanner --quietload --noprompt \
+ -e "write('emudir='), \
+ xsb_configuration(emudir, X), write(X), nl, halt." \
+ 2>/dev/null | sed "s/^emudir=//g"`
+ xsb_config_dir=`xsb --nobanner --quietload --noprompt \
+ -e "write('config_dir='), \
+ xsb_configuration(config_dir,X), write(X), nl, halt." \
+ 2>/dev/null | sed "s/^config_dir=//g"`
+ XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+ AC_SUBST(XSB_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$xsb_prolog != x
+then
+ have_xsb_prolog=yes
+else
+ have_xsb_prolog=no
+fi
+])
diff --git a/m4/ac_check_yap.m4 b/m4/ac_check_yap.m4
new file mode 100644
index 0000000..e95665c
--- /dev/null
+++ b/m4/ac_check_yap.m4
@@ -0,0 +1,55 @@
+dnl A function to check for the existence and usability of YAP Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_YAP_PROLOG],
+[
+dnl By default, YAP-Prolog is installed as `yap'.
+AC_PATH_PROG(yap_prolog, yap)
+if test x$yap_prolog != x
+then
+ dnl Additional version checks could be inserted here, if necessary.
+
+ YAP_PROLOG_INCLUDE_OPTIONS=""
+ YAP_PROLOG_LD_OPTIONS="-lYap"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $YAP_PROLOG_INCLUDE_OPTIONS"
+ AC_LANG_PUSH(C++)
+ # Check for YAP's foreign language interface header file.
+ AC_CHECK_HEADER(Yap/c_interface.h,
+ [],
+ yap_prolog="")
+ AC_LANG_POP(C++)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ YAP_PROLOG="$yap_prolog"
+ AC_SUBST(YAP_PROLOG)
+ AC_SUBST(YAP_PROLOG_INCLUDE_OPTIONS)
+ AC_SUBST(YAP_PROLOG_LD_OPTIONS)
+fi
+
+if test x$yap_prolog != x
+then
+ have_yap_prolog=yes
+else
+ have_yap_prolog=no
+fi
+])
diff --git a/m4/ac_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4
new file mode 100644
index 0000000..34e6596
--- /dev/null
+++ b/m4/ac_cxx_attribute_weak.m4
@@ -0,0 +1,59 @@
+dnl A function to check whether the C++ compiler supports the function
+dnl __attribute__ ((weak)).
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_ATTRIBUTE_WEAK],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports __attribute__ ((weak))])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_attribute_weak=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_attribute_weak=no,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_attribute_weak=no)
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK, $value,
+ [Not zero if the C++ compiler supports __attribute__ ((weak)).])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_double_binary_format.m4 b/m4/ac_cxx_double_binary_format.m4
new file mode 100644
index 0000000..83c8ec7
--- /dev/null
+++ b/m4/ac_cxx_double_binary_format.m4
@@ -0,0 +1,113 @@
+dnl A function to detect the binary format used by C++ doubles.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_DOUBLE_BINARY_FORMAT],
+[
+AC_REQUIRE([AC_C_BIGENDIAN])
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ doubles])
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+ union {
+ double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0
+ && convert(0x00000000UL, 0x00000001UL)
+ == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+ && convert(0x80000000UL, 0x00000001UL)
+ == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+]])],
+ AC_DEFINE(PPL_CXX_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_DOUBLE,
+ [The unique code of the binary format of C++ doubles, if supported; undefined otherwise.])
+ ac_cxx_double_binary_format="IEEE754 Double Precision",
+ ac_cxx_double_binary_format=unknown,
+ ac_cxx_double_binary_format=unknown)
+
+AC_MSG_RESULT($ac_cxx_double_binary_format)
+
+if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+ ac_supported_double=0
+else
+ ac_supported_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_DOUBLE, test $ac_supported_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_DOUBLE, $ac_supported_double,
+ [Not zero if doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_float_binary_format.m4 b/m4/ac_cxx_float_binary_format.m4
new file mode 100644
index 0000000..8427bcc
--- /dev/null
+++ b/m4/ac_cxx_float_binary_format.m4
@@ -0,0 +1,102 @@
+dnl A function to detect the binary format used by C++ floats.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_FLOAT_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ floats])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+ union {
+ float value;
+ uint32_t word;
+ } u;
+
+ u.word = x;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<float>::is_iec559
+ && ( convert(0xaaacccaaU)
+ == -3.069535185924732179074680971098132431507110595703125e-13
+ && convert(0xcccaaaccU)
+ == -106255968
+ && convert(0x00000001U)
+ == 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45
+ && convert(0x80000001U)
+ == -1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45))
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+]])],
+ AC_DEFINE(PPL_CXX_FLOAT_BINARY_FORMAT, PPL_FLOAT_IEEE754_SINGLE,
+ [The binary format of C++ floats, if supported; undefined otherwise.])
+ ac_cxx_float_binary_format="IEEE754 Single Precision",
+ ac_cxx_float_binary_format=unknown,
+ ac_cxx_float_binary_format=unknown)
+
+AC_MSG_RESULT($ac_cxx_float_binary_format)
+
+if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+ ac_supported_float=0
+else
+ ac_supported_float=1
+fi
+AM_CONDITIONAL(SUPPORTED_FLOAT, test $ac_supported_float = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_FLOAT, $ac_supported_float,
+ [Not zero if floats are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_ieee_inexact_flag.m4 b/m4/ac_cxx_ieee_inexact_flag.m4
new file mode 100644
index 0000000..e05bfb6
--- /dev/null
+++ b/m4/ac_cxx_ieee_inexact_flag.m4
@@ -0,0 +1,133 @@
+dnl A function to check whether the IEEE inexact flag is supported and
+dnl available to C++ programs.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the IEEE inexact flag is supported in C++])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+int
+main() {
+ return 0;
+}
+
+#elif defined(PPL_HAVE_IEEEFP_H) \
+ && (defined(__sparc) \
+ || defined(sparc) \
+ || defined(__sparc__))
+
+int
+main() {
+ return 0;
+}
+
+#elif !defined(HAVE_FENV_H)
+
+int
+main() {
+ return 1;
+}
+
+#else
+
+#include <fenv.h>
+
+#if !defined(FE_INEXACT)
+
+int
+main() {
+ return 1;
+}
+
+#else // defined(FE_INEXACT)
+
+struct A {
+ double dividend;
+ double divisor;
+ bool inexact;
+} a[] = {
+ { 1.0, 2.0, false },
+ { 2.0, 3.0, true },
+};
+
+int main() {
+ for (unsigned i = 0; i < sizeof(a)/sizeof(a[0]); ++i) {
+ {
+ volatile float x = a[i].dividend;
+ volatile float y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ {
+ volatile double x = a[i].dividend;
+ volatile double y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ {
+ volatile long double x = a[i].dividend;
+ volatile long double y = a[i].divisor;
+ feclearexcept(FE_INEXACT);
+ x = x / y;
+ if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#endif // defined(FE_INEXACT)
+
+#endif
+
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_ieee_inexact_flag=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_ieee_inexact_flag=no,
+ AC_MSG_RESULT([assuming not])
+ ac_cxx_supports_ieee_inexact_flag=no)
+
+if test x"$ac_cxx_supports_ieee_inexact_flag" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG, $value,
+ [Not zero if the the IEEE inexact flag is supported in C++.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_limit_memory.m4 b/m4/ac_cxx_limit_memory.m4
new file mode 100644
index 0000000..fcf8ec8
--- /dev/null
+++ b/m4/ac_cxx_limit_memory.m4
@@ -0,0 +1,121 @@
+dnl A function to check whether it is possible to limit the memory
+dnl available to processes using setrlimit().
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_LIMITING_MEMORY],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether we can limit memory in C++ using setrlimit()])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if !HAVE_DECL_SETRLIMIT
+# error "cannot limit memory without setrlimit()"
+#endif
+
+#include <stdexcept>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., ru_utime.
+# include <sys/resource.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#define LIMIT(WHAT) \
+ do { \
+ if (getrlimit(WHAT, &t) != 0) \
+ return false; \
+ t.rlim_cur = bytes; \
+ if (setrlimit(WHAT, &t) != 0) \
+ return false; \
+ } while (0)
+
+bool
+limit_memory(unsigned long bytes) {
+ struct rlimit t;
+#if HAVE_DECL_RLIMIT_DATA
+ // Limit heap size.
+ LIMIT(RLIMIT_DATA);
+#endif
+#if HAVE_DECL_RLIMIT_RSS
+ // Limit resident set size.
+ LIMIT(RLIMIT_RSS);
+#endif
+#if HAVE_DECL_RLIMIT_VMEM
+ // Limit mapped memory (brk + mmap).
+ LIMIT(RLIMIT_VMEM);
+#endif
+#if HAVE_DECL_RLIMIT_AS
+ // Limit virtual memory.
+ LIMIT(RLIMIT_AS);
+#endif
+ return true;
+}
+
+int
+main() try {
+ if (!limit_memory(10000))
+ return 1;
+ (void) new char[20000];
+ return 1;
+ }
+ catch (std::bad_alloc) {
+ return 0;
+ }
+ catch (...) {
+ return 1;
+ }
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_limiting_memory=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_limiting_memory=no,
+ AC_MSG_RESULT([assuming not])
+ ac_cxx_supports_limiting_memory=no)
+
+if test x"$ac_cxx_supports_limiting_memory" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_LIMITING_MEMORY, $value,
+ [Not zero if it is possible to limit memory using setrlimit().])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_long_double_binary_format.m4 b/m4/ac_cxx_long_double_binary_format.m4
new file mode 100644
index 0000000..bc6cc49
--- /dev/null
+++ b/m4/ac_cxx_long_double_binary_format.m4
@@ -0,0 +1,353 @@
+dnl A function to detect the binary format used by C++ long doubles.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_LONG_DOUBLE_BINARY_FORMAT],
+[
+AC_REQUIRE([AC_C_BIGENDIAN])
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ long doubles])
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+ == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034 [...]
+ && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+ == -3.23434990843367356978836243375823670140137920038631047807023049120171609457620808873309220935271108176353097313943940275472100621788903190230956690534410676669705059335585140518969412596610080153759381132049385057915293867970546587078868452351854180615879140837871859693613285468342558175420524259461419246587664010262843224689767458364974546764113923420713958481010186877291531245407558226524068718427924386121735166705992087823616450647326179770339398151079922803077815239965 [...]
+ && convert(0x00000000UL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ && convert(0x80000000UL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+]])],
+ AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_INTEL_DOUBLE_EXTENDED,
+ [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="Intel Double-Extended",
+ ac_cxx_long_double_binary_format=unknown,
+ ac_cxx_long_double_binary_format=unknown)
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+#if defined(__sparc__) && defined(__arch64__) \
+ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+
+// Work around http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661
+int
+main() {
+ return 1;
+}
+
+#else // !defined(__sparc__) || !defined(__arch64__) ...
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -1245145811075115522107964569349668036873048429802955738289544979224937529833971888147113044115600185809657440463151337899852742080173681519641002844007842161066491872877272689899483098933357761372012363074222544903849943421327866952518563408226075393323377411859119799862094642227761121175434773105923957353216410161917656139242348962530519313341883531064222310528951125334264629650711950000833461188453888512224682758538996197678583645934917458956166559210225915729833706160100 [...]
+ && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+ == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215 [...]
+ && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+ == -6.47517511943802511092443895822764655249956933803468100968988438919703954012411937101767149127664994025587814147684811967658721988638254204668511007197261798304279271075133493441673462563847174023944852650555399039145555625217114806807082203468825698247627282878910302835733756134803106238656459263982622699190790786766326206571121158306465719606830833284523445306976052648944766096457931375140340263180435003994887007525564871336806611787940315576671330346743493706240941168521 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#endif // !defined(__sparc__) || !defined(__arch64__) ...
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+ AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_QUAD,
+ [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="IEEE754 Quad Precision",
+ ac_cxx_long_double_binary_format=unknown,
+ ac_cxx_long_double_binary_format=unknown)
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -7.60485409436602033833759988758780020217551374528569429669911873757906182254327119546821375294569706862634123096006179131975601459939317923749460760611755945509159249553133915285667773529968161411385504730903997838176525168965533046787887965329768475303861077507591270048979509969375307518720976751563959372182344600137482199546034650881151618280482157637543315750344472366897650456745841889271161287700829333629145672371870175300825285400580026318002741921464859617583666254762 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -9965833187718142564038919371244528880400911264240719763322990704886435019238181462823338415353952436874830526964270445045957245891305882920209440893355853355213758922643053767150375473715384555384564609917951254069603870739549122332594610600777084466038134002807982723703367090044608379335368276188508415489863689777967712401011928894574027307241589899644172257148781505238731702567519166576191811900643182875678049360454665894916648664135478300253607136628778029068062099599179 [...]
+ && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+ == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+ AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_INTEL_DOUBLE_EXTENDED,
+ [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="Intel Double-Extended",
+ ac_cxx_long_double_binary_format=unknown,
+ ac_cxx_long_double_binary_format=unknown)
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+ union {
+ long double value;
+ struct {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ } parts;
+ } u;
+
+ u.parts.msp = msp;
+ u.parts.lsp = lsp;
+ return u.value;
+}
+
+int
+main() {
+ if (std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0L
+ && convert(0x00000000UL, 0x00000001UL)
+ == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+ && convert(0x80000000UL, 0x00000001UL)
+ == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+ return 0;
+ else
+ return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+]])],
+ AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_DOUBLE,
+ [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="IEEE754 Double Precision",
+ ac_cxx_long_double_binary_format=unknown,
+ ac_cxx_long_double_binary_format=unknown)
+fi
+
+AC_MSG_RESULT($ac_cxx_long_double_binary_format)
+
+AC_MSG_CHECKING([whether std::floor(long double) is buggy])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <cmath>
+#include <cstdlib>
+
+long double x = 13311002825915415087.0L;
+
+int main() {
+ long double y = std::floor(x);
+ if (x != y)
+ return 1;
+ else
+ return 0;
+}
+ ]])],
+ ac_std_floor_long_double_is_buggy=no
+ AC_MSG_RESULT(no),
+ ac_std_floor_long_double_is_buggy=yes
+ AC_MSG_RESULT(yes),
+ ac_std_floor_long_double_is_buggy=no
+ AC_MSG_RESULT([assuming is not]))
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown" \
+|| test $ac_cv_can_control_fpu = 0 \
+|| test x"$ac_std_floor_long_double_is_buggy" = x"yes"
+then
+ ac_supported_long_double=0
+else
+ ac_supported_long_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_LONG_DOUBLE, test $ac_supported_long_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_LONG_DOUBLE, $ac_supported_long_double,
+ [Not zero if long doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_plain_char_is_signed.m4 b/m4/ac_cxx_plain_char_is_signed.m4
new file mode 100644
index 0000000..81b6fed
--- /dev/null
+++ b/m4/ac_cxx_plain_char_is_signed.m4
@@ -0,0 +1,53 @@
+dnl A function to check whether the plain char type is signed.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_PLAIN_CHAR_IS_SIGNED],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the plain char type is signed])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+
+int foo[std::numeric_limits<char>::is_signed ? 1 : -1];
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_plain_char_is_signed=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_plain_char_is_signed=no)
+
+if test x"$ac_cxx_plain_char_is_signed" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_PLAIN_CHAR_IS_SIGNED, $value,
+ [Not zero if the the plain char type is signed.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_proper_long_double.m4 b/m4/ac_cxx_proper_long_double.m4
new file mode 100644
index 0000000..17432aa
--- /dev/null
+++ b/m4/ac_cxx_proper_long_double.m4
@@ -0,0 +1,64 @@
+dnl A function to check whether the C++ compiler provides long double
+dnl numbers that have bigger range or precision than double.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_PROVIDES_PROPER_LONG_DOUBLE],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler provides proper long doubles])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <cfloat>
+
+long double f = 0.0;
+
+int main() {
+ if ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+ && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+ return 1;
+ else
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_provides_proper_long_double=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_provides_proper_long_double=no,
+ AC_MSG_RESULT([assuming not])
+ ac_cxx_provides_proper_long_double=no)
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE, $value,
+ [Not zero if the C++ compiler provides long double numbers that have bigger range or precision than double.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_zero_length_arrays.m4 b/m4/ac_cxx_zero_length_arrays.m4
new file mode 100644
index 0000000..33d5a98
--- /dev/null
+++ b/m4/ac_cxx_zero_length_arrays.m4
@@ -0,0 +1,142 @@
+dnl A function to check whether the C++ compiler supports zero-length arrays.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports zero-length arrays])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+ int i;
+ bool b;
+
+public:
+ A()
+ : i(0), b(false) {
+ }
+};
+
+class B {
+private:
+ int capacity;
+ A vec[];
+
+public:
+ void* operator new(size_t fixed_size, int c) {
+ return ::operator new(fixed_size + c*sizeof(B));
+ }
+
+ void operator delete(void* p) {
+ ::operator delete(p);
+ }
+
+ void operator delete(void* p, int) {
+ ::operator delete(p);
+ }
+
+ B(int s)
+ : capacity(s) {
+ }
+};
+
+int
+main() {
+ B* p = new (100) B(100);
+ delete p;
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_zero_length_arrays=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_zero_length_arrays=no,
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+ int i;
+ bool b;
+
+public:
+ A()
+ : i(0), b(false) {
+ }
+};
+
+class B {
+private:
+ int capacity;
+ A vec[0];
+
+public:
+ void* operator new(size_t fixed_size, int c) {
+ return ::operator new(fixed_size + c*sizeof(B));
+ }
+
+ void operator delete(void* p) {
+ ::operator delete(p);
+ }
+
+ void operator delete(void* p, int) {
+ ::operator delete(p);
+ }
+
+ B(int s)
+ : capacity(s) {
+ }
+};
+
+int
+main() {
+ B* p = new (100) B(100);
+ delete p;
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_zero_length_arrays=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_zero_length_arrays=no))
+
+if test x"$ac_cxx_supports_zero_length_arrays" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS, $value,
+ [Not zero if the C++ compiler supports zero_length arrays.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_prog_jar.m4 b/m4/ac_prog_jar.m4
new file mode 100644
index 0000000..7e0f9b2
--- /dev/null
+++ b/m4/ac_prog_jar.m4
@@ -0,0 +1,54 @@
+##### http://autoconf-archive.cryp.to/ac_prog_jar.html
+#
+# SYNOPSIS
+#
+# AC_PROG_JAR
+#
+# DESCRIPTION
+#
+# AC_PROG_JAR tests for an existing jar program. It uses the
+# environment variable JAR then tests in sequence various common jar
+# programs.
+#
+# If you want to force a specific compiler:
+#
+# - at the configure.in level, set JAR=yourcompiler before calling
+# AC_PROG_JAR
+#
+# - at the configure level, setenv JAR
+#
+# You can use the JAR variable in your Makefile.in, with @JAR at .
+#
+# Note: This macro depends on the autoconf M4 macros for Java
+# programs. It is VERY IMPORTANT that you download that whole set,
+# some macros depend on other. Unfortunately, the autoconf archive
+# does not support the concept of set of macros, so I had to break it
+# for submission.
+#
+# The general documentation of those macros, as well as the sample
+# configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+# 2006-11-06
+#
+# COPYLEFT
+#
+# Copyright (C) 2000 Egon Willighagen <e.willighagen at science.ru.nl>
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# Copying and distribution of this file, with or without
+# modification, are permitted in any medium without royalty provided
+# the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAR],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x; then
+ test "x$JAR" = x && AC_CHECK_PROGS(JAR, jar$EXEEXT, no)
+else
+ test "x$JAR" = x && AC_PATH_PROGS(JAR, jar, no, $JAVAPREFIX)
+fi
+test "x$JAR" = xno
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_java.m4 b/m4/ac_prog_java.m4
new file mode 100644
index 0000000..5205c79
--- /dev/null
+++ b/m4/ac_prog_java.m4
@@ -0,0 +1,268 @@
+#### http://autoconf-archive.cryp.to/ac_prog_java_works.html
+#
+# SYNOPSIS
+#
+# AC_PROG_JAVA_WORKS
+#
+# DESCRIPTION
+#
+# Internal use ONLY.
+#
+# Note: This is part of the set of autoconf M4 macros for Java
+# programs. It is VERY IMPORTANT that you download the whole set,
+# some macros depend on other. Unfortunately, the autoconf archive
+# does not support the concept of set of macros, so I had to break it
+# for submission. The general documentation, as well as the sample
+# configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+# 2006-11-15
+#
+# COPYLEFT
+#
+# Copyright (C) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# As a special exception, the respective Autoconf Macro's copyright
+# owner gives unlimited permission to copy, distribute and modify the
+# configure scripts that are the output of Autoconf when processing
+# the Macro. You need not follow the terms of the GNU General Public
+# License when using or distributing such scripts, even though
+# portions of the text of the Macro appear in them. The GNU General
+# Public License (GPL) does govern all other use of the material that
+# constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the
+# Autoconf Macro released by the Autoconf Macro Archive. When you
+# make and distribute a modified version of the Autoconf Macro, you
+# may extend this special exception to the GPL to apply to your
+# modified version as well.
+AC_DEFUN([AC_PROG_JAVA_WORKS], [
+AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes)
+if test x$uudecode = xyes; then
+AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [
+dnl /**
+dnl * Test.java: used to test if java compiler works.
+dnl */
+dnl public class Test
+dnl {
+dnl
+dnl public static void
+dnl main( String[] argv )
+dnl {
+dnl System.exit (0);
+dnl }
+dnl
+dnl }
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+ ac_cv_prog_uudecode_base64=yes
+else
+ echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AS_MESSAGE_LOG_FD
+ echo "configure: failed file was:" >&AS_MESSAGE_LOG_FD
+ cat Test.uue >&AS_MESSAGE_LOG_FD
+ ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue])
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+ rm -f Test.class
+ if test x$ac_cv_javac_supports_enums = x; then
+ AC_PROG_JAVAC
+ fi
+fi
+AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+changequote(, )dnl
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public static void main (String args[]) {
+ System.exit (0);
+} }
+EOF
+changequote([, ])dnl
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+ if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then
+ :
+ else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+ AC_MSG_WARN(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?))
+ fi
+fi
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
+else
+if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then
+ ac_cv_prog_java_works=yes
+else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+ AC_MSG_WARN(The Java VM $JAVA failed (see config.log, check the CLASSPATH?))
+ fi
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
+])
+AC_PROVIDE([$0])dnl
+]
+)
+
+
+##### http://autoconf-archive.cryp.to/ac_prog_java.html
+#
+# SYNOPSIS
+#
+# AC_PROG_JAVA
+#
+# DESCRIPTION
+#
+# Here is a summary of the main macros:
+#
+# AC_PROG_JAVAC: finds a Java compiler.
+#
+# AC_PROG_JAVA: finds a Java virtual machine.
+#
+# AC_CHECK_CLASS: finds if we have the given class (beware of
+# CLASSPATH!).
+#
+# AC_CHECK_RQRD_CLASS: finds if we have the given class and stops
+# otherwise.
+#
+# AC_TRY_COMPILE_JAVA: attempt to compile user given source.
+#
+# AC_TRY_RUN_JAVA: attempt to compile and run user given source.
+#
+# AC_JAVA_OPTIONS: adds Java configure options.
+#
+# AC_PROG_JAVA tests an existing Java virtual machine. It uses the
+# environment variable JAVA then tests in sequence various common
+# Java virtual machines. For political reasons, it starts with the
+# free ones. You *must* call [AC_PROG_JAVAC] before.
+#
+# If you want to force a specific VM:
+#
+# - at the configure.in level, set JAVA=yourvm before calling
+# AC_PROG_JAVA
+#
+# (but after AC_INIT)
+#
+# - at the configure level, setenv JAVA
+#
+# You can use the JAVA variable in your Makefile.in, with @JAVA at .
+#
+# *Warning*: its success or failure can depend on a proper setting of
+# the CLASSPATH env. variable.
+#
+# TODO: allow to exclude virtual machines (rationale: most Java
+# programs cannot run with some VM like kaffe).
+#
+# Note: This is part of the set of autoconf M4 macros for Java
+# programs. It is VERY IMPORTANT that you download the whole set,
+# some macros depend on other. Unfortunately, the autoconf archive
+# does not support the concept of set of macros, so I had to break it
+# for submission.
+#
+# A Web page, with a link to the latest CVS snapshot is at
+# <http://www.internatif.org/bortzmeyer/autoconf-Java/>.
+#
+# This is a sample configure.in Process this file with autoconf to
+# produce a configure script.
+#
+# AC_INIT(UnTag.java)
+#
+# dnl Checks for programs.
+# AC_CHECK_CLASSPATH
+# AC_PROG_JAVAC
+# AC_PROG_JAVA
+#
+# dnl Checks for classes
+# AC_CHECK_RQRD_CLASS(org.xml.sax.Parser)
+# AC_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver)
+#
+# AC_OUTPUT(Makefile)
+#
+# LAST MODIFICATION
+#
+# 2006-11-06
+#
+# COPYLEFT
+#
+# Copyright (c) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# As a special exception, the respective Autoconf Macro's copyright
+# owner gives unlimited permission to copy, distribute and modify the
+# configure scripts that are the output of Autoconf when processing
+# the Macro. You need not follow the terms of the GNU General Public
+# License when using or distributing such scripts, even though
+# portions of the text of the Macro appear in them. The GNU General
+# Public License (GPL) does govern all other use of the material that
+# constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the
+# Autoconf Macro released by the Autoconf Macro Archive. When you
+# make and distribute a modified version of the Autoconf Macro, you
+# may extend this special exception to the GPL to apply to your
+# modified version as well.
+
+
+AC_DEFUN([AC_PROG_JAVA],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test x$JAVAPREFIX = x; then
+ test x$JAVA = x && AC_CHECK_PROGS(JAVA, java$EXEEXT, no)
+else
+ test x$JAVA = x && AC_PATH_PROGS(JAVA, java$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVA = "xno"
+then
+ AC_PROG_JAVA_WORKS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javac.m4 b/m4/ac_prog_javac.m4
new file mode 100644
index 0000000..7a9a9b6
--- /dev/null
+++ b/m4/ac_prog_javac.m4
@@ -0,0 +1,145 @@
+dnl A function to check whether the Java compiler supports enums.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_JAVAC_SUPPORTS_ENUMS],[
+AC_CACHE_CHECK([whether $JAVAC supports enums], ac_cv_javac_supports_enums, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public enum Relation_Symbol {
+ /*! Less than. */
+ LESS_THAN,
+ /*! Less than or equal to. */
+ LESS_OR_EQUAL,
+ /*! Equal to. */
+ EQUAL,
+ /*! Greater than or equal to. */
+ GREATER_OR_EQUAL,
+ /*! Greater than. */
+ GREATER_THAN,
+ }
+}
+EOF
+if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then
+ ac_cv_javac_supports_enums=yes
+else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+ ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+])
+AC_PROVIDE([$0])dnl
+])
+
+##### http://autoconf-archive.cryp.to/ac_prog_javac.html
+#
+# SYNOPSIS
+#
+# AC_PROG_JAVAC
+#
+# DESCRIPTION
+#
+# AC_PROG_JAVAC tests an existing Java compiler. It uses the
+# environment variable JAVAC then tests in sequence various common
+# Java compilers. For political reasons, it starts with the free
+# ones.
+#
+# If you want to force a specific compiler:
+#
+# - at the configure.in level, set JAVAC=yourcompiler before calling
+# AC_PROG_JAVAC
+#
+# - at the configure level, setenv JAVAC
+#
+# You can use the JAVAC variable in your Makefile.in, with @JAVAC at .
+#
+# *Warning*: its success or failure can depend on a proper setting of
+# the CLASSPATH env. variable.
+#
+# TODO: allow to exclude compilers (rationale: most Java programs
+# cannot compile with some compilers like guavac).
+#
+# Note: This is part of the set of autoconf M4 macros for Java
+# programs. It is VERY IMPORTANT that you download the whole set,
+# some macros depend on other. Unfortunately, the autoconf archive
+# does not support the concept of set of macros, so I had to break it
+# for submission. The general documentation, as well as the sample
+# configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+# 2006-11-07
+#
+# COPYLEFT
+#
+# Copyright (c) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# As a special exception, the respective Autoconf Macro's copyright
+# owner gives unlimited permission to copy, distribute and modify the
+# configure scripts that are the output of Autoconf when processing
+# the Macro. You need not follow the terms of the GNU General Public
+# License when using or distributing such scripts, even though
+# portions of the text of the Macro appear in them. The GNU General
+# Public License (GPL) does govern all other use of the material that
+# constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the
+# Autoconf Macro released by the Autoconf Macro Archive. When you
+# make and distribute a modified version of the Autoconf Macro, you
+# may extend this special exception to the GPL to apply to your
+# modified version as well.
+AC_DEFUN([AC_PROG_JAVAC],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x
+then
+ test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, javac$EXEEXT, no)
+else
+ test "x$JAVAC" = x && AC_PATH_PROGS(JAVAC, javac$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVAC = "xno"
+then
+ AC_JAVAC_SUPPORTS_ENUMS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javah.m4 b/m4/ac_prog_javah.m4
new file mode 100644
index 0000000..0525349
--- /dev/null
+++ b/m4/ac_prog_javah.m4
@@ -0,0 +1,54 @@
+##### http://autoconf-archive.cryp.to/ac_prog_javah.html
+#
+# SYNOPSIS
+#
+# AC_PROG_JAVAH
+#
+# DESCRIPTION
+#
+# AC_PROG_JAVAH tests the availability of the javah header generator
+# and looks for the jni.h header file. If available, JAVAH is set to
+# the full path of javah and CPPFLAGS is updated accordingly.
+#
+# LAST MODIFICATION
+#
+# 2006-12-20
+#
+# COPYLEFT
+#
+# Copyright (C) 2002 Luc Maisonobe <luc at spaceroots.org>
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# Copying and distribution of this file, with or without
+# modification, are permitted in any medium without royalty provided
+# the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAVAH],[
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+AC_LANG_PUSH(C++)dnl
+if test "x$JAVAPREFIX" = x; then
+ AC_CHECK_PROGS(JAVAH,javah, no)
+else
+ AC_PATH_PROGS(JAVAH,javah, no, $JAVAPREFIX)
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+ AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]]) ] ,,[
+ ac_save_CPPFLAGS="$CPPFLAGS"
+changequote(, )dnl
+ ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+ ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+changequote([, ])dnl
+ JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+ CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+ AC_SUBST(JNIFLAGS)
+ AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]])],
+ CPPFLAGS="$ac_save_CPPFLAGS",
+ AC_MSG_WARN([unable to include <jni.h>])
+ JAVAH=no)
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+fi
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_text_md5sum.m4 b/m4/ac_text_md5sum.m4
new file mode 100644
index 0000000..d1c77d7
--- /dev/null
+++ b/m4/ac_text_md5sum.m4
@@ -0,0 +1,38 @@
+dnl A function to set the command for computing the MD5 checksum of text files.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_TEXT_MD5SUM],
+[
+AC_MSG_CHECKING([for the text md5sum command])
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+ ac_cv_prog_text_md5sum='md5sum -t'
+else
+ ac_cv_prog_text_md5sum='md5sum'
+fi
+AC_MSG_RESULT($ac_cv_prog_text_md5sum)
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+AC_SUBST([TEXT_MD5SUM])
+])
+
+
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..44e0ecf
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7982 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# Written by Gordon Matzigkeit, 1996
+#
+# This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING. If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+ [m4_default([$3],
+ [m4_fatal([Libtool version $1 or higher is required],
+ 63)])],
+ [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+ *\ * | *\ *)
+ AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ _LT_PATH_MAGIC
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+ [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+ [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+ [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+ [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+ [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME. Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+ [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+ [m4_ifval([$1], [$1], [$2])])
+ lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+ m4_ifval([$4],
+ [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+ lt_dict_add_subkey([lt_decl_dict], [$2],
+ [tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+ [0], [m4_fatal([$0: too few arguments: $#])],
+ [1], [m4_fatal([$0: too few arguments: $#: $1])],
+ [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+ [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+ [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+ m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+ m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+ m4_if([$2], [],
+ m4_quote(lt_decl_varnames),
+ m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+ lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'. VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly. In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+ [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+# # Some comment about what VAR is for.
+# visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+ [description])))[]dnl
+m4_pushdef([_libtool_name],
+ m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+ [0], [_libtool_name=[$]$1],
+ [1], [_libtool_name=$lt_[]$1],
+ [2], [_libtool_name=$lt_[]$1],
+ [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+ m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'. Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+ dnl If the libtool generation code has been placed in $CONFIG_LT,
+ dnl instead of duplicating it all over again into config.status,
+ dnl then we will have config.status run $CONFIG_LT later, so it
+ dnl needs to know what name is stored there:
+ [AC_CONFIG_COMMANDS([libtool],
+ [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+ dnl If the libtool generation code is destined for config.status,
+ dnl expand the accumulated commands and init code now:
+ [AC_CONFIG_COMMANDS([libtool],
+ [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable. If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins. After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script. The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+ echo
+ AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+ case $[1] in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+ *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars. Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+ m4_if(_LT_TAG, [C], [
+ # See if we are running on zsh, and set the options which allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile="${ofile}T"
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+ _LT_PROG_LTMAIN
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ _LT_PROG_REPLACE_SHELLFNS
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ TIMESTAMP='$TIMESTAMP'
+ RM='$RM'
+ ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+# autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+ [C], [_LT_LANG(C)],
+ [C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
+ [Java], [_LT_LANG(GCJ)],
+ [Fortran 77], [_LT_LANG(F77)],
+ [Fortran], [_LT_LANG(FC)],
+ [Windows Resource], [_LT_LANG(RC)],
+ [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+ [_LT_LANG($1)],
+ [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+ [LT_SUPPORTED_TAG([$1])dnl
+ m4_append([_LT_TAGS], [$1 ])dnl
+ m4_define([_LT_LANG_]$1[_enabled], [])dnl
+ _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_GO. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC], [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+ fi
+fi
+if test -z "$GOC"; then
+ AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [LT_LANG(CXX)],
+ [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [LT_LANG(F77)],
+ [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+ [LT_LANG(FC)],
+ [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [m4_ifdef([AC_PROG_GCJ],
+ [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+ m4_ifdef([A][M_PROG_GCJ],
+ [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+ m4_ifdef([LT_PROG_GCJ],
+ [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+ [LT_LANG(GO)],
+ [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+ [LT_LANG(RC)],
+ [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+ case $host_os in
+ rhapsody* | darwin*)
+ AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+ AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+ AC_CHECK_TOOL([LIPO], [lipo], [:])
+ AC_CHECK_TOOL([OTOOL], [otool], [:])
+ AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+ _LT_DECL([], [DSYMUTIL], [1],
+ [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+ _LT_DECL([], [NMEDIT], [1],
+ [Tool to change global to local symbols on Mac OS X])
+ _LT_DECL([], [LIPO], [1],
+ [Tool to manipulate fat objects and archives on Mac OS X])
+ _LT_DECL([], [OTOOL], [1],
+ [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+ _LT_DECL([], [OTOOL64], [1],
+ [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+ [lt_cv_apple_cc_single_mod=no
+ if test -z "${LT_MULTI_MODULE}"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi])
+
+ AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+ [lt_cv_ld_exported_symbols_list],
+ [lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [lt_cv_ld_exported_symbols_list=yes],
+ [lt_cv_ld_exported_symbols_list=no])
+ LDFLAGS="$save_LDFLAGS"
+ ])
+
+ AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+ [lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+ echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+ $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+ ])
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ 10.[[012]]*)
+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+ m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ if test "$lt_cv_ld_force_load" = "yes"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+ [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+ fi
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+ case $cc_basename in
+ ifort*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test "$_lt_dar_can_shared" = "yes"; then
+ output_verbose_link_cmd=func_echo_all
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+ _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+ _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ m4_if([$1], [CXX],
+[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+ fi
+],[])
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+ lt_aix_libpath_sed='[
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }]'
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi],[])
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+ fi
+ ])
+ aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
+case "$ECHO" in
+ printf*) AC_MSG_RESULT([printf]) ;;
+ print*) AC_MSG_RESULT([print -r]) ;;
+ *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test "X`printf %s $ECHO`" = "X$ECHO" \
+ || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[ --with-sysroot[=DIR] Search for dependent libraries within DIR
+ (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted. We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+ if test "$GCC" = yes; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ AC_MSG_RESULT([${with_sysroot}])
+ AC_MSG_ERROR([The sysroot must be an absolute path.])
+ ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AS_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD="${LD-ld}_sol2"
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+ [lt_cv_ar_at_file=no
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+ [echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+ AC_TRY_EVAL([lt_ar_try])
+ if test "$ac_status" -eq 0; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ AC_TRY_EVAL([lt_ar_try])
+ if test "$ac_status" -ne 0; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+ ])
+ ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+ [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+ [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+ [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+ [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ m4_if([$5], , :, [$5])
+else
+ m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ m4_if([$4], , :, [$4])
+else
+ m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8 ; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+ [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}]
+_LT_EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+ [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+ [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+ [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+ [Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+ [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+ [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+ test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+ test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existent directories.
+ if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+ test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+ [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+ [], [
+if test "$GCC" = yes; then
+ case $host_os in
+ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+ *) lt_awk_arg="/^libraries:/" ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+ *) lt_sed_strip_eq="s,=/,/,g" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary.
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+ else
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+ lt_foo="";
+ lt_count=0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo="/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+ if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix[[4-9]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='${libname}.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec="$LIB"
+ if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[23]].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[[3-9]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+ [lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+ [lt_cv_shlibpath_overrides_runpath=yes])])
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+ ])
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+ sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+ sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+ [Variables whose values should be saved in libtool wrapper scripts and
+ restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+ [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+ [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+ [[List of archive names. First name is the real one, the rest are links.
+ The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+ [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+ [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+ [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+ [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+ [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+ [[As "finish_cmds", except a single script fragment to be evaled but
+ not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+ [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+ [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+ [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="m4_if([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+ [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test "$GCC" != yes; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[[45]]*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[[3-9]]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+ [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+ [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+ [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+ [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+ NM="$lt_cv_path_NM"
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+ AC_SUBST([DUMPBIN])
+ if test "$DUMPBIN" != ":"; then
+ NM="$DUMPBIN"
+ fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+ [lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+ cat conftest.out >&AS_MESSAGE_LOG_FD
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh
+ # decide which to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+ [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+ [lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+ MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ case $cc_basename in
+ nvcc*)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+ esac
+
+ _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+ [Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris*)
+ symcode='[[BDRT]]'
+ ;;
+sco3.2v5*)
+ symcode='[[DT]]'
+ ;;
+sysv4.2uw2*)
+ symcode='[[DT]]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[[ABDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function
+ # and D for any global variable.
+ # Also find C++ and __fastcall symbols from MSVC++,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK ['"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+" s[1]~/^[@?]/{print s[1], s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx]"
+ else
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t at _DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+ [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+ [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+ [lt_cv_sys_global_symbol_to_c_name_address], [1],
+ [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+ [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+ [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+ [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[[4-9]]*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64 which still supported -KPIC.
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+ if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ # old Intel for x86_64 which still supported -KPIC.
+ ecc*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ *Intel*\ [[CF]]*Compiler*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ *Portland\ Group*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ rdos*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+ [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+ [Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+ [How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+ [Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+ case $host_os in
+ aix[[4-9]]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global defined
+ # symbols, whereas GNU nm marks them as "W".
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl*)
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+ ;;
+ esac
+ ;;
+ *)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+], [
+ runpath_var=
+ _LT_TAGVAR(allow_undefined_flag, $1)=
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(archive_cmds, $1)=
+ _LT_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_TAGVAR(compiler_needs_object, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(hardcode_automatic, $1)=no
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_TAGVAR(inherit_rpath, $1)=no
+ _LT_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_TAGVAR(module_cmds, $1)=
+ _LT_TAGVAR(module_expsym_cmds, $1)=
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+ _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test "$with_gnu_ld" = yes; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+ *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test "$lt_use_gnu_ld_interface" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[[3-9]]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)=''
+ ;;
+ m68k)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ interix[[3-9]]*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test "$host_os" = linux-dietlibc; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test "$tmp_diet" = no
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ tmp_sharedflag='--shared' ;;
+ xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test "x$supports_anon_versioning" = xyes; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test "x$supports_anon_versioning" = xyes; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global
+ # defined symbols, whereas GNU nm marks them as "W".
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_TAGVAR(archive_cmds, $1)=''
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)=''
+ ;;
+ m68k)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[[45]]*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ _LT_DARWIN_LINKER_FEATURES($1)
+ ;;
+
+ dgux*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ m4_if($1, [], [
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ _LT_LINKER_OPTION([if $CC understands -b],
+ _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+ [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+ [lt_cv_irix_exported_symbol],
+ [save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ AC_LINK_IFELSE(
+ [AC_LANG_SOURCE(
+ [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+ [C++], [[int foo (void) { return 0; }]],
+ [Fortran 77], [[
+ subroutine foo
+ end]],
+ [Fortran], [[
+ subroutine foo
+ end]])])],
+ [lt_cv_irix_exported_symbol=yes],
+ [lt_cv_irix_exported_symbol=no])
+ LDFLAGS="$save_LDFLAGS"])
+ if test "$lt_cv_irix_exported_symbol" = yes; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ fi
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(inherit_rpath, $1)=yes
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='${wl}'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+
+ if test x$host_vendor = xsni; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+ [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+ [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+ [$RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+ _LT_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+ then
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+ ])
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+ [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+ [enable_shared_with_static_runtimes], [0],
+ [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+ [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+ [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+ [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+ [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+ [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+ [Commands used to build a loadable module if different from building
+ a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+ [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+ [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+ [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+ [Flag to hardcode $libdir into a binary during linking.
+ This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+ [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+ [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+ DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+ [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+ DIR into the resulting binary and the resulting library dependency is
+ "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+ library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+ [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+ into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+ [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+ into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+ [Set to "yes" if building a shared library automatically hardcodes DIR
+ into the library and all subsequent libraries and executables linked
+ against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+ [Set to yes if linker adds runtime paths of dependent libraries
+ to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+ [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+ [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+ [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+ [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+ [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+ [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+ [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+ [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined. These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+ LT_SYS_DLOPEN_SELF
+ _LT_CMD_STRIPLIB
+
+ # Report which library types will actually be built
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test "$can_build_shared" = "no" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test "$enable_shared" = yes || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined. These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_PROG_CXXCPP
+else
+ _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test "$GXX" = yes; then
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+ else
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+ fi
+
+ if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ LT_PATH_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix[[4-9]]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_TAGVAR(archive_cmds, $1)=''
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared
+ # libraries.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl*)
+ # Native MSVC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ _LT_DARWIN_LINKER_FEATURES($1)
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ freebsd-elf*)
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+
+ gnu*)
+ ;;
+
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ hpux9*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[[3-9]]*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+ fi
+ fi
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(inherit_rpath, $1)=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+ _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ if test "x$supports_anon_versioning" = xyes; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ ;;
+ *)
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+ $RM $lib.exp'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ case $host in
+ osf3*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+ '"$_LT_TAGVAR(old_archive_cmds, $1)"
+ _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+ '"$_LT_TAGVAR(reload_cmds, $1)"
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+
+ AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+ test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+ _LT_TAGVAR(GCC, $1)="$GXX"
+ _LT_TAGVAR(LD, $1)="$LD"
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_SYS_HIDDEN_LIBDEPS($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+ case ${2} in
+ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+ subroutine foo
+ implicit none
+ integer a
+ a=0
+ return
+ end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case ${prev}${p} in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" ||
+ test $p = "-R"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test "$pre_test_object_deps_done" = no; then
+ case ${prev} in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+ _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+ _LT_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+ _LT_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ _LT_TAGVAR(predep_objects,$1)=
+ _LT_TAGVAR(postdep_objects,$1)=
+ _LT_TAGVAR(postdeps,$1)=
+ ;;
+
+linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+ [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+ [Dependencies to place before and after the objects being linked to
+ create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+ [The library search path used internally by the compiler when linking
+ a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+ _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code="\
+ program t
+ end
+"
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC="$CC"
+ lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
+ CC=${F77-"f77"}
+ CFLAGS=$FFLAGS
+ compiler=$CC
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+ GCC=$G77
+ if test -n "$compiler"; then
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test "$can_build_shared" = "no" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test "$enable_shared" = yes || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_TAGVAR(GCC, $1)="$G77"
+ _LT_TAGVAR(LD, $1)="$LD"
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ GCC=$lt_save_GCC
+ CC="$lt_save_CC"
+ CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+ _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code="\
+ program t
+ end
+"
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC="$CC"
+ lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
+ CC=${FC-"f95"}
+ CFLAGS=$FCFLAGS
+ compiler=$CC
+ GCC=$ac_cv_fc_compiler_gnu
+
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+
+ if test -n "$compiler"; then
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test "$can_build_shared" = "no" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test "$enable_shared" = yes || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+ _LT_TAGVAR(LD, $1)="$LD"
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_SYS_HIDDEN_LIBDEPS($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ GCC=$lt_save_GCC
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+ :
+ _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+ [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+ [AC_CHECK_TOOL(GCJ, gcj,)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+ [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+ = c,a/b,b/c, \
+ && eval 'test $(( 1 + 1 )) -eq 2 \
+ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+ && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+ >/dev/null 2>&1 \
+ && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+ _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac])
+
+ _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+ func_basename_result="${1##*/}"])
+
+ _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+ func_basename_result="${1##*/}"])
+
+ _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+ # positional parameters, so assign one to ordinary parameter first.
+ func_stripname_result=${3}
+ func_stripname_result=${func_stripname_result#"${1}"}
+ func_stripname_result=${func_stripname_result%"${2}"}])
+
+ _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+ func_split_long_opt_name=${1%%=*}
+ func_split_long_opt_arg=${1#*=}])
+
+ _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+ func_split_short_opt_arg=${1#??}
+ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+ _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+ case ${1} in
+ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+ *) func_lo2o_result=${1} ;;
+ esac])
+
+ _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo])
+
+ _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))])
+
+ _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+ _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"])
+
+ _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+ func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+ eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+ # Save a `func_append' function call where possible by direct use of '+='
+ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+else
+ # Save a `func_append' function call even when '+=' is not available
+ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+ AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+ [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+ [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling. -*- Autoconf -*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it. Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+ _LT_MANGLE_DEFUN([$1], [$2]),
+ [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+ [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+ [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME. If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+ [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+ dnl
+ dnl Simply set some default values (i.e off) if boolean options were not
+ dnl specified:
+ _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+ ])
+ _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+ ])
+ dnl
+ dnl If no reference was made to various pairs of opposing options, then
+ dnl we run the default mode handler for the pair. For example, if neither
+ dnl `shared' nor `disable-shared' was passed, we enable building of shared
+ dnl archives by default:
+ _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+ _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+ _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+ _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+ [_LT_ENABLE_FAST_INSTALL])
+ ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS], [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+ [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+ _LT_DECL([build_libtool_libs], [enable_shared], [0],
+ [Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+ [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+ _LT_DECL([build_old_libs], [enable_static], [0],
+ [Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+ [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+ [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+ [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for lt_pkg in $withval; do
+ IFS="$lt_save_ifs"
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+ [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+ [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+ [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+ [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+ [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+ [$#], [2], [[$2]],
+ [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+ [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+ [$#], 1, [],
+ [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+ m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+ [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+ [m4_foreach([_Lt_suffix],
+ ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+ [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+ [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+ [lt_append([$1], [$2], [$3])$4],
+ [$5])],
+ [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+ m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+ m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+ [$5],
+ [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+ [lt_join(m4_quote(m4_default([$4], [[, ]])),
+ lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+ [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers -*- Autoconf -*-
+#
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+# Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else. This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/m4/m4.m4 b/m4/m4.m4
new file mode 100644
index 0000000..3b6fcc6
--- /dev/null
+++ b/m4/m4.m4
@@ -0,0 +1,46 @@
+# m4.m4 serial 5
+dnl Copyright (C) 2000, 2006, 2007, 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# AC_PROG_GNU_M4
+# --------------
+# Check for GNU M4, at least 1.4.5 (all earlier versions had a bug in
+# trace support:
+# http://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00096.html)
+# Also, check whether --error-output (through 1.4.x) or --debugfile (2.0)
+# is supported, and AC_SUBST M4_DEBUGFILE accordingly.
+AC_DEFUN([AC_PROG_GNU_M4],
+ [AC_ARG_VAR([M4], [Location of GNU M4 1.4.5 or later. Defaults to the first
+ program of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.])
+ AC_CACHE_CHECK([for GNU M4 that supports accurate traces], [ac_cv_path_M4],
+ [rm -f conftest.m4f
+AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4 gnum4],
+ [dnl Creative quoting here to avoid raw dnl and ifdef in configure.
+ # Root out GNU M4 1.4.4, as well as non-GNU m4 that ignore -t, -F.
+ ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)d'nl
+ test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
+ && test -z "`echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
+ && test -f conftest.m4f \
+ && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
+ rm -f conftest.m4f],
+ [AC_MSG_ERROR([no acceptable m4 could be found in \$PATH.
+GNU M4 1.4.5 or later is required; 1.4.11 or later is recommended])])])
+ M4=$ac_cv_path_M4
+ AC_CACHE_CHECK([how m4 supports trace files], [ac_cv_prog_gnu_m4_debugfile],
+ [case `$M4 --help < /dev/null 2>&1` in
+ *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
+ *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
+ esac])
+ AC_SUBST([M4_DEBUGFILE], [$ac_cv_prog_gnu_m4_debugfile])
+])
+
+# Compatibility for bootstrapping with Autoconf 2.61.
+dnl FIXME - replace this with AC_PREREQ([2.62]) after the release.
+# AC_PATH_PROGS_FEATURE_CHECK was added the same time the slightly broken,
+# undocumented _AC_PATH_PROG_FEATURE_CHECK was deleted.
+m4_ifndef([AC_PATH_PROGS_FEATURE_CHECK],
+ [m4_define([AC_PATH_PROGS_FEATURE_CHECK],
+ [_AC_PATH_PROG_FEATURE_CHECK([$1], [$2], [$3], [$5])
+])])
diff --git a/m4/ocaml.m4 b/m4/ocaml.m4
new file mode 100644
index 0000000..87b1e3b
--- /dev/null
+++ b/m4/ocaml.m4
@@ -0,0 +1,244 @@
+dnl autoconf macros for OCaml
+dnl
+dnl Copyright (C) 2009 Richard W.M. Jones
+dnl Copyright (C) 2009 Stefano Zacchiroli
+dnl Copyright (C) 2000-2005 Olivier Andrieu
+dnl Copyright (C) 2000-2005 Jean-Christophe Filliatre
+dnl Copyright (C) 2000-2005 Georges Mariano
+dnl
+dnl For documentation, please read the ocaml.m4 man page.
+dnl
+dnl All rights reserved.
+dnl
+dnl Redistribution and use in source and binary forms, with or without
+dnl modification, are permitted provided that the following conditions are
+dnl met:
+dnl
+dnl * Redistributions of source code must retain the above copyright
+dnl notice, this list of conditions and the following disclaimer.
+dnl * Redistributions in binary form must reproduce the above copyright
+dnl notice, this list of conditions and the following disclaimer in the
+dnl documentation and/or other materials provided with the distribution.
+dnl * The names of the contributors may not be used to endorse or promote
+dnl products derived from this software without specific prior written
+dnl permission.
+dnl
+dnl THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS''
+dnl AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+dnl THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+dnl BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+dnl BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+dnl WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+dnl OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+AC_DEFUN([AC_PROG_OCAML],
+[dnl
+ # checking for ocamlc
+ AC_CHECK_TOOL([OCAMLC],[ocamlc],[no])
+
+ if test "$OCAMLC" != "no"; then
+ OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'`
+ AC_MSG_RESULT([OCaml version is $OCAMLVERSION])
+ OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4`
+ AC_MSG_RESULT([OCaml library path is $OCAMLLIB])
+
+ AC_SUBST([OCAMLVERSION])
+ AC_SUBST([OCAMLLIB])
+
+ # checking for ocamlopt
+ AC_CHECK_TOOL([OCAMLOPT],[ocamlopt],[no])
+ OCAMLBEST=byte
+ if test "$OCAMLOPT" = "no"; then
+ AC_MSG_WARN([Cannot find ocamlopt; bytecode compilation only.])
+ else
+ TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ AC_MSG_RESULT([versions differs from ocamlc; ocamlopt discarded.])
+ OCAMLOPT=no
+ else
+ OCAMLBEST=opt
+ fi
+ fi
+
+ AC_SUBST([OCAMLBEST])
+
+ # checking for ocamlc.opt
+ AC_CHECK_TOOL([OCAMLCDOTOPT],[ocamlc.opt],[no])
+ if test "$OCAMLCDOTOPT" != "no"; then
+ TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ AC_MSG_RESULT([versions differs from ocamlc; ocamlc.opt discarded.])
+ else
+ OCAMLC=$OCAMLCDOTOPT
+ fi
+ fi
+
+ # checking for ocamlopt.opt
+ if test "$OCAMLOPT" != "no" ; then
+ AC_CHECK_TOOL([OCAMLOPTDOTOPT],[ocamlopt.opt],[no])
+ if test "$OCAMLOPTDOTOPT" != "no"; then
+ TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ AC_MSG_RESULT([version differs from ocamlc; ocamlopt.opt discarded.])
+ else
+ OCAMLOPT=$OCAMLOPTDOTOPT
+ fi
+ fi
+ fi
+
+ AC_SUBST([OCAMLOPT])
+ fi
+
+ AC_SUBST([OCAMLC])
+
+ # checking for ocamldep
+ AC_CHECK_TOOL([OCAMLDEP],[ocamldep],[no])
+
+ # checking for ocamlmktop
+ AC_CHECK_TOOL([OCAMLMKTOP],[ocamlmktop],[no])
+
+ # checking for ocamlmklib
+ AC_CHECK_TOOL([OCAMLMKLIB],[ocamlmklib],[no])
+
+ # checking for ocamldoc
+ AC_CHECK_TOOL([OCAMLDOC],[ocamldoc],[no])
+
+ # checking for ocamlbuild
+ AC_CHECK_TOOL([OCAMLBUILD],[ocamlbuild],[no])
+])
+
+
+AC_DEFUN([AC_PROG_OCAMLLEX],
+[dnl
+ # checking for ocamllex
+ AC_CHECK_TOOL([OCAMLLEX],[ocamllex],[no])
+ if test "$OCAMLLEX" != "no"; then
+ AC_CHECK_TOOL([OCAMLLEXDOTOPT],[ocamllex.opt],[no])
+ if test "$OCAMLLEXDOTOPT" != "no"; then
+ OCAMLLEX=$OCAMLLEXDOTOPT
+ fi
+ fi
+ AC_SUBST([OCAMLLEX])
+])
+
+AC_DEFUN([AC_PROG_OCAMLYACC],
+[dnl
+ AC_CHECK_TOOL([OCAMLYACC],[ocamlyacc],[no])
+ AC_SUBST([OCAMLYACC])
+])
+
+
+AC_DEFUN([AC_PROG_CAMLP4],
+[dnl
+ AC_REQUIRE([AC_PROG_OCAML])dnl
+
+ # checking for camlp4
+ AC_CHECK_TOOL([CAMLP4],[camlp4],[no])
+ if test "$CAMLP4" != "no"; then
+ TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p'`
+ if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+ AC_MSG_RESULT([versions differs from ocamlc])
+ CAMLP4=no
+ fi
+ fi
+ AC_SUBST([CAMLP4])
+
+ # checking for companion tools
+ AC_CHECK_TOOL([CAMLP4BOOT],[camlp4boot],[no])
+ AC_CHECK_TOOL([CAMLP4O],[camlp4o],[no])
+ AC_CHECK_TOOL([CAMLP4OF],[camlp4of],[no])
+ AC_CHECK_TOOL([CAMLP4OOF],[camlp4oof],[no])
+ AC_CHECK_TOOL([CAMLP4ORF],[camlp4orf],[no])
+ AC_CHECK_TOOL([CAMLP4PROF],[camlp4prof],[no])
+ AC_CHECK_TOOL([CAMLP4R],[camlp4r],[no])
+ AC_CHECK_TOOL([CAMLP4RF],[camlp4rf],[no])
+ AC_SUBST([CAMLP4BOOT])
+ AC_SUBST([CAMLP4O])
+ AC_SUBST([CAMLP4OF])
+ AC_SUBST([CAMLP4OOF])
+ AC_SUBST([CAMLP4ORF])
+ AC_SUBST([CAMLP4PROF])
+ AC_SUBST([CAMLP4R])
+ AC_SUBST([CAMLP4RF])
+])
+
+
+AC_DEFUN([AC_PROG_FINDLIB],
+[dnl
+ AC_REQUIRE([AC_PROG_OCAML])dnl
+
+ # checking for ocamlfind
+ AC_CHECK_TOOL([OCAMLFIND],[ocamlfind],[no])
+ AC_SUBST([OCAMLFIND])
+])
+
+
+dnl Thanks to Jim Meyering for working this next bit out for us.
+dnl XXX We should define AS_TR_SH if it's not defined already
+dnl (eg. for old autoconf).
+AC_DEFUN([AC_CHECK_OCAML_PKG],
+[dnl
+ AC_REQUIRE([AC_PROG_FINDLIB])dnl
+
+ AC_MSG_CHECKING([for OCaml findlib package $1])
+
+ unset found
+ unset pkg
+ found=no
+ for pkg in $1 $2 ; do
+ if $OCAMLFIND query $pkg >/dev/null 2>/dev/null; then
+ AC_MSG_RESULT([found])
+ AS_TR_SH([OCAML_PKG_$1])=$pkg
+ found=yes
+ break
+ fi
+ done
+ if test "$found" = "no" ; then
+ AC_MSG_RESULT([not found])
+ AS_TR_SH([OCAML_PKG_$1])=no
+ fi
+
+ AC_SUBST(AS_TR_SH([OCAML_PKG_$1]))
+])
+
+
+AC_DEFUN([AC_CHECK_OCAML_MODULE],
+[dnl
+ AC_MSG_CHECKING([for OCaml module $2])
+
+ cat > conftest.ml <<EOF
+open $3
+EOF
+ unset found
+ for $1 in $$1 $4 ; do
+ if $OCAMLC -c -I "$$1" conftest.ml >&5 2>&5 ; then
+ found=yes
+ break
+ fi
+ done
+
+ if test "$found" ; then
+ AC_MSG_RESULT([$$1])
+ else
+ AC_MSG_RESULT([not found])
+ $1=no
+ fi
+ AC_SUBST([$1])
+])
+
+
+dnl XXX Cross-compiling
+AC_DEFUN([AC_CHECK_OCAML_WORD_SIZE],
+[dnl
+ AC_MSG_CHECKING([for OCaml compiler word size])
+ cat > conftest.ml <<EOF
+ print_endline (string_of_int Sys.word_size)
+ EOF
+ OCAML_WORD_SIZE=`ocaml conftest.ml`
+ AC_MSG_RESULT([$OCAML_WORD_SIZE])
+ AC_SUBST([OCAML_WORD_SIZE])
+])
diff --git a/m4/ppl.m4 b/m4/ppl.m4
new file mode 100644
index 0000000..6259ce4
--- /dev/null
+++ b/m4/ppl.m4
@@ -0,0 +1,288 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the PPL, defining macros containing the required paths.
+dnl Copyright (C) 1997 Owen Taylor
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for PPL, and define PPL_CPPFLAGS, PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+ AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+ [prefix used to configure the PPL]),
+ ppl_prefix="$withval",
+ ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+ AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+ [exec-prefix used to configure the PPL]),
+ ppl_exec_prefix="$withval",
+ ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+ AS_HELP_STRING([--disable-ppltest],
+ [do not try to compile and run a test PPL program]),
+ ,
+ enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+ ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+ if test "x${PPL_CONFIG+set}" != xset
+ then
+ PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+ fi
+fi
+if test "x$ppl_prefix" != x
+then
+ ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+ if test "x${PPL_CONFIG+set}" != xset
+ then
+ PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+ fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+ AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+ AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+ no_ppl=yes
+else
+ PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+ PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --ldflags`
+ ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+ if test "x$enable_ppltest" = xyes
+ then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+ LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+ AC_LANG_PUSH(C++)
+
+ rm -f conf.ppltest
+ AC_TRY_RUN([
+#include <ppl.hh>
+#include <iostream>
+#include <cstdio>
+#include <cstdlib>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+using std::cout;
+using std::endl;
+
+int
+main() {
+ system("touch conf.ppltest");
+
+ unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+ int n = sscanf("$min_ppl_version",
+ "%u.%u.%upre%u%*c",
+ &min_ppl_major, &min_ppl_minor,
+ &min_ppl_revision, &min_ppl_beta);
+ bool min_ppl_version_ok = true;
+ if (n == 4) {
+ if (min_ppl_beta == 0)
+ min_ppl_version_ok = false;
+ }
+ else if (n == 3) {
+ n = sscanf("$min_ppl_version",
+ "%u.%u.%u%*c",
+ &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+ if (n != 3)
+ min_ppl_version_ok = false;
+ else
+ min_ppl_beta = 0;
+ }
+ else if (n == 2) {
+ n = sscanf("$min_ppl_version",
+ "%u.%upre%u%*c",
+ &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+ if (n == 3) {
+ if (min_ppl_beta == 0)
+ min_ppl_version_ok = false;
+ else
+ min_ppl_revision = 0;
+ }
+ else if (n == 2) {
+ n = sscanf("$min_ppl_version",
+ "%u.%u%*c",
+ &min_ppl_major, &min_ppl_minor);
+ if (n != 2)
+ min_ppl_version_ok = false;
+ else {
+ min_ppl_revision = 0;
+ min_ppl_beta = 0;
+ }
+ }
+ else
+ min_ppl_version_ok = false;
+ }
+ else
+ min_ppl_version_ok = false;
+
+ if (!min_ppl_version_ok) {
+ cout << "illegal version string '$min_ppl_version'"
+ << endl;
+ return 1;
+ }
+
+ if (strcmp("$ppl_config_version", PPL::version()) != 0) {
+ cout << "\n*** 'ppl-config --version' returned $ppl_config_version, "
+ "but PPL version "
+ << PPL::version()
+ << "\n*** was found! If ppl-config was correct, then it is best"
+ "\n*** to remove the old version of PPL."
+ " You may also be able to fix the error"
+ "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+ " or by editing"
+ "\n*** /etc/ld.so.conf."
+ " Make sure you have run ldconfig if that is"
+ "\n*** required on your system."
+ "\n*** If ppl-config was wrong, set the environment variable"
+ " PPL_CONFIG"
+ "\n*** to point to the correct copy of ppl-config,"
+ " and remove the file config.cache"
+ "\n*** before re-running configure."
+ << endl;
+ return 1;
+ }
+ else if (strcmp(PPL_VERSION, PPL::version()) != 0) {
+ cout << "\n*** PPL header file (version " PPL_VERSION ") does not match"
+ << "\n*** library (version " << PPL::version() << ")"
+ << endl;
+ return 1;
+ }
+ else if (PPL_VERSION_MAJOR < min_ppl_major
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR < min_ppl_minor)
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR == min_ppl_minor
+ && PPL_VERSION_REVISION < min_ppl_revision)
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR == min_ppl_minor
+ && PPL_VERSION_REVISION == min_ppl_revision
+ && PPL_VERSION_BETA < min_ppl_beta)) {
+ cout << "\n*** An old version of PPL (" PPL_VERSION ") was found."
+ "\n*** You need at least PPL version $min_ppl_version."
+ " The latest version of"
+ "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+ "\n***"
+ "\n*** If you have already installed a sufficiently new version,"
+ " this error"
+ "\n*** probably means that the wrong copy of the ppl-config"
+ " program is"
+ "\n*** being found. The easiest way to fix this is to remove"
+ " the old version"
+ "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+ " variable to point"
+ "\n*** to the correct copy of ppl-config. (In this case,"
+ " you will have to"
+ "\n*** modify your LD_LIBRARY_PATH enviroment"
+ " variable or edit /etc/ld.so.conf"
+ "\n*** so that the correct libraries are found at run-time.)"
+ << endl;
+ return 1;
+ }
+ return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+ AC_LANG_POP
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+ fi
+fi
+
+if test "x$no_ppl" = x
+then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+else
+ AC_MSG_RESULT(no)
+ if test x"$PPL_CONFIG" = xno
+ then
+ echo "*** The ppl-config script installed by PPL could not be found."
+ echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the PPL_CONFIG environment variable to the"
+ echo "*** full path to ppl-config."
+ else
+ if test -f conf.ppltest
+ then
+ :
+ else
+ echo "*** Could not run PPL test program, checking why..."
+ CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+ AC_TRY_LINK([
+#include <ppl.hh>
+using namespace Parma_Polyhedra_Library;
+],
+[
+ return version_major() || version_minor()
+ || version_revision() || version_beta();
+],
+[
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding the PPL or finding the"
+ echo "*** wrong version of the PPL. If it is not finding the PPL, you will"
+ echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+ echo "*** /etc/ld.so.conf to point to the installed location. Also, make"
+ echo "*** sure you have run ldconfig if that is required on your system."
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it,"
+ echo "*** although you may also be able to get things to work by modifying"
+ echo "*** LD_LIBRARY_PATH."
+],
+[
+ echo "*** The test program failed to compile or link. See the file"
+ echo "*** config.log for the exact error that occured. This usually means"
+ echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+ echo "*** since it was installed. In both cases you should reinstall"
+ echo "*** the library."
+])
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+ fi
+ fi
+ PPL_CPPFLAGS=""
+ PPL_LDFLAGS=""
+ ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/m4/ppl_c.m4 b/m4/ppl_c.m4
new file mode 100644
index 0000000..8680612
--- /dev/null
+++ b/m4/ppl_c.m4
@@ -0,0 +1,286 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the C interface of the PPL, defining macros containing
+dnl the required paths.
+dnl Copyright (C) 1997 Owen Taylor
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl AM_PATH_PPL_C([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for the C interface of the PPL, and define PPL_CPPFLAGS,
+dnl PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL_C],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+ AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+ [prefix used to configure the PPL]),
+ ppl_prefix="$withval",
+ ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+ AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+ [exec-prefix used to configure the PPL]),
+ ppl_exec_prefix="$withval",
+ ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+ AS_HELP_STRING([--disable-ppltest],
+ [do not try to compile and run a test PPL program]),
+ ,
+ enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+ ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+ if test "x${PPL_CONFIG+set}" != xset
+ then
+ PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+ fi
+fi
+if test "x$ppl_prefix" != x
+then
+ ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+ if test "x${PPL_CONFIG+set}" != xset
+ then
+ PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+ fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+ AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+ AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+ no_ppl=yes
+else
+ PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+ PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --interface=C --ldflags`
+ ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+ if test "x$enable_ppltest" = xyes
+ then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+ LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed (C interface of the) PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+ AC_LANG_PUSH(C)
+
+ rm -f conf.ppltest
+ AC_TRY_RUN([
+#include <ppl_c.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BOOL int
+#define TRUE 1
+#define FALSE 0
+
+int
+main() {
+ const char* version_string = 0;
+
+ system("touch conf.ppltest");
+
+ unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+ int n = sscanf("$min_ppl_version",
+ "%u.%u.%upre%u%*c",
+ &min_ppl_major, &min_ppl_minor,
+ &min_ppl_revision, &min_ppl_beta);
+ BOOL min_ppl_version_ok = TRUE;
+ if (n == 4) {
+ if (min_ppl_beta == 0)
+ min_ppl_version_ok = FALSE;
+ }
+ else if (n == 3) {
+ n = sscanf("$min_ppl_version",
+ "%u.%u.%u%*c",
+ &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+ if (n != 3)
+ min_ppl_version_ok = FALSE;
+ else
+ min_ppl_beta = 0;
+ }
+ else if (n == 2) {
+ n = sscanf("$min_ppl_version",
+ "%u.%upre%u%*c",
+ &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+ if (n == 3) {
+ if (min_ppl_beta == 0)
+ min_ppl_version_ok = FALSE;
+ else
+ min_ppl_revision = 0;
+ }
+ else if (n == 2) {
+ n = sscanf("$min_ppl_version",
+ "%u.%u%*c",
+ &min_ppl_major, &min_ppl_minor);
+ if (n != 2)
+ min_ppl_version_ok = FALSE;
+ else {
+ min_ppl_revision = 0;
+ min_ppl_beta = 0;
+ }
+ }
+ else
+ min_ppl_version_ok = FALSE;
+ }
+ else
+ min_ppl_version_ok = FALSE;
+
+ if (!min_ppl_version_ok) {
+ printf("illegal version string '$min_ppl_version'\n");
+ return 1;
+ }
+
+ ppl_version(&version_string);
+
+ if (strcmp("$ppl_config_version", version_string) != 0) {
+ printf("\n*** 'ppl-config --version' returned $ppl_config_version, "
+ "but PPL version %s", version_string);
+ printf("\n*** was found! If ppl-config was correct, then it is best"
+ "\n*** to remove the old version of PPL."
+ " You may also be able to fix the error"
+ "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+ " or by editing"
+ "\n*** /etc/ld.so.conf."
+ " Make sure you have run ldconfig if that is"
+ "\n*** required on your system."
+ "\n*** If ppl-config was wrong, set the environment variable"
+ " PPL_CONFIG"
+ "\n*** to point to the correct copy of ppl-config,"
+ " and remove the file config.cache"
+ "\n*** before re-running configure.\n");
+ return 1;
+ }
+ else if (strcmp(PPL_VERSION, version_string) != 0) {
+ printf("\n*** PPL header file (version " PPL_VERSION ") does not match"
+ "\n*** library (version %s)\n", version_string);
+ return 1;
+ }
+ else if (PPL_VERSION_MAJOR < min_ppl_major
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR < min_ppl_minor)
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR == min_ppl_minor
+ && PPL_VERSION_REVISION < min_ppl_revision)
+ || (PPL_VERSION_MAJOR == min_ppl_major
+ && PPL_VERSION_MINOR == min_ppl_minor
+ && PPL_VERSION_REVISION == min_ppl_revision
+ && PPL_VERSION_BETA < min_ppl_beta)) {
+ printf("\n*** An old version of PPL (" PPL_VERSION ") was found."
+ "\n*** You need at least PPL version $min_ppl_version."
+ " The latest version of"
+ "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+ "\n***"
+ "\n*** If you have already installed a sufficiently new version,"
+ " this error"
+ "\n*** probably means that the wrong copy of the ppl-config"
+ " program is"
+ "\n*** being found. The easiest way to fix this is to remove"
+ " the old version"
+ "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+ " variable to point"
+ "\n*** to the correct copy of ppl-config. (In this case,"
+ " you will have to"
+ "\n*** modify your LD_LIBRARY_PATH enviroment"
+ " variable or edit /etc/ld.so.conf"
+ "\n*** so that the correct libraries are found at run-time.)\n");
+ return 1;
+ }
+ return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+ AC_LANG_POP
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+ fi
+fi
+
+if test "x$no_ppl" = x
+then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+else
+ AC_MSG_RESULT(no)
+ if test x"$PPL_CONFIG" = xno
+ then
+ echo "*** The ppl-config script installed by PPL could not be found."
+ echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the PPL_CONFIG environment variable to the"
+ echo "*** full path to ppl-config."
+ else
+ if test -f conf.ppltest
+ then
+ :
+ else
+ echo "*** Could not run PPL test program, checking why..."
+ CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+ AC_TRY_LINK([
+#include <ppl_c.h>
+],
+[
+ return ppl_version_major() || ppl_version_minor()
+ || ppl_version_revision() || ppl_version_beta();
+],
+[
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding the PPL or finding the"
+ echo "*** wrong version of the PPL. If it is not finding the PPL, you will"
+ echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+ echo "*** /etc/ld.so.conf to point to the installed location. Also, make"
+ echo "*** sure you have run ldconfig if that is required on your system."
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it,"
+ echo "*** although you may also be able to get things to work by modifying"
+ echo "*** LD_LIBRARY_PATH."
+],
+[
+ echo "*** The test program failed to compile or link. See the file"
+ echo "*** config.log for the exact error that occured. This usually means"
+ echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+ echo "*** since it was installed. In both cases you should reinstall"
+ echo "*** the library."
+])
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+ fi
+ fi
+ PPL_CPPFLAGS=""
+ PPL_LDFLAGS=""
+ ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/missing b/missing
new file mode 100755
index 0000000..cdea514
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2012-06-26.16; # UTC
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'automa4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..55d537f
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,162 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2009-04-28.21; # UTC
+
+# Original author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+IFS=" "" $nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake at gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit $?
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit $?
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the 'mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because '.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ case $file in
+ /*) pathcomp=/ ;;
+ *) pathcomp= ;;
+ esac
+ oIFS=$IFS
+ IFS=/
+ set fnord $file
+ shift
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp=$pathcomp/
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ppl-config.h.in b/ppl-config.h.in
new file mode 100644
index 0000000..b8f71c0
--- /dev/null
+++ b/ppl-config.h.in
@@ -0,0 +1,411 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+ floating point format. */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#undef PPL_HAVE_DECL_FFS
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#undef PPL_HAVE_DECL_FMA
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_FMAF
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_FMAL
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_GETRUSAGE
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_RINTF
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_RINTL
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_RLIMIT_AS
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_RLIMIT_DATA
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_RLIMIT_RSS
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_RLIMIT_VMEM
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_SETITIMER
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_SETRLIMIT
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_SIGACTION
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_STRTOD
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+ */
+#undef PPL_HAVE_DECL_STRTOF
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_STRTOLD
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+ don't. */
+#undef PPL_HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef PPL_HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#undef PPL_HAVE_FENV_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef PPL_HAVE_GETOPT_H
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+#undef PPL_HAVE_GLPK_GLPK_H
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#undef PPL_HAVE_GLPK_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef PPL_HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef PPL_HAVE_INTTYPES_H
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#undef PPL_HAVE_INT_FAST16_T
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#undef PPL_HAVE_INT_FAST32_T
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#undef PPL_HAVE_INT_FAST64_T
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef PPL_HAVE_MEMORY_H
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#undef PPL_HAVE_SIGINFO_T
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef PPL_HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef PPL_HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef PPL_HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef PPL_HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef PPL_HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef PPL_HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef PPL_HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef PPL_HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef PPL_HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `timeval'. */
+#undef PPL_HAVE_TIMEVAL
+
+/* Define to 1 if typeof works with your compiler. */
+#undef PPL_HAVE_TYPEOF
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef PPL_HAVE_UINTPTR_T
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#undef PPL_HAVE_UINT_FAST16_T
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#undef PPL_HAVE_UINT_FAST32_T
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#undef PPL_HAVE_UINT_FAST64_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef PPL_HAVE_UNISTD_H
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PPL_PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PPL_PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PPL_PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PPL_PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PPL_PACKAGE_VERSION
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+#undef PPL_ABI_BREAKING_EXTRA_DEBUG
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+ */
+#undef PPL_CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef PPL_COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef PPL_COEFFICIENT_TYPE
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* The unique code of the binary format of C++ doubles, if supported;
+ undefined otherwise. */
+#undef PPL_CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef PPL_CXX_FLOAT_BINARY_FORMAT
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+ undefined otherwise. */
+#undef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the the plain char type is signed. */
+#undef PPL_CXX_PLAIN_CHAR_IS_SIGNED
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+ range or precision than double. */
+#undef PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#undef PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#undef PPL_CXX_SUPPORTS_LIMITING_MEMORY
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#undef PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#undef PPL_FPMATH_MAY_USE_387
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#undef PPL_FPMATH_MAY_USE_SSE
+
+/* Defined if GLPK provides glp_term_hook(). */
+#undef PPL_GLPK_HAS_GLP_TERM_HOOK
+
+/* Defined if GLPK provides glp_term_out(). */
+#undef PPL_GLPK_HAS_GLP_TERM_OUT
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+#undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef PPL_GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef PPL_GMP_SUPPORTS_EXCEPTIONS
+
+/* Defined if the integral type to be used for coefficients is a native one.
+ */
+#undef PPL_NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef PPL_NDEBUG
+
+/* Not zero if doubles are supported. */
+#undef PPL_SUPPORTED_DOUBLE
+
+/* Not zero if floats are supported. */
+#undef PPL_SUPPORTED_FLOAT
+
+/* Not zero if long doubles are supported. */
+#undef PPL_SUPPORTED_LONG_DOUBLE
+
+/* The size of `char', as computed by sizeof. */
+#undef PPL_SIZEOF_CHAR
+
+/* The size of `double', as computed by sizeof. */
+#undef PPL_SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef PPL_SIZEOF_FLOAT
+
+/* The size of `fp', as computed by sizeof. */
+#undef PPL_SIZEOF_FP
+
+/* The size of `int', as computed by sizeof. */
+#undef PPL_SIZEOF_INT
+
+/* The size of `int*', as computed by sizeof. */
+#undef PPL_SIZEOF_INTP
+
+/* The size of `long', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG
+
+/* The size of `long double', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG_DOUBLE
+
+/* The size of `long long', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG_LONG
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#undef PPL_SIZEOF_MP_LIMB_T
+
+/* The size of `short', as computed by sizeof. */
+#undef PPL_SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef PPL_SIZEOF_SIZE_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef PPL_STDC_HEADERS
+
+/* Define PPL_WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define PPL_WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef PPL_WORDS_BIGENDIAN
+# undef PPL_WORDS_BIGENDIAN
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+#undef _GLIBCXX_DEBUG
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+#undef _GLIBCXX_DEBUG_PEDANTIC
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+#undef typeof
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+#undef uintptr_t
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+ we must make sure <stdint.h> is included before <sys/types.hh> is
+ (even indirectly) included. Moreover we need to define
+ __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+ in order to have the macros defined also in C++. */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
diff --git a/ppl-config.sed b/ppl-config.sed
new file mode 100644
index 0000000..5d6d721
--- /dev/null
+++ b/ppl-config.sed
@@ -0,0 +1,71 @@
+s/\([^A-Z_]\)HAVE_DECL_FFS/\1PPL_HAVE_DECL_FFS/g
+s/\([^A-Z_]\)HAVE_DECL_FMA/\1PPL_HAVE_DECL_FMA/g
+s/\([^A-Z_]\)HAVE_DECL_FMAF/\1PPL_HAVE_DECL_FMAF/g
+s/\([^A-Z_]\)HAVE_DECL_FMAL/\1PPL_HAVE_DECL_FMAL/g
+s/\([^A-Z_]\)HAVE_DECL_GETENV/\1PPL_HAVE_DECL_GETENV/g
+s/\([^A-Z_]\)HAVE_DECL_GETRUSAGE/\1PPL_HAVE_DECL_GETRUSAGE/g
+s/\([^A-Z_]\)HAVE_DECL_RINTF/\1PPL_HAVE_DECL_RINTF/g
+s/\([^A-Z_]\)HAVE_DECL_RINTL/\1PPL_HAVE_DECL_RINTL/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_AS/\1PPL_HAVE_DECL_RLIMIT_AS/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_DATA/\1PPL_HAVE_DECL_RLIMIT_DATA/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_RSS/\1PPL_HAVE_DECL_RLIMIT_RSS/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_VMEM/\1PPL_HAVE_DECL_RLIMIT_VMEM/g
+s/\([^A-Z_]\)HAVE_DECL_SETITIMER/\1PPL_HAVE_DECL_SETITIMER/g
+s/\([^A-Z_]\)HAVE_DECL_SETRLIMIT/\1PPL_HAVE_DECL_SETRLIMIT/g
+s/\([^A-Z_]\)HAVE_DECL_SIGACTION/\1PPL_HAVE_DECL_SIGACTION/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOD/\1PPL_HAVE_DECL_STRTOD/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOF/\1PPL_HAVE_DECL_STRTOF/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOLD/\1PPL_HAVE_DECL_STRTOLD/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOLL/\1PPL_HAVE_DECL_STRTOLL/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOULL/\1PPL_HAVE_DECL_STRTOULL/g
+s/\([^A-Z_]\)HAVE_DLFCN_H/\1PPL_HAVE_DLFCN_H/g
+s/\([^A-Z_]\)HAVE_FENV_H/\1PPL_HAVE_FENV_H/g
+s/\([^A-Z_]\)HAVE_GETOPT_H/\1PPL_HAVE_GETOPT_H/g
+s/\([^A-Z_]\)HAVE_GLPK_GLPK_H/\1PPL_HAVE_GLPK_GLPK_H/g
+s/\([^A-Z_]\)HAVE_GLPK_H/\1PPL_HAVE_GLPK_H/g
+s/\([^A-Z_]\)HAVE_IEEEFP_H/\1PPL_HAVE_IEEEFP_H/g
+s/\([^A-Z_]\)HAVE_INTTYPES_H/\1PPL_HAVE_INTTYPES_H/g
+s/\([^A-Z_]\)HAVE_INT_FAST16_T/\1PPL_HAVE_INT_FAST16_T/g
+s/\([^A-Z_]\)HAVE_INT_FAST32_T/\1PPL_HAVE_INT_FAST32_T/g
+s/\([^A-Z_]\)HAVE_INT_FAST64_T/\1PPL_HAVE_INT_FAST64_T/g
+s/\([^A-Z_]\)HAVE_MEMORY_H/\1PPL_HAVE_MEMORY_H/g
+s/\([^A-Z_]\)HAVE_SETITIMER/\1PPL_HAVE_SETITIMER/g
+s/\([^A-Z_]\)HAVE_SIGINFO_T/\1PPL_HAVE_SIGINFO_T/g
+s/\([^A-Z_]\)HAVE_SIGNAL_H/\1PPL_HAVE_SIGNAL_H/g
+s/\([^A-Z_]\)HAVE_STDINT_H/\1PPL_HAVE_STDINT_H/g
+s/\([^A-Z_]\)HAVE_STDLIB_H/\1PPL_HAVE_STDLIB_H/g
+s/\([^A-Z_]\)HAVE_STRINGS_H/\1PPL_HAVE_STRINGS_H/g
+s/\([^A-Z_]\)HAVE_STRING_H/\1PPL_HAVE_STRING_H/g
+s/\([^A-Z_]\)HAVE_SYS_RESOURCE_H/\1PPL_HAVE_SYS_RESOURCE_H/g
+s/\([^A-Z_]\)HAVE_SYS_STAT_H/\1PPL_HAVE_SYS_STAT_H/g
+s/\([^A-Z_]\)HAVE_SYS_TIME_H/\1PPL_HAVE_SYS_TIME_H/g
+s/\([^A-Z_]\)HAVE_SYS_TYPES_H/\1PPL_HAVE_SYS_TYPES_H/g
+s/\([^A-Z_]\)HAVE_TIMEVAL/\1PPL_HAVE_TIMEVAL/g
+s/\([^A-Z_]\)HAVE_TYPEOF/\1PPL_HAVE_TYPEOF/g
+s/\([^A-Z_]\)HAVE_UINT_FAST16_T/\1PPL_HAVE_UINT_FAST16_T/g
+s/\([^A-Z_]\)HAVE_UINT_FAST32_T/\1PPL_HAVE_UINT_FAST32_T/g
+s/\([^A-Z_]\)HAVE_UINT_FAST64_T/\1PPL_HAVE_UINT_FAST64_T/g
+s/\([^A-Z_]\)HAVE_UINTPTR_T/\1PPL_HAVE_UINTPTR_T/g
+s/\([^A-Z_]\)HAVE_UNISTD_H/\1PPL_HAVE_UNISTD_H/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_ALLOC/\1PPL_HAVE___MPZ_STRUCT__MP_ALLOC/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_D/\1PPL_HAVE___MPZ_STRUCT__MP_D/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_SIZE/\1PPL_HAVE___MPZ_STRUCT__MP_SIZE/g
+s/\([^A-Z_]\)PACKAGE_BUGREPORT/\1PPL_PACKAGE_BUGREPORT/g
+s/\([^A-Z_]\)PACKAGE_NAME/\1PPL_PACKAGE_NAME/g
+s/\([^A-Z_]\)PACKAGE_STRING/\1PPL_PACKAGE_STRING/g
+s/\([^A-Z_]\)PACKAGE_TARNAME/\1PPL_PACKAGE_TARNAME/g
+s/\([^A-Z_]\)PACKAGE_VERSION/\1PPL_PACKAGE_VERSION/g
+s/\([^A-Z_]\)SIZEOF_CHAR/\1PPL_SIZEOF_CHAR/g
+s/\([^A-Z_]\)SIZEOF_DOUBLE/\1PPL_SIZEOF_DOUBLE/g
+s/\([^A-Z_]\)SIZEOF_FLOAT/\1PPL_SIZEOF_FLOAT/g
+s/\([^A-Z_]\)SIZEOF_FP/\1PPL_SIZEOF_FP/g
+s/\([^A-Z_]\)SIZEOF_INT/\1PPL_SIZEOF_INT/g
+s/\([^A-Z_]\)SIZEOF_INTP/\1PPL_SIZEOF_INTP/g
+s/\([^A-Z_]\)SIZEOF_LONG/\1PPL_SIZEOF_LONG/g
+s/\([^A-Z_]\)SIZEOF_LONG_DOUBLE/\1PPL_SIZEOF_LONG_DOUBLE/g
+s/\([^A-Z_]\)SIZEOF_LONG_LONG/\1PPL_SIZEOF_LONG_LONG/g
+s/\([^A-Z_]\)SIZEOF_MP_LIMB_T/\1PPL_SIZEOF_MP_LIMB_T/g
+s/\([^A-Z_]\)SIZEOF_SHORT/\1PPL_SIZEOF_SHORT/g
+s/\([^A-Z_]\)SIZEOF_SIZE_T/\1PPL_SIZEOF_SIZE_T/g
+s/\([^A-Z_]\)STDC_HEADERS/\1PPL_STDC_HEADERS/g
+s/\([^A-Z_]\)WORDS_BIGENDIAN/\1PPL_WORDS_BIGENDIAN/g
diff --git a/ppl.lsm.in b/ppl.lsm.in
new file mode 100644
index 0000000..0e01b58
--- /dev/null
+++ b/ppl.lsm.in
@@ -0,0 +1,45 @@
+Begin4
+Title: ppl
+Version: @VERSION@
+Entered-date: @ISODATE@
+Description: The Parma Polyhedra Library (PPL) is a C++ library
+ for the manipulation of numerical abstractions.
+Keywords: C++ library convex polyhedra verification
+Author: Roberto Bagnara (BUGSENG srl and University of Parma)
+ Patricia M. Hill (BUGSENG srl and University of Leeds)
+ Enea Zaffanella (BUGSENG srl and University of Parma)
+ Abramo Bagnara (BUGSENG srl)
+ Elisa Ricci (former student of the University of Parma)
+ Marco Poletti (student of the University of Bologna)
+ Alessandro Zaccagnini (University of Parma)
+ Roberto Amadini (former student of the University of Parma)
+ Irene Bacchi (former student of the University of Parma)
+ Fabio Biselli (student of the University of Parma)
+ Fabio Bossi (former student of the University of Parma)
+ Danilo Bonardi (former student of the University of Parma)
+ Sara Bonini (former student of the University of Parma)
+ Andrea Cimino (former student of the University of Parma)
+ Katy Dobson (former student of the University of Leeds)
+ Giordano Fracasso (former student of the University of Parma)
+ Francois Galea (University of Versailles)
+ Maximiliano Marchesi (former student of the University of Parma)
+ Elena Mazzi (former student of the University of Parma)
+ David Merchat (formerly at the University of Parma)
+ Matthew Mundell (formerly at the University of Leeds)
+ Andrea Pescetti (former student of the University of Parma)
+ Barbara Quartieri (former student of the University of Parma)
+ Enric Rodriguez Carbonell (Technical University of Catalonia)
+ Angela Stazzone (former student of the University of Parma)
+ Fabio Trabucchi (University of Parma)
+ Claudio Trento (former student of the University of Pisa)
+ Tatiana Zolo (former student of the University of Parma)
+Maintained-by: ppl-devel at cs.unipr.it (PPL developers)
+Primary-site: metlab.unc.edu /pub/linux/libs
+ 16788k ppl- at VERSION@.tar.gz
+ 800 ppl.lsm
+Alternate-site:
+Original-site: http://bugseng.com/products/ppl/
+Platforms: Portable; tested on Linux, FreeBSD, OpenBSD, Solaris,
+ IRIX64, Mac OS X, Cygwin, DEC OSF/1.
+Copying-policy: GPL
+End
diff --git a/src/BDS_Status_idefs.hh b/src/BDS_Status_idefs.hh
new file mode 100644
index 0000000..c2a609e
--- /dev/null
+++ b/src/BDS_Status_idefs.hh
@@ -0,0 +1,117 @@
+/* BD_Shape<T>::Status class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BDS_Status_idefs_hh
+#define PPL_BDS_Status_idefs_hh 1
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status_idefs.hh directly; use BD_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the BDS is the empty set;
+ - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+ closed system of bounded differences, so that all the constraints are
+ as tight as possible;
+ - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+ closed system of bounded differences and each constraint in such a system
+ is marked as being either redundant or non-redundant.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_shortest_path_closed() const;
+ void reset_shortest_path_closed();
+ void set_shortest_path_closed();
+
+ bool test_shortest_path_reduced() const;
+ void reset_shortest_path_reduced();
+ void set_shortest_path_reduced();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions.
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t SHORTEST_PATH_CLOSED = 1U << 1;
+ static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_BDS_Status_idefs_hh)
diff --git a/src/BDS_Status_inlines.hh b/src/BDS_Status_inlines.hh
new file mode 100644
index 0000000..8cf9130
--- /dev/null
+++ b/src/BDS_Status_inlines.hh
@@ -0,0 +1,268 @@
+/* BD_Shape<T>::Status class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BDS_Status_inlines_hh
+#define PPL_BDS_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+ flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+ return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+ // A system is reduced only if it is also closed.
+ reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+ set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+ return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+ reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+ PPL_ASSERT(test_shortest_path_closed());
+ set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The empty flag is incompatible with any other one."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Shortest-path reduction implies shortest-path closure.
+ if (test_shortest_path_reduced()) {
+ if (test_shortest_path_closed())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The shortest-path reduction flag should also imply "
+ << "the closure flag."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::BD_Shapes;
+ s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << separator
+ << (test_empty() ? yes : no) << empty << separator
+ << separator
+ << (test_shortest_path_closed() ? yes : no) << sp_closed << separator
+ << (test_shortest_path_reduced() ? yes : no) << sp_reduced << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::BD_Shapes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, sp_closed, positive))
+ return false;
+ if (positive)
+ set_shortest_path_closed();
+ else
+ reset_shortest_path_closed();
+
+ if (!get_field(s, sp_reduced, positive))
+ return false;
+ if (positive)
+ set_shortest_path_reduced();
+ else
+ reset_shortest_path_reduced();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BDS_Status_inlines_hh)
diff --git a/src/BD_Shape.cc b/src/BD_Shape.cc
new file mode 100644
index 0000000..f772fcd
--- /dev/null
+++ b/src/BD_Shape.cc
@@ -0,0 +1,93 @@
+/* BD_Shape class implementation: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "BD_Shape_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::BD_Shape_Helpers::extract_bounded_difference(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff) {
+ // Check for preconditions.
+ const dimension_type space_dim = c.space_dimension();
+ PPL_ASSERT(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+
+ c_first_var = c.expression().first_nonzero(1, space_dim + 1);
+ if (c_first_var == space_dim + 1)
+ // All the inhomogeneous coefficients are zero.
+ return true;
+
+ ++c_num_vars;
+
+ c_second_var = c.expression().first_nonzero(c_first_var + 1, space_dim + 1);
+ if (c_second_var == space_dim + 1) {
+ // c_first_var is the only inhomogeneous coefficient different from zero.
+ c_coeff = -c.expression().get(Variable(c_first_var - 1));
+
+ c_second_var = 0;
+ return true;
+ }
+
+ ++c_num_vars;
+
+ if (!c.expression().all_zeroes(c_second_var + 1, space_dim + 1))
+ // The constraint `c' is not a bounded difference.
+ return false;
+
+ // Make sure that `c' is indeed a bounded difference, i.e., it is of the
+ // form:
+ // a*x - a*y <=/= b.
+ Coefficient_traits::const_reference c0 = c.expression().get(Variable(c_first_var - 1));
+ Coefficient_traits::const_reference c1 = c.expression().get(Variable(c_second_var - 1));
+ if (sgn(c0) == sgn(c1) || c0 != -c1)
+ // Constraint `c' is not a bounded difference.
+ return false;
+
+ c_coeff = c1;
+
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
+ std::vector<dimension_type>& indices) {
+ // The vector `indices' contains one entry for each equivalence
+ // class, storing the index of the corresponding leader in
+ // increasing order: it is used to avoid repeated tests for leadership.
+ PPL_ASSERT(indices.size() == 0);
+ PPL_ASSERT(0 == predecessor[0]);
+ indices.push_back(0);
+ for (dimension_type i = 1, p_size = predecessor.size(); i != p_size; ++i)
+ if (i == predecessor[i])
+ indices.push_back(i);
+}
diff --git a/src/BD_Shape_defs.hh b/src/BD_Shape_defs.hh
new file mode 100644
index 0000000..0bfe836
--- /dev/null
+++ b/src/BD_Shape_defs.hh
@@ -0,0 +1,2371 @@
+/* BD_Shape class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_defs_hh
+#define PPL_BD_Shape_defs_hh 1
+
+#include "BD_Shape_types.hh"
+#include "globals_defs.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Poly_Con_Relation_types.hh"
+#include "Poly_Gen_Relation_types.hh"
+#include "Polyhedron_types.hh"
+#include "Box_types.hh"
+#include "Grid_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "DB_Matrix_defs.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "WRD_coefficient_types_defs.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+ Writes a textual representation of \p bds on \p s:
+ <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+ <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+ a system of constraints defining \p bds is written otherwise,
+ all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates BD_Shape */
+template <typename T>
+void swap(BD_Shape<T>& x, BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*! \relates BD_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same BDS.
+/*! \relates BD_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class BD_Shape_Helpers {
+public:
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as a bounded difference.
+ /*! \relates BD_Shape
+ \return
+ <CODE>true</CODE> if the constraint \p c is a
+ \ref Bounded_Difference_Shapes "bounded difference";
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0, 1 and 2.
+
+ \param c_first_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the first variable having
+ a non-zero coefficient in \p c.
+
+ \param c_second_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+ then it will be set to the index of the second variable having
+ a non-zero coefficient in \p c. If \p c_num_vars is set to 1, this must be
+ 0.
+
+ \param c_coeff
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the value of the first non-zero coefficient
+ in \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_bounded_difference(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+ std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+ The class template BD_Shape<T> allows for the efficient representation
+ of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+ called <EM>bounded difference shapes</EM> (BDSs, for short).
+ The name comes from the fact that the closed affine half-spaces that
+ characterize the polyhedron can be expressed by constraints of the form
+ \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+ term \f$k\f$ is a rational number.
+
+ Based on the class template type parameter \p T, a family of extended
+ numbers is built and used to approximate the inhomogeneous term of
+ bounded differences. These extended numbers provide a representation
+ for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+ implementations for several arithmetic functions.
+ The value of the type parameter \p T may be one of the following:
+ - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+ - a bounded precision floating point type (e.g., \c float or \c double);
+ - an unbounded integer or rational type, as provided by GMP
+ (i.e., \c mpz_class or \c mpq_class).
+
+ The user interface for BDSs is meant to be as similar as possible to
+ the one developed for the polyhedron class C_Polyhedron.
+
+ The domain of BD shapes <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - bounded difference constraints;
+ - non-proper congruences (i.e., equalities) that are expressible
+ as bounded-difference constraints.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ A constraint is a bounded difference if it has the form
+ \f[
+ a_i x_i - a_j x_j \relsym b
+ \f]
+ where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+ \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+ \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+ The user is warned that the above bounded difference Constraint object
+ will be mapped into a \e correct and \e optimal approximation that,
+ depending on the expressive power of the chosen template argument \p T,
+ may loose some precision. Also note that strict constraints are not
+ bounded differences.
+
+ For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+ approximated by:
+ - \f$x - y \leq 1\f$,
+ if \p T is a (bounded or unbounded) integer type;
+ - \f$x - y \leq \frac{1}{3}\f$,
+ if \p T is the unbounded rational type \c mpq_class;
+ - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+ if \p T is a floating point type (having no exact representation
+ for \f$\frac{1}{3}\f$).
+
+ On the other hand, depending from the context, a Constraint object
+ encoding \f$3x - y \leq 1\f$ will be either upward approximated
+ (e.g., by safely ignoring it) or it will cause an exception.
+
+ In the following examples it is assumed that the type argument \p T
+ is one of the possible instances listed above and that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+ (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ cs.insert(z >= 0);
+ cs.insert(z <= 1);
+ BD_Shape<T> bd(cs);
+ \endcode
+ Since only those constraints having the syntactic form of a
+ <EM>bounded difference</EM> are optimally supported, the following code
+ will throw an exception (caused by constraints 7, 8 and 9):
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ cs.insert(z >= 0);
+ cs.insert(z <= 1);
+ cs.insert(x + y <= 0); // 7
+ cs.insert(x - z + x >= 0); // 8
+ cs.insert(3*z - y <= 1); // 9
+ BD_Shape<T> bd(cs);
+ \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of
+ the inequalities defining a BDS.
+ */
+#ifndef NDEBUG
+ typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+ typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+ //! The numeric base type upon which bounded differences are built.
+ typedef T coefficient_type_base;
+
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of the
+ inequalities defining a BDS.
+ */
+ typedef N coefficient_type;
+
+ //! Returns the maximum space dimension that a BDS can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds a universe or empty BDS of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the BDS;
+
+ \param kind
+ Specifies whether the universe or the empty BDS has to be built.
+ */
+ explicit BD_Shape(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ BD_Shape(const BD_Shape& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename U>
+ explicit BD_Shape(const BD_Shape<U>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS from the system of constraints \p cs.
+ /*!
+ The BDS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of BD constraints.
+
+ \exception std::invalid_argument
+ Thrown if \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+ */
+ explicit BD_Shape(const Constraint_System& cs);
+
+ //! Builds a BDS from a system of congruences.
+ /*!
+ The BDS inherits the space dimension of \p cgs
+
+ \param cgs
+ A system of congruences.
+
+ \exception std::invalid_argument
+ Thrown if \p cgs contains congruences which are not optimally
+ supported by the BD shape domain.
+ */
+ explicit BD_Shape(const Congruence_System& cgs);
+
+ //! Builds a BDS from the system of generators \p gs.
+ /*!
+ Builds the smallest BDS containing the polyhedron defined by \p gs.
+ The BDS inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit BD_Shape(const Generator_System& gs);
+
+ //! Builds a BDS from the polyhedron \p ph.
+ /*!
+ Builds a BDS containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+ smallest one containing \p ph.
+ */
+ explicit BD_Shape(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS out of a box.
+ /*!
+ The BDS inherits the space dimension of the box.
+ The built BDS is the most precise BDS that includes the box.
+
+ \param box
+ The box representing the BDS to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit BD_Shape(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS out of a grid.
+ /*!
+ The BDS inherits the space dimension of the grid.
+ The built BDS is the most precise BDS that includes the grid.
+
+ \param grid
+ The grid used to build the BDS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p grid exceeds the maximum
+ allowed space dimension.
+ */
+ explicit BD_Shape(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS from an octagonal shape.
+ /*!
+ The BDS inherits the space dimension of the octagonal shape.
+ The built BDS is the most precise BDS that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the BDS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit BD_Shape(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ BD_Shape& operator=(const BD_Shape& y);
+
+ /*! \brief
+ Swaps \p *this with \p y
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ void m_swap(BD_Shape& y);
+
+ //! Destructor.
+ ~BD_Shape();
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the BD_Shape
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns a system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a minimal system of (equality) congruences
+ satisfied by \p *this with the same affine dimension as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const BD_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const BD_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const BD_Shape& y) const;
+
+ //! Returns the relations holding between \p *this and the constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and the congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and the generator \p g.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+ bool is_universe() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this satisfies
+ all its invariants.
+ */
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the BD_Shape
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of bounded differences
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the BD shape domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p *this.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the BD shape domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this.
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ Contains the congruences that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the BD shape domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ Contains the congruences that will be added to the system of
+ constraints of \p *this. Its elements may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the BD shape domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of bounded differences
+ defining \p *this.
+
+ \param c
+ The constraint. If it is not a bounded difference, it will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine the system of
+ bounded differences of \p *this.
+
+ \param cg
+ The congruence. If it is not a bounded difference equality, it
+ will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine the system of
+ bounded differences defining \p *this.
+
+ \param cs
+ The constraint system to be used. Constraints that are not bounded
+ differences are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine the system of
+ bounded differences defining \p *this.
+
+ \param cgs
+ The congruence system to be used. Congruences that are not bounded
+ difference equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines the system of BD_Shape constraints defining \p *this using
+ the constraint expressed by \p left \f$\leq\f$ \p right.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Refines the system of BD_Shape constraints defining \p *this using
+ the constraint expressed by \p left \f$\relsym\f$ \p right, where
+ \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ //! Applies to \p dest the interval constraints embedded in \p *this.
+ /*!
+ \param dest
+ The object to which the constraints will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest.
+
+ The template type parameter U must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the space dimension of the object.
+ \code
+ void set_empty()
+ \endcode
+ sets the object to an empty object.
+ \code
+ bool restrict_lower(dimension_type dim, const T& lb)
+ \endcode
+ restricts the object by applying the lower bound \p lb to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ \code
+ bool restrict_upper(dimension_type dim, const T& ub)
+ \endcode
+ restricts the object by applying the upper bound \p ub to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ */
+ template <typename U>
+ void export_interval_constraints(U& dest) const;
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const BD_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ If the \e integer upper bound of \p *this and \p y is exact,
+ it is assigned to \p *this and <CODE>true</CODE> is returned;
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ The integer upper bound of two rational BDS is the smallest rational
+ BDS containing all the integral points of the two arguments.
+ This method requires that the coefficient type parameter \c T is
+ an integral type.
+ */
+ bool integer_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BD shape containing
+ the set difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point coefficients that
+ defines the affine expression. ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+ */
+ template <typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form<Interval<T, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const BD_Shape& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator referencing the first stop-point.
+
+ \param last
+ An iterator referencing one past the last stop-point.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename Iterator>
+ void CC76_extrapolation_assign(const BD_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of restoring in \p y the constraints
+ of \p *this that were lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ A BDS that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ As was the case for widening operators, the argument \p y is meant to
+ denote the value computed in the previous iteration step, whereas
+ \p *this denotes the value computed in the current iteration step
+ (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+ <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+ the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+ */
+ void CC76_narrowing_assign(const BD_Shape& y);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref H79_widening "H79-widening" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ //! Same as H79_widening_assign(y, tp).
+ void widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref H79_widening "H79-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+ */
+ void limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old BDS into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new
+ BDS, which is defined by a system of bounded differences in which the
+ variables running through the new dimensions are unconstrained.
+ For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the BDS
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the BDS and does not embed it in
+ the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the
+ new BDS, which is defined by a system of bounded differences in
+ which the variables running through the new dimensions are all
+ constrained to be equal to 0.
+ For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the BDS
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const BD_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty co-domain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the co-domain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename Interval_Info>
+ void refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+ store) const;
+
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! The matrix representing the system of bounded differences.
+ DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+#include "BDS_Status_idefs.hh"
+#undef PPL_IN_BD_Shape_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ //! A matrix indicating which constraints are redundant.
+ Bit_Matrix redundancy_dbm;
+
+ //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+ bool marked_zero_dim_univ() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the BDS is known to be empty.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the system of bounded differences
+ is known to be shortest-path closed.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+ */
+ bool marked_shortest_path_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the system of bounded differences
+ is known to be shortest-path reduced.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+ */
+ bool marked_shortest_path_reduced() const;
+
+ //! Turns \p *this into an empty BDS.
+ void set_empty();
+
+ //! Turns \p *this into an zero-dimensional universe BDS.
+ void set_zero_dim_univ();
+
+ //! Marks \p *this as shortest-path closed.
+ void set_shortest_path_closed();
+
+ //! Marks \p *this as shortest-path closed.
+ void set_shortest_path_reduced();
+
+ //! Marks \p *this as possibly not shortest-path closed.
+ void reset_shortest_path_closed();
+
+ //! Marks \p *this as possibly not shortest-path reduced.
+ void reset_shortest_path_reduced();
+
+ //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+ void shortest_path_closure_assign() const;
+
+ /*! \brief
+ Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+ records into <CODE>this->redundancy_dbm</CODE> which of the entries
+ in <CODE>this->dbm</CODE> are redundant.
+ */
+ void shortest_path_reduction_assign() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+ is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+ correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+ */
+ bool is_shortest_path_reduced() const;
+
+ /*! \brief
+ Incrementally computes shortest-path closure, assuming that only
+ constraints affecting variable \p var need to be considered.
+
+ \note
+ It is assumed that \c *this, which was shortest-path closed,
+ has only been modified by adding constraints affecting variable
+ \p var. If this assumption is not satisfied, i.e., if a non-redundant
+ constraint not affecting variable \p var has been added, the behavior
+ is undefined.
+ */
+ void incremental_shortest_path_closure_assign(Variable var) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Current implementation is based on a variant of Algorithm 4.1 in
+ A. Bemporad, K. Fukuda, and F. D. Torrisi
+ <em>Convexity Recognition of the Union of Polyhedra</em>
+ Technical Report AUT00-13, ETH Zurich, 2000
+ tailored to the special case of BD shapes.
+
+ \note
+ It is assumed that \p *this and \p y are dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+ */
+ bool BFT00_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Implementation for the rational (resp., integer) case is based on
+ Theorem 5.2 (resp. Theorem 5.3) of \ref BHZ09b "[BHZ09b]".
+ The Boolean template parameter \c integer_upper_bound allows for
+ choosing between the rational and integer upper bound algorithms.
+
+ \note
+ It is assumed that \p *this and \p y are dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+
+ \note
+ The integer case is only enabled if T is an integer data type.
+ */
+ template <bool integer_upper_bound>
+ bool BHZ09_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added. Non BD constraints are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+ Non BD equalities are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= numer/denom</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ Adds to the BDS the constraint
+ \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+ Note that the coefficient of \p var in \p expr is null.
+ */
+ void refine(Variable var, Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ //! Removes all the constraints on row/column \p v.
+ void forget_all_dbm_constraints(dimension_type v);
+ //! Removes all binary constraints on row/column \p v.
+ void forget_binary_dbm_constraints(dimension_type v);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each dbm index \p u (less than or equal to \p last_v and different
+ from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+ starting from \p ub_v which is an upper bound for \p v.
+
+ The shortest-path closure is able to deduce the constraint
+ <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+ \p u played an active role in the computation of the upper bound for
+ \p v, i.e., if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero. In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+ */
+ void deduce_v_minus_u_bounds(dimension_type v,
+ dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form image" that
+ handle the general case: \f$l = c\f$
+ */
+ template <typename Interval_Info>
+ void inhomogeneous_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form
+ image" that handle the general case: \f$l = ax + c\f$
+ */
+ template <typename Interval_Info>
+ void one_variable_affine_form_image
+ (const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b,
+ const Interval<T, Interval_Info>& w_coeff,
+ const dimension_type& w_id,
+ const dimension_type& space_dim);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form image" that
+ handle the general case: \f$l = ax + by + c\f$
+ */
+ template <typename Interval_Info>
+ void two_variables_affine_form_image
+ (const dimension_type& var_id,
+ const Linear_Form<Interval<T,Interval_Info> >& lf,
+ const dimension_type& space_dim);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case: \f$l = ax + c\f$
+ */
+ template <typename Interval_Info>
+ void left_inhomogeneous_refine
+ (const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case: \f$ax + b = cy + d\f$
+ */
+ template <typename Interval_Info>
+ void left_one_var_refine
+ (const dimension_type& left_w_id,
+ const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case.
+ */
+ template <typename Interval_Info>
+ void general_refine(const dimension_type& left_w_id,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ template <typename Interval_Info>
+ void linear_form_upper_bound(const Linear_Form<Interval<T, Interval_Info> >&
+ lf,
+ N& result) const;
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each dbm index \p u (less than or equal to \p last_v and different
+ from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+ starting from \p minus_lb_v which is a lower bound for \p v.
+
+ The shortest-path closure is able to deduce the constraint
+ <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+ \p u played an active role in the computation of the lower bound for
+ \p v, i.e., if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+ */
+ void deduce_u_minus_v_bounds(dimension_type v,
+ dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v);
+
+ /*! \brief
+ Adds to \p limiting_shape the bounded differences in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const;
+
+ //! Compute the (zero-equivalence classes) predecessor relation.
+ /*!
+ It is assumed that the BDS is not empty and shortest-path closed.
+ */
+ void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the BDS is not empty and shortest-path closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+ void drop_some_non_integer_points_helper(N& elem);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const BD_Shape& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template<typename Interval_Info>
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<Interval<T, Interval_Info> >&
+ lf) const;
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+#include "BDS_Status_inlines.hh"
+#include "BD_Shape_inlines.hh"
+#include "BD_Shape_templates.hh"
+
+#endif // !defined(PPL_BD_Shape_defs_hh)
diff --git a/src/BD_Shape_inlines.hh b/src/BD_Shape_inlines.hh
new file mode 100644
index 0000000..d3b7022
--- /dev/null
+++ b/src/BD_Shape_inlines.hh
@@ -0,0 +1,910 @@
+/* BD_Shape class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_inlines_hh
+#define PPL_BD_Shape_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Temp_defs.hh"
+#include "meta_programming.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return std::min(DB_Matrix<N>::max_num_rows() - 1,
+ DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+ return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+ return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+ return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+ status.set_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_closed() {
+ status.set_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+ status.set_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+ status.reset_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+ status.reset_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+ if (kind == EMPTY)
+ set_empty();
+ else {
+ if (num_dimensions > 0)
+ // A (non zero-dim) universe BDS is closed.
+ set_shortest_path_closed();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
+ : dbm(y.dbm), status(y.status), redundancy_dbm() {
+ if (y.marked_shortest_path_reduced())
+ redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
+ // For maximum precision, enforce shortest-path closure
+ // before copying the DB matrix.
+ : dbm((y.shortest_path_closure_assign(), y.dbm)),
+ status(),
+ redundancy_dbm() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.marked_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+ return minimized_congruences();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ add_constraint(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_constraints(cs)",
+ "cs and *this are space-dimension incompatible");
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ if (!marked_empty())
+ refine_no_check(cg);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_congruences(cgs)",
+ "cgs and *this are space-dimension incompatible");
+
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent())
+ set_empty();
+ // Other proper congruences are just ignored.
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+ : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+ if (cs.space_dimension() > 0)
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ add_constraints(cs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+ Complexity_Class)
+ : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+ // Check emptiness for maximum precision.
+ if (box.is_empty())
+ set_empty();
+ else if (box.space_dimension() > 0) {
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ refine_with_constraints(box.constraints());
+ }
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+ Complexity_Class)
+ : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+ if (grid.space_dimension() > 0)
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ // Taking minimized congruences ensures maximum precision.
+ refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+ Complexity_Class)
+ : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+ // Check for emptiness for maximum precision.
+ if (os.is_empty())
+ set_empty();
+ else if (os.space_dimension() > 0) {
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ refine_with_constraints(os.constraints());
+ // After refining, shortest-path closure is possibly lost
+ // (even when `os' was strongly closed: recall that U
+ // is possibly different from T).
+ }
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+ dbm = y.dbm;
+ status = y.status;
+ if (y.marked_shortest_path_reduced())
+ redundancy_dbm = y.redundancy_dbm;
+ return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::m_swap(BD_Shape& y) {
+ using std::swap;
+ swap(dbm, y.dbm);
+ swap(status, y.status);
+ swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+ return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+ shortest_path_closure_assign();
+ return marked_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+ return true;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty())
+ return y.marked_empty();
+ else
+ return !y.marked_empty();
+ }
+
+ // The exact equivalence test requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal
+ // if and only if the other BDS is empty too.
+ if (x.marked_empty())
+ return y.marked_empty();
+ if (y.marked_empty())
+ return false;
+ // Check for syntactic equivalence of the two (shortest-path closed)
+ // systems of bounded differences.
+ return x.dbm == y.dbm;
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+ return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ const N& k) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+ N& dbm_ij = dbm[i][j];
+ if (dbm_ij > k) {
+ dbm_ij = k;
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+ PPL_ASSERT(denom != 0);
+ PPL_DIRTY_TEMP(N, k);
+ div_round_up(k, numer, denom);
+ add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("time_elapse_assign(y)", y);
+ // Compute time-elapse on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.time_elapse_assign(ph_y);
+ BD_Shape<T> x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+ const BD_Shape<T>& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+#if 0
+ return BFT00_upper_bound_assign_if_exact(y);
+#else
+ const bool integer_upper_bound = false;
+ return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+#endif
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::integer_upper_bound_assign_if_exact(const BD_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "BD_Shape<T>::integer_upper_bound_assign_if_exact(y):"
+ " T in not an integer datatype.");
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+ const bool integer_upper_bound = true;
+ return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ const dimension_type space_dim = space_dimension();
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any BDS is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a zero-dim space BDS.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Shortest-path closure is necessary as in remove_space_dimensions().
+ shortest_path_closure_assign();
+ dbm.resize_no_copy(new_dimension + 1);
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether or not reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // If we removed _all_ dimensions from a non-empty BDS,
+ // the zero-dim universe BDS has been obtained.
+ if (new_dimension == 0 && !marked_empty())
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "BD_Shape");
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+ static N stop_points[] = {
+ N(-2, ROUND_UP),
+ N(-1, ROUND_UP),
+ N( 0, ROUND_UP),
+ N( 1, ROUND_UP),
+ N( 2, ROUND_UP)
+ };
+ CC76_extrapolation_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]),
+ tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+ // Compute the H79 widening on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.H79_widening_assign(ph_y, tp);
+ BD_Shape x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+ H79_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Compute the limited H79 extrapolation on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.limited_H79_extrapolation_assign(ph_y, cs, tp);
+ BD_Shape x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+BD_Shape<T>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>::generalized_refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right);
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case LESS_THAN:
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right);
+ break;
+ case GREATER_THAN:
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>
+::refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+ store) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+ if (!is_integer(elem)) {
+ Result r = floor_assign_r(elem, elem, ROUND_DOWN);
+ PPL_USED(r);
+ PPL_ASSERT(r == V_EQ);
+ reset_shortest_path_closed();
+ }
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline void
+swap(BD_Shape<T>& x, BD_Shape<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_inlines_hh)
diff --git a/src/BD_Shape_templates.hh b/src/BD_Shape_templates.hh
new file mode 100644
index 0000000..3a175c2
--- /dev/null
+++ b/src/BD_Shape_templates.hh
@@ -0,0 +1,6789 @@
+/* BD_Shape class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_templates_hh
+#define PPL_BD_Shape_templates_hh 1
+
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Bit_Row_defs.hh"
+#include "Temp_defs.hh"
+#include "assert.hh"
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+ : dbm(cgs.space_dimension() + 1),
+ status(),
+ redundancy_dbm() {
+ add_congruences(cgs);
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+ : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty BD shape.
+ set_empty();
+ return;
+ }
+
+ const dimension_type space_dim = space_dimension();
+ DB_Row<N>& dbm_0 = dbm[0];
+ PPL_DIRTY_TEMP(N, tmp);
+
+ bool dbm_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::POINT:
+ point_seen = true;
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ if (!dbm_initialized) {
+ // When handling the first (closure) point, we initialize the DBM.
+ dbm_initialized = true;
+ const Coefficient& d = g.divisor();
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (i != j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(dbm_i[j], g_j - g_i, d);
+ }
+ div_round_up(dbm_i[0], -g_i, d);
+ }
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(dbm_0[j], g_j, d);
+ }
+ // Note: no need to initialize the first element of the main diagonal.
+ }
+ else {
+ // This is not the first point: the DBM already contains
+ // valid values and we must compute maxima.
+ const Coefficient& d = g.divisor();
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(tmp, g_j - g_i, d);
+ max_assign(dbm_i[j], tmp);
+ }
+ div_round_up(tmp, -g_i, d);
+ max_assign(dbm_i[0], tmp);
+ }
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(tmp, g_j, d);
+ max_assign(dbm_0[j], tmp);
+ }
+ }
+ break;
+ default:
+ // Lines and rays temporarily ignored.
+ break;
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw_invalid_argument("BD_Shape(gs)",
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::LINE:
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g_i != g.expression().get(Variable(j - 1)))
+ assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i != 0)
+ assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end(); i != i_end; ++i)
+ assign_r(dbm_0[i.variable().space_dimension()],
+ PLUS_INFINITY, ROUND_NOT_NEEDED);
+ break;
+ case Generator::RAY:
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g_i < g.expression().get(Variable(j - 1)))
+ assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i < 0)
+ assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end(); i != i_end; ++i)
+ if (*i > 0)
+ assign_r(dbm_0[i.variable().space_dimension()],
+ PLUS_INFINITY, ROUND_NOT_NEEDED);
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ set_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+ : dbm(), status(), redundancy_dbm() {
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ return;
+ }
+
+ // Build from generators when we do not care about complexity
+ // or when the process has polynomial complexity.
+ if (complexity == ANY_COMPLEXITY
+ || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+ *this = BD_Shape<T>(ph.generators());
+ return;
+ }
+
+ // We cannot afford exponential complexity, we do not have a complete set
+ // of generators for the polyhedron, and the polyhedron is not trivially
+ // empty or zero-dimensional. Constraints, however, are up to date.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+ // If the constraint system of the polyhedron is minimized,
+ // the test `is_universe()' has polynomial complexity.
+ if (ph.is_universe()) {
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ return;
+ }
+ }
+
+ // See if there is at least one inconsistent constraint in `ph.con_sys'.
+ for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+ cs_end = ph.con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // If `complexity' allows it, use simplex to derive the exact (modulo
+ // the fact that our BDSs are topologically closed) variable bounds.
+ if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(num_dimensions);
+ lp.set_optimization_mode(MAXIMIZATION);
+
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Start with a universe BDS that will be refined by the simplex.
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ // Get all the upper bounds.
+ Generator g(point());
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 1; i <= num_dimensions; ++i) {
+ Variable x(i-1);
+ // Evaluate optimal upper bound for `x <= ub'.
+ lp.set_objective_function(x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[0][i], numer, denom);
+ }
+ // Evaluate optimal upper bound for `x - y <= ub'.
+ for (dimension_type j = 1; j <= num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j-1);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[j][i], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[i][0], numer, denom);
+ }
+ }
+ set_shortest_path_closed();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+ const dimension_type space_dim = space_dimension();
+ // A zero-space-dim shape always has affine dimension zero.
+ if (space_dim == 0)
+ return 0;
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return 0;
+
+ // The vector `predecessor' is used to represent equivalence classes:
+ // `predecessor[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> predecessor;
+ compute_predecessors(predecessor);
+
+ // Due to the fictitious variable `0', the affine dimension is one
+ // less the number of equivalence classes.
+ dimension_type affine_dim = 0;
+ // Note: disregard the first equivalence class.
+ for (dimension_type i = 1; i <= space_dim; ++i)
+ if (predecessor[i] == i)
+ ++affine_dim;
+
+ return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ shortest_path_closure_assign();
+
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ if (marked_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Compute leader information.
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ // Go through the non-leaders to generate equality constraints.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const dimension_type leader = leaders[i];
+ if (i != leader) {
+ // Generate the constraint relating `i' and its leader.
+ if (leader == 0) {
+ // A unary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], numer, denom);
+ cgs.insert(denom*Variable(i-1) == numer);
+ }
+ else {
+ // A binary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], numer, denom);
+ cgs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+ }
+ }
+ }
+ return cgs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+ // Dimension-compatibility check.
+ if (c.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ // Get rid of strict inequalities.
+ if (c.is_strict_inequality()) {
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (c.is_tautological())
+ return;
+ // Nontrivial strict inequalities are not allowed.
+ throw_invalid_argument("add_constraint(c)",
+ "strict inequalities are not allowed");
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Constraints that are not bounded differences are not allowed.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not a bounded difference constraint");
+
+ const Coefficient& inhomo = c.inhomogeneous_term();
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (not a strict inequality).
+ if (inhomo < 0
+ || (inhomo != 0 && c.is_equality()))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ if (negative)
+ neg_assign(coeff);
+
+ bool changed = false;
+ N& x = negative ? dbm[i][j] : dbm[j][i];
+ // Compute the bound for `x', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, inhomo, coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ N& y = negative ? dbm[j][i] : dbm[i][j];
+ // Also compute the bound for `y', rounding towards plus infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ neg_assign(minus_c_term, inhomo);
+ div_round_up(d, minus_c_term, coeff);
+ if (y > d) {
+ y = d;
+ changed = true;
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check:
+ // the dimension of `cg' can not be greater than space_dim.
+ if (space_dimension() < cg_space_dim)
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ // Handle the case of proper congruences first.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_tautological())
+ return;
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Non-trivial and proper congruences are not allowed.
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a non-trivial, proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ add_constraint(c);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+ return;
+
+ const Coefficient& inhomo = c.inhomogeneous_term();
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (might be a strict inequality).
+ if (inhomo < 0
+ || (c.is_equality() && inhomo != 0)
+ || (c.is_strict_inequality() && inhomo == 0))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ N& x = negative ? dbm[i][j] : dbm[j][i];
+ N& y = negative ? dbm[j][i] : dbm[i][j];
+ if (negative)
+ neg_assign(coeff);
+
+ bool changed = false;
+ // Compute the bound for `x', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, inhomo, coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Also compute the bound for `y', rounding towards plus infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ neg_assign(minus_c_term, inhomo);
+ div_round_up(d, minus_c_term, coeff);
+ if (y > d) {
+ y = d;
+ changed = true;
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+ BD_Shape& x = *this;
+
+ const dimension_type x_space_dim = x.space_dimension();
+ const dimension_type y_space_dim = y.space_dimension();
+
+ // If `y' is an empty 0-dim space bounded difference shape,
+ // let `*this' become empty.
+ if (y_space_dim == 0 && y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+ // the dimension of the vector space.
+ if (x_space_dim == 0 && marked_empty()) {
+ dbm.grow(y_space_dim + 1);
+ PPL_ASSERT(OK());
+ return;
+ }
+ // First we increase the space dimension of `x' by adding
+ // `y.space_dimension()' new dimensions.
+ // The matrix for the new system of constraints is obtained
+ // by leaving the old system of constraints in the upper left-hand side
+ // and placing the constraints of `y' in the lower right-hand side,
+ // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+ // placed in the right position on the new matrix.
+ add_space_dimensions_and_embed(y_space_dim);
+ const dimension_type new_space_dim = x_space_dim + y_space_dim;
+ for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[0] = y.dbm[i - x_space_dim][0];
+ dbm[0][i] = y.dbm[0][i - x_space_dim];
+ for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+ dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+ }
+
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+ const BD_Shape<T>& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("contains(y)", y);
+
+ if (x_space_dim == 0) {
+ // The zero-dimensional empty shape only contains another
+ // zero-dimensional empty shape.
+ // The zero-dimensional universe shape contains any other
+ // zero-dimensional shape.
+ return marked_empty() ? y.marked_empty() : true;
+ }
+
+ /*
+ The `y' bounded difference shape must be closed. As an example,
+ consider the case where in `*this' we have the constraints
+
+ x1 - x2 <= 1,
+ x1 <= 3,
+ x2 <= 2,
+
+ and in `y' the constraints are
+
+ x1 - x2 <= 0,
+ x2 <= 1.
+
+ Without closure the (erroneous) analysis of the inhomogeneous terms
+ would conclude containment does not hold. Closing `y' results into
+ the "discovery" of the implicit constraint
+
+ x1 <= 1,
+
+ at which point the inhomogeneous terms can be examined to determine
+ that containment does hold.
+ */
+ y.shortest_path_closure_assign();
+ // An empty shape is contained in any other dimension-compatible shapes.
+ if (y.marked_empty())
+ return true;
+
+ // If `x' is empty it can not contain `y' (which is not empty).
+ if (x.is_empty())
+ return false;
+
+ // `*this' contains `y' if and only if every cell of `dbm'
+ // is greater than or equal to the correspondent one of `y.dbm'.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; )
+ if (x_dbm_i[j] < y_dbm_i[j])
+ return false;
+ }
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+ const dimension_type space_dim = space_dimension();
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If one of the two bounded difference shape is empty,
+ // then the two bounded difference shape are disjoint.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return true;
+ y.shortest_path_closure_assign();
+ if (y.marked_empty())
+ return true;
+
+ // Two BDSs are disjoint when their intersection is empty.
+ // That is if and only if there exists at least a bounded difference
+ // such that the upper bound of the bounded difference in the first
+ // BD_Shape is strictly less than the lower bound of
+ // the corresponding bounded difference in the second BD_Shape
+ // or vice versa.
+ // For example: let be
+ // in `*this': -a_j_i <= v_j - v_i <= a_i_j;
+ // and in `y': -b_j_i <= v_j - v_i <= b_i_j;
+ // `*this' and `y' are disjoint if
+ // 1.) a_i_j < -b_j_i or
+ // 2.) b_i_j < -a_j_i.
+ PPL_DIRTY_TEMP(N, tmp);
+ for (dimension_type i = space_dim+1; i-- > 0; ) {
+ const DB_Row<N>& x_i = dbm[i];
+ for (dimension_type j = space_dim+1; j-- > 0; ) {
+ neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+ if (x_i[j] < tmp)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+ if (marked_empty())
+ return false;
+
+ const dimension_type space_dim = space_dimension();
+ // If the BDS is non-empty and zero-dimensional,
+ // then it is necessarily the universe BDS.
+ if (space_dim == 0)
+ return true;
+
+ // A bounded difference shape defining the universe BDS can only
+ // contain trivial constraints.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (!is_plus_infinity(dbm_i[j]))
+ return false;
+ }
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+ shortest_path_closure_assign();
+ const dimension_type space_dim = space_dimension();
+ // A zero-dimensional or empty BDS is bounded.
+ if (marked_empty() || space_dim == 0)
+ return true;
+
+ // A bounded difference shape defining the bounded BDS never can
+ // contain trivial constraints.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (i != j)
+ if (is_plus_infinity(dbm_i[j]))
+ return false;
+ }
+
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+ // Force shortest-path closure.
+ if (is_empty())
+ return false;
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return true;
+
+ // A non-empty BD_Shape defined by integer constraints
+ // necessarily contains an integer point.
+ if (std::numeric_limits<T>::is_integer)
+ return true;
+
+ // Build an integer BD_Shape z with bounds at least as tight as
+ // those in *this and then recheck for emptiness.
+ BD_Shape<mpz_class> bds_z(space_dim);
+ typedef BD_Shape<mpz_class>::N Z;
+ bds_z.reset_shortest_path_closed();
+ PPL_DIRTY_TEMP(N, tmp);
+ bool all_integers = true;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<Z>& z_i = bds_z.dbm[i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ const N& dbm_i_j = dbm_i[j];
+ if (is_plus_infinity(dbm_i_j))
+ continue;
+ if (is_integer(dbm_i_j))
+ assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+ else {
+ all_integers = false;
+ Z& z_i_j = z_i[j];
+ // Copy dbm_i_j into z_i_j, but rounding downwards.
+ neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+ assign_r(z_i_j, tmp, ROUND_UP);
+ neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+ }
+ }
+ }
+ return all_integers || !bds_z.is_empty();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BD shape, we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The BD shape has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP(N, tmp);
+ Linear_Expression le = expr;
+ // Boolean to keep track of a variable `v' in expression `le'.
+ // If we can replace `v' by an expression using variables other
+ // than `v' and are already in `le', then this is set to true.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ // TODO: This loop can be optimized more, if needed, exploiting the
+ // (possible) sparseness of le.
+ for (dimension_type i = dbm.num_rows(); i-- > 1; ) {
+ const Variable v(i-1);
+ coeff = le.coefficient(v);
+ if (coeff == 0)
+ continue;
+
+ const DB_Row<N>& dbm_i = dbm[i];
+ // Check if `v' is constant in the BD shape.
+ assign_r(tmp, dbm_i[0], ROUND_NOT_NEEDED);
+ if (is_additive_inverse(dbm[0][i], tmp)) {
+ // If `v' is constant, replace it in `le' by the value.
+ numer_denom(tmp, numer, denom);
+ sub_mul_assign(le, coeff, v);
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ continue;
+ }
+ // Check the bounded differences with the other dimensions that
+ // have non-zero coefficient in `le'.
+ else {
+ bool constant_v = false;
+ for (Linear_Expression::const_iterator j = le.begin(),
+ j_end = le.lower_bound(Variable(i - 1)); j != j_end; ++j) {
+ const Variable vj = j.variable();
+ const dimension_type j_dim = vj.space_dimension();
+ assign_r(tmp, dbm_i[j_dim], ROUND_NOT_NEEDED);
+ if (is_additive_inverse(dbm[j_dim][i], tmp)) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the difference with `v' in the BD shape is constant.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(tmp, numer, denom);
+ // Modifying le invalidates the iterators, but it's not a problem
+ // since we are going to exit the loop.
+ sub_mul_assign(le, coeff, v);
+ add_mul_assign(le, coeff, vj);
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+ }
+ }
+
+ // The expression `expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the BD shape.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ shortest_path_closure_assign();
+ // A BD shape known to be empty constrains all variables.
+ // (Note: do not force emptiness check _yet_)
+ if (marked_empty())
+ return true;
+
+ // Check whether `var' is syntactically constrained.
+ const DB_Row<N>& dbm_v = dbm[var_space_dim];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ if (!is_plus_infinity(dbm_v[i])
+ || !is_plus_infinity(dbm[i][var_space_dim]))
+ return true;
+ }
+
+ // `var' is not syntactically constrained:
+ // now force an emptiness check.
+ return is_empty();
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+ PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+ PPL_ASSERT(predecessor.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `predecessor' is used to indicate which variable
+ // immediately precedes a given one in the corresponding equivalence class.
+ // The `leader' of an equivalence class is the element having minimum
+ // index: leaders are their own predecessors.
+ const dimension_type predecessor_size = dbm.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ predecessor.reserve(predecessor_size);
+ for (dimension_type i = 0; i < predecessor_size; ++i)
+ predecessor.push_back(i);
+ // Now compute actual predecessors.
+ for (dimension_type i = predecessor_size; i-- > 1; )
+ if (i == predecessor[i]) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i; j-- > 0; )
+ if (j == predecessor[j]
+ && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+ // Choose as predecessor the variable having the smaller index.
+ predecessor[i] = j;
+ break;
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+ PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+ PPL_ASSERT(leaders.size() == 0);
+ // Compute predecessor information.
+ compute_predecessors(leaders);
+ // Flatten the predecessor chains so as to obtain leaders.
+ PPL_ASSERT(leaders[0] == 0);
+ for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
+ const dimension_type leaders_i = leaders[i];
+ PPL_ASSERT(leaders_i <= i);
+ if (leaders_i != i) {
+ const dimension_type leaders_leaders_i = leaders[leaders_i];
+ PPL_ASSERT(leaders_leaders_i == leaders[leaders_leaders_i]);
+ leaders[i] = leaders_leaders_i;
+ }
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+ // If the BDS is empty, it is also reduced.
+ if (marked_empty())
+ return true;
+
+ const dimension_type space_dim = space_dimension();
+ // Zero-dimensional BDSs are necessarily reduced.
+ if (space_dim == 0)
+ return true;
+
+ // A shortest-path reduced dbm is just a dbm with an indication of
+ // those constraints that are redundant. If there is no indication
+ // of the redundant constraints, then it cannot be reduced.
+ if (!marked_shortest_path_reduced())
+ return false;
+
+ const BD_Shape x_copy = *this;
+ x_copy.shortest_path_closure_assign();
+ // If we just discovered emptiness, it cannot be reduced.
+ if (x_copy.marked_empty())
+ return false;
+
+ // The vector `leader' is used to indicate which variables are equivalent.
+ std::vector<dimension_type> leader(space_dim + 1);
+
+ // We store the leader.
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ leader[i] = i;
+
+ // Step 1: we store really the leader with the corrected value.
+ // We search for the equivalent or zero-equivalent variables.
+ // The variable(i-1) and variable(j-1) are equivalent if and only if
+ // m_i_j == -(m_j_i).
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j)
+ if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+ // Two equivalent variables have got the same leader
+ // (the smaller variable).
+ leader[j] = leader[i];
+ }
+
+ // Step 2: we check if there are redundant constraints in the zero_cycle
+ // free bounded difference shape, considering only the leaders.
+ // A constraint `c' is redundant, when there are two constraints such that
+ // their sum is the same constraint with the inhomogeneous term
+ // less than or equal to the `c' one.
+ PPL_DIRTY_TEMP(N, c);
+ for (dimension_type k = 0; k <= space_dim; ++k)
+ if (leader[k] == k) {
+ const DB_Row<N>& x_k = x_copy.dbm[k];
+ for (dimension_type i = 0; i <= space_dim; ++i)
+ if (leader[i] == i) {
+ const DB_Row<N>& x_i = x_copy.dbm[i];
+ const Bit_Row& redundancy_i = redundancy_dbm[i];
+ const N& x_i_k = x_i[k];
+ for (dimension_type j = 0; j <= space_dim; ++j)
+ if (leader[j] == j) {
+ const N& x_i_j = x_i[j];
+ if (!is_plus_infinity(x_i_j)) {
+ add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+ if (x_i_j >= c && !redundancy_i[j])
+ return false;
+ }
+ }
+ }
+ }
+
+ // The vector `var_conn' is used to check if there is a single cycle
+ // that connected all zero-equivalent variables between them.
+ // The value `space_dim + 1' is used to indicate that the equivalence
+ // class contains a single variable.
+ std::vector<dimension_type> var_conn(space_dim + 1);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ var_conn[i] = space_dim + 1;
+
+ // Step 3: we store really the `var_conn' with the right value, putting
+ // the variable with the selected variable is connected:
+ // we check the row of each variable:
+ // a- each leader could be connected with only zero-equivalent one,
+ // b- each non-leader with only another zero-equivalent one.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ // It count with how many variables the selected variable is
+ // connected.
+ dimension_type t = 0;
+ dimension_type leader_i = leader[i];
+ // Case a: leader.
+ if (leader_i == i) {
+ for (dimension_type j = 0; j <= space_dim; ++j) {
+ dimension_type leader_j = leader[j];
+ // Only the connectedness with equivalent variables
+ // is considered.
+ if (j != leader_j)
+ if (!redundancy_dbm[i][j]) {
+ if (t == 1)
+ // Two non-leaders cannot be connected with the same leader.
+ return false;
+ else
+ if (leader_j != i)
+ // The variables are not in the same equivalence class.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ }
+ }
+ // Case b: non-leader.
+ else {
+ for (dimension_type j = 0; j <= space_dim; ++j) {
+ if (!redundancy_dbm[i][j]) {
+ dimension_type leader_j = leader[j];
+ if (leader_i != leader_j)
+ // The variables are not in the same equivalence class.
+ return false;
+ else {
+ if (t == 1)
+ // The variables cannot be connected with the same leader.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ // A non-leader must be connected with
+ // another variable.
+ if (t == 0)
+ return false;
+ }
+ }
+ }
+ }
+
+ // The vector `just_checked' is used to check if
+ // a variable is already checked.
+ std::vector<bool> just_checked(space_dim + 1);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ just_checked[i] = false;
+
+ // Step 4: we check if there are single cycles that
+ // connected all the zero-equivalent variables between them.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ // We do not re-check the already considered single cycles.
+ if (!just_checked[i]) {
+ dimension_type v_con = var_conn[i];
+ // We consider only the equivalence classes with
+ // 2 or plus variables.
+ if (v_con != space_dim + 1) {
+ // There is a single cycle if taken a variable,
+ // we return to this same variable.
+ while (v_con != i) {
+ just_checked[v_con] = true;
+ v_con = var_conn[v_con];
+ // If we re-pass to an already considered variable,
+ // then we haven't a single cycle.
+ if (just_checked[v_con])
+ return false;
+ }
+ }
+ }
+ just_checked[i] = true;
+ }
+
+ // The system bounded differences is just reduced.
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+ const bool from_above) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+
+ shortest_path_closure_assign();
+ // A zero-dimensional or empty BDS bounds everything.
+ if (space_dim == 0 || marked_empty())
+ return true;
+
+ // The constraint `c' is used to check if `expr' is a difference
+ // bounded and, in this case, to select the cell.
+ const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Check if `c' is a BD constraint.
+ if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ if (num_vars == 0)
+ // Dealing with a trivial constraint.
+ return true;
+ // Select the cell to be checked.
+ const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ return !is_plus_infinity(x);
+ }
+ else {
+ // Not a DB constraint: use the MIP solver.
+ Optimization_Mode mode_bounds
+ = from_above ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+ // Problem is known to be feasible.
+ return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim BDS first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BDS we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The constraint `c' is used to check if `expr' is a difference
+ // bounded and, in this case, to select the cell.
+ const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Check if `c' is a BD constraint.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ Optimization_Mode mode_max_min
+ = maximize ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ mip.optimal_value(ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ else
+ // Here`expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // Here `expr' is a bounded difference.
+ if (num_vars == 0) {
+ // Dealing with a trivial expression.
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+
+ // Select the cell to be checked.
+ const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ if (!is_plus_infinity(x)) {
+ // Compute the maximize/minimize of `expr'.
+ PPL_DIRTY_TEMP(N, d);
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = maximize ? b : minus_b;
+ assign_r(d, sc_b, ROUND_UP);
+ // Set `coeff_expr' to the absolute value of coefficient of
+ // a variable in `expr'.
+ PPL_DIRTY_TEMP(N, coeff_expr);
+ PPL_ASSERT(i != 0);
+ const Coefficient& coeff_i = expr.get(Variable(i - 1));
+ const int sign_i = sgn(coeff_i);
+ if (sign_i > 0)
+ assign_r(coeff_expr, coeff_i, ROUND_UP);
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+ neg_assign(minus_coeff_i, coeff_i);
+ assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+ }
+ // Approximating the maximum/minimum of `expr'.
+ add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+ numer_denom(d, ext_n, ext_d);
+ if (!maximize)
+ neg_assign(ext_n);
+ included = true;
+ return true;
+ }
+
+ // `expr' is unbounded.
+ return false;
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included,
+ Generator& g) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim BDS first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ g = point();
+ return true;
+ }
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BDS we simply return false.
+ if (marked_empty())
+ return false;
+
+ Optimization_Mode mode_max_min
+ = maximize ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = mip.optimizing_point();
+ mip.evaluate_objective_function(g, ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ // Here `expr' is unbounded in `*this'.
+ return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg.space_dimension() > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ // If the congruence is an equality, find the relation with
+ // the equivalent equality constraint.
+ if (cg.is_equality()) {
+ Constraint c(cg);
+ return relation_with(c);
+ }
+
+ shortest_path_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
+ Linear_Expression le = Linear_Expression(cg.expression());
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ bool min_included;
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_numer / min_denom;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_denom < min_numer)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_numer / max_denom;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_denom > max_numer)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+ const dimension_type c_space_dim = c.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ shortest_path_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ // Constraints that are not bounded differences.
+ // Use maximize() and minimize() to do much of the work.
+
+ // Find the linear expression for the constraint and use that to
+ // find if the expression is bounded from above or below and if it
+ // is, find the maximum and minimum values.
+ Linear_Expression le(c.expression());
+ le.set_inhomogeneous_term(Coefficient_zero());
+
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+ if (!bounded_above) {
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_strict_inequality() || c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ if (!bounded_below) {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ PPL_UNREACHABLE;
+ break;
+ case 0:
+ if (min_numer == 0) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ }
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+
+ // Constraints that are bounded differences.
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+ }
+
+ // Select the cell to be checked for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ const N& x = negative ? dbm[i][j] : dbm[j][i];
+ const N& y = negative ? dbm[j][i] : dbm[i][j];
+ if (negative)
+ neg_assign(coeff);
+ // Deduce the relation/s of the constraint `c' of the form
+ // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+ // with the respectively constraints in `*this'
+ // `-y <= v - u <= x'.
+ // Let `d == c.inhomogeneous_term()/coeff'
+ // and `d1 == -c.inhomogeneous_term()/coeff'.
+ // The following variables of mpq_class type are used to be precise
+ // when the bds is defined by integer constraints.
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ PPL_DIRTY_TEMP(mpq_class, d);
+ PPL_DIRTY_TEMP(mpq_class, d1);
+ PPL_DIRTY_TEMP(mpq_class, c_denom);
+ PPL_DIRTY_TEMP(mpq_class, q_denom);
+ assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+ assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+ div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+ div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+ if (is_plus_infinity(x)) {
+ if (!is_plus_infinity(y)) {
+ // `*this' is in the following form:
+ // `-y <= v - u'.
+ // In this case `*this' is disjoint from `c' if
+ // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+ // `y < d1' (`y <= d1' if c is a strict equality).
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ numer_denom(y, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+
+ // Here `x' is not plus-infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ numer_denom(x, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_x, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+ if (!is_plus_infinity(y)) {
+ numer_denom(y, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_x == d && q_y == d1) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+ // `*this' is disjoint from `c' when
+ // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+ // `y < d1' (`y <= d1' if c is a strict equality).
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // Here `y' can be also plus-infinity.
+ // If `c' is an equality, `*this' is disjoint from `c' if
+ // `x < d'.
+ if (d > q_x) {
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+
+ if (d == q_x && c.is_nonstrict_inequality())
+ return Poly_Con_Relation::is_included();
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+ const dimension_type space_dim = space_dimension();
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ shortest_path_closure_assign();
+ // The empty BDS cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe BDS in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ const bool is_line = g.is_line();
+ const bool is_line_or_ray = g.is_line_or_ray();
+
+ // The relation between the BDS and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the BDS.
+ // To check if the generator satisfies all the constraints it's enough
+ // studying the sign of the scalar product between the generator and
+ // all the constraints in the BDS.
+
+ // Allocation of temporaries done once and for all.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+ // We find in `*this' all the constraints.
+ // TODO: This loop can be optimized more, if needed.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+ ? Coefficient_zero() : g.coefficient(Variable(i-1));
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Coefficient& g_coeff_x = (j > g_space_dim)
+ ? Coefficient_zero() : g.coefficient(Variable(j-1));
+ const N& dbm_ij = dbm_i[j];
+ const N& dbm_ji = dbm[j][i];
+ if (is_additive_inverse(dbm_ji, dbm_ij)) {
+ // We have one equality constraint: denom*x - denom*y = numer.
+ // Compute the scalar product.
+ numer_denom(dbm_ij, numer, denom);
+ product = g_coeff_y;
+ product -= g_coeff_x;
+ product *= denom;
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ // We have 0, 1 or 2 binary inequality constraint/s.
+ if (!is_plus_infinity(dbm_ij)) {
+ // We have the binary inequality constraint:
+ // denom*x - denom*y <= numer.
+ // Compute the scalar product.
+ numer_denom(dbm_ij, numer, denom);
+ product = g_coeff_y;
+ product -= g_coeff_x;
+ product *= denom;
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (is_line) {
+ if (product != 0)
+ // Lines must saturate all constraints.
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ if (product < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+
+ if (!is_plus_infinity(dbm_ji)) {
+ // We have the binary inequality constraint: denom*y - denom*x <= b.
+ // Compute the scalar product.
+ numer_denom(dbm_ji, numer, denom);
+ product = 0;
+ add_mul_assign(product, denom, g_coeff_x);
+ add_mul_assign(product, -denom, g_coeff_y);
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (is_line) {
+ if (product != 0)
+ // Lines must saturate all constraints.
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ if (product < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+
+ // The generator satisfies all the constraints.
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+ // Do something only if necessary.
+ if (marked_empty() || marked_shortest_path_closed())
+ return;
+ const dimension_type num_dimensions = space_dimension();
+ // Zero-dimensional BDSs are necessarily shortest-path closed.
+ if (num_dimensions == 0)
+ return;
+
+ // Even though the BDS will not change, its internal representation
+ // is going to be modified by the Floyd-Warshall algorithm.
+ BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+ // Fill the main diagonal with zeros.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ PPL_DIRTY_TEMP(N, sum);
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ const DB_Row<N>& x_dbm_k = x.dbm[k];
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_dbm_i = x.dbm[i];
+ const N& x_dbm_i_k = x_dbm_i[k];
+ if (!is_plus_infinity(x_dbm_i_k))
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& x_dbm_k_j = x_dbm_k[j];
+ if (!is_plus_infinity(x_dbm_k_j)) {
+ // Rounding upward for correctness.
+ add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+ min_assign(x_dbm_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the BDS is empty if and only if there is a
+ // negative value on the main diagonal of `dbm'.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ N& x_dbm_hh = x.dbm[h][h];
+ if (sgn(x_dbm_hh) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_dbm_hh) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::incremental_shortest_path_closure_assign(Variable var) const {
+ // Do something only if necessary.
+ if (marked_empty() || marked_shortest_path_closed())
+ return;
+ const dimension_type num_dimensions = space_dimension();
+ PPL_ASSERT(var.id() < num_dimensions);
+
+ // Even though the BDS will not change, its internal representation
+ // is going to be modified by the incremental Floyd-Warshall algorithm.
+ BD_Shape& x = const_cast<BD_Shape&>(*this);
+
+ // Fill the main diagonal with zeros.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ // Using the incremental Floyd-Warshall algorithm.
+ PPL_DIRTY_TEMP(N, sum);
+ const dimension_type v = var.id() + 1;
+ DB_Row<N>& x_v = x.dbm[v];
+ // Step 1: Improve all constraints on variable `var'.
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ DB_Row<N>& x_k = x.dbm[k];
+ const N& x_v_k = x_v[k];
+ const N& x_k_v = x_k[v];
+ const bool x_v_k_finite = !is_plus_infinity(x_v_k);
+ const bool x_k_v_finite = !is_plus_infinity(x_k_v);
+ // Specialize inner loop based on finiteness info.
+ if (x_v_k_finite) {
+ if (x_k_v_finite) {
+ // Here both x_v_k and x_k_v are finite.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_k = x_i[k];
+ if (!is_plus_infinity(x_i_k)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ min_assign(x_i[v], sum);
+ }
+ const N& x_k_i = x_k[i];
+ if (!is_plus_infinity(x_k_i)) {
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v[i], sum);
+ }
+ }
+ }
+ else {
+ // Here x_v_k is finite, but x_k_v is not.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ const N& x_k_i = x_k[i];
+ if (!is_plus_infinity(x_k_i)) {
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v[i], sum);
+ }
+ }
+ }
+ }
+ else if (x_k_v_finite) {
+ // Here x_v_k is infinite, but x_k_v is finite.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_k = x_i[k];
+ if (!is_plus_infinity(x_i_k)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ min_assign(x_i[v], sum);
+ }
+ }
+ }
+ else
+ // Here both x_v_k and x_k_v are infinite.
+ continue;
+ }
+
+ // Step 2: improve the other bounds by using the precise bounds
+ // for the constraints on `var'.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_v = x_i[v];
+ if (!is_plus_infinity(x_i_v)) {
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& x_v_j = x_v[j];
+ if (!is_plus_infinity(x_v_j)) {
+ add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+ min_assign(x_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the BDS is empty if and only if there is a
+ // negative value on the main diagonal of `dbm'.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ N& x_dbm_hh = x.dbm[h][h];
+ if (sgn(x_dbm_hh) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_dbm_hh) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+ // Do something only if necessary.
+ if (marked_shortest_path_reduced())
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ // Zero-dimensional BDSs are necessarily reduced.
+ if (space_dim == 0)
+ return;
+
+ // First find the tightest constraints for this BDS.
+ shortest_path_closure_assign();
+
+ // If `*this' is empty, then there is nothing to reduce.
+ if (marked_empty())
+ return;
+
+ // Step 1: compute zero-equivalence classes.
+ // Variables corresponding to indices `i' and `j' are zero-equivalent
+ // if they lie on a zero-weight loop; since the matrix is shortest-path
+ // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+ std::vector<dimension_type> predecessor;
+ compute_predecessors(predecessor);
+ std::vector<dimension_type> leaders;
+ compute_leader_indices(predecessor, leaders);
+ const dimension_type num_leaders = leaders.size();
+
+ Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+ // Init all constraints to be redundant.
+ // TODO: provide an appropriate method to set multiple bits.
+ Bit_Row& red_0 = redundancy[0];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ red_0.set(j);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ redundancy[i] = red_0;
+
+ // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+ // subsystem of bounded differences having only leaders as variables.
+ PPL_DIRTY_TEMP(N, c);
+ for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leaders[l_i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ Bit_Row& redundancy_i = redundancy[i];
+ for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+ const dimension_type j = leaders[l_j];
+ if (redundancy_i[j]) {
+ const N& dbm_i_j = dbm_i[j];
+ redundancy_i.clear(j);
+ for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+ const dimension_type k = leaders[l_k];
+ add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+ if (dbm_i_j >= c) {
+ redundancy_i.set(j);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Step 3: flag non-redundant constraints in zero-equivalence classes.
+ // Each equivalence class must have a single 0-cycle connecting
+ // all the equivalent variables in increasing order.
+ std::deque<bool> dealt_with(space_dim + 1, false);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ // We only need to deal with non-singleton zero-equivalence classes
+ // that haven't already been dealt with.
+ if (i != predecessor[i] && !dealt_with[i]) {
+ dimension_type j = i;
+ while (true) {
+ const dimension_type predecessor_j = predecessor[j];
+ if (j == predecessor_j) {
+ // We finally found the leader of `i'.
+ PPL_ASSERT(redundancy[i][j]);
+ redundancy[i].clear(j);
+ // Here we dealt with `j' (i.e., `predecessor_j'), but it is useless
+ // to update `dealt_with' because `j' is a leader.
+ break;
+ }
+ // We haven't found the leader of `i' yet.
+ PPL_ASSERT(redundancy[predecessor_j][j]);
+ redundancy[predecessor_j].clear(j);
+ dealt_with[predecessor_j] = true;
+ j = predecessor_j;
+ }
+ }
+
+ // Even though shortest-path reduction is not going to change the BDS,
+ // it might change its internal representation.
+ BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+ using std::swap;
+ swap(x.redundancy_dbm, redundancy);
+ x.set_shortest_path_reduced();
+
+ PPL_ASSERT(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The upper bound of a BD shape `bd' with an empty shape is `bd'.
+ y.shortest_path_closure_assign();
+ if (y.marked_empty())
+ return;
+ shortest_path_closure_assign();
+ if (marked_empty()) {
+ *this = y;
+ return;
+ }
+
+ // The bds-hull consists in constructing `*this' with the maximum
+ // elements selected from `*this' and `y'.
+ PPL_ASSERT(space_dim == 0 || marked_shortest_path_closed());
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (dbm_ij < y_dbm_ij)
+ dbm_ij = y_dbm_ij;
+ }
+ }
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::BFT00_upper_bound_assign_if_exact(const BD_Shape& y) {
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const BD_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x_space_dim == y.space_dimension());
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ // Implementation based on Algorithm 4.1 (page 6) in [BemporadFT00TR],
+ // tailored to the special case of BD shapes.
+
+ Variable epsilon(x_space_dim);
+ Linear_Expression zero_expr;
+ zero_expr.set_space_dimension(x_space_dim + 1);
+ Linear_Expression db_expr;
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Step 1: compute the constraint system for the envelope env(x,y)
+ // and put into x_cs_removed and y_cs_removed those non-redundant
+ // constraints that are not in the constraint system for env(x,y).
+ // While at it, also add the additional space dimension (epsilon).
+ Constraint_System env_cs;
+ Constraint_System x_cs_removed;
+ Constraint_System y_cs_removed;
+ x.shortest_path_reduction_assign();
+ y.shortest_path_reduction_assign();
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const Bit_Row& x_red_i = x.redundancy_dbm[i];
+ const Bit_Row& y_red_i = y.redundancy_dbm[i];
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+ if (x_red_i[j] && y_red_i[j])
+ continue;
+ if (!x_red_i[j]) {
+ const N& x_dbm_ij = x_dbm_i[j];
+ PPL_ASSERT(!is_plus_infinity(x_dbm_ij));
+ numer_denom(x_dbm_ij, numer, denom);
+ // Build skeleton DB constraint (having the right space dimension).
+ db_expr = zero_expr;
+ if (i > 0)
+ db_expr += Variable(i-1);
+ if (j > 0)
+ db_expr -= Variable(j-1);
+ if (denom != 1)
+ db_expr *= denom;
+ db_expr += numer;
+ if (x_dbm_ij >= y_dbm_i[j])
+ env_cs.insert(db_expr >= 0);
+ else {
+ db_expr += epsilon;
+ x_cs_removed.insert(db_expr == 0);
+ }
+ }
+ if (!y_red_i[j]) {
+ const N& y_dbm_ij = y_dbm_i[j];
+ const N& x_dbm_ij = x_dbm_i[j];
+ PPL_ASSERT(!is_plus_infinity(y_dbm_ij));
+ numer_denom(y_dbm_ij, numer, denom);
+ // Build skeleton DB constraint (having the right space dimension).
+ db_expr = zero_expr;
+ if (i > 0)
+ db_expr += Variable(i-1);
+ if (j > 0)
+ db_expr -= Variable(j-1);
+ if (denom != 1)
+ db_expr *= denom;
+ db_expr += numer;
+ if (y_dbm_ij >= x_dbm_ij) {
+ // Check if same constraint was added when considering x_dbm_ij.
+ if (!x_red_i[j] && x_dbm_ij == y_dbm_ij)
+ continue;
+ env_cs.insert(db_expr >= 0);
+ }
+ else {
+ db_expr += epsilon;
+ y_cs_removed.insert(db_expr == 0);
+ }
+ }
+ }
+ }
+
+ if (x_cs_removed.empty())
+ // No constraint of x was removed: y is included in x.
+ return true;
+ if (y_cs_removed.empty()) {
+ // No constraint of y was removed: x is included in y.
+ *this = y;
+ return true;
+ }
+
+ // In preparation to Step 4: build the common part of LP problems,
+ // i.e., the constraints corresponding to env(x,y),
+ // where the additional space dimension (epsilon) has to be maximized.
+ MIP_Problem env_lp(x_space_dim + 1, env_cs, epsilon, MAXIMIZATION);
+ // Pre-solve `env_lp' to later exploit incrementality.
+ env_lp.solve();
+ PPL_ASSERT(env_lp.solve() != UNFEASIBLE_MIP_PROBLEM);
+
+ // Implementing loop in Steps 3-6.
+ for (Constraint_System::const_iterator i = x_cs_removed.begin(),
+ i_end = x_cs_removed.end(); i != i_end; ++i) {
+ MIP_Problem lp_i(env_lp);
+ lp_i.add_constraint(*i);
+ // Pre-solve to exploit incrementality.
+ if (lp_i.solve() == UNFEASIBLE_MIP_PROBLEM)
+ continue;
+ for (Constraint_System::const_iterator j = y_cs_removed.begin(),
+ j_end = y_cs_removed.end(); j != j_end; ++j) {
+ MIP_Problem lp_ij(lp_i);
+ lp_ij.add_constraint(*j);
+ // Solve and check for a positive optimal value.
+ switch (lp_ij.solve()) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ // CHECKME: is the following actually impossible?
+ PPL_UNREACHABLE;
+ return false;
+ case UNBOUNDED_MIP_PROBLEM:
+ return false;
+ case OPTIMIZED_MIP_PROBLEM:
+ lp_ij.optimal_value(numer, denom);
+ if (numer > 0)
+ return false;
+ break;
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ upper_bound_assign(y);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+template <bool integer_upper_bound>
+bool
+BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(!integer_upper_bound
+ || std::numeric_limits<T>::is_integer,
+ "BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(y):"
+ " instantiating for integer upper bound,"
+ " but T in not an integer datatype.");
+
+ // FIXME, CHECKME: what about inexact computations?
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const BD_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x_space_dim == y.space_dimension());
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ x.shortest_path_reduction_assign();
+ y.shortest_path_reduction_assign();
+ PPL_ASSERT(x.marked_shortest_path_closed());
+ PPL_ASSERT(y.marked_shortest_path_closed());
+ // Pre-compute the upper bound of `x' and `y'.
+ BD_Shape<T> ub(x);
+ ub.upper_bound_assign(y);
+
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_one);
+ if (integer_upper_bound)
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& x_i = x.dbm[i];
+ const Bit_Row& x_red_i = x.redundancy_dbm[i];
+ const DB_Row<N>& y_i = y.dbm[i];
+ const DB_Row<N>& ub_i = ub.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+ // Check redundancy of x_i_j.
+ if (x_red_i[j])
+ continue;
+ // By non-redundancy, we know that i != j.
+ PPL_ASSERT(i != j);
+ const N& x_i_j = x_i[j];
+ if (x_i_j < y_i[j]) {
+ for (dimension_type k = x_space_dim + 1; k-- > 0; ) {
+ const DB_Row<N>& x_k = x.dbm[k];
+ const DB_Row<N>& y_k = y.dbm[k];
+ const Bit_Row& y_red_k = y.redundancy_dbm[k];
+ const DB_Row<N>& ub_k = ub.dbm[k];
+ const N& ub_k_j = (k == j) ? temp_zero : ub_k[j];
+ for (dimension_type ell = x_space_dim + 1; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (y_red_k[ell])
+ continue;
+ // By non-redundancy, we know that k != ell.
+ PPL_ASSERT(k != ell);
+ const N& y_k_ell = y_k[ell];
+ if (y_k_ell < x_k[ell]) {
+ // The first condition in BHZ09 theorem holds;
+ // now check for the second condition.
+ add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+ const N& ub_i_ell = (i == ell) ? temp_zero : ub_i[ell];
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+ if (integer_upper_bound) {
+ // Note: adding 1 rather than 2 (as in Theorem 5.3)
+ // so as to later test for < rather than <=.
+ add_assign_r(lhs, lhs, temp_one, ROUND_NOT_NEEDED);
+ }
+ // Testing for < in both the rational and integer case.
+ if (lhs < rhs)
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ BD_Shape new_bd_shape(space_dim, EMPTY);
+
+ BD_Shape& x = *this;
+
+ x.shortest_path_closure_assign();
+ // The difference of an empty bounded difference shape
+ // and of a bounded difference shape `p' is empty.
+ if (x.marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // The difference of a bounded difference shape `p'
+ // and an empty bounded difference shape is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both bounded difference shapes are zero-dimensional,
+ // then at this point they are necessarily universe system of
+ // bounded differences, so that their difference is empty.
+ if (space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ // TODO: This is just an executable specification.
+ // Have to find a more efficient method.
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ // We take a constraint of the system y at the time and we
+ // consider its complementary. Then we intersect the union
+ // of these complementary constraints with the system x.
+ const Constraint_System& y_cs = y.constraints();
+ for (Constraint_System::const_iterator i = y_cs.begin(),
+ y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+ const Constraint& c = *i;
+ // If the bounded difference shape `x' is included
+ // in the bounded difference shape defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty bounded difference shape,
+ // and as we would obtain a result that is less precise
+ // than the bds-difference.
+ if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ BD_Shape z = x;
+ const Linear_Expression e(c.expression());
+ z.add_constraint(e <= 0);
+ if (!z.is_empty())
+ new_bd_shape.upper_bound_assign(z);
+ if (c.is_equality()) {
+ z = x;
+ z.add_constraint(e >= 0);
+ if (!z.is_empty())
+ new_bd_shape.upper_bound_assign(z);
+ }
+ }
+ *this = new_bd_shape;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+ BD_Shape& x = *this;
+ const dimension_type dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (dim != y.space_dimension())
+ throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (dim == 0) {
+ if (y.marked_empty()) {
+ x.set_zero_dim_univ();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case where `x' contains `y'
+ // (this subsumes the case when `y' is empty).
+ y.shortest_path_closure_assign();
+ if (x.contains(y)) {
+ BD_Shape<T> res(dim, UNIVERSE);
+ x.m_swap(res);
+ return false;
+ }
+
+ // Filter away the case where `x' is empty.
+ x.shortest_path_closure_assign();
+ if (x.marked_empty()) {
+ // Search for a constraint of `y' that is not a tautology.
+ dimension_type i;
+ dimension_type j;
+ // Prefer unary constraints.
+ i = 0;
+ const DB_Row<N>& y_dbm_0 = y.dbm[0];
+ for (j = 1; j <= dim; ++j) {
+ if (!is_plus_infinity(y_dbm_0[j]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ j = 0;
+ for (i = 1; i <= dim; ++i) {
+ if (!is_plus_infinity(y.dbm[i][0]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ // Then search binary constraints.
+ for (i = 1; i <= dim; ++i) {
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (j = 1; j <= dim; ++j)
+ if (!is_plus_infinity(y_dbm_i[j]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ // Not found: we were not able to build a constraint contradicting
+ // one of the constraints in `y': `x' cannot be enlarged.
+ return false;
+
+ found:
+ // Found: build a new BDS contradicting the constraint found.
+ PPL_ASSERT(i <= dim && j <= dim && (i > 0 || j > 0));
+ BD_Shape<T> res(dim, UNIVERSE);
+ PPL_DIRTY_TEMP(N, tmp);
+ assign_r(tmp, 1, ROUND_UP);
+ add_assign_r(tmp, tmp, y.dbm[i][j], ROUND_UP);
+ PPL_ASSERT(!is_plus_infinity(tmp));
+ // CHECKME: round down is really meant.
+ neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN);
+ x.m_swap(res);
+ return false;
+ }
+
+ // Here `x' and `y' are not empty and shortest-path closed;
+ // also, `x' does not contain `y'.
+ // Let `target' be the intersection of `x' and `y'.
+ BD_Shape<T> target = x;
+ target.intersection_assign(y);
+ const bool bool_result = !target.is_empty();
+
+ // Compute a reduced dbm for `x' and ...
+ x.shortest_path_reduction_assign();
+ // ... count the non-redundant constraints.
+ dimension_type x_num_non_redundant = (dim+1)*(dim+1);
+ for (dimension_type i = dim + 1; i-- > 0; )
+ x_num_non_redundant -= x.redundancy_dbm[i].count_ones();
+ PPL_ASSERT(x_num_non_redundant > 0);
+
+ // Let `yy' be a copy of `y': we will keep adding to `yy'
+ // the non-redundant constraints of `x',
+ // stopping as soon as `yy' becomes equal to `target'.
+ BD_Shape<T> yy = y;
+
+ // The constraints added to `yy' will be recorded in `res' ...
+ BD_Shape<T> res(dim, UNIVERSE);
+ // ... and we will count them too.
+ dimension_type res_num_non_redundant = 0;
+
+ // Compute leader information for `x'.
+ std::vector<dimension_type> x_leaders;
+ x.compute_leaders(x_leaders);
+
+ // First go through the unary equality constraints.
+ const DB_Row<N>& x_dbm_0 = x.dbm[0];
+ DB_Row<N>& yy_dbm_0 = yy.dbm[0];
+ DB_Row<N>& res_dbm_0 = res.dbm[0];
+ for (dimension_type j = 1; j <= dim; ++j) {
+ // Unary equality constraints are encoded in entries dbm_0j and dbm_j0
+ // provided index j has special variable index 0 as its leader.
+ if (x_leaders[j] != 0)
+ continue;
+ PPL_ASSERT(!is_plus_infinity(x_dbm_0[j]));
+ if (x_dbm_0[j] < yy_dbm_0[j]) {
+ res_dbm_0[j] = x_dbm_0[j];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_dbm_0[j] = x_dbm_0[j];
+ yy.reset_shortest_path_closed();
+ }
+ PPL_ASSERT(!is_plus_infinity(x.dbm[j][0]));
+ if (x.dbm[j][0] < yy.dbm[j][0]) {
+ res.dbm[j][0] = x.dbm[j][0];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[j][0] = x.dbm[j][0];
+ yy.reset_shortest_path_closed();
+ }
+ // Restore shortest-path closure, if it was lost.
+ if (!yy.marked_shortest_path_closed()) {
+ Variable var_j(j-1);
+ yy.incremental_shortest_path_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Go through the binary equality constraints.
+ // Note: no need to consider the case i == 1.
+ for (dimension_type i = 2; i <= dim; ++i) {
+ const dimension_type j = x_leaders[i];
+ if (j == i || j == 0)
+ continue;
+ PPL_ASSERT(!is_plus_infinity(x.dbm[i][j]));
+ if (x.dbm[i][j] < yy.dbm[i][j]) {
+ res.dbm[i][j] = x.dbm[i][j];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[i][j] = x.dbm[i][j];
+ yy.reset_shortest_path_closed();
+ }
+ PPL_ASSERT(!is_plus_infinity(x.dbm[j][i]));
+ if (x.dbm[j][i] < yy.dbm[j][i]) {
+ res.dbm[j][i] = x.dbm[j][i];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[j][i] = x.dbm[j][i];
+ yy.reset_shortest_path_closed();
+ }
+ // Restore shortest-path closure, if it was lost.
+ if (!yy.marked_shortest_path_closed()) {
+ Variable var_j(j-1);
+ yy.incremental_shortest_path_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Finally go through the (proper) inequality constraints:
+ // both indices i and j should be leaders.
+ for (dimension_type i = 0; i <= dim; ++i) {
+ if (i != x_leaders[i])
+ continue;
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i];
+ DB_Row<N>& yy_dbm_i = yy.dbm[i];
+ DB_Row<N>& res_dbm_i = res.dbm[i];
+ for (dimension_type j = 0; j <= dim; ++j) {
+ if (j != x_leaders[j] || x_redundancy_dbm_i[j])
+ continue;
+ N& yy_dbm_ij = yy_dbm_i[j];
+ const N& x_dbm_ij = x_dbm_i[j];
+ if (x_dbm_ij < yy_dbm_ij) {
+ res_dbm_i[j] = x_dbm_ij;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_dbm_ij = x_dbm_ij;
+ yy.reset_shortest_path_closed();
+ PPL_ASSERT(i > 0 || j > 0);
+ Variable var(((i > 0) ? i : j) - 1);
+ yy.incremental_shortest_path_closure_assign(var);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+ }
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ const dimension_type new_space_dim = space_dim + m;
+ const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+ // To embed an n-dimension space BDS in a (n+m)-dimension space,
+ // we just add `m' rows and columns in the bounded difference shape,
+ // initialized to PLUS_INFINITY.
+ dbm.grow(new_space_dim + 1);
+
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // If `*this' was the zero-dim space universe BDS,
+ // the we can set the shortest-path closure flag.
+ if (was_zero_dim_univ)
+ set_shortest_path_closed();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+
+ // If `*this' was zero-dimensional, then we add `m' rows and columns.
+ // If it also was non-empty, then we zero all the added elements
+ // and set the flag for shortest-path closure.
+ if (space_dim == 0) {
+ dbm.grow(m + 1);
+ if (!marked_empty()) {
+ for (dimension_type i = m + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = m + 1; j-- > 0; )
+ if (i != j)
+ assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+ }
+ set_shortest_path_closed();
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // To project an n-dimension space bounded difference shape
+ // in a (n+m)-dimension space, we add `m' rows and columns.
+ // In the first row and column of the matrix we add `zero' from
+ // the (n+1)-th position to the end.
+ const dimension_type new_space_dim = space_dim + m;
+ dbm.grow(new_space_dim + 1);
+
+ // Bottom of the matrix and first row.
+ DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+ assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+ assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+ }
+
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any BDS is a no-op.
+ // Note that this case also captures the only legal removal of
+ // space dimensions from a BDS in a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type old_space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (old_space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ // Shortest-path closure is necessary to keep precision.
+ shortest_path_closure_assign();
+
+ // When removing _all_ dimensions from a BDS, we obtain the
+ // zero-dimensional BDS.
+ const dimension_type new_space_dim = old_space_dim - vars.size();
+ if (new_space_dim == 0) {
+ dbm.resize_no_copy(1);
+ if (!marked_empty())
+ // We set the zero_dim_univ flag.
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Handle the case of an empty BD_Shape.
+ if (marked_empty()) {
+ dbm.resize_no_copy(new_space_dim + 1);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // For each variable to remove, we fill the corresponding column and
+ // row by shifting respectively left and above those
+ // columns and rows, that will not be removed.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ dimension_type dst = *vsi + 1;
+ dimension_type src = dst + 1;
+ for (++vsi; vsi != vsi_end; ++vsi) {
+ const dimension_type vsi_next = *vsi + 1;
+ // All other columns and rows are moved respectively to the left
+ // and above.
+ while (src < vsi_next) {
+ using std::swap;
+ swap(dbm[dst], dbm[src]);
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ assign_or_swap(dbm_i[dst], dbm_i[src]);
+ }
+ ++dst;
+ ++src;
+ }
+ ++src;
+ }
+
+ // Moving the remaining rows and columns.
+ while (src <= old_space_dim) {
+ using std::swap;
+ swap(dbm[dst], dbm[src]);
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ assign_or_swap(dbm_i[dst], dbm_i[src]);
+ }
+ ++src;
+ ++dst;
+ }
+
+ // Update the space dimension.
+ dbm.resize_no_copy(new_space_dim + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+ const dimension_type space_dim = space_dimension();
+ // TODO: this implementation is just an executable specification.
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the BDS becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If we are going to actually reduce the space dimension,
+ // then shortest-path closure is required to keep precision.
+ if (new_space_dim < space_dim)
+ shortest_path_closure_assign();
+
+ // If the BDS is empty, then it is sufficient to adjust the
+ // space dimension of the bounded difference shape.
+ if (marked_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // We create a new matrix with the new space dimension.
+ DB_Matrix<N> x(new_space_dim+1);
+ // First of all we must map the unary constraints, because
+ // there is the fictitious variable `zero', that can't be mapped
+ // at all.
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& x_0 = x[0];
+ for (dimension_type j = 1; j <= space_dim; ++j) {
+ dimension_type new_j;
+ if (pfunc.maps(j - 1, new_j)) {
+ assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+ assign_or_swap(x[new_j + 1][0], dbm[j][0]);
+ }
+ }
+ // Now we map the binary constraints, exchanging the indexes.
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ dimension_type new_i;
+ if (pfunc.maps(i - 1, new_i)) {
+ DB_Row<N>& dbm_i = dbm[i];
+ ++new_i;
+ DB_Row<N>& x_new_i = x[new_i];
+ for (dimension_type j = i+1; j <= space_dim; ++j) {
+ dimension_type new_j;
+ if (pfunc.maps(j - 1, new_j)) {
+ ++new_j;
+ assign_or_swap(x_new_i[new_j], dbm_i[j]);
+ assign_or_swap(x[new_j][new_i], dbm[j][i]);
+ }
+ }
+ }
+ }
+
+ using std::swap;
+ swap(dbm, x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two bounded difference shapes is empty,
+ // the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If both bounded difference shapes are zero-dimensional,
+ // then at this point they are necessarily non-empty,
+ // so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // To intersect two bounded difference shapes we compare
+ // the constraints and we choose the less values.
+ bool changed = false;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (dbm_ij > y_dbm_ij) {
+ dbm_ij = y_dbm_ij;
+ changed = true;
+ }
+ }
+ }
+
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If both bounded difference shapes are zero-dimensional,
+ // since `*this' contains `y', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ shortest_path_closure_assign();
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ BD_Shape<T> x_tmp(*this);
+ x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Compare each constraint in `y' to the corresponding one in `*this'.
+ // The constraint in `*this' is kept as is if it is stronger than or
+ // equal to the constraint in `y'; otherwise, the inhomogeneous term
+ // of the constraint in `*this' is further compared with elements taken
+ // from a sorted container (the stop-points, provided by the user), and
+ // is replaced by the first entry, if any, which is greater than or equal
+ // to the inhomogeneous term. If no such entry exists, the constraint
+ // is removed altogether.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (y_dbm_ij < dbm_ij) {
+ Iterator k = std::lower_bound(first, last, dbm_ij);
+ if (k != last) {
+ if (dbm_ij < *k)
+ assign_r(dbm_ij, *k, ROUND_UP);
+ }
+ else
+ assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ }
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+ shortest_path_closure_assign();
+ bool changed = false;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ PPL_DIRTY_TEMP(N, d);
+ PPL_DIRTY_TEMP(N, d1);
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ // Constraints that are not bounded differences are ignored.
+ if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ const N& x = negative ? dbm[i][j] : dbm[j][i];
+ const N& y = negative ? dbm[j][i] : dbm[i][j];
+ DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+ if (negative)
+ neg_assign(coeff);
+ // Compute the bound for `x', rounding towards plus infinity.
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x <= d) {
+ if (c.is_inequality()) {
+ N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+ if (ls_x > d) {
+ ls_x = d;
+ changed = true;
+ }
+ }
+ else {
+ // Compute the bound for `y', rounding towards plus infinity.
+ neg_assign(minus_c_term, c.inhomogeneous_term());
+ div_round_up(d1, minus_c_term, coeff);
+ if (y <= d1) {
+ N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+ N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+ if ((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+ ls_x = d;
+ ls_y = d1;
+ changed = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure of the bounded difference shape.
+ if (changed && limiting_shape.marked_shortest_path_closed())
+ limiting_shape.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+
+ // `cs' must be dimension-compatible with the two systems
+ // of bounded differences.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+ "cs is space_dimension incompatible");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+ "cs has strict inequalities");
+
+ // The limited CC76-extrapolation between two systems of bounded
+ // differences in a zero-dimensional space is a system of bounded
+ // differences in a zero-dimensional space, too.
+ if (space_dim == 0)
+ return;
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+ get_limiting_shape(cs, limiting_shape);
+ CC76_extrapolation_assign(y, tp);
+ intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // Compute the affine dimension of `y'.
+ const dimension_type y_affine_dim = y.affine_dimension();
+ // If the affine dimension of `y' is zero, then either `y' is
+ // zero-dimensional, or it is empty, or it is a singleton.
+ // In all cases, due to the inclusion hypothesis, the result is `*this'.
+ if (y_affine_dim == 0)
+ return;
+
+ // If the affine dimension has changed, due to the inclusion hypothesis,
+ // the result is `*this'.
+ const dimension_type x_affine_dim = affine_dimension();
+ PPL_ASSERT(x_affine_dim >= y_affine_dim);
+ if (x_affine_dim != y_affine_dim)
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ BD_Shape<T> x_tmp(*this);
+ x_tmp.BHMZ05_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Here no token is available.
+ PPL_ASSERT(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+ // Minimize `y'.
+ y.shortest_path_reduction_assign();
+
+ // Extrapolate unstable bounds, taking into account redundancy in `y'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ // Note: in the following line the use of `!=' (as opposed to
+ // the use of `<' that would seem -but is not- equivalent) is
+ // intentional.
+ if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+ assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ // NOTE: this will also reset the shortest-path reduction flag,
+ // even though the dbm is still in reduced form. However, the
+ // current implementation invariant requires that any reduced dbm
+ // is closed too.
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two systems
+ // of bounded differences.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+ "cs is space-dimension incompatible");
+
+ // Strict inequalities are not allowed.
+ if (cs.has_strict_inequalities())
+ throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+ "cs has strict inequalities");
+
+ // The limited BHMZ05-extrapolation between two systems of bounded
+ // differences in a zero-dimensional space is a system of bounded
+ // differences in a zero-dimensional space, too.
+ if (space_dim == 0)
+ return;
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+ get_limiting_shape(cs, limiting_shape);
+ BHMZ05_widening_assign(y, tp);
+ intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // We assume that `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both bounded difference shapes are zero-dimensional,
+ // since `y' contains `*this', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ y.shortest_path_closure_assign();
+ // If `y' is empty, since `y' contains `this', `*this' is empty too.
+ if (y.marked_empty())
+ return;
+ shortest_path_closure_assign();
+ // If `*this' is empty, we return.
+ if (marked_empty())
+ return;
+
+ // Replace each constraint in `*this' by the corresponding constraint
+ // in `y' if the corresponding inhomogeneous terms are both finite.
+ bool changed = false;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (!is_plus_infinity(dbm_ij)
+ && !is_plus_infinity(y_dbm_ij)
+ && dbm_ij != y_dbm_ij) {
+ dbm_ij = y_dbm_ij;
+ changed = true;
+ }
+ }
+ }
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+ const dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v) {
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(ub_v));
+ // Deduce constraints of the form `v - u', where `u != v'.
+ // Note: the shortest-path closure is able to deduce the constraint
+ // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+ // played an active role in the computation of the upper bound for `v',
+ // i.e., if the corresponding coefficient `q == expr_u/denom' is
+ // greater than zero. In particular:
+ // if `q >= 1', then `v - u <= ub_v - ub_u';
+ // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+ const dimension_type u_dim = u.variable().space_dimension();
+ if (u_dim == v)
+ continue;
+ const Coefficient& expr_u = *u;
+ if (expr_u < 0)
+ continue;
+ PPL_ASSERT(expr_u > 0);
+ if (expr_u >= sc_denom)
+ // Deducing `v - u <= ub_v - ub_u'.
+ sub_assign_r(dbm[u_dim][v], ub_v, dbm_0[u_dim], ROUND_UP);
+ else {
+ DB_Row<N>& dbm_u = dbm[u_dim];
+ const N& dbm_u0 = dbm_u[0];
+ if (!is_plus_infinity(dbm_u0)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+ // rational coefficient of `u' in `sc_expr/sc_denom',
+ // the upper bound for `v - u' is computed as
+ // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+ // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+ assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(ub_u, dbm_0[u_dim], ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+ add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+ const dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v) {
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+ // Deduce constraints of the form `u - v', where `u != v'.
+ // Note: the shortest-path closure is able to deduce the constraint
+ // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+ // played an active role in the computation of the lower bound for `v',
+ // i.e., if the corresponding coefficient `q == expr_u/denom' is
+ // greater than zero. In particular:
+ // if `q >= 1', then `u - v <= lb_u - lb_v';
+ // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ // No need to consider indices greater than `last_v'.
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+ const Variable u_var = u.variable();
+ const dimension_type u_dim = u_var.space_dimension();
+ if (u_var.space_dimension() == v)
+ continue;
+ const Coefficient& expr_u = *u;
+ if (expr_u < 0)
+ continue;
+ PPL_ASSERT(expr_u > 0);
+ if (expr_u >= sc_denom)
+ // Deducing `u - v <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ sub_assign_r(dbm_v[u_dim], minus_lb_v, dbm[u_dim][0], ROUND_UP);
+ else {
+ const N& dbm_0u = dbm_0[u_dim];
+ if (!is_plus_infinity(dbm_0u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+ // rational coefficient of `u' in `sc_expr/sc_denom',
+ // the upper bound for `u - v' is computed as
+ // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+ // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+ assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, dbm[u_dim][0], ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+ add_assign_r(dbm_v[u_dim], up_approx, minus_lb_v, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+ PPL_ASSERT(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+ PPL_ASSERT(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("unconstrain(var)", var_space_dim);
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) constraints.
+ shortest_path_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ forget_all_dbm_constraints(var_space_dim);
+ // Shortest-path closure is preserved, but not reduction.
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case captures the only legal cylindrification in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) constraints.
+ shortest_path_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+ forget_all_dbm_constraints(*vsi + 1);
+ // Shortest-path closure is preserved, but not reduction.
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(denominator != 0);
+ PPL_ASSERT(space_dimension() >= expr.space_dimension());
+ const dimension_type v = var.id() + 1;
+ PPL_ASSERT(v <= space_dimension());
+ PPL_ASSERT(expr.coefficient(var) == 0);
+ PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Since we are only able to record bounded differences, we can
+ // precisely deal with the case of a single variable only if its
+ // coefficient (taking into account the denominator) is 1.
+ // If this is not the case, we fall back to the general case
+ // so as to over-approximate the constraint.
+ if (t == 1 && expr.get(Variable(w - 1)) != denominator)
+ t = 2;
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+ // - If t == 2, the `expr' is of the general form.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ switch (relsym) {
+ case EQUAL:
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ return;
+ }
+
+ if (t == 1) {
+ // Case 2: expr == a*w + b, w != v, a == denominator.
+ PPL_ASSERT(expr.get(Variable(w - 1)) == denominator);
+ PPL_DIRTY_TEMP(N, d);
+ switch (relsym) {
+ case EQUAL:
+ // Add the new constraint `v - w <= b/denominator'.
+ div_round_up(d, b, denominator);
+ add_dbm_constraint(w, v, d);
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ div_round_up(d, b, minus_denom);
+ add_dbm_constraint(v, w, d);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the new constraint `v - w <= b/denominator'.
+ div_round_up(d, b, denominator);
+ add_dbm_constraint(w, v, d);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ div_round_up(d, b, minus_denom);
+ add_dbm_constraint(v, w, d);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ return;
+ }
+
+ // Here t == 2, so that either
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+ // expr == a*w + b, w != v and a != denominator.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ // Speculative allocation of temporaries that are used in most
+ // of the computational traces starting from this point (also loops).
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, coeff_i);
+
+ switch (relsym) {
+ case EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const dimension_type i_dim = i.variable().space_dimension();
+ const Coefficient& sc_i = *i;
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(approx_i))
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ else {
+ ++pinf_count;
+ pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(approx_minus_i))
+ add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(approx_minus_i))
+ add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+ else {
+ ++pinf_count;
+ pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(approx_i))
+ add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+
+ // Exploit the upper approximation, if possible.
+ if (pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_denom != 1)
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ // Add the upper bound constraint, if meaningful.
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ dbm[0][v] = sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else
+ // Here `pinf_count == 1'.
+ if (pinf_index != v
+ && sc_expr.get(Variable(pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pinf_index <= sum'.
+ dbm[pinf_index][v] = sum;
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_denom != 1)
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ DB_Row<N>& dbm_v = dbm[v];
+ dbm_v[0] = neg_sum;
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ dbm[v][neg_pinf_index] = neg_sum;
+ }
+ }
+ break;
+
+ case LESS_OR_EQUAL:
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc - denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ add_dbm_constraint(0, v, sum);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_OR_EQUAL:
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be positive,
+ // this amounts to rounding downwards, which is achieved by rounding
+ // upwards `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+ add_dbm_constraint(v, 0, sum);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ add_dbm_constraint(v, pinf_index, sum);
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the shape.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ if (w == v) {
+ // `expr' is of the form: a*v + b.
+ if (a == denominator) {
+ if (b == 0)
+ // The transformation is the identity function.
+ return;
+ else {
+ // Translate all the constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+ N& dbm_iv = dbm[i][v];
+ add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+ }
+ // Both shortest-path closure and reduction are preserved.
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Remove the binary constraints on `var'.
+ forget_binary_dbm_constraints(v);
+ // Swap the unary constraints on `var'.
+ using std::swap;
+ swap(dbm[v][0], dbm[0][v]);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ if (b != 0) {
+ // Translate the unary constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ N& dbm_v0 = dbm[v][0];
+ add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ N& dbm_0v = dbm[0][v];
+ add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+ }
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator) {
+ // Add the new constraint `v - w == b/denominator'.
+ add_dbm_constraint(w, v, b, denominator);
+ add_dbm_constraint(v, w, b, minus_denom);
+ }
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v + w == b/denominator'.
+ // Approximate it by computing lower and upper bounds for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lower_w'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ const N& dbm_0w = dbm[0][w];
+ if (!is_plus_infinity(dbm_0w)) {
+ // Add the constraint `v >= b/denominator - upper_w'.
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on 'v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ dbm[0][v] = pos_sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ dbm[pos_pinf_index][v] = pos_sum;
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ DB_Row<N>& dbm_v = dbm[v];
+ dbm_v[0] = neg_sum;
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ dbm[v][neg_pinf_index] = neg_sum;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::affine_form_image(const Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::affine_form_image(Variable, Linear_Form):"
+ " T not a floating point type.");
+
+ // Dimension-compatibility checks.
+ // The dimension of `lf' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(var_id, l)", "l", lf);
+
+ // `var' should be one of the dimensions of the shape.
+ const dimension_type var_id = var.id() + 1;
+ if (space_dim < var_id)
+ throw_dimension_incompatible("affine_form_image(var_id, l)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lf': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `lf', if any.
+ dimension_type w_id = 0;
+ // Get information about the number of non-zero coefficients in `lf'.
+ for (dimension_type i = lf_space_dim; i-- > 0; )
+ if (lf.coefficient(Variable(i)) != 0) {
+ if (t++ == 1)
+ break;
+ else
+ w_id = i + 1;
+ }
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+ // Now we know the form of `lf':
+ // - If t == 0, then lf == b, with `b' a constant;
+ // - If t == 1, then lf == a*w + b, where `w' can be `v' or another
+ // variable;
+ // - If t == 2, the linear form 'lf' is of the general form.
+
+ if (t == 0) {
+ inhomogeneous_affine_form_image(var_id, b);
+ PPL_ASSERT(OK());
+ return;
+ }
+ else if (t == 1) {
+ const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id - 1));
+ if (w_coeff == 1 || w_coeff == -1) {
+ one_variable_affine_form_image(var_id, b, w_coeff, w_id, space_dim);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ two_variables_affine_form_image(var_id, lf, space_dim);
+ PPL_ASSERT(OK());
+}
+
+// Case 1: var = b, where b = [-b_mlb, b_ub]
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::inhomogeneous_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b) {
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(var_id);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Add the constraint `var >= lb && var <= ub'.
+ add_dbm_constraint(0, var_id, b_ub);
+ add_dbm_constraint(var_id, 0, b_mlb);
+ return;
+}
+
+// case 2: var = (+/-1) * w + [-b_mlb, b_ub], where `w' can be `var'
+// or another variable.
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::one_variable_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b,
+ const Interval<T, Interval_Info>& w_coeff,
+ const dimension_type& w_id,
+ const dimension_type& space_dim) {
+
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ // True if `w_coeff' is in [1, 1].
+ bool is_w_coeff_one = (w_coeff == 1);
+
+ if (w_id == var_id) {
+ // True if `b' is in [b_mlb, b_ub] and that is [0, 0].
+ bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+ // Here `lf' is of the form: [+/-1, +/-1] * v + b.
+ if (is_w_coeff_one) {
+ if (is_b_zero)
+ // The transformation is the identity function.
+ return;
+ else {
+ // Translate all the constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_mlb'.
+ DB_Row<N>& dbm_v = dbm[var_id];
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, b_mlb, ROUND_UP);
+ N& dbm_iv = dbm[i][var_id];
+ add_assign_r(dbm_iv, dbm_iv, b_ub, ROUND_UP);
+ }
+ // Both shortest-path closure and reduction are preserved.
+ }
+ }
+ else {
+ // Here `w_coeff = [-1, -1].
+ // Remove the binary constraints on `var'.
+ forget_binary_dbm_constraints(var_id);
+ using std::swap;
+ swap(dbm[var_id][0], dbm[0][var_id]);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ if (!is_b_zero) {
+ // Translate the unary constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_mlb'.
+ N& dbm_v0 = dbm[var_id][0];
+ add_assign_r(dbm_v0, dbm_v0, b_mlb, ROUND_UP);
+ N& dbm_0v = dbm[0][var_id];
+ add_assign_r(dbm_0v, dbm_0v, b_ub, ROUND_UP);
+ }
+ }
+ }
+ else {
+ // Here `w != var', so that `lf' is of the form
+ // [+/-1, +/-1] * w + b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(var_id);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (is_w_coeff_one) {
+ // Add the new constraints `var - w >= b_mlb'
+ // `and var - w <= b_ub'.
+ add_dbm_constraint(w_id, var_id, b_ub);
+ add_dbm_constraint(var_id, w_id, b_mlb);
+ }
+ else {
+ // We have to add the constraint `v + w == b', over-approximating it
+ // by computing lower and upper bounds for `w'.
+ const N& mlb_w = dbm[w_id][0];
+ if (!is_plus_infinity(mlb_w)) {
+ // Add the constraint `v <= ub - lb_w'.
+ add_assign_r(dbm[0][var_id], b_ub, mlb_w, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ const N& ub_w = dbm[0][w_id];
+ if (!is_plus_infinity(ub_w)) {
+ // Add the constraint `v >= lb - ub_w'.
+ add_assign_r(dbm[var_id][0], ub_w, b_mlb, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ return;
+}
+
+// General case.
+// Either t == 2, so that
+// lf == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+// or t == 1, lf == i*w + b, but i <> [+/-1, +/-1].
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::two_variables_affine_form_image(const dimension_type& var_id,
+ const Linear_Form< Interval<T, Interval_Info> >& lf,
+ const dimension_type& space_dim) {
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ reset_shortest_path_closed();
+
+ Linear_Form< Interval<T, Interval_Info> > minus_lf(lf);
+ minus_lf.negate();
+
+ // Declare temporaries outside the loop.
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ // Update binary constraints on var FIRST.
+ for (dimension_type curr_var = 1; curr_var < var_id; ++curr_var) {
+ Variable current(curr_var - 1);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+ }
+ for (dimension_type curr_var = var_id + 1; curr_var <= space_dim;
+ ++curr_var) {
+ Variable current(curr_var - 1);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+ }
+ // Finally, update unary constraints on var.
+ PPL_DIRTY_TEMP(N, lf_ub);
+ linear_form_upper_bound(lf, lf_ub);
+ PPL_DIRTY_TEMP(N, minus_lf_ub);
+ linear_form_upper_bound(minus_lf, minus_lf_ub);
+ assign_r(dbm[0][var_id], lf_ub, ROUND_NOT_NEEDED);
+ assign_r(dbm[var_id][0], minus_lf_ub, ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+ " T not a floating point type.");
+
+ //We assume that the analyzer will not try to apply an unreachable filter.
+ PPL_ASSERT(!marked_empty());
+
+ // Dimension-compatibility checks.
+ // The dimensions of `left' and `right' should not be greater than the
+ // dimension of `*this'.
+ const dimension_type left_space_dim = left.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "left", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "right", right);
+
+ // Number of non-zero coefficients in `left': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type left_t = 0;
+ // Variable-index of the last non-zero coefficient in `left', if any.
+ dimension_type left_w_id = 0;
+ // Number of non-zero coefficients in `right': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type right_t = 0;
+ // Variable-index of the last non-zero coefficient in `right', if any.
+ dimension_type right_w_id = 0;
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ // Get information about the number of non-zero coefficients in `left'.
+ for (dimension_type i = left_space_dim; i-- > 0; )
+ if (left.coefficient(Variable(i)) != 0) {
+ if (left_t++ == 1)
+ break;
+ else
+ left_w_id = i;
+ }
+
+ // Get information about the number of non-zero coefficients in `right'.
+ for (dimension_type i = right_space_dim; i-- > 0; )
+ if (right.coefficient(Variable(i)) != 0) {
+ if (right_t++ == 1)
+ break;
+ else
+ right_w_id = i;
+ }
+
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+
+ if (left_t == 0) {
+ if (right_t == 0) {
+ // The constraint involves constants only. Ignore it: it is up to
+ // the analyzer to handle it.
+ PPL_ASSERT(OK());
+ return;
+ }
+ else if (right_w_coeff == 1 || right_w_coeff == -1) {
+ left_inhomogeneous_refine(right_t, right_w_id, left, right);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ else if (left_t == 1) {
+ if (left_w_coeff == 1 || left_w_coeff == -1) {
+ if (right_t == 0 || (right_w_coeff == 1 || right_w_coeff == -1)) {
+ left_one_var_refine(left_w_id, right_t, right_w_id, left, right);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ general_refine(left_w_id, right_w_id, left, right);
+ PPL_ASSERT(OK());
+} // end of refine_with_linear_form_inequality
+
+template <typename T>
+template <typename U>
+void
+BD_Shape<T>
+::export_interval_constraints(U& dest) const {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim > dest.space_dimension())
+ throw std::invalid_argument(
+ "BD_Shape<T>::export_interval_constraints");
+
+ // Expose all the interval constraints.
+ shortest_path_closure_assign();
+
+ if (marked_empty()) {
+ dest.set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_DIRTY_TEMP(N, tmp);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ // Set the upper bound.
+ const N& u = dbm_0[i+1];
+ if (!is_plus_infinity(u))
+ if (!dest.restrict_upper(i, u.raw_value()))
+ return;
+
+ // Set the lower bound.
+ const N& negated_l = dbm[i+1][0];
+ if (!is_plus_infinity(negated_l)) {
+ neg_assign_r(tmp, negated_l, ROUND_DOWN);
+ if (!dest.restrict_lower(i, tmp.raw_value()))
+ return;
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::left_inhomogeneous_refine(const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ if (right_t == 1) {
+ // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+ // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ if (right_w_coeff == 1) {
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(right_w_id+1, 0, b_plus_minus_a_minus);
+ return;
+ }
+
+ if (right_w_coeff == -1) {
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(0, right_w_id+1, b_plus_minus_a_minus);
+ return;
+ }
+ }
+} // end of left_inhomogeneous_refine
+
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::left_one_var_refine(const dimension_type& left_w_id,
+ const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ if (right_t == 0) {
+ // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+ // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+
+ if (left_w_coeff == 1) {
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_dbm_constraint(0, left_w_id+1, a_plus_minus_b_minus);
+ return;
+ }
+
+ if (left_w_coeff == -1) {
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_dbm_constraint(left_w_id+1, 0, a_plus_minus_b_minus);
+ return;
+ }
+ }
+ else if (right_t == 1) {
+ // The constraint has the form
+ // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+ // Reduce it to the constraint +/-x +/-y <= c+ - a-
+ // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+
+ bool is_left_coeff_one = (left_w_coeff == 1);
+ bool is_left_coeff_minus_one = (left_w_coeff == -1);
+ bool is_right_coeff_one = (right_w_coeff == 1);
+ bool is_right_coeff_minus_one = (right_w_coeff == -1);
+ if (left_w_id == right_w_id) {
+ if ((is_left_coeff_one && is_right_coeff_one)
+ ||
+ (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+ // Here we have an identity or a constants-only constraint.
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // We fall back to a previous case.
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_dbm_constraint(0, left_w_id + 1, a_plus_minus_b_minus);
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // We fall back to a previous case.
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_dbm_constraint(right_w_id + 1, 0, a_plus_minus_b_minus);
+ return;
+ }
+ }
+ else if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // over-approximate (if is it possible) the inequality
+ // -B + [b1, b2] <= A + [a1, a2] by adding the constraints
+ // -B <= upper_bound(A) + (a2 - b1) and
+ // -A <= upper_bound(B) + (a2 - b1)
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ PPL_DIRTY_TEMP(N, ub);
+ ub = dbm[0][right_w_id + 1];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(left_w_id + 1, 0, ub);
+ }
+ ub = dbm[0][left_w_id + 1];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(right_w_id + 1, 0, ub);
+ }
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // over-approximate (if is it possible) the inequality
+ // B + [b1, b2] <= -A + [a1, a2] by adding the constraints
+ // B <= upper_bound(-A) + (a2 - b1) and
+ // A <= upper_bound(-B) + (a2 - b1)
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ PPL_DIRTY_TEMP(N, ub);
+ ub = dbm[right_w_id + 1][0];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(0, left_w_id + 1, ub);
+ }
+ ub = dbm[left_w_id + 1][0];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(0, right_w_id + 1, ub);
+ }
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_one) {
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(right_w_id+1, left_w_id+1, c_plus_minus_a_minus);
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(left_w_id+1, right_w_id+1, c_plus_minus_a_minus);
+ return;
+ }
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::general_refine(const dimension_type& left_w_id,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ Linear_Form<FP_Interval_Type> right_minus_left(right);
+ right_minus_left -= left;
+
+ // Declare temporaries outside of the loop.
+ PPL_DIRTY_TEMP(N, low_coeff);
+ PPL_DIRTY_TEMP(N, high_coeff);
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ dimension_type max_w_id = std::max(left_w_id, right_w_id);
+
+ for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+ for (dimension_type second_v = first_v+1;
+ second_v <= max_w_id; ++second_v) {
+ const FP_Interval_Type& lfv_coefficient =
+ left.coefficient(Variable(first_v));
+ const FP_Interval_Type& lsv_coefficient =
+ left.coefficient(Variable(second_v));
+ const FP_Interval_Type& rfv_coefficient =
+ right.coefficient(Variable(first_v));
+ const FP_Interval_Type& rsv_coefficient =
+ right.coefficient(Variable(second_v));
+ // We update the constraints only when both variables appear in at
+ // least one argument.
+ bool do_update = false;
+ assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ else {
+ assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ }
+
+ if (do_update) {
+ Variable first(first_v);
+ Variable second(second_v);
+ dimension_type n_first_var = first_v +1 ;
+ dimension_type n_second_var = second_v + 1;
+ linear_form_upper_bound(right_minus_left - first + second,
+ upper_bound);
+ add_dbm_constraint(n_first_var, n_second_var, upper_bound);
+ linear_form_upper_bound(right_minus_left + first - second,
+ upper_bound);
+ add_dbm_constraint(n_second_var, n_first_var, upper_bound);
+ }
+ }
+ }
+
+ // Finally, update the unary constraints.
+ for (dimension_type v = 0; v < max_w_id; ++v) {
+ const FP_Interval_Type& lv_coefficient =
+ left.coefficient(Variable(v));
+ const FP_Interval_Type& rv_coefficient =
+ right.coefficient(Variable(v));
+ // We update the constraints only if v appears in at least one of the
+ // two arguments.
+ bool do_update = false;
+ assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+
+ if (do_update) {
+ Variable var(v);
+ dimension_type n_var = v + 1;
+ linear_form_upper_bound(right_minus_left + var, upper_bound);
+ add_dbm_constraint(0, n_var, upper_bound);
+ linear_form_upper_bound(right_minus_left - var, upper_bound);
+ add_dbm_constraint(n_var, 0, upper_bound);
+ }
+ }
+
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::linear_form_upper_bound:"
+ " T not a floating point type.");
+
+ const dimension_type lf_space_dimension = lf.space_dimension();
+ PPL_ASSERT(lf_space_dimension <= space_dimension());
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ PPL_DIRTY_TEMP(N, curr_lb);
+ PPL_DIRTY_TEMP(N, curr_ub);
+ PPL_DIRTY_TEMP(N, curr_var_ub);
+ PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+ PPL_DIRTY_TEMP(N, first_comparison_term);
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+
+ PPL_DIRTY_TEMP(N, negator);
+
+ assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+ for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+ ++curr_var) {
+ n_var = curr_var + 1;
+ const FP_Interval_Type&
+ curr_coefficient = lf.coefficient(Variable(curr_var));
+ assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (curr_lb != 0 || curr_ub != 0) {
+ assign_r(curr_var_ub, dbm[0][n_var], ROUND_NOT_NEEDED);
+ neg_assign_r(curr_minus_var_ub, dbm[n_var][0], ROUND_NOT_NEEDED);
+ // Optimize the most commons cases: curr = +/-[1, 1].
+ if (curr_lb == 1 && curr_ub == 1) {
+ add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+ ROUND_UP);
+ }
+ else if (curr_lb == -1 && curr_ub == -1) {
+ neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+ ROUND_NOT_NEEDED);
+ add_assign_r(result, result, negator, ROUND_UP);
+ }
+ else {
+ // Next addend will be the maximum of four quantities.
+ assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+
+ add_assign_r(result, result, first_comparison_term, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of
+ // the bounded difference shapes.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type j = expr.last_nonzero();
+
+ if (j != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, j))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr = b, with `b' a constant;
+ // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t > 1, the `expr' is of the general form.
+ if (t == 0) {
+ // Case 1: expr = n; remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(j - 1));
+ if (a == denominator || a == -denominator) {
+ // Case 2: expr = a*w + b, with a = +/- denominator.
+ if (j == var.space_dimension())
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, denominator*var - b, a);
+ else {
+ // `expr == a*w + b', where `w != v'.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+ }
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t = 1, expr = a*w + b, but a <> +/- denominator.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ // The transformation is invertible.
+ Linear_Expression inverse((expr_v + denominator)*var);
+ inverse -= expr;
+ affine_image(var, inverse, expr_v);
+ }
+ else {
+ // Transformation not invertible: all constraints on `var' are lost.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the BD_Shape.
+ const dimension_type bds_space_dim = space_dimension();
+ const dimension_type v = var.id() + 1;
+ if (v > bds_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (bds_space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (bds_space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any image of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = ub_expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `ub_expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `ub_expr', if any.
+ dimension_type w = ub_expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!ub_expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `ub_expr':
+ // - If t == 0, then ub_expr == b, with `b' a constant;
+ // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `ub_expr' is of the general form.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: ub_expr == b.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `ub_expr'.
+ const Coefficient& a = ub_expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ if (w == v) {
+ // Here `var' occurs in `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(bds_space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `ub_expr'.
+ affine_image(new_var, ub_expr, denominator);
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Now apply the affine upper bound, as recorded in `new_var'.
+ add_constraint(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(bds_space_dim);
+ return;
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (a == denominator) {
+ // Add the new constraint `v - w == b/denominator'.
+ add_dbm_constraint(w, v, b, denominator);
+ }
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v + w == b/denominator'.
+ // Approximate it by computing lower and upper bounds for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lower_w'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `ub_expr' into `pos_sum'
+ // taking into account the sign of `denominator'.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -ub_expr;
+ const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ // Index of the variable that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1) {
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ dbm[0][v] = pos_sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ dbm[pos_pinf_index][v] = pos_sum;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the BD_Shape.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ if (ub_expr.coefficient(var) == 0) {
+ refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+ generalized_affine_preimage(var, GREATER_OR_EQUAL,
+ lb_expr, denominator);
+ return;
+ }
+ if (lb_expr.coefficient(var) == 0) {
+ refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ return;
+ }
+
+ const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+ // Here `var' occurs in `lb_expr' and `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ const Linear_Expression lb_inverse
+ = lb_expr - (lb_expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(lb_inverse_denom);
+ neg_assign(lb_inverse_denom, lb_expr_v);
+ affine_image(new_var, lb_inverse, lb_inverse_denom);
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ if (sgn(denominator) == sgn(lb_inverse_denom))
+ add_constraint(var >= new_var);
+ else
+ add_constraint(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim);
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the BDS.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ var.id());
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ return;
+ }
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Both shortest-path closure and reduction are lost.
+ reset_shortest_path_closed();
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ PPL_DIRTY_TEMP(N, d);
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ div_round_up(d, b, denominator);
+ if (w == v) {
+ // `expr' is of the form: a*v + b.
+ // Shortest-path closure and reduction are not preserved.
+ reset_shortest_path_closed();
+ if (a == denominator) {
+ // Translate each constraint `v - w <= dbm_wv'
+ // into the constraint `v - w <= dbm_wv + b/denominator';
+ // forget each constraint `w - v <= dbm_vw'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_iv = dbm[i][v];
+ add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Translate the constraint `0 - v <= dbm_v0'
+ // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+ N& dbm_v0 = dbm_v[0];
+ add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+ // Forget all the other constraints on `v'.
+ assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_dbm_constraints(v);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator)
+ // Add the new constraint `v - w <= b/denominator'.
+ add_dbm_constraint(w, v, d);
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v <= b/denominator - w'.
+ // Approximate it by computing a lower bound for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lb_w'.
+ add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ case GREATER_OR_EQUAL:
+ div_round_up(d, b, minus_denom);
+ if (w == v) {
+ // `expr' is of the form: a*w + b.
+ // Shortest-path closure and reduction are not preserved.
+ reset_shortest_path_closed();
+ if (a == denominator) {
+ // Translate each constraint `w - v <= dbm_vw'
+ // into the constraint `w - v <= dbm_vw - b/denominator';
+ // forget each constraint `v - w <= dbm_wv'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Translate the constraint `0 - v <= dbm_v0'
+ // into the constraint `0 - v <= dbm_0v - b/denominator'.
+ N& dbm_0v = dbm_0[v];
+ add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+ // Forget all the other constraints on `v'.
+ assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_dbm_constraints(v);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator)
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ add_dbm_constraint(v, w, d);
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v >= -w + b/denominator',
+ // i.e., `-v <= w - b/denominator'.
+ // Approximate it by computing an upper bound for `w'.
+ const N& dbm_0w = dbm_0[w];
+ if (!is_plus_infinity(dbm_0w)) {
+ // Add the constraint `-v <= ub_w - b/denominator'.
+ add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `v' and add back
+ // a constraint providing an upper or a lower bound for `v'
+ // (depending on `relsym').
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ // Speculative allocation of temporaries to be used in the following loops.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Compute an upper approximation for `sc_expr' into `sum'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ PPL_ASSERT(w != 0);
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ add_dbm_constraint(0, v, sum);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_OR_EQUAL:
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ const dimension_type i_dim = i.variable().space_dimension();
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+ add_dbm_constraint(v, 0, sum);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ add_dbm_constraint(v, pinf_index, sum);
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for BDSs.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // The image of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+ // Note that this constraint is a bounded difference if `t_rhs <= 1'
+ // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+ // more general form, it will be simply ignored.
+ // TODO: if it is not a bounded difference, should we compute
+ // approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine images for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT a bounded difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, rhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // TODO: each one of the following constraints is definitely NOT
+ // a bounded differences (since it has 3 variables at least).
+ // Thus, the method refine_no_check() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= new_var);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == new_var);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the BDS.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ var.id());
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // The preimage of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+ ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+ return;
+ }
+
+ refine(var, relsym, expr, denominator);
+ // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // ... otherwise, since the relation was not invertible,
+ // we just forget all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type bds_space_dim = space_dimension();
+ const dimension_type lhs_space_dim = lhs.space_dimension();
+ if (bds_space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (bds_space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for BDSs.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // The preimage of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In this case, preimage and image happen to be the same.
+ generalized_affine_image(lhs, relsym, rhs);
+ return;
+ }
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine preimages for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_preimage(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT a bounded difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ }
+ else {
+
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(bds_space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `lhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, lhs);
+ // Existentiallly quantify all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+ // then one of the following constraints will be added,
+ // since it is a bounded difference. Else the method
+ // refine_no_check() will ignore it, because the
+ // constraint is NOT a bounded difference.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(new_var <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(new_var == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(new_var >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(bds_space_dim);
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ if (marked_shortest_path_reduced()) {
+ // Disregard redundant constraints.
+ cs = minimized_constraints();
+ return cs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(a);
+ PPL_DIRTY_TEMP_COEFFICIENT(b);
+ // Go through all the unary constraints in `dbm'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type j = 1; j <= space_dim; ++j) {
+ const Variable x(j-1);
+ const N& dbm_0j = dbm_0[j];
+ const N& dbm_j0 = dbm[j][0];
+ if (is_additive_inverse(dbm_j0, dbm_0j)) {
+ // We have a unary equality constraint.
+ numer_denom(dbm_0j, b, a);
+ cs.insert(a*x == b);
+ }
+ else {
+ // We have 0, 1 or 2 unary inequality constraints.
+ if (!is_plus_infinity(dbm_0j)) {
+ numer_denom(dbm_0j, b, a);
+ cs.insert(a*x <= b);
+ }
+ if (!is_plus_infinity(dbm_j0)) {
+ numer_denom(dbm_j0, b, a);
+ cs.insert(-a*x <= b);
+ }
+ }
+ }
+
+ // Go through all the binary constraints in `dbm'.
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const Variable y(i-1);
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Variable x(j-1);
+ const N& dbm_ij = dbm_i[j];
+ const N& dbm_ji = dbm[j][i];
+ if (is_additive_inverse(dbm_ji, dbm_ij)) {
+ // We have a binary equality constraint.
+ numer_denom(dbm_ij, b, a);
+ cs.insert(a*x - a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 binary inequality constraints.
+ if (!is_plus_infinity(dbm_ij)) {
+ numer_denom(dbm_ij, b, a);
+ cs.insert(a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(dbm_ji)) {
+ numer_denom(dbm_ji, b, a);
+ cs.insert(a*y - a*x <= b);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+ shortest_path_reduction_assign();
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Compute leader information.
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+ std::vector<dimension_type> leader_indices;
+ compute_leader_indices(leaders, leader_indices);
+ const dimension_type num_leaders = leader_indices.size();
+
+ // Go through the non-leaders to generate equality constraints.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const dimension_type leader = leaders[i];
+ if (i != leader) {
+ // Generate the constraint relating `i' and its leader.
+ if (leader == 0) {
+ // A unary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], numer, denom);
+ cs.insert(denom*Variable(i-1) == numer);
+ }
+ else {
+ // A binary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], numer, denom);
+ cs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+ }
+ }
+ }
+
+ // Go through the leaders to generate inequality constraints.
+ // First generate all the unary inequalities.
+ const Bit_Row& red_0 = redundancy_dbm[0];
+ for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leader_indices[l_i];
+ if (!red_0[i]) {
+ numer_denom(dbm_0[i], numer, denom);
+ cs.insert(denom*Variable(i-1) <= numer);
+ }
+ if (!redundancy_dbm[i][0]) {
+ numer_denom(dbm[i][0], numer, denom);
+ cs.insert(-denom*Variable(i-1) <= numer);
+ }
+ }
+ // Then generate all the binary inequalities.
+ for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leader_indices[l_i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ const Bit_Row& red_i = redundancy_dbm[i];
+ for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+ const dimension_type j = leader_indices[l_j];
+ if (!red_i[j]) {
+ numer_denom(dbm_i[j], numer, denom);
+ cs.insert(denom*Variable(j-1) - denom*Variable(i-1) <= numer);
+ }
+ if (!redundancy_dbm[j][i]) {
+ numer_denom(dbm[j][i], numer, denom);
+ cs.insert(denom*Variable(i-1) - denom*Variable(j-1) <= numer);
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+ dimension_type old_dim = space_dimension();
+ // `var' should be one of the dimensions of the vector space.
+ if (var.space_dimension() > old_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // The space dimension of the resulting BDS should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dimension())
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Nothing to do, if no dimensions must be added.
+ if (m == 0)
+ return;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ // For each constraints involving variable `var', we add a
+ // similar constraint with the new variable substituted for
+ // variable `var'.
+ const dimension_type v_id = var.id() + 1;
+ const DB_Row<N>& dbm_v = dbm[v_id];
+ for (dimension_type i = old_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const N& dbm_i_v = dbm[i][v_id];
+ const N& dbm_v_i = dbm_v[i];
+ for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+ dbm_i[j] = dbm_i_v;
+ dbm[j][i] = dbm_v_i;
+ }
+ }
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ const dimension_type space_dim = space_dimension();
+ // `dest' should be one of the dimensions of the BDS.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the BDS.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ shortest_path_closure_assign();
+ if (!marked_empty()) {
+ // Recompute the elements of the row and the column corresponding
+ // to variable `dest' by taking the join of their value with the
+ // value of the corresponding elements in the row and column of the
+ // variable `vars'.
+ const dimension_type v_id = dest.id() + 1;
+ DB_Row<N>& dbm_v = dbm[v_id];
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ const dimension_type to_be_folded_id = *i + 1;
+ const DB_Row<N>& dbm_to_be_folded_id = dbm[to_be_folded_id];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ max_assign(dbm[j][v_id], dbm[j][to_be_folded_id]);
+ max_assign(dbm_v[j], dbm_to_be_folded_id[j]);
+ }
+ }
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<T>::is_integer)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ shortest_path_closure_assign();
+ if (space_dim == 0 || marked_empty())
+ return;
+
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (i != j)
+ drop_some_non_integer_points_helper(dbm_i[j]);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+ return;
+
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Variables_Set::const_iterator v_begin = vars.begin();
+ const Variables_Set::const_iterator v_end = vars.end();
+ PPL_ASSERT(v_begin != v_end);
+ // Unary constraints on a variable occurring in `vars'.
+ DB_Row<N>& dbm_0 = dbm[0];
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = *v_i + 1;
+ drop_some_non_integer_points_helper(dbm_0[i]);
+ drop_some_non_integer_points_helper(dbm[i][0]);
+ }
+
+ // Binary constraints where both variables occur in `vars'.
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = *v_i + 1;
+ DB_Row<N>& dbm_i = dbm[i];
+ for (Variables_Set::const_iterator v_j = v_begin; v_j != v_end; ++v_j) {
+ const dimension_type j = *v_j + 1;
+ if (i != j)
+ drop_some_non_integer_points_helper(dbm_i[j]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& bds) {
+ typedef typename BD_Shape<T>::coefficient_type N;
+ if (bds.is_universe())
+ s << "true";
+ else {
+ // We control empty bounded difference shape.
+ dimension_type n = bds.space_dimension();
+ if (bds.marked_empty())
+ s << "false";
+ else {
+ PPL_DIRTY_TEMP(N, v);
+ bool first = true;
+ for (dimension_type i = 0; i <= n; ++i)
+ for (dimension_type j = i + 1; j <= n; ++j) {
+ const N& c_i_j = bds.dbm[i][j];
+ const N& c_j_i = bds.dbm[j][i];
+ if (is_additive_inverse(c_j_i, c_i_j)) {
+ // We will print an equality.
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a equality constraint with one variable.
+ s << Variable(j - 1);
+ s << " = " << c_i_j;
+ }
+ else {
+ // We have got a equality constraint with two variables.
+ if (sgn(c_i_j) >= 0) {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ s << " = " << c_i_j;
+ }
+ else {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ s << " = " << c_j_i;
+ }
+ }
+ }
+ else {
+ // We will print a non-strict inequality.
+ if (!is_plus_infinity(c_j_i)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a constraint with only one variable.
+ s << Variable(j - 1);
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ else {
+ // We have got a constraint with two variables.
+ if (sgn(c_j_i) >= 0) {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ s << " <= " << c_j_i;
+ }
+ else {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ }
+ }
+ if (!is_plus_infinity(c_i_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a constraint with only one variable.
+ s << Variable(j - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ // We have got a constraint with two variables.
+ if (sgn(c_i_j) >= 0) {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ neg_assign_r(v, c_i_j, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+ status.ascii_dump(s);
+ s << "\n";
+ dbm.ascii_dump(s);
+ s << "\n";
+ redundancy_dbm.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+ if (!status.ascii_load(s))
+ return false;
+ if (!dbm.ascii_load(s))
+ return false;
+ if (!redundancy_dbm.ascii_load(s))
+ return false;
+ return true;
+}
+
+template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+ return dbm.external_memory_in_bytes()
+ + redundancy_dbm.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+ // Check whether the difference-bound matrix is well-formed.
+ if (!dbm.OK())
+ return false;
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ return false;
+
+ // An empty BDS is OK.
+ if (marked_empty())
+ return true;
+
+ // MINUS_INFINITY cannot occur at all.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ for (dimension_type j = dbm.num_rows(); j-- > 0; )
+ if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+ << dbm[i][j] << "!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // On the main diagonal only PLUS_INFINITY can occur.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+ << dbm[i][i] << "! (+inf was expected.)"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Check whether the shortest-path closure information is legal.
+ if (marked_shortest_path_closed()) {
+ BD_Shape x = *this;
+ x.reset_shortest_path_closed();
+ x.shortest_path_closure_assign();
+ if (x.dbm != dbm) {
+#ifndef NDEBUG
+ std::cerr << "BD_Shape is marked as closed but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // The following tests might result in false alarms when using floating
+ // point coefficients: they are only meaningful if the coefficient type
+ // base is exact (since otherwise shortest-path closure is approximated).
+ if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+ // Check whether the shortest-path reduction information is legal.
+ if (marked_shortest_path_reduced()) {
+ // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ for (dimension_type j = dbm.num_rows(); j-- > 0; )
+ if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+ << dbm[i][j] << " is marked as non-redundant!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ BD_Shape x = *this;
+ x.reset_shortest_path_reduced();
+ x.shortest_path_reduction_assign();
+ if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+ std::cerr << "BD_Shape is marked as reduced but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const BD_Shape& y) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template<typename Interval_Info>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form< Interval<T,
+ Interval_Info> >& lf) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_invalid_argument(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_templates_hh)
diff --git a/src/BD_Shape_types.hh b/src/BD_Shape_types.hh
new file mode 100644
index 0000000..5209605
--- /dev/null
+++ b/src/BD_Shape_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BD_Shape_types_hh
+#define PPL_BD_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+class BD_Shape_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_types_hh)
diff --git a/src/BHRZ03_Certificate.cc b/src/BHRZ03_Certificate.cc
new file mode 100644
index 0000000..b640ff7
--- /dev/null
+++ b/src/BHRZ03_Certificate.cc
@@ -0,0 +1,318 @@
+/* BHRZ03_Certificate class implementation (non-inline member functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "BHRZ03_Certificate_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::BHRZ03_Certificate::BHRZ03_Certificate(const Polyhedron& ph)
+ : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(0),
+ num_rays_null_coord(ph.space_dimension(), 0) {
+ // TODO: provide a correct and reasonably efficient
+ // implementation for NNC polyhedra.
+
+ // The computation of the certificate requires both the
+ // constraint and the generator systems in minimal form.
+ ph.minimize();
+ // It is assumed that `ph' is not an empty polyhedron.
+ PPL_ASSERT(!ph.marked_empty());
+
+ // The dimension of the polyhedron is obtained by subtracting
+ // the number of equalities from the space dimension.
+ // When counting constraints, for a correct reasoning, we have
+ // to disregard the low-level constraints (i.e., the positivity
+ // constraint and epsilon bounds).
+ const dimension_type space_dim = ph.space_dimension();
+ affine_dim = space_dim;
+ PPL_ASSERT(num_constraints == 0);
+ const Constraint_System& cs = ph.minimized_constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ ++num_constraints;
+ if (i->is_equality())
+ --affine_dim;
+ }
+
+ PPL_ASSERT(lin_space_dim == 0);
+ PPL_ASSERT(num_points == 0);
+ const Generator_System& gs = ph.minimized_generators();
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ switch (i->type()) {
+ case Generator::POINT:
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ ++num_points;
+ break;
+ case Generator::RAY:
+ // For each i such that 0 <= j < space_dim,
+ // `num_rays_null_coord[j]' will be the number of rays
+ // having exactly `j' coordinates equal to 0.
+ ++num_rays_null_coord[i->expression().num_zeroes(1, space_dim + 1)];
+ break;
+ case Generator::LINE:
+ // Since the generator systems is minimized, the dimension of
+ // the lineality space is equal to the number of lines.
+ ++lin_space_dim;
+ break;
+ }
+ PPL_ASSERT(OK());
+
+ // TODO: this is an inefficient workaround.
+ // For NNC polyhedra, constraints might be no longer up-to-date
+ // (and hence, neither minimized) due to the strong minimization
+ // process applied to generators when constructing the certificate.
+ // We have to reinforce the (normal) minimization of the constraint
+ // system. The future, lazy implementation of the strong minimization
+ // process will solve this problem.
+ if (!ph.is_necessarily_closed())
+ ph.minimize();
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const BHRZ03_Certificate& y) const {
+ PPL_ASSERT(OK() && y.OK());
+ if (affine_dim != y.affine_dim)
+ return (affine_dim > y.affine_dim) ? 1 : -1;
+ if (lin_space_dim != y.lin_space_dim)
+ return (lin_space_dim > y.lin_space_dim) ? 1 : -1;
+ if (num_constraints != y.num_constraints)
+ return (num_constraints > y.num_constraints) ? 1 : -1;
+ if (num_points != y.num_points)
+ return (num_points > y.num_points) ? 1 : -1;
+
+ const dimension_type space_dim = num_rays_null_coord.size();
+ PPL_ASSERT(num_rays_null_coord.size() == y.num_rays_null_coord.size());
+ // Note: iterating upwards, because we have to check first
+ // the number of rays having more NON-zero coordinates.
+ for (dimension_type i = 0; i < space_dim; ++i)
+ if (num_rays_null_coord[i] != y.num_rays_null_coord[i])
+ return (num_rays_null_coord[i] > y.num_rays_null_coord[i]) ? 1 : -1;
+ // All components are equal.
+ return 0;
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const Polyhedron& ph) const {
+ PPL_ASSERT(ph.space_dimension() == num_rays_null_coord.size());
+
+ // TODO: provide a correct and reasonably efficient
+ // implementation for NNC polyhedra.
+
+ // The computation of the certificate requires both the
+ // constraint and the generator systems in minimal form.
+ ph.minimize();
+ // It is assumed that `ph' is a polyhedron containing the
+ // polyhedron described by `*this': hence, it cannot be empty.
+ PPL_ASSERT(!ph.marked_empty());
+
+ // The dimension of the polyhedron is obtained by subtracting
+ // the number of equalities from the space dimension.
+ // When counting constraints, for a correct reasoning, we have
+ // to disregard the low-level constraints (i.e., the positivity
+ // constraint and epsilon bounds).
+ const dimension_type space_dim = ph.space_dimension();
+ dimension_type ph_affine_dim = space_dim;
+ dimension_type ph_num_constraints = 0;
+ const Constraint_System& cs = ph.minimized_constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ ++ph_num_constraints;
+ if (i->is_equality())
+ --ph_affine_dim;
+ }
+ // TODO: this is an inefficient workaround.
+ // For NNC polyhedra, constraints might be no longer up-to-date
+ // (and hence, neither minimized) due to the strong minimization
+ // process applied to generators when constructing the certificate.
+ // We have to reinforce the (normal) minimization of the constraint
+ // system. The future, lazy implementation of the strong minimization
+ // process will solve this problem.
+ if (!ph.is_necessarily_closed())
+ ph.minimize();
+
+ // If the dimension of `ph' is increasing, the chain is stabilizing.
+ if (ph_affine_dim > affine_dim)
+ return 1;
+
+ // At this point the two polyhedra must have the same dimension.
+ PPL_ASSERT(ph_affine_dim == affine_dim);
+
+ // Speculative optimization: in order to better exploit the incrementality
+ // of the comparison, we do not compute information about rays here,
+ // hoping that the other components will be enough.
+ dimension_type ph_lin_space_dim = 0;
+ dimension_type ph_num_points = 0;
+ const Generator_System& gs = ph.minimized_generators();
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ switch (i->type()) {
+ case Generator::POINT:
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ ++ph_num_points;
+ break;
+ case Generator::RAY:
+ break;
+ case Generator::LINE:
+ // Since the generator systems is minimized, the dimension of
+ // the lineality space is equal to the number of lines.
+ ++ph_lin_space_dim;
+ break;
+ }
+ // TODO: this is an inefficient workaround.
+ // For NNC polyhedra, constraints might be no longer up-to-date
+ // (and hence, neither minimized) due to the strong minimization
+ // process applied to generators when constructing the certificate.
+ // We have to reinforce the (normal) minimization of the constraint
+ // system. The future, lazy implementation of the strong minimization
+ // process will solve this problem.
+ if (!ph.is_necessarily_closed())
+ ph.minimize();
+
+ // If the dimension of the lineality space is increasing,
+ // then the chain is stabilizing.
+ if (ph_lin_space_dim > lin_space_dim)
+ return 1;
+
+ // At this point the lineality space of the two polyhedra must have
+ // the same dimension.
+ PPL_ASSERT(ph_lin_space_dim == lin_space_dim);
+
+ // If the number of constraints of `ph' is decreasing, then the chain
+ // is stabilizing. If it is increasing, the chain is not stabilizing.
+ // If they are equal, further investigation is needed.
+ if (ph_num_constraints != num_constraints)
+ return (ph_num_constraints < num_constraints) ? 1 : -1;
+
+ // If the number of points of `ph' is decreasing, then the chain
+ // is stabilizing. If it is increasing, the chain is not stabilizing.
+ // If they are equal, further investigation is needed.
+ if (ph_num_points != num_points)
+ return (ph_num_points < num_points) ? 1 : -1;
+
+ // The speculative optimization was not worth:
+ // compute information about rays.
+ std::vector<dimension_type> ph_num_rays_null_coord(ph.space_dim, 0);
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ if (i->is_ray())
+ ++ph_num_rays_null_coord[i->expression().num_zeroes(1, space_dim + 1)];
+
+ // Compare (lexicographically) the two vectors:
+ // if ph_num_rays_null_coord < num_rays_null_coord the chain is stabilizing.
+ for (dimension_type i = 0; i < space_dim; ++i)
+ if (ph_num_rays_null_coord[i] != num_rays_null_coord[i])
+ return (ph_num_rays_null_coord[i] < num_rays_null_coord[i]) ? 1 : -1;
+
+ // All components are equal.
+ return 0;
+}
+
+bool
+PPL::BHRZ03_Certificate::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // The dimension of the vector space.
+ const dimension_type space_dim = num_rays_null_coord.size();
+
+ if (affine_dim > space_dim) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "the affine dimension is greater than the space dimension!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (lin_space_dim > affine_dim) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "the lineality space dimension is greater than "
+ << "the affine dimension!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (num_constraints < space_dim - affine_dim) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "in a vector space of dimension `n',"
+ << "any polyhedron of affine dimension `k'" << endl
+ << "should have `n-k' non-redundant constraints at least."
+ << endl
+ << "Here space_dim = " << space_dim << ", "
+ << "affine_dim = " << affine_dim << ", "
+ << "but num_constraints = " << num_constraints << "!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (num_points == 0) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "the generator system has no points!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (lin_space_dim == space_dim) {
+ // This was a universe polyhedron.
+ if (num_constraints > 0) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "a universe polyhedron has non-redundant constraints!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (num_points != 1) {
+#ifndef NDEBUG
+ cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+ << endl
+ << "a universe polyhedron has more than one non-redundant point!"
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ // All tests passed.
+ return true;
+}
diff --git a/src/BHRZ03_Certificate_defs.hh b/src/BHRZ03_Certificate_defs.hh
new file mode 100644
index 0000000..433f5d6
--- /dev/null
+++ b/src/BHRZ03_Certificate_defs.hh
@@ -0,0 +1,118 @@
+/* BHRZ03_Certificate class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_defs_hh
+#define PPL_BHRZ03_Certificate_defs_hh 1
+
+#include "BHRZ03_Certificate_types.hh"
+#include "Polyhedron_types.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+
+ \note
+ Each convergence certificate has to be used together with a
+ compatible widening operator. In particular, BHRZ03_Certificate
+ can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+ //! Default constructor.
+ BHRZ03_Certificate();
+
+ //! Constructor: computes the certificate for \p ph.
+ BHRZ03_Certificate(const Polyhedron& ph);
+
+ //! Copy constructor.
+ BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+ //! Destructor.
+ ~BHRZ03_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+
+ Compares \p *this with \p y, using a total ordering which is a
+ refinement of the limited growth ordering relation for the
+ BHRZ03 widening.
+ */
+ int compare(const BHRZ03_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the certificate for
+ polyhedron \p ph is strictly smaller than \p *this.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_stabilizing(const Polyhedron& ph) const;
+
+ //! A total ordering on BHRZ03 certificates.
+ /*! \ingroup PPL_CXX_interface
+ This binary predicate defines a total ordering on BHRZ03 certificates
+ which is used when storing information about sets of polyhedra.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const BHRZ03_Certificate& x,
+ const BHRZ03_Certificate& y) const;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+private:
+ //! Affine dimension of the polyhedron.
+ dimension_type affine_dim;
+ //! Dimension of the lineality space of the polyhedron.
+ dimension_type lin_space_dim;
+ //! Cardinality of a non-redundant constraint system for the polyhedron.
+ dimension_type num_constraints;
+ /*! \brief
+ Number of non-redundant points in a generator system
+ for the polyhedron.
+ */
+ dimension_type num_points;
+ /*! \brief
+ A vector containing, for each index `0 <= i < space_dim',
+ the number of non-redundant rays in a generator system of the
+ polyhedron having exactly `i' null coordinates.
+ */
+ std::vector<dimension_type> num_rays_null_coord;
+};
+
+#include "BHRZ03_Certificate_inlines.hh"
+
+#endif // !defined(PPL_BHRZ03_Certificate_defs_hh)
diff --git a/src/BHRZ03_Certificate_inlines.hh b/src/BHRZ03_Certificate_inlines.hh
new file mode 100644
index 0000000..6d17f7e
--- /dev/null
+++ b/src/BHRZ03_Certificate_inlines.hh
@@ -0,0 +1,63 @@
+/* BHRZ03_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_inlines_hh
+#define PPL_BHRZ03_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+ : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+ num_rays_null_coord() {
+ // This is the certificate for a zero-dim universe polyhedron.
+ PPL_ASSERT(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+ : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+ num_constraints(y.num_constraints), num_points(y.num_points),
+ num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+ return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+ const BHRZ03_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_inlines_hh)
diff --git a/src/BHRZ03_Certificate_types.hh b/src/BHRZ03_Certificate_types.hh
new file mode 100644
index 0000000..f025348
--- /dev/null
+++ b/src/BHRZ03_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BHRZ03_Certificate_types_hh
+#define PPL_BHRZ03_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_types_hh)
diff --git a/src/BUGS.cc.dist b/src/BUGS.cc.dist
new file mode 100644
index 0000000..6de4b3f
--- /dev/null
+++ b/src/BUGS.cc.dist
@@ -0,0 +1,24 @@
+extern const char* const BUGS_array[23] = {
+ "",
+ "The PPL developers encourage you to report any bugs you find using the",
+ "bug tracking system available at https://www.cs.unipr.it/mantis/ .",
+ "Here `bug' should be interpreted in its broadest sense: outright",
+ "software errors, misfeatures, bad interfaces, missing or unclear",
+ "documentation... whatever is a subject for possible improvement.",
+ "",
+ "As far as software bugs are concerned, the best reports are those that",
+ "are reproducible. Including (or pointing us to) code that exhibits",
+ "the reported misbehavior is the best thing you can do to help us fix",
+ "the library. Of course, this is not always possible and we will",
+ "welcome any kind of bug report. Anyway, you may be interested to read",
+ "http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report",
+ "bugs effectively.",
+ "",
+ "",
+ "KNOWN BUGS",
+ "==========",
+ "",
+ "All known bugs were resolved before the release. It is likely that",
+ "there are still bugs in the released version. Any bugs found after",
+ "the release will be listed at http://bugseng.com/products/ppl/Bugs/ .",
+ 0};
diff --git a/src/BUGS.hh.dist b/src/BUGS.hh.dist
new file mode 100644
index 0000000..586ffeb
--- /dev/null
+++ b/src/BUGS.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_BUGS_hh
+#define PPL_BUGS_hh 1
+extern const char* const BUGS_array[23];
+#endif // !defined(PPL_BUGS_hh)
diff --git a/src/Bit_Matrix.cc b/src/Bit_Matrix.cc
new file mode 100644
index 0000000..85eedf0
--- /dev/null
+++ b/src/Bit_Matrix.cc
@@ -0,0 +1,265 @@
+/* Bit_Matrix class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Bit_Matrix_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "globals_defs.hh"
+#include "swapping_sort_templates.hh"
+#include "C_Integer.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Bit_Matrix&
+PPL::Bit_Matrix::operator=(const Bit_Matrix& y){
+ rows = y.rows;
+ row_size = y.row_size;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+void
+PPL::Bit_Matrix::sort_rows() {
+ const dimension_type num_elems = rows.size();
+ if (num_elems < 2)
+ return;
+
+ // Build the function objects implementing indirect sort comparison,
+ // indirect unique comparison and indirect swap operation.
+ using namespace Implementation;
+ typedef std::vector<Bit_Row> Cont;
+ typedef Indirect_Sort_Compare<Cont, Bit_Row_Less_Than> Sort_Compare;
+ typedef Indirect_Unique_Compare<Cont> Unique_Compare;
+ typedef Indirect_Swapper<Cont> Swapper;
+ const dimension_type num_duplicates
+ = indirect_sort_and_unique(num_elems,
+ Sort_Compare(rows),
+ Unique_Compare(rows),
+ Swapper(rows));
+
+ if (num_duplicates > 0) {
+ typedef Cont::iterator Iter;
+ typedef std::iterator_traits<Iter>::difference_type diff_t;
+ Iter last = rows.end();
+ Iter first = last - static_cast<diff_t>(num_duplicates);
+ rows.erase(first, last);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::add_recycled_row(Bit_Row& row) {
+ const dimension_type new_rows_size = rows.size() + 1;
+ if (rows.capacity() < new_rows_size) {
+ // Reallocation will take place.
+ std::vector<Bit_Row> new_rows;
+ new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_rows_size, Bit_Row());
+ // Put the new row in place.
+ dimension_type i = new_rows_size-1;
+ new_rows[i].m_swap(row);
+ // Steal the old rows.
+ while (i-- > 0)
+ new_rows[i].m_swap(rows[i]);
+ // Put the new rows into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else
+ // Reallocation will NOT take place: append an empty row
+ // and swap it with the new row.
+ rows.insert(rows.end(), Bit_Row())->m_swap(row);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose() {
+ const Bit_Matrix& x = *this;
+ const dimension_type nrows = num_rows();
+ const dimension_type ncols = num_columns();
+ Bit_Matrix tmp(ncols, nrows);
+ for (dimension_type i = nrows; i-- > 0; )
+ for (unsigned long j = x[i].last();
+ j != C_Integer<unsigned long>::max; j = x[i].prev(j))
+ tmp[j].set(i);
+ m_swap(tmp);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose_assign(const Bit_Matrix& y) {
+ const dimension_type y_num_rows = y.num_rows();
+ const dimension_type y_num_columns = y.num_columns();
+ Bit_Matrix tmp(y_num_columns, y_num_rows);
+ for (dimension_type i = y_num_rows; i-- > 0; )
+ for (unsigned long j = y[i].last();
+ j != C_Integer<unsigned long>::max; j = y[i].prev(j))
+ tmp[j].set(i);
+ m_swap(tmp);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::resize(dimension_type new_n_rows,
+ dimension_type new_n_columns) {
+ PPL_ASSERT(OK());
+ const dimension_type old_num_rows = num_rows();
+ if (new_n_columns < row_size) {
+ const dimension_type num_preserved_rows
+ = std::min(old_num_rows, new_n_rows);
+ Bit_Matrix& x = *this;
+ for (dimension_type i = num_preserved_rows; i-- > 0; )
+ x[i].clear_from(new_n_columns);
+ }
+ row_size = new_n_columns;
+ if (new_n_rows > old_num_rows) {
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation will take place.
+ std::vector<Bit_Row> new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, Bit_Row());
+ // Steal the old rows.
+ for (dimension_type i = old_num_rows; i-- > 0; )
+ new_rows[i].m_swap(rows[i]);
+ // Put the new vector into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_num_rows, Bit_Row());
+ }
+ else if (new_n_rows < old_num_rows)
+ // Drop some rows.
+ rows.resize(new_n_rows);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::ascii_dump(std::ostream& s) const {
+ const Bit_Matrix& x = *this;
+ const char separator = ' ';
+ s << num_rows() << separator << 'x' << separator
+ << num_columns() << "\n";
+ for (dimension_type i = 0; i < num_rows(); ++i) {
+ for (dimension_type j = 0; j < num_columns(); ++j)
+ s << x[i][j] << separator;
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Bit_Matrix)
+
+bool
+PPL::Bit_Matrix::ascii_load(std::istream& s) {
+ Bit_Matrix& x = *this;
+ dimension_type nrows;
+ dimension_type ncols;
+ std::string str;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize(nrows, ncols);
+
+ for (dimension_type i = 0; i < num_rows(); ++i)
+ for (dimension_type j = 0; j < num_columns(); ++j) {
+ int bit;
+ if (!(s >> bit))
+ return false;
+ if (bit != 0)
+ x[i].set(j);
+ else
+ x[i].clear(j);
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Bit_Matrix::external_memory_in_bytes() const {
+ memory_size_type n = rows.capacity() * sizeof(Dense_Row);
+ for (dimension_type i = num_rows(); i-- > 0; )
+ n += rows[i].external_memory_in_bytes();
+ return n;
+}
+
+bool
+PPL::Bit_Matrix::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ const Bit_Matrix& x = *this;
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ const Bit_Row& row = x[i];
+ if (!row.OK())
+ return false;
+ else if (row.last() != C_Integer<unsigned long>::max
+ && row.last() >= row_size) {
+#ifndef NDEBUG
+ cerr << "Bit_Matrix[" << i << "] is a row with too many bits!"
+ << endl
+ << "(row_size == " << row_size
+ << ", row.last() == " << row.last() << ")"
+ << endl;
+#endif
+ return false;
+ }
+ }
+ return true;
+}
+
+#ifndef NDEBUG
+bool
+PPL::Bit_Matrix::check_sorted() const {
+ const Bit_Matrix& x = *this;
+ for (dimension_type i = num_rows(); i-- > 1; )
+ if (compare(x[i-1], x[i]) > 0)
+ return false;
+ return true;
+}
+#endif
+
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+bool
+PPL::operator==(const Bit_Matrix& x, const Bit_Matrix& y) {
+ const dimension_type x_num_rows = x.num_rows();
+ if (x_num_rows != y.num_rows()
+ || x.num_columns() != y.num_columns())
+ return false;
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
diff --git a/src/Bit_Matrix_defs.hh b/src/Bit_Matrix_defs.hh
new file mode 100644
index 0000000..d2b67ee
--- /dev/null
+++ b/src/Bit_Matrix_defs.hh
@@ -0,0 +1,187 @@
+/* Bit_Matrix class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_defs_hh
+#define PPL_Bit_Matrix_defs_hh 1
+
+#include "Bit_Matrix_types.hh"
+#include "Linear_System_types.hh"
+#include "Bit_Row_defs.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Matrix */
+void swap(Bit_Matrix& x, Bit_Matrix& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+ //! Default constructor.
+ Bit_Matrix();
+
+ //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+ Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+ //! Copy constructor.
+ Bit_Matrix(const Bit_Matrix& y);
+
+ //! Destructor.
+ ~Bit_Matrix();
+
+ //! Assignment operator.
+ Bit_Matrix& operator=(const Bit_Matrix& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Bit_Matrix& y);
+
+ //! Subscript operator.
+ Bit_Row& operator[](dimension_type k);
+
+ //! Constant subscript operator.
+ const Bit_Row& operator[](dimension_type k) const;
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ //! Transposes the matrix.
+ void transpose();
+
+ //! Makes \p *this a transposed copy of \p y.
+ void transpose_assign(const Bit_Matrix& y);
+
+ //! Returns the maximum number of rows of a Bit_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the number of columns of \p *this.
+ dimension_type num_columns() const;
+
+ //! Returns the number of rows of \p *this.
+ dimension_type num_rows() const;
+
+ //! Sorts the rows and removes duplicates.
+ void sort_rows();
+
+ //! Looks for \p row in \p *this, which is assumed to be sorted.
+ /*!
+ \return
+ <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+ \param row
+ The row that will be searched for in the matrix.
+
+ Given a sorted bit matrix (this ensures better efficiency),
+ tells whether it contains the given row.
+ */
+ bool sorted_contains(const Bit_Row& row) const;
+
+ //! Adds \p row to \p *this.
+ /*!
+ \param row
+ The row whose implementation will be recycled.
+
+ The only thing that can be done with \p row upon return is destruction.
+ */
+ void add_recycled_row(Bit_Row& row);
+
+ //! Removes the last \p n rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Removes the last \p n columns.
+ /*!
+ The last \p n columns of the matrix are all made of zeros.
+ If such an assumption is not met, the behavior is undefined.
+ */
+ void remove_trailing_columns(dimension_type n);
+
+ //! Resizes the matrix copying the old contents.
+ void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+ //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+ bool check_sorted() const;
+#endif
+
+private:
+ //! Contains the rows of the matrix.
+ std::vector<Bit_Row> rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ /*! \ingroup PPL_CXX_interface */
+ struct Bit_Row_Less_Than {
+ bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+ };
+
+ template <typename Row>
+ friend class Parma_Polyhedra_Library::Linear_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Bit_Matrix_inlines.hh"
+
+#endif // !defined(PPL_Bit_Matrix_defs_hh)
diff --git a/src/Bit_Matrix_inlines.hh b/src/Bit_Matrix_inlines.hh
new file mode 100644
index 0000000..a5e2f96
--- /dev/null
+++ b/src/Bit_Matrix_inlines.hh
@@ -0,0 +1,149 @@
+/* Bit_Matrix class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_inlines_hh
+#define PPL_Bit_Matrix_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Matrix::Bit_Matrix()
+ : rows(),
+ row_size(0) {
+}
+
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+ return std::vector<Bit_Row>().max_size();
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+ const dimension_type n_columns)
+ : rows(n_rows),
+ row_size(n_columns) {
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size) {
+}
+
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
+
+inline void
+Bit_Matrix::remove_trailing_rows(const dimension_type n) {
+ // The number of rows to be erased cannot be greater
+ // than the actual number of the rows of the matrix.
+ PPL_ASSERT(n <= rows.size());
+ if (n != 0)
+ rows.resize(rows.size() - n);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::remove_trailing_columns(const dimension_type n) {
+ // The number of columns to be erased cannot be greater
+ // than the actual number of the columns of the matrix.
+ PPL_ASSERT(n <= row_size);
+ row_size -= n;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::m_swap(Bit_Matrix& y) {
+ using std::swap;
+ swap(row_size, y.row_size);
+ swap(rows, y.rows);
+}
+
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Bit_Matrix::num_columns() const {
+ return row_size;
+}
+
+inline dimension_type
+Bit_Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Bit_Row> tmp;
+ using std::swap;
+ swap(tmp, rows);
+ row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+ return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+ PPL_ASSERT(check_sorted());
+ return std::binary_search(rows.begin(), rows.end(), row,
+ Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+ return !(x == y);
+}
+
+/*! \relates Bit_Matrix */
+inline void
+swap(Bit_Matrix& x, Bit_Matrix& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Matrix_inlines_hh)
diff --git a/src/Bit_Matrix_types.hh b/src/Bit_Matrix_types.hh
new file mode 100644
index 0000000..11bfb42
--- /dev/null
+++ b/src/Bit_Matrix_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Bit_Matrix_types_hh
+#define PPL_Bit_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Matrix_types_hh)
diff --git a/src/Bit_Row.cc b/src/Bit_Row.cc
new file mode 100644
index 0000000..aabeb21
--- /dev/null
+++ b/src/Bit_Row.cc
@@ -0,0 +1,341 @@
+/* Bit_Row class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Bit_Row_defs.hh"
+#include "assert.hh"
+#include "C_Integer.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned long
+PPL::Bit_Row::first() const {
+ const mp_size_t vec_size = vec->_mp_size;
+ PPL_ASSERT(vec_size >= 0);
+ mp_srcptr p = vec->_mp_d;
+ for (mp_size_t li = 0; li < vec_size; ++li, ++p) {
+ const mp_limb_t limb = *p;
+ if (limb != 0)
+ return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+ + Implementation::first_one(limb);
+ }
+ return C_Integer<unsigned long>::max;
+}
+
+unsigned long
+PPL::Bit_Row::next(unsigned long position) const {
+ ++position;
+
+ // The alternative implementation using the mpz_scan1() function
+ // of GMP was measured to be slower that ours. Here it is, in
+ // case mpz_scan1() is improved.
+ //
+ // <CODE>
+ // unsigned long r = mpz_scan1(vec, position);
+ // return (r == C_Integer<unsigned long>::max) ? -1 : r;
+ // </CODE>
+
+ const unsigned long uli = position / PPL_BITS_PER_GMP_LIMB;
+ mp_size_t li = static_cast<mp_size_t>(uli);
+ const mp_size_t vec_size = vec->_mp_size;
+ PPL_ASSERT(vec_size >= 0);
+ if (li >= vec_size)
+ return C_Integer<unsigned long>::max;
+
+ // Get the first limb.
+ mp_srcptr p = vec->_mp_d + li;
+
+ // Mask off any bits before `position' in the first limb.
+ mp_limb_t limb
+ = *p & ((~static_cast<mp_limb_t>(0)) << (position % PPL_BITS_PER_GMP_LIMB));
+
+ while (true) {
+ if (limb != 0)
+ return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+ + Implementation::first_one(limb);
+ ++li;
+ if (li == vec_size)
+ break;
+ ++p;
+ limb = *p;
+ }
+ return C_Integer<unsigned long>::max;
+}
+
+unsigned long
+PPL::Bit_Row::last() const {
+ mp_size_t li = vec->_mp_size;
+ PPL_ASSERT(li >= 0);
+ if (li == 0)
+ return C_Integer<unsigned long>::max;
+ --li;
+ const mp_srcptr p = vec->_mp_d + li;
+ const mp_limb_t limb = *p;
+ PPL_ASSERT(limb != 0);
+ return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+ + Implementation::last_one(limb);
+}
+
+unsigned long
+PPL::Bit_Row::prev(unsigned long position) const {
+ if (position == 0)
+ return C_Integer<unsigned long>::max;
+
+ --position;
+
+ const mp_size_t vec_size = vec->_mp_size;
+ PPL_ASSERT(vec_size > 0);
+ const unsigned long uli = position / PPL_BITS_PER_GMP_LIMB;
+ mp_size_t li = static_cast<mp_size_t>(uli);
+
+ mp_limb_t limb;
+ mp_srcptr p = vec->_mp_d;
+
+ // Get the first limb.
+ if (li >= vec_size) {
+ li = vec_size - 1;
+ p += li;
+ limb = *p;
+ }
+ else {
+ const mp_limb_t mask
+ = (~static_cast<mp_limb_t>(0))
+ >> (PPL_BITS_PER_GMP_LIMB - 1U - position % PPL_BITS_PER_GMP_LIMB);
+ p += li;
+ limb = *p & mask;
+ }
+
+ while (true) {
+ if (limb != 0)
+ return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+ + Implementation::last_one(limb);
+ if (li == 0)
+ break;
+ --li;
+ --p;
+ limb = *p;
+ }
+ return C_Integer<unsigned long>::max;
+}
+
+bool
+PPL::Bit_Row::operator[](const unsigned long k) const {
+ const mp_size_t vec_size = vec->_mp_size;
+ PPL_ASSERT(vec_size >= 0);
+
+ const unsigned long i = k / static_cast<unsigned long>(GMP_NUMB_BITS);
+ if (i >= static_cast<unsigned long>(vec_size))
+ return false;
+
+ const mp_limb_t limb = *(vec->_mp_d + i);
+ return ((limb >> (k % static_cast<unsigned long>(GMP_NUMB_BITS))) & 1U) != 0;
+}
+
+void
+PPL::Bit_Row::set_until(unsigned long k) {
+ // FIXME, TODO: this is an inefficient implementation.
+ while (k-- > 0)
+ mpz_setbit(vec, k);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+int
+PPL::compare(const Bit_Row& x, const Bit_Row& y) {
+ const mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ mp_size_t size = ((x_size > y_size) ? y_size : x_size);
+ mp_srcptr xp = x.vec->_mp_d;
+ mp_srcptr yp = y.vec->_mp_d;
+ while (size > 0) {
+ const mp_limb_t xl = *xp;
+ const mp_limb_t yl = *yp;
+ if (xl != yl) {
+ // Get the ones where they are different.
+ const mp_limb_t diff = xl ^ yl;
+ // First bit that is different.
+ const mp_limb_t mask = diff & ~(diff-1);
+ return ((xl & mask) != 0) ? 1 : -1;
+ }
+ ++xp;
+ ++yp;
+ --size;
+ }
+ return (x_size == y_size) ? 0 : ((x_size > y_size) ? 1 : -1);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y) {
+ mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ if (x_size > y_size)
+ return false;
+ mp_srcptr xp = x.vec->_mp_d;
+ mp_srcptr yp = y.vec->_mp_d;
+ while (x_size > 0) {
+ if ((*xp & ~*yp) != 0)
+ return false;
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+ bool& strict_subset) {
+ mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ if (x_size > y_size)
+ return false;
+ mp_srcptr xp = x.vec->_mp_d;
+ mp_srcptr yp = y.vec->_mp_d;
+ strict_subset = (x_size < y_size);
+ mp_limb_t xl;
+ mp_limb_t yl;
+ if (strict_subset) {
+ while (x_size > 0) {
+ xl = *xp;
+ yl = *yp;
+ if ((xl & ~yl) != 0)
+ return false;
+ strict_subset_next:
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ }
+ else {
+ while (x_size > 0) {
+ xl = *xp;
+ yl = *yp;
+ if (xl != yl) {
+ if ((xl & ~yl) != 0)
+ return false;
+ strict_subset = true;
+ goto strict_subset_next;
+ }
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ }
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::strict_subset(const Bit_Row& x, const Bit_Row& y) {
+ mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ if (x_size > y_size)
+ return false;
+ bool different = (x_size < y_size);
+ mp_srcptr xp = x.vec->_mp_d;
+ mp_srcptr yp = y.vec->_mp_d;
+ while (x_size > 0) {
+ const mp_limb_t xl = *xp;
+ const mp_limb_t yl = *yp;
+ if ((xl & ~yl) != 0)
+ return false;
+ if (!different && xl != yl)
+ different = true;
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ return different;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator==(const Bit_Row& x, const Bit_Row& y) {
+ const mp_size_t x_vec_size = x.vec->_mp_size;
+ PPL_ASSERT(x_vec_size >= 0);
+ const mp_size_t y_vec_size = y.vec->_mp_size;
+ PPL_ASSERT(y_vec_size >= 0);
+
+ if (x_vec_size != y_vec_size)
+ return false;
+
+ return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator!=(const Bit_Row& x, const Bit_Row& y) {
+ const mp_size_t x_vec_size = x.vec->_mp_size;
+ PPL_ASSERT(x_vec_size >= 0);
+ const mp_size_t y_vec_size = y.vec->_mp_size;
+ PPL_ASSERT(y_vec_size >= 0);
+
+ if (x_vec_size != y_vec_size)
+ return true;
+
+ return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0;
+}
+
+bool
+PPL::Bit_Row::OK() const {
+ const mp_size_t vec_size = vec->_mp_size;
+ const mp_size_t vec_alloc = vec->_mp_alloc;
+ return vec_size >= 0
+ && vec_alloc >= vec_size
+ && (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
+}
+
+void
+PPL::Bit_Row::union_helper(const Bit_Row& y, const Bit_Row& z) {
+ mp_size_t y_size = y.vec->_mp_size;
+ mp_size_t z_size = z.vec->_mp_size;
+ PPL_ASSERT(y_size <= z_size);
+ PPL_ASSERT(vec->_mp_alloc >= z_size);
+ vec->_mp_size = z.vec->_mp_size;
+ mp_srcptr yp = y.vec->_mp_d;
+ mp_srcptr zp = z.vec->_mp_d;
+ mp_ptr p = vec->_mp_d;
+ z_size -= y_size;
+ while (y_size > 0) {
+ *p = *yp | * zp;
+ ++yp;
+ ++zp;
+ ++p;
+ --y_size;
+ }
+ while (z_size > 0) {
+ *p = *zp;
+ ++zp;
+ ++p;
+ --z_size;
+ }
+}
diff --git a/src/Bit_Row_defs.hh b/src/Bit_Row_defs.hh
new file mode 100644
index 0000000..d51f39a
--- /dev/null
+++ b/src/Bit_Row_defs.hh
@@ -0,0 +1,214 @@
+/* Bit_Row class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Row_defs_hh
+#define PPL_Bit_Row_defs_hh 1
+
+#include "Bit_Row_types.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <gmpxx.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Row */
+void swap(Bit_Row& x, Bit_Row& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Bit_Row>::iterator x,
+ std::vector<Bit_Row>::iterator y);
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+ Compares \p x with \p y starting from the least significant bits.
+ The ordering is total and has the following property: if \p x and \p y
+ are two rows seen as sets of naturals, if \p x is a strict subset
+ of \p y, then \p x comes before \p y.
+
+ Returns
+ - -1 if \p x comes before \p y in the ordering;
+ - 0 if \p x and \p y are equal;
+ - 1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+ indicating whether the inclusion is strict or not.
+
+ \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+ bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+ //! Default constructor.
+ Bit_Row();
+
+ //! Copy constructor.
+ Bit_Row(const Bit_Row& y);
+
+ //! Set-union constructor.
+ /*!
+ Constructs an object containing the set-union of \p y and \p z.
+ */
+ Bit_Row(const Bit_Row& y, const Bit_Row& z);
+
+ //! Destructor.
+ ~Bit_Row();
+
+ //! Assignment operator.
+ Bit_Row& operator=(const Bit_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Bit_Row& y);
+
+ //! Returns the truth value corresponding to the bit in position \p k.
+ bool operator[](unsigned long k) const;
+
+ //! Sets the bit in position \p k.
+ void set(unsigned long k);
+
+ //! Sets bits up to position \p k (excluded).
+ void set_until(unsigned long k);
+
+ //! Clears the bit in position \p k.
+ void clear(unsigned long k);
+
+ //! Clears bits from position \p k (included) onward.
+ void clear_from(unsigned long k);
+
+ //! Clears all the bits of the row.
+ void clear();
+
+ //! Assigns to \p *this the set-theoretic union of \p x and \p y.
+ void union_assign(const Bit_Row& x, const Bit_Row& y);
+
+ //! Assigns to \p *this the set-theoretic intersection of \p x and \p y.
+ void intersection_assign(const Bit_Row& x, const Bit_Row& y);
+
+ //! Assigns to \p *this the set-theoretic difference of \p x and \p y.
+ void difference_assign(const Bit_Row& x, const Bit_Row& y);
+
+
+ friend int compare(const Bit_Row& x, const Bit_Row& y);
+ friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+ friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+ friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+ friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+ bool& strict_subset);
+ friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+ //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+ unsigned long first() const;
+
+ /*! \brief
+ Returns the index of the first set bit after \p position
+ or ULONG_MAX if no bit after \p position is set.
+ */
+ unsigned long next(unsigned long position) const;
+
+ //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+ unsigned long last() const;
+
+ /*! \brief
+ Returns the index of the first set bit before \p position
+ or ULONG_MAX if no bits before \p position is set.
+ */
+ unsigned long prev(unsigned long position) const;
+
+ //! Returns the number of set bits in the row.
+ unsigned long count_ones() const;
+
+ //! Returns <CODE>true</CODE> if no bit is set in the row.
+ bool empty() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied
+ bool OK() const;
+
+private:
+ //! Bit-vector representing the row.
+ mpz_t vec;
+
+ //! Assigns to \p *this the union of \p y and \p z.
+ /*!
+ The size of \p y must be be less than or equal to the size of \p z.
+ Upon entry, \p vec must have allocated enough space to contain the result.
+ */
+ void union_helper(const Bit_Row& y, const Bit_Row& z);
+};
+
+#include "Bit_Row_inlines.hh"
+
+#endif // !defined(PPL_Bit_Row_defs_hh)
diff --git a/src/Bit_Row_inlines.hh b/src/Bit_Row_inlines.hh
new file mode 100644
index 0000000..ccb700b
--- /dev/null
+++ b/src/Bit_Row_inlines.hh
@@ -0,0 +1,236 @@
+/* Bit_Row class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Row_inlines_hh
+#define PPL_Bit_Row_inlines_hh 1
+
+#include "compiler.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+
+// For the declaration of ffs(3).
+#if defined(PPL_HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(PPL_HAVE_STRING_H)
+# include <string.h>
+#endif
+
+#define PPL_BITS_PER_GMP_LIMB sizeof_to_bits(PPL_SIZEOF_MP_LIMB_T)
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+ mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+ mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z) {
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ const mp_size_t z_size = z.vec->_mp_size;
+ PPL_ASSERT(z_size >= 0);
+ if (y_size < z_size) {
+ PPL_ASSERT(static_cast<unsigned long>(z_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_init2(vec, static_cast<unsigned long>(z_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(y, z);
+ }
+ else {
+ PPL_ASSERT(static_cast<unsigned long>(y_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_init2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(z, y);
+ }
+}
+
+inline
+Bit_Row::~Bit_Row() {
+ mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+ mpz_set(vec, y.vec);
+ return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+ mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+ mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+ mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+ const mp_size_t x_size = vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ return (x_size == 0) ? 0 : mpn_popcount(vec->_mp_d, x_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+ return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::m_swap(Bit_Row& y) {
+ mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+ mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+ return static_cast<memory_size_type>(vec[0]._mp_alloc) * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Bit_Row::union_assign(const Bit_Row& x, const Bit_Row& y) {
+ const mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ if (x_size < y_size) {
+ PPL_ASSERT(static_cast<unsigned long>(y_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_realloc2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(x, y);
+ }
+ else {
+ PPL_ASSERT(static_cast<unsigned long>(x_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_realloc2(vec, static_cast<unsigned long>(x_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(y, x);
+ }
+}
+
+inline void
+Bit_Row::intersection_assign(const Bit_Row& x, const Bit_Row& y) {
+ mpz_and(vec, x.vec, y.vec);
+}
+
+inline void
+Bit_Row::difference_assign(const Bit_Row& x, const Bit_Row& y) {
+ PPL_DIRTY_TEMP(mpz_class, complement_y);
+ mpz_com(complement_y.get_mpz_t(), y.vec);
+ mpz_and(vec, x.vec, complement_y.get_mpz_t());
+}
+
+namespace Implementation {
+
+/*! \brief
+ Assuming \p u is nonzero, returns the index of the first set bit in \p u.
+*/
+inline unsigned int
+first_one(unsigned int u) {
+ return ctz(u);
+}
+
+/*! \brief
+ Assuming \p ul is nonzero, returns the index of the first set bit in
+ \p ul.
+*/
+inline unsigned int
+first_one(unsigned long ul) {
+ return ctz(ul);
+}
+
+/*! \brief
+ Assuming \p ull is nonzero, returns the index of the first set bit in
+ \p ull.
+*/
+inline unsigned int
+first_one(unsigned long long ull) {
+ return ctz(ull);
+}
+
+/*! \brief
+ Assuming \p u is nonzero, returns the index of the last set bit in \p u.
+*/
+inline unsigned int
+last_one(unsigned int u) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(u)))
+ - 1U - clz(u);
+}
+
+/*! \brief
+ Assuming \p ul is nonzero, returns the index of the last set bit in
+ \p ul.
+*/
+inline unsigned int
+last_one(unsigned long ul) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(ul)))
+ - 1U - clz(ul);
+}
+
+/*! \brief
+ Assuming \p ull is nonzero, returns the index of the last set bit in
+ \p ull.
+*/
+inline unsigned int
+last_one(unsigned long long ull) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(ull)))
+ - 1U - clz(ull);
+}
+
+} // namespace Implementation
+
+/*! \relates Bit_Row */
+inline void
+swap(Bit_Row& x, Bit_Row& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Bit_Row */
+inline void
+iter_swap(std::vector<Bit_Row>::iterator x,
+ std::vector<Bit_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Row_inlines_hh)
diff --git a/src/Bit_Row_types.hh b/src/Bit_Row_types.hh
new file mode 100644
index 0000000..7206d43
--- /dev/null
+++ b/src/Bit_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Bit_Row_types_hh
+#define PPL_Bit_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Row_types_hh)
diff --git a/src/Boundary_defs.hh b/src/Boundary_defs.hh
new file mode 100644
index 0000000..b00fe51
--- /dev/null
+++ b/src/Boundary_defs.hh
@@ -0,0 +1,729 @@
+/* Interval boundary functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Boundary_defs_hh
+#define PPL_Boundary_defs_hh 1
+
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Property {
+ enum Type {
+ SPECIAL_,
+ OPEN_,
+ };
+ typedef bool Value;
+ static const Value default_value = true;
+ static const Value unsupported_value = false;
+ Property(Type t)
+ : type(t) {
+ }
+ Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+
+enum Boundary_Type {
+ LOWER = ROUND_DOWN,
+ UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+ if (check)
+ return static_cast<Rounding_Dir>(t) | ROUND_STRICT_RELATION;
+ else
+ return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+ PPL_ASSERT(Info::store_special);
+ info.set_boundary_property(type, SPECIAL);
+ return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+ return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_open)
+ return info.get_boundary_property(type, OPEN);
+ else
+ return !Info::store_special && !Info::may_contain_infinity
+ && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_open)
+ return info.get_boundary_property(type, OPEN);
+ else
+ return !Info::may_contain_infinity
+ && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+ PPL_COMPILE_TIME_CHECK(Info::store_special
+ || std::numeric_limits<T>::is_bounded
+ || std::numeric_limits<T>::has_infinity,
+ "unbounded is not representable");
+ Result r;
+ if (Info::store_special)
+ r = special_set_boundary_infinity(type, x, info);
+ else if (type == LOWER)
+ r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+ else
+ r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+ if (result_relation(r) == VR_EQ && !Info::may_contain_infinity)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ if (open) {
+ PPL_ASSERT(type == LOWER);
+ }
+ else {
+ PPL_ASSERT(Info::may_contain_infinity);
+ }
+ Result r;
+ if (Info::store_special) {
+ PPL_ASSERT(type == LOWER);
+ r = special_set_boundary_infinity(type, x, info);
+ }
+ else {
+ r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ }
+ if (open || result_relation(r) != VR_EQ)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ if (open) {
+ PPL_ASSERT(type == UPPER);
+ }
+ else {
+ PPL_ASSERT(Info::may_contain_infinity);
+ }
+ Result r;
+ if (Info::store_special) {
+ PPL_ASSERT(type == UPPER);
+ r = special_set_boundary_infinity(type, x, info);
+ }
+ else {
+ r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ }
+ if (open || result_relation(r) != VR_EQ)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ PPL_ASSERT(open || Info::may_contain_infinity);
+ Result r;
+ if (Info::store_special)
+ r = special_set_boundary_infinity(type, x, info);
+ else if (type == LOWER)
+ r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+ else
+ r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_inf(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special && type == LOWER)
+ return info.get_boundary_property(type, SPECIAL);
+ else if (std::numeric_limits<T>::has_infinity)
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+ else if (std::numeric_limits<T>::is_bounded)
+ return x == std::numeric_limits<T>::min();
+ else
+ return false;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_sup(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special && type == UPPER)
+ return info.get_boundary_property(type, SPECIAL);
+ else if (std::numeric_limits<T>::has_infinity)
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+ else if (std::numeric_limits<T>::is_bounded)
+ return x == std::numeric_limits<T>::max();
+ else
+ return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+ if (!std::numeric_limits<T>::has_infinity)
+ return false;
+ if (type == LOWER)
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+ else
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+ if (!Info::may_contain_infinity)
+ return false;
+ else if (type == LOWER)
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+ else
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (type == LOWER) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+ }
+ else
+ return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (type == UPPER) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+ }
+ else
+ return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+ return normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+infinity_sign(Boundary_Type type, const T& x, const Info& info) {
+ if (is_boundary_infinity(type, x, info))
+ return (type == LOWER) ? -1 : 1;
+ else if (is_reverse_infinity(type, x, info))
+ return (type == UPPER) ? -1 : 1;
+ else
+ return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+ return Info::may_contain_infinity
+ && !info.get_boundary_property(type, OPEN)
+ && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+ return !Info::may_contain_infinity
+ || info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+ if (info.get_boundary_property(type, SPECIAL))
+ return (type == LOWER) ? -1 : 1;
+ else
+ // The following Parma_Polyhedra_Library:: qualification is to work
+ // around a bug of GCC 4.0.x.
+ return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+ int sign = sgn_b(type, x, info);
+ if (x == 0 && info.get_boundary_property(type, OPEN))
+ return (type == LOWER) ? -1 : 1;
+ else
+ return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (type1 == type2) {
+ if (is_open(type1, x1, info1)
+ != is_open(type2, x2, info2))
+ return false;
+ }
+ else if (is_open(type1, x1, info1)
+ || is_open(type2, x2, info2))
+ return false;
+ if (is_minus_infinity(type1, x1, info1))
+ return is_minus_infinity(type2, x2, info2);
+ else if (is_plus_infinity(type1, x1, info1))
+ return is_plus_infinity(type2, x2, info2);
+ else if (is_minus_infinity(type2, x2, info2)
+ || is_plus_infinity(type2, x2, info2))
+ return false;
+ else
+ return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (is_open(type1, x1, info1)) {
+ if (type1 == UPPER
+ && (type2 == LOWER
+ || !is_open(type2, x2, info2)))
+ goto le;
+ }
+ else if (type2 == LOWER
+ && is_open(type2, x2, info2)) {
+ le:
+ if (is_minus_infinity(type1, x1, info1)
+ || is_plus_infinity(type2, x2, info2))
+ return true;
+ if (is_plus_infinity(type1, x1, info1)
+ || is_minus_infinity(type2, x2, info2))
+ return false;
+ else
+ return less_or_equal(x1, x2);
+ }
+ if (is_plus_infinity(type1, x1, info1)
+ || is_minus_infinity(type2, x2, info2))
+ return false;
+ if (is_minus_infinity(type1, x1, info1)
+ || is_plus_infinity(type2, x2, info2))
+ return true;
+ else
+ return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+ bool open, Result r) {
+ r = result_relation_class(r);
+ if (type == LOWER) {
+ switch (r) {
+ case V_GT_MINUS_INFINITY:
+ open = true;
+ /* Fall through */
+ case V_EQ_MINUS_INFINITY:
+ if (!Info::store_special)
+ return r;
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return special_set_boundary_infinity(type, x, info);
+ case V_GT:
+ open = true;
+ /* Fall through */
+ case V_GE:
+ case V_EQ:
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+ }
+ else {
+ switch (r) {
+ case V_LT_PLUS_INFINITY:
+ open = true;
+ /* Fall through */
+ case V_EQ_PLUS_INFINITY:
+ if (!Info::store_special)
+ return r;
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return special_set_boundary_infinity(type, x, info);
+ case V_LT:
+ open = true;
+ /* Fall through */
+ case V_LE:
+ case V_EQ:
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+ }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ PPL_ASSERT(to_type != type);
+ bool should_shrink;
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = !special_is_open(type, x, info);
+ if (type == LOWER)
+ return set_minus_infinity(to_type, to, to_info, should_shrink);
+ else
+ return set_plus_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = !normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ bool should_shrink = false) {
+ PPL_ASSERT(to_type == type);
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = (should_shrink || special_is_open(type, x, info));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (should_shrink || normal_is_open(type, x, info));
+ const bool check
+ = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ const Result r = assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ if (lt(type, x, info, to_type, to, to_info)) {
+ to_info.clear_boundary_properties(to_type);
+ return assign(to_type, to, to_info, type, x, info);
+ }
+ return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (lt(type1, x1, info1, type2, x2, info2))
+ return assign(to_type, to, to_info, type1, x1, info1);
+ else
+ return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ if (gt(type, x, info, to_type, to, to_info)) {
+ to_info.clear_boundary_properties(to_type);
+ return assign(to_type, to, to_info, type, x, info);
+ }
+ return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (gt(type1, x1, info1, type2, x2, info2))
+ return assign(to_type, to, to_info, type1, x1, info1);
+ else
+ return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ PPL_ASSERT(to_type != type);
+ bool should_shrink;
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = special_is_open(type, x, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ PPL_ASSERT(type1 == type2);
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ // FIXME: extended handling is not needed
+ Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ PPL_ASSERT(type1 != type2);
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ // FIXME: extended handling is not needed
+ Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+ // FIXME: extended handling is not needed
+ Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool should_shrink) {
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+ Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+ bool should_shrink;
+ if (x1s != 0) {
+ if (x2s != 0)
+ return mul_assign(to_type, to, to_info,
+ type1, x1, info1,
+ type2, x2, info2);
+ else
+ should_shrink = info2.get_boundary_property(type2, OPEN);
+ }
+ else {
+ should_shrink = (info1.get_boundary_property(type1, OPEN)
+ && (x2s != 0 || info2.get_boundary_property(type2, OPEN)));
+ }
+ return set_zero(to_type, to, to_info, should_shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = boundary_infinity_is_open(type1, info1);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = boundary_infinity_is_open(type2, info2);
+ return set_zero(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+ // FIXME: extended handling is not needed
+ Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+ Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+ if (x1s != 0) {
+ if (x2s != 0)
+ return div_assign(to_type, to, to_info,
+ type1, x1, info1,
+ type2, x2, info2);
+ else {
+ return set_boundary_infinity(to_type, to, to_info, true);
+ }
+ }
+ else {
+ bool should_shrink = info1.get_boundary_property(type1, OPEN)
+ && !is_boundary_infinity_closed(type2, x2, info2);
+ return set_zero(to_type, to, to_info, should_shrink);
+ }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+umod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ unsigned int exp) {
+ PPL_ASSERT(to_type == type);
+ bool should_shrink;
+ if (is_boundary_infinity(type, x, info)) {
+ should_shrink = boundary_infinity_is_open(type, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = umod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+smod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ unsigned int exp) {
+ PPL_ASSERT(to_type == type);
+ bool should_shrink;
+ if (is_boundary_infinity(type, x, info)) {
+ should_shrink = boundary_infinity_is_open(type, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = smod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Boundary_defs_hh)
diff --git a/src/Box.cc b/src/Box.cc
new file mode 100644
index 0000000..07ca2ab
--- /dev/null
+++ b/src/Box.cc
@@ -0,0 +1,63 @@
+/* Box class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Box_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Box_Helpers::extract_interval_constraint(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_only_var) {
+ // Check for preconditions.
+ PPL_ASSERT(c_num_vars == 0 && c_only_var == 0);
+
+ c_only_var = c.expression().first_nonzero(1, c.space_dimension() + 1);
+ if (c_only_var == c.space_dimension() + 1)
+ // All the inhomogeneous coefficients are zero.
+ return true;
+
+ ++c_num_vars;
+ --c_only_var;
+ return c.expression().all_zeroes(c_only_var + 2, c.space_dimension() + 1);
+}
+
+bool
+PPL::Box_Helpers::extract_interval_congruence(const Congruence& cg,
+ dimension_type& cg_num_vars,
+ dimension_type& cg_only_var) {
+ // Check for preconditions.
+ PPL_ASSERT(cg_num_vars == 0 && cg_only_var == 0);
+ // Only equality congruences can be intervals.
+ PPL_ASSERT(cg.is_equality());
+
+ cg_only_var = cg.expression().first_nonzero(1, cg.space_dimension() + 1);
+ if (cg_only_var == cg.space_dimension() + 1)
+ // All the inhomogeneous coefficients are zero.
+ return true;
+
+ ++cg_num_vars;
+ --cg_only_var;
+ return cg.expression().all_zeroes(cg_only_var + 2, cg.space_dimension() + 1);
+}
diff --git a/src/Box_Status_idefs.hh b/src/Box_Status_idefs.hh
new file mode 100644
index 0000000..8ec9fcd
--- /dev/null
+++ b/src/Box_Status_idefs.hh
@@ -0,0 +1,115 @@
+/* Box<ITV>::Status class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_Status_idefs_hh
+#define PPL_Box_Status_idefs_hh 1
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status_idefs.hh directly; use Box_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+ - <EM>empty</EM>: the box is the empty set.
+ - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+ \f$\Rset^n\f$.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+ //! By default Status is the empty set of assertion.
+ Status();
+
+ //! Ordinary copy constructor.
+ Status(const Status& y);
+
+ //! Copy constructor from a box of different type.
+ template <typename Other_ITV>
+ Status(const typename Box<Other_ITV>::Status& y);
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_empty_up_to_date() const;
+ void reset_empty_up_to_date();
+ void set_empty_up_to_date();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_universe() const;
+ void reset_universe();
+ void set_universe();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions.
+ //@{
+ static const flags_t NONE = 0U;
+ static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+ static const flags_t EMPTY = 1U << 1;
+ static const flags_t UNIVERSE = 1U << 2;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Box_Status_idefs_hh)
diff --git a/src/Box_Status_inlines.hh b/src/Box_Status_inlines.hh
new file mode 100644
index 0000000..84d89c3
--- /dev/null
+++ b/src/Box_Status_inlines.hh
@@ -0,0 +1,228 @@
+/* Box<ITV>::Status class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_Status_inlines_hh
+#define PPL_Box_Status_inlines_hh 1
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+ : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+ : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+ : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+ return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+ reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+ set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+ set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+ return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+ reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+ set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+ if (test_empty_up_to_date()
+ && test_empty()
+ && test_universe()) {
+#ifndef NDEBUG
+ std::cerr
+ << "The status asserts emptiness and universality at the same time."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::Boxes;
+ s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << separator
+ << (test_empty() ? yes : no) << empty << separator
+ << (test_universe() ? yes : no) << universe << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::Boxes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+ return false;
+ if (positive)
+ set_empty_up_to_date();
+
+ if (!get_field(s, Implementation::Boxes::empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, universe, positive))
+ return false;
+ if (positive)
+ set_universe();
+ else
+ reset_universe();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_Status_inlines_hh)
diff --git a/src/Box_defs.hh b/src/Box_defs.hh
new file mode 100644
index 0000000..2b83268
--- /dev/null
+++ b/src/Box_defs.hh
@@ -0,0 +1,2286 @@
+/* Box class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_defs_hh
+#define PPL_Box_defs_hh 1
+
+#include "Box_types.hh"
+#include "globals_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_types.hh"
+#include "Congruence_System_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Poly_Con_Relation_types.hh"
+#include "Poly_Gen_Relation_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "Partially_Reduced_Product_types.hh"
+#include "intervals_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+//! Swaps \p x with \p y.
+/*! \relates Box */
+template <typename ITV>
+void swap(Box<ITV>& x, Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+ Note that \p x and \p y may be dimension-incompatible boxes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same box.
+/*! \relates Box
+ Note that \p x and \p y may be dimension-incompatible boxes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+ Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+ typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x, const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+ A Box object represents the smash product of \f$n\f$
+ not necessarily closed and possibly unbounded intervals
+ represented by objects of class \p ITV,
+ where \f$n\f$ is the space dimension of the box.
+
+ An <EM>interval constraint</EM> (resp., <EM>interval congruence</EM>)
+ is a syntactic constraint (resp., congruence) that only mentions
+ a single space dimension.
+
+ The Box domain <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - the interval constraints that are optimally supported by
+ the template argument class \c ITV;
+ - the interval congruences that are optimally supported by
+ the template argument class \c ITV.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ The user interface for the Box domain is meant to be as similar
+ as possible to the one developed for the polyhedron class C_Polyhedron.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+ //! The type of intervals used to implement the box.
+ typedef ITV interval_type;
+
+ //! Returns the maximum space dimension that a Box can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns false indicating that this domain does not recycle constraints
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns false indicating that this domain does not recycle congruences
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds a universe or empty box of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the box;
+
+ \param kind
+ Specifies whether the universe or the empty box has to be built.
+ */
+ explicit Box(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Box(const Box& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename Other_ITV>
+ explicit Box(const Box<Other_ITV>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a box from the system of constraints \p cs.
+ /*!
+ The box inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref intervals "interval constraints"
+ are ignored (even though they may have contributed
+ to the space dimension).
+ */
+ explicit Box(const Constraint_System& cs);
+
+ //! Builds a box recycling a system of constraints \p cs.
+ /*!
+ The box inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref intervals "interval constraints"
+ are ignored (even though they may have contributed
+ to the space dimension).
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ Box(const Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a box from the system of generators \p gs.
+ /*!
+ Builds the smallest box containing the polyhedron defined by \p gs.
+ The box inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit Box(const Generator_System& gs);
+
+ //! Builds a box recycling the system of generators \p gs.
+ /*!
+ Builds the smallest box containing the polyhedron defined by \p gs.
+ The box inherits the space dimension of \p gs.
+
+ \param gs
+ The generator system describing the polyhedron to be approximated.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ Box(const Generator_System& gs, Recycle_Input dummy);
+
+ /*!
+ Builds the smallest box containing the grid defined by a
+ system of congruences \p cgs.
+ The box inherits the space dimension of \p cgs.
+
+ \param cgs
+ A system of congruences: congruences that are not
+ non-relational equality constraints are ignored
+ (though they may have contributed to the space dimension).
+ */
+ explicit Box(const Congruence_System& cgs);
+
+ /*!
+ Builds the smallest box containing the grid defined by a
+ system of congruences \p cgs, recycling \p cgs.
+ The box inherits the space dimension of \p cgs.
+
+ \param cgs
+ A system of congruences: congruences that are not
+ non-relational equality constraints are ignored
+ (though they will contribute to the space dimension).
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds a box containing the BDS \p bds.
+ /*!
+ Builds the smallest box containing \p bds using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ template <typename T>
+ explicit Box(const BD_Shape<T>& bds,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the octagonal shape \p oct.
+ /*!
+ Builds the smallest box containing \p oct using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ template <typename T>
+ explicit Box(const Octagonal_Shape<T>& oct,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the polyhedron \p ph.
+ /*!
+ Builds a box containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the built box is the
+ smallest one containing \p ph.
+ */
+ explicit Box(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a box containing the grid \p gr.
+ /*!
+ Builds the smallest box containing \p gr using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ explicit Box(const Grid& gr,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the partially reduced product \p dp.
+ /*!
+ Builds a box containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity.
+ */
+ template <typename D1, typename D2, typename R>
+ explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ Box& operator=(const Box& y);
+
+ /*! \brief
+ Swaps \p *this with \p y
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ void m_swap(Box& y);
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the Box
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns the relations holding between \p *this and the constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and the congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and the generator \p g.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool contains(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this satisfies
+ all its invariants.
+ */
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the Box
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the Box domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the box domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints to be added. They may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the box domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the box domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the box domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the box domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+ To avoid termination problems, each constraint in \p cs
+ will be used for a single refinement step.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \note
+ The user is warned that the accuracy of this refinement operator
+ depends on the order of evaluation of the constraints in \p cs,
+ which is in general unpredictable. If a fine control on such an
+ order is needed, the user should consider calling the method
+ <code>refine_with_constraint(const Constraint& c)</code> inside
+ an appropriate looping construct.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the constraint \p c for constraint propagation on \p *this.
+
+ \param c
+ The constraint to be used for constraint propagation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void propagate_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraints in \p cs for constraint propagation on \p *this.
+
+ \param cs
+ The constraints to be used for constraint propagation.
+
+ \param max_iterations
+ The maximum number of propagation steps for each constraint in
+ \p cs. If zero (the default), the number of propagation steps
+ will be unbounded, possibly resulting in an infinite loop.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ This method may lead to non-termination if \p max_iterations is 0.
+ */
+ void propagate_constraints(const Constraint_System& cs,
+ dimension_type max_iterations = 0);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest box containing the union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Box& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ void affine_form_image(Variable var,
+ const Linear_Form<ITV>& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Box& y);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system. When non-null,
+ the pointed-to constraint system is assumed to represent the
+ conditional or looping construct guard with respect to which
+ wrapping is performed. Since wrapping requires the computation
+ of upper bounds and due to non-distributivity of constraint
+ refinement over upper bounds, passing a constraint system in this
+ way can be more precise than refining the result of the wrapping
+ operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter which is ignored for the Box domain.
+
+ \param wrap_individually
+ A precision parameter which is ignored for the Box domain.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename T>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_widening_assign(const T& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator that points to the first stop-point.
+
+ \param last
+ An iterator that points one past the last stop-point.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename T, typename Iterator>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_widening_assign(const T& y,
+ Iterator first, Iterator last);
+
+ //! Same as CC76_widening_assign(y, tp).
+ void widening_assign(const Box& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened box.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const Box& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of restoring in \p y the constraints
+ of \p *this that were lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ A Box that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ As was the case for widening operators, the argument \p y is meant to
+ denote the value computed in the previous iteration step, whereas
+ \p *this denotes the value computed in the current iteration step
+ (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+ <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+ the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+ */
+ template <typename T>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_narrowing_assign(const T& y);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old box into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new
+ box, which is defined by a system of interval constraints in which the
+ variables running through the new dimensions are unconstrained.
+ For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the box
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the box and does not embed it in
+ the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the
+ new box, which is defined by a system of bounded differences in
+ which the variables running through the new dimensions are all
+ constrained to be equal to 0.
+ For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the box
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Seeing a box as a set of tuples (its points),
+ assigns to \p *this all the tuples that can be obtained by concatenating,
+ in the order given, a tuple of \p *this with a tuple of \p y.
+
+ Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+ corresponding, on entry, to \p *this and \p y, respectively.
+ Upon successful completion, \p *this will represent the box
+ \f$R \sseq \Rset^{n+m}\f$ such that
+ \f[
+ R \defeq
+ \Bigl\{\,
+ (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+ \Bigm|
+ (x_1, \ldots, x_n)^\transpose \in B,
+ (y_1, \ldots, y_m)^\transpose \in D
+ \,\Bigl\}.
+ \f]
+ Another way of seeing it is as follows: first increases the space
+ dimension of \p *this by adding \p y.space_dimension() new
+ dimensions; then adds to the system of constraints of \p *this a
+ renamed-apart version of the constraints of \p y.
+ */
+ void concatenate_assign(const Box& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty co-domain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the co-domain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ /*! \brief
+ Returns a reference the interval that bounds \p var.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ const ITV& get_interval(Variable var) const;
+
+ /*! \brief
+ Sets to \p i the interval that bounds \p var.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void set_interval(Variable var, const ITV& i);
+
+ /*! \brief
+ If the space dimension of \p var is unbounded below, return
+ <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+ \p n, \p d and \p closed accordingly.
+
+ \note
+ It is assumed that <CODE>*this</CODE> is a non-empty box
+ having space dimension greater than or equal to that of \p var.
+ An undefined behavior is obtained if this assumption is not met.
+ \if Include_Implementation_Details
+ To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+ (having space dimension greater than or equal to that of \p var)
+ such that <CODE>!marked_empty()</CODE> holds, then the method can be
+ called without incurring in undefined behavior: it will return
+ <EM>unspecified</EM> boundary values that, if queried systematically
+ on all space dimensions, will encode the box emptiness.
+ \endif
+
+ Let \f$I\f$ be the interval corresponding to variable \p var
+ in the non-empty box <CODE>*this</CODE>.
+ If \f$I\f$ is not bounded from below, simply return <CODE>false</CODE>
+ (leaving all other parameters unchanged).
+ Otherwise, set \p n, \p d and \p closed as follows:
+ - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+ that the fraction \f$n/d\f$ corresponds to the greatest lower bound
+ of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+ that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+ and if \f$n\f$ is zero then \f$d\f$ is one;
+ - \p closed is set to <CODE>true</CODE> if and only if the lower
+ boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+ */
+ bool has_lower_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+
+ /*! \brief
+ If the space dimension of \p var is unbounded above, return
+ <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+ \p n, \p d and \p closed accordingly.
+
+ \note
+ It is assumed that <CODE>*this</CODE> is a non-empty box
+ having space dimension greater than or equal to that of \p var.
+ An undefined behavior is obtained if this assumption is not met.
+ \if Include_Implementation_Details
+ To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+ (having space dimension greater than or equal to that of \p var)
+ such that <CODE>!marked_empty()</CODE> holds, then the method can be
+ called without incurring in undefined behavior: it will return
+ <EM>unspecified</EM> boundary values that, if queried systematically
+ on all space dimensions, will encode the box emptiness.
+ \endif
+
+ Let \f$I\f$ be the interval corresponding to variable \p var
+ in the non-empty box <CODE>*this</CODE>.
+ If \f$I\f$ is not bounded from above, simply return <CODE>false</CODE>
+ (leaving all other parameters unchanged).
+ Otherwise, set \p n, \p d and \p closed as follows:
+ - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+ that the fraction \f$n/d\f$ corresponds to the least upper bound
+ of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+ that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+ and if \f$n\f$ is zero then \f$d\f$ is one;
+ - \p closed is set to <CODE>true</CODE> if and only if the upper
+ boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+ */
+ bool has_upper_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+
+ //! Returns a system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of congruences approximating \p *this.
+ Congruence_System congruences() const;
+
+ //! Returns a minimized system of congruences approximating \p *this.
+ Congruence_System minimized_congruences() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If <CODE>x</CODE> and <CODE>y</CODE> are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool ascii_load(std::istream& s);
+
+private:
+ template <typename Other_ITV>
+ friend class Parma_Polyhedra_Library::Box;
+
+ friend bool
+ operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library
+ ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+ template <typename Specialization, typename Temp, typename To, typename I>
+ friend bool Parma_Polyhedra_Library::l_m_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+ //! The type of sequence used to implement the box.
+ typedef std::vector<ITV> Sequence;
+
+ /*! \brief
+ The type of intervals used by inner computations when trying to limit
+ the cumulative effect of approximation errors.
+ */
+ typedef ITV Tmp_Interval_Type;
+
+ //! A sequence of intervals, one for each dimension of the vector space.
+ Sequence seq;
+
+#define PPL_IN_Box_CLASS
+#include "Box_Status_idefs.hh"
+#undef PPL_IN_Box_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+public:
+ //! Causes the box to become empty, i.e., to represent the empty set.
+ void set_empty();
+
+private:
+ //! Marks \p *this as definitely not empty.
+ void set_nonempty();
+
+ //! Asserts the validity of the empty flag of \p *this.
+ void set_empty_up_to_date();
+
+ //! Invalidates empty flag of \p *this.
+ void reset_empty_up_to_date();
+
+ /*! \brief
+ Checks the hard way whether \p *this is an empty box:
+ returns <CODE>true</CODE> if and only if it is so.
+ */
+ bool check_empty() const;
+
+ /*! \brief
+ Returns a reference the interval that bounds
+ the box on the <CODE>k</CODE>-th space dimension.
+ */
+ const ITV& operator[](dimension_type k) const;
+
+ /*! \brief
+ WRITE ME.
+ */
+ static I_Result
+ refine_interval_no_check(ITV& itv,
+ Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void
+ add_interval_constraint_no_check(dimension_type var_id,
+ Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_constraints_no_check(const Constraint_System& cs);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_congruence_no_check(const Congruence& cg);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_congruences_no_check(const Congruence_System& cgs);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for the refinement.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for the refinement.
+ To avoid termination problems, each constraint in \p cs
+ will be used for a single refinement step.
+
+ \warning
+ If \p cs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint_System& cs);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ /*! \brief
+ Uses the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be added.
+ Nontrivial proper congruences are ignored.
+
+ \warning
+ If \p cgs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence_System& cgs);
+
+ /*! \brief
+ Propagates the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be propagated.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+
+ \warning
+ This method may lead to non-termination.
+
+ \if Include_Implementation_Details
+
+ For any expression \f$e\f$, we denote by
+ \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+ \right\downarrow\f$) the result of any computation that is
+ guaranteed to yield an upper (resp., lower) approximation of
+ \f$e\f$. So there exists \f$\epsilon \in \Rset\f$ with
+ \f$\epsilon \geq 0\f$ such that
+ \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+ If \f$\epsilon = 0\f$ we say that the computation of
+ \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+ we say it is <EM>inexact</EM> otherwise.
+ Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+ Consider a constraint of the general form
+ \f[
+ z + \sum_{i \in I}{a_ix_i} \relsym 0,
+ \f]
+ where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+ \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+ \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+ The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+ such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+ \f$a_i < 0\f$ if \f$i \in N\f$.
+ Suppose that, for each \f$i \in P \union N\f$ a variation interval
+ \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+ and the supremum of \f$\chi_i\f$ are denoted, respectively,
+ by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+ \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+ For each \f$k \in P\f$, we have
+ \f[
+ x_k
+ \relsym
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_ix_i}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_ix_i}
+ \Biggr).
+ \f]
+ Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+ we have
+ \f[
+ x_k
+ \geq
+ \Biggl\downarrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+ \Biggr)
+ \Biggr\downarrow
+ \f]
+ and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+ \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+ \f[
+ x_k
+ \leq
+ \Biggl\uparrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+ \Biggr)
+ \Biggl\uparrow.
+ \f]
+ In the first inequality, the relation is strict if
+ \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+ \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+ In the second inequality, the relation is strict if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+ \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+ For each \f$k \in N\f$, we have
+ \f[
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_ix_i}
+ - \sum_{i \in P}{a_ix_i}
+ \Biggr)
+ \relsym
+ x_k.
+ \f]
+ Thus, if
+ \f$\chi_i^\mathrm{l} \in \Rset\f$
+ for each \f$i \in N \setdiff \{ k \}\f$ and
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+ we have
+ \f[
+ \Biggl\uparrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+ - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+ \Biggr)
+ \Biggl\uparrow
+ \geq
+ x_k
+ \f]
+ and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+ and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+ \f[
+ \Biggl\downarrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+ - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+ \Biggr)
+ \Biggl\downarrow
+ \leq
+ x_k.
+ \f]
+ In the first inequality, the relation is strict if
+ \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+ \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+ In the second inequality, the relation is strict if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+ \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+ \endif
+ */
+ void propagate_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ Propagates the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be propagated.
+
+ \param max_iterations
+ The maximum number of propagation steps for each constraint in \p cs.
+ If zero, the number of propagation steps will be unbounded, possibly
+ resulting in an infinite loop.
+
+ \warning
+ If \p cs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+
+ \warning
+ This method may lead to non-termination if \p max_iterations is 0.
+ */
+ void propagate_constraints_no_check(const Constraint_System& cs,
+ dimension_type max_iterations);
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p *this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ /*! \brief
+ Adds to \p limiting_box the interval constraints in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_box(const Constraint_System& cs,
+ Box& limiting_box) const;
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const Box& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint_System& cs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence_System& cgs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns the relations holding between an interval and
+ an interval constraint.
+
+ \param i
+ The interval;
+
+ \param constraint_type
+ The constraint type;
+
+ \param numer
+ The numerator of the constraint bound;
+
+ \param denom
+ The denominator of the constraint bound
+
+ The interval constraint has the form
+ <CODE>denom * Variable(0) relsym numer</CODE>
+ where relsym is <CODE>==</CODE>, <CODE>></CODE> or <CODE>>=</CODE>
+ depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+ const Constraint::Type constraint_type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom = 1);
+
+class Box_Helpers {
+public:
+ // This is declared here so that Linear_Expression needs to be friend of
+ // Box_Helpers only, and doesn't need to be friend of this, too.
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as an interval constraint.
+ /*! \relates Box
+ \return
+ <CODE>true</CODE> if the constraint \p c is an
+ \ref intervals "interval constraint";
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0 and 1.
+
+ \param c_only_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the only variable having
+ a non-zero coefficient in \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_interval_constraint(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_only_var);
+
+ // This is declared here so that Linear_Expression needs to be friend of
+ // Box_Helpers only, and doesn't need to be friend of this, too.
+ static bool extract_interval_congruence(const Congruence& cg,
+ dimension_type& cg_num_vars,
+ dimension_type& cg_only_var);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Box_Status_inlines.hh"
+#include "Box_inlines.hh"
+#include "Box_templates.hh"
+
+#endif // !defined(PPL_Box_defs_hh)
diff --git a/src/Box_inlines.hh b/src/Box_inlines.hh
new file mode 100644
index 0000000..84aa99a
--- /dev/null
+++ b/src/Box_inlines.hh
@@ -0,0 +1,692 @@
+/* Box class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_inlines_hh
+#define PPL_Box_inlines_hh 1
+
+#include "Boundary_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "distances_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+ return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+ status.set_empty();
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+ status.reset_empty();
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+ return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+ : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+ seq = y.seq;
+ status = y.status;
+ return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::m_swap(Box& y) {
+ Box& x = *this;
+ using std::swap;
+ swap(x.seq, y.seq);
+ swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(cs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(gs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(cgs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+ return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline int32_t
+Box<ITV>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < seq.size());
+ return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+ if (space_dimension() < var.space_dimension())
+ throw_dimension_incompatible("get_interval(v)", "v", var);
+
+ if (is_empty()) {
+ static ITV empty_interval(EMPTY);
+ return empty_interval;
+ }
+
+ return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < var.space_dimension())
+ throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+ if (is_empty() && space_dim >= 2)
+ // If the box is empty, and has dimension >= 2, setting only one
+ // interval will not make it non-empty.
+ return;
+
+ seq[var.id()] = i;
+ reset_empty_up_to_date();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+ return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+ const Box& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+ const dimension_type m) {
+ const dimension_type space_dim = space_dimension();
+ // `var' should be one of the dimensions of the vector space.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // The space dimension of the resulting Box should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dim)
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // To expand the space dimension corresponding to variable `var',
+ // we append to the box `m' copies of the corresponding interval.
+ seq.insert(seq.end(), m, seq[var.id()]);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+ return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_lower_bound(const Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const {
+ // NOTE: assertion !is_empty() would be wrong;
+ // see the calls in method Box<ITV>::constraints().
+ PPL_ASSERT(!marked_empty());
+ const dimension_type k = var.id();
+ PPL_ASSERT(k < seq.size());
+ const ITV& seq_k = seq[k];
+
+ if (seq_k.lower_is_boundary_infinity())
+ return false;
+
+ closed = !seq_k.lower_is_open();
+
+ PPL_DIRTY_TEMP(mpq_class, lr);
+ assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+ n = lr.get_num();
+ d = lr.get_den();
+
+ return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_upper_bound(const Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const {
+ // NOTE: assertion !is_empty() would be wrong;
+ // see the calls in method Box<ITV>::constraints().
+ PPL_ASSERT(!marked_empty());
+ const dimension_type k = var.id();
+ PPL_ASSERT(k < seq.size());
+ const ITV& seq_k = seq[k];
+
+ if (seq_k.upper_is_boundary_infinity())
+ return false;
+
+ closed = !seq_k.upper_is_open();
+
+ PPL_DIRTY_TEMP(mpq_class, ur);
+ assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+ n = ur.get_num();
+ d = ur.get_den();
+
+ return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_constraints(cs)", cs);
+
+ add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+ if (cgs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", cgs);
+ add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+ CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+ // Only equalities can be congruences and these are already minimized.
+ return congruences();
+}
+
+template <typename ITV>
+inline I_Result
+Box<ITV>
+::refine_interval_no_check(ITV& itv,
+ const Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ PPL_ASSERT(denom != 0);
+ // The interval constraint is of the form
+ // `var + numer / denom rel 0',
+ // where `rel' is either the relation `==', `>=', or `>'.
+ // For the purpose of refining the interval, this is
+ // (morally) turned into `var rel -numer/denom'.
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ // Turn `numer/denom' into `-numer/denom'.
+ q = -q;
+
+ Relation_Symbol rel_sym;
+ switch (type) {
+ case Constraint::EQUALITY:
+ rel_sym = EQUAL;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ rel_sym = (denom > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ rel_sym = (denom > 0) ? GREATER_THAN : LESS_THAN;
+ break;
+ default:
+ // Silence compiler warning.
+ PPL_UNREACHABLE;
+ return I_ANY;
+ }
+ I_Result res = itv.add_constraint(i_constraint(rel_sym, q));
+ PPL_ASSERT(itv.OK());
+ return res;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>
+::add_interval_constraint_no_check(const dimension_type var_id,
+ const Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(var_id < space_dimension());
+ PPL_ASSERT(denom != 0);
+ refine_interval_no_check(seq[var_id], type, numer, denom);
+ // FIXME: do check the value returned and set `empty' and
+ // `empty_up_to_date' as appropriate.
+ // This has to be done after reimplementation of intervals.
+ reset_empty_up_to_date();
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("propagate_constraint(c)", c);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ propagate_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraints(const Constraint_System& cs,
+ const dimension_type max_iterations) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("propagate_constraints(cs)", cs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ propagate_constraints_no_check(cs, max_iterations);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+ const dimension_type var_id = var.id();
+ // Dimension-compatibility check.
+ if (space_dimension() < var_id + 1)
+ throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ // Here the box might still be empty (but we haven't detected it yet):
+ // check emptiness of the interval for `var' before cylindrification.
+ ITV& seq_var = seq[var_id];
+ if (seq_var.is_empty())
+ set_empty();
+ else
+ seq_var.assign(UNIVERSE);
+
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename ITV>
+inline void
+swap(Box<ITV>& x, Box<ITV>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_inlines_hh)
diff --git a/src/Box_templates.hh b/src/Box_templates.hh
new file mode 100644
index 0000000..227dd65
--- /dev/null
+++ b/src/Box_templates.hh
@@ -0,0 +1,4295 @@
+/* Box class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_templates_hh
+#define PPL_Box_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "BD_Shape_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Rational_Interval.hh"
+#include <vector>
+#include <map>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+ : seq(check_space_dimension_overflow(num_dimensions,
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // In a box that is marked empty the intervals are completely
+ // meaningless: we exploit this by avoiding their initialization.
+ if (kind == UNIVERSE) {
+ for (dimension_type i = num_dimensions; i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ set_empty_up_to_date();
+ }
+ else
+ set_empty();
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+ : seq(check_space_dimension_overflow(cs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(cs)",
+ "cs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // FIXME: check whether we can avoid the double initialization.
+ for (dimension_type i = cs.space_dimension(); i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+ : seq(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(cgs)",
+ "cgs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // FIXME: check whether we can avoid the double initialization.
+ for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+ : seq(y.space_dimension()),
+ // FIXME: why the following does not work?
+ // status(y.status) {
+ status() {
+ // FIXME: remove when the above is fixed.
+ if (y.marked_empty())
+ set_empty();
+
+ if (!y.marked_empty())
+ for (dimension_type k = y.space_dimension(); k-- > 0; )
+ seq[k].assign(y.seq[k]);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+ : seq(check_space_dimension_overflow(gs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(gs)",
+ "gs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty box.
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ PPL_DIRTY_TEMP(mpq_class, q);
+ bool point_seen = false;
+ // Going through all the points.
+ for (Generator_System::const_iterator
+ gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ if (g.is_point()) {
+ const Coefficient& d = g.divisor();
+ if (point_seen) {
+ // This is not the first point: `seq' already contains valid values.
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ PPL_DIRTY_TEMP(ITV, iq);
+ iq.build(i_constraint(EQUAL, q));
+ seq[i].join_assign(iq);
+ }
+ }
+ else {
+ // This is the first point seen: initialize `seq'.
+ point_seen = true;
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ seq[i].build(i_constraint(EQUAL, q));
+ }
+ }
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines, rays and closure points.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::LINE:
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end();
+ i != i_end; ++i)
+ seq[i.variable().id()].assign(UNIVERSE);
+ break;
+ case Generator::RAY:
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end();
+ i != i_end; ++i)
+ switch (sgn(*i)) {
+ case 1:
+ seq[i.variable().id()].upper_extend();
+ break;
+ case -1:
+ seq[i.variable().id()].lower_extend();
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ break;
+ case Generator::CLOSURE_POINT:
+ {
+ const Coefficient& d = g.divisor();
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ ITV& seq_i = seq[i];
+ seq_i.lower_extend(i_constraint(GREATER_THAN, q));
+ seq_i.upper_extend(i_constraint(LESS_THAN, q));
+ }
+ }
+ break;
+ default:
+ // Points already dealt with.
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+ : seq(check_space_dimension_overflow(bds.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(bds)",
+ "bds exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // Expose all the interval constraints.
+ bds.shortest_path_closure_assign();
+ if (bds.marked_empty()) {
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ typedef typename BD_Shape<T>::coefficient_type Coeff;
+ PPL_DIRTY_TEMP(Coeff, tmp);
+ const DB_Row<Coeff>& dbm_0 = bds.dbm[0];
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ I_Constraint<Coeff> lower;
+ I_Constraint<Coeff> upper;
+ ITV& seq_i = seq[i];
+
+ // Set the upper bound.
+ const Coeff& u = dbm_0[i+1];
+ if (!is_plus_infinity(u))
+ upper.set(LESS_OR_EQUAL, u, true);
+
+ // Set the lower bound.
+ const Coeff& negated_l = bds.dbm[i+1][0];
+ if (!is_plus_infinity(negated_l)) {
+ neg_assign_r(tmp, negated_l, ROUND_DOWN);
+ lower.set(GREATER_OR_EQUAL, tmp);
+ }
+
+ seq_i.build(lower, upper);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+ : seq(check_space_dimension_overflow(oct.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(oct)",
+ "oct exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // Expose all the interval constraints.
+ oct.strong_closure_assign();
+ if (oct.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return;
+
+ PPL_DIRTY_TEMP(mpq_class, lower_bound);
+ PPL_DIRTY_TEMP(mpq_class, upper_bound);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ typedef typename Octagonal_Shape<T>::coefficient_type Coeff;
+ I_Constraint<mpq_class> lower;
+ I_Constraint<mpq_class> upper;
+ ITV& seq_i = seq[i];
+ const dimension_type ii = 2*i;
+ const dimension_type cii = ii + 1;
+
+ // Set the upper bound.
+ const Coeff& twice_ub = oct.matrix[cii][ii];
+ if (!is_plus_infinity(twice_ub)) {
+ assign_r(upper_bound, twice_ub, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_NOT_NEEDED);
+ upper.set(LESS_OR_EQUAL, upper_bound);
+ }
+
+ // Set the lower bound.
+ const Coeff& twice_lb = oct.matrix[ii][cii];
+ if (!is_plus_infinity(twice_lb)) {
+ assign_r(lower_bound, twice_lb, ROUND_NOT_NEEDED);
+ neg_assign_r(lower_bound, lower_bound, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lower_bound, lower_bound, 1, ROUND_NOT_NEEDED);
+ lower.set(GREATER_OR_EQUAL, lower_bound);
+ }
+ seq_i.build(lower, upper);
+ }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+ : seq(check_space_dimension_overflow(ph.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(ph)",
+ "ph exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ // We do not need to bother about `complexity' if:
+ // a) the polyhedron is already marked empty; or ...
+ if (ph.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // b) the polyhedron is zero-dimensional; or ...
+ const dimension_type space_dim = ph.space_dimension();
+ if (space_dim == 0)
+ return;
+
+ // c) the polyhedron is already described by a generator system.
+ if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+ Box tmp(ph.generators());
+ m_swap(tmp);
+ return;
+ }
+
+ // Here generators are not up-to-date or there are pending constraints.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (complexity == POLYNOMIAL_COMPLEXITY) {
+ // FIXME: is there a way to avoid this initialization?
+ for (dimension_type i = space_dim; i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ // Get a simplified version of the constraints.
+ const Constraint_System cs = ph.simplified_constraints();
+ // Propagate easy-to-find bounds from the constraints,
+ // allowing for a limited number of iterations.
+ // FIXME: 20 is just a wild guess.
+ const dimension_type max_iterations = 20;
+ propagate_constraints_no_check(cs, max_iterations);
+ }
+ else if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(space_dim);
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ const Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ set_empty();
+ return;
+ }
+ // Get all the bounds for the space dimensions.
+ Generator g(point());
+ PPL_DIRTY_TEMP(mpq_class, lower_bound);
+ PPL_DIRTY_TEMP(mpq_class, upper_bound);
+ PPL_DIRTY_TEMP(Coefficient, bound_numer);
+ PPL_DIRTY_TEMP(Coefficient, bound_denom);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ I_Constraint<mpq_class> lower;
+ I_Constraint<mpq_class> upper;
+ ITV& seq_i = seq[i];
+ lp.set_objective_function(Variable(i));
+ // Evaluate upper bound.
+ lp.set_optimization_mode(MAXIMIZATION);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, bound_numer, bound_denom);
+ assign_r(upper_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(upper_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ PPL_ASSERT(is_canonical(upper_bound));
+ upper.set(LESS_OR_EQUAL, upper_bound);
+ }
+ // Evaluate optimal lower bound.
+ lp.set_optimization_mode(MINIMIZATION);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, bound_numer, bound_denom);
+ assign_r(lower_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(lower_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ PPL_ASSERT(is_canonical(lower_bound));
+ lower.set(GREATER_OR_EQUAL, lower_bound);
+ }
+ seq_i.build(lower, upper);
+ }
+ }
+ else {
+ PPL_ASSERT(complexity == ANY_COMPLEXITY);
+ if (ph.is_empty())
+ set_empty();
+ else {
+ Box tmp(ph.generators());
+ m_swap(tmp);
+ }
+ }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+ : seq(check_space_dimension_overflow(gr.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(gr)",
+ "gr exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+
+ if (gr.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = gr.space_dimension();
+
+ if (space_dim == 0)
+ return;
+
+ if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
+ // Updating found the grid empty.
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(!gr.gen_sys.empty());
+
+ // For each dimension that is bounded by the grid, set both bounds
+ // of the interval to the value of the associated coefficient in a
+ // generator point.
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ PPL_DIRTY_TEMP(Coefficient, bound_numer);
+ PPL_DIRTY_TEMP(Coefficient, bound_denom);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ ITV& seq_i = seq[i];
+ Variable var(i);
+ bool max;
+ if (gr.maximize(var, bound_numer, bound_denom, max)) {
+ assign_r(bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ bound.canonicalize();
+ seq_i.build(i_constraint(EQUAL, bound));
+ }
+ else
+ seq_i.assign(UNIVERSE);
+ }
+}
+
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+ Complexity_Class complexity)
+ : seq(), status() {
+ check_space_dimension_overflow(dp.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(dp)",
+ "dp exceeds the maximum "
+ "allowed space dimension");
+ Box tmp1(dp.domain1(), complexity);
+ Box tmp2(dp.domain2(), complexity);
+ tmp1.intersection_assign(tmp2);
+ m_swap(tmp1);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "add_space_dimensions_and_embed(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+ // To embed an n-dimension space box in a (n+m)-dimension space,
+ // we just add `m' new universe elements to the sequence.
+ seq.insert(seq.end(), m, ITV(UNIVERSE));
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "add_space_dimensions_and_project(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+ // Add `m' new zero elements to the sequence.
+ seq.insert(seq.end(), m, ITV(0));
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+ const dimension_type x_space_dim = x.space_dimension();
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ if (x.is_empty())
+ return y.is_empty();
+
+ if (y.is_empty())
+ return x.is_empty();
+
+ for (dimension_type k = x_space_dim; k-- > 0; )
+ if (x.seq[k] != y.seq[k])
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+ // `expr' should be dimension-compatible with `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+ // A zero-dimensional or empty Box bounds everything.
+ if (space_dim == 0 || is_empty())
+ return true;
+
+ const int from_above_sign = from_above ? 1 : -1;
+ // TODO: This loop can be optimized more, if needed, exploiting the
+ // (possible) sparseness of expr.
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ const Variable v = i.variable();
+ switch (sgn(*i) * from_above_sign) {
+ case 1:
+ if (seq[v.id()].upper_is_boundary_infinity())
+ return false;
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (seq[v.id()].lower_is_boundary_infinity())
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+ const Constraint::Type constraint_type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+
+ if (i.is_universe())
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ assign_r(bound.get_num(), numer, ROUND_NOT_NEEDED);
+ assign_r(bound.get_den(), denom, ROUND_NOT_NEEDED);
+ bound.canonicalize();
+ neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+ const bool is_lower_bound = (denom > 0);
+
+ PPL_DIRTY_TEMP(mpq_class, bound_diff);
+ if (constraint_type == Constraint::EQUALITY) {
+ if (i.lower_is_boundary_infinity()) {
+ PPL_ASSERT(!i.upper_is_boundary_infinity());
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ return i.upper_is_open()
+ ? Poly_Con_Relation::is_disjoint()
+ : Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (i.lower_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+
+ PPL_ASSERT(constraint_type != Constraint::EQUALITY);
+ if (is_lower_bound) {
+ if (i.lower_is_boundary_infinity()) {
+ PPL_ASSERT(!i.upper_is_boundary_infinity());
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+ || i.lower_is_open()) {
+ Poly_Con_Relation result = Poly_Con_Relation::is_included();
+ if (i.is_singleton())
+ result = result && Poly_Con_Relation::saturates();
+ return result;
+ }
+ else {
+ PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+ && !i.lower_is_open());
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ case -1:
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+ else {
+ // `c' is an upper bound.
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case -1:
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+ || i.upper_is_open()) {
+ Poly_Con_Relation result = Poly_Con_Relation::is_included();
+ if (i.is_singleton())
+ result = result && Poly_Con_Relation::saturates();
+ return result;
+ }
+ else {
+ PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+ && !i.upper_is_open());
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ case 1:
+ if (i.lower_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.lower_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case 1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+
+ // Quiet a compiler warning: this program point is unreachable.
+ PPL_UNREACHABLE;
+ return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ if (is_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ if (cg.is_equality()) {
+ const Constraint c(cg);
+ return relation_with(c);
+ }
+
+ PPL_DIRTY_TEMP(Rational_Interval, r);
+ PPL_DIRTY_TEMP(Rational_Interval, t);
+ PPL_DIRTY_TEMP(mpq_class, m);
+ r = 0;
+ for (Congruence::expr_type::const_iterator i = cg.expression().begin(),
+ i_end = cg.expression().end(); i != i_end; ++i) {
+ const Coefficient& cg_i = *i;
+ const Variable v = i.variable();
+ assign_r(m, cg_i, ROUND_NOT_NEEDED);
+ // FIXME: an add_mul_assign() method would come handy here.
+ t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+ t *= m;
+ r += t;
+ }
+
+ if (r.lower_is_boundary_infinity() || r.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+
+
+ // Find the value that satisfies the congruence and is
+ // nearest to the lower bound such that the point lies on or above it.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lower);
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ PPL_DIRTY_TEMP_COEFFICIENT(v);
+ mod = cg.modulus();
+ v = cg.inhomogeneous_term() % mod;
+ assign_r(lower, r.lower(), ROUND_DOWN);
+ v -= ((lower / mod) * mod);
+ if (v + lower > 0)
+ v -= mod;
+ return interval_relation(r, Constraint::EQUALITY, v);
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+ const dimension_type c_space_dim = c.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ if (is_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+
+ if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ if (c_num_vars == 0)
+ // c is a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ return Poly_Con_Relation::is_included();
+ }
+ else {
+ // c is an interval constraint.
+ return interval_relation(seq[c_only_var],
+ c.type(),
+ c.inhomogeneous_term(),
+ c.coefficient(Variable(c_only_var)));
+ }
+ else {
+ // Deal with a non-trivial and non-interval constraint.
+ PPL_DIRTY_TEMP(Rational_Interval, r);
+ PPL_DIRTY_TEMP(Rational_Interval, t);
+ PPL_DIRTY_TEMP(mpq_class, m);
+ r = 0;
+ const Constraint::expr_type& e = c.expression();
+ for (Constraint::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i) {
+ assign_r(m, *i, ROUND_NOT_NEEDED);
+ const Variable v = i.variable();
+ // FIXME: an add_mul_assign() method would come handy here.
+ t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+ t *= m;
+ r += t;
+ }
+ return interval_relation(r,
+ c.type(),
+ c.inhomogeneous_term());
+ }
+
+ // Quiet a compiler warning: this program point is unreachable.
+ PPL_UNREACHABLE;
+ return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+ const dimension_type space_dim = space_dimension();
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ // The empty box cannot subsume a generator.
+ if (is_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe box in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ if (g.is_line_or_ray()) {
+ if (g.is_line()) {
+ const Generator::expr_type& e = g.expression();
+ for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i)
+ if (!seq[i.variable().id()].is_universe())
+ return Poly_Gen_Relation::nothing();
+ return Poly_Gen_Relation::subsumes();
+ }
+ else {
+ PPL_ASSERT(g.is_ray());
+ const Generator::expr_type& e = g.expression();
+ for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i) {
+ const Variable v = i.variable();
+ switch (sgn(*i)) {
+ case 1:
+ if (!seq[v.id()].upper_is_boundary_infinity())
+ return Poly_Gen_Relation::nothing();
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (!seq[v.id()].lower_is_boundary_infinity())
+ return Poly_Gen_Relation::nothing();
+ break;
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+ }
+ }
+
+ // Here `g' is a point or closure point.
+ const Coefficient& g_divisor = g.divisor();
+ PPL_DIRTY_TEMP(mpq_class, g_coord);
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = g_space_dim; i-- > 0; ) {
+ const ITV& seq_i = seq[i];
+ if (seq_i.is_universe())
+ continue;
+ assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+ g_coord.canonicalize();
+ // Check lower bound.
+ if (!seq_i.lower_is_boundary_infinity()) {
+ assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+ if (g_coord <= bound) {
+ if (seq_i.lower_is_open()) {
+ if (g.is_point() || g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ // Check upper bound.
+ if (!seq_i.upper_is_boundary_infinity()) {
+ assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+ if (g_coord >= bound) {
+ if (seq_i.upper_is_open()) {
+ if (g.is_point() || g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+}
+
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // `expr' should be dimension-compatible with `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim Box first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ // For an empty Box we simply return false.
+ if (is_empty())
+ return false;
+
+ PPL_DIRTY_TEMP(mpq_class, result);
+ assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ bool is_included = true;
+ const int maximize_sign = maximize ? 1 : -1;
+ PPL_DIRTY_TEMP(mpq_class, bound_i);
+ PPL_DIRTY_TEMP(mpq_class, expr_i);
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ const ITV& seq_i = seq[i.variable().id()];
+ assign_r(expr_i, *i, ROUND_NOT_NEEDED);
+ switch (sgn(expr_i) * maximize_sign) {
+ case 1:
+ if (seq_i.upper_is_boundary_infinity())
+ return false;
+ assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+ add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+ if (seq_i.upper_is_open())
+ is_included = false;
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (seq_i.lower_is_boundary_infinity())
+ return false;
+ assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+ add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+ if (seq_i.lower_is_open())
+ is_included = false;
+ break;
+ }
+ }
+ // Extract output info.
+ PPL_ASSERT(is_canonical(result));
+ ext_n = result.get_num();
+ ext_d = result.get_den();
+ included = is_included;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included,
+ Generator& g) const {
+ if (!max_min(expr, maximize, ext_n, ext_d, included))
+ return false;
+
+ // Compute generator `g'.
+ Linear_Expression g_expr;
+ PPL_DIRTY_TEMP(Coefficient, g_divisor);
+ g_divisor = 1;
+ const int maximize_sign = maximize ? 1 : -1;
+ PPL_DIRTY_TEMP(mpq_class, g_coord);
+ PPL_DIRTY_TEMP(Coefficient, numer);
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ PPL_DIRTY_TEMP(Coefficient, lcm);
+ PPL_DIRTY_TEMP(Coefficient, factor);
+ // TODO: Check if the following loop can be optimized to exploit the
+ // (possible) sparseness of expr.
+ for (dimension_type i = space_dimension(); i-- > 0; ) {
+ const ITV& seq_i = seq[i];
+ switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+ case 1:
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ break;
+ case 0:
+ // If 0 belongs to the interval, choose it
+ // (and directly proceed to the next iteration).
+ // FIXME: name qualification issue.
+ if (seq_i.contains(0))
+ continue;
+ if (!seq_i.lower_is_boundary_infinity())
+ if (seq_i.lower_is_open())
+ if (!seq_i.upper_is_boundary_infinity())
+ if (seq_i.upper_is_open()) {
+ // Bounded and open interval: compute middle point.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(mpq_class, q_seq_i_upper);
+ assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+ g_coord += q_seq_i_upper;
+ g_coord /= 2;
+ }
+ else
+ // The upper bound is in the interval.
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ else {
+ // Lower is open, upper is unbounded.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ ++g_coord;
+ }
+ else
+ // The lower bound is in the interval.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ else {
+ // Lower is unbounded, hence upper is bounded
+ // (since we know that 0 does not belong to the interval).
+ PPL_ASSERT(!seq_i.upper_is_boundary_infinity());
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ if (seq_i.upper_is_open())
+ --g_coord;
+ }
+ break;
+ case -1:
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ break;
+ }
+ // Add g_coord * Variable(i) to the generator.
+ assign_r(denom, g_coord.get_den(), ROUND_NOT_NEEDED);
+ lcm_assign(lcm, g_divisor, denom);
+ exact_div_assign(factor, lcm, g_divisor);
+ g_expr *= factor;
+ exact_div_assign(factor, lcm, denom);
+ assign_r(numer, g_coord.get_num(), ROUND_NOT_NEEDED);
+ numer *= factor;
+ g_expr += numer * Variable(i);
+ g_divisor = lcm;
+ }
+ g = Generator::point(g_expr, g_divisor);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+ const Box& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("contains(y)", y);
+
+ // If `y' is empty, then `x' contains `y'.
+ if (y.is_empty())
+ return true;
+
+ // If `x' is empty, then `x' cannot contain `y'.
+ if (x.is_empty())
+ return false;
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ // FIXME: fix this name qualification issue.
+ if (!x.seq[k].contains(y.seq[k]))
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+ const Box& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If any of `x' or `y' is marked empty, then they are disjoint.
+ // Note: no need to use `is_empty', as the following loop is anyway correct.
+ if (x.marked_empty() || y.marked_empty())
+ return true;
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ // FIXME: fix this name qualification issue.
+ if (x.seq[k].is_disjoint_from(y.seq[k]))
+ return true;
+ return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+ Box& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+ // The lub of a box with an empty box is equal to the first box.
+ if (y.is_empty())
+ return true;
+ if (x.is_empty()) {
+ x = y;
+ return true;
+ }
+
+ bool x_j_does_not_contain_y_j = false;
+ bool y_j_does_not_contain_x_j = false;
+
+ for (dimension_type i = x.seq.size(); i-- > 0; ) {
+ const ITV& x_seq_i = x.seq[i];
+ const ITV& y_seq_i = y.seq[i];
+
+ if (!x_seq_i.can_be_exactly_joined_to(y_seq_i))
+ return false;
+
+ // Note: the use of `y_i_does_not_contain_x_i' is needed
+ // because we want to temporarily preserve the old value
+ // of `y_j_does_not_contain_x_j'.
+ bool y_i_does_not_contain_x_i = !y_seq_i.contains(x_seq_i);
+ if (y_i_does_not_contain_x_i && x_j_does_not_contain_y_j)
+ return false;
+ if (!x_seq_i.contains(y_seq_i)) {
+ if (y_j_does_not_contain_x_j)
+ return false;
+ else
+ x_j_does_not_contain_y_j = true;
+ }
+ if (y_i_does_not_contain_x_i)
+ y_j_does_not_contain_x_j = true;
+ }
+
+ // The upper bound is exact: compute it into *this.
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ x.seq[k].join_assign(y.seq[k]);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+ if (status.test_empty_up_to_date() && !status.test_empty()) {
+ Box tmp = *this;
+ tmp.reset_empty_up_to_date();
+ if (tmp.check_empty()) {
+#ifndef NDEBUG
+ std::cerr << "The box is empty, but it is marked as non-empty."
+ << std::endl;
+#endif // NDEBUG
+ return false;
+ }
+ }
+
+ // A box that is not marked empty must have meaningful intervals.
+ if (!marked_empty()) {
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].OK())
+ return false;
+ }
+
+ return true;
+}
+
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+ dimension_type d = space_dimension();
+ // A zero-space-dim box always has affine dimension zero.
+ if (d == 0)
+ return 0;
+
+ // An empty box has affine dimension zero.
+ if (is_empty())
+ return 0;
+
+ for (dimension_type k = d; k-- > 0; )
+ if (seq[k].is_singleton())
+ --d;
+
+ return d;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+ PPL_ASSERT(!marked_empty());
+ Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (seq[k].is_empty()) {
+ x.set_empty();
+ return true;
+ }
+ x.set_nonempty();
+ return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+ if (marked_empty())
+ return false;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_universe())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+ if (ITV::is_always_topologically_closed() || is_empty())
+ return true;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_topologically_closed())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+ if (is_empty())
+ return true;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_singleton())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+ if (is_empty())
+ return true;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_bounded())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+ if (marked_empty())
+ return false;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].contains_integer_point())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ // For an empty Box, we simply return false.
+ if (is_empty())
+ return false;
+
+ // The Box has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+ Coefficient c = expr.inhomogeneous_term();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ for (Linear_Expression::const_iterator i = expr.begin(), i_end = expr.end();
+ i != i_end; ++i) {
+ const ITV& seq_i = seq[i.variable().id()];
+ // Check if `v' is constant in the BD shape.
+ if (seq_i.is_singleton()) {
+ // If `v' is constant, replace it in `le' by the value.
+ assign_r(tmp, seq_i.lower(), ROUND_NOT_NEEDED);
+ numer = tmp.get_num();
+ denom = tmp.get_den();
+ c *= denom;
+ c += numer * val_denom * (*i);
+ val_denom *= denom;
+ continue;
+ }
+ // The expression `expr' is not constant.
+ return false;
+ }
+
+ // The expression `expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(c, val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ if (marked_empty() || !seq[var_space_dim-1].is_universe())
+ return true;
+ // Now force an emptiness check.
+ return is_empty();
+}
+
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case also captures the only legal cylindrification
+ // of a box in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ // Here the box might still be empty (but we haven't detected it yet):
+ // check emptiness of the interval for each of the variables in
+ // `vars' before cylindrification.
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+ ITV& seq_vsi = seq[*vsi];
+ if (!seq_vsi.is_empty())
+ seq_vsi.assign(UNIVERSE);
+ else {
+ set_empty();
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+ if (ITV::is_always_topologically_closed() || is_empty())
+ return;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ seq[k].topological_closure_assign();
+}
+
+template <typename ITV>
+void
+Box<ITV>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+#if 0 // Generic implementation commented out.
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "Box");
+#else // Specialized implementation.
+ PPL_USED(wrap_individually);
+ PPL_USED(complexity_threshold);
+ Box& x = *this;
+
+ // Dimension-compatibility check for `*cs_p', if any.
+ const dimension_type vars_space_dim = vars.space_dimension();
+ if (cs_p != 0 && cs_p->space_dimension() > vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Box<ITV>::wrap_assign(vars, w, r, o, cs_p, ...):"
+ << std::endl
+ << "vars.space_dimension() == " << vars_space_dim
+ << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping no variable only requires refining with *cs_p, if any.
+ if (vars.empty()) {
+ if (cs_p != 0)
+ refine_with_constraints(*cs_p);
+ return;
+ }
+
+ // Dimension-compatibility check for `vars'.
+ const dimension_type space_dim = x.space_dimension();
+ if (space_dim < vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Box<ITV>::wrap_assign(vars, ...):"
+ << std::endl
+ << "this->space_dimension() == " << space_dim
+ << ", required space dimension == " << vars_space_dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping an empty polyhedron is a no-op.
+ if (x.is_empty())
+ return;
+
+ // FIXME: temporarily (ab-) using Coefficient.
+ // Set `min_value' and `max_value' to the minimum and maximum values
+ // a variable of width `w' and signedness `s' can take.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ if (r == UNSIGNED) {
+ min_value = 0;
+ mul_2exp_assign(max_value, Coefficient_one(), w);
+ --max_value;
+ }
+ else {
+ PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+ mul_2exp_assign(max_value, Coefficient_one(), w-1);
+ neg_assign(min_value, max_value);
+ --max_value;
+ }
+
+ // FIXME: Build the (integer) quadrant interval.
+ PPL_DIRTY_TEMP(ITV, integer_quadrant_itv);
+ PPL_DIRTY_TEMP(ITV, rational_quadrant_itv);
+ {
+ I_Constraint<Coefficient> lower = i_constraint(GREATER_OR_EQUAL, min_value);
+ I_Constraint<Coefficient> upper = i_constraint(LESS_OR_EQUAL, max_value);
+ integer_quadrant_itv.build(lower, upper);
+ // The rational quadrant is only needed if overflow is undefined.
+ if (o == OVERFLOW_UNDEFINED) {
+ ++max_value;
+ upper = i_constraint(LESS_THAN, max_value);
+ rational_quadrant_itv.build(lower, upper);
+ }
+ }
+
+ const Variables_Set::const_iterator vs_end = vars.end();
+
+ if (cs_p == 0) {
+ // No constraint refinement is needed here.
+ switch (o) {
+ case OVERFLOW_WRAPS:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+ x.seq[*i].wrap_assign(w, r, integer_quadrant_itv);
+ reset_empty_up_to_date();
+ break;
+ case OVERFLOW_UNDEFINED:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+ ITV& x_seq_v = x.seq[*i];
+ if (!rational_quadrant_itv.contains(x_seq_v)) {
+ x_seq_v.assign(integer_quadrant_itv);
+ }
+ }
+ break;
+ case OVERFLOW_IMPOSSIBLE:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+ x.seq[*i].intersect_assign(integer_quadrant_itv);
+ reset_empty_up_to_date();
+ break;
+ }
+ PPL_ASSERT(x.OK());
+ return;
+ }
+
+ PPL_ASSERT(cs_p != 0);
+ const Constraint_System& cs = *cs_p;
+ // A map associating interval constraints to variable indexes.
+ typedef std::map<dimension_type, std::vector<const Constraint*> > map_type;
+ map_type var_cs_map;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ i_end = cs.end(); i != i_end; ++i) {
+ const Constraint& c = *i;
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+ if (c_num_vars == 1) {
+ // An interval constraint on variable index `c_only_var'.
+ PPL_ASSERT(c_only_var < space_dim);
+ // We do care about c if c_only_var is going to be wrapped.
+ if (vars.find(c_only_var) != vs_end)
+ var_cs_map[c_only_var].push_back(&c);
+ }
+ else {
+ PPL_ASSERT(c_num_vars == 0);
+ // Note: tautologies have been filtered out by iterators.
+ PPL_ASSERT(c.is_inconsistent());
+ x.set_empty();
+ return;
+ }
+ }
+ }
+
+ PPL_DIRTY_TEMP(ITV, refinement_itv);
+ const map_type::const_iterator var_cs_map_end = var_cs_map.end();
+ // Loop through the variable indexes in `vars'.
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+ const dimension_type v = *i;
+ refinement_itv = integer_quadrant_itv;
+ // Look for the refinement constraints for space dimension index `v'.
+ map_type::const_iterator var_cs_map_iter = var_cs_map.find(v);
+ if (var_cs_map_iter != var_cs_map_end) {
+ // Refine interval for variable `v'.
+ const map_type::mapped_type& var_cs = var_cs_map_iter->second;
+ for (dimension_type j = var_cs.size(); j-- > 0; ) {
+ const Constraint& c = *var_cs[j];
+ refine_interval_no_check(refinement_itv,
+ c.type(),
+ c.inhomogeneous_term(),
+ c.coefficient(Variable(v)));
+ }
+ }
+ // Wrap space dimension index `v'.
+ ITV& x_seq_v = x.seq[v];
+ switch (o) {
+ case OVERFLOW_WRAPS:
+ x_seq_v.wrap_assign(w, r, refinement_itv);
+ break;
+ case OVERFLOW_UNDEFINED:
+ if (!rational_quadrant_itv.contains(x_seq_v))
+ x_seq_v.assign(UNIVERSE);
+ break;
+ case OVERFLOW_IMPOSSIBLE:
+ x_seq_v.intersect_assign(refinement_itv);
+ break;
+ }
+ }
+ PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+ && !ITV::info_type::store_open)
+ return;
+
+ if (marked_empty())
+ return;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ seq[k].drop_some_non_integer_points();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+ && !ITV::info_type::store_open)
+ return;
+
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator v_i = vars.begin(),
+ v_end = vars.end(); v_i != v_end; ++v_i)
+ seq[*v_i].drop_some_non_integer_points();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ x.throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two boxes is empty, the intersection is empty.
+ if (x.marked_empty())
+ return;
+ if (y.marked_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ // If both boxes are zero-dimensional, then at this point they are
+ // necessarily non-empty, so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // FIXME: here we may conditionally exploit a capability of the
+ // underlying interval to eagerly detect empty results.
+ reset_empty_up_to_date();
+
+ for (dimension_type k = space_dim; k-- > 0; )
+ x.seq[k].intersect_assign(y.seq[k]);
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::upper_bound_assign(const Box& y) {
+ Box& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The lub of a box with an empty box is equal to the first box.
+ if (y.is_empty())
+ return;
+ if (x.is_empty()) {
+ x = y;
+ return;
+ }
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ x.seq[k].join_assign(y.seq[k]);
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+ const dimension_type y_space_dim = y.space_dimension();
+
+ // If `y' is marked empty, the result will be empty too.
+ if (y.marked_empty())
+ x.set_empty();
+
+ // If `y' is a 0-dim space box, there is nothing left to do.
+ if (y_space_dim == 0)
+ return;
+ // The resulting space dimension must be at most the maximum.
+ check_space_dimension_overflow(y.space_dimension(),
+ max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "concatenate_assign(y)",
+ "concatenation exceeds the maximum "
+ "allowed space dimension");
+ // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+ // make sure that reallocation will occur once at most.
+ x.seq.reserve(x_space_dim + y_space_dim);
+
+ // If `x' is marked empty, then it is sufficient to adjust
+ // the dimension of the vector space.
+ if (x.marked_empty()) {
+ x.seq.insert(x.seq.end(), y_space_dim, ITV(EMPTY));
+ PPL_ASSERT(x.OK());
+ return;
+ }
+
+ // Here neither `x' nor `y' are marked empty: concatenate them.
+ std::copy(y.seq.begin(), y.seq.end(),
+ std::back_insert_iterator<Sequence>(x.seq));
+ // Update the `empty_up_to_date' flag.
+ if (!y.status.test_empty_up_to_date())
+ reset_empty_up_to_date();
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::difference_assign(const Box& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ Box& x = *this;
+ if (x.is_empty() || y.is_empty())
+ return;
+
+ switch (space_dim) {
+ case 0:
+ // If `x' is zero-dimensional, then at this point both `x' and `y'
+ // are the universe box, so that their difference is empty.
+ x.set_empty();
+ break;
+
+ case 1:
+ x.seq[0].difference_assign(y.seq[0]);
+ if (x.seq[0].is_empty())
+ x.set_empty();
+ break;
+
+ default:
+ {
+ dimension_type index_non_contained = space_dim;
+ dimension_type number_non_contained = 0;
+ for (dimension_type i = space_dim; i-- > 0; )
+ if (!y.seq[i].contains(x.seq[i])) {
+ if (++number_non_contained == 1)
+ index_non_contained = i;
+ else
+ break;
+ }
+
+ switch (number_non_contained) {
+ case 0:
+ // `y' covers `x': the difference is empty.
+ x.set_empty();
+ break;
+ case 1:
+ x.seq[index_non_contained]
+ .difference_assign(y.seq[index_non_contained]);
+ if (x.seq[index_non_contained].is_empty())
+ x.set_empty();
+ break;
+ default:
+ // Nothing to do: the difference is `x'.
+ break;
+ }
+ }
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type num_dims = x.space_dimension();
+ // Dimension-compatibility check.
+ if (num_dims != y.space_dimension())
+ x.throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (num_dims == 0) {
+ if (y.marked_empty()) {
+ x.set_nonempty();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case when `y' is empty.
+ if (y.is_empty()) {
+ for (dimension_type i = num_dims; i-- > 0; )
+ x.seq[i].assign(UNIVERSE);
+ x.set_nonempty();
+ return false;
+ }
+
+ if (x.is_empty()) {
+ // Find in `y' a non-universe interval, if any.
+ for (dimension_type i = 0; i < num_dims; ++i) {
+ if (y.seq[i].is_universe())
+ x.seq[i].assign(UNIVERSE);
+ else {
+ // Set x.seq[i] so as to contradict y.seq[i], if possible.
+ ITV& seq_i = x.seq[i];
+ seq_i.empty_intersection_assign(y.seq[i]);
+ if (seq_i.is_empty()) {
+ // We were not able to assign to `seq_i' a non-empty interval:
+ // reset `seq_i' to the universe interval and keep searching.
+ seq_i.assign(UNIVERSE);
+ continue;
+ }
+ // We assigned to `seq_i' a non-empty interval:
+ // set the other intervals to universe and return.
+ for (++i; i < num_dims; ++i)
+ x.seq[i].assign(UNIVERSE);
+ x.set_nonempty();
+ PPL_ASSERT(x.OK());
+ return false;
+ }
+ }
+ // All intervals in `y' are universe or could not be contradicted:
+ // simplification can leave the empty box `x' as is.
+ PPL_ASSERT(x.OK() && x.is_empty());
+ return false;
+ }
+
+ // Loop index `i' is intentionally going upwards.
+ for (dimension_type i = 0; i < num_dims; ++i) {
+ if (!x.seq[i].simplify_using_context_assign(y.seq[i])) {
+ PPL_ASSERT(!x.seq[i].is_empty());
+ // The intersection of `x' and `y' is empty due to the i-th interval:
+ // reset other intervals to UNIVERSE.
+ for (dimension_type j = num_dims; j-- > i; )
+ x.seq[j].assign(UNIVERSE);
+ for (dimension_type j = i; j-- > 0; )
+ x.seq[j].assign(UNIVERSE);
+ PPL_ASSERT(x.OK());
+ return false;
+ }
+ }
+ PPL_ASSERT(x.OK());
+ return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ x.throw_dimension_incompatible("time_elapse_assign(y)", y);
+
+ // Dealing with the zero-dimensional case.
+ if (x_space_dim == 0) {
+ if (y.marked_empty())
+ x.set_empty();
+ return;
+ }
+
+ // If either one of `x' or `y' is empty, the result is empty too.
+ // Note: if possible, avoid cost of checking for emptiness.
+ if (x.marked_empty() || y.marked_empty()
+ || x.is_empty() || y.is_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ ITV& x_seq_i = x.seq[i];
+ const ITV& y_seq_i = y.seq[i];
+ if (!x_seq_i.lower_is_boundary_infinity())
+ if (y_seq_i.lower_is_boundary_infinity() || y_seq_i.lower() < 0)
+ x_seq_i.lower_extend();
+ if (!x_seq_i.upper_is_boundary_infinity())
+ if (y_seq_i.upper_is_boundary_infinity() || y_seq_i.upper() > 0)
+ x_seq_i.upper_extend();
+ }
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any box is a no-op.
+ // Note that this case also captures the only legal removal of
+ // space dimensions from a box in a zero-dimensional space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type old_space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ const dimension_type vsi_space_dim = vars.space_dimension();
+ if (old_space_dim < vsi_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)",
+ vsi_space_dim);
+
+ const dimension_type new_space_dim = old_space_dim - vars.size();
+
+ // If the box is empty (this must be detected), then resizing is all
+ // what is needed. If it is not empty and we are removing _all_ the
+ // dimensions then, again, resizing suffices.
+ if (is_empty() || new_space_dim == 0) {
+ seq.resize(new_space_dim);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // For each variable to be removed, we fill the corresponding interval
+ // by shifting left those intervals that will not be removed.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ dimension_type dst = *vsi;
+ dimension_type src = dst + 1;
+ for (++vsi; vsi != vsi_end; ++vsi) {
+ const dimension_type vsi_next = *vsi;
+ // All intervals in between are moved to the left.
+ while (src < vsi_next)
+ swap(seq[dst++], seq[src++]);
+ ++src;
+ }
+ // Moving the remaining intervals.
+ while (src < old_space_dim)
+ swap(seq[dst++], seq[src++]);
+
+ PPL_ASSERT(dst == new_space_dim);
+ seq.resize(new_space_dim);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ const dimension_type space_dim = space_dimension();
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any box is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a zero-dim space box.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ seq.resize(new_dimension);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the box becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If the box is empty, then simply adjust the space dimension.
+ if (is_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // We create a new Box with the new space dimension.
+ Box<ITV> tmp(new_space_dim);
+ // Map the intervals, exchanging the indexes.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ dimension_type new_i;
+ if (pfunc.maps(i, new_i))
+ swap(seq[i], tmp.seq[new_i]);
+ }
+ m_swap(tmp);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& vars,
+ const Variable dest) {
+ const dimension_type space_dim = space_dimension();
+ // `dest' should be one of the dimensions of the box.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the box.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ // Note: the check for emptiness is needed for correctness.
+ if (!is_empty()) {
+ // Join the interval corresponding to variable `dest' with the intervals
+ // corresponding to the variables in `vars'.
+ ITV& seq_v = seq[dest.id()];
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i)
+ seq_v.join_assign(seq[*i]);
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Throw an exception if c is not an interval constraints.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not an interval constraint");
+
+ // Throw an exception if c is a nontrivial strict constraint
+ // and ITV does not support open boundaries.
+ if (c.is_strict_inequality() && c_num_vars != 0
+ && ITV::is_always_topologically_closed())
+ throw_invalid_argument("add_constraint(c)",
+ "c is a nontrivial strict constraint");
+
+ // Avoid doing useless work if the box is known to be empty.
+ if (marked_empty())
+ return;
+
+ const Coefficient& n = c.inhomogeneous_term();
+ if (c_num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (n < 0
+ || (c.is_equality() && n != 0)
+ || (c.is_strict_inequality() && n == 0))
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(c_num_vars == 1);
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+ // Note: even when the box is known to be empty, we need to go
+ // through all the constraints to fulfill the method's contract
+ // for what concerns exception throwing.
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ add_constraint_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ // Set aside the case of proper congruences.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ else if (cg.is_tautological())
+ return;
+ else
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a nontrivial proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ dimension_type cg_num_vars = 0;
+ dimension_type cg_only_var = 0;
+ // Throw an exception if c is not an interval congruence.
+ if (!Box_Helpers::extract_interval_congruence(cg, cg_num_vars, cg_only_var))
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is not an interval congruence");
+
+ // Avoid doing useless work if the box is known to be empty.
+ if (marked_empty())
+ return;
+
+ const Coefficient& n = cg.inhomogeneous_term();
+ if (cg_num_vars == 0) {
+ // Dealing with a trivial equality congruence.
+ if (n != 0)
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(cg_num_vars == 1);
+ const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+ add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+ PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+ // Note: even when the box is known to be empty, we need to go
+ // through all the congruences to fulfill the method's contract
+ // for what concerns exception throwing.
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+ PPL_ASSERT(!marked_empty());
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Non-interval constraints are approximated.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+ propagate_constraint_no_check(c);
+ return;
+ }
+
+ const Coefficient& n = c.inhomogeneous_term();
+ if (c_num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (n < 0
+ || (c.is_equality() && n != 0)
+ || (c.is_strict_inequality() && n == 0))
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(c_num_vars == 1);
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ // A proper congruences is also an interval constraint
+ // if and only if it is trivial.
+ if (cg.is_inconsistent())
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+ PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+#if 1 // Alternative implementations for propagate_constraint_no_check.
+namespace Implementation {
+
+namespace Boxes {
+
+inline bool
+propagate_constraint_check_result(Result r, Ternary& open) {
+ r = result_relation_class(r);
+ switch (r) {
+ case V_GT_MINUS_INFINITY:
+ case V_LT_PLUS_INFINITY:
+ return true;
+ case V_LT:
+ case V_GT:
+ open = T_YES;
+ return false;
+ case V_LE:
+ case V_GE:
+ if (open == T_NO)
+ open = T_MAYBE;
+ return false;
+ case V_EQ:
+ return false;
+ default:
+ PPL_UNREACHABLE;
+ return true;
+ }
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+ using namespace Implementation::Boxes;
+
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ typedef
+ typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+ Temp_Boundary_Type;
+
+ const dimension_type c_space_dim = c.space_dimension();
+ const Constraint::Type c_type = c.type();
+ const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+
+ // Find a space dimension having a non-zero coefficient (if any).
+ const dimension_type last_k
+ = c.expression().last_nonzero(1, c_space_dim + 1);
+ if (last_k == c_space_dim + 1) {
+ // Constraint c is trivial: check if it is inconsistent.
+ if (c_inhomogeneous_term < 0
+ || (c_inhomogeneous_term == 0
+ && c_type != Constraint::NONSTRICT_INEQUALITY))
+ set_empty();
+ return;
+ }
+
+ // Here constraint c is non-trivial.
+ PPL_ASSERT(last_k <= c_space_dim);
+ Temp_Boundary_Type t_bound;
+ Temp_Boundary_Type t_a;
+ Temp_Boundary_Type t_x;
+ Ternary open;
+ const Constraint::expr_type c_e = c.expression();
+ for (Constraint::expr_type::const_iterator k = c_e.begin(),
+ k_end = c_e.lower_bound(Variable(last_k)); k != k_end; ++k) {
+ const Coefficient& a_k = *k;
+ const Variable k_var = k.variable();
+ const int sgn_a_k = sgn(a_k);
+ if (sgn_a_k == 0)
+ continue;
+ Result r;
+ if (sgn_a_k > 0) {
+ open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+ if (open == T_NO)
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(last_k)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.lower_is_boundary_infinity())
+ goto maybe_refine_upper_1;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.upper_is_boundary_infinity())
+ goto maybe_refine_upper_1;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+
+ // Refine the lower bound of `seq[k]' with `t_bound'.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ {
+ const Relation_Symbol rel
+ = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ }
+ reset_empty_up_to_date();
+ maybe_refine_upper_1:
+ if (c_type != Constraint::EQUALITY)
+ continue;
+ open = T_NO;
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.upper_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.lower_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+
+ // Refine the upper bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ const Relation_Symbol rel
+ = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ reset_empty_up_to_date();
+ }
+ else {
+ PPL_ASSERT(sgn_a_k < 0);
+ open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+ if (open == T_NO)
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.lower_is_boundary_infinity())
+ goto maybe_refine_upper_2;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.upper_is_boundary_infinity())
+ goto maybe_refine_upper_2;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+
+ // Refine the upper bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ {
+ const Relation_Symbol rel
+ = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ }
+ reset_empty_up_to_date();
+ maybe_refine_upper_2:
+ if (c_type != Constraint::EQUALITY)
+ continue;
+ open = T_NO;
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.upper_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.lower_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+
+ // Refine the lower bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ const Relation_Symbol rel
+ = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ reset_empty_up_to_date();
+ }
+ next_k:
+ ;
+ }
+}
+
+#else // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type c_space_dim = c.space_dimension();
+ ITV k[c_space_dim];
+ ITV p[c_space_dim];
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ k[i_var.id()] = *i;
+ ITV& p_i = p[i_var.id()];
+ p_i = seq[i_var.id()];
+ p_i.mul_assign(p_i, k[i_var.id()]);
+ }
+ const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ int sgn_coefficient_i = sgn(*i);
+ ITV q(inhomogeneous_term);
+ for (Constraint::expr_type::const_iterator j = c_e.begin(),
+ j_end = c_e.lower_bound(Variable(c_space_dim)); j != j_end; ++j) {
+ const Variable j_var = j.variable();
+ if (i_var == j_var)
+ continue;
+ q.add_assign(q, p[j_var.id()]);
+ }
+ q.div_assign(q, k[i_var.id()]);
+ q.neg_assign(q);
+ Relation_Symbol rel;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ rel = EQUAL;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+ break;
+ }
+ seq[i_var.id()].add_constraint(i_constraint(rel, q));
+ // FIXME: could/should we exploit the return value of add_constraint
+ // in case it is available?
+ // FIXME: should we instead be lazy and do not even bother about
+ // the possibility the interval becomes empty apart from setting
+ // empty_up_to_date = false?
+ if (seq[i_var.id()].is_empty()) {
+ set_empty();
+ break;
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+#endif // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>
+::propagate_constraints_no_check(const Constraint_System& cs,
+ const dimension_type max_iterations) {
+ const dimension_type space_dim = space_dimension();
+ PPL_ASSERT(cs.space_dimension() <= space_dim);
+
+ const Constraint_System::const_iterator cs_begin = cs.begin();
+ const Constraint_System::const_iterator cs_end = cs.end();
+ const dimension_type propagation_weight
+ = Implementation::num_constraints(cs) * space_dim;
+
+ Sequence copy;
+ bool changed;
+ dimension_type num_iterations = 0;
+ do {
+ WEIGHT_BEGIN();
+ ++num_iterations;
+ copy = seq;
+ for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i)
+ propagate_constraint_no_check(*i);
+
+ WEIGHT_ADD_MUL(40, propagation_weight);
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ // NOTE: if max_iterations == 0 (i.e., no iteration limit is set)
+ // the following test will anyway trigger on wrap around.
+ if (num_iterations == max_iterations)
+ break;
+
+ changed = (copy != seq);
+ } while (changed);
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ if (is_empty())
+ return;
+
+ Tmp_Interval_Type expr_value;
+ Tmp_Interval_Type temp0;
+ Tmp_Interval_Type temp1;
+ expr_value.assign(expr.inhomogeneous_term());
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ temp0.assign(*i);
+ temp1.assign(seq[i.variable().id()]);
+ temp0.mul_assign(temp0, temp1);
+ expr_value.add_assign(expr_value, temp0);
+ }
+ if (denominator != 1) {
+ temp0.assign(denominator);
+ expr_value.div_assign(expr_value, temp0);
+ }
+ seq[var.id()].assign(expr_value);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_form_image(const Variable var,
+ const Linear_Form<ITV>& lf) {
+
+ // Check that ITV has a floating point boundary type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<typename ITV::boundary_type>
+ ::is_exact, "Box<ITV>::affine_form_image(Variable, Linear_Form):"
+ "ITV has not a floating point boundary type.");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(var, lf)", "lf", lf);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_form_image(var, lf)", "var", var);
+
+ if (is_empty())
+ return;
+
+ // Intervalization of 'lf'.
+ ITV result = lf.inhomogeneous_term();
+ for (dimension_type i = 0; i < lf_space_dim; ++i) {
+ ITV current_addend = lf.coefficient(Variable(i));
+ const ITV& curr_int = seq[i];
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ seq[var.id()].assign(result);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type x_space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (x_space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (x_space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+ if (is_empty())
+ return;
+
+ const Coefficient& expr_v = expr.coefficient(var);
+ const bool invertible = (expr_v != 0);
+ if (!invertible) {
+ Tmp_Interval_Type expr_value;
+ Tmp_Interval_Type temp0;
+ Tmp_Interval_Type temp1;
+ expr_value.assign(expr.inhomogeneous_term());
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ temp0.assign(*i);
+ temp1.assign(seq[i.variable().id()]);
+ temp0.mul_assign(temp0, temp1);
+ expr_value.add_assign(expr_value, temp0);
+ }
+ if (denominator != 1) {
+ temp0.assign(denominator);
+ expr_value.div_assign(expr_value, temp0);
+ }
+ ITV& x_seq_v = seq[var.id()];
+ expr_value.intersect_assign(x_seq_v);
+ if (expr_value.is_empty())
+ set_empty();
+ else
+ x_seq_v.assign(UNIVERSE);
+ }
+ else {
+ // The affine transformation is invertible.
+ // CHECKME: for efficiency, would it be meaningful to avoid
+ // the computation of inverse by partially evaluating the call
+ // to affine_image?
+ Linear_Expression inverse;
+ inverse -= expr;
+ inverse += (expr_v + denominator) * var;
+ affine_image(var, inverse, expr_v);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ // Any image of an empty box is empty.
+ if (is_empty())
+ return;
+
+ // Add the constraint implied by the `lb_expr' and `ub_expr'.
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= ub_expr);
+ else
+ refine_with_constraint(lb_expr >= ub_expr);
+
+ // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+ if (lb_expr.coefficient(var) == 0) {
+ // Here `var' can only occur in `ub_expr'.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= denominator*var);
+ else
+ refine_with_constraint(denominator*var <= lb_expr);
+ }
+ else if (ub_expr.coefficient(var) == 0) {
+ // Here `var' can only occur in `lb_expr'.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (denominator > 0)
+ refine_with_constraint(denominator*var <= ub_expr);
+ else
+ refine_with_constraint(ub_expr <= denominator*var);
+ }
+ else {
+ // Here `var' occurs in both `lb_expr' and `ub_expr'. As boxes
+ // can only use the non-relational constraints, we find the
+ // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+ // box and use these instead of the `ub-expr' and `lb-expr'.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ ITV& seq_v = seq[var.id()];
+ if (maximize(ub_expr, max_numer, max_denom, max_included)) {
+ if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+ // The `ub_expr' has a maximum value and the `lb_expr'
+ // has a minimum value for the box.
+ // Set the bounds for `var' using the minimum for `lb_expr'.
+ min_denom *= denominator;
+ PPL_DIRTY_TEMP(mpq_class, q1);
+ PPL_DIRTY_TEMP(mpq_class, q2);
+ assign_r(q1.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q1.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q1.canonicalize();
+ // Now make the maximum of lb_expr the upper bound. If the
+ // maximum is not at a box point, then inequality is strict.
+ max_denom *= denominator;
+ assign_r(q2.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q2.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q2.canonicalize();
+
+ if (denominator > 0) {
+ Relation_Symbol gr = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ Relation_Symbol lr = max_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_v.build(i_constraint(gr, q1), i_constraint(lr, q2));
+ }
+ else {
+ Relation_Symbol gr = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ Relation_Symbol lr = min_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_v.build(i_constraint(gr, q2), i_constraint(lr, q1));
+ }
+ }
+ else {
+ // The `ub_expr' has a maximum value but the `lb_expr'
+ // has no minimum value for the box.
+ // Set the bounds for `var' using the maximum for `lb_expr'.
+ PPL_DIRTY_TEMP(mpq_class, q);
+ max_denom *= denominator;
+ assign_r(q.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ Relation_Symbol rel = (denominator > 0)
+ ? (max_included ? LESS_OR_EQUAL : LESS_THAN)
+ : (max_included ? GREATER_OR_EQUAL : GREATER_THAN);
+ seq_v.build(i_constraint(rel, q));
+ }
+ }
+ else if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+ // The `ub_expr' has no maximum value but the `lb_expr'
+ // has a minimum value for the box.
+ // Set the bounds for `var' using the minimum for `lb_expr'.
+ min_denom *= denominator;
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+
+ Relation_Symbol rel = (denominator > 0)
+ ? (min_included ? GREATER_OR_EQUAL : GREATER_THAN)
+ : (min_included ? LESS_OR_EQUAL : LESS_THAN);
+ seq_v.build(i_constraint(rel, q));
+ }
+ else {
+ // The `ub_expr' has no maximum value and the `lb_expr'
+ // has no minimum value for the box.
+ // So we set the bounds to be unbounded.
+ seq_v.assign(UNIVERSE);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ const dimension_type space_dim = space_dimension();
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ const bool negative_denom = (denominator < 0);
+ const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+ const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
+
+ // If the implied constraint between `ub_expr and `lb_expr' is
+ // independent of `var', then impose it now.
+ if (lb_var_coeff == ub_var_coeff) {
+ if (negative_denom)
+ refine_with_constraint(lb_expr >= ub_expr);
+ else
+ refine_with_constraint(lb_expr <= ub_expr);
+ }
+
+ ITV& seq_var = seq[var.id()];
+ if (!seq_var.is_universe()) {
+ // We want to work with a positive denominator,
+ // so the sign and its (unsigned) value are separated.
+ PPL_DIRTY_TEMP_COEFFICIENT(pos_denominator);
+ pos_denominator = denominator;
+ if (negative_denom)
+ neg_assign(pos_denominator, pos_denominator);
+ // Store all the information about the upper and lower bounds
+ // for `var' before making this interval unbounded.
+ bool open_lower = seq_var.lower_is_open();
+ bool unbounded_lower = seq_var.lower_is_boundary_infinity();
+ PPL_DIRTY_TEMP(mpq_class, q_seq_var_lower);
+ PPL_DIRTY_TEMP(Coefficient, numer_lower);
+ PPL_DIRTY_TEMP(Coefficient, denom_lower);
+ if (!unbounded_lower) {
+ assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+ assign_r(numer_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+ assign_r(denom_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+ if (negative_denom)
+ neg_assign(denom_lower, denom_lower);
+ numer_lower *= pos_denominator;
+ seq_var.lower_extend();
+ }
+ bool open_upper = seq_var.upper_is_open();
+ bool unbounded_upper = seq_var.upper_is_boundary_infinity();
+ PPL_DIRTY_TEMP(mpq_class, q_seq_var_upper);
+ PPL_DIRTY_TEMP(Coefficient, numer_upper);
+ PPL_DIRTY_TEMP(Coefficient, denom_upper);
+ if (!unbounded_upper) {
+ assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+ assign_r(numer_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+ assign_r(denom_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+ if (negative_denom)
+ neg_assign(denom_upper, denom_upper);
+ numer_upper *= pos_denominator;
+ seq_var.upper_extend();
+ }
+
+ if (!unbounded_lower) {
+ // `lb_expr' is revised by removing the `var' component,
+ // multiplying by `-' denominator of the lower bound for `var',
+ // and adding the lower bound for `var' to the inhomogeneous term.
+ Linear_Expression revised_lb_expr(ub_expr);
+ revised_lb_expr -= ub_var_coeff * var;
+ PPL_DIRTY_TEMP(Coefficient, d);
+ neg_assign(d, denom_lower);
+ revised_lb_expr *= d;
+ revised_lb_expr += numer_lower;
+
+ // Find the minimum value for the revised lower bound expression
+ // and use this to refine the appropriate bound.
+ bool included;
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ if (minimize(revised_lb_expr, numer_lower, denom, included)) {
+ denom_lower *= (denom * ub_var_coeff);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer_lower, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom_lower, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ if (!included)
+ open_lower = true;
+ Relation_Symbol rel;
+ if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+ rel = open_lower ? GREATER_THAN : GREATER_OR_EQUAL;
+ else
+ rel = open_lower ? LESS_THAN : LESS_OR_EQUAL;
+ seq_var.add_constraint(i_constraint(rel, q));
+ if (seq_var.is_empty()) {
+ set_empty();
+ return;
+ }
+ }
+ }
+
+ if (!unbounded_upper) {
+ // `ub_expr' is revised by removing the `var' component,
+ // multiplying by `-' denominator of the upper bound for `var',
+ // and adding the upper bound for `var' to the inhomogeneous term.
+ Linear_Expression revised_ub_expr(lb_expr);
+ revised_ub_expr -= lb_var_coeff * var;
+ PPL_DIRTY_TEMP(Coefficient, d);
+ neg_assign(d, denom_upper);
+ revised_ub_expr *= d;
+ revised_ub_expr += numer_upper;
+
+ // Find the maximum value for the revised upper bound expression
+ // and use this to refine the appropriate bound.
+ bool included;
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ if (maximize(revised_ub_expr, numer_upper, denom, included)) {
+ denom_upper *= (denom * lb_var_coeff);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer_upper, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom_upper, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ if (!included)
+ open_upper = true;
+ Relation_Symbol rel;
+ if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+ rel = open_upper ? LESS_THAN : LESS_OR_EQUAL;
+ else
+ rel = open_upper ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq_var.add_constraint(i_constraint(rel, q));
+ if (seq_var.is_empty()) {
+ set_empty();
+ return;
+ }
+ }
+ }
+ }
+
+ // If the implied constraint between `ub_expr and `lb_expr' is
+ // dependent on `var', then impose on the new box.
+ if (lb_var_coeff != ub_var_coeff) {
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= ub_expr);
+ else
+ refine_with_constraint(lb_expr >= ub_expr);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "v", var);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // First compute the affine image.
+ affine_image(var, expr, denominator);
+
+ if (relsym == EQUAL)
+ // The affine relation is indeed an affine function.
+ return;
+
+ // Any image of an empty box is empty.
+ if (is_empty())
+ return;
+
+ ITV& seq_var = seq[var.id()];
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ seq_var.lower_extend();
+ break;
+ case LESS_THAN:
+ seq_var.lower_extend();
+ if (!seq_var.upper_is_boundary_infinity())
+ seq_var.remove_sup();
+ break;
+ case GREATER_OR_EQUAL:
+ seq_var.upper_extend();
+ break;
+ case GREATER_THAN:
+ seq_var.upper_extend();
+ if (!seq_var.lower_is_boundary_infinity())
+ seq_var.remove_inf();
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator)
+{
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "v", var);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // Check whether the affine relation is indeed an affine function.
+ if (relsym == EQUAL) {
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // Compute the reversed relation symbol to simplify later coding.
+ Relation_Symbol reversed_relsym;
+ switch (relsym) {
+ case LESS_THAN:
+ reversed_relsym = GREATER_THAN;
+ break;
+ case LESS_OR_EQUAL:
+ reversed_relsym = GREATER_OR_EQUAL;
+ break;
+ case GREATER_OR_EQUAL:
+ reversed_relsym = LESS_OR_EQUAL;
+ break;
+ case GREATER_THAN:
+ reversed_relsym = LESS_THAN;
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& var_coefficient = expr.coefficient(var);
+ if (var_coefficient != 0) {
+ Linear_Expression inverse_expr
+ = expr - (denominator + var_coefficient) * var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+ neg_assign(inverse_denominator, var_coefficient);
+ Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denominator))
+ ? relsym
+ : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse_expr,
+ inverse_denominator);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the box by adding the constraint induced
+ // by the affine relation.
+ // First, compute the maximum and minimum value reached by
+ // `denominator*var' on the box as we need to use non-relational
+ // expressions.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ bool bound_above = maximize(denominator*var, max_numer, max_denom, max_included);
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bound_below = minimize(denominator*var, min_numer, min_denom, min_included);
+ // Use the correct relation symbol
+ const Relation_Symbol corrected_relsym
+ = (denominator > 0) ? relsym : reversed_relsym;
+ // Revise the expression to take into account the denominator of the
+ // maximum/minimum value for `var'.
+ Linear_Expression revised_expr;
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+ if (bound_below) {
+ revised_expr = expr;
+ revised_expr.set_inhomogeneous_term(Coefficient_zero());
+ revised_expr *= d;
+ }
+ }
+ else {
+ if (bound_above) {
+ revised_expr = expr;
+ revised_expr.set_inhomogeneous_term(Coefficient_zero());
+ revised_expr *= max_denom;
+ }
+ }
+
+ switch (corrected_relsym) {
+ case LESS_THAN:
+ if (bound_below)
+ refine_with_constraint(min_numer < revised_expr);
+ break;
+ case LESS_OR_EQUAL:
+ if (bound_below)
+ (min_included)
+ ? refine_with_constraint(min_numer <= revised_expr)
+ : refine_with_constraint(min_numer < revised_expr);
+ break;
+ case GREATER_OR_EQUAL:
+ if (bound_above)
+ (max_included)
+ ? refine_with_constraint(max_numer >= revised_expr)
+ : refine_with_constraint(max_numer > revised_expr);
+ break;
+ case GREATER_THAN:
+ if (bound_above)
+ refine_with_constraint(max_numer > revised_expr);
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // If the shrunk box is empty, its preimage is empty too.
+ if (is_empty())
+ return;
+ ITV& seq_v = seq[var.id()];
+ seq_v.assign(UNIVERSE);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty box is empty.
+ if (marked_empty())
+ return;
+
+ // Compute the maximum and minimum value reached by the rhs on the box.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ bool max_rhs = maximize(rhs, max_numer, max_denom, max_included);
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool min_rhs = minimize(rhs, min_numer, min_denom, min_included);
+
+ // Check whether there is 0, 1 or more than one variable in the lhs
+ // and record the variable with the highest dimension; set the box
+ // intervals to be unbounded for all other dimensions with non-zero
+ // coefficients in the lhs.
+ bool has_var = false;
+ dimension_type has_var_id = lhs.last_nonzero();
+
+ if (has_var_id != 0) {
+ has_var = true;
+ --has_var_id;
+ dimension_type other_var = lhs.first_nonzero(1, has_var_id + 1);
+ --other_var;
+ if (other_var != has_var_id) {
+ // There is more than one dimension with non-zero coefficient, so
+ // we cannot have any information about the dimensions in the lhs.
+ ITV& seq_var = seq[has_var_id];
+ seq_var.assign(UNIVERSE);
+ // Since all but the highest dimension with non-zero coefficient
+ // in the lhs have been set unbounded, it remains to set the
+ // highest dimension in the lhs unbounded.
+ ITV& seq_i = seq[other_var];
+ seq_i.assign(UNIVERSE);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ if (has_var) {
+ // There is exactly one dimension with non-zero coefficient.
+ ITV& seq_var = seq[has_var_id];
+
+ // Compute the new bounds for this dimension defined by the rhs
+ // expression.
+ const Coefficient& inhomo = lhs.inhomogeneous_term();
+ const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+ PPL_DIRTY_TEMP(mpq_class, q_max);
+ PPL_DIRTY_TEMP(mpq_class, q_min);
+ if (max_rhs) {
+ max_numer -= inhomo * max_denom;
+ max_denom *= coeff;
+ assign_r(q_max.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q_max.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q_max.canonicalize();
+ }
+ if (min_rhs) {
+ min_numer -= inhomo * min_denom;
+ min_denom *= coeff;
+ assign_r(q_min.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q_min.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q_min.canonicalize();
+ }
+
+ // The choice as to which bounds should be set depends on the sign
+ // of the coefficient of the dimension `has_var_id' in the lhs.
+ if (coeff > 0)
+ // The coefficient of the dimension in the lhs is positive.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ if (max_rhs) {
+ Relation_Symbol rel = max_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_var.build(i_constraint(rel, q_max));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case LESS_THAN:
+ if (max_rhs)
+ seq_var.build(i_constraint(LESS_THAN, q_max));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case EQUAL:
+ {
+ I_Constraint<mpq_class> l;
+ I_Constraint<mpq_class> u;
+ if (max_rhs)
+ u.set(max_included ? LESS_OR_EQUAL : LESS_THAN, q_max);
+ if (min_rhs)
+ l.set(min_included ? GREATER_OR_EQUAL : GREATER_THAN, q_min);
+ seq_var.build(l, u);
+ break;
+ }
+ case GREATER_OR_EQUAL:
+ if (min_rhs) {
+ Relation_Symbol rel = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ seq_var.build(i_constraint(rel, q_min));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case GREATER_THAN:
+ if (min_rhs)
+ seq_var.build(i_constraint(GREATER_THAN, q_min));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ else
+ // The coefficient of the dimension in the lhs is negative.
+ switch (relsym) {
+ case GREATER_OR_EQUAL:
+ if (min_rhs) {
+ Relation_Symbol rel = min_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_var.build(i_constraint(rel, q_min));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case GREATER_THAN:
+ if (min_rhs)
+ seq_var.build(i_constraint(LESS_THAN, q_min));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case EQUAL:
+ {
+ I_Constraint<mpq_class> l;
+ I_Constraint<mpq_class> u;
+ if (max_rhs)
+ l.set(max_included ? GREATER_OR_EQUAL : GREATER_THAN, q_max);
+ if (min_rhs)
+ u.set(min_included ? LESS_OR_EQUAL : LESS_THAN, q_min);
+ seq_var.build(l, u);
+ break;
+ }
+ case LESS_OR_EQUAL:
+ if (max_rhs) {
+ Relation_Symbol rel = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ seq_var.build(i_constraint(rel, q_max));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case LESS_THAN:
+ if (max_rhs)
+ seq_var.build(i_constraint(GREATER_THAN, q_max));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+
+ else {
+ // The lhs is a constant value, so we just need to add the
+ // appropriate constraint.
+ const Coefficient& inhomo = lhs.inhomogeneous_term();
+ switch (relsym) {
+ case LESS_THAN:
+ refine_with_constraint(inhomo < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_with_constraint(inhomo <= rhs);
+ break;
+ case EQUAL:
+ refine_with_constraint(inhomo == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_with_constraint(inhomo >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_with_constraint(inhomo > rhs);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty box is empty.
+ if (marked_empty())
+ return;
+
+ // For any dimension occurring in the lhs, swap and change the sign
+ // of this component for the rhs and lhs. Then use these in a call
+ // to generalized_affine_image/3.
+ Linear_Expression revised_lhs = lhs;
+ Linear_Expression revised_rhs = rhs;
+ for (Linear_Expression::const_iterator i = lhs.begin(),
+ i_end = lhs.end(); i != i_end; ++i) {
+ const Variable var = i.variable();
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ tmp = *i;
+ tmp += rhs.coefficient(var);
+ sub_mul_assign(revised_rhs, tmp, var);
+ sub_mul_assign(revised_lhs, tmp, var);
+ }
+ generalized_affine_image(revised_lhs, relsym, revised_rhs);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T, typename Iterator>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_widening_assign(const T& y, Iterator first, Iterator last) {
+ if (y.is_empty())
+ return;
+
+ for (dimension_type i = seq.size(); i-- > 0; )
+ seq[i].CC76_widening_assign(y.seq[i], first, last);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_widening_assign(const T& y, unsigned* tp) {
+ static typename ITV::boundary_type stop_points[] = {
+ typename ITV::boundary_type(-2),
+ typename ITV::boundary_type(-1),
+ typename ITV::boundary_type(0),
+ typename ITV::boundary_type(1),
+ typename ITV::boundary_type(2)
+ };
+
+ Box& x = *this;
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Box<ITV> x_tmp(x);
+ x_tmp.CC76_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!x.contains(x_tmp))
+ --(*tp);
+ return;
+ }
+ x.CC76_widening_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+template <typename ITV>
+void
+Box<ITV>::get_limiting_box(const Constraint_System& cs,
+ Box& limiting_box) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Constraints that are not interval constraints are ignored.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ continue;
+ // Trivial constraints are ignored.
+ if (c_num_vars != 0) {
+ // c is a non-trivial interval constraint.
+ // add interval constraint to limiting box
+ const Coefficient& n = c.inhomogeneous_term();
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ if (interval_relation(seq[c_only_var], c.type(), n, d)
+ == Poly_Con_Relation::is_included())
+ limiting_box.add_interval_constraint_no_check(c_only_var, c.type(),
+ n, d);
+ }
+ }
+}
+
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Box& x = *this;
+ const dimension_type space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two boxes.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // The limited CC76-extrapolation between two boxes in a
+ // zero-dimensional space is also a zero-dimensional box
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // Build a limiting box using all the constraints in cs
+ // that are satisfied by *this.
+ Box limiting_box(space_dim, UNIVERSE);
+ get_limiting_box(cs, limiting_box);
+
+ x.CC76_widening_assign(y, tp);
+
+ // Intersect the widened box with the limiting box.
+ intersection_assign(limiting_box);
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_narrowing_assign(const T& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // Assume `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both boxes are zero-dimensional,
+ // since `y' contains `*this', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ // If `y' is empty, since `y' contains `this', `*this' is empty too.
+ if (y.is_empty())
+ return;
+ // If `*this' is empty, we return.
+ if (is_empty())
+ return;
+
+ // Replace each constraint in `*this' by the corresponding constraint
+ // in `y' if the corresponding inhomogeneous terms are both finite.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ ITV& x_i = seq[i];
+ const ITV& y_i = y.seq[i];
+ if (!x_i.lower_is_boundary_infinity()
+ && !y_i.lower_is_boundary_infinity()
+ && x_i.lower() != y_i.lower())
+ x_i.lower() = y_i.lower();
+ if (!x_i.upper_is_boundary_infinity()
+ && !y_i.upper_is_boundary_infinity()
+ && x_i.upper() != y_i.upper())
+ x_i.upper() = y_i.upper();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k >= n);
+ else
+ cs.insert(d * v_k > n);
+ }
+ if (has_upper_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k <= n);
+ else
+ cs.insert(d * v_k < n);
+ }
+ }
+ return cs;
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ // Make sure emptiness is detected.
+ if (is_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed)) {
+ if (closed)
+ // Make sure equality constraints are detected.
+ if (seq[k].is_singleton()) {
+ cs.insert(d * v_k == n);
+ continue;
+ }
+ else
+ cs.insert(d * v_k >= n);
+ else
+ cs.insert(d * v_k > n);
+ }
+ if (has_upper_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k <= n);
+ else
+ cs.insert(d * v_k < n);
+ }
+ }
+ return cs;
+}
+
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ // Make sure emptiness is detected.
+ if (is_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed) && closed)
+ // Make sure equality congruences are detected.
+ if (seq[k].is_singleton())
+ cgs.insert((d * v_k %= n) / 0);
+ }
+ return cgs;
+}
+
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+ memory_size_type n = seq.capacity() * sizeof(ITV);
+ for (dimension_type k = seq.size(); k-- > 0; )
+ n += seq[k].external_memory_in_bytes();
+ return n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+ if (box.is_empty())
+ s << "false";
+ else if (box.is_universe())
+ s << "true";
+ else
+ for (dimension_type k = 0,
+ space_dim = box.space_dimension(); k < space_dim; ) {
+ s << Variable(k) << " in " << box[k];
+ ++k;
+ if (k < space_dim)
+ s << ", ";
+ else
+ break;
+ }
+ return s;
+}
+
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+ const char separator = ' ';
+ status.ascii_dump(s);
+ const dimension_type space_dim = space_dimension();
+ s << "space_dim" << separator << space_dim;
+ s << "\n";
+ for (dimension_type i = 0; i < space_dim; ++i)
+ seq[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
+
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+ if (!status.ascii_load(s))
+ return false;
+
+ std::string str;
+ dimension_type space_dim;
+ if (!(s >> str) || str != "space_dim")
+ return false;
+ if (!(s >> space_dim))
+ return false;
+
+ seq.clear();
+ ITV seq_i;
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ if (seq_i.ascii_load(s))
+ seq.push_back(seq_i);
+ else
+ return false;
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Box& y) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << this->space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Constraint_System& cs) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cs->space_dimension == " << cs.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Congruence_System& cgs) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+template <typename C>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_invalid_argument(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << reason;
+ throw std::invalid_argument(s.str());
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+ typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x, const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim boxes are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires a check for emptiness.
+ (void) x.is_empty();
+ (void) y.is_empty();
+ // If one of two boxes is empty, then they are equal if and only if
+ // the other box is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty()) {
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ return true;
+ }
+ else
+ goto pinf;
+ }
+
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ const ITV& x_i = x.seq[i];
+ const ITV& y_i = y.seq[i];
+ // Dealing with the lower bounds.
+ if (x_i.lower_is_boundary_infinity()) {
+ if (!y_i.lower_is_boundary_infinity())
+ goto pinf;
+ }
+ else if (y_i.lower_is_boundary_infinity())
+ goto pinf;
+ else {
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i.lower() > y_i.lower()) {
+ maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+ maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+ maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ // Dealing with the lower bounds.
+ if (x_i.upper_is_boundary_infinity())
+ if (y_i.upper_is_boundary_infinity())
+ continue;
+ else
+ goto pinf;
+ else if (y_i.upper_is_boundary_infinity())
+ goto pinf;
+ else {
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i.upper() > y_i.upper()) {
+ maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+ maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+ maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_templates_hh)
diff --git a/src/Box_types.hh b/src/Box_types.hh
new file mode 100644
index 0000000..3383e02
--- /dev/null
+++ b/src/Box_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Box_types_hh
+#define PPL_Box_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+class Box_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_types_hh)
diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist
new file mode 100644
index 0000000..f341b8b
--- /dev/null
+++ b/src/COPYING.cc.dist
@@ -0,0 +1,676 @@
+extern const char* const COPYING_array[675] = {
+ " GNU GENERAL PUBLIC LICENSE",
+ " Version 3, 29 June 2007",
+ "",
+ " Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>",
+ " Everyone is permitted to copy and distribute verbatim copies",
+ " of this license document, but changing it is not allowed.",
+ "",
+ " Preamble",
+ "",
+ " The GNU General Public License is a free, copyleft license for",
+ "software and other kinds of works.",
+ "",
+ " The licenses for most software and other practical works are designed",
+ "to take away your freedom to share and change the works. By contrast,",
+ "the GNU General Public License is intended to guarantee your freedom to",
+ "share and change all versions of a program--to make sure it remains free",
+ "software for all its users. We, the Free Software Foundation, use the",
+ "GNU General Public License for most of our software; it applies also to",
+ "any other work released this way by its authors. You can apply it to",
+ "your programs, too.",
+ "",
+ " When we speak of free software, we are referring to freedom, not",
+ "price. Our General Public Licenses are designed to make sure that you",
+ "have the freedom to distribute copies of free software (and charge for",
+ "them if you wish), that you receive source code or can get it if you",
+ "want it, that you can change the software or use pieces of it in new",
+ "free programs, and that you know you can do these things.",
+ "",
+ " To protect your rights, we need to prevent others from denying you",
+ "these rights or asking you to surrender the rights. Therefore, you have",
+ "certain responsibilities if you distribute copies of the software, or if",
+ "you modify it: responsibilities to respect the freedom of others.",
+ "",
+ " For example, if you distribute copies of such a program, whether",
+ "gratis or for a fee, you must pass on to the recipients the same",
+ "freedoms that you received. You must make sure that they, too, receive",
+ "or can get the source code. And you must show them these terms so they",
+ "know their rights.",
+ "",
+ " Developers that use the GNU GPL protect your rights with two steps:",
+ "(1) assert copyright on the software, and (2) offer you this License",
+ "giving you legal permission to copy, distribute and/or modify it.",
+ "",
+ " For the developers' and authors' protection, the GPL clearly explains",
+ "that there is no warranty for this free software. For both users' and",
+ "authors' sake, the GPL requires that modified versions be marked as",
+ "changed, so that their problems will not be attributed erroneously to",
+ "authors of previous versions.",
+ "",
+ " Some devices are designed to deny users access to install or run",
+ "modified versions of the software inside them, although the manufacturer",
+ "can do so. This is fundamentally incompatible with the aim of",
+ "protecting users' freedom to change the software. The systematic",
+ "pattern of such abuse occurs in the area of products for individuals to",
+ "use, which is precisely where it is most unacceptable. Therefore, we",
+ "have designed this version of the GPL to prohibit the practice for those",
+ "products. If such problems arise substantially in other domains, we",
+ "stand ready to extend this provision to those domains in future versions",
+ "of the GPL, as needed to protect the freedom of users.",
+ "",
+ " Finally, every program is threatened constantly by software patents.",
+ "States should not allow patents to restrict development and use of",
+ "software on general-purpose computers, but in those that do, we wish to",
+ "avoid the special danger that patents applied to a free program could",
+ "make it effectively proprietary. To prevent this, the GPL assures that",
+ "patents cannot be used to render the program non-free.",
+ "",
+ " The precise terms and conditions for copying, distribution and",
+ "modification follow.",
+ "",
+ " TERMS AND CONDITIONS",
+ "",
+ " 0. Definitions.",
+ "",
+ " \"This License\" refers to version 3 of the GNU General Public License.",
+ "",
+ " \"Copyright\" also means copyright-like laws that apply to other kinds of",
+ "works, such as semiconductor masks.",
+ "",
+ " \"The Program\" refers to any copyrightable work licensed under this",
+ "License. Each licensee is addressed as \"you\". \"Licensees\" and",
+ "\"recipients\" may be individuals or organizations.",
+ "",
+ " To \"modify\" a work means to copy from or adapt all or part of the work",
+ "in a fashion requiring copyright permission, other than the making of an",
+ "exact copy. The resulting work is called a \"modified version\" of the",
+ "earlier work or a work \"based on\" the earlier work.",
+ "",
+ " A \"covered work\" means either the unmodified Program or a work based",
+ "on the Program.",
+ "",
+ " To \"propagate\" a work means to do anything with it that, without",
+ "permission, would make you directly or secondarily liable for",
+ "infringement under applicable copyright law, except executing it on a",
+ "computer or modifying a private copy. Propagation includes copying,",
+ "distribution (with or without modification), making available to the",
+ "public, and in some countries other activities as well.",
+ "",
+ " To \"convey\" a work means any kind of propagation that enables other",
+ "parties to make or receive copies. Mere interaction with a user through",
+ "a computer network, with no transfer of a copy, is not conveying.",
+ "",
+ " An interactive user interface displays \"Appropriate Legal Notices\"",
+ "to the extent that it includes a convenient and prominently visible",
+ "feature that (1) displays an appropriate copyright notice, and (2)",
+ "tells the user that there is no warranty for the work (except to the",
+ "extent that warranties are provided), that licensees may convey the",
+ "work under this License, and how to view a copy of this License. If",
+ "the interface presents a list of user commands or options, such as a",
+ "menu, a prominent item in the list meets this criterion.",
+ "",
+ " 1. Source Code.",
+ "",
+ " The \"source code\" for a work means the preferred form of the work",
+ "for making modifications to it. \"Object code\" means any non-source",
+ "form of a work.",
+ "",
+ " A \"Standard Interface\" means an interface that either is an official",
+ "standard defined by a recognized standards body, or, in the case of",
+ "interfaces specified for a particular programming language, one that",
+ "is widely used among developers working in that language.",
+ "",
+ " The \"System Libraries\" of an executable work include anything, other",
+ "than the work as a whole, that (a) is included in the normal form of",
+ "packaging a Major Component, but which is not part of that Major",
+ "Component, and (b) serves only to enable use of the work with that",
+ "Major Component, or to implement a Standard Interface for which an",
+ "implementation is available to the public in source code form. A",
+ "\"Major Component\", in this context, means a major essential component",
+ "(kernel, window system, and so on) of the specific operating system",
+ "(if any) on which the executable work runs, or a compiler used to",
+ "produce the work, or an object code interpreter used to run it.",
+ "",
+ " The \"Corresponding Source\" for a work in object code form means all",
+ "the source code needed to generate, install, and (for an executable",
+ "work) run the object code and to modify the work, including scripts to",
+ "control those activities. However, it does not include the work's",
+ "System Libraries, or general-purpose tools or generally available free",
+ "programs which are used unmodified in performing those activities but",
+ "which are not part of the work. For example, Corresponding Source",
+ "includes interface definition files associated with source files for",
+ "the work, and the source code for shared libraries and dynamically",
+ "linked subprograms that the work is specifically designed to require,",
+ "such as by intimate data communication or control flow between those",
+ "subprograms and other parts of the work.",
+ "",
+ " The Corresponding Source need not include anything that users",
+ "can regenerate automatically from other parts of the Corresponding",
+ "Source.",
+ "",
+ " The Corresponding Source for a work in source code form is that",
+ "same work.",
+ "",
+ " 2. Basic Permissions.",
+ "",
+ " All rights granted under this License are granted for the term of",
+ "copyright on the Program, and are irrevocable provided the stated",
+ "conditions are met. This License explicitly affirms your unlimited",
+ "permission to run the unmodified Program. The output from running a",
+ "covered work is covered by this License only if the output, given its",
+ "content, constitutes a covered work. This License acknowledges your",
+ "rights of fair use or other equivalent, as provided by copyright law.",
+ "",
+ " You may make, run and propagate covered works that you do not",
+ "convey, without conditions so long as your license otherwise remains",
+ "in force. You may convey covered works to others for the sole purpose",
+ "of having them make modifications exclusively for you, or provide you",
+ "with facilities for running those works, provided that you comply with",
+ "the terms of this License in conveying all material for which you do",
+ "not control copyright. Those thus making or running the covered works",
+ "for you must do so exclusively on your behalf, under your direction",
+ "and control, on terms that prohibit them from making any copies of",
+ "your copyrighted material outside their relationship with you.",
+ "",
+ " Conveying under any other circumstances is permitted solely under",
+ "the conditions stated below. Sublicensing is not allowed; section 10",
+ "makes it unnecessary.",
+ "",
+ " 3. Protecting Users' Legal Rights From Anti-Circumvention Law.",
+ "",
+ " No covered work shall be deemed part of an effective technological",
+ "measure under any applicable law fulfilling obligations under article",
+ "11 of the WIPO copyright treaty adopted on 20 December 1996, or",
+ "similar laws prohibiting or restricting circumvention of such",
+ "measures.",
+ "",
+ " When you convey a covered work, you waive any legal power to forbid",
+ "circumvention of technological measures to the extent such circumvention",
+ "is effected by exercising rights under this License with respect to",
+ "the covered work, and you disclaim any intention to limit operation or",
+ "modification of the work as a means of enforcing, against the work's",
+ "users, your or third parties' legal rights to forbid circumvention of",
+ "technological measures.",
+ "",
+ " 4. Conveying Verbatim Copies.",
+ "",
+ " You may convey verbatim copies of the Program's source code as you",
+ "receive it, in any medium, provided that you conspicuously and",
+ "appropriately publish on each copy an appropriate copyright notice;",
+ "keep intact all notices stating that this License and any",
+ "non-permissive terms added in accord with section 7 apply to the code;",
+ "keep intact all notices of the absence of any warranty; and give all",
+ "recipients a copy of this License along with the Program.",
+ "",
+ " You may charge any price or no price for each copy that you convey,",
+ "and you may offer support or warranty protection for a fee.",
+ "",
+ " 5. Conveying Modified Source Versions.",
+ "",
+ " You may convey a work based on the Program, or the modifications to",
+ "produce it from the Program, in the form of source code under the",
+ "terms of section 4, provided that you also meet all of these conditions:",
+ "",
+ " a) The work must carry prominent notices stating that you modified",
+ " it, and giving a relevant date.",
+ "",
+ " b) The work must carry prominent notices stating that it is",
+ " released under this License and any conditions added under section",
+ " 7. This requirement modifies the requirement in section 4 to",
+ " \"keep intact all notices\".",
+ "",
+ " c) You must license the entire work, as a whole, under this",
+ " License to anyone who comes into possession of a copy. This",
+ " License will therefore apply, along with any applicable section 7",
+ " additional terms, to the whole of the work, and all its parts,",
+ " regardless of how they are packaged. This License gives no",
+ " permission to license the work in any other way, but it does not",
+ " invalidate such permission if you have separately received it.",
+ "",
+ " d) If the work has interactive user interfaces, each must display",
+ " Appropriate Legal Notices; however, if the Program has interactive",
+ " interfaces that do not display Appropriate Legal Notices, your",
+ " work need not make them do so.",
+ "",
+ " A compilation of a covered work with other separate and independent",
+ "works, which are not by their nature extensions of the covered work,",
+ "and which are not combined with it such as to form a larger program,",
+ "in or on a volume of a storage or distribution medium, is called an",
+ "\"aggregate\" if the compilation and its resulting copyright are not",
+ "used to limit the access or legal rights of the compilation's users",
+ "beyond what the individual works permit. Inclusion of a covered work",
+ "in an aggregate does not cause this License to apply to the other",
+ "parts of the aggregate.",
+ "",
+ " 6. Conveying Non-Source Forms.",
+ "",
+ " You may convey a covered work in object code form under the terms",
+ "of sections 4 and 5, provided that you also convey the",
+ "machine-readable Corresponding Source under the terms of this License,",
+ "in one of these ways:",
+ "",
+ " a) Convey the object code in, or embodied in, a physical product",
+ " (including a physical distribution medium), accompanied by the",
+ " Corresponding Source fixed on a durable physical medium",
+ " customarily used for software interchange.",
+ "",
+ " b) Convey the object code in, or embodied in, a physical product",
+ " (including a physical distribution medium), accompanied by a",
+ " written offer, valid for at least three years and valid for as",
+ " long as you offer spare parts or customer support for that product",
+ " model, to give anyone who possesses the object code either (1) a",
+ " copy of the Corresponding Source for all the software in the",
+ " product that is covered by this License, on a durable physical",
+ " medium customarily used for software interchange, for a price no",
+ " more than your reasonable cost of physically performing this",
+ " conveying of source, or (2) access to copy the",
+ " Corresponding Source from a network server at no charge.",
+ "",
+ " c) Convey individual copies of the object code with a copy of the",
+ " written offer to provide the Corresponding Source. This",
+ " alternative is allowed only occasionally and noncommercially, and",
+ " only if you received the object code with such an offer, in accord",
+ " with subsection 6b.",
+ "",
+ " d) Convey the object code by offering access from a designated",
+ " place (gratis or for a charge), and offer equivalent access to the",
+ " Corresponding Source in the same way through the same place at no",
+ " further charge. You need not require recipients to copy the",
+ " Corresponding Source along with the object code. If the place to",
+ " copy the object code is a network server, the Corresponding Source",
+ " may be on a different server (operated by you or a third party)",
+ " that supports equivalent copying facilities, provided you maintain",
+ " clear directions next to the object code saying where to find the",
+ " Corresponding Source. Regardless of what server hosts the",
+ " Corresponding Source, you remain obligated to ensure that it is",
+ " available for as long as needed to satisfy these requirements.",
+ "",
+ " e) Convey the object code using peer-to-peer transmission, provided",
+ " you inform other peers where the object code and Corresponding",
+ " Source of the work are being offered to the general public at no",
+ " charge under subsection 6d.",
+ "",
+ " A separable portion of the object code, whose source code is excluded",
+ "from the Corresponding Source as a System Library, need not be",
+ "included in conveying the object code work.",
+ "",
+ " A \"User Product\" is either (1) a \"consumer product\", which means any",
+ "tangible personal property which is normally used for personal, family,",
+ "or household purposes, or (2) anything designed or sold for incorporation",
+ "into a dwelling. In determining whether a product is a consumer product,",
+ "doubtful cases shall be resolved in favor of coverage. For a particular",
+ "product received by a particular user, \"normally used\" refers to a",
+ "typical or common use of that class of product, regardless of the status",
+ "of the particular user or of the way in which the particular user",
+ "actually uses, or expects or is expected to use, the product. A product",
+ "is a consumer product regardless of whether the product has substantial",
+ "commercial, industrial or non-consumer uses, unless such uses represent",
+ "the only significant mode of use of the product.",
+ "",
+ " \"Installation Information\" for a User Product means any methods,",
+ "procedures, authorization keys, or other information required to install",
+ "and execute modified versions of a covered work in that User Product from",
+ "a modified version of its Corresponding Source. The information must",
+ "suffice to ensure that the continued functioning of the modified object",
+ "code is in no case prevented or interfered with solely because",
+ "modification has been made.",
+ "",
+ " If you convey an object code work under this section in, or with, or",
+ "specifically for use in, a User Product, and the conveying occurs as",
+ "part of a transaction in which the right of possession and use of the",
+ "User Product is transferred to the recipient in perpetuity or for a",
+ "fixed term (regardless of how the transaction is characterized), the",
+ "Corresponding Source conveyed under this section must be accompanied",
+ "by the Installation Information. But this requirement does not apply",
+ "if neither you nor any third party retains the ability to install",
+ "modified object code on the User Product (for example, the work has",
+ "been installed in ROM).",
+ "",
+ " The requirement to provide Installation Information does not include a",
+ "requirement to continue to provide support service, warranty, or updates",
+ "for a work that has been modified or installed by the recipient, or for",
+ "the User Product in which it has been modified or installed. Access to a",
+ "network may be denied when the modification itself materially and",
+ "adversely affects the operation of the network or violates the rules and",
+ "protocols for communication across the network.",
+ "",
+ " Corresponding Source conveyed, and Installation Information provided,",
+ "in accord with this section must be in a format that is publicly",
+ "documented (and with an implementation available to the public in",
+ "source code form), and must require no special password or key for",
+ "unpacking, reading or copying.",
+ "",
+ " 7. Additional Terms.",
+ "",
+ " \"Additional permissions\" are terms that supplement the terms of this",
+ "License by making exceptions from one or more of its conditions.",
+ "Additional permissions that are applicable to the entire Program shall",
+ "be treated as though they were included in this License, to the extent",
+ "that they are valid under applicable law. If additional permissions",
+ "apply only to part of the Program, that part may be used separately",
+ "under those permissions, but the entire Program remains governed by",
+ "this License without regard to the additional permissions.",
+ "",
+ " When you convey a copy of a covered work, you may at your option",
+ "remove any additional permissions from that copy, or from any part of",
+ "it. (Additional permissions may be written to require their own",
+ "removal in certain cases when you modify the work.) You may place",
+ "additional permissions on material, added by you to a covered work,",
+ "for which you have or can give appropriate copyright permission.",
+ "",
+ " Notwithstanding any other provision of this License, for material you",
+ "add to a covered work, you may (if authorized by the copyright holders of",
+ "that material) supplement the terms of this License with terms:",
+ "",
+ " a) Disclaiming warranty or limiting liability differently from the",
+ " terms of sections 15 and 16 of this License; or",
+ "",
+ " b) Requiring preservation of specified reasonable legal notices or",
+ " author attributions in that material or in the Appropriate Legal",
+ " Notices displayed by works containing it; or",
+ "",
+ " c) Prohibiting misrepresentation of the origin of that material, or",
+ " requiring that modified versions of such material be marked in",
+ " reasonable ways as different from the original version; or",
+ "",
+ " d) Limiting the use for publicity purposes of names of licensors or",
+ " authors of the material; or",
+ "",
+ " e) Declining to grant rights under trademark law for use of some",
+ " trade names, trademarks, or service marks; or",
+ "",
+ " f) Requiring indemnification of licensors and authors of that",
+ " material by anyone who conveys the material (or modified versions of",
+ " it) with contractual assumptions of liability to the recipient, for",
+ " any liability that these contractual assumptions directly impose on",
+ " those licensors and authors.",
+ "",
+ " All other non-permissive additional terms are considered \"further",
+ "restrictions\" within the meaning of section 10. If the Program as you",
+ "received it, or any part of it, contains a notice stating that it is",
+ "governed by this License along with a term that is a further",
+ "restriction, you may remove that term. If a license document contains",
+ "a further restriction but permits relicensing or conveying under this",
+ "License, you may add to a covered work material governed by the terms",
+ "of that license document, provided that the further restriction does",
+ "not survive such relicensing or conveying.",
+ "",
+ " If you add terms to a covered work in accord with this section, you",
+ "must place, in the relevant source files, a statement of the",
+ "additional terms that apply to those files, or a notice indicating",
+ "where to find the applicable terms.",
+ "",
+ " Additional terms, permissive or non-permissive, may be stated in the",
+ "form of a separately written license, or stated as exceptions;",
+ "the above requirements apply either way.",
+ "",
+ " 8. Termination.",
+ "",
+ " You may not propagate or modify a covered work except as expressly",
+ "provided under this License. Any attempt otherwise to propagate or",
+ "modify it is void, and will automatically terminate your rights under",
+ "this License (including any patent licenses granted under the third",
+ "paragraph of section 11).",
+ "",
+ " However, if you cease all violation of this License, then your",
+ "license from a particular copyright holder is reinstated (a)",
+ "provisionally, unless and until the copyright holder explicitly and",
+ "finally terminates your license, and (b) permanently, if the copyright",
+ "holder fails to notify you of the violation by some reasonable means",
+ "prior to 60 days after the cessation.",
+ "",
+ " Moreover, your license from a particular copyright holder is",
+ "reinstated permanently if the copyright holder notifies you of the",
+ "violation by some reasonable means, this is the first time you have",
+ "received notice of violation of this License (for any work) from that",
+ "copyright holder, and you cure the violation prior to 30 days after",
+ "your receipt of the notice.",
+ "",
+ " Termination of your rights under this section does not terminate the",
+ "licenses of parties who have received copies or rights from you under",
+ "this License. If your rights have been terminated and not permanently",
+ "reinstated, you do not qualify to receive new licenses for the same",
+ "material under section 10.",
+ "",
+ " 9. Acceptance Not Required for Having Copies.",
+ "",
+ " You are not required to accept this License in order to receive or",
+ "run a copy of the Program. Ancillary propagation of a covered work",
+ "occurring solely as a consequence of using peer-to-peer transmission",
+ "to receive a copy likewise does not require acceptance. However,",
+ "nothing other than this License grants you permission to propagate or",
+ "modify any covered work. These actions infringe copyright if you do",
+ "not accept this License. Therefore, by modifying or propagating a",
+ "covered work, you indicate your acceptance of this License to do so.",
+ "",
+ " 10. Automatic Licensing of Downstream Recipients.",
+ "",
+ " Each time you convey a covered work, the recipient automatically",
+ "receives a license from the original licensors, to run, modify and",
+ "propagate that work, subject to this License. You are not responsible",
+ "for enforcing compliance by third parties with this License.",
+ "",
+ " An \"entity transaction\" is a transaction transferring control of an",
+ "organization, or substantially all assets of one, or subdividing an",
+ "organization, or merging organizations. If propagation of a covered",
+ "work results from an entity transaction, each party to that",
+ "transaction who receives a copy of the work also receives whatever",
+ "licenses to the work the party's predecessor in interest had or could",
+ "give under the previous paragraph, plus a right to possession of the",
+ "Corresponding Source of the work from the predecessor in interest, if",
+ "the predecessor has it or can get it with reasonable efforts.",
+ "",
+ " You may not impose any further restrictions on the exercise of the",
+ "rights granted or affirmed under this License. For example, you may",
+ "not impose a license fee, royalty, or other charge for exercise of",
+ "rights granted under this License, and you may not initiate litigation",
+ "(including a cross-claim or counterclaim in a lawsuit) alleging that",
+ "any patent claim is infringed by making, using, selling, offering for",
+ "sale, or importing the Program or any portion of it.",
+ "",
+ " 11. Patents.",
+ "",
+ " A \"contributor\" is a copyright holder who authorizes use under this",
+ "License of the Program or a work on which the Program is based. The",
+ "work thus licensed is called the contributor's \"contributor version\".",
+ "",
+ " A contributor's \"essential patent claims\" are all patent claims",
+ "owned or controlled by the contributor, whether already acquired or",
+ "hereafter acquired, that would be infringed by some manner, permitted",
+ "by this License, of making, using, or selling its contributor version,",
+ "but do not include claims that would be infringed only as a",
+ "consequence of further modification of the contributor version. For",
+ "purposes of this definition, \"control\" includes the right to grant",
+ "patent sublicenses in a manner consistent with the requirements of",
+ "this License.",
+ "",
+ " Each contributor grants you a non-exclusive, worldwide, royalty-free",
+ "patent license under the contributor's essential patent claims, to",
+ "make, use, sell, offer for sale, import and otherwise run, modify and",
+ "propagate the contents of its contributor version.",
+ "",
+ " In the following three paragraphs, a \"patent license\" is any express",
+ "agreement or commitment, however denominated, not to enforce a patent",
+ "(such as an express permission to practice a patent or covenant not to",
+ "sue for patent infringement). To \"grant\" such a patent license to a",
+ "party means to make such an agreement or commitment not to enforce a",
+ "patent against the party.",
+ "",
+ " If you convey a covered work, knowingly relying on a patent license,",
+ "and the Corresponding Source of the work is not available for anyone",
+ "to copy, free of charge and under the terms of this License, through a",
+ "publicly available network server or other readily accessible means,",
+ "then you must either (1) cause the Corresponding Source to be so",
+ "available, or (2) arrange to deprive yourself of the benefit of the",
+ "patent license for this particular work, or (3) arrange, in a manner",
+ "consistent with the requirements of this License, to extend the patent",
+ "license to downstream recipients. \"Knowingly relying\" means you have",
+ "actual knowledge that, but for the patent license, your conveying the",
+ "covered work in a country, or your recipient's use of the covered work",
+ "in a country, would infringe one or more identifiable patents in that",
+ "country that you have reason to believe are valid.",
+ "",
+ " If, pursuant to or in connection with a single transaction or",
+ "arrangement, you convey, or propagate by procuring conveyance of, a",
+ "covered work, and grant a patent license to some of the parties",
+ "receiving the covered work authorizing them to use, propagate, modify",
+ "or convey a specific copy of the covered work, then the patent license",
+ "you grant is automatically extended to all recipients of the covered",
+ "work and works based on it.",
+ "",
+ " A patent license is \"discriminatory\" if it does not include within",
+ "the scope of its coverage, prohibits the exercise of, or is",
+ "conditioned on the non-exercise of one or more of the rights that are",
+ "specifically granted under this License. You may not convey a covered",
+ "work if you are a party to an arrangement with a third party that is",
+ "in the business of distributing software, under which you make payment",
+ "to the third party based on the extent of your activity of conveying",
+ "the work, and under which the third party grants, to any of the",
+ "parties who would receive the covered work from you, a discriminatory",
+ "patent license (a) in connection with copies of the covered work",
+ "conveyed by you (or copies made from those copies), or (b) primarily",
+ "for and in connection with specific products or compilations that",
+ "contain the covered work, unless you entered into that arrangement,",
+ "or that patent license was granted, prior to 28 March 2007.",
+ "",
+ " Nothing in this License shall be construed as excluding or limiting",
+ "any implied license or other defenses to infringement that may",
+ "otherwise be available to you under applicable patent law.",
+ "",
+ " 12. No Surrender of Others' Freedom.",
+ "",
+ " If conditions are imposed on you (whether by court order, agreement or",
+ "otherwise) that contradict the conditions of this License, they do not",
+ "excuse you from the conditions of this License. If you cannot convey a",
+ "covered work so as to satisfy simultaneously your obligations under this",
+ "License and any other pertinent obligations, then as a consequence you may",
+ "not convey it at all. For example, if you agree to terms that obligate you",
+ "to collect a royalty for further conveying from those to whom you convey",
+ "the Program, the only way you could satisfy both those terms and this",
+ "License would be to refrain entirely from conveying the Program.",
+ "",
+ " 13. Use with the GNU Affero General Public License.",
+ "",
+ " Notwithstanding any other provision of this License, you have",
+ "permission to link or combine any covered work with a work licensed",
+ "under version 3 of the GNU Affero General Public License into a single",
+ "combined work, and to convey the resulting work. The terms of this",
+ "License will continue to apply to the part which is the covered work,",
+ "but the special requirements of the GNU Affero General Public License,",
+ "section 13, concerning interaction through a network will apply to the",
+ "combination as such.",
+ "",
+ " 14. Revised Versions of this License.",
+ "",
+ " The Free Software Foundation may publish revised and/or new versions of",
+ "the GNU General Public License from time to time. Such new versions will",
+ "be similar in spirit to the present version, but may differ in detail to",
+ "address new problems or concerns.",
+ "",
+ " Each version is given a distinguishing version number. If the",
+ "Program specifies that a certain numbered version of the GNU General",
+ "Public License \"or any later version\" applies to it, you have the",
+ "option of following the terms and conditions either of that numbered",
+ "version or of any later version published by the Free Software",
+ "Foundation. If the Program does not specify a version number of the",
+ "GNU General Public License, you may choose any version ever published",
+ "by the Free Software Foundation.",
+ "",
+ " If the Program specifies that a proxy can decide which future",
+ "versions of the GNU General Public License can be used, that proxy's",
+ "public statement of acceptance of a version permanently authorizes you",
+ "to choose that version for the Program.",
+ "",
+ " Later license versions may give you additional or different",
+ "permissions. However, no additional obligations are imposed on any",
+ "author or copyright holder as a result of your choosing to follow a",
+ "later version.",
+ "",
+ " 15. Disclaimer of Warranty.",
+ "",
+ " THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY",
+ "APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT",
+ "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY",
+ "OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,",
+ "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR",
+ "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM",
+ "IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF",
+ "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.",
+ "",
+ " 16. Limitation of Liability.",
+ "",
+ " IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING",
+ "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS",
+ "THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY",
+ "GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE",
+ "USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF",
+ "DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD",
+ "PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),",
+ "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF",
+ "SUCH DAMAGES.",
+ "",
+ " 17. Interpretation of Sections 15 and 16.",
+ "",
+ " If the disclaimer of warranty and limitation of liability provided",
+ "above cannot be given local legal effect according to their terms,",
+ "reviewing courts shall apply local law that most closely approximates",
+ "an absolute waiver of all civil liability in connection with the",
+ "Program, unless a warranty or assumption of liability accompanies a",
+ "copy of the Program in return for a fee.",
+ "",
+ " END OF TERMS AND CONDITIONS",
+ "",
+ " How to Apply These Terms to Your New Programs",
+ "",
+ " If you develop a new program, and you want it to be of the greatest",
+ "possible use to the public, the best way to achieve this is to make it",
+ "free software which everyone can redistribute and change under these terms.",
+ "",
+ " To do so, attach the following notices to the program. It is safest",
+ "to attach them to the start of each source file to most effectively",
+ "state the exclusion of warranty; and each file should have at least",
+ "the \"copyright\" line and a pointer to where the full notice is found.",
+ "",
+ " <one line to give the program's name and a brief idea of what it does.>",
+ " Copyright (C) <year> <name of author>",
+ "",
+ " This program is free software: you can redistribute it and/or modify",
+ " it under the terms of the GNU General Public License as published by",
+ " the Free Software Foundation, either version 3 of the License, or",
+ " (at your option) any later version.",
+ "",
+ " This program is distributed in the hope that it will be useful,",
+ " but WITHOUT ANY WARRANTY; without even the implied warranty of",
+ " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
+ " GNU General Public License for more details.",
+ "",
+ " You should have received a copy of the GNU General Public License",
+ " along with this program. If not, see <http://www.gnu.org/licenses/>.",
+ "",
+ "Also add information on how to contact you by electronic and paper mail.",
+ "",
+ " If the program does terminal interaction, make it output a short",
+ "notice like this when it starts in an interactive mode:",
+ "",
+ " <program> Copyright (C) <year> <name of author>",
+ " This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.",
+ " This is free software, and you are welcome to redistribute it",
+ " under certain conditions; type `show c' for details.",
+ "",
+ "The hypothetical commands `show w' and `show c' should show the appropriate",
+ "parts of the General Public License. Of course, your program's commands",
+ "might be different; for a GUI interface, you would use an \"about box\".",
+ "",
+ " You should also get your employer (if you work as a programmer) or school,",
+ "if any, to sign a \"copyright disclaimer\" for the program, if necessary.",
+ "For more information on this, and how to apply and follow the GNU GPL, see",
+ "<http://www.gnu.org/licenses/>.",
+ "",
+ " The GNU General Public License does not permit incorporating your program",
+ "into proprietary programs. If your program is a subroutine library, you",
+ "may consider it more useful to permit linking proprietary applications with",
+ "the library. If this is what you want to do, use the GNU Lesser General",
+ "Public License instead of this License. But first, please read",
+ "<http://www.gnu.org/philosophy/why-not-lgpl.html>.",
+ 0};
diff --git a/src/COPYING.hh.dist b/src/COPYING.hh.dist
new file mode 100644
index 0000000..ed4cdbc
--- /dev/null
+++ b/src/COPYING.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_COPYING_hh
+#define PPL_COPYING_hh 1
+extern const char* const COPYING_array[675];
+#endif // !defined(PPL_COPYING_hh)
diff --git a/src/CO_Tree.cc b/src/CO_Tree.cc
new file mode 100644
index 0000000..a7e5ecd
--- /dev/null
+++ b/src/CO_Tree.cc
@@ -0,0 +1,1337 @@
+/* CO_Tree class implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "CO_Tree_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::CO_Tree::external_memory_in_bytes() const {
+ dimension_type memory_size = 0;
+ if (reserved_size != 0) {
+ // Add the size of data[]
+ memory_size += (reserved_size + 1)*sizeof(data[0]);
+ // Add the size of indexes[]
+ memory_size += (reserved_size + 2)*sizeof(indexes[0]);
+ for (const_iterator itr = begin(), itr_end = end(); itr != itr_end; ++itr)
+ memory_size += PPL::external_memory_in_bytes(*itr);
+ }
+ return memory_size;
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::insert(iterator itr, dimension_type key1) {
+ PPL_ASSERT(key1 != unused_index);
+
+ if (empty()) {
+ insert_in_empty_tree(key1, Coefficient_zero());
+ return iterator(*this);
+ }
+
+ if (itr == end())
+ return insert(key1);
+
+ iterator candidate1 = bisect_near(itr, key1);
+
+ if (key1 == candidate1.index())
+ return candidate1;
+
+ dimension_type candidate2_index = dfs_index(candidate1);
+
+ if (key1 < candidate1.index()) {
+ --candidate2_index;
+ while (indexes[candidate2_index] == unused_index)
+ --candidate2_index;
+ }
+ else {
+ ++candidate2_index;
+ while (indexes[candidate2_index] == unused_index)
+ ++candidate2_index;
+ }
+
+ tree_iterator candidate1_node(candidate1, *this);
+
+ PPL_ASSERT(candidate2_index <= reserved_size + 1);
+
+ if (candidate2_index == 0 || candidate2_index > reserved_size)
+ // Use candidate1
+ return iterator(insert_precise(key1, Coefficient_zero(),
+ candidate1_node));
+
+ tree_iterator candidate2_node(*this, candidate2_index);
+
+ // Adjacent nodes in an in-order visit of a tree always have different
+ // heights. This fact can be easily proven by induction on the tree's
+ // height, using the definition of the in-order layout.
+ PPL_ASSERT(candidate1_node.get_offset() != candidate2_node.get_offset());
+
+ if (candidate1_node.get_offset() < candidate2_node.get_offset()) {
+ PPL_ASSERT(candidate1_node.depth() > candidate2_node.depth());
+ // candidate1_node is deeper in the tree than candidate2_node, so use
+ // candidate1_node.
+ return iterator(insert_precise(key1, Coefficient_zero(),
+ candidate1_node));
+ }
+ else {
+ PPL_ASSERT(candidate1_node.depth() < candidate2_node.depth());
+ // candidate2_node is deeper in the tree than candidate1_node, so use
+ // candidate2_node.
+ return iterator(insert_precise(key1, Coefficient_zero(),
+ candidate2_node));
+ }
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::insert(iterator itr, dimension_type key1,
+ data_type_const_reference data1) {
+ PPL_ASSERT(key1 != unused_index);
+
+ if (empty()) {
+ insert_in_empty_tree(key1, data1);
+ return iterator(*this);
+ }
+
+ if (itr == end())
+ return insert(key1, data1);
+
+ iterator candidate1 = bisect_near(itr, key1);
+
+ if (key1 == candidate1.index()) {
+ *candidate1 = data1;
+ return candidate1;
+ }
+
+ dimension_type candidate2_index = dfs_index(candidate1);
+
+ if (key1 < candidate1.index()) {
+ --candidate2_index;
+ while (indexes[candidate2_index] == unused_index)
+ --candidate2_index;
+ }
+ else {
+ ++candidate2_index;
+ while (indexes[candidate2_index] == unused_index)
+ ++candidate2_index;
+ }
+
+ tree_iterator candidate1_node(candidate1, *this);
+
+ if (candidate2_index == 0 || candidate2_index > reserved_size)
+ // Use candidate1
+ return iterator(insert_precise(key1, data1, candidate1_node));
+
+ tree_iterator candidate2_node(*this, candidate2_index);
+
+ // Adjacent nodes in an in-order visit of a tree always have different
+ // heights. This fact can be easily proven by induction on the tree's
+ // height, using the definition of the in-order layout.
+ PPL_ASSERT(candidate1_node.get_offset() != candidate2_node.get_offset());
+
+ if (candidate1_node.get_offset() < candidate2_node.get_offset()) {
+ PPL_ASSERT(candidate1_node.depth() > candidate2_node.depth());
+ // candidate1_node is deeper in the tree than candidate2_node, so
+ // use candidate1_node.
+ return iterator(insert_precise(key1, data1, candidate1_node));
+ }
+ else {
+ PPL_ASSERT(candidate1_node.depth() < candidate2_node.depth());
+ // candidate2_node is deeper in the tree than candidate1_node, so
+ // use candidate2_node.
+ return iterator(insert_precise(key1, data1, candidate2_node));
+ }
+}
+
+void
+PPL::CO_Tree::erase_element_and_shift_left(dimension_type key) {
+ iterator itr = erase(key);
+ if (itr == end())
+ return;
+ const dimension_type i = dfs_index(itr);
+ dimension_type* p = indexes + i;
+ const dimension_type* const p_end = indexes + (reserved_size + 1);
+ for ( ; p != p_end; ++p)
+ if (*p != unused_index)
+ --(*p);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::CO_Tree::increase_keys_from(dimension_type key, dimension_type n) {
+ if (empty())
+ return;
+ dimension_type* p = indexes + reserved_size;
+ while (*p == unused_index)
+ --p;
+ while (p != indexes && *p >= key) {
+ *p += n;
+ --p;
+ while (*p == unused_index)
+ --p;
+ }
+ PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::CO_Tree::bisect_in(dimension_type first, dimension_type last,
+ dimension_type key) const {
+ PPL_ASSERT(first != 0);
+ PPL_ASSERT(last <= reserved_size);
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(indexes[first] != unused_index);
+ PPL_ASSERT(indexes[last] != unused_index);
+
+ while (first < last) {
+ dimension_type half = (first + last) / 2;
+ dimension_type new_half = half;
+
+ while (indexes[new_half] == unused_index)
+ ++new_half;
+
+ if (indexes[new_half] == key)
+ return new_half;
+
+ if (indexes[new_half] > key) {
+
+ while (indexes[half] == unused_index)
+ --half;
+
+ last = half;
+
+ }
+ else {
+
+ ++new_half;
+ while (indexes[new_half] == unused_index)
+ ++new_half;
+
+ first = new_half;
+ }
+ }
+
+ // It is important that last is returned instead of first, because first
+ // may have increased beyond last, even beyond the original value of last
+ // at the beginning of this method.
+ return last;
+}
+
+PPL::dimension_type
+PPL::CO_Tree::bisect_near(dimension_type hint, dimension_type key) const {
+ PPL_ASSERT(hint != 0);
+ PPL_ASSERT(hint <= reserved_size);
+ PPL_ASSERT(indexes[hint] != unused_index);
+
+ if (indexes[hint] == key)
+ return hint;
+
+ dimension_type new_hint;
+ dimension_type offset = 1;
+
+ if (indexes[hint] > key) {
+ // The searched element is before `hint'.
+
+ while (true) {
+
+ if (hint <= offset) {
+ // The searched element is in (0,hint).
+ new_hint = hint;
+ hint = 1;
+ // The searched element is in [hint,new_hint).
+ while (indexes[hint] == unused_index)
+ ++hint;
+ if (indexes[hint] >= key)
+ return hint;
+ // The searched element is in (hint,new_hint) and both indexes point
+ // to valid elements.
+ break;
+ }
+ else
+ new_hint = hint - offset;
+
+ PPL_ASSERT(new_hint > 0);
+ PPL_ASSERT(new_hint <= reserved_size);
+
+ // Find the element at `new_hint' (or the first after it).
+ while (indexes[new_hint] == unused_index)
+ ++new_hint;
+
+ PPL_ASSERT(new_hint <= hint);
+
+ if (indexes[new_hint] == key)
+ return new_hint;
+ else
+ if (indexes[new_hint] < key) {
+ // The searched element is in (new_hint,hint)
+ using std::swap;
+ swap(hint, new_hint);
+ // The searched element is now in (hint,new_hint).
+ break;
+ }
+
+ hint = new_hint;
+ offset *= 2;
+ }
+
+ }
+ else {
+ // The searched element is after `hint'.
+ while (true) {
+
+ if (hint + offset > reserved_size) {
+ // The searched element is in (hint,reserved_size+1).
+ new_hint = reserved_size;
+ // The searched element is in (hint,new_hint].
+ while (indexes[new_hint] == unused_index)
+ --new_hint;
+ if (indexes[new_hint] <= key)
+ return new_hint;
+ // The searched element is in (hint,new_hint) and both indexes point
+ // to valid elements.
+ break;
+ }
+ else
+ new_hint = hint + offset;
+
+ PPL_ASSERT(new_hint > 0);
+ PPL_ASSERT(new_hint <= reserved_size);
+
+ // Find the element at `new_hint' (or the first after it).
+ while (indexes[new_hint] == unused_index)
+ --new_hint;
+
+ PPL_ASSERT(hint <= new_hint);
+
+ if (indexes[new_hint] == key)
+ return new_hint;
+ else
+ if (indexes[new_hint] > key)
+ // The searched element is in (hint,new_hint).
+ break;
+
+ hint = new_hint;
+ offset *= 2;
+ }
+ }
+ // The searched element is in (hint,new_hint).
+ PPL_ASSERT(hint > 0);
+ PPL_ASSERT(hint < new_hint);
+ PPL_ASSERT(new_hint <= reserved_size);
+ PPL_ASSERT(indexes[hint] != unused_index);
+ PPL_ASSERT(indexes[new_hint] != unused_index);
+
+ ++hint;
+ while (indexes[hint] == unused_index)
+ ++hint;
+
+ if (hint == new_hint)
+ return hint;
+
+ --new_hint;
+ while (indexes[new_hint] == unused_index)
+ --new_hint;
+
+ PPL_ASSERT(hint <= new_hint);
+ PPL_ASSERT(indexes[hint] != unused_index);
+ PPL_ASSERT(indexes[new_hint] != unused_index);
+
+ return bisect_in(hint, new_hint, key);
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::insert_precise(dimension_type key1,
+ data_type_const_reference data1,
+ tree_iterator itr) {
+ PPL_ASSERT(key1 != unused_index);
+ PPL_ASSERT(!empty());
+
+#ifndef NDEBUG
+ // Check that `itr' is a correct hint.
+ tree_iterator itr2(*this);
+ itr2.go_down_searching_key(key1);
+ PPL_ASSERT(itr == itr2);
+#endif
+
+ if (itr.index() == key1) {
+ // Replacement, rather than insertion.
+ *itr = data1;
+ PPL_ASSERT(OK());
+ return itr;
+ }
+
+ // Proper insertion: check if it would invalidate `data1'.
+ const bool invalidating
+ = (data <= &data1) && (&data1 < data + (reserved_size + 1));
+
+ if (!invalidating)
+ return insert_precise_aux(key1, data1, itr);
+
+ // `data1' could be invalidated by the insert, because it is
+ // a coefficient of this row. Avoid the issue by copying it.
+ data_type data1_copy = data1;
+
+#ifndef NDEBUG
+ dimension_type i = &data1 - data;
+ dimension_type key2 = indexes[i];
+ PPL_ASSERT(key2 != unused_index);
+ // This is true since `key1' is not in the tree.
+ PPL_ASSERT(key2 != key1);
+#endif
+
+ // Insert a dummy coefficient.
+ // NOTE: this may invalidate `data1', because it may reallocate the tree
+ // and/or move coefficients during rebalancing.
+ itr = insert_precise_aux(key1, Coefficient_zero(), itr);
+
+ PPL_ASSERT(itr.index() == key1);
+
+ // Swap the correct coefficient in place.
+ using std::swap;
+ swap(*itr, data1_copy);
+
+ PPL_ASSERT(OK());
+ return itr;
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::insert_precise_aux(dimension_type key1,
+ data_type_const_reference data1,
+ tree_iterator itr) {
+ PPL_ASSERT(key1 != unused_index);
+ PPL_ASSERT(!empty());
+ // This is a proper insert.
+ PPL_ASSERT(itr.index() != key1);
+ // `data1' is not going to be invalidated.
+ PPL_ASSERT(!(data <= &data1 && &data1 < data + (reserved_size + 1)));
+
+ if (is_greater_than_ratio(size_ + 1, reserved_size, max_density_percent)) {
+ rebuild_bigger_tree();
+ // `itr' was invalidated by the rebuild operation
+ itr.get_root();
+ itr.go_down_searching_key(key1);
+ PPL_ASSERT(itr.index() != key1);
+ }
+
+ PPL_ASSERT(!is_greater_than_ratio(size_ + 1, reserved_size,
+ max_density_percent));
+
+ ++size_;
+
+ if (!itr.is_leaf()) {
+ if (key1 < itr.index())
+ itr.get_left_child();
+ else
+ itr.get_right_child();
+ PPL_ASSERT(itr.index() == unused_index);
+
+ new (&(*itr)) data_type(data1);
+ // Set the index only if the construction was successful.
+ itr.index() = key1;
+ }
+ else {
+ itr = rebalance(itr, key1, data1);
+ itr.go_down_searching_key(key1);
+ PPL_ASSERT(itr.index() == key1);
+ }
+ PPL_ASSERT(OK());
+
+ return itr;
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::erase(tree_iterator itr) {
+ PPL_ASSERT(itr.index() != unused_index);
+
+ PPL_ASSERT(size_ != 0);
+
+ if (size_ == 1) {
+ // Deleting the only element of this tree, now it is empty.
+ clear();
+ return end();
+ }
+
+ if (is_less_than_ratio(size_ - 1, reserved_size, min_density_percent)
+ && !is_greater_than_ratio(size_ - 1, reserved_size/2,
+ max_density_percent)) {
+
+ const dimension_type key = itr.index();
+
+ PPL_ASSERT(!is_greater_than_ratio(size_, reserved_size,
+ max_density_percent));
+
+ rebuild_smaller_tree();
+ itr.get_root();
+ itr.go_down_searching_key(key);
+
+ PPL_ASSERT(itr.index() == key);
+ }
+
+#ifndef NDEBUG
+ if (size_ > 1)
+ PPL_ASSERT(!is_less_than_ratio(size_ - 1, reserved_size,
+ min_density_percent)
+ || is_greater_than_ratio(size_ - 1, reserved_size/2,
+ max_density_percent));
+#endif
+
+ const dimension_type deleted_key = itr.index();
+ tree_iterator deleted_node = itr;
+ (*itr).~data_type();
+ while (true) {
+ dimension_type& current_key = itr.index();
+ data_type& current_data = *itr;
+ if (itr.is_leaf())
+ break;
+ itr.get_left_child();
+ if (itr.index() != unused_index)
+ // The left child has a value.
+ itr.follow_right_children_with_value();
+ else {
+ // The left child has not a value, try the right child.
+ itr.get_parent();
+ itr.get_right_child();
+ if (itr.index() != unused_index)
+ // The right child has a value.
+ itr.follow_left_children_with_value();
+ else {
+ // The right child has not a value, too.
+ itr.get_parent();
+ break;
+ }
+ }
+ using std::swap;
+ swap(current_key, itr.index());
+ move_data_element(current_data, *itr);
+ }
+
+ PPL_ASSERT(itr.index() != unused_index);
+ itr.index() = unused_index;
+ --size_;
+
+ PPL_ASSERT(OK());
+
+ itr = rebalance(itr, 0, Coefficient_zero());
+
+ if (itr.get_offset() < deleted_node.get_offset())
+ // deleted_node is an ancestor of itr
+ itr = deleted_node;
+
+ itr.go_down_searching_key(deleted_key);
+
+ iterator result(itr);
+
+ if (result.index() < deleted_key)
+ ++result;
+
+ PPL_ASSERT(OK());
+ PPL_ASSERT(result == end() || result.index() > deleted_key);
+#ifndef NDEBUG
+ if (!empty()) {
+ iterator last = end();
+ --last;
+ PPL_ASSERT((result == end()) == (last.index() < deleted_key));
+ }
+#endif
+
+ return result;
+}
+
+void
+PPL::CO_Tree::init(dimension_type n) {
+ indexes = NULL;
+ data = NULL;
+ size_ = 0;
+ reserved_size = 0;
+ max_depth = 0;
+
+ if (n > 0) {
+ const dimension_type max_d = integer_log2(n) + 1;
+ const height_t new_max_depth = static_cast<height_t>(max_d);
+ const dimension_type new_reserved_size
+ = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+ // If this throws, *this will be the empty tree.
+ indexes = new dimension_type[new_reserved_size + 2];
+ try {
+ data = data_allocator.allocate(new_reserved_size + 1);
+ }
+ catch (...) {
+ delete[] indexes;
+ indexes = 0;
+ PPL_ASSERT(OK());
+ throw;
+ }
+ max_depth = new_max_depth;
+ reserved_size = new_reserved_size;
+
+ // Mark all pairs as unused.
+ for (dimension_type i = 1; i <= reserved_size; ++i)
+ indexes[i] = unused_index;
+
+ // These are used as markers by iterators.
+ indexes[0] = 0;
+ indexes[reserved_size + 1] = 0;
+ }
+
+ refresh_cached_iterators();
+
+ PPL_ASSERT(structure_OK());
+}
+
+void
+PPL::CO_Tree::destroy() {
+
+ if (reserved_size != 0) {
+ for (dimension_type i = 1; i <= reserved_size; ++i) {
+ if (indexes[i] != unused_index)
+ data[i].~data_type();
+ }
+
+ delete[] indexes;
+ data_allocator.deallocate(data, reserved_size + 1);
+ }
+}
+
+bool
+PPL::CO_Tree::structure_OK() const {
+
+ if (size_ > reserved_size)
+ return false;
+
+ if (reserved_size == 0) {
+ if (indexes != NULL)
+ return false;
+ if (data != NULL)
+ return false;
+ if (max_depth != 0)
+ return false;
+
+ return true;
+ }
+
+ if (reserved_size < 3)
+ return false;
+
+ if (reserved_size != (static_cast<dimension_type>(1) << max_depth) - 1)
+ return false;
+
+ if (data == NULL)
+ return false;
+
+ if (indexes == NULL)
+ return false;
+
+ if (max_depth == 0)
+ return false;
+
+ if (size_ == 0) {
+
+ // This const_cast could be removed by adding a const_tree_iterator,
+ // but it would add much code duplication without a real need.
+ tree_iterator itr(*const_cast<CO_Tree*>(this));
+ if (itr.index() != unused_index)
+ return false;
+
+ }
+ else {
+ // This const_cast could be removed by adding a const_tree_iterator,
+ // but it would add much code duplication without a real need.
+ tree_iterator itr(*const_cast<CO_Tree*>(this));
+ const dimension_type real_size = count_used_in_subtree(itr);
+ if (real_size != size_)
+ // There are \p real_size elements in the tree that are reachable by the
+ // root, but size is \p size.
+ return false;
+ }
+
+ if (size_ != 0) {
+ const_iterator itr = begin();
+ const_iterator itr_end = end();
+
+ if (itr != itr_end) {
+ dimension_type last_index = itr.index();
+ for (++itr; itr != itr_end; ++itr) {
+ if (last_index >= itr.index())
+ // Found index \p itr->first after index \p last_index.
+ return false;
+ last_index = itr.index();
+ }
+ }
+ }
+
+ if (const_iterator(cached_end) != const_iterator(*this, reserved_size + 1))
+ return false;
+ if (cached_const_end != const_iterator(*this, reserved_size + 1))
+ return false;
+
+ return true;
+}
+
+bool
+PPL::CO_Tree::OK() const {
+
+ if (!structure_OK())
+ return false;
+
+ {
+ dimension_type real_size = 0;
+
+ for (const_iterator itr = begin(), itr_end = end(); itr != itr_end; ++itr)
+ ++real_size;
+
+ if (real_size != size_)
+ // There are \p real_size elements in the tree, but size is \p size.
+ return false;
+ }
+
+ if (reserved_size > 0) {
+ if (is_greater_than_ratio(size_, reserved_size, max_density_percent)
+ && reserved_size != 3)
+ // Found too high density.
+ return false;
+ if (is_less_than_ratio(size_, reserved_size, min_density_percent)
+ && !is_greater_than_ratio(size_, reserved_size/2, max_density_percent))
+ // Found too low density
+ return false;
+ }
+
+ return true;
+}
+
+unsigned
+PPL::CO_Tree::integer_log2(dimension_type n) {
+ PPL_ASSERT(n != 0);
+ unsigned result = 0;
+ while (n != 1) {
+ n /= 2;
+ ++result;
+ }
+ return result;
+}
+
+void
+PPL::CO_Tree::dump_subtree(tree_iterator itr) {
+ if (!itr.is_leaf()) {
+ itr.get_left_child();
+ dump_subtree(itr);
+ itr.get_parent();
+ }
+ std::cout << "At depth: " << itr.depth();
+ if (itr.index() == unused_index)
+ std::cout << " (no data)" << std::endl;
+ else
+ std::cout << " pair (" << itr.index() << "," << *itr << ")" << std::endl;
+ if (!itr.is_leaf()) {
+ itr.get_right_child();
+ dump_subtree(itr);
+ itr.get_parent();
+ }
+}
+
+void
+PPL::CO_Tree::rebuild_bigger_tree() {
+ if (reserved_size == 0) {
+ init(3);
+ PPL_ASSERT(structure_OK());
+ return;
+ }
+
+ const dimension_type new_reserved_size = reserved_size*2 + 1;
+
+ dimension_type* const new_indexes = new dimension_type[new_reserved_size + 2];
+
+ data_type* new_data;
+
+ try {
+ new_data = data_allocator.allocate(new_reserved_size + 1);
+ } catch (...) {
+ delete[] new_indexes;
+ throw;
+ }
+
+ new_indexes[1] = unused_index;
+
+ for (dimension_type i = 1, j = 2; i <= reserved_size; ++i, ++j) {
+ new_indexes[j] = indexes[i];
+ if (indexes[i] != unused_index)
+ move_data_element(new_data[j], data[i]);
+ ++j;
+ new_indexes[j] = unused_index;
+ }
+
+ // These are used as markers by iterators.
+ new_indexes[0] = 0;
+ new_indexes[new_reserved_size + 1] = 0;
+
+ delete[] indexes;
+ data_allocator.deallocate(data, reserved_size + 1);
+
+ indexes = new_indexes;
+ data = new_data;
+ reserved_size = new_reserved_size;
+ ++max_depth;
+
+ refresh_cached_iterators();
+
+ PPL_ASSERT(structure_OK());
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::rebalance(tree_iterator itr, dimension_type key,
+ data_type_const_reference value) {
+ // Trees with reserved size 3 need not to be rebalanced.
+ // This check is needed because they can't be shrunk, so they may violate
+ // the density thresholds, and this would prevent the following while from
+ // working correctly.
+ if (reserved_size == 3) {
+ PPL_ASSERT(OK());
+ return tree_iterator(*this);
+ }
+ PPL_ASSERT(itr.index() == unused_index || itr.is_leaf());
+ height_t itr_depth_minus_1 = itr.depth() - 1;
+ const height_t height = max_depth - itr_depth_minus_1;
+ dimension_type subtree_size;
+ dimension_type subtree_reserved_size = (static_cast<dimension_type>(1)
+ << height) - 1;
+ const bool deleting = itr.index() == unused_index;
+ PPL_ASSERT(deleting || key != unused_index);
+ if (deleting)
+ subtree_size = 0;
+ else
+ // The existing element and the element with index key we want to add.
+ subtree_size = 2;
+
+ while (is_greater_than_ratio(subtree_size, subtree_reserved_size,
+ max_density_percent
+ + ((itr_depth_minus_1
+ * (100 - max_density_percent))
+ / (max_depth - 1)))
+ || is_less_than_ratio(subtree_size, subtree_reserved_size,
+ min_density_percent
+ - ((itr_depth_minus_1
+ * (min_density_percent
+ - min_leaf_density_percent))
+ / (max_depth - 1)))) {
+ // The density in the tree is correct, so the while condition is always
+ // false for the root.
+ PPL_ASSERT(itr_depth_minus_1 != 0);
+ const bool is_right_brother = itr.is_right_child();
+ itr.get_parent();
+ if (is_right_brother)
+ itr.get_left_child();
+ else
+ itr.get_right_child();
+ subtree_size += count_used_in_subtree(itr);
+ itr.get_parent();
+ PPL_ASSERT(itr.index() != unused_index);
+ ++subtree_size;
+ subtree_reserved_size = 2*subtree_reserved_size + 1;
+ --itr_depth_minus_1;
+ PPL_ASSERT(itr.depth() - 1 == itr_depth_minus_1);
+ }
+
+ // Now the subtree rooted at itr has been chosen as the subtree to be
+ // rebalanced.
+
+ // Step 1: compact elements of this subtree in the rightmost end, from right
+ // to left.
+ const dimension_type last_index_in_subtree
+ = itr.dfs_index() + itr.get_offset() - 1;
+
+ const dimension_type first_unused
+ = compact_elements_in_the_rightmost_end(last_index_in_subtree,
+ subtree_size, key, value,
+ !deleting);
+
+ // Step 2: redistribute the elements, from left to right.
+ redistribute_elements_in_subtree(itr.dfs_index(), subtree_size,
+ first_unused + 1, key, value,
+ first_unused != last_index_in_subtree
+ - subtree_size);
+
+ PPL_ASSERT(OK());
+
+ return itr;
+}
+
+PPL::dimension_type
+PPL::CO_Tree
+::compact_elements_in_the_rightmost_end(dimension_type last_in_subtree,
+ dimension_type subtree_size,
+ dimension_type key,
+ data_type_const_reference value,
+ bool add_element) {
+
+ PPL_ASSERT(subtree_size != 0);
+
+ PPL_ASSERT(subtree_size != 1 || !add_element);
+
+ dimension_type* last_index_in_subtree = &(indexes[last_in_subtree]);
+ data_type* last_data_in_subtree = &(data[last_in_subtree]);
+
+ dimension_type* first_unused_index = last_index_in_subtree;
+ data_type* first_unused_data = last_data_in_subtree;
+
+ while (*last_index_in_subtree == unused_index) {
+ --last_index_in_subtree;
+ --last_data_in_subtree;
+ }
+
+ // From now on, last_index_in_subtree and last_data_in_subtree point to the
+ // rightmost node with a value in the subtree. first_unused_index and
+ // first_unused_data point to the rightmost unused node in the subtree.
+
+ if (add_element)
+ while (subtree_size != 0) {
+ --subtree_size;
+ if (last_index_in_subtree == indexes || key > *last_index_in_subtree) {
+ if (last_index_in_subtree == indexes
+ || last_index_in_subtree != first_unused_index) {
+ PPL_ASSERT(first_unused_index != indexes);
+ PPL_ASSERT(*first_unused_index == unused_index);
+ new (first_unused_data) data_type(value);
+ // Set the index only if the construction was successful.
+ *first_unused_index = key;
+ --first_unused_index;
+ --first_unused_data;
+ }
+ break;
+ }
+ else {
+ if (last_index_in_subtree != first_unused_index) {
+ PPL_ASSERT(first_unused_index != indexes);
+ PPL_ASSERT(last_index_in_subtree != indexes);
+ PPL_ASSERT(*first_unused_index == unused_index);
+ *first_unused_index = *last_index_in_subtree;
+ *last_index_in_subtree = unused_index;
+ move_data_element(*first_unused_data, *last_data_in_subtree);
+ }
+ --last_index_in_subtree;
+ --last_data_in_subtree;
+ while (*last_index_in_subtree == unused_index) {
+ --last_index_in_subtree;
+ --last_data_in_subtree;
+ }
+ --first_unused_index;
+ --first_unused_data;
+ }
+ }
+ while (subtree_size != 0) {
+ if (last_index_in_subtree != first_unused_index) {
+ PPL_ASSERT(first_unused_index != indexes);
+ PPL_ASSERT(last_index_in_subtree != indexes);
+ PPL_ASSERT(*first_unused_index == unused_index);
+ *first_unused_index = *last_index_in_subtree;
+ *last_index_in_subtree = unused_index;
+ move_data_element(*first_unused_data, *last_data_in_subtree);
+ }
+ --last_index_in_subtree;
+ --last_data_in_subtree;
+ while (*last_index_in_subtree == unused_index) {
+ --last_index_in_subtree;
+ --last_data_in_subtree;
+ }
+ --first_unused_index;
+ --first_unused_data;
+ --subtree_size;
+ }
+
+ const ptrdiff_t distance = first_unused_index - indexes;
+ PPL_ASSERT(distance >= 0);
+ return static_cast<dimension_type>(distance);
+}
+
+void
+PPL::CO_Tree::redistribute_elements_in_subtree(
+ dimension_type root_index,
+ dimension_type subtree_size,
+ dimension_type last_used,
+ dimension_type key,
+ data_type_const_reference value,
+ bool add_element) {
+
+ // This is static and with static allocation, to improve performance.
+ // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+ // 2^k-1 is a dimension_type, so it is the maximum tree height.
+ // For each node level, the stack may contain up to two element (one for the
+ // subtree rooted at the right son of a node of that level, and one for the
+ // node itself). An additional element can be at the top of the tree.
+ static std::pair<dimension_type,dimension_type>
+ stack[2U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+ std::pair<dimension_type,dimension_type>* stack_first_empty = stack;
+
+ // A pair (n, i) in the stack means to visit the subtree with root index i
+ // and size n.
+
+ PPL_ASSERT(subtree_size != 0);
+
+ stack_first_empty->first = subtree_size;
+ stack_first_empty->second = root_index;
+ ++stack_first_empty;
+
+ while (stack_first_empty != stack) {
+
+ --stack_first_empty;
+
+ // Implement
+ //
+ // <CODE>
+ // top_n = stack.top().first;
+ // top_i = stack.top().second;
+ // </CODE>
+ const dimension_type top_n = stack_first_empty->first;
+ const dimension_type top_i = stack_first_empty->second;
+
+ PPL_ASSERT(top_n != 0);
+ if (top_n == 1) {
+ if (add_element
+ && (last_used > reserved_size || indexes[last_used] > key)) {
+ PPL_ASSERT(last_used != top_i);
+ PPL_ASSERT(indexes[top_i] == unused_index);
+ add_element = false;
+ new (&(data[top_i])) data_type(value);
+ // Set the index only if the construction was successful.
+ indexes[top_i] = key;
+ }
+ else {
+ if (last_used != top_i) {
+ PPL_ASSERT(indexes[top_i] == unused_index);
+ indexes[top_i] = indexes[last_used];
+ indexes[last_used] = unused_index;
+ move_data_element(data[top_i], data[last_used]);
+ }
+ ++last_used;
+ }
+ }
+ else {
+ PPL_ASSERT(stack_first_empty + 2
+ < stack + sizeof(stack)/sizeof(stack[0]));
+
+ const dimension_type offset = (top_i & -top_i) / 2;
+ const dimension_type half = (top_n + 1) / 2;
+
+ PPL_ASSERT(half > 0);
+
+ // Right subtree
+ PPL_ASSERT(top_n - half > 0);
+ stack_first_empty->first = top_n - half;
+ stack_first_empty->second = top_i + offset;
+ ++stack_first_empty;
+
+ // Root of the current subtree
+ stack_first_empty->first = 1;
+ stack_first_empty->second = top_i;
+ ++stack_first_empty;
+
+ // Left subtree
+ if (half - 1 != 0) {
+ stack_first_empty->first = half - 1;
+ stack_first_empty->second = top_i - offset;
+ ++stack_first_empty;
+ }
+ }
+ }
+
+ PPL_ASSERT(!add_element);
+}
+
+void
+PPL::CO_Tree::move_data_from(CO_Tree& tree) {
+ PPL_ASSERT(size_ == 0);
+ if (tree.size_ == 0)
+ return;
+
+ tree_iterator root(*this);
+
+ dimension_type source_index = 1;
+ while (tree.indexes[source_index] == unused_index)
+ ++source_index;
+
+ // This is static and with static allocation, to improve performance.
+ // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that 2^k-1 is a
+ // dimension_type, so it is the maximum tree height.
+ // For each node level, the stack may contain up to 4 elements: two elements
+ // with operation 0, one element with operation 2 and one element
+ // with operation 3. An additional element with operation 1 can be at the
+ // top of the tree.
+ static std::pair<dimension_type, signed char>
+ stack[5U * sizeof_to_bits(sizeof(dimension_type))];
+
+ dimension_type stack_first_empty = 0;
+
+ // A pair (n, operation) in the stack means:
+ //
+ // * Go to the parent, if operation is 0.
+ // * Go to the left child, then visit the current tree (with size n), if
+ // operation is 1.
+ // * Go to the right child, then visit the current tree (with size n), if
+ // operation is 2.
+ // * Visit the current tree (with size n), if operation is 3.
+
+ stack[0].first = tree.size_;
+ stack[0].second = 3;
+ ++stack_first_empty;
+
+ while (stack_first_empty != 0) {
+
+ // Implement
+ //
+ // <CODE>
+ // top_n = stack.top().first;
+ // top_operation = stack.top().second;
+ // </CODE>
+ const dimension_type top_n = stack[stack_first_empty - 1].first;
+ const signed char top_operation = stack[stack_first_empty - 1].second;
+
+ switch (top_operation) {
+
+ case 0:
+ root.get_parent();
+ --stack_first_empty;
+ continue;
+
+ case 1:
+ root.get_left_child();
+ break;
+
+ case 2:
+ root.get_right_child();
+ break;
+
+#ifndef NDEBUG
+ case 3:
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ break;
+#endif
+ }
+
+ // We now visit the current tree
+
+ if (top_n == 0) {
+ --stack_first_empty;
+ }
+ else {
+ if (top_n == 1) {
+ PPL_ASSERT(root.index() == unused_index);
+ PPL_ASSERT(tree.indexes[source_index] != unused_index);
+ root.index() = tree.indexes[source_index];
+ tree.indexes[source_index] = unused_index;
+ move_data_element(*root, tree.data[source_index]);
+ PPL_ASSERT(source_index <= tree.reserved_size);
+ ++source_index;
+ while (tree.indexes[source_index] == unused_index)
+ ++source_index;
+ --stack_first_empty;
+ }
+ else {
+ PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+ const dimension_type half = (top_n + 1) / 2;
+ stack[stack_first_empty - 1].second = 0;
+ stack[stack_first_empty ] = std::make_pair(top_n - half, 2);
+ stack[stack_first_empty + 1] = std::make_pair(1, 3);
+ stack[stack_first_empty + 2].second = 0;
+ stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+ stack_first_empty += 4;
+ }
+ }
+ }
+ size_ = tree.size_;
+ tree.size_ = 0;
+ PPL_ASSERT(tree.structure_OK());
+ PPL_ASSERT(structure_OK());
+}
+
+void
+PPL::CO_Tree::copy_data_from(const CO_Tree& x) {
+ PPL_ASSERT(size_ == 0);
+ PPL_ASSERT(reserved_size == x.reserved_size);
+ PPL_ASSERT(structure_OK());
+
+ if (x.size_ == 0) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ dimension_type i;
+ try {
+ for (i = x.reserved_size; i > 0; --i)
+ if (x.indexes[i] != unused_index) {
+ indexes[i] = x.indexes[i];
+ new (&(data[i])) data_type(x.data[i]);
+ }
+ else {
+ PPL_ASSERT(indexes[i] == unused_index);
+ }
+ } catch (...) {
+ // The (used) data elements in (i,x.reserved_size] have been constructed
+ // successfully.
+ // The constructor of data[i] has thrown an exception, so data[i] has not
+ // been constructed.
+
+ // 1. Destroy the data elements that have been constructed successfully.
+ for (dimension_type j = x.reserved_size; j > i; --j)
+ if (indexes[j] != unused_index)
+ data[j].~data_type();
+
+ // 2. Deallocate index[] and data[]
+ delete[] indexes;
+ data_allocator.deallocate(data, reserved_size + 1);
+
+ // 3. Set the tree to an empty tree and rethrow exception.
+ init(0);
+ throw;
+ }
+
+ size_ = x.size_;
+ PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::CO_Tree::count_used_in_subtree(tree_iterator itr) {
+ dimension_type n = 0;
+
+ const dimension_type k = itr.get_offset();
+ const dimension_type root_index = itr.dfs_index();
+
+ // The complete subtree rooted at itr has 2*k - 1 nodes.
+
+ PPL_ASSERT(root_index > (k - 1));
+
+ const dimension_type* current_index
+ = &(itr.tree.indexes[root_index - (k - 1)]);
+
+ for (dimension_type j = 2*k - 1; j > 0; --j, ++current_index)
+ if (*current_index != unused_index)
+ ++n;
+
+ return n;
+}
+
+bool
+PPL::CO_Tree::const_iterator::OK() const {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ if (tree == 0) {
+ if (current_index != 0)
+ return false;
+ if (current_data != 0)
+ return false;
+ }
+ else
+ if (tree->reserved_size == 0) {
+ if (current_index != 1 + static_cast<dimension_type*>(0)
+ || current_data != 1 + static_cast<data_type*>(0))
+ return false;
+ }
+ else {
+ if (current_index <= &(tree->indexes[0]))
+ return false;
+ if (current_index > &(tree->indexes[tree->reserved_size + 1]))
+ return false;
+ if (current_data <= &(tree->data[0]))
+ return false;
+ if (current_data > &(tree->data[tree->reserved_size + 1]))
+ return false;
+ if (*current_index == unused_index)
+ return false;
+ if (current_index - tree->indexes != current_data - tree->data)
+ return false;
+ }
+#endif
+ return true;
+}
+
+bool
+PPL::CO_Tree::iterator::OK() const {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ if (tree == 0) {
+ if (current_index != 0)
+ return false;
+ if (current_data != 0)
+ return false;
+ }
+ else
+ if (tree->reserved_size == 0) {
+ if (current_index != 1 + static_cast<dimension_type*>(0)
+ || current_data != 1 + static_cast<data_type*>(0))
+ return false;
+ }
+ else {
+ if (current_index <= &(tree->indexes[0]))
+ return false;
+ if (current_index > &(tree->indexes[tree->reserved_size + 1]))
+ return false;
+ if (current_data <= &(tree->data[0]))
+ return false;
+ if (current_data > &(tree->data[tree->reserved_size + 1]))
+ return false;
+ if (*current_index == unused_index)
+ return false;
+ if (current_index - tree->indexes != current_data - tree->data)
+ return false;
+ }
+#endif
+ return true;
+}
+
+bool
+PPL::CO_Tree::tree_iterator::OK() const {
+ if (i == 0 || i > tree.reserved_size)
+ return false;
+
+ // This assumes two's complement encoding.
+ const dimension_type correct_offset = i & -i;
+
+ if (offset != correct_offset)
+ return false;
+
+ return true;
+}
+
+void
+PPL::CO_Tree::tree_iterator::go_down_searching_key(dimension_type key) {
+ // *this points to a node, so the tree is not empty.
+ PPL_ASSERT(!tree.empty());
+ PPL_ASSERT(key != unused_index);
+ PPL_ASSERT(index() != unused_index);
+ while (!is_leaf()) {
+ if (key == index())
+ break;
+ if (key < index()) {
+ get_left_child();
+ if (index() == unused_index) {
+ get_parent();
+ break;
+ }
+ }
+ else {
+ get_right_child();
+ if (index() == unused_index) {
+ get_parent();
+ break;
+ }
+ }
+ }
+}
diff --git a/src/CO_Tree_defs.hh b/src/CO_Tree_defs.hh
new file mode 100644
index 0000000..223e390
--- /dev/null
+++ b/src/CO_Tree_defs.hh
@@ -0,0 +1,1559 @@
+/* CO_Tree class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_defs_hh
+#define PPL_CO_Tree_defs_hh 1
+
+#include "CO_Tree_types.hh"
+
+#include "Coefficient_defs.hh"
+#include <memory>
+
+#ifndef PPL_CO_TREE_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+ \brief
+ Enables extra debugging information for class CO_Tree.
+
+ \ingroup PPL_CXX_interface
+ When <CODE>PPL_CO_TREE_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+ each CO_Tree iterator and const_iterator carries a pointer to the associated
+ tree; this enables extra consistency checks to be performed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_CO_TREE_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_CO_TREE_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_CO_TREE_EXTRA_DEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A cache-oblivious binary search tree of pairs.
+/*! \ingroup PPL_CXX_interface
+ This class implements a binary search tree with keys of dimension_type type
+ and data of Coefficient type, laid out in a dynamically-sized array.
+
+ The array-based layout saves calls to new/delete (to insert \f$n\f$ elements
+ only \f$O(\log n)\f$ allocations are performed) and, more importantly, is
+ much more cache-friendly than a standard (pointer-based) tree, because the
+ elements are stored sequentially in memory (leaving some holes to allow
+ fast insertion of new elements).
+ The downside of this representation is that all iterators are invalidated
+ when an element is added or removed, because the array could have been
+ enlarged or shrunk. This is partially addressed by providing references to
+ internal end iterators that are updated when needed.
+
+ B-trees are cache-friendly too, but the cache size is fixed (usually at
+ compile-time). This raises two problems: firstly the cache size must be
+ known in advance and those data structures do not perform well with other
+ cache sizes and, secondly, even if the cache size is known, the
+ optimizations target only one level of cache. This kind of data structures
+ are called cache aware. This implementation, instead, is cache oblivious:
+ it performs well with every cache size, and thus exploits all of the
+ available caches.
+
+ Assuming \p n is the number of elements in the tree and \p B is the number
+ of (dimension_type, Coefficient) pairs that fit in a cache line, the
+ time and cache misses complexities are the following:
+
+ - Insertions/Queries/Deletions: \f$O(\log^2 n)\f$ time,
+ \f$O(\log \frac{n}{B}))\f$ cache misses.
+ - Tree traversal from begin() to end(), using an %iterator: \f$O(n)\f$ time,
+ \f$O(\frac{n}{B})\f$ cache misses.
+ - Queries with a hint: \f$O(\log k)\f$ time and \f$O(\log \frac{k}{B})\f$
+ cache misses, where k is the distance between the given %iterator and the
+ searched element (or the position where it would have been).
+
+ The binary search tree is embedded in a (slightly bigger) complete tree,
+ that is enlarged and shrunk when needed. The complete tree is laid out
+ in an in-order DFS layout in two arrays: one for the keys and one for the
+ associated data.
+ The indexes and values are stored in different arrays to reduce
+ cache-misses during key queries.
+
+ The tree can store up to \f$(-(dimension_type)1)/100\f$ elements.
+ This limit allows faster density computations, but can be removed if needed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class CO_Tree {
+
+public:
+ class const_iterator;
+ class iterator;
+
+private:
+ //! This is used for node heights and depths in the tree.
+ typedef unsigned height_t;
+
+ PPL_COMPILE_TIME_CHECK(C_Integer<height_t>::max
+ >= sizeof_to_bits(sizeof(dimension_type)),
+ "height_t is too small to store depths.");
+
+ class tree_iterator;
+
+ // This must be declared here, because it is a friend of const_iterator.
+ //! Returns the index of the current element in the DFS layout of the
+ //! complete tree.
+ /*!
+ \return the index of the current element in the DFS layout of the complete
+ tree.
+
+ \param itr the iterator that points to the desired element.
+ */
+ dimension_type dfs_index(const_iterator itr) const;
+
+ // This must be declared here, because it is a friend of iterator.
+ //! Returns the index of the current element in the DFS layout of the
+ //! complete tree.
+ /*!
+ \return the index of the current element in the DFS layout of the complete
+ tree.
+
+ \param itr the iterator that points to the desired element.
+ */
+ dimension_type dfs_index(iterator itr) const;
+
+public:
+
+ //! The type of the data elements associated with keys.
+ /*!
+ If this is changed, occurrences of Coefficient_zero() in the CO_Tree
+ implementation have to be replaced with constants of the correct type.
+ */
+ typedef Coefficient data_type;
+ typedef Coefficient_traits::const_reference data_type_const_reference;
+
+ //! A const %iterator on the tree elements, ordered by key.
+ /*!
+ Iterator increment and decrement operations are \f$O(1)\f$ time.
+ These iterators are invalidated by operations that add or remove elements
+ from the tree.
+ */
+ class const_iterator {
+ private:
+ public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const data_type value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef data_type_const_reference reference;
+
+ //! Constructs an invalid const_iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator();
+
+ //! Constructs an %iterator pointing to the first element of the tree.
+ /*!
+ \param tree
+ The tree that the new %iterator will point to.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator(const CO_Tree& tree);
+
+ //! Constructs a const_iterator pointing to the i-th node of the tree.
+ /*!
+ \param tree
+ The tree that the new %iterator will point to.
+
+ \param i
+ The index of the element in \p tree to which the %iterator will point
+ to.
+
+ The i-th node must be a node with a value or end().
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const CO_Tree& tree, dimension_type i);
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const const_iterator& itr);
+
+ //! Converts an iterator into a const_iterator.
+ /*!
+ \param itr
+ The iterator that will be converted into a const_iterator.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const iterator& itr);
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const iterator& itr);
+
+ //! Navigates to the next element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator++();
+
+ //! Navigates to the previous element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator--();
+
+ //! Navigates to the next element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator operator++(int);
+
+ //! Navigates to the previous element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator operator--(int);
+
+ //! Returns the current element.
+ data_type_const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& x) const;
+
+ private:
+ //! Checks the internal invariants, in debug mode only.
+ bool OK() const;
+
+ //! A pointer to the corresponding element of the tree's indexes[] array.
+ const dimension_type* current_index;
+
+ //! A pointer to the corresponding element of the tree's data[] array.
+ const data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+ //! A pointer to the corresponding tree, used for debug purposes only.
+ const CO_Tree* tree;
+#endif
+
+ friend dimension_type CO_Tree::dfs_index(const_iterator itr) const;
+ };
+
+ //! An %iterator on the tree elements, ordered by key.
+ /*!
+ Iterator increment and decrement operations are \f$O(1)\f$ time.
+ These iterators are invalidated by operations that add or remove elements
+ from the tree.
+ */
+ class iterator {
+ public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef data_type value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef value_type& reference;
+
+ //! Constructs an invalid iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator();
+
+ //! Constructs an %iterator pointing to first element of the tree.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit iterator(CO_Tree& tree);
+
+ //! Constructs an %iterator pointing to the i-th node.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+
+ \param i
+ The index of the element in \p tree to which the new %iterator will
+ point to.
+
+ The i-th node must be a node with a value or end().
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator(CO_Tree& tree, dimension_type i);
+
+ //! The constructor from a tree_iterator.
+ /*!
+ \param itr
+ The tree_iterator that will be converted into an iterator.
+
+ This is meant for use by CO_Tree only.
+ This is not private to avoid the friend declaration.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit iterator(const tree_iterator& itr);
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator(const iterator& itr);
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator=(const iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator=(const tree_iterator& itr);
+
+ //! Navigates to the next element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator++();
+
+ //! Navigates to the previous element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator--();
+
+ //! Navigates to the next element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator operator++(int);
+
+ //! Navigates to the previous element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator operator--(int);
+
+ //! Returns the current element.
+ data_type& operator*();
+
+ //! Returns the current element.
+ data_type_const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const iterator& x) const;
+
+ private:
+ //! Checks the internal invariants, in debug mode only.
+ bool OK() const;
+
+ //! A pointer to the corresponding element of the tree's indexes[] array.
+ const dimension_type* current_index;
+
+ //! A pointer to the corresponding element of the tree's data[] array.
+ data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+ //! A pointer to the corresponding tree, used for debug purposes only.
+ CO_Tree* tree;
+#endif
+
+ friend const_iterator& const_iterator::operator=(const iterator&);
+ friend dimension_type CO_Tree::dfs_index(iterator itr) const;
+ };
+
+ //! Constructs an empty tree.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ CO_Tree();
+
+ //! The copy constructor.
+ /*!
+ \param y
+ The tree that will be copied.
+
+ This constructor takes \f$O(n)\f$ time.
+ */
+ CO_Tree(const CO_Tree& y);
+
+ //! A constructor from a sequence of \p n elements.
+ /*!
+ \param i
+ An iterator that points to the first element of the sequence.
+
+ \param n
+ The number of elements in the [i, i_end) sequence.
+
+ i must be an input iterator on a sequence of data_type elements,
+ sorted by index.
+ Objects of Iterator type must have an index() method that returns the
+ index with which the element pointed to by the iterator must be inserted.
+
+ This constructor takes \f$O(n)\f$ time, so it is more efficient than
+ the construction of an empty tree followed by n insertions, that would
+ take \f$O(n*\log^2 n)\f$ time.
+ */
+ template <typename Iterator>
+ CO_Tree(Iterator i, dimension_type n);
+
+ //! The assignment operator.
+ /*!
+ \param y
+ The tree that will be assigned to *this.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ CO_Tree& operator=(const CO_Tree& y);
+
+ //! Removes all elements from the tree.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ void clear();
+
+ //! The destructor.
+ /*!
+ This destructor takes \f$O(n)\f$ time.
+ */
+ ~CO_Tree();
+
+ //! Returns \p true if the tree has no elements.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool empty() const;
+
+ //! Returns the number of elements stored in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type size() const;
+
+ //! Returns the size() of the largest possible CO_Tree.
+ static dimension_type max_size();
+
+ //! Dumps the tree to stdout, for debugging purposes.
+ void dump_tree() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ dimension_type external_memory_in_bytes() const;
+
+ //! Inserts an element in the tree.
+ /*!
+ \returns
+ An %iterator that points to the inserted pair.
+
+ \param key
+ The key that will be inserted into the tree, associated with the default
+ data.
+
+ If such a pair already exists, an %iterator pointing to that pair is
+ returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(dimension_type key);
+
+ //! Inserts an element in the tree.
+ /*!
+ \returns
+ An %iterator that points to the inserted element.
+
+ \param key
+ The key that will be inserted into the tree..
+
+ \param data
+ The data that will be inserted into the tree.
+
+ If an element with the specified key already exists, its associated data
+ is set to \p data and an %iterator pointing to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.amortized
+ */
+ iterator insert(dimension_type key, data_type_const_reference data);
+
+ //! Inserts an element in the tree.
+ /*!
+ \return
+ An %iterator that points to the inserted element.
+
+ \param itr
+ The %iterator used as hint
+
+ \param key
+ The key that will be inserted into the tree, associated with the default
+ data.
+
+ This will be faster if \p itr points near to the place where the new
+ element will be inserted (or where is already stored).
+ However, the value of \p itr does not affect the result of this
+ method, as long it is a valid %iterator for this tree. \p itr may even be
+ end().
+
+ If an element with the specified key already exists, an %iterator pointing
+ to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(iterator itr, dimension_type key);
+
+ //! Inserts an element in the tree.
+ /*!
+ \return
+ An iterator that points to the inserted element.
+
+ \param itr
+ The iterator used as hint
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be inserted into the tree.
+
+ This will be faster if \p itr points near to the place where the new
+ element will be inserted (or where is already stored).
+ However, the value of \p itr does not affect the result of this
+ method, as long it is a valid iterator for this tree. \p itr may even be
+ end().
+
+ If an element with the specified key already exists, its associated data
+ is set to \p data and an iterator pointing to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists,
+ and \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(iterator itr, dimension_type key,
+ data_type_const_reference data);
+
+ //! Erases the element with key \p key from the tree.
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns an iterator to the next element (or end() if there are no
+ elements with key greater than \p key ).
+
+ \param key
+ The key of the element that will be erased from the tree.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists,
+ and \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator erase(dimension_type key);
+
+ //! Erases the element pointed to by \p itr from the tree.
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns an iterator to the next element (or end() if there are no
+ elements with key greater than \p key ).
+
+ \param itr
+ An iterator pointing to the element that will be erased from the tree.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator erase(iterator itr);
+
+ /*!
+ \brief Removes the element with key \p key (if it exists) and decrements
+ by 1 all elements' keys that were greater than \p key.
+
+ \param key
+ The key of the element that will be erased from the tree.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k+\log^2 n)\f$ expected time, where k is the number
+ of elements with keys greater than \p key.
+ */
+ void erase_element_and_shift_left(dimension_type key);
+
+ //! Adds \p n to all keys greater than or equal to \p key.
+ /*!
+ \param key
+ The key of the first element whose key will be increased.
+
+ \param n
+ Specifies how much the keys will be increased.
+
+ This method takes \f$O(k+\log n)\f$ expected time, where k is the number
+ of elements with keys greater than or equal to \p key.
+ */
+ void increase_keys_from(dimension_type key, dimension_type n);
+
+ //! Sets to \p i the key of *itr. Assumes that i<=itr.index() and that there
+ //! are no elements with keys in [i,itr.index()).
+ /*!
+ All existing iterators remain valid.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void fast_shift(dimension_type i, iterator itr);
+
+ //! Swaps x with *this.
+ /*!
+ \param x
+ The tree that will be swapped with *this.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(CO_Tree& x);
+
+ //! Returns an iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const iterator& end();
+
+ //! Equivalent to cbegin().
+ const_iterator begin() const;
+
+ //! Equivalent to cend().
+ const const_iterator& end() const;
+
+ //! Returns a const_iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator cbegin() const;
+
+ //! Returns a const_iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const const_iterator& cend() const;
+
+ //! Searches an element with key \p key using bisection.
+ /*!
+ \param key
+ The key that will be searched for.
+
+ If the element is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator bisect(dimension_type key);
+
+ //! Searches an element with key \p key using bisection.
+ /*!
+ \param key
+ The key that will be searched for.
+
+ If the element is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator bisect(dimension_type key) const;
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ An %iterator pointing to the first element in the range.
+ It must not be end().
+
+ \param last
+ An %iterator pointing to the last element in the range.
+ Note that this is included in the search.
+ It must not be end().
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the specified key is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log(last - first + 1))\f$ time.
+ */
+ iterator bisect_in(iterator first, iterator last, dimension_type key);
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ An %iterator pointing to the first element in the range.
+ It must not be end().
+
+ \param last
+ An %iterator pointing to the last element in the range.
+ Note that this is included in the search.
+ It must not be end().
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the specified key is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log(last - first + 1))\f$ time.
+ */
+ const_iterator bisect_in(const_iterator first, const_iterator last,
+ dimension_type key) const;
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An %iterator used as a hint.
+
+ \param key
+ The key that will be searched for.
+
+ If the element is found, the returned %iterator points to that element;
+ otherwise, it points to the immediately preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this tree. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ iterator bisect_near(iterator hint, dimension_type key);
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An %iterator used as a hint.
+
+ \param key
+ The key that will be searched for.
+
+ If the element is found, the returned %iterator points to that element;
+ otherwise, it points to the immediately preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this tree. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ const_iterator bisect_near(const_iterator hint, dimension_type key) const;
+
+private:
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ The index of the first element in the range.
+ It must be the index of an element with a value.
+
+ \param last
+ The index of the last element in the range.
+ It must be the index of an element with a value.
+ Note that this is included in the search.
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the element is found, the index of that element is returned; otherwise,
+ the returned index refers to the immediately preceding or succeeding
+ value.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ dimension_type bisect_in(dimension_type first, dimension_type last,
+ dimension_type key) const;
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An index used as a hint.
+ It must be the index of an element with a value.
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the element is found, the index of that element is returned; otherwise,
+ the returned index refers to the immediately preceding or succeeding
+ value.
+
+ This uses a binary progression and then a bisection, so this method is
+ \f$O(\log n)\f$, and it is \f$O(1)\f$ if the distance between the returned
+ position and \p hint is \f$O(1)\f$.
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ dimension_type bisect_near(dimension_type hint, dimension_type key) const;
+
+ //! Inserts an element in the tree.
+ /*!
+ If there is already an element with key \p key in the tree, its
+ associated data is set to \p data.
+
+ This operation invalidates existing iterators.
+
+ \return
+ An %iterator that points to the inserted element.
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be associated with \p key.
+
+ \param itr
+ It must point to the element in the tree with key \p key or, if no such
+ element exists, it must point to the node that would be his parent.
+
+ This method takes \f$O(1)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ tree_iterator insert_precise(dimension_type key,
+ data_type_const_reference data,
+ tree_iterator itr);
+
+ //! Helper for \c insert_precise.
+ /*!
+ This helper method takes the same arguments as \c insert_precise,
+ but besides assuming that \p itr is a correct hint, it also assumes
+ that \p key and \p data are not in the tree; namely, a proper
+ insertion has to be done and the insertion can not invalidate \p data.
+ */
+ tree_iterator insert_precise_aux(dimension_type key,
+ data_type_const_reference data,
+ tree_iterator itr);
+
+ //! Inserts an element in the tree.
+ /*!
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be associated with \p key.
+
+ The tree must be empty.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void insert_in_empty_tree(dimension_type key,
+ data_type_const_reference data);
+
+ //! Erases from the tree the element pointed to by \p itr .
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns
+ An %iterator to the next element (or end() if there are no elements with
+ key greater than \p key ).
+
+ \param itr
+ An %iterator pointing to the element that will be erased.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator erase(tree_iterator itr);
+
+ //! Initializes a tree with reserved size at least \p n .
+ /*!
+ \param n
+ A lower bound on the tree's desired reserved size.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void init(dimension_type n);
+
+ //! Deallocates the tree's dynamic arrays.
+ /*!
+ After this call, the tree fields are uninitialized, so init() must be
+ called again before using the tree.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void destroy();
+
+ //! Checks the internal invariants, but not the densities.
+ bool structure_OK() const;
+
+ //! Checks the internal invariants.
+ bool OK() const;
+
+ //! Returns the floor of the base-2 logarithm of \p n .
+ /*!
+ \param n
+ It must be greater than zero.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ static unsigned integer_log2(dimension_type n);
+
+ //! Compares the fractions numer/denom with ratio/100.
+ /*!
+ \returns Returns true if the fraction numer/denom is less
+ than the fraction ratio/100.
+
+ \param ratio
+ It must be less than or equal to 100.
+
+ \param numer
+ The numerator of the fraction.
+
+ \param denom
+ The denominator of the fraction.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static bool is_less_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio);
+
+ //! Compares the fractions numer/denom with ratio/100.
+ /*!
+ \returns
+ Returns true if the fraction numer/denom is greater than the fraction
+ ratio/100.
+
+ \param ratio
+ It must be less than or equal to 100.
+
+ \param numer
+ The numerator of the fraction.
+
+ \param denom
+ The denominator of the fraction.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static bool is_greater_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio);
+
+ //! Dumps the subtree rooted at \p itr to stdout, for debugging purposes.
+ /*!
+ \param itr
+ A tree_iterator pointing to the root of the desired subtree.
+ */
+ static void dump_subtree(tree_iterator itr);
+
+ //! Increases the tree's reserved size.
+ /*!
+ This is called when the density is about to exceed the maximum density
+ (specified by max_density_percent).
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void rebuild_bigger_tree();
+
+ //! Decreases the tree's reserved size.
+ /*!
+ This is called when the density is about to become less than the minimum
+ allowed density (specified by min_density_percent).
+
+ \p reserved_size must be greater than 3 (otherwise the tree can just be
+ cleared).
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void rebuild_smaller_tree();
+
+ //! Re-initializes the cached iterators.
+ /*!
+ This method must be called when the indexes[] and data[] vector are
+ reallocated.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void refresh_cached_iterators();
+
+ //! Rebalances the tree.
+ /*!
+ For insertions, it adds the pair (key, value) in the process.
+
+ This operation invalidates existing iterators that point to nodes in the
+ rebalanced subtree.
+
+ \returns an %iterator pointing to the root of the subtree that was
+ rebalanced.
+
+ \param itr
+ It points to the node where the new element has to be inserted or where an
+ element has just been deleted.
+
+ \param key
+ The index that will be inserted in the tree (for insertions only).
+
+ \param value
+ The value that will be inserted in the tree (for insertions only).
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ tree_iterator rebalance(tree_iterator itr, dimension_type key,
+ data_type_const_reference value);
+
+ //! Moves all elements of a subtree to the rightmost end.
+ /*!
+ \returns
+ The index of the rightmost unused node in the subtree after the process.
+
+ \param last_in_subtree
+ It is the index of the last element in the subtree.
+
+ \param subtree_size
+ It is the number of valid elements in the subtree.
+ It must be greater than zero.
+
+ \param key
+ The key that may be added to the tree if add_element is \c true.
+
+ \param value
+ The value that may be added to the tree if add_element is \c true.
+
+ \param add_element
+ If it is true, it tries to add an element with key \p key and value
+ \p value in the process (but it may not).
+
+ This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+ */
+ dimension_type compact_elements_in_the_rightmost_end(
+ dimension_type last_in_subtree, dimension_type subtree_size,
+ dimension_type key, data_type_const_reference value,
+ bool add_element);
+
+ //! Redistributes the elements in the subtree rooted at \p root_index.
+ /*!
+ The subtree's elements must be compacted to the rightmost end.
+
+ \param root_index
+ The index of the subtree's root node.
+
+ \param subtree_size
+ It is the number of used elements in the subtree.
+ It must be greater than zero.
+
+ \param last_used
+ It points to the leftmost element with a value in the subtree.
+
+ \param add_element
+ If it is true, this method adds an element with the specified key and
+ value in the process.
+
+ \param key
+ The key that will be added to the tree if \p add_element is \c true.
+
+ \param value
+ The data that will be added to the tree if \p add_element is \c true.
+
+ This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+ */
+ void redistribute_elements_in_subtree(dimension_type root_index,
+ dimension_type subtree_size,
+ dimension_type last_used,
+ dimension_type key,
+ data_type_const_reference value,
+ bool add_element);
+
+ //! Moves all data in the tree \p tree into *this.
+ /*!
+ \param tree
+ The tree from which the element will be moved into *this.
+
+ *this must be empty and big enough to contain all of tree's data without
+ exceeding max_density.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void move_data_from(CO_Tree& tree);
+
+ //! Copies all data in the tree \p tree into *this.
+ /*!
+ \param tree
+ The tree from which the element will be copied into *this.
+
+ *this must be empty and must have the same reserved size of \p tree.
+ this->OK() may return false before this method is called, but
+ this->structure_OK() must return true.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void copy_data_from(const CO_Tree& tree);
+
+ //! Counts the number of used elements in the subtree rooted at itr.
+ /*!
+ \param itr
+ An %iterator pointing to the root of the desired subtree.
+
+ This method takes \f$O(k)\f$ time, where k is the number of elements in
+ the subtree.
+ */
+ static dimension_type count_used_in_subtree(tree_iterator itr);
+
+ //! Moves the value of \p from in \p to .
+ /*!
+ \param from
+ It must be a valid value.
+
+ \param to
+ It must be a non-constructed chunk of memory.
+
+ After the move, \p from becomes a non-constructed chunk of memory and
+ \p to gets the value previously stored by \p from.
+
+ The implementation of this method assumes that data_type values do not
+ keep pointers to themselves nor to their fields.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static void move_data_element(data_type& to, data_type& from);
+
+ //! The maximum density of used nodes.
+ /*!
+ This must be greater than or equal to 50 and lower than 100.
+ */
+ static const dimension_type max_density_percent = 91;
+
+ //! The minimum density of used nodes.
+ /*!
+ Must be strictly lower than the half of max_density_percent.
+ */
+ static const dimension_type min_density_percent = 38;
+
+ //! The minimum density at the leaves' depth.
+ /*!
+ Must be greater than zero and strictly lower than min_density_percent.
+
+ Increasing the value is safe but leads to time inefficiencies
+ (measured against ppl_lpsol on 24 August 2010), because it forces trees to
+ be more balanced, increasing the cost of rebalancing.
+ */
+ static const dimension_type min_leaf_density_percent = 1;
+
+ //! An index used as a marker for unused nodes in the tree.
+ /*!
+ This must not be used as a key.
+ */
+ static const dimension_type unused_index = C_Integer<dimension_type>::max;
+
+ //! The %iterator returned by end().
+ /*!
+ It is updated when needed, to keep it valid.
+ */
+ iterator cached_end;
+
+ //! The %iterator returned by the const version of end().
+ /*!
+ It is updated when needed, to keep it valid.
+ */
+ const_iterator cached_const_end;
+
+ //! The depth of the leaves in the complete tree.
+ height_t max_depth;
+
+ //! The vector that contains the keys in the tree.
+ /*!
+ If an element of this vector is \p unused_index , it means that that
+ element and the corresponding element of data[] are not used.
+
+ Its size is reserved_size + 2, because the first and the last elements
+ are used as markers for iterators.
+ */
+ dimension_type* indexes;
+
+ //! The allocator used to allocate/deallocate data.
+ std::allocator<data_type> data_allocator;
+
+ //! The vector that contains the data of the keys in the tree.
+ /*!
+ If index[i] is \p unused_index, data[i] is unused.
+ Otherwise, data[i] contains the data associated to the indexes[i] key.
+
+ Its size is reserved_size + 1, because the first element is not used (to
+ allow using the same index in both indexes[] and data[] instead of
+ adding 1 to access data[]).
+ */
+ data_type* data;
+
+ //! The number of nodes in the complete tree.
+ /*!
+ It is one less than a power of 2.
+ If this is 0, data and indexes are set to NULL.
+ */
+ dimension_type reserved_size;
+
+ //! The number of values stored in the tree.
+ dimension_type size_;
+};
+
+class CO_Tree::tree_iterator {
+
+public:
+
+ /*!
+ \brief Constructs a tree_iterator pointing at the root node of the
+ specified tree
+
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+ */
+ explicit tree_iterator(CO_Tree& tree);
+
+ //! Constructs a tree_iterator pointing at the specified node of the tree.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+
+ \param i
+ The index of the element in \p tree to which the new %iterator will point
+ to.
+ */
+ tree_iterator(CO_Tree& tree, dimension_type i);
+
+ //! Constructs a tree_iterator from an iterator.
+ /*!
+ \param itr
+ The iterator that will be converted into a tree_iterator.
+ It must not be end().
+
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+ */
+ tree_iterator(const iterator& itr, CO_Tree& tree);
+
+ //! The assignment operator.
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+ */
+ tree_iterator& operator=(const tree_iterator& itr);
+
+ //! The assignment operator from an iterator.
+ /*!
+ \param itr
+ The iterator that will be assigned into *this.
+ */
+ tree_iterator& operator=(const iterator& itr);
+
+ //! Compares *this with \p itr.
+ /*!
+ \param itr
+ The %iterator that will compared with *this.
+ */
+ bool operator==(const tree_iterator& itr) const;
+
+ //! Compares *this with \p itr.
+ /*!
+ \param itr
+ The %iterator that will compared with *this.
+ */
+ bool operator!=(const tree_iterator& itr) const;
+
+ //! Makes the %iterator point to the root of \p tree.
+ /*!
+ The values of all fields (beside tree) are overwritten.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_root();
+
+ //! Makes the %iterator point to the left child of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_left_child();
+
+ //! Makes the %iterator point to the right child of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_right_child();
+
+ //! Makes the %iterator point to the parent of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_parent();
+
+ /*!
+ \brief Searches for an element with key \p key in the subtree rooted at
+ \p *this.
+
+ \param key
+ The searched for key.
+
+ After this method, *this points to the found node (if it exists) or to
+ the node that would be his parent (otherwise).
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ void go_down_searching_key(dimension_type key);
+
+ /*!
+ \brief Follows left children with a value, until it arrives at a leaf or at
+ a node with no value.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void follow_left_children_with_value();
+
+ /*!
+ \brief Follows right children with a value, until it arrives at a leaf or at
+ a node with no value.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void follow_right_children_with_value();
+
+ //! Returns true if the pointed node is the root node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_root() const;
+
+ //! Returns true if the pointed node has a parent and is its right child.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_right_child() const;
+
+ //! Returns true if the pointed node is a leaf of the complete tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_leaf() const;
+
+ //! Returns the key and value of the current node.
+ data_type& operator*();
+
+ //! Returns the key and value of the current node.
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns a reference to the index of the element pointed to by \c *this.
+ /*!
+ \returns a reference to the index of the element pointed to by \c *this.
+ */
+ dimension_type& index();
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Returns the index of the node pointed to by \c *this.
+ /*!
+ \returns the key of the node pointed to by \c *this, or unused_index if
+ the current node does not contain a valid element.
+ */
+ dimension_type key() const;
+
+ //! The tree containing the element pointed to by this %iterator.
+ CO_Tree& tree;
+
+ /*!
+ \brief Returns the index of the current node in the DFS layout of the
+ complete tree.
+ */
+ dimension_type dfs_index() const;
+
+ /*!
+ \brief Returns 2^h, with h the height of the current node in the tree,
+ counting from 0.
+
+ Thus leaves have offset 1.
+ This is faster than depth(), so it is useful to compare node depths.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type get_offset() const;
+
+ //! Returns the depth of the current node in the complete tree.
+ /*!
+ This method takes \f$O(\log n)\f$ time.
+ */
+ height_t depth() const;
+
+private:
+ //! Checks the internal invariant.
+ bool OK() const;
+
+ //! The index of the current node in the DFS layout of the complete tree.
+ dimension_type i;
+
+ /*!
+ \brief This is 2^h, with h the height of the current node in the tree,
+ counting from 0.
+
+ Thus leaves have offset 1.
+ This is equal to (i & -i), and is only stored to increase performance.
+ */
+ dimension_type offset;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree& x, CO_Tree& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::const_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::iterator& x, CO_Tree::iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "CO_Tree_inlines.hh"
+#include "CO_Tree_templates.hh"
+
+#endif // !defined(PPL_CO_Tree_defs_hh)
diff --git a/src/CO_Tree_inlines.hh b/src/CO_Tree_inlines.hh
new file mode 100644
index 0000000..64bde57
--- /dev/null
+++ b/src/CO_Tree_inlines.hh
@@ -0,0 +1,868 @@
+/* CO_Tree class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_inlines_hh
+#define PPL_CO_Tree_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+CO_Tree::dfs_index(const_iterator itr) const {
+ PPL_ASSERT(itr.current_index != 0);
+ PPL_ASSERT(itr.current_index >= indexes + 1);
+ PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+ const ptrdiff_t index = itr.current_index - indexes;
+ return static_cast<dimension_type>(index);
+}
+
+inline dimension_type
+CO_Tree::dfs_index(iterator itr) const {
+ PPL_ASSERT(itr.current_index != 0);
+ PPL_ASSERT(itr.current_index >= indexes + 1);
+ PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+ const ptrdiff_t index = itr.current_index - indexes;
+ return static_cast<dimension_type>(index);
+}
+
+inline
+CO_Tree::CO_Tree() {
+ init(0);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::CO_Tree(const CO_Tree& y) {
+ PPL_ASSERT(y.OK());
+ data_allocator = y.data_allocator;
+ init(y.reserved_size);
+ copy_data_from(y);
+}
+
+inline CO_Tree&
+CO_Tree::operator=(const CO_Tree& y) {
+ if (this != &y) {
+ destroy();
+ data_allocator = y.data_allocator;
+ init(y.reserved_size);
+ copy_data_from(y);
+ }
+ return *this;
+}
+
+inline void
+CO_Tree::clear() {
+ *this = CO_Tree();
+}
+
+inline
+CO_Tree::~CO_Tree() {
+
+ destroy();
+}
+
+inline bool
+CO_Tree::empty() const {
+ return size_ == 0;
+}
+
+inline dimension_type
+CO_Tree::size() const {
+ return size_;
+}
+
+inline dimension_type
+CO_Tree::max_size() {
+ return C_Integer<dimension_type>::max/100;
+}
+
+inline void
+CO_Tree::dump_tree() const {
+ if (empty())
+ std::cout << "(empty tree)" << std::endl;
+ else
+ dump_subtree(tree_iterator(*const_cast<CO_Tree*>(this)));
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(const dimension_type key) {
+ if (empty())
+ return insert(key, Coefficient_zero());
+ else {
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+ if (itr.index() == key)
+ return iterator(itr);
+ else
+ return iterator(insert_precise(key, Coefficient_zero(), itr));
+ }
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(dimension_type key, data_type_const_reference data1) {
+ if (empty()) {
+ insert_in_empty_tree(key, data1);
+ tree_iterator itr(*this);
+ PPL_ASSERT(itr.index() != unused_index);
+ return iterator(itr);
+ }
+ else {
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+ return iterator(insert_precise(key, data1, itr));
+ }
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(dimension_type key) {
+ PPL_ASSERT(key != unused_index);
+
+ if (empty())
+ return end();
+
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+
+ if (itr.index() == key)
+ return erase(itr);
+
+ iterator result(itr);
+ if (result.index() < key)
+ ++result;
+
+ PPL_ASSERT(result == end() || result.index() > key);
+#ifndef NDEBUG
+ iterator last = end();
+ --last;
+ PPL_ASSERT((result == end()) == (last.index() < key));
+#endif
+
+ return result;
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(iterator itr) {
+ PPL_ASSERT(itr != end());
+ return erase(tree_iterator(itr, *this));
+}
+
+inline void
+CO_Tree::m_swap(CO_Tree& x) {
+ using std::swap;
+ swap(max_depth, x.max_depth);
+ swap(indexes, x.indexes);
+ swap(data_allocator, x.data_allocator);
+ swap(data, x.data);
+ swap(reserved_size, x.reserved_size);
+ swap(size_, x.size_);
+ // Cached iterators have been invalidated by the swap,
+ // they must be refreshed here.
+ refresh_cached_iterators();
+ x.refresh_cached_iterators();
+ PPL_ASSERT(structure_OK());
+ PPL_ASSERT(x.structure_OK());
+}
+
+inline CO_Tree::iterator
+CO_Tree::begin() {
+ return iterator(*this);
+}
+
+inline const CO_Tree::iterator&
+CO_Tree::end() {
+ return cached_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::begin() const {
+ return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::end() const {
+ return cached_const_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::cbegin() const {
+ return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::cend() const {
+ return cached_const_end;
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect(dimension_type key) {
+ if (empty())
+ return end();
+ iterator last = end();
+ --last;
+ return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect(dimension_type key) const {
+ if (empty())
+ return end();
+ const_iterator last = end();
+ --last;
+ return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_in(iterator first, iterator last, dimension_type key) {
+ PPL_ASSERT(first != end());
+ PPL_ASSERT(last != end());
+ const dimension_type index
+ = bisect_in(dfs_index(first), dfs_index(last), key);
+ return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_in(const_iterator first, const_iterator last,
+ dimension_type key) const {
+ PPL_ASSERT(first != end());
+ PPL_ASSERT(last != end());
+ const dimension_type index
+ = bisect_in(dfs_index(first), dfs_index(last), key);
+ return const_iterator(*this, index);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_near(iterator hint, dimension_type key) {
+ if (hint == end())
+ return bisect(key);
+ const dimension_type index
+ = bisect_near(dfs_index(hint), key);
+ return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_near(const_iterator hint, dimension_type key) const {
+ if (hint == end())
+ return bisect(key);
+ const dimension_type index = bisect_near(dfs_index(hint), key);
+ return const_iterator(*this, index);
+}
+
+inline void
+CO_Tree::fast_shift(dimension_type i, iterator itr) {
+ PPL_ASSERT(itr != end());
+ PPL_ASSERT(i <= itr.index());
+ indexes[dfs_index(itr)] = i;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::insert_in_empty_tree(dimension_type key,
+ data_type_const_reference data1) {
+ PPL_ASSERT(empty());
+ rebuild_bigger_tree();
+ tree_iterator itr(*this);
+ PPL_ASSERT(itr.index() == unused_index);
+ new (&(*itr)) data_type(data1);
+ // Set the index afterwards, so that if the constructor above throws
+ // the tree's structure is consistent.
+ itr.index() = key;
+ ++size_;
+
+ PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::is_less_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio) {
+ PPL_ASSERT(ratio <= 100);
+ // If these are true, no overflows are possible.
+ PPL_ASSERT(denom <= unused_index/100);
+ PPL_ASSERT(numer <= unused_index/100);
+ return 100*numer < ratio*denom;
+}
+
+inline bool
+CO_Tree::is_greater_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio) {
+ PPL_ASSERT(ratio <= 100);
+ // If these are true, no overflows are possible.
+ PPL_ASSERT(denom <= unused_index/100);
+ PPL_ASSERT(numer <= unused_index/100);
+ return 100*numer > ratio*denom;
+}
+
+inline void
+CO_Tree::rebuild_smaller_tree() {
+ PPL_ASSERT(reserved_size > 3);
+ CO_Tree new_tree;
+ new_tree.init(reserved_size / 2);
+ new_tree.move_data_from(*this);
+ m_swap(new_tree);
+ PPL_ASSERT(new_tree.structure_OK());
+ PPL_ASSERT(structure_OK());
+}
+
+inline void
+CO_Tree::refresh_cached_iterators() {
+ cached_end = iterator(*this, reserved_size + 1);
+ cached_const_end = const_iterator(*this, reserved_size + 1);
+}
+
+inline void
+CO_Tree::move_data_element(data_type& to, data_type& from) {
+ // The following code is equivalent (but slower):
+ //
+ // <CODE>
+ // new (&to) data_type(from);
+ // from.~data_type();
+ // </CODE>
+ std::memcpy(&to, &from, sizeof(data_type));
+}
+
+
+inline
+CO_Tree::const_iterator::const_iterator()
+ : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = 0;
+#endif
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1)
+ : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ if (!tree1.empty())
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1,
+ dimension_type i)
+ : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ PPL_ASSERT(i != 0);
+ PPL_ASSERT(i <= tree1.reserved_size + 1);
+ PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const const_iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::const_iterator::m_swap(const_iterator& itr) {
+ using std::swap;
+ swap(current_data, itr.current_data);
+ swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ swap(tree, itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const const_iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator++() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ ++current_index;
+ ++current_data;
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator--() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ --current_index;
+ --current_data;
+ while (*current_index == unused_index) {
+ --current_index;
+ --current_data;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator++(int) {
+ const_iterator itr(*this);
+ ++(*this);
+ return itr;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator--(int) {
+ const_iterator itr(*this);
+ --(*this);
+ return itr;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::const_iterator::operator*() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline dimension_type
+CO_Tree::const_iterator::index() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_index;
+}
+
+inline bool
+CO_Tree::const_iterator::operator==(const const_iterator& x) const {
+ PPL_ASSERT((current_index == x.current_index)
+ == (current_data == x.current_data));
+ PPL_ASSERT(OK());
+ return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::const_iterator::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+
+inline
+CO_Tree::iterator::iterator()
+ : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = 0;
+#endif
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1)
+ : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ if (!tree1.empty())
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1, dimension_type i)
+ : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ PPL_ASSERT(i != 0);
+ PPL_ASSERT(i <= tree1.reserved_size + 1);
+ PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const tree_iterator& itr) {
+ *this = itr;
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::iterator::m_swap(iterator& itr) {
+ using std::swap;
+ swap(current_data, itr.current_data);
+ swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ swap(tree, itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const tree_iterator& itr) {
+ current_index = &(itr.tree.indexes[itr.dfs_index()]);
+ current_data = &(itr.tree.data[itr.dfs_index()]);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &(itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator++() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ ++current_index;
+ ++current_data;
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator--() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ --current_index;
+ --current_data;
+ while (*current_index == unused_index) {
+ --current_index;
+ --current_data;
+ }
+
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator++(int) {
+ iterator itr(*this);
+ ++(*this);
+ return itr;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator--(int) {
+ iterator itr(*this);
+ --(*this);
+ return itr;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::iterator::operator*() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::iterator::operator*() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline dimension_type
+CO_Tree::iterator::index() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_index;
+}
+
+inline bool
+CO_Tree::iterator::operator==(const iterator& x) const {
+ PPL_ASSERT((current_index == x.current_index)
+ == (current_data == x.current_data));
+ PPL_ASSERT(OK());
+ return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::iterator::operator!=(const iterator& x) const {
+ return !(*this == x);
+}
+
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ get_root();
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1, dimension_type i1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ PPL_ASSERT(i1 <= tree.reserved_size + 1);
+ i = i1;
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(const iterator& itr, CO_Tree& tree1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ *this = itr;
+ PPL_ASSERT(OK());
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const tree_iterator& itr) {
+ PPL_ASSERT(&tree == &(itr.tree));
+ i = itr.i;
+ offset = itr.offset;
+ return *this;
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const iterator& itr) {
+ PPL_ASSERT(itr != tree.end());
+ i = tree.dfs_index(itr);
+ offset = least_significant_one_mask(i);
+ return *this;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator==(const tree_iterator& itr) const {
+ return i == itr.i;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator!=(const tree_iterator& itr) const {
+ return !(*this == itr);
+}
+
+inline void
+CO_Tree::tree_iterator::get_root() {
+ i = tree.reserved_size / 2 + 1;
+ offset = i;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_left_child() {
+ PPL_ASSERT(offset != 0);
+ PPL_ASSERT(offset != 1);
+ offset /= 2;
+ i -= offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_right_child() {
+ PPL_ASSERT(offset != 0);
+ PPL_ASSERT(offset != 1);
+ offset /= 2;
+ i += offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_parent() {
+ PPL_ASSERT(!is_root());
+ PPL_ASSERT(offset != 0);
+ i &= ~offset;
+ offset *= 2;
+ i |= offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_left_children_with_value() {
+ PPL_ASSERT(index() != unused_index);
+ const dimension_type* p = tree.indexes;
+ p += i;
+ p -= (offset - 1);
+ while (*p == unused_index)
+ ++p;
+ const ptrdiff_t distance = p - tree.indexes;
+ PPL_ASSERT(distance >= 0);
+ i = static_cast<dimension_type>(distance);
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_right_children_with_value() {
+ PPL_ASSERT(index() != unused_index);
+ const dimension_type* p = tree.indexes;
+ p += i;
+ p += (offset - 1);
+ while (*p == unused_index)
+ --p;
+ const ptrdiff_t distance = p - tree.indexes;
+ PPL_ASSERT(distance >= 0);
+ i = static_cast<dimension_type>(distance);
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::tree_iterator::is_root() const {
+ // This is implied by OK(), it is here for reference only.
+ PPL_ASSERT(offset <= (tree.reserved_size / 2 + 1));
+ return offset == (tree.reserved_size / 2 + 1);
+}
+
+inline bool
+CO_Tree::tree_iterator::is_right_child() const {
+ if (is_root())
+ return false;
+ return (i & (2*offset)) != 0;
+}
+
+inline bool
+CO_Tree::tree_iterator::is_leaf() const {
+ return offset == 1;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::tree_iterator::operator*() {
+ return tree.data[i];
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::tree_iterator::operator*() const {
+ return tree.data[i];
+}
+
+inline dimension_type&
+CO_Tree::tree_iterator::index() {
+ return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::index() const {
+ return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::dfs_index() const {
+ return i;
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::get_offset() const {
+ return offset;
+}
+
+inline CO_Tree::height_t
+CO_Tree::tree_iterator::depth() const {
+ return integer_log2((tree.reserved_size + 1) / offset);
+}
+
+inline void
+swap(CO_Tree& x, CO_Tree& y) {
+ x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y) {
+ x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::iterator& x, CO_Tree::iterator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_inlines_hh)
diff --git a/src/CO_Tree_templates.hh b/src/CO_Tree_templates.hh
new file mode 100644
index 0000000..41957f8
--- /dev/null
+++ b/src/CO_Tree_templates.hh
@@ -0,0 +1,141 @@
+/* CO_Tree class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_templates_hh
+#define PPL_CO_Tree_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Iterator>
+CO_Tree::CO_Tree(Iterator i, dimension_type n) {
+
+ if (n == 0) {
+ init(0);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type new_max_depth = integer_log2(n) + 1;
+ reserved_size = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+
+ if (is_greater_than_ratio(n, reserved_size, max_density_percent)
+ && reserved_size != 3)
+ reserved_size = reserved_size*2 + 1;
+
+ init(reserved_size);
+
+ tree_iterator root(*this);
+
+ // This is static and with static allocation, to improve performance.
+ // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+ // 2^k-1 is a dimension_type, so it is the maximum tree height.
+ // For each node level, the stack may contain up to 4 elements: two elements
+ // with operation 0, one element with operation 2 and one element
+ // with operation 3. An additional element with operation 1 can be at the
+ // top of the tree.
+ static std::pair<dimension_type, signed char>
+ stack[4U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+ dimension_type stack_first_empty = 0;
+
+ // A pair (n, operation) in the stack means:
+ //
+ // * Go to the parent, if operation is 0.
+ // * Go to the left child, then fill the current tree with n elements, if
+ // operation is 1.
+ // * Go to the right child, then fill the current tree with n elements, if
+ // operation is 2.
+ // * Fill the current tree with n elements, if operation is 3.
+
+ stack[0].first = n;
+ stack[0].second = 3;
+ ++stack_first_empty;
+
+ while (stack_first_empty != 0) {
+
+ // Implement
+ //
+ // <CODE>
+ // top_n = stack.top().first;
+ // top_operation = stack.top().second;
+ // </CODE>
+ const dimension_type top_n = stack[stack_first_empty - 1].first;
+ const signed char top_operation = stack[stack_first_empty - 1].second;
+
+ switch (top_operation) {
+
+ case 0:
+ root.get_parent();
+ --stack_first_empty;
+ continue;
+
+ case 1:
+ root.get_left_child();
+ break;
+
+ case 2:
+ root.get_right_child();
+ break;
+#ifndef NDEBUG
+ case 3:
+ break;
+
+ default:
+ // We should not be here
+ PPL_UNREACHABLE;
+#endif
+ }
+
+ // We now visit the current tree
+
+ if (top_n == 0) {
+ --stack_first_empty;
+ }
+ else {
+ if (top_n == 1) {
+ PPL_ASSERT(root.index() == unused_index);
+ root.index() = i.index();
+ new (&(*root)) data_type(*i);
+ ++i;
+ --stack_first_empty;
+ }
+ else {
+ PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+ const dimension_type half = (top_n + 1) / 2;
+ stack[stack_first_empty - 1].second = 0;
+ stack[stack_first_empty ] = std::make_pair(top_n - half, 2);
+ stack[stack_first_empty + 1] = std::make_pair(1, 3);
+ stack[stack_first_empty + 2].second = 0;
+ stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+ stack_first_empty += 4;
+ }
+ }
+ }
+ size_ = n;
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_templates_hh)
diff --git a/src/CO_Tree_types.hh b/src/CO_Tree_types.hh
new file mode 100644
index 0000000..c9b36f2
--- /dev/null
+++ b/src/CO_Tree_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_CO_Tree_types_hh
+#define PPL_CO_Tree_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class CO_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_types_hh)
diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist
new file mode 100644
index 0000000..47b1d20
--- /dev/null
+++ b/src/CREDITS.cc.dist
@@ -0,0 +1,445 @@
+extern const char* const CREDITS_array[444] = {
+ "",
+ "Authors",
+ "=======",
+ "",
+ "The Parma Polyhedra Library and its documentation is being designed,",
+ "extended, written, debugged, maintained and improved by the following",
+ "people:",
+ "",
+ "",
+ "Core Development Team:",
+ "----------------------",
+ "",
+ " Roberto Bagnara [1] (BUGSENG srl and University of Parma)",
+ " Patricia M. Hill [2] (BUGSENG srl and University of Leeds)",
+ " Enea Zaffanella [3] (BUGSENG srl and University of Parma)",
+ " Abramo Bagnara (BUGSENG srl)",
+ "",
+ "",
+ "Former Members of the Core Development Team:",
+ "--------------------------------------------",
+ "",
+ " Elisa Ricci (former student of the University of Parma,",
+ " one of the four students with which the PPL",
+ " project started) has been a major contributor",
+ " to the development of the PPL, up until",
+ " December 2002.",
+ "",
+ "",
+ "Current Contributors:",
+ "---------------------",
+ "",
+ " Massimo Benerecetti (University of Naples) is working on additional",
+ " operators on polyhedra.",
+ "",
+ " Andrea Cimino (former student of the University of Parma)",
+ " wrote most of the mixed integer programming",
+ " solver, and also most of the Java and OCaml",
+ " interfaces. He keeps helping us, especially",
+ " with the web site.",
+ "",
+ " Marco Faella (University of Naples) is working on additional",
+ " operators on polyhedra.",
+ "",
+ " Stefano Minopoli (University of Naples) is working on additional",
+ " operators on polyhedra.",
+ "",
+ " Marco Poletti (student of the University of Bologna)",
+ " implemented the sparse matrices that are used",
+ " in the MIP and PIP solvers of the PPL; he also",
+ " did experiments on the parallelization of the",
+ " sparse matrices' computations; he is now working",
+ " on improving the PPL's memory footprint and",
+ " on other improvements to the library.",
+ "",
+ " Alessandro Zaccagnini [4] (University of Parma) has helped with",
+ " the efficient implementation of GCD and LCM",
+ " for checked numbers. He is now working on the",
+ " definitions of interval arithmetic operations.",
+ " Alessandro is always a very valuable source of",
+ " mathematical advice.",
+ "",
+ "",
+ "Past Contributors:",
+ "------------------",
+ "",
+ " Roberto Amadini (former student of the University of Parma)",
+ " did some work on the PPL support for the",
+ " approximation of floating point computations.",
+ "",
+ " Irene Bacchi (former student of the University of Parma) worked",
+ " on a development branch where she implemented",
+ " several variants of algorithms, checking",
+ " whether or not the set-union of two polyhedra",
+ " is the same as their poly-hull.",
+ "",
+ " Fabio Biselli (student of the University of Parma)",
+ " did some work on the PPL support for the",
+ " approximation of floating point computations.",
+ "",
+ " Fabio Bossi (former student of the University of Parma)",
+ " worked on the PPL support for the approximation",
+ " of floating point computations.",
+ "",
+ " Danilo Bonardi (former student of the University of Parma) worked",
+ " on a development branch where he experimented",
+ " with the use of metaprogramming techniques",
+ " based on expression templates. The objective",
+ " of this work was to check the effectiveness of",
+ " these techniques for moving computations from",
+ " run-time to compile-time.",
+ "",
+ " Sara Bonini (former student of the University of Parma) is",
+ " one of the four students with which the PPL",
+ " project started.",
+ "",
+ " Katy Dobson (former student of the University of Leeds)",
+ " worked on the formalization and definition of",
+ " algorithms for rational grids and products",
+ " of grids and polyhedra.",
+ "",
+ " Giordano Fracasso (former student of the University of Parma) wrote",
+ " the initial version of the support for native",
+ " and checked integer coefficients.",
+ "",
+ " Francois Galea [5] (University of Versailles) worked",
+ " at the implementation of the Parametric Integer",
+ " Programming solver.",
+ "",
+ " Maximiliano Marchesi (former student of the University of Parma)",
+ " helped a little to improve the documentation for",
+ " bounded differences.",
+ "",
+ " Elena Mazzi (former student of the University of Parma) worked",
+ " on our implementation of bounded differences",
+ " and octagons. She also participated in the",
+ " theoretical and practical work concerning",
+ " widening operators for weakly relational",
+ " domains.",
+ "",
+ " David Merchat (formerly at the University of Parma) helped us",
+ " with the generation of the library's documentation",
+ " using Doxygen.",
+ "",
+ " Matthew Mundell [6] (formerly at the University of Leeds) worked",
+ " on the implementation of rational grids. He has",
+ " also helped on other implementation issues.",
+ "",
+ " Andrea Pescetti (former student of the University of Parma) was one",
+ " of the four students with which the PPL",
+ " project started. Later, he helped a little",
+ " with the library's documentation.",
+ "",
+ " Barbara Quartieri (former student of the University of Parma) worked",
+ " on our implementation of bounded differences and",
+ " octagons.",
+ "",
+ " Enric Rodriguez Carbonell [7] (Technical University of Catalonia)",
+ " worked at the implementation of polynomial spaces.",
+ "",
+ " Angela Stazzone (former student of the University of Parma)",
+ " worked on the library's documentation.",
+ "",
+ " Fabio Trabucchi (former student of the University of Parma) worked",
+ " on a development branch where he added",
+ " serializers for all the objects of the PPL.",
+ " Support for serialization based on Fabio's",
+ " work will be available in a future release of",
+ " the library.",
+ "",
+ " Claudio Trento (former student of the University of Pisa) did",
+ " a small amount of work on an experimental OCaml",
+ " interface for the PPL.",
+ "",
+ " Tatiana Zolo (former student of the University of Parma) is",
+ " one of the four students with which the PPL",
+ " project started.",
+ "",
+ "",
+ "",
+ "Thanks!",
+ "=======",
+ "",
+ "",
+ "People:",
+ "-------",
+ "",
+ " Lucia Alessandrini (University of Parma) provided 4 hour-long",
+ " lectures on convex polyhedra for the Italian",
+ " authors. This was crucial for us to acquire",
+ " and/or refresh the notions needed for",
+ " developing the PPL library.",
+ "",
+ "",
+ " Frederic Besson [8] provided useful comments and observations on",
+ " the ideas (about an extrapolation operator for",
+ " convex polyhedra) sketched in a paper he",
+ " coauthored in 1999.",
+ "",
+ " Tevfik Bultan [9] (University of California, Santa Barbara)",
+ " suggested us to add support for generalized",
+ " affine transfer functions. Discussions with",
+ " Tevfik have been very useful.",
+ "",
+ " Manuel Carro",
+ " Jose Morales [9, 10] members of the CLIP Group [12], helped us",
+ " to produce a Ciao Prolog [13] interface for the",
+ " library. The decisive (and memorable) debugging",
+ " session took place in Parma in the afternoon of",
+ " March 10th, 2003, with the participation of",
+ " Jose Manuel Gomez.",
+ "",
+ " Marco Comini [14] (University of Udine) allows us to use his",
+ " Mac OS X machine to work on portability to",
+ " that platform.",
+ "",
+ " Goran Frehse [15] (VERIMAG, formerly at Carnegie Mellon University)",
+ " provided very useful feedback while he was",
+ " developing PHAVer [16]. We are working with",
+ " Goran in order to include more polyhedra",
+ " simplification facilities in the PPL.",
+ "",
+ " Denis Gopan [17] (University of Wisconsin-Madison) helped us",
+ " extend the library with the \"expand space",
+ " dimension\" and \"fold space dimensions\"",
+ " operations of the library.",
+ "",
+ " Martin Guy [18] gave us access to his ARM machine: without",
+ " this possibility, porting the PPL to the ARM's",
+ " ABIs would have taken ages.",
+ "",
+ " Bruno Haible [19] (ILOG) helped us in our first steps towards",
+ " using versions of the GMP library installed in",
+ " nonstandard places.",
+ "",
+ " Bertrand Jeannet [20] (IRISA) wrote the New Polka library [21]",
+ " and made it available. We had several",
+ " interesting exchanges with Bertrand concerning",
+ " various aspects of polyhedra manipulation.",
+ "",
+ " Herve Le Verge (r.i.p.) wrote and published an implementation",
+ " [22] of the Chernikova's algorithm [23] that",
+ " has set the stage for subsequent",
+ " implementation work, including our own.",
+ "",
+ " Francesco Logozzo [24] (formerly at Ecole Polytechnique) helped us",
+ " straighten out some portability issues on Cygwin.",
+ "",
+ " Kenneth MacKenzie [25] provided very good bug reports that allowed",
+ " us to fix several problems in the OCaml interface.",
+ "",
+ " Costantino Medori [26] (University of Parma) helped us on some",
+ " mathematical aspects of the development.",
+ "",
+ " Fred Mesnard [27] (University of La Reunion), the main author",
+ " of cTI [28], has worked with us on one of the",
+ " first applications of the PPL: the \"cTI\"",
+ " data-flow analyzer, which performs a linear",
+ " size relation analysis using a domain of",
+ " convex polyhedra. The China data-flow",
+ " analyzer [29] uses the Parma Polyhedra Library",
+ " to perform the same analysis. We have been",
+ " running China against an old version of cTI",
+ " that did not use the PPL, using it to",
+ " analyze the same Prolog programs. Since these",
+ " systems did not share a single line of code,",
+ " this gave us excellent opportunities for our",
+ " initial testing and debugging work. Fred has",
+ " also helped us to port the PPL to Mac OS X.",
+ "",
+ " Ken Mixter (then at Carnegie Mellon University) provided",
+ " useful feedback while working on an",
+ " experimental version of the Action Language",
+ " Verifier [30] based on the PPL.",
+ "",
+ " Sebastian Pop [31] (now at AMD). During his work on interfacing",
+ " CLooG [32] with the PPL, Sebastian provided",
+ " valuable feedback, particularly on the C",
+ " interface to the PPL. He also suggested the",
+ " addition of new functionality such as the",
+ " \"simplify using context\" operation.",
+ "",
+ " Thomas Reps [33] (University of Wisconsin-Madison), on several",
+ " occasions we have had interesting discussions",
+ " with him both on the PPL and on the more",
+ " general topics of static analysis and",
+ " numerical abstractions.",
+ "",
+ " Mooly Sagiv [34] (Tel-Aviv University) stimulated the development",
+ " of the PPL by providing, in particular,",
+ " interesting challenges related to precision",
+ " and scalability.",
+ "",
+ " Sriram Sankaranarayanan [35] (NEC Laboratories America, formerly at",
+ " Stanford University) provided very useful feedback",
+ " while developing StInG [36] and LPInv [37].",
+ "",
+ " Axel Simon [38] (ENS, formerly at the University of Kent",
+ " at Canterbury) wrote some PPL 0.9",
+ " bindings [44] for the Glasgow Haskell Compiler.",
+ "",
+ " Fausto Spoto [39] (University of Verona) did useful beta testing",
+ " for the Java interface. He also suggested the",
+ " addition of the <EM>hash code</EM> operations.",
+ "",
+ " Basile Starynkevitch [40] (CEA LIST/DTSI/SOL). Basile is the author",
+ " of MELT [41] and suggested several improvements",
+ " to the PPL.",
+ "",
+ "",
+ " Pedro Vasconcelos [42] (formerly at the University of St Andrews, UK)",
+ " provided useful feedback while developing his",
+ " size and cost analyzer for Core Hume [43].",
+ " Pedro also solved a problem of Axel Simon's",
+ " PPL 0.9 bindings for the GHC and makes them",
+ " publicly available [44].",
+ "",
+ " Ralf Wildenhues [45] (University of Bonn) helped us with",
+ " several issues concerning the proper use of",
+ " the Autotools.",
+ "",
+ "",
+ "Organizations (and People Therein):",
+ "-----------------------------------",
+ "",
+ "We are grateful for the following contributions:",
+ "",
+ "- AMD Developer Central [46] has donated a bi-quad core machine with",
+ " the latest AMD Opteron 2384 \"Shanghai\" processors and 16GB of RAM.",
+ " This machine now hosts all the PPL data and services. Many thanks",
+ " to Christophe Harle and Sebastian Pop.",
+ "",
+ "- The Computing Center of the University of Parma [47] allowed us to",
+ " test the portability of the library on a variety of platforms.",
+ " Fausto Pagani was especially helpful in this respect.",
+ "",
+ "- The GCC Compile Farm Project [48] managed by FSF France provided",
+ " access to a number of machines that allowed us to test and improve",
+ " the portability of the library. Special thanks go to Laurent Guerby",
+ " for his kind assistance.",
+ "",
+ "- The test cluster provided by Hewlett Packard and hosted by ESIEE [49]",
+ " allowed us to complete the porting of the PPL to the IA64 and PA-RISC",
+ " architectures. Many thanks to Thibaut Varene [50] and the PA-RISC",
+ " Linux community [51] for their kind assistance.",
+ "",
+ "- HiPEAC [52] sponsored the participation of Roberto Bagnara to the",
+ " Graphite Workshop [53]. This was very helpful to discuss the needs",
+ " of Graphite [54] (a framework for high-level loop optimizations on",
+ " the polyhedral model) and, more generally, of GCC [55] in terms of",
+ " numerical abstractions and how the PPL can help. Special thanks go",
+ " to Albert Cohen [57] for this sponsorship.",
+ "",
+ "- INRIA [56] supported the work of Abramo Bagnara from January 1st to",
+ " May 31st, 2009, to work on the PPL and its development",
+ " infrastructure. Many thanks go, in particular, to Albert Cohen [57].",
+ "",
+ "",
+ "Some of our research work has been partly supported by the following",
+ "projects and organizations:",
+ "",
+ "- University of Parma's FIL scientific research project (ex 60%)",
+ " ``Pure and Applied Mathematics'';",
+ "",
+ "- MURST project ``Automatic Program Certification by Abstract",
+ " Interpretation'' [58];",
+ "",
+ "- MURST project ``Abstract Interpretation, Type Systems and Control-Flow",
+ " Analysis'';",
+ "",
+ "- MURST project ``Automatic Aggregate- and Number-Reasoning for Computing:",
+ " from Decision Algorithms to Constraint Programming with Multisets, Sets,",
+ " and Maps'' [59];",
+ "",
+ "- MURST project ``Constraint Based Verification of Reactive Systems'' [60];",
+ "",
+ "- MURST project ``AIDA - Abstract Interpretation: Design and",
+ " Applications'' [61];",
+ "",
+ "- PRIN project ``AIDA 2007 - Abstract Interpretation: Design and",
+ " Applications'' [62];",
+ "",
+ "- Integrated Action Italy-Spain 2001-2002 ``Advanced Development Environments",
+ " for Logic Programs'' [63];",
+ "",
+ "- Royal Society Joint project 2004/R1-EU (UK-Italy)",
+ " ``Automatic Detection of Unstable Numerical Computations'';",
+ "",
+ "- EPSRC (UK) project EP/C520726/1",
+ " ``Numerical Domains for Software Analysis'' [64];",
+ "",
+ "- Royal Society International Outgoing Short Visit 2007/R4",
+ " ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [65];",
+ "",
+ "- EPSRC (UK) project EP/G025177/1",
+ " ``Geometric Abstractions for Scalable Program Analyzers'' [65].",
+ "",
+ "--------",
+ "",
+ " [1] http://www.cs.unipr.it/~bagnara/",
+ " [2] http://www.comp.leeds.ac.uk/hill/",
+ " [3] http://www.cs.unipr.it/~zaffanella/",
+ " [4] http://www.math.unipr.it/~zaccagni/",
+ " [5] http://fgalea.free.fr/",
+ " [6] http://www.mundell.ukfsn.org/",
+ " [7] http://www.lsi.upc.edu/~erodri/",
+ " [8] http://www.irisa.fr/lande/fbesson/fbesson.html",
+ " [9] http://www.cs.ucsb.edu/~bultan/",
+ "[10] http://www.clip.dia.fi.upm.es/~boris/",
+ "[11] http://clip.dia.fi.upm.es/~jfran/",
+ "[12] http://clip.dia.fi.upm.es/",
+ "[13] http://clip.dia.fi.upm.es/Software/Ciao/",
+ "[14] http://www.dimi.uniud.it/~comini/",
+ "[15] http://www-verimag.imag.fr/~frehse/",
+ "[16] http://www-verimag.imag.fr/~frehse/phaver_web/",
+ "[17] http://www.cs.wisc.edu/~gopan/",
+ "[18] http://martinwguy.co.uk/",
+ "[19] http://www.haible.de/bruno/",
+ "[20] http://www.irisa.fr/prive/Bertrand.Jeannet/",
+ "[21] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
+ "[22] http://bugseng.com/products/ppl/documentation/chernikova.c",
+ "[23] http://bugseng.com/products/ppl/documentation/bibliography#LeVerge92",
+ "[24] http://research.microsoft.com/~logozzo/",
+ "[25] http://homepages.inf.ed.ac.uk/kwxm/",
+ "[26] http://www.math.unipr.it/~medori/",
+ "[27] http://www.univ-reunion.fr/~fred/",
+ "[28] http://www.cs.unipr.it/cTI/",
+ "[29] http://www.cs.unipr.it/China/",
+ "[30] http://www.cs.ucsb.edu/~bultan/composite/",
+ "[31] http://www-rocq.inria.fr/~pop/",
+ "[32] http://www.cloog.org/",
+ "[33] http://www.cs.wisc.edu/~reps/",
+ "[34] http://www.math.tau.ac.il/~msagiv/",
+ "[35] http://www.nec-labs.com/~srirams/",
+ "[36] http://theory.stanford.edu/~srirams/Software/sting.html",
+ "[37] http://theory.stanford.edu/~srirams/Software/lpinv.html",
+ "[38] http://www.di.ens.fr/~simona/",
+ "[39] http://profs.sci.univr.it/~spoto/",
+ "[40] http://www.starynkevitch.net/Basile/index_en.html",
+ "[41] http://gcc.gnu.org/wiki/MiddleEndLispTranslator",
+ "[42] http://www.ncc.up.pt/~pbv/",
+ "[43] http://www.ncc.up.pt/~pbv/cgi/cost.cgi",
+ "[44] http://www.ncc.up.pt/~pbv/research/ppl/ghc.html",
+ "[45] http://wissrech.ins.uni-bonn.de/people/wildenhues.html",
+ "[46] http://developer.amd.com/",
+ "[47] http://www.siti.unipr.it/",
+ "[48] http://gcc.gnu.org/wiki/CompileFarm",
+ "[49] http://www.esiee.fr/",
+ "[50] http://www.parisc-linux.org/~varenet/",
+ "[51] http://www.parisc-linux.org/",
+ "[52] http://www.hipeac.net/",
+ "[53] http://gcc.gnu.org/wiki/Graphite_Workshop_Nov08",
+ "[54] http://gcc.gnu.org/wiki/Graphite",
+ "[55] http://gcc.gnu.org/",
+ "[56] http://www.inria.fr/",
+ "[57] http://www-rocq.inria.fr/~acohen/",
+ "[58] http://theory.sci.univr.it/p40/",
+ "[59] http://www.cs.unipr.it/Projects/COFIN01",
+ "[60] http://www.disi.unige.it/person/DelzannoG/cover/",
+ "[61] http://www.cs.unipr.it/Projects/AIDA/",
+ "[62] http://www.cs.unipr.it/Projects/AIDA2007/",
+ "[63] http://www.cs.unipr.it/Projects/AzInt2001-2002Sp",
+ "[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/linda.html",
+ "[65] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html",
+ 0};
diff --git a/src/CREDITS.hh.dist b/src/CREDITS.hh.dist
new file mode 100644
index 0000000..79d99df
--- /dev/null
+++ b/src/CREDITS.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_CREDITS_hh
+#define PPL_CREDITS_hh 1
+extern const char* const CREDITS_array[444];
+#endif // !defined(PPL_CREDITS_hh)
diff --git a/src/C_Integer.hh b/src/C_Integer.hh
new file mode 100644
index 0000000..a026f86
--- /dev/null
+++ b/src/C_Integer.hh
@@ -0,0 +1,217 @@
+/* C integers info.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Integer_hh
+#define PPL_C_Integer_hh 1
+
+#include "meta_programming.hh"
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing. In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<char> : public True {
+ enum const_bool_value {
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+ is_signed = true
+#else
+ is_signed = false
+#endif
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+ typedef unsigned char other_type;
+#else
+ typedef signed char other_type;
+#endif
+ static const char min = static_cast<char>(CHAR_MIN);
+ static const char max = static_cast<char>(CHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed char> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+ typedef unsigned char other_type;
+ static const signed char min = static_cast<signed char>(SCHAR_MIN);
+ static const signed char max = static_cast<signed char>(SCHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed char smaller_type;
+ typedef signed char smaller_signed_type;
+ typedef unsigned char smaller_unsigned_type;
+ typedef unsigned short other_type;
+ static const signed short min = static_cast<signed short>(SHRT_MIN);
+ static const signed short max = static_cast<signed short>(SHRT_MAX);
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed short smaller_type;
+ typedef signed short smaller_signed_type;
+ typedef unsigned short smaller_unsigned_type;
+ typedef unsigned int other_type;
+ static const signed int min = INT_MIN;
+ static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed int smaller_type;
+ typedef signed int smaller_signed_type;
+ typedef unsigned int smaller_unsigned_type;
+ typedef unsigned long other_type;
+ static const signed long min = LONG_MIN;
+ static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed long smaller_type;
+ typedef signed long smaller_signed_type;
+ typedef unsigned long smaller_unsigned_type;
+ typedef unsigned long long other_type;
+ static const signed long long min = LLONG_MIN;
+ static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+ typedef signed char other_type;
+ static const unsigned char min = static_cast<unsigned char>(0U);
+ static const unsigned char max = static_cast<unsigned char>(UCHAR_MAX);
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned char smaller_type;
+ typedef signed char smaller_signed_type;
+ typedef unsigned char smaller_unsigned_type;
+ typedef signed short other_type;
+ static const unsigned short min = static_cast<unsigned short>(0U);
+ static const unsigned short max = static_cast<unsigned short>(USHRT_MAX);
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned short smaller_type;
+ typedef signed short smaller_signed_type;
+ typedef unsigned short smaller_unsigned_type;
+ typedef signed int other_type;
+ static const unsigned int min = 0U;
+ static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned int smaller_type;
+ typedef signed int smaller_signed_type;
+ typedef unsigned int smaller_unsigned_type;
+ typedef signed long other_type;
+ static const unsigned long min = 0UL;
+ static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned long smaller_type;
+ typedef signed long smaller_signed_type;
+ typedef unsigned long smaller_unsigned_type;
+ typedef signed long long other_type;
+ static const unsigned long long min = 0ULL;
+ static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Integer_hh)
diff --git a/src/C_Polyhedron.cc b/src/C_Polyhedron.cc
new file mode 100644
index 0000000..96717e4
--- /dev/null
+++ b/src/C_Polyhedron.cc
@@ -0,0 +1,109 @@
+/* C_Polyhedron class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+ const Constraint_System& cs = y.constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ const Linear_Expression expr(c.expression());
+ add_constraint(expr >= 0);
+ }
+ else
+ add_constraint(c);
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(cgs.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs, Recycle_Input)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(cgs.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(cgs, recycle)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Grid& grid, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(grid.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(grid)",
+ "the space dimension of grid "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(grid.constraints());
+}
+
+bool
+PPL::C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron& y) {
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("poly_hull_assign_if_exact(y)", "y", y);
+#define USE_BHZ09 0
+#define USE_BFT00 1
+#if USE_BHZ09 // [BagnaraHZ09]
+ return BHZ09_poly_hull_assign_if_exact(y);
+#elif USE_BFT00 // [BemporadFT00TR].
+ return BFT00_poly_hull_assign_if_exact(y);
+#else // Old implementation.
+ return PPL::poly_hull_assign_if_exact(*this, y);
+#endif
+#undef USE_BHZ09
+#undef USE_BFT00
+}
+
+
+void
+PPL::C_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+ NNC_Polyhedron nnc_this(*this);
+ nnc_this.positive_time_elapse_assign(y);
+ *this = nnc_this;
+}
+
diff --git a/src/C_Polyhedron_defs.hh b/src/C_Polyhedron_defs.hh
new file mode 100644
index 0000000..4dc2fc9
--- /dev/null
+++ b/src/C_Polyhedron_defs.hh
@@ -0,0 +1,291 @@
+/* C_Polyhedron class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_defs_hh
+#define PPL_C_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+ An object of the class C_Polyhedron represents a
+ <EM>topologically closed</EM> convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ When building a closed polyhedron starting from
+ a system of constraints, an exception is thrown if the system
+ contains a <EM>strict inequality</EM> constraint.
+ Similarly, an exception is thrown when building a closed polyhedron
+ starting from a system of generators containing a <EM>closure point</EM>.
+
+ \note
+ Such an exception will be obtained even if the system of
+ constraints (resp., generators) actually defines
+ a topologically closed subset of the vector space, i.e.,
+ even if all the strict inequalities (resp., closure points)
+ in the system happen to be redundant with respect to the
+ system obtained by removing all the strict inequality constraints
+ (resp., all the closure points).
+ In contrast, when building a closed polyhedron starting from
+ an object of the class NNC_Polyhedron,
+ the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+ //! Builds either the universe or the empty C polyhedron.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the C polyhedron;
+
+ \param kind
+ Specifies whether a universe or an empty C polyhedron should be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+ Both parameters are optional:
+ by default, a 0-dimension space universe C polyhedron is built.
+ */
+ explicit C_Polyhedron(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a C polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ explicit C_Polyhedron(const Constraint_System& cs);
+
+ //! Builds a C polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a C polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points,
+ or if it contains closure points.
+ */
+ explicit C_Polyhedron(const Generator_System& gs);
+
+ //! Builds a C polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points,
+ or if it contains closure points.
+ */
+ C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds a C polyhedron from a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the polyhedron.
+ */
+ explicit C_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds a C polyhedron recycling a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence
+ system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+ /*! \brief
+ Builds a C polyhedron representing the topological closure
+ of the NNC polyhedron \p y.
+
+ \param y
+ The NNC polyhedron to be used;
+
+ \param complexity
+ This argument is ignored.
+ */
+ explicit C_Polyhedron(const NNC_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a box.
+ /*!
+ The polyhedron inherits the space dimension of the box
+ and is the most precise that includes the box.
+ The algorithm used has polynomial complexity.
+
+ \param box
+ The box representing the polyhedron to be approximated;
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Interval>
+ explicit C_Polyhedron(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a BD shape.
+ /*!
+ The polyhedron inherits the space dimension of the BDS and is
+ the most precise that includes the BDS.
+
+ \param bd
+ The BDS used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit C_Polyhedron(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of an octagonal shape.
+ /*!
+ The polyhedron inherits the space dimension of the octagonal shape
+ and is the most precise that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a grid.
+ /*!
+ The polyhedron inherits the space dimension of the grid
+ and is the most precise that includes the grid.
+
+ \param grid
+ The grid used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ explicit C_Polyhedron(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ C_Polyhedron(const C_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ C_Polyhedron& operator=(const C_Polyhedron& y);
+
+ //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+ C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+ //! Destructor.
+ ~C_Polyhedron();
+
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+ //! Same as poly_hull_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest C polyhedron containing the
+ result of computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+#include "C_Polyhedron_inlines.hh"
+
+#endif // !defined(PPL_C_Polyhedron_defs_hh)
diff --git a/src/C_Polyhedron_inlines.hh b/src/C_Polyhedron_inlines.hh
new file mode 100644
index 0000000..944fbd8
--- /dev/null
+++ b/src/C_Polyhedron_inlines.hh
@@ -0,0 +1,154 @@
+/* C_Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_inlines_hh
+#define PPL_C_Polyhedron_inlines_hh 1
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(num_dimensions,
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+ "C_Polyhedron(cs, recycle)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+ "C_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+ "C_Polyhedron(gs, recycle)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(box, NECESSARILY_CLOSED,
+ "C_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(bd.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(os.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(os.constraints());
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+ : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+ Polyhedron::operator=(y);
+ return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+ C_Polyhedron c_y(y);
+ m_swap(c_y);
+ return *this;
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+ return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_inlines_hh)
diff --git a/src/C_Polyhedron_types.hh b/src/C_Polyhedron_types.hh
new file mode 100644
index 0000000..96d84ca
--- /dev/null
+++ b/src/C_Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_C_Polyhedron_types_hh
+#define PPL_C_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_types_hh)
diff --git a/src/Cast_Floating_Point_Expression_defs.hh b/src/Cast_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..ab6b0e8
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_defs.hh
@@ -0,0 +1,182 @@
+/* Declarations for the Cast_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_defs_hh
+#define PPL_Cast_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Cast_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Cast_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Cast Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point cast expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given a floating point expression \f$e\f$ and a composite abstract store
+ \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$,
+ we construct the interval linear form
+ \f$\linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}\f$ as follows:
+ \f[
+ \linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Builds a cast floating point expression with the value
+ expressed by \p expr.
+ */
+ Cast_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const expr);
+
+ //! Destructor.
+ ~Cast_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ See the class description for an explanation of how \p result is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Cast_Floating_Point_Expression& y);
+
+private:
+
+ //! Pointer to the casted expression.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* expr;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Cast_Floating_Point_Expression(
+ const Cast_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+ Cast_Floating_Point_Expression& operator=(
+ const Cast_Floating_Point_Expression& y);
+
+}; // class Cast_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Cast_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_defs_hh)
diff --git a/src/Cast_Floating_Point_Expression_inlines.hh b/src/Cast_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..333fe74
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,64 @@
+/* Cast_Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_inlines_hh
+#define PPL_Cast_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Cast_Floating_Point_Expression(
+Floating_Point_Expression<FP_Interval_Type, FP_Format>* const e)
+ : expr(e) {
+ assert(e != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Cast_Floating_Point_Expression() {
+ delete expr;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Cast_Floating_Point_Expression& y) {
+ swap(expr, y.expr);
+}
+
+/*! \relates Cast_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_inlines_hh)
diff --git a/src/Cast_Floating_Point_Expression_templates.hh b/src/Cast_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..695a981
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_templates.hh
@@ -0,0 +1,46 @@
+/* Cast_Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_templates_hh
+#define PPL_Cast_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!expr->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_templates_hh)
diff --git a/src/Cast_Floating_Point_Expression_types.hh b/src/Cast_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..8fa18a6
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Cast_Floating_Point_Expression_types_hh
+#define PPL_Cast_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_types_hh)
diff --git a/src/Checked_Number.cc b/src/Checked_Number.cc
new file mode 100644
index 0000000..df0fc17
--- /dev/null
+++ b/src/Checked_Number.cc
@@ -0,0 +1,92 @@
+/* Checked_Number class implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void
+throw_result_exception(Result r) {
+ switch (r - V_UNREPRESENTABLE) {
+ case V_EMPTY:
+ throw std::domain_error("Exact result is not comparable to computable one.");
+ case V_EQ:
+ throw std::logic_error("Exact result is equal to computed one.");
+ case V_LT:
+ throw std::logic_error("Exact result is less than computed one.");
+ case V_LE:
+ throw std::logic_error("Exact result is less than or equal to "
+ "computed one.");
+ case V_GT:
+ throw std::logic_error("Exact result is greater than computed one.");
+ case V_GE:
+ throw std::logic_error("Exact result is greater than or equal to "
+ "computed one.");
+ case V_NE:
+ throw std::logic_error("Exact result is less than or greater than "
+ "computed one.");
+ case V_LGE:
+ throw std::logic_error("Exact result is less than, greater than or "
+ "equal to computed one.");
+ case V_EQ_MINUS_INFINITY:
+ throw std::overflow_error("Minus infinity.");
+ case V_GT_MINUS_INFINITY:
+ case V_LT_INF:
+ throw std::overflow_error("Negative overflow.");
+ case V_UNKNOWN_NEG_OVERFLOW:
+ throw std::overflow_error("Unknown result due to intermediate negative overflow.");
+ case V_EQ_PLUS_INFINITY:
+ throw std::overflow_error("Plus infinity.");
+ case V_LT_PLUS_INFINITY:
+ case V_GT_SUP:
+ throw std::overflow_error("Positive overflow.");
+ case V_UNKNOWN_POS_OVERFLOW:
+ throw std::overflow_error("Unknown result due to intermediate positive overflow.");
+ case V_NAN:
+ throw std::domain_error("Not-a-Number.");
+ case V_CVT_STR_UNK:
+ throw std::domain_error("Invalid numeric string.");
+ case V_DIV_ZERO:
+ throw std::domain_error("Division by zero.");
+ case V_INF_ADD_INF:
+ throw std::domain_error("Infinities addition.");
+ case V_INF_DIV_INF:
+ throw std::domain_error("Infinities division.");
+ case V_INF_MOD:
+ throw std::domain_error("Remainder of division of infinity.");
+ case V_INF_MUL_ZERO:
+ throw std::domain_error("Multiplication of infinity and zero.");
+ case V_INF_SUB_INF:
+ throw std::domain_error("Subtraction of infinities.");
+ case V_MOD_ZERO:
+ throw std::domain_error("Remainder of division by zero.");
+ case V_SQRT_NEG:
+ throw std::domain_error("Square root of negative number.");
+ default:
+ throw std::logic_error("Unexpected result.");
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/Checked_Number_defs.hh b/src/Checked_Number_defs.hh
new file mode 100644
index 0000000..1ee1f6d
--- /dev/null
+++ b/src/Checked_Number_defs.hh
@@ -0,0 +1,1068 @@
+/* Checked_Number class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_defs_hh
+#define PPL_Checked_Number_defs_hh 1
+
+#include "Checked_Number_types.hh"
+#include "checked_defs.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+ const_bool_nodef(check_overflow, true);
+ const_bool_nodef(check_inf_add_inf, false);
+ const_bool_nodef(check_inf_sub_inf, false);
+ const_bool_nodef(check_inf_mul_zero, false);
+ const_bool_nodef(check_div_zero, false);
+ const_bool_nodef(check_inf_div_inf, false);
+ const_bool_nodef(check_inf_mod, false);
+ const_bool_nodef(check_sqrt_neg, false);
+ const_bool_nodef(has_nan, true);
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ const_bool_nodef(fpu_check_inexact, true);
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+ const_bool_nodef(check_overflow, true);
+ const_bool_nodef(check_inf_add_inf, false);
+ const_bool_nodef(check_inf_sub_inf, false);
+ const_bool_nodef(check_inf_mul_zero, false);
+ const_bool_nodef(check_div_zero, false);
+ const_bool_nodef(check_inf_div_inf, false);
+ const_bool_nodef(check_inf_mod, false);
+ const_bool_nodef(check_sqrt_neg, false);
+ const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+ const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+ const_bool_nodef(convertible, true);
+ const_bool_nodef(fpu_check_inexact, true);
+ const_bool_nodef(fpu_check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+ typedef Checked_Number_Transparent_Policy<T> Policy;
+ static const T& raw_value(const T& v) {
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+ typedef P Policy;
+ static const T& raw_value(const Checked_Number<T, P>& v) {
+ return v.raw_value();
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+ typedef Check_Overflow_Policy<T> Policy;
+ static T& raw_value(T& v) {
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+ typedef P Policy;
+ static T& raw_value(Checked_Number<T, P>& v) {
+ return v.raw_value();
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Checked : public False { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Native_Or_Checked
+ : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+ The wrapper and related functions implement an interface which is common
+ to all kinds of coefficient types, therefore allowing for a uniform
+ coding style. This class also implements the policy encoded by the
+ second template parameter. The default policy is to perform the detection
+ of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+ //! \name Constructors
+ //@{
+
+ //! Default constructor.
+ Checked_Number();
+
+ //! Copy constructor.
+ Checked_Number(const Checked_Number& y);
+
+ //! Direct initialization from a Checked_Number and rounding mode.
+ template <typename From, typename From_Policy>
+ Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+ //! Direct initialization from a plain char and rounding mode.
+ Checked_Number(char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed char and rounding mode.
+ Checked_Number(signed char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed short and rounding mode.
+ Checked_Number(signed short y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed int and rounding mode.
+ Checked_Number(signed int y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long and rounding mode.
+ Checked_Number(signed long y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long long and rounding mode.
+ Checked_Number(signed long long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned char and rounding mode.
+ Checked_Number(unsigned char y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned short and rounding mode.
+ Checked_Number(unsigned short y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned int and rounding mode.
+ Checked_Number(unsigned int y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long and rounding mode.
+ Checked_Number(unsigned long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long long and rounding mode.
+ Checked_Number(unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+ //! Direct initialization from a float and rounding mode.
+ Checked_Number(float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+ //! Direct initialization from a double and rounding mode.
+ Checked_Number(double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+ //! Direct initialization from a long double and rounding mode.
+ Checked_Number(long double y, Rounding_Dir dir);
+#endif
+
+ //! Direct initialization from a rational and rounding mode.
+ Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+ //! Direct initialization from an unbounded integer and rounding mode.
+ Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+ //! Direct initialization from a C string and rounding mode.
+ Checked_Number(const char* y, Rounding_Dir dir);
+
+ //! Direct initialization from special and rounding mode.
+ template <typename From>
+ Checked_Number(const From&, Rounding_Dir dir, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+ //! Direct initialization from a Checked_Number, default rounding mode.
+ template <typename From, typename From_Policy>
+ explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+ //! Direct initialization from a plain char, default rounding mode.
+ Checked_Number(char y);
+
+ //! Direct initialization from a signed char, default rounding mode.
+ Checked_Number(signed char y);
+
+ //! Direct initialization from a signed short, default rounding mode.
+ Checked_Number(signed short y);
+
+ //! Direct initialization from a signed int, default rounding mode.
+ Checked_Number(signed int y);
+
+ //! Direct initialization from a signed long, default rounding mode.
+ Checked_Number(signed long y);
+
+ //! Direct initialization from a signed long long, default rounding mode.
+ Checked_Number(signed long long y);
+
+ //! Direct initialization from an unsigned char, default rounding mode.
+ Checked_Number(unsigned char y);
+
+ //! Direct initialization from an unsigned short, default rounding mode.
+ Checked_Number(unsigned short y);
+
+ //! Direct initialization from an unsigned int, default rounding mode.
+ Checked_Number(unsigned int y);
+
+ //! Direct initialization from an unsigned long, default rounding mode.
+ Checked_Number(unsigned long y);
+
+ //! Direct initialization from an unsigned long long, default rounding mode.
+ Checked_Number(unsigned long long y);
+
+ //! Direct initialization from a float, default rounding mode.
+ Checked_Number(float y);
+
+ //! Direct initialization from a double, default rounding mode.
+ Checked_Number(double y);
+
+ //! Direct initialization from a long double, default rounding mode.
+ Checked_Number(long double y);
+
+ //! Direct initialization from a rational, default rounding mode.
+ Checked_Number(const mpq_class& y);
+
+ //! Direct initialization from an unbounded integer, default rounding mode.
+ Checked_Number(const mpz_class& y);
+
+ //! Direct initialization from a C string, default rounding mode.
+ Checked_Number(const char* y);
+
+ //! Direct initialization from special, default rounding mode
+ template <typename From>
+ Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+
+ //@} // Constructors
+
+ //! \name Accessors and Conversions
+ //@{
+
+ //! Conversion operator: returns a copy of the underlying numeric value.
+ operator T() const;
+
+ //! Returns a reference to the underlying numeric value.
+ T& raw_value();
+
+ //! Returns a const reference to the underlying numeric value.
+ const T& raw_value() const;
+
+ //@} // Accessors and Conversions
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Classifies *this.
+ /*!
+ Returns the appropriate Result characterizing:
+ - whether \p *this is NaN,
+ if \p nan is <CODE>true</CODE>;
+ - whether \p *this is a (positive or negative) infinity,
+ if \p inf is <CODE>true</CODE>;
+ - the sign of \p *this,
+ if \p sign is <CODE>true</CODE>.
+ */
+ Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+ //! \name Assignment Operators
+ //@{
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Checked_Number& y);
+
+ //! Assignment operator.
+ template <typename From>
+ Checked_Number& operator=(const From& y);
+
+ //! Add and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+ //! Add and assign operator.
+ Checked_Number& operator+=(const T& y);
+
+ //! Add and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator+=(const From& y);
+
+ //! Subtract and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+ //! Subtract and assign operator.
+ Checked_Number& operator-=(const T& y);
+
+ //! Subtract and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator-=(const From& y);
+
+ //! Multiply and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+ //! Multiply and assign operator.
+ Checked_Number& operator*=(const T& y);
+
+ //! Multiply and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator*=(const From& y);
+
+ //! Divide and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+ //! Divide and assign operator.
+ Checked_Number& operator/=(const T& y);
+
+ //! Divide and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator/=(const From& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+ //! Compute remainder and assign operator.
+ Checked_Number& operator%=(const T& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>& >::type
+ operator%=(const From& y);
+
+ //@} // Assignment Operators
+
+
+ //! \name Increment and Decrement Operators
+ //@{
+
+ //! Pre-increment operator.
+ Checked_Number& operator++();
+
+ //! Post-increment operator.
+ Checked_Number operator++(int);
+
+ //! Pre-decrement operator.
+ Checked_Number& operator--();
+
+ //! Post-decrement operator.
+ Checked_Number operator--(int);
+
+ //@} // Increment and Decrement Operators
+
+private:
+ //! The underlying numeric value.
+ T v;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename To_Policy>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define PPL_DECLARE_FUNC1_A(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_A(assign_r)
+PPL_DECLARE_FUNC1_A(floor_assign_r)
+PPL_DECLARE_FUNC1_A(ceil_assign_r)
+PPL_DECLARE_FUNC1_A(trunc_assign_r)
+PPL_DECLARE_FUNC1_A(neg_assign_r)
+PPL_DECLARE_FUNC1_A(abs_assign_r)
+PPL_DECLARE_FUNC1_A(sqrt_assign_r)
+
+#undef PPL_DECLARE_FUNC1_A
+
+#define PPL_DECLARE_FUNC1_B(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_B(add_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(sub_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(mul_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(div_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(smod_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(umod_2exp_assign_r)
+
+#undef PPL_DECLARE_FUNC1_B
+
+#define PPL_DECLARE_FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC2(add_assign_r)
+PPL_DECLARE_FUNC2(sub_assign_r)
+PPL_DECLARE_FUNC2(mul_assign_r)
+PPL_DECLARE_FUNC2(div_assign_r)
+PPL_DECLARE_FUNC2(idiv_assign_r)
+PPL_DECLARE_FUNC2(rem_assign_r)
+PPL_DECLARE_FUNC2(gcd_assign_r)
+PPL_DECLARE_FUNC2(lcm_assign_r)
+PPL_DECLARE_FUNC2(add_mul_assign_r)
+PPL_DECLARE_FUNC2(sub_mul_assign_r)
+
+#undef PPL_DECLARE_FUNC2
+
+#define PPL_DECLARE_FUNC4(name) \
+template <typename To1, typename To2, typename To3, \
+ typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+ && Is_Native_Or_Checked<To2>::value \
+ && Is_Native_Or_Checked<To3>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t, \
+ const From1& x, const From2& y, \
+ Rounding_Dir dir);
+
+PPL_DECLARE_FUNC4(gcdext_assign_r)
+
+#undef PPL_DECLARE_FUNC4
+
+//! \name Accessor Functions
+//@{
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+/*! \brief
+ Assigns to \p x the greatest common divisor of \p y and \p z,
+ setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+ Checked_Number<T, Policy>& s,
+ Checked_Number<T, Policy>& t,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+mul_2exp_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+div_2exp_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ unsigned int exp);
+
+/*! \brief
+ If \p z divides \p y, assigns to \p x the quotient of the integer
+ division of \p y and \p z.
+
+ \relates Checked_Number
+ The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator==(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+equal(const T1& x, const T2& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator!=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+not_equal(const T1& x, const T2& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator>=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+greater_or_equal(const T1& x, const T2& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator>(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+greater_than(const T1& x, const T2& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator<=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+less_or_equal(const T1& x, const T2& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator<(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+less_than(const T1& x, const T2& y);
+
+/*! \brief
+ Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+ of \p x is negative, zero or positive, respectively.
+
+ \relates Checked_Number
+*/
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
+
+/*! \brief
+ Returns a negative, zero or positive value depending on whether
+ \p x is lower than, equal to or greater than \p y, respectively.
+
+ \relates Checked_Number
+*/
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+ && Is_Native_Or_Checked<From2>::value,
+ int>::type
+cmp(const From1& x, const From2& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os,
+ const T& x,
+ const Numeric_Format& format,
+ Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Ascii dump for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
+//! Input function.
+/*!
+ \relates Checked_Number
+
+ \param is
+ Input stream to read from;
+
+ \param x
+ Number (possibly extended) to assign to in case of successful reading;
+
+ \param dir
+ Rounding mode to be applied.
+
+ \return
+ Result of the input operation. Success, success with imprecision,
+ overflow, parsing error: all possibilities are taken into account,
+ checked for, and properly reported.
+
+ This function attempts reading a (possibly extended) number from the given
+ stream \p is, possibly rounding as specified by \p dir, assigning the result
+ to \p x upon success, and returning the appropriate Result.
+
+ The input syntax allows the specification of:
+ - plain base-10 integer numbers as <CODE>34976098</CODE>,
+ <CODE>-77</CODE> and <CODE>+13</CODE>;
+ - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+ and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+ <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+ - base-10 rational numbers in fraction notation as
+ <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+ - base-10 rational numbers in fraction/scientific notation as
+ <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+ (meaning \f$3/580000\f$);
+ - base-10 rational numbers in floating point notation as
+ <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+ <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+ - base-10 rational numbers in floating point scientific notation as
+ <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+ (meaning \f$-220001/100\f$);
+ - integers and rationals (in fractional, floating point and scientific
+ notations) specified by using Mathematica-style bases, in the range
+ from 2 to 36, as
+ <CODE>2^^11</CODE> (meaning \f$3\f$),
+ <CODE>36^^z</CODE> (meaning \f$35\f$),
+ <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+ <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+ <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+ <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+ <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+ <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+ <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+ note that the base and the exponent are always written as plain
+ base-10 integer numbers; also, when an ambiguity may arise, the
+ character <CODE>e</CODE> is interpreted as a digit, so that
+ <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+ <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+ - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+ the Mathematica-style prefix <CODE>16^^</CODE>;
+ - the C-style binary exponent indicator <CODE>p</CODE> can only be used
+ when base 16 has been specified; if used, the exponent will be
+ applied to base 2 (instead of base 16, as is the case when the
+ indicator <CODE>e</CODE> is used);
+ - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+ (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+ and <CODE>nan</CODE> (meaning "not a number").
+
+ The rationale behind the accepted syntax can be summarized as follows:
+ - if the syntax is accepted by Mathematica, then this function
+ accepts it with the same semantics;
+ - if the syntax is acceptable as standard C++ integer or floating point
+ literal (except for octal notation and type suffixes, which are not
+ supported), then this function accepts it with the same semantics;
+ - natural extensions of the above are accepted with the natural
+ extensions of the semantics;
+ - special values are accepted.
+
+ Valid syntax is more formally and completely specified by the
+ following grammar, with the additional provisos that everything is
+ <EM>case insensitive</EM>, that the syntactic category
+ <CODE>BDIGIT</CODE> is further restricted by the current base
+ and that for all bases above 14, any <CODE>e</CODE> is always
+ interpreted as a digit and never as a delimiter for the exponent part
+ (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number : NAN INF : 'inf'
+ | SIGN INF ;
+ | INF
+ | num NAN : 'nan'
+ | num DIV num ;
+ ;
+ SIGN : '-'
+num : u_num | '+'
+ | SIGN u_num ;
+
+u_num : u_num1 EXP : 'e'
+ | HEX u_num1 | 'p'
+ | base BASE u_num1 | '*^'
+ ; ;
+ POINT : '.'
+u_num1 : mantissa ;
+ | mantissa EXP exponent
+ ; DIV : '/'
+ ;
+mantissa: bdigits
+ | POINT bdigits MINUS : '-'
+ | bdigits POINT ;
+ | bdigits POINT bdigits
+ ; PLUS : '+'
+ ;
+exponent: SIGN digits
+ | digits HEX : '0x'
+ ; ;
+
+bdigits : BDIGIT BASE : '^^'
+ | bdigits BDIGIT ;
+ ;
+ DIGIT : '0' .. '9'
+digits : DIGIT ;
+ | digits DIGIT
+ ; BDIGIT : '0' .. '9'
+ | 'a' .. 'z'
+ ;
+\endcode
+*/
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//! Ascii load for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Checked_Number_inlines.hh"
+#include "Checked_Number_templates.hh"
+
+#endif // !defined(PPL_Checked_Number_defs_hh)
diff --git a/src/Checked_Number_inlines.hh b/src/Checked_Number_inlines.hh
new file mode 100644
index 0000000..233ae28
--- /dev/null
+++ b/src/Checked_Number_inlines.hh
@@ -0,0 +1,848 @@
+/* Checked_Number class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_inlines_hh
+#define PPL_Checked_Number_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+#ifndef NDEBUG
+#define DEBUG_ROUND_NOT_NEEDED
+#endif
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ return ROUND_CHECK;
+#endif
+ }
+ return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ PPL_ASSERT(result_relation(r) == VR_EQ);
+#endif
+ return r;
+ }
+ return r;
+}
+
+
+template <typename T>
+inline void
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+ // TODO: avoid default construction of value member.
+ Checked::copy<Policy, Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member.
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+ (v,
+ y.raw_value(),
+ rounding_dir(dir)),
+ dir)
+ );
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+ // TODO: avoid default construction of value member.
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+ (v,
+ y.raw_value(),
+ rounding_dir(dir)),
+ dir));
+}
+
+// TODO: avoid default construction of value member.
+#define PPL_DEFINE_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y, Rounding_Dir dir) { \
+ Policy::handle_result \
+ (check_result(Checked::assign_ext<Policy, \
+ Checked_Number_Transparent_Policy<PPL_U(type)> > \
+ (v, y, rounding_dir(dir)), \
+ dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y) { \
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+ Policy::handle_result \
+ (check_result(Checked::assign_ext<Policy, \
+ Checked_Number_Transparent_Policy<PPL_U(type)> > \
+ (v, y, rounding_dir(dir)), \
+ dir)); \
+}
+
+PPL_DEFINE_CTOR(char)
+PPL_DEFINE_CTOR(signed char)
+PPL_DEFINE_CTOR(signed short)
+PPL_DEFINE_CTOR(signed int)
+PPL_DEFINE_CTOR(signed long)
+PPL_DEFINE_CTOR(signed long long)
+PPL_DEFINE_CTOR(unsigned char)
+PPL_DEFINE_CTOR(unsigned short)
+PPL_DEFINE_CTOR(unsigned int)
+PPL_DEFINE_CTOR(unsigned long)
+PPL_DEFINE_CTOR(unsigned long long)
+#if PPL_SUPPORTED_FLOAT
+PPL_DEFINE_CTOR(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_DEFINE_CTOR(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_DEFINE_CTOR(long double)
+#endif
+PPL_DEFINE_CTOR(mpq_class&)
+PPL_DEFINE_CTOR(mpz_class&)
+
+#undef PPL_DEFINE_CTOR
+
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y, Rounding_Dir dir) {
+ std::istringstream s(y);
+ Policy::handle_result(check_result(Checked::input<Policy>(v,
+ s,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y) {
+ std::istringstream s(y);
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::input<Policy>(v,
+ s,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const From&,
+ Rounding_Dir dir,
+ typename Enable_If<Is_Special<From>::value, bool>::type) {
+ Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+ From::vclass,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>::Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type) {
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+ From::vclass,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value
+ && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From&, Rounding_Dir dir) {
+ return check_result(Checked::assign_special<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ From::vclass,
+ rounding_dir(dir)),
+ dir);
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From&, Rounding_Dir dir) {
+ return check_result(Checked::construct_special<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ From::vclass,
+ rounding_dir(dir)),
+ dir);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x) {
+ return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x) {
+ return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x) {
+ return is_minus_infinity(x) ? -1 : (is_plus_infinity(x) ? 1 : 0);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x) {
+ return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x) {
+ return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+ if (Policy::convertible)
+ return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+ return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+ return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+ return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+ return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+ return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+ return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+ return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+ return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+ return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+ return total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+ return external_memory_in_bytes(x.raw_value());
+}
+
+
+/*! \relates Checked_Number */
+template <typename To>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+ std::istringstream s(x);
+ return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ s,
+ rounding_dir(dir)),
+ dir);
+}
+
+#define PPL_DEFINE_FUNC1_A(name, func) \
+template <typename To, typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From>::raw_value(x), \
+ rounding_dir(dir)), dir); \
+}
+
+PPL_DEFINE_FUNC1_A(construct, construct_ext)
+PPL_DEFINE_FUNC1_A(assign_r, assign_ext)
+PPL_DEFINE_FUNC1_A(floor_assign_r, floor_ext)
+PPL_DEFINE_FUNC1_A(ceil_assign_r, ceil_ext)
+PPL_DEFINE_FUNC1_A(trunc_assign_r, trunc_ext)
+PPL_DEFINE_FUNC1_A(neg_assign_r, neg_ext)
+PPL_DEFINE_FUNC1_A(abs_assign_r, abs_ext)
+PPL_DEFINE_FUNC1_A(sqrt_assign_r, sqrt_ext)
+
+#undef PPL_DEFINE_FUNC1_A
+
+#define PPL_DEFINE_FUNC1_B(name, func) \
+template <typename To, typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From>::raw_value(x), \
+ exp, \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC1_B(add_2exp_assign_r, add_2exp_ext)
+PPL_DEFINE_FUNC1_B(sub_2exp_assign_r, sub_2exp_ext)
+PPL_DEFINE_FUNC1_B(mul_2exp_assign_r, mul_2exp_ext)
+PPL_DEFINE_FUNC1_B(div_2exp_assign_r, div_2exp_ext)
+PPL_DEFINE_FUNC1_B(smod_2exp_assign_r, smod_2exp_ext)
+PPL_DEFINE_FUNC1_B(umod_2exp_assign_r, umod_2exp_ext)
+
+#undef PPL_DEFINE_FUNC1_B
+
+#define PPL_DEFINE_FUNC2(name, func) \
+template <typename To, typename From1, typename From2> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From1> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From2> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC2(add_assign_r, add_ext)
+PPL_DEFINE_FUNC2(sub_assign_r, sub_ext)
+PPL_DEFINE_FUNC2(mul_assign_r, mul_ext)
+PPL_DEFINE_FUNC2(div_assign_r, div_ext)
+PPL_DEFINE_FUNC2(idiv_assign_r, idiv_ext)
+PPL_DEFINE_FUNC2(rem_assign_r, rem_ext)
+PPL_DEFINE_FUNC2(gcd_assign_r, gcd_ext)
+PPL_DEFINE_FUNC2(lcm_assign_r, lcm_ext)
+PPL_DEFINE_FUNC2(add_mul_assign_r, add_mul_ext)
+PPL_DEFINE_FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef PPL_DEFINE_FUNC2
+
+#define PPL_DEFINE_FUNC4(name, func) \
+template <typename To1, \
+ typename To2, \
+ typename To3, \
+ typename From1, \
+ typename From2> \
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value \
+ && Is_Native_Or_Checked<To2>::value \
+ && Is_Native_Or_Checked<To3>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t, const From1& x, const From2& y, \
+ Rounding_Dir dir) { \
+ return \
+ check_result \
+ (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy, \
+ typename Native_Checked_To_Wrapper<To2>::Policy, \
+ typename Native_Checked_To_Wrapper<To3>::Policy, \
+ typename Native_Checked_From_Wrapper<From1>::Policy, \
+ typename Native_Checked_From_Wrapper<From2>::Policy> \
+ (Native_Checked_To_Wrapper<To1>::raw_value(to), \
+ Native_Checked_To_Wrapper<To2>::raw_value(s), \
+ Native_Checked_To_Wrapper<To3>::raw_value(t), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef PPL_DEFINE_PPL_DEFINE_FUNC4
+
+#define PPL_DEFINE_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+ Policy::handle_result((fun)(*this, *this, T(1), \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+ T r = v;\
+ Policy::handle_result((fun)(*this, *this, T(1), \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r;\
+}
+
+PPL_DEFINE_INCREMENT(operator ++, add_assign_r)
+PPL_DEFINE_INCREMENT(operator --, sub_assign_r)
+
+#undef PPL_DEFINE_INCREMENT
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+ Checked::copy<Policy, Policy>(v, y.raw_value());
+ return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+ return *this;
+}
+
+#define PPL_DEFINE_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+ Policy::handle_result((fun)(*this, *this, y, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+ Policy::handle_result((fun)(*this, *this, y, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+ Checked_Number<T, Policy>& >::type \
+Checked_Number<T, Policy>::f(const From& y) { \
+ Checked_Number<T, Policy> cy(y); \
+ Policy::handle_result((fun)(*this, *this, cy, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+}
+
+PPL_DEFINE_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP_ASSIGN
+
+#define PPL_DEFINE_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, \
+ const Checked_Number<T, Policy>& y) { \
+ Checked_Number<T, Policy> r; \
+ Policy::handle_result((fun)(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+} \
+template <typename Type, typename T, typename Policy> \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Type& x, const Checked_Number<T, Policy>& y) { \
+ Checked_Number<T, Policy> r(x); \
+ Policy::handle_result((fun)(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+} \
+template <typename T, typename Policy, typename Type> \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, const Type& y) { \
+ Checked_Number<T, Policy> r(y); \
+ Policy::handle_result((fun)(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+}
+
+PPL_DEFINE_BINARY_OP(operator +, add_assign_r)
+PPL_DEFINE_BINARY_OP(operator -, sub_assign_r)
+PPL_DEFINE_BINARY_OP(operator *, mul_assign_r)
+PPL_DEFINE_BINARY_OP(operator /, div_assign_r)
+PPL_DEFINE_BINARY_OP(operator %, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP
+
+#define PPL_DEFINE_COMPARE_OP(f, fun) \
+template <typename T1, typename T2> \
+inline \
+typename Enable_If<Is_Native_Or_Checked<T1>::value \
+ && Is_Native_Or_Checked<T2>::value \
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value), \
+ bool>::type \
+ PPL_U(f)(const T1& x, const T2& y) { \
+ return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+ typename Native_Checked_From_Wrapper<T2>::Policy> \
+ (Native_Checked_From_Wrapper<T1>::raw_value(x), \
+ Native_Checked_From_Wrapper<T2>::raw_value(y)); \
+}
+
+PPL_DEFINE_COMPARE_OP(operator ==, eq_ext)
+PPL_DEFINE_COMPARE_OP(operator !=, ne_ext)
+PPL_DEFINE_COMPARE_OP(operator >=, ge_ext)
+PPL_DEFINE_COMPARE_OP(operator >, gt_ext)
+PPL_DEFINE_COMPARE_OP(operator <=, le_ext)
+PPL_DEFINE_COMPARE_OP(operator <, lt_ext)
+
+#undef PPL_DEFINE_COMPARE_OP
+
+#define PPL_DEFINE_COMPARE(f, fun) \
+template <typename T1, typename T2> \
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value \
+ && Is_Native_Or_Checked<T2>::value, \
+ bool>::type \
+ PPL_U(f)(const T1& x, const T2& y) { \
+ return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+ typename Native_Checked_From_Wrapper<T2>::Policy> \
+ (Native_Checked_From_Wrapper<T1>::raw_value(x), \
+ Native_Checked_From_Wrapper<T2>::raw_value(y)); \
+}
+
+PPL_DEFINE_COMPARE(equal, eq_ext)
+PPL_DEFINE_COMPARE(not_equal, ne_ext)
+PPL_DEFINE_COMPARE(greater_or_equal, ge_ext)
+PPL_DEFINE_COMPARE(greater_than, gt_ext)
+PPL_DEFINE_COMPARE(less_or_equal, le_ext)
+PPL_DEFINE_COMPARE(less_than, lt_ext)
+
+#undef PPL_DEFINE_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+ return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+ Checked_Number<T, Policy> r;
+ Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+ return r;
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x) { \
+ Policy::handle_result((fun)(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+ Policy::handle_result((fun)(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z) { \
+ Policy::handle_result((fun)(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN5_5(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, \
+ Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t, \
+ const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z) { \
+ Policy::handle_result((fun)(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef PPL_DEFINE_ASSIGN_FUN2_1
+#undef PPL_DEFINE_ASSIGN_FUN2_2
+#undef PPL_DEFINE_ASSIGN_FUN3_2
+#undef PPL_DEFINE_ASSIGN_FUN3_3
+#undef PPL_DEFINE_ASSIGN_FUN5_5
+
+#define PPL_DEFINE_ASSIGN_2EXP(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, \
+ const Checked_Number<T, Policy>& y, unsigned int exp) { \
+ Policy::handle_result((fun)(x, y, exp, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_2EXP(mul_2exp_assign, mul_2exp_assign_r)
+PPL_DEFINE_ASSIGN_2EXP(div_2exp_assign, div_2exp_assign_r)
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z) {
+ Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+ Result_Relation r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
+ switch (r) {
+ case VR_LT:
+ return -1;
+ case VR_EQ:
+ return 0;
+ case VR_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+ && Is_Native_Or_Checked<From2>::value,
+ int>::type
+cmp(const From1& x, const From2& y) {
+ Result_Relation r
+ = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+ typename Native_Checked_From_Wrapper<From2>::Policy>
+ (Native_Checked_From_Wrapper<From1>::raw_value(x),
+ Native_Checked_From_Wrapper<From2>::raw_value(y));
+ switch (r) {
+ case VR_LT:
+ return -1;
+ case VR_EQ:
+ return 0;
+ case VR_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
+ const Numeric_Format& format, Rounding_Dir dir) {
+ return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+ (os,
+ Native_Checked_From_Wrapper<T>::raw_value(x),
+ format,
+ rounding_dir(dir)),
+ dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+ Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+ return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+ return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+ (Native_Checked_To_Wrapper<T>::raw_value(x),
+ is,
+ rounding_dir(dir)),
+ dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+ Checked_Number<T, Policy>& x) {
+ Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+ if (r == V_CVT_STR_UNK)
+ is.setstate(std::ios::failbit);
+ else
+ Policy::handle_result(r);
+ return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+ return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+ return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+ return NOT_A_NUMBER;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+ using std::swap;
+ swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+ if (FPU_Related<T>::value)
+ return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+ if (FPU_Related<T>::value)
+ return fpu_check_inexact();
+ else
+ return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_inlines_hh)
diff --git a/src/Checked_Number_templates.hh b/src/Checked_Number_templates.hh
new file mode 100644
index 0000000..48a5a3e
--- /dev/null
+++ b/src/Checked_Number_templates.hh
@@ -0,0 +1,149 @@
+/* Checked_Number class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_templates_hh
+#define PPL_Checked_Number_templates_hh 1
+
+#include "assert.hh"
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+ if (std::numeric_limits<T>::is_exact)
+ // An exact data type: pretty printer is accurate.
+ s << t;
+ else {
+ // An inexact data type (probably floating point):
+ // first dump its hexadecimal representation ...
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+ for (unsigned i = 0; i < sizeof(T); ++i) {
+ s << std::setw(2) << std::setfill('0') << static_cast<unsigned>(p[i]);
+ }
+ s.flags(old_flags);
+ // ... and then pretty print it for readability.
+ s << " (" << t << ")";
+ }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+ if (std::numeric_limits<T>::is_exact) {
+ // An exact data type: input from pretty printed version is accurate.
+ s >> t;
+ return !s.fail();
+ }
+ else {
+ // An inexact data type (probably floating point):
+ // first load its hexadecimal representation ...
+ std::string str;
+ if (!(s >> str) || str.size() != 2*sizeof(T))
+ return false;
+ unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+ // CHECKME: any (portable) simpler way?
+ for (unsigned i = 0; i < sizeof(T); ++i) {
+ unsigned byte_value = 0;
+ for (unsigned j = 0; j < 2; ++j) {
+ byte_value <<= 4;
+ unsigned half_byte_value;
+ // Interpret single hex character.
+ switch (str[2*i + j]) {
+ case '0':
+ half_byte_value = 0;
+ break;
+ case '1':
+ half_byte_value = 1;
+ break;
+ case '2':
+ half_byte_value = 2;
+ break;
+ case '3':
+ half_byte_value = 3;
+ break;
+ case '4':
+ half_byte_value = 4;
+ break;
+ case '5':
+ half_byte_value = 5;
+ break;
+ case '6':
+ half_byte_value = 6;
+ break;
+ case '7':
+ half_byte_value = 7;
+ break;
+ case '8':
+ half_byte_value = 8;
+ break;
+ case '9':
+ half_byte_value = 9;
+ break;
+ case 'A':
+ case 'a':
+ half_byte_value = 10;
+ break;
+ case 'B':
+ case 'b':
+ half_byte_value = 11;
+ break;
+ case 'C':
+ case 'c':
+ half_byte_value = 12;
+ break;
+ case 'D':
+ case 'd':
+ half_byte_value = 13;
+ break;
+ case 'E':
+ case 'e':
+ half_byte_value = 14;
+ break;
+ case 'F':
+ case 'f':
+ half_byte_value = 15;
+ break;
+ default:
+ return false;
+ }
+ byte_value += half_byte_value;
+ }
+ PPL_ASSERT(byte_value <= 255);
+ p[i] = static_cast<unsigned char>(byte_value);
+ }
+ // ... then read and discard pretty printed value.
+ if (!(s >> str))
+ return false;
+ const std::string::size_type sz = str.size();
+ return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_templates_hh)
diff --git a/src/Checked_Number_types.hh b/src/Checked_Number_types.hh
new file mode 100644
index 0000000..b404b87
--- /dev/null
+++ b/src/Checked_Number_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Checked_Number_types_hh
+#define PPL_Checked_Number_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_types_hh)
diff --git a/src/Coefficient.cc b/src/Coefficient.cc
new file mode 100644
index 0000000..593b344
--- /dev/null
+++ b/src/Coefficient.cc
@@ -0,0 +1,64 @@
+/* Coefficient class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Coefficient_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+void
+Coefficient_constants_initialize() {
+}
+
+void
+Coefficient_constants_finalize() {
+}
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+const Coefficient* Coefficient_zero_p = 0;
+const Coefficient* Coefficient_one_p = 0;
+
+void
+Coefficient_constants_initialize() {
+ PPL_ASSERT(Coefficient_zero_p == 0);
+ Coefficient_zero_p = new Coefficient(0);
+
+ PPL_ASSERT(Coefficient_one_p == 0);
+ Coefficient_one_p = new Coefficient(1);
+}
+
+void
+Coefficient_constants_finalize() {
+ PPL_ASSERT(Coefficient_zero_p != 0);
+ delete Coefficient_zero_p;
+ Coefficient_zero_p = 0;
+
+ PPL_ASSERT(Coefficient_one_p != 0);
+ delete Coefficient_one_p;
+ Coefficient_one_p = 0;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient_defs.hh b/src/Coefficient_defs.hh
new file mode 100644
index 0000000..a5733b2
--- /dev/null
+++ b/src/Coefficient_defs.hh
@@ -0,0 +1,61 @@
+/* Coefficient class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_defs_hh
+#define PPL_Coefficient_defs_hh 1
+
+#include "Coefficient_types.hh"
+#include <iosfwd>
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+#include "Checked_Number_defs.hh"
+#include "checked_int_inlines.hh"
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+#include "GMP_Integer_defs.hh"
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
+Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Coefficient_inlines.hh"
+
+#endif // !defined(PPL_Coefficient_defs_hh)
diff --git a/src/Coefficient_inlines.hh b/src/Coefficient_inlines.hh
new file mode 100644
index 0000000..d10c36e
--- /dev/null
+++ b/src/Coefficient_inlines.hh
@@ -0,0 +1,72 @@
+/* Coefficient class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_inlines_hh
+#define PPL_Coefficient_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_CHECKED_INTEGERS
+inline void
+Bounded_Integer_Coefficient_Policy::handle_result(Result r) {
+ // Note that the input functions can return VC_NAN.
+ if (result_overflow(r) || result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+#endif // PPL_CHECKED_INTEGERS
+
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ // FIXME: is there a way to avoid this static variable?
+ static Coefficient zero(0);
+ return zero;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ // FIXME: is there a way to avoid this static variable?
+ static Coefficient one(1);
+ return one;
+}
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ extern const Coefficient* Coefficient_zero_p;
+ return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ extern const Coefficient* Coefficient_one_p;
+ PPL_ASSERT(*Coefficient_one_p != 0);
+ return *Coefficient_one_p;
+}
+#endif // PPL_GMP_INTEGERS
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_inlines_hh)
diff --git a/src/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh
new file mode 100644
index 0000000..2117477
--- /dev/null
+++ b/src/Coefficient_traits_template.hh
@@ -0,0 +1,39 @@
+/* Coefficient_traits_template class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_traits_template_hh
+#define PPL_Coefficient_traits_template_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_traits_template_hh)
diff --git a/src/Coefficient_types.hh b/src/Coefficient_types.hh
new file mode 100644
index 0000000..731a45a
--- /dev/null
+++ b/src/Coefficient_types.hh
@@ -0,0 +1,182 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Coefficient_types_hh
+#define PPL_Coefficient_types_hh 1
+
+#include "Checked_Number_defs.hh"
+
+#ifdef PPL_GMP_INTEGERS
+#include "GMP_Integer_types.hh"
+#endif
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! A policy for checked bounded integer coefficients.
+/*! \ingroup PPL_CXX_interface */
+struct Bounded_Integer_Coefficient_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Do not handle not-a-number special value.
+ const_bool_nodef(has_nan, false);
+
+ //! Do not handle infinity special values.
+ const_bool_nodef(has_infinity, false);
+
+ /*! \brief
+ The checked number can always be safely converted to the
+ underlying type \p T and vice-versa.
+ */
+ const_bool_nodef(convertible, true);
+
+ //! Do not honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, false);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ /*! \brief
+ For constructors, by default use the same rounding used by
+ underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+ /*! \brief
+ For overloaded operators (operator+(), operator-(), ...), by
+ default use the same rounding used by the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+ /*! \brief
+ For input functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For output functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For all other functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+ //! The type used for references to const 8 bit checked integers.
+ typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+ //! The type used for references to const 16 bit checked integers.
+ typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+ //! The type used for references to const 32 bit checked integers.
+ typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+ //! The type used for references to const 64 bit checked integers.
+ typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+ Objects of type Coefficient are used to implement the integral valued
+ coefficients occurring in linear expressions, constraints, generators,
+ intervals, bounding boxes and so on. Depending on the chosen
+ configuration options (see file <CODE>README.configure</CODE>),
+ a Coefficient may actually be:
+ - The GMP_Integer type, which in turn is an alias for the
+ <CODE>mpz_class</CODE> type implemented by the C++ interface
+ of the GMP library (this is the default configuration).
+ - An instance of the Checked_Number class template: with the policy
+ Bounded_Integer_Coefficient_Policy, this implements overflow
+ detection on top of a native integral type (available template
+ instances include checked integers having 8, 16, 32 or 64 bits);
+ with the Checked_Number_Transparent_Policy, this is a wrapper
+ for native integral types with no overflow detection
+ (available template instances are as above).
+*/
+typedef PPL_COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_types_hh)
diff --git a/src/Concrete_Expression.cc b/src/Concrete_Expression.cc
new file mode 100644
index 0000000..5c25d66
--- /dev/null
+++ b/src/Concrete_Expression.cc
@@ -0,0 +1,122 @@
+/* Concrete_Expression class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Concrete_Expression_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Concrete_Expression_Type::OK() const {
+ if (impl.bounded_integer) {
+ if (impl.bounded_integer_type_width != BITS_8
+ && impl.bounded_integer_type_width != BITS_16
+ && impl.bounded_integer_type_width != BITS_32
+ && impl.bounded_integer_type_width != BITS_64
+ && impl.bounded_integer_type_width != BITS_128) {
+#ifndef NDEBUG
+ std::cerr << "bounded integer type has illegal width "
+ << impl.bounded_integer_type_width
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.bounded_integer_type_representation != UNSIGNED
+ && impl.bounded_integer_type_representation != SIGNED_2_COMPLEMENT) {
+#ifndef NDEBUG
+ std::cerr << "bounded integer type has illegal representation "
+ << impl.bounded_integer_type_representation
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.bounded_integer_type_overflow != OVERFLOW_WRAPS
+ && impl.bounded_integer_type_overflow != OVERFLOW_UNDEFINED
+ && impl.bounded_integer_type_overflow != OVERFLOW_IMPOSSIBLE) {
+#ifndef NDEBUG
+ std::cerr << "bounded integer type has illegal overflow "
+ << impl.bounded_integer_type_overflow
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.floating_point_format != IEEE754_HALF) {
+#ifndef NDEBUG
+ std::cerr << "bounded integer type has illegal (unused) fp format "
+ << impl.floating_point_format
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ else {
+ // Here we have impl.bounded_integer == false.
+ if (impl.floating_point_format != IEEE754_HALF
+ && impl.floating_point_format != IEEE754_SINGLE
+ && impl.floating_point_format != IEEE754_DOUBLE
+ && impl.floating_point_format != IBM_SINGLE
+ && impl.floating_point_format != IEEE754_QUAD
+ && impl.floating_point_format != INTEL_DOUBLE_EXTENDED) {
+#ifndef NDEBUG
+ std::cerr << "floating point type has illegal format "
+ << impl.floating_point_format
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.bounded_integer_type_width != BITS_128) {
+#ifdef NDEBUG
+ std::cerr << "floating point type has illegal (unused) bi width "
+ << impl.bounded_integer_type_width
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.bounded_integer_type_representation != SIGNED_2_COMPLEMENT) {
+#ifndef NDEBUG
+ std::cerr << "floating point type has illegal (unused) bi representation "
+ << impl.bounded_integer_type_representation
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (impl.bounded_integer_type_overflow != OVERFLOW_IMPOSSIBLE) {
+#ifndef NDEBUG
+ std::cerr << "floating point type has illegal (unused) bi overflow "
+ << impl.bounded_integer_type_overflow
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // If we got here, everything is OK.
+ return true;
+}
diff --git a/src/Concrete_Expression_defs.hh b/src/Concrete_Expression_defs.hh
new file mode 100644
index 0000000..d59e1c9
--- /dev/null
+++ b/src/Concrete_Expression_defs.hh
@@ -0,0 +1,201 @@
+/* Concrete_Expression class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Concrete_Expression_defs_hh
+#define PPL_Concrete_Expression_defs_hh 1
+
+#include "Concrete_Expression_types.hh"
+#include "globals_defs.hh"
+#include "Interval_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! The type of a concrete expression.
+class Concrete_Expression_Type {
+public:
+ /*! \brief
+ Returns the bounded integer type corresponding to \p width,
+ \p representation and \p overflow.
+ */
+ static Concrete_Expression_Type
+ bounded_integer(Bounded_Integer_Type_Width width,
+ Bounded_Integer_Type_Representation representation,
+ Bounded_Integer_Type_Overflow overflow);
+
+ /*! \brief
+ Returns the floating point type corresponding to \p format.
+ */
+ static Concrete_Expression_Type
+ floating_point(Floating_Point_Format format);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a bounded
+ integer type.
+ */
+ bool is_bounded_integer() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a floating
+ point type.
+ */
+ bool is_floating_point() const;
+
+ /*! \brief
+ Returns the width in bits of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Width bounded_integer_type_width() const;
+
+ /*! \brief
+ Returns the representation of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Representation
+ bounded_integer_type_representation() const;
+
+ /*! \brief
+ Returns the overflow behavior of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Overflow
+ bounded_integer_type_overflow() const;
+
+ /*! \brief
+ Returns the format of the floating point type encoded by \p *this.
+
+ The behavior is undefined if \p *this does not encode a floating
+ point type.
+ */
+ Floating_Point_Format floating_point_format() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! A 32-bit word encoding the type.
+ struct Implementation {
+ bool bounded_integer:1;
+ unsigned int bounded_integer_type_width:23;
+ unsigned int bounded_integer_type_representation:2;
+ unsigned int bounded_integer_type_overflow:2;
+ unsigned int floating_point_format:4;
+ };
+
+ //! Constructor from \p implementation.
+ Concrete_Expression_Type(Implementation implementation);
+
+ //! The encoding of \p *this.
+ Implementation impl;
+};
+
+//! Base class for all concrete expressions.
+template <typename Target>
+class Concrete_Expression_Common {
+public:
+ //! Returns the type of \* this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the kind of \* this.
+ Concrete_Expression_Kind kind() const;
+
+ //! Tests if \p *this has the same kind as <CODE>Derived\<Target\></CODE>.
+ template <template <typename T> class Derived>
+ bool is() const;
+
+ /*! \brief
+ Returns a pointer to \p *this converted to type
+ <CODE>Derived\<Target\>*</CODE>.
+ */
+ template <template <typename T> class Derived>
+ Derived<Target>* as();
+
+ /*! \brief
+ Returns a pointer to \p *this converted to type
+ <CODE>const Derived\<Target\>*</CODE>.
+ */
+ template <template <typename T> class Derived>
+ const Derived<Target>* as() const;
+
+};
+
+//! Base class for binary operator applied to two concrete expressions.
+template <typename Target>
+class Binary_Operator_Common {
+public:
+ //! Returns a constant identifying the operator of \p *this.
+ Concrete_Expression_BOP binary_operator() const;
+
+ //! Returns the left-hand side of \p *this.
+ const Concrete_Expression<Target>* left_hand_side() const;
+
+ //! Returns the right-hand side of \p *this.
+ const Concrete_Expression<Target>* right_hand_side() const;
+};
+
+//! Base class for unary operator applied to one concrete expression.
+template <typename Target>
+class Unary_Operator_Common {
+public:
+ //! Returns a constant identifying the operator of \p *this.
+ Concrete_Expression_UOP unary_operator() const;
+
+ //! Returns the argument \p *this.
+ const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for cast operator concrete expressions.
+template <typename Target>
+class Cast_Operator_Common {
+ //! Returns the casted expression.
+ const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for integer constant concrete expressions.
+template <typename Target>
+class Integer_Constant_Common {
+};
+
+//! Base class for floating-point constant concrete expression.
+template <typename Target>
+class Floating_Point_Constant_Common {
+};
+
+//! Base class for references to some approximable.
+template <typename Target>
+class Approximable_Reference_Common {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Concrete_Expression_inlines.hh"
+
+#endif // !defined(PPL_Concrete_Expression_defs_hh)
diff --git a/src/Concrete_Expression_inlines.hh b/src/Concrete_Expression_inlines.hh
new file mode 100644
index 0000000..e6963e6
--- /dev/null
+++ b/src/Concrete_Expression_inlines.hh
@@ -0,0 +1,123 @@
+/* Concrete_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Concrete_Expression_inlines_hh
+#define PPL_Concrete_Expression_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression_Type
+::Concrete_Expression_Type(Implementation implementation)
+ : impl(implementation) {
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::bounded_integer(const Bounded_Integer_Type_Width width,
+ const Bounded_Integer_Type_Representation representation,
+ const Bounded_Integer_Type_Overflow overflow) {
+ Implementation impl;
+ impl.bounded_integer = true;
+ impl.bounded_integer_type_width = width;
+ impl.bounded_integer_type_representation = representation;
+ impl.bounded_integer_type_overflow = overflow;
+ // Arbitrary choice to ensure determinism.
+ impl.floating_point_format = IEEE754_HALF;
+ return Concrete_Expression_Type(impl);
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::floating_point(const Floating_Point_Format format) {
+ Implementation impl;
+ impl.bounded_integer = false;
+ impl.floating_point_format = format;
+ // Arbitrary choices to ensure determinism.
+ impl.bounded_integer_type_width = BITS_128;
+ impl.bounded_integer_type_representation = SIGNED_2_COMPLEMENT;
+ impl.bounded_integer_type_overflow = OVERFLOW_IMPOSSIBLE;
+ return Concrete_Expression_Type(impl);
+}
+
+inline bool
+Concrete_Expression_Type::is_bounded_integer() const {
+ return impl.bounded_integer;
+}
+
+inline bool
+Concrete_Expression_Type::is_floating_point() const {
+ return !impl.bounded_integer;
+}
+
+inline Bounded_Integer_Type_Width
+Concrete_Expression_Type::bounded_integer_type_width() const {
+ const unsigned int u = impl.bounded_integer_type_width;
+ return static_cast<Bounded_Integer_Type_Width>(u);
+}
+
+inline Bounded_Integer_Type_Representation
+Concrete_Expression_Type::bounded_integer_type_representation() const {
+ const unsigned int u = impl.bounded_integer_type_representation;
+ return static_cast<Bounded_Integer_Type_Representation>(u);
+}
+
+inline Bounded_Integer_Type_Overflow
+Concrete_Expression_Type::bounded_integer_type_overflow() const {
+ const unsigned int u = impl.bounded_integer_type_overflow;
+ return static_cast<Bounded_Integer_Type_Overflow>(u);
+}
+
+inline Floating_Point_Format
+Concrete_Expression_Type::floating_point_format() const {
+ const unsigned int u = impl.floating_point_format;
+ return static_cast<Floating_Point_Format>(u);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline bool
+Concrete_Expression_Common<Target>::is() const {
+ return static_cast<const Concrete_Expression<Target>*>(this)->kind() ==
+ Derived<Target>::KIND;
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline Derived<Target>*
+Concrete_Expression_Common<Target>::as() {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<Derived<Target>*>(this);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline const Derived<Target>*
+Concrete_Expression_Common<Target>::as() const {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<const Derived<Target>*>(this);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Concrete_Expression_inlines_hh)
diff --git a/src/Concrete_Expression_types.hh b/src/Concrete_Expression_types.hh
new file mode 100644
index 0000000..ea0f68e
--- /dev/null
+++ b/src/Concrete_Expression_types.hh
@@ -0,0 +1,98 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Concrete_Expression_types_hh
+#define PPL_Concrete_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+/*
+ NOTE: Doxygen seems to ignore documentation blocks attached to
+ template class declarations that are not provided with a definition.
+ This justifies (here below) the explicit use of Doxygen command \class.
+*/
+
+/*! \brief The base class of all concrete expressions.
+ \class Parma_Polyhedra_Library::Concrete_Expression
+*/
+template <typename Target>
+class Concrete_Expression;
+
+/*! \brief A binary operator applied to two concrete expressions.
+ \class Parma_Polyhedra_Library::Binary_Operator
+*/
+template <typename Target>
+class Binary_Operator;
+
+/*! \brief A unary operator applied to one concrete expression.
+ \class Parma_Polyhedra_Library::Unary_Operator
+*/
+template <typename Target>
+class Unary_Operator;
+
+/*! \brief A cast operator converting one concrete expression to some type.
+ \class Parma_Polyhedra_Library::Cast_Operator
+*/
+template <typename Target>
+class Cast_Operator;
+
+/*! \brief An integer constant concrete expression.
+ \class Parma_Polyhedra_Library::Integer_Constant
+*/
+template <typename Target>
+class Integer_Constant;
+
+/*! \brief A floating-point constant concrete expression.
+ \class Parma_Polyhedra_Library::Floating_Point_Constant
+*/
+template <typename Target>
+class Floating_Point_Constant;
+
+/*! \brief A concrete expression representing a reference to some approximable.
+ \class Parma_Polyhedra_Library::Approximable_Reference
+*/
+template <typename Target>
+class Approximable_Reference;
+
+class Concrete_Expression_Type;
+
+/*! \brief
+ Encodes the kind of concrete expression.
+
+ The values should be defined by the particular instance
+ and uniquely identify one of: Binary_Operator, Unary_Operator,
+ Cast_Operator, Integer_Constant, Floating_Point_Constant, or
+ Approximable_Reference. For example, the Binary_Operator kind
+ integer constant should be defined by an instance as the member
+ <CODE>Binary_Operator\<T\>::%KIND</CODE>.
+*/
+typedef int Concrete_Expression_Kind;
+
+/*! \brief
+ Encodes a binary operator of concrete expressions.
+
+ The values should be uniquely defined by the particular instance and
+ named: ADD, SUB, MUL, DIV, REM, BAND, BOR, BXOR, LSHIFT, RSHIFT.
+*/
+typedef int Concrete_Expression_BOP;
+
+/*! \brief
+ Encodes a unary operator of concrete expressions.
+
+ The values should be uniquely defined by the particular instance and
+ named: PLUS, MINUS, BNOT.
+*/
+typedef int Concrete_Expression_UOP;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Concrete_Expression_types_hh)
diff --git a/src/Congruence.cc b/src/Congruence.cc
new file mode 100644
index 0000000..a8ad80b
--- /dev/null
+++ b/src/Congruence.cc
@@ -0,0 +1,271 @@
+/* Congruence class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Congruence_defs.hh"
+#include "Variable_defs.hh"
+#include "Constraint_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence::Congruence(const Constraint& c, Representation r)
+ : expr(c.expression(), c.space_dimension(), r),
+ modulus_(0) {
+ if (!c.is_equality())
+ throw_invalid_argument("Congruence(c, r)",
+ "constraint c must be an equality.");
+}
+
+PPL::Congruence::Congruence(const Constraint& c,
+ dimension_type new_space_dimension,
+ Representation r)
+ : expr(c.expression(), new_space_dimension, r),
+ modulus_(0) {
+ if (!c.is_equality())
+ throw_invalid_argument("Congruence(c, space_dim, r)",
+ "constraint c must be an equality.");
+}
+
+void
+PPL::Congruence::sign_normalize() {
+ expr.sign_normalize();
+}
+
+void
+PPL::Congruence::normalize() {
+ PPL_ASSERT(OK());
+ sign_normalize();
+
+ if (modulus_ == 0)
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ c = expr.inhomogeneous_term();
+ // Factor the modulus out of the inhomogeneous term.
+ c %= modulus_;
+ if (c < 0)
+ // Make inhomogeneous term positive.
+ c += modulus_;
+ expr.set_inhomogeneous_term(c);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence::strong_normalize() {
+ normalize();
+
+ Coefficient gcd = expr.gcd(0, expr.space_dimension() + 1);
+ if (gcd == 0)
+ gcd = modulus_;
+ else
+ gcd_assign(gcd, modulus_, gcd);
+
+ if (gcd != 0 && gcd != 1) {
+ expr /= gcd;
+ modulus_ /= gcd;
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence::scale(Coefficient_traits::const_reference factor) {
+ if (factor == 1)
+ // Nothing to do.
+ return;
+
+ expr *= factor;
+ modulus_ *= factor;
+}
+
+void
+PPL::Congruence
+::affine_preimage(Variable v, const Linear_Expression& e,
+ Coefficient_traits::const_reference denominator) {
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ c = expr.get(v);
+
+ if (c == 0)
+ return;
+
+ scale(denominator);
+
+ expr.linear_combine(e, 1, c, 0, e.space_dimension() + 1);
+
+ if (v.space_dimension() > e.space_dimension() || e.get(v) == 0)
+ // Not invertible
+ expr.set(v, Coefficient_zero());
+ else {
+ c *= e.get(v);
+ expr.set(v, c);
+ }
+}
+
+PPL::Congruence
+PPL::Congruence::create(const Linear_Expression& e1,
+ const Linear_Expression& e2,
+ Representation r) {
+ Linear_Expression e(e1,
+ std::max(e1.space_dimension(), e2.space_dimension()),
+ r);
+ e -= e2;
+ return Congruence(e, 1, Recycle_Input());
+}
+
+void
+PPL::Congruence::throw_invalid_argument(const char* method,
+ const char* message) const {
+ std::ostringstream s;
+ s << "PPL::Congruence::" << method << ":" << std::endl
+ << message;
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Congruence::throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ const Variable v) const {
+ std::ostringstream s;
+ s << "this->space_dimension() == " << space_dimension() << ", "
+ << v_name << ".space_dimension() == " << v.space_dimension() << ".";
+ const std::string str = s.str();
+ throw_invalid_argument(method, str.c_str());
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence& c) {
+ const dimension_type num_variables = c.space_dimension();
+ PPL_DIRTY_TEMP_COEFFICIENT(cv);
+ bool first = true;
+ const Congruence::expr_type c_e = c.expression();
+ for (Congruence::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+ cv = *i;
+ if (!first) {
+ if (cv > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(cv);
+ }
+ }
+ else
+ first = false;
+ if (cv == -1)
+ s << "-";
+ else if (cv != 1)
+ s << cv << "*";
+ s << i.variable();
+ }
+ if (first)
+ s << Coefficient_zero();
+ s << " = " << -c.inhomogeneous_term();
+ if (c.is_proper_congruence())
+ s << " (mod " << c.modulus() << ")";
+ return s;
+}
+
+bool
+PPL::Congruence::is_tautological() const {
+ if (is_equality())
+ return (inhomogeneous_term() == 0) && expr.all_homogeneous_terms_are_zero();
+
+ return (inhomogeneous_term() % modulus() == 0) && expr.all_homogeneous_terms_are_zero();
+}
+
+bool
+PPL::Congruence::is_inconsistent() const {
+ if (is_equality())
+ return (inhomogeneous_term() != 0) && expr.all_homogeneous_terms_are_zero();
+
+ return (inhomogeneous_term() % modulus() != 0) && expr.all_homogeneous_terms_are_zero();
+}
+
+void
+PPL::Congruence::ascii_dump(std::ostream& s) const {
+ expr.ascii_dump(s);
+ s << " m " << modulus_ << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence)
+
+bool
+PPL::Congruence::ascii_load(std::istream& s) {
+ expr.ascii_load(s);
+
+ std::string str;
+ if (!(s >> str) || str != "m")
+ return false;
+
+ if (!(s >> modulus_))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+bool
+PPL::Congruence::OK() const {
+ // Modulus check.
+ if (modulus() < 0) {
+#ifndef NDEBUG
+ std::cerr << "Congruence has a negative modulus " << modulus() << "."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // All tests passed.
+ return true;
+}
+
+const PPL::Congruence* PPL::Congruence::zero_dim_false_p = 0;
+const PPL::Congruence* PPL::Congruence::zero_dim_integrality_p = 0;
+
+void
+PPL::Congruence::initialize() {
+ PPL_ASSERT(zero_dim_false_p == 0);
+ zero_dim_false_p
+ = new Congruence((Linear_Expression::zero() %= Coefficient(-1)) / 0);
+
+ PPL_ASSERT(zero_dim_integrality_p == 0);
+ zero_dim_integrality_p
+ = new Congruence(Linear_Expression::zero() %= Coefficient(-1));
+}
+
+void
+PPL::Congruence::finalize() {
+ PPL_ASSERT(zero_dim_false_p != 0);
+ delete zero_dim_false_p;
+ zero_dim_false_p = 0;
+
+ PPL_ASSERT(zero_dim_integrality_p != 0);
+ delete zero_dim_integrality_p;
+ zero_dim_integrality_p = 0;
+}
diff --git a/src/Congruence_System.cc b/src/Congruence_System.cc
new file mode 100644
index 0000000..f4edb8f
--- /dev/null
+++ b/src/Congruence_System.cc
@@ -0,0 +1,471 @@
+/* Congruence_System class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence_System::Congruence_System(const Constraint_System& cs,
+ Representation r)
+ : rows(),
+ space_dimension_(cs.space_dimension()),
+ representation_(r) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ insert(*i);
+}
+
+void
+PPL::Congruence_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ for (dimension_type k = rows.size(); k-- > 0; ) {
+ Congruence& rows_k = rows[k];
+ rows_k.permute_space_dimensions(cycle);
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::remove_rows(const dimension_type first,
+ const dimension_type last,
+ bool keep_sorted) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= num_rows());
+ const dimension_type n = last - first;
+
+ // Swap the rows in [first, last) with the rows in [size() - n, size())
+ // (note that these intervals may not be disjunct).
+ if (keep_sorted) {
+ for (dimension_type i = last; i < rows.size(); ++i)
+ swap(rows[i], rows[i - n]);
+ }
+ else {
+ const dimension_type offset = rows.size() - n - first;
+ for (dimension_type i = first; i < last; ++i)
+ swap(rows[i], rows[i + offset]);
+ }
+
+ rows.resize(rows.size() - n);
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Congruence_System
+::set_space_dimension(const dimension_type new_space_dim) {
+ if (space_dimension() != new_space_dim) {
+ space_dimension_ = new_space_dim;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].set_space_dimension(new_space_dim);
+ }
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::Congruence_System::swap_space_dimensions(Variable v1, Variable v2) {
+ for (dimension_type k = num_rows(); k-- > 0; )
+ rows[k].swap_space_dimensions(v1, v2);
+}
+
+void
+PPL::Congruence_System::insert_verbatim(Congruence& cg, Recycle_Input) {
+ // TODO: Remove this.
+ PPL_ASSERT(cg.OK());
+
+ cg.set_representation(representation());
+
+ if (cg.space_dimension() >= space_dimension())
+ set_space_dimension(cg.space_dimension());
+ else
+ cg.set_space_dimension(space_dimension());
+
+ rows.resize(num_rows() + 1);
+
+ swap(cg, rows.back());
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Constraint& c) {
+ if (c.space_dimension() > space_dimension())
+ set_space_dimension(c.space_dimension());
+ Congruence cg(c, space_dimension(), representation());
+ cg.strong_normalize();
+ rows.resize(num_rows() + 1);
+
+ swap(cg, rows.back());
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(Congruence_System& cgs, Recycle_Input) {
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type cgs_num_rows = cgs.num_rows();
+ if (space_dimension() < cgs.space_dimension())
+ set_space_dimension(cgs.space_dimension());
+ rows.resize(old_num_rows + cgs_num_rows);
+ for (dimension_type i = cgs_num_rows; i-- > 0; ) {
+ cgs.rows[i].set_space_dimension(space_dimension());
+ cgs.rows[i].set_representation(representation());
+ swap(cgs.rows[i], rows[old_num_rows + i]);
+ }
+ cgs.clear();
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Congruence_System& y) {
+ Congruence_System& x = *this;
+
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type y_num_rows = y.num_rows();
+
+ // Grow to the required size.
+ if (space_dimension() < y.space_dimension())
+ set_space_dimension(y.space_dimension());
+
+ rows.resize(rows.size() + y_num_rows);
+
+ // Copy the rows of `y', with the new space dimension.
+ for (dimension_type i = y_num_rows; i-- > 0; ) {
+ Congruence copy(y[i], space_dimension(), representation());
+ swap(copy, x.rows[x_num_rows+i]);
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::normalize_moduli() {
+ const Congruence_System& cgs = *this;
+ dimension_type row = cgs.num_rows();
+ if (row > 0) {
+ // Calculate the LCM of all the moduli.
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+ // Find last proper congruence.
+ while (true) {
+ --row;
+ lcm = cgs[row].modulus();
+ if (lcm > 0)
+ break;
+ if (row == 0)
+ // All rows are equalities.
+ return;
+ }
+ while (row > 0) {
+ --row;
+ const Coefficient& modulus = cgs[row].modulus();
+ if (modulus > 0)
+ lcm_assign(lcm, lcm, modulus);
+ }
+
+ // Represent every row using the LCM as the modulus.
+ PPL_DIRTY_TEMP_COEFFICIENT(factor);
+ for (row = num_rows(); row-- > 0; ) {
+ const Coefficient& modulus = cgs[row].modulus();
+ if (modulus <= 0 || modulus == lcm)
+ continue;
+ exact_div_assign(factor, lcm, modulus);
+ rows[row].scale(factor);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
+ return (*this) == cgs;
+}
+
+bool
+PPL::Congruence_System::has_linear_equalities() const {
+ const Congruence_System& cgs = *this;
+ for (dimension_type i = cgs.num_rows(); i-- > 0; )
+ if (cgs[i].modulus() == 0)
+ return true;
+ return false;
+}
+
+void
+PPL::Congruence_System::const_iterator::skip_forward() {
+ const Swapping_Vector<Congruence>::const_iterator csp_end = csp->end();
+ while (i != csp_end && (*this)->is_tautological())
+ ++i;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_equalities() const {
+ const Congruence_System& cgs = *this;
+ dimension_type n = 0;
+ for (dimension_type i = num_rows(); i-- > 0 ; )
+ if (cgs[i].is_equality())
+ ++n;
+ return n;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_proper_congruences() const {
+ const Congruence_System& cgs = *this;
+ dimension_type n = 0;
+ for (dimension_type i = num_rows(); i-- > 0 ; ) {
+ const Congruence& cg = cgs[i];
+ if (cg.is_proper_congruence())
+ ++n;
+ }
+ return n;
+}
+
+bool
+PPL::Congruence_System::
+satisfies_all_congruences(const Grid_Generator& g) const {
+ PPL_ASSERT(g.space_dimension() <= space_dimension());
+
+ const Congruence_System& cgs = *this;
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+ if (g.is_line())
+ for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+ const Congruence& cg = cgs[i];
+ Scalar_Products::assign(sp, g, cg);
+ if (sp != 0)
+ return false;
+ }
+ else {
+ const Coefficient& divisor = g.divisor();
+ for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+ const Congruence& cg = cgs[i];
+ Scalar_Products::assign(sp, g, cg);
+ if (cg.is_equality()) {
+ if (sp != 0)
+ return false;
+ }
+ else if (sp % (cg.modulus() * divisor) != 0)
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+PPL::Congruence_System::has_a_free_dimension() const {
+ // Search for a dimension that is free of any congruence or equality
+ // constraint. Assumes a minimized system.
+ std::set<dimension_type> candidates;
+ for (dimension_type i = space_dimension(); i-- > 0; )
+ candidates.insert(i + 1);
+
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ rows[i].expression().has_a_free_dimension_helper(candidates);
+ if (candidates.empty())
+ return false;
+ }
+ return !candidates.empty();
+}
+
+void
+PPL::Congruence_System::
+affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ PPL_ASSERT(expr.space_dimension() <= space_dimension());
+ PPL_ASSERT(denominator > 0);
+
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].affine_preimage(v, expr, denominator);
+}
+
+void
+PPL::Congruence_System::ascii_dump(std::ostream& s) const {
+ const Congruence_System& x = *this;
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type x_space_dim = x.space_dimension();
+ s << x_num_rows << " x " << x_space_dim << " ";
+ Parma_Polyhedra_Library::ascii_dump(s, representation());
+ s << std::endl;
+ for (dimension_type i = 0; i < x_num_rows; ++i)
+ x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence_System)
+
+bool
+PPL::Congruence_System::ascii_load(std::istream& s) {
+ std::string str;
+ dimension_type num_rows;
+ dimension_type space_dim;
+ if (!(s >> num_rows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> space_dim))
+ return false;
+ clear();
+ space_dimension_ = space_dim;
+
+ if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+ return false;
+
+ Congruence c;
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ if (!c.ascii_load(s))
+ return false;
+ insert_verbatim(c, Recycle_Input());
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+const PPL::Congruence_System* PPL::Congruence_System::zero_dim_empty_p = 0;
+
+void
+PPL::Congruence_System::initialize() {
+ PPL_ASSERT(zero_dim_empty_p == 0);
+ zero_dim_empty_p
+ = new Congruence_System(Congruence::zero_dim_false());
+}
+
+void
+PPL::Congruence_System::finalize() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ delete zero_dim_empty_p;
+ zero_dim_empty_p = 0;
+}
+
+bool
+PPL::Congruence_System::OK() const {
+ // All rows must have space dimension `space_dimension()'
+ // and representation `representation()'.
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ const Congruence& cg = rows[i];
+ if (cg.space_dimension() != space_dimension())
+ return false;
+ if (cg.representation() != representation())
+ return false;
+ if (!cg.OK())
+ return false;
+ }
+ // All checks passed.
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence_System& cgs) {
+ Congruence_System::const_iterator i = cgs.begin();
+ const Congruence_System::const_iterator cgs_end = cgs.end();
+ if (i == cgs_end)
+ return s << "true";
+ while (true) {
+ Congruence cg = *i;
+ cg.strong_normalize();
+ s << cg;
+ ++i;
+ if (i == cgs_end)
+ return s;
+ s << ", ";
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+bool
+PPL::operator==(const Congruence_System& x, const Congruence_System& y) {
+ if (x.num_rows() != y.num_rows())
+ return false;
+ for (dimension_type i = x.num_rows(); i-- > 0; ) {
+ // NOTE: this also checks for space dimension.
+ if (x[i] != y[i])
+ return false;
+ }
+ return true;
+}
+
+void
+PPL::Congruence_System
+::add_unit_rows_and_space_dimensions(dimension_type dims) {
+ const dimension_type old_num_rows = num_rows();
+ set_space_dimension(space_dimension() + dims);
+
+ rows.resize(rows.size() + dims);
+
+ // Swap the added rows to the front of the vector.
+ for (dimension_type row = old_num_rows; row-- > 0; )
+ swap(rows[row], rows[row + dims]);
+
+ const dimension_type dim = space_dimension();
+ // Set the space dimension and the diagonal element of each added row.
+ for (dimension_type row = dims; row-- > 0; ) {
+ Linear_Expression expr(representation());
+ expr.set_space_dimension(space_dimension());
+ PPL_ASSERT(dim >= row + 1);
+ expr += Variable(dim - row - 1);
+ // This constructor steals the contents of `expr'.
+ Congruence cg(expr, Coefficient_zero(), Recycle_Input());
+ swap(rows[row], cg);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::concatenate(const Congruence_System& y) {
+ // TODO: this implementation is just an executable specification.
+ Congruence_System cgs = y;
+
+ const dimension_type added_rows = cgs.num_rows();
+ const dimension_type added_columns = cgs.space_dimension();
+
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type old_space_dim = space_dimension();
+
+ set_space_dimension(space_dimension() + added_columns);
+
+ rows.resize(rows.size() + added_rows);
+
+ // Move the congruences into *this from `cgs', shifting the
+ // coefficients along into the appropriate columns.
+ for (dimension_type i = added_rows; i-- > 0; ) {
+ Congruence& cg_old = cgs.rows[i];
+ Congruence& cg_new = rows[old_num_rows + i];
+ cg_old.set_representation(representation());
+ cg_old.shift_space_dimensions(Variable(0), old_space_dim);
+ swap(cg_old, cg_new);
+ }
+}
diff --git a/src/Congruence_System_defs.hh b/src/Congruence_System_defs.hh
new file mode 100644
index 0000000..18296dc
--- /dev/null
+++ b/src/Congruence_System_defs.hh
@@ -0,0 +1,544 @@
+/* Congruence_System class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_System_defs_hh
+#define PPL_Congruence_System_defs_hh 1
+
+#include "Congruence_System_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Swapping_Vector_defs.hh"
+#include "Congruence_defs.hh"
+#include "Constraint_System_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+}
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Congruence_System is a system of congruences,
+ i.e., a multiset of objects of the class Congruence.
+ When inserting congruences in a system, space dimensions are
+ automatically adjusted so that all the congruences in the system
+ are defined on the same vector space.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a system of congruences corresponding to
+ an integer grid in \f$\Rset^2\f$:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x %= 0);
+ cgs.insert(y %= 0);
+ \endcode
+ Note that:
+ the congruence system is created with space dimension zero;
+ the first and second congruence insertions increase the space
+ dimension to \f$1\f$ and \f$2\f$, respectively.
+
+ \par Example 2
+ By adding to the congruence system of the previous example,
+ the congruence \f$x + y = 1 \pmod{2}\f$:
+ \code
+ cgs.insert((x + y %= 1) / 2);
+ \endcode
+ we obtain the grid containing just those integral
+ points where the sum of the \p x and \p y values is odd.
+
+ \par Example 3
+ The following code builds a system of congruences corresponding to
+ the grid in \f$\Zset^2\f$ containing just the integral points on
+ the \p x axis:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x %= 0);
+ cgs.insert((y %= 0) / 0);
+ \endcode
+
+ \note
+ After inserting a multiset of congruences in a congruence system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> congruence system
+ will be available, where original congruences may have been
+ reordered, removed (if they are trivial, duplicate or
+ implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System {
+public:
+
+ typedef Congruence row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of congruences.
+ explicit Congruence_System(Representation r = default_representation);
+
+ //! Builds an empty (i.e. zero rows) system of dimension \p d.
+ explicit Congruence_System(dimension_type d,
+ Representation r = default_representation);
+
+ //! Builds the singleton system containing only congruence \p cg.
+ explicit Congruence_System(const Congruence& cg,
+ Representation r = default_representation);
+
+ /*! \brief
+ If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+ singleton system containing only constraint \f$ e_1 = e_2
+ \pmod{0}\f$.
+
+ \exception std::invalid_argument
+ Thrown if \p c is not an equality constraint.
+ */
+ explicit Congruence_System(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Builds a system containing copies of any equalities in \p cs.
+ explicit Congruence_System(const Constraint_System& cs,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note
+ The new Congruence_System will have the same Representation as `cgs'
+ so that it's indistinguishable from `cgs'.
+ */
+ Congruence_System(const Congruence_System& cgs);
+
+ //! Copy constructor with specified representation.
+ Congruence_System(const Congruence_System& cgs, Representation r);
+
+ //! Destructor.
+ ~Congruence_System();
+
+ //! Assignment operator.
+ Congruence_System& operator=(const Congruence_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Congruence_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+ to \p y.
+ */
+ bool is_equal_to(const Congruence_System& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains one or
+ more linear equalities.
+ */
+ bool has_linear_equalities() const;
+
+ //! Removes all the congruences and sets the space dimension to 0.
+ void clear();
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruence \p cg, increasing the
+ number of space dimensions if needed.
+
+ The copy of \p cg will be strongly normalized after being
+ inserted.
+ */
+ void insert(const Congruence& cg);
+
+ /*! \brief
+ Inserts in \p *this the congruence \p cg, stealing its contents and
+ increasing the number of space dimensions if needed.
+
+ \p cg will be strongly normalized.
+ */
+ void insert(Congruence& cg, Recycle_Input);
+
+ /*! \brief
+ Inserts in \p *this a copy of the equality constraint \p c, seen
+ as a modulo 0 congruence, increasing the number of space
+ dimensions if needed.
+
+ The modulo 0 congruence will be strongly normalized after being
+ inserted.
+
+ \exception std::invalid_argument
+ Thrown if \p c is a relational constraint.
+ */
+ void insert(const Constraint& c);
+
+ // TODO: Consider adding a insert(cg, Recycle_Input).
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruences in \p y,
+ increasing the number of space dimensions if needed.
+
+ The inserted copies will be strongly normalized.
+ */
+ void insert(const Congruence_System& y);
+
+ /*! \brief
+ Inserts into \p *this the congruences in \p cgs, increasing the
+ number of space dimensions if needed.
+ */
+ void insert(Congruence_System& cgs, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the system containing only Congruence::zero_dim_false().
+ static const Congruence_System& zero_dim_empty();
+
+ //! An iterator over a system of congruences.
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each congruence contained in an object of Congruence_System.
+
+ \par Example
+ The following code prints the system of congruences
+ defining the grid <CODE>gr</CODE>:
+ \code
+ const Congruence_System& cgs = gr.congruences();
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Congruence,
+ ptrdiff_t,
+ const Congruence*,
+ const Congruence&> {
+ public:
+ //! Default constructor.
+ const_iterator();
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Destructor.
+ ~const_iterator();
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ const Congruence& operator*() const;
+
+ //! Indirect member selector.
+ const Congruence* operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ different.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ friend class Congruence_System;
+
+ //! The const iterator over the vector of congruences.
+ Swapping_Vector<Congruence>::const_iterator i;
+
+ //! A const pointer to the vector of congruences.
+ const Swapping_Vector<Congruence>* csp;
+
+ //! Constructor.
+ const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+ const Congruence_System& cgs);
+
+ //! \p *this skips to the next non-trivial congruence.
+ void skip_forward();
+ };
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first congruence, if \p
+ *this is not empty; otherwise, returns the past-the-end
+ const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*!
+ Returns <CODE>true</CODE> if and only if all rows have space dimension
+ space_dimension_, each row in the system is a valid Congruence and the
+ space dimension is consistent with the number of congruences.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the number of equalities.
+ dimension_type num_equalities() const;
+
+ //! Returns the number of proper congruences.
+ dimension_type num_proper_congruences() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Congruence_System& y);
+
+ /*! \brief
+ Adds \p dims rows and \p dims space dimensions to the matrix,
+ initializing the added rows as in the unit congruence system.
+
+ \param dims
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+ (c+dims)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_unit_rows_and_space_dimensions(dimension_type dims);
+
+ //! Permutes the space dimensions of the system.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Sets the number of space dimensions to \p new_space_dim.
+ /*!
+ If \p new_space_dim is lower than the current space dimension, the
+ coefficients referring to the removed space dimensions are lost.
+ */
+ bool set_space_dimension(dimension_type new_space_dim);
+
+ // Note: the following method is protected to allow tests/Grid/congruences2
+ // to call it using a derived class.
+protected:
+ //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+ bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+ //! Returns the number of rows in the system.
+ dimension_type num_rows() const;
+
+ //! Returns \c true if num_rows()==0.
+ bool has_no_rows() const;
+
+ //! Returns a constant reference to the \p k- th congruence of the system.
+ const Congruence& operator[](dimension_type k) const;
+
+ //! Adjusts all expressions to have the same moduli.
+ void normalize_moduli();
+
+ /*! \brief
+ Substitutes a given column of coefficients by a given affine
+ expression.
+
+ \param v
+ Index of the column to which the affine transformation is
+ substituted;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We allow affine transformations (see the Section \ref
+ rational_grid_operations) to have rational
+ coefficients. Since the coefficients of linear expressions are
+ integers we also provide an integer \p denominator that will
+ be used as denominator of the affine transformation. The
+ denominator is required to be a positive integer and its default value
+ is 1.
+
+ The affine transformation substitutes the matrix of congruences
+ by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+ the old one \f$a_{ij}\f$ as follows:
+ \f[
+ {a'}_{ij} =
+ \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+ \quad \text{for } j \neq v; \\
+ \mathrm{expr}[v] * a_{iv}
+ \quad \text{for } j = v.
+ \end{cases}
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ // TODO: Consider making this private.
+ /*! \brief
+ Concatenates copies of the congruences from \p y onto \p *this.
+
+ \param y
+ The congruence system to append to \p this. The number of rows in
+ \p y must be strictly positive.
+
+ The matrix for the new system of congruences is obtained by
+ leaving the old system in the upper left-hand side and placing the
+ congruences of \p y in the lower right-hand side, and padding
+ with zeroes.
+ */
+ void concatenate(const Congruence_System& y);
+
+ /*! \brief
+ Inserts in \p *this the congruence \p cg, stealing its contents and
+ increasing the number of space dimensions if needed.
+
+ This method inserts \p cg in the given form, instead of first strong
+ normalizing \p cg as \ref insert would do.
+ */
+ void insert_verbatim(Congruence& cg, Recycle_Input);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ If \p keep_sorted is <CODE>true</CODE>, the ordering of the remaining rows
+ will be preserved.
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted);
+
+ void remove_trailing_rows(dimension_type n);
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Congruence::zero_dim_false().
+ */
+ static const Congruence_System* zero_dim_empty_p;
+
+ Swapping_Vector<Congruence> rows;
+
+ dimension_type space_dimension_;
+
+ Representation representation_;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if any of the dimensions in
+ \p *this is free of constraint.
+
+ Any equality or proper congruence affecting a dimension constrains
+ that dimension.
+
+ This method assumes the system is in minimal form.
+ */
+ bool has_a_free_dimension() const;
+
+ friend class Grid;
+
+ friend bool
+ operator==(const Congruence_System& x, const Congruence_System& y);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Congruence_System
+ Writes <CODE>true</CODE> if \p cgs is empty. Otherwise, writes on
+ \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+/*! \relates Congruence_System */
+void
+swap(Congruence_System& x, Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Congruence_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Congruence_System_defs_hh)
diff --git a/src/Congruence_System_inlines.hh b/src/Congruence_System_inlines.hh
new file mode 100644
index 0000000..c63fb1f
--- /dev/null
+++ b/src/Congruence_System_inlines.hh
@@ -0,0 +1,272 @@
+/* Congruence_System class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_System_inlines_hh
+#define PPL_Congruence_System_inlines_hh 1
+
+#include "Congruence_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+ return rows[k];
+}
+
+inline dimension_type
+Congruence_System::num_rows() const {
+ return rows.size();
+}
+
+inline bool
+Congruence_System::has_no_rows() const {
+ return num_rows() == 0;
+}
+
+inline void
+Congruence_System::remove_trailing_rows(dimension_type n) {
+ PPL_ASSERT(num_rows() >= n);
+ rows.resize(num_rows() - n);
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+ Congruence tmp = cg;
+ insert(tmp, Recycle_Input());
+}
+
+inline void
+Congruence_System::insert(Congruence& cg, Recycle_Input) {
+ PPL_ASSERT(cg.OK());
+ cg.strong_normalize();
+ PPL_ASSERT(cg.OK());
+ insert_verbatim(cg, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence_System::Congruence_System(Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg, Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+ insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c, Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+ insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs)
+ : rows(cgs.rows),
+ space_dimension_(cgs.space_dimension_),
+ representation_(cgs.representation_) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs,
+ Representation r)
+ : rows(cgs.rows),
+ space_dimension_(cgs.space_dimension_),
+ representation_(r) {
+ if (cgs.representation() != r) {
+ for (dimension_type i = 0; i < num_rows(); ++i)
+ rows[i].set_representation(representation());
+ }
+}
+
+inline
+Congruence_System::Congruence_System(const dimension_type d, Representation r)
+ : rows(),
+ space_dimension_(d),
+ representation_(r) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+ Congruence_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Congruence_System::representation() const {
+ return representation_;
+}
+
+inline void
+Congruence_System::set_representation(Representation r) {
+ if (representation_ == r)
+ return;
+ representation_ = r;
+ for (dimension_type i = 0; i < num_rows(); ++i)
+ rows[i].set_representation(r);
+ PPL_ASSERT(OK());
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+ return Congruence::max_space_dimension();
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+ return space_dimension_;
+}
+
+inline void
+Congruence_System::clear() {
+ rows.clear();
+ space_dimension_ = 0;
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ return *zero_dim_empty_p;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+ ++i;
+ skip_forward();
+ return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+ const const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+ const Congruence_System& cgs)
+ : i(iter), csp(&cgs.rows) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+ const_iterator i(rows.begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+ const const_iterator i(rows.end(), *this);
+ return i;
+}
+
+inline bool
+Congruence_System::empty() const {
+ return begin() == end();
+}
+
+inline void
+Congruence_System::m_swap(Congruence_System& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(space_dimension_, y.space_dimension_);
+ swap(representation_, y.representation_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+ return rows.external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Congruence_System */
+inline void
+swap(Congruence_System& x, Congruence_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Congruence_System_inlines_hh)
diff --git a/src/Congruence_System_types.hh b/src/Congruence_System_types.hh
new file mode 100644
index 0000000..0e3e919
--- /dev/null
+++ b/src/Congruence_System_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_System_types_hh
+#define PPL_Congruence_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+#endif // !defined(PPL_Congruence_System_types_hh)
diff --git a/src/Congruence_defs.hh b/src/Congruence_defs.hh
new file mode 100644
index 0000000..92e0045
--- /dev/null
+++ b/src/Congruence_defs.hh
@@ -0,0 +1,506 @@
+/* Congruence class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_defs_hh
+#define PPL_Congruence_defs_hh 1
+
+#include "Congruence_types.hh"
+
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+
+#include "Constraint_types.hh"
+#include "Grid_types.hh"
+#include "Scalar_Products_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Expression_Adapter_defs.hh"
+
+#include <iosfwd>
+#include <vector>
+
+// These are declared here because they are friend of Congruence.
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Congruence is a congruence:
+ - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+ where \f$n\f$ is the dimension of the space,
+ \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+ \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+ if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+ \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+ and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+ said to be a proper congruence.
+
+ \par How to build a congruence
+ Congruences \f$\pmod{1}\f$ are typically built by
+ applying the congruence symbol `<CODE>\%=</CODE>'
+ to a pair of linear expressions.
+ Congruences with modulus \p m
+ are typically constructed by building a congruence \f$\pmod{1}\f$
+ using the given pair of linear expressions
+ and then adding the modulus \p m
+ using the modulus symbol is `<CODE>/</CODE>'.
+
+ The space dimension of a congruence is defined as the maximum
+ space dimension of the arguments of its constructor.
+
+ \par
+ In the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds the equality congruence
+ \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+ \code
+ Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+ \endcode
+ The following code builds the congruence
+ \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+ \code
+ Congruence mod1_cg(4*x %= 2*y - 13);
+ \endcode
+ The following code builds the congruence
+ \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+ \code
+ Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+ \endcode
+ An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+ can be specified as follows:
+ \code
+ Congruence false_cg = Congruence::zero_dim_false();
+ \endcode
+ Equivalent, but more involved ways are the following:
+ \code
+ Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+ Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+ \endcode
+ In contrast, the following code defines an unsatisfiable congruence
+ having space dimension \f$3\f$:
+ \code
+ Congruence false_cg3((0*z %= 1) / 0);
+ \endcode
+
+ \par How to inspect a congruence
+ Several methods are provided to examine a congruence and extract
+ all the encoded information: its space dimension, its modulus
+ and the value of its integer coefficients.
+
+ \par Example 2
+ The following code shows how it is possible to access the modulus
+ as well as each of the coefficients.
+ Given a congruence with linear expression \p e and modulus \p m
+ (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+ congruence with the same modulus \p m but where the linear
+ expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+ \code
+ Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+ cout << "Congruence cg1: " << cg1 << endl;
+ const Coefficient& m = cg1.modulus();
+ if (m == 0)
+ cout << "Congruence cg1 is an equality." << endl;
+ else {
+ Linear_Expression e;
+ for (dimension_type i = cg1.space_dimension(); i-- > 0; )
+ e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+ e += 2 * cg1.inhomogeneous_term();
+ Congruence cg2((e %= 0) / m);
+ cout << "Congruence cg2: " << cg2 << endl;
+ }
+ \endcode
+ The actual output could be the following:
+ \code
+ Congruence cg1: A - 5*B + 3*C %= 4 / 5
+ Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+ \endcode
+ Note that, in general, the particular output obtained can be
+ syntactically different from the (semantically equivalent)
+ congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence {
+public:
+
+ //! The representation used for new Congruences.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Constructs the 0 = 0 congruence with space dimension \p 0 .
+ explicit Congruence(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The new Congruence will have the same representation as `cg',
+ not default_representation, so that they are indistinguishable.
+ */
+ Congruence(const Congruence& cg);
+
+ //! Copy constructor with specified representation.
+ Congruence(const Congruence& cg, Representation r);
+
+ //! Copy-constructs (modulo 0) from equality constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p c is an inequality.
+ */
+ explicit Congruence(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Destructor.
+ ~Congruence();
+
+ //! Assignment operator.
+ Congruence& operator=(const Congruence& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Congruence can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ void permute_space_dimensions(const std::vector<Variable>& cycles);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Adapter_Transparent<Linear_Expression> expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument thrown if the index of \p v
+ is greater than or equal to the space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns a const reference to the modulus of \p *this.
+ Coefficient_traits::const_reference modulus() const;
+
+ //! Sets the modulus of \p *this to \p m .
+ //! If \p m is 0, the congruence becomes an equality.
+ void set_modulus(Coefficient_traits::const_reference m);
+
+ //! Multiplies all the coefficients, including the modulus, by \p factor .
+ void scale(Coefficient_traits::const_reference factor);
+
+ // TODO: Document this.
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Multiplies \p k into the modulus of \p *this.
+ /*!
+ If called with \p *this representing the congruence \f$ e_1 = e_2
+ \pmod{m}\f$, then it returns with *this representing
+ the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+ */
+ Congruence&
+ operator/=(Coefficient_traits::const_reference k);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a tautology
+ (i.e., an always true congruence).
+
+ A tautological congruence has one the following two forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+ - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b = 0 \pmod{m}\f$.
+ */
+ bool is_tautological() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is inconsistent (i.e., an always false congruence).
+
+ An inconsistent congruence has one of the following two forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+ where \f$b \neq 0\f$; or
+ - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b \neq 0 \pmod{m}\f$.
+ */
+ bool is_inconsistent() const;
+
+ //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+ /*!
+ A congruence with a modulus of 0 is a linear equality.
+ */
+ bool is_proper_congruence() const;
+
+ //! Returns <CODE>true</CODE> if \p *this is an equality.
+ /*!
+ A modulus of zero denotes a linear equality.
+ */
+ bool is_equality() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns a reference to the true (zero-dimension space) congruence
+ \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+ congruence</EM>.
+ */
+ static const Congruence& zero_dim_integrality();
+
+ /*! \brief
+ Returns a reference to the false (zero-dimension space) congruence
+ \f$0 = 1 \pmod{0}\f$.
+ */
+ static const Congruence& zero_dim_false();
+
+ //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+ static Congruence
+ create(const Linear_Expression& e1, const Linear_Expression& e2,
+ Representation r = default_representation);
+
+ //! Returns the congruence \f$e = n \pmod{1}\f$.
+ static Congruence
+ create(const Linear_Expression& e, Coefficient_traits::const_reference n,
+ Representation r = default_representation);
+
+ //! Returns the congruence \f$n = e \pmod{1}\f$.
+ static Congruence
+ create(Coefficient_traits::const_reference n, const Linear_Expression& e,
+ Representation r = default_representation);
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Congruence& y);
+
+ //! Copy-constructs with the specified space dimension.
+ /*!
+ \note The new Congruence will have the same representation as `cg',
+ not default_representation, for consistency with the copy
+ constructor.
+ */
+ Congruence(const Congruence& cg, dimension_type new_space_dimension);
+
+ //! Copy-constructs with the specified space dimension and representation.
+ Congruence(const Congruence& cg, dimension_type new_space_dimension,
+ Representation r);
+
+ //! Copy-constructs from a constraint, with the specified space dimension
+ //! and (optional) representation.
+ Congruence(const Constraint& cg, dimension_type new_space_dimension,
+ Representation r = default_representation);
+
+ //! Constructs from Linear_Expression \p le, using modulus \p m.
+ /*!
+ Builds a congruence with modulus \p m, stealing the coefficients
+ from \p le.
+
+ \note The new Congruence will have the same representation as `le'.
+
+ \param le
+ The Linear_Expression holding the coefficients.
+
+ \param m
+ The modulus for the congruence, which must be zero or greater.
+ */
+ Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m, Recycle_Input);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Sets the space dimension by \p n , adding or removing coefficients as
+ //! needed.
+ void set_space_dimension(dimension_type n);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Normalizes the signs.
+ /*!
+ The signs of the coefficients and the inhomogeneous term are
+ normalized, leaving the first non-zero homogeneous coefficient
+ positive.
+ */
+ void sign_normalize();
+
+ //! Normalizes signs and the inhomogeneous term.
+ /*!
+ Applies sign_normalize, then reduces the inhomogeneous term to the
+ smallest possible positive number.
+ */
+ void normalize();
+
+ //! Calls normalize, then divides out common factors.
+ /*!
+ Strongly normalized Congruences have equivalent semantics if and
+ only if they have the same syntax (as output by operator<<).
+ */
+ void strong_normalize();
+
+private:
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+ */
+ static const Congruence* zero_dim_false_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+ also known as the <EM>integrality congruence</EM>.
+ */
+ static const Congruence* zero_dim_integrality_p;
+
+ Linear_Expression expr;
+
+ Coefficient modulus_;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+ dimension \p v.
+ */
+ bool is_equal_at_dimension(Variable v,
+ const Congruence& cg) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ error message \p message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* message) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ Variable v) const;
+
+ friend bool
+ operator==(const Congruence& x, const Congruence& y);
+
+ friend bool
+ operator!=(const Congruence& x, const Congruence& y);
+
+ friend class Scalar_Products;
+ friend class Grid;
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+} // namespace IO_Operators
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+ If \p cg represents the congruence \f$ e_1 = e_2
+ \pmod{m}\f$, then the result represents the
+ congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+ \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+/*! \relates Congruence */
+void
+swap(Congruence& x, Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Congruence_inlines.hh"
+
+#endif // !defined(PPL_Congruence_defs_hh)
diff --git a/src/Congruence_inlines.hh b/src/Congruence_inlines.hh
new file mode 100644
index 0000000..77e7246
--- /dev/null
+++ b/src/Congruence_inlines.hh
@@ -0,0 +1,281 @@
+/* Congruence class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_inlines_hh
+#define PPL_Congruence_inlines_hh 1
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(Representation r)
+ : expr(r) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg)
+ : expr(cg.expr), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg, Representation r)
+ : expr(cg.expr, r), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type new_space_dimension)
+ : expr(cg.expr, new_space_dimension), modulus_(cg.modulus_) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type new_space_dimension,
+ Representation r)
+ : expr(cg.expr, new_space_dimension, r), modulus_(cg.modulus_) {
+ PPL_ASSERT(OK());
+}
+
+inline Representation
+Congruence::representation() const {
+ return expr.representation();
+}
+
+inline void
+Congruence::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline Congruence::expr_type
+Congruence::expression() const {
+ return expr_type(expr);
+}
+
+inline void
+Congruence::set_space_dimension(dimension_type n) {
+ expr.set_space_dimension(n);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Congruence::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ Recycle_Input)
+ : modulus_(m) {
+ PPL_ASSERT(m >= 0);
+ swap(expr, le);
+
+ PPL_ASSERT(OK());
+}
+
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ Representation r) {
+ Linear_Expression diff(e, r);
+ diff -= n;
+ const Congruence cg(diff, 1, Recycle_Input());
+ return cg;
+}
+
+inline Congruence
+Congruence::create(Coefficient_traits::const_reference n,
+ const Linear_Expression& e,
+ Representation r) {
+ Linear_Expression diff(e, r);
+ diff -= n;
+ const Congruence cg(diff, 1, Recycle_Input());
+ return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+ Congruence ret = cg;
+ ret /= k;
+ return ret;
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+ return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+ return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& y) {
+ Congruence tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+ Congruence ret(c);
+ ret /= m;
+ return ret;
+}
+
+inline Congruence&
+Congruence::operator/=(Coefficient_traits::const_reference k) {
+ if (k >= 0)
+ modulus_ *= k;
+ else
+ modulus_ *= -k;
+ return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+ if (x.space_dimension() != y.space_dimension())
+ return false;
+ Congruence x_temp(x);
+ Congruence y_temp(y);
+ x_temp.strong_normalize();
+ y_temp.strong_normalize();
+ return x_temp.expr.is_equal_to(y_temp.expr)
+ && x_temp.modulus() == y_temp.modulus();
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+ return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+ return expr.space_dimension();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline void
+Congruence::permute_space_dimensions(const std::vector<Variable>& cycles) {
+ expr.permute_space_dimensions(cycles);
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+ return expr.inhomogeneous_term();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+ return modulus_;
+}
+
+inline void
+Congruence::set_modulus(Coefficient_traits::const_reference m) {
+ modulus_ = m;
+ PPL_ASSERT(OK());
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+ return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+ return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(Variable v,
+ const Congruence& cg) const {
+ return coefficient(v) * cg.modulus() == cg.coefficient(v) * modulus();
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes()
+ + Parma_Polyhedra_Library::external_memory_in_bytes(modulus_);
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Congruence::m_swap(Congruence& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(modulus_, y.modulus_);
+}
+
+inline void
+Congruence::swap_space_dimensions(Variable v1, Variable v2) {
+ expr.swap_space_dimensions(v1, v2);
+}
+
+/*! \relates Congruence */
+inline void
+swap(Congruence& x, Congruence& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Congruence_inlines_hh)
diff --git a/src/Congruence_types.hh b/src/Congruence_types.hh
new file mode 100644
index 0000000..5cc5e09
--- /dev/null
+++ b/src/Congruence_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_types_hh
+#define PPL_Congruence_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+#endif // !defined(PPL_Congruence_types_hh)
diff --git a/src/Constant_Floating_Point_Expression_defs.hh b/src/Constant_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..26906dd
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_defs.hh
@@ -0,0 +1,173 @@
+/* Declarations for the Constant_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constant_Floating_Point_Expression_defs_hh
+#define PPL_Constant_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Constant_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Constant_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Constant Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point constant expressions
+
+ The linearization of a constant floating point expression results in a
+ linear form consisting of only the inhomogeneous term
+ \f$[l, u]\f$, where \f$l\f$ and \f$u\f$ are the lower
+ and upper bounds of the constant value given to the class constructor.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the constant floating point
+ expression from a \p lower_bound and an \p upper_bound of its
+ value in the concrete domain.
+ */
+ Constant_Floating_Point_Expression(const boundary_type lower_bound,
+ const boundary_type upper_bound);
+
+ /*! \brief
+ Builds a constant floating point expression with the value
+ expressed by the string \p str_value.
+ */
+ Constant_Floating_Point_Expression(const char* str_value);
+
+ //! Destructor.
+ ~Constant_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ See the class description for an explanation of how \p result is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constant_Floating_Point_Expression& y);
+
+private:
+
+ FP_Interval_Type value;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Constant_Floating_Point_Expression(
+ const Constant_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+ Constant_Floating_Point_Expression& operator=(
+ const Constant_Floating_Point_Expression& y);
+
+}; // class Constant_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Constant_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_defs_hh)
diff --git a/src/Constant_Floating_Point_Expression_inlines.hh b/src/Constant_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..5e138d2
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,80 @@
+/* Constant_Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constant_Floating_Point_Expression_inlines_hh
+#define PPL_Constant_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const char* str_value)
+ : value(str_value) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const boundary_type lb,
+ const boundary_type ub) {
+ assert(lb <= ub);
+ value.build(i_constraint(GREATER_OR_EQUAL, lb),
+ i_constraint(LESS_OR_EQUAL, ub));
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Constant_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Constant_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(value, y.value);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+ const FP_Linear_Form_Abstract_Store&,
+ FP_Linear_Form& result) const {
+ result = FP_Linear_Form(value);
+ return true;
+}
+
+/*! \relates Constant_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_inlines_hh)
diff --git a/src/Constant_Floating_Point_Expression_types.hh b/src/Constant_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..72ab45f
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constant_Floating_Point_Expression_types_hh
+#define PPL_Constant_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_types_hh)
diff --git a/src/Constraint.cc b/src/Constraint.cc
new file mode 100644
index 0000000..f1e5b44
--- /dev/null
+++ b/src/Constraint.cc
@@ -0,0 +1,460 @@
+/* Constraint class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Constraint_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Congruence_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Constraint::throw_invalid_argument(const char* method,
+ const char* message) const {
+ std::ostringstream s;
+ s << "PPL::Constraint::" << method << ":" << std::endl
+ << message;
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Constraint::throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ const Variable v) const {
+ std::ostringstream s;
+ s << "PPL::Constraint::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+PPL::Constraint
+PPL::Constraint::construct_epsilon_geq_zero() {
+ Linear_Expression e;
+ Constraint c(e, NONSTRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ c.set_epsilon_coefficient(Coefficient_one());
+ PPL_ASSERT(c.OK());
+ return c;
+}
+
+PPL::Constraint::Constraint(const Congruence& cg, Representation r)
+ : expr(cg.expression(), r),
+ kind_(LINE_OR_EQUALITY),
+ topology_(NECESSARILY_CLOSED) {
+ if (!cg.is_equality())
+ throw_invalid_argument("Constraint(cg)",
+ "congruence cg must be an equality.");
+ // Enforce normalization.
+ strong_normalize();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint::swap_space_dimensions(Variable v1, Variable v2) {
+ PPL_ASSERT(v1.space_dimension() <= space_dimension());
+ PPL_ASSERT(v2.space_dimension() <= space_dimension());
+ expr.swap_space_dimensions(v1, v2);
+ // *this is still normalized but it may not be strongly normalized.
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ if (cycle.size() < 2)
+ // No-op. No need to call sign_normalize().
+ return;
+
+ expr.permute_space_dimensions(cycle);
+ // *this is still normalized but may be not strongly normalized:
+ // sign normalization is necessary.
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Constraint::is_tautological() const {
+ if (expr.all_homogeneous_terms_are_zero())
+ if (is_equality())
+ return expr.inhomogeneous_term() == 0;
+ else
+ // Non-strict inequality constraint.
+ return expr.inhomogeneous_term() >= 0;
+ else
+ // There is a non-zero homogeneous coefficient.
+ if (is_necessarily_closed())
+ return false;
+ else {
+ // The constraint is NOT necessarily closed.
+ const int eps_sign = sgn(epsilon_coefficient());
+ if (eps_sign > 0)
+ // We have found the constraint epsilon >= 0.
+ return true;
+ if (eps_sign == 0)
+ // One of the `true' dimensions has a non-zero coefficient.
+ return false;
+ else {
+ // Here the epsilon coefficient is negative: strict inequality.
+ if (expr.inhomogeneous_term() <= 0)
+ // A strict inequality such as `lhs - k > 0',
+ // where k is a non negative integer, cannot be trivially true.
+ return false;
+ // Checking for another non-zero coefficient.
+ // If the check succeeds, we have the inequality `k > 0',
+ // where k is a positive integer.
+ return expression().all_homogeneous_terms_are_zero();
+ }
+ }
+}
+
+bool
+PPL::Constraint::is_inconsistent() const {
+ if (expr.all_homogeneous_terms_are_zero())
+ // The inhomogeneous term is the only non-zero coefficient.
+ if (is_equality())
+ return expr.inhomogeneous_term() != 0;
+ else
+ // Non-strict inequality constraint.
+ return expr.inhomogeneous_term() < 0;
+ else
+ // There is a non-zero homogeneous coefficient.
+ if (is_necessarily_closed())
+ return false;
+ else {
+ // The constraint is NOT necessarily closed.
+ if (epsilon_coefficient() >= 0)
+ // If positive, we have found the constraint epsilon >= 0.
+ // If zero, one of the `true' dimensions has a non-zero coefficient.
+ // In both cases, it is not trivially false.
+ return false;
+ else {
+ // Here the epsilon coefficient is negative: strict inequality.
+ if (expr.inhomogeneous_term() > 0)
+ // A strict inequality such as `lhs + k > 0',
+ // where k is a positive integer, cannot be trivially false.
+ return false;
+ // Checking for another non-zero coefficient.
+ // If the check succeeds, we have the inequality `k > 0',
+ // where k is a positive integer.
+ return expression().all_homogeneous_terms_are_zero();
+ }
+ }
+}
+
+void
+PPL::Constraint::linear_combine(const Constraint& y, dimension_type i) {
+ expr.linear_combine(y.expr, i);
+ strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+int
+PPL::compare(const Constraint& x, const Constraint& y) {
+ const bool x_is_line_or_equality = x.is_line_or_equality();
+ const bool y_is_line_or_equality = y.is_line_or_equality();
+ if (x_is_line_or_equality != y_is_line_or_equality)
+ // Equalities (lines) precede inequalities (ray/point).
+ return y_is_line_or_equality ? 2 : -2;
+
+ return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Constraint::is_equivalent_to(const Constraint& y) const {
+ const Constraint& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ const Type x_type = x.type();
+ if (x_type != y.type()) {
+ // Check for special cases.
+ if (x.is_tautological())
+ return y.is_tautological();
+ else
+ return x.is_inconsistent() && y.is_inconsistent();
+ }
+
+ if (x_type == STRICT_INEQUALITY) {
+ // Due to the presence of epsilon-coefficients, syntactically
+ // different strict inequalities may actually encode the same
+ // topologically open half-space.
+ // First, drop the epsilon-coefficient ...
+ Linear_Expression x_expr(x.expression());
+ Linear_Expression y_expr(y.expression());
+ // ... then, re-normalize ...
+ x_expr.normalize();
+ y_expr.normalize();
+ // ... and finally check for syntactic equality.
+ return x_expr.is_equal_to(y_expr);
+ }
+
+ // `x' and 'y' are of the same type and they are not strict inequalities;
+ // thus, the epsilon-coefficient, if present, is zero.
+ // It is sufficient to check for syntactic equality.
+ return x.expr.is_equal_to(y.expr);
+}
+
+bool
+PPL::Constraint::is_equal_to(const Constraint& y) const {
+ return expr.is_equal_to(y.expr) && kind_ == y.kind_ && topology() == y.topology();
+}
+
+void
+PPL::Constraint::sign_normalize() {
+ if (is_line_or_equality())
+ expr.sign_normalize();
+}
+
+bool
+PPL::Constraint::check_strong_normalized() const {
+ Constraint tmp = *this;
+ tmp.strong_normalize();
+ return compare(*this, tmp) == 0;
+}
+
+const PPL::Constraint* PPL::Constraint::zero_dim_false_p = 0;
+const PPL::Constraint* PPL::Constraint::zero_dim_positivity_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_geq_zero_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_leq_one_p = 0;
+
+void
+PPL::Constraint::initialize() {
+ PPL_ASSERT(zero_dim_false_p == 0);
+ zero_dim_false_p
+ = new Constraint(Linear_Expression::zero() == Coefficient_one());
+
+ PPL_ASSERT(zero_dim_positivity_p == 0);
+ zero_dim_positivity_p
+ = new Constraint(Linear_Expression::zero() <= Coefficient_one());
+
+ PPL_ASSERT(epsilon_geq_zero_p == 0);
+ epsilon_geq_zero_p
+ = new Constraint(construct_epsilon_geq_zero());
+
+ PPL_ASSERT(epsilon_leq_one_p == 0);
+ epsilon_leq_one_p
+ = new Constraint(Linear_Expression::zero() < Coefficient_one());
+}
+
+void
+PPL::Constraint::finalize() {
+ PPL_ASSERT(zero_dim_false_p != 0);
+ delete zero_dim_false_p;
+ zero_dim_false_p = 0;
+
+ PPL_ASSERT(zero_dim_positivity_p != 0);
+ delete zero_dim_positivity_p;
+ zero_dim_positivity_p = 0;
+
+ PPL_ASSERT(epsilon_geq_zero_p != 0);
+ delete epsilon_geq_zero_p;
+ epsilon_geq_zero_p = 0;
+
+ PPL_ASSERT(epsilon_leq_one_p != 0);
+ delete epsilon_leq_one_p;
+ epsilon_leq_one_p = 0;
+}
+
+void
+PPL::Constraint::ascii_dump(std::ostream& s) const {
+ expr.ascii_dump(s);
+
+ s << " ";
+
+ switch (type()) {
+ case Constraint::EQUALITY:
+ s << "=";
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ s << ">=";
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ s << ">";
+ break;
+ }
+ s << " ";
+ if (topology() == NECESSARILY_CLOSED)
+ s << "(C)";
+ else
+ s << "(NNC)";
+
+ s << "\n";
+}
+
+bool
+PPL::Constraint::ascii_load(std::istream& s) {
+ std::string str;
+ std::string str2;
+
+ expr.ascii_load(s);
+
+ if (!(s >> str))
+ return false;
+ if (str == "=")
+ set_is_equality();
+ else if (str == ">=" || str == ">")
+ set_is_inequality();
+ else
+ return false;
+
+ if (!(s >> str2))
+ return false;
+ if (str2 == "(NNC)") {
+ // TODO: Avoid the mark_as_*() methods if possible.
+ if (topology() == NECESSARILY_CLOSED)
+ mark_as_not_necessarily_closed();
+ }
+ else
+ if (str2 == "(C)") {
+ // TODO: Avoid the mark_as_*() methods if possible.
+ if (topology() == NOT_NECESSARILY_CLOSED)
+ mark_as_necessarily_closed();
+ }
+ else
+ return false;
+
+ // Checking for equality of actual and declared types.
+ switch (type()) {
+ case EQUALITY:
+ if (str != "=")
+ return false;
+ break;
+ case NONSTRICT_INEQUALITY:
+ if (str != ">=")
+ return false;
+ break;
+ case STRICT_INEQUALITY:
+ if (str != ">")
+ return false;
+ break;
+ }
+
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) {
+ PPL_DIRTY_TEMP_COEFFICIENT(cv);
+ bool first = true;
+ for (Constraint::expr_type::const_iterator i = c.expression().begin(),
+ i_end = c.expression().end(); i != i_end; ++i) {
+ cv = *i;
+ if (!first) {
+ if (cv > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(cv);
+ }
+ }
+ else
+ first = false;
+ if (cv == -1)
+ s << "-";
+ else if (cv != 1)
+ s << cv << "*";
+ s << i.variable();
+ }
+ if (first)
+ s << Coefficient_zero();
+ const char* relation_symbol = 0;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ relation_symbol = " = ";
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ relation_symbol = " >= ";
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ relation_symbol = " > ";
+ break;
+ }
+ s << relation_symbol << -c.inhomogeneous_term();
+ return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint::Type& t) {
+ const char* n = 0;
+ switch (t) {
+ case Constraint::EQUALITY:
+ n = "EQUALITY";
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ n = "NONSTRICT_INEQUALITY";
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ n = "STRICT_INEQUALITY";
+ break;
+ }
+ s << n;
+ return s;
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint)
+
+bool
+PPL::Constraint::OK() const {
+ // Topology consistency checks.
+ if (is_not_necessarily_closed() && expr.space_dimension() == 0) {
+#ifndef NDEBUG
+ std::cerr << "Constraint has fewer coefficients than the minimum "
+ << "allowed by its topology."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (is_equality() && is_not_necessarily_closed()
+ && epsilon_coefficient() != 0) {
+#ifndef NDEBUG
+ std::cerr << "Illegal constraint: an equality cannot be strict."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Normalization check.
+ Constraint tmp = *this;
+ tmp.strong_normalize();
+ if (tmp != *this) {
+#ifndef NDEBUG
+ std::cerr << "Constraint is not strongly normalized as it should be."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // All tests passed.
+ return true;
+}
diff --git a/src/Constraint_System.cc b/src/Constraint_System.cc
new file mode 100644
index 0000000..03cef66
--- /dev/null
+++ b/src/Constraint_System.cc
@@ -0,0 +1,381 @@
+/* Constraint_System class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Constraint_System::Constraint_System(const Congruence_System& cgs,
+ Representation r)
+ : sys(NECESSARILY_CLOSED, cgs.space_dimension(), r) {
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ if (i->is_equality()) {
+ Constraint tmp(*i);
+ insert(tmp, Recycle_Input());
+ }
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Constraint_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+ const dimension_type new_space_dim) {
+ PPL_ASSERT(space_dimension() <= new_space_dim);
+
+ if (sys.topology() == NOT_NECESSARILY_CLOSED
+ && new_topology == NECESSARILY_CLOSED) {
+ // A NOT_NECESSARILY_CLOSED constraint system
+ // can be converted to a NECESSARILY_CLOSED one
+ // only if it does not contain strict inequalities.
+ if (has_strict_inequalities())
+ return false;
+ // Since there were no strict inequalities,
+ // the only constraints that may have a non-zero epsilon coefficient
+ // are the eps-leq-one and the eps-geq-zero constraints.
+ // If they are present, we erase these rows, so that the
+ // epsilon column will only contain zeroes: as a consequence,
+ // we just decrement the number of columns to be added.
+ const bool was_sorted = sys.is_sorted();
+
+ // Note that num_rows() is *not* constant, because it is decreased by
+ // remove_row().
+ for (dimension_type i = 0; i < num_rows(); )
+ if (sys[i].epsilon_coefficient() != 0)
+ sys.remove_row(i, false);
+ else
+ ++i;
+
+ // If `cs' was sorted we sort it again.
+ if (was_sorted)
+ sys.sort_rows();
+ }
+
+ sys.set_topology(new_topology);
+ sys.set_space_dimension(new_space_dim);
+
+ // We successfully adjusted space dimensions and topology.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+bool
+PPL::Constraint_System::has_equalities() const {
+ // We verify if the system has equalities also in the pending part.
+ for (dimension_type i = sys.num_rows(); i-- > 0; )
+ if (sys[i].is_equality())
+ return true;
+ return false;
+}
+
+bool
+PPL::Constraint_System::has_strict_inequalities() const {
+ if (sys.is_necessarily_closed())
+ return false;
+ // We verify if the system has strict inequalities
+ // also in the pending part.
+ for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+ const Constraint& c = sys[i];
+ // Optimized type checking: we already know the topology;
+ // also, equalities have the epsilon coefficient equal to zero.
+ // NOTE: the constraint eps_leq_one should not be considered
+ // a strict inequality.
+ if (c.epsilon_coefficient() < 0 && !c.is_tautological())
+ return true;
+ }
+ return false;
+}
+
+void
+PPL::Constraint_System::insert(const Constraint& r) {
+ Constraint tmp = r;
+ insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Constraint_System::insert(Constraint& c, Recycle_Input) {
+ // We are sure that the matrix has no pending rows
+ // and that the new row is not a pending constraint.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+
+ if (sys.topology() != c.topology()) {
+ if (sys.topology() == NECESSARILY_CLOSED)
+ sys.set_topology(NOT_NECESSARILY_CLOSED);
+ else
+ c.set_topology(NOT_NECESSARILY_CLOSED);
+ }
+
+ sys.insert(c, Recycle_Input());
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint_System::insert_pending(const Constraint& r) {
+ Constraint tmp = r;
+ insert_pending(tmp, Recycle_Input());
+}
+
+void
+PPL::Constraint_System::insert_pending(Constraint& c, Recycle_Input) {
+ if (sys.topology() != c.topology()) {
+ if (sys.topology() == NECESSARILY_CLOSED)
+ sys.set_topology(NOT_NECESSARILY_CLOSED);
+ else
+ c.set_topology(NOT_NECESSARILY_CLOSED);
+ }
+
+ sys.insert_pending(c, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_inequalities() const {
+ // We are sure that we call this method only when
+ // the matrix has no pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ const Constraint_System& cs = *this;
+ dimension_type n = 0;
+ // If the Base happens to be sorted, take advantage of the fact
+ // that inequalities are at the bottom of the system.
+ if (sys.is_sorted())
+ for (dimension_type i = sys.num_rows(); i > 0 && cs[--i].is_inequality(); )
+ ++n;
+ else
+ for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+ if (cs[i].is_inequality())
+ ++n;
+ return n;
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_equalities() const {
+ // We are sure that we call this method only when
+ // the matrix has no pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ return sys.num_rows() - num_inequalities();
+}
+
+void
+PPL::Constraint_System_const_iterator::skip_forward() {
+ const Linear_System<Constraint>::const_iterator csp_end = csp->end();
+ while (i != csp_end && (*this)->is_tautological())
+ ++i;
+}
+
+bool
+PPL::Constraint_System::satisfies_all_constraints(const Generator& g) const {
+ PPL_ASSERT(g.space_dimension() <= space_dimension());
+
+ // Setting `sps' to the appropriate scalar product sign operator.
+ // This also avoids problems when having _legal_ topology mismatches
+ // (which could also cause a mismatch in the number of columns).
+ const Topology_Adjusted_Scalar_Product_Sign sps(g);
+
+ if (sys.is_necessarily_closed()) {
+ if (g.is_line()) {
+ // Lines must saturate all constraints.
+ for (dimension_type i = sys.num_rows(); i-- > 0; )
+ if (sps(g, sys[i]) != 0)
+ return false;
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+ const Constraint& c = sys[i];
+ const int sp_sign = sps(g, c);
+ if (c.is_inequality()) {
+ // As `cs' is necessarily closed,
+ // `c' is a non-strict inequality.
+ if (sp_sign < 0)
+ return false;
+ }
+ else
+ // `c' is an equality.
+ if (sp_sign != 0)
+ return false;
+ }
+ }
+ else
+ // `cs' is not necessarily closed.
+ switch (g.type()) {
+
+ case Generator::LINE:
+ // Lines must saturate all constraints.
+ for (dimension_type i = sys.num_rows(); i-- > 0; )
+ if (sps(g, sys[i]) != 0)
+ return false;
+
+ break;
+
+ case Generator::POINT:
+ // Have to perform the special test
+ // when dealing with a strict inequality.
+ for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+ const Constraint& c = sys[i];
+ const int sp_sign = sps(g, c);
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ if (sp_sign != 0)
+ return false;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (sp_sign < 0)
+ return false;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ if (sp_sign <= 0)
+ return false;
+ break;
+ }
+ }
+ break;
+
+ case Generator::RAY:
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+ const Constraint& c = sys[i];
+ const int sp_sign = sps(g, c);
+ if (c.is_inequality()) {
+ // Constraint `c' is either a strict or a non-strict inequality.
+ if (sp_sign < 0)
+ return false;
+ }
+ else
+ // Constraint `c' is an equality.
+ if (sp_sign != 0)
+ return false;
+ }
+ break;
+ }
+
+ // If we reach this point, `g' satisfies all constraints.
+ return true;
+}
+
+
+void
+PPL::Constraint_System
+::affine_preimage(const Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(v.space_dimension() <= sys.space_dimension());
+ PPL_ASSERT(expr.space_dimension() <= sys.space_dimension());
+ PPL_ASSERT(denominator > 0);
+
+ Coefficient_traits::const_reference expr_v = expr.coefficient(v);
+
+ const dimension_type n_rows = sys.num_rows();
+ const bool not_invertible = (v.space_dimension() > expr.space_dimension()
+ || expr_v == 0);
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Constraint& row = sys.rows[i];
+ Coefficient_traits::const_reference row_v = row.coefficient(v);
+ if (row_v != 0) {
+ const Coefficient c = row_v;
+ if (denominator != 1)
+ row.expr *= denominator;
+ row.expr.linear_combine(expr, 1, c, 0, expr.space_dimension() + 1);
+ if (not_invertible)
+ row.expr.set_coefficient(v, Coefficient_zero());
+ else
+ row.expr.set_coefficient(v, c * expr_v);
+ row.strong_normalize();
+ PPL_ASSERT(row.OK());
+ }
+ }
+
+ // Strong normalization also resets the sortedness flag.
+ sys.strong_normalize();
+
+ PPL_ASSERT(sys.OK());
+}
+
+void
+PPL::Constraint_System::ascii_dump(std::ostream& s) const {
+ sys.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint_System)
+
+bool
+PPL::Constraint_System::ascii_load(std::istream& s) {
+ if (!sys.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+const PPL::Constraint_System* PPL::Constraint_System::zero_dim_empty_p = 0;
+
+void
+PPL::Constraint_System::initialize() {
+ PPL_ASSERT(zero_dim_empty_p == 0);
+ zero_dim_empty_p
+ = new Constraint_System(Constraint::zero_dim_false());
+}
+
+void
+PPL::Constraint_System::finalize() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ delete zero_dim_empty_p;
+ zero_dim_empty_p = 0;
+}
+
+bool
+PPL::Constraint_System::OK() const {
+ return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint_System& cs) {
+ Constraint_System_const_iterator i = cs.begin();
+ const Constraint_System_const_iterator cs_end = cs.end();
+ if (i == cs_end)
+ s << "true";
+ else {
+ while (i != cs_end) {
+ s << *i;
+ ++i;
+ if (i != cs_end)
+ s << ", ";
+ }
+ }
+ return s;
+}
diff --git a/src/Constraint_System_defs.hh b/src/Constraint_System_defs.hh
new file mode 100644
index 0000000..5a26a2d
--- /dev/null
+++ b/src/Constraint_System_defs.hh
@@ -0,0 +1,687 @@
+/* Constraint_System class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_System_defs_hh
+#define PPL_Constraint_System_defs_hh 1
+
+#include "Constraint_System_types.hh"
+
+#include "Linear_System_defs.hh"
+#include "Constraint_defs.hh"
+
+#include "Linear_Expression_types.hh"
+#include "Generator_types.hh"
+#include "Constraint_types.hh"
+#include "Congruence_System_types.hh"
+#include "Polyhedron_types.hh"
+#include "termination_types.hh"
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Constraint_System
+ Writes <CODE>true</CODE> if \p cs is empty. Otherwise, writes on
+ \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Constraint_System& x, const Constraint_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Constraint_System& x, const Constraint_System& y);
+
+/*! \relates Constraint_System */
+void
+swap(Constraint_System& x, Constraint_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Constraint_System is a system of constraints,
+ i.e., a multiset of objects of the class Constraint.
+ When inserting constraints in a system, space dimensions are
+ automatically adjusted so that all the constraints in the system
+ are defined on the same vector space.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a system of constraints corresponding to
+ a square in \f$\Rset^2\f$:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ \endcode
+ Note that:
+ the constraint system is created with space dimension zero;
+ the first and third constraint insertions increase the space
+ dimension to \f$1\f$ and \f$2\f$, respectively.
+
+ \par Example 2
+ By adding four strict inequalities to the constraint system
+ of the previous example, we can remove just the four
+ vertices from the square defined above.
+ \code
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 6);
+ cs.insert(x - y < 3);
+ cs.insert(y - x < 3);
+ \endcode
+
+ \par Example 3
+ The following code builds a system of constraints corresponding to
+ a half-strip in \f$\Rset^2\f$:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x - y <= 0);
+ cs.insert(x - y + 1 >= 0);
+ \endcode
+
+ \note
+ After inserting a multiset of constraints in a constraint system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> constraint system
+ will be available, where original constraints may have been
+ reordered, removed (if they are trivial, duplicate or
+ implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System {
+public:
+ typedef Constraint row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of constraints.
+ explicit Constraint_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only constraint \p c.
+ explicit Constraint_System(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Builds a system containing copies of any equalities in \p cgs.
+ explicit Constraint_System(const Congruence_System& cgs,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The copy will have the same representation as `cs', to make it
+ indistinguishable from `cs'.
+ */
+ Constraint_System(const Constraint_System& cs);
+
+ //! Copy constructor with specified representation.
+ Constraint_System(const Constraint_System& cs, Representation r);
+
+ //! Destructor.
+ ~Constraint_System();
+
+ //! Assignment operator.
+ Constraint_System& operator=(const Constraint_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Constraint_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more equality constraints.
+ */
+ bool has_equalities() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more strict inequality constraints.
+ */
+ bool has_strict_inequalities() const;
+
+ /*! \brief
+ Inserts in \p *this a copy of the constraint \p c,
+ increasing the number of space dimensions if needed.
+ */
+ void insert(const Constraint& c);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only Constraint::zero_dim_false().
+ */
+ static const Constraint_System& zero_dim_empty();
+
+ typedef Constraint_System_const_iterator const_iterator;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+ bool empty() const;
+
+ /*! \brief
+ Removes all the constraints from the constraint system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Returns the const_iterator pointing to the first constraint,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constraint_System& y);
+
+private:
+ Linear_System<Constraint> sys;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Constraint::zero_dim_false().
+ */
+ static const Constraint_System* zero_dim_empty_p;
+
+ friend class Constraint_System_const_iterator;
+
+ friend bool operator==(const Constraint_System& x,
+ const Constraint_System& y);
+
+ //! Builds an empty system of constraints having the specified topology.
+ explicit Constraint_System(Topology topol,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a system of constraints on a \p space_dim dimensional space. If
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+ dimension is added.
+ */
+ Constraint_System(Topology topol, dimension_type space_dim,
+ Representation r = default_representation);
+
+ //! Returns the number of equality constraints.
+ dimension_type num_equalities() const;
+
+ //! Returns the number of inequality constraints.
+ dimension_type num_inequalities() const;
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as
+ to provide a partial simplification of the system of constraints.
+
+ It is assumed that the system has no pending constraints.
+ */
+ void simplify();
+
+ /*! \brief
+ Adjusts \p *this so that it matches \p new_topology and
+ \p new_space_dim (adding or removing columns if needed).
+ Returns <CODE>false</CODE> if and only if \p topol is
+ equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+ contains strict inequalities.
+ */
+ bool adjust_topology_and_space_dimension(Topology new_topology,
+ dimension_type new_space_dim);
+
+ //! Returns a constant reference to the \p k- th constraint of the system.
+ const Constraint& operator[](dimension_type k) const;
+
+ //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+ bool satisfies_all_constraints(const Generator& g) const;
+
+ //! Substitutes a given column of coefficients by a given affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is substituted.
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We want to allow affine transformations
+ (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+ having any rational coefficients. Since the coefficients of the
+ constraints are integers we must also provide an integer \p
+ denominator that will be used as denominator of the affine
+ transformation.
+ The denominator is required to be a positive integer.
+
+ The affine transformation substitutes the matrix of constraints
+ by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+ the old one \f$a_{ij}\f$ as follows:
+ \f[
+ {a'}_{ij} =
+ \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+ \quad \text{for } j \neq v; \\
+ \mathrm{expr}[v] * a_{iv}
+ \quad \text{for } j = v.
+ \end{cases}
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ /*! \brief
+ Inserts in \p *this a copy of the constraint \p c,
+ increasing the number of space dimensions if needed.
+ It is a pending constraint.
+ */
+ void insert_pending(const Constraint& c);
+
+ //! Adds low-level constraints to the constraint system.
+ void add_low_level_constraints();
+
+ //! Returns the system topology.
+ Topology topology() const;
+
+ dimension_type num_rows() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Removes all the specified dimensions from the constraint system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ bool has_no_rows() const;
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Adds the given row to the pending part of the system, stealing its
+ contents and automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(Constraint& r, Recycle_Input);
+
+ //! Adds the rows of `y' to the pending part of `*this', stealing them from
+ //! `y'.
+ void insert_pending(Constraint_System& r, Recycle_Input);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+ */
+ void insert(Constraint& r, Recycle_Input);
+
+ //! Adds to \p *this a the rows of `y', stealing them from `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(Constraint_System& r, Recycle_Input);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Constraint_System& r);
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Constraint_System& y);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Constraint_System& y);
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most columns.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Constraint_System& y);
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ friend class Polyhedron;
+ friend class Termination_Helpers;
+};
+
+//! An iterator over a system of constraints.
+/*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each constraint contained in a Constraint_System object.
+
+ \par Example
+ The following code prints the system of constraints
+ defining the polyhedron <CODE>ph</CODE>:
+ \code
+const Constraint_System& cs = ph.constraints();
+for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ cout << *i << endl;
+ \endcode
+*/
+// NOTE: This is not an inner class of Constraint_System, so Constraint can
+// declare that this class is his friend without including this file
+// (the .types.hh file suffices).
+class Parma_Polyhedra_Library::Constraint_System_const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Constraint,
+ ptrdiff_t,
+ const Constraint*,
+ const Constraint&> {
+public:
+ //! Default constructor.
+ Constraint_System_const_iterator();
+
+ //! Ordinary copy constructor.
+ Constraint_System_const_iterator(const Constraint_System_const_iterator& y);
+
+ //! Destructor.
+ ~Constraint_System_const_iterator();
+
+ //! Assignment operator.
+ Constraint_System_const_iterator&
+ operator=(const Constraint_System_const_iterator& y);
+
+ //! Dereference operator.
+ const Constraint& operator*() const;
+
+ //! Indirect member selector.
+ const Constraint* operator->() const;
+
+ //! Prefix increment operator.
+ Constraint_System_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ Constraint_System_const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const Constraint_System_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const Constraint_System_const_iterator& y) const;
+
+private:
+ friend class Constraint_System;
+
+ //! The const iterator over the matrix of constraints.
+ Linear_System<Constraint>::const_iterator i;
+
+ //! A const pointer to the matrix of constraints.
+ const Linear_System<Constraint>* csp;
+
+ //! Constructor.
+ Constraint_System_const_iterator(const Linear_System<Constraint>
+ ::const_iterator& iter,
+ const Constraint_System& cs);
+
+ //! \p *this skips to the next non-trivial constraint.
+ void skip_forward();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper returning number of constraints in system.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+num_constraints(const Constraint_System& cs);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Constraint_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Constraint_System_defs_hh)
diff --git a/src/Constraint_System_inlines.hh b/src/Constraint_System_inlines.hh
new file mode 100644
index 0000000..7a23d6b
--- /dev/null
+++ b/src/Constraint_System_inlines.hh
@@ -0,0 +1,439 @@
+/* Constraint_System class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_System_inlines_hh
+#define PPL_Constraint_System_inlines_hh 1
+
+#include "Constraint_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c, Representation r)
+ : sys(c.topology(), r) {
+ sys.insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+ : sys(cs.sys) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs,
+ Representation r)
+ : sys(cs.sys, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol, Representation r)
+ : sys(topol, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+ const dimension_type space_dim,
+ Representation r)
+ : sys(topol, space_dim, r) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+ Constraint_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline Representation
+Constraint_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Constraint_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+ return Linear_System<Constraint>::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline void
+Constraint_System::set_space_dimension(dimension_type space_dim) {
+ return sys.set_space_dimension(space_dim);
+}
+
+inline void
+Constraint_System::clear() {
+ sys.clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ return *zero_dim_empty_p;
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator(const Constraint_System_const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System_const_iterator::~Constraint_System_const_iterator() {
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator=(const Constraint_System_const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System_const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Constraint*
+Constraint_System_const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator++() {
+ ++i;
+ skip_forward();
+ return *this;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System_const_iterator::operator++(int) {
+ const Constraint_System_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Constraint_System_const_iterator::operator==(const Constraint_System_const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Constraint_System_const_iterator::operator!=(const Constraint_System_const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Constraint_System_const_iterator::
+Constraint_System_const_iterator(const Linear_System<Constraint>::const_iterator& iter,
+ const Constraint_System& cs)
+ : i(iter), csp(&cs.sys) {
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::begin() const {
+ const_iterator i(sys.begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::end() const {
+ const Constraint_System_const_iterator i(sys.end(), *this);
+ return i;
+}
+
+inline bool
+Constraint_System::empty() const {
+ return begin() == end();
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+ if (sys.is_necessarily_closed())
+ // The positivity constraint.
+ insert(Constraint::zero_dim_positivity());
+ else {
+ // Add the epsilon constraints.
+ insert(Constraint::epsilon_leq_one());
+ insert(Constraint::epsilon_geq_zero());
+ }
+}
+
+inline void
+Constraint_System::m_swap(Constraint_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Constraint_System::simplify() {
+ sys.simplify();
+}
+
+inline Topology
+Constraint_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Constraint_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline bool
+Constraint_System::is_necessarily_closed() const {
+ return sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::num_pending_rows() const {
+ return sys.num_pending_rows();
+}
+
+inline dimension_type
+Constraint_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+inline bool
+Constraint_System::is_sorted() const {
+ return sys.is_sorted();
+}
+
+inline void
+Constraint_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Constraint_System::set_index_first_pending_row(dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline void
+Constraint_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline void
+Constraint_System::remove_row(dimension_type i, bool keep_sorted) {
+ sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted) {
+ sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(const std::vector<dimension_type>& indexes) {
+ sys.remove_rows(indexes);
+}
+
+inline void
+Constraint_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline void
+Constraint_System
+::remove_space_dimensions(const Variables_Set& vars) {
+ sys.remove_space_dimensions(vars);
+}
+
+inline void
+Constraint_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+ sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Constraint_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Constraint_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+ sys.swap_space_dimensions(v1, v2);
+}
+
+inline bool
+Constraint_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline void
+Constraint_System::strong_normalize() {
+ sys.strong_normalize();
+}
+
+inline void
+Constraint_System::sort_rows() {
+ sys.sort_rows();
+}
+
+inline void
+Constraint_System::insert_pending(Constraint_System& r, Recycle_Input) {
+ sys.insert_pending(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert(Constraint_System& r, Recycle_Input) {
+ sys.insert(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert_pending(const Constraint_System& r) {
+ sys.insert_pending(r.sys);
+}
+
+inline void
+Constraint_System::merge_rows_assign(const Constraint_System& y) {
+ sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Constraint_System::insert(const Constraint_System& y) {
+ sys.insert(y.sys);
+}
+
+inline void
+Constraint_System::mark_as_necessarily_closed() {
+ sys.mark_as_necessarily_closed();
+}
+
+inline void
+Constraint_System::mark_as_not_necessarily_closed() {
+ sys.mark_as_not_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::gauss(dimension_type n_lines_or_equalities) {
+ return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::back_substitute(dimension_type n_lines_or_equalities) {
+ sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::assign_with_pending(const Constraint_System& y) {
+ sys.assign_with_pending(y.sys);
+}
+
+inline void
+Constraint_System::sort_pending_and_remove_duplicates() {
+ sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Constraint_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ sys.sort_and_remove_with_sat(sat);
+}
+
+inline bool
+Constraint_System::check_sorted() const {
+ return sys.check_sorted();
+}
+
+inline dimension_type
+Constraint_System::num_lines_or_equalities() const {
+ return sys.num_lines_or_equalities();
+}
+
+inline void
+Constraint_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+ sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline bool
+operator==(const Constraint_System& x, const Constraint_System& y) {
+ return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Constraint_System& x, const Constraint_System& y) {
+ return !(x == y);
+}
+
+/*! \relates Constraint_System */
+inline void
+swap(Constraint_System& x, Constraint_System& y) {
+ x.m_swap(y);
+}
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+num_constraints(const Constraint_System& cs) {
+ return static_cast<dimension_type>(std::distance(cs.begin(), cs.end()));
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_inlines_hh)
diff --git a/src/Constraint_System_types.hh b/src/Constraint_System_types.hh
new file mode 100644
index 0000000..7e947e8
--- /dev/null
+++ b/src/Constraint_System_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_System_types_hh
+#define PPL_Constraint_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+class Constraint_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_types_hh)
diff --git a/src/Constraint_defs.hh b/src/Constraint_defs.hh
new file mode 100644
index 0000000..aedfa5b
--- /dev/null
+++ b/src/Constraint_defs.hh
@@ -0,0 +1,836 @@
+/* Constraint class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_defs_hh
+#define PPL_Constraint_defs_hh 1
+
+#include "Constraint_types.hh"
+
+#include "Congruence_types.hh"
+#include "Variables_Set_types.hh"
+#include "Polyhedron_types.hh"
+#include "termination_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Grid_types.hh"
+
+#include "Linear_Expression_defs.hh"
+#include "Variable_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Last_defs.hh"
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Constraint
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Constraint& x, const Constraint& y);
+
+}
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Constraint is either:
+ - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+ where \f$n\f$ is the dimension of the space,
+ \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+ and \f$b\f$ is the integer inhomogeneous term.
+
+ \par How to build a constraint
+ Constraints are typically built by applying a relation symbol
+ to a pair of linear expressions.
+ Available relation symbols are equality (<CODE>==</CODE>),
+ non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+ strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+ The space dimension of a constraint is defined as the maximum
+ space dimension of the arguments of its constructor.
+
+ \par
+ In the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds the equality constraint
+ \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+ \code
+ Constraint eq_c(3*x + 5*y - z == 0);
+ \endcode
+ The following code builds the (non-strict) inequality constraint
+ \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+ \code
+ Constraint ineq_c(4*x >= 2*y - 13);
+ \endcode
+ The corresponding strict inequality constraint
+ \f$4x > 2y - 13\f$ is obtained as follows:
+ \code
+ Constraint strict_ineq_c(4*x > 2*y - 13);
+ \endcode
+ An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+ can be specified as follows:
+ \code
+ Constraint false_c = Constraint::zero_dim_false();
+ \endcode
+ Equivalent, but more involved ways are the following:
+ \code
+ Constraint false_c1(Linear_Expression::zero() == 1);
+ Constraint false_c2(Linear_Expression::zero() >= 1);
+ Constraint false_c3(Linear_Expression::zero() > 0);
+ \endcode
+ In contrast, the following code defines an unsatisfiable constraint
+ having space dimension \f$3\f$:
+ \code
+ Constraint false_c(0*z == 1);
+ \endcode
+
+ \par How to inspect a constraint
+ Several methods are provided to examine a constraint and extract
+ all the encoded information: its space dimension, its type
+ (equality, non-strict inequality, strict inequality) and
+ the value of its integer coefficients.
+
+ \par Example 2
+ The following code shows how it is possible to access each single
+ coefficient of a constraint. Given an inequality constraint
+ (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+ corresponding to its complement (thus, in this case we want to obtain
+ the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+ \code
+ Constraint c1(x - 5*y + 3*z <= 4);
+ cout << "Constraint c1: " << c1 << endl;
+ if (c1.is_equality())
+ cout << "Constraint c1 is not an inequality." << endl;
+ else {
+ Linear_Expression e;
+ for (dimension_type i = c1.space_dimension(); i-- > 0; )
+ e += c1.coefficient(Variable(i)) * Variable(i);
+ e += c1.inhomogeneous_term();
+ Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+ cout << "Complement c2: " << c2 << endl;
+ }
+ \endcode
+ The actual output is the following:
+ \code
+ Constraint c1: -A + 5*B - 3*C >= -4
+ Complement c2: A - 5*B + 3*C > 4
+ \endcode
+ Note that, in general, the particular output obtained can be
+ syntactically different from the (semantically equivalent)
+ constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint {
+public:
+
+ //! The constraint type.
+ enum Type {
+ /*! The constraint is an equality. */
+ EQUALITY,
+ /*! The constraint is a non-strict inequality. */
+ NONSTRICT_INEQUALITY,
+ /*! The constraint is a strict inequality. */
+ STRICT_INEQUALITY
+ };
+
+ //! The representation used for new Constraints.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Constructs the \f$0<=0\f$ constraint.
+ explicit Constraint(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The new Constraint will have the same representation as `c',
+ not default_representation, so that they are indistinguishable.
+ */
+ Constraint(const Constraint& c);
+
+ //! Copy constructor with given size.
+ /*!
+ \note The new Constraint will have the same representation as `c',
+ not default_representation, so that they are indistinguishable.
+ */
+ Constraint(const Constraint& c, dimension_type space_dim);
+
+ //! Copy constructor with given representation.
+ Constraint(const Constraint& c, Representation r);
+
+ //! Copy constructor with given size and representation.
+ Constraint(const Constraint& c, dimension_type space_dim,
+ Representation r);
+
+ //! Copy-constructs from equality congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p cg is a proper congruence.
+ */
+ explicit Constraint(const Congruence& cg,
+ Representation r = default_representation);
+
+ //! Destructor.
+ ~Constraint();
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Assignment operator.
+ Constraint& operator=(const Constraint& c);
+
+ //! Returns the maximum space dimension a Constraint can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the constraint.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ Always returns \p true. The return value is needed for compatibility with
+ the Generator class.
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the constraint.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Returns the constraint type of \p *this.
+ Type type() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is an equality constraint.
+ */
+ bool is_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is an inequality constraint (either strict or non-strict).
+ */
+ bool is_inequality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a non-strict inequality constraint.
+ */
+ bool is_nonstrict_inequality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a strict inequality constraint.
+ */
+ bool is_strict_inequality() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument thrown if the index of \p v
+ is greater than or equal to the space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+ static const Constraint& zero_dim_false();
+
+ /*! \brief
+ The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+ also known as <EM>positivity constraint</EM>.
+ */
+ static const Constraint& zero_dim_positivity();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a tautology (i.e., an always true constraint).
+
+ A tautology can have either one of the following forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+ where \f$b \geq 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+ where \f$b > 0\f$.
+ */
+ bool is_tautological() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is inconsistent (i.e., an always false constraint).
+
+ An inconsistent constraint can have either one of the following forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+ where \f$b \neq 0\f$; or
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+ where \f$b < 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+ where \f$b \leq 0\f$.
+ */
+ bool is_inconsistent() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are equivalent constraints.
+
+ Constraints having different space dimensions are not equivalent.
+ Note that constraints having different types may nonetheless be
+ equivalent, if they both are tautologies or inconsistent.
+ */
+ bool is_equivalent_to(const Constraint& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent constraints.
+ */
+ bool is_equal_to(const Constraint& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constraint& y);
+
+ //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+ static const Constraint& epsilon_geq_zero();
+
+ /*! \brief
+ The zero-dimension space constraint \f$\epsilon \leq 1\f$
+ (used to implement NNC polyhedra).
+ */
+ static const Constraint& epsilon_leq_one();
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Linear_Expression> expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+
+ //! The possible kinds of Constraint objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ Linear_Expression expr;
+
+ Kind kind_;
+
+ Topology topology_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+ */
+ static const Constraint* zero_dim_false_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+ known as <EM>positivity constraint</EM>.
+ */
+ static const Constraint* zero_dim_positivity_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+ */
+ static const Constraint* epsilon_geq_zero_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the zero-dimension space constraint \f$\epsilon \leq 1\f$
+ (used to implement NNC polyhedra).
+ */
+ static const Constraint* epsilon_leq_one_p;
+
+ //! Constructs the \f$0<0\f$ constraint.
+ Constraint(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a constraint of kind \p kind and topology \p topology,
+ stealing the coefficients from \p e.
+
+ \note The new Constraint will have the same representation as `e'.
+ */
+ Constraint(Linear_Expression& e, Kind kind, Topology topology);
+
+ /*! \brief
+ Builds a constraint of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+
+ \note The new Constraint will have the same representation as `e'.
+ */
+ Constraint(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ // TODO: Consider setting the epsilon dimension in this method.
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+ //@} // Flags coercion methods
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ error message \p message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* message) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ Variable v) const;
+
+ //! Returns the epsilon coefficient. The constraint must be NNC.
+ Coefficient_traits::const_reference epsilon_coefficient() const;
+
+ //! Sets the epsilon coefficient to \p n. The constraint must be NNC.
+ void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+ void set_is_equality();
+
+ //! Sets the constraint to be an inequality.
+ /*!
+ Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+ or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+ of the low-level coefficients of the constraint.
+ */
+ void set_is_inequality();
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Constraint that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Constraint to \p *this and normalizes it.
+ */
+ void linear_combine(const Constraint& y, dimension_type i);
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Constraint objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Constraint::normalize() and Constraint::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ /*! \brief
+ Builds a new copy of the zero-dimension space constraint
+ \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+ */
+ static Constraint construct_epsilon_geq_zero();
+
+ friend int
+ compare(const Constraint& x, const Constraint& y);
+
+ friend class Linear_System<Constraint>;
+ friend class Constraint_System;
+ friend class Polyhedron;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+ friend class Termination_Helpers;
+ friend class Grid;
+ template <typename T>
+ friend class Octagonal_Shape;
+
+ friend Constraint
+ operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator<(Variable v1, Variable v2);
+
+ friend Constraint
+ operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator>(Variable v1, Variable v2);
+
+ friend Constraint
+ operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator==(Variable v1, Variable v2);
+
+ friend Constraint
+ operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator<=(Variable v1, Variable v2);
+
+ friend Constraint
+ operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator>=(Variable v1, Variable v2);
+
+ friend Constraint
+ operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+/*! \relates Constraint */
+void swap(Constraint& x, Constraint& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Constraint_inlines.hh"
+
+#endif // !defined(PPL_Constraint_defs_hh)
diff --git a/src/Constraint_inlines.hh b/src/Constraint_inlines.hh
new file mode 100644
index 0000000..2a077f4
--- /dev/null
+++ b/src/Constraint_inlines.hh
@@ -0,0 +1,577 @@
+/* Constraint class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_inlines_hh
+#define PPL_Constraint_inlines_hh 1
+
+#include "Linear_Expression_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Constraint::is_necessarily_closed() const {
+ return (topology_ == NECESSARILY_CLOSED);
+}
+
+inline bool
+Constraint::is_not_necessarily_closed() const {
+ return !is_necessarily_closed();
+}
+
+inline Constraint::expr_type
+Constraint::expression() const {
+ return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline void
+Constraint::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Constraint::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Constraint::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Constraint::topology() const {
+ return topology_;
+}
+
+inline void
+Constraint::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Constraint::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Constraint::set_topology(Topology x) {
+ if (topology() == x)
+ return;
+ if (topology() == NECESSARILY_CLOSED) {
+ // Add a column for the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ }
+ else {
+ PPL_ASSERT(expr.space_dimension() != 0);
+ expr.set_space_dimension(expr.space_dimension() - 1);
+ }
+ topology_ = x;
+}
+
+inline void
+Constraint::mark_as_necessarily_closed() {
+ PPL_ASSERT(is_not_necessarily_closed());
+ topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(is_necessarily_closed());
+ topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Constraint::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Constraint::Constraint(Representation r)
+ : expr(r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY),
+ topology_(NECESSARILY_CLOSED) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r)
+ : expr(r),
+ kind_(kind),
+ topology_(topology) {
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Kind kind, Topology topology)
+ : kind_(kind),
+ topology_(topology) {
+ PPL_ASSERT(kind != RAY_OR_POINT_OR_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ // Add the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ strong_normalize();
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology)
+ : topology_(topology) {
+ PPL_ASSERT(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ if (type == EQUALITY)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ strong_normalize();
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+ : expr(c.expr),
+ kind_(c.kind_),
+ topology_(c.topology_) {
+ // NOTE: This does not call PPL_ASSERT(OK()) because this is called by OK().
+}
+
+inline
+Constraint::Constraint(const Constraint& c, Representation r)
+ : expr(c.expr, r),
+ kind_(c.kind_),
+ topology_(c.topology_) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim)
+ : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+ kind_(c.kind_), topology_(c.topology_) {
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim,
+ Representation r)
+ : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+ kind_(c.kind_), topology_(c.topology_) {
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+ Constraint tmp = c;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Representation
+Constraint::representation() const {
+ return expr.representation();
+}
+
+inline void
+Constraint::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Constraint::set_space_dimension_no_ok(dimension_type space_dim) {
+ const dimension_type old_expr_space_dim = expr.space_dimension();
+ if (topology() == NECESSARILY_CLOSED) {
+ expr.set_space_dimension(space_dim);
+ }
+ else {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+ if (expr.space_dimension() < old_expr_space_dim)
+ strong_normalize();
+}
+
+inline void
+Constraint::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline bool
+Constraint::remove_space_dimensions(const Variables_Set& vars) {
+ expr.remove_space_dimensions(vars);
+ return true;
+}
+
+inline bool
+Constraint::is_equality() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+ if (is_equality())
+ return EQUALITY;
+ if (is_necessarily_closed())
+ return NONSTRICT_INEQUALITY;
+ if (epsilon_coefficient() < 0)
+ return STRICT_INEQUALITY;
+ else
+ return NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+ return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+ return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+ set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+ return expr.inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Constraint::strong_normalize() {
+ expr.normalize();
+ sign_normalize();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+ return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1,
+ std::max(e1.space_dimension(), e2.space_dimension()),
+ Constraint::default_representation);
+ diff -= e2;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Variable v1, Variable v2) {
+ if (v1.space_dimension() > v2.space_dimension())
+ swap(v1, v2);
+ PPL_ASSERT(v1.space_dimension() <= v2.space_dimension());
+
+ Linear_Expression diff(v1, Constraint::default_representation);
+ diff -= v2;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1,
+ std::max(e1.space_dimension(), e2.space_dimension()),
+ Constraint::default_representation);
+ diff -= e2;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+ Linear_Expression diff(Constraint::default_representation);
+ diff.set_space_dimension(std::max(v1.space_dimension(),
+ v2.space_dimension()));
+ diff += v1;
+ diff -= v2;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1, Constraint::default_representation);
+ diff -= e2;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Variable v1, const Variable v2) {
+ Linear_Expression diff(Constraint::default_representation);
+ diff.set_space_dimension(std::max(v1.space_dimension(),
+ v2.space_dimension()));
+ diff += v1;
+ diff -= v2;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+ return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Variable v1, const Variable v2) {
+ return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+ PPL_ASSERT(zero_dim_false_p != 0);
+ return *zero_dim_false_p;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+ PPL_ASSERT(zero_dim_positivity_p != 0);
+ return *zero_dim_positivity_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+ PPL_ASSERT(epsilon_geq_zero_p != 0);
+ return *epsilon_geq_zero_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+ PPL_ASSERT(epsilon_leq_one_p != 0);
+ return *epsilon_leq_one_p;
+}
+
+inline void
+Constraint::m_swap(Constraint& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+ swap(topology_, y.topology_);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::epsilon_coefficient() const {
+ PPL_ASSERT(is_not_necessarily_closed());
+ return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+inline void
+Constraint::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+ PPL_ASSERT(is_not_necessarily_closed());
+ expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+/*! \relates Constraint */
+inline void
+swap(Constraint& x, Constraint& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_inlines_hh)
diff --git a/src/Constraint_types.hh b/src/Constraint_types.hh
new file mode 100644
index 0000000..223a3c6
--- /dev/null
+++ b/src/Constraint_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_types_hh
+#define PPL_Constraint_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_types_hh)
diff --git a/src/DB_Matrix_defs.hh b/src/DB_Matrix_defs.hh
new file mode 100644
index 0000000..507972f
--- /dev/null
+++ b/src/DB_Matrix_defs.hh
@@ -0,0 +1,325 @@
+/* DB_Matrix class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_defs_hh
+#define PPL_DB_Matrix_defs_hh 1
+
+#include "DB_Matrix_types.hh"
+#include "globals_defs.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_types.hh"
+#include "Rounding_Dir_defs.hh"
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+ The template class DB_Matrix<T> allows for the representation of
+ a square matrix of T objects.
+ Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+ //! Returns the maximum number of rows a DB_Matrix can handle.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns a DB_Matrix can handle.
+ static dimension_type max_num_columns();
+
+ //! Builds an empty matrix.
+ /*!
+ DB_Rows' size and capacity are initialized to \f$0\f$.
+ */
+ DB_Matrix();
+
+ //! Builds a square matrix having the specified dimension.
+ explicit DB_Matrix(dimension_type n_rows);
+
+ //! Copy constructor.
+ DB_Matrix(const DB_Matrix& y);
+
+ //! Constructs a conservative approximation of \p y.
+ template <typename U>
+ explicit DB_Matrix(const DB_Matrix<U>& y);
+
+ //! Destructor.
+ ~DB_Matrix();
+
+ //! Assignment operator.
+ DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A read-only iterator over the rows of the matrix.
+ /*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ class const_iterator {
+ private:
+ typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+ //! The const iterator on the rows' vector \p rows.
+ Iter i;
+
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<Iter>::value_type value_type;
+ typedef typename std::iterator_traits<Iter>::difference_type
+ difference_type;
+ typedef typename std::iterator_traits<Iter>::pointer pointer;
+ typedef typename std::iterator_traits<Iter>::reference reference;
+
+ //! Default constructor.
+ const_iterator();
+
+ /*! \brief
+ Builds a const iterator on the matrix starting from
+ an iterator \p b on the elements of the vector \p rows.
+ */
+ explicit const_iterator(const Iter& b);
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const const_iterator& y) const;
+ };
+
+ /*! \brief
+ Returns the const_iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+private:
+ template <typename U> friend class DB_Matrix;
+
+ //! The rows of the matrix.
+ std::vector<DB_Row<T> > rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ /*! \brief
+ Capacity allocated for each row, i.e., number of
+ <CODE>long</CODE> objects that each row can contain.
+ */
+ dimension_type row_capacity;
+
+public:
+ //! Swaps \p *this with \p y.
+ void m_swap(DB_Matrix& y);
+
+ //! Makes the matrix grow by adding more rows and more columns.
+ /*!
+ \param new_n_rows
+ The number of rows and columns of the resized matrix.
+
+ A new matrix, with the specified dimension, is created.
+ The contents of the old matrix are copied in the upper, left-hand
+ corner of the new matrix, which is then assigned to \p *this.
+ */
+ void grow(dimension_type new_n_rows);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows and columns of the resized matrix.
+
+ A new matrix, with the specified dimension, is created without copying
+ the content of the old matrix and assigned to \p *this.
+ */
+ void resize_no_copy(dimension_type new_n_rows);
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ DB_Row<T>& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const DB_Row<T>& operator[](dimension_type k) const;
+ //@}
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Matrix<T>& x, DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the Euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "DB_Matrix_inlines.hh"
+#include "DB_Matrix_templates.hh"
+
+#endif // !defined(PPL_DB_Matrix_defs_hh)
diff --git a/src/DB_Matrix_inlines.hh b/src/DB_Matrix_inlines.hh
new file mode 100644
index 0000000..63c52ca
--- /dev/null
+++ b/src/DB_Matrix_inlines.hh
@@ -0,0 +1,330 @@
+/* DB_Matrix class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_inlines_hh
+#define PPL_DB_Matrix_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "distances_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::m_swap(DB_Matrix& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(row_size, y.row_size);
+ swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+ return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+ return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+ : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+ : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+ return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+ return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+ return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+ return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+ return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+ : rows(),
+ row_size(0),
+ row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+ return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+ // Without the following guard against auto-assignments we would
+ // recompute the row capacity based on row size, possibly without
+ // actually increasing the capacity of the rows. This would lead to
+ // an inconsistent state.
+ if (this != &y) {
+ // The following assignment may do nothing on auto-assignments...
+ rows = y.rows;
+ row_size = y.row_size;
+ // ... hence the following assignment must not be done on
+ // auto-assignments.
+ row_capacity = compute_capacity(y.row_size, max_num_columns());
+ }
+ return *this;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_num_rows = x.num_rows();
+ if (x_num_rows != y.num_rows())
+ return false;
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (dimension_type i = x_num_rows; i-- > 0; ) {
+ const DB_Row<T>& x_i = x[i];
+ const DB_Row<T>& y_i = y[i];
+ for (dimension_type j = x_num_rows; j-- > 0; ) {
+ const T& x_i_j = x_i[j];
+ const T& y_i_j = y_i[j];
+ if (is_plus_infinity(x_i_j)) {
+ if (is_plus_infinity(y_i_j))
+ continue;
+ else {
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+ }
+ else if (is_plus_infinity(y_i_j))
+ goto pinf;
+
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i_j > y_i_j) {
+ maybe_assign(tmp1p, tmp1, x_i_j, dir);
+ maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i_j, dir);
+ maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+swap(DB_Matrix<T>& x, DB_Matrix<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_inlines_hh)
diff --git a/src/DB_Matrix_templates.hh b/src/DB_Matrix_templates.hh
new file mode 100644
index 0000000..6fba4e1
--- /dev/null
+++ b/src/DB_Matrix_templates.hh
@@ -0,0 +1,319 @@
+/* DB_Matrix class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_templates_hh
+#define PPL_DB_Matrix_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+ : rows(n_rows),
+ row_size(n_rows),
+ row_capacity(compute_capacity(n_rows, max_num_columns())) {
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < n_rows; ++i)
+ rows[i].construct(n_rows, row_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+ : rows(y.rows.size()),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+ rows[i].construct_upward_approximation(y[i], row_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+ const dimension_type old_n_rows = rows.size();
+ PPL_ASSERT(new_n_rows >= old_n_rows);
+
+ if (new_n_rows > old_n_rows) {
+ if (new_n_rows <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation will take place.
+ std::vector<DB_Row<T> > new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows.
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_rows[i].construct(new_n_rows, row_capacity);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ swap(new_rows[i], rows[i]);
+ // Put the new vector into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+ for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+ rows[i].construct(new_n_rows, row_capacity);
+ }
+ }
+ else {
+ // We cannot even recycle the old rows.
+ DB_Matrix new_matrix;
+ new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows.
+ new_matrix.row_size = new_n_rows;
+ new_matrix.row_capacity = compute_capacity(new_n_rows,
+ max_num_columns());
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_matrix.rows[i].construct(new_matrix.row_size,
+ new_matrix.row_capacity);
+ // Copy the old rows.
+ ++i;
+ while (i-- > 0) {
+ // FIXME: copying may be unnecessarily costly.
+ DB_Row<T> new_row(rows[i],
+ new_matrix.row_size,
+ new_matrix.row_capacity);
+ swap(new_matrix.rows[i], new_row);
+ }
+ // Put the new vector into place.
+ m_swap(new_matrix);
+ return;
+ }
+ }
+ // Here we have the right number of rows.
+ if (new_n_rows > row_size) {
+ // We need more columns.
+ if (new_n_rows <= row_capacity)
+ // But we have enough capacity: we resize existing rows.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ rows[i].expand_within_capacity(new_n_rows);
+ else {
+ // Capacity exhausted: we must reallocate the rows and
+ // make sure all the rows have the same capacity.
+ const dimension_type new_row_capacity
+ = compute_capacity(new_n_rows, max_num_columns());
+ for (dimension_type i = old_n_rows; i-- > 0; ) {
+ // FIXME: copying may be unnecessarily costly.
+ DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+ swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ // Rows have grown or shrunk.
+ row_size = new_n_rows;
+ }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+ dimension_type old_n_rows = rows.size();
+
+ if (new_n_rows > old_n_rows) {
+ // Rows will be inserted.
+ if (new_n_rows <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation (of vector `rows') will take place.
+ std::vector<DB_Row<T> > new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows (be careful: each new row must have
+ // the same capacity as each one of the old rows).
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_rows[i].construct(new_n_rows, row_capacity);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ swap(new_rows[i], rows[i]);
+ // Put the new vector into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else {
+ // Reallocation (of vector `rows') will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+ // Be careful: each new row must have
+ // the same capacity as each one of the old rows.
+ for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+ rows[i].construct(new_n_rows, row_capacity);
+ }
+ }
+ else {
+ // We cannot even recycle the old rows: allocate a new matrix and swap.
+ DB_Matrix new_matrix(new_n_rows);
+ m_swap(new_matrix);
+ return;
+ }
+ }
+ else if (new_n_rows < old_n_rows) {
+ // Drop some rows.
+ rows.resize(new_n_rows);
+ // Shrink the existing rows.
+ for (dimension_type i = new_n_rows; i-- > 0; )
+ rows[i].shrink(new_n_rows);
+ old_n_rows = new_n_rows;
+ }
+ // Here we have the right number of rows.
+ if (new_n_rows > row_size) {
+ // We need more columns.
+ if (new_n_rows <= row_capacity)
+ // But we have enough capacity: we resize existing rows.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ rows[i].expand_within_capacity(new_n_rows);
+ else {
+ // Capacity exhausted: we must reallocate the rows and
+ // make sure all the rows have the same capacity.
+ const dimension_type new_row_capacity
+ = compute_capacity(new_n_rows, max_num_columns());
+ for (dimension_type i = old_n_rows; i-- > 0; ) {
+ DB_Row<T> new_row(new_n_rows, new_row_capacity);
+ swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ }
+ // DB_Rows have grown or shrunk.
+ row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+ const DB_Matrix<T>& x = *this;
+ const char separator = ' ';
+ const dimension_type nrows = x.num_rows();
+ s << nrows << separator << "\n";
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j) {
+ using namespace IO_Operators;
+ s << x[i][j] << separator;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+ dimension_type nrows;
+ if (!(s >> nrows))
+ return false;
+ resize_no_copy(nrows);
+ DB_Matrix& x = *this;
+ for (dimension_type i = 0; i < nrows; ++i)
+ for (dimension_type j = 0; j < nrows; ++j) {
+ Result r = input(x[i][j], s, ROUND_CHECK);
+ if (result_relation(r) != VR_EQ || is_minus_infinity(x[i][j]))
+ return false;
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+ const dimension_type x_num_rows = x.num_rows();
+ if (x_num_rows != y.num_rows())
+ return false;
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+ memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+ for (dimension_type i = num_rows(); i-- > 0; )
+ n += rows[i].external_memory_in_bytes(row_capacity);
+ return n;
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // The matrix must be square.
+ if (num_rows() != row_size) {
+#ifndef NDEBUG
+ cerr << "DB_Matrix has fewer columns than rows:\n"
+ << "row_size is " << row_size
+ << ", num_rows() is " << num_rows() << "!"
+ << endl;
+#endif
+ return false;
+ }
+
+ const DB_Matrix& x = *this;
+ const dimension_type n_rows = x.num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ if (!x[i].OK(row_size, row_capacity))
+ return false;
+ }
+
+ // All checks passed.
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+ const dimension_type n = c.num_rows();
+ for (dimension_type i = 0; i < n; ++i) {
+ for (dimension_type j = 0; j < n; ++j)
+ s << c[i][j] << " ";
+ s << "\n";
+ }
+ return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_templates_hh)
diff --git a/src/DB_Matrix_types.hh b/src/DB_Matrix_types.hh
new file mode 100644
index 0000000..afc4e2a
--- /dev/null
+++ b/src/DB_Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Matrix_types_hh
+#define PPL_DB_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_types_hh)
diff --git a/src/DB_Row_defs.hh b/src/DB_Row_defs.hh
new file mode 100644
index 0000000..d756481
--- /dev/null
+++ b/src/DB_Row_defs.hh
@@ -0,0 +1,470 @@
+/* DB_Row class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_defs_hh
+#define PPL_DB_Row_defs_hh 1
+
+#include "DB_Row_types.hh"
+#include "globals_types.hh"
+#include "Ptr_Iterator_defs.hh"
+#include <cstddef>
+#include <vector>
+
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
+ of the class DB_Row carries its own capacity; this enables extra
+ consistency checks to be performed.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+ Exception-safety is the only responsibility of this class: it has
+ to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+ //! Default constructor.
+ DB_Row_Impl_Handler();
+
+ //! Destructor.
+ ~DB_Row_Impl_Handler();
+
+ class Impl;
+
+ //! A pointer to the actual implementation.
+ Impl* impl;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+private:
+ //! Private and unimplemented: copy construction is not allowed.
+ DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+ //! Private and unimplemented: copy assignment is not allowed.
+ DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+ The class template DB_Row<T> allows for the efficient representation of
+ the single rows of a DB_Matrix. It contains elements of type T stored
+ as a vector. The class T is a family of extended numbers that
+ must provide representation for
+ \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+ <EM>not a number</EM>, since this arises as the ``result'' of
+ undefined sums like \f$ +\infty + (-\infty) \f$).
+
+ The class T must provide the following methods:
+
+ \code
+ T()
+ \endcode
+ is the default constructor: no assumption is made on the particular
+ object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+ (see below).
+ \code
+ ~T()
+ \endcode
+ is the destructor.
+ \code
+ bool is_nan() const
+ \endcode
+ returns <CODE>true</CODE> if and only \p *this represents
+ the <EM>not a number</EM> value.
+ \code
+ bool OK() const
+ \endcode
+ returns <CODE>true</CODE> if and only if \p *this satisfies all
+ its invariants.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+ //! Pre-constructs a row: construction must be completed by construct().
+ DB_Row();
+
+ //! \name Post-constructors.
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with size \p sz and minimum capacity.
+ */
+ void construct(dimension_type sz);
+
+ //! Constructs properly a default-constructed element.
+ /*!
+ \param sz
+ The size of the row that will be constructed.
+
+ \param capacity
+ The minimum capacity of the row that will be constructed.
+
+ The row that we are constructing has a minimum capacity of
+ (i.e., it can contain at least) \p elements, \p sz of which
+ will be constructed now.
+ */
+ void construct(dimension_type sz, dimension_type capacity);
+
+ //! Constructs properly a conservative approximation of \p y.
+ /*!
+ \param y
+ A row containing the elements whose upward approximations will
+ be used to properly construct \p *this.
+
+ \param capacity
+ The capacity of the constructed row.
+
+ It is assumed that \p capacity is greater than or equal to the
+ size of \p y.
+ */
+ template <typename U>
+ void construct_upward_approximation(const DB_Row<U>& y,
+ dimension_type capacity);
+
+ //@}
+
+ //! Tight constructor: resizing will require reallocation.
+ DB_Row(dimension_type sz);
+
+ //! Sizing constructor with capacity.
+ DB_Row(dimension_type sz, dimension_type capacity);
+
+ //! Ordinary copy constructor.
+ DB_Row(const DB_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to \p y size.
+ */
+ DB_Row(const DB_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is greater than or equal to the size of \p y
+ and, of course, that \p sz is less than or equal to \p capacity.
+ Any new position is initialized to \f$+\infty\f$.
+ */
+ DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~DB_Row();
+
+ //! Assignment operator.
+ DB_Row& operator=(const DB_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(DB_Row& y);
+
+ //! Assigns the implementation of \p y to \p *this.
+ void assign(DB_Row& y);
+
+ /*! \brief
+ Allocates memory for a default constructed DB_Row object,
+ allowing for \p capacity coefficients at most.
+
+ It is assumed that no allocation has been performed before
+ (otherwise, a memory leak will occur).
+ After execution, the size of the DB_Row object is zero.
+ */
+ void allocate(dimension_type capacity);
+
+ //! Expands the row to size \p new_size.
+ /*!
+ Adds new positions to the implementation of the row
+ obtaining a new row with size \p new_size.
+ It is assumed that \p new_size is between the current size
+ and capacity of the row. The new positions are initialized
+ to \f$+\infty\f$.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ Destroys elements of the row implementation
+ from position \p new_size to the end.
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Returns the size() of the largest possible DB_Row.
+ static dimension_type max_size();
+
+ //! Gives the number of coefficients currently in use.
+ dimension_type size() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the element of the row indexed by \p k.
+ T& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of the row indexed by \p k.
+ const T& operator[](dimension_type k) const;
+ //@}
+
+ //! A (non const) random access iterator to access the row's elements.
+ typedef Implementation::Ptr_Iterator<T*> iterator;
+
+ //! A const random access iterator to access the row's elements.
+ typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+ /*! \brief
+ Returns the const iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const iterator.
+ */
+ iterator begin();
+
+ //! Returns the past-the-end iterator.
+ iterator end();
+
+ /*! \brief
+ Returns the const iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const iterator.
+ const_iterator end() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns the total size in bytes of the memory occupied by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ /*! \brief
+ Returns the size in bytes of the memory managed by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const DB_Row& y);
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Row<T>& x, DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+ typename std::vector<DB_Row<T> >::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+ The class DB_Row_Impl_Handler::Impl provides the implementation of
+ DB_Row objects and, in particular, of the corresponding memory
+ allocation functions.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+ //! \name Custom allocator and deallocator.
+ //@{
+
+ /*! \brief
+ Allocates a chunk of memory able to contain \p capacity T objects
+ beyond the specified \p fixed_size and returns a pointer to the new
+ allocated memory.
+ */
+ static void* operator new(size_t fixed_size, dimension_type capacity);
+
+ //! Uses the standard delete operator to free the memory \p p points to.
+ static void operator delete(void* p);
+
+ /*! \brief
+ Placement version: uses the standard operator delete to free
+ the memory \p p points to.
+ */
+ static void operator delete(void* p, dimension_type capacity);
+ //@}
+
+ //! Default constructor.
+ Impl();
+
+ //! Destructor.
+ /*!
+ Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+ to delete all the row elements.
+ */
+ ~Impl();
+
+ //! Expands the row to size \p new_size.
+ /*!
+ It is assumed that \p new_size is between the current size and capacity.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const Impl& y);
+
+ /*! \brief
+ Exception-safe upward approximation construction mechanism
+ for coefficients.
+ */
+ template <typename U>
+ void construct_upward_approximation(const U& y);
+
+ //! Returns the size() of the largest possible Impl.
+ static dimension_type max_size();
+
+ //! \name Size accessors.
+ //@{
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Sets to \p new_sz the actual size of \p *this.
+ void set_size(dimension_type new_sz);
+
+ //! Increments the size of \p *this by 1.
+ void bump_size();
+ //@}
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the element of \p *this indexed by \p k.
+ T& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of \p *this indexed by \p k.
+ const T& operator[](dimension_type k) const;
+ //@}
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+private:
+ friend class DB_Row<T>;
+
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The vector of coefficients.
+ T vec_[
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ 0
+#else
+ 1
+#endif
+ ];
+
+ //! Private and unimplemented: copy construction is not allowed.
+ Impl(const Impl& y);
+
+ //! Private and unimplemented: assignment is not allowed.
+ Impl& operator=(const Impl&);
+
+ //! Exception-safe copy construction mechanism.
+ void copy_construct(const Impl& y);
+};
+
+#include "DB_Row_inlines.hh"
+#include "DB_Row_templates.hh"
+
+#endif // !defined(PPL_DB_Row_defs_hh)
diff --git a/src/DB_Row_inlines.hh b/src/DB_Row_inlines.hh
new file mode 100644
index 0000000..1ceeb7e
--- /dev/null
+++ b/src/DB_Row_inlines.hh
@@ -0,0 +1,428 @@
+/* DB_Row class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_inlines_hh
+#define PPL_DB_Row_inlines_hh 1
+
+#include "checked_defs.hh"
+#include "assert.hh"
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+ const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+ PPL_ASSERT(capacity >= 1);
+ return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+ ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+ ::operator delete(p);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+ return
+ sizeof(*this)
+ + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ - 1*sizeof(T)
+#endif
+ + external_memory_in_bytes();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+ // In general, this is a lower bound, as the capacity of *this
+ // may be strictly greater than `size_'
+ return total_memory_in_bytes(size_);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+ return std::numeric_limits<size_t>::max() / sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+ return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+ size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+ ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+ : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+ shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+ : impl(0) {
+#if PPL_DB_ROW_EXTRA_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+ delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+ PPL_ASSERT(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+ return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+ return this->impl->size();
+}
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+ return this->capacity_;
+}
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+ : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ const
+#endif
+ dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ PPL_ASSERT(x.impl == 0);
+ x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(x.capacity_ == 0);
+ x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(new_size <= x.capacity_);
+#endif
+ x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl && y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(y.size() <= x.capacity_);
+#endif
+ x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+ const dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ PPL_ASSERT(y.impl);
+ x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+ const dimension_type capacity) {
+ PPL_ASSERT(sz <= capacity && capacity <= max_size());
+ allocate(capacity);
+ expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+ construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+ construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+ : DB_Row_Impl_Handler<T>() {
+ if (y.impl != 0) {
+ allocate(compute_capacity(y.size(), max_size()));
+ copy_construct_coefficients(y);
+ }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ PPL_ASSERT(y.impl);
+ PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ PPL_ASSERT(y.impl);
+ PPL_ASSERT(y.size() <= sz && sz <= capacity && capacity <= max_size());
+ allocate(capacity);
+ copy_construct_coefficients(y);
+ expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl);
+ x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::m_swap(DB_Row& y) {
+ using std::swap;
+ DB_Row<T>& x = *this;
+ swap(x.impl, y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+ DB_Row<T>& x = *this;
+ x.impl = y.impl;
+#if PPL_DB_ROW_EXTRA_DEBUG
+ x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+ DB_Row tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+ DB_Row<T>& x = *this;
+ return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+ const DB_Row<T>& x = *this;
+ return (*x.impl)[k];
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+ const DB_Row<T>& x = *this;
+ return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+ const DB_Row<T>& x = *this;
+ return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
+ const DB_Row<T>& x = *this;
+ return x.impl->total_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+ const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+ return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+ return x.impl->total_memory_in_bytes();
+#endif
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+ return !(x == y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+swap(DB_Row<T>& x, DB_Row<T>& y) {
+ x.m_swap(y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+ typename std::vector<DB_Row<T> >::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_inlines_hh)
diff --git a/src/DB_Row_templates.hh b/src/DB_Row_templates.hh
new file mode 100644
index 0000000..12dbac4
--- /dev/null
+++ b/src/DB_Row_templates.hh
@@ -0,0 +1,215 @@
+/* DB_Row class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_templates_hh
+#define PPL_DB_Row_templates_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+ const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < y_size; ++i) {
+ construct(vec_[i], y[i], ROUND_UP);
+ bump_size();
+ }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (y_size > 0) {
+ assign_r(vec_[0], y[0], ROUND_UP);
+ bump_size();
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 1; i < y_size; ++i) {
+ construct(vec_[i], y[i], ROUND_UP);
+ bump_size();
+ }
+ }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+ PPL_ASSERT(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (size() == 0 && new_size > 0) {
+ // vec_[0] is already constructed: we just need to assign +infinity.
+ assign_r(vec_[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ bump_size();
+ }
+#endif
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = size(); i < new_size; ++i) {
+ new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+ bump_size();
+ }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+ const dimension_type old_size = size();
+ PPL_ASSERT(new_size <= old_size);
+ // Since ~T() does not throw exceptions, nothing here does.
+ set_size(new_size);
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Make sure we do not try to destroy vec_[0].
+ if (new_size == 0)
+ ++new_size;
+#endif
+ // We assume construction was done "forward".
+ // We thus perform destruction "backward".
+ for (dimension_type i = old_size; i-- > new_size; )
+ vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+ const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < y_size; ++i) {
+ new (&vec_[i]) T(y.vec_[i]);
+ bump_size();
+ }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (y_size > 0) {
+ vec_[0] = y.vec_[0];
+ bump_size();
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 1; i < y_size; ++i) {
+ new (&vec_[i]) T(y.vec_[i]);
+ bump_size();
+ }
+ }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+ memory_size_type n = 0;
+ for (dimension_type i = size(); i-- > 0; )
+ n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+ return n;
+}
+
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+ const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+ row_capacity
+#endif
+ ) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ const DB_Row<T>& x = *this;
+ bool is_broken = false;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (x.capacity_ == 0) {
+ cerr << "Illegal row capacity: is 0, should be at least 1"
+ << endl;
+ is_broken = true;
+ }
+ else if (x.capacity_ == 1 && row_capacity == 0)
+ // This is fine.
+ ;
+ else
+# endif // !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (x.capacity_ != row_capacity) {
+ cerr << "DB_Row capacity mismatch: is " << x.capacity_
+ << ", should be " << row_capacity << "."
+ << endl;
+ is_broken = true;
+ }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+ if (x.size() != row_size) {
+#ifndef NDEBUG
+ cerr << "DB_Row size mismatch: is " << x.size()
+ << ", should be " << row_size << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+ cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+ << ", size is " << x.size() << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+ for (dimension_type i = x.size(); i-- > 0; ) {
+ const T& element = x[i];
+ // Not OK is bad.
+ if (!element.OK()) {
+ is_broken = true;
+ break;
+ }
+ // In addition, nans should never occur.
+ if (is_not_a_number(element)) {
+#ifndef NDEBUG
+ cerr << "Not-a-number found in DB_Row."
+ << endl;
+#endif
+ is_broken = true;
+ break;
+ }
+ }
+
+ return !is_broken;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+ if (x.size() != y.size())
+ return false;
+ for (dimension_type i = x.size(); i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_templates_hh)
diff --git a/src/DB_Row_types.hh b/src/DB_Row_types.hh
new file mode 100644
index 0000000..03e6183
--- /dev/null
+++ b/src/DB_Row_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Row_types_hh
+#define PPL_DB_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Row_Impl_Handler;
+
+template <typename T>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_types_hh)
diff --git a/src/Dense_Row.cc b/src/Dense_Row.cc
new file mode 100644
index 0000000..20503c1
--- /dev/null
+++ b/src/Dense_Row.cc
@@ -0,0 +1,581 @@
+/* Dense_Row class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Dense_Row_defs.hh"
+#include "Coefficient_defs.hh"
+#include "assert.hh"
+#include "Sparse_Row_defs.hh"
+#include <iostream>
+#include <iomanip>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Dense_Row::Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity) {
+ resize(sz, capacity);
+ for (Sparse_Row::const_iterator i = y.begin(),
+ i_end = y.lower_bound(sz); i != i_end; ++i)
+ (*this)[i.index()] = *i;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::resize(dimension_type new_size) {
+ if (new_size <= size())
+ shrink(new_size);
+ else {
+ if (new_size > capacity()) {
+ // Reallocation is required.
+ // TODO: Consider using realloc() here.
+ // TODO: Consider using a smarter allocation strategy.
+ const dimension_type new_capacity = new_size;
+ Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+ if (impl.vec != 0) {
+ memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+ impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+ }
+
+ impl.vec = new_vec;
+ impl.capacity = new_capacity;
+ }
+ PPL_ASSERT(new_size <= impl.capacity);
+ // Construct the additional elements.
+ while (impl.size != new_size) {
+ new (&impl.vec[impl.size]) Coefficient();
+ ++impl.size;
+ }
+ }
+ PPL_ASSERT(size() == new_size);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::resize(dimension_type new_size, dimension_type new_capacity) {
+ PPL_ASSERT(new_size <= new_capacity);
+
+ if (new_capacity == 0) {
+ destroy();
+ impl.vec = 0;
+ impl.size = 0;
+ impl.capacity = 0;
+
+ PPL_ASSERT(size() == new_size);
+ PPL_ASSERT(capacity() == new_capacity);
+ PPL_ASSERT(OK());
+
+ return;
+ }
+
+ if (new_capacity < capacity()) {
+
+ shrink(new_size);
+
+ PPL_ASSERT(impl.size == new_size);
+
+ Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+ PPL_ASSERT(impl.vec != 0);
+
+ memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+
+ impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+
+ impl.vec = new_vec;
+ impl.capacity = new_capacity;
+ }
+ else {
+ if (new_capacity > capacity()) {
+
+ Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+ if (impl.vec != 0) {
+ memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+ impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+ }
+
+ impl.vec = new_vec;
+ impl.capacity = new_capacity;
+
+ resize(new_size);
+ }
+ }
+
+ PPL_ASSERT(size() == new_size);
+ PPL_ASSERT(capacity() == new_capacity);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::clear() {
+ for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+ *i = 0;
+}
+
+void
+PPL::Dense_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+ PPL_ASSERT(i <= size());
+ const dimension_type new_size = size() + n;
+ if (new_size > capacity()) {
+ Dense_Row new_row;
+ const dimension_type new_capacity = compute_capacity(new_size, max_size());
+ // This may throw.
+ new_row.impl.vec = new_row.impl.coeff_allocator.allocate(new_capacity);
+ new_row.impl.capacity = new_capacity;
+
+ dimension_type j = i;
+ try {
+ // Construct coefficients with value 0 in
+ // new_row.impl.vec[i ... i + n - 1]
+ for ( ; j < i + n; ++j)
+ new (&(new_row.impl.vec[j])) Coefficient(0);
+ } catch (...) {
+ // Destroy the zeroes constructed so far.
+ while (j != i) {
+ --j;
+ new_row.impl.vec[j].~Coefficient();
+ }
+ // The new_row's destructor will de-allocate the memory.
+ throw;
+ }
+
+ // Raw-copy the coefficients.
+ memcpy(new_row.impl.vec, impl.vec, sizeof(Coefficient) * i);
+ memcpy(&(new_row.impl.vec[i + n]), &impl.vec[i],
+ sizeof(Coefficient) * (impl.size - i));
+
+ using std::swap;
+ swap(impl.vec, new_row.impl.vec);
+ swap(impl.capacity, new_row.impl.capacity);
+
+ // *this now owns all coefficients, including the newly-added zeroes.
+ impl.size = new_size;
+
+ // The old vec will be de-allocated at the end of this block.
+
+ }
+ else {
+ memmove(&impl.vec[n + i], &impl.vec[i], sizeof(Coefficient)
+ * (impl.size - i));
+ impl.size = i;
+ const dimension_type target_size = impl.size + n;
+ PPL_ASSERT(target_size == i + n);
+ try {
+ // Construct n zeroes where the moved elements resided.
+ while (impl.size != target_size) {
+ new (&impl.vec[impl.size]) Coefficient(0);
+ ++impl.size;
+ }
+ impl.size = new_size;
+ } catch (...) {
+ // impl.vec[impl.size]..impl.vec[target_size-1] are still unconstructed,
+ // but impl.vec[target_size]..impl.vec[new_size] are constructed,
+ // because the memmove() moved already-constructed objects.
+
+ // NOTE: This loop can't throw, because destructors must not throw.
+ for (dimension_type j = target_size; j < new_size; ++j)
+ impl.vec[j].~Coefficient();
+
+ throw;
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::expand_within_capacity(const dimension_type new_size) {
+ PPL_ASSERT(new_size <= impl.capacity);
+ PPL_ASSERT(size() <= new_size && new_size <= max_size());
+ while (impl.size != new_size) {
+ new (&impl.vec[impl.size]) Coefficient();
+ ++impl.size;
+ }
+ PPL_ASSERT(size() == new_size);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::shrink(dimension_type new_size) {
+ PPL_ASSERT(new_size <= size());
+ // Since ~Coefficient() does not throw exceptions, nothing here does.
+
+ // We assume construction was done "forward".
+ // We thus perform destruction "backward".
+ while (impl.size != new_size) {
+ --impl.size;
+ impl.vec[impl.size].~Coefficient();
+ }
+
+ PPL_ASSERT(size() == new_size);
+ PPL_ASSERT(OK());
+}
+
+PPL::Dense_Row::Dense_Row(const Sparse_Row& row)
+ : impl() {
+
+ init(row);
+
+ PPL_ASSERT(size() == row.size());
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::init(const Sparse_Row& row) {
+ impl.capacity = row.size();
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+ Sparse_Row::const_iterator itr = row.begin();
+ Sparse_Row::const_iterator itr_end = row.end();
+ while (impl.size != impl.capacity) {
+ // Constructs (*this)[impl.size] with row[impl.size].
+ if (itr != itr_end && itr.index() == impl.size) {
+ new (&impl.vec[impl.size]) Coefficient(*itr);
+ ++itr;
+ }
+ else
+ new (&impl.vec[impl.size]) Coefficient();
+ ++impl.size;
+ }
+ PPL_ASSERT(size() == row.size());
+ PPL_ASSERT(OK());
+}
+
+PPL::Dense_Row&
+PPL::Dense_Row::operator=(const Sparse_Row& row) {
+ if (size() > row.size()) {
+ // TODO: If the shrink() is modified to reallocate a smaller chunk,
+ // this can be optimized.
+ shrink(row.size());
+ Sparse_Row::const_iterator itr = row.begin();
+ Sparse_Row::const_iterator itr_end = row.end();
+ for (dimension_type i = 0; i < impl.size; ++i) {
+ // Computes (*this)[impl.size] = row[impl.size].
+ if (itr != itr_end && itr.index() == i) {
+ impl.vec[impl.size] = *itr;
+ ++itr;
+ }
+ else
+ impl.vec[impl.size] = Coefficient_zero();
+ }
+ }
+ else {
+ if (capacity() >= row.size()) {
+ // size() <= row.size() <= capacity().
+ Sparse_Row::const_iterator itr = row.begin();
+ Sparse_Row::const_iterator itr_end = row.end();
+ for (dimension_type i = 0; i < impl.size; ++i) {
+ // The following code is equivalent to (*this)[i] = row[i].
+ if (itr != itr_end && itr.index() == impl.size) {
+ new (&impl.vec[impl.size]) Coefficient(*itr);
+ ++itr;
+ }
+ else
+ new (&impl.vec[impl.size]) Coefficient();
+ }
+ // Construct the additional elements.
+ for ( ; impl.size != row.size(); ++impl.size) {
+ // Constructs (*this)[impl.size] with row[impl.size].
+ if (itr != itr_end && itr.index() == impl.size) {
+ new (&impl.vec[impl.size]) Coefficient(*itr);
+ ++itr;
+ }
+ else
+ new (&impl.vec[impl.size]) Coefficient();
+ }
+ }
+ else {
+ // Reallocation is required.
+ destroy();
+ init(row);
+ }
+ }
+ PPL_ASSERT(size() == row.size());
+ PPL_ASSERT(OK());
+
+ return *this;
+}
+
+void
+PPL::Dense_Row::normalize() {
+ Dense_Row& x = *this;
+ // Compute the GCD of all the coefficients.
+ const dimension_type sz = size();
+ dimension_type i = sz;
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ while (i > 0) {
+ Coefficient_traits::const_reference x_i = x[--i];
+ if (const int x_i_sign = sgn(x_i)) {
+ gcd = x_i;
+ if (x_i_sign < 0)
+ neg_assign(gcd);
+ goto compute_gcd;
+ }
+ }
+ // We reach this point only if all the coefficients were zero.
+ return;
+
+compute_gcd:
+ if (gcd == 1)
+ return;
+ while (i > 0) {
+ Coefficient_traits::const_reference x_i = x[--i];
+ if (x_i != 0) {
+ // Note: we use the ternary version instead of a more concise
+ // gcd_assign(gcd, x_i) to take advantage of the fact that
+ // `gcd' will decrease very rapidly (see D. Knuth, The Art of
+ // Computer Programming, second edition, Section 4.5.2,
+ // Algorithm C, and the discussion following it). Our
+ // implementation of gcd_assign(x, y, z) for checked numbers is
+ // optimized for the case where `z' is smaller than `y', so that
+ // on checked numbers we gain. On the other hand, for the
+ // implementation of gcd_assign(x, y, z) on GMP's unbounded
+ // integers we cannot make any assumption, so here we draw.
+ // Overall, we win.
+ gcd_assign(gcd, x_i, gcd);
+ if (gcd == 1)
+ return;
+ }
+ }
+ // Divide the coefficients by the GCD.
+ for (dimension_type j = sz; j-- > 0; ) {
+ Coefficient& x_j = x[j];
+ exact_div_assign(x_j, x_j, gcd);
+ }
+}
+
+void
+PPL::Dense_Row::reset(dimension_type first, dimension_type last) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= size());
+ for (dimension_type i = first; i < last; ++i)
+ (*this)[i] = 0;
+}
+
+void
+PPL::Dense_Row::linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ Dense_Row& x = *this;
+ PPL_ASSERT(x.size() == y.size());
+
+ x.linear_combine(y, coeff1, coeff2, 0, x.size());
+}
+
+void
+PPL::Dense_Row::linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2,
+ dimension_type start, dimension_type end) {
+ Dense_Row& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.size());
+ PPL_ASSERT(end <= y.size());
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+
+ // If coeff1 is 1 and/or coeff2 is 1 or -1, we use an optimized
+ // implementation.
+
+ if (coeff1 == 1) {
+ if (coeff2 == 1) {
+ // Optimized implementation for coeff1==1, coeff2==1.
+ for (dimension_type i = start; i < end; ++i)
+ if (y[i] != 0)
+ x[i] += y[i];
+ return;
+ }
+ if (coeff2 == -1) {
+ // Optimized implementation for coeff1==1, coeff2==-1.
+ for (dimension_type i = start; i < end; ++i)
+ if (y[i] != 0)
+ x[i] -= y[i];
+ return;
+ }
+ // Optimized implementation for coeff1==1.
+ for (dimension_type i = start; i < end; ++i) {
+ Coefficient& x_i = x[i];
+ // The test against 0 gives rise to a consistent speed up: see
+ // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/014000.html
+ Coefficient_traits::const_reference y_i = y[i];
+ if (y_i != 0)
+ add_mul_assign(x_i, y_i, coeff2);
+ }
+ return;
+ }
+
+ if (coeff2 == 1) {
+ // Optimized implementation for coeff2==1.
+ for (dimension_type i = start; i < end; ++i) {
+ x[i] *= coeff1;
+ if (y[i] != 0)
+ x[i] += y[i];
+ }
+ return;
+ }
+ if (coeff2 == -1) {
+ // Optimized implementation for coeff2==-1.
+ for (dimension_type i = start; i < end; ++i) {
+ x[i] *= coeff1;
+ if (y[i] != 0)
+ x[i] -= y[i];
+ }
+ return;
+ }
+ // General case.
+ for (dimension_type i = start; i < end; ++i) {
+ Coefficient& x_i = x[i];
+ x[i] *= coeff1;
+ // The test against 0 gives rise to a consistent speed up: see
+ // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/014000.html
+ Coefficient_traits::const_reference y_i = y[i];
+ if (y_i != 0)
+ add_mul_assign(x_i, y_i, coeff2);
+ }
+}
+
+void
+PPL::Dense_Row::ascii_dump(std::ostream& s) const {
+ const Dense_Row& x = *this;
+ const dimension_type x_size = x.size();
+ s << "size " << x_size << " ";
+ for (dimension_type i = 0; i < x_size; ++i)
+ s << x[i] << ' ';
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Dense_Row)
+
+bool
+PPL::Dense_Row::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "size")
+ return false;
+ dimension_type new_size;
+ if (!(s >> new_size))
+ return false;
+
+ resize(new_size);
+
+ for (dimension_type col = 0; col < new_size; ++col)
+ if (!(s >> (*this)[col]))
+ return false;
+
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Dense_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+ return external_memory_in_bytes();
+}
+
+PPL::memory_size_type
+PPL::Dense_Row::external_memory_in_bytes() const {
+ memory_size_type n = impl.capacity * sizeof(Coefficient);
+ for (dimension_type i = size(); i-- > 0; )
+ n += PPL::external_memory_in_bytes(impl.vec[i]);
+ return n;
+}
+
+bool
+PPL::Dense_Row::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ bool is_broken = false;
+
+ if (impl.capacity > max_size()) {
+#ifndef NDEBUG
+ cerr << "Dense_Row capacity exceeds the maximum allowed size:" << endl
+ << "is " << impl.capacity
+ << ", should be less than or equal to " << max_size() << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+
+ if (size() > max_size()) {
+#ifndef NDEBUG
+ cerr << "Dense_Row size exceeds the maximum allowed size:" << endl
+ << "is " << size()
+ << ", should be less than or equal to " << max_size() << "." << endl;
+#endif
+ is_broken = true;
+ }
+
+ if (impl.capacity < size()) {
+#ifndef NDEBUG
+ cerr << "Dense_Row is completely broken: capacity is " << impl.capacity
+ << ", size is " << size() << "." << endl;
+#endif
+ is_broken = true;
+ }
+
+ if (capacity() == 0) {
+ if (impl.vec != 0)
+ is_broken = true;
+ }
+ else {
+ if (impl.vec == 0)
+ is_broken = true;
+ }
+
+ return !is_broken;
+}
+
+bool
+PPL::Dense_Row::OK(const dimension_type row_size) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ bool is_broken = !OK();
+
+ // Check the declared size.
+ if (size() != row_size) {
+#ifndef NDEBUG
+ cerr << "Dense_Row size mismatch: is " << size()
+ << ", should be " << row_size << "." << endl;
+#endif
+ is_broken = true;
+ }
+ return !is_broken;
+}
+
+/*! \relates Parma_Polyhedra_Library::Dense_Row */
+bool
+PPL::operator==(const Dense_Row& x, const Dense_Row& y) {
+ const dimension_type x_size = x.size();
+ const dimension_type y_size = y.size();
+
+ if (x_size != y_size)
+ return false;
+
+ for (dimension_type i = x_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ return true;
+}
diff --git a/src/Dense_Row_defs.hh b/src/Dense_Row_defs.hh
new file mode 100644
index 0000000..429ca97
--- /dev/null
+++ b/src/Dense_Row_defs.hh
@@ -0,0 +1,561 @@
+/* Dense_Row class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_defs_hh
+#define PPL_Dense_Row_defs_hh 1
+
+#include "Dense_Row_types.hh"
+
+#include "globals_defs.hh"
+
+#include "Sparse_Row_types.hh"
+#include "Coefficient_defs.hh"
+#include <memory>
+#include <vector>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Dense_Row {
+public:
+ class iterator;
+ class const_iterator;
+
+ //! Constructs an empty row.
+ Dense_Row();
+
+ explicit Dense_Row(const Sparse_Row& row);
+
+ //! Tight constructor: resizing may require reallocation.
+ /*!
+ Constructs a row with size and capacity \p sz.
+ */
+ Dense_Row(dimension_type sz);
+
+ //! Sizing constructor with capacity.
+ /*!
+ \param sz
+ The size of the row that will be constructed;
+
+ \param capacity
+ The capacity of the row that will be constructed;
+
+ The row that is constructed has storage for \p capacity elements,
+ \p sz of which are default-constructed now.
+ */
+ Dense_Row(dimension_type sz, dimension_type capacity);
+
+ //! Ordinary copy constructor.
+ Dense_Row(const Dense_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Dense_Row(const Dense_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Dense_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity from a Sparse_Row.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Dense_Row();
+
+ //! Assignment operator.
+ Dense_Row& operator=(const Dense_Row& y);
+
+ //! Assignment operator.
+ Dense_Row& operator=(const Sparse_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Dense_Row& y);
+
+ //! Resizes the row to \p sz.
+ void resize(dimension_type sz);
+
+ //! Resizes the row to \p sz, with capacity \p capacity.
+ void resize(dimension_type sz, dimension_type capacity);
+
+ //! Resets all the elements of this row.
+ void clear();
+
+ //! Adds \p n zeroes before index \p i.
+ /*!
+ \param n
+ The number of zeroes that will be added to the row.
+
+ \param i
+ The index of the element before which the zeroes will be added.
+
+ Existing elements with index greater than or equal to \p i are shifted
+ to the right by \p n positions. The size is increased by \p n.
+
+ Existing iterators are invalidated.
+ */
+ void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+ //! Expands the row to size \p new_size.
+ /*!
+ Adds new positions to the implementation of the row
+ obtaining a new row with size \p new_size.
+ It is assumed that \p new_size is between the current size
+ and capacity of the row.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ Destroys elements of the row implementation
+ from position \p new_size to the end.
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Returns the size() of the largest possible Dense_Row.
+ static dimension_type max_size();
+
+ //! Gives the number of coefficients currently in use.
+ dimension_type size() const;
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the element of the row indexed by \p k.
+ Coefficient& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of the row indexed by \p k.
+ Coefficient_traits::const_reference operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of
+ the row and normalizes them by the GCD itself.
+ */
+ void normalize();
+
+ //! Swaps the i-th element with the j-th element.
+ //! Provided for compatibility with Sparse_Row
+ void swap_coefficients(dimension_type i, dimension_type j);
+
+ //! Swaps the element pointed to by i with the element pointed to by j.
+ //! Provided for compatibility with Sparse_Row
+ void swap_coefficients(iterator i, iterator j);
+
+ iterator begin();
+ const_iterator begin() const;
+
+ iterator end();
+ const_iterator end() const;
+
+ //! Resets the i-th element to 0.
+ //! Provided for compatibility with Sparse_Row
+ void reset(dimension_type i);
+
+ //! Resets the elements [first,last) to 0.
+ //! Provided for compatibility with Sparse_Row
+ void reset(dimension_type first, dimension_type last);
+
+ //! Resets the element pointed to by itr to 0.
+ //! Provided for compatibility with Sparse_Row.
+ iterator reset(iterator itr);
+
+ //! Gets the i-th element.
+ //! Provided for compatibility with Sparse_Row.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator find(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator find(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator find(iterator itr, dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator find(const_iterator itr, dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator lower_bound(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator lower_bound(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator lower_bound(iterator itr, dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(iterator itr, dimension_type i);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_second
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_first(const Dense_Row& y,
+ const Func1& f, const Func2& g);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, 0) must do nothing, for every c1.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_second(const Dense_Row& y,
+ const Func1& g, const Func2& h);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ */
+ template <typename Func1, typename Func2, typename Func3>
+ void combine(const Dense_Row& y,
+ const Func1& f, const Func2& g, const Func3& h);
+
+ //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+ //! each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param coeff1
+ The coefficient used for elements of *this.
+ It must not be 0.
+
+ \param coeff2
+ The coefficient used for elements of y.
+ It must not be 0.
+
+ This method takes \f$O(n)\f$ time.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ \see combine
+ */
+ void linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ /*!
+ This method detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+
+ coeff1 and coeff2 must not be 0.
+ */
+ void linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns the total size in bytes of the memory occupied by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ /*! \brief
+ Returns the size in bytes of the memory managed by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ /*! \brief
+ Checks if all the invariants are satisfied and that the actual
+ size matches the value provided as argument.
+ */
+ bool OK(dimension_type row_size) const;
+
+private:
+ void init(const Sparse_Row& row);
+
+ void destroy();
+
+ struct Impl {
+
+ Impl();
+
+ ~Impl();
+
+ //! The number of coefficients in the row.
+ dimension_type size;
+
+ //! The capacity of the row.
+ dimension_type capacity;
+
+ //! The allocator used to allocate/deallocate vec.
+ std::allocator<Coefficient> coeff_allocator;
+
+ //! The vector of coefficients.
+ //! An empty vector may be stored as NULL instead of using a valid pointer.
+ Coefficient* vec;
+ };
+
+ Impl impl;
+
+ //! Returns the capacity of the row.
+ dimension_type capacity() const;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::iterator {
+public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef value_type& reference;
+
+ iterator();
+ iterator(Dense_Row& row1, dimension_type i1);
+
+ Coefficient& operator*();
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+ equivalent to *itr.
+
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ iterator& operator++();
+ iterator operator++(int);
+
+ iterator& operator--();
+ iterator operator--(int);
+
+ bool operator==(const iterator& x) const;
+ bool operator!=(const iterator& x) const;
+
+ operator const_iterator() const;
+
+ bool OK() const;
+
+private:
+ Dense_Row* row;
+ dimension_type i;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::const_iterator {
+public:
+
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ const_iterator();
+ const_iterator(const Dense_Row& row1, dimension_type i1);
+
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+ equivalent to *itr.
+
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ const_iterator& operator++();
+ const_iterator operator++(int);
+
+ const_iterator& operator--();
+ const_iterator operator--(int);
+
+ bool operator==(const const_iterator& x) const;
+ bool operator!=(const const_iterator& x) const;
+
+ bool OK() const;
+
+private:
+ const Dense_Row* row;
+ dimension_type i;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Dense_Row& x, Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Dense_Row>::iterator x,
+ std::vector<Dense_Row>::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Dense_Row_inlines.hh"
+#include "Dense_Row_templates.hh"
+
+#endif // !defined(PPL_Dense_Row_defs_hh)
diff --git a/src/Dense_Row_inlines.hh b/src/Dense_Row_inlines.hh
new file mode 100644
index 0000000..10c98b8
--- /dev/null
+++ b/src/Dense_Row_inlines.hh
@@ -0,0 +1,531 @@
+/* Dense_Row class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_inlines_hh
+#define PPL_Dense_Row_inlines_hh 1
+
+#include "assert.hh"
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Dense_Row::Impl::Impl()
+ : size(0), capacity(0), coeff_allocator(), vec(0) {
+}
+
+inline
+Dense_Row::Impl::~Impl() {
+ while (size != 0) {
+ --size;
+ vec[size].~Coefficient();
+ }
+ coeff_allocator.deallocate(vec, capacity);
+}
+
+inline dimension_type
+Dense_Row::max_size() {
+ return std::numeric_limits<size_t>::max() / sizeof(Coefficient);
+}
+
+inline dimension_type
+Dense_Row::size() const {
+ return impl.size;
+}
+
+inline dimension_type
+Dense_Row::capacity() const {
+ return impl.capacity;
+}
+
+inline
+Dense_Row::Dense_Row()
+ : impl() {
+
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz,
+ const dimension_type capacity)
+ : impl() {
+
+ resize(sz, capacity);
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz)
+ : impl() {
+
+ resize(sz);
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y)
+ : impl() {
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ if (y.impl.vec != 0) {
+ impl.capacity = y.capacity();
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+ while (impl.size != y.size()) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ }
+ PPL_ASSERT(size() == y.size());
+ PPL_ASSERT(capacity() == y.capacity());
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+ const dimension_type capacity)
+ : impl() {
+ PPL_ASSERT(y.size() <= capacity);
+ PPL_ASSERT(capacity <= max_size());
+
+ impl.capacity = capacity;
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+ if (y.impl.vec != 0) {
+ while (impl.size != y.size()) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ }
+
+ PPL_ASSERT(size() == y.size());
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : impl() {
+ PPL_ASSERT(sz <= capacity);
+ PPL_ASSERT(capacity <= max_size());
+ PPL_ASSERT(capacity != 0);
+
+ impl.capacity = capacity;
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+ const dimension_type n = std::min(sz, y.size());
+ while (impl.size != n) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ while (impl.size != sz) {
+ new (&impl.vec[impl.size]) Coefficient();
+ ++impl.size;
+ }
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::~Dense_Row() {
+ // The `impl' field will be destroyed automatically.
+}
+
+inline void
+Dense_Row::destroy() {
+ resize(0);
+ impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+}
+
+inline void
+Dense_Row::m_swap(Dense_Row& y) {
+ using std::swap;
+ swap(impl.size, y.impl.size);
+ swap(impl.capacity, y.impl.capacity);
+ swap(impl.coeff_allocator, y.impl.coeff_allocator);
+ swap(impl.vec, y.impl.vec);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+inline Dense_Row&
+Dense_Row::operator=(const Dense_Row& y) {
+
+ if (this != &y && size() == y.size()) {
+ // Avoid reallocation.
+
+ for (dimension_type i = size(); i-- > 0; )
+ (*this)[i] = y[i];
+
+ return *this;
+ }
+
+ Dense_Row x(y);
+ swap(*this, x);
+
+ return *this;
+}
+
+inline Coefficient&
+Dense_Row::operator[](const dimension_type k) {
+ PPL_ASSERT(impl.vec != 0);
+ PPL_ASSERT(k < size());
+ return impl.vec[k];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::operator[](const dimension_type k) const {
+ PPL_ASSERT(impl.vec != 0);
+ PPL_ASSERT(k < size());
+ return impl.vec[k];
+}
+
+inline void
+Dense_Row::swap_coefficients(dimension_type i, dimension_type j) {
+ std::swap((*this)[i], (*this)[j]);
+}
+
+inline void
+Dense_Row::swap_coefficients(iterator i, iterator j) {
+ std::swap(*i, *j);
+}
+
+inline void
+Dense_Row::reset(dimension_type i) {
+ (*this)[i] = 0;
+}
+
+inline Dense_Row::iterator
+Dense_Row::reset(iterator itr) {
+ *itr = 0;
+ ++itr;
+ return itr;
+}
+
+inline Dense_Row::iterator
+Dense_Row::begin() {
+ return iterator(*this, 0);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::begin() const {
+ return const_iterator(*this, 0);
+}
+
+inline Dense_Row::iterator
+Dense_Row::end() {
+ return iterator(*this, size());
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::end() const {
+ return const_iterator(*this, size());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::get(dimension_type i) const {
+ return (*this)[i];
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(dimension_type i) {
+ return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(dimension_type i) const {
+ return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(iterator itr, dimension_type i) {
+ (void)itr;
+ return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(const_iterator itr, dimension_type i) const {
+ (void)itr;
+ return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(dimension_type i) {
+ return find(i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(dimension_type i) const {
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(iterator itr, dimension_type i) {
+ return find(itr, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(const_iterator itr, dimension_type i) const {
+ return find(itr, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i,
+ Coefficient_traits::const_reference x) {
+ (*this)[i] = x;
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i) {
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x) {
+ (void)itr;
+ (*this)[i] = x;
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i) {
+ (void)itr;
+ return find(i);
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+/*! \relates Dense_Row */
+inline bool
+operator!=(const Dense_Row& x, const Dense_Row& y) {
+ return !(x == y);
+}
+
+
+inline
+Dense_Row::iterator::iterator()
+ : row(NULL), i(0) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::iterator::iterator(Dense_Row& row1,dimension_type i1)
+ : row(&row1), i(i1) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient&
+Dense_Row::iterator::operator*() {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::iterator::operator*() const {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::iterator::index() const {
+ return i;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator++() {
+ PPL_ASSERT(i < row->size());
+ ++i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator++(int) {
+ iterator tmp(*this);
+ ++(*this);
+ return tmp;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator--() {
+ PPL_ASSERT(i > 0);
+ --i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator--(int) {
+ iterator tmp(*this);
+ --(*this);
+ return tmp;
+}
+
+inline bool
+Dense_Row::iterator::operator==(const iterator& x) const {
+ return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::iterator::operator!=(const iterator& x) const {
+ return !(*this == x);
+}
+
+inline
+Dense_Row::iterator::operator const_iterator() const {
+ return const_iterator(*row, i);
+}
+
+inline bool
+Dense_Row::iterator::OK() const {
+ if (row == NULL)
+ return true;
+ // i can be equal to row.size() for past-the-end iterators
+ return (i <= row->size());
+}
+
+
+inline
+Dense_Row::const_iterator::const_iterator()
+ : row(NULL), i(0) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::const_iterator::const_iterator(const Dense_Row& row1,
+ dimension_type i1)
+ : row(&row1), i(i1) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::const_iterator::operator*() const {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::const_iterator::index() const {
+ return i;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator++() {
+ PPL_ASSERT(i < row->size());
+ ++i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator++(int) {
+ const_iterator tmp(*this);
+ ++(*this);
+ return tmp;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator--() {
+ PPL_ASSERT(i > 0);
+ --i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator--(int) {
+ const_iterator tmp(*this);
+ --(*this);
+ return tmp;
+}
+
+inline bool
+Dense_Row::const_iterator::operator==(const const_iterator& x) const {
+ return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::const_iterator::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+inline bool
+Dense_Row::const_iterator::OK() const {
+ if (row == NULL)
+ return true;
+ // i can be equal to row.size() for past-the-end iterators
+ return (i <= row->size());
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ x.linear_combine(y, coeff1, coeff2);
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ x.linear_combine(y, c1, c2, start, end);
+}
+
+/*! \relates Dense_Row */
+inline void
+swap(Dense_Row& x, Dense_Row& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Dense_Row */
+inline void
+iter_swap(std::vector<Dense_Row>::iterator x,
+ std::vector<Dense_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_inlines_hh)
diff --git a/src/Dense_Row_templates.hh b/src/Dense_Row_templates.hh
new file mode 100644
index 0000000..6108256
--- /dev/null
+++ b/src/Dense_Row_templates.hh
@@ -0,0 +1,56 @@
+/* Dense_Row class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_templates_hh
+#define PPL_Dense_Row_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_first(const Dense_Row& y, const Func1& /* f */,
+ const Func2& g) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_second(const Dense_Row& y, const Func1& g,
+ const Func2& /* h */) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Dense_Row::combine(const Dense_Row& y, const Func1& /* f */, const Func2& g,
+ const Func3& /* h */) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_templates_hh)
diff --git a/src/Dense_Row_types.hh b/src/Dense_Row_types.hh
new file mode 100644
index 0000000..e4a31d5
--- /dev/null
+++ b/src/Dense_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Dense_Row_types_hh
+#define PPL_Dense_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Dense_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_types_hh)
diff --git a/src/Determinate_defs.hh b/src/Determinate_defs.hh
new file mode 100644
index 0000000..1db6792
--- /dev/null
+++ b/src/Determinate_defs.hh
@@ -0,0 +1,331 @@
+/* Determinate class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Determinate_defs_hh
+#define PPL_Determinate_defs_hh
+
+#include "Determinate_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Variable_defs.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Determinate */
+template <typename PSET>
+void swap(Determinate<PSET>& x, Determinate<PSET>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+ COW-wrapped pointset.
+
+ \relates Determinate
+*/
+template <typename PSET>
+bool operator==(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different
+ COW-wrapped pointsets.
+
+ \relates Determinate
+*/
+template <typename PSET>
+bool operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PSET>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \brief
+ A wrapper for PPL pointsets, providing them with a
+ <EM>determinate constraint system</EM> interface, as defined
+ in \ref Bag98 "[Bag98]".
+
+ The implementation uses a copy-on-write optimization, making the
+ class suitable for constructions, like the <EM>finite powerset</EM>
+ and <EM>ask-and-tell</EM> of \ref Bag98 "[Bag98]", that are likely
+ to perform many copies.
+
+ \ingroup PPL_CXX_interface
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Determinate {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset \p pset.
+ */
+ Determinate(const PSET& pset);
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset
+ defined by \p cs.
+ */
+ Determinate(const Constraint_System& cs);
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset
+ defined by \p cgs.
+ */
+ Determinate(const Congruence_System& cgs);
+
+ //! Copy constructor.
+ Determinate(const Determinate& y);
+
+ //! Destructor.
+ ~Determinate();
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Domain Element
+ //@{
+
+ //! Returns a const reference to the embedded pointset.
+ const PSET& pointset() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this embeds the universe
+ element \p PSET.
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this embeds the empty
+ element of \p PSET.
+ */
+ bool is_bottom() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+ bool definitely_entails(const Determinate& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are definitely equivalent.
+ */
+ bool is_definitely_equivalent_to(const Determinate& y) const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*!
+ Returns <CODE>true</CODE> if and only if this domain
+ has a nontrivial weakening operator.
+ */
+ static bool has_nontrivial_weakening();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Domain Element
+
+
+ //! \name Member Functions that May Modify the Domain Element
+ //@{
+
+ //! Assigns to \p *this the upper bound of \p *this and \p y.
+ void upper_bound_assign(const Determinate& y);
+
+ //! Assigns to \p *this the meet of \p *this and \p y.
+ void meet_assign(const Determinate& y);
+
+ //! Assigns to \p *this the result of weakening \p *this with \p y.
+ void weakening_assign(const Determinate& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+ */
+ void concatenate_assign(const Determinate& y);
+
+ //! Returns a reference to the embedded element.
+ PSET& pointset();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ On return from this method, the representation of \p *this
+ is not shared by different Determinate objects.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ void mutate();
+
+ //! Assignment operator.
+ Determinate& operator=(const Determinate& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Determinate& y);
+
+ //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A function adapter for the Determinate class.
+ /*! \ingroup PPL_CXX_interface
+ It lifts a Binary_Operator_Assign function object, taking arguments
+ of type PSET, producing the corresponding function object taking
+ arguments of type Determinate<PSET>.
+
+ The template parameter Binary_Operator_Assign is supposed to
+ implement an <EM>apply and assign</EM> function, i.e., a function
+ having signature <CODE>void foo(PSET& x, const PSET& y)</CODE> that
+ applies an operator to \c x and \c y and assigns the result to \c x.
+ For instance, such a function object is obtained by
+ <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ template <typename Binary_Operator_Assign>
+ class Binary_Operator_Assign_Lifter {
+ public:
+ //! Explicit unary constructor.
+ explicit
+ Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+ //! Function-application operator.
+ void operator()(Determinate& x, const Determinate& y) const;
+
+ private:
+ //! The function object to be lifted.
+ Binary_Operator_Assign op_assign_;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Helper function returning a Binary_Operator_Assign_Lifter object,
+ also allowing for the deduction of template arguments.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ template <typename Binary_Operator_Assign>
+ static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+ lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+ //! The possibly shared representation of a Determinate object.
+ /*! \ingroup PPL_CXX_interface
+ By adopting the <EM>copy-on-write</EM> technique, a single
+ representation of the base-level object may be shared by more than
+ one object of the class Determinate.
+ */
+ class Rep {
+ private:
+ /*! \brief
+ Count the number of references:
+ - 0: leaked, \p pset is non-const;
+ - 1: one reference, \p pset is non-const;
+ - > 1: more than one reference, \p pset is const.
+ */
+ mutable unsigned long references;
+
+ //! Private and unimplemented: assignment not allowed.
+ Rep& operator=(const Rep& y);
+
+ //! Private and unimplemented: copies not allowed.
+ Rep(const Rep& y);
+
+ //! Private and unimplemented: default construction not allowed.
+ Rep();
+
+ public:
+ //! The possibly shared, embedded pointset.
+ PSET pset;
+
+ /*! \brief
+ Builds a new representation by creating a pointset
+ of the specified kind, in the specified vector space.
+ */
+ Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a new representation by copying the pointset \p p.
+ Rep(const PSET& p);
+
+ //! Builds a new representation by copying the constraints in \p cs.
+ Rep(const Constraint_System& cs);
+
+ //! Builds a new representation by copying the constraints in \p cgs.
+ Rep(const Congruence_System& cgs);
+
+ //! Destructor.
+ ~Rep();
+
+ //! Registers a new reference.
+ void new_reference() const;
+
+ /*! \brief
+ Unregisters one reference; returns <CODE>true</CODE> if and only if
+ the representation has become unreferenced.
+ */
+ bool del_reference() const;
+
+ //! True if and only if this representation is currently shared.
+ bool is_shared() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+ };
+
+ /*! \brief
+ A pointer to the possibly shared representation of
+ the base-level domain element.
+ */
+ Rep* prep;
+
+ friend bool
+ operator==<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+ friend bool
+ operator!=<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+};
+
+#include "Determinate_inlines.hh"
+
+#endif // !defined(PPL_Determinate_defs_hh)
diff --git a/src/Determinate_inlines.hh b/src/Determinate_inlines.hh
new file mode 100644
index 0000000..43cdacb
--- /dev/null
+++ b/src/Determinate_inlines.hh
@@ -0,0 +1,305 @@
+/* Determinate class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Determinate_inlines_hh
+#define PPL_Determinate_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : references(0), pset(num_dimensions, kind) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const PSET& p)
+ : references(0), pset(p) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Constraint_System& cs)
+ : references(0), pset(cs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Congruence_System& cgs)
+ : references(0), pset(cgs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::~Rep() {
+ PPL_ASSERT(references == 0);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::Rep::new_reference() const {
+ ++references;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::del_reference() const {
+ return --references == 0;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::is_shared() const {
+ return references > 1;
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::external_memory_in_bytes() const {
+ return pset.external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const PSET& pset)
+ : prep(new Rep(pset)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Constraint_System& cs)
+ : prep(new Rep(cs)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Congruence_System& cgs)
+ : prep(new Rep(cgs)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Determinate& y)
+ : prep(y.prep) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::~Determinate() {
+ if (prep->del_reference())
+ delete prep;
+}
+
+template <typename PSET>
+inline Determinate<PSET>&
+Determinate<PSET>::operator=(const Determinate& y) {
+ y.prep->new_reference();
+ if (prep->del_reference())
+ delete prep;
+ prep = y.prep;
+ return *this;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::m_swap(Determinate& y) {
+ using std::swap;
+ swap(prep, y.prep);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::mutate() {
+ if (prep->is_shared()) {
+ Rep* const new_prep = new Rep(prep->pset);
+ (void) prep->del_reference();
+ new_prep->new_reference();
+ prep = new_prep;
+ }
+}
+
+template <typename PSET>
+inline const PSET&
+Determinate<PSET>::pointset() const {
+ return prep->pset;
+}
+
+template <typename PSET>
+inline PSET&
+Determinate<PSET>::pointset() {
+ mutate();
+ return prep->pset;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::upper_bound_assign(const Determinate& y) {
+ pointset().upper_bound_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::meet_assign(const Determinate& y) {
+ pointset().intersection_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::has_nontrivial_weakening() {
+ // FIXME: the following should be turned into a query to PSET. This
+ // can be postponed until the time the ask-and-tell construction is
+ // revived.
+ return false;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::weakening_assign(const Determinate& y) {
+ // FIXME: the following should be turned into a proper
+ // implementation. This can be postponed until the time the
+ // ask-and-tell construction is revived.
+ pointset().difference_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::concatenate_assign(const Determinate& y) {
+ pointset().concatenate_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::definitely_entails(const Determinate& y) const {
+ return prep == y.prep || y.prep->pset.contains(prep->pset);
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_definitely_equivalent_to(const Determinate& y) const {
+ return prep == y.prep || prep->pset == y.prep->pset;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_top() const {
+ return prep->pset.is_universe();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_bottom() const {
+ return prep->pset.is_empty();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::external_memory_in_bytes() const {
+ return prep->total_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::OK() const {
+ return prep->pset.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PSET>& x) {
+ s << x.pointset();
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator==(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+ return x.prep == y.prep || x.prep->pset == y.prep->pset;
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+ return x.prep != y.prep && x.prep->pset != y.prep->pset;
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+ : op_assign_(op_assign) {
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+ op_assign_(x.pointset(), y.pointset());
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PSET>::lift_op_assign(Binary_Operator_Assign op_assign) {
+ return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline void
+swap(Determinate<PSET>& x, Determinate<PSET>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_inlines_hh)
diff --git a/src/Determinate_types.hh b/src/Determinate_types.hh
new file mode 100644
index 0000000..2c79f6f
--- /dev/null
+++ b/src/Determinate_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Determinate_types_hh
+#define PPL_Determinate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_types_hh)
diff --git a/src/Difference_Floating_Point_Expression_defs.hh b/src/Difference_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..c2e6ef8
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_defs.hh
@@ -0,0 +1,221 @@
+/* Declarations for the Difference_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_defs_hh
+#define PPL_Difference_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Difference_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Difference Floating Point Expression.
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of difference floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+ operators on linear form such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \adifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ on \f$\cV\f$ as follows:
+ \f[
+ \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the difference floating point
+ expression corresponding to \p x \f$\ominus\f$ \p y.
+ */
+ Difference_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Difference_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Difference_Floating_Point_Expression(
+ const Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited asssignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Difference_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Difference_Floating_Point_Expression_inlines.hh"
+#include "Difference_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_defs_hh)
diff --git a/src/Difference_Floating_Point_Expression_inlines.hh b/src/Difference_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..ac7daf2
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,70 @@
+/* Difference_Floating_Point_Expression class implementation: inline
+ functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_inlines_hh
+#define PPL_Difference_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Difference_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y){
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Difference_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_inlines_hh)
diff --git a/src/Difference_Floating_Point_Expression_templates.hh b/src/Difference_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..9923c5a
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_templates.hh
@@ -0,0 +1,53 @@
+/* Difference_Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_templates_hh
+#define PPL_Difference_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ result -= linearized_second_operand;
+ relative_error(linearized_second_operand, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_templates_hh)
diff --git a/src/Difference_Floating_Point_Expression_types.hh b/src/Difference_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..2a435e7
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Difference_Floating_Point_Expression_types_hh
+#define PPL_Difference_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_types_hh)
diff --git a/src/Division_Floating_Point_Expression_defs.hh b/src/Division_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..ed9751b
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_defs.hh
@@ -0,0 +1,237 @@
+/* Declarations for the Division_Floating_Point_Expression class and its
+ constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_defs_hh
+#define PPL_Division_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Division_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Division Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearizationd of division floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+ operator on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adivlf
+ i'
+ =
+ \left(i \adivifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+ \f]
+ Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$,
+ we construct the interval linear form
+ \f$
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ \f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adivlf
+ [a, b]\right)
+ \aslf
+ \left(\varepsilon_{\mathbf{f}}\left(
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \adivlf
+ [a, b]\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1],
+ \f]
+ given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1} \oslash \iota\left(
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+ method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+ and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the division floating point
+ expression corresponding to \p num \f$\oslash\f$ \p den.
+ */
+ Division_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den);
+
+ //! Destructor.
+ ~Division_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Copy constructor: temporary inhibited.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Division_Floating_Point_Expression(
+ const Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Assignment operator: temporary inhibited.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+}; // class Division_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Division_Floating_Point_Expression_inlines.hh"
+#include "Division_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_defs_hh)
diff --git a/src/Division_Floating_Point_Expression_inlines.hh b/src/Division_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..c6ed4df
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,69 @@
+/* Division_Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_inlines_hh
+#define PPL_Division_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Division_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den)
+ : first_operand(num), second_operand(den) {
+ assert(num != 0);
+ assert(den != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Division_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_inlines_hh)
diff --git a/src/Division_Floating_Point_Expression_templates.hh b/src/Division_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..3feb26a
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_templates.hh
@@ -0,0 +1,61 @@
+/* Division_Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_templates_hh
+#define PPL_Division_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ this->intervalize(linearized_second_operand, int_store,
+ intervalized_second_operand);
+
+ // Check if we may divide by zero.
+ if (intervalized_second_operand.lower() <= 0
+ && intervalized_second_operand.upper() >= 0)
+ return false;
+
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result /= intervalized_second_operand;
+ rel_error /= intervalized_second_operand;
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_templates_hh)
diff --git a/src/Division_Floating_Point_Expression_types.hh b/src/Division_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..bfd2010
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Division_Floating_Point_Expression_types_hh
+#define PPL_Division_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_types_hh)
diff --git a/src/Doubly_Linked_Object_defs.hh b/src/Doubly_Linked_Object_defs.hh
new file mode 100644
index 0000000..bb6b4f2
--- /dev/null
+++ b/src/Doubly_Linked_Object_defs.hh
@@ -0,0 +1,65 @@
+/* Doubly_Linked_Object class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Doubly_Linked_Object_defs_hh
+#define PPL_Doubly_Linked_Object_defs_hh 1
+
+#include "Doubly_Linked_Object_types.hh"
+#include "EList_types.hh"
+#include "EList_Iterator_types.hh"
+
+//! A (base) class for doubly linked objects.
+class Parma_Polyhedra_Library::Implementation::Doubly_Linked_Object {
+public:
+ //! Default constructor.
+ Doubly_Linked_Object();
+
+ //! Creates a chain element with forward link \p f and backward link \p b.
+ Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+ //! Inserts \p y before \p *this.
+ void insert_before(Doubly_Linked_Object& y);
+
+ //! Inserts \p y after \p *this.
+ void insert_after(Doubly_Linked_Object& y);
+
+ //! Erases \p *this from the chain and returns a pointer to the next element.
+ Doubly_Linked_Object* erase();
+
+ //! Erases \p *this from the chain.
+ ~Doubly_Linked_Object();
+
+private:
+ //! Forward link.
+ Doubly_Linked_Object* next;
+
+ //! Backward link.
+ Doubly_Linked_Object* prev;
+
+ template <typename T> friend class EList;
+ template <typename T> friend class EList_Iterator;
+};
+
+#include "Doubly_Linked_Object_inlines.hh"
+
+#endif // !defined(PPL_Doubly_Linked_Object_defs_hh)
diff --git a/src/Doubly_Linked_Object_inlines.hh b/src/Doubly_Linked_Object_inlines.hh
new file mode 100644
index 0000000..147c6e3
--- /dev/null
+++ b/src/Doubly_Linked_Object_inlines.hh
@@ -0,0 +1,74 @@
+/* Doubly_Linked_Object class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Doubly_Linked_Object_inlines_hh
+#define PPL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+ Doubly_Linked_Object* b)
+ : next(f),
+ prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+ y.next = this;
+ y.prev = prev;
+ prev->next = &y;
+ prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+ y.next = next;
+ y.prev = this;
+ next->prev = &y;
+ next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+ next->prev = prev;
+ prev->next = next;
+ return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+ erase();
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Doubly_Linked_Object_inlines_hh)
diff --git a/src/Doubly_Linked_Object_types.hh b/src/Doubly_Linked_Object_types.hh
new file mode 100644
index 0000000..2e3cac1
--- /dev/null
+++ b/src/Doubly_Linked_Object_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Doubly_Linked_Object_types_hh
+#define PPL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+class Doubly_Linked_Object;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Doubly_Linked_Object_types_hh)
diff --git a/src/EList_Iterator_defs.hh b/src/EList_Iterator_defs.hh
new file mode 100644
index 0000000..0cabaa5
--- /dev/null
+++ b/src/EList_Iterator_defs.hh
@@ -0,0 +1,88 @@
+/* EList_Iterator class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_Iterator_defs_hh
+#define PPL_EList_Iterator_defs_hh 1
+
+#include "EList_Iterator_types.hh"
+#include "Doubly_Linked_Object_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList_Iterator {
+public:
+ //! Constructs an iterator pointing to nothing.
+ EList_Iterator();
+
+ //! Constructs an iterator pointing to \p p.
+ explicit EList_Iterator(Doubly_Linked_Object* p);
+
+ //! Changes \p *this so that it points to \p p.
+ EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+ //! Indirect member selector.
+ T* operator->();
+
+ //! Dereference operator.
+ T& operator*();
+
+ //! Preincrement operator.
+ EList_Iterator& operator++();
+
+ //! Postincrement operator.
+ EList_Iterator operator++(int);
+
+ //! Predecrement operator.
+ EList_Iterator& operator--();
+
+ //! Postdecrement operator.
+ EList_Iterator operator--(int);
+
+private:
+ //! Embedded pointer.
+ Doubly_Linked_Object* ptr;
+
+ friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+ friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+#include "EList_Iterator_inlines.hh"
+
+#endif // !defined(PPL_EList_Iterator_defs_hh)
diff --git a/src/EList_Iterator_inlines.hh b/src/EList_Iterator_inlines.hh
new file mode 100644
index 0000000..1d5e96c
--- /dev/null
+++ b/src/EList_Iterator_inlines.hh
@@ -0,0 +1,109 @@
+/* EList_Iterator class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_Iterator_inlines_hh
+#define PPL_EList_Iterator_inlines_hh 1
+
+#include "Doubly_Linked_Object_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+ : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+ ptr = p;
+ return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+ return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+ return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+ ptr = ptr->next;
+ return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+ EList_Iterator tmp = *this;
+ ++*this;
+ return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+ ptr = ptr->prev;
+ return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+ EList_Iterator tmp = *this;
+ --*this;
+ return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+ return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+ return x.ptr != y.ptr;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_Iterator_inlines_hh)
diff --git a/src/EList_Iterator_types.hh b/src/EList_Iterator_types.hh
new file mode 100644
index 0000000..584f9fa
--- /dev/null
+++ b/src/EList_Iterator_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_EList_Iterator_types_hh
+#define PPL_EList_Iterator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_Iterator_types_hh)
diff --git a/src/EList_defs.hh b/src/EList_defs.hh
new file mode 100644
index 0000000..3d3fa96
--- /dev/null
+++ b/src/EList_defs.hh
@@ -0,0 +1,90 @@
+/* EList class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_defs_hh
+#define PPL_EList_defs_hh 1
+
+#include "EList_types.hh"
+#include "Doubly_Linked_Object_defs.hh"
+#include "EList_Iterator_defs.hh"
+
+/*! \brief
+ A simple kind of embedded list (i.e., a doubly linked objects
+ where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList
+ : private Doubly_Linked_Object {
+public:
+ //! A const iterator to traverse the list.
+ typedef EList_Iterator<const T> const_iterator;
+
+ //! A non-const iterator to traverse the list.
+ typedef EList_Iterator<T> iterator;
+
+ //! Constructs an empty list.
+ EList();
+
+ //! Destructs the list and all the elements in it.
+ ~EList();
+
+ //! Pushes \p obj to the front of the list.
+ void push_front(T& obj);
+
+ //! Pushes \p obj to the back of the list.
+ void push_back(T& obj);
+
+ /*! \brief
+ Inserts \p obj just before \p position and returns an iterator
+ that points to the inserted object.
+ */
+ iterator insert(iterator position, T& obj);
+
+ /*! \brief
+ Removes the element pointed to by \p position, returning
+ an iterator pointing to the next element, if any, or end(), otherwise.
+ */
+ iterator erase(iterator position);
+
+ //! Returns <CODE>true</CODE> if and only if the list is empty.
+ bool empty() const;
+
+ //! Returns an iterator pointing to the beginning of the list.
+ iterator begin();
+
+ //! Returns an iterator pointing one past the last element in the list.
+ iterator end();
+
+ //! Returns a const iterator pointing to the beginning of the list.
+ const_iterator begin() const;
+
+ //! Returns a const iterator pointing one past the last element in the list.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#include "EList_inlines.hh"
+
+#endif // !defined(PPL_EList_defs_hh)
diff --git a/src/EList_inlines.hh b/src/EList_inlines.hh
new file mode 100644
index 0000000..010c2a3
--- /dev/null
+++ b/src/EList_inlines.hh
@@ -0,0 +1,119 @@
+/* EList class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_inlines_hh
+#define PPL_EList_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList<T>::EList()
+ : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+ next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+ prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::insert(iterator position, T& obj) {
+ position->insert_before(obj);
+ return iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::begin() {
+ return iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::end() {
+ return iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::begin() const {
+ return const_iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::end() const {
+ return const_iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+ return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::erase(iterator position) {
+ assert(!empty());
+ return iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+ // Erase and deallocate all the elements.
+ for (iterator i = begin(), lend = end(), next; i != lend; i = next) {
+ next = erase(i);
+ delete &*i;
+ }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+ for (const_iterator i = begin(), lend = end(); i != lend; ++i)
+ if (!i->OK())
+ return false;
+
+ return true;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_inlines_hh)
diff --git a/src/EList_types.hh b/src/EList_types.hh
new file mode 100644
index 0000000..4793ecc
--- /dev/null
+++ b/src/EList_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_EList_types_hh
+#define PPL_EList_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_types_hh)
diff --git a/src/Expression_Adapter_defs.hh b/src/Expression_Adapter_defs.hh
new file mode 100644
index 0000000..f06e1ea
--- /dev/null
+++ b/src/Expression_Adapter_defs.hh
@@ -0,0 +1,216 @@
+/* Expression_Adapter class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Adapter_defs_hh
+#define PPL_Expression_Adapter_defs_hh 1
+
+#include "Expression_Adapter_types.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Adapters' base type (for template meta-programming).
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Expression_Adapter_Base {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression objects.
+/*!
+ The adapters are meant to provide read-only, customized access to the
+ Linear_Expression members in Constraint, Generator, Congruence and
+ Grid_Generator objects. They typically implement the user-level view
+ of these expressions.
+
+ \note
+ A few methods implement low-level access routines and will take
+ bare indexes as arguments (rather than Variable objects):
+ when such a bare index \c i is zero, the inhomogeneous term is meant;
+ when the bare index \c i is greater than zero, the coefficient of the
+ variable having id <CODE>i - 1</CODE> is meant.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter
+ : public Expression_Adapter_Base {
+public:
+ //! The type of this object.
+ typedef Expression_Adapter<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename T::const_reference inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename T::raw_type raw_type;
+
+ //! Returns an adapter after one-level unwrapping.
+ inner_type inner() const;
+
+ //! The type of const iterators on coefficients.
+ typedef typename raw_type::const_iterator const_iterator;
+
+ //! Returns the current representation of \p *this.
+ Representation representation() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient.
+ const_iterator begin() const;
+
+ //! Iterator pointing after the last nonzero variable coefficient.
+ const_iterator end() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient
+ //! of a variable bigger than or equal to \p v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are zero.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns the \p i -th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of variable \p v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ //! Returns the number of zero coefficient in [start, end).
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end).
+ Returns zero if all the coefficients in the range are zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last),
+ //! or \p last if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there
+ //! are no nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns \c true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both \p *this and \p y.
+ template <typename Expression>
+ bool have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const;
+
+protected:
+ //! Constructor.
+ explicit Expression_Adapter(const raw_type& expr);
+ //! The raw, completely unwrapped object subject to adaptation.
+ const raw_type& raw_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A transparent adapter for Linear_Expression objects.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter_Transparent
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Adapter_Transparent<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Constructor.
+ explicit Expression_Adapter_Transparent(const raw_type& expr);
+};
+
+#include "Expression_Adapter_inlines.hh"
+
+#endif // !defined(PPL_Expression_Adapter_defs_hh)
diff --git a/src/Expression_Adapter_inlines.hh b/src/Expression_Adapter_inlines.hh
new file mode 100644
index 0000000..c45f5e8
--- /dev/null
+++ b/src/Expression_Adapter_inlines.hh
@@ -0,0 +1,229 @@
+/* Expression_Adapter class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Adapter_inlines_hh
+#define PPL_Expression_Adapter_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Adapter<T>::Expression_Adapter(const raw_type& expr)
+ : raw_(expr) {
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::inner_type
+Expression_Adapter<T>::inner() const {
+ return inner_type(raw_);
+}
+
+template <typename T>
+inline Representation
+Expression_Adapter<T>::representation() const {
+ return inner().representation();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::begin() const {
+ return inner().begin();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::end() const {
+ return inner().end();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::lower_bound(Variable v) const {
+ return inner().lower_bound(v);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::space_dimension() const {
+ return inner().space_dimension();
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::coefficient(Variable v) const {
+ return inner().coefficient(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::inhomogeneous_term() const {
+ return inner().inhomogeneous_term();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::is_zero() const {
+ return inner().is_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_homogeneous_terms_are_zero() const {
+ return inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>::is_equal_to(const Expression& y) const {
+ return inner().is_equal_to(y);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes(const Variables_Set& vars) const {
+ return inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(dimension_type i) const {
+ return inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(Variable v) const {
+ return inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ return inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ return inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Adapter<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ return inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero() const {
+ return inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ return inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ return inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ return inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ return inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ return inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Dense_Row& row) const {
+ inner().get_row(row);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Sparse_Row& row) const {
+ inner().get_row(row);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const {
+ return inner().have_a_common_variable(y, first, last);
+}
+
+template <typename T>
+inline
+Expression_Adapter_Transparent<T>
+::Expression_Adapter_Transparent(const raw_type& expr)
+ : base_type(expr) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Adapter_inlines_hh)
diff --git a/src/Expression_Adapter_types.hh b/src/Expression_Adapter_types.hh
new file mode 100644
index 0000000..856d260
--- /dev/null
+++ b/src/Expression_Adapter_types.hh
@@ -0,0 +1,28 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Adapter_types_hh
+#define PPL_Expression_Adapter_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Expression_Adapter_Base;
+
+template <typename T>
+class Expression_Adapter;
+
+template <typename T>
+class Expression_Adapter_Transparent;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Adapter_types_hh)
diff --git a/src/Expression_Hide_Inhomo_defs.hh b/src/Expression_Hide_Inhomo_defs.hh
new file mode 100644
index 0000000..877c8e1
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_defs.hh
@@ -0,0 +1,147 @@
+/* Expression_Hide_Inhomo class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Inhomo_defs_hh
+#define PPL_Expression_Hide_Inhomo_defs_hh 1
+
+#include "Expression_Hide_Inhomo_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ An adapter for Linear_Expression that hides the inhomogeneous term.
+
+ The methods of this class always pretend that the value of the
+ inhomogeneous term is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Inhomo
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Hide_Inhomo<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! Constructor.
+ explicit Expression_Hide_Inhomo(const raw_type& expr);
+
+public:
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Returns the constant zero.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ //! Returns the i-th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are zero, returns zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there
+ //! are no nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+};
+
+#include "Expression_Hide_Inhomo_inlines.hh"
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_defs_hh)
diff --git a/src/Expression_Hide_Inhomo_inlines.hh b/src/Expression_Hide_Inhomo_inlines.hh
new file mode 100644
index 0000000..e3a6919
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_inlines.hh
@@ -0,0 +1,218 @@
+/* Expression_Hide_Inhomo class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Inhomo_inlines_hh
+#define PPL_Expression_Hide_Inhomo_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Expression_Hide_Inhomo<T>::Expression_Hide_Inhomo(const raw_type& expr)
+ : base_type(expr) {
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::inhomogeneous_term() const {
+ // Pretend it is zero.
+ return Coefficient_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::is_zero() const {
+ // Don't check the inhomogeneous_term (i.e., pretend it is zero).
+ return this->inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y) const {
+ const dimension_type x_dim = this->space_dimension();
+ const dimension_type y_dim = y.space_dimension();
+ if (x_dim != y_dim)
+ return false;
+ if (y.inhomogeneous_term() != 0)
+ return false;
+ // Note that the inhomogeneous term is not compared.
+ return this->inner().is_equal_to(y, 1, x_dim + 1);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(dimension_type i) const {
+ if (i == 0)
+ return Coefficient_zero();
+ else
+ return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(Variable v) const {
+ return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes(const Variables_Set& vars) const {
+ return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return 0;
+ dimension_type nz = 0;
+ if (start == 0) {
+ ++start;
+ ++nz;
+ }
+ nz += this->inner().num_zeroes(start, end);
+ return nz;
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Inhomo<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return Coefficient_zero();
+ if (start == 0)
+ ++start;
+ return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero() const {
+ return this->inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ if (first == last)
+ return last;
+ if (first == 0)
+ ++first;
+ return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ if (first == last)
+ return last;
+ if (first == 0)
+ ++first;
+ return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& y) const {
+ bool had_0 = (y.count(0) == 1);
+ this->inner().has_a_free_dimension_helper(y);
+ if (had_0)
+ y.insert(0);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Dense_Row& row) const {
+ this->inner().get_row(row);
+ row.reset(0);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Sparse_Row& row) const {
+ this->inner().get_row(row);
+ row.reset(0);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_inlines_hh)
diff --git a/src/Expression_Hide_Inhomo_types.hh b/src/Expression_Hide_Inhomo_types.hh
new file mode 100644
index 0000000..b9174ea
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Hide_Inhomo_types_hh
+#define PPL_Expression_Hide_Inhomo_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Inhomo;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_types_hh)
diff --git a/src/Expression_Hide_Last_defs.hh b/src/Expression_Hide_Last_defs.hh
new file mode 100644
index 0000000..7da0a9f
--- /dev/null
+++ b/src/Expression_Hide_Last_defs.hh
@@ -0,0 +1,165 @@
+/* Expression_Hide_Last class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Last_defs_hh
+#define PPL_Expression_Hide_Last_defs_hh 1
+
+#include "Expression_Hide_Last_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression that maybe hides the last coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Last
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Hide_Last<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Constructor.
+ explicit Expression_Hide_Last(const raw_type& expr, bool hide_last);
+
+ //! Iterator pointing after the last nonzero variable coefficient.
+ const_iterator end() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient
+ //! of a variable bigger than or equal to \p v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are zero.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns the \p i -th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of variable \p v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ //! Returns the number of zero coefficient in [start, end).
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end).
+ Returns zero if all the coefficients in the range are zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last),
+ //! or \p last if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns \c true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both \p *this and \p y.
+ template <typename Expression>
+ bool have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const;
+
+private:
+ //! Whether or not the last coefficient is hidden.
+ const bool hide_last_;
+};
+
+#include "Expression_Hide_Last_inlines.hh"
+
+#endif // !defined(PPL_Expression_Hide_Last_defs_hh)
diff --git a/src/Expression_Hide_Last_inlines.hh b/src/Expression_Hide_Last_inlines.hh
new file mode 100644
index 0000000..db169fc
--- /dev/null
+++ b/src/Expression_Hide_Last_inlines.hh
@@ -0,0 +1,241 @@
+/* Expression_Hide_Last class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Last_inlines_hh
+#define PPL_Expression_Hide_Last_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Hide_Last<T>::Expression_Hide_Last(const raw_type& expr,
+ const bool hide_last)
+ : base_type(expr), hide_last_(hide_last) {
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::space_dimension() const {
+ dimension_type dim = this->inner().space_dimension();
+ if (hide_last_) {
+ PPL_ASSERT(dim > 0);
+ --dim;
+ }
+ return dim;
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::end() const {
+ if (hide_last_) {
+ return this->inner().lower_bound(Variable(space_dimension()));
+ }
+ else {
+ return this->inner().end();
+ }
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::lower_bound(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension() + 1);
+ return this->inner().lower_bound(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::coefficient(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ return this->inner().coefficient(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::is_zero() const {
+ return this->inner().all_zeroes(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_homogeneous_terms_are_zero() const {
+ return this->inner().all_zeroes(1, space_dimension() + 1);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y) const {
+ const dimension_type x_dim = space_dimension();
+ const dimension_type y_dim = y.space_dimension();
+ if (x_dim != y_dim)
+ return false;
+ return is_equal_to(y, 0, x_dim + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(const Variables_Set& vars) const {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+ return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(dimension_type i) const {
+ PPL_ASSERT(i <= space_dimension());
+ return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Last<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero() const {
+ return this->inner().last_nonzero(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ PPL_ASSERT(last <= space_dimension() + 1);
+ return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ PPL_ASSERT(last <= space_dimension() + 1);
+ return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ if (x.empty())
+ return;
+ PPL_ASSERT(*(--x.end()) <= space_dimension());
+ this->inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ PPL_ASSERT(end <= y.space_dimension() + 1);
+ return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ PPL_ASSERT(end <= y.space_dimension() + 1);
+ return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Dense_Row& row) const {
+ this->inner().get_row(row);
+ if (hide_last_) {
+ PPL_ASSERT(row.size() != 0);
+ row.resize(row.size() - 1);
+ }
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Sparse_Row& row) const {
+ this->inner().get_row(row);
+ if (hide_last_) {
+ PPL_ASSERT(row.size() != 0);
+ row.resize(row.size() - 1);
+ }
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const {
+ PPL_ASSERT(last.space_dimension() <= space_dimension() + 1);
+ PPL_ASSERT(last.space_dimension() <= y.space_dimension() + 1);
+ return this->inner().have_a_common_variable(y, first, last);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Last_inlines_hh)
diff --git a/src/Expression_Hide_Last_types.hh b/src/Expression_Hide_Last_types.hh
new file mode 100644
index 0000000..ce37227
--- /dev/null
+++ b/src/Expression_Hide_Last_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Hide_Last_types_hh
+#define PPL_Expression_Hide_Last_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Last;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Last_types_hh)
diff --git a/src/Float.cc b/src/Float.cc
new file mode 100644
index 0000000..1571a1b
--- /dev/null
+++ b/src/Float.cc
@@ -0,0 +1,44 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Float_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+const uint64_t float_intel_double_extended::LSP_INF;
+const uint64_t float_intel_double_extended::LSP_ZERO;
+const uint64_t float_intel_double_extended::LSP_DMAX;
+const uint64_t float_intel_double_extended::LSP_NMAX;
+
+const uint64_t float_ieee754_quad::MSP_SGN_MASK;
+const uint64_t float_ieee754_quad::MSP_POS_INF;
+const uint64_t float_ieee754_quad::MSP_NEG_INF;
+const uint64_t float_ieee754_quad::MSP_POS_ZERO;
+const uint64_t float_ieee754_quad::MSP_NEG_ZERO;
+const uint64_t float_ieee754_quad::LSP_INF;
+const uint64_t float_ieee754_quad::LSP_ZERO;
+const uint64_t float_ieee754_quad::MSP_MAX;
+const uint64_t float_ieee754_quad::LSP_MAX;
+
+} // Parma_Polyhedra_Library
diff --git a/src/Float_defs.hh b/src/Float_defs.hh
new file mode 100644
index 0000000..090e70e
--- /dev/null
+++ b/src/Float_defs.hh
@@ -0,0 +1,523 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_defs_hh
+#define PPL_Float_defs_hh 1
+
+#include "globals_types.hh"
+#include "meta_programming.hh"
+#include "compiler.hh"
+#include "assert.hh"
+#include "Concrete_Expression_types.hh"
+#include "Variable_types.hh"
+#include "Linear_Form_types.hh"
+#include <set>
+#include <cmath>
+#include <map>
+#include <gmp.h>
+
+#ifdef NAN
+#define PPL_NAN NAN
+#else
+#define PPL_NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_half {
+ uint16_t word;
+ static const uint16_t SGN_MASK = 0x8000U;
+ static const uint16_t EXP_MASK = 0xfc00U;
+ static const uint16_t WRD_MAX = 0x7bffU;
+ static const uint16_t POS_INF = 0x7c00U;
+ static const uint16_t NEG_INF = 0xfc00U;
+ static const uint16_t POS_ZERO = 0x0000U;
+ static const uint16_t NEG_ZERO = 0x8000U;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 5;
+ static const unsigned int MANTISSA_BITS = 10;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_HALF;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000U;
+ static const uint32_t EXP_MASK = 0x7f800000U;
+ static const uint32_t WRD_MAX = 0x7f7fffffU;
+ static const uint32_t POS_INF = 0x7f800000U;
+ static const uint32_t NEG_INF = 0xff800000U;
+ static const uint32_t POS_ZERO = 0x00000000U;
+ static const uint32_t NEG_ZERO = 0x80000000U;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 8;
+ static const unsigned int MANTISSA_BITS = 23;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_SINGLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef WORDS_BIGENDIAN
+#ifndef PPL_WORDS_BIGENDIAN
+#define PPL_WORDS_BIGENDIAN
+#endif
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_double {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x80000000U;
+ static const uint32_t MSP_POS_INF = 0x7ff00000U;
+ static const uint32_t MSP_NEG_INF = 0xfff00000U;
+ static const uint32_t MSP_POS_ZERO = 0x00000000U;
+ static const uint32_t MSP_NEG_ZERO = 0x80000000U;
+ static const uint32_t LSP_INF = 0;
+ static const uint32_t LSP_ZERO = 0;
+ static const uint32_t MSP_MAX = 0x7fefffffU;
+ static const uint32_t LSP_MAX = 0xffffffffU;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 11;
+ static const unsigned int MANTISSA_BITS = 52;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_DOUBLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000U;
+ static const uint32_t EXP_MASK = 0x7f000000U;
+ static const uint32_t WRD_MAX = 0x7fffffffU;
+ static const uint32_t POS_INF = 0x7f000000U;
+ static const uint32_t NEG_INF = 0xff000000U;
+ static const uint32_t POS_ZERO = 0x00000000U;
+ static const uint32_t NEG_ZERO = 0x80000000U;
+ static const unsigned int BASE = 16;
+ static const unsigned int EXPONENT_BITS = 7;
+ static const unsigned int MANTISSA_BITS = 24;
+ static const int EXPONENT_BIAS = 64;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IBM_SINGLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_double {
+ static const unsigned int BASE = 16;
+ static const unsigned int EXPONENT_BITS = 7;
+ static const unsigned int MANTISSA_BITS = 56;
+ static const int EXPONENT_BIAS = 64;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_intel_double_extended {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x00008000U;
+ static const uint32_t MSP_POS_INF = 0x00007fffU;
+ static const uint32_t MSP_NEG_INF = 0x0000ffffU;
+ static const uint32_t MSP_POS_ZERO = 0x00000000U;
+ static const uint32_t MSP_NEG_ZERO = 0x00008000U;
+ static const uint64_t LSP_INF = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t LSP_ZERO = 0;
+ static const uint32_t MSP_MAX = 0x00007ffeU;
+ static const uint64_t LSP_DMAX = static_cast<uint64_t>(0x7fffffffffffffffULL);
+ static const uint64_t LSP_NMAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 15;
+ static const unsigned int MANTISSA_BITS = 63;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format =
+ INTEL_DOUBLE_EXTENDED;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_quad {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ static const uint64_t MSP_SGN_MASK = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t MSP_POS_INF = static_cast<uint64_t>(0x7fff000000000000ULL);
+ static const uint64_t MSP_NEG_INF = static_cast<uint64_t>(0xffff000000000000ULL);
+ static const uint64_t MSP_POS_ZERO = static_cast<uint64_t>(0x0000000000000000ULL);
+ static const uint64_t MSP_NEG_ZERO = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t LSP_INF = 0;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t MSP_MAX = static_cast<uint64_t>(0x7ffeffffffffffffULL);
+ static const uint64_t LSP_MAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 15;
+ static const unsigned int MANTISSA_BITS = 112;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_QUAD;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Float : public False { };
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> : public True {
+public:
+#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_FLOAT_BINARY_FORMAT"
+#endif
+ union {
+ float number;
+ Binary binary;
+ } u;
+ Float();
+ Float(float v);
+ float value();
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> : public True {
+public:
+#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_DOUBLE_BINARY_FORMAT"
+#endif
+ union {
+ double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(double v);
+ double value();
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> : public True {
+public:
+#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_LONG_DOUBLE_BINARY_FORMAT"
+#endif
+ union {
+ long double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(long double v);
+ long double value();
+};
+#endif
+
+// FIXME: is this the right place for this function?
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If \p v is nonzero, returns the position of the most significant bit
+ in \p a.
+
+ The behavior is undefined if \p v is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+unsigned int msb_position(unsigned long long v);
+
+/*! \brief
+ An abstract class to be implemented by an external analyzer such
+ as ECLAIR in order to provide to the PPL the necessary information
+ for performing the analysis of floating point computations.
+
+ \par Template type parameters
+
+ - The class template parameter \p Target specifies the implementation
+ of Concrete_Expression to be used.
+ - The class template parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+*/
+template <typename Target, typename FP_Interval_Type>
+class FP_Oracle {
+public:
+ /*
+ FIXME: the const qualifiers on expressions may raise CLANG
+ compatibility issues. It may be necessary to omit them.
+ */
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly
+ approximates the floating point entity referenced by \p dim.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_interval(dimension_type dim, FP_Interval_Type& result) const
+ = 0;
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly
+ approximates the value of floating point constant \p expr.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_fp_constant_value(
+ const Floating_Point_Constant<Target>& expr,
+ FP_Interval_Type& result) const = 0;
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly approximates
+ the value of \p expr, which must be of integer type.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_integer_expr_value(const Concrete_Expression<Target>& expr,
+ FP_Interval_Type& result) const = 0;
+
+ /*! \brief
+ Asks the external analyzer for the possible space dimensions that
+ are associated to the approximable reference \p expr.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to return
+ the (possibly empty!) set, <CODE>false</CODE> otherwise.
+
+ The resulting set MUST NOT contain <CODE>not_a_dimension()</CODE>.
+ */
+ virtual bool get_associated_dimensions(
+ const Approximable_Reference<Target>& expr,
+ std::set<dimension_type>& result) const = 0;
+
+};
+
+/* FIXME: some of the following documentation should probably be
+ under PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS */
+
+/*! \brief \relates Float
+ Returns <CODE>true</CODE> if and only if there is some floating point
+ number that is representable by \p f2 but not by \p f1.
+*/
+bool is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2);
+
+/*! \brief \relates Float
+ Computes the absolute error of floating point computations.
+
+ \par Template type parameters
+
+ - The class template parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+
+ \param analyzed_format The floating point format used by the analyzed
+ program.
+
+ \return The interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+ smallest non-zero positive number in the less precise floating point
+ format between the analyzer format and the analyzed format.
+*/
+template <typename FP_Interval_Type>
+const FP_Interval_Type&
+compute_absolute_error(Floating_Point_Format analyzed_format);
+
+/*! \brief \relates Linear_Form
+ Discards all linear forms containing variable \p var from the
+ linear form abstract store \p lf_store.
+*/
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var);
+
+/*! \brief \relates Linear_Form
+ Assigns the linear form \p lf to \p var in the linear form abstract
+ store \p lf_store, then discards all occurrences of \p var from it.
+*/
+template <typename FP_Interval_Type>
+void
+affine_form_image(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var,
+ const Linear_Form<FP_Interval_Type>& lf);
+
+/*! \brief \relates Linear_Form
+ Discards from \p ls1 all linear forms but those that are associated
+ to the same variable in \p ls2.
+*/
+template <typename FP_Interval_Type>
+void
+upper_bound_assign(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls1,
+ const std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Float_inlines.hh"
+#include "Float_templates.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
diff --git a/src/Float_inlines.hh b/src/Float_inlines.hh
new file mode 100644
index 0000000..3db069a
--- /dev/null
+++ b/src/Float_inlines.hh
@@ -0,0 +1,536 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_inlines_hh
+#define PPL_Float_inlines_hh 1
+
+#include <climits>
+#include "Variable_defs.hh"
+#include "Linear_Form_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_half::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_half::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_half::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_half::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_half::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_half::dec() {
+ --word;
+}
+
+inline void
+float_ieee754_half::inc() {
+ ++word;
+}
+
+inline void
+float_ieee754_half::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_half::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint16_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint16_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_single::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_single::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_single::dec() {
+ --word;
+}
+
+inline void
+float_ieee754_single::inc() {
+ ++word;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_double::is_nan() const {
+ const uint32_t a = msp & ~MSP_SGN_MASK;
+ return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ if (msp == MSP_NEG_ZERO)
+ return -1;
+ if (msp == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_double::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_double::dec() {
+ if (lsp == 0) {
+ --msp;
+ lsp = LSP_MAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_ieee754_double::inc() {
+ if (lsp == LSP_MAX) {
+ ++msp;
+ lsp = 0;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_MAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+ unsigned long m;
+#if ULONG_MAX == 0xffffffffUL
+ lsp = mpz_get_ui(mantissa);
+ mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+ m = mpz_get_ui(mantissa);
+#else
+ m = mpz_get_ui(mantissa);
+ lsp = static_cast<uint32_t>(m & LSP_MAX);
+ m >>= 32;
+#endif
+ msp = static_cast<uint32_t>(m & ((1UL << (MANTISSA_BITS - 32)) - 1));
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint32_t>(exponent_repr) << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_ibm_single::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ibm_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ibm_single::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ibm_single::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ibm_single::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ibm_single::dec() {
+ --word;
+}
+
+inline void
+float_ibm_single::inc() {
+ ++word;
+}
+
+inline void
+float_ibm_single::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ibm_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_intel_double_extended::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ const uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_INF)
+ return -1;
+ if (a == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_intel_double_extended::is_nan() const {
+ return (msp & MSP_POS_INF) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ const uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_ZERO)
+ return -1;
+ if (a == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_intel_double_extended::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_intel_double_extended::dec() {
+ if ((lsp & LSP_DMAX) == 0) {
+ --msp;
+ lsp = ((msp & MSP_NEG_INF) == 0) ? LSP_DMAX : LSP_NMAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_intel_double_extended::inc() {
+ if ((lsp & LSP_DMAX) == LSP_DMAX) {
+ ++msp;
+ lsp = LSP_DMAX + 1;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_NMAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+ mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+ mpz_export(&lsp, 0, -1, sizeof(lsp), 0, 0, mantissa);
+#else
+ lsp = mpz_get_ui(mantissa);
+#endif
+ msp = (negative ? MSP_SGN_MASK : 0);
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint32_t>(exponent_repr);
+}
+
+inline int
+float_ieee754_quad::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_quad::is_nan() const {
+ return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ if (msp == MSP_NEG_ZERO)
+ return -1;
+ if (msp == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_quad::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_quad::dec() {
+ if (lsp == 0) {
+ --msp;
+ lsp = LSP_MAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_ieee754_quad::inc() {
+ if (lsp == LSP_MAX) {
+ ++msp;
+ lsp = 0;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_MAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+ uint64_t parts[2];
+ mpz_export(parts, 0, -1, sizeof(parts[0]), 0, 0, mantissa);
+ lsp = parts[0];
+ msp = parts[1];
+ msp &= ((static_cast<uint64_t>(1) << (MANTISSA_BITS - 64)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint64_t>(exponent_repr) << (MANTISSA_BITS - 64);
+}
+
+inline bool
+is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2) {
+ return f1 < f2;
+}
+
+inline unsigned int
+msb_position(unsigned long long v) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(v))) - 1U - clz(v);
+}
+
+template <typename FP_Interval_Type>
+inline void
+affine_form_image(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ const Variable var,
+ const Linear_Form<FP_Interval_Type>& lf) {
+ // Assign the new linear form for var.
+ lf_store[var.id()] = lf;
+ // Now invalidate all linear forms in which var occurs.
+ discard_occurrences(lf_store, var);
+}
+
+#if PPL_SUPPORTED_FLOAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+ u.number = v;
+}
+
+inline float
+Float<float>::value() {
+ return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+ u.number = v;
+}
+
+inline double
+Float<double>::value() {
+ return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+ u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+ return u.number;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_inlines_hh)
diff --git a/src/Float_templates.hh b/src/Float_templates.hh
new file mode 100644
index 0000000..19663bf
--- /dev/null
+++ b/src/Float_templates.hh
@@ -0,0 +1,167 @@
+/* IEC 559 floating point format related functions:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_templates_hh
+#define PPL_Float_templates_hh 1
+
+#include "Variable_defs.hh"
+#include "Linear_Form_defs.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type>
+const FP_Interval_Type& compute_absolute_error(
+ const Floating_Point_Format analyzed_format) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+
+ // FIXME: check if initializing caches with EMPTY is better.
+ static const FP_Interval_Type ZERO_INTERVAL = FP_Interval_Type(0);
+ // Cached results for each different analyzed format.
+ static FP_Interval_Type ieee754_half_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_single_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_double_result = ZERO_INTERVAL;
+ static FP_Interval_Type ibm_single_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_quad_result = ZERO_INTERVAL;
+ static FP_Interval_Type intel_double_extended_result = ZERO_INTERVAL;
+
+ FP_Interval_Type* to_compute = NULL;
+ // Get the necessary information on the analyzed's format.
+ unsigned int f_base;
+ int f_exponent_bias;
+ unsigned int f_mantissa_bits;
+ switch (analyzed_format) {
+ case IEEE754_HALF:
+ if (ieee754_half_result != ZERO_INTERVAL)
+ return ieee754_half_result;
+
+ to_compute = &ieee754_half_result;
+ f_base = float_ieee754_half::BASE;
+ f_exponent_bias = float_ieee754_half::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+ break;
+ case IEEE754_SINGLE:
+ if (ieee754_single_result != ZERO_INTERVAL)
+ return ieee754_single_result;
+
+ to_compute = &ieee754_single_result;
+ f_base = float_ieee754_single::BASE;
+ f_exponent_bias = float_ieee754_single::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+ break;
+ case IEEE754_DOUBLE:
+ if (ieee754_double_result != ZERO_INTERVAL)
+ return ieee754_double_result;
+
+ to_compute = &ieee754_double_result;
+ f_base = float_ieee754_double::BASE;
+ f_exponent_bias = float_ieee754_double::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+ break;
+ case IBM_SINGLE:
+ if (ibm_single_result != ZERO_INTERVAL)
+ return ibm_single_result;
+
+ to_compute = &ibm_single_result;
+ f_base = float_ibm_single::BASE;
+ f_exponent_bias = float_ibm_single::EXPONENT_BIAS;
+ f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+ break;
+ case IEEE754_QUAD:
+ if (ieee754_quad_result != ZERO_INTERVAL)
+ return ieee754_quad_result;
+
+ to_compute = &ieee754_quad_result;
+ f_base = float_ieee754_quad::BASE;
+ f_exponent_bias = float_ieee754_quad::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+ break;
+ case INTEL_DOUBLE_EXTENDED:
+ if (intel_double_extended_result != ZERO_INTERVAL)
+ return intel_double_extended_result;
+
+ to_compute = &intel_double_extended_result;
+ f_base = float_intel_double_extended::BASE;
+ f_exponent_bias = float_intel_double_extended::EXPONENT_BIAS;
+ f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_ASSERT(to_compute != NULL);
+
+ // We assume that f_base is a power of 2.
+ analyzer_format omega;
+ int power = static_cast<int>(msb_position(f_base))
+ * ((1 - f_exponent_bias) - static_cast<int>(f_mantissa_bits));
+ omega = std::max(static_cast<analyzer_format>(ldexp(1.0, power)),
+ std::numeric_limits<analyzer_format>::denorm_min());
+
+ to_compute->build(i_constraint(GREATER_OR_EQUAL, -omega),
+ i_constraint(LESS_OR_EQUAL, omega));
+ return *to_compute;
+}
+
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var) {
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+ for (Iter i = lf_store.begin(); i != lf_store.end(); ) {
+ if((i->second).coefficient(var) != 0)
+ i = lf_store.erase(i);
+ else
+ ++i;
+ }
+}
+
+/* FIXME: improve efficiency by adding the list of potentially conflicting
+ variables as an argument. */
+template <typename FP_Interval_Type>
+void upper_bound_assign(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls1,
+ const std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls2) {
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+ typedef typename std::map<dimension_type,
+ FP_Linear_Form>::const_iterator Const_Iter;
+
+ Const_Iter i2_end = ls2.end();
+ for (Iter i1 = ls1.begin(), i1_end = ls1.end(); i1 != i1_end; ) {
+ Const_Iter i2 = ls2.find(i1->first);
+ if ((i2 == i2_end) || (i1->second != i2->second))
+ i1 = ls1.erase(i1);
+ else
+ ++i1;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_templates_hh)
diff --git a/src/Floating_Point_Expression_defs.hh b/src/Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..57231bf
--- /dev/null
+++ b/src/Floating_Point_Expression_defs.hh
@@ -0,0 +1,212 @@
+/* Declarations for the Floating_Point_Expression class and its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_defs_hh
+#define PPL_Floating_Point_Expression_defs_hh 1
+
+#include "globals_defs.hh"
+#include "Floating_Point_Expression_types.hh"
+#include "Linear_Form_types.hh"
+#include "Box_types.hh"
+#include <cmath>
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_Interface \brief
+ A floating point expression on a given format.
+
+ This class represents a concrete <EM>floating point expression</EM>. This
+ includes constants, floating point variables, binary and unary
+ arithmetic operators.
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+ This parameter must be a struct similar to the ones defined in file
+ Float_defs.hh, even though it is sufficient to define the three
+ fields BASE, MANTISSA_BITS and EXPONENT_BIAS.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression {
+
+public:
+
+ //! Alias for a linear form with template argument \p FP_Interval_Type.
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ //! Alias for a map that associates a variable index to an interval.
+ /*! \brief
+ Alias for a Box storing lower and upper bounds for floating point
+ variables.
+
+ The type a linear form abstract store associating each variable with an
+ interval that correctly approximates its value.
+ */
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+
+ //! Alias for a map that associates a variable index to a linear form.
+ /*!
+ The type a linear form abstract store associating each variable with a
+ linear form that correctly approximates its value.
+ */
+ typedef std::map<dimension_type, FP_Linear_Form>
+ FP_Linear_Form_Abstract_Store;
+
+ //! The floating point format used by the analyzer.
+ typedef typename FP_Interval_Type::boundary_type boundary_type;
+
+ //! The interval policy used by \p FP_Interval_Type.
+ typedef typename FP_Interval_Type::info_type info_type;
+
+ //! Destructor.
+ virtual ~Floating_Point_Expression();
+
+ //! Linearizes a floating point expression.
+ /*! \brief
+ Makes \p result become a linear form that correctly approximates the
+ value of the floating point expression in the given composite
+ abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result Becomes the linearized expression.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Formally, if \p *this represents the expression \f$e\f$,
+ \p int_store represents the interval abstract store \f$\rho^{\#}\f$ and
+ \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+ then \p result will become
+ \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ if the linearization succeeds.
+
+ All variables occurring in the floating point expression MUST have
+ an associated interval in \p int_store.
+ If this precondition is not met, calling the method causes an
+ undefined behavior.
+ */
+ virtual bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const = 0;
+
+ /*! \brief
+ Absolute error.
+
+ Represents the interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+ smallest non-zero positive number in the less precise floating point
+ format between the analyzer format and the analyzed format.
+
+ */
+ static FP_Interval_Type absolute_error;
+
+ // FIXME: this may not be the best place for them.
+ /*! \brief
+ Verifies if a given linear form overflows.
+ \param lf The linear form to verify.
+ \return
+ Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+ <CODE>true</CODE> otherwise.
+ */
+ static bool overflows(const FP_Linear_Form& lf);
+
+ /*! \brief
+ Computes the relative error of a given linear form.
+
+ Static helper method that is used by <CODE>linearize</CODE>
+ to account for the relative errors on \p lf.
+ \param lf The linear form used to compute the relative error.
+ \param result Becomes the linear form corresponding to a relative
+ error committed on \p lf.
+
+ This method makes <CODE>result</CODE> become a linear form
+ obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+ on the linear form \p lf. This function is defined
+ such as:
+ \f[
+ \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+ \defeq
+ (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+ +
+ \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+ \amifp
+ [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+ \f]
+ where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+ \f$\beta\f$ the base.
+ */
+ static void relative_error(const FP_Linear_Form& lf,
+ FP_Linear_Form& result);
+
+ /*! \brief
+ Makes \p result become an interval that overapproximates all the
+ possible values of \p lf in the interval abstract store \p store.
+
+ \param lf The linear form to aproximate.
+ \param store The abstract store.
+ \param result The linear form that will be modified.
+
+ This method makes <CODE>result</CODE> become
+ \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+ \f[
+ \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+ \defeq
+ i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+ \rho^{\#}(v)\right)
+ \f]
+ */
+ static void intervalize(const FP_Linear_Form& lf,
+ const FP_Interval_Abstract_Store& store,
+ FP_Interval_Type& result);
+
+private:
+
+ /*! \brief
+ Computes the absolute error.
+
+ Static helper method that is used to compute the value of the public
+ static field <CODE>absolute_error</CODE>.
+
+ \return The interval \f$[-\omega, \omega]\f$ corresponding to the value
+ of <CODE>absolute_error</CODE>
+ */
+ static FP_Interval_Type compute_absolute_error();
+
+}; // class Floating_Point_Expression
+
+
+template <typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::absolute_error = compute_absolute_error();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Floating_Point_Expression_inlines.hh"
+#include "Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Floating_Point_Expression_defs_hh)
diff --git a/src/Floating_Point_Expression_inlines.hh b/src/Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..644f839
--- /dev/null
+++ b/src/Floating_Point_Expression_inlines.hh
@@ -0,0 +1,55 @@
+/* Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_inlines_hh
+#define PPL_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Linear_Form_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::overflows(const FP_Linear_Form& lf) {
+ if (!lf.inhomogeneous_term().is_bounded())
+ return true;
+
+ dimension_type dimension = lf.space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ if (!lf.coefficient(Variable(i)).is_bounded())
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_inlines_hh)
diff --git a/src/Floating_Point_Expression_templates.hh b/src/Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..b10e685
--- /dev/null
+++ b/src/Floating_Point_Expression_templates.hh
@@ -0,0 +1,111 @@
+/* Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_templates_hh
+#define PPL_Floating_Point_Expression_templates_hh 1
+
+#include "Linear_Form_defs.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::relative_error(const FP_Linear_Form& lf, FP_Linear_Form& result) {
+
+ FP_Interval_Type error_propagator;
+ boundary_type lb = -pow(FP_Format::BASE,
+ -static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::boundary_type>(FP_Format::MANTISSA_BITS));
+ error_propagator.build(i_constraint(GREATER_OR_EQUAL, lb),
+ i_constraint(LESS_OR_EQUAL, -lb));
+
+ // Handle the inhomogeneous term.
+ const FP_Interval_Type* current_term = &lf.inhomogeneous_term();
+ assert(current_term->is_bounded());
+
+ FP_Interval_Type
+ current_multiplier(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ FP_Linear_Form current_result_term(current_multiplier);
+ current_result_term *= error_propagator;
+ result = FP_Linear_Form(current_result_term);
+
+ // Handle the other terms.
+ dimension_type dimension = lf.space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ current_term = &lf.coefficient(Variable(i));
+ assert(current_term->is_bounded());
+ current_multiplier
+ = FP_Interval_Type(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ current_result_term = FP_Linear_Form(Variable(i));
+ current_result_term *= current_multiplier;
+ current_result_term *= error_propagator;
+ result += current_result_term;
+ }
+
+ return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::intervalize(const FP_Linear_Form& lf,
+ const FP_Interval_Abstract_Store& store,
+ FP_Interval_Type& result) {
+ result = FP_Interval_Type(lf.inhomogeneous_term());
+ dimension_type dimension = lf.space_dimension();
+ assert(dimension <= store.space_dimension());
+ for (dimension_type i = 0; i < dimension; ++i) {
+ FP_Interval_Type current_addend = lf.coefficient(Variable(i));
+ const FP_Interval_Type& curr_int = store.get_interval(Variable(i));
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::compute_absolute_error() {
+ typedef typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::boundary_type Boundary;
+ boundary_type omega;
+ omega = std::max(pow(static_cast<Boundary>(FP_Format::BASE),
+ static_cast<Boundary>(1 - FP_Format::EXPONENT_BIAS
+ - FP_Format::MANTISSA_BITS)),
+ std::numeric_limits<Boundary>::denorm_min());
+ FP_Interval_Type result;
+ result.build(i_constraint(GREATER_OR_EQUAL, -omega),
+ i_constraint(LESS_OR_EQUAL, omega));
+ return result;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_templates_hh)
diff --git a/src/Floating_Point_Expression_types.hh b/src/Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..27cca82
--- /dev/null
+++ b/src/Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Floating_Point_Expression_types_hh
+#define PPL_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_types_hh)
diff --git a/src/GMP_Integer_defs.hh b/src/GMP_Integer_defs.hh
new file mode 100644
index 0000000..0030825
--- /dev/null
+++ b/src/GMP_Integer_defs.hh
@@ -0,0 +1,134 @@
+/* GMP_Integer class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_GMP_Integer_defs_hh
+#define PPL_GMP_Integer_defs_hh 1
+
+#include "GMP_Integer_types.hh"
+#include "globals_types.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+ Assigns to \p x the greatest common divisor of \p y and \p z, and to
+ \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+/*! \brief
+ If \p z divides \p y, assigns to \p x the quotient of the integer
+ division of \p y and \p z.
+
+ \relates GMP_Integer
+ The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+ Returns a negative, zero or positive value depending on whether
+ \p x is lower than, equal to or greater than \p y, respectively.
+
+ \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "GMP_Integer_inlines.hh"
+
+#endif // !defined(PPL_GMP_Integer_defs_hh)
diff --git a/src/GMP_Integer_inlines.hh b/src/GMP_Integer_inlines.hh
new file mode 100644
index 0000000..449622c
--- /dev/null
+++ b/src/GMP_Integer_inlines.hh
@@ -0,0 +1,122 @@
+/* GMP_Integer class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_GMP_Integer_inlines_hh
+#define PPL_GMP_Integer_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+ mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x) {
+ mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+ const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_gcdext(x.get_mpz_t(),
+ s.get_mpz_t(), t.get_mpz_t(),
+ y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+ mpz_mul_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+ mpz_tdiv_q_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ PPL_ASSERT(y % z == 0);
+ mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+ return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+ return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+ return x;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_GMP_Integer_inlines_hh)
diff --git a/src/GMP_Integer_types.hh b/src/GMP_Integer_types.hh
new file mode 100644
index 0000000..9463fed
--- /dev/null
+++ b/src/GMP_Integer_types.hh
@@ -0,0 +1,45 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_GMP_Integer_types_hh
+#define PPL_GMP_Integer_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+#include <gmpxx.h>
+#include "mp_std_bits_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+ \brief
+ Unbounded integers as provided by the GMP library.
+
+ \ingroup PPL_CXX_interface
+ GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+ defined in the C++ interface of the GMP library.
+ For more information, see <CODE>http://gmplib.org/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+ //! The type used for references to const unbounded integers.
+ typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_GMP_Integer_types_hh)
diff --git a/src/Generator.cc b/src/Generator.cc
new file mode 100644
index 0000000..4ec86a6
--- /dev/null
+++ b/src/Generator.cc
@@ -0,0 +1,496 @@
+/* Generator class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Generator_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Generator::throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ const Variable v) const {
+ std::ostringstream s;
+ s << "PPL::Generator::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << v_name << ".space_dimension() == " << v.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Generator::throw_invalid_argument(const char* method,
+ const char* reason) const {
+ std::ostringstream s;
+ s << "PPL::Generator::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+PPL::Generator
+PPL::Generator::point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::point(e, d):\n"
+ "d == 0.");
+ Linear_Expression ec(e, r);
+ ec.set_inhomogeneous_term(d);
+ Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+
+ // If the divisor is negative, we negate it as well as
+ // all the coefficients of the point, because we want to preserve
+ // the invariant: the divisor of a point is strictly positive.
+ if (d < 0)
+ neg_assign(g.expr);
+
+ // Enforce normalization.
+ g.expr.normalize();
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::point(const Linear_Expression& e,
+ Representation r) {
+ return point(e, Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::point(Representation r) {
+ return point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::closure_point(e, d):\n"
+ "d == 0.");
+ Linear_Expression ec(e, r);
+ ec.set_inhomogeneous_term(d);
+
+ Generator g(ec, Generator::POINT, NOT_NECESSARILY_CLOSED);
+
+ // If the divisor is negative, we negate it as well as
+ // all the coefficients of the point, because we want to preserve
+ // the invariant: the divisor of a point is strictly positive.
+ if (d < 0)
+ neg_assign(g.expr);
+
+ // Enforce normalization.
+ g.expr.normalize();
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+ Representation r) {
+ return closure_point(e, Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::closure_point(Representation r) {
+ return closure_point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::ray(const Linear_Expression& e, Representation r) {
+ // The origin of the space cannot be a ray.
+ if (e.all_homogeneous_terms_are_zero())
+ throw std::invalid_argument("PPL::ray(e):\n"
+ "e == 0, but the origin cannot be a ray.");
+
+ Linear_Expression ec(e, r);
+ ec.set_inhomogeneous_term(0);
+ const Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::line(const Linear_Expression& e, Representation r) {
+ // The origin of the space cannot be a line.
+ if (e.all_homogeneous_terms_are_zero())
+ throw std::invalid_argument("PPL::line(e):\n"
+ "e == 0, but the origin cannot be a line.");
+
+ Linear_Expression ec(e, r);
+ ec.set_inhomogeneous_term(0);
+ const Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+
+ return g;
+}
+
+void
+PPL::Generator::swap_space_dimensions(Variable v1, Variable v2) {
+ PPL_ASSERT(v1.space_dimension() <= space_dimension());
+ PPL_ASSERT(v2.space_dimension() <= space_dimension());
+ expr.swap_space_dimensions(v1, v2);
+ // *this is still normalized but it may not be strongly normalized.
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Generator::remove_space_dimensions(const Variables_Set& vars) {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+ expr.remove_space_dimensions(vars);
+
+ if (is_line_or_ray() && expr.all_homogeneous_terms_are_zero()) {
+ // Become a point.
+ set_is_ray_or_point();
+ expr.set_inhomogeneous_term(1);
+ if (is_not_necessarily_closed())
+ set_epsilon_coefficient(1);
+
+ PPL_ASSERT(OK());
+ return false;
+ }
+ else {
+ strong_normalize();
+ PPL_ASSERT(OK());
+ return true;
+ }
+}
+
+void
+PPL::Generator
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ if (cycle.size() < 2)
+ // No-op. No need to call sign_normalize().
+ return;
+
+ expr.permute_space_dimensions(cycle);
+
+ // *this is still normalized but may be not strongly normalized: sign
+ // normalization is necessary.
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Generator::linear_combine(const Generator& y, dimension_type i) {
+ expr.linear_combine(y.expr, i);
+ strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+int
+PPL::compare(const Generator& x, const Generator& y) {
+ const bool x_is_line_or_equality = x.is_line_or_equality();
+ const bool y_is_line_or_equality = y.is_line_or_equality();
+ if (x_is_line_or_equality != y_is_line_or_equality)
+ // Equalities (lines) precede inequalities (ray/point).
+ return y_is_line_or_equality ? 2 : -2;
+
+ return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Generator::is_equivalent_to(const Generator& y) const {
+ const Generator& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ const Type x_type = x.type();
+ if (x_type != y.type())
+ return false;
+
+ if (x_type == POINT
+ && !(x.is_necessarily_closed() && y.is_necessarily_closed())) {
+ // Due to the presence of epsilon-coefficients, syntactically
+ // different points may actually encode the same generator.
+ // First, drop the epsilon-coefficient ...
+ Linear_Expression x_expr(x.expression());
+ Linear_Expression y_expr(y.expression());
+ // ... second, re-normalize ...
+ x_expr.normalize();
+ y_expr.normalize();
+ // ... and finally check for syntactic equality.
+ return x_expr.is_equal_to(y_expr);
+ }
+
+ // Here the epsilon-coefficient, if present, is zero.
+ // It is sufficient to check for syntactic equality.
+ return x.expr.is_equal_to(y.expr);
+}
+
+bool
+PPL::Generator::is_equal_to(const Generator& y) const {
+ return expr.is_equal_to(y.expr) && kind_ == y.kind_
+ && topology_ == y.topology_;
+}
+
+void
+PPL::Generator::sign_normalize() {
+ if (is_line_or_equality())
+ expr.sign_normalize();
+}
+
+bool
+PPL::Generator::check_strong_normalized() const {
+ Generator tmp = *this;
+ tmp.strong_normalize();
+ return compare(*this, tmp) == 0;
+}
+
+const PPL::Generator* PPL::Generator::zero_dim_point_p = 0;
+const PPL::Generator* PPL::Generator::zero_dim_closure_point_p = 0;
+
+void
+PPL::Generator::initialize() {
+ PPL_ASSERT(zero_dim_point_p == 0);
+ zero_dim_point_p
+ = new Generator(point());
+
+ PPL_ASSERT(zero_dim_closure_point_p == 0);
+ zero_dim_closure_point_p
+ = new Generator(closure_point());
+}
+
+void
+PPL::Generator::finalize() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ delete zero_dim_point_p;
+ zero_dim_point_p = 0;
+
+ PPL_ASSERT(zero_dim_closure_point_p != 0);
+ delete zero_dim_closure_point_p;
+ zero_dim_closure_point_p = 0;
+}
+
+void
+PPL::Generator::fancy_print(std::ostream& s) const {
+ bool needed_divisor = false;
+ bool extra_parentheses = false;
+ const dimension_type num_variables = space_dimension();
+ const Generator::Type t = type();
+ switch (t) {
+ case Generator::LINE:
+ s << "l(";
+ break;
+ case Generator::RAY:
+ s << "r(";
+ break;
+ case Generator::POINT:
+ s << "p(";
+ goto any_point;
+ case Generator::CLOSURE_POINT:
+ s << "c(";
+ any_point:
+ if (expr.inhomogeneous_term() != 1) {
+ needed_divisor = true;
+ if (!expr.all_zeroes(1, num_variables + 1)) {
+ extra_parentheses = true;
+ s << "(";
+ }
+ }
+ break;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ bool first = true;
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+ c = *i;
+ if (!first) {
+ if (c > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(c);
+ }
+ }
+ else
+ first = false;
+ if (c == -1)
+ s << "-";
+ else if (c != 1)
+ s << c << "*";
+ IO_Operators::operator<<(s, i.variable());
+ }
+ if (first)
+ // A point or closure point in the origin.
+ s << 0;
+ if (extra_parentheses)
+ s << ")";
+ if (needed_divisor)
+ s << "/" << expr.inhomogeneous_term();
+ s << ")";
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
+ g.fancy_print(s);
+ return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator::Type& t) {
+ const char* n = 0;
+ switch (t) {
+ case Generator::LINE:
+ n = "LINE";
+ break;
+ case Generator::RAY:
+ n = "RAY";
+ break;
+ case Generator::POINT:
+ n = "POINT";
+ break;
+ case Generator::CLOSURE_POINT:
+ n = "CLOSURE_POINT";
+ break;
+ }
+ s << n;
+ return s;
+}
+
+bool
+PPL::Generator::is_matching_closure_point(const Generator& p) const {
+ PPL_ASSERT(topology() == p.topology()
+ && space_dimension() == p.space_dimension()
+ && type() == CLOSURE_POINT
+ && p.type() == POINT);
+ const Generator& cp = *this;
+ if (cp.expr.inhomogeneous_term() == p.expr.inhomogeneous_term()) {
+ // Divisors are equal: we can simply compare coefficients
+ // (disregarding the epsilon coefficient).
+ return cp.expr.is_equal_to(p.expr, 1, cp.expr.space_dimension());
+ }
+ else {
+ // Divisors are different: divide them by their GCD
+ // to simplify the following computation.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd_assign(gcd, cp.expr.inhomogeneous_term(), p.expr.inhomogeneous_term());
+ const bool rel_prime = (gcd == 1);
+ PPL_DIRTY_TEMP_COEFFICIENT(cp_0_scaled);
+ PPL_DIRTY_TEMP_COEFFICIENT(p_0_scaled);
+ if (!rel_prime) {
+ exact_div_assign(cp_0_scaled, cp.expr.inhomogeneous_term(), gcd);
+ exact_div_assign(p_0_scaled, p.expr.inhomogeneous_term(), gcd);
+ }
+ const Coefficient& cp_div = rel_prime ? cp.expr.inhomogeneous_term() : cp_0_scaled;
+ const Coefficient& p_div = rel_prime ? p.expr.inhomogeneous_term() : p_0_scaled;
+ return cp.expr.is_equal_to(p.expr, p_div, cp_div, 1, cp.expr.space_dimension());
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator)
+
+
+bool
+PPL::Generator::OK() const {
+ // Topology consistency checks.
+ if (is_not_necessarily_closed() && expr.space_dimension() == 0) {
+#ifndef NDEBUG
+ std::cerr << "Generator has fewer coefficients than the minimum "
+ << "allowed by its topology."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Normalization check.
+ Generator tmp = *this;
+ tmp.strong_normalize();
+ if (tmp != *this) {
+#ifndef NDEBUG
+ std::cerr << "Generators should be strongly normalized!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ switch (type()) {
+ case LINE:
+ // Intentionally fall through.
+ case RAY:
+ if (expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+ std::cerr << "Lines must have a zero inhomogeneous term!"
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!is_necessarily_closed() && epsilon_coefficient() != 0) {
+#ifndef NDEBUG
+ std::cerr << "Lines and rays must have a zero coefficient "
+ << "for the epsilon dimension!"
+ << std::endl;
+#endif
+ return false;
+ }
+ // The following test is correct, since we already checked
+ // that the epsilon coordinate is zero.
+ if (expr.all_homogeneous_terms_are_zero()) {
+#ifndef NDEBUG
+ std::cerr << "The origin of the vector space cannot be a line or a ray!"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+
+ case POINT:
+ if (expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Points must have a positive divisor!"
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!is_necessarily_closed())
+ if (epsilon_coefficient() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "In the NNC topology, points must have epsilon > 0"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+
+ case CLOSURE_POINT:
+ if (expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Closure points must have a positive divisor!"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+ }
+
+ // All tests passed.
+ return true;
+}
diff --git a/src/Generator_System.cc b/src/Generator_System.cc
new file mode 100644
index 0000000..b203497
--- /dev/null
+++ b/src/Generator_System.cc
@@ -0,0 +1,805 @@
+/* Generator_System class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Constraint_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Generator_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+ const dimension_type new_space_dim) {
+ PPL_ASSERT(space_dimension() <= new_space_dim);
+
+ if (sys.topology() != new_topology) {
+ if (new_topology == NECESSARILY_CLOSED) {
+ // A NOT_NECESSARILY_CLOSED generator system
+ // can be converted to a NECESSARILY_CLOSED one
+ // only if it does not contain closure points.
+ // This check has to be performed under the user viewpoint.
+ if (has_closure_points())
+ return false;
+ // For a correct implementation, we have to remove those
+ // closure points that were matching a point (i.e., those
+ // that are in the generator system, but are invisible to
+ // the user).
+ const Generator_System& gs = *this;
+ for (dimension_type i = 0; i < sys.num_rows(); )
+ if (gs[i].is_closure_point())
+ sys.remove_row(i, false);
+ else
+ ++i;
+ sys.set_necessarily_closed();
+ }
+ else {
+ convert_into_non_necessarily_closed();
+ }
+ }
+
+ sys.set_space_dimension(new_space_dim);
+
+ // We successfully adjusted dimensions and topology.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+// TODO: would be worth to avoid adding closure points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_closure_points() {
+ PPL_ASSERT(!sys.is_necessarily_closed());
+ // NOTE: we always add (pending) rows at the end of the generator system.
+ // Updating `index_first_pending', if needed, is done by the caller.
+ Generator_System& gs = *this;
+ const dimension_type n_rows = gs.sys.num_rows();
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Generator& g = gs[i];
+ if (g.epsilon_coefficient() > 0) {
+ // `g' is a point: adding the closure point.
+ Generator cp = g;
+ cp.set_epsilon_coefficient(0);
+ // Enforcing normalization.
+ cp.expr.normalize();
+ gs.insert_pending(cp, Recycle_Input());
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+
+// TODO: would be worth to avoid adding points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_points() {
+ PPL_ASSERT(!sys.is_necessarily_closed());
+ // NOTE: we always add (pending) rows at the end of the generator system.
+ // Updating `index_first_pending', if needed, is done by the caller.
+ Generator_System& gs = *this;
+ const dimension_type n_rows = gs.sys.num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ const Generator& g = gs[i];
+ if (!g.is_line_or_ray() && g.epsilon_coefficient() == 0) {
+ // `g' is a closure point: adding the point.
+ // Note: normalization is preserved.
+ Generator p = g;
+ p.set_epsilon_coefficient(p.expr.inhomogeneous_term());
+ gs.insert_pending(p, Recycle_Input());
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Generator_System::has_closure_points() const {
+ if (sys.is_necessarily_closed())
+ return false;
+ // Adopt the point of view of the user.
+ for (Generator_System::const_iterator i = begin(),
+ this_end = end(); i != this_end; ++i)
+ if (i->is_closure_point())
+ return true;
+ return false;
+}
+
+void
+PPL::Generator_System::convert_into_non_necessarily_closed() {
+ // Padding the matrix with the column
+ // corresponding to the epsilon coefficients:
+ // all points must have epsilon coordinate equal to 1
+ // (i.e., the epsilon coefficient is equal to the divisor);
+ // rays and lines must have epsilon coefficient equal to 0.
+ // Note: normalization is preserved.
+ sys.set_not_necessarily_closed();
+
+ for (dimension_type i = sys.rows.size(); i-- > 0; ) {
+ Generator& gen = sys.rows[i];
+ if (!gen.is_line_or_ray())
+ gen.set_epsilon_coefficient(gen.expr.inhomogeneous_term());
+ }
+
+ PPL_ASSERT(sys.OK());
+}
+
+bool
+PPL::Generator_System::has_points() const {
+ const Generator_System& gs = *this;
+ // Avoiding the repeated tests on topology.
+ if (sys.is_necessarily_closed())
+ for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+ if (!gs[i].is_line_or_ray())
+ return true;
+ }
+ else {
+ // !is_necessarily_closed()
+ for (dimension_type i = sys.num_rows(); i-- > 0; )
+ if (gs[i].epsilon_coefficient() != 0)
+ return true;
+ }
+ return false;
+}
+
+void
+PPL::Generator_System_const_iterator::skip_forward() {
+ const Linear_System<Generator>::const_iterator gsp_end = gsp->end();
+ if (i != gsp_end) {
+ Linear_System<Generator>::const_iterator i_next = i;
+ ++i_next;
+ if (i_next != gsp_end) {
+ const Generator& cp = *i;
+ const Generator& p = *i_next;
+ if (cp.is_closure_point()
+ && p.is_point()
+ && cp.is_matching_closure_point(p))
+ i = i_next;
+ }
+ }
+}
+
+void
+PPL::Generator_System::insert(const Generator& g) {
+ Generator tmp = g;
+ insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Generator_System::insert_pending(const Generator& g) {
+ Generator tmp = g;
+ insert_pending(tmp, Recycle_Input());
+}
+
+void
+PPL::Generator_System::insert(Generator& g, Recycle_Input) {
+ // We are sure that the matrix has no pending rows
+ // and that the new row is not a pending generator.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ if (sys.topology() == g.topology())
+ sys.insert(g, Recycle_Input());
+ else
+ // `*this' and `g' have different topologies.
+ if (sys.is_necessarily_closed()) {
+ convert_into_non_necessarily_closed();
+ // Inserting the new generator.
+ sys.insert(g, Recycle_Input());
+ }
+ else {
+ // The generator system is NOT necessarily closed:
+ // copy the generator, adding the missing dimensions
+ // and the epsilon coefficient.
+ const dimension_type new_space_dim = std::max(g.space_dimension(),
+ space_dimension());
+ g.set_not_necessarily_closed();
+ g.set_space_dimension(new_space_dim);
+ // If it was a point, set the epsilon coordinate to 1
+ // (i.e., set the coefficient equal to the divisor).
+ // Note: normalization is preserved.
+ if (!g.is_line_or_ray())
+ g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+ // Inserting the new generator.
+ sys.insert(g, Recycle_Input());
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Generator_System::insert_pending(Generator& g, Recycle_Input) {
+ if (sys.topology() == g.topology())
+ sys.insert_pending(g, Recycle_Input());
+ else
+ // `*this' and `g' have different topologies.
+ if (sys.is_necessarily_closed()) {
+ convert_into_non_necessarily_closed();
+
+ // Inserting the new generator.
+ sys.insert_pending(g, Recycle_Input());
+ }
+ else {
+ // The generator system is NOT necessarily closed:
+ // copy the generator, adding the missing dimensions
+ // and the epsilon coefficient.
+ const dimension_type new_space_dim = std::max(g.space_dimension(),
+ space_dimension());
+ g.set_topology(NOT_NECESSARILY_CLOSED);
+ g.set_space_dimension(new_space_dim);
+ // If it was a point, set the epsilon coordinate to 1
+ // (i.e., set the coefficient equal to the divisor).
+ // Note: normalization is preserved.
+ if (!g.is_line_or_ray())
+ g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+ // Inserting the new generator.
+ sys.insert_pending(g, Recycle_Input());
+ }
+ PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_lines() const {
+ // We are sure that this method is applied only to a matrix
+ // that does not contain pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ const Generator_System& gs = *this;
+ dimension_type n = 0;
+ // If sys happens to be sorted, take advantage of the fact
+ // that lines are at the top of the system.
+ if (sys.is_sorted()) {
+ const dimension_type nrows = sys.num_rows();
+ for (dimension_type i = 0; i < nrows && gs[i].is_line(); ++i)
+ ++n;
+ }
+ else
+ for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+ if (gs[i].is_line())
+ ++n;
+ return n;
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_rays() const {
+ // We are sure that this method is applied only to a matrix
+ // that does not contain pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ const Generator_System& gs = *this;
+ dimension_type n = 0;
+ // If sys happens to be sorted, take advantage of the fact
+ // that rays and points are at the bottom of the system and
+ // rays have the inhomogeneous term equal to zero.
+ if (sys.is_sorted()) {
+ for (dimension_type i = sys.num_rows(); i != 0 && gs[--i].is_ray_or_point(); )
+ if (gs[i].is_line_or_ray())
+ ++n;
+ }
+ else
+ for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+ if (gs[i].is_ray())
+ ++n;
+ return n;
+}
+
+PPL::Poly_Con_Relation
+PPL::Generator_System::relation_with(const Constraint& c) const {
+ // Note: this method is not public and it is the responsibility
+ // of the caller to actually test for dimension compatibility.
+ // We simply assert it.
+ PPL_ASSERT(space_dimension() >= c.space_dimension());
+ // Number of generators: the case of an empty polyhedron
+ // has already been filtered out by the caller.
+ const dimension_type n_rows = sys.num_rows();
+ PPL_ASSERT(n_rows > 0);
+ const Generator_System& gs = *this;
+
+ // `result' will keep the relation holding between the generators
+ // we have seen so far and the constraint `c'.
+ Poly_Con_Relation result = Poly_Con_Relation::saturates();
+
+ switch (c.type()) {
+
+ case Constraint::EQUALITY:
+ {
+ // The hyperplane defined by the equality `c' is included
+ // in the set of points satisfying `c' (it is the same set!).
+ result = result && Poly_Con_Relation::is_included();
+ // The following integer variable will hold the scalar product sign
+ // of either the first point or the first non-saturating ray we find.
+ // If it is equal to 2, then it means that we haven't found such
+ // a generator yet.
+ int first_point_or_nonsaturating_ray_sign = 2;
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Generator& g = gs[i];
+ const int sp_sign = Scalar_Products::sign(c, g);
+ // Checking whether the generator saturates the equality.
+ // If that is the case, then we have to do something only if
+ // the generator is a point.
+ if (sp_sign == 0) {
+ if (g.is_point()) {
+ if (first_point_or_nonsaturating_ray_sign == 2)
+ // It is the first time that we find a point and
+ // we have not found a non-saturating ray yet.
+ first_point_or_nonsaturating_ray_sign = 0;
+ else
+ // We already found a point or a non-saturating ray.
+ if (first_point_or_nonsaturating_ray_sign != 0)
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ else
+ // Here we know that sp_sign != 0.
+ switch (g.type()) {
+
+ case Generator::LINE:
+ // If a line does not saturate `c', then there is a strict
+ // intersection between the points satisfying `c'
+ // and the points generated by `gs'.
+ return Poly_Con_Relation::strictly_intersects();
+
+ case Generator::RAY:
+ if (first_point_or_nonsaturating_ray_sign == 2) {
+ // It is the first time that we have a non-saturating ray
+ // and we have not found any point yet.
+ first_point_or_nonsaturating_ray_sign = sp_sign;
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ else
+ // We already found a point or a non-saturating ray.
+ if (sp_sign != first_point_or_nonsaturating_ray_sign)
+ return Poly_Con_Relation::strictly_intersects();
+ break;
+
+ case Generator::POINT:
+ case Generator::CLOSURE_POINT:
+ // NOTE: a non-saturating closure point is treated as
+ // a normal point.
+ if (first_point_or_nonsaturating_ray_sign == 2) {
+ // It is the first time that we find a point and
+ // we have not found a non-saturating ray yet.
+ first_point_or_nonsaturating_ray_sign = sp_sign;
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ else
+ // We already found a point or a non-saturating ray.
+ if (sp_sign != first_point_or_nonsaturating_ray_sign)
+ return Poly_Con_Relation::strictly_intersects();
+ break;
+ }
+ }
+ }
+ break;
+
+ case Constraint::NONSTRICT_INEQUALITY:
+ {
+ // The hyperplane implicitly defined by the non-strict inequality `c'
+ // is included in the set of points satisfying `c'.
+ result = result && Poly_Con_Relation::is_included();
+ // The following Boolean variable will be set to `false'
+ // as soon as either we find (any) point or we find a
+ // non-saturating ray.
+ bool first_point_or_nonsaturating_ray = true;
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Generator& g = gs[i];
+ const int sp_sign = Scalar_Products::sign(c, g);
+ // Checking whether the generator saturates the non-strict
+ // inequality. If that is the case, then we have to do something
+ // only if the generator is a point.
+ if (sp_sign == 0) {
+ if (g.is_point()) {
+ if (first_point_or_nonsaturating_ray)
+ // It is the first time that we have a point and
+ // we have not found a non-saturating ray yet.
+ first_point_or_nonsaturating_ray = false;
+ else
+ // We already found a point or a non-saturating ray before.
+ if (result == Poly_Con_Relation::is_disjoint())
+ // Since g saturates c, we have a strict intersection if
+ // none of the generators seen so far are included in `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ else
+ // Here we know that sp_sign != 0.
+ switch (g.type()) {
+
+ case Generator::LINE:
+ // If a line does not saturate `c', then there is a strict
+ // intersection between the points satisfying `c' and
+ // the points generated by `gs'.
+ return Poly_Con_Relation::strictly_intersects();
+
+ case Generator::RAY:
+ if (first_point_or_nonsaturating_ray) {
+ // It is the first time that we have a non-saturating ray
+ // and we have not found any point yet.
+ first_point_or_nonsaturating_ray = false;
+ result = (sp_sign > 0)
+ ? Poly_Con_Relation::is_included()
+ : Poly_Con_Relation::is_disjoint();
+ }
+ else {
+ // We already found a point or a non-saturating ray.
+ if ((sp_sign > 0
+ && result == Poly_Con_Relation::is_disjoint())
+ || (sp_sign < 0
+ && result.implies(Poly_Con_Relation::is_included())))
+ // We have a strict intersection if either:
+ // - `g' satisfies `c' but none of the generators seen
+ // so far are included in `c'; or
+ // - `g' does not satisfy `c' and all the generators
+ // seen so far are included in `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ if (sp_sign > 0)
+ // Here all the generators seen so far either saturate
+ // or are included in `c'.
+ // Since `g' does not saturate `c' ...
+ result = Poly_Con_Relation::is_included();
+ }
+ break;
+
+ case Generator::POINT:
+ case Generator::CLOSURE_POINT:
+ // NOTE: a non-saturating closure point is treated as
+ // a normal point.
+ if (first_point_or_nonsaturating_ray) {
+ // It is the first time that we have a point and
+ // we have not found a non-saturating ray yet.
+ // - If point `g' saturates `c', then all the generators
+ // seen so far saturate `c'.
+ // - If point `g' is included (but does not saturate) `c',
+ // then all the generators seen so far are included in `c'.
+ // - If point `g' does not satisfy `c', then all the
+ // generators seen so far are disjoint from `c'.
+ first_point_or_nonsaturating_ray = false;
+ if (sp_sign > 0)
+ result = Poly_Con_Relation::is_included();
+ else if (sp_sign < 0)
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ else {
+ // We already found a point or a non-saturating ray before.
+ if ((sp_sign > 0
+ && result == Poly_Con_Relation::is_disjoint())
+ || (sp_sign < 0
+ && result.implies(Poly_Con_Relation::is_included())))
+ // We have a strict intersection if either:
+ // - `g' satisfies or saturates `c' but none of the
+ // generators seen so far are included in `c'; or
+ // - `g' does not satisfy `c' and all the generators
+ // seen so far are included in `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ if (sp_sign > 0)
+ // Here all the generators seen so far either saturate
+ // or are included in `c'.
+ // Since `g' does not saturate `c' ...
+ result = Poly_Con_Relation::is_included();
+ }
+ break;
+ }
+ }
+ }
+ break;
+
+ case Constraint::STRICT_INEQUALITY:
+ {
+ // The hyperplane implicitly defined by the strict inequality `c'
+ // is disjoint from the set of points satisfying `c'.
+ result = result && Poly_Con_Relation::is_disjoint();
+ // The following Boolean variable will be set to `false'
+ // as soon as either we find (any) point or we find a
+ // non-saturating ray.
+ bool first_point_or_nonsaturating_ray = true;
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Generator& g = gs[i];
+ // Using the reduced scalar product operator to avoid
+ // both topology and space dimension mismatches.
+ const int sp_sign = Scalar_Products::reduced_sign(c, g);
+ // Checking whether the generator saturates the strict inequality.
+ // If that is the case, then we have to do something
+ // only if the generator is a point.
+ if (sp_sign == 0) {
+ if (g.is_point()) {
+ if (first_point_or_nonsaturating_ray)
+ // It is the first time that we have a point and
+ // we have not found a non-saturating ray yet.
+ first_point_or_nonsaturating_ray = false;
+ else
+ // We already found a point or a non-saturating ray before.
+ if (result == Poly_Con_Relation::is_included())
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ else
+ // Here we know that sp_sign != 0.
+ switch (g.type()) {
+
+ case Generator::LINE:
+ // If a line does not saturate `c', then there is a strict
+ // intersection between the points satisfying `c' and the points
+ // generated by `gs'.
+ return Poly_Con_Relation::strictly_intersects();
+
+ case Generator::RAY:
+ if (first_point_or_nonsaturating_ray) {
+ // It is the first time that we have a non-saturating ray
+ // and we have not found any point yet.
+ first_point_or_nonsaturating_ray = false;
+ result = (sp_sign > 0)
+ ? Poly_Con_Relation::is_included()
+ : Poly_Con_Relation::is_disjoint();
+ }
+ else {
+ // We already found a point or a non-saturating ray before.
+ if ((sp_sign > 0
+ && result.implies(Poly_Con_Relation::is_disjoint()))
+ ||
+ (sp_sign <= 0
+ && result == Poly_Con_Relation::is_included()))
+ return Poly_Con_Relation::strictly_intersects();
+ if (sp_sign < 0)
+ // Here all the generators seen so far either saturate
+ // or are disjoint from `c'.
+ // Since `g' does not saturate `c' ...
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ break;
+
+ case Generator::POINT:
+ case Generator::CLOSURE_POINT:
+ if (first_point_or_nonsaturating_ray) {
+ // It is the first time that we have a point and
+ // we have not found a non-saturating ray yet.
+ // - If point `g' saturates `c', then all the generators
+ // seen so far saturate `c'.
+ // - If point `g' is included in (but does not saturate) `c',
+ // then all the generators seen so far are included in `c'.
+ // - If point `g' strictly violates `c', then all the
+ // generators seen so far are disjoint from `c'.
+ first_point_or_nonsaturating_ray = false;
+ if (sp_sign > 0)
+ result = Poly_Con_Relation::is_included();
+ else if (sp_sign < 0)
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ else {
+ // We already found a point or a non-saturating ray before.
+ if ((sp_sign > 0
+ && result.implies(Poly_Con_Relation::is_disjoint()))
+ ||
+ (sp_sign <= 0
+ && result == Poly_Con_Relation::is_included()))
+ return Poly_Con_Relation::strictly_intersects();
+ if (sp_sign < 0)
+ // Here all the generators seen so far either saturate
+ // or are disjoint from `c'.
+ // Since `g' does not saturate `c' ...
+ result = Poly_Con_Relation::is_disjoint();
+ }
+ break;
+ }
+ }
+ }
+ break;
+ }
+ // We have seen all generators.
+ return result;
+}
+
+
+bool
+PPL::Generator_System::satisfied_by_all_generators(const Constraint& c) const {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ // Setting `sps' to the appropriate scalar product sign operator.
+ // This also avoids problems when having _legal_ topology mismatches
+ // (which could also cause a mismatch in the number of space dimensions).
+ const Topology_Adjusted_Scalar_Product_Sign sps(c);
+
+ const Generator_System& gs = *this;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ // Equalities must be saturated by all generators.
+ for (dimension_type i = gs.sys.num_rows(); i-- > 0; )
+ if (sps(c, gs[i]) != 0)
+ return false;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ // Non-strict inequalities must be saturated by lines and
+ // satisfied by all the other generators.
+ for (dimension_type i = gs.sys.num_rows(); i-- > 0; ) {
+ const Generator& g = gs[i];
+ const int sp_sign = sps(c, g);
+ if (g.is_line()) {
+ if (sp_sign != 0)
+ return false;
+ }
+ else
+ // `g' is a ray, point or closure point.
+ if (sp_sign < 0)
+ return false;
+ }
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ // Strict inequalities must be saturated by lines,
+ // satisfied by all generators, and must not be saturated by points.
+ for (dimension_type i = gs.sys.num_rows(); i-- > 0; ) {
+ const Generator& g = gs[i];
+ const int sp_sign = sps(c, g);
+ switch (g.type()) {
+ case Generator::POINT:
+ if (sp_sign <= 0)
+ return false;
+ break;
+ case Generator::LINE:
+ if (sp_sign != 0)
+ return false;
+ break;
+ default:
+ // `g' is a ray or closure point.
+ if (sp_sign < 0)
+ return false;
+ break;
+ }
+ }
+ break;
+ }
+ // If we reach this point, `c' is satisfied by all generators.
+ return true;
+}
+
+
+void
+PPL::Generator_System
+::affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ Generator_System& x = *this;
+ PPL_ASSERT(v.space_dimension() <= x.space_dimension());
+ PPL_ASSERT(expr.space_dimension() <= x.space_dimension());
+ PPL_ASSERT(denominator > 0);
+
+ const dimension_type n_rows = x.sys.num_rows();
+
+ // Compute the numerator of the affine transformation and assign it
+ // to the column of `*this' indexed by `v'.
+ PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Generator& row = sys.rows[i];
+ Scalar_Products::assign(numerator, expr, row.expr);
+ if (denominator != 1) {
+ // Since we want integer elements in the matrix,
+ // we multiply by `denominator' all the columns of `*this'
+ // having an index different from `v'.
+ // Note that this operation also modifies the coefficient of v, but
+ // it will be overwritten by the set_coefficient() below.
+ row.expr *= denominator;
+ }
+ row.expr.set_coefficient(v, numerator);
+ }
+
+ set_sorted(false);
+
+ // If the mapping is not invertible we may have transformed
+ // valid lines and rays into the origin of the space.
+ const bool not_invertible = (v.space_dimension() > expr.space_dimension()
+ || expr.coefficient(v) == 0);
+ if (not_invertible)
+ x.remove_invalid_lines_and_rays();
+
+ // TODO: Consider normalizing individual rows in the loop above.
+ // Strong normalization also resets the sortedness flag.
+ x.sys.strong_normalize();
+
+#ifndef NDEBUG
+ // Make sure that the (remaining) generators are still OK after fiddling
+ // with their internal data.
+ for (dimension_type i = x.num_rows(); i-- > 0; )
+ PPL_ASSERT(x.sys[i].OK());
+#endif
+
+ PPL_ASSERT(sys.OK());
+}
+
+void
+PPL::Generator_System::ascii_dump(std::ostream& s) const {
+ sys.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator_System)
+
+bool
+PPL::Generator_System::ascii_load(std::istream& s) {
+ if (!sys.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::Generator_System::remove_invalid_lines_and_rays() {
+ // The origin of the vector space cannot be a valid line/ray.
+ // NOTE: the following swaps will mix generators without even trying
+ // to preserve sortedness: as a matter of fact, it will almost always
+ // be the case that the input generator system is NOT sorted.
+
+ // Note that num_rows() is *not* constant, because it is decreased by
+ // remove_row().
+ for (dimension_type i = 0; i < num_rows(); ) {
+ const Generator& g = (*this)[i];
+ if (g.is_line_or_ray() && g.expr.all_homogeneous_terms_are_zero()) {
+ sys.remove_row(i, false);
+ set_sorted(false);
+ }
+ else
+ ++i;
+ }
+}
+
+const PPL::Generator_System* PPL::Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Generator_System::initialize() {
+ PPL_ASSERT(zero_dim_univ_p == 0);
+ zero_dim_univ_p
+ = new Generator_System(Generator::zero_dim_point());
+}
+
+void
+PPL::Generator_System::finalize() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ delete zero_dim_univ_p;
+ zero_dim_univ_p = 0;
+}
+
+bool
+PPL::Generator_System::OK() const {
+ return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator_System& gs) {
+ Generator_System::const_iterator i = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (i == gs_end)
+ return s << "false";
+ while (true) {
+ s << *i;
+ ++i;
+ if (i == gs_end)
+ return s;
+ s << ", ";
+ }
+}
+
diff --git a/src/Generator_System_defs.hh b/src/Generator_System_defs.hh
new file mode 100644
index 0000000..b93e929
--- /dev/null
+++ b/src/Generator_System_defs.hh
@@ -0,0 +1,744 @@
+/* Generator_System class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_System_defs_hh
+#define PPL_Generator_System_defs_hh 1
+
+#include "Generator_System_types.hh"
+
+#include "Linear_Expression_types.hh"
+#include "Linear_System_defs.hh"
+#include "Generator_defs.hh"
+#include "Constraint_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Polyhedron_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Generator_System
+ Writes <CODE>false</CODE> if \p gs is empty. Otherwise, writes on
+ \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Generator_System& x, const Generator_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Generator_System& x, const Generator_System& y);
+
+/*! \relates Generator_System */
+void
+swap(Generator_System& x, Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Generator_System is a system of generators,
+ i.e., a multiset of objects of the class Generator
+ (lines, rays, points and closure points).
+ When inserting generators in a system, space dimensions are automatically
+ adjusted so that all the generators in the system are defined
+ on the same vector space.
+ A system of generators which is meant to define a non-empty
+ polyhedron must include at least one point: the reason is that
+ lines, rays and closure points need a supporting point
+ (lines and rays only specify directions while closure points only
+ specify points in the topological closure of the NNC polyhedron).
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code defines the line having the same direction
+ as the \f$x\f$ axis (i.e., the first Cartesian axis)
+ in \f$\Rset^2\f$:
+ \code
+ Generator_System gs;
+ gs.insert(line(x + 0*y));
+ \endcode
+ As said above, this system of generators corresponds to
+ an empty polyhedron, because the line has no supporting point.
+ To define a system of generators that does correspond to
+ the \f$x\f$ axis, we can add the following code which
+ inserts the origin of the space as a point:
+ \code
+ gs.insert(point(0*x + 0*y));
+ \endcode
+ Since space dimensions are automatically adjusted, the following
+ code obtains the same effect:
+ \code
+ gs.insert(point(0*x));
+ \endcode
+ In contrast, if we had added the following code, we would have
+ defined a line parallel to the \f$x\f$ axis through
+ the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+ \code
+ gs.insert(point(0*x + 1*y));
+ \endcode
+
+ \par Example 2
+ The following code builds a ray having the same direction as
+ the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+ \code
+ Generator_System gs;
+ gs.insert(ray(x + 0*y));
+ \endcode
+ To define a system of generators indeed corresponding to the set
+ \f[
+ \bigl\{\,
+ (x, 0)^\transpose \in \Rset^2
+ \bigm|
+ x \geq 0
+ \,\bigr\},
+ \f]
+ one just has to add the origin:
+ \code
+ gs.insert(point(0*x + 0*y));
+ \endcode
+
+ \par Example 3
+ The following code builds a system of generators having four points
+ and corresponding to a square in \f$\Rset^2\f$
+ (the same as Example 1 for the system of constraints):
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 3*y));
+ gs.insert(point(3*x + 0*y));
+ gs.insert(point(3*x + 3*y));
+ \endcode
+
+ \par Example 4
+ By using closure points, we can define the \e kernel
+ (i.e., the largest open set included in a given set)
+ of the square defined in the previous example.
+ Note that a supporting point is needed and, for that purpose,
+ any inner point could be considered.
+ \code
+ Generator_System gs;
+ gs.insert(point(x + y));
+ gs.insert(closure_point(0*x + 0*y));
+ gs.insert(closure_point(0*x + 3*y));
+ gs.insert(closure_point(3*x + 0*y));
+ gs.insert(closure_point(3*x + 3*y));
+ \endcode
+
+ \par Example 5
+ The following code builds a system of generators having two points
+ and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+ (the same as Example 2 for the system of constraints):
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 1*y));
+ gs.insert(ray(x - y));
+ \endcode
+
+ \note
+ After inserting a multiset of generators in a generator system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> generator system
+ will be available, where original generators may have been
+ reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System {
+public:
+ typedef Generator row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of generators.
+ Generator_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Generator_System(const Generator& g,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Generator_System will have the same representation as `gs'.
+ Generator_System(const Generator_System& gs);
+
+ //! Copy constructor with specified representation.
+ Generator_System(const Generator_System& gs, Representation r);
+
+ //! Destructor.
+ ~Generator_System();
+
+ //! Assignment operator.
+ Generator_System& operator=(const Generator_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Generator_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ /*! \brief
+ Removes all the generators from the generator system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Inserts in \p *this a copy of the generator \p g,
+ increasing the number of space dimensions if needed.
+ */
+ void insert(const Generator& g);
+
+ /*! \brief
+ Inserts in \p *this the generator \p g, stealing its contents and
+ increasing the number of space dimensions if needed.
+ */
+ void insert(Generator& g, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only Generator::zero_dim_point().
+ */
+ static const Generator_System& zero_dim_univ();
+
+ typedef Generator_System_const_iterator const_iterator;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first generator,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Resizes the matrix of generators using the numbers of rows and columns
+ read from \p s, then initializes the coordinates of each generator
+ and its type reading the contents from \p s.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Generator_System& y);
+
+private:
+
+ bool has_no_rows() const;
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ dimension_type num_rows() const;
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ Topology topology() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Generator_System& y);
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most columns.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Generator_System& y);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Generator_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Generator_System& r);
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Generator::zero_dim_point().
+ */
+ static const Generator_System* zero_dim_univ_p;
+
+ friend class Generator_System_const_iterator;
+
+ //! Builds an empty system of generators having the specified topology.
+ explicit Generator_System(Topology topol,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a system of rays/points on a \p space_dim dimensional space. If
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+ dimension is added.
+ */
+ Generator_System(Topology topol, dimension_type space_dim,
+ Representation r = default_representation);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the \p new_topology and
+ \p new_space_dim (adding or removing columns if needed).
+ Returns <CODE>false</CODE> if and only if \p topol is
+ equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+ contains closure points.
+ */
+ bool adjust_topology_and_space_dimension(Topology new_topology,
+ dimension_type new_space_dim);
+
+ /*! \brief
+ For each unmatched closure point in \p *this, adds the
+ corresponding point.
+
+ It is assumed that the topology of \p *this
+ is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ */
+ void add_corresponding_points();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more points.
+ */
+ bool has_points() const;
+
+ /*! \brief
+ For each unmatched point in \p *this, adds the corresponding
+ closure point.
+
+ It is assumed that the topology of \p *this
+ is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ */
+ void add_corresponding_closure_points();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more closure points.
+
+ Note: the check for the presence of closure points is
+ done under the point of view of the user. Namely, we scan
+ the generator system using high-level iterators, so that
+ closure points that are matching the corresponding points
+ will be disregarded.
+ */
+ bool has_closure_points() const;
+
+ //! Converts this generator system into a non-necessarily closed generator
+ //! system.
+ void convert_into_non_necessarily_closed();
+
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Generator& operator[](dimension_type k) const;
+
+ /*! \brief
+ Returns the relations holding between the generator system
+ and the constraint \p c.
+ */
+ Parma_Polyhedra_Library::Poly_Con_Relation
+ relation_with(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ bool satisfied_by_all_generators(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ /*!
+ It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+ */
+ bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ /*!
+ It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+ */
+ bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is assigned;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We want to allow affine transformations (see the Introduction) having
+ any rational coefficients. Since the coefficients of the
+ constraints are integers we must also provide an integer \p denominator
+ that will be used as denominator of the affine transformation.
+ The denominator is required to be a positive integer.
+
+ The affine transformation assigns to each element of the column containing
+ the coefficients of v the follow expression:
+ \f[
+ \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+ {\mathrm{denominator}}.
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Returns the number of lines of the system.
+ dimension_type num_lines() const;
+
+ //! Returns the number of rays of the system.
+ dimension_type num_rays() const;
+
+ //! Removes all the invalid lines and rays.
+ /*!
+ The invalid lines and rays are those with all
+ the homogeneous terms set to zero.
+ */
+ void remove_invalid_lines_and_rays();
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as
+ to provide a partial simplification of the system of generators.
+
+ It is assumed that the system has no pending generators.
+ */
+ void simplify();
+
+ /*! \brief
+ Inserts in \p *this a copy of the generator \p g,
+ increasing the number of space dimensions if needed.
+ It is a pending generator.
+ */
+ void insert_pending(const Generator& g);
+
+ /*! \brief
+ Inserts in \p *this the generator \p g, stealing its contents and
+ increasing the number of space dimensions if needed.
+ It is a pending generator.
+ */
+ void insert_pending(Generator& g, Recycle_Input);
+
+ Linear_System<Generator> sys;
+
+ friend bool
+ operator==(const Generator_System& x, const Generator_System& y);
+
+ friend class Polyhedron;
+};
+
+//! An iterator over a system of generators
+/*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each generator contained in an object of Generator_System.
+
+ \par Example
+ The following code prints the system of generators
+ of the polyhedron <CODE>ph</CODE>:
+ \code
+const Generator_System& gs = ph.generators();
+for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ The same effect can be obtained more concisely by using
+ more features of the STL:
+ \code
+const Generator_System& gs = ph.generators();
+copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+ \endcode
+*/
+class Parma_Polyhedra_Library::Generator_System_const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Generator,
+ ptrdiff_t,
+ const Generator*,
+ const Generator&> {
+public:
+ //! Default constructor.
+ Generator_System_const_iterator();
+
+ //! Ordinary copy constructor.
+ Generator_System_const_iterator(const Generator_System_const_iterator& y);
+
+ //! Destructor.
+ ~Generator_System_const_iterator();
+
+ //! Assignment operator.
+ Generator_System_const_iterator& operator=(const Generator_System_const_iterator& y);
+
+ //! Dereference operator.
+ const Generator& operator*() const;
+
+ //! Indirect member selector.
+ const Generator* operator->() const;
+
+ //! Prefix increment operator.
+ Generator_System_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ Generator_System_const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const Generator_System_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const Generator_System_const_iterator& y) const;
+
+private:
+ friend class Generator_System;
+
+ //! The const iterator over the Linear_System.
+ Linear_System<Generator>::const_iterator i;
+
+ //! A const pointer to the Linear_System.
+ const Linear_System<Generator>* gsp;
+
+ //! Constructor.
+ Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+ const Generator_System& gsys);
+
+ /*! \brief
+ \p *this skips to the next generator, skipping those
+ closure points that are immediately followed by a matching point.
+ */
+ void skip_forward();
+};
+
+// Generator_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Generator_System_defs_hh)
diff --git a/src/Generator_System_inlines.hh b/src/Generator_System_inlines.hh
new file mode 100644
index 0000000..bd4cb43
--- /dev/null
+++ b/src/Generator_System_inlines.hh
@@ -0,0 +1,411 @@
+/* Generator_System class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_System_inlines_hh
+#define PPL_Generator_System_inlines_hh 1
+
+#include "Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g, Representation r)
+ : sys(g.topology(), r) {
+ sys.insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+ : sys(gs.sys) {
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs,
+ Representation r)
+ : sys(gs.sys, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol, Representation r)
+ : sys(topol, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+ const dimension_type space_dim,
+ Representation r)
+ : sys(topol, space_dim, r) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+ Generator_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Generator_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Generator_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+ return Linear_System<Generator>::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline void
+Generator_System::set_space_dimension(dimension_type space_dim) {
+ const dimension_type old_space_dim = space_dimension();
+ sys.set_space_dimension_no_ok(space_dim);
+
+ if (space_dim < old_space_dim)
+ // We may have invalid lines and rays now.
+ remove_invalid_lines_and_rays();
+
+#ifndef NDEBUG
+ for (dimension_type i = 0; i < sys.num_rows(); ++i)
+ PPL_ASSERT(sys[i].OK());
+#endif
+ PPL_ASSERT(sys.OK());
+ PPL_ASSERT(OK());
+}
+
+inline void
+Generator_System::clear() {
+ sys.clear();
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline void
+Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+ sys.remove_space_dimensions(vars);
+}
+
+inline void
+Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+ sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Generator_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+ sys.swap_space_dimensions(v1, v2);
+}
+
+inline dimension_type
+Generator_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline void
+Generator_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+ sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline Topology
+Generator_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Generator_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+inline void
+Generator_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Generator_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline bool
+Generator_System::is_sorted() const {
+ return sys.is_sorted();
+}
+
+inline void
+Generator_System::set_index_first_pending_row(dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline bool
+Generator_System::is_necessarily_closed() const {
+ return sys.is_necessarily_closed();
+}
+
+inline void
+Generator_System::assign_with_pending(const Generator_System& y) {
+ sys.assign_with_pending(y.sys);
+}
+
+inline dimension_type
+Generator_System::num_pending_rows() const {
+ return sys.num_pending_rows();
+}
+
+inline void
+Generator_System::sort_pending_and_remove_duplicates() {
+ return sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Generator_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ sys.sort_and_remove_with_sat(sat);
+}
+
+inline void
+Generator_System::sort_rows() {
+ sys.sort_rows();
+}
+
+inline bool
+Generator_System::check_sorted() const {
+ return sys.check_sorted();
+}
+
+inline dimension_type
+Generator_System::num_lines_or_equalities() const {
+ return sys.num_lines_or_equalities();
+}
+
+inline void
+Generator_System::remove_row(dimension_type i, bool keep_sorted) {
+ sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted) {
+ sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(const std::vector<dimension_type>& indexes) {
+ sys.remove_rows(indexes);
+}
+
+inline void
+Generator_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline dimension_type
+Generator_System::gauss(dimension_type n_lines_or_equalities) {
+ return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::back_substitute(dimension_type n_lines_or_equalities) {
+ sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::strong_normalize() {
+ sys.strong_normalize();
+}
+
+inline void
+Generator_System::merge_rows_assign(const Generator_System& y) {
+ sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Generator_System::insert(const Generator_System& y) {
+ sys.insert(y.sys);
+}
+
+inline void
+Generator_System::insert_pending(const Generator_System& r) {
+ sys.insert_pending(r.sys);
+}
+
+inline bool
+operator==(const Generator_System& x, const Generator_System& y) {
+ return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Generator_System& x, const Generator_System& y) {
+ return !(x == y);
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator()
+ : i(), gsp(0) {
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator(const Generator_System_const_iterator& y)
+ : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System_const_iterator::~Generator_System_const_iterator() {
+}
+
+inline
+Generator_System_const_iterator&
+Generator_System_const_iterator::operator=(const Generator_System_const_iterator& y) {
+ i = y.i;
+ gsp = y.gsp;
+ return *this;
+}
+
+inline const Generator&
+Generator_System_const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Generator*
+Generator_System_const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Generator_System_const_iterator&
+Generator_System_const_iterator::operator++() {
+ ++i;
+ if (!gsp->is_necessarily_closed())
+ skip_forward();
+ return *this;
+}
+
+inline Generator_System_const_iterator
+Generator_System_const_iterator::operator++(int) {
+ const Generator_System_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Generator_System_const_iterator::operator==(const Generator_System_const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Generator_System_const_iterator::operator!=(const Generator_System_const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Generator_System_const_iterator::
+Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+ const Generator_System& gs)
+ : i(iter), gsp(&gs.sys) {
+}
+
+inline bool
+Generator_System::empty() const {
+ return sys.has_no_rows();
+}
+
+inline bool
+Generator_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+ const_iterator i(sys.begin(), *this);
+ if (!sys.is_necessarily_closed())
+ i.skip_forward();
+ return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+ const const_iterator i(sys.end(), *this);
+ return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ return *zero_dim_univ_p;
+}
+
+inline void
+Generator_System::m_swap(Generator_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Generator_System::simplify() {
+ sys.simplify();
+ remove_invalid_lines_and_rays();
+}
+
+/*! \relates Generator_System */
+inline void
+swap(Generator_System& x, Generator_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_inlines_hh)
diff --git a/src/Generator_System_types.hh b/src/Generator_System_types.hh
new file mode 100644
index 0000000..f368654
--- /dev/null
+++ b/src/Generator_System_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_System_types_hh
+#define PPL_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+class Generator_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_types_hh)
diff --git a/src/Generator_defs.hh b/src/Generator_defs.hh
new file mode 100644
index 0000000..5bb204c
--- /dev/null
+++ b/src/Generator_defs.hh
@@ -0,0 +1,1033 @@
+/* Generator class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_defs_hh
+#define PPL_Generator_defs_hh 1
+
+#include "Generator_types.hh"
+#include "Scalar_Products_types.hh"
+#include "Variables_Set_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "MIP_Problem_types.hh"
+#include "Grid_types.hh"
+
+#include "Variable_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "distances_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Last_defs.hh"
+#include "Expression_Hide_Inhomo_defs.hh"
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Generator
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Generator& x, const Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Generator */
+void swap(Generator& x, Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Generator is one of the following:
+
+ - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a point
+ \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ - a closure point
+ \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ where \f$n\f$ is the dimension of the space
+ and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+ \par A note on terminology.
+ As observed in Section \ref representation, there are cases when,
+ in order to represent a polyhedron \f$\cP\f$ using the generator system
+ \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+ \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+ of \f$\cP\f$.
+ This situation is even more frequent when working with NNC polyhedra
+ and it is the reason why we prefer to use the word `point'
+ where other libraries use the word `vertex'.
+
+ \par How to build a generator.
+ Each type of generator is built by applying the corresponding
+ function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+ or <CODE>closure_point</CODE>) to a linear expression,
+ representing a direction in the space;
+ the space dimension of the generator is defined as the space dimension
+ of the corresponding linear expression.
+ Linear expressions used to define a generator should be homogeneous
+ (any constant term will be simply ignored).
+ When defining points and closure points, an optional Coefficient argument
+ can be used as a common <EM>divisor</EM> for all the coefficients
+ occurring in the provided linear expression;
+ the default value for this argument is 1.
+
+ \par
+ In all the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a line with direction \f$x-y-z\f$
+ and having space dimension \f$3\f$:
+ \code
+ Generator l = line(x - y - z);
+ \endcode
+ As mentioned above, the constant term of the linear expression
+ is not relevant. Thus, the following code has the same effect:
+ \code
+ Generator l = line(x - y - z + 15);
+ \endcode
+ By definition, the origin of the space is not a line, so that
+ the following code throws an exception:
+ \code
+ Generator l = line(0*x);
+ \endcode
+
+ \par Example 2
+ The following code builds a ray with the same direction as the
+ line in Example 1:
+ \code
+ Generator r = ray(x - y - z);
+ \endcode
+ As is the case for lines, when specifying a ray the constant term
+ of the linear expression is not relevant; also, an exception is thrown
+ when trying to build a ray from the origin of the space.
+
+ \par Example 3
+ The following code builds the point
+ \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+ \code
+ Generator p = point(1*x + 0*y + 2*z);
+ \endcode
+ The same effect can be obtained by using the following code:
+ \code
+ Generator p = point(x + 2*z);
+ \endcode
+ Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+ using either one of the following lines of code:
+ \code
+ Generator origin3 = point(0*x + 0*y + 0*z);
+ Generator origin3_alt = point(0*z);
+ \endcode
+ Note however that the following code would have defined
+ a different point, namely \f$\vect{0} \in \Rset^2\f$:
+ \code
+ Generator origin2 = point(0*y);
+ \endcode
+ The following two lines of code both define the only point
+ having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+ In the second case we exploit the fact that the first argument
+ of the function <CODE>point</CODE> is optional.
+ \code
+ Generator origin0 = Generator::zero_dim_point();
+ Generator origin0_alt = point();
+ \endcode
+
+ \par Example 4
+ The point \f$\vect{p}\f$ specified in Example 3 above
+ can also be obtained with the following code,
+ where we provide a non-default value for the second argument
+ of the function <CODE>point</CODE> (the divisor):
+ \code
+ Generator p = point(2*x + 0*y + 4*z, 2);
+ \endcode
+ Obviously, the divisor can be usefully exploited to specify
+ points having some non-integer (but rational) coordinates.
+ For instance, the point
+ \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be specified by the following code:
+ \code
+ Generator q = point(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par Example 5
+ Closure points are specified in the same way we defined points,
+ but invoking their specific constructor function.
+ For instance, the closure point
+ \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+ \code
+ Generator c = closure_point(1*x + 0*y + 2*z);
+ \endcode
+ For the particular case of the (only) closure point
+ having space dimension zero, we can use any of the following:
+ \code
+ Generator closure_origin0 = Generator::zero_dim_closure_point();
+ Generator closure_origin0_alt = closure_point();
+ \endcode
+
+ \par How to inspect a generator
+ Several methods are provided to examine a generator and extract
+ all the encoded information: its space dimension, its type and
+ the value of its integer coefficients.
+
+ \par Example 6
+ The following code shows how it is possible to access each single
+ coefficient of a generator.
+ If <CODE>g1</CODE> is a point having coordinates
+ \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+ we construct the closure point <CODE>g2</CODE> having coordinates
+ \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+ \code
+ if (g1.is_point()) {
+ cout << "Point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (dimension_type i = g1.space_dimension(); i-- > 0; )
+ e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+ Generator g2 = closure_point(e, g1.divisor());
+ cout << "Closure point g2: " << g2 << endl;
+ }
+ else
+ cout << "Generator g1 is not a point." << endl;
+ \endcode
+ Therefore, for the point
+ \code
+ Generator g1 = point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Point g1: p((2*A - B + 3*C)/2)
+ Closure point g2: cp((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with (closure) points, be careful not to confuse
+ the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+ these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator {
+public:
+
+ //! The representation used for new Generators.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Generator line(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the ray of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Generator ray(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Generator point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the origin.
+ static Generator point(Representation r);
+
+ //! Returns the point at \p e.
+ static Generator point(const Linear_Expression& e,
+ Representation r);
+
+ //! Constructs the point at the origin.
+ explicit Generator(Representation r = default_representation);
+
+ //! Returns the closure point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Generator
+ closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the closure point at the origin.
+ static Generator
+ closure_point(Representation r);
+
+ //! Returns the closure point at \p e.
+ static Generator
+ closure_point(const Linear_Expression& e, Representation r);
+
+ //! Ordinary copy constructor.
+ //! The representation of the new Generator will be the same as g.
+ Generator(const Generator& g);
+
+ //! Copy constructor with given representation.
+ Generator(const Generator& g, Representation r);
+
+ //! Copy constructor with given space dimension.
+ //! The representation of the new Generator will be the same as g.
+ Generator(const Generator& g, dimension_type space_dim);
+
+ //! Copy constructor with given representation and space dimension.
+ Generator(const Generator& g, dimension_type space_dim, Representation r);
+
+ //! Destructor.
+ ~Generator();
+
+ //! Assignment operator.
+ Generator& operator=(const Generator& g);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Generator can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the generator.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ If all dimensions with nonzero coefficients are removed from a ray or a
+ line, it is changed into a point and this method returns \p false .
+ Otherwise, it returns \p true .
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the generator.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a line. */
+ LINE,
+ /*! The generator is a ray. */
+ RAY,
+ /*! The generator is a point. */
+ POINT,
+ /*! The generator is a closure point. */
+ CLOSURE_POINT
+ };
+
+ //! Returns the generator type of \p *this.
+ Type type() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+ bool is_line() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+ bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_line_or_ray() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+ bool is_point() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+ bool is_closure_point() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the index of \p v is greater than or equal to the
+ space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! If \p *this is either a point or a closure point, returns its divisor.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is neither a point nor a closure point.
+ */
+ Coefficient_traits::const_reference divisor() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ static const Generator& zero_dim_point();
+
+ /*! \brief
+ Returns, as a closure point,
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Generator& zero_dim_closure_point();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are equivalent generators.
+
+ Generators having different space dimensions are not equivalent.
+ */
+ bool is_equivalent_to(const Generator& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent generators.
+ */
+ bool is_equal_to(const Generator& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Generator& y);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+ expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+ //! The possible kinds of Generator objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ //! The linear expression encoding \p *this.
+ Linear_Expression expr;
+
+ //! The kind of \p *this.
+ Kind kind_;
+
+ //! The topology of \p *this.
+ Topology topology_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Generator* zero_dim_point_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+ */
+ static const Generator* zero_dim_closure_point_p;
+
+ /*! \brief
+ Builds a generator of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+
+ If the topology is NNC, the last dimension of \p e is used as the epsilon
+ coefficient.
+ */
+ Generator(Linear_Expression& e, Type type, Topology topology);
+
+ Generator(Linear_Expression& e, Kind kind, Topology topology);
+
+ Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+ //@} // Flags coercion methods
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Generator that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Generator to \p *this and normalizes it.
+ */
+ void linear_combine(const Generator& y, dimension_type i);
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ Variable v) const;
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* reason) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+ bool is_ray_or_point() const;
+
+ //! Sets the Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_ray_or_point();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the closure point
+ \p *this has the same \e coordinates of the point \p p.
+
+ It is \e assumed that \p *this is a closure point, \p p is a point
+ and both topologies and space dimensions agree.
+ */
+ bool is_matching_closure_point(const Generator& p) const;
+
+ //! Returns the epsilon coefficient. The generator must be NNC.
+ Coefficient_traits::const_reference epsilon_coefficient() const;
+
+ //! Sets the epsilon coefficient to \p n. The generator must be NNC.
+ void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Generator objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Generator::normalize() and Generator::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ /*! \brief
+ A print function, with fancy, more human-friendly output.
+
+ This is used by operator<<().
+ */
+ void fancy_print(std::ostream& s) const;
+
+ friend class Expression_Adapter<Generator>;
+ friend class Linear_System<Generator>;
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+ friend class Parma_Polyhedra_Library::Generator_System;
+ friend class Parma_Polyhedra_Library::Generator_System_const_iterator;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ // This is for access to Linear_Expression in `insert'.
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+ friend class Parma_Polyhedra_Library::MIP_Problem;
+ friend class Parma_Polyhedra_Library::Grid;
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Generator& g);
+
+ friend int
+ compare(const Generator& x, const Generator& y);
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator::line(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e,
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::ray(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e,
+ Representation r = Generator::default_representation);
+
+/*! \brief
+ Shorthand for
+ Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::point(Representation r).
+/*! \relates Generator */
+Generator
+point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::point(const Linear_Expression& e, Representation r).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e, Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::closure_point(Representation r).
+/*! \relates Generator */
+Generator
+closure_point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::closure_point(const Linear_Expression& e, Representation r).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Generator_inlines.hh"
+
+#endif // !defined(PPL_Generator_defs_hh)
diff --git a/src/Generator_inlines.hh b/src/Generator_inlines.hh
new file mode 100644
index 0000000..8de552b
--- /dev/null
+++ b/src/Generator_inlines.hh
@@ -0,0 +1,709 @@
+/* Generator class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_inlines_hh
+#define PPL_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Generator::is_necessarily_closed() const {
+ return (topology() == NECESSARILY_CLOSED);
+}
+
+inline bool
+Generator::is_not_necessarily_closed() const {
+ return (topology() == NOT_NECESSARILY_CLOSED);
+}
+
+inline Generator::expr_type
+Generator::expression() const {
+ return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline bool
+Generator::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Generator::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Generator::topology() const {
+ return topology_;
+}
+
+inline void
+Generator::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Generator::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Generator::set_topology(Topology x) {
+ if (topology() == x)
+ return;
+ if (topology() == NECESSARILY_CLOSED) {
+ // Add a column for the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ }
+ else {
+ PPL_ASSERT(expr.space_dimension() > 0);
+ expr.set_space_dimension(expr.space_dimension() - 1);
+ }
+ topology_ = x;
+}
+
+inline void
+Generator::mark_as_necessarily_closed() {
+ PPL_ASSERT(is_not_necessarily_closed());
+ topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(is_necessarily_closed());
+ topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Generator::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Generator::Generator(Representation r)
+ : expr(r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY),
+ topology_(NECESSARILY_CLOSED) {
+ expr.set_inhomogeneous_term(Coefficient_one());
+ PPL_ASSERT(space_dimension() == 0);
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r)
+ : expr(r),
+ kind_(kind),
+ topology_(topology) {
+ if (is_necessarily_closed())
+ expr.set_space_dimension(space_dim);
+ else
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology)
+ : topology_(topology) {
+ PPL_ASSERT(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ if (type == LINE)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ strong_normalize();
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Kind kind, Topology topology)
+ : kind_(kind),
+ topology_(topology) {
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ strong_normalize();
+}
+
+inline
+Generator::Generator(const Generator& g)
+ : expr(g.expr),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+}
+
+inline
+Generator::Generator(const Generator& g, Representation r)
+ : expr(g.expr, r),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ // This does not assert OK() because it's called by OK().
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim)
+ : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim,
+ Representation r)
+ : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+ Generator tmp = g;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Representation
+Generator::representation() const {
+ return expr.representation();
+}
+
+inline void
+Generator::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+ const dimension_type old_expr_space_dim = expr.space_dimension();
+ if (topology() == NECESSARILY_CLOSED) {
+ expr.set_space_dimension(space_dim);
+ }
+ else {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+ if (expr.space_dimension() < old_expr_space_dim)
+ strong_normalize();
+}
+
+inline void
+Generator::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Generator::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Generator::is_line() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+ return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+ return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+ if (is_line())
+ return LINE;
+ if (is_line_or_ray())
+ return RAY;
+ if (is_necessarily_closed())
+ return POINT;
+ else {
+ // Checking the value of the epsilon coefficient.
+ if (epsilon_coefficient() == 0)
+ return CLOSURE_POINT;
+ else
+ return POINT;
+ }
+}
+
+inline bool
+Generator::is_point() const {
+ return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+ return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+ set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+ Coefficient_traits::const_reference d = expr.inhomogeneous_term();
+ if (!is_ray_or_point() || d == 0)
+ throw_invalid_argument("divisor()",
+ "*this is neither a point nor a closure point");
+ return d;
+}
+
+inline Coefficient_traits::const_reference
+Generator::epsilon_coefficient() const {
+ PPL_ASSERT(is_not_necessarily_closed());
+ return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+
+inline void
+Generator::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+ PPL_ASSERT(is_not_necessarily_closed());
+ expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Generator::strong_normalize() {
+ expr.normalize();
+ sign_normalize();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ return *zero_dim_point_p;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+ PPL_ASSERT(zero_dim_closure_point_p != 0);
+ return *zero_dim_closure_point_p;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e, Representation r) {
+ return Generator::line(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e, Representation r) {
+ return Generator::ray(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d,
+ Representation r) {
+ return Generator::point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(Representation r) {
+ return Generator::point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Representation r) {
+ return Generator::point(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ return Generator::closure_point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(Representation r) {
+ return Generator::closure_point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Representation r) {
+ return Generator::closure_point(e, r);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+ return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+
+ expr.ascii_dump(s);
+
+ s << " ";
+
+ switch (type()) {
+ case Generator::LINE:
+ s << "L ";
+ break;
+ case Generator::RAY:
+ s << "R ";
+ break;
+ case Generator::POINT:
+ s << "P ";
+ break;
+ case Generator::CLOSURE_POINT:
+ s << "C ";
+ break;
+ }
+ if (is_necessarily_closed())
+ s << "(C)";
+ else
+ s << "(NNC)";
+ s << "\n";
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+ std::string str;
+
+ expr.ascii_load(s);
+
+ if (!(s >> str))
+ return false;
+ if (str == "L")
+ set_is_line();
+ else if (str == "R" || str == "P" || str == "C")
+ set_is_ray_or_point();
+ else
+ return false;
+
+ std::string str2;
+
+ if (!(s >> str2))
+ return false;
+ if (str2 == "(C)") {
+ if (is_not_necessarily_closed())
+ // TODO: Avoid using the mark_as_*() methods if possible.
+ mark_as_necessarily_closed();
+ }
+ else {
+ if (str2 == "(NNC)") {
+ if (is_necessarily_closed())
+ // TODO: Avoid using the mark_as_*() methods if possible.
+ mark_as_not_necessarily_closed();
+ }
+ else
+ return false;
+ }
+
+ // Checking for equality of actual and declared types.
+ switch (type()) {
+ case Generator::LINE:
+ if (str != "L")
+ return false;
+ break;
+ case Generator::RAY:
+ if (str != "R")
+ return false;
+ break;
+ case Generator::POINT:
+ if (str != "P")
+ return false;
+ break;
+ case Generator::CLOSURE_POINT:
+ if (str != "C")
+ return false;
+ break;
+ }
+
+ return true;
+}
+
+inline void
+Generator::m_swap(Generator& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+ swap(topology_, y.topology_);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Generator kind compatibility check: we only compute distances
+ // between (closure) points.
+ if (x.is_line_or_ray() || y.is_line_or_ray())
+ return false;
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // All zero-dim generators have distance zero.
+ if (x_space_dim == 0) {
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ PPL_DIRTY_TEMP(mpq_class, x_coord);
+ PPL_DIRTY_TEMP(mpq_class, y_coord);
+ PPL_DIRTY_TEMP(mpq_class, x_div);
+ PPL_DIRTY_TEMP(mpq_class, y_div);
+ assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+ assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ // TODO: This loop can be optimized more, if needed.
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+ assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+
+ if (x_coord > y_coord) {
+ maybe_assign(tmp1p, tmp1, x_coord, dir);
+ maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_coord, dir);
+ maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+inline void
+swap(Generator& x, Generator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_inlines_hh)
diff --git a/src/Generator_types.hh b/src/Generator_types.hh
new file mode 100644
index 0000000..f2a7178
--- /dev/null
+++ b/src/Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_types_hh
+#define PPL_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_types_hh)
diff --git a/src/Grid_Certificate.cc b/src/Grid_Certificate.cc
new file mode 100644
index 0000000..d535b5f
--- /dev/null
+++ b/src/Grid_Certificate.cc
@@ -0,0 +1,108 @@
+/* Grid_Certificate class implementation
+ (non-inline member functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Certificate_defs.hh"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid_Certificate::Grid_Certificate(const Grid& gr)
+ : num_equalities(0), num_proper_congruences(0) {
+
+ // As in Polyhedron assume that `gr' contains at least one point.
+ PPL_ASSERT(!gr.marked_empty());
+ if (gr.space_dimension() == 0)
+ return;
+ // One of the systems must be in minimal form.
+ if (gr.congruences_are_up_to_date()) {
+ if (gr.congruences_are_minimized()) {
+ num_proper_congruences = gr.con_sys.num_proper_congruences();
+ num_equalities = gr.con_sys.num_equalities();
+ }
+ else
+ if (gr.generators_are_up_to_date() && gr.generators_are_minimized()) {
+ // Calculate number of congruences from generators.
+ num_proper_congruences
+ = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+ num_equalities = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
+ }
+ else {
+ // Minimize `gr' congruence system. As in Polyhedron assume
+ // that `gr' contains at least one point.
+ Grid& mgr = const_cast<Grid&>(gr);
+ const bool empty = Grid::simplify(mgr.con_sys, mgr.dim_kinds);
+ // Avoid possible compiler warning.
+ PPL_USED(empty);
+ PPL_ASSERT(!empty);
+ mgr.set_congruences_minimized();
+
+ num_proper_congruences = mgr.con_sys.num_proper_congruences();
+ num_equalities = mgr.con_sys.num_equalities();
+ }
+ }
+ else {
+ if (!gr.generators_are_minimized()) {
+ // Minimize `gr' generator system. As in Polyhedron assume that
+ // `gr' contains at least one point.
+ Grid& mgr = const_cast<Grid&>(gr);
+ Grid::simplify(mgr.gen_sys, mgr.dim_kinds);
+ // If gen_sys contained rows before being reduced, it should
+ // contain at least a single point afterward.
+ PPL_ASSERT(!mgr.gen_sys.empty());
+ mgr.set_generators_minimized();
+ }
+ // Calculate number of congruences from generators.
+ num_proper_congruences
+ = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+ num_equalities
+ = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
+ }
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid_Certificate& y) const {
+ PPL_ASSERT(OK() && y.OK());
+ if (num_equalities == y.num_equalities) {
+ if (num_proper_congruences == y.num_proper_congruences)
+ return 0;
+ else
+ return (num_proper_congruences > y.num_proper_congruences) ? 1 : -1;
+ }
+ return (num_equalities > y.num_equalities) ? 1 : -1;
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid& gr) const {
+ const Grid_Certificate gc(gr);
+ return compare(gc);
+}
+
+bool
+PPL::Grid_Certificate::OK() const {
+ // There is nothing to test.
+ return true;
+}
diff --git a/src/Grid_Certificate_defs.hh b/src/Grid_Certificate_defs.hh
new file mode 100644
index 0000000..5aaac9a
--- /dev/null
+++ b/src/Grid_Certificate_defs.hh
@@ -0,0 +1,104 @@
+/* Grid_Certificate class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_defs_hh
+#define PPL_Grid_Certificate_defs_hh 1
+
+#include "Grid_Certificate_types.hh"
+
+#include "Grid_types.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+
+ \note
+ Each convergence certificate has to be used together with a
+ compatible widening operator. In particular, Grid_Certificate can
+ certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+ //! Default constructor.
+ Grid_Certificate();
+
+ //! Constructor: computes the certificate for \p gr.
+ Grid_Certificate(const Grid& gr);
+
+ //! Copy constructor.
+ Grid_Certificate(const Grid_Certificate& y);
+
+ //! Destructor.
+ ~Grid_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+ */
+ int compare(const Grid_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for grid \p gr.
+ int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the certificate for grid
+ \p gr is strictly smaller than \p *this.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_stabilizing(const Grid& gr) const;
+
+ //! A total ordering on Grid certificates.
+ /*!
+ This binary predicate defines a total ordering on Grid certificates
+ which is used when storing information about sets of grids.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const Grid_Certificate& x,
+ const Grid_Certificate& y) const;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+private:
+ //! Number of a equalities in a minimized congruence system for the
+ //! grid.
+ dimension_type num_equalities;
+ //! Number of a proper congruences in a minimized congruence system
+ //! for the grid.
+ dimension_type num_proper_congruences;
+};
+
+#include "Grid_Certificate_inlines.hh"
+
+#endif // !defined(PPL_Grid_Certificate_defs_hh)
diff --git a/src/Grid_Certificate_inlines.hh b/src/Grid_Certificate_inlines.hh
new file mode 100644
index 0000000..35d3433
--- /dev/null
+++ b/src/Grid_Certificate_inlines.hh
@@ -0,0 +1,61 @@
+/* Grid_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_inlines_hh
+#define PPL_Grid_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+ : num_equalities(0), num_proper_congruences(0) {
+ // This is the certificate for a zero-dim universe grid.
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+ : num_equalities(y.num_equalities),
+ num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+ return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+ const Grid_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Certificate_inlines_hh)
diff --git a/src/Grid_Certificate_types.hh b/src/Grid_Certificate_types.hh
new file mode 100644
index 0000000..d825c8e
--- /dev/null
+++ b/src/Grid_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Certificate_types_hh
+#define PPL_Grid_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+#endif // !defined(PPL_Grid_Certificate_types_hh)
diff --git a/src/Grid_Generator.cc b/src/Grid_Generator.cc
new file mode 100644
index 0000000..24022fd
--- /dev/null
+++ b/src/Grid_Generator.cc
@@ -0,0 +1,479 @@
+/* Grid_Generator class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Generator_defs.hh"
+
+#include "Variables_Set_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator::throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ const Variable v) const {
+ std::ostringstream s;
+ s << "PPL::Grid_Generator::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid_Generator::throw_invalid_argument(const char* method,
+ const char* reason) const {
+ std::ostringstream s;
+ s << "PPL::Grid_Generator::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::parameter(e, d):\n"
+ "d == 0.");
+ // Add 1 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e, e.space_dimension() + 1, r);
+
+ ec.set_inhomogeneous_term(Coefficient_zero());
+ const Variable divisor_var(e.space_dimension());
+ ec.set(divisor_var, d);
+
+ // If the divisor is negative, negate it and all the coefficients of
+ // the parameter, so as to satisfy the invariant.
+ if (d < 0)
+ neg_assign(ec);
+
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ const Grid_Generator gg(ec, PARAMETER);
+
+ // NOTE: normalize() must *not* be called here, because this is a parameter,
+ // and it would change the represented parameter.
+ return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::grid_point(e, d):\n"
+ "d == 0.");
+ // Add 1 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e, 1 + e.space_dimension(), r);
+ ec.set_inhomogeneous_term(d);
+
+ // If the divisor is negative, negate it and all the coefficients of
+ // the point, so as to satisfy the invariant.
+ if (d < 0)
+ neg_assign(ec);
+
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ Grid_Generator gg(ec, POINT);
+
+ // Enforce normalization.
+ gg.expr.normalize();
+ return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(Representation r) {
+ return grid_point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(const Linear_Expression& e,
+ Representation r) {
+ return grid_point(e, Coefficient_one(), r);
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_line(const Linear_Expression& e, Representation r) {
+ // The origin of the space cannot be a line.
+ if (e.all_homogeneous_terms_are_zero())
+ throw std::invalid_argument("PPL::grid_line(e):\n"
+ "e == 0, but the origin cannot be a line.");
+
+ // Add 1 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e, 1 + e.space_dimension(), r);
+ ec.set_inhomogeneous_term(Coefficient_zero());
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ Grid_Generator gg(ec, LINE);
+
+ // Enforce normalization.
+ gg.strong_normalize();
+ return gg;
+}
+
+void
+PPL::Grid_Generator::swap_space_dimensions(Variable v1, Variable v2) {
+ PPL_ASSERT(v1.space_dimension() <= space_dimension());
+ PPL_ASSERT(v2.space_dimension() <= space_dimension());
+ expr.swap_space_dimensions(v1, v2);
+ // *this is still normalized but it may not be strongly normalized.
+ if (!is_parameter())
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+bool
+PPL::Grid_Generator::remove_space_dimensions(const Variables_Set& vars) {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+
+ expr.remove_space_dimensions(vars);
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::Grid_Generator
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ if (cycle.size() < 2)
+ // No-op. No need to call sign_normalize().
+ return;
+
+ expr.permute_space_dimensions(cycle);
+
+ // *this is still normalized but may be not strongly normalized: sign
+ // normalization is necessary.
+ // Sign-normalizing a parameter changes its meaning, so do nothing for
+ // parameters.
+ if (!is_parameter())
+ sign_normalize();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator::ascii_dump(std::ostream& s) const {
+ expr.ascii_dump(s);
+ s << ' ';
+ switch (type()) {
+ case LINE:
+ s << "L";
+ break;
+ case PARAMETER:
+ s << "Q";
+ break;
+ case POINT:
+ s << "P";
+ break;
+ }
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator)
+
+bool
+PPL::Grid_Generator::ascii_load(std::istream& s) {
+
+ if (!expr.ascii_load(s))
+ return false;
+
+ std::string str;
+
+ if (!(s >> str))
+ return false;
+ if (str == "L")
+ set_is_line();
+ else if (str == "P" || str == "Q")
+ set_is_parameter_or_point();
+ else
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::Grid_Generator::set_is_parameter() {
+ if (is_line())
+ set_is_parameter_or_point();
+ else if (!is_line_or_parameter()) {
+ // The grid generator is a point.
+ expr.set(Variable(expr.space_dimension() - 1), expr.inhomogeneous_term());
+ expr.set_inhomogeneous_term(Coefficient_zero());
+ }
+}
+
+void
+PPL::Grid_Generator::linear_combine(const Grid_Generator& y,
+ dimension_type i) {
+ expr.linear_combine(y.expr, i);
+ strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+int
+PPL::compare(const Grid_Generator& x, const Grid_Generator& y) {
+ const bool x_is_line_or_equality = x.is_line_or_equality();
+ const bool y_is_line_or_equality = y.is_line_or_equality();
+ if (x_is_line_or_equality != y_is_line_or_equality)
+ // Equalities (lines) precede inequalities (ray/point).
+ return y_is_line_or_equality ? 2 : -2;
+
+ return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
+ const Grid_Generator& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ const Type x_type = x.type();
+ if (x_type != y.type())
+ return false;
+
+ Grid_Generator tmp_x = *this;
+ Grid_Generator tmp_y = y;
+ const Variable last_var(x_space_dim);
+ if (x_type == POINT || x_type == LINE) {
+ tmp_x.expr.set(last_var, Coefficient_zero());
+ tmp_y.expr.set(last_var, Coefficient_zero());
+ }
+ // Normalize the copies, including the divisor column.
+ tmp_x.expr.normalize();
+ tmp_y.expr.normalize();
+ // Check for equality.
+ return tmp_x.is_equal_to(tmp_y);
+}
+
+bool
+PPL::Grid_Generator::is_equal_to(const Grid_Generator& y) const {
+ return expr.is_equal_to(y.expr) && kind_ == y.kind_;
+}
+
+bool
+PPL::Grid_Generator::all_homogeneous_terms_are_zero() const {
+ // This does not check neither the first nor the last coefficient.
+ return expr.all_zeroes(1, expr.space_dimension());
+}
+
+void
+PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
+ PPL_ASSERT(d != 0);
+ if (is_line())
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(factor);
+ exact_div_assign(factor, d, divisor());
+ set_divisor(d);
+ PPL_ASSERT(factor > 0);
+ if (factor > 1)
+ // Don't scale the first and last coefficients.
+ expr.mul_assign(factor, 1, expr.space_dimension());
+}
+
+void
+PPL::Grid_Generator::sign_normalize() {
+ if (is_line_or_equality())
+ expr.sign_normalize();
+}
+
+bool
+PPL::Grid_Generator::check_strong_normalized() const {
+ Grid_Generator tmp = *this;
+ tmp.strong_normalize();
+ return compare(*this, tmp) == 0;
+}
+
+const PPL::Grid_Generator* PPL::Grid_Generator::zero_dim_point_p = 0;
+
+void
+PPL::Grid_Generator::initialize() {
+ PPL_ASSERT(zero_dim_point_p == 0);
+ zero_dim_point_p = new Grid_Generator(grid_point());
+}
+
+void
+PPL::Grid_Generator::finalize() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ delete zero_dim_point_p;
+ zero_dim_point_p = 0;
+}
+
+void
+PPL::Grid_Generator::fancy_print(std::ostream& s) const {
+ bool need_divisor = false;
+ bool extra_parentheses = false;
+ const dimension_type num_variables = space_dimension();
+ const Grid_Generator::Type t = type();
+ switch (t) {
+ case Grid_Generator::LINE:
+ s << "l(";
+ break;
+ case Grid_Generator::PARAMETER:
+ s << "q(";
+ if (expr.coefficient(Variable(num_variables)) == 1)
+ break;
+ goto any_point;
+ case Grid_Generator::POINT:
+ s << "p(";
+ if (expr.inhomogeneous_term() > 1) {
+ any_point:
+ need_divisor = true;
+ if (!expr.all_zeroes(1, num_variables + 1)) {
+ extra_parentheses = true;
+ s << "(";
+ break;
+ }
+ }
+ break;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+ bool first = true;
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+ c = *i;
+ if (!first) {
+ if (c > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(c);
+ }
+ }
+ else
+ first = false;
+ if (c == -1)
+ s << "-";
+ else if (c != 1)
+ s << c << "*";
+ IO_Operators::operator<<(s, i.variable());
+ }
+ if (first)
+ // A grid generator in the origin.
+ s << 0;
+ if (extra_parentheses)
+ s << ")";
+ if (need_divisor)
+ s << "/" << divisor();
+ s << ")";
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
+ g.fancy_print(s);
+ return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+ const Grid_Generator::Type& t) {
+ const char* n = 0;
+ switch (t) {
+ case Grid_Generator::LINE:
+ n = "LINE";
+ break;
+ case Grid_Generator::PARAMETER:
+ n = "PARAMETER";
+ break;
+ case Grid_Generator::POINT:
+ n = "POINT";
+ break;
+ }
+ s << n;
+ return s;
+}
+
+bool
+PPL::Grid_Generator::OK() const {
+ // NOTE: do not check for normalization, as it does not hold.
+ const Grid_Generator& x = *this;
+
+ if (!x.is_necessarily_closed()) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator should be necessarily closed.\n";
+#endif
+ return false;
+ }
+
+ if (x.expr.space_dimension() < 1) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator has fewer coefficients than the minimum "
+ << "allowed:\nspace dimension is " << x.expr.space_dimension()
+ << ", minimum is 1.\n";
+#endif
+ return false;
+ }
+
+ switch (x.type()) {
+ case Grid_Generator::LINE:
+ if (x.expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+ std::cerr << "Inhomogeneous terms of lines must be zero!\n";
+#endif
+ return false;
+ }
+ break;
+
+ case Grid_Generator::PARAMETER:
+ if (x.expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+ std::cerr << "Inhomogeneous terms of parameters must be zero!\n";
+#endif
+ return false;
+ }
+ if (x.divisor() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Parameters must have positive divisors!\n";
+#endif
+ return false;
+ }
+ break;
+
+ case Grid_Generator::POINT:
+ if (x.expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Points must have positive divisors!\n";
+#endif
+ return false;
+ }
+ if (x.expr.coefficient(Variable(space_dimension())) != 0) {
+#ifndef NDEBUG
+ std::cerr << "Points must have a zero parameter divisor!\n";
+#endif
+ return false;
+ }
+ break;
+
+ } // switch (x.type())
+
+ // All tests passed.
+ return true;
+}
diff --git a/src/Grid_Generator_System.cc b/src/Grid_Generator_System.cc
new file mode 100644
index 0000000..762aa27
--- /dev/null
+++ b/src/Grid_Generator_System.cc
@@ -0,0 +1,298 @@
+/* Grid_Generator_System class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator_System::insert(Grid_Generator_System& gs, Recycle_Input) {
+ const dimension_type gs_num_rows = gs.num_rows();
+
+ if (space_dimension() < gs.space_dimension())
+ set_space_dimension(gs.space_dimension());
+ else
+ gs.set_space_dimension(space_dimension());
+
+ for (dimension_type i = 0; i < gs_num_rows; ++i)
+ sys.insert(gs.sys.rows[i], Recycle_Input());
+
+ gs.clear();
+
+ unset_pending_rows();
+}
+
+void
+PPL::Grid_Generator_System::insert(const Grid_Generator& g) {
+ Grid_Generator tmp(g, representation());
+ insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Grid_Generator_System::insert(Grid_Generator& g, Recycle_Input) {
+ if (g.is_parameter() && g.all_homogeneous_terms_are_zero()) {
+ // There is no need to add the origin as a parameter,
+ // as it will be immediately flagged as redundant.
+ // However, we still have to adjust space dimension.
+ if (space_dimension() < g.space_dimension())
+ set_space_dimension(g.space_dimension());
+ return;
+ }
+
+ sys.insert(g, Recycle_Input());
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator_System
+::affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // This is mostly a copy of Generator_System::affine_image.
+
+ Grid_Generator_System& x = *this;
+ PPL_ASSERT(v.space_dimension() <= x.sys.space_dimension());
+ PPL_ASSERT(expr.space_dimension() <= x.sys.space_dimension());
+ PPL_ASSERT(denominator > 0);
+
+ const dimension_type num_rows = x.num_rows();
+
+ // Compute the numerator of the affine transformation and assign it
+ // to the column of `*this' indexed by `v'.
+ PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Grid_Generator& row = sys.rows[i];
+ Scalar_Products::assign(numerator, expr, row.expr);
+ if (denominator != 1) {
+ // Since we want integer elements in the matrix,
+ // we multiply by `denominator' all the columns of `*this'
+ // having an index different from `v'.
+ // Note that this operation also modifies the coefficient of v, but
+ // it will be overwritten by the set_coefficient() below.
+ row.expr *= denominator;
+ }
+ row.expr.set_coefficient(v, numerator);
+ // Check that the row is stll OK after fiddling with its internal data.
+ PPL_ASSERT(row.OK());
+ }
+
+ PPL_ASSERT(sys.OK());
+
+ // If the mapping is not invertible we may have transformed valid
+ // lines and rays into the origin of the space.
+ const bool not_invertible = (v.space_dimension() >= expr.space_dimension()
+ || expr.coefficient(v) == 0);
+ if (not_invertible)
+ x.remove_invalid_lines_and_parameters();
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator_System)
+
+void
+PPL::Grid_Generator_System::ascii_dump(std::ostream& s) const {
+ sys.ascii_dump(s);
+}
+
+bool
+PPL::Grid_Generator_System::ascii_load(std::istream& s) {
+ if (!sys.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+const PPL::Grid_Generator_System*
+PPL::Grid_Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Grid_Generator_System::initialize() {
+ PPL_ASSERT(zero_dim_univ_p == 0);
+ zero_dim_univ_p
+ = new Grid_Generator_System(Grid_Generator::zero_dim_point());
+}
+
+void
+PPL::Grid_Generator_System::finalize() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ delete zero_dim_univ_p;
+ zero_dim_univ_p = 0;
+}
+
+bool
+PPL::Grid_Generator_System::OK() const {
+ if (sys.topology() == NOT_NECESSARILY_CLOSED) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator_System is NOT_NECESSARILY_CLOSED"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (sys.is_sorted()) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator_System is marked as sorted."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+ const Grid_Generator_System& gs) {
+ Grid_Generator_System::const_iterator i = gs.begin();
+ const Grid_Generator_System::const_iterator gs_end = gs.end();
+ if (i == gs_end)
+ return s << "false";
+ while (true) {
+ s << *i;
+ ++i;
+ if (i == gs_end)
+ return s;
+ s << ", ";
+ }
+}
+
+void
+PPL::Grid_Generator_System
+::add_universe_rows_and_columns(dimension_type dims) {
+ dimension_type col = sys.space_dimension();
+
+ set_space_dimension(space_dimension() + dims);
+
+ // Add the new rows and set their diagonal element.
+ for (dimension_type i = 0; i < dims; ++i) {
+ Grid_Generator tmp(space_dimension(), Grid_Generator::LINE_OR_EQUALITY,
+ NECESSARILY_CLOSED, representation());
+ tmp.expr += Variable(col);
+ PPL_ASSERT(tmp.OK());
+ ++col;
+ sys.insert(tmp, Recycle_Input());
+ }
+}
+
+void
+PPL::Grid_Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+ sys.remove_space_dimensions(vars);
+}
+
+void
+PPL::Grid_Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+ sys.shift_space_dimensions(v, n);
+}
+
+void
+PPL::Grid_Generator_System
+::set_space_dimension(const dimension_type new_dimension) {
+ sys.set_space_dimension(new_dimension);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator_System::remove_invalid_lines_and_parameters() {
+ // The origin of the vector space cannot be a valid line/parameter.
+ // NOTE: the following swaps will mix grid generators without even trying
+ // to preserve sortedness: as a matter of fact, it will almost always
+ // be the case that the input generator system is NOT sorted.
+
+ // Note that the num_rows() value is *not* constant because remove_row()
+ // decreases it.
+ for (dimension_type i = 0; i < num_rows(); ) {
+ const Grid_Generator& g = (*this)[i];
+ if (g.is_line_or_parameter() && g.all_homogeneous_terms_are_zero())
+ sys.remove_row(i, false);
+ else
+ ++i;
+ }
+}
+
+bool
+PPL::Grid_Generator_System::has_points() const {
+ const Grid_Generator_System& ggs = *this;
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ if (!ggs[i].is_line_or_parameter())
+ return true;
+ }
+ return false;
+}
+
+PPL::dimension_type
+PPL::Grid_Generator_System::num_lines() const {
+ // We are sure that this method is applied only to a matrix
+ // that does not contain pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ const Grid_Generator_System& ggs = *this;
+ dimension_type n = 0;
+ // If the Linear_System happens to be sorted, take advantage of the fact
+ // that lines are at the top of the system.
+ if (sys.is_sorted()) {
+ const dimension_type nrows = num_rows();
+ for (dimension_type i = 0; i < nrows && ggs[i].is_line(); ++i)
+ ++n;
+ }
+ else {
+ for (dimension_type i = num_rows(); i-- > 0 ; )
+ if (ggs[i].is_line())
+ ++n;
+ }
+ return n;
+}
+
+PPL::dimension_type
+PPL::Grid_Generator_System::num_parameters() const {
+ // We are sure that this method is applied only to a matrix
+ // that does not contain pending rows.
+ PPL_ASSERT(sys.num_pending_rows() == 0);
+ const Grid_Generator_System& ggs = *this;
+ dimension_type n = 0;
+ // If the Linear_System happens to be sorted, take advantage of the fact
+ // that rays and points are at the bottom of the system and
+ // rays have the inhomogeneous term equal to zero.
+ if (sys.is_sorted()) {
+ for (dimension_type i = num_rows();
+ i != 0 && ggs[--i].is_parameter_or_point(); )
+ if (ggs[i].is_line_or_parameter())
+ ++n;
+ }
+ else {
+ for (dimension_type i = num_rows(); i-- > 0 ; )
+ if (ggs[i].is_parameter())
+ ++n;
+ }
+ return n;
+}
diff --git a/src/Grid_Generator_System_defs.hh b/src/Grid_Generator_System_defs.hh
new file mode 100644
index 0000000..efe2f98
--- /dev/null
+++ b/src/Grid_Generator_System_defs.hh
@@ -0,0 +1,514 @@
+/* Grid_Generator_System class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_defs_hh
+#define PPL_Grid_Generator_System_defs_hh 1
+
+#include "Grid_Generator_System_types.hh"
+
+#include "Linear_System_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Polyhedron_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Grid_Generator_System
+ Writes <CODE>false</CODE> if \p gs is empty. Otherwise, writes on
+ \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator_System */
+void swap(Grid_Generator_System& x, Grid_Generator_System& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator_System is a system of
+ grid generators, i.e., a multiset of objects of the class
+ Grid_Generator (lines, parameters and points).
+ When inserting generators in a system, space dimensions are
+ automatically adjusted so that all the generators in the system
+ are defined on the same vector space.
+ A system of grid generators which is meant to define a non-empty
+ grid must include at least one point: the reason is that
+ lines and parameters need a supporting point
+ (lines only specify directions while parameters only
+ specify direction and distance.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code defines the line having the same direction
+ as the \f$x\f$ axis (i.e., the first Cartesian axis)
+ in \f$\Rset^2\f$:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_line(x + 0*y));
+ \endcode
+ As said above, this system of generators corresponds to
+ an empty grid, because the line has no supporting point.
+ To define a system of generators that does correspond to
+ the \f$x\f$ axis, we can add the following code which
+ inserts the origin of the space as a point:
+ \code
+ gs.insert(grid_point(0*x + 0*y));
+ \endcode
+ Since space dimensions are automatically adjusted, the following
+ code obtains the same effect:
+ \code
+ gs.insert(grid_point(0*x));
+ \endcode
+ In contrast, if we had added the following code, we would have
+ defined a line parallel to the \f$x\f$ axis through
+ the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+ \code
+ gs.insert(grid_point(0*x + 1*y));
+ \endcode
+
+ \par Example 2
+ The following code builds a system of generators corresponding
+ to the grid consisting of all the integral points on the \f$x\f$ axes;
+ that is, all points satisfying the congruence relation
+ \f[
+ \bigl\{\,
+ (x, 0)^\transpose \in \Rset^2
+ \bigm|
+ x \pmod{1}\ 0
+ \,\bigr\},
+ \f]
+ \code
+ Grid_Generator_System gs;
+ gs.insert(parameter(x + 0*y));
+ gs.insert(grid_point(0*x + 0*y));
+ \endcode
+
+ \par Example 3
+ The following code builds a system of generators having three points
+ corresponding to a non-relational grid consisting of all points
+ whose coordinates are integer multiple of 3.
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_point(0*x + 3*y));
+ gs.insert(grid_point(3*x + 0*y));
+ \endcode
+
+ \par Example 4
+ By using parameters instead of two of the points we
+ can define the same grid as that defined in the previous example.
+ Note that there has to be at least one point and, for this purpose,
+ any point in the grid could be considered.
+ Thus the following code builds two identical grids from the
+ grid generator systems \p gs and \p gs1.
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(parameter(0*x + 3*y));
+ gs.insert(parameter(3*x + 0*y));
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(3*x + 3*y));
+ gs1.insert(parameter(0*x + 3*y));
+ gs1.insert(parameter(3*x + 0*y));
+ \endcode
+
+ \par Example 5
+ The following code builds a system of generators having one point and
+ a parameter corresponding to all the integral points that
+ lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(1*x + 1*y));
+ gs.insert(parameter(1*x - 1*y));
+ \endcode
+
+ \note
+ After inserting a multiset of generators in a grid generator system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> grid generator system
+ will be available, where original generators may have been
+ reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System {
+public:
+ typedef Grid_Generator row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of generators.
+ explicit Grid_Generator_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Grid_Generator_System(const Grid_Generator& g,
+ Representation r = default_representation);
+
+ //! Builds an empty system of generators of dimension \p dim.
+ explicit Grid_Generator_System(dimension_type dim,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Grid_Generator_System will have the same representation as `gs'.
+ Grid_Generator_System(const Grid_Generator_System& gs);
+
+ //! Copy constructor with specified representation.
+ Grid_Generator_System(const Grid_Generator_System& gs, Representation r);
+
+ //! Destructor.
+ ~Grid_Generator_System();
+
+ //! Assignment operator.
+ Grid_Generator_System& operator=(const Grid_Generator_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Grid_Generator_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Removes all the generators from the generator system and sets its
+ space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Inserts into \p *this a copy of the generator \p g, increasing the
+ number of space dimensions if needed.
+
+ If \p g is an all-zero parameter then the only action is to ensure
+ that the space dimension of \p *this is at least the space
+ dimension of \p g.
+ */
+ void insert(const Grid_Generator& g);
+
+ /*! \brief
+ Inserts into \p *this the generator \p g, increasing the number of
+ space dimensions if needed.
+ */
+ void insert(Grid_Generator& g, Recycle_Input);
+
+ /*! \brief
+ Inserts into \p *this the generators in \p gs, increasing the
+ number of space dimensions if needed.
+ */
+ void insert(Grid_Generator_System& gs, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only
+ Grid_Generator::zero_dim_point().
+ */
+ static const Grid_Generator_System& zero_dim_univ();
+
+ //! An iterator over a system of grid generators
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each generator contained in an object of Grid_Generator_System.
+
+ \par Example
+ The following code prints the system of generators
+ of the grid <CODE>gr</CODE>:
+ \code
+ const Grid_Generator_System& ggs = gr.generators();
+ for (Grid_Generator_System::const_iterator i = ggs.begin(),
+ ggs_end = ggs.end(); i != ggs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ The same effect can be obtained more concisely by using
+ more features of the STL:
+ \code
+ const Grid_Generator_System& ggs = gr.generators();
+ copy(ggs.begin(), ggs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+ \endcode
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Grid_Generator,
+ ptrdiff_t,
+ const Grid_Generator*,
+ const Grid_Generator&> {
+ public:
+ //! Default constructor.
+ const_iterator();
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Destructor.
+ ~const_iterator();
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ const Grid_Generator& operator*() const;
+
+ //! Indirect member selector.
+ const Grid_Generator* operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ different.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ friend class Grid_Generator_System;
+
+ Linear_System<Grid_Generator>::const_iterator i;
+
+ //! Copy constructor from Linear_System< Grid_Generator>::const_iterator.
+ const_iterator(const Linear_System<Grid_Generator>::const_iterator& y);
+ };
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first generator, if \p
+ *this is not empty; otherwise, returns the past-the-end
+ const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Returns the number of rows (generators) in the system.
+ dimension_type num_rows() const;
+
+ //! Returns the number of parameters in the system.
+ dimension_type num_parameters() const;
+
+ //! Returns the number of lines in the system.
+ dimension_type num_lines() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains one or
+ more points.
+ */
+ bool has_points() const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ bool is_equal_to(const Grid_Generator_System& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Resizes the matrix of generators using the numbers of rows and columns
+ read from \p s, then initializes the coordinates of each generator
+ and its type reading the contents from \p s.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Grid_Generator_System& y);
+
+private:
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Grid_Generator& operator[](dimension_type k) const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is assigned;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation;
+
+ We allow affine transformations (see the Section \ref
+ rational_grid_operations)to have rational
+ coefficients. Since the coefficients of linear expressions are
+ integers we also provide an integer \p denominator that will
+ be used as denominator of the affine transformation. The
+ denominator is required to be a positive integer and its
+ default value is 1.
+
+ The affine transformation assigns to every variable \p v, in every
+ column, the follow expression:
+ \f[
+ \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+ {\mathrm{denominator}}.
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ /*! \brief
+ Adds \p dims rows and \p dims columns of zeroes to the matrix,
+ initializing the added rows as in the universe system.
+
+ \param dims
+ The number of rows and columns to be added: must be strictly
+ positive.
+
+ Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+ \times (c+dims)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_universe_rows_and_columns(dimension_type dims);
+
+ //! Resizes the system to the specified space dimension.
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ bool has_no_rows() const;
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ void insert_verbatim(const Grid_Generator& g);
+
+ //! Returns the system topology.
+ Topology topology() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ Linear_System<Grid_Generator> sys;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Grid_Generator::zero_dim_point().
+ */
+ static const Grid_Generator_System* zero_dim_univ_p;
+
+ friend bool
+ operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Removes all the invalid lines and parameters.
+ /*!
+ The invalid lines and parameters are those with all
+ the homogeneous terms set to zero.
+ */
+ void remove_invalid_lines_and_parameters();
+
+ friend class Polyhedron;
+ friend class Grid;
+};
+
+// Grid_Generator_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Grid_Generator_System_defs_hh)
diff --git a/src/Grid_Generator_System_inlines.hh b/src/Grid_Generator_System_inlines.hh
new file mode 100644
index 0000000..4b4b56f
--- /dev/null
+++ b/src/Grid_Generator_System_inlines.hh
@@ -0,0 +1,279 @@
+/* Grid_Generator_System class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_inlines_hh
+#define PPL_Grid_Generator_System_inlines_hh 1
+
+#include "Grid_Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ return sys.permute_space_dimensions(cycle);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+ return (sys == y.sys);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.set_sorted(false);
+ PPL_ASSERT(space_dimension() == 0);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+ : sys(gs.sys) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs,
+ Representation r)
+ : sys(gs.sys, r) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim,
+ Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.set_space_dimension(dim);
+ sys.set_sorted(false);
+ PPL_ASSERT(space_dimension() == dim);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g,
+ Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.insert(g);
+ sys.set_sorted(false);
+}
+
+inline
+Grid_Generator_System::~Grid_Generator_System() {
+}
+
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+ Grid_Generator_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Grid_Generator_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Grid_Generator_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+ // Grid generators use an extra column for the parameter divisor.
+ return Linear_System<Grid_Generator>::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ return *zero_dim_univ_p;
+}
+
+inline void
+Grid_Generator_System::clear() {
+ sys.clear();
+ sys.set_sorted(false);
+ sys.unset_pending_rows();
+ PPL_ASSERT(space_dimension() == 0);
+}
+
+inline void
+Grid_Generator_System::m_swap(Grid_Generator_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline dimension_type
+Grid_Generator_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+ : i() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+ const const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline bool
+Grid_Generator_System::empty() const {
+ return sys.has_no_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator
+::const_iterator(const Linear_System<Grid_Generator>::const_iterator& y)
+ : i(y) {
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+ return static_cast<Grid_Generator_System::const_iterator>(sys.begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+ return static_cast<Grid_Generator_System::const_iterator>(sys.end());
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline bool
+Grid_Generator_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline void
+Grid_Generator_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline void
+Grid_Generator_System::insert_verbatim(const Grid_Generator& g) {
+ sys.insert(g);
+}
+
+inline Topology
+Grid_Generator_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Grid_Generator_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y) {
+ return x.is_equal_to(y);
+}
+
+/*! \relates Grid_Generator_System */
+inline void
+swap(Grid_Generator_System& x, Grid_Generator_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Generator_System_inlines_hh)
diff --git a/src/Grid_Generator_System_types.hh b/src/Grid_Generator_System_types.hh
new file mode 100644
index 0000000..3c5dff7
--- /dev/null
+++ b/src/Grid_Generator_System_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_System_types_hh
+#define PPL_Grid_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_System_types_hh)
diff --git a/src/Grid_Generator_defs.hh b/src/Grid_Generator_defs.hh
new file mode 100644
index 0000000..d3b03ea
--- /dev/null
+++ b/src/Grid_Generator_defs.hh
@@ -0,0 +1,796 @@
+/* Grid_Generator class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_defs_hh
+#define PPL_Grid_Generator_defs_hh 1
+
+#include "Grid_Generator_types.hh"
+#include "Grid_types.hh"
+
+#include "Variables_Set_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "Linear_System_types.hh"
+
+#include "Coefficient_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Inhomo_defs.hh"
+#include "Expression_Hide_Last_defs.hh"
+
+#include "Grid_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Grid_Generator
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Grid_Generator& x, const Grid_Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator */
+void swap(Grid_Generator& x, Grid_Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator is one of the following:
+
+ - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a parameter
+ \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ - a grid_point
+ \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ where \f$n\f$ is the dimension of the space
+ and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
+
+ \par How to build a grid generator.
+ Each type of generator is built by applying the corresponding
+ function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+ or <CODE>grid_point</CODE>) to a linear expression;
+ the space dimension of the generator is defined as the space dimension
+ of the corresponding linear expression.
+ Linear expressions used to define a generator should be homogeneous
+ (any constant term will be simply ignored).
+ When defining grid points and parameters, an optional Coefficient argument
+ can be used as a common <EM>divisor</EM> for all the coefficients
+ occurring in the provided linear expression;
+ the default value for this argument is 1.
+
+ \par
+ In all the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a grid line with direction \f$x-y-z\f$
+ and having space dimension \f$3\f$:
+ \code
+ Grid_Generator l = grid_line(x - y - z);
+ \endcode
+ By definition, the origin of the space is not a line, so that
+ the following code throws an exception:
+ \code
+ Grid_Generator l = grid_line(0*x);
+ \endcode
+
+ \par Example 2
+ The following code builds the parameter as the vector
+ \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+ which has the same direction as the line in Example 1:
+ \code
+ Grid_Generator q = parameter(x - y - z);
+ \endcode
+ Note that, unlike lines, for parameters, the length as well
+ as the direction of the vector represented by the code is significant.
+ Thus \p q is \e not the same as the parameter \p q1 defined by
+ \code
+ Grid_Generator q1 = parameter(2x - 2y - 2z);
+ \endcode
+ By definition, the origin of the space is not a parameter, so that
+ the following code throws an exception:
+ \code
+ Grid_Generator q = parameter(0*x);
+ \endcode
+
+ \par Example 3
+ The following code builds the grid point
+ \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+ \code
+ Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+ \endcode
+ The same effect can be obtained by using the following code:
+ \code
+ Grid_Generator p = grid_point(x + 2*z);
+ \endcode
+ Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+ using either one of the following lines of code:
+ \code
+ Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+ Grid_Generator origin3_alt = grid_point(0*z);
+ \endcode
+ Note however that the following code would have defined
+ a different point, namely \f$\vect{0} \in \Rset^2\f$:
+ \code
+ Grid_Generator origin2 = grid_point(0*y);
+ \endcode
+ The following two lines of code both define the only grid point
+ having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+ In the second case we exploit the fact that the first argument
+ of the function <CODE>point</CODE> is optional.
+ \code
+ Grid_Generator origin0 = Generator::zero_dim_point();
+ Grid_Generator origin0_alt = grid_point();
+ \endcode
+
+ \par Example 4
+ The grid point \f$\vect{p}\f$ specified in Example 3 above
+ can also be obtained with the following code,
+ where we provide a non-default value for the second argument
+ of the function <CODE>grid_point</CODE> (the divisor):
+ \code
+ Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+ \endcode
+ Obviously, the divisor can be used to specify
+ points having some non-integer (but rational) coordinates.
+ For instance, the grid point
+ \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be specified by the following code:
+ \code
+ Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par Example 5
+ Parameters, like grid points can have a divisor.
+ For instance, the parameter
+ \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+ \code
+ Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+ \endcode
+ Also, the divisor can be used to specify
+ parameters having some non-integer (but rational) coordinates.
+ For instance, the parameter
+ \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be defined:
+ \code
+ Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par How to inspect a grid generator
+ Several methods are provided to examine a grid generator and extract
+ all the encoded information: its space dimension, its type and
+ the value of its integer coefficients and the value of the denominator.
+
+ \par Example 6
+ The following code shows how it is possible to access each single
+ coefficient of a grid generator.
+ If <CODE>g1</CODE> is a grid point having coordinates
+ \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+ we construct the parameter <CODE>g2</CODE> having coordinates
+ \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+ \code
+ if (g1.is_point()) {
+ cout << "Grid point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (dimension_type i = g1.space_dimension(); i-- > 0; )
+ e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+ Grid_Generator g2 = parameter(e, g1.divisor());
+ cout << "Parameter g2: " << g2 << endl;
+ }
+ else
+ cout << "Grid generator g1 is not a grid point." << endl;
+ \endcode
+ Therefore, for the grid point
+ \code
+ Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Grid point g1: p((2*A - B + 3*C)/2)
+ Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with grid points and parameters, be careful not to confuse
+ the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+ these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator {
+public:
+
+ //! The possible kinds of Grid_Generator objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ //! The representation used for new Grid_Generators.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Grid_Generator grid_line(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the parameter of direction \p e and size \p e/d, with the same
+ //! representation as e.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Grid_Generator parameter(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ // TODO: Improve the documentation of this method.
+ //! Returns the parameter of direction and size \p Linear_Expression::zero() .
+ static Grid_Generator parameter(Representation r);
+
+ //! Returns the parameter of direction and size \p e .
+ static Grid_Generator parameter(const Linear_Expression& e,
+ Representation r);
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Grid_Generator grid_point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the point at \p e .
+ static Grid_Generator grid_point(Representation r);
+
+ //! Returns the point at \p e .
+ static Grid_Generator grid_point(const Linear_Expression& e,
+ Representation r);
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ explicit Grid_Generator(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Grid_Generator will have the same representation as g.
+ Grid_Generator(const Grid_Generator& g);
+
+ //! Copy constructor with specified representation.
+ Grid_Generator(const Grid_Generator& g, Representation r);
+
+ //! Copy constructor with specified space dimension.
+ //! The new Grid_Generator will have the same representation as g.
+ Grid_Generator(const Grid_Generator& g, dimension_type space_dim);
+
+ //! Copy constructor with specified space dimension and representation.
+ Grid_Generator(const Grid_Generator& g, dimension_type space_dim,
+ Representation r);
+
+ //! Destructor.
+ ~Grid_Generator();
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Grid_Generator& g);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Grid_Generator can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the grid generator.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ Always returns \p true. The return value is needed for compatibility with
+ the Generator class.
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the grid generator.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a grid line. */
+ LINE,
+ /*! The generator is a parameter. */
+ PARAMETER,
+ /*! The generator is a grid point. */
+ POINT
+ };
+
+ //! Returns the generator type of \p *this.
+ Type type() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+ bool is_line() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+ bool is_parameter() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a line or
+ a parameter.
+ */
+ bool is_line_or_parameter() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+ bool is_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row represents a
+ parameter or a point.
+ */
+ bool is_parameter_or_point() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the index of \p v is greater than or equal to the
+ space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient_traits::const_reference divisor() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ static const Grid_Generator& zero_dim_point();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ equivalent generators.
+
+ Generators having different space dimensions are not equivalent.
+ */
+ bool is_equivalent_to(const Grid_Generator& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent generators.
+ */
+ bool is_equal_to(const Grid_Generator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous terms
+ of \p *this are \f$0\f$.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Grid_Generator& y);
+
+ /*! \brief
+ Scales \p *this to be represented with a divisor of \p d (if
+ \*this is a parameter or point). Does nothing at all on lines.
+
+ It is assumed that \p d is a multiple of the current divisor
+ and different from zero. The behavior is undefined if the assumption
+ does not hold.
+ */
+ void scale_to_divisor(Coefficient_traits::const_reference d);
+
+ //! Sets the divisor of \p *this to \p d.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ void set_divisor(Coefficient_traits::const_reference d);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+ expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+ Linear_Expression expr;
+
+ Kind kind_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Grid_Generator* zero_dim_point_p;
+
+ //! Constructs a Grid_Generator with the specified space dimension, kind
+ //! and topology.
+ Grid_Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ // TODO: Avoid reducing the space dimension.
+ /*! \brief
+ Constructs a grid generator of type \p t from linear expression \p e,
+ stealing the underlying data structures from \p e.
+
+ The last column in \p e becomes the parameter divisor column of
+ the new Grid_Generator.
+
+ \note The new Grid_Generator will have the same representation as `e'.
+ */
+ Grid_Generator(Linear_Expression& e, Type t);
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+ dimension \p dim.
+ */
+ bool is_equal_at_dimension(dimension_type dim,
+ const Grid_Generator& gg) const;
+
+ /*! \brief
+ A print function, with fancy, more human-friendly output.
+
+ This is used by operator<<().
+ */
+ void fancy_print(std::ostream& s) const;
+
+ //! Converts the Grid_Generator into a parameter.
+ void set_is_parameter();
+
+ //! Sets the Grid_Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Grid_Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_parameter_or_point();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+ //@} // Flags coercion methods
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Grid_Generator objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Grid_Generator::normalize() and Grid_Generator::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Grid_Generator that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Grid_Generator to \p *this and normalizes it.
+ */
+ void linear_combine(const Grid_Generator& y, dimension_type i);
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ const Variable v) const;
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* reason) const;
+
+ friend std::ostream&
+ IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+
+ friend int
+ compare(const Grid_Generator& x, const Grid_Generator& y);
+
+ friend class Expression_Adapter<Grid_Generator>;
+ friend class Grid_Generator_System;
+ friend class Grid;
+ friend class Linear_System<Grid_Generator>;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_line(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_line(const Linear_Expression& e,
+ Representation r = Grid_Generator::default_representation);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::parameter(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::parameter(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::parameter(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e, Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::grid_point(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_point(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Grid_Generator_inlines.hh"
+
+#endif // !defined(PPL_Grid_Generator_defs_hh)
diff --git a/src/Grid_Generator_inlines.hh b/src/Grid_Generator_inlines.hh
new file mode 100644
index 0000000..2d7b6bb
--- /dev/null
+++ b/src/Grid_Generator_inlines.hh
@@ -0,0 +1,369 @@
+/* Grid Generator class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_inlines_hh
+#define PPL_Grid_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid_Generator::is_necessarily_closed() const {
+ return true;
+}
+
+inline bool
+Grid_Generator::is_not_necessarily_closed() const {
+ return false;
+}
+
+inline bool
+Grid_Generator::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Grid_Generator::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Grid_Generator::topology() const {
+ return NECESSARILY_CLOSED;
+}
+
+inline void
+Grid_Generator::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Grid_Generator::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Grid_Generator::set_topology(Topology x) {
+ PPL_USED(x);
+ PPL_ASSERT(x == NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Grid_Generator::Grid_Generator(Linear_Expression& e, Type type) {
+ swap(expr, e);
+ if (type == LINE)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(Representation r)
+ : expr(Coefficient_one(), r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY) {
+ expr.set_space_dimension(1);
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+ : expr(g.expr),
+ kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g, Representation r)
+ : expr(g.expr, r),
+ kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(dimension_type space_dim, Kind kind,
+ Topology topology, Representation r)
+ : expr(r),
+ kind_(kind) {
+ PPL_USED(topology);
+ PPL_ASSERT(topology == NECESSARILY_CLOSED);
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+ dimension_type space_dim)
+ : expr(g.expr, space_dim + 1),
+ kind_(g.kind_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+ dimension_type space_dim, Representation r)
+ : expr(g.expr, space_dim + 1, r),
+ kind_(g.kind_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::~Grid_Generator() {
+}
+
+inline Grid_Generator::expr_type
+Grid_Generator::expression() const {
+ return expr_type(expr, true);
+}
+
+inline Representation
+Grid_Generator::representation() const {
+ return expr.representation();
+}
+
+inline void
+Grid_Generator::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+ return Linear_Expression::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline void
+Grid_Generator::set_space_dimension(dimension_type space_dim) {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline void
+Grid_Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+ set_space_dimension(space_dim);
+}
+
+inline void
+Grid_Generator::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+ if (is_line())
+ return LINE;
+ return is_point() ? POINT : PARAMETER;
+}
+
+inline bool
+Grid_Generator::is_line() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+ return is_parameter_or_point() && is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+ return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Grid_Generator::is_point() const {
+ return !is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+ PPL_ASSERT(!is_line());
+ if (is_line_or_parameter())
+ expr.set_coefficient(Variable(space_dimension()), d);
+ else
+ expr.set_inhomogeneous_term(d);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+ if (is_line())
+ throw_invalid_argument("divisor()", "*this is a line");
+ if (is_line_or_parameter())
+ return expr.coefficient(Variable(space_dimension()));
+ else
+ return expr.inhomogeneous_term();
+}
+
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+ const Grid_Generator& y) const {
+ const Grid_Generator& x = *this;
+ return x.expr.get(dim) * y.divisor() == y.expr.get(dim) * x.divisor();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+ set_is_line_or_equality();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+ Grid_Generator tmp = g;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ return *zero_dim_point_p;
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+ PPL_ASSERT(!is_parameter());
+ expr.normalize();
+ sign_normalize();
+}
+
+inline void
+Grid_Generator::m_swap(Grid_Generator& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+ return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::grid_line(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d, Representation r) {
+ return Grid_Generator::parameter(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(Representation r) {
+ return Grid_Generator::parameter(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::parameter(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d, Representation r) {
+ return Grid_Generator::grid_point(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(Representation r) {
+ return Grid_Generator::grid_point(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::grid_point(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline void
+swap(Grid_Generator& x, Grid_Generator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Generator_inlines_hh)
diff --git a/src/Grid_Generator_types.hh b/src/Grid_Generator_types.hh
new file mode 100644
index 0000000..e7a86ad
--- /dev/null
+++ b/src/Grid_Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_types_hh
+#define PPL_Grid_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_types_hh)
diff --git a/src/Grid_Status.cc b/src/Grid_Status.cc
new file mode 100644
index 0000000..63b5edb
--- /dev/null
+++ b/src/Grid_Status.cc
@@ -0,0 +1,245 @@
+/* Grid::Status class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Grid::Status
+ Reads a keyword and its associated on/off, +/- flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != '+' && str[0] != '-')
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == '+');
+ return true;
+}
+
+} // namespace
+
+void
+PPL::Grid::Status::ascii_dump(std::ostream& s) const {
+ s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+ << (test_empty() ? '+' : '-') << empty << ' '
+ << ' '
+ << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+ << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+ << ' '
+ << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+ << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+ << ' '
+ << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+ << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+ << ' '
+ << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+ << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd
+ << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Grid::Status)
+
+bool
+PPL::Grid::Status::ascii_load(std::istream& s) {
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, consys_min, positive))
+ return false;
+ if (positive)
+ set_c_minimized();
+ else
+ reset_c_minimized();
+
+ if (!get_field(s, gensys_min, positive))
+ return false;
+ if (positive)
+ set_g_minimized();
+ else
+ reset_g_minimized();
+
+ if (!get_field(s, consys_upd, positive))
+ return false;
+ if (positive)
+ set_c_up_to_date();
+ else
+ reset_c_up_to_date();
+
+ if (!get_field(s, gensys_upd, positive))
+ return false;
+ if (positive)
+ set_g_up_to_date();
+ else
+ reset_g_up_to_date();
+
+ if (!get_field(s, consys_pending, positive))
+ return false;
+ if (positive)
+ set_c_pending();
+ else
+ reset_c_pending();
+
+ if (!get_field(s, gensys_pending, positive))
+ return false;
+ if (positive)
+ set_g_pending();
+ else
+ reset_g_pending();
+
+ if (!get_field(s, satc_upd, positive))
+ return false;
+ if (positive)
+ set_sat_c_up_to_date();
+ else
+ reset_sat_c_up_to_date();
+
+ if (!get_field(s, satg_upd, positive))
+ return false;
+ if (positive)
+ set_sat_g_up_to_date();
+ else
+ reset_sat_g_up_to_date();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+bool
+PPL::Grid::Status::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+#ifndef NDEBUG
+ cerr << "The empty flag is incompatible with any other one."
+ << endl << "Flags:" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+ && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+ cerr <<
+ "If a saturation matrix is up-to-date, congruences and\n"
+ "generators have to be both up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "If congruences are minimized they must be up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "If generators are minimized they must be up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+ cerr << "There cannot be both pending congruences and pending generators."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_pending() || test_g_pending()) {
+ if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+ cerr <<
+ "If there are pending congruences or generators, congruences\n"
+ "and generators must be minimized."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+ cerr <<
+ "If there are pending congruences or generators, there must\n"
+ "be at least a saturation matrix up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
diff --git a/src/Grid_Status_idefs.hh b/src/Grid_Status_idefs.hh
new file mode 100644
index 0000000..cb4ea19
--- /dev/null
+++ b/src/Grid_Status_idefs.hh
@@ -0,0 +1,168 @@
+/* Grid::Status class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Status_idefs_hh
+#define PPL_Grid_Status_idefs_hh 1
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status_idefs.hh directly; use Grid_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+ The assertions supported that are in use are:
+ - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the grid is the empty set;
+ - <EM>congruences up-to-date</EM>: the grid is correctly
+ characterized by the attached system of congruences, modulo the
+ processing of pending generators;
+ - <EM>generators up-to-date</EM>: the grid is correctly
+ characterized by the attached system of generators, modulo the
+ processing of pending congruences;
+ - <EM>congruences minimized</EM>: the non-pending part of the system
+ of congruences attached to the grid is in minimal form;
+ - <EM>generators minimized</EM>: the non-pending part of the system
+ of generators attached to the grid is in minimal form.
+
+ Other supported assertions are:
+ - <EM>congruences pending</EM>
+ - <EM>generators pending</EM>
+ - <EM>congruences' saturation matrix up-to-date</EM>
+ - <EM>generators' saturation matrix up-to-date</EM>.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>congruences pending</EM> and <EM>generators pending</EM>
+ are mutually exclusive;
+ - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+ - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+ - <EM>congruences' saturation matrix up-to-date</EM> implies both
+ <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+ - <EM>generators' saturation matrix up-to-date</EM> implies both
+ <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_c_up_to_date() const;
+ void reset_c_up_to_date();
+ void set_c_up_to_date();
+
+ bool test_g_up_to_date() const;
+ void reset_g_up_to_date();
+ void set_g_up_to_date();
+
+ bool test_c_minimized() const;
+ void reset_c_minimized();
+ void set_c_minimized();
+
+ bool test_g_minimized() const;
+ void reset_g_minimized();
+ void set_g_minimized();
+
+ bool test_sat_c_up_to_date() const;
+ void reset_sat_c_up_to_date();
+ void set_sat_c_up_to_date();
+
+ bool test_sat_g_up_to_date() const;
+ void reset_sat_g_up_to_date();
+ void set_sat_g_up_to_date();
+
+ bool test_c_pending() const;
+ void reset_c_pending();
+ void set_c_pending();
+
+ bool test_g_pending() const;
+ void reset_g_pending();
+ void set_g_pending();
+ //@} // Test, remove or add an individual assertion from the conjunction
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bitmasks for the individual assertions
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t C_UP_TO_DATE = 1U << 1;
+ static const flags_t G_UP_TO_DATE = 1U << 2;
+ static const flags_t C_MINIMIZED = 1U << 3;
+ static const flags_t G_MINIMIZED = 1U << 4;
+ static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+ static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+ static const flags_t CS_PENDING = 1U << 7;
+ static const flags_t GS_PENDING = 1U << 8;
+ //@} // Bitmasks for the individual assertions
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bitmask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Grid_Status_idefs_hh)
diff --git a/src/Grid_Status_inlines.hh b/src/Grid_Status_inlines.hh
new file mode 100644
index 0000000..0b031ae
--- /dev/null
+++ b/src/Grid_Status_inlines.hh
@@ -0,0 +1,217 @@
+/* Grid::Status class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Status_inlines_hh
+#define PPL_Grid_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+ flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+ return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+ reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+ set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+ return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+ reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+ set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+ return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+ reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+ set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+ return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+ reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+ set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+ return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+ reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+ set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+ return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+ reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+ set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+ return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+ reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+ set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+ return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+ reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+ set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Grid_chdims.cc b/src/Grid_chdims.cc
new file mode 100644
index 0000000..6147549
--- /dev/null
+++ b/src/Grid_chdims.cc
@@ -0,0 +1,477 @@
+/* Grid class implementation
+ (non-inline operators that may change the dimension of the vector space).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Used for add_space_dimensions_and_embed.
+void
+PPL::Grid::add_space_dimensions(Congruence_System& cgs,
+ Grid_Generator_System& gs,
+ const dimension_type dims) {
+ PPL_ASSERT(cgs.space_dimension() == gs.space_dimension());
+ PPL_ASSERT(dims > 0);
+
+ const dimension_type old_modulus_index = cgs.space_dimension() + 1;
+ cgs.set_space_dimension(space_dimension() + dims);
+
+ if (congruences_are_minimized() || generators_are_minimized())
+ dim_kinds.resize(old_modulus_index + dims, CON_VIRTUAL /* a.k.a. LINE */);
+
+ gs.add_universe_rows_and_columns(dims);
+}
+
+// Used for add_space_dimensions_and_project.
+void
+PPL::Grid::add_space_dimensions(Grid_Generator_System& gs,
+ Congruence_System& cgs,
+ const dimension_type dims) {
+ PPL_ASSERT(cgs.space_dimension() == gs.space_dimension());
+ PPL_ASSERT(dims > 0);
+
+ cgs.add_unit_rows_and_space_dimensions(dims);
+
+ // Add `dims' zero columns onto gs.
+ gs.set_space_dimension(space_dim + dims);
+
+ normalize_divisors(gs);
+
+ dim_kinds.resize(cgs.space_dimension() + 1, EQUALITY /* a.k.a GEN_VIRTUAL */);
+}
+
+// (o is a point) y
+//
+// | | |
+// => | | |
+// | | |
+// o---o---o-- x |---|---|-- x
+// 0 1 2 3 4 5 0 1 2 3 4 5
+// R^1 R^2
+void
+PPL::Grid::add_space_dimensions_and_embed(dimension_type m) {
+ if (m == 0)
+ return;
+
+ // The space dimension of the resulting grid must be at most the
+ // maximum allowed space dimension.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Grid::",
+ "add_space_dimensions_and_embed(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Adding dimensions to an empty grid is obtained by adjusting
+ // `space_dim' and clearing `con_sys' (since it can contain the
+ // integrality congruence of the current dimension).
+ if (marked_empty()) {
+ space_dim += m;
+ set_empty();
+ return;
+ }
+
+ // The case of a zero-dimension space grid.
+ if (space_dim == 0) {
+ // Since it is not empty, it has to be the universe grid.
+ PPL_ASSERT(status.test_zero_dim_univ());
+ // Swap *this with a newly created `m'-dimensional universe grid.
+ Grid gr(m, UNIVERSE);
+ m_swap(gr);
+ return;
+ }
+
+ // To embed an n-dimension space grid in a (n+m)-dimension space, we
+ // add `m' zero-columns to the rows in the system of congruences; in
+ // contrast, the system of generators needs additional rows,
+ // corresponding to the vectors of the canonical basis for the added
+ // dimensions. That is, for each new dimension we add the line
+ // having that direction. This is done by invoking the function
+ // add_space_dimensions().
+ if (congruences_are_up_to_date())
+ if (generators_are_up_to_date())
+ // Adds rows and/or columns to both matrices.
+ add_space_dimensions(con_sys, gen_sys, m);
+ else {
+ // Only congruences are up-to-date, so modify only them.
+ con_sys.set_space_dimension(con_sys.space_dimension() + m);
+ if (congruences_are_minimized())
+ dim_kinds.resize(con_sys.space_dimension() + 1, CON_VIRTUAL);
+ }
+ else {
+ // Only generators are up-to-date, so modify only them.
+ PPL_ASSERT(generators_are_up_to_date());
+ gen_sys.add_universe_rows_and_columns(m);
+ if (generators_are_minimized())
+ dim_kinds.resize(gen_sys.space_dimension() + 1, LINE);
+ }
+ // Update the space dimension.
+ space_dim += m;
+
+ // Note: we do not check for satisfiability, because the system of
+ // congruences may be unsatisfiable.
+ PPL_ASSERT(OK());
+}
+
+// (o is a point) y
+//
+//
+// =>
+//
+// o---o---o-- x o---o---o-- x
+// 0 1 2 3 4 5 0 1 2 3 4 5
+// R^1 R^2
+void
+PPL::Grid::add_space_dimensions_and_project(dimension_type m) {
+ if (m == 0)
+ return;
+
+ // The space dimension of the resulting grid should be at most the
+ // maximum allowed space dimension.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Grid::",
+ "add_space_dimensions_and_project(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Adding dimensions to an empty grid is obtained by merely
+ // adjusting `space_dim'.
+ if (marked_empty()) {
+ space_dim += m;
+ set_empty();
+ return;
+ }
+
+ if (space_dim == 0) {
+ PPL_ASSERT(status.test_zero_dim_univ());
+ // Swap *this with a newly created `n'-dimensional universe grid.
+ Grid gr(m, UNIVERSE);
+ m_swap(gr);
+ return;
+ }
+
+ // To project an n-dimension space grid in a (n+m)-dimension space,
+ // we just add to the system of generators `m' zero-columns; in
+ // contrast, in the system of congruences, new rows are needed in
+ // order to avoid embedding the old grid in the new space. Thus,
+ // for each new dimensions `x[k]', we add the constraint x[k] = 0;
+ // this is done by invoking the function add_space_dimensions()
+ // giving the system of constraints as the second argument.
+ if (congruences_are_up_to_date())
+ if (generators_are_up_to_date())
+ // Add rows and/or columns to both matrices.
+ add_space_dimensions(gen_sys, con_sys, m);
+ else {
+ // Only congruences are up-to-date so modify only them.
+ con_sys.add_unit_rows_and_space_dimensions(m);
+ if (congruences_are_minimized())
+ dim_kinds.resize(con_sys.space_dimension() + 1, EQUALITY);
+ }
+ else {
+ // Only generators are up-to-date so modify only them.
+ PPL_ASSERT(generators_are_up_to_date());
+
+ // Add m zero columns onto gs.
+ gen_sys.set_space_dimension(space_dim + m);
+
+ normalize_divisors(gen_sys);
+
+ if (generators_are_minimized())
+ dim_kinds.resize(gen_sys.space_dimension() + 1, EQUALITY);
+ }
+ // Now update the space dimension.
+ space_dim += m;
+
+ // Note: we do not check for satisfiability, because the system of
+ // congruences may be unsatisfiable.
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::concatenate_assign(const Grid& y) {
+ // The space dimension of the resulting grid must be at most the
+ // maximum allowed space dimension.
+ check_space_dimension_overflow(y.space_dimension(),
+ max_space_dimension() - space_dimension(),
+ "PPL::Grid::",
+ "concatenate_assign(y)",
+ "concatenation exceeds the maximum "
+ "allowed space dimension");
+
+ const dimension_type added_columns = y.space_dim;
+
+ // If `*this' or `y' are empty grids just adjust the space
+ // dimension.
+ if (marked_empty() || y.marked_empty()) {
+ space_dim += added_columns;
+ set_empty();
+ return;
+ }
+
+ // If `y' is a universe 0-dim grid, the result is `*this'.
+ if (added_columns == 0)
+ return;
+
+ // If `*this' is a universe 0-dim space grid, the result is `y'.
+ if (space_dim == 0) {
+ *this = y;
+ return;
+ }
+
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ con_sys.concatenate(y.congruences());
+
+ space_dim += added_columns;
+
+ clear_congruences_minimized();
+ clear_generators_up_to_date();
+
+ // Check that the system is OK, taking into account that the system
+ // of congruences may now be empty.
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any grid is a no-op. This case
+ // also captures the only legal removal of dimensions from a grid in
+ // a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ const dimension_type new_space_dim = space_dim - vars.size();
+
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Update the space dimension.
+ space_dim = new_space_dim;
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Removing _all_ dimensions from a non-empty grid obtains the
+ // zero-dimensional universe grid.
+ if (new_space_dim == 0) {
+ set_zero_dim_univ();
+ return;
+ }
+
+ gen_sys.remove_space_dimensions(vars);
+
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ // Update the space dimension.
+ space_dim = new_space_dim;
+
+ PPL_ASSERT(OK(true));
+}
+
+void
+PPL::Grid::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check.
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any grid is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a grid in a 0-dim space.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (is_empty()) {
+ // Removing dimensions from the empty grid just updates the space
+ // dimension.
+ space_dim = new_dimension;
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (new_dimension == 0) {
+ // Removing all dimensions from a non-empty grid just returns the
+ // zero-dimensional universe grid.
+ set_zero_dim_univ();
+ return;
+ }
+
+ // Favor the generators, as is done by is_empty().
+ if (generators_are_up_to_date()) {
+ gen_sys.set_space_dimension(new_dimension);
+ if (generators_are_minimized()) {
+ // Count the actual number of rows that are now redundant.
+ dimension_type num_redundant = 0;
+ const dimension_type num_old_gs = space_dim - new_dimension;
+ for (dimension_type row = 0; row < num_old_gs; ++row) {
+ if (dim_kinds[row] != GEN_VIRTUAL)
+ ++num_redundant;
+ }
+ if (num_redundant > 0) {
+ // Chop zero rows from end of system, to keep minimal form.
+ gen_sys.remove_trailing_rows(num_redundant);
+ gen_sys.unset_pending_rows();
+ }
+ dim_kinds.resize(new_dimension + 1);
+ // TODO: Consider if it is worth also preserving the congruences
+ // if they are also in minimal form.
+ }
+ clear_congruences_up_to_date();
+ // Extend the zero dim false congruence system to the appropriate
+ // dimension and then swap it with `con_sys'.
+ Congruence_System cgs(Congruence::zero_dim_false());
+ // Extra 2 columns for inhomogeneous term and modulus.
+ cgs.set_space_dimension(new_dimension + 2);
+ swap(con_sys, cgs);
+ }
+ else {
+ PPL_ASSERT(congruences_are_minimized());
+ con_sys.set_space_dimension(new_dimension);
+ // Count the actual number of rows that are now redundant.
+ dimension_type num_redundant = 0;
+ for (dimension_type row = space_dim; row > new_dimension; --row) {
+ if (dim_kinds[row] != CON_VIRTUAL)
+ ++num_redundant;
+ }
+
+ con_sys.remove_rows(0, num_redundant, true);
+ dim_kinds.erase(dim_kinds.begin() + (new_dimension + 1),
+ dim_kinds.end());
+
+ clear_generators_up_to_date();
+ // Replace gen_sys with an empty system of the right dimension.
+ // Extra 2 columns for inhomogeneous term and modulus.
+ Grid_Generator_System gs(new_dimension + 2);
+ gen_sys.m_swap(gs);
+ }
+
+ // Update the space dimension.
+ space_dim = new_dimension;
+
+ PPL_ASSERT(OK(true));
+}
+
+void
+PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
+ // `var' must be one of the dimensions of the vector space.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // Adding 0 dimensions leaves the same grid.
+ if (m == 0)
+ return;
+
+ // The resulting space dimension must be at most the maximum.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Grid::",
+ "expand_space_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Save the number of dimensions before adding new ones.
+ const dimension_type old_dim = space_dim;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ const Congruence_System& cgs = congruences();
+ Congruence_System new_congruences;
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i) {
+ const Congruence& cg = *i;
+
+ Coefficient_traits::const_reference coeff = cg.coefficient(var);
+
+ // Only consider congruences that constrain `var'.
+ if (coeff == 0)
+ continue;
+
+ Congruence cg_copy = cg;
+ cg_copy.expr.set_coefficient(var, Coefficient_zero());
+
+ // Each relevant congruence results in `m' new congruences.
+ for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+ Congruence x = cg_copy;
+ add_mul_assign(x.expr, coeff, Variable(dst_d));
+ new_congruences.insert_verbatim(x, Recycle_Input());
+ }
+ }
+ add_recycled_congruences(new_congruences);
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::fold_space_dimensions(const Variables_Set& vars, Variable dest) {
+ // TODO: this implementation is _really_ an executable specification.
+
+ // `dest' should be one of the dimensions of the grid.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // Folding only has effect if dimensions are given.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' must be dimensions of the grid.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ "vs.space_dimension()",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' must not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+ // All of the affine images we are going to compute are not invertible,
+ // hence we will need to compute the grid generators of the polyhedron.
+ // Since we keep taking copies, make sure that a single conversion
+ // from congruences to grid generators is computed.
+ (void) grid_generators();
+ // Having grid generators, we now know if the grid is empty:
+ // in that case, folding is equivalent to just removing space dimensions.
+ if (!marked_empty()) {
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ Grid copy = *this;
+ copy.affine_image(dest, Linear_Expression(Variable(*i)));
+ upper_bound_assign(copy);
+ }
+ }
+ remove_space_dimensions(vars);
+ PPL_ASSERT(OK());
+}
diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc
new file mode 100644
index 0000000..90e2449
--- /dev/null
+++ b/src/Grid_conversion.cc
@@ -0,0 +1,511 @@
+/* Grid class implementation: conversion().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+// X 0 0 0 upside down, so x x x X
+// x X 0 0 x x X 0
+// x x X 0 x X 0 0
+// x x x X X 0 0 0
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::lower_triangular(const Congruence_System& sys,
+ const Dimension_Kinds& dim_kinds) {
+ const dimension_type num_columns = sys.space_dimension() + 1;
+
+ // Check for easy square failure case.
+ if (sys.num_rows() > num_columns)
+ return false;
+
+ // Check triangularity.
+
+ dimension_type row = 0;
+ for (dimension_type dim = num_columns; dim-- > 0; ) {
+ if (dim_kinds[dim] == CON_VIRTUAL)
+ continue;
+ const Congruence& cg = sys[row];
+ ++row;
+ // Check diagonal.
+ if (cg.expr.get(dim) <= 0)
+ return false;
+ if (!cg.expr.all_zeroes(dim + 1, num_columns))
+ return false;
+ }
+
+ // Check squareness.
+ return row == sys.num_rows();
+}
+
+// X x x x
+// 0 X x x
+// 0 0 X x
+// 0 0 0 X
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::upper_triangular(const Grid_Generator_System& sys,
+ const Dimension_Kinds& dim_kinds) {
+ dimension_type num_columns = sys.space_dimension() + 1;
+ dimension_type row = sys.num_rows();
+
+ // Check for easy square fail case.
+ if (row > num_columns)
+ return false;
+
+ // Check triangularity.
+ while (num_columns > 0) {
+ --num_columns;
+ if (dim_kinds[num_columns] == GEN_VIRTUAL)
+ continue;
+ const Grid_Generator& gen = sys[--row];
+ // Check diagonal.
+ if (gen.expr.get(num_columns) <= 0)
+ return false;
+ // Check elements preceding diagonal.
+ if (!gen.expr.all_zeroes(0, num_columns))
+ return false;
+ }
+
+ // Check for squareness.
+ return num_columns == row;
+}
+
+void
+Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+ Swapping_Vector<Grid_Generator>& dest_rows,
+ const dimension_type num_rows) {
+ if (multiplier == 1)
+ return;
+
+ if (gen.is_line()) {
+ // Multiply every element of the line.
+ gen.expr *= multiplier;
+ }
+ else {
+ PPL_ASSERT(gen.is_parameter_or_point());
+ // Multiply every element of every parameter.
+
+ for (dimension_type index = num_rows; index-- > 0; ) {
+ Grid_Generator& generator = dest_rows[index];
+ if (generator.is_parameter_or_point())
+ generator.expr *= multiplier;
+ }
+ }
+}
+
+void
+Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
+ Swapping_Vector<Congruence>& dest,
+ const dimension_type num_rows) {
+ if (multiplier == 1)
+ return;
+
+ if (cg.is_proper_congruence()) {
+ // Multiply every element of every congruence.
+ for (dimension_type index = num_rows; index-- > 0; ) {
+ Congruence& congruence = dest[index];
+ if (congruence.is_proper_congruence())
+ congruence.scale(multiplier);
+ }
+ }
+ else {
+ PPL_ASSERT(cg.is_equality());
+ // Multiply every element of the equality.
+ cg.scale(multiplier);
+ }
+}
+
+// TODO: Rename the next two methods to convert and this file to
+// Grid_convert.cc (and equivalently for Polyhedron) to use
+// verbs consistently as function and method names.
+
+void
+Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
+ Dimension_Kinds& dim_kinds) {
+ // Quite similar to the congruence to generator version below.
+ // Changes here may be needed there too.
+
+ PPL_ASSERT(upper_triangular(source, dim_kinds));
+
+ // Initialize matrix row number counters and compute the LCM of the
+ // diagonal entries of the parameters in `source'.
+ //
+ // The top-down order of the generator system rows corresponds to
+ // the left-right order of the dimensions, while the congruence
+ // system rows have a bottom-up ordering.
+ dimension_type dest_num_rows = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(diagonal_lcm);
+ diagonal_lcm = 1;
+ const dimension_type dims = source.space_dimension() + 1;
+ dimension_type source_index = source.num_rows();
+ for (dimension_type dim = dims; dim-- > 0; )
+ if (dim_kinds[dim] == GEN_VIRTUAL)
+ // Virtual generators map to equalities.
+ ++dest_num_rows;
+ else {
+ --source_index;
+ if (dim_kinds[dim] == PARAMETER) {
+ // Dimension `dim' has a parameter row at `source_index' in
+ // `source', so include in `diagonal_lcm' the `dim'th element
+ // of that row.
+ lcm_assign(diagonal_lcm, diagonal_lcm, source[source_index].expr.get(dim));
+ // Parameters map to proper congruences.
+ ++dest_num_rows;
+ }
+ // Lines map to virtual congruences.
+ }
+ PPL_ASSERT(source_index == 0);
+
+ // `source' must be regular.
+ PPL_ASSERT(diagonal_lcm != 0);
+
+ dest.clear();
+ dest.set_space_dimension(dims - 1);
+
+ // In `dest' initialize row types and elements, including setting
+ // the diagonal elements to the inverse ratio of the `source'
+ // diagonal elements.
+ source_index = source.num_rows();
+ for (dimension_type dim = dims; dim-- > 0; ) {
+ if (dim_kinds[dim] == LINE)
+ --source_index;
+ else {
+ Linear_Expression le;
+ le.set_space_dimension(dest.space_dimension());
+
+ if (dim_kinds[dim] == GEN_VIRTUAL) {
+ le.set(dim, Coefficient_one());
+ Congruence cg(le, Coefficient_zero(), Recycle_Input());
+ dest.insert_verbatim(cg, Recycle_Input());
+ }
+ else {
+ PPL_ASSERT(dim_kinds[dim] == PARAMETER);
+ --source_index;
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ exact_div_assign(tmp, diagonal_lcm,
+ source[source_index].expr.get(dim));
+ le.set(dim, tmp);
+ Congruence cg(le, Coefficient_one(), Recycle_Input());
+ dest.insert_verbatim(cg, Recycle_Input());
+ }
+ }
+ }
+
+ PPL_ASSERT(source_index == 0);
+ PPL_ASSERT(lower_triangular(dest, dim_kinds));
+
+ // Convert.
+ //
+ // `source_index' and `dest_index' hold the positions of pivot rows
+ // in `source' and `dest'. The order of the rows in `dest' is the
+ // reverse of the order in `source', so the rows are iterated from
+ // last to first (index 0) in `source' and from first to last in
+ // `dest'.
+ source_index = source.num_rows();
+ dimension_type dest_index = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(multiplier);
+
+ for (dimension_type dim = dims; dim-- > 0; ) {
+ if (dim_kinds[dim] != GEN_VIRTUAL) {
+ --source_index;
+ const Coefficient& source_dim = source[source_index].expr.get(dim);
+
+ // In the rows in `dest' above `dest_index' divide each element
+ // at column `dim' by `source_dim'.
+ for (dimension_type row = dest_index; row-- > 0; ) {
+ Congruence& cg = dest.rows[row];
+
+ // Multiply the representation of `dest' such that entry `dim'
+ // of `g' is a multiple of `source_dim'. This ensures that
+ // the result of the division that follows is a whole number.
+ gcd_assign(multiplier, cg.expression().get(dim), source_dim);
+ exact_div_assign(multiplier, source_dim, multiplier);
+ multiply_grid(multiplier, cg, dest.rows, dest_num_rows);
+
+ cg.expr.exact_div_assign(source_dim, dim, dim + 1);
+ }
+ }
+
+ // Invert and transpose the source row at `source_index' into the
+ // destination row at `dest_index'.
+ //
+ // Consider each dimension `dim_prec' that precedes `dim', as the
+ // rows in `dest' that follow `dim_index' have zeroes at index
+ // `dim'.
+ dimension_type tmp_source_index = source_index;
+ if (dim_kinds[dim] != LINE)
+ ++dest_index;
+ for (dimension_type dim_prec = dim; dim_prec-- > 0; ) {
+ if (dim_kinds[dim_prec] != GEN_VIRTUAL) {
+ --tmp_source_index;
+ const Coefficient& source_dim = source[tmp_source_index].expr.get(dim);
+
+ // In order to compute the transpose of the inverse of
+ // `source', subtract source[tmp_source_index][dim] times the
+ // column vector in `dest' at `dim' from the column vector in
+ // `dest' at `dim_prec'.
+ //
+ // I.e., for each row `dest_index' in `dest' that is above the
+ // row `dest_index', subtract dest[tmp_source_index][dim]
+ // times the entry `dim' from the entry at `dim_prec'.
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ for (dimension_type row = dest_index; row-- > 0; ) {
+ PPL_ASSERT(row < dest_num_rows);
+ Congruence& cg = dest.rows[row];
+ tmp = cg.expr.get(dim_prec);
+ sub_mul_assign(tmp, source_dim, cg.expression().get(dim));
+ cg.expr.set(dim_prec, tmp);
+ }
+ }
+ }
+ }
+ // Set the modulus in every congruence.
+ Coefficient_traits::const_reference modulus
+ = dest.rows[dest_num_rows - 1].inhomogeneous_term();
+ for (dimension_type row = dest_num_rows; row-- > 0; ) {
+ Congruence& cg = dest.rows[row];
+ if (cg.is_proper_congruence())
+ cg.set_modulus(modulus);
+ }
+
+ PPL_ASSERT(lower_triangular(dest, dim_kinds));
+
+ // Since we are reducing the system to "strong minimal form",
+ // reduce the coefficients in the congruence system
+ // using "diagonal" values.
+ for (dimension_type dim = dims, i = 0; dim-- > 0; )
+ if (dim_kinds[dim] != CON_VIRTUAL)
+ // Factor the "diagonal" congruence out of the preceding rows.
+ reduce_reduced<Congruence_System>
+ (dest.rows, dim, i++, 0, dim, dim_kinds, false);
+
+#ifndef NDEBUG
+ // Make sure that all the rows are now OK.
+ for (dimension_type i = dest.num_rows(); i-- > 0; )
+ PPL_ASSERT(dest[i].OK());
+#endif
+
+ PPL_ASSERT(dest.OK());
+}
+
+void
+Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
+ Dimension_Kinds& dim_kinds) {
+ // Quite similar to the generator to congruence version above.
+ // Changes here may be needed there too.
+
+ PPL_ASSERT(lower_triangular(source, dim_kinds));
+
+ // Initialize matrix row number counters and compute the LCM of the
+ // diagonal entries of the proper congruences in `source'.
+ dimension_type source_num_rows = 0;
+ dimension_type dest_num_rows = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(diagonal_lcm);
+ diagonal_lcm = 1;
+ const dimension_type dims = source.space_dimension() + 1;
+ for (dimension_type dim = dims; dim-- > 0; )
+ if (dim_kinds[dim] == CON_VIRTUAL)
+ // Virtual congruences map to lines.
+ ++dest_num_rows;
+ else {
+ if (dim_kinds[dim] == PROPER_CONGRUENCE) {
+ // Dimension `dim' has a proper congruence row at
+ // `source_num_rows' in `source', so include in `diagonal_lcm'
+ // the `dim'th element of that row.
+ lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows].expr.get(dim));
+ // Proper congruences map to parameters.
+ ++dest_num_rows;
+ }
+ // Equalities map to virtual generators.
+ ++source_num_rows;
+ }
+
+ // `source' must be regular.
+ PPL_ASSERT(diagonal_lcm != 0);
+
+ dest.clear();
+ PPL_ASSERT(dims > 0);
+ dest.set_space_dimension(dims - 1);
+
+ // In `dest' initialize row types and elements, including setting
+ // the diagonal elements to the inverse ratio of the `source'
+ // diagonal elements.
+ //
+ // The top-down order of the congruence system rows corresponds to
+ // the right-left order of the dimensions.
+ dimension_type source_index = source_num_rows;
+ // The generator system has a bottom-up ordering.
+ for (dimension_type dim = 0; dim < dims; ++dim) {
+ if (dim_kinds[dim] == EQUALITY) {
+ --source_index;
+ }
+ else {
+ Grid_Generator g(dest.representation());
+ g.set_topology(dest.topology());
+ g.expr.set_space_dimension(dims);
+
+ if (dim_kinds[dim] == CON_VIRTUAL) {
+ g.set_is_line();
+ g.expr.set(0, Coefficient_zero());
+ g.expr.set(dim, Coefficient_one());
+ }
+ else {
+ PPL_ASSERT(dim_kinds[dim] == PROPER_CONGRUENCE);
+ g.set_is_parameter_or_point();
+ --source_index;
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ exact_div_assign(tmp, diagonal_lcm,
+ source[source_index].expr.get(dim));
+ g.expr.set(0, Coefficient_zero());
+ g.expr.set(dim, tmp);
+ }
+ // Don't assert g.OK() here, because it may fail.
+ // All the rows in `dest' are checked at the end of this function.
+ dest.insert_verbatim(g);
+ }
+ }
+
+ PPL_ASSERT(dest.num_rows() == dest_num_rows);
+ PPL_ASSERT(dest.first_pending_row() == dest_num_rows);
+ PPL_ASSERT(upper_triangular(dest, dim_kinds));
+
+ // Convert.
+ //
+ // `source_index' and `dest_index' hold the positions of pivot rows
+ // in `source' and `dest'. The order of the rows in `dest' is the
+ // reverse of the order in `source', so the rows are iterated from
+ // last to first (index 0) in `source' and from first to last in
+ // `dest'.
+ source_index = source_num_rows;
+ dimension_type dest_index = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_source_dim);
+
+ for (dimension_type dim = 0; dim < dims; ++dim) {
+ if (dim_kinds[dim] != CON_VIRTUAL) {
+ --source_index;
+ Coefficient_traits::const_reference source_dim
+ = source[source_index].expr.get(dim);
+
+ // In the rows in `dest' above `dest_index' divide each element
+ // at column `dim' by `source_dim'.
+
+ for (dimension_type i = dest_index; i-- > 0; ) {
+ Grid_Generator& g = dest.sys.rows[i];
+
+ // Multiply the representation of `dest' such that entry `dim'
+ // of `g' is a multiple of `source_dim'. This ensures that
+ // the result of the division that follows is a whole number.
+ gcd_assign(reduced_source_dim, g.expr.get(dim), source_dim);
+ exact_div_assign(reduced_source_dim, source_dim, reduced_source_dim);
+ multiply_grid(reduced_source_dim, g, dest.sys.rows, dest_num_rows);
+
+ g.expr.exact_div_assign(source_dim, dim, dim + 1);
+ // Don't assert g.OK() here, because it may fail.
+ // All the rows in `dest' are checked at the end of this function.
+ }
+ }
+
+ // Invert and transpose the source row at `source_index' into the
+ // destination row at `dest_index'.
+ //
+ // Consider each dimension `dim_fol' that follows `dim', as the
+ // rows in `dest' that follow row `dest_index' are zero at index
+ // `dim'.
+ dimension_type tmp_source_index = source_index;
+ if (dim_kinds[dim] != EQUALITY)
+ ++dest_index;
+ for (dimension_type dim_fol = dim + 1; dim_fol < dims; ++dim_fol) {
+ if (dim_kinds[dim_fol] != CON_VIRTUAL) {
+ --tmp_source_index;
+ Coefficient_traits::const_reference source_dim
+ = source[tmp_source_index].expr.get(dim);
+ // In order to compute the transpose of the inverse of
+ // `source', subtract source[tmp_source_index][dim] times the
+ // column vector in `dest' at `dim' from the column vector in
+ // `dest' at `dim_fol'.
+ //
+ // I.e., for each row `dest_index' in `dest' that is above the
+ // row `dest_index', subtract dest[tmp_source_index][dim]
+ // times the entry `dim' from the entry at `dim_fol'.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ for (dimension_type i = dest_index; i-- > 0; ) {
+ PPL_ASSERT(i < dest_num_rows);
+ Grid_Generator& row = dest.sys.rows[i];
+ tmp = row.expr.get(dim_fol);
+ sub_mul_assign(tmp, source_dim,
+ row.expr.get(dim));
+ row.expr.set(dim_fol, tmp);
+ // Don't assert row.OK() here, because it may fail.
+ // All the rows in `dest' are checked at the end of this function.
+ }
+ }
+ }
+ }
+
+ PPL_ASSERT(upper_triangular(dest, dim_kinds));
+
+ // Since we are reducing the system to "strong minimal form",
+ // reduce the coordinates in the grid_generator system
+ // using "diagonal" values.
+ for (dimension_type dim = 0, i = 0; dim < dims; ++dim) {
+ if (dim_kinds[dim] != GEN_VIRTUAL)
+ // Factor the "diagonal" generator out of the preceding rows.
+ reduce_reduced<Grid_Generator_System>
+ (dest.sys.rows, dim, i++, dim, dims - 1, dim_kinds);
+ }
+
+ // Ensure that the parameter divisors are the same as the divisor of
+ // the point.
+ const Coefficient& system_divisor
+ = dest.sys.rows[0].expr.inhomogeneous_term();
+
+ for (dimension_type i = dest.sys.rows.size() - 1, dim = dims; dim-- > 1; ) {
+ switch (dim_kinds[dim]) {
+ case PARAMETER:
+ dest.sys.rows[i].set_divisor(system_divisor);
+ // Intentionally fall through.
+ case LINE:
+ --i;
+ break;
+ case GEN_VIRTUAL:
+ break;
+ }
+ }
+
+#ifndef NDEBUG
+ // The previous code can modify the rows' fields, exploiting the friendness.
+ // Check that all rows are OK now.
+ for (dimension_type i = dest.sys.rows.size(); i-- > 0; )
+ PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+ PPL_ASSERT(dest.sys.OK());
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_defs.hh b/src/Grid_defs.hh
new file mode 100644
index 0000000..9aaf374
--- /dev/null
+++ b/src/Grid_defs.hh
@@ -0,0 +1,2665 @@
+/* Grid class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_defs_hh
+#define PPL_Grid_defs_hh 1
+
+#include "Grid_types.hh"
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include "Grid_Generator_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Grid_Certificate_types.hh"
+#include "Box_types.hh"
+#include "Polyhedron_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Grid
+ Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+ is written if \p gr is an empty grid; <CODE>true</CODE> is written
+ if \p gr is a universe grid; a minimized system of congruences
+ defining \p gr is written otherwise, all congruences in one row
+ separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid */
+void swap(Grid& x, Grid& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+ grid.
+
+ \relates Grid
+ Note that \p x and \p y may be dimension-incompatible grids: in
+ those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different
+ grids.
+
+ \relates Grid
+ Note that \p x and \p y may be dimension-incompatible grids: in
+ those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid represents a rational grid.
+
+ The domain of grids <EM>optimally supports</EM>:
+ - all (proper and non-proper) congruences;
+ - tautological and inconsistent constraints;
+ - linear equality constraints (i.e., non-proper congruences).
+
+ Depending on the method, using a constraint that is not optimally
+ supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ The domain of grids support a concept of double description similar
+ to the one developed for polyhedra: hence, a grid can be specified
+ as either a finite system of congruences or a finite system of
+ generators (see Section \ref sect_rational_grids) and it is always
+ possible to obtain either representation.
+ That is, if we know the system of congruences, we can obtain
+ from this a system of generators that define the same grid
+ and vice versa.
+ These systems can contain redundant members, or they can be in the
+ minimal form.
+
+ A key attribute of any grid is its space dimension (the dimension
+ \f$n \in \Nset\f$ of the enclosing vector space):
+
+ - all grids, the empty ones included, are endowed with a space
+ dimension;
+ - most operations working on a grid and another object (another
+ grid, a congruence, a generator, a set of variables, etc.) will
+ throw an exception if the grid and the object are not
+ dimension-compatible (see Section \ref Grid_Space_Dimensions);
+ - the only ways in which the space dimension of a grid can be
+ changed are with <EM>explicit</EM> calls to operators provided for
+ that purpose, and with standard copy, assignment and swap
+ operators.
+
+ Note that two different grids can be defined on the zero-dimension
+ space: the empty grid and the universe grid \f$R^0\f$.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+ used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a grid corresponding to the even integer
+ pairs in \f$\Rset^2\f$, given as a system of congruences:
+ \code
+ Congruence_System cgs;
+ cgs.insert((x %= 0) / 2);
+ cgs.insert((y %= 0) / 2);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying three of the points:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_point(0*x + 2*y));
+ gs.insert(grid_point(2*x + 0*y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 2
+ The following code builds a grid corresponding to a line in
+ \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x - y == 0);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying a point and a line:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_line(x + y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 3
+ The following code builds a grid corresponding to the integral
+ points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+ by adding an equality and congruence to the universe grid:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x - y == 0);
+ cgs.insert(x %= 0);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying a point and a parameter:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(parameter(x + y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 4
+ The following code builds the grid corresponding to a plane by
+ creating the universe grid in \f$\Rset^2\f$:
+ \code
+ Grid gr(2);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+ generators (a point, and two lines).
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_line(x));
+ gr.add_grid_generator(grid_line(y));
+ \endcode
+ Note that a generator system must contain a point when describing
+ a grid. To ensure that this is always the case it is required
+ that the first generator inserted in an empty grid is a point
+ (otherwise, an exception is thrown).
+
+ \par Example 5
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_embed</CODE>:
+ \code
+ Grid gr(1);
+ gr.add_congruence(x == 2);
+ gr.add_space_dimensions_and_embed(1);
+ \endcode
+ We build the universe grid in the 1-dimension space \f$\Rset\f$.
+ Then we add a single equality congruence,
+ thus obtaining the grid corresponding to the singleton set
+ \f$\{ 2 \} \sseq \Rset\f$.
+ After the last line of code, the resulting grid is
+ \f[
+ \bigl\{\,
+ (2, y)^\transpose \in \Rset^2
+ \bigm|
+ y \in \Rset
+ \,\bigr\}.
+ \f]
+
+ \par Example 6
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_project</CODE>:
+ \code
+ Grid gr(1);
+ gr.add_congruence(x == 2);
+ gr.add_space_dimensions_and_project(1);
+ \endcode
+ The first two lines of code are the same as in Example 4 for
+ <CODE>add_space_dimensions_and_embed</CODE>.
+ After the last line of code, the resulting grid is
+ the singleton set
+ \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+ \par Example 7
+ The following code shows the use of the function
+ <CODE>affine_image</CODE>:
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_point(4*x + 0*y));
+ gr.add_grid_generator(grid_point(0*x + 2*y));
+ Linear_Expression expr = x + 3;
+ gr.affine_image(x, expr);
+ \endcode
+ In this example the starting grid is all the pairs of \f$x\f$ and
+ \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+ and \f$y\f$ is an integer multiple of 2. The considered variable
+ is \f$x\f$ and the affine expression is \f$x+3\f$. The resulting
+ grid is the given grid translated 3 integers to the right (all the
+ pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+ and \f$y\f$ is an integer multiple of 2).
+ Moreover, if the affine transformation for the same variable \p x
+ is instead \f$x+y\f$:
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting grid is every second integral point along the \f$x=y\f$
+ line, with this line of points repeated at every fourth integral value
+ along the \f$x\f$ axis.
+ Instead, if we do not use an invertible transformation for the
+ same variable; for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting grid is every second point along the \f$x=y\f$ line.
+
+ \par Example 8
+ The following code shows the use of the function
+ <CODE>affine_preimage</CODE>:
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_point(4*x + 0*y));
+ gr.add_grid_generator(grid_point(0*x + 2*y));
+ Linear_Expression expr = x + 3;
+ gr.affine_preimage(x, expr);
+ \endcode
+ In this example the starting grid, \p var and the affine
+ expression and the denominator are the same as in Example 6, while
+ the resulting grid is similar but translated 3 integers to the
+ left (all the pairs \f$(x, y)\f$
+ where \f$x\f$ is -3 plus an integer multiple of 4 and
+ \f$y\f$ is an integer multiple of 2)..
+ Moreover, if the affine transformation for \p x is \f$x+y\f$
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting grid is a similar grid to the result in Example 6,
+ only the grid is slanted along \f$x=-y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable \p x, for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting grid is every fourth line parallel to the \f$x\f$
+ axis.
+
+ \par Example 9
+ For this example we also use the variables:
+ \code
+ Variable z(2);
+ Variable w(3);
+ \endcode
+ The following code shows the use of the function
+ <CODE>remove_space_dimensions</CODE>:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(3*x + y +0*z + 2*w));
+ Grid gr(gs);
+ Variables_Set vars;
+ vars.insert(y);
+ vars.insert(z);
+ gr.remove_space_dimensions(vars);
+ \endcode
+ The starting grid is the singleton set
+ \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+ the resulting grid is
+ \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+ Be careful when removing space dimensions <EM>incrementally</EM>:
+ since dimensions are automatically renamed after each application
+ of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+ results can be obtained.
+ For instance, by using the following code we would obtain
+ a different result:
+ \code
+ set<Variable> vars1;
+ vars1.insert(y);
+ gr.remove_space_dimensions(vars1);
+ set<Variable> vars2;
+ vars2.insert(z);
+ gr.remove_space_dimensions(vars2);
+ \endcode
+ In this case, the result is the grid
+ \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+ when removing the set of dimensions \p vars2
+ we are actually removing variable \f$w\f$ of the original grid.
+ For the same reason, the operator \p remove_space_dimensions
+ is not idempotent: removing twice the same non-empty set of dimensions
+ is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+ //! The numeric type of coefficients.
+ typedef Coefficient coefficient_type;
+
+ //! Returns the maximum space dimension all kinds of Grid can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns true indicating that this domain has methods that
+ can recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+ /*! \brief
+ Returns true indicating that this domain has methods that
+ can recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ //! Builds a grid having the specified properties.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the grid;
+
+ \param kind
+ Specifies whether the universe or the empty grid has to be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a grid, copying a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Congruence_System& cgs);
+
+ //! Builds a grid, recycling a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ Grid(Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds a grid, copying a system of constraints.
+ /*!
+ The grid inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the grid.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains inequality constraints.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Constraint_System& cs);
+
+ //! Builds a grid, recycling a system of constraints.
+ /*!
+ The grid inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains inequality constraints.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ Grid(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a grid, copying a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of generators defining the grid.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Grid_Generator_System& ggs);
+
+ //! Builds a grid, recycling a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of generators defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+ */
+ Grid(Grid_Generator_System& ggs, Recycle_Input dummy);
+
+ //! Builds a grid out of a box.
+ /*!
+ The grid inherits the space dimension of the box.
+ The built grid is the most precise grid that includes the box.
+
+ \param box
+ The box representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Grid(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a grid out of a bounded-difference shape.
+ /*!
+ The grid inherits the space dimension of the BDS.
+ The built grid is the most precise grid that includes the BDS.
+
+ \param bd
+ The BDS representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Grid(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a grid out of an octagonal shape.
+ /*!
+ The grid inherits the space dimension of the octagonal shape.
+ The built grid is the most precise grid that includes the octagonal shape.
+
+ \param os
+ The octagonal shape representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Grid(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Builds a grid from a polyhedron using algorithms whose complexity
+ does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+ smallest one containing \p ph.
+
+ The grid inherits the space dimension of polyhedron.
+
+ \param ph
+ The polyhedron.
+
+ \param complexity
+ The complexity class.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Grid(const Grid& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ Grid& operator=(const Grid& y);
+
+ //! \name Member Functions that Do Not Modify the Grid
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns
+ the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ /*! \brief
+ Returns a system of equality constraints satisfied by \p *this
+ with the same affine dimension as \p *this.
+ */
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Returns a minimal system of equality constraints satisfied by
+ \p *this with the same affine dimension as \p *this.
+ */
+ Constraint_System minimized_constraints() const;
+
+ //! Returns the system of congruences.
+ const Congruence_System& congruences() const;
+
+ //! Returns the system of congruences in minimal form.
+ const Congruence_System& minimized_congruences() const;
+
+ //! Returns the system of generators.
+ const Grid_Generator_System& grid_generators() const;
+
+ //! Returns the minimized system of generators.
+ const Grid_Generator_System& minimized_grid_generators() const;
+
+ //! Returns the relations holding between \p *this and \p cg.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ // FIXME: Poly_Con_Relation seems to encode exactly what we want
+ // here. We must find a new name for that class. Temporarily,
+ // we keep using it without changing the name.
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ // FIXME: see the comment for Poly_Con_Relation above.
+ Poly_Gen_Relation
+ relation_with(const Grid_Generator& g) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ // FIXME: see the comment for Poly_Con_Relation above.
+ Poly_Gen_Relation
+ relation_with(const Generator& g) const;
+
+ //! Returns the relations holding between \p *this and \p c.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ // FIXME: Poly_Con_Relation seems to encode exactly what we want
+ // here. We must find a new name for that class. Temporarily,
+ // we keep using it without changing the name.
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns \c true if and only if \p *this is an empty grid.
+ bool is_empty() const;
+
+ //! Returns \c true if and only if \p *this is a universe grid.
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a
+ topologically closed subset of the vector space.
+
+ A grid is always topologically closed.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Grid& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ /*!
+ A grid is discrete if it can be defined by a generator system which
+ contains only points and parameters. This includes the empty grid
+ and any grid in dimension zero.
+ */
+ bool is_discrete() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_below.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_above.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+ Always <CODE>true</CODE> when \p this bounds \p expr. Present for
+ interface compatibility with class Polyhedron, where closure
+ points can result in a value of false.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+ maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+ Always <CODE>true</CODE> when \p this bounds \p expr. Present for
+ interface compatibility with class Polyhedron, where closure
+ points can result in a value of false;
+
+ \param point
+ When maximization succeeds, will be assigned a point where \p expr
+ reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p point are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& point) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the is the infimum value can be reached in \p
+ this. Always <CODE>true</CODE> when \p this bounds \p expr.
+ Present for interface compatibility with class Polyhedron, where
+ closure points can result in a value of false.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the is the infimum value can be reached in \p
+ this. Always <CODE>true</CODE> when \p this bounds \p expr.
+ Present for interface compatibility with class Polyhedron, where
+ closure points can result in a value of false;
+
+ \param point
+ When minimization succeeds, will be assigned a point where \p expr
+ reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+ is defined, in which case the frequency and the value for \p expr
+ that is closest to zero are computed.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ The numerator of the maximum frequency of \p expr;
+
+ \param freq_d
+ The denominator of the maximum frequency of \p expr;
+
+ \param val_n
+ The numerator of them value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \param val_d
+ The denominator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or frequency is undefined with respect to \p expr,
+ then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Grid& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this strictly
+ contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Grid& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if \p *this satisfies all the
+ invariants and either \p check_not_empty is <CODE>false</CODE> or
+ \p *this is not empty.
+
+ \param check_not_empty
+ <CODE>true</CODE> if and only if, in addition to checking the
+ invariants, \p *this must be checked to be not empty.
+
+ The check is performed so as to intrude as little as possible. If
+ the library has been compiled with run-time assertions enabled,
+ error messages are written on <CODE>std::cerr</CODE> in case
+ invariants are violated. This is useful for the purpose of
+ debugging the library.
+ */
+ bool OK(bool check_not_empty = false) const;
+
+ //@} // Member Functions that Do Not Modify the Grid
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+ //@{
+
+ //! Adds a copy of congruence \p cg to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are
+ dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds a copy of grid generator \p g to the system of generators of
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible,
+ or if \p *this is an empty grid and \p g is not a point.
+ */
+ void add_grid_generator(const Grid_Generator& g);
+
+ //! Adds a copy of each congruence in \p cgs to \p *this.
+ /*!
+ \param cgs
+ Contains the congruences that will be added to the system of
+ congruences of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cgs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this a congruence equivalent to constraint \p c.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible
+ or if constraint \p c is not optimally supported by the grid domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+ \param cs
+ The constraints to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible
+ or if \p cs contains a constraint which is not optimally supported
+ by the grid domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+ \param cs
+ The constraints to be added. They may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible
+ or if \p cs contains a constraint which is not optimally supported
+ by the grid domain.
+
+ \warning
+ The only assumption that can be made about \p cs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ //! Uses a copy of the congruence \p cg to refine \p *this.
+ /*!
+ \param cg
+ The congruence used.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+ /*!
+ \param cgs
+ The congruences used.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ //! Uses a copy of the constraint \p c to refine \p *this.
+ /*!
+
+ \param c
+ The constraint used. If it is not an equality, it will be ignored
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Uses a copy of the constraints in \p cs to refine \p *this.
+ /*!
+ \param cs
+ The constraints used. Constraints that are not equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system of generators
+ of \p *this.
+
+ \param gs
+ Contains the generators that will be added to the system of
+ generators of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are dimension-incompatible, or if
+ \p *this is empty and the system of generators \p gs is not empty,
+ but has no points.
+ */
+ void add_grid_generators(const Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators of \p
+ *this.
+
+ \param gs
+ The generator system to be added to \p *this. The generators in
+ \p gs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p gs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_grid_generators(Grid_Generator_System& gs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the least upper bound of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Grid& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned to \p
+ *this and <CODE>true</CODE> is returned, otherwise
+ <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Convex_Polyhedral_Difference "grid-difference"
+ of \p *this and \p y.
+
+ The grid difference between grids x and y is the smallest grid
+ containing all the points from x and y that are only in x.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_Affine_Transformation
+ "affine image" of \p
+ *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering the generators of a grid, the
+ affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If congruences are up-to-date, it uses the specialized function
+ affine_preimage() (for the system of congruences)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq var} a_i x_i + b,
+ \f]
+ so that the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f]
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only generators remain
+ up-to-date.
+
+ \endif
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_Affine_Transformation
+ "affine preimage" of
+ \p *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering congruences of a grid, the affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If generators are up-to-date, then the specialized function
+ affine_image() is used (for the system of generators)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation, we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+ \f],
+ the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f].
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only congruences remain
+ up-to-date.
+
+ \endif
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to
+ the \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+ \pmod{\mathrm{modulus}}\f$.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+ Optional argument with an automatic value of one;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p
+ *this.
+ */
+ void
+ generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+ \pmod{\mathrm{modulus}}\f$.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+ Optional argument with an automatic value of one;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p
+ *this.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to
+ the \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p
+ rhs.
+ */
+ void
+ generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param rhs
+ The right hand side affine expression;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p
+ rhs.
+ */
+ void
+ generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+ "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Grid& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system.
+ This argument is for compatibility with wrap_assign()
+ for the other domains and only checked for dimension-compatibility.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator".
+ This argument is for compatibility with wrap_assign()
+ for the other domains and is ignored.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually.
+ As wrapping dimensions collectively does not improve the precision,
+ this argument is ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+
+ \warning
+ It is assumed that variables in \p Vars represent integers. Thus,
+ where the extra cost is negligible, the integrality of these
+ variables is enforced; possibly causing a non-integral grid to
+ become empty.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping all points with non-integer
+ coordinates.
+
+ \param complexity
+ This argument is ignored as the algorithm used has polynomial
+ complexity.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping all points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ This argument is ignored as the algorithm used has polynomial
+ complexity.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y using congruence systems.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y using generator systems.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y.
+
+ This widening uses either the congruence or generator systems
+ depending on which of the systems describing x and y
+ are up to date and minimized.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the congruence variant of
+ \ref Grid_Widening "Grid widening" computation by also enforcing
+ those congruences in \p cgs that are satisfied by all the points
+ of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_congruence_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the generator variant of the
+ \ref Grid_Widening "Grid widening"
+ computation by also enforcing those congruences in \p cgs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_generator_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the \ref Grid_Widening "Grid widening"
+ computation by also enforcing those congruences in \p cgs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+ \p m new space dimensions and embeds the old grid in the new
+ vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new grid, which is characterized by a system of congruences
+ in which the variables which are the new dimensions can have any
+ value. For instance, when starting from the grid \f$\cL \sseq
+ \Rset^2\f$ and adding a third space dimension, the result will be
+ the grid
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cL
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+ \p m new space dimensions to the grid and does not embed it
+ in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new grid, which is characterized by a system of congruences
+ in which the variables running through the new dimensions are all
+ constrained to be equal to 0. For instance, when starting from
+ the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+ dimension, the result will be the grid
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cL
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation" of
+ \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Grid& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that the
+ resulting space will have \ref Removing_Dimensions_from_the_Vector_Space
+ "dimension \p new_dimension."
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ If \p pfunc maps only some of the dimensions of \p *this then the
+ rest will be projected away.
+
+ If the highest dimension mapped to by \p pfunc is higher than the
+ highest dimension in \p *this then the number of dimensions in \p
+ *this will be increased to the highest dimension mapped to by \p
+ pfunc.
+
+ \param pfunc
+ The partial function specifying the destiny of each space
+ dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain of the
+ partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned. If \f$f\f$ is
+ undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing the grid.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==(const Grid& x, const Grid& y);
+
+ friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Grid();
+
+ /*! \brief
+ Swaps \p *this with grid \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void m_swap(Grid& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+
+ //! The system of congruences.
+ Congruence_System con_sys;
+
+ //! The system of generators.
+ Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+#include "Grid_Status_idefs.hh"
+#undef PPL_IN_Grid_CLASS
+
+ //! The status flags to keep track of the grid's internal state.
+ Status status;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ enum Dimension_Kind {
+ PARAMETER = 0,
+ LINE = 1,
+ GEN_VIRTUAL = 2,
+ PROPER_CONGRUENCE = PARAMETER,
+ CON_VIRTUAL = LINE,
+ EQUALITY = GEN_VIRTUAL
+ };
+
+ typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+ // The type of row associated with each dimension. If the virtual
+ // rows existed then the reduced systems would be square and upper
+ // or lower triangular, and the rows in each would have the types
+ // given in this vector. As the congruence system is reduced to an
+ // upside-down lower triangular form the ordering of the congruence
+ // types is last to first.
+ Dimension_Kinds dim_kinds;
+
+ //! Builds a grid universe or empty grid.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the grid;
+
+ \param kind
+ specifies whether the universe or the empty grid has to be built.
+ */
+ void construct(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a grid from a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid. Its data-structures
+ may be recycled to build the grid.
+ */
+ void construct(Congruence_System& cgs);
+
+ //! Builds a grid from a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of grid generators defining the grid. Its data-structures
+ may be recycled to build the grid.
+ */
+ void construct(Grid_Generator_System& ggs);
+
+ //! \name Private Verifiers: Verify if Individual Flags are Set
+ //@{
+
+ //! Returns <CODE>true</CODE> if the grid is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+ bool congruences_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+ bool generators_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+ bool congruences_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is minimized.
+ bool generators_are_minimized() const;
+
+ //@} // Private Verifiers: Verify if Individual Flags are Set
+
+ //! \name State Flag Setters: Set Only the Specified Flags
+ //@{
+
+ /*! \brief
+ Sets \p status to express that the grid is the universe
+ 0-dimension vector space, clearing all corresponding matrices.
+ */
+ void set_zero_dim_univ();
+
+ /*! \brief
+ Sets \p status to express that the grid is empty, clearing all
+ corresponding matrices.
+ */
+ void set_empty();
+
+ //! Sets \p status to express that congruences are up-to-date.
+ void set_congruences_up_to_date();
+
+ //! Sets \p status to express that generators are up-to-date.
+ void set_generators_up_to_date();
+
+ //! Sets \p status to express that congruences are minimized.
+ void set_congruences_minimized();
+
+ //! Sets \p status to express that generators are minimized.
+ void set_generators_minimized();
+
+ //@} // State Flag Setters: Set Only the Specified Flags
+
+ //! \name State Flag Cleaners: Clear Only the Specified Flag
+ //@{
+
+ //! Clears the \p status flag indicating that the grid is empty.
+ void clear_empty();
+
+ //! Sets \p status to express that congruences are out of date.
+ void clear_congruences_up_to_date();
+
+ //! Sets \p status to express that generators are out of date.
+ void clear_generators_up_to_date();
+
+ //! Sets \p status to express that congruences are no longer minimized.
+ void clear_congruences_minimized();
+
+ //! Sets \p status to express that generators are no longer minimized.
+ void clear_generators_minimized();
+
+ //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+ //! \name Updating Matrices
+ //@{
+
+ //! Updates and minimizes the congruences from the generators.
+ void update_congruences() const;
+
+ //! Updates and minimizes the generators from the congruences.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty grid.
+
+ It is illegal to call this method when the Status field already
+ declares the grid to be empty.
+ */
+ bool update_generators() const;
+
+ //@} // Updating Matrices
+
+ //! \name Minimization of Descriptions
+ //@{
+
+ //! Minimizes both the congruences and the generators.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty grid.
+
+ Minimization is performed on each system only if the minimized
+ Status field is clear.
+ */
+ bool minimize() const;
+
+ //@} // Minimization of Descriptions
+
+ enum Three_Valued_Boolean {
+ TVB_TRUE,
+ TVB_FALSE,
+ TVB_DONT_KNOW
+ };
+
+ //! Polynomial but incomplete equivalence test between grids.
+ Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+ bool is_included_in(const Grid& y) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param method_call
+ The call description of the public parent method, for example
+ "bounded_from_above(e)". Passed to throw_dimension_incompatible,
+ as the first argument.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param method_call
+ The call description of the public parent method, for example
+ "maximize(e)". Passed to throw_dimension_incompatible, as the
+ first argument;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr in \p
+ *this can actually be reached (which is always the case);
+
+ \param point
+ When maximization or minimization succeeds, will be assigned the
+ point where \p expr reaches the extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ const char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator* point = NULL) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+ is defined, in which case the frequency and the value for \p expr
+ that is closest to zero are computed.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ The numerator of the maximum frequency of \p expr;
+
+ \param freq_d
+ The denominator of the maximum frequency of \p expr;
+
+ \param val_n
+ The numerator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \param val_d
+ The denominator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ If \p *this is empty or frequency is undefined with respect to \p expr,
+ then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+
+ \warning
+ If \p expr and \p *this are dimension-incompatible,
+ the grid generator system is not minimized or \p *this is
+ empty, then the behavior is undefined.
+ */
+ bool frequency_no_check(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+ */
+ bool bounds_no_check(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Adds the congruence \p cg to \p *this.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the grid generator system is not minimized or \p *this is
+ empty, then the behavior is undefined.
+ */
+ void add_congruence_no_check(const Congruence& cg);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if c is a non-trivial inequality constraint.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void add_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added.
+ Non-trivial inequalities are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ //! \name Widening- and Extrapolation-Related Functions
+ //@{
+
+ //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+ void select_wider_congruences(const Grid& y,
+ Congruence_System& selected_cgs) const;
+
+ //! Copies widened generators from \p y to \p widened_ggs.
+ void select_wider_generators(const Grid& y,
+ Grid_Generator_System& widened_ggs) const;
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given systems.
+ /*!
+ \param cgs
+ A congruence system, to which columns are added;
+
+ \param gs
+ A generator system, to which rows and columns are added;
+
+ \param dims
+ The number of space dimensions to add.
+
+ This method is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE>.
+ */
+ void add_space_dimensions(Congruence_System& cgs,
+ Grid_Generator_System& gs,
+ dimension_type dims);
+
+ //! Adds new space dimensions to the given systems.
+ /*!
+ \param gs
+ A generator system, to which columns are added;
+
+ \param cgs
+ A congruence system, to which rows and columns are added;
+
+ \param dims
+ The number of space dimensions to add.
+
+ This method is invoked only by
+ <CODE>add_space_dimensions_and_project()</CODE>.
+ */
+ void add_space_dimensions(Grid_Generator_System& gs,
+ Congruence_System& cgs,
+ dimension_type dims);
+
+ //! \name Minimization-related Static Member Functions
+ //@{
+
+ //! Normalizes the divisors in \p sys.
+ /*!
+ Converts \p sys to an equivalent system in which the divisors are
+ of equal value.
+
+ \param sys
+ The generator system to be normalized. It must have at least one
+ row.
+
+ \param divisor
+ A reference to the initial value of the divisor. The resulting
+ value of this object is the new system divisor.
+
+ \param first_point
+ If \p first_point has a value other than NULL then it is taken as
+ the first point in \p sys, and it is assumed that any following
+ points have the same divisor as \p first_point.
+ */
+ static void
+ normalize_divisors(Grid_Generator_System& sys,
+ Coefficient& divisor,
+ const Grid_Generator* first_point = NULL);
+
+ //! Normalizes the divisors in \p sys.
+ /*!
+ Converts \p sys to an equivalent system in which the divisors are
+ of equal value.
+
+ \param sys
+ The generator system to be normalized. It must have at least one
+ row.
+ */
+ static void
+ normalize_divisors(Grid_Generator_System& sys);
+
+ //! Normalize all the divisors in \p sys and \p gen_sys.
+ /*!
+ Modify \p sys and \p gen_sys to use the same single divisor value
+ for all generators, leaving each system representing the grid it
+ represented originally.
+
+ \param sys
+ The first of the generator systems to be normalized.
+
+ \param gen_sys
+ The second of the generator systems to be normalized. This system
+ must have at least one row and the divisors of the generators in
+ this system must be equal.
+
+ \exception std::runtime_error
+ Thrown if all rows in \p gen_sys are lines and/or parameters.
+ */
+ static void normalize_divisors(Grid_Generator_System& sys,
+ Grid_Generator_System& gen_sys);
+
+ /*! \brief
+ Converts generator system \p dest to be equivalent to congruence
+ system \p source.
+ */
+ static void conversion(Congruence_System& source,
+ Grid_Generator_System& dest,
+ Dimension_Kinds& dim_kinds);
+
+ /*! \brief
+ Converts congruence system \p dest to be equivalent to generator
+ system \p source.
+ */
+ static void conversion(Grid_Generator_System& source,
+ Congruence_System& dest,
+ Dimension_Kinds& dim_kinds);
+
+ //! Converts \p cgs to upper triangular (i.e. minimized) form.
+ /*!
+ Returns <CODE>true</CODE> if \p cgs represents the empty set,
+ otherwise returns <CODE>false</CODE>.
+ */
+ static bool simplify(Congruence_System& cgs,
+ Dimension_Kinds& dim_kinds);
+
+ //! Converts \p gs to lower triangular (i.e. minimized) form.
+ /*!
+ Expects \p gs to contain at least one point.
+ */
+ static void simplify(Grid_Generator_System& ggs,
+ Dimension_Kinds& dim_kinds);
+
+ //! Reduces the line \p row using the line \p pivot.
+ /*!
+ Uses the line \p pivot to change the representation of the line
+ \p row so that the element at index \p column of \p row is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ static void reduce_line_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type column);
+
+ //! Reduces the equality \p row using the equality \p pivot.
+ /*!
+ Uses the equality \p pivot to change the representation of the
+ equality \p row so that the element at index \p column of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ static void reduce_equality_with_equality(Congruence& row,
+ const Congruence& pivot,
+ dimension_type column);
+
+ //! Reduces \p row using \p pivot.
+ /*!
+ Uses the point, parameter or proper congruence at \p pivot to
+ change the representation of the point, parameter or proper
+ congruence at \p row so that the element at index \p column of \p row
+ is zero. Only elements from index \p start to index \p end are
+ modified (i.e. it is assumed that all other elements are zero).
+ This means that \p col must be in [start,end).
+
+ NOTE: This may invalidate the rows, since it messes with the divisors.
+ Client code has to fix that (if needed) and assert OK().
+ */
+ // Part of Grid for access to Matrix<Dense_Row>::rows.
+ template <typename R>
+ static void reduce_pc_with_pc(R& row,
+ R& pivot,
+ dimension_type column,
+ dimension_type start,
+ dimension_type end);
+
+ //! Reduce \p row using \p pivot.
+ /*!
+ Use the line \p pivot to change the representation of the
+ parameter \p row such that the element at index \p column of \p row
+ is zero.
+ */
+ // This takes a parameter with type Swapping_Vector<Grid_Generator> (instead
+ // of Grid_Generator_System) to simplify the implementation of `simplify()'.
+ // NOTE: This may invalidate `row' and the rows in `sys'. Client code must
+ // fix/check this.
+ static void reduce_parameter_with_line(Grid_Generator& row,
+ const Grid_Generator& pivot,
+ dimension_type column,
+ Swapping_Vector<Grid_Generator>& sys,
+ dimension_type num_columns);
+
+ //! Reduce \p row using \p pivot.
+ /*!
+ Use the equality \p pivot to change the representation of the
+ congruence \p row such that element at index \p column of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ // This takes a parameter with type Swapping_Vector<Congruence> (instead of
+ // Congruence_System) to simplify the implementation of `conversion()'.
+ static void reduce_congruence_with_equality(Congruence& row,
+ const Congruence& pivot,
+ dimension_type column,
+ Swapping_Vector<Congruence>& sys);
+
+ //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+ /*!
+ Required when converting (or simplifying) a congruence or generator
+ system to "strong minimal form"; informally, strong minimal form means
+ that, not only is the system in minimal form (ie a triangular matrix),
+ but also the absolute values of the coefficients of the proper congruences
+ and parameters are minimal. As a simple example, the set of congruences
+ \f$\{3x \equiv_3 0, 4x + y \equiv_3 1\}\f$,
+ (which is in minimal form) is equivalent to the set
+ \f$\{3x \equiv_3 0, x + y \equiv_3 1\}\f$
+ (which is in strong minimal form).
+
+ \param sys
+ The generator or congruence system to be reduced to strong minimal form.
+
+ \param dim
+ Column to be reduced.
+
+ \param pivot_index
+ Index of last row to be reduced.
+
+ \param start
+ Index of first column to be changed.
+
+ \param end
+ Index of last column to be changed.
+
+ \param sys_dim_kinds
+ Dimension kinds of the elements of \p sys.
+
+ \param generators
+ Flag indicating whether \p sys is a congruence or generator system
+ */
+ template <typename M>
+ // This takes a parameter with type `Swapping_Vector<M::row_type>'
+ // instead of `M' to simplify the implementation of simplify().
+ // NOTE: This may invalidate the rows in `sys'. Client code must
+ // fix/check this.
+ static void reduce_reduced(Swapping_Vector<typename M::row_type>& sys,
+ dimension_type dim,
+ dimension_type pivot_index,
+ dimension_type start, dimension_type end,
+ const Dimension_Kinds& sys_dim_kinds,
+ bool generators = true);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Matrix<Dense_Row>::rows and cgs::operator[].
+ // The type of `dest' is Swapping_Vector<Congruence> instead of
+ // Congruence_System to simplify the implementation of conversion().
+ static void multiply_grid(const Coefficient& multiplier,
+ Congruence& cg,
+ Swapping_Vector<Congruence>& dest,
+ dimension_type num_rows);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Grid_Generator::operator[].
+ // The type of `dest' is Swapping_Vector<Grid_Generator> instead of
+ // Grid_Generator_System to simplify the implementation of conversion().
+ // NOTE: This does not check whether the rows are OK(). Client code
+ // should do that.
+ static void multiply_grid(const Coefficient& multiplier,
+ Grid_Generator& gen,
+ Swapping_Vector<Grid_Generator>& dest,
+ dimension_type num_rows);
+
+ /*! \brief
+ If \p sys is lower triangular return <CODE>true</CODE>, else
+ return <CODE>false</CODE>.
+ */
+ static bool lower_triangular(const Congruence_System& sys,
+ const Dimension_Kinds& dim_kinds);
+
+ /*! \brief
+ If \p sys is upper triangular return <CODE>true</CODE>, else
+ return <CODE>false</CODE>.
+ */
+ static bool upper_triangular(const Grid_Generator_System& sys,
+ const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+ //! Checks that trailing rows contain only zero terms.
+ /*!
+ If all columns contain zero in the rows of \p system from row
+ index \p first to row index \p last then return <code>true</code>,
+ else return <code>false</code>. \p row_size gives the number of
+ columns in each row.
+
+ This method is only used in assertions in the simplify methods.
+ */
+ template <typename M, typename R>
+ static bool rows_are_zero(M& system,
+ dimension_type first,
+ dimension_type last,
+ dimension_type row_size);
+#endif
+
+ //@} // Minimization-Related Static Member Functions
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \name Exception Throwers
+ //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+ void throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gr_name,
+ const Grid& gr) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Grid_Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Grid_Generator_System& gs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ static void throw_invalid_argument(const char* method,
+ const char* reason);
+ static void throw_invalid_constraint(const char* method,
+ const char* c_name);
+ static void throw_invalid_constraints(const char* method,
+ const char* cs_name);
+ static void throw_invalid_generator(const char* method,
+ const char* g_name);
+ static void throw_invalid_generators(const char* method,
+ const char* gs_name);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+};
+
+#include "Grid_Status_inlines.hh"
+#include "Grid_inlines.hh"
+#include "Grid_templates.hh"
+
+#endif // !defined(PPL_Grid_defs_hh)
diff --git a/src/Grid_inlines.hh b/src/Grid_inlines.hh
new file mode 100644
index 0000000..5c496dc
--- /dev/null
+++ b/src/Grid_inlines.hh
@@ -0,0 +1,383 @@
+/* Grid class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_inlines_hh
+#define PPL_Grid_inlines_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+ return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+ return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+ return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+ return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+ return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+ status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+ set_congruences_up_to_date();
+ status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+ set_generators_up_to_date();
+ status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+ status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+ status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+ status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+ clear_congruences_minimized();
+ status.reset_c_up_to_date();
+ // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+ clear_generators_minimized();
+ status.reset_g_up_to_date();
+ // Can get rid of gen_sys here.
+}
+
+inline dimension_type
+Grid::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return std::min(std::numeric_limits<dimension_type>::max() - 1,
+ std::min(Congruence_System::max_space_dimension(),
+ Grid_Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline
+Grid::Grid(dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : con_sys(),
+ gen_sys(check_space_dimension_overflow(num_dimensions,
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension")) {
+ construct(num_dimensions, kind);
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid::Grid(const Congruence_System& cgs)
+ : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cgs.space_dimension()) {
+ Congruence_System cgs_copy(cgs);
+ construct(cgs_copy);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+ : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cgs, recycle)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cgs.space_dimension()) {
+ construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& ggs)
+ : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(ggs)",
+ "the space dimension of ggs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(ggs.space_dimension()) {
+ Grid_Generator_System ggs_copy(ggs);
+ construct(ggs_copy);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+ : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(ggs, recycle)",
+ "the space dimension of ggs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(ggs.space_dimension()) {
+ construct(ggs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd, Complexity_Class)
+ : con_sys(check_space_dimension_overflow(bd.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(bd.space_dimension()) {
+ Congruence_System cgs = bd.congruences();
+ construct(cgs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const Octagonal_Shape<U>& os, Complexity_Class)
+ : con_sys(check_space_dimension_overflow(os.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(os.space_dimension()) {
+ Congruence_System cgs = os.congruences();
+ construct(cgs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+ return space_dim;
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline int32_t
+Grid::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+inline Constraint_System
+Grid::constraints() const {
+ return Constraint_System(congruences());
+}
+
+inline Constraint_System
+Grid::minimized_constraints() const {
+ return Constraint_System(minimized_congruences());
+}
+
+inline void
+Grid::m_swap(Grid& y) {
+ using std::swap;
+ swap(con_sys, y.con_sys);
+ swap(gen_sys, y.gen_sys);
+ swap(status, y.status);
+ swap(space_dim, y.space_dim);
+ swap(dim_kinds, y.dim_kinds);
+}
+
+inline void
+Grid::add_congruence(const Congruence& cg) {
+ // Dimension-compatibility check.
+ if (space_dim < cg.space_dimension())
+ throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+ if (!marked_empty())
+ add_congruence_no_check(cg);
+}
+
+inline void
+Grid::add_congruences(const Congruence_System& cgs) {
+ // TODO: this is just an executable specification.
+ // Space dimension compatibility check.
+ if (space_dim < cgs.space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+ if (!marked_empty()) {
+ Congruence_System cgs_copy = cgs;
+ add_recycled_congruences(cgs_copy);
+ }
+}
+
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+ add_congruence(cg);
+}
+
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+inline bool
+Grid::can_recycle_constraint_systems() {
+ return true;
+}
+
+inline bool
+Grid::can_recycle_congruence_systems() {
+ return true;
+}
+
+inline void
+Grid::add_constraint(const Constraint& c) {
+ // Space dimension compatibility check.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", "c", c);
+ if (!marked_empty())
+ add_constraint_no_check(c);
+}
+
+inline void
+Grid::add_recycled_constraints(Constraint_System& cs) {
+ // TODO: really recycle the constraints.
+ add_constraints(cs);
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+ return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& point) const {
+ return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+inline void
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+ PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+ divisor = 1;
+ normalize_divisors(sys, divisor);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+ return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+ const Grid& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+}
+
+/*! \relates Grid */
+inline void
+swap(Grid& x, Grid& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_inlines_hh)
diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc
new file mode 100644
index 0000000..69fadd8
--- /dev/null
+++ b/src/Grid_nonpublic.cc
@@ -0,0 +1,846 @@
+/* Grid class implementation
+ (non-inline private or protected functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+ \brief
+ Controls the laziness level of the implementation.
+
+ Temporarily used in a few of the function implementations to
+ switch to an even more lazy algorithm. To be removed as soon as
+ we collect enough information to decide which is the better
+ implementation alternative.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::construct(dimension_type num_dimensions,
+ const Degenerate_Element kind) {
+ space_dim = num_dimensions;
+
+ if (kind == EMPTY) {
+ // Set emptiness directly instead of with set_empty, as gen_sys is
+ // already correctly initialized.
+ status.set_empty();
+
+ // Extend the zero dim false congruence system to the appropriate
+ // dimension and then store it in `con_sys'.
+ Congruence_System cgs(Congruence::zero_dim_false());
+ cgs.set_space_dimension(space_dim);
+ swap(con_sys, cgs);
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (space_dim == 0) {
+ set_zero_dim_univ();
+ return;
+ }
+
+ // Initialize both systems to universe representations.
+ set_congruences_minimized();
+ set_generators_minimized();
+ dim_kinds.resize(space_dim + 1);
+
+ // Building a universe congruence system.
+ // Extend the zero dim integrality congruence system to the
+ // appropriate dimension and then store it in `con_sys'.
+ Congruence_System cgs(Congruence::zero_dim_integrality());
+ cgs.set_space_dimension(num_dimensions);
+ // Recover minimal form after cgs(zdi) normalization.
+ cgs.rows[0].expr.set_inhomogeneous_term(Coefficient_one());
+ PPL_ASSERT(cgs.OK());
+ swap(con_sys, cgs);
+
+ // Building a universe grid generator system (and dim_kinds).
+ gen_sys.set_space_dimension(space_dim);
+ gen_sys.insert(grid_point());
+ dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
+ for (dimension_type dim = 0; dim < space_dim; ++dim) {
+ gen_sys.insert(grid_line(Variable(dim)));
+ dim_kinds[1+dim] = CON_VIRTUAL /* a.k.a. LINE */;
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::construct(Congruence_System& cgs) {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(cgs.space_dimension() <= max_space_dimension());
+ // Preparing con_sys and gen_sys is up to the caller.
+ PPL_ASSERT(cgs.space_dimension() == con_sys.space_dimension());
+ PPL_ASSERT(cgs.space_dimension() == gen_sys.space_dimension());
+ PPL_ASSERT(con_sys.has_no_rows());
+ PPL_ASSERT(gen_sys.has_no_rows());
+
+ // Set the space dimension.
+ space_dim = cgs.space_dimension();
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cgs'.
+ con_sys.m_swap(cgs);
+ con_sys.normalize_moduli();
+ set_congruences_up_to_date();
+ }
+ else {
+ // Here `space_dim == 0'.
+ // See if an inconsistent congruence has been passed.
+ for (dimension_type i = cgs.num_rows(); i-- > 0; )
+ if (cgs[i].is_inconsistent()) {
+ // Inconsistent congruence found: the grid is empty.
+ status.set_empty();
+ // Insert the zero dim false congruence system into `con_sys'.
+ // `gen_sys' is already in empty form.
+ con_sys.insert(Congruence::zero_dim_false());
+ PPL_ASSERT(OK());
+ return;
+ }
+ set_zero_dim_univ();
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::construct(Grid_Generator_System& ggs) {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(ggs.space_dimension() <= max_space_dimension());
+ // Preparing con_sys and gen_sys is up to the caller.
+ PPL_ASSERT(ggs.space_dimension() == con_sys.space_dimension());
+ PPL_ASSERT(ggs.space_dimension() == gen_sys.space_dimension());
+ PPL_ASSERT(con_sys.has_no_rows());
+ PPL_ASSERT(gen_sys.has_no_rows());
+
+ // Set the space dimension.
+ space_dim = ggs.space_dimension();
+
+ // An empty set of generators defines the empty grid.
+ if (ggs.has_no_rows()) {
+ status.set_empty();
+ // Insert the zero dim false congruence system into `con_sys'.
+ // `gen_sys' is already in empty form.
+ con_sys.insert(Congruence::zero_dim_false());
+ return;
+ }
+
+ // Non-empty valid generator systems have a supporting point, at least.
+ if (!ggs.has_points())
+ throw_invalid_generators("Grid(ggs)", "ggs");
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Steal the rows from `ggs'.
+ gen_sys.m_swap(ggs);
+ normalize_divisors(gen_sys);
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+ }
+
+ PPL_ASSERT(OK());
+}
+
+PPL::Grid::Three_Valued_Boolean
+PPL::Grid::quick_equivalence_test(const Grid& y) const {
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+ const Grid& x = *this;
+
+ bool css_normalized = false;
+
+ if (x.congruences_are_minimized() && y.congruences_are_minimized()) {
+ // Equivalent minimized congruence systems have:
+ // - the same number of congruences; ...
+ if (x.con_sys.num_rows() != y.con_sys.num_rows())
+ return Grid::TVB_FALSE;
+ // - the same number of equalities; ...
+ const dimension_type x_num_equalities = x.con_sys.num_equalities();
+ if (x_num_equalities != y.con_sys.num_equalities())
+ return Grid::TVB_FALSE;
+ // - and if there are no equalities, the same congruences.
+ // Delay this test: try cheaper tests on generators first.
+ css_normalized = (x_num_equalities == 0);
+ }
+
+ if (x.generators_are_minimized() && y.generators_are_minimized()) {
+ // Equivalent minimized generator systems have:
+ // - the same number of generators; ...
+ if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
+ return Grid::TVB_FALSE;
+ // - the same number of lines; ...
+ const dimension_type x_num_lines = x.gen_sys.num_lines();
+ if (x_num_lines != y.gen_sys.num_lines())
+ return Grid::TVB_FALSE;
+ // - and if there are no lines, the same generators.
+ if (x_num_lines == 0) {
+ // Check for syntactic identity.
+ if (x.gen_sys == y.gen_sys)
+ return Grid::TVB_TRUE;
+ else
+ return Grid::TVB_FALSE;
+ }
+ }
+
+ // TODO: Consider minimizing the systems and re-performing these
+ // checks.
+
+ if (css_normalized) {
+ if (x.con_sys == y.con_sys)
+ return Grid::TVB_TRUE;
+ else
+ return Grid::TVB_FALSE;
+ }
+
+ return Grid::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Grid::is_included_in(const Grid& y) const {
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+ const Grid& x = *this;
+
+#if BE_LAZY
+ if (!x.generators_are_up_to_date() && !x.update_generators())
+ // Updating found `x' empty.
+ return true;
+ if (!y.congruences_are_up_to_date())
+ y.update_congruences();
+#else
+ if (!x.generators_are_minimized() && !x.minimize())
+ // Minimizing found `x' empty.
+ return true;
+ if (!y.congruences_are_minimized())
+ y.minimize();
+#endif
+
+ PPL_ASSERT(x.OK());
+ PPL_ASSERT(y.OK());
+
+ const Grid_Generator_System& gs = x.gen_sys;
+ const Congruence_System& cgs = y.con_sys;
+
+ const dimension_type num_rows = gs.num_rows();
+ for (dimension_type i = num_rows; i-- > 0; )
+ if (!cgs.satisfies_all_congruences(gs[i]))
+ return false;
+
+ // Inclusion holds.
+ return true;
+}
+
+bool
+PPL::Grid::bounds(const Linear_Expression& expr,
+ const char* method_call) const {
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible(method_call, "e", expr);
+
+ // A zero-dimensional or empty grid bounds everything.
+ if (space_dim == 0
+ || marked_empty()
+ || (!generators_are_up_to_date() && !update_generators()))
+ return true;
+ if (!generators_are_minimized() && !minimize())
+ // Minimizing found `this' empty.
+ return true;
+
+ return bounds_no_check(expr);
+}
+
+bool
+PPL::Grid::bounds_no_check(const Linear_Expression& expr) const {
+ // The dimension of `expr' must be at most the dimension of *this.
+ PPL_ASSERT(space_dim > 0 && space_dim >= expr.space_dimension());
+ PPL_ASSERT(generators_are_minimized() && !marked_empty());
+
+ // The generators are up to date and minimized.
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Grid_Generator& g = gen_sys[i];
+ // Only lines and parameters in `*this' can cause `expr' to be
+ // unbounded.
+ if (g.is_line_or_parameter()) {
+ const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+ if (sp_sign != 0)
+ // `*this' does not bound `expr'.
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+PPL::Grid::frequency_no_check(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+
+ // The dimension of `expr' must be at most the dimension of *this.
+ PPL_ASSERT(space_dim >= expr.space_dimension());
+ PPL_ASSERT(generators_are_minimized() && !marked_empty());
+
+ // The generators are up to date and minimized and the grid is non-empty.
+
+ // If the grid is bounded for the expression `expr',
+ // then `expr' has a constant value and the frequency is 0.
+ if (bounds_no_check(expr)) {
+ freq_n = 0;
+ freq_d = 1;
+ // Find the value of the constant expression.
+ const Grid_Generator& point = gen_sys[0];
+ val_d = point.divisor();
+ Scalar_Products::homogeneous_assign(val_n, expr, point);
+ val_n += expr.inhomogeneous_term() * val_d;
+ // Reduce `val_n' and `val_d'.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd_assign(gcd, val_n, val_d);
+ exact_div_assign(val_n, val_n, gcd);
+ exact_div_assign(val_d, val_d, gcd);
+ return true;
+ }
+
+ // The frequency is the gcd of the scalar products of the parameters
+ // in `gen_sys'.
+ const dimension_type num_rows = gen_sys.num_rows();
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+ freq_n = 0;
+
+ // As the generators are minimized, `gen_sys[0]' is a point
+ // and considered later.
+ for (dimension_type row = 1; row < num_rows; ++row) {
+ const Grid_Generator& gen = gen_sys[row];
+ Scalar_Products::homogeneous_assign(sp, expr, gen);
+ if (gen.is_line()) {
+ if (sgn(sp) != 0)
+ return false;
+ continue;
+ }
+ // `gen' must be a parameter.
+ PPL_ASSERT(gen.is_parameter());
+ if (sgn(sp) != 0)
+ gcd_assign(freq_n, freq_n, sp);
+ }
+ const Grid_Generator& point = gen_sys[0];
+ PPL_ASSERT(point.is_point());
+
+ // The denominator of the frequency and of the value is
+ // the divisor for the generators.
+ freq_d = point.divisor();
+ val_d = freq_d;
+
+ // As point is a grid generator, homogeneous_assign() must be used.
+ Scalar_Products::homogeneous_assign(val_n, expr, point);
+ val_n += expr.inhomogeneous_term() * val_d;
+
+ // Reduce `val_n' by the frequency `freq_n'.
+ val_n %= freq_n;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ // Reduce `freq_n' and `freq_d'.
+ gcd_assign(gcd, freq_n, freq_d);
+ exact_div_assign(freq_n, freq_n, gcd);
+ exact_div_assign(freq_d, freq_d, gcd);
+
+ // Reduce `val_n' and `val_d'.
+ gcd_assign(gcd, val_n, val_d);
+ exact_div_assign(val_n, val_n, gcd);
+ exact_div_assign(val_d, val_d, gcd);
+
+ return true;
+}
+
+bool
+PPL::Grid::max_min(const Linear_Expression& expr,
+ const char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator* point) const {
+ if (bounds(expr, method_call)) {
+ if (marked_empty())
+ return false;
+ if (space_dim == 0) {
+ ext_n = 0;
+ ext_d = 1;
+ included = true;
+ if (point != 0)
+ *point = Generator::point();
+ return true;
+ }
+ // Grid::bounds above ensures the generators are up to date.
+ if (!generators_are_minimized()) {
+ // Minimize the generator system.
+ Grid& gr = const_cast<Grid&>(*this);
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+ }
+
+ const Grid_Generator& gen = gen_sys[0];
+ Scalar_Products::homogeneous_assign(ext_n, expr, gen);
+ ext_n += expr.inhomogeneous_term();
+ ext_d = gen.divisor();
+ // Reduce ext_n and ext_d.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd_assign(gcd, ext_n, ext_d);
+ exact_div_assign(ext_n, ext_n, gcd);
+ exact_div_assign(ext_d, ext_d, gcd);
+
+ included = true;
+ if (point != 0) {
+ const Linear_Expression g_expr(gen.expression());
+ *point = Generator::point(g_expr, gen.divisor());
+ }
+ return true;
+ }
+ return false;
+}
+
+void
+PPL::Grid::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+ space_dim = 0;
+ con_sys.clear();
+ gen_sys.clear();
+ gen_sys.insert(grid_point());
+}
+
+void
+PPL::Grid::set_empty() {
+ status.set_empty();
+
+ // Replace gen_sys with an empty system of the right dimension.
+ Grid_Generator_System gs(space_dim);
+ gen_sys.m_swap(gs);
+
+ // Extend the zero dim false congruence system to the appropriate
+ // dimension and then swap it with `con_sys'.
+ Congruence_System cgs(Congruence::zero_dim_false());
+ cgs.set_space_dimension(space_dim);
+ swap(con_sys, cgs);
+}
+
+void
+PPL::Grid::update_congruences() const {
+ // The caller must ensure that the generators are up to date.
+ PPL_ASSERT(space_dim > 0);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(!gen_sys.has_no_rows());
+ PPL_ASSERT(gen_sys.space_dimension() > 0);
+
+ Grid& gr = const_cast<Grid&>(*this);
+
+ if (!generators_are_minimized())
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+
+ // `gen_sys' contained rows before being reduced, so it should
+ // contain at least a single point afterward.
+ PPL_ASSERT(!gen_sys.has_no_rows());
+
+ // Populate `con_sys' with congruences characterizing the grid
+ // described by `gen_sys'.
+ gr.conversion(gr.gen_sys, gr.con_sys, gr.dim_kinds);
+
+ // Both systems are minimized.
+ gr.set_congruences_minimized();
+ gr.set_generators_minimized();
+}
+
+bool
+PPL::Grid::update_generators() const {
+ PPL_ASSERT(space_dim > 0);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(congruences_are_up_to_date());
+
+ Grid& x = const_cast<Grid&>(*this);
+
+ if (!congruences_are_minimized())
+ // Either the system of congruences is consistent, or the grid is
+ // empty.
+ if (simplify(x.con_sys, x.dim_kinds)) {
+ x.set_empty();
+ return false;
+ }
+
+ // Populate gen_sys with generators characterizing the grid
+ // described by con_sys.
+ conversion(x.con_sys, x.gen_sys, x.dim_kinds);
+
+ // Both systems are minimized.
+ x.set_congruences_minimized();
+ x.set_generators_minimized();
+ return true;
+}
+
+bool
+PPL::Grid::minimize() const {
+ // 0-dimension and empty grids are already minimized.
+ if (marked_empty())
+ return false;
+ if (space_dim == 0)
+ return true;
+
+ // Are both systems already minimized?
+ if (congruences_are_minimized() && generators_are_minimized())
+ return true;
+
+ // Invoke update_generators, update_congruences or simplify,
+ // depending on the state of the systems.
+ if (congruences_are_up_to_date()) {
+ if (generators_are_up_to_date()) {
+ Grid& gr = const_cast<Grid&>(*this);
+ // Only one of the systems can be minimized here.
+ if (congruences_are_minimized()) {
+ // Minimize the generator system.
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+ }
+ else {
+#ifndef NDEBUG
+ // Both systems are up to date, and the empty case is handled
+ // above, so the grid should contain points.
+ bool empty = simplify(gr.con_sys, gr.dim_kinds);
+ PPL_ASSERT(!empty);
+#else
+ simplify(gr.con_sys, gr.dim_kinds);
+#endif
+ gr.set_congruences_minimized();
+ if (!generators_are_minimized()) {
+ // Minimize the generator system.
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+ }
+ }
+ }
+ else {
+ // Updating the generators may reveal that `*this' is empty.
+ const bool ret = update_generators();
+ PPL_ASSERT(OK());
+ return ret;
+ }
+ }
+ else {
+ PPL_ASSERT(generators_are_up_to_date());
+ update_congruences();
+ }
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+ Grid_Generator_System& gen_sys) {
+#ifndef NDEBUG
+ const dimension_type num_rows = gen_sys.num_rows();
+#endif
+ PPL_ASSERT(num_rows > 0);
+
+ // Find the first point in gen_sys.
+ dimension_type row = 0;
+ while (gen_sys[row].is_line_or_parameter()) {
+ ++row;
+ // gen_sys should have at least one point.
+ PPL_ASSERT(row < num_rows);
+ }
+ const Grid_Generator& first_point = gen_sys[row];
+ const Coefficient& gen_sys_divisor = first_point.divisor();
+
+#ifndef NDEBUG
+ // Check that the divisors in gen_sys are equal.
+ for (dimension_type i = row + 1; i < num_rows; ++i) {
+ const Grid_Generator& g = gen_sys[i];
+ if (g.is_parameter_or_point())
+ PPL_ASSERT(gen_sys_divisor == g.divisor());
+ }
+#endif // !defined(NDEBUG)
+
+ PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+ divisor = gen_sys_divisor;
+ // Adjust sys to include the gen_sys divisor.
+ normalize_divisors(sys, divisor);
+ if (divisor != gen_sys_divisor)
+ // Adjust gen_sys to use the new divisor.
+ //
+ // The points and parameters in gen_sys share a common divisor
+ // value, so the new divisor will be the LCM of this common
+ // divisor and `divisor', hence the third argument.
+ normalize_divisors(gen_sys, divisor, &first_point);
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+ Coefficient& divisor,
+ const Grid_Generator* first_point) {
+ PPL_ASSERT(divisor >= 0);
+ if (sys.space_dimension() > 0 && divisor > 0) {
+ const dimension_type num_rows = sys.num_rows();
+
+ if (first_point != 0)
+ lcm_assign(divisor, divisor, (*first_point).divisor());
+ else {
+ PPL_ASSERT(num_rows > 0);
+ // Move to the first point or parameter.
+ dimension_type row = 0;
+ while (sys[row].is_line())
+ if (++row == num_rows)
+ // All rows are lines.
+ return;
+
+ // Calculate the LCM of the given divisor and the divisor of
+ // every point or parameter.
+ while (row < num_rows) {
+ const Grid_Generator& g = sys[row];
+ if (g.is_parameter_or_point())
+ lcm_assign(divisor, divisor, g.divisor());
+ ++row;
+ }
+ }
+
+ // Represent every point and every parameter using the newly
+ // calculated divisor.
+ for (dimension_type i = num_rows; i-- > 0; )
+ sys.sys.rows[i].scale_to_divisor(divisor);
+
+ // Put the rows back into the linear system.
+ PPL_ASSERT(sys.sys.OK());
+ }
+}
+
+void
+PPL::Grid::add_congruence_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(space_dim >= cg.space_dimension());
+
+ // Dealing with a zero-dimensional space grid first.
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ set_empty();
+ return;
+ }
+
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ con_sys.insert(cg);
+
+ clear_congruences_minimized();
+ set_congruences_up_to_date();
+ clear_generators_up_to_date();
+
+ // Note: the congruence system may have become unsatisfiable, thus
+ // we do not check for satisfiability.
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_constraint_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(space_dim >= c.space_dimension());
+
+ if (c.is_inequality()) {
+ // Only trivial inequalities can be handled.
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (c.is_tautological())
+ return;
+ // Non-trivial inequality constraints are not allowed.
+ throw_invalid_constraint("add_constraint(c)", "c");
+ }
+
+ PPL_ASSERT(c.is_equality());
+ const Congruence cg(c);
+ add_congruence_no_check(cg);
+}
+
+void
+PPL::Grid::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(space_dim >= c.space_dimension());
+
+ if (c.is_equality()) {
+ const Congruence cg(c);
+ add_congruence_no_check(cg);
+ }
+ else if (c.is_inconsistent())
+ set_empty();
+}
+
+void
+PPL::Grid::throw_invalid_argument(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << other_name << ".space_dimension() == " << other_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* gr_name,
+ const Grid& gr) const {
+ throw_dimension_incompatible(method, gr_name, gr.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ throw_dimension_incompatible(method, le_name, le.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const {
+ throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const {
+ throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Grid_Generator& g) const {
+ throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const {
+ throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const {
+ throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const {
+ throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Grid_Generator_System& gs) const {
+ throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ const Variable var) const {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::
+throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required space dimension == " << required_space_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_constraint(const char* method,
+ const char* c_name) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << c_name << " is not an equality constraint.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_constraints(const char* method,
+ const char* cs_name) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << "the constraint system " << cs_name
+ << " contains inequalities.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generator(const char* method,
+ const char* g_name) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << "*this is an empty grid and "
+ << g_name << " is not a point.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generators(const char* method,
+ const char* gs_name) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << "*this is an empty grid and" << std::endl
+ << "the non-empty generator system " << gs_name << " contains no points.";
+ throw std::invalid_argument(s.str());
+}
diff --git a/src/Grid_public.cc b/src/Grid_public.cc
new file mode 100644
index 0000000..d2dcea2
--- /dev/null
+++ b/src/Grid_public.cc
@@ -0,0 +1,2890 @@
+/* Grid class implementation (non-inline public functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Topology_types.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// TODO: In the Grid constructors adapt and use the given system if it
+// is modifiable, instead of using a copy.
+
+PPL::Grid::Grid(const Grid& y, Complexity_Class)
+ : con_sys(),
+ gen_sys(),
+ status(y.status),
+ space_dim(y.space_dim),
+ dim_kinds(y.dim_kinds) {
+ if (space_dim == 0) {
+ con_sys = y.con_sys;
+ gen_sys = y.gen_sys;
+ }
+ else {
+ if (y.congruences_are_up_to_date())
+ con_sys = y.con_sys;
+ else
+ con_sys.set_space_dimension(space_dim);
+ if (y.generators_are_up_to_date())
+ gen_sys = y.gen_sys;
+ else
+ gen_sys = Grid_Generator_System(y.space_dim);
+ }
+}
+
+PPL::Grid::Grid(const Constraint_System& cs)
+ : con_sys(check_space_dimension_overflow(cs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cs.space_dimension()) {
+ space_dim = cs.space_dimension();
+
+ if (space_dim == 0) {
+ // See if an inconsistent constraint has been passed.
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ // Inconsistent constraint found: the grid is empty.
+ status.set_empty();
+ // Insert the zero dim false congruence system into `con_sys'.
+ // `gen_sys' is already in empty form.
+ con_sys.insert(Congruence::zero_dim_false());
+ PPL_ASSERT(OK());
+ return;
+ }
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ Congruence_System cgs(cs.space_dimension());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ cgs.insert(*i);
+ else
+ throw_invalid_constraints("Grid(cs)", "cs");
+ construct(cgs);
+}
+
+PPL::Grid::Grid(Constraint_System& cs, Recycle_Input)
+ : con_sys(check_space_dimension_overflow(cs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cs, recycle)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cs.space_dimension()) {
+ space_dim = cs.space_dimension();
+
+ if (space_dim == 0) {
+ // See if an inconsistent constraint has been passed.
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ // Inconsistent constraint found: the grid is empty.
+ status.set_empty();
+ // Insert the zero dim false congruence system into `con_sys'.
+ // `gen_sys' is already in empty form.
+ con_sys.insert(Congruence::zero_dim_false());
+ PPL_ASSERT(OK());
+ return;
+ }
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ Congruence_System cgs(space_dim);
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ cgs.insert(*i);
+ else
+ throw_invalid_constraint("Grid(cs)", "cs");
+ construct(cgs);
+}
+
+PPL::Grid::Grid(const Polyhedron& ph,
+ Complexity_Class complexity)
+ : con_sys(check_space_dimension_overflow(ph.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(ph)",
+ "the space dimension of ph "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(ph.space_dimension()) {
+ space_dim = ph.space_dimension();
+
+ // A zero-dim polyhedron causes no complexity problems.
+ if (space_dim == 0) {
+ if (ph.is_empty())
+ set_empty();
+ else
+ set_zero_dim_univ();
+ return;
+ }
+
+ // A polyhedron known to be empty causes no complexity problems.
+ if (ph.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ const bool use_constraints = ph.constraints_are_minimized()
+ || !ph.generators_are_up_to_date();
+
+ // Minimize the constraint description if it is needed and
+ // the complexity allows it.
+ if (use_constraints && complexity == ANY_COMPLEXITY)
+ if (!ph.minimize()) {
+ set_empty();
+ return;
+ }
+
+ if (use_constraints) {
+ // Only the equality constraints need be used.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+ const Constraint_System& cs = ph.constraints();
+ Congruence_System cgs(space_dim);
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ cgs.insert(*i);
+ construct(cgs);
+ }
+ else {
+ // First find a point or closure point and convert it to a
+ // grid point and add to the (initially empty) set of grid generators.
+ PPL_ASSERT(ph.generators_are_up_to_date());
+ const Generator_System& gs = ph.generators();
+ Grid_Generator_System ggs(space_dim);
+ Linear_Expression point_expr;
+ point_expr.set_space_dimension(space_dim);
+ PPL_DIRTY_TEMP_COEFFICIENT(point_divisor);
+ for (Generator_System::const_iterator g = gs.begin(),
+ gs_end = gs.end(); g != gs_end; ++g) {
+ if (g->is_point() || g->is_closure_point()) {
+ point_expr.linear_combine(g->expr, Coefficient_one(), Coefficient_one(),
+ 1, space_dim + 1);
+ point_divisor = g->divisor();
+ ggs.insert(grid_point(point_expr, point_divisor));
+ break;
+ }
+ }
+ // Add grid lines for all the other generators.
+ // If the polyhedron's generator is a (closure) point, the grid line must
+ // have the direction given by a line that joins the grid point already
+ // inserted and the new point.
+ for (Generator_System::const_iterator g = gs.begin(),
+ gs_end = gs.end(); g != gs_end; ++g) {
+ Linear_Expression e;
+ e.set_space_dimension(space_dim);
+ if (g->is_point() || g->is_closure_point()) {
+ e.linear_combine(point_expr, Coefficient_one(), g->divisor(),
+ 1, space_dim + 1);
+ e.linear_combine(g->expr, Coefficient_one(), -point_divisor,
+ 1, space_dim + 1);
+ if (e.all_homogeneous_terms_are_zero())
+ continue;
+ }
+ else {
+ e.linear_combine(g->expr, Coefficient_one(), Coefficient_one(),
+ 1, space_dim + 1);
+ }
+ ggs.insert(grid_line(e));
+ }
+ construct(ggs);
+ }
+ PPL_ASSERT(OK());
+}
+
+PPL::Grid&
+PPL::Grid::operator=(const Grid& y) {
+ space_dim = y.space_dim;
+ dim_kinds = y.dim_kinds;
+ if (y.marked_empty())
+ set_empty();
+ else if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ status = y.status;
+ if (y.congruences_are_up_to_date())
+ con_sys = y.con_sys;
+ if (y.generators_are_up_to_date())
+ gen_sys = y.gen_sys;
+ }
+ return *this;
+}
+
+PPL::dimension_type
+PPL::Grid::affine_dimension() const {
+ if (space_dim == 0 || is_empty())
+ return 0;
+
+ if (generators_are_up_to_date()) {
+ if (generators_are_minimized())
+ return gen_sys.num_rows() - 1;
+ if (!(congruences_are_up_to_date() && congruences_are_minimized()))
+ return minimized_grid_generators().num_rows() - 1;
+ }
+ else
+ minimized_congruences();
+ PPL_ASSERT(congruences_are_minimized());
+ dimension_type d = space_dim;
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i].is_equality())
+ --d;
+ return d;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::congruences() const {
+ if (marked_empty())
+ return con_sys;
+
+ if (space_dim == 0) {
+ // Zero-dimensional universe.
+ PPL_ASSERT(con_sys.num_rows() == 0 && con_sys.space_dimension() == 0);
+ return con_sys;
+ }
+
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ return con_sys;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::minimized_congruences() const {
+ if (congruences_are_up_to_date() && !congruences_are_minimized()) {
+ // Minimize the congruences.
+ Grid& gr = const_cast<Grid&>(*this);
+ if (gr.simplify(gr.con_sys, gr.dim_kinds))
+ gr.set_empty();
+ else
+ gr.set_congruences_minimized();
+ }
+ return congruences();
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::grid_generators() const {
+ if (space_dim == 0) {
+ PPL_ASSERT(gen_sys.space_dimension() == 0
+ && gen_sys.num_rows() == (marked_empty() ? 0U : 1U));
+ return gen_sys;
+ }
+
+ if (marked_empty()) {
+ PPL_ASSERT(gen_sys.has_no_rows());
+ return gen_sys;
+ }
+
+ if (!generators_are_up_to_date() && !update_generators()) {
+ // Updating found the grid empty.
+ const_cast<Grid&>(*this).set_empty();
+ return gen_sys;
+ }
+
+ return gen_sys;
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::minimized_grid_generators() const {
+ if (space_dim == 0) {
+ PPL_ASSERT(gen_sys.space_dimension() == 0
+ && gen_sys.num_rows() == (marked_empty() ? 0U : 1U));
+ return gen_sys;
+ }
+
+ if (marked_empty()) {
+ PPL_ASSERT(gen_sys.has_no_rows());
+ return gen_sys;
+ }
+
+ if (generators_are_up_to_date()) {
+ if (!generators_are_minimized()) {
+ // Minimize the generators.
+ Grid& gr = const_cast<Grid&>(*this);
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+ }
+ }
+ else if (!update_generators()) {
+ // Updating found the grid empty.
+ const_cast<Grid&>(*this).set_empty();
+ return gen_sys;
+ }
+
+ return gen_sys;
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Congruence& cg) const {
+ // Dimension-compatibility check.
+ if (space_dim < cg.space_dimension())
+ throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else if (cg.is_equality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ if (!generators_are_up_to_date() && !update_generators())
+ // Updating found the grid empty.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ // Return one of the relations
+ // 'strictly_intersects' a strict subset of the grid points satisfy cg
+ // 'is_included' every grid point satisfies cg
+ // 'is_disjoint' cg and the grid occupy separate spaces.
+
+ // There is always a point.
+
+ // Scalar product of the congruence and the first point that
+ // satisfies the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(point_sp);
+ point_sp = 0;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(div);
+ div = cg.modulus();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+
+ bool known_to_intersect = false;
+
+ for (Grid_Generator_System::const_iterator i = gen_sys.begin(),
+ i_end = gen_sys.end(); i != i_end; ++i) {
+ const Grid_Generator& g = *i;
+ Scalar_Products::assign(sp, cg, g);
+
+ switch (g.type()) {
+
+ case Grid_Generator::POINT:
+ if (cg.is_proper_congruence())
+ sp %= div;
+ if (sp == 0) {
+ // The point satisfies the congruence.
+ if (point_sp == 0)
+ // Any previous points satisfied the congruence.
+ known_to_intersect = true;
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ else {
+ if (point_sp == 0) {
+ if (known_to_intersect)
+ return Poly_Con_Relation::strictly_intersects();
+ // Assign `sp' to `point_sp' as `sp' is the scalar product
+ // of cg and a point g and is non-zero.
+ point_sp = sp;
+ }
+ else {
+ // A previously considered point p failed to satisfy cg such that
+ // `point_sp' = `scalar_prod(p, cg)'
+ // so, if we consider the parameter g-p instead of g, we have
+ // scalar_prod(g-p, cg) = scalar_prod(g, cg) - scalar_prod(p, cg)
+ // = sp - point_sp
+ sp -= point_sp;
+
+ if (sp != 0) {
+ // Find the GCD between sp and the previous GCD.
+ gcd_assign(div, div, sp);
+ if (point_sp % div == 0)
+ // There is a point in the grid satisfying cg.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ }
+ break;
+
+ case Grid_Generator::PARAMETER:
+ if (cg.is_proper_congruence())
+ sp %= (div * g.divisor());
+ if (sp == 0)
+ // Parameter g satisfies the cg so the relation depends
+ // entirely on the other generators.
+ break;
+ if (known_to_intersect)
+ // At least one point satisfies cg. However, the sum of such
+ // a point and the parameter g fails to satisfy cg (due to g).
+ return Poly_Con_Relation::strictly_intersects();
+ // Find the GCD between sp and the previous GCD.
+ gcd_assign(div, div, sp);
+ if (point_sp != 0) {
+ // At least one of any previously encountered points fails to
+ // satisfy cg.
+ if (point_sp % div == 0)
+ // There is also a grid point that satisfies cg.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ break;
+
+ case Grid_Generator::LINE:
+ if (sp == 0)
+ // Line g satisfies the cg so the relation depends entirely on
+ // the other generators.
+ break;
+
+ // Line g intersects the congruence.
+ //
+ // There is a point p in the grid. Suppose <p*cg> = p_sp. Then
+ // (-p_sp/sp)*g + p is a point that satisfies cg: <((-p_sp/sp)*g
+ // + p).cg> = -(p_sp/sp)*sp + p_sp) = 0. If p does not satisfy
+ // `cg' and hence is not in the grid defined by `cg', the grid
+ // `*this' strictly intersects the `cg' grid. On the other
+ // hand, if `p' is in the grid defined by `cg' so that p_sp = 0,
+ // then <p+g.cg> = p_sp + sp != 0; thus `p+g' is a point in
+ // *this that does not satisfy `cg' and hence `p+g' is a point
+ // in *this not in the grid defined by `cg'; therefore `*this'
+ // strictly intersects the `cg' grid.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+
+ if (point_sp == 0) {
+ if (cg.is_equality())
+ // Every generator satisfied the cg.
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ else
+ // Every generator satisfied the cg.
+ return Poly_Con_Relation::is_included();
+ }
+
+ PPL_ASSERT(!known_to_intersect);
+ return Poly_Con_Relation::is_disjoint();
+}
+
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Grid_Generator& g) const {
+ // Dimension-compatibility check.
+ if (space_dim < g.space_dimension())
+ throw_dimension_incompatible("relation_with(g)", "g", g);
+
+ // The empty grid cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe grid in a zero-dimensional space subsumes all the
+ // generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ return
+ con_sys.satisfies_all_congruences(g)
+ ? Poly_Gen_Relation::subsumes()
+ : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Generator& g) const {
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", "g", g);
+
+ // The empty grid cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe grid in a zero-dimensional space subsumes all the
+ // generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ const Linear_Expression expr(g.expression());
+ Grid_Generator gg(grid_point());
+ if (g.is_point() || g.is_closure_point())
+ // Points and closure points are converted to grid points.
+ gg = grid_point(expr, g.divisor());
+ else
+ // The generator is a ray or line.
+ // In both cases, we convert it to a grid line
+ gg = grid_line(expr);
+
+ return
+ con_sys.satisfies_all_congruences(gg)
+ ? Poly_Gen_Relation::subsumes()
+ : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Constraint& c) const {
+ // Dimension-compatibility check.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("relation_with(c)", "c", c);
+
+ if (c.is_equality()) {
+ const Congruence cg(c);
+ return relation_with(cg);
+ }
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (c.is_inconsistent())
+ if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ if (!generators_are_up_to_date() && !update_generators())
+ // Updating found the grid empty.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ // Return one of the relations
+ // 'strictly_intersects' a strict subset of the grid points satisfy c
+ // 'is_included' every grid point satisfies c
+ // 'is_disjoint' c and the grid occupy separate spaces.
+
+ // There is always a point.
+
+ bool point_is_included = false;
+ bool point_saturates = false;
+ const Grid_Generator* first_point = 0;
+
+ for (Grid_Generator_System::const_iterator i = gen_sys.begin(),
+ i_end = gen_sys.end(); i != i_end; ++i) {
+ const Grid_Generator& g = *i;
+ switch (g.type()) {
+ case Grid_Generator::POINT:
+ {
+ if (first_point == 0) {
+ first_point = &g;
+ const int sign = Scalar_Products::sign(c, g);
+ if (sign == 0)
+ point_saturates = !c.is_strict_inequality();
+ else if (sign > 0)
+ point_is_included = !c.is_equality();
+ break;
+ }
+ // Not the first point: convert `g' to be a parameter
+ // and fall through into the parameter case.
+ Grid_Generator& gen = const_cast<Grid_Generator&>(g);
+ const Grid_Generator& point = *first_point;
+ const Coefficient& p_div = point.divisor();
+ const Coefficient& g_div = gen.divisor();
+ gen.expr.linear_combine(point.expr, p_div, -g_div,
+ 1, gen.expr.space_dimension());
+ gen.expr.set_inhomogeneous_term(g_div * p_div);
+ gen.strong_normalize();
+ gen.set_is_parameter();
+ PPL_ASSERT(gen.OK());
+ }
+ // Intentionally fall through.
+
+ case Grid_Generator::PARAMETER:
+ case Grid_Generator::LINE:
+ {
+ const int sign = c.is_strict_inequality()
+ ? Scalar_Products::reduced_sign(c.expr, g.expr)
+ : Scalar_Products::sign(c.expr, g.expr);
+ if (sign != 0)
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ break;
+ } // switch
+ }
+
+ // If this program point is reached, then all lines and parameters
+ // saturate the constraint. Hence, the result is determined by
+ // the previosly computed relation with the point.
+ if (point_saturates)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ if (point_is_included)
+ return Poly_Con_Relation::is_included();
+
+ return Poly_Con_Relation::is_disjoint();
+}
+
+bool
+PPL::Grid::is_empty() const {
+ if (marked_empty())
+ return true;
+ // Try a fast-fail test: if generators are up-to-date then the
+ // generator system (since it is well formed) contains a point.
+ if (generators_are_up_to_date())
+ return false;
+ if (space_dim == 0)
+ return false;
+ if (congruences_are_minimized())
+ // If the grid was empty it would be marked empty.
+ return false;
+ // Minimize the congruences to check if the grid is empty.
+ Grid& gr = const_cast<Grid&>(*this);
+ if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+ gr.set_empty();
+ return true;
+ }
+ gr.set_congruences_minimized();
+ return false;
+}
+
+bool
+PPL::Grid::is_universe() const {
+ if (marked_empty())
+ return false;
+
+ if (space_dim == 0)
+ return true;
+
+ if (congruences_are_up_to_date()) {
+ if (congruences_are_minimized())
+ // The minimized universe congruence system has only one row,
+ // the integrality congruence.
+ return con_sys.num_rows() == 1 && con_sys[0].is_tautological();
+ }
+ else {
+ update_congruences();
+ return con_sys.num_rows() == 1 && con_sys[0].is_tautological();
+ }
+
+ // Test con_sys's inclusion in a universe generator system.
+
+ // The zero dimension cases are handled above.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ Linear_Expression expr;
+ expr.set_space_dimension(space_dim);
+ expr += Variable(i);
+ if (!con_sys.satisfies_all_congruences(grid_line(expr)))
+ return false;
+ }
+#ifndef NDEBUG
+ Linear_Expression expr;
+ expr.set_space_dimension(space_dim);
+ PPL_ASSERT(con_sys.satisfies_all_congruences(grid_point(expr)));
+#endif
+ return true;
+}
+
+bool
+PPL::Grid::is_bounded() const {
+ // A zero-dimensional or empty grid is bounded.
+ if (space_dim == 0
+ || marked_empty()
+ || (!generators_are_up_to_date() && !update_generators()))
+ return true;
+
+ // TODO: Consider using con_sys when gen_sys is out of date.
+
+ if (gen_sys.num_rows() > 1) {
+ // Check if all generators are the same point.
+ const Grid_Generator& first_point = gen_sys[0];
+ if (first_point.is_line_or_parameter())
+ return false;
+ for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
+ const Grid_Generator& gen = gen_sys[row];
+ if (gen.is_line_or_parameter() || gen != first_point)
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+PPL::Grid::is_discrete() const {
+ // A zero-dimensional or empty grid is discrete.
+ if (space_dim == 0
+ || marked_empty()
+ || (!generators_are_up_to_date() && !update_generators()))
+ return true;
+
+ // Search for lines in the generator system.
+ for (dimension_type row = gen_sys.num_rows(); row-- > 1; )
+ if (gen_sys[row].is_line())
+ return false;
+
+ // The system of generators is composed only by
+ // points and parameters: the grid is discrete.
+ return true;
+}
+
+bool
+PPL::Grid::is_topologically_closed() const {
+ return true;
+}
+
+bool
+PPL::Grid::contains_integer_point() const {
+ // Empty grids have no points.
+ if (marked_empty())
+ return false;
+
+ // A zero-dimensional, universe grid has, by convention, an
+ // integer point.
+ if (space_dim == 0)
+ return true;
+
+ // A grid has an integer point if its intersection with the integer
+ // grid is non-empty.
+ Congruence_System cgs;
+ for (dimension_type var_index = space_dim; var_index-- > 0; )
+ cgs.insert(Variable(var_index) %= 0);
+
+ Grid gr = *this;
+ gr.add_recycled_congruences(cgs);
+ return !gr.is_empty();
+}
+
+bool
+PPL::Grid::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ // An empty grid constrains all variables.
+ if (marked_empty())
+ return true;
+
+ if (generators_are_up_to_date()) {
+ // Since generators are up-to-date, the generator system (since it is
+ // well formed) contains a point. Hence the grid is not empty.
+ if (congruences_are_up_to_date())
+ // Here a variable is constrained if and only if it is
+ // syntactically constrained.
+ goto syntactic_check;
+
+ if (generators_are_minimized()) {
+ // Try a quick, incomplete check for the universe grid:
+ // a universe grid constrains no variable.
+ // Count the number of lines (they are linearly independent).
+ dimension_type num_lines = 0;
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+ if (gen_sys[i].is_line())
+ ++num_lines;
+
+ if (num_lines == space_dim)
+ return false;
+ }
+
+ // Scan generators: perhaps we will find line(var).
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Grid_Generator& g_i = gen_sys[i];
+ if (!g_i.is_line())
+ continue;
+ if (sgn(g_i.coefficient(var)) != 0) {
+ if (g_i.expression().all_zeroes(1, var.space_dimension())
+ && g_i.expression().all_zeroes(var.space_dimension() + 1, space_dim + 1))
+ // The only nonzero coefficient in g_i is the one of var.
+ return true;
+ }
+ }
+
+ // We are still here: at least we know that the grid is not empty.
+ update_congruences();
+ goto syntactic_check;
+ }
+
+ // We must minimize to detect emptiness and obtain constraints.
+ if (!minimize())
+ return true;
+
+ syntactic_check:
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i].coefficient(var) != 0)
+ return true;
+ return false;
+}
+
+bool
+PPL::Grid::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ goto fail;
+
+ if (marked_empty()) {
+ if (check_not_empty) {
+ // The caller does not want the grid to be empty.
+#ifndef NDEBUG
+ cerr << "Empty grid!" << endl;
+#endif
+ goto fail;
+ }
+
+ if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "The grid is in a space of dimension " << space_dim
+ << " while the system of congruences is in a space of dimension "
+ << con_sys.space_dimension()
+ << endl;
+#endif
+ goto fail;
+ }
+ return true;
+ }
+
+ // A zero-dimensional universe grid is legal only if the system of
+ // congruences `con_sys' is empty, and the generator system contains
+ // one point.
+ if (space_dim == 0) {
+ if (con_sys.has_no_rows())
+ if (gen_sys.num_rows() == 1 && gen_sys[0].is_point())
+ return true;
+#ifndef NDEBUG
+ cerr << "Zero-dimensional grid should have an empty congruence" << endl
+ << "system and a generator system of a single point." << endl;
+#endif
+ goto fail;
+ }
+
+ // A grid is defined by a system of congruences or a system of
+ // generators. At least one of them must be up to date.
+ if (!congruences_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "Grid not empty, not zero-dimensional" << endl
+ << "and with neither congruences nor generators up-to-date!"
+ << endl;
+#endif
+ goto fail;
+ }
+
+ {
+ // The expected number of columns in the congruence and generator
+ // systems, if they are not empty.
+ const dimension_type num_columns = space_dim + 1;
+
+ // Here we check if the size of the matrices is consistent.
+ // Let us suppose that all the matrices are up-to-date; this means:
+ // `con_sys' : number of congruences x poly_num_columns
+ // `gen_sys' : number of generators x poly_num_columns
+ if (congruences_are_up_to_date())
+ if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and space_dim)"
+ << endl;
+#endif
+ goto fail;
+ }
+
+ if (generators_are_up_to_date()) {
+ if (gen_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (gen_sys and space_dim)"
+ << endl;
+#endif
+ goto fail;
+ }
+
+ // A non-empty system of generators describing a grid is valid
+ // if and only if it contains a point.
+ if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
+#ifndef NDEBUG
+ cerr << "Non-empty generator system declared up-to-date "
+ << "has no points!"
+ << endl;
+#endif
+ goto fail;
+ }
+
+ if (generators_are_minimized()) {
+ Grid_Generator_System gs = gen_sys;
+
+ if (dim_kinds.size() != num_columns) {
+#ifndef NDEBUG
+ cerr << "Size of dim_kinds should equal the number of columns."
+ << endl;
+#endif
+ goto fail;
+ }
+
+ if (!upper_triangular(gs, dim_kinds)) {
+#ifndef NDEBUG
+ cerr << "Reduced generators should be upper triangular."
+ << endl;
+#endif
+ goto fail;
+ }
+
+ // Check that dim_kinds corresponds to the row kinds in gen_sys.
+ for (dimension_type dim = space_dim,
+ row = gen_sys.num_rows(); dim > 0; --dim) {
+ if (dim_kinds[dim] == GEN_VIRTUAL)
+ goto ok;
+ if (gen_sys[--row].is_parameter_or_point()
+ && dim_kinds[dim] == PARAMETER)
+ goto ok;
+ PPL_ASSERT(gen_sys[row].is_line());
+ if (dim_kinds[dim] == LINE)
+ goto ok;
+#ifndef NDEBUG
+ cerr << "Kinds in dim_kinds should match those in gen_sys."
+ << endl;
+#endif
+ goto fail;
+ ok:
+ PPL_ASSERT(row <= dim);
+ }
+
+ // A reduced generator system must be the same as a temporary
+ // reduced copy.
+ Dimension_Kinds dim_kinds_copy = dim_kinds;
+ // `gs' is minimized and marked_empty returned false, so `gs'
+ // should contain rows.
+ PPL_ASSERT(!gs.has_no_rows());
+ simplify(gs, dim_kinds_copy);
+ // gs contained rows before being reduced, so it should
+ // contain at least a single point afterward.
+ PPL_ASSERT(!gs.has_no_rows());
+ for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
+ const Grid_Generator& g = gs[row];
+ const Grid_Generator& g_copy = gen_sys[row];
+ if (g.is_equal_to(g_copy))
+ continue;
+#ifndef NDEBUG
+ cerr << "Generators are declared minimized,"
+ " but they change under reduction.\n"
+ << "Here is the generator system:\n";
+ gen_sys.ascii_dump(cerr);
+ cerr << "and here is the minimized form of the temporary copy:\n";
+ gs.ascii_dump(cerr);
+#endif
+ goto fail;
+ }
+ }
+
+ } // if (congruences_are_up_to_date())
+ }
+
+ if (congruences_are_up_to_date()) {
+ // Check if the system of congruences is well-formed.
+ if (!con_sys.OK())
+ goto fail;
+
+ Grid tmp_gr = *this;
+ // Make a copy here, before changing tmp_gr, to check later.
+ const Congruence_System cs_copy = tmp_gr.con_sys;
+
+ // Clear the generators in tmp_gr.
+ Grid_Generator_System gs(space_dim);
+ tmp_gr.gen_sys.m_swap(gs);
+ tmp_gr.clear_generators_up_to_date();
+
+ if (!tmp_gr.update_generators()) {
+ if (check_not_empty) {
+ // Want to know the satisfiability of the congruences.
+#ifndef NDEBUG
+ cerr << "Unsatisfiable system of congruences!"
+ << endl;
+#endif
+ goto fail;
+ }
+ // The grid is empty, all checks are done.
+ return true;
+ }
+
+ if (congruences_are_minimized()) {
+ // A reduced congruence system must be lower triangular.
+ if (!lower_triangular(con_sys, dim_kinds)) {
+#ifndef NDEBUG
+ cerr << "Reduced congruences should be lower triangular." << endl;
+#endif
+ goto fail;
+ }
+
+ // If the congruences are minimized, all the elements in the
+ // congruence system must be the same as those in the temporary,
+ // minimized system `cs_copy'.
+ if (!con_sys.is_equal_to(cs_copy)) {
+#ifndef NDEBUG
+ cerr << "Congruences are declared minimized, but they change under reduction!"
+ << endl
+ << "Here is the minimized form of the congruence system:"
+ << endl;
+ cs_copy.ascii_dump(cerr);
+ cerr << endl;
+#endif
+ goto fail;
+ }
+
+ if (dim_kinds.size() != con_sys.space_dimension() + 1 /* inhomogeneous term */) {
+#ifndef NDEBUG
+ cerr << "Size of dim_kinds should equal the number of columns."
+ << endl;
+#endif
+ goto fail;
+ }
+
+ // Check that dim_kinds corresponds to the row kinds in con_sys.
+ for (dimension_type dim = space_dim, row = 0; dim > 0; --dim) {
+ if (dim_kinds[dim] == CON_VIRTUAL)
+ continue;
+ if (con_sys[row++].is_proper_congruence()
+ && dim_kinds[dim] == PROPER_CONGRUENCE)
+ continue;
+ PPL_ASSERT(con_sys[row-1].is_equality());
+ if (dim_kinds[dim] == EQUALITY)
+ continue;
+#ifndef NDEBUG
+ cerr << "Kinds in dim_kinds should match those in con_sys." << endl;
+#endif
+ goto fail;
+ }
+ }
+ }
+
+ return true;
+
+ fail:
+#ifndef NDEBUG
+ cerr << "Here is the grid under check:" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+}
+
+void
+PPL::Grid::add_constraints(const Constraint_System& cs) {
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_constraints(cs)", "cs", cs);
+ if (marked_empty())
+ return;
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ add_constraint_no_check(*i);
+ if (marked_empty())
+ return;
+ }
+}
+
+void
+PPL::Grid::add_grid_generator(const Grid_Generator& g) {
+ // The dimension of `g' must be at most space_dim.
+ const dimension_type g_space_dim = g.space_dimension();
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("add_grid_generator(g)", "g", g);
+
+ // Deal with zero-dimension case first.
+ if (space_dim == 0) {
+ // Points and parameters are the only zero-dimension generators
+ // that can be created.
+ if (marked_empty()) {
+ if (g.is_parameter())
+ throw_invalid_generator("add_grid_generator(g)", "g");
+ set_zero_dim_univ();
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Here the grid is empty: the specification says we can only
+ // insert a point.
+ if (g.is_line_or_parameter())
+ throw_invalid_generator("add_grid_generator(g)", "g");
+ gen_sys.insert(g);
+ clear_empty();
+ }
+ else {
+ PPL_ASSERT(generators_are_up_to_date());
+ gen_sys.insert(g);
+ if (g.is_parameter_or_point())
+ normalize_divisors(gen_sys);
+ }
+
+ // With the added generator, congruences are out of date.
+ clear_congruences_up_to_date();
+
+ clear_generators_minimized();
+ set_generators_up_to_date();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ const dimension_type cgs_space_dim = cgs.space_dimension();
+ if (space_dim < cgs_space_dim)
+ throw_dimension_incompatible("add_recycled_congruences(cgs)", "cgs", cgs);
+
+ if (cgs.has_no_rows())
+ return;
+
+ if (marked_empty())
+ return;
+
+ if (space_dim == 0) {
+ // In a 0-dimensional space the congruences are trivial (e.g., 0
+ // == 0 or 1 %= 0) or false (e.g., 1 == 0). In a system of
+ // congruences `begin()' and `end()' are equal if and only if the
+ // system contains only trivial congruences.
+ if (cgs.begin() != cgs.end())
+ // There is a congruence, it must be false, the grid becomes empty.
+ set_empty();
+ return;
+ }
+
+ // The congruences are required.
+ if (!congruences_are_up_to_date())
+ update_congruences();
+
+ // Swap (instead of copying) the coefficients of `cgs' (which is
+ // writable).
+ con_sys.insert(cgs, Recycle_Input());
+
+ // Congruences may not be minimized and generators are out of date.
+ clear_congruences_minimized();
+ clear_generators_up_to_date();
+ // Note: the congruence system may have become unsatisfiable, thus
+ // we do not check for satisfiability.
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_recycled_grid_generators(Grid_Generator_System& gs) {
+ // Dimension-compatibility check.
+ const dimension_type gs_space_dim = gs.space_dimension();
+ if (space_dim < gs_space_dim)
+ throw_dimension_incompatible("add_recycled_grid_generators(gs)", "gs", gs);
+
+ // Adding no generators leaves the grid the same.
+ if (gs.has_no_rows())
+ return;
+
+ // Adding valid generators to a zero-dimensional grid transforms it
+ // to the zero-dimensional universe grid.
+ if (space_dim == 0) {
+ if (marked_empty())
+ set_zero_dim_univ();
+ else {
+ PPL_ASSERT(gs.has_points());
+ }
+ PPL_ASSERT(OK(true));
+ return;
+ }
+
+ if (!marked_empty()) {
+ // The grid contains at least one point.
+
+ if (!generators_are_up_to_date())
+ update_generators();
+ normalize_divisors(gs, gen_sys);
+
+ gen_sys.insert(gs, Recycle_Input());
+
+ // Congruences are out of date and generators are not minimized.
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ PPL_ASSERT(OK(true));
+ return;
+ }
+
+ // The grid is empty.
+
+ // `gs' must contain at least one point.
+ if (!gs.has_points())
+ throw_invalid_generators("add_recycled_grid_generators(gs)", "gs");
+
+ // Adjust `gs' to the right dimension.
+ gs.set_space_dimension(space_dim);
+
+ gen_sys.m_swap(gs);
+
+ normalize_divisors(gen_sys);
+
+ // The grid is no longer empty and generators are up-to-date.
+ set_generators_up_to_date();
+ clear_empty();
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_grid_generators(const Grid_Generator_System& gs) {
+ // TODO: this is just an executable specification.
+ Grid_Generator_System gs_copy = gs;
+ add_recycled_grid_generators(gs_copy);
+}
+
+void
+PPL::Grid::refine_with_constraint(const Constraint& c) {
+ // The dimension of `c' must be at most `space_dim'.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", "c", c);
+ if (marked_empty())
+ return;
+ refine_no_check(c);
+}
+
+void
+PPL::Grid::refine_with_constraints(const Constraint_System& cs) {
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("refine_with_constraints(cs)", "cs", cs);
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+}
+
+void
+PPL::Grid::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ if (space_dim < var.space_dimension())
+ throw_dimension_incompatible("unconstrain(var)", var.space_dimension());
+
+ // Do something only if the grid is non-empty.
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators()))
+ // Empty: do nothing.
+ return;
+
+ PPL_ASSERT(generators_are_up_to_date());
+ Grid_Generator l = grid_line(var);
+ gen_sys.insert(l, Recycle_Input());
+ // With the added generator, congruences are out of date.
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case also captures the only legal cylindrification
+ // of a grid in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Do something only if the grid is non-empty.
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators()))
+ // Empty: do nothing.
+ return;
+
+ PPL_ASSERT(generators_are_up_to_date());
+ // Since `gen_sys' is not empty, the space dimension of the inserted
+ // generators are automatically adjusted.
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+ Grid_Generator l = grid_line(Variable(*vsi));
+ gen_sys.insert(l, Recycle_Input());
+ }
+ // Constraints are no longer up-to-date.
+ clear_generators_minimized();
+ clear_congruences_up_to_date();
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::intersection_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+ // If one of the two grids is empty, the intersection is empty.
+ if (x.marked_empty())
+ return;
+ if (y.marked_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ // If both grids are zero-dimensional, then at this point they are
+ // necessarily universe, so the intersection is also universe.
+ if (x.space_dim == 0)
+ return;
+
+ // The congruences must be up-to-date.
+ if (!x.congruences_are_up_to_date())
+ x.update_congruences();
+ if (!y.congruences_are_up_to_date())
+ y.update_congruences();
+
+ if (!y.con_sys.has_no_rows()) {
+ x.con_sys.insert(y.con_sys);
+ // Grid_Generators may be out of date and congruences may have changed
+ // from minimal form.
+ x.clear_generators_up_to_date();
+ x.clear_congruences_minimized();
+ }
+
+ PPL_ASSERT(x.OK() && y.OK());
+}
+
+void
+PPL::Grid::upper_bound_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("upper_bound_assign(y)", "y", y);
+
+ // The join of a grid `gr' with an empty grid is `gr'.
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty()) {
+ x = y;
+ return;
+ }
+
+ // If both grids are zero-dimensional, then they are necessarily
+ // universe grids, and so is their join.
+ if (x.space_dim == 0)
+ return;
+
+ // The generators must be up-to-date.
+ if (!x.generators_are_up_to_date() && !x.update_generators()) {
+ // Discovered `x' empty when updating generators.
+ x = y;
+ return;
+ }
+ if (!y.generators_are_up_to_date() && !y.update_generators())
+ // Discovered `y' empty when updating generators.
+ return;
+
+ // Match the divisors of the x and y generator systems.
+ Grid_Generator_System gs(y.gen_sys);
+ normalize_divisors(x.gen_sys, gs);
+ x.gen_sys.insert(gs, Recycle_Input());
+ // Congruences may be out of date and generators may have lost
+ // minimal form.
+ x.clear_congruences_up_to_date();
+ x.clear_generators_minimized();
+
+ // At this point both `x' and `y' are not empty.
+ PPL_ASSERT(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::upper_bound_assign_if_exact(const Grid& y) {
+ const Grid& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("upper_bound_assign_if_exact(y)", "y", y);
+
+ if (x.marked_empty()
+ || y.marked_empty()
+ || x.space_dim == 0
+ || x.is_included_in(y)
+ || y.is_included_in(x)) {
+ upper_bound_assign(y);
+ return true;
+ }
+
+ // The above test 'x.is_included_in(y)' will ensure the generators of x
+ // are up to date.
+ PPL_ASSERT(generators_are_up_to_date());
+
+ Grid x_copy = x;
+ x_copy.upper_bound_assign(y);
+ x_copy.difference_assign(y);
+ if (x_copy.is_included_in(x)) {
+ upper_bound_assign(y);
+ return true;
+ }
+
+ return false;
+}
+
+void
+PPL::Grid::difference_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("difference_assign(y)", "y", y);
+
+ if (y.marked_empty() || x.marked_empty())
+ return;
+
+ // If both grids are zero-dimensional, then they are necessarily
+ // universe grids, so the result is empty.
+ if (x.space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ Grid new_grid(x.space_dim, EMPTY);
+
+ const Congruence_System& y_cgs = y.congruences();
+ for (Congruence_System::const_iterator i = y_cgs.begin(),
+ y_cgs_end = y_cgs.end(); i != y_cgs_end; ++i) {
+ const Congruence& cg = *i;
+
+ // The 2-complement cg2 of cg = ((e %= 0) / m) is the congruence
+ // defining the sets of points exactly half-way between successive
+ // hyperplanes e = km and e = (k+1)m, for any integer k; that is,
+ // the hyperplanes defined by 2e = (2k + 1)m, for any integer k.
+ // Thus `cg2' is the congruence ((2e %= m) / 2m).
+
+ // As the grid difference must be a grid, only add the
+ // 2-complement congruence to x if the resulting grid includes all
+ // the points in x that did not satisfy `cg'.
+
+ // The 2-complement of cg can be included in the result only if x
+ // holds points other than those in cg.
+ if (x.relation_with(cg).implies(Poly_Con_Relation::is_included()))
+ continue;
+
+ if (cg.is_proper_congruence()) {
+ const Linear_Expression e(cg.expression());
+ // Congruence cg is ((e %= 0) / m).
+ const Coefficient& m = cg.modulus();
+ // If x is included in the grid defined by the congruences cg
+ // and its 2-complement (i.e. the grid defined by the congruence
+ // (2e %= 0) / m) then add the 2-complement to the potential
+ // result.
+ if (x.relation_with((2*e %= 0) / m)
+ .implies(Poly_Con_Relation::is_included())) {
+ Grid z = x;
+ z.add_congruence_no_check((2*e %= m) / (2*m));
+ new_grid.upper_bound_assign(z);
+ continue;
+ }
+ }
+ return;
+ }
+
+ *this = new_grid;
+
+ PPL_ASSERT(OK());
+}
+
+namespace {
+
+struct Ruled_Out_Pair {
+ PPL::dimension_type congruence_index;
+ PPL::dimension_type num_ruled_out;
+};
+
+struct Ruled_Out_Less_Than {
+ bool operator()(const Ruled_Out_Pair& x,
+ const Ruled_Out_Pair& y) const {
+ return x.num_ruled_out > y.num_ruled_out;
+ }
+};
+
+} // namespace
+
+bool
+PPL::Grid::simplify_using_context_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("simplify_using_context_assign(y)", "y", y);
+
+ // Filter away the zero-dimensional case.
+ if (x.space_dim == 0) {
+ if (y.is_empty()) {
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+ return false;
+ }
+ else
+ return !x.is_empty();
+ }
+
+ // If `y' is empty, the biggest enlargement for `x' is the universe.
+ if (!y.minimize()) {
+ Grid gr(x.space_dim, UNIVERSE);
+ m_swap(gr);
+ return false;
+ }
+
+ // If `x' is empty, the intersection is empty.
+ if (!x.minimize()) {
+ // Search for a congruence of `y' that is not a tautology.
+ PPL_ASSERT(y.congruences_are_up_to_date());
+ Grid gr(x.space_dim, UNIVERSE);
+ for (dimension_type i = y.con_sys.num_rows(); i-- > 0; ) {
+ const Congruence& y_con_sys_i = y.con_sys[i];
+ if (!y_con_sys_i.is_tautological()) {
+ // Found: we obtain a congruence `c' contradicting the one we
+ // found, and assign to `x' the grid `gr' with `c' as
+ // the only congruence.
+ const Linear_Expression le(y_con_sys_i.expression());
+ if (y_con_sys_i.is_equality()) {
+ gr.refine_no_check(le == 1);
+ break;
+ }
+ else {
+ const Coefficient& y_modulus_i = y_con_sys_i.modulus();
+ if (y_modulus_i > 1)
+ gr.refine_no_check(le == 1);
+ else {
+ Linear_Expression le2 = le;
+ le2 *= 2;
+ gr.refine_no_check(le2 == y_modulus_i);
+ }
+ break;
+ }
+ }
+ }
+ m_swap(gr);
+ PPL_ASSERT(OK());
+ return false;
+ }
+
+ PPL_ASSERT(x.congruences_are_minimized()
+ && y.generators_are_minimized());
+
+ const Congruence_System& x_cs = x.con_sys;
+ const dimension_type x_cs_num_rows = x_cs.num_rows();
+
+ // Record into `redundant_by_y' the info about which congruences of
+ // `x' are redundant in the context `y'. Count the number of
+ // redundancies found.
+ std::vector<bool> redundant_by_y(x_cs_num_rows, false);
+ dimension_type num_redundant_by_y = 0;
+ for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+ if (y.relation_with(x_cs[i]).implies(Poly_Con_Relation::is_included())) {
+ redundant_by_y[i] = true;
+ ++num_redundant_by_y;
+ }
+ }
+
+ if (num_redundant_by_y < x_cs_num_rows) {
+
+ // Some congruences were not identified as redundant.
+
+ Congruence_System result_cs;
+ const Congruence_System& y_cs = y.con_sys;
+ const dimension_type y_cs_num_rows = y_cs.num_rows();
+ // Compute into `z' the intersection of `x' and `y'.
+ const bool x_first = (x_cs_num_rows > y_cs_num_rows);
+ Grid z(x_first ? x : y);
+ if (x_first)
+ z.add_congruences(y_cs);
+ else {
+ // Only copy (and then recycle) the non-redundant congruences.
+ Congruence_System tmp_cs;
+ for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+ if (!redundant_by_y[i])
+ tmp_cs.insert(x_cs[i]);
+ }
+ z.add_recycled_congruences(tmp_cs);
+ }
+
+ // Congruences are added to `w' until it equals `z'.
+ // We do not care about minimization or maximization, since
+ // we are only interested in satisfiability.
+ Grid w;
+ w.add_space_dimensions_and_embed(x.space_dim);
+ // First add the congruences for `y'.
+ w.add_congruences(y_cs);
+
+ // We apply the following heuristics here: congruences of `x' that
+ // are not made redundant by `y' are added to `w' depending on
+ // the number of generators of `y' they rule out (the more generators)
+ // (they rule out, the sooner they are added). Of course, as soon
+ // as `w' becomes empty, we stop adding.
+ std::vector<Ruled_Out_Pair>
+ ruled_out_vec(x_cs_num_rows - num_redundant_by_y);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+ PPL_DIRTY_TEMP_COEFFICIENT(div);
+
+ for (dimension_type i = 0, j = 0; i < x_cs_num_rows; ++i) {
+ if (!redundant_by_y[i]) {
+ const Congruence& c = x_cs[i];
+ const Coefficient& modulus = c.modulus();
+ div = modulus;
+
+ const Grid_Generator_System& y_gs = y.gen_sys;
+ dimension_type num_ruled_out_generators = 0;
+ for (Grid_Generator_System::const_iterator k = y_gs.begin(),
+ y_gs_end = y_gs.end(); k != y_gs_end; ++k) {
+ const Grid_Generator& g = *k;
+ // If the generator is not to be ruled out,
+ // it must saturate the congruence.
+ Scalar_Products::assign(sp, c, g);
+ // If `c' is a proper congruence the scalar product must be
+ // reduced modulo a (possibly scaled) modulus.
+ if (c.is_proper_congruence()) {
+ // If `g' is a parameter the congruence modulus must be scaled
+ // up by the divisor of the generator.
+ if (g.is_parameter())
+ sp %= (div * g.divisor());
+ else
+ if (g.is_point())
+ sp %= div;
+ }
+ if (sp == 0)
+ continue;
+ ++num_ruled_out_generators;
+ }
+ ruled_out_vec[j].congruence_index = i;
+ ruled_out_vec[j].num_ruled_out = num_ruled_out_generators;
+ ++j;
+ }
+ }
+ std::sort(ruled_out_vec.begin(), ruled_out_vec.end(),
+ Ruled_Out_Less_Than());
+
+ const bool empty_intersection = (!z.minimize());
+
+ // Add the congruences in the "ruled out" order to `w'
+ // until the result is the intersection.
+ for (std::vector<Ruled_Out_Pair>::const_iterator
+ j = ruled_out_vec.begin(), ruled_out_vec_end = ruled_out_vec.end();
+ j != ruled_out_vec_end;
+ ++j) {
+ const Congruence& c = x_cs[j->congruence_index];
+ result_cs.insert(c);
+ w.add_congruence(c);
+ if ((empty_intersection && w.is_empty())
+ || (!empty_intersection && w.is_included_in(z))) {
+ Grid result_gr(x.space_dim, UNIVERSE);
+ result_gr.add_congruences(result_cs);
+ x.m_swap(result_gr);
+ PPL_ASSERT(x.OK());
+ return !empty_intersection;
+ }
+ }
+ // Cannot exit from here.
+ PPL_UNREACHABLE;
+ }
+
+ // All the congruences are redundant so that the simplified grid
+ // is the universe.
+ Grid result_gr(x.space_dim, UNIVERSE);
+ x.m_swap(result_gr);
+ PPL_ASSERT(x.OK());
+ return true;
+}
+
+void
+PPL::Grid::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' must be at most the dimension of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+ // `var' must be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ if (marked_empty())
+ return;
+
+ Coefficient_traits::const_reference expr_var = expr.coefficient(var);
+
+ if (var_space_dim <= expr_space_dim
+ && expr_var != 0) {
+ // The transformation is invertible.
+ if (generators_are_up_to_date()) {
+ // Grid_Generator_System::affine_image() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ gen_sys.affine_image(var, expr, denominator);
+ else
+ gen_sys.affine_image(var, -expr, -denominator);
+ clear_generators_minimized();
+ // Strong normalization in gs::affine_image may have modified
+ // divisors.
+ normalize_divisors(gen_sys);
+ }
+ if (congruences_are_up_to_date()) {
+ // To build the inverse transformation,
+ // after copying and negating `expr',
+ // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+ Linear_Expression inverse;
+ if (expr_var > 0) {
+ inverse = -expr;
+ inverse.set_coefficient(var, denominator);
+ con_sys.affine_preimage(var, inverse, expr_var);
+ }
+ else {
+ // The new denominator is negative: we negate everything once
+ // more, as Congruence_System::affine_preimage() requires the
+ // third argument to be positive.
+ inverse = expr;
+ inverse.set_coefficient(var, -denominator);
+ con_sys.affine_preimage(var, inverse, -expr_var);
+ }
+ clear_congruences_minimized();
+ }
+ }
+ else {
+ // The transformation is not invertible.
+ // We need an up-to-date system of generators.
+ if (!generators_are_up_to_date())
+ minimize();
+ if (!marked_empty()) {
+ // Grid_Generator_System::affine_image() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ gen_sys.affine_image(var, expr, denominator);
+ else
+ gen_sys.affine_image(var, -expr, -denominator);
+
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+ // Strong normalization in gs::affine_image may have modified
+ // divisors.
+ normalize_divisors(gen_sys);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+ if (marked_empty())
+ return;
+
+ Coefficient_traits::const_reference expr_var = expr.coefficient(var);
+
+ if (var_space_dim <= expr_space_dim && expr_var != 0) {
+ // The transformation is invertible.
+ if (congruences_are_up_to_date()) {
+ // Congruence_System::affine_preimage() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ con_sys.affine_preimage(var, expr, denominator);
+ else
+ con_sys.affine_preimage(var, -expr, -denominator);
+ clear_congruences_minimized();
+ }
+ if (generators_are_up_to_date()) {
+ // To build the inverse transformation,
+ // after copying and negating `expr',
+ // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+ Linear_Expression inverse;
+ if (expr_var > 0) {
+ inverse = -expr;
+ inverse.set_coefficient(var, denominator);
+ gen_sys.affine_image(var, inverse, expr_var);
+ }
+ else {
+ // The new denominator is negative: we negate everything once
+ // more, as Grid_Generator_System::affine_image() requires the
+ // third argument to be positive.
+ inverse = expr;
+ inverse.set_coefficient(var, -denominator);
+ gen_sys.affine_image(var, inverse, -expr_var);
+ }
+ clear_generators_minimized();
+ }
+ }
+ else {
+ // The transformation is not invertible.
+ // We need an up-to-date system of congruences.
+ if (!congruences_are_up_to_date())
+ minimize();
+ // Congruence_System::affine_preimage() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ con_sys.affine_preimage(var, expr, denominator);
+ else
+ con_sys.affine_preimage(var, -expr, -denominator);
+
+ clear_generators_up_to_date();
+ clear_congruences_minimized();
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator,
+ Coefficient_traits::const_reference modulus) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
+ "e", expr);
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
+ "v", var);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // If relsym is not EQUAL, then we return a safe approximation
+ // by adding a line in the direction of var.
+ if (relsym != EQUAL) {
+
+ if (modulus != 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+ "r != EQUAL && m != 0");
+
+ if (!generators_are_up_to_date())
+ minimize();
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ add_grid_generator(grid_line(var));
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_ASSERT(relsym == EQUAL);
+
+ affine_image(var, expr, denominator);
+
+ if (modulus == 0)
+ return;
+
+ // Modulate dimension `var' according to `modulus'.
+
+ if (!generators_are_up_to_date())
+ minimize();
+
+ // Test if minimization, possibly in affine_image, found an empty
+ // grid.
+ if (marked_empty())
+ return;
+
+ if (modulus < 0)
+ gen_sys.insert(parameter(-modulus * var));
+ else
+ gen_sys.insert(parameter(modulus * var));
+
+ normalize_divisors(gen_sys);
+
+ clear_generators_minimized();
+ clear_congruences_up_to_date();
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator,
+ Coefficient_traits::const_reference modulus) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+ "d == 0");
+
+ // The dimension of `expr' should be at most the dimension of
+ // `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d, m)",
+ "e", expr);
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d, m)",
+ "v", var);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+ "r is the disequality relation symbol");
+
+ // If relsym is not EQUAL, then we return a safe approximation
+ // by adding a line in the direction of var.
+ if (relsym != EQUAL) {
+
+ if (modulus != 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+ "r != EQUAL && m != 0");
+
+ if (!generators_are_up_to_date())
+ minimize();
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ add_grid_generator(grid_line(var));
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_ASSERT(relsym == EQUAL);
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // Check whether the affine relation is an affine function.
+ if (modulus == 0) {
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& var_coefficient = expr.coefficient(var);
+ if (var_space_dim <= expr_space_dim && var_coefficient != 0) {
+ const Linear_Expression inverse_expr
+ = expr - (denominator + var_coefficient) * var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+ neg_assign(inverse_denominator, var_coefficient);
+ if (modulus < 0)
+ generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
+ - modulus);
+ else
+ generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
+ modulus);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot be
+ // easily computed by inverting the affine relation. Add the
+ // congruence induced by the affine relation.
+ {
+ Congruence cg((denominator*var %= expr) / denominator);
+ if (modulus < 0)
+ cg /= -modulus;
+ else
+ cg /= modulus;
+ add_congruence_no_check(cg);
+ }
+
+ // If the resulting grid is empty, its preimage is empty too.
+ // Note: DO check for emptiness here, as we will later add a line.
+ if (is_empty())
+ return;
+ add_grid_generator(grid_line(var));
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should be at most the dimension of
+ // `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2, m)",
+ "e1", lhs);
+ // The dimension of `rhs' should be at most the dimension of
+ // `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2, m)",
+ "e2", rhs);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2, m)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // If relsym is not EQUAL, then we return a safe approximation
+ // by adding a line in the direction of var.
+ if (relsym != EQUAL) {
+
+ if (modulus != 0)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2, m)",
+ "r != EQUAL && m != 0");
+
+ if (!generators_are_up_to_date())
+ minimize();
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ add_grid_generator(grid_line(i.variable()));
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_ASSERT(relsym == EQUAL);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_modulus);
+ tmp_modulus = modulus;
+ if (tmp_modulus < 0)
+ neg_assign(tmp_modulus);
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+
+ lhs_space_dim = lhs.last_nonzero();
+ if (lhs_space_dim == 0) {
+ // All variables have zero coefficients, so `lhs' is a constant.
+ add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+ return;
+ }
+
+ // Gather in `new_lines' the collections of all the lines having the
+ // direction of variables occurring in `lhs'.
+ Grid_Generator_System new_lines;
+ for (Linear_Expression::const_iterator i = lhs.begin(),
+ i_end = lhs.lower_bound(Variable(lhs_space_dim)); i != i_end; ++i)
+ new_lines.insert(grid_line(i.variable()));
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to the right hand side.
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs1(new_var == rhs);
+ add_recycled_congruences(new_cgs1);
+ if (!is_empty()) {
+ // The grid still contains points.
+
+ // Existentially quantify all the variables occurring in the left
+ // hand side expression.
+
+ // Adjust `new_lines' to the right dimension.
+ new_lines.set_space_dimension(space_dim);
+ // Add the lines to `gen_sys' (first make sure they are up-to-date).
+ update_generators();
+ gen_sys.insert(new_lines, Recycle_Input());
+ normalize_divisors(gen_sys);
+ // Update the flags.
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ // Constrain the new dimension so that it is congruent to the left
+ // hand side expression modulo `modulus'.
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs2((lhs %= new_var) / tmp_modulus);
+ add_recycled_congruences(new_cgs2);
+ }
+
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ else {
+ // `lhs' and `rhs' variables are disjoint:
+ // there is no need to add a further dimension.
+
+ // Only add the lines and congruence if there are points.
+ if (is_empty())
+ return;
+
+ // Existentially quantify all the variables occurring in the left hand
+ // side expression.
+ add_recycled_grid_generators(new_lines);
+
+ // Constrain the left hand side expression so that it is congruent to
+ // the right hand side expression modulo `modulus'.
+ add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus) {
+ // The dimension of `lhs' must be at most the dimension of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2, m)",
+ "lhs", lhs);
+ // The dimension of `rhs' must be at most the dimension of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2, m)",
+ "e2", rhs);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2, m)",
+ "r is the disequality relation symbol");
+
+ // Any preimage of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // If relsym is not EQUAL, then we return a safe approximation
+ // by adding a line in the direction of var.
+ if (relsym != EQUAL) {
+
+ if (modulus != 0)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2, m)",
+ "r != EQUAL && m != 0");
+
+ if (!generators_are_up_to_date())
+ minimize();
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ add_grid_generator(grid_line(i.variable()));
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_ASSERT(relsym == EQUAL);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_modulus);
+ tmp_modulus = modulus;
+ if (tmp_modulus < 0)
+ neg_assign(tmp_modulus);
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+ lhs_space_dim = lhs.last_nonzero();
+ if (lhs_space_dim == 0) {
+ // All variables have zero coefficients, so `lhs' is a constant.
+ // In this case, preimage and image happen to be the same.
+ add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+ return;
+ }
+
+ // Gather in `new_lines' the collections of all the lines having
+ // the direction of variables occurring in `lhs'.
+ Grid_Generator_System new_lines;
+ for (Linear_Expression::const_iterator i = lhs.begin(),
+ i_end = lhs.lower_bound(Variable(lhs_space_dim)); i != i_end; ++i)
+ new_lines.insert(grid_line(i.variable()));
+
+ const dimension_type num_common_dims
+ = std::min(lhs_space_dim, rhs_space_dim);
+ if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to `lhs'
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs1(new_var == lhs);
+ add_recycled_congruences(new_cgs1);
+ if (!is_empty()) {
+ // The grid still contains points.
+
+ // Existentially quantify all the variables occurring in the left
+ // hand side
+
+ // Adjust `new_lines' to the right dimension.
+ new_lines.set_space_dimension(space_dim);
+ // Add the lines to `gen_sys' (first make sure they are up-to-date).
+ update_generators();
+ gen_sys.insert(new_lines, Recycle_Input());
+ normalize_divisors(gen_sys);
+ // Update the flags.
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ // Constrain the new dimension so that it is related to
+ // the right hand side modulo `modulus'.
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs2((rhs %= new_var) / tmp_modulus);
+ add_recycled_congruences(new_cgs2);
+ }
+
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ else {
+ // `lhs' and `rhs' variables are disjoint:
+ // there is no need to add a further dimension.
+
+ // Constrain the left hand side expression so that it is congruent to
+ // the right hand side expression modulo `mod'.
+ add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+
+ // Any image of an empty grid is empty.
+ if (is_empty())
+ return;
+
+ // Existentially quantify all the variables occurring in `lhs'.
+ add_recycled_grid_generators(new_lines);
+ }
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // In all other cases, generalized_affine_preimage() must
+ // just add a line in the direction of var.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+
+ PPL_ASSERT(OK());
+}
+
+
+void
+PPL::Grid::
+bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the grid.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ // In all other cases, generalized_affine_preimage() must
+ // just add a line in the direction of var.
+ generalized_affine_preimage(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::time_elapse_assign(const Grid& y) {
+ Grid& x = *this;
+ // Check dimension-compatibility.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+ // Deal with the zero-dimensional case.
+ if (x.space_dim == 0) {
+ if (y.marked_empty())
+ x.set_empty();
+ return;
+ }
+
+ // If either one of `x' or `y' is empty, the result is empty too.
+ if (x.marked_empty())
+ return;
+ if (y.marked_empty()
+ || (!x.generators_are_up_to_date() && !x.update_generators())
+ || (!y.generators_are_up_to_date() && !y.update_generators())) {
+ x.set_empty();
+ return;
+ }
+
+ // At this point both generator systems are up-to-date.
+ Grid_Generator_System gs = y.gen_sys;
+ const dimension_type gs_num_rows = gs.num_rows();
+
+ normalize_divisors(gs, gen_sys);
+
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ Grid_Generator& g = gs.sys.rows[i];
+ if (g.is_point())
+ // Transform the point into a parameter.
+ g.set_is_parameter();
+ }
+
+ PPL_ASSERT(gs.sys.OK());
+
+ if (gs_num_rows == 0)
+ // `y' was the grid containing a single point at the origin, so
+ // the result is `x'.
+ return;
+
+ // Append `gs' to the generators of `x'.
+
+ gen_sys.insert(gs, Recycle_Input());
+
+ x.clear_congruences_up_to_date();
+ x.clear_generators_minimized();
+
+ PPL_ASSERT(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 1 and the value is 0.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = 0;
+ val_d = 1;
+ return true;
+ }
+ if (!generators_are_minimized() && !minimize())
+ // Minimizing found `this' empty.
+ return false;
+
+ return frequency_no_check(expr, freq_n, freq_d, val_n, val_d);
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+bool
+PPL::operator==(const Grid& x, const Grid& y) {
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ if (x.marked_empty())
+ return y.is_empty();
+ if (y.marked_empty())
+ return x.is_empty();
+ if (x.space_dim == 0)
+ return true;
+
+ switch (x.quick_equivalence_test(y)) {
+ case Grid::TVB_TRUE:
+ return true;
+
+ case Grid::TVB_FALSE:
+ return false;
+
+ default:
+ if (x.is_included_in(y)) {
+ if (x.marked_empty())
+ return y.is_empty();
+ return y.is_included_in(x);
+ }
+ return false;
+ }
+}
+
+bool
+PPL::Grid::contains(const Grid& y) const {
+ const Grid& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("contains(y)", "y", y);
+
+ if (y.marked_empty())
+ return true;
+ if (x.marked_empty())
+ return y.is_empty();
+ if (y.space_dim == 0)
+ return true;
+ if (x.quick_equivalence_test(y) == Grid::TVB_TRUE)
+ return true;
+ return y.is_included_in(x);
+}
+
+bool
+PPL::Grid::is_disjoint_from(const Grid& y) const {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("is_disjoint_from(y)", "y", y);
+ Grid z = *this;
+ z.intersection_assign(y);
+ return z.is_empty();
+}
+
+void
+PPL::Grid::ascii_dump(std::ostream& s) const {
+ using std::endl;
+
+ s << "space_dim "
+ << space_dim
+ << endl;
+ status.ascii_dump(s);
+ s << "con_sys ("
+ << (congruences_are_up_to_date() ? "" : "not_")
+ << "up-to-date)"
+ << endl;
+ con_sys.ascii_dump(s);
+ s << "gen_sys ("
+ << (generators_are_up_to_date() ? "" : "not_")
+ << "up-to-date)"
+ << endl;
+ gen_sys.ascii_dump(s);
+ s << "dimension_kinds";
+ if ((generators_are_up_to_date() && generators_are_minimized())
+ || (congruences_are_up_to_date() && congruences_are_minimized()))
+ for (Dimension_Kinds::const_iterator i = dim_kinds.begin();
+ i != dim_kinds.end();
+ ++i)
+ s << " " << *i;
+ s << endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid)
+
+bool
+PPL::Grid::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> space_dim))
+ return false;
+
+ if (!status.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "con_sys")
+ return false;
+
+ if (!(s >> str))
+ return false;
+ if (str == "(up-to-date)")
+ set_congruences_up_to_date();
+ else if (str != "(not_up-to-date)")
+ return false;
+
+ if (!con_sys.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "gen_sys")
+ return false;
+
+ if (!(s >> str))
+ return false;
+ if (str == "(up-to-date)")
+ set_generators_up_to_date();
+ else if (str != "(not_up-to-date)")
+ return false;
+
+ if (!gen_sys.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "dimension_kinds")
+ return false;
+
+ if (!marked_empty()
+ && ((generators_are_up_to_date() && generators_are_minimized())
+ || (congruences_are_up_to_date() && congruences_are_minimized()))) {
+ dim_kinds.resize(space_dim + 1);
+ for (Dimension_Kinds::size_type dim = 0; dim <= space_dim; ++dim) {
+ short unsigned int dim_kind;
+ if (!(s >> dim_kind))
+ return false;
+ switch(dim_kind) {
+ case 0: dim_kinds[dim] = PARAMETER; break;
+ case 1: dim_kinds[dim] = LINE; break;
+ case 2: dim_kinds[dim] = GEN_VIRTUAL; break;
+ default: return false;
+ }
+ }
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Grid::external_memory_in_bytes() const {
+ return
+ con_sys.external_memory_in_bytes()
+ + gen_sys.external_memory_in_bytes();
+}
+
+void
+PPL::Grid::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned /* complexity_threshold */,
+ bool /* wrap_individually */) {
+
+ // Dimension-compatibility check of `*cs_p', if any.
+ if (cs_p != 0) {
+ const dimension_type cs_p_space_dim = cs_p->space_dimension();
+ if (cs_p->space_dimension() > space_dim)
+ throw_dimension_incompatible("wrap_assign(vs, ...)", cs_p_space_dim);
+ }
+
+ // Wrapping no variable is a no-op.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check of `vars'.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("wrap_assign(vs, ...)", min_space_dim);
+
+ // Wrapping an empty grid is a no-op.
+ if (marked_empty())
+ return;
+ if (!generators_are_minimized() && !minimize())
+ // Minimizing found `this' empty.
+ return;
+
+ // Set the wrap frequency for variables of width `w'.
+ // This is independent of the signedness `s'.
+ PPL_DIRTY_TEMP_COEFFICIENT(wrap_frequency);
+ mul_2exp_assign(wrap_frequency, Coefficient_one(), w);
+ // Set `min_value' and `max_value' to the minimum and maximum values
+ // a variable of width `w' and signedness `s' can take.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ if (r == UNSIGNED) {
+ min_value = 0;
+ mul_2exp_assign(max_value, Coefficient_one(), w);
+ --max_value;
+ }
+ else {
+ PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+ mul_2exp_assign(max_value, Coefficient_one(), w-1);
+ neg_assign(min_value, max_value);
+ --max_value;
+ }
+
+ // Generators are up-to-date and minimized.
+ const Grid gr = *this;
+
+ // Overflow is impossible or wraps.
+ if (o == OVERFLOW_IMPOSSIBLE || o == OVERFLOW_WRAPS) {
+ PPL_DIRTY_TEMP_COEFFICIENT(f_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(f_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(v_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(v_d);
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+ const Variable x(*i);
+ // Find the frequency and a value for `x' in `gr'.
+ if (!gr.frequency_no_check(x, f_n, f_d, v_n, v_d))
+ continue;
+ if (f_n == 0) {
+
+ // `x' is a constant in `gr'.
+ if (v_d != 1) {
+ // The value for `x' is not integral (`frequency_no_check()'
+ // ensures that `v_n' and `v_d' have no common divisors).
+ set_empty();
+ return;
+ }
+
+ // `x' is a constant and has an integral value.
+ if ((v_n > max_value) || (v_n < min_value)) {
+ // The value is outside the range of the bounded integer type.
+ if (o == OVERFLOW_IMPOSSIBLE) {
+ // Then `x' has no possible value and hence set empty.
+ set_empty();
+ return;
+ }
+ PPL_ASSERT(o == OVERFLOW_WRAPS);
+ // The value v_n for `x' is wrapped modulo the 'wrap_frequency'.
+ v_n %= wrap_frequency;
+ // `v_n' is the value closest to 0 and may be negative.
+ if (r == UNSIGNED && v_n < 0)
+ v_n += wrap_frequency;
+ unconstrain(x);
+ add_constraint(x == v_n);
+ }
+ continue;
+ }
+
+ // `x' is not a constant in `gr'.
+ PPL_ASSERT(f_n != 0);
+
+ if (f_d % v_d != 0) {
+ // Then `x' has no integral value and hence `gr' is set empty.
+ set_empty();
+ return;
+ }
+ if (f_d != 1) {
+ // `x' has non-integral values, so add the integrality
+ // congruence for `x'.
+ add_congruence((x %= 0) / 1);
+ }
+ if (o == OVERFLOW_WRAPS && f_n != wrap_frequency)
+ // We know that `x' is not a constant, so, if overflow wraps,
+ // `x' may wrap to a value modulo the `wrap_frequency'.
+ add_grid_generator(parameter(wrap_frequency * x));
+ else if ((o == OVERFLOW_IMPOSSIBLE && 2*f_n >= wrap_frequency)
+ || (f_n == wrap_frequency)) {
+ // In these cases, `x' can only take a unique (ie constant)
+ // value.
+ if (r == UNSIGNED && v_n < 0) {
+ // `v_n' is the value closest to 0 and may be negative.
+ v_n += f_n;
+ }
+ unconstrain(x);
+ add_constraint(x == v_n);
+ }
+ else {
+ // If overflow is impossible but the grid frequency is less than
+ // half the wrap frequency, then there is more than one possible
+ // value for `x' in the range of the bounded integer type,
+ // so the grid is unchanged.
+ PPL_ASSERT(o == OVERFLOW_IMPOSSIBLE && 2*f_n < wrap_frequency);
+ }
+ }
+ return;
+ }
+
+ PPL_ASSERT(o == OVERFLOW_UNDEFINED);
+ // If overflow is undefined, then all we know is that the variable
+ // may take any integer within the range of the bounded integer type.
+ const Grid_Generator& point = gr.gen_sys[0];
+ const Coefficient& div = point.divisor();
+ max_value *= div;
+ min_value *= div;
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+ const Variable x(*i);
+ if (!gr.bounds_no_check(x)) {
+ // `x' is not a constant in `gr'.
+ // We know that `x' is not a constant, so `x' may wrap to any
+ // value `x + z' where z is an integer.
+ if (point.coefficient(x) % div != 0) {
+ // We know that `x' can take non-integral values, so enforce
+ // integrality.
+ unconstrain(x);
+ add_congruence(x %= 0);
+ }
+ else
+ // `x' has at least one integral value.
+ // `x' may also take other non-integral values,
+ // but checking could be costly so we ignore this.
+ add_grid_generator(parameter(x));
+ }
+ else {
+ // `x' is a constant `v' in `gr'.
+ const Coefficient& coeff_x = point.coefficient(x);
+ // `x' should be integral.
+ if (coeff_x % div != 0) {
+ set_empty();
+ return;
+ }
+ // If the value `v' for `x' is not within the range for the
+ // bounded integer type, then `x' may wrap to any value `v + z'
+ // where `z' is an integer; otherwise `x' is unchanged.
+ if (coeff_x > max_value || coeff_x < min_value) {
+ add_grid_generator(parameter(x));
+ }
+ }
+ }
+}
+
+void
+PPL::Grid::drop_some_non_integer_points(Complexity_Class) {
+ if (marked_empty() || space_dim == 0)
+ return;
+
+ // By adding integral congruences for each dimension to the
+ // congruence system, defining \p *this, the grid will keep only
+ // those points that have integral coordinates. All points in \p
+ // *this with non-integral coordinates are removed.
+ for (dimension_type i = space_dim; i-- > 0; )
+ add_congruence(Variable(i) %= 0);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (marked_empty() || min_space_dim == 0)
+ return;
+
+ // By adding the integral congruences for each dimension in vars to
+ // the congruence system defining \p *this, the grid will keep only
+ // those points that have integer coordinates for all the dimensions
+ // in vars. All points in \p *this with non-integral coordinates for
+ // the dimensions in vars are removed.
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i)
+ add_congruence(Variable(*i) %= 0);
+
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid& gr) {
+ if (gr.is_empty())
+ s << "false";
+ else if (gr.is_universe())
+ s << "true";
+ else
+ s << gr.minimized_congruences();
+ return s;
+}
diff --git a/src/Grid_simplify.cc b/src/Grid_simplify.cc
new file mode 100644
index 0000000..b52a9e1
--- /dev/null
+++ b/src/Grid_simplify.cc
@@ -0,0 +1,588 @@
+/* Grid class implementation: simplify().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "assert.hh"
+#include "Grid_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void
+Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot,
+ dimension_type column) {
+ Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+ Coefficient_traits::const_reference row_column = row.expr.get(column);
+ PPL_ASSERT(pivot_column != 0);
+ PPL_ASSERT(row_column != 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+ // Use reduced_row_col temporarily to hold the gcd.
+ gcd_assign(reduced_row_col, pivot_column, row_column);
+ // Store the reduced ratio between pivot[column] and row[column].
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+ exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+ exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero.
+ neg_assign(reduced_row_col);
+ // pivot.space_dimension() is the index for the parameter divisor so we
+ // start reducing the line at index pivot.space_dimension() - 2.
+ row.expr.linear_combine(pivot.expr,
+ reduced_pivot_col, reduced_row_col,
+ column, pivot.expr.space_dimension());
+ PPL_ASSERT(row.OK());
+ PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+void
+Grid::reduce_equality_with_equality(Congruence& row,
+ const Congruence& pivot,
+ const dimension_type column) {
+ // Assume two equalities.
+ PPL_ASSERT(row.modulus() == 0 && pivot.modulus() == 0);
+
+ Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+ Coefficient_traits::const_reference row_column = row.expr.get(column);
+ PPL_ASSERT(pivot_column != 0);
+ PPL_ASSERT(row_column != 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+ // Use reduced_row_col temporarily to hold the gcd.
+ gcd_assign(reduced_row_col, pivot_column, row_column);
+ // Store the reduced ratio between pivot[column] and row[column].
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+ exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+ exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero.
+ neg_assign(reduced_row_col);
+ row.expr.linear_combine(pivot.expr,
+ reduced_pivot_col, reduced_row_col,
+ 0, column + 1);
+ PPL_ASSERT(row.OK());
+ PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+template <typename R>
+void
+Grid::reduce_pc_with_pc(R& row, R& pivot,
+ const dimension_type column,
+ const dimension_type start,
+ const dimension_type end) {
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(start <= column);
+ PPL_ASSERT(column < end);
+
+ Linear_Expression& row_e = row.expr;
+ Linear_Expression& pivot_e = pivot.expr;
+
+ Coefficient_traits::const_reference pivot_column = pivot_e.get(column);
+ Coefficient_traits::const_reference row_column = row_e.get(column);
+ PPL_ASSERT(pivot_column != 0);
+ PPL_ASSERT(row_column != 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(s);
+ PPL_DIRTY_TEMP_COEFFICIENT(t);
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcdext_assign(gcd, s, t, pivot_column, row_column);
+ PPL_ASSERT(pivot_e.get(column) * s + row_e.get(column) * t == gcd);
+
+ // Store the reduced ratio between pivot[column] and row[column].
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+ exact_div_assign(reduced_pivot_col, pivot_column, gcd);
+ exact_div_assign(reduced_row_col, row_column, gcd);
+
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero. Afterward, multiply pivot,
+ // then add to it a (possibly negative) multiple of row such that
+ // the result in pivot[column] is the smallest possible positive
+ // integer.
+ const Linear_Expression old_pivot_e = pivot_e;
+ pivot_e.linear_combine_lax(row_e, s, t, start, end);
+ PPL_ASSERT(pivot_e.get(column) == gcd);
+ row_e.linear_combine(old_pivot_e, reduced_pivot_col, -reduced_row_col, start, end);
+ PPL_ASSERT(row_e.get(column) == 0);
+}
+
+void
+Grid::reduce_parameter_with_line(Grid_Generator& row,
+ const Grid_Generator& pivot,
+ const dimension_type column,
+ Swapping_Vector<Grid_Generator>& rows,
+ const dimension_type total_num_columns) {
+ // Very similar to reduce_congruence_with_equality below. Any
+ // change here may be needed there too.
+
+ Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+ Coefficient_traits::const_reference row_column = row.expr.get(column);
+ PPL_ASSERT(pivot_column != 0);
+ PPL_ASSERT(row_column != 0);
+
+ // Subtract one to allow for the parameter divisor column
+ const dimension_type num_columns = total_num_columns - 1;
+
+ // If the elements at column in row and pivot are the same, then
+ // just subtract pivot from row.
+ if (row_column == pivot_column) {
+ row.expr.linear_combine(pivot.expr, 1, -1, 0, num_columns);
+ return;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+ // Use reduced_row_col temporarily to hold the gcd.
+ gcd_assign(reduced_row_col, pivot_column, row_column);
+ // Store the reduced ratio between pivot[column] and row[column].
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+ exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+ exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+
+
+ // Since we are reducing the system to "strong minimal form",
+ // ensure that the multiplier is positive, so that the preceding
+ // diagonals (including the divisor) remain positive. It's safe to
+ // swap the signs as row[column] will still come out 0.
+ if (reduced_pivot_col < 0) {
+ neg_assign(reduced_pivot_col);
+ neg_assign(reduced_row_col);
+ }
+
+ // Multiply row such that a multiple of pivot can be subtracted from
+ // it below to render row[column] zero. This requires multiplying
+ // all other parameters to match.
+ for (dimension_type index = rows.size(); index-- > 0; ) {
+ Grid_Generator& gen = rows[index];
+ if (gen.is_parameter_or_point())
+ // Do not scale the last coefficient.
+ gen.expr.mul_assign(reduced_pivot_col, 0, num_columns);
+ }
+
+ // Subtract from row a multiple of pivot such that the result in
+ // row[column] is zero.
+ row.expr.linear_combine(pivot.expr,
+ Coefficient_one(), -reduced_row_col,
+ column, num_columns);
+ PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+void
+Grid::reduce_congruence_with_equality(Congruence& row,
+ const Congruence& pivot,
+ const dimension_type column,
+ Swapping_Vector<Congruence>& sys) {
+ // Very similar to reduce_parameter_with_line above. Any change
+ // here may be needed there too.
+ PPL_ASSERT(row.modulus() > 0 && pivot.modulus() == 0);
+
+ Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+ Coefficient_traits::const_reference row_column = row.expr.get(column);
+
+ // If the elements at `column' in row and pivot are the same, then
+ // just subtract `pivot' from `row'.
+ if (row_column == pivot_column) {
+ row.expr -= pivot.expr;
+ return;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+ // Use reduced_row_col temporarily to hold the gcd.
+ gcd_assign(reduced_row_col, pivot_column, row_column);
+ PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+ exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+ exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+ // Ensure that `reduced_pivot_col' is positive, so that the modulus
+ // remains positive when multiplying the proper congruences below.
+ // It's safe to swap the signs as row[column] will still come out 0.
+ if (reduced_pivot_col < 0) {
+ neg_assign(reduced_pivot_col);
+ neg_assign(reduced_row_col);
+ }
+ // Multiply `row', including the modulus, by reduced_pivot_col. To
+ // keep all the moduli the same this requires multiplying all the
+ // other proper congruences in the same way.
+ for (dimension_type index = sys.size(); index-- > 0; ) {
+ Congruence& cg = sys[index];
+ if (cg.is_proper_congruence())
+ cg.scale(reduced_pivot_col);
+ }
+ // Subtract from row a multiple of pivot such that the result in
+ // row[column] is zero.
+ sub_mul_assign(row.expr, reduced_row_col, pivot.expr);
+ PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+#ifndef NDEBUG
+template <typename M, typename R>
+bool
+Grid::rows_are_zero(M& system, dimension_type first,
+ dimension_type last, dimension_type row_size) {
+ while (first <= last) {
+ const R& row = system[first++];
+ if (!row.expr.all_zeroes(0, row_size))
+ return false;
+ }
+ return true;
+}
+#endif
+
+void
+Grid::simplify(Grid_Generator_System& ggs, Dimension_Kinds& dim_kinds) {
+ PPL_ASSERT(!ggs.has_no_rows());
+ // Changes here may also be required in the congruence version below.
+
+ // Subtract one to allow for the parameter divisor column
+ const dimension_type num_columns = ggs.space_dimension() + 1;
+
+ if (dim_kinds.size() != num_columns)
+ dim_kinds.resize(num_columns);
+
+ const dimension_type num_rows = ggs.num_rows();
+
+ // For each dimension `dim' move or construct a row into position
+ // `pivot_index' such that the row has zero in all elements
+ // following column `dim' and a value other than zero in column
+ // `dim'.
+ dimension_type pivot_index = 0;
+ for (dimension_type dim = 0; dim < num_columns; ++dim) {
+ // Consider the pivot and following rows.
+ dimension_type row_index = pivot_index;
+
+ // Move down over rows which have zero in column `dim'.
+ while (row_index < num_rows
+ && ggs.sys.rows[row_index].expr.get(dim) == 0)
+ ++row_index;
+
+ if (row_index == num_rows)
+ // Element in column `dim' is zero in all rows from the pivot.
+ dim_kinds[dim] = GEN_VIRTUAL;
+ else {
+ if (row_index != pivot_index) {
+ using std::swap;
+ swap(ggs.sys.rows[row_index], ggs.sys.rows[pivot_index]);
+ }
+ Grid_Generator& pivot = ggs.sys.rows[pivot_index];
+ bool pivot_is_line = pivot.is_line();
+
+ // Change the matrix so that the value at `dim' in every row
+ // following `pivot_index' is 0, leaving an equivalent grid.
+ while (row_index < num_rows - 1) {
+ ++row_index;
+ Grid_Generator& row = ggs.sys.rows[row_index];
+
+ if (row.expr.get(dim) == 0)
+ continue;
+
+ if (row.is_line())
+ if (pivot_is_line)
+ reduce_line_with_line(row, pivot, dim);
+ else {
+ PPL_ASSERT(pivot.is_parameter_or_point());
+ using std::swap;
+ swap(row, pivot);
+ pivot_is_line = true;
+ reduce_parameter_with_line(row, pivot, dim, ggs.sys.rows,
+ num_columns + 1);
+ }
+ else {
+ PPL_ASSERT(row.is_parameter_or_point());
+ if (pivot_is_line)
+ reduce_parameter_with_line(row, pivot, dim, ggs.sys.rows,
+ num_columns + 1);
+ else {
+ PPL_ASSERT(pivot.is_parameter_or_point());
+ reduce_pc_with_pc(row, pivot, dim, dim, num_columns);
+ }
+ }
+ }
+
+ if (pivot_is_line)
+ dim_kinds[dim] = LINE;
+ else {
+ PPL_ASSERT(pivot.is_parameter_or_point());
+ dim_kinds[dim] = PARAMETER;
+ }
+
+ // Since we are reducing the system to "strong minimal form",
+ // ensure that a positive value follows the leading zeros.
+ if (pivot.expr.get(dim) < 0)
+ pivot.expr.negate(dim, num_columns);
+
+ // Factor this row out of the preceding rows.
+ reduce_reduced<Grid_Generator_System>
+ (ggs.sys.rows, dim, pivot_index, dim, num_columns - 1, dim_kinds);
+
+ ++pivot_index;
+ }
+ }
+
+ // Clip any zero rows from the end of the matrix.
+ if (num_rows > pivot_index) {
+#ifndef NDEBUG
+ const bool ret = rows_are_zero<Grid_Generator_System, Grid_Generator>
+ (ggs,
+ // index of first
+ pivot_index,
+ // index of last
+ ggs.num_rows() - 1,
+ // row size
+ ggs.space_dimension() + 1);
+ PPL_ASSERT(ret == true);
+#endif
+ ggs.sys.rows.resize(pivot_index);
+ }
+
+ // Ensure that the parameter divisors are the same as the system
+ // divisor.
+ const Coefficient& system_divisor = ggs.sys.rows[0].expr.inhomogeneous_term();
+ for (dimension_type i = ggs.sys.rows.size() - 1,
+ dim = num_columns - 1; dim > 0; --dim) {
+ switch (dim_kinds[dim]) {
+ case PARAMETER:
+ ggs.sys.rows[i].set_divisor(system_divisor);
+ // Intentionally fall through.
+ case LINE:
+ PPL_ASSERT(ggs.sys.rows[i].OK());
+ --i;
+ break;
+ case GEN_VIRTUAL:
+ break;
+ }
+ }
+
+ ggs.unset_pending_rows();
+ PPL_ASSERT(ggs.sys.OK());
+}
+
+bool
+Grid::simplify(Congruence_System& cgs, Dimension_Kinds& dim_kinds) {
+ PPL_ASSERT(cgs.space_dimension() != 0);
+ // Changes here may also be required in the generator version above.
+
+ // TODO: Consider normalizing the moduli only when congruences are
+ // added to con_sys.
+ cgs.normalize_moduli();
+
+ // NOTE: add one for the inhomogeneous term (but not the modulus).
+ const dimension_type num_columns = cgs.space_dimension() + 1;
+
+ if (dim_kinds.size() != num_columns)
+ dim_kinds.resize(num_columns);
+
+ const dimension_type num_rows = cgs.num_rows();
+
+ // For each dimension `dim' move or construct a row into position
+ // `pivot_index' such that the row has a value of zero in all
+ // elements preceding column `dim' and some other value in column
+ // `dim'.
+ dimension_type pivot_index = 0;
+ for (dimension_type dim = num_columns; dim-- > 0; ) {
+ // Consider the pivot and following rows.
+ dimension_type row_index = pivot_index;
+
+ // Move down over rows which have zero in column `dim'.
+ while (row_index < num_rows && cgs.rows[row_index].expr.get(dim) == 0)
+ ++row_index;
+
+ if (row_index == num_rows)
+ // Element in column `dim' is zero in all rows from the pivot,
+ // or `cgs' is empty of rows.
+ dim_kinds[dim] = CON_VIRTUAL;
+ else {
+ // Here row_index != num_rows.
+ if (row_index != pivot_index) {
+ using std::swap;
+ swap(cgs.rows[row_index], cgs.rows[pivot_index]);
+ }
+
+ Congruence& pivot = cgs.rows[pivot_index];
+ bool pivot_is_equality = pivot.is_equality();
+
+ // Change the matrix so that the value at `dim' in every row
+ // following `pivot_index' is 0, leaving an equivalent grid.
+ while (row_index < num_rows - 1) {
+ ++row_index;
+ Congruence& row = cgs.rows[row_index];
+ if (row.expr.get(dim) == 0)
+ continue;
+
+ if (row.is_equality()) {
+ if (pivot_is_equality)
+ reduce_equality_with_equality(row, pivot, dim);
+ else {
+ PPL_ASSERT(pivot.is_proper_congruence());
+ using std::swap;
+ swap(row, pivot);
+ pivot_is_equality = true;
+ reduce_congruence_with_equality(row, pivot, dim, cgs.rows);
+ }
+ }
+ else {
+ PPL_ASSERT(row.is_proper_congruence());
+ if (pivot_is_equality)
+ reduce_congruence_with_equality(row, pivot, dim, cgs.rows);
+ else {
+ PPL_ASSERT(pivot.is_proper_congruence());
+ reduce_pc_with_pc(row, pivot, dim, 0, dim + 1);
+ }
+ }
+ }
+
+ if (pivot_is_equality)
+ dim_kinds[dim] = EQUALITY;
+ else {
+ PPL_ASSERT(pivot.is_proper_congruence());
+ dim_kinds[dim] = PROPER_CONGRUENCE;
+ }
+
+ // Since we are reducing the system to "strong minimal form",
+ // ensure that a positive value follows the leading zeros.
+ if (pivot.expr.get(dim) < 0)
+ pivot.expr.negate(0, dim + 1);
+
+ // Factor this row out of the preceding ones.
+ reduce_reduced<Congruence_System>
+ (cgs.rows, dim, pivot_index, 0, dim, dim_kinds, false);
+
+ PPL_ASSERT(cgs.OK());
+
+ ++pivot_index;
+ }
+ }
+
+ if (pivot_index > 0) {
+ // If the last row is false then make it the equality 1 = 0, and
+ // make it the only row.
+
+#ifndef NDEBUG
+ {
+ const bool ret = rows_are_zero<Congruence_System, Congruence>
+ (cgs,
+ // index of first
+ pivot_index,
+ // index of last
+ num_rows - 1,
+ // row size
+ num_columns);
+ PPL_ASSERT(ret == true);
+ }
+#endif
+
+ cgs.remove_trailing_rows(num_rows - pivot_index);
+ Congruence& last_row = cgs.rows.back();
+
+ switch (dim_kinds[0]) {
+
+ case PROPER_CONGRUENCE:
+ if (last_row.inhomogeneous_term() % last_row.modulus() == 0)
+ break;
+ // The last row is a false proper congruence.
+ last_row.set_modulus(Coefficient_zero());
+ dim_kinds[0] = EQUALITY;
+ // Intentionally fall through.
+
+ case EQUALITY:
+ // The last row is a false equality, as all the coefficient terms
+ // are zero while the inhomogeneous term (as a result of the
+ // reduced form) is some other value.
+ last_row.expr.set_inhomogeneous_term(Coefficient_one());
+ dim_kinds.resize(1);
+ using std::swap;
+ swap(cgs.rows[0], last_row);
+ cgs.remove_trailing_rows(cgs.num_rows() - 1);
+ PPL_ASSERT(cgs.OK());
+ return true;
+
+ default:
+ break;
+ }
+ }
+ else {
+ // Either `cgs' is empty (it defines the universe) or every column
+ // before the modulus column contains only zeroes.
+
+ if (num_rows > 0) {
+#ifndef NDEBUG
+ const bool ret = rows_are_zero<Congruence_System, Congruence>
+ (cgs,
+ // index of first
+ 0,
+ // index of last
+ num_rows - 1,
+ // row size
+ num_columns);
+ PPL_ASSERT(ret == true);
+#endif
+ // Ensure that a single row will remain for the integrality congruence.
+ cgs.remove_trailing_rows(num_rows - 1);
+ }
+
+ // Set up the integrality congruence.
+ dim_kinds[0] = PROPER_CONGRUENCE;
+ if (num_rows == 0) {
+ Congruence cg;
+ cg.set_modulus(Coefficient_one());
+ cg.set_space_dimension(cgs.space_dimension());
+ cg.expr.set_inhomogeneous_term(Coefficient_one());
+ cgs.insert_verbatim(cg, Recycle_Input());
+
+ PPL_ASSERT(cgs.OK());
+ return false;
+ }
+
+ PPL_ASSERT(cgs.num_rows() == 1);
+ cgs.rows.back().set_modulus(Coefficient_one());
+ }
+
+ // Ensure that the last row is the integrality congruence.
+ if (dim_kinds[0] == CON_VIRTUAL) {
+ // The last row is virtual, append the integrality congruence.
+ dim_kinds[0] = PROPER_CONGRUENCE;
+ Congruence new_last_row;
+ new_last_row.set_space_dimension(cgs.space_dimension());
+ new_last_row.set_modulus(Coefficient_one());
+ // Try use an existing modulus.
+ dimension_type row_index = cgs.num_rows();
+ while (row_index-- > 0) {
+ const Congruence& row = cgs[row_index];
+ if (row.modulus() > 0) {
+ new_last_row.set_modulus(row.modulus());
+ break;
+ }
+ }
+ new_last_row.expr.set_inhomogeneous_term(new_last_row.modulus());
+ cgs.insert_verbatim(new_last_row, Recycle_Input());
+ }
+ else {
+ cgs.rows.back().expr.set_inhomogeneous_term(cgs.rows.back().modulus());
+ }
+
+ // Since we are reducing the system to "strong minimal form",
+ // factor the modified integrality congruence out of the other rows;
+ reduce_reduced<Congruence_System>
+ (cgs.rows, 0, cgs.num_rows() - 1, 0, 0, dim_kinds, false);
+
+ PPL_ASSERT(cgs.OK());
+ return false;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_templates.hh b/src/Grid_templates.hh
new file mode 100644
index 0000000..a4223f1
--- /dev/null
+++ b/src/Grid_templates.hh
@@ -0,0 +1,339 @@
+/* Grid class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_templates_hh
+#define PPL_Grid_templates_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box, Complexity_Class)
+ : con_sys(),
+ gen_sys() {
+ space_dim = check_space_dimension_overflow(box.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(box, from_bounding_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.set_space_dimension(space_dim);
+ gen_sys.set_space_dimension(space_dim);
+ // Add congruences and generators according to `box'.
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+ gen_sys.insert(grid_point());
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ bool closed = false;
+ // TODO: Consider producing the system(s) in minimized form.
+ if (box.has_lower_bound(v_k, l_n, l_d, closed)) {
+ if (box.has_upper_bound(v_k, u_n, u_d, closed))
+ if (l_n * u_d == u_n * l_d) {
+ // A point interval sets dimension k of every point to a
+ // single value.
+ con_sys.insert(l_d * v_k == l_n);
+
+ // This is declared here because it may be invalidated
+ // by the call to gen_sys.insert() at the end of the loop.
+ Grid_Generator& point = gen_sys.sys.rows[0];
+
+ // Scale the point to use as divisor the lcm of the
+ // divisors of the existing point and the lower bound.
+ const Coefficient& point_divisor = point.divisor();
+ gcd_assign(u_n, l_d, point_divisor);
+ // `u_n' now holds the gcd.
+ exact_div_assign(u_n, point_divisor, u_n);
+ if (l_d < 0)
+ neg_assign(u_n);
+ // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+ point.scale_to_divisor(l_d * u_n);
+ // Set dimension k of the point to the lower bound.
+ if (l_d < 0)
+ neg_assign(u_n);
+ // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+ point.expr.set(Variable(k), l_n * u_n);
+ PPL_ASSERT(point.OK());
+
+ PPL_ASSERT(gen_sys.sys.OK());
+
+ continue;
+ }
+ }
+ // A universe interval allows any value in dimension k.
+ gen_sys.insert(grid_line(v_k));
+ }
+ set_congruences_up_to_date();
+ set_generators_up_to_date();
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the grid becomes zero_dimensional.
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing all dimensions from the empty grid.
+ space_dim = 0;
+ set_empty();
+ }
+ else
+ // Removing all dimensions from a non-empty grid.
+ set_zero_dim_univ();
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+ if (new_space_dimension == space_dim) {
+ // The partial function `pfunc' is indeed total and thus specifies
+ // a permutation, that is, a renaming of the dimensions. For
+ // maximum efficiency, we will simply permute the columns of the
+ // constraint system and/or the generator system.
+
+ std::vector<Variable> cycle;
+ cycle.reserve(space_dim);
+
+ // Used to mark elements as soon as they are inserted in a cycle.
+ std::deque<bool> visited(space_dim);
+
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ if (!visited[i]) {
+ dimension_type j = i;
+ do {
+ visited[j] = true;
+ // The following initialization is only to make the compiler happy.
+ dimension_type k = 0;
+ if (!pfunc.maps(j, k))
+ throw_invalid_argument("map_space_dimensions(pfunc)",
+ " pfunc is inconsistent");
+ if (k == j)
+ break;
+
+ cycle.push_back(Variable(j));
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+
+ // End of cycle.
+
+ // Avoid calling clear_*_minimized() if cycle.size() is less than 2,
+ // to improve efficiency.
+ if (cycle.size() >= 2) {
+ // Permute all that is up-to-date.
+ if (congruences_are_up_to_date()) {
+ con_sys.permute_space_dimensions(cycle);
+ clear_congruences_minimized();
+ }
+
+ if (generators_are_up_to_date()) {
+ gen_sys.permute_space_dimensions(cycle);
+ clear_generators_minimized();
+ }
+ }
+
+ cycle.clear();
+ }
+ }
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // If control gets here, then `pfunc' is not a permutation and some
+ // dimensions must be projected away.
+
+ const Grid_Generator_System& old_gensys = grid_generators();
+
+ if (old_gensys.has_no_rows()) {
+ // The grid is empty.
+ Grid new_grid(new_space_dimension, EMPTY);
+ m_swap(new_grid);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Make a local copy of the partial function.
+ std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ dimension_type pfunc_j;
+ if (pfunc.maps(j, pfunc_j))
+ pfunc_maps[j] = pfunc_j;
+ }
+
+ Grid_Generator_System new_gensys;
+ // Set sortedness, for the assertion met via gs::insert.
+ new_gensys.set_sorted(false);
+ // Get the divisor of the first point.
+ Grid_Generator_System::const_iterator i;
+ Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+ for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+ if (i->is_point())
+ break;
+ PPL_ASSERT(i != old_gensys_end);
+ const Coefficient& system_divisor = i->divisor();
+ for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
+ const Grid_Generator& old_g = *i;
+ const Grid_Generator::expr_type old_g_e = old_g.expression();
+ Linear_Expression expr;
+ expr.set_space_dimension(new_space_dimension);
+ bool all_zeroes = true;
+ for (Grid_Generator::expr_type::const_iterator j = old_g_e.begin(),
+ j_end = old_g_e.end(); j != j_end; ++j) {
+ const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+ if (mapped_id != not_a_dimension()) {
+ add_mul_assign(expr, *j, Variable(mapped_id));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Grid_Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(grid_line(expr));
+ break;
+ case Grid_Generator::PARAMETER:
+ if (!all_zeroes)
+ new_gensys.insert(parameter(expr, system_divisor));
+ break;
+ case Grid_Generator::POINT:
+ new_gensys.insert(grid_point(expr, old_g.divisor()));
+ break;
+ }
+ }
+
+ Grid new_grid(new_gensys);
+ m_swap(new_grid);
+
+ PPL_ASSERT(OK(true));
+}
+
+// Needed for converting the congruence or grid_generator system
+// to "strong minimal form".
+template <typename M>
+void
+Grid::reduce_reduced(Swapping_Vector<typename M::row_type>& rows,
+ const dimension_type dim,
+ const dimension_type pivot_index,
+ const dimension_type start,
+ const dimension_type end,
+ const Dimension_Kinds& sys_dim_kinds,
+ const bool generators) {
+ // TODO: Remove this.
+ typedef typename M::row_type M_row_type;
+
+ const M_row_type& pivot = rows[pivot_index];
+ const Coefficient& pivot_dim = pivot.expr.get(dim);
+
+ if (pivot_dim == 0)
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half);
+ pivot_dim_half = (pivot_dim + 1) / 2;
+ const Dimension_Kind row_kind = sys_dim_kinds[dim];
+ const bool row_is_line_or_equality
+ = (row_kind == (generators ? LINE : EQUALITY));
+
+ PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract);
+ PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder);
+ for (dimension_type kinds_index = dim,
+ row_index = pivot_index; row_index-- > 0; ) {
+ if (generators) {
+ --kinds_index;
+ // Move over any virtual rows.
+ while (sys_dim_kinds[kinds_index] == GEN_VIRTUAL)
+ --kinds_index;
+ }
+ else {
+ ++kinds_index;
+ // Move over any virtual rows.
+ while (sys_dim_kinds[kinds_index] == CON_VIRTUAL)
+ ++kinds_index;
+ }
+
+ // row_kind CONGRUENCE is included as PARAMETER
+ if (row_is_line_or_equality
+ || (row_kind == PARAMETER
+ && sys_dim_kinds[kinds_index] == PARAMETER)) {
+ M_row_type& row = rows[row_index];
+
+ const Coefficient& row_dim = row.expr.get(dim);
+ // num_rows_to_subtract may be positive or negative.
+ num_rows_to_subtract = row_dim / pivot_dim;
+
+ // Ensure that after subtracting num_rows_to_subtract * r_dim
+ // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+ // E.g., if pivot[dim] = 9, then after this reduction
+ // -5 < row_dim <= 5.
+ row_dim_remainder = row_dim % pivot_dim;
+ if (row_dim_remainder < 0) {
+ if (row_dim_remainder <= -pivot_dim_half)
+ --num_rows_to_subtract;
+ }
+ else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+ ++num_rows_to_subtract;
+
+ // Subtract num_rows_to_subtract copies of pivot from row i. Only the
+ // entries from dim need to be subtracted, as the preceding
+ // entries are all zero.
+ // If num_rows_to_subtract is negative, these copies of pivot are
+ // added to row i.
+ if (num_rows_to_subtract != 0)
+ row.expr.linear_combine(pivot.expr,
+ Coefficient_one(), -num_rows_to_subtract,
+ start, end + 1);
+ }
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_templates_hh)
diff --git a/src/Grid_types.hh b/src/Grid_types.hh
new file mode 100644
index 0000000..060d7f6
--- /dev/null
+++ b/src/Grid_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_types_hh
+#define PPL_Grid_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_types_hh)
diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc
new file mode 100644
index 0000000..972f127
--- /dev/null
+++ b/src/Grid_widenings.cc
@@ -0,0 +1,493 @@
+/* Grid class implementation
+ (non-inline widening-related member functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::select_wider_congruences(const Grid& y,
+ Congruence_System& selected_cgs) const {
+ // Private method: the caller must ensure the following conditions
+ // (beside the inclusion `y <= x').
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(!y.marked_empty());
+ PPL_ASSERT(congruences_are_minimized());
+ PPL_ASSERT(y.congruences_are_minimized());
+
+ // Note: row counters start at 0, to preserve the original order in
+ // the selected congruences.
+ for (dimension_type dim = con_sys.space_dimension(), x_row = 0, y_row = 0;
+ dim > 0; --dim) {
+ PPL_ASSERT(dim_kinds[dim] == CON_VIRTUAL
+ || dim_kinds[dim] == y.dim_kinds[dim]);
+ switch (dim_kinds[dim]) {
+ case PROPER_CONGRUENCE:
+ {
+ const Congruence& cg = con_sys[x_row];
+ const Congruence& y_cg = y.con_sys[y_row];
+ if (cg.is_equal_at_dimension(Variable(dim - 1), y_cg))
+ // The leading diagonal entries are equal.
+ selected_cgs.insert(cg);
+ ++x_row;
+ ++y_row;
+ }
+ break;
+ case EQUALITY:
+ selected_cgs.insert(con_sys[x_row]);
+ ++x_row;
+ ++y_row;
+ break;
+ case CON_VIRTUAL:
+ if (y.dim_kinds[dim] != CON_VIRTUAL)
+ ++y_row;
+ break;
+ }
+ }
+}
+
+void
+PPL::Grid::congruence_widening_assign(const Grid& y, unsigned* tp) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+ if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+ return;
+
+ // Ensure that the `x' congruences are in minimal form.
+ if (x.congruences_are_up_to_date()) {
+ if (!x.congruences_are_minimized()) {
+ if (simplify(x.con_sys, x.dim_kinds)) {
+ // `x' is empty.
+ x.set_empty();
+ return;
+ }
+ x.set_congruences_minimized();
+ }
+ }
+ else
+ x.update_congruences();
+
+ // Ensure that the `y' congruences are in minimal form.
+ Grid& yy = const_cast<Grid&>(y);
+ if (yy.congruences_are_up_to_date()) {
+ if (!yy.congruences_are_minimized()) {
+ if (simplify(yy.con_sys, yy.dim_kinds)) {
+ // `y' is empty.
+ yy.set_empty();
+ return;
+ }
+ yy.set_congruences_minimized();
+ }
+ }
+ else
+ yy.update_congruences();
+
+ if (con_sys.num_equalities() < yy.con_sys.num_equalities())
+ return;
+
+ // Copy into `cgs' the congruences of `x' that are common to `y',
+ // according to the grid widening.
+ Congruence_System cgs;
+ x.select_wider_congruences(yy, cgs);
+
+ if (cgs.num_rows() == con_sys.num_rows())
+ // All congruences were selected, thus the result is `x'.
+ return;
+
+ // A strict subset of the congruences was selected.
+
+ Grid result(x.space_dim);
+ result.add_recycled_congruences(cgs);
+
+ // Check whether we are using the widening-with-tokens technique
+ // and there are still tokens available.
+ if (tp != 0 && *tp > 0) {
+ // There are tokens available. If `result' is not a subset of
+ // `x', then it is less precise and we use one of the available
+ // tokens.
+ if (!x.contains(result))
+ --(*tp);
+ }
+ else
+ // No tokens.
+ x.m_swap(result);
+
+ PPL_ASSERT(x.OK(true));
+}
+
+void
+PPL::Grid::limited_congruence_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp) {
+ Grid& x = *this;
+
+ // Check dimension compatibility.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "y", y);
+ // `cgs' must be dimension-compatible with the two grids.
+ const dimension_type cgs_space_dim = cgs.space_dimension();
+ if (x.space_dim < cgs_space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "cgs", cgs);
+
+ const dimension_type cgs_num_rows = cgs.num_rows();
+ // If `cgs' is empty (of rows), fall back to ordinary widening.
+ if (cgs_num_rows == 0) {
+ x.widening_assign(y, tp);
+ return;
+ }
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty())
+ return;
+
+ // The limited widening between two grids in a zero-dimensional
+ // space is also a grid in a zero-dimensional space.
+ if (x.space_dim == 0)
+ return;
+
+ // Update the generators of `x': these are used to select, from the
+ // congruences in `cgs', those that must be added to the widened
+ // grid.
+ if (!x.generators_are_up_to_date() && !x.update_generators())
+ // `x' is empty.
+ return;
+
+ if (tp == NULL || *tp == 0) {
+ // Widening may change the grid, so add the congruences.
+ Congruence_System new_cgs;
+ // The congruences to be added need only be satisfied by all the
+ // generators of `x', as `y <= x'. Iterate upwards here, to keep
+ // the relative ordering of congruences (just for aesthetics).
+ for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+ const Congruence& cg = cgs[i];
+ if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+ new_cgs.insert(cg);
+ }
+ x.congruence_widening_assign(y, tp);
+ x.add_recycled_congruences(new_cgs);
+ }
+ else
+ // There are tokens, so widening will leave the grid the same.
+ x.congruence_widening_assign(y, tp);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::select_wider_generators(const Grid& y,
+ Grid_Generator_System& widened_ggs) const {
+ // Private method: the caller must ensure the following conditions
+ // (beside the inclusion `y <= x').
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(!y.marked_empty());
+ PPL_ASSERT(generators_are_minimized());
+ PPL_ASSERT(y.generators_are_minimized());
+
+ // Note: row counters start at 0, to preserve the original order in
+ // the selected generators.
+ for (dimension_type dim = 0, x_row = 0, y_row = 0;
+ dim <= gen_sys.space_dimension(); ++dim) {
+ PPL_ASSERT(dim_kinds[dim] == LINE
+ || y.dim_kinds[dim] == GEN_VIRTUAL
+ || dim_kinds[dim] == y.dim_kinds[dim]);
+ switch (dim_kinds[dim]) {
+ case PARAMETER:
+ {
+ const Grid_Generator& gg = gen_sys[x_row];
+ const Grid_Generator& y_gg = y.gen_sys[y_row];
+ if (gg.is_equal_at_dimension(dim, y_gg))
+ // The leading diagonal entry is equal.
+ widened_ggs.insert(gg);
+ else {
+ const Linear_Expression expr(gg.expression());
+ Grid_Generator line = grid_line(expr);
+ widened_ggs.insert(line, Recycle_Input());
+ }
+ ++x_row;
+ ++y_row;
+ }
+ break;
+ case LINE:
+ widened_ggs.insert(gen_sys[x_row]);
+ ++x_row;
+ ++y_row;
+ break;
+ case GEN_VIRTUAL:
+ if (y.dim_kinds[dim] != GEN_VIRTUAL)
+ ++y_row;
+ break;
+ }
+ }
+}
+
+void
+PPL::Grid::generator_widening_assign(const Grid& y, unsigned* tp) {
+ Grid& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("generator_widening_assign(y)", "y", y);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+ if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+ return;
+
+ // Ensure that the `x' generators are in minimal form.
+ if (x.generators_are_up_to_date()) {
+ if (!x.generators_are_minimized()) {
+ simplify(x.gen_sys, x.dim_kinds);
+ PPL_ASSERT(!x.gen_sys.has_no_rows());
+ x.set_generators_minimized();
+ }
+ }
+ else
+ x.update_generators();
+
+ if (x.marked_empty())
+ return;
+
+ // Ensure that the `y' generators are in minimal form.
+ Grid& yy = const_cast<Grid&>(y);
+ if (yy.generators_are_up_to_date()) {
+ if (!yy.generators_are_minimized()) {
+ simplify(yy.gen_sys, yy.dim_kinds);
+ PPL_ASSERT(!yy.gen_sys.has_no_rows());
+ yy.set_generators_minimized();
+ }
+ }
+ else
+ yy.update_generators();
+
+ if (gen_sys.num_rows() > yy.gen_sys.num_rows())
+ return;
+
+ if (gen_sys.num_lines() > yy.gen_sys.num_lines())
+ return;
+
+ // Copy into `ggs' the generators of `x' that are common to `y',
+ // according to the grid widening.
+ Grid_Generator_System ggs;
+ x.select_wider_generators(yy, ggs);
+
+ if (ggs.num_parameters() == gen_sys.num_parameters())
+ // All parameters are kept as parameters, thus the result is `x'.
+ return;
+
+ // A strict subset of the parameters was selected.
+
+ Grid result(x.space_dim, EMPTY);
+ result.add_recycled_grid_generators(ggs);
+
+ // Check whether we are using the widening-with-tokens technique
+ // and there are still tokens available.
+ if (tp != 0 && *tp > 0) {
+ // There are tokens available. If `result' is not a subset of
+ // `x', then it is less precise and we use one of the available
+ // tokens.
+ if (!x.contains(result))
+ --(*tp);
+ }
+ else
+ // No tokens.
+ x.m_swap(result);
+
+ PPL_ASSERT(x.OK(true));
+}
+
+void
+PPL::Grid::limited_generator_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp) {
+ Grid& x = *this;
+
+ // Check dimension compatibility.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "y", y);
+ // `cgs' must be dimension-compatible with the two grids.
+ const dimension_type cgs_space_dim = cgs.space_dimension();
+ if (x.space_dim < cgs_space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "cgs", cgs);
+
+ const dimension_type cgs_num_rows = cgs.num_rows();
+ // If `cgs' is empty (of rows), fall back to ordinary widening.
+ if (cgs_num_rows == 0) {
+ x.generator_widening_assign(y, tp);
+ return;
+ }
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty())
+ return;
+
+ // The limited widening between two grids in a zero-dimensional
+ // space is also a grid in a zero-dimensional space.
+ if (x.space_dim == 0)
+ return;
+
+ // Update the generators of `x': these are used to select, from the
+ // congruences in `cgs', those that must be added to the widened
+ // grid.
+ if (!x.generators_are_up_to_date() && !x.update_generators())
+ // `x' is empty.
+ return;
+
+ if (tp == NULL || *tp == 0) {
+ // Widening may change the grid, so add the congruences.
+ Congruence_System new_cgs;
+ // The congruences to be added need only be satisfied by all the
+ // generators of `x', as `y <= x'. Iterate upwards here, to keep
+ // the relative ordering of congruences (just for aesthetics).
+ for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+ const Congruence& cg = cgs[i];
+ if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+ new_cgs.insert(cg);
+ }
+ x.generator_widening_assign(y, tp);
+ x.add_recycled_congruences(new_cgs);
+ }
+ else
+ // There are tokens, so widening will leave the grid the same.
+ x.generator_widening_assign(y, tp);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::widening_assign(const Grid& y, unsigned* tp) {
+ Grid& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ // If the `x' congruences are up to date and `y' congruences are up
+ // to date use the congruence widening.
+ if (x.congruences_are_up_to_date() && y.congruences_are_up_to_date()) {
+ x.congruence_widening_assign(y, tp);
+ return;
+ }
+
+ // If the `x' generators are up to date and `y' generators are up to
+ // date use the generator widening.
+ if (x.generators_are_up_to_date() && y.generators_are_up_to_date()) {
+ x.generator_widening_assign(y, tp);
+ return;
+ }
+
+ x.congruence_widening_assign(y, tp);
+}
+
+void
+PPL::Grid::limited_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp) {
+ Grid& x = *this;
+
+ // Check dimension compatibility.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "y", y);
+ // `cgs' must be dimension-compatible with the two grids.
+ const dimension_type cgs_space_dim = cgs.space_dimension();
+ if (x.space_dim < cgs_space_dim)
+ throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+ "cgs", cgs);
+
+ const dimension_type cgs_num_rows = cgs.num_rows();
+ // If `cgs' is empty (of rows), fall back to ordinary widening.
+ if (cgs_num_rows == 0) {
+ x.widening_assign(y, tp);
+ return;
+ }
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty())
+ return;
+
+ // The limited widening between two grids in a zero-dimensional
+ // space is also a grid in a zero-dimensional space.
+ if (x.space_dim == 0)
+ return;
+
+ // Update the generators of `x': these are used to select, from the
+ // congruences in `cgs', those that must be added to the widened
+ // grid.
+ if (!x.generators_are_up_to_date() && !x.update_generators())
+ // `x' is empty.
+ return;
+
+ if (tp == NULL || *tp == 0) {
+ // Widening may change the grid, so add the congruences.
+ Congruence_System new_cgs;
+ // The congruences to be added need only be satisfied by all the
+ // generators of `x', as `y <= x'. Iterate upwards here, to keep
+ // the relative ordering of congruences (just for aesthetics).
+ for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+ const Congruence& cg = cgs[i];
+ if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+ new_cgs.insert(cg);
+ }
+ x.widening_assign(y, tp);
+ x.add_recycled_congruences(new_cgs);
+ }
+ else
+ // There are tokens, so widening will leave the grid the same.
+ x.widening_assign(y, tp);
+
+ PPL_ASSERT(OK());
+}
diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc
new file mode 100644
index 0000000..f90b6c3
--- /dev/null
+++ b/src/H79_Certificate.cc
@@ -0,0 +1,118 @@
+/* H79_Certificate class implementation
+ (non-inline member functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "H79_Certificate_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::H79_Certificate::H79_Certificate(const Polyhedron& ph)
+ : affine_dim(0), num_constraints(0) {
+ // The affine dimension of the polyhedron is obtained by subtracting
+ // the number of equalities from the space dimension.
+ // When counting constraints, for a correct reasoning, we have
+ // to disregard the low-level constraints (i.e., the positivity
+ // constraint and epsilon bounds).
+ const dimension_type space_dim = ph.space_dimension();
+ affine_dim = space_dim;
+ const Constraint_System& cs = ph.minimized_constraints();
+ // It is assumed that `ph' is not an empty polyhedron.
+ PPL_ASSERT(!ph.marked_empty());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ ++num_constraints;
+ if (i->is_equality())
+ --affine_dim;
+ }
+
+ // TODO: this is an inefficient workaround.
+ // For NNC polyhedra, generators might be no longer up-to-date
+ // (and hence, neither minimized) due to the strong minimization
+ // process applied to constraints when constructing the certificate.
+ // We have to reinforce the (normal) minimization of the generator
+ // system. The future, lazy implementation of the strong minimization
+ // process will solve this problem.
+ if (!ph.is_necessarily_closed())
+ ph.minimize();
+}
+
+int
+PPL::H79_Certificate::compare(const H79_Certificate& y) const {
+ if (affine_dim != y.affine_dim)
+ return (affine_dim > y.affine_dim) ? 1 : -1;
+ if (num_constraints != y.num_constraints)
+ return (num_constraints > y.num_constraints) ? 1 : -1;
+ // All components are equal.
+ return 0;
+}
+
+int
+PPL::H79_Certificate::compare(const Polyhedron& ph) const {
+ // The affine dimension of the polyhedron is obtained by subtracting
+ // the number of equalities from the space dimension.
+ // When counting constraints, for a correct reasoning, we have
+ // to disregard the low-level constraints (i.e., the positivity
+ // constraint and epsilon bounds).
+ const dimension_type space_dim = ph.space_dimension();
+ dimension_type ph_affine_dim = space_dim;
+ dimension_type ph_num_constraints = 0;
+ const Constraint_System& cs = ph.minimized_constraints();
+ // It is assumed that `ph' is a polyhedron containing the
+ // polyhedron described by `*this': hence, it cannot be empty.
+ PPL_ASSERT(!ph.marked_empty());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ ++ph_num_constraints;
+ if (i->is_equality())
+ --ph_affine_dim;
+ }
+ // TODO: this is an inefficient workaround.
+ // For NNC polyhedra, generators might be no longer up-to-date
+ // (and hence, neither minimized) due to the strong minimization
+ // process applied to constraints when constructing the certificate.
+ // We have to reinforce the (normal) minimization of the generator
+ // system. The future, lazy implementation of the strong minimization
+ // process will solve this problem.
+ if (!ph.is_necessarily_closed())
+ ph.minimize();
+
+ // If the affine dimension of `ph' is increasing, the chain is stabilizing.
+ if (ph_affine_dim > affine_dim)
+ return 1;
+
+ // At this point the two polyhedra must have the same affine dimension.
+ PPL_ASSERT(ph_affine_dim == affine_dim);
+
+ // If the number of constraints of `ph' is decreasing, then the chain
+ // is stabilizing. If it is increasing, the chain is not stabilizing.
+ if (ph_num_constraints != num_constraints)
+ return (ph_num_constraints < num_constraints) ? 1 : -1;
+
+ // All components are equal.
+ return 0;
+}
+
diff --git a/src/H79_Certificate_defs.hh b/src/H79_Certificate_defs.hh
new file mode 100644
index 0000000..1cc6fe2
--- /dev/null
+++ b/src/H79_Certificate_defs.hh
@@ -0,0 +1,98 @@
+/* H79_Certificate class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_H79_Certificate_defs_hh
+#define PPL_H79_Certificate_defs_hh 1
+
+#include "H79_Certificate_types.hh"
+#include "Polyhedron_types.hh"
+#include "globals_types.hh"
+#include "assert.hh"
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+ \note
+ The convergence of the H79 widening can also be certified by
+ BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+ //! Default constructor.
+ H79_Certificate();
+
+ //! Constructor: computes the certificate for \p ph.
+ template <typename PH>
+ H79_Certificate(const PH& ph);
+
+ //! Constructor: computes the certificate for \p ph.
+ H79_Certificate(const Polyhedron& ph);
+
+ //! Copy constructor.
+ H79_Certificate(const H79_Certificate& y);
+
+ //! Destructor.
+ ~H79_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+
+ Compares \p *this with \p y, using a total ordering which is a
+ refinement of the limited growth ordering relation for the
+ H79 widening.
+ */
+ int compare(const H79_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ template <typename PH>
+ int compare(const PH& ph) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ int compare(const Polyhedron& ph) const;
+
+ //! A total ordering on H79 certificates.
+ /*! \ingroup PPL_CXX_interface
+ This binary predicate defines a total ordering on H79 certificates
+ which is used when storing information about sets of polyhedra.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const H79_Certificate& x,
+ const H79_Certificate& y) const;
+ };
+
+private:
+ //! Affine dimension of the polyhedron.
+ dimension_type affine_dim;
+ //! Cardinality of a non-redundant constraint system for the polyhedron.
+ dimension_type num_constraints;
+};
+
+#include "H79_Certificate_inlines.hh"
+
+#endif // !defined(PPL_H79_Certificate_defs_hh)
diff --git a/src/H79_Certificate_inlines.hh b/src/H79_Certificate_inlines.hh
new file mode 100644
index 0000000..0f94d8f
--- /dev/null
+++ b/src/H79_Certificate_inlines.hh
@@ -0,0 +1,71 @@
+/* H79_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_H79_Certificate_inlines_hh
+#define PPL_H79_Certificate_inlines_hh 1
+
+#include "Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+ : affine_dim(0), num_constraints(0) {
+ // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+ : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+ const H79_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+ : affine_dim(0), num_constraints(0) {
+ H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+ affine_dim = cert.affine_dim;
+ num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+ return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_inlines_hh)
diff --git a/src/H79_Certificate_types.hh b/src/H79_Certificate_types.hh
new file mode 100644
index 0000000..7da155b
--- /dev/null
+++ b/src/H79_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_H79_Certificate_types_hh
+#define PPL_H79_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_types_hh)
diff --git a/src/Handler_defs.hh b/src/Handler_defs.hh
new file mode 100644
index 0000000..ca2f6fd
--- /dev/null
+++ b/src/Handler_defs.hh
@@ -0,0 +1,96 @@
+/* Handler and derived classes' declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Handler_defs_hh
+#define PPL_Handler_defs_hh 1
+
+#include "Handler_types.hh"
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler {
+public:
+ //! Does the job.
+ virtual void act() const = 0;
+
+ //! Virtual destructor.
+ virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+ The template class <CODE>Handler_Flag\<Flag_Base, Flag\></CODE>
+ is an handler whose job is to install a flag onto an <EM>holder</EM>
+ for the flag.
+ The flag is of type \p Flag and the holder is a (volatile) pointer
+ to \p Flag_Base. Installing the flag onto the holder means making
+ the holder point to the flag, so that it must be possible to assign
+ a value of type <CODE>Flag*</CODE> to an entity of type
+ <CODE>Flag_Base*</CODE>.
+ The class \p Flag must provide the method
+
+ \code
+ int priority() const
+ \endcode
+ returning an integer priority associated to the flag.
+
+ The handler will install its flag onto the holder only if the holder
+ is empty, namely, it is the null pointer, or if the holder holds a
+ flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Flag
+ : public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+ /*! \brief
+ Does its job: installs the flag onto the holder, if a flag with
+ an higher priority has not already been installed.
+ */
+ virtual void act() const;
+
+private:
+ // declare holder as reference to volatile pointer to const Flag_Base
+ const Flag_Base* volatile& h;
+ Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Function
+ : public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Function(void (* const function)());
+
+ //! Does its job: calls the embedded function.
+ virtual void act() const;
+
+private:
+ //! Pointer to the embedded function.
+ void (* const f)();
+};
+
+#include "Handler_inlines.hh"
+
+#endif // !defined(PPL_Handler_defs_hh)
diff --git a/src/Handler_inlines.hh b/src/Handler_inlines.hh
new file mode 100644
index 0000000..00fa0c1
--- /dev/null
+++ b/src/Handler_inlines.hh
@@ -0,0 +1,66 @@
+/* Handler and derived classes' implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Handler_inlines_hh
+#define PPL_Handler_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+ Flag& flag)
+ : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+ if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+ h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (* const function)())
+ : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+ (*f)();
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Handler_inlines_hh)
diff --git a/src/Handler_types.hh b/src/Handler_types.hh
new file mode 100644
index 0000000..9f842ab
--- /dev/null
+++ b/src/Handler_types.hh
@@ -0,0 +1,35 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Handler_types_hh
+#define PPL_Handler_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Handler_types_hh)
diff --git a/src/Has_Assign_Or_Swap.hh b/src/Has_Assign_Or_Swap.hh
new file mode 100644
index 0000000..55945ed
--- /dev/null
+++ b/src/Has_Assign_Or_Swap.hh
@@ -0,0 +1,54 @@
+/* Has_Assign_Or_Swap classes declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Has_Assign_Or_Swap_hh
+#define PPL_Has_Assign_Or_Swap_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+ typename Enable_If_Is<void (T::*)(T& x),
+ &T::assign_or_swap>::type>
+ : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Has_Assign_Or_Swap_hh)
diff --git a/src/Init.cc b/src/Init.cc
new file mode 100644
index 0000000..cef1af6
--- /dev/null
+++ b/src/Init.cc
@@ -0,0 +1,219 @@
+/* Init class implementation (non-inline functions and static variables).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Init_defs.hh"
+#include "Variable_defs.hh"
+#include "fpu_defs.hh"
+#include "Rounding_Dir_defs.hh"
+#include "checked_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Generator_System_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Watchdog_defs.hh"
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned int PPL::Init::count = 0;
+
+PPL::fpu_rounding_direction_type PPL::Init::old_rounding_direction;
+
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void)
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+ __attribute__((weak));
+
+void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#else
+ ;
+#endif
+
+#if PPL_CAN_CONTROL_FPU \
+ && defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+namespace {
+
+ float nf1 = -3, pf1 = 3, f2 = 5;
+ double nd1 = -7, pd1 = 7, d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+ float nf[2], pf[2];
+ double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+ int r = 0;
+ if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+ r |= 1;
+ if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+ r |= 2;
+ if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+ r |= 4;
+ return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+ return fesetround(rounding_mode);
+}
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+} // Implementation
+
+} // Parma_Polyhedra_Library
+
+namespace {
+
+int
+ppl_test_rounding() {
+ if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+ return 255;
+
+ nf[0] = nf1 / f2;
+ nd[0] = nd1 / d2;
+ nl[0] = nl1 / l2;
+ pf[0] = pf1 / f2;
+ pd[0] = pd1 / d2;
+ pl[0] = pl1 / l2;
+
+ if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+ return 255;
+
+ nf[1] = nf1 / f2;
+ nd[1] = nd1 / d2;
+ nl[1] = nl1 / l2;
+ pf[1] = pf1 / f2;
+ pd[1] = pd1 / d2;
+ pl[1] = pl1 / l2;
+
+ return (*ppl_check_function_p)();
+}
+
+} // namespace
+
+#endif // PPL_CAN_CONTROL_FPU
+ // && defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+PPL::Init::Init() {
+ // Only when the first Init object is constructed...
+ if (count++ == 0) {
+ // ... the GMP memory allocation functions are set, ...
+ ppl_set_GMP_memory_allocation_functions();
+ // ... the default output function for Variable objects is set, ...
+ Variable::set_output_function(&Variable::default_output_function);
+ // ... the Coefficient constants are initialized, ...
+ Coefficient_constants_initialize();
+ // ... the Linear_Expression class is initialized, ...
+ Linear_Expression::initialize();
+ // ... the Constraint, Generator, Congruence, Grid_Generator,
+ // Constraint_System, Generator_System, Congruence_System,
+ // Grid_Generator_System and Polyhedron classes are initialized, ...
+ Constraint::initialize();
+ Generator::initialize();
+ Congruence::initialize();
+ Grid_Generator::initialize();
+ Constraint_System::initialize();
+ Generator_System::initialize();
+ Congruence_System::initialize();
+ Grid_Generator_System::initialize();
+ Polyhedron::initialize();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+ // ... the Watchdog subsystem is initialized, ...
+ Watchdog::Watchdog::initialize();
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+#if PPL_CAN_CONTROL_FPU
+
+ // ... and the FPU rounding direction is set.
+ fpu_initialize_control_functions();
+ old_rounding_direction = fpu_get_rounding_direction();
+ fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+
+#if defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+ if (ppl_test_rounding() != 0)
+ throw std::logic_error("PPL configuration error:"
+ " PPL_ARM_CAN_CONTROL_FPU evaluates to true,"
+ " but rounding does not work.");
+#endif // defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+#endif // PPL_CAN_CONTROL_FPU
+
+ // The default is chosen to have a precision greater than most
+ // precise IEC 559 floating point (112 bits of mantissa).
+ set_irrational_precision(DEFAULT_IRRATIONAL_PRECISION);
+ }
+}
+
+PPL::Init::~Init() {
+ // Only when the last Init object is destroyed...
+ if (--count == 0) {
+#if PPL_CAN_CONTROL_FPU
+ // ... the FPU rounding direction is restored, ...
+ fpu_set_rounding_direction(old_rounding_direction);
+#endif
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+ // ... the Watchdog subsystem is finalized, ...
+ Watchdog::Watchdog::finalize();
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+ // ... the Polyhedron, Grid_Generator_System, Congruence_System,
+ // Generator_System, Constraint_System, Grid_Generator,
+ // Congruence, Generator and Constraint classes are finalized
+ // IN THAT ORDER, ...
+ Polyhedron::finalize();
+ Grid_Generator_System::finalize();
+ Congruence_System::finalize();
+ Generator_System::finalize();
+ Constraint_System::finalize();
+ Grid_Generator::finalize();
+ Congruence::finalize();
+ Generator::finalize();
+ Constraint::finalize();
+ // ... the Linear_Expression class is finalized, ...
+ Linear_Expression::finalize();
+ // ... and the Coefficient constants are finalized.
+ Coefficient_constants_finalize();
+ }
+}
diff --git a/src/Init_defs.hh b/src/Init_defs.hh
new file mode 100644
index 0000000..80923e8
--- /dev/null
+++ b/src/Init_defs.hh
@@ -0,0 +1,100 @@
+/* Init class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Init_defs_hh
+#define PPL_Init_defs_hh 1
+
+#include "Init_types.hh"
+#include "fpu_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has been
+ previously called.
+*/
+void set_rounding_for_PPL();
+
+/*! \brief
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+
+ This is important if the application uses floating-point computations
+ outside the PPL. It is crucial when the application uses functions
+ from a mathematical library that are not guaranteed to work correctly
+ under all rounding modes.
+
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+ <EM>Nifty Counter</EM> initialization class,
+ ensuring that the library is initialized only once
+ and before its first use.
+ A count of the number of translation units using the library
+ is maintained. A static object of Init type will be declared
+ by each translation unit using the library. As a result,
+ only one of them will initialize and properly finalize
+ the library.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Init {
+public:
+ //! Initializes the PPL.
+ Init();
+
+ //! Finalizes the PPL.
+ ~Init();
+
+private:
+ /*! \brief
+ Default precision parameter used for irrational calculations.
+
+ The default is chosen to have a precision greater than most
+ precise IEC 559 floating point (112 bits of mantissa).
+ */
+ static const unsigned DEFAULT_IRRATIONAL_PRECISION = 128U;
+
+ //! Count the number of objects created.
+ static unsigned int count;
+ static fpu_rounding_direction_type old_rounding_direction;
+
+ friend void set_rounding_for_PPL();
+ friend void restore_pre_PPL_rounding();
+};
+
+#include "Init_inlines.hh"
+
+
+#endif // !defined(PPL_Init_defs_hh)
diff --git a/src/Init_inlines.hh b/src/Init_inlines.hh
new file mode 100644
index 0000000..124a03e
--- /dev/null
+++ b/src/Init_inlines.hh
@@ -0,0 +1,48 @@
+/* Init class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Init_inlines_hh
+#define PPL_Init_inlines_hh 1
+
+#include "fpu_defs.hh"
+#include "Rounding_Dir_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+ fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
+
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+ fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_inlines_hh)
diff --git a/src/Init_types.hh b/src/Init_types.hh
new file mode 100644
index 0000000..410bc01
--- /dev/null
+++ b/src/Init_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Init_types_hh
+#define PPL_Init_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_types_hh)
diff --git a/src/Integer_Interval.hh b/src/Integer_Interval.hh
new file mode 100644
index 0000000..1f873ed
--- /dev/null
+++ b/src/Integer_Interval.hh
@@ -0,0 +1,53 @@
+/* Integer_Interval class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Integer_Interval_hh
+#define PPL_Integer_Interval_hh 1
+
+#include "Interval_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Integer_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int, Integer_Interval_Info_Policy> Integer_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with integral, necessarily closed boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpz_class, Integer_Interval_Info> Integer_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Integer_Interval_hh)
diff --git a/src/Interval_Info_defs.hh b/src/Interval_Info_defs.hh
new file mode 100644
index 0000000..235b35b
--- /dev/null
+++ b/src/Interval_Info_defs.hh
@@ -0,0 +1,285 @@
+/* Interval_Info class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_Info_defs_hh
+#define PPL_Interval_Info_defs_hh 1
+
+#include "Boundary_defs.hh"
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+ enum Type {
+ CARDINALITY_0_,
+ CARDINALITY_1_,
+ CARDINALITY_IS_
+ };
+ typedef bool Value;
+ static const Value default_value = true;
+ static const Value unsupported_value = false;
+ Property(Type t)
+ : type(t) {
+ }
+ Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+ bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+ bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+ if (value)
+ bits |= static_cast<T>(1) << bit;
+ else
+ reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+ return (bits & (static_cast<T>(1) << bit)) != 0;
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+ bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+ bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+ return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+ const_bool_nodef(may_be_empty, Policy::may_be_empty);
+ const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+ const_bool_nodef(check_inexact, Policy::check_inexact);
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, false);
+ const_bool_nodef(cache_singleton, false);
+ Interval_Info_Null() {
+ }
+ void clear() {
+ }
+ void clear_boundary_properties(Boundary_Type) {
+ }
+
+ template <typename Property>
+ void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+ }
+ template <typename Property>
+ typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+ return Property::unsupported_value;
+ }
+ template <typename Property>
+ void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+ }
+ template <typename Property>
+ typename Property::Value get_interval_property(const Property&) const {
+ return Property::unsupported_value;
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval_Info_Null& y);
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+ const_bool_nodef(store_open, true);
+ Interval_Info_Null_Open(bool o)
+ : open(o) {
+ }
+ bool get_boundary_property(Boundary_Type,
+ const Boundary_NS::Property& p) const {
+ if (p.type == Boundary_NS::Property::OPEN_)
+ return open;
+ else
+ return Boundary_NS::Property::unsupported_value;
+ }
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+private:
+ bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+ const_bool_nodef(may_be_empty, Policy::may_be_empty);
+ const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+ const_bool_nodef(check_inexact, Policy::check_inexact);
+ const_bool_nodef(store_special, Policy::store_special);
+ const_bool_nodef(store_open, Policy::store_open);
+ const_bool_nodef(cache_empty, Policy::cache_empty);
+ const_bool_nodef(cache_singleton, Policy::cache_singleton);
+ const_int_nodef(lower_special_bit, Policy::next_bit);
+ const_int_nodef(lower_open_bit, lower_special_bit + (store_special ? 1 : 0));
+ const_int_nodef(upper_special_bit, lower_open_bit + (store_open ? 1 : 0));
+ const_int_nodef(upper_open_bit, upper_special_bit + (store_special ? 1 : 0));
+ const_int_nodef(cardinality_is_bit, upper_open_bit + (store_open ? 1 : 0));
+ const_int_nodef(cardinality_0_bit, cardinality_is_bit
+ + ((cache_empty || cache_singleton) ? 1 : 0));
+ const_int_nodef(cardinality_1_bit, cardinality_0_bit + (cache_empty ? 1 : 0));
+ const_int_nodef(next_bit, cardinality_1_bit + (cache_singleton ? 1 : 0));
+
+ Interval_Info_Bitset() {
+ // FIXME: would we have speed benefits with uninitialized info?
+ // (Dirty_Temp)
+ clear();
+ }
+
+ void clear() {
+ reset_bits(bitset);
+ }
+ void clear_boundary_properties(Boundary_Type t) {
+ set_boundary_property(t, SPECIAL, false);
+ set_boundary_property(t, OPEN, false);
+ }
+ void set_boundary_property(Boundary_Type t,
+ const Boundary_NS::Property& p,
+ bool value = true) {
+ switch (p.type) {
+ case Boundary_NS::Property::SPECIAL_:
+ if (store_special) {
+ if (t == LOWER)
+ set_bit(bitset, lower_special_bit, value);
+ else
+ set_bit(bitset, upper_special_bit, value);
+ }
+ break;
+ case Boundary_NS::Property::OPEN_:
+ if (store_open) {
+ if (t == LOWER)
+ set_bit(bitset, lower_open_bit, value);
+ else
+ set_bit(bitset, upper_open_bit, value);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+ switch (p.type) {
+ case Boundary_NS::Property::SPECIAL_:
+ if (!store_special)
+ return false;
+ if (t == LOWER)
+ return get_bit(bitset, lower_special_bit);
+ else
+ return get_bit(bitset, upper_special_bit);
+ case Boundary_NS::Property::OPEN_:
+ if (!store_open)
+ return false;
+ else if (t == LOWER)
+ return get_bit(bitset, lower_open_bit);
+ else
+ return get_bit(bitset, upper_open_bit);
+ default:
+ return false;
+ }
+ }
+ void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+ switch (p.type) {
+ case Interval_NS::Property::CARDINALITY_0_:
+ if (cache_empty)
+ set_bit(bitset, cardinality_0_bit, value);
+ break;
+ case Interval_NS::Property::CARDINALITY_1_:
+ if (cache_singleton)
+ set_bit(bitset, cardinality_1_bit, value);
+ break;
+ case Interval_NS::Property::CARDINALITY_IS_:
+ if (cache_empty || cache_singleton)
+ set_bit(bitset, cardinality_is_bit, value);
+ break;
+ default:
+ break;
+ }
+ }
+ bool get_interval_property(Interval_NS::Property p) const {
+ switch (p.type) {
+ case Interval_NS::Property::CARDINALITY_0_:
+ return cache_empty && get_bit(bitset, cardinality_0_bit);
+ case Interval_NS::Property::CARDINALITY_1_:
+ return cache_singleton && get_bit(bitset, cardinality_1_bit);
+ case Interval_NS::Property::CARDINALITY_IS_:
+ return (cache_empty || cache_singleton)
+ && get_bit(bitset, cardinality_is_bit);
+ default:
+ return false;
+ }
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval_Info_Bitset& y);
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+protected:
+ T bitset;
+};
+
+}
+
+#include "Interval_Info_inlines.hh"
+
+#endif // !defined(PPL_Interval_Info_defs_hh)
diff --git a/src/Interval_Info_inlines.hh b/src/Interval_Info_inlines.hh
new file mode 100644
index 0000000..e93173d
--- /dev/null
+++ b/src/Interval_Info_inlines.hh
@@ -0,0 +1,116 @@
+/* Interval_Info class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_Info_inlines_hh
+#define PPL_Interval_Info_inlines_hh 1
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::m_swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream&) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream&) {
+ return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+ s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str))
+ return false;
+ if (str == "open") {
+ open = true;
+ return true;
+ }
+ if (str == "closed") {
+ open = false;
+ return true;
+ }
+ return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::m_swap(Interval_Info_Bitset<T, Policy>& y) {
+ using std::swap;
+ swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ s << bitset;
+ s.flags(old_flags);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ s >> bitset;
+ s.flags(old_flags);
+ return !s.fail();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Interval_Info_Null<Policy>& x, Interval_Info_Null<Policy>& y) {
+ x.m_swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Interval_Info_Bitset<T, Policy>& x, Interval_Info_Bitset<T, Policy>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_Info_inlines_hh)
diff --git a/src/Interval_Info_types.hh b/src/Interval_Info_types.hh
new file mode 100644
index 0000000..ba1e6fb
--- /dev/null
+++ b/src/Interval_Info_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Interval_Info_types_hh
+#define PPL_Interval_Info_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_Info_types_hh)
diff --git a/src/Interval_defs.hh b/src/Interval_defs.hh
new file mode 100644
index 0000000..f953ac9
--- /dev/null
+++ b/src/Interval_defs.hh
@@ -0,0 +1,763 @@
+/* Declarations for the Interval class and its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_defs_hh
+#define PPL_Interval_defs_hh 1
+
+#include "globals_defs.hh"
+#include "meta_programming.hh"
+#include "assign_or_swap.hh"
+#include "intervals_defs.hh"
+#include "Interval_types.hh"
+#include "Interval_Info_defs.hh"
+#include <iosfwd>
+
+// Temporary!
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+enum Ternary { T_YES, T_NO, T_MAYBE };
+
+inline I_Result
+combine(Result l, Result u) {
+ const unsigned res
+ = static_cast<unsigned>(l) | (static_cast<unsigned>(u) << 6);
+ return static_cast<I_Result>(res);
+}
+
+struct Interval_Base {
+};
+
+using namespace Boundary_NS;
+using namespace Interval_NS;
+
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
+
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
+
+//! A generic, not necessarily closed, possibly restricted interval.
+/*! \ingroup PPL_CXX_interface
+ The class template type parameter \p Boundary represents the type
+ of the interval boundaries, and can be chosen, among other possibilities,
+ within one of the following number families:
+
+ - a bounded precision native integer type (that is,
+ from <CODE>signed char</CODE> to <CODE>long long</CODE>
+ and from <CODE>int8_t</CODE> to <CODE>int64_t</CODE>);
+ - a bounded precision floating point type (<CODE>float</CODE>,
+ <CODE>double</CODE> or <CODE>long double</CODE>);
+ - an unbounded integer or rational type, as provided by the C++ interface
+ of GMP (<CODE>mpz_class</CODE> or <CODE>mpq_class</CODE>).
+
+ The class template type parameter \p Info allows to control a number
+ of features of the class, among which:
+
+ - the ability to support open as well as closed boundaries;
+ - the ability to represent empty intervals in addition to nonempty ones;
+ - the ability to represent intervals of extended number families
+ that contain positive and negative infinities;
+*/
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+ PPL_COMPILE_TIME_CHECK(!Info::store_special
+ || !std::numeric_limits<Boundary>::has_infinity,
+ "store_special is meaningless"
+ " when boundary type may contains infinity");
+ Info& w_info() const {
+ return const_cast<Interval&>(*this);
+ }
+
+public:
+ typedef Boundary boundary_type;
+ typedef Info info_type;
+
+ typedef Interval_NS::Property Property;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator=(const T& x) {
+ assign(x);
+ return *this;
+ }
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator+=(const T& x) {
+ add_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator-=(const T& x) {
+ sub_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator*=(const T& x) {
+ mul_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator/=(const T& x) {
+ div_assign(*this, x);
+ return *this;
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval& y);
+
+ Info& info() {
+ return *this;
+ }
+
+ const Info& info() const {
+ return *this;
+ }
+
+ Boundary& lower() {
+ return lower_;
+ }
+
+ const Boundary& lower() const {
+ return lower_;
+ }
+
+ Boundary& upper() {
+ return upper_;
+ }
+
+ const Boundary& upper() const {
+ return upper_;
+ }
+
+ I_Constraint<boundary_type> lower_constraint() const {
+ PPL_ASSERT(!is_empty());
+ if (info().get_boundary_property(LOWER, SPECIAL))
+ return I_Constraint<boundary_type>();
+ return i_constraint(lower_is_open() ? GREATER_THAN : GREATER_OR_EQUAL,
+ lower(), true);
+ }
+ I_Constraint<boundary_type> upper_constraint() const {
+ PPL_ASSERT(!is_empty());
+ if (info().get_boundary_property(UPPER, SPECIAL))
+ return I_Constraint<boundary_type>();
+ return i_constraint(upper_is_open() ? LESS_THAN : LESS_OR_EQUAL,
+ upper(), true);
+ }
+
+ bool is_empty() const {
+ return lt(UPPER, upper(), info(), LOWER, lower(), info());
+ }
+
+ bool check_empty(I_Result r) const {
+ return (r & I_ANY) == I_EMPTY
+ || ((r & I_ANY) != I_NOT_EMPTY && is_empty());
+ }
+
+ bool is_singleton() const {
+ return eq(LOWER, lower(), info(), UPPER, upper(), info());
+ }
+
+ bool lower_is_open() const {
+ PPL_ASSERT(OK());
+ return is_open(LOWER, lower(), info());
+ }
+
+ bool upper_is_open() const {
+ PPL_ASSERT(OK());
+ return is_open(UPPER, upper(), info());
+ }
+
+ bool lower_is_boundary_infinity() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_boundary_infinity(LOWER, lower(), info());
+ }
+
+ bool upper_is_boundary_infinity() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_boundary_infinity(UPPER, upper(), info());
+ }
+
+ bool lower_is_domain_inf() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_domain_inf(LOWER, lower(), info());
+ }
+
+ bool upper_is_domain_sup() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_domain_sup(UPPER, upper(), info());
+ }
+
+ bool is_bounded() const {
+ PPL_ASSERT(OK());
+ return !lower_is_boundary_infinity() && !upper_is_boundary_infinity();
+ }
+
+ bool is_universe() const {
+ PPL_ASSERT(OK());
+ return lower_is_domain_inf() && upper_is_domain_sup();
+ }
+
+ I_Result lower_extend() {
+ info().clear_boundary_properties(LOWER);
+ set_unbounded(LOWER, lower(), info());
+ return I_ANY;
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ lower_extend(const C& c);
+
+ I_Result upper_extend() {
+ info().clear_boundary_properties(UPPER);
+ set_unbounded(UPPER, upper(), info());
+ return I_ANY;
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ upper_extend(const C& c);
+
+ I_Result build() {
+ return assign(UNIVERSE);
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ build(const C& c) {
+ Relation_Symbol rs;
+ switch (c.rel()) {
+ case V_LGE:
+ case V_GT_MINUS_INFINITY:
+ case V_LT_PLUS_INFINITY:
+ return assign(UNIVERSE);
+ default:
+ return assign(EMPTY);
+ case V_LT:
+ case V_LE:
+ case V_GT:
+ case V_GE:
+ case V_EQ:
+ case V_NE:
+ assign(UNIVERSE);
+ rs = static_cast<Relation_Symbol>(c.rel());
+ return refine_existential(rs, c.value());
+ }
+ }
+
+ template <typename C1, typename C2>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C1>::value
+ &&
+ Is_Same_Or_Derived<I_Constraint_Base, C2>::value,
+ I_Result>::type
+ build(const C1& c1, const C2& c2) {
+ switch (c1.rel()) {
+ case V_LGE:
+ return build(c2);
+ case V_NAN:
+ return assign(EMPTY);
+ default:
+ break;
+ }
+ switch (c2.rel()) {
+ case V_LGE:
+ return build(c1);
+ case V_NAN:
+ return assign(EMPTY);
+ default:
+ break;
+ }
+ build(c1);
+ const I_Result r = add_constraint(c2);
+ return r - (I_CHANGED | I_UNCHANGED);
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ add_constraint(const C& c) {
+ Interval x;
+ x.build(c);
+ return intersect_assign(x);
+ }
+
+ I_Result assign(Degenerate_Element e) {
+ I_Result r;
+ info().clear();
+ switch (e) {
+ case EMPTY:
+ lower_ = 1;
+ upper_ = 0;
+ r = I_EMPTY | I_EXACT;
+ break;
+ case UNIVERSE:
+ set_unbounded(LOWER, lower(), info());
+ set_unbounded(UPPER, upper(), info());
+ r = I_UNIVERSE | I_EXACT;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ r = I_EMPTY;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return r;
+ }
+
+ template <typename From>
+ typename Enable_If<Is_Special<From>::value, I_Result>::type
+ assign(const From&) {
+ info().clear();
+ Result rl;
+ Result ru;
+ switch (From::vclass) {
+ case VC_MINUS_INFINITY:
+ rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+ ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info());
+ break;
+ case VC_PLUS_INFINITY:
+ rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info());
+ ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+ break;
+ default:
+ PPL_UNREACHABLE;
+ rl = V_NAN;
+ ru = V_NAN;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+ }
+
+ I_Result set_infinities() {
+ info().clear();
+ Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+ Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+ }
+
+ static bool is_always_topologically_closed() {
+ return !Info::store_open;
+ }
+
+ bool is_topologically_closed() const {
+ PPL_ASSERT(OK());
+ return is_always_topologically_closed()
+ || is_empty()
+ || ((lower_is_boundary_infinity() || !lower_is_open())
+ && (upper_is_boundary_infinity() || !upper_is_open()));
+ }
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign() {
+ if (!Info::store_open || is_empty())
+ return;
+ if (lower_is_open() && !lower_is_boundary_infinity())
+ info().set_boundary_property(LOWER, OPEN, false);
+ if (upper_is_open() && !upper_is_boundary_infinity())
+ info().set_boundary_property(UPPER, OPEN, false);
+ }
+
+ void remove_inf() {
+ PPL_ASSERT(!is_empty());
+ if (!Info::store_open)
+ return;
+ info().set_boundary_property(LOWER, OPEN, true);
+ }
+
+ void remove_sup() {
+ PPL_ASSERT(!is_empty());
+ if (!Info::store_open)
+ return;
+ info().set_boundary_property(UPPER, OPEN, true);
+ }
+
+ int infinity_sign() const {
+ PPL_ASSERT(OK());
+ if (is_reverse_infinity(LOWER, lower(), info()))
+ return 1;
+ else if (is_reverse_infinity(UPPER, upper(), info()))
+ return -1;
+ else
+ return 0;
+ }
+
+ bool contains_integer_point() const {
+ PPL_ASSERT(OK());
+ if (is_empty())
+ return false;
+ if (!is_bounded())
+ return true;
+ Boundary l;
+ if (lower_is_open()) {
+ add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+ floor_assign_r(l, l, ROUND_DOWN);
+ }
+ else
+ ceil_assign_r(l, lower(), ROUND_DOWN);
+ Boundary u;
+ if (upper_is_open()) {
+ sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+ ceil_assign_r(u, u, ROUND_UP);
+ }
+ else
+ floor_assign_r(u, upper(), ROUND_UP);
+ return u >= l;
+ }
+
+ void drop_some_non_integer_points() {
+ if (is_empty())
+ return;
+ if (lower_is_open() && !lower_is_boundary_infinity()) {
+ add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN);
+ floor_assign_r(lower(), lower(), ROUND_DOWN);
+ info().set_boundary_property(LOWER, OPEN, false);
+ }
+ else
+ ceil_assign_r(lower(), lower(), ROUND_DOWN);
+ if (upper_is_open() && !upper_is_boundary_infinity()) {
+ sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP);
+ ceil_assign_r(upper(), upper(), ROUND_UP);
+ info().set_boundary_property(UPPER, OPEN, false);
+ }
+ else
+ floor_assign_r(upper(), upper(), ROUND_UP);
+ }
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+ wrap_assign(Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ const From& refinement) {
+ if (is_empty())
+ return I_EMPTY;
+ if (lower_is_boundary_infinity() || upper_is_boundary_infinity())
+ return assign(refinement);
+ PPL_DIRTY_TEMP(Boundary, u);
+ Result result = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
+ if (result_overflow(result) == 0 && u > lower())
+ return assign(refinement);
+ info().clear();
+ switch (r) {
+ case UNSIGNED:
+ umod_2exp_assign(LOWER, lower(), info(),
+ LOWER, lower(), info(), w);
+ umod_2exp_assign(UPPER, upper(), info(),
+ UPPER, upper(), info(), w);
+ break;
+ case SIGNED_2_COMPLEMENT:
+ smod_2exp_assign(LOWER, lower(), info(),
+ LOWER, lower(), info(), w);
+ smod_2exp_assign(UPPER, upper(), info(),
+ UPPER, upper(), info(), w);
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ if (le(LOWER, lower(), info(), UPPER, upper(), info()))
+ return intersect_assign(refinement);
+ PPL_DIRTY_TEMP(Interval, tmp);
+ tmp.info().clear();
+ Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
+ LOWER, lower(), info());
+ set_unbounded(UPPER, tmp.upper(), tmp.info());
+ tmp.intersect_assign(refinement);
+ lower_extend();
+ intersect_assign(refinement);
+ return join_assign(tmp);
+ }
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+ bool OK() const {
+ if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+ std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+ return false;
+ }
+
+ if (is_open(LOWER, lower(), info())) {
+ if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is +inf open.\n";
+#endif
+ }
+ }
+ else if (!Info::may_contain_infinity
+ && (is_minus_infinity(LOWER, lower(), info())
+ || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+ return false;
+ }
+ if (!info().get_boundary_property(LOWER, SPECIAL)) {
+ if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is not a number.\n";
+#endif
+ return false;
+ }
+ }
+
+ if (is_open(UPPER, upper(), info())) {
+ if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is -inf open.\n";
+#endif
+ }
+ }
+ else if (!Info::may_contain_infinity
+ && (is_minus_infinity(UPPER, upper(), info())
+ || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is unexpectedly infinity."
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!info().get_boundary_property(UPPER, SPECIAL)) {
+ if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is not a number.\n";
+#endif
+ return false;
+ }
+ }
+
+ // Everything OK.
+ return true;
+ }
+
+ Interval() {
+ }
+
+ template <typename T>
+ explicit Interval(const T& x) {
+ assign(x);
+ }
+
+ /*! \brief
+ Builds the smallest interval containing the number whose textual
+ representation is contained in \p s.
+ */
+ explicit Interval(const char* s);
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ contains(const T& y) const;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ strictly_contains(const T& y) const;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ is_disjoint_from(const T& y) const;
+
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ assign(const From& x);
+
+ template <typename Type>
+ typename Enable_If<Is_Singleton<Type>::value
+ || Is_Interval<Type>::value, bool>::type
+ can_be_exactly_joined_to(const Type& x) const;
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ join_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ join_assign(const From1& x, const From2& y);
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ intersect_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ intersect_assign(const From1& x, const From2& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest interval containing the set-theoretic
+ difference of \p *this and \p x.
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ difference_assign(const From& x);
+
+ /*! \brief
+ Assigns to \p *this the smallest interval containing the set-theoretic
+ difference of \p x and \p y.
+ */
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ difference_assign(const From1& x, const From2& y);
+
+ /*! \brief
+ Assigns to \p *this the largest interval contained in the set-theoretic
+ difference of \p *this and \p x.
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ lower_approximation_difference_assign(const From& x);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+
+ \return
+ \c false if and only if the meet of \p *this and \p y is empty.
+ */
+ template <typename From>
+ typename Enable_If<Is_Interval<From>::value, bool>::type
+ simplify_using_context_assign(const From& y);
+
+ /*! \brief
+ Assigns to \p *this an interval having empty intersection with \p y.
+ The assigned interval should be as large as possible.
+ */
+ template <typename From>
+ typename Enable_If<Is_Interval<From>::value, void>::type
+ empty_intersection_assign(const From& y);
+
+ /*! \brief
+ Refines \p to according to the existential relation \p rel with \p x.
+
+ The \p to interval is restricted to become, upon successful exit,
+ the smallest interval of its type that contains the set
+ \f[
+ \{\,
+ a \in \mathtt{to}
+ \mid
+ \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+ \,\}.
+ \f]
+ \return
+ ???
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ refine_existential(Relation_Symbol rel, const From& x);
+
+ /*! \brief
+ Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+ The \p to interval is restricted to become, upon successful exit,
+ the smallest interval of its type that contains the set
+ \f[
+ \{\,
+ a \in \mathtt{to}
+ \mid
+ \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+ \,\}.
+ \f]
+ \return
+ ???
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ refine_universal(Relation_Symbol rel, const From& x);
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ neg_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ add_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ sub_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ mul_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ div_assign(const From1& x, const From2& y);
+
+ template <typename From, typename Iterator>
+ typename Enable_If<Is_Interval<From>::value, void>::type
+ CC76_widening_assign(const From& y, Iterator first, Iterator last);
+
+private:
+ Boundary lower_;
+ Boundary upper_;
+};
+
+//! Swaps \p x with \p y.
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+void swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Interval_inlines.hh"
+#include "Interval_templates.hh"
+
+#endif // !defined(PPL_Interval_defs_hh)
diff --git a/src/Interval_inlines.hh b/src/Interval_inlines.hh
new file mode 100644
index 0000000..8ab37e4
--- /dev/null
+++ b/src/Interval_inlines.hh
@@ -0,0 +1,1160 @@
+/* Inline functions for the Interval class and its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_inlines_hh
+#define PPL_Interval_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+ return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+ + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::m_swap(Interval<Boundary, Info>& y) {
+ using std::swap;
+ swap(lower(), y.lower());
+ swap(upper(), y.upper());
+ swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+ return x.is_empty();
+}
+template <typename Boundary, typename Info>
+inline bool
+f_is_singleton(const Interval<Boundary, Info>& x) {
+ return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+infinity_sign(const Interval<Boundary, Info>& x) {
+ return x.infinity_sign();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+ return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+ return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+ return x.info();
+}
+
+struct Scalar_As_Interval_Policy {
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, true);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Null<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Info_Null_Open<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+ return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+ return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+ const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+ return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+ Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+ return Scalar_As_Interval_Info_Open(open);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+ return is_not_a_number(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+ return !f_is_empty(x);
+}
+
+} // namespace Interval_NS
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+ return is_singleton(x) && is_integer(f_lower(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+ if (f_info(x).may_be_empty)
+ return f_is_empty(x);
+ else {
+ PPL_ASSERT(!f_is_empty(x));
+ return false;
+ }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+ || Is_Interval<T1>::value)
+ && (Is_Singleton<T2>::value
+ || Is_Interval<T2>::value)
+ && (Is_Interval<T1>::value
+ || Is_Interval<T2>::value)),
+ bool>::type
+operator==(const T1& x, const T2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x))
+ return check_empty_arg(y);
+ else if (check_empty_arg(y))
+ return false;
+ return eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+ && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+ || Is_Interval<T1>::value)
+ && (Is_Singleton<T2>::value
+ || Is_Interval<T2>::value)
+ && (Is_Interval<T1>::value
+ || Is_Interval<T2>::value)),
+ bool>::type
+operator!=(const T1& x, const T2& y) {
+ return !(x == y);
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(y))
+ return true;
+ if (check_empty_arg(*this))
+ return false;
+ return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(y))
+ return !check_empty_arg(*this);
+ if (check_empty_arg(*this))
+ return false;
+ return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+ || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(*this) || check_empty_arg(y))
+ return true;
+ return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+ || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ const Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x));
+ const Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(*this))
+ return assign(x);
+ if (check_empty_arg(x))
+ return combine(V_EQ, V_EQ);
+ Result rl;
+ Result ru;
+ rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x))
+ return assign(y);
+ if (check_empty_arg(y))
+ return assign(x);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ rl = min_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ ru = max_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename Boundary, typename Info>
+template <typename Type>
+inline typename Enable_If<Is_Singleton<Type>::value
+ || Is_Interval<Type>::value, bool>::type
+Interval<Boundary, Info>::can_be_exactly_joined_to(const Type& x) const {
+ PPL_DIRTY_TEMP(Boundary, b);
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) {
+ b = lower();
+ return eq(LOWER, b, info(), UPPER, f_upper(x), f_info(x));
+ }
+ else if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) {
+ b = upper();
+ return eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x));
+ }
+ return true;
+}
+
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+ const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ max_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ min_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return I_NOT_EMPTY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))
+ || gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ Result rl = V_EQ;
+ Result ru = V_EQ;
+ if (nl) {
+ if (nu)
+ return assign(EMPTY);
+ else {
+ info().clear_boundary_properties(LOWER);
+ rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+ }
+ }
+ else if (nu) {
+ info().clear_boundary_properties(UPPER);
+ ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+ }
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+ const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y))
+ || gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+ return assign(x);
+ bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+ bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+ Result rl = V_EQ;
+ Result ru = V_EQ;
+ if (nl) {
+ if (nu)
+ return assign(EMPTY);
+ else {
+ rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ }
+ }
+ else if (nu) {
+ ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+ rl = Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x));
+ }
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ switch (rel) {
+ case LESS_THAN:
+ {
+ if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x), true);
+ return I_ANY;
+ }
+ case LESS_OR_EQUAL:
+ {
+ if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x));
+ return I_ANY;
+ }
+ case GREATER_THAN:
+ {
+ if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x), true);
+ return I_ANY;
+ }
+ case GREATER_OR_EQUAL:
+ {
+ if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x));
+ return I_ANY;
+ }
+ case EQUAL:
+ return intersect_assign(x);
+ case NOT_EQUAL:
+ {
+ if (!f_is_singleton(x))
+ return combine(V_EQ, V_EQ);
+ if (check_empty_arg(*this))
+ return I_EMPTY;
+ if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ remove_inf();
+ if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ remove_sup();
+ return I_ANY;
+ }
+ default:
+ PPL_UNREACHABLE;
+ return I_EMPTY;
+ }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+ const From& x) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return combine(V_EQ, V_EQ);
+ switch (rel) {
+ case LESS_THAN:
+ {
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+ LOWER, f_lower(x), SCALAR_INFO,
+ !is_open(LOWER, f_lower(x), f_info(x)));
+ PPL_USED(ru);
+ return I_ANY;
+ }
+ case LESS_OR_EQUAL:
+ {
+ if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+ LOWER, f_lower(x), SCALAR_INFO);
+ PPL_USED(ru);
+ return I_ANY;
+ }
+ case GREATER_THAN:
+ {
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+ UPPER, f_upper(x), SCALAR_INFO,
+ !is_open(UPPER, f_upper(x), f_info(x)));
+ PPL_USED(rl);
+ return I_ANY;
+ }
+ case GREATER_OR_EQUAL:
+ {
+ if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+ UPPER, f_upper(x), SCALAR_INFO);
+ PPL_USED(rl);
+ return I_ANY;
+ }
+ case EQUAL:
+ if (!f_is_singleton(x))
+ return assign(EMPTY);
+ return intersect_assign(x);
+ case NOT_EQUAL:
+ {
+ if (check_empty_arg(*this))
+ return I_EMPTY;
+ if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ remove_inf();
+ if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ remove_sup();
+ return I_ANY;
+ }
+ default:
+ PPL_UNREACHABLE;
+ return I_EMPTY;
+ }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+ ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) == -inf_sign)
+ return assign(EMPTY);
+ }
+ else
+ inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else if (inf_sign > 0)
+ return assign(PLUS_INFINITY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) == inf_sign)
+ return assign(EMPTY);
+ }
+ else
+ inf_sign = -Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else if (inf_sign > 0)
+ return assign(PLUS_INFINITY);
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+| * | yl > 0 | yu < 0 | yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0 |xl*yl,xu*yu|xu*yl,xl*yu| xu*yl,xu*yu |
++---------+-----------+-----------+-----------------+
+| xu < 0 |xl*yu,xu*yl|xu*yu,xl*yl| xl*yu,xl*yl |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+| | | |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+ int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+ int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+ int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ int ls;
+ int us;
+ if (inf_sign != 0) {
+ ls = yls;
+ us = yus;
+ goto inf;
+ }
+ else {
+ inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign != 0) {
+ ls = xls;
+ us = xus;
+ inf:
+ if (ls == 0 && us == 0)
+ return assign(EMPTY);
+ if (ls == -us)
+ return set_infinities();
+ if (ls < 0 || us < 0)
+ inf_sign = -inf_sign;
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else
+ return assign(PLUS_INFINITY);
+ }
+ }
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+
+ if (xls >= 0) {
+ if (yls >= 0) {
+ // 0 <= xl <= xu, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else if (yus <= 0) {
+ // 0 <= xl <= xu, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ // 0 <= xl <= xu, yl < 0 < yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ }
+ else if (xus <= 0) {
+ if (yls >= 0) {
+ // xl <= xu <= 0, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (yus <= 0) {
+ // xl <= xu <= 0, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else {
+ // xl <= xu <= 0, yl < 0 < yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ }
+ else if (yls >= 0) {
+ // xl < 0 < xu, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else if (yus <= 0) {
+ // xl < 0 < xu, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else {
+ // xl < 0 < xu, yl < 0 < yu
+ PPL_DIRTY_TEMP(To_Boundary, tmp);
+ PPL_DIRTY_TEMP(To_Info, tmp_info);
+ tmp_info.clear();
+ Result tmp_r;
+ tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+ UPPER, f_upper(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+ to_lower = tmp;
+ rl = tmp_r;
+ }
+ tmp_info.clear();
+ tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+ upper() = tmp;
+ ru = tmp_r;
+ }
+ }
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+| / | yu < 0 | yl > 0 |
++-----------+-----------+-----------+
+| xu<=0 |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+| xl>=0 |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+ int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+ if (yls == 0 && yus == 0)
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) != 0)
+ return assign(EMPTY);
+ if (yls == -yus)
+ return set_infinities();
+ if (yls < 0 || yus < 0)
+ inf_sign = -inf_sign;
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else
+ return assign(PLUS_INFINITY);
+ }
+ int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+ int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ if (yls >= 0) {
+ if (xls >= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (xus <= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ }
+ else if (yus <= 0) {
+ if (xls >= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (xus <= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ }
+ else {
+ return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+ }
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+ if (check_empty_arg(x))
+ return os << "[]";
+ if (x.is_singleton()) {
+ output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+ return os;
+ }
+ os << (x.lower_is_open() ? "(" : "[");
+ if (x.info().get_boundary_property(LOWER, SPECIAL))
+ os << "-inf";
+ else
+ output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+ os << ", ";
+ if (x.info().get_boundary_property(UPPER, SPECIAL))
+ os << "+inf";
+ else
+ output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+ os << (x.upper_is_open() ? ")" : "]");
+ return os;
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+ using Parma_Polyhedra_Library::ascii_dump;
+ s << "info ";
+ info().ascii_dump(s);
+ s << " lower ";
+ ascii_dump(s, lower());
+ s << " upper ";
+ ascii_dump(s, upper());
+ s << '\n';
+}
+
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+ using Parma_Polyhedra_Library::ascii_load;
+ std::string str;
+ if (!(s >> str) || str != "info")
+ return false;
+ if (!info().ascii_load(s))
+ return false;
+ if (!(s >> str) || str != "lower")
+ return false;
+ if (!ascii_load(s, lower()))
+ return false;
+ if (!(s >> str) || str != "upper")
+ return false;
+ if (!ascii_load(s, upper()))
+ return false;
+ PPL_ASSERT(OK());
+ return true;
+}
+
+/*! \brief
+ Helper class to select the appropriate numerical type to perform
+ boundary computations so as to reduce the chances of overflow without
+ incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+ typedef Interval_Boundary_Type type;
+};
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+struct Select_Temp_Boundary_Type<float> {
+ typedef double type;
+};
+#endif
+
+template <>
+struct Select_Temp_Boundary_Type<char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+ typedef signed long long type;
+};
+
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_inlines_hh)
diff --git a/src/Interval_templates.hh b/src/Interval_templates.hh
new file mode 100644
index 0000000..fca1b17
--- /dev/null
+++ b/src/Interval_templates.hh
@@ -0,0 +1,402 @@
+/* Interval class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_templates_hh
+#define PPL_Interval_templates_hh 1
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::lower_extend(const C& c) {
+ PPL_ASSERT(OK());
+ bool open;
+ switch (c.rel()) {
+ case V_LGE:
+ return lower_extend();
+ case V_NAN:
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ case V_GT:
+ open = true;
+ break;
+ case V_GE: // Fall through.
+ case V_EQ:
+ open = false;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ }
+ min_assign(LOWER, lower(), info(), LOWER, c.value(), f_info(c.value(), open));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::upper_extend(const C& c) {
+ PPL_ASSERT(OK());
+ bool open;
+ switch (c.rel()) {
+ case V_LGE:
+ return lower_extend();
+ case V_NAN:
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ case V_LT:
+ open = true;
+ break;
+ case V_LE: // Fall through.
+ case V_EQ:
+ open = false;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ }
+ max_assign(UPPER, upper(), info(), UPPER, c.value(), f_info(c.value(), open));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+ Iterator first,
+ Iterator last) {
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_ASSERT(contains(y));
+ Interval<Boundary, Info>& x = *this;
+
+ // Upper bound.
+ if (!x.upper_is_boundary_infinity()) {
+ Boundary& x_ub = x.upper();
+ const Boundary& y_ub = y.upper();
+ PPL_ASSERT(!y.upper_is_boundary_infinity() && y_ub <= x_ub);
+ if (y_ub < x_ub) {
+ Iterator k = std::lower_bound(first, last, x_ub);
+ if (k != last) {
+ if (x_ub < *k)
+ x_ub = *k;
+ }
+ else
+ x.upper_extend();
+ }
+ }
+
+ // Lower bound.
+ if (!x.lower_is_boundary_infinity()) {
+ Boundary& x_lb = x.lower();
+ const Boundary& y_lb = y.lower();
+ PPL_ASSERT(!y.lower_is_boundary_infinity() && y_lb >= x_lb);
+ if (y_lb > x_lb) {
+ Iterator k = std::lower_bound(first, last, x_lb);
+ if (k != last) {
+ if (x_lb < *k) {
+ if (k != first)
+ x_lb = *--k;
+ else
+ x.lower_extend();
+ }
+ }
+ else {
+ if (k != first)
+ x_lb = *--k;
+ else
+ x.lower_extend();
+ }
+ }
+ }
+}
+
+template <typename Boundary, typename Info>
+Interval<Boundary, Info>::Interval(const char* s) {
+ // Get the lower bound.
+ Boundary lower_bound;
+ Result lower_r = assign_r(lower_bound, s, ROUND_DOWN);
+ if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN) {
+ throw std::invalid_argument("PPL::Interval(const char* s)"
+ " with s invalid");
+ }
+ lower_r = result_relation_class(lower_r);
+
+ // Get the upper bound.
+ Boundary upper_bound;
+ Result upper_r = assign_r(upper_bound, s, ROUND_UP);
+ PPL_ASSERT(upper_r != V_CVT_STR_UNK && upper_r != V_NAN);
+ upper_r = result_relation_class(upper_r);
+
+ // Build the interval.
+ bool lower_open = false;
+ bool upper_open = false;
+ bool lower_boundary_infinity = false;
+ bool upper_boundary_infinity = false;
+ switch (lower_r) {
+ case V_EQ: // Fall through.
+ case V_GE:
+ break;
+ case V_GT:
+ lower_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ lower_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ lower_boundary_infinity = true;
+ break;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+ assign(UNIVERSE);
+ else
+ assign(EMPTY);
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ switch (upper_r) {
+ case V_EQ: // Fall through.
+ case V_LE:
+ break;
+ case V_LT:
+ upper_open = true;
+ break;
+ case V_EQ_MINUS_INFINITY: // Fall through.
+ case V_GT_MINUS_INFINITY:
+ if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+ assign(UNIVERSE);
+ else
+ assign(EMPTY);
+ break;
+ case V_LT_PLUS_INFINITY:
+ upper_open = true;
+ // Fall through.
+ case V_EQ_PLUS_INFINITY:
+ upper_boundary_infinity = true;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ if (!lower_boundary_infinity
+ && !upper_boundary_infinity
+ && (lower_bound > upper_bound
+ || (lower_open && lower_bound == upper_bound)))
+ assign(EMPTY);
+ else {
+ if (lower_boundary_infinity)
+ set_minus_infinity(LOWER, lower(), info(), lower_open);
+ else
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, lower_bound, SCALAR_INFO, lower_open);
+ if (upper_boundary_infinity)
+ set_plus_infinity(UPPER, upper(), info(), upper_open);
+ else
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, upper_bound, SCALAR_INFO, upper_open);
+ }
+}
+
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+ Boundary lower_bound;
+ Boundary upper_bound;
+ bool lower_boundary_infinity = false;
+ bool upper_boundary_infinity = false;
+ bool lower_open = false;
+ bool upper_open = false;
+ Result lower_r;
+ Result upper_r;
+
+ // Eat leading white space.
+ char c;
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+
+ // Get the opening parenthesis and handle the empty interval case.
+ if (c == '(')
+ lower_open = true;
+ else if (c == '[') {
+ if (!is.get(c))
+ goto fail;
+ if (c == ']') {
+ // Empty interval.
+ x.assign(EMPTY);
+ return is;
+ }
+ else
+ is.unget();
+ }
+ else
+ goto unexpected;
+
+ // Get the lower bound.
+ lower_r = input(lower_bound, is, ROUND_DOWN);
+ if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN)
+ goto fail;
+ lower_r = result_relation_class(lower_r);
+
+ // Match the comma separating the lower and upper bounds.
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+ if (c != ',')
+ goto unexpected;
+
+ // Get the upper bound.
+ upper_r = input(upper_bound, is, ROUND_UP);
+ if (upper_r == V_CVT_STR_UNK || upper_r == V_NAN)
+ goto fail;
+ upper_r = result_relation_class(upper_r);
+
+ // Get the closing parenthesis.
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+ if (c == ')')
+ upper_open = true;
+ else if (c != ']') {
+ unexpected:
+ is.unget();
+ fail:
+ is.setstate(std::ios::failbit);
+ return is;
+ }
+
+ // Build interval.
+ switch (lower_r) {
+ case V_EQ: // Fall through.
+ case V_GE:
+ break;
+ case V_GT:
+ lower_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ lower_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ lower_boundary_infinity = true;
+ break;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+ x.assign(UNIVERSE);
+ else
+ x.assign(EMPTY);
+ return is;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ switch (upper_r) {
+ case V_EQ: // Fall through.
+ case V_LE:
+ break;
+ case V_LT:
+ upper_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ upper_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+ x.assign(UNIVERSE);
+ else
+ x.assign(EMPTY);
+ return is;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ upper_boundary_infinity = true;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ if (!lower_boundary_infinity
+ && !upper_boundary_infinity
+ && (lower_bound > upper_bound
+ || (lower_open && lower_bound == upper_bound)))
+ x.assign(EMPTY);
+ else {
+ if (lower_boundary_infinity)
+ set_minus_infinity(LOWER, x.lower(), x.info(), lower_open);
+ else
+ assign(LOWER, x.lower(), x.info(),
+ LOWER, lower_bound, SCALAR_INFO, lower_open);
+ if (upper_boundary_infinity)
+ set_plus_infinity(UPPER, x.upper(), x.info(), upper_open);
+ else
+ assign(UPPER, x.upper(), x.info(),
+ UPPER, upper_bound, SCALAR_INFO, upper_open);
+ }
+ return is;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, bool>::type
+Interval<Boundary, Info>::simplify_using_context_assign(const From& y) {
+ // FIXME: the following code wrongly assumes that intervals are closed
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) {
+ lower_extend();
+ return false;
+ }
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) {
+ upper_extend();
+ return false;
+ }
+ // Weakening the upper bound.
+ if (!upper_is_boundary_infinity() && !y.upper_is_boundary_infinity()
+ && y.upper() <= upper())
+ upper_extend();
+ // Weakening the lower bound.
+ if (!lower_is_boundary_infinity() && !y.lower_is_boundary_infinity()
+ && y.lower() >= lower())
+ lower_extend();
+ return true;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::empty_intersection_assign(const From&) {
+ // FIXME: write me.
+ assign(EMPTY);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_templates_hh)
diff --git a/src/Interval_types.hh b/src/Interval_types.hh
new file mode 100644
index 0000000..948d0dc
--- /dev/null
+++ b/src/Interval_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Interval_types_hh
+#define PPL_Interval_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_types_hh)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc
new file mode 100644
index 0000000..4c02145
--- /dev/null
+++ b/src/Linear_Expression.cc
@@ -0,0 +1,194 @@
+/* Linear_Expression class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+#include "ppl-config.h"
+#include "Linear_Expression_defs.hh"
+
+#include "Linear_Expression_Impl_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::Linear_Expression::max_space_dimension() {
+ return Dense_Row::max_size() - 1;
+}
+
+const PPL::Linear_Expression* PPL::Linear_Expression::zero_p = 0;
+
+void
+PPL::Linear_Expression::initialize() {
+ PPL_ASSERT(zero_p == 0);
+ zero_p = new Linear_Expression(Coefficient_zero());
+}
+
+void
+PPL::Linear_Expression::finalize() {
+ PPL_ASSERT(zero_p != 0);
+ delete zero_p;
+ zero_p = 0;
+}
+
+PPL::Linear_Expression::Linear_Expression(Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>();
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>();
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(dimension_type space_dim, bool x,
+ Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(space_dim, x);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(space_dim, x);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e) {
+ switch (e.representation()) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(*e.impl);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+ Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(*e.impl);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+ dimension_type space_dim) {
+ switch (e.representation()) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(*e.impl, space_dim);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl, space_dim);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+ dimension_type space_dim,
+ Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(*e.impl, space_dim);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl, space_dim);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n,
+ Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(n);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(n);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Variable v, Representation r) {
+ switch (r) {
+ case DENSE:
+ impl = new Linear_Expression_Impl<Dense_Row>(v);
+ break;
+
+ case SPARSE:
+ impl = new Linear_Expression_Impl<Sparse_Row>(v);
+ break;
+
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+}
+
+void
+PPL::Linear_Expression::set_representation(Representation r) {
+ if (representation() == r)
+ return;
+ Linear_Expression tmp(*this, r);
+ swap(*this, tmp);
+}
+
+PPL_OUTPUT_DEFINITIONS(Linear_Expression)
+
+bool
+PPL::Linear_Expression::OK() const {
+ return impl->OK();
+}
diff --git a/src/Linear_Expression_Impl.cc b/src/Linear_Expression_Impl.cc
new file mode 100644
index 0000000..e802c04
--- /dev/null
+++ b/src/Linear_Expression_Impl.cc
@@ -0,0 +1,468 @@
+/* Linear_Expression_Impl class implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Linear_Expression_Impl_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const {
+ return (row.size() != 0);
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const {
+ if (row.size() == 0)
+ return false;
+ for (Sparse_Row::const_iterator i = row.begin(),
+ i_end = row.end(); i != i_end; ++i) {
+ if (*i == 0) {
+ std::cerr << "Linear_Expression_Impl<Sparse_Row>::OK() failed."
+ << " row was:\n";
+ row.ascii_dump(std::cerr);
+ // Found a stored zero.
+ return false;
+ }
+ }
+ return true;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars) {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+ if (vars.empty())
+ return;
+
+ // For each variable to be removed, replace the corresponding coefficient
+ // by shifting left the coefficient to the right that will be kept.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ dimension_type dst_col = *vsi+1;
+ dimension_type src_col = dst_col + 1;
+ for (++vsi; vsi != vsi_end; ++vsi) {
+ const dimension_type vsi_col = *vsi+1;
+ // Move all columns in between to the left.
+ while (src_col < vsi_col)
+ row.swap_coefficients(dst_col++, src_col++);
+ ++src_col;
+ }
+ // Move any remaining columns.
+ const dimension_type sz = row.size();
+ while (src_col < sz)
+ row.swap_coefficients(dst_col++, src_col++);
+
+ // The number of remaining coefficients is `dst_col'.
+ row.resize(dst_col);
+ PPL_ASSERT(OK());
+}
+
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars) {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+ if (vars.empty())
+ return;
+
+ // For each variable to be removed, replace the corresponding coefficient
+ // by shifting left the coefficient to the right that will be kept.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ Sparse_Row::iterator src = row.lower_bound(*vsi + 1);
+ const Sparse_Row::iterator& row_end = row.end();
+ dimension_type num_removed = 0;
+ while (vsi != vsi_end) {
+ // Delete the element.
+ if (src != row_end && src.index() == *vsi + 1)
+ src = row.reset(src);
+ ++num_removed;
+ ++vsi;
+ if (vsi != vsi_end) {
+ // Shift left the coefficients in [src.index(), *vsi + 1) by num_removed
+ // positions.
+ while (src != row_end && src.index() < *vsi + 1) {
+ row.fast_swap(src.index() - num_removed, src);
+ ++src;
+ }
+ }
+ else {
+ // Shift left the coefficients in [src.index(), row.size()) by
+ // num_removed positions.
+ while (src != row_end) {
+ row.fast_swap(src.index() - num_removed, src);
+ ++src;
+ }
+ }
+ }
+
+ PPL_ASSERT(num_removed == vars.size());
+
+ row.resize(row.size() - num_removed);
+ PPL_ASSERT(OK());
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const {
+ for (dimension_type i = row.size(); i-- > 0; )
+ if (row[i] != 0)
+ return false;
+ return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const {
+ for (dimension_type i = 1; i < row.size(); ++i)
+ if (row[i] != 0)
+ return false;
+ return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ for (dimension_type i = start; i < end; ++i)
+ if (row[i] != 0)
+ return false;
+ return true;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(start <= end);
+ dimension_type result = 0;
+ for (dimension_type i = start; i < end; ++i)
+ if (row[i] == 0)
+ ++result;
+ return result;
+}
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+ dimension_type end) const {
+ dimension_type i;
+
+ for (i = start; i < end; ++i)
+ if (row[i] != 0)
+ break;
+
+ if (i == end)
+ return 0;
+
+ PPL_ASSERT(row[i] != 0);
+
+ Coefficient result = row[i];
+ ++i;
+
+ if (result < 0)
+ neg_assign(result);
+
+ for ( ; i < end; ++i) {
+ if (row[i] == 0)
+ continue;
+ gcd_assign(result, row[i], result);
+ if (result == 1)
+ return result;
+ }
+
+ return result;
+}
+
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+ dimension_type end) const {
+ Sparse_Row::const_iterator i = row.lower_bound(start);
+ Sparse_Row::const_iterator i_end = row.lower_bound(end);
+
+ if (i == i_end)
+ return 0;
+
+ PPL_ASSERT(*i != 0);
+
+ Coefficient result = *i;
+ ++i;
+
+ if (result < 0)
+ neg_assign(result);
+
+ for ( ; i != i_end; ++i) {
+ gcd_assign(result, *i, result);
+ if (result == 1)
+ return result;
+ }
+
+ return result;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const {
+ Variables_Set::const_iterator j = vars.begin();
+ Variables_Set::const_iterator j_end = vars.end();
+
+ for ( ; j != j_end; ++j)
+ if (row[*j + 1] != 0)
+ return false;
+
+ return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const {
+ Sparse_Row::const_iterator i = row.begin();
+ Sparse_Row::const_iterator i_end = row.end();
+ Variables_Set::const_iterator j = vars.begin();
+ Variables_Set::const_iterator j_end = vars.end();
+
+ for ( ; j != j_end; ++j) {
+ i = row.lower_bound(i, *j + 1);
+ if (i == i_end)
+ break;
+ if (i.index() == *j + 1)
+ return false;
+ }
+
+ return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ if (start == 0) {
+ if (row[0] != 0)
+ return false;
+ ++start;
+ }
+ for (dimension_type i = start; i < end; ++i)
+ if (row[i] != 0 && vars.count(i - 1) == 0)
+ return false;
+ return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(start <= end);
+ if (start == end)
+ return true;
+ if (start == 0) {
+ if (row.find(0) != row.end())
+ return false;
+
+ start = 1;
+ }
+
+ PPL_ASSERT(start != 0);
+ PPL_ASSERT(start <= end);
+ for (Sparse_Row::const_iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ if (vars.count(i.index() - 1) == 0)
+ return false;
+
+ return true;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const {
+ for (dimension_type i = row.size(); i-- > 0; )
+ if (row[i] != 0)
+ return i;
+ return 0;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ for (dimension_type i = first; i < last; ++i)
+ if (row[i] != 0)
+ return i;
+
+ return last;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ for (dimension_type i = last; i-- > first; )
+ if (row[i] != 0)
+ return i;
+
+ return last;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ typedef std::set<dimension_type> set_t;
+ set_t result;
+ for (set_t::const_iterator i = x.begin(), i_end = x.end(); i != i_end; ++i)
+ if (row[*i] == 0)
+ result.insert(*i);
+ using std::swap;
+ swap(x, result);
+}
+
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ typedef std::set<dimension_type> set_t;
+ set_t result;
+ Sparse_Row::const_iterator itr = row.end();
+ Sparse_Row::const_iterator itr_end = row.end();
+ set_t::const_iterator i = x.begin();
+ set_t::const_iterator i_end = x.end();
+ for ( ; i != i_end; ++i) {
+ itr = row.lower_bound(itr, *i);
+ if (itr == itr_end)
+ break;
+ if (itr.index() != *i)
+ result.insert(*i);
+ }
+ for ( ; i != i_end; ++i)
+ result.insert(*i);
+ using std::swap;
+ swap(x, result);
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const {
+ const dimension_type start = first.space_dimension();
+ const dimension_type end = last.space_dimension();
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= row.size());
+ PPL_ASSERT(end <= y.row.size());
+ for (dimension_type i = start; i < end; ++i)
+ if (row[i] != 0 && y.row[i] != 0)
+ return true;
+ return false;
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const {
+ const dimension_type start = first.space_dimension();
+ const dimension_type end = last.space_dimension();
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= row.size());
+ PPL_ASSERT(end <= y.row.size());
+ for (Sparse_Row::const_iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ if (y.row[i.index()] != 0)
+ return true;
+ return false;
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const {
+ return y.have_a_common_variable(*this, first, last);
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const {
+ const dimension_type start = first.space_dimension();
+ const dimension_type end = last.space_dimension();
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= row.size());
+ PPL_ASSERT(end <= y.row.size());
+ Sparse_Row::const_iterator i = row.lower_bound(start);
+ Sparse_Row::const_iterator i_end = row.lower_bound(end);
+ Sparse_Row::const_iterator j = y.row.lower_bound(start);
+ Sparse_Row::const_iterator j_end = y.row.lower_bound(end);
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index())
+ return true;
+ if (i.index() < j.index())
+ ++i;
+ else
+ ++j;
+ }
+ return false;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator
+::skip_zeroes_forward() {
+ while (itr != row->end() && *itr == 0)
+ ++itr;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator
+::skip_zeroes_backward() {
+ PPL_ASSERT(itr.index() > 0);
+ while (*itr == 0) {
+ PPL_ASSERT(itr.index() > 1);
+ --itr;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/Linear_Expression_Impl_defs.hh b/src/Linear_Expression_Impl_defs.hh
new file mode 100644
index 0000000..b5b0bb0
--- /dev/null
+++ b/src/Linear_Expression_Impl_defs.hh
@@ -0,0 +1,906 @@
+/* Linear_Expression_Impl class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_defs_hh
+#define PPL_Linear_Expression_Impl_defs_hh 1
+
+#include "Linear_Expression_Impl_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include <cstddef>
+#include "Linear_Expression_Interface_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Expression_Impl represents the linear
+ expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+
+ \par How to build a linear expression.
+
+ Linear expressions are the basic blocks for defining
+ both constraints (i.e., linear equalities or inequalities)
+ and generators (i.e., lines, rays, points and closure points).
+ A full set of functions is defined to provide a convenient interface
+ for building complex linear expressions starting from simpler ones
+ and from objects of the classes Variable and Coefficient:
+ available operators include unary negation,
+ binary addition and subtraction,
+ as well as multiplication by a Coefficient.
+ The space dimension of a linear expression is defined as the maximum
+ space dimension of the arguments used to build it:
+ in particular, the space dimension of a Variable <CODE>x</CODE>
+ is defined as <CODE>x.id()+1</CODE>,
+ whereas all the objects of the class Coefficient have space dimension zero.
+
+ \par Example
+ The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+ having space dimension \f$3\f$:
+ \code
+ Linear_Expression_Impl e = 4*x - 2*y - z + 14;
+ \endcode
+ Another way to build the same linear expression is:
+ \code
+ Linear_Expression_Impl e1 = 4*x;
+ Linear_Expression_Impl e2 = 2*y;
+ Linear_Expression_Impl e3 = z;
+ Linear_Expression_Impl e = Linear_Expression_Impl(14);
+ e += e1 - e2 - e3;
+ \endcode
+ Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+ respectively; also, in the fourth line of code, \p e is created
+ with space dimension zero and then extended to space dimension 3
+ in the fifth line.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_Expression_Impl
+ : public Linear_Expression_Interface {
+public:
+ //! Default constructor: returns a copy of Linear_Expression_Impl::zero().
+ Linear_Expression_Impl();
+
+ //! Ordinary copy constructor.
+ Linear_Expression_Impl(const Linear_Expression_Impl& e);
+
+ //! Copy constructor for other row types.
+ template <typename Row2>
+ Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e);
+
+ //! Copy constructor from any implementation of Linear_Expression_Interface.
+ Linear_Expression_Impl(const Linear_Expression_Interface& e);
+
+ //! Destructor.
+ virtual ~Linear_Expression_Impl();
+
+ //! Checks if all the invariants are satisfied.
+ virtual bool OK() const;
+
+ /*! \brief
+ Builds the linear expression corresponding
+ to the inhomogeneous term \p n.
+ */
+ explicit Linear_Expression_Impl(Coefficient_traits::const_reference n);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression_Impl::max_space_dimension()</CODE>.
+ */
+ Linear_Expression_Impl(Variable v);
+
+ //! Returns the current representation of this linear expression.
+ virtual Representation representation() const;
+
+ //! An interface for const iterators on the expression (homogeneous)
+ //! coefficients that are nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator: public const_iterator_interface {
+ public:
+ explicit const_iterator(const Row& row, dimension_type i);
+
+ //! Returns a copy of *this.
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* clone() const;
+
+ //! Navigates to the next nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator++();
+
+ //! Navigates to the previous nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator--();
+
+ //! Returns the current element.
+ virtual reference operator*() const;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ virtual Variable variable() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ virtual bool operator==(const const_iterator_interface& x) const;
+
+ private:
+
+ void skip_zeroes_forward();
+ void skip_zeroes_backward();
+
+ const Row* row;
+ typename Row::const_iterator itr;
+ };
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* begin() const;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* end() const;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ //! Returns (a pointer to) an iterator that points to the first nonzero
+ //! coefficient of a variable greater than or equal to v, or at end if no
+ //! such coefficient exists.
+ virtual const_iterator_interface* lower_bound(Variable v) const;
+
+ //! Returns the maximum space dimension a Linear_Expression_Impl can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ virtual dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ virtual void set_space_dimension(dimension_type n);
+
+ //! Returns the coefficient of \p v in \p *this.
+ virtual Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ virtual void set_coefficient(Variable v,
+ Coefficient_traits::const_reference n);
+
+ //! Returns the inhomogeneous term of \p *this.
+ virtual Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ virtual void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void linear_combine(const Linear_Expression_Interface& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ virtual void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ virtual void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ virtual void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ virtual void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ virtual bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ virtual bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ virtual memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+ //! Writes to \p s an ASCII representation of \p *this.
+ virtual void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ virtual bool ascii_load(std::istream& s);
+
+ //! Copy constructor with a specified space dimension.
+ Linear_Expression_Impl(const Linear_Expression_Interface& e,
+ dimension_type space_dim);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ virtual bool is_equal_to(const Linear_Expression_Interface& x) const;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ virtual void normalize();
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ virtual void sign_normalize();
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ virtual void negate(dimension_type first, dimension_type last);
+
+ virtual Linear_Expression_Impl&
+ operator+=(Coefficient_traits::const_reference n);
+ virtual Linear_Expression_Impl&
+ operator-=(Coefficient_traits::const_reference n);
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Impl
+
+ \returns
+ -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise.
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ virtual int compare(const Linear_Expression_Interface& y) const;
+
+ virtual Linear_Expression_Impl&
+ operator+=(const Linear_Expression_Interface& e2);
+ virtual Linear_Expression_Impl& operator+=(const Variable v);
+ virtual Linear_Expression_Impl&
+ operator-=(const Linear_Expression_Interface& e2);
+ virtual Linear_Expression_Impl& operator-=(const Variable v);
+ virtual Linear_Expression_Impl&
+ operator*=(Coefficient_traits::const_reference n);
+ virtual Linear_Expression_Impl&
+ operator/=(Coefficient_traits::const_reference n);
+
+ virtual void negate();
+
+ virtual Linear_Expression_Impl&
+ add_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+ virtual Linear_Expression_Impl&
+ sub_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+ virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2);
+
+ virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2);
+
+ virtual void print(std::ostream& s) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ virtual bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+ Variable first, Variable last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ virtual Coefficient_traits::const_reference get(dimension_type i) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ virtual void set(dimension_type i, Coefficient_traits::const_reference n);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ virtual bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ virtual dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ virtual Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ virtual void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ virtual void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, dimension_type i);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ virtual dimension_type last_nonzero() const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+ \f$0\f$, disregarding coefficients of variables in \p vars.
+ */
+ virtual bool
+ all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Computes the sign of the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual int
+ scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ virtual dimension_type
+ first_nonzero(dimension_type first, dimension_type last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ virtual dimension_type
+ last_nonzero(dimension_type first, dimension_type last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ virtual void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Dense_Row& row) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Sparse_Row& row) const;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with the constructor
+ Linear_Expression_Impl(Coefficient_traits::const_reference n).
+ */
+ Linear_Expression_Impl(dimension_type space_dim, bool);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ template <typename Row2>
+ void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x) const;
+
+ template <typename Row2>
+ Linear_Expression_Impl& operator+=(const Linear_Expression_Impl<Row2>& e2);
+ template <typename Row2>
+ Linear_Expression_Impl& operator-=(const Linear_Expression_Impl<Row2>& e2);
+
+ template <typename Row2>
+ Linear_Expression_Impl&
+ sub_mul_assign(Coefficient_traits::const_reference n,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end);
+
+ template <typename Row2>
+ void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& e2);
+
+ template <typename Row2>
+ void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& e2);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ template <typename Row2>
+ void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Impl
+
+ \returns
+ -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise.
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ template <typename Row2>
+ int compare(const Linear_Expression_Impl<Row2>& y) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ template <typename Row2>
+ void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ template <typename Row2>
+ int scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ template <typename Row2>
+ bool have_a_common_variable(const Linear_Expression_Impl<Row2>& x,
+ Variable first, Variable last) const;
+
+private:
+
+ void construct(const Linear_Expression_Interface& e);
+ void construct(const Linear_Expression_Interface& e,
+ dimension_type space_dim);
+
+ template <typename Row2>
+ void construct(const Linear_Expression_Impl<Row2>& e);
+ template <typename Row2>
+ void construct(const Linear_Expression_Impl<Row2>& e,
+ dimension_type space_dim);
+
+ Row row;
+
+ template <typename Row2>
+ friend class Linear_Expression_Impl;
+
+}; // class Parma_Polyhedra_Library::Linear_Expression_Impl
+
+
+namespace Parma_Polyhedra_Library {
+
+// NOTE: declaring explicit specializations.
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+ dimension_type end) const;
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+ dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+
+template <>
+Representation
+Linear_Expression_Impl<Dense_Row>::representation() const;
+template <>
+Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_backward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_backward();
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_forward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_forward();
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "Linear_Expression_Impl_inlines.hh"
+#include "Linear_Expression_Impl_templates.hh"
+
+#endif // !defined(PPL_Linear_Expression_Impl_defs_hh)
diff --git a/src/Linear_Expression_Impl_inlines.hh b/src/Linear_Expression_Impl_inlines.hh
new file mode 100644
index 0000000..40ca53e
--- /dev/null
+++ b/src/Linear_Expression_Impl_inlines.hh
@@ -0,0 +1,282 @@
+/* Linear_Expression_Impl class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_inlines_hh
+#define PPL_Linear_Expression_Impl_inlines_hh 1
+
+#include "math_utilities_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::max_space_dimension() {
+ return Row::max_size() - 1;
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::Linear_Expression_Impl()
+ : row(1) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(dimension_type space_dim, bool)
+ : row(space_dim + 1) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::~Linear_Expression_Impl() {
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(Coefficient_traits::const_reference n)
+ : row(1) {
+ if (n != 0)
+ row.insert(0, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::space_dimension() const {
+ return row.size() - 1;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::set_space_dimension(dimension_type n) {
+ row.resize(n + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return Coefficient_zero();
+ return row.get(v.id() + 1);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ const dimension_type i = v.space_dimension();
+ if (n == 0)
+ row.reset(i);
+ else
+ row.insert(i, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::inhomogeneous_term() const {
+ return row.get(0);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+ if (n == 0)
+ row.reset(0);
+ else
+ row.insert(0, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::swap_space_dimensions(Variable v1, Variable v2) {
+ row.swap_coefficients(v1.space_dimension(), v2.space_dimension());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::shift_space_dimensions(Variable v,
+ dimension_type n) {
+ row.add_zeroes_and_shift(n, v.space_dimension());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::external_memory_in_bytes() const {
+ return row.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(Coefficient_traits::const_reference n) {
+ typename Row::iterator itr = row.insert(0);
+ (*itr) += n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(Coefficient_traits::const_reference n) {
+ typename Row::iterator itr = row.insert(0);
+ (*itr) -= n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::normalize() {
+ row.normalize();
+ PPL_ASSERT(OK());
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const {
+ return row.num_stored_elements() == 0;
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const {
+ return row.lower_bound(1) == row.end();
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ return row.lower_bound(start) == row.lower_bound(end);
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(start <= end);
+ return (end - start)
+ - std::distance(row.lower_bound(start), row.lower_bound(end));
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const {
+ if (row.num_stored_elements() == 0)
+ return 0;
+ Sparse_Row::const_iterator i = row.end();
+ --i;
+ return i.index();
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ Sparse_Row::const_iterator i = row.lower_bound(first);
+
+ if (i != row.end() && i.index() < last)
+ return i.index();
+ else
+ return last;
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ Sparse_Row::const_iterator itr1 = row.lower_bound(first);
+ Sparse_Row::const_iterator itr2 = row.lower_bound(last);
+
+ if (itr1 == itr2)
+ return last;
+
+ --itr2;
+ return itr2.index();
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Dense_Row>::representation() const {
+ return DENSE;
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const {
+ return SPARSE;
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_forward() {
+ // Nothing to do.
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_backward() {
+ // Nothing to do.
+}
+
+namespace IO_Operators {
+
+template <typename Row>
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e) {
+ e.print(s);
+ return s;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_inlines_hh)
diff --git a/src/Linear_Expression_Impl_templates.hh b/src/Linear_Expression_Impl_templates.hh
new file mode 100644
index 0000000..e9419ed
--- /dev/null
+++ b/src/Linear_Expression_Impl_templates.hh
@@ -0,0 +1,1316 @@
+/* Linear_Expression_Impl class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_templates_hh
+#define PPL_Linear_Expression_Impl_templates_hh 1
+
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include <stdexcept>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl& e) {
+ construct(e);
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e) {
+ construct(e);
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+ construct(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+ construct(*p);
+ }
+ else {
+ // Add implementations for other derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e,
+ dimension_type space_dim) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+ construct(*p, space_dim);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+ construct(*p, space_dim);
+ }
+ else {
+ // Add implementations for other derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, Variable i) {
+ PPL_ASSERT(space_dimension() == y.space_dimension());
+ PPL_ASSERT(i.space_dimension() <= space_dimension());
+ linear_combine(y, i.space_dimension());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i) {
+ const Linear_Expression_Impl& x = *this;
+ PPL_ASSERT(i < x.space_dimension() + 1);
+ PPL_ASSERT(x.space_dimension() == y.space_dimension());
+ Coefficient_traits::const_reference x_i = x.row.get(i);
+ Coefficient_traits::const_reference y_i = y.row.get(i);
+ PPL_ASSERT(x_i != 0);
+ PPL_ASSERT(y_i != 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_v);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_v);
+ normalize2(x_i, y_i, normalized_x_v, normalized_y_v);
+ neg_assign(normalized_x_v);
+ linear_combine(y, normalized_y_v, normalized_x_v);
+ // We cannot use x_i here because it may have been invalidated by
+ // linear_combine().
+ assert(x.row.get(i) == 0);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ if (space_dimension() < y.space_dimension())
+ set_space_dimension(y.space_dimension());
+ linear_combine(y, c1, c2, 0, y.space_dimension() + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ if (space_dimension() < y.space_dimension())
+ set_space_dimension(y.space_dimension());
+ linear_combine_lax(y, c1, c2, 0, y.space_dimension() + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Impl<Row2>& y) const {
+ const Linear_Expression_Impl& x = *this;
+ // Compare all the coefficients of the row starting from position 1.
+ // NOTE: x and y may be of different size.
+ typename Row::const_iterator i = x.row.lower_bound(1);
+ typename Row::const_iterator i_end = x.row.end();
+ typename Row2::const_iterator j = y.row.lower_bound(1);
+ typename Row2::const_iterator j_end = y.row.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() < j.index()) {
+ const int s = sgn(*i);
+ if (s != 0)
+ return 2*s;
+ ++i;
+ continue;
+ }
+ if (i.index() > j.index()) {
+ const int s = sgn(*j);
+ if (s != 0)
+ return -2*s;
+ ++j;
+ continue;
+ }
+ PPL_ASSERT(i.index() == j.index());
+ const int s = cmp(*i, *j);
+ if (s < 0)
+ return -2;
+ if (s > 0)
+ return 2;
+ PPL_ASSERT(s == 0);
+ ++i;
+ ++j;
+ }
+ for ( ; i != i_end; ++i) {
+ const int s = sgn(*i);
+ if (s != 0)
+ return 2*s;
+ }
+ for ( ; j != j_end; ++j) {
+ const int s = sgn(*j);
+ if (s != 0)
+ return -2*s;
+ }
+
+ // If all the coefficients in `x' equal all the coefficients in `y'
+ // (starting from position 1) we compare coefficients in position 0,
+ // i.e., inhomogeneous terms.
+ const int comp = cmp(x.row.get(0), y.row.get(0));
+ if (comp > 0)
+ return 1;
+ if (comp < 0)
+ return -1;
+ PPL_ASSERT(comp == 0);
+
+ // `x' and `y' are equal.
+ return 0;
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::Linear_Expression_Impl(const Variable v) {
+ if (v.space_dimension() > max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl::"
+ "Linear_Expression_Impl(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ set_space_dimension(v.space_dimension());
+ (*this) += v;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& x) const {
+ return row == x.row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Dense_Row& row) const {
+ row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Sparse_Row& row) const {
+ row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ const dimension_type n = cycle.size();
+ if (n < 2)
+ return;
+
+ if (n == 2) {
+ row.swap_coefficients(cycle[0].space_dimension(),
+ cycle[1].space_dimension());
+ }
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ tmp = row.get(cycle.back().space_dimension());
+ for (dimension_type i = n - 1; i-- > 0; )
+ row.swap_coefficients(cycle[i + 1].space_dimension(),
+ cycle[i].space_dimension());
+ if (tmp == 0)
+ row.reset(cycle[0].space_dimension());
+ else {
+ using std::swap;
+ swap(tmp, row[cycle[0].space_dimension()]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Linear_Expression_Impl<Row2>& e) {
+ linear_combine(e, Coefficient_one(), Coefficient_one());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "operator+=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ typename Row::iterator itr = row.insert(v_space_dim);
+ ++(*itr);
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Linear_Expression_Impl<Row2>& e2) {
+ linear_combine(e2, Coefficient_one(), -1);
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "operator-=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ typename Row::iterator itr = row.insert(v_space_dim);
+ --(*itr);
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator*=(Coefficient_traits::const_reference n) {
+ if (n == 0) {
+ row.clear();
+ PPL_ASSERT(OK());
+ return *this;
+ }
+ for (typename Row::iterator i = row.begin(),
+ i_end = row.end(); i != i_end; ++i)
+ (*i) *= n;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator/=(Coefficient_traits::const_reference n) {
+ typename Row::iterator i = row.begin();
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end) {
+ (*i) /= n;
+ if (*i == 0)
+ i = row.reset(i);
+ else
+ ++i;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate() {
+ for (typename Row::iterator i = row.begin(),
+ i_end = row.end(); i != i_end; ++i)
+ neg_assign(*i);
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::add_mul_assign(Coefficient_traits::const_reference n,
+ const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "add_mul_assign(e, n, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ if (n == 0)
+ return *this;
+ typename Row::iterator itr = row.insert(v_space_dim);
+ (*itr) += n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference n,
+ const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "sub_mul_assign(e, n, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ if (n == 0)
+ return *this;
+ typename Row::iterator itr = row.insert(v_space_dim);
+ (*itr) -= n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& y) {
+ if (factor != 0)
+ linear_combine(y, Coefficient_one(), factor);
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& y) {
+ if (factor != 0)
+ linear_combine(y, Coefficient_one(), -factor);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::print(std::ostream& s) const {
+ PPL_DIRTY_TEMP_COEFFICIENT(ev);
+ bool first = true;
+ for (typename Row::const_iterator i = row.lower_bound(1), i_end = row.end();
+ i != i_end; ++i) {
+ ev = *i;
+ if (ev == 0)
+ continue;
+ if (!first) {
+ if (ev > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(ev);
+ }
+ }
+ else
+ first = false;
+ if (ev == -1)
+ s << "-";
+ else if (ev != 1)
+ s << ev << "*";
+ IO_Operators::operator<<(s, Variable(i.index() - 1));
+ }
+ // Inhomogeneous term.
+ PPL_DIRTY_TEMP_COEFFICIENT(it);
+ it = row[0];
+ if (it != 0) {
+ if (!first) {
+ if (it > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(it);
+ }
+ }
+ else
+ first = false;
+ s << it;
+ }
+
+ if (first)
+ // The null linear expression.
+ s << Coefficient_zero();
+}
+
+template <typename Row>
+Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::get(dimension_type i) const {
+ return row.get(i);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::set(dimension_type i, Coefficient_traits::const_reference n) {
+ if (n == 0)
+ row.reset(i);
+ else
+ row.insert(i, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ // NOTE: Since all coefficients in [start,end) are multiple of c,
+ // each of the resulting coefficients will be nonzero iff the initial
+ // coefficient was.
+ for (typename Row::iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ Parma_Polyhedra_Library::exact_div_assign(*i, *i, c);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::mul_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ if (c == 0) {
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ }
+ else {
+ for (typename Row::iterator
+ i = row.lower_bound(start), i_end = row.lower_bound(end); i != i_end; ++i)
+ (*i) *= c;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= row.size());
+ PPL_ASSERT(end <= y.row.size());
+ if (c1 == 0) {
+ if (c2 == 0) {
+ PPL_ASSERT(c1 == 0);
+ PPL_ASSERT(c2 == 0);
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ }
+ else {
+ PPL_ASSERT(c1 == 0);
+ PPL_ASSERT(c2 != 0);
+
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_last = y.row.lower_bound(end);
+
+ while (i != i_end && i.index() < end && j != j_last) {
+ if (i.index() < j.index()) {
+ i = row.reset(i);
+ continue;
+ }
+ if (i.index() > j.index()) {
+ i = row.insert(i, j.index(), *j);
+ (*i) *= c2;
+ ++i;
+ ++j;
+ continue;
+ }
+ PPL_ASSERT(i.index() == j.index());
+ (*i) = (*j);
+ (*i) *= c2;
+ ++i;
+ ++j;
+ }
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ while (j != j_last) {
+ i = row.insert(i, j.index(), *j);
+ (*i) *= c2;
+ // No need to increment i here.
+ ++j;
+ }
+ }
+ }
+ else {
+ if (c2 == 0) {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 == 0);
+ for (typename Row::iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ (*i) *= c1;
+ }
+ else {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::sign_normalize() {
+ typename Row::iterator i = row.lower_bound(1);
+ typename Row::iterator i_end = row.end();
+
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ break;
+
+ if (i != i_end && *i < 0) {
+ for ( ; i != i_end; ++i)
+ neg_assign(*i);
+ // Negate the first coefficient, too.
+ typename Row::iterator first = row.begin();
+ if (first != row.end() && first.index() == 0)
+ neg_assign(*first);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate(dimension_type first, dimension_type last) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ typename Row::iterator i = row.lower_bound(first);
+ typename Row::iterator i_end = row.lower_bound(last);
+ for ( ; i != i_end; ++i)
+ neg_assign(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e) {
+ row = e.row;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e,
+ dimension_type space_dim) {
+ Row x(e.row, space_dim + 1, space_dim + 1);
+ swap(row, x);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+ result = 0;
+ typename Row ::const_iterator x_i = x.row.lower_bound(start);
+ typename Row ::const_iterator x_end = x.row.lower_bound(end);
+ typename Row2::const_iterator y_i = y.row.lower_bound(start);
+ typename Row2::const_iterator y_end = y.row.lower_bound(end);
+ while (x_i != x_end && y_i != y_end) {
+ if (x_i.index() == y_i.index()) {
+ Parma_Polyhedra_Library::add_mul_assign(result, *x_i, *y_i);
+ ++x_i;
+ ++y_i;
+ }
+ else {
+ if (x_i.index() < y_i.index()) {
+ PPL_ASSERT(y.row.get(x_i.index()) == 0);
+ // (*x_i) * 0 == 0, nothing to do.
+ ++x_i;
+ }
+ else {
+ PPL_ASSERT(x.row.get(y_i.index()) == 0);
+ // 0 * (*y_i) == 0, nothing to do.
+ ++y_i;
+ }
+ }
+ }
+ // In the remaining positions (if any) at most one row is nonzero, so
+ // there's nothing left to do.
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ PPL_DIRTY_TEMP_COEFFICIENT(result);
+ scalar_product_assign(result, y, start, end);
+ return sgn(result);
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+
+ typename Row::const_iterator i = x.row.lower_bound(start);
+ typename Row::const_iterator i_end = x.row.lower_bound(end);
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_end = y.row.lower_bound(end);
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ if (*i != *j)
+ return false;
+ ++i;
+ ++j;
+ }
+ else {
+ if (i.index() < j.index()) {
+ if (*i != 0)
+ return false;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ if (*j != 0)
+ return false;
+ ++j;
+ }
+ }
+ }
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ return false;
+ for ( ; j != j_end; ++j)
+ if (*j != 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+
+ // Deal with trivial cases.
+ if (c1 == 0) {
+ if (c2 == 0)
+ return true;
+ else
+ return y.all_zeroes(start, end);
+ }
+ if (c2 == 0)
+ return x.all_zeroes(start, end);
+
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ typename Row::const_iterator i = x.row.lower_bound(start);
+ typename Row::const_iterator i_end = x.row.lower_bound(end);
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_end = y.row.lower_bound(end);
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ if ((*i) * c1 != (*j) * c2)
+ return false;
+ ++i;
+ ++j;
+ }
+ else {
+ if (i.index() < j.index()) {
+ if (*i != 0)
+ return false;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ if (*j != 0)
+ return false;
+ ++j;
+ }
+ }
+ }
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ return false;
+ for ( ; j != j_end; ++j)
+ if (*j != 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, Variable v) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, v);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, v);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, c1, c2);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, c1, c2);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator+=(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return operator+=(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return operator+=(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return *this;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator-=(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return operator-=(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return operator-=(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return *this;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ add_mul_assign(factor, *p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ add_mul_assign(factor, *p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ sub_mul_assign(factor, *p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ sub_mul_assign(factor, *p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, dimension_type i) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, i);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, i);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Interface& y) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return compare(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return compare(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return 0;
+ }
+}
+
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return construct(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return construct(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y,
+ dimension_type space_dim) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return construct(*p, space_dim);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return construct(*p, space_dim);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ scalar_product_assign(result, *p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ scalar_product_assign(result, *p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return scalar_product_sign(*p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return scalar_product_sign(*p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return 0;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::have_a_common_variable(const Linear_Expression_Interface& y,
+ Variable first, Variable last) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return have_a_common_variable(*p, first, last);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return have_a_common_variable(*p, first, last);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::begin() const {
+ return new const_iterator(row, 1);
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::end() const {
+ return new const_iterator(row, row.size());
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::lower_bound(Variable v) const {
+ return new const_iterator(row, v.space_dimension());
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::const_iterator
+::const_iterator(const Row& row1, dimension_type i)
+ : row(&row1), itr(row1.lower_bound(i)) {
+ skip_zeroes_forward();
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::const_iterator
+::clone() const {
+ return new const_iterator(*this);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator++() {
+ ++itr;
+ skip_zeroes_forward();
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator--() {
+ --itr;
+ skip_zeroes_backward();
+}
+
+template <typename Row>
+typename Linear_Expression_Impl<Row>::const_iterator::reference
+Linear_Expression_Impl<Row>::const_iterator
+::operator*() const {
+ return *itr;
+}
+
+template <typename Row>
+Variable
+Linear_Expression_Impl<Row>::const_iterator
+::variable() const {
+ const dimension_type i = itr.index();
+ PPL_ASSERT(i != 0);
+ return Variable(i - 1);
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::const_iterator
+::operator==(const const_iterator_interface& x) const {
+ const const_iterator* const p = dynamic_cast<const const_iterator*>(&x);
+ // Comparing iterators belonging to different rows is forbidden.
+ PPL_ASSERT(p != 0);
+ PPL_ASSERT(row == p->row);
+ return itr == p->itr;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::ascii_dump(std::ostream& s) const {
+ s << "size " << (space_dimension() + 1) << " ";
+ for (dimension_type i = 0; i < row.size(); ++i) {
+ s << row.get(i);
+ if (i != row.size() - 1)
+ s << ' ';
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str))
+ return false;
+ if (str != "size")
+ return false;
+
+ dimension_type new_size;
+ if (!(s >> new_size))
+ return false;
+
+ row.resize(0);
+ row.resize(new_size);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+
+ for (dimension_type j = 0; j < new_size; ++j) {
+ if (!(s >> c))
+ return false;
+ if (c != 0)
+ row.insert(j, c);
+ }
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::OK() const {
+ return row.OK();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_templates_hh)
diff --git a/src/Linear_Expression_Impl_types.hh b/src/Linear_Expression_Impl_types.hh
new file mode 100644
index 0000000..e2beb9b
--- /dev/null
+++ b/src/Linear_Expression_Impl_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_Impl_types_hh
+#define PPL_Linear_Expression_Impl_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_Expression_Impl;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_types_hh)
diff --git a/src/Linear_Expression_Interface.cc b/src/Linear_Expression_Interface.cc
new file mode 100644
index 0000000..b064538
--- /dev/null
+++ b/src/Linear_Expression_Interface.cc
@@ -0,0 +1,35 @@
+/* Linear_Expression_Interface class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+#include "Linear_Expression_Interface_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Linear_Expression_Interface::~Linear_Expression_Interface() {
+}
+
+PPL::Linear_Expression_Interface::const_iterator_interface
+::~const_iterator_interface() {
+}
diff --git a/src/Linear_Expression_Interface_defs.hh b/src/Linear_Expression_Interface_defs.hh
new file mode 100644
index 0000000..e2d3b8f
--- /dev/null
+++ b/src/Linear_Expression_Interface_defs.hh
@@ -0,0 +1,489 @@
+/* Linear_Expression_Interface class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Interface_defs_hh
+#define PPL_Linear_Expression_Interface_defs_hh 1
+
+#include "Linear_Expression_Interface_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Dense_Row_types.hh"
+#include "Sparse_Row_types.hh"
+#include <vector>
+#include <set>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of a class implementing Linear_Expression_Interface
+ represents a linear expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_Expression_Interface {
+public:
+ virtual ~Linear_Expression_Interface();
+
+ virtual bool OK() const = 0;
+
+ //! Returns the current representation of this linear expression.
+ virtual Representation representation() const = 0;
+
+ //! An interface for const iterators on the expression (homogeneous)
+ //! coefficients that are nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator_interface {
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ //! Returns a copy of *this.
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* clone() const = 0;
+
+ virtual ~const_iterator_interface();
+
+ //! Navigates to the next nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator++() = 0;
+
+ //! Navigates to the previous nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator--() = 0;
+
+ //! Returns the current element.
+ virtual reference operator*() const = 0;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ virtual Variable variable() const = 0;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ virtual bool operator==(const const_iterator_interface& x) const = 0;
+ };
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* begin() const = 0;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* end() const = 0;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ //! Returns (a pointer to) an iterator that points to the first nonzero
+ //! coefficient of a variable greater than or equal to v, or at end if no
+ //! such coefficient exists.
+ virtual const_iterator_interface* lower_bound(Variable v) const = 0;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ virtual dimension_type space_dimension() const = 0;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ virtual void set_space_dimension(dimension_type n) = 0;
+
+ //! Returns the coefficient of \p v in \p *this.
+ virtual Coefficient_traits::const_reference
+ coefficient(Variable v) const = 0;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ virtual void
+ set_coefficient(Variable v, Coefficient_traits::const_reference n) = 0;
+
+ //! Returns the inhomogeneous term of \p *this.
+ virtual Coefficient_traits::const_reference inhomogeneous_term() const = 0;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ virtual void
+ set_inhomogeneous_term(Coefficient_traits::const_reference n) = 0;
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, Variable v) = 0;
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) = 0;
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) = 0;
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ virtual void swap_space_dimensions(Variable v1, Variable v2) = 0;
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ virtual void remove_space_dimensions(const Variables_Set& vars) = 0;
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ virtual void shift_space_dimensions(Variable v, dimension_type n) = 0;
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ virtual void
+ permute_space_dimensions(const std::vector<Variable>& cycle) = 0;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ virtual bool is_zero() const = 0;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ virtual bool all_homogeneous_terms_are_zero() const = 0;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ virtual memory_size_type total_memory_in_bytes() const = 0;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const = 0;
+
+ //! Writes to \p s an ASCII representation of \p *this.
+ virtual void ascii_dump(std::ostream& s) const = 0;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ virtual bool ascii_load(std::istream& s) = 0;
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ virtual bool is_equal_to(const Linear_Expression_Interface& x) const = 0;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ virtual void normalize() = 0;
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ virtual void sign_normalize() = 0;
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ virtual void negate(dimension_type first, dimension_type last) = 0;
+
+ virtual Linear_Expression_Interface&
+ operator+=(Coefficient_traits::const_reference n) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(Coefficient_traits::const_reference n) = 0;
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Interface
+
+ \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ virtual int compare(const Linear_Expression_Interface& y) const = 0;
+
+ virtual Linear_Expression_Interface&
+ operator+=(const Linear_Expression_Interface& e2) = 0;
+ virtual Linear_Expression_Interface&
+ operator+=(const Variable v) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(const Linear_Expression_Interface& e2) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(const Variable v) = 0;
+ virtual Linear_Expression_Interface&
+ operator*=(Coefficient_traits::const_reference n) = 0;
+ virtual Linear_Expression_Interface&
+ operator/=(Coefficient_traits::const_reference n) = 0;
+
+ virtual void negate() = 0;
+
+ virtual Linear_Expression_Interface&
+ add_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+ virtual Linear_Expression_Interface&
+ sub_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+ virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2) = 0;
+
+ virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2) = 0;
+
+ virtual void print(std::ostream& s) const = 0;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ virtual bool all_zeroes(const Variables_Set& vars) const = 0;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+ Variable first, Variable last) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ virtual Coefficient_traits::const_reference get(dimension_type i) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ virtual void set(dimension_type i, Coefficient_traits::const_reference n) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ virtual bool all_zeroes(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ virtual dimension_type
+ num_zeroes(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ virtual Coefficient gcd(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ virtual void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ virtual void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, dimension_type i) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ virtual dimension_type last_nonzero() const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ virtual dimension_type
+ last_nonzero(dimension_type first, dimension_type last) const = 0;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ virtual dimension_type
+ first_nonzero(dimension_type first, dimension_type last) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+ \f$0\f$, disregarding coefficients of variables in \p vars.
+ */
+ virtual bool
+ all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ virtual int
+ scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ virtual void
+ has_a_free_dimension_helper(std::set<dimension_type>& x) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Dense_Row& row) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Sparse_Row& row) const = 0;
+};
+
+#endif // !defined(PPL_Linear_Expression_Interface_defs_hh)
diff --git a/src/Linear_Expression_Interface_types.hh b/src/Linear_Expression_Interface_types.hh
new file mode 100644
index 0000000..0a62b78
--- /dev/null
+++ b/src/Linear_Expression_Interface_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_Interface_types_hh
+#define PPL_Linear_Expression_Interface_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression_Interface;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Interface_types_hh)
diff --git a/src/Linear_Expression_defs.hh b/src/Linear_Expression_defs.hh
new file mode 100644
index 0000000..02b43e3
--- /dev/null
+++ b/src/Linear_Expression_defs.hh
@@ -0,0 +1,928 @@
+/* Linear_Expression class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_defs_hh
+#define PPL_Linear_Expression_defs_hh 1
+
+#include "Linear_Expression_types.hh"
+
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Linear_System_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Coefficient_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "PIP_Problem_types.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "Scalar_Products_types.hh"
+#include "MIP_Problem_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "termination_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Expression_Hide_Inhomo_types.hh"
+#include "Expression_Hide_Last_types.hh"
+
+#include "Linear_Expression_Interface_defs.hh"
+#include "Variable_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n / \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Assigns to \p e its own negation.
+/*! \relates Linear_Expression */
+void
+neg_assign(Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+//! Sums \p e2 multiplied by \p factor into \p e1.
+/*! \relates Linear_Expression */
+void add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+//! Subtracts \p e2 multiplied by \p factor from \p e1.
+/*! \relates Linear_Expression */
+void sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Expression
+
+ \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise
+
+ The order is a lexicographic. It starts comparing the variables' coefficient,
+ starting from Variable(0), and at the end it compares the inhomogeneous
+ terms.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Linear_Expression& x, const Linear_Expression& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Expression represents the linear expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+
+ \par How to build a linear expression.
+
+ Linear expressions are the basic blocks for defining
+ both constraints (i.e., linear equalities or inequalities)
+ and generators (i.e., lines, rays, points and closure points).
+ A full set of functions is defined to provide a convenient interface
+ for building complex linear expressions starting from simpler ones
+ and from objects of the classes Variable and Coefficient:
+ available operators include unary negation,
+ binary addition and subtraction,
+ as well as multiplication by a Coefficient.
+ The space dimension of a linear expression is defined as the maximum
+ space dimension of the arguments used to build it:
+ in particular, the space dimension of a Variable <CODE>x</CODE>
+ is defined as <CODE>x.id()+1</CODE>,
+ whereas all the objects of the class Coefficient have space dimension zero.
+
+ \par Example
+ The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+ having space dimension \f$3\f$:
+ \code
+ Linear_Expression e = 4*x - 2*y - z + 14;
+ \endcode
+ Another way to build the same linear expression is:
+ \code
+ Linear_Expression e1 = 4*x;
+ Linear_Expression e2 = 2*y;
+ Linear_Expression e3 = z;
+ Linear_Expression e = Linear_Expression(14);
+ e += e1 - e2 - e3;
+ \endcode
+ Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+ respectively; also, in the fourth line of code, \p e is created
+ with space dimension zero and then extended to space dimension 3
+ in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression {
+public:
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: returns a copy of Linear_Expression::zero().
+ explicit Linear_Expression(Representation r = default_representation);
+
+ /*! \brief Ordinary copy constructor.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily the default_representation).
+ */
+ Linear_Expression(const Linear_Expression& e);
+
+ //! Copy constructor that takes also a Representation.
+ Linear_Expression(const Linear_Expression& e, Representation r);
+
+ // Queried by expression adapters.
+ typedef const Linear_Expression& const_reference;
+ typedef Linear_Expression raw_type;
+
+ /*! \brief Copy constructor from a linear expression adapter.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily the default_representation).
+ */
+ template <typename LE_Adapter>
+ explicit
+ Linear_Expression(const LE_Adapter& e,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief Copy constructor from a linear expression adapter that takes a
+ Representation.
+ */
+ template <typename LE_Adapter>
+ Linear_Expression(const LE_Adapter& e, Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief
+ Copy constructor from a linear expression adapter that takes a
+ space dimension.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily default_representation).
+ */
+ template <typename LE_Adapter>
+ explicit
+ Linear_Expression(const LE_Adapter& e, dimension_type space_dim,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief
+ Copy constructor from a linear expression adapter that takes a
+ space dimension and a Representation.
+ */
+ template <typename LE_Adapter>
+ Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim, Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ //! Assignment operator.
+ Linear_Expression& operator=(const Linear_Expression& e);
+
+ //! Destructor.
+ ~Linear_Expression();
+
+ /*! \brief
+ Builds the linear expression corresponding
+ to the inhomogeneous term \p n.
+ */
+ explicit Linear_Expression(Coefficient_traits::const_reference n,
+ Representation r = default_representation);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+ Linear_Expression(Variable v, Representation r = default_representation);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! A const %iterator on the expression (homogeneous) coefficient that are
+ //! nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator {
+ private:
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ //! Constructs an invalid const_iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator();
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const const_iterator& itr);
+
+ ~const_iterator();
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const const_iterator& itr);
+
+ //! Navigates to the next nonzero coefficient.
+ /*!
+ This method takes \f$O(n)\f$ time for dense expressions, and
+ \f$O(1)\f$ time for sparse expressions.
+ */
+ const_iterator& operator++();
+
+ //! Navigates to the previous nonzero coefficient.
+ /*!
+ This method takes \f$O(n)\f$ time for dense expressions, and
+ \f$O(1)\f$ time for sparse expressions.
+ */
+ const_iterator& operator--();
+
+ //! Returns the current element.
+ reference operator*() const;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ Variable variable() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& x) const;
+
+ private:
+ //! Constructor from a const_iterator_interface*.
+ //! The new object takes ownership of the dynamic object.
+ const_iterator(Linear_Expression_Interface::const_iterator_interface* itr);
+
+ Linear_Expression_Interface::const_iterator_interface* itr;
+
+ friend class Linear_Expression;
+ };
+
+ //! Returns an iterator that points to the first nonzero coefficient in the
+ //! expression.
+ const_iterator begin() const;
+
+ //! Returns an iterator that points to the last nonzero coefficient in the
+ //! expression.
+ const_iterator end() const;
+
+ //! Returns an iterator that points to the first nonzero coefficient of a
+ //! variable bigger than or equal to v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the maximum space dimension a Linear_Expression can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ void set_space_dimension(dimension_type n);
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ void set_coefficient(Variable v,
+ Coefficient_traits::const_reference n);
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ void linear_combine(const Linear_Expression& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! c1 and c2 are not 0.
+ void linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ void linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the (zero-dimension space) constant 0.
+ static const Linear_Expression& zero();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_Expression& y);
+
+ //! Copy constructor with a specified space dimension.
+ Linear_Expression(const Linear_Expression& e, dimension_type space_dim);
+
+ //! Copy constructor with a specified space dimension and representation.
+ Linear_Expression(const Linear_Expression& e, dimension_type space_dim,
+ Representation r);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ bool is_equal_to(const Linear_Expression& x) const;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ void normalize();
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ void sign_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+private:
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the (zero-dimension space) constant 0.
+ */
+ static const Linear_Expression* zero_p;
+
+ Linear_Expression_Interface* impl;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with
+ the constructor Linear_Expression(Coefficient_traits::const_reference n).
+ */
+ Linear_Expression(dimension_type space_dim, bool,
+ Representation r = default_representation);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ void set(dimension_type i, Coefficient_traits::const_reference n);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the coefficient of v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the coefficient of v to n.
+ void set(Variable v, Coefficient_traits::const_reference n);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ void linear_combine(const Linear_Expression& y, dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). It assumes that c1 and c2 are nonzero.
+ void linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ void linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end);
+
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i.
+ void scalar_product_assign(Coefficient& result,
+ const Linear_Expression& y) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ void scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i], for each i.
+ int scalar_product_sign(const Linear_Expression& y) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ int scalar_product_sign(const Linear_Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ bool is_equal_to(const Linear_Expression& x,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ bool is_equal_to(const Linear_Expression& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets `row' to a copy of the row that implements *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets `row' to a copy of the row that implements *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ bool have_a_common_variable(const Linear_Expression& x,
+ Variable first, Variable last) const;
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ void negate(dimension_type first, dimension_type last);
+
+ template <typename Row>
+ friend class Linear_Expression_Impl;
+
+ // NOTE: The following classes are friends of Linear_Expression in order
+ // to access its private methods.
+ // Since they are *not* friend of Linear_Expression_Impl, they can only
+ // access its public methods so they cannot break the class invariant of
+ // Linear_Expression_Impl.
+ friend class Grid;
+ friend class Congruence;
+ friend class Polyhedron;
+ friend class PIP_Tree_Node;
+ friend class Grid_Generator;
+ friend class Generator;
+ friend class Constraint;
+ friend class Constraint_System;
+ friend class PIP_Problem;
+ friend class BHRZ03_Certificate;
+ friend class Scalar_Products;
+ friend class MIP_Problem;
+ friend class Box_Helpers;
+ friend class Congruence_System;
+ friend class BD_Shape_Helpers;
+ friend class Octagonal_Shape_Helper;
+ friend class Termination_Helpers;
+ template <typename T>
+ friend class BD_Shape;
+ template <typename T>
+ friend class Octagonal_Shape;
+ template <typename T>
+ friend class Linear_System;
+ template <typename T>
+ friend class Box;
+ template <typename T>
+ friend class Expression_Adapter;
+ template <typename T>
+ friend class Expression_Hide_Inhomo;
+ template <typename T>
+ friend class Expression_Hide_Last;
+
+ friend Linear_Expression
+ operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression
+ operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression
+ operator+(Variable v, const Linear_Expression& e);
+ friend Linear_Expression
+ operator+(Variable v, Variable w);
+
+ friend Linear_Expression
+ operator-(const Linear_Expression& e);
+
+ friend Linear_Expression
+ operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression
+ operator-(Variable v, Variable w);
+ friend Linear_Expression
+ operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression
+ operator-(Variable v, const Linear_Expression& e);
+ friend Linear_Expression
+ operator-(const Linear_Expression& e, Variable v);
+
+ friend Linear_Expression
+ operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e, Variable v);
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e, Variable v);
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression&
+ operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend void
+ neg_assign(Linear_Expression& e);
+
+ friend Linear_Expression&
+ add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+ friend Linear_Expression&
+ sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+ friend void
+ add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+ friend void
+ sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+ friend int
+ compare(const Linear_Expression& x, const Linear_Expression& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<(std::ostream& s, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression */
+void swap(Linear_Expression& x, Linear_Expression& y);
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression::const_iterator */
+void swap(Linear_Expression::const_iterator& x,
+ Linear_Expression::const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Linear_Expression_inlines.hh"
+
+#endif // !defined(PPL_Linear_Expression_defs_hh)
diff --git a/src/Linear_Expression_inlines.hh b/src/Linear_Expression_inlines.hh
new file mode 100644
index 0000000..3641fe0
--- /dev/null
+++ b/src/Linear_Expression_inlines.hh
@@ -0,0 +1,822 @@
+/* Linear_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_inlines_hh
+#define PPL_Linear_Expression_inlines_hh 1
+
+#include "Expression_Adapter_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline Linear_Expression&
+Linear_Expression::operator=(const Linear_Expression& e) {
+ Linear_Expression tmp = e;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+ delete impl;
+}
+
+inline Representation
+Linear_Expression::representation() const {
+ return impl->representation();
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+ return impl->space_dimension();
+}
+
+inline void
+Linear_Expression::set_space_dimension(dimension_type n) {
+ impl->set_space_dimension(n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+ return impl->coefficient(v);
+}
+
+inline void
+Linear_Expression
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+ impl->set_coefficient(v, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+ return impl->inhomogeneous_term();
+}
+
+inline void
+Linear_Expression
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+ impl->set_inhomogeneous_term(n);
+}
+
+inline void
+Linear_Expression::swap_space_dimensions(Variable v1, Variable v2) {
+ impl->swap_space_dimensions(v1, v2);
+}
+
+inline void
+Linear_Expression::shift_space_dimensions(Variable v, dimension_type n) {
+ impl->shift_space_dimensions(v, n);
+}
+
+inline bool
+Linear_Expression::is_zero() const {
+ return impl->is_zero();
+}
+
+inline bool
+Linear_Expression::all_homogeneous_terms_are_zero() const {
+ return impl->all_homogeneous_terms_are_zero();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+ PPL_ASSERT(zero_p != 0);
+ return *zero_p;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+ return impl->total_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x += n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+ Linear_Expression x = e;
+ x += v;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x -= n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("Linear_Expression "
+ "PPL::operator+(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ if (v_space_dim >= w_space_dim) {
+ Linear_Expression e(v);
+ e -= w;
+ return e;
+ }
+ else {
+ Linear_Expression e(w.space_dimension(), true);
+ e -= w;
+ e += v;
+ return e;
+ }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x *= n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl += n;
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl -= n;
+ return e;
+}
+
+inline void
+Linear_Expression::m_swap(Linear_Expression& y) {
+ using std::swap;
+ swap(impl, y.impl);
+}
+
+inline void
+Linear_Expression::normalize() {
+ impl->normalize();
+}
+
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+ impl->ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+ return impl->ascii_load(s);
+}
+
+inline void
+Linear_Expression::remove_space_dimensions(const Variables_Set& vars) {
+ impl->remove_space_dimensions(vars);
+}
+
+inline void
+Linear_Expression::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ impl->permute_space_dimensions(cycle);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+ if (e1.space_dimension() >= e2.space_dimension()) {
+ Linear_Expression e = e1;
+ e += e2;
+ return e;
+ }
+ else {
+ Linear_Expression e = e2;
+ e += e1;
+ return e;
+ }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+ return e + v;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ return e + n;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("Linear_Expression "
+ "PPL::operator+(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ if (v_space_dim >= w_space_dim) {
+ Linear_Expression e(v);
+ e += w;
+ return e;
+ }
+ else {
+ Linear_Expression e(w);
+ e += v;
+ return e;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e) {
+ Linear_Expression r(e);
+ neg_assign(r);
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+ if (e1.space_dimension() >= e2.space_dimension()) {
+ Linear_Expression e = e1;
+ e -= e2;
+ return e;
+ }
+ else {
+ Linear_Expression e = e2;
+ neg_assign(e);
+ e += e1;
+ return e;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+ Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+ result.negate(0, e.space_dimension() + 1);
+ result += v;
+ return result;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+ Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+ result -= v;
+ return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ Linear_Expression result(e);
+ neg_assign(result);
+ result += n;
+ return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator*(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ return e * n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+ *e1.impl += *e2.impl;
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, const Variable v) {
+ *e.impl += v;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+ *e1.impl -= *e2.impl;
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, const Variable v) {
+ *e.impl -= v;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl *= n;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl /= n;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+neg_assign(Linear_Expression& e) {
+ e.impl->negate();
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ const Variable v) {
+ e.impl->add_mul_assign(n, v);
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ const Variable v) {
+ e.impl->sub_mul_assign(n, v);
+ return e;
+}
+
+inline void
+add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2) {
+ e1.impl->add_mul_assign(factor, *e2.impl);
+}
+
+inline void
+sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2) {
+ e1.impl->sub_mul_assign(factor, *e2.impl);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(dimension_type i) const {
+ return impl->get(i);
+}
+
+inline void
+Linear_Expression::set(dimension_type i,
+ Coefficient_traits::const_reference n) {
+ impl->set(i, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(Variable v) const {
+ return impl->get(v.space_dimension());
+}
+
+inline void
+Linear_Expression::set(Variable v,
+ Coefficient_traits::const_reference n) {
+ impl->set(v.space_dimension(), n);
+}
+
+inline bool
+Linear_Expression::all_zeroes(dimension_type start, dimension_type end) const {
+ return impl->all_zeroes(start, end);
+}
+
+inline dimension_type
+Linear_Expression::num_zeroes(dimension_type start, dimension_type end) const {
+ return impl->num_zeroes(start, end);
+}
+
+inline Coefficient
+Linear_Expression::gcd(dimension_type start, dimension_type end) const {
+ return impl->gcd(start, end);
+}
+
+inline void
+Linear_Expression
+::exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ impl->exact_div_assign(c, start, end);
+}
+
+inline void
+Linear_Expression
+::mul_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ impl->mul_assign(c, start, end);
+}
+
+inline void
+Linear_Expression::sign_normalize() {
+ impl->sign_normalize();
+}
+
+inline void
+Linear_Expression::negate(dimension_type first, dimension_type last) {
+ impl->negate(first, last);
+}
+
+inline bool
+Linear_Expression::all_zeroes(const Variables_Set& vars) const {
+ return impl->all_zeroes(vars);
+}
+
+inline bool
+Linear_Expression::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start,
+ dimension_type end) const {
+ return impl->all_zeroes_except(vars, start, end);
+}
+
+inline dimension_type
+Linear_Expression::last_nonzero() const {
+ return impl->last_nonzero();
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y) const {
+ scalar_product_assign(result, y, 0, space_dimension() + 1);
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+ dimension_type start, dimension_type end) const {
+ impl->scalar_product_assign(result, *(y.impl), start, end);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y) const {
+ return scalar_product_sign(y, 0, space_dimension() + 1);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y,
+ dimension_type start, dimension_type end) const {
+ return impl->scalar_product_sign(*(y.impl), start, end);
+}
+
+inline dimension_type
+Linear_Expression
+::first_nonzero(dimension_type first, dimension_type last) const {
+ return impl->first_nonzero(first, last);
+}
+
+inline dimension_type
+Linear_Expression
+::last_nonzero(dimension_type first, dimension_type last) const {
+ return impl->last_nonzero(first, last);
+}
+
+inline void
+Linear_Expression
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ return impl->has_a_free_dimension_helper(x);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+ dimension_type start, dimension_type end) const {
+ return impl->is_equal_to(*(x.impl), start, end);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ return impl->is_equal_to(*(x.impl), c1, c2, start, end);
+}
+
+inline void
+Linear_Expression
+::get_row(Dense_Row& row) const {
+ return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::get_row(Sparse_Row& row) const {
+ return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y, dimension_type i) {
+ impl->linear_combine(*y.impl, i);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ impl->linear_combine(*y.impl, c1, c2);
+}
+
+inline void
+Linear_Expression
+::linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ impl->linear_combine_lax(*y.impl, c1, c2);
+}
+
+inline int
+compare(const Linear_Expression& x, const Linear_Expression& y) {
+ return x.impl->compare(*y.impl);
+}
+
+inline bool
+Linear_Expression::is_equal_to(const Linear_Expression& x) const {
+ return impl->is_equal_to(*x.impl);
+}
+
+inline void
+Linear_Expression::linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start,
+ dimension_type end) {
+ impl->linear_combine(*y.impl, c1, c2, start, end);
+}
+
+inline void
+Linear_Expression::linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start,
+ dimension_type end) {
+ impl->linear_combine_lax(*y.impl, c1, c2, start, end);
+}
+
+inline bool
+Linear_Expression
+::have_a_common_variable(const Linear_Expression& x,
+ Variable first, Variable last) const {
+ return impl->have_a_common_variable(*(x.impl), first, last);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator()
+ : itr(NULL) {
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(const const_iterator& x)
+ : itr(x.itr->clone()) {
+}
+
+inline
+Linear_Expression::const_iterator
+::~const_iterator() {
+ // Note that this does nothing if itr==NULL.
+ delete itr;
+}
+
+inline void
+Linear_Expression::const_iterator::m_swap(const_iterator& x) {
+ using std::swap;
+ swap(itr, x.itr);
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator=(const const_iterator& itr) {
+ const_iterator tmp = itr;
+ using std::swap;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator++() {
+ PPL_ASSERT(itr != NULL);
+ ++(*itr);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator--() {
+ PPL_ASSERT(itr != NULL);
+ --(*itr);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator::reference
+Linear_Expression::const_iterator
+::operator*() const {
+ PPL_ASSERT(itr != NULL);
+ return *(*itr);
+}
+
+inline Variable
+Linear_Expression::const_iterator
+::variable() const {
+ PPL_ASSERT(itr != NULL);
+ return itr->variable();
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator==(const const_iterator& x) const {
+ PPL_ASSERT(itr != NULL);
+ PPL_ASSERT(x.itr != NULL);
+ return *itr == *(x.itr);
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(Linear_Expression_Interface::const_iterator_interface* itr)
+ : itr(itr) {
+ PPL_ASSERT(itr != NULL);
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::begin() const {
+ return const_iterator(impl->begin());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::end() const {
+ return const_iterator(impl->end());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::lower_bound(Variable v) const {
+ return const_iterator(impl->lower_bound(v));
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(e.representation());
+ tmp.set_space_dimension(e.space_dimension());
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ for (typename LE_Adapter::const_iterator i = e.begin(),
+ i_end = e.end(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(r);
+ tmp.set_space_dimension(e.space_dimension());
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ for (typename LE_Adapter::const_iterator i = e.begin(),
+ i_end = e.end(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(e.representation());
+ tmp.set_space_dimension(space_dim);
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ typedef typename LE_Adapter::const_iterator itr_t;
+ itr_t i_end;
+ if (space_dim <= e.space_dimension())
+ i_end = e.lower_bound(Variable(space_dim));
+ else
+ i_end = e.end();
+ for (itr_t i = e.begin(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim,
+ Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(r);
+ tmp.set_space_dimension(space_dim);
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ typedef typename LE_Adapter::const_iterator itr_t;
+ itr_t i_end;
+ if (space_dim <= e.space_dimension())
+ i_end = e.lower_bound(Variable(space_dim));
+ else
+ i_end = e.end();
+ for (itr_t i = e.begin(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression& e) {
+ e.impl->print(s);
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Linear_Expression& x, Linear_Expression& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Linear_Expression::const_iterator */
+inline void
+swap(Linear_Expression::const_iterator& x,
+ Linear_Expression::const_iterator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_inlines_hh)
diff --git a/src/Linear_Expression_types.hh b/src/Linear_Expression_types.hh
new file mode 100644
index 0000000..b2f216a
--- /dev/null
+++ b/src/Linear_Expression_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_types_hh
+#define PPL_Linear_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_types_hh)
diff --git a/src/Linear_Form.cc b/src/Linear_Form.cc
new file mode 100644
index 0000000..8ed57e6
--- /dev/null
+++ b/src/Linear_Form.cc
@@ -0,0 +1,26 @@
+/* Linear_Form class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+#include "ppl-config.h"
+#include "Linear_Form_defs.hh"
diff --git a/src/Linear_Form_defs.hh b/src/Linear_Form_defs.hh
new file mode 100644
index 0000000..57d75c7
--- /dev/null
+++ b/src/Linear_Form_defs.hh
@@ -0,0 +1,499 @@
+/* Linear_Form class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_defs_hh
+#define PPL_Linear_Form_defs_hh 1
+
+#include "Linear_Form_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Variable_defs.hh"
+#include "Box_types.hh"
+#include "Float_defs.hh"
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Form */
+template <typename C>
+void swap(Linear_Form<C>& x, Linear_Form<C>& y);
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear form \p f1 + \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f);
+
+//! Returns the linear form - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f);
+
+//! Returns the linear form \p f1 - \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f * \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 + \p f2 and assigns it to \p e1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f + \p v and assigns it to \p f.
+/*! \relates Linear_Form
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f + \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 - \p f2 and assigns it to \p f1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f - \p v and assigns it to \p f.
+/*! \relates Linear_Form
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f - \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f / \p n and assigns it to \p f.
+/*!
+ \relates Linear_Form
+ Performs the division of a linear form by a scalar. It is up to the user to
+ ensure that division by 0 is not performed.
+*/
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream& operator<<(std::ostream& s, const Linear_Form<C>& f);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear form with interval coefficients.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Form represents the interval linear form
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the inhomogeneous term.
+ The coefficients and the inhomogeneous term of the linear form
+ have the template parameter \p C as their type. \p C must be the
+ type of an Interval.
+
+ \par How to build a linear form.
+ A full set of functions is defined in order to provide a convenient
+ interface for building complex linear forms starting from simpler ones
+ and from objects of the classes Variable and \p C. Available operators
+ include binary addition and subtraction, as well as multiplication and
+ division by a coefficient.
+ The space dimension of a linear form is defined as
+ the highest variable dimension among variables that have a nonzero
+ coefficient in the linear form, or zero if no such variable exists.
+ The space dimension for each variable \f$x_i\f$ is given by \f$i + 1\f$.
+
+ \par Example
+ Given the type \p T of an Interval with floating point coefficients (though
+ any integral type may also be used), the following code builds the interval
+ linear form \f$lf = x_5 - x_2 + 1\f$ with space dimension 6:
+ \code
+ Variable x5(5);
+ Variable x2(2);
+ T x5_coefficient;
+ x5_coefficient.lower() = 2.0;
+ x5_coefficient.upper() = 3.0;
+ T inhomogeneous_term;
+ inhomogeneous_term.lower() = 4.0;
+ inhomogeneous_term.upper() = 8.0;
+ Linear_Form<T> lf(x2);
+ lf = -lf;
+ lf += Linear_Form<T>(x2);
+ Linear_Form<T> lf_x5(x5);
+ lf_x5 *= x5_coefficient;
+ lf += lf_x5;
+ \endcode
+ Note that \c lf_x5 is created with space dimension 6, while \c lf is
+ created with space dimension 0 and then extended first to space
+ dimension 2 when \c x2 is subtracted and finally to space dimension
+ 6 when \c lf_x5 is added.
+*/
+template <typename C>
+class Parma_Polyhedra_Library::Linear_Form {
+public:
+ //! Default constructor: returns a copy of Linear_Form::zero().
+ Linear_Form();
+
+ //! Ordinary copy constructor.
+ Linear_Form(const Linear_Form& f);
+
+ //! Destructor.
+ ~Linear_Form();
+
+ //! Builds the linear form corresponding to the inhomogeneous term \p n.
+ explicit Linear_Form(const C& n);
+
+ //! Builds the linear form corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+ Linear_Form(Variable v);
+
+ //! Builds a linear form approximating the linear expression \p e.
+ Linear_Form(const Linear_Expression& e);
+
+ //! Returns the maximum space dimension a Linear_Form can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ const C& coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ const C& inhomogeneous_term() const;
+
+ //! Negates all the coefficients of \p *this.
+ void negate();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_Form& y);
+
+ // Floating point analysis related methods.
+
+ /*! \brief
+ Verifies if the linear form overflows.
+
+ \return
+ Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+ <CODE>true</CODE> otherwise.
+
+ \p T must be the type of possibly unbounded quantities.
+ */
+ bool overflows() const;
+
+ /*! \brief
+ Computes the relative error associated to floating point computations
+ that operate on a quantity that is overapproximated by \p *this.
+
+ \param analyzed_format The floating point format used by the analyzed
+ program.
+ \param result Becomes the linear form corresponding to the relative
+ error committed.
+
+ This method makes <CODE>result</CODE> become a linear form
+ obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+ on the linear form. This function is defined as:
+ \f[
+ \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+ \defeq
+ (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+ +
+ \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+ \amifp
+ [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+ \f]
+ where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+ \f$\beta\f$ the base.
+
+ The result is undefined if \p T is not the type of an interval with
+ floating point boundaries.
+ */
+ void relative_error(Floating_Point_Format analyzed_format,
+ Linear_Form& result) const;
+
+ /*! \brief
+ Makes \p result become an interval that overapproximates all the
+ possible values of \p *this.
+
+ \param oracle The FP_Oracle to be queried.
+ \param result The linear form that will store the result.
+
+ \return <CODE>true</CODE> if the operation was successful,
+ <CODE>false</CODE> otherwise (the possibility of failure
+ depends on the oracle's implementation).
+
+ \par Template type parameters
+
+ - The class template parameter \p Target specifies the implementation
+ of Concrete_Expression to be used.
+
+ This method makes <CODE>result</CODE> become
+ \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+ \f[
+ \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+ \defeq
+ i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+ \rho^{\#}(v)\right)
+ \f]
+ where \f$\rho^{\#}(v)\f$ is an interval (provided by the oracle)
+ that correctly approximates the value of \f$v\f$.
+
+ The result is undefined if \p C is not the type of an interval with
+ floating point boundaries.
+ */
+ template <typename Target>
+ bool intervalize(const FP_Oracle<Target,C>& oracle, C& result) const;
+
+private:
+ //! The generic coefficient equal to the singleton zero.
+ static C zero;
+
+ //! Type of the container vector.
+ typedef std::vector<C> vec_type;
+
+ //! The container vector.
+ vec_type vec;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with
+ the constructor Linear_Form(const C& n).
+ */
+ Linear_Form(dimension_type sz, bool);
+
+ /*! \brief
+ Builds the linear form corresponding to the difference of
+ \p v and \p w.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p v or the one of \p w exceed
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+ Linear_Form(Variable v, Variable w);
+
+ //! Gives the number of generic coefficients currently in use.
+ dimension_type size() const;
+
+ //! Extends the vector of \p *this to size \p sz.
+ void extend(dimension_type sz);
+
+ //! Returns a reference to \p vec[i].
+ C& operator[](dimension_type i);
+
+ //! Returns a const reference to \p vec[i].
+ const C& operator[](dimension_type i) const;
+
+ friend Linear_Form<C>
+ operator+<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>
+ operator+<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator+<C>(const Linear_Form<C>& f, const C& n);
+ friend Linear_Form<C>
+ operator+<C>(Variable v, const Linear_Form<C>& f);
+
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f);
+
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>
+ operator-<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f, const C& n);
+ friend Linear_Form<C>
+ operator-<C>(Variable v, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f, Variable v);
+
+ friend Linear_Form<C>
+ operator*<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator*<C>(const Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f, Variable v);
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f, Variable v);
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator*=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator/=<C>(Linear_Form<C>& f, const C& n);
+
+ friend bool
+ operator==<C>(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<C>(std::ostream& s, const Linear_Form<C>& f);
+};
+
+#include "Linear_Form_inlines.hh"
+// Linear_Form_templates.hh is not included here on purpose.
+
+#endif // !defined(PPL_Linear_Form_defs_hh)
diff --git a/src/Linear_Form_inlines.hh b/src/Linear_Form_inlines.hh
new file mode 100644
index 0000000..2ab24b1
--- /dev/null
+++ b/src/Linear_Form_inlines.hh
@@ -0,0 +1,252 @@
+/* Linear_Form class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_inlines_hh
+#define PPL_Linear_Form_inlines_hh 1
+
+#include "Variable_defs.hh"
+#include <iostream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::max_space_dimension() {
+ return vec_type().max_size() - 1;
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form()
+ : vec(1, zero) {
+ vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(dimension_type sz, bool)
+ : vec(sz, zero) {
+ vec.reserve(compute_capacity(sz, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const Linear_Form& f)
+ : vec(f.vec) {
+}
+
+template <typename C>
+inline
+Linear_Form<C>::~Linear_Form() {
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::size() const {
+ return vec.size();
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::extend(dimension_type sz) {
+ assert(sz > size());
+ vec.reserve(compute_capacity(sz, vec_type().max_size()));
+ vec.resize(sz, zero);
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const C& n)
+ : vec(1, n) {
+ vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::space_dimension() const {
+ return size() - 1;
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return zero;
+ return vec[v.id()+1];
+}
+
+template <typename C>
+inline C&
+Linear_Form<C>::operator[](dimension_type i) {
+ assert(i < size());
+ return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::operator[](dimension_type i) const {
+ assert(i < size());
+ return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::inhomogeneous_term() const {
+ return vec[0];
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f) {
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n) {
+ return n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const Variable v) {
+ return v + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n) {
+ return -n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Variable v, const Variable w) {
+ return Linear_Form<C>(v, w);
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n) {
+ return n * f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n) {
+ f[0] += n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n) {
+ f[0] -= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+ return !(x == y);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::m_swap(Linear_Form& y) {
+ using std::swap;
+ swap(vec, y.vec);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::ascii_dump(std::ostream& s) const {
+ using namespace IO_Operators;
+ dimension_type space_dim = space_dimension();
+ s << space_dim << "\n";
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ const char separator = ' ';
+ s << vec[i] << separator;
+ }
+ s << "\n";
+}
+
+template <typename C>
+inline bool
+Linear_Form<C>::ascii_load(std::istream& s) {
+ using namespace IO_Operators;
+ dimension_type new_dim;
+ if (!(s >> new_dim))
+ return false;
+
+ vec.resize(new_dim + 1, zero);
+ for (dimension_type i = 0; i <= new_dim; ++i) {
+ if (!(s >> vec[i]))
+ return false;
+ }
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+inline bool
+Linear_Form<C>::overflows() const {
+ if (!inhomogeneous_term().is_bounded())
+ return true;
+
+ for (dimension_type i = space_dimension(); i-- > 0; ) {
+ if (!coefficient(Variable(i)).is_bounded())
+ return true;
+ }
+
+ return false;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline void
+swap(Linear_Form<C>& x, Linear_Form<C>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_inlines_hh)
diff --git a/src/Linear_Form_templates.hh b/src/Linear_Form_templates.hh
new file mode 100644
index 0000000..724b89f
--- /dev/null
+++ b/src/Linear_Form_templates.hh
@@ -0,0 +1,527 @@
+/* Linear_Form class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_templates_hh
+#define PPL_Linear_Form_templates_hh 1
+
+#include "Linear_Form_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Box_defs.hh"
+#include <stdexcept>
+#include <iostream>
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v)
+ : vec() {
+ const dimension_type space_dim = v.space_dimension();
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1, zero);
+ vec[v.space_dimension()] = C(typename C::boundary_type(1));
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v, const Variable w)
+ : vec() {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1, zero);
+ if (v_space_dim != w_space_dim) {
+ vec[v_space_dim] = C(typename C::boundary_type(1));
+ vec[w_space_dim] = C(typename C::boundary_type(-1));
+ }
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Linear_Expression& e)
+ : vec() {
+ const dimension_type space_dim = e.space_dimension();
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(e):\n"
+ "e exceeds the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1);
+ for (dimension_type i = space_dim; i-- > 0; )
+ vec[i+1] = e.coefficient(Variable(i));
+ vec[0] = e.inhomogeneous_term();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ dimension_type min_size;
+ dimension_type max_size;
+ const Linear_Form<C>* p_e_max;
+ if (f1_size > f2_size) {
+ min_size = f2_size;
+ max_size = f1_size;
+ p_e_max = &f1;
+ }
+ else {
+ min_size = f1_size;
+ max_size = f2_size;
+ p_e_max = &f2;
+ }
+
+ Linear_Form<C> r(max_size, false);
+ dimension_type i = max_size;
+ while (i > min_size) {
+ --i;
+ r[i] = p_e_max->vec[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] += f2[i];
+ }
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Variable v, const Linear_Form<C>& f) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator+(v, f):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ r[v_space_dim] += C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ r[0] += n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size > f2_size) {
+ Linear_Form<C> r(f1_size, false);
+ dimension_type i = f1_size;
+ while (i > f2_size) {
+ --i;
+ r[i] = f1[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] -= f2[i];
+ }
+ return r;
+ }
+ else {
+ Linear_Form<C> r(f2_size, false);
+ dimension_type i = f2_size;
+ while (i > f1_size) {
+ --i;
+ r[i].neg_assign(f2[i]);
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] -= f2[i];
+ }
+ return r;
+ }
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Variable v, const Linear_Form<C>& f) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator-(v, e):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ r[v_space_dim] += C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator-(e, v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ r[v_space_dim] -= C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ r[0] += n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i] *= n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size < f2_size)
+ f1.extend(f2_size);
+ for (dimension_type i = f2_size; i-- > 0; )
+ f1[i] += f2[i];
+ return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form<C>& "
+ "operator+=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (v_space_dim > f.space_dimension())
+ f.extend(v_space_dim+1);
+ f[v_space_dim] += C(typename C::boundary_type(1));
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size < f2_size)
+ f1.extend(f2_size);
+ for (dimension_type i = f2_size; i-- > 0; )
+ f1[i] -= f2[i];
+ return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form<C>& "
+ "operator-=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (v_space_dim > f.space_dimension())
+ f.extend(v_space_dim+1);
+ f[v_space_dim] -= C(typename C::boundary_type(1));
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n) {
+ dimension_type f_size = f.size();
+ for (dimension_type i = f_size; i-- > 0; )
+ f[i] *= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n) {
+ dimension_type f_size = f.size();
+ for (dimension_type i = f_size; i-- > 0; )
+ f[i] /= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+ const dimension_type x_size = x.size();
+ const dimension_type y_size = y.size();
+ if (x_size >= y_size) {
+ for (dimension_type i = y_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ for (dimension_type i = x_size; --i >= y_size; )
+ if (x[i] != x.zero)
+ return false;
+
+ }
+ else {
+ for (dimension_type i = x_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ for (dimension_type i = y_size; --i >= x_size; )
+ if (y[i] != x.zero)
+ return false;
+
+ }
+
+ return true;
+}
+
+template <typename C>
+void
+Linear_Form<C>::negate() {
+ for (dimension_type i = vec.size(); i-- > 0; )
+ vec[i].neg_assign(vec[i]);
+ return;
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::external_memory_in_bytes() const {
+ memory_size_type n = 0;
+ for (dimension_type i = size(); i-- > 0; )
+ n += vec[i].external_memory_in_bytes();
+ n += vec.capacity()*sizeof(C);
+ return n;
+}
+
+template <typename C>
+bool
+Linear_Form<C>::OK() const {
+ for (dimension_type i = size(); i-- > 0; )
+ if (!vec[i].OK())
+ return false;
+ return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+void
+Linear_Form<C>::relative_error(
+ const Floating_Point_Format analyzed_format,
+ Linear_Form& result) const {
+ typedef typename C::boundary_type analyzer_format;
+
+ // Get the necessary information on the analyzed's format.
+ unsigned int f_base;
+ unsigned int f_mantissa_bits;
+ switch (analyzed_format) {
+ case IEEE754_HALF:
+ f_base = float_ieee754_half::BASE;
+ f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+ break;
+ case IEEE754_SINGLE:
+ f_base = float_ieee754_single::BASE;
+ f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+ break;
+ case IEEE754_DOUBLE:
+ f_base = float_ieee754_double::BASE;
+ f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+ break;
+ case IBM_SINGLE:
+ f_base = float_ibm_single::BASE;
+ f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+ break;
+ case IEEE754_QUAD:
+ f_base = float_ieee754_quad::BASE;
+ f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+ break;
+ case INTEL_DOUBLE_EXTENDED:
+ f_base = float_intel_double_extended::BASE;
+ f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ C error_propagator;
+ // We assume that f_base is a power of 2.
+ unsigned int u_power = msb_position(f_base) * f_mantissa_bits;
+ int neg_power = -static_cast<int>(u_power);
+ analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, neg_power));
+
+ error_propagator.build(i_constraint(GREATER_OR_EQUAL, -lb),
+ i_constraint(LESS_OR_EQUAL, lb));
+
+ // Handle the inhomogeneous term.
+ const C* current_term = &inhomogeneous_term();
+ assert(current_term->is_bounded());
+
+ C current_multiplier(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ Linear_Form current_result_term(current_multiplier);
+ current_result_term *= error_propagator;
+ result = Linear_Form(current_result_term);
+
+ // Handle the other terms.
+ dimension_type dimension = space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ current_term = &coefficient(Variable(i));
+ assert(current_term->is_bounded());
+ current_multiplier = C(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ current_result_term = Linear_Form(Variable(i));
+ current_result_term *= current_multiplier;
+ current_result_term *= error_propagator;
+ result += current_result_term;
+ }
+
+ return;
+}
+
+template <typename C>
+template <typename Target>
+bool
+Linear_Form<C>::intervalize(const FP_Oracle<Target,C>& oracle,
+ C& result) const {
+ result = C(inhomogeneous_term());
+ dimension_type dimension = space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ C current_addend = coefficient(Variable(i));
+ C curr_int;
+ if (!oracle.get_interval(i, curr_int))
+ return false;
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Linear_Form<C>& f) {
+ const dimension_type num_variables = f.space_dimension();
+ bool first = true;
+ for (dimension_type v = 0; v < num_variables; ++v) {
+ const C& fv = f[v+1];
+ if (fv != typename C::boundary_type(0)) {
+ if (first) {
+ if (fv == typename C::boundary_type(-1))
+ s << "-";
+ else if (fv != typename C::boundary_type(1))
+ s << fv << "*";
+ first = false;
+ }
+ else {
+ if (fv == typename C::boundary_type(-1))
+ s << " - ";
+ else {
+ s << " + ";
+ if (fv != typename C::boundary_type(1))
+ s << fv << "*";
+ }
+ }
+ s << Variable(v);
+ }
+ }
+ // Inhomogeneous term.
+ const C& it = f[0];
+ if (it != 0) {
+ if (!first)
+ s << " + ";
+ else
+ first = false;
+ s << it;
+ }
+
+ if (first)
+ // The null linear form.
+ s << Linear_Form<C>::zero;
+ return s;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(C, Linear_Form<C>)
+
+template <typename C>
+C Linear_Form<C>::zero(typename C::boundary_type(0));
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_templates_hh)
diff --git a/src/Linear_Form_types.hh b/src/Linear_Form_types.hh
new file mode 100644
index 0000000..97a1282
--- /dev/null
+++ b/src/Linear_Form_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Form_types_hh
+#define PPL_Linear_Form_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+class Linear_Form;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_types_hh)
diff --git a/src/Linear_System_defs.hh b/src/Linear_System_defs.hh
new file mode 100644
index 0000000..e2d5168
--- /dev/null
+++ b/src/Linear_System_defs.hh
@@ -0,0 +1,582 @@
+/* Linear_System class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_defs_hh
+#define PPL_Linear_System_defs_hh 1
+
+#include "Linear_System_types.hh"
+
+#include "Swapping_Vector_defs.hh"
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+
+#include "Polyhedron_types.hh"
+#include "Bit_Row_types.hh"
+#include "Bit_Matrix_types.hh"
+#include "Generator_System_types.hh"
+#include "Topology_types.hh"
+
+// TODO: Check how much of this description is still true.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+ An object of this class represents either a constraint system
+ or a generator system. Each Linear_System object can be viewed
+ as a finite sequence of strong-normalized Row objects,
+ where each Row implements a constraint or a generator.
+ Linear systems are characterized by the matrix of coefficients,
+ also encoding the number, size and capacity of Row objects,
+ as well as a few additional information, including:
+ - the topological kind of (all) the rows;
+ - an indication of whether or not some of the rows in the Linear_System
+ are <EM>pending</EM>, meaning that they still have to undergo
+ an (unspecified) elaboration; if there are pending rows, then these
+ form a proper suffix of the overall sequence of rows;
+ - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+ non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_System {
+public:
+
+ // NOTE: `iterator' is actually a const_iterator.
+ typedef typename Swapping_Vector<Row>::const_iterator iterator;
+ typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+ //! Builds an empty linear system with specified topology.
+ /*!
+ Rows size and capacity are initialized to \f$0\f$.
+ */
+ Linear_System(Topology topol, Representation r);
+
+ //! Builds a system with specified topology and dimensions.
+ /*!
+ \param topol
+ The topology of the system that will be created;
+
+ \param space_dim
+ The number of space dimensions of the system that will be created.
+
+ \param r
+ The representation for system's rows.
+
+ Creates a \p n_rows \f$\times\f$ \p space_dim system whose
+ coefficients are all zero and with the given topology.
+ */
+ Linear_System(Topology topol, dimension_type space_dim, Representation r);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A tag class.
+ /*! \ingroup PPL_CXX_interface
+ Tag class to differentiate the Linear_System copy constructor that
+ copies pending rows as pending from the one that transforms
+ pending rows into non-pending ones.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ struct With_Pending {
+ };
+
+ //! Copy constructor: pending rows are transformed into non-pending ones.
+ Linear_System(const Linear_System& y);
+
+ //! Copy constructor with specified representation. Pending rows are
+ //! transformed into non-pending ones.
+ Linear_System(const Linear_System& y, Representation r);
+
+ //! Full copy constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, With_Pending);
+
+ //! Full copy constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, Representation r, With_Pending);
+
+ //! Assignment operator: pending rows are transformed into non-pending ones.
+ Linear_System& operator=(const Linear_System& y);
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Linear_System& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Linear_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the rows in the system.
+ /*!
+ The computation of the space dimension correctly ignores
+ the column encoding the inhomogeneous terms of constraint
+ (resp., the divisors of generators);
+ if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+ also the column of the \f$\epsilon\f$-dimension coefficients
+ will be ignored.
+ */
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ // TODO: Consider removing this.
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ // TODO: Consider making this private.
+ //! Removes all the specified dimensions from the system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ // TODO: Consider making this private.
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a const reference to the \p k-th row of the system.
+ const Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ iterator begin();
+ iterator end();
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ bool has_no_rows() const;
+ dimension_type num_rows() const;
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ //! Sign-normalizes the system.
+ void sign_normalize();
+
+ //! \name Accessors
+ //@{
+ //! Returns the system topology.
+ Topology topology() const;
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+ //@} // Accessors
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ //! Sets the system topology to \p t .
+ void set_topology(Topology t);
+
+ //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+ void set_necessarily_closed();
+
+ //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ void set_not_necessarily_closed();
+
+ // TODO: Consider removing this, or making it private.
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ // TODO: Consider removing this, or making it private.
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ /*! \brief
+ Adds a copy of \p r to the system,
+ automatically resizing the system or the row's copy, if needed.
+ */
+ void insert(const Row& r);
+
+ /*! \brief
+ Adds a copy of the given row to the pending part of the system,
+ automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(const Row& r);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+ */
+ void insert(Row& r, Recycle_Input);
+
+ /*! \brief
+ Adds the given row to the pending part of the system, stealing its
+ contents and automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(Row& r, Recycle_Input);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Linear_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Linear_System& r);
+
+ //! Adds to \p *this a the rows of `y', stealing them from `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(Linear_System& r, Recycle_Input);
+
+ //! Adds the rows of `y' to the pending part of `*this', stealing them from
+ //! `y'.
+ void insert_pending(Linear_System& r, Recycle_Input);
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Sorts the rows (in growing order) form \p first_row to
+ \p last_row and eliminates duplicated ones.
+ */
+ void sort_rows(dimension_type first_row, dimension_type last_row);
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Linear_System& y);
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most space dimensions.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as to
+ simplify the linear system.
+ */
+ void simplify();
+
+ //! Clears the system deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Reads into a Linear_System object the information produced by the
+ output of ascii_dump(std::ostream&) const. The specialized methods
+ provided by Constraint_System and Generator_System take care of
+ properly reading the contents of the system.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! The vector that contains the rows.
+ /*!
+ \note This is public for convenience. Clients that modify if must preserve
+ the class invariant.
+ */
+ Swapping_Vector<Row> rows;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void remove_row_no_ok(dimension_type i, bool keep_sorted = false);
+
+ /*! \brief
+ Adds \p r to the pending part of the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void insert_pending_no_ok(Row& r, Recycle_Input);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void insert_no_ok(Row& r, Recycle_Input);
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ //! Swaps the [first,last) row interval with the
+ //! [first + offset, last + offset) interval.
+ /*!
+ These intervals may not be disjunct.
+
+ Sorting of these intervals is *not* preserved.
+
+ Either both intervals contain only not-pending rows, or they both
+ contain pending rows.
+ */
+ void swap_row_intervals(dimension_type first, dimension_type last,
+ dimension_type offset);
+
+ //! The space dimension of each row. All rows must have this number of
+ //! space dimensions.
+ dimension_type space_dimension_;
+
+ //! The topological kind of the rows in the system. All rows must have this
+ //! topology.
+ Topology row_topology;
+
+ //! The index of the first pending row.
+ dimension_type index_first_pending;
+
+ /*! \brief
+ <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+ <CODE>bool compare(const Row&, const Row&)</CODE>.
+ If <CODE>false</CODE> may not be sorted.
+ */
+ bool sorted;
+
+ Representation representation_;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ struct Row_Less_Than {
+ bool operator()(const Row& x, const Row& y) const;
+ };
+
+ //! Comparison predicate (used when implementing the unique algorithm).
+ struct Unique_Compare {
+ Unique_Compare(const Swapping_Vector<Row>& cont,
+ dimension_type base = 0);
+
+ bool operator()(dimension_type i, dimension_type j) const;
+
+ const Swapping_Vector<Row>& container;
+ const dimension_type base_index;
+ };
+
+ friend class Polyhedron;
+ friend class Generator_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Parma_Polyhedra_Library::Linear_System<Row>& x,
+ Parma_Polyhedra_Library::Linear_System<Row>& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Linear_System_inlines.hh"
+#include "Linear_System_templates.hh"
+
+#endif // !defined(PPL_Linear_System_defs_hh)
diff --git a/src/Linear_System_inlines.hh b/src/Linear_System_inlines.hh
new file mode 100644
index 0000000..a2aedba
--- /dev/null
+++ b/src/Linear_System_inlines.hh
@@ -0,0 +1,698 @@
+/* Linear_System class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_inlines_hh
+#define PPL_Linear_System_inlines_hh 1
+
+#include "Bit_Row_defs.hh"
+#include "Coefficient_defs.hh"
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_sorted() const {
+ // The flag `sorted' does not really reflect the sortedness status
+ // of a system (if `sorted' evaluates to `false' nothing is known).
+ // This assertion is used to ensure that the system
+ // is actually sorted when `sorted' value is 'true'.
+ PPL_ASSERT(!sorted || check_sorted());
+ return sorted;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_sorted(const bool b) {
+ sorted = b;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol, Representation r)
+ : rows(),
+ space_dimension_(0),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true),
+ representation_(r) {
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol,
+ dimension_type space_dim,
+ Representation r)
+ : rows(),
+ space_dimension_(0),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true),
+ representation_(r) {
+ set_space_dimension(space_dim);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::first_pending_row() const {
+ return index_first_pending;
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_pending_rows() const {
+ PPL_ASSERT(num_rows() >= first_pending_row());
+ return num_rows() - first_pending_row();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::unset_pending_rows() {
+ index_first_pending = num_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_index_first_pending_row(const dimension_type i) {
+ index_first_pending = i;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y)
+ : rows(y.rows),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ representation_(y.representation_) {
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ unset_pending_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r)
+ : rows(),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ representation_(r) {
+ rows.resize(y.num_rows());
+ for (dimension_type i = 0; i < y.num_rows(); ++i) {
+ // Create the copies with the right representation.
+ Row row(y.rows[i], r);
+ swap(rows[i], row);
+ }
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ unset_pending_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, With_Pending)
+ : rows(y.rows),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted),
+ representation_(y.representation_) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r,
+ With_Pending)
+ : rows(),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted),
+ representation_(r) {
+ rows.resize(y.num_rows());
+ for (dimension_type i = 0; i < y.num_rows(); ++i) {
+ // Create the copies with the right representation.
+ Row row(y.rows[i], r);
+ swap(rows[i], row);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Linear_System<Row>&
+Linear_System<Row>::operator=(const Linear_System& y) {
+ // NOTE: Pending rows are transformed into non-pending ones.
+ Linear_System<Row> tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::assign_with_pending(const Linear_System& y) {
+ Linear_System<Row> tmp(y, With_Pending());
+ swap(*this, tmp);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::m_swap(Linear_System& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(space_dimension_, y.space_dimension_);
+ swap(row_topology, y.row_topology);
+ swap(index_first_pending, y.index_first_pending);
+ swap(sorted, y.sorted);
+ swap(representation_, y.representation_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::clear() {
+ // Note: do NOT modify the value of `row_topology' and `representation'.
+ rows.clear();
+ index_first_pending = 0;
+ sorted = true;
+ space_dimension_ = 0;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_necessarily_closed() {
+ PPL_ASSERT(topology() == NOT_NECESSARILY_CLOSED);
+ row_topology = NECESSARILY_CLOSED;
+ ++space_dimension_;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].mark_as_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(topology() == NECESSARILY_CLOSED);
+ PPL_ASSERT(space_dimension() > 0);
+ row_topology = NOT_NECESSARILY_CLOSED;
+ --space_dimension_;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].mark_as_not_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_topology(Topology t) {
+ if (topology() == t)
+ return;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].set_topology(t);
+ row_topology = t;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_necessarily_closed() const {
+ return row_topology == NECESSARILY_CLOSED;
+}
+
+template <typename Row>
+inline const Row&
+Linear_System<Row>::operator[](const dimension_type k) const {
+ return rows[k];
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::begin() {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::end() {
+ return rows.end();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::begin() const {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::end() const {
+ return rows.end();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::has_no_rows() const {
+ return rows.empty();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_rows() const {
+ return rows.size();
+}
+
+template <typename Row>
+inline Topology
+Linear_System<Row>::topology() const {
+ return row_topology;
+}
+
+template <typename Row>
+inline Representation
+Linear_System<Row>::representation() const {
+ return representation_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_representation(Representation r) {
+ representation_ = r;
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].set_representation(r);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::max_space_dimension() {
+ return Row::max_space_dimension();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::space_dimension() const {
+ return space_dimension_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension_no_ok(dimension_type space_dim) {
+ for (dimension_type i = rows.size(); i-- > 0; )
+ rows[i].set_space_dimension_no_ok(space_dim);
+ space_dimension_ = space_dim;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row_no_ok(const dimension_type i,
+ const bool keep_sorted) {
+ PPL_ASSERT(i < num_rows());
+ const bool was_pending = (i >= index_first_pending);
+
+ if (sorted && keep_sorted && !was_pending) {
+ for (dimension_type j = i + 1; j < rows.size(); ++j)
+ swap(rows[j], rows[j-1]);
+ rows.pop_back();
+ }
+ else {
+ if (!was_pending)
+ sorted = false;
+ const bool last_row_is_pending = (num_rows() - 1 >= index_first_pending);
+ if (was_pending == last_row_is_pending)
+ // Either both rows are pending or both rows are not pending.
+ swap(rows[i], rows.back());
+ else {
+ // Pending rows are stored after the non-pending ones.
+ PPL_ASSERT(!was_pending);
+ PPL_ASSERT(last_row_is_pending);
+
+ // Swap the row with the last non-pending row.
+ swap(rows[i], rows[index_first_pending - 1]);
+
+ // Now the (non-pending) row that has to be deleted is between the
+ // non-pending and the pending rows.
+ swap(rows[i], rows.back());
+ }
+ rows.pop_back();
+ }
+ if (!was_pending)
+ // A non-pending row has been removed.
+ --index_first_pending;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row(const dimension_type i, bool keep_sorted) {
+ remove_row_no_ok(i, keep_sorted);
+ PPL_ASSERT(OK());
+}
+
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(dimension_type first,
+ dimension_type last,
+ bool keep_sorted) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= num_rows());
+ const dimension_type n = last - first;
+
+ if (n == 0)
+ return;
+
+ // All the rows that have to be removed must have the same (pending or
+ // non-pending) status.
+ PPL_ASSERT(first >= index_first_pending || last <= index_first_pending);
+
+ const bool were_pending = (first >= index_first_pending);
+
+ // Move the rows in [first,last) at the end of the system.
+ if (sorted && keep_sorted && !were_pending) {
+ // Preserve the row ordering.
+ for (dimension_type i = last; i < rows.size(); ++i)
+ swap(rows[i], rows[i - n]);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // We can ignore the row ordering, but we must not mix pending and
+ // non-pending rows.
+
+ const dimension_type offset = rows.size() - n - first;
+ // We want to swap the rows in [first, last) and
+ // [first + offset, last + offset) (note that these intervals may not be
+ // disjunct).
+
+ if (index_first_pending == num_rows()) {
+ // There are no pending rows.
+ PPL_ASSERT(!were_pending);
+
+ swap_row_intervals(first, last, offset);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+ }
+ else {
+ // There are some pending rows in [first + offset, last + offset).
+ if (were_pending) {
+ // Both intervals contain only pending rows, because the second
+ // interval is after the first.
+
+ swap_row_intervals(first, last, offset);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+ }
+ else {
+ PPL_ASSERT(rows.size() - n < index_first_pending);
+ PPL_ASSERT(rows.size() > index_first_pending);
+ PPL_ASSERT(!were_pending);
+ // In the [size() - n, size()) interval there are some non-pending
+ // rows and some pending ones. Be careful not to mix them.
+
+ PPL_ASSERT(index_first_pending >= last);
+ swap_row_intervals(first, last, index_first_pending - last);
+
+ // Mark the rows that must be deleted as pending.
+ index_first_pending -= n;
+ first = index_first_pending;
+ last = first + n;
+
+ // Move them at the end of the system.
+ swap_row_intervals(first, last, num_rows() - last);
+
+ // Actually remove the rows.
+ rows.resize(rows.size() - n);
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::swap_row_intervals(dimension_type first,
+ dimension_type last,
+ dimension_type offset) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last + offset <= num_rows());
+#ifndef NDEBUG
+ if (first < last) {
+ bool first_interval_has_pending_rows = (last > index_first_pending);
+ bool second_interval_has_pending_rows = (last + offset > index_first_pending);
+ bool first_interval_has_not_pending_rows = (first < index_first_pending);
+ bool second_interval_has_not_pending_rows = (first + offset < index_first_pending);
+ PPL_ASSERT(first_interval_has_not_pending_rows
+ == !first_interval_has_pending_rows);
+ PPL_ASSERT(second_interval_has_not_pending_rows
+ == !second_interval_has_pending_rows);
+ PPL_ASSERT(first_interval_has_pending_rows
+ == second_interval_has_pending_rows);
+ }
+#endif
+ if (first + offset < last) {
+ // The intervals are not disjunct, make them so.
+ const dimension_type k = last - first - offset;
+ last -= k;
+ offset += k;
+ }
+
+ if (first == last)
+ // Nothing to do.
+ return;
+
+ for (dimension_type i = first; i < last; ++i)
+ swap(rows[i], rows[i + offset]);
+
+ if (first < index_first_pending)
+ // The swaps involved not pending rows, so they may not be sorted anymore.
+ set_sorted(false);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(const std::vector<dimension_type>& indexes) {
+#ifndef NDEBUG
+ {
+ // Check that `indexes' is sorted.
+ std::vector<dimension_type> sorted_indexes = indexes;
+ std::sort(sorted_indexes.begin(), sorted_indexes.end());
+ PPL_ASSERT(indexes == sorted_indexes);
+
+ // Check that the last index (if any) is lower than num_rows().
+ // This guarantees that all indexes are in [0, num_rows()).
+ if (!indexes.empty())
+ PPL_ASSERT(indexes.back() < num_rows());
+ }
+#endif
+
+ if (indexes.empty())
+ return;
+
+ const dimension_type rows_size = rows.size();
+ typedef std::vector<dimension_type>::const_iterator itr_t;
+
+ // `i' and last_unused_row' start with the value `indexes[0]' instead
+ // of `0', because the loop would just increment `last_unused_row' in the
+ // preceding iterations.
+ dimension_type last_unused_row = indexes[0];
+ dimension_type i = indexes[0];
+ itr_t itr = indexes.begin();
+ itr_t itr_end = indexes.end();
+ while (itr != itr_end) {
+ // i <= *itr < rows_size
+ PPL_ASSERT(i < rows_size);
+ if (*itr == i) {
+ // The current row has to be removed, don't increment last_unused_row.
+ ++itr;
+ }
+ else {
+ // The current row must not be removed, swap it after the last used row.
+ swap(rows[last_unused_row], rows[i]);
+ ++last_unused_row;
+ }
+ ++i;
+ }
+
+ // Move up the remaining rows, if any.
+ for ( ; i < rows_size; ++i) {
+ swap(rows[last_unused_row], rows[i]);
+ ++last_unused_row;
+ }
+
+ PPL_ASSERT(last_unused_row == num_rows() - indexes.size());
+
+ // The rows that have to be removed are now at the end of the system, just
+ // remove them.
+ rows.resize(last_unused_row);
+
+ // Adjust index_first_pending.
+ if (indexes[0] >= index_first_pending) {
+ // Removing pending rows only.
+ }
+ else {
+ if (indexes.back() < index_first_pending) {
+ // Removing non-pending rows only.
+ index_first_pending -= indexes.size();
+ }
+ else {
+ // Removing some pending and some non-pending rows, count the
+ // non-pending rows that must be removed.
+ // This exploits the fact that `indexes' is sorted by using binary
+ // search.
+ itr_t j = std::lower_bound(indexes.begin(), indexes.end(),
+ index_first_pending);
+ std::iterator_traits<itr_t>::difference_type
+ non_pending = j - indexes.begin();
+ index_first_pending -= static_cast<dimension_type>(non_pending);
+ }
+ }
+
+ // NOTE: This method does *not* call set_sorted(false), because it preserves
+ // the relative row ordering.
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_trailing_rows(const dimension_type n) {
+ PPL_ASSERT(rows.size() >= n);
+ rows.resize(rows.size() - n);
+ if (first_pending_row() > rows.size())
+ index_first_pending = rows.size();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].permute_space_dimensions(cycle);
+ sorted = false;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::swap_space_dimensions(Variable v1, Variable v2) {
+ PPL_ASSERT(v1.space_dimension() <= space_dimension());
+ PPL_ASSERT(v2.space_dimension() <= space_dimension());
+ for (dimension_type k = num_rows(); k-- > 0; )
+ rows[k].swap_space_dimensions(v1, v2);
+ sorted = false;
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline bool
+operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+ return !(x == y);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Row_Less_Than::operator()(const Row& x,
+ const Row& y) const {
+ return compare(x, y) < 0;
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Unique_Compare
+::Unique_Compare(const Swapping_Vector<Row>& cont,
+ dimension_type base)
+ : container(cont), base_index(base) {
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Unique_Compare
+::operator()(dimension_type i, dimension_type j) const {
+ return container[base_index + i].is_equal_to(container[base_index + j]);
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline void
+swap(Linear_System<Row>& x, Linear_System<Row>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_inlines_hh)
diff --git a/src/Linear_System_templates.hh b/src/Linear_System_templates.hh
new file mode 100644
index 0000000..dd28e87
--- /dev/null
+++ b/src/Linear_System_templates.hh
@@ -0,0 +1,930 @@
+/* Linear_System class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_templates_hh
+#define PPL_Linear_System_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+#include "swapping_sort_templates.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::num_lines_or_equalities() const {
+ PPL_ASSERT(num_pending_rows() == 0);
+ const Linear_System& x = *this;
+ dimension_type n = 0;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (x[i].is_line_or_equality())
+ ++n;
+ return n;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::merge_rows_assign(const Linear_System& y) {
+ PPL_ASSERT(space_dimension() >= y.space_dimension());
+ // Both systems have to be sorted and have no pending rows.
+ PPL_ASSERT(check_sorted() && y.check_sorted());
+ PPL_ASSERT(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+ Linear_System& x = *this;
+
+ // A temporary vector...
+ Swapping_Vector<Row> tmp;
+ // ... with enough capacity not to require any reallocations.
+ tmp.reserve(compute_capacity(x.rows.size() + y.rows.size(),
+ tmp.max_num_rows()));
+
+ dimension_type xi = 0;
+ const dimension_type x_num_rows = x.num_rows();
+ dimension_type yi = 0;
+ const dimension_type y_num_rows = y.num_rows();
+
+ while (xi < x_num_rows && yi < y_num_rows) {
+ const int comp = compare(x[xi], y[yi]);
+ if (comp <= 0) {
+ // Elements that can be taken from `x' are actually _stolen_ from `x'
+ tmp.resize(tmp.size() + 1);
+ swap(tmp.back(), x.rows[xi++]);
+ tmp.back().set_representation(representation());
+ if (comp == 0)
+ // A duplicate element.
+ ++yi;
+ }
+ else {
+ // (comp > 0)
+ tmp.resize(tmp.size() + 1);
+ Row copy(y[yi++], space_dimension(), representation());
+ swap(tmp.back(), copy);
+ }
+ }
+ // Insert what is left.
+ if (xi < x_num_rows)
+ while (xi < x_num_rows) {
+ tmp.resize(tmp.size() + 1);
+ swap(tmp.back(), x.rows[xi++]);
+ tmp.back().set_representation(representation());
+ }
+ else
+ while (yi < y_num_rows) {
+ tmp.resize(tmp.size() + 1);
+ Row copy(y[yi++], space_dimension(), representation());
+ swap(tmp.back(), copy);
+ }
+
+ // We get the result matrix and let the old one be destroyed.
+ swap(tmp, rows);
+ // There are no pending rows.
+ unset_pending_rows();
+ PPL_ASSERT(check_sorted());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::ascii_dump(std::ostream& s) const {
+ // Prints the topology, the number of rows, the number of columns
+ // and the sorted flag. The specialized methods provided by
+ // Constraint_System and Generator_System take care of properly
+ // printing the contents of the system.
+ s << "topology " << (is_necessarily_closed()
+ ? "NECESSARILY_CLOSED"
+ : "NOT_NECESSARILY_CLOSED")
+ << "\n"
+ << num_rows() << " x " << space_dimension() << " ";
+ Parma_Polyhedra_Library::ascii_dump(s, representation());
+ s << " " << (sorted ? "(sorted)" : "(not_sorted)")
+ << "\n"
+ << "index_first_pending " << first_pending_row()
+ << "\n";
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Linear_System<Row>)
+
+template <typename Row>
+bool
+Linear_System<Row>::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+
+ clear();
+
+ Topology t;
+ if (str == "NECESSARILY_CLOSED")
+ t = NECESSARILY_CLOSED;
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ t = NOT_NECESSARILY_CLOSED;
+ }
+
+ set_topology(t);
+
+ dimension_type nrows;
+ dimension_type space_dims;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> space_dims))
+ return false;
+
+ space_dimension_ = space_dims;
+
+ if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+ return false;
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ const bool sortedness = (str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+
+ Row row;
+ for (dimension_type i = 0; i < nrows; ++i) {
+ if (!row.ascii_load(s))
+ return false;
+ insert(row, Recycle_Input());
+ }
+ index_first_pending = index;
+ sorted = sortedness;
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Row& r) {
+ Row tmp(r, representation());
+ insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Row& r, Recycle_Input) {
+ insert_no_ok(r, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_no_ok(Row& r, Recycle_Input) {
+ PPL_ASSERT(topology() == r.topology());
+ // This method is only used when the system has no pending rows.
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ const bool was_sorted = is_sorted();
+
+ insert_pending_no_ok(r, Recycle_Input());
+
+ if (was_sorted) {
+ const dimension_type nrows = num_rows();
+ // The added row may have caused the system to be not sorted anymore.
+ if (nrows > 1) {
+ // If the system is not empty and the inserted row is the
+ // greatest one, the system is set to be sorted.
+ // If it is not the greatest one then the system is no longer sorted.
+ sorted = (compare(rows[nrows-2], rows[nrows-1]) <= 0);
+ }
+ else
+ // A system having only one row is sorted.
+ sorted = true;
+ }
+
+ unset_pending_rows();
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending_no_ok(Row& r, Recycle_Input) {
+ // TODO: A Grid_Generator_System may contain non-normalized lines that
+ // represent parameters, so this check is disabled. Consider re-enabling it
+ // when it's possibile.
+#if 0
+ // The added row must be strongly normalized and have the same
+ // number of elements as the existing rows of the system.
+ PPL_ASSERT(r.check_strong_normalized());
+#endif
+
+ PPL_ASSERT(r.topology() == topology());
+
+ r.set_representation(representation());
+
+ if (space_dimension() < r.space_dimension())
+ set_space_dimension_no_ok(r.space_dimension());
+ else
+ r.set_space_dimension_no_ok(space_dimension());
+
+ rows.resize(rows.size() + 1);
+ swap(rows.back(), r);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Row& r) {
+ Row tmp(r, representation());
+ insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Row& r, Recycle_Input) {
+ insert_pending_no_ok(r, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Linear_System& y) {
+ Linear_System tmp(y, representation(), With_Pending());
+ insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Linear_System& y, Recycle_Input) {
+ Linear_System& x = *this;
+ PPL_ASSERT(x.space_dimension() == y.space_dimension());
+
+ // Steal the rows of `y'.
+ // This loop must use an increasing index (instead of a decreasing one) to
+ // preserve the row ordering.
+ for (dimension_type i = 0; i < y.num_rows(); ++i)
+ x.insert_pending(y.rows[i], Recycle_Input());
+
+ y.clear();
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Linear_System& y) {
+ Linear_System tmp(y, representation(), With_Pending());
+ insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Linear_System& y, Recycle_Input) {
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ // Adding no rows is a no-op.
+ if (y.has_no_rows())
+ return;
+
+ // Check if sortedness is preserved.
+ if (is_sorted()) {
+ if (!y.is_sorted() || y.num_pending_rows() > 0)
+ sorted = false;
+ else {
+ // `y' is sorted and has no pending rows.
+ const dimension_type n_rows = num_rows();
+ if (n_rows > 0)
+ sorted = (compare(rows[n_rows-1], y[0]) <= 0);
+ }
+ }
+
+ // Add the rows of `y' as if they were pending.
+ insert_pending(y, Recycle_Input());
+
+ // TODO: May y have pending rows? Should they remain pending?
+
+ // There are no pending_rows.
+ unset_pending_rows();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::remove_space_dimensions(const Variables_Set& vars) {
+ // Dimension-compatibility assertion.
+ PPL_ASSERT(space_dimension() >= vars.space_dimension());
+
+ // The removal of no dimensions from any system is a no-op. This
+ // case also captures the only legal removal of dimensions from a
+ // 0-dim system.
+ if (vars.empty())
+ return;
+
+ // NOTE: num_rows() is *not* constant, because it may be decreased by
+ // remove_row_no_ok().
+ for (dimension_type i = 0; i < num_rows(); ) {
+ const bool valid = rows[i].remove_space_dimensions(vars);
+ if (!valid) {
+ // Remove the current row.
+ // We can't call remove_row(i) here, because the system is not OK as
+ // some rows already have the new space dimension and others still have
+ // the old one.
+ remove_row_no_ok(i, false);
+ }
+ else
+ ++i;
+ }
+
+ space_dimension_ -= vars.size();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::shift_space_dimensions(Variable v, dimension_type n) {
+ // NOTE: v.id() may be equal to the space dimension of the system
+ // (when no space dimension need to be shifted).
+ PPL_ASSERT(v.id() <= space_dimension());
+ for (dimension_type i = rows.size(); i-- > 0; )
+ rows[i].shift_space_dimensions(v, n);
+ space_dimension_ += n;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows() {
+ // We sort the non-pending rows only.
+ sort_rows(0, first_pending_row());
+ sorted = true;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows(const dimension_type first_row,
+ const dimension_type last_row) {
+ PPL_ASSERT(first_row <= last_row && last_row <= num_rows());
+ // We cannot mix pending and non-pending rows.
+ PPL_ASSERT(first_row >= first_pending_row()
+ || last_row <= first_pending_row());
+
+ const bool sorting_pending = (first_row >= first_pending_row());
+ const dimension_type old_num_pending = num_pending_rows();
+
+ const dimension_type num_elems = last_row - first_row;
+ if (num_elems < 2)
+ return;
+
+ // Build the function objects implementing indirect sort comparison,
+ // indirect unique comparison and indirect swap operation.
+ using namespace Implementation;
+ typedef Swapping_Vector<Row> Cont;
+ typedef Indirect_Sort_Compare<Cont, Row_Less_Than> Sort_Compare;
+ typedef Indirect_Swapper<Cont> Swapper;
+ const dimension_type num_duplicates
+ = indirect_sort_and_unique(num_elems,
+ Sort_Compare(rows, first_row),
+ Unique_Compare(rows, first_row),
+ Swapper(rows, first_row));
+
+ if (num_duplicates > 0) {
+ typedef typename Cont::iterator Iter;
+ typedef typename std::iterator_traits<Iter>::difference_type diff_t;
+ Iter last = rows.begin() + static_cast<diff_t>(last_row);
+ Iter first = last - + static_cast<diff_t>(num_duplicates);
+ rows.erase(first, last);
+ }
+
+ if (sorting_pending) {
+ PPL_ASSERT(old_num_pending >= num_duplicates);
+ index_first_pending = num_rows() - (old_num_pending - num_duplicates);
+ }
+ else {
+ index_first_pending = num_rows() - old_num_pending;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::strong_normalize() {
+ const dimension_type nrows = rows.size();
+ // We strongly normalize also the pending rows.
+ for (dimension_type i = nrows; i-- > 0; )
+ rows[i].strong_normalize();
+ sorted = (nrows <= 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sign_normalize() {
+ const dimension_type nrows = rows.size();
+ // We sign-normalize also the pending rows.
+ for (dimension_type i = nrows; i-- > 0; )
+ rows[i].sign_normalize();
+ sorted = (nrows <= 1);
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+template <typename Row>
+bool
+operator==(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+ if (x.space_dimension() != y.space_dimension())
+ return false;
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type y_num_rows = y.num_rows();
+ if (x_num_rows != y_num_rows)
+ return false;
+ if (x.first_pending_row() != y.first_pending_row())
+ return false;
+ // TODO: Check if the following comment is up to date.
+ // Notice that calling operator==(const Swapping_Vector<Row>&,
+ // const Swapping_Vector<Row>&)
+ // would be wrong here, as equality of the type fields would
+ // not be checked.
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ // We can only sort the non-pending part of the system.
+ PPL_ASSERT(first_pending_row() == sat.num_rows());
+ if (first_pending_row() <= 1) {
+ set_sorted(true);
+ return;
+ }
+
+ const dimension_type num_elems = sat.num_rows();
+ // Build the function objects implementing indirect sort comparison,
+ // indirect unique comparison and indirect swap operation.
+ typedef Swapping_Vector<Row> Cont;
+ const Implementation::Indirect_Sort_Compare<Cont, Row_Less_Than>
+ sort_cmp(rows);
+ const Unique_Compare unique_cmp(rows);
+ const Implementation::Indirect_Swapper2<Cont, Bit_Matrix> swapper(rows, sat);
+
+ const dimension_type num_duplicates
+ = Implementation::indirect_sort_and_unique(num_elems, sort_cmp,
+ unique_cmp, swapper);
+
+ const dimension_type new_first_pending_row
+ = first_pending_row() - num_duplicates;
+
+ if (num_pending_rows() > 0) {
+ // In this case, we must put the duplicates after the pending rows.
+ const dimension_type n_rows = num_rows() - 1;
+ for (dimension_type i = 0; i < num_duplicates; ++i)
+ swap(rows[new_first_pending_row + i], rows[n_rows - i]);
+ }
+
+ // Erasing the duplicated rows...
+ rows.resize(rows.size() - num_duplicates);
+ index_first_pending = new_first_pending_row;
+ // ... and the corresponding rows of the saturation matrix.
+ sat.remove_trailing_rows(num_duplicates);
+
+ // Now the system is sorted.
+ sorted = true;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::gauss(const dimension_type n_lines_or_equalities) {
+ // This method is only applied to a linear system having no pending rows and
+ // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+ // before the rays or points or inequalities.
+ PPL_ASSERT(num_pending_rows() == 0);
+ PPL_ASSERT(n_lines_or_equalities == num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+ dimension_type rank = 0;
+ // Will keep track of the variations on the system of equalities.
+ bool changed = false;
+ // TODO: Don't use the number of columns.
+ const dimension_type num_cols
+ = is_necessarily_closed() ? space_dimension() + 1 : space_dimension() + 2;
+ // TODO: Consider exploiting the row (possible) sparseness of rows in the
+ // following loop, if needed. It would probably make it more cache-efficient
+ // for dense rows, too.
+ for (dimension_type j = num_cols; j-- > 0; )
+ for (dimension_type i = rank; i < n_lines_or_equalities; ++i) {
+ // Search for the first row having a non-zero coefficient
+ // (the pivot) in the j-th column.
+ if ((*this)[i].expr.get(j) == 0)
+ continue;
+ // Pivot found: if needed, swap rows so that this one becomes
+ // the rank-th row in the linear system.
+ if (i > rank) {
+ swap(rows[i], rows[rank]);
+ // After swapping the system is no longer sorted.
+ changed = true;
+ }
+ // Combine the row containing the pivot with all the lines or
+ // equalities following it, so that all the elements on the j-th
+ // column in these rows become 0.
+ for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k) {
+ if (rows[k].expr.get(Variable(j - 1)) != 0) {
+ rows[k].linear_combine(rows[rank], j);
+ changed = true;
+ }
+ }
+ // Already dealt with the rank-th row.
+ ++rank;
+ // Consider another column index `j'.
+ break;
+ }
+ if (changed)
+ sorted = false;
+
+ PPL_ASSERT(OK());
+ return rank;
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::back_substitute(const dimension_type n_lines_or_equalities) {
+ // This method is only applied to a system having no pending rows and
+ // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+ // before the first ray or point or inequality.
+ PPL_ASSERT(num_pending_rows() == 0);
+ PPL_ASSERT(n_lines_or_equalities <= num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+ const dimension_type nrows = num_rows();
+ // Trying to keep sortedness.
+ bool still_sorted = is_sorted();
+ // This deque of Booleans will be used to flag those rows that,
+ // before exiting, need to be re-checked for sortedness.
+ std::deque<bool> check_for_sortedness;
+ if (still_sorted)
+ check_for_sortedness.insert(check_for_sortedness.end(), nrows, false);
+
+ for (dimension_type k = n_lines_or_equalities; k-- > 0; ) {
+ // For each line or equality, starting from the last one,
+ // looks for the last non-zero element.
+ // `j' will be the index of such a element.
+ Row& row_k = rows[k];
+ const dimension_type j = row_k.expr.last_nonzero();
+ // TODO: Check this.
+ PPL_ASSERT(j != 0);
+
+ // Go through the equalities above `row_k'.
+ for (dimension_type i = k; i-- > 0; ) {
+ Row& row_i = rows[i];
+ if (row_i.expr.get(Variable(j - 1)) != 0) {
+ // Combine linearly `row_i' with `row_k'
+ // so that `row_i[j]' becomes zero.
+ row_i.linear_combine(row_k, j);
+ if (still_sorted) {
+ // Trying to keep sortedness: remember which rows
+ // have to be re-checked for sortedness at the end.
+ if (i > 0)
+ check_for_sortedness[i-1] = true;
+ check_for_sortedness[i] = true;
+ }
+ }
+ }
+
+ // Due to strong normalization during previous iterations,
+ // the pivot coefficient `row_k[j]' may now be negative.
+ // Since an inequality (or ray or point) cannot be multiplied
+ // by a negative factor, the coefficient of the pivot must be
+ // forced to be positive.
+ const bool have_to_negate = (row_k.expr.get(Variable(j - 1)) < 0);
+ if (have_to_negate)
+ neg_assign(row_k.expr);
+
+ // NOTE: Here row_k will *not* be ok if we have negated it.
+
+ // Note: we do not mark index `k' in `check_for_sortedness',
+ // because we will later negate back the row.
+
+ // Go through all the other rows of the system.
+ for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) {
+ Row& row_i = rows[i];
+ if (row_i.expr.get(Variable(j - 1)) != 0) {
+ // Combine linearly the `row_i' with `row_k'
+ // so that `row_i[j]' becomes zero.
+ row_i.linear_combine(row_k, j);
+ if (still_sorted) {
+ // Trying to keep sortedness: remember which rows
+ // have to be re-checked for sortedness at the end.
+ if (i > n_lines_or_equalities)
+ check_for_sortedness[i-1] = true;
+ check_for_sortedness[i] = true;
+ }
+ }
+ }
+ if (have_to_negate)
+ // Negate `row_k' to restore strong-normalization.
+ neg_assign(row_k.expr);
+
+ PPL_ASSERT(row_k.OK());
+ }
+
+ // Trying to keep sortedness.
+ for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i)
+ if (check_for_sortedness[i])
+ // Have to check sortedness of `(*this)[i]' with respect to `(*this)[i+1]'.
+ still_sorted = (compare((*this)[i], (*this)[i+1]) <= 0);
+
+ // Set the sortedness flag.
+ sorted = still_sorted;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::simplify() {
+ // This method is only applied to a system having no pending rows.
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ // Partially sort the linear system so that all lines/equalities come first.
+ const dimension_type old_nrows = num_rows();
+ dimension_type nrows = old_nrows;
+ dimension_type n_lines_or_equalities = 0;
+ for (dimension_type i = 0; i < nrows; ++i)
+ if ((*this)[i].is_line_or_equality()) {
+ if (n_lines_or_equalities < i) {
+ swap(rows[i], rows[n_lines_or_equalities]);
+ // The system was not sorted.
+ PPL_ASSERT(!sorted);
+ }
+ ++n_lines_or_equalities;
+ }
+ // Apply Gaussian elimination to the subsystem of lines/equalities.
+ const dimension_type rank = gauss(n_lines_or_equalities);
+ // Eliminate any redundant line/equality that has been detected.
+ if (rank < n_lines_or_equalities) {
+ const dimension_type
+ n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities;
+ const dimension_type
+ num_swaps = std::min(n_lines_or_equalities - rank,
+ n_rays_or_points_or_inequalities);
+ for (dimension_type i = num_swaps; i-- > 0; )
+ swap(rows[--nrows], rows[rank + i]);
+ remove_trailing_rows(old_nrows - nrows);
+ if (n_rays_or_points_or_inequalities > num_swaps)
+ set_sorted(false);
+ unset_pending_rows();
+ n_lines_or_equalities = rank;
+ }
+ // Apply back-substitution to the system of rays/points/inequalities.
+ back_substitute(n_lines_or_equalities);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::add_universe_rows_and_space_dimensions(const dimension_type n) {
+ PPL_ASSERT(n > 0);
+ const bool was_sorted = is_sorted();
+ const dimension_type old_n_rows = num_rows();
+ const dimension_type old_space_dim
+ = is_necessarily_closed() ? space_dimension() : space_dimension() + 1;
+ set_space_dimension(space_dimension() + n);
+ rows.resize(rows.size() + n);
+ // The old system is moved to the bottom.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ swap(rows[i], rows[i + n]);
+ for (dimension_type i = n, c = old_space_dim; i-- > 0; ) {
+ // The top right-hand sub-system (i.e., the system made of new
+ // rows and columns) is set to the specular image of the identity
+ // matrix.
+ if (Variable(c).space_dimension() <= space_dimension()) {
+ // Variable(c) is a user variable.
+ Linear_Expression le(representation());
+ le.set_space_dimension(space_dimension());
+ le += Variable(c);
+ Row r(le, Row::LINE_OR_EQUALITY, row_topology);
+ swap(r, rows[i]);
+ }
+ else {
+ // Variable(c) is the epsilon dimension.
+ PPL_ASSERT(row_topology == NOT_NECESSARILY_CLOSED);
+ Linear_Expression le(Variable(c), representation());
+ Row r(le, Row::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+ r.mark_as_not_necessarily_closed();
+ swap(r, rows[i]);
+ // Note: `r' is strongly normalized.
+ }
+ ++c;
+ }
+ // If the old system was empty, the last row added is either
+ // a positivity constraint or a point.
+ if (was_sorted)
+ sorted = (compare(rows[n-1], rows[n]) <= 0);
+
+ // If the system is not necessarily closed, move the epsilon coefficients to
+ // the last column.
+ if (!is_necessarily_closed()) {
+ // Try to preserve sortedness of `gen_sys'.
+ PPL_ASSERT(old_space_dim != 0);
+ if (!is_sorted()) {
+ for (dimension_type i = n; i-- > 0; ) {
+ rows[i].expr.swap_space_dimensions(Variable(old_space_dim - 1),
+ Variable(old_space_dim - 1 + n));
+ PPL_ASSERT(rows[i].OK());
+ }
+ }
+ else {
+ dimension_type old_eps_index = old_space_dim - 1;
+ // The upper-right corner of `rows' contains the J matrix:
+ // swap coefficients to preserve sortedness.
+ for (dimension_type i = n; i-- > 0; ++old_eps_index) {
+ rows[i].expr.swap_space_dimensions(Variable(old_eps_index),
+ Variable(old_eps_index + 1));
+ PPL_ASSERT(rows[i].OK());
+ }
+
+ sorted = true;
+ }
+ }
+ // NOTE: this already checks for OK().
+ set_index_first_pending_row(index_first_pending + n);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_pending_and_remove_duplicates() {
+ PPL_ASSERT(num_pending_rows() > 0);
+ PPL_ASSERT(is_sorted());
+
+ // The non-pending part of the system is already sorted.
+ // Now sorting the pending part..
+ const dimension_type first_pending = first_pending_row();
+ sort_rows(first_pending, num_rows());
+ // Recompute the number of rows, because we may have removed
+ // some rows occurring more than once in the pending part.
+ const dimension_type old_num_rows = num_rows();
+ dimension_type num_rows = old_num_rows;
+
+ dimension_type k1 = 0;
+ dimension_type k2 = first_pending;
+ dimension_type num_duplicates = 0;
+ // In order to erase them, put at the end of the system
+ // those pending rows that also occur in the non-pending part.
+ while (k1 < first_pending && k2 < num_rows) {
+ const int cmp = compare(rows[k1], rows[k2]);
+ if (cmp == 0) {
+ // We found the same row.
+ ++num_duplicates;
+ --num_rows;
+ // By initial sortedness, we can increment index `k1'.
+ ++k1;
+ // Do not increment `k2'; instead, swap there the next pending row.
+ if (k2 < num_rows)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ }
+ else if (cmp < 0)
+ // By initial sortedness, we can increment `k1'.
+ ++k1;
+ else {
+ // Here `cmp > 0'.
+ // Increment `k2' and, if we already found any duplicate,
+ // swap the next pending row in position `k2'.
+ ++k2;
+ if (num_duplicates > 0 && k2 < num_rows)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ }
+ }
+ // If needed, swap any duplicates found past the pending rows
+ // that has not been considered yet; then erase the duplicates.
+ if (num_duplicates > 0) {
+ if (k2 < num_rows)
+ for (++k2; k2 < num_rows; ++k2)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ rows.resize(num_rows);
+ }
+ sorted = true;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::check_sorted() const {
+ for (dimension_type i = first_pending_row(); i-- > 1; )
+ if (compare(rows[i], rows[i-1]) < 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ for (dimension_type i = rows.size(); i-- > 0; ) {
+ if (rows[i].representation() != representation()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong representation!"
+ << endl;
+#endif
+ return false;
+ }
+ if (rows[i].space_dimension() != space_dimension()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong number of space dimensions!"
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ for (dimension_type i = rows.size(); i-- > 0; )
+ if (rows[i].topology() != topology()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong topology!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // `index_first_pending' must be less than or equal to `num_rows()'.
+ if (first_pending_row() > num_rows()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a negative number of pending rows!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // Check for topology mismatches.
+ const dimension_type n_rows = num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i)
+ if (topology() != rows[i].topology()) {
+#ifndef NDEBUG
+ cerr << "Topology mismatch between the system "
+ << "and one of its rows!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (sorted && !check_sorted()) {
+#ifndef NDEBUG
+ cerr << "The system declares itself to be sorted but it is not!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // All checks passed.
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_templates_hh)
diff --git a/src/Linear_System_types.hh b/src/Linear_System_types.hh
new file mode 100644
index 0000000..7a8355c
--- /dev/null
+++ b/src/Linear_System_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_System_types_hh
+#define PPL_Linear_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_System;
+
+template <typename Row>
+class Linear_System_With_Bit_Matrix_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_types_hh)
diff --git a/src/MIP_Problem.cc b/src/MIP_Problem.cc
new file mode 100644
index 0000000..251f106
--- /dev/null
+++ b/src/MIP_Problem.cc
@@ -0,0 +1,2739 @@
+/* MIP_Problem class implementation: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "MIP_Problem_defs.hh"
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "math_utilities_defs.hh"
+
+#include <stdexcept>
+#include <deque>
+#include <vector>
+#include <algorithm>
+#include <cmath>
+
+// TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+// These are needed for the linear_combine() method that takes a Dense_Row and
+// a Sparse_Row.
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#endif // PPL_USE_SPARSE_MATRIX
+
+#ifndef PPL_NOISY_SIMPLEX
+#define PPL_NOISY_SIMPLEX 0
+#endif
+
+#ifndef PPL_SIMPLEX_USE_MIP_HEURISTIC
+#define PPL_SIMPLEX_USE_MIP_HEURISTIC 1
+#endif
+
+#if PPL_NOISY_SIMPLEX
+#include <iostream>
+#endif
+
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_NOISY_SIMPLEX
+namespace {
+
+unsigned long num_iterations = 0;
+
+unsigned mip_recursion_level = 0;
+
+} // namespace
+#endif // PPL_NOISY_SIMPLEX
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(),
+ opt_mode(MAXIMIZATION),
+ last_generator(point()),
+ i_variables() {
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+ "mode):\n"
+ "dim exceeds the maximum allowed "
+ "space dimension.");
+ PPL_ASSERT(OK());
+}
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim,
+ const Constraint_System& cs,
+ const Linear_Expression& obj,
+ const Optimization_Mode mode)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(obj),
+ opt_mode(mode),
+ last_generator(point()),
+ i_variables() {
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+ "mode):\n"
+ "dim exceeds the maximum allowed"
+ "space dimension.");
+ // Check the objective function.
+ if (obj.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj,"
+ << " mode):\n"
+ << "obj.space_dimension() == "<< obj.space_dimension()
+ << " exceeds dim == "<< dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // Check the constraint system.
+ if (cs.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj, mode):\n"
+ << "cs.space_dimension == " << cs.space_dimension()
+ << " exceeds dim == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ if (cs.has_strict_inequalities())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "MIP_Problem(d, cs, obj, m):\n"
+ "cs contains strict inequalities.");
+ // Actually copy the constraints.
+ for (Constraint_System::const_iterator
+ i = cs.begin(), i_end = cs.end(); i != i_end; ++i)
+ add_constraint_helper(*i);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraint(const Constraint& c) {
+ if (space_dimension() < c.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::add_constraint(c):\n"
+ << "c.space_dimension() == "<< c.space_dimension() << " exceeds "
+ "this->space_dimension == " << space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+ if (c.is_strict_inequality())
+ throw std::invalid_argument("PPL::MIP_Problem::add_constraint(c):\n"
+ "c is a strict inequality.");
+ add_constraint_helper(c);
+ if (status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraints(const Constraint_System& cs) {
+ if (space_dimension() < cs.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::add_constraints(cs):\n"
+ << "cs.space_dimension() == " << cs.space_dimension()
+ << " exceeds this->space_dimension() == " << this->space_dimension()
+ << ".";
+ throw std::invalid_argument(s.str());
+ }
+ if (cs.has_strict_inequalities())
+ throw std::invalid_argument("PPL::MIP_Problem::add_constraints(cs):\n"
+ "cs contains strict inequalities.");
+ for (Constraint_System::const_iterator
+ i = cs.begin(), i_end = cs.end(); i != i_end; ++i)
+ add_constraint_helper(*i);
+ if (status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::set_objective_function(const Linear_Expression& obj) {
+ if (space_dimension() < obj.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::set_objective_function(obj):\n"
+ << "obj.space_dimension() == " << obj.space_dimension()
+ << " exceeds this->space_dimension == " << space_dimension()
+ << ".";
+ throw std::invalid_argument(s.str());
+ }
+ input_obj_function = obj;
+ if (status == UNBOUNDED || status == OPTIMIZED)
+ status = SATISFIABLE;
+ PPL_ASSERT(OK());
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::feasible_point() const {
+ if (is_satisfiable())
+ return last_generator;
+ else
+ throw std::domain_error("PPL::MIP_Problem::feasible_point():\n"
+ "*this is not satisfiable.");
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::optimizing_point() const {
+ if (solve() == OPTIMIZED_MIP_PROBLEM)
+ return last_generator;
+ else
+ throw std::domain_error("PPL::MIP_Problem::optimizing_point():\n"
+ "*this does not have an optimizing point.");
+}
+
+bool
+PPL::MIP_Problem::is_satisfiable() const {
+ // Check `status' to filter out trivial cases.
+ switch (status) {
+ case UNSATISFIABLE:
+ PPL_ASSERT(OK());
+ return false;
+ case SATISFIABLE:
+ // Intentionally fall through
+ case UNBOUNDED:
+ // Intentionally fall through.
+ case OPTIMIZED:
+ PPL_ASSERT(OK());
+ return true;
+ case PARTIALLY_SATISFIABLE:
+ {
+ MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+ // LP case.
+ if (x.i_variables.empty())
+ return x.is_lp_satisfiable();
+
+ // MIP case.
+ {
+ // Temporarily relax the MIP into an LP problem.
+ RAII_Temporary_Real_Relaxation relaxed(x);
+ Generator p = point();
+ relaxed.lp.is_lp_satisfiable();
+#if PPL_NOISY_SIMPLEX
+ mip_recursion_level = 0;
+#endif // PPL_NOISY_SIMPLEX
+ if (is_mip_satisfiable(relaxed.lp, relaxed.i_vars, p)) {
+ x.last_generator = p;
+ x.status = SATISFIABLE;
+ }
+ else
+ x.status = UNSATISFIABLE;
+ } // `relaxed' destroyed here: relaxation automatically reset.
+ return (x.status == SATISFIABLE);
+ }
+ }
+ // We should not be here!
+ PPL_UNREACHABLE;
+ return false;
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve() const{
+ switch (status) {
+ case UNSATISFIABLE:
+ PPL_ASSERT(OK());
+ return UNFEASIBLE_MIP_PROBLEM;
+ case UNBOUNDED:
+ PPL_ASSERT(OK());
+ return UNBOUNDED_MIP_PROBLEM;
+ case OPTIMIZED:
+ PPL_ASSERT(OK());
+ return OPTIMIZED_MIP_PROBLEM;
+ case SATISFIABLE:
+ // Intentionally fall through
+ case PARTIALLY_SATISFIABLE:
+ {
+ MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+ if (x.i_variables.empty()) {
+ // LP case.
+ if (x.is_lp_satisfiable()) {
+ x.second_phase();
+ if (x.status == UNBOUNDED)
+ return UNBOUNDED_MIP_PROBLEM;
+ else {
+ PPL_ASSERT(x.status == OPTIMIZED);
+ return OPTIMIZED_MIP_PROBLEM;
+ }
+ }
+ return UNFEASIBLE_MIP_PROBLEM;
+ }
+
+ // MIP case.
+ MIP_Problem_Status return_value;
+ Generator g = point();
+ {
+ // Temporarily relax the MIP into an LP problem.
+ RAII_Temporary_Real_Relaxation relaxed(x);
+ if (relaxed.lp.is_lp_satisfiable())
+ relaxed.lp.second_phase();
+ else {
+ x.status = UNSATISFIABLE;
+ // NOTE: `relaxed' destroyed: relaxation automatically reset.
+ return UNFEASIBLE_MIP_PROBLEM;
+ }
+ PPL_DIRTY_TEMP(mpq_class, incumbent_solution);
+ bool have_incumbent_solution = false;
+
+ MIP_Problem lp_copy(relaxed.lp, Inherit_Constraints());
+ PPL_ASSERT(lp_copy.integer_space_dimensions().empty());
+ return_value = solve_mip(have_incumbent_solution,
+ incumbent_solution, g,
+ lp_copy, relaxed.i_vars);
+ } // `relaxed' destroyed here: relaxation automatically reset.
+
+ switch (return_value) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ x.status = UNSATISFIABLE;
+ break;
+ case UNBOUNDED_MIP_PROBLEM:
+ x.status = UNBOUNDED;
+ // A feasible point has been set in `solve_mip()', so that
+ // a call to `feasible_point' will be successful.
+ x.last_generator = g;
+ break;
+ case OPTIMIZED_MIP_PROBLEM:
+ x.status = OPTIMIZED;
+ // Set the internal generator.
+ x.last_generator = g;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return return_value;
+ }
+ }
+ // We should not be here!
+ PPL_UNREACHABLE;
+ return UNFEASIBLE_MIP_PROBLEM;
+}
+
+void
+PPL::MIP_Problem::add_space_dimensions_and_embed(const dimension_type m) {
+ // The space dimension of the resulting MIP problem should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dimension())
+ throw std::length_error("PPL::MIP_Problem::"
+ "add_space_dimensions_and_embed(m):\n"
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension.");
+ external_space_dim += m;
+ if (status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem
+::add_to_integer_space_dimensions(const Variables_Set& i_vars) {
+ if (i_vars.space_dimension() > external_space_dim)
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "add_to_integer_space_dimension(i_vars):\n"
+ "*this and i_vars are dimension"
+ "incompatible.");
+ const dimension_type original_size = i_variables.size();
+ i_variables.insert(i_vars.begin(), i_vars.end());
+ // If a new integral variable was inserted, set the internal status to
+ // PARTIALLY_SATISFIABLE.
+ if (i_variables.size() != original_size && status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+}
+
+bool
+PPL::MIP_Problem::is_in_base(const dimension_type var_index,
+ dimension_type& row_index) const {
+ for (row_index = base.size(); row_index-- > 0; )
+ if (base[row_index] == var_index)
+ return true;
+ return false;
+}
+
+PPL::dimension_type
+PPL::MIP_Problem::merge_split_variable(dimension_type var_index) {
+ // Initialize the return value to a dummy index.
+ dimension_type unfeasible_tableau_row = not_a_dimension();
+
+ const dimension_type removing_column = mapping[1+var_index].second;
+
+ // Check if the negative part of the split variable is in base:
+ // if so, the corresponding row of the tableau becomes non-feasible.
+ {
+ dimension_type base_index;
+ if (is_in_base(removing_column, base_index)) {
+ // Set the return value.
+ unfeasible_tableau_row = base_index;
+ // Reset base[base_index] to zero to remember non-feasibility.
+ base[base_index] = 0;
+ // Since the negative part of the variable is in base,
+ // the positive part can not be in base too.
+ PPL_ASSERT(!is_in_base(mapping[1+var_index].first, base_index));
+ }
+ }
+
+ tableau.remove_column(removing_column);
+
+ // var_index is no longer split.
+ mapping[1+var_index].second = 0;
+
+ // Adjust data structures, `shifting' the proper columns to the left by 1.
+ const dimension_type base_size = base.size();
+ for (dimension_type i = base_size; i-- > 0; ) {
+ if (base[i] > removing_column)
+ --base[i];
+ }
+ const dimension_type mapping_size = mapping.size();
+ for (dimension_type i = mapping_size; i-- > 0; ) {
+ if (mapping[i].first > removing_column)
+ --mapping[i].first;
+ if (mapping[i].second > removing_column)
+ --mapping[i].second;
+ }
+
+ return unfeasible_tableau_row;
+}
+
+bool
+PPL::MIP_Problem::is_satisfied(const Constraint& c, const Generator& g) {
+ // Scalar_Products::sign() requires the second argument to be at least
+ // as large as the first one.
+ const int sp_sign
+ = (g.space_dimension() <= c.space_dimension())
+ ? Scalar_Products::sign(g, c)
+ : Scalar_Products::sign(c, g);
+ return c.is_inequality() ? (sp_sign >= 0) : (sp_sign == 0);
+}
+
+bool
+PPL::MIP_Problem::is_saturated(const Constraint& c, const Generator& g) {
+ // Scalar_Products::sign() requires the space dimension of the second
+ // argument to be at least as large as the one of the first one.
+ const int sp_sign
+ = (g.space_dimension() <= c.space_dimension())
+ ? Scalar_Products::sign(g, c)
+ : Scalar_Products::sign(c, g);
+ return sp_sign == 0;
+}
+
+bool
+PPL::MIP_Problem
+::parse_constraints(dimension_type& additional_tableau_rows,
+ dimension_type& additional_slack_variables,
+ std::deque<bool>& is_tableau_constraint,
+ std::deque<bool>& is_satisfied_inequality,
+ std::deque<bool>& is_nonnegative_variable,
+ std::deque<bool>& is_remergeable_variable) const {
+ // Initially all containers are empty.
+ PPL_ASSERT(is_tableau_constraint.empty()
+ && is_satisfied_inequality.empty()
+ && is_nonnegative_variable.empty()
+ && is_remergeable_variable.empty());
+
+ const dimension_type cs_space_dim = external_space_dim;
+ const dimension_type cs_num_rows = input_cs.size();
+ const dimension_type cs_num_pending
+ = cs_num_rows - first_pending_constraint;
+
+ // Counters determining the change in dimensions of the tableau:
+ // initialized here, they will be updated while examining `input_cs'.
+ additional_tableau_rows = cs_num_pending;
+ additional_slack_variables = 0;
+
+ // Resize containers appropriately.
+
+ // On exit, `is_tableau_constraint[i]' will be true if and only if
+ // `input_cs[first_pending_constraint + i]' is neither a tautology
+ // (e.g., 1 >= 0) nor a non-negativity constraint (e.g., X >= 0).
+ is_tableau_constraint.insert(is_tableau_constraint.end(),
+ cs_num_pending, true);
+
+ // On exit, `is_satisfied_inequality[i]' will be true if and only if
+ // `input_cs[first_pending_constraint + i]' is an inequality and it is
+ // satisfied by `last_generator'.
+ is_satisfied_inequality.insert(is_satisfied_inequality.end(),
+ cs_num_pending, false);
+
+ // On exit, `is_nonnegative_variable[j]' will be true if and only if
+ // Variable(j) is bound to be nonnegative in `input_cs'.
+ is_nonnegative_variable.insert(is_nonnegative_variable.end(),
+ cs_space_dim, false);
+
+ // On exit, `is_remergeable_variable[j]' will be true if and only if
+ // Variable(j) was initially split and is now remergeable.
+ is_remergeable_variable.insert(is_remergeable_variable.end(),
+ internal_space_dim, false);
+
+ // Check for variables that are already known to be nonnegative
+ // due to non-pending constraints.
+ const dimension_type mapping_size = mapping.size();
+ if (mapping_size > 0) {
+ // Note: mapping[0] is associated to the cost function.
+ for (dimension_type i = std::min(mapping_size - 1, cs_space_dim);
+ i-- > 0; )
+ if (mapping[i + 1].second == 0)
+ is_nonnegative_variable[i] = true;
+ }
+
+ // Process each pending constraint in `input_cs' and
+ // - detect variables that are constrained to be nonnegative;
+ // - detect (non-negativity or tautology) pending constraints that
+ // will not be part of the tableau;
+ // - count the number of new slack variables.
+ for (dimension_type i = cs_num_rows; i-- > first_pending_constraint; ) {
+ const Constraint& cs_i = *(input_cs[i]);
+ const dimension_type cs_i_end = cs_i.space_dimension() + 1;
+
+ const dimension_type nonzero_coeff_column_index
+ = cs_i.expression().first_nonzero(1, cs_i_end);
+ const bool found_a_nonzero_coeff = (nonzero_coeff_column_index != cs_i_end);
+ const bool found_many_nonzero_coeffs
+ = (found_a_nonzero_coeff
+ && !cs_i.expression().all_zeroes(nonzero_coeff_column_index + 1,
+ cs_i_end));
+
+ // If more than one coefficient is nonzero,
+ // continue with next constraint.
+ if (found_many_nonzero_coeffs) {
+ if (cs_i.is_inequality())
+ ++additional_slack_variables;
+ // CHECKME: Is it true that in the first phase we can apply
+ // `is_satisfied()' with the generator `point()'? If so, the following
+ // code works even if we do not have a feasible point.
+ // Check for satisfiability of the inequality. This can be done if we
+ // have a feasible point of *this.
+ if (cs_i.is_inequality() && is_satisfied(cs_i, last_generator))
+ is_satisfied_inequality[i - first_pending_constraint] = true;
+ continue;
+ }
+
+ if (!found_a_nonzero_coeff) {
+ // All coefficients are 0.
+ // The constraint is either trivially true or trivially false.
+ if (cs_i.is_inequality()) {
+ if (cs_i.inhomogeneous_term() < 0)
+ // A constraint such as -1 >= 0 is trivially false.
+ return false;
+ }
+ else
+ // The constraint is an equality.
+ if (cs_i.inhomogeneous_term() != 0)
+ // A constraint such as 1 == 0 is trivially false.
+ return false;
+ // Here the constraint is trivially true.
+ is_tableau_constraint[i - first_pending_constraint] = false;
+ --additional_tableau_rows;
+ continue;
+ }
+ else {
+ // Here we have only one nonzero coefficient.
+ /*
+
+ We have the following methods:
+ A) Do split the variable and do add the constraint
+ in the tableau.
+ B) Do not split the variable and do add the constraint
+ in the tableau.
+ C) Do not split the variable and do not add the constraint
+ in the tableau.
+
+ Let the constraint be (a*v + b relsym 0).
+ These are the 12 possible combinations we can have:
+ a | b | relsym | method
+ ----------------------------------
+ 1) >0 | >0 | >= | A
+ 2) >0 | >0 | == | A
+ 3) <0 | <0 | >= | A
+ 4) >0 | =0 | == | B
+ 5) >0 | <0 | == | B
+ Note: <0 | >0 | == | impossible by strong normalization
+ Note: <0 | =0 | == | impossible by strong normalization
+ Note: <0 | <0 | == | impossible by strong normalization
+ 6) >0 | <0 | >= | B
+ 7) >0 | =0 | >= | C
+ 8) <0 | >0 | >= | A
+ 9) <0 | =0 | >= | A
+
+ The next lines will apply the correct method to each case.
+ */
+
+ // The variable index is not equal to the column index.
+ const dimension_type nonzero_var_index = nonzero_coeff_column_index - 1;
+
+ const int sgn_a = sgn(cs_i.coefficient(Variable(nonzero_var_index)));
+ const int sgn_b = sgn(cs_i.inhomogeneous_term());
+
+ // Cases 1-3: apply method A.
+ if (sgn_a == sgn_b) {
+ if (cs_i.is_inequality())
+ ++additional_slack_variables;
+ }
+ // Cases 4-5: apply method B.
+ else if (cs_i.is_equality())
+ is_nonnegative_variable[nonzero_var_index] = true;
+ // Case 6: apply method B.
+ else if (sgn_b < 0) {
+ is_nonnegative_variable[nonzero_var_index] = true;
+ ++additional_slack_variables;
+ }
+ // Case 7: apply method C.
+ else if (sgn_a > 0) {
+ if (!is_nonnegative_variable[nonzero_var_index]) {
+ is_nonnegative_variable[nonzero_var_index] = true;
+ if (nonzero_coeff_column_index < mapping_size) {
+ // Remember to merge back the positive and negative parts.
+ PPL_ASSERT(nonzero_var_index < internal_space_dim);
+ is_remergeable_variable[nonzero_var_index] = true;
+ }
+ }
+ is_tableau_constraint[i - first_pending_constraint] = false;
+ --additional_tableau_rows;
+ }
+ // Cases 8-9: apply method A.
+ else {
+ PPL_ASSERT(cs_i.is_inequality());
+ ++additional_slack_variables;
+ }
+ }
+ }
+ return true;
+}
+
+void
+PPL::MIP_Problem::process_pending_constraints() {
+ // Check the pending constraints to adjust the data structures.
+ // If `false' is returned, they are trivially unfeasible.
+ dimension_type additional_tableau_rows = 0;
+ dimension_type additional_slack_vars = 0;
+ std::deque<bool> is_tableau_constraint;
+ std::deque<bool> is_satisfied_inequality;
+ std::deque<bool> is_nonnegative_variable;
+ std::deque<bool> is_remergeable_variable;
+ if (!parse_constraints(additional_tableau_rows,
+ additional_slack_vars,
+ is_tableau_constraint,
+ is_satisfied_inequality,
+ is_nonnegative_variable,
+ is_remergeable_variable)) {
+ status = UNSATISFIABLE;
+ return;
+ }
+
+ // Merge back any variable that was previously split into a positive
+ // and a negative part and is now known to be nonnegative.
+ std::vector<dimension_type> unfeasible_tableau_rows;
+ for (dimension_type i = internal_space_dim; i-- > 0; ) {
+ if (!is_remergeable_variable[i])
+ continue;
+ // TODO: merging all rows in a single shot may be more efficient
+ // as it would require a single call to permute_columns().
+ const dimension_type unfeasible_row = merge_split_variable(i);
+ if (unfeasible_row != not_a_dimension())
+ unfeasible_tableau_rows.push_back(unfeasible_row);
+ }
+
+ const dimension_type old_tableau_num_rows = tableau.num_rows();
+ const dimension_type old_tableau_num_cols = tableau.num_columns();
+ const dimension_type first_free_tableau_index = old_tableau_num_cols - 1;
+
+ // Update mapping for the new problem variables (if any).
+ dimension_type additional_problem_vars = 0;
+ if (external_space_dim > internal_space_dim) {
+ const dimension_type space_diff = external_space_dim - internal_space_dim;
+ for (dimension_type i = 0, j = 0; i < space_diff; ++i) {
+ // Let `mapping' associate the variable index with the corresponding
+ // tableau column: split the variable into positive and negative
+ // parts if it is not known to be nonnegative.
+ const dimension_type positive = first_free_tableau_index + j;
+ if (is_nonnegative_variable[internal_space_dim + i]) {
+ // Do not split.
+ mapping.push_back(std::make_pair(positive, 0));
+ ++j;
+ ++additional_problem_vars;
+ }
+ else {
+ // Split: negative index is positive + 1.
+ mapping.push_back(std::make_pair(positive, positive + 1));
+ j += 2;
+ additional_problem_vars += 2;
+ }
+ }
+ }
+
+ // Resize the tableau: first add additional rows ...
+ if (additional_tableau_rows > 0)
+ tableau.add_zero_rows(additional_tableau_rows);
+
+ // ... then add additional columns.
+ // We need columns for additional (split) problem variables, additional
+ // slack variables and additional artificials.
+ // The number of artificials to be added is computed as:
+ // * number of pending constraints entering the tableau
+ // minus
+ // * pending constraints that are inequalities and are already satisfied
+ // by `last_generator'
+ // plus
+ // * number of non-pending constraints that are no longer satisfied
+ // due to re-merging of split variables.
+
+ const dimension_type num_satisfied_inequalities
+ = static_cast<dimension_type>(std::count(is_satisfied_inequality.begin(),
+ is_satisfied_inequality.end(),
+ true));
+ const dimension_type unfeasible_tableau_rows_size
+ = unfeasible_tableau_rows.size();
+
+ PPL_ASSERT(additional_tableau_rows >= num_satisfied_inequalities);
+ const dimension_type additional_artificial_vars
+ = (additional_tableau_rows - num_satisfied_inequalities)
+ + unfeasible_tableau_rows_size;
+
+ const dimension_type additional_tableau_columns
+ = additional_problem_vars
+ + additional_slack_vars
+ + additional_artificial_vars;
+
+ if (additional_tableau_columns > 0)
+ tableau.add_zero_columns(additional_tableau_columns);
+
+ // Dimensions of the tableau after resizing.
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ const dimension_type tableau_num_cols = tableau.num_columns();
+
+ // The following vector will be useful know if a constraint is feasible
+ // and does not require an additional artificial variable.
+ std::deque<bool> worked_out_row (tableau_num_rows, false);
+
+ // Sync the `base' vector size to the new tableau: fill with zeros
+ // to encode that these rows are not OK and must be adjusted.
+ base.insert(base.end(), additional_tableau_rows, 0);
+ const dimension_type base_size = base.size();
+
+ // These indexes will be used to insert slack and artificial variables
+ // in the appropriate position.
+ dimension_type slack_index
+ = tableau_num_cols - additional_artificial_vars - 1;
+ dimension_type artificial_index = slack_index;
+
+ // The first column index of the tableau that contains an
+ // artificial variable. Encode with 0 the fact the there are not
+ // artificial variables.
+ const dimension_type begin_artificials
+ = (additional_artificial_vars > 0)
+ ? artificial_index
+ : 0;
+
+ // Proceed with the insertion of the constraints.
+ for (dimension_type k = tableau_num_rows,
+ i = input_cs.size() - first_pending_constraint; i-- > 0; ) {
+ if (!is_tableau_constraint[i])
+ continue;
+ // Copy the original constraint in the tableau.
+ Row& tableau_k = tableau[--k];
+ Row::iterator itr = tableau_k.end();
+
+ const Constraint& c = *(input_cs[i + first_pending_constraint]);
+ const Constraint::expr_type c_e = c.expression();
+ for (Constraint::expr_type::const_iterator j = c_e.begin(),
+ j_end = c_e.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference coeff_sd = *j;
+ const std::pair<dimension_type, dimension_type> mapped
+ = mapping[j.variable().space_dimension()];
+ itr = tableau_k.insert(itr, mapped.first, coeff_sd);
+ // Split if needed.
+ if (mapped.second != 0) {
+ itr = tableau_k.insert(itr, mapped.second);
+ neg_assign(*itr, coeff_sd);
+ }
+ }
+ Coefficient_traits::const_reference inhomo = c.inhomogeneous_term();
+ if (inhomo != 0) {
+ tableau_k.insert(itr, mapping[0].first, inhomo);
+ // Split if needed.
+ if (mapping[0].second != 0) {
+ itr = tableau_k.insert(itr, mapping[0].second);
+ neg_assign(*itr, inhomo);
+ }
+ }
+
+ // Add the slack variable, if needed.
+ if (c.is_inequality()) {
+ neg_assign(tableau_k[--slack_index], Coefficient_one());
+ // If the constraint is already satisfied, we will not use artificial
+ // variables to compute a feasible base: this to speed up
+ // the algorithm.
+ if (is_satisfied_inequality[i]) {
+ base[k] = slack_index;
+ worked_out_row[k] = true;
+ }
+ }
+ for (dimension_type j = base_size; j-- > 0; )
+ if (k != j && base[j] != 0 && tableau_k.get(base[j]) != 0)
+ linear_combine(tableau_k, tableau[j], base[j]);
+ }
+
+ // Let all inhomogeneous terms in the tableau be nonpositive,
+ // so as to simplify the insertion of artificial variables
+ // (the coefficient of each artificial variable will be 1).
+ for (dimension_type i = tableau_num_rows; i-- > 0 ; ) {
+ Row& tableau_i = tableau[i];
+ if (tableau_i.get(0) > 0) {
+ for (Row::iterator
+ j = tableau_i.begin(), j_end = tableau_i.end(); j != j_end; ++j)
+ neg_assign(*j);
+ }
+ }
+
+ // Reset the working cost function to have the right size.
+ working_cost = working_cost_type(tableau_num_cols);
+
+ // Set up artificial variables: these will have coefficient 1 in the
+ // constraint, will enter the base and will have coefficient -1 in
+ // the cost function.
+
+ // This is used as a hint for insertions in working_cost.
+ working_cost_type::iterator cost_itr = working_cost.end();
+
+ // First go through non-pending constraints that became unfeasible
+ // due to re-merging of split variables.
+ for (dimension_type i = 0; i < unfeasible_tableau_rows_size; ++i) {
+ tableau[unfeasible_tableau_rows[i]].insert(artificial_index,
+ Coefficient_one());
+ cost_itr = working_cost.insert(cost_itr, artificial_index);
+ *cost_itr = -1;
+ base[unfeasible_tableau_rows[i]] = artificial_index;
+ ++artificial_index;
+ }
+ // Then go through newly added tableau rows, disregarding inequalities
+ // that are already satisfied by `last_generator' (this information
+ // is encoded in `worked_out_row').
+ for (dimension_type i = old_tableau_num_rows; i < tableau_num_rows; ++i) {
+ if (worked_out_row[i])
+ continue;
+ tableau[i].insert(artificial_index, Coefficient_one());
+ cost_itr = working_cost.insert(cost_itr, artificial_index);
+ *cost_itr = -1;
+ base[i] = artificial_index;
+ ++artificial_index;
+ }
+ // One past the last tableau column index containing an artificial variable.
+ const dimension_type end_artificials = artificial_index;
+
+ // Set the extra-coefficient of the cost functions to record its sign.
+ // This is done to keep track of the possible sign's inversion.
+ const dimension_type last_obj_index = working_cost.size() - 1;
+ working_cost.insert(cost_itr, last_obj_index, Coefficient_one());
+
+ // Express the problem in terms of the variables in base.
+ {
+ working_cost_type::const_iterator itr = working_cost.end();
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ itr = working_cost.lower_bound(itr, base[i]);
+ if (itr != working_cost.end() && itr.index() == base[i] && *itr != 0) {
+ linear_combine(working_cost, tableau[i], base[i]);
+ // itr has been invalidated by the call to linear_combine().
+ itr = working_cost.end();
+ }
+ }
+ }
+
+ // Deal with zero dimensional problems.
+ if (space_dimension() == 0) {
+ status = OPTIMIZED;
+ last_generator = point();
+ return;
+ }
+ // Deal with trivial cases.
+ // If there is no constraint in the tableau, then the feasible region
+ // is only delimited by non-negativity constraints. Therefore,
+ // the problem is unbounded as soon as the cost function has
+ // a variable with a positive coefficient.
+ if (tableau_num_rows == 0) {
+ if (is_unbounded_obj_function(input_obj_function, mapping, opt_mode)) {
+ // Ensure the right space dimension is obtained.
+ last_generator = point();
+ last_generator.set_space_dimension(space_dimension());
+ status = UNBOUNDED;
+ return;
+ }
+
+ // The problem is neither trivially unfeasible nor trivially unbounded.
+ // The tableau was successful computed and the caller has to figure
+ // out which case applies.
+ status = OPTIMIZED;
+ // Ensure the right space dimension is obtained.
+ last_generator = point();
+ last_generator.set_space_dimension(space_dimension());
+ return;
+ }
+
+ // Now we are ready to solve the first phase.
+ const bool first_phase_successful
+ = (get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_FLOAT)
+ ? compute_simplex_using_steepest_edge_float()
+ : compute_simplex_using_exact_pricing();
+
+#if PPL_NOISY_SIMPLEX
+ std::cout << "MIP_Problem::process_pending_constraints(): "
+ << "1st phase ended at iteration " << num_iterations
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+
+ if (!first_phase_successful || working_cost.get(0) != 0) {
+ // The feasible region is empty.
+ status = UNSATISFIABLE;
+ return;
+ }
+
+ // Prepare *this for a possible second phase.
+ if (begin_artificials != 0)
+ erase_artificials(begin_artificials, end_artificials);
+ compute_generator();
+ status = SATISFIABLE;
+}
+
+namespace {
+
+// NOTE: the following two `assign' helper functions are needed to
+// handle the assignment of a Coefficient to a double in method
+// MIP_Problem::steepest_edge_float_entering_index().
+// We cannot use assign_r(double, Coefficient, Rounding_Dir) as it would
+// lead to a compilation error on those platforms (e.g., ARM) where
+// controlled floating point rounding is not available (even if the
+// rounding mode would be set to ROUND_IGNORE).
+
+inline void
+assign(double& d, const mpz_class& c) {
+ d = c.get_d();
+}
+
+template <typename T, typename Policy>
+inline void
+assign(double& d,
+ const Parma_Polyhedra_Library::Checked_Number<T, Policy>& c) {
+ d = raw_value(c);
+}
+
+} // namespace
+
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_float_entering_index() const {
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ const dimension_type tableau_num_columns = tableau.num_columns();
+ PPL_ASSERT(tableau_num_rows == base.size());
+ double current_value = 0.0;
+ // Due to our integer implementation, the `1' term in the denominator
+ // of the original formula has to be replaced by `squared_lcm_basis'.
+ double float_tableau_value;
+ double float_tableau_denom;
+ dimension_type entering_index = 0;
+ const int cost_sign = sgn(working_cost.get(working_cost.size() - 1));
+
+ // These two implementation work for both sparse and dense matrices.
+ // However, when using sparse matrices the first one is fast and the second
+ // one is slow, and when using dense matrices the first one is slow and
+ // the second one is fast.
+#if PPL_USE_SPARSE_MATRIX
+
+ const dimension_type tableau_num_columns_minus_1 = tableau_num_columns - 1;
+ // This is static to improve performance.
+ // A vector of <column_index, challenger_denom> pairs, ordered by
+ // column_index.
+ static std::vector<std::pair<dimension_type, double> > columns;
+ columns.clear();
+ // (working_cost.size() - 2) is an upper bound only.
+ columns.reserve(working_cost.size() - 2);
+ {
+ working_cost_type::const_iterator i = working_cost.lower_bound(1);
+ // Note that find() is used instead of lower_bound().
+ working_cost_type::const_iterator i_end
+ = working_cost.find(tableau_num_columns_minus_1);
+ for ( ; i != i_end; ++i)
+ if (sgn(*i) == cost_sign)
+ columns.push_back(std::make_pair(i.index(), 1.0));
+ }
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ const Row& tableau_i = tableau[i];
+ assign(float_tableau_denom, tableau_i.get(base[i]));
+ Row::const_iterator j = tableau_i.begin();
+ Row::const_iterator j_end = tableau_i.end();
+ std::vector<std::pair<dimension_type, double> >::iterator k
+ = columns.begin();
+ std::vector<std::pair<dimension_type, double> >::iterator k_end
+ = columns.end();
+ while (j != j_end && k != k_end) {
+ const dimension_type column = j.index();
+ while (k != k_end && column > k->first)
+ ++k;
+ if (k == k_end)
+ break;
+ if (k->first > column) {
+ j = tableau_i.lower_bound(j, k->first);
+ }
+ else {
+ PPL_ASSERT(k->first == column);
+ PPL_ASSERT(tableau_i.get(base[i]) != 0);
+ WEIGHT_BEGIN();
+ assign(float_tableau_value, *j);
+ float_tableau_value /= float_tableau_denom;
+ float_tableau_value *= float_tableau_value;
+ k->second += float_tableau_value;
+ WEIGHT_ADD(22);
+ ++j;
+ ++k;
+ }
+ }
+ }
+ // The candidates are processed backwards to get the same result in both
+ // this implementation and the dense implementation below.
+ for (std::vector<std::pair<dimension_type, double> >::const_reverse_iterator
+ i = columns.rbegin(), i_end = columns.rend(); i != i_end; ++i) {
+ const double challenger_value = sqrt(i->second);
+ if (entering_index == 0 || challenger_value > current_value) {
+ current_value = challenger_value;
+ entering_index = i->first;
+ }
+ }
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+ double challenger_numer = 0.0;
+ double challenger_denom = 0.0;
+ for (dimension_type j = tableau_num_columns - 1; j-- > 1; ) {
+ Coefficient_traits::const_reference cost_j = working_cost.get(j);
+ if (sgn(cost_j) == cost_sign) {
+ WEIGHT_BEGIN();
+ // We cannot compute the (exact) square root of abs(\Delta x_j).
+ // The workaround is to compute the square of `cost[j]'.
+ assign(challenger_numer, cost_j);
+ challenger_numer = std::abs(challenger_numer);
+ // Due to our integer implementation, the `1' term in the denominator
+ // of the original formula has to be replaced by `squared_lcm_basis'.
+ challenger_denom = 1.0;
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ const Row& tableau_i = tableau[i];
+ Coefficient_traits::const_reference tableau_ij = tableau_i[j];
+ if (tableau_ij != 0) {
+ PPL_ASSERT(tableau_i[base[i]] != 0);
+ assign(float_tableau_value, tableau_ij);
+ assign(float_tableau_denom, tableau_i[base[i]]);
+ float_tableau_value /= float_tableau_denom;
+ challenger_denom += float_tableau_value * float_tableau_value;
+ }
+ }
+ double challenger_value = sqrt(challenger_denom);
+ // Initialize `current_value' during the first iteration.
+ // Otherwise update if the challenger wins.
+ if (entering_index == 0 || challenger_value > current_value) {
+ current_value = challenger_value;
+ entering_index = j;
+ }
+ WEIGHT_ADD_MUL(10, tableau_num_rows);
+ }
+ }
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+ return entering_index;
+}
+
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_exact_entering_index() const {
+ using std::swap;
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ PPL_ASSERT(tableau_num_rows == base.size());
+ // The square of the lcm of all the coefficients of variables in base.
+ PPL_DIRTY_TEMP_COEFFICIENT(squared_lcm_basis);
+ // The normalization factor for each coefficient in the tableau.
+ std::vector<Coefficient> norm_factor(tableau_num_rows);
+ {
+ WEIGHT_BEGIN();
+ // Compute the lcm of all the coefficients of variables in base.
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm_basis);
+ lcm_basis = 1;
+ for (dimension_type i = tableau_num_rows; i-- > 0; )
+ lcm_assign(lcm_basis, lcm_basis, tableau[i].get(base[i]));
+ // Compute normalization factors.
+ for (dimension_type i = tableau_num_rows; i-- > 0; )
+ exact_div_assign(norm_factor[i], lcm_basis, tableau[i].get(base[i]));
+ // Compute the square of `lcm_basis', exploiting the fact that
+ // `lcm_basis' will no longer be needed.
+ lcm_basis *= lcm_basis;
+ swap(squared_lcm_basis, lcm_basis);
+ WEIGHT_ADD_MUL(444, tableau_num_rows);
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(challenger_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(scalar_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(challenger_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(current_value);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(current_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(current_denom);
+ dimension_type entering_index = 0;
+ const int cost_sign = sgn(working_cost.get(working_cost.size() - 1));
+
+ // These two implementation work for both sparse and dense matrices.
+ // However, when using sparse matrices the first one is fast and the second
+ // one is slow, and when using dense matrices the first one is slow and
+ // the second one is fast.
+#if PPL_USE_SPARSE_MATRIX
+
+ const dimension_type tableau_num_columns = tableau.num_columns();
+ const dimension_type tableau_num_columns_minus_1 = tableau_num_columns - 1;
+ // This is static to improve performance.
+ // A pair (i, x) means that sgn(working_cost[i]) == cost_sign and x
+ // is the denominator of the challenger, for the column i.
+ static std::vector<std::pair<dimension_type, Coefficient> > columns;
+ columns.clear();
+ // tableau_num_columns - 2 is only an upper bound on the required elements.
+ // This helps to reduce the number of calls to new [] and delete [] and
+ // the construction/destruction of Coefficient objects.
+ columns.reserve(tableau_num_columns - 2);
+ {
+ working_cost_type::const_iterator i = working_cost.lower_bound(1);
+ // Note that find() is used instead of lower_bound.
+ working_cost_type::const_iterator i_end
+ = working_cost.find(tableau_num_columns_minus_1);
+ for ( ; i != i_end; ++i)
+ if (sgn(*i) == cost_sign)
+ columns.push_back(std::pair<dimension_type, Coefficient>
+ (i.index(), squared_lcm_basis));
+ }
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ const Row& tableau_i = tableau[i];
+ Row::const_iterator j = tableau_i.begin();
+ Row::const_iterator j_end = tableau_i.end();
+ std::vector<std::pair<dimension_type, Coefficient> >::iterator
+ k = columns.begin();
+ std::vector<std::pair<dimension_type, Coefficient> >::iterator
+ k_end = columns.end();
+ while (j != j_end) {
+ while (k != k_end && j.index() > k->first)
+ ++k;
+ if (k == k_end)
+ break;
+ PPL_ASSERT(j.index() <= k->first);
+ if (j.index() < k->first)
+ j = tableau_i.lower_bound(j, k->first);
+ else {
+ Coefficient_traits::const_reference tableau_ij = *j;
+ WEIGHT_BEGIN();
+#if PPL_USE_SPARSE_MATRIX
+ scalar_value = tableau_ij * norm_factor[i];
+ add_mul_assign(k->second, scalar_value, scalar_value);
+#else
+ // The test against 0 gives rise to a consistent speed up in the dense
+ // implementation: see
+ // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/
+ // 014000.html
+ if (tableau_ij != 0) {
+ scalar_value = tableau_ij * norm_factor[i];
+ add_mul_assign(k->second, scalar_value, scalar_value);
+ }
+#endif
+ WEIGHT_ADD_MUL(47, tableau_num_rows);
+ ++k;
+ ++j;
+ }
+ }
+ }
+ working_cost_type::const_iterator itr = working_cost.end();
+ for (std::vector<std::pair<dimension_type, Coefficient> >::reverse_iterator
+ k = columns.rbegin(), k_end = columns.rend(); k != k_end; ++k) {
+ itr = working_cost.lower_bound(itr, k->first);
+ if (itr != working_cost.end() && itr.index() == k->first) {
+ // We cannot compute the (exact) square root of abs(\Delta x_j).
+ // The workaround is to compute the square of `cost[j]'.
+ challenger_numer = (*itr) * (*itr);
+ // Initialization during the first loop.
+ if (entering_index == 0) {
+ swap(current_numer, challenger_numer);
+ swap(current_denom, k->second);
+ entering_index = k->first;
+ continue;
+ }
+ challenger_value = challenger_numer * current_denom;
+ current_value = current_numer * k->second;
+ // Update the values, if the challenger wins.
+ if (challenger_value > current_value) {
+ swap(current_numer, challenger_numer);
+ swap(current_denom, k->second);
+ entering_index = k->first;
+ }
+ }
+ else {
+ PPL_ASSERT(working_cost.get(k->first) == 0);
+ // Initialization during the first loop.
+ if (entering_index == 0) {
+ current_numer = 0;
+ swap(current_denom, k->second);
+ entering_index = k->first;
+ continue;
+ }
+ // Update the values, if the challenger wins.
+ if (0 > sgn(current_numer) * sgn(k->second)) {
+ current_numer = 0;
+ swap(current_denom, k->second);
+ entering_index = k->first;
+ }
+ }
+ }
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+ PPL_DIRTY_TEMP_COEFFICIENT(challenger_denom);
+ for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+ Coefficient_traits::const_reference cost_j = working_cost[j];
+ if (sgn(cost_j) == cost_sign) {
+ WEIGHT_BEGIN();
+ // We cannot compute the (exact) square root of abs(\Delta x_j).
+ // The workaround is to compute the square of `cost[j]'.
+ challenger_numer = cost_j * cost_j;
+ // Due to our integer implementation, the `1' term in the denominator
+ // of the original formula has to be replaced by `squared_lcm_basis'.
+ challenger_denom = squared_lcm_basis;
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ Coefficient_traits::const_reference tableau_ij = tableau[i][j];
+ // The test against 0 gives rise to a consistent speed up: see
+ // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/
+ // 014000.html
+ if (tableau_ij != 0) {
+ scalar_value = tableau_ij * norm_factor[i];
+ add_mul_assign(challenger_denom, scalar_value, scalar_value);
+ }
+ }
+ // Initialization during the first loop.
+ if (entering_index == 0) {
+ swap(current_numer, challenger_numer);
+ swap(current_denom, challenger_denom);
+ entering_index = j;
+ continue;
+ }
+ challenger_value = challenger_numer * current_denom;
+ current_value = current_numer * challenger_denom;
+ // Update the values, if the challenger wins.
+ if (challenger_value > current_value) {
+ swap(current_numer, challenger_numer);
+ swap(current_denom, challenger_denom);
+ entering_index = j;
+ }
+ WEIGHT_ADD_MUL(47, tableau_num_rows);
+ }
+ }
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+ return entering_index;
+}
+
+
+// See page 47 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem::textbook_entering_index() const {
+ // The variable entering the base is the first one whose coefficient
+ // in the cost function has the same sign the cost function itself.
+ // If no such variable exists, then we met the optimality condition
+ // (and return 0 to the caller).
+
+ // Get the "sign" of the cost function.
+ const dimension_type cost_sign_index = working_cost.size() - 1;
+ const int cost_sign = sgn(working_cost.get(cost_sign_index));
+ PPL_ASSERT(cost_sign != 0);
+
+ working_cost_type::const_iterator i = working_cost.lower_bound(1);
+ // Note that find() is used instead of lower_bound() because they are
+ // equivalent when searching the last element in the row.
+ working_cost_type::const_iterator i_end
+ = working_cost.find(cost_sign_index);
+ for ( ; i != i_end; ++i)
+ if (sgn(*i) == cost_sign)
+ return i.index();
+ // No variable has to enter the base:
+ // the cost function was optimized.
+ return 0;
+}
+
+void
+PPL::MIP_Problem::linear_combine(Row& x, const Row& y,
+ const dimension_type k) {
+ PPL_ASSERT(x.size() == y.size());
+ WEIGHT_BEGIN();
+ const dimension_type x_size = x.size();
+ Coefficient_traits::const_reference x_k = x.get(k);
+ Coefficient_traits::const_reference y_k = y.get(k);
+ PPL_ASSERT(y_k != 0 && x_k != 0);
+ // Let g be the GCD between `x[k]' and `y[k]'.
+ // For each i the following computes
+ // x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_k);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_k);
+ normalize2(x_k, y_k, normalized_x_k, normalized_y_k);
+
+ neg_assign(normalized_y_k);
+ x.linear_combine(y, normalized_y_k, normalized_x_k);
+
+ PPL_ASSERT(x.get(k) == 0);
+
+#if PPL_USE_SPARSE_MATRIX
+ PPL_ASSERT(x.find(k) == x.end());
+#endif
+
+ x.normalize();
+ WEIGHT_ADD_MUL(31, x_size);
+}
+
+// TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+void
+PPL::MIP_Problem::linear_combine(Dense_Row& x,
+ const Sparse_Row& y,
+ const dimension_type k) {
+ PPL_ASSERT(x.size() == y.size());
+ WEIGHT_BEGIN();
+ const dimension_type x_size = x.size();
+ Coefficient_traits::const_reference x_k = x.get(k);
+ Coefficient_traits::const_reference y_k = y.get(k);
+ PPL_ASSERT(y_k != 0 && x_k != 0);
+ // Let g be the GCD between `x[k]' and `y[k]'.
+ // For each i the following computes
+ // x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_k);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_k);
+ normalize2(x_k, y_k, normalized_x_k, normalized_y_k);
+
+ neg_assign(normalized_y_k);
+ Parma_Polyhedra_Library::linear_combine(x, y, normalized_y_k, normalized_x_k);
+
+ PPL_ASSERT(x[k] == 0);
+
+ x.normalize();
+ WEIGHT_ADD_MUL(83, x_size);
+}
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+bool
+PPL::MIP_Problem::is_unbounded_obj_function(
+ const Linear_Expression& x,
+ const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+ Optimization_Mode optimization_mode) {
+
+ for (Linear_Expression::const_iterator i = x.begin(),
+ i_end = x.end(); i != i_end; ++i) {
+ // If a the value of a variable in the objective function is
+ // different from zero, the final status is unbounded.
+ // In the first part the variable is constrained to be greater or equal
+ // than zero.
+ if (mapping[i.variable().space_dimension()].second != 0)
+ return true;
+ if (optimization_mode == MAXIMIZATION) {
+ if (*i > 0)
+ return true;
+ }
+ else {
+ PPL_ASSERT(optimization_mode == MINIMIZATION);
+ if (*i < 0)
+ return true;
+ }
+ }
+ return false;
+}
+
+// See pages 42-43 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::pivot(const dimension_type entering_var_index,
+ const dimension_type exiting_base_index) {
+ const Row& tableau_out = tableau[exiting_base_index];
+ // Linearly combine the constraints.
+ for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+ Row& tableau_i = tableau[i];
+ if (i != exiting_base_index && tableau_i.get(entering_var_index) != 0)
+ linear_combine(tableau_i, tableau_out, entering_var_index);
+ }
+ // Linearly combine the cost function.
+ if (working_cost.get(entering_var_index) != 0)
+ linear_combine(working_cost, tableau_out, entering_var_index);
+ // Adjust the base.
+ base[exiting_base_index] = entering_var_index;
+}
+
+// See pages 47 and 50 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem
+::get_exiting_base_index(const dimension_type entering_var_index) const {
+ // The variable exiting the base should be associated to a tableau
+ // constraint such that the ratio
+ // tableau[i][entering_var_index] / tableau[i][base[i]]
+ // is strictly positive and minimal.
+
+ // Find the first tableau constraint `c' having a positive value for
+ // tableau[i][entering_var_index] / tableau[i][base[i]]
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ dimension_type exiting_base_index = tableau_num_rows;
+ for (dimension_type i = 0; i < tableau_num_rows; ++i) {
+ const Row& t_i = tableau[i];
+ const int num_sign = sgn(t_i.get(entering_var_index));
+ if (num_sign != 0 && num_sign == sgn(t_i.get(base[i]))) {
+ exiting_base_index = i;
+ break;
+ }
+ }
+ // Check for unboundedness.
+ if (exiting_base_index == tableau_num_rows)
+ return tableau_num_rows;
+
+ // Reaching this point means that a variable will definitely exit the base.
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+ PPL_DIRTY_TEMP_COEFFICIENT(current_min);
+ PPL_DIRTY_TEMP_COEFFICIENT(challenger);
+ Coefficient t_e0 = tableau[exiting_base_index].get(0);
+ Coefficient t_ee = tableau[exiting_base_index].get(entering_var_index);
+ for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
+ const Row& t_i = tableau[i];
+ Coefficient_traits::const_reference t_ie = t_i.get(entering_var_index);
+ const int t_ie_sign = sgn(t_ie);
+ if (t_ie_sign != 0 && t_ie_sign == sgn(t_i.get(base[i]))) {
+ WEIGHT_BEGIN();
+ Coefficient_traits::const_reference t_i0 = t_i.get(0);
+ lcm_assign(lcm, t_ee, t_ie);
+ exact_div_assign(current_min, lcm, t_ee);
+ current_min *= t_e0;
+ abs_assign(current_min);
+ exact_div_assign(challenger, lcm, t_ie);
+ challenger *= t_i0;
+ abs_assign(challenger);
+ current_min -= challenger;
+ const int sign = sgn(current_min);
+ if (sign > 0
+ || (sign == 0 && base[i] < base[exiting_base_index])) {
+ exiting_base_index = i;
+ t_e0 = t_i0;
+ t_ee = t_ie;
+ }
+ WEIGHT_ADD(642);
+ }
+ }
+ return exiting_base_index;
+}
+
+// See page 49 of [PapadimitriouS98].
+bool
+PPL::MIP_Problem::compute_simplex_using_steepest_edge_float() {
+ // We may need to temporarily switch to the textbook pricing.
+ const unsigned long allowed_non_increasing_loops = 200;
+ unsigned long non_increased_times = 0;
+ bool textbook_pricing = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(cost_sgn_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(current_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(current_denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(challenger);
+ PPL_DIRTY_TEMP_COEFFICIENT(current);
+
+ cost_sgn_coeff = working_cost.get(working_cost.size() - 1);
+ current_numer = working_cost.get(0);
+ if (cost_sgn_coeff < 0)
+ neg_assign(current_numer);
+ abs_assign(current_denom, cost_sgn_coeff);
+ PPL_ASSERT(tableau.num_columns() == working_cost.size());
+ const dimension_type tableau_num_rows = tableau.num_rows();
+
+ while (true) {
+ // Choose the index of the variable entering the base, if any.
+ const dimension_type entering_var_index
+ = textbook_pricing
+ ? textbook_entering_index()
+ : steepest_edge_float_entering_index();
+
+ // If no entering index was computed, the problem is solved.
+ if (entering_var_index == 0)
+ return true;
+
+ // Choose the index of the row exiting the base.
+ const dimension_type exiting_base_index
+ = get_exiting_base_index(entering_var_index);
+ // If no exiting index was computed, the problem is unbounded.
+ if (exiting_base_index == tableau_num_rows)
+ return false;
+
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ // We have not reached the optimality or unbounded condition:
+ // compute the new base and the corresponding vertex of the
+ // feasible region.
+ pivot(entering_var_index, exiting_base_index);
+
+ WEIGHT_BEGIN();
+ // Now begins the objective function's value check to choose between
+ // the `textbook' and the float `steepest-edge' technique.
+ cost_sgn_coeff = working_cost.get(working_cost.size() - 1);
+
+ challenger = working_cost.get(0);
+ if (cost_sgn_coeff < 0)
+ neg_assign(challenger);
+ challenger *= current_denom;
+ abs_assign(current, cost_sgn_coeff);
+ current *= current_numer;
+#if PPL_NOISY_SIMPLEX
+ ++num_iterations;
+ if (num_iterations % 200 == 0)
+ std::cout << "Primal simplex: iteration " << num_iterations
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ // If the following condition fails, probably there's a bug.
+ PPL_ASSERT(challenger >= current);
+ // If the value of the objective function does not improve,
+ // keep track of that.
+ if (challenger == current) {
+ ++non_increased_times;
+ // In the following case we will proceed using the `textbook'
+ // technique, until the objective function is not improved.
+ if (non_increased_times > allowed_non_increasing_loops)
+ textbook_pricing = true;
+ }
+ // The objective function has an improvement:
+ // reset `non_increased_times' and `textbook_pricing'.
+ else {
+ non_increased_times = 0;
+ textbook_pricing = false;
+ }
+ current_numer = working_cost.get(0);
+ if (cost_sgn_coeff < 0)
+ neg_assign(current_numer);
+ abs_assign(current_denom, cost_sgn_coeff);
+ WEIGHT_ADD(433);
+ }
+}
+
+bool
+PPL::MIP_Problem::compute_simplex_using_exact_pricing() {
+ PPL_ASSERT(tableau.num_columns() == working_cost.size());
+ PPL_ASSERT(get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_EXACT
+ || get_control_parameter(PRICING) == PRICING_TEXTBOOK);
+
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ const bool textbook_pricing
+ = (PRICING_TEXTBOOK == get_control_parameter(PRICING));
+
+ while (true) {
+ // Choose the index of the variable entering the base, if any.
+ const dimension_type entering_var_index
+ = textbook_pricing
+ ? textbook_entering_index()
+ : steepest_edge_exact_entering_index();
+ // If no entering index was computed, the problem is solved.
+ if (entering_var_index == 0)
+ return true;
+
+ // Choose the index of the row exiting the base.
+ const dimension_type exiting_base_index
+ = get_exiting_base_index(entering_var_index);
+ // If no exiting index was computed, the problem is unbounded.
+ if (exiting_base_index == tableau_num_rows)
+ return false;
+
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ // We have not reached the optimality or unbounded condition:
+ // compute the new base and the corresponding vertex of the
+ // feasible region.
+ pivot(entering_var_index, exiting_base_index);
+#if PPL_NOISY_SIMPLEX
+ ++num_iterations;
+ if (num_iterations % 200 == 0)
+ std::cout << "Primal simplex: iteration " << num_iterations
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ }
+}
+
+
+// See pages 55-56 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::erase_artificials(const dimension_type begin_artificials,
+ const dimension_type end_artificials) {
+ PPL_ASSERT(0 < begin_artificials && begin_artificials < end_artificials);
+
+ const dimension_type old_last_column = tableau.num_columns() - 1;
+ dimension_type tableau_n_rows = tableau.num_rows();
+ // Step 1: try to remove from the base all the remaining slack variables.
+ for (dimension_type i = 0; i < tableau_n_rows; ++i)
+ if (begin_artificials <= base[i] && base[i] < end_artificials) {
+ // Search for a non-zero element to enter the base.
+ Row& tableau_i = tableau[i];
+ bool redundant = true;
+ Row::const_iterator j = tableau_i.begin();
+ Row::const_iterator j_end = tableau_i.end();
+ // Skip the first element
+ if (j != j_end && j.index() == 0)
+ ++j;
+ for ( ; (j != j_end) && (j.index() < begin_artificials); ++j)
+ if (*j != 0) {
+ pivot(j.index(), i);
+ redundant = false;
+ break;
+ }
+ if (redundant) {
+ // No original variable entered the base:
+ // the constraint is redundant and should be deleted.
+ --tableau_n_rows;
+ if (i < tableau_n_rows) {
+ // Replace the redundant row with the last one,
+ // taking care of adjusting the iteration index.
+ tableau_i.m_swap(tableau[tableau_n_rows]);
+ base[i] = base[tableau_n_rows];
+ --i;
+ }
+ tableau.remove_trailing_rows(1);
+ base.pop_back();
+ }
+ }
+
+ // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
+
+ // Resize the tableau.
+ const dimension_type num_artificials = end_artificials - begin_artificials;
+ tableau.remove_trailing_columns(num_artificials);
+
+ // Zero the last column of the tableau.
+ const dimension_type new_last_column = tableau.num_columns() - 1;
+ for (dimension_type i = tableau_n_rows; i-- > 0; )
+ tableau[i].reset(new_last_column);
+
+ // ... then properly set the element in the (new) last column,
+ // encoding the kind of optimization; ...
+ {
+ // This block is equivalent to
+ //
+ // <CODE>
+ // working_cost[new_last_column] = working_cost.get(old_last_column);
+ // </CODE>
+ //
+ // but it avoids storing zeroes.
+ Coefficient_traits::const_reference old_cost
+ = working_cost.get(old_last_column);
+ if (old_cost == 0)
+ working_cost.reset(new_last_column);
+ else
+ working_cost.insert(new_last_column, old_cost);
+ }
+
+ // ... and finally remove redundant columns.
+ const dimension_type working_cost_new_size
+ = working_cost.size() - num_artificials;
+ working_cost.shrink(working_cost_new_size);
+}
+
+// See page 55 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::compute_generator() const {
+ // Early exit for 0-dimensional problems.
+ if (external_space_dim == 0) {
+ MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+ x.last_generator = point();
+ return;
+ }
+
+ // We will store in numer[] and in denom[] the numerators and
+ // the denominators of every variable of the original problem.
+ std::vector<Coefficient> numer(external_space_dim);
+ std::vector<Coefficient> denom(external_space_dim);
+ dimension_type row = 0;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+ // Speculatively allocate temporaries out of loop.
+ PPL_DIRTY_TEMP_COEFFICIENT(split_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(split_denom);
+
+ // We start to compute numer[] and denom[].
+ for (dimension_type i = external_space_dim; i-- > 0; ) {
+ Coefficient& numer_i = numer[i];
+ Coefficient& denom_i = denom[i];
+ // Get the value of the variable from the tableau
+ // (if it is not a basic variable, the value is 0).
+ const dimension_type original_var = mapping[i+1].first;
+ if (is_in_base(original_var, row)) {
+ const Row& t_row = tableau[row];
+ Coefficient_traits::const_reference t_row_original_var
+ = t_row.get(original_var);
+ if (t_row_original_var > 0) {
+ neg_assign(numer_i, t_row.get(0));
+ denom_i = t_row_original_var;
+ }
+ else {
+ numer_i = t_row.get(0);
+ neg_assign(denom_i, t_row_original_var);
+ }
+ }
+ else {
+ numer_i = 0;
+ denom_i = 1;
+ }
+ // Check whether the variable was split.
+ const dimension_type split_var = mapping[i+1].second;
+ if (split_var != 0) {
+ // The variable was split: get the value for the negative component,
+ // having index mapping[i+1].second .
+ // Like before, we he have to check if the variable is in base.
+ if (is_in_base(split_var, row)) {
+ const Row& t_row = tableau[row];
+ Coefficient_traits::const_reference t_row_split_var
+ = t_row.get(split_var);
+ if (t_row_split_var > 0) {
+ neg_assign(split_numer, t_row.get(0));
+ split_denom = t_row_split_var;
+ }
+ else {
+ split_numer = t_row.get(0);
+ neg_assign(split_denom, t_row_split_var);
+ }
+ // We compute the lcm to compute subsequently the difference
+ // between the 2 variables.
+ lcm_assign(lcm, denom_i, split_denom);
+ exact_div_assign(denom_i, lcm, denom_i);
+ exact_div_assign(split_denom, lcm, split_denom);
+ numer_i *= denom_i;
+ sub_mul_assign(numer_i, split_numer, split_denom);
+ if (numer_i == 0)
+ denom_i = 1;
+ else
+ denom_i = lcm;
+ }
+ // Note: if the negative component was not in base, then
+ // it has value zero and there is nothing left to do.
+ }
+ }
+
+ // Compute the lcm of all denominators.
+ PPL_ASSERT(external_space_dim > 0);
+ lcm = denom[0];
+ for (dimension_type i = 1; i < external_space_dim; ++i)
+ lcm_assign(lcm, lcm, denom[i]);
+ // Use the denominators to store the numerators' multipliers
+ // and then compute the normalized numerators.
+ for (dimension_type i = external_space_dim; i-- > 0; ) {
+ exact_div_assign(denom[i], lcm, denom[i]);
+ numer[i] *= denom[i];
+ }
+
+ // Finally, build the generator.
+ Linear_Expression expr;
+ for (dimension_type i = external_space_dim; i-- > 0; )
+ add_mul_assign(expr, numer[i], Variable(i));
+
+ MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+ x.last_generator = point(expr, lcm);
+}
+
+void
+PPL::MIP_Problem::second_phase() {
+ // Second_phase requires that *this is satisfiable.
+ PPL_ASSERT(status == SATISFIABLE
+ || status == UNBOUNDED
+ || status == OPTIMIZED);
+ // In the following cases the problem is already solved.
+ if (status == UNBOUNDED || status == OPTIMIZED)
+ return;
+
+ // Build the objective function for the second phase.
+ Row new_cost;
+ input_obj_function.get_row(new_cost);
+
+ // Negate the cost function if we are minimizing.
+ if (opt_mode == MINIMIZATION)
+ for (Row::iterator i = new_cost.begin(),
+ i_end = new_cost.end(); i != i_end; ++i)
+ neg_assign(*i);
+
+ const dimension_type cost_zero_size = working_cost.size();
+
+ // Substitute properly the cost function in the `costs' matrix.
+ {
+ working_cost_type tmp_cost(cost_zero_size, cost_zero_size);
+ swap(tmp_cost, working_cost);
+ }
+
+ {
+ working_cost_type::iterator itr
+ = working_cost.insert(cost_zero_size - 1, Coefficient_one());
+
+ // Split the variables in the cost function.
+ for (Row::const_iterator i = new_cost.lower_bound(1),
+ i_end = new_cost.end(); i != i_end; ++i) {
+ const dimension_type index = i.index();
+ const dimension_type original_var = mapping[index].first;
+ const dimension_type split_var = mapping[index].second;
+ itr = working_cost.insert(itr, original_var, *i);
+ if (mapping[index].second != 0) {
+ itr = working_cost.insert(itr, split_var);
+ neg_assign(*itr, *i);
+ }
+ }
+ }
+
+ // Here the first phase problem succeeded with optimum value zero.
+ // Express the old cost function in terms of the computed base.
+ {
+ working_cost_type::iterator itr = working_cost.end();
+ for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+ const dimension_type base_i = base[i];
+ itr = working_cost.lower_bound(itr, base_i);
+ if (itr != working_cost.end() && itr.index() == base_i && *itr != 0) {
+ linear_combine(working_cost, tableau[i], base_i);
+ itr = working_cost.end();
+ }
+ }
+ }
+
+ // Solve the second phase problem.
+ const bool second_phase_successful
+ = (get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_FLOAT)
+ ? compute_simplex_using_steepest_edge_float()
+ : compute_simplex_using_exact_pricing();
+ compute_generator();
+#if PPL_NOISY_SIMPLEX
+ std::cout << "MIP_Problem::second_phase(): 2nd phase ended at iteration "
+ << num_iterations
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ status = second_phase_successful ? OPTIMIZED : UNBOUNDED;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem
+::evaluate_objective_function(const Generator& evaluating_point,
+ Coefficient& numer,
+ Coefficient& denom) const {
+ const dimension_type ep_space_dim = evaluating_point.space_dimension();
+ if (space_dimension() < ep_space_dim)
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "evaluate_objective_function(p, n, d):\n"
+ "*this and p are dimension incompatible.");
+ if (!evaluating_point.is_point())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "evaluate_objective_function(p, n, d):\n"
+ "p is not a point.");
+
+ // Compute the smallest space dimension between `input_obj_function'
+ // and `evaluating_point'.
+ const dimension_type working_space_dim
+ = std::min(ep_space_dim, input_obj_function.space_dimension());
+ input_obj_function.scalar_product_assign(numer,
+ evaluating_point.expr,
+ 0, working_space_dim + 1);
+
+ // Numerator and denominator should be coprime.
+ normalize2(numer, evaluating_point.divisor(), numer, denom);
+}
+
+bool
+PPL::MIP_Problem::is_lp_satisfiable() const {
+#if PPL_NOISY_SIMPLEX
+ num_iterations = 0;
+#endif // PPL_NOISY_SIMPLEX
+ switch (status) {
+ case UNSATISFIABLE:
+ return false;
+ case SATISFIABLE:
+ // Intentionally fall through.
+ case UNBOUNDED:
+ // Intentionally fall through.
+ case OPTIMIZED:
+ // Intentionally fall through.
+ return true;
+ case PARTIALLY_SATISFIABLE:
+ {
+ MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+ // This code tries to handle the case that happens if the tableau is
+ // empty, so it must be initialized.
+ if (tableau.num_columns() == 0) {
+ // Add two columns, the first that handles the inhomogeneous term and
+ // the second that represent the `sign'.
+ x.tableau.add_zero_columns(2);
+ // Sync `mapping' for the inhomogeneous term.
+ x.mapping.push_back(std::make_pair(0, 0));
+ // The internal data structures are ready, so prepare for more
+ // assertion to be checked.
+ x.initialized = true;
+ }
+
+ // Apply incrementality to the pending constraint system.
+ x.process_pending_constraints();
+ // Update `first_pending_constraint': no more pending.
+ x.first_pending_constraint = input_cs.size();
+ // Update also `internal_space_dim'.
+ x.internal_space_dim = x.external_space_dim;
+ PPL_ASSERT(OK());
+ return status != UNSATISFIABLE;
+ }
+ }
+ // We should not be here!
+ PPL_UNREACHABLE;
+ return false;
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve_mip(bool& have_incumbent_solution,
+ mpq_class& incumbent_solution_value,
+ Generator& incumbent_solution_point,
+ MIP_Problem& mip,
+ const Variables_Set& i_vars) {
+ // Solve the problem as a non MIP one, it must be done internally.
+ PPL::MIP_Problem_Status mip_status;
+ if (mip.is_lp_satisfiable()) {
+ mip.second_phase();
+ mip_status = (mip.status == OPTIMIZED) ? OPTIMIZED_MIP_PROBLEM
+ : UNBOUNDED_MIP_PROBLEM;
+ }
+ else
+ return UNFEASIBLE_MIP_PROBLEM;
+
+ PPL_DIRTY_TEMP(mpq_class, tmp_rational);
+
+ Generator p = point();
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1);
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2);
+
+ if (mip_status == UNBOUNDED_MIP_PROBLEM)
+ p = mip.last_generator;
+ else {
+ PPL_ASSERT(mip_status == OPTIMIZED_MIP_PROBLEM);
+ // Do not call optimizing_point().
+ p = mip.last_generator;
+ mip.evaluate_objective_function(p, tmp_coeff1, tmp_coeff2);
+ assign_r(tmp_rational.get_num(), tmp_coeff1, ROUND_NOT_NEEDED);
+ assign_r(tmp_rational.get_den(), tmp_coeff2, ROUND_NOT_NEEDED);
+ PPL_ASSERT(is_canonical(tmp_rational));
+ if (have_incumbent_solution
+ && ((mip.optimization_mode() == MAXIMIZATION
+ && tmp_rational <= incumbent_solution_value)
+ || (mip.optimization_mode() == MINIMIZATION
+ && tmp_rational >= incumbent_solution_value)))
+ // Abandon this path.
+ return mip_status;
+ }
+
+ bool found_satisfiable_generator = true;
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ Coefficient_traits::const_reference p_divisor = p.divisor();
+ dimension_type non_int_dim = mip.space_dimension();
+ // TODO: This can be optimized more, exploiting the (possible)
+ // sparseness of p, if the size of i_vars is expected to be greater than
+ // the number of nonzeroes in p in most cases.
+ for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+ v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+ gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+ if (gcd != p_divisor) {
+ non_int_dim = *v_begin;
+ found_satisfiable_generator = false;
+ break;
+ }
+ }
+ if (found_satisfiable_generator) {
+ // All the coordinates of `point' are satisfiable.
+ if (mip_status == UNBOUNDED_MIP_PROBLEM) {
+ // This is a point that belongs to the MIP_Problem.
+ // In this way we are sure that we will return every time
+ // a feasible point if requested by the user.
+ incumbent_solution_point = p;
+ return mip_status;
+ }
+ if (!have_incumbent_solution
+ || (mip.optimization_mode() == MAXIMIZATION
+ && tmp_rational > incumbent_solution_value)
+ || tmp_rational < incumbent_solution_value) {
+ incumbent_solution_value = tmp_rational;
+ incumbent_solution_point = p;
+ have_incumbent_solution = true;
+#if PPL_NOISY_SIMPLEX
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ mip.evaluate_objective_function(p, numer, denom);
+ std::cout << "MIP_Problem::solve_mip(): "
+ << "new value found: " << numer << "/" << denom
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ }
+ return mip_status;
+ }
+
+ PPL_ASSERT(non_int_dim < mip.space_dimension());
+
+ assign_r(tmp_rational.get_num(), p.coefficient(Variable(non_int_dim)),
+ ROUND_NOT_NEEDED);
+ assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+ tmp_rational.canonicalize();
+ assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+ assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+ {
+ MIP_Problem mip_aux(mip, Inherit_Constraints());
+ mip_aux.add_constraint(Variable(non_int_dim) <= tmp_coeff1);
+#if PPL_NOISY_SIMPLEX
+ using namespace IO_Operators;
+ std::cout << "MIP_Problem::solve_mip(): "
+ << "descending with: "
+ << (Variable(non_int_dim) <= tmp_coeff1)
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ solve_mip(have_incumbent_solution, incumbent_solution_value,
+ incumbent_solution_point, mip_aux, i_vars);
+ }
+ // TODO: change this when we will be able to remove constraints.
+ mip.add_constraint(Variable(non_int_dim) >= tmp_coeff2);
+#if PPL_NOISY_SIMPLEX
+ using namespace IO_Operators;
+ std::cout << "MIP_Problem::solve_mip(): "
+ << "descending with: "
+ << (Variable(non_int_dim) >= tmp_coeff2)
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ solve_mip(have_incumbent_solution, incumbent_solution_value,
+ incumbent_solution_point, mip, i_vars);
+ return have_incumbent_solution ? mip_status : UNFEASIBLE_MIP_PROBLEM;
+}
+
+bool
+PPL::MIP_Problem::choose_branching_variable(const MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ dimension_type& branching_index) {
+ // Insert here the variables that do not satisfy the integrality
+ // condition.
+ const std::vector<Constraint*>& input_cs = mip.input_cs;
+ const Generator& last_generator = mip.last_generator;
+ Coefficient_traits::const_reference last_generator_divisor
+ = last_generator.divisor();
+ Variables_Set candidate_variables;
+
+ // TODO: This can be optimized more, exploiting the (possible)
+ // sparseness of last_generator, if the size of i_vars is expected to be
+ // greater than the number of nonzeroes in last_generator in most cases.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ for (Variables_Set::const_iterator v_it = i_vars.begin(),
+ v_end = i_vars.end(); v_it != v_end; ++v_it) {
+ gcd_assign(gcd,
+ last_generator.coefficient(Variable(*v_it)),
+ last_generator_divisor);
+ if (gcd != last_generator_divisor)
+ candidate_variables.insert(*v_it);
+ }
+ // If this set is empty, we have finished.
+ if (candidate_variables.empty())
+ return true;
+
+ // Check how many `active constraints' we have and track them.
+ const dimension_type input_cs_num_rows = input_cs.size();
+ std::deque<bool> satisfiable_constraints (input_cs_num_rows, false);
+ for (dimension_type i = input_cs_num_rows; i-- > 0; )
+ // An equality is an `active constraint' by definition.
+ // If we have an inequality, check if it is an `active constraint'.
+ if (input_cs[i]->is_equality()
+ || is_saturated(*(input_cs[i]), last_generator))
+ satisfiable_constraints[i] = true;
+
+ dimension_type winning_num_appearances = 0;
+
+ std::vector<dimension_type>
+ num_appearances(candidate_variables.space_dimension(), 0);
+
+ // For every candidate variable, check how many times this appear in the
+ // active constraints.
+ for (dimension_type i = input_cs_num_rows; i-- > 0; ) {
+ if (!satisfiable_constraints[i])
+ continue;
+ // TODO: This can be optimized more, exploiting the (possible)
+ // sparseness of input_cs, if the size of candidate_variables is expected
+ // to be greater than the number of nonzeroes of most rows.
+ for (Variables_Set::const_iterator v_it = candidate_variables.begin(),
+ v_end = candidate_variables.end(); v_it != v_end; ++v_it) {
+ if (*v_it >= input_cs[i]->space_dimension())
+ break;
+ if (input_cs[i]->coefficient(Variable(*v_it)) != 0)
+ ++num_appearances[*v_it];
+ }
+ }
+ for (Variables_Set::const_iterator v_it = candidate_variables.begin(),
+ v_end = candidate_variables.end(); v_it != v_end; ++v_it) {
+ const dimension_type n = num_appearances[*v_it];
+ if (n >= winning_num_appearances) {
+ winning_num_appearances = n;
+ branching_index = *v_it;
+ }
+ }
+ return false;
+}
+
+bool
+PPL::MIP_Problem::is_mip_satisfiable(MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ Generator& p) {
+#if PPL_NOISY_SIMPLEX
+ ++mip_recursion_level;
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "entering recursion level " << mip_recursion_level
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ PPL_ASSERT(mip.integer_space_dimensions().empty());
+
+ // Solve the MIP problem.
+ if (!mip.is_lp_satisfiable()) {
+#if PPL_NOISY_SIMPLEX
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "exiting from recursion level " << mip_recursion_level
+ << "." << std::endl;
+ --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+ return false;
+ }
+
+ PPL_DIRTY_TEMP(mpq_class, tmp_rational);
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1);
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2);
+ bool found_satisfiable_generator = true;
+ dimension_type non_int_dim;
+ p = mip.last_generator;
+ Coefficient_traits::const_reference p_divisor = p.divisor();
+
+#if PPL_SIMPLEX_USE_MIP_HEURISTIC
+ found_satisfiable_generator
+ = choose_branching_variable(mip, i_vars, non_int_dim);
+#else
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ // TODO: This can be optimized more, exploiting the (possible)
+ // sparseness of p, if the size of i_vars is expected to be greater than
+ // the number of nonzeroes in p in most cases.
+ for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+ v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+ gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+ if (gcd != p_divisor) {
+ non_int_dim = *v_begin;
+ found_satisfiable_generator = false;
+ break;
+ }
+ }
+#endif
+
+ if (found_satisfiable_generator)
+ return true;
+
+ PPL_ASSERT(non_int_dim < mip.space_dimension());
+
+ assign_r(tmp_rational.get_num(), p.coefficient(Variable(non_int_dim)),
+ ROUND_NOT_NEEDED);
+ assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+ tmp_rational.canonicalize();
+ assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+ assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+ {
+ MIP_Problem mip_aux(mip, Inherit_Constraints());
+ mip_aux.add_constraint(Variable(non_int_dim) <= tmp_coeff1);
+#if PPL_NOISY_SIMPLEX
+ using namespace IO_Operators;
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "descending with: "
+ << (Variable(non_int_dim) <= tmp_coeff1)
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ if (is_mip_satisfiable(mip_aux, i_vars, p)) {
+#if PPL_NOISY_SIMPLEX
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "exiting from recursion level " << mip_recursion_level
+ << "." << std::endl;
+ --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+ return true;
+ }
+ }
+ mip.add_constraint(Variable(non_int_dim) >= tmp_coeff2);
+#if PPL_NOISY_SIMPLEX
+ using namespace IO_Operators;
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "descending with: "
+ << (Variable(non_int_dim) >= tmp_coeff2)
+ << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+ const bool satisfiable = is_mip_satisfiable(mip, i_vars, p);
+#if PPL_NOISY_SIMPLEX
+ std::cout << "MIP_Problem::is_mip_satisfiable(): "
+ << "exiting from recursion level " << mip_recursion_level
+ << "." << std::endl;
+ --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+ return satisfiable;
+}
+
+bool
+PPL::MIP_Problem::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+ const dimension_type input_cs_num_rows = input_cs.size();
+
+ // Check that every member used is OK.
+
+ if (inherited_constraints > input_cs_num_rows) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem claims to have inherited from its ancestors "
+ << "more constraints than are recorded in this->input_cs."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (first_pending_constraint > input_cs_num_rows) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem claims to have pending constraints "
+ << "that are not recorded in this->input_cs."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (!tableau.OK() || !last_generator.OK())
+ return false;
+
+ // Constraint system should contain no strict inequalities.
+ for (dimension_type i = input_cs_num_rows; i-- > 0; )
+ if (input_cs[i]->is_strict_inequality()) {
+#ifndef NDEBUG
+ cerr << "The feasible region of the MIP_Problem is defined by "
+ << "a constraint system containing strict inequalities."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (external_space_dim < internal_space_dim) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem claims to have an internal space dimension "
+ << "greater than its external space dimension."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (external_space_dim > internal_space_dim
+ && status != UNSATISFIABLE
+ && status != PARTIALLY_SATISFIABLE) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem claims to have a pending space dimension "
+ << "addition, but the status is incompatible."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ // Constraint system and objective function should be dimension compatible.
+ if (external_space_dim < input_obj_function.space_dimension()) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem and the objective function have "
+ << "incompatible space dimensions ("
+ << external_space_dim << " < "
+ << input_obj_function.space_dimension() << ")."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (status != UNSATISFIABLE && initialized) {
+ // Here `last_generator' has to be meaningful.
+ // Check for dimension compatibility and actual feasibility.
+ if (internal_space_dim != last_generator.space_dimension()) {
+#ifndef NDEBUG
+ cerr << "The MIP_Problem and the cached feasible point have "
+ << "incompatible space dimensions ("
+ << internal_space_dim << " != "
+ << last_generator.space_dimension() << ")."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ for (dimension_type i = 0; i < first_pending_constraint; ++i)
+ if (!is_satisfied(*(input_cs[i]), last_generator)) {
+#ifndef NDEBUG
+ cerr << "The cached feasible point does not belong to "
+ << "the feasible region of the MIP_Problem."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ // Check that every integer declared variable is really integer.
+ // in the solution found.
+ if (!i_variables.empty()) {
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ // TODO: This can be optimized more, exploiting the (possible)
+ // sparseness of last_generator, if the size of i_variables is expected
+ // to be greater than the number of nonzeroes in last_generator in most
+ // cases.
+ for (Variables_Set::const_iterator v_it = i_variables.begin(),
+ v_end = i_variables.end(); v_it != v_end; ++v_it) {
+ gcd_assign(gcd, last_generator.coefficient(Variable(*v_it)),
+ last_generator.divisor());
+ if (gcd != last_generator.divisor())
+ return false;
+ }
+ }
+
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ const dimension_type tableau_num_columns = tableau.num_columns();
+
+ // The number of rows in the tableau and base should be equal.
+ if (tableau_num_rows != base.size()) {
+#ifndef NDEBUG
+ cerr << "tableau and base have incompatible sizes" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ // The size of `mapping' should be equal to the internal
+ // space dimension plus one.
+ if (mapping.size() != internal_space_dim + 1) {
+#ifndef NDEBUG
+ cerr << "The internal space dimension and `mapping' "
+ << "have incompatible sizes" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ // The number of columns in the tableau and working_cost should be equal.
+ if (tableau_num_columns != working_cost.size()) {
+#ifndef NDEBUG
+ cerr << "tableau and working_cost have incompatible sizes" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ // The vector base should contain indices of tableau's columns.
+ for (dimension_type i = base.size(); i-- > 0; ) {
+ if (base[i] > tableau_num_columns) {
+#ifndef NDEBUG
+ cerr << "base contains an invalid column index" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+ {
+ // Needed to sort accesses to tableau_j, improving performance.
+ typedef std::vector<std::pair<dimension_type, dimension_type> >
+ pair_vector_t;
+ pair_vector_t vars_in_base;
+ for (dimension_type i = base.size(); i-- > 0; )
+ vars_in_base.push_back(std::make_pair(base[i], i));
+
+ std::sort(vars_in_base.begin(), vars_in_base.end());
+
+ for (dimension_type j = tableau_num_rows; j-- > 0; ) {
+ const Row& tableau_j = tableau[j];
+ pair_vector_t::iterator i = vars_in_base.begin();
+ pair_vector_t::iterator i_end = vars_in_base.end();
+ Row::const_iterator itr = tableau_j.begin();
+ Row::const_iterator itr_end = tableau_j.end();
+ for ( ; i != i_end && itr != itr_end; ++i) {
+ // tableau[i][base[j]], with i different from j, must be zero.
+ if (itr.index() < i->first)
+ itr = tableau_j.lower_bound(itr, itr.index());
+ if (i->second != j && itr.index() == i->first && *itr != 0) {
+#ifndef NDEBUG
+ cerr << "tableau[i][base[j]], with i different from j, must be "
+ << "zero" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+ }
+ }
+ // tableau[i][base[i]] must not be a zero.
+ for (dimension_type i = base.size(); i-- > 0; ) {
+ if (tableau[i].get(base[i]) == 0) {
+#ifndef NDEBUG
+ cerr << "tableau[i][base[i]] must not be a zero" << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+
+ // The last column of the tableau must contain only zeroes.
+ for (dimension_type i = tableau_num_rows; i-- > 0; )
+ if (tableau[i].get(tableau_num_columns - 1) != 0) {
+#ifndef NDEBUG
+ cerr << "the last column of the tableau must contain only"
+ "zeroes"<< endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+void
+PPL::MIP_Problem::ascii_dump(std::ostream& s) const {
+ using namespace IO_Operators;
+ s << "\nexternal_space_dim: " << external_space_dim << " \n";
+ s << "\ninternal_space_dim: " << internal_space_dim << " \n";
+
+ const dimension_type input_cs_size = input_cs.size();
+
+ s << "\ninput_cs( " << input_cs_size << " )\n";
+ for (dimension_type i = 0; i < input_cs_size; ++i)
+ input_cs[i]->ascii_dump(s);
+
+ s << "\ninherited_constraints: " << inherited_constraints
+ << std::endl;
+
+ s << "\nfirst_pending_constraint: " << first_pending_constraint
+ << std::endl;
+
+ s << "\ninput_obj_function\n";
+ input_obj_function.ascii_dump(s);
+ s << "\nopt_mode "
+ << ((opt_mode == MAXIMIZATION) ? "MAXIMIZATION" : "MINIMIZATION") << "\n";
+
+ s << "\ninitialized: " << (initialized ? "YES" : "NO") << "\n";
+ s << "\npricing: ";
+ switch (pricing) {
+ case PRICING_STEEPEST_EDGE_FLOAT:
+ s << "PRICING_STEEPEST_EDGE_FLOAT";
+ break;
+ case PRICING_STEEPEST_EDGE_EXACT:
+ s << "PRICING_STEEPEST_EDGE_EXACT";
+ break;
+ case PRICING_TEXTBOOK:
+ s << "PRICING_TEXTBOOK";
+ break;
+ }
+ s << "\n";
+
+ s << "\nstatus: ";
+ switch (status) {
+ case UNSATISFIABLE:
+ s << "UNSATISFIABLE";
+ break;
+ case SATISFIABLE:
+ s << "SATISFIABLE";
+ break;
+ case UNBOUNDED:
+ s << "UNBOUNDED";
+ break;
+ case OPTIMIZED:
+ s << "OPTIMIZED";
+ break;
+ case PARTIALLY_SATISFIABLE:
+ s << "PARTIALLY_SATISFIABLE";
+ break;
+ }
+ s << "\n";
+
+ s << "\ntableau\n";
+ tableau.ascii_dump(s);
+ s << "\nworking_cost( " << working_cost.size()<< " )\n";
+ working_cost.ascii_dump(s);
+
+ const dimension_type base_size = base.size();
+ s << "\nbase( " << base_size << " )\n";
+ for (dimension_type i = 0; i != base_size; ++i)
+ s << base[i] << ' ';
+
+ s << "\nlast_generator\n";
+ last_generator.ascii_dump(s);
+
+ const dimension_type mapping_size = mapping.size();
+ s << "\nmapping( " << mapping_size << " )\n";
+ for (dimension_type i = 1; i < mapping_size; ++i)
+ s << "\n"<< i << " -> " << mapping[i].first << " -> " << mapping[i].second
+ << ' ';
+
+ s << "\n\ninteger_variables";
+ i_variables.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(MIP_Problem)
+
+bool
+PPL::MIP_Problem::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "external_space_dim:")
+ return false;
+
+ if (!(s >> external_space_dim))
+ return false;
+
+ if (!(s >> str) || str != "internal_space_dim:")
+ return false;
+
+ if (!(s >> internal_space_dim))
+ return false;
+
+ if (!(s >> str) || str != "input_cs(")
+ return false;
+
+ dimension_type input_cs_size;
+
+ if (!(s >> input_cs_size))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ Constraint c(Constraint::zero_dim_positivity());
+ input_cs.reserve(input_cs_size);
+ for (dimension_type i = 0; i < input_cs_size; ++i) {
+ if (!c.ascii_load(s))
+ return false;
+ add_constraint_helper(c);
+ }
+
+ if (!(s >> str) || str != "inherited_constraints:")
+ return false;
+
+ if (!(s >> inherited_constraints))
+ return false;
+ // NOTE: we loaded the number of inherited constraints, but we nonetheless
+ // reset to zero the corresponding data member, since we do not support
+ // constraint inheritance via ascii_load.
+ inherited_constraints = 0;
+
+ if (!(s >> str) || str != "first_pending_constraint:")
+ return false;
+
+ if (!(s >> first_pending_constraint))
+ return false;
+
+ if (!(s >> str) || str != "input_obj_function")
+ return false;
+
+ if (!input_obj_function.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "opt_mode")
+ return false;
+
+ if (!(s >> str))
+ return false;
+
+ if (str == "MAXIMIZATION")
+ set_optimization_mode(MAXIMIZATION);
+ else {
+ if (str != "MINIMIZATION")
+ return false;
+ set_optimization_mode(MINIMIZATION);
+ }
+
+ if (!(s >> str) || str != "initialized:")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "YES")
+ initialized = true;
+ else if (str == "NO")
+ initialized = false;
+ else
+ return false;
+
+ if (!(s >> str) || str != "pricing:")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "PRICING_STEEPEST_EDGE_FLOAT")
+ pricing = PRICING_STEEPEST_EDGE_FLOAT;
+ else if (str == "PRICING_STEEPEST_EDGE_EXACT")
+ pricing = PRICING_STEEPEST_EDGE_EXACT;
+ else if (str == "PRICING_TEXTBOOK")
+ pricing = PRICING_TEXTBOOK;
+ else
+ return false;
+
+ if (!(s >> str) || str != "status:")
+ return false;
+
+ if (!(s >> str))
+ return false;
+
+ if (str == "UNSATISFIABLE")
+ status = UNSATISFIABLE;
+ else if (str == "SATISFIABLE")
+ status = SATISFIABLE;
+ else if (str == "UNBOUNDED")
+ status = UNBOUNDED;
+ else if (str == "OPTIMIZED")
+ status = OPTIMIZED;
+ else if (str == "PARTIALLY_SATISFIABLE")
+ status = PARTIALLY_SATISFIABLE;
+ else
+ return false;
+
+ if (!(s >> str) || str != "tableau")
+ return false;
+
+ if (!tableau.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "working_cost(")
+ return false;
+
+ dimension_type working_cost_dim;
+
+ if (!(s >> working_cost_dim))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ if (!working_cost.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "base(")
+ return false;
+
+ dimension_type base_size;
+ if (!(s >> base_size))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ for (dimension_type i = 0; i != base_size; ++i) {
+ dimension_type base_value;
+ if (!(s >> base_value))
+ return false;
+ base.push_back(base_value);
+ }
+
+ if (!(s >> str) || str != "last_generator")
+ return false;
+
+ if (!last_generator.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "mapping(")
+ return false;
+
+ dimension_type mapping_size;
+ if (!(s >> mapping_size))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ // The first `mapping' index is never used, so we initialize
+ // it pushing back a dummy value.
+ if (tableau.num_columns() != 0)
+ mapping.push_back(std::make_pair(0, 0));
+
+ for (dimension_type i = 1; i < mapping_size; ++i) {
+ dimension_type index;
+ if (!(s >> index))
+ return false;
+
+ if (!(s >> str) || str != "->")
+ return false;
+
+ dimension_type first_value;
+ if (!(s >> first_value))
+ return false;
+
+ if (!(s >> str) || str != "->")
+ return false;
+
+ dimension_type second_value;
+ if (!(s >> second_value))
+ return false;
+
+ mapping.push_back(std::make_pair(first_value, second_value));
+ }
+
+ if (!(s >> str) || str != "integer_variables")
+ return false;
+
+ if (!i_variables.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const MIP_Problem& mip) {
+ s << "Constraints:";
+ for (MIP_Problem::const_iterator i = mip.constraints_begin(),
+ i_end = mip.constraints_end(); i != i_end; ++i)
+ s << "\n" << *i;
+ s << "\nObjective function: "
+ << mip.objective_function()
+ << "\nOptimization mode: "
+ << ((mip.optimization_mode() == MAXIMIZATION)
+ ? "MAXIMIZATION"
+ : "MINIMIZATION");
+ s << "\nInteger variables: " << mip.integer_space_dimensions();
+ return s;
+}
diff --git a/src/MIP_Problem_defs.hh b/src/MIP_Problem_defs.hh
new file mode 100644
index 0000000..989838f
--- /dev/null
+++ b/src/MIP_Problem_defs.hh
@@ -0,0 +1,975 @@
+/* MIP_Problem class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_defs_hh
+#define PPL_MIP_Problem_defs_hh 1
+
+#include "MIP_Problem_types.hh"
+#include "globals_types.hh"
+#include "Matrix_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include <vector>
+#include <deque>
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& mip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates MIP_Problem */
+void swap(MIP_Problem& x, MIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+ An object of this class encodes a mixed integer (linear) programming
+ problem.
+ The MIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the feasible region, by means of a finite set of linear equality
+ and non-strict inequality constraints;
+ - the subset of the unknown variables that range over the integers
+ (the other variables implicitly ranging over the reals);
+ - the objective function, described by a Linear_Expression;
+ - the optimization mode (either maximization or minimization).
+
+ The class provides support for the (incremental) solution of the
+ MIP problem based on variations of the revised simplex method and
+ on branch-and-bound techniques. The result of the resolution
+ process is expressed in terms of an enumeration, encoding the
+ feasibility and the unboundedness of the optimization problem.
+ The class supports simple feasibility tests (i.e., no optimization),
+ as well as the extraction of an optimal (resp., feasible) point,
+ provided the MIP_Problem is optimizable (resp., feasible).
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given MIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of constraints,
+ the change of objective function and the change of optimization mode.
+*/
+class Parma_Polyhedra_Library::MIP_Problem {
+public:
+ //! Builds a trivial MIP problem.
+ /*!
+ A trivial MIP problem requires to maximize the objective function
+ \f$0\f$ on a vector space under no constraints at all:
+ the origin of the vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this
+ (optional argument with default value \f$0\f$).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ explicit MIP_Problem(dimension_type dim = 0);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$,
+ the objective function \p obj and optimization mode \p mode;
+ those dimensions whose indices occur in \p int_vars are
+ constrained to take an integer value.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param int_vars
+ The set of variables' indexes that are constrained to take integer values.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if a constraint in the sequence is a strict inequality,
+ if the space dimension of a constraint (resp., of the
+ objective function or of the integer variables) or the space dimension
+ of the integer variable set is strictly greater than \p dim.
+ */
+ template <typename In>
+ MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Variables_Set& int_vars,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$,
+ the objective function \p obj and optimization mode \p mode.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if a constraint in the sequence is a strict inequality
+ or if the space dimension of a constraint (resp., of the
+ objective function or of the integer variables) is strictly
+ greater than \p dim.
+ */
+ template <typename In>
+ MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim from the constraint
+ system \p cs, the objective function \p obj and optimization mode \p mode.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param cs
+ The constraint system defining the feasible region.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system contains any strict inequality
+ or if the space dimension of the constraint system (resp., the
+ objective function) is strictly greater than \p dim.
+ */
+ MIP_Problem(dimension_type dim,
+ const Constraint_System& cs,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ //! Ordinary copy constructor.
+ MIP_Problem(const MIP_Problem& y);
+
+ //! Destructor.
+ ~MIP_Problem();
+
+ //! Assignment operator.
+ MIP_Problem& operator=(const MIP_Problem& y);
+
+ //! Returns the maximum space dimension an MIP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the MIP problem.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a set containing all the variables' indexes constrained
+ to be integral.
+ */
+ const Variables_Set& integer_space_dimensions() const;
+
+private:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint*> Constraint_Sequence;
+
+public:
+ //! A read-only iterator on the constraints defining the feasible region.
+ class const_iterator {
+ private:
+ typedef Constraint_Sequence::const_iterator Base;
+ typedef std::iterator_traits<Base> Base_Traits;
+ public:
+ typedef Base_Traits::iterator_category iterator_category;
+ typedef Base_Traits::difference_type difference_type;
+ typedef const Constraint value_type;
+ typedef const Constraint* pointer;
+ typedef const Constraint& reference;
+
+ //! Iterator difference: computes distances.
+ difference_type operator-(const const_iterator& y) const;
+
+ //! Prefix increment.
+ const_iterator& operator++();
+
+ //! Prefix decrement.
+ const_iterator& operator--();
+
+ //! Postfix increment.
+ const_iterator operator++(int);
+
+ //! Postfix decrement.
+ const_iterator operator--(int);
+
+ //! Moves iterator forward of \p n positions.
+ const_iterator& operator+=(difference_type n);
+
+ //! Moves iterator backward of \p n positions.
+ const_iterator& operator-=(difference_type n);
+
+ //! Returns an iterator \p n positions forward.
+ const_iterator operator+(difference_type n) const;
+
+ //! Returns an iterator \p n positions backward.
+ const_iterator operator-(difference_type n) const;
+
+ //! Returns a reference to the "pointed" object.
+ reference operator*() const;
+
+ //! Returns the address of the "pointed" object.
+ pointer operator->() const;
+
+ //! Compares \p *this with y.
+ /*!
+ \param y
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ //! Compares \p *this with y.
+ /*!
+ \param y
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ //! Constructor from a Base iterator.
+ explicit const_iterator(Base base);
+
+ //! The Base iterator on the Constraint_Sequence.
+ Base itr;
+
+ friend class MIP_Problem;
+ };
+
+ /*! \brief
+ Returns a read-only iterator to the first constraint defining
+ the feasible region.
+ */
+ const_iterator constraints_begin() const;
+
+ /*! \brief
+ Returns a past-the-end read-only iterator to the sequence of
+ constraints defining the feasible region.
+ */
+ const_iterator constraints_end() const;
+
+ //! Returns the objective function.
+ const Linear_Expression& objective_function() const;
+
+ //! Returns the optimization mode.
+ Optimization_Mode optimization_mode() const;
+
+ //! Resets \p *this to be equal to the trivial MIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ void clear();
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old MIP problem
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new MIP problem; they are initially unconstrained.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Sets the variables whose indexes are in set \p i_vars to be
+ integer space dimensions.
+
+ \exception std::invalid_argument
+ Thrown if some index in \p i_vars does not correspond to
+ a space dimension in \p *this.
+ */
+ void add_to_integer_space_dimensions(const Variables_Set& i_vars);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the MIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the constraint \p c is a strict inequality or if its space
+ dimension is strictly greater than the space dimension of \p *this.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the MIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains any strict inequality
+ or if its space dimension is strictly greater than the space dimension
+ of \p *this.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ //! Sets the objective function to \p obj.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the space dimension of \p obj is strictly greater than
+ the space dimension of \p *this.
+ */
+ void set_objective_function(const Linear_Expression& obj);
+
+ //! Sets the optimization mode to \p mode.
+ void set_optimization_mode(Optimization_Mode mode);
+
+ //! Checks satisfiability of \p *this.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the MIP problem.
+ /*!
+ \return
+ An MIP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible, unbounded or optimized problem).
+ */
+ MIP_Problem_Status solve() const;
+
+ /*! \brief
+ Sets \p num and \p denom so that
+ \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the result of
+ evaluating the objective function on \p evaluating_point.
+
+ \param evaluating_point
+ The point on which the objective function will be evaluated.
+
+ \param numer
+ On exit will contain the numerator of the evaluated value.
+
+ \param denom
+ On exit will contain the denominator of the evaluated value.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p evaluating_point are dimension-incompatible
+ or if the generator \p evaluating_point is not a point.
+ */
+ void evaluate_objective_function(const Generator& evaluating_point,
+ Coefficient& numer,
+ Coefficient& denom) const;
+
+ //! Returns a feasible point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if the MIP problem is not satisfiable.
+ */
+ const Generator& feasible_point() const;
+
+ //! Returns an optimal point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if \p *this does not not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ const Generator& optimizing_point() const;
+
+ /*! \brief
+ Sets \p numer and \p denom so that
+ \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the solution of the
+ optimization problem.
+
+ \exception std::domain_error
+ Thrown if \p *this does not not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ void optimal_value(Coefficient& numer, Coefficient& denom) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(MIP_Problem& y);
+
+ //! Names of MIP problems' control parameters.
+ enum Control_Parameter_Name {
+ //! The pricing rule.
+ PRICING
+ };
+
+ //! Possible values for MIP problem's control parameters.
+ enum Control_Parameter_Value {
+ //! Steepest edge pricing method, using floating points (default).
+ PRICING_STEEPEST_EDGE_FLOAT,
+ //! Steepest edge pricing method, using Coefficient.
+ PRICING_STEEPEST_EDGE_EXACT,
+ //! Textbook pricing method.
+ PRICING_TEXTBOOK
+ };
+
+ //! Returns the value of the control parameter \p name.
+ Control_Parameter_Value
+ get_control_parameter(Control_Parameter_Name name) const;
+
+ //! Sets control parameter \p value.
+ void set_control_parameter(Control_Parameter_Value value);
+
+private:
+ //! The dimension of the vector space.
+ dimension_type external_space_dim;
+
+ /*! \brief
+ The space dimension of the current (partial) solution of the
+ MIP problem; it may be smaller than \p external_space_dim.
+ */
+ dimension_type internal_space_dim;
+
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ //! The matrix encoding the current feasible region in tableau form.
+ Matrix<Row> tableau;
+
+ typedef Row working_cost_type;
+
+ //! The working cost function.
+ working_cost_type working_cost;
+
+ //! A map between the variables of `input_cs' and `tableau'.
+ /*!
+ Contains all the pairs (i, j) such that mapping[i].first encodes the index
+ of the column in the tableau where input_cs[i] is stored; if
+ mapping[i].second is not a zero, it encodes the split part of the tableau
+ of input_cs[i].
+ The "positive" one is represented by mapping[i].first and the "negative"
+ one is represented by mapping[i].second.
+ */
+ std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+ //! The current basic solution.
+ std::vector<dimension_type> base;
+
+ //! An enumerated type describing the internal status of the MIP problem.
+ enum Status {
+ //! The MIP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The MIP problem is satisfiable; a feasible solution has been computed.
+ SATISFIABLE,
+ //! The MIP problem is unbounded; a feasible solution has been computed.
+ UNBOUNDED,
+ //! The MIP problem is optimized; an optimal solution has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the MIP problem has been changed by adding
+ new space dimensions or new constraints; a feasible solution for
+ the old feasible region is still available.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the MIP problem.
+ Status status;
+
+ // TODO: merge `status', `initialized', `pricing' and (maybe) `opt_mode'
+ // into a single bitset status word, so as to save space and allow
+ // for other control parameters.
+
+ //! The pricing method in use.
+ Control_Parameter_Value pricing;
+
+ /*! \brief
+ A Boolean encoding whether or not internal data structures have
+ already been properly sized and populated: useful to allow for
+ deeper checks in method OK().
+ */
+ bool initialized;
+
+ //! The sequence of constraints describing the feasible region.
+ std::vector<Constraint*> input_cs;
+
+ /*! \brief
+ The number of constraints that are inherited from our parent
+ in the recursion tree built when solving via branch-and-bound.
+
+ The first \c inherited_constraints elements in \c input_cs point to
+ the inherited constraints, whose resources are owned by our ancestors.
+ The resources of the other elements in \c input_cs are owned by \c *this
+ and should be appropriately released on destruction.
+ */
+ dimension_type inherited_constraints;
+
+ //! The first index of `input_cs' containing a pending constraint.
+ dimension_type first_pending_constraint;
+
+ //! The objective function to be optimized.
+ Linear_Expression input_obj_function;
+
+ //! The optimization mode requested.
+ Optimization_Mode opt_mode;
+
+ //! The last successfully computed feasible or optimizing point.
+ Generator last_generator;
+
+ /*! \brief
+ A set containing all the indexes of variables that are constrained
+ to have an integer value.
+ */
+ Variables_Set i_variables;
+
+ //! A helper class to temporarily relax a MIP problem using RAII.
+ struct RAII_Temporary_Real_Relaxation {
+ MIP_Problem& lp;
+ Variables_Set i_vars;
+
+ RAII_Temporary_Real_Relaxation(MIP_Problem& mip)
+ : lp(mip), i_vars() {
+ // Turn mip into an LP problem (saving i_variables in i_vars).
+ using std::swap;
+ swap(i_vars, lp.i_variables);
+ }
+
+ ~RAII_Temporary_Real_Relaxation() {
+ // Restore the original set of integer variables.
+ using std::swap;
+ swap(i_vars, lp.i_variables);
+ }
+ };
+ friend struct RAII_Temporary_Real_Relaxation;
+
+ //! A tag type to distinguish normal vs. inheriting copy constructor.
+ struct Inherit_Constraints {};
+
+ //! Copy constructor inheriting constraints.
+ MIP_Problem(const MIP_Problem& y, Inherit_Constraints);
+
+ //! Helper method: implements exception safe addition.
+ void add_constraint_helper(const Constraint& c);
+
+ //! Processes the pending constraints of \p *this.
+ void process_pending_constraints();
+
+ /*! \brief
+ Optimizes the MIP problem using the second phase of the
+ primal simplex algorithm.
+ */
+ void second_phase();
+
+ /*! \brief
+ Assigns to \p this->tableau a simplex tableau representing the
+ MIP problem, inserting into \p this->mapping the information
+ that is required to recover the original MIP problem.
+
+ \return
+ <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+ any trivially unfeasible constraint (tableau was not computed);
+ <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+ (the computed tableau contains no constraints);
+ <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+ unfeasible nor trivially unbounded (the tableau was computed
+ successfully).
+ */
+ MIP_Problem_Status
+ compute_tableau(std::vector<dimension_type>& worked_out_row);
+
+ /*! \brief
+ Parses the pending constraints to gather information on
+ how to resize the tableau.
+
+ \note
+ All of the method parameters are output parameters; their value
+ is only meaningful when the function exit returning value \c true.
+
+ \return
+ \c false if a trivially false constraint is detected, \c true otherwise.
+
+ \param additional_tableau_rows
+ On exit, this will store the number of rows that have to be added
+ to the original tableau.
+
+ \param additional_slack_variables
+ This will store the number of slack variables that have to be added
+ to the original tableau.
+
+ \param is_tableau_constraint
+ This container of Boolean flags is initially empty. On exit, it size
+ will be equal to the number of pending constraints in \c input_cs.
+ For each pending constraint index \c i, the corresponding element
+ of this container (having index <CODE>i - first_pending_constraint</CODE>)
+ will be set to \c true if and only if the constraint has to be included
+ in the tableau.
+
+ \param is_satisfied_inequality
+ This container of Boolean flags is initially empty. On exit, its size
+ will be equal to the number of pending constraints in \c input_cs.
+ For each pending constraint index \c i, the corresponding element
+ of this container (having index <CODE>i - first_pending_constraint</CODE>)
+ will be set to \c true if and only if it is an inequality and it
+ is already satisfied by \c last_generator (hence it does not require
+ the introduction of an artificial variable).
+
+ \param is_nonnegative_variable
+ This container of Boolean flags is initially empty.
+ On exit, it size is equal to \c external_space_dim.
+ For each variable (index), the corresponding element of this container
+ is \c true if the variable is known to be nonnegative (and hence should
+ not be split into a positive and a negative part).
+
+ \param is_remergeable_variable
+ This container of Boolean flags is initially empty.
+ On exit, it size is equal to \c internal_space_dim.
+ For each variable (index), the corresponding element of this container
+ is \c true if the variable was previously split into positive and
+ negative parts that can now be merged back, since it is known
+ that the variable is nonnegative.
+ */
+ bool parse_constraints(dimension_type& additional_tableau_rows,
+ dimension_type& additional_slack_variables,
+ std::deque<bool>& is_tableau_constraint,
+ std::deque<bool>& is_satisfied_inequality,
+ std::deque<bool>& is_nonnegative_variable,
+ std::deque<bool>& is_remergeable_variable) const;
+
+ /*! \brief
+ Computes the row index of the variable exiting the base
+ of the MIP problem. Implemented with anti-cycling rule.
+
+ \return
+ The row index of the variable exiting the base.
+
+ \param entering_var_index
+ The column index of the variable entering the base.
+ */
+ dimension_type
+ get_exiting_base_index(dimension_type entering_var_index) const;
+
+ //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param x
+ The row that will be combined with \p y object.
+
+ \param y
+ The row that will be combined with \p x object.
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p x and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Row to \p x and normalizes it.
+ */
+ static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+ // TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+ //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param x
+ The row that will be combined with \p y object.
+
+ \param y
+ The row that will be combined with \p x object.
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p x and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Dense_Row to \p x and normalizes it.
+ */
+ static void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ const dimension_type k);
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+ static bool is_unbounded_obj_function(
+ const Linear_Expression& obj_function,
+ const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+ Optimization_Mode optimization_mode);
+
+ /*! \brief
+ Performs the pivoting operation on the tableau.
+
+ \param entering_var_index
+ The index of the variable entering the base.
+
+ \param exiting_base_index
+ The index of the row exiting the base.
+ */
+ void pivot(dimension_type entering_var_index,
+ dimension_type exiting_base_index);
+
+ /*! \brief
+ Computes the column index of the variable entering the base,
+ using the textbook algorithm with anti-cycling rule.
+
+ \return
+ The column index of the variable that enters the base.
+ If no such variable exists, optimality was achieved
+ and <CODE>0</CODE> is returned.
+ */
+ dimension_type textbook_entering_index() const;
+
+ /*! \brief
+ Computes the column index of the variable entering the base,
+ using an exact steepest-edge algorithm with anti-cycling rule.
+
+ \return
+ The column index of the variable that enters the base.
+ If no such variable exists, optimality was achieved
+ and <CODE>0</CODE> is returned.
+
+ To compute the entering_index, the steepest edge algorithm chooses
+ the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+ largest in absolute value, where
+ \f[
+ \|\Delta x^{j} \|
+ = \left(
+ 1+\sum_{i=1}^{m} \alpha_{ij}^2
+ \right)^{\frac{1}{2}}.
+ \f]
+ Recall that, due to the exact integer implementation of the algorithm,
+ our tableau does not contain the ``real'' \f$\alpha\f$ values, but these
+ can be computed dividing the value of the coefficient by the value of
+ the variable in base. Obviously the result may not be an integer, so
+ we will proceed in another way: we compute the lcm of all the variables
+ in base to get the good ``weight'' of each Coefficient of the tableau.
+ */
+ dimension_type steepest_edge_exact_entering_index() const;
+
+ /*! \brief
+ Same as steepest_edge_exact_entering_index,
+ but using floating points.
+
+ \note
+ Due to rounding errors, the index of the variable entering the base
+ of the MIP problem is not predictable across different architectures.
+ Hence, the overall simplex computation may differ in the path taken
+ to reach the optimum. Anyway, the exact final result will be computed
+ for the MIP_Problem.
+ */
+ dimension_type steepest_edge_float_entering_index() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+
+ \note
+ Uses an exact pricing method (either textbook or exact steepest edge),
+ so that the result is deterministic across different architectures.
+ */
+ bool compute_simplex_using_exact_pricing();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+
+ \note
+ Uses a floating point implementation of the steepest edge pricing
+ method, so that the result is correct, but not deterministic across
+ different architectures.
+ */
+ bool compute_simplex_using_steepest_edge_float();
+
+ /*! \brief
+ Drop unnecessary artificial variables from the tableau and get ready
+ for the second phase of the simplex algorithm.
+
+ \note
+ The two parameters denote a STL-like half-open range.
+ It is assumed that \p begin_artificials is strictly greater than 0
+ and smaller than \p end_artificials.
+
+ \param begin_artificials
+ The start of the tableau column index range for artificial variables.
+
+ \param end_artificials
+ The end of the tableau column index range for artificial variables.
+ Note that column index end_artificial is \e excluded from the range.
+ */
+ void erase_artificials(dimension_type begin_artificials,
+ dimension_type end_artificials);
+
+ bool is_in_base(dimension_type var_index,
+ dimension_type& row_index) const;
+
+ /*! \brief
+ Computes a valid generator that satisfies all the constraints of the
+ Linear Programming problem associated to \p *this.
+ */
+ void compute_generator() const;
+
+ /*! \brief
+ Merges back the positive and negative part of a (previously split)
+ variable after detecting a corresponding nonnegativity constraint.
+
+ \return
+ If the negative part of \p var_index was in base, the index of
+ the corresponding tableau row (which has become non-feasible);
+ otherwise \c not_a_dimension().
+
+ \param var_index
+ The index of the variable that has to be merged.
+ */
+ dimension_type merge_split_variable(dimension_type var_index);
+
+ //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+ static bool is_satisfied(const Constraint& c, const Generator& g);
+
+ //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+ static bool is_saturated(const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Returns a status that encodes the solution of the MIP problem.
+
+ \param have_incumbent_solution
+ It is used to store if the solving process has found a provisional
+ optimum point.
+
+ \param incumbent_solution_value
+ Encodes the evaluated value of the provisional optimum point found.
+
+ \param incumbent_solution_point
+ If the method returns `OPTIMIZED', this will contain the optimality point.
+
+ \param mip
+ The problem that has to be solved.
+
+ \param i_vars
+ The variables that are constrained to take an integer value.
+ */
+ static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+ mpq_class& incumbent_solution_value,
+ Generator& incumbent_solution_point,
+ MIP_Problem& mip,
+ const Variables_Set& i_vars);
+
+ /*! \brief
+ Returns \c true if and if only the LP problem is satisfiable.
+ */
+ bool is_lp_satisfiable() const;
+
+ /*! \brief
+ Returns \c true if and if only the MIP problem \p mip is satisfiable
+ when variables in \p i_vars can only take integral values.
+
+ \param mip
+ The MIP problem. This is assumed to have no integral space dimension
+ (so that it is a pure LP problem).
+
+ \param i_vars
+ The variables that are constrained to take integral values.
+
+ \param p
+ If \c true is returned, it will encode a feasible point.
+ */
+ static bool is_mip_satisfiable(MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ Generator& p);
+
+ /*! \brief
+ Returns \c true if and if only \c mip.last_generator satisfies all the
+ integrality conditions implicitly stated using by \p i_vars.
+
+ \param mip
+ The MIP problem. This is assumed to have no integral space dimension
+ (so that it is a pure LP problem).
+
+ \param i_vars
+ The variables that are constrained to take an integer value.
+
+ \param branching_index
+ If \c false is returned, this will encode the non-integral variable
+ index on which the `branch and bound' algorithm should be applied.
+ */
+ static bool choose_branching_variable(const MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ dimension_type& branching_index);
+};
+
+#include "MIP_Problem_inlines.hh"
+#include "MIP_Problem_templates.hh"
+
+#endif // !defined(PPL_MIP_Problem_defs_hh)
diff --git a/src/MIP_Problem_inlines.hh b/src/MIP_Problem_inlines.hh
new file mode 100644
index 0000000..97b3cce
--- /dev/null
+++ b/src/MIP_Problem_inlines.hh
@@ -0,0 +1,321 @@
+/* MIP_Problem class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_inlines_hh
+#define PPL_MIP_Problem_inlines_hh 1
+
+#include "Constraint_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+ return Constraint::max_space_dimension();
+}
+
+inline dimension_type
+MIP_Problem::space_dimension() const {
+ return external_space_dim;
+}
+
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+ : external_space_dim(y.external_space_dim),
+ internal_space_dim(y.internal_space_dim),
+ tableau(y.tableau),
+ working_cost(y.working_cost),
+ mapping(y.mapping),
+ base(y.base),
+ status(y.status),
+ pricing(y.pricing),
+ initialized(y.initialized),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(),
+ input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode),
+ last_generator(y.last_generator),
+ i_variables(y.i_variables) {
+ input_cs.reserve(y.input_cs.size());
+ for (Constraint_Sequence::const_iterator i = y.input_cs.begin(),
+ i_end = y.input_cs.end(); i != i_end; ++i)
+ add_constraint_helper(*(*i));
+ PPL_ASSERT(OK());
+}
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y, Inherit_Constraints)
+ : external_space_dim(y.external_space_dim),
+ internal_space_dim(y.internal_space_dim),
+ tableau(y.tableau),
+ working_cost(y.working_cost),
+ mapping(y.mapping),
+ base(y.base),
+ status(y.status),
+ pricing(y.pricing),
+ initialized(y.initialized),
+ input_cs(y.input_cs),
+ // NOTE: The constraints are inherited, NOT copied!
+ inherited_constraints(y.input_cs.size()),
+ first_pending_constraint(y.first_pending_constraint),
+ input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode),
+ last_generator(y.last_generator),
+ i_variables(y.i_variables) {
+ PPL_ASSERT(OK());
+}
+
+inline void
+MIP_Problem::add_constraint_helper(const Constraint& c) {
+ // For exception safety, reserve space for the new element.
+ const dimension_type size = input_cs.size();
+ if (size == input_cs.capacity()) {
+ const dimension_type max_size = input_cs.max_size();
+ if (size == max_size)
+ throw std::length_error("MIP_Problem::add_constraint(): "
+ "too many constraints");
+ // Use an exponential grow policy to avoid too many reallocations.
+ input_cs.reserve(compute_capacity(size + 1, max_size));
+ }
+
+ // This operation does not throw, because the space for the new element
+ // has already been reserved: hence the new-ed Constraint is safe.
+ input_cs.push_back(new Constraint(c));
+}
+
+inline
+MIP_Problem::~MIP_Problem() {
+ // NOTE: do NOT delete inherited constraints; they are owned
+ // (and will eventually be deleted) by ancestors.
+ for (Constraint_Sequence::const_iterator
+ i = nth_iter(input_cs, inherited_constraints),
+ i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+}
+
+
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+ if (opt_mode != mode) {
+ opt_mode = mode;
+ if (status == UNBOUNDED || status == OPTIMIZED)
+ status = SATISFIABLE;
+ PPL_ASSERT(OK());
+ }
+}
+
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+ return input_obj_function;
+}
+
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+ return opt_mode;
+}
+
+inline void
+MIP_Problem::optimal_value(Coefficient& numer, Coefficient& denom) const {
+ const Generator& g = optimizing_point();
+ evaluate_objective_function(g, numer, denom);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+ return const_iterator(input_cs.begin());
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+ return const_iterator(input_cs.end());
+}
+
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+ return i_variables;
+}
+
+inline MIP_Problem::Control_Parameter_Value
+MIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+ PPL_USED(name);
+ PPL_ASSERT(name == PRICING);
+ return pricing;
+}
+
+inline void
+MIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+ pricing = value;
+}
+
+inline void
+MIP_Problem::m_swap(MIP_Problem& y) {
+ using std::swap;
+ swap(external_space_dim, y.external_space_dim);
+ swap(internal_space_dim, y.internal_space_dim);
+ swap(tableau, y.tableau);
+ swap(working_cost, y.working_cost);
+ swap(mapping, y.mapping);
+ swap(initialized, y.initialized);
+ swap(base, y.base);
+ swap(status, y.status);
+ swap(pricing, y.pricing);
+ swap(input_cs, y.input_cs);
+ swap(inherited_constraints, y.inherited_constraints);
+ swap(first_pending_constraint, y.first_pending_constraint);
+ swap(input_obj_function, y.input_obj_function);
+ swap(opt_mode, y.opt_mode);
+ swap(last_generator, y.last_generator);
+ swap(i_variables, y.i_variables);
+}
+
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+ MIP_Problem tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+inline void
+MIP_Problem::clear() {
+ MIP_Problem tmp;
+ m_swap(tmp);
+}
+
+
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+ memory_size_type n
+ = working_cost.external_memory_in_bytes()
+ + tableau.external_memory_in_bytes()
+ + input_obj_function.external_memory_in_bytes()
+ + last_generator.external_memory_in_bytes();
+
+ // Adding the external memory for `input_cs'.
+ // NOTE: disregard inherited constraints, as they are owned by ancestors.
+ n += input_cs.capacity() * sizeof(Constraint*);
+ for (Constraint_Sequence::const_iterator
+ i = nth_iter(input_cs, inherited_constraints),
+ i_end = input_cs.end(); i != i_end; ++i)
+ n += ((*i)->total_memory_in_bytes());
+
+ // Adding the external memory for `base'.
+ n += base.capacity() * sizeof(dimension_type);
+ // Adding the external memory for `mapping'.
+ n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+ return n;
+}
+
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+MIP_Problem::const_iterator::const_iterator(Base base)
+ : itr(base) {
+}
+
+inline MIP_Problem::const_iterator::difference_type
+MIP_Problem::const_iterator::operator-(const const_iterator& y) const {
+ return itr - y.itr;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator++() {
+ ++itr;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator--() {
+ --itr;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator++(int) {
+ const_iterator x = *this;
+ operator++();
+ return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator--(int) {
+ const_iterator x = *this;
+ operator--();
+ return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator+(difference_type n) const {
+ return const_iterator(itr + n);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator-(difference_type n) const {
+ return const_iterator(itr - n);
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator+=(difference_type n) {
+ itr += n;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator-=(difference_type n) {
+ itr -= n;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator::reference
+MIP_Problem::const_iterator::operator*() const {
+ return *(*itr);
+}
+
+inline MIP_Problem::const_iterator::pointer
+MIP_Problem::const_iterator::operator->() const {
+ return *itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator==(const const_iterator& y) const {
+ return itr == y.itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator!=(const const_iterator& y) const {
+ return itr != y.itr;
+}
+
+/*! \relates MIP_Problem */
+inline void
+swap(MIP_Problem& x, MIP_Problem& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_inlines_hh)
diff --git a/src/MIP_Problem_templates.hh b/src/MIP_Problem_templates.hh
new file mode 100644
index 0000000..123d2bc
--- /dev/null
+++ b/src/MIP_Problem_templates.hh
@@ -0,0 +1,181 @@
+/* MIP_Problem class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_templates_hh
+#define PPL_MIP_Problem_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+ In first, In last,
+ const Variables_Set& int_vars,
+ const Linear_Expression& obj,
+ const Optimization_Mode mode)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(obj),
+ opt_mode(mode),
+ last_generator(point()),
+ i_variables(int_vars) {
+ // Check that integer Variables_Set does not exceed the space dimension
+ // of the problem.
+ if (i_variables.space_dimension() > external_space_dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem"
+ << "(dim, first, last, int_vars, obj, mode):\n"
+ << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+ << " " << i_variables.space_dimension() << " are dimension"
+ "incompatible.";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+ "last, int_vars, obj, mode):\n"
+ "dim exceeds the maximum allowed"
+ "space dimension.");
+ // Check the objective function.
+ if (obj.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+ << "int_vars, obj, mode):\n"
+ << "obj.space_dimension() == "<< obj.space_dimension()
+ << " exceeds d == "<< dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // Check the constraints.
+ try {
+ for (In i = first; i != last; ++i) {
+ if (i->is_strict_inequality())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, int_vars,"
+ "obj, mode):\nrange [first, last) contains"
+ "a strict inequality constraint.");
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::"
+ << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+ << "range [first, last) contains a constraint having space"
+ << "dimension == " << i->space_dimension() << " that exceeds"
+ "this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ add_constraint_helper(*i);
+ }
+ } catch (...) {
+ // Delete the allocated constraints, to avoid memory leaks.
+
+ for (Constraint_Sequence::const_iterator
+ i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+
+ throw;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Linear_Expression& obj,
+ Optimization_Mode mode)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(obj),
+ opt_mode(mode),
+ last_generator(point()),
+ i_variables() {
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, obj, mode):\n"
+ "dim exceeds the maximum allowed space "
+ "dimension.");
+ // Check the objective function.
+ if (obj.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+ << " obj, mode):\n"
+ << "obj.space_dimension() == "<< obj.space_dimension()
+ << " exceeds d == "<< dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // Check the constraints.
+ try {
+ for (In i = first; i != last; ++i) {
+ if (i->is_strict_inequality())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, obj, mode):"
+ "\n"
+ "range [first, last) contains a strict "
+ "inequality constraint.");
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::"
+ << "MIP_Problem(dim, first, last, obj, mode):\n"
+ << "range [first, last) contains a constraint having space"
+ << "dimension" << " == " << i->space_dimension() << " that exceeds"
+ "this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ add_constraint_helper(*i);
+ }
+ } catch (...) {
+ // Delete the allocated constraints, to avoid memory leaks.
+
+ for (Constraint_Sequence::const_iterator
+ i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+
+ throw;
+ }
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_templates_hh)
diff --git a/src/MIP_Problem_types.hh b/src/MIP_Problem_types.hh
new file mode 100644
index 0000000..0ec632f
--- /dev/null
+++ b/src/MIP_Problem_types.hh
@@ -0,0 +1,33 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_MIP_Problem_types_hh
+#define PPL_MIP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_MIP_PROBLEM,
+ //! The problem is unbounded.
+ UNBOUNDED_MIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_types_hh)
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..8cd12b7
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,699 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+# 1. Start with version information of `0:0:0' for each Libtool library.
+#
+# 2. Update the version information only immediately before a public
+# release of your software. More frequent updates are unnecessary,
+# and only guarantee that the current interface number gets larger
+# faster.
+#
+# 3. If the library source code has changed at all since the last
+# update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+# 4. If any interfaces have been added, removed, or changed since the
+# last update, increment CURRENT, and set REVISION to 0.
+#
+# 5. If any interfaces have been added since the last public release,
+# then increment AGE.
+#
+# 6. If any interfaces have been removed since the last public release,
+# then set AGE to 0.
+#
+# PPL release -version-info
+# 0.1 -----
+# 0.2 -----
+# 0.3 0:0:0
+# 0.4 1:0:1
+# 0.5 2:0:0
+# 0.6 3:0:0
+# 0.7 4:0:0
+# 0.8 5:0:0
+# 0.9 6:0:0
+# 0.10 7:0:0
+# 0.10.1 8:0:1
+# 0.10.2 8:0:1
+# 0.11 9:0:0
+# 0.12 10:0:0
+# 0.12.1 11:0:0
+# 1.0 12:0:0
+# 1.1 13:0:0
+
+LIBPPL_LT_CURRENT = 13
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_srcdir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+
+bin_PROGRAMS = ppl-config
+
+ppl_config_SOURCES = \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+nodist_ppl_config_SOURCES = \
+ppl-config.cc \
+ppl.hh
+
+ppl_config_LDADD = \
+ at extra_libraries@ \
+libppl.la
+
+if USE_NATIVE_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif USE_NATIVE_INTEGERS
+
+if USE_CHECKED_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif USE_CHECKED_INTEGERS
+
+if USE_GMP_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES = \
+ GMP_Integer_types.hh
+
+COEFFICIENT_DEFS_INCLUDE_FILES = \
+ GMP_Integer_defs.hh \
+ GMP_Integer_inlines.hh
+
+endif USE_GMP_INTEGERS
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+assert.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits_defs.hh \
+mp_std_bits_inlines.hh \
+Concrete_Expression_types.hh \
+Concrete_Expression_defs.hh \
+Concrete_Expression_inlines.hh \
+Temp_defs.hh \
+Temp_inlines.hh \
+Temp_templates.hh \
+Coefficient_traits_template.hh \
+Checked_Number_types.hh \
+termination_types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient_types.hh \
+stdiobuf_types.hh \
+c_streambuf_types.hh \
+globals_types.hh \
+iterator_to_const_types.hh \
+distances_types.hh \
+Interval_Info_types.hh \
+Interval_types.hh \
+Box_types.hh \
+Constraint_types.hh \
+Generator_types.hh \
+Grid_Generator_types.hh \
+Congruence_types.hh \
+Init_types.hh \
+Dense_Row_types.hh \
+CO_Tree_types.hh \
+Sparse_Row_types.hh \
+Matrix_types.hh \
+Swapping_Vector_types.hh \
+Variable_types.hh \
+Variables_Set_types.hh \
+Linear_Expression_types.hh \
+Expression_Adapter_types.hh \
+Expression_Hide_Last_types.hh \
+Expression_Hide_Inhomo_types.hh \
+Linear_Expression_Impl_types.hh \
+Linear_Expression_Interface_types.hh \
+Linear_System_types.hh \
+Linear_Form_types.hh \
+Bit_Row_types.hh \
+Bit_Matrix_types.hh \
+Constraint_System_types.hh \
+Generator_System_types.hh \
+Grid_Generator_System_types.hh \
+Congruence_System_types.hh \
+Scalar_Products_types.hh \
+PIP_Tree_types.hh \
+PIP_Problem_types.hh \
+Poly_Con_Relation_types.hh \
+Poly_Gen_Relation_types.hh \
+BHRZ03_Certificate_types.hh \
+H79_Certificate_types.hh \
+Grid_Certificate_types.hh \
+Partial_Function_types.hh \
+Polyhedron_types.hh \
+C_Polyhedron_types.hh \
+NNC_Polyhedron_types.hh \
+Grid_types.hh \
+Ptr_Iterator_types.hh \
+DB_Row_types.hh \
+DB_Matrix_types.hh \
+BD_Shape_types.hh \
+OR_Matrix_types.hh \
+Octagonal_Shape_types.hh \
+fpu_types.hh \
+Float_defs.hh \
+Float_inlines.hh \
+Float_templates.hh \
+C_Integer.hh \
+fpu_defs.hh \
+fpu-c99_inlines.hh \
+fpu-ia32_inlines.hh \
+fpu-none_inlines.hh \
+fpu-sparc_inlines.hh \
+Rounding_Dir_defs.hh \
+Rounding_Dir_inlines.hh \
+Result_defs.hh \
+Result_inlines.hh \
+Numeric_Format_defs.hh \
+checked_defs.hh \
+checked_inlines.hh \
+checked_int_inlines.hh \
+checked_float_inlines.hh \
+checked_mpz_inlines.hh \
+checked_mpq_inlines.hh \
+checked_ext_inlines.hh \
+Checked_Number_defs.hh \
+Checked_Number_inlines.hh \
+Checked_Number_templates.hh \
+WRD_coefficient_types_defs.hh \
+WRD_coefficient_types_inlines.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient_defs.hh \
+Coefficient_inlines.hh \
+stdiobuf_defs.hh \
+stdiobuf_inlines.hh \
+c_streambuf_defs.hh \
+c_streambuf_inlines.hh \
+globals_defs.hh \
+globals_inlines.hh \
+math_utilities_defs.hh \
+math_utilities_inlines.hh \
+iterator_to_const_defs.hh \
+iterator_to_const_inlines.hh \
+distances_defs.hh \
+distances_inlines.hh \
+Boundary_defs.hh \
+intervals_defs.hh \
+Interval_Info_defs.hh \
+Interval_Info_inlines.hh \
+Interval_defs.hh \
+Interval_inlines.hh \
+Interval_templates.hh \
+Box_defs.hh \
+Box_Status_inlines.hh \
+Box_inlines.hh \
+Box_templates.hh \
+Integer_Interval.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
+Variable_defs.hh \
+Variable_inlines.hh \
+Variables_Set_defs.hh \
+Variables_Set_inlines.hh \
+Init_defs.hh \
+Init_inlines.hh \
+initializer.hh \
+Topology_types.hh \
+Dense_Row_defs.hh \
+Dense_Row_inlines.hh \
+Dense_Row_templates.hh \
+CO_Tree_defs.hh \
+CO_Tree_inlines.hh \
+CO_Tree_templates.hh \
+Sparse_Row_defs.hh \
+Sparse_Row_inlines.hh \
+Sparse_Row_templates.hh \
+Bit_Row_defs.hh \
+Bit_Row_inlines.hh \
+Linear_System_defs.hh \
+Linear_System_inlines.hh \
+Linear_System_templates.hh \
+Bit_Matrix_defs.hh \
+Bit_Matrix_inlines.hh \
+Constraint_System_defs.hh \
+Generator_System_defs.hh \
+Grid_Generator_System_defs.hh \
+Congruence_System_defs.hh \
+Linear_Expression_defs.hh \
+Linear_Expression_inlines.hh \
+Expression_Adapter_defs.hh \
+Expression_Adapter_inlines.hh \
+Expression_Hide_Last_defs.hh \
+Expression_Hide_Last_inlines.hh \
+Expression_Hide_Inhomo_defs.hh \
+Expression_Hide_Inhomo_inlines.hh \
+Linear_Expression_Impl_defs.hh \
+Linear_Expression_Impl_inlines.hh \
+Linear_Expression_Impl_templates.hh \
+Linear_Expression_Interface_defs.hh \
+Linear_Form_defs.hh \
+Linear_Form_inlines.hh \
+Linear_Form_templates.hh \
+linearize.hh \
+Constraint_defs.hh \
+Constraint_inlines.hh \
+Constraint_System_inlines.hh \
+Generator_defs.hh \
+Generator_inlines.hh \
+Grid_Generator_defs.hh \
+Grid_Generator_inlines.hh \
+Congruence_defs.hh \
+Congruence_inlines.hh \
+Generator_System_inlines.hh \
+Grid_Generator_System_inlines.hh \
+Congruence_System_inlines.hh \
+Scalar_Products_defs.hh \
+Scalar_Products_inlines.hh \
+Matrix_defs.hh \
+Matrix_inlines.hh \
+Matrix_templates.hh \
+Swapping_Vector_defs.hh \
+Swapping_Vector_inlines.hh \
+MIP_Problem_types.hh \
+MIP_Problem_defs.hh \
+MIP_Problem_inlines.hh \
+MIP_Problem_templates.hh \
+PIP_Tree_types.hh \
+PIP_Tree_defs.hh \
+PIP_Tree_inlines.hh \
+PIP_Problem_types.hh \
+PIP_Problem_defs.hh \
+PIP_Problem_inlines.hh \
+PIP_Problem_templates.hh \
+Poly_Con_Relation_defs.hh \
+Poly_Con_Relation_inlines.hh \
+Poly_Gen_Relation_defs.hh \
+Poly_Gen_Relation_inlines.hh \
+BHRZ03_Certificate_defs.hh \
+BHRZ03_Certificate_inlines.hh \
+H79_Certificate_defs.hh \
+H79_Certificate_inlines.hh \
+Grid_Certificate_defs.hh \
+Grid_Certificate_inlines.hh \
+Partial_Function_defs.hh \
+Partial_Function_inlines.hh \
+Polyhedron_defs.hh \
+Ph_Status_inlines.hh \
+Polyhedron_inlines.hh \
+Polyhedron_chdims_templates.hh \
+Polyhedron_conversion_templates.hh \
+Polyhedron_minimize_templates.hh \
+Polyhedron_simplify_templates.hh \
+Polyhedron_templates.hh \
+Grid_defs.hh \
+Grid_Status_inlines.hh \
+Grid_inlines.hh \
+Grid_templates.hh \
+C_Polyhedron_defs.hh \
+C_Polyhedron_inlines.hh \
+NNC_Polyhedron_defs.hh \
+NNC_Polyhedron_inlines.hh \
+Widening_Function_types.hh \
+Widening_Function_defs.hh \
+Widening_Function_inlines.hh \
+Ptr_Iterator_defs.hh \
+Ptr_Iterator_inlines.hh \
+DB_Row_defs.hh \
+DB_Row_inlines.hh \
+DB_Row_templates.hh \
+DB_Matrix_defs.hh \
+DB_Matrix_inlines.hh \
+DB_Matrix_templates.hh \
+BD_Shape_defs.hh \
+BDS_Status_inlines.hh \
+BD_Shape_inlines.hh \
+BD_Shape_templates.hh \
+OR_Matrix_defs.hh \
+OR_Matrix_inlines.hh \
+OR_Matrix_templates.hh \
+Octagonal_Shape_defs.hh \
+Og_Status_inlines.hh \
+Octagonal_Shape_inlines.hh \
+Octagonal_Shape_templates.hh \
+Determinate_types.hh \
+Determinate_defs.hh \
+Determinate_inlines.hh \
+Powerset_types.hh \
+Powerset_defs.hh \
+Powerset_inlines.hh \
+Powerset_templates.hh \
+Pointset_Powerset_types.hh \
+Pointset_Powerset_defs.hh \
+Pointset_Powerset_inlines.hh \
+Pointset_Powerset_templates.hh \
+Partially_Reduced_Product_types.hh \
+Partially_Reduced_Product_defs.hh \
+Partially_Reduced_Product_inlines.hh \
+Partially_Reduced_Product_templates.hh \
+Weight_Profiler_defs.hh \
+max_space_dimension.hh \
+algorithms.hh \
+termination_defs.hh \
+termination_templates.hh \
+wrap_assign.hh \
+wrap_string.hh \
+Floating_Point_Expression_types.hh \
+Floating_Point_Expression_defs.hh \
+Floating_Point_Expression_inlines.hh \
+Floating_Point_Expression_templates.hh \
+Cast_Floating_Point_Expression_types.hh \
+Cast_Floating_Point_Expression_defs.hh \
+Cast_Floating_Point_Expression_inlines.hh \
+Cast_Floating_Point_Expression_templates.hh \
+Constant_Floating_Point_Expression_types.hh \
+Constant_Floating_Point_Expression_defs.hh \
+Constant_Floating_Point_Expression_inlines.hh \
+Variable_Floating_Point_Expression_types.hh \
+Variable_Floating_Point_Expression_defs.hh \
+Variable_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_types.hh \
+Sum_Floating_Point_Expression_defs.hh \
+Sum_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_templates.hh \
+Difference_Floating_Point_Expression_types.hh \
+Difference_Floating_Point_Expression_defs.hh \
+Difference_Floating_Point_Expression_inlines.hh \
+Difference_Floating_Point_Expression_templates.hh \
+Multiplication_Floating_Point_Expression_types.hh \
+Multiplication_Floating_Point_Expression_defs.hh \
+Multiplication_Floating_Point_Expression_inlines.hh \
+Multiplication_Floating_Point_Expression_templates.hh \
+Division_Floating_Point_Expression_types.hh \
+Division_Floating_Point_Expression_defs.hh \
+Division_Floating_Point_Expression_inlines.hh \
+Division_Floating_Point_Expression_templates.hh \
+Opposite_Floating_Point_Expression_types.hh \
+Opposite_Floating_Point_Expression_defs.hh \
+Opposite_Floating_Point_Expression_inlines.hh \
+Doubly_Linked_Object_types.hh \
+EList_types.hh \
+EList_Iterator_types.hh \
+Handler_types.hh \
+Pending_Element_types.hh \
+Pending_List_types.hh \
+Time_types.hh \
+Watchdog_types.hh \
+Threshold_Watcher_types.hh \
+Handler_defs.hh \
+Handler_inlines.hh \
+Time_defs.hh \
+Time_inlines.hh \
+Doubly_Linked_Object_defs.hh \
+Doubly_Linked_Object_inlines.hh \
+EList_Iterator_defs.hh \
+EList_Iterator_inlines.hh \
+EList_defs.hh \
+EList_inlines.hh \
+Pending_Element_defs.hh \
+Pending_Element_inlines.hh \
+Pending_List_defs.hh \
+Pending_List_inlines.hh \
+Pending_List_templates.hh \
+Watchdog_defs.hh \
+Watchdog_inlines.hh \
+Threshold_Watcher_defs.hh \
+Threshold_Watcher_inlines.hh \
+Threshold_Watcher_templates.hh
+#Any_Pointset_types.hh \
+#Any_Pointset_defs.hh \
+#Any_Pointset_inlines.hh \
+#Ask_Tell_types.hh \
+#Ask_Tell_defs.hh \
+#Ask_Tell_inlines.hh \
+#Ask_Tell_templates.hh \
+#Pointset_Ask_Tell_types.hh \
+#Pointset_Ask_Tell_defs.hh \
+#Pointset_Ask_Tell_inlines.hh \
+#Pointset_Ask_Tell_templates.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status_idefs.hh \
+Grid_Status_idefs.hh \
+Box_Status_idefs.hh \
+BDS_Status_idefs.hh \
+Og_Status_idefs.hh
+
+libppl_la_SOURCES = \
+assert.cc \
+Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+fpu-ia32.cc \
+Concrete_Expression.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Linear_Expression.cc \
+Linear_Expression_Impl.cc \
+Linear_Expression_Interface.cc \
+Linear_Form.cc \
+Scalar_Products.cc \
+MIP_Problem.cc \
+PIP_Tree.cc \
+PIP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Partial_Function.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
+CO_Tree.cc \
+Sparse_Row.cc \
+Dense_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+Variables_Set.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+stdiobuf.cc \
+c_streambuf.cc \
+globals.cc \
+mp_std_bits.cc \
+Weight_Profiler.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort_templates.hh \
+termination.cc \
+wrap_string.cc \
+Time.cc \
+Watchdog.cc \
+Threshold_Watcher.cc
+#Pointset_Ask_Tell.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_la_LIBADD = @extra_libraries@
+
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+if BUILD_CXX_INTERFACE
+
+include_HEADERS = ppl.hh
+
+else !BUILD_CXX_INTERFACE
+
+noinst_HEADERS = ppl.hh
+
+endif !BUILD_CXX_INTERFACE
+
+nodist_noinst_HEADERS = ppl_include_files.hh
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+ for file in $(INCLUDE_FILES) ; \
+ do \
+ i="#include \"$$file\"" ; \
+ ( cd $(top_srcdir)/src ; $(FGREP) -q "$$i" $(INCLUDE_FILES) ) || echo "$$i" ; \
+ done > $@
+
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+
+if HAVE_PERL
+
+ppl.hh: $(top_builddir)/ppl-config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+ $(top_builddir)/utils/build_header \
+ -I $(top_builddir) -I $(top_builddir)/src \
+ $(top_srcdir)/src/ppl_header.hh >$@
+
+BUGS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ @echo "#ifndef PPL_BUGS_hh" >$@
+ @echo "#define PPL_BUGS_hh 1" >>$@
+ $(top_builddir)/utils/text2cxxarray --name=BUGS_array --decl-only \
+ $(top_srcdir)/BUGS >>$@
+ @echo "#endif // !defined(PPL_BUGS_hh)" >>$@
+BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ $(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+ $(top_srcdir)/BUGS >$@
+
+COPYING.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ @echo "#ifndef PPL_COPYING_hh" >$@
+ @echo "#define PPL_COPYING_hh 1" >>$@
+ $(top_builddir)/utils/text2cxxarray --name=COPYING_array --decl-only \
+ $(top_srcdir)/COPYING >>$@
+ @echo "#endif // !defined(PPL_COPYING_hh)" >>$@
+
+COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ $(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+ $(top_srcdir)/COPYING >$@
+CREDITS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ @echo "#ifndef PPL_CREDITS_hh" >$@
+ @echo "#define PPL_CREDITS_hh 1" >>$@
+ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array --decl-only \
+ $(top_srcdir)/CREDITS >>$@
+ @echo "#endif // !defined(PPL_CREDITS_hh)" >>$@
+CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+ $(top_srcdir)/CREDITS >$@
+
+else !HAVE_PERL
+
+ppl.hh.sed: Makefile
+ @echo "/^\/\* BEGIN ppl-config.h \*\/$$/ {" >$@
+ @echo " r $(top_builddir)/ppl-config.h" >>$@
+ @echo " : loop" >>$@
+ @echo " /\n\/\* END ppl-config.h \*\/$$/ !{" >>$@
+ @echo " N" >>$@
+ @echo " b loop" >>$@
+ @echo " }" >>$@
+ @echo " d" >>$@
+ @echo "}" >>$@
+
+ppl.hh: ppl.hh.dist ppl.hh.sed
+ $(SED) -f ppl.hh.sed ppl.hh.dist >$@
+ rm -f ppl.hh.sed
+
+BUGS.hh: BUGS.hh.dist
+ cp -f BUGS.hh.dist $@
+BUGS.cc: BUGS.cc.dist
+ cp -f BUGS.cc.dist $@
+COPYING.hh: COPYING.hh.dist
+ cp -f COPYING.hh.dist $@
+COPYING.cc: COPYING.cc.dist
+ cp -f COPYING.cc.dist $@
+CREDITS.hh: CREDITS.hh.dist
+ cp -f CREDITS.hh.dist $@
+CREDITS.cc: CREDITS.cc.dist
+ cp -f CREDITS.cc.dist $@
+
+endif !HAVE_PERL
+
+if USE_PRECOMPILED_HEADERS
+
+ppl.hh.gch: ppl.hh
+ $(CXXCOMPILE) -xc++-header -o $@ ppl.hh
+
+PRECOMPILED = ppl.hh.gch
+
+else !USE_PRECOMPILED_HEADERS
+
+PRECOMPILED =
+
+endif !USE_PRECOMPILED_HEADERS
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+ mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+ mv -f $(distdir)/BUGS.hh $(distdir)/BUGS.hh.dist
+ mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+ mv -f $(distdir)/COPYING.hh $(distdir)/COPYING.hh.dist
+ mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+ mv -f $(distdir)/CREDITS.hh $(distdir)/CREDITS.hh.dist
+ mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+CLEANFILES = $(BUILT_SOURCES)
+
+$(top_builddir)/utils/build_header:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+$(top_builddir)/utils/text2cxxarray:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils text2cxxarray
+
+$(top_builddir)/ppl-config.h:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) ppl-config.h
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..27efd47
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,1783 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+# 1. Start with version information of `0:0:0' for each Libtool library.
+#
+# 2. Update the version information only immediately before a public
+# release of your software. More frequent updates are unnecessary,
+# and only guarantee that the current interface number gets larger
+# faster.
+#
+# 3. If the library source code has changed at all since the last
+# update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+# 4. If any interfaces have been added, removed, or changed since the
+# last update, increment CURRENT, and set REVISION to 0.
+#
+# 5. If any interfaces have been added since the last public release,
+# then increment AGE.
+#
+# 6. If any interfaces have been removed since the last public release,
+# then set AGE to 0.
+#
+# PPL release -version-info
+# 0.1 -----
+# 0.2 -----
+# 0.3 0:0:0
+# 0.4 1:0:1
+# 0.5 2:0:0
+# 0.6 3:0:0
+# 0.7 4:0:0
+# 0.8 5:0:0
+# 0.9 6:0:0
+# 0.10 7:0:0
+# 0.10.1 8:0:1
+# 0.10.2 8:0:1
+# 0.11 9:0:0
+# 0.12 10:0:0
+# 0.12.1 11:0:0
+# 1.0 12:0:0
+# 1.1 13:0:0
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl-config$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(srcdir)/version.hh.in \
+ $(srcdir)/ppl-config.cc.in $(top_srcdir)/depcomp \
+ $(am__include_HEADERS_DIST) $(am__noinst_HEADERS_DIST)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = version.hh ppl-config.cc
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_la_DEPENDENCIES =
+am__libppl_la_SOURCES_DIST = assert.cc Box.cc checked.cc \
+ Checked_Number.cc Float.cc fpu-ia32.cc Concrete_Expression.cc \
+ Constraint.cc Constraint_System.cc Congruence.cc \
+ Congruence_System.cc Generator_System.cc \
+ Grid_Generator_System.cc Generator.cc Grid_Generator.cc \
+ Init.cc Coefficient.cc Linear_Expression.cc \
+ Linear_Expression_Impl.cc Linear_Expression_Interface.cc \
+ Linear_Form.cc Scalar_Products.cc MIP_Problem.cc PIP_Tree.cc \
+ PIP_Problem.cc Poly_Con_Relation.cc Poly_Gen_Relation.cc \
+ BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.cc \
+ Partial_Function.cc Polyhedron_nonpublic.cc \
+ Polyhedron_public.cc Polyhedron_chdims.cc \
+ Polyhedron_widenings.cc C_Polyhedron.cc NNC_Polyhedron.cc \
+ Grid_nonpublic.cc Grid_public.cc Grid_chdims.cc \
+ Grid_widenings.cc BD_Shape.cc Octagonal_Shape.cc \
+ Pointset_Powerset.cc CO_Tree.cc Sparse_Row.cc Dense_Row.cc \
+ Bit_Matrix.cc Bit_Row.cc Ph_Status.cc Grid_Status.cc \
+ Variable.cc Variables_Set.cc Grid_conversion.cc \
+ Grid_simplify.cc stdiobuf.cc c_streambuf.cc globals.cc \
+ mp_std_bits.cc Weight_Profiler.cc version.cc namespaces.hh \
+ compiler.hh assert.hh meta_programming.hh Slow_Copy.hh \
+ Has_Assign_Or_Swap.hh assign_or_swap.hh mp_std_bits_defs.hh \
+ mp_std_bits_inlines.hh Concrete_Expression_types.hh \
+ Concrete_Expression_defs.hh Concrete_Expression_inlines.hh \
+ Temp_defs.hh Temp_inlines.hh Temp_templates.hh \
+ Coefficient_traits_template.hh Checked_Number_types.hh \
+ termination_types.hh GMP_Integer_types.hh Coefficient_types.hh \
+ stdiobuf_types.hh c_streambuf_types.hh globals_types.hh \
+ iterator_to_const_types.hh distances_types.hh \
+ Interval_Info_types.hh Interval_types.hh Box_types.hh \
+ Constraint_types.hh Generator_types.hh Grid_Generator_types.hh \
+ Congruence_types.hh Init_types.hh Dense_Row_types.hh \
+ CO_Tree_types.hh Sparse_Row_types.hh Matrix_types.hh \
+ Swapping_Vector_types.hh Variable_types.hh \
+ Variables_Set_types.hh Linear_Expression_types.hh \
+ Expression_Adapter_types.hh Expression_Hide_Last_types.hh \
+ Expression_Hide_Inhomo_types.hh \
+ Linear_Expression_Impl_types.hh \
+ Linear_Expression_Interface_types.hh Linear_System_types.hh \
+ Linear_Form_types.hh Bit_Row_types.hh Bit_Matrix_types.hh \
+ Constraint_System_types.hh Generator_System_types.hh \
+ Grid_Generator_System_types.hh Congruence_System_types.hh \
+ Scalar_Products_types.hh PIP_Tree_types.hh \
+ PIP_Problem_types.hh Poly_Con_Relation_types.hh \
+ Poly_Gen_Relation_types.hh BHRZ03_Certificate_types.hh \
+ H79_Certificate_types.hh Grid_Certificate_types.hh \
+ Partial_Function_types.hh Polyhedron_types.hh \
+ C_Polyhedron_types.hh NNC_Polyhedron_types.hh Grid_types.hh \
+ Ptr_Iterator_types.hh DB_Row_types.hh DB_Matrix_types.hh \
+ BD_Shape_types.hh OR_Matrix_types.hh Octagonal_Shape_types.hh \
+ fpu_types.hh Float_defs.hh Float_inlines.hh Float_templates.hh \
+ C_Integer.hh fpu_defs.hh fpu-c99_inlines.hh \
+ fpu-ia32_inlines.hh fpu-none_inlines.hh fpu-sparc_inlines.hh \
+ Rounding_Dir_defs.hh Rounding_Dir_inlines.hh Result_defs.hh \
+ Result_inlines.hh Numeric_Format_defs.hh checked_defs.hh \
+ checked_inlines.hh checked_int_inlines.hh \
+ checked_float_inlines.hh checked_mpz_inlines.hh \
+ checked_mpq_inlines.hh checked_ext_inlines.hh \
+ Checked_Number_defs.hh Checked_Number_inlines.hh \
+ Checked_Number_templates.hh WRD_coefficient_types_defs.hh \
+ WRD_coefficient_types_inlines.hh checked_numeric_limits.hh \
+ GMP_Integer_defs.hh GMP_Integer_inlines.hh Coefficient_defs.hh \
+ Coefficient_inlines.hh stdiobuf_defs.hh stdiobuf_inlines.hh \
+ c_streambuf_defs.hh c_streambuf_inlines.hh globals_defs.hh \
+ globals_inlines.hh math_utilities_defs.hh \
+ math_utilities_inlines.hh iterator_to_const_defs.hh \
+ iterator_to_const_inlines.hh distances_defs.hh \
+ distances_inlines.hh Boundary_defs.hh intervals_defs.hh \
+ Interval_Info_defs.hh Interval_Info_inlines.hh \
+ Interval_defs.hh Interval_inlines.hh Interval_templates.hh \
+ Box_defs.hh Box_Status_inlines.hh Box_inlines.hh \
+ Box_templates.hh Integer_Interval.hh Rational_Interval.hh \
+ Rational_Box.hh Variable_defs.hh Variable_inlines.hh \
+ Variables_Set_defs.hh Variables_Set_inlines.hh Init_defs.hh \
+ Init_inlines.hh initializer.hh Topology_types.hh \
+ Dense_Row_defs.hh Dense_Row_inlines.hh Dense_Row_templates.hh \
+ CO_Tree_defs.hh CO_Tree_inlines.hh CO_Tree_templates.hh \
+ Sparse_Row_defs.hh Sparse_Row_inlines.hh \
+ Sparse_Row_templates.hh Bit_Row_defs.hh Bit_Row_inlines.hh \
+ Linear_System_defs.hh Linear_System_inlines.hh \
+ Linear_System_templates.hh Bit_Matrix_defs.hh \
+ Bit_Matrix_inlines.hh Constraint_System_defs.hh \
+ Generator_System_defs.hh Grid_Generator_System_defs.hh \
+ Congruence_System_defs.hh Linear_Expression_defs.hh \
+ Linear_Expression_inlines.hh Expression_Adapter_defs.hh \
+ Expression_Adapter_inlines.hh Expression_Hide_Last_defs.hh \
+ Expression_Hide_Last_inlines.hh Expression_Hide_Inhomo_defs.hh \
+ Expression_Hide_Inhomo_inlines.hh \
+ Linear_Expression_Impl_defs.hh \
+ Linear_Expression_Impl_inlines.hh \
+ Linear_Expression_Impl_templates.hh \
+ Linear_Expression_Interface_defs.hh Linear_Form_defs.hh \
+ Linear_Form_inlines.hh Linear_Form_templates.hh linearize.hh \
+ Constraint_defs.hh Constraint_inlines.hh \
+ Constraint_System_inlines.hh Generator_defs.hh \
+ Generator_inlines.hh Grid_Generator_defs.hh \
+ Grid_Generator_inlines.hh Congruence_defs.hh \
+ Congruence_inlines.hh Generator_System_inlines.hh \
+ Grid_Generator_System_inlines.hh Congruence_System_inlines.hh \
+ Scalar_Products_defs.hh Scalar_Products_inlines.hh \
+ Matrix_defs.hh Matrix_inlines.hh Matrix_templates.hh \
+ Swapping_Vector_defs.hh Swapping_Vector_inlines.hh \
+ MIP_Problem_types.hh MIP_Problem_defs.hh \
+ MIP_Problem_inlines.hh MIP_Problem_templates.hh \
+ PIP_Tree_defs.hh PIP_Tree_inlines.hh PIP_Problem_defs.hh \
+ PIP_Problem_inlines.hh PIP_Problem_templates.hh \
+ Poly_Con_Relation_defs.hh Poly_Con_Relation_inlines.hh \
+ Poly_Gen_Relation_defs.hh Poly_Gen_Relation_inlines.hh \
+ BHRZ03_Certificate_defs.hh BHRZ03_Certificate_inlines.hh \
+ H79_Certificate_defs.hh H79_Certificate_inlines.hh \
+ Grid_Certificate_defs.hh Grid_Certificate_inlines.hh \
+ Partial_Function_defs.hh Partial_Function_inlines.hh \
+ Polyhedron_defs.hh Ph_Status_inlines.hh Polyhedron_inlines.hh \
+ Polyhedron_chdims_templates.hh \
+ Polyhedron_conversion_templates.hh \
+ Polyhedron_minimize_templates.hh \
+ Polyhedron_simplify_templates.hh Polyhedron_templates.hh \
+ Grid_defs.hh Grid_Status_inlines.hh Grid_inlines.hh \
+ Grid_templates.hh C_Polyhedron_defs.hh C_Polyhedron_inlines.hh \
+ NNC_Polyhedron_defs.hh NNC_Polyhedron_inlines.hh \
+ Widening_Function_types.hh Widening_Function_defs.hh \
+ Widening_Function_inlines.hh Ptr_Iterator_defs.hh \
+ Ptr_Iterator_inlines.hh DB_Row_defs.hh DB_Row_inlines.hh \
+ DB_Row_templates.hh DB_Matrix_defs.hh DB_Matrix_inlines.hh \
+ DB_Matrix_templates.hh BD_Shape_defs.hh BDS_Status_inlines.hh \
+ BD_Shape_inlines.hh BD_Shape_templates.hh OR_Matrix_defs.hh \
+ OR_Matrix_inlines.hh OR_Matrix_templates.hh \
+ Octagonal_Shape_defs.hh Og_Status_inlines.hh \
+ Octagonal_Shape_inlines.hh Octagonal_Shape_templates.hh \
+ Determinate_types.hh Determinate_defs.hh \
+ Determinate_inlines.hh Powerset_types.hh Powerset_defs.hh \
+ Powerset_inlines.hh Powerset_templates.hh \
+ Pointset_Powerset_types.hh Pointset_Powerset_defs.hh \
+ Pointset_Powerset_inlines.hh Pointset_Powerset_templates.hh \
+ Partially_Reduced_Product_types.hh \
+ Partially_Reduced_Product_defs.hh \
+ Partially_Reduced_Product_inlines.hh \
+ Partially_Reduced_Product_templates.hh Weight_Profiler_defs.hh \
+ max_space_dimension.hh algorithms.hh termination_defs.hh \
+ termination_templates.hh wrap_assign.hh wrap_string.hh \
+ Floating_Point_Expression_types.hh \
+ Floating_Point_Expression_defs.hh \
+ Floating_Point_Expression_inlines.hh \
+ Floating_Point_Expression_templates.hh \
+ Cast_Floating_Point_Expression_types.hh \
+ Cast_Floating_Point_Expression_defs.hh \
+ Cast_Floating_Point_Expression_inlines.hh \
+ Cast_Floating_Point_Expression_templates.hh \
+ Constant_Floating_Point_Expression_types.hh \
+ Constant_Floating_Point_Expression_defs.hh \
+ Constant_Floating_Point_Expression_inlines.hh \
+ Variable_Floating_Point_Expression_types.hh \
+ Variable_Floating_Point_Expression_defs.hh \
+ Variable_Floating_Point_Expression_inlines.hh \
+ Sum_Floating_Point_Expression_types.hh \
+ Sum_Floating_Point_Expression_defs.hh \
+ Sum_Floating_Point_Expression_inlines.hh \
+ Sum_Floating_Point_Expression_templates.hh \
+ Difference_Floating_Point_Expression_types.hh \
+ Difference_Floating_Point_Expression_defs.hh \
+ Difference_Floating_Point_Expression_inlines.hh \
+ Difference_Floating_Point_Expression_templates.hh \
+ Multiplication_Floating_Point_Expression_types.hh \
+ Multiplication_Floating_Point_Expression_defs.hh \
+ Multiplication_Floating_Point_Expression_inlines.hh \
+ Multiplication_Floating_Point_Expression_templates.hh \
+ Division_Floating_Point_Expression_types.hh \
+ Division_Floating_Point_Expression_defs.hh \
+ Division_Floating_Point_Expression_inlines.hh \
+ Division_Floating_Point_Expression_templates.hh \
+ Opposite_Floating_Point_Expression_types.hh \
+ Opposite_Floating_Point_Expression_defs.hh \
+ Opposite_Floating_Point_Expression_inlines.hh \
+ Doubly_Linked_Object_types.hh EList_types.hh \
+ EList_Iterator_types.hh Handler_types.hh \
+ Pending_Element_types.hh Pending_List_types.hh Time_types.hh \
+ Watchdog_types.hh Threshold_Watcher_types.hh Handler_defs.hh \
+ Handler_inlines.hh Time_defs.hh Time_inlines.hh \
+ Doubly_Linked_Object_defs.hh Doubly_Linked_Object_inlines.hh \
+ EList_Iterator_defs.hh EList_Iterator_inlines.hh EList_defs.hh \
+ EList_inlines.hh Pending_Element_defs.hh \
+ Pending_Element_inlines.hh Pending_List_defs.hh \
+ Pending_List_inlines.hh Pending_List_templates.hh \
+ Watchdog_defs.hh Watchdog_inlines.hh Threshold_Watcher_defs.hh \
+ Threshold_Watcher_inlines.hh Threshold_Watcher_templates.hh \
+ Ph_Status_idefs.hh Grid_Status_idefs.hh Box_Status_idefs.hh \
+ BDS_Status_idefs.hh Og_Status_idefs.hh \
+ swapping_sort_templates.hh termination.cc wrap_string.cc \
+ Time.cc Watchdog.cc Threshold_Watcher.cc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) $(am__objects_1)
+am_libppl_la_OBJECTS = assert.lo Box.lo checked.lo Checked_Number.lo \
+ Float.lo fpu-ia32.lo Concrete_Expression.lo Constraint.lo \
+ Constraint_System.lo Congruence.lo Congruence_System.lo \
+ Generator_System.lo Grid_Generator_System.lo Generator.lo \
+ Grid_Generator.lo Init.lo Coefficient.lo Linear_Expression.lo \
+ Linear_Expression_Impl.lo Linear_Expression_Interface.lo \
+ Linear_Form.lo Scalar_Products.lo MIP_Problem.lo PIP_Tree.lo \
+ PIP_Problem.lo Poly_Con_Relation.lo Poly_Gen_Relation.lo \
+ BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.lo \
+ Partial_Function.lo Polyhedron_nonpublic.lo \
+ Polyhedron_public.lo Polyhedron_chdims.lo \
+ Polyhedron_widenings.lo C_Polyhedron.lo NNC_Polyhedron.lo \
+ Grid_nonpublic.lo Grid_public.lo Grid_chdims.lo \
+ Grid_widenings.lo BD_Shape.lo Octagonal_Shape.lo \
+ Pointset_Powerset.lo CO_Tree.lo Sparse_Row.lo Dense_Row.lo \
+ Bit_Matrix.lo Bit_Row.lo Ph_Status.lo Grid_Status.lo \
+ Variable.lo Variables_Set.lo Grid_conversion.lo \
+ Grid_simplify.lo stdiobuf.lo c_streambuf.lo globals.lo \
+ mp_std_bits.lo Weight_Profiler.lo version.lo $(am__objects_2) \
+ $(am__objects_1) termination.lo wrap_string.lo Time.lo \
+ Watchdog.lo Threshold_Watcher.lo
+libppl_la_OBJECTS = $(am_libppl_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libppl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libppl_la_LDFLAGS) $(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_config_OBJECTS = BUGS.$(OBJEXT) COPYING.$(OBJEXT) \
+ CREDITS.$(OBJEXT)
+nodist_ppl_config_OBJECTS = ppl-config.$(OBJEXT)
+ppl_config_OBJECTS = $(am_ppl_config_OBJECTS) \
+ $(nodist_ppl_config_OBJECTS)
+ppl_config_DEPENDENCIES = libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES) \
+ $(nodist_ppl_config_SOURCES)
+DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__include_HEADERS_DIST = ppl.hh
+am__noinst_HEADERS_DIST = ppl.hh
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS) \
+ $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+LIBPPL_LT_CURRENT = 13
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_srcdir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+ppl_config_SOURCES = \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+nodist_ppl_config_SOURCES = \
+ppl-config.cc \
+ppl.hh
+
+ppl_config_LDADD = \
+ at extra_libraries@ \
+libppl.la
+
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES =
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@ GMP_Integer_types.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES =
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES =
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@ GMP_Integer_defs.hh \
+ at USE_GMP_INTEGERS_TRUE@ GMP_Integer_inlines.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES =
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+assert.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits_defs.hh \
+mp_std_bits_inlines.hh \
+Concrete_Expression_types.hh \
+Concrete_Expression_defs.hh \
+Concrete_Expression_inlines.hh \
+Temp_defs.hh \
+Temp_inlines.hh \
+Temp_templates.hh \
+Coefficient_traits_template.hh \
+Checked_Number_types.hh \
+termination_types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient_types.hh \
+stdiobuf_types.hh \
+c_streambuf_types.hh \
+globals_types.hh \
+iterator_to_const_types.hh \
+distances_types.hh \
+Interval_Info_types.hh \
+Interval_types.hh \
+Box_types.hh \
+Constraint_types.hh \
+Generator_types.hh \
+Grid_Generator_types.hh \
+Congruence_types.hh \
+Init_types.hh \
+Dense_Row_types.hh \
+CO_Tree_types.hh \
+Sparse_Row_types.hh \
+Matrix_types.hh \
+Swapping_Vector_types.hh \
+Variable_types.hh \
+Variables_Set_types.hh \
+Linear_Expression_types.hh \
+Expression_Adapter_types.hh \
+Expression_Hide_Last_types.hh \
+Expression_Hide_Inhomo_types.hh \
+Linear_Expression_Impl_types.hh \
+Linear_Expression_Interface_types.hh \
+Linear_System_types.hh \
+Linear_Form_types.hh \
+Bit_Row_types.hh \
+Bit_Matrix_types.hh \
+Constraint_System_types.hh \
+Generator_System_types.hh \
+Grid_Generator_System_types.hh \
+Congruence_System_types.hh \
+Scalar_Products_types.hh \
+PIP_Tree_types.hh \
+PIP_Problem_types.hh \
+Poly_Con_Relation_types.hh \
+Poly_Gen_Relation_types.hh \
+BHRZ03_Certificate_types.hh \
+H79_Certificate_types.hh \
+Grid_Certificate_types.hh \
+Partial_Function_types.hh \
+Polyhedron_types.hh \
+C_Polyhedron_types.hh \
+NNC_Polyhedron_types.hh \
+Grid_types.hh \
+Ptr_Iterator_types.hh \
+DB_Row_types.hh \
+DB_Matrix_types.hh \
+BD_Shape_types.hh \
+OR_Matrix_types.hh \
+Octagonal_Shape_types.hh \
+fpu_types.hh \
+Float_defs.hh \
+Float_inlines.hh \
+Float_templates.hh \
+C_Integer.hh \
+fpu_defs.hh \
+fpu-c99_inlines.hh \
+fpu-ia32_inlines.hh \
+fpu-none_inlines.hh \
+fpu-sparc_inlines.hh \
+Rounding_Dir_defs.hh \
+Rounding_Dir_inlines.hh \
+Result_defs.hh \
+Result_inlines.hh \
+Numeric_Format_defs.hh \
+checked_defs.hh \
+checked_inlines.hh \
+checked_int_inlines.hh \
+checked_float_inlines.hh \
+checked_mpz_inlines.hh \
+checked_mpq_inlines.hh \
+checked_ext_inlines.hh \
+Checked_Number_defs.hh \
+Checked_Number_inlines.hh \
+Checked_Number_templates.hh \
+WRD_coefficient_types_defs.hh \
+WRD_coefficient_types_inlines.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient_defs.hh \
+Coefficient_inlines.hh \
+stdiobuf_defs.hh \
+stdiobuf_inlines.hh \
+c_streambuf_defs.hh \
+c_streambuf_inlines.hh \
+globals_defs.hh \
+globals_inlines.hh \
+math_utilities_defs.hh \
+math_utilities_inlines.hh \
+iterator_to_const_defs.hh \
+iterator_to_const_inlines.hh \
+distances_defs.hh \
+distances_inlines.hh \
+Boundary_defs.hh \
+intervals_defs.hh \
+Interval_Info_defs.hh \
+Interval_Info_inlines.hh \
+Interval_defs.hh \
+Interval_inlines.hh \
+Interval_templates.hh \
+Box_defs.hh \
+Box_Status_inlines.hh \
+Box_inlines.hh \
+Box_templates.hh \
+Integer_Interval.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
+Variable_defs.hh \
+Variable_inlines.hh \
+Variables_Set_defs.hh \
+Variables_Set_inlines.hh \
+Init_defs.hh \
+Init_inlines.hh \
+initializer.hh \
+Topology_types.hh \
+Dense_Row_defs.hh \
+Dense_Row_inlines.hh \
+Dense_Row_templates.hh \
+CO_Tree_defs.hh \
+CO_Tree_inlines.hh \
+CO_Tree_templates.hh \
+Sparse_Row_defs.hh \
+Sparse_Row_inlines.hh \
+Sparse_Row_templates.hh \
+Bit_Row_defs.hh \
+Bit_Row_inlines.hh \
+Linear_System_defs.hh \
+Linear_System_inlines.hh \
+Linear_System_templates.hh \
+Bit_Matrix_defs.hh \
+Bit_Matrix_inlines.hh \
+Constraint_System_defs.hh \
+Generator_System_defs.hh \
+Grid_Generator_System_defs.hh \
+Congruence_System_defs.hh \
+Linear_Expression_defs.hh \
+Linear_Expression_inlines.hh \
+Expression_Adapter_defs.hh \
+Expression_Adapter_inlines.hh \
+Expression_Hide_Last_defs.hh \
+Expression_Hide_Last_inlines.hh \
+Expression_Hide_Inhomo_defs.hh \
+Expression_Hide_Inhomo_inlines.hh \
+Linear_Expression_Impl_defs.hh \
+Linear_Expression_Impl_inlines.hh \
+Linear_Expression_Impl_templates.hh \
+Linear_Expression_Interface_defs.hh \
+Linear_Form_defs.hh \
+Linear_Form_inlines.hh \
+Linear_Form_templates.hh \
+linearize.hh \
+Constraint_defs.hh \
+Constraint_inlines.hh \
+Constraint_System_inlines.hh \
+Generator_defs.hh \
+Generator_inlines.hh \
+Grid_Generator_defs.hh \
+Grid_Generator_inlines.hh \
+Congruence_defs.hh \
+Congruence_inlines.hh \
+Generator_System_inlines.hh \
+Grid_Generator_System_inlines.hh \
+Congruence_System_inlines.hh \
+Scalar_Products_defs.hh \
+Scalar_Products_inlines.hh \
+Matrix_defs.hh \
+Matrix_inlines.hh \
+Matrix_templates.hh \
+Swapping_Vector_defs.hh \
+Swapping_Vector_inlines.hh \
+MIP_Problem_types.hh \
+MIP_Problem_defs.hh \
+MIP_Problem_inlines.hh \
+MIP_Problem_templates.hh \
+PIP_Tree_types.hh \
+PIP_Tree_defs.hh \
+PIP_Tree_inlines.hh \
+PIP_Problem_types.hh \
+PIP_Problem_defs.hh \
+PIP_Problem_inlines.hh \
+PIP_Problem_templates.hh \
+Poly_Con_Relation_defs.hh \
+Poly_Con_Relation_inlines.hh \
+Poly_Gen_Relation_defs.hh \
+Poly_Gen_Relation_inlines.hh \
+BHRZ03_Certificate_defs.hh \
+BHRZ03_Certificate_inlines.hh \
+H79_Certificate_defs.hh \
+H79_Certificate_inlines.hh \
+Grid_Certificate_defs.hh \
+Grid_Certificate_inlines.hh \
+Partial_Function_defs.hh \
+Partial_Function_inlines.hh \
+Polyhedron_defs.hh \
+Ph_Status_inlines.hh \
+Polyhedron_inlines.hh \
+Polyhedron_chdims_templates.hh \
+Polyhedron_conversion_templates.hh \
+Polyhedron_minimize_templates.hh \
+Polyhedron_simplify_templates.hh \
+Polyhedron_templates.hh \
+Grid_defs.hh \
+Grid_Status_inlines.hh \
+Grid_inlines.hh \
+Grid_templates.hh \
+C_Polyhedron_defs.hh \
+C_Polyhedron_inlines.hh \
+NNC_Polyhedron_defs.hh \
+NNC_Polyhedron_inlines.hh \
+Widening_Function_types.hh \
+Widening_Function_defs.hh \
+Widening_Function_inlines.hh \
+Ptr_Iterator_defs.hh \
+Ptr_Iterator_inlines.hh \
+DB_Row_defs.hh \
+DB_Row_inlines.hh \
+DB_Row_templates.hh \
+DB_Matrix_defs.hh \
+DB_Matrix_inlines.hh \
+DB_Matrix_templates.hh \
+BD_Shape_defs.hh \
+BDS_Status_inlines.hh \
+BD_Shape_inlines.hh \
+BD_Shape_templates.hh \
+OR_Matrix_defs.hh \
+OR_Matrix_inlines.hh \
+OR_Matrix_templates.hh \
+Octagonal_Shape_defs.hh \
+Og_Status_inlines.hh \
+Octagonal_Shape_inlines.hh \
+Octagonal_Shape_templates.hh \
+Determinate_types.hh \
+Determinate_defs.hh \
+Determinate_inlines.hh \
+Powerset_types.hh \
+Powerset_defs.hh \
+Powerset_inlines.hh \
+Powerset_templates.hh \
+Pointset_Powerset_types.hh \
+Pointset_Powerset_defs.hh \
+Pointset_Powerset_inlines.hh \
+Pointset_Powerset_templates.hh \
+Partially_Reduced_Product_types.hh \
+Partially_Reduced_Product_defs.hh \
+Partially_Reduced_Product_inlines.hh \
+Partially_Reduced_Product_templates.hh \
+Weight_Profiler_defs.hh \
+max_space_dimension.hh \
+algorithms.hh \
+termination_defs.hh \
+termination_templates.hh \
+wrap_assign.hh \
+wrap_string.hh \
+Floating_Point_Expression_types.hh \
+Floating_Point_Expression_defs.hh \
+Floating_Point_Expression_inlines.hh \
+Floating_Point_Expression_templates.hh \
+Cast_Floating_Point_Expression_types.hh \
+Cast_Floating_Point_Expression_defs.hh \
+Cast_Floating_Point_Expression_inlines.hh \
+Cast_Floating_Point_Expression_templates.hh \
+Constant_Floating_Point_Expression_types.hh \
+Constant_Floating_Point_Expression_defs.hh \
+Constant_Floating_Point_Expression_inlines.hh \
+Variable_Floating_Point_Expression_types.hh \
+Variable_Floating_Point_Expression_defs.hh \
+Variable_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_types.hh \
+Sum_Floating_Point_Expression_defs.hh \
+Sum_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_templates.hh \
+Difference_Floating_Point_Expression_types.hh \
+Difference_Floating_Point_Expression_defs.hh \
+Difference_Floating_Point_Expression_inlines.hh \
+Difference_Floating_Point_Expression_templates.hh \
+Multiplication_Floating_Point_Expression_types.hh \
+Multiplication_Floating_Point_Expression_defs.hh \
+Multiplication_Floating_Point_Expression_inlines.hh \
+Multiplication_Floating_Point_Expression_templates.hh \
+Division_Floating_Point_Expression_types.hh \
+Division_Floating_Point_Expression_defs.hh \
+Division_Floating_Point_Expression_inlines.hh \
+Division_Floating_Point_Expression_templates.hh \
+Opposite_Floating_Point_Expression_types.hh \
+Opposite_Floating_Point_Expression_defs.hh \
+Opposite_Floating_Point_Expression_inlines.hh \
+Doubly_Linked_Object_types.hh \
+EList_types.hh \
+EList_Iterator_types.hh \
+Handler_types.hh \
+Pending_Element_types.hh \
+Pending_List_types.hh \
+Time_types.hh \
+Watchdog_types.hh \
+Threshold_Watcher_types.hh \
+Handler_defs.hh \
+Handler_inlines.hh \
+Time_defs.hh \
+Time_inlines.hh \
+Doubly_Linked_Object_defs.hh \
+Doubly_Linked_Object_inlines.hh \
+EList_Iterator_defs.hh \
+EList_Iterator_inlines.hh \
+EList_defs.hh \
+EList_inlines.hh \
+Pending_Element_defs.hh \
+Pending_Element_inlines.hh \
+Pending_List_defs.hh \
+Pending_List_inlines.hh \
+Pending_List_templates.hh \
+Watchdog_defs.hh \
+Watchdog_inlines.hh \
+Threshold_Watcher_defs.hh \
+Threshold_Watcher_inlines.hh \
+Threshold_Watcher_templates.hh
+
+#Any_Pointset_types.hh \
+#Any_Pointset_defs.hh \
+#Any_Pointset_inlines.hh \
+#Ask_Tell_types.hh \
+#Ask_Tell_defs.hh \
+#Ask_Tell_inlines.hh \
+#Ask_Tell_templates.hh \
+#Pointset_Ask_Tell_types.hh \
+#Pointset_Ask_Tell_defs.hh \
+#Pointset_Ask_Tell_inlines.hh \
+#Pointset_Ask_Tell_templates.hh
+NESTED_INCLUDE_FILES = \
+Ph_Status_idefs.hh \
+Grid_Status_idefs.hh \
+Box_Status_idefs.hh \
+BDS_Status_idefs.hh \
+Og_Status_idefs.hh
+
+libppl_la_SOURCES = \
+assert.cc \
+Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+fpu-ia32.cc \
+Concrete_Expression.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Linear_Expression.cc \
+Linear_Expression_Impl.cc \
+Linear_Expression_Interface.cc \
+Linear_Form.cc \
+Scalar_Products.cc \
+MIP_Problem.cc \
+PIP_Tree.cc \
+PIP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Partial_Function.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
+CO_Tree.cc \
+Sparse_Row.cc \
+Dense_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+Variables_Set.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+stdiobuf.cc \
+c_streambuf.cc \
+globals.cc \
+mp_std_bits.cc \
+Weight_Profiler.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort_templates.hh \
+termination.cc \
+wrap_string.cc \
+Time.cc \
+Watchdog.cc \
+Threshold_Watcher.cc
+
+#Pointset_Ask_Tell.cc
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_la_LIBADD = @extra_libraries@
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+ at BUILD_CXX_INTERFACE_TRUE@include_HEADERS = ppl.hh
+ at BUILD_CXX_INTERFACE_FALSE@noinst_HEADERS = ppl.hh
+nodist_noinst_HEADERS = ppl_include_files.hh
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+ at USE_PRECOMPILED_HEADERS_FALSE@PRECOMPILED =
+ at USE_PRECOMPILED_HEADERS_TRUE@PRECOMPILED = ppl.hh.gch
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+CLEANFILES = $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+version.hh: $(top_builddir)/config.status $(srcdir)/version.hh.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+ppl-config.cc: $(top_builddir)/config.status $(srcdir)/ppl-config.cc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES) $(EXTRA_libppl_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libppl_la_LINK) -rpath $(libdir) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES) $(EXTRA_ppl_config_DEPENDENCIES)
+ @rm -f ppl-config$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BD_Shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BHRZ03_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BUGS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/COPYING.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CO_Tree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CREDITS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Checked_Number.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Coefficient.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Concrete_Expression.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Dense_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_conversion.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_simplify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H79_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression_Impl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression_Interface.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Form.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/MIP_Problem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Octagonal_Shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PIP_Problem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PIP_Tree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Partial_Function.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Ph_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pointset_Powerset.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Con_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Gen_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Scalar_Products.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Sparse_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Threshold_Watcher.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Time.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variable.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variables_Set.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Watchdog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Weight_Profiler.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/assert.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/c_streambuf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/checked.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fpu-ia32.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/globals.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mp_std_bits.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl-config.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stdiobuf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/version.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap_string.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
+ uninstall-libLTLIBRARIES
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am \
+ install-includeHEADERS install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+ for file in $(INCLUDE_FILES) ; \
+ do \
+ i="#include \"$$file\"" ; \
+ ( cd $(top_srcdir)/src ; $(FGREP) -q "$$i" $(INCLUDE_FILES) ) || echo "$$i" ; \
+ done > $@
+
+ at HAVE_PERL_TRUE@ppl.hh: $(top_builddir)/ppl-config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/build_header \
+ at HAVE_PERL_TRUE@ -I $(top_builddir) -I $(top_builddir)/src \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/src/ppl_header.hh >$@
+
+ at HAVE_PERL_TRUE@BUGS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ at HAVE_PERL_TRUE@ @echo "#ifndef PPL_BUGS_hh" >$@
+ at HAVE_PERL_TRUE@ @echo "#define PPL_BUGS_hh 1" >>$@
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=BUGS_array --decl-only \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/BUGS >>$@
+ at HAVE_PERL_TRUE@ @echo "#endif // !defined(PPL_BUGS_hh)" >>$@
+ at HAVE_PERL_TRUE@BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/BUGS >$@
+
+ at HAVE_PERL_TRUE@COPYING.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ at HAVE_PERL_TRUE@ @echo "#ifndef PPL_COPYING_hh" >$@
+ at HAVE_PERL_TRUE@ @echo "#define PPL_COPYING_hh 1" >>$@
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=COPYING_array --decl-only \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/COPYING >>$@
+ at HAVE_PERL_TRUE@ @echo "#endif // !defined(PPL_COPYING_hh)" >>$@
+
+ at HAVE_PERL_TRUE@COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/COPYING >$@
+ at HAVE_PERL_TRUE@CREDITS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ at HAVE_PERL_TRUE@ @echo "#ifndef PPL_CREDITS_hh" >$@
+ at HAVE_PERL_TRUE@ @echo "#define PPL_CREDITS_hh 1" >>$@
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array --decl-only \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/CREDITS >>$@
+ at HAVE_PERL_TRUE@ @echo "#endif // !defined(PPL_CREDITS_hh)" >>$@
+ at HAVE_PERL_TRUE@CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ at HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+ at HAVE_PERL_TRUE@ $(top_srcdir)/CREDITS >$@
+
+ at HAVE_PERL_FALSE@ppl.hh.sed: Makefile
+ at HAVE_PERL_FALSE@ @echo "/^\/\* BEGIN ppl-config.h \*\/$$/ {" >$@
+ at HAVE_PERL_FALSE@ @echo " r $(top_builddir)/ppl-config.h" >>$@
+ at HAVE_PERL_FALSE@ @echo " : loop" >>$@
+ at HAVE_PERL_FALSE@ @echo " /\n\/\* END ppl-config.h \*\/$$/ !{" >>$@
+ at HAVE_PERL_FALSE@ @echo " N" >>$@
+ at HAVE_PERL_FALSE@ @echo " b loop" >>$@
+ at HAVE_PERL_FALSE@ @echo " }" >>$@
+ at HAVE_PERL_FALSE@ @echo " d" >>$@
+ at HAVE_PERL_FALSE@ @echo "}" >>$@
+
+ at HAVE_PERL_FALSE@ppl.hh: ppl.hh.dist ppl.hh.sed
+ at HAVE_PERL_FALSE@ $(SED) -f ppl.hh.sed ppl.hh.dist >$@
+ at HAVE_PERL_FALSE@ rm -f ppl.hh.sed
+
+ at HAVE_PERL_FALSE@BUGS.hh: BUGS.hh.dist
+ at HAVE_PERL_FALSE@ cp -f BUGS.hh.dist $@
+ at HAVE_PERL_FALSE@BUGS.cc: BUGS.cc.dist
+ at HAVE_PERL_FALSE@ cp -f BUGS.cc.dist $@
+ at HAVE_PERL_FALSE@COPYING.hh: COPYING.hh.dist
+ at HAVE_PERL_FALSE@ cp -f COPYING.hh.dist $@
+ at HAVE_PERL_FALSE@COPYING.cc: COPYING.cc.dist
+ at HAVE_PERL_FALSE@ cp -f COPYING.cc.dist $@
+ at HAVE_PERL_FALSE@CREDITS.hh: CREDITS.hh.dist
+ at HAVE_PERL_FALSE@ cp -f CREDITS.hh.dist $@
+ at HAVE_PERL_FALSE@CREDITS.cc: CREDITS.cc.dist
+ at HAVE_PERL_FALSE@ cp -f CREDITS.cc.dist $@
+
+ at USE_PRECOMPILED_HEADERS_TRUE@ppl.hh.gch: ppl.hh
+ at USE_PRECOMPILED_HEADERS_TRUE@ $(CXXCOMPILE) -xc++-header -o $@ ppl.hh
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+ mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+ mv -f $(distdir)/BUGS.hh $(distdir)/BUGS.hh.dist
+ mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+ mv -f $(distdir)/COPYING.hh $(distdir)/COPYING.hh.dist
+ mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+ mv -f $(distdir)/CREDITS.hh $(distdir)/CREDITS.hh.dist
+ mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+$(top_builddir)/utils/build_header:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+$(top_builddir)/utils/text2cxxarray:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils text2cxxarray
+
+$(top_builddir)/ppl-config.h:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) ppl-config.h
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Matrix_defs.hh b/src/Matrix_defs.hh
new file mode 100644
index 0000000..02743b7
--- /dev/null
+++ b/src/Matrix_defs.hh
@@ -0,0 +1,437 @@
+/* Matrix class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_defs_hh
+#define PPL_Matrix_defs_hh 1
+
+#include "Matrix_types.hh"
+#include "globals_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Swapping_Vector_defs.hh"
+#include <ostream>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A sparse matrix of Coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Matrix {
+
+public:
+ typedef typename Swapping_Vector<Row>::iterator iterator;
+ typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+ //! Returns the maximum number of rows of a Sparse_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns of a Sparse_Matrix.
+ static dimension_type max_num_columns();
+
+ /*!
+ \brief Constructs a square matrix with the given size, filled with
+ unstored zeroes.
+
+ \param n
+ The size of the new square matrix.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ explicit Matrix(dimension_type n = 0);
+
+ /*!
+ \brief Constructs a matrix with the given dimensions, filled with unstored
+ zeroes.
+
+ \param num_rows
+ The number of rows in the new matrix.
+
+ \param num_columns
+ The number of columns in the new matrix.
+
+ This method takes \f$O(n)\f$ time, where n is \p num_rows.
+ */
+ Matrix(dimension_type num_rows, dimension_type num_columns);
+
+ //! Swaps (*this) with x.
+ /*!
+
+ \param x
+ The matrix that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(Matrix& x);
+
+ //! Returns the number of rows in the matrix.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_rows() const;
+
+ //! Returns the number of columns in the matrix.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_columns() const;
+
+ // TODO: Check if this can be removed.
+ //! Returns the capacity of the row vector.
+ dimension_type capacity() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+ /*!
+ \note
+ The unusual naming for this method is \em intentional:
+ we do not want it to be named \c empty because this would cause
+ an error prone name clash with the corresponding methods in derived
+ classes Constraint_System and Congruence_System (which have a
+ different semantics).
+ */
+ bool has_no_rows() const;
+
+ //! Equivalent to resize(n, n).
+ void resize(dimension_type n);
+
+ // TODO: Check if this can become private.
+ //! Reserves space for at least \p n rows.
+ void reserve_rows(dimension_type n);
+
+ //! Resizes this matrix to the specified dimensions.
+ /*!
+
+ \param num_rows
+ The desired numer of rows.
+
+ \param num_columns
+ The desired numer of columns.
+
+ New rows and columns will contain non-stored zeroes.
+
+ This operation invalidates existing iterators.
+
+ Adding n rows takes \f$O(n)\f$ amortized time.
+
+ Adding n columns takes \f$O(r)\f$ time, where r is \p num_rows.
+
+ Removing n rows takes \f$O(n+k)\f$ amortized time, where k is the total
+ number of elements stored in the removed rows.
+
+ Removing n columns takes \f$O(\sum_{j=1}^{r} (k_j*\log^2 n_j))\f$ time,
+ where r is the number of rows, \f$k_j\f$ is the number of elements stored
+ in the columns of the j-th row that must be removed and \f$n_j\f$ is the
+ total number of elements stored in the j-th row.
+ A weaker (but simpler) bound is \f$O(r+k*\log^2 c)\f$, where r is the
+ number of rows, k is the number of elements that have to be removed and c
+ is the number of columns.
+ */
+ void resize(dimension_type num_rows, dimension_type num_columns);
+
+ //! Adds \p n rows and \p m columns of zeroes to the matrix.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ \param m
+ The number of columns to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times (c+m)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+
+ This method takes \f$O(r)\f$ time, where r is the number of the matrix's
+ rows after the operation.
+ */
+ void add_zero_rows_and_columns(dimension_type n, dimension_type m);
+
+ //! Adds to the matrix \p n rows of zeroes.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+
+ This method takes \f$O(k)\f$ amortized time, where k is the number of the
+ new rows.
+ */
+ void add_zero_rows(dimension_type n);
+
+ //! Adds a copy of the row \p x at the end of the matrix.
+ /*!
+
+ \param x
+ The row that will be appended to the matrix.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(n)\f$ amortized time, where n is the numer of
+ elements stored in \p x.
+ */
+ void add_row(const Row& x);
+
+ //! Adds the row \p y to the matrix.
+ /*!
+ \param y
+ The row to be added: it must have the same size and capacity as
+ \p *this. It is not declared <CODE>const</CODE> because its
+ data-structures will recycled to build the new matrix row.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\genfrac{(}{)}{0pt}{}{M}{y}\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_recycled_row(Row& y);
+
+ /*! \brief
+ Removes from the matrix the last \p n rows.
+
+ \param n
+ The number of row that will be removed.
+
+ It is equivalent to num_rows() - n, num_columns()).
+
+ This method takes \f$O(n+k)\f$ amortized time, where k is the total number
+ of elements stored in the removed rows and n is the number of removed
+ rows.
+ */
+ void remove_trailing_rows(dimension_type n);
+
+ void remove_rows(iterator first, iterator last);
+
+ //! Permutes the columns of the matrix.
+ /*!
+ This method may be slow for some Row types, and should be avoided if
+ possible.
+
+ \param cycles
+ A vector representing the non-trivial cycles of the permutation
+ according to which the columns must be rearranged.
+
+ The \p cycles vector contains, one after the other, the
+ non-trivial cycles (i.e., the cycles of length greater than one)
+ of a permutation of \e non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 7
+ columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+ 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+ represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+ turn can be represented by a vector of 6 elements containing 1, 3,
+ 6, 0, 2, 4, 0.
+
+ This method takes \f$O(k*\sum_{j=1}^{r} \log^2 n_j)\f$ expected time,
+ where k is the size of the \p cycles vector, r the number of rows and
+ \f$n_j\f$ the number of elements stored in row j.
+ A weaker (but simpler) bound is \f$O(k*r*\log^2 c)\f$, where k is the size
+ of the \p cycles vector, r is the number of rows and c is the number of
+ columns.
+
+ \note
+ The first column of the matrix, having index zero, is never involved
+ in a permutation.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_columns(dimension_type i, dimension_type j);
+
+ //! Adds \p n columns of zeroes to the matrix.
+ /*!
+ \param n
+ The number of columns to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+
+ This method takes \f$O(r)\f$ amortized time, where r is the numer of the
+ matrix's rows.
+ */
+ void add_zero_columns(dimension_type n);
+
+ //! Adds \p n columns of non-stored zeroes to the matrix before column i.
+ /*!
+
+ \param n
+ The numer of columns that will be added.
+
+ \param i
+ The index of the column before which the new columns will be added.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\sum_{j=1}^{r} (k_j+\log n_j))\f$ time, where r is
+ the number of rows, \f$k_j\f$ is the number of elements stored in the
+ columns of the j-th row that must be shifted and \f$n_j\f$ is the number
+ of elements stored in the j-th row.
+ A weaker (but simpler) bound is \f$O(k+r*\log c)\f$ time, where k is the
+ number of elements that must be shifted, r is the number of the rows and c
+ is the number of the columns.
+ */
+ void add_zero_columns(dimension_type n, dimension_type i);
+
+ //! Removes the i-th from the matrix, shifting other columns to the left.
+ /*!
+
+ \param i
+ The index of the column that will be removed.
+
+ This operation invalidates existing iterators on rows' elements.
+
+ This method takes \f$O(k + \sum_{j=1}^{r} (\log^2 n_j))\f$ amortized time,
+ where k is the number of elements stored with column index greater than i,
+ r the number of rows in this matrix and \f$n_j\f$ the number of elements
+ stored in row j.
+ A weaker (but simpler) bound is \f$O(r*(c-i+\log^2 c))\f$, where r is the
+ number of rows, c is the number of columns and i is the parameter passed
+ to this method.
+ */
+ void remove_column(dimension_type i);
+
+ //! Shrinks the matrix by removing its \p n trailing columns.
+ /*!
+
+ \param n
+ The number of trailing columns that will be removed.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\sum_{j=1}^r (k_j*\log n_j))\f$ amortized time,
+ where r is the number of rows, \f$k_j\f$ is the number of elements that
+ have to be removed from row j and \f$n_j\f$ is the total number of
+ elements stored in row j.
+ A weaker (but simpler) bound is \f$O(r*n*\log c)\f$, where r is the number
+ of rows, c the number of columns and n the parameter passed to this
+ method.
+ */
+ void remove_trailing_columns(dimension_type n);
+
+ //! Equivalent to resize(0,0).
+ void clear();
+
+ //! Returns an %iterator pointing to the first row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an %iterator pointing after the last row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator end();
+
+ //! Returns an %iterator pointing to the first row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator begin() const;
+
+ //! Returns an %iterator pointing after the last row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator end() const;
+
+ //! Returns a reference to the i-th row.
+ /*!
+ \param i
+ The index of the desired row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ Row& operator[](dimension_type i);
+
+ //! Returns a const reference to the i-th row.
+ /*!
+ \param i
+ The index of the desired row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const Row& operator[](dimension_type i) const;
+
+ //! Loads the row from an ASCII representation generated using ascii_dump().
+ /*!
+ \param s
+ The stream from which read the ASCII representation.
+
+ This method takes \f$O(n*\log n)\f$ time.
+ */
+ bool ascii_load(std::istream& s);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ /*!
+ This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+ number of elements stored in the matrix.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+ number of elements stored in the matrix.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The vector that stores the matrix's elements.
+ Swapping_Vector<Row> rows;
+
+ //! The number of columns in this matrix.
+ dimension_type num_columns_;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Matrix<Row>& x, Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Matrix<Row>& x, const Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Matrix<Row>& x, const Matrix<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "Matrix_inlines.hh"
+#include "Matrix_templates.hh"
+
+#endif // !defined(PPL_Matrix_defs_hh)
diff --git a/src/Matrix_inlines.hh b/src/Matrix_inlines.hh
new file mode 100644
index 0000000..1e7bee9
--- /dev/null
+++ b/src/Matrix_inlines.hh
@@ -0,0 +1,200 @@
+/* Matrix class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_inlines_hh
+#define PPL_Matrix_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_rows() {
+ return std::vector<Row>().max_size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_columns() {
+ return Row::max_size();
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::m_swap(Matrix& x) {
+ using std::swap;
+ swap(rows, x.rows);
+ swap(num_columns_, x.num_columns_);
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_rows() const {
+ return rows.size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_columns() const {
+ return num_columns_;
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::capacity() const {
+ return rows.capacity();
+}
+
+template <typename Row>
+inline bool
+Matrix<Row>::has_no_rows() const {
+ return num_rows() == 0;
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::resize(dimension_type n) {
+ resize(n, n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::reserve_rows(dimension_type requested_capacity) {
+
+ rows.reserve(requested_capacity);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows_and_columns(dimension_type n, dimension_type m) {
+ resize(num_rows() + n, num_columns() + m);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows(dimension_type n) {
+ resize(num_rows() + n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_row(const Row& x) {
+ // TODO: Optimize this.
+ Row row(x);
+ add_zero_rows(1);
+ // Now x may have been invalidated, if it was a row of this matrix.
+ swap(rows.back(), row);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_recycled_row(Row& x) {
+ add_zero_rows(1);
+ swap(rows.back(), x);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_rows(dimension_type n) {
+ resize(num_rows() - n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_rows(iterator first, iterator last) {
+ rows.erase(first, last);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_columns(dimension_type n) {
+ resize(num_rows(), num_columns() + n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_columns(dimension_type n) {
+ PPL_ASSERT(n <= num_columns());
+ resize(num_rows(), num_columns() - n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::clear() {
+ resize(0, 0);
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::begin() {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::end() {
+ return rows.end();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::begin() const {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::end() const {
+ return rows.end();
+}
+
+template <typename Row>
+inline Row&
+Matrix<Row>::operator[](dimension_type i) {
+ PPL_ASSERT(i < rows.size());
+ return rows[i];
+}
+
+template <typename Row>
+inline const Row&
+Matrix<Row>::operator[](dimension_type i) const {
+ PPL_ASSERT(i < rows.size());
+ return rows[i];
+}
+
+template <typename Row>
+inline memory_size_type
+Matrix<Row>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline void
+swap(Matrix<Row>& x, Matrix<Row>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_inlines_hh)
diff --git a/src/Matrix_templates.hh b/src/Matrix_templates.hh
new file mode 100644
index 0000000..e091eaa
--- /dev/null
+++ b/src/Matrix_templates.hh
@@ -0,0 +1,202 @@
+/* Matrix class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_templates_hh
+#define PPL_Matrix_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type n)
+ : rows(n), num_columns_(n) {
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].resize(num_columns_);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type num_rows, dimension_type num_columns)
+ : rows(num_rows), num_columns_(num_columns) {
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].resize(num_columns_);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::resize(dimension_type num_rows, dimension_type num_columns) {
+ const dimension_type old_num_rows = rows.size();
+ rows.resize(num_rows);
+ if (old_num_rows < num_rows) {
+ for (dimension_type i = old_num_rows; i < num_rows; ++i)
+ rows[i].resize(num_columns);
+ if (num_columns_ != num_columns) {
+ num_columns_ = num_columns;
+ for (dimension_type i = 0; i < old_num_rows; ++i)
+ rows[i].resize(num_columns);
+ }
+ }
+ else
+ if (num_columns_ != num_columns) {
+ num_columns_ = num_columns;
+ for (dimension_type i = 0; i < num_rows; ++i)
+ rows[i].resize(num_columns);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::permute_columns(const std::vector<dimension_type>& cycles) {
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ const dimension_type n = cycles.size();
+ PPL_ASSERT(cycles[n - 1] == 0);
+ for (dimension_type k = num_rows(); k-- > 0; ) {
+ Row& rows_k = (*this)[k];
+ for (dimension_type i = 0, j = 0; i < n; i = ++j) {
+ // Make `j' be the index of the next cycle terminator.
+ while (cycles[j] != 0)
+ ++j;
+ // Cycles of length less than 2 are not allowed.
+ PPL_ASSERT(j - i >= 2);
+ if (j - i == 2)
+ // For cycles of length 2 no temporary is needed, just a swap.
+ rows_k.swap_coefficients(cycles[i], cycles[i + 1]);
+ else {
+ // Longer cycles need a temporary.
+ tmp = rows_k.get(cycles[j - 1]);
+ for (dimension_type l = (j - 1); l > i; --l)
+ rows_k.swap_coefficients(cycles[l-1], cycles[l]);
+ if (tmp == 0)
+ rows_k.reset(cycles[i]);
+ else {
+ using std::swap;
+ swap(tmp, rows_k[cycles[i]]);
+ }
+ }
+ }
+ }
+}
+
+template <typename Row>
+void
+Matrix<Row>::swap_columns(dimension_type i, dimension_type j) {
+ for (dimension_type k = num_rows(); k-- > 0; )
+ (*this)[k].swap_coefficients(i, j);
+}
+
+template <typename Row>
+void
+Matrix<Row>::add_zero_columns(dimension_type n, dimension_type i) {
+ for (dimension_type j = rows.size(); j-- > 0; )
+ rows[j].add_zeroes_and_shift(n, i);
+ num_columns_ += n;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::remove_column(dimension_type i) {
+ for (dimension_type j = rows.size(); j-- > 0; )
+ rows[j].delete_element_and_shift(i);
+ --num_columns_;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::ascii_dump(std::ostream& s) const {
+ s << num_rows() << " x ";
+ s << num_columns() << "\n";
+ for (const_iterator i = begin(), i_end = end(); i !=i_end; ++i)
+ i->ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Matrix<Row>)
+
+template <typename Row>
+bool
+Matrix<Row>::ascii_load(std::istream& s) {
+ std::string str;
+ dimension_type new_num_rows;
+ dimension_type new_num_cols;
+ if (!(s >> new_num_rows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> new_num_cols))
+ return false;
+
+ for (iterator i = rows.begin(), i_end = rows.end(); i != i_end; ++i)
+ i->clear();
+
+ resize(new_num_rows, new_num_cols);
+
+ for (dimension_type row = 0; row < new_num_rows; ++row)
+ if (!rows[row].ascii_load(s))
+ return false;
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+memory_size_type
+Matrix<Row>::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+bool
+Matrix<Row>::OK() const {
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ if (i->size() != num_columns_)
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator==(const Matrix<Row>& x, const Matrix<Row>& y) {
+ if (x.num_rows() != y.num_rows())
+ return false;
+ if (x.num_columns() != y.num_columns())
+ return false;
+ for (dimension_type i = x.num_rows(); i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator!=(const Matrix<Row>& x, const Matrix<Row>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_templates_hh)
diff --git a/src/Matrix_types.hh b/src/Matrix_types.hh
new file mode 100644
index 0000000..40e0185
--- /dev/null
+++ b/src/Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Matrix_types_hh
+#define PPL_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_types_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_defs.hh b/src/Multiplication_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..d660399
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_defs.hh
@@ -0,0 +1,251 @@
+/* Declarations for the Multiplication_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_defs_hh
+#define PPL_Multiplication_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Multiplication_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Multiplication Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of multiplication floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+ operators on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ i
+ \amlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \amifp i'\right)
+ + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left([a, b]
+ \amlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+ \aslf
+ \left([a, b]
+ \amlf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1].
+ \f].
+
+ Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+ \f]
+
+ Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}
+ \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+ method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+ and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+
+ Even though we intervalize the first operand in the above example, the
+ actual implementation utilizes an heuristics for choosing which of the two
+ operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the multiplication floating point
+ expression corresponding to \p x \f$\otimes\f$ \p y.
+ */
+ Multiplication_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Multiplication_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor.
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Multiplication_Floating_Point_Expression(
+ const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Multiplication_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Multiplication_Floating_Point_Expression_inlines.hh"
+#include "Multiplication_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_defs_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_inlines.hh b/src/Multiplication_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..4c4ffaf
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,71 @@
+/* Multiplication_Floating_Point_Expression class implementation: inline
+ functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_inlines_hh
+#define PPL_Multiplication_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Multiplication_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y) {
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Multiplication_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_inlines_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_templates.hh b/src/Multiplication_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..762d7bd
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_templates.hh
@@ -0,0 +1,109 @@
+/* Multiplication_Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_templates_hh
+#define PPL_Multiplication_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ /*
+ FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+ decide which of the two linear forms must be intervalized, as described
+ in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+ thesis "Weakly Relational Numerical Abstract Domains".
+ In this Section are also described other multiplication strategies, such
+ as All-Cases, Relative-Size Local, Simplification-Driven Global and
+ Homogeneity Global.
+ */
+
+ // Here we choose which of the two linear forms must be intervalized.
+
+ // true if we intervalize the first form, false if we intervalize the second.
+ bool intervalize_first;
+ FP_Linear_Form linearized_first_operand;
+ if (!first_operand->linearize(int_store, lf_store,
+ linearized_first_operand))
+ return false;
+ FP_Interval_Type intervalized_first_operand;
+ this->intervalize(linearized_first_operand, int_store,
+ intervalized_first_operand);
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ this->intervalize(linearized_second_operand, int_store,
+ intervalized_second_operand);
+
+ // FIXME: we are not sure that what we do here is policy-proof.
+ if (intervalized_first_operand.is_bounded()) {
+ if (intervalized_second_operand.is_bounded()) {
+ boundary_type first_interval_size
+ = intervalized_first_operand.upper()
+ - intervalized_first_operand.lower();
+ boundary_type second_interval_size
+ = intervalized_second_operand.upper()
+ - intervalized_second_operand.lower();
+ if (first_interval_size <= second_interval_size)
+ intervalize_first = true;
+ else
+ intervalize_first = false;
+ }
+ else
+ intervalize_first = true;
+ }
+ else {
+ if (intervalized_second_operand.is_bounded())
+ intervalize_first = false;
+ else
+ return false;
+ }
+
+ // Here we do the actual computation.
+ // For optimizing, we store the relative error directly into result.
+ if (intervalize_first) {
+ relative_error(linearized_second_operand, result);
+ linearized_second_operand *= intervalized_first_operand;
+ result *= intervalized_first_operand;
+ result += linearized_second_operand;
+ }
+ else {
+ relative_error(linearized_first_operand, result);
+ linearized_first_operand *= intervalized_second_operand;
+ result *= intervalized_second_operand;
+ result += linearized_first_operand;
+ }
+
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_templates_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_types.hh b/src/Multiplication_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..5e00f29
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_types_hh
+#define PPL_Multiplication_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_types_hh)
diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc
new file mode 100644
index 0000000..65fb421
--- /dev/null
+++ b/src/NNC_Polyhedron.cc
@@ -0,0 +1,88 @@
+/* NNC_Polyhedron class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "NNC_Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+ add_constraints(y.constraints());
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(cgs.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_congruences(cgs);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs, Recycle_Input)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(cgs.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cgs, recycle)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_congruences(cgs);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Grid& grid, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(grid.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(grid)",
+ "the space dimension of grid "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(grid.constraints());
+}
+
+bool
+PPL::NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron& y) {
+#define USE_BHZ09 1
+#if USE_BHZ09 // [BagnaraHZ09]
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("poly_hull_assign_if_exact(y)", "y", y);
+ return BHZ09_poly_hull_assign_if_exact(y);
+#else // Old implementation.
+ return PPL::poly_hull_assign_if_exact(*this, y);
+#endif
+#undef USE_BHZ09
+}
diff --git a/src/NNC_Polyhedron_defs.hh b/src/NNC_Polyhedron_defs.hh
new file mode 100644
index 0000000..bf8caf2
--- /dev/null
+++ b/src/NNC_Polyhedron_defs.hh
@@ -0,0 +1,267 @@
+/* NNC_Polyhedron class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_defs_hh
+#define PPL_NNC_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_types.hh"
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+ An object of the class NNC_Polyhedron represents a
+ <EM>not necessarily closed</EM> (NNC) convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ \note
+ Since NNC polyhedra are a generalization of closed polyhedra,
+ any object of the class C_Polyhedron can be (explicitly) converted
+ into an object of the class NNC_Polyhedron.
+ The reason for defining two different classes is that objects of
+ the class C_Polyhedron are characterized by a more efficient
+ implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+ //! Builds either the universe or the empty NNC polyhedron.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+ \param kind
+ Specifies whether a universe or an empty NNC polyhedron should be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+ Both parameters are optional:
+ by default, a 0-dimension space universe NNC polyhedron is built.
+ */
+ explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds an NNC polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron.
+ */
+ explicit NNC_Polyhedron(const Constraint_System& cs);
+
+ //! Builds an NNC polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit NNC_Polyhedron(const Generator_System& gs);
+
+ //! Builds an NNC polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds an NNC polyhedron recycling a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence
+ system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from the C polyhedron \p y.
+ /*!
+ \param y
+ The C polyhedron to be used;
+
+ \param complexity
+ This argument is ignored.
+ */
+ explicit NNC_Polyhedron(const C_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an NNC polyhedron out of a box.
+ /*!
+ The polyhedron inherits the space dimension of the box
+ and is the most precise that includes the box.
+
+ \param box
+ The box representing the polyhedron to be built;
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Interval>
+ explicit NNC_Polyhedron(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an NNC polyhedron out of a grid.
+ /*!
+ The polyhedron inherits the space dimension of the grid
+ and is the most precise that includes the grid.
+
+ \param grid
+ The grid used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ explicit NNC_Polyhedron(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a NNC polyhedron out of a BD shape.
+ /*!
+ The polyhedron inherits the space dimension of the BD shape
+ and is the most precise that includes the BD shape.
+
+ \param bd
+ The BD shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a NNC polyhedron out of an octagonal shape.
+ /*!
+ The polyhedron inherits the space dimension of the octagonal shape
+ and is the most precise that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ NNC_Polyhedron(const NNC_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+ //! Assigns to \p *this the C polyhedron \p y.
+ NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+ //! Destructor.
+ ~NNC_Polyhedron();
+
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+ //! Same as poly_hull_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this (the best approximation of) the result of
+ computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+#include "NNC_Polyhedron_inlines.hh"
+
+#endif // !defined(PPL_NNC_Polyhedron_defs_hh)
diff --git a/src/NNC_Polyhedron_inlines.hh b/src/NNC_Polyhedron_inlines.hh
new file mode 100644
index 0000000..7e19c34
--- /dev/null
+++ b/src/NNC_Polyhedron_inlines.hh
@@ -0,0 +1,158 @@
+/* NNC_Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_inlines_hh
+#define PPL_NNC_Polyhedron_inlines_hh 1
+
+#include "C_Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(num_dimensions,
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs, recycle)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs, recycle)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(box, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(bd.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(os.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(os.constraints());
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+ : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+ Polyhedron::operator=(y);
+ return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+ NNC_Polyhedron nnc_y(y);
+ m_swap(nnc_y);
+ return *this;
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+ return poly_hull_assign_if_exact(y);
+}
+
+inline void
+NNC_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+ Polyhedron::positive_time_elapse_assign_impl(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_inlines_hh)
diff --git a/src/NNC_Polyhedron_types.hh b/src/NNC_Polyhedron_types.hh
new file mode 100644
index 0000000..23fd390
--- /dev/null
+++ b/src/NNC_Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_NNC_Polyhedron_types_hh
+#define PPL_NNC_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_types_hh)
diff --git a/src/Numeric_Format_defs.hh b/src/Numeric_Format_defs.hh
new file mode 100644
index 0000000..fcc1b7c
--- /dev/null
+++ b/src/Numeric_Format_defs.hh
@@ -0,0 +1,38 @@
+/* Numeric format.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Numeric_Format_defs_hh
+#define PPL_Numeric_Format_defs_hh 1
+
+#include "Result_defs.hh"
+#include "fpu_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/OR_Matrix_defs.hh b/src/OR_Matrix_defs.hh
new file mode 100644
index 0000000..0215646
--- /dev/null
+++ b/src/OR_Matrix_defs.hh
@@ -0,0 +1,610 @@
+/* OR_Matrix class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_defs_hh
+#define PPL_OR_Matrix_defs_hh 1
+
+#include "globals_defs.hh"
+#include "OR_Matrix_types.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_defs.hh"
+#include <cstddef>
+#include <iosfwd>
+
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+ instance of the class OR_Matrix::Pseudo_Row carries its own size;
+ this enables extra consistency checks to be performed.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+ An OR_Matrix object is a DB_Row object that allows
+ the representation of a \em pseudo-triangular matrix,
+ like the following:
+
+<PRE>
+ _ _
+ 0 |_|_|
+ 1 |_|_|_ _
+ 2 |_|_|_|_|
+ 3 |_|_|_|_|_ _
+ 4 |_|_|_|_|_|_|
+ 5 |_|_|_|_|_|_|
+ . . .
+ _ _ _ _ _ _ _
+ 2n-2 |_|_|_|_|_|_| ... |_|
+ 2n-1 |_|_|_|_|_|_| ... |_|
+ 0 1 2 3 4 5 ... 2n-1
+
+</PRE>
+
+ It is characterized by parameter n that defines the structure,
+ and such that there are 2*n rows (and 2*n columns).
+ It provides row_iterators for the access to the rows
+ and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+ /*! \brief
+ An object that behaves like a matrix's row with respect to
+ the subscript operators.
+ */
+ template <typename U>
+ class Pseudo_Row {
+ public:
+ /*! \brief
+ Copy constructor allowing the construction of a const pseudo-row
+ from a non-const pseudo-row.
+ Ordinary copy constructor.
+ */
+ template <typename V>
+ Pseudo_Row(const Pseudo_Row<V>& y);
+
+ //! Destructor.
+ ~Pseudo_Row();
+
+ //! Subscript operator.
+ U& operator[](dimension_type k) const;
+
+ //! Default constructor: creates an invalid object that has to be assigned.
+ Pseudo_Row();
+
+ //! Assignment operator.
+ Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+ private:
+#else
+ // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+ public:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+ Pseudo_Row(U& y, dimension_type s);
+
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Private constructor for a Pseudo_Row beginning at \p y.
+ explicit Pseudo_Row(U& y);
+
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Holds a reference to the beginning of this row.
+ U* first;
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+ // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+ private:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! The size of the row.
+ dimension_type size_;
+
+ //! Returns the size of the row.
+ dimension_type size() const;
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+ // FIXME: the EDG-based compilers (such as Comeau and Intel)
+ // are here in wild disagreement with GCC: what is a legal friend
+ // declaration for one, is illegal for the others.
+#ifdef __EDG__
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::Pseudo_Row;
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::any_row_iterator;
+#else
+ template <typename V> friend class Pseudo_Row;
+ template <typename V> friend class any_row_iterator;
+#endif
+
+ friend class OR_Matrix;
+ }; // class Pseudo_Row
+
+public:
+ //! A (non const) reference to a matrix's row.
+ typedef Pseudo_Row<T> row_reference_type;
+
+ //! A const reference to a matrix's row.
+ typedef Pseudo_Row<const T> const_row_reference_type;
+
+private:
+ /*! \brief
+ A template class to derive both OR_Matrix::iterator
+ and OR_Matrix::const_iterator.
+ */
+ template <typename U>
+ class any_row_iterator {
+ public:
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef Pseudo_Row<U> value_type;
+ typedef long difference_type;
+ typedef const Pseudo_Row<U>* pointer;
+ typedef const Pseudo_Row<U>& reference;
+
+ //! Constructor to build past-the-end objects.
+ any_row_iterator(dimension_type n_rows);
+
+ /*! \brief
+ Builds an iterator pointing at the beginning of an OR_Matrix whose
+ first element is \p base;
+ */
+ explicit any_row_iterator(U& base);
+
+ /*! \brief
+ Copy constructor allowing the construction of a const_iterator
+ from a non-const iterator.
+ */
+ template <typename V>
+ any_row_iterator(const any_row_iterator<V>& y);
+
+ /*! \brief
+ Assignment operator allowing the assignment of a non-const iterator
+ to a const_iterator.
+ */
+ template <typename V>
+ any_row_iterator& operator=(const any_row_iterator<V>& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ any_row_iterator& operator++();
+
+ //! Postfix increment operator.
+ any_row_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ any_row_iterator& operator--();
+
+ //! Postfix decrement operator.
+ any_row_iterator operator--(int);
+
+ //! Subscript operator.
+ reference operator[](difference_type m) const;
+
+ //! Assignment-increment operator.
+ any_row_iterator& operator+=(difference_type m);
+
+ //! Assignment-increment operator for \p m of unsigned type.
+ template <typename Unsigned>
+ typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator&>::type
+ operator+=(Unsigned m);
+
+ //! Assignment-decrement operator.
+ any_row_iterator& operator-=(difference_type m);
+
+ //! Returns the difference between \p *this and \p y.
+ difference_type operator-(const any_row_iterator& y) const;
+
+ //! Returns the sum of \p *this and \p m.
+ any_row_iterator operator+(difference_type m) const;
+
+ //! Returns the sum of \p *this and \p m, for \p m of unsigned type.
+ template <typename Unsigned>
+ typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator>::type
+ operator+(Unsigned m) const;
+
+ //! Returns the difference of \p *this and \p m.
+ any_row_iterator operator-(difference_type m) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+ bool operator==(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is different from \p y.
+ */
+ bool operator!=(const any_row_iterator& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+ bool operator<(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is less than
+ or equal to \p y.
+ */
+ bool operator<=(const any_row_iterator& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+ bool operator>(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is greater than
+ or equal to \p y.
+ */
+ bool operator>=(const any_row_iterator& y) const;
+
+ dimension_type row_size() const;
+
+ dimension_type index() const;
+
+ private:
+ //! Represents the beginning of a row.
+ Pseudo_Row<U> value;
+
+ //! External index.
+ dimension_type e;
+
+ //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+ dimension_type i;
+
+ // FIXME: the EDG-based compilers (such as Comeau and Intel)
+ // are here in wild disagreement with GCC: what is a legal friend
+ // declaration for one, is illegal for the others.
+#ifdef __EDG__
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::any_row_iterator;
+#else
+ template <typename V> friend class any_row_iterator;
+#endif
+ }; // class any_row_iterator
+
+public:
+ //! A (non const) row iterator.
+ typedef any_row_iterator<T> row_iterator;
+
+ //! A const row iterator.
+ typedef any_row_iterator<const T> const_row_iterator;
+
+ //! A (non const) element iterator.
+ typedef typename DB_Row<T>::iterator element_iterator;
+
+ //! A const element iterator.
+ typedef typename DB_Row<T>::const_iterator const_element_iterator;
+
+public:
+ //! Returns the maximum number of rows of a OR_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Builds a matrix with specified dimensions.
+ /*!
+ \param num_dimensions
+ The space dimension of the matrix that will be created.
+
+ This constructor creates a matrix with \p 2*num_dimensions rows.
+ Each element is initialized to plus infinity.
+ */
+ OR_Matrix(dimension_type num_dimensions);
+
+ //! Copy constructor.
+ OR_Matrix(const OR_Matrix& y);
+
+ //! Constructs a conservative approximation of \p y.
+ template <typename U>
+ explicit OR_Matrix(const OR_Matrix<U>& y);
+
+ //! Destructor.
+ ~OR_Matrix();
+
+ //! Assignment operator.
+ OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+ template <typename U> friend class OR_Matrix;
+
+ //! Contains the rows of the matrix.
+ /*!
+ A DB_Row which contains the rows of the OR_Matrix
+ inserting each successive row to the end of the vec.
+ To contain all the elements of OR_Matrix the size of the DB_Row
+ is 2*n*(n+1), where the n is the characteristic parameter of
+ OR_Matrix.
+ */
+ DB_Row<T> vec;
+
+ //! Contains the dimension of the space of the matrix.
+ dimension_type space_dim;
+
+ //! Contains the capacity of \p vec.
+ dimension_type vec_capacity;
+
+ //! Private and not implemented: default construction is not allowed.
+ OR_Matrix();
+
+ /*! \brief
+ Returns the index into <CODE>vec</CODE> of the first element
+ of the row of index \p k.
+ */
+ static dimension_type row_first_element_index(dimension_type k);
+
+public:
+ //! Returns the size of the row of index \p k.
+ static dimension_type row_size(dimension_type k);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(OR_Matrix& y);
+
+ //! Makes the matrix grow by adding more space dimensions.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ Adds new rows of right dimension to the end if
+ there is enough capacity; otherwise, creates a new matrix,
+ with the specified dimension, copying the old elements
+ in the upper part of the new matrix, which is
+ then assigned to \p *this.
+ Each new element is initialized to plus infinity.
+ */
+ void grow(dimension_type new_dim);
+
+ //! Makes the matrix shrink by removing the last space dimensions.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ Erases from matrix to the end the rows with index
+ greater than 2*new_dim-1.
+ */
+ void shrink(dimension_type new_dim);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ If the new dimension is greater than the old one, it adds new rows
+ of right dimension to the end if there is enough capacity; otherwise,
+ it creates a new matrix, with the specified dimension, which is
+ then assigned to \p *this.
+ If the new dimension is less than the old one, it erase from the matrix
+ the rows having index greater than 2*new_dim-1
+ */
+ void resize_no_copy(dimension_type new_dim);
+
+ //! Returns the space-dimension of the matrix.
+ dimension_type space_dimension() const;
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ row_reference_type operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const_row_reference_type operator[](dimension_type k) const;
+ //@}
+
+
+ /*! \brief
+ Returns an iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ row_iterator row_begin();
+
+ //! Returns the past-the-end const_iterator.
+ row_iterator row_end();
+
+ /*! \brief
+ Returns a const row iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_row_iterator row_begin() const;
+
+ //! Returns the past-the-end const row iterator.
+ const_row_iterator row_end() const;
+
+ /*! \brief
+ Returns an iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ element_iterator element_begin();
+
+ //! Returns the past-the-end const_iterator.
+ element_iterator element_end();
+
+ /*! \brief
+ Returns a const element iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_element_iterator element_begin() const;
+
+ //! Returns the past-the-end const element iterator.
+ const_element_iterator element_end() const;
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(OR_Matrix<T>& x, OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the Euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "OR_Matrix_inlines.hh"
+#include "OR_Matrix_templates.hh"
+
+#endif // !defined(PPL_OR_Matrix_defs_hh)
diff --git a/src/OR_Matrix_inlines.hh b/src/OR_Matrix_inlines.hh
new file mode 100644
index 0000000..f0e8349
--- /dev/null
+++ b/src/OR_Matrix_inlines.hh
@@ -0,0 +1,751 @@
+/* OR_Matrix class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_inlines_hh
+#define PPL_OR_Matrix_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "distances_defs.hh"
+#include "assert.hh"
+#include "checked_defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+ return ((k + 1)*(k + 1))/2;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+ return k + 2 - k % 2;
+}
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+ return size_;
+}
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+ : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(0)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , dimension_type s
+#endif
+ )
+ : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(s)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+ : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(y.size_)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+ first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ size_ = y.size_;
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
+}
+
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ PPL_ASSERT(k < size_);
+#endif
+ return *(first + k);
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+ : value(),
+ e(n_rows)
+ // Field `i' is intentionally not initialized here.
+{
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ // Turn `value' into a valid object.
+ value.size_ = OR_Matrix::row_size(e);
+#endif
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+ : value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , OR_Matrix<T>::row_size(0)
+#endif
+ ),
+ e(0),
+ i(0) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+ : value(y.value),
+ e(y.e),
+ i(y.i) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+ value = y.value;
+ e = y.e;
+ i = y.i;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+ return value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+ return &value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+ ++e;
+ dimension_type increment = e;
+ if (e % 2 != 0)
+ ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ else {
+ value.size_ += 2;
+ }
+#endif
+ i += increment;
+ value.first += increment;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+ any_row_iterator old = *this;
+ ++(*this);
+ return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+ dimension_type decrement = e + 1;
+ --e;
+ if (e % 2 != 0) {
+ ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ value.size_ -= 2;
+#endif
+ }
+ i -= decrement;
+ value.first -= decrement;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+ any_row_iterator old = *this;
+ --(*this);
+ return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(const difference_type m) {
+ difference_type e_dt = static_cast<difference_type>(e);
+ difference_type i_dt = static_cast<difference_type>(i);
+ difference_type increment = m + (m * m) / 2 + m * e_dt;
+ if (e_dt % 2 == 0 && m % 2 != 0)
+ ++increment;
+ e_dt += m;
+ i_dt += increment;
+ e = static_cast<dimension_type>(e_dt);
+ i = static_cast<dimension_type>(i_dt);
+ value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ difference_type value_size_dt = static_cast<difference_type>(value.size_);
+ value_size_dt += (m - m % 2);
+ value.size_ = static_cast<dimension_type>(value_size_dt);
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+ typename OR_Matrix<T>::template any_row_iterator<U>& >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+=(Unsigned m) {
+ dimension_type n = m;
+ dimension_type increment = n + (n*n)/2 + n*e;
+ if (e % 2 == 0 && n % 2 != 0)
+ ++increment;
+ e += n;
+ i += increment;
+ value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ value.size_ = value.size_ + n - n % 2;
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+ return *this += -m;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+ return e - y.e;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+ any_row_iterator r = *this;
+ r += m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+ typename OR_Matrix<T>::template any_row_iterator<U> >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+(Unsigned m) const {
+ any_row_iterator r = *this;
+ r += m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+ any_row_iterator r = *this;
+ r -= m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+ return e == y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+ return e != y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+ return e < y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+ return e <= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+ return e > y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+ return e >= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+ return OR_Matrix::row_size(e);
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+ return e;
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+ return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+ return row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+ return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+ return const_row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+ return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+ return vec.end();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+ return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+ return vec.end();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::m_swap(OR_Matrix& y) {
+ using std::swap;
+ swap(vec, y.vec);
+ swap(space_dim, y.space_dim);
+ swap(vec_capacity, y.vec_capacity);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the integer square root of \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+isqrt(dimension_type x) {
+ dimension_type r = 0;
+ const dimension_type FIRST_BIT_MASK = 0x40000000U;
+ for (dimension_type t = FIRST_BIT_MASK; t != 0; t >>= 2) {
+ const dimension_type s = r + t;
+ if (s <= x) {
+ x -= s;
+ r = s + t;
+ }
+ r >>= 1;
+ }
+ return r;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+ // Compute the maximum number of rows that are contained in a DB_Row
+ // that allocates a pseudo-triangular matrix.
+ const dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+ return (k - 1) - (k - 1) % 2;
+}
+
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const dimension_type num_dimensions)
+ : vec(2*num_dimensions*(num_dimensions + 1)),
+ space_dim(num_dimensions),
+ vec_capacity(vec.size()) {
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::~OR_Matrix() {
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+ return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , row_size(k)
+#endif
+ );
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+ return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , row_size(k)
+#endif
+ );
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::num_rows() const {
+ return 2*space_dimension();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::clear() {
+ OR_Matrix<T>(0).m_swap(*this);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+ return x.space_dim == y.space_dim && x.vec == y.vec;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+ : vec(y.vec),
+ space_dim(y.space_dim),
+ vec_capacity(compute_capacity(y.vec.size(),
+ DB_Row<T>::max_size())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+ : vec(),
+ space_dim(y.space_dim),
+ vec_capacity(compute_capacity(y.vec.size(),
+ DB_Row<T>::max_size())) {
+ vec.construct_upward_approximation(y.vec, vec_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+ vec = y.vec;
+ space_dim = y.space_dim;
+ vec_capacity = compute_capacity(y.vec.size(), DB_Row<T>::max_size());
+ return *this;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+ PPL_ASSERT(new_dim >= space_dim);
+ if (new_dim > space_dim) {
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ if (new_size <= vec_capacity) {
+ // We can recycle the old vec.
+ vec.expand_within_capacity(new_size);
+ space_dim = new_dim;
+ }
+ else {
+ // We cannot recycle the old vec.
+ OR_Matrix<T> new_matrix(new_dim);
+ element_iterator j = new_matrix.element_begin();
+ for (element_iterator i = element_begin(),
+ mend = element_end(); i != mend; ++i, ++j)
+ assign_or_swap(*j, *i);
+ m_swap(new_matrix);
+ }
+ }
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+ PPL_ASSERT(new_dim <= space_dim);
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ vec.shrink(new_size);
+ space_dim = new_dim;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+ if (new_dim > space_dim) {
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ if (new_size <= vec_capacity) {
+ // We can recycle the old vec.
+ vec.expand_within_capacity(new_size);
+ space_dim = new_dim;
+ }
+ else {
+ // We cannot recycle the old vec.
+ OR_Matrix<T> new_matrix(new_dim);
+ m_swap(new_matrix);
+ }
+ }
+ else if (new_dim < space_dim)
+ shrink(new_dim);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ if (x.num_rows() != y.num_rows())
+ return false;
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (typename OR_Matrix<T>::const_element_iterator
+ i = x.element_begin(), j = y.element_begin(),
+ mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+ const T& x_i = *i;
+ const T& y_i = *j;
+ if (is_plus_infinity(x_i)) {
+ if (is_plus_infinity(y_i))
+ continue;
+ else {
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+ }
+ else if (is_plus_infinity(y_i))
+ goto pinf;
+
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i > y_i) {
+ maybe_assign(tmp1p, tmp1, x_i, dir);
+ maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i, dir);
+ maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+/*! \relates OR_Matrix */
+template <typename T>
+inline void
+swap(OR_Matrix<T>& x, OR_Matrix<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_OR_Matrix_inlines_hh)
diff --git a/src/OR_Matrix_templates.hh b/src/OR_Matrix_templates.hh
new file mode 100644
index 0000000..303677a
--- /dev/null
+++ b/src/OR_Matrix_templates.hh
@@ -0,0 +1,124 @@
+/* OR_Matrix class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_templates_hh
+#define PPL_OR_Matrix_templates_hh 1
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+ return vec.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+ // The right number of cells should be in use.
+ const dimension_type dim = space_dimension();
+ if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+ cerr << "OR_Matrix has a wrong number of cells:\n"
+ << "vec.size() is " << vec.size()
+ << ", expected size is " << (2*dim*(dim+1)) << "!\n";
+#endif
+ return false;
+ }
+
+ // The underlying DB_Row should be OK.
+ if (!vec.OK(vec.size(), vec_capacity))
+ return false;
+
+ // All checks passed.
+ return true;
+}
+
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+ const OR_Matrix<T>& x = *this;
+ const char separator = ' ';
+ dimension_type space = x.space_dimension();
+ s << space << separator << "\n";
+ for (const_row_iterator i = x.row_begin(),
+ x_row_end = x.row_end(); i != x_row_end; ++i) {
+ const_row_reference_type r = *i;
+ dimension_type rs = i.row_size();
+ for (dimension_type j = 0; j < rs; ++j) {
+ using namespace IO_Operators;
+ s << r[j] << separator;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
+
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+ dimension_type space;
+ if (!(s >> space))
+ return false;
+ resize_no_copy(space);
+ for (row_iterator i = row_begin(),
+ this_row_end = row_end(); i != this_row_end; ++i) {
+ row_reference_type r_i = *i;
+ const dimension_type rs = i.row_size();
+ for (dimension_type j = 0; j < rs; ++j) {
+ Result r = input(r_i[j], s, ROUND_CHECK);
+ if (result_relation(r) != VR_EQ || is_minus_infinity(r_i[j]))
+ return false;
+ }
+ }
+ PPL_ASSERT(OK());
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+ for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+ m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+ const dimension_type mr_size = m_iter.row_size();
+ for (dimension_type j = 0; j < mr_size; ++j)
+ s << r_m[j] << " ";
+ s << "\n";
+ }
+ return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_OR_Matrix_templates_hh)
diff --git a/src/OR_Matrix_types.hh b/src/OR_Matrix_types.hh
new file mode 100644
index 0000000..2b46764
--- /dev/null
+++ b/src/OR_Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_OR_Matrix_types_hh
+#define PPL_OR_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+#endif // !defined(PPL_OR_Matrix_types_hh)
diff --git a/src/Octagonal_Shape.cc b/src/Octagonal_Shape.cc
new file mode 100644
index 0000000..924f21e
--- /dev/null
+++ b/src/Octagonal_Shape.cc
@@ -0,0 +1,104 @@
+/* Octagonal_Shape class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Octagonal_Shape_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::Octagonal_Shape_Helper
+::extract_octagonal_difference(const Constraint& c,
+ const dimension_type c_space_dim,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff,
+ Coefficient& c_term) {
+ // Check for preconditions.
+ PPL_ASSERT(c.space_dimension() == c_space_dim);
+ PPL_ASSERT(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+
+ c_first_var = c.expression().first_nonzero(1, c_space_dim + 1);
+
+ if (c_first_var == c_space_dim + 1) {
+ c_term = c.inhomogeneous_term();
+ return true;
+ }
+
+ ++c_num_vars;
+ --c_first_var;
+
+ c_second_var = c.expression().first_nonzero(c_first_var + 2, c_space_dim + 1);
+
+ if (c_second_var == c_space_dim + 1) {
+ c_term = c.inhomogeneous_term();
+ const Coefficient& c0 = c.coefficient(Variable(c_first_var));
+ c_term *= 2;
+ c_first_var *= 2;
+ if (sgn(c0) < 0) {
+ c_second_var = c_first_var;
+ ++c_first_var;
+ }
+ else
+ c_second_var = c_first_var + 1;
+ c_coeff = c0;
+ return true;
+ }
+
+ ++c_num_vars;
+ --c_second_var;
+
+ if (!c.expression().all_zeroes(c_second_var + 2, c_space_dim + 1))
+ return false;
+
+ using std::swap;
+
+ // FIXME: The calling code expects c_first_var > c_second_var, when
+ // c_num_vars==2, but it shouldn't.
+ swap(c_first_var, c_second_var);
+
+ // Make sure that `c' is indeed an octagonal difference,
+ // i.e., it is of this form:
+ // (+/-) a*x (+/-) a*y <=/= b.
+ c_term = c.inhomogeneous_term();
+ const Coefficient& c0 = c.coefficient(Variable(c_first_var));
+ const Coefficient& c1 = c.coefficient(Variable(c_second_var));
+ if (c0 != c1 && c0 != -c1)
+ // Constraint `c' is not an octagonal difference.
+ return false;
+
+ c_first_var *= 2;
+ c_second_var *= 2;
+ if (sgn(c0) < 0)
+ ++c_first_var;
+ if (sgn(c1) > 0)
+ ++c_second_var;
+ c_coeff = c0;
+
+ return true;
+}
+
diff --git a/src/Octagonal_Shape_defs.hh b/src/Octagonal_Shape_defs.hh
new file mode 100644
index 0000000..6cff16b
--- /dev/null
+++ b/src/Octagonal_Shape_defs.hh
@@ -0,0 +1,2324 @@
+/* Octagonal_Shape class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_defs_hh
+#define PPL_Octagonal_Shape_defs_hh 1
+
+#include "Octagonal_Shape_types.hh"
+#include "globals_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "OR_Matrix_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Polyhedron_types.hh"
+#include "Box_types.hh"
+#include "Grid_types.hh"
+#include "BD_Shape_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Checked_Number_defs.hh"
+#include "WRD_coefficient_types_defs.hh"
+#include "Bit_Row_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+ Writes a textual representation of \p oct on \p s:
+ <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+ <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+ a system of constraints defining \p oct is written otherwise,
+ all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Octagonal_Shape */
+template <typename T>
+void swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
+
+ \relates Octagonal_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
+
+ \relates Octagonal_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class Octagonal_Shape_Helper {
+public:
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as an octagonal difference.
+ /*! \relates Octagonal_Shape
+ \return
+ <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_space_dim
+ The space dimension of the constraint \p c (it is <EM>assumed</EM>
+ to match the actual space dimension of \p c).
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0, 1 and 2.
+
+ \param c_first_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the first variable having
+ a non-zero coefficient in \p c.
+
+ \param c_second_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+ then it will be set to the index of the second variable having
+ a non-zero coefficient in \p c.
+
+ \param c_coeff
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the value of the first non-zero coefficient
+ in \p c.
+
+ \param c_term
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the right value of the inhomogeneous term
+ of \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_octagonal_difference(const Constraint& c,
+ dimension_type c_space_dim,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff,
+ Coefficient& c_term);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+//! An octagonal shape.
+/*! \ingroup PPL_CXX_interface
+ The class template Octagonal_Shape<T> allows for the efficient
+ representation of a restricted kind of <EM>topologically closed</EM>
+ convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+ The name comes from the fact that, in a vector space of dimension 2,
+ bounded OSs are polygons with at most eight sides.
+ The closed affine half-spaces that characterize the OS can be expressed
+ by constraints of the form
+ \f[
+ ax_i + bx_j \leq k
+ \f]
+ where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+ which are called <EM>octagonal constraints</EM>.
+
+ Based on the class template type parameter \p T, a family of extended
+ numbers is built and used to approximate the inhomogeneous term of
+ octagonal constraints. These extended numbers provide a representation
+ for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+ implementations for several arithmetic functions.
+ The value of the type parameter \p T may be one of the following:
+ - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+ - a bounded precision floating point type (e.g., \c float or \c double);
+ - an unbounded integer or rational type, as provided by GMP
+ (i.e., \c mpz_class or \c mpq_class).
+
+ The user interface for OSs is meant to be as similar as possible to
+ the one developed for the polyhedron class C_Polyhedron.
+
+ The OS domain <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - octagonal constraints;
+ - non-proper congruences (i.e., equalities) that are expressible
+ as octagonal constraints.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ A constraint is octagonal if it has the form
+ \f[
+ \pm a_i x_i \pm a_j x_j \relsym b
+ \f]
+ where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+ \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+ \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+ The user is warned that the above octagonal Constraint object
+ will be mapped into a \e correct and \e optimal approximation that,
+ depending on the expressive power of the chosen template argument \p T,
+ may loose some precision.
+ Also note that strict constraints are not octagonal.
+
+ For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+ approximated by:
+ - \f$x + y \leq 1\f$,
+ if \p T is a (bounded or unbounded) integer type;
+ - \f$x + y \leq \frac{1}{3}\f$,
+ if \p T is the unbounded rational type \c mpq_class;
+ - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+ if \p T is a floating point type (having no exact representation
+ for \f$\frac{1}{3}\f$).
+
+ On the other hand, depending from the context, a Constraint object
+ encoding \f$3x - y \leq 1\f$ will be either upward approximated
+ (e.g., by safely ignoring it) or it will cause an exception.
+
+ In the following examples it is assumed that the type argument \p T
+ is one of the possible instances listed above and that variables
+ \c x, \c y and \c z are defined (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ cs.insert(z >= 0);
+ cs.insert(z <= 3);
+ Octagonal_Shape<T> oct(cs);
+ \endcode
+ In contrast, the following code will raise an exception,
+ since constraints 7, 8, and 9 are not octagonal:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ cs.insert(z >= 0);
+ cs.insert(z <= 3);
+ cs.insert(x - 3*y <= 5); // (7)
+ cs.insert(x - y + z <= 5); // (8)
+ cs.insert(x + y + z <= 5); // (9)
+ Octagonal_Shape<T> oct(cs);
+ \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of
+ the inequalities defining an OS.
+ */
+#ifndef NDEBUG
+ typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+ typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+
+ //! The numeric base type upon which OSs are built.
+ typedef T coefficient_type_base;
+
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of the
+ inequalities defining an OS.
+ */
+ typedef N coefficient_type;
+
+ //! Returns the maximum space dimension that an OS can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns false indicating that this domain cannot recycle constraints
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns false indicating that this domain cannot recycle congruences
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds an universe or empty OS of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the OS;
+
+ \param kind
+ Specifies whether the universe or the empty OS has to be built.
+ */
+ explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Octagonal_Shape(const Octagonal_Shape& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename U>
+ explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS from the system of constraints \p cs.
+ /*!
+ The OS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of octagonal constraints.
+
+ \exception std::invalid_argument
+ Thrown if \p cs contains a constraint which is not optimally supported
+ by the Octagonal shape domain.
+ */
+ explicit Octagonal_Shape(const Constraint_System& cs);
+
+ //! Builds an OS from a system of congruences.
+ /*!
+ The OS inherits the space dimension of \p cgs
+
+ \param cgs
+ A system of congruences.
+
+ \exception std::invalid_argument
+ Thrown if \p cgs contains a congruence which is not optimally supported
+ by the Octagonal shape domain.
+ */
+ explicit Octagonal_Shape(const Congruence_System& cgs);
+
+ //! Builds an OS from the system of generators \p gs.
+ /*!
+ Builds the smallest OS containing the polyhedron defined by \p gs.
+ The OS inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit Octagonal_Shape(const Generator_System& gs);
+
+ //! Builds an OS from the polyhedron \p ph.
+ /*!
+ Builds an OS containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+ smallest one containing \p ph.
+ */
+ explicit Octagonal_Shape(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS out of a box.
+ /*!
+ The OS inherits the space dimension of the box.
+ The built OS is the most precise OS that includes the box.
+
+ \param box
+ The box representing the OS to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Octagonal_Shape(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS that approximates a grid.
+ /*!
+ The OS inherits the space dimension of the grid.
+ The built OS is the most precise OS that includes the grid.
+
+ \param grid
+ The grid used to build the OS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p grid exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Octagonal_Shape(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS from a BD shape.
+ /*!
+ The OS inherits the space dimension of the BD shape.
+ The built OS is the most precise OS that includes the BD shape.
+
+ \param bd
+ The BD shape used to build the OS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Octagonal_Shape(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ Octagonal_Shape& operator=(const Octagonal_Shape& y);
+
+ /*! \brief
+ Swaps \p *this with octagon \p y.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ void m_swap(Octagonal_Shape& y);
+
+ //! Destructor.
+ ~Octagonal_Shape();
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the Octagonal_Shape
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns the system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a minimal system of (equality) congruences
+ satisfied by \p *this with the same affine dimension as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Octagonal_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Octagonal_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Octagonal_Shape& y) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the congruence \p cg.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+ bool is_universe() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a bounded OS.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains (at least) an integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the OS domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the OS domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this.
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the OS domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the OS domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the OS domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the OS domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of octagonal
+ constraints defining \p *this.
+
+ \param c
+ The constraint. If it is not a octagonal constraint, it will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine the system of
+ octagonal constraints of \p *this.
+
+ \param cg
+ The congruence. If it is not a octagonal equality, it
+ will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine the system of
+ octagonal constraints defining \p *this.
+
+ \param cs
+ The constraint system to be used. Constraints that are not octagonal
+ are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine the system of
+ octagonal constraints defining \p *this.
+
+ \param cgs
+ The congruence system to be used. Congruences that are not octagonal
+ equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines the system of octagonal constraints defining \p *this using
+ the constraint expressed by \p left \f$\leq\f$ \p right.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Refines the system of octagonal constraints defining \p *this using
+ the constraint expressed by \p left \f$\relsym\f$ \p right, where
+ \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest OS that contains
+ the convex union of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ Implementation is based on Theorem 6.3 of \ref BHZ09b "[BHZ09b]".
+ */
+ bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+ /*! \brief
+ If the \e integer upper bound of \p *this and \p y is exact,
+ it is assigned to \p *this and <CODE>true</CODE> is returned;
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ This operator is only available when the class template parameter
+ \c T is bound to an integer data type.
+
+ \note
+ The integer upper bound of two rational OS is the smallest
+ rational OS containing all the integral points in the two arguments.
+ In general, the result is \e not an upper bound for the two input
+ arguments, as it may cut away non-integral portions of the two
+ rational shapes.
+
+ Implementation is based on Theorem 6.8 of \ref BHZ09b "[BHZ09b]".
+ */
+ bool integer_upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest octagon containing
+ the set difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref affine_relation "affine image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ template <typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the \ref affine_relation "affine preimage"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine transfer function"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine transfer function"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+/*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator that points to the first stop_point.
+
+ \param last
+ An iterator that points to the last stop_point.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename Iterator>
+ void CC76_extrapolation_assign(const Octagonal_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ //! Same as BHMZ05_widening_assign(y, tp).
+ void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened OS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if there is in \p cs a strict inequality.
+ */
+ void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Restores from \p y the constraints of \p *this, lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ An OS that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_narrowing_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened OS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old OS into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new OS,
+ which is characterized by a system of constraints in which the variables
+ running through the new dimensions are not constrained.
+ For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the OS
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cO
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the OS
+ and does not embed it in the new space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes
+ in the new OS, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are all constrained to be equal to 0.
+ For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the OS
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cO
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Octagonal_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //! Applies to \p dest the interval constraints embedded in \p *this.
+ /*!
+ \param dest
+ The object to which the constraints will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest.
+
+ The template type parameter U must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the space dimension of the object.
+ \code
+ void set_empty()
+ \endcode
+ sets the object to an empty object.
+ \code
+ bool restrict_lower(dimension_type dim, const T& lb)
+ \endcode
+ restricts the object by applying the lower bound \p lb to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ \code
+ bool restrict_upper(dimension_type dim, const T& ub)
+ \endcode
+ restricts the object by applying the upper bound \p ub to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ */
+ template <typename U>
+ void export_interval_constraints(U& dest) const;
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename Interval_Info>
+ void refine_fp_interval_abstract_store(
+ Box< Interval<T, Interval_Info> >& store) const;
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ friend bool
+ operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! The matrix that represents the octagonal shape.
+ OR_Matrix<N> matrix;
+
+ //! Dimension of the space of the octagonal shape.
+ dimension_type space_dim;
+
+ // Please, do not move the following include directive:
+ // `Og_Status_idefs.hh' must be included exactly at this point.
+ // And please do not remove the space separating `#' from `include':
+ // this ensures that the directive will not be moved during the
+ // procedure that automatically creates the library's include file
+ // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+#include "Og_Status_idefs.hh"
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+ bool marked_zero_dim_univ() const;
+
+ //! Returns <CODE>true</CODE> if the OS is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \c this->matrix is known to be
+ strongly closed.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \c this->matrix is not strongly closed.
+ */
+ bool marked_strongly_closed() const;
+
+ //! Turns \p *this into a zero-dimensional universe OS.
+ void set_zero_dim_univ();
+
+ //! Turns \p *this into an empty OS.
+ void set_empty();
+
+ //! Marks \p *this as strongly closed.
+ void set_strongly_closed();
+
+ //! Marks \p *this as possibly not strongly closed.
+ void reset_strongly_closed();
+
+ N& matrix_at(dimension_type i, dimension_type j);
+ const N& matrix_at(dimension_type i, dimension_type j) const;
+
+ /*! \brief
+ Returns an upper bound for \p lf according to the constraints
+ embedded in \p *this.
+
+ \p lf must be a linear form on intervals with floating point coefficients.
+ If all coefficients in \p lf are bounded, then \p result will become a
+ correct overapproximation of the value of \p lf when variables in
+ \p lf satisfy the constraints expressed by \p *this. Otherwise the
+ behavior of the method is undefined.
+ */
+ template <typename Interval_Info>
+ void linear_form_upper_bound(
+ const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const;
+
+ // FIXME: this function is currently not used. Consider removing it.
+ static void interval_coefficient_upper_bound(const N& var_ub,
+ const N& minus_var_ub,
+ const N& int_ub, const N& int_lb,
+ N& result);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added. Non-octagonal constraints are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+ Non-octagonal equalities are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+ void add_octagonal_constraint(dimension_type i,
+ dimension_type j,
+ const N& k);
+
+ //! Adds the constraint <CODE>matrix[i][j] <= numer/denom</CODE>.
+ void add_octagonal_constraint(dimension_type i,
+ dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ Adds to the Octagonal_Shape the constraint
+ \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+ Note that the coefficient of \p var in \p expr is null.
+ */
+ void refine(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ //! Removes all the constraints on variable \p v_id.
+ void forget_all_octagonal_constraints(dimension_type v_id);
+
+ //! Removes all binary constraints on variable \p v_id.
+ void forget_binary_octagonal_constraints(dimension_type v_id);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each variable index \c u_id (less than or equal to \p last_id
+ and different from \p v_id), deduce constraints of the form
+ <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+ starting from \p ub_v, which is an upper bound for \c v
+ computed according to \p sc_expr and \p sc_denom.
+
+ Strong-closure will be able to deduce the constraints
+ <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+ We can be more precise if variable \c u played an active role in the
+ computation of the upper bound for \c v.
+
+ Namely, if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+ is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+
+ Conversely, if \c q is less than zero, we can improve the bound for
+ <CODE>v + u</CODE>. In particular:
+ - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+ - if <CODE>-1 \< q \< 0</CODE>, then
+ <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+ */
+ void deduce_v_pm_u_bounds(dimension_type v_id,
+ dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each variable index \c u_id (less than or equal to \p last_id
+ and different from \p v_id), deduce constraints of the form
+ <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+ starting from \p minus_lb_v, which is the negation of a lower bound
+ for \c v computed according to \p sc_expr and \p sc_denom.
+
+ Strong-closure will be able to deduce the constraints
+ <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+ <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+ We can be more precise if variable \c u played an active role in the
+ computation of (the negation of) the lower bound for \c v.
+
+ Namely, if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+ is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+ Conversely, if \c q is less than zero, we can improve the bound for
+ <CODE>-v - u</CODE>. In particular:
+ - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+ - if <CODE>-1 \< q \< 0</CODE>, then
+ <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
+ */
+ void deduce_minus_v_pm_u_bounds(dimension_type v_id,
+ dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v);
+
+ /*! \brief
+ Adds to \p limiting_octagon the octagonal differences in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_octagon(const Constraint_System& cs,
+ Octagonal_Shape& limiting_octagon) const;
+ //! Compute the (zero-equivalence classes) successor relation.
+ /*!
+ It is assumed that the octagon is not empty and strongly closed.
+ */
+ void compute_successors(std::vector<dimension_type>& successor) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the OS is not empty and strongly closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& successor,
+ std::vector<dimension_type>& no_sing_leaders,
+ bool& exist_sing_class,
+ dimension_type& sing_leader) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the OS is not empty and strongly closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+ /*! \brief
+ Stores into \p non_redundant information about the matrix entries
+ that are non-redundant (i.e., they will occur in the strongly
+ reduced matrix).
+
+ It is assumed that the OS is not empty and strongly closed;
+ moreover, argument \p non_redundant is assumed to be empty.
+ */
+ void non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const;
+
+ //! Removes the redundant constraints from \c this->matrix.
+ void strong_reduction_assign() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \c this->matrix
+ is strongly reduced.
+ */
+ bool is_strongly_reduced() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if in the octagon taken two at a time
+ unary constraints, there is also the constraint that represent their sum.
+ */
+ bool is_strong_coherent() const;
+
+ bool tight_coherence_would_make_empty() const;
+
+ //! Assigns to \c this->matrix its strong closure.
+ /*!
+ Strong closure is a necessary condition for the precision and/or
+ the correctness of many methods. It explicitly records into \c matrix
+ those constraints that are implicitly obtainable by the other ones,
+ therefore obtaining a canonical representation for the OS.
+ */
+ void strong_closure_assign() const;
+
+ //! Applies the strong-coherence step to \c this->matrix.
+ void strong_coherence_assign();
+
+ //! Assigns to \c this->matrix its tight closure.
+ /*!
+ \note
+ This is \e not marked as a <code>const</code> method,
+ as it may modify the rational-valued geometric shape by cutting away
+ non-integral points. The method is only available if the template
+ parameter \c T is bound to an integer data type.
+ */
+ void tight_closure_assign();
+
+ /*! \brief
+ Incrementally computes strong closure, assuming that only
+ constraints affecting variable \p var need to be considered.
+
+ \note
+ It is assumed that \c *this, which was strongly closed, has only been
+ modified by adding constraints affecting variable \p var. If this
+ assumption is not satisfied, i.e., if a non-redundant constraint not
+ affecting variable \p var has been added, the behavior is undefined.
+ Worst-case complexity is \f$O(n^2)\f$.
+ */
+ void incremental_strong_closure_assign(Variable var) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+ \p included are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ void drop_some_non_integer_points_helper(N& elem);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const Octagonal_Shape& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+#include "Og_Status_inlines.hh"
+#include "Octagonal_Shape_inlines.hh"
+#include "Octagonal_Shape_templates.hh"
+
+#endif // !defined(PPL_Octagonal_Shape_defs_hh)
diff --git a/src/Octagonal_Shape_inlines.hh b/src/Octagonal_Shape_inlines.hh
new file mode 100644
index 0000000..361b56b
--- /dev/null
+++ b/src/Octagonal_Shape_inlines.hh
@@ -0,0 +1,892 @@
+/* Octagonal_Shape class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_inlines_hh
+#define PPL_Octagonal_Shape_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "BD_Shape_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+coherent_index(const dimension_type i) {
+ return (i % 2 != 0) ? (i-1) : (i+1);
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+ return OR_Matrix<N>::max_num_rows()/2;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+ return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+ return status.test_strongly_closed();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+ status.set_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+ status.set_strongly_closed();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+ status.reset_strongly_closed();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : matrix(num_dimensions), space_dim(num_dimensions), status() {
+ if (kind == EMPTY)
+ set_empty();
+ else if (num_dimensions > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+ : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+ Complexity_Class)
+ // For maximum precision, enforce shortest-path closure
+ // before copying the DB matrix.
+ : matrix((y.strong_closure_assign(), y.matrix)),
+ space_dim(y.space_dim),
+ status() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.marked_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+ : matrix(cs.space_dimension()),
+ space_dim(cs.space_dimension()),
+ status() {
+ if (cs.space_dimension() > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ add_constraints(cs);
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+ : matrix(cgs.space_dimension()),
+ space_dim(cgs.space_dimension()),
+ status() {
+ if (cgs.space_dimension() > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ add_congruences(cgs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+ Complexity_Class)
+ : matrix(box.space_dimension()),
+ space_dim(box.space_dimension()),
+ status() {
+ // Check for emptiness for maximum precision.
+ if (box.is_empty())
+ set_empty();
+ else if (box.space_dimension() > 0) {
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ refine_with_constraints(box.constraints());
+ }
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+ Complexity_Class)
+ : matrix(grid.space_dimension()),
+ space_dim(grid.space_dimension()),
+ status() {
+ if (grid.space_dimension() > 0)
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ // Taking minimized congruences ensures maximum precision.
+ refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+ Complexity_Class)
+ : matrix(bd.space_dimension()),
+ space_dim(bd.space_dimension()),
+ status() {
+ // Check for emptiness for maximum precision.
+ if (bd.is_empty())
+ set_empty();
+ else if (bd.space_dimension() > 0) {
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ refine_with_constraints(bd.constraints());
+ }
+}
+
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+ return minimized_congruences();
+}
+
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+ matrix = y.matrix;
+ space_dim = y.space_dim;
+ status = y.status;
+ return *this;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::m_swap(Octagonal_Shape& y) {
+ using std::swap;
+ swap(matrix, y.matrix);
+ swap(space_dim, y.space_dim);
+ swap(status, y.status);
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+ strong_closure_assign();
+ return marked_empty();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+ return true;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+ if (x.space_dim != y.space_dim)
+ // Dimension-incompatible OSs are different.
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty())
+ return y.marked_empty();
+ else
+ return !y.marked_empty();
+ }
+
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+ // If one of two octagons is empty, then they are equal if and only if
+ // the other octagon is empty too.
+ if (x.marked_empty())
+ return y.marked_empty();
+ if (y.marked_empty())
+ return false;
+ // Strong closure is a canonical form.
+ return x.matrix == y.matrix;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+ const dimension_type j) const {
+ PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+ using namespace Implementation::Octagonal_Shapes;
+ return (j < matrix.row_size(i))
+ ? matrix[i][j]
+ : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+ const dimension_type j) {
+ PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+ using namespace Implementation::Octagonal_Shapes;
+ return (j < matrix.row_size(i))
+ ? matrix[i][j]
+ : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+ strong_reduction_assign();
+ return constraints();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+ const dimension_type j,
+ const N& k) {
+ // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+ PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+ typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+ PPL_ASSERT(j < m_i.row_size());
+#endif
+ N& r_i_j = matrix[i][j];
+ if (r_i_j > k) {
+ r_i_j = k;
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ }
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+#ifndef NDEBUG
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+ typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+ PPL_ASSERT(j < m_i.row_size());
+ PPL_ASSERT(denom != 0);
+#endif
+ PPL_DIRTY_TEMP(N, k);
+ div_round_up(k, numer, denom);
+ add_octagonal_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ i_end = cs.end(); i != i_end; ++i)
+ add_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+ // Dimension-compatibility check.
+ if (c.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_constraints(cs)",
+ "cs and *this are space-dimension incompatible");
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ if (!marked_empty())
+ refine_no_check(cg);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_congruences(cgs)",
+ "cgs and *this are space-dimension incompatible");
+
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent())
+ set_empty();
+ // Other proper congruences are just ignored.
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check.
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+ new_dimension);
+ // The removal of no dimensions from any octagon is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from an octagon in a 0-dim space.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ strong_closure_assign();
+ matrix.shrink(new_dimension);
+ // When we remove all dimensions from a non-empty octagon,
+ // we obtain the zero-dimensional universe octagon.
+ if (new_dimension == 0 && !marked_empty())
+ set_zero_dim_univ();
+ space_dim = new_dimension;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "Octagonal_Shape");
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+ BHMZ05_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+ unsigned* tp) {
+ static N stop_points[] = {
+ N(-2, ROUND_UP),
+ N(-1, ROUND_UP),
+ N( 0, ROUND_UP),
+ N( 1, ROUND_UP),
+ N( 2, ROUND_UP)
+ };
+ CC76_extrapolation_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]),
+ tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("time_elapse_assign(y)", y);
+ // Compute time-elapse on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.time_elapse_assign(ph_y);
+ Octagonal_Shape<T> x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+ const Octagonal_Shape<T>& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right);
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case LESS_THAN:
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right);
+ break;
+ case GREATER_THAN:
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::
+refine_fp_interval_abstract_store(
+ Box< Interval<T, Interval_Info> >& store) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+ if (!is_integer(elem)) {
+#ifndef NDEBUG
+ Result r =
+#endif
+ floor_assign_r(elem, elem, ROUND_DOWN);
+ PPL_ASSERT(r == V_EQ);
+ reset_strongly_closed();
+ }
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline void
+swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Octagonal_Shape_inlines_hh)
diff --git a/src/Octagonal_Shape_templates.hh b/src/Octagonal_Shape_templates.hh
new file mode 100644
index 0000000..f4e5ae9
--- /dev/null
+++ b/src/Octagonal_Shape_templates.hh
@@ -0,0 +1,8115 @@
+/* Octagonal_Shape class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_templates_hh
+#define PPL_Octagonal_Shape_templates_hh 1
+
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "meta_programming.hh"
+#include "assert.hh"
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+ const Complexity_Class complexity)
+ : matrix(0), space_dim(0), status() {
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = Octagonal_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ return;
+ }
+
+ // Build from generators when we do not care about complexity
+ // or when the process has polynomial complexity.
+ if (complexity == ANY_COMPLEXITY
+ || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+ *this = Octagonal_Shape(ph.generators());
+ return;
+ }
+
+ // We cannot afford exponential complexity, we do not have a complete set
+ // of generators for the polyhedron, and the polyhedron is not trivially
+ // empty or zero-dimensional. Constraints, however, are up to date.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+ // If the constraint system of the polyhedron is minimized,
+ // the test `is_universe()' has polynomial complexity.
+ if (ph.is_universe()) {
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ return;
+ }
+ }
+
+ // See if there is at least one inconsistent constraint in `ph.con_sys'.
+ for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+ cs_end = ph.con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ *this = Octagonal_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ // If `complexity' allows it, use simplex to derive the exact (modulo
+ // the fact that our OSs are topologically closed) variable bounds.
+ if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(num_dimensions);
+ lp.set_optimization_mode(MAXIMIZATION);
+
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Start with a universe OS that will be refined by the simplex.
+ *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+ // Get all the upper bounds.
+ Generator g(point());
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 0; i < num_dimensions; ++i) {
+ Variable x(i);
+ // Evaluate optimal upper bound for `x <= ub'.
+ lp.set_objective_function(x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ numer *= 2;
+ div_round_up(matrix[2*i + 1][2*i], numer, denom);
+ }
+ // Evaluate optimal upper bounds for `x + y <= ub'.
+ for (dimension_type j = 0; j < i; ++j) {
+ Variable y(j);
+ lp.set_objective_function(x + y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(matrix[2*i + 1][2*j], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `x - y <= ub'.
+ for (dimension_type j = 0; j < num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(((i < j) ?
+ matrix[2*j][2*i]
+ : matrix[2*i + 1][2*j + 1]),
+ numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `y - x <= ub'.
+ for (dimension_type j = 0; j < num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(((i < j)
+ ? matrix[2*j][2*i]
+ : matrix[2*i + 1][2*j + 1]),
+ numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x - y <= ub'.
+ for (dimension_type j = 0; j < i; ++j) {
+ Variable y(j);
+ lp.set_objective_function(-x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(matrix[2*i][2*j + 1], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ numer *= 2;
+ div_round_up(matrix[2*i][2*i + 1], numer, denom);
+ }
+ }
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+ : matrix(gs.space_dimension()),
+ space_dim(gs.space_dimension()),
+ status() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty polyhedron.
+ set_empty();
+ return;
+ }
+
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
+
+ PPL_DIRTY_TEMP(N, tmp);
+ bool mat_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+ const Generator& g = *k;
+ switch (g.type()) {
+ case Generator::POINT:
+ point_seen = true;
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ if (!mat_initialized) {
+ // When handling the first (closure) point, we initialize the matrix.
+ mat_initialized = true;
+ const Coefficient& d = g.divisor();
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any point the hyperplanes passing in the point
+ // and having the octagonal gradient.
+ // Let be P = [P_1, P_2, ..., P_n] point.
+ // Hyperplanes: X_i - X_j = P_i - P_j.
+ div_round_up(x_i[dj], g_j - g_i, d);
+ div_round_up(x_ii[dj + 1], g_i - g_j, d);
+ // Hyperplanes: X_i + X_j = P_i + P_j.
+ div_round_up(x_i[dj + 1], -g_j - g_i, d);
+ div_round_up(x_ii[dj], g_i + g_j, d);
+ }
+ // Hyperplanes: X_i = P_i.
+ div_round_up(x_i[di + 1], -g_i - g_i, d);
+ div_round_up(x_ii[di], g_i + g_i, d);
+ }
+ }
+ else {
+ // This is not the first point: the matrix already contains
+ // valid values and we must compute maxima.
+ const Coefficient& d = g.divisor();
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any point the straight lines passing in the point
+ // and having the octagonal gradient; compute maxima values.
+ // Let be P = [P_1, P_2, ..., P_n] point.
+ // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+ div_round_up(tmp, g_j - g_i, d);
+ max_assign(x_i[dj], tmp);
+ div_round_up(tmp, g_i - g_j, d);
+ max_assign(x_ii[dj + 1], tmp);
+ // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+ div_round_up(tmp, -g_j - g_i, d);
+ max_assign(x_i[dj + 1], tmp);
+ div_round_up(tmp, g_i + g_j, d);
+ max_assign(x_ii[dj], tmp);
+ }
+ // Hyperplane: X_i = max (P_i, const).
+ div_round_up(tmp, -g_i - g_i, d);
+ max_assign(x_i[di + 1], tmp);
+ div_round_up(tmp, g_i + g_i, d);
+ max_assign(x_ii[di], tmp);
+ }
+ }
+ break;
+ default:
+ // Lines and rays temporarily ignored.
+ break;
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw_invalid_argument("Octagonal_Shape(gs)",
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+ const Generator& g = *k;
+ switch (g.type()) {
+ case Generator::LINE:
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any line the right limit.
+ if (g_i != g_j) {
+ // Hyperplane: X_i - X_j <=/>= +Inf.
+ assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ if (g_i != -g_j) {
+ // Hyperplane: X_i + X_j <=/>= +Inf.
+ assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ if (g_i != 0) {
+ // Hyperplane: X_i <=/>= +Inf.
+ assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ break;
+ case Generator::RAY:
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any ray the right limit in the case
+ // of the binary constraints.
+ if (g_i < g_j)
+ // Hyperplane: X_i - X_j >= +Inf.
+ assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > g_j)
+ // Hyperplane: X_i - X_j <= +Inf.
+ assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i < -g_j)
+ // Hyperplane: X_i + X_j >= +Inf.
+ assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > -g_j)
+ // Hyperplane: X_i + X_j <= +Inf.
+ assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ // Case: unary constraints.
+ if (g_i < 0)
+ // Hyperplane: X_i = +Inf.
+ assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > 0)
+ // Hyperplane: X_i = +Inf.
+ assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ // Get rid of strict inequalities.
+ if (c.is_strict_inequality()) {
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (c.is_tautological())
+ return;
+ // Nontrivial strict inequalities are not allowed.
+ throw_invalid_argument("add_constraint(c)",
+ "strict inequalities are not allowed");
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ // Constraints that are not octagonal differences are not allowed.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, term))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not an octagonal constraint");
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (not a strict inequality).
+ if (c.inhomogeneous_term() < 0
+ || (c.is_equality() && c.inhomogeneous_term() != 0))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of constraint.
+ typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+ N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ bool is_oct_changed = false;
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, term, coeff);
+ if (m_i_j > d) {
+ m_i_j = d;
+ is_oct_changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Select the cell to be modified for the ">=" part of constraint.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+
+ typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& m_ci_cj = m_ci[cj];
+ // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci_cj > d) {
+ m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+
+ // This method does not preserve closure.
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check:
+ // the dimension of `cg' can not be greater than space_dim.
+ if (space_dimension() < cg_space_dim)
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ // Handle the case of proper congruences first.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_tautological())
+ return;
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Non-trivial and proper congruences are not allowed.
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a non-trivial, proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ add_constraint(c);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+ " T not a floating point type.");
+
+ // We assume that the analyzer will not try to apply an unreachable filter.
+ PPL_ASSERT(!marked_empty());
+
+ // Dimension-compatibility checks.
+ // The dimensions of `left' and `right' should not be greater than the
+ // dimension of `*this'.
+ const dimension_type left_space_dim = left.space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "left", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "right", right);
+
+ // Number of non-zero coefficients in `left': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type left_t = 0;
+ // Variable-index of the last non-zero coefficient in `left', if any.
+ dimension_type left_w_id = 0;
+ // Number of non-zero coefficients in `right': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type right_t = 0;
+ // Variable-index of the last non-zero coefficient in `right', if any.
+ dimension_type right_w_id = 0;
+
+ // Get information about the number of non-zero coefficients in `left'.
+ for (dimension_type i = left_space_dim; i-- > 0; )
+ if (left.coefficient(Variable(i)) != 0) {
+ if (left_t++ == 1)
+ break;
+ else
+ left_w_id = i;
+ }
+
+ // Get information about the number of non-zero coefficients in `right'.
+ for (dimension_type i = right_space_dim; i-- > 0; )
+ if (right.coefficient(Variable(i)) != 0) {
+ if (right_t++ == 1)
+ break;
+ else
+ right_w_id = i;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ // FIXME: there is plenty of duplicate code in the following lines. We could
+ // shorten it at the expense of a bit of efficiency.
+
+ if (left_t == 0) {
+ if (right_t == 0) {
+ // The constraint involves constants only. Ignore it: it is up to
+ // the analyzer to handle it.
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (right_t == 1) {
+ // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+ // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ if (right_w_coeff == 1) {
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_right, n_right + 1, b_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (right_w_coeff == -1) {
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_right + 1, n_right, b_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+ else if (left_t == 1) {
+ if (right_t == 0) {
+ // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+ // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ if (left_w_coeff == 1) {
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (left_w_coeff == -1) {
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ if (right_t == 1) {
+ // The constraint has the form
+ // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+ // Reduce it to the constraint +/-x +/-y <= c+ - a-
+ // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ bool is_left_coeff_one = (left_w_coeff == 1);
+ bool is_left_coeff_minus_one = (left_w_coeff == -1);
+ bool is_right_coeff_one = (right_w_coeff == 1);
+ bool is_right_coeff_minus_one = (right_w_coeff == -1);
+ if (left_w_id == right_w_id) {
+ if ((is_left_coeff_one && is_right_coeff_one)
+ || (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+ // Here we have an identity or a constants-only constraint.
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // We fall back to a previous case
+ // (but we do not need to multiply the result by two).
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // We fall back to a previous case
+ // (but we do not need to multiply the result by two).
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ else if (is_left_coeff_one && is_right_coeff_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right, n_left, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left + 1, n_right + 1,
+ c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right + 1, n_left, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left + 1, n_right, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right, n_left + 1, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left, n_right + 1, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right + 1, n_left + 1,
+ c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left, n_right, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+
+ // FIRST, update the binary constraints for each pair of DIFFERENT variables
+ // in `left' and `right'.
+
+ // Declare temporaries outside of the loop.
+ PPL_DIRTY_TEMP(N, low_coeff);
+ PPL_DIRTY_TEMP(N, high_coeff);
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ Linear_Form<FP_Interval_Type> right_minus_left(right);
+ right_minus_left -= left;
+
+ dimension_type max_w_id = std::max(left_w_id, right_w_id);
+ for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+ for (dimension_type second_v = first_v + 1;
+ second_v <= max_w_id; ++second_v) {
+ const FP_Interval_Type& lfv_coefficient =
+ left.coefficient(Variable(first_v));
+ const FP_Interval_Type& lsv_coefficient =
+ left.coefficient(Variable(second_v));
+ const FP_Interval_Type& rfv_coefficient =
+ right.coefficient(Variable(first_v));
+ const FP_Interval_Type& rsv_coefficient =
+ right.coefficient(Variable(second_v));
+ // We update the constraints only when both variables appear in at
+ // least one argument.
+ bool do_update = false;
+ assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ else {
+ assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ }
+
+ if (do_update) {
+ Variable first(first_v);
+ Variable second(second_v);
+ dimension_type n_first_var = first_v * 2;
+ dimension_type n_second_var = second_v * 2;
+ linear_form_upper_bound(right_minus_left - first + second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var + 1, n_first_var + 1,
+ upper_bound);
+ linear_form_upper_bound(right_minus_left + first + second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var + 1, n_first_var, upper_bound);
+ linear_form_upper_bound(right_minus_left - first - second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var, n_first_var + 1, upper_bound);
+ linear_form_upper_bound(right_minus_left + first - second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var, n_first_var, upper_bound);
+ }
+ }
+ }
+
+ // Finally, update the unary constraints.
+ for (dimension_type v = 0; v <= max_w_id; ++v) {
+ const FP_Interval_Type& lv_coefficient =
+ left.coefficient(Variable(v));
+ const FP_Interval_Type& rv_coefficient =
+ right.coefficient(Variable(v));
+ // We update the constraints only if v appears in at least one of the
+ // two arguments.
+ bool do_update = false;
+ assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+
+ if (do_update) {
+ Variable var(v);
+ dimension_type n_var = 2 * v;
+ /*
+ VERY DIRTY trick: since we need to keep the old unary constraints
+ while computing the new ones, we momentarily keep the new coefficients
+ in the main diagonal of the matrix. They will be moved later.
+ */
+ linear_form_upper_bound(right_minus_left + var, upper_bound);
+ mul_2exp_assign_r(matrix[n_var + 1][n_var + 1], upper_bound, 1,
+ ROUND_UP);
+ linear_form_upper_bound(right_minus_left - var, upper_bound);
+ mul_2exp_assign_r(matrix[n_var][n_var], upper_bound, 1,
+ ROUND_UP);
+ }
+ }
+
+ /*
+ Now move the newly computed coefficients from the main diagonal to
+ their proper place, and restore +infinity on the diagonal.
+ */
+ row_iterator m_ite = matrix.row_begin();
+ row_iterator m_end = matrix.row_end();
+ for (dimension_type i = 0; m_ite != m_end; i += 2) {
+ row_reference upper = *m_ite;
+ N& ul = upper[i];
+ add_octagonal_constraint(i, i + 1, ul);
+ assign_r(ul, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ ++m_ite;
+ row_reference lower = *m_ite;
+ N& lr = lower[i + 1];
+ add_octagonal_constraint(i + 1, i, lr);
+ assign_r(lr, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ ++m_ite;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ const dimension_type c_space_dim = c.space_dimension();
+ PPL_ASSERT(c_space_dim <= space_dim);
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ // Constraints that are not octagonal differences are ignored.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, term))
+ return;
+
+ if (num_vars == 0) {
+ const Coefficient& c_inhomo = c.inhomogeneous_term();
+ // Dealing with a trivial constraint (maybe a strict inequality).
+ if (c_inhomo < 0
+ || (c_inhomo != 0 && c.is_equality())
+ || (c_inhomo == 0 && c.is_strict_inequality()))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of constraint.
+ typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+ N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ bool is_oct_changed = false;
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, term, coeff);
+ if (m_i_j > d) {
+ m_i_j = d;
+ is_oct_changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Select the cell to be modified for the ">=" part of constraint.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+
+ typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& m_ci_cj = m_ci[cj];
+ // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci_cj > d) {
+ m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+
+ // This method does not preserve closure.
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+ const dimension_type n_rows = matrix.num_rows();
+ // A zero-space-dim shape always has affine dimension zero.
+ if (n_rows == 0)
+ return 0;
+
+ // Strong closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ strong_closure_assign();
+ if (marked_empty())
+ return 0;
+
+ // The vector `leaders' is used to represent non-singular
+ // equivalence classes:
+ // `leaders[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ // Due to the splitting of variables, the affine dimension is the
+ // number of non-singular positive zero-equivalence classes.
+ dimension_type affine_dim = 0;
+ for (dimension_type i = 0; i < n_rows; i += 2)
+ // Note: disregard the singular equivalence class.
+ if (leaders[i] == i && leaders[i + 1] == i + 1)
+ ++affine_dim;
+
+ return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+ // Strong closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ strong_closure_assign();
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ if (marked_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ // The vector `leaders' is used to represent equivalence classes:
+ // `leaders[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+ const dimension_type lead_i = leaders[i];
+ if (i == lead_i) {
+ if (leaders[i + 1] == i)
+ // `i' is the leader of the singular equivalence class.
+ goto singular;
+ else
+ // `i' is the leader of a non-singular equivalence class.
+ continue;
+ }
+ else {
+ // `i' is not a leader.
+ if (leaders[i + 1] == lead_i)
+ // `i' belongs to the singular equivalence class.
+ goto singular;
+ else
+ // `i' does not belong to the singular equivalence class.
+ goto non_singular;
+ }
+
+ singular:
+ // `i' belongs to the singular equivalence class:
+ // we have a unary equality constraint.
+ {
+ const Variable x(i/2);
+ const N& c_ii_i = matrix[i + 1][i];
+#ifndef NDEBUG
+ const N& c_i_ii = matrix[i][i + 1];
+ PPL_ASSERT(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+ numer_denom(c_ii_i, numer, denom);
+ denom *= 2;
+ cgs.insert(denom*x == numer);
+ }
+ continue;
+
+ non_singular:
+ // `i' does not belong to the singular equivalence class.
+ // we have a binary equality constraint.
+ {
+ const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+ using namespace Implementation::Octagonal_Shapes;
+ const N& c_ii_lii = matrix[i + 1][coherent_index(lead_i)];
+ PPL_ASSERT(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+ const Variable x(lead_i/2);
+ const Variable y(i/2);
+ numer_denom(c_i_li, numer, denom);
+ if (lead_i % 2 == 0)
+ cgs.insert(denom*x - denom*y == numer);
+ else
+ cgs.insert(denom*x + denom*y + numer == 0);
+ }
+ continue;
+ }
+ return cgs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+ // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+ // If `y' is an universal 0-dim space octagon, we simply return.
+ if (y.space_dim == 0) {
+ if (y.marked_empty())
+ set_empty();
+ return;
+ }
+
+ // If `*this' is an empty 0-dim space octagon, then it is sufficient
+ // to adjust the dimension of the vector space.
+ if (space_dim == 0 && marked_empty()) {
+ add_space_dimensions_and_embed(y.space_dim);
+ return;
+ }
+
+ // This is the old number of rows in the matrix. It is equal to
+ // the first index of columns to change.
+ dimension_type old_num_rows = matrix.num_rows();
+ // First we increase the space dimension of `*this' by adding
+ // `y.space_dimension()' new dimensions.
+ // The matrix for the new octagon is obtained
+ // by leaving the old system of constraints in the upper left-hand side
+ // (where they are at the present) and placing the constraints of `y' in the
+ // lower right-hand side.
+ add_space_dimensions_and_embed(y.space_dim);
+ typename OR_Matrix<N>::const_element_iterator
+ y_it = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::row_iterator
+ i = matrix.row_begin() + old_num_rows,
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::row_reference_type r = *i;
+ dimension_type rs_i = i.row_size();
+ for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+ r[j] = *y_it;
+ }
+
+ // The concatenation does not preserve the closure.
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("contains(y)", y);
+
+ if (space_dim == 0) {
+ // The zero-dimensional empty octagon only contains another
+ // zero-dimensional empty octagon.
+ // The zero-dimensional universe octagon contains any other
+ // zero-dimensional octagon.
+ return marked_empty() ? y.marked_empty() : true;
+ }
+
+ // `y' needs to be transitively closed.
+ y.strong_closure_assign();
+ // An empty octagon is in any other dimension-compatible octagons.
+ if (y.marked_empty())
+ return true;
+
+ // If `*this' is empty it can not contain `y' (which is not empty).
+ if (is_empty())
+ return false;
+
+ // `*this' contains `y' if and only if every element of `*this'
+ // is greater than or equal to the correspondent one of `y'.
+ for (typename OR_Matrix<N>::const_element_iterator
+ i = matrix.element_begin(), j = y.matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end; ++i, ++j)
+ if (*i < *j)
+ return false;
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+ strong_closure_assign();
+ if (marked_empty())
+ return true;
+ y.strong_closure_assign();
+ if (y.marked_empty())
+ return true;
+
+ // Two Octagonal_Shapes are disjoint if and only if their
+ // intersection is empty, i.e., if and only if there exists a
+ // variable such that the upper bound of the constraint on that
+ // variable in the first Octagonal_Shape is strictly less than the
+ // lower bound of the corresponding constraint in the second
+ // Octagonal_Shape or vice versa.
+
+ const dimension_type n_rows = matrix.num_rows();
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ const row_iterator y_begin = y.matrix.row_begin();
+
+ PPL_DIRTY_TEMP(N, neg_y_ci_cj);
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference m_i = *i_iter;
+ for (dimension_type j = 0; j < n_rows; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_reference m_cj = *(m_begin + cj);
+ const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+ row_reference y_ci = *(y_begin + ci);
+ row_reference y_j = *(y_begin + j);
+ const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+ neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+ if (m_i_j < neg_y_ci_cj)
+ return true;
+ }
+ }
+ return false;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+ // An empty octagon is not universe.
+ if (marked_empty())
+ return false;
+
+ // If the octagon is non-empty and zero-dimensional,
+ // then it is necessarily the universe octagon.
+ if (space_dim == 0)
+ return true;
+
+ // An universe octagon can only contains trivial constraints.
+ for (typename OR_Matrix<N>::const_element_iterator
+ i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i)
+ if (!is_plus_infinity(*i))
+ return false;
+
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+ strong_closure_assign();
+ // A zero-dimensional or empty octagon is bounded.
+ if (marked_empty() || space_dim == 0)
+ return true;
+
+ // A bounded octagon never can contains trivial constraints.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+ const dimension_type i_index = i.index();
+ for (dimension_type j = i.row_size(); j-- > 0; )
+ if (i_index != j)
+ if (is_plus_infinity(x_i[j]))
+ return false;
+ }
+
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+ // Force strong closure.
+ if (is_empty())
+ return false;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return true;
+
+ // A strongly closed and consistent Octagonal_Shape defined by
+ // integer constraints can only be empty due to tight coherence.
+ if (std::numeric_limits<T>::is_integer)
+ return !tight_coherence_would_make_empty();
+
+ // Build an integer Octagonal_Shape oct_z with bounds at least as
+ // tight as those in *this and then recheck for emptiness, also
+ // exploiting tight-coherence.
+ Octagonal_Shape<mpz_class> oct_z(space_dim);
+ oct_z.reset_strongly_closed();
+
+ typedef Octagonal_Shape<mpz_class>::N Z;
+ bool all_integers = true;
+ typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+ for (typename OR_Matrix<Z>::element_iterator
+ z_i = oct_z.matrix.element_begin(),
+ z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+ const N& d = *x_i;
+ if (is_plus_infinity(d))
+ continue;
+ if (is_integer(d))
+ assign_r(*z_i, d, ROUND_NOT_NEEDED);
+ else {
+ all_integers = false;
+ assign_r(*z_i, d, ROUND_DOWN);
+ }
+ }
+ // Restore strong closure.
+ if (all_integers)
+ // oct_z unchanged, so it is still strongly closed.
+ oct_z.set_strongly_closed();
+ else {
+ // oct_z changed: recompute strong closure.
+ oct_z.strong_closure_assign();
+ if (oct_z.marked_empty())
+ return false;
+ }
+ return !oct_z.tight_coherence_would_make_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ strong_closure_assign();
+ // For an empty Octagonal shape, we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The Octagonal shape has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff_j);
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ Linear_Expression le = expr;
+ // Boolean to keep track of a variable `v' in expression `le'.
+ // If we can replace `v' by an expression using variables other
+ // than `v' and are already in `le', then this is set to true.
+ bool constant_v = false;
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+ constant_v = false;
+ dimension_type i = i_iter.index();
+ const Variable v(i/2);
+ coeff = le.coefficient(v);
+ if (coeff == 0) {
+ constant_v = true;
+ continue;
+ }
+ // We check the unary constraints.
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ const N& m_i_ii = m_i[i + 1];
+ const N& m_ii_i = m_ii[i];
+ if ((!is_plus_infinity(m_i_ii) && !is_plus_infinity(m_ii_i))
+ && (is_additive_inverse(m_i_ii, m_ii_i))) {
+ // If `v' is constant, replace it in `le' by the value.
+ numer_denom(m_i_ii, numer, denom);
+ denom *= 2;
+ le -= coeff*v;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ continue;
+ }
+ // Check the octagonal constraints between `v' and the other dimensions
+ // that have non-zero coefficient in `le'.
+ else {
+ PPL_ASSERT(!constant_v);
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ for (row_iterator j_iter = i_iter; j_iter != m_end; j_iter += 2) {
+ dimension_type j = j_iter.index();
+ const Variable vj(j/2);
+ coeff_j = le.coefficient(vj);
+ if (coeff_j == 0)
+ // The coefficient in `le' is 0, so do nothing.
+ continue;
+ const dimension_type cj = coherent_index(j);
+ const dimension_type cjj = coherent_index(j + 1);
+
+ row_reference m_j = *(m_begin + j);
+ row_reference m_cj = *(m_begin + cj);
+ const N& m_j_i = m_j[i];
+ const N& m_i_j = m_cj[ci];
+ if ((!is_plus_infinity(m_i_j) && !is_plus_infinity(m_j_i))
+ && (is_additive_inverse(m_i_j, m_j_i))) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the constraint with `v' is an equality.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(m_i_j, numer, denom);
+ le -= coeff*v;
+ le += coeff*vj;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+
+ m_j = *(m_begin + (j + 1));
+ m_cj = *(m_begin + cjj);
+ const N& m_j_i1 = m_j[i];
+ const N& m_i_j1 = m_cj[ci];
+ if ((!is_plus_infinity(m_i_j1) && !is_plus_infinity(m_j_i1))
+ && (is_additive_inverse(m_i_j1, m_j_i1))) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the constraint with `v' is an equality.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(m_i_j1, numer, denom);
+ le -= coeff*v;
+ le -= coeff*vj;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+
+ // The expression 'expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the octagonal shape.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ // An octagon known to be empty constrains all variables.
+ // (Note: do not force emptiness check _yet_)
+ if (marked_empty())
+ return true;
+
+ // Check whether `var' is syntactically constrained.
+ const dimension_type n_v = 2*(var_space_dim - 1);
+ typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+ for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+ if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+ return true;
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+ if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v + 1]))
+ return true;
+ }
+
+ // `var' is not syntactically constrained:
+ // now force an emptiness check.
+ return is_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+ // This method is only used by method OK() so as to check if a
+ // strongly closed matrix is also strong-coherent, as it must be.
+ const dimension_type num_rows = matrix.num_rows();
+
+ // Allocated here once and for all.
+ PPL_DIRTY_TEMP(N, semi_sum);
+ // The strong-coherence is: for every indexes i and j (and i != j)
+ // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+ // where ci = i + 1, if i is even number or
+ // ci = i - 1, if i is odd.
+ // Ditto for cj.
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+ using namespace Implementation::Octagonal_Shapes;
+ const N& m_i_ci = m_i[coherent_index(i)];
+ for (dimension_type j = matrix.row_size(i); j-- > 0; )
+ // Note: on the main diagonal only PLUS_INFINITY can occur.
+ if (i != j) {
+ const N& m_cj_j = matrix[coherent_index(j)][j];
+ if (!is_plus_infinity(m_i_ci)
+ && !is_plus_infinity(m_cj_j)) {
+ // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+ // rounding the result towards plus infinity.
+ add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+ div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+ if (m_i[j] > semi_sum)
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+ // This method is only used in assertions: efficiency is not a must.
+
+ // An empty octagon is already transitively reduced.
+ if (marked_empty())
+ return true;
+
+ Octagonal_Shape x = *this;
+ // The matrix representing an OS is strongly reduced if, by removing
+ // any constraint, the resulting matrix describes a different OS.
+ for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+ typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+ const dimension_type i = iter.index();
+ for (dimension_type j = iter.row_size(); j-- > 0; ) {
+ if (!is_plus_infinity(m_i[j])) {
+ Octagonal_Shape x_copy = *this;
+ assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (x == x_copy)
+ return false;
+ }
+ }
+ }
+ // The octagon is just reduced.
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+ const bool from_above) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+ strong_closure_assign();
+
+ // A zero-dimensional or empty octagon bounds everything.
+ if (space_dim == 0 || marked_empty())
+ return true;
+
+ // The constraint `c' is used to check if `expr' is an octagonal difference
+ // and, in this case, to select the cell.
+ const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ if (Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+ i, j, coeff, term)) {
+ if (num_vars == 0)
+ return true;
+ // Select the cell to be checked.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ return !is_plus_infinity(m_i[j]);
+ }
+ else {
+ // `c' is not an octagonal constraint: use the MIP solver.
+ Optimization_Mode mode_bounds =
+ from_above ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+ return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim octagons first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ strong_closure_assign();
+ // For an empty OS we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The constraint `c' is used to check if `expr' is an octagonal difference
+ // and, in this case, to select the cell.
+ const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+ i, j, coeff, term)) {
+ // `c' is not an octagonal constraint: use the MIP solver.
+ Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ mip.optimal_value(ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ else
+ // Here`expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // `c' is an octagonal constraint.
+ if (num_vars == 0) {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+
+ // Select the cell to be checked.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ PPL_DIRTY_TEMP(N, d);
+ if (!is_plus_infinity(m_i[j])) {
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = maximize ? b : minus_b;
+ assign_r(d, sc_b, ROUND_UP);
+ // Set `coeff_expr' to the absolute value of coefficient of a variable
+ // of `expr'.
+ PPL_DIRTY_TEMP(N, coeff_expr);
+ const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+ const int sign_i = sgn(coeff_i);
+ if (sign_i > 0)
+ assign_r(coeff_expr, coeff_i, ROUND_UP);
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+ neg_assign(minus_coeff_i, coeff_i);
+ assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+ }
+ // Approximating the maximum/minimum of `expr'.
+ if (num_vars == 1) {
+ PPL_DIRTY_TEMP(N, m_i_j);
+ div_2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+ add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+ }
+ else
+ add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+ numer_denom(d, ext_n, ext_d);
+ if (!maximize)
+ neg_assign(ext_n);
+ included = true;
+ return true;
+ }
+
+ // The `expr' is unbounded.
+ return false;
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included, Generator& g) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim octagons first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ g = point();
+ return true;
+ }
+ }
+
+ strong_closure_assign();
+ // For an empty OS we simply return false.
+ if (marked_empty())
+ return false;
+ if (!is_universe()) {
+ // We use MIP_Problems to handle constraints that are not
+ // octagonal difference.
+ Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = mip.optimizing_point();
+ mip.evaluate_objective_function(g, ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ }
+ // The `expr' is unbounded.
+ return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+ dimension_type cg_space_dim = cg.space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ // If the congruence is an equality,
+ // find the relation with the equivalent equality constraint.
+ if (cg.is_equality()) {
+ Constraint c(cg);
+ return relation_with(c);
+ }
+
+ strong_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
+ Linear_Expression le(cg.expression());
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ bool min_included;
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_numer / min_denom;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_denom < min_numer)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_numer / max_denom;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_denom > max_numer)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+ dimension_type c_space_dim = c.space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ // The closure needs to make explicit the implicit constraints.
+ strong_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ // Trivially false zero-dimensional constraint.
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ // Trivially true zero-dimensional constraint.
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(c_term);
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, c_term)) {
+ // Constraints that are not octagonal differences.
+ // Use maximize() and minimize() to do much of the work.
+
+ // Find the linear expression for the constraint and use that to
+ // find if the expression is bounded from above or below and if it
+ // is, find the maximum and minimum values.
+ Linear_Expression le;
+ le.set_space_dimension(c.space_dimension());
+ le.linear_combine(c.expr, Coefficient_one(), Coefficient_one(),
+ 1, c_space_dim + 1);
+
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+ if (!bounded_above) {
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_strict_inequality() || c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ if (!bounded_below) {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ PPL_UNREACHABLE;
+ break;
+ case 0:
+ if (min_numer == 0) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ }
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+ }
+
+ // Select the cell to be checked for the "<=" part of constraint.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ const N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ // Select the cell to be checked for the ">=" part of constraint.
+ // Select the right row of the cell.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+ typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ const N& m_ci_cj = m_ci[coherent_index(j)];
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ // The following variables of mpq_class type are used to be precise
+ // when the octagon is defined by integer constraints.
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ PPL_DIRTY_TEMP(mpq_class, d);
+ PPL_DIRTY_TEMP(mpq_class, d1);
+ PPL_DIRTY_TEMP(mpq_class, c_denom);
+ PPL_DIRTY_TEMP(mpq_class, q_denom);
+ assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+ assign_r(d, c_term, ROUND_NOT_NEEDED);
+ neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+ div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+ div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+ if (is_plus_infinity(m_i_j)) {
+ if (!is_plus_infinity(m_ci_cj)) {
+ // `*this' is in the following form:
+ // `-m_ci_cj <= v - u'.
+ // In this case `*this' is disjoint from `c' if
+ // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+ // i.e., if `m_ci_cj < d1' (`m_ci_cj <= d1'
+ // if c is a strict inequality).
+ numer_denom(m_ci_cj, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+
+ // Here `m_i_j' is not plus-infinity.
+ numer_denom(m_i_j, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_x, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+ if (!is_plus_infinity(m_ci_cj)) {
+ numer_denom(m_ci_cj, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_x == d && q_y == d1) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+ // `*this' is disjoint from `c' when
+ // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // Here `m_ci_cj' can be also plus-infinity.
+ // If `c' is an equality, `*this' is disjoint from `c' if
+ // `m_i_j < d'.
+ if (d > q_x) {
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+
+ if (d == q_x && c.is_nonstrict_inequality())
+ return Poly_Con_Relation::is_included();
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ // The closure needs to make explicit the implicit constraints and if the
+ // octagon is empty.
+ strong_closure_assign();
+
+ // The empty octagon cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe octagon in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ const bool is_line = g.is_line();
+ const bool is_line_or_ray = g.is_line_or_ray();
+
+ // The relation between the octagon and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the octagon.
+ // To check if the generator satisfies all the constraints it's enough
+ // studying the sign of the scalar product between the generator and
+ // all the constraints in the octagon.
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+
+ // We find in `*this' all the constraints.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+ dimension_type i = i_iter.index();
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ const N& m_i_ii = m_i[i + 1];
+ const N& m_ii_i = m_ii[i];
+ // We have the unary constraints.
+ const Variable x(i/2);
+ const Coefficient& g_coeff_x
+ = (x.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(x);
+ if (is_additive_inverse(m_i_ii, m_ii_i)) {
+ // The constraint has form ax = b.
+ // To satisfy the constraint it is necessary that the scalar product
+ // is not zero. The scalar product has the form
+ // 'denom * g_coeff_x - numer * g.divisor()'.
+ numer_denom(m_ii_i, numer, denom);
+ denom *= 2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ // We have 0, 1 or 2 inequality constraints.
+ else {
+ if (!is_plus_infinity(m_i_ii)) {
+ // The constraint has form -ax <= b.
+ // If the generator is a line it's necessary to check if
+ // the scalar product is not zero, if it is positive otherwise.
+ numer_denom(m_i_ii, numer, denom);
+ denom *= -2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive and the scalar
+ // product has the form
+ // '-denom * g.coeff_x - numer * g.divisor()'.
+ if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_i)) {
+ // The constraint has form ax <= b.
+ numer_denom(m_ii_i, numer, denom);
+ denom *= 2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer , g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive and the scalar
+ // product has the form
+ // 'denom * g_coeff_x - numer * g.divisor()'.
+ if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+
+ // We have the binary constraints.
+ for (row_iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+ dimension_type i = i_iter.index();
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ for (dimension_type j = 0; j < i; j += 2) {
+ const N& m_i_j = m_i[j];
+ const N& m_ii_jj = m_ii[j + 1];
+ const N& m_ii_j = m_ii[j];
+ const N& m_i_jj = m_i[j + 1];
+ const Variable x(j/2);
+ const Variable y(i/2);
+ const Coefficient& g_coeff_x
+ = (x.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(x);
+ const Coefficient& g_coeff_y
+ = (y.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(y);
+
+ const bool difference_is_equality = is_additive_inverse(m_ii_jj, m_i_j);
+ if (difference_is_equality) {
+ // The constraint has form a*x - a*y = b.
+ // The scalar product has the form
+ // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.
+ numer_denom(m_i_j, numer, denom);
+ product = denom * g_coeff_x;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ if (!is_plus_infinity(m_i_j)) {
+ // The constraint has form a*x - a*y <= b.
+ // The scalar product has the form
+ // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_i_j, numer, denom);
+ product = denom * g_coeff_x;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_jj)) {
+ // The constraint has form -a*x + a*y <= b.
+ // The scalar product has the form
+ // '-denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_ii_jj, numer, denom);
+ product = denom * g_coeff_y;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_x);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+
+ const bool sum_is_equality = is_additive_inverse(m_i_jj, m_ii_j);
+ if (sum_is_equality) {
+ // The constraint has form a*x + a*y = b.
+ // The scalar product has the form
+ // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.
+ numer_denom(m_ii_j, numer, denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ if (!is_plus_infinity(m_i_jj)) {
+ // The constraint has form -a*x - a*y <= b.
+ // The scalar product has the form
+ // '-denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_i_jj, numer, denom);
+ neg_assign(denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_j)) {
+ // The constraint has form a*x + a*y <= b.
+ // The scalar product has the form
+ // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_ii_j, numer, denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+ // If this point is reached the constraint 'g' satisfies
+ // all the constraints in the octagon.
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+ // Do something only if necessary (zero-dim implies strong closure).
+ if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+ return;
+
+ // Even though the octagon will not change, its internal representation
+ // is going to be modified by the closure algorithm.
+ Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const dimension_type n_rows = x.matrix.num_rows();
+ const row_iterator m_begin = x.matrix.row_begin();
+ const row_iterator m_end = x.matrix.row_end();
+
+ // Fill the main diagonal with zeros.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+ assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+ }
+
+ // This algorithm is given by two steps: the first one is a simple
+ // adaptation of the `shortest-path closure' using the Floyd-Warshall
+ // algorithm; the second one is the `strong-coherence' algorithm.
+ // It is important to note that after the strong-coherence,
+ // the octagon is still shortest-path closed and hence, strongly closed.
+
+ // Recall that, given an index `h', we indicate with `ch' the coherent
+ // index, i.e., the index such that:
+ // ch = h + 1, if h is an even number;
+ // ch = h - 1, if h is an odd number.
+
+ typename OR_Matrix<N>::element_iterator iter_ij;
+ std::vector<N> vec_k(n_rows);
+ std::vector<N> vec_ck(n_rows);
+ PPL_DIRTY_TEMP(N, sum1);
+ PPL_DIRTY_TEMP(N, sum2);
+ row_reference x_k;
+ row_reference x_ck;
+ row_reference x_i;
+ row_reference x_ci;
+
+ // Since the index `j' of the inner loop will go from 0 up to `i',
+ // the three nested loops have to be executed twice.
+ for (int twice = 0; twice < 2; ++twice) {
+
+ row_iterator x_k_iter = m_begin;
+ row_iterator x_i_iter = m_begin;
+ for (dimension_type k = 0; k < n_rows; k += 2) {
+ const dimension_type ck = k + 1;
+ // Re-initialize the element iterator.
+ iter_ij = x.matrix.element_begin();
+ // Compute the row references `x_k' and `x_ck'.
+ x_k = *x_k_iter;
+ ++x_k_iter;
+ x_ck = *x_k_iter;
+ ++x_k_iter;
+
+ for (dimension_type i = 0; i <= k; i += 2) {
+ const dimension_type ci = i + 1;
+ // Storing x_k_i == x_ci_ck.
+ vec_k[i] = x_k[i];
+ // Storing x_k_ci == x_i_ck.
+ vec_k[ci] = x_k[ci];
+ // Storing x_ck_i == x_ci_k.
+ vec_ck[i] = x_ck[i];
+ // Storing x_ck_ci == x_i_k.
+ vec_ck[ci] = x_ck[ci];
+ }
+ x_i_iter = x_k_iter;
+ for (dimension_type i = k + 2; i < n_rows; i += 2) {
+ const dimension_type ci = i + 1;
+ x_i = *x_i_iter;
+ ++x_i_iter;
+ x_ci = *x_i_iter;
+ ++x_i_iter;
+ // Storing x_k_i == x_ci_ck.
+ vec_k[i] = x_ci[ck];
+ // Storing x_k_ci == x_i_ck.
+ vec_k[ci] = x_i[ck];
+ // Storing x_ck_i == x_ci_k.
+ vec_ck[i] = x_ci[k];
+ // Storing x_ck_ci == x_i_k.
+ vec_ck[ci] = x_i[k];
+ }
+
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const N& vec_k_ci = vec_k[ci];
+ const N& vec_ck_ci = vec_ck[ci];
+ // Unfolding two iterations on `j': this ensures that
+ // the loop exit condition `j <= i' is OK.
+ for (dimension_type j = 0; j <= i; ) {
+ // First iteration: compute
+ //
+ // <CODE>
+ // sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+ // sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j;
+ // </CODE>
+ add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+ add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+ min_assign(sum1, sum2);
+ min_assign(*iter_ij, sum1);
+ // Exiting the first iteration: loop index control.
+ ++j;
+ ++iter_ij;
+ // Second iteration: ditto.
+ add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+ add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+ min_assign(sum1, sum2);
+ min_assign(*iter_ij, sum1);
+ // Exiting the second iteration: loop index control.
+ ++j;
+ ++iter_ij;
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the octagon is empty if and only if there is a
+ // negative value in the main diagonal.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ N& x_i_i = (*i)[i.index()];
+ if (sgn(x_i_i) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_i_i) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // Step 2: we enforce the strong coherence.
+ x.strong_coherence_assign();
+ // The octagon is not empty and it is now strongly closed.
+ x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+ // The strong-coherence is: for every indexes i and j
+ // m_i_j <= (m_i_ci + m_cj_j)/2
+ // where ci = i + 1, if i is even number or
+ // ci = i - 1, if i is odd.
+ // Ditto for cj.
+ PPL_DIRTY_TEMP(N, semi_sum);
+ for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+ i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+ typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+ const dimension_type i = i_iter.index();
+ using namespace Implementation::Octagonal_Shapes;
+ const N& x_i_ci = x_i[coherent_index(i)];
+ // Avoid to do unnecessary sums.
+ if (!is_plus_infinity(x_i_ci))
+ for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+ if (i != j) {
+ const N& x_cj_j = matrix[coherent_index(j)][j];
+ if (!is_plus_infinity(x_cj_j)) {
+ add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+ div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+ min_assign(x_i[j], semi_sum);
+ }
+ }
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+ PPL_ASSERT(std::numeric_limits<N>::is_integer);
+ PPL_ASSERT(marked_strongly_closed());
+ const dimension_type space_dim = space_dimension();
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ const N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci)
+ // Check for oddness of `mat_i_ci'.
+ && !is_even(mat_i_ci)
+ // Check for zero-equivalence of `i' and `ci'.
+ && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+ return true;
+ }
+ return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::tight_closure_assign() {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "Octagonal_Shape<T>::tight_closure_assign():"
+ " T in not an integer datatype.");
+ // FIXME: this is just an executable specification.
+ // (The following call could be replaced by shortest-path closure.)
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+ if (tight_coherence_would_make_empty())
+ set_empty();
+ else {
+ // Tighten the unary constraints.
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ const dimension_type space_dim = space_dimension();
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci))
+ sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+ N& mat_ci_i = matrix[ci][i];
+ if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i))
+ sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+ }
+ // Propagate tightened unary constraints.
+ strong_coherence_assign();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+ // `var' should be one of the dimensions of the octagon.
+ if (var.id() >= space_dim)
+ throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+ var.id());
+
+ // Do something only if necessary.
+ if (marked_empty() || marked_strongly_closed())
+ return;
+
+ Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const row_iterator m_begin = x.matrix.row_begin();
+ const row_iterator m_end = x.matrix.row_end();
+
+ // Fill the main diagonal with zeros.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+ assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+ }
+
+ // Using the incremental Floyd-Warshall algorithm.
+ // Step 1: Improve all constraints on variable `var'.
+ const dimension_type v = 2*var.id();
+ const dimension_type cv = v + 1;
+ row_iterator v_iter = m_begin + v;
+ row_iterator cv_iter = v_iter + 1;
+ row_reference x_v = *v_iter;
+ row_reference x_cv = *cv_iter;
+ const dimension_type rs_v = v_iter.row_size();
+ const dimension_type n_rows = x.matrix.num_rows();
+ PPL_DIRTY_TEMP(N, sum);
+ using namespace Implementation::Octagonal_Shapes;
+ for (row_iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+ const dimension_type k = k_iter.index();
+ const dimension_type ck = coherent_index(k);
+ const dimension_type rs_k = k_iter.row_size();
+ row_reference x_k = *k_iter;
+ row_reference x_ck = (k % 2 != 0) ? *(k_iter-1) : *(k_iter + 1);
+
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference x_i = *i_iter;
+ row_reference x_ci = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+
+ const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+ if (!is_plus_infinity(x_i_k)) {
+ const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+ if (!is_plus_infinity(x_k_v)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+ min_assign(x_i_v, sum);
+ }
+ const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+ if (!is_plus_infinity(x_k_cv)) {
+ add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+ N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+ min_assign(x_i_cv, sum);
+ }
+ }
+ const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+ if (!is_plus_infinity(x_k_i)) {
+ const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+ if (!is_plus_infinity(x_v_k)) {
+ N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v_i, sum);
+ }
+ const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+ if (!is_plus_infinity(x_cv_k)) {
+ N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+ add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+ min_assign(x_cv_i, sum);
+ }
+ }
+
+ }
+ }
+
+ // Step 2: improve the other bounds by using the precise bounds
+ // for the constraints on `var'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference x_i = *i_iter;
+ const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+ // TODO: see if it is possible to optimize this inner loop
+ // by splitting it into several parts, so as to avoid
+ // conditional expressions.
+ for (dimension_type j = 0; j < n_rows; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_reference x_cj = *(m_begin + cj);
+ N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+ if (!is_plus_infinity(x_i_v)) {
+ const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+ if (!is_plus_infinity(x_v_j)) {
+ add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+ min_assign(x_i_j, sum);
+ }
+ }
+ const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+ if (!is_plus_infinity(x_i_cv)) {
+ const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+ if (!is_plus_infinity(x_cv_j)) {
+ add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+ min_assign(x_i_j, sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the octagon is empty if and only if there is a
+ // negative value on the main diagonal.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ N& x_i_i = (*i)[i.index()];
+ if (sgn(x_i_i) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ // Restore PLUS_INFINITY on the main diagonal.
+ PPL_ASSERT(sgn(x_i_i) == 0);
+ assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // Step 3: we enforce the strong coherence.
+ x.strong_coherence_assign();
+ // The octagon is not empty and it is now strongly closed.
+ x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(successor.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `successor' is used to indicate which variable
+ // immediately follows a given one in the corresponding equivalence class.
+ const dimension_type successor_size = matrix.num_rows();
+ // Initially, each variable is successor of its own zero-equivalence class.
+ successor.reserve(successor_size);
+ for (dimension_type i = 0; i < successor_size; ++i)
+ successor.push_back(i);
+ // Now compute actual successors.
+ for (dimension_type i = successor_size; i-- > 0; ) {
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ typename OR_Matrix<N>::const_row_reference_type m_ci
+ = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+ for (dimension_type j = 0; j < i; ++j) {
+ // FIXME: what is the following, commented-out for?
+ //for (dimension_type j = i; j-- > 0; ) {
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ if (is_additive_inverse(m_ci[cj], m_i[j]))
+ // Choose as successor the variable having the greatest index.
+ successor[j] = i;
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(leaders.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `leaders' is used to indicate the smallest variable
+ // that belongs to the corresponding equivalence class.
+ const dimension_type leader_size = matrix.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ leaders.reserve(leader_size);
+ for (dimension_type i = 0; i < leader_size; ++i)
+ leaders.push_back(i);
+ // Now compute actual leaders.
+ for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+ matrix_row_end = matrix.row_end();
+ i_iter != matrix_row_end; ++i_iter) {
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ dimension_type i = i_iter.index();
+ typename OR_Matrix<N>::const_row_reference_type m_ci
+ = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+ for (dimension_type j = 0; j < i; ++j) {
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ if (is_additive_inverse(m_ci[cj], m_i[j]))
+ // Choose as leader the variable having the smaller index.
+ leaders[i] = leaders[j];
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+ std::vector<dimension_type>& no_sing_leaders,
+ bool& exist_sing_class,
+ dimension_type& sing_leader) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(no_sing_leaders.size() == 0);
+ dimension_type successor_size = successor.size();
+ std::deque<bool> dealt_with(successor_size, false);
+ for (dimension_type i = 0; i < successor_size; ++i) {
+ dimension_type next_i = successor[i];
+ if (!dealt_with[i]) {
+ // The index is a leader.
+ // Now check if it is a leader of a singular class or not.
+ using namespace Implementation::Octagonal_Shapes;
+ if (next_i == coherent_index(i)) {
+ exist_sing_class = true;
+ sing_leader = i;
+ }
+ else
+ no_sing_leaders.push_back(i);
+ }
+ // The following index is not a leader.
+ dealt_with[next_i] = true;
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+ // Zero-dimensional octagonal shapes are necessarily reduced.
+ if (space_dim == 0)
+ return;
+ strong_closure_assign();
+ // If `*this' is empty, then there is nothing to reduce.
+ if (marked_empty())
+ return;
+
+ // Detect non-redundant constraints.
+ std::vector<Bit_Row> non_red;
+ non_redundant_matrix_entries(non_red);
+
+ // Throw away redundant constraints.
+ Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+#ifndef NDEBUG
+ const Octagonal_Shape x_copy_before(x);
+#endif
+ typename OR_Matrix<N>::element_iterator x_i = x.matrix.element_begin();
+ for (dimension_type i = 0; i < 2 * space_dim; ++i) {
+ const Bit_Row& non_red_i = non_red[i];
+ for (dimension_type j = 0,
+ j_end = OR_Matrix<N>::row_size(i); j < j_end; ++j, ++x_i) {
+ if (!non_red_i[j])
+ assign_r(*x_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ x.reset_strongly_closed();
+#ifndef NDEBUG
+ const Octagonal_Shape x_copy_after(x);
+ PPL_ASSERT(x_copy_before == x_copy_after);
+ PPL_ASSERT(x.is_strongly_reduced());
+ PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(space_dim > 0 && !marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(non_redundant.empty());
+
+ // Initialize `non_redundant' as if it was an OR_Matrix of booleans
+ // (initially set to false).
+ non_redundant.resize(2*space_dim);
+
+ // Step 1: compute zero-equivalence classes.
+ // Variables corresponding to indices `i' and `j' are zero-equivalent
+ // if they lie on a zero-weight loop; since the matrix is strongly
+ // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+ std::vector<dimension_type> no_sing_leaders;
+ dimension_type sing_leader = 0;
+ bool exist_sing_class = false;
+ std::vector<dimension_type> successor;
+ compute_successors(successor);
+ compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+ const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+
+ // Step 2: flag redundant constraints in `redundancy'.
+ // Go through non-singular leaders first.
+ for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+ const dimension_type i = no_sing_leaders[li];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ typename OR_Matrix<N>::const_row_reference_type
+ m_i = *(matrix.row_begin() + i);
+ if (i % 2 == 0) {
+ // Each positive equivalence class must have a single 0-cycle
+ // connecting all equivalent variables in increasing order.
+ // Note: by coherence assumption, the variables in the
+ // corresponding negative equivalence class are
+ // automatically connected.
+ if (i != successor[i]) {
+ dimension_type j = i;
+ dimension_type next_j = successor[j];
+ while (j != next_j) {
+ non_redundant[next_j].set(j);
+ j = next_j;
+ next_j = successor[j];
+ }
+ const dimension_type cj = coherent_index(j);
+ non_redundant[cj].set(ci);
+ }
+ }
+
+ dimension_type rs_li = (li % 2 != 0) ? li : (li + 1);
+ // Check if the constraint is redundant.
+ PPL_DIRTY_TEMP(N, tmp);
+ for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+ const dimension_type j = no_sing_leaders[lj];
+ const dimension_type cj = coherent_index(j);
+ const N& m_i_j = m_i[j];
+ const N& m_i_ci = m_i[ci];
+ bool to_add = true;
+ // Control if the constraint is redundant by strong-coherence,
+ // that is:
+ // m_i_j >= (m_i_ci + m_cj_j)/2, where j != ci.
+ if (j != ci) {
+ add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+ div_2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+ if (m_i_j >= tmp)
+ // The constraint is redundant.
+ continue;
+ }
+ // Control if the constraint is redundant by strong closure, that is
+ // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+ // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k + 1)}.
+ // Since the octagon is already strongly closed, the above relation
+ // is reduced to three case, in accordance with k, i, j inter-depend:
+ // exit k such that
+ // 1.) m_i_j >= m_i_k + m_cj_ck, if k < j < i; or
+ // 2.) m_i_j >= m_i_k + m_k,_j, if j < k < i; or
+ // 3.) m_i_j >= m_ck_ci + m_k_j, if j < i < k.
+ // Note: `i > j'.
+ for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+ const dimension_type k = no_sing_leaders[lk];
+ if (k != i && k != j) {
+ dimension_type ck = coherent_index(k);
+ if (k < j)
+ // Case 1.
+ add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+ else if (k < i)
+ // Case 2.
+ add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+ else
+ // Case 3.
+ add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+ // Checks if the constraint is redundant.
+ if (m_i_j >= tmp) {
+ to_add = false;
+ break;
+ }
+ }
+ }
+
+ if (to_add)
+ // The constraint is not redundant.
+ non_redundant[i].set(j);
+ }
+ }
+
+ // If there exist a singular equivalence class, then it must have a
+ // single 0-cycle connecting all the positive and negative equivalent
+ // variables.
+ // Note: the singular class is not connected with the other classes.
+ if (exist_sing_class) {
+ non_redundant[sing_leader].set(sing_leader + 1);
+ if (successor[sing_leader + 1] != sing_leader + 1) {
+ dimension_type j = sing_leader;
+ dimension_type next_j = successor[j + 1];
+ while (next_j != j + 1) {
+ non_redundant[next_j].set(j);
+ j = next_j;
+ next_j = successor[j + 1];
+ }
+ non_redundant[j + 1].set(j);
+ }
+ else
+ non_redundant[sing_leader + 1].set(sing_leader);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The hull of an octagon `x' with an empty octagon is `x'.
+ y.strong_closure_assign();
+ if (y.marked_empty())
+ return;
+ strong_closure_assign();
+ if (marked_empty()) {
+ *this = y;
+ return;
+ }
+
+ // The oct-hull is obtained by computing maxima.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end; ++i, ++j)
+ max_assign(*i, *j);
+
+ // The result is still closed.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ Octagonal_Shape& x = *this;
+
+ // Being lazy here is only harmful.
+ // We close.
+ x.strong_closure_assign();
+ // The difference of an empty octagon and of an octagon `p' is empty.
+ if (x.marked_empty())
+ return;
+ // The difference of a octagon `p' and an empty octagon is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both octagons are zero-dimensional,
+ // then at this point they are necessarily universe octagons,
+ // so that their difference is empty.
+ if (x.space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ // TODO: This is just an executable specification.
+ // Have to find a more efficient method.
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ Octagonal_Shape new_oct(space_dim, EMPTY);
+ // We take a constraint of the octagon y at the time and we
+ // consider its complementary. Then we intersect the union
+ // of these complementary constraints with the octagon x.
+ const Constraint_System& y_cs = y.constraints();
+ for (Constraint_System::const_iterator i = y_cs.begin(),
+ y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+ const Constraint& c = *i;
+ // If the octagon `x' is included the octagon defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty octagon, and as we would obtain
+ // a result that is less precise than the difference.
+ if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ Octagonal_Shape z = x;
+ const Linear_Expression e(c.expression());
+ z.add_constraint(e <= 0);
+ if (!z.is_empty())
+ new_oct.upper_bound_assign(z);
+ if (c.is_equality()) {
+ z = x;
+ z.add_constraint(e >= 0);
+ if (!z.is_empty())
+ new_oct.upper_bound_assign(z);
+ }
+ }
+ *this = new_oct;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::simplify_using_context_assign(const Octagonal_Shape& y) {
+ Octagonal_Shape& x = *this;
+ const dimension_type dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (dim != y.space_dimension())
+ throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (dim == 0) {
+ if (y.marked_empty()) {
+ x.set_zero_dim_univ();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case where `x' contains `y'
+ // (this subsumes the case when `y' is empty).
+ if (x.contains(y)) {
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ x.m_swap(res);
+ return false;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator Row_Iter;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_CIter;
+ typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+ typedef typename OR_Matrix<N>::const_element_iterator Elem_CIter;
+
+ // Filter away the case where `x' is empty.
+ x.strong_closure_assign();
+ if (x.marked_empty()) {
+ // Search for a constraint of `y' that is not a tautology.
+ dimension_type i;
+ dimension_type j;
+ // Prefer unary constraints.
+ for (i = 0; i < 2*dim; i += 2) {
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i, i + 1))) {
+ j = i + 1;
+ goto found;
+ }
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i + 1, i))) {
+ j = i;
+ ++i;
+ goto found;
+ }
+ }
+ // Then search binary constraints.
+ // TODO: use better iteration scheme.
+ for (i = 2; i < 2*dim; ++i)
+ for (j = 0; j < i; ++j) {
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i, j)))
+ goto found;
+ }
+
+ // Not found: we were not able to build a constraint contradicting
+ // one of the constraints in `y': `x' cannot be enlarged.
+ return false;
+
+ found:
+ // Found: build a new OS contradicting the constraint found.
+ PPL_ASSERT(i < dim && j < dim && i != j);
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ // FIXME: compute a proper contradicting constraint.
+ PPL_DIRTY_TEMP(N, tmp);
+ assign_r(tmp, 1, ROUND_UP);
+ add_assign_r(tmp, tmp, y.matrix_at(i, j), ROUND_UP);
+ // CHECKME: round down is really meant.
+ neg_assign_r(res.matrix_at(j, i), tmp, ROUND_DOWN);
+ PPL_ASSERT(!is_plus_infinity(res.matrix_at(j, i)));
+ x.m_swap(res);
+ return false;
+ }
+
+ // Here `x' and `y' are not empty and strongly closed;
+ // also, `x' does not contain `y'.
+ // Let `target' be the intersection of `x' and `y'.
+ Octagonal_Shape<T> target = x;
+ target.intersection_assign(y);
+ const bool bool_result = !target.is_empty();
+
+ // Compute redundancy information for x and ...
+ // TODO: provide a nicer data structure for redundancy.
+ std::vector<Bit_Row> x_non_redundant;
+ x.non_redundant_matrix_entries(x_non_redundant);
+ // ... count the non-redundant constraints.
+ dimension_type x_num_non_redundant = 0;
+ for (size_t i = x_non_redundant.size(); i-- > 0 ; )
+ x_num_non_redundant += x_non_redundant[i].count_ones();
+ PPL_ASSERT(x_num_non_redundant > 0);
+
+ // Let `yy' be a copy of `y': we will keep adding to `yy'
+ // the non-redundant constraints of `x',
+ // stopping as soon as `yy' becomes equal to `target'.
+ Octagonal_Shape<T> yy = y;
+
+ // The constraints added to `yy' will be recorded in `res' ...
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ // ... and we will count them too.
+ dimension_type res_num_non_redundant = 0;
+
+ // Compute leader information for `x'.
+ std::vector<dimension_type> x_leaders;
+ x.compute_leaders(x_leaders);
+
+ // First go through the unary equality constraints.
+ // Find the leader of the singular equivalence class (it is even!).
+ dimension_type sing_leader;
+ for (sing_leader = 0; sing_leader < 2*dim; sing_leader += 2) {
+ if (sing_leader == x_leaders[sing_leader]) {
+ const N& x_s_ss = x.matrix_at(sing_leader, sing_leader + 1);
+ const N& x_ss_s = x.matrix_at(sing_leader + 1, sing_leader);
+ if (is_additive_inverse(x_s_ss, x_ss_s))
+ // Singular leader found.
+ break;
+ }
+ }
+
+ // Unary equalities have `sing_leader' as a leader.
+ for (dimension_type i = sing_leader; i < 2*dim; i += 2) {
+ if (x_leaders[i] != sing_leader)
+ continue;
+ // Found a unary equality constraint:
+ // see if any of the two inequalities have to be added.
+ const N& x_i_ii = x.matrix_at(i, i + 1);
+ N& yy_i_ii = yy.matrix_at(i, i + 1);
+ if (x_i_ii < yy_i_ii) {
+ // The \leq inequality is not implied by context.
+ res.matrix_at(i, i + 1) = x_i_ii;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_ii = x_i_ii;
+ yy.reset_strongly_closed();
+ }
+ const N& x_ii_i = x.matrix_at(i + 1, i);
+ N& yy_ii_i = yy.matrix_at(i + 1, i);
+ if (x_ii_i < yy_ii_i) {
+ // The \geq inequality is not implied by context.
+ res.matrix_at(i + 1, i) = x_ii_i;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_ii_i = x_ii_i;
+ yy.reset_strongly_closed();
+ }
+ // Restore strong closure, if it was lost.
+ if (!yy.marked_strongly_closed()) {
+ Variable var_i(i/2);
+ yy.incremental_strong_closure_assign(var_i);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Go through the binary equality constraints.
+ for (dimension_type i = 0; i < 2*dim; ++i) {
+ const dimension_type j = x_leaders[i];
+ if (j == i || j == sing_leader)
+ continue;
+ const N& x_i_j = x.matrix_at(i, j);
+ PPL_ASSERT(!is_plus_infinity(x_i_j));
+ N& yy_i_j = yy.matrix_at(i, j);
+ if (x_i_j < yy_i_j) {
+ res.matrix_at(i, j) = x_i_j;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_j = x_i_j;
+ yy.reset_strongly_closed();
+ }
+ const N& x_j_i = x.matrix_at(j, i);
+ N& yy_j_i = yy.matrix_at(j, i);
+ PPL_ASSERT(!is_plus_infinity(x_j_i));
+ if (x_j_i < yy_j_i) {
+ res.matrix_at(j, i) = x_j_i;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_j_i = x_j_i;
+ yy.reset_strongly_closed();
+ }
+ // Restore strong closure, if it was lost.
+ if (!yy.marked_strongly_closed()) {
+ Variable var_j(j/2);
+ yy.incremental_strong_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Finally go through the (proper) inequality constraints:
+ // both indices i and j should be leaders.
+ // FIXME: improve iteration scheme (are we doing twice the work?)
+ for (dimension_type i = 0; i < 2*dim; ++i) {
+ if (i != x_leaders[i])
+ continue;
+ const Bit_Row& x_non_redundant_i = x_non_redundant[i];
+ for (dimension_type j = 0; j < 2*dim; ++j) {
+ if (j != x_leaders[j])
+ continue;
+ if (i >= j) {
+ if (!x_non_redundant_i[j])
+ continue;
+ }
+ else if (!x_non_redundant[j][i])
+ continue;
+ N& yy_i_j = yy.matrix_at(i, j);
+ const N& x_i_j = x.matrix_at(i, j);
+ if (x_i_j < yy_i_j) {
+ res.matrix_at(i, j) = x_i_j;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_j = x_i_j;
+ yy.reset_strongly_closed();
+ Variable var(i/2);
+ yy.incremental_strong_closure_assign(var);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+ }
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type new_dim = space_dim + m;
+ const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
+
+ // To embed an n-dimension space octagon in a (n + m)-dimension space,
+ // we just add `m' variables in the matrix of constraints.
+ matrix.grow(new_dim);
+ space_dim = new_dim;
+ // If `*this' was the zero-dim space universe octagon,
+ // then we can set the strongly closure flag.
+ if (was_zero_dim_univ)
+ set_strongly_closed();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type n = matrix.num_rows();
+
+ // To project an n-dimension space OS in a (space_dim + m)-dimension space,
+ // we just add `m' columns and rows in the matrix of constraints.
+ add_space_dimensions_and_embed(m);
+ // We insert 0 where it needs.
+ // Attention: now num_rows of matrix is update!
+ for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; i += 2) {
+ typename OR_Matrix<N>::row_reference_type x_i = *i;
+ typename OR_Matrix<N>::row_reference_type x_ci = *(i + 1);
+ const dimension_type ind = i.index();
+ assign_r(x_i[ind + 1], 0, ROUND_NOT_NEEDED);
+ assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+ }
+
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any octagon is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a octagon in a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ const dimension_type new_space_dim = space_dim - vars.size();
+
+ strong_closure_assign();
+ // When removing _all_ dimensions from an octagon,
+ // we obtain the zero-dimensional octagon.
+ if (new_space_dim == 0) {
+ matrix.shrink(0);
+ if (!marked_empty())
+ // We set the zero_dim_univ flag.
+ set_zero_dim_univ();
+ space_dim = 0;
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // We consider each variable and we check if it has to be removed.
+ // If it has to be removed, we pass to the next one, then we will
+ // overwrite its representation in the matrix.
+ typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+ typedef typename std::iterator_traits<Elem_Iter>::difference_type diff_t;
+
+ dimension_type first = *vars.begin();
+ const dimension_type first_size = 2 * first * (first + 1);
+ Elem_Iter iter = matrix.element_begin() + static_cast<diff_t>(first_size);
+
+ for (dimension_type i = first + 1; i < space_dim; ++i) {
+ if (vars.count(i) == 0) {
+ typename OR_Matrix<N>::row_iterator row_iter = matrix.row_begin() + 2*i;
+ typename OR_Matrix<N>::row_reference_type row_ref = *row_iter;
+ typename OR_Matrix<N>::row_reference_type row_ref1 = *(++row_iter);
+ // Beware: first we shift the cells corresponding to the first
+ // row of variable(j), then we shift the cells corresponding to the
+ // second row. We recall that every variable is represented
+ // in the `matrix' by two rows and two columns.
+ for (dimension_type j = 0; j <= i; ++j)
+ if (vars.count(j) == 0) {
+ assign_or_swap(*(iter++), row_ref[2*j]);
+ assign_or_swap(*(iter++), row_ref[2*j + 1]);
+ }
+ for (dimension_type j = 0; j <= i; ++j)
+ if (vars.count(j) == 0) {
+ assign_or_swap(*(iter++), row_ref1[2*j]);
+ assign_or_swap(*(iter++), row_ref1[2*j + 1]);
+ }
+ }
+ }
+ // Update the space dimension.
+ matrix.shrink(new_space_dim);
+ space_dim = new_space_dim;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the octagon becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If we are going to actually reduce the space dimension,
+ // then shortest-path closure is required to keep precision.
+ if (new_space_dim < space_dim)
+ strong_closure_assign();
+
+ // If the octagon is empty, then it is sufficient to adjust
+ // the space dimension of the octagon.
+ if (marked_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // We create a new matrix with the new space dimension.
+ OR_Matrix<N> x(new_space_dim);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ row_iterator m_begin = x.row_begin();
+
+ for (row_iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+ i_iter != i_end; i_iter += 2) {
+ dimension_type new_i;
+ dimension_type i = i_iter.index()/2;
+ // We copy and place in the position into `x' the only cells of
+ // the `matrix' that refer to both mapped variables,
+ // the variable `i' and `j'.
+ if (pfunc.maps(i, new_i)) {
+ row_reference r_i = *i_iter;
+ row_reference r_ii = *(i_iter + 1);
+ dimension_type double_new_i = 2*new_i;
+ row_iterator x_iter = m_begin + double_new_i;
+ row_reference x_i = *x_iter;
+ row_reference x_ii = *(x_iter + 1);
+ for (dimension_type j = 0; j <= i; ++j) {
+ dimension_type new_j;
+ // If also the second variable is mapped, we work.
+ if (pfunc.maps(j, new_j)) {
+ dimension_type dj = 2*j;
+ dimension_type double_new_j = 2*new_j;
+ // Mapped the constraints, exchanging the indexes.
+ // Attention: our matrix is pseudo-triangular.
+ // If new_j > new_i, we must consider, as rows, the rows of
+ // the variable new_j, and not of new_i ones.
+ if (new_i >= new_j) {
+ assign_or_swap(x_i[double_new_j], r_i[dj]);
+ assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+ assign_or_swap(x_ii[double_new_j + 1], r_ii[dj + 1]);
+ assign_or_swap(x_i[double_new_j + 1], r_i[dj + 1]);
+ }
+ else {
+ row_iterator x_j_iter = m_begin + double_new_j;
+ row_reference x_j = *x_j_iter;
+ row_reference x_jj = *(x_j_iter + 1);
+ assign_or_swap(x_jj[double_new_i + 1], r_i[dj]);
+ assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+ assign_or_swap(x_j[double_new_i + 1], r_i[dj + 1]);
+ assign_or_swap(x_j[double_new_i], r_ii[dj + 1]);
+ }
+
+ }
+ }
+ }
+ }
+
+ using std::swap;
+ swap(matrix, x);
+ space_dim = new_space_dim;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two octagons is empty, the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+ // If both octagons are zero-dimensional,then at this point
+ // they are necessarily non-empty,
+ // so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // To intersect two octagons we compare the constraints
+ // and we choose the less values.
+ bool changed = false;
+
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ N& elem = *i;
+ const N& y_elem = *j;
+ if (y_elem < elem) {
+ elem = y_elem;
+ changed = true;
+ }
+ }
+
+ // This method not preserve the closure.
+ if (changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If both octagons are zero-dimensional,
+ // since `*this' contains `y', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ strong_closure_assign();
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ y.strong_closure_assign();
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Octagonal_Shape x_tmp(*this);
+ x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Compare each constraint in `y' to the corresponding one in `*this'.
+ // The constraint in `*this' is kept as is if it is stronger than or
+ // equal to the constraint in `y'; otherwise, the inhomogeneous term
+ // of the constraint in `*this' is further compared with elements taken
+ // from a sorted container (the stop-points, provided by the user), and
+ // is replaced by the first entry, if any, which is greater than or equal
+ // to the inhomogeneous term. If no such entry exists, the constraint
+ // is removed altogether.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ const N& y_elem = *j;
+ N& elem = *i;
+ if (y_elem < elem) {
+ Iterator k = std::lower_bound(first, last, elem);
+ if (k != last) {
+ if (elem < *k)
+ assign_r(elem, *k, ROUND_UP);
+ }
+ else
+ assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+ Octagonal_Shape& limiting_octagon) const {
+ const dimension_type cs_space_dim = cs.space_dimension();
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs_space_dim <= space_dim);
+
+ strong_closure_assign();
+ bool is_oct_changed = false;
+
+ // Allocate temporaries outside of the loop.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ PPL_DIRTY_TEMP(N, d);
+
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ // Constraints that are not octagonal differences are ignored.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+ coeff, term))
+ continue;
+
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ Row_iterator m_begin = matrix.row_begin();
+ // Select the cell to be modified for the "<=" part of the constraint.
+ Row_iterator i_iter = m_begin + i;
+ Row_reference m_i = *i_iter;
+ OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+ row_iterator lo_iter = lo_mat.row_begin() + i;
+ row_reference lo_m_i = *lo_iter;
+ N& lo_m_i_j = lo_m_i[j];
+ if (coeff < 0)
+ neg_assign(coeff);
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ div_round_up(d, term, coeff);
+ if (m_i[j] <= d)
+ if (c.is_inequality()) {
+ if (lo_m_i_j > d) {
+ lo_m_i_j = d;
+ is_oct_changed = true;
+ }
+ else {
+ // Select the right row of the cell.
+ if (i % 2 == 0) {
+ ++i_iter;
+ ++lo_iter;
+ }
+ else {
+ --i_iter;
+ --lo_iter;
+ }
+ Row_reference m_ci = *i_iter;
+ row_reference lo_m_ci = *lo_iter;
+ // Select the right column of the cell.
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& lo_m_ci_cj = lo_m_ci[cj];
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+ lo_m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+ }
+ }
+ // In general, adding a constraint does not preserve the strongly
+ // closure of the octagon.
+ if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+ limiting_octagon.reset_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two octagons.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // The limited CC76-extrapolation between two octagons in a
+ // zero-dimensional space is a octagon in a zero-dimensional
+ // space, too.
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+ get_limiting_octagon(cs, limiting_octagon);
+ CC76_extrapolation_assign(y, tp);
+ intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // Compute the affine dimension of `y'.
+ const dimension_type y_affine_dim = y.affine_dimension();
+ // If the affine dimension of `y' is zero, then either `y' is
+ // zero-dimensional, or it is empty, or it is a singleton.
+ // In all cases, due to the inclusion hypothesis, the result is `*this'.
+ if (y_affine_dim == 0)
+ return;
+
+ // If the affine dimension has changed, due to the inclusion hypothesis,
+ // the result is `*this'.
+ const dimension_type x_affine_dim = affine_dimension();
+ PPL_ASSERT(x_affine_dim >= y_affine_dim);
+ if (x_affine_dim != y_affine_dim)
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Octagonal_Shape x_tmp(*this);
+ x_tmp.BHMZ05_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Here no token is available.
+ PPL_ASSERT(marked_strongly_closed() && y.marked_strongly_closed());
+ // Minimize `y'.
+ y.strong_reduction_assign();
+
+ // Extrapolate unstable bounds.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ N& elem = *i;
+ // Note: in the following line the use of `!=' (as opposed to
+ // the use of `<' that would seem -but is not- equivalent) is
+ // intentional.
+ if (*j != elem)
+ assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two octagons.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+ // The limited BHMZ05-extrapolation between two octagons in a
+ // zero-dimensional space is a octagon in a zero-dimensional
+ // space, too.
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+ get_limiting_octagon(cs, limiting_octagon);
+ BHMZ05_widening_assign(y, tp);
+ intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // Assume `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both octagons are zero-dimensional, since `*this' contains `y',
+ // we simply return '*this'.
+ if (space_dim == 0)
+ return;
+
+ y.strong_closure_assign();
+ // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+ if (y.marked_empty())
+ return;
+ strong_closure_assign();
+ // If `*this' is empty, we return.
+ if (marked_empty())
+ return;
+
+ // We consider a constraint of `*this', if its value is `plus_infinity',
+ // we take the value of the corresponding constraint of `y'.
+ bool is_oct_changed = false;
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ if (!is_plus_infinity(*i)
+ && !is_plus_infinity(*j)
+ && *i != *j) {
+ *i = *j;
+ is_oct_changed = true;
+ }
+ }
+
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+ const dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(ub_v));
+
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+ // No need to consider indices greater than `last_id'.
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v + 1];
+
+ // Speculatively allocate temporaries out of the loop.
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_q);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+ const dimension_type u_id = u.variable().id();
+ // Skip the case when `u_id == v_id'.
+ if (u_id == v_id)
+ continue;
+ const Coefficient& expr_u = *u;
+
+ const dimension_type n_u = u_id*2;
+ // If `expr_u' is positive, we can improve `v - u'.
+ if (expr_u > 0) {
+ if (expr_u >= sc_denom) {
+ // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+ // We avoid to check if `ub_u' is plus infinity, because
+ // it is used for the computation of `ub_v'.
+ // Let half = m_cu_u / 2.
+ div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+ N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u + 1];
+ sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+ }
+ else {
+ // Here 0 < q < 1.
+ typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+ const N& m_u_cu = m_u[n_u + 1];
+ if (!is_plus_infinity(m_u_cu)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `v - u' is
+ // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+ // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+ assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+ N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u + 1];
+ add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(expr_u < 0);
+ // If `expr_u' is negative, we can improve `v + u'.
+ neg_assign(minus_expr_u, expr_u);
+ if (minus_expr_u >= sc_denom) {
+ // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+ // We avoid to check if `lb_u' is plus infinity, because
+ // it is used for the computation of `ub_v'.
+ // Let half = m_u_cu / 2.
+ div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+ N& m_v_plus_u = (n_v < n_u) ? matrix[n_u + 1][n_v] : m_cv[n_u];
+ sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+ }
+ else {
+ // Here -1 < q < 0.
+ typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+ const N& m_cu_u = m_cu[n_u];
+ if (!is_plus_infinity(m_cu_u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `v + u' is
+ // computed as `ub_v + ((-q) * lb_u + (1 + q) * ub_u)',
+ // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+ assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(minus_q, minus_q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+ neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+ // Compute `lb_u - ub_u'.
+ sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+ add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `v + u <= ub_v + ((-q) * lb_u + (1 + q) * ub_u)'.
+ N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+ add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+ const dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+ // No need to consider indices greater than `last_id'.
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+ // Speculatively allocate temporaries out of the loop.
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+ const dimension_type u_id = u.variable().id();
+ // Skip the case when `u_id == v_id'.
+ if (u_id == v_id)
+ continue;
+ const Coefficient& expr_u = *u;
+
+ const dimension_type n_u = u_id*2;
+ // If `expr_u' is positive, we can improve `-v + u'.
+ if (expr_u > 0) {
+ if (expr_u >= sc_denom) {
+ // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ // We avoid to check if `lb_u' is plus infinity, because
+ // it is used for the computation of `lb_v'.
+ // Let half = m_u_cu / 2.
+ div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+ N& m_u_minus_v = (n_v < n_u) ? matrix[n_u + 1][n_v + 1] : m_v[n_u];
+ sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+ }
+ else {
+ // Here 0 < q < 1.
+ typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+ const N& m_cu_u = m_cu[n_u];
+ if (!is_plus_infinity(m_cu_u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `u - v' is
+ // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+ // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+ assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+ N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v + 1] : m_v[n_u];
+ add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(expr_u < 0);
+ // If `expr_u' is negative, we can improve `-v - u'.
+ neg_assign(minus_expr_u, expr_u);
+ if (minus_expr_u >= sc_denom) {
+ // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+ // We avoid to check if `ub_u' is plus infinity, because
+ // it is used for the computation of `lb_v'.
+ // Let half = m_cu_u / 2.
+ div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+ N& m_minus_v_minus_u = (n_v < n_u)
+ ? matrix[n_u][n_v + 1]
+ : m_v[n_u + 1];
+ sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+ }
+ else {
+ // Here -1 < q < 0.
+ typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+ const N& m_u_cu = m_u[n_u + 1];
+ if (!is_plus_infinity(m_u_cu)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `-v - u' is
+ // computed as `-lb_v - ((-q)*ub_u + (1 + q)*lb_u)',
+ // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+ assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, m_u[n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `-lb_u + q*(ub_u - lb_u)'.
+ add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1 + q) * lb_u)'.
+ N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v + 1] : m_v[n_u + 1];
+ add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+ PPL_ASSERT(v_id < space_dim);
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+ for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+ assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::row_reference_type r = *m_iter;
+ assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+ PPL_ASSERT(v_id < space_dim);
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+ for (dimension_type k = n_v; k-- > 0; ) {
+ assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::row_reference_type r = *m_iter;
+ assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ const dimension_type var_id = var.id();
+ if (space_dimension() < var_id + 1)
+ throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+ // Enforce strong closure for precision.
+ strong_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ forget_all_octagonal_constraints(var_id);
+ // Strong closure is preserved.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case captures the only legal cylindrification in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Enforce strong closure for precision.
+ strong_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+ forget_all_octagonal_constraints(*vsi);
+ // Strong closure is preserved.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(denominator != 0);
+ PPL_ASSERT(space_dim >= expr.space_dimension());
+ const dimension_type var_id = var.id();
+ PPL_ASSERT(var_id <= space_dim);
+ PPL_ASSERT(expr.coefficient(var) == 0);
+ PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+
+ // Variable index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*j + b, where `j != v';
+ // - If t == 2, then `expr' is of the general form.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const dimension_type n_var = 2*var_id;
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ // Since we are only able to record octagonal differences, we can
+ // precisely deal with the case of a single variable only if its
+ // coefficient (taking into account the denominator) is 1.
+ // If this is not the case, we fall back to the general case
+ // so as to over-approximate the constraint.
+ if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+ && expr.coefficient(Variable(w_id)) != minus_denom)
+ t = 2;
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ switch (relsym) {
+ case EQUAL:
+ // Add the constraint `var == b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ const dimension_type n_w = 2*w_id;
+ switch (relsym) {
+ case EQUAL:
+ if (w_coeff == denominator)
+ // Add the new constraint `var - w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ else
+ // Add the new constraint `var + w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ break;
+ case LESS_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ // Note that: `w_id != v', so that `expr' is of the form
+ // w_coeff * w + b, with `w_id != v'.
+ if (w_coeff == denominator) {
+ // Add the new constraints `v - w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var, d);
+ else
+ add_octagonal_constraint(n_var + 1, n_w + 1, d);
+ }
+ else if (w_coeff == minus_denom) {
+ // Add the new constraints `v + w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var, d);
+ else
+ add_octagonal_constraint(n_var + 1, n_w, d);
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, minus_denom);
+ // Note that: `w_id != v', so that `expr' is of the form
+ // w_coeff * w + b, with `w_id != v'.
+ if (w_coeff == denominator) {
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `-v + w <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, d);
+ else
+ add_octagonal_constraint(n_var, n_w, d);
+ }
+ else if (w_coeff == minus_denom) {
+ // Add the new constraints `v + w >= b/denominator',
+ // i.e., `-v - w <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, d);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, d);
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Here t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Index of variable that is unbounded in `this'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& double_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_approx_i)) {
+ // Let half = double_approx_i / 2.
+ div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pinf_count;
+ pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_approx_minus_i)) {
+ // Let half = double_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& double_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_approx_minus_i)) {
+ // Let half = double_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pinf_count;
+ pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_approx_i)) {
+ // Let half = double_approx_i / 2.
+ div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards `minus_sc_denom'
+ // and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else
+ // Here `pinf_count == 1'.
+ if (pinf_index != var_id) {
+ const Coefficient& ppi
+ = sc_expr.coefficient(Variable(pinf_index));
+ if (ppi == sc_denom)
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index + 1] = sum;
+ else
+ if (ppi == minus_sc_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index + 1][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index] = sum;
+ }
+ }
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards `minus_sc_denom'
+ // and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom,
+ neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi
+ = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+ break;
+ }
+
+ case LESS_OR_EQUAL:
+ {
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w_id' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ row_reference m_i = *m_iter;
+ ++m_iter;
+ row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc-denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ add_octagonal_constraint(n_var + 1, n_var, double_sum);
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1) {
+ dimension_type pinf_ind = 2*pinf_index;
+ if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ add_octagonal_constraint(pinf_ind, n_var, sum);
+ else
+ add_octagonal_constraint(n_var + 1, pinf_ind + 1, sum);
+ }
+ else {
+ if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+ else
+ add_octagonal_constraint(n_var + 1, pinf_ind, sum);
+ }
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `-sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ for (row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ row_reference m_i = *m_iter;
+ ++m_iter;
+ row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved by rounding upwards `minus_sc_denom' and
+ // negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ add_octagonal_constraint(n_var, n_var + 1, double_sum);
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom,
+ sum);
+ }
+ else if (pinf_count == 1) {
+ dimension_type pinf_ind = 2*pinf_index;
+ if (expr.coefficient(Variable(pinf_index)) == denominator) {
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ add_octagonal_constraint(n_var, pinf_ind, sum);
+ else
+ add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+ }
+ else {
+ if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+ // Add the constraint `v + pinf_index >= -sum',
+ // i.e., `-pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ add_octagonal_constraint(n_var, pinf_ind + 1, sum);
+ else
+ add_octagonal_constraint(pinf_ind, n_var + 1, sum);
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_image(v, e, d)", var_id + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ using std::swap;
+
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Add the constraint `var == b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ const bool sign_symmetry = (w_coeff != denominator);
+ if (!sign_symmetry && b == 0)
+ // The transformation is the identity function.
+ return;
+ // Translate all the constraints on `var' adding or
+ // subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ PPL_DIRTY_TEMP(N, minus_d);
+ div_round_up(minus_d, b, minus_denom);
+ if (sign_symmetry)
+ swap(d, minus_d);
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ ++m_iter;
+ // NOTE: delay update of unary constraints on `var'.
+ for (dimension_type j = n_var; j-- > 0; ) {
+ N& m_v_j = m_v[j];
+ add_assign_r(m_v_j, m_v_j, minus_d, ROUND_UP);
+ N& m_cv_j = m_cv[j];
+ add_assign_r(m_cv_j, m_cv_j, d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_v_j, m_cv_j);
+ }
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+ N& m_i_cv = m_i[n_var + 1];
+ add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_i_v, m_i_cv);
+ }
+ // Now update unary constraints on var.
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ N& m_cv_v = m_cv[n_var];
+ add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+ mul_2exp_assign_r(minus_d, minus_d, 1, ROUND_UP);
+ N& m_v_cv = m_v[n_var + 1];
+ add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_cv_v, m_v_cv);
+ // Note: strong closure is preserved.
+ }
+ else {
+ // Here `w != var', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ // Add the new constraint `var - w = b/denominator'.
+ if (w_coeff == denominator) {
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ }
+ else {
+ // Add the new constraint `var + w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ }
+ incremental_strong_closure_assign(var);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ const row_iterator m_begin = matrix.row_begin();
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ PPL_DIRTY_TEMP(N, double_pos_sum);
+ mul_2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_pos_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != var_id) {
+ const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+ if (ppi == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ if (var_id < pos_pinf_index)
+ matrix[2*pos_pinf_index][n_var] = pos_sum;
+ else
+ matrix[n_var + 1][2*pos_pinf_index + 1] = pos_sum;
+ else
+ if (ppi == minus_sc_denom) {
+ // Add the constraint `v + pos_pinf_index <= pos_sum'.
+ if (var_id < pos_pinf_index)
+ matrix[2*pos_pinf_index + 1][n_var] = pos_sum;
+ else
+ matrix[n_var + 1][2*pos_pinf_index] = pos_sum;
+ }
+ }
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+
+ incremental_strong_closure_assign(var);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::affine_form_image(const Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf) {
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::affine_form_image(Variable, Linear_Form):"
+ " T is not a floating point type.");
+
+ // Dimension-compatibility checks.
+ // The dimension of `lf' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(v, l)", "l", lf);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_form_image(v, l)", var.id() + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lf': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `lf', if any.
+ dimension_type w_id = 0;
+
+ // Get information about the number of non-zero coefficients in `lf'.
+ for (dimension_type i = lf_space_dim; i-- > 0; )
+ if (lf.coefficient(Variable(i)) != 0) {
+ if (t++ == 1)
+ break;
+ else
+ w_id = i;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ using std::swap;
+
+ const dimension_type n_var = 2*var_id;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `lf':
+ // - If t == 0, then lf == [lb, ub];
+ // - If t == 1, then lf == a*w + [lb, ub], where `w' can be `v' or another
+ // variable;
+ // - If t == 2, the `lf' is of the general form.
+
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ if (t == 0) {
+ // Case 1: lf = [lb, ub].
+ forget_all_octagonal_constraints(var_id);
+ mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+ mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+ // Add the constraint `var >= lb && var <= ub'.
+ add_octagonal_constraint(n_var + 1, n_var, b_ub);
+ add_octagonal_constraint(n_var, n_var + 1, b_mlb);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // True if `b' is in [0, 0].
+ bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `lf'.
+ const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id));
+ // True if `w_coeff' is in [1, 1].
+ bool is_w_coeff_one = (w_coeff == 1);
+ // True if `w_coeff' is in [-1, -1].
+ bool is_w_coeff_minus_one = (w_coeff == -1);
+ if (is_w_coeff_one || is_w_coeff_minus_one) {
+ // Case 2: lf = w_coeff*w + b, with w_coeff = [+/-1, +/-1].
+ if (w_id == var_id) {
+ // Here lf = w_coeff*v + b, with w_coeff = [+/-1, +/-1].
+ if (is_w_coeff_one && is_b_zero)
+ // The transformation is the identity function.
+ return;
+ // Translate all the constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_lb'.
+ if (is_w_coeff_minus_one)
+ swap(b_ub, b_mlb);
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ ++m_iter;
+ // NOTE: delay update of unary constraints on `var'.
+ for (dimension_type j = n_var; j-- > 0; ) {
+ N& m_v_j = m_v[j];
+ add_assign_r(m_v_j, m_v_j, b_mlb, ROUND_UP);
+ N& m_cv_j = m_cv[j];
+ add_assign_r(m_cv_j, m_cv_j, b_ub, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_v_j, m_cv_j);
+ }
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, b_ub, ROUND_UP);
+ N& m_i_cv = m_i[n_var + 1];
+ add_assign_r(m_i_cv, m_i_cv, b_mlb, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_i_v, m_i_cv);
+ }
+ // Now update unary constraints on var.
+ mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+ N& m_cv_v = m_cv[n_var];
+ add_assign_r(m_cv_v, m_cv_v, b_ub, ROUND_UP);
+ mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+ N& m_v_cv = m_v[n_var + 1];
+ add_assign_r(m_v_cv, m_v_cv, b_mlb, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_cv_v, m_v_cv);
+ // Note: strong closure is preserved.
+ }
+ else {
+ // Here `w != var', so that `lf' is of the form
+ // [+/-1, +/-1] * w + b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ if (is_w_coeff_one)
+ // Add the new constraints `var - w >= b_lb'
+ // `and var - w <= b_ub'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b_ub);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b_mlb);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b_ub);
+ add_octagonal_constraint(n_var, n_w, b_mlb);
+ }
+ else
+ // Add the new constraints `var + w >= b_lb'
+ // `and var + w <= b_ub'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b_ub);
+ add_octagonal_constraint(n_w, n_var + 1, b_mlb);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b_ub);
+ add_octagonal_constraint(n_var, n_w + 1, b_mlb);
+ }
+ incremental_strong_closure_assign(var);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+ // or t == 1, expr == i*w + b, but i <> [+/-1, +/-1].
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ Linear_Form<FP_Interval_Type> minus_lf(lf);
+ minus_lf.negate();
+
+ // Declare temporaries outside the loop.
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ row_iterator m_iter = matrix.row_begin();
+ m_iter += n_var;
+ row_reference var_ite = *m_iter;
+ ++m_iter;
+ row_reference var_cv_ite = *m_iter;
+ ++m_iter;
+ row_iterator m_end = matrix.row_end();
+
+ // Update binary constraints on var FIRST.
+ for (dimension_type curr_var = var_id,
+ n_curr_var = n_var - 2; curr_var-- > 0; ) {
+ Variable current(curr_var);
+ linear_form_upper_bound(lf + current, upper_bound);
+ assign_r(var_cv_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(var_cv_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(var_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf - current, upper_bound);
+ assign_r(var_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ n_curr_var -= 2;
+ }
+ for (dimension_type curr_var = var_id + 1; m_iter != m_end; ++m_iter) {
+ row_reference m_v_ite = *m_iter;
+ ++m_iter;
+ row_reference m_cv_ite = *m_iter;
+ Variable current(curr_var);
+ linear_form_upper_bound(lf + current, upper_bound);
+ assign_r(m_cv_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(m_v_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(m_cv_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf - current, upper_bound);
+ assign_r(m_v_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ ++curr_var;
+ }
+
+ // Finally, update unary constraints on var.
+ PPL_DIRTY_TEMP(N, lf_ub);
+ linear_form_upper_bound(lf, lf_ub);
+ PPL_DIRTY_TEMP(N, minus_lf_ub);
+ linear_form_upper_bound(minus_lf, minus_lf_ub);
+ mul_2exp_assign_r(lf_ub, lf_ub, 1, ROUND_UP);
+ assign_r(matrix[n_var + 1][n_var], lf_ub, ROUND_NOT_NEEDED);
+ mul_2exp_assign_r(minus_lf_ub, minus_lf_ub, 1, ROUND_UP);
+ assign_r(matrix[n_var][n_var + 1], minus_lf_ub, ROUND_NOT_NEEDED);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::linear_form_upper_bound:"
+ " T not a floating point type.");
+
+ const dimension_type lf_space_dimension = lf.space_dimension();
+ PPL_ASSERT(lf_space_dimension <= space_dim);
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ PPL_DIRTY_TEMP(N, curr_lb);
+ PPL_DIRTY_TEMP(N, curr_ub);
+ PPL_DIRTY_TEMP(N, curr_var_ub);
+ PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+ PPL_DIRTY_TEMP(N, first_comparison_term);
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+
+ PPL_DIRTY_TEMP(N, negator);
+
+ assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+ for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+ ++curr_var) {
+ const FP_Interval_Type& curr_coefficient =
+ lf.coefficient(Variable(curr_var));
+ assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (curr_lb != 0 || curr_ub != 0) {
+ assign_r(curr_var_ub, matrix[n_var + 1][n_var], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(curr_var_ub, curr_var_ub, 1, ROUND_UP);
+ neg_assign_r(curr_minus_var_ub, matrix[n_var][n_var + 1],
+ ROUND_NOT_NEEDED);
+ div_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, 1, ROUND_DOWN);
+ // Optimize the most common case: curr = +/-[1, 1].
+ if (curr_lb == 1 && curr_ub == 1) {
+ add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+ ROUND_UP);
+ }
+ else if (curr_lb == -1 && curr_ub == -1) {
+ neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+ ROUND_NOT_NEEDED);
+ add_assign_r(result, result, negator, ROUND_UP);
+ }
+ else {
+ // Next addend will be the maximum of four quantities.
+ assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+
+ add_assign_r(result, result, first_comparison_term, ROUND_UP);
+ }
+ }
+
+ n_var += 2;
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::
+interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub,
+ const N& int_ub, const N& int_lb,
+ N& result) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::interval_coefficient_upper_bound:"
+ " T not a floating point type.");
+
+ // NOTE: we store the first comparison term directly into result.
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+ PPL_DIRTY_TEMP(N, third_comparison_term);
+ PPL_DIRTY_TEMP(N, fourth_comparison_term);
+
+ assign_r(result, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(third_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(fourth_comparison_term, 0, ROUND_NOT_NEEDED);
+
+ add_mul_assign_r(result, var_ub, int_ub, ROUND_UP);
+ add_mul_assign_r(second_comparison_term, minus_var_ub, int_ub, ROUND_UP);
+ add_mul_assign_r(third_comparison_term, var_ub, int_lb, ROUND_UP);
+ add_mul_assign_r(fourth_comparison_term, minus_var_ub, int_lb, ROUND_UP);
+
+ assign_r(result, std::max(result, second_comparison_term), ROUND_NOT_NEEDED);
+ assign_r(result, std::max(result, third_comparison_term), ROUND_NOT_NEEDED);
+ assign_r(result, std::max(result, fourth_comparison_term), ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", var_id + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr = n; remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == -denominator) {
+ // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, denominator*var - b, w_coeff);
+ }
+ else {
+ // `expr == w_coeff*w + b', where `w != var'.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ }
+ return;
+ }
+ }
+ // General case.
+ // Either t == 2, so that
+ // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t = 1, expr = a*w + b, but a <> +/- denominator.
+ const Coefficient& coeff_v = expr.coefficient(var);
+ if (coeff_v != 0) {
+ if (coeff_v > 0) {
+ // The transformation is invertible.
+ Linear_Expression inverse = ((coeff_v + denominator)*var);
+ inverse -= expr;
+ affine_image(var, inverse, coeff_v);
+ }
+ else {
+ // The transformation is invertible.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_v);
+ neg_assign(minus_coeff_v, coeff_v);
+ Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+ inverse += expr;
+ affine_image(var, inverse, minus_coeff_v);
+ }
+ }
+ else {
+ // The transformation is not invertible: all constraints on `var' are lost.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr ,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+ expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ var_id + 1);
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ return;
+ }
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr = b.
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ // Strong closure is lost.
+ reset_strongly_closed();
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= n/denominator',
+ // i.e., `-var <= -b/denominator'.
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ // Strong closure is not preserved.
+ reset_strongly_closed();
+ if (w_coeff == denominator) {
+ // Translate all the constraints of the form `v - w <= cost'
+ // into the constraint `v - w <= cost + b/denominator';
+ // forget each constraint `w - v <= cost1'.
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ N& m_v_cv = m_v[n_var + 1];
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ N& m_cv_v = m_cv[n_var];
+ ++m_iter;
+ // NOTE: delay update of m_v_cv and m_cv_v.
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+ assign_r(m_i[n_var + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (dimension_type k = n_var; k-- > 0; ) {
+ assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+ }
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+ assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ // Here `w_coeff == -denominator'.
+ // `expr' is of the form: -a*var + b.
+ N& m_v_cv = matrix[n_var][n_var + 1];
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(matrix[n_var + 1][n_var], m_v_cv, d, ROUND_UP);
+ assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_octagonal_constraints(var_id);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is the form
+ // +/- denominator*w + b.
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ if (w_coeff == denominator) {
+ // Add the new constraint `v - w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ else
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ }
+ else {
+ // Add the new constraint `v + w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ else
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, minus_denom);
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ // Strong closure is not preserved.
+ reset_strongly_closed();
+ if (w_coeff == denominator) {
+ // Translate each constraint `w - v <= cost'
+ // into the constraint `w - v <= cost - b/denominator';
+ // forget each constraint `v - w <= cost1'.
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ N& m_v_cv = m_v[n_var + 1];
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ N& m_cv_v = m_cv[n_var];
+ ++m_iter;
+ // NOTE: delay update of m_v_cv and m_cv_v.
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ add_assign_r(m_i[n_var + 1], m_i[n_var + 1], d, ROUND_UP);
+ }
+ for (dimension_type k = n_var; k-- > 0; ) {
+ add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+ assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+ assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ // Here `w_coeff == -denominator'.
+ // `expr' is of the form: -a*var + b.
+ N& m_cv_v = matrix[n_var + 1][n_var];
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(matrix[n_var][n_var + 1], m_cv_v, d, ROUND_UP);
+ assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_octagonal_constraints(var_id);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ // We have got an expression of the following form:
+ // var1 + n, with `var1' != `var'.
+ // We remove all constraints of the form `var (+/- var1) >= const'
+ // and we add the new constraint `var +/- var1 >= n/denominator'.
+ if (w_coeff == denominator) {
+ // Add the new constraint `var - w >= b/denominator',
+ // i.e., `w - var <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ else {
+ // Add the new constraint `var + w >= b/denominator',
+ // i.e., `-w - var <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `v' and add back
+ // a constraint providing an upper or a lower bound for `v'
+ // (depending on `relsym').
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ {
+ // Compute an upper approximation for `sc_expr' into `sum'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ reset_strongly_closed();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != var_id) {
+ const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+ if (pi == denominator ) {
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index + 1] = sum;
+ }
+ else {
+ if (pi == minus_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index + 1][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index] = sum;
+ }
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ reset_strongly_closed();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != var_id) {
+ const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+ if (pi == denominator) {
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ matrix[n_var][2*pinf_index] = sum;
+ else
+ matrix[2*pinf_index + 1][n_var + 1] = sum;
+ }
+ else {
+ if (pi == minus_denom) {
+ // Add the constraint `v + pinf_index >= -sum',
+ // i.e., `-pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ matrix[n_var][2*pinf_index + 1] = sum;
+ else
+ matrix[2*pinf_index][n_var + 1] = sum;
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ incremental_strong_closure_assign(var);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for octagons.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+ // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+ // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+ // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+ // more general form, it will be simply ignored.
+ // TODO: if it is not an octagonal difference, should we compute
+ // approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine images for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT an octagonal difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+
+#else // Currently unnecessarily complex computation.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not an octagonal constraint.
+ affine_image(new_var, rhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // TODO: each one of the following constraints is definitely NOT
+ // an octagonal difference (since it has 3 variables at least).
+ // Thus, the method refine_no_check() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= new_var);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == new_var);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ var_id + 1);
+
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lb_expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+ dimension_type w_id = lb_expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!lb_expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = lb_expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `lb_expr':
+ // - If t == 0, then lb_expr == b, with `b' a constant;
+ // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `lb_expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: lb_expr == b.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Add the constraint `var >= b/denominator'.
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `lb_expr'.
+ const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Here `var' occurs in `lb_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `lb_expr'.
+ // Here `lb_expr' is of the form: +/- denominator * v + b.
+ affine_image(new_var, lb_expr, denominator);
+ // Enforce the strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ // Now apply the affine lower bound, as recorded in `new_var'
+ refine_no_check(var >= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ return;
+ }
+ else {
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ // Here `w != var', so that `lb_expr' is of the form
+ // +/-denominator * w + b.
+ const dimension_type n_w = 2*w_id;
+ // Add the new constraint `var - w >= b/denominator'.
+ if (w_coeff == denominator)
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ else {
+ // Add the new constraint `var + w >= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -lb_expr;
+ const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+
+ // Return immediately if no approximation could be computed.
+ if (neg_pinf_count > 1) {
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ var_id + 1);
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // The image of an empty octagon is empty too.
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+ ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the Octagonal_Shape by adding the constraint induced
+ // by the affine relation.
+ refine(var, relsym, expr, denominator);
+
+ // If the shrunk OS is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // ... otherwise, since the relation was not invertible,
+ // we just forget all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for octagons.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ j_lhs--;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ // If all variables have a zero coefficient, then `lhs' is a constant:
+ // in this case, preimage and image happen to be the same.
+ if (t_lhs == 0) {
+ generalized_affine_image(lhs, relsym, rhs);
+ return;
+ }
+
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine preimages for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_preimage(v, new_relsym, expr, denom);
+ }
+
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT an octagonal difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // Any image of an empty octagon is empty.
+ if (is_empty())
+ return;
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not an octagonal difference.
+ affine_image(new_var, lhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+ // one of the following constraints will be added, because they
+ // are octagonal differences.
+ // Else the following constraints are NOT octagonal differences,
+ // so the method refine_no_check() will ignore them.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(new_var <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(new_var == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(new_var >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ var_id + 1);
+
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ if (ub_expr.coefficient(var) == 0) {
+ refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+ generalized_affine_preimage(var, GREATER_OR_EQUAL,
+ lb_expr, denominator);
+ return;
+ }
+ if (lb_expr.coefficient(var) == 0) {
+ refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ return;
+ }
+
+ const Coefficient& expr_v = lb_expr.coefficient(var);
+ // Here `var' occurs in `lb_expr' and `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ const Linear_Expression lb_inverse
+ = lb_expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ affine_image(new_var, lb_inverse, inverse_denom);
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ if (sgn(denominator) == sgn(inverse_denom))
+ refine_no_check(var >= new_var) ;
+ else
+ refine_no_check(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+}
+
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ row_iterator m_begin = matrix.row_begin();
+ row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(a);
+ PPL_DIRTY_TEMP_COEFFICIENT(b);
+
+ // Go through all the unary constraints in `matrix'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable x(i/2);
+ const N& c_i_ii = (*i_iter)[i + 1];
+ ++i_iter;
+ const N& c_ii_i = (*i_iter)[i];
+ ++i_iter;
+ // Go through unary constraints.
+ if (is_additive_inverse(c_i_ii, c_ii_i)) {
+ // We have a unary equality constraint.
+ numer_denom(c_ii_i, b, a);
+ a *= 2;
+ cs.insert(a*x == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_ii)) {
+ numer_denom(c_i_ii, b, a);
+ a *= 2;
+ cs.insert(-a*x <= b);
+ }
+ if (!is_plus_infinity(c_ii_i)) {
+ numer_denom(c_ii_i, b, a);
+ a *= 2;
+ cs.insert(a*x <= b);
+ }
+ }
+ }
+ // Go through all the binary constraints in `matrix'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ row_reference r_i = *i_iter;
+ ++i_iter;
+ row_reference r_ii = *i_iter;
+ ++i_iter;
+ const Variable y(i/2);
+ for (dimension_type j = 0; j < i; j += 2) {
+ const N& c_i_j = r_i[j];
+ const N& c_ii_jj = r_ii[j + 1];
+ const Variable x(j/2);
+ if (is_additive_inverse(c_ii_jj, c_i_j)) {
+ // We have an equality constraint of the form a*x - a*y = b.
+ numer_denom(c_i_j, b, a);
+ cs.insert(a*x - a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_j)) {
+ numer_denom(c_i_j, b, a);
+ cs.insert(a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(c_ii_jj)) {
+ numer_denom(c_ii_jj, b, a);
+ cs.insert(a*y - a*x <= b);
+ }
+ }
+
+ const N& c_ii_j = r_ii[j];
+ const N& c_i_jj = r_i[j + 1];
+ if (is_additive_inverse(c_i_jj, c_ii_j)) {
+ // We have an equality constraint of the form a*x + a*y = b.
+ numer_denom(c_ii_j, b, a);
+ cs.insert(a*x + a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_jj)) {
+ numer_denom(c_i_jj, b, a);
+ cs.insert(-a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(c_ii_j)) {
+ numer_denom(c_ii_j, b, a);
+ cs.insert(a*x + a*y <= b);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+ // `var' should be one of the dimensions of the vector space.
+ const dimension_type var_id = var.id();
+ if (var_id + 1 > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", var_id + 1);
+
+ // The space dimension of the resulting octagon should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dim)
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Nothing to do, if no dimensions must be added.
+ if (m == 0)
+ return;
+
+ // Keep track of the dimension before adding the new ones.
+ const dimension_type old_num_rows = matrix.num_rows();
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ // For each constraints involving variable `var', we add a
+ // similar constraint with the new variable substituted for
+ // variable `var'.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ const dimension_type n_var = 2*var_id;
+ Row_iterator v_iter = m_begin + n_var;
+ Row_reference m_v = *v_iter;
+ Row_reference m_cv = *(v_iter + 1);
+
+ for (row_iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+ i_iter += 2) {
+ row_reference m_i = *i_iter;
+ row_reference m_ci = *(i_iter + 1);
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = i + 1;
+ m_i[ci] = m_v[n_var + 1];
+ m_ci[i] = m_cv[n_var];
+ for (dimension_type j = 0; j < n_var; ++j) {
+ m_i[j] = m_v[j];
+ m_ci[j] = m_cv[j];
+ }
+ for (dimension_type j = n_var + 2; j < old_num_rows; ++j) {
+ row_iterator j_iter = m_begin + j;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ m_i[j] = m_cj[n_var + 1];
+ m_ci[j] = m_cj[n_var];
+ }
+ }
+ // In general, adding a constraint does not preserve the strong closure
+ // of the octagon.
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ // `dest' should be one of the dimensions of the octagon.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the octagon.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ // Recompute the elements of the row and the column corresponding
+ // to variable `dest' by taking the join of their value with the
+ // value of the corresponding elements in the row and column of the
+ // variable `vars'.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+
+ strong_closure_assign();
+ const dimension_type n_rows = matrix.num_rows();
+ const dimension_type n_dest = 2*dest.id();
+ row_iterator v_iter = m_begin + n_dest;
+ row_reference m_v = *v_iter;
+ row_reference m_cv = *(v_iter + 1);
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ const dimension_type tbf_id = *i;
+ const dimension_type tbf_var = 2*tbf_id;
+ row_iterator tbf_iter = m_begin + tbf_var;
+ row_reference m_tbf = *tbf_iter;
+ row_reference m_ctbf = *(tbf_iter + 1);
+ max_assign(m_v[n_dest + 1], m_tbf[tbf_var + 1]);
+ max_assign(m_cv[n_dest], m_ctbf[tbf_var]);
+
+ const dimension_type min_id = std::min(n_dest, tbf_var);
+ const dimension_type max_id = std::max(n_dest, tbf_var);
+
+ using namespace Implementation::Octagonal_Shapes;
+ for (dimension_type j = 0; j < min_id; ++j) {
+ const dimension_type cj = coherent_index(j);
+ max_assign(m_v[j], m_tbf[j]);
+ max_assign(m_cv[j], m_ctbf[j]);
+ max_assign(m_cv[cj], m_ctbf[cj]);
+ max_assign(m_v[cj], m_tbf[cj]);
+ }
+ for (dimension_type j = min_id + 2; j < max_id; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_iterator j_iter = m_begin + j;
+ row_reference m_j = *j_iter;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ if (n_dest == min_id) {
+ max_assign(m_cj[n_dest + 1], m_tbf[j]);
+ max_assign(m_cj[n_dest], m_ctbf[j]);
+ max_assign(m_j[n_dest], m_ctbf[cj]);
+ max_assign(m_j[n_dest + 1], m_tbf[cj]);
+ }
+ else {
+ max_assign(m_v[j], m_cj[tbf_var + 1]);
+ max_assign(m_cv[j], m_cj[tbf_var]);
+ max_assign(m_cv[cj], m_j[tbf_var]);
+ max_assign(m_v[cj], m_j[tbf_var + 1]);
+ }
+ }
+ for (dimension_type j = max_id + 2; j < n_rows; ++j) {
+ row_iterator j_iter = m_begin + j;
+ row_reference m_j = *j_iter;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ max_assign(m_cj[n_dest + 1], m_cj[tbf_var + 1]);
+ max_assign(m_cj[n_dest], m_cj[tbf_var]);
+ max_assign(m_j[n_dest], m_j[tbf_var]);
+ max_assign(m_j[n_dest + 1], m_j[tbf_var + 1]);
+ }
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+ // FIXME, CHECKME: what about inexact computations?
+
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const Octagonal_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ PPL_ASSERT(x.marked_strongly_closed());
+ PPL_ASSERT(y.marked_strongly_closed());
+ // Pre-compute the upper bound of `x' and `y'.
+ Octagonal_Shape<T> ub(x);
+ ub.upper_bound_assign(y);
+
+ // Compute redundancy information for x and y.
+ // TODO: provide a nicer data structure for redundancy.
+ std::vector<Bit_Row> x_non_red;
+ x.non_redundant_matrix_entries(x_non_red);
+ std::vector<Bit_Row> y_non_red;
+ y.non_redundant_matrix_entries(y_non_red);
+
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, lhs_copy);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+ const dimension_type n_rows = x.matrix.num_rows();
+ const row_iterator x_m_begin = x.matrix.row_begin();
+ const row_iterator y_m_begin = y.matrix.row_begin();
+ const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Bit_Row& x_non_red_i = x_non_red[i];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+ row_reference x_i = *(x_m_begin + i);
+ row_reference y_i = *(y_m_begin + i);
+ row_reference ub_i = *(ub_m_begin + i);
+ const N& ub_i_ci = ub_i[ci];
+ for (dimension_type j = row_size_i; j-- > 0; ) {
+ // Check redundancy of x_i_j.
+ if (!x_non_red_i[j])
+ continue;
+ const N& x_i_j = x_i[j];
+ // Check 1st condition in BHZ09 theorem.
+ if (x_i_j >= y_i[j])
+ continue;
+ const dimension_type cj = coherent_index(j);
+ const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+ row_reference ub_cj = *(ub_m_begin + cj);
+ const N& ub_cj_j = ub_cj[j];
+ for (dimension_type k = 0; k < n_rows; ++k) {
+ const Bit_Row& y_non_red_k = y_non_red[k];
+ const dimension_type ck = coherent_index(k);
+ const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+ row_reference x_k = *(x_m_begin + k);
+ row_reference y_k = *(y_m_begin + k);
+ row_reference ub_k = *(ub_m_begin + k);
+ const N& ub_k_ck = ub_k[ck];
+ // Be careful: for each index h, the diagonal element m[h][h]
+ // is (by convention) +infty in our implementation; however,
+ // BHZ09 theorem assumes that it is equal to 0.
+ const N& ub_k_j
+ = (k == j)
+ ? temp_zero
+ : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+ const N& ub_i_ck
+ = (i == ck)
+ ? temp_zero
+ : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+ for (dimension_type ell = row_size_k; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (!y_non_red_k[ell])
+ continue;
+ const N& y_k_ell = y_k[ell];
+ // Check 2nd condition in BHZ09 theorem.
+ if (y_k_ell >= x_k[ell])
+ continue;
+ const dimension_type cell = coherent_index(ell);
+ row_reference ub_cell = *(ub_m_begin + cell);
+ const N& ub_i_ell
+ = (i == ell)
+ ? temp_zero
+ : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+ const N& ub_cj_ell
+ = (cj == ell)
+ ? temp_zero
+ : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+ // Check 3rd condition in BHZ09 theorem.
+ add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 4th condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 5th condition in BHZ09 theorem.
+ assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+ add_assign_r(lhs, lhs_copy, x_i_j, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_cj_j, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 6th condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_i_ci, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 7th condition of BHZ09 theorem.
+ add_assign_r(lhs, lhs_copy, y_k_ell, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_k_ck, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 8th (last) condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_cell[ell], ROUND_UP);
+ if (lhs < rhs)
+ // All 8 conditions are satisfied:
+ // upper bound is not exact.
+ return false;
+ }
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>
+::integer_upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "Octagonal_Shape<T>::"
+ "integer_upper_bound_assign_if_exact(y):"
+ " T in not an integer datatype.");
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const Octagonal_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+
+ // If `x' or `y' is (known to) contain no integral point,
+ // then the integer upper bound can be computed exactly by tight closure.
+ if (x.marked_empty()) {
+ *this = y;
+ tight_closure_assign();
+ return true;
+ }
+ else if (y.marked_empty()) {
+ tight_closure_assign();
+ return true;
+ }
+ else if (x.is_empty() || x.tight_coherence_would_make_empty()) {
+ *this = y;
+ tight_closure_assign();
+ return true;
+ }
+ else if (y.is_empty() || y.tight_coherence_would_make_empty()) {
+ tight_closure_assign();
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty (and Z-consistent).
+ PPL_ASSERT(x.marked_strongly_closed());
+ PPL_ASSERT(y.marked_strongly_closed());
+ // Pre-compute the integer upper bound of `x' and `y':
+ // have to take copies, since tight closure might modify the rational shape.
+ Octagonal_Shape<T> tx(x);
+ tx.tight_closure_assign();
+ Octagonal_Shape<T> ty(y);
+ ty.tight_closure_assign();
+ Octagonal_Shape<T> ub(tx);
+ ub.upper_bound_assign(ty);
+
+ // Compute redundancy information for tx and ty.
+ // TODO: provide a nicer data structure for redundancy.
+ // NOTE: there is no need to identify all redundancies, since this is
+ // an optimization; hence we reuse the strong-reduction helper methods.
+ std::vector<Bit_Row> tx_non_red;
+ tx.non_redundant_matrix_entries(tx_non_red);
+ std::vector<Bit_Row> ty_non_red;
+ ty.non_redundant_matrix_entries(ty_non_red);
+
+ PPL_DIRTY_TEMP(N, lhs_i_j);
+ PPL_DIRTY_TEMP(N, lhs_k_ell);
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, lhs_copy);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_two);
+ assign_r(temp_two, 2, ROUND_NOT_NEEDED);
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+ const dimension_type n_rows = tx.matrix.num_rows();
+ const row_iterator tx_m_begin = tx.matrix.row_begin();
+ const row_iterator ty_m_begin = ty.matrix.row_begin();
+ const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Bit_Row& tx_non_red_i = tx_non_red[i];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+ row_reference tx_i = *(tx_m_begin + i);
+ row_reference ty_i = *(ty_m_begin + i);
+ row_reference ub_i = *(ub_m_begin + i);
+ const N& ub_i_ci = ub_i[ci];
+ for (dimension_type j = row_size_i; j-- > 0; ) {
+ // Check redundancy of tx_i_j.
+ if (!tx_non_red_i[j])
+ continue;
+ const N& tx_i_j = tx_i[j];
+ const dimension_type cj = coherent_index(j);
+ const N& eps_i_j = (i == cj) ? temp_two : temp_one;
+ // Check condition 1a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs_i_j, tx_i_j, eps_i_j, ROUND_NOT_NEEDED);
+ if (lhs_i_j > ty_i[j])
+ continue;
+ const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+ row_reference ub_cj = *(ub_m_begin + cj);
+ const N& ub_cj_j = ub_cj[j];
+ for (dimension_type k = 0; k < n_rows; ++k) {
+ const Bit_Row& ty_non_red_k = ty_non_red[k];
+ const dimension_type ck = coherent_index(k);
+ const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+ row_reference tx_k = *(tx_m_begin + k);
+ row_reference ty_k = *(ty_m_begin + k);
+ row_reference ub_k = *(ub_m_begin + k);
+ const N& ub_k_ck = ub_k[ck];
+ // Be careful: for each index h, the diagonal element m[h][h]
+ // is (by convention) +infty in our implementation; however,
+ // BHZ09 theorem assumes that it is equal to 0.
+ const N& ub_k_j
+ = (k == j)
+ ? temp_zero
+ : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+ const N& ub_i_ck
+ = (i == ck)
+ ? temp_zero
+ : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+ for (dimension_type ell = row_size_k; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (!ty_non_red_k[ell])
+ continue;
+ const N& ty_k_ell = ty_k[ell];
+ const dimension_type cell = coherent_index(ell);
+ const N& eps_k_ell = (k == cell) ? temp_two : temp_one;
+ // Check condition 1b in BHZ09 Theorem 6.8.
+ add_assign_r(lhs_k_ell, ty_k_ell, eps_k_ell, ROUND_NOT_NEEDED);
+ if (lhs_k_ell > tx_k[ell])
+ continue;
+ row_reference ub_cell = *(ub_m_begin + cell);
+ const N& ub_i_ell
+ = (i == ell)
+ ? temp_zero
+ : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+ const N& ub_cj_ell
+ = (cj == ell)
+ ? temp_zero
+ : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+ // Check condition 2a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs, lhs_i_j, lhs_k_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 2b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 3a in BHZ09 Theorem 6.8.
+ assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+ add_assign_r(lhs, lhs, lhs_i_j, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_cj_j, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 3b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_i_ci, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 4a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs, lhs_copy, lhs_k_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_k_ck, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 4b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_cell[ell], ROUND_NOT_NEEDED);
+ if (lhs <= rhs)
+ // All 8 conditions are satisfied:
+ // integer upper bound is not exact.
+ return false;
+ }
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<T>::is_integer)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ strong_closure_assign();
+ if (space_dim == 0 || marked_empty())
+ return;
+
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ i_end = matrix.element_end(); i != i_end; ++i)
+ drop_some_non_integer_points_helper(*i);
+
+ // Unary constraints should have an even integer boundary.
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci)) {
+ sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ N& mat_ci_i = matrix[ci][i];
+ if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i)) {
+ sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+ return;
+
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+ const Variables_Set::const_iterator v_begin = vars.begin();
+ const Variables_Set::const_iterator v_end = vars.end();
+ PPL_ASSERT(v_begin != v_end);
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = 2 * (*v_i);
+ const dimension_type ci = i + 1;
+ row_reference m_i = matrix[i];
+ row_reference m_ci = matrix[ci];
+
+ // Unary constraints: should be even integers.
+ N& m_i_ci = m_i[ci];
+ if (!is_plus_infinity(m_i_ci)) {
+ drop_some_non_integer_points_helper(m_i_ci);
+ if (!is_even(m_i_ci)) {
+ sub_assign_r(m_i_ci, m_i_ci, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+ N& m_ci_i = m_ci[i];
+ if (!is_plus_infinity(m_ci_i)) {
+ drop_some_non_integer_points_helper(m_ci_i);
+ if (!is_even(m_ci_i)) {
+ sub_assign_r(m_ci_i, m_ci_i, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+
+ // Binary constraints (note: only consider j < i).
+ for (Variables_Set::const_iterator v_j = v_begin; v_j != v_i; ++v_j) {
+ const dimension_type j = 2 * (*v_j);
+ const dimension_type cj = j + 1;
+ drop_some_non_integer_points_helper(m_i[j]);
+ drop_some_non_integer_points_helper(m_i[cj]);
+ drop_some_non_integer_points_helper(m_ci[j]);
+ drop_some_non_integer_points_helper(m_ci[cj]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+void
+Octagonal_Shape<T>
+::export_interval_constraints(U& dest) const {
+ if (space_dim > dest.space_dimension())
+ throw std::invalid_argument(
+ "Octagonal_Shape<T>::export_interval_constraints");
+
+ strong_closure_assign();
+
+ if (marked_empty()) {
+ dest.set_empty();
+ return;
+ }
+
+ PPL_DIRTY_TEMP(N, lb);
+ PPL_DIRTY_TEMP(N, ub);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ const dimension_type ii = 2*i;
+ const dimension_type cii = ii + 1;
+
+ // Set the upper bound.
+ const N& twice_ub = matrix[cii][ii];
+ if (!is_plus_infinity(twice_ub)) {
+ assign_r(ub, twice_ub, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub, ub, 1, ROUND_UP);
+ // FIXME: passing a raw value may not be general enough.
+ if (!dest.restrict_upper(i, ub.raw_value()))
+ return;
+ }
+
+ // Set the lower bound.
+ const N& twice_lb = matrix[ii][cii];
+ if (!is_plus_infinity(twice_lb)) {
+ assign_r(lb, twice_lb, ROUND_NOT_NEEDED);
+ neg_assign_r(lb, lb, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lb, lb, 1, ROUND_DOWN);
+ // FIXME: passing a raw value may not be general enough.
+ if (!dest.restrict_lower(i, lb.raw_value()))
+ return;
+ }
+ }
+
+}
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& oct) {
+ // Handle special cases first.
+ if (oct.marked_empty()) {
+ s << "false";
+ return s;
+ }
+ if (oct.is_universe()) {
+ s << "true";
+ return s;
+ }
+
+ typedef typename Octagonal_Shape<T>::coefficient_type N;
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ // Records whether or not we still have to print the first constraint.
+ bool first = true;
+
+ row_iterator m_begin = oct.matrix.row_begin();
+ row_iterator m_end = oct.matrix.row_end();
+
+ // Temporaries.
+ PPL_DIRTY_TEMP(N, negation);
+ PPL_DIRTY_TEMP(N, half);
+ // Go through all the unary constraints.
+ // (Note: loop iterator is incremented in the loop body.)
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable v_i(i/2);
+ const N& c_i_ii = (*i_iter)[i + 1];
+ ++i_iter;
+ const N& c_ii_i = (*i_iter)[i];
+ ++i_iter;
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_i_ii, c_ii_i)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_ii) && !is_plus_infinity(c_ii_i));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i = bound'.
+ if (div_2exp_assign_r(half, c_ii_i, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " = " << half;
+ else
+ s << "2*" << v_i << " = " << c_ii_i;
+ }
+ else {
+ // We will print unary non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_ii)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ neg_assign_r(negation, c_i_ii, ROUND_NOT_NEEDED);
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i >= negation'.
+ if (div_2exp_assign_r(half, negation, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " >= " << half;
+ else
+ s << "2*" << v_i << " >= " << negation;
+ }
+ if (!is_plus_infinity(c_ii_i)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i <= bound'.
+ if (div_2exp_assign_r(half, c_ii_i, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " <= " << half;
+ else
+ s << "2*" << v_i << " <= " << c_ii_i;
+ }
+ }
+ }
+
+ // Go through all the binary constraints.
+ // (Note: loop iterator is incremented in the loop body.)
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable v_i(i/2);
+ row_reference r_i = *i_iter;
+ ++i_iter;
+ row_reference r_ii = *i_iter;
+ ++i_iter;
+
+ for (dimension_type j = 0; j < i; j += 2) {
+ const Variable v_j(j/2);
+ // Print binary differences.
+ const N& c_ii_jj = r_ii[j + 1];
+ const N& c_i_j = r_i[j];
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_ii_jj, c_i_j)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_j) && !is_plus_infinity(c_ii_jj));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_i_j) >= 0)
+ s << v_j << " - " << v_i << " = " << c_i_j;
+ else
+ s << v_i << " - " << v_j << " = " << c_ii_jj;
+ }
+ else {
+ // We will print non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_i_j) >= 0)
+ s << v_j << " - " << v_i << " <= " << c_i_j;
+ else {
+ neg_assign_r(negation, c_i_j, ROUND_DOWN);
+ s << v_i << " - " << v_j << " >= " << negation;
+ }
+ }
+ if (!is_plus_infinity(c_ii_jj)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_ii_jj) >= 0)
+ s << v_i << " - " << v_j << " <= " << c_ii_jj;
+ else {
+ neg_assign_r(negation, c_ii_jj, ROUND_DOWN);
+ s << v_j << " - " << v_i << " >= " << negation;
+ }
+ }
+ }
+ // Print binary sums.
+ const N& c_i_jj = r_i[j + 1];
+ const N& c_ii_j = r_ii[j];
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_i_jj, c_ii_j)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_jj) && !is_plus_infinity(c_ii_j));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ s << v_j << " + " << v_i << " = " << c_ii_j;
+ }
+ else {
+ // We will print non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_jj)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ neg_assign_r(negation, c_i_jj, ROUND_DOWN);
+ s << v_j << " + " << v_i << " >= " << negation;
+ }
+ if (!is_plus_infinity(c_ii_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ s << v_j << " + " << v_i << " <= " << c_ii_j;
+ }
+ }
+ }
+ }
+ return s;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+ s << "space_dim "
+ << space_dim
+ << "\n";
+ status.ascii_dump(s);
+ s << "\n";
+ matrix.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
+
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> space_dim))
+ return false;
+
+ if (!status.ascii_load(s))
+ return false;
+
+ if (!matrix.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+ return matrix.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+ // Check whether the matrix is well-formed.
+ if (!matrix.OK())
+ return false;
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ return false;
+
+ // All empty octagons are OK.
+ if (marked_empty())
+ return true;
+
+ // 0-dim universe octagon is OK.
+ if (space_dim == 0)
+ return true;
+
+ // MINUS_INFINITY cannot occur at all.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+ for (dimension_type j = i.row_size(); j-- > 0; )
+ if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "Octagonal_Shape::"
+ << "matrix[" << i.index() << "][" << j << "] = "
+ << x_i[j] << "!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // On the main diagonal only PLUS_INFINITY can occur.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ m_end = matrix.row_end(); i != m_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type r = *i;
+ const N& m_i_i = r[i.index()];
+ if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+ const dimension_type j = i.index();
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+ << m_i_i << "! (+inf was expected.)\n";
+#endif
+ return false;
+ }
+ }
+
+ // The following tests might result in false alarms when using floating
+ // point coefficients: they are only meaningful if the coefficient type
+ // base is exact (since otherwise strong closure is approximated).
+ if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+ // Check whether the closure information is legal.
+ if (marked_strongly_closed()) {
+ Octagonal_Shape x = *this;
+ x.reset_strongly_closed();
+ x.strong_closure_assign();
+ if (x.matrix != matrix) {
+#ifndef NDEBUG
+ std::cerr << "Octagonal_Shape is marked as strongly closed "
+ << "but it is not!\n";
+#endif
+ return false;
+ }
+ }
+
+ // A closed octagon must be strong-coherent.
+ if (marked_strongly_closed())
+ if (!is_strong_coherent()) {
+#ifndef NDEBUG
+ std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+ return false;
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const Octagonal_Shape& y) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template <typename C>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_invalid_argument(const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Octagonal_Shape_templates_hh)
diff --git a/src/Octagonal_Shape_types.hh b/src/Octagonal_Shape_types.hh
new file mode 100644
index 0000000..594433f
--- /dev/null
+++ b/src/Octagonal_Shape_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Octagonal_Shape_types_hh
+#define PPL_Octagonal_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+class Octagonal_Shape_Helper;
+
+}
+
+#endif // !defined(PPL_Octagonal_Shape_types_hh)
diff --git a/src/Og_Status_idefs.hh b/src/Og_Status_idefs.hh
new file mode 100644
index 0000000..c4bd280
--- /dev/null
+++ b/src/Og_Status_idefs.hh
@@ -0,0 +1,112 @@
+/* Octagonal_Shape<T>::Status class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Og_Status_idefs_hh
+#define PPL_Og_Status_idefs_hh 1
+
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status_idefs.hh directly; use Octagonal_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the polyhedron is the empty set;
+ - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+ closed, so that all the constraints are as tight as possible.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_strongly_closed() const;
+ void reset_strongly_closed();
+ void set_strongly_closed();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ /*! \brief
+ Writes to \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bitmasks for the individual assertions.
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t STRONGLY_CLOSED = 1U << 1;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bitmask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+
+};
+
+#endif // !defined(PPL_Og_Status_idefs_hh)
diff --git a/src/Og_Status_inlines.hh b/src/Og_Status_inlines.hh
new file mode 100644
index 0000000..228f79f
--- /dev/null
+++ b/src/Og_Status_inlines.hh
@@ -0,0 +1,225 @@
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Og_Status_inlines_hh
+#define PPL_Og_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+ flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+ return test_any(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+ reset(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+ set(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The empty flag is incompatible with any other one."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::Octagonal_Shapes;
+ s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+ << separator
+ << (test_empty() ? yes : no) << empty
+ << separator
+ << separator
+ << (test_strongly_closed() ? yes : no) << strong_closed
+ << separator;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::Octagonal_Shapes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, strong_closed, positive))
+ return false;
+ if (positive)
+ set_strongly_closed();
+ else
+ reset_strongly_closed();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Og_Status_inlines_hh)
diff --git a/src/Opposite_Floating_Point_Expression_defs.hh b/src/Opposite_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..f853769
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_defs.hh
@@ -0,0 +1,193 @@
+/* Declarations for the Opposite_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_defs_hh
+#define PPL_Opposite_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Opposite_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Opposite_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Opposite Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of opposite floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ be an interval linear form and
+ let \f$\adlf\f$ be a sound unary operator on linear forms such that:
+
+ \f[
+ \adlf
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ =
+ \left(\adifp i\right)
+ + \sum_{v \in \cV}\left(\adifp i_{v} \right)v,
+ \f]
+
+ Given a floating point expression \f$\ominus e\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \adlf
+ \left(
+ \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \right).
+ \f]
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with one parameter: builds the opposite floating point
+ expression \f$\ominus\f$ \p op.
+ */
+ explicit Opposite_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op);
+
+ //! Destructor.
+ ~Opposite_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expression represented
+ by \p operand MUST have an associated value in \p int_store.
+ If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Opposite_Floating_Point_Expression& y);
+
+private:
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Opposite_Floating_Point_Expression(
+ const Opposite_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Opposite_Floating_Point_Expression& operator=(
+ const Opposite_Floating_Point_Expression& y);
+
+ //! Pointer to the operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* operand;
+
+}; // class Opposite_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Opposite_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_defs_hh)
diff --git a/src/Opposite_Floating_Point_Expression_inlines.hh b/src/Opposite_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..2e62b56
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,79 @@
+/* Opposite_Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_inlines_hh
+#define PPL_Opposite_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Opposite_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op)
+ : operand(op)
+{
+ assert(op != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Opposite_Floating_Point_Expression() {
+ delete operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Opposite_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(operand, y.operand);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!operand->linearize(int_store, lf_store, result))
+ return false;
+
+ result.negate();
+ return true;
+}
+
+/*! \relates Opposite_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_inlines_hh)
diff --git a/src/Opposite_Floating_Point_Expression_types.hh b/src/Opposite_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..fd8f3a4
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_types_hh
+#define PPL_Opposite_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_types_hh)
diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
new file mode 100644
index 0000000..e02c103
--- /dev/null
+++ b/src/PIP_Problem.cc
@@ -0,0 +1,741 @@
+/* PIP_Problem class implementation: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "PIP_Problem_defs.hh"
+#include "PIP_Tree_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const PIP_Problem& pip) {
+ s << "Space dimension: " << pip.space_dimension();
+ s << "\nConstraints:";
+ for (PIP_Problem::const_iterator i = pip.constraints_begin(),
+ i_end = pip.constraints_end(); i != i_end; ++i)
+ s << "\n" << *i;
+ s << "\nProblem parameters: " << pip.parameter_space_dimensions();
+ if (pip.get_big_parameter_dimension() == not_a_dimension())
+ s << "\nNo big-parameter set.\n";
+ else
+ s << "\nBig-parameter: " << Variable(pip.get_big_parameter_dimension());
+ s << "\n";
+ return s;
+}
+
+PPL::PIP_Problem::PIP_Problem(const dimension_type dim)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ status(PARTIALLY_SATISFIABLE),
+ current_solution(0),
+ input_cs(),
+ first_pending_constraint(0),
+ parameters(),
+ initial_context(),
+ big_parameter_dimension(not_a_dimension()) {
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::PIP_Problem::PIP_Problem(dim):\n"
+ "dim exceeds the maximum allowed "
+ "space dimension.");
+ control_parameters_init();
+ PPL_ASSERT(OK());
+}
+
+PPL::PIP_Problem::PIP_Problem(const PIP_Problem& y)
+ : external_space_dim(y.external_space_dim),
+ internal_space_dim(y.internal_space_dim),
+ status(y.status),
+ current_solution(0),
+ input_cs(y.input_cs),
+ first_pending_constraint(y.first_pending_constraint),
+ parameters(y.parameters),
+ initial_context(y.initial_context),
+ big_parameter_dimension(y.big_parameter_dimension) {
+ if (y.current_solution != 0) {
+ current_solution = y.current_solution->clone();
+ current_solution->set_owner(this);
+ }
+ control_parameters_copy(y);
+ PPL_ASSERT(OK());
+}
+
+PPL::PIP_Problem::~PIP_Problem() {
+ delete current_solution;
+}
+
+void
+PPL::PIP_Problem::control_parameters_init() {
+ control_parameters[CUTTING_STRATEGY] = CUTTING_STRATEGY_FIRST;
+ control_parameters[PIVOT_ROW_STRATEGY] = PIVOT_ROW_STRATEGY_FIRST;
+}
+
+void
+PPL::PIP_Problem::control_parameters_copy(const PIP_Problem& y) {
+ for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+ control_parameters[i] = y.control_parameters[i];
+}
+
+PPL::PIP_Problem_Status
+PPL::PIP_Problem::solve() const {
+ switch (status) {
+
+ case UNSATISFIABLE:
+ PPL_ASSERT(OK());
+ return UNFEASIBLE_PIP_PROBLEM;
+
+ case OPTIMIZED:
+ PPL_ASSERT(OK());
+ return OPTIMIZED_PIP_PROBLEM;
+
+ case PARTIALLY_SATISFIABLE:
+ {
+ PIP_Problem& x = const_cast<PIP_Problem&>(*this);
+ // Allocate PIP solution tree root, if needed.
+ if (current_solution == 0)
+ x.current_solution = new PIP_Solution_Node(this);
+
+ // Properly resize context matrix.
+ const dimension_type new_num_cols = parameters.size() + 1;
+ const dimension_type old_num_cols = initial_context.num_columns();
+ if (old_num_cols < new_num_cols)
+ x.initial_context.add_zero_columns(new_num_cols - old_num_cols);
+
+ // Computed once for all (to be used inside loop).
+ const Variables_Set::const_iterator param_begin = parameters.begin();
+ const Variables_Set::const_iterator param_end = parameters.end();
+
+ // This flag will be set if we insert a pending constraint
+ // in the initial context.
+ bool check_feasible_context = false;
+
+ // Go through all pending constraints.
+ for (Constraint_Sequence::const_iterator
+ cs_i = nth_iter(input_cs, first_pending_constraint),
+ cs_end = input_cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ const dimension_type c_space_dim = c.space_dimension();
+ PPL_ASSERT(external_space_dim >= c_space_dim);
+
+ // Constraints having a non-zero variable coefficient
+ // should not be inserted in context.
+ if (!c.expression().all_zeroes_except(parameters, 1, c_space_dim + 1))
+ continue;
+
+ check_feasible_context = true;
+
+ x.initial_context.add_zero_rows(1);
+
+ Row& row = x.initial_context[x.initial_context.num_rows()-1];
+
+ {
+ Row::iterator itr = row.end();
+
+ if (c.inhomogeneous_term() != 0) {
+ itr = row.insert(0, c.inhomogeneous_term());
+ // Adjust inhomogeneous term if strict.
+ if (c.is_strict_inequality())
+ --(*itr);
+ }
+ else {
+ // Adjust inhomogeneous term if strict.
+ if (c.is_strict_inequality())
+ itr = row.insert(0, -1);
+ }
+ dimension_type i = 1;
+
+ // TODO: This loop may be optimized more, if needed.
+ // If the size of param_end is expected to be greater than the
+ // number of nonzeroes of c in most cases, then this implementation
+ // can't be optimized further.
+ // itr may still be end(), but it can still be used as hint.
+ for (Variables_Set::const_iterator
+ pi = param_begin; pi != param_end; ++pi, ++i) {
+ if (*pi < c_space_dim) {
+ Coefficient_traits::const_reference coeff_pi
+ = c.coefficient(Variable(*pi));
+ if (coeff_pi != 0)
+ itr = row.insert(itr, i, coeff_pi);
+ }
+ else
+ break;
+ }
+ }
+
+ // If it is an equality, also insert its negation.
+ if (c.is_equality()) {
+ x.initial_context.add_zero_rows(1);
+
+ // The reference `row' has been invalidated.
+
+ Row& last_row = x.initial_context[x.initial_context.num_rows()-1];
+
+ last_row = x.initial_context[x.initial_context.num_rows()-2];
+
+ for (Row::iterator i = last_row.begin(),
+ i_end = last_row.end(); i != i_end; ++i)
+ neg_assign(*i);
+ }
+ }
+
+ if (check_feasible_context) {
+ // Check for feasibility of initial context.
+ Matrix<Row> ctx_copy(initial_context);
+ if (!PIP_Solution_Node::compatibility_check(ctx_copy)) {
+ // Problem found to be unfeasible.
+ delete x.current_solution;
+ x.current_solution = 0;
+ x.status = UNSATISFIABLE;
+ PPL_ASSERT(OK());
+ return UNFEASIBLE_PIP_PROBLEM;
+ }
+ }
+
+ // Update tableau and mark constraints as no longer pending.
+ x.current_solution->update_tableau(*this,
+ external_space_dim,
+ first_pending_constraint,
+ input_cs,
+ parameters);
+ x.internal_space_dim = external_space_dim;
+ x.first_pending_constraint = input_cs.size();
+
+ // Actually solve problem.
+ x.current_solution = x.current_solution->solve(*this,
+ check_feasible_context,
+ initial_context,
+ parameters,
+ external_space_dim,
+ /*indent_level=*/ 0);
+ // Update problem status.
+ x.status = (x.current_solution != 0) ? OPTIMIZED : UNSATISFIABLE;
+
+ PPL_ASSERT(OK());
+ return (x.current_solution != 0)
+ ? OPTIMIZED_PIP_PROBLEM
+ : UNFEASIBLE_PIP_PROBLEM;
+ } // End of handler for PARTIALLY_SATISFIABLE case.
+
+ } // End of switch.
+
+ // We should not be here!
+ PPL_UNREACHABLE;
+ return UNFEASIBLE_PIP_PROBLEM;
+}
+
+PPL::PIP_Tree
+PPL::PIP_Problem::solution() const {
+ if (status == PARTIALLY_SATISFIABLE)
+ solve();
+ return current_solution;
+}
+
+PPL::PIP_Tree
+PPL::PIP_Problem::optimizing_solution() const {
+ if (status == PARTIALLY_SATISFIABLE)
+ solve();
+ return current_solution;
+}
+
+bool
+PPL::PIP_Problem::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ if (external_space_dim < internal_space_dim) {
+#ifndef NDEBUG
+ cerr << "The internal space dimension of the PIP_Problem is "
+ << "greater than its external space dimension."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ // Constraint system should be space dimension compatible.
+ const dimension_type input_cs_num_rows = input_cs.size();
+ for (dimension_type i = input_cs_num_rows; i-- > 0; ) {
+ if (input_cs[i].space_dimension() > external_space_dim) {
+#ifndef NDEBUG
+ cerr << "The space dimension of the PIP_Problem is smaller than "
+ << "the space dimension of one of its constraints."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+
+ // Test validity of control parameter values.
+ Control_Parameter_Value strategy = control_parameters[CUTTING_STRATEGY];
+ if (strategy != CUTTING_STRATEGY_FIRST
+ && strategy != CUTTING_STRATEGY_DEEPEST
+ && strategy != CUTTING_STRATEGY_ALL) {
+#ifndef NDEBUG
+ cerr << "Invalid value for the CUTTING_STRATEGY control parameter."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ strategy = control_parameters[PIVOT_ROW_STRATEGY];
+ if (strategy < PIVOT_ROW_STRATEGY_FIRST
+ || strategy > PIVOT_ROW_STRATEGY_MAX_COLUMN) {
+#ifndef NDEBUG
+ cerr << "Invalid value for the PIVOT_ROW_STRATEGY control parameter."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (big_parameter_dimension != not_a_dimension()
+ && parameters.count(big_parameter_dimension) == 0) {
+#ifndef NDEBUG
+ cerr << "The big parameter is set, but it is not a parameter." << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+
+ if (!parameters.OK())
+ return false;
+ if (!initial_context.OK())
+ return false;
+
+ if (current_solution != 0) {
+ // Check well formedness of the solution tree.
+ if (!current_solution->OK()) {
+#ifndef NDEBUG
+ cerr << "The computed solution tree is broken.\n";
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ // Check that all nodes in the solution tree belong to *this.
+ if (!current_solution->check_ownership(this)) {
+#ifndef NDEBUG
+ cerr << "There are nodes in the solution tree "
+ << "that are not owned by *this.\n";
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+void
+PPL::PIP_Problem::ascii_dump(std::ostream& s) const {
+ using namespace IO_Operators;
+ s << "\nexternal_space_dim: " << external_space_dim << "\n";
+ s << "\ninternal_space_dim: " << internal_space_dim << "\n";
+
+ const dimension_type input_cs_size = input_cs.size();
+
+ s << "\ninput_cs( " << input_cs_size << " )\n";
+ for (dimension_type i = 0; i < input_cs_size; ++i)
+ input_cs[i].ascii_dump(s);
+
+ s << "\nfirst_pending_constraint: " << first_pending_constraint << "\n";
+
+ s << "\nstatus: ";
+ switch (status) {
+ case UNSATISFIABLE:
+ s << "UNSATISFIABLE";
+ break;
+ case OPTIMIZED:
+ s << "OPTIMIZED";
+ break;
+ case PARTIALLY_SATISFIABLE:
+ s << "PARTIALLY_SATISFIABLE";
+ break;
+ }
+ s << "\n";
+
+ s << "\nparameters";
+ parameters.ascii_dump(s);
+
+ s << "\ninitial_context\n";
+ initial_context.ascii_dump(s);
+
+ s << "\ncontrol_parameters\n";
+ for (dimension_type i = 0; i < CONTROL_PARAMETER_NAME_SIZE; ++i) {
+ const Control_Parameter_Value value = control_parameters[i];
+ switch (value) {
+ case CUTTING_STRATEGY_FIRST:
+ s << "CUTTING_STRATEGY_FIRST";
+ break;
+ case CUTTING_STRATEGY_DEEPEST:
+ s << "CUTTING_STRATEGY_DEEPEST";
+ break;
+ case CUTTING_STRATEGY_ALL:
+ s << "CUTTING_STRATEGY_ALL";
+ break;
+ case PIVOT_ROW_STRATEGY_FIRST:
+ s << "PIVOT_ROW_STRATEGY_FIRST";
+ break;
+ case PIVOT_ROW_STRATEGY_MAX_COLUMN:
+ s << "PIVOT_ROW_STRATEGY_MAX_COLUMN";
+ break;
+ default:
+ s << "Invalid control parameter value";
+ }
+ s << "\n";
+ }
+
+ s << "\nbig_parameter_dimension: " << big_parameter_dimension << "\n";
+
+ s << "\ncurrent_solution: ";
+ if (current_solution == 0)
+ s << "BOTTOM\n";
+ else if (const PIP_Decision_Node* const dec
+ = current_solution->as_decision()) {
+ s << "DECISION\n";
+ dec->ascii_dump(s);
+ }
+ else {
+ const PIP_Solution_Node* const sol = current_solution->as_solution();
+ PPL_ASSERT(sol != 0);
+ s << "SOLUTION\n";
+ sol->ascii_dump(s);
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(PIP_Problem)
+
+bool
+PPL::PIP_Problem::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "external_space_dim:")
+ return false;
+
+ if (!(s >> external_space_dim))
+ return false;
+
+ if (!(s >> str) || str != "internal_space_dim:")
+ return false;
+
+ if (!(s >> internal_space_dim))
+ return false;
+
+ if (!(s >> str) || str != "input_cs(")
+ return false;
+
+ dimension_type input_cs_size;
+
+ if (!(s >> input_cs_size))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ Constraint c(Constraint::zero_dim_positivity());
+ for (dimension_type i = 0; i < input_cs_size; ++i) {
+ if (!c.ascii_load(s))
+ return false;
+ input_cs.push_back(c);
+ }
+
+ if (!(s >> str) || str != "first_pending_constraint:")
+ return false;
+
+ if (!(s >> first_pending_constraint))
+ return false;
+
+ if (!(s >> str) || str != "status:")
+ return false;
+
+ if (!(s >> str))
+ return false;
+
+ if (str == "UNSATISFIABLE")
+ status = UNSATISFIABLE;
+ else if (str == "OPTIMIZED")
+ status = OPTIMIZED;
+ else if (str == "PARTIALLY_SATISFIABLE")
+ status = PARTIALLY_SATISFIABLE;
+ else
+ return false;
+
+ if (!(s >> str) || str != "parameters")
+ return false;
+
+ if (!parameters.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "initial_context")
+ return false;
+
+ if (!initial_context.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "control_parameters")
+ return false;
+
+ for (dimension_type i = 0; i < CONTROL_PARAMETER_NAME_SIZE; ++i) {
+ if (!(s >> str))
+ return false;
+ Control_Parameter_Value value;
+ if (str == "CUTTING_STRATEGY_FIRST")
+ value = CUTTING_STRATEGY_FIRST;
+ else if (str == "CUTTING_STRATEGY_DEEPEST")
+ value = CUTTING_STRATEGY_DEEPEST;
+ else if (str == "CUTTING_STRATEGY_ALL")
+ value = CUTTING_STRATEGY_ALL;
+ else if (str == "PIVOT_ROW_STRATEGY_FIRST")
+ value = PIVOT_ROW_STRATEGY_FIRST;
+ else if (str == "PIVOT_ROW_STRATEGY_MAX_COLUMN")
+ value = PIVOT_ROW_STRATEGY_MAX_COLUMN;
+ else
+ return false;
+ control_parameters[i] = value;
+ }
+
+ if (!(s >> str) || str != "big_parameter_dimension:")
+ return false;
+ if (!(s >> big_parameter_dimension))
+ return false;
+
+ // Release current_solution tree (if any).
+ delete current_solution;
+ current_solution = 0;
+ // Load current_solution (if any).
+ if (!(s >> str) || str != "current_solution:")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "BOTTOM")
+ current_solution = 0;
+ else if (str == "DECISION") {
+ PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+ current_solution = dec;
+ if (!dec->ascii_load(s))
+ return false;
+ dec->set_owner(this);
+ }
+ else if (str == "SOLUTION") {
+ PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+ current_solution = sol;
+ if (!sol->ascii_load(s))
+ return false;
+ sol->set_owner(this);
+ }
+ else
+ // Unknown node kind.
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PPL::PIP_Problem::clear() {
+ external_space_dim = 0;
+ internal_space_dim = 0;
+ status = PARTIALLY_SATISFIABLE;
+ if (current_solution != 0) {
+ delete current_solution;
+ current_solution = 0;
+ }
+ input_cs.clear();
+ first_pending_constraint = 0;
+ parameters.clear();
+ initial_context.clear();
+ control_parameters_init();
+ big_parameter_dimension = not_a_dimension();
+}
+
+void
+PPL::PIP_Problem
+::add_space_dimensions_and_embed(const dimension_type m_vars,
+ const dimension_type m_params) {
+ // Adding no space dims at all is a no-op:
+ // this avoids invalidating problem status (if it was optimized).
+ if (m_vars == 0 && m_params == 0)
+ return;
+
+ // The space dimension of the resulting PIP problem should not
+ // overflow the maximum allowed space dimension.
+ dimension_type available = max_space_dimension() - space_dimension();
+ bool should_throw = (m_vars > available);
+ if (!should_throw) {
+ available -= m_vars;
+ should_throw = (m_params > available);
+ }
+ if (should_throw)
+ throw std::length_error("PPL::PIP_Problem::"
+ "add_space_dimensions_and_embed(m_v, m_p):\n"
+ "adding m_v+m_p new space dimensions exceeds "
+ "the maximum allowed space dimension.");
+ // First add PIP variables ...
+ external_space_dim += m_vars;
+ // ... then add PIP parameters.
+ for (dimension_type i = m_params; i-- > 0; ) {
+ parameters.insert(Variable(external_space_dim));
+ ++external_space_dim;
+ }
+ // Update problem status.
+ if (status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::PIP_Problem
+::add_to_parameter_space_dimensions(const Variables_Set& p_vars) {
+ if (p_vars.space_dimension() > external_space_dim)
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "add_to_parameter_space_dimension(p_vars):\n"
+ "*this and p_vars are dimension "
+ "incompatible.");
+ const dimension_type original_size = parameters.size();
+ parameters.insert(p_vars.begin(), p_vars.end());
+ // Do not allow to turn variables into parameters.
+ for (Variables_Set::const_iterator p = p_vars.begin(),
+ end = p_vars.end(); p != end; ++p) {
+ if (*p < internal_space_dim) {
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "add_to_parameter_space_dimension(p_vars):"
+ "p_vars contain variable indices.");
+ }
+ }
+
+ // If a new parameter was inserted, set the internal status to
+ // PARTIALLY_SATISFIABLE.
+ if (parameters.size() != original_size && status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+}
+
+void
+PPL::PIP_Problem::add_constraint(const Constraint& c) {
+ if (c.space_dimension() > external_space_dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Problem::add_constraint(c):\n"
+ << "dim == "<< external_space_dim << " and c.space_dimension() == "
+ << c.space_dimension() << " are dimension incompatible.";
+ throw std::invalid_argument(s.str());
+ }
+ input_cs.push_back(c);
+ // Update problem status.
+ if (status != UNSATISFIABLE)
+ status = PARTIALLY_SATISFIABLE;
+}
+
+void
+PPL::PIP_Problem::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator ci = cs.begin(),
+ ci_end = cs.end(); ci != ci_end; ++ci)
+ add_constraint(*ci);
+}
+
+bool
+PPL::PIP_Problem::is_satisfiable() const {
+ if (status == PARTIALLY_SATISFIABLE)
+ solve();
+ return status == OPTIMIZED;
+}
+
+void
+PPL::PIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+ switch (value) {
+ case CUTTING_STRATEGY_FIRST:
+ // Intentionally fall through.
+ case CUTTING_STRATEGY_DEEPEST:
+ // Intentionally fall through.
+ case CUTTING_STRATEGY_ALL:
+ control_parameters[CUTTING_STRATEGY] = value;
+ break;
+ case PIVOT_ROW_STRATEGY_FIRST:
+ // Intentionally fall through.
+ case PIVOT_ROW_STRATEGY_MAX_COLUMN:
+ control_parameters[PIVOT_ROW_STRATEGY] = value;
+ break;
+ default:
+ throw std::invalid_argument("PPL::PIP_Problem::set_control_parameter(v)"
+ ":\ninvalid value.");
+ }
+}
+
+void
+PPL::PIP_Problem::set_big_parameter_dimension(dimension_type big_dim) {
+ if (parameters.count(big_dim) == 0)
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "set_big_parameter_dimension(big_dim):\n"
+ "dimension 'big_dim' is not a parameter.");
+ if (big_dim < internal_space_dim)
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "set_big_parameter_dimension(big_dim):\n"
+ "only newly-added parameters can be"
+ "converted into the big parameter.");
+ big_parameter_dimension = big_dim;
+}
+
+PPL::memory_size_type
+PPL::PIP_Problem::external_memory_in_bytes() const {
+ memory_size_type n = initial_context.external_memory_in_bytes();
+ // Adding the external memory for `current_solution'.
+ if (current_solution != 0)
+ n += current_solution->total_memory_in_bytes();
+ // Adding the external memory for `input_cs'.
+ n += input_cs.capacity() * sizeof(Constraint);
+ for (const_iterator i = input_cs.begin(),
+ i_end = input_cs.end(); i != i_end; ++i)
+ n += (i->external_memory_in_bytes());
+ // FIXME: Adding the external memory for `parameters'.
+ n += parameters.size() * sizeof(dimension_type);
+
+ return n;
+}
+
+PPL::memory_size_type
+PPL::PIP_Problem::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+void
+PPL::PIP_Problem::print_solution(std::ostream& s, int indent) const {
+ switch (status) {
+
+ case UNSATISFIABLE:
+ PPL_ASSERT(current_solution == 0);
+ PIP_Tree_Node::indent_and_print(s, indent, "_|_\n");
+ break;
+
+ case OPTIMIZED:
+ PPL_ASSERT(current_solution != 0);
+ current_solution->print(s, indent);
+ break;
+
+ case PARTIALLY_SATISFIABLE:
+ throw std::logic_error("PIP_Problem::print_solution():\n"
+ "the PIP problem has not been solved.");
+ }
+}
+
diff --git a/src/PIP_Problem_defs.hh b/src/PIP_Problem_defs.hh
new file mode 100644
index 0000000..c4f89d8
--- /dev/null
+++ b/src/PIP_Problem_defs.hh
@@ -0,0 +1,834 @@
+/* PIP_Problem class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_defs_hh
+#define PPL_PIP_Problem_defs_hh 1
+
+#include "PIP_Problem_types.hh"
+#include "PIP_Tree_types.hh"
+#include "globals_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_defs.hh"
+#include "Variables_Set_defs.hh"
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+#include "Matrix_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const PIP_Problem& pip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Problem */
+void swap(PIP_Problem& x, PIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Parametric Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+ An object of this class encodes a parametric integer (linear)
+ programming problem. The PIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the subset of those dimensions of the vector space that are
+ interpreted as integer parameters (the other space dimensions
+ are interpreted as non-parameter integer variables);
+ - a finite set of linear equality and (strict or non-strict)
+ inequality constraints involving variables and/or parameters;
+ these constraints are used to define:
+ - the <EM>feasible region</EM>, if they involve one or more
+ problem variable (and maybe some parameters);
+ - the <EM>initial context</EM>, if they only involve the
+ parameters;
+ - optionally, the so-called <EM>big parameter</EM>,
+ i.e., a problem parameter to be considered arbitrarily big.
+
+ Note that all problem variables and problem parameters are assumed
+ to take non-negative integer values, so that there is no need
+ to specify non-negativity constraints.
+
+ The class provides support for the (incremental) solution of the
+ PIP problem based on variations of the revised simplex method and
+ on Gomory cut generation techniques.
+
+ The solution for a PIP problem is the lexicographic minimum of the
+ integer points of the feasible region, expressed in terms of the
+ parameters. As the problem to be solved only involves non-negative
+ variables and parameters, the problem will always be either unfeasible
+ or optimizable.
+
+ As the feasibility and the solution value of a PIP problem depend on the
+ values of the parameters, the solution is a binary decision tree,
+ dividing the context parameter set into subsets.
+ The tree nodes are of two kinds:
+ - \e Decision nodes.
+ These are internal tree nodes encoding one or more linear tests
+ on the parameters; if all the tests are satisfied, then the solution
+ is the node's \e true child; otherwise, the solution is the node's
+ \e false child;
+ - \e Solution nodes.
+ These are leaf nodes in the tree, encoding the solution of the problem
+ in the current context subset, where each variable is defined in terms
+ of a linear expression of the parameters.
+ Solution nodes also optionally embed a set of parameter constraints:
+ if all these constraints are satisfied, the solution is described by
+ the node, otherwise the problem has no solution.
+
+ It may happen that a decision node has no \e false child. This means
+ that there is no solution if at least one of the corresponding
+ constraints is not satisfied. Decision nodes having two or more linear
+ tests on the parameters cannot have a \e false child. Decision nodes
+ always have a \e true child.
+
+ Both kinds of tree nodes may also contain the definition of extra
+ parameters which are artificially introduced by the solver to enforce
+ an integral solution. Such artificial parameters are defined by
+ the integer division of a linear expression on the parameters
+ by an integer coefficient.
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given PIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of parameters
+ and the addition of constraints.
+
+ \par Example problem
+ An example PIP problem can be defined the following:
+ \code
+ 3*j >= -2*i+8
+ j <= 4*i - 4
+ i <= n
+ j <= m
+ \endcode
+ where \c i and \c j are the problem variables
+ and \c n and \c m are the problem parameters.
+ This problem can be optimized; the resulting solution tree may be
+ represented as follows:
+ \verbatim
+ if 7*n >= 10 then
+ if 7*m >= 12 then
+ {i = 2 ; j = 2}
+ else
+ Parameter P = (m) div 2
+ if 2*n + 3*m >= 8 then
+ {i = -m - P + 4 ; j = m}
+ else
+ _|_
+ else
+ _|_
+ \endverbatim
+ The solution tree starts with a decision node depending on the
+ context constraint <code>7*n >= 10</code>.
+ If this constraint is satisfied by the values assigned to the
+ problem parameters, then the (textually first) \c then branch is taken,
+ reaching the \e true child of the root node (which in this case
+ is another decision node); otherwise, the (textually last) \c else
+ branch is taken, for which there is no corresponding \e false child.
+ \par
+ The \f$\perp\f$ notation, also called \e bottom, denotes the
+ lexicographic minimum of an empty set of solutions,
+ here meaning the corresponding subproblem is unfeasible.
+ \par
+ Notice that a tree node may introduce new (non-problem) parameters,
+ as is the case for parameter \c P in the (textually first) \c else
+ branch above. These \e artificial parameters are only meaningful
+ inside the subtree where they are defined and are used to define
+ the parametric values of the problem variables in solution nodes
+ (e.g., the <CODE>{i,j}</CODE> vector in the textually third \c then branch).
+
+ \par Context restriction
+ The above solution is correct in an unrestricted initial context,
+ meaning all possible values are allowed for the parameters. If we
+ restrict the context with the following parameter inequalities:
+ \code
+ m >= n
+ n >= 5
+ \endcode
+ then the resulting optimizing tree will be a simple solution node:
+ \verbatim
+ {i = 2 ; j = 2}
+ \endverbatim
+
+ \par Creating the PIP_Problem object
+ The PIP_Problem object corresponding to the above example can be
+ created as follows:
+ \code
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ \endcode
+ If you want to restrict the initial context, simply add the parameter
+ constraints the same way as for normal constraints.
+ \code
+ cs.insert(m >= n);
+ cs.insert(n >= 5);
+ \endcode
+
+ \par Solving the problem
+ Once the PIP_Problem object has been created, you can start the
+ resolution of the problem by calling the solve() method:
+ \code
+ PIP_Problem_Status status = pip.solve();
+ \endcode
+ where the returned \c status indicates if the problem has been optimized
+ or if it is unfeasible for any possible configuration of the parameter
+ values. The resolution process is also started if an attempt is made
+ to get its solution, as follows:
+ \code
+ const PIP_Tree_Node* node = pip.solution();
+ \endcode
+ In this case, an unfeasible problem will result in an empty solution
+ tree, i.e., assigning a null pointer to \c node.
+
+ \par Printing the solution tree
+ A previously computed solution tree may be printed as follows:
+ \code
+ pip.print_solution(std::cout);
+ \endcode
+ This will produce the following output (note: variables and parameters
+ are printed according to the default output function; see
+ <code>Variable::set_output_function</code>):
+ \verbatim
+ if 7*C >= 10 then
+ if 7*D >= 12 then
+ {2 ; 2}
+ else
+ Parameter E = (D) div 2
+ if 2*C + 3*D >= 8 then
+ {-D - E + 4 ; D}
+ else
+ _|_
+ else
+ _|_
+ \endverbatim
+
+ \par Spanning the solution tree
+ A parameter assignment for a PIP problem binds each of the problem
+ parameters to a non-negative integer value. After fixing a parameter
+ assignment, the ``spanning'' of the PIP problem solution tree refers
+ to the process whereby the solution tree is navigated, starting from
+ the root node: the value of artificial parameters is computed according
+ to the parameter assignment and the node's constraints are evaluated,
+ thereby descending in either the true or the false subtree of decision
+ nodes and eventually reaching a solution node or a bottom node.
+ If a solution node is found, each of the problem variables is provided
+ with a parametric expression, which can be evaluated to a fixed value
+ using the given parameter assignment and the computed values for
+ artificial parameters.
+ \par
+ The coding of the spanning process can be done as follows.
+ First, the root of the PIP solution tree is retrieved:
+ \code
+ const PIP_Tree_Node* node = pip.solution();
+ \endcode
+ If \c node represents an unfeasible solution (i.e., \f$\perp\f$),
+ its value will be \c 0. For a non-null tree node, the virtual methods
+ \c PIP_Tree_Node::as_decision() and \c PIP_Tree_Node::as_solution()
+ can be used to check whether the node is a decision or a solution node:
+ \code
+ const PIP_Solution_Node* sol = node->as_solution();
+ if (sol != 0) {
+ // The node is a solution node
+ ...
+ }
+ else {
+ // The node is a decision node
+ const PIP_Decision_Node* dec = node->as_decision();
+ ...
+ }
+ \endcode
+ \par
+ The true (resp., false) child node of a Decision Node may be accessed by
+ using method \c PIP_Decision_Node::child_node(bool), passing \c true
+ (resp., \c false) as the input argument.
+
+ \par Artificial parameters
+ A PIP_Tree_Node::Artificial_Parameter object represents the result
+ of the integer division of a Linear_Expression (on the other
+ parameters, including the previously-defined artificials)
+ by an integer denominator (a Coefficient object).
+ The dimensions of the artificial parameters (if any) in a tree node
+ have consecutive indices starting from <code>dim+1</code>, where the value
+ of \c dim is computed as follows:
+ - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+ - for any other node of the tree, it is recursively obtained by adding
+ the value of \c dim computed for the parent node to the number of
+ artificial parameters defined in the parent node.
+ \par
+ Since the numbering of dimensions for artificial parameters follows
+ the rule above, the addition of new problem variables and/or new problem
+ parameters to an already solved PIP_Problem object (as done when
+ incrementally solving a problem) will result in the systematic
+ renumbering of all the existing artificial parameters.
+
+ \par Node constraints
+ All kind of tree nodes can contain context constraints.
+ Decision nodes always contain at least one of them.
+ The node's local constraint system can be obtained using method
+ PIP_Tree_Node::constraints.
+ These constraints only involve parameters, including both the problem
+ parameters and the artificial parameters that have been defined
+ in nodes occurring on the path from the root node to the current node.
+ The meaning of these constraints is as follows:
+ - On a decision node, if all tests in the constraints are true, then the
+ solution is the \e true child; otherwise it is the \e false child.
+ - On a solution node, if the (possibly empty) system of constraints
+ evaluates to true for a given parameter assignment, then the solution
+ is described by the node; otherwise the solution is \f$\perp\f$
+ (i.e., the problem is unfeasible for that parameter assignment).
+
+ \par Getting the optimal values for the variables
+ After spanning the solution tree using the given parameter assignment,
+ if a solution node has been reached, then it is possible to retrieve
+ the parametric expression for each of the problem variables using
+ method PIP_Solution_Node::parametric_values. The retrieved expression
+ will be defined in terms of all the parameters (problem parameters
+ and artificial parameters defined along the path).
+
+ \par Solving maximization problems
+ You can solve a lexicographic maximization problem by reformulating its
+ constraints using variable substitution. Proceed the following steps:
+ - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+ which we will call \f$M\f$.
+ - Reformulate each of the maximization problem constraints by
+ substituting each \f$x_i\f$ variable with an expression of the form
+ \f$M-x'_i\f$, where the \f$x'_i\f$ variables are positive variables to
+ be minimized.
+ - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+ - In the solution expressions, the values of the \f$x'\f$ variables will
+ be expressed in the form: \f$x'_i = M-x_i\f$. To get back the value of
+ the expression of each \f$x_i\f$ variable, just apply the
+ formula: \f$x_i = M-x'_i\f$.
+ \par
+ Note that if the resulting expression of one of the \f$x'_i\f$ variables
+ is not in the \f$x'_i = M-x_i\f$ form, this means that the
+ sign-unrestricted problem is unbounded.
+ \par
+ You can choose to maximize only a subset of the variables while minimizing
+ the other variables. In that case, just apply the variable substitution
+ method on the variables you want to be maximized. The variable
+ optimization priority will still be in lexicographic order.
+
+ \par
+ \b Example: consider you want to find the lexicographic maximum of the
+ \f$(x,y)\f$ vector, under the constraints:
+ \f[\left\{\begin{array}{l}
+ y \geq 2x - 4\\
+ y \leq -x + p
+ \end{array}\right.\f]
+ \par
+ where \f$p\f$ is a parameter.
+ \par
+ After variable substitution, the constraints become:
+ \f[\left\{\begin{array}{l}
+ M - y \geq 2M - 2x - 4\\
+ M - y \leq -M + x + p
+ \end{array}\right.\f]
+ \par
+ The code for creating the corresponding problem object is the following:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+ Constraint_System cs;
+ cs.insert(M - y >= 2*M - 2*x - 4);
+ cs.insert(M - y <= -M + x + p);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+ \endcode
+ Solving the problem provides the following solution:
+ \verbatim
+ Parameter E = (C + 1) div 3
+ {D - E - 1 ; -C + D + E + 1}
+ \endverbatim
+ Under the notations above, the solution is:
+ \f[ \left\{\begin{array}{l}
+ x' = M - \left\lfloor\frac{p+1}{3}\right\rfloor - 1 \\
+ y' = M - p + \left\lfloor\frac{p+1}{3}\right\rfloor + 1
+ \end{array}\right.
+ \f]
+ \par
+ Performing substitution again provides us with the values of the original
+ variables:
+ \f[ \left\{\begin{array}{l}
+ x = \left\lfloor\frac{p+1}{3}\right\rfloor + 1 \\
+ y = p - \left\lfloor\frac{p+1}{3}\right\rfloor - 1
+ \end{array}\right.
+ \f]
+
+ \par Allowing variables to be arbitrarily signed
+ You can deal with arbitrarily signed variables by reformulating the
+ constraints using variable substitution. Proceed the following steps:
+ - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+ which we will call \f$M\f$.
+ - Reformulate each of the maximization problem constraints by
+ substituting each \f$x_i\f$ variable with an expression of the form
+ \f$x'_i-M\f$, where the \f$x'_i\f$ variables are positive.
+ - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+ - The solution expression can be read in the form:
+ - In the solution expressions, the values of the \f$x'\f$ variables will
+ be expressed in the form: \f$x'_i = x_i+M\f$. To get back the value of
+ the expression of each signed \f$x_i\f$ variable, just apply the
+ formula: \f$x_i = x'_i-M\f$.
+ \par
+ Note that if the resulting expression of one of the \f$x'_i\f$ variables
+ is not in the \f$x'_i = x_i+M\f$ form, this means that the
+ sign-unrestricted problem is unbounded.
+ \par
+ You can choose to define only a subset of the variables to be
+ sign-unrestricted. In that case, just apply the variable substitution
+ method on the variables you want to be sign-unrestricted.
+
+ \par
+ \b Example: consider you want to find the lexicographic minimum of the
+ \f$(x,y)\f$ vector, where the \f$x\f$ and \f$y\f$ variables are
+ sign-unrestricted, under the constraints:
+ \f[\left\{\begin{array}{l}
+ y \geq -2x - 4\\
+ 2y \leq x + 2p
+ \end{array}\right.\f]
+ \par
+ where \f$p\f$ is a parameter.
+ \par
+ After variable substitution, the constraints become:
+ \f[\left\{\begin{array}{l}
+ y' - M \geq -2x' + 2M - 4\\
+ 2y' - 2M \leq x' - M + 2p
+ \end{array}\right.\f]
+ \par
+ The code for creating the corresponding problem object is the following:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+ Constraint_System cs;
+ cs.insert(y - M >= -2*x + 2*M - 4);
+ cs.insert(2*y - 2*M <= x - M + 2*p);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+ \endcode
+ \par
+ Solving the problem provides the following solution:
+ \verbatim
+ Parameter E = (2*C + 3) div 5
+ {D - E - 1 ; D + 2*E - 2}
+ \endverbatim
+ Under the notations above, the solution is:
+ \f[ \left\{\begin{array}{l}
+ x' = M - \left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+ y' = M + 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+ \end{array}\right.
+ \f]
+ \par
+ Performing substitution again provides us with the values of the original
+ variables:
+ \f[ \left\{\begin{array}{l}
+ x = -\left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+ y = 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+ \end{array}\right.
+ \f]
+
+ \par Allowing parameters to be arbitrarily signed
+ You can consider a parameter \f$p\f$ arbitrarily signed by replacing
+ \f$p\f$ with \f$p^+-p^-\f$, where both \f$p^+\f$ and \f$p^-\f$ are
+ positive parameters. To represent a set of arbitrarily signed parameters,
+ replace each parameter \f$p_i\f$ with \f$p^+_i-p^-\f$, where \f$-p^-\f$ is
+ the minimum negative value of all parameters.
+
+ \par Minimizing a linear cost function
+ Lexicographic solving can be used to find the parametric minimum of a
+ linear cost function.
+ \par
+ Suppose the variables are named \f$x_1, x_2, \dots, x_n\f$, and the
+ parameters \f$p_1, p_2, \dots, p_m\f$. You can minimize a linear cost
+ function \f$f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ by simply adding the
+ constraint \f$x_1 \geq f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ to the
+ constraint system. As lexicographic minimization ensures \f$x_1\f$ is
+ minimized in priority, and because \f$x_1\f$ is forced by a constraint to
+ be superior or equal to the cost function, optimal solutions of the
+ problem necessarily ensure that the solution value of \f$x_1\f$ is the
+ optimal value of the cost function.
+*/
+class Parma_Polyhedra_Library::PIP_Problem {
+public:
+ //! Builds a trivial PIP problem.
+ /*!
+ A trivial PIP problem requires to compute the lexicographic minimum
+ on a vector space under no constraints and with no parameters:
+ due to the implicit non-negativity constraints, the origin of the
+ vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this
+ (optional argument with default value \f$0\f$).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ explicit PIP_Problem(dimension_type dim = 0);
+
+ /*! \brief
+ Builds a PIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$;
+ those dimensions whose indices occur in \p p_vars are
+ interpreted as parameters.
+
+ \param dim
+ The dimension of the vector space (variables and parameters) enclosing
+ \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param p_vars
+ The set of variables' indexes that are interpreted as parameters.
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of a constraint in the sequence
+ (resp., the parameter variables) is strictly greater than \p dim.
+ */
+ template <typename In>
+ PIP_Problem(dimension_type dim, In first, In last,
+ const Variables_Set& p_vars);
+
+ //! Ordinary copy-constructor.
+ PIP_Problem(const PIP_Problem& y);
+
+ //! Destructor.
+ ~PIP_Problem();
+
+ //! Assignment operator.
+ PIP_Problem& operator=(const PIP_Problem& y);
+
+ //! Returns the maximum space dimension a PIP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the PIP problem.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a set containing all the variables' indexes representing
+ the parameters of the PIP problem.
+ */
+ const Variables_Set& parameter_space_dimensions() const;
+
+private:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint> Constraint_Sequence;
+
+public:
+ /*! \brief
+ A type alias for the read-only iterator on the constraints
+ defining the feasible region.
+ */
+ typedef Constraint_Sequence::const_iterator const_iterator;
+
+ /*! \brief
+ Returns a read-only iterator to the first constraint defining
+ the feasible region.
+ */
+ const_iterator constraints_begin() const;
+
+ /*! \brief
+ Returns a past-the-end read-only iterator to the sequence of
+ constraints defining the feasible region.
+ */
+ const_iterator constraints_end() const;
+
+ //! Resets \p *this to be equal to the trivial PIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ void clear();
+
+ /*! \brief
+ Adds <CODE>m_vars + m_params</CODE> new space dimensions
+ and embeds the old PIP problem in the new vector space.
+
+ \param m_vars
+ The number of space dimensions to add that are interpreted as
+ PIP problem variables (i.e., non parameters). These are added
+ \e before adding the \p m_params parameters.
+
+ \param m_params
+ The number of space dimensions to add that are interpreted as
+ PIP problem parameters. These are added \e after having added the
+ \p m_vars problem variables.
+
+ \exception std::length_error
+ Thrown if adding <CODE>m_vars + m_params</CODE> new space
+ dimensions would cause the vector space to exceed dimension
+ <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new PIP problem; they are initially unconstrained.
+ */
+ void add_space_dimensions_and_embed(dimension_type m_vars,
+ dimension_type m_params);
+
+ /*! \brief
+ Sets the space dimensions whose indexes which are in set \p p_vars
+ to be parameter space dimensions.
+
+ \exception std::invalid_argument
+ Thrown if some index in \p p_vars does not correspond to
+ a space dimension in \p *this.
+ */
+ void add_to_parameter_space_dimensions(const Variables_Set& p_vars);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the PIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of \p c is strictly greater than
+ the space dimension of \p *this.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the PIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of constraint system \p cs is strictly
+ greater than the space dimension of \p *this.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ //! Checks satisfiability of \p *this.
+ /*!
+ \return
+ \c true if and only if the PIP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the PIP problem.
+ /*!
+ \return
+ A PIP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible or optimized problem).
+ */
+ PIP_Problem_Status solve() const;
+
+ //! Returns a feasible solution for \p *this, if it exists.
+ /*!
+ A null pointer is returned for an unfeasible PIP problem.
+ */
+ PIP_Tree solution() const;
+
+ //! Returns an optimizing solution for \p *this, if it exists.
+ /*!
+ A null pointer is returned for an unfeasible PIP problem.
+ */
+ PIP_Tree optimizing_solution() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Prints on \p s the solution computed for \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ An indentation parameter (default value 0).
+
+ \exception std::logic_error
+ Thrown if trying to print the solution when the PIP problem
+ still has to be solved.
+ */
+ void print_solution(std::ostream& s, int indent = 0) const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(PIP_Problem& y);
+
+ //! Possible names for PIP_Problem control parameters.
+ enum Control_Parameter_Name {
+ //! Cutting strategy
+ CUTTING_STRATEGY,
+ //! Pivot row strategy
+ PIVOT_ROW_STRATEGY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ CONTROL_PARAMETER_NAME_SIZE
+ };
+
+ //! Possible values for PIP_Problem control parameters.
+ enum Control_Parameter_Value {
+ //! Choose the first non-integer row.
+ CUTTING_STRATEGY_FIRST,
+ //! Choose row which generates the deepest cut.
+ CUTTING_STRATEGY_DEEPEST,
+ //! Always generate all possible cuts.
+ CUTTING_STRATEGY_ALL,
+
+ //! Choose the first row with negative parameter sign.
+ PIVOT_ROW_STRATEGY_FIRST,
+ //! Choose a row that generates a lexicographically maximal pivot column.
+ PIVOT_ROW_STRATEGY_MAX_COLUMN,
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ CONTROL_PARAMETER_VALUE_SIZE
+ };
+
+ //! Returns the value of control parameter \p name.
+ Control_Parameter_Value
+ get_control_parameter(Control_Parameter_Name name) const;
+
+ //! Sets control parameter \p value.
+ void set_control_parameter(Control_Parameter_Value value);
+
+ //! Sets the dimension for the big parameter to \p big_dim.
+ void set_big_parameter_dimension(dimension_type big_dim);
+
+ /*! \brief
+ Returns the space dimension for the big parameter.
+
+ If a big parameter was not set, returns \c not_a_dimension().
+ */
+ dimension_type get_big_parameter_dimension() const;
+
+private:
+ //! Initializes the control parameters with default values.
+ void control_parameters_init();
+
+ //! Copies the control parameters from problem object \p y.
+ void control_parameters_copy(const PIP_Problem& y);
+
+ //! The dimension of the vector space.
+ dimension_type external_space_dim;
+
+ /*! \brief
+ The space dimension of the current (partial) solution of the
+ PIP problem; it may be smaller than \p external_space_dim.
+ */
+ dimension_type internal_space_dim;
+
+ //! An enumerated type describing the internal status of the PIP problem.
+ enum Status {
+ //! The PIP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The PIP problem is optimized; the solution tree has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the PIP problem has been changed by adding
+ new variables, parameters or constraints; a feasible solution for
+ the old feasible region is still available.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the MIP problem.
+ Status status;
+
+ //! The current solution decision tree
+ PIP_Tree_Node* current_solution;
+
+ //! The sequence of constraints describing the feasible region.
+ Constraint_Sequence input_cs;
+
+ //! The first index of `input_cs' containing a pending constraint.
+ dimension_type first_pending_constraint;
+
+ /*! \brief
+ A set containing all the indices of space dimensions that are
+ interpreted as problem parameters.
+ */
+ Variables_Set parameters;
+
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ /*! \brief
+ The initial context
+
+ Contains problem constraints on parameters only
+ */
+ Matrix<Row> initial_context;
+
+ //! The control parameters for the problem object.
+ Control_Parameter_Value
+ control_parameters[CONTROL_PARAMETER_NAME_SIZE];
+
+ /*! \brief
+ The dimension for the big parameter, or \c not_a_dimension()
+ if not set.
+ */
+ dimension_type big_parameter_dimension;
+
+ friend class PIP_Solution_Node;
+};
+
+#include "PIP_Problem_inlines.hh"
+#include "PIP_Problem_templates.hh"
+
+#endif // !defined(PPL_PIP_Problem_defs_hh)
diff --git a/src/PIP_Problem_inlines.hh b/src/PIP_Problem_inlines.hh
new file mode 100644
index 0000000..4f7d234
--- /dev/null
+++ b/src/PIP_Problem_inlines.hh
@@ -0,0 +1,96 @@
+/* PIP_Problem class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_inlines_hh
+#define PPL_PIP_Problem_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+PIP_Problem::space_dimension() const {
+ return external_space_dim;
+}
+
+inline dimension_type
+PIP_Problem::max_space_dimension() {
+ return Constraint::max_space_dimension();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_begin() const {
+ return input_cs.begin();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_end() const {
+ return input_cs.end();
+}
+
+inline const Variables_Set&
+PIP_Problem::parameter_space_dimensions() const {
+ return parameters;
+}
+
+inline void
+PIP_Problem::m_swap(PIP_Problem& y) {
+ using std::swap;
+ swap(external_space_dim, y.external_space_dim);
+ swap(internal_space_dim, y.internal_space_dim);
+ swap(status, y.status);
+ swap(current_solution, y.current_solution);
+ swap(input_cs, y.input_cs);
+ swap(first_pending_constraint, y.first_pending_constraint);
+ swap(parameters, y.parameters);
+ swap(initial_context, y.initial_context);
+ for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+ swap(control_parameters[i], y.control_parameters[i]);
+ swap(big_parameter_dimension, y.big_parameter_dimension);
+}
+
+inline PIP_Problem&
+PIP_Problem::operator=(const PIP_Problem& y) {
+ PIP_Problem tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+inline PIP_Problem::Control_Parameter_Value
+PIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+ PPL_ASSERT(name >= 0 && name < CONTROL_PARAMETER_NAME_SIZE);
+ return control_parameters[name];
+}
+
+inline dimension_type
+PIP_Problem::get_big_parameter_dimension() const {
+ return big_parameter_dimension;
+}
+
+/*! \relates PIP_Problem */
+inline void
+swap(PIP_Problem& x, PIP_Problem& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_inlines_hh)
diff --git a/src/PIP_Problem_templates.hh b/src/PIP_Problem_templates.hh
new file mode 100644
index 0000000..2d414a8
--- /dev/null
+++ b/src/PIP_Problem_templates.hh
@@ -0,0 +1,81 @@
+/* PIP_Problem class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_templates_hh
+#define PPL_PIP_Problem_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+PIP_Problem::PIP_Problem(dimension_type dim,
+ In first, In last,
+ const Variables_Set& p_vars)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ status(PARTIALLY_SATISFIABLE),
+ current_solution(0),
+ input_cs(),
+ first_pending_constraint(0),
+ parameters(p_vars),
+ initial_context(),
+ big_parameter_dimension(not_a_dimension()) {
+ // Check that integer Variables_Set does not exceed the space dimension
+ // of the problem.
+ if (p_vars.space_dimension() > external_space_dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Problem::PIP_Problem(dim, first, last, p_vars):\n"
+ << "dim == " << external_space_dim
+ << " and p_vars.space_dimension() == "
+ << p_vars.space_dimension()
+ << " are dimension incompatible.";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::PIP_Problem::"
+ "PIP_Problem(dim, first, last, p_vars):\n"
+ "dim exceeds the maximum allowed "
+ "space dimension.");
+ // Check the constraints.
+ for (In i = first; i != last; ++i) {
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Problem::"
+ << "PIP_Problem(dim, first, last, p_vars):\n"
+ << "range [first, last) contains a constraint having space "
+ << "dimension == " << i->space_dimension()
+ << " that exceeds this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ input_cs.push_back(*i);
+ }
+ control_parameters_init();
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_templates_hh)
diff --git a/src/PIP_Problem_types.hh b/src/PIP_Problem_types.hh
new file mode 100644
index 0000000..a1f044f
--- /dev/null
+++ b/src/PIP_Problem_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_PIP_Problem_types_hh
+#define PPL_PIP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum PIP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_PIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_PIP_PROBLEM
+};
+
+class PIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_types_hh)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
new file mode 100644
index 0000000..4a6d6b3
--- /dev/null
+++ b/src/PIP_Tree.cc
@@ -0,0 +1,3809 @@
+/* PIP_Tree related class implementation: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "PIP_Tree_defs.hh"
+#include "PIP_Problem_defs.hh"
+#include <algorithm>
+#include <memory>
+#include <map>
+
+// #define NOISY_PIP_TREE_STRUCTURE 1
+// #define NOISY_PIP 1
+// #define VERY_NOISY_PIP 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace {
+
+//! Assigns to \p x the positive remainder of the division of \p y by \p z.
+inline void
+pos_rem_assign(Coefficient& x,
+ Coefficient_traits::const_reference y,
+ Coefficient_traits::const_reference z) {
+ rem_assign(x, y, z);
+ if (x < 0)
+ x += z;
+}
+
+class Add_Mul_Assign_Row_Helper1 {
+public:
+ Add_Mul_Assign_Row_Helper1(Coefficient_traits::const_reference coeff)
+ : c(coeff) {
+ }
+
+ void
+ operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+ add_mul_assign(x, c, y);
+ }
+
+private:
+ Coefficient c;
+}; // class Add_Mul_Assign_Row_Helper1
+
+
+class Add_Mul_Assign_Row_Helper2 {
+public:
+ Add_Mul_Assign_Row_Helper2(Coefficient_traits::const_reference coeff)
+ : c(coeff) {
+ }
+
+ void
+ operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+ x = y;
+ x *= c;
+ }
+
+private:
+ Coefficient c;
+}; // class Add_Mul_Assign_Row_Helper2
+
+// Compute x += c * y
+inline void
+add_mul_assign_row(PIP_Tree_Node::Row& x,
+ Coefficient_traits::const_reference c,
+ const PIP_Tree_Node::Row& y) {
+ WEIGHT_BEGIN();
+ x.combine_needs_second(y,
+ Add_Mul_Assign_Row_Helper1(c),
+ Add_Mul_Assign_Row_Helper2(c));
+ WEIGHT_ADD_MUL(108, x.size());
+}
+
+
+struct Sub_Assign_Helper1 {
+ void
+ operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+ x -= y;
+ }
+}; // struct Sub_Assign_Helper1
+
+struct Sub_Assign_Helper2 {
+ void
+ operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+ x = y;
+ neg_assign(x);
+ }
+}; // struct Sub_Assign_Helper2
+
+// Compute x -= y
+inline void
+sub_assign(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+ WEIGHT_BEGIN();
+ x.combine_needs_second(y, Sub_Assign_Helper1(), Sub_Assign_Helper2());
+ WEIGHT_ADD_MUL(10, x.size());
+}
+
+// Merge constraint system to a matrix-form context such as x = x U y
+void
+merge_assign(Matrix<PIP_Tree_Node::Row>& x, const Constraint_System& y,
+ const Variables_Set& parameters) {
+ const dimension_type params_size = parameters.size();
+ PPL_ASSERT(params_size == x.num_columns() - 1);
+ const dimension_type new_rows = Implementation::num_constraints(y);
+ if (new_rows == 0)
+ return;
+ const dimension_type old_num_rows = x.num_rows();
+ x.add_zero_rows(new_rows);
+
+ // Compute once for all.
+ const dimension_type cs_space_dim = y.space_dimension();
+ const Variables_Set::const_iterator param_begin = parameters.begin();
+ const Variables_Set::const_iterator param_end = parameters.end();
+
+ dimension_type i = old_num_rows;
+ for (Constraint_System::const_iterator y_i = y.begin(),
+ y_end = y.end(); y_i != y_end; ++y_i, ++i) {
+ WEIGHT_BEGIN();
+ PPL_ASSERT(y_i->is_nonstrict_inequality());
+ PIP_Tree_Node::Row& x_i = x[i];
+ Coefficient_traits::const_reference inhomogeneous_term
+ = y_i->inhomogeneous_term();
+ Variables_Set::const_iterator pj = param_begin;
+ PIP_Tree_Node::Row::iterator itr = x_i.end();
+ if (inhomogeneous_term != 0)
+ itr = x_i.insert(0, inhomogeneous_term);
+ // itr may still be end() but it can still be used as a hint.
+ // TODO: This code could be optimized more (if it's expected that the
+ // size of `parameters' will be greater than the number of nonzero
+ // coefficients in y_i).
+ for (dimension_type j = 1; pj != param_end; ++pj, ++j) {
+ const Variable vj(*pj);
+ if (vj.space_dimension() > cs_space_dim)
+ break;
+ Coefficient_traits::const_reference c = y_i->coefficient(vj);
+ if (c != 0)
+ itr = x_i.insert(itr, j, c);
+ }
+ WEIGHT_ADD_MUL(102, params_size);
+ }
+}
+
+#if PPL_USE_SPARSE_MATRIX
+
+// Assigns to row x the negation of row y.
+inline void
+neg_assign_row(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+ WEIGHT_BEGIN();
+ x = y;
+ for (PIP_Tree_Node::Row::iterator i = x.begin(),
+ i_end = x.end(); i != i_end; ++i) {
+ neg_assign(*i);
+ WEIGHT_ADD(1);
+ }
+}
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+inline void
+neg_assign_row(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+ WEIGHT_BEGIN();
+ const dimension_type x_size = x.size();
+ for (dimension_type i = x_size; i-- > 0; )
+ neg_assign(x[i], y[i]);
+ WEIGHT_ADD_MUL(14, x_size);
+}
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+// Given context row \p y and denominator \p denom,
+// to be interpreted as expression expr = y / denom,
+// assigns to context row \p x a new value such that
+// x / denom == - expr - 1.
+inline void
+complement_assign(PIP_Tree_Node::Row& x,
+ const PIP_Tree_Node::Row& y,
+ Coefficient_traits::const_reference denom) {
+ PPL_ASSERT(denom > 0);
+ neg_assign_row(x, y);
+ PIP_Tree_Node::Row::iterator itr = x.insert(0);
+ Coefficient& x_0 = *itr;
+ if (denom == 1)
+ --x_0;
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ pos_rem_assign(mod, x_0, denom);
+ x_0 -= (mod == 0) ? denom : mod;
+ }
+ if (x_0 == 0)
+ x.reset(itr);
+}
+
+// Add to `context' the columns for new artificial parameters.
+inline void
+add_artificial_parameters(Matrix<PIP_Tree_Node::Row>& context,
+ const dimension_type num_art_params) {
+ if (num_art_params > 0)
+ context.add_zero_columns(num_art_params);
+}
+
+// Add to `params' the indices of new artificial parameters.
+inline void
+add_artificial_parameters(Variables_Set& params,
+ const dimension_type space_dim,
+ const dimension_type num_art_params) {
+ for (dimension_type i = 0; i < num_art_params; ++i)
+ params.insert(space_dim + i);
+}
+
+// Update `context', `params' and `space_dim' to account for
+// the addition of the new artificial parameters.
+inline void
+add_artificial_parameters(Matrix<PIP_Tree_Node::Row>& context,
+ Variables_Set& params,
+ dimension_type& space_dim,
+ const dimension_type num_art_params) {
+ add_artificial_parameters(context, num_art_params);
+ add_artificial_parameters(params, space_dim, num_art_params);
+ space_dim += num_art_params;
+}
+
+/* Compares two columns lexicographically in a revised simplex tableau:
+ - returns true if
+ <CODE>
+ (column ja)*(-cst_a)/pivot_a[ja] < (column jb)*(-cst_b)/pivot_b[jb];
+ </CODE>
+ - returns false otherwise.
+*/
+bool
+column_lower(const Matrix<PIP_Tree_Node::Row>& tableau,
+ const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const PIP_Tree_Node::Row& pivot_a, const dimension_type ja,
+ const PIP_Tree_Node::Row& pivot_b, const dimension_type jb,
+ Coefficient_traits::const_reference cst_a = -1,
+ Coefficient_traits::const_reference cst_b = -1) {
+ Coefficient_traits::const_reference sij_a = pivot_a.get(ja);
+ Coefficient_traits::const_reference sij_b = pivot_b.get(jb);
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(sij_b > 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
+ lhs_coeff = cst_a * sij_b;
+ rhs_coeff = cst_b * sij_a;
+
+ const int lhs_coeff_sign = sgn(lhs_coeff);
+ const int rhs_coeff_sign = sgn(rhs_coeff);
+
+ if (ja == jb) {
+ // Same column: just compare the ratios.
+ // This works since all columns are lexico-positive.
+ return lhs_coeff > rhs_coeff;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+ const dimension_type num_vars = mapping.size();
+ dimension_type k = 0;
+ // While loop guard is: (k < num_rows && lhs == rhs).
+ // Return value is false, if k >= num_rows; it is equivalent to
+ // lhs < rhs, otherwise.
+ // Try to optimize the computation of lhs and rhs.
+ WEIGHT_BEGIN();
+ while (true) {
+ const dimension_type mk = mapping[k];
+ const bool in_base = basis[k];
+ if (++k >= num_vars)
+ return false;
+ if (in_base) {
+ // Reconstitute the identity submatrix part of tableau.
+ if (mk == ja) {
+ // Optimizing for: lhs == lhs_coeff && rhs == 0;
+ if (lhs_coeff == 0)
+ continue;
+ else
+ return lhs_coeff > 0;
+ }
+ if (mk == jb) {
+ // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+ if (rhs_coeff == 0)
+ continue;
+ else
+ return 0 > rhs_coeff;
+ }
+ // Optimizing for: lhs == 0 && rhs == 0;
+ continue;
+ }
+ else {
+ // Not in base.
+ const PIP_Tree_Node::Row& t_mk = tableau[mk];
+ Coefficient_traits::const_reference t_mk_ja = t_mk.get(ja);
+ Coefficient_traits::const_reference t_mk_jb = t_mk.get(jb);
+ if (t_mk_ja == 0)
+ if (t_mk_jb == 0)
+ continue;
+ else {
+ const int rhs_sign = rhs_coeff_sign * sgn(t_mk_jb);
+ if (0 == rhs_sign)
+ continue;
+ else
+ return 0 > rhs_sign;
+ }
+ else
+ if (t_mk_jb == 0) {
+ const int lhs_sign = lhs_coeff_sign * sgn(t_mk_ja);
+ if (lhs_sign == 0)
+ continue;
+ else
+ return lhs_sign > 0;
+ }
+ else {
+ WEIGHT_ADD(2);
+ lhs = lhs_coeff * t_mk_ja;
+ rhs = rhs_coeff * t_mk_jb;
+ if (lhs == rhs)
+ continue;
+ else
+ return lhs > rhs;
+ }
+ }
+ }
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+/* Find the column j in revised simplex tableau such that
+ - j is in candidates
+ - (column j) / pivot_row[j] is lexico-minimal
+ When this function returns, candidates contains the minimum(s) column(s)
+ index(es).
+*/
+void
+find_lexico_minimal_column_in_set(std::vector<dimension_type>& candidates,
+ const Matrix<PIP_Tree_Node::Row>& tableau,
+ const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const PIP_Tree_Node::Row& pivot_row) {
+ WEIGHT_BEGIN();
+ const dimension_type num_vars = mapping.size();
+
+ PPL_ASSERT(!candidates.empty());
+ // This is used as a set, it is always sorted.
+ std::vector<dimension_type> new_candidates;
+ for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
+ new_candidates.clear();
+ std::vector<dimension_type>::const_iterator i = candidates.begin();
+ std::vector<dimension_type>::const_iterator i_end = candidates.end();
+ PPL_ASSERT(!candidates.empty());
+ new_candidates.push_back(*i);
+ dimension_type min_column = *i;
+ ++i;
+ if (i == i_end)
+ // Only one candidate left, so it is the minimum.
+ break;
+ PIP_Tree_Node::Row::const_iterator pivot_itr;
+ pivot_itr = pivot_row.find(min_column);
+ PPL_ASSERT(pivot_itr != pivot_row.end());
+ Coefficient sij_b = *pivot_itr;
+ ++pivot_itr;
+ const dimension_type row_index = mapping[var_index];
+ const bool in_base = basis[var_index];
+ if (in_base) {
+ for ( ; i != i_end; ++i) {
+ pivot_itr = pivot_row.find(pivot_itr, *i);
+ PPL_ASSERT(pivot_itr != pivot_row.end());
+ Coefficient_traits::const_reference sij_a = *pivot_itr;
+ ++pivot_itr;
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(sij_b > 0);
+
+ // Reconstitute the identity submatrix part of tableau.
+ if (row_index != *i) {
+ if (row_index == min_column) {
+ // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+ new_candidates.clear();
+ min_column = *i;
+ sij_b = sij_a;
+ new_candidates.push_back(min_column);
+ }
+ else
+ // Optimizing for: lhs == 0 && rhs == 0;
+ new_candidates.push_back(*i);
+ }
+ }
+ WEIGHT_ADD_MUL(44, candidates.size());
+ }
+ else {
+ // Not in base.
+ const PIP_Tree_Node::Row& row = tableau[row_index];
+ PIP_Tree_Node::Row::const_iterator row_itr = row.lower_bound(min_column);
+ PIP_Tree_Node::Row::const_iterator row_end = row.end();
+ PPL_DIRTY_TEMP_COEFFICIENT(row_jb);
+ if (row_itr == row_end || row_itr.index() > min_column)
+ row_jb = 0;
+ else {
+ PPL_ASSERT(row_itr.index() == min_column);
+ row_jb = *row_itr;
+ ++row_itr;
+ }
+ for ( ; i != i_end; ++i) {
+ pivot_itr = pivot_row.find(pivot_itr, *i);
+ PPL_ASSERT(pivot_itr != pivot_row.end());
+ Coefficient_traits::const_reference sij_a = *pivot_itr;
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(sij_b > 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+ if (row_itr != row_end && row_itr.index() < *i)
+ row_itr = row.lower_bound(row_itr, *i);
+ PPL_DIRTY_TEMP_COEFFICIENT(row_ja);
+ if (row_itr == row_end || row_itr.index() > *i)
+ row_ja = 0;
+ else {
+ PPL_ASSERT(row_itr.index() == *i);
+ row_ja = *row_itr;
+ ++row_itr;
+ }
+
+ // lhs is actually the left-hand side with toggled sign.
+ // rhs is actually the right-hand side with toggled sign.
+ lhs = sij_b * row_ja;
+ rhs = sij_a * row_jb;
+ if (lhs == rhs)
+ new_candidates.push_back(*i);
+ else
+ if (lhs < rhs) {
+ new_candidates.clear();
+ min_column = *i;
+ row_jb = row_ja;
+ sij_b = sij_a;
+ new_candidates.push_back(min_column);
+ }
+ }
+ WEIGHT_ADD_MUL(68, candidates.size());
+ }
+ using std::swap;
+ swap(candidates, new_candidates);
+ }
+}
+
+/* Find the column j in revised simplex tableau such that
+ - pivot_row[j] is positive;
+ - (column j) / pivot_row[j] is lexico-minimal.
+*/
+bool
+find_lexico_minimal_column(const Matrix<PIP_Tree_Node::Row>& tableau,
+ const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const PIP_Tree_Node::Row& pivot_row,
+ const dimension_type start_j,
+ dimension_type& j_out) {
+ WEIGHT_BEGIN();
+ const dimension_type num_columns = tableau.num_columns();
+
+ PPL_ASSERT(start_j <= pivot_row.size());
+ if (start_j == pivot_row.size())
+ // There are no candidates, so there is no minimum.
+ return false;
+
+ // This is used as a set, it is always sorted.
+ std::vector<dimension_type> candidates;
+ for (PIP_Tree_Node::Row::const_iterator i = pivot_row.lower_bound(start_j),
+ i_end = pivot_row.end(); i != i_end; ++i) {
+ if (*i > 0)
+ candidates.push_back(i.index());
+ }
+ WEIGHT_ADD_MUL(201, candidates.size());
+
+ if (candidates.empty()) {
+ j_out = num_columns;
+ return false;
+ }
+
+ find_lexico_minimal_column_in_set(candidates, tableau,
+ mapping, basis, pivot_row);
+ PPL_ASSERT(!candidates.empty());
+ j_out = *(candidates.begin());
+
+ return true;
+}
+
+// Computes into gcd the GCD of gcd and all coefficients in [first, last).
+template <typename Iter>
+void
+gcd_assign_iter(Coefficient& gcd, Iter first, Iter last) {
+ PPL_ASSERT(gcd != 0);
+ if (gcd < 0)
+ neg_assign(gcd);
+ if (gcd == 1)
+ return;
+ WEIGHT_BEGIN();
+ for ( ; first != last; ++first) {
+ Coefficient_traits::const_reference coeff = *first;
+ if (coeff != 0) {
+ WEIGHT_ADD(24);
+ gcd_assign(gcd, coeff, gcd);
+ if (gcd == 1)
+ return;
+ }
+ }
+}
+
+// Simplify row by exploiting variable integrality.
+void
+integral_simplification(PIP_Tree_Node::Row& row) {
+ if (row[0] != 0) {
+ PIP_Tree_Node::Row::const_iterator j_begin = row.begin();
+ PIP_Tree_Node::Row::const_iterator j_end = row.end();
+ PPL_ASSERT(j_begin != j_end && j_begin.index() == 0 && *j_begin != 0);
+ /* Find next column with a non-zero value (there should be one). */
+ ++j_begin;
+ PPL_ASSERT(j_begin != j_end);
+ for ( ; *j_begin == 0; ++j_begin)
+ PPL_ASSERT(j_begin != j_end);
+ /* Use it to initialize gcd. */
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd = *j_begin;
+ ++j_begin;
+ gcd_assign_iter(gcd, j_begin, j_end);
+ if (gcd != 1) {
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ pos_rem_assign(mod, row[0], gcd);
+ row[0] -= mod;
+ }
+ }
+ /* Final normalization. */
+ row.normalize();
+}
+
+// Divide all coefficients in row x and denominator y by their GCD.
+void
+row_normalize(PIP_Tree_Node::Row& x, Coefficient& denom) {
+ if (denom == 1)
+ return;
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd = denom;
+ gcd_assign_iter(gcd, x.begin(), x.end());
+
+ // Divide the coefficients by the GCD.
+ WEIGHT_BEGIN();
+ for (PIP_Tree_Node::Row::iterator i = x.begin(),
+ i_end = x.end(); i != i_end; ++i) {
+ Coefficient& x_i = *i;
+ exact_div_assign(x_i, x_i, gcd);
+ WEIGHT_ADD(22);
+ }
+ // Divide the denominator by the GCD.
+ exact_div_assign(denom, denom, gcd);
+}
+
+// This is here because it is used as a template argument in
+// compatibility_check_find_pivot, so it must be a global declaration.
+struct compatibility_check_find_pivot_in_set_data {
+ dimension_type row_index;
+ // We cache cost and value to avoid calling get() multiple times.
+ Coefficient cost;
+ Coefficient value;
+ bool operator==(const compatibility_check_find_pivot_in_set_data& x) const {
+ return row_index == x.row_index;
+ }
+ // Needed by std::vector to sort the values.
+ bool operator<(const compatibility_check_find_pivot_in_set_data& x) const {
+ return row_index < x.row_index;
+ }
+};
+
+void
+compatibility_check_find_pivot_in_set(
+ std::vector<std::pair<dimension_type,
+ compatibility_check_find_pivot_in_set_data> >&
+ candidates,
+ const Matrix<PIP_Tree_Node::Row>& s,
+ const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis) {
+
+ typedef compatibility_check_find_pivot_in_set_data data_struct;
+ typedef std::vector<std::pair<dimension_type, data_struct> > candidates_t;
+ // This is used as a set, it is always sorted.
+ candidates_t new_candidates;
+ const dimension_type num_vars = mapping.size();
+ for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
+ const dimension_type row_index = mapping[var_index];
+ const bool in_base = basis[var_index];
+ candidates_t::const_iterator i = candidates.begin();
+ candidates_t::const_iterator i_end = candidates.end();
+ PPL_ASSERT(i != i_end);
+ dimension_type pj = i->first;
+ Coefficient cost = i->second.cost;
+ Coefficient value = i->second.value;
+ new_candidates.clear();
+ new_candidates.push_back(*i);
+ if (in_base) {
+ for (++i; i != i_end; ++i) {
+ bool found_better_pivot = false;
+
+ const dimension_type challenger_j = i->first;
+ Coefficient_traits::const_reference challenger_cost = i->second.cost;
+ PPL_ASSERT(value > 0);
+ PPL_ASSERT(i->second.value > 0);
+ PPL_ASSERT(pj < challenger_j);
+
+ const int lhs_coeff_sgn = sgn(cost);
+ const int rhs_coeff_sgn = sgn(challenger_cost);
+
+ PPL_ASSERT(pj != challenger_j);
+
+ // Reconstitute the identity submatrix part of tableau.
+ if (row_index == pj) {
+ // Optimizing for: lhs == lhs_coeff && rhs == 0;
+ if (lhs_coeff_sgn == 0)
+ new_candidates.push_back(*i);
+ else
+ found_better_pivot = (lhs_coeff_sgn > 0);
+ }
+ else {
+ if (row_index == challenger_j) {
+ // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+ if (rhs_coeff_sgn == 0)
+ new_candidates.push_back(*i);
+ else
+ found_better_pivot = (0 > rhs_coeff_sgn);
+ }
+ else
+ // Optimizing for: lhs == 0 && rhs == 0;
+ new_candidates.push_back(*i);
+ }
+ if (found_better_pivot) {
+ pj = challenger_j;
+ cost = challenger_cost;
+ value = i->second.value;
+ new_candidates.clear();
+ new_candidates.push_back(*i);
+ }
+ }
+ }
+ else {
+ // Not in base.
+ const PIP_Tree_Node::Row& row = s[row_index];
+ PIP_Tree_Node::Row::const_iterator row_itr = row.lower_bound(pj);
+ PIP_Tree_Node::Row::const_iterator new_row_itr;
+ PIP_Tree_Node::Row::const_iterator row_end = row.end();
+ PPL_DIRTY_TEMP_COEFFICIENT(row_value);
+ if (row_itr != row_end && row_itr.index() == pj) {
+ row_value = *row_itr;
+ ++row_itr;
+ }
+ else
+ row_value = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(row_challenger_value);
+ for (++i; i != i_end; ++i) {
+ const dimension_type challenger_j = i->first;
+ Coefficient_traits::const_reference challenger_cost = i->second.cost;
+ Coefficient_traits::const_reference challenger_value
+ = i->second.value;
+ PPL_ASSERT(value > 0);
+ PPL_ASSERT(challenger_value > 0);
+ PPL_ASSERT(pj < challenger_j);
+
+ new_row_itr = row.find(row_itr, challenger_j);
+ if (new_row_itr != row.end()) {
+ row_challenger_value = *new_row_itr;
+ // Use new_row_itr as a hint in next iterations
+ row_itr = new_row_itr;
+ }
+ else {
+ row_challenger_value = 0;
+ // Using end() as a hint is not useful, keep the current hint.
+ }
+ PPL_ASSERT(row_challenger_value == row.get(challenger_j));
+
+ // Before computing and comparing the actual values, the signs are
+ // compared. This speeds up the code, because the values' computation
+ // is a bit expensive.
+
+ const int lhs_sign = sgn(cost) * sgn(row_value);
+ const int rhs_sign = sgn(challenger_cost) * sgn(row_challenger_value);
+
+ if (lhs_sign != rhs_sign) {
+ if (lhs_sign > rhs_sign) {
+ pj = challenger_j;
+ cost = challenger_cost;
+ value = challenger_value;
+ row_value = row_challenger_value;
+ new_candidates.clear();
+ new_candidates.push_back(*i);
+ }
+ }
+ else {
+
+ // Sign comparison is not enough this time.
+ // Do the full computation.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+ lhs = cost;
+ lhs *= challenger_value;
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+ rhs = challenger_cost;
+ rhs *= value;
+
+ lhs *= row_value;
+ rhs *= row_challenger_value;
+
+ if (lhs == rhs)
+ new_candidates.push_back(*i);
+ else {
+ if (lhs > rhs) {
+ pj = challenger_j;
+ cost = challenger_cost;
+ value = challenger_value;
+ row_value = row_challenger_value;
+ new_candidates.clear();
+ new_candidates.push_back(*i);
+ }
+ }
+ }
+ }
+ }
+ using std::swap;
+ swap(candidates, new_candidates);
+ }
+}
+
+// Returns false if there is not a positive pivot candidate.
+// Otherwise, it sets pi, pj to the coordinates of the pivot in s.
+bool
+compatibility_check_find_pivot(const Matrix<PIP_Tree_Node::Row>& s,
+ const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ dimension_type& pi, dimension_type& pj) {
+ // Look for a negative RHS (i.e., constant term, stored in column 0),
+ // maximizing pivot column.
+ const dimension_type num_rows = s.num_rows();
+ typedef compatibility_check_find_pivot_in_set_data data_struct;
+ // This is used as a set, it is always sorted.
+ typedef std::vector<std::pair<dimension_type, data_struct> > candidates_t;
+ typedef std::map<dimension_type,data_struct> candidates_map_t;
+ candidates_map_t candidates_map;
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ const PIP_Tree_Node::Row& s_i = s[i];
+ Coefficient_traits::const_reference s_i0 = s_i.get(0);
+ if (s_i0 < 0) {
+ dimension_type j;
+ if (!find_lexico_minimal_column(s, mapping, basis, s_i, 1, j)) {
+ // No positive pivot candidate: unfeasible problem.
+ return false;
+ }
+ Coefficient_traits::const_reference s_ij = s_i.get(j);
+ candidates_map_t::iterator itr = candidates_map.find(j);
+ if (itr == candidates_map.end()) {
+ data_struct& current_data = candidates_map[j];
+ current_data.row_index = i;
+ current_data.cost = s_i0;
+ current_data.value = s_ij;
+ }
+ else {
+ data_struct& current_data = candidates_map[j];
+ PPL_ASSERT(current_data.value > 0);
+
+ // Before computing and comparing the actual values, the signs are
+ // compared. This speeds up the code, because the values' computation
+ // is a bit expensive.
+ const int lhs_coeff_sgn = sgn(current_data.cost);
+ const int rhs_coeff_sgn = sgn(s_i0);
+
+ if (lhs_coeff_sgn != rhs_coeff_sgn) {
+ // Same column: just compare the ratios.
+ // This works since all columns are lexico-positive:
+ // return cst_a * sij_b > cst_b * sij_a.
+ if (lhs_coeff_sgn > rhs_coeff_sgn) {
+ // Found better pivot
+ current_data.row_index = i;
+ current_data.cost = s_i0;
+ current_data.value = s_ij;
+ }
+ // Otherwise, keep current pivot for this column.
+ }
+ else {
+ // Sign comparison is not enough this time.
+ // Do the full computation.
+ Coefficient_traits::const_reference value_b = s_i.get(j);
+ PPL_ASSERT(value_b > 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
+ lhs_coeff = current_data.cost;
+ lhs_coeff *= value_b;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
+ rhs_coeff = s_i0;
+ rhs_coeff *= current_data.value;
+
+ // Same column: just compare the ratios.
+ // This works since all columns are lexico-positive:
+ // return cst_a * sij_b > cst_b * sij_a.
+ if (lhs_coeff > rhs_coeff) {
+ // Found better pivot
+ current_data.row_index = i;
+ current_data.cost = s_i0;
+ current_data.value = s_ij;
+ }
+ // Otherwise, keep current pivot for this column.
+ }
+ }
+ }
+ }
+ candidates_t candidates;
+ for (candidates_map_t::iterator
+ i = candidates_map.begin(), i_end = candidates_map.end();
+ i != i_end; ++i)
+ candidates.push_back(*i);
+ if (!candidates.empty()) {
+ compatibility_check_find_pivot_in_set(candidates, s, mapping, basis);
+ PPL_ASSERT(!candidates.empty());
+ pi = candidates.begin()->second.row_index;
+ pj = candidates.begin()->first;
+ }
+ else {
+ pi = s.num_rows();
+ pj = 0;
+ }
+
+ return true;
+}
+
+} // namespace
+
+namespace IO_Operators {
+
+std::ostream&
+operator<<(std::ostream& os, const PIP_Tree_Node& x) {
+ x.print(os);
+ return os;
+}
+
+std::ostream&
+operator<<(std::ostream& os, const PIP_Tree_Node::Artificial_Parameter& x) {
+ const Linear_Expression& expr = static_cast<const Linear_Expression&>(x);
+ os << "(" << expr << ") div " << x.denominator();
+ return os;
+}
+
+} // namespace IO_Operators
+
+PIP_Tree_Node::PIP_Tree_Node(const PIP_Problem* owner)
+ : owner_(owner),
+ parent_(0),
+ constraints_(),
+ artificial_parameters() {
+}
+
+PIP_Tree_Node::PIP_Tree_Node(const PIP_Tree_Node& y)
+ : owner_(y.owner_),
+ parent_(0), // NOTE: parent is not copied.
+ constraints_(y.constraints_),
+ artificial_parameters(y.artificial_parameters) {
+}
+
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Linear_Expression& expr,
+ Coefficient_traits::const_reference d)
+ : Linear_Expression(expr), denom(d) {
+ if (denom == 0)
+ throw std::invalid_argument("PIP_Tree_Node::Artificial_Parameter(e, d): "
+ "denominator d is zero.");
+
+ // Normalize if needed.
+ // FIXME: Provide a proper normalization helper.
+ Linear_Expression& param_expr = *this;
+ if (denom < 0) {
+ neg_assign(denom);
+ neg_assign(param_expr);
+ }
+
+ // Compute GCD of parameter expression and denominator.
+
+ Coefficient gcd = param_expr.gcd(0, space_dimension() + 1);
+
+ if (gcd == 1)
+ return;
+
+ if (gcd == 0)
+ gcd = denom;
+ else
+ gcd_assign(gcd, denom, gcd);
+
+ if (gcd == 1)
+ return;
+
+ // Divide coefficients and denominator by their (non-trivial) GCD.
+ PPL_ASSERT(gcd > 1);
+ param_expr.exact_div_assign(gcd, 0, space_dimension() + 1);
+ Parma_Polyhedra_Library::exact_div_assign(denom, denom, gcd);
+
+ PPL_ASSERT(OK());
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter
+::operator==(const PIP_Tree_Node::Artificial_Parameter& y) const {
+ const Artificial_Parameter& x = *this;
+ if (x.space_dimension() != y.space_dimension())
+ return false;
+ if (x.denom != y.denom)
+ return false;
+ return x.is_equal_to(y);
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter
+::operator!=(const PIP_Tree_Node::Artificial_Parameter& y) const {
+ return !operator==(y);
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter::OK() const {
+ if (denom <= 0) {
+#ifndef NDEBUG
+ std::cerr << "PIP_Tree_Node::Artificial_Parameter "
+ << "has a non-positive denominator.\n";
+#endif
+ return false;
+ }
+ return true;
+}
+
+void
+PIP_Tree_Node::Artificial_Parameter::ascii_dump(std::ostream& s) const {
+ s << "artificial_parameter ";
+ Linear_Expression::ascii_dump(s);
+ s << " / " << denom << "\n";
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "artificial_parameter")
+ return false;
+ if (!Linear_Expression::ascii_load(s))
+ return false;
+ if (!(s >> str) || str != "/")
+ return false;
+ if (!(s >> denom))
+ return false;
+ PPL_ASSERT(OK());
+ return true;
+}
+
+PPL_OUTPUT_DEFINITIONS(PIP_Tree_Node::Artificial_Parameter)
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Problem* owner)
+ : PIP_Tree_Node(owner),
+ tableau(),
+ basis(),
+ mapping(),
+ var_row(),
+ var_column(),
+ special_equality_row(0),
+ big_dimension(not_a_dimension()),
+ sign(),
+ solution(),
+ solution_valid(false) {
+}
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Solution_Node& y)
+ : PIP_Tree_Node(y),
+ tableau(y.tableau),
+ basis(y.basis),
+ mapping(y.mapping),
+ var_row(y.var_row),
+ var_column(y.var_column),
+ special_equality_row(y.special_equality_row),
+ big_dimension(y.big_dimension),
+ sign(y.sign),
+ solution(y.solution),
+ solution_valid(y.solution_valid) {
+}
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Solution_Node& y,
+ No_Constraints)
+ : PIP_Tree_Node(y.owner_), // NOTE: only copy owner.
+ tableau(y.tableau),
+ basis(y.basis),
+ mapping(y.mapping),
+ var_row(y.var_row),
+ var_column(y.var_column),
+ special_equality_row(y.special_equality_row),
+ big_dimension(y.big_dimension),
+ sign(y.sign),
+ solution(y.solution),
+ solution_valid(y.solution_valid) {
+}
+
+PIP_Solution_Node::~PIP_Solution_Node() {
+}
+
+PIP_Decision_Node::PIP_Decision_Node(const PIP_Problem* owner,
+ PIP_Tree_Node* fcp,
+ PIP_Tree_Node* tcp)
+ : PIP_Tree_Node(owner),
+ false_child(fcp),
+ true_child(tcp) {
+ if (false_child != 0)
+ false_child->set_parent(this);
+ if (true_child != 0)
+ true_child->set_parent(this);
+}
+
+PIP_Decision_Node::PIP_Decision_Node(const PIP_Decision_Node& y)
+ : PIP_Tree_Node(y),
+ false_child(0),
+ true_child(0) {
+ if (y.false_child != 0) {
+ false_child = y.false_child->clone();
+ false_child->set_parent(this);
+ }
+ // Protect false_child from exception safety issues via std::auto_ptr.
+ std::auto_ptr<PIP_Tree_Node> wrapped_node(false_child);
+ if (y.true_child != 0) {
+ true_child = y.true_child->clone();
+ true_child->set_parent(this);
+ }
+ // It is now safe to release false_child.
+ wrapped_node.release();
+}
+
+PIP_Decision_Node::~PIP_Decision_Node() {
+ delete false_child;
+ delete true_child;
+}
+
+void
+PIP_Solution_Node::set_owner(const PIP_Problem* owner) {
+ owner_ = owner;
+}
+
+void
+PIP_Decision_Node::set_owner(const PIP_Problem* owner) {
+ owner_ = owner;
+ if (false_child != 0)
+ false_child->set_owner(owner);
+ if (true_child != 0)
+ true_child->set_owner(owner);
+}
+
+bool
+PIP_Solution_Node::check_ownership(const PIP_Problem* owner) const {
+ return get_owner() == owner;
+}
+
+bool
+PIP_Decision_Node::check_ownership(const PIP_Problem* owner) const {
+ return get_owner() == owner
+ && (false_child == 0 || false_child->check_ownership(owner))
+ && (true_child == 0 || true_child->check_ownership(owner));
+}
+
+const PIP_Decision_Node*
+PIP_Decision_Node::as_decision() const {
+ return this;
+}
+
+const PIP_Decision_Node*
+PIP_Solution_Node::as_decision() const {
+ return 0;
+}
+
+const PIP_Solution_Node*
+PIP_Decision_Node::as_solution() const {
+ return 0;
+}
+
+const PIP_Solution_Node*
+PIP_Solution_Node::as_solution() const {
+ return this;
+}
+
+bool
+PIP_Solution_Node::Tableau::OK() const {
+ if (s.num_rows() != t.num_rows()) {
+#ifndef NDEBUG
+ std::cerr << "PIP_Solution_Node::Tableau matrices "
+ << "have a different number of rows.\n";
+#endif
+ return false;
+ }
+
+ if (!s.OK() || !t.OK()) {
+#ifndef NDEBUG
+ std::cerr << "A PIP_Solution_Node::Tableau matrix is broken.\n";
+#endif
+ return false;
+ }
+
+ if (denom <= 0) {
+#ifndef NDEBUG
+ std::cerr << "PIP_Solution_Node::Tableau with non-positive "
+ << "denominator.\n";
+#endif
+ return false;
+ }
+
+ // All tests passed.
+ return true;
+}
+
+bool
+PIP_Tree_Node::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // Parameter constraint system should contain no strict inequalities.
+ for (Constraint_System::const_iterator
+ i = constraints_.begin(), i_end = constraints_.end(); i != i_end; ++i)
+ if (i->is_strict_inequality()) {
+#ifndef NDEBUG
+ cerr << "The feasible region of the PIP_Problem parameter context"
+ << "is defined by a constraint system containing strict "
+ << "inequalities."
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+ }
+ return true;
+}
+
+void
+PIP_Tree_Node
+::add_constraint(const Row& row, const Variables_Set& parameters) {
+ // Compute the expression for the parameter constraint.
+ Linear_Expression expr = Linear_Expression(row.get(0));
+ Variables_Set::const_iterator j = parameters.begin();
+ if (!parameters.empty()) {
+ // Needed to avoid reallocations in expr when iterating upward.
+ add_mul_assign(expr, 0, Variable(*(parameters.rbegin())));
+ // The number of increments of j plus one.
+ dimension_type j_index = 1;
+ Row::const_iterator i = row.begin();
+ Row::const_iterator i_end = row.end();
+ if (i != i_end && i.index() == 0)
+ ++i;
+ // NOTE: iterating in [1..num_params].
+ WEIGHT_BEGIN();
+ for ( ; i != i_end; ++i) {
+ PPL_ASSERT(i.index() <= parameters.size());
+ std::advance(j, i.index() - j_index);
+ j_index = i.index();
+ WEIGHT_ADD(74);
+ add_mul_assign(expr, *i, Variable(*j));
+ }
+ }
+ // Add the parameter constraint.
+ constraints_.insert(expr >= 0);
+}
+
+void
+PIP_Tree_Node::parent_merge() {
+ const PIP_Decision_Node& parent = *parent_;
+
+ // Merge the parent's artificial parameters.
+ artificial_parameters.insert(artificial_parameters.begin(),
+ parent.art_parameter_begin(),
+ parent.art_parameter_end());
+
+ PPL_ASSERT(OK());
+}
+
+bool
+PIP_Solution_Node::OK() const {
+#ifndef NDEBUG
+ using std::cerr;
+#endif
+ if (!PIP_Tree_Node::OK())
+ return false;
+
+ // Check that every member used is OK.
+
+ if (!tableau.OK())
+ return false;
+
+ // Check coherency of basis, mapping, var_row and var_column
+ if (basis.size() != mapping.size()) {
+#ifndef NDEBUG
+ cerr << "The PIP_Solution_Node::basis and PIP_Solution_Node::mapping "
+ << "vectors do not have the same number of elements.\n";
+#endif
+ return false;
+ }
+ if (basis.size() != var_row.size() + var_column.size()) {
+#ifndef NDEBUG
+ cerr << "The sum of number of elements in the PIP_Solution_Node::var_row "
+ << "and PIP_Solution_Node::var_column vectors is different from the "
+ << "number of elements in the PIP_Solution_Node::basis vector.\n";
+#endif
+ return false;
+ }
+ if (var_column.size() != tableau.s.num_columns()) {
+#ifndef NDEBUG
+ cerr << "The number of elements in the PIP_Solution_Node::var_column "
+ << "vector is different from the number of columns in the "
+ << "PIP_Solution_Node::tableau.s matrix.\n";
+#endif
+ return false;
+ }
+ if (var_row.size() != tableau.s.num_rows()) {
+#ifndef NDEBUG
+ cerr << "The number of elements in the PIP_Solution_Node::var_row "
+ << "vector is different from the number of rows in the "
+ << "PIP_Solution_Node::tableau.s matrix.\n";
+#endif
+ return false;
+ }
+ for (dimension_type i = mapping.size(); i-- > 0; ) {
+ const dimension_type row_column = mapping[i];
+ if (basis[i] && var_column[row_column] != i) {
+#ifndef NDEBUG
+ cerr << "Variable " << i << " is basic and corresponds to column "
+ << row_column << " but PIP_Solution_Node::var_column["
+ << row_column << "] does not correspond to variable " << i
+ << ".\n";
+#endif
+ return false;
+ }
+ if (!basis[i] && var_row[row_column] != i) {
+#ifndef NDEBUG
+ cerr << "Variable " << i << " is nonbasic and corresponds to row "
+ << row_column << " but PIP_Solution_Node::var_row["
+ << row_column << "] does not correspond to variable " << i
+ << ".\n";
+#endif
+ return false;
+ }
+ }
+ // All checks passed.
+ return true;
+}
+
+bool
+PIP_Decision_Node::OK() const {
+ // Perform base class well-formedness check on this node.
+ if (!PIP_Tree_Node::OK())
+ return false;
+
+ // Recursively check if child nodes are well-formed.
+ if (false_child != 0 && !false_child->OK())
+ return false;
+ if (true_child != 0 && !true_child->OK())
+ return false;
+
+ // Decision nodes should always have a true child.
+ if (true_child == 0) {
+#ifndef NDEBUG
+ std::cerr << "PIP_Decision_Node with no 'true' child.\n";
+#endif
+ return false;
+ }
+
+ // Decision nodes with a false child must have exactly one constraint.
+ if (false_child != 0) {
+ const dimension_type dist = Implementation::num_constraints(constraints_);
+ if (dist != 1) {
+#ifndef NDEBUG
+ std::cerr << "PIP_Decision_Node with a 'false' child has "
+ << dist << " parametric constraints (should be 1).\n";
+#endif
+ return false;
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+void
+PIP_Decision_Node::update_tableau(
+ const PIP_Problem& pip,
+ const dimension_type external_space_dim,
+ const dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters) {
+
+ true_child->update_tableau(pip,
+ external_space_dim,
+ first_pending_constraint,
+ input_cs,
+ parameters);
+ if (false_child != 0)
+ false_child->update_tableau(pip,
+ external_space_dim,
+ first_pending_constraint,
+ input_cs,
+ parameters);
+ PPL_ASSERT(OK());
+}
+
+PIP_Tree_Node*
+PIP_Decision_Node::solve(const PIP_Problem& pip,
+ const bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ const int indent_level) {
+ PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level, "=== SOLVING DECISION NODE\n");
+#else
+ PPL_USED(indent_level);
+#endif
+ PPL_ASSERT(true_child != 0);
+ Matrix<Row> context_true(context);
+ Variables_Set all_params(params);
+ const dimension_type num_art_params = artificial_parameters.size();
+ add_artificial_parameters(context_true, all_params, space_dim,
+ num_art_params);
+ merge_assign(context_true, constraints_, all_params);
+ const bool has_false_child = (false_child != 0);
+ const bool has_true_child = (true_child != 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: SOLVING THEN CHILD\n");
+#endif
+ true_child = true_child->solve(pip, check_feasible_context,
+ context_true, all_params, space_dim,
+ indent_level + 1);
+
+ if (has_false_child) {
+ // Decision nodes with false child must have exactly one constraint
+ PPL_ASSERT(1 == Implementation::num_constraints(constraints_));
+ // NOTE: modify context_true in place, complementing its last constraint.
+ Matrix<Row>& context_false = context_true;
+ Row& last = context_false[context_false.num_rows() - 1];
+ complement_assign(last, last, 1);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: SOLVING ELSE CHILD\n");
+#endif
+ false_child = false_child->solve(pip, check_feasible_context,
+ context_false, all_params, space_dim,
+ indent_level + 1);
+ }
+
+ if (true_child == 0 && false_child == 0) {
+ // No children: the whole subtree is unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: BOTH BRANCHES NOW UNFEASIBLE: _|_\n");
+#endif
+ delete this;
+ return 0;
+ }
+
+ if (has_false_child && false_child == 0) {
+ // False child has become unfeasible: merge this node's artificials with
+ // the true child, while removing the local parameter constraints, which
+ // are no longer discriminative.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: ELSE BRANCH NOW UNFEASIBLE\n");
+ indent_and_print(std::cerr, indent_level,
+ "==> merge then branch with parent.\n");
+#endif
+ PIP_Tree_Node* const node = true_child;
+ node->parent_merge();
+ node->set_parent(parent());
+ true_child = 0;
+ delete this;
+ PPL_ASSERT(node->OK());
+ return node;
+ }
+ else if (has_true_child && true_child == 0) {
+ // True child has become unfeasible: merge this node's artificials
+ // with the false child.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: THEN BRANCH NOW UNFEASIBLE\n");
+ indent_and_print(std::cerr, indent_level,
+ "==> merge else branch with parent.\n");
+#endif
+ PIP_Tree_Node* const node = false_child;
+ node->parent_merge();
+ node->set_parent(parent());
+ false_child = 0;
+ delete this;
+ PPL_ASSERT(node->OK());
+ return node;
+ }
+ else if (check_feasible_context) {
+ // Test all constraints for redundancy with the context, and eliminate
+ // them if not necessary.
+ Constraint_System cs;
+ swap(cs, constraints_);
+ for (Constraint_System::const_iterator ci = cs.begin(),
+ ci_end = cs.end(); ci != ci_end; ++ci) {
+ Matrix<Row> ctx_copy(context);
+ merge_assign(ctx_copy, Constraint_System(*ci), all_params);
+ Row& last = ctx_copy[ctx_copy.num_rows()-1];
+ complement_assign(last, last, 1);
+ if (compatibility_check(ctx_copy)) {
+ // The constraint is not redundant with the context: keep it.
+ constraints_.insert(*ci);
+ }
+ }
+ // If the constraints set has become empty, only keep the true child.
+ if (constraints_.empty()) {
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== DECISION: NO BRANCHING CONSTRAINTS LEFT\n");
+ indent_and_print(std::cerr, indent_level,
+ "==> merge then branch with parent.\n");
+#endif
+ PIP_Tree_Node* const node = true_child;
+ node->parent_merge();
+ node->set_parent(parent());
+ true_child = 0;
+ delete this;
+ PPL_ASSERT(node->OK());
+ return node;
+ }
+ }
+ PPL_ASSERT(OK());
+ return this;
+}
+
+void
+PIP_Decision_Node::ascii_dump(std::ostream& s) const {
+ // Dump base class info.
+ PIP_Tree_Node::ascii_dump(s);
+
+ // Dump true child (if any).
+ s << "\ntrue_child: ";
+ if (true_child == 0) {
+ // Note: this branch should normally be unreachable code, since a
+ // well-formed decision node always has a true child. We keep this code
+ // for debugging purposes (since we want to dump broken nodes).
+ s << "BOTTOM\n";
+ }
+ else if (const PIP_Decision_Node* const dec = true_child->as_decision()) {
+ s << "DECISION\n";
+ dec->ascii_dump(s);
+ }
+ else {
+ const PIP_Solution_Node* const sol = true_child->as_solution();
+ PPL_ASSERT(sol != 0);
+ s << "SOLUTION\n";
+ sol->ascii_dump(s);
+ }
+
+ // Dump false child (if any).
+ s << "\nfalse_child: ";
+ if (false_child == 0)
+ s << "BOTTOM\n";
+ else if (const PIP_Decision_Node* const dec = false_child->as_decision()) {
+ // Note: this branch should normally be unreachable code.
+ // Since a well-formed decision node having a false child should have
+ // a single context constraint, its false child will have no context
+ // constraints at all, so that no further branch is possible.
+ // We keep this code for debugging purposes.
+ s << "DECISION\n";
+ dec->ascii_dump(s);
+ }
+ else {
+ const PIP_Solution_Node* const sol = false_child->as_solution();
+ PPL_ASSERT(sol != 0);
+ s << "SOLUTION\n";
+ sol->ascii_dump(s);
+ }
+}
+
+bool
+PIP_Decision_Node::ascii_load(std::istream& s) {
+ std::string str;
+
+ // Load base class info.
+ if (!PIP_Tree_Node::ascii_load(s))
+ return false;
+
+ // Release the "true" subtree (if any).
+ delete true_child;
+ true_child = 0;
+
+ // Load true child (if any).
+ if (!(s >> str) || str != "true_child:")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "BOTTOM")
+ // Note: normally unreachable code (see comment on ascii_dump).
+ true_child = 0;
+ else if (str == "DECISION") {
+ PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+ true_child = dec;
+ if (!dec->ascii_load(s))
+ return false;
+ }
+ else if (str == "SOLUTION") {
+ PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+ true_child = sol;
+ if (!sol->ascii_load(s))
+ return false;
+ }
+ else
+ // Unknown node kind.
+ return false;
+
+ // Release the "false" subtree (if any).
+ delete false_child;
+ false_child = 0;
+
+ // Load false child (if any).
+ if (!(s >> str) || str != "false_child:")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "BOTTOM")
+ false_child = 0;
+ else if (str == "DECISION") {
+ // Note: normally unreachable code (see comment on ascii_dump).
+ PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+ false_child = dec;
+ if (!dec->ascii_load(s))
+ return false;
+ }
+ else if (str == "SOLUTION") {
+ PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+ false_child = sol;
+ if (!sol->ascii_load(s))
+ return false;
+ }
+ else
+ // Unknown node kind.
+ return false;
+
+ // Loaded all info.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+
+void
+PIP_Solution_Node::Tableau::normalize() {
+ if (denom == 1)
+ return;
+
+ const dimension_type num_rows = s.num_rows();
+
+ // Compute global gcd.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd = denom;
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ WEIGHT_BEGIN();
+ const Row& s_i = s[i];
+ for (Row::const_iterator
+ j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference s_ij = *j;
+ if (s_ij != 0) {
+ WEIGHT_ADD(30);
+ gcd_assign(gcd, s_ij, gcd);
+ if (gcd == 1)
+ return;
+ }
+ }
+ WEIGHT_BEGIN();
+ const Row& t_i = t[i];
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference t_ij = *j;
+ if (t_ij != 0) {
+ WEIGHT_ADD(14);
+ gcd_assign(gcd, t_ij, gcd);
+ if (gcd == 1)
+ return;
+ }
+ }
+ }
+ PPL_ASSERT(gcd > 1);
+ // Normalize all coefficients.
+ WEIGHT_BEGIN();
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = s[i];
+ for (Row::iterator j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+ Coefficient& s_ij = *j;
+ WEIGHT_ADD(19);
+ exact_div_assign(s_ij, s_ij, gcd);
+ }
+ Row& t_i = t[i];
+ for (Row::iterator j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ Coefficient& t_ij = *j;
+ WEIGHT_ADD(27);
+ exact_div_assign(t_ij, t_ij, gcd);
+ }
+ }
+ // Normalize denominator.
+ exact_div_assign(denom, denom, gcd);
+}
+
+void
+PIP_Solution_Node::Tableau::scale(Coefficient_traits::const_reference ratio) {
+ WEIGHT_BEGIN();
+ for (dimension_type i = s.num_rows(); i-- > 0; ) {
+ Row& s_i = s[i];
+ for (Row::iterator j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(19);
+ *j *= ratio;
+ }
+ Row& t_i = t[i];
+ for (Row::iterator j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(25);
+ *j *= ratio;
+ }
+ }
+ denom *= ratio;
+}
+
+bool
+PIP_Solution_Node::Tableau
+::is_better_pivot(const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const dimension_type row_0,
+ const dimension_type col_0,
+ const dimension_type row_1,
+ const dimension_type col_1) const {
+ const dimension_type num_params = t.num_columns();
+ const dimension_type num_rows = s.num_rows();
+ const Row& s_0 = s[row_0];
+ const Row& s_1 = s[row_1];
+ Coefficient_traits::const_reference s_0_0 = s_0.get(col_0);
+ Coefficient_traits::const_reference s_1_1 = s_1.get(col_1);
+ const Row& t_0 = t[row_0];
+ const Row& t_1 = t[row_1];
+ PPL_DIRTY_TEMP_COEFFICIENT(product_0);
+ PPL_DIRTY_TEMP_COEFFICIENT(product_1);
+ WEIGHT_BEGIN();
+ // On exit from the loop, if j_mismatch == num_params then
+ // no column mismatch was found.
+ dimension_type j_mismatch = num_params;
+ Row::const_iterator j0 = t_0.end();
+ Row::const_iterator j0_end = t_0.end();
+ Row::const_iterator j1 = t_1.end();
+ Row::const_iterator j1_end = t_1.end();
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ const Row& s_i = s[i];
+ Coefficient_traits::const_reference s_i_col_0 = s_i.get(col_0);
+ Coefficient_traits::const_reference s_i_col_1 = s_i.get(col_1);
+ j0 = t_0.begin();
+ j1 = t_1.begin();
+ while (j0 != j0_end && j1 != j1_end) {
+ if (j0.index() == j1.index()) {
+ WEIGHT_ADD(1361);
+ product_0 = (*j0) * s_1_1 * s_i_col_0;
+ product_1 = (*j1) * s_0_0 * s_i_col_1;
+ if (product_0 != product_1) {
+ // Mismatch found: exit from both loops.
+ j_mismatch = j0.index();
+ goto end_loop;
+ }
+ ++j0;
+ ++j1;
+ }
+ else
+ if (j0.index() < j1.index()) {
+ if (*j0 != 0 && s_1_1 != 0 && s_i_col_0 != 0) {
+ // Mismatch found: exit from both loops.
+ j_mismatch = j0.index();
+ goto end_loop;
+ }
+ ++j0;
+ }
+ else {
+ PPL_ASSERT(j0.index() > j1.index());
+ if (*j1 != 0 && s_0_0 != 0 && s_i_col_1 != 0) {
+ // Mismatch found: exit from both loops.
+ j_mismatch = j1.index();
+ goto end_loop;
+ }
+ ++j1;
+ }
+ }
+ while (j0 != j0_end) {
+ if (*j0 != 0 && s_1_1 != 0 && s_i_col_0 != 0) {
+ // Mismatch found: exit from both loops.
+ j_mismatch = j0.index();
+ goto end_loop;
+ }
+ ++j0;
+ }
+ while (j1 != j1_end) {
+ if (*j1 != 0 && s_0_0 != 0 && s_i_col_1 != 0) {
+ // Mismatch found: exit from both loops.
+ j_mismatch = j1.index();
+ goto end_loop;
+ }
+ }
+ }
+
+ end_loop:
+ return (j_mismatch != num_params)
+ && column_lower(s, mapping, basis, s_0, col_0, s_1, col_1, *j0, *j1);
+}
+
+void
+PIP_Tree_Node::ascii_dump(std::ostream& s) const {
+ s << "constraints_\n";
+ constraints_.ascii_dump(s);
+ const dimension_type artificial_parameters_size
+ = artificial_parameters.size();
+ s << "\nartificial_parameters( " << artificial_parameters_size << " )\n";
+ for (dimension_type i = 0; i < artificial_parameters_size; ++i)
+ artificial_parameters[i].ascii_dump(s);
+}
+
+bool
+PIP_Tree_Node::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "constraints_")
+ return false;
+ constraints_.ascii_load(s);
+
+ if (!(s >> str) || str != "artificial_parameters(")
+ return false;
+ dimension_type artificial_parameters_size;
+ if (!(s >> artificial_parameters_size))
+ return false;
+ if (!(s >> str) || str != ")")
+ return false;
+ Artificial_Parameter ap;
+ for (dimension_type i = 0; i < artificial_parameters_size; ++i) {
+ if (!ap.ascii_load(s))
+ return false;
+ artificial_parameters.push_back(ap);
+ }
+
+ // Note: do not assert OK() here.
+ // The node invariants should be checked on derived nodes.
+ return true;
+}
+
+PIP_Tree_Node*
+PIP_Solution_Node::clone() const {
+ return new PIP_Solution_Node(*this);
+}
+
+PIP_Tree_Node*
+PIP_Decision_Node::clone() const {
+ return new PIP_Decision_Node(*this);
+}
+
+void
+PIP_Solution_Node::Tableau::ascii_dump(std::ostream& os) const {
+ os << "denominator " << denom << "\n";
+ os << "variables ";
+ s.ascii_dump(os);
+ os << "parameters ";
+ t.ascii_dump(os);
+}
+
+bool
+PIP_Solution_Node::Tableau::ascii_load(std::istream& is) {
+ std::string str;
+ if (!(is >> str) || str != "denominator")
+ return false;
+ Coefficient d;
+ if (!(is >> d))
+ return false;
+ denom = d;
+ if (!(is >> str) || str != "variables")
+ return false;
+ if (!s.ascii_load(is))
+ return false;
+ if (!(is >> str) || str != "parameters")
+ return false;
+ if (!t.ascii_load(is))
+ return false;
+ PPL_ASSERT(OK());
+ return true;
+}
+
+void
+PIP_Solution_Node::ascii_dump(std::ostream& os) const {
+ PIP_Tree_Node::ascii_dump(os);
+
+ os << "\ntableau\n";
+ tableau.ascii_dump(os);
+
+ os << "\nbasis ";
+ const dimension_type basis_size = basis.size();
+ os << basis_size;
+ for (dimension_type i = 0; i < basis_size; ++i)
+ os << (basis[i] ? " true" : " false");
+
+ os << "\nmapping ";
+ const dimension_type mapping_size = mapping.size();
+ os << mapping_size;
+ for (dimension_type i = 0; i < mapping_size; ++i)
+ os << " " << mapping[i];
+
+ os << "\nvar_row ";
+ const dimension_type var_row_size = var_row.size();
+ os << var_row_size;
+ for (dimension_type i = 0; i < var_row_size; ++i)
+ os << " " << var_row[i];
+
+ os << "\nvar_column ";
+ const dimension_type var_column_size = var_column.size();
+ os << var_column_size;
+ for (dimension_type i = 0; i < var_column_size; ++i)
+ os << " " << var_column[i];
+ os << "\n";
+
+ os << "special_equality_row " << special_equality_row << "\n";
+ os << "big_dimension " << big_dimension << "\n";
+
+ os << "sign ";
+ const dimension_type sign_size = sign.size();
+ os << sign_size;
+ for (dimension_type i = 0; i < sign_size; ++i) {
+ os << " ";
+ switch (sign[i]) {
+ case UNKNOWN:
+ os << "UNKNOWN";
+ break;
+ case ZERO:
+ os << "ZERO";
+ break;
+ case POSITIVE:
+ os << "POSITIVE";
+ break;
+ case NEGATIVE:
+ os << "NEGATIVE";
+ break;
+ case MIXED:
+ os << "MIXED";
+ break;
+ }
+ }
+ os << "\n";
+
+ const dimension_type solution_size = solution.size();
+ os << "solution " << solution_size << "\n";
+ for (dimension_type i = 0; i < solution_size; ++i)
+ solution[i].ascii_dump(os);
+ os << "\n";
+
+ os << "solution_valid " << (solution_valid ? "true" : "false") << "\n";
+}
+
+bool
+PIP_Solution_Node::ascii_load(std::istream& is) {
+ if (!PIP_Tree_Node::ascii_load(is))
+ return false;
+
+ std::string str;
+ if (!(is >> str) || str != "tableau")
+ return false;
+ if (!tableau.ascii_load(is))
+ return false;
+
+ if (!(is >> str) || str != "basis")
+ return false;
+ dimension_type basis_size;
+ if (!(is >> basis_size))
+ return false;
+ basis.clear();
+ for (dimension_type i = 0; i < basis_size; ++i) {
+ if (!(is >> str))
+ return false;
+ bool val = false;
+ if (str == "true")
+ val = true;
+ else if (str != "false")
+ return false;
+ basis.push_back(val);
+ }
+
+ if (!(is >> str) || str != "mapping")
+ return false;
+ dimension_type mapping_size;
+ if (!(is >> mapping_size))
+ return false;
+ mapping.clear();
+ for (dimension_type i = 0; i < mapping_size; ++i) {
+ dimension_type val;
+ if (!(is >> val))
+ return false;
+ mapping.push_back(val);
+ }
+
+ if (!(is >> str) || str != "var_row")
+ return false;
+ dimension_type var_row_size;
+ if (!(is >> var_row_size))
+ return false;
+ var_row.clear();
+ for (dimension_type i = 0; i < var_row_size; ++i) {
+ dimension_type val;
+ if (!(is >> val))
+ return false;
+ var_row.push_back(val);
+ }
+
+ if (!(is >> str) || str != "var_column")
+ return false;
+ dimension_type var_column_size;
+ if (!(is >> var_column_size))
+ return false;
+ var_column.clear();
+ for (dimension_type i = 0; i < var_column_size; ++i) {
+ dimension_type val;
+ if (!(is >> val))
+ return false;
+ var_column.push_back(val);
+ }
+
+ if (!(is >> str) || str != "special_equality_row")
+ return false;
+ if (!(is >> special_equality_row))
+ return false;
+
+ if (!(is >> str) || str != "big_dimension")
+ return false;
+ if (!(is >> big_dimension))
+ return false;
+
+ if (!(is >> str) || str != "sign")
+ return false;
+ dimension_type sign_size;
+ if (!(is >> sign_size))
+ return false;
+ sign.clear();
+ for (dimension_type i = 0; i < sign_size; ++i) {
+ if (!(is >> str))
+ return false;
+ Row_Sign val;
+ if (str == "UNKNOWN")
+ val = UNKNOWN;
+ else if (str == "ZERO")
+ val = ZERO;
+ else if (str == "POSITIVE")
+ val = POSITIVE;
+ else if (str == "NEGATIVE")
+ val = NEGATIVE;
+ else if (str == "MIXED")
+ val = MIXED;
+ else
+ return false;
+ sign.push_back(val);
+ }
+
+ if (!(is >> str) || str != "solution")
+ return false;
+ dimension_type solution_size;
+ if (!(is >> solution_size))
+ return false;
+ solution.clear();
+ for (dimension_type i = 0; i < solution_size; ++i) {
+ Linear_Expression val;
+ if (!val.ascii_load(is))
+ return false;
+ solution.push_back(val);
+ }
+
+ if (!(is >> str) || str != "solution_valid")
+ return false;
+ if (!(is >> str))
+ return false;
+ if (str == "true")
+ solution_valid = true;
+ else if (str == "false")
+ solution_valid = false;
+ else
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+PIP_Solution_Node::Row_Sign
+PIP_Solution_Node::row_sign(const Row& x,
+ const dimension_type big_dimension) {
+ if (big_dimension != not_a_dimension()) {
+ // If a big parameter has been set and its coefficient is not zero,
+ // then return the sign of the coefficient.
+ Coefficient_traits::const_reference x_big = x.get(big_dimension);
+ if (x_big > 0)
+ return POSITIVE;
+ if (x_big < 0)
+ return NEGATIVE;
+ // Otherwise x_big == 0, then no big parameter involved.
+ }
+
+ PIP_Solution_Node::Row_Sign sign = ZERO;
+ for (Row::const_iterator i = x.begin(), i_end = x.end(); i != i_end; ++i) {
+ Coefficient_traits::const_reference x_i = *i;
+ if (x_i > 0) {
+ if (sign == NEGATIVE)
+ return MIXED;
+ sign = POSITIVE;
+ }
+ else if (x_i < 0) {
+ if (sign == POSITIVE)
+ return MIXED;
+ sign = NEGATIVE;
+ }
+ }
+ return sign;
+}
+
+bool
+PIP_Tree_Node::compatibility_check(const Matrix<Row>& context, const Row& row) {
+ // CHECKME: do `context' and `row' have compatible (row) capacity?
+ Matrix<Row> s(context);
+ s.add_row(row);
+ return compatibility_check(s);
+}
+
+bool
+PIP_Tree_Node::compatibility_check(Matrix<Row>& s) {
+ PPL_ASSERT(s.OK());
+ // Note: num_rows may increase.
+ dimension_type num_rows = s.num_rows();
+ const dimension_type num_columns = s.num_columns();
+ const dimension_type num_vars = num_columns - 1;
+
+ std::vector<Coefficient> scaling(num_rows, 1);
+ std::vector<bool> basis;
+ basis.reserve(num_vars + num_rows);
+ std::vector<dimension_type> mapping;
+ mapping.reserve(num_vars + num_rows);
+ std::vector<dimension_type> var_row;
+ var_row.reserve(num_rows);
+ std::vector<dimension_type> var_column;
+ var_column.reserve(num_columns);
+
+ // Column 0 is the constant term, not a variable
+ var_column.push_back(not_a_dimension());
+ for (dimension_type j = 1; j <= num_vars; ++j) {
+ basis.push_back(true);
+ mapping.push_back(j);
+ var_column.push_back(j - 1);
+ }
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ basis.push_back(false);
+ mapping.push_back(i);
+ var_row.push_back(i + num_vars);
+ }
+
+ // Scaling factor (i.e., denominator) for pivot coefficients.
+ PPL_DIRTY_TEMP_COEFFICIENT(pivot_denom);
+ // Allocate once and for all: short life temporaries.
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ PPL_DIRTY_TEMP_COEFFICIENT(scale_factor);
+
+ // Perform simplex pivots on the context
+ // until we find an empty solution or an optimum.
+ while (true) {
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ // pi is the pivot's row index.
+ dimension_type pi = num_rows;
+ // pj is the pivot's column index.
+ dimension_type pj = 0;
+
+ const bool found_positive_pivot_candidate
+ = compatibility_check_find_pivot(s, mapping, basis, pi, pj);
+
+ if (!found_positive_pivot_candidate)
+ return false;
+
+ if (pj == 0) {
+ // No negative RHS: fractional optimum found.
+ // If it is integer, then the test is successful.
+ // Otherwise, generate a new cut.
+ bool all_integer_vars = true;
+ // NOTE: iterating downwards would be correct, but it would change
+ // the ordering of cut generation.
+ WEIGHT_BEGIN();
+ for (dimension_type i = 0; i < num_vars; ++i) {
+ if (basis[i])
+ // Basic variable = 0, hence integer.
+ continue;
+ // Not a basic variable.
+ WEIGHT_ADD(70);
+ const dimension_type mi = mapping[i];
+ Coefficient_traits::const_reference denom = scaling[mi];
+ if (s[mi].get(0) % denom == 0)
+ continue;
+ // Here constant term is not integer.
+ all_integer_vars = false;
+ // Generate a new cut.
+ var_row.push_back(mapping.size());
+ basis.push_back(false);
+ mapping.push_back(num_rows);
+ s.add_zero_rows(1);
+ Row& cut = s[num_rows];
+ ++num_rows;
+ const Row& s_mi = s[mi];
+ cut = s_mi;
+ for (Row::iterator
+ j = cut.begin(), j_end = cut.end(); j != j_end; ++j) {
+ WEIGHT_ADD(32);
+ pos_rem_assign(*j, *j, denom);
+ }
+ cut[0] -= denom;
+ scaling.push_back(denom);
+ }
+ // Check if an integer solution was found.
+ if (all_integer_vars)
+ return true;
+ else
+ continue;
+ }
+
+ // Here we have a positive s[pi][pj] pivot.
+
+ // Normalize the tableau before pivoting.
+ for (dimension_type i = num_rows; i-- > 0; )
+ row_normalize(s[i], scaling[i]);
+
+ // Update basis.
+ {
+ const dimension_type var_pi = var_row[pi];
+ const dimension_type var_pj = var_column[pj];
+ var_row[pi] = var_pj;
+ var_column[pj] = var_pi;
+ basis[var_pi] = true;
+ basis[var_pj] = false;
+ mapping[var_pi] = pj;
+ mapping[var_pj] = pi;
+ }
+
+ // Create an identity row corresponding to basic variable pj.
+ s.add_zero_rows(1);
+ Row& pivot = s[num_rows];
+ pivot[pj] = 1;
+
+ // Swap identity row with the pivot row previously found.
+ using std::swap;
+ swap(pivot, s[pi]);
+ // Save original pivot scaling factor in a temporary,
+ // then reset scaling factor for identity row.
+ pivot_denom = scaling[pi];
+ scaling[pi] = 1;
+
+ // Perform a pivot operation on the matrix.
+ Coefficient_traits::const_reference pivot_pj = pivot.get(pj);
+ {
+ for (Row::const_iterator
+ j = pivot.begin(), j_end = pivot.end(); j != j_end; ++j) {
+ if (j.index() == pj)
+ continue;
+ Coefficient_traits::const_reference pivot_j = *j;
+ // Do nothing if the j-th pivot element is zero.
+ if (pivot_j == 0)
+ continue;
+ WEIGHT_BEGIN();
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = s[i];
+ product = s_i.get(pj) * pivot_j;
+ if (product % pivot_pj != 0) {
+ WEIGHT_ADD(103);
+ // Must scale row s_i to stay in integer case.
+ gcd_assign(gcd, product, pivot_pj);
+ exact_div_assign(scale_factor, pivot_pj, gcd);
+ for (Row::iterator
+ k = s_i.begin(), k_end = s_i.end(); k != k_end; ++k) {
+ WEIGHT_ADD(30);
+ *k *= scale_factor;
+ }
+ product *= scale_factor;
+ scaling[i] *= scale_factor;
+ }
+ PPL_ASSERT(product % pivot_pj == 0);
+ exact_div_assign(product, product, pivot_pj);
+ s_i[j.index()] -= product;
+ WEIGHT_ADD(134);
+ }
+ }
+ }
+ // Update column only if pivot coordinate != 1.
+ if (pivot_pj != pivot_denom) {
+ WEIGHT_BEGIN();
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = s[i];
+ Coefficient& s_i_pj = s_i[pj];
+ product = s_i_pj * pivot_denom;
+ if (product % pivot_pj != 0) {
+ WEIGHT_ADD(98);
+ // As above, perform row scaling.
+ gcd_assign(gcd, product, pivot_pj);
+ exact_div_assign(scale_factor, pivot_pj, gcd);
+ for (Row::iterator
+ k = s_i.begin(), k_end = s_i.end(); k != k_end; ++k) {
+ WEIGHT_ADD(26);
+ *k *= scale_factor;
+ }
+ product *= scale_factor;
+ scaling[i] *= scale_factor;
+ }
+ PPL_ASSERT(product % pivot_pj == 0);
+ exact_div_assign(s_i_pj, product, pivot_pj);
+ WEIGHT_ADD(97);
+ }
+ }
+ // Drop pivot to restore proper matrix size.
+ s.remove_trailing_rows(1);
+ }
+
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+void
+PIP_Solution_Node
+::update_tableau(const PIP_Problem& pip,
+ const dimension_type external_space_dim,
+ const dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters) {
+
+ // Make sure a parameter column exists, for the inhomogeneous term.
+ if (tableau.t.num_columns() == 0)
+ tableau.t.add_zero_columns(1);
+
+ // NOTE: here 'params' stands for problem (i.e., non artificial) parameters.
+ const dimension_type old_num_vars = tableau.s.num_columns();
+ const dimension_type old_num_params
+ = pip.internal_space_dim - old_num_vars;
+ const dimension_type num_added_dims
+ = pip.external_space_dim - pip.internal_space_dim;
+ const dimension_type new_num_params = parameters.size();
+ const dimension_type num_added_params = new_num_params - old_num_params;
+ const dimension_type num_added_vars = num_added_dims - num_added_params;
+
+ // Resize the two tableau matrices.
+ if (num_added_vars > 0)
+ tableau.s.add_zero_columns(num_added_vars);
+
+ if (num_added_params > 0)
+ tableau.t.add_zero_columns(num_added_params, old_num_params + 1);
+
+ dimension_type new_var_column = old_num_vars;
+ const dimension_type initial_space_dim = old_num_vars + old_num_params;
+ for (dimension_type i = initial_space_dim; i < external_space_dim; ++i) {
+ if (parameters.count(i) == 0) {
+ // A new problem variable.
+ if (tableau.s.num_rows() == 0) {
+ // No rows have been added yet
+ basis.push_back(true);
+ mapping.push_back(new_var_column);
+ }
+ else {
+ /*
+ Need to insert the original variable id
+ before the slack variable id's to respect variable ordering.
+ */
+ basis.insert(nth_iter(basis, new_var_column), true);
+ mapping.insert(nth_iter(mapping, new_var_column), new_var_column);
+ // Update variable id's of slack variables.
+ for (dimension_type j = var_row.size(); j-- > 0; )
+ if (var_row[j] >= new_var_column)
+ ++var_row[j];
+ for (dimension_type j = var_column.size(); j-- > 0; )
+ if (var_column[j] >= new_var_column)
+ ++var_column[j];
+ if (special_equality_row > 0)
+ ++special_equality_row;
+ }
+ var_column.push_back(new_var_column);
+ ++new_var_column;
+ }
+ }
+
+ if (big_dimension == not_a_dimension()
+ && pip.big_parameter_dimension != not_a_dimension()) {
+ // Compute the column number of big parameter in tableau.t matrix.
+ Variables_Set::const_iterator pos
+ = parameters.find(pip.big_parameter_dimension);
+ big_dimension = 1U
+ + static_cast<dimension_type>(std::distance(parameters.begin(), pos));
+ }
+
+ Coefficient_traits::const_reference denom = tableau.denominator();
+
+ for (Constraint_Sequence::const_iterator
+ c_iter = nth_iter(input_cs, first_pending_constraint),
+ c_end = input_cs.end(); c_iter != c_end; ++c_iter) {
+ const Constraint& constraint = *c_iter;
+ // (Tentatively) Add new rows to s and t matrices.
+ // These will be removed at the end if they turn out to be useless.
+ const dimension_type row_id = tableau.s.num_rows();
+ tableau.s.add_zero_rows(1);
+ tableau.t.add_zero_rows(1);
+ Row& v_row = tableau.s[row_id];
+ Row& p_row = tableau.t[row_id];
+
+ {
+ dimension_type p_index = 1;
+ dimension_type v_index = 0;
+ // Setting the inhomogeneous term.
+ if (constraint.inhomogeneous_term() != 0) {
+ Coefficient& p_row0 = p_row[0];
+ p_row0 = constraint.inhomogeneous_term();
+ if (constraint.is_strict_inequality())
+ // Transform (expr > 0) into (expr - 1 >= 0).
+ --p_row0;
+ p_row0 *= denom;
+ }
+ else {
+ if (constraint.is_strict_inequality())
+ // Transform (expr > 0) into (expr - 1 >= 0).
+ neg_assign(p_row[0], denom);
+ }
+ WEIGHT_BEGIN();
+ dimension_type last_dim = 0;
+ const Constraint::expr_type e = constraint.expression();
+ for (Constraint::expr_type::const_iterator
+ i = e.begin(), i_end = e.end(); i != i_end; ++i) {
+ const dimension_type dim = i.variable().space_dimension();
+ if (dim != last_dim + 1) {
+ // We have skipped some zero coefficients.
+ // Update p_index and v_index accordingly.
+ const dimension_type n
+ = std::distance(parameters.lower_bound(last_dim),
+ parameters.lower_bound(dim - 1));
+ const dimension_type num_skipped = dim - last_dim - 1;
+ p_index += n;
+ v_index += (num_skipped - n);
+ }
+ PPL_ASSERT(p_index + v_index == i.variable().id() + 1);
+ const bool is_parameter = (1 == parameters.count(dim - 1));
+ Coefficient_traits::const_reference coeff_i = *i;
+
+ WEIGHT_ADD(140);
+ if (is_parameter) {
+ p_row.insert(p_index, coeff_i * denom);
+ ++p_index;
+ }
+ else {
+ const dimension_type mv = mapping[v_index];
+ if (basis[v_index]) {
+ // Basic variable: add coeff_i * x_i
+ add_mul_assign(v_row[mv], coeff_i, denom);
+ }
+ else {
+ // Non-basic variable: add coeff_i * row_i
+ add_mul_assign_row(v_row, coeff_i, tableau.s[mv]);
+ add_mul_assign_row(p_row, coeff_i, tableau.t[mv]);
+ }
+ ++v_index;
+ }
+
+ last_dim = dim;
+ }
+ }
+
+ if (row_sign(v_row, not_a_dimension()) == ZERO) {
+ // Parametric-only constraints have already been inserted in
+ // initial context, so no need to insert them in the tableau.
+ tableau.s.remove_trailing_rows(1);
+ tableau.t.remove_trailing_rows(1);
+ }
+ else {
+ const dimension_type var_id = mapping.size();
+ sign.push_back(row_sign(p_row, big_dimension));
+ basis.push_back(false);
+ mapping.push_back(row_id);
+ var_row.push_back(var_id);
+ if (constraint.is_equality()) {
+ // Handle equality constraints.
+ // After having added the f_i(x,p) >= 0 constraint,
+ // we must add -f_i(x,p) to the special equality row.
+ if (special_equality_row == 0 || basis[special_equality_row]) {
+ // The special constraint has not been created yet
+ // FIXME: for now, we do not handle the case where the variable
+ // is basic, and we just create a new row.
+ // This might be faster however.
+ tableau.s.add_zero_rows(1);
+ tableau.t.add_zero_rows(1);
+ // NOTE: addition of rows invalidates references v_row and p_row
+ // due to possible matrix reallocations: recompute them.
+ neg_assign_row(tableau.s[1 + row_id], tableau.s[row_id]);
+ neg_assign_row(tableau.t[1 + row_id], tableau.t[row_id]);
+ sign.push_back(row_sign(tableau.t[1 + row_id], big_dimension));
+ special_equality_row = mapping.size();
+ basis.push_back(false);
+ mapping.push_back(1 + row_id);
+ var_row.push_back(1 + var_id);
+ }
+ else {
+ // The special constraint already exists and is nonbasic.
+ const dimension_type m_eq = mapping[special_equality_row];
+ sub_assign(tableau.s[m_eq], v_row);
+ sub_assign(tableau.t[m_eq], p_row);
+ sign[m_eq] = row_sign(tableau.t[m_eq], big_dimension);
+ }
+ }
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+PIP_Tree_Node*
+PIP_Solution_Node::solve(const PIP_Problem& pip,
+ const bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ const int indent_level) {
+ PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level, "=== SOLVING NODE\n");
+#else
+ PPL_USED(indent_level);
+#endif
+ // Reset current solution as invalid.
+ solution_valid = false;
+
+ Matrix<Row> ctx(context);
+ Variables_Set all_params(params);
+ const dimension_type num_art_params = artificial_parameters.size();
+ add_artificial_parameters(ctx, all_params, space_dim, num_art_params);
+ merge_assign(ctx, constraints_, all_params);
+
+ // If needed, (re-)check feasibility of context.
+ if (check_feasible_context) {
+ Matrix<Row> ctx_copy(ctx);
+ if (!compatibility_check(ctx_copy)) {
+ delete this;
+ return 0;
+ }
+ }
+
+ const dimension_type not_a_dim = not_a_dimension();
+
+ // Main loop of the simplex algorithm.
+ while (true) {
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ PPL_ASSERT(OK());
+
+ const dimension_type num_rows = tableau.t.num_rows();
+ const dimension_type num_vars = tableau.s.num_columns();
+ const dimension_type num_params = tableau.t.num_columns();
+ Coefficient_traits::const_reference tableau_denom = tableau.denominator();
+
+#ifdef VERY_NOISY_PIP
+ tableau.ascii_dump(std::cerr);
+ std::cerr << "context ";
+ ctx.ascii_dump(std::cerr);
+#endif // #ifdef VERY_NOISY_PIP
+
+ // (Re-) Compute parameter row signs.
+ // While at it, keep track of the first parameter rows
+ // having negative and mixed sign.
+ dimension_type first_negative = not_a_dim;
+ dimension_type first_mixed = not_a_dim;
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ Row_Sign& sign_i = sign[i];
+ if (sign_i == UNKNOWN || sign_i == MIXED)
+ sign_i = row_sign(tableau.t[i], big_dimension);
+
+ if (sign_i == NEGATIVE && first_negative == not_a_dim)
+ first_negative = i;
+ else if (sign_i == MIXED && first_mixed == not_a_dim)
+ first_mixed = i;
+ }
+
+ // If no negative parameter row was found, try to refine the sign of
+ // mixed rows using compatibility checks with the current context.
+ if (first_negative == not_a_dim && first_mixed != not_a_dim) {
+ for (dimension_type i = first_mixed; i < num_rows; ++i) {
+ // Consider mixed sign parameter rows only.
+ if (sign[i] != MIXED)
+ continue;
+ const Row& t_i = tableau.t[i];
+ Row_Sign new_sign = ZERO;
+ // Check compatibility for constraint t_i(z) >= 0.
+ if (compatibility_check(ctx, t_i))
+ new_sign = POSITIVE;
+ // Check compatibility for constraint t_i(z) < 0,
+ // i.e., -t_i(z) - 1 >= 0.
+ Row t_i_complement(num_params);
+ complement_assign(t_i_complement, t_i, tableau_denom);
+ if (compatibility_check(ctx, t_i_complement))
+ new_sign = (new_sign == POSITIVE) ? MIXED : NEGATIVE;
+ // Update sign for parameter row i.
+ sign[i] = new_sign;
+ // Maybe update first_negative and first_mixed.
+ if (new_sign == NEGATIVE && first_negative == not_a_dim) {
+ first_negative = i;
+ if (i == first_mixed)
+ first_mixed = not_a_dim;
+ }
+ else if (new_sign == MIXED) {
+ if (first_mixed == not_a_dim)
+ first_mixed = i;
+ }
+ else if (i == first_mixed)
+ first_mixed = not_a_dim;
+ }
+ }
+
+ // If there still is no negative parameter row and a mixed sign
+ // parameter row (first_mixed) such that:
+ // - it has at least one positive variable coefficient;
+ // - constraint t_i(z) > 0 is not compatible with the context;
+ // then this parameter row can be considered negative.
+ if (first_negative == not_a_dim && first_mixed != not_a_dim) {
+ WEIGHT_BEGIN();
+ for (dimension_type i = first_mixed; i < num_rows; ++i) {
+ // Consider mixed sign parameter rows only.
+ if (sign[i] != MIXED)
+ continue;
+ // Check for a positive variable coefficient.
+ const Row& s_i = tableau.s[i];
+ bool has_positive = false;
+ {
+ for (Row::const_iterator
+ j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j)
+ if (*j > 0) {
+ has_positive = true;
+ break;
+ }
+ }
+ if (!has_positive)
+ continue;
+ // Check compatibility of constraint t_i(z) > 0.
+ Row row(tableau.t[i]);
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ Coefficient& row0 = row[0];
+ pos_rem_assign(mod, row0, tableau_denom);
+ row0 -= (mod == 0) ? tableau_denom : mod;
+ WEIGHT_ADD(210);
+ const bool compatible = compatibility_check(ctx, row);
+ // Maybe update sign (and first_* indices).
+ if (compatible) {
+ // Sign is still mixed.
+ if (first_mixed == not_a_dim)
+ first_mixed = i;
+ }
+ else {
+ // Sign becomes negative (i.e., no longer mixed).
+ sign[i] = NEGATIVE;
+ if (first_negative == not_a_dim)
+ first_negative = i;
+ if (first_mixed == i)
+ first_mixed = not_a_dim;
+ }
+ }
+ }
+
+#ifdef VERY_NOISY_PIP
+ std::cerr << "sign =";
+ for (dimension_type i = 0; i < sign.size(); ++i)
+ std::cerr << " " << "?0+-*"[sign[i]];
+ std::cerr << std::endl;
+#endif // #ifdef VERY_NOISY_PIP
+
+ // If we have found a negative parameter row, then
+ // either the problem is unfeasible, or a pivoting step is required.
+ if (first_negative != not_a_dim) {
+
+ // Search for the best pivot row.
+ dimension_type pi = not_a_dim;
+ dimension_type pj = not_a_dim;
+ for (dimension_type i = first_negative; i < num_rows; ++i) {
+ if (sign[i] != NEGATIVE)
+ continue;
+ dimension_type j;
+ if (!find_lexico_minimal_column(tableau.s, mapping, basis,
+ tableau.s[i], 0, j)) {
+ // No positive s_ij was found: problem is unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "No positive pivot: Solution = _|_\n");
+#endif // #ifdef NOISY_PIP_TREE_STRUCTURE
+ delete this;
+ return 0;
+ }
+ if (pj == not_a_dim
+ || tableau.is_better_pivot(mapping, basis, i, j, pi, pj)) {
+ // Update pivot indices.
+ pi = i;
+ pj = j;
+ if (pip.control_parameters[PIP_Problem::PIVOT_ROW_STRATEGY]
+ == PIP_Problem::PIVOT_ROW_STRATEGY_FIRST)
+ // Stop at first valid row.
+ break;
+ }
+ }
+
+#ifdef VERY_NOISY_PIP
+ std::cerr << "Pivot (pi, pj) = (" << pi << ", " << pj << ")\n";
+#endif // #ifdef VERY_NOISY_PIP
+
+ // Normalize the tableau before pivoting.
+ tableau.normalize();
+
+ // Perform pivot operation.
+
+ // Update basis.
+ {
+ const dimension_type var_pi = var_row[pi];
+ const dimension_type var_pj = var_column[pj];
+ var_row[pi] = var_pj;
+ var_column[pj] = var_pi;
+ basis[var_pi] = true;
+ basis[var_pj] = false;
+ mapping[var_pi] = pj;
+ mapping[var_pj] = pi;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ PPL_DIRTY_TEMP_COEFFICIENT(scale_factor);
+
+ // Creating identity rows corresponding to basic variable pj:
+ // 1. add them to tableau so as to have proper size and capacity;
+ tableau.s.add_zero_rows(1);
+ tableau.t.add_zero_rows(1);
+ // 2. swap the rows just added with empty ones.
+ Row s_pivot(0);
+ Row t_pivot(0);
+ swap(s_pivot, tableau.s[num_rows]);
+ swap(t_pivot, tableau.t[num_rows]);
+ // 3. drop rows previously added at end of tableau.
+ tableau.s.remove_trailing_rows(1);
+ tableau.t.remove_trailing_rows(1);
+
+ // Save current pivot denominator.
+ PPL_DIRTY_TEMP_COEFFICIENT(pivot_denom);
+ pivot_denom = tableau.denominator();
+ // Let the (scaled) pivot coordinate be 1.
+ s_pivot[pj] = pivot_denom;
+
+ // Swap identity row with the pivot row previously found.
+ s_pivot.m_swap(tableau.s[pi]);
+ t_pivot.m_swap(tableau.t[pi]);
+ sign[pi] = ZERO;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(s_pivot_pj);
+ s_pivot_pj = s_pivot.get(pj);
+
+ // Compute columns s[*][j]:
+ //
+ // <CODE>
+ // s[i][j] -= s[i][pj] * s_pivot[j] / s_pivot_pj;
+ // </CODE>
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = tableau.s[i];
+ PPL_DIRTY_TEMP_COEFFICIENT(s_i_pj);
+ s_i_pj = s_i.get(pj);
+
+ if (s_i_pj == 0)
+ continue;
+
+ WEIGHT_BEGIN();
+ Row::iterator itr = s_i.end();
+ for (Row::const_iterator
+ j = s_pivot.begin(), j_end = s_pivot.end(); j != j_end; ++j) {
+ if (j.index() != pj) {
+ Coefficient_traits::const_reference s_pivot_j = *j;
+ // Do nothing if the j-th pivot element is zero.
+ if (s_pivot_j != 0) {
+ product = s_pivot_j * s_i_pj;
+ if (product % s_pivot_pj != 0) {
+ // Must scale matrix to stay in integer case.
+ gcd_assign(gcd, product, s_pivot_pj);
+ exact_div_assign(scale_factor, s_pivot_pj, gcd);
+ tableau.scale(scale_factor);
+ s_i_pj *= scale_factor;
+ product *= scale_factor;
+ WEIGHT_ADD(102);
+ }
+ PPL_ASSERT(product % s_pivot_pj == 0);
+ exact_div_assign(product, product, s_pivot_pj);
+ WEIGHT_ADD(130);
+ if (product != 0) {
+ itr = s_i.insert(itr, j.index());
+ *itr -= product;
+ WEIGHT_ADD(34);
+ }
+ }
+ }
+ }
+ }
+
+ // Compute columns t[*][j]:
+ //
+ // <CODE>
+ // t[i][j] -= s[i][pj] * t_pivot[j] / s_pivot_pj;
+ // </CODE>
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = tableau.s[i];
+ Row& t_i = tableau.t[i];
+
+ Row::iterator s_i_pj_itr = s_i.find(pj);
+
+ if (s_i_pj_itr == s_i.end())
+ continue;
+
+ // FIXME: the following comment does not make sense.
+ // NOTE: This is a Coefficient& instead of a
+ // Coefficient_traits::const_reference, because scale() may silently
+ // modify it.
+ const Coefficient& s_i_pj = *s_i_pj_itr;
+
+ if (s_i_pj == 0)
+ continue;
+
+ WEIGHT_BEGIN();
+ Row::iterator k = t_i.end();
+ for (Row::const_iterator
+ j = t_pivot.begin(), j_end = t_pivot.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference t_pivot_j = *j;
+ // Do nothing if the j-th pivot element is zero.
+ if (t_pivot_j != 0) {
+ product = t_pivot_j * s_i_pj;
+ if (product % s_pivot_pj != 0) {
+ // Must scale matrix to stay in integer case.
+ gcd_assign(gcd, product, s_pivot_pj);
+ exact_div_assign(scale_factor, s_pivot_pj, gcd);
+ tableau.scale(scale_factor);
+ product *= scale_factor;
+ WEIGHT_ADD(261);
+ }
+ PPL_ASSERT(product % s_pivot_pj == 0);
+ exact_div_assign(product, product, s_pivot_pj);
+ WEIGHT_ADD(115);
+ if (product != 0) {
+ k = t_i.insert(k, j.index());
+ *k -= product;
+ WEIGHT_ADD(41);
+ }
+
+ // Update row sign.
+ Row_Sign& sign_i = sign[i];
+ switch (sign_i) {
+ case ZERO:
+ if (product > 0)
+ sign_i = NEGATIVE;
+ else if (product < 0)
+ sign_i = POSITIVE;
+ break;
+ case POSITIVE:
+ if (product > 0)
+ sign_i = MIXED;
+ break;
+ case NEGATIVE:
+ if (product < 0)
+ sign_i = MIXED;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ // Compute column s[*][pj]: s[i][pj] /= s_pivot_pj;
+ // Update column only if pivot coordinate != 1.
+ if (s_pivot_pj != pivot_denom) {
+ WEIGHT_BEGIN();
+ Row::iterator itr;
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row& s_i = tableau.s[i];
+ itr = s_i.find(pj);
+ if (itr == s_i.end())
+ continue;
+ WEIGHT_ADD(43);
+ product = *itr * pivot_denom;
+ if (product % s_pivot_pj != 0) {
+ // As above, perform matrix scaling.
+ gcd_assign(gcd, product, s_pivot_pj);
+ exact_div_assign(scale_factor, s_pivot_pj, gcd);
+ tableau.scale(scale_factor);
+ product *= scale_factor;
+ WEIGHT_ADD(177);
+ }
+ PPL_ASSERT(product % s_pivot_pj == 0);
+ if (product != 0 || *itr != 0) {
+ WEIGHT_ADD(106);
+ exact_div_assign(*itr, product, s_pivot_pj);
+ }
+ }
+ }
+
+ // Pivoting process ended: jump to next iteration.
+ continue;
+ } // if (first_negative != not_a_dim)
+
+
+ PPL_ASSERT(first_negative == not_a_dim);
+ // If no negative parameter row was found,
+ // but a mixed parameter row was found ...
+ if (first_mixed != not_a_dim) {
+ // Look for a constraint (i_neg):
+ // - having mixed parameter sign;
+ // - having no positive variable coefficient;
+ // - minimizing the score (sum of parameter coefficients).
+ dimension_type i_neg = not_a_dim;
+ PPL_DIRTY_TEMP_COEFFICIENT(best_score);
+ PPL_DIRTY_TEMP_COEFFICIENT(score);
+ for (dimension_type i = first_mixed; i < num_rows; ++i) {
+ // Mixed parameter sign.
+ if (sign[i] != MIXED)
+ continue;
+ // No positive variable coefficient.
+ bool has_positive = false;
+ {
+ const Row& s_i = tableau.s[i];
+ for (Row::const_iterator
+ j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j)
+ if (*j > 0) {
+ has_positive = true;
+ break;
+ }
+ }
+ if (has_positive)
+ continue;
+ // Minimize parameter coefficient score,
+ // eliminating implicated tautologies (if any).
+ score = 0;
+ {
+ WEIGHT_BEGIN();
+ const Row& t_i = tableau.t[i];
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(55);
+ score += *j;
+ }
+ }
+ if (i_neg == not_a_dim || score < best_score) {
+ i_neg = i;
+ best_score = score;
+ }
+ }
+
+ if (i_neg != not_a_dim) {
+ Row tautology = tableau.t[i_neg];
+ /* Simplify tautology by exploiting integrality. */
+ integral_simplification(tautology);
+ ctx.add_row(tautology);
+ add_constraint(tautology, all_params);
+ sign[i_neg] = POSITIVE;
+#ifdef NOISY_PIP
+ {
+ Linear_Expression expr = Linear_Expression(tautology.get(0));
+ dimension_type j = 1;
+ for (Variables_Set::const_iterator p = all_params.begin(),
+ p_end = all_params.end(); p != p_end; ++p, ++j)
+ add_mul_assign(expr, tautology.get(j), Variable(*p));
+ using namespace IO_Operators;
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Row " << i_neg
+ << ": mixed param sign, negative var coeffs\n";
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "==> adding tautology: "
+ << Constraint(expr >= 0) << ".\n";
+ }
+#endif // #ifdef NOISY_PIP
+ // Jump to next iteration.
+ continue;
+ }
+
+ PPL_ASSERT(i_neg == not_a_dim);
+ // Heuristically choose "best" (mixed) pivoting row.
+ dimension_type best_i = not_a_dim;
+ for (dimension_type i = first_mixed; i < num_rows; ++i) {
+ if (sign[i] != MIXED)
+ continue;
+ score = 0;
+ {
+ WEIGHT_BEGIN();
+ const Row& t_i = tableau.t[i];
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(51);
+ score += *j;
+ }
+ }
+ if (best_i == not_a_dim || score < best_score) {
+ best_score = score;
+ best_i = i;
+ }
+ }
+
+ Row t_test(tableau.t[best_i]);
+ /* Simplify t_test by exploiting integrality. */
+ integral_simplification(t_test);
+
+#ifdef NOISY_PIP
+ {
+ Linear_Expression expr = Linear_Expression(t_test.get(0));
+ dimension_type j = 1;
+ for (Variables_Set::const_iterator p = all_params.begin(),
+ p_end = all_params.end(); p != p_end; ++p, ++j)
+ add_mul_assign(expr, t_test.get(j), Variable(*p));
+ using namespace IO_Operators;
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Row " << best_i << ": mixed param sign\n";
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "==> depends on sign of " << expr << ".\n";
+ }
+#endif // #ifdef NOISY_PIP
+
+ // Create a solution node for the "true" version of current node.
+ PIP_Tree_Node* t_node = new PIP_Solution_Node(*this, No_Constraints());
+ // Protect it from exception safety issues via std::auto_ptr.
+ std::auto_ptr<PIP_Tree_Node> wrapped_node(t_node);
+
+ // Add parametric constraint to context.
+ ctx.add_row(t_test);
+ // Recursively solve true node with respect to updated context.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level, "=== SOLVING THEN CHILD\n");
+#endif
+ t_node = t_node->solve(pip, check_feasible_context,
+ ctx, all_params, space_dim,
+ indent_level + 1);
+ // Resolution may have changed t_node: in case, re-wrap it.
+ if (t_node != wrapped_node.get()) {
+ wrapped_node.release();
+ wrapped_node.reset(t_node);
+ }
+
+ // Modify *this in place to become the "false" version of current node.
+ PIP_Tree_Node* f_node = this;
+ // Swap aside constraints and artificial parameters
+ // (these will be later restored if needed).
+ Constraint_System cs;
+ Artificial_Parameter_Sequence aps;
+ swap(cs, f_node->constraints_);
+ swap(aps, f_node->artificial_parameters);
+ // Compute the complement of the constraint used for the "true" node.
+ Row& f_test = ctx[ctx.num_rows() - 1];
+ complement_assign(f_test, t_test, 1);
+
+ // Recursively solve false node with respect to updated context.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level, "=== SOLVING ELSE CHILD\n");
+#endif
+ f_node = f_node->solve(pip, check_feasible_context,
+ ctx, all_params, space_dim,
+ indent_level + 1);
+
+ // Case analysis on recursive resolution calls outcome.
+ if (t_node == 0) {
+ if (f_node == 0) {
+ // Both t_node and f_node unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== EXIT: BOTH BRANCHES UNFEASIBLE: _|_\n");
+#endif
+ return 0;
+ }
+ else {
+ // t_node unfeasible, f_node feasible:
+ // restore cs and aps into f_node (i.e., this).
+ PPL_ASSERT(f_node == this);
+ swap(f_node->constraints_, cs);
+ swap(f_node->artificial_parameters, aps);
+ // Add f_test to constraints.
+ f_node->add_constraint(f_test, all_params);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== EXIT: THEN BRANCH UNFEASIBLE: SWAP BRANCHES\n");
+#endif
+ return f_node;
+ }
+ }
+ else if (f_node == 0) {
+ // t_node feasible, f_node unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== EXIT: THEN BRANCH FEASIBLE\n");
+#endif
+ // NOTE: in principle, we could merge t_node into its parent.
+ // However, if t_node is a decision node having both children,
+ // then we would obtain a node violating the PIP_Decision_Node
+ // invariant saying that t_node should have a single constraint:
+ // it will have, at least, the two splitting constraints.
+ const PIP_Decision_Node* const decision_node_p
+ = dynamic_cast<PIP_Decision_Node*>(t_node);
+ if (decision_node_p != 0 && decision_node_p->false_child != 0) {
+ // Do NOT merge: create a new decision node.
+ PIP_Tree_Node* const parent
+ = new PIP_Decision_Node(t_node->get_owner(), 0, t_node);
+ // Previously wrapped 't_node' is now safe: release it
+ // and protect new 'parent' node from exception safety issues.
+ wrapped_node.release();
+ wrapped_node.reset(parent);
+ // Restore into parent `cs' and `aps'.
+ swap(parent->constraints_, cs);
+ swap(parent->artificial_parameters, aps);
+ // Add t_test to parent's constraints.
+ parent->add_constraint(t_test, all_params);
+ // It is now safe to release previously wrapped parent pointer
+ // and return it to caller.
+ return wrapped_node.release();
+ }
+ else {
+ // Merge t_node with its parent:
+ // a) append into `cs' the constraints of t_node;
+ for (Constraint_System::const_iterator
+ i = t_node->constraints_.begin(),
+ i_end = t_node->constraints_.end(); i != i_end; ++i)
+ cs.insert(*i);
+ // b) append into `aps' the parameters of t_node;
+ aps.insert(aps.end(),
+ t_node->artificial_parameters.begin(),
+ t_node->artificial_parameters.end());
+ // c) swap the updated `cs' and `aps' into t_node.
+ swap(cs, t_node->constraints_);
+ swap(aps, t_node->artificial_parameters);
+ // d) add t_test to t_nodes's constraints.
+ t_node->add_constraint(t_test, all_params);
+ // It is now safe to release previously wrapped t_node pointer
+ // and return it to caller.
+ return wrapped_node.release();
+ }
+ }
+
+ // Here both t_node and f_node are feasible:
+ // create a new decision node.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== EXIT: BOTH BRANCHES FEASIBLE: NEW DECISION NODE\n");
+#endif
+ PIP_Tree_Node* parent
+ = new PIP_Decision_Node(f_node->get_owner(), f_node, t_node);
+ // Previously wrapped 't_node' is now safe: release it
+ // and protect new 'parent' node from exception safety issues.
+ wrapped_node.release();
+ wrapped_node.reset(parent);
+
+ // Add t_test to the constraints of the new decision node.
+ parent->add_constraint(t_test, all_params);
+
+ if (!cs.empty()) {
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "=== NODE HAS BOTH BRANCHES AND TAUTOLOGIES:\n");
+ indent_and_print(std::cerr, indent_level,
+ "=== CREATE NEW PARENT FOR TAUTOLOGIES\n");
+#endif
+ // If node to be solved had tautologies,
+ // store them in a new decision node.
+ parent = new PIP_Decision_Node(parent->get_owner(), 0, parent);
+ // Previously wrapped 'parent' node is now safe: release it
+ // and protect new 'parent' node from exception safety issues.
+ wrapped_node.release();
+ wrapped_node.reset(parent);
+ swap(parent->constraints_, cs);
+ }
+ swap(parent->artificial_parameters, aps);
+ // It is now safe to release previously wrapped decision node
+ // and return it to the caller.
+ return wrapped_node.release();
+ } // if (first_mixed != not_a_dim)
+
+
+ PPL_ASSERT(first_negative == not_a_dim);
+ PPL_ASSERT(first_mixed == not_a_dim);
+ // Here all parameters are positive: we have found a continuous
+ // solution. If the solution happens to be integer, then it is the
+ // solution of the integer problem. Otherwise, we may need to generate
+ // a new cut to try and get back into the integer case.
+#ifdef NOISY_PIP
+ indent_and_print(std::cerr, indent_level,
+ "All parameters are positive.\n");
+#endif // #ifdef NOISY_PIP
+ tableau.normalize();
+
+ // Look for any row having non integer parameter coefficients.
+ Coefficient_traits::const_reference denom = tableau.denominator();
+ for (dimension_type k = 0; k < num_vars; ++k) {
+ if (basis[k])
+ // Basic variable = 0, hence integer.
+ continue;
+ const dimension_type i = mapping[k];
+ const Row& t_i = tableau.t[i];
+ WEIGHT_BEGIN();
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(27);
+ if (*j % denom != 0)
+ goto non_integer;
+ }
+ }
+ // The goto was not taken, the solution is integer.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+ indent_and_print(std::cerr, indent_level,
+ "EXIT: solution found.\n");
+#endif // #ifdef NOISY_PIP
+ return this;
+
+ non_integer:
+ // The solution is non-integer: generate a cut.
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ dimension_type best_i = not_a_dim;
+ dimension_type best_pcount = not_a_dim;
+
+ const PIP_Problem::Control_Parameter_Value cutting_strategy
+ = pip.control_parameters[PIP_Problem::CUTTING_STRATEGY];
+
+ if (cutting_strategy == PIP_Problem::CUTTING_STRATEGY_FIRST) {
+ // Find the first row with simplest parametric part.
+ for (dimension_type k = 0; k < num_vars; ++k) {
+ if (basis[k])
+ continue;
+ const dimension_type i = mapping[k];
+ // Count the number of non-integer parameter coefficients.
+ WEIGHT_BEGIN();
+ dimension_type pcount = 0;
+ const Row& t_i = tableau.t[i];
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(18);
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0)
+ ++pcount;
+ }
+ if (pcount > 0 && (best_i == not_a_dim || pcount < best_pcount)) {
+ best_pcount = pcount;
+ best_i = i;
+ }
+ }
+ // Generate cut using 'best_i'.
+ generate_cut(best_i, all_params, ctx, space_dim, indent_level);
+ }
+ else {
+ PPL_ASSERT(cutting_strategy == PIP_Problem::CUTTING_STRATEGY_DEEPEST
+ || cutting_strategy == PIP_Problem::CUTTING_STRATEGY_ALL);
+ // Find the row with simplest parametric part
+ // which will generate the "deepest" cut.
+ PPL_DIRTY_TEMP_COEFFICIENT(best_score);
+ best_score = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(score);
+ PPL_DIRTY_TEMP_COEFFICIENT(s_score);
+ std::vector<dimension_type> all_best_is;
+
+ for (dimension_type k = 0; k < num_vars; ++k) {
+ if (basis[k])
+ continue;
+ const dimension_type i = mapping[k];
+ // Compute score and pcount.
+ score = 0;
+ dimension_type pcount = 0;
+ {
+ WEIGHT_BEGIN();
+ const Row& t_i = tableau.t[i];
+ for (Row::const_iterator
+ j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(46);
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0) {
+ WEIGHT_ADD(94);
+ score += denom;
+ score -= mod;
+ ++pcount;
+ }
+ }
+ }
+
+ // Compute s_score.
+ s_score = 0;
+ {
+ WEIGHT_BEGIN();
+ const Row& s_i = tableau.s[i];
+ for (Row::const_iterator
+ j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+ WEIGHT_ADD(94);
+ pos_rem_assign(mod, *j, denom);
+ s_score += denom;
+ s_score -= mod;
+ }
+ }
+ // Combine 'score' and 's_score'.
+ score *= s_score;
+ /*
+ Select row i if it is non integer AND
+ - no row has been chosen yet; OR
+ - it has fewer non-integer parameter coefficients; OR
+ - it has the same number of non-integer parameter coefficients,
+ but its score is greater.
+ */
+ if (pcount != 0
+ && (best_i == not_a_dim
+ || pcount < best_pcount
+ || (pcount == best_pcount && score > best_score))) {
+ if (pcount < best_pcount)
+ all_best_is.clear();
+ best_i = i;
+ best_pcount = pcount;
+ best_score = score;
+ }
+ if (pcount > 0)
+ all_best_is.push_back(i);
+ }
+ if (cutting_strategy == PIP_Problem::CUTTING_STRATEGY_DEEPEST)
+ generate_cut(best_i, all_params, ctx, space_dim, indent_level);
+ else {
+ PPL_ASSERT(cutting_strategy == PIP_Problem::CUTTING_STRATEGY_ALL);
+ for (dimension_type k = all_best_is.size(); k-- > 0; )
+ generate_cut(all_best_is[k], all_params, ctx,
+ space_dim, indent_level);
+ }
+ } // End of processing for non-integer solutions.
+
+ } // Main loop of the simplex algorithm
+
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return 0;
+}
+
+void
+PIP_Solution_Node::generate_cut(const dimension_type index,
+ Variables_Set& parameters,
+ Matrix<Row>& context,
+ dimension_type& space_dimension,
+ const int indent_level) {
+ PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Row " << index << " requires cut generation.\n";
+#else
+ PPL_USED(indent_level);
+#endif // #ifdef NOISY_PIP
+
+ const dimension_type num_rows = tableau.t.num_rows();
+ PPL_ASSERT(index < num_rows);
+ const dimension_type num_vars = tableau.s.num_columns();
+ const dimension_type num_params = tableau.t.num_columns();
+ PPL_ASSERT(num_params == 1 + parameters.size());
+ Coefficient_traits::const_reference denom = tableau.denominator();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+
+ // Test if cut to be generated must be parametric or not.
+ bool generate_parametric_cut = false;
+ {
+ // Limiting the scope of reference row_t (may be later invalidated).
+ const Row& row_t = tableau.t[index];
+ Row::const_iterator j = row_t.begin();
+ Row::const_iterator j_end = row_t.end();
+ // Skip the element with index 0.
+ if (j != j_end && j.index() == 0)
+ ++j;
+ WEIGHT_BEGIN();
+ for ( ; j != j_end; ++j) {
+ WEIGHT_ADD(7);
+ if (*j % denom != 0) {
+ generate_parametric_cut = true;
+ break;
+ }
+ }
+ }
+
+ // Column index of already existing Artificial_Parameter.
+ dimension_type ap_column = not_a_dimension();
+
+ if (generate_parametric_cut) {
+ // Fractional parameter coefficient found: generate parametric cut.
+ bool reuse_ap = false;
+ Linear_Expression expr;
+
+ // Limiting the scope of reference row_t (may be later invalidated).
+ {
+ const Row& row_t = tableau.t[index];
+ Row::const_iterator j = row_t.begin();
+ Row::const_iterator j_end = row_t.end();
+ if (j != j_end && j.index() == 0) {
+ pos_rem_assign(mod, *j, denom);
+ ++j;
+ if (mod != 0) {
+ // Optimizing computation: expr += (denom - mod);
+ expr += denom;
+ expr -= mod;
+ }
+ }
+ if (!parameters.empty()) {
+ // To avoid reallocations of expr.
+ add_mul_assign(expr, 0, Variable(*(parameters.rbegin())));
+ Variables_Set::const_iterator p_j = parameters.begin();
+ dimension_type last_index = 1;
+ WEIGHT_BEGIN();
+ for ( ; j != j_end; ++j) {
+ WEIGHT_ADD(69);
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0) {
+ // Optimizing computation: expr += (denom - mod) * Variable(*p_j);
+ WEIGHT_ADD(164);
+ coeff = denom - mod;
+ PPL_ASSERT(last_index <= j.index());
+ std::advance(p_j, j.index() - last_index);
+ last_index = j.index();
+ add_mul_assign(expr, coeff, Variable(*p_j));
+ }
+ }
+ }
+ }
+ // Generate new artificial parameter.
+ const Artificial_Parameter ap(expr, denom);
+
+ // Search if the Artificial_Parameter has already been generated.
+ ap_column = space_dimension;
+ const PIP_Tree_Node* node = this;
+ do {
+ for (dimension_type j = node->artificial_parameters.size(); j-- > 0; ) {
+ --ap_column;
+ if (node->artificial_parameters[j] == ap) {
+ reuse_ap = true;
+ break;
+ }
+ }
+ node = node->parent();
+ } while (!reuse_ap && node != 0);
+
+ if (reuse_ap) {
+ // We can re-use an existing Artificial_Parameter.
+#ifdef NOISY_PIP
+ using namespace IO_Operators;
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Re-using parameter " << Variable(ap_column)
+ << " = " << ap << std::endl;
+#endif // #ifdef NOISY_PIP
+ ap_column = ap_column - num_vars + 1;
+ }
+ else {
+ // Here reuse_ap == false: the Artificial_Parameter does not exist yet.
+ // Beware: possible reallocation invalidates row references.
+ tableau.t.add_zero_columns(1);
+ context.add_zero_columns(1);
+ artificial_parameters.push_back(ap);
+ parameters.insert(space_dimension);
+#ifdef NOISY_PIP
+ using namespace IO_Operators;
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "New parameter " << Variable(space_dimension)
+ << " = " << ap << std::endl;
+#endif // #ifdef NOISY_PIP
+ ++space_dimension;
+ ap_column = num_params;
+
+ // Update current context with constraints on the new parameter.
+ const dimension_type ctx_num_rows = context.num_rows();
+ context.add_zero_rows(2);
+ Row& ctx1 = context[ctx_num_rows];
+ Row& ctx2 = context[ctx_num_rows+1];
+ // Recompute row reference after possible reallocation.
+ const Row& row_t = tableau.t[index];
+ {
+ Row::const_iterator j = row_t.begin();
+ Row::const_iterator j_end = row_t.end();
+ Row::iterator itr1 = ctx1.end();
+ Row::iterator itr2 = ctx2.end();
+ if (j != j_end && j.index() == 0) {
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0) {
+ itr1 = ctx1.insert(0, denom);
+ *itr1 -= mod;
+ itr2 = ctx2.insert(0, *itr1);
+ neg_assign(*itr2);
+ // Compute <CODE> ctx2[0] += denom-1; </CODE>
+ *itr2 += denom;
+ --(*itr2);
+ }
+ else {
+ // Compute <CODE> ctx2[0] += denom-1; </CODE>
+ itr2 = ctx2.insert(0, denom);
+ --(*itr2);
+ }
+ ++j;
+ }
+ else {
+ // Compute <CODE> ctx2[0] += denom-1; </CODE>
+ itr2 = ctx2.insert(0, denom);
+ --(*itr2);
+ }
+ WEIGHT_BEGIN();
+ for ( ; j != j_end; ++j) {
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0) {
+ const dimension_type j_index = j.index();
+ itr1 = ctx1.insert(itr1, j_index, denom);
+ *itr1 -= mod;
+ itr2 = ctx2.insert(itr2, j_index, *itr1);
+ neg_assign(*itr2);
+ WEIGHT_ADD(294);
+ }
+ }
+ itr1 = ctx1.insert(itr1, num_params, denom);
+ neg_assign(*itr1);
+ itr2 = ctx2.insert(itr2, num_params, denom);
+ WEIGHT_ADD(122);
+ }
+
+#ifdef NOISY_PIP
+ {
+ using namespace IO_Operators;
+ Variables_Set::const_iterator p = parameters.begin();
+ Linear_Expression expr1(ctx1.get(0));
+ Linear_Expression expr2(ctx2.get(0));
+ for (dimension_type j = 1; j <= num_params; ++j, ++p) {
+ add_mul_assign(expr1, ctx1.get(j), Variable(*p));
+ add_mul_assign(expr2, ctx2.get(j), Variable(*p));
+ }
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Adding to context: "
+ << Constraint(expr1 >= 0) << " ; "
+ << Constraint(expr2 >= 0) << std::endl;
+ }
+#endif // #ifdef NOISY_PIP
+ }
+ }
+
+ // Generate new cut.
+ tableau.s.add_zero_rows(1);
+ tableau.t.add_zero_rows(1);
+ Row& cut_s = tableau.s[num_rows];
+ Row& cut_t = tableau.t[num_rows];
+ // Recompute references after possible reallocation.
+ const Row& row_s = tableau.s[index];
+ const Row& row_t = tableau.t[index];
+ WEIGHT_BEGIN();
+ {
+ Row::iterator itr = cut_s.end();
+ for (Row::const_iterator
+ j = row_s.begin(), j_end = row_s.end(); j != j_end; ++j) {
+ WEIGHT_ADD(55);
+ itr = cut_s.insert(itr, j.index(), *j);
+ pos_rem_assign(*itr, *itr, denom);
+ }
+ }
+ {
+ Row::iterator cut_t_itr = cut_t.end();
+ for (Row::const_iterator
+ j = row_t.begin(), j_end = row_t.end(); j!=j_end; ++j) {
+ WEIGHT_ADD(37);
+ pos_rem_assign(mod, *j, denom);
+ if (mod != 0) {
+ WEIGHT_ADD(108);
+ cut_t_itr = cut_t.insert(cut_t_itr, j.index(), mod);
+ *cut_t_itr -= denom;
+ }
+ }
+ }
+ if (ap_column != not_a_dimension())
+ // If we re-use an existing Artificial_Parameter
+ cut_t[ap_column] = denom;
+
+#ifdef NOISY_PIP
+ {
+ using namespace IO_Operators;
+ Linear_Expression expr;
+ dimension_type ti = 1;
+ dimension_type si = 0;
+ for (dimension_type j = 0; j < space_dimension; ++j) {
+ if (parameters.count(j) == 1) {
+ add_mul_assign(expr, cut_t.get(ti), Variable(j));
+ ++ti;
+ }
+ else {
+ add_mul_assign(expr, cut_s.get(si), Variable(j));
+ ++si;
+ }
+ }
+ std::cerr << std::setw(2 * indent_level) << ""
+ << "Adding cut: "
+ << Constraint(expr + cut_t.get(0) >= 0)
+ << std::endl;
+ }
+#endif // #ifdef NOISY_PIP
+ var_row.push_back(num_rows + num_vars);
+ basis.push_back(false);
+ mapping.push_back(num_rows);
+ sign.push_back(NEGATIVE);
+}
+
+
+memory_size_type
+PIP_Tree_Node::Artificial_Parameter::external_memory_in_bytes() const {
+ return Linear_Expression::external_memory_in_bytes()
+ + Parma_Polyhedra_Library::external_memory_in_bytes(denom);
+}
+
+memory_size_type
+PIP_Tree_Node::Artificial_Parameter::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Tree_Node::external_memory_in_bytes() const {
+ memory_size_type n = constraints_.external_memory_in_bytes();
+ // Adding the external memory for `artificial_parameters'.
+ n += artificial_parameters.capacity() * sizeof(Artificial_Parameter);
+ for (Artificial_Parameter_Sequence::const_iterator
+ ap = art_parameter_begin(),
+ ap_end = art_parameter_end(); ap != ap_end; ++ap)
+ n += (ap->external_memory_in_bytes());
+
+ return n;
+}
+
+memory_size_type
+PIP_Decision_Node::external_memory_in_bytes() const {
+ memory_size_type n = PIP_Tree_Node::external_memory_in_bytes();
+ PPL_ASSERT(true_child != 0);
+ n += true_child->total_memory_in_bytes();
+ if (false_child != 0)
+ n += false_child->total_memory_in_bytes();
+ return n;
+}
+
+memory_size_type
+PIP_Decision_Node::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Solution_Node::Tableau::external_memory_in_bytes() const {
+ return Parma_Polyhedra_Library::external_memory_in_bytes(denom)
+ + s.external_memory_in_bytes()
+ + t.external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Solution_Node::external_memory_in_bytes() const {
+ memory_size_type n = PIP_Tree_Node::external_memory_in_bytes();
+ n += tableau.external_memory_in_bytes();
+ // FIXME: size of std::vector<bool> ?
+ n += basis.capacity() * sizeof(bool);
+ n += sizeof(dimension_type)
+ * (mapping.capacity() + var_row.capacity() + var_column.capacity());
+ n += sign.capacity() * sizeof(Row_Sign);
+ // FIXME: Adding the external memory for `solution'.
+ n += solution.capacity() * sizeof(Linear_Expression);
+ for (std::vector<Linear_Expression>::const_iterator
+ i = solution.begin(), i_end = solution.end(); i != i_end; ++i)
+ n += (i->external_memory_in_bytes());
+
+ return n;
+}
+
+memory_size_type
+PIP_Solution_Node::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+void
+PIP_Tree_Node::indent_and_print(std::ostream& s,
+ const int indent,
+ const char* str) {
+ PPL_ASSERT(indent >= 0);
+ s << std::setw(2 * indent) << "" << str;
+}
+
+void
+PIP_Tree_Node::print(std::ostream& s, const int indent) const {
+ const dimension_type pip_space_dim = get_owner()->space_dimension();
+ const Variables_Set& pip_params = get_owner()->parameter_space_dimensions();
+
+ std::vector<bool> pip_dim_is_param(pip_space_dim);
+ for (Variables_Set::const_iterator p = pip_params.begin(),
+ p_end = pip_params.end(); p != p_end; ++p)
+ pip_dim_is_param[*p] = true;
+
+ dimension_type first_art_dim = pip_space_dim;
+ for (const PIP_Tree_Node* node = parent(); node != 0; node = node->parent())
+ first_art_dim += node->art_parameter_count();
+
+ print_tree(s, indent, pip_dim_is_param, first_art_dim);
+}
+
+void
+PIP_Tree_Node::print_tree(std::ostream& s, const int indent,
+ const std::vector<bool>&,
+ dimension_type first_art_dim) const {
+ using namespace IO_Operators;
+
+ // Print artificial parameters.
+ for (Artificial_Parameter_Sequence::const_iterator
+ api = art_parameter_begin(),
+ api_end = art_parameter_end(); api != api_end; ++api) {
+ indent_and_print(s, indent, "Parameter ");
+ s << Variable(first_art_dim) << " = " << *api << "\n";
+ ++first_art_dim;
+ }
+
+ // Print constraints, if any.
+ if (!constraints_.empty()) {
+ indent_and_print(s, indent, "if ");
+
+ Constraint_System::const_iterator ci = constraints_.begin();
+ Constraint_System::const_iterator ci_end = constraints_.end();
+ PPL_ASSERT(ci != ci_end);
+ s << *ci;
+ for (++ci; ci != ci_end; ++ci)
+ s << " and " << *ci;
+
+ s << " then\n";
+ }
+}
+
+void
+PIP_Decision_Node::print_tree(std::ostream& s, const int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ const dimension_type first_art_dim) const {
+ // First print info common to decision and solution nodes.
+ PIP_Tree_Node::print_tree(s, indent, pip_dim_is_param, first_art_dim);
+
+ // Then print info specific of decision nodes.
+ const dimension_type child_first_art_dim
+ = first_art_dim + art_parameter_count();
+
+ PPL_ASSERT(true_child != 0);
+ true_child->print_tree(s, indent+1, pip_dim_is_param, child_first_art_dim);
+
+ indent_and_print(s, indent, "else\n");
+
+ if (false_child != 0)
+ false_child->print_tree(s, indent+1, pip_dim_is_param,
+ child_first_art_dim);
+ else
+ indent_and_print(s, indent+1, "_|_\n");
+}
+
+void
+PIP_Solution_Node::print_tree(std::ostream& s, const int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ const dimension_type first_art_dim) const {
+ // Print info common to decision and solution nodes.
+ PIP_Tree_Node::print_tree(s, indent, pip_dim_is_param, first_art_dim);
+
+ // Print info specific of solution nodes:
+ // first update solution if needed ...
+ update_solution(pip_dim_is_param);
+ // ... and then actually print it.
+ const bool no_constraints = constraints_.empty();
+ indent_and_print(s, indent + (no_constraints ? 0 : 1), "{");
+ const dimension_type pip_space_dim = pip_dim_is_param.size();
+ for (dimension_type i = 0, num_var = 0; i < pip_space_dim; ++i) {
+ if (pip_dim_is_param[i])
+ continue;
+ if (num_var > 0)
+ s << " ; ";
+ using namespace IO_Operators;
+ s << solution[num_var];
+ ++num_var;
+ }
+ s << "}\n";
+
+ if (!no_constraints) {
+ indent_and_print(s, indent, "else\n");
+ indent_and_print(s, indent+1, "_|_\n");
+ }
+}
+
+const Linear_Expression&
+PIP_Solution_Node::parametric_values(const Variable var) const {
+ const PIP_Problem* const pip = get_owner();
+ PPL_ASSERT(pip != 0);
+
+ const dimension_type space_dim = pip->space_dimension();
+ if (var.space_dimension() > space_dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Solution_Node::parametric_values(v):\n"
+ << "v.space_dimension() == " << var.space_dimension()
+ << " is incompatible with the owning PIP_Problem "
+ << " (space dim == " << space_dim << ").";
+ throw std::invalid_argument(s.str());
+ }
+
+ dimension_type solution_index = var.id();
+ const Variables_Set& params = pip->parameter_space_dimensions();
+ for (Variables_Set::const_iterator p = params.begin(),
+ p_end = params.end(); p != p_end; ++p) {
+ const dimension_type param_index = *p;
+ if (param_index < var.id())
+ --solution_index;
+ else if (param_index == var.id())
+ throw std::invalid_argument("PPL::PIP_Solution_Node"
+ "::parametric_values(v):\n"
+ "v is a problem parameter.");
+ else
+ break;
+ }
+
+ update_solution();
+ return solution[solution_index];
+}
+
+
+void
+PIP_Solution_Node::update_solution() const {
+ // Avoid doing useless work.
+ if (solution_valid)
+ return;
+
+ const PIP_Problem* const pip = get_owner();
+ PPL_ASSERT(pip != 0);
+ std::vector<bool> pip_dim_is_param(pip->space_dimension());
+ const Variables_Set& params = pip->parameter_space_dimensions();
+ for (Variables_Set::const_iterator p = params.begin(),
+ p_end = params.end(); p != p_end; ++p)
+ pip_dim_is_param[*p] = true;
+
+ update_solution(pip_dim_is_param);
+}
+
+void
+PIP_Solution_Node
+::update_solution(const std::vector<bool>& pip_dim_is_param) const {
+ // Avoid doing useless work.
+ if (solution_valid)
+ return;
+
+ // const_cast required so as to refresh the solution cache.
+ PIP_Solution_Node& x = const_cast<PIP_Solution_Node&>(*this);
+
+ const dimension_type num_pip_dims = pip_dim_is_param.size();
+ const dimension_type num_pip_vars = tableau.s.num_columns();
+ const dimension_type num_pip_params = num_pip_dims - num_pip_vars;
+ const dimension_type num_all_params = tableau.t.num_columns() - 1;
+ const dimension_type num_art_params = num_all_params - num_pip_params;
+
+ if (solution.size() != num_pip_vars)
+ x.solution.resize(num_pip_vars);
+
+ // Compute external "names" (i.e., indices) for all parameters.
+ std::vector<dimension_type> all_param_names(num_all_params);
+
+ // External indices for problem parameters.
+ for (dimension_type i = 0, p_index = 0; i < num_pip_dims; ++i)
+ if (pip_dim_is_param[i]) {
+ all_param_names[p_index] = i;
+ ++p_index;
+ }
+ // External indices for artificial parameters.
+ for (dimension_type i = 0; i < num_art_params; ++i)
+ all_param_names[num_pip_params + i] = num_pip_dims + i;
+
+
+ PPL_DIRTY_TEMP_COEFFICIENT(norm_coeff);
+ Coefficient_traits::const_reference denom = tableau.denominator();
+ for (dimension_type i = num_pip_vars; i-- > 0; ) {
+ Linear_Expression& sol_i = x.solution[i];
+ sol_i = Linear_Expression(0);
+ if (basis[i])
+ continue;
+ const Row& row = tableau.t[mapping[i]];
+
+ // Start from index 1 to skip the inhomogeneous term.
+ Row::const_iterator j = row.begin();
+ Row::const_iterator j_end = row.end();
+ // Skip the element with index 0.
+ if (j != j_end && j.index() == 0)
+ ++j;
+ for ( ; j != j_end; ++j) {
+ Coefficient_traits::const_reference coeff = *j;
+ if (coeff == 0)
+ continue;
+ norm_coeff = coeff / denom;
+ if (norm_coeff != 0)
+ add_mul_assign(sol_i, norm_coeff,
+ Variable(all_param_names[j.index() - 1]));
+ }
+ norm_coeff = row.get(0) / denom;
+ sol_i += norm_coeff;
+ }
+
+ // Mark solution as valid.
+ x.solution_valid = true;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/PIP_Tree_defs.hh b/src/PIP_Tree_defs.hh
new file mode 100644
index 0000000..c26d7eb
--- /dev/null
+++ b/src/PIP_Tree_defs.hh
@@ -0,0 +1,836 @@
+/* PIP_Tree_Node class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Tree_defs_hh
+#define PPL_PIP_Tree_defs_hh 1
+
+#include "PIP_Tree_types.hh"
+#include "Variable_defs.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Constraint_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "globals_defs.hh"
+#include "PIP_Problem_defs.hh"
+
+#include "Matrix_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! A node of the PIP solution tree.
+/*!
+ This is the base class for the nodes of the binary trees representing
+ the solutions of PIP problems. From this one, two classes are derived:
+ - PIP_Decision_Node, for the internal nodes of the tree;
+ - PIP_Solution_Node, for the leaves of the tree.
+*/
+class PIP_Tree_Node {
+protected:
+ //! Constructor: builds a node owned by \p *owner.
+ explicit PIP_Tree_Node(const PIP_Problem* owner);
+
+ //! Copy constructor.
+ PIP_Tree_Node(const PIP_Tree_Node& y);
+
+ //! Returns a pointer to the PIP_Problem owning object.
+ const PIP_Problem* get_owner() const;
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner) = 0;
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this are owned by \p *owner.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const = 0;
+
+public:
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const = 0;
+
+ //! Destructor.
+ virtual ~PIP_Tree_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const = 0;
+
+ //! Returns \p this if \p *this is a solution node, 0 otherwise.
+ virtual const PIP_Solution_Node* as_solution() const = 0;
+
+ //! Returns \p this if \p *this is a decision node, 0 otherwise.
+ virtual const PIP_Decision_Node* as_decision() const = 0;
+
+ /*! \brief
+ Returns the system of parameter constraints controlling \p *this.
+
+ The indices in the constraints are the same as the original variables and
+ parameters. Coefficients in indices corresponding to variables always are
+ zero.
+ */
+ const Constraint_System& constraints() const;
+
+ class Artificial_Parameter;
+
+ //! A type alias for a sequence of Artificial_Parameter's.
+ typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
+
+ //! Returns a const_iterator to the beginning of local artificial parameters.
+ Artificial_Parameter_Sequence::const_iterator art_parameter_begin() const;
+
+ //! Returns a const_iterator to the end of local artificial parameters.
+ Artificial_Parameter_Sequence::const_iterator art_parameter_end() const;
+
+ //! Returns the number of local artificial parameters.
+ dimension_type art_parameter_count() const;
+
+ //! Prints on \p s the tree rooted in \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ The amount of indentation.
+ */
+ void print(std::ostream& s, int indent = 0) const;
+
+ //! Dumps to \p s an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const = 0;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const = 0;
+
+protected:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint> Constraint_Sequence;
+
+ // Only PIP_Problem and PIP_Decision_Node are allowed to use the
+ // constructor and methods.
+ friend class PIP_Problem;
+ friend class PIP_Decision_Node;
+ friend class PIP_Solution_Node;
+
+ //! A pointer to the PIP_Problem object owning this node.
+ const PIP_Problem* owner_;
+
+ //! A pointer to the parent of \p *this, null if \p *this is the root.
+ const PIP_Decision_Node* parent_;
+
+ //! The local system of parameter constraints.
+ Constraint_System constraints_;
+
+ //! The local sequence of expressions for local artificial parameters.
+ Artificial_Parameter_Sequence artificial_parameters;
+
+ //! Returns a pointer to this node's parent.
+ const PIP_Decision_Node* parent() const;
+
+ //! Set this node's parent to \p *p.
+ void set_parent(const PIP_Decision_Node* p);
+
+ /*! \brief
+ Populates the parametric simplex tableau using external data.
+
+ \param pip
+ The PIP_Problem object containing this node.
+
+ \param external_space_dim
+ The number of all problem variables and problem parameters
+ (excluding artificial parameters).
+
+ \param first_pending_constraint
+ The first element in \p input_cs to be added to the tableau,
+ which already contains the previous elements.
+
+ \param input_cs
+ All the constraints of the PIP problem.
+
+ \param parameters
+ The set of indices of the problem parameters.
+ */
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters) = 0;
+
+ /*! \brief
+ Executes a parametric simplex on the tableau, under specified context.
+
+ \return
+ The root of the PIP tree solution, or 0 if unfeasible.
+
+ \param pip
+ The PIP_Problem object containing this node.
+
+ \param check_feasible_context
+ Whether the resolution process should (re-)check feasibility of
+ context (since the initial context may have been modified).
+
+ \param context
+ The context, being a set of constraints on the parameters.
+
+ \param params
+ The local parameter set, including parent's artificial parameters.
+
+ \param space_dim
+ The space dimension of parent, including artificial parameters.
+
+ \param indent_level
+ The indentation level (for debugging output only).
+ */
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level) = 0;
+
+ //! Inserts a new parametric constraint in internal row format.
+ void add_constraint(const Row& row, const Variables_Set& parameters);
+
+ //! Merges parent's artificial parameters into \p *this.
+ void parent_merge();
+
+ //! Prints on \p s the tree rooted in \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ The amount of indentation.
+
+ \param pip_dim_is_param
+ A vector of Boolean flags telling which PIP problem dimensions are
+ problem parameters. The size of the vector is equal to the PIP
+ problem internal space dimension (i.e., no artificial parameters).
+
+ \param first_art_dim
+ The first space dimension corresponding to an artificial parameter
+ that was created in this node (if any).
+ */
+ virtual void print_tree(std::ostream& s,
+ int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const = 0;
+
+ //! A helper function used when printing PIP trees.
+ static void
+ indent_and_print(std::ostream& s, int indent, const char* str);
+
+ /*! \brief
+ Checks whether a context matrix is satisfiable.
+
+ The satisfiability check is implemented by the revised dual simplex
+ algorithm on the context matrix. The algorithm ensures the feasible
+ solution is integer by applying a cut generation method when
+ intermediate non-integer solutions are found.
+ */
+ static bool compatibility_check(Matrix<Row>& s);
+
+ /*! \brief
+ Helper method: checks for satisfiability of the restricted context
+ obtained by adding \p row to \p context.
+ */
+ static bool compatibility_check(const Matrix<Row>& context, const Row& row);
+
+}; // class PIP_Tree_Node
+
+
+/*! \brief
+ Artificial parameters in PIP solution trees.
+
+ These parameters are built from a linear expression combining other
+ parameters (constant term included) divided by a positive integer
+ denominator. Coefficients at variables indices corresponding to
+ PIP problem variables are always zero.
+*/
+class PIP_Tree_Node::Artificial_Parameter
+ : public Linear_Expression {
+public:
+ //! Default constructor: builds a zero artificial parameter.
+ Artificial_Parameter();
+
+ //! Constructor.
+ /*!
+ Builds artificial parameter \f$\frac{\mathtt{expr}}{\mathtt{d}}\f$.
+
+ \param expr
+ The expression that, after normalization, will form the numerator of
+ the artificial parameter.
+
+ \param d
+ The integer constant that, after normalization, will form the
+ denominator of the artificial parameter.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+
+ Normalization will ensure that the denominator is positive.
+ */
+ Artificial_Parameter(const Linear_Expression& expr,
+ Coefficient_traits::const_reference d);
+
+ //! Copy constructor.
+ Artificial_Parameter(const Artificial_Parameter& y);
+
+ //! Returns the normalized (i.e., positive) denominator.
+ Coefficient_traits::const_reference denominator() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Artificial_Parameter& y);
+
+ //! Returns \c true if and only if \p *this and \p y are equal.
+ /*!
+ Note that two artificial parameters having different space dimensions
+ are considered to be different.
+ */
+ bool operator==(const Artificial_Parameter& y) const;
+ //! Returns \c true if and only if \p *this and \p y are different.
+ bool operator!=(const Artificial_Parameter& y) const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns \c true if and only if the parameter is well-formed.
+ bool OK() const;
+
+private:
+ //! The normalized (i.e., positive) denominator.
+ Coefficient denom;
+}; // class PIP_Tree_Node::Artificial_Parameter
+
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+ PIP_Tree_Node::Artificial_Parameter& y);
+
+
+//! A tree node representing part of the space of solutions.
+class PIP_Solution_Node : public PIP_Tree_Node {
+public:
+
+ //! Constructor: builds a solution node owned by \p *owner.
+ explicit PIP_Solution_Node(const PIP_Problem* owner);
+
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const;
+
+ //! Destructor.
+ virtual ~PIP_Solution_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const;
+
+ //! Returns \p this.
+ virtual const PIP_Solution_Node* as_solution() const;
+
+ //! Returns 0, since \p this is not a decision node.
+ virtual const PIP_Decision_Node* as_decision() const;
+
+ /*! \brief
+ Returns a parametric expression for the values of problem variable \p var.
+
+ The returned linear expression may involve problem parameters
+ as well as artificial parameters.
+
+ \param var
+ The problem variable which is queried about.
+
+ \exception std::invalid_argument
+ Thrown if \p var is dimension-incompatible with the PIP_Problem
+ owning this solution node, or if \p var is a problem parameter.
+ */
+ const Linear_Expression& parametric_values(Variable var) const;
+
+ //! Dumps to \p os an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& os) const;
+
+ /*! \brief
+ Loads from \p is an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& is);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+ //! The type for parametric simplex tableau.
+ struct Tableau {
+ //! The matrix of simplex coefficients.
+ Matrix<Row> s;
+ //! The matrix of parameter coefficients.
+ Matrix<Row> t;
+ //! A common denominator for all matrix elements
+ Coefficient denom;
+
+ //! Default constructor.
+ Tableau();
+ //! Copy constructor.
+ Tableau(const Tableau& y);
+ //! Destructor.
+ ~Tableau();
+
+ //! Tests whether the matrix is integer, i.e., the denominator is 1.
+ bool is_integer() const;
+
+ //! Multiplies all coefficients and denominator with ratio.
+ void scale(Coefficient_traits::const_reference ratio);
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of
+ the matrices and normalizes them and the denominator by the GCD itself.
+ */
+ void normalize();
+
+ /*! \brief
+ Compares two pivot row and column pairs before pivoting.
+
+ The algorithm searches the first (ie, leftmost) column \f$k\f$ in
+ parameter matrix for which the \f$c=s_{*j}\frac{t_{ik}}{s_{ij}}\f$
+ and \f$c'=s_{*j'}\frac{t_{i'k}}{s_{i'j'}}\f$ columns are different,
+ where \f$s_{*j}\f$ denotes the \f$j\f$<sup>th</sup> column from the
+ \f$s\f$ matrix and \f$s_{*j'}\f$ is the \f$j'\f$<sup>th</sup> column
+ of \f$s\f$.
+
+ \f$c\f$ is the computed column that would be subtracted to column
+ \f$k\f$ in parameter matrix if pivoting is done using the \f$(i,j)\f$
+ row and column pair.
+ \f$c'\f$ is the computed column that would be subtracted to column
+ \f$k\f$ in parameter matrix if pivoting is done using the
+ \f$(i',j')\f$ row and column pair.
+
+ The test is true if the computed \f$-c\f$ column is lexicographically
+ bigger than the \f$-c'\f$ column. Due to the column ordering in the
+ parameter matrix of the tableau, leftmost search will enforce solution
+ increase with respect to the following priority order:
+ - the constant term
+ - the coefficients for the original parameters
+ - the coefficients for the oldest artificial parameters.
+
+ \return
+ \c true if pivot row and column pair \f$(i,j)\f$ is more
+ suitable for pivoting than the \f$(i',j')\f$ pair
+
+ \param mapping
+ The PIP_Solution_Node::mapping vector for the tableau.
+
+ \param basis
+ The PIP_Solution_Node::basis vector for the tableau.
+
+ \param row_0
+ The row number for the first pivot row and column pair to be compared.
+
+ \param col_0
+ The column number for the first pivot row and column pair to be
+ compared.
+
+ \param row_1
+ The row number for the second pivot row and column pair to be compared.
+
+ \param col_1
+ The column number for the second pivot row and column pair to be
+ compared.
+ */
+ bool is_better_pivot(const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const dimension_type row_0,
+ const dimension_type col_0,
+ const dimension_type row_1,
+ const dimension_type col_1) const;
+
+ //! Returns the value of the denominator.
+ Coefficient_traits::const_reference denominator() const;
+
+ //! Dumps to \p os an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& os) const;
+
+ /*! \brief
+ Loads from \p is an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns \c true if successful, \c false otherwise.
+ */
+ bool ascii_load(std::istream& is);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ \note
+ No need for a \c total_memory_in_bytes() method, since
+ class Tableau is a private inner class of PIP_Solution_Node.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns \c true if and only if \p *this is well formed.
+ bool OK() const;
+ }; // struct Tableau
+
+ //! The parametric simplex tableau.
+ Tableau tableau;
+
+ /*! \brief
+ A boolean vector for identifying the basic variables.
+
+ Variable identifiers are numbered from 0 to <CODE>n+m-1</CODE>, where \p n
+ is the number of columns in the simplex tableau corresponding to variables,
+ and \p m is the number of rows.
+
+ Indices from 0 to <CODE>n-1</CODE> correspond to the original variables.
+
+ Indices from \p n to <CODE>n+m-1</CODE> correspond to the slack variables
+ associated to the internal constraints, which do not strictly correspond
+ to original constraints, since these may have been transformed to fit the
+ standard form of the dual simplex.
+
+ The value for <CODE>basis[i]</CODE> is:
+ - \b true if variable \p i is basic,
+ - \b false if variable \p i is nonbasic.
+ */
+ std::vector<bool> basis;
+
+ /*! \brief
+ A mapping between the tableau rows/columns and the original variables.
+
+ The value of <CODE>mapping[i]</CODE> depends of the value of <CODE>basis[i]</CODE>.
+
+ - If <CODE>basis[i]</CODE> is \b true, <CODE>mapping[i]</CODE> encodes the column
+ index of variable \p i in the \p s matrix of the tableau.
+ - If <CODE>basis[i]</CODE> is \b false, <CODE>mapping[i]</CODE> encodes the row
+ index of variable \p i in the tableau.
+ */
+ std::vector<dimension_type> mapping;
+
+ /*! \brief
+ The variable identifiers associated to the rows of the simplex tableau.
+ */
+ std::vector<dimension_type> var_row;
+
+ /*! \brief
+ The variable identifiers associated to the columns of the simplex tableau.
+ */
+ std::vector<dimension_type> var_column;
+
+ /*! \brief
+ The variable number of the special inequality used for modeling
+ equality constraints.
+
+ The subset of equality constraints in a specific problem can be expressed
+ as: \f$f_i(x,p) = 0 ; 1 \leq i \leq n\f$. As the dual simplex standard form
+ requires constraints to be inequalities, the following constraints can be
+ modeled as follows:
+
+ - \f$f_i(x,p) \geq 0 ; 1 \leq i \leq n\f$
+
+ - \f$\sum\limits_{i=1}^n f_i(x,p) \leq 0\f$
+
+ The \p special_equality_row value stores the variable number of the
+ specific constraint which is used to model the latter sum of
+ constraints. If no such constraint exists, the value is set to \p 0.
+ */
+ dimension_type special_equality_row;
+
+ /*! \brief
+ The column index in the parametric part of the simplex tableau
+ corresponding to the big parameter; \c not_a_dimension() if not set.
+ */
+ dimension_type big_dimension;
+
+ //! The possible values for the sign of a parametric linear expression.
+ enum Row_Sign {
+ //! Not computed yet (default).
+ UNKNOWN,
+ //! All row coefficients are zero.
+ ZERO,
+ //! All nonzero row coefficients are positive.
+ POSITIVE,
+ //! All nonzero row coefficients are negative.
+ NEGATIVE,
+ //! The row contains both positive and negative coefficients.
+ MIXED
+ };
+
+ //! A cache for computed sign values of constraint parametric RHS.
+ std::vector<Row_Sign> sign;
+
+ //! Parametric values for the solution.
+ std::vector<Linear_Expression> solution;
+
+ //! An indicator for solution validity.
+ bool solution_valid;
+
+ //! Returns the sign of row \p x.
+ static Row_Sign row_sign(const Row& x,
+ dimension_type big_dimension);
+
+protected:
+ //! Copy constructor.
+ PIP_Solution_Node(const PIP_Solution_Node& y);
+
+ //! A tag type to select the alternative copy constructor.
+ struct No_Constraints {};
+
+ //! Alternative copy constructor.
+ /*!
+ This constructor differs from the default copy constructor in that
+ it will not copy the constraint system, nor the artificial parameters.
+ */
+ PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
+
+ // PIP_Problem::ascii load() method needs access set_owner().
+ friend bool PIP_Problem::ascii_load(std::istream& s);
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner);
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this is owned by \p *pip.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const;
+
+ //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters);
+
+ /*! \brief
+ Update the solution values.
+
+ \param pip_dim_is_param
+ A vector of Boolean flags telling which PIP problem dimensions are
+ problem parameters. The size of the vector is equal to the PIP
+ problem internal space dimension (i.e., no artificial parameters).
+ */
+ void update_solution(const std::vector<bool>& pip_dim_is_param) const;
+
+ //! Helper method.
+ void update_solution() const;
+
+ //! Implements pure virtual method PIP_Tree_Node::solve.
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level);
+
+ /*! \brief
+ Generate a Gomory cut using non-integer tableau row \p index.
+
+ \param index
+ Row index in simplex tableau from which the cut is generated.
+
+ \param parameters
+ A std::set of the current parameter dimensions (including artificials);
+ to be updated if a new artificial parameter is to be created.
+
+ \param context
+ A set of linear inequalities on the parameters, in matrix form; to be
+ updated if a new artificial parameter is to be created.
+
+ \param space_dimension
+ The current space dimension, including variables and all parameters; to
+ be updated if an extra parameter is to be created.
+
+ \param indent_level
+ The indentation level (for debugging output only).
+ */
+ void generate_cut(dimension_type index, Variables_Set& parameters,
+ Matrix<Row>& context, dimension_type& space_dimension,
+ int indent_level);
+
+ //! Prints on \p s the tree rooted in \p *this.
+ virtual void print_tree(std::ostream& s, int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const;
+
+}; // class PIP_Solution_Node
+
+
+//! A tree node representing a decision in the space of solutions.
+class PIP_Decision_Node : public PIP_Tree_Node {
+public:
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const;
+
+ //! Destructor.
+ virtual ~PIP_Decision_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const;
+
+ //! Returns \p this.
+ virtual const PIP_Decision_Node* as_decision() const;
+
+ //! Returns 0, since \p this is not a solution node.
+ virtual const PIP_Solution_Node* as_solution() const;
+
+ //! Returns a const pointer to the \p b (true or false) branch of \p *this.
+ const PIP_Tree_Node* child_node(bool b) const;
+
+ //! Returns a pointer to the \p b (true or false) branch of \p *this.
+ PIP_Tree_Node* child_node(bool b);
+
+ //! Dumps to \p s an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+ // PIP_Solution_Node is allowed to use the constructor and methods.
+ friend class PIP_Solution_Node;
+
+ // PIP_Problem ascii load method needs access to private constructors.
+ friend bool PIP_Problem::ascii_load(std::istream& s);
+
+ //! Pointer to the "false" child of \p *this.
+ PIP_Tree_Node* false_child;
+
+ //! Pointer to the "true" child of \p *this.
+ PIP_Tree_Node* true_child;
+
+ /*! \brief
+ Builds a decision node having \p fcp and \p tcp as child.
+
+ The decision node will encode the structure
+ "if \c cs then \p tcp else \p fcp",
+ where the system of constraints \c cs is initially empty.
+
+ \param owner
+ Pointer to the owning PIP_Problem object; it may be null if and
+ only if both children are null.
+
+ \param fcp
+ Pointer to "false" child; it may be null.
+
+ \param tcp
+ Pointer to "true" child; it may be null.
+
+ \note
+ If any of \p fcp or \p tcp is not null, then \p owner is required
+ to be not null and equal to the owner of its non-null children;
+ otherwise the behavior is undefined.
+ */
+ explicit PIP_Decision_Node(const PIP_Problem* owner,
+ PIP_Tree_Node* fcp,
+ PIP_Tree_Node* tcp);
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner);
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this is owned by \p *pip.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const;
+
+protected:
+ //! Copy constructor.
+ PIP_Decision_Node(const PIP_Decision_Node& y);
+
+ //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters);
+
+ //! Implements pure virtual method PIP_Tree_Node::solve.
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level);
+
+ //! Prints on \p s the tree rooted in \p *this.
+ virtual void print_tree(std::ostream& s, int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const;
+
+}; // class PIP_Decision_Node
+
+namespace IO_Operators {
+
+//! Output operator: prints the solution tree rooted in \p x.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node */
+std::ostream& operator<<(std::ostream& os, const PIP_Tree_Node& x);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter */
+std::ostream& operator<<(std::ostream& os,
+ const PIP_Tree_Node::Artificial_Parameter& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "PIP_Tree_inlines.hh"
+
+#endif // !defined(PPL_PIP_Tree_defs_hh)
diff --git a/src/PIP_Tree_inlines.hh b/src/PIP_Tree_inlines.hh
new file mode 100644
index 0000000..6e666d9
--- /dev/null
+++ b/src/PIP_Tree_inlines.hh
@@ -0,0 +1,140 @@
+/* PIP_Tree related class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Tree_inlines_hh
+#define PPL_PIP_Tree_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+PIP_Solution_Node::Tableau::Tableau()
+ : s(), t(), denom(1) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::Tableau(const Tableau& y)
+ : s(y.s), t(y.t), denom(y.denom) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::~Tableau() {
+}
+
+inline bool
+PIP_Solution_Node::Tableau::is_integer() const {
+ return denom == 1;
+}
+
+inline Coefficient_traits::const_reference
+PIP_Solution_Node::Tableau::denominator() const {
+ return denom;
+}
+
+inline
+PIP_Tree_Node::~PIP_Tree_Node() {
+}
+
+inline void
+PIP_Tree_Node::set_parent(const PIP_Decision_Node* p) {
+ parent_ = p;
+}
+
+inline const PIP_Decision_Node*
+PIP_Tree_Node::parent() const {
+ return parent_;
+}
+
+inline const PIP_Problem*
+PIP_Tree_Node::get_owner() const {
+ return owner_;
+}
+
+inline const Constraint_System&
+PIP_Tree_Node::constraints() const {
+ return constraints_;
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_begin() const {
+ return artificial_parameters.begin();
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_end() const {
+ return artificial_parameters.end();
+}
+
+inline dimension_type
+PIP_Tree_Node::art_parameter_count() const {
+ return artificial_parameters.size();
+}
+
+inline
+const PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) const {
+ return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) {
+ return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
+ : Linear_Expression(), denom(1) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Artificial_Parameter& y)
+ : Linear_Expression(y), denom(y.denom) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+PIP_Tree_Node::Artificial_Parameter::denominator() const {
+ return denom;
+}
+
+inline void
+PIP_Tree_Node::Artificial_Parameter::m_swap(Artificial_Parameter& y) {
+ Linear_Expression::m_swap(y);
+ using std::swap;
+ swap(denom, y.denom);
+}
+
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+inline void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+ PIP_Tree_Node::Artificial_Parameter& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Tree_inlines_hh)
diff --git a/src/PIP_Tree_types.hh b/src/PIP_Tree_types.hh
new file mode 100644
index 0000000..2eb61ad
--- /dev/null
+++ b/src/PIP_Tree_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_PIP_Tree_types_hh
+#define PPL_PIP_Tree_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class PIP_Tree_Node;
+class PIP_Solution_Node;
+class PIP_Decision_Node;
+
+typedef const PIP_Tree_Node* PIP_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Tree_types_hh)
diff --git a/src/Partial_Function.cc b/src/Partial_Function.cc
new file mode 100644
index 0000000..b20e036
--- /dev/null
+++ b/src/Partial_Function.cc
@@ -0,0 +1,42 @@
+/* Implementation of class Partial_Function (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Partial_Function_defs.hh"
+#include "Variable_defs.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+void
+Partial_Function::print(std::ostream& s) const {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ if (has_empty_codomain())
+ s << "empty" << std::endl;
+ else
+ for (dimension_type i = 0, i_end = vec.size(); i < i_end; ++i)
+ if (vec[i] != not_a_dimension())
+ s << Variable(i) << " --> " << Variable(vec[i]) << "\n";
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Partial_Function_defs.hh b/src/Partial_Function_defs.hh
new file mode 100644
index 0000000..a621eef
--- /dev/null
+++ b/src/Partial_Function_defs.hh
@@ -0,0 +1,87 @@
+/* Partial_Function class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partial_Function_defs_hh
+#define PPL_Partial_Function_defs_hh 1
+
+#include "Partial_Function_types.hh"
+#include "globals_defs.hh"
+#include <vector>
+#ifndef NDEBUG
+#include <set>
+#endif
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function {
+public:
+ /*! \brief
+ Default constructor: builds a function with empty codomain
+ (i.e., always undefined).
+ */
+ Partial_Function();
+
+ /*! \brief
+ Returns \c true if and only if the represented partial function
+ has an empty codomain (i.e., it is always undefined).
+ */
+ bool has_empty_codomain() const;
+
+ /*! \brief
+ If the codomain is \e not empty, returns the maximum value in it.
+
+ \exception std::runtime_error
+ Thrown if called when \p *this has an empty codomain.
+ */
+ dimension_type max_in_codomain() const;
+
+ /*! \brief
+ If \p *this maps \p i to a value \c k, assigns \c k to \p j and
+ returns \c true; otherwise, \p j is unchanged and \c false is returned.
+ */
+ bool maps(dimension_type i, dimension_type& j) const;
+
+ void print(std::ostream& s) const;
+
+ /*! \brief
+ Modifies \p *this so that \p i is mapped to \p j.
+
+ \exception std::runtime_error
+ Thrown if \p *this is already mapping \p j.
+ */
+ void insert(dimension_type i, dimension_type j);
+
+private:
+ std::vector<dimension_type> vec;
+ dimension_type max;
+#ifndef NDEBUG
+ std::set<dimension_type> codomain;
+#endif
+}; // class Partial_Function
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Partial_Function_inlines.hh"
+
+#endif // !defined(PPL_Partial_Function_defs_hh)
diff --git a/src/Partial_Function_inlines.hh b/src/Partial_Function_inlines.hh
new file mode 100644
index 0000000..03fa44f
--- /dev/null
+++ b/src/Partial_Function_inlines.hh
@@ -0,0 +1,90 @@
+/* Partial_Function class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partial_Function_inlines_hh
+#define PPL_Partial_Function_inlines_hh 1
+
+#include <stdexcept>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+ : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+ PPL_ASSERT(vec.empty() == codomain.empty());
+ return vec.empty();
+}
+
+inline dimension_type
+Partial_Function::max_in_codomain() const {
+ if (has_empty_codomain())
+ throw std::runtime_error("Partial_Function::max_in_codomain() called"
+ " when has_empty_codomain()");
+ PPL_ASSERT(codomain.begin() != codomain.end()
+ && max == *codomain.rbegin());
+ return max;
+}
+
+inline void
+Partial_Function::insert(dimension_type i, dimension_type j) {
+#ifndef NDEBUG
+ // The partial function has to be an injective map.
+ std::pair<std::set<dimension_type>::iterator, bool> s = codomain.insert(j);
+ PPL_ASSERT(s.second);
+#endif // #ifndef NDEBUG
+
+ // Expand `vec' if needed.
+ const dimension_type sz = vec.size();
+ if (i >= sz)
+ vec.insert(vec.end(), i - sz + 1, not_a_dimension());
+
+ // We cannot remap the same index to another one.
+ PPL_ASSERT(i < vec.size() && vec[i] == not_a_dimension());
+ vec[i] = j;
+
+ // Maybe update `max'.
+ if (j > max)
+ max = j;
+ PPL_ASSERT(codomain.begin() != codomain.end()
+ && max == *codomain.rbegin());
+}
+
+inline bool
+Partial_Function::maps(dimension_type i, dimension_type& j) const {
+ if (i >= vec.size())
+ return false;
+ const dimension_type vec_i = vec[i];
+ if (vec_i == not_a_dimension())
+ return false;
+ j = vec_i;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_inlines_hh)
diff --git a/src/Partial_Function_types.hh b/src/Partial_Function_types.hh
new file mode 100644
index 0000000..647d135
--- /dev/null
+++ b/src/Partial_Function_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Partial_Function_types_hh
+#define PPL_Partial_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_types_hh)
diff --git a/src/Partially_Reduced_Product_defs.hh b/src/Partially_Reduced_Product_defs.hh
new file mode 100644
index 0000000..5f830bc
--- /dev/null
+++ b/src/Partially_Reduced_Product_defs.hh
@@ -0,0 +1,1689 @@
+/* Partially_Reduced_Product class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_defs_hh
+#define PPL_Partially_Reduced_Product_defs_hh 1
+
+#include "Partially_Reduced_Product_types.hh"
+#include "globals_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+ Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+void swap(Partially_Reduced_Product<D1, D2, R>& x,
+ Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+ are pairwise equal.
+
+ \relates Partially_Reduced_Product
+ Note that \p x and \p y may be dimension-incompatible: in
+ those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+ are not pairwise equal.
+
+ \relates Partially_Reduced_Product
+ Note that \p x and \p y may be dimension-incompatible: in
+ those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/*! \brief
+ This class provides the reduction method for the Smash_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+ //! Default constructor.
+ Smash_Reduction();
+
+ /*! \brief
+ The smash reduction operator for propagating emptiness between the
+ domain elements \p d1 and \p d2.
+
+ If either of the the domain elements \p d1 or \p d2 is empty
+ then the other is also set empty.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Smash_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Constraints_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain. This class adds the constraints defining each of the component
+ domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+ //! Default constructor.
+ Constraints_Reduction();
+
+ /*! \brief
+ The constraints reduction operator for sharing constraints between the
+ domains.
+
+ The minimized constraint system defining the domain element \p d1
+ is added to \p d2 and the minimized constraint system defining \p d2
+ is added to \p d1.
+ In each case, the donor domain must provide a constraint system
+ in minimal form; this must define a polyhedron in which the
+ donor element is contained.
+ The recipient domain selects a subset of these constraints
+ that it can add to the recipient element.
+ For example: if the domain \p D1 is the Grid domain and \p D2
+ the NNC Polyhedron domain, then only the equality constraints are copied
+ from \p d1 to \p d2 and from \p d2 to \p d1.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Constraints_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Congruences_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain.
+
+ This class uses the minimized congruences defining each of the components.
+ For each of the congruences, it checks if the other component
+ intersects none, one or more than one hyperplane defined by the congruence
+ and adds equalities or emptiness as appropriate; in more detail:
+ Letting the components be d1 and d2, then, for each congruence cg
+ representing d1:
+ - if more than one hyperplane defined by cg intersects
+ d2, then d1 and d2 are unchanged;
+ - if exactly one hyperplane intersects d2, then d1 and d2 are
+ refined with the corresponding equality ;
+ - otherwise, d1 and d2 are set to empty.
+ Unless d1 and d2 are already empty, the process is repeated where the
+ roles of d1 and d2 are reversed.
+ If d1 or d2 is empty, then the emptiness is propagated.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Congruences_Reduction {
+public:
+ //! Default constructor.
+ Congruences_Reduction();
+
+ /*! \brief
+ The congruences reduction operator for detect emptiness or any equalities
+ implied by each of the congruences defining one of the components
+ and the bounds of the other component. It is assumed that the
+ components are already constraints reduced.
+
+ The minimized congruence system defining the domain element \p d1
+ is used to check if \p d2 intersects none, one or more than one
+ of the hyperplanes defined by the congruences: if it intersects none,
+ then product is set empty; if it intersects one, then the equality
+ defining this hyperplane is added to both components; otherwise,
+ the product is unchanged.
+ In each case, the donor domain must provide a congruence system
+ in minimal form.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Congruences_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Shape_Preserving_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain.
+
+ This reduction method includes the congruences reduction.
+ This class uses the minimized constraints defining each of the components.
+ For each of the constraints, it checks the frequency and value for the same
+ linear expression in the other component. If the constraint does not satisfy
+ the implied congruence, the inhomogeneous term is adjusted so that it does.
+ Note that, unless the congruences reduction adds equalities, the
+ shapes of the domains are unaltered.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Shape_Preserving_Reduction {
+public:
+ //! Default constructor.
+ Shape_Preserving_Reduction();
+
+ /*! \brief
+ The congruences reduction operator for detect emptiness or any equalities
+ implied by each of the congruences defining one of the components
+ and the bounds of the other component. It is assumed that the
+ components are already constraints reduced.
+
+ The minimized congruence system defining the domain element \p d1
+ is used to check if \p d2 intersects none, one or more than one
+ of the hyperplanes defined by the congruences: if it intersects none,
+ then product is set empty; if it intersects one, then the equality
+ defining this hyperplane is added to both components; otherwise,
+ the product is unchanged.
+ In each case, the donor domain must provide a congruence system
+ in minimal form.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Shape_Preserving_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Direct_Product domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+ //! Default constructor.
+ No_Reduction();
+
+ /*! \brief
+ The null reduction operator.
+
+ The parameters \p d1 and \p d2 are ignored.
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~No_Reduction();
+};
+
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
+
+ \warning
+ At present, the supported instantiations for the
+ two domain templates \p D1 and \p D2 are the simple pointset domains:
+ <CODE>C_Polyhedron</CODE>,
+ <CODE>NNC_Polyhedron</CODE>,
+ <CODE>Grid</CODE>,
+ <CODE>Octagonal_Shape\<T\></CODE>,
+ <CODE>BD_Shape\<T\></CODE>,
+ <CODE>Box\<T\></CODE>.
+
+ An object of the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE>
+ represents the (partially reduced) product of two pointset domains \p D1
+ and \p D2 where the form of any reduction is defined by the
+ reduction class \p R.
+
+ Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+ with concretization functions:
+ \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+ \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+ The partially reduced product \f$D = D_1 \times D_2\f$,
+ for any reduction class \p R, has a concretization
+ \f$\fund{\gamma}{D}{\Rset^n}\f$
+ where, if \f$d = (d_1, d_2) \in D\f$
+ \f[
+ \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+ \f]
+
+ The operations are defined to be the result of applying the corresponding
+ operations on each of the components provided the product is already reduced
+ by the reduction method defined by \p R.
+ In particular, if \p R is the <CODE>No_Reduction\<D1, D2\></CODE> class,
+ then the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> domain
+ is the direct product as defined in \ref CC79 "[CC79]".
+
+ How the results on the components are interpreted and
+ combined depend on the specific test.
+ For example, the test for emptiness will first make sure
+ the product is reduced (using the reduction method provided by \p R
+ if it is not already known to be reduced) and then test if either component
+ is empty; thus, if \p R defines no reduction between its components and
+ \f$d = (G, P) \in (\Gset \times \Pset)\f$
+ is a direct product in one dimension where \f$G\f$ denotes the set of
+ numbers that are integral multiples of 3 while \f$P\f$ denotes the
+ set of numbers between 1 and 2, then an operation that tests for
+ emptiness should return false.
+ However, the test for the universe returns true if and only if the
+ test <CODE>is_universe()</CODE> on both components returns true.
+
+ \par
+ In all the examples it is assumed that the template \c R is the
+ <CODE>No_Reduction\<D1, D2\></CODE> class and that variables
+ \c x and \c y are defined (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a direct product of a Grid and NNC Polyhedron,
+ corresponding to the positive even integer
+ pairs in \f$\Rset^2\f$, given as a system of congruences:
+ \code
+ Congruence_System cgs;
+ cgs.insert((x %= 0) / 2);
+ cgs.insert((y %= 0) / 2);
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+ dp(cgs);
+ dp.add_constraint(x >= 0);
+ dp.add_constraint(y >= 0);
+ \endcode
+
+ \par Example 2
+ The following code builds the same product
+ in \f$\Rset^2\f$:
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+ dp.add_constraint(x >= 0);
+ dp.add_constraint(y >= 0);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_congruence((y %= 0) / 2);
+ \endcode
+
+ \par Example 3
+ The following code will write "dp is empty":
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_congruence((x %= 1) / 2);
+ if (dp.is_empty())
+ cout << "dp is empty." << endl;
+ else
+ cout << "dp is not empty." << endl;
+ \endcode
+
+ \par Example 4
+ The following code will write "dp is not empty":
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_constraint(x >= 1);
+ dp.add_constraint(x <= 1);
+ if (dp.is_empty())
+ cout << "dp is empty." << endl;
+ else
+ cout << "dp is not empty." << endl;
+ \endcode
+*/
+
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+ /*! \brief
+ Returns the maximum space dimension this product
+ can handle.
+ */
+ static dimension_type max_space_dimension();
+
+ //! Builds an object having the specified properties.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the pair;
+
+ \param kind
+ Specifies whether a universe or an empty pair has to be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a pair, copying a system of congruences.
+ /*!
+ The pair inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(const Congruence_System& cgs);
+
+ //! Builds a pair, recycling a system of congruences.
+ /*!
+ The pair inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences to be approximates by the pair.
+ Its data-structures may be recycled to build the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(Congruence_System& cgs);
+
+ //! Builds a pair, copying a system of constraints.
+ /*!
+ The pair inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(const Constraint_System& cs);
+
+ //! Builds a pair, recycling a system of constraints.
+ /*!
+ The pair inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p cs exceeds the maximum allowed
+ space dimension.
+ */
+ explicit Partially_Reduced_Product(Constraint_System& cs);
+
+ //! Builds a product, from a C polyhedron.
+ /*!
+ Builds a product containing \p ph using algorithms whose
+ complexity does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+ smallest one containing \p ph.
+ The product inherits the space dimension of the polyhedron.
+
+ \param ph
+ The polyhedron to be approximated by the product.
+
+ \param complexity
+ The complexity that will not be exceeded.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const C_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product, from an NNC polyhedron.
+ /*!
+ Builds a product containing \p ph using algorithms whose
+ complexity does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+ smallest one containing \p ph.
+ The product inherits the space dimension of the polyhedron.
+
+ \param ph
+ The polyhedron to be approximated by the product.
+
+ \param complexity
+ The complexity that will not be exceeded.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const NNC_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product, from a grid.
+ /*!
+ Builds a product containing \p gr.
+ The product inherits the space dimension of the grid.
+
+ \param gr
+ The grid to be approximated by the product.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p gr exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const Grid& gr,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of a box.
+ /*!
+ Builds a product containing \p box.
+ The product inherits the space dimension of the box.
+
+ \param box
+ The box representing the pair to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ Partially_Reduced_Product(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of a BD shape.
+ /*!
+ Builds a product containing \p bd.
+ The product inherits the space dimension of the BD shape.
+
+ \param bd
+ The BD shape representing the product to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ Partially_Reduced_Product(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of an octagonal shape.
+ /*!
+ Builds a product containing \p os.
+ The product inherits the space dimension of the octagonal shape.
+
+ \param os
+ The octagonal shape representing the product to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ Partially_Reduced_Product(const Partially_Reduced_Product& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename E1, typename E2, typename S>
+ explicit
+ Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
+
+ //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+ "affine dimension"
+ (see also \ref Grid_Affine_Dimension "grid affine dimension")
+ of the components of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns a constant reference to the first of the pair.
+ const D1& domain1() const;
+
+ //! Returns a constant reference to the second of the pair.
+ const D2& domain2() const;
+
+ //! Returns a system of constraints which approximates \p *this.
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Returns a system of constraints which approximates \p *this, in
+ reduced form.
+ */
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of congruences which approximates \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a system of congruences which approximates \p *this, in
+ reduced form.
+ */
+ Congruence_System minimized_congruences() const;
+
+ //! Returns the relations holding between \p *this and \p c.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+ Returns the Poly_Con_Relation \p r for \p *this:
+ suppose the first component returns \p r1 and the second \p r2,
+ then \p r implies <CODE>is_included()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>is_included()</CODE>;
+ \p r implies <CODE>saturates()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>saturates()</CODE>;
+ \p r implies <CODE>is_disjoint()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>is_disjoint()</CODE>;
+ and \p r implies <CODE>nothing()</CODE>
+ if and only if both \p r1 and \p r2 imply
+ <CODE>strictly_intersects()</CODE>.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and \p cg.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+
+ Returns the Poly_Gen_Relation \p r for \p *this:
+ suppose the first component returns \p r1 and the second \p r2,
+ then \p r = <CODE>subsumes()</CODE>
+ if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+ and \p r = <CODE>nothing()</CODE>
+ if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if either of the components
+ of \p *this are empty.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if both of the components
+ of \p *this are the universe.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if both of the components
+ of \p *this are topologically closed subsets of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ componentwise disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Partially_Reduced_Product& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if a component of \p *this
+ is discrete.
+ */
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if a component of \p *this
+ is bounded.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_below.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_above.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+ maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below i \p *this, in which case the
+ infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+ \param g
+ When minimization succeeds, will be assigned the point or closure
+ point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each component of \p *this
+ contains the corresponding component of \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Partially_Reduced_Product& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each component of \p *this
+ strictly contains the corresponding component of \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Partially_Reduced_Product& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+ //@{
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Adds a copy of congruence \p cg to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are
+ dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Adds a copy of the congruences in \p cgs to \p *this.
+ /*!
+ \param cgs
+ The congruence system to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system to be added that may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cgs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ //! Adds a copy of the constraint system in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ //! Adds the constraint system in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system to be added that may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the componentwise intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an upper bound of \p *this and \p y
+ computed on the corresponding components.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an upper bound of \p *this and \p y
+ computed on the corresponding components.
+ If it is exact on each of the components of \p *this, <CODE>true</CODE>
+ is returned, otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an approximation of the set-theoretic difference
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Single_Update_Affine_Functions
+ "affine image" of \p
+ *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the \ref Single_Update_Affine_Functions
+ "affine preimage" of
+ \p *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+ "time-elapse" between \p *this and \p y.
+ (See also \ref Grid_Time_Elapse "time-elapse".)
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Partially_Reduced_Product& y);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ // TODO: Add a way to call other widenings.
+
+ // CHECKME: This may not be a real widening; it depends on the reduction
+ // class R and the widening used.
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ "widening" between \p *this and \p y.
+
+ This widening uses either the congruence or generator systems
+ depending on which of the systems describing x and y
+ are up to date and minimized.
+
+ \param y
+ A product that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void widening_assign(const Partially_Reduced_Product& y,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the components
+ of \p *this in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new space dimensions and does not embed the components
+ in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to the first (resp., second) component of \p *this
+ the "concatenation" of the first (resp., second) components
+ of \p *this and \p y, taken in this order.
+ See also \ref Concatenating_Polyhedra.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Partially_Reduced_Product& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that the
+ resulting space will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ If \p pfunc maps only some of the dimensions of \p *this then the
+ rest will be projected away.
+
+ If the highest dimension mapped to by \p pfunc is higher than the
+ highest dimension in \p *this then the number of dimensions in \p
+ *this will be increased to the highest dimension mapped to by \p
+ pfunc.
+
+ \param pfunc
+ The partial function specifying the destiny of each space
+ dimension.
+
+ The template class <CODE>Partial_Function</CODE> must provide the following
+ methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain of the
+ partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned. If \f$f\f$ is
+ undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing \p *this.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+ "folded" into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::
+ operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Partially_Reduced_Product();
+
+ /*! \brief
+ Swaps \p *this with product \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void m_swap(Partially_Reduced_Product& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+ //! Reduce.
+ /*
+ \return
+ <CODE>true</CODE> if and only if either of the resulting component
+ is strictly contained in the respective original.
+ */
+ bool reduce() const;
+
+protected:
+ //! The type of the first component.
+ typedef D1 Domain1;
+
+ //! The type of the second component.
+ typedef D2 Domain2;
+
+ //! The first component.
+ D1 d1;
+
+ //! The second component.
+ D2 d2;
+
+protected:
+ //! Clears the reduced flag.
+ void clear_reduced_flag() const;
+
+ //! Sets the reduced flag.
+ void set_reduced_flag() const;
+
+ //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+ bool is_reduced() const;
+
+ /*! \brief
+ Flag to record whether the components are reduced with respect
+ to each other and the reduction class.
+ */
+ bool reduced;
+
+private:
+ void throw_space_dimension_overflow(const char* method,
+ const char* reason);
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ This class is temporary and will be removed when template typedefs will
+ be supported in C++.
+
+ When template typedefs will be supported in C++, what now is verbosely
+ denoted by <CODE>Domain_Product\<Domain1, Domain2\>::%Direct_Product</CODE>
+ will simply be denoted by <CODE>Direct_Product\<Domain1, Domain2\></CODE>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+ typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+ Direct_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+ Smash_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+ Constraints_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Congruences_Reduction<D1, D2> >
+ Congruences_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Shape_Preserving_Reduction<D1, D2> >
+ Shape_Preserving_Product;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Partially_Reduced_Product_inlines.hh"
+#include "Partially_Reduced_Product_templates.hh"
+
+#endif // !defined(PPL_Partially_Reduced_Product_defs_hh)
diff --git a/src/Partially_Reduced_Product_inlines.hh b/src/Partially_Reduced_Product_inlines.hh
new file mode 100644
index 0000000..378b5a7
--- /dev/null
+++ b/src/Partially_Reduced_Product_inlines.hh
@@ -0,0 +1,815 @@
+/* Partially_Reduced_Product class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_inlines_hh
+#define PPL_Partially_Reduced_Product_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+ return (D1::max_space_dimension() < D2::max_space_dimension())
+ ? D1::max_space_dimension()
+ : D2::max_space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : d1(num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow("Partially_Reduced_Product(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind),
+ d2(num_dimensions, kind) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& cgs)
+ : d1(cgs), d2(cgs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+ : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& cs)
+ : d1(cs), d2(cs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+ : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+ Complexity_Class complexity)
+ : d1(ph, complexity), d2(ph, complexity) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+ Complexity_Class complexity)
+ : d1(ph, complexity), d2(ph, complexity) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+ : d1(gr), d2(gr) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+ : d1(box), d2(box) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+ : d1(bd), d2(bd) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+ : d1(os), d2(os) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+ Complexity_Class)
+ : d1(y.d1), d2(y.d2) {
+ reduced = y.reduced;
+}
+
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+ Complexity_Class complexity)
+ : d1(y.space_dimension()), d2(y.space_dimension()), reduced(false) {
+ Partially_Reduced_Product<D1, D2, R> pg1(y.domain1(), complexity);
+ Partially_Reduced_Product<D1, D2, R> pg2(y.domain2(), complexity);
+ pg1.intersection_assign(pg2);
+ m_swap(pg1);
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+ return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+ PPL_ASSERT(d1.space_dimension() == d2.space_dimension());
+ return d1.space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+ reduce();
+ const dimension_type d1_dim = d1.affine_dimension();
+ const dimension_type d2_dim = d2.affine_dimension();
+ return std::min(d1_dim, d2_dim);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+ reduce();
+ d1.unconstrain(var);
+ d2.unconstrain(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::unconstrain(const Variables_Set& vars) {
+ reduce();
+ d1.unconstrain(vars);
+ d2.unconstrain(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+ d1.intersection_assign(y.d1);
+ d2.intersection_assign(y.d2);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.difference_assign(y.d1);
+ d2.difference_assign(y.d2);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.upper_bound_assign(y.d1);
+ d2.upper_bound_assign(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ D1 d1_copy = d1;
+ bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+ if (!ub_exact)
+ return false;
+ ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+ if (!ub_exact)
+ return false;
+ using std::swap;
+ swap(d1, d1_copy);
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.affine_image(var, expr, denominator);
+ d2.affine_image(var, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.affine_preimage(var, expr, denominator);
+ d2.affine_preimage(var, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.generalized_affine_image(var, relsym, expr, denominator);
+ d2.generalized_affine_image(var, relsym, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.generalized_affine_preimage(var, relsym, expr, denominator);
+ d2.generalized_affine_preimage(var, relsym, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ d1.generalized_affine_image(lhs, relsym, rhs);
+ d2.generalized_affine_image(lhs, relsym, rhs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ d1.generalized_affine_preimage(lhs, relsym, rhs);
+ d2.generalized_affine_preimage(lhs, relsym, rhs);
+ clear_reduced_flag();
+}
+
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+ d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.time_elapse_assign(y.d1);
+ d2.time_elapse_assign(y.d2);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+ d1.topological_closure_assign();
+ d2.topological_closure_assign();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::m_swap(Partially_Reduced_Product& y) {
+ using std::swap;
+ swap(d1, y.d1);
+ swap(d2, y.d2);
+ swap(reduced, y.reduced);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+ d1.add_constraint(c);
+ d2.add_constraint(c);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+ d1.refine_with_constraint(c);
+ d2.refine_with_constraint(c);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+ d1.add_congruence(cg);
+ d2.add_congruence(cg);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+ d1.refine_with_congruence(cg);
+ d2.refine_with_congruence(cg);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+ d1.add_constraints(cs);
+ d2.add_constraints(cs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+ d1.refine_with_constraints(cs);
+ d2.refine_with_constraints(cs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+ d1.add_congruences(cgs);
+ d2.add_congruences(cgs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+ d1.refine_with_congruences(cgs);
+ d2.refine_with_congruences(cgs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+ reduce();
+ d1.drop_some_non_integer_points(complexity);
+ d2.drop_some_non_integer_points(complexity);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ reduce();
+ d1.drop_some_non_integer_points(vars, complexity);
+ d2.drop_some_non_integer_points(vars, complexity);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+ d1 = y.d1;
+ d2 = y.d2;
+ reduced = y.reduced;
+ return *this;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+ reduce();
+ return d1;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+ reduce();
+ return d2;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+ reduce();
+ return d1.is_empty() || d2.is_empty();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+ return d1.is_universe() && d2.is_universe();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+ reduce();
+ return d1.is_topologically_closed() && d2.is_topologically_closed();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+ reduce();
+ return d1.is_discrete() || d2.is_discrete();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+ reduce();
+ return d1.is_bounded() || d2.is_bounded();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+ reduce();
+ return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+ reduce();
+ return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+ reduce();
+ return d1.constrains(var) || d2.constrains(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+ unsigned* tp) {
+ // FIXME(0.10.1): In general this is _NOT_ a widening since the reduction
+ // may mean that the sequence does not satisfy the ascending
+ // chain condition.
+ // However, for the direct, smash and constraints product
+ // it may be ok - but this still needs checking.
+ reduce();
+ y.reduce();
+ d1.widening_assign(y.d1, tp);
+ d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+ d1.add_space_dimensions_and_embed(m);
+ d2.add_space_dimensions_and_embed(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+ d1.add_space_dimensions_and_project(m);
+ d2.add_space_dimensions_and_project(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+ d1.concatenate_assign(y.d1);
+ d2.concatenate_assign(y.d2);
+ if (!is_reduced() || !y.is_reduced())
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& vars) {
+ d1.remove_space_dimensions(vars);
+ d2.remove_space_dimensions(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+ d1.remove_higher_space_dimensions(new_dimension);
+ d2.remove_higher_space_dimensions(new_dimension);
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+ d1.map_space_dimensions(pfunc);
+ d2.map_space_dimensions(pfunc);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+ d1.expand_space_dimension(var, m);
+ d2.expand_space_dimension(var, m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ d1.fold_space_dimensions(vars, dest);
+ d2.fold_space_dimensions(vars, dest);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return d1.contains(y.d1) && d2.contains(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+ || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+ Partially_Reduced_Product& dp
+ = const_cast<Partially_Reduced_Product&>(*this);
+ if (dp.is_reduced())
+ return false;
+ R r;
+ r.product_reduce(dp.d1, dp.d2);
+ set_reduced_flag();
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+ return reduced;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+ const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+ const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
+
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+ const char yes = '+';
+ const char no = '-';
+ s << "Partially_Reduced_Product\n";
+ s << (reduced ? yes : no) << "reduced\n";
+ s << "Domain 1:\n";
+ d1.ascii_dump(s);
+ s << "Domain 2:\n";
+ d2.ascii_dump(s);
+}
+
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y) {
+ x.reduce();
+ y.reduce();
+ return x.d1 == y.d1 && x.d2 == y.d2;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y) {
+ return !(x == y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s,
+ const Partially_Reduced_Product<D1, D2, R>& dp) {
+ return s << "Domain 1:\n"
+ << dp.d1
+ << "Domain 2:\n"
+ << dp.d2;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
+
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::~Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::Shape_Preserving_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::~Shape_Preserving_Reduction() {
+}
+
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+swap(Partially_Reduced_Product<D1, D2, R>& x,
+ Partially_Reduced_Product<D1, D2, R>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_inlines_hh)
diff --git a/src/Partially_Reduced_Product_templates.hh b/src/Partially_Reduced_Product_templates.hh
new file mode 100644
index 0000000..791ece7
--- /dev/null
+++ b/src/Partially_Reduced_Product_templates.hh
@@ -0,0 +1,710 @@
+/* Partially_Reduced_Product class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_templates_hh
+#define PPL_Partially_Reduced_Product_templates_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::throw_space_dimension_overflow(const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Partially_Reduced_Product::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::length_error(s.str());
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+ reduce();
+ Constraint_System cs = d2.constraints();
+ const Constraint_System& cs1 = d1.constraints();
+ for (Constraint_System::const_iterator i = cs1.begin(),
+ cs_end = cs1.end(); i != cs_end; ++i)
+ cs.insert(*i);
+ return cs;
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+ reduce();
+ Constraint_System cs = d2.constraints();
+ const Constraint_System& cs1 = d1.constraints();
+ for (Constraint_System::const_iterator i = cs1.begin(),
+ cs_end = cs1.end(); i != cs_end; ++i)
+ cs.insert(*i);
+ if (cs.has_strict_inequalities()) {
+ NNC_Polyhedron ph(cs);
+ return ph.minimized_constraints();
+ }
+ else {
+ C_Polyhedron ph(cs);
+ return ph.minimized_constraints();
+ }
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+ reduce();
+ Congruence_System cgs = d2.congruences();
+ const Congruence_System& cgs1 = d1.congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i)
+ cgs.insert(*i);
+ return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+ reduce();
+ Congruence_System cgs = d2.congruences();
+ const Congruence_System& cgs1 = d1.congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i)
+ cgs.insert(*i);
+ Grid gr(cgs);
+ return gr.minimized_congruences();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+ if (d1.can_recycle_constraint_systems()) {
+ d2.refine_with_constraints(cs);
+ d1.add_recycled_constraints(cs);
+ }
+ else
+ if (d2.can_recycle_constraint_systems()) {
+ d1.refine_with_constraints(cs);
+ d2.add_recycled_constraints(cs);
+ }
+ else {
+ d1.add_constraints(cs);
+ d2.add_constraints(cs);
+ }
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+ if (d1.can_recycle_congruence_systems()) {
+ d2.refine_with_congruences(cgs);
+ d1.add_recycled_congruences(cgs);
+ }
+ else
+ if (d2.can_recycle_congruence_systems()) {
+ d1.refine_with_congruences(cgs);
+ d2.add_recycled_congruences(cgs);
+ }
+ else {
+ d1.add_congruences(cgs);
+ d2.add_congruences(cgs);
+ }
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+ reduce();
+ if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+ || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+ return Poly_Gen_Relation::nothing();
+ else
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+ reduce();
+ Poly_Con_Relation relation1 = d1.relation_with(c);
+ Poly_Con_Relation relation2 = d2.relation_with(c);
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+ if (relation1.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ else if (relation2.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ if (relation1.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ else if (relation2.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+ else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+
+ return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+ reduce();
+ Poly_Con_Relation relation1 = d1.relation_with(cg);
+ Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+ if (relation1.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ else if (relation2.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ if (relation1.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ else if (relation2.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+ else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+
+ return result;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+ bool maximum1;
+ bool maximum2;
+ bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+ bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+ // If neither is bounded from above, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from above, then use the values for d2.
+ if (!r1) {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ return true;
+ }
+ // If only d1 is bounded from above, then use the values for d1.
+ if (!r2) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from above, then use the minimum values.
+ if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ }
+ else {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+ bool minimum1;
+ bool minimum2;
+ bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+ bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+ // If neither is bounded from below, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from below, then use the values for d2.
+ if (!r1) {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ return true;
+ }
+ // If only d1 is bounded from below, then use the values for d1.
+ if (!r2) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from below, then use the minimum values.
+ if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ }
+ else {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+ bool maximum1;
+ bool maximum2;
+ Generator g1(point());
+ Generator g2(point());
+ bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, g1);
+ bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, g2);
+ // If neither is bounded from above, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from above, then use the values for d2.
+ if (!r1) {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ g = g2;
+ return true;
+ }
+ // If only d1 is bounded from above, then use the values for d1.
+ if (!r2) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ g = g1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from above, then use the minimum values.
+ if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ g = g1;
+ }
+ else {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ g = g2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+ bool minimum1;
+ bool minimum2;
+ Generator g1(point());
+ Generator g2(point());
+ bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, g1);
+ bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, g2);
+ // If neither is bounded from below, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from below, then use the values for d2.
+ if (!r1) {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ g = g2;
+ return true;
+ }
+ // If only d1 is bounded from below, then use the values for d1.
+ if (!r2) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ g = g1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from below, then use the minimum values.
+ if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ g = g1;
+ }
+ else {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ g = g2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+ if (reduced) {
+ Partially_Reduced_Product<D1, D2, R> dp1 = *this;
+ Partially_Reduced_Product<D1, D2, R> dp2 = *this;
+ /* Force dp1 reduction */
+ dp1.clear_reduced_flag();
+ dp1.reduce();
+ if (dp1 != dp2)
+ return false;
+ }
+ return d1.OK() && d2.OK();
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+ const char yes = '+';
+ const char no = '-';
+ std::string str;
+ if (!(s >> str) || str != "Partially_Reduced_Product")
+ return false;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != "reduced")
+ return false;
+ reduced = (str[0] == yes);
+ if (!(s >> str) || str != "Domain")
+ return false;
+ if (!(s >> str) || str != "1:")
+ return false;
+ if (!d1.ascii_load(s))
+ return false;
+ if (!(s >> str) || str != "Domain")
+ return false;
+ if (!(s >> str) || str != "2:")
+ return false;
+ return d2.ascii_load(s);
+}
+
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ using std::swap;
+ if (d2.is_empty()) {
+ if (!d1.is_empty()) {
+ D1 new_d1(d1.space_dimension(), EMPTY);
+ swap(d1, new_d1);
+ }
+ }
+ else if (d1.is_empty()) {
+ D2 new_d2(d2.space_dimension(), EMPTY);
+ swap(d2, new_d2);
+ }
+}
+
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ if (d1.is_empty() || d2.is_empty()) {
+ // If one of the components is empty, do the smash reduction and return.
+ Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+ sr.product_reduce(d1, d2);
+ return;
+ }
+ else {
+ using std::swap;
+ dimension_type space_dim = d1.space_dimension();
+ d1.refine_with_constraints(d2.minimized_constraints());
+ if (d1.is_empty()) {
+ D2 new_d2(space_dim, EMPTY);
+ swap(d2, new_d2);
+ return;
+ }
+ d2.refine_with_constraints(d1.minimized_constraints());
+ if (d2.is_empty()) {
+ D1 new_d1(space_dim, EMPTY);
+ swap(d1, new_d1);
+ }
+ }
+}
+
+/* Auxiliary procedure for the Congruences_Reduction() method.
+ If more than one hyperplane defined by congruence cg intersect
+ d2, then d1 and d2 are unchanged; if exactly one intersects d2, then
+ the corresponding equality is added to d1 and d2;
+ otherwise d1 and d2 are set empty. */
+template <typename D1, typename D2>
+bool shrink_to_congruence_no_check(D1& d1, D2& d2, const Congruence& cg) {
+ // It is assumed that cg is a proper congruence.
+ PPL_ASSERT(cg.modulus() != 0);
+ // It is assumed that cg is satisfied by all points in d1.
+ PPL_ASSERT(d1.relation_with(cg) == Poly_Con_Relation::is_included());
+
+ Linear_Expression e(cg.expression());
+
+ // Find the maximum and minimum bounds for the domain element d with the
+ // linear expression e.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ if (d2.maximize(e, max_numer, max_denom, max_included)) {
+ bool min_included;
+ if (d2.minimize(e, min_numer, min_denom, min_included)) {
+ // Adjust values to allow for the denominators max_denom and min_denom.
+ max_numer *= min_denom;
+ min_numer *= max_denom;
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ denom = max_denom * min_denom;
+ mod = cg.modulus() * denom;
+ // If the difference between the maximum and minimum bounds is more than
+ // twice the modulus, then there will be two neighboring hyperplanes
+ // defined by cg that are intersected by the domain element d;
+ // there is no possible reduction in this case.
+ PPL_DIRTY_TEMP_COEFFICIENT(mod2);
+ mod2 = 2 * mod;
+ if (max_numer - min_numer < mod2
+ || (max_numer - min_numer == mod2 && (!max_included || !min_included)))
+ {
+ PPL_DIRTY_TEMP_COEFFICIENT(shrink_amount);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_decreased);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_increased);
+ // Find the amount by which the maximum value may be decreased.
+ shrink_amount = max_numer % mod;
+ if (!max_included && shrink_amount == 0)
+ shrink_amount = mod;
+ if (shrink_amount < 0)
+ shrink_amount += mod;
+ max_decreased = max_numer - shrink_amount;
+ // Find the amount by which the minimum value may be increased.
+ shrink_amount = min_numer % mod;
+ if (!min_included && shrink_amount == 0)
+ shrink_amount = - mod;
+ if (shrink_amount > 0)
+ shrink_amount -= mod;
+ min_increased = min_numer - shrink_amount;
+ if (max_decreased == min_increased) {
+ // The domain element d2 intersects exactly one hyperplane
+ // defined by cg, so add the equality to d1 and d2.
+ Constraint new_c(denom * e == min_increased);
+ d1.refine_with_constraint(new_c);
+ d2.refine_with_constraint(new_c);
+ return true;
+ }
+ else {
+ if (max_decreased < min_increased) {
+ using std::swap;
+ // In this case, d intersects no hyperplanes defined by cg,
+ // so set d to empty and return false.
+ D1 new_d1(d1.space_dimension(), EMPTY);
+ swap(d1, new_d1);
+ D2 new_d2(d2.space_dimension(), EMPTY);
+ swap(d2, new_d2);
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+template <typename D1, typename D2>
+void
+Congruences_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ if (d1.is_empty() || d2.is_empty()) {
+ // If one of the components is empty, do the smash reduction and return.
+ Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+ sr.product_reduce(d1, d2);
+ return;
+ }
+ // Use the congruences representing d1 to shrink both components.
+ const Congruence_System cgs1 = d1.minimized_congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i) {
+ const Congruence& cg1 = *i;
+ if (cg1.is_equality())
+ d2.refine_with_congruence(cg1);
+ else
+ if (!Parma_Polyhedra_Library::
+ shrink_to_congruence_no_check(d1, d2, cg1))
+ // The product is empty.
+ return;
+ }
+ // Use the congruences representing d2 to shrink both components.
+ const Congruence_System cgs2 = d2.minimized_congruences();
+ for (Congruence_System::const_iterator i = cgs2.begin(),
+ cgs_end = cgs2.end(); i != cgs_end; ++i) {
+ const Congruence& cg2 = *i;
+ if (cg2.is_equality())
+ d1.refine_with_congruence(cg2);
+ else
+ if (!Parma_Polyhedra_Library::
+ shrink_to_congruence_no_check(d2, d1, cg2))
+ // The product is empty.
+ return;
+ }
+}
+
+template <typename D1, typename D2>
+void
+Shape_Preserving_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ // First do the congruences reduction.
+ Parma_Polyhedra_Library::Congruences_Reduction<D1, D2> cgr;
+ cgr.product_reduce(d1, d2);
+ if (d1.is_empty())
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(freq_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(freq_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(val_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(val_d);
+
+ // Use the constraints representing d2.
+ Constraint_System cs = d2.minimized_constraints();
+ Constraint_System refining_cs;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ continue;
+ // Check the frequency and value of the linear expression for
+ // the constraint `c'.
+ Linear_Expression le(c.expression());
+ if (!d1.frequency(le, freq_n, freq_d, val_n, val_d))
+ // Nothing to do.
+ continue;
+ if (val_n == 0)
+ // Nothing to do.
+ continue;
+ // Adjust the value of the inhomogeneous term to satisfy
+ // the implied congruence.
+ if (val_n < 0) {
+ val_n = val_n*freq_d + val_d*freq_n;
+ val_d *= freq_d;
+ }
+ le *= val_d;
+ le -= val_n;
+ refining_cs.insert(le >= 0);
+ }
+ d2.refine_with_constraints(refining_cs);
+
+ // Use the constraints representing d1.
+ cs = d1.minimized_constraints();
+ refining_cs.clear();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ // Equalities already shared.
+ continue;
+ // Check the frequency and value of the linear expression for
+ // the constraint `c'.
+ Linear_Expression le(c.expression());
+ if (!d2.frequency(le, freq_n, freq_d, val_n, val_d))
+ // Nothing to do.
+ continue;
+ if (val_n == 0)
+ // Nothing to do.
+ continue;
+ // Adjust the value of the inhomogeneous term to satisfy
+ // the implied congruence.
+ if (val_n < 0) {
+ val_n = val_n*freq_d + val_d*freq_n;
+ val_d *= freq_d;
+ }
+ le *= val_d;
+ le -= val_n;
+ refining_cs.insert(le >= 0);
+ }
+ d1.refine_with_constraints(refining_cs);
+
+ // The reduction may have introduced additional equalities
+ // so these must be shared with the other component.
+ Parma_Polyhedra_Library::Constraints_Reduction<D1, D2> cr;
+ cr.product_reduce(d1, d2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_templates_hh)
diff --git a/src/Partially_Reduced_Product_types.hh b/src/Partially_Reduced_Product_types.hh
new file mode 100644
index 0000000..9db15b9
--- /dev/null
+++ b/src/Partially_Reduced_Product_types.hh
@@ -0,0 +1,38 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Partially_Reduced_Product_types_hh
+#define PPL_Partially_Reduced_Product_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class Congruences_Reduction;
+
+template <typename D1, typename D2>
+class Shape_Preserving_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_types_hh)
diff --git a/src/Pending_Element_defs.hh b/src/Pending_Element_defs.hh
new file mode 100644
index 0000000..aabe2a9
--- /dev/null
+++ b/src/Pending_Element_defs.hh
@@ -0,0 +1,77 @@
+/* Pending_Element class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_Element_defs_hh
+#define PPL_Pending_Element_defs_hh 1
+
+#include "Pending_Element_types.hh"
+#include "Doubly_Linked_Object_defs.hh"
+#include "Handler_types.hh"
+
+//! A class for pending watchdog events with embedded links.
+/*!
+ Each pending watchdog event is characterized by a deadline (a positive
+ time interval), an associated handler that will be invoked upon event
+ expiration, and a Boolean flag that indicates whether the event has already
+ expired or not.
+*/
+template <typename Threshold>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_Element
+ : public Doubly_Linked_Object {
+public:
+ //! Constructs an element with the given attributes.
+ Pending_Element(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Modifies \p *this so that it has the given attributes.
+ void assign(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Returns the deadline of the event.
+ const Threshold& deadline() const;
+
+ //! Returns the handler associated to the event.
+ const Handler& handler() const;
+
+ //! Returns a reference to the "event-expired" flag.
+ bool& expired_flag() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The deadline of the event.
+ Threshold d;
+
+ //! A pointer to the handler associated to the event.
+ const Handler* p_h;
+
+ //! A pointer to a flag saying whether the event has already expired or not.
+ bool* p_f;
+};
+
+#include "Pending_Element_inlines.hh"
+
+#endif // !defined(PPL_Pending_Element_defs_hh)
diff --git a/src/Pending_Element_inlines.hh b/src/Pending_Element_inlines.hh
new file mode 100644
index 0000000..92d646d
--- /dev/null
+++ b/src/Pending_Element_inlines.hh
@@ -0,0 +1,85 @@
+/* Pending_Element class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_Element_inlines_hh
+#define PPL_Pending_Element_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Threshold>
+inline bool
+Pending_Element<Threshold>::OK() const {
+ return true;
+}
+
+template <typename Threshold>
+inline
+Pending_Element<Threshold>::Pending_Element(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag)
+ : d(deadline), p_h(&handler), p_f(&expired_flag) {
+ assert(OK());
+}
+
+template <typename Threshold>
+inline void
+Pending_Element<Threshold>::assign(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ d = deadline;
+ p_h = &handler;
+ p_f = &expired_flag;
+ assert(OK());
+}
+
+template <typename Threshold>
+inline const Threshold&
+Pending_Element<Threshold>::deadline() const {
+ return d;
+}
+
+template <typename Threshold>
+inline const Handler&
+Pending_Element<Threshold>::handler() const {
+ return *p_h;
+}
+
+template <typename Threshold>
+inline bool&
+Pending_Element<Threshold>::expired_flag() const {
+ return *p_f;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_Element_inlines_hh)
diff --git a/src/Pending_Element_types.hh b/src/Pending_Element_types.hh
new file mode 100644
index 0000000..0bc1b6a
--- /dev/null
+++ b/src/Pending_Element_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pending_Element_types_hh
+#define PPL_Pending_Element_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <class Threshold>
+class Pending_Element;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_Element_types_hh)
diff --git a/src/Pending_List_defs.hh b/src/Pending_List_defs.hh
new file mode 100644
index 0000000..171990e
--- /dev/null
+++ b/src/Pending_List_defs.hh
@@ -0,0 +1,79 @@
+/* Pending_List class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_defs_hh
+#define PPL_Pending_List_defs_hh 1
+
+#include "Pending_List_types.hh"
+#include "Pending_Element_defs.hh"
+#include "EList_defs.hh"
+#include "Handler_types.hh"
+
+//! An ordered list for recording pending watchdog events.
+template <typename Traits>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_List {
+public:
+ //! A non-const iterator to traverse the list.
+ typedef typename EList<Pending_Element<typename Traits::Threshold> >::iterator iterator;
+
+ //! A const iterator to traverse the list.
+ typedef typename EList<Pending_Element<typename Traits::Threshold> >::const_iterator const_iterator;
+
+ //! Constructs an empty list.
+ Pending_List();
+
+ //! Destructor.
+ ~Pending_List();
+
+ //! Inserts a new Pending_Element object with the given attributes.
+ iterator insert(const typename Traits::Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ /*! \brief
+ Removes the element pointed to by \p position, returning
+ an iterator pointing to the next element, if any, or end(), otherwise.
+ */
+ iterator erase(iterator position);
+
+ //! Returns <CODE>true</CODE> if and only if the list is empty.
+ bool empty() const;
+
+ //! Returns an iterator pointing to the beginning of the list.
+ iterator begin();
+
+ //! Returns an iterator pointing one past the last element in the list.
+ iterator end();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ EList<Pending_Element<typename Traits::Threshold> > active_list;
+ EList<Pending_Element<typename Traits::Threshold> > free_list;
+};
+
+#include "Pending_List_inlines.hh"
+#include "Pending_List_templates.hh"
+
+#endif // !defined(PPL_Pending_List_defs_hh)
diff --git a/src/Pending_List_inlines.hh b/src/Pending_List_inlines.hh
new file mode 100644
index 0000000..20c62b1
--- /dev/null
+++ b/src/Pending_List_inlines.hh
@@ -0,0 +1,82 @@
+/* Pending_List class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_inlines_hh
+#define PPL_Pending_List_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+inline
+Pending_List<Traits>::Pending_List()
+ : active_list(),
+ free_list() {
+ assert(OK());
+}
+
+template <typename Traits>
+inline
+Pending_List<Traits>::~Pending_List() {
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::begin() {
+ return active_list.begin();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::end() {
+ return active_list.end();
+}
+
+template <typename Traits>
+inline bool
+Pending_List<Traits>::empty() const {
+ return active_list.empty();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::erase(iterator position) {
+ assert(!empty());
+ iterator next = active_list.erase(position);
+ free_list.push_back(*position);
+ assert(OK());
+ return next;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_inlines_hh)
diff --git a/src/Pending_List_templates.hh b/src/Pending_List_templates.hh
new file mode 100644
index 0000000..e984ce2
--- /dev/null
+++ b/src/Pending_List_templates.hh
@@ -0,0 +1,96 @@
+/* Pending_List class implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_templates_hh
+#define PPL_Pending_List_templates_hh 1
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+typename Pending_List<Traits>::iterator
+Pending_List<Traits>::insert(const typename Traits::Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ iterator position = active_list.begin();
+ for (iterator active_list_end = active_list.end();
+ position != active_list_end
+ && Traits::less_than(position->deadline(), deadline);
+ ++position)
+ ;
+ iterator pending_element_p;
+ // Only allocate a new element if the free list is empty.
+ if (free_list.empty())
+ pending_element_p
+ = new Pending_Element<typename Traits::Threshold>(deadline,
+ handler,
+ expired_flag);
+ else {
+ pending_element_p = free_list.begin();
+ free_list.erase(pending_element_p);
+ pending_element_p->assign(deadline, handler, expired_flag);
+ }
+ iterator r = active_list.insert(position, *pending_element_p);
+ assert(OK());
+ return r;
+}
+
+template <typename Traits>
+bool
+Pending_List<Traits>::OK() const {
+ if (!active_list.OK())
+ return false;
+
+ if (!free_list.OK())
+ return false;
+
+ const typename Traits::Threshold* old;
+ const_iterator i = active_list.begin();
+ old = &i->deadline();
+ ++i;
+ for (const_iterator active_list_end = active_list.end(); i != active_list_end; ++i) {
+ const typename Traits::Threshold& t = i->deadline();
+ if (Traits::less_than(t, *old)) {
+#ifndef NDEBUG
+ std::cerr << "The active list is not sorted!"
+ << std::endl;
+#endif
+ return false;
+ }
+ old = &t;
+ }
+ return true;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_templates_hh)
diff --git a/src/Pending_List_types.hh b/src/Pending_List_types.hh
new file mode 100644
index 0000000..af6c6ba
--- /dev/null
+++ b/src/Pending_List_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pending_List_types_hh
+#define PPL_Pending_List_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+class Pending_List;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_types_hh)
diff --git a/src/Ph_Status.cc b/src/Ph_Status.cc
new file mode 100644
index 0000000..eb9dd8e
--- /dev/null
+++ b/src/Ph_Status.cc
@@ -0,0 +1,245 @@
+/* Polyhedron::Status class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron::Status
+ Reads a keyword and its associated on/off, +/- flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != '+' && str[0] != '-')
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == '+');
+ return true;
+}
+
+} // namespace
+
+void
+PPL::Polyhedron::Status::ascii_dump(std::ostream& s) const {
+ s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+ << (test_empty() ? '+' : '-') << empty << ' '
+ << ' '
+ << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+ << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+ << ' '
+ << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+ << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+ << ' '
+ << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+ << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+ << ' '
+ << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+ << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' ';
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Polyhedron::Status)
+
+bool
+PPL::Polyhedron::Status::ascii_load(std::istream& s) {
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, consys_min, positive))
+ return false;
+ if (positive)
+ set_c_minimized();
+ else
+ reset_c_minimized();
+
+ if (!get_field(s, gensys_min, positive))
+ return false;
+ if (positive)
+ set_g_minimized();
+ else
+ reset_g_minimized();
+
+ if (!get_field(s, consys_upd, positive))
+ return false;
+ if (positive)
+ set_c_up_to_date();
+ else
+ reset_c_up_to_date();
+
+ if (!get_field(s, gensys_upd, positive))
+ return false;
+ if (positive)
+ set_g_up_to_date();
+ else
+ reset_g_up_to_date();
+
+ if (!get_field(s, consys_pending, positive))
+ return false;
+ if (positive)
+ set_c_pending();
+ else
+ reset_c_pending();
+
+ if (!get_field(s, gensys_pending, positive))
+ return false;
+ if (positive)
+ set_g_pending();
+ else
+ reset_g_pending();
+
+ if (!get_field(s, satc_upd, positive))
+ return false;
+ if (positive)
+ set_sat_c_up_to_date();
+ else
+ reset_sat_c_up_to_date();
+
+ if (!get_field(s, satg_upd, positive))
+ return false;
+ if (positive)
+ set_sat_g_up_to_date();
+ else
+ reset_sat_g_up_to_date();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+bool
+PPL::Polyhedron::Status::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+ else {
+#ifndef NDEBUG
+ cerr << "The empty flag is incompatible with any other one."
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+ && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+ cerr <<
+ "If a saturation matrix is up-to-date, constraints and\n"
+ "generators have to be both up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "If constraints are minimized they must be up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "If generators are minimized they must be up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+ cerr << "There cannot be both pending constraints and pending generators."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (test_c_pending() || test_g_pending()) {
+ if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+ cerr <<
+ "If there are pending constraints or generators, constraints\n"
+ "and generators must be minimized."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+ cerr <<
+ "If there are pending constraints or generators, there must\n"
+ "be at least a saturation matrix up-to-date."
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
diff --git a/src/Ph_Status_idefs.hh b/src/Ph_Status_idefs.hh
new file mode 100644
index 0000000..1c3128f
--- /dev/null
+++ b/src/Ph_Status_idefs.hh
@@ -0,0 +1,183 @@
+/* Polyhedron::Status class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Status_idefs_hh
+#define PPL_Status_idefs_hh 1
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status_idefs.hh directly; use Polyhedron_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the polyhedron is the empty set;
+ - <EM>constraints pending</EM>: the polyhedron is correctly
+ characterized by the attached system of constraints, which is
+ split in two non-empty subsets: the already processed constraints,
+ which are in minimal form, and the pending constraints, which
+ still have to be processed and may thus be inconsistent or
+ contain redundancies;
+ - <EM>generators pending</EM>: the polyhedron is correctly
+ characterized by the attached system of generators, which is
+ split in two non-empty subsets: the already processed generators,
+ which are in minimal form, and the pending generators, which still
+ have to be processed and may thus contain redundancies;
+ - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+ characterized by the attached system of constraints, modulo the
+ processing of pending generators;
+ - <EM>generators up-to-date</EM>: the polyhedron is correctly
+ characterized by the attached system of generators, modulo the
+ processing of pending constraints;
+ - <EM>constraints minimized</EM>: the non-pending part of the system
+ of constraints attached to the polyhedron is in minimal form;
+ - <EM>generators minimized</EM>: the non-pending part of the system
+ of generators attached to the polyhedron is in minimal form;
+ - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+ saturation matrix having rows indexed by non-pending generators and
+ columns indexed by non-pending constraints correctly expresses
+ the saturation relation between the attached non-pending constraints
+ and generators;
+ - <EM>generators' saturation matrix up-to-date</EM>: the attached
+ saturation matrix having rows indexed by non-pending constraints and
+ columns indexed by non-pending generators correctly expresses
+ the saturation relation between the attached non-pending constraints
+ and generators;
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>constraints pending</EM> and <EM>generators pending</EM>
+ are mutually exclusive;
+ - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+ - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+ - <EM>constraints' saturation matrix up-to-date</EM> implies both
+ <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+ - <EM>generators' saturation matrix up-to-date</EM> implies both
+ <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_c_up_to_date() const;
+ void reset_c_up_to_date();
+ void set_c_up_to_date();
+
+ bool test_g_up_to_date() const;
+ void reset_g_up_to_date();
+ void set_g_up_to_date();
+
+ bool test_c_minimized() const;
+ void reset_c_minimized();
+ void set_c_minimized();
+
+ bool test_g_minimized() const;
+ void reset_g_minimized();
+ void set_g_minimized();
+
+ bool test_sat_c_up_to_date() const;
+ void reset_sat_c_up_to_date();
+ void set_sat_c_up_to_date();
+
+ bool test_sat_g_up_to_date() const;
+ void reset_sat_g_up_to_date();
+ void set_sat_g_up_to_date();
+
+ bool test_c_pending() const;
+ void reset_c_pending();
+ void set_c_pending();
+
+ bool test_g_pending() const;
+ void reset_g_pending();
+ void set_g_pending();
+ //@} // Test, remove or add an individual assertion from the conjunction
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t C_UP_TO_DATE = 1U << 1;
+ static const flags_t G_UP_TO_DATE = 1U << 2;
+ static const flags_t C_MINIMIZED = 1U << 3;
+ static const flags_t G_MINIMIZED = 1U << 4;
+ static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+ static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+ static const flags_t CS_PENDING = 1U << 7;
+ static const flags_t GS_PENDING = 1U << 8;
+ //@} // Bit-masks for the individual assertions
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Status_idefs_hh)
diff --git a/src/Ph_Status_inlines.hh b/src/Ph_Status_inlines.hh
new file mode 100644
index 0000000..a4ce90b
--- /dev/null
+++ b/src/Ph_Status_inlines.hh
@@ -0,0 +1,217 @@
+/* Polyhedron::Status class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Status_inlines_hh
+#define PPL_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+ flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+ return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+ reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+ set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+ return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+ reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+ set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+ return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+ reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+ set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+ return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+ reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+ set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+ return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+ reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+ set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+ return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+ reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+ set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+ return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+ reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+ set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+ return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+ reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+ set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Pointset_Powerset.cc b/src/Pointset_Powerset.cc
new file mode 100644
index 0000000..1a33b05
--- /dev/null
+++ b/src/Pointset_Powerset.cc
@@ -0,0 +1,344 @@
+/* Pointset_Powerset class implementation: non-inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Pointset_Powerset_defs.hh"
+#include "Grid_defs.hh"
+#include <utility>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ using std::swap;
+ // Ensure omega-reduction.
+ x.omega_reduce();
+ y.omega_reduce();
+ Sequence new_sequence = x.sequence;
+ for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+ const NNC_Polyhedron& ph_yi = yi->pointset();
+ Sequence tmp_sequence;
+ for (Sequence_const_iterator itr = new_sequence.begin(),
+ ns_end = new_sequence.end(); itr != ns_end; ++itr) {
+ const std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(ph_yi, itr->pointset());
+ const Pointset_Powerset<NNC_Polyhedron>& residues = partition.second;
+ // Append the contents of `residues' to `tmp_sequence'.
+ std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+ }
+ swap(tmp_sequence, new_sequence);
+ }
+ swap(x.sequence, new_sequence);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+ if (!check_containment(yi->pointset(), x))
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const NNC_Polyhedron& ph,
+ const Pointset_Powerset<NNC_Polyhedron>& ps) {
+ if (ph.is_empty())
+ return true;
+ Pointset_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
+ tmp.add_disjunct(ph);
+ for (Pointset_Powerset<NNC_Polyhedron>::const_iterator
+ i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+ const NNC_Polyhedron& pi = i->pointset();
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const NNC_Polyhedron& pj = j->pointset();
+ if (pi.contains(pj))
+ j = tmp.drop_disjunct(j);
+ else
+ ++j;
+ }
+ if (tmp.empty())
+ return true;
+ else {
+ Pointset_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
+ EMPTY);
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const NNC_Polyhedron& pj = j->pointset();
+ if (pj.is_disjoint_from(pi))
+ ++j;
+ else {
+ const std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(pi, pj);
+ new_disjuncts.upper_bound_assign(partition.second);
+ j = tmp.drop_disjunct(j);
+ }
+ }
+ tmp.upper_bound_assign(new_disjuncts);
+ }
+ }
+ return false;
+}
+
+
+namespace {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Uses the congruence \p c to approximately partition the grid \p gr.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+ On exit, the intersection of \p gr and congruence \p c is stored
+ in \p gr, whereas a finite set of grids whose set-theoretic union
+ contains the intersection of \p gr with the negation of \p c
+ is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+approximate_partition_aux(const PPL::Congruence& c,
+ PPL::Grid& gr,
+ PPL::Pointset_Powerset<PPL::Grid>& r) {
+ using namespace PPL;
+ const Coefficient& c_modulus = c.modulus();
+ const Grid gr_copy(gr);
+ gr.add_congruence(c);
+ if (gr.is_empty()) {
+ r.add_disjunct(gr_copy);
+ return true;
+ }
+
+ const Congruence_System cgs = gr.congruences();
+ const Congruence_System cgs_copy = gr_copy.congruences();
+ // When c is an equality, not satisfied by Grid gr
+ // then add gr to the set r. There is no finite
+ // partition in this case.
+ if (c_modulus == 0) {
+ if (cgs.num_equalities() != cgs_copy.num_equalities()) {
+ r.add_disjunct(gr_copy);
+ return false;
+ }
+ return true;
+ }
+
+ // When c is a proper congruence but, in gr, this direction has
+ // no congruence, then add gr to the set r. There is no finite
+ // partition in this case.
+ if (cgs.num_proper_congruences() != cgs_copy.num_proper_congruences()) {
+ r.add_disjunct(gr_copy);
+ return false;
+ }
+
+ // When c is a proper congruence and gr also is discrete
+ // in this direction, then there is a finite partition and that
+ // is added to r.
+ const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+ Linear_Expression le(c.expression());
+ le -= c_inhomogeneous_term;
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ rem_assign(n, c_inhomogeneous_term, c_modulus);
+ if (n < 0)
+ n += c_modulus;
+ PPL_DIRTY_TEMP_COEFFICIENT(i);
+ for (i = c_modulus; i-- > 0; )
+ if (i != n) {
+ Grid gr_tmp(gr_copy);
+ gr_tmp.add_congruence((le+i %= 0) / c_modulus);
+ if (!gr_tmp.is_empty())
+ r.add_disjunct(gr_tmp);
+ }
+ return true;
+}
+
+} // namespace
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+std::pair<PPL::Grid, PPL::Pointset_Powerset<PPL::Grid> >
+PPL::approximate_partition(const Grid& p, const Grid& q,
+ bool& finite_partition) {
+ using namespace PPL;
+ finite_partition = true;
+ Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+ // Ensure that the congruence system of q is minimized
+ // before copying and calling approximate_partition_aux().
+ (void) q.minimized_congruences();
+ Grid gr = q;
+ const Congruence_System& p_congruences = p.congruences();
+ for (Congruence_System::const_iterator i = p_congruences.begin(),
+ p_congruences_end = p_congruences.end(); i != p_congruences_end; ++i)
+ if (!approximate_partition_aux(*i, gr, r)) {
+ finite_partition = false;
+ const Pointset_Powerset<Grid> s(q);
+ return std::make_pair(gr, s);
+ }
+ return std::make_pair(gr, r);
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const Grid& ph,
+ const Pointset_Powerset<Grid>& ps) {
+ if (ph.is_empty())
+ return true;
+ Pointset_Powerset<Grid> tmp(ph.space_dimension(), EMPTY);
+ tmp.add_disjunct(ph);
+ for (Pointset_Powerset<Grid>::const_iterator
+ i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+ const Grid& pi = i->pointset();
+ for (Pointset_Powerset<Grid>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const Grid& pj = j->pointset();
+ if (pi.contains(pj))
+ j = tmp.drop_disjunct(j);
+ else
+ ++j;
+ }
+ if (tmp.empty())
+ return true;
+ else {
+ Pointset_Powerset<Grid> new_disjuncts(ph.space_dimension(),
+ EMPTY);
+ for (Pointset_Powerset<Grid>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const Grid& pj = j->pointset();
+ if (pj.is_disjoint_from(pi))
+ ++j;
+ else {
+ bool finite_partition;
+ const std::pair<Grid, Pointset_Powerset<Grid> >
+ partition = approximate_partition(pi, pj, finite_partition);
+
+ // If there is a finite partition, then we add the new
+ // disjuncts to the temporary set of disjuncts and drop pj.
+ // If there is no finite partition, then by the
+ // specification of approximate_partition(), we can
+ // ignore checking the remaining temporary disjuncts as they
+ // will all have the same lines and equalities and therefore
+ // also not have a finite partition with respect to pi.
+ if (!finite_partition)
+ break;
+ new_disjuncts.upper_bound_assign(partition.second);
+ j = tmp.drop_disjunct(j);
+ }
+ }
+ tmp.upper_bound_assign(new_disjuncts);
+ }
+ }
+ return false;
+}
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::Grid>
+::difference_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ using std::swap;
+ // Ensure omega-reduction.
+ x.omega_reduce();
+ y.omega_reduce();
+ Sequence new_sequence = x.sequence;
+ for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+ const Grid& gr_yi = yi->pointset();
+ Sequence tmp_sequence;
+ for (Sequence_const_iterator itr = new_sequence.begin(),
+ ns_end = new_sequence.end(); itr != ns_end; ++itr) {
+ bool finite_partition;
+ const std::pair<Grid, Pointset_Powerset<Grid> > partition
+ = approximate_partition(gr_yi, itr->pointset(), finite_partition);
+ const Pointset_Powerset<Grid>& residues = partition.second;
+ // Append the contents of `residues' to `tmp_sequence'.
+ std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+ }
+ swap(tmp_sequence, new_sequence);
+ }
+ swap(x.sequence, new_sequence);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::Grid>
+::geometrically_covers(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+ if (!check_containment(yi->pointset(), x))
+ return false;
+ return true;
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+ Complexity_Class)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<NNC_Polyhedron>
+ (NNC_Polyhedron(i->pointset())));
+ x.reduced = y.reduced;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+ Complexity_Class)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (Pointset_Powerset<Grid>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<NNC_Polyhedron>
+ (NNC_Polyhedron(i->pointset())));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+ Complexity_Class)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<C_Polyhedron>
+ (C_Polyhedron(i->pointset())));
+
+ // Note: this might be non-reduced even when `y' is known to be
+ // omega-reduced, because the constructor of C_Polyhedron, by
+ // enforcing topological closure, may have made different elements
+ // comparable.
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
diff --git a/src/Pointset_Powerset_defs.hh b/src/Pointset_Powerset_defs.hh
new file mode 100644
index 0000000..7d33bf8
--- /dev/null
+++ b/src/Pointset_Powerset_defs.hh
@@ -0,0 +1,1449 @@
+/* Pointset_Powerset class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_defs_hh
+#define PPL_Pointset_Powerset_defs_hh
+
+#include "Pointset_Powerset_types.hh"
+#include "globals_defs.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_types.hh"
+#include "Congruence_System_types.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Partially_Reduced_Product_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Determinate_defs.hh"
+#include "Powerset_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL pointset domains.
+/*! \ingroup PPL_CXX_interface
+ \warning
+ At present, the supported instantiations for the
+ disjunct domain template \p PSET are the simple pointset domains:
+ <CODE>C_Polyhedron</CODE>,
+ <CODE>NNC_Polyhedron</CODE>,
+ <CODE>Grid</CODE>,
+ <CODE>Octagonal_Shape\<T\></CODE>,
+ <CODE>BD_Shape\<T\></CODE>,
+ <CODE>Box\<T\></CODE>.
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Pointset_Powerset
+ : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PSET> > {
+public:
+ typedef PSET element_type;
+
+private:
+ typedef Determinate<PSET> Det_PSET;
+ typedef Powerset<Det_PSET> Base;
+
+public:
+ //! Returns the maximum space dimension a Pointset_Powerset<PSET> can handle.
+ static dimension_type max_space_dimension();
+
+ //! \name Constructors
+ //@{
+
+ //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the powerset;
+
+ \param kind
+ Specifies whether the universe or the empty powerset has to be built.
+ */
+ explicit
+ Pointset_Powerset(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Pointset_Powerset(const Pointset_Powerset& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+ in the source powerset is different from <CODE>PSET</CODE>.
+
+ \param y
+ The powerset to be used to build the new powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+ */
+ template <typename QH>
+ explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Creates a Pointset_Powerset from a product
+ This will be created as a single disjunct of type PSET that
+ approximates the product.
+ */
+ template <typename QH1, typename QH2, typename R>
+ explicit
+ Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Creates a Pointset_Powerset with a single disjunct approximating
+ the system of constraints \p cs.
+ */
+ explicit Pointset_Powerset(const Constraint_System& cs);
+
+ /*! \brief
+ Creates a Pointset_Powerset with a single disjunct approximating
+ the system of congruences \p cgs.
+ */
+ explicit Pointset_Powerset(const Congruence_System& cgs);
+
+
+ //! Builds a pointset_powerset out of a closed polyhedron.
+ /*!
+ Builds a powerset that is either empty (if the polyhedron is found
+ to be empty) or contains a single disjunct approximating the
+ polyhedron; this must only use algorithms that do not exceed the
+ specified complexity. The powerset inherits the space dimension
+ of the polyhedron.
+
+ \param ph
+ The closed polyhedron to be used to build the powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const C_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of an nnc polyhedron.
+ /*!
+ Builds a powerset that is either empty (if the polyhedron is found
+ to be empty) or contains a single disjunct approximating the
+ polyhedron; this must only use algorithms that do not exceed the
+ specified complexity. The powerset inherits the space dimension
+ of the polyhedron.
+
+ \param ph
+ The closed polyhedron to be used to build the powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+
+ //! Builds a pointset_powerset out of a grid.
+ /*!
+ If the grid is nonempty, builds a powerset containing a single
+ disjunct approximating the grid. Builds the empty powerset
+ otherwise. The powerset inherits the space dimension of the grid.
+
+ \param gr
+ The grid to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p gr exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const Grid& gr,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of an octagonal shape.
+ /*!
+ If the octagonal shape is nonempty, builds a powerset
+ containing a single disjunct approximating the octagonal
+ shape. Builds the empty powerset otherwise. The powerset
+ inherits the space dimension of the octagonal shape.
+
+ \param os
+ The octagonal shape to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename T>
+ explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of a bd shape.
+ /*!
+ If the bd shape is nonempty, builds a powerset containing a
+ single disjunct approximating the bd shape. Builds the empty
+ powerset otherwise. The powerset inherits the space dimension
+ of the bd shape.
+
+ \param bds
+ The bd shape to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bds exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename T>
+ explicit Pointset_Powerset(const BD_Shape<T>& bds,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of a box.
+ /*!
+ If the box is nonempty, builds a powerset containing a single
+ disjunct approximating the box. Builds the empty powerset
+ otherwise. The powerset inherits the space dimension of the box.
+
+ \param box
+ The box to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Pointset_Powerset(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Pointset_Powerset
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type affine_dimension() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is
+ an empty powerset.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is the top element of the powerset lattice.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the disjuncts
+ in \p *this are topologically closed.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all elements in \p *this
+ are bounded.
+ */
+ bool is_bounded() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Pointset_Powerset& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+
+ \note
+ A variable is constrained if there exists a non-redundant disjunct
+ that is constraining the variable: this definition relies on the
+ powerset lattice structure and may be somewhat different from the
+ geometric intuition.
+ For instance, variable \f$x\f$ is constrained in the powerset
+ \f[
+ \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+ \f]
+ even though \f$\mathit{ps}\f$ is geometrically equal to the
+ whole vector space.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this geometrically
+ covers \p y, i.e., if any point (in some element) of \p y is also
+ a point (of some element) of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_covers(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is geometrically
+ equal to \p y, i.e., if (the elements of) \p *this and \p y
+ contain the same set of points.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_equals(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each disjunct
+ of \p y is contained in a disjunct of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool contains(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each disjunct
+ of \p y is strictly contained in a disjunct of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool strictly_contains(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the congruence \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Pointset_Powerset
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
+ //@{
+
+ //! Adds to \p *this the disjunct \p ph.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p ph are dimension-incompatible.
+ */
+ void add_disjunct(const PSET& ph);
+
+ //! Intersects \p *this with constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Intersects \p *this with the constraints in \p cs.
+ /*!
+ \param cs
+ The constraints to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ //! Intersects \p *this with congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Intersects \p *this with the congruences in \p cgs.
+ /*!
+ \param cgs
+ The congruences to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ The result is obtained by intersecting each disjunct in \p *this
+ with each disjunct in \p y and collecting all these intersections.
+ */
+ void intersection_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this an (a smallest)
+ over-approximation as a powerset of the disjunct domain of the
+ set-theoretical difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ The result is obtained by computing the pairwise
+ \ref Time_Elapse_Operator "time elapse" of each disjunct
+ in \p *this with each disjunct in \p y.
+ */
+ void time_elapse_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Assign to \p *this the result of (recursively) merging together
+ the pairs of disjuncts whose upper-bound is the same as their
+ set-theoretical union.
+
+ On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+ in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+ */
+ void pairwise_reduce();
+
+ /*! \brief
+ Assigns to \p *this the result of applying the
+ \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+ to \p *this and \p y, using the widening function \p widen_fun
+ and the cardinality threshold \p max_disjuncts.
+
+ \param y
+ A powerset that <EM>must</EM> definitely entail \p *this;
+
+ \param widen_fun
+ The widening function to be used on polyhedra objects. It is obtained
+ from the corresponding widening method by using the helper function
+ Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+ <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+ <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+ \param max_disjuncts
+ The maximum number of disjuncts occurring in the powerset \p *this
+ <EM>before</EM> starting the computation. If this number is exceeded,
+ some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ For a description of the extrapolation operator,
+ see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+ */
+ template <typename Widening>
+ void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+ Widening widen_fun,
+ unsigned max_disjuncts);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref pps_certificate_widening "BHZ03-widening"
+ between \p *this and \p y, using the widening function \p widen_fun
+ certified by the convergence certificate \p Cert.
+
+ \param y
+ The finite powerset computed in the previous iteration step.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param widen_fun
+ The widening function to be used on disjuncts.
+ It is obtained from the corresponding widening method by using
+ the helper function widen_fun_ref. Legal values are, e.g.,
+ <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+ <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ In order to obtain a proper widening operator, the template parameter
+ \p Cert should be a finite convergence certificate for the base-level
+ widening function \p widen_fun; otherwise, an extrapolation operator is
+ obtained.
+ For a description of the methods that should be provided
+ by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+ */
+ template <typename Cert, typename Widening>
+ void BHZ03_widening_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ Pointset_Powerset& operator=(const Pointset_Powerset& y);
+
+ /*! \brief
+ Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+ in the source powerset is different from <CODE>PSET</CODE>
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ template <typename QH>
+ Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Pointset_Powerset& y);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ and embeds each disjunct in \p *this in the new space.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ without embedding the disjuncts in \p *this in the new space.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ //! Assigns to \p *this the concatenation of \p *this and \p y.
+ /*!
+ The result is obtained by computing the pairwise
+ \ref Concatenating_Polyhedra "concatenation" of each disjunct
+ in \p *this with each disjunct in \p y.
+ */
+ void concatenate_assign(const Pointset_Powerset& y);
+
+ //! Removes all the specified space dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher space dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a partial function.
+
+ See also Polyhedron::map_space_dimensions.
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+ "folded" into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::value_type value_type;
+ typedef typename Base::iterator iterator;
+ typedef typename Base::const_iterator const_iterator;
+ typedef typename Base::reverse_iterator reverse_iterator;
+ typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ typedef typename Base::Sequence Sequence;
+ typedef typename Base::Sequence_iterator Sequence_iterator;
+ typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ /*! \brief
+ Assigns to \p dest a \ref Powerset_Meet_Preserving_Simplification
+ "powerset meet-preserving enlargement" of itself with respect to
+ \p *this. If \c false is returned, then the intersection is empty.
+
+ \note
+ It is assumed that \p *this and \p dest are topology-compatible
+ and dimension-compatible.
+ */
+ bool intersection_preserving_enlarge_element(PSET& dest) const;
+
+ /*! \brief
+ Assigns to \p *this the result of applying the BGP99 heuristics
+ to \p *this and \p y, using the widening function \p widen_fun.
+ */
+ template <typename Widening>
+ void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+ //! Records in \p cert_ms the certificates for this set of disjuncts.
+ template <typename Cert>
+ void collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the current set of disjuncts
+ is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+ */
+ template <typename Cert>
+ bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+ typename Cert::Compare>&
+ y_cert_ms) const;
+
+ // FIXME: here it should be enough to befriend the template constructor
+ // template <typename QH>
+ // Pointset_Powerset(const Pointset_Powerset<QH>&),
+ // but, apparently, this cannot be done.
+ friend class Pointset_Powerset<NNC_Polyhedron>;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+void swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y);
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+ Let \p p and \p q be two polyhedra.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PSET, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+ such that
+ - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+ - <CODE>r.second</CODE> has the property that all its elements are
+ pairwise disjoint and disjoint from \p p;
+ - the set-theoretical union of <CODE>r.first</CODE> with all the
+ elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+ is the representation of a partition of \p q).
+
+ \if Include_Implementation_Details
+
+ See
+ <A HREF="http://bugseng.com/products/ppl/Documentation/bibliography#Srivastava93">
+ this paper</A> for more information about the implementation.
+ \endif
+*/
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+ \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+ const Pointset_Powerset<NNC_Polyhedron>& ps);
+
+
+/*! \brief
+ Partitions the grid \p q with respect to grid \p p if and only if
+ such a partition is finite.
+
+ \relates Parma_Polyhedra_Library::Pointset_Powerset
+ Let \p p and \p q be two grids.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PSET, Pointset_Powerset\<Grid\> \></CODE>
+ such that
+ - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+ - If there is a finite partition of \p q with respect to \p p
+ the Boolean <CODE>finite_partition</CODE> is set to true and
+ <CODE>r.second</CODE> has the property that all its elements are
+ pairwise disjoint and disjoint from \p p and the set-theoretical
+ union of <CODE>r.first</CODE> with all the elements of
+ <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+ is the representation of a partition of \p q).
+ - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+ and the singleton set that contains \p q is stored in
+ <CODE>r.second</CODE>r.
+*/
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the grids \p ps contains the grid \p g.
+
+ \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+ const Pointset_Powerset<Grid>& ps);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the objects in \p ps contains \p ph.
+
+ \relates Pointset_Powerset
+ \note
+ It is assumed that the template parameter PSET can be converted
+ without precision loss into an NNC_Polyhedron; otherwise,
+ an incorrect result might be obtained.
+*/
+template <typename PSET>
+bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+ Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+ Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+ Complexity_Class);
+
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+void
+Pointset_Powerset<Grid>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Pointset_Powerset_inlines.hh"
+#include "Pointset_Powerset_templates.hh"
+
+#endif // !defined(PPL_Pointset_Powerset_defs_hh)
diff --git a/src/Pointset_Powerset_inlines.hh b/src/Pointset_Powerset_inlines.hh
new file mode 100644
index 0000000..a09a265
--- /dev/null
+++ b/src/Pointset_Powerset_inlines.hh
@@ -0,0 +1,320 @@
+/* Pointset_Powerset class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_inlines_hh
+#define PPL_Pointset_Powerset_inlines_hh 1
+
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::max_space_dimension() {
+ return PSET::max_space_dimension();
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Base(), space_dim(num_dimensions) {
+ Pointset_Powerset& x = *this;
+ if (kind == UNIVERSE)
+ x.sequence.push_back(Determinate<PSET>(PSET(num_dimensions, kind)));
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Pointset_Powerset& y,
+ Complexity_Class)
+ : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const C_Polyhedron& ph,
+ Complexity_Class complexity)
+ : Base(), space_dim(ph.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (ph.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const NNC_Polyhedron& ph,
+ Complexity_Class complexity)
+ : Base(), space_dim(ph.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (ph.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Grid& gr,
+ Complexity_Class)
+ : Base(), space_dim(gr.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!gr.is_empty()) {
+ x.sequence.push_back(Determinate<PSET>(PSET(gr)));
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+ Complexity_Class complexity)
+ : Base(), space_dim(prp.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (prp.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(prp, complexity)));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename Interval>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Box<Interval>& box,
+ Complexity_Class)
+ : Base(), space_dim(box.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!box.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(box)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+ Complexity_Class)
+ : Base(), space_dim(os.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!os.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(os)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const BD_Shape<T>& bds,
+ Complexity_Class)
+ : Base(), space_dim(bds.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!bds.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(bds)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Constraint_System& cs)
+ : Base(Determinate<PSET>(cs)), space_dim(cs.space_dimension()) {
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Congruence_System& cgs)
+ : Base(Determinate<PSET>(cgs)), space_dim(cgs.space_dimension()) {
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.Base::operator=(y);
+ x.space_dim = y.space_dim;
+ return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::m_swap(Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.Base::m_swap(y);
+ using std::swap;
+ swap(x.space_dim, y.space_dim);
+}
+
+template <typename PSET>
+template <typename QH>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset<QH>& y) {
+ Pointset_Powerset& x = *this;
+ Pointset_Powerset<PSET> ps(y);
+ swap(x, ps);
+ return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::intersection_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y,
+ Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::intersection_assign)));
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::time_elapse_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y,
+ Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::time_elapse_assign)));
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_covers(const Pointset_Powerset& y) const {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+ const Pointset_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy);
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+ const Pointset_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::external_memory_in_bytes() const {
+ return Base::external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline int32_t
+Pointset_Powerset<PSET>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>
+::difference_assign(const Pointset_Powerset& y) {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+ Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+ nnc_this.difference_assign(nnc_y);
+ *this = nnc_this;
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps) {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const NNC_Polyhedron ph_nnc = NNC_Polyhedron(ph.constraints());
+ const Pointset_Powerset<NNC_Polyhedron> ps_nnc(ps);
+ return check_containment(ph_nnc, ps_nnc);
+}
+
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+ const Pointset_Powerset<C_Polyhedron>& ps) {
+ return check_containment(NNC_Polyhedron(ph),
+ Pointset_Powerset<NNC_Polyhedron>(ps));
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline void
+swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_inlines_hh)
diff --git a/src/Pointset_Powerset_templates.hh b/src/Pointset_Powerset_templates.hh
new file mode 100644
index 0000000..12b5f12
--- /dev/null
+++ b/src/Pointset_Powerset_templates.hh
@@ -0,0 +1,1610 @@
+/* Pointset_Powerset class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_templates_hh
+#define PPL_Pointset_Powerset_templates_hh 1
+
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Variables_Set_defs.hh"
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_disjunct(const PSET& ph) {
+ Pointset_Powerset& x = *this;
+ if (x.space_dimension() != ph.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::Pointset_Powerset<PSET>::add_disjunct(ph):\n"
+ << "this->space_dimension() == " << x.space_dimension() << ", "
+ << "ph.space_dimension() == " << ph.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+ x.sequence.push_back(Determinate<PSET>(ph));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<NNC_Polyhedron>
+ (NNC_Polyhedron(i->pointset(), complexity)));
+
+ // FIXME: If the domain elements can be represented _exactly_ as NNC
+ // polyhedra, then having x.reduced = y.reduced is correct. This is
+ // the case if the domains are both linear and convex which holds
+ // for all the currently supported instantiations except for
+ // Grids; for this reason the Grid specialization has a
+ // separate implementation. For any non-linear or non-convex
+ // domains (e.g., a domain of Intervals with restrictions or a
+ // domain of circles) that may be supported in the future, the
+ // assignment x.reduced = y.reduced will be a bug.
+ x.reduced = y.reduced;
+
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename QH>
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<PSET>(PSET(i->pointset(), complexity)));
+ // Note: this might be non-reduced even when `y' is known to be
+ // omega-reduced, because the constructor of PSET may have made
+ // different QH elements to become comparable.
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::concatenate_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ x.omega_reduce();
+ y.omega_reduce();
+ Pointset_Powerset<PSET> new_x(x.space_dim + y.space_dim, EMPTY);
+ for (const_iterator xi = x.begin(), x_end = x.end(),
+ y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+ for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+ Det_PSET zi = *xi;
+ zi.concatenate_assign(*yi);
+ PPL_ASSERT_HEAVY(!zi.is_bottom());
+ new_x.sequence.push_back(zi);
+ }
+ ++xi;
+ if ((abandon_expensive_computations != 0)
+ && (xi != x_end) && (y_begin != y_end)) {
+ // Hurry up!
+ PSET x_ph = xi->pointset();
+ for (++xi; xi != x_end; ++xi)
+ x_ph.upper_bound_assign(xi->pointset());
+ const_iterator yi = y_begin;
+ PSET y_ph = yi->pointset();
+ for (++yi; yi != y_end; ++yi)
+ y_ph.upper_bound_assign(yi->pointset());
+ x_ph.concatenate_assign(y_ph);
+ swap(x, new_x);
+ x.add_disjunct(x_ph);
+ PPL_ASSERT_HEAVY(x.OK());
+ return;
+ }
+ }
+ swap(x, new_x);
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraint(const Constraint& c) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_constraint(c);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraint(const Constraint& c) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_constraint(c);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraints(const Constraint_System& cs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_constraints(cs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraints(const Constraint_System& cs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_constraints(cs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruence(const Congruence& cg) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_congruence(cg);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruence(const Congruence& cg) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_congruence(cg);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruences(const Congruence_System& cgs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_congruences(cgs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruences(const Congruence_System& cgs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_congruences(cgs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variable var) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().unconstrain(var);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variables_Set& vars) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().unconstrain(vars);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_embed(dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_space_dimensions_and_embed(m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_project(dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_space_dimensions_and_project(m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::remove_space_dimensions(const Variables_Set& vars) {
+ Pointset_Powerset& x = *this;
+ Variables_Set::size_type num_removed = vars.size();
+ if (num_removed > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().remove_space_dimensions(vars);
+ x.reduced = false;
+ }
+ x.space_dim -= num_removed;
+ PPL_ASSERT_HEAVY(x.OK());
+ }
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+ Pointset_Powerset& x = *this;
+ if (new_dimension < x.space_dim) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().remove_higher_space_dimensions(new_dimension);
+ x.reduced = false;
+ }
+ x.space_dim = new_dimension;
+ PPL_ASSERT_HEAVY(x.OK());
+ }
+}
+
+template <typename PSET>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PSET>::map_space_dimensions(const Partial_Function& pfunc) {
+ Pointset_Powerset& x = *this;
+ if (x.is_bottom()) {
+ dimension_type n = 0;
+ for (dimension_type i = x.space_dim; i-- > 0; ) {
+ dimension_type new_i;
+ if (pfunc.maps(i, new_i))
+ ++n;
+ }
+ x.space_dim = n;
+ }
+ else {
+ Sequence_iterator s_begin = x.sequence.begin();
+ for (Sequence_iterator si = s_begin,
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().map_space_dimensions(pfunc);
+ x.space_dim = s_begin->pointset().space_dimension();
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::expand_space_dimension(Variable var,
+ dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().expand_space_dimension(var, m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ Pointset_Powerset& x = *this;
+ Variables_Set::size_type num_folded = vars.size();
+ if (num_folded > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().fold_space_dimensions(vars, dest);
+ }
+ x.space_dim -= num_folded;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().affine_image(var, expr, denominator);
+ // Note that the underlying domain can apply conservative approximation:
+ // that is why it would not be correct to make the loss of reduction
+ // conditional on `var' and `expr'.
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().affine_preimage(var, expr, denominator);
+ // Note that the underlying domain can apply conservative approximation:
+ // that is why it would not be correct to make the loss of reduction
+ // conditional on `var' and `expr'.
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_image(lhs, relsym, rhs);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_preimage(lhs, relsym, rhs);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_image(var, relsym, expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_preimage(var, relsym, expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().bounded_affine_preimage(var, lb_expr, ub_expr,
+ denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+dimension_type
+Pointset_Powerset<PSET>::affine_dimension() const {
+ // The affine dimension of the powerset is the affine dimension of
+ // the smallest vector space in which it can be embedded.
+ const Pointset_Powerset& x = *this;
+ C_Polyhedron x_ph(space_dim, EMPTY);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ PSET pi(si->pointset());
+ if (!pi.is_empty()) {
+ C_Polyhedron phi(space_dim);
+ const Constraint_System& cs = pi.minimized_constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ phi.add_constraint(c);
+ }
+ x_ph.poly_hull_assign(phi);
+ }
+ }
+
+ return x_ph.affine_dimension();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_universe() const {
+ const Pointset_Powerset& x = *this;
+ // Exploit omega-reduction, if already computed.
+ if (x.is_omega_reduced())
+ return x.size() == 1 && x.begin()->pointset().is_universe();
+
+ // A powerset is universe iff one of its disjuncts is.
+ for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+ if (x_i->pointset().is_universe()) {
+ // Speculative omega-reduction, if it is worth.
+ if (x.size() > 1) {
+ Pointset_Powerset<PSET> universe(x.space_dimension(), UNIVERSE);
+ Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+ swap(xx, universe);
+ }
+ return true;
+ }
+ return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_empty() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_empty())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_discrete() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_discrete())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_topologically_closed() const {
+ const Pointset_Powerset& x = *this;
+ // The powerset must be omega-reduced before checking
+ // topological closure.
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_topologically_closed())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_bounded() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_bounded())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::constrains(Variable var) const {
+ const Pointset_Powerset& x = *this;
+ // `var' should be one of the dimensions of the powerset.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (x.space_dimension() < var_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Pointset_Powerset<PSET>::constrains(v):\n"
+ << "this->space_dimension() == " << x.space_dimension() << ", "
+ << "v.space_dimension() == " << var_space_dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // omega_reduction needed, since a redundant disjunct may constrain var.
+ x.omega_reduce();
+ // An empty powerset constrains all variables.
+ if (x.is_empty())
+ return true;
+ for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+ if (x_i->pointset().constrains(var))
+ return true;
+ return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_disjoint_from(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ x_s_end = x.sequence.end(); si != x_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ for (Sequence_const_iterator sj = y.sequence.begin(),
+ y_s_end = y.sequence.end(); sj != y_s_end; ++sj) {
+ const PSET& pj = sj->pointset();
+ if (!pi.is_disjoint_from(pj))
+ return false;
+ }
+ }
+ return true;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().drop_some_non_integer_points(vars, complexity);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().drop_some_non_integer_points(complexity);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::topological_closure_assign() {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().topological_closure_assign();
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::intersection_preserving_enlarge_element(PSET& dest) const {
+ // FIXME: this is just an executable specification.
+ const Pointset_Powerset& context = *this;
+ PPL_ASSERT(context.space_dimension() == dest.space_dimension());
+ bool nonempty_intersection = false;
+ // TODO: maybe use a *sorted* constraint system?
+ PSET enlarged(context.space_dimension(), UNIVERSE);
+ for (Sequence_const_iterator si = context.sequence.begin(),
+ s_end = context.sequence.end(); si != s_end; ++si) {
+ PSET context_i(si->pointset());
+ context_i.intersection_assign(enlarged);
+ PSET enlarged_i(dest);
+ if (enlarged_i.simplify_using_context_assign(context_i))
+ nonempty_intersection = true;
+ // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+ enlarged.intersection_assign(enlarged_i);
+ }
+ swap(dest, enlarged);
+ return nonempty_intersection;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+
+ // Omega reduction is required.
+ // TODO: check whether it would be more efficient to Omega-reduce x
+ // during the simplification process: when examining *si, we check
+ // if it has been made redundant by any of the elements preceding it
+ // (which have been already simplified).
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+ y.omega_reduce();
+ if (y.is_empty()) {
+ x = y;
+ return false;
+ }
+
+ if (y.size() == 1) {
+ // More efficient, special handling of the singleton context case.
+ const PSET& y_i = y.sequence.begin()->pointset();
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ) {
+ PSET& x_i = si->pointset();
+ if (x_i.simplify_using_context_assign(y_i))
+ ++si;
+ else
+ // Intersection is empty: drop the disjunct.
+ si = x.sequence.erase(si);
+ }
+ }
+ else {
+ // The context is not a singleton.
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ) {
+ if (y.intersection_preserving_enlarge_element(si->pointset()))
+ ++si;
+ else
+ // Intersection with `*si' is empty: drop the disjunct.
+ si = x.sequence.erase(si);
+ }
+ }
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+ return !x.sequence.empty();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = y.sequence.begin(),
+ y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ bool pi_is_contained = false;
+ for (Sequence_const_iterator sj = x.sequence.begin(),
+ x_s_end = x.sequence.end();
+ (sj != x_s_end && !pi_is_contained);
+ ++sj) {
+ const PSET& pj = sj->pointset();
+ if (pj.contains(pi))
+ pi_is_contained = true;
+ }
+ if (!pi_is_contained)
+ return false;
+ }
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::strictly_contains(const Pointset_Powerset& y) const {
+ /* omega reduction ensures that a disjunct of y cannot be strictly
+ contained in one disjunct and also contained but not strictly
+ contained in another disjunct of *this */
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = y.sequence.begin(),
+ y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ bool pi_is_strictly_contained = false;
+ for (Sequence_const_iterator sj = x.sequence.begin(),
+ x_s_end = x.sequence.end();
+ (sj != x_s_end && !pi_is_strictly_contained); ++sj) {
+ const PSET& pj = sj->pointset();
+ if (pj.strictly_contains(pi))
+ pi_is_strictly_contained = true;
+ }
+ if (!pi_is_strictly_contained)
+ return false;
+ }
+ return true;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
+ const Pointset_Powerset& x = *this;
+
+ /* *this is included in cg if every disjunct is included in cg */
+ bool is_included = true;
+ /* *this is disjoint with cg if every disjunct is disjoint with cg */
+ bool is_disjoint = true;
+ /* *this strictly_intersects with cg if some disjunct strictly
+ intersects with cg */
+ bool is_strictly_intersecting = false;
+ /* *this saturates cg if some disjunct saturates cg and
+ every disjunct is either disjoint from cg or saturates cg */
+ bool saturates_once = false;
+ bool may_saturate = true;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Con_Relation relation_i = si->pointset().relation_with(cg);
+ if (!relation_i.implies(Poly_Con_Relation::is_included()))
+ is_included = false;
+ if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ is_disjoint = false;
+ if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+ is_strictly_intersecting = true;
+ if (relation_i.implies(Poly_Con_Relation::saturates()))
+ saturates_once = true;
+ else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ may_saturate = false;
+ }
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+ if (is_included)
+ result = result && Poly_Con_Relation::is_included();
+ if (is_disjoint)
+ result = result && Poly_Con_Relation::is_disjoint();
+ if (is_strictly_intersecting)
+ result = result && Poly_Con_Relation::strictly_intersects();
+ if (saturates_once && may_saturate)
+ result = result && Poly_Con_Relation::saturates();
+
+ return result;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+ const Pointset_Powerset& x = *this;
+
+ /* *this is included in c if every disjunct is included in c */
+ bool is_included = true;
+ /* *this is disjoint with c if every disjunct is disjoint with c */
+ bool is_disjoint = true;
+ /* *this strictly_intersects with c if some disjunct strictly
+ intersects with c */
+ bool is_strictly_intersecting = false;
+ /* *this saturates c if some disjunct saturates c and
+ every disjunct is either disjoint from c or saturates c */
+ bool saturates_once = false;
+ bool may_saturate = true;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Con_Relation relation_i = si->pointset().relation_with(c);
+ if (!relation_i.implies(Poly_Con_Relation::is_included()))
+ is_included = false;
+ if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ is_disjoint = false;
+ if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+ is_strictly_intersecting = true;
+ if (relation_i.implies(Poly_Con_Relation::saturates()))
+ saturates_once = true;
+ else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ may_saturate = false;
+ }
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+ if (is_included)
+ result = result && Poly_Con_Relation::is_included();
+ if (is_disjoint)
+ result = result && Poly_Con_Relation::is_disjoint();
+ if (is_strictly_intersecting)
+ result = result && Poly_Con_Relation::strictly_intersects();
+ if (saturates_once && may_saturate)
+ result = result && Poly_Con_Relation::saturates();
+
+ return result;
+}
+
+template <typename PSET>
+Poly_Gen_Relation
+Pointset_Powerset<PSET>::relation_with(const Generator& g) const {
+ const Pointset_Powerset& x = *this;
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Gen_Relation relation_i = si->pointset().relation_with(g);
+ if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+ return Poly_Gen_Relation::subsumes();
+ }
+
+ return Poly_Gen_Relation::nothing();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_above(const Linear_Expression& expr) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().bounds_from_above(expr))
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_below(const Linear_Expression& expr) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().bounds_from_below(expr))
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+ best_sup_n = 0;
+ best_sup_d = 1;
+ bool best_max = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+ iter_sup_n = 0;
+ iter_sup_d = 1;
+ bool iter_max = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().maximize(expr, iter_sup_n, iter_sup_d, iter_max))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ }
+ else {
+ tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+ if (tmp < 0) {
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ }
+ else if (tmp == 0)
+ best_max = (best_max || iter_max);
+ }
+ }
+ sup_n = best_sup_n;
+ sup_d = best_sup_d;
+ maximum = best_max;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+ best_sup_n = 0;
+ best_sup_d = 1;
+ bool best_max = false;
+ Generator best_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+ iter_sup_n = 0;
+ iter_sup_d = 1;
+ bool iter_max = false;
+ Generator iter_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().maximize(expr,
+ iter_sup_n, iter_sup_d, iter_max, iter_g))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ best_g = iter_g;
+ }
+ else {
+ tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+ if (tmp < 0) {
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ best_g = iter_g;
+ }
+ else if (tmp == 0) {
+ best_max = (best_max || iter_max);
+ best_g = iter_g;
+ }
+ }
+ }
+ sup_n = best_sup_n;
+ sup_d = best_sup_d;
+ maximum = best_max;
+ g = best_g;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+ best_inf_n = 0;
+ best_inf_d = 1;
+ bool best_min = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+ iter_inf_n = 0;
+ iter_inf_d = 1;
+ bool iter_min = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().minimize(expr, iter_inf_n, iter_inf_d, iter_min))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ }
+ else {
+ tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+ if (tmp > 0) {
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ }
+ else if (tmp == 0)
+ best_min = (best_min || iter_min);
+ }
+ }
+ inf_n = best_inf_n;
+ inf_d = best_inf_d;
+ minimum = best_min;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+ best_inf_n = 0;
+ best_inf_d = 1;
+ bool best_min = false;
+ Generator best_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+ iter_inf_n = 0;
+ iter_inf_d = 1;
+ bool iter_min = false;
+ Generator iter_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().minimize(expr,
+ iter_inf_n, iter_inf_d, iter_min, iter_g))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ best_g = iter_g;
+ }
+ else {
+ tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+ if (tmp > 0) {
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ best_g = iter_g;
+ }
+ else if (tmp == 0) {
+ best_min = (best_min || iter_min);
+ best_g = iter_g;
+ }
+ }
+ }
+ inf_n = best_inf_n;
+ inf_d = best_inf_d;
+ minimum = best_min;
+ g = best_g;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains_integer_point() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (si->pointset().contains_integer_point())
+ return true;
+ return false;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().wrap_assign(vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::pairwise_reduce() {
+ Pointset_Powerset& x = *this;
+ // It is wise to omega-reduce before pairwise-reducing.
+ x.omega_reduce();
+
+ size_type n = x.size();
+ size_type deleted;
+ do {
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ std::deque<bool> marked(n, false);
+ deleted = 0;
+ Sequence_iterator s_begin = x.sequence.begin();
+ Sequence_iterator s_end = x.sequence.end();
+ unsigned si_index = 0;
+ for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+ if (marked[si_index])
+ continue;
+ PSET& pi = si->pointset();
+ Sequence_const_iterator sj = si;
+ unsigned sj_index = si_index;
+ for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+ if (marked[sj_index])
+ continue;
+ const PSET& pj = sj->pointset();
+ if (pi.upper_bound_assign_if_exact(pj)) {
+ marked[si_index] = true;
+ marked[sj_index] = true;
+ new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+ ++deleted;
+ goto next;
+ }
+ }
+ next:
+ ;
+ }
+ iterator new_x_begin = new_x.begin();
+ iterator new_x_end = new_x.end();
+ unsigned xi_index = 0;
+ for (const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+ if (!marked[xi_index])
+ new_x_begin
+ = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+ new_x_begin,
+ new_x_end);
+ using std::swap;
+ swap(x.sequence, new_x.sequence);
+ n -= deleted;
+ } while (deleted > 0);
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ size_type n = x.size();
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ std::deque<bool> marked(n, false);
+ const_iterator x_begin = x.begin();
+ const_iterator x_end = x.end();
+ unsigned i_index = 0;
+ for (const_iterator i = x_begin,
+ y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+ for (const_iterator j = y_begin; j != y_end; ++j) {
+ const PSET& pi = i->pointset();
+ const PSET& pj = j->pointset();
+ if (pi.contains(pj)) {
+ PSET pi_copy = pi;
+ widen_fun(pi_copy, pj);
+ new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+ marked[i_index] = true;
+ }
+ }
+ iterator new_x_begin = new_x.begin();
+ iterator new_x_end = new_x.end();
+ i_index = 0;
+ for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+ if (!marked[i_index])
+ new_x_begin
+ = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+ new_x_begin,
+ new_x_end);
+ using std::swap;
+ swap(x.sequence, new_x.sequence);
+ PPL_ASSERT_HEAVY(x.OK());
+ PPL_ASSERT(x.is_omega_reduced());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+ Widening widen_fun,
+ unsigned max_disjuncts) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ x.pairwise_reduce();
+ if (max_disjuncts != 0)
+ x.collapse(max_disjuncts);
+ x.BGP99_heuristics_assign(y, widen_fun);
+}
+
+template <typename PSET>
+template <typename Cert>
+void
+Pointset_Powerset<PSET>::
+collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const {
+ const Pointset_Powerset& x = *this;
+ PPL_ASSERT(x.is_omega_reduced());
+ PPL_ASSERT(cert_ms.size() == 0);
+ for (const_iterator i = x.begin(), end = x.end(); i != end; ++i) {
+ Cert ph_cert(i->pointset());
+ ++cert_ms[ph_cert];
+ }
+}
+
+template <typename PSET>
+template <typename Cert>
+bool
+Pointset_Powerset<PSET>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+ typename Cert::Compare>& y_cert_ms) const {
+ typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+ Cert_Multiset x_cert_ms;
+ collect_certificates(x_cert_ms);
+ typename Cert_Multiset::const_iterator xi = x_cert_ms.begin();
+ typename Cert_Multiset::const_iterator x_cert_ms_end = x_cert_ms.end();
+ typename Cert_Multiset::const_iterator yi = y_cert_ms.begin();
+ typename Cert_Multiset::const_iterator y_cert_ms_end = y_cert_ms.end();
+ while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+ const Cert& xi_cert = xi->first;
+ const Cert& yi_cert = yi->first;
+ switch (xi_cert.compare(yi_cert)) {
+ case 0:
+ // xi_cert == yi_cert: check the number of multiset occurrences.
+ {
+ const size_type& xi_count = xi->second;
+ const size_type& yi_count = yi->second;
+ if (xi_count == yi_count) {
+ // Same number of occurrences: compare the next pair.
+ ++xi;
+ ++yi;
+ }
+ else
+ // Different number of occurrences: can decide ordering.
+ return xi_count < yi_count;
+ break;
+ }
+ case 1:
+ // xi_cert > yi_cert: it is not stabilizing.
+ return false;
+
+ case -1:
+ // xi_cert < yi_cert: it is stabilizing.
+ return true;
+ }
+ }
+ // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+ // Stabilization is achieved if `y_cert_ms' still has other elements.
+ return yi != y_cert_ms_end;
+}
+
+template <typename PSET>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PSET>::BHZ03_widening_assign(const Pointset_Powerset& y,
+ Widening widen_fun) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ // First widening technique: do nothing.
+
+ // If `y' is the empty collection, do nothing.
+ PPL_ASSERT(x.size() > 0);
+ if (y.size() == 0)
+ return;
+
+ // Compute the poly-hull of `x'.
+ PSET x_hull(x.space_dim, EMPTY);
+ for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+ x_hull.upper_bound_assign(i->pointset());
+
+ // Compute the poly-hull of `y'.
+ PSET y_hull(y.space_dim, EMPTY);
+ for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+ y_hull.upper_bound_assign(i->pointset());
+ // Compute the certificate for `y_hull'.
+ const Cert y_hull_cert(y_hull);
+
+ // If the hull is stabilizing, do nothing.
+ int hull_stabilization = y_hull_cert.compare(x_hull);
+ if (hull_stabilization == 1)
+ return;
+
+ // Multiset ordering is only useful when `y' is not a singleton.
+ const bool y_is_not_a_singleton = y.size() > 1;
+
+ // The multiset certificate for `y':
+ // we want to be lazy about its computation.
+ typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+ Cert_Multiset y_cert_ms;
+ bool y_cert_ms_computed = false;
+
+ if (hull_stabilization == 0 && y_is_not_a_singleton) {
+ // Collect the multiset certificate for `y'.
+ y.collect_certificates(y_cert_ms);
+ y_cert_ms_computed = true;
+ // If multiset ordering is stabilizing, do nothing.
+ if (x.is_cert_multiset_stabilizing(y_cert_ms))
+ return;
+ }
+
+ // Second widening technique: try the BGP99 powerset heuristics.
+ Pointset_Powerset<PSET> bgp99_heuristics = x;
+ bgp99_heuristics.BGP99_heuristics_assign(y, widen_fun);
+
+ // Compute the poly-hull of `bgp99_heuristics'.
+ PSET bgp99_heuristics_hull(x.space_dim, EMPTY);
+ for (const_iterator i = bgp99_heuristics.begin(),
+ b_h_end = bgp99_heuristics.end(); i != b_h_end; ++i)
+ bgp99_heuristics_hull.upper_bound_assign(i->pointset());
+
+ // Check for stabilization and, if successful,
+ // commit to the result of the extrapolation.
+ hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+ if (hull_stabilization == 1) {
+ // The poly-hull is stabilizing.
+ swap(x, bgp99_heuristics);
+ return;
+ }
+ else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+ // If not already done, compute multiset certificate for `y'.
+ if (!y_cert_ms_computed) {
+ y.collect_certificates(y_cert_ms);
+ y_cert_ms_computed = true;
+ }
+ if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ swap(x, bgp99_heuristics);
+ return;
+ }
+ // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+ // Note that pairwise-reduction does not affect the computation
+ // of the poly-hulls, so that we only have to check the multiset
+ // certificate relation.
+ Pointset_Powerset<PSET> reduced_bgp99_heuristics(bgp99_heuristics);
+ reduced_bgp99_heuristics.pairwise_reduce();
+ if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ swap(x, reduced_bgp99_heuristics);
+ return;
+ }
+ }
+
+ // Fourth widening technique: this is applicable only when
+ // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+ if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+ // Compute (y_hull \widen bgp99_heuristics_hull).
+ PSET ph = bgp99_heuristics_hull;
+ widen_fun(ph, y_hull);
+ // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+ ph.difference_assign(bgp99_heuristics_hull);
+ x.add_disjunct(ph);
+ return;
+ }
+
+ // Fall back to the computation of the poly-hull.
+ Pointset_Powerset<PSET> x_hull_singleton(x.space_dim, EMPTY);
+ x_hull_singleton.add_disjunct(x_hull);
+ swap(x, x_hull_singleton);
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::ascii_dump(std::ostream& s) const {
+ const Pointset_Powerset& x = *this;
+ s << "size " << x.size()
+ << "\nspace_dim " << x.space_dim
+ << "\n";
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+ xi->pointset().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PSET, Pointset_Powerset<PSET>)
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::ascii_load(std::istream& s) {
+ Pointset_Powerset& x = *this;
+ std::string str;
+
+ if (!(s >> str) || str != "size")
+ return false;
+
+ size_type sz;
+
+ if (!(s >> sz))
+ return false;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> x.space_dim))
+ return false;
+
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ while (sz-- > 0) {
+ PSET ph;
+ if (!ph.ascii_load(s))
+ return false;
+ new_x.add_disjunct(ph);
+ }
+ swap(x, new_x);
+
+ // Check invariants.
+ PPL_ASSERT_HEAVY(x.OK());
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::OK() const {
+ const Pointset_Powerset& x = *this;
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+ const PSET& pi = xi->pointset();
+ if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+ std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+ << " in an element of the sequence,\nshould be "
+ << x.space_dim << "."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ return x.Base::OK();
+}
+
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p pset according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+ On exit, the intersection of \p pset and constraint \p c is stored
+ in \p pset, whereas the intersection of \p pset with the negation of \p c
+ is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+void
+linear_partition_aux(const Constraint& c,
+ PSET& pset,
+ Pointset_Powerset<NNC_Polyhedron>& r) {
+ const Linear_Expression le(c.expression());
+ const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+ NNC_Polyhedron nnc_ph_pset(pset);
+ nnc_ph_pset.add_constraint(neg_c);
+ if (!nnc_ph_pset.is_empty())
+ r.add_disjunct(nnc_ph_pset);
+ pset.add_constraint(c);
+}
+
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q) {
+ using Implementation::Pointset_Powersets::linear_partition_aux;
+
+ Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+ PSET pset = q;
+ const Constraint_System& p_constraints = p.constraints();
+ for (Constraint_System::const_iterator i = p_constraints.begin(),
+ p_constraints_end = p_constraints.end();
+ i != p_constraints_end;
+ ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality()) {
+ const Linear_Expression le(c.expression());
+ linear_partition_aux(le <= 0, pset, r);
+ linear_partition_aux(le >= 0, pset, r);
+ }
+ else
+ linear_partition_aux(c, pset, r);
+ }
+ return std::make_pair(pset, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_templates_hh)
diff --git a/src/Pointset_Powerset_types.hh b/src/Pointset_Powerset_types.hh
new file mode 100644
index 0000000..f52e4f5
--- /dev/null
+++ b/src/Pointset_Powerset_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pointset_Powerset_types_hh
+#define PPL_Pointset_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Pointset_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_types_hh)
diff --git a/src/Poly_Con_Relation.cc b/src/Poly_Con_Relation.cc
new file mode 100644
index 0000000..3a8f0f7
--- /dev/null
+++ b/src/Poly_Con_Relation.cc
@@ -0,0 +1,76 @@
+/* Poly_Con_Relation class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Poly_Con_Relation_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Con_Relation::ascii_dump(std::ostream& s) const {
+ flags_t f = flags;
+ if (f == NOTHING) {
+ s << "NOTHING";
+ return;
+ }
+
+ while (true) {
+ if (implies(f, IS_DISJOINT)) {
+ s << "IS_DISJOINT";
+ f &= ~IS_DISJOINT;
+ }
+ else if (implies(f, STRICTLY_INTERSECTS)) {
+ s << "STRICTLY_INTERSECTS";
+ f &= ~STRICTLY_INTERSECTS;
+ }
+ else if (implies(f, IS_INCLUDED)) {
+ s << "IS_INCLUDED";
+ f &= ~IS_INCLUDED;
+ }
+ else if (implies(f, SATURATES)) {
+ s << "SATURATES";
+ f &= ~SATURATES;
+ }
+ if (f != NOTHING)
+ s << " & ";
+ else
+ break;
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Con_Relation)
+
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r) {
+ r.ascii_dump(s);
+ return s;
+}
+
+bool
+PPL::Poly_Con_Relation::OK() const {
+ return true;
+}
diff --git a/src/Poly_Con_Relation_defs.hh b/src/Poly_Con_Relation_defs.hh
new file mode 100644
index 0000000..73034ff
--- /dev/null
+++ b/src/Poly_Con_Relation_defs.hh
@@ -0,0 +1,166 @@
+/* Poly_Con_Relation class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_defs_hh
+#define PPL_Poly_Con_Relation_defs_hh 1
+
+#include "Poly_Con_Relation_types.hh"
+#include "globals_defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+/*! \brief
+ Yields the assertion with all the conjuncts of \p x
+ that are not in \p y.
+
+ \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+ //! Poly_Con_Relation is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t NOTHING = 0U;
+ static const flags_t IS_DISJOINT = 1U << 0;
+ static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+ static const flags_t IS_INCLUDED = 1U << 2;
+ static const flags_t SATURATES = 1U << 3;
+ //@} // Bit-masks for the individual assertions
+
+ //! All assertions together.
+ static const flags_t EVERYTHING
+ = IS_DISJOINT
+ | STRICTLY_INTERSECTS
+ | IS_INCLUDED
+ | SATURATES;
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! True if and only if the conjunction \p x implies the conjunction \p y.
+ static bool implies(flags_t x, flags_t y);
+
+ //! Construct from a bit-mask.
+ Poly_Con_Relation(flags_t mask);
+
+ friend bool
+ operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+ friend bool
+ operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::
+ IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Access the internal flags: this is needed for some language
+ interfaces.
+ */
+#endif
+ flags_t get_flags() const;
+
+public:
+ //! The assertion that says nothing.
+ static Poly_Con_Relation nothing();
+
+ /*! \brief
+ The polyhedron and the set of points satisfying
+ the constraint are disjoint.
+ */
+ static Poly_Con_Relation is_disjoint();
+
+ /*! \brief
+ The polyhedron intersects the set of points satisfying
+ the constraint, but it is not included in it.
+ */
+ static Poly_Con_Relation strictly_intersects();
+
+ /*! \brief
+ The polyhedron is included in the set of points satisfying
+ the constraint.
+ */
+ static Poly_Con_Relation is_included();
+
+ /*! \brief
+ The polyhedron is included in the set of points saturating
+ the constraint.
+ */
+ static Poly_Con_Relation saturates();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! True if and only if \p *this implies \p y.
+ bool implies(const Poly_Con_Relation& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#include "Poly_Con_Relation_inlines.hh"
+
+#endif // !defined(PPL_Poly_Con_Relation_defs_hh)
diff --git a/src/Poly_Con_Relation_inlines.hh b/src/Poly_Con_Relation_inlines.hh
new file mode 100644
index 0000000..b9ba49c
--- /dev/null
+++ b/src/Poly_Con_Relation_inlines.hh
@@ -0,0 +1,100 @@
+/* Poly_Con_Relation class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_inlines_hh
+#define PPL_Poly_Con_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+ : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+ return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+ return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+ return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+ return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+ return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+ return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+ return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+ return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_inlines_hh)
diff --git a/src/Poly_Con_Relation_types.hh b/src/Poly_Con_Relation_types.hh
new file mode 100644
index 0000000..c20d762
--- /dev/null
+++ b/src/Poly_Con_Relation_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Con_Relation_types_hh
+#define PPL_Poly_Con_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_types_hh)
diff --git a/src/Poly_Gen_Relation.cc b/src/Poly_Gen_Relation.cc
new file mode 100644
index 0000000..180155e
--- /dev/null
+++ b/src/Poly_Gen_Relation.cc
@@ -0,0 +1,64 @@
+/* Poly_Gen_Relation class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Poly_Gen_Relation_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Gen_Relation::ascii_dump(std::ostream& s) const {
+ flags_t f = flags;
+ if (f == NOTHING) {
+ s << "NOTHING";
+ return;
+ }
+
+ while (true) {
+ if (implies(f, SUBSUMES)) {
+ s << "SUBSUMES";
+ f &= ~SUBSUMES;
+ }
+ if (f != NOTHING)
+ s << " & ";
+ else
+ break;
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Gen_Relation)
+
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r) {
+ r.ascii_dump(s);
+ return s;
+}
+
+bool
+PPL::Poly_Gen_Relation::OK() const {
+ return true;
+}
diff --git a/src/Poly_Gen_Relation_defs.hh b/src/Poly_Gen_Relation_defs.hh
new file mode 100644
index 0000000..13e5d00
--- /dev/null
+++ b/src/Poly_Gen_Relation_defs.hh
@@ -0,0 +1,139 @@
+/* Poly_Gen_Relation class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_defs_hh
+#define PPL_Poly_Gen_Relation_defs_hh 1
+
+#include "Poly_Gen_Relation_types.hh"
+#include "globals_defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+/*! \brief
+ Yields the assertion with all the conjuncts of \p x
+ that are not in \p y.
+
+ \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+ //! Poly_Gen_Relation is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t NOTHING = 0U;
+ static const flags_t SUBSUMES = 1U << 0;
+ //@} // Bit-masks for the individual assertions
+
+ //! All assertions together.
+ static const flags_t EVERYTHING
+ = SUBSUMES;
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! True if and only if the conjunction \p x implies the conjunction \p y.
+ static bool implies(flags_t x, flags_t y);
+
+ //! Construct from a bit-mask.
+ Poly_Gen_Relation(flags_t mask);
+
+ friend bool
+ operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+ friend bool
+ operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::
+ IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Access the internal flags: this is needed for some language
+ interfaces.
+ */
+#endif
+ flags_t get_flags() const;
+
+public:
+ //! The assertion that says nothing.
+ static Poly_Gen_Relation nothing();
+
+ //! Adding the generator would not change the polyhedron.
+ static Poly_Gen_Relation subsumes();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! True if and only if \p *this implies \p y.
+ bool implies(const Poly_Gen_Relation& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#include "Poly_Gen_Relation_inlines.hh"
+
+#endif // !defined(PPL_Poly_Gen_Relation_defs_hh)
diff --git a/src/Poly_Gen_Relation_inlines.hh b/src/Poly_Gen_Relation_inlines.hh
new file mode 100644
index 0000000..1d6e991
--- /dev/null
+++ b/src/Poly_Gen_Relation_inlines.hh
@@ -0,0 +1,85 @@
+/* Poly_Gen_Relation class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_inlines_hh
+#define PPL_Poly_Gen_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+ : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+ return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+ return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+ return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+ return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+ return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_inlines_hh)
diff --git a/src/Poly_Gen_Relation_types.hh b/src/Poly_Gen_Relation_types.hh
new file mode 100644
index 0000000..d7f5ec4
--- /dev/null
+++ b/src/Poly_Gen_Relation_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Gen_Relation_types_hh
+#define PPL_Poly_Gen_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_types_hh)
diff --git a/src/Polyhedron_chdims.cc b/src/Polyhedron_chdims.cc
new file mode 100644
index 0000000..e5afa64
--- /dev/null
+++ b/src/Polyhedron_chdims.cc
@@ -0,0 +1,477 @@
+/* Polyhedron class implementation
+ (non-inline operators that may change the dimension of the vector space).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron::add_space_dimensions_and_embed(dimension_type m) {
+ // The space dimension of the resulting polyhedron should not
+ // overflow the maximum allowed space dimension.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ topology(),
+ "add_space_dimensions_and_embed(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Adding no dimensions to any polyhedron is a no-op.
+ if (m == 0)
+ return;
+
+ // Adding dimensions to an empty polyhedron is obtained by adjusting
+ // `space_dim' and clearing `con_sys' (since it can contain the
+ // unsatisfiable constraint system of the wrong dimension).
+ if (marked_empty()) {
+ space_dim += m;
+ con_sys.clear();
+ return;
+ }
+
+ // The case of a zero-dimensional space polyhedron.
+ if (space_dim == 0) {
+ // Since it is not empty, it has to be the universe polyhedron.
+ PPL_ASSERT(status.test_zero_dim_univ());
+ // We swap `*this' with a newly created
+ // universe polyhedron of dimension `m'.
+ Polyhedron ph(topology(), m, UNIVERSE);
+ m_swap(ph);
+ return;
+ }
+
+ // To embed an n-dimension space polyhedron in a (n+m)-dimension space,
+ // we just add `m' zero-columns to the rows in the system of constraints;
+ // in contrast, the system of generators needs additional rows,
+ // corresponding to the vectors of the canonical basis
+ // for the added dimensions. That is, for each new dimension `x[k]'
+ // we add the line having that direction. This is done by invoking
+ // the function add_space_dimensions() giving the system of generators
+ // as the second argument.
+ if (constraints_are_up_to_date())
+ if (generators_are_up_to_date()) {
+ // `sat_c' must be up to date for add_space_dimensions().
+ if (!sat_c_is_up_to_date())
+ update_sat_c();
+ // Adds rows and/or columns to both matrices.
+ // `add_space_dimensions' correctly handles pending constraints
+ // or generators.
+ add_space_dimensions(con_sys, gen_sys, sat_c, sat_g, m);
+ }
+ else {
+ // Only constraints are up-to-date: no need to modify the generators.
+ con_sys.set_space_dimension(con_sys.space_dimension() + m);
+ }
+ else {
+ // Only generators are up-to-date: no need to modify the constraints.
+ PPL_ASSERT(generators_are_up_to_date());
+ gen_sys.add_universe_rows_and_space_dimensions(m);
+ }
+ // Update the space dimension.
+ space_dim += m;
+
+ // Note: we do not check for satisfiability, because the system of
+ // constraints may be unsatisfiable.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) {
+ // The space dimension of the resulting polyhedron should not
+ // overflow the maximum allowed space dimension.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ topology(),
+ "add_space_dimensions_and_project(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Adding no dimensions to any polyhedron is a no-op.
+ if (m == 0)
+ return;
+
+ // Adding dimensions to an empty polyhedron is obtained
+ // by merely adjusting `space_dim'.
+ if (marked_empty()) {
+ space_dim += m;
+ con_sys.clear();
+ return;
+ }
+
+ if (space_dim == 0) {
+ PPL_ASSERT(status.test_zero_dim_univ() && gen_sys.has_no_rows());
+ // The system of generators for this polyhedron has only
+ // the origin as a point.
+ // In an NNC polyhedron, all points have to be accompanied
+ // by the corresponding closure points
+ // (this time, dimensions are automatically adjusted).
+ if (!is_necessarily_closed())
+ gen_sys.insert(Generator::zero_dim_closure_point());
+ gen_sys.insert(Generator::zero_dim_point());
+ gen_sys.adjust_topology_and_space_dimension(topology(), m);
+ set_generators_minimized();
+ space_dim = m;
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // To project an n-dimension space polyhedron in a (n+m)-dimension space,
+ // we just add to the system of generators `m' zero-columns;
+ // In contrast, in the system of constraints, new rows are needed
+ // in order to avoid embedding the old polyhedron in the new space.
+ // Thus, for each new dimensions `x[k]', we add the constraint
+ // x[k] = 0: this is done by invoking the function add_space_dimensions()
+ // giving the system of constraints as the second argument.
+ if (constraints_are_up_to_date())
+ if (generators_are_up_to_date()) {
+ // `sat_g' must be up to date for add_space_dimensions().
+ if (!sat_g_is_up_to_date())
+ update_sat_g();
+ // Adds rows and/or columns to both matrices.
+ // `add_space_dimensions()' correctly handles pending constraints
+ // or generators.
+ add_space_dimensions(gen_sys, con_sys, sat_g, sat_c, m);
+ }
+ else {
+ // Only constraints are up-to-date: no need to modify the generators.
+ con_sys.add_universe_rows_and_space_dimensions(m);
+ }
+ else {
+ // Only generators are up-to-date: no need to modify the constraints.
+ PPL_ASSERT(generators_are_up_to_date());
+ gen_sys.set_space_dimension(gen_sys.space_dimension() + m);
+ }
+ // Now we update the space dimension.
+ space_dim += m;
+
+ // Note: we do not check for satisfiability, because the system of
+ // constraints may be unsatisfiable.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::concatenate_assign(const Polyhedron& y) {
+ if (topology() != y.topology())
+ throw_topology_incompatible("concatenate_assign(y)", "y", y);
+
+ // The space dimension of the resulting polyhedron should not
+ // overflow the maximum allowed space dimension.
+ const dimension_type added_columns = y.space_dim;
+ check_space_dimension_overflow(added_columns,
+ max_space_dimension() - space_dimension(),
+ topology(),
+ "concatenate_assign(y)",
+ "concatenation exceeds the maximum "
+ "allowed space dimension");
+
+ // If `*this' or `y' are empty polyhedra, it is sufficient to adjust
+ // the dimension of the space.
+ if (marked_empty() || y.marked_empty()) {
+ space_dim += added_columns;
+ set_empty();
+ return;
+ }
+
+ // If `y' is a non-empty 0-dim space polyhedron, the result is `*this'.
+ if (added_columns == 0)
+ return;
+
+ // If `*this' is a non-empty 0-dim space polyhedron, the result is `y'.
+ if (space_dim == 0) {
+ *this = y;
+ return;
+ }
+
+ // TODO: this implementation is just an executable specification.
+ Constraint_System cs = y.constraints();
+
+ // The constraints of `x' (possibly with pending rows) are required.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ // The matrix for the new system of constraints is obtained
+ // by leaving the old system of constraints in the upper left-hand side
+ // and placing the constraints of `cs' in the lower right-hand side.
+ // NOTE: here topologies agree, whereas dimensions may not agree.
+ const dimension_type added_rows = cs.num_rows();
+
+ // We already dealt with the cases of an empty or zero-dim `y' polyhedron;
+ // also, `cs' contains the low-level constraints, at least.
+ PPL_ASSERT(added_rows > 0 && added_columns > 0);
+
+ con_sys.set_space_dimension(con_sys.space_dimension() + added_columns);
+
+ if (can_have_something_pending()) {
+ // Steal the constraints from `cs' and put them in `con_sys'
+ // using the right displacement for coefficients.
+ for (dimension_type i = 0; i < added_rows; ++i) {
+ cs.sys.rows[i].shift_space_dimensions(Variable(0), space_dim);
+ con_sys.insert_pending(cs.sys.rows[i], Recycle_Input());
+ }
+ cs.clear();
+
+ // If `*this' can support pending constraints, then, since we have
+ // resized the system of constraints, we must also add to the generator
+ // system those lines corresponding to the newly added dimensions,
+ // because the non-pending parts of `con_sys' and `gen_sys' must still
+ // be a DD pair in minimal form.
+ gen_sys.add_universe_rows_and_space_dimensions(added_columns);
+ // Since we added new lines at the beginning of `x.gen_sys',
+ // we also have to adjust the saturation matrix `sat_c'.
+ // FIXME: if `sat_c' is not up-to-date, could not we directly update
+ // `sat_g' by resizing it and shifting its columns?
+ if (!sat_c_is_up_to_date()) {
+ sat_c.transpose_assign(sat_g);
+ set_sat_c_up_to_date();
+ }
+ clear_sat_g_up_to_date();
+ sat_c.resize(sat_c.num_rows() + added_columns, sat_c.num_columns());
+ // The old saturation rows are copied at the end of the matrix.
+ // The newly introduced lines saturate all the non-pending constraints,
+ // thus their saturation rows are made of zeroes.
+ using std::swap;
+ for (dimension_type i = sat_c.num_rows() - added_columns; i-- > 0; )
+ swap(sat_c[i], sat_c[i+added_columns]);
+ // Since `added_rows > 0', we now have pending constraints.
+ set_constraints_pending();
+ }
+ else {
+ // Steal the constraints from `cs' and put them in `con_sys'
+ // using the right displacement for coefficients.
+ for (dimension_type i = 0; i < added_rows; ++i) {
+ cs.sys.rows[i].shift_space_dimensions(Variable(0), space_dim);
+ con_sys.insert(cs.sys.rows[i], Recycle_Input());
+ }
+#if !BE_LAZY
+ con_sys.sort_rows();
+#endif
+ clear_constraints_minimized();
+ clear_generators_up_to_date();
+ clear_sat_g_up_to_date();
+ clear_sat_c_up_to_date();
+ }
+ // Update space dimension.
+ space_dim += added_columns;
+
+ // The system of constraints may be unsatisfiable,
+ // thus we do not check for satisfiability.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any polyhedron is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a polyhedron in a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ const dimension_type new_space_dim = space_dim - vars.size();
+
+ // We need updated generators; note that keeping pending generators
+ // is useless because the constraints will be dropped anyway.
+ if (marked_empty()
+ || (has_something_pending() && !remove_pending_to_obtain_generators())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing dimensions from the empty polyhedron:
+ // we clear `con_sys' since it could have contained the
+ // unsatisfiable constraint of the wrong dimension.
+ con_sys.clear();
+ // Update the space dimension.
+ space_dim = new_space_dim;
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // When removing _all_ dimensions from a non-empty polyhedron,
+ // we obtain the zero-dimensional universe polyhedron.
+ if (new_space_dim == 0) {
+ set_zero_dim_univ();
+ return;
+ }
+
+ gen_sys.remove_space_dimensions(vars);
+
+ // Constraints are not up-to-date and generators are not minimized.
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+
+ // Update the space dimension.
+ space_dim = new_space_dim;
+
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::remove_higher_space_dimensions(dimension_type new_dimension) {
+ // Dimension-compatibility check.
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any polyhedron is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a polyhedron in a 0-dim space.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // We need updated generators; note that keeping pending generators
+ // is useless because constraints will be dropped anyway.
+ if (marked_empty()
+ || (has_something_pending() && !remove_pending_to_obtain_generators())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing dimensions from the empty polyhedron:
+ // just updates the space dimension.
+ space_dim = new_dimension;
+ con_sys.clear();
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ if (new_dimension == 0) {
+ // Removing all dimensions from a non-empty polyhedron:
+ // just return the zero-dimensional universe polyhedron.
+ set_zero_dim_univ();
+ return;
+ }
+
+ gen_sys.set_space_dimension(new_dimension);
+
+ // Constraints are not up-to-date and generators are not minimized.
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+
+ // Update the space dimension.
+ space_dim = new_dimension;
+
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::expand_space_dimension(Variable var, dimension_type m) {
+ // `var' should be one of the dimensions of the vector space.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // The space dimension of the resulting polyhedron should not
+ // overflow the maximum allowed space dimension.
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ topology(),
+ "expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Nothing to do, if no dimensions must be added.
+ if (m == 0)
+ return;
+
+ // Keep track of the dimension before adding the new ones.
+ const dimension_type old_dim = space_dim;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ const Constraint_System& cs = constraints();
+ Constraint_System new_constraints(cs.topology());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+
+ Coefficient_traits::const_reference coeff = c.coefficient(var);
+
+ // If `c' does not constrain `var', skip it.
+ if (coeff == 0)
+ continue;
+
+ Constraint c_template = c;
+ c_template.expr.set_coefficient(var, Coefficient_zero());
+
+ // Each relevant constraint results in `m' new constraints.
+ for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+ Constraint new_c = c_template;
+ add_mul_assign(new_c.expr, coeff, Variable(dst_d));
+ PPL_ASSERT(new_c.OK());
+ new_constraints.insert(new_c, Recycle_Input());
+ }
+ }
+ add_recycled_constraints(new_constraints);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ // TODO: this implementation is _really_ an executable specification.
+
+ // `dest' should be one of the dimensions of the polyhedron.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the polyhedron.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ "vs.space_dimension()",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ // All of the affine images we are going to compute are not invertible,
+ // hence we will need to compute the generators of the polyhedron.
+ // Since we keep taking copies, make sure that a single conversion
+ // from constraints to generators is computed.
+ (void) generators();
+ // Having generators, we now know if the polyhedron is empty:
+ // in that case, folding is equivalent to just removing space dimensions.
+ if (!marked_empty()) {
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ Polyhedron copy = *this;
+ copy.affine_image(dest, Linear_Expression(Variable(*i)));
+ poly_hull_assign(copy);
+ }
+ }
+ remove_space_dimensions(vars);
+ PPL_ASSERT_HEAVY(OK());
+}
diff --git a/src/Polyhedron_chdims_templates.hh b/src/Polyhedron_chdims_templates.hh
new file mode 100644
index 0000000..77692c3
--- /dev/null
+++ b/src/Polyhedron_chdims_templates.hh
@@ -0,0 +1,63 @@
+/* Polyhedron class implementation (non-inline template operators that
+ may change the dimension of the vector space).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_chdims_templates_hh
+#define PPL_Polyhedron_chdims_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Linear_System1, typename Linear_System2>
+void
+Polyhedron::add_space_dimensions(Linear_System1& sys1,
+ Linear_System2& sys2,
+ Bit_Matrix& sat1,
+ Bit_Matrix& sat2,
+ dimension_type add_dim) {
+
+ typedef typename Linear_System2::row_type sys2_row_type;
+
+ PPL_ASSERT(sys1.topology() == sys2.topology());
+ PPL_ASSERT(sys1.space_dimension() == sys2.space_dimension());
+ PPL_ASSERT(add_dim != 0);
+
+ sys1.set_space_dimension(sys1.space_dimension() + add_dim);
+ sys2.add_universe_rows_and_space_dimensions(add_dim);
+
+ // The resulting saturation matrix will be as follows:
+ // from row 0 to add_dim-1 : only zeroes
+ // add_dim add_dim+num_rows-1 : old saturation matrix
+
+ // In fact all the old generators saturate all the new constraints
+ // because the polyhedron has not been embedded in the new space.
+ sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns());
+ // The old matrix is moved to the end of the new matrix.
+ for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; )
+ swap(sat1[i], sat1[i+add_dim]);
+ // Computes the "sat_c", too.
+ sat2.transpose_assign(sat1);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_chdims_templates_hh)
diff --git a/src/Polyhedron_conversion_templates.hh b/src/Polyhedron_conversion_templates.hh
new file mode 100644
index 0000000..91d4772
--- /dev/null
+++ b/src/Polyhedron_conversion_templates.hh
@@ -0,0 +1,925 @@
+/* Polyhedron class implementation: conversion().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_conversion_templates_hh
+#define PPL_Polyhedron_conversion_templates_hh 1
+
+#include "Bit_Row_defs.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Temp_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <cstddef>
+#include <climits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ The number of lines of the polyhedron or the number of equality
+ constraints in the result of conversion.
+
+ \param source
+ The system to use to convert \p dest: it may be modified;
+
+ \param start
+ The index of \p source row from which conversion begin;
+
+ \param dest
+ The result of the conversion;
+
+ \param sat
+ The saturation matrix telling us, for each row in \p source, which
+ are the rows of \p dest that satisfy but do not saturate it;
+
+ \param num_lines_or_equalities
+ The number of rows in the system \p dest that are either lines of
+ the polyhedron (when \p dest is a system of generators) or equality
+ constraints (when \p dest is a system of constraints).
+
+ \if Include_Implementation_Details
+
+ For simplicity, all the following comments assume we are converting a
+ constraint system \p source to a generator system \p dest;
+ the comments for the symmetric case can be obtained by duality.
+
+ If some of the constraints in \p source are redundant, they will be removed.
+ This is why the \p source is not declared to be a constant parameter.
+
+ If \p start is 0, then \p source is a sorted system; also, \p dest is
+ a generator system corresponding to an empty constraint system.
+ If otherwise \p start is greater than 0, then the two sub-systems of
+ \p source made by the non-pending rows and the pending rows, respectively,
+ are both sorted; also, \p dest is the generator system corresponding to
+ the non-pending constraints of \p source.
+
+ Independently from the value of \p start, \p dest has lines from index 0
+ to index \p num_lines_or_equalities - 1 and rays/points from index
+ \p num_lines_or_equalities to the last of its rows.
+
+ Note that here the rows of \p sat are indexed by rows of \p dest
+ and its columns are indexed by rows of \p source.
+
+ We know that polyhedra can be represented by both a system of
+ constraints or a system of generators (points, rays and lines)
+ (see Section \ref representation).
+ When we have both descriptions for a polyhedron \f$P\f$
+ we have what is called a <EM>double description</EM>
+ (or <EM>DD pair</EM>) for \f$P\f$.
+
+ Here, the <EM>representation system</EM> refers to the system \f$C\f$
+ whose rows represent the constraints that characterize \f$P\f$
+ and the <EM>generating system</EM>, the system \f$G\f$ whose rows
+ represent the generators of \f$P\f$.
+ We say that a pair \f$(C, G)\f$ of (real) systems is
+ a <EM>double description pair</EM> if
+ \f[
+ C\vect{x} \geq \vect{0}
+ \quad\iff\quad
+ \exists \vect{\lambda} \geq \vect{0} \mathrel{.}
+ \vect{x} = G\vect{\lambda}.
+ \f]
+
+ The term "double description" is quite natural in the sense that
+ such a pair contains two different description of the same object.
+ In fact, if we refer to the cone representation of a polyhedron \f$P\f$
+ and we call \f$C\f$ and \f$G\f$ the systems of constraints and
+ rays respectively, we have
+ \f[
+ P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \}
+ = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda}
+ \text{ for some } \vect{\lambda} \geq \vect{0}\, \}.
+ \f]
+
+ Because of the theorem of Minkowski (see Section \ref prelims),
+ we can say that, given a \f$m \times n\f$ representation system
+ \f$C\f$ such that
+ \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$
+ for a non-empty polyhedron \f$P\f$,
+ it is always possible to find a generating system \f$G\f$ for \f$P\f$
+ such that \f$(C, G)\f$ is a DD pair.
+ Conversely, Weyl's theorem ensures that, for each generating system
+ \f$G\f$, it is possible to find a representation system \f$C\f$
+ such that \f$(C, G)\f$ is a DD pair.
+
+ For efficiency reasons, our representation of polyhedra makes use
+ of a double description.
+ We are thus left with two problems:
+ -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
+ -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
+
+ Using Farkas' Lemma we can prove that these two problems are
+ computationally equivalent (i.e., linear-time reducible to each other).
+ Farkas' Lemma establishes a fundamental property of vectors in
+ \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
+ Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
+ \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
+ Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that,
+ whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection
+ on the \f$\vect{a}_i\f$'s, it also has a non-negative projection
+ on \f$\vect{c}\f$.
+ The lemma states that \f$\vect{c}\f$ has this property if and only if
+ it is in the cone generated by the \f$\vect{a}_i\f$'s.
+ Formally, the lemma states the equivalence of the two following
+ assertions:
+ -# \f$
+ \forall \vect{y}
+ \mathrel{:} (A\vect{y} \geq 0 \implies
+ \langle \vect{y},\vect{c} \rangle \geq 0)
+ \f$;
+ -# \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A
+ \f$.
+
+ With this result we can prove that \f$(C, G)\f$ is a DD pair
+ if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair.
+
+ Suppose \f$(C, G)\f$ is a DD pair.
+ Thus, for each \f$x\f$ of the appropriate dimension,
+ \f$C\vect{x} \geq \vect{0}\f$ if and only if
+ \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$,
+ which is of course equivalent to
+ \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+ \f$.
+
+ First, we assume that \f$\vect{z}\f$ is such that
+ \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+ and we will show that
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+ Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$.
+ Since \f$(C, G)\f$ is a DD pair, this is equivalent to
+ \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+ \f$,
+ which, by Farkas' Lemma is equivalent to
+ \f$
+ \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
+ \langle \vect{y}, \vect{x} \rangle \geq 0)
+ \f$.
+ Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that
+ \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+ we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$,
+ that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$.
+ We have thus established that
+ \f$
+ \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
+ \langle \vect{x}, \vect{z} \rangle \geq 0)
+ \f$.
+ By Farkas' Lemma, this is equivalent to
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
+ which is equivalent to what we wanted to prove, that is,
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+
+ In order to prove the reverse implication, the following observation
+ turns out to be useful:
+ when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$.
+ In fact,
+ let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$
+ apart from the \f$j\f$-th one, which is \f$1\f$.
+ Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking
+ \f$\vect{\lambda} = \vect{e}_j\f$ and
+ \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have
+ \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$,
+ since \f$(C, G)\f$ is a DD pair.
+ Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$
+ and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$.
+
+ We now assume that \f$\vect{z}\f$ is such that
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$
+ and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
+ By Farkas' Lemma, the assumption
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
+ is equivalent to
+ \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0}
+ \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$.
+ If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y}
+ = CG\vect{e}_j \geq 0\f$,
+ since \f$CG \geq \vect{0}\f$.
+ So
+ \f$
+ \langle \vect{y}, \vect{z} \rangle
+ = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z}
+ = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z})
+ \geq 0
+ \f$,
+ that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$
+ is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude
+ that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required.
+
+ In view of this result, the following exposition assumes, for clarity,
+ that the conversion being performed is from constraints to generators.
+ Thus, even if the roles of \p source and \p dest can be interchanged,
+ in the sequel we assume the \p source system will contain the constraints
+ that represent the polyhedron and the \p dest system will contain
+ the generator that generates it.
+
+ There are some observations that are useful to understand this function:
+
+ Observation 1: Let \f$A\f$ be a system of constraints that generate
+ the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must
+ be added. Suppose that there is a line \f$\vect{z}\f$ that does not
+ saturate the constraint \f$\vect{c}\f$. If we combine the old lines
+ and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$)
+ with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$,
+ the new lines and rays also saturate the constraints saturated by
+ the old lines and rays.
+
+ In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate
+ \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that
+ \f[
+ \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z}
+ \f]
+ and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$
+ and \f$\vect{z}\f$ saturates, we can see
+ \f[
+ \langle \vect{c}_1, \vect{y}_2 \rangle
+ = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle
+ = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle
+ + \mu \langle \vect{c}_1, \vect{z} \rangle
+ = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle
+ = \mu \langle \vect{c}_1, \vect{z} \rangle
+ \f]
+ and
+ \f[
+ \mu \langle \vect{c}_1, \vect{z} \rangle = 0.
+ \f]
+
+ Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct
+ rays of \f$P\f$.
+ Then the following statements are equivalent:
+ a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays
+ (see Section \ref prelims);
+ b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the
+ rank of the system composed by the constraints saturated by both
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to
+ \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints.
+
+ In fact, let \f$F\f$ be the system of generators that saturate the
+ constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+ If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$ generate this set. So, every generator
+ \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e.
+ \f[
+ \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2.
+ \f]
+ This combination is non-negative because there exists at least a
+ constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not
+ \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which
+ \f[
+ \langle \vect{c}, \vect{x} \rangle \geq 0
+ \f]
+ and
+ \f[
+ \langle \vect{c}, \vect{x} \rangle
+ = \lambda \langle \vect{c}, \vect{r}_1 \rangle
+ (or = \mu \langle \vect{c}, \vect{r}_2 \rangle).
+ \f]
+ So, there is no other extreme ray in \f$F\f$ and a) holds.
+ Otherwise, if b) does not hold, the rank of the system generated by
+ the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+ is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is
+ \p k -dimensional and at least \p k extreme rays are necessary
+ to generate \f$F\f$.
+ So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and
+ a) does not hold.
+
+ Proposition 2: When we build the new system of generators starting from
+ a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the
+ constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate
+ \f$\vect{c}\f$, the new set of rays is the union of those rays that
+ saturate, of those that satisfy and of a set \f$\overline Q\f$ of
+ rays such that each of them
+ -# lies on the hyper-plane represented by the k-th constraint,
+ -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$ such that the first one satisfies the constraint and
+ the other does not satisfy it.
+ If the adjacency property is not taken in account, the new set of
+ rays is not irredundant, in general.
+
+ In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent,
+ the rank of the system composed by the constraints saturated by both
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$
+ (see the previous proposition) or neither \f$\vect{r}_1\f$ nor
+ \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$
+ is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$,
+ it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$.
+ If the rank is less than \f$d - 2\f$, the rank of
+ the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$)
+ and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$ is less
+ than \f$d - 1\f$. It means that \f$r\f$ is redundant (see
+ Section \ref prelims).
+ If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays,
+ they belong to a 2-dimensional face containing exactly two extreme rays
+ of \f$P\f$.
+ These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so
+ \f$\vect{r}\f$ is redundant.
+
+ \endif
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+dimension_type
+Polyhedron::conversion(Source_Linear_System& source,
+ const dimension_type start,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ dimension_type num_lines_or_equalities) {
+ typedef typename Dest_Linear_System::row_type dest_row_type;
+ typedef typename Source_Linear_System::row_type source_row_type;
+
+ // Constraints and generators must have the same dimension,
+ // otherwise the scalar products below will bomb.
+ PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+ const dimension_type source_space_dim = source.space_dimension();
+ const dimension_type source_num_rows = source.num_rows();
+ const dimension_type source_num_columns = source_space_dim
+ + (source.is_necessarily_closed() ? 1U : 2U);
+
+
+ dimension_type dest_num_rows = dest.num_rows();
+ // The rows removed from `dest' will be placed in this vector, so they
+ // can be recycled if needed.
+ std::vector<dest_row_type> recyclable_dest_rows;
+
+ using std::swap;
+
+ // By construction, the number of columns of `sat' is the same as
+ // the number of rows of `source'; also, the number of rows of `sat'
+ // is the same as the number of rows of `dest'.
+ PPL_ASSERT(source_num_rows == sat.num_columns());
+ PPL_ASSERT(dest_num_rows == sat.num_rows());
+
+ // If `start > 0', then we are converting the pending constraints.
+ PPL_ASSERT(start == 0 || start == source.first_pending_row());
+
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_o);
+
+ bool dest_sorted = dest.is_sorted();
+ const dimension_type dest_first_pending_row = dest.first_pending_row();
+
+ // This will contain the row indexes of the redundant rows of `source'.
+ std::vector<dimension_type> redundant_source_rows;
+
+ // Converting the sub-system of `source' having rows with indexes
+ // from `start' to the last one (i.e., `source_num_rows' - 1).
+ for (dimension_type k = start; k < source_num_rows; ++k) {
+ const source_row_type& source_k = source[k];
+
+ // `scalar_prod[i]' will contain the scalar product of the
+ // constraint `source_k' and the generator `dest_rows[i]'. This
+ // product is 0 if and only if the generator saturates the
+ // constraint.
+ PPL_DIRTY_TEMP(std::vector<Coefficient>, scalar_prod);
+ if (dest_num_rows > scalar_prod.size()) {
+ scalar_prod.insert(scalar_prod.end(),
+ dest_num_rows - scalar_prod.size(),
+ Coefficient_zero());
+ }
+ // `index_non_zero' will indicate the first generator in `dest_rows'
+ // that does not saturate the constraint `source_k'.
+ dimension_type index_non_zero = 0;
+ for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+ WEIGHT_BEGIN();
+ Scalar_Products::assign(scalar_prod[index_non_zero],
+ source_k,
+ dest.sys.rows[index_non_zero]);
+ WEIGHT_ADD_MUL(17, source_space_dim);
+ if (scalar_prod[index_non_zero] != 0)
+ // The generator does not saturate the constraint.
+ break;
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+ WEIGHT_BEGIN();
+ Scalar_Products::assign(scalar_prod[i], source_k, dest.sys.rows[i]);
+ WEIGHT_ADD_MUL(25, source_space_dim);
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+
+ // We first treat the case when `index_non_zero' is less than
+ // `num_lines_or_equalities', i.e., when the generator that
+ // does not saturate the constraint `source_k' is a line.
+ // The other case (described later) is when all the lines
+ // in `dest_rows' (i.e., all the rows having indexes less than
+ // `num_lines_or_equalities') do saturate the constraint.
+
+ if (index_non_zero < num_lines_or_equalities) {
+ // Since the generator `dest_rows[index_non_zero]' does not saturate
+ // the constraint `source_k', it can no longer be a line
+ // (see saturation rule in Section \ref prelims).
+ // Therefore, we first transform it to a ray.
+ dest.sys.rows[index_non_zero].set_is_ray_or_point_or_inequality();
+ // Of the two possible choices, we select the ray satisfying
+ // the constraint (namely, the ray whose scalar product
+ // with the constraint gives a positive result).
+ if (scalar_prod[index_non_zero] < 0) {
+ // The ray `dest_rows[index_non_zero]' lies on the wrong half-space:
+ // we change it to have the opposite direction.
+ neg_assign(scalar_prod[index_non_zero]);
+ neg_assign(dest.sys.rows[index_non_zero].expr);
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ }
+ // Having changed a line to a ray, we set `dest_rows' to be a
+ // non-sorted system, we decrement the number of lines of `dest_rows'
+ // and, if necessary, we move the new ray below all the remaining lines.
+ dest_sorted = false;
+ --num_lines_or_equalities;
+ if (index_non_zero != num_lines_or_equalities) {
+ swap(dest.sys.rows[index_non_zero],
+ dest.sys.rows[num_lines_or_equalities]);
+ swap(scalar_prod[index_non_zero],
+ scalar_prod[num_lines_or_equalities]);
+ }
+ const dest_row_type& dest_nle = dest.sys.rows[num_lines_or_equalities];
+
+ // Computing the new lineality space.
+ // Since each line must lie on the hyper-plane corresponding to
+ // the constraint `source_k', the scalar product between
+ // the line and the constraint must be 0.
+ // This property already holds for the lines having indexes
+ // between 0 and `index_non_zero' - 1.
+ // We have to consider the remaining lines, having indexes
+ // between `index_non_zero' and `num_lines_or_equalities' - 1.
+ // Each line that does not saturate the constraint has to be
+ // linearly combined with generator `dest_nle' so that the
+ // resulting new line saturates the constraint.
+ // Note that, by Observation 1 above, the resulting new line
+ // will still saturate all the constraints that were saturated by
+ // the old line.
+
+ Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities];
+ PPL_ASSERT(scalar_prod_nle != 0);
+ for (dimension_type
+ i = index_non_zero; i < num_lines_or_equalities; ++i) {
+ if (scalar_prod[i] != 0) {
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod_nle);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // dest[i][c] *= normalized_sp_n;
+ // dest[i][c] -= normalized_sp_i * dest_nle[c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ dest_row_type& dest_i = dest.sys.rows[i];
+ neg_assign(normalized_sp_i);
+ dest_i.expr.linear_combine(dest_nle.expr,
+ normalized_sp_o, normalized_sp_i);
+ dest_i.strong_normalize();
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ scalar_prod[i] = 0;
+ // dest_sorted has already been set to false.
+ }
+ }
+
+ // Computing the new pointed cone.
+ // Similarly to what we have done during the computation of
+ // the lineality space, we consider all the remaining rays
+ // (having indexes strictly greater than `num_lines_or_equalities')
+ // that do not saturate the constraint `source_k'. These rays
+ // are positively combined with the ray `dest_nle' so that the
+ // resulting new rays saturate the constraint.
+ for (dimension_type
+ i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) {
+ if (scalar_prod[i] != 0) {
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod_nle);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // dest[i][c] *= normalized_sp_n;
+ // dest[i][c] -= normalized_sp_i * dest_nle[c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ dest_row_type& dest_i = dest.sys.rows[i];
+ WEIGHT_BEGIN();
+ neg_assign(normalized_sp_i);
+ dest_i.expr.linear_combine(dest_nle.expr,
+ normalized_sp_o, normalized_sp_i);
+ dest_i.strong_normalize();
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ scalar_prod[i] = 0;
+ // `dest_sorted' has already been set to false.
+ WEIGHT_ADD_MUL(41, source_space_dim);
+ }
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ // Since the `scalar_prod_nle' is positive (by construction), it
+ // does not saturate the constraint `source_k'. Therefore, if
+ // the constraint is an inequality, we set to 1 the
+ // corresponding element of `sat' ...
+ Bit_Row& sat_nle = sat[num_lines_or_equalities];
+ if (source_k.is_ray_or_point_or_inequality())
+ sat_nle.set(k - redundant_source_rows.size());
+ // ... otherwise, the constraint is an equality which is
+ // violated by the generator `dest_nle': the generator has to be
+ // removed from `dest_rows'.
+ else {
+ --dest_num_rows;
+ swap(dest.sys.rows[num_lines_or_equalities],
+ dest.sys.rows[dest_num_rows]);
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+
+ swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+ swap(sat_nle, sat[dest_num_rows]);
+ // dest_sorted has already been set to false.
+ }
+ }
+ // Here we have `index_non_zero' >= `num_lines_or_equalities',
+ // so that all the lines in `dest_rows' saturate the constraint `source_k'.
+ else {
+ // First, we reorder the generators in `dest_rows' as follows:
+ // -# all the lines should have indexes between 0 and
+ // `num_lines_or_equalities' - 1 (this already holds);
+ // -# all the rays that saturate the constraint should have
+ // indexes between `num_lines_or_equalities' and
+ // `lines_or_equal_bound' - 1; these rays form the set Q=.
+ // -# all the rays that have a positive scalar product with the
+ // constraint should have indexes between `lines_or_equal_bound'
+ // and `sup_bound' - 1; these rays form the set Q+.
+ // -# all the rays that have a negative scalar product with the
+ // constraint should have indexes between `sup_bound' and
+ // `dest_num_rows' - 1; these rays form the set Q-.
+ dimension_type lines_or_equal_bound = num_lines_or_equalities;
+ dimension_type inf_bound = dest_num_rows;
+ // While we find saturating generators, we simply increment
+ // `lines_or_equal_bound'.
+ while (inf_bound > lines_or_equal_bound
+ && scalar_prod[lines_or_equal_bound] == 0)
+ ++lines_or_equal_bound;
+ dimension_type sup_bound = lines_or_equal_bound;
+ while (inf_bound > sup_bound) {
+ const int sp_sign = sgn(scalar_prod[sup_bound]);
+ if (sp_sign == 0) {
+ // This generator has to be moved in Q=.
+ swap(dest.sys.rows[sup_bound], dest.sys.rows[lines_or_equal_bound]);
+ swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+ swap(sat[sup_bound], sat[lines_or_equal_bound]);
+ ++lines_or_equal_bound;
+ ++sup_bound;
+ dest_sorted = false;
+ }
+ else if (sp_sign < 0) {
+ // This generator has to be moved in Q-.
+ --inf_bound;
+ swap(dest.sys.rows[sup_bound], dest.sys.rows[inf_bound]);
+ swap(sat[sup_bound], sat[inf_bound]);
+ swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+ dest_sorted = false;
+ }
+ else
+ // sp_sign > 0: this generator has to be moved in Q+.
+ ++sup_bound;
+ }
+
+ if (sup_bound == dest_num_rows) {
+ // Here the set Q- is empty.
+ // If the constraint is an inequality, then all the generators
+ // in Q= and Q+ satisfy the constraint. The constraint is redundant
+ // and it can be safely removed from the constraint system.
+ // This is why the `source' parameter is not declared `const'.
+ if (source_k.is_ray_or_point_or_inequality()) {
+ redundant_source_rows.push_back(k);
+ }
+ else {
+ // The constraint is an equality, so that all the generators
+ // in Q+ violate it. Since the set Q- is empty, we can simply
+ // remove from `dest_rows' all the generators of Q+.
+ PPL_ASSERT(dest_num_rows >= lines_or_equal_bound);
+ while (dest_num_rows != lines_or_equal_bound) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ }
+ else {
+ // The set Q- is not empty, i.e., at least one generator
+ // violates the constraint `source_k'.
+ // We have to further distinguish two cases:
+ if (sup_bound == num_lines_or_equalities) {
+ // The set Q+ is empty, so that all generators that satisfy
+ // the constraint also saturate it.
+ // We can simply remove from `dest_rows' all the generators in Q-.
+ PPL_ASSERT(dest_num_rows >= sup_bound);
+ while (dest_num_rows != sup_bound) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ else {
+ // The sets Q+ and Q- are both non-empty.
+ // The generators of the new pointed cone are all those satisfying
+ // the constraint `source_k' plus a set of new rays enjoying
+ // the following properties:
+ // -# they lie on the hyper-plane represented by the constraint
+ // -# they are obtained as a positive combination of two
+ // adjacent rays, the first taken from Q+ and the second
+ // taken from Q-.
+
+ // The adjacency property is necessary to have an irredundant
+ // set of new rays (see proposition 2).
+ const dimension_type bound = dest_num_rows;
+
+ // In the following loop,
+ // `i' runs through the generators in the set Q+ and
+ // `j' runs through the generators in the set Q-.
+ for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) {
+ for(dimension_type j = sup_bound; j < bound; ++j) {
+ // Checking if generators `dest_rows[i]' and `dest_rows[j]' are
+ // adjacent.
+ // If there exist another generator that saturates
+ // all the constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]', then they are NOT adjacent.
+ PPL_ASSERT(sat[i].last() == C_Integer<unsigned long>::max
+ || sat[i].last() < k);
+ PPL_ASSERT(sat[j].last() == C_Integer<unsigned long>::max
+ || sat[j].last() < k);
+
+ // Being the union of `sat[i]' and `sat[j]',
+ // `new_satrow' corresponds to a ray that saturates all the
+ // constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]'.
+ Bit_Row new_satrow(sat[i], sat[j]);
+
+ // Compute the number of common saturators.
+ // NOTE: this number has to be less than `k' because
+ // we are treating the `k'-th constraint.
+ const dimension_type num_common_satur
+ = k - redundant_source_rows.size() - new_satrow.count_ones();
+
+ // Even before actually creating the new ray as a
+ // positive combination of `dest_rows[i]' and `dest_rows[j]',
+ // we exploit saturation information to check if
+ // it can be an extremal ray. To this end, we refer
+ // to the definition of a minimal proper face
+ // (see comments in Polyhedron_defs.hh):
+ // an extremal ray saturates at least `n' - `t' - 1
+ // constraints, where `n' is the dimension of the space
+ // and `t' is the dimension of the lineality space.
+ // Since `n == source_num_columns - 1' and
+ // `t == num_lines_or_equalities', we obtain that
+ // an extremal ray saturates at least
+ // `source_num_columns - num_lines_or_equalities - 2'
+ // constraints.
+ if (num_common_satur
+ >= source_num_columns - num_lines_or_equalities - 2) {
+ // The minimal proper face rule is satisfied.
+ // Now we actually check for redundancy by computing
+ // adjacency information.
+ bool redundant = false;
+ WEIGHT_BEGIN();
+ for (dimension_type
+ l = num_lines_or_equalities; l < bound; ++l)
+ if (l != i && l != j
+ && subset_or_equal(sat[l], new_satrow)) {
+ // Found another generator saturating all the
+ // constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]'.
+ redundant = true;
+ break;
+ }
+ PPL_ASSERT(bound >= num_lines_or_equalities);
+ WEIGHT_ADD_MUL(15, bound - num_lines_or_equalities);
+ if (!redundant) {
+ // Adding the new ray to `dest_rows' and the corresponding
+ // saturation row to `sat'.
+ dest_row_type new_row;
+ if (recyclable_dest_rows.empty()) {
+ sat.add_recycled_row(new_satrow);
+ }
+ else {
+ swap(new_row, recyclable_dest_rows.back());
+ recyclable_dest_rows.pop_back();
+ new_row.set_space_dimension_no_ok(source_space_dim);
+ swap(sat[dest_num_rows], new_satrow);
+ }
+
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod[j]);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_j = scalar_prod[j] / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // new_row[c] = normalized_sp_i * dest[j][c];
+ // new_row[c] -= normalized_sp_j * dest[i][c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod[j],
+ normalized_sp_i,
+ normalized_sp_o);
+ WEIGHT_BEGIN();
+
+ neg_assign(normalized_sp_o);
+ new_row = dest.sys.rows[j];
+ // TODO: Check if the following assertions hold.
+ PPL_ASSERT(normalized_sp_i != 0);
+ PPL_ASSERT(normalized_sp_o != 0);
+ new_row.expr.linear_combine(dest.sys.rows[i].expr,
+ normalized_sp_i, normalized_sp_o);
+
+ WEIGHT_ADD_MUL(86, source_space_dim);
+ new_row.strong_normalize();
+ // Don't assert new_row.OK() here, because it may fail if
+ // the parameter `dest' contained a row that wasn't ok.
+ // Since we added a new generator to `dest_rows',
+ // we also add a new element to `scalar_prod';
+ // by construction, the new ray lies on the hyper-plane
+ // represented by the constraint `source_k'.
+ // Thus, the added scalar product is 0.
+ PPL_ASSERT(scalar_prod.size() >= dest_num_rows);
+ if (scalar_prod.size() <= dest_num_rows)
+ scalar_prod.push_back(Coefficient_zero());
+ else
+ scalar_prod[dest_num_rows] = Coefficient_zero();
+
+ dest.sys.rows.resize(dest.sys.rows.size() + 1);
+ swap(dest.sys.rows.back(), new_row);
+ // Increment the number of generators.
+ ++dest_num_rows;
+ } // if (!redundant)
+ }
+ }
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ // Now we substitute the rays in Q- (i.e., the rays violating
+ // the constraint) with the newly added rays.
+ dimension_type j;
+ if (source_k.is_ray_or_point_or_inequality()) {
+ // The constraint is an inequality:
+ // the violating generators are those in Q-.
+ j = sup_bound;
+ // For all the generators in Q+, set to 1 the corresponding
+ // entry for the constraint `source_k' in the saturation matrix.
+
+ // After the removal of redundant rows in `source', the k-th
+ // row will have index `new_k'.
+ const dimension_type new_k = k - redundant_source_rows.size();
+ for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+ sat[l].set(new_k);
+ }
+ else
+ // The constraint is an equality:
+ // the violating generators are those in the union of Q+ and Q-.
+ j = lines_or_equal_bound;
+
+ // Swapping the newly added rays
+ // (index `i' running through `dest_num_rows - 1' down-to `bound')
+ // with the generators violating the constraint
+ // (index `j' running through `j' up-to `bound - 1').
+ dimension_type i = dest_num_rows;
+ while (j < bound && i > bound) {
+ --i;
+ swap(dest.sys.rows[i], dest.sys.rows[j]);
+ swap(scalar_prod[i], scalar_prod[j]);
+ swap(sat[i], sat[j]);
+ ++j;
+ dest_sorted = false;
+ }
+ // Setting the number of generators in `dest':
+ // - if the number of generators violating the constraint
+ // is less than or equal to the number of the newly added
+ // generators, we assign `i' to `dest_num_rows' because
+ // all generators above this index are significant;
+ // - otherwise, we assign `j' to `dest_num_rows' because
+ // all generators below index `j-1' violates the constraint.
+ const dimension_type new_num_rows = (j == bound) ? i : j;
+ PPL_ASSERT(dest_num_rows >= new_num_rows);
+ while (dest_num_rows != new_num_rows) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ }
+ }
+ }
+
+ // We may have identified some redundant constraints in `source',
+ // which have been swapped at the end of the system.
+ if (redundant_source_rows.size() > 0) {
+ source.remove_rows(redundant_source_rows);
+ sat.remove_trailing_columns(redundant_source_rows.size());
+ }
+
+ // If `start == 0', then `source' was sorted and remained so.
+ // If otherwise `start > 0', then the two sub-system made by the
+ // non-pending rows and the pending rows, respectively, were both sorted.
+ // Thus, the overall system is sorted if and only if either
+ // `start == source_num_rows' (i.e., the second sub-system is empty)
+ // or the row ordering holds for the two rows at the boundary between
+ // the two sub-systems.
+ if (start > 0 && start < source.num_rows())
+ source.set_sorted(compare(source[start - 1], source[start]) <= 0);
+ // There are no longer pending constraints in `source'.
+ source.unset_pending_rows();
+
+ // We may have identified some redundant rays in `dest_rows',
+ // which have been swapped into recyclable_dest_rows.
+ if (!recyclable_dest_rows.empty()) {
+ const dimension_type num_removed_rows = recyclable_dest_rows.size();
+ sat.remove_trailing_rows(num_removed_rows);
+ }
+ if (dest_sorted)
+ // If the non-pending generators in `dest' are still declared to be
+ // sorted, then we have to also check for the sortedness of the
+ // pending generators.
+ for (dimension_type i = dest_first_pending_row; i < dest_num_rows; ++i)
+ if (compare(dest.sys.rows[i - 1], dest.sys.rows[i]) > 0) {
+ dest_sorted = false;
+ break;
+ }
+
+#ifndef NDEBUG
+ // The previous code can modify the rows' fields, exploiting the friendness.
+ // Check that all rows are OK now.
+ for (dimension_type i = dest.num_rows(); i-- > 0; )
+ PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+ dest.sys.index_first_pending = dest.num_rows();
+ dest.set_sorted(dest_sorted);
+ PPL_ASSERT(dest.sys.OK());
+
+ return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_conversion_templates_hh)
diff --git a/src/Polyhedron_defs.hh b/src/Polyhedron_defs.hh
new file mode 100644
index 0000000..ecc2bc6
--- /dev/null
+++ b/src/Polyhedron_defs.hh
@@ -0,0 +1,2863 @@
+/* Polyhedron class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_defs_hh
+#define PPL_Polyhedron_defs_hh 1
+
+#include "Polyhedron_types.hh"
+#include "globals_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "H79_Certificate_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Polyhedron
+ Writes a textual representation of \p ph on \p s:
+ <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+ <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+ a minimized system of constraints defining \p ph is written otherwise,
+ all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Polyhedron */
+void swap(Polyhedron& x, Polyhedron& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are the same polyhedron.
+
+ \relates Polyhedron
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are different polyhedra.
+
+ \relates Polyhedron
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns \c true if and only if
+ <code>ph.topology() == NECESSARILY_CLOSED</code>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_necessarily_closed_for_interfaces(const Polyhedron& ph);
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Polyhedron represents a convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ A polyhedron can be specified as either a finite system of constraints
+ or a finite system of generators (see Section \ref representation)
+ and it is always possible to obtain either representation.
+ That is, if we know the system of constraints, we can obtain
+ from this the system of generators that define the same polyhedron
+ and vice versa.
+ These systems can contain redundant members: in this case we say
+ that they are not in the minimal form.
+
+ Two key attributes of any polyhedron are its topological kind
+ (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+ and its space dimension (the dimension \f$n \in \Nset\f$ of
+ the enclosing vector space):
+
+ - all polyhedra, the empty ones included, are endowed with
+ a specific topology and space dimension;
+ - most operations working on a polyhedron and another object
+ (i.e., another polyhedron, a constraint or generator,
+ a set of variables, etc.) will throw an exception if
+ the polyhedron and the object are not both topology-compatible
+ and dimension-compatible (see Section \ref representation);
+ - the topology of a polyhedron cannot be changed;
+ rather, there are constructors for each of the two derived classes
+ that will build a new polyhedron with the topology of that class
+ from another polyhedron from either class and any topology;
+ - the only ways in which the space dimension of a polyhedron can
+ be changed are:
+ - <EM>explicit</EM> calls to operators provided for that purpose;
+ - standard copy, assignment and swap operators.
+
+ Note that four different polyhedra can be defined on
+ the zero-dimension space:
+ the empty polyhedron, either closed or NNC,
+ and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+ used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a polyhedron corresponding to
+ a square in \f$\Rset^2\f$, given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ C_Polyhedron ph(cs);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from a system of generators specifying
+ the four vertices of the square:
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 3*y));
+ gs.insert(point(3*x + 0*y));
+ gs.insert(point(3*x + 3*y));
+ C_Polyhedron ph(gs);
+ \endcode
+
+ \par Example 2
+ The following code builds an unbounded polyhedron
+ corresponding to a half-strip in \f$\Rset^2\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x - y <= 0);
+ cs.insert(x - y + 1 >= 0);
+ C_Polyhedron ph(cs);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from the system of generators specifying
+ the two vertices of the polyhedron and one ray:
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + y));
+ gs.insert(ray(x - y));
+ C_Polyhedron ph(gs);
+ \endcode
+
+ \par Example 3
+ The following code builds the polyhedron corresponding to
+ a half-plane by adding a single constraint
+ to the universe polyhedron in \f$\Rset^2\f$:
+ \code
+ C_Polyhedron ph(2);
+ ph.add_constraint(y >= 0);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from the empty polyhedron in the space \f$\Rset^2\f$
+ and inserting the appropriate generators
+ (a point, a ray and a line).
+ \code
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(0*x + 0*y));
+ ph.add_generator(ray(y));
+ ph.add_generator(line(x));
+ \endcode
+ Note that, although the above polyhedron has no vertices, we must add
+ one point, because otherwise the result of the Minkowski's sum
+ would be an empty polyhedron.
+ To avoid subtle errors related to the minimization process,
+ it is required that the first generator inserted in an empty
+ polyhedron is a point (otherwise, an exception is thrown).
+
+ \par Example 4
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_embed</CODE>:
+ \code
+ C_Polyhedron ph(1);
+ ph.add_constraint(x == 2);
+ ph.add_space_dimensions_and_embed(1);
+ \endcode
+ We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+ Then we add a single equality constraint,
+ thus obtaining the polyhedron corresponding to the singleton set
+ \f$\{ 2 \} \sseq \Rset\f$.
+ After the last line of code, the resulting polyhedron is
+ \f[
+ \bigl\{\,
+ (2, y)^\transpose \in \Rset^2
+ \bigm|
+ y \in \Rset
+ \,\bigr\}.
+ \f]
+
+ \par Example 5
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_project</CODE>:
+ \code
+ C_Polyhedron ph(1);
+ ph.add_constraint(x == 2);
+ ph.add_space_dimensions_and_project(1);
+ \endcode
+ The first two lines of code are the same as in Example 4 for
+ <CODE>add_space_dimensions_and_embed</CODE>.
+ After the last line of code, the resulting polyhedron is
+ the singleton set
+ \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+ \par Example 6
+ The following code shows the use of the function
+ <CODE>affine_image</CODE>:
+ \code
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(0*x + 0*y));
+ ph.add_generator(point(0*x + 3*y));
+ ph.add_generator(point(3*x + 0*y));
+ ph.add_generator(point(3*x + 3*y));
+ Linear_Expression expr = x + 4;
+ ph.affine_image(x, expr);
+ \endcode
+ In this example the starting polyhedron is a square in
+ \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+ expression is \f$x+4\f$. The resulting polyhedron is the same
+ square translated to the right. Moreover, if the affine
+ transformation for the same variable \p x is \f$x+y\f$:
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting polyhedron is a parallelogram with the height equal to
+ the side of the square and the oblique sides parallel to the line
+ \f$x-y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable; for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting polyhedron is a diagonal of the square.
+
+ \par Example 7
+ The following code shows the use of the function
+ <CODE>affine_preimage</CODE>:
+ \code
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(x <= 3);
+ ph.add_constraint(y >= 0);
+ ph.add_constraint(y <= 3);
+ Linear_Expression expr = x + 4;
+ ph.affine_preimage(x, expr);
+ \endcode
+ In this example the starting polyhedron, \p var and the affine
+ expression and the denominator are the same as in Example 6,
+ while the resulting polyhedron is again the same square,
+ but translated to the left.
+ Moreover, if the affine transformation for \p x is \f$x+y\f$
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting polyhedron is a parallelogram with the height equal to
+ the side of the square and the oblique sides parallel to the line
+ \f$x+y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable \p x, for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+ \par Example 8
+ For this example we use also the variables:
+ \code
+ Variable z(2);
+ Variable w(3);
+ \endcode
+ The following code shows the use of the function
+ <CODE>remove_space_dimensions</CODE>:
+ \code
+ Generator_System gs;
+ gs.insert(point(3*x + y + 0*z + 2*w));
+ C_Polyhedron ph(gs);
+ Variables_Set vars;
+ vars.insert(y);
+ vars.insert(z);
+ ph.remove_space_dimensions(vars);
+ \endcode
+ The starting polyhedron is the singleton set
+ \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+ the resulting polyhedron is
+ \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+ Be careful when removing space dimensions <EM>incrementally</EM>:
+ since dimensions are automatically renamed after each application
+ of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+ results can be obtained.
+ For instance, by using the following code we would obtain
+ a different result:
+ \code
+ set<Variable> vars1;
+ vars1.insert(y);
+ ph.remove_space_dimensions(vars1);
+ set<Variable> vars2;
+ vars2.insert(z);
+ ph.remove_space_dimensions(vars2);
+ \endcode
+ In this case, the result is the polyhedron
+ \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+ when removing the set of dimensions \p vars2
+ we are actually removing variable \f$w\f$ of the original polyhedron.
+ For the same reason, the operator \p remove_space_dimensions
+ is not idempotent: removing twice the same non-empty set of dimensions
+ is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+ //! The numeric type of coefficients.
+ typedef Coefficient coefficient_type;
+
+ //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns \c true indicating that this domain has methods that
+ can recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+protected:
+ //! Builds a polyhedron having the specified properties.
+ /*!
+ \param topol
+ The topology of the polyhedron;
+
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the polyhedron;
+
+ \param kind
+ Specifies whether the universe or the empty polyhedron has to be built.
+ */
+ Polyhedron(Topology topol,
+ dimension_type num_dimensions,
+ Degenerate_Element kind);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Polyhedron(const Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param cs
+ The system of constraints defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, const Constraint_System& cs);
+
+ //! Builds a polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p gs is incompatible with \p topol,
+ or if the system of generators is not empty but has no points.
+ */
+ Polyhedron(Topology topol, const Generator_System& gs);
+
+ //! Builds a polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p gs is incompatible with \p topol,
+ or if the system of generators is not empty but has no points.
+ */
+ Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds a polyhedron from a box.
+ /*!
+ This will use an algorithm whose complexity is polynomial and build
+ the smallest polyhedron with topology \p topol containing \p box.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param box
+ The box representing the polyhedron to be built;
+
+ \param complexity
+ This argument is ignored.
+ */
+ template <typename Interval>
+ Polyhedron(Topology topol, const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ Polyhedron& operator=(const Polyhedron& y);
+
+public:
+ //! \name Member Functions that Do Not Modify the Polyhedron
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns the system of constraints.
+ const Constraint_System& constraints() const;
+
+ //! Returns the system of constraints, with no redundant constraint.
+ const Constraint_System& minimized_constraints() const;
+
+ //! Returns the system of generators.
+ const Generator_System& generators() const;
+
+ //! Returns the system of generators, with no redundant generator.
+ const Generator_System& minimized_generators() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a system of (equality) congruences satisfied by \p *this,
+ with no redundant congruences and having the same affine dimension
+ as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the congruence \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is
+ an empty polyhedron.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a universe polyhedron.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a bounded polyhedron.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool contains(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool strictly_contains(const Polyhedron& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if \p *this satisfies all the
+ invariants and either \p check_not_empty is <CODE>false</CODE> or
+ \p *this is not empty.
+
+ \param check_not_empty
+ <CODE>true</CODE> if and only if, in addition to checking the
+ invariants, \p *this must be checked to be not empty.
+
+ The check is performed so as to intrude as little as possible. If
+ the library has been compiled with run-time assertions enabled,
+ error messages are written on <CODE>std::cerr</CODE> in case
+ invariants are violated. This is useful for the purpose of
+ debugging the library.
+ */
+ bool OK(bool check_not_empty = false) const;
+
+ //@} // Member Functions that Do Not Modify the Polyhedron
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ of \p *this (without minimizing the result).
+
+ \param c
+ The constraint that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of generator \p g to the system of generators
+ of \p *this (without minimizing the result).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are topology-incompatible or
+ dimension-incompatible, or if \p *this is an empty polyhedron and
+ \p g is not a point.
+ */
+ void add_generator(const Generator& g);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to \p *this,
+ if \p cg can be exactly represented by a polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ of if \p cg is a proper congruence which is neither a tautology,
+ nor a contradiction.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the system
+ of constraints of \p *this (without minimizing the result).
+
+ \param cs
+ Contains the constraints that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this (without minimizing the result).
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system
+ of generators of \p *this (without minimizing the result).
+
+ \param gs
+ Contains the generators that will be added to the system of
+ generators of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are topology-incompatible or
+ dimension-incompatible, or if \p *this is empty and the system of
+ generators \p gs is not empty, but has no points.
+ */
+ void add_generators(const Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators
+ of \p *this (without minimizing the result).
+
+ \param gs
+ The generator system to be added to \p *this. The generators in
+ \p gs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are topology-incompatible or
+ dimension-incompatible, or if \p *this is empty and the system of
+ generators \p gs is not empty, but has no points.
+
+ \warning
+ The only assumption that can be made on \p gs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_generators(Generator_System& gs);
+
+ /*! \brief
+ Adds a copy of the congruences in \p cgs to \p *this,
+ if all the congruences can be exactly represented by a polyhedron.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ of if there exists in \p cgs a proper congruence which is
+ neither a tautology, nor a contradiction.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds the congruences in \p cgs to \p *this,
+ if all the congruences can be exactly represented by a polyhedron.
+
+ \param cgs
+ The congruences to be added. Its elements may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ of if there exists in \p cgs a proper congruence which is
+ neither a tautology, nor a contradiction
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine \p *this.
+
+ \param cs
+ Contains the constraints used to refine the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ Contains the congruences used to refine the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines \p *this with the constraint expressed by \p left \f$<\f$
+ \p right if \p is_strict is set, with the constraint \p left \f$\leq\f$
+ \p right otherwise.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is on the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is on the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param is_strict
+ True if the comparison is strict.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ bool is_strict = false);
+
+ /*! \brief
+ Refines \p *this with the constraint expressed by \p left \f$\relsym\f$
+ \p right, where \f$\relsym\f$ is the relation symbol specified by
+ \p relsym..
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is on the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is on the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void refine_fp_interval_abstract_store(
+ Box< Interval<FP_Format, Interval_Info> >& store)
+ const;
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void intersection_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_hull_assign(const Polyhedron& y);
+
+ //! Same as poly_hull_assign(y).
+ void upper_bound_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this
+ the \ref Convex_Polyhedral_Difference "poly-difference"
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_difference_assign(const Polyhedron& y);
+
+ //! Same as poly_difference_assign(y).
+ void difference_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering the generators of a polyhedron, the
+ affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If constraints are up-to-date, it uses the specialized function
+ affine_preimage() (for the system of constraints)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq var} a_i x_i + b,
+ \f]
+ so that the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f]
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only generators remain
+ up-to-date.
+
+ In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+ the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+ matrix representing the points of the polyhedron and
+ \f[
+ P = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+ \vect{\lambda} \in \Rset^{m_1}_+,
+ \vect{\mu} \in \Rset^{m_2}_+,
+ \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+ \,\bigr\}
+ \f]
+ and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+ the resulting polyhedron is
+ \f[
+ P' = \bigl\{\,
+ (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+ \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+ \,\bigr\}.
+ \f]
+
+ Affine transformations are, for example:
+ - translations
+ - rotations
+ - symmetries.
+ \endif
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*!
+ Assigns to \p *this the
+ \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var is
+ not a space dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering constraints of a polyhedron, the affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If generators are up-to-date, then the specialized function
+ affine_image() is used (for the system of generators)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation, we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+ \f],
+ the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f].
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only constraints remain
+ up-to-date.
+
+ In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+ the constraints of the polyhedron, \f$T\f$ is the affine transformation
+ to apply to \f$P\f$ and
+ \f[
+ P = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ A\vect{x} \geq \vect{0}
+ \,\bigr\}.
+ \f]
+ The resulting polyhedron is
+ \f[
+ P' = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+ \bigm|
+ A'\vect{x} \geq \vect{0}
+ \,\bigr\},
+ \f]
+ where \f$A'\f$ is defined as follows:
+ \f[
+ {a'}_{ij}
+ = \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+ \quad \mathrm{for } j \neq \mathrm{var}; \\
+ \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+ \quad \text{for } j = \mathrm{var}.
+ \end{cases}
+ \f]
+ \endif
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void time_elapse_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this (the best approximation of) the result of
+ computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref limited_extrapolation "limited extrapolation"
+ between \p *this and \p y using the \ref BHRZ03_widening
+ "BHRZ03-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref bounded_extrapolation "bounded extrapolation"
+ between \p *this and \p y using the \ref BHRZ03_widening
+ "BHRZ03-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref H79_widening "H79_widening" between \p *this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ //! Same as H79_widening_assign(y, tp).
+ void widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref limited_extrapolation "limited extrapolation"
+ between \p *this and \p y using the \ref H79_widening
+ "H79-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void limited_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref bounded_extrapolation "bounded extrapolation"
+ between \p *this and \p y using the \ref H79_widening
+ "H79-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void bounded_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old polyhedron
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new polyhedron, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are not constrained.
+ For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+ and adding a third space dimension, the result will be the polyhedron
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cP
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new space dimensions to the polyhedron
+ and does not embed it in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new polyhedron, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are all constrained to be equal to 0.
+ For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+ and adding a third space dimension, the result will be the polyhedron
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cP
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Polyhedron& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that
+ the resulting space will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each space dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain
+ of the partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing the polyhedron.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Polyhedron();
+
+ /*! \brief
+ Swaps \p *this with polyhedron \p y.
+ (\p *this and \p y can be dimension-incompatible.)
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible.
+ */
+ void m_swap(Polyhedron& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+ static const Representation default_con_sys_repr = DENSE;
+ static const Representation default_gen_sys_repr = DENSE;
+
+ //! The system of constraints.
+ Constraint_System con_sys;
+
+ //! The system of generators.
+ Generator_System gen_sys;
+
+ //! The saturation matrix having constraints on its columns.
+ Bit_Matrix sat_c;
+
+ //! The saturation matrix having generators on its columns.
+ Bit_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+#include "Ph_Status_idefs.hh"
+#undef PPL_IN_Polyhedron_CLASS
+
+ //! The status flags to keep track of the polyhedron's internal state.
+ Status status;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ //! Returns the topological kind of the polyhedron.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the polyhedron
+ is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+
+ friend bool
+ Parma_Polyhedra_Library::Interfaces
+ ::is_necessarily_closed_for_interfaces(const Polyhedron&);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of constraints
+ of \p *this.
+
+ \param c The constraint to be added. If it is dimension-incompatible
+ with \p *this, the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ //! \name Private Verifiers: Verify if Individual Flags are Set
+ //@{
+
+ //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+ bool constraints_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+ bool generators_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+ /*!
+ Note that only \em weak minimization is entailed, so that
+ an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+ */
+ bool constraints_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is minimized.
+ /*!
+ Note that only \em weak minimization is entailed, so that
+ an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+ */
+ bool generators_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if there are pending constraints.
+ bool has_pending_constraints() const;
+
+ //! Returns <CODE>true</CODE> if there are pending generators.
+ bool has_pending_generators() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if there are
+ either pending constraints or pending generators.
+ */
+ bool has_something_pending() const;
+
+ //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+ bool can_have_something_pending() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+ is up-to-date.
+ */
+ bool sat_c_is_up_to_date() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+ is up-to-date.
+ */
+ bool sat_g_is_up_to_date() const;
+
+ //@} // Private Verifiers: Verify if Individual Flags are Set
+
+ //! \name State Flag Setters: Set Only the Specified Flags
+ //@{
+
+ /*! \brief
+ Sets \p status to express that the polyhedron is the universe
+ 0-dimension vector space, clearing all corresponding matrices.
+ */
+ void set_zero_dim_univ();
+
+ /*! \brief
+ Sets \p status to express that the polyhedron is empty,
+ clearing all corresponding matrices.
+ */
+ void set_empty();
+
+ //! Sets \p status to express that constraints are up-to-date.
+ void set_constraints_up_to_date();
+
+ //! Sets \p status to express that generators are up-to-date.
+ void set_generators_up_to_date();
+
+ //! Sets \p status to express that constraints are minimized.
+ void set_constraints_minimized();
+
+ //! Sets \p status to express that generators are minimized.
+ void set_generators_minimized();
+
+ //! Sets \p status to express that constraints are pending.
+ void set_constraints_pending();
+
+ //! Sets \p status to express that generators are pending.
+ void set_generators_pending();
+
+ //! Sets \p status to express that \p sat_c is up-to-date.
+ void set_sat_c_up_to_date();
+
+ //! Sets \p status to express that \p sat_g is up-to-date.
+ void set_sat_g_up_to_date();
+
+ //@} // State Flag Setters: Set Only the Specified Flags
+
+ //! \name State Flag Cleaners: Clear Only the Specified Flag
+ //@{
+
+ //! Clears the \p status flag indicating that the polyhedron is empty.
+ void clear_empty();
+
+ //! Sets \p status to express that constraints are no longer up-to-date.
+ /*!
+ This also implies that they are neither minimized
+ and both saturation matrices are no longer meaningful.
+ */
+ void clear_constraints_up_to_date();
+
+ //! Sets \p status to express that generators are no longer up-to-date.
+ /*!
+ This also implies that they are neither minimized
+ and both saturation matrices are no longer meaningful.
+ */
+ void clear_generators_up_to_date();
+
+ //! Sets \p status to express that constraints are no longer minimized.
+ void clear_constraints_minimized();
+
+ //! Sets \p status to express that generators are no longer minimized.
+ void clear_generators_minimized();
+
+ //! Sets \p status to express that there are no longer pending constraints.
+ void clear_pending_constraints();
+
+ //! Sets \p status to express that there are no longer pending generators.
+ void clear_pending_generators();
+
+ //! Sets \p status to express that \p sat_c is no longer up-to-date.
+ void clear_sat_c_up_to_date();
+
+ //! Sets \p status to express that \p sat_g is no longer up-to-date.
+ void clear_sat_g_up_to_date();
+
+ //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+ //! \name The Handling of Pending Rows
+ //@{
+
+ /*! \brief
+ Processes the pending rows of either description of the polyhedron
+ and obtains a minimized polyhedron.
+
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ bool process_pending() const;
+
+ //! Processes the pending constraints and obtains a minimized polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some pending constraints.
+ */
+ bool process_pending_constraints() const;
+
+ //! Processes the pending generators and obtains a minimized polyhedron.
+ /*!
+ It is assumed that the polyhedron does have some pending generators.
+ */
+ void process_pending_generators() const;
+
+ /*! \brief
+ Lazily integrates the pending descriptions of the polyhedron
+ to obtain a constraint system without pending rows.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ void remove_pending_to_obtain_constraints() const;
+
+ /*! \brief
+ Lazily integrates the pending descriptions of the polyhedron
+ to obtain a generator system without pending rows.
+
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ bool remove_pending_to_obtain_generators() const;
+
+ //@} // The Handling of Pending Rows
+
+ //! \name Updating and Sorting Matrices
+ //@{
+
+ //! Updates constraints starting from generators and minimizes them.
+ /*!
+ The resulting system of constraints is only partially sorted:
+ the equalities are in the upper part of the matrix,
+ while the inequalities in the lower part.
+ */
+ void update_constraints() const;
+
+ //! Updates generators starting from constraints and minimizes them.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ The resulting system of generators is only partially sorted:
+ the lines are in the upper part of the matrix,
+ while rays and points are in the lower part.
+ It is illegal to call this method when the Status field
+ already declares the polyhedron to be empty.
+ */
+ bool update_generators() const;
+
+ //! Updates \p sat_c using the updated constraints and generators.
+ /*!
+ It is assumed that constraints and generators are up-to-date
+ and minimized and that the Status field does not already flag
+ \p sat_c to be up-to-date.
+ The values of the saturation matrix are computed as follows:
+ \f[
+ \begin{cases}
+ sat\_c[i][j] = 0,
+ \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+ sat\_c[i][j] = 1,
+ \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+ \end{cases}
+ \f]
+ */
+ void update_sat_c() const;
+
+ //! Updates \p sat_g using the updated constraints and generators.
+ /*!
+ It is assumed that constraints and generators are up-to-date
+ and minimized and that the Status field does not already flag
+ \p sat_g to be up-to-date.
+ The values of the saturation matrix are computed as follows:
+ \f[
+ \begin{cases}
+ sat\_g[i][j] = 0,
+ \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+ sat\_g[i][j] = 1,
+ \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+ \end{cases}
+ \f]
+ */
+ void update_sat_g() const;
+
+ //! Sorts the matrix of constraints keeping status consistency.
+ /*!
+ It is assumed that constraints are up-to-date.
+ If at least one of the saturation matrices is up-to-date,
+ then \p sat_g is kept consistent with the sorted matrix
+ of constraints.
+ The method is declared \p const because reordering
+ the constraints does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_constraints() const;
+
+ //! Sorts the matrix of generators keeping status consistency.
+ /*!
+ It is assumed that generators are up-to-date.
+ If at least one of the saturation matrices is up-to-date,
+ then \p sat_c is kept consistent with the sorted matrix
+ of generators.
+ The method is declared \p const because reordering
+ the generators does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_generators() const;
+
+ //! Sorts the matrix of constraints and updates \p sat_c.
+ /*!
+ It is assumed that both constraints and generators
+ are up-to-date and minimized.
+ The method is declared \p const because reordering
+ the constraints does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_constraints_with_sat_c() const;
+
+ //! Sorts the matrix of generators and updates \p sat_g.
+ /*!
+ It is assumed that both constraints and generators
+ are up-to-date and minimized.
+ The method is declared \p const because reordering
+ the generators does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_generators_with_sat_g() const;
+
+ //@} // Updating and Sorting Matrices
+
+ //! \name Weak and Strong Minimization of Descriptions
+ //@{
+
+ //! Applies (weak) minimization to both the constraints and generators.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ Minimization is not attempted if the Status field already declares
+ both systems to be minimized.
+ */
+ bool minimize() const;
+
+ //! Applies strong minimization to the constraints of an NNC polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+ */
+ bool strongly_minimize_constraints() const;
+
+ //! Applies strong minimization to the generators of an NNC polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+ */
+ bool strongly_minimize_generators() const;
+
+ //! If constraints are up-to-date, obtain a simplified copy of them.
+ Constraint_System simplified_constraints() const;
+
+ //@} // Weak and Strong Minimization of Descriptions
+
+ enum Three_Valued_Boolean {
+ TVB_TRUE,
+ TVB_FALSE,
+ TVB_DONT_KNOW
+ };
+
+ //! Polynomial but incomplete equivalence test between polyhedra.
+ Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+ bool is_included_in(const Polyhedron& y) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! \name Widening- and Extrapolation-Related Functions
+ //@{
+
+ /*! \brief
+ Copies to \p cs_selection the constraints of \p y corresponding
+ to the definition of the CH78-widening of \p *this and \p y.
+ */
+ void select_CH78_constraints(const Polyhedron& y,
+ Constraint_System& cs_selection) const;
+
+ /*! \brief
+ Splits the constraints of `x' into two subsets, depending on whether
+ or not they are selected to compute the \ref H79_widening "H79-widening"
+ of \p *this and \p y.
+ */
+ void select_H79_constraints(const Polyhedron& y,
+ Constraint_System& cs_selected,
+ Constraint_System& cs_not_selected) const;
+
+ bool BHRZ03_combining_constraints(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79,
+ const Constraint_System& x_minus_H79_cs);
+
+ bool BHRZ03_evolving_points(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79);
+
+ bool BHRZ03_evolving_rays(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79);
+
+ static void modify_according_to_evolution(Linear_Expression& ray,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given linear systems.
+ /*!
+ \param sys1
+ The linear system to which columns are added;
+
+ \param sys2
+ The linear system to which rows and columns are added;
+
+ \param sat1
+ The saturation matrix whose columns are indexed by the rows of
+ \p sys1. On entry it is up-to-date;
+
+ \param sat2
+ The saturation matrix whose columns are indexed by the rows of \p
+ sys2;
+
+ \param add_dim
+ The number of space dimensions to add.
+
+ Adds new space dimensions to the vector space modifying the linear
+ systems and saturation matrices.
+ This function is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE> and
+ <CODE>add_space_dimensions_and_project()</CODE>, passing the
+ linear system of constraints and that of generators (and the
+ corresponding saturation matrices) in different order (see those
+ methods for details).
+ */
+ template <typename Linear_System1, typename Linear_System2>
+ static void add_space_dimensions(Linear_System1& sys1,
+ Linear_System2& sys2,
+ Bit_Matrix& sat1,
+ Bit_Matrix& sat2,
+ dimension_type add_dim);
+
+ //! \name Minimization-Related Static Member Functions
+ //@{
+
+ //! Builds and simplifies constraints from generators (or vice versa).
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static bool minimize(bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System1, typename Source_Linear_System2,
+ typename Dest_Linear_System>
+ static bool add_and_minimize(bool con_to_gen,
+ Source_Linear_System1& source1,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ const Source_Linear_System2& source2);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa. The given constraints are in \p source.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static bool add_and_minimize(bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat);
+
+ //! Performs the conversion from constraints to generators and vice versa.
+ // Detailed Doxygen comment to be found in file conversion.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static dimension_type conversion(Source_Linear_System& source,
+ dimension_type start,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ dimension_type num_lines_or_equalities);
+
+ /*! \brief
+ Uses Gauss' elimination method to simplify the result of
+ <CODE>conversion()</CODE>.
+ */
+ // Detailed Doxygen comment to be found in file simplify.cc.
+ template <typename Linear_System1>
+ static dimension_type simplify(Linear_System1& sys, Bit_Matrix& sat);
+
+ //@} // Minimization-Related Static Member Functions
+
+ /*! \brief
+ Pointer to an array used by simplify().
+
+ Holds (between class initialization and finalization) a pointer to
+ an array, allocated with operator new[](), of
+ simplify_num_saturators_size elements.
+ */
+ static dimension_type* simplify_num_saturators_p;
+
+ /*! \brief
+ Dimension of an array used by simplify().
+
+ Holds (between class initialization and finalization) the size of the
+ array pointed to by simplify_num_saturators_p.
+ */
+ static size_t simplify_num_saturators_size;
+
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+ template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+ template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+ friend class Parma_Polyhedra_Library::Grid;
+ friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+ friend class Parma_Polyhedra_Library::H79_Certificate;
+
+protected:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Current implementation is based on (a variant of) Algorithm 8.1 in
+ A. Bemporad, K. Fukuda, and F. D. Torrisi
+ <em>Convexity Recognition of the Union of Polyhedra</em>
+ Technical Report AUT00-13, ETH Zurich, 2000
+
+ \note
+ It is assumed that \p *this and \p y are topologically closed
+ and dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool BFT00_poly_hull_assign_if_exact(const Polyhedron& y);
+
+ bool BHZ09_poly_hull_assign_if_exact(const Polyhedron& y);
+ bool BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y);
+ bool BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \name Exception Throwers
+ //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+ void throw_invalid_argument(const char* method, const char* reason) const;
+
+ void throw_topology_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const;
+ void throw_topology_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_topology_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_topology_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_topology_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System& gs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System& gs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const;
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: the following three methods need to be static, because they
+ // can be called inside constructors (before actually constructing the
+ // polyhedron object).
+ static dimension_type
+ check_space_dimension_overflow(dimension_type dim, dimension_type max,
+ const Topology topol,
+ const char* method, const char* reason);
+
+ static dimension_type
+ check_space_dimension_overflow(dimension_type dim, const Topology topol,
+ const char* method, const char* reason);
+
+ template <typename Object>
+ static Object&
+ check_obj_space_dimension_overflow(Object& input, Topology topol,
+ const char* method, const char* reason);
+
+ void throw_invalid_generator(const char* method,
+ const char* g_name) const;
+
+ void throw_invalid_generators(const char* method,
+ const char* gs_name) const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p *vars_p.
+
+ \param vars_p
+ When nonzero, points with non-integer coordinates for the
+ variables/space-dimensions contained in \p *vars_p can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set* vars_p,
+ Complexity_Class complexity);
+
+ //! Helper function that overapproximates an interval linear form.
+ /*!
+ \param lf
+ The linear form on intervals with floating point boundaries to approximate.
+ ALL of its coefficients MUST be bounded.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param result
+ Used to store the result.
+
+ This function makes \p result become a linear form that is a correct
+ approximation of \p lf under the constraints specified by \p *this.
+ The resulting linear form has the property that all of its variable
+ coefficients have a non-significant upper bound and can thus be
+ considered as singletons.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void overapproximate_linear_form(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result);
+
+ /*! \brief
+ Helper function that makes \p result become a Linear_Expression obtained
+ by normalizing the denominators in \p lf.
+
+ \param lf
+ The linear form on intervals with floating point boundaries to normalize.
+ It should be the result of an application of static method
+ <CODE>overapproximate_linear_form</CODE>.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param result
+ Used to store the result.
+
+ This function ignores the upper bound of intervals in \p lf,
+ so that in fact \p result can be seen as \p lf multiplied by a proper
+ normalization constant.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ static void convert_to_integer_expression(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& result);
+
+ //! Normalization helper function.
+ /*!
+ \param lf
+ The linear form on intervals with floating point boundaries to normalize.
+ It should be the result of an application of static method
+ <CODE>overapproximate_linear_form</CODE>.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param res
+ Stores the normalized linear form, except its inhomogeneous term.
+
+ \param res_low_coeff
+ Stores the lower boundary of the inhomogeneous term of the result.
+
+ \param res_hi_coeff
+ Stores the higher boundary of the inhomogeneous term of the result.
+
+ \param denominator
+ Becomes the common denominator of \p res_low_coeff, \p res_hi_coeff
+ and all coefficients in \p res.
+
+ Results are obtained by normalizing denominators in \p lf, ignoring
+ the upper bounds of variable coefficients in \p lf.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ static void
+ convert_to_integer_expressions(const Linear_Form<Interval<FP_Format,
+ Interval_Info> >&
+ lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& res,
+ Coefficient& res_low_coeff,
+ Coefficient& res_hi_coeff,
+ Coefficient& denominator);
+
+ template <typename Linear_System1, typename Row2>
+ static bool
+ add_to_system_and_check_independence(Linear_System1& eq_sys,
+ const Row2& eq);
+
+ /*! \brief
+ Assuming \p *this is NNC, assigns to \p *this the result of the
+ "positive time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign_impl(const Polyhedron& y);
+};
+
+#include "Ph_Status_inlines.hh"
+#include "Polyhedron_inlines.hh"
+#include "Polyhedron_templates.hh"
+#include "Polyhedron_chdims_templates.hh"
+#include "Polyhedron_conversion_templates.hh"
+#include "Polyhedron_minimize_templates.hh"
+#include "Polyhedron_simplify_templates.hh"
+
+#endif // !defined(PPL_Polyhedron_defs_hh)
diff --git a/src/Polyhedron_inlines.hh b/src/Polyhedron_inlines.hh
new file mode 100644
index 0000000..f543e9c
--- /dev/null
+++ b/src/Polyhedron_inlines.hh
@@ -0,0 +1,459 @@
+/* Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_inlines_hh
+#define PPL_Polyhedron_inlines_hh 1
+
+#include "Generator_defs.hh"
+#include "compiler.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+ return space_dim;
+}
+
+inline int32_t
+Polyhedron::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+ using std::min;
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return min(std::numeric_limits<dimension_type>::max() - 1,
+ min(Constraint_System::max_space_dimension(),
+ Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline Topology
+Polyhedron::topology() const {
+ // We can check either one of the two matrices.
+ // (`con_sys' is slightly better, since it is placed at offset 0.)
+ return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+ // We can check either one of the two matrices.
+ // (`con_sys' is slightly better, since it is placed at offset 0.)
+ return con_sys.is_necessarily_closed();
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+ poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+ poly_difference_assign(y);
+}
+
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+ H79_widening_assign(y, tp);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::m_swap(Polyhedron& y) {
+ if (topology() != y.topology())
+ throw_topology_incompatible("swap(y)", "y", y);
+ using std::swap;
+ swap(con_sys, y.con_sys);
+ swap(gen_sys, y.gen_sys);
+ swap(sat_c, y.sat_c);
+ swap(sat_g, y.sat_g);
+ swap(status, y.status);
+ swap(space_dim, y.space_dim);
+}
+
+/*! \relates Polyhedron */
+inline void
+swap(Polyhedron& x, Polyhedron& y) {
+ x.m_swap(y);
+}
+
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+ return true;
+}
+
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+ return false;
+}
+
+inline bool
+Polyhedron::marked_empty() const {
+ return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+ return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+ return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+ return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+ return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+ return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+ return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+ return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+ return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+ return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+ return constraints_are_minimized()
+ && generators_are_minimized()
+ && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline bool
+Polyhedron::is_empty() const {
+ if (marked_empty())
+ return true;
+ // Try a fast-fail test: if generators are up-to-date and
+ // there are no pending constraints, then the generator system
+ // (since it is well formed) contains a point.
+ if (generators_are_up_to_date() && !has_pending_constraints())
+ return false;
+ return !minimize();
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+ status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+ set_constraints_up_to_date();
+ status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+ set_generators_up_to_date();
+ status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+ status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+ status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+ status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+ status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+ status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+ status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+ status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+ status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+ status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+ status.reset_sat_c_up_to_date();
+ // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+ status.reset_sat_g_up_to_date();
+ // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+ clear_pending_constraints();
+ clear_constraints_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ status.reset_c_up_to_date();
+ // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+ clear_pending_generators();
+ clear_generators_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ status.reset_g_up_to_date();
+ // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+ PPL_ASSERT(space_dim > 0 && !marked_empty());
+ PPL_ASSERT(has_something_pending());
+
+ if (has_pending_constraints())
+ return process_pending_constraints();
+
+ PPL_ASSERT(has_pending_generators());
+ process_pending_generators();
+ return true;
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ Generator g(point());
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ Generator g(point());
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+ PPL_ASSERT(constraints_are_up_to_date());
+ Constraint_System cs(con_sys);
+ if (cs.num_pending_rows() > 0)
+ cs.unset_pending_rows();
+ if (has_pending_constraints() || !constraints_are_minimized())
+ cs.simplify();
+ return cs;
+}
+
+inline Congruence_System
+Polyhedron::congruences() const {
+ return Congruence_System(minimized_constraints());
+}
+
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+ return Congruence_System(minimized_constraints());
+}
+
+inline void
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right, false);
+ refine_with_linear_form_inequality(right, left, false);
+ break;
+ case LESS_THAN:
+ refine_with_linear_form_inequality(left, right, true);
+ break;
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right, false);
+ break;
+ case GREATER_THAN:
+ refine_with_linear_form_inequality(right, left, true);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left, false);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::
+refine_fp_interval_abstract_store(
+ Box< Interval<FP_Format, Interval_Info> >& store) const {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+ return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+ const Polyhedron& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(Complexity_Class complexity) {
+ const Variables_Set* const p_vs = 0;
+ drop_some_non_integer_points(p_vs, complexity);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ drop_some_non_integer_points(&vars, complexity);
+}
+
+
+namespace Interfaces {
+
+inline bool
+is_necessarily_closed_for_interfaces(const Polyhedron& ph) {
+ return ph.is_necessarily_closed();
+}
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_inlines_hh)
diff --git a/src/Polyhedron_minimize_templates.hh b/src/Polyhedron_minimize_templates.hh
new file mode 100644
index 0000000..7a268f8
--- /dev/null
+++ b/src/Polyhedron_minimize_templates.hh
@@ -0,0 +1,437 @@
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_minimize_templates_hh
+#define PPL_Polyhedron_minimize_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ <CODE>true</CODE> if the polyhedron is empty, <CODE>false</CODE>
+ otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source represents the constraints,
+ <CODE>false</CODE> otherwise;
+
+ \param source
+ The given system, which is not empty;
+
+ \param dest
+ The system to build and minimize;
+
+ \param sat
+ The saturation matrix.
+
+ \p dest is not <CODE>const</CODE> because it will be built (and then
+ modified) during minimize(). Also, \p sat and \p source are
+ not <CODE>const</CODE> because the former will be built during
+ \p dest creation and the latter will maybe be sorted and modified by
+ <CODE>conversion()</CODE> and <CODE>simplify()</CODE>.
+
+ \p sat has the generators on its columns and the constraints on its rows
+ if \p con_to_gen is <CODE>true</CODE>, otherwise it has the generators on
+ its rows and the constraints on its columns.
+
+ Given \p source, this function builds (by means of
+ <CODE>conversion()</CODE>) \p dest and then simplifies (invoking
+ <CODE>simplify()</CODE>) \p source, erasing redundant rows.
+ For the sequel we assume that \p source is the system of constraints
+ and \p dest is the system of generators.
+ This will simplify the description of the function; the dual case is
+ similar.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::minimize(const bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat) {
+
+ typedef typename Dest_Linear_System::row_type dest_row_type;
+
+ // Topologies have to agree.
+ PPL_ASSERT(source.topology() == dest.topology());
+ // `source' cannot be empty: even if it is an empty constraint system,
+ // representing the universe polyhedron, homogenization has added
+ // the positive constraint. It also cannot be an empty generator system,
+ // since this function is always called starting from a non-empty
+ // polyhedron.
+ PPL_ASSERT(!source.has_no_rows());
+
+ // Sort the source system, if necessary.
+ if (!source.is_sorted())
+ source.sort_rows();
+
+ // Initialization of the system of generators `dest'.
+ // The algorithm works incrementally and we haven't seen any
+ // constraint yet: as a consequence, `dest' should describe
+ // the universe polyhedron of the appropriate dimension.
+ // To this end, we initialize it to the identity matrix of dimension
+ // `source.num_columns()': the rows represent the lines corresponding
+ // to the canonical basis of the vector space.
+ dimension_type dest_num_rows
+ = source.topology() == NECESSARILY_CLOSED ? source.space_dimension() + 1
+ : source.space_dimension() + 2;
+
+ dest.clear();
+ dest.set_space_dimension(source.space_dimension());
+
+ // Initialize `dest' to the identity matrix.
+ for (dimension_type i = 0; i < dest_num_rows; ++i) {
+ Linear_Expression expr;
+ expr.set_space_dimension(dest_num_rows - 1);
+ if (i == 0)
+ expr += 1;
+ else
+ expr += Variable(i - 1);
+ dest_row_type dest_i(expr, dest_row_type::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+ if (dest.topology() == NOT_NECESSARILY_CLOSED)
+ dest_i.mark_as_not_necessarily_closed();
+ dest.sys.insert_no_ok(dest_i, Recycle_Input());
+ }
+ // The identity matrix `dest' is not sorted (see the sorting rules
+ // in Constrant.cc and Generator.cc).
+ dest.set_sorted(false);
+
+ // NOTE: the system `dest', as it is now, is not a _legal_ system of
+ // generators, because in the first row we have a line with a
+ // non-zero divisor (which should only happen for
+ // points). However, this is NOT a problem, because `source'
+ // necessarily contains the positivity constraint (or a
+ // combination of it with another constraint) which will
+ // restore things as they should be.
+
+
+ // Building a saturation matrix and initializing it by setting
+ // all of its elements to zero. This matrix will be modified together
+ // with `dest' during the conversion.
+ // NOTE: since we haven't seen any constraint yet, the relevant
+ // portion of `tmp_sat' is the sub-matrix consisting of
+ // the first 0 columns: thus the relevant portion correctly
+ // characterizes the initial saturation information.
+ Bit_Matrix tmp_sat(dest_num_rows, source.num_rows());
+
+ // By invoking the function conversion(), we populate `dest' with
+ // the generators characterizing the polyhedron described by all
+ // the constraints in `source'.
+ // The `start' parameter is zero (we haven't seen any constraint yet)
+ // and the 5th parameter (representing the number of lines in `dest'),
+ // by construction, is equal to `dest_num_rows'.
+ const dimension_type num_lines_or_equalities
+ = conversion(source, 0U, dest, tmp_sat, dest_num_rows);
+ // conversion() may have modified the number of rows in `dest'.
+ dest_num_rows = dest.num_rows();
+
+#ifndef NDEBUG
+ for (dimension_type i = dest.num_rows(); i-- > 0; )
+ PPL_ASSERT(dest[i].OK());
+#endif
+
+ // Checking if the generators in `dest' represent an empty polyhedron:
+ // the polyhedron is empty if there are no points
+ // (because rays, lines and closure points need a supporting point).
+ // Points can be detected by looking at:
+ // - the divisor, for necessarily closed polyhedra;
+ // - the epsilon coordinate, for NNC polyhedra.
+ dimension_type first_point;
+ if (dest.is_necessarily_closed()) {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.inhomogeneous_term() > 0)
+ break;
+ }
+ else {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+ break;
+ }
+
+ if (first_point == dest_num_rows)
+ if (con_to_gen)
+ // No point has been found: the polyhedron is empty.
+ return true;
+ else {
+ // Here `con_to_gen' is false: `dest' is a system of constraints.
+ // In this case the condition `first_point == dest_num_rows'
+ // actually means that all the constraints in `dest' have their
+ // inhomogeneous term equal to 0.
+ // This is an ILLEGAL situation, because it implies that
+ // the constraint system `dest' lacks the positivity constraint
+ // and no linear combination of the constraints in `dest'
+ // can reintroduce the positivity constraint.
+ PPL_UNREACHABLE;
+ return false;
+ }
+ else {
+ // A point has been found: the polyhedron is not empty.
+ // Now invoking simplify() to remove all the redundant constraints
+ // from the system `source'.
+ // Since the saturation matrix `tmp_sat' returned by conversion()
+ // has rows indexed by generators (the rows of `dest') and columns
+ // indexed by constraints (the rows of `source'), we have to
+ // transpose it to obtain the saturation matrix needed by simplify().
+ sat.transpose_assign(tmp_sat);
+ simplify(source, sat);
+ return false;
+ }
+}
+
+
+/*!
+ \return
+ <CODE>true</CODE> if the obtained polyhedron is empty,
+ <CODE>false</CODE> otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source1 and \p source2 are system of
+ constraints, <CODE>false</CODE> otherwise;
+
+ \param source1
+ The first element of the given DD pair;
+
+ \param dest
+ The second element of the given DD pair;
+
+ \param sat
+ The saturation matrix that bind \p source1 to \p dest;
+
+ \param source2
+ The new system of generators or constraints.
+
+ It is assumed that \p source1 and \p source2 are sorted and have
+ no pending rows. It is also assumed that \p dest has no pending rows.
+ On entry, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of \p source1.
+ On exit, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of the system obtained
+ by merging \p source1 and \p source2.
+
+ Let us suppose we want to add some constraints to a given system of
+ constraints \p source1. This method, given a minimized double description
+ pair (\p source1, \p dest) and a system of new constraints \p source2,
+ modifies \p source1 by adding to it the constraints of \p source2 that
+ are not in \p source1. Then, by invoking
+ <CODE>add_and_minimize(bool, Linear_System_Class&, Linear_System_Class&, Bit_Matrix&)</CODE>,
+ processes the added constraints obtaining a new DD pair.
+
+ This method treats also the dual case, i.e., adding new generators to
+ a previous system of generators. In this case \p source1 contains the
+ old generators, \p source2 the new ones and \p dest is the system
+ of constraints in the given minimized DD pair.
+
+ Since \p source2 contains the constraints (or the generators) that
+ will be added to \p source1, it is constant: it will not be modified.
+*/
+template <typename Source_Linear_System1, typename Source_Linear_System2,
+ typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+ Source_Linear_System1& source1,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ const Source_Linear_System2& source2) {
+ // `source1' and `source2' cannot be empty.
+ PPL_ASSERT(!source1.has_no_rows() && !source2.has_no_rows());
+ // `source1' and `source2' must have the same number of columns
+ // to be merged.
+ PPL_ASSERT(source1.num_columns() == source2.num_columns());
+ // `source1' and `source2' are fully sorted.
+ PPL_ASSERT(source1.is_sorted() && source1.num_pending_rows() == 0);
+ PPL_ASSERT(source2.is_sorted() && source2.num_pending_rows() == 0);
+ PPL_ASSERT(dest.num_pending_rows() == 0);
+
+ const dimension_type old_source1_num_rows = source1.num_rows();
+ // `k1' and `k2' run through the rows of `source1' and `source2', resp.
+ dimension_type k1 = 0;
+ dimension_type k2 = 0;
+ dimension_type source2_num_rows = source2.num_rows();
+ while (k1 < old_source1_num_rows && k2 < source2_num_rows) {
+ // Add to `source1' the constraints from `source2', as pending rows.
+ // We exploit the property that initially both `source1' and `source2'
+ // are sorted and index `k1' only scans the non-pending rows of `source1',
+ // so that it is not influenced by the pending rows appended to it.
+ // This way no duplicate (i.e., trivially redundant) constraint
+ // is introduced in `source1'.
+ const int cmp = compare(source1[k1], source2[k2]);
+ if (cmp == 0) {
+ // We found the same row: there is no need to add `source2[k2]'.
+ ++k2;
+ // By sortedness, since `k1 < old_source1_num_rows',
+ // we can increment index `k1' too.
+ ++k1;
+ }
+ else if (cmp < 0)
+ // By sortedness, we can increment `k1'.
+ ++k1;
+ else {
+ // Here `cmp > 0'.
+ // By sortedness, `source2[k2]' cannot be in `source1'.
+ // We add it as a pending row of `source1' (sortedness unaffected).
+ source1.add_pending_row(source2[k2]);
+ // We can increment `k2'.
+ ++k2;
+ }
+ }
+ // Have we scanned all the rows in `source2'?
+ if (k2 < source2_num_rows)
+ // By sortedness, all the rows in `source2' having indexes
+ // greater than or equal to `k2' were not in `source1'.
+ // We add them as pending rows of 'source1' (sortedness not affected).
+ for ( ; k2 < source2_num_rows; ++k2)
+ source1.add_pending_row(source2[k2]);
+
+ if (source1.num_pending_rows() == 0)
+ // No row was appended to `source1', because all the constraints
+ // in `source2' were already in `source1'.
+ // There is nothing left to do ...
+ return false;
+
+ return add_and_minimize(con_to_gen, source1, dest, sat);
+}
+
+/*!
+ \return
+ <CODE>true</CODE> if the obtained polyhedron is empty,
+ <CODE>false</CODE> otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source is a system of constraints,
+ <CODE>false</CODE> otherwise;
+
+ \param source
+ The first element of the given DD pair. It also contains the pending
+ rows to be processed;
+
+ \param dest
+ The second element of the given DD pair. It cannot have pending rows;
+
+ \param sat
+ The saturation matrix that bind the upper part of \p source to \p dest.
+
+ On entry, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the non-pending rows of \p source.
+ On exit, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of \p source.
+
+ Let us suppose that \p source is a system of constraints.
+ This method assumes that the non-pending part of \p source and
+ system \p dest form a double description pair in minimal form and
+ will build a new DD pair in minimal form by processing the pending
+ constraints in \p source. To this end, it will call
+ <CODE>conversion()</CODE>) and <CODE>simplify</CODE>.
+
+ This method treats also the dual case, i.e., processing pending
+ generators. In this case \p source contains generators and \p dest
+ is the system of constraints corresponding to the non-pending part
+ of \p source.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat) {
+ PPL_ASSERT(source.num_pending_rows() > 0);
+ PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+ PPL_ASSERT(source.is_sorted());
+
+ // First, pad the saturation matrix with new columns (of zeroes)
+ // to accommodate for the pending rows of `source'.
+ sat.resize(dest.num_rows(), source.num_rows());
+
+ // Incrementally compute the new system of generators.
+ // Parameter `start' is set to the index of the first pending constraint.
+ const dimension_type num_lines_or_equalities
+ = conversion(source, source.first_pending_row(),
+ dest, sat,
+ dest.num_lines_or_equalities());
+
+ // conversion() may have modified the number of rows in `dest'.
+ const dimension_type dest_num_rows = dest.num_rows();
+
+ // Checking if the generators in `dest' represent an empty polyhedron:
+ // the polyhedron is empty if there are no points
+ // (because rays, lines and closure points need a supporting point).
+ // Points can be detected by looking at:
+ // - the divisor, for necessarily closed polyhedra;
+ // - the epsilon coordinate, for NNC polyhedra.
+ dimension_type first_point;
+ if (dest.is_necessarily_closed()) {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.inhomogeneous_term() > 0)
+ break;
+ }
+ else {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+ break;
+ }
+
+ if (first_point == dest_num_rows)
+ if (con_to_gen)
+ // No point has been found: the polyhedron is empty.
+ return true;
+ else {
+ // Here `con_to_gen' is false: `dest' is a system of constraints.
+ // In this case the condition `first_point == dest_num_rows'
+ // actually means that all the constraints in `dest' have their
+ // inhomogeneous term equal to 0.
+ // This is an ILLEGAL situation, because it implies that
+ // the constraint system `dest' lacks the positivity constraint
+ // and no linear combination of the constraints in `dest'
+ // can reintroduce the positivity constraint.
+ PPL_UNREACHABLE;
+ return false;
+ }
+ else {
+ // A point has been found: the polyhedron is not empty.
+ // Now invoking `simplify()' to remove all the redundant constraints
+ // from the system `source'.
+ // Since the saturation matrix `sat' returned by `conversion()'
+ // has rows indexed by generators (the rows of `dest') and columns
+ // indexed by constraints (the rows of `source'), we have to
+ // transpose it to obtain the saturation matrix needed by `simplify()'.
+ sat.transpose();
+ simplify(source, sat);
+ // Transposing back.
+ sat.transpose();
+ return false;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_minimize_templates_hh)
diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc
new file mode 100644
index 0000000..8d455cb
--- /dev/null
+++ b/src/Polyhedron_nonpublic.cc
@@ -0,0 +1,2597 @@
+/* Polyhedron class implementation
+ (non-inline private or protected functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Linear_Form_defs.hh"
+#include "C_Integer.hh"
+#include "assert.hh"
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+ \brief
+ Controls the laziness level of the implementation.
+
+ Temporarily used in a few of the function implementations to
+ switch to an even more lazy algorithm. To be removed as soon as
+ we collect enough information to decide which is the better
+ implementation alternative.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+ const dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(num_dimensions <= max_space_dimension());
+
+ if (kind == EMPTY)
+ status.set_empty();
+ else if (num_dimensions > 0) {
+ con_sys.add_low_level_constraints();
+ con_sys.adjust_topology_and_space_dimension(topol, num_dimensions);
+ set_constraints_minimized();
+ }
+ space_dim = num_dimensions;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Polyhedron& y, Complexity_Class)
+ : con_sys(y.topology(), default_con_sys_repr),
+ gen_sys(y.topology(), default_gen_sys_repr),
+ status(y.status),
+ space_dim(y.space_dim) {
+ // Being a protected method, we simply assert that topologies do match.
+ PPL_ASSERT(topology() == y.topology());
+ if (y.constraints_are_up_to_date())
+ con_sys.assign_with_pending(y.con_sys);
+ if (y.generators_are_up_to_date())
+ gen_sys.assign_with_pending(y.gen_sys);
+ if (y.sat_c_is_up_to_date())
+ sat_c = y.sat_c;
+ if (y.sat_g_is_up_to_date())
+ sat_g = y.sat_g;
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Constraint_System& cs)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(cs.space_dimension() <= max_space_dimension());
+
+ // TODO: this implementation is just an executable specification.
+ Constraint_System cs_copy = cs;
+
+ // Try to adapt `cs_copy' to the required topology.
+ const dimension_type cs_copy_space_dim = cs_copy.space_dimension();
+ if (!cs_copy.adjust_topology_and_space_dimension(topol, cs_copy_space_dim))
+ throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(cs)"
+ : "NNC_Polyhedron(cs)", "cs", cs_copy);
+
+ // Set the space dimension.
+ space_dim = cs_copy_space_dim;
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cs_copy'.
+ using std::swap;
+ swap(con_sys, cs_copy);
+ if (con_sys.num_pending_rows() > 0) {
+ // Even though `cs_copy' has pending constraints, since the
+ // generators of the polyhedron are not up-to-date, the
+ // polyhedron cannot have pending constraints. By integrating
+ // the pending part of `con_sys' we may loose sortedness.
+ con_sys.set_sorted(false);
+ con_sys.unset_pending_rows();
+ }
+ con_sys.add_low_level_constraints();
+ set_constraints_up_to_date();
+ }
+ else {
+ // Here `space_dim == 0'.
+ // See if an inconsistent constraint has been passed.
+ for (dimension_type i = cs_copy.num_rows(); i-- > 0; )
+ if (cs_copy[i].is_inconsistent()) {
+ // Inconsistent constraint found: the polyhedron is empty.
+ set_empty();
+ break;
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+ Constraint_System& cs,
+ Recycle_Input)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(cs.space_dimension() <= max_space_dimension());
+
+ // Try to adapt `cs' to the required topology.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim))
+ throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(cs, recycle)"
+ : "NNC_Polyhedron(cs, recycle)", "cs", cs);
+
+ // Set the space dimension.
+ space_dim = cs_space_dim;
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cs'.
+ swap(con_sys, cs);
+ if (con_sys.num_pending_rows() > 0) {
+ // Even though `cs' has pending constraints, since the generators
+ // of the polyhedron are not up-to-date, the polyhedron cannot
+ // have pending constraints. By integrating the pending part
+ // of `con_sys' we may loose sortedness.
+ con_sys.unset_pending_rows();
+ con_sys.set_sorted(false);
+ }
+ con_sys.add_low_level_constraints();
+ set_constraints_up_to_date();
+ }
+ else {
+ // Here `space_dim == 0'.
+
+ // See if an inconsistent constraint has been passed.
+ for (dimension_type i = cs.num_rows(); i-- > 0; )
+ if (cs[i].is_inconsistent()) {
+ // Inconsistent constraint found: the polyhedron is empty.
+ set_empty();
+ break;
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& gs)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(gs.space_dimension() <= max_space_dimension());
+
+ // An empty set of generators defines the empty polyhedron.
+ if (gs.has_no_rows()) {
+ space_dim = gs.space_dimension();
+ status.set_empty();
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Non-empty valid generator systems have a supporting point, at least.
+ if (!gs.has_points())
+ throw_invalid_generators((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(gs)"
+ : "NNC_Polyhedron(gs)", "gs");
+
+ // TODO: this implementation is just an executable specification.
+ Generator_System gs_copy = gs;
+
+ const dimension_type gs_copy_space_dim = gs_copy.space_dimension();
+ // Try to adapt `gs_copy' to the required topology.
+ if (!gs_copy.adjust_topology_and_space_dimension(topol, gs_copy_space_dim))
+ throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(gs)"
+ : "NNC_Polyhedron(gs)", "gs", gs_copy);
+
+ if (gs_copy_space_dim > 0) {
+ // Stealing the rows from `gs_copy'.
+ using std::swap;
+ swap(gen_sys, gs_copy);
+ // In a generator system describing a NNC polyhedron,
+ // for each point we must also have the corresponding closure point.
+ if (topol == NOT_NECESSARILY_CLOSED)
+ gen_sys.add_corresponding_closure_points();
+ if (gen_sys.num_pending_rows() > 0) {
+ // Even though `gs_copy' has pending generators, since the
+ // constraints of the polyhedron are not up-to-date, the
+ // polyhedron cannot have pending generators. By integrating the
+ // pending part of `gen_sys' we may lose sortedness.
+ gen_sys.set_sorted(false);
+ gen_sys.unset_pending_rows();
+ }
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+
+ // Set the space dimension.
+ space_dim = gs_copy_space_dim;
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Here `gs_copy.num_rows > 0' and `gs_copy_space_dim == 0':
+ // we already checked for both the topology-compatibility
+ // and the supporting point.
+ space_dim = 0;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+ Generator_System& gs,
+ Recycle_Input)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ PPL_ASSERT(gs.space_dimension() <= max_space_dimension());
+
+ // An empty set of generators defines the empty polyhedron.
+ if (gs.has_no_rows()) {
+ space_dim = gs.space_dimension();
+ status.set_empty();
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Non-empty valid generator systems have a supporting point, at least.
+ if (!gs.has_points())
+ throw_invalid_generators((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(gs, recycle)"
+ : "NNC_Polyhedron(gs, recycle)", "gs");
+
+ const dimension_type gs_space_dim = gs.space_dimension();
+ // Try to adapt `gs' to the required topology.
+ if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim))
+ throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+ ? "C_Polyhedron(gs, recycle)"
+ : "NNC_Polyhedron(gs, recycle)", "gs", gs);
+
+ if (gs_space_dim > 0) {
+ // Stealing the rows from `gs'.
+ swap(gen_sys, gs);
+ // In a generator system describing a NNC polyhedron,
+ // for each point we must also have the corresponding closure point.
+ if (topol == NOT_NECESSARILY_CLOSED)
+ gen_sys.add_corresponding_closure_points();
+ if (gen_sys.num_pending_rows() > 0) {
+ // Even though `gs' has pending generators, since the constraints
+ // of the polyhedron are not up-to-date, the polyhedron cannot
+ // have pending generators. By integrating the pending part
+ // of `gen_sys' we may loose sortedness.
+ gen_sys.set_sorted(false);
+ gen_sys.unset_pending_rows();
+ }
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+
+ // Set the space dimension.
+ space_dim = gs_space_dim;
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Here `gs.num_rows > 0' and `gs_space_dim == 0':
+ // we already checked for both the topology-compatibility
+ // and the supporting point.
+ space_dim = 0;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron&
+PPL::Polyhedron::operator=(const Polyhedron& y) {
+ // Being a protected method, we simply assert that topologies do match.
+ PPL_ASSERT(topology() == y.topology());
+ space_dim = y.space_dim;
+ if (y.marked_empty())
+ set_empty();
+ else if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ status = y.status;
+ if (y.constraints_are_up_to_date())
+ con_sys.assign_with_pending(y.con_sys);
+ if (y.generators_are_up_to_date())
+ gen_sys.assign_with_pending(y.gen_sys);
+ if (y.sat_c_is_up_to_date())
+ sat_c = y.sat_c;
+ if (y.sat_g_is_up_to_date())
+ sat_g = y.sat_g;
+ }
+ return *this;
+}
+
+PPL::Polyhedron::Three_Valued_Boolean
+PPL::Polyhedron::quick_equivalence_test(const Polyhedron& y) const {
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(topology() == y.topology());
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+ const Polyhedron& x = *this;
+
+ if (x.is_necessarily_closed()) {
+ if (!x.has_something_pending() && !y.has_something_pending()) {
+ bool css_normalized = false;
+ if (x.constraints_are_minimized() && y.constraints_are_minimized()) {
+ // Equivalent minimized constraint systems have:
+ // - the same number of constraints; ...
+ if (x.con_sys.num_rows() != y.con_sys.num_rows())
+ return Polyhedron::TVB_FALSE;
+ // - the same number of equalities; ...
+ const dimension_type x_num_equalities = x.con_sys.num_equalities();
+ if (x_num_equalities != y.con_sys.num_equalities())
+ return Polyhedron::TVB_FALSE;
+ // - if there are no equalities, they have the same constraints.
+ // Delay this test: try cheaper tests on generators first.
+ css_normalized = (x_num_equalities == 0);
+ }
+
+ if (x.generators_are_minimized() && y.generators_are_minimized()) {
+ // Equivalent minimized generator systems have:
+ // - the same number of generators; ...
+ if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
+ return Polyhedron::TVB_FALSE;
+ // - the same number of lines; ...
+ const dimension_type x_num_lines = x.gen_sys.num_lines();
+ if (x_num_lines != y.gen_sys.num_lines())
+ return Polyhedron::TVB_FALSE;
+ // - if there are no lines, they have the same generators.
+ if (x_num_lines == 0) {
+ // Sort the two systems and check for syntactic identity.
+ x.obtain_sorted_generators();
+ y.obtain_sorted_generators();
+ if (x.gen_sys == y.gen_sys)
+ return Polyhedron::TVB_TRUE;
+ else
+ return Polyhedron::TVB_FALSE;
+ }
+ }
+
+ if (css_normalized) {
+ // Sort the two systems and check for identity.
+ x.obtain_sorted_constraints();
+ y.obtain_sorted_constraints();
+ if (x.con_sys == y.con_sys)
+ return Polyhedron::TVB_TRUE;
+ else
+ return Polyhedron::TVB_FALSE;
+ }
+ }
+ }
+ return Polyhedron::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Polyhedron::is_included_in(const Polyhedron& y) const {
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(topology() == y.topology());
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+ const Polyhedron& x = *this;
+
+ // `x' cannot have pending constraints, because we need its generators.
+ if (x.has_pending_constraints() && !x.process_pending_constraints())
+ return true;
+ // `y' cannot have pending generators, because we need its constraints.
+ if (y.has_pending_generators())
+ y.process_pending_generators();
+
+#if BE_LAZY
+ if (!x.generators_are_up_to_date() && !x.update_generators())
+ return true;
+ if (!y.constraints_are_up_to_date())
+ y.update_constraints();
+#else
+ if (!x.generators_are_minimized())
+ x.minimize();
+ if (!y.constraints_are_minimized())
+ y.minimize();
+#endif
+
+ PPL_ASSERT_HEAVY(x.OK());
+ PPL_ASSERT_HEAVY(y.OK());
+
+ const Generator_System& gs = x.gen_sys;
+ const Constraint_System& cs = y.con_sys;
+
+ if (x.is_necessarily_closed())
+ // When working with necessarily closed polyhedra,
+ // `x' is contained in `y' if and only if all the generators of `x'
+ // satisfy all the inequalities and saturate all the equalities of `y'.
+ // This comes from the definition of a polyhedron as the set of
+ // vectors satisfying a constraint system and the fact that all
+ // vectors in `x' can be obtained by suitably combining its generators.
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[i];
+ if (c.is_inequality()) {
+ for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+ const Generator& g = gs[j];
+ const int sp_sign = Scalar_Products::sign(c, g);
+ if (g.is_line()) {
+ if (sp_sign != 0)
+ return false;
+ }
+ else
+ // `g' is a ray or a point.
+ if (sp_sign < 0)
+ return false;
+ }
+ }
+ else {
+ // `c' is an equality.
+ for (dimension_type j = gs.num_rows(); j-- > 0; )
+ if (Scalar_Products::sign(c, gs[j]) != 0)
+ return false;
+ }
+ }
+ else {
+ // Here we have an NNC polyhedron: using the reduced scalar product,
+ // which ignores the epsilon coefficient.
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[i];
+ switch (c.type()) {
+ case Constraint::NONSTRICT_INEQUALITY:
+ for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+ const Generator& g = gs[j];
+ const int sp_sign = Scalar_Products::reduced_sign(c, g);
+ if (g.is_line()) {
+ if (sp_sign != 0)
+ return false;
+ }
+ else
+ // `g' is a ray or a point or a closure point.
+ if (sp_sign < 0)
+ return false;
+ }
+ break;
+ case Constraint::EQUALITY:
+ for (dimension_type j = gs.num_rows(); j-- > 0; )
+ if (Scalar_Products::reduced_sign(c, gs[j]) != 0)
+ return false;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+ const Generator& g = gs[j];
+ const int sp_sign = Scalar_Products::reduced_sign(c, g);
+ switch (g.type()) {
+ case Generator::POINT:
+ // If a point violates or saturates a strict inequality
+ // (when ignoring the epsilon coefficients) then it is
+ // not included in the polyhedron.
+ if (sp_sign <= 0)
+ return false;
+ break;
+ case Generator::LINE:
+ // Lines have to saturate all constraints.
+ if (sp_sign != 0)
+ return false;
+ break;
+ case Generator::RAY:
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ // The generator is a ray or closure point: usual test.
+ if (sp_sign < 0)
+ return false;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ // Inclusion holds.
+ return true;
+}
+
+bool
+PPL::Polyhedron::bounds(const Linear_Expression& expr,
+ const bool from_above) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+
+ // A zero-dimensional or empty polyhedron bounds everything.
+ if (space_dim == 0
+ || marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ return true;
+
+ // The polyhedron has updated, possibly pending generators.
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& g = gen_sys[i];
+ // Only lines and rays in `*this' can cause `expr' to be unbounded.
+ if (g.is_line_or_ray()) {
+ const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+ if (sp_sign != 0
+ && (g.is_line()
+ || (from_above && sp_sign > 0)
+ || (!from_above && sp_sign < 0)))
+ // `*this' does not bound `expr'.
+ return false;
+ }
+ }
+ // No sources of unboundedness have been found for `expr'
+ // in the given direction.
+ return true;
+}
+
+bool
+PPL::Polyhedron::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included,
+ Generator& g) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+
+ // Deal with zero-dim polyhedra first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ g = point();
+ return true;
+ }
+ }
+
+ // For an empty polyhedron we simply return false.
+ if (marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ return false;
+
+ // The polyhedron has updated, possibly pending generators.
+ // The following loop will iterate through the generator
+ // to find the extremum.
+ PPL_DIRTY_TEMP(mpq_class, extremum);
+
+ // True if we have no other candidate extremum to compare with.
+ bool first_candidate = true;
+
+ // To store the position of the current candidate extremum.
+ PPL_UNINITIALIZED(dimension_type, ext_position);
+
+ // Whether the current candidate extremum is included or not.
+ PPL_UNINITIALIZED(bool, ext_included);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& gen_sys_i = gen_sys[i];
+ Scalar_Products::homogeneous_assign(sp, expr, gen_sys_i);
+ // Lines and rays in `*this' can cause `expr' to be unbounded.
+ if (gen_sys_i.is_line_or_ray()) {
+ const int sp_sign = sgn(sp);
+ if (sp_sign != 0
+ && (gen_sys_i.is_line()
+ || (maximize && sp_sign > 0)
+ || (!maximize && sp_sign < 0)))
+ // `expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // We have a point or a closure point.
+ PPL_ASSERT(gen_sys_i.is_point() || gen_sys_i.is_closure_point());
+ // Notice that we are ignoring the constant term in `expr' here.
+ // We will add it to the extremum as soon as we find it.
+ PPL_DIRTY_TEMP(mpq_class, candidate);
+ assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+ assign_r(candidate.get_den(), gen_sys_i.expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ candidate.canonicalize();
+ const bool g_is_point = gen_sys_i.is_point();
+ if (first_candidate
+ || (maximize
+ && (candidate > extremum
+ || (g_is_point
+ && !ext_included
+ && candidate == extremum)))
+ || (!maximize
+ && (candidate < extremum
+ || (g_is_point
+ && !ext_included
+ && candidate == extremum)))) {
+ // We have a (new) candidate extremum.
+ first_candidate = false;
+ extremum = candidate;
+ ext_position = i;
+ ext_included = g_is_point;
+ }
+ }
+ }
+
+ // Add in the constant term in `expr'.
+ PPL_DIRTY_TEMP(mpz_class, n);
+ assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ extremum += n;
+
+ // The polyhedron is bounded in the right direction and we have
+ // computed the extremum: write the result into the caller's structures.
+ PPL_ASSERT(!first_candidate);
+ // FIXME: avoid these temporaries, if possible.
+ // This can be done adding an `assign' function working on native
+ // and checked or an operator= that have on one side a checked and
+ // on the other a native or checked.
+ // The reason why now we can't use operator= is the fact that we
+ // still can have Coefficient defined to mpz_class (and not
+ // Checked_Number<mpz_class>).
+ ext_n = Coefficient(extremum.get_num());
+ ext_d = Coefficient(extremum.get_den());
+ included = ext_included;
+ g = gen_sys[ext_position];
+
+ return true;
+}
+
+void
+PPL::Polyhedron::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+ space_dim = 0;
+ con_sys.clear();
+ gen_sys.clear();
+}
+
+void
+PPL::Polyhedron::set_empty() {
+ status.set_empty();
+ // The polyhedron is empty: we can thus throw away everything.
+ con_sys.clear();
+ gen_sys.clear();
+ sat_c.clear();
+ sat_g.clear();
+}
+
+bool
+PPL::Polyhedron::process_pending_constraints() const {
+ PPL_ASSERT(space_dim > 0 && !marked_empty());
+ PPL_ASSERT(has_pending_constraints() && !has_pending_generators());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // Integrate the pending part of the system of constraints and minimize.
+ // We need `sat_c' up-to-date and `con_sys' sorted (together with `sat_c').
+ if (!x.sat_c_is_up_to_date())
+ x.sat_c.transpose_assign(x.sat_g);
+ if (!x.con_sys.is_sorted())
+ x.obtain_sorted_constraints_with_sat_c();
+ // We sort in place the pending constraints, erasing those constraints
+ // that also occur in the non-pending part of `con_sys'.
+ x.con_sys.sort_pending_and_remove_duplicates();
+ if (x.con_sys.num_pending_rows() == 0) {
+ // All pending constraints were duplicates.
+ x.clear_pending_constraints();
+ PPL_ASSERT_HEAVY(OK(true));
+ return true;
+ }
+
+ const bool empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+ PPL_ASSERT(x.con_sys.num_pending_rows() == 0);
+
+ if (empty)
+ x.set_empty();
+ else {
+ x.clear_pending_constraints();
+ x.clear_sat_g_up_to_date();
+ x.set_sat_c_up_to_date();
+ }
+ PPL_ASSERT_HEAVY(OK(!empty));
+ return !empty;
+}
+
+void
+PPL::Polyhedron::process_pending_generators() const {
+ PPL_ASSERT(space_dim > 0 && !marked_empty());
+ PPL_ASSERT(has_pending_generators() && !has_pending_constraints());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // Integrate the pending part of the system of generators and minimize.
+ // We need `sat_g' up-to-date and `gen_sys' sorted (together with `sat_g').
+ if (!x.sat_g_is_up_to_date())
+ x.sat_g.transpose_assign(x.sat_c);
+ if (!x.gen_sys.is_sorted())
+ x.obtain_sorted_generators_with_sat_g();
+ // We sort in place the pending generators, erasing those generators
+ // that also occur in the non-pending part of `gen_sys'.
+ x.gen_sys.sort_pending_and_remove_duplicates();
+ if (x.gen_sys.num_pending_rows() == 0) {
+ // All pending generators were duplicates.
+ x.clear_pending_generators();
+ PPL_ASSERT_HEAVY(OK(true));
+ return;
+ }
+
+ add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+ PPL_ASSERT(x.gen_sys.num_pending_rows() == 0);
+
+ x.clear_pending_generators();
+ x.clear_sat_c_up_to_date();
+ x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::remove_pending_to_obtain_constraints() const {
+ PPL_ASSERT(has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // If the polyhedron has pending constraints, simply unset them.
+ if (x.has_pending_constraints()) {
+ // Integrate the pending constraints, which are possibly not sorted.
+ x.con_sys.set_sorted(false);
+ x.con_sys.unset_pending_rows();
+ x.clear_pending_constraints();
+ x.clear_constraints_minimized();
+ x.clear_generators_up_to_date();
+ }
+ else {
+ PPL_ASSERT(x.has_pending_generators());
+ // We must process the pending generators and obtain the
+ // corresponding system of constraints.
+ x.process_pending_generators();
+ }
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+bool
+PPL::Polyhedron::remove_pending_to_obtain_generators() const {
+ PPL_ASSERT(has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // If the polyhedron has pending generators, simply unset them.
+ if (x.has_pending_generators()) {
+ // Integrate the pending generators, which are possibly not sorted.
+ x.gen_sys.set_sorted(false);
+ x.gen_sys.unset_pending_rows();
+ x.clear_pending_generators();
+ x.clear_generators_minimized();
+ x.clear_constraints_up_to_date();
+ PPL_ASSERT_HEAVY(OK(true));
+ return true;
+ }
+ else {
+ PPL_ASSERT(x.has_pending_constraints());
+ // We must integrate the pending constraints and obtain the
+ // corresponding system of generators.
+ return x.process_pending_constraints();
+ }
+}
+
+void
+PPL::Polyhedron::update_constraints() const {
+ PPL_ASSERT(space_dim > 0);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(generators_are_up_to_date());
+ // We assume the polyhedron has no pending constraints or generators.
+ PPL_ASSERT(!has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ minimize(false, x.gen_sys, x.con_sys, x.sat_c);
+ // `sat_c' is the only saturation matrix up-to-date.
+ x.set_sat_c_up_to_date();
+ x.clear_sat_g_up_to_date();
+ // The system of constraints and the system of generators
+ // are minimized.
+ x.set_constraints_minimized();
+ x.set_generators_minimized();
+}
+
+bool
+PPL::Polyhedron::update_generators() const {
+ PPL_ASSERT(space_dim > 0);
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(constraints_are_up_to_date());
+ // We assume the polyhedron has no pending constraints or generators.
+ PPL_ASSERT(!has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ // If the system of constraints is not consistent the
+ // polyhedron is empty.
+ const bool empty = minimize(true, x.con_sys, x.gen_sys, x.sat_g);
+ if (empty)
+ x.set_empty();
+ else {
+ // `sat_g' is the only saturation matrix up-to-date.
+ x.set_sat_g_up_to_date();
+ x.clear_sat_c_up_to_date();
+ // The system of constraints and the system of generators
+ // are minimized.
+ x.set_constraints_minimized();
+ x.set_generators_minimized();
+ }
+ return !empty;
+}
+
+void
+PPL::Polyhedron::update_sat_c() const {
+ PPL_ASSERT(constraints_are_minimized());
+ PPL_ASSERT(generators_are_minimized());
+ PPL_ASSERT(!sat_c_is_up_to_date());
+
+ // We only consider non-pending rows.
+ const dimension_type csr = con_sys.first_pending_row();
+ const dimension_type gsr = gen_sys.first_pending_row();
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // The columns of `sat_c' represent the constraints and
+ // its rows represent the generators: resize accordingly.
+ x.sat_c.resize(gsr, csr);
+ for (dimension_type i = gsr; i-- > 0; )
+ for (dimension_type j = csr; j-- > 0; ) {
+ const int sp_sign = Scalar_Products::sign(con_sys[j], gen_sys[i]);
+ // The negativity of this scalar product would mean
+ // that the generator `gen_sys[i]' violates the constraint
+ // `con_sys[j]' and it is not possible because both generators
+ // and constraints are up-to-date.
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign > 0)
+ // `gen_sys[i]' satisfies (without saturate) `con_sys[j]'.
+ x.sat_c[i].set(j);
+ else
+ // `gen_sys[i]' saturates `con_sys[j]'.
+ x.sat_c[i].clear(j);
+ }
+ x.set_sat_c_up_to_date();
+}
+
+void
+PPL::Polyhedron::update_sat_g() const {
+ PPL_ASSERT(constraints_are_minimized());
+ PPL_ASSERT(generators_are_minimized());
+ PPL_ASSERT(!sat_g_is_up_to_date());
+
+ // We only consider non-pending rows.
+ const dimension_type csr = con_sys.first_pending_row();
+ const dimension_type gsr = gen_sys.first_pending_row();
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // The columns of `sat_g' represent generators and its
+ // rows represent the constraints: resize accordingly.
+ x.sat_g.resize(csr, gsr);
+ for (dimension_type i = csr; i-- > 0; )
+ for (dimension_type j = gsr; j-- > 0; ) {
+ const int sp_sign = Scalar_Products::sign(con_sys[i], gen_sys[j]);
+ // The negativity of this scalar product would mean
+ // that the generator `gen_sys[j]' violates the constraint
+ // `con_sys[i]' and it is not possible because both generators
+ // and constraints are up-to-date.
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign > 0)
+ // `gen_sys[j]' satisfies (without saturate) `con_sys[i]'.
+ x.sat_g[i].set(j);
+ else
+ // `gen_sys[j]' saturates `con_sys[i]'.
+ x.sat_g[i].clear(j);
+ }
+ x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints() const {
+ PPL_ASSERT(constraints_are_up_to_date());
+ // `con_sys' will be sorted up to `index_first_pending'.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ if (!x.con_sys.is_sorted()) {
+ if (x.sat_g_is_up_to_date()) {
+ // Sorting constraints keeping `sat_g' consistent.
+ x.con_sys.sort_and_remove_with_sat(x.sat_g);
+ // `sat_c' is not up-to-date anymore.
+ x.clear_sat_c_up_to_date();
+ }
+ else if (x.sat_c_is_up_to_date()) {
+ // Using `sat_c' to obtain `sat_g', then it is like previous case.
+ x.sat_g.transpose_assign(x.sat_c);
+ x.con_sys.sort_and_remove_with_sat(x.sat_g);
+ x.set_sat_g_up_to_date();
+ x.clear_sat_c_up_to_date();
+ }
+ else
+ // If neither `sat_g' nor `sat_c' are up-to-date,
+ // we just sort the constraints.
+ x.con_sys.sort_rows();
+ }
+
+ PPL_ASSERT(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators() const {
+ PPL_ASSERT(generators_are_up_to_date());
+ // `gen_sys' will be sorted up to `index_first_pending'.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ if (!x.gen_sys.is_sorted()) {
+ if (x.sat_c_is_up_to_date()) {
+ // Sorting generators keeping 'sat_c' consistent.
+ x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+ // `sat_g' is not up-to-date anymore.
+ x.clear_sat_g_up_to_date();
+ }
+ else if (x.sat_g_is_up_to_date()) {
+ // Obtaining `sat_c' from `sat_g' and proceeding like previous case.
+ x.sat_c.transpose_assign(x.sat_g);
+ x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+ x.set_sat_c_up_to_date();
+ x.clear_sat_g_up_to_date();
+ }
+ else
+ // If neither `sat_g' nor `sat_c' are up-to-date, we just sort
+ // the generators.
+ x.gen_sys.sort_rows();
+ }
+
+ PPL_ASSERT(gen_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints_with_sat_c() const {
+ PPL_ASSERT(constraints_are_up_to_date());
+ PPL_ASSERT(constraints_are_minimized());
+ // `con_sys' will be sorted up to `index_first_pending'.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ // At least one of the saturation matrices must be up-to-date.
+ if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+ x.update_sat_c();
+
+ if (x.con_sys.is_sorted()) {
+ if (x.sat_c_is_up_to_date())
+ // If constraints are already sorted and sat_c is up to
+ // date there is nothing to do.
+ return;
+ }
+ else {
+ if (!x.sat_g_is_up_to_date()) {
+ // If constraints are not sorted and sat_g is not up-to-date
+ // we obtain sat_g from sat_c (that has to be up-to-date)...
+ x.sat_g.transpose_assign(x.sat_c);
+ x.set_sat_g_up_to_date();
+ }
+ // ... and sort it together with constraints.
+ x.con_sys.sort_and_remove_with_sat(x.sat_g);
+ }
+ // Obtaining sat_c from sat_g.
+ x.sat_c.transpose_assign(x.sat_g);
+ x.set_sat_c_up_to_date();
+ // Constraints are sorted now.
+ x.con_sys.set_sorted(true);
+
+ PPL_ASSERT(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators_with_sat_g() const {
+ PPL_ASSERT(generators_are_up_to_date());
+ // `gen_sys' will be sorted up to `index_first_pending'.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+ // At least one of the saturation matrices must be up-to-date.
+ if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+ x.update_sat_g();
+
+ if (x.gen_sys.is_sorted()) {
+ if (x.sat_g_is_up_to_date())
+ // If generators are already sorted and sat_g is up to
+ // date there is nothing to do.
+ return;
+ }
+ else {
+ if (!x.sat_c_is_up_to_date()) {
+ // If generators are not sorted and sat_c is not up-to-date
+ // we obtain sat_c from sat_g (that has to be up-to-date)...
+ x.sat_c.transpose_assign(x.sat_g);
+ x.set_sat_c_up_to_date();
+ }
+ // ... and sort it together with generators.
+ x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+ }
+ // Obtaining sat_g from sat_c.
+ x.sat_g.transpose_assign(sat_c);
+ x.set_sat_g_up_to_date();
+ // Generators are sorted now.
+ x.gen_sys.set_sorted(true);
+
+ PPL_ASSERT(gen_sys.check_sorted());
+}
+
+bool
+PPL::Polyhedron::minimize() const {
+ // 0-dim space or empty polyhedra are already minimized.
+ if (marked_empty())
+ return false;
+ if (space_dim == 0)
+ return true;
+
+ // If the polyhedron has something pending, process it.
+ if (has_something_pending()) {
+ const bool not_empty = process_pending();
+ PPL_ASSERT_HEAVY(OK());
+ return not_empty;
+ }
+
+ // Here there are no pending constraints or generators.
+ // Is the polyhedron already minimized?
+ if (constraints_are_minimized() && generators_are_minimized())
+ return true;
+
+ // If constraints or generators are up-to-date, invoking
+ // update_generators() or update_constraints(), respectively,
+ // minimizes both constraints and generators.
+ // If both are up-to-date it does not matter whether we use
+ // update_generators() or update_constraints():
+ // both minimize constraints and generators.
+ if (constraints_are_up_to_date()) {
+ // We may discover here that `*this' is empty.
+ const bool ret = update_generators();
+ PPL_ASSERT_HEAVY(OK());
+ return ret;
+ }
+ else {
+ PPL_ASSERT(generators_are_up_to_date());
+ update_constraints();
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+ }
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_constraints() const {
+ PPL_ASSERT(!is_necessarily_closed());
+
+ // From the user perspective, the polyhedron will not change.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // We need `con_sys' (weakly) minimized and `gen_sys' up-to-date.
+ // `minimize()' will process any pending constraints or generators.
+ if (!minimize())
+ return false;
+
+ // If the polyhedron `*this' is zero-dimensional
+ // at this point it must be a universe polyhedron.
+ if (x.space_dim == 0)
+ return true;
+
+ // We also need `sat_g' up-to-date.
+ if (!sat_g_is_up_to_date()) {
+ PPL_ASSERT(sat_c_is_up_to_date());
+ x.sat_g.transpose_assign(sat_c);
+ }
+
+ // These Bit_Row's will be later used as masks in order to
+ // check saturation conditions restricted to particular subsets of
+ // the generator system.
+ Bit_Row sat_all_but_rays;
+ Bit_Row sat_all_but_points;
+ Bit_Row sat_all_but_closure_points;
+
+ const dimension_type gs_rows = gen_sys.num_rows();
+ const dimension_type n_lines = gen_sys.num_lines();
+ for (dimension_type i = gs_rows; i-- > n_lines; )
+ switch (gen_sys[i].type()) {
+ case Generator::RAY:
+ sat_all_but_rays.set(i);
+ break;
+ case Generator::POINT:
+ sat_all_but_points.set(i);
+ break;
+ case Generator::CLOSURE_POINT:
+ sat_all_but_closure_points.set(i);
+ break;
+ case Generator::LINE:
+ // Found a line with index i >= n_lines !
+ PPL_UNREACHABLE;
+ break;
+ }
+ const Bit_Row
+ sat_lines_and_rays(sat_all_but_points, sat_all_but_closure_points);
+ const Bit_Row
+ sat_lines_and_closure_points(sat_all_but_rays, sat_all_but_points);
+ const Bit_Row
+ sat_lines(sat_lines_and_rays, sat_lines_and_closure_points);
+
+ // These flags are maintained to later decide if we have to add the
+ // eps_leq_one constraint and whether or not the constraint system
+ // was changed.
+ bool changed = false;
+ bool found_eps_leq_one = false;
+
+ // For all the strict inequalities in `con_sys', check for
+ // eps-redundancy and eventually move them to the bottom part of the
+ // system.
+ Constraint_System& cs = x.con_sys;
+ Bit_Matrix& sat = x.sat_g;
+ const Variable eps_var(cs.space_dimension());
+ // Note that cs.num_rows() is *not* constant because the calls to
+ // cs.remove_row() decrease it.
+ for (dimension_type i = 0; i < cs.num_rows(); )
+ if (cs[i].is_strict_inequality()) {
+ // First, check if it is saturated by no closure points
+ Bit_Row sat_ci;
+ sat_ci.union_assign(sat[i], sat_lines_and_closure_points);
+ if (sat_ci == sat_lines) {
+ // It is saturated by no closure points.
+ if (!found_eps_leq_one) {
+ // Check if it is the eps_leq_one constraint.
+ const Constraint& c = cs[i];
+ if (c.expression().all_homogeneous_terms_are_zero()
+ && (c.expression().inhomogeneous_term() + c.epsilon_coefficient() == 0)) {
+ // We found the eps_leq_one constraint.
+ found_eps_leq_one = true;
+ // Consider next constraint.
+ ++i;
+ continue;
+ }
+ }
+ // Here `cs[i]' is not the eps_leq_one constraint,
+ // so it is eps-redundant.
+ // Remove it, while keeping `sat_g' consistent.
+ cs.remove_row(i, false);
+ swap(sat[i], sat[cs.num_rows()]);
+ // The constraint system is changed.
+ changed = true;
+ // Continue by considering next constraint,
+ // which is already in place due to the swap.
+ continue;
+ }
+ // Now we check if there exists another strict inequality
+ // constraint having a superset of its saturators,
+ // when disregarding points.
+ sat_ci.union_assign(sat[i], sat_all_but_points);
+ bool eps_redundant = false;
+ for (dimension_type j = 0; j < cs.num_rows(); ++j)
+ if (i != j && cs[j].is_strict_inequality()
+ && subset_or_equal(sat[j], sat_ci)) {
+ // Constraint `cs[i]' is eps-redundant:
+ // remove it, while keeping `sat_g' consistent.
+ cs.remove_row(i, false);
+ swap(sat[i], sat[cs.num_rows()]);
+ eps_redundant = true;
+ // The constraint system is changed.
+ changed = true;
+ break;
+ }
+ // Continue with next constraint, which is already in place
+ // due to the swap if we have found an eps-redundant constraint.
+ if (!eps_redundant)
+ ++i;
+ }
+ else
+ // `cs[i]' is not a strict inequality: consider next constraint.
+ ++i;
+
+ PPL_ASSERT(cs.num_pending_rows() == 0);
+
+ if (changed) {
+ // If the constraint system has been changed, we have erased
+ // the epsilon-redundant constraints.
+
+ // The generator system is no longer up-to-date.
+ x.clear_generators_up_to_date();
+
+ // If we haven't found an upper bound for the epsilon dimension,
+ // then we have to check whether such an upper bound is implied
+ // by the remaining constraints (exploiting the simplex algorithm).
+ if (!found_eps_leq_one) {
+ MIP_Problem lp;
+ // KLUDGE: temporarily mark the constraint system as if it was
+ // necessarily closed, so that we can interpret the epsilon
+ // dimension as a standard dimension. Be careful to reset the
+ // topology of `cs' even on exceptional execution path.
+ cs.mark_as_necessarily_closed();
+ try {
+ lp.add_space_dimensions_and_embed(cs.space_dimension());
+ lp.add_constraints(cs);
+ cs.mark_as_not_necessarily_closed();
+ }
+ catch (...) {
+ cs.mark_as_not_necessarily_closed();
+ throw;
+ }
+ // The objective function is `epsilon'.
+ lp.set_objective_function(Variable(x.space_dim));
+ lp.set_optimization_mode(MAXIMIZATION);
+ const MIP_Problem_Status status = lp.solve();
+ PPL_ASSERT(status != UNFEASIBLE_MIP_PROBLEM);
+ // If the epsilon dimension is actually unbounded,
+ // then add the eps_leq_one constraint.
+ if (status == UNBOUNDED_MIP_PROBLEM)
+ cs.insert(Constraint::epsilon_leq_one());
+ }
+ }
+
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_generators() const {
+ PPL_ASSERT(!is_necessarily_closed());
+
+ // From the user perspective, the polyhedron will not change.
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ // We need `gen_sys' (weakly) minimized and `con_sys' up-to-date.
+ // `minimize()' will process any pending constraints or generators.
+ if (!minimize())
+ return false;
+
+ // If the polyhedron `*this' is zero-dimensional
+ // at this point it must be a universe polyhedron.
+ if (x.space_dim == 0)
+ return true;
+
+ // We also need `sat_c' up-to-date.
+ if (!sat_c_is_up_to_date()) {
+ PPL_ASSERT(sat_g_is_up_to_date());
+ x.sat_c.transpose_assign(sat_g);
+ }
+
+ // This Bit_Row will have all and only the indexes
+ // of strict inequalities set to 1.
+ Bit_Row sat_all_but_strict_ineq;
+ const dimension_type cs_rows = con_sys.num_rows();
+ const dimension_type n_equals = con_sys.num_equalities();
+ for (dimension_type i = cs_rows; i-- > n_equals; )
+ if (con_sys[i].is_strict_inequality())
+ sat_all_but_strict_ineq.set(i);
+
+ // Will record whether or not we changed the generator system.
+ bool changed = false;
+
+ // For all points in the generator system, check for eps-redundancy
+ // and eventually move them to the bottom part of the system.
+ Generator_System& gs = const_cast<Generator_System&>(gen_sys);
+ Bit_Matrix& sat = const_cast<Bit_Matrix&>(sat_c);
+ const dimension_type old_gs_rows = gs.num_rows();
+ dimension_type gs_rows = old_gs_rows;
+ const dimension_type n_lines = gs.num_lines();
+ bool gs_sorted = gs.is_sorted();
+
+ for (dimension_type i = n_lines; i < gs_rows; ) {
+ Generator& g = gs.sys.rows[i];
+ if (g.is_point()) {
+ // Compute the Bit_Row corresponding to the candidate point
+ // when strict inequality constraints are ignored.
+ const Bit_Row sat_gs_i(sat[i], sat_all_but_strict_ineq);
+ // Check if the candidate point is actually eps-redundant:
+ // namely, if there exists another point that saturates
+ // all the non-strict inequalities saturated by the candidate.
+ bool eps_redundant = false;
+ for (dimension_type j = n_lines; j < gs_rows; ++j) {
+ const Generator& g2 = gs.sys.rows[j];
+ if (i != j && g2.is_point() && subset_or_equal(sat[j], sat_gs_i)) {
+ // Point `g' is eps-redundant:
+ // move it to the bottom of the generator system,
+ // while keeping `sat_c' consistent.
+ --gs_rows;
+ swap(g, gs.sys.rows[gs_rows]);
+ swap(sat[i], sat[gs_rows]);
+ eps_redundant = true;
+ changed = true;
+ break;
+ }
+ }
+ if (!eps_redundant) {
+ // Let all point encodings have epsilon coordinate 1.
+ if (g.epsilon_coefficient() != g.expr.inhomogeneous_term()) {
+ g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+ // Enforce normalization.
+ g.expr.normalize();
+ PPL_ASSERT(g.OK());
+ changed = true;
+ }
+ // Consider next generator.
+ ++i;
+ }
+ }
+ else
+ // Consider next generator.
+ ++i;
+ }
+
+ // If needed, erase the eps-redundant generators.
+ if (gs_rows < old_gs_rows)
+ gs.sys.rows.resize(gs_rows);
+
+ if (changed) {
+ // The generator system is no longer sorted.
+ gs_sorted = false;
+ // The constraint system is no longer up-to-date.
+ x.clear_constraints_up_to_date();
+ }
+
+ gs.sys.index_first_pending = gs.num_rows();
+ gs.set_sorted(gs_sorted);
+
+ PPL_ASSERT(gs.sys.OK());
+
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+}
+
+void
+PPL::Polyhedron::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(space_dim >= c.space_dimension());
+
+ // Dealing with a zero-dimensional space polyhedron first.
+ if (space_dim == 0) {
+ if (c.is_inconsistent())
+ set_empty();
+ return;
+ }
+
+ // The constraints (possibly with pending rows) are required.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ const bool adding_pending = can_have_something_pending();
+
+ if (c.is_necessarily_closed() || !is_necessarily_closed())
+ // Since `con_sys' is not empty, the topology and space dimension
+ // of the inserted constraint are automatically adjusted.
+ if (adding_pending)
+ con_sys.insert_pending(c);
+ else
+ con_sys.insert(c);
+ else {
+ // Here we know that the system of constraints has at least a row.
+ // However, by barely invoking `con_sys.insert(c)' we would
+ // cause a change in the topology of `con_sys', which is wrong.
+ // Thus, we insert a "topology corrected" copy of `c'.
+ const Linear_Expression nc_expr(c.expression());
+ if (c.is_equality())
+ if (adding_pending)
+ con_sys.insert_pending(nc_expr == 0);
+ else
+ con_sys.insert(nc_expr == 0);
+ else
+ if (adding_pending)
+ con_sys.insert_pending(nc_expr >= 0);
+ else
+ con_sys.insert(nc_expr >= 0);
+ }
+
+ if (adding_pending)
+ set_constraints_pending();
+ else {
+ // Constraints are not minimized and generators are not up-to-date.
+ clear_constraints_minimized();
+ clear_generators_up_to_date();
+ }
+
+ // Note: the constraint system may have become unsatisfiable, thus
+ // we do not check for satisfiability.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+bool
+PPL::Polyhedron::BHZ09_poly_hull_assign_if_exact(const Polyhedron& y) {
+ Polyhedron& x = *this;
+
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x.topology() == y.topology());
+ PPL_ASSERT(x.space_dim == y.space_dim);
+
+ // The zero-dim case is trivial.
+ if (x.space_dim == 0) {
+ x.upper_bound_assign(y);
+ return true;
+ }
+
+ // If `x' or `y' are (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ x = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ x = y;
+ return true;
+ }
+
+ if (x.is_necessarily_closed())
+ return x.BHZ09_C_poly_hull_assign_if_exact(y);
+ else
+ return x.BHZ09_NNC_poly_hull_assign_if_exact(y);
+}
+
+bool
+PPL::Polyhedron::BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x.is_necessarily_closed() && y.is_necessarily_closed());
+ PPL_ASSERT(x.space_dim > 0 && x.space_dim == y.space_dim);
+ PPL_ASSERT(!x.is_empty() && !y.is_empty());
+
+ // Minimization is not really required, but it is probably the best
+ // way of getting constraints, generators and saturation matrices
+ // up-to-date. Minimization it also removes redundant
+ // constraints/generators.
+ (void) x.minimize();
+ (void) y.minimize();
+
+ // Handle a special case: for topologically closed polyhedra P and Q,
+ // if the affine dimension of P is greater than that of Q, then
+ // their upper bound is exact if and only if P includes Q.
+ const dimension_type x_affine_dim = x.affine_dimension();
+ const dimension_type y_affine_dim = y.affine_dimension();
+ if (x_affine_dim > y_affine_dim)
+ return y.is_included_in(x);
+ else if (x_affine_dim < y_affine_dim) {
+ if (x.is_included_in(y)) {
+ x = y;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ const Constraint_System& x_cs = x.con_sys;
+ const Generator_System& x_gs = x.gen_sys;
+ const Generator_System& y_gs = y.gen_sys;
+ const dimension_type x_gs_num_rows = x_gs.num_rows();
+ const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+ // Step 1: generators of `x' that are redundant in `y', and vice versa.
+ Bit_Row x_gs_red_in_y;
+ dimension_type num_x_gs_red_in_y = 0;
+ for (dimension_type i = x_gs_num_rows; i-- > 0; )
+ if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+ x_gs_red_in_y.set(i);
+ ++num_x_gs_red_in_y;
+ }
+ Bit_Row y_gs_red_in_x;
+ dimension_type num_y_gs_red_in_x = 0;
+ for (dimension_type i = y_gs_num_rows; i-- > 0; )
+ if (x.relation_with(y_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+ y_gs_red_in_x.set(i);
+ ++num_y_gs_red_in_x;
+ }
+
+ // Step 2: filter away special cases.
+
+ // Step 2.1: inclusion tests.
+ if (num_y_gs_red_in_x == y_gs_num_rows)
+ // `y' is included into `x': upper bound `x' is exact.
+ return true;
+ if (num_x_gs_red_in_y == x_gs_num_rows) {
+ // `x' is included into `y': upper bound `y' is exact.
+ x = y;
+ return true;
+ }
+
+ // Step 2.2: if no generator of `x' is redundant for `y', then
+ // (as by 2.1 there exists a constraint of `x' non-redundant for `y')
+ // the upper bound is not exact; the same if exchanging `x' and `y'.
+ if (num_x_gs_red_in_y == 0 || num_y_gs_red_in_x == 0)
+ return false;
+
+ // Step 3: see if `x' has a non-redundant constraint `c_x' that is not
+ // satisfied by `y' and a non-redundant generator in `y' (see Step 1)
+ // saturating `c_x'. If so, the upper bound is not exact.
+
+ // Make sure the saturation matrix for `x' is up to date.
+ // Any sat matrix would do: we choose `sat_g' because it matches
+ // the two nested loops (constraints on rows and generators on columns).
+ if (!x.sat_g_is_up_to_date())
+ x.update_sat_g();
+ const Bit_Matrix& x_sat = x.sat_g;
+
+ Bit_Row all_ones;
+ all_ones.set_until(x_gs_num_rows);
+ Bit_Row row_union;
+ for (dimension_type i = x_cs.num_rows(); i-- > 0; ) {
+ const bool included
+ = y.relation_with(x_cs[i]).implies(Poly_Con_Relation::is_included());
+ if (!included) {
+ row_union.union_assign(x_gs_red_in_y, x_sat[i]);
+ if (row_union != all_ones)
+ return false;
+ }
+ }
+
+ // Here we know that the upper bound is exact: compute it.
+ for (dimension_type j = y_gs_num_rows; j-- > 0; )
+ if (!y_gs_red_in_x[j])
+ add_generator(y_gs[j]);
+
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+}
+
+bool
+PPL::Polyhedron::BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y) {
+ const Polyhedron& x = *this;
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(!x.is_necessarily_closed() && !y.is_necessarily_closed());
+ PPL_ASSERT(x.space_dim > 0 && x.space_dim == y.space_dim);
+ PPL_ASSERT(!x.is_empty() && !y.is_empty());
+
+ // Minimization is not really required, but it is probably the best
+ // way of getting constraints, generators and saturation matrices
+ // up-to-date. Minimization also removes redundant
+ // constraints/generators.
+ (void) x.minimize();
+ (void) y.minimize();
+
+ const Generator_System& x_gs = x.gen_sys;
+ const Generator_System& y_gs = y.gen_sys;
+ const dimension_type x_gs_num_rows = x_gs.num_rows();
+ const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+ // Compute generators of `x' that are non-redundant in `y' ...
+ Bit_Row x_gs_non_redundant_in_y;
+ Bit_Row x_points_non_redundant_in_y;
+ Bit_Row x_closure_points;
+ dimension_type num_x_gs_non_redundant_in_y = 0;
+ for (dimension_type i = x_gs_num_rows; i-- > 0; ) {
+ const Generator& x_gs_i = x_gs[i];
+ if (x_gs_i.is_closure_point())
+ x_closure_points.set(i);
+ if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes()))
+ continue;
+ x_gs_non_redundant_in_y.set(i);
+ ++num_x_gs_non_redundant_in_y;
+ if (x_gs_i.is_point())
+ x_points_non_redundant_in_y.set(i);
+ }
+
+ // If `x' is included into `y', the upper bound `y' is exact.
+ if (num_x_gs_non_redundant_in_y == 0) {
+ *this = y;
+ return true;
+ }
+
+ // ... and vice versa, generators of `y' that are non-redundant in `x'.
+ Bit_Row y_gs_non_redundant_in_x;
+ Bit_Row y_points_non_redundant_in_x;
+ Bit_Row y_closure_points;
+ dimension_type num_y_gs_non_redundant_in_x = 0;
+ for (dimension_type i = y_gs_num_rows; i-- > 0; ) {
+ const Generator& y_gs_i = y_gs[i];
+ if (y_gs_i.is_closure_point())
+ y_closure_points.set(i);
+ if (x.relation_with(y_gs_i).implies(Poly_Gen_Relation::subsumes()))
+ continue;
+ y_gs_non_redundant_in_x.set(i);
+ ++num_y_gs_non_redundant_in_x;
+ if (y_gs_i.is_point())
+ y_points_non_redundant_in_x.set(i);
+ }
+
+ // If `y' is included into `x', the upper bound `x' is exact.
+ if (num_y_gs_non_redundant_in_x == 0)
+ return true;
+
+ Bit_Row x_non_points_non_redundant_in_y;
+ x_non_points_non_redundant_in_y
+ .difference_assign(x_gs_non_redundant_in_y,
+ x_points_non_redundant_in_y);
+
+ const Constraint_System& x_cs = x.con_sys;
+ const Constraint_System& y_cs = y.con_sys;
+ const dimension_type x_cs_num_rows = x_cs.num_rows();
+ const dimension_type y_cs_num_rows = y_cs.num_rows();
+
+ // Filter away the points of `x_gs' that would be redundant
+ // in the topological closure of `y'.
+ Bit_Row x_points_non_redundant_in_y_closure;
+ for (dimension_type i = x_points_non_redundant_in_y.first();
+ i != C_Integer<unsigned long>::max;
+ i = x_points_non_redundant_in_y.next(i)) {
+ const Generator& x_p = x_gs[i];
+ PPL_ASSERT(x_p.is_point());
+ // NOTE: we cannot use Constraint_System::relation_with()
+ // as we need to treat strict inequalities as if they were nonstrict.
+ for (dimension_type j = y_cs_num_rows; j-- > 0; ) {
+ const Constraint& y_c = y_cs[j];
+ const int sp_sign = Scalar_Products::reduced_sign(y_c, x_p);
+ if (sp_sign < 0 || (y_c.is_equality() && sp_sign > 0)) {
+ x_points_non_redundant_in_y_closure.set(i);
+ break;
+ }
+ }
+ }
+
+ // Make sure the saturation matrix for `x' is up to date.
+ // Any sat matrix would do: we choose `sat_g' because it matches
+ // the two nested loops (constraints on rows and generators on columns).
+ if (!x.sat_g_is_up_to_date())
+ x.update_sat_g();
+ const Bit_Matrix& x_sat = x.sat_g;
+
+ Bit_Row x_cs_condition_3;
+ Bit_Row x_gs_condition_3;
+ Bit_Row all_ones;
+ all_ones.set_until(x_gs_num_rows);
+ Bit_Row saturators;
+ Bit_Row tmp_set;
+ for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+ const Constraint& x_c = x_cs[i];
+ // Skip constraint if it is not violated by `y'.
+ if (y.relation_with(x_c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ saturators.difference_assign(all_ones, x_sat[i]);
+ // Check condition 1.
+ tmp_set.intersection_assign(x_non_points_non_redundant_in_y, saturators);
+ if (!tmp_set.empty())
+ return false;
+ if (x_c.is_strict_inequality()) {
+ // Postpone check for condition 3.
+ x_cs_condition_3.set(i);
+ tmp_set.intersection_assign(x_closure_points, saturators);
+ x_gs_condition_3.union_assign(x_gs_condition_3, tmp_set);
+ }
+ else {
+ // Check condition 2.
+ tmp_set.intersection_assign(x_points_non_redundant_in_y_closure,
+ saturators);
+ if (!tmp_set.empty())
+ return false;
+ }
+ }
+
+ // Now exchange the roles of `x' and `y'
+ // (the statement of the NNC theorem in BHZ09 is symmetric).
+
+ Bit_Row y_non_points_non_redundant_in_x;
+ y_non_points_non_redundant_in_x
+ .difference_assign(y_gs_non_redundant_in_x,
+ y_points_non_redundant_in_x);
+
+ // Filter away the points of `y_gs' that would be redundant
+ // in the topological closure of `x'.
+ Bit_Row y_points_non_redundant_in_x_closure;
+ for (dimension_type i = y_points_non_redundant_in_x.first();
+ i != C_Integer<unsigned long>::max;
+ i = y_points_non_redundant_in_x.next(i)) {
+ const Generator& y_p = y_gs[i];
+ PPL_ASSERT(y_p.is_point());
+ // NOTE: we cannot use Constraint_System::relation_with()
+ // as we need to treat strict inequalities as if they were nonstrict.
+ for (dimension_type j = x_cs_num_rows; j-- > 0; ) {
+ const Constraint& x_c = x_cs[j];
+ const int sp_sign = Scalar_Products::reduced_sign(x_c, y_p);
+ if (sp_sign < 0 || (x_c.is_equality() && sp_sign > 0)) {
+ y_points_non_redundant_in_x_closure.set(i);
+ break;
+ }
+ }
+ }
+
+ // Make sure the saturation matrix `sat_g' for `y' is up to date.
+ if (!y.sat_g_is_up_to_date())
+ y.update_sat_g();
+ const Bit_Matrix& y_sat = y.sat_g;
+
+ Bit_Row y_cs_condition_3;
+ Bit_Row y_gs_condition_3;
+ all_ones.clear();
+ all_ones.set_until(y_gs_num_rows);
+ for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+ const Constraint& y_c = y_cs[i];
+ // Skip constraint if it is not violated by `x'.
+ if (x.relation_with(y_c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ saturators.difference_assign(all_ones, y_sat[i]);
+ // Check condition 1.
+ tmp_set.intersection_assign(y_non_points_non_redundant_in_x, saturators);
+ if (!tmp_set.empty())
+ return false;
+ if (y_c.is_strict_inequality()) {
+ // Postpone check for condition 3.
+ y_cs_condition_3.set(i);
+ tmp_set.intersection_assign(y_closure_points, saturators);
+ y_gs_condition_3.union_assign(y_gs_condition_3, tmp_set);
+ }
+ else {
+ // Check condition 2.
+ tmp_set.intersection_assign(y_points_non_redundant_in_x_closure,
+ saturators);
+ if (!tmp_set.empty())
+ return false;
+ }
+ }
+
+ // Now considering condition 3.
+
+ if (x_cs_condition_3.empty() && y_cs_condition_3.empty()) {
+ // No test for condition 3 is needed.
+ // The hull is exact: compute it.
+ for (dimension_type j = y_gs_num_rows; j-- > 0; )
+ if (y_gs_non_redundant_in_x[j])
+ add_generator(y_gs[j]);
+ return true;
+ }
+
+ // We have anyway to compute the upper bound and its constraints too.
+ Polyhedron ub(x);
+ for (dimension_type j = y_gs_num_rows; j-- > 0; )
+ if (y_gs_non_redundant_in_x[j])
+ ub.add_generator(y_gs[j]);
+ (void) ub.minimize();
+ PPL_ASSERT(!ub.is_empty());
+
+ // NOTE: the following computation of x_gs_condition_3_not_in_y
+ // (resp., y_gs_condition_3_not_in_x) is not required for correctness.
+ // It is done so as to later apply a speculative test
+ // (i.e., a non-conclusive but computationally lighter test).
+
+ // Filter away from `x_gs_condition_3' those closure points
+ // that, when considered as points, would belong to `y',
+ // i.e., those that violate no strict constraint in `y_cs'.
+ Bit_Row x_gs_condition_3_not_in_y;
+ for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+ const Constraint& y_c = y_cs[i];
+ if (y_c.is_strict_inequality()) {
+ for (dimension_type j = x_gs_condition_3.first();
+ j != C_Integer<unsigned long>::max; j = x_gs_condition_3.next(j)) {
+ const Generator& x_cp = x_gs[j];
+ PPL_ASSERT(x_cp.is_closure_point());
+ const int sp_sign = Scalar_Products::reduced_sign(y_c, x_cp);
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign == 0) {
+ x_gs_condition_3.clear(j);
+ x_gs_condition_3_not_in_y.set(j);
+ }
+ }
+ if (x_gs_condition_3.empty())
+ break;
+ }
+ }
+ // Symmetrically, filter away from `y_gs_condition_3' those
+ // closure points that, when considered as points, would belong to `x',
+ // i.e., those that violate no strict constraint in `x_cs'.
+ Bit_Row y_gs_condition_3_not_in_x;
+ for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+ if (x_cs[i].is_strict_inequality()) {
+ const Constraint& x_c = x_cs[i];
+ for (dimension_type j = y_gs_condition_3.first();
+ j != C_Integer<unsigned long>::max; j = y_gs_condition_3.next(j)) {
+ const Generator& y_cp = y_gs[j];
+ PPL_ASSERT(y_cp.is_closure_point());
+ const int sp_sign = Scalar_Products::reduced_sign(x_c, y_cp);
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign == 0) {
+ y_gs_condition_3.clear(j);
+ y_gs_condition_3_not_in_x.set(j);
+ }
+ }
+ if (y_gs_condition_3.empty())
+ break;
+ }
+ }
+
+ // NOTE: here we apply the speculative test.
+ // Check if there exists a closure point in `x_gs_condition_3_not_in_y'
+ // or `y_gs_condition_3_not_in_x' that belongs (as point) to the hull.
+ // If so, the hull is not exact.
+ const Constraint_System& ub_cs = ub.constraints();
+ for (dimension_type i = ub_cs.num_rows(); i-- > 0; ) {
+ if (ub_cs[i].is_strict_inequality()) {
+ const Constraint& ub_c = ub_cs[i];
+ for (dimension_type j = x_gs_condition_3_not_in_y.first();
+ j != C_Integer<unsigned long>::max;
+ j = x_gs_condition_3_not_in_y.next(j)) {
+ const Generator& x_cp = x_gs[j];
+ PPL_ASSERT(x_cp.is_closure_point());
+ const int sp_sign = Scalar_Products::reduced_sign(ub_c, x_cp);
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign == 0)
+ x_gs_condition_3_not_in_y.clear(j);
+ }
+ for (dimension_type j = y_gs_condition_3_not_in_x.first();
+ j != C_Integer<unsigned long>::max;
+ j = y_gs_condition_3_not_in_x.next(j)) {
+ const Generator& y_cp = y_gs[j];
+ PPL_ASSERT(y_cp.is_closure_point());
+ const int sp_sign = Scalar_Products::reduced_sign(ub_c, y_cp);
+ PPL_ASSERT(sp_sign >= 0);
+ if (sp_sign == 0)
+ y_gs_condition_3_not_in_x.clear(j);
+ }
+ }
+ }
+
+ if (!(x_gs_condition_3_not_in_y.empty()
+ && y_gs_condition_3_not_in_x.empty()))
+ // There exist a closure point satisfying condition 3,
+ // hence the hull is not exact.
+ return false;
+
+ // The speculative test was not successful:
+ // apply the expensive (but conclusive) test for condition 3.
+
+ // Consider strict inequalities in `x' violated by `y'.
+ for (dimension_type i = x_cs_condition_3.first();
+ i != C_Integer<unsigned long>::max; i = x_cs_condition_3.next(i)) {
+ const Constraint& x_cs_i = x_cs[i];
+ PPL_ASSERT(x_cs_i.is_strict_inequality());
+ // Build the equality constraint induced by x_cs_i.
+ const Linear_Expression expr(x_cs_i.expression());
+ const Constraint eq_i(expr == 0);
+ PPL_ASSERT(!(ub.relation_with(eq_i)
+ .implies(Poly_Con_Relation::is_disjoint())));
+ Polyhedron ub_inters_hyperplane(ub);
+ ub_inters_hyperplane.add_constraint(eq_i);
+ Polyhedron y_inters_hyperplane(y);
+ y_inters_hyperplane.add_constraint(eq_i);
+ if (!y_inters_hyperplane.contains(ub_inters_hyperplane))
+ // The hull is not exact.
+ return false;
+ }
+
+ // Consider strict inequalities in `y' violated by `x'.
+ for (dimension_type i = y_cs_condition_3.first();
+ i != C_Integer<unsigned long>::max; i = y_cs_condition_3.next(i)) {
+ const Constraint& y_cs_i = y_cs[i];
+ PPL_ASSERT(y_cs_i.is_strict_inequality());
+ // Build the equality constraint induced by y_cs_i.
+ const Constraint eq_i(Linear_Expression(y_cs_i.expression()) == 0);
+ PPL_ASSERT(!(ub.relation_with(eq_i)
+ .implies(Poly_Con_Relation::is_disjoint())));
+ Polyhedron ub_inters_hyperplane(ub);
+ ub_inters_hyperplane.add_constraint(eq_i);
+ Polyhedron x_inters_hyperplane(x);
+ x_inters_hyperplane.add_constraint(eq_i);
+ if (!x_inters_hyperplane.contains(ub_inters_hyperplane))
+ // The hull is not exact.
+ return false;
+ }
+
+ // The hull is exact.
+ m_swap(ub);
+ return true;
+}
+
+bool
+PPL::Polyhedron::BFT00_poly_hull_assign_if_exact(const Polyhedron& y) {
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const Polyhedron& x = *this;
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x.is_necessarily_closed());
+ PPL_ASSERT(x.topology() == y.topology());
+ PPL_ASSERT(x.space_dim == y.space_dim);
+
+ // The zero-dim case is trivial.
+ if (x.space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the convex union is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+
+ // Implementation based on Algorithm 8.1 (page 15) in [BemporadFT00TR],
+ // generalized so as to also allow for unbounded polyhedra.
+ // The extension to unbounded polyhedra is obtained by mimicking
+ // what done in Algorithm 8.2 (page 19) with respect to
+ // Algorithm 6.2 (page 13).
+ // We also apply a couple of improvements (see steps 2.1, 3.1, 6.1, 7.1)
+ // so as to quickly handle special cases and avoid the splitting
+ // of equalities/lines into pairs of inequalities/rays.
+
+ (void) x.minimize();
+ (void) y.minimize();
+ const Constraint_System& x_cs = x.con_sys;
+ const Constraint_System& y_cs = y.con_sys;
+ const Generator_System& x_gs = x.gen_sys;
+ const Generator_System& y_gs = y.gen_sys;
+ const dimension_type x_gs_num_rows = x_gs.num_rows();
+ const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+ // Step 1: generators of `x' that are redundant in `y', and vice versa.
+ std::vector<bool> x_gs_red_in_y(x_gs_num_rows, false);
+ dimension_type num_x_gs_red_in_y = 0;
+ for (dimension_type i = x_gs_num_rows; i-- > 0; )
+ if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+ x_gs_red_in_y[i] = true;
+ ++num_x_gs_red_in_y;
+ }
+ std::vector<bool> y_gs_red_in_x(y_gs_num_rows, false);
+ dimension_type num_y_gs_red_in_x = 0;
+ for (dimension_type i = y_gs_num_rows; i-- > 0; )
+ if (x.relation_with(y_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+ y_gs_red_in_x[i] = true;
+ ++num_y_gs_red_in_x;
+ }
+
+ // Step 2: if no redundant generator has been identified,
+ // then the union is not convex. CHECKME: why?
+ if (num_x_gs_red_in_y == 0 && num_y_gs_red_in_x == 0)
+ return false;
+
+ // Step 2.1: while at it, also perform quick inclusion tests.
+ if (num_y_gs_red_in_x == y_gs_num_rows)
+ // `y' is included into `x': union is convex.
+ return true;
+ if (num_x_gs_red_in_y == x_gs_num_rows) {
+ // `x' is included into `y': union is convex.
+ *this = y;
+ return true;
+ }
+
+ // Here we know that `x' is not included in `y', and vice versa.
+
+ // Step 3: constraints of `x' that are satisfied by `y', and vice versa.
+ const dimension_type x_cs_num_rows = x_cs.num_rows();
+ std::vector<bool> x_cs_red_in_y(x_cs_num_rows, false);
+ for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+ const Constraint& x_cs_i = x_cs[i];
+ if (y.relation_with(x_cs_i).implies(Poly_Con_Relation::is_included()))
+ x_cs_red_in_y[i] = true;
+ else if (x_cs_i.is_equality())
+ // Step 3.1: `x' has an equality not satisfied by `y':
+ // union is not convex (recall that `y' does not contain `x').
+ // NOTE: this would be false for NNC polyhedra.
+ // Example: x = { A == 0 }, y = { 0 < A <= 1 }.
+ return false;
+ }
+ const dimension_type y_cs_num_rows = y_cs.num_rows();
+ std::vector<bool> y_cs_red_in_x(y_cs_num_rows, false);
+ for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+ const Constraint& y_cs_i = y_cs[i];
+ if (x.relation_with(y_cs_i).implies(Poly_Con_Relation::is_included()))
+ y_cs_red_in_x[i] = true;
+ else if (y_cs_i.is_equality())
+ // Step 3.1: `y' has an equality not satisfied by `x':
+ // union is not convex (see explanation above).
+ return false;
+ }
+
+ // Loop in steps 5-9: for each pair of non-redundant generators,
+ // compute their "mid-point" and check if it is both in `x' and `y'.
+
+ // Note: reasoning at the polyhedral cone level.
+ Generator mid_g;
+
+ for (dimension_type i = x_gs_num_rows; i-- > 0; ) {
+ if (x_gs_red_in_y[i])
+ continue;
+ const Generator& x_g = x_gs[i];
+ const bool x_g_is_line = x_g.is_line_or_equality();
+ for (dimension_type j = y_gs_num_rows; j-- > 0; ) {
+ if (y_gs_red_in_x[j])
+ continue;
+ const Generator& y_g = y_gs[j];
+ const bool y_g_is_line = y_g.is_line_or_equality();
+
+ // Step 6: compute mid_g = x_g + y_g.
+ // NOTE: no need to actually compute the "mid-point",
+ // since any strictly positive combination would do.
+ mid_g = x_g;
+ mid_g.expr += y_g.expr;
+ // A zero ray is not a well formed generator.
+ const bool illegal_ray
+ = (mid_g.expr.inhomogeneous_term() == 0 && mid_g.expr.all_homogeneous_terms_are_zero());
+ // A zero ray cannot be generated from a line: this holds
+ // because x_row (resp., y_row) is not subsumed by y (resp., x).
+ PPL_ASSERT(!(illegal_ray && (x_g_is_line || y_g_is_line)));
+ if (illegal_ray)
+ continue;
+ mid_g.expr.normalize();
+ if (x_g_is_line) {
+ if (y_g_is_line)
+ // mid_row is a line too: sign normalization is needed.
+ mid_g.sign_normalize();
+ else
+ // mid_row is a ray/point.
+ mid_g.set_is_ray_or_point_or_inequality();
+ }
+ PPL_ASSERT(mid_g.OK());
+
+ // Step 7: check if mid_g is in the union of x and y.
+ if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+ && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+ return false;
+
+ // If either x_g or y_g is a line, we should use its
+ // negation to produce another generator to be tested too.
+ // NOTE: exclusive-or is meant.
+ if (!x_g_is_line && y_g_is_line) {
+ // Step 6.1: (re-)compute mid_row = x_g - y_g.
+ mid_g = x_g;
+ mid_g.expr -= y_g.expr;
+ mid_g.expr.normalize();
+ PPL_ASSERT(mid_g.OK());
+ // Step 7.1: check if mid_g is in the union of x and y.
+ if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+ && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+ return false;
+ }
+ else if (x_g_is_line && !y_g_is_line) {
+ // Step 6.1: (re-)compute mid_row = - x_row + y_row.
+ mid_g = y_g;
+ mid_g.expr -= x_g.expr;
+ mid_g.expr.normalize();
+ PPL_ASSERT(mid_g.OK());
+ // Step 7.1: check if mid_g is in the union of x and y.
+ if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+ && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+ return false;
+ }
+ }
+ }
+
+ // Here we know that the union of x and y is convex.
+ // TODO: exploit knowledge on the cardinality of non-redundant
+ // constraints/generators to improve the convex-hull computation.
+ // Using generators allows for exploiting incrementality.
+ for (dimension_type j = 0; j < y_gs_num_rows; ++j) {
+ if (!y_gs_red_in_x[j])
+ add_generator(y_gs[j]);
+ }
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+}
+
+void
+PPL::Polyhedron::drop_some_non_integer_points(const Variables_Set* vars_p,
+ Complexity_Class complexity) {
+ // There is nothing to do for an empty set of variables.
+ if (vars_p != 0 && vars_p->empty())
+ return;
+
+ // Any empty polyhedron does not contain integer points.
+ if (marked_empty())
+ return;
+
+ // A zero-dimensional, universe polyhedron has, by convention, an
+ // integer point.
+ if (space_dim == 0) {
+ set_empty();
+ return;
+ }
+
+ // The constraints (possibly with pending rows) are required.
+ if (has_pending_generators()) {
+ // Processing of pending generators is exponential in the worst case.
+ if (complexity != ANY_COMPLEXITY)
+ return;
+ else
+ process_pending_generators();
+ }
+ if (!constraints_are_up_to_date()) {
+ // Constraints update is exponential in the worst case.
+ if (complexity != ANY_COMPLEXITY)
+ return;
+ else
+ update_constraints();
+ }
+ // For NNC polyhedra we need to process any pending constraints.
+ if (!is_necessarily_closed() && has_pending_constraints()) {
+ if (complexity != ANY_COMPLEXITY)
+ return;
+ else if (!process_pending_constraints())
+ // We just discovered the polyhedron is empty.
+ return;
+ }
+
+ PPL_ASSERT(!has_pending_generators() && constraints_are_up_to_date());
+ PPL_ASSERT(is_necessarily_closed() || !has_pending_constraints());
+
+ bool changed = false;
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+
+ const bool con_sys_was_sorted = con_sys.is_sorted();
+
+ Variables_Set other_vars;
+ if (vars_p != 0) {
+ // Compute the complement of `*vars_p'.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ if (vars_p->find(i) == vars_p->end())
+ other_vars.insert(Variable(i));
+ }
+ }
+
+ for (dimension_type j = con_sys.sys.rows.size(); j-- > 0; ) {
+ Constraint& c = con_sys.sys.rows[j];
+ if (c.is_tautological())
+ continue;
+
+ if (!other_vars.empty()) {
+ // Skip constraints having a nonzero coefficient for a variable
+ // that does not occurr in the input set.
+ if (!c.expression().all_zeroes(other_vars))
+ continue;
+ }
+
+ if (!is_necessarily_closed()) {
+ // Transform all strict inequalities into non-strict ones,
+ // with the inhomogeneous term incremented by 1.
+ if (c.epsilon_coefficient() < 0) {
+ c.set_epsilon_coefficient(0);
+ Linear_Expression& e = c.expr;
+ e.set_inhomogeneous_term(e.inhomogeneous_term() - 1);
+ // Enforce normalization.
+ // FIXME: is this really necessary?
+ e.normalize();
+ PPL_ASSERT(c.OK());
+ changed = true;
+ }
+ }
+
+ // Compute the GCD of all the homogeneous terms.
+ gcd = c.expression().gcd(1, space_dim + 1);
+
+ if (gcd != 0 && gcd != 1) {
+ PPL_ASSERT(c.expr.inhomogeneous_term() % gcd != 0);
+
+ // If we have an equality, the polyhedron becomes empty.
+ if (c.is_equality()) {
+ set_empty();
+ return;
+ }
+
+ // Divide the inhomogeneous coefficients by the GCD.
+ c.expr.exact_div_assign(gcd, 1, space_dim + 1);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c_0);
+ c_0 = c.expr.inhomogeneous_term();
+ const int c_0_sign = sgn(c_0);
+ c_0 /= gcd;
+ if (c_0_sign < 0)
+ --c_0;
+ c.expr.set_inhomogeneous_term(c_0);
+ PPL_ASSERT(c.OK());
+ changed = true;
+ }
+ }
+
+ con_sys.set_sorted(!changed && con_sys_was_sorted);
+ PPL_ASSERT(con_sys.sys.OK());
+
+ if (changed) {
+ if (is_necessarily_closed())
+ con_sys.insert(Constraint::zero_dim_positivity());
+ else
+ con_sys.insert(Constraint::epsilon_leq_one());
+
+ // After changing the system of constraints, the generators
+ // are no longer up-to-date and the constraints are no longer
+ // minimized.
+ clear_generators_up_to_date();
+ clear_constraints_minimized();
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::positive_time_elapse_assign_impl(const Polyhedron& y) {
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(!is_necessarily_closed());
+
+ Polyhedron& x = *this;
+ // Dimension-compatibility checks.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("positive_time_elapse_assign(y)", "y", y);
+
+ // Dealing with the zero-dimensional case.
+ if (x.space_dim == 0) {
+ if (y.marked_empty())
+ x.set_empty();
+ return;
+ }
+
+ // If either one of `x' or `y' is empty, the result is empty too.
+ if (x.marked_empty() || y.marked_empty()
+ || (x.has_pending_constraints() && !x.process_pending_constraints())
+ || (!x.generators_are_up_to_date() && !x.update_generators())
+ || (y.has_pending_constraints() && !y.process_pending_constraints())
+ || (!y.generators_are_up_to_date() && !y.update_generators())) {
+ x.set_empty();
+ return;
+ }
+
+ // At this point both generator systems are up-to-date,
+ // possibly containing pending generators.
+
+ // The new system of generators that will replace the one of x.
+ Generator_System new_gs(x.gen_sys);
+ dimension_type num_rows = new_gs.num_rows();
+
+ // We are going to do all sorts of funny things with new_gs, so we better
+ // mark it unsorted.
+ // Note: `sorted' is an attribute of Linear_System, encapsulated by
+ // Generator_System; hence, the following is equivalent to
+ // new_gs.set_sorted(false).
+ new_gs.sys.set_sorted(false);
+
+ // Remove all points from new_gs and put them in 'x_points_gs' for later use.
+ // Notice that we do not remove the corresponding closure points.
+ Generator_System x_points_gs;
+ for (dimension_type i = num_rows; i-- > 0;) {
+ Generator &g = new_gs.sys.rows[i];
+ if (g.is_point()) {
+ x_points_gs.insert(g);
+ num_rows--;
+ swap(g, new_gs.sys.rows[num_rows]);
+ }
+ }
+ new_gs.sys.rows.resize(num_rows);
+
+ // When there are no pending rows, the pending row index points at
+ // the smallest non-valid row, i.e., it is equal to the number of rows.
+ // Hence, each time the system is manually resized, the pending row index
+ // must be updated.
+ new_gs.unset_pending_rows();
+ PPL_ASSERT(new_gs.sys.OK());
+
+ // We use a pointer in order to avoid copying the generator
+ // system when it is not necessary, i.e., when y is an NNC.
+ const Generator_System *gs = &y.gen_sys;
+ Generator_System y_gs;
+
+ // If y is closed, promote its generator system to not necessarily closed.
+ if (y.is_necessarily_closed()) {
+ y_gs = y.gen_sys;
+ y_gs.convert_into_non_necessarily_closed();
+ y_gs.add_corresponding_closure_points();
+ gs = &y_gs;
+ }
+
+ PPL_ASSERT(gs->OK());
+ //gs->ascii_dump(std::cout);
+ //IO_Operators::operator<<(std::cout, *gs);
+
+ const dimension_type gs_num_rows = gs->num_rows();
+
+ // For each generator g of y...
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ const Generator &g = gs->sys.rows[i];
+
+ switch (g.type()) {
+ case Generator::POINT:
+ // In principle, points should be added to new_gs as rays.
+ // However, for each point there is a corresponding closure point in "gs".
+ // Hence, we leave this operation to closure points.
+
+ // Insert into new_gs the sum of g and each point of x.
+ // For each original point gx of x...
+ for (dimension_type j = x_points_gs.sys.num_rows(); j-- > 0; ) {
+ const Generator &gx = x_points_gs.sys.rows[j];
+ PPL_ASSERT(gx.is_point());
+ // ...insert the point obtained as the sum of g and gx.
+ Generator new_g = g; // make a copy
+ Coefficient new_divisor = g.expr.inhomogeneous_term() * gx.expr.inhomogeneous_term();
+
+ new_g.expr.linear_combine(gx.expr, gx.expr.inhomogeneous_term(), g.expr.inhomogeneous_term());
+ new_g.expr.set_inhomogeneous_term(new_divisor);
+ if (new_g.is_not_necessarily_closed()) {
+ new_g.set_epsilon_coefficient(g.epsilon_coefficient());
+ }
+ new_g.expr.normalize();
+ PPL_ASSERT(new_g.OK());
+ new_gs.insert(new_g);
+ }
+ break;
+ case Generator::CLOSURE_POINT:
+ // If g is not the origin, insert g into new_gs, as a ray.
+ if (!g.expr.all_homogeneous_terms_are_zero()) {
+ // Turn a copy of g into a ray.
+ Generator g_as_a_ray = g;
+ g_as_a_ray.expr.set_inhomogeneous_term(0);
+ g_as_a_ray.expr.normalize();
+ PPL_ASSERT(g_as_a_ray.OK());
+ // Insert the ray.
+ new_gs.insert(g_as_a_ray);
+ }
+ break;
+ case Generator::RAY:
+ case Generator::LINE:
+ // Insert g into new_gs.
+ new_gs.insert(g);
+ break;
+ }
+ }
+ new_gs.add_corresponding_closure_points();
+ // Notice: add_corresponding_closure_points adds them as pending.
+ new_gs.unset_pending_rows();
+
+ //Polyhedron new_x(...,new_gs);
+ //swap(x,new_x);
+
+ PPL_ASSERT(new_gs.sys.OK());
+
+ // Stealing the rows from `new_gs'.
+ using std::swap;
+ swap(gen_sys, new_gs);
+
+ gen_sys.set_sorted(false);
+ clear_generators_minimized();
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+ // Constraints are not up-to-date.
+ clear_constraints_up_to_date();
+
+ PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+void
+PPL::Polyhedron::throw_invalid_argument(const char* method,
+ const char* reason) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << ph_name << " is a ";
+ if (ph.is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron." << std::endl;
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+ const char* c_name,
+ const Constraint&) const {
+ PPL_ASSERT(is_necessarily_closed());
+ std::ostringstream s;
+ s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+ << c_name << " is a strict inequality.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+ const char* g_name,
+ const Generator&) const {
+ PPL_ASSERT(is_necessarily_closed());
+ std::ostringstream s;
+ s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+ << g_name << " is a closure point.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System&) const {
+ PPL_ASSERT(is_necessarily_closed());
+ std::ostringstream s;
+ s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+ << cs_name << " contains strict inequalities.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System&) const {
+ std::ostringstream s;
+ s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+ << gs_name << " contains closure points.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const {
+ std::ostringstream s;
+ s << "PPL::"
+ << (is_necessarily_closed() ? "C_" : "NNC_")
+ << "Polyhedron::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << other_name << ".space_dimension() == " << other_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const {
+ throw_dimension_incompatible(method, ph_name, ph.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ throw_dimension_incompatible(method, le_name, le.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const {
+ throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const {
+ throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const {
+ throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const {
+ throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System& gs) const {
+ throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const {
+ throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ const Variable var) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::
+throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required space dimension == " << required_space_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+PPL::dimension_type
+PPL::Polyhedron::check_space_dimension_overflow(const dimension_type dim,
+ const dimension_type max,
+ const Topology topol,
+ const char* method,
+ const char* reason) {
+ const char* const domain = (topol == NECESSARILY_CLOSED)
+ ? "PPL::C_Polyhedron::" : "PPL::NNC_Polyhedron::";
+ return PPL::check_space_dimension_overflow(dim, max, domain, method, reason);
+}
+
+PPL::dimension_type
+PPL::Polyhedron::check_space_dimension_overflow(const dimension_type dim,
+ const Topology topol,
+ const char* method,
+ const char* reason) {
+ return check_space_dimension_overflow(dim, Polyhedron::max_space_dimension(),
+ topol, method, reason);
+}
+
+void
+PPL::Polyhedron::throw_invalid_generator(const char* method,
+ const char* g_name) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << "*this is an empty polyhedron and "
+ << g_name << " is not a point.";
+ throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_invalid_generators(const char* method,
+ const char* gs_name) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << "*this is an empty polyhedron and" << std::endl
+ << "the non-empty generator system " << gs_name << " contains no points.";
+ throw std::invalid_argument(s.str());
+}
diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc
new file mode 100644
index 0000000..0cebe75
--- /dev/null
+++ b/src/Polyhedron_public.cc
@@ -0,0 +1,3747 @@
+/* Polyhedron class implementation (non-inline public functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "MIP_Problem_defs.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <cstdlib>
+#include <iostream>
+
+#ifndef ENSURE_SORTEDNESS
+#define ENSURE_SORTEDNESS 0
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type* PPL::Polyhedron::simplify_num_saturators_p = 0;
+
+size_t PPL::Polyhedron::simplify_num_saturators_size = 0;
+
+void
+PPL::Polyhedron::initialize() {
+ PPL_ASSERT(simplify_num_saturators_p == 0);
+ PPL_ASSERT(simplify_num_saturators_size == 0);
+ simplify_num_saturators_p = new dimension_type[simplify_num_saturators_size];
+}
+
+void
+PPL::Polyhedron::finalize() {
+ delete [] simplify_num_saturators_p;
+ simplify_num_saturators_p = 0;
+ simplify_num_saturators_size = 0;
+}
+
+PPL::dimension_type
+PPL::Polyhedron::affine_dimension() const {
+ if (is_empty())
+ return 0;
+
+ const Constraint_System& cs = minimized_constraints();
+ dimension_type d = space_dim;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ --d;
+ return d;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::constraints() const {
+ if (marked_empty()) {
+ // We want `con_sys' to only contain the unsatisfiable constraint
+ // of the appropriate dimension.
+ if (con_sys.has_no_rows()) {
+ // The 0-dim unsatisfiable constraint is extended to
+ // the appropriate dimension and then stored in `con_sys'.
+ Constraint_System unsat_cs = Constraint_System::zero_dim_empty();
+ unsat_cs.adjust_topology_and_space_dimension(topology(), space_dim);
+ swap(const_cast<Constraint_System&>(con_sys), unsat_cs);
+ }
+ else {
+ // Checking that `con_sys' contains the right thing.
+ PPL_ASSERT(con_sys.space_dimension() == space_dim);
+ PPL_ASSERT(con_sys.num_rows() == 1);
+ PPL_ASSERT(con_sys[0].is_inconsistent());
+ }
+ return con_sys;
+ }
+
+ if (space_dim == 0) {
+ // Zero-dimensional universe.
+ PPL_ASSERT(con_sys.num_rows() == 0 && con_sys.space_dimension() == 0);
+ return con_sys;
+ }
+
+ // If the polyhedron has pending generators, we process them to obtain
+ // the constraints. No processing is needed if the polyhedron has
+ // pending constraints.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ // TODO: reconsider whether to really sort constraints at this stage.
+#if ENSURE_SORTEDNESS
+ // We insist in returning a sorted system of constraints,
+ // but sorting is useless if there are pending constraints.
+ if (!has_pending_constraints())
+ obtain_sorted_constraints();
+#endif
+ return con_sys;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::minimized_constraints() const {
+ // `minimize()' or `strongly_minimize_constraints()'
+ // will process any pending constraints or generators.
+ if (is_necessarily_closed())
+ minimize();
+ else
+ strongly_minimize_constraints();
+ return constraints();
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::generators() const {
+ if (marked_empty()) {
+ PPL_ASSERT(gen_sys.has_no_rows());
+ // We want `gen_sys' to have the appropriate space dimension,
+ // even though it is an empty generator system.
+ if (gen_sys.space_dimension() != space_dim) {
+ Generator_System gs;
+ gs.adjust_topology_and_space_dimension(topology(), space_dim);
+ swap(const_cast<Generator_System&>(gen_sys), gs);
+ }
+ return gen_sys;
+ }
+
+ if (space_dim == 0) {
+ PPL_ASSERT(gen_sys.num_rows() == 0 && gen_sys.space_dimension() == 0);
+ return Generator_System::zero_dim_univ();
+ }
+
+ // If the polyhedron has pending constraints, we process them to obtain
+ // the generators (we may discover that the polyhedron is empty).
+ // No processing is needed if the polyhedron has pending generators.
+ if ((has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // We have just discovered that `*this' is empty.
+ PPL_ASSERT(gen_sys.has_no_rows());
+ // We want `gen_sys' to have the appropriate space dimension,
+ // even though it is an empty generator system.
+ if (gen_sys.space_dimension() != space_dim) {
+ Generator_System gs;
+ gs.adjust_topology_and_space_dimension(topology(), space_dim);
+ swap(const_cast<Generator_System&>(gen_sys), gs);
+ }
+ return gen_sys;
+ }
+
+ // TODO: reconsider whether to really sort generators at this stage.
+#if ENSURE_SORTEDNESS
+ // We insist in returning a sorted system of generators,
+ // but sorting is useless if there are pending generators.
+ if (!has_pending_generators())
+ obtain_sorted_generators();
+#else
+ // In the case of an NNC polyhedron, if the generator system is fully
+ // minimized (i.e., minimized and with no pending generator), then
+ // return a sorted system of generators: this is needed so that the
+ // const_iterator could correctly filter out the matched closure points.
+ if (!is_necessarily_closed()
+ && generators_are_minimized() && !has_pending_generators())
+ obtain_sorted_generators();
+#endif
+ return gen_sys;
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::minimized_generators() const {
+ // `minimize()' or `strongly_minimize_generators()'
+ // will process any pending constraints or generators.
+ if (is_necessarily_closed())
+ minimize();
+ else
+ strongly_minimize_generators();
+ // Note: calling generators() on a strongly minimized NNC generator
+ // system will also ensure sortedness, which is required to correctly
+ // filter away the matched closure points.
+ return generators();
+}
+
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Constraint& c) const {
+ // Dimension-compatibility check.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("relation_with(c)", "c", c);
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (c.is_inconsistent())
+ if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ if ((has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ // The polyhedron is empty.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return gen_sys.relation_with(c);
+}
+
+PPL::Poly_Gen_Relation
+PPL::Polyhedron::relation_with(const Generator& g) const {
+ // Dimension-compatibility check.
+ if (space_dim < g.space_dimension())
+ throw_dimension_incompatible("relation_with(g)", "g", g);
+
+ // The empty polyhedron cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe polyhedron in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ return
+ con_sys.satisfies_all_constraints(g)
+ ? Poly_Gen_Relation::subsumes()
+ : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Congruence& cg) const {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (space_dim < cg_space_dim)
+ throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+ if (cg.is_equality()) {
+ const Constraint c(cg);
+ return relation_with(c);
+ }
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ if ((has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ // The polyhedron is empty.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ // Build the equality corresponding to the congruence (ignoring the modulus).
+ Linear_Expression expr(cg.expression());
+ const Constraint c(expr == 0);
+
+ // The polyhedron is non-empty so that there exists a point.
+ // For an arbitrary generator point, compute the scalar product with
+ // the equality.
+ PPL_DIRTY_TEMP_COEFFICIENT(sp_point);
+ for (Generator_System::const_iterator gs_i = gen_sys.begin(),
+ gs_end = gen_sys.end(); gs_i != gs_end; ++gs_i) {
+ if (gs_i->is_point()) {
+ Scalar_Products::assign(sp_point, c, *gs_i);
+ expr -= sp_point;
+ break;
+ }
+ }
+
+ // Find two hyperplanes that satisfy the congruence and are near to
+ // the generating point (so that the point lies on or between these
+ // two hyperplanes).
+ // Then use the relations between the polyhedron and the halfspaces
+ // corresponding to the hyperplanes to determine the result.
+
+ // Compute the distance from the point to an hyperplane.
+ const Coefficient& modulus = cg.modulus();
+ PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+ signed_distance = sp_point % modulus;
+ if (signed_distance == 0)
+ // The point is lying on the hyperplane.
+ return relation_with(expr == 0);
+ else
+ // The point is not lying on the hyperplane.
+ expr += signed_distance;
+
+ // Build first halfspace constraint.
+ const bool positive = (signed_distance > 0);
+ const Constraint first_halfspace = positive ? (expr >= 0) : (expr <= 0);
+
+ const Poly_Con_Relation first_rels = relation_with(first_halfspace);
+ PPL_ASSERT(!first_rels.implies(Poly_Con_Relation::saturates())
+ && !first_rels.implies(Poly_Con_Relation::is_disjoint()));
+ if (first_rels.implies(Poly_Con_Relation::strictly_intersects()))
+ return Poly_Con_Relation::strictly_intersects();
+
+ // Build second halfspace.
+ if (positive)
+ expr -= modulus;
+ else
+ expr += modulus;
+ const Constraint second_halfspace = positive ? (expr <= 0) : (expr >= 0);
+
+ PPL_ASSERT(first_rels == Poly_Con_Relation::is_included());
+ const Poly_Con_Relation second_rels = relation_with(second_halfspace);
+ PPL_ASSERT(!second_rels.implies(Poly_Con_Relation::saturates())
+ && !second_rels.implies(Poly_Con_Relation::is_disjoint()));
+ if (second_rels.implies(Poly_Con_Relation::strictly_intersects()))
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_ASSERT(second_rels == Poly_Con_Relation::is_included());
+ return Poly_Con_Relation::is_disjoint();
+}
+
+bool
+PPL::Polyhedron::is_universe() const {
+ if (marked_empty())
+ return false;
+
+ if (space_dim == 0)
+ return true;
+
+ if (!has_pending_generators() && constraints_are_up_to_date()) {
+ // Search for a constraint that is not a tautology.
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (!con_sys[i].is_tautological())
+ return false;
+ // All the constraints are tautologies.
+ return true;
+ }
+
+ PPL_ASSERT(!has_pending_constraints() && generators_are_up_to_date());
+
+ // Try a fast-fail test.
+ dimension_type num_lines = 0;
+ dimension_type num_rays = 0;
+ const dimension_type first_pending = gen_sys.first_pending_row();
+ for (dimension_type i = first_pending; i-- > 0; )
+ switch (gen_sys[i].type()) {
+ case Generator::RAY:
+ ++num_rays;
+ break;
+ case Generator::LINE:
+ ++num_lines;
+ break;
+ default:
+ break;
+ }
+
+ if (has_pending_generators()) {
+ // The non-pending part of `gen_sys' was minimized:
+ // a success-first test is possible in this case.
+ PPL_ASSERT(generators_are_minimized());
+ if (num_lines == space_dim) {
+ PPL_ASSERT(num_rays == 0);
+ return true;
+ }
+ PPL_ASSERT(num_lines < space_dim);
+ // Now scan the pending generators.
+ dimension_type num_pending_lines = 0;
+ dimension_type num_pending_rays = 0;
+ const dimension_type gs_num_rows = gen_sys.num_rows();
+ for (dimension_type i = first_pending; i < gs_num_rows; ++i)
+ switch (gen_sys[i].type()) {
+ case Generator::RAY:
+ ++num_pending_rays;
+ break;
+ case Generator::LINE:
+ ++num_pending_lines;
+ break;
+ default:
+ break;
+ }
+ // If no pending rays and lines were found,
+ // then it is not the universe polyhedron.
+ if (num_pending_rays == 0 && num_pending_lines == 0)
+ return false;
+ // Factor away the lines already seen (to be on the safe side,
+ // we assume they are all linearly independent).
+ if (num_lines + num_pending_lines < space_dim) {
+ const dimension_type num_dims_missing
+ = space_dim - (num_lines + num_pending_lines);
+ // In order to span an n dimensional space (where n = num_dims_missing),
+ // at least n+1 rays are needed.
+ if (num_rays + num_pending_rays <= num_dims_missing)
+ return false;
+ }
+ }
+ else {
+ // There is nothing pending.
+ if (generators_are_minimized()) {
+ // The exact test is possible.
+ PPL_ASSERT(num_rays == 0 || num_lines < space_dim);
+ return num_lines == space_dim;
+ }
+ else
+ // Only the fast-fail test can be computed: in order to span
+ // an n dimensional space (where n = space_dim - num_lines),
+ // at least n+1 rays are needed.
+ if (num_lines < space_dim && num_lines + num_rays <= space_dim)
+ return false;
+ }
+
+ // We need the polyhedron in minimal form.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_minimized())
+ minimize();
+ if (is_necessarily_closed())
+ return con_sys.num_rows() == 1
+ && con_sys[0].is_inequality()
+ && con_sys[0].is_tautological();
+ else {
+ // NNC polyhedron.
+ if (con_sys.num_rows() != 2
+ || con_sys[0].is_equality()
+ || con_sys[1].is_equality())
+ return false;
+ else {
+ // If the system of constraints contains two rows that
+ // are not equalities, we are sure that they are
+ // epsilon constraints: in this case we know that
+ // the polyhedron is universe.
+#ifndef NDEBUG
+ obtain_sorted_constraints();
+ const Constraint& eps_leq_one = con_sys[0];
+ const Constraint& eps_geq_zero = con_sys[1];
+ PPL_ASSERT(eps_leq_one.inhomogeneous_term() > 0
+ && eps_leq_one.epsilon_coefficient() < 0
+ && eps_geq_zero.inhomogeneous_term() == 0
+ && eps_geq_zero.epsilon_coefficient() > 0);
+ PPL_ASSERT(eps_leq_one.expression().all_homogeneous_terms_are_zero());
+ PPL_ASSERT(eps_geq_zero.expression().all_homogeneous_terms_are_zero());
+#endif
+ return true;
+ }
+ }
+}
+
+bool
+PPL::Polyhedron::is_bounded() const {
+ // A zero-dimensional or empty polyhedron is bounded.
+ if (space_dim == 0
+ || marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ return true;
+
+ // If the system of generators contains any line or a ray,
+ // then the polyhedron is unbounded.
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+ if (gen_sys[i].is_line_or_ray())
+ return false;
+
+ // The system of generators is composed only by
+ // points and closure points: the polyhedron is bounded.
+ return true;
+}
+
+bool
+PPL::Polyhedron::is_topologically_closed() const {
+ // Necessarily closed polyhedra are trivially closed.
+ if (is_necessarily_closed())
+ return true;
+ // Any empty or zero-dimensional polyhedron is closed.
+ if (marked_empty()
+ || space_dim == 0
+ || (has_something_pending() && !process_pending()))
+ return true;
+
+ // At this point there are no pending constraints or generators.
+ PPL_ASSERT(!has_something_pending());
+
+ if (generators_are_minimized()) {
+ // A polyhedron is closed if and only if all of its (non-redundant)
+ // closure points are matched by a corresponding point.
+ const dimension_type n_rows = gen_sys.num_rows();
+ const dimension_type n_lines = gen_sys.num_lines();
+ for (dimension_type i = n_rows; i-- > n_lines; ) {
+ const Generator& gen_sys_i = gen_sys[i];
+ if (gen_sys_i.is_closure_point()) {
+ bool gen_sys_i_has_no_matching_point = true;
+ for (dimension_type j = n_rows; j-- > n_lines; ) {
+ const Generator& gen_sys_j = gen_sys[j];
+ if (i != j
+ && gen_sys_j.is_point()
+ && gen_sys_i.is_matching_closure_point(gen_sys_j)) {
+ gen_sys_i_has_no_matching_point = false;
+ break;
+ }
+ }
+ if (gen_sys_i_has_no_matching_point)
+ return false;
+ }
+ }
+ // All closure points are matched.
+ return true;
+ }
+
+ // A polyhedron is closed if, after strong minimization
+ // of its constraint system, it has no strict inequalities.
+ strongly_minimize_constraints();
+ return marked_empty() || !con_sys.has_strict_inequalities();
+}
+
+bool
+PPL::Polyhedron::contains_integer_point() const {
+ // Any empty polyhedron does not contain integer points.
+ if (marked_empty())
+ return false;
+
+ // A zero-dimensional, universe polyhedron has, by convention, an
+ // integer point.
+ if (space_dim == 0)
+ return true;
+
+ // CHECKME: do we really want to call conversion to check for emptiness?
+ if (has_pending_constraints() && !process_pending())
+ // Empty again.
+ return false;
+
+ // FIXME: do also exploit info regarding rays and lines, if possible.
+ // Is any integer point already available?
+ PPL_ASSERT(!has_pending_constraints());
+ if (generators_are_up_to_date())
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+ if (gen_sys[i].is_point() && gen_sys[i].divisor() == 1)
+ return true;
+
+ const Constraint_System& cs = constraints();
+#if 0 // TEMPORARILY DISABLED.
+ MIP_Problem mip(space_dim,
+ cs.begin(), cs.end(),
+ Variables_Set(Variable(0), Variable(space_dim-1)));
+#else
+ // FIXME: temporary workaround, to be removed as soon as the MIP
+ // problem class will correctly and precisely handle
+ // ((strict) in-) equality constraints having all integer variables.
+ MIP_Problem mip(space_dim);
+ mip.add_to_integer_space_dimensions(Variables_Set(Variable(0),
+ Variable(space_dim-1)));
+ PPL_DIRTY_TEMP_COEFFICIENT(homogeneous_gcd);
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ PPL_DIRTY_TEMP(mpq_class, rational_inhomogeneous);
+ PPL_DIRTY_TEMP_COEFFICIENT(tightened_inhomogeneous);
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ const Constraint::Type c_type = c.type();
+ const Coefficient& inhomogeneous = c.inhomogeneous_term();
+ if (c_type == Constraint::STRICT_INEQUALITY) {
+ // CHECKME: should we change the behavior of Linear_Expression(c) ?
+ // Compute the GCD of the coefficients of c
+ // (disregarding the inhomogeneous term and the epsilon dimension).
+ homogeneous_gcd = c.expression().gcd(1, space_dim + 1);
+ if (homogeneous_gcd == 0) {
+ // NOTE: since tautological constraints are already filtered away
+ // by iterators, here we must have an inconsistent constraint.
+ PPL_ASSERT(c.is_inconsistent());
+ return false;
+ }
+ Linear_Expression le(c.expression());
+ if (homogeneous_gcd != 1)
+ le /= homogeneous_gcd;
+ // Further tighten the constraint if the inhomogeneous term
+ // was integer, i.e., if `homogeneous_gcd' divides `inhomogeneous'.
+ gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+ if (gcd == homogeneous_gcd)
+ le -= 1;
+ mip.add_constraint(le >= 0);
+ }
+ else {
+ // Equality or non-strict inequality.
+ // If possible, avoid useless gcd computations.
+ if (inhomogeneous == 0)
+ // The inhomogeneous term cannot be tightened.
+ mip.add_constraint(c);
+ else {
+ // Compute the GCD of the coefficients of c
+ // (disregarding the inhomogeneous term)
+ // to see whether or not the inhomogeneous term can be tightened.
+ homogeneous_gcd = c.expression().gcd(1, space_dim + 1);
+ if (homogeneous_gcd == 0) {
+ // NOTE: since tautological constraints are already filtered away
+ // by iterators, here we must have an inconsistent constraint.
+ PPL_ASSERT(c.is_inconsistent());
+ return false;
+ }
+ else if (homogeneous_gcd == 1)
+ // The normalized inhomogeneous term is integer:
+ // add the constraint as-is.
+ mip.add_constraint(c);
+ else {
+ PPL_ASSERT(homogeneous_gcd > 1);
+ // Here the normalized inhomogeneous term is rational:
+ // the constraint has to be tightened.
+#ifndef NDEBUG
+ // `homogeneous_gcd' does not divide `inhomogeneous'.
+ // FIXME: add a divisibility test for Coefficient.
+ gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+ PPL_ASSERT(gcd == 1);
+#endif
+ if (c.type() == Constraint::EQUALITY)
+ return false;
+ // Extract the homogeneous part of the constraint.
+ Linear_Expression le(c.expression());
+ le -= inhomogeneous;
+ // Tighten the inhomogeneous term.
+ assign_r(rational_inhomogeneous.get_num(),
+ inhomogeneous, ROUND_NOT_NEEDED);
+ assign_r(rational_inhomogeneous.get_den(),
+ homogeneous_gcd, ROUND_NOT_NEEDED);
+ // Note: canonicalization is not needed (as gcd == 1).
+ PPL_ASSERT(is_canonical(rational_inhomogeneous));
+ assign_r(tightened_inhomogeneous,
+ rational_inhomogeneous, ROUND_DOWN);
+ tightened_inhomogeneous *= homogeneous_gcd;
+ le += tightened_inhomogeneous;
+ mip.add_constraint(le >= 0);
+ }
+ }
+ }
+ }
+#endif // TEMPORARY WORKAROUND.
+ return mip.is_satisfiable();
+}
+
+bool
+PPL::Polyhedron::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ // An empty polyhedron constrains all variables.
+ if (marked_empty())
+ return true;
+
+ if (generators_are_up_to_date() && !has_pending_constraints()) {
+ // Since generators are up-to-date and there are no pending
+ // constraints, the generator system (since it is well formed)
+ // contains a point. Hence the polyhedron is not empty.
+ if (constraints_are_up_to_date() && !has_pending_generators())
+ // Here a variable is constrained if and only if it is
+ // syntactically constrained.
+ goto syntactic_check;
+
+ if (generators_are_minimized()) {
+ // Try a quick, incomplete check for the universe polyhedron:
+ // a universe polyhedron constrains no variable.
+ // Count the number of non-pending
+ // (hence, linearly independent) lines.
+ dimension_type num_lines = 0;
+ const dimension_type first_pending = gen_sys.first_pending_row();
+ for (dimension_type i = first_pending; i-- > 0; )
+ if (gen_sys[i].is_line())
+ ++num_lines;
+
+ if (num_lines == space_dim)
+ return false;
+ }
+
+ // Scan generators: perhaps we will find a generator equivalent to
+ // line(var) or a pair of generators equivalent to ray(-var) and
+ // ray(var).
+ bool have_positive_ray = false;
+ bool have_negative_ray = false;
+ const dimension_type var_id = var.id();
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& gen_sys_i = gen_sys[i];
+ if (gen_sys_i.is_line_or_ray()) {
+ const int sign = sgn(gen_sys_i.coefficient(var));
+ if (sign != 0) {
+ if (gen_sys_i.expression().all_zeroes(1, var_id)
+ && gen_sys_i.expression().all_zeroes(var_id + 1, space_dim + 1)) {
+
+ if (gen_sys_i.is_line())
+ return true;
+ if (sign > 0)
+ if (have_negative_ray)
+ return true;
+ else
+ have_positive_ray = true;
+ else if (have_positive_ray)
+ return true;
+ else
+ have_negative_ray = true;
+ }
+ }
+ }
+ }
+
+ // We are still here: at least we know that, since generators are
+ // up-to-date and there are no pending constraints, then the
+ // generator system (since it is well formed) contains a point.
+ // Hence the polyhedron is not empty.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+ goto syntactic_check;
+ }
+
+ // We must minimize to detect emptiness and obtain constraints.
+ if (!minimize())
+ return true;
+
+ syntactic_check:
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i].coefficient(var) != 0)
+ return true;
+ return false;
+}
+
+bool
+PPL::Polyhedron::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // Check whether the topologies of `con_sys' and `gen_sys' agree.
+ if (con_sys.topology() != gen_sys.topology()) {
+#ifndef NDEBUG
+ cerr << "Constraints and generators have different topologies!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ goto bomb;
+
+ if (marked_empty()) {
+ if (check_not_empty) {
+ // The caller does not want the polyhedron to be empty.
+#ifndef NDEBUG
+ cerr << "Empty polyhedron!" << endl;
+#endif
+ goto bomb;
+ }
+
+ // An empty polyhedron is allowed if the system of constraints
+ // either has no rows or only contains an unsatisfiable constraint
+ // and if it has no pending constraints or generators.
+ if (has_something_pending()) {
+#ifndef NDEBUG
+ cerr << "The polyhedron is empty, "
+ << "but it has something pending" << endl;
+#endif
+ goto bomb;
+ }
+ if (con_sys.has_no_rows())
+ return true;
+ else {
+ if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "The polyhedron is in a space of dimension "
+ << space_dim
+ << " while the system of constraints is in a space of dimension "
+ << con_sys.space_dimension()
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (con_sys.num_rows() != 1) {
+#ifndef NDEBUG
+ cerr << "The system of constraints for an empty polyhedron "
+ << "has more then one row"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (!con_sys[0].is_inconsistent()) {
+#ifndef NDEBUG
+ cerr << "Empty polyhedron with a satisfiable system of constraints"
+ << endl;
+#endif
+ goto bomb;
+ }
+ // Here we have only one, inconsistent constraint.
+ return true;
+ }
+ }
+
+ // A zero-dimensional, non-empty polyhedron is legal only if the
+ // system of constraint `con_sys' and the system of generators
+ // `gen_sys' have no rows.
+ if (space_dim == 0) {
+ if (has_something_pending()) {
+#ifndef NDEBUG
+ cerr << "Zero-dimensional polyhedron with something pending"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (!con_sys.has_no_rows() || !gen_sys.has_no_rows()) {
+#ifndef NDEBUG
+ cerr << "Zero-dimensional polyhedron with a non-empty"
+ << endl
+ << "system of constraints or generators."
+ << endl;
+#endif
+ goto bomb;
+ }
+ return true;
+ }
+
+ // A polyhedron is defined by a system of constraints
+ // or a system of generators: at least one of them must be up to date.
+ if (!constraints_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+ cerr << "Polyhedron not empty, not zero-dimensional"
+ << endl
+ << "and with neither constraints nor generators up-to-date!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ // Here we check if the size of the matrices is consistent.
+ // Let us suppose that all the matrices are up-to-date; this means:
+ // `con_sys' : number of constraints x poly_num_columns
+ // `gen_sys' : number of generators x poly_num_columns
+ // `sat_c' : number of generators x number of constraints
+ // `sat_g' : number of constraints x number of generators.
+ if (constraints_are_up_to_date()) {
+ if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and space_dim)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (sat_c_is_up_to_date())
+ if (con_sys.first_pending_row() != sat_c.num_columns()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and sat_c)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (sat_g_is_up_to_date())
+ if (con_sys.first_pending_row() != sat_g.num_rows()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and sat_g)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (generators_are_up_to_date())
+ if (con_sys.space_dimension() != gen_sys.space_dimension()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and gen_sys)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+
+ if (generators_are_up_to_date()) {
+ if (gen_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (gen_sys and space_dim)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (sat_c_is_up_to_date())
+ if (gen_sys.first_pending_row() != sat_c.num_rows()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (gen_sys and sat_c)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ if (sat_g_is_up_to_date())
+ if (gen_sys.first_pending_row() != sat_g.num_columns()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (gen_sys and sat_g)"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ if (gen_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+ cerr << "Up-to-date generator system with all rows pending!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ // A non-empty system of generators describing a polyhedron
+ // is valid if and only if it contains a point.
+ if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
+#ifndef NDEBUG
+ cerr << "Non-empty generator system declared up-to-date "
+ << "has no points!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+#if 0 // To be activated when Status keeps strong minimization flags.
+ //=================================================
+ // TODO: this test is wrong in the general case.
+ // However, such an invariant does hold for a
+ // strongly-minimized Generator_System.
+ // We will activate this test as soon as the Status
+ // flags will be able to remember if a system is
+ // strongly minimized.
+
+ // Checking that the number of closure points is always
+ // greater than the number of points.
+ if (!is_necessarily_closed()) {
+ dimension_type num_points = 0;
+ dimension_type num_closure_points = 0;
+ dimension_type eps_index = gen_sys.space_dimension() + 1;
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+ if (!gen_sys[i].is_line_or_ray())
+ if (gen_sys[i][eps_index] > 0)
+ ++num_points;
+ else
+ ++num_closure_points;
+ if (num_points > num_closure_points) {
+#ifndef NDEBUG
+ cerr << "# POINTS > # CLOSURE_POINTS" << endl;
+#endif
+ goto bomb;
+ }
+ }
+ //=================================================
+#endif
+
+ if (generators_are_minimized()) {
+ // If the system of generators is minimized, the number of
+ // lines, rays and points of the polyhedron must be the same as
+ // of a temporary, minimized one. If this does not happen then
+ // the polyhedron is not OK.
+ Constraint_System new_con_sys(topology(), default_con_sys_repr);
+ Generator_System gs_without_pending = gen_sys;
+ gs_without_pending.remove_trailing_rows(gs_without_pending.num_rows()
+ - gen_sys.first_pending_row());
+ gs_without_pending.unset_pending_rows();
+ Generator_System copy_of_gen_sys = gs_without_pending;
+ Bit_Matrix new_sat_c;
+ minimize(false, copy_of_gen_sys, new_con_sys, new_sat_c);
+ const dimension_type copy_num_lines = copy_of_gen_sys.num_lines();
+ if (gs_without_pending.num_rows() != copy_of_gen_sys.num_rows()
+ || gs_without_pending.num_lines() != copy_num_lines
+ || gs_without_pending.num_rays() != copy_of_gen_sys.num_rays()) {
+#ifndef NDEBUG
+ cerr << "Generators are declared minimized, but they are not!\n"
+ << "Here is the minimized form of the generators:\n";
+ copy_of_gen_sys.ascii_dump(cerr);
+ cerr << endl;
+#endif
+ goto bomb;
+ }
+
+ // CHECKME : the following observation is not formally true
+ // for a NNC_Polyhedron. But it may be true for its
+ // representation ...
+
+ // If the corresponding polyhedral cone is _pointed_, then
+ // a minimal system of generators is unique up to positive scaling.
+ // We thus verify if the cone is pointed (i.e., there are no lines)
+ // and, after normalizing and sorting a copy of the system `gen_sys'
+ // of the polyhedron (we use a copy not to modify the polyhedron's
+ // system) and the system `copy_of_gen_sys' that has been just
+ // minimized, we check if the two matrices are identical. If
+ // they are different it means that the generators of the
+ // polyhedron are declared minimized, but they are not.
+ if (copy_num_lines == 0) {
+ copy_of_gen_sys.strong_normalize();
+ copy_of_gen_sys.sort_rows();
+ gs_without_pending.strong_normalize();
+ gs_without_pending.sort_rows();
+ if (copy_of_gen_sys != gs_without_pending) {
+#ifndef NDEBUG
+ cerr << "Generators are declared minimized, but they are not!\n"
+ << "(we are in the case:\n"
+ << "dimension of lineality space equal to 0)\n"
+ << "Here is the minimized form of the generators:\n";
+ copy_of_gen_sys.ascii_dump(cerr);
+ cerr << endl;
+#endif
+ goto bomb;
+ }
+ }
+ }
+ }
+
+ if (constraints_are_up_to_date()) {
+ if (con_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+ cerr << "Up-to-date constraint system with all rows pending!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ // A non-empty system of constraints describing a polyhedron
+ // must contain a constraint with a non-zero inhomogeneous term;
+ // such a constraint corresponds to (a combination of other
+ // constraints with):
+ // -* the positivity constraint, for necessarily closed polyhedra;
+ // -* the epsilon <= 1 constraint, for NNC polyhedra.
+ bool no_positivity_constraint = true;
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i].inhomogeneous_term() != 0) {
+ no_positivity_constraint = false;
+ break;
+ }
+ if (no_positivity_constraint) {
+#ifndef NDEBUG
+ cerr << "Non-empty constraint system has no positivity constraint"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ if (!is_necessarily_closed()) {
+ // A non-empty system of constraints describing a NNC polyhedron
+ // must also contain a (combination of) the constraint epsilon >= 0,
+ // i.e., a constraint with a positive epsilon coefficient.
+ bool no_epsilon_geq_zero = true;
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i].epsilon_coefficient() > 0) {
+ no_epsilon_geq_zero = false;
+ break;
+ }
+ if (no_epsilon_geq_zero) {
+#ifndef NDEBUG
+ cerr << "Non-empty constraint system for NNC polyhedron "
+ << "has no epsilon >= 0 constraint"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+
+ Constraint_System cs_without_pending = con_sys;
+ cs_without_pending.remove_trailing_rows(cs_without_pending.num_rows()
+ - con_sys.first_pending_row());
+ cs_without_pending.unset_pending_rows();
+ Constraint_System copy_of_con_sys = cs_without_pending;
+ bool empty = false;
+ if (check_not_empty || constraints_are_minimized()) {
+ Generator_System new_gen_sys(topology(), default_gen_sys_repr);
+ Bit_Matrix new_sat_g;
+ empty = minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g);
+ }
+
+ if (empty && check_not_empty) {
+#ifndef NDEBUG
+ cerr << "Unsatisfiable system of constraints!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+ if (constraints_are_minimized()) {
+ // If the constraints are minimized, the number of equalities
+ // and of inequalities of the system of the polyhedron must be
+ // the same of the temporary minimized one.
+ // If it does not happen, the polyhedron is not OK.
+ if (cs_without_pending.num_rows() != copy_of_con_sys.num_rows()
+ || cs_without_pending.num_equalities()
+ != copy_of_con_sys.num_equalities()) {
+#ifndef NDEBUG
+ cerr << "Constraints are declared minimized, but they are not!\n"
+ << "Here is the minimized form of the constraints:\n";
+ copy_of_con_sys.ascii_dump(cerr);
+ cerr << endl;
+#endif
+ goto bomb;
+ }
+ // The system `copy_of_con_sys' has the form that is obtained
+ // after applying methods gauss() and back_substitute().
+ // A system of constraints can be minimal even if it does not
+ // have this form. So, to verify if the polyhedron is correct,
+ // we copy the system `con_sys' in a temporary one and then
+ // modify it using method simplify() (which calls both gauss()
+ // and back_substitute()).
+ // If the temporary system and `copy_of_con_sys' are different,
+ // the polyhedron is not OK.
+ copy_of_con_sys.strong_normalize();
+ copy_of_con_sys.sort_rows();
+ cs_without_pending.simplify();
+ cs_without_pending.strong_normalize();
+ cs_without_pending.sort_rows();
+ if (cs_without_pending != copy_of_con_sys) {
+#ifndef NDEBUG
+ cerr << "Constraints are declared minimized, but they are not!\n"
+ << "Here is the minimized form of the constraints:\n";
+ copy_of_con_sys.ascii_dump(cerr);
+ cerr << endl;
+#endif
+ goto bomb;
+ }
+ }
+ }
+
+ if (sat_c_is_up_to_date())
+ for (dimension_type i = sat_c.num_rows(); i-- > 0; ) {
+ const Generator tmp_gen = gen_sys[i];
+ const Bit_Row tmp_sat = sat_c[i];
+ for (dimension_type j = sat_c.num_columns(); j-- > 0; ) {
+ const bool sat_j = (Scalar_Products::sign(con_sys[j], tmp_gen) == 0);
+ if (sat_j == tmp_sat[j]) {
+#ifndef NDEBUG
+ cerr << "sat_c is declared up-to-date, but it is not!"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+ }
+
+ if (sat_g_is_up_to_date())
+ for (dimension_type i = sat_g.num_rows(); i-- > 0; ) {
+ const Constraint tmp_con = con_sys[i];
+ const Bit_Row tmp_sat = sat_g[i];
+ for (dimension_type j = sat_g.num_columns(); j-- > 0; ) {
+ const bool sat_j = (Scalar_Products::sign(tmp_con, gen_sys[j]) == 0);
+ if (sat_j == tmp_sat[j]) {
+#ifndef NDEBUG
+ cerr << "sat_g is declared up-to-date, but it is not!"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+ }
+
+ if (has_pending_constraints()) {
+ if (con_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+ cerr << "The polyhedron is declared to have pending constraints, "
+ << "but con_sys has no pending rows!"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+
+ if (has_pending_generators()) {
+ if (gen_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+ cerr << "The polyhedron is declared to have pending generators, "
+ << "but gen_sys has no pending rows!"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+
+ return true;
+
+ bomb:
+#ifndef NDEBUG
+ cerr << "Here is the guilty polyhedron:"
+ << endl;
+ ascii_dump(cerr);
+#endif
+ return false;
+}
+
+void
+PPL::Polyhedron::add_constraint(const Constraint& c) {
+ // Topology-compatibility check.
+ if (c.is_strict_inequality() && is_necessarily_closed()) {
+ // Trivially true/false strict inequalities are legal.
+ if (c.is_tautological())
+ return;
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Here c is a non-trivial strict inequality.
+ throw_topology_incompatible("add_constraint(c)", "c", c);
+ }
+
+ // Dimension-compatibility check:
+ // the dimension of `c' can not be greater than space_dim.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", "c", c);
+
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::add_congruence(const Congruence& cg) {
+ // Dimension-compatibility check:
+ // the dimension of `cg' can not be greater than space_dim.
+ if (space_dim < cg.space_dimension())
+ throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+ // Handle the case of proper congruences first.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_tautological())
+ return;
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Non-trivial and proper congruences are not allowed.
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a non-trivial, proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ // Handle empty and 0-dim cases first.
+ if (marked_empty())
+ return;
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ set_empty();
+ return;
+ }
+
+ // Add the equality.
+ Linear_Expression le(cg.expression());
+ const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::add_generator(const Generator& g) {
+ // Topology-compatibility check.
+ if (g.is_closure_point() && is_necessarily_closed())
+ throw_topology_incompatible("add_generator(g)", "g", g);
+ // Dimension-compatibility check:
+ // the dimension of `g' can not be greater than space_dim.
+ const dimension_type g_space_dim = g.space_dimension();
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("add_generator(g)", "g", g);
+
+ // Dealing with a zero-dimensional space polyhedron first.
+ if (space_dim == 0) {
+ // It is not possible to create 0-dim rays or lines.
+ PPL_ASSERT(g.is_point() || g.is_closure_point());
+ // Closure points can only be inserted in non-empty polyhedra.
+ if (marked_empty()) {
+ if (g.type() != Generator::POINT)
+ throw_invalid_generator("add_generator(g)", "g");
+ else
+ set_zero_dim_univ();
+ }
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ if (marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Here the polyhedron is empty:
+ // the specification says we can only insert a point.
+ if (!g.is_point())
+ throw_invalid_generator("add_generator(g)", "g");
+ if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+ gen_sys.insert(g);
+ // Since `gen_sys' was empty, after inserting `g' we have to resize
+ // the system of generators to have the right dimension.
+ gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+ if (!is_necessarily_closed()) {
+ // In the NNC topology, each point has to be matched by
+ // a corresponding closure point:
+ // turn the just inserted point into the corresponding
+ // (normalized) closure point.
+ gen_sys.sys.rows.back().set_epsilon_coefficient(0);
+ gen_sys.sys.rows.back().expr.normalize();
+ PPL_ASSERT(gen_sys.sys.rows.back().OK());
+ PPL_ASSERT(gen_sys.sys.OK());
+ // Re-insert the point (which is already normalized).
+ gen_sys.insert(g);
+ }
+ }
+ else {
+ // Note: here we have a _legal_ topology mismatch,
+ // because `g' is NOT a closure point (it is a point!)
+ // However, by barely invoking `gen_sys.insert(g)' we would
+ // cause a change in the topology of `gen_sys', which is wrong.
+ // Thus, we insert a "topology corrected" copy of `g'.
+ const Linear_Expression nc_expr(g.expression());
+ gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+ // Since `gen_sys' was empty, after inserting `g' we have to resize
+ // the system of generators to have the right dimension.
+ gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+ }
+ // No longer empty, generators up-to-date and minimized.
+ clear_empty();
+ set_generators_minimized();
+ }
+ else {
+ PPL_ASSERT(generators_are_up_to_date());
+ const bool has_pending = can_have_something_pending();
+ if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+ // Since `gen_sys' is not empty, the topology and space dimension
+ // of the inserted generator are automatically adjusted.
+ if (has_pending)
+ gen_sys.insert_pending(g);
+ else
+ gen_sys.insert(g);
+ if (!is_necessarily_closed() && g.is_point()) {
+ // In the NNC topology, each point has to be matched by
+ // a corresponding closure point:
+ // turn the just inserted point into the corresponding
+ // (normalized) closure point.
+ gen_sys.sys.rows.back().set_epsilon_coefficient(0);
+ gen_sys.sys.rows.back().expr.normalize();
+ PPL_ASSERT(gen_sys.sys.rows.back().OK());
+ PPL_ASSERT(gen_sys.sys.OK());
+ // Re-insert the point (which is already normalized).
+ if (has_pending)
+ gen_sys.insert_pending(g);
+ else
+ gen_sys.insert(g);
+ }
+ }
+ else {
+ PPL_ASSERT(!g.is_closure_point());
+ // Note: here we have a _legal_ topology mismatch, because
+ // `g' is NOT a closure point.
+ // However, by barely invoking `gen_sys.insert(g)' we would
+ // cause a change in the topology of `gen_sys', which is wrong.
+ // Thus, we insert a "topology corrected" copy of `g'.
+ const Linear_Expression nc_expr(g.expression());
+ switch (g.type()) {
+ case Generator::LINE:
+ if (has_pending)
+ gen_sys.insert_pending(Generator::line(nc_expr));
+ else
+ gen_sys.insert(Generator::line(nc_expr));
+ break;
+ case Generator::RAY:
+ if (has_pending)
+ gen_sys.insert_pending(Generator::ray(nc_expr));
+ else
+ gen_sys.insert(Generator::ray(nc_expr));
+ break;
+ case Generator::POINT:
+ if (has_pending)
+ gen_sys.insert_pending(Generator::point(nc_expr, g.divisor()));
+ else
+ gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+
+ if (has_pending)
+ set_generators_pending();
+ else {
+ // After adding the new generator,
+ // constraints are no longer up-to-date.
+ clear_generators_minimized();
+ clear_constraints_up_to_date();
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) {
+ // Topology compatibility check.
+ if (is_necessarily_closed() && cs.has_strict_inequalities()) {
+ // We check if _all_ strict inequalities in cs are trivially false.
+ // (The iterators already filter away trivially true constraints.)
+ for (Constraint_System::const_iterator i = cs.begin(),
+ i_end = cs.end(); i != i_end; ++i) {
+ if (i->is_strict_inequality()
+ && !i->is_inconsistent())
+ throw_topology_incompatible("add_recycled_constraints(cs)",
+ "cs", cs);
+ }
+ // If we reach this point, all strict inequalities were inconsistent.
+ set_empty();
+ return;
+ }
+
+ // Dimension-compatibility check:
+ // the dimension of `cs' can not be greater than space_dim.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_dimension_incompatible("add_recycled_constraints(cs)", "cs", cs);
+
+ // Adding no constraints is a no-op.
+ if (cs.has_no_rows())
+ return;
+
+ if (space_dim == 0) {
+ // In a 0-dimensional space the constraints are
+ // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+ // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+ // In a system of constraints `begin()' and `end()' are equal
+ // if and only if the system only contains tautologies.
+ if (cs.begin() != cs.end())
+ // There is a constraint, it must be inconsistent,
+ // the polyhedron is empty.
+ status.set_empty();
+ return;
+ }
+
+ if (marked_empty())
+ return;
+
+ // The constraints (possibly with pending rows) are required.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ // Adjust `cs' to the right topology and space dimension.
+ // NOTE: we already checked for topology compatibility.
+ cs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+ const bool adding_pending = can_have_something_pending();
+
+ // Here we do not require `con_sys' to be sorted.
+ // also, we _recycle_ (instead of copying) the coefficients of `cs'.
+ if (adding_pending) {
+ con_sys.insert_pending(cs, Recycle_Input());
+ set_constraints_pending();
+ }
+ else {
+ con_sys.insert(cs, Recycle_Input());
+ // Constraints are not minimized and generators are not up-to-date.
+ clear_constraints_minimized();
+ clear_generators_up_to_date();
+ }
+
+ // Note: the constraint system may have become unsatisfiable, thus
+ // we do not check for satisfiability.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_constraints(const Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ Constraint_System cs_copy = cs;
+ add_recycled_constraints(cs_copy);
+}
+
+void
+PPL::Polyhedron::add_recycled_generators(Generator_System& gs) {
+ // Topology compatibility check.
+ if (is_necessarily_closed() && gs.has_closure_points())
+ throw_topology_incompatible("add_recycled_generators(gs)", "gs", gs);
+ // Dimension-compatibility check:
+ // the dimension of `gs' can not be greater than space_dim.
+ const dimension_type gs_space_dim = gs.space_dimension();
+ if (space_dim < gs_space_dim)
+ throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
+
+ // Adding no generators is a no-op.
+ if (gs.has_no_rows())
+ return;
+
+ // Adding valid generators to a zero-dimensional polyhedron
+ // transform it in the zero-dimensional universe polyhedron.
+ if (space_dim == 0) {
+ if (marked_empty() && !gs.has_points())
+ throw_invalid_generators("add_recycled_generators(gs)", "gs");
+ set_zero_dim_univ();
+ PPL_ASSERT_HEAVY(OK(true));
+ return;
+ }
+
+ // Adjust `gs' to the right topology and dimensions.
+ // NOTE: we already checked for topology compatibility.
+ gs.adjust_topology_and_space_dimension(topology(), space_dim);
+ // For NNC polyhedra, each point must be matched by
+ // the corresponding closure point.
+ if (!is_necessarily_closed())
+ gs.add_corresponding_closure_points();
+
+ // The generators (possibly with pending rows) are required.
+ if ((has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !minimize())) {
+ // We have just discovered that `*this' is empty.
+ // So `gs' must contain at least one point.
+ if (!gs.has_points())
+ throw_invalid_generators("add_recycled_generators(gs)", "gs");
+ // The polyhedron is no longer empty and generators are up-to-date.
+ swap(gen_sys, gs);
+ if (gen_sys.num_pending_rows() > 0) {
+ // Even though `gs' has pending generators, since the constraints
+ // of the polyhedron are not up-to-date, the polyhedron cannot
+ // have pending generators. By integrating the pending part
+ // of `gen_sys' we may loose sortedness.
+ gen_sys.sys.index_first_pending = gen_sys.num_rows();
+ gen_sys.set_sorted(false);
+ }
+ set_generators_up_to_date();
+ clear_empty();
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ if (can_have_something_pending()) {
+ // Here we do not require `gen_sys' to be sorted.
+ // also, we _remove_ (instead of copying) the rows of `gs'
+ // (which is not a const).
+ for (dimension_type i = 0; i < gs.num_rows(); ++i) {
+ gs.sys.rows[i].set_topology(topology());
+ gen_sys.insert_pending(gs.sys.rows[i], Recycle_Input());
+ }
+ gs.clear();
+
+ set_generators_pending();
+ }
+ else {
+ // Here we do not require `gen_sys' to be sorted.
+ // also, we _remove_ (instead of copying) the coefficients of `gs'
+ // (which is not a const).
+ for (dimension_type i = 0; i < gs.num_rows(); ++i) {
+ gs.sys.rows[i].set_topology(topology());
+ gen_sys.insert(gs.sys.rows[i], Recycle_Input());
+ }
+ gs.clear();
+
+ // Constraints are not up-to-date and generators are not minimized.
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ }
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::add_generators(const Generator_System& gs) {
+ // TODO: this is just an executable specification.
+ Generator_System gs_copy = gs;
+ add_recycled_generators(gs_copy);
+}
+
+void
+PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (space_dim < cgs.space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+ Constraint_System cs;
+ bool inserted = false;
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i) {
+ const Congruence& cg = *i;
+ if (cg.is_equality()) {
+ Linear_Expression le(cg.expression());
+ const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+
+ // TODO: Consider stealing the row in c when adding it to cs.
+ cs.insert(c);
+ inserted = true;
+ }
+ else {
+ PPL_ASSERT(cg.is_proper_congruence());
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (!cg.is_tautological())
+ throw_invalid_argument("add_congruences(cgs)",
+ "cgs has a non-trivial, proper congruence");
+ }
+ }
+ // Only add cs if it contains something.
+ if (inserted)
+ add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::refine_with_constraint(const Constraint& c) {
+ // Dimension-compatibility check.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", "c", c);
+ // If the polyhedron is known to be empty, do nothing.
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::refine_with_congruence(const Congruence& cg) {
+ // Dimension-compatibility check.
+ if (space_dim < cg.space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", "cg", cg);
+
+ // If the polyhedron is known to be empty, do nothing.
+ if (marked_empty())
+ return;
+
+ // Dealing with a zero-dimensional space polyhedron first.
+ if (space_dim == 0) {
+ if (!cg.is_tautological())
+ set_empty();
+ return;
+ }
+
+ if (cg.is_equality()) {
+ Linear_Expression le(cg.expression());
+ const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ refine_no_check(c);
+ }
+}
+
+void
+PPL::Polyhedron::refine_with_constraints(const Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+
+ // Dimension-compatibility check.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_dimension_incompatible("refine_with_constraints(cs)a",
+ "cs", cs);
+
+ // Adding no constraints is a no-op.
+ if (cs.has_no_rows())
+ return;
+
+ if (space_dim == 0) {
+ // In a 0-dimensional space the constraints are
+ // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+ // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+ // In a system of constraints `begin()' and `end()' are equal
+ // if and only if the system only contains tautologies.
+ if (cs.begin() != cs.end())
+ // There is a constraint, it must be inconsistent,
+ // the polyhedron is empty.
+ status.set_empty();
+ return;
+ }
+
+ if (marked_empty())
+ return;
+
+ // The constraints (possibly with pending rows) are required.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!constraints_are_up_to_date())
+ update_constraints();
+
+ const bool adding_pending = can_have_something_pending();
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[i];
+
+ if (c.is_necessarily_closed() || !is_necessarily_closed())
+ // Since `con_sys' is not empty, the topology and space dimension
+ // of the inserted constraint are automatically adjusted.
+ if (adding_pending)
+ con_sys.insert_pending(c);
+ else
+ con_sys.insert(c);
+ else {
+ // Here we know that *this is necessarily closed so even if c is
+ // topologically closed, by barely invoking `con_sys.insert(c)' we
+ // would cause a change in the topology of `con_sys', which is
+ // wrong. Thus, we insert a topology closed and "topology
+ // corrected" version of `c'.
+ const Linear_Expression nc_expr(c.expression());
+ if (c.is_equality())
+ if (adding_pending)
+ con_sys.insert_pending(nc_expr == 0);
+ else
+ con_sys.insert(nc_expr == 0);
+ else
+ if (adding_pending)
+ con_sys.insert_pending(nc_expr >= 0);
+ else
+ con_sys.insert(nc_expr >= 0);
+ }
+ }
+
+ if (adding_pending)
+ set_constraints_pending();
+ else {
+ // Constraints are not minimized and generators are not up-to-date.
+ clear_constraints_minimized();
+ clear_generators_up_to_date();
+ }
+
+ // Note: the constraint system may have become unsatisfiable, thus
+ // we do not check for satisfiability.
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (space_dim < cgs.space_dimension())
+ throw_dimension_incompatible("refine_with_congruences(cgs)", "cgs", cgs);
+
+ Constraint_System cs;
+ bool inserted = false;
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i) {
+ if (i->is_equality()) {
+ Linear_Expression le(i->expression());
+ const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+
+ // TODO: Consider stealing the row in c when adding it to cs.
+ cs.insert(c);
+ inserted = true;
+ }
+ else if (i->is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ }
+ // Only add cgs if congruences were inserted into cgs, as the
+ // dimension of cs must be at most that of the polyhedron.
+ if (inserted)
+ add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ if (space_dim < var.space_dimension())
+ throw_dimension_incompatible("unconstrain(var)", var.space_dimension());
+
+ // Do something only if the polyhedron is non-empty.
+ if (marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ // Empty: do nothing.
+ return;
+
+ PPL_ASSERT(generators_are_up_to_date());
+ // Since `gen_sys' is not empty, the topology and space dimension
+ // of the inserted generator are automatically adjusted.
+ if (can_have_something_pending()) {
+ gen_sys.insert_pending(Generator::line(var));
+ set_generators_pending();
+ }
+ else {
+ gen_sys.insert(Generator::line(var));
+ // After adding the new generator,
+ // constraints are no longer up-to-date.
+ clear_generators_minimized();
+ clear_constraints_up_to_date();
+ }
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case also captures the only legal cylindrification
+ // of a polyhedron in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Do something only if the polyhedron is non-empty.
+ if (marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ // Empty: do nothing.
+ return;
+
+ PPL_ASSERT(generators_are_up_to_date());
+ // Since `gen_sys' is not empty, the topology and space dimension
+ // of the inserted generators are automatically adjusted.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ if (can_have_something_pending()) {
+ for ( ; vsi != vsi_end; ++vsi)
+ gen_sys.insert_pending(Generator::line(Variable(*vsi)));
+ set_generators_pending();
+ }
+ else {
+ for ( ; vsi != vsi_end; ++vsi)
+ gen_sys.insert(Generator::line(Variable(*vsi)));
+ // After adding the new generators,
+ // constraints are no longer up-to-date.
+ clear_generators_minimized();
+ clear_constraints_up_to_date();
+ }
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::intersection_assign(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("intersection_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+ // If one of the two polyhedra is empty, the intersection is empty.
+ if (x.marked_empty())
+ return;
+ if (y.marked_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ // If both polyhedra are zero-dimensional,
+ // then at this point they are necessarily non-empty,
+ // so that their intersection is non-empty too.
+ if (x.space_dim == 0)
+ return;
+
+ // Both systems of constraints have to be up-to-date,
+ // possibly having pending constraints.
+ if (x.has_pending_generators())
+ x.process_pending_generators();
+ else if (!x.constraints_are_up_to_date())
+ x.update_constraints();
+
+ if (y.has_pending_generators())
+ y.process_pending_generators();
+ else if (!y.constraints_are_up_to_date())
+ y.update_constraints();
+
+ // Here both systems are up-to-date and possibly have pending constraints
+ // (but they cannot have pending generators).
+ PPL_ASSERT(!x.has_pending_generators() && x.constraints_are_up_to_date());
+ PPL_ASSERT(!y.has_pending_generators() && y.constraints_are_up_to_date());
+
+ // If `x' can support pending constraints,
+ // the constraints of `y' are added as pending constraints of `x'.
+ if (x.can_have_something_pending()) {
+ x.con_sys.insert_pending(y.con_sys);
+ x.set_constraints_pending();
+ }
+ else {
+ // `x' cannot support pending constraints.
+ // If both constraint systems are (fully) sorted, then we can
+ // merge them; otherwise we simply add the second to the first.
+ if (x.con_sys.is_sorted()
+ && y.con_sys.is_sorted() && !y.has_pending_constraints())
+ x.con_sys.merge_rows_assign(y.con_sys);
+ else
+ x.con_sys.insert(y.con_sys);
+ // Generators are no longer up-to-date and constraints are no
+ // longer minimized.
+ x.clear_generators_up_to_date();
+ x.clear_constraints_minimized();
+ }
+ PPL_ASSERT_HEAVY(x.OK() && y.OK());
+}
+
+namespace {
+
+struct Ruled_Out_Pair {
+ PPL::dimension_type constraint_index;
+ PPL::dimension_type num_ruled_out;
+};
+
+struct Ruled_Out_Less_Than {
+ bool operator()(const Ruled_Out_Pair& x,
+ const Ruled_Out_Pair& y) const {
+ return x.num_ruled_out > y.num_ruled_out;
+ }
+};
+
+/*
+ Modifies the vector of pointers \p ineqs_p, setting to 0 those entries
+ that point to redundant inequalities or masked equalities.
+ The redundancy test is based on saturation matrix \p sat and
+ on knowing that there exists \p rank non-redundant equalities
+ (they are implicit, i.e., not explicitly listed in \p ineqs_p).
+*/
+void
+drop_redundant_inequalities(std::vector<const PPL::Constraint*>& ineqs_p,
+ const PPL::Topology topology,
+ const PPL::Bit_Matrix& sat,
+ const PPL::dimension_type rank) {
+ using namespace Parma_Polyhedra_Library;
+ const dimension_type num_rows = ineqs_p.size();
+ PPL_ASSERT(num_rows > 0);
+ // `rank' is the rank of the (implicit) system of equalities.
+ const dimension_type space_dim = ineqs_p[0]->space_dimension();
+ PPL_ASSERT(space_dim > 0 && space_dim >= rank);
+ const dimension_type num_coefficients
+ = space_dim + ((topology == NECESSARILY_CLOSED) ? 0U : 1U);
+ const dimension_type min_sat = num_coefficients - rank;
+ const dimension_type num_cols_sat = sat.num_columns();
+
+ // Perform quick redundancy test based on the number of saturators.
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ if (sat[i].empty())
+ // Masked equalities are redundant.
+ ineqs_p[i] = 0;
+ else {
+ const dimension_type num_sat = num_cols_sat - sat[i].count_ones();
+ if (num_sat < min_sat)
+ ineqs_p[i] = 0;
+ }
+ }
+
+ // Re-examine remaining inequalities.
+ // Iteration index `i' is _intentionally_ increasing.
+ for (dimension_type i = 0; i < num_rows; ++i) {
+ if (ineqs_p[i] != 0) {
+ for (dimension_type j = 0; j < num_rows; ++j) {
+ bool strict_subset;
+ if (ineqs_p[j] != 0 && i != j
+ && subset_or_equal(sat[j], sat[i], strict_subset)) {
+ if (strict_subset) {
+ ineqs_p[i] = 0;
+ break;
+ }
+ else
+ // Here `sat[j] == sat[i]'.
+ ineqs_p[j] = 0;
+ }
+ }
+ }
+ }
+}
+
+} // namespace
+
+template <typename Linear_System1, typename Row2>
+bool
+PPL::Polyhedron::add_to_system_and_check_independence(Linear_System1& eq_sys,
+ const Row2& eq) {
+ // Check if eq is linearly independent from eq_sys.
+ PPL_ASSERT(eq.is_line_or_equality());
+ eq_sys.insert(eq);
+ const PPL::dimension_type eq_sys_num_rows = eq_sys.num_rows();
+ const PPL::dimension_type rank = eq_sys.gauss(eq_sys_num_rows);
+ if (rank == eq_sys_num_rows)
+ // eq is linearly independent from eq_sys.
+ return true;
+ else {
+ // eq is not linearly independent from eq_sys.
+ PPL_ASSERT(rank == eq_sys_num_rows - 1);
+ eq_sys.remove_trailing_rows(1);
+ return false;
+ }
+}
+
+bool
+PPL::Polyhedron::simplify_using_context_assign(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("simplify_using_context_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("simplify_using_context_assign(y)", "y", y);
+
+ // Filter away the zero-dimensional case.
+ if (x.space_dim == 0) {
+ if (y.is_empty()) {
+ x.set_zero_dim_univ();
+ return false;
+ }
+ else
+ return !x.is_empty();
+ }
+
+ // If `y' is empty, the biggest enlargement for `x' is the universe.
+ if (!y.minimize()) {
+ Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+ m_swap(ph);
+ return false;
+ }
+
+ // If `x' is empty, the intersection is empty.
+ if (!x.minimize()) {
+ // Search for a constraint of `y' that is not a tautology.
+ PPL_ASSERT(!y.has_pending_generators() && y.constraints_are_up_to_date());
+ for (dimension_type i = y.con_sys.num_rows(); i-- > 0; ) {
+ const Constraint& y_con_sys_i = y.con_sys[i];
+ if (!y_con_sys_i.is_tautological()) {
+ // Found: we obtain a constraint `c' contradicting the one we
+ // found, and assign to `x' the polyhedron `ph' with `c' as
+ // the only constraint.
+ Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+ const Linear_Expression le(y_con_sys_i.expression());
+ switch (y_con_sys_i.type()) {
+ case Constraint::EQUALITY:
+ ph.refine_no_check(le == 1);
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ ph.refine_no_check(le <= -1);
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ ph.refine_no_check(le == 0);
+ break;
+ }
+ m_swap(ph);
+ PPL_ASSERT_HEAVY(OK());
+ return false;
+ }
+ }
+ // `y' is the universe: `x' cannot be enlarged.
+ return false;
+ }
+
+ PPL_ASSERT(x.constraints_are_minimized()
+ && !x.has_something_pending()
+ && y.generators_are_minimized()
+ && !y.has_something_pending());
+ const Constraint_System& x_cs = x.con_sys;
+ const dimension_type x_cs_num_rows = x_cs.num_rows();
+ const Generator_System& y_gs = y.gen_sys;
+
+ // Record into `redundant_by_y' the info about which constraints of
+ // `x' are redundant in the context `y'. Count the number of
+ // redundancies found.
+ std::vector<bool> redundant_by_y(x_cs_num_rows, false);
+ dimension_type num_redundant_by_y = 0;
+ for (dimension_type i = 0; i < x_cs_num_rows; ++i)
+ if (y_gs.satisfied_by_all_generators(x_cs[i])) {
+ redundant_by_y[i] = true;
+ ++num_redundant_by_y;
+ }
+
+ Constraint_System result_cs;
+
+ if (num_redundant_by_y < x_cs_num_rows) {
+ // Some constraints were not identified as redundant (yet?).
+ const Constraint_System& y_cs = y.con_sys;
+ const dimension_type y_cs_num_rows = y_cs.num_rows();
+ // Compute into `z' the minimized intersection of `x' and `y'.
+ const bool x_first = (x_cs_num_rows > y_cs_num_rows);
+ Polyhedron z(x_first ? x : y);
+ if (x_first)
+ z.add_constraints(y_cs);
+ else {
+ // Only copy (and then recycle) the non-redundant constraints.
+ Constraint_System tmp_cs;
+ for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+ if (!redundant_by_y[i])
+ tmp_cs.insert(x_cs[i]);
+ }
+ z.add_recycled_constraints(tmp_cs);
+ }
+ if (!z.minimize()) {
+ // The objective function is the default, zero.
+ // We do not care about minimization or maximization, since
+ // we are only interested in satisfiability.
+ MIP_Problem lp;
+ if (x.is_necessarily_closed()) {
+ lp.add_space_dimensions_and_embed(x.space_dim);
+ lp.add_constraints(y_cs);
+ }
+ else {
+ // KLUDGE: temporarily mark `y_cs' if it was necessarily
+ // closed, so that we can interpret the epsilon dimension as a
+ // standard dimension. Be careful to reset the topology of `cs'
+ // even on exceptional execution path.
+ const_cast<Constraint_System&>(y_cs).mark_as_necessarily_closed();
+ try {
+ lp.add_space_dimensions_and_embed(x.space_dim+1);
+ lp.add_constraints(y_cs);
+ const_cast<Constraint_System&>(y_cs).mark_as_not_necessarily_closed();
+ }
+ catch (...) {
+ const_cast<Constraint_System&>(y_cs).mark_as_not_necessarily_closed();
+ throw;
+ }
+ }
+ // We apply the following heuristics here: constraints of `x' that
+ // are not made redundant by `y' are added to `lp' depending on
+ // the number of generators of `y' they rule out (the more generators
+ // they rule out, the sooner they are added). Of course, as soon
+ // as `lp' becomes unsatisfiable, we stop adding.
+ std::vector<Ruled_Out_Pair>
+ ruled_out_vec(x_cs_num_rows - num_redundant_by_y);
+ for (dimension_type i = 0, j = 0; i < x_cs_num_rows; ++i) {
+ if (!redundant_by_y[i]) {
+ const Constraint& c = x_cs[i];
+ const Topology_Adjusted_Scalar_Product_Sign sps(c);
+ dimension_type num_ruled_out_generators = 0;
+ for (Generator_System::const_iterator k = y_gs.begin(),
+ y_gs_end = y_gs.end(); k != y_gs_end; ++k) {
+ const Generator& g = *k;
+ const int sp_sign = sps(g, c);
+ if (x.is_necessarily_closed()) {
+ if (g.is_line()) {
+ // Lines must saturate the constraint.
+ if (sp_sign != 0)
+ goto ruled_out;
+ }
+ else {
+ // `g' is either a ray, a point or a closure point.
+ if (c.is_inequality()) {
+ // `c' is a non-strict inequality.
+ if (sp_sign < 0)
+ goto ruled_out;
+ }
+ else
+ // `c' is an equality.
+ if (sp_sign != 0)
+ goto ruled_out;
+ }
+ }
+ else
+ // The topology is not necessarily closed.
+ switch (g.type()) {
+ case Generator::LINE:
+ // Lines must saturate the constraint.
+ if (sp_sign != 0)
+ goto ruled_out;
+ break;
+ case Generator::POINT:
+ // Have to perform the special test when dealing with
+ // a strict inequality.
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ if (sp_sign != 0)
+ goto ruled_out;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (sp_sign < 0)
+ goto ruled_out;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ if (sp_sign <= 0)
+ goto ruled_out;
+ break;
+ }
+ break;
+ case Generator::RAY:
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ if (c.is_inequality()) {
+ // Constraint `c' is either a strict or a non-strict
+ // inequality.
+ if (sp_sign < 0)
+ goto ruled_out;
+ }
+ else
+ // Constraint `c' is an equality.
+ if (sp_sign != 0)
+ goto ruled_out;
+ break;
+ }
+
+ // If we reach this point, `g' satisfies `c'.
+ continue;
+ ruled_out:
+ ++num_ruled_out_generators;
+ }
+ ruled_out_vec[j].constraint_index = i;
+ ruled_out_vec[j].num_ruled_out = num_ruled_out_generators;
+ ++j;
+ }
+ }
+ std::sort(ruled_out_vec.begin(), ruled_out_vec.end(),
+ Ruled_Out_Less_Than());
+
+ for (std::vector<Ruled_Out_Pair>::const_iterator
+ j = ruled_out_vec.begin(),
+ ruled_out_vec_end = ruled_out_vec.end();
+ j != ruled_out_vec_end;
+ ++j) {
+ const Constraint& c = x_cs[j->constraint_index];
+ result_cs.insert(c);
+ lp.add_constraint(c);
+ const MIP_Problem_Status status = lp.solve();
+ if (status == UNFEASIBLE_MIP_PROBLEM) {
+ Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+ result_ph.add_constraints(result_cs);
+ swap(x, result_ph);
+ PPL_ASSERT_HEAVY(x.OK());
+ return false;
+ }
+ }
+ // Cannot exit from here.
+ PPL_UNREACHABLE;
+ }
+ else {
+ // Here `z' is not empty and minimized.
+ PPL_ASSERT(z.constraints_are_minimized()
+ && z.generators_are_minimized()
+ && !z.has_something_pending());
+ const Constraint_System& z_cs = z.con_sys;
+ const Generator_System& z_gs = z.gen_sys;
+ const dimension_type z_gs_num_rows = z_gs.num_rows();
+
+ // Compute the number of equalities in x_cs, y_cs and z_cs
+ // (exploiting minimal form knowledge).
+ dimension_type x_cs_num_eq = 0;
+ while (x_cs[x_cs_num_eq].is_equality())
+ ++x_cs_num_eq;
+ dimension_type y_cs_num_eq = 0;
+ while (y_cs[y_cs_num_eq].is_equality())
+ ++y_cs_num_eq;
+ dimension_type z_cs_num_eq = 0;
+ while (z_cs[z_cs_num_eq].is_equality())
+ ++z_cs_num_eq;
+ PPL_ASSERT(x_cs_num_eq <= z_cs_num_eq && y_cs_num_eq <= z_cs_num_eq);
+
+ // Identify non-redundant equalities.
+ Constraint_System non_redundant_eq;
+ dimension_type num_non_redundant_eq = 0;
+ const dimension_type needed_non_redundant_eq = z_cs_num_eq - y_cs_num_eq;
+ Constraint_System eqs(x.topology());
+ if (needed_non_redundant_eq > 0) {
+ // Populate eqs with the equalities from y.
+ for (dimension_type i = 0; i < y_cs_num_eq; ++i)
+ eqs.insert(y_cs[i]);
+ // Try to find another `needed_non_redundant_eq' linear independent
+ // equalities among those from x.
+ for (dimension_type i = 0; i < x_cs_num_eq; ++i) {
+ const Constraint& x_cs_i = x_cs[i];
+ if (add_to_system_and_check_independence(eqs, x_cs_i)) {
+ // x_cs_i is linear independent.
+ non_redundant_eq.insert(x_cs_i);
+ ++num_non_redundant_eq;
+ if (num_non_redundant_eq == needed_non_redundant_eq)
+ // Already found all the needed equalities.
+ break;
+ }
+ }
+ // NOTE: if num_non_redundant_eq < needed_non_redundant_eq
+ // then we haven't found all the needed equalities yet:
+ // this means that some inequalities from x actually holds
+ // as "masked" equalities in the context of y.
+ PPL_ASSERT(eqs.num_rows() <= z_cs_num_eq);
+ PPL_ASSERT(num_non_redundant_eq <= needed_non_redundant_eq);
+ PPL_ASSERT(z_cs_num_eq - eqs.num_rows()
+ == needed_non_redundant_eq - num_non_redundant_eq);
+ }
+
+ // Identify non-redundant inequalities.
+ // Avoid useless copies (no modifications are needed).
+ std::vector<const Constraint*> non_redundant_ineq_p;
+ // Fill non_redundant_ineq_p with (pointers to) inequalities
+ // from y_cs ...
+ for (dimension_type i = y_cs_num_eq; i < y_cs_num_rows; ++i)
+ non_redundant_ineq_p.push_back(&y_cs[i]);
+ // ... and (pointers to) non-redundant inequalities from x_cs.
+ for (dimension_type i = x_cs_num_eq; i < x_cs_num_rows; ++i)
+ if (!redundant_by_y[i])
+ non_redundant_ineq_p.push_back(&x_cs[i]);
+
+ const dimension_type non_redundant_ineq_p_size
+ = non_redundant_ineq_p.size();
+ const dimension_type y_cs_num_ineq = y_cs_num_rows - y_cs_num_eq;
+
+ // Compute saturation info.
+ const dimension_type sat_num_rows = non_redundant_ineq_p_size;
+ Bit_Matrix sat(sat_num_rows, z_gs_num_rows);
+ for (dimension_type i = sat_num_rows; i-- > 0; ) {
+ const Constraint& non_redundant_ineq_i = *(non_redundant_ineq_p[i]);
+ Bit_Row& sat_i = sat[i];
+ for (dimension_type j = z_gs_num_rows; j-- > 0; )
+ if (Scalar_Products::sign(non_redundant_ineq_i, z_gs[j]) != 0)
+ sat_i.set(j);
+ if (sat_i.empty() && num_non_redundant_eq < needed_non_redundant_eq) {
+ // `non_redundant_ineq_i' is actually masking an equality
+ // and we are still looking for some masked inequalities.
+ // Iteration goes downwards, so the inequality comes from x_cs.
+ PPL_ASSERT(i >= y_cs_num_ineq);
+ // Check if the equality is independent in eqs.
+ Constraint masked_eq = non_redundant_ineq_i;
+ masked_eq.set_is_line_or_equality();
+ masked_eq.sign_normalize();
+ if (add_to_system_and_check_independence(eqs, masked_eq)) {
+ // It is independent: add the _inequality_ to non_redundant_eq.
+ non_redundant_eq.insert(non_redundant_ineq_i);
+ ++num_non_redundant_eq;
+ }
+ }
+ }
+ // Here we have already found all the needed (masked) equalities.
+ PPL_ASSERT(num_non_redundant_eq == needed_non_redundant_eq);
+
+ drop_redundant_inequalities(non_redundant_ineq_p, x.topology(),
+ sat, z_cs_num_eq);
+
+ // Place the non-redundant (masked) equalities into result_cs.
+ swap(result_cs, non_redundant_eq);
+ // Add to result_cs the non-redundant inequalities from x_cs,
+ // i.e., those having indices no smaller than y_cs_num_ineq.
+ for (dimension_type i = y_cs_num_ineq;
+ i < non_redundant_ineq_p_size;
+ ++i)
+ if (non_redundant_ineq_p[i] != 0)
+ result_cs.insert(*non_redundant_ineq_p[i]);
+ }
+ }
+
+ Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+ result_ph.add_recycled_constraints(result_cs);
+ swap(x, result_ph);
+ PPL_ASSERT_HEAVY(x.OK());
+ return true;
+}
+
+void
+PPL::Polyhedron::poly_hull_assign(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("poly_hull_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("poly_hull_assign(y)", "y", y);
+
+ // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'.
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty()) {
+ x = y;
+ return;
+ }
+
+ // If both polyhedra are zero-dimensional,
+ // then at this point they are necessarily universe polyhedra,
+ // so that their poly-hull is the universe polyhedron too.
+ if (x.space_dim == 0)
+ return;
+
+ // Both systems of generators have to be up-to-date,
+ // possibly having pending generators.
+ if ((x.has_pending_constraints() && !x.process_pending_constraints())
+ || (!x.generators_are_up_to_date() && !x.update_generators())) {
+ // Discovered `x' empty when updating generators.
+ x = y;
+ return;
+ }
+ if ((y.has_pending_constraints() && !y.process_pending_constraints())
+ || (!y.generators_are_up_to_date() && !y.update_generators()))
+ // Discovered `y' empty when updating generators.
+ return;
+
+ // Here both systems are up-to-date and possibly have pending generators
+ // (but they cannot have pending constraints).
+ PPL_ASSERT(!x.has_pending_constraints() && x.generators_are_up_to_date());
+ PPL_ASSERT(!y.has_pending_constraints() && y.generators_are_up_to_date());
+
+ // If `x' can support pending generators,
+ // the generators of `y' are added as pending generators of `x'.
+ if (x.can_have_something_pending()) {
+ x.gen_sys.insert_pending(y.gen_sys);
+ x.set_generators_pending();
+ }
+ else {
+ // `x' cannot support pending generators.
+ // If both generator systems are (fully) sorted, then we can merge
+ // them; otherwise we simply add the second to the first.
+ if (x.gen_sys.is_sorted()
+ && y.gen_sys.is_sorted() && !y.has_pending_generators())
+ x.gen_sys.merge_rows_assign(y.gen_sys);
+ else
+ x.gen_sys.insert(y.gen_sys);
+ // Constraints are no longer up-to-date
+ // and generators are no longer minimized.
+ x.clear_constraints_up_to_date();
+ x.clear_generators_minimized();
+ }
+ // At this point both `x' and `y' are not empty.
+ PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+void
+PPL::Polyhedron::poly_difference_assign(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("poly_difference_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("poly_difference_assign(y)", "y", y);
+
+ // The difference of a polyhedron `p' and an empty polyhedron is `p'.
+ if (y.marked_empty())
+ return;
+ // The difference of an empty polyhedron and of a polyhedron `p' is empty.
+ if (x.marked_empty())
+ return;
+
+ // If both polyhedra are zero-dimensional,
+ // then at this point they are necessarily universe polyhedra,
+ // so that their difference is empty.
+ if (x.space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ // TODO: This is just an executable specification.
+ // Have to find a more efficient method.
+
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ // Being lazy here is only harmful.
+ // `minimize()' will process any pending constraints or generators.
+ if (!y.minimize())
+ return;
+ x.minimize();
+
+ Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
+
+ const Constraint_System& y_cs = y.constraints();
+ for (Constraint_System::const_iterator i = y_cs.begin(),
+ y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+ const Constraint& c = *i;
+ PPL_ASSERT(!c.is_tautological());
+ PPL_ASSERT(!c.is_inconsistent());
+ // If the polyhedron `x' is included in the polyhedron defined by
+ // `c', then `c' can be skipped, as adding its complement to `x'
+ // would result in the empty polyhedron. Moreover, if we operate
+ // on C-polyhedra and `c' is a non-strict inequality, c _must_ be
+ // skipped for otherwise we would obtain a result that is less
+ // precise than the poly-difference.
+ if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ Polyhedron z = x;
+ const Linear_Expression e(c.expression());
+ switch (c.type()) {
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (is_necessarily_closed())
+ z.refine_no_check(e <= 0);
+ else
+ z.refine_no_check(e < 0);
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ z.refine_no_check(e <= 0);
+ break;
+ case Constraint::EQUALITY:
+ if (is_necessarily_closed())
+ // We have already filtered out the case
+ // when `x' is included in `y': the result is `x'.
+ return;
+ else {
+ Polyhedron w = x;
+ w.refine_no_check(e < 0);
+ new_polyhedron.poly_hull_assign(w);
+ z.refine_no_check(e > 0);
+ }
+ break;
+ }
+ new_polyhedron.poly_hull_assign(z);
+ }
+ *this = new_polyhedron;
+
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ if (marked_empty())
+ return;
+
+ if (expr.coefficient(var) != 0) {
+ // The transformation is invertible:
+ // minimality and saturators are preserved, so that
+ // pending rows, if present, are correctly handled.
+ if (generators_are_up_to_date()) {
+ // Generator_System::affine_image() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ gen_sys.affine_image(var, expr, denominator);
+ else
+ gen_sys.affine_image(var, -expr, -denominator);
+ }
+ if (constraints_are_up_to_date()) {
+ // To build the inverse transformation,
+ // after copying and negating `expr',
+ // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+ Linear_Expression inverse;
+ Coefficient_traits::const_reference c = expr.coefficient(var);
+ if (c > 0) {
+ inverse = -expr;
+ inverse.set_coefficient(var, denominator);
+ con_sys.affine_preimage(var, inverse, c);
+ }
+ else {
+ // The new denominator is negative: we negate everything once
+ // more, as Constraint_System::affine_preimage() requires the
+ // third argument to be positive.
+ inverse = expr;
+ inverse.set_coefficient(var, -denominator);
+ con_sys.affine_preimage(var, inverse, -c);
+ }
+ }
+ }
+ else {
+ // The transformation is not invertible.
+ // We need an up-to-date system of generators.
+ if (has_something_pending())
+ remove_pending_to_obtain_generators();
+ else if (!generators_are_up_to_date())
+ minimize();
+ if (!marked_empty()) {
+ // Generator_System::affine_image() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ gen_sys.affine_image(var, expr, denominator);
+ else
+ gen_sys.affine_image(var, -expr, -denominator);
+
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+
+void
+PPL::Polyhedron::
+affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+ if (marked_empty())
+ return;
+
+ if (expr.coefficient(var) != 0) {
+ // The transformation is invertible:
+ // minimality and saturators are preserved.
+ if (constraints_are_up_to_date()) {
+ // Constraint_System::affine_preimage() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ con_sys.affine_preimage(var, expr, denominator);
+ else
+ con_sys.affine_preimage(var, -expr, -denominator);
+ }
+ if (generators_are_up_to_date()) {
+ // To build the inverse transformation,
+ // after copying and negating `expr',
+ // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+ Linear_Expression inverse;
+ Coefficient_traits::const_reference c = expr.coefficient(var);
+ if (c > 0) {
+ inverse = -expr;
+ inverse.set_coefficient(var, denominator);
+ gen_sys.affine_image(var, inverse, c);
+ }
+ else {
+ // The new denominator is negative:
+ // we negate everything once more, as Generator_System::affine_image()
+ // requires the third argument to be positive.
+ inverse = expr;
+ inverse.set_coefficient(var, -denominator);
+ gen_sys.affine_image(var, inverse, -c);
+ }
+ }
+ }
+ else {
+ // The transformation is not invertible.
+ // We need an up-to-date system of constraints.
+ if (has_something_pending())
+ remove_pending_to_obtain_constraints();
+ else if (!constraints_are_up_to_date())
+ minimize();
+ // Constraint_System::affine_preimage() requires the third argument
+ // to be a positive Coefficient.
+ if (denominator > 0)
+ con_sys.affine_preimage(var, expr, denominator);
+ else
+ con_sys.affine_preimage(var, -expr, -denominator);
+ // Generators, minimality and saturators are no longer valid.
+ clear_generators_up_to_date();
+ clear_constraints_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any image of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+ if (lb_expr.coefficient(var) == 0) {
+ // Here `var' may only occur in `ub_expr'.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ if (denominator > 0)
+ refine_no_check(lb_expr <= denominator*var);
+ else
+ refine_no_check(denominator*var <= lb_expr);
+ }
+ else if (ub_expr.coefficient(var) == 0) {
+ // Here `var' only occurs in `lb_expr'.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (denominator > 0)
+ refine_no_check(denominator*var <= ub_expr);
+ else
+ refine_no_check(ub_expr <= denominator*var);
+ }
+ else {
+ // Here `var' occurs in both `lb_expr' and `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `ub_expr'.
+ refine_no_check(denominator*new_var == ub_expr);
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (!marked_empty())
+ // Now apply the affine upper bound, as recorded in `new_var'.
+ refine_no_check(new_var >= var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ // Check whether `var' occurs in neither `lb_expr' nor `ub_expr'.
+ if (lb_expr.coefficient(var) == 0 && ub_expr.coefficient(var) == 0) {
+ if (denominator > 0) {
+ refine_no_check(lb_expr <= denominator*var);
+ refine_no_check(denominator*var <= ub_expr);
+ }
+ else {
+ refine_no_check(ub_expr <= denominator*var);
+ refine_no_check(denominator*var <= lb_expr);
+ }
+ unconstrain(var);
+ }
+ else {
+ // Here `var' occurs in `lb_expr' or `ub_expr'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Swap dimensions `var' and `new_var'.
+ if (constraints_are_up_to_date())
+ con_sys.swap_space_dimensions(var, new_var);
+ if (generators_are_up_to_date())
+ gen_sys.swap_space_dimensions(var, new_var);
+
+ // Constrain the new dimension as dictated by `lb_expr' and `ub_expr'.
+ // (we force minimization because we will need the generators).
+ if (denominator > 0) {
+ refine_no_check(lb_expr <= denominator*new_var);
+ refine_no_check(denominator*new_var <= ub_expr);
+ }
+ else {
+ refine_no_check(ub_expr <= denominator*new_var);
+ refine_no_check(denominator*new_var <= lb_expr);
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "v", var);
+
+ // Strict relation symbols are only admitted for NNC polyhedra.
+ if (is_necessarily_closed()
+ && (relsym == LESS_THAN || relsym == GREATER_THAN))
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // First compute the affine image.
+ affine_image(var, expr, denominator);
+
+ if (relsym == EQUAL)
+ // The affine relation is indeed an affine function.
+ return;
+
+ // Any image of an empty polyhedron is empty.
+ // Note: DO check for emptiness here, as we will later add a ray.
+ if (is_empty())
+ return;
+
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ add_generator(ray(-var));
+ break;
+ case GREATER_OR_EQUAL:
+ add_generator(ray(var));
+ break;
+ case LESS_THAN:
+ // Intentionally fall through.
+ case GREATER_THAN:
+ {
+ // The relation symbol is strict.
+ PPL_ASSERT(!is_necessarily_closed());
+ // While adding the ray, we minimize the generators
+ // in order to avoid adding too many redundant generators later.
+ add_generator(ray((relsym == GREATER_THAN) ? var : -var));
+ minimize();
+
+ // We split each point of the generator system into two generators:
+ // a closure point, having the same coordinates of the given point,
+ // and another point, having the same coordinates for all but the
+ // `var' dimension, which is displaced along the direction of the
+ // newly introduced ray.
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& gen_i = gen_sys.sys.rows[i];
+ if (gen_i.is_point()) {
+ // Add a copy of `gen_i' at the end of the system.
+ // Note: copying is really meant, to avoid undefined behavior.
+ gen_sys.sys.rows.push_back(Generator(gen_i));
+ // Note: (re-)compute references (invalidated by push_back).
+ Generator& old_gen = gen_sys.sys.rows[i];
+ Generator& new_gen = gen_sys.sys.rows.back();
+ // Transform `old_gen' into a closure point.
+ old_gen.set_epsilon_coefficient(0);
+ old_gen.expr.normalize();
+ PPL_ASSERT(old_gen.OK());
+ // Displace `new_gen' by `var' (i.e., along the new ray).
+ if (relsym == GREATER_THAN)
+ new_gen.expr += var;
+ else
+ new_gen.expr -= var;
+ new_gen.expr.normalize();
+ PPL_ASSERT(new_gen.OK());
+ }
+ }
+ // Sortedness no longer hold.
+ gen_sys.set_sorted(false);
+ gen_sys.unset_pending_rows();
+ PPL_ASSERT(gen_sys.sys.OK());
+
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "v", var);
+
+ // Strict relation symbols are only admitted for NNC polyhedra.
+ if (is_necessarily_closed()
+ && (relsym == LESS_THAN || relsym == GREATER_THAN))
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // Check whether the affine relation is indeed an affine function.
+ if (relsym == EQUAL) {
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // Compute the reversed relation symbol to simplify later coding.
+ Relation_Symbol reversed_relsym;
+ switch (relsym) {
+ case LESS_THAN:
+ reversed_relsym = GREATER_THAN;
+ break;
+ case LESS_OR_EQUAL:
+ reversed_relsym = GREATER_OR_EQUAL;
+ break;
+ case GREATER_OR_EQUAL:
+ reversed_relsym = LESS_OR_EQUAL;
+ break;
+ case GREATER_THAN:
+ reversed_relsym = LESS_THAN;
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ return;
+ }
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& var_coefficient = expr.coefficient(var);
+ if (var_coefficient != 0) {
+ const Linear_Expression inverse_expr
+ = expr - (denominator + var_coefficient) * var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+ neg_assign(inverse_denominator, var_coefficient);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denominator))
+ ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse_expr,
+ inverse_denominator);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the polyhedron by adding the constraint induced
+ // by the affine relation.
+ const Relation_Symbol corrected_relsym
+ = (denominator > 0) ? relsym : reversed_relsym;
+ switch (corrected_relsym) {
+ case LESS_THAN:
+ refine_no_check(denominator*var < expr);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(denominator*var <= expr);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(denominator*var >= expr);
+ break;
+ case GREATER_THAN:
+ refine_no_check(denominator*var > expr);
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ unconstrain(var);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are only admitted for NNC polyhedra.
+ if (is_necessarily_closed()
+ && (relsym == LESS_THAN || relsym == GREATER_THAN))
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+ lhs_space_dim = lhs.last_nonzero();
+
+ // If all variables have a zero coefficient, then `lhs' is a constant:
+ // we can simply add the constraint `lhs relsym rhs'.
+ if (lhs_space_dim == 0) {
+ switch (relsym) {
+ case LESS_THAN:
+ refine_no_check(lhs < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_no_check(lhs > rhs);
+ break;
+ case NOT_EQUAL:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ return;
+ }
+
+ // Gather in `new_lines' the collections of all the lines having
+ // the direction of variables occurring in `lhs'.
+ // While at it, check whether or not there exists a variable
+ // occurring in both `lhs' and `rhs'.
+ Generator_System new_lines;
+ for (Linear_Expression::const_iterator
+ i = lhs.begin(), i_end = lhs.end(); i != i_end; ++i)
+ new_lines.insert(line(i.variable()));
+
+ const dimension_type num_common_dims
+ = std::min(lhs.space_dimension(), rhs.space_dimension());
+ if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to the right hand side.
+ // (check for emptiness because we will add lines).
+ refine_no_check(new_var == rhs);
+ if (!is_empty()) {
+ // Existentially quantify the variables in the left hand side.
+ add_recycled_generators(new_lines);
+
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'
+ // (we force minimization because we will need the generators).
+ switch (relsym) {
+ case LESS_THAN:
+ refine_no_check(lhs < new_var);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= new_var);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == new_var);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= new_var);
+ break;
+ case GREATER_THAN:
+ refine_no_check(lhs > new_var);
+ break;
+ case NOT_EQUAL:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ else {
+ // `lhs' and `rhs' variables are disjoint:
+ // there is no need to add a further dimension.
+
+ // Any image of an empty polyhedron is empty.
+ // Note: DO check for emptiness here, as we will add lines.
+ if (is_empty())
+ return;
+
+ // Existentially quantify the variables in the left hand side.
+ add_recycled_generators(new_lines);
+
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ switch (relsym) {
+ case LESS_THAN:
+ refine_no_check(lhs < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_no_check(lhs > rhs);
+ break;
+ case NOT_EQUAL:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are only admitted for NNC polyhedra.
+ if (is_necessarily_closed()
+ && (relsym == LESS_THAN || relsym == GREATER_THAN))
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any preimage of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+ lhs_space_dim = lhs.last_nonzero();
+
+ // If all variables have a zero coefficient, then `lhs' is a constant:
+ // in this case, preimage and image happen to be the same.
+ if (lhs_space_dim == 0) {
+ generalized_affine_image(lhs, relsym, rhs);
+ return;
+ }
+
+ // Gather in `new_lines' the collections of all the lines having
+ // the direction of variables occurring in `lhs'.
+ // While at it, check whether or not there exists a variable
+ // occurring in both `lhs' and `rhs'.
+ Generator_System new_lines;
+ for (Linear_Expression::const_iterator
+ i = lhs.begin(), i_end = lhs.end(); i != i_end; ++i)
+ new_lines.insert(line(i.variable()));
+
+ const dimension_type num_common_dims
+ = std::min(lhs.space_dimension(), rhs.space_dimension());
+ if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to `lhs'
+ // (also check for emptiness because we have to add lines).
+ refine_no_check(new_var == lhs);
+ if (!is_empty()) {
+ // Existentially quantify the variables in the left hand side.
+ add_recycled_generators(new_lines);
+
+ // Constrain the new dimension so that it is related to
+ // the right hand side as dictated by `relsym'.
+ switch (relsym) {
+ case LESS_THAN:
+ refine_no_check(new_var < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(new_var <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(new_var == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(new_var >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_no_check(new_var > rhs);
+ break;
+ case NOT_EQUAL:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ else {
+ // `lhs' and `rhs' variables are disjoint:
+ // there is no need to add a further dimension.
+
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ switch (relsym) {
+ case LESS_THAN:
+ refine_no_check(lhs < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_no_check(lhs > rhs);
+ break;
+ case NOT_EQUAL:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Any image of an empty polyhedron is empty.
+ // Note: DO check for emptiness here, as we will add lines.
+ if (is_empty())
+ return;
+ // Existentially quantify all the variables occurring in `lhs'.
+ add_recycled_generators(new_lines);
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::time_elapse_assign(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("time_elapse_assign(y)", "y", y);
+ // Dimension-compatibility checks.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+ // Dealing with the zero-dimensional case.
+ if (x.space_dim == 0) {
+ if (y.marked_empty())
+ x.set_empty();
+ return;
+ }
+
+ // If either one of `x' or `y' is empty, the result is empty too.
+ if (x.marked_empty() || y.marked_empty()
+ || (x.has_pending_constraints() && !x.process_pending_constraints())
+ || (!x.generators_are_up_to_date() && !x.update_generators())
+ || (y.has_pending_constraints() && !y.process_pending_constraints())
+ || (!y.generators_are_up_to_date() && !y.update_generators())) {
+ x.set_empty();
+ return;
+ }
+
+ // At this point both generator systems are up-to-date,
+ // possibly containing pending generators.
+ Generator_System gs = y.gen_sys;
+ const dimension_type old_gs_num_rows = gs.num_rows();
+ dimension_type gs_num_rows = old_gs_num_rows;
+
+ if (!x.is_necessarily_closed()) {
+ // `x' and `y' are NNC polyhedra.
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ Generator& g = gs.sys.rows[i];
+ switch (g.type()) {
+ case Generator::POINT:
+ // The points of `gs' can be erased,
+ // since their role can be played by closure points.
+ --gs_num_rows;
+ swap(g, gs.sys.rows[gs_num_rows]);
+ break;
+ case Generator::CLOSURE_POINT:
+ {
+ // If it is the origin, erase it.
+ if (g.expr.all_homogeneous_terms_are_zero()) {
+ --gs_num_rows;
+ swap(g, gs.sys.rows[gs_num_rows]);
+ }
+ // Otherwise, transform the closure point into a ray.
+ else {
+ g.expr.set_inhomogeneous_term(0);
+ // Enforce normalization.
+ g.expr.normalize();
+ PPL_ASSERT(g.OK());
+ }
+ }
+ break;
+ case Generator::RAY:
+ case Generator::LINE:
+ // For rays and lines, nothing to be done.
+ break;
+ }
+ }
+ }
+ else {
+ // `x' and `y' are C polyhedra.
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ // For rays and lines, nothing to be done.
+ if (gs[i].is_point()) {
+ Generator& p = gs.sys.rows[i];
+ // If it is the origin, erase it.
+ if (p.expression().all_homogeneous_terms_are_zero()) {
+ --gs_num_rows;
+ swap(p, gs.sys.rows[gs_num_rows]);
+ }
+ // Otherwise, transform the point into a ray.
+ else {
+ p.expr.set_inhomogeneous_term(0);
+ // Enforce normalization.
+ p.expr.normalize();
+ PPL_ASSERT(p.OK());
+ }
+ }
+ }
+ }
+ // If it was present, erase the origin point or closure point,
+ // which cannot be transformed into a valid ray or line.
+ // For NNC polyhedra, also erase all the points of `gs',
+ // whose role can be played by the closure points.
+ // These have been previously moved to the end of `gs'.
+ gs.sys.rows.resize(gs_num_rows);
+
+ gs.unset_pending_rows();
+ PPL_ASSERT(gs.sys.OK());
+
+ // `gs' may now have no rows.
+ // Namely, this happens when `y' was the singleton polyhedron
+ // having the origin as the one and only point.
+ // In such a case, the resulting polyhedron is equal to `x'.
+ if (gs_num_rows == 0)
+ return;
+
+ // If the polyhedron can have something pending, we add `gs'
+ // to `gen_sys' as pending rows
+ if (x.can_have_something_pending()) {
+ x.gen_sys.insert_pending(gs);
+ x.set_generators_pending();
+ }
+ // Otherwise, the two systems are merged.
+ // `Linear_System::merge_rows_assign()' requires both systems to be sorted.
+ else {
+ if (!x.gen_sys.is_sorted())
+ x.gen_sys.sort_rows();
+ gs.sort_rows();
+ x.gen_sys.merge_rows_assign(gs);
+ // Only the system of generators is up-to-date.
+ x.clear_constraints_up_to_date();
+ x.clear_generators_minimized();
+ }
+ PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Polyhedron::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // If the `expr' has a constant value, then the frequency
+ // `freq_n' is 0. Otherwise the values for \p expr are not discrete
+ // and we return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 1 and the value is 0.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ // For an empty polyhedron, we simply return false.
+ if (marked_empty()
+ || (has_pending_constraints() && !process_pending_constraints())
+ || (!generators_are_up_to_date() && !update_generators()))
+ return false;
+
+ // The polyhedron has updated, possibly pending generators.
+ // The following loop will iterate through the generator
+ // to see if `expr' has a constant value.
+ PPL_DIRTY_TEMP(mpq_class, value);
+
+ // True if we have no other candidate value to compare with.
+ bool first_candidate = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sp);
+ PPL_DIRTY_TEMP(mpq_class, candidate);
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& gen_sys_i = gen_sys[i];
+ Scalar_Products::homogeneous_assign(sp, expr, gen_sys_i);
+ // Lines and rays in `*this' can cause `expr' to be non-constant.
+ if (gen_sys_i.is_line_or_ray()) {
+ const int sp_sign = sgn(sp);
+ if (sp_sign != 0)
+ // `expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // We have a point or a closure point.
+ PPL_ASSERT(gen_sys_i.is_point() || gen_sys_i.is_closure_point());
+ // Notice that we are ignoring the constant term in `expr' here.
+ // We will add it to the value if there is a constant value.
+ assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+ assign_r(candidate.get_den(), gen_sys_i.expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ candidate.canonicalize();
+ if (first_candidate) {
+ // We have a (new) candidate value.
+ first_candidate = false;
+ value = candidate;
+ }
+ else if (candidate != value)
+ return false;
+ }
+ }
+
+ // Add in the constant term in `expr'.
+ PPL_DIRTY_TEMP(mpz_class, n);
+ assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ value += n;
+ // FIXME: avoid these temporaries, if possible.
+ // This can be done adding an `assign' function working on native
+ // and checked or an operator= that have on one side a checked and
+ // on the other a native or checked.
+ // The reason why now we can't use operator= is the fact that we
+ // still can have Coefficient defined to mpz_class (and not
+ // Checked_Number<mpz_class>).
+ val_n = Coefficient(value.get_num());
+ val_d = Coefficient(value.get_den());
+
+ freq_n = 0;
+ freq_d = 1;
+ return true;
+}
+
+void
+PPL::Polyhedron::topological_closure_assign() {
+ // Necessarily closed polyhedra are trivially closed.
+ if (is_necessarily_closed())
+ return;
+ // Any empty or zero-dimensional polyhedron is closed.
+ if (marked_empty() || space_dim == 0)
+ return;
+
+ // The computation can be done using constraints or generators.
+ // If we use constraints, we will change them, so that having pending
+ // constraints would be useless. If we use generators, we add generators,
+ // so that having pending generators still makes sense.
+
+ // Process any pending constraints.
+ if (has_pending_constraints() && !process_pending_constraints())
+ return;
+
+ // Use constraints only if they are available and
+ // there are no pending generators.
+ if (!has_pending_generators() && constraints_are_up_to_date()) {
+ bool changed = false;
+
+ // Transform all strict inequalities into non-strict ones.
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; ) {
+ Constraint& c = con_sys.sys.rows[i];
+ if (c.epsilon_coefficient() < 0 && !c.is_tautological()) {
+ c.set_epsilon_coefficient(0);
+ // Enforce normalization.
+ c.expr.normalize();
+ PPL_ASSERT(c.OK());
+ changed = true;
+ }
+ }
+
+ PPL_ASSERT(con_sys.sys.OK());
+
+ if (changed) {
+ con_sys.insert(Constraint::epsilon_leq_one());
+ con_sys.set_sorted(false);
+ // After changing the system of constraints, the generators
+ // are no longer up-to-date and the constraints are no longer
+ // minimized.
+ clear_generators_up_to_date();
+ clear_constraints_minimized();
+ }
+ }
+ else {
+ // Here we use generators, possibly keeping constraints.
+ PPL_ASSERT(generators_are_up_to_date());
+ // Add the corresponding point to each closure point.
+ gen_sys.add_corresponding_points();
+ if (can_have_something_pending())
+ set_generators_pending();
+ else {
+ // We cannot have pending generators; this also implies
+ // that generators may have lost their sortedness.
+ gen_sys.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ // Constraints are not up-to-date and generators are not minimized.
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ }
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+bool
+PPL::operator==(const Polyhedron& x, const Polyhedron& y) {
+ // If the two polyhedra are topology-incompatible or dimension-incompatible,
+ // then they cannot be the same polyhedron.
+ if (x.topology() != y.topology() || x.space_dim != y.space_dim)
+ return false;
+
+ if (x.marked_empty())
+ return y.is_empty();
+ else if (y.marked_empty())
+ return x.is_empty();
+ else if (x.space_dim == 0)
+ return true;
+
+ switch (x.quick_equivalence_test(y)) {
+ case Polyhedron::TVB_TRUE:
+ return true;
+
+ case Polyhedron::TVB_FALSE:
+ return false;
+
+ default:
+ if (x.is_included_in(y))
+ if (x.marked_empty())
+ return y.is_empty();
+ else
+ return y.is_included_in(x);
+ else
+ return false;
+ }
+}
+
+bool
+PPL::Polyhedron::contains(const Polyhedron& y) const {
+ const Polyhedron& x = *this;
+
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("contains(y)", "y", y);
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("contains(y)", "y", y);
+
+ if (y.marked_empty())
+ return true;
+ else if (x.marked_empty())
+ return y.is_empty();
+ else if (y.space_dim == 0)
+ return true;
+ else if (x.quick_equivalence_test(y) == Polyhedron::TVB_TRUE)
+ return true;
+ else
+ return y.is_included_in(x);
+}
+
+bool
+PPL::Polyhedron::is_disjoint_from(const Polyhedron& y) const {
+ Polyhedron z = *this;
+ z.intersection_assign(y);
+ return z.is_empty();
+}
+
+void
+PPL::Polyhedron::ascii_dump(std::ostream& s) const {
+ s << "space_dim " << space_dim << "\n";
+ status.ascii_dump(s);
+ s << "\ncon_sys ("
+ << (constraints_are_up_to_date() ? "" : "not_")
+ << "up-to-date)"
+ << "\n";
+ con_sys.ascii_dump(s);
+ s << "\ngen_sys ("
+ << (generators_are_up_to_date() ? "" : "not_")
+ << "up-to-date)"
+ << "\n";
+ gen_sys.ascii_dump(s);
+ s << "\nsat_c\n";
+ sat_c.ascii_dump(s);
+ s << "\nsat_g\n";
+ sat_g.ascii_dump(s);
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Polyhedron)
+
+bool
+PPL::Polyhedron::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> space_dim))
+ return false;
+
+ if (!status.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "con_sys")
+ return false;
+
+ if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+ return false;
+
+ if (!con_sys.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "gen_sys")
+ return false;
+
+ if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+ return false;
+
+ if (!gen_sys.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "sat_c")
+ return false;
+
+ if (!sat_c.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "sat_g")
+ return false;
+
+ if (!sat_g.ascii_load(s))
+ return false;
+
+ // Check invariants.
+ PPL_ASSERT_HEAVY(OK());
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Polyhedron::external_memory_in_bytes() const {
+ return
+ con_sys.external_memory_in_bytes()
+ + gen_sys.external_memory_in_bytes()
+ + sat_c.external_memory_in_bytes()
+ + sat_g.external_memory_in_bytes();
+}
+
+void
+PPL::Polyhedron::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ if (is_necessarily_closed())
+ Implementation::wrap_assign(static_cast<C_Polyhedron&>(*this),
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "C_Polyhedron");
+ else
+ Implementation::wrap_assign(static_cast<NNC_Polyhedron&>(*this),
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "NNC_Polyhedron");
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Polyhedron& ph) {
+ if (ph.is_empty())
+ s << "false";
+ else
+ s << ph.minimized_constraints();
+ return s;
+}
diff --git a/src/Polyhedron_simplify_templates.hh b/src/Polyhedron_simplify_templates.hh
new file mode 100644
index 0000000..ce41ac4
--- /dev/null
+++ b/src/Polyhedron_simplify_templates.hh
@@ -0,0 +1,340 @@
+/* Polyhedron class implementation: simplify().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_simplify_templates_hh
+#define PPL_Polyhedron_simplify_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include <cstddef>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ The rank of \p sys.
+
+ \param sys
+ The system to simplify: it will be modified;
+
+ \param sat
+ The saturation matrix corresponding to \p sys.
+
+ \p sys may be modified by swapping some of its rows and by possibly
+ removing some of them, if they turn out to be redundant.
+
+ If \p sys is a system of constraints, then the rows of \p sat are
+ indexed by constraints and its columns are indexed by generators;
+ otherwise, if \p sys is a system of generators, then the rows of
+ \p sat are indexed by generators and its columns by constraints.
+
+ Given a system of constraints or a system of generators, this function
+ simplifies it using Gauss' elimination method (to remove redundant
+ equalities/lines), deleting redundant inequalities/rays/points and
+ making back-substitution.
+ The explanation that follows assumes that \p sys is a system of
+ constraints. For the case when \p sys is a system of generators,
+ a similar explanation can be obtain by applying duality.
+
+ The explanation relies on the notion of <EM>redundancy</EM>.
+ (See the Introduction.)
+
+ First we make some observations that can help the reader
+ in understanding the function:
+
+ Proposition: An inequality that is saturated by all the generators
+ can be transformed to an equality.
+
+ In fact, by combining any number of generators that saturate the
+ constraints, we obtain a generator that saturates the constraints too:
+ \f[
+ \langle \vect{c}, \vect{r}_1 \rangle = 0 \land
+ \langle \vect{c}, \vect{r}_2 \rangle = 0
+ \Rightarrow
+ \langle \vect{c}, (\lambda_1 \vect{r}_1 + \lambda_2 \vect{r}_2) \rangle =
+ \lambda_1 \langle \vect{c}, \vect{r}_1 \rangle
+ + \lambda_2 \langle \vect{c}, \vect{r}_2 \rangle
+ = 0,
+ \f]
+ where \f$\lambda_1, \lambda_2\f$ can be any real number.
+*/
+template <typename Linear_System1>
+dimension_type
+Polyhedron::simplify(Linear_System1& sys, Bit_Matrix& sat) {
+
+ typedef typename Linear_System1::row_type sys_row_type;
+
+ dimension_type num_rows = sys.num_rows();
+ const dimension_type num_cols_sat = sat.num_columns();
+
+ using std::swap;
+
+ // Looking for the first inequality in `sys'.
+ dimension_type num_lines_or_equalities = 0;
+ while (num_lines_or_equalities < num_rows
+ && sys[num_lines_or_equalities].is_line_or_equality())
+ ++num_lines_or_equalities;
+
+ // `num_saturators[i]' will contain the number of generators
+ // that saturate the constraint `sys[i]'.
+ if (num_rows > simplify_num_saturators_size) {
+ delete [] simplify_num_saturators_p;
+ simplify_num_saturators_p = 0;
+ simplify_num_saturators_size = 0;
+ const size_t max_size
+ = std::numeric_limits<size_t>::max() / sizeof(dimension_type);
+ const size_t new_size = compute_capacity(num_rows, max_size);
+ simplify_num_saturators_p = new dimension_type[new_size];
+ simplify_num_saturators_size = new_size;
+ }
+ dimension_type* const num_saturators = simplify_num_saturators_p;
+
+ bool sys_sorted = sys.is_sorted();
+
+ // Computing the number of saturators for each inequality,
+ // possibly identifying and swapping those that happen to be
+ // equalities (see Proposition above).
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) {
+ if (sat[i].empty()) {
+ // The constraint `sys_rows[i]' is saturated by all the generators.
+ // Thus, either it is already an equality or it can be transformed
+ // to an equality (see Proposition above).
+ sys.sys.rows[i].set_is_line_or_equality();
+ // Note: simple normalization already holds.
+ sys.sys.rows[i].sign_normalize();
+ // We also move it just after all the other equalities,
+ // so that system `sys_rows' keeps its partial sortedness.
+ if (i != num_lines_or_equalities) {
+ sys.sys.rows[i].m_swap(sys.sys.rows[num_lines_or_equalities]);
+ swap(sat[i], sat[num_lines_or_equalities]);
+ swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+ }
+ ++num_lines_or_equalities;
+ // `sys' is no longer sorted.
+ sys_sorted = false;
+ }
+ else
+ // There exists a generator which does not saturate `sys[i]',
+ // so that `sys[i]' is indeed an inequality.
+ // We store the number of its saturators.
+ num_saturators[i] = num_cols_sat - sat[i].count_ones();
+ }
+
+ sys.set_sorted(sys_sorted);
+ PPL_ASSERT(sys.OK());
+
+ // At this point, all the equalities of `sys' (included those
+ // inequalities that we just transformed to equalities) have
+ // indexes between 0 and `num_lines_or_equalities' - 1,
+ // which is the property needed by method gauss().
+ // We can simplify the system of equalities, obtaining the rank
+ // of `sys' as result.
+ const dimension_type rank = sys.gauss(num_lines_or_equalities);
+
+ // Now the irredundant equalities of `sys' have indexes from 0
+ // to `rank' - 1, whereas the equalities having indexes from `rank'
+ // to `num_lines_or_equalities' - 1 are all redundant.
+ // (The inequalities in `sys' have been left untouched.)
+ // The rows containing equalities are not sorted.
+
+ if (rank < num_lines_or_equalities) {
+ // We identified some redundant equalities.
+ // Moving them at the bottom of `sys':
+ // - index `redundant' runs through the redundant equalities
+ // - index `erasing' identifies the first row that should
+ // be erased after this loop.
+ // Note that we exit the loop either because we have removed all
+ // redundant equalities or because we have moved all the
+ // inequalities.
+ for (dimension_type redundant = rank,
+ erasing = num_rows;
+ redundant < num_lines_or_equalities
+ && erasing > num_lines_or_equalities;
+ ) {
+ --erasing;
+ sys.remove_row(redundant);
+ swap(sat[redundant], sat[erasing]);
+ swap(num_saturators[redundant], num_saturators[erasing]);
+ ++redundant;
+ }
+ // Adjusting the value of `num_rows' to the number of meaningful
+ // rows of `sys': `num_lines_or_equalities' - `rank' is the number of
+ // redundant equalities moved to the bottom of `sys', which are
+ // no longer meaningful.
+ num_rows -= num_lines_or_equalities - rank;
+
+ // If the above loop exited because it moved all inequalities, it may not
+ // have removed all the rendundant rows.
+ sys.remove_trailing_rows(sys.num_rows() - num_rows);
+
+ PPL_ASSERT(sys.num_rows() == num_rows);
+
+ sat.remove_trailing_rows(num_lines_or_equalities - rank);
+
+ // Adjusting the value of `num_lines_or_equalities'.
+ num_lines_or_equalities = rank;
+ }
+
+ const dimension_type old_num_rows = sys.num_rows();
+
+ // Now we use the definition of redundancy (given in the Introduction)
+ // to remove redundant inequalities.
+
+ // First we check the saturation rule, which provides a necessary
+ // condition for an inequality to be irredundant (i.e., it provides
+ // a sufficient condition for identifying redundant inequalities).
+ // Let
+ //
+ // num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i],
+ // dim_lin_space = num_irredundant_lines,
+ // dim_ray_space
+ // = dim_vector_space - num_irredundant_equalities - dim_lin_space
+ // = num_columns - 1 - num_lines_or_equalities - dim_lin_space,
+ // min_sat_rays_or_points = dim_ray_space.
+ //
+ // An inequality saturated by less than `dim_ray_space' _rays/points_
+ // is redundant. Thus we have the implication
+ //
+ // (num_saturators[i] - num_sat_lines[i] < dim_ray_space)
+ // ==>
+ // redundant(sys[i]).
+ //
+ // Moreover, since every line saturates all inequalities, we also have
+ // dim_lin_space = num_sat_lines[i]
+ // so that we can rewrite the condition above as follows:
+ //
+ // (num_saturators[i] < num_columns - num_lines_or_equalities - 1)
+ // ==>
+ // redundant(sys[i]).
+ //
+ const dimension_type sys_num_columns
+ = sys.topology() == NECESSARILY_CLOSED ? sys.space_dimension() + 1
+ : sys.space_dimension() + 2;
+ const dimension_type min_saturators
+ = sys_num_columns - num_lines_or_equalities - 1;
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+ if (num_saturators[i] < min_saturators) {
+ // The inequality `sys[i]' is redundant.
+ --num_rows;
+ sys.remove_row(i);
+ swap(sat[i], sat[num_rows]);
+ swap(num_saturators[i], num_saturators[num_rows]);
+ }
+ else
+ ++i;
+ }
+
+ // Now we check the independence rule.
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+ bool redundant = false;
+ // NOTE: in the inner loop, index `j' runs through _all_ the
+ // inequalities and we do not test if `sat[i]' is strictly
+ // contained into `sat[j]'. Experimentation has shown that this
+ // is faster than having `j' only run through the indexes greater
+ // than `i' and also doing the test `strict_subset(sat[i],
+ // sat[k])'.
+ for (dimension_type j = num_lines_or_equalities; j < num_rows; ) {
+ if (i == j)
+ // We want to compare different rows of `sys'.
+ ++j;
+ else {
+ // Let us recall that each generator lies on a facet of the
+ // polyhedron (see the Introduction).
+ // Given two constraints `c_1' and `c_2', if there are `m'
+ // generators lying on the hyper-plane corresponding to `c_1',
+ // the same `m' generators lie on the hyper-plane
+ // corresponding to `c_2', too, and there is another one lying
+ // on the latter but not on the former, then `c_2' is more
+ // restrictive than `c_1', i.e., `c_1' is redundant.
+ bool strict_subset;
+ if (subset_or_equal(sat[j], sat[i], strict_subset))
+ if (strict_subset) {
+ // All the saturators of the inequality `sys[i]' are
+ // saturators of the inequality `sys[j]' too,
+ // and there exists at least one saturator of `sys[j]'
+ // which is not a saturator of `sys[i]'.
+ // It follows that inequality `sys[i]' is redundant.
+ redundant = true;
+ break;
+ }
+ else {
+ // We have `sat[j] == sat[i]'. Hence inequalities
+ // `sys[i]' and `sys[j]' are saturated by the same set of
+ // generators. Then we can remove either one of the two
+ // inequalities: we remove `sys[j]'.
+ --num_rows;
+ sys.remove_row(j);
+ PPL_ASSERT(sys.num_rows() == num_rows);
+ swap(sat[j], sat[num_rows]);
+ swap(num_saturators[j], num_saturators[num_rows]);
+ }
+ else
+ // If we reach this point then we know that `sat[i]' does
+ // not contain (and is different from) `sat[j]', so that
+ // `sys[i]' is not made redundant by inequality `sys[j]'.
+ ++j;
+ }
+ }
+ if (redundant) {
+ // The inequality `sys[i]' is redundant.
+ --num_rows;
+ sys.remove_row(i);
+ PPL_ASSERT(sys.num_rows() == num_rows);
+ swap(sat[i], sat[num_rows]);
+ swap(num_saturators[i], num_saturators[num_rows]);
+ }
+ else
+ // The inequality `sys[i]' is not redundant.
+ ++i;
+ }
+
+ // Here we physically remove the `sat' rows corresponding to the redundant
+ // inequalities previously removed from `sys'.
+ sat.remove_trailing_rows(old_num_rows - num_rows);
+
+ // At this point the first `num_lines_or_equalities' rows of 'sys'
+ // represent the irredundant equalities, while the remaining rows
+ // (i.e., those having indexes from `num_lines_or_equalities' to
+ // `num_rows' - 1) represent the irredundant inequalities.
+#ifndef NDEBUG
+ // Check if the flag is set (that of the equalities is already set).
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i)
+ PPL_ASSERT(sys[i].is_ray_or_point_or_inequality());
+#endif
+
+ // Finally, since now the sub-system (of `sys') of the irredundant
+ // equalities is in triangular form, we back substitute each
+ // variables with the expression obtained considering the equalities
+ // starting from the last one.
+ sys.back_substitute(num_lines_or_equalities);
+
+ // The returned value is the number of irredundant equalities i.e.,
+ // the rank of the sub-system of `sys' containing only equalities.
+ // (See the Introduction for definition of lineality space dimension.)
+ return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_simplify_templates_hh)
diff --git a/src/Polyhedron_templates.hh b/src/Polyhedron_templates.hh
new file mode 100644
index 0000000..e604fc1
--- /dev/null
+++ b/src/Polyhedron_templates.hh
@@ -0,0 +1,579 @@
+/* Polyhedron class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_templates_hh
+#define PPL_Polyhedron_templates_hh 1
+
+#include "Generator_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+// For static method overflows.
+#include "Floating_Point_Expression_defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+ const Box<Interval>& box,
+ Complexity_Class)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Initialize the space dimension as indicated by the box.
+ space_dim = box.space_dimension();
+
+ // Check for emptiness.
+ if (box.is_empty()) {
+ set_empty();
+ return;
+ }
+
+ // Zero-dim universe polyhedron.
+ if (space_dim == 0) {
+ set_zero_dim_univ();
+ return;
+ }
+
+ // Properly set the space dimension of `con_sys'.
+ con_sys.set_space_dimension(space_dim);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+ if (topol == NECESSARILY_CLOSED) {
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+ // See if we have an implicit equality constraint.
+ if (l_bounded && u_bounded
+ && l_closed && u_closed
+ && l_n == u_n && l_d == u_d) {
+ // Add the constraint `l_d*v_k == l_n'.
+ con_sys.insert(l_d * v_k == l_n);
+ }
+ else {
+ if (l_bounded)
+ // Add the constraint `l_d*v_k >= l_n'.
+ con_sys.insert(l_d * v_k >= l_n);
+ if (u_bounded)
+ // Add the constraint `u_d*v_k <= u_n'.
+ con_sys.insert(u_d * v_k <= u_n);
+ }
+ }
+ }
+ else {
+ // topol == NOT_NECESSARILY_CLOSED
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+ // See if we have an implicit equality constraint.
+ if (l_bounded && u_bounded
+ && l_closed && u_closed
+ && l_n == u_n && l_d == u_d) {
+ // Add the constraint `l_d*v_k == l_n'.
+ con_sys.insert(l_d * v_k == l_n);
+ }
+ else {
+ // Check if a lower bound constraint is required.
+ if (l_bounded) {
+ if (l_closed)
+ // Add the constraint `l_d*v_k >= l_n'.
+ con_sys.insert(l_d * v_k >= l_n);
+ else
+ // Add the constraint `l_d*v_k > l_n'.
+ con_sys.insert(l_d * v_k > l_n);
+ }
+ // Check if an upper bound constraint is required.
+ if (u_bounded) {
+ if (u_closed)
+ // Add the constraint `u_d*v_k <= u_n'.
+ con_sys.insert(u_d * v_k <= u_n);
+ else
+ // Add the constraint `u_d*v_k < u_n'.
+ con_sys.insert(u_d * v_k < u_n);
+ }
+ }
+ }
+ }
+
+ // Adding the low-level constraints.
+ con_sys.add_low_level_constraints();
+
+ // Constraints are up-to-date.
+ set_constraints_up_to_date();
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the polyhedron becomes zero_dimensional.
+ if (marked_empty()
+ || (has_pending_constraints()
+ && !remove_pending_to_obtain_generators())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing all dimensions from the empty polyhedron.
+ space_dim = 0;
+ con_sys.clear();
+ }
+ else
+ // Removing all dimensions from a non-empty polyhedron.
+ set_zero_dim_univ();
+
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+ if (new_space_dimension == space_dim) {
+ // The partial function `pfunc' is indeed total and thus specifies
+ // a permutation, that is, a renaming of the dimensions. For
+ // maximum efficiency, we will simply permute the columns of the
+ // constraint system and/or the generator system.
+
+ std::vector<Variable> cycle;
+ cycle.reserve(space_dim);
+
+ // Used to mark elements as soon as they are inserted in a cycle.
+ std::deque<bool> visited(space_dim);
+
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ if (visited[i])
+ continue;
+
+ dimension_type j = i;
+ do {
+ visited[j] = true;
+ // The following initialization is only to make the compiler happy.
+ dimension_type k = 0;
+ if (!pfunc.maps(j, k))
+ throw_invalid_argument("map_space_dimensions(pfunc)",
+ " pfunc is inconsistent");
+ if (k == j)
+ break;
+
+ cycle.push_back(Variable(j));
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+
+ // End of cycle.
+
+ // Permute all that is up-to-date. Notice that the contents of
+ // the saturation matrices is unaffected by the permutation of
+ // columns: they remain valid, if they were so.
+ if (constraints_are_up_to_date())
+ con_sys.permute_space_dimensions(cycle);
+
+ if (generators_are_up_to_date())
+ gen_sys.permute_space_dimensions(cycle);
+
+ cycle.clear();
+ }
+
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // If control gets here, then `pfunc' is not a permutation and some
+ // dimensions must be projected away.
+
+ // If there are pending constraints, using `generators()' we process them.
+ const Generator_System& old_gensys = generators();
+
+ if (old_gensys.has_no_rows()) {
+ // The polyhedron is empty.
+ Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+ m_swap(new_polyhedron);
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Make a local copy of the partial function.
+ std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ dimension_type pfunc_j;
+ if (pfunc.maps(j, pfunc_j))
+ pfunc_maps[j] = pfunc_j;
+ }
+
+ Generator_System new_gensys;
+ for (Generator_System::const_iterator i = old_gensys.begin(),
+ old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+ const Generator& old_g = *i;
+ const Generator::expr_type old_e = old_g.expression();
+ Linear_Expression expr;
+ expr.set_space_dimension(new_space_dimension);
+ bool all_zeroes = true;
+ for (Generator::expr_type::const_iterator j = old_e.begin(),
+ j_end = old_e.end(); j != j_end; ++j) {
+ const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+ if (mapped_id != not_a_dimension()) {
+ add_mul_assign(expr, *j, Variable(mapped_id));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(line(expr));
+ break;
+ case Generator::RAY:
+ if (!all_zeroes)
+ new_gensys.insert(ray(expr));
+ break;
+ case Generator::POINT:
+ // A point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(point(expr, old_g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ // A closure point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(closure_point(expr, old_g.divisor()));
+ break;
+ }
+ }
+ Polyhedron new_polyhedron(topology(), new_gensys);
+ m_swap(new_polyhedron);
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ const bool is_strict) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::refine_with_linear_form_inequality:"
+ " FP_Format not a floating point type.");
+
+ // Dimension compatibility checks.
+ // The dimensions of left and right should not be greater than the
+ // dimension of *this.
+ const dimension_type left_space_dim = left.space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(l1, l2, s)", "l1", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(l1, l2, s)", "l2", right);
+
+ // We assume that the analyzer will not refine an unreachable test.
+ PPL_ASSERT(!marked_empty());
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(left))
+ return;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(right))
+ return;
+
+ // Overapproximate left - right.
+ FP_Linear_Form left_minus_right(left);
+ left_minus_right -= right;
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(left_minus_right))
+ return;
+
+ dimension_type lf_space_dim = left_minus_right.space_dimension();
+ FP_Linear_Form lf_approx;
+ overapproximate_linear_form(left_minus_right, lf_space_dim, lf_approx);
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf_approx))
+ return;
+
+ // Normalize left - right.
+ Linear_Expression lf_approx_le;
+ convert_to_integer_expression(lf_approx, lf_space_dim, lf_approx_le);
+
+ // Finally, do the refinement.
+ if (!is_strict || is_necessarily_closed())
+ refine_with_constraint(lf_approx_le <= 0);
+ else
+ refine_with_constraint(lf_approx_le < 0);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::affine_form_image(const Variable var,
+const Linear_Form<Interval <FP_Format, Interval_Info> >& lf) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::affine_form_image:"
+ " FP_Format not a floating point type.");
+
+ // Dimension compatibility checks.
+ // The dimension of lf should not be greater than the dimension of *this.
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(v, l, s)", "l", lf);
+
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_form_image(v, l, s)", "v", var);
+
+ // We assume that the analyzer will not perform an unreachable assignment.
+ PPL_ASSERT(!marked_empty());
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf)) {
+ *this = Polyhedron(topology(), space_dim, UNIVERSE);
+ return;
+ }
+
+ // Overapproximate lf.
+ FP_Linear_Form lf_approx;
+ overapproximate_linear_form(lf, lf_space_dim, lf_approx);
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf_approx)) {
+ *this = Polyhedron(topology(), space_dim, UNIVERSE);
+ return;
+ }
+
+ // Normalize lf.
+ Linear_Expression lf_approx_le;
+ PPL_DIRTY_TEMP_COEFFICIENT(lo_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(hi_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+ convert_to_integer_expressions(lf_approx, lf_space_dim, lf_approx_le,
+ lo_coeff, hi_coeff, denominator);
+
+ // Finally, do the assignment.
+ bounded_affine_image(var, lf_approx_le + lo_coeff, lf_approx_le + hi_coeff,
+ denominator);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::overapproximate_linear_form
+(const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::overapproximate_linear_form:"
+ " FP_Format not a floating point type.");
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ // Build a Box from the Polyhedron so that we can extract upper and
+ // lower bounds of variables easily.
+ Box<FP_Interval_Type> box(*this);
+
+ result = FP_Linear_Form(lf.inhomogeneous_term());
+ // FIXME: this may not be policy-neutral.
+ const FP_Interval_Type aux_divisor1(static_cast<FP_Format>(0.5));
+ FP_Interval_Type aux_divisor2(aux_divisor1);
+ aux_divisor2.lower() = static_cast<FP_Format>(-0.5);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ Variable curr_var(i);
+ const FP_Interval_Type& curr_coeff = lf.coefficient(curr_var);
+ PPL_ASSERT(curr_coeff.is_bounded());
+ FP_Format curr_lb = curr_coeff.lower();
+ FP_Format curr_ub = curr_coeff.upper();
+ if (curr_lb != 0 || curr_ub != 0) {
+ const FP_Interval_Type& curr_int = box.get_interval(curr_var);
+ FP_Interval_Type curr_addend(curr_ub - curr_lb);
+ curr_addend *= aux_divisor2;
+ curr_addend *= curr_int;
+ result += curr_addend;
+ curr_addend = FP_Interval_Type(curr_lb + curr_ub);
+ curr_addend *= aux_divisor1;
+ FP_Linear_Form curr_addend_lf(curr_var);
+ curr_addend_lf *= curr_addend;
+ result += curr_addend_lf;
+ }
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expression(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& result) {
+ result = Linear_Expression();
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ std::vector<Coefficient> numerators(lf_dimension+1);
+ std::vector<Coefficient> denominators(lf_dimension+1);
+
+ // Convert each floating point number to a pair <numerator, denominator>
+ // and compute the lcm of all denominators.
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+ lcm = 1;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+ // FIXME: are these checks numerator[i] != 0 really necessary?
+ numer_denom(b.lower(), numerators[lf_dimension],
+ denominators[lf_dimension]);
+ if (numerators[lf_dimension] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+ numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+ if (numerators[i] != 0)
+ lcm_assign(lcm, lcm, denominators[i]);
+ }
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ if (numerators[i] != 0) {
+ exact_div_assign(denominators[i], lcm, denominators[i]);
+ numerators[i] *= denominators[i];
+ result += numerators[i] * Variable(i);
+ }
+ }
+
+ if (numerators[lf_dimension] != 0) {
+ exact_div_assign(denominators[lf_dimension],
+ lcm, denominators[lf_dimension]);
+ numerators[lf_dimension] *= denominators[lf_dimension];
+ result += numerators[lf_dimension];
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expressions(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension, Linear_Expression& res,
+ Coefficient& res_low_coeff, Coefficient& res_hi_coeff,
+ Coefficient& denominator) {
+ res = Linear_Expression();
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ std::vector<Coefficient> numerators(lf_dimension+2);
+ std::vector<Coefficient> denominators(lf_dimension+2);
+
+ // Convert each floating point number to a pair <numerator, denominator>
+ // and compute the lcm of all denominators.
+ Coefficient& lcm = denominator;
+ lcm = 1;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+ numer_denom(b.lower(), numerators[lf_dimension], denominators[lf_dimension]);
+ // FIXME: are these checks numerator[i] != 0 really necessary?
+ if (numerators[lf_dimension] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+ numer_denom(b.upper(), numerators[lf_dimension+1],
+ denominators[lf_dimension+1]);
+ if (numerators[lf_dimension+1] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension+1]);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+ numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+ if (numerators[i] != 0)
+ lcm_assign(lcm, lcm, denominators[i]);
+ }
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ if (numerators[i] != 0) {
+ exact_div_assign(denominators[i], lcm, denominators[i]);
+ numerators[i] *= denominators[i];
+ res += numerators[i] * Variable(i);
+ }
+ }
+
+ if (numerators[lf_dimension] != 0) {
+ exact_div_assign(denominators[lf_dimension],
+ lcm, denominators[lf_dimension]);
+ numerators[lf_dimension] *= denominators[lf_dimension];
+ res_low_coeff = numerators[lf_dimension];
+ }
+ else
+ res_low_coeff = Coefficient(0);
+
+ if (numerators[lf_dimension+1] != 0) {
+ exact_div_assign(denominators[lf_dimension+1],
+ lcm, denominators[lf_dimension+1]);
+ numerators[lf_dimension+1] *= denominators[lf_dimension+1];
+ res_hi_coeff = numerators[lf_dimension+1];
+ }
+ else
+ res_hi_coeff = Coefficient(0);
+}
+
+template <typename C>
+void
+Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ throw_dimension_incompatible(method, lf_name, lf.space_dimension());
+}
+
+template <typename Input>
+Input&
+Polyhedron::check_obj_space_dimension_overflow(Input& input,
+ const Topology topol,
+ const char* method,
+ const char* reason) {
+ check_space_dimension_overflow(input.space_dimension(),
+ max_space_dimension(),
+ topol, method, reason);
+ return input;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_templates_hh)
diff --git a/src/Polyhedron_types.hh b/src/Polyhedron_types.hh
new file mode 100644
index 0000000..05e67f5
--- /dev/null
+++ b/src/Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Polyhedron_types_hh
+#define PPL_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_types_hh)
diff --git a/src/Polyhedron_widenings.cc b/src/Polyhedron_widenings.cc
new file mode 100644
index 0000000..6960d2f
--- /dev/null
+++ b/src/Polyhedron_widenings.cc
@@ -0,0 +1,875 @@
+/* Polyhedron class implementation
+ (non-inline widening-related member functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "BHRZ03_Certificate_defs.hh"
+#include "Rational_Box.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <iostream>
+#include <stdexcept>
+#include <deque>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron
+::select_CH78_constraints(const Polyhedron& y,
+ Constraint_System& cs_selection) const {
+ // Private method: the caller must ensure the following conditions.
+ PPL_ASSERT(topology() == y.topology()
+ && topology() == cs_selection.topology()
+ && space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty()
+ && !has_pending_constraints()
+ && generators_are_up_to_date());
+ PPL_ASSERT(!y.marked_empty()
+ && !y.has_something_pending()
+ && y.constraints_are_minimized());
+
+ // A constraint in `y.con_sys' is copied to `cs_selection'
+ // if it is satisfied by all the generators of `gen_sys'.
+
+ // Note: the loop index `i' goes upward to avoid reversing
+ // the ordering of the chosen constraints.
+ for (dimension_type i = 0, end = y.con_sys.num_rows(); i < end; ++i) {
+ const Constraint& c = y.con_sys[i];
+ if (gen_sys.satisfied_by_all_generators(c))
+ cs_selection.insert(c);
+ }
+}
+
+void
+PPL::Polyhedron
+::select_H79_constraints(const Polyhedron& y,
+ Constraint_System& cs_selected,
+ Constraint_System& cs_not_selected) const {
+ // Private method: the caller must ensure the following conditions
+ // (beside the inclusion `y <= x').
+ PPL_ASSERT(topology() == y.topology()
+ && topology() == cs_selected.topology()
+ && topology() == cs_not_selected.topology());
+ PPL_ASSERT(space_dim == y.space_dim);
+ PPL_ASSERT(!marked_empty()
+ && !has_pending_generators()
+ && constraints_are_up_to_date());
+ PPL_ASSERT(!y.marked_empty()
+ && !y.has_something_pending()
+ && y.constraints_are_minimized()
+ && y.generators_are_up_to_date());
+
+ // FIXME: this is a workaround for NNC polyhedra.
+ if (!y.is_necessarily_closed()) {
+ // Force strong minimization of constraints.
+ y.strongly_minimize_constraints();
+ // Recompute generators (without compromising constraint minimization).
+ y.update_generators();
+ }
+
+ // Obtain a sorted copy of `y.sat_g'.
+ if (!y.sat_g_is_up_to_date())
+ y.update_sat_g();
+ Bit_Matrix tmp_sat_g = y.sat_g;
+ // Remove from `tmp_sat_g' the rows corresponding to tautologies
+ // (i.e., the positivity or epsilon-bounding constraints):
+ // this is needed in order to widen the polyhedron and not the
+ // corresponding homogenized polyhedral cone.
+ const Constraint_System& y_cs = y.con_sys;
+ const dimension_type old_num_rows = y_cs.num_rows();
+ dimension_type num_rows = old_num_rows;
+ for (dimension_type i = 0; i < num_rows; ++i)
+ if (y_cs[i].is_tautological()) {
+ using std::swap;
+ --num_rows;
+ swap(tmp_sat_g[i], tmp_sat_g[num_rows]);
+ }
+ tmp_sat_g.remove_trailing_rows(old_num_rows - num_rows);
+ tmp_sat_g.sort_rows();
+
+ // A constraint in `con_sys' is copied to `cs_selected'
+ // if its behavior with respect to `y.gen_sys' is the same
+ // as that of another constraint in `y.con_sys'.
+ // otherwise it is copied to `cs_not_selected'.
+ // Namely, we check whether the saturation row `buffer'
+ // (built starting from the given constraint and `y.gen_sys')
+ // is a row of the saturation matrix `tmp_sat_g'.
+
+ // CHECKME: the following comment is only applicable when `y.gen_sys'
+ // is minimized. In that case, the comment suggests that it would be
+ // possible to use a fast (but incomplete) redundancy test based on
+ // the number of saturators in `buffer'.
+ // NOTE: If the considered constraint of `con_sys' does not
+ // satisfy the saturation rule (see Section \ref prelims), then
+ // it will not appear in the resulting constraint system,
+ // because `tmp_sat_g' is built starting from a minimized polyhedron.
+
+ // The size of `buffer' will reach sat.num_columns() bits.
+ Bit_Row buffer;
+ // Note: the loop index `i' goes upward to avoid reversing
+ // the ordering of the chosen constraints.
+ for (dimension_type i = 0, end = con_sys.num_rows(); i < end; ++i) {
+ const Constraint& ci = con_sys[i];
+ // The saturation row `buffer' is built considering
+ // the `i'-th constraint of the polyhedron `x' and
+ // all the generators of the polyhedron `y'.
+ buffer.clear();
+ for (dimension_type j = y.gen_sys.num_rows(); j-- > 0; ) {
+ const int sp_sgn = Scalar_Products::sign(ci, y.gen_sys[j]);
+ // We are assuming that `y <= x'.
+ PPL_ASSERT(sp_sgn >= 0
+ || (!is_necessarily_closed()
+ && ci.is_strict_inequality()
+ && y.gen_sys[j].is_point()));
+ if (sp_sgn > 0)
+ buffer.set(j);
+ }
+ // We check whether `buffer' is a row of `tmp_sat_g',
+ // exploiting its sortedness in order to have faster comparisons.
+ if (tmp_sat_g.sorted_contains(buffer))
+ cs_selected.insert(ci);
+ else
+ cs_not_selected.insert(ci);
+ }
+}
+
+void
+PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ const Topology topol = x.topology();
+ if (topol != y.topology())
+ throw_topology_incompatible("H79_widening_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("H79_widening_assign(y)", "y", y);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ // If any argument is zero-dimensional or empty,
+ // the H79-widening behaves as the identity function.
+ if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+ return;
+
+ // `y.gen_sys' should be in minimal form and
+ // `y.sat_g' should be up-to-date.
+ if (y.is_necessarily_closed()) {
+ if (!y.minimize())
+ // `y' is empty: the result is `x'.
+ return;
+ }
+ else {
+ // Dealing with a NNC polyhedron.
+ // To obtain a correct reasoning when comparing
+ // the constraints of `x' with the generators of `y',
+ // we enforce the inclusion relation holding between
+ // the two NNC polyhedra `x' and `y' (i.e., `y <= x')
+ // to also hold for the corresponding eps-representations:
+ // this is obtained by intersecting the two eps-representations.
+ Polyhedron& yy = const_cast<Polyhedron&>(y);
+ yy.intersection_assign(x);
+ if (yy.is_empty())
+ // The result is `x'.
+ return;
+ }
+
+ // If we only have the generators of `x' and the dimensions of
+ // the two polyhedra are the same, we can compute the standard
+ // widening by using the specification in [CousotH78], therefore
+ // avoiding converting from generators to constraints.
+ if (x.has_pending_generators() || !x.constraints_are_up_to_date()) {
+ Constraint_System CH78_cs(topol);
+ x.select_CH78_constraints(y, CH78_cs);
+
+ if (CH78_cs.num_rows() == y.con_sys.num_rows()) {
+ // Having selected all the constraints, the result is `y'.
+ x = y;
+ return;
+ }
+ // Otherwise, check if `x' and `y' have the same dimension.
+ // Note that `y.con_sys' is minimized and `CH78_cs' has no redundant
+ // constraints, since it is a subset of the former.
+ else if (CH78_cs.num_equalities() == y.con_sys.num_equalities()) {
+ // Let `x' be defined by the constraints in `CH78_cs'.
+ Polyhedron CH78(topol, x.space_dim, UNIVERSE);
+ CH78.add_recycled_constraints(CH78_cs);
+
+ // Check whether we are using the widening-with-tokens technique
+ // and there still are tokens available.
+ if (tp != 0 && *tp > 0) {
+ // There are tokens available. If `CH78' is not a subset of `x',
+ // then it is less precise and we use one of the available tokens.
+ if (!x.contains(CH78))
+ --(*tp);
+ }
+ else
+ // No tokens.
+ x.m_swap(CH78);
+ PPL_ASSERT_HEAVY(x.OK(true));
+ return;
+ }
+ }
+
+ // As the dimension of `x' is strictly greater than the dimension of `y',
+ // we have to compute the standard widening by selecting a subset of
+ // the constraints of `x'.
+ // `x.con_sys' is just required to be up-to-date, because:
+ // - if `x.con_sys' is unsatisfiable, then by assumption
+ // also `y' is empty, so that the resulting polyhedron is `x';
+ // - redundant constraints in `x.con_sys' do not affect the result
+ // of the widening, because if they are selected they will be
+ // redundant even in the result.
+ if (has_pending_generators())
+ process_pending_generators();
+ else if (!x.constraints_are_up_to_date())
+ x.update_constraints();
+
+ // Copy into `H79_cs' the constraints of `x' that are common to `y',
+ // according to the definition of the H79 widening.
+ Constraint_System H79_cs(topol);
+ Constraint_System x_minus_H79_cs(topol);
+ x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+ if (x_minus_H79_cs.has_no_rows())
+ // We selected all of the constraints of `x',
+ // thus the result of the widening is `x'.
+ return;
+ else {
+ // We selected a strict subset of the constraints of `x'.
+ // NOTE: as `x.con_sys' was not necessarily in minimal form,
+ // this does not imply that the result strictly includes `x'.
+ // Let `H79' be defined by the constraints in `H79_cs'.
+ Polyhedron H79(topol, x.space_dim, UNIVERSE);
+ H79.add_recycled_constraints(H79_cs);
+
+ // Check whether we are using the widening-with-tokens technique
+ // and there still are tokens available.
+ if (tp != 0 && *tp > 0) {
+ // There are tokens available. If `H79' is not a subset of `x',
+ // then it is less precise and we use one of the available tokens.
+ if (!x.contains(H79))
+ --(*tp);
+ }
+ else
+ // No tokens.
+ x.m_swap(H79);
+ PPL_ASSERT_HEAVY(x.OK(true));
+ }
+}
+
+void
+PPL::Polyhedron::limited_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Polyhedron& x = *this;
+
+ const dimension_type cs_num_rows = cs.num_rows();
+ // If `cs' is empty, we fall back to ordinary, non-limited widening.
+ if (cs_num_rows == 0) {
+ x.H79_widening_assign(y, tp);
+ return;
+ }
+
+ // Topology compatibility check.
+ if (x.is_necessarily_closed()) {
+ if (!y.is_necessarily_closed())
+ throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+ "y", y);
+ if (cs.has_strict_inequalities())
+ throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+ "cs", cs);
+ }
+ else if (y.is_necessarily_closed())
+ throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+ "y", y);
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+ "y", y);
+ // `cs' must be dimension-compatible with the two polyhedra.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (x.space_dim < cs_space_dim)
+ throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+ "cs", cs);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty())
+ return;
+
+ // The limited H79-widening between two polyhedra in a
+ // zero-dimensional space is a polyhedron in a zero-dimensional
+ // space, too.
+ if (x.space_dim == 0)
+ return;
+
+ if (!y.minimize())
+ // We have just discovered that `y' is empty.
+ return;
+
+ // Update the generators of `x': these are used to select,
+ // from the constraints in `cs', those that must be added
+ // to the resulting polyhedron.
+ if ((x.has_pending_constraints() && !x.process_pending_constraints())
+ || (!x.generators_are_up_to_date() && !x.update_generators()))
+ // We have just discovered that `x' is empty.
+ return;
+
+ Constraint_System new_cs;
+ // The constraints to be added must be satisfied by all the
+ // generators of `x'. We can disregard `y' because `y <= x'.
+ const Generator_System& x_gen_sys = x.gen_sys;
+ // Iterate upwards here so as to keep the relative ordering of constraints.
+ // Not really an issue: just aesthetics.
+ for (dimension_type i = 0; i < cs_num_rows; ++i) {
+ const Constraint& c = cs[i];
+ if (x_gen_sys.satisfied_by_all_generators(c))
+ new_cs.insert(c);
+ }
+ x.H79_widening_assign(y, tp);
+ x.add_recycled_constraints(new_cs);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Rational_Box x_box(*this, ANY_COMPLEXITY);
+ const Rational_Box y_box(y, ANY_COMPLEXITY);
+ x_box.CC76_widening_assign(y_box);
+ limited_H79_extrapolation_assign(y, cs, tp);
+ Constraint_System x_box_cs = x_box.constraints();
+ add_recycled_constraints(x_box_cs);
+}
+
+bool
+PPL::Polyhedron
+::BHRZ03_combining_constraints(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79,
+ const Constraint_System& x_minus_H79_cs) {
+ Polyhedron& x = *this;
+ // It is assumed that `y <= x <= H79'.
+ PPL_ASSERT(x.topology() == y.topology()
+ && x.topology() == H79.topology()
+ && x.topology() == x_minus_H79_cs.topology());
+ PPL_ASSERT(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim
+ && x.space_dim == x_minus_H79_cs.space_dimension());
+ PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+ && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+ // We will choose from `x_minus_H79_cs' many subsets of constraints,
+ // that will be collected (one at a time) in `combining_cs'.
+ // For each group collected, we compute an average constraint,
+ // that will be stored in `new_cs'.
+
+ // There is no point in applying this technique when `x_minus_H79_cs'
+ // has one constraint at most (no ``new'' constraint can be computed).
+ const dimension_type x_minus_H79_cs_num_rows = x_minus_H79_cs.num_rows();
+ if (x_minus_H79_cs_num_rows <= 1)
+ return false;
+
+ const Topology topol = x.topology();
+ Constraint_System combining_cs(topol);
+ Constraint_System new_cs(topol);
+
+ // Consider the points that belong to both `x.gen_sys' and `y.gen_sys'.
+ // For NNC polyhedra, the role of points is played by closure points.
+ const bool closed = x.is_necessarily_closed();
+ for (dimension_type i = y.gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& g = y.gen_sys[i];
+ if ((g.is_point() && closed) || (g.is_closure_point() && !closed)) {
+ // If in `H79.con_sys' there is already an inequality constraint
+ // saturating this point, then there is no need to produce another
+ // constraint.
+ bool lies_on_the_boundary_of_H79 = false;
+ const Constraint_System& H79_cs = H79.con_sys;
+ for (dimension_type j = H79_cs.num_rows(); j-- > 0; ) {
+ const Constraint& c = H79_cs[j];
+ if (c.is_inequality() && Scalar_Products::sign(c, g) == 0) {
+ lies_on_the_boundary_of_H79 = true;
+ break;
+ }
+ }
+ if (lies_on_the_boundary_of_H79)
+ continue;
+
+ // Consider all the constraints in `x_minus_H79_cs'
+ // that are saturated by the point `g'.
+ combining_cs.clear();
+ for (dimension_type j = x_minus_H79_cs_num_rows; j-- > 0; ) {
+ const Constraint& c = x_minus_H79_cs[j];
+ if (Scalar_Products::sign(c, g) == 0)
+ combining_cs.insert(c);
+ }
+ // Build a new constraint by combining all the chosen constraints.
+ const dimension_type combining_cs_num_rows = combining_cs.num_rows();
+ if (combining_cs_num_rows > 0) {
+ if (combining_cs_num_rows == 1)
+ // No combination is needed.
+ new_cs.insert(combining_cs[0]);
+ else {
+ Linear_Expression e(0);
+ bool strict_inequality = false;
+ for (dimension_type h = combining_cs_num_rows; h-- > 0; ) {
+ if (combining_cs[h].is_strict_inequality())
+ strict_inequality = true;
+ e += Linear_Expression(combining_cs[h].expression());
+ }
+
+ if (!e.all_homogeneous_terms_are_zero()) {
+ if (strict_inequality)
+ new_cs.insert(e > 0);
+ else
+ new_cs.insert(e >= 0);
+ }
+ }
+ }
+ }
+ }
+
+ // If none of the collected constraints strictly intersects `H79',
+ // then the technique was unsuccessful.
+ bool improves_upon_H79 = false;
+ const Poly_Con_Relation si = Poly_Con_Relation::strictly_intersects();
+ for (dimension_type i = new_cs.num_rows(); i-- > 0; )
+ if (H79.relation_with(new_cs[i]) == si) {
+ improves_upon_H79 = true;
+ break;
+ }
+ if (!improves_upon_H79)
+ return false;
+
+ // The resulting polyhedron is obtained by adding the constraints
+ // in `new_cs' to polyhedron `H79'.
+ Polyhedron result = H79;
+ result.add_recycled_constraints(new_cs);
+ // Force minimization.
+ result.minimize();
+
+ // Check for stabilization with respect to `y_cert' and improvement
+ // over `H79'.
+ if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+ // The technique was successful.
+ x.m_swap(result);
+ PPL_ASSERT_HEAVY(x.OK(true));
+ return true;
+ }
+ else
+ // The technique was unsuccessful.
+ return false;
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_points(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79) {
+ Polyhedron& x = *this;
+ // It is assumed that `y <= x <= H79'.
+ PPL_ASSERT(x.topology() == y.topology()
+ && x.topology() == H79.topology());
+ PPL_ASSERT(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim);
+ PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+ && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+ // For each point in `x.gen_sys' that is not in `y',
+ // this technique tries to identify a set of rays that:
+ // - are included in polyhedron `H79';
+ // - when added to `y' will subsume the point.
+ Generator_System candidate_rays;
+
+ const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+ const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+ const bool closed = x.is_necessarily_closed();
+ for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+ const Generator& g1 = x.gen_sys[i];
+ // For C polyhedra, we choose a point of `x.gen_sys'
+ // that is not included in `y'.
+ // In the case of NNC polyhedra, we can restrict attention to
+ // closure points (considering also points will only add redundancy).
+ if (((g1.is_point() && closed) || (g1.is_closure_point() && !closed))
+ && y.relation_with(g1) == Poly_Gen_Relation::nothing()) {
+ // For each point (resp., closure point) `g2' in `y.gen_sys',
+ // where `g1' and `g2' are different,
+ // build the candidate ray `g1 - g2'.
+ for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+ const Generator& g2 = y.gen_sys[j];
+ if ((g2.is_point() && closed)
+ || (g2.is_closure_point() && !closed)) {
+ PPL_ASSERT(compare(g1, g2) != 0);
+ Generator ray_from_g2_to_g1 = g1;
+ ray_from_g2_to_g1.linear_combine(g2, 0);
+ candidate_rays.insert(ray_from_g2_to_g1);
+ }
+ }
+ }
+ }
+
+ // Be non-intrusive.
+ Polyhedron result = x;
+ result.add_recycled_generators(candidate_rays);
+ result.intersection_assign(H79);
+ // Force minimization.
+ result.minimize();
+
+ // Check for stabilization with respect to `y_cert' and improvement
+ // over `H79'.
+ if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+ // The technique was successful.
+ x.m_swap(result);
+ PPL_ASSERT_HEAVY(x.OK(true));
+ return true;
+ }
+ else
+ // The technique was unsuccessful.
+ return false;
+}
+
+void
+PPL::Polyhedron::modify_according_to_evolution(Linear_Expression& ray,
+ const Linear_Expression& x,
+ const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ std::deque<bool> considered(x.space_dimension());
+ Linear_Expression::const_iterator x_end = x.end();
+ Linear_Expression::const_iterator y_end = y.end();
+ Linear_Expression::const_iterator y_k = y.begin();
+ for (Linear_Expression::const_iterator x_k = x.begin(); x_k != x_end; ++x_k) {
+ const Variable k_var = x_k.variable();
+ const dimension_type k = k_var.id();
+ if (considered[k])
+ continue;
+
+ while (y_k != y_end && y_k.variable().id() < k)
+ ++y_k;
+
+ if (y_k == y_end)
+ break;
+
+ const Variable y_k_var = y_k.variable();
+
+ // Note that y_k_var.id() may be greater than k.
+
+ Linear_Expression::const_iterator y_h = y_k;
+ // Do *not* increment y_h, since it may be after k already.
+ Linear_Expression::const_iterator x_h = x_k;
+ ++x_h;
+ for ( ; x_h != x_end; ++x_h) {
+ const dimension_type h = x_h.variable().id();
+ if (considered[h])
+ continue;
+
+ while (y_h != y_end && y_h.variable().id() < h)
+ ++y_h;
+
+ // Note that y_h may be y_end, and y_h.variable().id() may not be k.
+
+ if (y_h != y_end && y_h.variable().id() == h)
+ tmp = (*x_k) * (*y_h);
+ else
+ tmp = 0;
+
+ if (y_k_var.id() == k) {
+ // The following line optimizes the computation of
+ // <CODE> tmp -= x[h] * y[k]; </CODE>
+ Parma_Polyhedra_Library::sub_mul_assign(tmp, *x_h, *y_k);
+ }
+
+ const int clockwise = sgn(tmp);
+ const int first_or_third_quadrant = sgn(*x_k) * sgn(*x_h);
+ switch (clockwise * first_or_third_quadrant) {
+ case -1:
+ ray.set_coefficient(k_var, Coefficient_zero());
+ considered[k] = true;
+ break;
+ case 1:
+ ray.set_coefficient(Variable(h), Coefficient_zero());
+ considered[h] = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ ray.normalize();
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_rays(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79) {
+ Polyhedron& x = *this;
+ // It is assumed that `y <= x <= H79'.
+ PPL_ASSERT(x.topology() == y.topology()
+ && x.topology() == H79.topology());
+ PPL_ASSERT(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim);
+ PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+ && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+ const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+ const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+
+ // Candidate rays are kept in a temporary generator system.
+ Generator_System candidate_rays;
+ for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+ const Generator& x_g = x.gen_sys[i];
+ // We choose a ray of `x' that does not belong to `y'.
+ if (x_g.is_ray() && y.relation_with(x_g) == Poly_Gen_Relation::nothing()) {
+ for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+ const Generator& y_g = y.gen_sys[j];
+ if (y_g.is_ray()) {
+ Generator new_ray(x_g);
+ // Modify `new_ray' according to the evolution of `x_g' with
+ // respect to `y_g'.
+ modify_according_to_evolution(new_ray.expr, x_g.expr, y_g.expr);
+ PPL_ASSERT(new_ray.OK());
+ candidate_rays.insert(new_ray);
+ }
+ }
+ }
+ }
+
+ // If there are no candidate rays, we cannot obtain stabilization.
+ if (candidate_rays.has_no_rows())
+ return false;
+
+ // Be non-intrusive.
+ Polyhedron result = x;
+ result.add_recycled_generators(candidate_rays);
+ result.intersection_assign(H79);
+ // Force minimization.
+ result.minimize();
+
+ // Check for stabilization with respect to `y' and improvement over `H79'.
+ if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+ // The technique was successful.
+ x.m_swap(result);
+ PPL_ASSERT_HEAVY(x.OK(true));
+ return true;
+ }
+ else
+ // The technique was unsuccessful.
+ return false;
+}
+
+void
+PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("BHRZ03_widening_assign(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("BHRZ03_widening_assign(y)", "y", y);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ // If any argument is zero-dimensional or empty,
+ // the BHRZ03-widening behaves as the identity function.
+ if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+ return;
+
+ // `y.con_sys' and `y.gen_sys' should be in minimal form.
+ if (!y.minimize())
+ // `y' is empty: the result is `x'.
+ return;
+ // `x.con_sys' and `x.gen_sys' should be in minimal form.
+ x.minimize();
+
+ // Compute certificate info for polyhedron `y'.
+ const BHRZ03_Certificate y_cert(y);
+
+ // If the iteration is stabilizing, the resulting polyhedron is `x'.
+ // At this point, also check if the two polyhedra are the same
+ // (exploiting the knowledge that `y <= x').
+ if (y_cert.is_stabilizing(x) || y.contains(x)) {
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Here the iteration is not immediately stabilizing.
+ // If we are using the widening-with-tokens technique and
+ // there are tokens available, use one of them and return `x'.
+ if (tp != 0 && *tp > 0) {
+ --(*tp);
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Copy into `H79_cs' the constraints that are common to `x' and `y',
+ // according to the definition of the H79 widening.
+ // The other ones are copied into `x_minus_H79_cs'.
+ const Topology topol = x.topology();
+ Constraint_System H79_cs(topol);
+ Constraint_System x_minus_H79_cs(topol);
+ x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+ // We cannot have selected all of the rows, since otherwise
+ // the iteration should have been immediately stabilizing.
+ PPL_ASSERT(!x_minus_H79_cs.has_no_rows());
+ // Be careful to obtain the right space dimension
+ // (because `H79_cs' may be empty).
+ Polyhedron H79(topol, x.space_dim, UNIVERSE);
+ H79.add_recycled_constraints(H79_cs);
+ // Force minimization.
+ H79.minimize();
+
+ // NOTE: none of the following widening heuristics is intrusive:
+ // they will modify `x' only when returning successfully.
+ if (x.BHRZ03_combining_constraints(y, y_cert, H79, x_minus_H79_cs))
+ return;
+
+ PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+ if (x.BHRZ03_evolving_points(y, y_cert, H79))
+ return;
+
+ PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+ if (x.BHRZ03_evolving_rays(y, y_cert, H79))
+ return;
+
+ PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+ // No previous technique was successful: fall back to the H79 widening.
+ x.m_swap(H79);
+ PPL_ASSERT_HEAVY(x.OK(true));
+
+ // The H79 widening is always stabilizing.
+ PPL_ASSERT(y_cert.is_stabilizing(x));
+}
+
+void
+PPL::Polyhedron
+::limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Polyhedron& x = *this;
+ const dimension_type cs_num_rows = cs.num_rows();
+ // If `cs' is empty, we fall back to ordinary, non-limited widening.
+ if (cs_num_rows == 0) {
+ x.BHRZ03_widening_assign(y, tp);
+ return;
+ }
+
+ // Topology compatibility check.
+ if (x.is_necessarily_closed()) {
+ if (!y.is_necessarily_closed())
+ throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+ "y", y);
+ if (cs.has_strict_inequalities())
+ throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+ "cs", cs);
+ }
+ else if (y.is_necessarily_closed())
+ throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+ "y", y);
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+ "y", y);
+ // `cs' must be dimension-compatible with the two polyhedra.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (x.space_dim < cs_space_dim)
+ throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+ "cs", cs);
+
+ // Assume `y' is contained in or equal to `x'.
+ PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+ if (y.marked_empty())
+ return;
+ if (x.marked_empty())
+ return;
+
+ // The limited BHRZ03-widening between two polyhedra in a
+ // zero-dimensional space is a polyhedron in a zero-dimensional
+ // space, too.
+ if (x.space_dim == 0)
+ return;
+
+ if (!y.minimize())
+ // We have just discovered that `y' is empty.
+ return;
+
+ // Update the generators of `x': these are used to select,
+ // from the constraints in `cs', those that must be added
+ // to the resulting polyhedron.
+ if ((x.has_pending_constraints() && !x.process_pending_constraints())
+ || (!x.generators_are_up_to_date() && !x.update_generators()))
+ // We have just discovered that `x' is empty.
+ return;
+
+ Constraint_System new_cs;
+ // The constraints to be added must be satisfied by all the
+ // generators of `x'. We can disregard `y' because `y <= x'.
+ const Generator_System& x_gen_sys = x.gen_sys;
+ // Iterate upwards here so as to keep the relative ordering of constraints.
+ // Not really an issue: just aesthetics.
+ for (dimension_type i = 0; i < cs_num_rows; ++i) {
+ const Constraint& c = cs[i];
+ if (x_gen_sys.satisfied_by_all_generators(c))
+ new_cs.insert(c);
+ }
+ x.BHRZ03_widening_assign(y, tp);
+ x.add_recycled_constraints(new_cs);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron
+::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Rational_Box x_box(*this, ANY_COMPLEXITY);
+ const Rational_Box y_box(y, ANY_COMPLEXITY);
+ x_box.CC76_widening_assign(y_box);
+ limited_BHRZ03_extrapolation_assign(y, cs, tp);
+ Constraint_System x_box_cs = x_box.constraints();
+ add_recycled_constraints(x_box_cs);
+}
diff --git a/src/Powerset_defs.hh b/src/Powerset_defs.hh
new file mode 100644
index 0000000..1fae637
--- /dev/null
+++ b/src/Powerset_defs.hh
@@ -0,0 +1,450 @@
+/* Powerset class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_defs_hh
+#define PPL_Powerset_defs_hh
+
+#include "Powerset_types.hh"
+#include "globals_types.hh"
+#include "iterator_to_const_defs.hh"
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Powerset */
+template <typename D>
+void swap(Powerset<D>& x, Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+ This class offers a generic implementation of a
+ <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+ Besides invoking the available methods on the disjuncts of a Powerset,
+ this class also provides bidirectional iterators that allow for a
+ direct inspection of these disjuncts. For a consistent handling of
+ Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+ that the disjuncts cannot be overwritten. Rather, by using the class
+ <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+ (possibly so as to later add back modified versions). As an example
+ of iterator usage, the following template function drops from
+ powerset \p ps all the disjuncts that would have become redundant by
+ the addition of an external element \p d.
+
+ \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+ for (typename Powerset<D>::iterator i = ps.begin(),
+ ps_end = ps.end(), i != ps_end; )
+ if (i->definitely_entails(d))
+ i = ps.drop_disjunct(i);
+ else
+ ++i;
+}
+ \endcode
+
+ The template class D must provide the following methods.
+ \code
+ memory_size_type total_memory_in_bytes() const
+ \endcode
+ Returns a lower bound on the total size in bytes of the memory
+ occupied by the instance of D.
+ \code
+ bool is_top() const
+ \endcode
+ Returns <CODE>true</CODE> if and only if the instance of D is the top
+ element of the domain.
+ \code
+ bool is_bottom() const
+ \endcode
+ Returns <CODE>true</CODE> if and only if the instance of D is the
+ bottom element of the domain.
+ \code
+ bool definitely_entails(const D& y) const
+ \endcode
+ Returns <CODE>true</CODE> if the instance of D definitely entails
+ <CODE>y</CODE>. Returns <CODE>false</CODE> if the instance may not
+ entail <CODE>y</CODE> (i.e., if the instance does not entail
+ <CODE>y</CODE> or if entailment could not be decided).
+ \code
+ void upper_bound_assign(const D& y)
+ \endcode
+ Assigns to the instance of D an upper bound of the instance and
+ <CODE>y</CODE>.
+ \code
+ void meet_assign(const D& y)
+ \endcode
+ Assigns to the instance of D the meet of the instance and
+ <CODE>y</CODE>.
+ \code
+ bool OK() const
+ \endcode
+ Returns <CODE>true</CODE> if the instance of D is in a consistent
+ state, else returns <CODE>false</CODE>.
+
+ The following operators on the template class D must be defined.
+ \code
+ operator<<(std::ostream& s, const D& x)
+ \endcode
+ Writes a textual representation of the instance of D on
+ <CODE>s</CODE>.
+ \code
+ operator==(const D& x, const D& y)
+ \endcode
+ Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+ <CODE>y</CODE> are equivalent D's.
+ \code
+ operator!=(const D& x, const D& y)
+ \endcode
+ Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+ <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Default constructor: builds the bottom of the powerset constraint
+ system (i.e., the empty powerset).
+ */
+ Powerset();
+
+ //! Copy constructor.
+ Powerset(const Powerset& y);
+
+ /*! \brief
+ If \p d is not bottom, builds a powerset containing only \p d.
+ Builds the empty powerset otherwise.
+ */
+ explicit Powerset(const D& d);
+
+ //! Destructor.
+ ~Powerset();
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Powerset Object
+ //@{
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+ Returns <CODE>false</CODE> if \p *this may not entail \p y
+ (i.e., if \p *this does not entail \p y or if entailment could
+ not be decided).
+ */
+ bool definitely_entails(const Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the top
+ element of the powerset constraint system (i.e., it represents
+ the universe).
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the bottom
+ element of the powerset constraint system (i.e., it represents
+ the empty set).
+ */
+ bool is_bottom() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ // FIXME: document and perhaps use an enum instead of a bool.
+ bool OK(bool disallow_bottom = false) const;
+
+ //@} // Member Functions that Do Not Modify the Powerset Object
+
+protected:
+ //! A powerset is implemented as a sequence of elements.
+ /*!
+ The particular sequence employed must support efficient deletion
+ in any position and efficient back insertion.
+ */
+ typedef std::list<D> Sequence;
+
+ //! Alias for the low-level iterator on the disjuncts.
+ typedef typename Sequence::iterator Sequence_iterator;
+
+ //! Alias for the low-level %const_iterator on the disjuncts.
+ typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+ //! The sequence container holding powerset's elements.
+ Sequence sequence;
+
+ //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+ mutable bool reduced;
+
+public:
+ // Sequence manipulation types, accessors and modifiers
+ typedef typename Sequence::size_type size_type;
+ typedef typename Sequence::value_type value_type;
+
+ /*! \brief
+ Alias for a <EM>read-only</EM> bidirectional %iterator on the
+ disjuncts of a Powerset element.
+
+ By using this iterator type, the disjuncts cannot be overwritten,
+ but they can be removed using methods
+ <CODE>drop_disjunct(iterator position)</CODE> and
+ <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+ while still ensuring a correct handling of Omega-reduction.
+ */
+ typedef iterator_to_const<Sequence> iterator;
+
+ //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+ typedef const_iterator_to_const<Sequence> const_iterator;
+
+ //! The reverse iterator type built from Powerset::iterator.
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+
+ //! The reverse iterator type built from Powerset::const_iterator.
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+ //! \name Member Functions for the Direct Manipulation of Disjuncts
+ //@{
+
+ /*! \brief
+ Drops from the sequence of disjuncts in \p *this all the
+ non-maximal elements so that \p *this is non-redundant.
+
+ This method is declared <CODE>const</CODE> because, even though
+ Omega-reduction may change the syntactic representation of \p *this,
+ its semantics will be unchanged.
+ */
+ void omega_reduce() const;
+
+ //! Returns the number of disjuncts.
+ size_type size() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there are no disjuncts in
+ \p *this.
+ */
+ bool empty() const;
+
+ /*! \brief
+ Returns an iterator pointing to the first disjunct, if \p *this
+ is not empty; otherwise, returns the past-the-end iterator.
+ */
+ iterator begin();
+
+ //! Returns the past-the-end iterator.
+ iterator end();
+
+ /*! \brief
+ Returns a const_iterator pointing to the first disjunct, if \p *this
+ is not empty; otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ /*! \brief
+ Returns a reverse_iterator pointing to the last disjunct, if \p *this
+ is not empty; otherwise, returns the before-the-start reverse_iterator.
+ */
+ reverse_iterator rbegin();
+
+ //! Returns the before-the-start reverse_iterator.
+ reverse_iterator rend();
+
+ /*! \brief
+ Returns a const_reverse_iterator pointing to the last disjunct,
+ if \p *this is not empty; otherwise, returns the before-the-start
+ const_reverse_iterator.
+ */
+ const_reverse_iterator rbegin() const;
+
+ //! Returns the before-the-start const_reverse_iterator.
+ const_reverse_iterator rend() const;
+
+ //! Adds to \p *this the disjunct \p d.
+ void add_disjunct(const D& d);
+
+ /*! \brief
+ Drops the disjunct in \p *this pointed to by \p position, returning
+ an iterator to the disjunct following \p position.
+ */
+ iterator drop_disjunct(iterator position);
+
+ //! Drops all the disjuncts from \p first to \p last (excluded).
+ void drop_disjuncts(iterator first, iterator last);
+
+ //! Drops all the disjuncts, making \p *this an empty powerset.
+ void clear();
+
+ //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+ //! \name Member Functions that May Modify the Powerset Object
+ //@{
+
+ //! The assignment operator.
+ Powerset& operator=(const Powerset& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Powerset& y);
+
+ //! Assigns to \p *this the least upper bound of \p *this and \p y.
+ void least_upper_bound_assign(const Powerset& y);
+
+ //! Assigns to \p *this an upper bound of \p *this and \p y.
+ /*!
+ The result will be the least upper bound of \p *this and \p y.
+ */
+ void upper_bound_assign(const Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this the least upper bound of \p *this and \p y
+ and returns \c true.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Powerset& y);
+
+ //! Assigns to \p *this the meet of \p *this and \p y.
+ void meet_assign(const Powerset& y);
+
+ /*! \brief
+ If \p *this is not empty (i.e., it is not the bottom element),
+ it is reduced to a singleton obtained by computing an upper-bound
+ of all the disjuncts.
+ */
+ void collapse();
+
+ //@} // Member Functions that May Modify the Powerset element
+
+protected:
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this does not contain
+ non-maximal elements.
+ */
+ bool is_omega_reduced() const;
+
+ /*! \brief Upon return, \p *this will contain at most \p
+ max_disjuncts elements; the set of disjuncts in positions greater
+ than or equal to \p max_disjuncts, will be replaced at that
+ position by their upper-bound.
+ */
+ void collapse(unsigned max_disjuncts);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d,
+ assuming \p d is not the bottom element and ensuring
+ partial Omega-reduction.
+
+ If \p d is not the bottom element and is not Omega-redundant with
+ respect to elements in positions between \p first and \p last, all
+ elements in these positions that would be made Omega-redundant by the
+ addition of \p d are dropped and \p d is added to the reduced
+ sequence.
+ If \p *this is reduced before an invocation of this method,
+ it will be reduced upon successful return from the method.
+ */
+ iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+ iterator first,
+ iterator last);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d, assuming \p d is not the
+ bottom element and preserving Omega-reduction.
+
+ If \p *this is reduced before an invocation of this method,
+ it will be reduced upon successful return from the method.
+ */
+ void add_non_bottom_disjunct_preserve_reduction(const D& d);
+
+ /*! \brief
+ Assigns to \p *this the result of applying \p op_assign pairwise
+ to the elements in \p *this and \p y.
+
+ The elements of the powerset result are obtained by applying
+ \p op_assign to each pair of elements whose components are drawn
+ from \p *this and \p y, respectively.
+ */
+ template <typename Binary_Operator_Assign>
+ void pairwise_apply_assign(const Powerset& y,
+ Binary_Operator_Assign op_assign);
+
+private:
+ /*! \brief
+ Does the hard work of checking whether \p *this contains non-maximal
+ elements and returns <CODE>true</CODE> if and only if it does not.
+ */
+ bool check_omega_reduced() const;
+
+ /*! \brief
+ Replaces the disjunct \p *sink by an upper bound of itself and
+ all the disjuncts following it.
+ */
+ void collapse(Sequence_iterator sink);
+};
+
+#include "Powerset_inlines.hh"
+#include "Powerset_templates.hh"
+
+#endif // !defined(PPL_Powerset_defs_hh)
diff --git a/src/Powerset_inlines.hh b/src/Powerset_inlines.hh
new file mode 100644
index 0000000..ca473a2
--- /dev/null
+++ b/src/Powerset_inlines.hh
@@ -0,0 +1,231 @@
+/* Powerset class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_inlines_hh
+#define PPL_Powerset_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+ return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+ return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+ return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+ return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+ return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+ return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+ return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+ return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+ return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+ return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+ return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+ sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+ sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+ : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+ sequence = y.sequence;
+ reduced = y.reduced;
+ return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::m_swap(Powerset& y) {
+ using std::swap;
+ swap(sequence, y.sequence);
+ swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+ : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+ : sequence(), reduced(false) {
+ sequence.push_back(d);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+ // !d.is_bottom() is asserted by the callee.
+ add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+ sequence.push_back(d);
+ reduced = false;
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+ return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+ // Must perform omega-reduction for correctness.
+ omega_reduce();
+ const_iterator xi = begin();
+ const_iterator x_end = end();
+ return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+ // Must perform omega-reduction for correctness.
+ omega_reduce();
+ return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+ if (!empty())
+ collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+ pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+ least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+ least_upper_bound_assign(y);
+ return true;
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline void
+swap(Powerset<D>& x, Powerset<D>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_inlines_hh)
diff --git a/src/Powerset_templates.hh b/src/Powerset_templates.hh
new file mode 100644
index 0000000..bb0556b
--- /dev/null
+++ b/src/Powerset_templates.hh
@@ -0,0 +1,312 @@
+/* Powerset class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_templates_hh
+#define PPL_Powerset_templates_hh 1
+
+#include "globals_defs.hh"
+#include <algorithm>
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+ PPL_ASSERT(sink != sequence.end());
+ D& d = *sink;
+ iterator x_sink = sink;
+ iterator next_x_sink = x_sink;
+ ++next_x_sink;
+ iterator x_end = end();
+ for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+ d.upper_bound_assign(*xi);
+ // Drop the surplus disjuncts.
+ drop_disjuncts(next_x_sink, x_end);
+
+ // Ensure omega-reduction.
+ for (iterator xi = begin(); xi != x_sink; )
+ if (xi->definitely_entails(d))
+ xi = drop_disjunct(xi);
+ else
+ ++xi;
+
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+ if (reduced)
+ return;
+
+ Powerset& x = const_cast<Powerset&>(*this);
+ // First remove all bottom elements.
+ for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+ if (xi->is_bottom())
+ xi = x.drop_disjunct(xi);
+ else
+ ++xi;
+ // Then remove non-maximal elements.
+ for (iterator xi = x.begin(); xi != x.end(); ) {
+ const D& xv = *xi;
+ bool dropping_xi = false;
+ for (iterator yi = x.begin(); yi != x.end(); )
+ if (xi == yi)
+ ++yi;
+ else {
+ const D& yv = *yi;
+ if (yv.definitely_entails(xv))
+ yi = x.drop_disjunct(yi);
+ else if (xv.definitely_entails(yv)) {
+ dropping_xi = true;
+ break;
+ }
+ else
+ ++yi;
+ }
+ if (dropping_xi)
+ xi = x.drop_disjunct(xi);
+ else
+ ++xi;
+ if (abandon_expensive_computations != 0 && xi != x.end()) {
+ // Hurry up!
+ x.collapse(xi.base);
+ break;
+ }
+ }
+ reduced = true;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+ PPL_ASSERT(max_disjuncts > 0);
+ // Omega-reduce before counting the number of disjuncts.
+ omega_reduce();
+ size_type n = size();
+ if (n > max_disjuncts) {
+ // Let `i' point to the last disjunct that will survive.
+ iterator i = begin();
+ std::advance(i, max_disjuncts-1);
+ // This disjunct will be assigned an upper-bound of itself and of
+ // all the disjuncts that follow.
+ collapse(i.base);
+ }
+ PPL_ASSERT_HEAVY(OK());
+ PPL_ASSERT(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+ for (const_iterator x_begin = begin(), x_end = end(),
+ xi = x_begin; xi != x_end; ++xi) {
+ const D& xv = *xi;
+ if (xv.is_bottom())
+ return false;
+ for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+ if (xi == yi)
+ continue;
+ const D& yv = *yi;
+ if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+ return false;
+ }
+ }
+ return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+ if (!reduced && check_omega_reduced())
+ reduced = true;
+ return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+ iterator first,
+ iterator last) {
+ PPL_ASSERT_HEAVY(!d.is_bottom());
+ for (iterator xi = first; xi != last; ) {
+ const D& xv = *xi;
+ if (d.definitely_entails(xv))
+ return first;
+ else if (xv.definitely_entails(d)) {
+ if (xi == first)
+ ++first;
+ xi = drop_disjunct(xi);
+ }
+ else
+ ++xi;
+ }
+ sequence.push_back(d);
+ PPL_ASSERT_HEAVY(OK());
+ return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+ const Powerset<D>& x = *this;
+ bool found = true;
+ for (const_iterator xi = x.begin(),
+ x_end = x.end(); found && xi != x_end; ++xi) {
+ found = false;
+ for (const_iterator yi = y.begin(),
+ y_end = y.end(); !found && yi != y_end; ++yi)
+ found = (*xi).definitely_entails(*yi);
+ }
+ return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+ x.omega_reduce();
+ y.omega_reduce();
+ if (x.size() != y.size())
+ return false;
+ // Take a copy of `y' and work with it.
+ Powerset<D> z = y;
+ for (typename Powerset<D>::const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi) {
+ typename Powerset<D>::iterator zi = z.begin();
+ typename Powerset<D>::iterator z_end = z.end();
+ zi = std::find(zi, z_end, *xi);
+ if (zi == z_end)
+ return false;
+ else
+ z.drop_disjunct(zi);
+ }
+ return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+ Binary_Operator_Assign op_assign) {
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ omega_reduce();
+ y.omega_reduce();
+ Sequence new_sequence;
+ for (const_iterator xi = begin(), x_end = end(),
+ y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+ for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+ D zi = *xi;
+ op_assign(zi, *yi);
+ if (!zi.is_bottom())
+ new_sequence.push_back(zi);
+ }
+ // Put the new sequence in place.
+ using std::swap;
+ swap(sequence, new_sequence);
+ reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ omega_reduce();
+ y.omega_reduce();
+ iterator old_begin = begin();
+ iterator old_end = end();
+ for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+ old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+ old_begin,
+ old_end);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+ if (x.is_bottom())
+ s << "false";
+ else if (x.is_top())
+ s << "true";
+ else
+ for (typename Powerset<D>::const_iterator i = x.begin(),
+ x_end = x.end(); i != x_end; ) {
+ s << "{ " << *i << " }";
+ ++i;
+ if (i != x_end)
+ s << ", ";
+ }
+ return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+ memory_size_type bytes = 0;
+ for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+ bytes += xi->total_memory_in_bytes();
+ // We assume there is at least a forward and a backward link, and
+ // that the pointers implementing them are at least the size of
+ // pointers to `D'.
+ bytes += 2*sizeof(D*);
+ }
+ return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+ for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+ if (!xi->OK())
+ return false;
+ if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+ std::cerr << "Bottom element in powerset!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+ std::cerr << "Powerset claims to be reduced, but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_templates_hh)
diff --git a/src/Powerset_types.hh b/src/Powerset_types.hh
new file mode 100644
index 0000000..30deeb6
--- /dev/null
+++ b/src/Powerset_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Powerset_types_hh
+#define PPL_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_types_hh)
diff --git a/src/Ptr_Iterator_defs.hh b/src/Ptr_Iterator_defs.hh
new file mode 100644
index 0000000..a2dc3fd
--- /dev/null
+++ b/src/Ptr_Iterator_defs.hh
@@ -0,0 +1,172 @@
+/* Ptr_Iterator class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_defs_hh
+#define PPL_Ptr_Iterator_defs_hh 1
+
+#include "Ptr_Iterator_types.hh"
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename P, typename Q>
+bool operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+ : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+ typename std::iterator_traits<P>::value_type,
+ typename std::iterator_traits<P>::difference_type,
+ typename std::iterator_traits<P>::pointer,
+ typename std::iterator_traits<P>::reference> {
+public:
+ typedef typename std::iterator_traits<P>::difference_type difference_type;
+ typedef typename std::iterator_traits<P>::reference reference;
+ typedef typename std::iterator_traits<P>::pointer pointer;
+
+ //! Default constructor: no guarantees.
+ Ptr_Iterator();
+
+ //! Construct an iterator pointing at \p q.
+ explicit Ptr_Iterator(const P& q);
+
+ /*! \brief
+ Copy constructor allowing the construction of a const_iterator
+ from a non-const iterator.
+ */
+ template<typename Q>
+ Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Subscript operator.
+ reference operator[](const difference_type m) const;
+
+ //! Prefix increment operator.
+ Ptr_Iterator& operator++();
+
+ //! Postfix increment operator.
+ Ptr_Iterator operator++(int);
+
+ //! Prefix decrement operator
+ Ptr_Iterator& operator--();
+
+ //! Postfix decrement operator.
+ Ptr_Iterator operator--(int);
+
+ //! Assignment-increment operator.
+ Ptr_Iterator& operator+=(const difference_type m);
+
+ //! Assignment-decrement operator.
+ Ptr_Iterator& operator-=(const difference_type m);
+
+ //! Returns the difference between \p *this and \p y.
+ difference_type operator-(const Ptr_Iterator& y) const;
+
+ //! Returns the sum of \p *this and \p m.
+ Ptr_Iterator operator+(const difference_type m) const;
+
+ //! Returns the difference of \p *this and \p m.
+ Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+ //! The base pointer implementing the iterator.
+ P p;
+
+ //! Returns the hidden pointer.
+ const P& base() const;
+
+ template <typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template <typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend typename Ptr_Iterator<Q>::difference_type
+ Parma_Polyhedra_Library::Implementation::
+ operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ friend Ptr_Iterator<P>
+ Parma_Polyhedra_Library::Implementation::
+ operator+<>(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y);
+};
+
+#include "Ptr_Iterator_inlines.hh"
+
+#endif // !defined(PPL_Ptr_Iterator_defs_hh)
diff --git a/src/Ptr_Iterator_inlines.hh b/src/Ptr_Iterator_inlines.hh
new file mode 100644
index 0000000..dc1bdca
--- /dev/null
+++ b/src/Ptr_Iterator_inlines.hh
@@ -0,0 +1,189 @@
+/* Ptr_Iterator class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_inlines_hh
+#define PPL_Ptr_Iterator_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+ return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+ : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+ : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& q)
+ : p(q.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+ return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+ return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+ return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+ ++p;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+ return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+ --p;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+ return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+ p += m;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+ p -= m;
+ return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+ return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+ return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+ return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y) {
+ return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_inlines_hh)
diff --git a/src/Ptr_Iterator_types.hh b/src/Ptr_Iterator_types.hh
new file mode 100644
index 0000000..f696d82
--- /dev/null
+++ b/src/Ptr_Iterator_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Ptr_Iterator_types_hh
+#define PPL_Ptr_Iterator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_types_hh)
diff --git a/src/Rational_Box.hh b/src/Rational_Box.hh
new file mode 100644
index 0000000..374a060
--- /dev/null
+++ b/src/Rational_Box.hh
@@ -0,0 +1,39 @@
+/* Rational_Box class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rational_Box_hh
+#define PPL_Rational_Box_hh 1
+
+#include "Rational_Interval.hh"
+#include "Box_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Box_hh)
diff --git a/src/Rational_Interval.hh b/src/Rational_Interval.hh
new file mode 100644
index 0000000..ec8331f
--- /dev/null
+++ b/src/Rational_Interval.hh
@@ -0,0 +1,54 @@
+/* Rational_Interval class declaration and implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rational_Interval_hh
+#define PPL_Rational_Interval_hh 1
+
+#include "Interval_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Rational_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Rational_Interval_Info_Policy> Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Interval_hh)
diff --git a/src/Result_defs.hh b/src/Result_defs.hh
new file mode 100644
index 0000000..860a7b7
--- /dev/null
+++ b/src/Result_defs.hh
@@ -0,0 +1,195 @@
+/* Result enum and supporting function declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Result_defs_hh
+#define PPL_Result_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+enum Result_Class {
+ //! \hideinitializer Representable number result class.
+ VC_NORMAL = 0U << 4,
+
+ //! \hideinitializer Negative infinity result class.
+ VC_MINUS_INFINITY = 1U << 4,
+
+ //! \hideinitializer Positive infinity result class.
+ VC_PLUS_INFINITY = 2U << 4,
+
+ //! \hideinitializer Not a number result class.
+ VC_NAN = 3U << 4,
+
+ VC_MASK = VC_NAN
+};
+
+// This must be kept in sync with Relation_Symbol
+enum Result_Relation {
+ //! \hideinitializer No values satisfies the relation.
+ VR_EMPTY = 0U,
+
+ //! \hideinitializer Equal. This need to be accompanied by a value.
+ VR_EQ = 1U,
+
+ //! \hideinitializer Less than. This need to be accompanied by a value.
+ VR_LT = 2U,
+
+ //! \hideinitializer Greater than. This need to be accompanied by a value.
+ VR_GT = 4U,
+
+ //! \hideinitializer Not equal. This need to be accompanied by a value.
+ VR_NE = VR_LT | VR_GT,
+
+ //! \hideinitializer Less or equal. This need to be accompanied by a value.
+ VR_LE = VR_EQ | VR_LT,
+
+ //! \hideinitializer Greater or equal. This need to be accompanied by a value.
+ VR_GE = VR_EQ | VR_GT,
+
+ //! \hideinitializer All values satisfy the relation.
+ VR_LGE = VR_LT | VR_EQ | VR_GT,
+
+ VR_MASK = VR_LGE
+};
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+ //! \hideinitializer The exact result is not comparable.
+ V_EMPTY = VR_EMPTY,
+
+ //! \hideinitializer The computed result is exact.
+ V_EQ = static_cast<unsigned>(VR_EQ),
+
+ //! \hideinitializer The computed result is inexact and rounded up.
+ V_LT = static_cast<unsigned>(VR_LT),
+
+ //! \hideinitializer The computed result is inexact and rounded down.
+ V_GT = static_cast<unsigned>(VR_GT),
+
+ //! \hideinitializer The computed result is inexact.
+ V_NE = VR_NE,
+
+ //! \hideinitializer The computed result may be inexact and rounded up.
+ V_LE = VR_LE,
+
+ //! \hideinitializer The computed result may be inexact and rounded down.
+ V_GE = VR_GE,
+
+ //! \hideinitializer The computed result may be inexact.
+ V_LGE = VR_LGE,
+
+ //! \hideinitializer The exact result is a number out of finite bounds.
+ V_OVERFLOW = 1U << 6,
+
+ //! \hideinitializer A negative integer overflow occurred (rounding up).
+ V_LT_INF = V_LT | V_OVERFLOW,
+
+ //! \hideinitializer A positive integer overflow occurred (rounding down).
+ V_GT_SUP = V_GT | V_OVERFLOW,
+
+ //! \hideinitializer A positive integer overflow occurred (rounding up).
+ V_LT_PLUS_INFINITY = V_LT | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+ //! \hideinitializer A negative integer overflow occurred (rounding down).
+ V_GT_MINUS_INFINITY = V_GT | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+ //! \hideinitializer Negative infinity result.
+ V_EQ_MINUS_INFINITY = V_EQ | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+ //! \hideinitializer Positive infinity result.
+ V_EQ_PLUS_INFINITY = V_EQ | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+ //! \hideinitializer Not a number result.
+ V_NAN = static_cast<unsigned>(VC_NAN),
+
+ //! \hideinitializer Converting from unknown string.
+ V_CVT_STR_UNK = V_NAN | (1U << 8),
+
+ //! \hideinitializer Dividing by zero.
+ V_DIV_ZERO = V_NAN | (2U << 8),
+
+ //! \hideinitializer Adding two infinities having opposite signs.
+ V_INF_ADD_INF = V_NAN | (3U << 8),
+
+ //! \hideinitializer Dividing two infinities.
+ V_INF_DIV_INF = V_NAN | (4U << 8),
+
+ //! \hideinitializer Taking the modulus of an infinity.
+ V_INF_MOD = V_NAN | (5U << 8),
+
+ //! \hideinitializer Multiplying an infinity by zero.
+ V_INF_MUL_ZERO = V_NAN | (6U << 8),
+
+ //! \hideinitializer Subtracting two infinities having the same sign.
+ V_INF_SUB_INF = V_NAN | (7U << 8),
+
+ //! \hideinitializer Computing a remainder modulo zero.
+ V_MOD_ZERO = V_NAN | (8U << 8),
+
+ //! \hideinitializer Taking the square root of a negative number.
+ V_SQRT_NEG = V_NAN | (9U << 8),
+
+ //! \hideinitializer Unknown result due to intermediate negative overflow.
+ V_UNKNOWN_NEG_OVERFLOW = V_NAN | (10U << 8),
+
+ //! \hideinitializer Unknown result due to intermediate positive overflow.
+ V_UNKNOWN_POS_OVERFLOW = V_NAN | (11U << 8),
+
+ //! \hideinitializer The computed result is not representable.
+ V_UNREPRESENTABLE = 1U << 7
+
+};
+
+//! \name Functions Inspecting and/or Combining Result Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Result operator&(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator|(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator-(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Extracts the value class part of \p r (representable number,
+ unrepresentable minus/plus infinity or nan).
+*/
+Result_Class result_class(Result r);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Extracts the relation part of \p r.
+*/
+Result_Relation result_relation(Result r);
+
+/*! \ingroup PPL_CXX_interface */
+Result result_relation_class(Result r);
+
+//@} // Functions Inspecting and/or Combining Result Values
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Result_inlines.hh"
+
+#endif // !defined(PPL_Result_defs_hh)
diff --git a/src/Result_inlines.hh b/src/Result_inlines.hh
new file mode 100644
index 0000000..a7ad02d
--- /dev/null
+++ b/src/Result_inlines.hh
@@ -0,0 +1,102 @@
+/* Result supporting functions implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Result_inlines_hh
+#define PPL_Result_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator&(Result x, Result y) {
+ const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+ return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator|(Result x, Result y) {
+ const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+ return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator-(Result x, Result y) {
+ const Result y_neg = static_cast<Result>(~static_cast<unsigned>(y));
+ return x & y_neg;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Class
+result_class(Result r) {
+ const Result rc = r & static_cast<Result>(VC_MASK);
+ return static_cast<Result_Class>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Relation
+result_relation(Result r) {
+ const Result rc = r & static_cast<Result>(VR_MASK);
+ return static_cast<Result_Relation>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+result_relation_class(Result r) {
+ return r & (static_cast<Result>(VR_MASK) | static_cast<Result>(VC_MASK));
+}
+
+inline int
+result_overflow(Result r) {
+ switch (result_class(r)) {
+ case VC_NORMAL:
+ switch (r) {
+ case V_LT_INF:
+ return -1;
+ case V_GT_SUP:
+ return 1;
+ default:
+ break;
+ }
+ break;
+ case VC_MINUS_INFINITY:
+ return -1;
+ case VC_PLUS_INFINITY:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+}
+
+inline bool
+result_representable(Result r) {
+ return (r & V_UNREPRESENTABLE) != V_UNREPRESENTABLE;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Result_inlines_hh)
diff --git a/src/Rounding_Dir_defs.hh b/src/Rounding_Dir_defs.hh
new file mode 100644
index 0000000..82b403e
--- /dev/null
+++ b/src/Rounding_Dir_defs.hh
@@ -0,0 +1,124 @@
+/* Declaration of Rounding_Dir and related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rounding_defs_hh
+#define PPL_Rounding_defs_hh 1
+
+#include "Result_defs.hh"
+#include "fpu_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+ /*! \hideinitializer
+ Round toward \f$-\infty\f$.
+ */
+ ROUND_DOWN = 0U,
+
+ /*! \hideinitializer
+ Round toward \f$+\infty\f$.
+ */
+ ROUND_UP = 1U,
+
+ /*! \hideinitializer
+ Rounding is delegated to lower level. Result info is evaluated lazily.
+ */
+ ROUND_IGNORE = 6U,
+ ROUND_NATIVE = ROUND_IGNORE,
+
+ /*! \hideinitializer
+ Rounding is not needed: client code must ensure that the operation
+ result is exact and representable in the destination type.
+ Result info is evaluated lazily.
+ */
+ ROUND_NOT_NEEDED = 7U,
+
+ ROUND_DIRECT = ROUND_UP,
+ ROUND_INVERSE = ROUND_DOWN,
+
+ ROUND_DIR_MASK = 7U,
+
+ /*! \hideinitializer
+ The client code is willing to pay an extra price to know the exact
+ relation between the exact result and the computed one.
+ */
+ ROUND_STRICT_RELATION = 8U,
+
+ ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION
+};
+
+//! \name Functions Inspecting and/or Combining Rounding_Dir Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Returns the inverse rounding mode of \p dir,
+ <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir round_dir(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_down(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_up(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_ignore(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_needed(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_requested(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_direct(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_strict_relation(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
+
+//@} // Functions Inspecting and/or Combining Rounding_Dir Values
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Rounding_Dir_inlines.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/Rounding_Dir_inlines.hh b/src/Rounding_Dir_inlines.hh
new file mode 100644
index 0000000..e838463
--- /dev/null
+++ b/src/Rounding_Dir_inlines.hh
@@ -0,0 +1,141 @@
+/* Inline functions operating on enum Rounding_Dir values.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rounding_Dir_inlines_hh
+#define PPL_Rounding_Dir_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator&(Rounding_Dir x, Rounding_Dir y) {
+ const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+ return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator|(Rounding_Dir x, Rounding_Dir y) {
+ const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+ return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+ return dir & ROUND_DIR_MASK;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_down(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_DOWN;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_up(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_UP;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_ignore(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_IGNORE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_needed(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_requested(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_IGNORE || round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_direct(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_DIRECT;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_inverse(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_INVERSE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_strict_relation(Rounding_Dir dir) {
+ return (dir & ROUND_STRICT_RELATION) == ROUND_STRICT_RELATION;
+}
+
+#if PPL_CAN_CONTROL_FPU
+
+/*! \ingroup PPL_CXX_interface */
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+ case ROUND_DOWN:
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_DOWNWARD);
+ case ROUND_IGNORE: // Fall through.
+ default:
+ PPL_UNREACHABLE;
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+ }
+}
+
+#undef PPL_FPU_DOWNWARD
+#undef PPL_FPU_TONEAREST
+#undef PPL_FPU_TOWARDZERO
+#undef PPL_FPU_UPWARD
+
+#endif
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ return ROUND_DOWN | (dir & ROUND_STRICT_RELATION);
+ case ROUND_DOWN:
+ return ROUND_UP | (dir & ROUND_STRICT_RELATION);
+ case ROUND_IGNORE:
+ return dir;
+ default:
+ PPL_UNREACHABLE;
+ return dir;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rounding_Dir_inlines_hh)
diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc
new file mode 100644
index 0000000..b1729b0
--- /dev/null
+++ b/src/Scalar_Products.cc
@@ -0,0 +1,120 @@
+/* Scalar_Products class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Coefficient_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y) {
+ x.scalar_product_assign(z, y);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Constraint& c, const Generator& g) {
+ assign(z, c.expr, g.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Generator& g, const Constraint& c) {
+ assign(z, g.expr, c.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Grid_Generator& gg, const Congruence& cg) {
+ gg.expr.scalar_product_assign(z, cg.expr, 0, gg.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Constraint& c,
+ const Grid_Generator& gg) {
+ assign(z, c.expr, gg.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Congruence& cg, const Grid_Generator& gg) {
+ // Scalar product is only defined if `cg' and `gg' are
+ // dimension-compatible.
+ PPL_ASSERT(cg.space_dimension() <= gg.space_dimension());
+ cg.expr.scalar_product_assign(z, gg.expr);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y) {
+ // The reduced scalar product is only defined
+ // if `y' has enough coefficients.
+ PPL_ASSERT(x.space_dimension() - 1 <= y.space_dimension());
+ x.scalar_product_assign(z, y, 0, x.space_dimension());
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Congruence& cg) {
+ // The reduced scalar product is only defined
+ // if `cg' has enough coefficients.
+ PPL_ASSERT(gg.space_dimension() <= cg.space_dimension());
+ gg.expr.scalar_product_assign(z, cg.expr, 0, gg.space_dimension());
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ PPL_ASSERT(x.space_dimension() <= y.space_dimension());
+ x.scalar_product_assign(z, y, 1, x.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Congruence& cg) {
+ // Scalar product is only defined if `gg' and `cg' are
+ // dimension-compatible.
+ PPL_ASSERT(gg.space_dimension() <= cg.space_dimension());
+ gg.expr.scalar_product_assign(z, cg.expr, 1, gg.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Constraint& c) {
+ // Scalar product is only defined if `gg' and `c' are
+ // dimension-compatible.
+ PPL_ASSERT(gg.space_dimension() <= c.space_dimension());
+ gg.expr.scalar_product_assign(z, c.expr, 1, gg.space_dimension() + 1);
+}
diff --git a/src/Scalar_Products_defs.hh b/src/Scalar_Products_defs.hh
new file mode 100644
index 0000000..9d39226
--- /dev/null
+++ b/src/Scalar_Products_defs.hh
@@ -0,0 +1,227 @@
+/* Scalar_Products class definition.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Scalar_Products_defs_hh
+#define PPL_Scalar_Products_defs_hh 1
+
+#include "Scalar_Products_types.hh"
+#include "Coefficient_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+ When computing the scalar product of (Linear_Expression or Constraint or
+ Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+ that the space dimension of the first object <CODE>x</CODE> is less
+ than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+ //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Linear_Expression& x, const Linear_Expression& y);
+
+ //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+ static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+
+ //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+ static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+
+ //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Constraint& c, const Grid_Generator& gg);
+
+ //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Grid_Generator& gg, const Congruence& cg);
+
+ //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Congruence& cg, const Grid_Generator& gg);
+
+ //! Returns the sign of the scalar product between \p x and \p y.
+ static int sign(const Linear_Expression& x, const Linear_Expression& y);
+
+ //! Returns the sign of the scalar product between \p c and \p g.
+ static int sign(const Constraint& c, const Generator& g);
+
+ //! Returns the sign of the scalar product between \p g and \p c.
+ static int sign(const Generator& g, const Constraint& c);
+
+ //! Returns the sign of the scalar product between \p c and \p g.
+ static int sign(const Constraint& c, const Grid_Generator& g);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p x and \p y,
+ where the \f$\epsilon\f$ coefficient of \p x is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p c and \p g,
+ where the \f$\epsilon\f$ coefficient of \p c is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p g and \p c,
+ where the \f$\epsilon\f$ coefficient of \p g is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Generator& g, const Constraint& c);
+
+ //! \brief
+ //! Computes the \e reduced scalar product of \p g and \p cg,
+ //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+ //! and assigns the result to \p z.
+ static void reduced_assign(Coefficient& z,
+ const Grid_Generator& gg, const Congruence& cg);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p x and \p y,
+ where the \f$\epsilon\f$ coefficient of \p x is ignored.
+ */
+ static int reduced_sign(const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p c and \p g,
+ where the \f$\epsilon\f$ coefficient of \p c is ignored.
+ */
+ static int reduced_sign(const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p g and \p c,
+ where the \f$\epsilon\f$ coefficient of \p g is ignored.
+ */
+ static int reduced_sign(const Generator& g, const Constraint& c);
+
+ /*! \brief
+ Computes the \e homogeneous scalar product of \p x and \p y,
+ where the inhomogeneous terms are ignored,
+ and assigns the result to \p z.
+ */
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+ /*! \brief
+ Computes the \e homogeneous scalar product of \p e and \p g,
+ where the inhomogeneous terms are ignored,
+ and assigns the result to \p z.
+ */
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p gg and \p c,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Constraint& c);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p g and \p cg,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Congruence& cg);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p e and \p g,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g);
+
+ /*! \brief
+ Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+ where the inhomogeneous terms are ignored.
+ */
+ static int homogeneous_sign(const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+ where the inhomogeneous terms are ignored.
+ */
+ static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+
+ //! \brief
+ //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+ //! where the inhomogeneous terms are ignored,
+ static int homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g);
+
+ //! \brief
+ //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+ //! where the inhomogeneous terms are ignored,
+ static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+ //! Constructs the function object according to the topology of \p c.
+ Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+
+ //! Constructs the function object according to the topology of \p g.
+ Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+ //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+ int operator()(const Constraint&, const Generator&) const;
+
+ //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+ int operator()(const Generator&, const Constraint&) const;
+
+private:
+ //! The type of the scalar product sign function pointer.
+ typedef int (* const SPS_type)(const Linear_Expression&,
+ const Linear_Expression&);
+
+ //! The scalar product sign function pointer.
+ SPS_type sps_fp;
+};
+
+// NOTE: Scalar_Products_inlines.hh is NOT included here, to avoid cyclic
+// include dependencies.
+
+#endif // !defined(PPL_Scalar_Products_defs_hh)
diff --git a/src/Scalar_Products_inlines.hh b/src/Scalar_Products_inlines.hh
new file mode 100644
index 0000000..3ab91af
--- /dev/null
+++ b/src/Scalar_Products_inlines.hh
@@ -0,0 +1,163 @@
+/* Scalar_Products class implementation (inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Scalar_Products_inlines_hh
+#define PPL_Scalar_Products_inlines_hh 1
+
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Expression& x, const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Expression& x,
+ const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ reduced_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& x,
+ const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ homogeneous_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+ return sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+ return sign(g.expr, c.expr);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ assign(z, c, g);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+ // The reduced scalar product is only defined if the topology of `c' is
+ // NNC.
+ PPL_ASSERT(!c.is_necessarily_closed());
+ return reduced_sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+ // The reduced scalar product is only defined if the topology of `g' is
+ // NNC.
+ PPL_ASSERT(!c.is_necessarily_closed());
+ return reduced_sign(g.expr, c.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g) {
+ homogeneous_assign(z, e, g.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g) {
+ homogeneous_assign(z, e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Generator& g) {
+ return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g) {
+ return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+ const Constraint& c) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ homogeneous_assign(z, g, c);
+ return sgn(z);
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+ : sps_fp(c.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+ : sps_fp(g.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+ const Generator& g) const {
+ PPL_ASSERT(c.space_dimension() <= g.space_dimension());
+ PPL_ASSERT(sps_fp == (c.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+ return sps_fp(c.expr, g.expr);
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+ const Constraint& c) const {
+ PPL_ASSERT(g.space_dimension() <= c.space_dimension());
+ PPL_ASSERT(sps_fp == (g.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+ return sps_fp(g.expr, c.expr);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_inlines_hh)
diff --git a/src/Scalar_Products_types.hh b/src/Scalar_Products_types.hh
new file mode 100644
index 0000000..4003f37
--- /dev/null
+++ b/src/Scalar_Products_types.hh
@@ -0,0 +1,24 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Scalar_Products_types_hh
+#define PPL_Scalar_Products_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_types_hh)
diff --git a/src/Slow_Copy.hh b/src/Slow_Copy.hh
new file mode 100644
index 0000000..e618f8f
--- /dev/null
+++ b/src/Slow_Copy.hh
@@ -0,0 +1,61 @@
+/* Basic Slow_Copy classes declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Slow_Copy_hh
+#define PPL_Slow_Copy_hh 1
+
+#include "meta_programming.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Slow_Copy_hh)
diff --git a/src/Sparse_Row.cc b/src/Sparse_Row.cc
new file mode 100644
index 0000000..6edee27
--- /dev/null
+++ b/src/Sparse_Row.cc
@@ -0,0 +1,1093 @@
+/* Sparse_Row class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Sparse_Row_defs.hh"
+#include "Dense_Row_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+class Sparse_Row_from_Dense_Row_helper_iterator {
+public:
+ Sparse_Row_from_Dense_Row_helper_iterator(const PPL::Dense_Row& row1,
+ PPL::dimension_type sz)
+ : row(row1), sz(sz), i(0) {
+ if (row.size() != 0 && row[0] == 0)
+ ++(*this);
+ }
+
+ Sparse_Row_from_Dense_Row_helper_iterator& operator++() {
+ PPL_ASSERT(i < sz);
+ ++i;
+ while (i < sz && row[i] == 0)
+ ++i;
+ return *this;
+ }
+
+ Sparse_Row_from_Dense_Row_helper_iterator operator++(int) {
+ Sparse_Row_from_Dense_Row_helper_iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+
+ PPL::Coefficient_traits::const_reference
+ operator*() const {
+ PPL_ASSERT(i < sz);
+ return row[i];
+ }
+
+ PPL::dimension_type
+ index() const {
+ PPL_ASSERT(i < sz);
+ return i;
+ }
+
+ bool
+ operator==(const Sparse_Row_from_Dense_Row_helper_iterator& itr) const {
+ PPL_ASSERT(&row == &(itr.row));
+ return i == itr.i;
+ }
+
+ bool
+ operator!=(const Sparse_Row_from_Dense_Row_helper_iterator& itr) const {
+ return !(*this == itr);
+ }
+
+private:
+ const PPL::Dense_Row& row;
+ PPL::dimension_type sz;
+ PPL::dimension_type i;
+};
+
+// Returns the number of nonzero elements in row.
+PPL::dimension_type
+Sparse_Row_from_Dense_Row_helper_function(const PPL::Dense_Row& row,
+ PPL::dimension_type sz) {
+ PPL::dimension_type count = 0;
+ for (PPL::dimension_type i = sz; i-- > 0; )
+ if (row[i] != 0)
+ ++count;
+ return count;
+}
+
+} // namespace
+
+PPL::Sparse_Row::Sparse_Row(const PPL::Dense_Row& row)
+ : tree(Sparse_Row_from_Dense_Row_helper_iterator(row, row.size()),
+ Sparse_Row_from_Dense_Row_helper_function(row, row.size())),
+ size_(row.size()) {
+ PPL_ASSERT(OK());
+}
+
+PPL::Sparse_Row::Sparse_Row(const Dense_Row& row, dimension_type sz,
+ dimension_type capacity)
+ : tree(Sparse_Row_from_Dense_Row_helper_iterator(row, row.size()),
+ Sparse_Row_from_Dense_Row_helper_function(row, row.size())),
+ size_(sz) {
+ (void)capacity;
+ PPL_ASSERT(OK());
+}
+
+PPL::Sparse_Row&
+PPL::Sparse_Row::operator=(const PPL::Dense_Row& row) {
+ Sparse_Row tmp(row);
+ swap(*this, tmp);
+ PPL_ASSERT(OK());
+
+ return *this;
+}
+
+void
+PPL::Sparse_Row::swap_coefficients(dimension_type i, dimension_type j) {
+ PPL_ASSERT(i < size_);
+ PPL_ASSERT(j < size_);
+
+ if (tree.empty())
+ return;
+
+ using std::swap;
+
+ iterator itr_i = tree.bisect(i);
+ iterator itr_j = tree.bisect(j);
+ if (itr_i.index() == i)
+ if (itr_j.index() == j)
+ // Both elements are in the tree.
+ swap(*itr_i, *itr_j);
+ else {
+ // i is in the tree, j is not.
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ swap(*itr_i, tmp);
+ tree.erase(itr_i);
+ // Now both iterators have been invalidated.
+ itr_j = tree.insert(j);
+ swap(*itr_j, tmp);
+ }
+ else
+ if (itr_j.index() == j) {
+ // j is in the tree, i is not.
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ swap(*itr_j, tmp);
+ // Now both iterators have been invalidated.
+ tree.erase(itr_j);
+ itr_i = tree.insert(i);
+ swap(*itr_i, tmp);
+ }
+ else {
+ // Do nothing, elements are both non-stored zeroes.
+ }
+}
+
+PPL::Sparse_Row::iterator
+PPL::Sparse_Row::reset(iterator first, iterator last) {
+ if (first == last)
+ return first;
+ PPL_ASSERT(last != end());
+ --last;
+ const dimension_type j = last.index();
+ PPL_ASSERT(first.index() <= j);
+ // We can't just compare first and last at each iteration, because last will
+ // be invalidated by the first erase.
+ while (first.index() < j)
+ first = reset(first);
+
+ first = reset(first);
+
+ PPL_ASSERT(OK());
+ return first;
+}
+
+void
+PPL::Sparse_Row::reset_after(dimension_type i) {
+ PPL_ASSERT(i < size_);
+
+ iterator itr = lower_bound(i);
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset().
+ const iterator& itr_end = end();
+
+ while (itr != itr_end)
+ itr = reset(itr);
+
+ PPL_ASSERT(OK());
+}
+
+void
+PPL::Sparse_Row::normalize() {
+ // Compute the GCD of all the coefficients.
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ const_iterator i = begin();
+ const_iterator i_end = end();
+ for ( ; i != i_end; ++i) {
+ Coefficient_traits::const_reference x_i = *i;
+ if (const int x_i_sign = sgn(x_i)) {
+ gcd = x_i;
+ if (x_i_sign < 0)
+ neg_assign(gcd);
+ goto compute_gcd;
+ }
+ }
+ // We reach this point only if all the coefficients were zero.
+ return;
+
+ compute_gcd:
+ if (gcd == 1)
+ return;
+ for (++i; i != i_end; ++i) {
+ Coefficient_traits::const_reference x_i = *i;
+ if (x_i != 0) {
+ // Note: we use the ternary version instead of a more concise
+ // gcd_assign(gcd, x_i) to take advantage of the fact that
+ // `gcd' will decrease very rapidly (see D. Knuth, The Art of
+ // Computer Programming, second edition, Section 4.5.2,
+ // Algorithm C, and the discussion following it). Our
+ // implementation of gcd_assign(x, y, z) for checked numbers is
+ // optimized for the case where `z' is smaller than `y', so that
+ // on checked numbers we gain. On the other hand, for the
+ // implementation of gcd_assign(x, y, z) on GMP's unbounded
+ // integers we cannot make any assumption, so here we draw.
+ // Overall, we win.
+ gcd_assign(gcd, x_i, gcd);
+ if (gcd == 1)
+ return;
+ }
+ }
+ // Divide the coefficients by the GCD.
+ for (iterator j = begin(), j_end = end(); j != j_end; ++j) {
+ Coefficient& x_j = *j;
+ exact_div_assign(x_j, x_j, gcd);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+namespace {
+
+class sparse_row_linear_combine_helper_iterator {
+public:
+ sparse_row_linear_combine_helper_iterator(
+ const PPL::Sparse_Row& x, const PPL::Sparse_Row& y,
+ PPL::Coefficient_traits::const_reference coeff1_1,
+ PPL::Coefficient_traits::const_reference coeff2_1)
+ : coeff1(coeff1_1), coeff2(coeff2_1) {
+ i = x.begin();
+ i_end = x.end();
+ j = y.begin();
+ j_end = y.end();
+ update_current_data();
+ }
+
+ void operator++() {
+ if (from_i)
+ ++i;
+ if (from_j)
+ ++j;
+ update_current_data();
+ }
+
+ PPL::Coefficient_traits::const_reference operator*() {
+ return current_value;
+ }
+
+ PPL::dimension_type index() {
+ return current_index;
+ }
+
+private:
+ void update_current_data() {
+ if (i == i_end) {
+ if (j == j_end) {
+ return;
+ }
+ else {
+ // i == i_end, j != j_end, so use j.
+ current_index = j.index();
+ current_value = *j;
+ current_value *= coeff2;
+ from_i = false;
+ from_j = true;
+ }
+ }
+ else {
+ if (j == j_end) {
+ // i != i_end, j == j_end, so use i.
+ current_index = i.index();
+ current_value = *i;
+ current_value *= coeff1;
+ from_i = true;
+ from_j = false;
+ }
+ else {
+ // i != i_end and j != j_end.
+ if (i.index() < j.index()) {
+ // i.index() < j.index(), so use i.
+ current_index = i.index();
+ current_value = *i;
+ current_value *= coeff1;
+ from_i = true;
+ from_j = false;
+ }
+ else {
+ if (i.index() != j.index()) {
+ PPL_ASSERT(i.index() > j.index());
+ // i.index() > j.index(), so use j.
+ current_index = j.index();
+ current_value = *j;
+ current_value *= coeff2;
+ from_i = false;
+ from_j = true;
+ }
+ else {
+ // i.index() == j.index(), so use both i and j.
+ current_index = i.index();
+ current_value = *i;
+ current_value *= coeff1;
+ PPL::add_mul_assign(current_value, *j, coeff2);
+ from_i = true;
+ from_j = true;
+ }
+ }
+ }
+ }
+ PPL_ASSERT(!from_i || i != i_end);
+ PPL_ASSERT(!from_j || j != j_end);
+ }
+
+ PPL::Coefficient_traits::const_reference coeff1;
+ PPL::Coefficient_traits::const_reference coeff2;
+ PPL::Sparse_Row::const_iterator i;
+ PPL::Sparse_Row::const_iterator i_end;
+ PPL::Sparse_Row::const_iterator j;
+ PPL::Sparse_Row::const_iterator j_end;
+ PPL::dimension_type current_index;
+ PPL::Coefficient current_value;
+ bool from_i;
+ bool from_j;
+};
+
+} // namespace
+
+void
+PPL::Sparse_Row::linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+ PPL_ASSERT(this != &y);
+
+ if (coeff1 == 1) {
+ // Optimize for this special case.
+ iterator i = end();
+ for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+ i = insert(i, j.index());
+ add_mul_assign(*i, *j, coeff2);
+ if (*i == 0)
+ i = reset(i);
+ }
+ return;
+ }
+
+ dimension_type counter = 0;
+ // Count the number of elements that are stored in y but not in *this.
+ {
+ iterator i = begin();
+ iterator i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ if (i != i_end) {
+ while (j != j_end) {
+ PPL_ASSERT(i != i_end);
+ if (i.index() == j.index()) {
+ ++i;
+ ++j;
+ if (i == i_end)
+ break;
+ }
+ else
+ if (i.index() < j.index()) {
+ i = lower_bound(i, j.index());
+ if (i == i_end)
+ break;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ ++counter;
+ ++j;
+ }
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ for ( ; j != j_end; ++j)
+ ++counter;
+ }
+ // This condition is arbitrary. Changing it affects performance but not
+ // correctness. The values have been tuned using some ppl_lpsol benchmarks
+ // on 2 October 2010.
+ if (counter == 0 || counter < (7 * size()) / 64) {
+ // Few insertions needed, do them directly.
+ iterator i = begin();
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ (*i) *= coeff1;
+ add_mul_assign(*i, *j, coeff2);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ (*i) *= coeff1;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index(), *j);
+ (*i) *= coeff2;
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ for ( ; i != i_end; ++i)
+ (*i) *= coeff1;
+ for ( ; j != j_end; ++j) {
+ i = insert(i, j.index(), *j);
+ (*i) *= coeff2;
+ }
+ }
+ else {
+ // Too many insertions needed, a full copy is probably faster than
+ // inserting all those new elements into *this.
+ CO_Tree new_tree(sparse_row_linear_combine_helper_iterator(*this, y,
+ coeff1,
+ coeff2),
+ counter + tree.size());
+ tree.m_swap(new_tree);
+
+ // Now remove stored zeroes.
+ iterator i = begin();
+ // Note that end() can not be called only once, because reset()
+ // invalidates all iterators.
+ while (i != end()) {
+ if (*i == 0) {
+#ifndef NDEBUG
+ const dimension_type old_index = i.index();
+#endif
+ i = reset(i);
+ PPL_ASSERT(find(old_index) == end());
+ }
+ else
+ ++i;
+ }
+ }
+}
+
+void
+PPL::Sparse_Row::linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2,
+ dimension_type start, dimension_type end) {
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+ PPL_ASSERT(this != &y);
+
+ if (coeff1 == 1) {
+ if (coeff2 == 1) {
+ // Optimized implementation for coeff1==1, coeff2==1.
+ iterator i = this->end();
+ for (const_iterator j = y.lower_bound(start),
+ j_end = y.lower_bound(end); j != j_end; ++j) {
+ i = insert(i, j.index());
+ *i += *j;
+ if (*i == 0)
+ i = reset(i);
+ }
+ return;
+ }
+ if (coeff2 == -1) {
+ // Optimized implementation for coeff1==1, coeff2==-1.
+ iterator i = this->end();
+ for (const_iterator j = y.lower_bound(start),
+ j_end = y.lower_bound(end); j != j_end; ++j) {
+ i = insert(i, j.index());
+ *i -= *j;
+ if (*i == 0)
+ i = reset(i);
+ }
+ return;
+ }
+ // Optimized implementation for coeff1==1.
+ iterator i = this->end();
+ for (const_iterator j = y.lower_bound(start),
+ j_end = y.lower_bound(end); j != j_end; ++j) {
+ i = insert(i, j.index());
+ add_mul_assign(*i, *j, coeff2);
+ if (*i == 0)
+ i = reset(i);
+ }
+ return;
+ }
+
+ if (coeff2 == 1) {
+ // Optimized implementation for coeff2==1.
+ iterator i = lower_bound(start);
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = this->end();
+ const_iterator j = y.lower_bound(start);
+ const_iterator j_end = y.lower_bound(end);
+ while (i != i_end && i.index() < end && j != j_end) {
+ if (i.index() == j.index()) {
+ (*i) *= coeff1;
+ *i += *j;
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ (*i) *= coeff1;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index(), *j);
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ for ( ; i != i_end && i.index() < end; ++i)
+ (*i) *= coeff1;
+ for ( ; j != j_end; ++j)
+ i = insert(i, j.index(), *j);
+ return;
+ }
+
+ if (coeff2 == -1) {
+ // Optimized implementation for coeff2==-1.
+ iterator i = lower_bound(start);
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = this->end();
+ const_iterator j = y.lower_bound(start);
+ const_iterator j_end = y.lower_bound(end);
+ while (i != i_end && i.index() < end && j != j_end) {
+ if (i.index() == j.index()) {
+ (*i) *= coeff1;
+ *i -= *j;
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ (*i) *= coeff1;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index(), *j);
+ neg_assign(*i);
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ for ( ; i != i_end && i.index() < end; ++i)
+ (*i) *= coeff1;
+ for ( ; j != j_end; ++j) {
+ i = insert(i, j.index(), *j);
+ neg_assign(*i);
+ }
+ return;
+ }
+
+ iterator i = lower_bound(start);
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = this->end();
+ const_iterator j = y.lower_bound(start);
+ const_iterator j_end = y.lower_bound(end);
+ while (i != i_end && i.index() < end && j != j_end) {
+ if (i.index() == j.index()) {
+ (*i) *= coeff1;
+ add_mul_assign(*i, *j, coeff2);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ (*i) *= coeff1;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index(), *j);
+ (*i) *= coeff2;
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ for ( ; i != i_end && i.index() < end; ++i)
+ (*i) *= coeff1;
+ for ( ; j != j_end; ++j) {
+ i = insert(i, j.index(), *j);
+ (*i) *= coeff2;
+ }
+}
+
+void
+PPL::Sparse_Row::ascii_dump(std::ostream& s) const {
+ s << "size " << size_ << ' ';
+ dimension_type n_elements = 0;
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ ++n_elements;
+ s << "elements " << n_elements << ' ';
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ s << "[ " << i.index() << " ]= " << *i << ' ';
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Sparse_Row)
+
+bool
+PPL::Sparse_Row::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "size")
+ return false;
+ if (!(s >> size_))
+ return false;
+ clear();
+
+ if (!(s >> str) || str != "elements")
+ return false;
+
+ dimension_type n_elements;
+ if (!(s >> n_elements))
+ return false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(current_data);
+ for (dimension_type i = 0; i < n_elements; ++i) {
+ dimension_type current_key;
+ if (!(s >> str) || str != "[")
+ return false;
+ if (!(s >> current_key))
+ return false;
+ if (!(s >> str) || str != "]=")
+ return false;
+ if (!(s >> current_data))
+ return false;
+ tree.insert(current_key, current_data);
+ }
+ PPL_ASSERT(OK());
+ return true;
+}
+
+bool
+PPL::Sparse_Row::OK() const {
+ if (begin() == end())
+ return true;
+ const_iterator last = end();
+ --last;
+ return (last.index() < size_);
+}
+
+bool
+PPL::Sparse_Row::OK(dimension_type /* capacity */) const {
+ return OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Sparse_Row */
+bool
+PPL::operator==(const Sparse_Row& x, const Sparse_Row& y) {
+ if (x.size() != y.size())
+ return false;
+ Sparse_Row::const_iterator i = x.begin();
+ Sparse_Row::const_iterator i_end = x.end();
+ Sparse_Row::const_iterator j = y.begin();
+ Sparse_Row::const_iterator j_end = y.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ if (*i != *j)
+ return false;
+ ++i;
+ ++j;
+ }
+ else {
+ if (i.index() < j.index()) {
+ if (*i != 0)
+ return false;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ if (*j != 0)
+ return false;
+ ++j;
+ }
+ }
+ }
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ return false;
+ for ( ; j != j_end; ++j)
+ if (*j != 0)
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Sparse_Row */
+bool
+PPL::operator!=(const Sparse_Row& x, const Sparse_Row& y) {
+ return !(x == y);
+}
+
+bool
+PPL::operator==(const Dense_Row& x, const Sparse_Row& y) {
+ if (x.size() != y.size())
+ return false;
+ Sparse_Row::const_iterator itr = y.end();
+ for (dimension_type i = 0; i < x.size(); ++i) {
+ itr = y.lower_bound(itr, i);
+ if (itr != y.end() && itr.index() == i) {
+ if (x[i] != *itr)
+ return false;
+ }
+ else {
+ if (x[i] != 0)
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+PPL::operator!=(const Dense_Row& x, const Sparse_Row& y) {
+ return !(x == y);
+}
+
+bool
+PPL::operator==(const Sparse_Row& x, const Dense_Row& y) {
+ return y == x;
+}
+
+bool
+PPL::operator!=(const Sparse_Row& x, const Dense_Row& y) {
+ return !(x == y);
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ PPL_ASSERT(x.size() >= y.size());
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+
+ Sparse_Row::iterator itr = x.end();
+
+ for (dimension_type i = 0; i < y.size(); ++i) {
+ itr = x.lower_bound(itr, i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ (*itr) *= coeff2;
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) *= coeff1;
+ add_mul_assign(*itr, y[i], coeff2);
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2,
+ dimension_type start, dimension_type end) {
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.size());
+ PPL_ASSERT(end <= y.size());
+
+ Sparse_Row::iterator itr = x.lower_bound(start);
+
+ if (coeff1 == 1) {
+ if (coeff2 == 1) {
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) += y[i];
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+ return;
+ }
+ if (coeff2 == -1) {
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ neg_assign(*itr);
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) -= y[i];
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+ return;
+ }
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ (*itr) *= coeff2;
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ add_mul_assign(*itr, y[i], coeff2);
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+ return;
+ }
+
+ if (coeff2 == 1) {
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) *= coeff1;
+ (*itr) += y[i];
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+ return;
+ }
+ if (coeff2 == -1) {
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ neg_assign(*itr);
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) *= coeff1;
+ (*itr) -= y[i];
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+ return;
+ }
+
+ for (dimension_type i = start; i < end; ++i) {
+ PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+ if (itr != x.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == x.end() || itr.index() >= i);
+ if (itr == x.end() || itr.index() != i) {
+ if (y[i] == 0)
+ continue;
+ itr = x.insert(itr, i, y[i]);
+ (*itr) *= coeff2;
+ PPL_ASSERT((*itr) != 0);
+ }
+ else {
+ PPL_ASSERT(itr.index() == i);
+ (*itr) *= coeff1;
+ add_mul_assign(*itr, y[i], coeff2);
+ if (*itr == 0)
+ itr = x.reset(itr);
+ }
+ }
+}
+
+void
+PPL::linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ PPL_ASSERT(x.size() >= y.size());
+ if (coeff1 == 1) {
+ for (Sparse_Row::const_iterator i = y.begin(),
+ i_end = y.end(); i != i_end; ++i)
+ add_mul_assign(x[i.index()], *i, coeff2);
+ return;
+ }
+
+ Sparse_Row::const_iterator itr = y.end();
+
+ for (dimension_type i = 0; i < x.size(); ++i) {
+ x[i] *= coeff1;
+
+ itr = y.lower_bound(itr, i);
+
+ if (itr == y.end() || itr.index() != i)
+ continue;
+
+ add_mul_assign(x[i], *itr, coeff2);
+ }
+}
+
+void
+PPL::linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2,
+ dimension_type start, dimension_type end) {
+ PPL_ASSERT(x.size() >= y.size());
+ PPL_ASSERT(coeff1 != 0);
+ PPL_ASSERT(coeff2 != 0);
+
+ Sparse_Row::const_iterator itr = y.lower_bound(start);
+
+ if (coeff1 == 1) {
+ Sparse_Row::const_iterator itr_end = y.lower_bound(end);
+ if (coeff2 == 1) {
+ for ( ; itr != itr_end; ++itr)
+ x[itr.index()] += *itr;
+ return;
+ }
+ if (coeff2 == -1) {
+ for ( ; itr != itr_end; ++itr)
+ x[itr.index()] -= *itr;
+ return;
+ }
+ for ( ; itr != itr_end; ++itr)
+ add_mul_assign(x[itr.index()], *itr, coeff2);
+ return;
+ }
+
+ if (coeff2 == 1) {
+ for (dimension_type i = start; i < end; ++i) {
+ x[i] *= coeff1;
+
+ PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+ if (itr != y.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+ if (itr == y.end() || itr.index() != i)
+ continue;
+
+ x[i] += *itr;
+ }
+ return;
+ }
+ if (coeff2 == -1) {
+ for (dimension_type i = start; i < end; ++i) {
+ x[i] *= coeff1;
+
+ PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+ if (itr != y.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+ if (itr == y.end() || itr.index() != i)
+ continue;
+
+ x[i] -= *itr;
+ }
+ return;
+ }
+
+ for (dimension_type i = start; i < end; ++i) {
+ x[i] *= coeff1;
+
+ PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+ if (itr != y.end() && itr.index() < i)
+ ++itr;
+ PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+ if (itr == y.end() || itr.index() != i)
+ continue;
+
+ add_mul_assign(x[i], *itr, coeff2);
+ }
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ x.linear_combine(y, coeff1, coeff2);
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ x.linear_combine(y, c1, c2, start, end);
+}
+
+void
+PPL::swap(Sparse_Row& x, Dense_Row& y) {
+ Dense_Row new_dense(x.size(), x.size());
+
+ for (Sparse_Row::iterator i = x.begin(), i_end = x.end(); i != i_end; ++i)
+ swap(new_dense[i.index()], *i);
+
+ // NOTE: This copies the coefficients, but it could steal them.
+ // Implementing a stealing-based algorithm takes a lot of time and it's
+ // probably not worth it.
+ Sparse_Row new_sparse(y);
+
+ swap(new_dense, y);
+ swap(new_sparse, x);
+}
+
+void
+PPL::swap(Dense_Row& x, Sparse_Row& y) {
+ swap(y, x);
+}
diff --git a/src/Sparse_Row_defs.hh b/src/Sparse_Row_defs.hh
new file mode 100644
index 0000000..a8ee19a
--- /dev/null
+++ b/src/Sparse_Row_defs.hh
@@ -0,0 +1,930 @@
+/* Sparse_Row class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_defs_hh
+#define PPL_Sparse_Row_defs_hh 1
+
+#include "Sparse_Row_types.hh"
+
+#include "CO_Tree_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Dense_Row_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sparse sequence of coefficients.
+/*! \ingroup PPL_CXX_interface
+ This class is implemented using a CO_Tree. See the documentation of CO_Tree
+ for details on the implementation and the performance.
+
+ This class is a drop-in replacement of Dense_Row, meaning that code
+ using Dense_Row can be ported to Sparse_Row changing only the type.
+ The resulting code will work, but probably needs more CPU and memory (it
+ does not exploit the sparse representation yet).
+
+ To take advantage of the sparse representation, the client code must then be
+ modified to use methods which can have a faster implementation on sparse
+ data structures.
+
+ The main changes are the replacement of calls to operator[] with calls to
+ find(), lower_bound() or insert(), using hint iterators when possible.
+ Sequential scanning of rows should probably be implemented using iterators
+ rather than indexes, to improve performance.
+ reset() should be called to zero elements.
+
+ \see Sparse_Matrix
+ \see CO_Tree
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Sparse_Row {
+
+public:
+
+ //! An %iterator on the row elements
+ /*!
+ This %iterator skips non-stored zeroes.
+ \see CO_Tree::iterator
+ */
+ typedef CO_Tree::iterator iterator;
+
+ //! A const %iterator on the row elements
+ /*!
+ This %iterator skips non-stored zeroes.
+ \see CO_Tree::const_iterator
+ */
+ typedef CO_Tree::const_iterator const_iterator;
+
+ //! Constructs a row with the specified size.
+ /*!
+ \param n
+ The size for the new row.
+
+ The row will contain only non-stored zeroes.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit Sparse_Row(dimension_type n = 0);
+
+ //! Constructs a row with the specified size.
+ /*!
+ \param n
+ The size for the new row.
+
+ \param capacity
+ It is ignored. This parameter is needed for compatibility with Dense_Row.
+
+ The row will contain only non-stored zeroes.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ Sparse_Row(dimension_type n, dimension_type capacity);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Sparse_Row(const Sparse_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Constructor from a Dense_Row.
+ /*!
+ \param row
+ The row that will be copied into *this.
+
+ This constructor takes \f$O(n)\f$ time. Note that constructing of a row of
+ zeroes and then inserting n elements costs \f$O(n*\log^2 n)\f$ time.
+ */
+ explicit Sparse_Row(const Dense_Row& row);
+
+ //! Copy constructor from a Dense_Row with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Sparse_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+ Sparse_Row& operator=(const Dense_Row& row);
+
+ //! Swaps *this and x.
+ /*!
+ \param x
+ The row that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(Sparse_Row& x);
+
+ //! Returns the size of the row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type size() const;
+
+ //! Returns the number of elements explicitly stored in the row.
+ /*!
+ This is equivalent to std::distance(begin(), end()), but it's much faster.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_stored_elements() const;
+
+ //! Resizes the row to the specified size.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time when shrinking the
+ row and removing the trailing k elements.
+ It takes \f$O(1)\f$ time when enlarging the row.
+ */
+ void resize(dimension_type n);
+
+ //! Resizes the row to size \p n.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method, with this signature, is needed for compatibility with
+ Dense_Row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void expand_within_capacity(dimension_type n);
+
+ //! Resizes the row to size \p n.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method, with this signature, is needed for compatibility with
+ Dense_Row.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time where k is the number
+ of removed elements.
+ */
+ void shrink(dimension_type n);
+
+ /*!
+ \brief Deletes the i-th element from the row, shifting the next elements
+ to the left.
+
+ \param i
+ The index of the element that will be deleted.
+
+ The size of the row is decreased by 1.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k+\log^2 n)\f$ amortized time, where k is the
+ number of elements with index greater than i.
+ */
+ void delete_element_and_shift(dimension_type i);
+
+ //! Adds \p n zeroes before index \p i.
+ /*!
+ \param n
+ The number of non-stored zeroes that will be added to the row.
+
+ \param i
+ The index of the element before which the zeroes will be added.
+
+ Existing elements with index greater than or equal to \p i are shifted to
+ the right by \p n positions. The size is increased by \p n.
+
+ Existing iterators are not invalidated, but are shifted to the right
+ by \p n if they pointed at or after index \p i (i.e., they point to
+ the same, possibly shifted, values as before).
+
+ This method takes \f$O(k + \log m)\f$ expected time, where \f$k\f$ is
+ the number of elements with index greater than or equal to \p i and
+ \f$m\f$ the number of stored elements.
+ */
+ void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+ //! Returns an %iterator that points at the first stored element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an %iterator that points after the last stored element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is kept valid.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const iterator& end();
+
+ //! Equivalent to <CODE>cbegin()</CODE>.
+ const_iterator begin() const;
+
+ //! Equivalent to <CODE>cend()</CODE>.
+ const const_iterator& end() const;
+
+ //! Returns an %iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator cbegin() const;
+
+ //! Returns an %iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const const_iterator& cend() const;
+
+ //! Returns the size() of the largest possible Sparse_Row.
+ static dimension_type max_size();
+
+ //! Resets all the elements of this row.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ void clear();
+
+ //! Gets a reference to the i-th element.
+ /*!
+ \param i
+ The index of the desired element.
+
+ For read-only access it's better to use get(), that avoids allocating
+ space for zeroes.
+
+ If possible, use the insert(), find() or lower_bound() methods with
+ a hint instead of this, to improve performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ amortized time when there is already an
+ element with index \p i, and \f$O(\log^2 n)\f$ otherwise.
+ */
+ Coefficient& operator[](dimension_type i);
+
+ //! Equivalent to <CODE>get(i)</CODE>, provided for convenience.
+ /*!
+ This method takes \f$O(\log n)\f$ time.
+ */
+ Coefficient_traits::const_reference operator[](dimension_type i) const;
+
+ //! Gets the i-th element in the sequence.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the insert(), find() or lower_bound() methods with
+ a hint instead of this, to improve performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator find(dimension_type i);
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ iterator find(iterator itr, dimension_type i);
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator find(dimension_type i) const;
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ const_iterator find(const_iterator itr, dimension_type i) const;
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator lower_bound(dimension_type i);
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ iterator lower_bound(iterator itr, dimension_type i);
+
+ //! Lower bound of index i.
+ /*!
+
+ \param i
+ The index of the desired element.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator lower_bound(dimension_type i) const;
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+ //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param x
+ The value that will be associated to the element.
+
+ If possible, use versions of this method that take a hint, to improve
+ performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+ //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param x
+ The value that will be associated to the element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr, even faster than <CODE>(*this)[i] = x</CODE>.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+ between \p itr and the searched position is \f$O(1)\f$ and the row already
+ contains an element with this index, this method takes \f$O(1)\f$ time.
+ */
+ iterator insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x);
+
+ //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use versions of this method that take a hint, to improve
+ performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator insert(dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr, even faster than <CODE>(*this)[i]</CODE>.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+ between \p itr and the searched position is \f$O(1)\f$ and the row already
+ contains an element with this index, this method takes \f$O(1)\f$ time.
+ */
+ iterator insert(iterator itr, dimension_type i);
+
+ //! Swaps the i-th element with the j-th element.
+ /*!
+ \param i
+ The index of an element.
+
+ \param j
+ The index of another element.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ void swap_coefficients(dimension_type i, dimension_type j);
+
+ //! Equivalent to swap(i,itr.index()), but it assumes that
+ //! lower_bound(i)==itr.
+ /*!
+ Iterators that pointed to the itr.index()-th element remain valid
+ but now point to the i-th element. Other iterators are unaffected.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void fast_swap(dimension_type i, iterator itr);
+
+ //! Swaps the element pointed to by i with the element pointed to by j.
+ /*!
+ \param i
+ An %iterator pointing to an element.
+
+ \param j
+ An %iterator pointing to another element.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void swap_coefficients(iterator i, iterator j);
+
+ //! Resets to zero the value pointed to by i.
+ /*!
+ \param i
+ An %iterator pointing to the element that will be reset (not stored
+ anymore).
+
+ By calling this method instead of getting a reference to the value and
+ setting it to zero, the element will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator reset(iterator i);
+
+ //! Resets to zero the values in the range [first,last).
+ /*!
+ \param first
+ An %iterator pointing to the first element to reset.
+
+ \param last
+ An %iterator pointing after the last element to reset.
+
+ By calling this method instead of getting a reference to the values and
+ setting them to zero, the elements will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+ number of elements in [first,last).
+ */
+ iterator reset(iterator first, iterator last);
+
+ //! Resets to zero the i-th element.
+ /*!
+ \param i
+ The index of the element to reset.
+
+ By calling this method instead of getting a reference to the value and
+ setting it to zero, the element will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ void reset(dimension_type i);
+
+ //! Resets to zero the elements with index greater than or equal to i.
+ /*!
+ \param i
+ The index of the first element to reset.
+
+ By calling this method instead of getting a reference to the values and
+ setting them to zero, the elements will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+ number of elements with index greater than or equal to i.
+ */
+ void reset_after(dimension_type i);
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of the row
+ and normalizes them by the GCD itself.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void normalize();
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_second
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_first(const Sparse_Row& y,
+ const Func1& f, const Func2& g);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, 0) must do nothing, for every c1.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_second(const Sparse_Row& y,
+ const Func1& g, const Func2& h);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ */
+ template <typename Func1, typename Func2, typename Func3>
+ void combine(const Sparse_Row& y,
+ const Func1& f, const Func2& g, const Func3& h);
+
+ //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+ //! each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param coeff1
+ The coefficient used for elements of *this.
+ This must not be 0.
+
+ \param coeff2
+ The coefficient used for elements of y.
+ This must not be 0.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary.
+ This method can be implemented in user code, too. It is provided for
+ convenience only.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ \see combine
+ */
+ void linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ /*!
+ This method, unlike the other linear_combine() method, detects when
+ coeff1==1 and/or coeff2==1 or coeff2==-1 in order to save some work.
+ */
+ void linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! Loads the row from an ASCII representation generated using ascii_dump().
+ /*!
+ \param s
+ The stream from which the ASCII representation will be loaded.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ This method takes \f$O(n)\f$ time.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ This method takes \f$O(n)\f$ time.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks the invariant.
+ bool OK() const;
+
+ //! Checks the invariant.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ bool OK(dimension_type capacity) const;
+
+private:
+ //! The tree used to store the elements.
+ CO_Tree tree;
+
+ //! The size of the row.
+ /*!
+ The elements contained in this row have indexes that are less than size_.
+ */
+ dimension_type size_;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+ Parma_Polyhedra_Library::Sparse_Row& y);
+
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+ Parma_Polyhedra_Library::Dense_Row& y);
+
+void swap(Parma_Polyhedra_Library::Dense_Row& x,
+ Parma_Polyhedra_Library::Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Sparse_Row& x, const Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Sparse_Row& x, const Sparse_Row& y);
+
+bool operator==(const Dense_Row& x, const Sparse_Row& y);
+bool operator!=(const Dense_Row& x, const Sparse_Row& y);
+
+bool operator==(const Sparse_Row& x, const Dense_Row& y);
+bool operator!=(const Sparse_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Sparse_Row_inlines.hh"
+#include "Sparse_Row_templates.hh"
+
+#endif // !defined(PPL_Sparse_Row_defs_hh)
diff --git a/src/Sparse_Row_inlines.hh b/src/Sparse_Row_inlines.hh
new file mode 100644
index 0000000..1d4ba74
--- /dev/null
+++ b/src/Sparse_Row_inlines.hh
@@ -0,0 +1,378 @@
+/* Sparse_Row class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_inlines_hh
+#define PPL_Sparse_Row_inlines_hh 1
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n)
+ : size_(n) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n, dimension_type)
+ : size_(n) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type)
+ : tree(y.tree), size_(y.size_) {
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type)
+ : tree(y.begin(),
+ std::distance(y.begin(), y.lower_bound(std::min(y.size(), sz)))),
+ size_(sz) {
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::m_swap(Sparse_Row& x) {
+ using std::swap;
+ swap(tree, x.tree);
+ swap(size_, x.size_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(x.OK());
+}
+
+inline dimension_type
+Sparse_Row::size() const {
+ return size_;
+}
+
+inline dimension_type
+Sparse_Row::num_stored_elements() const {
+ return tree.size();
+}
+
+inline void
+Sparse_Row::resize(dimension_type n) {
+ if (n < size_)
+ reset_after(n);
+ size_ = n;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::shrink(dimension_type n) {
+ PPL_ASSERT(size() >= n);
+ resize(n);
+}
+
+inline void
+Sparse_Row::expand_within_capacity(dimension_type n) {
+ PPL_ASSERT(size() <= n);
+ resize(n);
+}
+
+inline void
+Sparse_Row::delete_element_and_shift(dimension_type i) {
+ PPL_ASSERT(i < size_);
+ tree.erase_element_and_shift_left(i);
+ --size_;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+ PPL_ASSERT(i <= size_);
+ tree.increase_keys_from(i, n);
+ size_ += n;
+ PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::begin() {
+ return tree.begin();
+}
+
+inline const Sparse_Row::iterator&
+Sparse_Row::end() {
+ return tree.end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::begin() const {
+ return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::end() const {
+ return tree.cend();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::cbegin() const {
+ return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::cend() const {
+ return tree.cend();
+}
+
+inline dimension_type
+Sparse_Row::max_size() {
+ return CO_Tree::max_size();
+}
+
+inline void
+Sparse_Row::clear() {
+ tree.clear();
+}
+
+inline Coefficient&
+Sparse_Row::operator[](dimension_type i) {
+ PPL_ASSERT(i < size_);
+ iterator itr = insert(i);
+ return *itr;
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::operator[](dimension_type i) const {
+ return get(i);
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::get(dimension_type i) const {
+ PPL_ASSERT(i < size_);
+ if (tree.empty())
+ return Coefficient_zero();
+ const_iterator itr = find(i);
+ if (itr != end())
+ return *itr;
+ else
+ return Coefficient_zero();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ iterator itr = tree.bisect(i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(iterator hint, dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ iterator itr = tree.bisect_near(hint, i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(dimension_type i) const {
+ PPL_ASSERT(i < size());
+
+ const_iterator itr = tree.bisect(i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(const_iterator hint, dimension_type i) const {
+ PPL_ASSERT(i < size());
+
+ const_iterator itr = tree.bisect_near(hint, i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(dimension_type i) {
+ PPL_ASSERT(i <= size());
+
+ iterator itr = tree.bisect(i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(iterator hint, dimension_type i) {
+ PPL_ASSERT(i <= size());
+
+ iterator itr = tree.bisect_near(hint, i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(dimension_type i) const {
+ PPL_ASSERT(i <= size());
+
+ const_iterator itr = tree.bisect(i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(const_iterator hint, dimension_type i) const {
+ PPL_ASSERT(i <= size());
+
+ const_iterator itr = tree.bisect_near(hint, i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i, Coefficient_traits::const_reference x) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(itr, i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(i);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(itr, i);
+}
+
+inline void
+Sparse_Row::swap_coefficients(iterator i, iterator j) {
+ PPL_ASSERT(i != end());
+ PPL_ASSERT(j != end());
+ using std::swap;
+ swap(*i, *j);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::fast_swap(dimension_type i, iterator itr) {
+ PPL_ASSERT(lower_bound(i) == itr);
+ PPL_ASSERT(itr != end());
+ tree.fast_shift(i, itr);
+ PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::reset(iterator i) {
+ iterator res = tree.erase(i);
+ PPL_ASSERT(OK());
+ return res;
+}
+
+inline void
+Sparse_Row::reset(dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ tree.erase(i);
+ PPL_ASSERT(OK());
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes() const {
+ return tree.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+ return external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes(dimension_type /* capacity */) const {
+ return total_memory_in_bytes();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline void
+swap(Sparse_Row& x, Sparse_Row& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_inlines_hh)
diff --git a/src/Sparse_Row_templates.hh b/src/Sparse_Row_templates.hh
new file mode 100644
index 0000000..c703a3e
--- /dev/null
+++ b/src/Sparse_Row_templates.hh
@@ -0,0 +1,153 @@
+/* Sparse_Row class implementation: non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_templates_hh
+#define PPL_Sparse_Row_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_first(const Sparse_Row& y,
+ const Func1& f, const Func2& g) {
+ if (this == &y) {
+ for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+ g(*i, *i);
+ }
+ else {
+ iterator i = begin();
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset().
+ const iterator& i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ while (i != i_end && j != j_end)
+ if (i.index() == j.index()) {
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ else
+ j = y.lower_bound(j, i.index());
+ while (i != i_end) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ }
+}
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_second(const Sparse_Row& y,
+ const Func1& g,
+ const Func2& /* h */) {
+ iterator i = begin();
+ for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+ i = insert(i, j.index());
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ }
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Sparse_Row::combine(const Sparse_Row& y, const Func1& f,
+ const Func2& g, const Func3& h) {
+ if (this == &y) {
+ for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+ g(*i, *i);
+ }
+ else {
+ iterator i = begin();
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index());
+ h(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ while (i != i_end) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ while (j != j_end) {
+ i = insert(i, j.index());
+ h(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ ++j;
+ }
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_templates_hh)
diff --git a/src/Sparse_Row_types.hh b/src/Sparse_Row_types.hh
new file mode 100644
index 0000000..e8b60f9
--- /dev/null
+++ b/src/Sparse_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Sparse_Row_types_hh
+#define PPL_Sparse_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Sparse_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_types_hh)
diff --git a/src/Sum_Floating_Point_Expression_defs.hh b/src/Sum_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..5d4e02e
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_defs.hh
@@ -0,0 +1,213 @@
+/* Declarations for the Sum_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_defs_hh
+#define PPL_Sum_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Sum_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Sum Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of sum floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the sum floating point expression
+ corresponding to \p x \f$\oplus\f$ \p y.
+ */
+ Sum_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Sum_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Sum_Floating_Point_Expression(
+ const Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Sum_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Sum_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Sum_Floating_Point_Expression_inlines.hh"
+#include "Sum_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_defs_hh)
diff --git a/src/Sum_Floating_Point_Expression_inlines.hh b/src/Sum_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..8b91262
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,70 @@
+/* Sum_Floating_Point_Expression class implementation: inline
+ functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_inlines_hh
+#define PPL_Sum_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Sum_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y) {
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Sum_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_inlines_hh)
diff --git a/src/Sum_Floating_Point_Expression_templates.hh b/src/Sum_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..e1d4a62
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_templates.hh
@@ -0,0 +1,53 @@
+/* Sum_Floating_Point_Expression class implementation:
+ non-inline template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_templates_hh
+#define PPL_Sum_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ result += linearized_second_operand;
+ relative_error(linearized_second_operand, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_templates_hh)
diff --git a/src/Sum_Floating_Point_Expression_types.hh b/src/Sum_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..4597db7
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Sum_Floating_Point_Expression_types_hh
+#define PPL_Sum_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_types_hh)
diff --git a/src/Swapping_Vector_defs.hh b/src/Swapping_Vector_defs.hh
new file mode 100644
index 0000000..870ac65
--- /dev/null
+++ b/src/Swapping_Vector_defs.hh
@@ -0,0 +1,98 @@
+/* Swapping_Vector class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Swapping_Vector_defs_hh
+#define PPL_Swapping_Vector_defs_hh 1
+
+#include "Swapping_Vector_types.hh"
+#include "globals_defs.hh"
+
+#include <vector>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A wrapper for std::vector that calls a swap() method instead of copying
+//! elements, when possible.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Swapping_Vector {
+
+public:
+ typedef typename std::vector<T>::const_iterator const_iterator;
+ typedef typename std::vector<T>::iterator iterator;
+ typedef typename std::vector<T>::size_type size_type;
+
+ Swapping_Vector();
+ explicit Swapping_Vector(dimension_type new_size);
+ Swapping_Vector(dimension_type new_size, const T& x);
+
+ void clear();
+ void reserve(dimension_type new_capacity);
+ void resize(dimension_type new_size);
+ void resize(dimension_type new_size, const T& x);
+
+ dimension_type size() const;
+ dimension_type capacity() const;
+ bool empty() const;
+
+ void m_swap(Swapping_Vector& v);
+
+ T& operator[](dimension_type i);
+ const T& operator[](dimension_type i) const;
+
+ T& back();
+ const T& back() const;
+
+ void push_back(const T& x);
+ void pop_back();
+
+ iterator begin();
+ iterator end();
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ iterator erase(iterator itr);
+ iterator erase(iterator first, iterator last);
+
+ // This is defined only if T has an external_memory_in_bytes() method.
+ memory_size_type external_memory_in_bytes() const;
+
+ dimension_type max_num_rows();
+
+private:
+ std::vector<T> impl;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Swapping_Vector */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Swapping_Vector<T>& x, Swapping_Vector<T>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Swapping_Vector_inlines.hh"
+
+#endif // !defined(PPL_Swapping_Vector_defs_hh)
diff --git a/src/Swapping_Vector_inlines.hh b/src/Swapping_Vector_inlines.hh
new file mode 100644
index 0000000..8754102
--- /dev/null
+++ b/src/Swapping_Vector_inlines.hh
@@ -0,0 +1,234 @@
+/* Swapping_Vector class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Swapping_Vector_inlines_hh
+#define PPL_Swapping_Vector_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector()
+ : impl() {
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type i)
+ : impl() {
+ // NOTE: This is not the same as constructing impl as `impl(i)', because
+ // this implementation calls compute_capacity().
+ resize(i);
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type new_size, const T& x)
+ : impl() {
+ resize(new_size, x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::clear() {
+ impl.clear();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::reserve(dimension_type new_capacity) {
+ if (impl.capacity() < new_capacity) {
+ // Reallocation will take place.
+ std::vector<T> new_impl;
+
+ new_impl.reserve(compute_capacity(new_capacity, max_num_rows()));
+ new_impl.resize(impl.size());
+
+ using std::swap;
+
+ // Steal the old elements.
+ for (dimension_type i = impl.size(); i-- > 0; )
+ swap(new_impl[i], impl[i]);
+
+ // Put the new vector into place.
+ swap(impl, new_impl);
+ }
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size) {
+ reserve(new_size);
+ impl.resize(new_size);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size, const T& x) {
+ reserve(new_size);
+ impl.resize(new_size, x);
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::size() const {
+ return impl.size();
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::capacity() const {
+ return impl.capacity();
+}
+
+template <typename T>
+inline bool
+Swapping_Vector<T>::empty() const {
+ return impl.empty();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::m_swap(Swapping_Vector& v) {
+ using std::swap;
+ swap(impl, v.impl);
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::operator[](dimension_type i) {
+ return impl[i];
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::operator[](dimension_type i) const {
+ return impl[i];
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::back() {
+ return impl.back();
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::back() const {
+ return impl.back();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::push_back(const T& x) {
+ reserve(size() + 1);
+ impl.push_back(x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::pop_back() {
+ impl.pop_back();
+}
+
+template <typename T>
+inline memory_size_type
+Swapping_Vector<T>::external_memory_in_bytes() const {
+ // Estimate the size of vector.
+ memory_size_type n = impl.capacity() * sizeof(T);
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ n += i->external_memory_in_bytes();
+ return n;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::begin() {
+ return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::end() {
+ return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::begin() const {
+ return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::end() const {
+ return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator itr) {
+ PPL_ASSERT(itr >= begin());
+ PPL_ASSERT(itr < end());
+ const dimension_type old_i = itr - begin();
+ dimension_type i = old_i;
+ ++i;
+ while (i != size())
+ swap(impl[i-1], impl[i]);
+ impl.pop_back();
+ return begin() + old_i;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator first, iterator last) {
+ PPL_ASSERT(begin() <= first);
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= end());
+ const iterator old_first = first;
+ typedef typename std::iterator_traits<iterator>::difference_type diff_t;
+ const diff_t k = last - first;
+ const dimension_type n = static_cast<dimension_type>(end() - last);
+ using std::swap;
+ for (dimension_type i = 0; i < n; ++i, ++first)
+ swap(*first, *(first + k));
+ impl.erase(end() - k, end());
+ return old_first;
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::max_num_rows() {
+ return impl.max_size();
+}
+
+template <typename T>
+inline void
+swap(Swapping_Vector<T>& vec1, Swapping_Vector<T>& vec2) {
+ vec1.m_swap(vec2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#endif // !defined(PPL_Swapping_Vector_inlines_hh)
diff --git a/src/Swapping_Vector_types.hh b/src/Swapping_Vector_types.hh
new file mode 100644
index 0000000..98a587e
--- /dev/null
+++ b/src/Swapping_Vector_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Swapping_Vector_types_hh
+#define PPL_Swapping_Vector_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Swapping_Vector;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Swapping_Vector_types_hh)
diff --git a/src/Temp_defs.hh b/src/Temp_defs.hh
new file mode 100644
index 0000000..fbffd7f
--- /dev/null
+++ b/src/Temp_defs.hh
@@ -0,0 +1,143 @@
+/* Temp_* classes declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_defs_hh
+#define PPL_Temp_defs_hh 1
+
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+ //! Obtains a reference to a temporary item.
+ static Temp_Item& obtain();
+
+ //! Releases the temporary item \p p.
+ static void release(Temp_Item& p);
+
+ //! Returns a reference to the encapsulated item.
+ T& item();
+
+private:
+ //! The encapsulated item.
+ T item_;
+
+ //! Pointer to the next item in the free list.
+ Temp_Item* next;
+
+ //! Head of the free list.
+ static Temp_Item* free_list_head;
+
+ //! Default constructor.
+ Temp_Item();
+
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Item(const Temp_Item&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Item& operator=(const Temp_Item&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+ //! Constructs an holder holding a dirty temp.
+ Temp_Reference_Holder();
+
+ //! Destructor.
+ ~Temp_Reference_Holder();
+
+ //! Returns a reference to the held item.
+ T& item();
+
+private:
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Reference_Holder(const Temp_Reference_Holder&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Reference_Holder& operator=(const Temp_Reference_Holder&);
+
+ //! The held item, encapsulated.
+ Temp_Item<T>& held;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+ //! Constructs a fake holder.
+ Temp_Value_Holder();
+
+ //! Returns the value of the held item.
+ T& item();
+
+private:
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Value_Holder(const Temp_Value_Holder&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Value_Holder& operator=(const Temp_Value_Holder&);
+
+ //! The held item.
+ T item_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+ : public Temp_Reference_Holder<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+ : public Temp_Value_Holder<T> {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Temp_inlines.hh"
+#include "Temp_templates.hh"
+
+#endif // !defined(PPL_Temp_defs_hh)
diff --git a/src/Temp_inlines.hh b/src/Temp_inlines.hh
new file mode 100644
index 0000000..036d8ea
--- /dev/null
+++ b/src/Temp_inlines.hh
@@ -0,0 +1,97 @@
+/* Temp_* classes implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_inlines_hh
+#define PPL_Temp_inlines_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+ : item_() {
+}
+
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+ return item_;
+}
+
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+ if (free_list_head != 0) {
+ Temp_Item* const p = free_list_head;
+ free_list_head = free_list_head->next;
+ return *p;
+ }
+ else
+ return *new Temp_Item();
+}
+
+template <typename T>
+inline void
+Temp_Item<T>::release(Temp_Item& p) {
+ p.next = free_list_head;
+ free_list_head = &p;
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder()
+ : held(Temp_Item<T>::obtain()) {
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+ Temp_Item<T>::release(held);
+}
+
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+ return held.item();
+}
+
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
+
+template <typename T>
+inline T&
+Temp_Value_Holder<T>::item() {
+ return item_;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#define PPL_DIRTY_TEMP(T, id) \
+ Parma_Polyhedra_Library::Dirty_Temp<PPL_U(T)> holder_ ## id; \
+ PPL_U(T)& PPL_U(id) = holder_ ## id.item()
+
+#endif // !defined(PPL_Temp_inlines_hh)
diff --git a/src/Temp_templates.hh b/src/Temp_templates.hh
new file mode 100644
index 0000000..fe31aa0
--- /dev/null
+++ b/src/Temp_templates.hh
@@ -0,0 +1,34 @@
+/* Temp_* classes implementation: non-inline template members.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_templates_hh
+#define PPL_Temp_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Temp_templates_hh)
diff --git a/src/Threshold_Watcher.cc b/src/Threshold_Watcher.cc
new file mode 100644
index 0000000..4444a63
--- /dev/null
+++ b/src/Threshold_Watcher.cc
@@ -0,0 +1,27 @@
+/* Threshold_Watcher and associated classes' implementation
+ (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Threshold_Watcher_defs.hh"
+
diff --git a/src/Threshold_Watcher_defs.hh b/src/Threshold_Watcher_defs.hh
new file mode 100644
index 0000000..172c208
--- /dev/null
+++ b/src/Threshold_Watcher_defs.hh
@@ -0,0 +1,96 @@
+/* Threshold_Watcher and associated classes' declaration and inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_defs_hh
+#define PPL_Threshold_Watcher_defs_hh 1
+
+#include "Threshold_Watcher_types.hh"
+#include "Handler_types.hh"
+#include "Pending_List_defs.hh"
+#include <cassert>
+
+/*! \brief
+ A class of watchdogs controlling the exceeding of a threshold.
+
+ \tparam Traits
+ A class to set data types and functions for the threshold handling.
+ See \c Parma_Polyhedra_Library::Weightwatch_Traits for an example.
+*/
+template <typename Traits>
+class Parma_Polyhedra_Library::Threshold_Watcher {
+public:
+ template <typename Flag_Base, typename Flag>
+ Threshold_Watcher(const typename Traits::Delta& delta,
+ const Flag_Base* volatile& holder,
+ Flag& flag);
+
+ Threshold_Watcher(const typename Traits::Delta& delta,
+ void (*function)());
+
+ ~Threshold_Watcher();
+
+private:
+ typedef Implementation::Watchdog::Pending_List<Traits> TW_Pending_List;
+ typedef Implementation::Watchdog::Handler TW_Handler;
+
+ bool expired;
+ const TW_Handler& handler;
+ typename TW_Pending_List::iterator pending_position;
+
+ // Just to prevent their use.
+ Threshold_Watcher(const Threshold_Watcher&);
+ Threshold_Watcher& operator=(const Threshold_Watcher&);
+
+ struct Initialize {
+ //! The ordered queue of pending thresholds.
+ TW_Pending_List pending;
+ };
+ static Initialize init;
+
+ // Handle the addition of a new threshold.
+ static typename TW_Pending_List::iterator
+ add_threshold(typename Traits::Threshold threshold,
+ const TW_Handler& handler,
+ bool& expired_flag);
+
+ // Handle the removal of a threshold.
+ static typename TW_Pending_List::iterator
+ remove_threshold(typename TW_Pending_List::iterator position);
+
+ //! Check threshold reaching.
+ static void check();
+
+}; // class Parma_Polyhedra_Library::Threshold_Watcher
+
+
+// Templatic initialization of static data member.
+template <typename Traits>
+typename
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::Initialize
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::init;
+
+#include "Threshold_Watcher_inlines.hh"
+#include "Threshold_Watcher_templates.hh"
+
+#endif // !defined(PPL_Threshold_Watcher_defs_hh)
+
diff --git a/src/Threshold_Watcher_inlines.hh b/src/Threshold_Watcher_inlines.hh
new file mode 100644
index 0000000..5e7c1de
--- /dev/null
+++ b/src/Threshold_Watcher_inlines.hh
@@ -0,0 +1,66 @@
+/* Threshold_Watcher and associated classes' implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_inlines_hh
+#define PPL_Threshold_Watcher_inlines_hh 1
+
+#include <stdexcept>
+
+#include "Handler_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+template <typename Flag_Base, typename Flag>
+Threshold_Watcher<Traits>
+::Threshold_Watcher(const typename Traits::Delta& delta,
+ const Flag_Base* volatile& holder,
+ Flag& flag)
+ : expired(false),
+ handler(*new
+ Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+ flag)) {
+ typename Traits::Threshold threshold;
+ Traits::from_delta(threshold, delta);
+ if (!Traits::less_than(Traits::get(), threshold))
+ throw std::invalid_argument("Threshold_Watcher constructor called with a"
+ " threshold already reached");
+ pending_position = add_threshold(threshold, handler, expired);
+}
+
+template <typename Traits>
+inline
+Threshold_Watcher<Traits>::Threshold_Watcher(const typename Traits::Delta& delta, void (*function)())
+ : expired(false),
+ handler(*new Implementation::Watchdog::Handler_Function(function)) {
+ typename Traits::Threshold threshold;
+ Traits::from_delta(threshold, delta);
+ if (!Traits::less_than(Traits::get(), threshold))
+ throw std::invalid_argument("Threshold_Watcher constructor called with a"
+ " threshold already reached");
+ pending_position = add_threshold(threshold, handler, expired);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_inlines_hh)
diff --git a/src/Threshold_Watcher_templates.hh b/src/Threshold_Watcher_templates.hh
new file mode 100644
index 0000000..1f3d5e3
--- /dev/null
+++ b/src/Threshold_Watcher_templates.hh
@@ -0,0 +1,72 @@
+/* Threshold_Watcher and associated classes'.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_templates_hh
+#define PPL_Threshold_Watcher_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>::add_threshold(typename Traits::Threshold threshold,
+ const TW_Handler& handler,
+ bool& expired_flag) {
+ Traits::check_function = Threshold_Watcher::check;
+ return init.pending.insert(threshold, handler, expired_flag);
+}
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>
+::remove_threshold(typename TW_Pending_List::iterator position) {
+ typename TW_Pending_List::iterator i = init.pending.erase(position);
+ if (init.pending.empty())
+ Traits::check_function = 0;
+ return i;
+}
+
+template <typename Traits>
+Threshold_Watcher<Traits>::~Threshold_Watcher() {
+ if (!expired)
+ remove_threshold(pending_position);
+ delete &handler;
+}
+
+template <typename Traits>
+void
+Threshold_Watcher<Traits>::check() {
+ typename TW_Pending_List::iterator i = init.pending.begin();
+ assert(i != init.pending.end());
+ const typename Traits::Threshold& current = Traits::get();
+ while (!Traits::less_than(current, i->deadline())) {
+ i->handler().act();
+ i->expired_flag() = true;
+ i = remove_threshold(i);
+ if (i == init.pending.end())
+ break;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_templates_hh)
diff --git a/src/Threshold_Watcher_types.hh b/src/Threshold_Watcher_types.hh
new file mode 100644
index 0000000..48dbb03
--- /dev/null
+++ b/src/Threshold_Watcher_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Threshold_Watcher_types_hh
+#define PPL_Threshold_Watcher_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+class Threshold_Watcher;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_types_hh)
diff --git a/src/Time.cc b/src/Time.cc
new file mode 100644
index 0000000..1bcf4c3
--- /dev/null
+++ b/src/Time.cc
@@ -0,0 +1,32 @@
+/* Time class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Time_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Implementation::Watchdog::Time::OK() const {
+ return microsecs < USECS_PER_SEC;
+}
diff --git a/src/Time_defs.hh b/src/Time_defs.hh
new file mode 100644
index 0000000..9aced25
--- /dev/null
+++ b/src/Time_defs.hh
@@ -0,0 +1,126 @@
+/* Time class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Time_defs_hh
+#define PPL_Time_defs_hh 1
+
+#include "Time_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x is shorter than
+ or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x is longer than
+ or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+ Returns the difference of \p x and \p y or the null interval,
+ if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Time {
+public:
+ //! Zero seconds.
+ Time();
+
+ //! Constructor taking a number of centiseconds.
+ explicit Time(long centisecs);
+
+ //! Constructor with seconds and microseconds.
+ Time(long s, long m);
+
+ /*! \brief
+ Returns the number of whole seconds contained in the represented
+ time interval.
+ */
+ long seconds() const;
+
+ /*! \brief
+ Returns the number of microseconds that, when added to the number
+ of seconds returned by seconds(), give the represent time interval.
+ */
+ long microseconds() const;
+
+ //! Adds \p y to \p *this.
+ Time& operator+=(const Time& y);
+
+ /*! \brief
+ Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+ \p *this is set to the null interval.
+ */
+ Time& operator-=(const Time& y);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! Number of microseconds in a second.
+ static const long USECS_PER_SEC = 1000000L;
+
+ //! Number of centiseconds in a second.
+ static const long CSECS_PER_SEC = 100L;
+
+ //! Number of seconds.
+ long secs;
+
+ //! Number of microseconds.
+ long microsecs;
+};
+
+#include "Time_inlines.hh"
+
+#endif // !defined(PPL_Time_defs_hh)
diff --git a/src/Time_inlines.hh b/src/Time_inlines.hh
new file mode 100644
index 0000000..2485f7c
--- /dev/null
+++ b/src/Time_inlines.hh
@@ -0,0 +1,155 @@
+/* Time class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Time_inlines_hh
+#define PPL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Time::Time()
+ : secs(0), microsecs(0) {
+ assert(OK());
+}
+
+inline
+Time::Time(long centisecs)
+ : secs(centisecs / CSECS_PER_SEC),
+ microsecs((centisecs % CSECS_PER_SEC) * (USECS_PER_SEC/CSECS_PER_SEC)) {
+ assert(OK());
+}
+
+inline
+Time::Time(long s, long m)
+ : secs(s),
+ microsecs(m) {
+ if (microsecs >= USECS_PER_SEC) {
+ secs += microsecs / USECS_PER_SEC;
+ microsecs %= USECS_PER_SEC;
+ }
+ assert(OK());
+}
+
+inline long
+Time::seconds() const {
+ return secs;
+}
+
+inline long
+Time::microseconds() const {
+ return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+ long r_secs = secs + y.secs;
+ long r_microsecs = microsecs + y.microsecs;
+ if (r_microsecs >= USECS_PER_SEC) {
+ ++r_secs;
+ r_microsecs %= USECS_PER_SEC;
+ }
+ secs = r_secs;
+ microsecs = r_microsecs;
+ assert(OK());
+ return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+ long r_secs = secs - y.secs;
+ long r_microsecs = microsecs - y.microsecs;
+ if (r_microsecs < 0) {
+ --r_secs;
+ r_microsecs += USECS_PER_SEC;
+ }
+ if (r_secs < 0) {
+ r_secs = 0;
+ r_microsecs = 0;
+ }
+ secs = r_secs;
+ microsecs = r_microsecs;
+ assert(OK());
+ return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+ Time z = x;
+ z += y;
+ return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+ Time z = x;
+ z -= y;
+ return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return x.seconds() < y.seconds()
+ || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+ return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+ return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+ return y <= x;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Time_inlines_hh)
diff --git a/src/Time_types.hh b/src/Time_types.hh
new file mode 100644
index 0000000..1551ebc
--- /dev/null
+++ b/src/Time_types.hh
@@ -0,0 +1,30 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Time_types_hh
+#define PPL_Time_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Time;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Time_types_hh)
diff --git a/src/Topology_types.hh b/src/Topology_types.hh
new file mode 100644
index 0000000..7a60cc1
--- /dev/null
+++ b/src/Topology_types.hh
@@ -0,0 +1,29 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Topology_types_hh
+#define PPL_Topology_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum Topology {
+ NECESSARILY_CLOSED = 0,
+ NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Topology_types_hh)
diff --git a/src/Variable.cc b/src/Variable.cc
new file mode 100644
index 0000000..44bf1bb
--- /dev/null
+++ b/src/Variable.cc
@@ -0,0 +1,53 @@
+/* Variable class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Variable_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variable::output_function_type*
+PPL::Variable::current_output_function = 0;
+
+bool
+PPL::Variable::OK() const {
+ return id() < max_space_dimension();
+}
+
+void
+PPL::Variable::default_output_function(std::ostream& s, const Variable v) {
+ const dimension_type varid = v.id();
+ static const char var_name_letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const dimension_type num_letters = sizeof(var_name_letters) - 1;
+ s << var_name_letters[varid % num_letters];
+ if (const dimension_type i = varid / num_letters)
+ s << i;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variable v) {
+ (*Variable::current_output_function)(s, v);
+ return s;
+}
diff --git a/src/Variable_Floating_Point_Expression_defs.hh b/src/Variable_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..81dde48
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_defs.hh
@@ -0,0 +1,187 @@
+/* Declarations for the Variable_Floating_Point_Expression class and
+ its constituents.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_Floating_Point_Expression_defs_hh
+#define PPL_Variable_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Variable_Floating_Point_Expression_types.hh"
+#include <map>
+#include <utility>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Variable_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Variable Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point variable expressions
+
+ Given a variable expression \f$v\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval
+ linear form \f$\linexprenv{v}{\rho^{\#}}{\rho^{\#}_l}\f$ as
+ \f$\rho^{\#}_l(v)\f$ if it is defined; otherwise we construct it as
+ \f$[-1, 1]v\f$.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression
+: public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with a parameter: builds the variable floating point
+ expression corresponding to the variable having \p v_index as its index.
+ */
+ explicit Variable_Floating_Point_Expression(const dimension_type v_index);
+
+ //! Destructor.
+ ~Variable_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given abstract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that the variable in the expression MUST have an associated value
+ in \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result is
+ computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ /*! \brief
+ Assigns a linear form to the variable with the same index of
+ \p *this in a given linear form abstract store.
+
+ \param lf The linear form assigned to the variable.
+ \param lf_store The linear form abstract store.
+
+ Note that once \p lf is assigned to a variable, all the other entries
+ of \p lf_store which contain that variable are discarded.
+ */
+ void linear_form_assign(const FP_Linear_Form& lf,
+ FP_Linear_Form_Abstract_Store& lf_store) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Variable_Floating_Point_Expression& y);
+
+private:
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Variable_Floating_Point_Expression(
+ const Variable_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Variable_Floating_Point_Expression& operator=(
+ const Variable_Floating_Point_Expression& y);
+
+ //! The index of the variable.
+ dimension_type variable_index;
+
+}; // class Variable_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Variable_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_defs_hh)
diff --git a/src/Variable_Floating_Point_Expression_inlines.hh b/src/Variable_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..397ef57
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,94 @@
+/* Variable_Floating_Point_Expression class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_Floating_Point_Expression_inlines_hh
+#define PPL_Variable_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Variable_Floating_Point_Expression(const dimension_type v_index)
+ : variable_index(v_index) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Variable_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Variable_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(variable_index, y.variable_index);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ typename FP_Linear_Form_Abstract_Store::const_iterator
+ variable_value = lf_store.find(variable_index);
+
+ if (variable_value == lf_store.end()) {
+ result = FP_Linear_Form(Variable(variable_index));
+ return true;
+ }
+
+ result = FP_Linear_Form(variable_value->second);
+ return !this->overflows(result);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linear_form_assign(const FP_Linear_Form& lf,
+ FP_Linear_Form_Abstract_Store& lf_store) const {
+ for (typename FP_Linear_Form_Abstract_Store::iterator
+ i = lf_store.begin(); i != lf_store.end(); ) {
+ if ((i->second).coefficient(Variable(variable_index)) != 0)
+ i = lf_store.erase(i);
+ else
+ ++i;
+ }
+ lf_store[variable_index] = lf;
+ return;
+}
+
+/*! \relates Variable_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_inlines_hh)
diff --git a/src/Variable_Floating_Point_Expression_types.hh b/src/Variable_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..3c9999e
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variable_Floating_Point_Expression_types_hh
+#define PPL_Variable_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_types_hh)
diff --git a/src/Variable_defs.hh b/src/Variable_defs.hh
new file mode 100644
index 0000000..a384dcc
--- /dev/null
+++ b/src/Variable_defs.hh
@@ -0,0 +1,157 @@
+/* Variable class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_defs_hh
+#define PPL_Variable_defs_hh 1
+
+#include "Variable_types.hh"
+#include "Init_types.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+/*! \relates Variable */
+void
+swap(Variable& x, Variable& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Variable represents a dimension of the space,
+ that is one of the Cartesian axes.
+ Variables are used as basic blocks in order to build
+ more complex linear expressions.
+ Each variable is identified by a non-negative integer,
+ representing the index of the corresponding Cartesian axis
+ (the first axis has index 0).
+ The space dimension of a variable is the dimension of the vector space
+ made by all the Cartesian axes having an index less than or equal to
+ that of the considered variable; thus, if a variable has index \f$i\f$,
+ its space dimension is \f$i+1\f$.
+
+ Note that the ``meaning'' of an object of the class Variable
+ is completely specified by the integer index provided to its
+ constructor:
+ be careful not to be mislead by C++ language variable names.
+ For instance, in the following example the linear expressions
+ <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+ since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+ the same Cartesian axis.
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(0);
+ Linear_Expression e1 = x + y;
+ Linear_Expression e2 = y + z;
+ \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+ //! Builds the variable corresponding to the Cartesian axis of index \p i.
+ /*!
+ \exception std::length_error
+ Thrown if <CODE>i+1</CODE> exceeds
+ <CODE>Variable::max_space_dimension()</CODE>.
+ */
+ explicit Variable(dimension_type i);
+
+ //! Returns the index of the Cartesian axis associated to the variable.
+ dimension_type id() const;
+
+ //! Returns the maximum space dimension a Variable can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ /*!
+ The returned value is <CODE>id()+1</CODE>.
+ */
+ dimension_type space_dimension() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Type of output functions.
+ typedef void output_function_type(std::ostream& s, const Variable v);
+
+ //! The default output function.
+ static void default_output_function(std::ostream& s, const Variable v);
+
+ //! Sets the output function to be used for printing Variable objects.
+ static void set_output_function(output_function_type* p);
+
+ //! Returns the pointer to the current output function.
+ static output_function_type* get_output_function();
+
+ //! Binary predicate defining the total ordering on variables.
+ /*! \ingroup PPL_CXX_interface */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(Variable x, Variable y) const;
+ };
+
+ //! Swaps *this and v.
+ void m_swap(Variable& v);
+
+private:
+ //! The index of the Cartesian axis.
+ dimension_type varid;
+
+ // The initialization class needs to set the default output function.
+ friend class Init;
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Variable v);
+
+ //! Pointer to the current output function.
+ static output_function_type* current_output_function;
+
+};
+
+#include "Variable_inlines.hh"
+
+#endif // !defined(PPL_Variable_defs_hh)
diff --git a/src/Variable_inlines.hh b/src/Variable_inlines.hh
new file mode 100644
index 0000000..03d8908
--- /dev/null
+++ b/src/Variable_inlines.hh
@@ -0,0 +1,100 @@
+/* Variable class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_inlines_hh
+#define PPL_Variable_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+ return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+ : varid((i < max_space_dimension())
+ ? i
+ : (throw std::length_error("PPL::Variable::Variable(i):\n"
+ "i exceeds the maximum allowed "
+ "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+ return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+ return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+ return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+ current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+ return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+ return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+ return less(x, y);
+}
+
+inline void
+Variable::m_swap(Variable& v) {
+ using std::swap;
+ swap(varid, v.varid);
+}
+
+inline void
+swap(Variable& x, Variable& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_inlines_hh)
diff --git a/src/Variable_types.hh b/src/Variable_types.hh
new file mode 100644
index 0000000..df20b90
--- /dev/null
+++ b/src/Variable_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variable_types_hh
+#define PPL_Variable_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_types_hh)
diff --git a/src/Variables_Set.cc b/src/Variables_Set.cc
new file mode 100644
index 0000000..bea50bd
--- /dev/null
+++ b/src/Variables_Set.cc
@@ -0,0 +1,92 @@
+/* Variables_Set class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Variables_Set_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variables_Set::Variables_Set(const Variable v, const Variable w)
+ : Base() {
+ for (dimension_type d = v.id(), last = w.id(); d <= last; ++d)
+ insert(d);
+}
+
+bool
+PPL::Variables_Set::OK() const {
+ for (const_iterator i = begin(), set_end = end(); i != set_end; ++i)
+ if (!Variable(*i).OK())
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variables_Set& vs) {
+ s << '{';
+ for (Variables_Set::const_iterator i = vs.begin(),
+ vs_end = vs.end(); i != vs_end; ) {
+ s << ' ' << Variable(*i);
+ ++i;
+ if (i != vs_end)
+ s << ',';
+ }
+ s << " }";
+ return s;
+}
+
+void
+PPL::Variables_Set::ascii_dump(std::ostream& s) const {
+ const dimension_type variables_set_size = size();
+ s << "\nvariables( " << variables_set_size << " )\n";
+ for (Variables_Set::const_iterator i = begin(),
+ i_end = end(); i != i_end; ++i)
+ s << *i << " ";
+}
+
+PPL_OUTPUT_DEFINITIONS(Variables_Set)
+
+bool
+PPL::Variables_Set::ascii_load(std::istream& s) {
+ clear();
+ std::string str;
+ if (!(s >> str) || str != "variables(")
+ return false;
+
+ dimension_type size;
+
+ if (!(s >> size))
+ return false;
+
+ if (!(s >> str) || str != ")")
+ return false;
+
+ for (dimension_type i = 0; i < size; ++i) {
+ dimension_type variable_value;
+ if (!(s >> variable_value))
+ return false;
+ insert(variable_value);
+ }
+ return true;
+}
diff --git a/src/Variables_Set_defs.hh b/src/Variables_Set_defs.hh
new file mode 100644
index 0000000..a4af8c9
--- /dev/null
+++ b/src/Variables_Set_defs.hh
@@ -0,0 +1,107 @@
+/* Variables_Set class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variables_Set_defs_hh
+#define PPL_Variables_Set_defs_hh 1
+
+#include "Variables_Set_types.hh"
+#include "Variable_defs.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& vs);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+ : public std::set<dimension_type> {
+private:
+ typedef std::set<dimension_type> Base;
+
+public:
+ //! Builds the empty set of variable indexes.
+ Variables_Set();
+
+ //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+ explicit Variables_Set(const Variable v);
+
+ /*! \brief
+ Builds the set of variables's indexes in the range from
+ <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+ If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+ set of variables' indexes
+ <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+ The empty set is built otherwise.
+ */
+ Variables_Set(const Variable v, const Variable w);
+
+ //! Returns the maximum space dimension a Variables_Set can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns the dimension of the smallest vector space enclosing all
+ the variables whose indexes are in the set.
+ */
+ dimension_type space_dimension() const;
+
+ //! Inserts the index of variable \p v into the set.
+ void insert(Variable v);
+
+ // The `insert' method above overloads (instead of hiding) the
+ // other `insert' method of std::set.
+ using Base::insert;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+};
+
+#include "Variables_Set_inlines.hh"
+
+#endif // !defined(PPL_Variables_Set_defs_hh)
diff --git a/src/Variables_Set_inlines.hh b/src/Variables_Set_inlines.hh
new file mode 100644
index 0000000..0f1c467
--- /dev/null
+++ b/src/Variables_Set_inlines.hh
@@ -0,0 +1,75 @@
+/* Variables_Set class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variables_Set_inlines_hh
+#define PPL_Variables_Set_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+ : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+ insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable v)
+ : Base() {
+ insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+ return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+ reverse_iterator i = rbegin();
+ return (i == rend()) ? 0 : (*i + 1);
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+ // We assume sets are implemented by means of red-black trees that
+ // require to store the color (we assume an enum) and three pointers
+ // to the parent, left and right child, respectively.
+ enum color { red, black };
+ return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_inlines_hh)
diff --git a/src/Variables_Set_types.hh b/src/Variables_Set_types.hh
new file mode 100644
index 0000000..5cc6456
--- /dev/null
+++ b/src/Variables_Set_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variables_Set_types_hh
+#define PPL_Variables_Set_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_types_hh)
diff --git a/src/WRD_coefficient_types_defs.hh b/src/WRD_coefficient_types_defs.hh
new file mode 100644
index 0000000..f9cf6e2
--- /dev/null
+++ b/src/WRD_coefficient_types_defs.hh
@@ -0,0 +1,153 @@
+/* Coefficient types of weakly-relational domains: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_WRD_coefficient_types_defs_hh
+#define PPL_WRD_coefficient_types_defs_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+ The production policy for checked numbers used in weakly-relational
+ domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Handle not-a-number special value.
+ const_bool_nodef(has_nan, true);
+
+ //! Handle infinity special values.
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ //! Honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, true);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, false);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+ The debugging policy for checked numbers used in weakly-relational
+ domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Debug_WRD_Extended_Number_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, true);
+
+ //! Check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, true);
+
+ //! Check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, true);
+
+ //! Check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, true);
+
+ //! Check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, true);
+
+ //! Check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, true);
+
+ //! Checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, true);
+
+ //! Handle not-a-number special value.
+ const_bool_nodef(has_nan, true);
+
+ //! Handle infinity special values.
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ //! Honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, true);
+
+ //! Make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "WRD_coefficient_types_inlines.hh"
+
+#endif // !defined(PPL_WRD_coefficient_types_defs_hh)
diff --git a/src/WRD_coefficient_types_inlines.hh b/src/WRD_coefficient_types_inlines.hh
new file mode 100644
index 0000000..2a8051e
--- /dev/null
+++ b/src/WRD_coefficient_types_inlines.hh
@@ -0,0 +1,43 @@
+/* Coefficient types of weakly-relational domains: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_WRD_coefficient_types_inlines_hh
+#define PPL_WRD_coefficient_types_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+inline void
+Debug_WRD_Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_WRD_coefficient_types_inlines_hh)
diff --git a/src/Watchdog.cc b/src/Watchdog.cc
new file mode 100644
index 0000000..4f48376
--- /dev/null
+++ b/src/Watchdog.cc
@@ -0,0 +1,250 @@
+/* Watchdog and associated classes' implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Watchdog_defs.hh"
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+#include <csignal>
+#include <iostream>
+#include <stdexcept>
+#include <cerrno>
+#include <string>
+#include <string.h>
+
+#ifdef PPL_TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <ctime>
+#else
+# ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <ctime>
+# endif
+#endif
+
+// Cygwin only supports ITIMER_REAL.
+// Apparently GNU Hurd also only supports ITIMER_REAL
+// (see http://www.cs.unipr.it/pipermail/ppl-devel/2010-March/016072.html).
+// Profiling does not work on programs that use the ITIMER_PROF timer.
+#if defined(__CYGWIN__) || defined(__gnu_hurd__) || defined(PPL_PROFILING)
+#define THE_TIMER ITIMER_REAL
+#define THE_SIGNAL SIGALRM
+#else
+#define THE_TIMER ITIMER_PROF
+#define THE_SIGNAL SIGPROF
+#endif
+
+using std::cerr;
+using std::endl;
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Pass this to getitimer().
+itimerval PPL::Watchdog::current_timer_status;
+
+// Pass this to setitimer().
+itimerval PPL::Watchdog::signal_once;
+
+// Last time value we set the timer to.
+PPL::Implementation::Watchdog::Time PPL::Watchdog::last_time_requested;
+
+// Records the time elapsed since last fresh start.
+PPL::Implementation::Watchdog::Time PPL::Watchdog::time_so_far;
+
+// The ordered queue of pending watchdog events.
+PPL::Watchdog::WD_Pending_List PPL::Watchdog::pending;
+
+// Whether the alarm clock is running.
+volatile bool PPL::Watchdog::alarm_clock_running = false;
+
+// Whether we are changing data which are also changed by the signal handler.
+volatile bool PPL::Watchdog::in_critical_section = false;
+
+namespace {
+
+void
+throw_syscall_error(const char* syscall_name) {
+ throw std::runtime_error(std::string(syscall_name) + ": " + strerror(errno));
+}
+
+void
+my_getitimer(int which, struct itimerval* value) {
+ if (getitimer(which, value) != 0)
+ throw_syscall_error("getitimer");
+}
+
+void
+my_setitimer(int which,
+ const struct itimerval* value, struct itimerval* old_value) {
+ if (setitimer(which, value, old_value) != 0)
+ throw_syscall_error("setitimer");
+}
+
+void
+my_sigaction(int signum,
+ const struct sigaction* act, struct sigaction* old_action) {
+ if (sigaction(signum, act, old_action) != 0)
+ throw_syscall_error("sigaction");
+}
+
+} // namespace
+
+void
+PPL::Watchdog::get_timer(Implementation::Watchdog::Time& time) {
+ using namespace Implementation::Watchdog;
+ my_getitimer(THE_TIMER, ¤t_timer_status);
+ time = Time(current_timer_status.it_value.tv_sec,
+ current_timer_status.it_value.tv_usec);
+}
+
+void
+PPL::Watchdog::set_timer(const Implementation::Watchdog::Time& time) {
+ if (time.seconds() == 0 && time.microseconds() == 0)
+ throw std::runtime_error("PPL internal error");
+ last_time_requested = time;
+ signal_once.it_value.tv_sec = time.seconds();
+ signal_once.it_value.tv_usec = time.microseconds();
+ my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PPL::Watchdog::stop_timer() {
+ signal_once.it_value.tv_sec = 0;
+ signal_once.it_value.tv_usec = 0;
+ my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PPL::Watchdog::handle_timeout(int) {
+ if (in_critical_section)
+ reschedule();
+ else {
+ time_so_far += last_time_requested;
+ if (!pending.empty()) {
+ WD_Pending_List::iterator i = pending.begin();
+ do {
+ i->handler().act();
+ i->expired_flag() = true;
+ i = pending.erase(i);
+ } while (i != pending.end() && i->deadline() <= time_so_far);
+ if (pending.empty())
+ alarm_clock_running = false;
+ else
+ set_timer((*pending.begin()).deadline() - time_so_far);
+ }
+ else
+ alarm_clock_running = false;
+ }
+}
+
+void
+PPL::PPL_handle_timeout(int signum) {
+ PPL::Watchdog::handle_timeout(signum);
+}
+
+PPL::Watchdog::WD_Pending_List::iterator
+PPL::Watchdog::new_watchdog_event(long csecs,
+ const WD_Handler& handler,
+ bool& expired_flag) {
+ using namespace Implementation::Watchdog;
+ assert(csecs > 0);
+ WD_Pending_List::iterator position;
+ const Time deadline(csecs);
+ if (!alarm_clock_running) {
+ position = pending.insert(deadline, handler, expired_flag);
+ time_so_far = Time(0);
+ set_timer(deadline);
+ alarm_clock_running = true;
+ }
+ else {
+ Time time_to_shoot;
+ get_timer(time_to_shoot);
+ Time elapsed_time(last_time_requested);
+ elapsed_time -= time_to_shoot;
+ Time current_time(time_so_far);
+ current_time += elapsed_time;
+ Time real_deadline(deadline);
+ real_deadline += current_time;
+ position = pending.insert(real_deadline, handler, expired_flag);
+ if (deadline < time_to_shoot) {
+ time_so_far = current_time;
+ set_timer(deadline);
+ }
+ }
+ return position;
+}
+
+void
+PPL::Watchdog::remove_watchdog_event(WD_Pending_List::iterator position) {
+ using namespace Implementation::Watchdog;
+ assert(!pending.empty());
+ if (position == pending.begin()) {
+ WD_Pending_List::iterator next = position;
+ ++next;
+ if (next != pending.end()) {
+ const Time first_deadline(position->deadline());
+ Time next_deadline(next->deadline());
+ if (first_deadline != next_deadline) {
+ Time time_to_shoot;
+ get_timer(time_to_shoot);
+ Time elapsed_time(last_time_requested);
+ elapsed_time -= time_to_shoot;
+ time_so_far += elapsed_time;
+ next_deadline -= first_deadline;
+ time_to_shoot += next_deadline;
+ set_timer(time_to_shoot);
+ }
+ }
+ else {
+ stop_timer();
+ alarm_clock_running = false;
+ }
+ }
+ pending.erase(position);
+}
+
+PPL::Implementation::Watchdog::Time PPL::Watchdog::reschedule_time(1);
+
+void
+PPL::Watchdog::initialize() {
+ signal_once.it_interval.tv_sec = 0;
+ signal_once.it_interval.tv_usec = 0;
+
+ sigset_t mask;
+ sigemptyset(&mask);
+
+ struct sigaction s;
+ s.sa_handler = &PPL_handle_timeout;
+ s.sa_mask = mask;
+ s.sa_flags = 0; // Was SA_ONESHOT: why?
+
+ my_sigaction(THE_SIGNAL, &s, 0);
+}
+
+void
+PPL::Watchdog::finalize() {
+}
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
diff --git a/src/Watchdog_defs.hh b/src/Watchdog_defs.hh
new file mode 100644
index 0000000..c39b4dd
--- /dev/null
+++ b/src/Watchdog_defs.hh
@@ -0,0 +1,148 @@
+/* Watchdog and associated classes' declaration and inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Watchdog_defs_hh
+#define PPL_Watchdog_defs_hh 1
+
+#include "Watchdog_types.hh"
+#include "Time_defs.hh"
+#include "Handler_types.hh"
+#include "Pending_List_defs.hh"
+#include <cassert>
+#include <functional>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PPL_handle_timeout(int signum);
+
+struct Watchdog_Traits {
+ typedef Implementation::Watchdog::Time Threshold;
+ static bool less_than(const Threshold& a, const Threshold& b) {
+ return a < b;
+ }
+};
+
+//! A watchdog timer.
+class Watchdog {
+public:
+ template <typename Flag_Base, typename Flag>
+ Watchdog(long csecs, const Flag_Base* volatile& holder, Flag& flag);
+
+ /*! \brief
+ Constructor: if not reset, the watchdog will trigger after \p csecs
+ centiseconds, invoking handler \p function.
+ */
+ Watchdog(long csecs, void (* const function)());
+
+ //! Destructor.
+ ~Watchdog();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+ //! Static class initialization.
+ static void initialize();
+ //! Static class finalization.
+ static void finalize();
+
+private:
+ //! Whether or not this watchdog has expired.
+ bool expired;
+
+ typedef Implementation::Watchdog::Pending_List<Watchdog_Traits>
+ WD_Pending_List;
+
+ typedef Implementation::Watchdog::Handler
+ WD_Handler;
+
+ const WD_Handler& handler;
+ WD_Pending_List::iterator pending_position;
+
+ // Private and not implemented: copy construction is not allowed.
+ Watchdog(const Watchdog&);
+ // Private and not implemented: copy assignment is not allowed.
+ Watchdog& operator=(const Watchdog&);
+
+ // Pass this to getitimer().
+ static itimerval current_timer_status;
+
+ //! Reads the timer value into \p time.
+ static void get_timer(Implementation::Watchdog::Time& time);
+
+ // Pass this to setitimer().
+ static itimerval signal_once;
+
+ // Last time value we set the timer to.
+ static Implementation::Watchdog::Time last_time_requested;
+
+ //! Sets the timer value to \p time.
+ static void set_timer(const Implementation::Watchdog::Time& time);
+
+ //! Stops the timer.
+ static void stop_timer();
+
+ //! Quick reschedule to avoid race conditions.
+ static void reschedule();
+
+ // Used by the above.
+ static Implementation::Watchdog::Time reschedule_time;
+
+ // Records the time elapsed since last fresh start.
+ static Implementation::Watchdog::Time time_so_far;
+
+ //! The ordered queue of pending watchdog events.
+ static WD_Pending_List pending;
+
+ //! The actual signal handler.
+ static void handle_timeout(int);
+
+ //! Handles the addition of a new watchdog event.
+ static WD_Pending_List::iterator
+ new_watchdog_event(long csecs,
+ const WD_Handler& handler,
+ bool& expired_flag);
+
+ //! Handles the removal of the watchdog event referred by \p position.
+ void remove_watchdog_event(WD_Pending_List::iterator position);
+
+ //! Whether the alarm clock is running.
+ static volatile bool alarm_clock_running;
+
+ //! Whether we are changing data that is also changed by the signal handler.
+ static volatile bool in_critical_section;
+
+ friend void PPL_handle_timeout(int signum);
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Watchdog_inlines.hh"
+
+#endif // !defined(PPL_Watchdog_defs_hh)
+
diff --git a/src/Watchdog_inlines.hh b/src/Watchdog_inlines.hh
new file mode 100644
index 0000000..cab18e4
--- /dev/null
+++ b/src/Watchdog_inlines.hh
@@ -0,0 +1,101 @@
+/* Watchdog and associated classes' implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Watchdog_inlines_hh
+#define PPL_Watchdog_inlines_hh 1
+
+#include "Handler_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long csecs,
+ const Flag_Base* volatile& holder,
+ Flag& flag)
+ : expired(false),
+ handler(*new
+ Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+ flag)) {
+ if (csecs == 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of centiseconds");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(csecs, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(long csecs, void (* const function)())
+ : expired(false),
+ handler(*new Implementation::Watchdog::Handler_Function(function)) {
+ if (csecs == 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of centiseconds");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(csecs, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::~Watchdog() {
+ if (!expired) {
+ in_critical_section = true;
+ remove_watchdog_event(pending_position);
+ in_critical_section = false;
+ }
+ delete &handler;
+}
+
+inline void
+Watchdog::reschedule() {
+ set_timer(reschedule_time);
+}
+
+#else // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long /* csecs */,
+ const Flag_Base* volatile& /* holder */,
+ Flag& /* flag */) {
+ throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+ " system does not provide setitimer()");
+}
+
+inline
+Watchdog::Watchdog(long /* csecs */, void (* /* function */)()) {
+ throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+ " system does not provide setitimer()");
+}
+
+inline
+Watchdog::~Watchdog() {
+}
+
+#endif // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Watchdog_inlines_hh)
diff --git a/src/Watchdog_types.hh b/src/Watchdog_types.hh
new file mode 100644
index 0000000..68d79a3
--- /dev/null
+++ b/src/Watchdog_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Watchdog_types_hh
+#define PPL_Watchdog_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Watchdog;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Watchdog_types_hh)
diff --git a/src/Weight_Profiler.cc b/src/Weight_Profiler.cc
new file mode 100644
index 0000000..153eaad
--- /dev/null
+++ b/src/Weight_Profiler.cc
@@ -0,0 +1,80 @@
+/* Weight_Profiler class implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "globals_defs.hh"
+
+#if PPL_PROFILE_ADD_WEIGHT
+#include <iostream>
+#include <cmath>
+#include "Weight_Profiler_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void Weight_Profiler::output_stats() {
+ std::cout << file << ":" << line << ": Weight_Profiler ";
+ if (stat[VALID].samples == 0 && stat[DISCARDED].samples == 0)
+ std::cout << "never reached.";
+ else {
+ if (stat[VALID].samples > 0) {
+ double average
+ = stat[VALID].sum / stat[VALID].count;
+ double variance
+ = stat[VALID].squares_sum / stat[VALID].count - average * average;
+ std::cout << " samples(" << stat[VALID].samples << ")"
+ << " count(" << stat[VALID].count << ")"
+ << " min( " << stat[VALID].min << ")"
+ << " max( " << stat[VALID].max << ")"
+ << " average(" << average << ")";
+ std::cout << " variance( " << variance << ")"
+ << " stddev( " << sqrt(variance) << ")";
+ }
+ if (stat[DISCARDED].samples > 0) {
+ std::cout << " min_threshold( " << min_threshold << ")"
+ << " max_threshold( " << max_threshold << ")";
+ double average = stat[DISCARDED].sum / stat[DISCARDED].count;
+ std::cout << " samples(" << stat[DISCARDED].samples << ")"
+ << " count(" << stat[DISCARDED].count << ")"
+ << " min( " << stat[DISCARDED].min << ")"
+ << " max( " << stat[DISCARDED].max << ")"
+ << " average(" << average << ")";
+ }
+ }
+ std::cout << std::endl;
+}
+
+double Weight_Profiler::tune_adjustment() {
+ begin();
+ adjustment = 0;
+ static Weight_Profiler weight_profiler(__FILE__, __LINE__, 0, 0, 0);
+ for (int i = 0; i < 1000; ++i)
+ weight_profiler.end(1);
+ return weight_profiler.stat[VALID].min;
+}
+
+struct timespec Weight_Profiler::stamp;
+double Weight_Profiler::adjustment = Weight_Profiler::tune_adjustment();
+
+} // namespace Parma_Polyhedra_Library
+
+#endif
diff --git a/src/Weight_Profiler_defs.hh b/src/Weight_Profiler_defs.hh
new file mode 100644
index 0000000..68e9cb5
--- /dev/null
+++ b/src/Weight_Profiler_defs.hh
@@ -0,0 +1,154 @@
+/* Weight_Profiler class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef Weight_Profiler_defs_hh
+#define Weight_Profiler_defs_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+class Weight_Profiler {
+private:
+ enum { DISCARDED = 0, VALID = 1 };
+
+public:
+ Weight_Profiler(const char* file, int line,
+ Weightwatch_Traits::Delta delta,
+ double min_threshold = 0, double max_threshold = 0)
+ : file(file), line(line), delta(delta),
+ min_threshold(min_threshold), max_threshold(max_threshold) {
+ for (int i = 0; i < 2; ++i) {
+ stat[i].samples = 0;
+ stat[i].count = 0;
+ stat[i].sum = 0;
+ stat[i].squares_sum = 0;
+ stat[i].min = 0;
+ stat[i].max = 0;
+ }
+ }
+
+ ~Weight_Profiler() {
+ output_stats();
+ }
+
+ void output_stats();
+
+ static void begin() {
+#ifndef NDEBUG
+ int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+ assert(r >= 0);
+#else
+ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+#endif
+ }
+
+ void end(unsigned int factor = 1) {
+ Weightwatch_Traits::weight
+ += (Weightwatch_Traits::Threshold) delta * factor;
+ struct timespec start = stamp;
+ begin();
+ double elapsed;
+ if (stamp.tv_nsec >= start.tv_nsec) {
+ elapsed = (stamp.tv_nsec - start.tv_nsec)
+ + (stamp.tv_sec - start.tv_sec) * 1e9;
+ }
+ else {
+ elapsed = (1000000000 - start.tv_nsec + stamp.tv_nsec )
+ + (stamp.tv_sec - start.tv_sec - 1) * 1e9;
+ }
+ elapsed -= adjustment;
+ double elapsed1 = elapsed / factor;
+ int i = (elapsed1 < min_threshold
+ || (max_threshold > 0 && elapsed1 > max_threshold))
+ ? DISCARDED
+ : VALID;
+ ++stat[i].samples;
+ if (stat[i].count == 0)
+ stat[i].min = stat[i].max = elapsed1;
+ else if (stat[i].min > elapsed1)
+ stat[i].min = elapsed1;
+ else if (stat[i].max < elapsed1)
+ stat[i].max = elapsed1;
+ stat[i].sum += elapsed;
+ stat[i].squares_sum += elapsed * elapsed1;
+ stat[i].count += factor;
+ }
+
+ static double tune_adjustment();
+
+ private:
+ //! File of this profiling point.
+ const char *file;
+
+ //! Line of this profiling point.
+ int line;
+
+ //! Computational weight to be added at each iteration.
+ Weightwatch_Traits::Delta delta;
+
+ //! Times less than this value are discarded.
+ double min_threshold;
+
+ //! Times greater than this value are discarded.
+ double max_threshold;
+
+ //! Statistical data for samples (both DISCARDED and VALID)
+ struct {
+ //! Number of collected samples.
+ unsigned int samples;
+
+ /*! \brief
+ Number of collected iterations.
+
+ \note
+ Multiple iterations are possibly collected for each sample.
+ */
+ unsigned int count;
+
+ //! Sum of the measured times.
+ double sum;
+
+ //! Sum of the squares of the measured times (to compute variance).
+ double squares_sum;
+
+ //! Minimum measured time.
+ double min;
+
+ //! Maximum measured time.
+ double max;
+ } stat[2];
+
+ //! Holds the time corresponding to last time begin() was called.
+ static struct timespec stamp;
+
+ /*! \brief
+ Time quantity used to adjust the elapsed times so as not to take
+ into account the time spent by the measurement infrastructure.
+ */
+ static double adjustment;
+};
+
+}
+
+#endif // Weight_Profiler_defs_hh
diff --git a/src/Widening_Function_defs.hh b/src/Widening_Function_defs.hh
new file mode 100644
index 0000000..f2611b1
--- /dev/null
+++ b/src/Widening_Function_defs.hh
@@ -0,0 +1,127 @@
+/* Widening_Function class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Widening_Function_defs_hh
+#define PPL_Widening_Function_defs_hh 1
+
+#include "Widening_Function_types.hh"
+#include "Constraint_System_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+ //! The (parametric) type of a widening method.
+ typedef void (PSET::* Widening_Method)(const PSET&, unsigned*);
+
+ //! Explicit unary constructor.
+ explicit
+ Widening_Function(Widening_Method wm);
+
+ //! Function-application operator.
+ /*!
+ Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+ method stored at construction time.
+ */
+ void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+ //! The widening method.
+ Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET, typename CSYS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+ //! The (parametric) type of a limited widening method.
+ typedef void (PSET::* Limited_Widening_Method)(const PSET&,
+ const CSYS&,
+ unsigned*);
+
+ //! Constructor.
+ /*!
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+ */
+ Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CSYS& cs);
+
+ //! Function-application operator.
+ /*!
+ Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+ are the limited widening method and the constraint system stored
+ at construction time.
+ */
+ void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+ //! The limited widening method.
+ Limited_Widening_Method lw_method;
+ //! A constant reference to the constraint system limiting the widening.
+ const CSYS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+ \relates Pointset_Powerset
+
+ \param wm
+ The widening method.
+*/
+template <typename PSET>
+Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+ \relates Pointset_Powerset
+
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+*/
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+ const CSYS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Widening_Function_inlines.hh"
+
+#endif // !defined(PPL_Widening_Function_defs_hh)
diff --git a/src/Widening_Function_inlines.hh b/src/Widening_Function_inlines.hh
new file mode 100644
index 0000000..8b46af2
--- /dev/null
+++ b/src/Widening_Function_inlines.hh
@@ -0,0 +1,75 @@
+/* Widening_Function class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Widening_Function_inlines_hh
+#define PPL_Widening_Function_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+Widening_Function<PSET>::Widening_Function(Widening_Method wm)
+ : w_method(wm) {
+}
+
+template <typename PSET>
+inline void
+Widening_Function<PSET>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+ (x.*w_method)(y, tp);
+}
+
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CSYS& cs)
+ : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PSET, typename CSYS>
+inline void
+Limited_Widening_Function<PSET, CSYS>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+ (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*)) {
+ return Widening_Function<PSET>(wm);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET, typename CSYS>
+inline Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+ const CSYS& cs) {
+ return Limited_Widening_Function<PSET, CSYS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#endif // !defined(PPL_Widening_Function_inlines_hh)
diff --git a/src/Widening_Function_types.hh b/src/Widening_Function_types.hh
new file mode 100644
index 0000000..54a7cdb
--- /dev/null
+++ b/src/Widening_Function_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Widening_Function_types_hh
+#define PPL_Widening_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Widening_Function;
+
+template <typename PSET, typename CSYS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Widening_Function_types_hh)
diff --git a/src/algorithms.hh b/src/algorithms.hh
new file mode 100644
index 0000000..333240c
--- /dev/null
+++ b/src/algorithms.hh
@@ -0,0 +1,72 @@
+/* A collection of useful convex polyhedra algorithms: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_algorithms_hh
+#define PPL_algorithms_hh 1
+
+#include "NNC_Polyhedron_defs.hh"
+#include "Pointset_Powerset_defs.hh"
+#include <utility>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If the poly-hull of \p p and \p q is exact it is assigned
+ to \p p and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \relates Polyhedron
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+ PH poly_hull = p;
+ NNC_Polyhedron nnc_p(p);
+ poly_hull.poly_hull_assign(q);
+ std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(q, poly_hull);
+ const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+ typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+ // The polyhedral hull is exact if and only if all the elements
+ // of the partition of the polyhedral hull of `p' and `q' with
+ // respect to `q' are included in `p'
+ if (!nnc_p.contains(i->pointset()))
+ return false;
+ p = poly_hull;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_algorithms_hh)
diff --git a/src/assert.cc b/src/assert.cc
new file mode 100644
index 0000000..fe2cdf0
--- /dev/null
+++ b/src/assert.cc
@@ -0,0 +1,52 @@
+/* Definitions of assert-like functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "assert.hh"
+#include <cstdlib>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::ppl_unreachable() {
+ abort();
+}
+
+void
+PPL::ppl_unreachable_msg(const char* msg,
+ const char* file, unsigned int line,
+ const char* function) {
+ std::cerr << file << ":" << line << ": " << function
+ << ": Latent fault detected: " << msg << ".\n";
+ abort();
+}
+
+void
+PPL::ppl_assertion_failed(const char* assertion_text,
+ const char* file, unsigned int line,
+ const char* function) {
+ std::cerr << file << ":" << line << ": " << function
+ << ": Assertion `" << assertion_text << "' failed.\n";
+ abort();
+}
diff --git a/src/assert.hh b/src/assert.hh
new file mode 100644
index 0000000..c4fe5ff
--- /dev/null
+++ b/src/assert.hh
@@ -0,0 +1,150 @@
+/* Implementation of PPL assert-like macros.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_assert_hh
+#define PPL_assert_hh 1
+
+// The PPL_UNREACHABLE_MSG macro flags a program point as unreachable.
+// Argument `msg__' is added to output when assertions are turned on.
+#if defined(NDEBUG)
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library::ppl_unreachable()
+#else
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library:: \
+ ppl_unreachable_msg(msg__, __FILE__, __LINE__, __func__)
+#endif
+
+// The PPL_UNREACHABLE macro flags a program point as unreachable.
+#define PPL_UNREACHABLE PPL_UNREACHABLE_MSG("unreachable")
+
+// The PPL_ASSERTION_FAILED macro is used to output a message after
+// an assertion failure and then cause program termination.
+// (It is meant to be used only when assertions are turned on.)
+#define PPL_ASSERTION_FAILED(msg__) Parma_Polyhedra_Library:: \
+ ppl_assertion_failed(msg__, __FILE__, __LINE__, __func__)
+
+// Helper macro PPL_ASSERT_IMPL_: do not use it directly.
+#if defined(NDEBUG)
+#define PPL_ASSERT_IMPL_(cond__) ((void) 0)
+#else
+#define PPL_STRING_(s) #s
+#define PPL_ASSERT_IMPL_(cond__) \
+ ((cond__) ? (void) 0 : PPL_ASSERTION_FAILED(PPL_STRING_(cond__)))
+#endif
+
+
+// Non zero to detect use of PPL_ASSERT instead of PPL_ASSERT_HEAVY
+// Note: flag does not affect code built with NDEBUG defined.
+#define PPL_DEBUG_PPL_ASSERT 1
+
+// The PPL_ASSERT macro states that Boolean condition cond__ should hold.
+// This is meant to replace uses of C assert().
+#if defined(NDEBUG) || (!PPL_DEBUG_PPL_ASSERT)
+#define PPL_ASSERT(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+// Note: here we have assertions enabled and PPL_DEBUG_PPL_ASSERT is 1.
+// Check if the call to PPL_ASSERT should be replaced by PPL_ASSERT_HEAVY
+// (i.e., if the former may interfere with computational weights).
+#define PPL_ASSERT(cond__) \
+ do { \
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits W_Traits; \
+ W_Traits::Threshold old_weight__ = W_Traits::weight; \
+ PPL_ASSERT_IMPL_(cond__); \
+ PPL_ASSERT_IMPL_(old_weight__ == W_Traits::weight \
+ && ("PPL_ASSERT_HEAVY has to be used here" != 0)); \
+ } while (false)
+#endif // !defined(NDEBUG) && PPL_DEBUG_PPL_ASSERT
+
+
+// Macro PPL_ASSERT_HEAVY is meant to be used when the evaluation of
+// the assertion may change computational weights (via WEIGHT_ADD).
+#if defined(NDEBUG)
+#define PPL_ASSERT_HEAVY(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+#define PPL_ASSERT_HEAVY(cond__) \
+ do { \
+ Parma_Polyhedra_Library::In_Assert guard; \
+ PPL_ASSERT_IMPL_(cond__); \
+ } while (false)
+#endif // !defined(NDEBUG)
+
+
+// Macro PPL_EXPECT (resp., PPL_EXPECT_HEAVY) should be used rather than
+// PPL_ASSERT (resp., PPL_ASSERT_HEAVY) when the condition is assumed to
+// hold but it is not under library control (typically, it depends on
+// user provided input).
+#define PPL_EXPECT(cond__) PPL_ASSERT(cond__)
+#define PPL_EXPECT_HEAVY(cond__) PPL_ASSERT_HEAVY(cond__)
+
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+#define PPL_WEAK_NORETURN __attribute__((weak, noreturn))
+#else
+#define PPL_WEAK_NORETURN __attribute__((noreturn))
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper function causing program termination by calling \c abort.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable() PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Helper function printing message on \c std::cerr and causing program
+ termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable_msg(const char* msg,
+ const char* file, unsigned int line,
+ const char* function) PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Helper function printing an assertion failure message on \c std::cerr
+ and causing program termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_assertion_failed(const char* assertion_text,
+ const char* file, unsigned int line,
+ const char* function) PPL_WEAK_NORETURN;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns \c true if and only if \p x_copy contains \p y_copy.
+
+ \note
+ This is a helper function for debugging purposes, to be used in assertions.
+ The two arguments are meant to be passed by value, i.e., <em>copied</em>,
+ so that their representations will not be affected by the containment check.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool copy_contains(T x_copy, T y_copy) {
+ return x_copy.contains(y_copy);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_assert_hh)
diff --git a/src/assign_or_swap.hh b/src/assign_or_swap.hh
new file mode 100644
index 0000000..53e97e9
--- /dev/null
+++ b/src/assign_or_swap.hh
@@ -0,0 +1,71 @@
+/* The assign_or_swap() utility functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_assign_or_swap_hh
+#define PPL_assign_or_swap_hh 1
+
+#include "meta_programming.hh"
+#include "Has_Assign_Or_Swap.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is an assign_or_swap() method, use it.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ to.assign_or_swap(from);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is no assign_or_swap() method but copies are not slow, copy.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+ && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ to = from;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is no assign_or_swap() and copies are slow, delegate to swap().
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+ && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ using std::swap;
+ swap(to, from);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_assign_or_swap_hh)
diff --git a/src/c_streambuf.cc b/src/c_streambuf.cc
new file mode 100644
index 0000000..a15499a
--- /dev/null
+++ b/src/c_streambuf.cc
@@ -0,0 +1,107 @@
+/* c_streambuf class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "c_streambuf_defs.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+c_streambuf::int_type
+c_streambuf::uflow() {
+ const int_type c = underflow();
+ next_char_buf = traits_type::eof();
+ return c;
+}
+
+c_streambuf::int_type
+c_streambuf::underflow() {
+ const int_type eof = traits_type::eof();
+ if (traits_type::eq_int_type(next_char_buf, eof)) {
+ char buf;
+ if (cb_read(&buf, 1) == 1)
+ next_char_buf = buf;
+ else
+ next_char_buf = eof;
+ }
+ return next_char_buf;
+}
+
+std::streamsize
+c_streambuf::xsgetn(char_type* s, std::streamsize n) {
+ PPL_ASSERT(n >= 0);
+ if (n == 0)
+ return n;
+ const int_type eof = traits_type::eof();
+ const size_t sz_n = static_cast<size_t>(n);
+ size_t a;
+ if (traits_type::eq_int_type(next_char_buf, eof))
+ a = 0;
+ else {
+ s[0] = static_cast<char_type>(next_char_buf);
+ a = 1;
+ }
+ const size_t r = cb_read(s + a, sz_n - a) + a;
+ if (r > 0)
+ unget_char_buf = traits_type::to_int_type(s[r - 1]);
+ else
+ unget_char_buf = traits_type::eof();
+ return static_cast<std::streamsize>(r);
+}
+
+c_streambuf::int_type
+c_streambuf::pbackfail(int_type c) {
+ const int_type eof = traits_type::eof();
+ next_char_buf = traits_type::eq_int_type(c, eof) ? unget_char_buf : c;
+ unget_char_buf = eof;
+ return next_char_buf;
+}
+
+std::streamsize
+c_streambuf::xsputn(const char_type* s, std::streamsize n) {
+ PPL_ASSERT(n >= 0);
+ const size_t r = cb_write(s, static_cast<size_t>(n));
+ return static_cast<std::streamsize>(r);
+}
+
+c_streambuf::int_type
+c_streambuf::overflow(int_type c) {
+ const int_type eof = traits_type::eof();
+ if (traits_type::eq_int_type(c, eof))
+ return (sync() != 0) ? eof : traits_type::not_eof(c);
+ else {
+ char buf = static_cast<char>(c);
+ if (cb_write(&buf, 1) == 1)
+ return c;
+ else
+ return eof;
+ }
+}
+
+int
+c_streambuf::sync() {
+ return cb_sync();
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/c_streambuf_defs.hh b/src/c_streambuf_defs.hh
new file mode 100644
index 0000000..0bbf9e6
--- /dev/null
+++ b/src/c_streambuf_defs.hh
@@ -0,0 +1,127 @@
+/* c_streambuf class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_c_streambuf_defs_hh
+#define PPL_c_streambuf_defs_hh 1
+
+#include "c_streambuf_types.hh"
+#include <streambuf>
+#include <cstddef>
+
+class Parma_Polyhedra_Library::c_streambuf
+ : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+ //! Constructor.
+ c_streambuf();
+
+ //! Destructor.
+ virtual ~c_streambuf();
+
+protected:
+ /*! \brief
+ Gets a character in case of underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type underflow();
+
+ /*! \brief
+ In case of underflow, gets a character and advances the next pointer.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type uflow();
+
+ /*! \brief
+ Gets a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+ /*! \brief
+ Puts character back in case of backup underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+ */
+ virtual int_type pbackfail(int_type c = traits_type::eof());
+
+ /*! \brief
+ Writes a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+ /*! \brief
+ Writes a character in case of overflow.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual int_type overflow(int_type c);
+
+ /*! \brief
+ Synchronizes the stream buffer.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+ */
+ virtual int sync();
+
+private:
+ //! Character type of the streambuf.
+ typedef char char_type;
+
+ //! Traits type of the streambuf.
+ typedef std::char_traits<char_type> traits_type;
+
+ //! Integer type of the streambuf.
+ typedef traits_type::int_type int_type;
+
+ //! Buffer for the last character read.
+ int_type unget_char_buf;
+
+ //! Buffer for next character
+ int_type next_char_buf;
+
+ virtual size_t cb_read(char *, size_t) {
+ return 0;
+ }
+ virtual size_t cb_write(const char *, size_t) {
+ return 0;
+ }
+ virtual int cb_sync() {
+ return 0;
+ }
+ virtual int cb_flush() {
+ return 0;
+ }
+};
+
+#include "c_streambuf_inlines.hh"
+
+#endif // !defined(PPL_c_streambuf_defs_hh)
diff --git a/src/c_streambuf_inlines.hh b/src/c_streambuf_inlines.hh
new file mode 100644
index 0000000..5cc069a
--- /dev/null
+++ b/src/c_streambuf_inlines.hh
@@ -0,0 +1,40 @@
+/* c_streambuf class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_c_streambuf_inlines_hh
+#define PPL_c_streambuf_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+c_streambuf::c_streambuf()
+ : unget_char_buf(traits_type::eof()), next_char_buf(traits_type::eof()) {
+}
+
+inline
+c_streambuf::~c_streambuf() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_inlines_hh)
diff --git a/src/c_streambuf_types.hh b/src/c_streambuf_types.hh
new file mode 100644
index 0000000..c5bad41
--- /dev/null
+++ b/src/c_streambuf_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_c_streambuf_types_hh
+#define PPL_c_streambuf_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class c_streambuf;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_types_hh)
diff --git a/src/checked.cc b/src/checked.cc
new file mode 100644
index 0000000..3cbc4ba
--- /dev/null
+++ b/src/checked.cc
@@ -0,0 +1,500 @@
+/* Helper functions for checked numbers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "checked_defs.hh"
+#include "C_Integer.hh"
+
+namespace Parma_Polyhedra_Library {
+
+Minus_Infinity MINUS_INFINITY;
+Plus_Infinity PLUS_INFINITY;
+Not_A_Number NOT_A_NUMBER;
+
+namespace Checked {
+
+//! Holds the precision parameter used for irrational calculations.
+unsigned irrational_precision;
+
+struct number_struct {
+ unsigned int base;
+ bool neg_mantissa;
+ bool neg_exponent;
+ std::string mantissa;
+ unsigned int base_for_exponent;
+ unsigned long exponent;
+};
+
+/*! \brief
+ Returns the integer value associated with the ASCII code \p c, in
+ the base \p base positional number system, if there is such an
+ association; returns \f$-1\f$ otherwise.
+*/
+inline int
+get_digit(char c, unsigned int base = 10) {
+ unsigned int n;
+ switch (c) {
+ case '0': n = 0; break;
+ case '1': n = 1; break;
+ case '2': n = 2; break;
+ case '3': n = 3; break;
+ case '4': n = 4; break;
+ case '5': n = 5; break;
+ case '6': n = 6; break;
+ case '7': n = 7; break;
+ case '8': n = 8; break;
+ case '9': n = 9; break;
+ case 'a': case 'A': n = 10; break;
+ case 'b': case 'B': n = 11; break;
+ case 'c': case 'C': n = 12; break;
+ case 'd': case 'D': n = 13; break;
+ case 'e': case 'E': n = 14; break;
+ case 'f': case 'F': n = 15; break;
+ case 'g': case 'G': n = 16; break;
+ case 'h': case 'H': n = 17; break;
+ case 'i': case 'I': n = 18; break;
+ case 'j': case 'J': n = 19; break;
+ case 'k': case 'K': n = 20; break;
+ case 'l': case 'L': n = 21; break;
+ case 'm': case 'M': n = 22; break;
+ case 'n': case 'N': n = 23; break;
+ case 'o': case 'O': n = 24; break;
+ case 'p': case 'P': n = 25; break;
+ case 'q': case 'Q': n = 26; break;
+ case 'r': case 'R': n = 27; break;
+ case 's': case 'S': n = 28; break;
+ case 't': case 'T': n = 29; break;
+ case 'u': case 'U': n = 30; break;
+ case 'v': case 'V': n = 31; break;
+ case 'w': case 'W': n = 32; break;
+ case 'x': case 'X': n = 33; break;
+ case 'y': case 'Y': n = 34; break;
+ case 'z': case 'Z': n = 35; break;
+ default:
+ return -1;
+ }
+ if (n >= base)
+ return -1;
+ return static_cast<int>(n);
+}
+
+/*! \brief
+ Adds the number represented (in the modulus-and-sign representation)
+ by \p b_neg and \p b_mod to the number represented by \p a_neg and
+ \p a_mod, assigning the result to the latter. Returns
+ <CODE>false</CODE> is the result cannot be represented; returns
+ <CODE>true</CODE> otherwise.
+*/
+inline bool
+sum_sign(bool& a_neg, unsigned long& a_mod,
+ bool b_neg, unsigned long b_mod) {
+ if (a_neg == b_neg) {
+ if (a_mod > C_Integer<unsigned long>::max - b_mod)
+ return false;
+ a_mod += b_mod;
+ }
+ else if (a_mod >= b_mod)
+ a_mod -= b_mod;
+ else {
+ a_neg = !a_neg;
+ a_mod = b_mod - a_mod;
+ }
+ return true;
+}
+
+
+/*! \brief
+ Helper function for parse_number(): reads the numerator or
+ denominator part of a number from \p is into \p numer, returning the
+ appropriate Result value.
+*/
+Result
+parse_number_part(std::istream& is, number_struct& numer) {
+ enum anonymous_enum { BASE, INTEGER, FRACTIONAL, EXPONENT } state = BASE;
+ PPL_UNINITIALIZED(unsigned long, max_exp_div);
+ PPL_UNINITIALIZED(int, max_exp_rem);
+ bool empty_exponent = true;
+ bool empty_mantissa = true;
+ long exponent_offset = 0;
+ unsigned exponent_offset_scale = 1;
+ numer.base = 10;
+ numer.base_for_exponent = 10;
+ numer.neg_mantissa = false;
+ numer.neg_exponent = false;
+ numer.mantissa.erase();
+ numer.exponent = 0;
+ char c;
+ do {
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ } while (is_space(c));
+ switch (c) {
+ case '-':
+ numer.neg_mantissa = true;
+ // Fall through.
+ case '+':
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c == 'i' || c == 'I')
+ goto inf;
+ if (c != '.')
+ break;
+ // Fall through.
+ case '.':
+ state = FRACTIONAL;
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ break;
+ case 'n':
+ case 'N':
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != 'a' && c != 'A')
+ goto unexpected;
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != 'n' && c != 'N')
+ goto unexpected;
+ return V_NAN;
+ inf:
+ case 'i':
+ case 'I':
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != 'n' && c != 'n')
+ goto unexpected;
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != 'f' && c != 'F')
+ goto unexpected;
+ return numer.neg_mantissa ? V_EQ_MINUS_INFINITY : V_EQ_PLUS_INFINITY;
+ }
+ if (state != FRACTIONAL) {
+ if (get_digit(c, 10) < 0)
+ goto unexpected;
+ char d;
+ if (c == '0' && !is.get(d).fail()) {
+ if (d == 'x' || d == 'X') {
+ numer.base = 16;
+ numer.base_for_exponent = 16;
+ state = INTEGER;
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ }
+ else
+ is.unget();
+ }
+ }
+ do {
+ switch (state) {
+ case BASE:
+ if (get_digit(c, 10) >= 0) {
+ if (c != '0' || !numer.mantissa.empty())
+ numer.mantissa += c;
+ empty_mantissa = false;
+ break;
+ }
+ if (c == '^') {
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != '^')
+ goto unexpected;
+ numer.base = 0;
+ for (std::string::const_iterator
+ i = numer.mantissa.begin(); i != numer.mantissa.end(); ++i) {
+ numer.base = numer.base * 10 + static_cast<unsigned>(get_digit(*i, 10));
+ if (numer.base > 36)
+ goto unexpected;
+ }
+ if (numer.base < 2)
+ goto unexpected;
+ numer.base_for_exponent = numer.base;
+ numer.mantissa.erase();
+ empty_mantissa = true;
+ state = INTEGER;
+ break;
+ }
+ goto integer;
+ case INTEGER:
+ if (get_digit(c, numer.base) >= 0) {
+ if (c != '0' || !numer.mantissa.empty())
+ numer.mantissa += c;
+ empty_mantissa = false;
+ break;
+ }
+ integer:
+ if (c == '.') {
+ state = FRACTIONAL;
+ break;
+ }
+ goto fractional;
+ case FRACTIONAL:
+ if (get_digit(c, numer.base) >= 0) {
+ --exponent_offset;
+ if (c != '0' || !numer.mantissa.empty())
+ numer.mantissa += c;
+ empty_mantissa = false;
+ break;
+ }
+ fractional:
+ if (empty_mantissa)
+ goto unexpected;
+ if (c == 'e' || c == 'E')
+ goto exp;
+ if (c == 'p' || c == 'P') {
+ if (numer.base == 16) {
+ numer.base_for_exponent = 2;
+ exponent_offset_scale = 4;
+ goto exp;
+ }
+ else
+ goto unexpected;
+ }
+ if (c == '*') {
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c != '^')
+ goto unexpected;
+ exp:
+ state = EXPONENT;
+ PPL_ASSERT(numer.base >= 2);
+ const long l_max = C_Integer<long>::max;
+ max_exp_div = static_cast<unsigned long>(l_max) / numer.base;
+ max_exp_rem = static_cast<int>(l_max % static_cast<long>(numer.base));
+ if (!is.get(c))
+ return V_CVT_STR_UNK;
+ if (c == '-') {
+ numer.neg_exponent = true;
+ break;
+ }
+ if (c == '+')
+ break;
+ continue;
+ }
+ is.unget();
+ goto ok;
+ case EXPONENT:
+ const int d = get_digit(c, 10);
+ if (d >= 0) {
+ empty_exponent = false;
+ if (numer.exponent > max_exp_div
+ || (numer.exponent == max_exp_div && d > max_exp_rem))
+ return V_CVT_STR_UNK;
+ numer.exponent = 10 * numer.exponent + static_cast<unsigned long>(d);
+ break;
+ }
+ if (empty_exponent)
+ goto unexpected;
+ is.unget();
+ goto ok;
+ }
+ is.get(c);
+ } while (!is.fail());
+
+ if (empty_mantissa || is.bad())
+ return V_CVT_STR_UNK;
+
+ ok:
+ {
+ std::string::size_type n = numer.mantissa.size();
+ while (n > 0 && numer.mantissa[n - 1] == '0') {
+ --n;
+ ++exponent_offset;
+ }
+ numer.mantissa.erase(n);
+ bool neg;
+ if (exponent_offset < 0) {
+ neg = true;
+ exponent_offset = -exponent_offset;
+ }
+ else
+ neg = false;
+ sum_sign(numer.neg_exponent, numer.exponent,
+ neg, static_cast<unsigned long>(exponent_offset) * exponent_offset_scale);
+ return V_EQ;
+ }
+
+ unexpected:
+ is.unget();
+ return V_CVT_STR_UNK;
+}
+
+/*! \brief
+ Reads a number from \p is writing it into \p numer, the numerator,
+ and \p denom, the denominator; the appropriate Result value is
+ returned.
+*/
+Result
+parse_number(std::istream& is, number_struct& numer, number_struct& denom) {
+ // Read the numerator.
+ Result r = parse_number_part(is, numer);
+ if (r != V_EQ)
+ return r;
+ char c;
+ is.get(c);
+ if (is.bad())
+ return V_CVT_STR_UNK;
+ if (!is) {
+ denom.base = 0;
+ return r;
+ }
+ if (c != '/') {
+ is.unget();
+ denom.base = 0;
+ return r;
+ }
+ // Read the denominator.
+ r = parse_number_part(is, denom);
+ if (r != V_EQ)
+ return V_CVT_STR_UNK;
+ if (numer.base == denom.base
+ && numer.base_for_exponent == denom.base_for_exponent) {
+ if (sum_sign(numer.neg_exponent, numer.exponent,
+ !denom.neg_exponent, denom.exponent)) {
+ if (numer.neg_exponent) {
+ denom.neg_exponent = false;
+ denom.exponent = numer.exponent;
+ numer.exponent = 0;
+ }
+ else
+ denom.exponent = 0;
+ }
+ }
+ return V_EQ;
+}
+
+
+Result
+input_mpq(mpq_class& to, std::istream& is) {
+ number_struct numer_struct;
+ number_struct denom_struct;
+ const Result r = parse_number(is, numer_struct, denom_struct);
+ if (r == V_CVT_STR_UNK) {
+ is.setstate(is.failbit);
+ return r;
+ }
+ is.clear(is.rdstate() & ~is.failbit);
+ if (r != V_EQ)
+ return r;
+ if (denom_struct.base != 0 && denom_struct.mantissa.empty())
+ return V_NAN;
+ if (numer_struct.mantissa.empty()) {
+ to = 0;
+ return V_EQ;
+ }
+ const mpz_ptr numer = to.get_num().get_mpz_t();
+ const mpz_ptr denom = to.get_den().get_mpz_t();
+ mpz_set_str(numer, numer_struct.mantissa.c_str(),
+ static_cast<int>(numer_struct.base));
+ if (denom_struct.base != 0) {
+ if (numer_struct.neg_mantissa != denom_struct.neg_mantissa)
+ mpz_neg(numer, numer);
+ mpz_set_str(denom, denom_struct.mantissa.c_str(),
+ static_cast<int>(denom_struct.base));
+ if (numer_struct.exponent != 0 || denom_struct.exponent != 0) {
+ // Multiply the exponents into the numerator and denominator.
+ mpz_t z;
+ mpz_init(z);
+ if (numer_struct.exponent != 0) {
+ mpz_ui_pow_ui(z,
+ numer_struct.base_for_exponent, numer_struct.exponent);
+ if (numer_struct.neg_exponent)
+ mpz_mul(denom, denom, z);
+ else
+ mpz_mul(numer, numer, z);
+ }
+ if (denom_struct.exponent != 0) {
+ mpz_ui_pow_ui(z,
+ denom_struct.base_for_exponent, denom_struct.exponent);
+ if (denom_struct.neg_exponent)
+ mpz_mul(numer, numer, z);
+ else
+ mpz_mul(denom, denom, z);
+ }
+ mpz_clear(z);
+ }
+ }
+ else {
+ if (numer_struct.neg_mantissa)
+ mpz_neg(numer, numer);
+ if (numer_struct.exponent != 0) {
+ if (numer_struct.neg_exponent) {
+ // Add the negative exponent as a denominator.
+ mpz_ui_pow_ui(denom,
+ numer_struct.base_for_exponent, numer_struct.exponent);
+ goto end;
+ }
+ // Multiply the exponent into the numerator.
+ mpz_t z;
+ mpz_init(z);
+ mpz_ui_pow_ui(z,
+ numer_struct.base_for_exponent, numer_struct.exponent);
+ mpz_mul(numer, numer, z);
+ mpz_clear(z);
+ }
+ mpz_set_ui(denom, 1);
+ return V_EQ;
+ }
+ end:
+ // GMP operators require rationals in canonical form.
+ to.canonicalize();
+ return V_EQ;
+}
+
+/* NOTE: q is overwritten! */
+std::string float_mpq_to_string(mpq_class& q) {
+ const mpz_ptr n = q.get_num().get_mpz_t();
+ const mpz_ptr d = q.get_den().get_mpz_t();
+ const unsigned long decimals = mpz_sizeinbase(d, 2) - 1;
+ if (decimals != 0) {
+ mpz_ui_pow_ui(d, 5, decimals);
+ mpz_mul(n, n, d);
+ }
+ size_t bufsize = mpz_sizeinbase(n, 10);
+ if (bufsize < decimals)
+ bufsize = decimals + 4;
+ else
+ bufsize += 3;
+ char buf[bufsize];
+ mpz_get_str(buf, 10, n);
+ if (decimals != 0) {
+ const size_t len = strlen(buf);
+ if (decimals < len) {
+ memmove(&buf[len - decimals + 1], &buf[len - decimals], decimals + 1);
+ buf[len - decimals] = '.';
+ }
+ else {
+ const size_t zeroes = decimals - len;
+ memmove(&buf[2 + zeroes], &buf[0], len + 1);
+ buf[0] = '0';
+ buf[1] = '.';
+ memset(&buf[2], '0', zeroes);
+ }
+ }
+ return buf;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/checked_defs.hh b/src/checked_defs.hh
new file mode 100644
index 0000000..f011628
--- /dev/null
+++ b/src/checked_defs.hh
@@ -0,0 +1,716 @@
+/* Abstract checked arithmetic function container.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_defs_hh
+#define PPL_checked_defs_hh 1
+
+#include <cassert>
+#include <iostream>
+#include <gmpxx.h>
+#include "mp_std_bits_defs.hh"
+#include "Temp_defs.hh"
+#include "Rounding_Dir_defs.hh"
+#include "Numeric_Format_defs.hh"
+#include "Float_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+
+// It is a pity that function partial specialization is not permitted
+// by C++. To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define PPL_FUNCTION_CLASS(name) name ## _function_struct
+
+#define PPL_DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg) { \
+ return PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg); \
+ }
+
+#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, a1); \
+ }
+
+#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1, \
+ PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type, \
+ after1, after2, after3) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2, \
+ PPL_U(after3) a3) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, \
+ a1, a2, \
+ a3); \
+ }
+
+#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg, \
+ a1); \
+ }
+
+#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, \
+ after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \
+ after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(before2) b2, \
+ PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, b2, \
+ arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2); \
+ }
+
+#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1, \
+ qual2, type2, after1) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2, a1); \
+ }
+
+#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \
+ after1, after2) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2, a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1, \
+ qual2, type2, qual3, type3, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename type1, typename type2, typename type3> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename type1, typename type2, typename type3> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(qual3) PPL_U(type3)& arg3, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, \
+ type1, type2, PPL_U(type3)> \
+ ::function(arg1, arg2, arg3, a1); \
+ }
+
+#define PPL_DECLARE_FUN5_0_1(name, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, \
+ after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4,typename Policy5, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4,typename Policy5, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+ PPL_U(type2)& arg2, \
+ PPL_U(qual3) PPL_U(type3)& arg3, PPL_U(qual4) \
+ PPL_U(type4)& arg4, \
+ PPL_U(qual5) PPL_U(type5)& arg5, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, \
+ Policy4, Policy5, \
+ type1, type2, \
+ type3, type4, \
+ PPL_U(type5)> \
+ ::function(arg1, arg2, arg3, arg4, arg5, a1); \
+ }
+
+#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg) { \
+ return PPL_U(func)<Policy>(arg); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy>(arg, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, \
+ after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, \
+ after1, after2, after3) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2, \
+ PPL_U(after3) a3) { \
+ return PPL_U(func)<Policy>(arg, a1, a2, a3); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, \
+ qual, type, after1) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(qual) \
+ PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy>(b1, arg, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, \
+ qual, type, after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(qual) \
+ PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(b1, arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \
+ qual, type, after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(before2) b2, \
+ PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(b1, b2, arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, \
+ qual2, type2) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2) { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, \
+ qual2, type2, after1) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, \
+ qual2, type2, after1, after2) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, \
+ qual2, type2, qual3, type3, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3> \
+ struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, \
+ type1, type2, \
+ PPL_U(type3)> { \
+ static inline Result function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(qual3) PPL_U(type3) &arg3, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2, Policy3>(arg1, arg2, arg3, \
+ a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN5_0_1(name, func, ret_type, \
+ qual1, type1, qual2, type2, \
+ qual3, type3, \
+ qual4, type4, qual5, type5, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4, typename Policy5> \
+ struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4, \
+ Policy5, \
+ type1, type2, \
+ type3, type4, \
+ PPL_U(type5)> { \
+ static inline Result \
+ function(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+ PPL_U(type2) &arg2, \
+ PPL_U(qual3) PPL_U(type3) &arg3, PPL_U(qual4) \
+ PPL_U(type4) &arg4, \
+ PPL_U(qual5) PPL_U(type5) &arg5, PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2, Policy3, Policy4, \
+ Policy5>(arg1, arg2, arg3, arg4, arg5, a1); \
+ } \
+ };
+
+// The `nonconst' macro helps readability of the sequel.
+#ifdef nonconst
+#define PPL_SAVED_nonconst nonconst
+#undef nonconst
+#endif
+#define nonconst
+
+#define PPL_SPECIALIZE_COPY(func, Type) \
+ PPL_SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define PPL_SPECIALIZE_SGN(func, From) \
+ PPL_SPECIALIZE_FUN1_0_0(sgn, func, Result_Relation, const, From)
+#define PPL_SPECIALIZE_CMP(func, Type1, Type2) \
+ PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result_Relation, const, Type1, const, Type2)
+#define PPL_SPECIALIZE_CLASSIFY(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define PPL_SPECIALIZE_IS_NAN(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_MINF(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_PINF(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_INT(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define PPL_SPECIALIZE_ASSIGN_SPECIAL(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(assign_special, func, Result, \
+ nonconst, Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst, \
+ Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ASSIGN(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_FLOOR(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_CEIL(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_TRUNC(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_NEG(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ABS(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_SQRT(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_REM(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_IDIV(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(add_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(sub_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(mul_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(div_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SMOD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(smod_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_UMOD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(umod_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCD(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3) \
+ PPL_SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1, \
+ nonconst, To2, nonconst, To3, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_LCM(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_INPUT(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type, \
+ std::istream&, Rounding_Dir)
+#define PPL_SPECIALIZE_OUTPUT(func, Type) \
+ PPL_SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&, \
+ const, Type, \
+ const Numeric_Format&, Rounding_Dir)
+
+
+PPL_DECLARE_FUN2_0_0(copy,
+ void, nonconst, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_0(sgn,
+ Result_Relation, const, From)
+PPL_DECLARE_FUN2_0_0(cmp,
+ Result_Relation, const, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_3(classify,
+ Result, const, Type, bool, bool, bool)
+PPL_DECLARE_FUN1_0_0(is_nan,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_minf,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_pinf,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_int,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_2(assign_special,
+ Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(construct_special,
+ Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(construct,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(assign,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(floor,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(ceil,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(trunc,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(neg,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(abs,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(sqrt,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(div,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(rem,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(idiv,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(add_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(sub_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(mul_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(div_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(smod_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(umod_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add_mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub_mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(gcd,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN5_0_1(gcdext,
+ Result, nonconst, To1, nonconst, To2, nonconst, To3,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(lcm,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(input,
+ Result, nonconst, Type, std::istream&, Rounding_Dir)
+PPL_DECLARE_FUN1_1_2(output,
+ Result, std::ostream&, const, Type,
+ const Numeric_Format&, Rounding_Dir)
+
+#undef PPL_DECLARE_FUN1_0_0
+#undef PPL_DECLARE_FUN1_0_1
+#undef PPL_DECLARE_FUN1_0_2
+#undef PPL_DECLARE_FUN1_0_3
+#undef PPL_DECLARE_FUN1_1_1
+#undef PPL_DECLARE_FUN1_1_2
+#undef PPL_DECLARE_FUN1_2_2
+#undef PPL_DECLARE_FUN2_0_0
+#undef PPL_DECLARE_FUN2_0_1
+#undef PPL_DECLARE_FUN2_0_2
+#undef PPL_DECLARE_FUN3_0_1
+#undef PPL_DECLARE_FUN5_0_1
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+std::string float_mpq_to_string(mpq_class& q);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+ static const Result_Class vclass = VC_MINUS_INFINITY;
+};
+struct Plus_Infinity {
+ static const Result_Class vclass = VC_PLUS_INFINITY;
+};
+struct Not_A_Number {
+ static const Result_Class vclass = VC_NAN;
+};
+
+template <typename T>
+struct Is_Special : public False { };
+
+template <>
+struct Is_Special<Minus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Plus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Not_A_Number> : public True {};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+ //! Do not check for overflowed result.
+ const_bool_nodef(check_overflow, false);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not check for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Handle not-a-number special value if \p T has it.
+ const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+ //! Handle infinity special values if \p T have them.
+ const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+ /*! \brief
+ The checked number can always be safely converted to the
+ underlying type \p T and vice-versa.
+ */
+ const_bool_nodef(convertible, true);
+
+ //! Do not honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, false);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, false);
+
+ /*! \brief
+ For constructors, by default use the same rounding used by
+ underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+ /*! \brief
+ For overloaded operators (operator+(), operator-(), ...), by
+ default use the same rounding used by the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+ /*! \brief
+ For input functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For output functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For all other functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+#include "checked_inlines.hh"
+#include "checked_int_inlines.hh"
+#include "checked_float_inlines.hh"
+#include "checked_mpz_inlines.hh"
+#include "checked_mpq_inlines.hh"
+#include "checked_ext_inlines.hh"
+
+#undef nonconst
+#ifdef PPL_SAVED_nonconst
+#define nonconst PPL_SAVED_nonconst
+#undef PPL_SAVED_nonconst
+#endif
+
+#undef PPL_FUNCTION_CLASS
+#undef PPL_NAN
+
+#endif // !defined(PPL_checked_defs_hh)
diff --git a/src/checked_ext_inlines.hh b/src/checked_ext_inlines.hh
new file mode 100644
index 0000000..2f6a9b5
--- /dev/null
+++ b/src/checked_ext_inlines.hh
@@ -0,0 +1,923 @@
+/* Checked extended arithmetic functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_ext_defs_hh
+#define PPL_checked_ext_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
+namespace Checked {
+
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+ return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+ return !handle_ext_natively(x)
+ && (Policy::has_infinity || Policy::has_nan);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_ext(const Type& x) {
+ if (!ext_to_handle<Policy>(x))
+ goto native;
+ if (is_nan<Policy>(x))
+ return VR_EMPTY;
+ else if (is_minf<Policy>(x))
+ return VR_LT;
+ else if (is_pinf<Policy>(x))
+ return VR_GT;
+ else {
+ native:
+ return sgn<Policy>(x);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return construct<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return assign<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else {
+ native:
+ return neg<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return floor<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return ceil<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return trunc<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return abs<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+ goto inf_add_inf;
+ else
+ goto minf;
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+ inf_add_inf:
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+ goto inf_sub_inf;
+ else
+ goto minf;
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+ inf_sub_inf:
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_pinf<From2_Policy>(y)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ else if (is_minf<From2_Policy>(y)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto minf;
+ case VR_GT:
+ goto pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ native:
+ return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<To_Policy>(to)
+ && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<To_Policy>(to)
+ || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_minf;
+ case VR_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ a_minf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+ goto inf_add_inf;
+ else
+ goto minf;
+ case VR_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+ inf_add_inf:
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ native:
+ return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<To_Policy>(to)
+ && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<To_Policy>(to)
+ || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_minf;
+ case VR_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ a_minf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+ goto inf_sub_inf;
+ else
+ goto pinf;
+ case VR_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+ inf_sub_inf:
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto minf;
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ native:
+ return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y)))
+ goto inf_div_inf;
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto div_zero;
+ }
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y))) {
+ inf_div_inf:
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ PPL_ASSERT(To_Policy::check_div_zero);
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = 0;
+ return V_EQ;
+ }
+ else {
+ native:
+ return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y)))
+ goto inf_div_inf;
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto div_zero;
+ }
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y))) {
+ inf_div_inf:
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ PPL_ASSERT(To_Policy::check_div_zero);
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = 0;
+ return V_EQ;
+ }
+ else {
+ native:
+ return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+ || is_pinf<From1_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = x;
+ return V_EQ;
+ }
+ else {
+ native:
+ return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+add_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return add_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+sub_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return sub_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+mul_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return mul_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+div_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return div_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+smod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+ || is_pinf<From_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ native:
+ return smod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+umod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+ || is_pinf<From_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ native:
+ return umod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return sqrt<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+ return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+ else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+ else
+ return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+ typename From1_Policy, typename From2_Policy,
+ typename To1, typename To2, typename To3,
+ typename From1, typename From2>
+inline Result
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+ Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To1_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+ s = 0;
+ t = y > 0 ? -1 : 1;
+ return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+ }
+ else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ s = x > 0 ? -1 : 1;
+ t = 0;
+ return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+ }
+ else
+ return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+ || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else
+ return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result_Relation
+cmp_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return VR_EMPTY;
+ else if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y) ? VR_EQ : VR_LT;
+ else if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y) ? VR_EQ : VR_GT;
+ else {
+ if (is_minf<Policy2>(y))
+ return VR_GT;
+ if (is_pinf<Policy2>(y))
+ return VR_LT;
+ native:
+ return cmp<Policy1, Policy2>(x, y);
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return true;
+ native:
+ return lt_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+ return lt_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return true;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return false;
+ native:
+ return le_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+ return le_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y);
+ if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y);
+ else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+ return false;
+ native:
+ return eq_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+ return !eq_ext<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+ const Numeric_Format& format, Rounding_Dir dir) {
+ if (!ext_to_handle<Policy>(x))
+ goto native;
+ if (is_nan<Policy>(x)) {
+ os << "nan";
+ return V_NAN;
+ }
+ if (is_minf<Policy>(x)) {
+ os << "-inf";
+ return V_EQ;
+ }
+ if (is_pinf<Policy>(x)) {
+ os << "+inf";
+ return V_EQ;
+ }
+ native:
+ return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+ return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_ext_defs_hh)
diff --git a/src/checked_float_inlines.hh b/src/checked_float_inlines.hh
new file mode 100644
index 0000000..89946d4
--- /dev/null
+++ b/src/checked_float_inlines.hh
@@ -0,0 +1,1234 @@
+/* Specialized "checked" functions for native floating-point numbers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_float_inlines_hh
+#define PPL_checked_float_inlines_hh 1
+
+#include "compiler.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+multiply_add(float x, float y, float z) {
+#if PPL_HAVE_DECL_FMAF && defined(FP_FAST_FMAF) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fmaf(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline double
+multiply_add(double x, double y, double z) {
+#if PPL_HAVE_DECL_FMA && defined(FP_FAST_FMA) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fma(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline long double
+multiply_add(long double x, long double y, long double z) {
+#if PPL_HAVE_DECL_FMAL && defined(FP_FAST_FMAL) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fmal(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if PPL_HAVE_DECL_RINTF
+inline float
+round_to_integer(float x) {
+ return rintf(x);
+}
+#endif
+
+inline double
+round_to_integer(double x) {
+ return rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
+inline long double
+round_to_integer(long double x) {
+ return rintl(x);
+}
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+round_to_integer(long double x) {
+ return rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+round_to_integer(long double x) {
+ long double i;
+ __asm__ ("frndint" : "=t" (i) : "0" (x));
+ return i;
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+ return round_direct(dir) || round_not_requested(dir);
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+ return round_inverse(dir);
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+// a = 0.3
+// b = 0.1
+// c_i = a * b = 0.03
+// c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+// a = 0.3
+// b = 0.1
+// c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+// c_i = -c_i = 0.03
+// c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline void
+limit_precision(const float& v) {
+ PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const double& v) {
+ PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const long double&) {
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+ Float<T> f(v);
+ if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
+ return V_NAN;
+ if (inf) {
+ if (Policy::has_infinity) {
+ int sign_inf = f.u.binary.inf_sign();
+ if (sign_inf < 0)
+ return V_EQ_MINUS_INFINITY;
+ if (sign_inf > 0)
+ return V_EQ_PLUS_INFINITY;
+ }
+ else
+ PPL_ASSERT(f.u.binary.inf_sign() == 0);
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return V_LGE;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
+}
+
+template <typename Policy, typename T>
+inline bool
+is_inf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() != 0));
+}
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() < 0));
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() > 0));
+}
+
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+ return round_to_integer(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_special_float(T& v, Result_Class c, Rounding_Dir) {
+ PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ v = -HUGE_VAL;
+ return V_EQ_MINUS_INFINITY;
+ case VC_PLUS_INFINITY:
+ v = HUGE_VAL;
+ return V_EQ_PLUS_INFINITY;
+ case VC_NAN:
+ v = PPL_NAN;
+ return V_NAN;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+ Float<T> f(v);
+ PPL_ASSERT(!f.u.binary.is_nan());
+ PPL_ASSERT(f.u.binary.inf_sign() >= 0);
+ if (f.u.binary.zero_sign() > 0) {
+ f.u.binary.negate();
+ f.u.binary.inc();
+ }
+ else if (f.u.binary.sign_bit()) {
+ f.u.binary.inc();
+ }
+ else {
+ f.u.binary.dec();
+ }
+ v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+ Float<T> f(v);
+ PPL_ASSERT(!f.u.binary.is_nan());
+ PPL_ASSERT(f.u.binary.inf_sign() <= 0);
+ if (f.u.binary.zero_sign() < 0) {
+ f.u.binary.negate();
+ f.u.binary.inc();
+ }
+ else if (!f.u.binary.sign_bit()) {
+ f.u.binary.inc();
+ }
+ else {
+ f.u.binary.dec();
+ }
+ v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ pred_float(to);
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ succ_float(to);
+ return V_LT;
+ }
+ return V_GT;
+}
+
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact
+ && !round_not_needed(dir) && round_strict_relation(dir))
+ fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact
+ && !round_not_needed(dir) && round_strict_relation(dir)) {
+ switch (fpu_check_inexact()) {
+ case 0:
+ return V_EQ;
+ case -1:
+ goto unknown;
+ case 1:
+ break;
+ }
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ return V_GT;
+ case ROUND_UP:
+ return V_LT;
+ default:
+ return V_NE;
+ }
+ }
+ else {
+ unknown:
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ return V_GE;
+ case ROUND_UP:
+ return V_LE;
+ default:
+ return V_LGE;
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else if (fpu_inverse_rounding(dir)) {
+ From tmp = -from;
+ to = tmp;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(from);
+ to = from;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) > sizeof(To))
+ return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (fpu_direct_rounding(ROUND_DOWN))
+ to = round_to_integer(from);
+ else if (fpu_inverse_rounding(ROUND_DOWN)) {
+ to = round_to_integer(-from);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+ limit_precision(from);
+ to = round_to_integer(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (fpu_direct_rounding(ROUND_UP))
+ to = round_to_integer(from);
+ else if (fpu_inverse_rounding(ROUND_UP)) {
+ to = round_to_integer(-from);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+ limit_precision(from);
+ to = round_to_integer(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (from >= 0)
+ return floor<To_Policy, From_Policy>(to, from, dir);
+ else
+ return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_add_inf
+ && is_inf_float<From1_Policy>(x) && x == -y) {
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x + y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = -x - y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x + y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_sub_inf
+ && is_inf_float<From1_Policy>(x) && x == y) {
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x - y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = y - x;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x - y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x * y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = x * -y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x * y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_div_inf
+ && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y)) {
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ if (To_Policy::check_div_zero && y == 0) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x / y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = x / -y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x / y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type temp;
+ // The inexact check is useless
+ dir = round_dir(dir);
+ Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+ if (result_class(r) != VC_NORMAL) {
+ to = temp;
+ return r;
+ }
+ Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+ PPL_ASSERT(r1 == V_EQ);
+ if (r == V_EQ || to != temp)
+ return r1;
+ // FIXME: Prove that it is impossible to return a strict relation
+ return (dir == ROUND_UP) ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ if (To_Policy::check_div_zero && y == 0) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = std::fmod(x, y);
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return V_EQ;
+}
+
+struct Float_2exp {
+ const_bool_nodef(has_nan, false);
+ const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ add<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ sub<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ mul<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ div<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ Type m = 1ULL << exp;
+ rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+ Type m2 = m / 2;
+ if (to < -m2)
+ return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ else if (to >= m2)
+ return sub_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ Type m = 1ULL << exp;
+ rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+ if (to < 0)
+ return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = std::abs(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_sqrt_neg && from < 0) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = std::sqrt(from);
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(from);
+ to = std::sqrt(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_float(const Type x) {
+ if (x > 0)
+ return VR_GT;
+ if (x < 0)
+ return VR_LT;
+ if (x == 0)
+ return VR_EQ;
+ return VR_EMPTY;
+}
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_float(const Type x, const Type y) {
+ if (x > y)
+ return VR_GT;
+ if (x < y)
+ return VR_LT;
+ if (x == y)
+ return VR_EQ;
+ return VR_EMPTY;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ to = from;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof_to_bits(sizeof(From)) > Float<To>::Binary::MANTISSA_BITS)
+ return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ {
+ Float<T> f;
+ f.u.binary.set_max(true);
+ to = f.value();
+ return V_LT_INF;
+ }
+ case ROUND_DOWN: // Fall through.
+ case ROUND_IGNORE:
+ to = -HUGE_VAL;
+ return V_GT_MINUS_INFINITY;
+ default:
+ PPL_UNREACHABLE;
+ return V_GT_MINUS_INFINITY;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ {
+ Float<T> f;
+ f.u.binary.set_max(false);
+ to = f.value();
+ return V_GT_SUP;
+ }
+ case ROUND_UP: // Fall through.
+ case ROUND_IGNORE:
+ to = HUGE_VAL;
+ return V_LT_PLUS_INFINITY;
+ default:
+ PPL_UNREACHABLE;
+ return V_LT_PLUS_INFINITY;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& from, Rounding_Dir dir) {
+ int sign = sgn(from);
+ if (sign == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ mpz_srcptr from_z = from.get_mpz_t();
+ size_t exponent = mpz_sizeinbase(from_z, 2) - 1;
+ if (exponent > size_t(Float<T>::Binary::EXPONENT_MAX)) {
+ if (sign < 0)
+ return set_neg_overflow_float<To_Policy>(to, dir);
+ else
+ return set_pos_overflow_float<To_Policy>(to, dir);
+ }
+ unsigned long zeroes = mpn_scan1(from_z->_mp_d, 0);
+ size_t meaningful_bits = exponent - zeroes;
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ if (exponent > Float<T>::Binary::MANTISSA_BITS)
+ mpz_tdiv_q_2exp(mantissa,
+ from_z,
+ exponent - Float<T>::Binary::MANTISSA_BITS);
+ else
+ mpz_mul_2exp(mantissa, from_z, Float<T>::Binary::MANTISSA_BITS - exponent);
+ Float<T> f;
+ f.u.binary.build(sign < 0, mantissa, static_cast<long>(exponent));
+ mpz_clear(mantissa);
+ to = f.value();
+ if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+ if (sign < 0)
+ return round_lt_float<To_Policy>(to, dir);
+ else
+ return round_gt_float<To_Policy>(to, dir);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) {
+ const mpz_class& numer = from.get_num();
+ const mpz_class& denom = from.get_den();
+ if (denom == 1)
+ return assign_float_mpz<To_Policy, From_Policy>(to, numer, dir);
+ mpz_srcptr numer_z = numer.get_mpz_t();
+ mpz_srcptr denom_z = denom.get_mpz_t();
+ int sign = sgn(numer);
+ long exponent = static_cast<long>(mpz_sizeinbase(numer_z, 2))
+ - static_cast<long>(mpz_sizeinbase(denom_z, 2));
+ if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+ to = 0;
+ inexact:
+ if (sign < 0)
+ return round_lt_float<To_Policy>(to, dir);
+ else
+ return round_gt_float<To_Policy>(to, dir);
+ }
+ if (exponent > Float<T>::Binary::EXPONENT_MAX + 1) {
+ overflow:
+ if (sign < 0)
+ return set_neg_overflow_float<To_Policy>(to, dir);
+ else
+ return set_pos_overflow_float<To_Policy>(to, dir);
+ }
+ unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+ if (exponent < Float<T>::Binary::EXPONENT_MIN) {
+ long diff = Float<T>::Binary::EXPONENT_MIN - exponent;
+ needed_bits -= static_cast<unsigned int>(diff);
+ }
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ {
+ long shift = static_cast<long>(needed_bits) - exponent;
+ if (shift > 0) {
+ mpz_mul_2exp(mantissa, numer_z, static_cast<unsigned long>(shift));
+ numer_z = mantissa;
+ }
+ else if (shift < 0) {
+ shift = -shift;
+ mpz_mul_2exp(mantissa, denom_z, static_cast<unsigned long>(shift));
+ denom_z = mantissa;
+ }
+ }
+ mpz_t r;
+ mpz_init(r);
+ mpz_tdiv_qr(mantissa, r, numer_z, denom_z);
+ size_t bits = mpz_sizeinbase(mantissa, 2);
+ bool inexact = (mpz_sgn(r) != 0);
+ mpz_clear(r);
+ if (bits == needed_bits + 1) {
+ inexact = (inexact || mpz_odd_p(mantissa));
+ mpz_tdiv_q_2exp(mantissa, mantissa, 1);
+ }
+ else
+ --exponent;
+ if (exponent > Float<T>::Binary::EXPONENT_MAX) {
+ mpz_clear(mantissa);
+ goto overflow;
+ }
+ else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+ // Denormalized.
+ exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+ }
+ Float<T> f;
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (inexact)
+ goto inexact;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ // FIXME: missing check_inf_add_inf
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = multiply_add(x, y, to);
+ else if (fpu_inverse_rounding(dir)) {
+ to = multiply_add(-x, y, -to);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ limit_precision(to);
+ to = multiply_add(x, y, to);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ // FIXME: missing check_inf_add_inf
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = multiply_add(x, -y, to);
+ else if (fpu_inverse_rounding(dir)) {
+ to = multiply_add(x, y, -to);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ limit_precision(to);
+ to = multiply_add(x, -y, to);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename From>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const From from) {
+ to = from;
+}
+
+template <>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const long double from) {
+ to = 0;
+ if (from == 0.0L)
+ return;
+ mpz_class& num = to.get_num();
+ mpz_class& den = to.get_den();
+ int exp;
+ long double n = std::frexp(from, &exp);
+ bool neg = false;
+ if (n < 0.0L) {
+ neg = true;
+ n = -n;
+ }
+ const long double mult = static_cast<long double>(ULONG_MAX) + 1.0L;
+ const unsigned int bits = sizeof(unsigned long) * CHAR_BIT;
+ while (true) {
+ n *= mult;
+ exp -= bits;
+ const long double intpart = std::floor(n);
+ num += static_cast<unsigned long>(intpart);
+ n -= intpart;
+ if (n == 0.0L)
+ break;
+ num <<= bits;
+ }
+ if (exp < 0)
+ den <<= -exp;
+ else
+ num <<= exp;
+ if (neg)
+ to = -to;
+ to.canonicalize();
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+ Rounding_Dir) {
+ if (from == 0)
+ os << "0";
+ else if (is_minf<Policy>(from))
+ os << "-inf";
+ else if (is_pinf<Policy>(from))
+ os << "+inf";
+ else if (is_nan<Policy>(from))
+ os << "nan";
+ else {
+ mpq_class q;
+ assign_mpq_numeric_float(q, from);
+ std::string s = float_mpq_to_string(q);
+ os << s;
+ }
+ return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_CLASSIFY(classify_float, float)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, float)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, float)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, float)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, float)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, float)
+PPL_SPECIALIZE_IS_INT(is_int_float, float)
+PPL_SPECIALIZE_FLOOR(floor_float, float, float)
+PPL_SPECIALIZE_CEIL(ceil_float, float, float)
+PPL_SPECIALIZE_TRUNC(trunc_float, float, float)
+PPL_SPECIALIZE_NEG(neg_float, float, float)
+PPL_SPECIALIZE_ABS(abs_float, float, float)
+PPL_SPECIALIZE_ADD(add_float, float, float, float)
+PPL_SPECIALIZE_SUB(sub_float, float, float, float)
+PPL_SPECIALIZE_MUL(mul_float, float, float, float)
+PPL_SPECIALIZE_DIV(div_float, float, float, float)
+PPL_SPECIALIZE_REM(rem_float, float, float, float)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, float, float)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, float, float)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, float, float)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, float, float)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, float, float)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, float, float)
+PPL_SPECIALIZE_SQRT(sqrt_float, float, float)
+PPL_SPECIALIZE_GCD(gcd_exact, float, float, float)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+PPL_SPECIALIZE_SGN(sgn_float, float)
+PPL_SPECIALIZE_CMP(cmp_float, float, float)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+PPL_SPECIALIZE_INPUT(input_generic, float)
+PPL_SPECIALIZE_OUTPUT(output_float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, double)
+PPL_SPECIALIZE_IS_INT(is_int_float, double)
+PPL_SPECIALIZE_FLOOR(floor_float, double, double)
+PPL_SPECIALIZE_CEIL(ceil_float, double, double)
+PPL_SPECIALIZE_TRUNC(trunc_float, double, double)
+PPL_SPECIALIZE_NEG(neg_float, double, double)
+PPL_SPECIALIZE_ABS(abs_float, double, double)
+PPL_SPECIALIZE_ADD(add_float, double, double, double)
+PPL_SPECIALIZE_SUB(sub_float, double, double, double)
+PPL_SPECIALIZE_MUL(mul_float, double, double, double)
+PPL_SPECIALIZE_DIV(div_float, double, double, double)
+PPL_SPECIALIZE_REM(rem_float, double, double, double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, double, double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, double, double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, double, double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, double, double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, double, double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, double, double)
+PPL_SPECIALIZE_SQRT(sqrt_float, double, double)
+PPL_SPECIALIZE_GCD(gcd_exact, double, double, double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+PPL_SPECIALIZE_SGN(sgn_float, double)
+PPL_SPECIALIZE_CMP(cmp_float, double, double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+PPL_SPECIALIZE_INPUT(input_generic, double)
+PPL_SPECIALIZE_OUTPUT(output_float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, long double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, long double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, long double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, long double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, long double)
+PPL_SPECIALIZE_IS_INT(is_int_float, long double)
+PPL_SPECIALIZE_FLOOR(floor_float, long double, long double)
+PPL_SPECIALIZE_CEIL(ceil_float, long double, long double)
+PPL_SPECIALIZE_TRUNC(trunc_float, long double, long double)
+PPL_SPECIALIZE_NEG(neg_float, long double, long double)
+PPL_SPECIALIZE_ABS(abs_float, long double, long double)
+PPL_SPECIALIZE_ADD(add_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB(sub_float, long double, long double, long double)
+PPL_SPECIALIZE_MUL(mul_float, long double, long double, long double)
+PPL_SPECIALIZE_DIV(div_float, long double, long double, long double)
+PPL_SPECIALIZE_REM(rem_float, long double, long double, long double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, long double, long double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, long double, long double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, long double, long double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, long double, long double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, long double, long double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, long double, long double)
+PPL_SPECIALIZE_SQRT(sqrt_float, long double, long double)
+PPL_SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
+ long double, long double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_SGN(sgn_float, long double)
+PPL_SPECIALIZE_CMP(cmp_float, long double, long double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_INPUT(input_generic, long double)
+PPL_SPECIALIZE_OUTPUT(output_float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_inlines.hh b/src/checked_inlines.hh
new file mode 100644
index 0000000..4537c9b
--- /dev/null
+++ b/src/checked_inlines.hh
@@ -0,0 +1,658 @@
+/* Abstract checked arithmetic functions: fall-backs.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_inlines_hh
+#define PPL_checked_inlines_hh 1
+
+#include "globals_types.hh"
+#include "meta_programming.hh"
+#include "C_Integer.hh"
+#include "assert.hh"
+
+/*! \brief
+ Performs the test <CODE>a < b</CODE> avoiding the warning about the
+ comparison being always false due to limited range of data type.
+ FIXME: we have not found a working solution. The GCC option
+ -Wno-type-limits suppresses the warning
+*/
+#define PPL_LT_SILENT(a, b) ((a) < (b))
+#define PPL_GT_SILENT(a, b) ((a) > (b))
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define PPL_SAFE_CONVERSION(To, From) \
+ template <> struct Safe_Conversion<PPL_U(To), PPL_U(From)> \
+ : public True { }
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, unsigned char);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, signed char);
+PPL_SAFE_CONVERSION(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+PPL_SAFE_CONVERSION(signed int, unsigned short);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, signed char);
+PPL_SAFE_CONVERSION(signed long, signed short);
+PPL_SAFE_CONVERSION(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned int);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, signed char);
+PPL_SAFE_CONVERSION(signed long long, signed short);
+PPL_SAFE_CONVERSION(signed long long, signed int);
+PPL_SAFE_CONVERSION(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned long);
+#endif
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned short, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned short, unsigned char);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned int, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned int, unsigned char);
+PPL_SAFE_CONVERSION(unsigned int, unsigned short);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long, unsigned int);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned int);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, char);
+PPL_SAFE_CONVERSION(float, signed char);
+PPL_SAFE_CONVERSION(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed short);
+PPL_SAFE_CONVERSION(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed int);
+PPL_SAFE_CONVERSION(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long);
+PPL_SAFE_CONVERSION(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long long);
+PPL_SAFE_CONVERSION(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, char);
+PPL_SAFE_CONVERSION(double, signed char);
+PPL_SAFE_CONVERSION(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed short);
+PPL_SAFE_CONVERSION(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed int);
+PPL_SAFE_CONVERSION(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long);
+PPL_SAFE_CONVERSION(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long long);
+PPL_SAFE_CONVERSION(double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, char);
+PPL_SAFE_CONVERSION(long double, signed char);
+PPL_SAFE_CONVERSION(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed short);
+PPL_SAFE_CONVERSION(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed int);
+PPL_SAFE_CONVERSION(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long);
+PPL_SAFE_CONVERSION(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long long);
+PPL_SAFE_CONVERSION(long double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(long double, float);
+PPL_SAFE_CONVERSION(long double, double);
+
+PPL_SAFE_CONVERSION(mpz_class, char);
+PPL_SAFE_CONVERSION(mpz_class, signed char);
+PPL_SAFE_CONVERSION(mpz_class, signed short);
+PPL_SAFE_CONVERSION(mpz_class, signed int);
+PPL_SAFE_CONVERSION(mpz_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpz_class, unsigned char);
+PPL_SAFE_CONVERSION(mpz_class, unsigned short);
+PPL_SAFE_CONVERSION(mpz_class, unsigned int);
+PPL_SAFE_CONVERSION(mpz_class, unsigned long);
+// GMP's API does not support unsigned long long.
+
+PPL_SAFE_CONVERSION(mpq_class, char);
+PPL_SAFE_CONVERSION(mpq_class, signed char);
+PPL_SAFE_CONVERSION(mpq_class, signed short);
+PPL_SAFE_CONVERSION(mpq_class, signed int);
+PPL_SAFE_CONVERSION(mpq_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpq_class, unsigned char);
+PPL_SAFE_CONVERSION(mpq_class, unsigned short);
+PPL_SAFE_CONVERSION(mpq_class, unsigned int);
+PPL_SAFE_CONVERSION(mpq_class, unsigned long);
+// GMP's API does not support unsigned long long.
+PPL_SAFE_CONVERSION(mpq_class, float);
+PPL_SAFE_CONVERSION(mpq_class, double);
+// GMP's API does not support long double.
+
+#undef PPL_SAFE_CONVERSION
+
+template <typename Policy, typename Type>
+struct PPL_FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ new (&to) Type(from);
+ return V_EQ;
+ }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+struct PPL_FUNCTION_CLASS(construct) {
+ static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+ new (&to) To();
+ return assign<To_Policy, From_Policy>(to, from, dir);
+ }
+};
+
+template <typename To_Policy, typename To>
+struct PPL_FUNCTION_CLASS(construct_special) {
+ static inline Result function(To& to, Result_Class r, Rounding_Dir dir) {
+ new (&to) To();
+ return assign_special<To_Policy>(to, r, dir);
+ }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
+copy_generic(Type& to, const Type& from) {
+ to = from;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+ if (from < 0)
+ return neg<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From>
+inline void
+gcd_exact_no_abs(To& to, const From& x, const From& y) {
+ To w_x = x;
+ To w_y = y;
+ To remainder;
+ while (w_y != 0) {
+ // The following is derived from the assumption that w_x % w_y
+ // is always representable. This is true for both native integers
+ // and IEC 559 floating point numbers.
+ rem<To_Policy, From1_Policy, From2_Policy>(remainder, w_x, w_y,
+ ROUND_NOT_NEEDED);
+ w_x = w_y;
+ w_y = remainder;
+ }
+ to = w_x;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+ return abs<To_Policy, To_Policy>(to, to, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+ typename From1_Policy, typename From2_Policy,
+ typename To1, typename To2, typename To3,
+ typename From1, typename From2>
+inline Result
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+ Rounding_Dir dir) {
+ // In case this becomes a bottleneck, we may consider using the
+ // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+ // Prime Numbers - A Computational Perspective, Second Edition,
+ // Springer, 2005).
+ if (y == 0) {
+ if (x == 0) {
+ s = 0;
+ t = 1;
+ return V_EQ;
+ }
+ else {
+ if (x < 0)
+ s = -1;
+ else
+ s = 1;
+ t = 0;
+ return abs<To1_Policy, From1_Policy>(to, x, dir);
+ }
+ }
+
+ s = 1;
+ t = 0;
+ bool negative_x = x < 0;
+ bool negative_y = y < 0;
+
+ Result r;
+ r = abs<To1_Policy, From1_Policy>(to, x, dir);
+ if (r != V_EQ)
+ return r;
+
+ From2 a_y;
+ r = abs<To1_Policy, From2_Policy>(a_y, y, dir);
+ if (r != V_EQ)
+ return r;
+
+ // If PPL_MATCH_GMP_GCDEXT is defined then s is favored when the absolute
+ // values of the given numbers are equal. For instance if x and y
+ // are both 5 then s will be 1 and t will be 0, instead of the other
+ // way round. This is to match the behavior of GMP.
+#define PPL_MATCH_GMP_GCDEXT 1
+#ifdef PPL_MATCH_GMP_GCDEXT
+ if (to == a_y)
+ goto sign_check;
+#endif
+
+ {
+ To2 v1 = 0;
+ To3 v2 = 1;
+ To1 v3 = static_cast<To1>(a_y);
+ while (true) {
+ To1 q = to / v3;
+ // Remainder, next candidate GCD.
+ To1 t3 = to - q*v3;
+ To2 t1 = s - static_cast<To2>(q)*v1;
+ To3 t2 = t - static_cast<To3>(q)*v2;
+ s = v1;
+ t = v2;
+ to = v3;
+ if (t3 == 0)
+ break;
+ v1 = t1;
+ v2 = t2;
+ v3 = t3;
+ }
+ }
+
+#ifdef PPL_MATCH_GMP_GCDEXT
+ sign_check:
+#endif
+ if (negative_x) {
+ r = neg<To2_Policy, To2_Policy>(s, s, dir);
+ if (r != V_EQ)
+ return r;
+ }
+ if (negative_y)
+ return neg<To3_Policy, To3_Policy>(t, t, dir);
+ return V_EQ;
+#undef PPL_MATCH_GMP_GCDEXT
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (x == 0 || y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ To a_x;
+ To a_y;
+ Result r;
+ r = abs<From1_Policy, From1_Policy>(a_x, x, dir);
+ if (r != V_EQ)
+ return r;
+ r = abs<From2_Policy, From2_Policy>(a_y, y, dir);
+ if (r != V_EQ)
+ return r;
+ To gcd;
+ gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(gcd, a_x, a_y);
+ // The following is derived from the assumption that a_x / gcd(a_x, a_y)
+ // is always representable. This is true for both native integers
+ // and IEC 559 floating point numbers.
+ div<To_Policy, From1_Policy, To_Policy>(to, a_x, gcd, ROUND_NOT_NEEDED);
+ return mul<To_Policy, To_Policy, From2_Policy>(to, to, a_y, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_generic(const Type& x) {
+ if (x > 0)
+ return VR_GT;
+ if (x == 0)
+ return VR_EQ;
+ return VR_LT;
+}
+
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+ : public Bool<(C_Integer<T1>::is_signed
+ ? (C_Integer<T2>::is_signed
+ || sizeof(T2) < sizeof(T1)
+ || sizeof(T2) < sizeof(int))
+ : (!C_Integer<T2>::is_signed
+ || sizeof(T1) < sizeof(T2)
+ || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+ return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+ return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+ return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+ return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+ return y >= 0 && x < static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+ return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+ return y >= 0 && x <= static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+ return x >= 0 && static_cast<typename C_Integer<S>::other_type>(x) == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+ return y >= 0 && x == static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, ROUND_CHECK);
+ // FIXME: We can do this also without fpu inexact check using a
+ // conversion back and forth and then testing equality. We should
+ // code this in checked_float_inlines.hh, probably it's faster also
+ // if fpu supports inexact check.
+ PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+ return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, ROUND_UP);
+ if (!result_representable(r))
+ return true;
+ switch (result_relation(r)) {
+ case VR_EQ:
+ case VR_LT:
+ case VR_LE:
+ return x < tmp;
+ default:
+ return false;
+ }
+}
+
+template <typename T1, typename T2>
+inline typename
+Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, (ROUND_UP | ROUND_STRICT_RELATION));
+ // FIXME: We can do this also without fpu inexact check using a
+ // conversion back and forth and then testing equality. We should
+ // code this in checked_float_inlines.hh, probably it's faster also
+ // if fpu supports inexact check.
+ PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+ if (!result_representable(r))
+ return true;
+ switch (result_relation(r)) {
+ case VR_EQ:
+ return x <= tmp;
+ case VR_LT:
+ return x < tmp;
+ case VR_LE:
+ case VR_GE:
+ case VR_LGE:
+ // See comment above.
+ PPL_UNREACHABLE;
+ return false;
+ default:
+ return false;
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+ return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+ return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+ return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result_Relation
+cmp_generic(const Type1& x, const Type2& y) {
+ if (lt(y, x))
+ return VR_GT;
+ if (lt(x, y))
+ return VR_LT;
+ return VR_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+assign_nan(Type& to, Result r) {
+ assign_special<Policy>(to, VC_NAN, ROUND_IGNORE);
+ return r;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+ PPL_DIRTY_TEMP(mpq_class, q);
+ Result r = input_mpq(q, is);
+ Result_Class c = result_class(r);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ case VC_PLUS_INFINITY:
+ return assign_special<Policy>(to, c, dir);
+ case VC_NAN:
+ return assign_nan<Policy>(to, r);
+ default:
+ break;
+ }
+ PPL_ASSERT(r == V_EQ);
+ return assign<Policy, void>(to, q, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_inlines_hh)
diff --git a/src/checked_int_inlines.hh b/src/checked_int_inlines.hh
new file mode 100644
index 0000000..3ebd1a3
--- /dev/null
+++ b/src/checked_int_inlines.hh
@@ -0,0 +1,1952 @@
+/* Specialized "checked" functions for native integer numbers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_int_inlines_hh
+#define PPL_checked_int_inlines_hh 1
+
+#include "C_Integer.hh"
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+
+#if !PPL_HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !PPL_HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef PPL_HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+ static const Type plus_infinity = C_Integer<Type>::max;
+ static const Type minus_infinity = ((C_Integer<Type>::min >= 0)
+ ? (C_Integer<Type>::max - 1)
+ : C_Integer<Type>::min);
+ static const Type not_a_number
+ = ((C_Integer<Type>::min >= 0)
+ ? (C_Integer<Type>::max - 2 * (Policy::has_infinity ? 1 : 0))
+ : (C_Integer<Type>::min + (Policy::has_infinity ? 1 : 0)));
+ static const Type min
+ = (C_Integer<Type>::min
+ + ((C_Integer<Type>::min >= 0)
+ ? 0
+ : ((Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))));
+ static const Type max
+ = (C_Integer<Type>::max
+ - ((C_Integer<Type>::min >= 0)
+ ? (2 * (Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))
+ : (Policy::has_infinity ? 1 : 0)));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT_INF;
+ }
+ else {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT_MINUS_INFINITY;
+ }
+ return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT_SUP;
+ }
+ else {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT_PLUS_INFINITY;
+ }
+ return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ if (to == Extended_Int<Policy, To>::min) {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT_MINUS_INFINITY;
+ }
+ return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+ }
+ else {
+ --to;
+ return V_GT;
+ }
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ if (to == Extended_Int<Policy, To>::max) {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT_PLUS_INFINITY;
+ }
+ return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+ }
+ else {
+ ++to;
+ return V_LT;
+ }
+ }
+ return V_GT;
+}
+
+PPL_SPECIALIZE_COPY(copy_generic, char)
+PPL_SPECIALIZE_COPY(copy_generic, signed char)
+PPL_SPECIALIZE_COPY(copy_generic, signed short)
+PPL_SPECIALIZE_COPY(copy_generic, signed int)
+PPL_SPECIALIZE_COPY(copy_generic, signed long)
+PPL_SPECIALIZE_COPY(copy_generic, signed long long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned char)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned short)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned int)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+ if (Policy::has_nan
+ && (nan || sign)
+ && v == Extended_Int<Policy, Type>::not_a_number)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (v == Extended_Int<Policy, Type>::minus_infinity)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (v == Extended_Int<Policy, Type>::plus_infinity)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_int, char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+ return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_int, char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+ return Policy::has_infinity
+ && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_int, char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+ return Policy::has_infinity
+ && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+ return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_int, char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed short)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed int)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned char)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned short)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned int)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+assign_special_int(Type& v, Result_Class c, Rounding_Dir dir) {
+ PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan) {
+ v = Extended_Int<Policy, Type>::not_a_number;
+ return V_NAN;
+ }
+ return V_NAN | V_UNREPRESENTABLE;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ v = Extended_Int<Policy, Type>::minus_infinity;
+ return V_EQ_MINUS_INFINITY;
+ }
+ if (round_up(dir)) {
+ v = Extended_Int<Policy, Type>::min;
+ return V_LT_INF;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ v = Extended_Int<Policy, Type>::plus_infinity;
+ return V_EQ_PLUS_INFINITY;
+ }
+ if (round_down(dir)) {
+ v = Extended_Int<Policy, Type>::max;
+ return V_GT_SUP;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) < sizeof(From)
+ || (sizeof(To) == sizeof(From)
+ && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+ || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_LT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::min))))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_GT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::max))))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) <= sizeof(From)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_overflow, from < 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (sizeof(To) < sizeof(From)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) < sizeof(From)
+ || (sizeof(To) == sizeof(From)
+ && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_GT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::max))))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+
+#define PPL_ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN_SIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
+#define PPL_ASSIGN_UNSIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_SIGNED(char)
+#endif
+PPL_ASSIGN_SIGNED(signed char)
+PPL_ASSIGN_SIGNED(signed short)
+PPL_ASSIGN_SIGNED(signed int)
+PPL_ASSIGN_SIGNED(signed long)
+PPL_ASSIGN_SIGNED(signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_UNSIGNED(char)
+#endif
+PPL_ASSIGN_UNSIGNED(unsigned char)
+PPL_ASSIGN_UNSIGNED(unsigned short)
+PPL_ASSIGN_UNSIGNED(unsigned int)
+PPL_ASSIGN_UNSIGNED(unsigned long)
+PPL_ASSIGN_UNSIGNED(unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long long)
+#else
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, char)
+#endif
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+#if 0
+ // FIXME: this is correct but it is inefficient and breaks the build
+ // for the missing definition of static const members (a problem present
+ // also in other areas of the PPL).
+ if (CHECK_P(To_Policy::check_overflow, lt(from, Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+#else
+ if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+#endif
+ if (round_not_requested(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ From i_from = rint(from);
+ to = i_from;
+ if (from == i_from)
+ return V_EQ;
+ if (round_direct(ROUND_UP))
+ return round_lt_int<To_Policy>(to, dir);
+ if (round_direct(ROUND_DOWN))
+ return round_gt_int<To_Policy>(to, dir);
+ if (from < i_from)
+ return round_lt_int<To_Policy>(to, dir);
+ PPL_ASSERT(from > i_from);
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
+
+#undef PPL_ASSIGN_SIGNED
+#undef PPL_ASSIGN_UNSIGNED
+#undef PPL_ASSIGN2_SIGNED_SIGNED
+#undef PPL_ASSIGN2_UNSIGNED_UNSIGNED
+#undef PPL_ASSIGN2_UNSIGNED_SIGNED
+#undef PPL_ASSIGN2_SIGNED_UNSIGNED
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (sizeof(To) <= sizeof(signed long)) {
+ if (!To_Policy::check_overflow) {
+ to = from.get_si();
+ return V_EQ;
+ }
+ if (from.fits_slong_p()) {
+ signed long v = from.get_si();
+ if (PPL_LT_SILENT(v, (Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ else {
+ mpz_srcptr m = from.get_mpz_t();
+ size_t sz = mpz_size(m);
+ if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+ if (sz == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ To v;
+ mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+ if (v >= 0) {
+ if (::sgn(from) < 0)
+ return neg<To_Policy, To_Policy>(to, v, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ }
+ return (::sgn(from) < 0)
+ ? set_neg_overflow_int<To_Policy>(to, dir)
+ : set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (sizeof(To) <= sizeof(unsigned long)) {
+ if (!To_Policy::check_overflow) {
+ to = static_cast<To>(from.get_ui());
+ return V_EQ;
+ }
+ if (from.fits_ulong_p()) {
+ const unsigned long v = from.get_ui();
+ if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = static_cast<To>(v);
+ return V_EQ;
+ }
+ }
+ else {
+ const mpz_srcptr m = from.get_mpz_t();
+ const size_t sz = mpz_size(m);
+ if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+ if (sz == 0)
+ to = 0;
+ else
+ mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+ return V_EQ;
+ }
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+ mpz_srcptr n = from.get_num().get_mpz_t();
+ mpz_srcptr d = from.get_den().get_mpz_t();
+ PPL_DIRTY_TEMP(mpz_class, q);
+ mpz_ptr q_z = q.get_mpz_t();
+ if (round_not_requested(dir)) {
+ mpz_tdiv_q(q_z, n, d);
+ Result r = assign<To_Policy, void>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ return V_LGE;
+ }
+ mpz_t rem;
+ int sign;
+ mpz_init(rem);
+ mpz_tdiv_qr(q_z, rem, n, d);
+ sign = mpz_sgn(rem);
+ mpz_clear(rem);
+ Result r = assign<To_Policy, void>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ switch (sign) {
+ case -1:
+ return round_lt_int<To_Policy>(to, dir);
+ case 1:
+ return round_gt_int<To_Policy>(to, dir);
+ default:
+ return V_EQ;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
+
+#if ~0 != -1
+#error "Only two's complement is supported"
+#endif
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architectures.
+//
+// Current guidelines:
+// - avoid division where possible (larger type variant for mul)
+// - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef int_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef int_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef uint_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef uint_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed short> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast32_t type_for_neg;
+ typedef int_fast32_t type_for_add;
+ typedef int_fast32_t type_for_sub;
+ typedef int_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast32_t type_for_neg;
+ typedef uint_fast32_t type_for_add;
+ typedef int_fast32_t type_for_sub;
+ typedef uint_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<signed int> {
+ const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+ const_bool_nodef(use_for_add, (LONG_BITS == 64));
+ const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+ const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+ const_bool_nodef(use_for_add, (LONG_BITS == 64));
+ const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, false);
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, false);
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_neg l = x;
+ l = -l;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_add l = x;
+ l += y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_sub l = x;
+ l -= y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_mul l = x;
+ l *= y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (from < -Extended_Int<To_Policy, Type>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+ if (CHECK_P(To_Policy::check_overflow, from != 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (To_Policy::check_overflow) {
+ if (y >= 0) {
+ if (x > Extended_Int<To_Policy, Type>::max - y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else if (x < Extended_Int<To_Policy, Type>::min - y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (x > Extended_Int<To_Policy, Type>::max - y)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (To_Policy::check_overflow) {
+ if (y >= 0) {
+ if (x < Extended_Int<To_Policy, Type>::min + y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ else if (x > Extended_Int<To_Policy, Type>::max + y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (x < Extended_Int<To_Policy, Type>::min + y)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (!To_Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ if (x >= 0) {
+ if (y > 0) {
+ if (x > Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else {
+ if (x > Extended_Int<To_Policy, Type>::min / y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ }
+ else {
+ if (y < 0) {
+ if (x < Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else {
+ if (x < Extended_Int<To_Policy, Type>::min / y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ }
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (!To_Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (x > Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ if (To_Policy::check_overflow && y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ to = x / y;
+ if (round_not_requested(dir))
+ return V_LGE;
+ if (y == -1)
+ return V_EQ;
+ Type m = x % y;
+ if (m < 0)
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ else if (m > 0)
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ if (round_not_requested(dir))
+ return V_GE;
+ Type m = x % y;
+ if (m == 0)
+ return V_EQ;
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ if (To_Policy::check_overflow && y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ to = x / y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = (y == -1) ? 0 : (x % y);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = x % y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x & ((Type(1) << exp) - 1))
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (x < 0) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_LE;
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ }
+ typedef typename C_Integer<Type>::other_type UType;
+ UType ux = x;
+ ux = -ux;
+ to = ~Type(~-(ux >> exp));
+ if (round_not_requested(dir))
+ return V_LE;
+ if (ux & ((UType(1) << exp) -1))
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ return V_EQ;
+ }
+ else {
+ if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x & ((Type(1) << exp) - 1))
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x + (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ Type n = Type(1) << exp;
+ return add_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x + (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+ Type n = -2 * (Type(1) << (exp - 1));
+ return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+ else {
+ Type n = Type(1) << exp;
+ return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x - (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ Type n = Type(1) << exp;
+ return sub_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x - (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+ Type n = -2 * (Type(1) << (exp - 1));
+ return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+ else {
+ Type n = Type(1) << exp;
+ return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ if (x > Extended_Int<To_Policy, Type>::max >> exp)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x << exp;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (x < 0) {
+ if (!To_Policy::check_overflow) {
+ to = x * (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ typedef typename C_Integer<Type>::other_type UType;
+ UType mask = UType(-1) << (sizeof_to_bits(sizeof(Type)) - exp - 1);
+ UType ux = x;
+ if ((ux & mask) != mask)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ ux <<= exp;
+ Type n = ~(Type(~ux));
+ if (PPL_LT_SILENT(n, (Extended_Int<To_Policy, Type>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = n;
+ }
+ else {
+ if (!To_Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ if (x > Extended_Int<To_Policy, Type>::max >> exp)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x << exp;
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp > sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else {
+ Type v = (exp == sizeof_to_bits(sizeof(Type)) ? x : (x & ((Type(1) << exp) - 1)));
+ if (v >= (Type(1) << (exp - 1)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ else
+ to = v;
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else {
+ Type m = Type(1) << (exp - 1);
+ to = (x & (m - 1)) - (x & m);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else
+ to = x & ((Type(1) << exp) - 1);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ if (x < 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x;
+ }
+ else
+ to = x & ((Type(1) << exp) - 1);
+ return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrt_rem(Type& q, Type& r, const Type from) {
+ q = 0;
+ r = from;
+ Type t(1);
+ for (t <<= sizeof_to_bits(sizeof(Type)) - 2; t != 0; t >>= 2) {
+ Type s = q + t;
+ if (s <= r) {
+ r -= s;
+ q = s + t;
+ }
+ q >>= 1;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ Type rem;
+ isqrt_rem(to, rem, from);
+ if (round_not_requested(dir))
+ return V_GE;
+ if (rem == 0)
+ return V_EQ;
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+ switch (result_overflow(r)) {
+ case 0:
+ return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+ case -1:
+ if (to <= 0)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case 1:
+ if (to >= 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+ switch (result_overflow(r)) {
+ case 0:
+ return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+ case -1:
+ if (to >= 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case 1:
+ if (to <= 0)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+ const Numeric_Format&, Rounding_Dir) {
+ os << int(from);
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(abs_generic, char, char)
+#endif
+PPL_SPECIALIZE_ABS(abs_generic, signed char, signed char)
+PPL_SPECIALIZE_ABS(abs_generic, signed short, signed short)
+PPL_SPECIALIZE_ABS(abs_generic, signed int, signed int)
+PPL_SPECIALIZE_ABS(abs_generic, signed long, signed long)
+PPL_SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCD(gcd_exact, char, char, char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, char, char, char, char, char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, char, char, char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SGN(sgn_generic, char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed short)
+PPL_SPECIALIZE_SGN(sgn_generic, signed int)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned char)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned short)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned int)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+PPL_SPECIALIZE_CMP(cmp_generic, char, char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+PPL_SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, char, char, char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, char, char, char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_INPUT(input_generic, char)
+PPL_SPECIALIZE_INPUT(input_generic, signed char)
+PPL_SPECIALIZE_INPUT(input_generic, signed short)
+PPL_SPECIALIZE_INPUT(input_generic, signed int)
+PPL_SPECIALIZE_INPUT(input_generic, signed long)
+PPL_SPECIALIZE_INPUT(input_generic, signed long long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned char)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned short)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned int)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+PPL_SPECIALIZE_OUTPUT(output_char, char)
+PPL_SPECIALIZE_OUTPUT(output_char, signed char)
+PPL_SPECIALIZE_OUTPUT(output_int, signed short)
+PPL_SPECIALIZE_OUTPUT(output_int, signed int)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long long)
+PPL_SPECIALIZE_OUTPUT(output_char, unsigned char)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned short)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned int)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_mpq_inlines.hh b/src/checked_mpq_inlines.hh
new file mode 100644
index 0000000..fe8d3b4
--- /dev/null
+++ b/src/checked_mpq_inlines.hh
@@ -0,0 +1,542 @@
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_mpq_inlines_hh
+#define PPL_checked_mpq_inlines_hh 1
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+ if ((Policy::has_nan || Policy::has_infinity)
+ && ::sgn(v.get_den()) == 0) {
+ int s = ::sgn(v.get_num());
+ if (Policy::has_nan && (nan || sign) && s == 0)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (s < 0)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (s > 0)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return static_cast<Result>(sgn<Policy>(v));
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+ return Policy::has_nan
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) == 0;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+ return Policy::has_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) < 0;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+ return Policy::has_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) > 0;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+ if ((Policy::has_infinity || Policy::has_nan)
+ && ::sgn(v.get_den()) == 0)
+ return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+ else
+ return v.get_den() == 1;
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpq(mpq_class& v, Result_Class c, Rounding_Dir) {
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan) {
+ v.get_num() = 0;
+ v.get_den() = 0;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+ return V_NAN;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ v.get_num() = -1;
+ v.get_den() = 0;
+ return V_EQ_MINUS_INFINITY;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ v.get_num() = 1;
+ v.get_den() = 0;
+ return V_EQ_PLUS_INFINITY;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class)
+
+PPL_SPECIALIZE_COPY(copy_generic, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ assign_mpq_numeric_float(to, from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, long double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(signed long))
+ to = static_cast<signed long>(from);
+ else {
+ mpz_ptr m = to.get_num().get_mpz_t();
+ if (from >= 0)
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+ else {
+ From n = -from;
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+ mpz_neg(m, m);
+ }
+ to.get_den() = 1;
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(unsigned long))
+ to = static_cast<unsigned long>(from);
+ else {
+ mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+ to.get_den() = 1;
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_fdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_cdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_tdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+ tmp = x / y;
+ tmp.get_num() %= tmp.get_den();
+ to = tmp * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x + v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x - v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+ to.get_den() = x.get_den();
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ to.get_num() = x.get_num();
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+ mpz_fdiv_q_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+ bool neg = to.get_num() >= to.get_den();
+ mpz_mul_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+ if (neg)
+ to.get_num() -= to.get_den();
+ mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+ mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+ Rounding_Dir) {
+ to += x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+ Rounding_Dir) {
+ to -= x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned irrational_precision;
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ if (from == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ bool gt1 = from.get_num() > from.get_den();
+ const mpz_class& from_a = gt1 ? from.get_num() : from.get_den();
+ const mpz_class& from_b = gt1 ? from.get_den() : from.get_num();
+ mpz_class& to_a = gt1 ? to.get_num() : to.get_den();
+ mpz_class& to_b = gt1 ? to.get_den() : to.get_num();
+ Rounding_Dir rdir = gt1 ? dir : inverse(dir);
+ mul_2exp<To_Policy, From_Policy>(to_a, from_a,
+ 2*irrational_precision, ROUND_IGNORE);
+ Result r_div
+ = div<To_Policy, To_Policy, To_Policy>(to_a, to_a, from_b, rdir);
+ Result r_sqrt = sqrt<To_Policy, To_Policy>(to_a, to_a, rdir);
+ to_b = 1;
+ mul_2exp<To_Policy, To_Policy>(to_b, to_b,
+ irrational_precision, ROUND_IGNORE);
+ to.canonicalize();
+ return (r_div != V_EQ) ? r_div : r_sqrt;
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+ Result r = input_mpq(to, is);
+ Result_Class c = result_class(r);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ case VC_PLUS_INFINITY:
+ return assign_special<Policy>(to, c, dir);
+ case VC_NAN:
+ return assign_nan<Policy>(to, r);
+ default:
+ return r;
+ }
+}
+
+PPL_SPECIALIZE_INPUT(input_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+ const mpq_class& from,
+ const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_OUTPUT(output_mpq, mpq_class)
+
+} // namespace Checked
+
+//! Returns the precision parameter used for irrational calculations.
+inline unsigned
+irrational_precision() {
+ return Checked::irrational_precision;
+}
+
+//! Sets the precision parameter used for irrational calculations.
+/*! The lesser between numerator and denominator is limited to 2**\p p.
+
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for irrational calculations to \p p.
+
+ \exception std::invalid_argument
+ Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_irrational_precision(const unsigned p) {
+ if (p <= INT_MAX)
+ Checked::irrational_precision = p;
+ else
+ throw std::invalid_argument("PPL::set_irrational_precision(p)"
+ " with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpq_inlines_hh)
diff --git a/src/checked_mpz_inlines.hh b/src/checked_mpz_inlines.hh
new file mode 100644
index 0000000..4147994
--- /dev/null
+++ b/src/checked_mpz_inlines.hh
@@ -0,0 +1,645 @@
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_mpz_inlines_hh
+#define PPL_checked_mpz_inlines_hh 1
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+#ifdef PPL_HAVE_TYPEOF
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+ return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+ v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+ if (Policy::has_nan || Policy::has_infinity) {
+ mp_size_field_t s = get_mp_size(v);
+ if (Policy::has_nan
+ && (nan || sign)
+ && s == C_Integer<mp_size_field_t>::min + 1)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (s == C_Integer<mp_size_field_t>::min)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (s == C_Integer<mp_size_field_t>::max)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return static_cast<Result>(sgn<Policy>(v));
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+ return Policy::has_nan
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+ return Policy::has_infinity
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+ return Policy::has_infinity
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+ return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpz(mpz_class& v, Result_Class c, Rounding_Dir) {
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan)
+ set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+ return V_NAN;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ set_mp_size(v, C_Integer<mp_size_field_t>::min);
+ return V_EQ_MINUS_INFINITY;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ set_mp_size(v, C_Integer<mp_size_field_t>::max);
+ return V_EQ_PLUS_INFINITY;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+ if (is_nan_mpz<From_Policy>(from))
+ PPL_ASSERT(To_Policy::has_nan);
+ else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+ PPL_ASSERT(To_Policy::has_infinity);
+ else {
+ to = from;
+ return;
+ }
+ set_mp_size(to, get_mp_size(from));
+}
+
+PPL_SPECIALIZE_COPY(copy_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ new (&to) mpz_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ if (round_not_requested(dir)) {
+ new (&to) mpz_class(from);
+ return V_LGE;
+ }
+ From n = rint(from);
+ new (&to) mpz_class(n);
+ if (from == n)
+ return V_EQ;
+ if (from < 0)
+ return round_lt_mpz<To_Policy>(to, dir);
+ else
+ return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(signed long))
+ to = static_cast<signed long>(from);
+ else {
+ mpz_ptr m = to.get_mpz_t();
+ if (from >= 0)
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+ else {
+ From n = -from;
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+ mpz_neg(m, m);
+ }
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(unsigned long))
+ to = static_cast<unsigned long>(from);
+ else
+ mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ if (round_not_requested(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ From i_from = rint(from);
+ to = i_from;
+ if (from == i_from)
+ return V_EQ;
+ if (round_direct(ROUND_UP))
+ return round_lt_mpz<To_Policy>(to, dir);
+ if (round_direct(ROUND_DOWN))
+ return round_gt_mpz<To_Policy>(to, dir);
+ if (from < i_from)
+ return round_lt_mpz<To_Policy>(to, dir);
+ if (from > i_from)
+ return round_gt_mpz<To_Policy>(to, dir);
+ PPL_UNREACHABLE;
+ return V_NAN;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ // FIXME: this is an incredibly inefficient implementation!
+ std::stringstream ss;
+ output<From_Policy>(ss, from, Numeric_Format(), dir);
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+#ifndef NDEBUG
+ Result r =
+#endif
+ input_mpq(tmp, ss);
+ PPL_ASSERT(r == V_EQ);
+ return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (round_not_needed(dir)) {
+ to = from.get_num();
+ return V_LGE;
+ }
+ if (round_ignore(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ const mpz_srcptr n = from.get_num().get_mpz_t();
+ const mpz_srcptr d = from.get_den().get_mpz_t();
+ if (round_down(dir)) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
+
+PPL_SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ const mpz_srcptr n = x.get_mpz_t();
+ const mpz_srcptr d = y.get_mpz_t();
+ if (round_not_needed(dir)) {
+ mpz_divexact(to.get_mpz_t(), n, d);
+ return V_LGE;
+ }
+ if (round_ignore(dir)) {
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return V_LE;
+ }
+ if (round_down(dir)) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ mpz_srcptr n = x.get_mpz_t();
+ mpz_srcptr d = y.get_mpz_t();
+ mpz_tdiv_q(to.get_mpz_t(), n, d);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = x % y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x + v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x - v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir dir) {
+ const mpz_srcptr n = x.get_mpz_t();
+ if (round_not_requested(dir)) {
+ mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_LGE;
+ }
+ if (round_down(dir)) {
+ mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ if (mpz_tstbit(x.get_mpz_t(), exp - 1) != 0)
+ mpz_cdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ else
+ mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+ const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+ x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ if (round_not_requested(dir)) {
+ to = sqrt(from);
+ return V_GE;
+ }
+ PPL_DIRTY_TEMP(mpz_class, r);
+ mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+ if (r == 0)
+ return V_EQ;
+ return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_mp(const Type& x) {
+ const int sign = ::sgn(x);
+ return (sign > 0) ? VR_GT : ((sign < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_SGN(sgn_mp, mpz_class)
+PPL_SPECIALIZE_SGN(sgn_mp, mpq_class)
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_mp(const Type& x, const Type& y) {
+ int i = ::cmp(x, y);
+ return (i > 0) ? VR_GT : ((i < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_INPUT(input_generic, mpz_class)
+PPL_SPECIALIZE_OUTPUT(output_mpz, mpz_class)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpz_inlines_hh)
diff --git a/src/checked_numeric_limits.hh b/src/checked_numeric_limits.hh
new file mode 100644
index 0000000..b5f410c
--- /dev/null
+++ b/src/checked_numeric_limits.hh
@@ -0,0 +1,167 @@
+/* Specializations of std::numeric_limits for "checked" types.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_numeric_limits_hh
+#define PPL_checked_numeric_limits_hh 1
+
+#include "Checked_Number_defs.hh"
+#include "checked_int_inlines.hh"
+#include <limits>
+
+namespace std {
+
+using namespace Parma_Polyhedra_Library;
+
+#define PPL_SPECIALIZE_LIMITS_INT(T) \
+ /*! \brief Partial specialization of std::numeric_limits. */ \
+ template <typename Policy> \
+ class numeric_limits<Checked_Number<PPL_U(T), Policy> > \
+ : public numeric_limits<PPL_U(T)> { \
+ private: \
+ typedef Checked_Number<PPL_U(T), Policy> Type; \
+ \
+ public: \
+ static const bool has_infinity = Policy::has_infinity; \
+ static const bool has_quiet_NaN = Policy::has_nan; \
+ \
+ static Type min() { \
+ Type v; \
+ v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::min; \
+ return v; \
+ } \
+ \
+ static Type max() { \
+ Type v; \
+ v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::max; \
+ return v; \
+ } \
+ \
+ static Type infinity() { \
+ Type v; \
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY, \
+ ROUND_IGNORE); \
+ return v; \
+ } \
+ \
+ static Type quiet_NaN() { \
+ Type v; \
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, \
+ ROUND_IGNORE); \
+ return v; \
+ } \
+ };
+
+PPL_SPECIALIZE_LIMITS_INT(char)
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T) \
+ /*! \brief Partial specialization of std::numeric_limits. */ \
+ template <typename Policy> \
+ struct numeric_limits<Checked_Number<PPL_U(T), Policy> > \
+ : public numeric_limits<PPL_U(T)> { \
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpz_class, Policy> >
+ : public numeric_limits<mpz_class> {
+private:
+ typedef Checked_Number<mpz_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::has_infinity;
+ static const bool has_quiet_NaN = Policy::has_nan;
+
+ static Type infinity() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+ ROUND_IGNORE);
+ return v;
+ }
+
+ static Type quiet_NaN() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+ typedef Checked_Number<mpq_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::has_infinity;
+ static const bool has_quiet_NaN = Policy::has_nan;
+
+ static Type infinity() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+ ROUND_IGNORE);
+ return v;
+ }
+
+ static Type quiet_NaN() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+ return v;
+ }
+};
+
+} // namespace std
+
+#endif // !defined(PPL_checked_numeric_limits_hh)
diff --git a/src/compiler.hh b/src/compiler.hh
new file mode 100644
index 0000000..840620a
--- /dev/null
+++ b/src/compiler.hh
@@ -0,0 +1,224 @@
+/* C++ compiler related stuff.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_compiler_hh
+#define PPL_compiler_hh 1
+
+#include <cstddef>
+#include <climits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ No-op macro that allows to avoid unused variable warnings from
+ the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_USED(v) (void)(v)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ No-op function that force the compiler to store the argument and
+ to reread it from memory if needed (thus preventing CSE).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+PPL_CC_FLUSH(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+ __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+ // FIXME: is it possible to achieve the same effect in a portable way?
+ PPL_USED(x);
+#endif
+}
+
+#ifndef PPL_SUPPRESS_UNINIT_WARNINGS
+#define PPL_SUPPRESS_UNINIT_WARNINGS 1
+#endif
+
+#ifndef PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+#define PPL_SUPPRESS_UNINITIALIZED_WARNINGS 1
+#endif
+
+#if PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+template <typename T>
+struct Suppress_Uninitialized_Warnings_Type {
+ typedef T synonym;
+};
+
+#define PPL_UNINITIALIZED(type, name) \
+ PPL_U(type) PPL_U(name) \
+ = Suppress_Uninitialized_Warnings_Type<PPL_U(type)>::synonym ()
+#else
+#define PPL_UNINITIALIZED(type, name) \
+ PPL_U(type) name
+#endif
+
+#define sizeof_to_bits(size) \
+ ((size) * static_cast<std::size_t>(CHAR_BIT))
+
+#if !defined(__GNUC__)
+
+inline unsigned int
+clz32(uint32_t w) {
+ unsigned int r = 31;
+ if ((w & 0xffff0000U) != 0) {
+ w >>= 16;
+ r -= 16;
+ }
+ if ((w & 0xff00U) != 0) {
+ w >>= 8;
+ r -= 8;
+ }
+ if ((w & 0xf0U) != 0) {
+ w >>= 4;
+ r -= 4;
+ }
+ if ((w & 0xcU) != 0) {
+ w >>= 2;
+ r -= 2;
+ }
+ if ((w & 0x2U) != 0)
+ r -= 1;
+ return r;
+}
+
+inline unsigned int
+clz64(uint64_t w) {
+ if ((w & 0xffffffff00000000ULL) == 0)
+ return clz32(static_cast<uint32_t>(w)) + 32;
+ else
+ return clz32(static_cast<uint32_t>(w >> 32));
+}
+
+inline unsigned int
+ctz32(uint32_t w) {
+ static const unsigned int mod37_table[] = {
+ 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
+ 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
+ 5, 20, 8, 19, 18
+ };
+ return mod37_table[(w & -w) % 37];
+}
+
+inline unsigned int
+ctz64(uint64_t w) {
+ if ((w & 0x00000000ffffffffULL) == 0)
+ return ctz32(static_cast<uint32_t>(w >> 32)) + 32;
+ else
+ return ctz32(static_cast<uint32_t>(w));
+}
+
+#endif
+
+inline unsigned int
+clz(unsigned int u) {
+ assert(u != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clz(u));
+#elif PPL_SIZEOF_INT == 4
+ return clz32(u);
+#elif PPL_SIZEOF_INT == 8
+ return clz64(u);
+#else
+ #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long ul) {
+ assert(ul != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+ return clz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+ return clz64(ul);
+#else
+ #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long long ull) {
+ assert(ull != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+ return clz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+ return clz64(ull);
+#else
+ #error "Unsupported unsigned long long size"
+#endif
+}
+
+
+inline unsigned int
+ctz(unsigned int u) {
+ assert(u != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctz(u));
+#elif PPL_SIZEOF_INT == 4
+ return ctz32(u);
+#elif PPL_SIZEOF_INT == 8
+ return ctz64(u);
+#else
+ #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long ul) {
+ assert(ul != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+ return ctz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+ return ctz64(ul);
+#else
+ #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long long ull) {
+ assert(ull != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+ return ctz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+ return ctz64(ull);
+#else
+ #error "Unsupported unsigned long long size"
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_compiler_hh)
diff --git a/src/distances_defs.hh b/src/distances_defs.hh
new file mode 100644
index 0000000..4803f8f
--- /dev/null
+++ b/src/distances_defs.hh
@@ -0,0 +1,54 @@
+/* Class declarations for several distances.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_distances_defs_hh
+#define PPL_distances_defs_hh 1
+
+#include "distances_types.hh"
+#include "Rounding_Dir_defs.hh"
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+ static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+ static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+ static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+ static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+ static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+ static void finalize(Temp&, Rounding_Dir);
+};
+
+#include "distances_inlines.hh"
+
+#endif // !defined(PPL_distances_defs_hh)
diff --git a/src/distances_inlines.hh b/src/distances_inlines.hh
new file mode 100644
index 0000000..279a345
--- /dev/null
+++ b/src/distances_inlines.hh
@@ -0,0 +1,113 @@
+/* Inline functions implementing distances.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_distances_inlines_hh
+#define PPL_distances_inlines_hh 1
+
+#include "Result_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+ static inline Result
+ function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+ // When `To' and `From' are different types, we make the conversion
+ // and use `tmp'.
+ top = &tmp;
+ return assign_r(tmp, from, dir);
+ }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+ static inline Result
+ function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+ // When the types are the same, conversion is unnecessary.
+ top = &from;
+ return V_EQ;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Assigns to \p top a pointer to a location that holds the
+ conversion, according to \p dir, of \p from to type \p To. When
+ necessary, and only when necessary, the variable \p tmp is used to
+ hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+ return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+ const Temp& current,
+ Rounding_Dir dir) {
+ add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+ Temp& current,
+ Rounding_Dir dir) {
+ mul_assign_r(current, current, current, dir);
+ add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+ Rounding_Dir dir) {
+ sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+ const Temp& current,
+ Rounding_Dir) {
+ if (current > running)
+ running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_inlines_hh)
diff --git a/src/distances_types.hh b/src/distances_types.hh
new file mode 100644
index 0000000..f8d5892
--- /dev/null
+++ b/src/distances_types.hh
@@ -0,0 +1,29 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_distances_types_hh
+#define PPL_distances_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_types_hh)
diff --git a/src/fpu-c99_inlines.hh b/src/fpu-c99_inlines.hh
new file mode 100644
index 0000000..388281f
--- /dev/null
+++ b/src/fpu-c99_inlines.hh
@@ -0,0 +1,100 @@
+/* C99 Floating point unit related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_c99_inlines_hh
+#define PPL_fpu_c99_inlines_hh 1
+
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#include <stdexcept>
+
+#ifdef FE_TONEAREST
+#define PPL_FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define PPL_FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define PPL_FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define PPL_FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+ const int old = fegetround();
+ if (fesetround(PPL_FPU_DOWNWARD) != 0
+ || fesetround(PPL_FPU_UPWARD) != 0
+ || fesetround(old) != 0)
+ throw std::logic_error("PPL configuration error:"
+ " PPL_CAN_CONTROL_FPU evaluates to true,"
+ " but fesetround() returns nonzero.");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fegetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ const fpu_rounding_control_word_type old
+ = static_cast<fpu_rounding_control_word_type>(fegetround());
+ fesetround(dir);
+ return old;
+}
+
+inline void
+fpu_reset_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+ feclearexcept(FE_INEXACT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+ return fetestexcept(FE_INEXACT) != 0 ? 1 : 0;
+#else
+ return -1;
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_FENV_H)
+
+#endif // !defined(PPL_fpu_c99_inlines_hh)
diff --git a/src/fpu-ia32.cc b/src/fpu-ia32.cc
new file mode 100644
index 0000000..9c2fad0
--- /dev/null
+++ b/src/fpu-ia32.cc
@@ -0,0 +1,75 @@
+/* IA-32 floating point unit non-inline related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+#if PPL_CAN_CONTROL_FPU && defined(PPL_FPMATH_MAY_USE_SSE) \
+ && defined(__i386__) \
+ && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+#include "fpu_defs.hh"
+#include <csetjmp>
+#include <csignal>
+// This inclusion is to work around a bug present in some versions
+// of GCC under mingw-w64.
+// See http://www.cs.unipr.it/pipermail/ppl-devel/2011-February/017342.html
+#include <cstddef>
+
+namespace {
+
+jmp_buf env;
+
+void
+illegal_instruction_catcher(int) {
+ longjmp(env, 1);
+}
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+bool have_sse_unit = true;
+
+void
+detect_sse_unit() {
+ void (*old)(int);
+ // Install our own signal handler for SIGILL.
+ old = signal(SIGILL, illegal_instruction_catcher);
+
+ if (setjmp(env)) {
+ // We will end up here if sse_get_control() raises SIGILL.
+ have_sse_unit = false;
+ }
+ else {
+ (void) sse_get_control();
+ // sse_get_control() did not raise SIGILL: we have an SSE unit.
+ have_sse_unit = true;
+ }
+
+ // Restore the previous signal handler for SIGILL.
+ signal(SIGILL, old);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // PPL_CAN_CONTROL_FPU && defined(PPL_FPMATH_MAY_USE_SSE) && defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
diff --git a/src/fpu-ia32_inlines.hh b/src/fpu-ia32_inlines.hh
new file mode 100644
index 0000000..acc87fa
--- /dev/null
+++ b/src/fpu-ia32_inlines.hh
@@ -0,0 +1,203 @@
+/* IA-32 floating point unit inline related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_ia32_inlines_hh
+#define PPL_fpu_ia32_inlines_hh 1
+
+#include <csetjmp>
+#include <csignal>
+
+#define FPU_INVALID 0x01
+#define FPU_DIVBYZERO 0x04
+#define FPU_OVERFLOW 0x08
+#define FPU_UNDERFLOW 0x10
+#define FPU_INEXACT 0x20
+
+#define FPU_ALL_EXCEPT \
+ (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define PPL_FPU_TONEAREST 0
+#define PPL_FPU_DOWNWARD 0x400
+#define PPL_FPU_UPWARD 0x800
+#define PPL_FPU_TOWARDZERO 0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define SSE_INEXACT 0x20
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
+
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT \
+ (PPL_FPU_CONTROL_DEFAULT_BASE | PPL_FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT \
+ (PPL_SSE_CONTROL_DEFAULT_BASE | (PPL_FPU_UPWARD << 3))
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct {
+ unsigned short control_word;
+ unsigned short unused1;
+ unsigned short status_word;
+ unsigned short unused2;
+ unsigned short tags;
+ unsigned short unused3;
+ unsigned int eip;
+ unsigned short cs_selector;
+ unsigned int opcode:11;
+ unsigned int unused4:5;
+ unsigned int data_offset;
+ unsigned short data_selector;
+ unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+ unsigned short cw;
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
+ return cw;
+}
+
+inline void
+fpu_set_control(int c) {
+ unsigned short cw = static_cast<unsigned short>(c);
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
+}
+
+inline int
+fpu_get_status() {
+ unsigned short sw;
+ __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
+ return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+ /* There is no fldsw instruction */
+ ia32_fenv_t env;
+ __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+ env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+ __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
+}
+
+inline void
+fpu_clear_exceptions() {
+ __asm__ __volatile__ ("fnclex" : /* No outputs. */ : : "memory");
+}
+
+#ifdef PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+ __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
+
+inline unsigned int
+sse_get_control() {
+ unsigned int cw;
+ __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+ return cw;
+}
+#endif
+
+inline void
+fpu_initialize_control_functions() {
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern void detect_sse_unit();
+ detect_sse_unit();
+#endif
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+ return static_cast<fpu_rounding_control_word_type>(0);
+}
+
+inline void
+fpu_reset_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_clear_exceptions();
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ // NOTE: on entry to this function the current rounding mode
+ // has to be the default one.
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline int
+fpu_check_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+ if (fpu_get_status() & FPU_INEXACT)
+ return 1;
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+ return 1;
+#endif
+ return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_ia32_inlines_hh)
diff --git a/src/fpu-none_inlines.hh b/src/fpu-none_inlines.hh
new file mode 100644
index 0000000..97da109
--- /dev/null
+++ b/src/fpu-none_inlines.hh
@@ -0,0 +1,75 @@
+/* Null floating point unit related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_none_inlines_hh
+#define PPL_fpu_none_inlines_hh 1
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+ throw std::logic_error("PPL::fpu_initialize_control_functions():"
+ " cannot control the FPU");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ throw std::logic_error("PPL::fpu_get_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_set_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_save_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+ throw std::logic_error("PPL::fpu_reset_inexact():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+ throw std::logic_error("PPL::fpu_check_inexact():"
+ " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_none_inlines_hh)
diff --git a/src/fpu-sparc_inlines.hh b/src/fpu-sparc_inlines.hh
new file mode 100644
index 0000000..969a840
--- /dev/null
+++ b/src/fpu-sparc_inlines.hh
@@ -0,0 +1,77 @@
+/* SPARC floating point unit related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_sparc_inlines_hh
+#define PPL_fpu_sparc_inlines_hh 1
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define PPL_FPU_TONEAREST ((int) FP_RN)
+#define PPL_FPU_UPWARD ((int) FP_RP)
+#define PPL_FPU_DOWNWARD ((int) FP_RM)
+#define PPL_FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fpgetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
+}
+
+inline void
+fpu_reset_inexact() {
+ fp_except except = fpgetmask();
+ except &= ~FP_X_IMP;
+ fpsetmask(except);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+ return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_IEEEFP_H)
+
+#endif // !defined(PPL_fpu_sparc_inlines_hh)
diff --git a/src/fpu_defs.hh b/src/fpu_defs.hh
new file mode 100644
index 0000000..dce91e4
--- /dev/null
+++ b/src/fpu_defs.hh
@@ -0,0 +1,104 @@
+/* Floating point unit related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_defs_hh
+#define PPL_fpu_defs_hh 1
+
+#include "fpu_types.hh"
+#include "compiler.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Functions Controlling Floating Point Unit
+//@{
+
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+ Sets the FPU rounding direction to \p dir and returns the rounding
+ control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+ Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+ computation</EM> status, and returns the rounding control word
+ previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+ Queries the <EM>inexact computation</EM> status.
+
+ Returns 0 if the computation was definitely exact, 1 if it was
+ definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+//@} // Functions Controlling Floating Point Unit
+
+} // namespace Parma_Polyhedra_Library
+
+#if PPL_CAN_CONTROL_FPU
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+#include "fpu-ia32_inlines.hh"
+#elif defined(PPL_HAVE_IEEEFP_H) \
+ && (defined(__sparc) \
+ || defined(sparc) \
+ || defined(__sparc__))
+#include "fpu-sparc_inlines.hh"
+#elif defined(PPL_HAVE_FENV_H)
+#include "fpu-c99_inlines.hh"
+#else
+#error "PPL_CAN_CONTROL_FPU evaluates to true: why?"
+#endif
+
+#else // !PPL_CAN_CONTROL_FPU
+
+#include "fpu-none_inlines.hh"
+
+#endif // !PPL_CAN_CONTROL_FPU
+
+#endif // !defined(PPL_fpu_defs_hh)
diff --git a/src/fpu_types.hh b/src/fpu_types.hh
new file mode 100644
index 0000000..e76c3a9
--- /dev/null
+++ b/src/fpu_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_fpu_types_hh
+#define PPL_fpu_types_hh 1
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_types_hh)
diff --git a/src/globals.cc b/src/globals.cc
new file mode 100644
index 0000000..a6f3517
--- /dev/null
+++ b/src/globals.cc
@@ -0,0 +1,59 @@
+/* Definitions of global objects.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "globals_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+const Throwable* volatile abandon_expensive_computations = 0;
+
+// Initialize Weightwatch_Traits static data members.
+Weightwatch_Traits::Threshold Weightwatch_Traits::weight = 0;
+void (*Weightwatch_Traits::check_function)(void) = 0;
+
+#ifndef NDEBUG
+
+unsigned int In_Assert::count = 0;
+
+#endif
+
+
+dimension_type
+check_space_dimension_overflow(const dimension_type dim,
+ const dimension_type max,
+ const char* domain,
+ const char* method,
+ const char* reason) {
+ if (dim > max) {
+ std::ostringstream s;
+ s << domain << method << ":" << std::endl
+ << reason << ".";
+ throw std::length_error(s.str());
+ }
+ return dim;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/globals_defs.hh b/src/globals_defs.hh
new file mode 100644
index 0000000..d5907b2
--- /dev/null
+++ b/src/globals_defs.hh
@@ -0,0 +1,569 @@
+/* Declarations of global objects.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_globals_defs_hh
+#define PPL_globals_defs_hh 1
+
+#include "globals_types.hh"
+#include "C_Integer.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include "Temp_defs.hh"
+#include <exception>
+#include <gmpxx.h>
+
+#ifndef PPL_PROFILE_ADD_WEIGHT
+#define PPL_PROFILE_ADD_WEIGHT 0
+#endif
+
+#if defined(NDEBUG) && PPL_PROFILE_ADD_WEIGHT
+#include "Weight_Profiler_defs.hh"
+#endif
+
+#if defined(NDEBUG)
+
+#if PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() Weight_Profiler::begin()
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ static Weight_Profiler wp__(__FILE__, __LINE__, delta); \
+ wp__.end(); \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ static Weight_Profiler wp__(__FILE__, __LINE__, delta); \
+ wp__.end(factor); \
+ } while (false)
+
+#else // !PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() \
+ do { \
+ } while (false)
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ Weightwatch_Traits::weight += (delta); \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ Weightwatch_Traits::weight += (delta)*(factor); \
+ } while (false)
+
+#endif // !PPL_PROFILE_ADD_WEIGHT
+
+#else // !defined(NDEBUG)
+
+#define WEIGHT_BEGIN()
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ if (!In_Assert::asserting()) \
+ Weightwatch_Traits::weight += delta; \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ if (!In_Assert::asserting()) \
+ Weightwatch_Traits::weight += delta * factor; \
+ } while (false)
+
+#endif // !defined(NDEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the hash code for space dimension \p dim.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int32_t
+hash_code_from_dimension(dimension_type dim);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Make sure swap() is specialized when needed.
+
+ This will cause a compile-time error whenever a specialization for \p T
+ is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+ PPL_COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
+}
+
+/*! \brief
+ Declare a local variable named \p id, of type Coefficient, and containing
+ an unknown initial value.
+
+ Use of this macro to declare temporaries of type Coefficient results
+ in decreased memory allocation overhead and in better locality.
+*/
+#define PPL_DIRTY_TEMP_COEFFICIENT(id) \
+PPL_DIRTY_TEMP(Parma_Polyhedra_Library::Coefficient, id)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+ \return
+ The actual capacity to be allocated.
+
+ \param requested_size
+ The number of elements we need.
+
+ \param maximum_size
+ The maximum number of elements to be allocated. It is assumed
+ to be no less than \p requested_size.
+
+ Computes a capacity given a requested size.
+ Allows for speculative allocation aimed at reducing the number of
+ reallocations enough to guarantee amortized constant insertion time
+ for our vector-like data structures. In all cases, the speculative
+ allocation will not exceed \p maximum_size.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+compute_capacity(dimension_type requested_size,
+ dimension_type maximum_size);
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Traits class for the deterministic timeout mechanism.
+/*! \ingroup PPL_CXX_interface
+ This abstract base class should be instantiated by those users
+ willing to provide a polynomial upper bound to the time spent
+ by any invocation of a library operator.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Weightwatch_Traits {
+ //! The type used to specify thresholds for computational weight.
+ typedef unsigned long long Threshold;
+
+ //! The type used to specify increments of computational weight.
+ typedef unsigned long long Delta;
+
+ //! Returns the current computational weight.
+ static const Threshold& get();
+
+ //! Compares the two weights \p a and \p b.
+ static bool less_than(const Threshold& a, const Threshold& b);
+
+ //! Computes a \c Delta value from \p unscaled and \p scale.
+ /*!
+ \return
+ \f$u \cdot 2^s\f$, where \f$u\f$ is the value of \p unscaled and
+ \f$s\f$ is the value of \p scale.
+
+ \param unscaled
+ The value of delta before scaling.
+
+ \param scale
+ The scaling to be applied to \p unscaled.
+ */
+ static Delta compute_delta(unsigned long unscaled, unsigned scale);
+
+ //! Sets \p threshold to be \p delta units bigger than the current weight.
+ static void from_delta(Threshold& threshold, const Delta& delta);
+
+ //! The current computational weight.
+ static Threshold weight;
+
+ /*! \brief
+ A pointer to the function that has to be called when checking
+ the reaching of thresholds.
+
+ The pointer can be null if no thresholds are set.
+ */
+ static void (*check_function)(void);
+};
+
+
+#ifndef NDEBUG
+
+class In_Assert {
+private:
+ //! Non zero during evaluation of PPL_ASSERT expression.
+ static unsigned int count;
+public:
+ In_Assert() {
+ ++count;
+ }
+ ~In_Assert() {
+ --count;
+ }
+ static bool asserting() {
+ return count != 0;
+ }
+};
+
+#endif
+
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+ This abstract base class should be instantiated by those users
+ willing to provide a polynomial upper bound to the time spent
+ by any invocation of a library operator.
+*/
+class Throwable {
+public:
+ //! Throws the user defined exception object.
+ virtual void throw_me() const = 0;
+
+ //! Virtual destructor.
+ virtual ~Throwable();
+};
+
+/*! \brief
+ A pointer to an exception object.
+
+ \ingroup PPL_CXX_interface
+ This pointer, which is initialized to zero, is repeatedly checked
+ along any super-linear (i.e., computationally expensive) computation
+ path in the library.
+ When it is found nonzero the exception it points to is thrown.
+ In other words, making this pointer point to an exception (and
+ leaving it in this state) ensures that the library will return
+ control to the client application, possibly by throwing the given
+ exception, within a time that is a linear function of the size
+ of the representation of the biggest object (powerset of polyhedra,
+ polyhedron, system of constraints or generators) on which the library
+ is operating upon.
+
+ \note
+ The only sensible way to assign to this pointer is from within a
+ signal handler or from a parallel thread. For this reason, the
+ library, apart from ensuring that the pointer is initially set to zero,
+ never assigns to it. In particular, it does not zero it again when
+ the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If the pointer abandon_expensive_computations is found
+ to be nonzero, the exception it points to is thrown.
+
+ \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+ Tag class to distinguish those constructors that recycle the data
+ structures of their arguments, instead of taking a copy.
+*/
+struct Recycle_Input {
+};
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#define PPL_OUTPUT_DECLARATIONS \
+ /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+ void ascii_dump() const; \
+ /*! \brief Writes to \p s an ASCII representation of \p *this. */ \
+ void ascii_dump(std::ostream& s) const; \
+ /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */ \
+ void print() const;
+
+#define PPL_OUTPUT_DEFINITIONS(class_name) \
+ void \
+ Parma_Polyhedra_Library::class_name::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ void \
+ Parma_Polyhedra_Library::class_name::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name) \
+ void \
+ Parma_Polyhedra_Library::class_name::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ void \
+ Parma_Polyhedra_Library::class_name::print() const { \
+ std::cerr << "No user level output operator defined " \
+ << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+ }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix) \
+ template <typename type_symbol> \
+ void \
+ class_prefix::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol> \
+ void \
+ class_prefix::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \
+ type_symbol2, \
+ class_prefix) \
+ template <typename type_symbol1, typename type_symbol2> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)> \
+ ::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol1, typename type_symbol2> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)> \
+ ::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \
+ type_symbol2, \
+ type_symbol3, \
+ class_prefix) \
+ template <typename type_symbol1, typename type_symbol2, \
+ typename type_symbol3> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2, \
+ PPL_U(type_symbol3)>::ascii_dump() \
+ const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol1, typename type_symbol2, \
+ typename type_symbol3> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2, \
+ PPL_U(type_symbol3)>::print() \
+ const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+ template <typename type_symbol> \
+ void \
+ class_prefix::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol> \
+ void \
+ class_prefix::print() const { \
+ std::cerr << "No user level output operator defined " \
+ << "for " PPL_XSTR(class_prefix) << "." << std::endl; \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if \p c is any kind of space character.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_space(char c);
+
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type> {
+ enum {
+ value = (v >= static_cast<long long>(C_Integer<T>::min)
+ && v <= static_cast<long long>(C_Integer<T>::max))
+ };
+};
+
+template <typename T, T v>
+struct TConstant {
+ static const T value = v;
+};
+
+
+template <typename T, T v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+ typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+//! \cond
+// Keep Doxygen off until it learns how to deal properly with `||'.
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+ typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+ && (prefer_signed
+ || !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+ : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+ typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+ && (!prefer_signed
+ || !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+ : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+//! \endcond
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Memory Size Inspection Functions
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ For native types, returns the total size in bytes of the memory
+ occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ For native types, returns the size in bytes of the memory managed
+ by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@} // Memory Size Inspection Functions
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+ : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+ return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
+void ascii_dump(std::ostream& s, Representation r);
+bool ascii_load(std::istream& s, Representation& r);
+
+dimension_type
+check_space_dimension_overflow(dimension_type dim,
+ dimension_type max,
+ const char* domain,
+ const char* method,
+ const char* reason);
+
+template <typename RA_Container>
+typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n);
+
+template <typename RA_Container>
+typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n);
+
+dimension_type
+least_significant_one_mask(dimension_type i);
+
+} // namespace Parma_Polyhedra_Library
+
+// By default, use sparse matrices both for MIP_Problem and PIP_Problem.
+#ifndef PPL_USE_SPARSE_MATRIX
+#define PPL_USE_SPARSE_MATRIX 1
+#endif
+
+#include "globals_inlines.hh"
+
+#endif // !defined(PPL_globals_defs_hh)
diff --git a/src/globals_inlines.hh b/src/globals_inlines.hh
new file mode 100644
index 0000000..7aabcf0
--- /dev/null
+++ b/src/globals_inlines.hh
@@ -0,0 +1,190 @@
+/* Implementation of global objects: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_globals_inlines_hh
+#define PPL_globals_inlines_hh 1
+
+#include "compiler.hh"
+#include <limits>
+#include <cassert>
+#include <istream>
+#include <ostream>
+#include <cctype>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+ return std::numeric_limits<dimension_type>::max();
+}
+
+inline int32_t
+hash_code_from_dimension(dimension_type dim) {
+ const dimension_type divisor = 1U << (32 - 1);
+ dim = dim % divisor;
+ return static_cast<int32_t>(dim);
+}
+
+inline const Weightwatch_Traits::Threshold&
+Weightwatch_Traits::get() {
+ return weight;
+}
+
+inline bool
+Weightwatch_Traits::less_than(const Threshold& a, const Threshold& b) {
+ return b - a < (1ULL << (sizeof_to_bits(sizeof(Threshold)) - 1));
+}
+
+inline Weightwatch_Traits::Delta
+Weightwatch_Traits::compute_delta(unsigned long unscaled, unsigned scale) {
+ if ((std::numeric_limits<Delta>::max() >> scale) < unscaled)
+ throw std::invalid_argument("PPL::Weightwatch_Traits::"
+ "compute_delta(u, s):\n"
+ "values of u and s cause wrap around.");
+ return static_cast<Delta>(unscaled) << scale;
+}
+
+inline void
+Weightwatch_Traits::from_delta(Threshold& threshold, const Delta& delta) {
+ threshold = weight + delta;
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+#ifndef NDEBUG
+ if (In_Assert::asserting())
+ return;
+#endif
+ if (Weightwatch_Traits::check_function != 0)
+ Weightwatch_Traits::check_function();
+ if (const Throwable* const p = abandon_expensive_computations)
+ p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+ const dimension_type maximum_size) {
+ assert(requested_size <= maximum_size);
+ // Speculation factor 2.
+ return (requested_size < maximum_size/2)
+ ? (2*(requested_size + 1))
+ : maximum_size;
+ // Speculation factor 1.5.
+ // return (maximum_size - requested_size > requested_size/2)
+ // ? requested_size + requested_size/2 + 1
+ // : maximum_size;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+ return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+ return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+ return static_cast<memory_size_type>(x.get_mpz_t()[0]._mp_alloc)
+ * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+ return external_memory_in_bytes(x.get_num())
+ + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline void
+ascii_dump(std::ostream& s, Representation r) {
+ if (r == DENSE)
+ s << "DENSE";
+ else
+ s << "SPARSE";
+}
+
+inline bool
+ascii_load(std::istream& is, Representation& r) {
+ std::string s;
+ if (!(is >> s))
+ return false;
+
+ if (s == "DENSE") {
+ r = DENSE;
+ return true;
+ }
+ if (s == "SPARSE") {
+ r = SPARSE;
+ return true;
+ }
+ return false;
+}
+
+inline bool
+is_space(char c) {
+ return isspace(c) != 0;
+}
+
+template <typename RA_Container>
+inline typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n) {
+ typedef typename RA_Container::difference_type diff_t;
+ return cont.begin() + static_cast<diff_t>(n);
+}
+
+template <typename RA_Container>
+inline typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n) {
+ typedef typename RA_Container::difference_type diff_t;
+ return cont.begin() + static_cast<diff_t>(n);
+}
+
+inline dimension_type
+least_significant_one_mask(const dimension_type i) {
+ return i & (~i + 1U);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_inlines_hh)
diff --git a/src/globals_types.hh b/src/globals_types.hh
new file mode 100644
index 0000000..687fa2d
--- /dev/null
+++ b/src/globals_types.hh
@@ -0,0 +1,214 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_globals_types_hh
+#define PPL_globals_types_hh 1
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+ //! The universe element, i.e., the whole vector space.
+ UNIVERSE,
+ //! The empty element, i.e., the empty set.
+ EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+// This must be kept in sync with Result
+enum Relation_Symbol {
+ //! \hideinitializer Equal to.
+ EQUAL = 1U,
+ //! \hideinitializer Less than.
+ LESS_THAN = 2U,
+ //! \hideinitializer Less than or equal to.
+ LESS_OR_EQUAL = LESS_THAN | EQUAL,
+ //! \hideinitializer Greater than.
+ GREATER_THAN = 4U,
+ //! \hideinitializer Greater than or equal to.
+ GREATER_OR_EQUAL = GREATER_THAN | EQUAL,
+ //! \hideinitializer Not equal to.
+ NOT_EQUAL = LESS_THAN | GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+ //! Worst-case polynomial complexity.
+ POLYNOMIAL_COMPLEXITY,
+ //! Worst-case exponential complexity but typically polynomial behavior.
+ SIMPLEX_COMPLEXITY,
+ //! Any complexity.
+ ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+ //! Minimization is requested.
+ MINIMIZATION,
+ //! Maximization is requested.
+ MAXIMIZATION
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Widths of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Width {
+ //! \hideinitializer 8 bits.
+ BITS_8 = 8,
+
+ //! \hideinitializer 16 bits.
+ BITS_16 = 16,
+
+ //! \hideinitializer 32 bits.
+ BITS_32 = 32,
+
+ //! \hideinitializer 64 bits.
+ BITS_64 = 64,
+
+ //! \hideinitializer 128 bits.
+ BITS_128 = 128
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Representation of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Representation {
+ //! Unsigned binary.
+ UNSIGNED,
+
+ /*! \brief
+ Signed binary where negative values are represented by the two's
+ complement of the absolute value.
+ */
+ SIGNED_2_COMPLEMENT
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Overflow behavior of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Overflow {
+ /*! \brief
+ On overflow, wrapping takes place.
+
+ This means that, for a \f$w\f$-bit bounded integer, the computation
+ happens modulo \f$2^w\f$.
+ */
+ OVERFLOW_WRAPS,
+
+ /*! \brief
+ On overflow, the result is undefined.
+
+ This simply means that the result of the operation resulting in an
+ overflow can take any value.
+
+ \note
+ Even though something more serious can happen in the system
+ being analyzed ---due to, e.g., C's undefined behavior---, here we
+ are only concerned with the results of arithmetic operations.
+ It is the responsibility of the analyzer to ensure that other
+ manifestations of undefined behavior are conservatively approximated.
+ */
+ OVERFLOW_UNDEFINED,
+
+ /*! \brief
+ Overflow is impossible.
+
+ This is for the analysis of languages where overflow is trapped
+ before it affects the state, for which, thus, any indication that
+ an overflow may have affected the state is necessarily due to
+ the imprecision of the analysis.
+ */
+ OVERFLOW_IMPOSSIBLE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Possible representations of coefficient sequences (i.e. linear expressions
+ and more complex objects containing linear expressions, e.g. Constraints,
+ Generators, etc.).
+*/
+enum Representation {
+ /*! \brief
+ Dense representation: the coefficient sequence is represented as a vector
+ of coefficients, including the zero coefficients.
+ If there are only a few nonzero coefficients, this representation is
+ faster and also uses a bit less memory.
+ */
+ DENSE,
+
+ /*! \brief
+ Sparse representation: only the nonzero coefficient are stored.
+ If there are many nonzero coefficients, this improves memory consumption
+ and run time (both because there is less data to process in O(n)
+ operations and because finding zeroes/nonzeroes is much faster since
+ zeroes are not stored at all, so any stored coefficient is nonzero).
+ */
+ SPARSE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Floating point formats known to the library.
+
+ The parameters of each format are defined by a specific struct
+ in file Float_defs.hh. See the section on \ref floating_point
+ "Analysis of floating point computations" for more information.
+*/
+enum Floating_Point_Format {
+ //! IEEE 754 half precision, 16 bits (5 exponent, 10 mantissa).
+ IEEE754_HALF,
+
+ //! IEEE 754 single precision, 32 bits (8 exponent, 23 mantissa).
+ IEEE754_SINGLE,
+
+ //! IEEE 754 double precision, 64 bits (11 exponent, 52 mantissa).
+ IEEE754_DOUBLE,
+
+ //! IEEE 754 quad precision, 128 bits (15 exponent, 112 mantissa).
+ IEEE754_QUAD,
+
+ //! Intel double extended precision, 80 bits (15 exponent, 64 mantissa)
+ INTEL_DOUBLE_EXTENDED,
+
+ //! IBM single precision, 32 bits (7 exponent, 24 mantissa).
+ IBM_SINGLE,
+
+ //! IBM double precision, 64 bits (7 exponent, 56 mantissa).
+ IBM_DOUBLE
+};
+
+struct Weightwatch_Traits;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_types_hh)
diff --git a/src/initializer.hh b/src/initializer.hh
new file mode 100644
index 0000000..f681040
--- /dev/null
+++ b/src/initializer.hh
@@ -0,0 +1,62 @@
+/* Nifty counter object for the initialization of the library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_initializer_hh
+#define PPL_initializer_hh 1
+
+#include "Init_defs.hh"
+
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
+
+static Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+#else
+
+static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
+
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ if (Parma_Polyhedra_Library_initializer_p == 0)
+ Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
+
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0);
+ delete Parma_Polyhedra_Library_initializer_p;
+ Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
+
+} //namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_initializer_hh)
diff --git a/src/intervals_defs.hh b/src/intervals_defs.hh
new file mode 100644
index 0000000..59574c4
--- /dev/null
+++ b/src/intervals_defs.hh
@@ -0,0 +1,473 @@
+/* Helper classes for intervals.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_intervals_defs_hh
+#define PPL_intervals_defs_hh 1
+
+#include "assert.hh"
+#include <cstdlib>
+
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The result of an operation on intervals.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum I_Result {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_EMPTY = 1U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may have only one value.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SINGLETON = 2U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief \hideinitializer
+ Result may have more than one value, but it is not the domain universe.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SOME = 4U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_UNIVERSE = 8U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_EMPTY = I_SINGLETON | I_SOME | I_UNIVERSE,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_ANY = I_EMPTY | I_NOT_EMPTY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_UNIVERSE = I_EMPTY | I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is neither empty nor the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_DEGENERATE = I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is definitely exact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_EXACT = 16,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is definitely inexact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_INEXACT = 32,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation has definitely changed the set.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_CHANGED = 64,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation has left the set definitely unchanged.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_UNCHANGED = 128,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation is undefined for some combination of values.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SINGULARITIES = 256
+};
+
+inline I_Result
+operator|(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ | static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator&(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ & static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator-(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ & ~static_cast<unsigned>(b));
+}
+
+template <typename Criteria, typename T>
+struct Use_By_Ref;
+
+struct Use_Slow_Copy;
+template <typename T>
+struct Use_By_Ref<Use_Slow_Copy, T>
+ : public Bool<Slow_Copy<T>::value> {
+};
+
+struct By_Value;
+template <typename T>
+struct Use_By_Ref<By_Value, T>
+ : public False {
+};
+
+struct By_Ref;
+template <typename T>
+struct Use_By_Ref<By_Ref, T>
+ : public True {
+};
+
+template <typename T, typename Criteria = Use_Slow_Copy, typename Enable = void>
+class Val_Or_Ref;
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+ typename Enable_If<!Use_By_Ref<Criteria, T>::value>::type> {
+ T value;
+public:
+ typedef T Arg_Type;
+ typedef T Return_Type;
+ Val_Or_Ref()
+ : value() {
+ }
+ explicit Val_Or_Ref(Arg_Type v, bool = false)
+ : value(v) {
+ }
+ Val_Or_Ref& operator=(Arg_Type v) {
+ value = v;
+ return *this;
+ }
+ void set(Arg_Type v, bool = false) {
+ value = v;
+ }
+ Return_Type get() const {
+ return value;
+ }
+ operator Return_Type () const {
+ return get();
+ }
+};
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+ typename Enable_If<Use_By_Ref<Criteria, T>::value>::type> {
+ const T* ptr;
+public:
+ typedef T& Arg_Type;
+ typedef const T& Return_Type;
+ Val_Or_Ref()
+ : ptr(0) {
+ }
+ explicit Val_Or_Ref(Arg_Type v)
+ : ptr(&v) {
+ }
+ Val_Or_Ref(const T& v, bool)
+ : ptr(&v) {
+ }
+ Val_Or_Ref& operator=(Arg_Type v) {
+ ptr = &v;
+ return *this;
+ }
+ void set(Arg_Type v) {
+ ptr = &v;
+ }
+ void set(const T& v, bool) {
+ ptr = &v;
+ }
+ Return_Type get() const {
+ return *ptr;
+ }
+ operator Return_Type () const {
+ return get();
+ }
+};
+
+class I_Constraint_Base {
+};
+
+template <typename Derived>
+class I_Constraint_Common : public I_Constraint_Base {
+public:
+ template <typename T>
+ Result convert_real(T& to) const {
+ const Derived& c = static_cast<const Derived&>(*this);
+ Result r = c.rel();
+ switch (r) {
+ case V_EMPTY:
+ case V_LGE:
+ return r;
+ case V_LE:
+ r = assign_r(to, c.value(), (ROUND_UP | ROUND_STRICT_RELATION));
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_LE;
+ goto lt;
+ case V_LT:
+ r = assign_r(to, c.value(), ROUND_UP);
+ r = result_relation_class(r);
+ lt:
+ switch (r) {
+ case V_EMPTY:
+ case V_LT_PLUS_INFINITY:
+ case V_EQ_MINUS_INFINITY:
+ return r;
+ case V_LT:
+ case V_LE:
+ case V_EQ:
+ return V_LT;
+ default:
+ break;
+ }
+ break;
+ case V_GE:
+ r = assign_r(to, c.value(), (ROUND_DOWN | ROUND_STRICT_RELATION));
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_GE;
+ goto gt;
+ case V_GT:
+ r = assign_r(to, c.value(), ROUND_DOWN);
+ r = result_relation_class(r);
+ gt:
+ switch (r) {
+ case V_EMPTY:
+ case V_GT_MINUS_INFINITY:
+ case V_EQ_PLUS_INFINITY:
+ return r;
+ case V_LT:
+ case V_LE:
+ case V_EQ:
+ return V_GT;
+ default:
+ break;
+ }
+ break;
+ case V_EQ:
+ r = assign_r(to, c.value(), ROUND_CHECK);
+ r = result_relation_class(r);
+ PPL_ASSERT(r != V_LT && r != V_GT);
+ if (r == V_EQ)
+ return V_EQ;
+ else
+ return V_EMPTY;
+ case V_NE:
+ r = assign_r(to, c.value(), ROUND_CHECK);
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_NE;
+ else
+ return V_LGE;
+ default:
+ break;
+ }
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ template <typename T>
+ Result convert_real(T& to1, Result& rel2, T& to2) const {
+ const Derived& c = static_cast<const Derived&>(*this);
+ Result rel1;
+ if (c.rel() != V_EQ) {
+ rel2 = convert(to2);
+ return V_LGE;
+ }
+ rel2 = assign_r(to2, c.value(), ROUND_UP);
+ rel2 = result_relation_class(rel2);
+ switch (rel2) {
+ case V_EMPTY:
+ case V_EQ_MINUS_INFINITY:
+ case V_EQ:
+ return V_LGE;
+ default:
+ break;
+ }
+ rel1 = assign_r(to1, c.value(), ROUND_DOWN);
+ rel1 = result_relation_class(rel1);
+ switch (rel1) {
+ case V_EQ:
+ PPL_ASSERT(rel2 == V_LE);
+ goto eq;
+ case V_EQ_PLUS_INFINITY:
+ case V_EMPTY:
+ rel2 = rel1;
+ return V_LGE;
+ case V_GE:
+ if (rel2 == V_LE && to1 == to2) {
+ eq:
+ rel2 = V_EQ;
+ return V_LGE;
+ }
+ /* Fall through*/
+ case V_GT:
+ case V_GT_MINUS_INFINITY:
+ return rel1;
+ default:
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ switch (rel2) {
+ case V_LE:
+ case V_LT:
+ case V_LT_PLUS_INFINITY:
+ return rel1;
+ default:
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ }
+ template <typename T>
+ Result convert_integer(T& to) const {
+ Result rel = convert_real(to);
+ switch (rel) {
+ case V_LT:
+ if (is_integer(to)) {
+ rel = sub_assign_r(to, to, T(1), (ROUND_UP | ROUND_STRICT_RELATION));
+ rel = result_relation_class(rel);
+ return (rel == V_EQ) ? V_LE : rel;
+ }
+ /* Fall through */
+ case V_LE:
+ rel = floor_assign_r(to, to, ROUND_UP);
+ rel = result_relation_class(rel);
+ PPL_ASSERT(rel == V_EQ);
+ return V_LE;
+ case V_GT:
+ if (is_integer(to)) {
+ rel = add_assign_r(to, to, T(1), (ROUND_DOWN | ROUND_STRICT_RELATION));
+ rel = result_relation_class(rel);
+ return (rel == V_EQ) ? V_GE : rel;
+ }
+ /* Fall through */
+ case V_GE:
+ rel = ceil_assign_r(to, to, ROUND_DOWN);
+ rel = result_relation_class(rel);
+ PPL_ASSERT(rel == V_EQ);
+ return V_GE;
+ case V_EQ:
+ if (is_integer(to))
+ return V_EQ;
+ return V_EMPTY;
+ case V_NE:
+ if (is_integer(to))
+ return V_NE;
+ return V_LGE;
+ default:
+ return rel;
+ }
+ }
+};
+
+struct I_Constraint_Rel {
+ Result rel;
+ I_Constraint_Rel(Result r)
+ : rel(r) {
+ PPL_ASSERT(result_relation_class(r) == r);
+ }
+ I_Constraint_Rel(Relation_Symbol r)
+ : rel(static_cast<Result>(r)) {
+ }
+ operator Result() const {
+ return rel;
+ }
+};
+
+template <typename T, typename Val_Or_Ref_Criteria = Use_Slow_Copy,
+ bool extended = false>
+class I_Constraint
+ : public I_Constraint_Common<I_Constraint<T, Val_Or_Ref_Criteria,
+ extended> > {
+ typedef Val_Or_Ref<T, Val_Or_Ref_Criteria> Val_Ref;
+ typedef typename Val_Ref::Arg_Type Arg_Type;
+ typedef typename Val_Ref::Return_Type Return_Type;
+ Result rel_;
+ Val_Ref value_;
+public:
+ typedef T value_type;
+ explicit I_Constraint()
+ : rel_(V_LGE) {
+ }
+ I_Constraint(I_Constraint_Rel r, Arg_Type v)
+ : rel_(r), value_(v) {
+ }
+ I_Constraint(I_Constraint_Rel r, const T& v, bool force)
+ : rel_(r), value_(v, force) {
+ }
+ template <typename U>
+ I_Constraint(I_Constraint_Rel r, const U& v)
+ : rel_(r), value_(v) {
+ }
+ void set(I_Constraint_Rel r, Arg_Type v) {
+ rel_ = r;
+ value_.set(v);
+ }
+ void set(I_Constraint_Rel r, const T& v, bool force) {
+ rel_ = r;
+ value_.set(v, force);
+ }
+ template <typename U>
+ void set(I_Constraint_Rel r, const U& v) {
+ rel_ = r;
+ value_.set(v);
+ }
+ Return_Type value() const {
+ return value_;
+ }
+ Result rel() const {
+ return rel_;
+ }
+};
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v) {
+ return I_Constraint<T>(rel, v);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force) {
+ return I_Constraint<T>(rel, v, force);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, T& v) {
+ return I_Constraint<T>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force,
+ const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v, force);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, T& v, const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_intervals_defs_hh)
diff --git a/src/iterator_to_const_defs.hh b/src/iterator_to_const_defs.hh
new file mode 100644
index 0000000..74a889b
--- /dev/null
+++ b/src/iterator_to_const_defs.hh
@@ -0,0 +1,221 @@
+/* iterator_to_const and const_iterator_to_const class declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_iterator_to_const_hh
+#define PPL_iterator_to_const_hh 1
+
+#include "iterator_to_const_types.hh"
+#include "Powerset_types.hh"
+//#include "Ask_Tell_types.hh"
+#include <iterator>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+ This template class implements a bidirectional <EM>read-only</EM>
+ iterator on the sequence of objects <CODE>Container</CODE>.
+ By using this iterator class it is not possible to modify the objects
+ contained in <CODE>Container</CODE>; rather, object modification has
+ to be implemented by object replacement, i.e., by using the methods
+ provided by <CODE>Container</CODE> to remove/insert objects.
+ Such a policy (a modifiable container of read-only objects) allows
+ for a reliable enforcement of invariants (such as sortedness of the
+ objects in the sequence).
+
+ \note
+ For any developers' need, suitable friend declarations allow for
+ accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+ //! The type of the underlying mutable iterator.
+ typedef typename Container::iterator Base;
+
+ //! A shortcut for naming the const_iterator traits.
+ typedef typename
+ std::iterator_traits<typename Container::const_iterator> Traits;
+
+ //! A (mutable) iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level iterator.
+ iterator_to_const(const Base& b);
+
+ friend class const_iterator_to_const<Container>;
+ template <typename T> friend class Powerset;
+
+public:
+ // Same traits of the const_iterator, therefore
+ // forbidding the direct modification of sequence elements.
+ typedef typename Traits::iterator_category iterator_category;
+ typedef typename Traits::value_type value_type;
+ typedef typename Traits::difference_type difference_type;
+ typedef typename Traits::pointer pointer;
+ typedef typename Traits::reference reference;
+
+ //! Default constructor.
+ iterator_to_const();
+
+ //! Copy constructor.
+ iterator_to_const(const iterator_to_const& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect access operator.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ iterator_to_const& operator++();
+
+ //! Postfix increment operator.
+ iterator_to_const operator++(int);
+
+ //! Prefix decrement operator.
+ iterator_to_const& operator--();
+
+ //! Postfix decrement operator.
+ iterator_to_const operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const iterator_to_const& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+ This class, besides implementing a read-only bidirectional iterator
+ on a read-only sequence of objects, ensures interoperability
+ with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+ //! The type of the underlying %const_iterator.
+ typedef typename Container::const_iterator Base;
+
+ //! A shortcut for naming traits.
+ typedef typename std::iterator_traits<Base> Traits;
+
+ //! A %const_iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level const_iterator.
+ const_iterator_to_const(const Base& b);
+
+ friend class iterator_to_const<Container>;
+ template <typename T> friend class Powerset;
+
+public:
+ // Same traits of the underlying const_iterator.
+ typedef typename Traits::iterator_category iterator_category;
+ typedef typename Traits::value_type value_type;
+ typedef typename Traits::difference_type difference_type;
+ typedef typename Traits::pointer pointer;
+ typedef typename Traits::reference reference;
+
+ //! Default constructor.
+ const_iterator_to_const();
+
+ //! Copy constructor.
+ const_iterator_to_const(const const_iterator_to_const& y);
+
+ //! Constructs from the corresponding non-const iterator.
+ const_iterator_to_const(const iterator_to_const<Container>& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator_to_const& operator++();
+
+ //! Postfix increment operator.
+ const_iterator_to_const operator++(int);
+
+ //! Prefix decrement operator.
+ const_iterator_to_const& operator--();
+
+ //! Postfix decrement operator.
+ const_iterator_to_const operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const const_iterator_to_const& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Mixed comparison operator: returns <CODE>true</CODE> if and only
+ if (the const version of) \p x is identical to \p y.
+
+ \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Mixed comparison operator: returns <CODE>true</CODE> if and only
+ if (the const version of) \p x is different from \p y.
+
+ \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "iterator_to_const_inlines.hh"
+
+#endif // !defined(PPL_iterator_to_const_hh)
diff --git a/src/iterator_to_const_inlines.hh b/src/iterator_to_const_inlines.hh
new file mode 100644
index 0000000..1eb5e6b
--- /dev/null
+++ b/src/iterator_to_const_inlines.hh
@@ -0,0 +1,202 @@
+/* iterator_to_const and const_iterator_to_const class implementations:
+ inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_iterator_to_const_inlines_hh
+#define PPL_iterator_to_const_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+ : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+ : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+ : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+ return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+ return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+ iterator_to_const tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+ iterator_to_const tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+ return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+ return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+ : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+ : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+ : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+ return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+ return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+ const_iterator_to_const tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+ const_iterator_to_const tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+ return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+ return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+ : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y) {
+ return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_inlines_hh)
diff --git a/src/iterator_to_const_types.hh b/src/iterator_to_const_types.hh
new file mode 100644
index 0000000..4b335a2
--- /dev/null
+++ b/src/iterator_to_const_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_iterator_to_const_types_hh
+#define PPL_iterator_to_const_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_types_hh)
diff --git a/src/linearize.hh b/src/linearize.hh
new file mode 100644
index 0000000..a43ed21
--- /dev/null
+++ b/src/linearize.hh
@@ -0,0 +1,871 @@
+/* Linearization function implementation.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_linearize_hh
+#define PPL_linearize_hh 1
+
+#include "Concrete_Expression_defs.hh"
+#include "Float_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "Box_defs.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ sum of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>ADD</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of sum floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+ error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+add_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::ADD);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+
+ result += linearized_second_operand;
+ linearized_second_operand.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ difference of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>SUB</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of difference floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+ operators on linear form such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \adifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ on \f$\cV\f$ as follows:
+ \f[
+ \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+ error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+sub_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::SUB);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+
+ result -= linearized_second_operand;
+ linearized_second_operand.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ product of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>MUL</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of multiplication floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+ operators on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ i
+ \amlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \amifp i'\right)
+ + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left([a, b]
+ \amlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+ \aslf
+ \left([a, b]
+ \amlf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1].
+ \f].
+
+ Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+ \f]
+
+ Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}
+ \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+ of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+ and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+ <CODE>compute_absolute_error</CODE>.
+
+ Even though we intervalize the first operand in the above example, the
+ actual implementation utilizes an heuristics for choosing which of the two
+ operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+mul_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::MUL);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ /*
+ FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+ decide which of the two linear forms must be intervalized, as described
+ in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+ thesis "Weakly Relational Numerical Abstract Domains".
+ In this Section are also described other multiplication strategies, such
+ as All-Cases, Relative-Size Local, Simplification-Driven Global and
+ Homogeneity Global.
+ */
+
+ // Here we choose which of the two linear forms must be intervalized.
+
+ // true if we intervalize the first form, false if we intervalize the second.
+ bool intervalize_first;
+ FP_Linear_Form linearized_first_operand;
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store,
+ linearized_first_operand))
+ return false;
+ FP_Interval_Type intervalized_first_operand;
+ if (!linearized_first_operand.intervalize(oracle, intervalized_first_operand))
+ return false;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ if (!linearized_second_operand.intervalize(oracle,
+ intervalized_second_operand))
+ return false;
+
+ // FIXME: we are not sure that what we do here is policy-proof.
+ if (intervalized_first_operand.is_bounded()) {
+ if (intervalized_second_operand.is_bounded()) {
+ analyzer_format first_interval_size
+ = intervalized_first_operand.upper()
+ - intervalized_first_operand.lower();
+ analyzer_format second_interval_size
+ = intervalized_second_operand.upper()
+ - intervalized_second_operand.lower();
+ if (first_interval_size <= second_interval_size)
+ intervalize_first = true;
+ else
+ intervalize_first = false;
+ }
+ else
+ intervalize_first = true;
+ }
+ else {
+ if (intervalized_second_operand.is_bounded())
+ intervalize_first = false;
+ else
+ return false;
+ }
+
+ // Here we do the actual computation.
+ // For optimizing, we store the relative error directly into result.
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ if (intervalize_first) {
+ linearized_second_operand.relative_error(analyzed_format, result);
+ linearized_second_operand *= intervalized_first_operand;
+ result *= intervalized_first_operand;
+ result += linearized_second_operand;
+ }
+ else {
+ linearized_first_operand.relative_error(analyzed_format, result);
+ linearized_first_operand *= intervalized_second_operand;
+ result *= intervalized_second_operand;
+ result += linearized_first_operand;
+ }
+
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ division of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>DIV</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of division floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+ operator on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adivlf
+ i'
+ =
+ \left(i \adivifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+ \f]
+ Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$,
+ we construct the interval linear form
+ \f$
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ \f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adivlf
+ [a, b]\right)
+ \aslf
+ \left(\varepsilon_{\mathbf{f}}\left(
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \adivlf
+ [a, b]\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1],
+ \f]
+ given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1} \oslash \iota\left(
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+ of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+ and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+ <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+div_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::DIV);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ if (!linearized_second_operand.intervalize(oracle,
+ intervalized_second_operand))
+ return false;
+
+ // Check if we may divide by zero.
+ if ((intervalized_second_operand.lower_is_boundary_infinity() ||
+ intervalized_second_operand.lower() <= 0) &&
+ (intervalized_second_operand.upper_is_boundary_infinity() ||
+ intervalized_second_operand.upper() >= 0))
+ return false;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result /= intervalized_second_operand;
+ rel_error /= intervalized_second_operand;
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a cast
+ floating point expression.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param cast_expr
+ The cast operator concrete expression to linearize.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+cast_linearize(const Cast_Operator<Target>& cast_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ Floating_Point_Format analyzed_format =
+ cast_expr.type().floating_point_format();
+ const Concrete_Expression<Target>* cast_arg = cast_expr.argument();
+ if (cast_arg->type().is_floating_point()) {
+ if (!linearize(*cast_arg, oracle, lf_store, result))
+ return false;
+ if (!is_less_precise_than(analyzed_format,
+ cast_arg->type().floating_point_format()) ||
+ result == FP_Linear_Form(FP_Interval_Type(0)) ||
+ result == FP_Linear_Form(FP_Interval_Type(1)))
+ /*
+ FIXME: find a general way to check if the casted constant
+ is exactly representable in the less precise format.
+ */
+ /*
+ We are casting to a more precise format or casting
+ a definitely safe value: do not add errors.
+ */
+ return true;
+ }
+ else {
+ FP_Interval_Type expr_value;
+ if (!oracle.get_integer_expr_value(*cast_arg, expr_value))
+ return false;
+ result = FP_Linear_Form(expr_value);
+ if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format) ||
+ result == FP_Linear_Form(FP_Interval_Type(0)) ||
+ result == FP_Linear_Form(FP_Interval_Type(1)))
+ /*
+ FIXME: find a general way to check if the casted constant
+ is exactly representable in the less precise format.
+ */
+ /*
+ We are casting to a more precise format or casting
+ a definitely safe value: do not add errors.
+ */
+ return true;
+ }
+
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+//! Linearizes a floating point expression.
+/*! \relates Parma_Polyhedra_Library::Concrete_Expression
+ Makes \p result become a linear form that correctly approximates the
+ value of \p expr in the given composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param expr
+ The concrete expression to linearize.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ Becomes the linearized expression.
+
+ Formally, if \p expr represents the expression \f$e\f$ and
+ \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+ then \p result will become \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ if the linearization succeeds.
+*/
+template <typename Target, typename FP_Interval_Type>
+bool
+linearize(const Concrete_Expression<Target>& expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ PPL_ASSERT(expr.type().is_floating_point());
+ // Check that analyzer_format is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<analyzer_format>::is_exact,
+ "linearize<Target, FP_Interval_Type>:"
+ " FP_Interval_Type is not the type of an interval with floating point boundaries.");
+
+ switch(expr.kind()) {
+ case Integer_Constant<Target>::KIND:
+ PPL_UNREACHABLE;
+ break;
+ case Floating_Point_Constant<Target>::KIND:
+ {
+ const Floating_Point_Constant<Target>* fpc_expr =
+ expr.template as<Floating_Point_Constant>();
+ FP_Interval_Type constant_value;
+ if (!oracle.get_fp_constant_value(*fpc_expr, constant_value))
+ return false;
+ result = FP_Linear_Form(constant_value);
+ return true;
+ }
+ case Unary_Operator<Target>::KIND:
+ {
+ const Unary_Operator<Target>* uop_expr =
+ expr.template as<Unary_Operator>();
+ switch (uop_expr->unary_operator()) {
+ case Unary_Operator<Target>::UPLUS:
+ return linearize(*(uop_expr->argument()), oracle, lf_store, result);
+ case Unary_Operator<Target>::UMINUS:
+ if (!linearize(*(uop_expr->argument()), oracle, lf_store, result))
+ return false;
+
+ result.negate();
+ return true;
+ case Unary_Operator<Target>::BNOT:
+ throw std::runtime_error("PPL internal error: unimplemented");
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ break;
+ }
+ case Binary_Operator<Target>::KIND:
+ {
+ const Binary_Operator<Target>* bop_expr =
+ expr.template as<Binary_Operator>();
+ switch (bop_expr->binary_operator()) {
+ case Binary_Operator<Target>::ADD:
+ return add_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::SUB:
+ return sub_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::MUL:
+ return mul_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::DIV:
+ return div_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::REM:
+ case Binary_Operator<Target>::BAND:
+ case Binary_Operator<Target>::BOR:
+ case Binary_Operator<Target>::BXOR:
+ case Binary_Operator<Target>::LSHIFT:
+ case Binary_Operator<Target>::RSHIFT:
+ // FIXME: can we do better?
+ return false;
+ default:
+ PPL_UNREACHABLE;
+ return false;
+ }
+ break;
+ }
+ case Approximable_Reference<Target>::KIND:
+ {
+ const Approximable_Reference<Target>* ref_expr =
+ expr.template as<Approximable_Reference>();
+ std::set<dimension_type> associated_dimensions;
+ if (!oracle.get_associated_dimensions(*ref_expr, associated_dimensions)
+ || associated_dimensions.empty())
+ /*
+ We were unable to find any associated space dimension:
+ linearization fails.
+ */
+ return false;
+
+ if (associated_dimensions.size() == 1) {
+ /* If a linear form associated to the only referenced
+ space dimension exists in lf_store, return that form.
+ Otherwise, return the simplest linear form. */
+ dimension_type variable_index = *associated_dimensions.begin();
+ PPL_ASSERT(variable_index != not_a_dimension());
+
+ typename FP_Linear_Form_Abstract_Store::const_iterator
+ variable_value = lf_store.find(variable_index);
+ if (variable_value == lf_store.end()) {
+ result = FP_Linear_Form(Variable(variable_index));
+ return true;
+ }
+
+ result = FP_Linear_Form(variable_value->second);
+ /* FIXME: do we really need to contemplate the possibility
+ that an unbounded linear form was saved into lf_store? */
+ return !result.overflows();
+ }
+
+ /*
+ Here associated_dimensions.size() > 1. Try to return the LUB
+ of all intervals associated to each space dimension.
+ */
+ PPL_ASSERT(associated_dimensions.size() > 1);
+ std::set<dimension_type>::const_iterator i = associated_dimensions.begin();
+ std::set<dimension_type>::const_iterator i_end =
+ associated_dimensions.end();
+ FP_Interval_Type lub(EMPTY);
+ for (; i != i_end; ++i) {
+ FP_Interval_Type curr_int;
+ PPL_ASSERT(*i != not_a_dimension());
+ if (!oracle.get_interval(*i, curr_int))
+ return false;
+
+ lub.join_assign(curr_int);
+ }
+
+ result = FP_Linear_Form(lub);
+ return !result.overflows();
+ }
+ case Cast_Operator<Target>::KIND:
+ {
+ const Cast_Operator<Target>* cast_expr =
+ expr.template as<Cast_Operator>();
+ return cast_linearize(*cast_expr, oracle, lf_store, result);
+ }
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_UNREACHABLE;
+ return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_linearize_hh)
diff --git a/src/math_utilities_defs.hh b/src/math_utilities_defs.hh
new file mode 100644
index 0000000..8b13404
--- /dev/null
+++ b/src/math_utilities_defs.hh
@@ -0,0 +1,110 @@
+/* Declarations of some math utility functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_math_utilities_defs_hh
+#define PPL_math_utilities_defs_hh 1
+
+#include "Coefficient_types.hh"
+#include "Checked_Number_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+ Coefficient& numer, Coefficient& denom);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+ divided by \f$g\f$ are assigned to \p n_x and \p n_y, respectively.
+
+ \note
+ \p x and \p n_x may be the same object and likewise for
+ \p y and \p n_y. Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& n_x, Coefficient& n_y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "math_utilities_inlines.hh"
+
+#endif // !defined(PPL_math_utilities_defs_hh)
diff --git a/src/math_utilities_inlines.hh b/src/math_utilities_inlines.hh
new file mode 100644
index 0000000..671bb6b
--- /dev/null
+++ b/src/math_utilities_inlines.hh
@@ -0,0 +1,120 @@
+/* Implementation of some math utility functions: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_math_utilities_inlines_hh
+#define PPL_math_utilities_inlines_hh 1
+
+#include "Coefficient_defs.hh"
+#include <limits>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& n_x, Coefficient& n_y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd_assign(gcd, x, y);
+ exact_div_assign(n_x, x, gcd);
+ exact_div_assign(n_y, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+ PPL_ASSERT(n < unsigned(std::numeric_limits<T>::digits));
+ return ~((~static_cast<T>(0)) << n);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+ Coefficient& numer, Coefficient& denom) {
+ PPL_ASSERT(!is_not_a_number(from)
+ && !is_minus_infinity(from)
+ && !is_plus_infinity(from));
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q, from, ROUND_NOT_NEEDED);
+ numer = q.get_num();
+ denom = q.get_den();
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y) {
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ // Note: this code assumes that a Coefficient is always convertible
+ // to an mpq_class without loss of precision.
+ assign_r(q_x, x, ROUND_NOT_NEEDED);
+ assign_r(q_y, y, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_y, ROUND_NOT_NEEDED);
+ assign_r(to, q_x, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+ if (x > y)
+ x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+ if (x < y)
+ x = y;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x) {
+ T mod;
+ return umod_2exp_assign_r(mod, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+ && mod == 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y) {
+ T negated_x;
+ return neg_assign_r(negated_x, x, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+ && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+ if (x.get_den() <= 0)
+ return false;
+ PPL_DIRTY_TEMP(mpq_class, temp);
+ temp = x;
+ temp.canonicalize();
+ return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_math_utilities_inlines_hh)
diff --git a/src/max_space_dimension.hh b/src/max_space_dimension.hh
new file mode 100644
index 0000000..80c727a
--- /dev/null
+++ b/src/max_space_dimension.hh
@@ -0,0 +1,77 @@
+/* Definition of functions yielding maximal space dimensions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_max_space_dimension_hh
+#define PPL_max_space_dimension_hh 1
+
+#include "Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Rational_Box.hh"
+#include "BD_Shape_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+ // Note: we assume that the powerset and the ask-and-tell construction
+ // do not limit the space dimension more than their parameters.
+ static bool computed = false;
+ static dimension_type d = not_a_dimension();
+ if (!computed) {
+ d = Variable::max_space_dimension();
+ d = std::min(d, C_Polyhedron::max_space_dimension());
+ d = std::min(d, NNC_Polyhedron::max_space_dimension());
+ d = std::min(d, Grid::max_space_dimension());
+ // FIXME: what about all other boxes?
+ d = std::min(d, Rational_Box::max_space_dimension());
+ d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<float>::max_space_dimension());
+ d = std::min(d, BD_Shape<double>::max_space_dimension());
+ d = std::min(d, BD_Shape<long double>::max_space_dimension());
+ d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+ d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+ computed = true;
+ }
+ return d;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_max_space_dimension_hh)
diff --git a/src/meta_programming.hh b/src/meta_programming.hh
new file mode 100644
index 0000000..9a75fb3
--- /dev/null
+++ b/src/meta_programming.hh
@@ -0,0 +1,341 @@
+/* Metaprogramming utilities.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_meta_programming_hh
+#define PPL_meta_programming_hh 1
+
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+ and with value \p value.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value) \
+ enum const_bool_value_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type <CODE>int</CODE>, called \p name
+ and with value \p value.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+ enum anonymous_enum_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type \p type, called \p name
+ and with value \p value. The value of the constant is accessible
+ by means of the syntax <CODE>name()</CODE>.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value) \
+ static type PPL_U(name)() { \
+ return (value); \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type \p type, called \p name
+ and with value \p value. A constant reference to the constant
+ is accessible by means of the syntax <CODE>name()</CODE>.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value) \
+ static const type& PPL_U(name)() { \
+ static type PPL_U(name) = (value); \
+ return (name); \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, so the class is declared but not defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the specialized case with \p b equal to <CODE>true</CODE>,
+ so the class is declared and (trivially) defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
+
+#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix) \
+ enum anonymous_enum_compile_time_check_ ## suffix { \
+ /* If e evaluates to false, then the sizeof cannot be compiled. */ \
+ PPL_COMPILE_TIME_CHECK_NAME(suffix) \
+ = sizeof(Parma_Polyhedra_Library::Compile_Time_Check<(e)>) \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Produces a compilation error if the compile-time constant \p e does
+ not evaluate to <CODE>true</CODE>
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_COMPILE_TIME_CHECK(e, msg) PPL_COMPILE_TIME_CHECK_AUX(e, __LINE__)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to \p b.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+ enum const_bool_value {
+ value = b
+ };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE>.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>false</CODE>.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+ \ingroup PPL_CXX_interface
+ This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+ or \p Derived is a class derived from \p Base.
+
+ \ingroup PPL_CXX_interface
+ \note
+ Care must be taken to use this predicate with template classes.
+ Suppose we have
+ \code
+ template <typename T> struct B;
+ template <typename T> struct D : public B<T>;
+ \endcode
+ Of course, we cannot test if, for some type variable <CODE>U</CODE>, we have
+ <CODE>Is_Same_Or_Derived<B<U>, Type>:: const_bool_value:: value == true</CODE>.
+ But we can do as follows:
+ \code
+ struct B_Base {
+ };
+
+ template <typename T> struct B : public B_Base;
+ \endcode
+ This enables us to inquire
+ <CODE>Is_Same_Or_Derived<B_Base, Type>:: const_bool_value:: value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ struct Any {
+ //! The universal constructor.
+ template <typename T>
+ Any(const T&);
+ };
+
+ //! Overloading with \p Base.
+ static char func(const Base&);
+
+ //! Overloading with \p Any.
+ static double func(Any);
+
+ //! A function obtaining a const reference to a \p Derived object.
+ static const Derived& derived_object();
+
+ PPL_COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+ "architecture with sizeof(char) == sizeof(double)"
+ " (!?)");
+
+ enum const_bool_value {
+ /*!
+ Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+ overload resolution mechanism guarantees that <CODE>value</CODE>
+ evaluates to <CODE>true</CODE> if and only if <CODE>Base</CODE>
+ is the same type as <CODE>Derived</CODE> or <CODE>Derived</CODE>
+ is a class derived from <CODE>Base</CODE>.
+ */
+ value = (sizeof(func(derived_object())) == sizeof(char))
+ };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that provides a type member called <CODE>type</CODE> equivalent
+ to \p T if and only if \p b is <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, in which the <CODE>type</CODE> member
+ is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
+
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+ typedef T type;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that provides a type member called <CODE>type</CODE> equivalent
+ to \p T if and only if \p b is <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the specialization in which the <CODE>type</CODE> member
+ is present.
+
+ \note
+ Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+ expressions and suppose we have some template function
+ <CODE>T f(T1, T2)</CODE>. If we want to declare a specialization
+ that is enabled only if some compile-time checkable condition holds,
+ we simply declare the specialization by
+ \code
+ template ...
+ typename Enable_If<condition, T>::type
+ foo(T1 x, T2 y);
+ \endcode
+ For all the instantiations of the template parameters that cause
+ <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+ the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+ Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+ typedef T type;
+};
+
+template <typename T>
+struct Is_Native : public False {
+};
+
+template <> struct Is_Native<char> : public True { };
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
+
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
+
+template <> struct Is_Native<mpz_class> : public True { };
+
+template <> struct Is_Native<mpq_class> : public True { };
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_meta_programming_hh)
diff --git a/src/mp_std_bits.cc b/src/mp_std_bits.cc
new file mode 100644
index 0000000..0ca7bdb
--- /dev/null
+++ b/src/mp_std_bits.cc
@@ -0,0 +1,78 @@
+/* Definitions of specializations of std::numeric_limits objects for
+ multi-precision types.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "mp_std_bits_defs.hh"
+
+#if __GNU_MP_VERSION < 5 \
+ || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+const bool std::numeric_limits<mpz_class>::is_specialized;
+const int std::numeric_limits<mpz_class>::digits;
+const int std::numeric_limits<mpz_class>::digits10;
+const bool std::numeric_limits<mpz_class>::is_signed;
+const bool std::numeric_limits<mpz_class>::is_integer;
+const bool std::numeric_limits<mpz_class>::is_exact;
+const int std::numeric_limits<mpz_class>::radix;
+const int std::numeric_limits<mpz_class>::min_exponent;
+const int std::numeric_limits<mpz_class>::min_exponent10;
+const int std::numeric_limits<mpz_class>::max_exponent;
+const int std::numeric_limits<mpz_class>::max_exponent10;
+const bool std::numeric_limits<mpz_class>::has_infinity;
+const bool std::numeric_limits<mpz_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpz_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpz_class>::has_denorm;
+const bool std::numeric_limits<mpz_class>::has_denorm_loss;
+const bool std::numeric_limits<mpz_class>::is_iec559;
+const bool std::numeric_limits<mpz_class>::is_bounded;
+const bool std::numeric_limits<mpz_class>::is_modulo;
+const bool std::numeric_limits<mpz_class>::traps;
+const bool std::numeric_limits<mpz_class>::tinyness_before;
+const std::float_round_style std::numeric_limits<mpz_class>::round_style;
+
+const bool std::numeric_limits<mpq_class>::is_specialized;
+const int std::numeric_limits<mpq_class>::digits;
+const int std::numeric_limits<mpq_class>::digits10;
+const bool std::numeric_limits<mpq_class>::is_signed;
+const bool std::numeric_limits<mpq_class>::is_integer;
+const bool std::numeric_limits<mpq_class>::is_exact;
+const int std::numeric_limits<mpq_class>::radix;
+const int std::numeric_limits<mpq_class>::min_exponent;
+const int std::numeric_limits<mpq_class>::min_exponent10;
+const int std::numeric_limits<mpq_class>::max_exponent;
+const int std::numeric_limits<mpq_class>::max_exponent10;
+const bool std::numeric_limits<mpq_class>::has_infinity;
+const bool std::numeric_limits<mpq_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpq_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpq_class>::has_denorm;
+const bool std::numeric_limits<mpq_class>::has_denorm_loss;
+const bool std::numeric_limits<mpq_class>::is_iec559;
+const bool std::numeric_limits<mpq_class>::is_bounded;
+const bool std::numeric_limits<mpq_class>::is_modulo;
+const bool std::numeric_limits<mpq_class>::traps;
+const bool std::numeric_limits<mpq_class>::tinyness_before;
+const std::float_round_style std::numeric_limits<mpq_class>::round_style;
+
+#endif // __GNU_MP_VERSION < 5
+ // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
diff --git a/src/mp_std_bits_defs.hh b/src/mp_std_bits_defs.hh
new file mode 100644
index 0000000..19447b8
--- /dev/null
+++ b/src/mp_std_bits_defs.hh
@@ -0,0 +1,175 @@
+/* Declarations of specializations of std:: objects for
+ multi-precision types.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_mp_std_bits_defs_hh
+#define PPL_mp_std_bits_defs_hh 1
+
+#include <gmpxx.h>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
+
+#if __GNU_MP_VERSION < 5 \
+ || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+ typedef mpz_class Type;
+
+public:
+ static const bool is_specialized = true;
+ static const int digits = 0;
+ static const int digits10 = 0;
+ static const bool is_signed = true;
+ static const bool is_integer = true;
+ static const bool is_exact = true;
+ static const int radix = 2;
+ static const int min_exponent = 0;
+ static const int min_exponent10 = 0;
+ static const int max_exponent = 0;
+ static const int max_exponent10 = 0;
+ static const bool has_infinity = false;
+ static const bool has_quiet_NaN = false;
+ static const bool has_signaling_NaN = false;
+ static const float_denorm_style has_denorm = denorm_absent;
+ static const bool has_denorm_loss = false;
+ static const bool is_iec559 = false;
+ static const bool is_bounded = false;
+ static const bool is_modulo = false;
+ static const bool traps = false;
+ static const bool tinyness_before = false;
+ static const float_round_style round_style = round_toward_zero;
+
+ static Type min() {
+ return static_cast<Type>(0);
+ }
+
+ static Type max() {
+ return static_cast<Type>(0);
+ }
+
+ static Type epsilon() {
+ return static_cast<Type>(0);
+ }
+
+ static Type round_error() {
+ return static_cast<Type>(0);
+ }
+
+ static Type infinity() {
+ return static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return static_cast<Type>(0);
+ }
+
+ static Type denorm_min() {
+ return static_cast<Type>(1);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+ typedef mpq_class Type;
+
+public:
+ static const bool is_specialized = true;
+ static const int digits = 0;
+ static const int digits10 = 0;
+ static const bool is_signed = true;
+ static const bool is_integer = false;
+ static const bool is_exact = true;
+ static const int radix = 2;
+ static const int min_exponent = 0;
+ static const int min_exponent10 = 0;
+ static const int max_exponent = 0;
+ static const int max_exponent10 = 0;
+ static const bool has_infinity = false;
+ static const bool has_quiet_NaN = false;
+ static const bool has_signaling_NaN = false;
+ static const float_denorm_style has_denorm = denorm_absent;
+ static const bool has_denorm_loss = false;
+ static const bool is_iec559 = false;
+ static const bool is_bounded = false;
+ static const bool is_modulo = false;
+ static const bool traps = false;
+ static const bool tinyness_before = false;
+ static const float_round_style round_style = round_toward_zero;
+
+ static Type min() {
+ return static_cast<Type>(0);
+ }
+
+ static Type max() {
+ return static_cast<Type>(0);
+ }
+
+ static Type epsilon() {
+ return static_cast<Type>(0);
+ }
+
+ static Type round_error() {
+ return static_cast<Type>(0);
+ }
+
+ static Type infinity() {
+ return static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return static_cast<Type>(0);
+ }
+
+ static Type denorm_min() {
+ return static_cast<Type>(0);
+ }
+};
+
+} // namespace std
+
+#endif // __GNU_MP_VERSION < 5
+ // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+#include "mp_std_bits_inlines.hh"
+
+#endif // !defined(PPL_mp_std_bits_defs_hh)
diff --git a/src/mp_std_bits_inlines.hh b/src/mp_std_bits_inlines.hh
new file mode 100644
index 0000000..90f1b24
--- /dev/null
+++ b/src/mp_std_bits_inlines.hh
@@ -0,0 +1,38 @@
+/* Definitions of specializations of std:: functions and methods for
+ multi-precision types.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_mp_std_bits_inlines_hh
+#define PPL_mp_std_bits_inlines_hh 1
+
+inline void
+swap(mpz_class& x, mpz_class& y) {
+ mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+swap(mpq_class& x, mpq_class& y) {
+ mpq_swap(x.get_mpq_t(), y.get_mpq_t());
+}
+
+#endif // !defined(PPL_mp_std_bits_inlines_hh)
diff --git a/src/namespaces.hh b/src/namespaces.hh
new file mode 100644
index 0000000..7f0c45b
--- /dev/null
+++ b/src/namespaces.hh
@@ -0,0 +1,184 @@
+/* Documentation for used namespaces.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_namespaces_hh
+#define PPL_namespaces_hh 1
+
+//! The entire library is confined to this namespace.
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+ This is done so that the library's input/output operators
+ do not interfere with those the user might want to define.
+ In fact, it is highly unlikely that any predefined I/O
+ operator will suit the needs of a client application.
+ On the other hand, those applications for which the PPL
+ I/O operator are enough can easily obtain access to them.
+ For example, a directive like
+ \code
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ \endcode
+ would suffice for most uses.
+ In more complex situations, such as
+ \code
+ const Constraint_System& cs = ...;
+ copy(cs.begin(), cs.end(),
+ ostream_iterator<Constraint>(cout, "\n"));
+ \endcode
+ the Parma_Polyhedra_Library namespace must be suitably extended.
+ This can be done as follows:
+ \code
+ namespace Parma_Polyhedra_Library {
+ // Import all the output operators into the main PPL namespace.
+ using IO_Operators::operator<<;
+ }
+ \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Implementation {
+} // namespace Implementation
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to language interfaces.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the C language interface.
+/*! \ingroup PPL_C_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace C {
+
+} // namespace C
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Java language interface.
+/*! \ingroup PPL_Java_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Java {
+
+} // namespace Java
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the OCaml language interface.
+/*! \ingroup PPL_OCaml_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace OCaml {
+
+} // namespace OCaml
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Prolog language interfaces.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Prolog {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Ciao Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Ciao {
+
+} // namespace Ciao
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the GNU Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace GNU {
+
+} // namespace GNU
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SICStus language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SICStus {
+
+} // namespace SICStus
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SWI-Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SWI {
+
+} // namespace SWI
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the XSB language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace XSB {
+
+} // namespace XSB
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the YAP language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace YAP {
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+ The Parma Polyhedra Library conforms to the C++ standard and,
+ in particular, as far as reserved names are concerned (17.4.3.1,
+ [lib.reserved.names]). The PPL, however, defines several
+ template specializations for the standard library class template
+ <CODE>numeric_limits</CODE> (18.2.1, [lib.limits]).
+
+ \note
+ The PPL provides the specializations of the class template
+ <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+ but also for the GMP types <CODE>mpz_class</CODE> and
+ <CODE>mpq_class</CODE>. These specializations will be removed
+ as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+#endif // !defined(PPL_namespaces_hh)
diff --git a/src/ppl-config.cc.in b/src/ppl-config.cc.in
new file mode 100644
index 0000000..78c23bf
--- /dev/null
+++ b/src/ppl-config.cc.in
@@ -0,0 +1,734 @@
+/* A program to enquire about the configuration of the PPL -*- C++ -*-
+ and of the applications using it.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl.hh"
+#include "BUGS.hh"
+#include "COPYING.hh"
+#include "CREDITS.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+#error "PPL version 0.8 or following is required"
+#endif
+
+#include <cstdarg>
+#include <cstring>
+#include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+#include <unistd.h>
+#endif
+
+
+namespace {
+
+enum Format {
+ NO_FORMAT,
+ PLAIN,
+ MAKEFILE,
+ SH,
+ CSH
+};
+
+enum Interface {
+ NO_INTERFACE,
+ CXX,
+ C,
+ CIAO_PROLOG,
+ GNU_PROLOG,
+ SICSTUS_PROLOG,
+ SWI_PROLOG,
+ XSB_PROLOG,
+ YAP_PROLOG,
+ OCAML,
+ JAVA
+};
+
+Format required_format = NO_FORMAT;
+
+Interface required_interface = NO_INTERFACE;
+
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 3"
+
+std::string prefix;
+std::string exec_prefix;
+
+bool required_application = false;
+bool required_library = false;
+bool required_prefix = false;
+bool required_exec_prefix = false;
+bool required_configure_options = false;
+bool required_version = false;
+bool required_version_major = false;
+bool required_version_minor = false;
+bool required_version_revision = false;
+bool required_version_beta = false;
+bool required_banner = false;
+bool required_coefficients = false;
+bool required_includedir = false;
+bool required_bindir = false;
+bool required_libdir = false;
+bool required_cppflags = false;
+bool required_cflags = false;
+bool required_cxxflags = false;
+bool required_ldflags = false;
+bool required_license = false;
+bool required_copying = false;
+bool required_bugs = false;
+bool required_credits = false;
+
+unsigned num_required_items = 0;
+
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_name = 0;
+
+void
+fatal(const char* format, ...) __attribute__((__noreturn__));
+
+void
+fatal(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, format, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+void
+internal_error() __attribute__((__noreturn__));
+
+void
+internal_error() {
+ fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+inline char
+to_lower(char c) {
+ return
+ static_cast<char>(tolower(static_cast<int>(static_cast<unsigned char>(c))));
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+ while (*s1 != '\0') {
+ if (*s2 == '\0' || to_lower(*s1) != to_lower(*s2))
+ return false;
+ ++s1;
+ ++s2;
+ }
+ return *s2 == '\0';
+}
+
+void
+process_options(int argc, char* argv[]) {
+
+ bool exec_prefix_set = false;
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"format", required_argument, 0, 'F'},
+ {"interface", required_argument, 0, 'I'},
+ {"application", no_argument, 0, 'A'},
+ {"library", no_argument, 0, 'L'},
+ {"prefix", optional_argument, 0, 'p'},
+ {"exec-prefix", optional_argument, 0, 'e'},
+ {"configure-options", no_argument, 0, 'O'},
+ {"version", no_argument, 0, 'V'},
+ {"version-major", no_argument, 0, 'M'},
+ {"version-minor", no_argument, 0, 'N'},
+ {"version-revision", no_argument, 0, 'R'},
+ {"version-beta", no_argument, 0, 'B'},
+ {"banner", no_argument, 0, 'E'},
+ {"coefficients", no_argument, 0, 'n'},
+ {"includedir", no_argument, 0, 'i'},
+ {"bindir", no_argument, 0, 'b'},
+ {"libdir", no_argument, 0, 'l'},
+ {"cppflags", no_argument, 0, 'P'},
+ {"cflags", no_argument, 0, 'C'},
+ {"cxxflags", no_argument, 0, 'X'},
+ {"ldflags", no_argument, 0, 'D'},
+ {"license", no_argument, 0, 'g'},
+ {"copying", no_argument, 0, 'c'},
+ {"bugs", no_argument, 0, 'u'},
+ {"credits", no_argument, 0, 'r'},
+ {0, 0, 0, 0}
+};
+#endif
+
+ static const char* usage_string
+ = "Usage: %s [OPTION]...\n"
+"Displays information, in various formats, about an installation\n"
+"of the Parma Polyhedra Library.\n\n"
+"Options:\n"
+" -h, --help prints this help text to stdout\n"
+" -FFMT, --format=FMT sets the output format to FMT\n"
+" (one of `plain', `makefile', `sh' or `csh')\n"
+" -IINT, --interface=INT selects a library interface (one of `C++', `C',\n"
+" `Ciao-Prolog', `GNU-Prolog', `SICStus-Prolog',\n"
+" `SWI-Prolog', `XSB-Prolog', `YAP-Prolog',\n"
+" `OCaml' or `Java')\n"
+" -A, --application selects output for building an application\n"
+" -L, --library selects output for building a library\n"
+" -p[PFX], --prefix[=PFX] prints or sets library prefix information\n"
+" -e[PFX], --exec-prefix[=PFX]\n"
+" prints or sets library exec-prefix information\n"
+" -O, --configure-options prints configuration options\n"
+" -V, --version prints version information\n"
+" -M, --version-major prints version major number\n"
+" -N, --version-minor prints version minor number\n"
+" -R, --version-revision prints version revision number\n"
+" -B, --version-beta prints version beta number\n"
+" -E, --banner prints library banner\n"
+" -n, --coefficients prints type of library coefficients\n"
+" -i, --includedir prints include files directory\n"
+" -b, --bindir prints binary executables directory\n"
+" -l, --libdir prints library files directory\n"
+" -P, --cppflags prints preprocessor flags\n"
+" -C, --cflags prints C compiler flags\n"
+" -X, --cxxflags prints C++ compiler flags\n"
+" -D, --ldflags prints linker flags\n"
+" -g, --license prints synthetic licensing information\n"
+" -c, --copying prints detailed licensing information\n"
+" -u, --bugs prints bug reporting information\n"
+" -r, --credits prints credits\n"
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+ while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+ int option_index = 0;
+ int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+ &option_index);
+#else
+ int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+ if (c == EOF)
+ break;
+
+ switch (c) {
+ case 0:
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, usage_string, argv[0]);
+ exit(0);
+ break;
+
+ // --format
+ case 'F':
+ if (strcaseeq(optarg, "plain"))
+ required_format = PLAIN;
+ else if (strcaseeq(optarg, "makefile"))
+ required_format = MAKEFILE;
+ else if (strcaseeq(optarg, "sh"))
+ required_format = SH;
+ else if (strcaseeq(optarg, "csh"))
+ required_format = CSH;
+ else
+ fatal("invalid argument `%s' to --format: "
+ "must be `plain', `makefile', `sh' or `csh'",
+ optarg);
+ break;
+
+ // --interface
+ case 'I':
+ if (strcaseeq(optarg, "C++"))
+ required_interface = CXX;
+ else if (strcaseeq(optarg, "C"))
+ required_interface = C;
+ else if (strcaseeq(optarg, "Ciao-Prolog"))
+ required_interface = CIAO_PROLOG;
+ else if (strcaseeq(optarg, "GNU-Prolog"))
+ required_interface = GNU_PROLOG;
+ else if (strcaseeq(optarg, "SICStus-Prolog"))
+ required_interface = SICSTUS_PROLOG;
+ else if (strcaseeq(optarg, "SWI-Prolog"))
+ required_interface = SWI_PROLOG;
+ else if (strcaseeq(optarg, "XSB-Prolog"))
+ required_interface = XSB_PROLOG;
+ else if (strcaseeq(optarg, "YAP-Prolog"))
+ required_interface = YAP_PROLOG;
+ else if (strcaseeq(optarg, "OCaml"))
+ required_interface = OCAML;
+ else if (strcaseeq(optarg, "Java"))
+ required_interface = JAVA;
+ else
+ fatal("invalid argument `%s' to --interface: "
+ "must be `C++', `C', `Ciao-Prolog', `GNU-Prolog', "
+ "`SICStus-Prolog', `SWI-Prolog', `XSB-Prolog', `YAP-Prolog', "
+ "`OCaml' or `Java'",
+ optarg);
+ break;
+
+ // --application
+ case 'A':
+ required_application = true;
+ break;
+
+ // --library
+ case 'L':
+ required_library = true;
+ break;
+
+ // --prefix
+ case 'p':
+ if (optarg != 0) {
+ prefix = optarg;
+ if (!exec_prefix_set) {
+ exec_prefix = optarg;
+ exec_prefix_set = true;
+ }
+ }
+ else {
+ required_prefix = true;
+ ++num_required_items;
+ }
+ break;
+
+ // --exec_prefix
+ case 'e':
+ if (optarg != 0) {
+ exec_prefix = optarg;
+ exec_prefix_set = true;
+ }
+ else {
+ required_exec_prefix = true;
+ ++num_required_items;
+ }
+ break;
+
+ // --configure-options
+ case 'O':
+ required_configure_options = true;
+ ++num_required_items;
+ break;
+
+ // --version
+ case 'V':
+ required_version = true;
+ ++num_required_items;
+ break;
+
+ // --version-major
+ case 'M':
+ required_version_major = true;
+ ++num_required_items;
+ break;
+
+ // --version-minor
+ case 'N':
+ required_version_minor = true;
+ ++num_required_items;
+ break;
+
+ // --version-revision
+ case 'R':
+ required_version_revision = true;
+ ++num_required_items;
+ break;
+
+ // --version-beta
+ case 'B':
+ required_version_beta = true;
+ ++num_required_items;
+ break;
+
+ // --banner
+ case 'E':
+ required_banner = true;
+ ++num_required_items;
+ break;
+
+ // --coefficients
+ case 'n':
+ required_coefficients = true;
+ ++num_required_items;
+ break;
+
+ // --includedir
+ case 'i':
+ required_includedir = true;
+ ++num_required_items;
+ break;
+
+ // --bindir
+ case 'b':
+ required_bindir = true;
+ ++num_required_items;
+ break;
+
+ // --libdir
+ case 'l':
+ required_libdir = true;
+ ++num_required_items;
+ break;
+
+ // --cppflags
+ case 'P':
+ required_cppflags = true;
+ ++num_required_items;
+ break;
+
+ // --cflags
+ case 'C':
+ required_cflags = true;
+ ++num_required_items;
+ break;
+
+ // --cxxflags
+ case 'X':
+ required_cxxflags = true;
+ ++num_required_items;
+ break;
+
+ // --ldflags
+ case 'D':
+ required_ldflags = true;
+ ++num_required_items;
+ break;
+
+ // --license
+ case 'g':
+ required_license = true;
+ ++num_required_items;
+ break;
+
+ // --copying
+ case 'c':
+ required_copying = true;
+ ++num_required_items;
+ break;
+
+ // --bugs
+ case 'u':
+ required_bugs = true;
+ ++num_required_items;
+ break;
+
+ // --credits
+ case 'r':
+ required_credits = true;
+ ++num_required_items;
+ break;
+
+ default:
+ abort();
+ }
+ }
+
+ if (argc != optind)
+ // We have a spurious argument.
+ fatal("no arguments besides options are accepted");
+
+ if (required_application && required_library)
+ fatal("the --application and --library are mutually exclusive");
+
+ if (!required_application && !required_library)
+ required_application = true;
+
+ if (required_format == NO_FORMAT)
+ required_format = PLAIN;
+
+ if (required_interface == NO_INTERFACE)
+ required_interface = CXX;
+}
+
+void
+portray_name(const char* name) {
+ const char* variable_prefix = "PPL_";
+ switch (required_format) {
+ case PLAIN:
+ if (num_required_items > 1)
+ std::cout << variable_prefix << name << ": ";
+ break;
+ case MAKEFILE:
+ std::cout << variable_prefix << name << '=';
+ break;
+ case SH:
+ std::cout << "export " << variable_prefix << name << '=';
+ break;
+ case CSH:
+ std::cout << "setenv " << variable_prefix << name << ' ';
+ break;
+ default:
+ internal_error();
+ }
+}
+
+void
+portray(const char* const array[]) {
+ for (unsigned i = 0; array[i] != 0; ++i)
+ std::cout << array[i] << std::endl;
+}
+
+void
+portray(const char* string) {
+ std::cout << string;
+}
+
+void
+portray(long n) {
+ std::cout << n;
+}
+
+void
+portray(const char* name, const char* const array[]) {
+ portray_name(name);
+ portray(array);
+ std::cout << std::endl;
+}
+
+void
+portray(const char* name, const char* string) {
+ portray_name(name);
+ portray(string);
+ std::cout << std::endl;
+}
+
+void
+portray(const char* name, std::string s) {
+ portray(name, s.c_str());
+}
+
+void
+portray(const char* name, long n) {
+ portray_name(name);
+ portray(n);
+ std::cout << std::endl;
+}
+
+void
+replace(std::string& s,
+ const std::string& pattern, const std::string& replacement) {
+ std::string::size_type pos = 0;
+ while (true) {
+ pos = s.find(pattern, pos);
+ if (pos == std::string::npos)
+ break;
+ s.replace(pos, pattern.size(), replacement);
+ pos += replacement.length();
+ }
+}
+
+void
+replace_prefixes(std::string& s) {
+ static const std::string prefix_reference = "${prefix}";
+ static const std::string exec_prefix_reference = "${exec_prefix}";
+ replace(s, prefix_reference, prefix);
+ replace(s, exec_prefix_reference, exec_prefix);
+}
+
+void
+portray_with_prefixes(const char* name, std::string s) {
+ replace_prefixes(s);
+ portray(name, s);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+ program_name = argv[0];
+
+ if (strcmp(PPL_VERSION, PPL::version()) != 0)
+ fatal("was compiled with PPL version %s, but linked with version %s",
+ PPL_VERSION, PPL::version());
+
+ // Initialize prefixes.
+ prefix = "@prefix@";
+ exec_prefix = "@exec_prefix@";
+ replace_prefixes(prefix);
+ replace_prefixes(exec_prefix);
+
+ // Process command line options.
+ process_options(argc, argv);
+
+ if (required_prefix)
+ portray("PREFIX", prefix);
+
+ if (required_exec_prefix)
+ portray("EXEC_PREFIX", exec_prefix);
+
+ if (required_configure_options)
+ portray("CONFIGURE_OPTIONS", PPL_CONFIGURE_OPTIONS);
+
+ if (required_version)
+ portray("VERSION", PPL_VERSION);
+
+ if (required_version_major)
+ portray("VERSION_MAJOR", static_cast<long>(PPL_VERSION_MAJOR));
+
+ if (required_version_minor)
+ portray("VERSION_MINOR", static_cast<long>(PPL_VERSION_MINOR));
+
+ if (required_version_revision)
+ portray("VERSION_REVISION", static_cast<long>(PPL_VERSION_REVISION));
+
+ if (required_version_beta)
+ portray("VERSION_BETA", static_cast<long>(PPL_VERSION_BETA));
+
+ if (required_banner)
+ portray("BANNER", PPL::banner());
+
+ if (required_coefficients)
+ portray("COEFFICIENTS", "@coefficient_mnemonic@");
+
+ if (required_includedir)
+ portray_with_prefixes("INCLUDEDIR", "@includedir@");
+
+ if (required_bindir)
+ portray_with_prefixes("BINDIR", "@bindir@");
+
+ if (required_libdir)
+ portray_with_prefixes("LIBDIR", "@libdir@");
+
+ if (required_cppflags) {
+ if (required_application) {
+ std::string cppflags = "@CPPFLAGS@";
+ std::string s = "@includedir@";
+ replace_prefixes(s);
+ // `/usr/include' is the standard include directory:
+ // thus it needs not be specified.
+ if (s == "/usr/include")
+ s = cppflags;
+ else {
+ s = "-I" + s;
+ // Avoid duplicating the -I options.
+ if (cppflags.find(s) != std::string::npos)
+ s = "";
+ if (s.length() > 0 && strlen("@CPPFLAGS@") > 0)
+ s += ' ';
+ s += "@CPPFLAGS@";
+ }
+ if (s.length() > 0 && strlen("@extra_includes@") > 0)
+ s += ' ';
+ s += "@extra_includes@";
+ portray("CPPFLAGS", s);
+ }
+ else
+ portray("CPPFLAGS", "@CPPFLAGS@");
+ }
+
+ if (required_cflags)
+ portray("CFLAGS", "@CFLAGS@");
+
+ if (required_cxxflags)
+ portray("CXXFLAGS", "@CXXFLAGS@");
+
+ if (required_ldflags) {
+ std::string s = "@libdir@";
+ replace_prefixes(s);
+ const std::string ldflags = "@LDFLAGS@";
+ // `/usr/lib' is the standard library directory:
+ // thus it needs not be specified.
+ if (s == "/usr/lib")
+ s = ldflags;
+ else {
+ s = "-L" + s;
+ // Avoid duplicating the -L options.
+ if (ldflags.find(s) != std::string::npos)
+ s = "";
+ if (s.length() > 0 && ldflags.length() > 0)
+ s += ' ';
+ s += ldflags;
+ }
+ if (required_library) {
+ if (s.length() > 0 && strlen("@extra_libraries@") > 0)
+ s += ' ';
+ s += "@extra_libraries@";
+ }
+ else {
+ assert(required_application);
+ if (s.length() > 0)
+ s += ' ';
+ s += "-lppl";
+ if (required_interface == C)
+ s += " -lppl_c";
+ s += " -lgmpxx -lgmp";
+ }
+ portray("LDFLAGS", s);
+ }
+
+ if (required_license)
+ portray("LICENSE", PPL_LICENSE);
+
+ if (required_copying)
+ portray("COPYING", COPYING_array);
+
+ if (required_bugs)
+ portray("BUGS", BUGS_array);
+
+ if (required_credits)
+ portray("CREDITS", CREDITS_array);
+
+ return 0;
+}
+catch (const std::bad_alloc&) {
+ fatal("out of memory");
+ exit(1);
+}
+catch (const std::overflow_error& e) {
+ fatal("arithmetic overflow (%s)", e.what());
+ exit(1);
+}
+catch (...) {
+ internal_error();
+}
diff --git a/src/ppl.hh.dist b/src/ppl.hh.dist
new file mode 100644
index 0000000..17f03b5
--- /dev/null
+++ b/src/ppl.hh.dist
@@ -0,0 +1,107456 @@
+/* This is the header file of the Parma Polyhedra Library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG NDEBUG
+# undef NDEBUG
+#endif
+
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
+
+/* Automatically generated from PPL source file ../ppl-config.h line 1. */
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+ floating point format. */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+ floating point format. */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#define PPL_HAVE_DECL_FFS 1
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#define PPL_HAVE_DECL_FMA 1
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_FMAF 1
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_FMAL 1
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_GETENV 1
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_GETRUSAGE 1
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_RINTF 1
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_RINTL 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_RLIMIT_AS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_RLIMIT_DATA 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_RLIMIT_RSS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_RLIMIT_VMEM 0
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_SETITIMER 1
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_SETRLIMIT 1
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_SIGACTION 1
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_STRTOD 1
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+ */
+#define PPL_HAVE_DECL_STRTOF 1
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_STRTOLD 1
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_STRTOLL 1
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+ don't. */
+#define PPL_HAVE_DECL_STRTOULL 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define PPL_HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#define PPL_HAVE_FENV_H 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define PPL_HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+/* #undef PPL_HAVE_GLPK_GLPK_H */
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#define PPL_HAVE_GLPK_H 1
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+/* #undef PPL_HAVE_IEEEFP_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define PPL_HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#define PPL_HAVE_INT_FAST16_T 1
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#define PPL_HAVE_INT_FAST32_T 1
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#define PPL_HAVE_INT_FAST64_T 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define PPL_HAVE_MEMORY_H 1
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#define PPL_HAVE_SIGINFO_T 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define PPL_HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define PPL_HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define PPL_HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define PPL_HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define PPL_HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define PPL_HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define PPL_HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define PPL_HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define PPL_HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `timeval'. */
+#define PPL_HAVE_TIMEVAL 1
+
+/* Define to 1 if typeof works with your compiler. */
+#define PPL_HAVE_TYPEOF 1
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#define PPL_HAVE_UINTPTR_T 1
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#define PPL_HAVE_UINT_FAST16_T 1
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#define PPL_HAVE_UINT_FAST32_T 1
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#define PPL_HAVE_UINT_FAST64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define PPL_HAVE_UNISTD_H 1
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_ALLOC 1
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_D 1
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_SIZE 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#define LT_OBJDIR ".libs/"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PPL_PACKAGE_BUGREPORT "ppl-devel at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PPL_PACKAGE_NAME "the Parma Polyhedra Library"
+
+/* Define to the full name and version of this package. */
+#define PPL_PACKAGE_STRING "the Parma Polyhedra Library 1.1"
+
+/* Define to the one symbol short name of this package. */
+#define PPL_PACKAGE_TARNAME "ppl"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PPL_PACKAGE_VERSION "1.1"
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+/* #undef PPL_ABI_BREAKING_EXTRA_DEBUG */
+
+/* Not zero if the FPU can be controlled. */
+#define PPL_CAN_CONTROL_FPU 1
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+ */
+/* #undef PPL_CHECKED_INTEGERS */
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#define PPL_COEFFICIENT_BITS 0
+
+/* The integral type used to represent coefficients. */
+#define PPL_COEFFICIENT_TYPE mpz_class
+
+/* This contains the options with which `configure' was invoked. */
+#define PPL_CONFIGURE_OPTIONS " '--with-java=/usr/lib/jvm/java-7-openjdk-amd64'"
+
+/* The unique code of the binary format of C++ doubles, if supported;
+ undefined otherwise. */
+#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+ undefined otherwise. */
+#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+
+/* Not zero if the the plain char type is signed. */
+#define PPL_CXX_PLAIN_CHAR_IS_SIGNED 1
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+ range or precision than double. */
+#define PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE 1
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#define PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK 1
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#define PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG 1
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#define PPL_CXX_SUPPORTS_LIMITING_MEMORY 1
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#define PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS 1
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#define PPL_FPMATH_MAY_USE_387 1
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#define PPL_FPMATH_MAY_USE_SSE 1
+
+/* Defined if GLPK provides glp_term_hook(). */
+#define PPL_GLPK_HAS_GLP_TERM_HOOK 1
+
+/* Defined if GLPK provides glp_term_out(). */
+#define PPL_GLPK_HAS_GLP_TERM_OUT 1
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+/* #undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK */
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+/* #undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK */
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#define PPL_GMP_INTEGERS 1
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#define PPL_GMP_SUPPORTS_EXCEPTIONS 1
+
+/* Defined if the integral type to be used for coefficients is a native one.
+ */
+/* #undef PPL_NATIVE_INTEGERS */
+
+/* Assertions are disabled when this is defined. */
+#define PPL_NDEBUG 1
+
+/* Not zero if doubles are supported. */
+#define PPL_SUPPORTED_DOUBLE 1
+
+/* Not zero if floats are supported. */
+#define PPL_SUPPORTED_FLOAT 1
+
+/* Not zero if long doubles are supported. */
+#define PPL_SUPPORTED_LONG_DOUBLE 1
+
+/* The size of `char', as computed by sizeof. */
+#define PPL_SIZEOF_CHAR 1
+
+/* The size of `double', as computed by sizeof. */
+#define PPL_SIZEOF_DOUBLE 8
+
+/* The size of `float', as computed by sizeof. */
+#define PPL_SIZEOF_FLOAT 4
+
+/* The size of `fp', as computed by sizeof. */
+#define PPL_SIZEOF_FP 8
+
+/* The size of `int', as computed by sizeof. */
+#define PPL_SIZEOF_INT 4
+
+/* The size of `int*', as computed by sizeof. */
+#define PPL_SIZEOF_INTP 8
+
+/* The size of `long', as computed by sizeof. */
+#define PPL_SIZEOF_LONG 8
+
+/* The size of `long double', as computed by sizeof. */
+#define PPL_SIZEOF_LONG_DOUBLE 16
+
+/* The size of `long long', as computed by sizeof. */
+#define PPL_SIZEOF_LONG_LONG 8
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#define PPL_SIZEOF_MP_LIMB_T 8
+
+/* The size of `short', as computed by sizeof. */
+#define PPL_SIZEOF_SHORT 2
+
+/* The size of `size_t', as computed by sizeof. */
+#define PPL_SIZEOF_SIZE_T 8
+
+/* Define to 1 if you have the ANSI C header files. */
+#define PPL_STDC_HEADERS 1
+
+/* Define PPL_WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define PPL_WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef PPL_WORDS_BIGENDIAN
+/* # undef PPL_WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+/* #undef _GLIBCXX_DEBUG */
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+/* #undef _GLIBCXX_DEBUG_PEDANTIC */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+/* #undef typeof */
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+/* #undef uintptr_t */
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+ we must make sure <stdint.h> is included before <sys/types.hh> is
+ (even indirectly) included. Moreover we need to define
+ __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+ in order to have the macros defined also in C++. */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
+/* Automatically generated from PPL source file ../src/version.hh line 1. */
+/* Declaration of macros and functions providing version -*- C++ -*-
+ and licensing information.
+*/
+
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR 1
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR 1
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+ The beta number of the PPL version. This is zero for official
+ releases and nonzero for development snapshots.
+ \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA 0
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+ Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+ to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The
+ format of PPL_VERSION is <CODE>M "." m</CODE> if both
+ PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+ (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+ PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+ <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+ PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+ neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "1.1"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Library Version Control Functions
+//@{
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+ The banner provides information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+*/
+const char* banner();
+
+//@} // Library Version Control Functions
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/namespaces.hh line 1. */
+/* Documentation for used namespaces.
+*/
+
+
+//! The entire library is confined to this namespace.
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+ This is done so that the library's input/output operators
+ do not interfere with those the user might want to define.
+ In fact, it is highly unlikely that any predefined I/O
+ operator will suit the needs of a client application.
+ On the other hand, those applications for which the PPL
+ I/O operator are enough can easily obtain access to them.
+ For example, a directive like
+ \code
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ \endcode
+ would suffice for most uses.
+ In more complex situations, such as
+ \code
+ const Constraint_System& cs = ...;
+ copy(cs.begin(), cs.end(),
+ ostream_iterator<Constraint>(cout, "\n"));
+ \endcode
+ the Parma_Polyhedra_Library namespace must be suitably extended.
+ This can be done as follows:
+ \code
+ namespace Parma_Polyhedra_Library {
+ // Import all the output operators into the main PPL namespace.
+ using IO_Operators::operator<<;
+ }
+ \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Implementation {
+} // namespace Implementation
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to language interfaces.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the C language interface.
+/*! \ingroup PPL_C_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace C {
+
+} // namespace C
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Java language interface.
+/*! \ingroup PPL_Java_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Java {
+
+} // namespace Java
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the OCaml language interface.
+/*! \ingroup PPL_OCaml_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace OCaml {
+
+} // namespace OCaml
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Prolog language interfaces.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Prolog {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Ciao Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Ciao {
+
+} // namespace Ciao
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the GNU Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace GNU {
+
+} // namespace GNU
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SICStus language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SICStus {
+
+} // namespace SICStus
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SWI-Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SWI {
+
+} // namespace SWI
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the XSB language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace XSB {
+
+} // namespace XSB
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the YAP language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace YAP {
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+ The Parma Polyhedra Library conforms to the C++ standard and,
+ in particular, as far as reserved names are concerned (17.4.3.1,
+ [lib.reserved.names]). The PPL, however, defines several
+ template specializations for the standard library class template
+ <CODE>numeric_limits</CODE> (18.2.1, [lib.limits]).
+
+ \note
+ The PPL provides the specializations of the class template
+ <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+ but also for the GMP types <CODE>mpz_class</CODE> and
+ <CODE>mpq_class</CODE>. These specializations will be removed
+ as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+/* Automatically generated from PPL source file ../src/Interval_Info_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 1. */
+/* Specializations of std::numeric_limits for "checked" types.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 1. */
+/* Checked_Number class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1. */
+/* Coefficient_traits_template class declaration.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_types.hh line 17. */
+
+namespace Parma_Polyhedra_Library {
+
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 1. */
+/* Abstract checked arithmetic function container.
+*/
+
+
+#include <cassert>
+#include <iostream>
+#include <gmpxx.h>
+/* Automatically generated from PPL source file ../src/mp_std_bits_defs.hh line 1. */
+/* Declarations of specializations of std:: objects for
+ multi-precision types.
+*/
+
+
+#include <gmpxx.h>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
+
+#if __GNU_MP_VERSION < 5 \
+ || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+ typedef mpz_class Type;
+
+public:
+ static const bool is_specialized = true;
+ static const int digits = 0;
+ static const int digits10 = 0;
+ static const bool is_signed = true;
+ static const bool is_integer = true;
+ static const bool is_exact = true;
+ static const int radix = 2;
+ static const int min_exponent = 0;
+ static const int min_exponent10 = 0;
+ static const int max_exponent = 0;
+ static const int max_exponent10 = 0;
+ static const bool has_infinity = false;
+ static const bool has_quiet_NaN = false;
+ static const bool has_signaling_NaN = false;
+ static const float_denorm_style has_denorm = denorm_absent;
+ static const bool has_denorm_loss = false;
+ static const bool is_iec559 = false;
+ static const bool is_bounded = false;
+ static const bool is_modulo = false;
+ static const bool traps = false;
+ static const bool tinyness_before = false;
+ static const float_round_style round_style = round_toward_zero;
+
+ static Type min() {
+ return static_cast<Type>(0);
+ }
+
+ static Type max() {
+ return static_cast<Type>(0);
+ }
+
+ static Type epsilon() {
+ return static_cast<Type>(0);
+ }
+
+ static Type round_error() {
+ return static_cast<Type>(0);
+ }
+
+ static Type infinity() {
+ return static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return static_cast<Type>(0);
+ }
+
+ static Type denorm_min() {
+ return static_cast<Type>(1);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+ typedef mpq_class Type;
+
+public:
+ static const bool is_specialized = true;
+ static const int digits = 0;
+ static const int digits10 = 0;
+ static const bool is_signed = true;
+ static const bool is_integer = false;
+ static const bool is_exact = true;
+ static const int radix = 2;
+ static const int min_exponent = 0;
+ static const int min_exponent10 = 0;
+ static const int max_exponent = 0;
+ static const int max_exponent10 = 0;
+ static const bool has_infinity = false;
+ static const bool has_quiet_NaN = false;
+ static const bool has_signaling_NaN = false;
+ static const float_denorm_style has_denorm = denorm_absent;
+ static const bool has_denorm_loss = false;
+ static const bool is_iec559 = false;
+ static const bool is_bounded = false;
+ static const bool is_modulo = false;
+ static const bool traps = false;
+ static const bool tinyness_before = false;
+ static const float_round_style round_style = round_toward_zero;
+
+ static Type min() {
+ return static_cast<Type>(0);
+ }
+
+ static Type max() {
+ return static_cast<Type>(0);
+ }
+
+ static Type epsilon() {
+ return static_cast<Type>(0);
+ }
+
+ static Type round_error() {
+ return static_cast<Type>(0);
+ }
+
+ static Type infinity() {
+ return static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return static_cast<Type>(0);
+ }
+
+ static Type denorm_min() {
+ return static_cast<Type>(0);
+ }
+};
+
+} // namespace std
+
+#endif // __GNU_MP_VERSION < 5
+ // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+/* Automatically generated from PPL source file ../src/mp_std_bits_inlines.hh line 1. */
+/* Definitions of specializations of std:: functions and methods for
+ multi-precision types.
+*/
+
+
+inline void
+swap(mpz_class& x, mpz_class& y) {
+ mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+swap(mpq_class& x, mpq_class& y) {
+ mpq_swap(x.get_mpq_t(), y.get_mpq_t());
+}
+
+/* Automatically generated from PPL source file ../src/mp_std_bits_defs.hh line 174. */
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 1. */
+/* Temp_* classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/meta_programming.hh line 1. */
+/* Metaprogramming utilities.
+*/
+
+
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+ and with value \p value.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value) \
+ enum const_bool_value_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type <CODE>int</CODE>, called \p name
+ and with value \p value.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+ enum anonymous_enum_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type \p type, called \p name
+ and with value \p value. The value of the constant is accessible
+ by means of the syntax <CODE>name()</CODE>.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value) \
+ static type PPL_U(name)() { \
+ return (value); \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Declares a per-class constant of type \p type, called \p name
+ and with value \p value. A constant reference to the constant
+ is accessible by means of the syntax <CODE>name()</CODE>.
+
+ \ingroup PPL_CXX_interface
+ Differently from static constants, \p name needs not (and cannot) be
+ defined (for static constants, the need for a further definition is
+ mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value) \
+ static const type& PPL_U(name)() { \
+ static type PPL_U(name) = (value); \
+ return (name); \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, so the class is declared but not defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the specialized case with \p b equal to <CODE>true</CODE>,
+ so the class is declared and (trivially) defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
+
+#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix) \
+ enum anonymous_enum_compile_time_check_ ## suffix { \
+ /* If e evaluates to false, then the sizeof cannot be compiled. */ \
+ PPL_COMPILE_TIME_CHECK_NAME(suffix) \
+ = sizeof(Parma_Polyhedra_Library::Compile_Time_Check<(e)>) \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Produces a compilation error if the compile-time constant \p e does
+ not evaluate to <CODE>true</CODE>
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_COMPILE_TIME_CHECK(e, msg) PPL_COMPILE_TIME_CHECK_AUX(e, __LINE__)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to \p b.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+ enum const_bool_value {
+ value = b
+ };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE>.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>false</CODE>.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+ \ingroup PPL_CXX_interface
+ This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class holding a constant called <CODE>value</CODE> that evaluates
+ to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+ or \p Derived is a class derived from \p Base.
+
+ \ingroup PPL_CXX_interface
+ \note
+ Care must be taken to use this predicate with template classes.
+ Suppose we have
+ \code
+ template <typename T> struct B;
+ template <typename T> struct D : public B<T>;
+ \endcode
+ Of course, we cannot test if, for some type variable <CODE>U</CODE>, we have
+ <CODE>Is_Same_Or_Derived<B<U>, Type>:: const_bool_value:: value == true</CODE>.
+ But we can do as follows:
+ \code
+ struct B_Base {
+ };
+
+ template <typename T> struct B : public B_Base;
+ \endcode
+ This enables us to inquire
+ <CODE>Is_Same_Or_Derived<B_Base, Type>:: const_bool_value:: value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ struct Any {
+ //! The universal constructor.
+ template <typename T>
+ Any(const T&);
+ };
+
+ //! Overloading with \p Base.
+ static char func(const Base&);
+
+ //! Overloading with \p Any.
+ static double func(Any);
+
+ //! A function obtaining a const reference to a \p Derived object.
+ static const Derived& derived_object();
+
+ PPL_COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+ "architecture with sizeof(char) == sizeof(double)"
+ " (!?)");
+
+ enum const_bool_value {
+ /*!
+ Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+ overload resolution mechanism guarantees that <CODE>value</CODE>
+ evaluates to <CODE>true</CODE> if and only if <CODE>Base</CODE>
+ is the same type as <CODE>Derived</CODE> or <CODE>Derived</CODE>
+ is a class derived from <CODE>Base</CODE>.
+ */
+ value = (sizeof(func(derived_object())) == sizeof(char))
+ };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that provides a type member called <CODE>type</CODE> equivalent
+ to \p T if and only if \p b is <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the non-specialized case, in which the <CODE>type</CODE> member
+ is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
+
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+ typedef T type;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ A class that provides a type member called <CODE>type</CODE> equivalent
+ to \p T if and only if \p b is <CODE>true</CODE>.
+
+ \ingroup PPL_CXX_interface
+ This is the specialization in which the <CODE>type</CODE> member
+ is present.
+
+ \note
+ Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+ expressions and suppose we have some template function
+ <CODE>T f(T1, T2)</CODE>. If we want to declare a specialization
+ that is enabled only if some compile-time checkable condition holds,
+ we simply declare the specialization by
+ \code
+ template ...
+ typename Enable_If<condition, T>::type
+ foo(T1 x, T2 y);
+ \endcode
+ For all the instantiations of the template parameters that cause
+ <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+ the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+ Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+ typedef T type;
+};
+
+template <typename T>
+struct Is_Native : public False {
+};
+
+template <> struct Is_Native<char> : public True { };
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
+
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
+
+template <> struct Is_Native<mpz_class> : public True { };
+
+template <> struct Is_Native<mpq_class> : public True { };
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Slow_Copy.hh line 1. */
+/* Basic Slow_Copy classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Slow_Copy.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+ //! Obtains a reference to a temporary item.
+ static Temp_Item& obtain();
+
+ //! Releases the temporary item \p p.
+ static void release(Temp_Item& p);
+
+ //! Returns a reference to the encapsulated item.
+ T& item();
+
+private:
+ //! The encapsulated item.
+ T item_;
+
+ //! Pointer to the next item in the free list.
+ Temp_Item* next;
+
+ //! Head of the free list.
+ static Temp_Item* free_list_head;
+
+ //! Default constructor.
+ Temp_Item();
+
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Item(const Temp_Item&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Item& operator=(const Temp_Item&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+ //! Constructs an holder holding a dirty temp.
+ Temp_Reference_Holder();
+
+ //! Destructor.
+ ~Temp_Reference_Holder();
+
+ //! Returns a reference to the held item.
+ T& item();
+
+private:
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Reference_Holder(const Temp_Reference_Holder&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Reference_Holder& operator=(const Temp_Reference_Holder&);
+
+ //! The held item, encapsulated.
+ Temp_Item<T>& held;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+ //! Constructs a fake holder.
+ Temp_Value_Holder();
+
+ //! Returns the value of the held item.
+ T& item();
+
+private:
+ //! Copy constructor: private and intentionally not implemented.
+ Temp_Value_Holder(const Temp_Value_Holder&);
+
+ //! Assignment operator: private and intentionally not implemented.
+ Temp_Value_Holder& operator=(const Temp_Value_Holder&);
+
+ //! The held item.
+ T item_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+ : public Temp_Reference_Holder<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+ : public Temp_Value_Holder<T> {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_inlines.hh line 1. */
+/* Temp_* classes implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Temp_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+ : item_() {
+}
+
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+ return item_;
+}
+
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+ if (free_list_head != 0) {
+ Temp_Item* const p = free_list_head;
+ free_list_head = free_list_head->next;
+ return *p;
+ }
+ else
+ return *new Temp_Item();
+}
+
+template <typename T>
+inline void
+Temp_Item<T>::release(Temp_Item& p) {
+ p.next = free_list_head;
+ free_list_head = &p;
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder()
+ : held(Temp_Item<T>::obtain()) {
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+ Temp_Item<T>::release(held);
+}
+
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+ return held.item();
+}
+
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
+
+template <typename T>
+inline T&
+Temp_Value_Holder<T>::item() {
+ return item_;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#define PPL_DIRTY_TEMP(T, id) \
+ Parma_Polyhedra_Library::Dirty_Temp<PPL_U(T)> holder_ ## id; \
+ PPL_U(T)& PPL_U(id) = holder_ ## id.item()
+
+/* Automatically generated from PPL source file ../src/Temp_templates.hh line 1. */
+/* Temp_* classes implementation: non-inline template members.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 142. */
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 1. */
+/* Declaration of Rounding_Dir and related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Result_defs.hh line 1. */
+/* Result enum and supporting function declarations.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+enum Result_Class {
+ //! \hideinitializer Representable number result class.
+ VC_NORMAL = 0U << 4,
+
+ //! \hideinitializer Negative infinity result class.
+ VC_MINUS_INFINITY = 1U << 4,
+
+ //! \hideinitializer Positive infinity result class.
+ VC_PLUS_INFINITY = 2U << 4,
+
+ //! \hideinitializer Not a number result class.
+ VC_NAN = 3U << 4,
+
+ VC_MASK = VC_NAN
+};
+
+// This must be kept in sync with Relation_Symbol
+enum Result_Relation {
+ //! \hideinitializer No values satisfies the relation.
+ VR_EMPTY = 0U,
+
+ //! \hideinitializer Equal. This need to be accompanied by a value.
+ VR_EQ = 1U,
+
+ //! \hideinitializer Less than. This need to be accompanied by a value.
+ VR_LT = 2U,
+
+ //! \hideinitializer Greater than. This need to be accompanied by a value.
+ VR_GT = 4U,
+
+ //! \hideinitializer Not equal. This need to be accompanied by a value.
+ VR_NE = VR_LT | VR_GT,
+
+ //! \hideinitializer Less or equal. This need to be accompanied by a value.
+ VR_LE = VR_EQ | VR_LT,
+
+ //! \hideinitializer Greater or equal. This need to be accompanied by a value.
+ VR_GE = VR_EQ | VR_GT,
+
+ //! \hideinitializer All values satisfy the relation.
+ VR_LGE = VR_LT | VR_EQ | VR_GT,
+
+ VR_MASK = VR_LGE
+};
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+ //! \hideinitializer The exact result is not comparable.
+ V_EMPTY = VR_EMPTY,
+
+ //! \hideinitializer The computed result is exact.
+ V_EQ = static_cast<unsigned>(VR_EQ),
+
+ //! \hideinitializer The computed result is inexact and rounded up.
+ V_LT = static_cast<unsigned>(VR_LT),
+
+ //! \hideinitializer The computed result is inexact and rounded down.
+ V_GT = static_cast<unsigned>(VR_GT),
+
+ //! \hideinitializer The computed result is inexact.
+ V_NE = VR_NE,
+
+ //! \hideinitializer The computed result may be inexact and rounded up.
+ V_LE = VR_LE,
+
+ //! \hideinitializer The computed result may be inexact and rounded down.
+ V_GE = VR_GE,
+
+ //! \hideinitializer The computed result may be inexact.
+ V_LGE = VR_LGE,
+
+ //! \hideinitializer The exact result is a number out of finite bounds.
+ V_OVERFLOW = 1U << 6,
+
+ //! \hideinitializer A negative integer overflow occurred (rounding up).
+ V_LT_INF = V_LT | V_OVERFLOW,
+
+ //! \hideinitializer A positive integer overflow occurred (rounding down).
+ V_GT_SUP = V_GT | V_OVERFLOW,
+
+ //! \hideinitializer A positive integer overflow occurred (rounding up).
+ V_LT_PLUS_INFINITY = V_LT | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+ //! \hideinitializer A negative integer overflow occurred (rounding down).
+ V_GT_MINUS_INFINITY = V_GT | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+ //! \hideinitializer Negative infinity result.
+ V_EQ_MINUS_INFINITY = V_EQ | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+ //! \hideinitializer Positive infinity result.
+ V_EQ_PLUS_INFINITY = V_EQ | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+ //! \hideinitializer Not a number result.
+ V_NAN = static_cast<unsigned>(VC_NAN),
+
+ //! \hideinitializer Converting from unknown string.
+ V_CVT_STR_UNK = V_NAN | (1U << 8),
+
+ //! \hideinitializer Dividing by zero.
+ V_DIV_ZERO = V_NAN | (2U << 8),
+
+ //! \hideinitializer Adding two infinities having opposite signs.
+ V_INF_ADD_INF = V_NAN | (3U << 8),
+
+ //! \hideinitializer Dividing two infinities.
+ V_INF_DIV_INF = V_NAN | (4U << 8),
+
+ //! \hideinitializer Taking the modulus of an infinity.
+ V_INF_MOD = V_NAN | (5U << 8),
+
+ //! \hideinitializer Multiplying an infinity by zero.
+ V_INF_MUL_ZERO = V_NAN | (6U << 8),
+
+ //! \hideinitializer Subtracting two infinities having the same sign.
+ V_INF_SUB_INF = V_NAN | (7U << 8),
+
+ //! \hideinitializer Computing a remainder modulo zero.
+ V_MOD_ZERO = V_NAN | (8U << 8),
+
+ //! \hideinitializer Taking the square root of a negative number.
+ V_SQRT_NEG = V_NAN | (9U << 8),
+
+ //! \hideinitializer Unknown result due to intermediate negative overflow.
+ V_UNKNOWN_NEG_OVERFLOW = V_NAN | (10U << 8),
+
+ //! \hideinitializer Unknown result due to intermediate positive overflow.
+ V_UNKNOWN_POS_OVERFLOW = V_NAN | (11U << 8),
+
+ //! \hideinitializer The computed result is not representable.
+ V_UNREPRESENTABLE = 1U << 7
+
+};
+
+//! \name Functions Inspecting and/or Combining Result Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Result operator&(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator|(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator-(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Extracts the value class part of \p r (representable number,
+ unrepresentable minus/plus infinity or nan).
+*/
+Result_Class result_class(Result r);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Extracts the relation part of \p r.
+*/
+Result_Relation result_relation(Result r);
+
+/*! \ingroup PPL_CXX_interface */
+Result result_relation_class(Result r);
+
+//@} // Functions Inspecting and/or Combining Result Values
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_inlines.hh line 1. */
+/* Result supporting functions implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/assert.hh line 1. */
+/* Implementation of PPL assert-like macros.
+*/
+
+
+// The PPL_UNREACHABLE_MSG macro flags a program point as unreachable.
+// Argument `msg__' is added to output when assertions are turned on.
+#if defined(NDEBUG)
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library::ppl_unreachable()
+#else
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library:: \
+ ppl_unreachable_msg(msg__, __FILE__, __LINE__, __func__)
+#endif
+
+// The PPL_UNREACHABLE macro flags a program point as unreachable.
+#define PPL_UNREACHABLE PPL_UNREACHABLE_MSG("unreachable")
+
+// The PPL_ASSERTION_FAILED macro is used to output a message after
+// an assertion failure and then cause program termination.
+// (It is meant to be used only when assertions are turned on.)
+#define PPL_ASSERTION_FAILED(msg__) Parma_Polyhedra_Library:: \
+ ppl_assertion_failed(msg__, __FILE__, __LINE__, __func__)
+
+// Helper macro PPL_ASSERT_IMPL_: do not use it directly.
+#if defined(NDEBUG)
+#define PPL_ASSERT_IMPL_(cond__) ((void) 0)
+#else
+#define PPL_STRING_(s) #s
+#define PPL_ASSERT_IMPL_(cond__) \
+ ((cond__) ? (void) 0 : PPL_ASSERTION_FAILED(PPL_STRING_(cond__)))
+#endif
+
+
+// Non zero to detect use of PPL_ASSERT instead of PPL_ASSERT_HEAVY
+// Note: flag does not affect code built with NDEBUG defined.
+#define PPL_DEBUG_PPL_ASSERT 1
+
+// The PPL_ASSERT macro states that Boolean condition cond__ should hold.
+// This is meant to replace uses of C assert().
+#if defined(NDEBUG) || (!PPL_DEBUG_PPL_ASSERT)
+#define PPL_ASSERT(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+// Note: here we have assertions enabled and PPL_DEBUG_PPL_ASSERT is 1.
+// Check if the call to PPL_ASSERT should be replaced by PPL_ASSERT_HEAVY
+// (i.e., if the former may interfere with computational weights).
+#define PPL_ASSERT(cond__) \
+ do { \
+ typedef Parma_Polyhedra_Library::Weightwatch_Traits W_Traits; \
+ W_Traits::Threshold old_weight__ = W_Traits::weight; \
+ PPL_ASSERT_IMPL_(cond__); \
+ PPL_ASSERT_IMPL_(old_weight__ == W_Traits::weight \
+ && ("PPL_ASSERT_HEAVY has to be used here" != 0)); \
+ } while (false)
+#endif // !defined(NDEBUG) && PPL_DEBUG_PPL_ASSERT
+
+
+// Macro PPL_ASSERT_HEAVY is meant to be used when the evaluation of
+// the assertion may change computational weights (via WEIGHT_ADD).
+#if defined(NDEBUG)
+#define PPL_ASSERT_HEAVY(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+#define PPL_ASSERT_HEAVY(cond__) \
+ do { \
+ Parma_Polyhedra_Library::In_Assert guard; \
+ PPL_ASSERT_IMPL_(cond__); \
+ } while (false)
+#endif // !defined(NDEBUG)
+
+
+// Macro PPL_EXPECT (resp., PPL_EXPECT_HEAVY) should be used rather than
+// PPL_ASSERT (resp., PPL_ASSERT_HEAVY) when the condition is assumed to
+// hold but it is not under library control (typically, it depends on
+// user provided input).
+#define PPL_EXPECT(cond__) PPL_ASSERT(cond__)
+#define PPL_EXPECT_HEAVY(cond__) PPL_ASSERT_HEAVY(cond__)
+
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+#define PPL_WEAK_NORETURN __attribute__((weak, noreturn))
+#else
+#define PPL_WEAK_NORETURN __attribute__((noreturn))
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper function causing program termination by calling \c abort.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable() PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Helper function printing message on \c std::cerr and causing program
+ termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable_msg(const char* msg,
+ const char* file, unsigned int line,
+ const char* function) PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Helper function printing an assertion failure message on \c std::cerr
+ and causing program termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_assertion_failed(const char* assertion_text,
+ const char* file, unsigned int line,
+ const char* function) PPL_WEAK_NORETURN;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns \c true if and only if \p x_copy contains \p y_copy.
+
+ \note
+ This is a helper function for debugging purposes, to be used in assertions.
+ The two arguments are meant to be passed by value, i.e., <em>copied</em>,
+ so that their representations will not be affected by the containment check.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool copy_contains(T x_copy, T y_copy) {
+ return x_copy.contains(y_copy);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator&(Result x, Result y) {
+ const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+ return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator|(Result x, Result y) {
+ const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+ return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator-(Result x, Result y) {
+ const Result y_neg = static_cast<Result>(~static_cast<unsigned>(y));
+ return x & y_neg;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Class
+result_class(Result r) {
+ const Result rc = r & static_cast<Result>(VC_MASK);
+ return static_cast<Result_Class>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Relation
+result_relation(Result r) {
+ const Result rc = r & static_cast<Result>(VR_MASK);
+ return static_cast<Result_Relation>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+result_relation_class(Result r) {
+ return r & (static_cast<Result>(VR_MASK) | static_cast<Result>(VC_MASK));
+}
+
+inline int
+result_overflow(Result r) {
+ switch (result_class(r)) {
+ case VC_NORMAL:
+ switch (r) {
+ case V_LT_INF:
+ return -1;
+ case V_GT_SUP:
+ return 1;
+ default:
+ break;
+ }
+ break;
+ case VC_MINUS_INFINITY:
+ return -1;
+ case VC_PLUS_INFINITY:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+}
+
+inline bool
+result_representable(Result r) {
+ return (r & V_UNREPRESENTABLE) != V_UNREPRESENTABLE;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_defs.hh line 194. */
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 1. */
+/* Floating point unit related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/fpu_types.hh line 1. */
+
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/compiler.hh line 1. */
+/* C++ compiler related stuff.
+*/
+
+
+#include <cstddef>
+#include <climits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ No-op macro that allows to avoid unused variable warnings from
+ the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_USED(v) (void)(v)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ No-op function that force the compiler to store the argument and
+ to reread it from memory if needed (thus preventing CSE).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+PPL_CC_FLUSH(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+ __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+ // FIXME: is it possible to achieve the same effect in a portable way?
+ PPL_USED(x);
+#endif
+}
+
+#ifndef PPL_SUPPRESS_UNINIT_WARNINGS
+#define PPL_SUPPRESS_UNINIT_WARNINGS 1
+#endif
+
+#ifndef PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+#define PPL_SUPPRESS_UNINITIALIZED_WARNINGS 1
+#endif
+
+#if PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+template <typename T>
+struct Suppress_Uninitialized_Warnings_Type {
+ typedef T synonym;
+};
+
+#define PPL_UNINITIALIZED(type, name) \
+ PPL_U(type) PPL_U(name) \
+ = Suppress_Uninitialized_Warnings_Type<PPL_U(type)>::synonym ()
+#else
+#define PPL_UNINITIALIZED(type, name) \
+ PPL_U(type) name
+#endif
+
+#define sizeof_to_bits(size) \
+ ((size) * static_cast<std::size_t>(CHAR_BIT))
+
+#if !defined(__GNUC__)
+
+inline unsigned int
+clz32(uint32_t w) {
+ unsigned int r = 31;
+ if ((w & 0xffff0000U) != 0) {
+ w >>= 16;
+ r -= 16;
+ }
+ if ((w & 0xff00U) != 0) {
+ w >>= 8;
+ r -= 8;
+ }
+ if ((w & 0xf0U) != 0) {
+ w >>= 4;
+ r -= 4;
+ }
+ if ((w & 0xcU) != 0) {
+ w >>= 2;
+ r -= 2;
+ }
+ if ((w & 0x2U) != 0)
+ r -= 1;
+ return r;
+}
+
+inline unsigned int
+clz64(uint64_t w) {
+ if ((w & 0xffffffff00000000ULL) == 0)
+ return clz32(static_cast<uint32_t>(w)) + 32;
+ else
+ return clz32(static_cast<uint32_t>(w >> 32));
+}
+
+inline unsigned int
+ctz32(uint32_t w) {
+ static const unsigned int mod37_table[] = {
+ 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
+ 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
+ 5, 20, 8, 19, 18
+ };
+ return mod37_table[(w & -w) % 37];
+}
+
+inline unsigned int
+ctz64(uint64_t w) {
+ if ((w & 0x00000000ffffffffULL) == 0)
+ return ctz32(static_cast<uint32_t>(w >> 32)) + 32;
+ else
+ return ctz32(static_cast<uint32_t>(w));
+}
+
+#endif
+
+inline unsigned int
+clz(unsigned int u) {
+ assert(u != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clz(u));
+#elif PPL_SIZEOF_INT == 4
+ return clz32(u);
+#elif PPL_SIZEOF_INT == 8
+ return clz64(u);
+#else
+ #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long ul) {
+ assert(ul != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+ return clz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+ return clz64(ul);
+#else
+ #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long long ull) {
+ assert(ull != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_clzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+ return clz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+ return clz64(ull);
+#else
+ #error "Unsupported unsigned long long size"
+#endif
+}
+
+
+inline unsigned int
+ctz(unsigned int u) {
+ assert(u != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctz(u));
+#elif PPL_SIZEOF_INT == 4
+ return ctz32(u);
+#elif PPL_SIZEOF_INT == 8
+ return ctz64(u);
+#else
+ #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long ul) {
+ assert(ul != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+ return ctz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+ return ctz64(ul);
+#else
+ #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long long ull) {
+ assert(ull != 0);
+#if defined(__GNUC__)
+ return static_cast<unsigned int>(__builtin_ctzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+ return ctz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+ return ctz64(ull);
+#else
+ #error "Unsupported unsigned long long size"
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Functions Controlling Floating Point Unit
+//@{
+
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+ Sets the FPU rounding direction to \p dir and returns the rounding
+ control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+ Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+ computation</EM> status, and returns the rounding control word
+ previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+ Queries the <EM>inexact computation</EM> status.
+
+ Returns 0 if the computation was definitely exact, 1 if it was
+ definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+//@} // Functions Controlling Floating Point Unit
+
+} // namespace Parma_Polyhedra_Library
+
+#if PPL_CAN_CONTROL_FPU
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+/* Automatically generated from PPL source file ../src/fpu-ia32_inlines.hh line 1. */
+/* IA-32 floating point unit inline related functions.
+*/
+
+
+#include <csetjmp>
+#include <csignal>
+
+#define FPU_INVALID 0x01
+#define FPU_DIVBYZERO 0x04
+#define FPU_OVERFLOW 0x08
+#define FPU_UNDERFLOW 0x10
+#define FPU_INEXACT 0x20
+
+#define FPU_ALL_EXCEPT \
+ (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define PPL_FPU_TONEAREST 0
+#define PPL_FPU_DOWNWARD 0x400
+#define PPL_FPU_UPWARD 0x800
+#define PPL_FPU_TOWARDZERO 0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define SSE_INEXACT 0x20
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
+
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT \
+ (PPL_FPU_CONTROL_DEFAULT_BASE | PPL_FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT \
+ (PPL_SSE_CONTROL_DEFAULT_BASE | (PPL_FPU_UPWARD << 3))
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct {
+ unsigned short control_word;
+ unsigned short unused1;
+ unsigned short status_word;
+ unsigned short unused2;
+ unsigned short tags;
+ unsigned short unused3;
+ unsigned int eip;
+ unsigned short cs_selector;
+ unsigned int opcode:11;
+ unsigned int unused4:5;
+ unsigned int data_offset;
+ unsigned short data_selector;
+ unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+ unsigned short cw;
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
+ return cw;
+}
+
+inline void
+fpu_set_control(int c) {
+ unsigned short cw = static_cast<unsigned short>(c);
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
+}
+
+inline int
+fpu_get_status() {
+ unsigned short sw;
+ __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
+ return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+ /* There is no fldsw instruction */
+ ia32_fenv_t env;
+ __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+ env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+ __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
+}
+
+inline void
+fpu_clear_exceptions() {
+ __asm__ __volatile__ ("fnclex" : /* No outputs. */ : : "memory");
+}
+
+#ifdef PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+ __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
+
+inline unsigned int
+sse_get_control() {
+ unsigned int cw;
+ __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+ return cw;
+}
+#endif
+
+inline void
+fpu_initialize_control_functions() {
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern void detect_sse_unit();
+ detect_sse_unit();
+#endif
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+ return static_cast<fpu_rounding_control_word_type>(0);
+}
+
+inline void
+fpu_reset_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_clear_exceptions();
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ // NOTE: on entry to this function the current rounding mode
+ // has to be the default one.
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#ifdef PPL_FPMATH_MAY_USE_387
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit)
+ sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline int
+fpu_check_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+ if (fpu_get_status() & FPU_INEXACT)
+ return 1;
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+ extern bool have_sse_unit;
+ if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+ return 1;
+#endif
+ return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 87. */
+#elif defined(PPL_HAVE_IEEEFP_H) \
+ && (defined(__sparc) \
+ || defined(sparc) \
+ || defined(__sparc__))
+/* Automatically generated from PPL source file ../src/fpu-sparc_inlines.hh line 1. */
+/* SPARC floating point unit related functions.
+*/
+
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define PPL_FPU_TONEAREST ((int) FP_RN)
+#define PPL_FPU_UPWARD ((int) FP_RP)
+#define PPL_FPU_DOWNWARD ((int) FP_RM)
+#define PPL_FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fpgetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
+}
+
+inline void
+fpu_reset_inexact() {
+ fp_except except = fpgetmask();
+ except &= ~FP_X_IMP;
+ fpsetmask(except);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+ return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_IEEEFP_H)
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 92. */
+#elif defined(PPL_HAVE_FENV_H)
+/* Automatically generated from PPL source file ../src/fpu-c99_inlines.hh line 1. */
+/* C99 Floating point unit related functions.
+*/
+
+
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#include <stdexcept>
+
+#ifdef FE_TONEAREST
+#define PPL_FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define PPL_FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define PPL_FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define PPL_FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+ const int old = fegetround();
+ if (fesetround(PPL_FPU_DOWNWARD) != 0
+ || fesetround(PPL_FPU_UPWARD) != 0
+ || fesetround(old) != 0)
+ throw std::logic_error("PPL configuration error:"
+ " PPL_CAN_CONTROL_FPU evaluates to true,"
+ " but fesetround() returns nonzero.");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return static_cast<fpu_rounding_direction_type>(fegetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ const fpu_rounding_control_word_type old
+ = static_cast<fpu_rounding_control_word_type>(fegetround());
+ fesetround(dir);
+ return old;
+}
+
+inline void
+fpu_reset_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+ feclearexcept(FE_INEXACT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+ return fetestexcept(FE_INEXACT) != 0 ? 1 : 0;
+#else
+ return -1;
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_FENV_H)
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 94. */
+#else
+#error "PPL_CAN_CONTROL_FPU evaluates to true: why?"
+#endif
+
+#else // !PPL_CAN_CONTROL_FPU
+
+/* Automatically generated from PPL source file ../src/fpu-none_inlines.hh line 1. */
+/* Null floating point unit related functions.
+*/
+
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+ throw std::logic_error("PPL::fpu_initialize_control_functions():"
+ " cannot control the FPU");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ throw std::logic_error("PPL::fpu_get_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_set_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_save_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+ throw std::logic_error("PPL::fpu_reset_inexact():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int) {
+ throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+ throw std::logic_error("PPL::fpu_check_inexact():"
+ " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 101. */
+
+#endif // !PPL_CAN_CONTROL_FPU
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+ /*! \hideinitializer
+ Round toward \f$-\infty\f$.
+ */
+ ROUND_DOWN = 0U,
+
+ /*! \hideinitializer
+ Round toward \f$+\infty\f$.
+ */
+ ROUND_UP = 1U,
+
+ /*! \hideinitializer
+ Rounding is delegated to lower level. Result info is evaluated lazily.
+ */
+ ROUND_IGNORE = 6U,
+ ROUND_NATIVE = ROUND_IGNORE,
+
+ /*! \hideinitializer
+ Rounding is not needed: client code must ensure that the operation
+ result is exact and representable in the destination type.
+ Result info is evaluated lazily.
+ */
+ ROUND_NOT_NEEDED = 7U,
+
+ ROUND_DIRECT = ROUND_UP,
+ ROUND_INVERSE = ROUND_DOWN,
+
+ ROUND_DIR_MASK = 7U,
+
+ /*! \hideinitializer
+ The client code is willing to pay an extra price to know the exact
+ relation between the exact result and the computed one.
+ */
+ ROUND_STRICT_RELATION = 8U,
+
+ ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION
+};
+
+//! \name Functions Inspecting and/or Combining Rounding_Dir Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Returns the inverse rounding mode of \p dir,
+ <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir round_dir(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_down(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_up(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_ignore(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_needed(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_requested(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_direct(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_strict_relation(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
+
+//@} // Functions Inspecting and/or Combining Rounding_Dir Values
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_inlines.hh line 1. */
+/* Inline functions operating on enum Rounding_Dir values.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator&(Rounding_Dir x, Rounding_Dir y) {
+ const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+ return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator|(Rounding_Dir x, Rounding_Dir y) {
+ const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+ return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+ return dir & ROUND_DIR_MASK;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_down(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_DOWN;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_up(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_UP;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_ignore(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_IGNORE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_needed(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_requested(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_IGNORE || round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_direct(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_DIRECT;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_inverse(Rounding_Dir dir) {
+ return round_dir(dir) == ROUND_INVERSE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_strict_relation(Rounding_Dir dir) {
+ return (dir & ROUND_STRICT_RELATION) == ROUND_STRICT_RELATION;
+}
+
+#if PPL_CAN_CONTROL_FPU
+
+/*! \ingroup PPL_CXX_interface */
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+ case ROUND_DOWN:
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_DOWNWARD);
+ case ROUND_IGNORE: // Fall through.
+ default:
+ PPL_UNREACHABLE;
+ return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+ }
+}
+
+#undef PPL_FPU_DOWNWARD
+#undef PPL_FPU_TONEAREST
+#undef PPL_FPU_TOWARDZERO
+#undef PPL_FPU_UPWARD
+
+#endif
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ return ROUND_DOWN | (dir & ROUND_STRICT_RELATION);
+ case ROUND_DOWN:
+ return ROUND_UP | (dir & ROUND_STRICT_RELATION);
+ case ROUND_IGNORE:
+ return dir;
+ default:
+ PPL_UNREACHABLE;
+ return dir;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 122. */
+
+
+/* Automatically generated from PPL source file ../src/Numeric_Format_defs.hh line 1. */
+/* Numeric format.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Numeric_Format_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 1. */
+/* IEC 559 floating point format related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_types.hh line 1. */
+
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+ //! The universe element, i.e., the whole vector space.
+ UNIVERSE,
+ //! The empty element, i.e., the empty set.
+ EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+// This must be kept in sync with Result
+enum Relation_Symbol {
+ //! \hideinitializer Equal to.
+ EQUAL = 1U,
+ //! \hideinitializer Less than.
+ LESS_THAN = 2U,
+ //! \hideinitializer Less than or equal to.
+ LESS_OR_EQUAL = LESS_THAN | EQUAL,
+ //! \hideinitializer Greater than.
+ GREATER_THAN = 4U,
+ //! \hideinitializer Greater than or equal to.
+ GREATER_OR_EQUAL = GREATER_THAN | EQUAL,
+ //! \hideinitializer Not equal to.
+ NOT_EQUAL = LESS_THAN | GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+ //! Worst-case polynomial complexity.
+ POLYNOMIAL_COMPLEXITY,
+ //! Worst-case exponential complexity but typically polynomial behavior.
+ SIMPLEX_COMPLEXITY,
+ //! Any complexity.
+ ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+ //! Minimization is requested.
+ MINIMIZATION,
+ //! Maximization is requested.
+ MAXIMIZATION
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Widths of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Width {
+ //! \hideinitializer 8 bits.
+ BITS_8 = 8,
+
+ //! \hideinitializer 16 bits.
+ BITS_16 = 16,
+
+ //! \hideinitializer 32 bits.
+ BITS_32 = 32,
+
+ //! \hideinitializer 64 bits.
+ BITS_64 = 64,
+
+ //! \hideinitializer 128 bits.
+ BITS_128 = 128
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Representation of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Representation {
+ //! Unsigned binary.
+ UNSIGNED,
+
+ /*! \brief
+ Signed binary where negative values are represented by the two's
+ complement of the absolute value.
+ */
+ SIGNED_2_COMPLEMENT
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Overflow behavior of bounded integer types.
+
+ See the section on
+ \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Overflow {
+ /*! \brief
+ On overflow, wrapping takes place.
+
+ This means that, for a \f$w\f$-bit bounded integer, the computation
+ happens modulo \f$2^w\f$.
+ */
+ OVERFLOW_WRAPS,
+
+ /*! \brief
+ On overflow, the result is undefined.
+
+ This simply means that the result of the operation resulting in an
+ overflow can take any value.
+
+ \note
+ Even though something more serious can happen in the system
+ being analyzed ---due to, e.g., C's undefined behavior---, here we
+ are only concerned with the results of arithmetic operations.
+ It is the responsibility of the analyzer to ensure that other
+ manifestations of undefined behavior are conservatively approximated.
+ */
+ OVERFLOW_UNDEFINED,
+
+ /*! \brief
+ Overflow is impossible.
+
+ This is for the analysis of languages where overflow is trapped
+ before it affects the state, for which, thus, any indication that
+ an overflow may have affected the state is necessarily due to
+ the imprecision of the analysis.
+ */
+ OVERFLOW_IMPOSSIBLE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Possible representations of coefficient sequences (i.e. linear expressions
+ and more complex objects containing linear expressions, e.g. Constraints,
+ Generators, etc.).
+*/
+enum Representation {
+ /*! \brief
+ Dense representation: the coefficient sequence is represented as a vector
+ of coefficients, including the zero coefficients.
+ If there are only a few nonzero coefficients, this representation is
+ faster and also uses a bit less memory.
+ */
+ DENSE,
+
+ /*! \brief
+ Sparse representation: only the nonzero coefficient are stored.
+ If there are many nonzero coefficients, this improves memory consumption
+ and run time (both because there is less data to process in O(n)
+ operations and because finding zeroes/nonzeroes is much faster since
+ zeroes are not stored at all, so any stored coefficient is nonzero).
+ */
+ SPARSE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+ Floating point formats known to the library.
+
+ The parameters of each format are defined by a specific struct
+ in file Float_defs.hh. See the section on \ref floating_point
+ "Analysis of floating point computations" for more information.
+*/
+enum Floating_Point_Format {
+ //! IEEE 754 half precision, 16 bits (5 exponent, 10 mantissa).
+ IEEE754_HALF,
+
+ //! IEEE 754 single precision, 32 bits (8 exponent, 23 mantissa).
+ IEEE754_SINGLE,
+
+ //! IEEE 754 double precision, 64 bits (11 exponent, 52 mantissa).
+ IEEE754_DOUBLE,
+
+ //! IEEE 754 quad precision, 128 bits (15 exponent, 112 mantissa).
+ IEEE754_QUAD,
+
+ //! Intel double extended precision, 80 bits (15 exponent, 64 mantissa)
+ INTEL_DOUBLE_EXTENDED,
+
+ //! IBM single precision, 32 bits (7 exponent, 24 mantissa).
+ IBM_SINGLE,
+
+ //! IBM double precision, 64 bits (7 exponent, 56 mantissa).
+ IBM_DOUBLE
+};
+
+struct Weightwatch_Traits;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+/*
+ NOTE: Doxygen seems to ignore documentation blocks attached to
+ template class declarations that are not provided with a definition.
+ This justifies (here below) the explicit use of Doxygen command \class.
+*/
+
+/*! \brief The base class of all concrete expressions.
+ \class Parma_Polyhedra_Library::Concrete_Expression
+*/
+template <typename Target>
+class Concrete_Expression;
+
+/*! \brief A binary operator applied to two concrete expressions.
+ \class Parma_Polyhedra_Library::Binary_Operator
+*/
+template <typename Target>
+class Binary_Operator;
+
+/*! \brief A unary operator applied to one concrete expression.
+ \class Parma_Polyhedra_Library::Unary_Operator
+*/
+template <typename Target>
+class Unary_Operator;
+
+/*! \brief A cast operator converting one concrete expression to some type.
+ \class Parma_Polyhedra_Library::Cast_Operator
+*/
+template <typename Target>
+class Cast_Operator;
+
+/*! \brief An integer constant concrete expression.
+ \class Parma_Polyhedra_Library::Integer_Constant
+*/
+template <typename Target>
+class Integer_Constant;
+
+/*! \brief A floating-point constant concrete expression.
+ \class Parma_Polyhedra_Library::Floating_Point_Constant
+*/
+template <typename Target>
+class Floating_Point_Constant;
+
+/*! \brief A concrete expression representing a reference to some approximable.
+ \class Parma_Polyhedra_Library::Approximable_Reference
+*/
+template <typename Target>
+class Approximable_Reference;
+
+class Concrete_Expression_Type;
+
+/*! \brief
+ Encodes the kind of concrete expression.
+
+ The values should be defined by the particular instance
+ and uniquely identify one of: Binary_Operator, Unary_Operator,
+ Cast_Operator, Integer_Constant, Floating_Point_Constant, or
+ Approximable_Reference. For example, the Binary_Operator kind
+ integer constant should be defined by an instance as the member
+ <CODE>Binary_Operator\<T\>::%KIND</CODE>.
+*/
+typedef int Concrete_Expression_Kind;
+
+/*! \brief
+ Encodes a binary operator of concrete expressions.
+
+ The values should be uniquely defined by the particular instance and
+ named: ADD, SUB, MUL, DIV, REM, BAND, BOR, BXOR, LSHIFT, RSHIFT.
+*/
+typedef int Concrete_Expression_BOP;
+
+/*! \brief
+ Encodes a unary operator of concrete expressions.
+
+ The values should be uniquely defined by the particular instance and
+ named: PLUS, MINUS, BNOT.
+*/
+typedef int Concrete_Expression_UOP;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+class Linear_Form;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 34. */
+#include <set>
+#include <cmath>
+#include <map>
+#include <gmp.h>
+
+#ifdef NAN
+#define PPL_NAN NAN
+#else
+#define PPL_NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_half {
+ uint16_t word;
+ static const uint16_t SGN_MASK = 0x8000U;
+ static const uint16_t EXP_MASK = 0xfc00U;
+ static const uint16_t WRD_MAX = 0x7bffU;
+ static const uint16_t POS_INF = 0x7c00U;
+ static const uint16_t NEG_INF = 0xfc00U;
+ static const uint16_t POS_ZERO = 0x0000U;
+ static const uint16_t NEG_ZERO = 0x8000U;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 5;
+ static const unsigned int MANTISSA_BITS = 10;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_HALF;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000U;
+ static const uint32_t EXP_MASK = 0x7f800000U;
+ static const uint32_t WRD_MAX = 0x7f7fffffU;
+ static const uint32_t POS_INF = 0x7f800000U;
+ static const uint32_t NEG_INF = 0xff800000U;
+ static const uint32_t POS_ZERO = 0x00000000U;
+ static const uint32_t NEG_ZERO = 0x80000000U;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 8;
+ static const unsigned int MANTISSA_BITS = 23;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_SINGLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef WORDS_BIGENDIAN
+#ifndef PPL_WORDS_BIGENDIAN
+#define PPL_WORDS_BIGENDIAN
+#endif
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_double {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x80000000U;
+ static const uint32_t MSP_POS_INF = 0x7ff00000U;
+ static const uint32_t MSP_NEG_INF = 0xfff00000U;
+ static const uint32_t MSP_POS_ZERO = 0x00000000U;
+ static const uint32_t MSP_NEG_ZERO = 0x80000000U;
+ static const uint32_t LSP_INF = 0;
+ static const uint32_t LSP_ZERO = 0;
+ static const uint32_t MSP_MAX = 0x7fefffffU;
+ static const uint32_t LSP_MAX = 0xffffffffU;
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 11;
+ static const unsigned int MANTISSA_BITS = 52;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_DOUBLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000U;
+ static const uint32_t EXP_MASK = 0x7f000000U;
+ static const uint32_t WRD_MAX = 0x7fffffffU;
+ static const uint32_t POS_INF = 0x7f000000U;
+ static const uint32_t NEG_INF = 0xff000000U;
+ static const uint32_t POS_ZERO = 0x00000000U;
+ static const uint32_t NEG_ZERO = 0x80000000U;
+ static const unsigned int BASE = 16;
+ static const unsigned int EXPONENT_BITS = 7;
+ static const unsigned int MANTISSA_BITS = 24;
+ static const int EXPONENT_BIAS = 64;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IBM_SINGLE;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_double {
+ static const unsigned int BASE = 16;
+ static const unsigned int EXPONENT_BITS = 7;
+ static const unsigned int MANTISSA_BITS = 56;
+ static const int EXPONENT_BIAS = 64;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_intel_double_extended {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x00008000U;
+ static const uint32_t MSP_POS_INF = 0x00007fffU;
+ static const uint32_t MSP_NEG_INF = 0x0000ffffU;
+ static const uint32_t MSP_POS_ZERO = 0x00000000U;
+ static const uint32_t MSP_NEG_ZERO = 0x00008000U;
+ static const uint64_t LSP_INF = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t LSP_ZERO = 0;
+ static const uint32_t MSP_MAX = 0x00007ffeU;
+ static const uint64_t LSP_DMAX = static_cast<uint64_t>(0x7fffffffffffffffULL);
+ static const uint64_t LSP_NMAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 15;
+ static const unsigned int MANTISSA_BITS = 63;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format =
+ INTEL_DOUBLE_EXTENDED;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_quad {
+#ifdef PPL_WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ static const uint64_t MSP_SGN_MASK = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t MSP_POS_INF = static_cast<uint64_t>(0x7fff000000000000ULL);
+ static const uint64_t MSP_NEG_INF = static_cast<uint64_t>(0xffff000000000000ULL);
+ static const uint64_t MSP_POS_ZERO = static_cast<uint64_t>(0x0000000000000000ULL);
+ static const uint64_t MSP_NEG_ZERO = static_cast<uint64_t>(0x8000000000000000ULL);
+ static const uint64_t LSP_INF = 0;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t MSP_MAX = static_cast<uint64_t>(0x7ffeffffffffffffULL);
+ static const uint64_t LSP_MAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+ static const unsigned int BASE = 2;
+ static const unsigned int EXPONENT_BITS = 15;
+ static const unsigned int MANTISSA_BITS = 112;
+ static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+ static const int EXPONENT_BIAS = EXPONENT_MAX;
+ static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+ static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+ - static_cast<int>(MANTISSA_BITS);
+ static const Floating_Point_Format floating_point_format = IEEE754_QUAD;
+ int inf_sign() const;
+ bool is_nan() const;
+ int zero_sign() const;
+ bool sign_bit() const;
+ void negate();
+ void dec();
+ void inc();
+ void set_max(bool negative);
+ void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Float : public False { };
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> : public True {
+public:
+#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_FLOAT_BINARY_FORMAT"
+#endif
+ union {
+ float number;
+ Binary binary;
+ } u;
+ Float();
+ Float(float v);
+ float value();
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> : public True {
+public:
+#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_DOUBLE_BINARY_FORMAT"
+#endif
+ union {
+ double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(double v);
+ double value();
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> : public True {
+public:
+#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+ typedef float_ieee754_half Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+ typedef float_ieee754_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+ typedef float_ieee754_double Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+ typedef float_ibm_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+ typedef float_ieee754_quad Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+ typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_LONG_DOUBLE_BINARY_FORMAT"
+#endif
+ union {
+ long double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(long double v);
+ long double value();
+};
+#endif
+
+// FIXME: is this the right place for this function?
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If \p v is nonzero, returns the position of the most significant bit
+ in \p a.
+
+ The behavior is undefined if \p v is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+unsigned int msb_position(unsigned long long v);
+
+/*! \brief
+ An abstract class to be implemented by an external analyzer such
+ as ECLAIR in order to provide to the PPL the necessary information
+ for performing the analysis of floating point computations.
+
+ \par Template type parameters
+
+ - The class template parameter \p Target specifies the implementation
+ of Concrete_Expression to be used.
+ - The class template parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+*/
+template <typename Target, typename FP_Interval_Type>
+class FP_Oracle {
+public:
+ /*
+ FIXME: the const qualifiers on expressions may raise CLANG
+ compatibility issues. It may be necessary to omit them.
+ */
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly
+ approximates the floating point entity referenced by \p dim.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_interval(dimension_type dim, FP_Interval_Type& result) const
+ = 0;
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly
+ approximates the value of floating point constant \p expr.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_fp_constant_value(
+ const Floating_Point_Constant<Target>& expr,
+ FP_Interval_Type& result) const = 0;
+
+ /*! \brief
+ Asks the external analyzer for an interval that correctly approximates
+ the value of \p expr, which must be of integer type.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to find a correct
+ approximation, <CODE>false</CODE> otherwise.
+ */
+ virtual bool get_integer_expr_value(const Concrete_Expression<Target>& expr,
+ FP_Interval_Type& result) const = 0;
+
+ /*! \brief
+ Asks the external analyzer for the possible space dimensions that
+ are associated to the approximable reference \p expr.
+ Result is stored into \p result.
+
+ \return <CODE>true</CODE> if the analyzer was able to return
+ the (possibly empty!) set, <CODE>false</CODE> otherwise.
+
+ The resulting set MUST NOT contain <CODE>not_a_dimension()</CODE>.
+ */
+ virtual bool get_associated_dimensions(
+ const Approximable_Reference<Target>& expr,
+ std::set<dimension_type>& result) const = 0;
+
+};
+
+/* FIXME: some of the following documentation should probably be
+ under PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS */
+
+/*! \brief \relates Float
+ Returns <CODE>true</CODE> if and only if there is some floating point
+ number that is representable by \p f2 but not by \p f1.
+*/
+bool is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2);
+
+/*! \brief \relates Float
+ Computes the absolute error of floating point computations.
+
+ \par Template type parameters
+
+ - The class template parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+
+ \param analyzed_format The floating point format used by the analyzed
+ program.
+
+ \return The interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+ smallest non-zero positive number in the less precise floating point
+ format between the analyzer format and the analyzed format.
+*/
+template <typename FP_Interval_Type>
+const FP_Interval_Type&
+compute_absolute_error(Floating_Point_Format analyzed_format);
+
+/*! \brief \relates Linear_Form
+ Discards all linear forms containing variable \p var from the
+ linear form abstract store \p lf_store.
+*/
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var);
+
+/*! \brief \relates Linear_Form
+ Assigns the linear form \p lf to \p var in the linear form abstract
+ store \p lf_store, then discards all occurrences of \p var from it.
+*/
+template <typename FP_Interval_Type>
+void
+affine_form_image(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var,
+ const Linear_Form<FP_Interval_Type>& lf);
+
+/*! \brief \relates Linear_Form
+ Discards from \p ls1 all linear forms but those that are associated
+ to the same variable in \p ls2.
+*/
+template <typename FP_Interval_Type>
+void
+upper_bound_assign(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls1,
+ const std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_inlines.hh line 1. */
+/* IEC 559 floating point format related functions.
+*/
+
+
+#include <climits>
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 1. */
+/* Variable class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 30. */
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+/*! \relates Variable */
+void
+swap(Variable& x, Variable& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Variable represents a dimension of the space,
+ that is one of the Cartesian axes.
+ Variables are used as basic blocks in order to build
+ more complex linear expressions.
+ Each variable is identified by a non-negative integer,
+ representing the index of the corresponding Cartesian axis
+ (the first axis has index 0).
+ The space dimension of a variable is the dimension of the vector space
+ made by all the Cartesian axes having an index less than or equal to
+ that of the considered variable; thus, if a variable has index \f$i\f$,
+ its space dimension is \f$i+1\f$.
+
+ Note that the ``meaning'' of an object of the class Variable
+ is completely specified by the integer index provided to its
+ constructor:
+ be careful not to be mislead by C++ language variable names.
+ For instance, in the following example the linear expressions
+ <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+ since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+ the same Cartesian axis.
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(0);
+ Linear_Expression e1 = x + y;
+ Linear_Expression e2 = y + z;
+ \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+ //! Builds the variable corresponding to the Cartesian axis of index \p i.
+ /*!
+ \exception std::length_error
+ Thrown if <CODE>i+1</CODE> exceeds
+ <CODE>Variable::max_space_dimension()</CODE>.
+ */
+ explicit Variable(dimension_type i);
+
+ //! Returns the index of the Cartesian axis associated to the variable.
+ dimension_type id() const;
+
+ //! Returns the maximum space dimension a Variable can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ /*!
+ The returned value is <CODE>id()+1</CODE>.
+ */
+ dimension_type space_dimension() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Type of output functions.
+ typedef void output_function_type(std::ostream& s, const Variable v);
+
+ //! The default output function.
+ static void default_output_function(std::ostream& s, const Variable v);
+
+ //! Sets the output function to be used for printing Variable objects.
+ static void set_output_function(output_function_type* p);
+
+ //! Returns the pointer to the current output function.
+ static output_function_type* get_output_function();
+
+ //! Binary predicate defining the total ordering on variables.
+ /*! \ingroup PPL_CXX_interface */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(Variable x, Variable y) const;
+ };
+
+ //! Swaps *this and v.
+ void m_swap(Variable& v);
+
+private:
+ //! The index of the Cartesian axis.
+ dimension_type varid;
+
+ // The initialization class needs to set the default output function.
+ friend class Init;
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Variable v);
+
+ //! Pointer to the current output function.
+ static output_function_type* current_output_function;
+
+};
+
+/* Automatically generated from PPL source file ../src/Variable_inlines.hh line 1. */
+/* Variable class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 1. */
+/* Declarations of global objects.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Integer.hh line 1. */
+/* C integers info.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Integer.hh line 28. */
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing. In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<char> : public True {
+ enum const_bool_value {
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+ is_signed = true
+#else
+ is_signed = false
+#endif
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+ typedef unsigned char other_type;
+#else
+ typedef signed char other_type;
+#endif
+ static const char min = static_cast<char>(CHAR_MIN);
+ static const char max = static_cast<char>(CHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed char> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+ typedef unsigned char other_type;
+ static const signed char min = static_cast<signed char>(SCHAR_MIN);
+ static const signed char max = static_cast<signed char>(SCHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed char smaller_type;
+ typedef signed char smaller_signed_type;
+ typedef unsigned char smaller_unsigned_type;
+ typedef unsigned short other_type;
+ static const signed short min = static_cast<signed short>(SHRT_MIN);
+ static const signed short max = static_cast<signed short>(SHRT_MAX);
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed short smaller_type;
+ typedef signed short smaller_signed_type;
+ typedef unsigned short smaller_unsigned_type;
+ typedef unsigned int other_type;
+ static const signed int min = INT_MIN;
+ static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed int smaller_type;
+ typedef signed int smaller_signed_type;
+ typedef unsigned int smaller_unsigned_type;
+ typedef unsigned long other_type;
+ static const signed long min = LONG_MIN;
+ static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+ enum const_bool_value {
+ is_signed = true
+ };
+ typedef signed long smaller_type;
+ typedef signed long smaller_signed_type;
+ typedef unsigned long smaller_unsigned_type;
+ typedef unsigned long long other_type;
+ static const signed long long min = LLONG_MIN;
+ static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef void smaller_type;
+ typedef void smaller_signed_type;
+ typedef void smaller_unsigned_type;
+ typedef signed char other_type;
+ static const unsigned char min = static_cast<unsigned char>(0U);
+ static const unsigned char max = static_cast<unsigned char>(UCHAR_MAX);
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned char smaller_type;
+ typedef signed char smaller_signed_type;
+ typedef unsigned char smaller_unsigned_type;
+ typedef signed short other_type;
+ static const unsigned short min = static_cast<unsigned short>(0U);
+ static const unsigned short max = static_cast<unsigned short>(USHRT_MAX);
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned short smaller_type;
+ typedef signed short smaller_signed_type;
+ typedef unsigned short smaller_unsigned_type;
+ typedef signed int other_type;
+ static const unsigned int min = 0U;
+ static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned int smaller_type;
+ typedef signed int smaller_signed_type;
+ typedef unsigned int smaller_unsigned_type;
+ typedef signed long other_type;
+ static const unsigned long min = 0UL;
+ static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+ enum const_bool_value {
+ is_signed = false
+ };
+ typedef unsigned long smaller_type;
+ typedef signed long smaller_signed_type;
+ typedef unsigned long smaller_unsigned_type;
+ typedef signed long long other_type;
+ static const unsigned long long min = 0ULL;
+ static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 32. */
+#include <exception>
+#include <gmpxx.h>
+
+#ifndef PPL_PROFILE_ADD_WEIGHT
+#define PPL_PROFILE_ADD_WEIGHT 0
+#endif
+
+#if defined(NDEBUG) && PPL_PROFILE_ADD_WEIGHT
+/* Automatically generated from PPL source file ../src/Weight_Profiler_defs.hh line 1. */
+/* Weight_Profiler class declaration.
+*/
+
+#ifndef Weight_Profiler_defs_hh
+#define Weight_Profiler_defs_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+class Weight_Profiler {
+private:
+ enum { DISCARDED = 0, VALID = 1 };
+
+public:
+ Weight_Profiler(const char* file, int line,
+ Weightwatch_Traits::Delta delta,
+ double min_threshold = 0, double max_threshold = 0)
+ : file(file), line(line), delta(delta),
+ min_threshold(min_threshold), max_threshold(max_threshold) {
+ for (int i = 0; i < 2; ++i) {
+ stat[i].samples = 0;
+ stat[i].count = 0;
+ stat[i].sum = 0;
+ stat[i].squares_sum = 0;
+ stat[i].min = 0;
+ stat[i].max = 0;
+ }
+ }
+
+ ~Weight_Profiler() {
+ output_stats();
+ }
+
+ void output_stats();
+
+ static void begin() {
+#ifndef NDEBUG
+ int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+ assert(r >= 0);
+#else
+ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+#endif
+ }
+
+ void end(unsigned int factor = 1) {
+ Weightwatch_Traits::weight
+ += (Weightwatch_Traits::Threshold) delta * factor;
+ struct timespec start = stamp;
+ begin();
+ double elapsed;
+ if (stamp.tv_nsec >= start.tv_nsec) {
+ elapsed = (stamp.tv_nsec - start.tv_nsec)
+ + (stamp.tv_sec - start.tv_sec) * 1e9;
+ }
+ else {
+ elapsed = (1000000000 - start.tv_nsec + stamp.tv_nsec )
+ + (stamp.tv_sec - start.tv_sec - 1) * 1e9;
+ }
+ elapsed -= adjustment;
+ double elapsed1 = elapsed / factor;
+ int i = (elapsed1 < min_threshold
+ || (max_threshold > 0 && elapsed1 > max_threshold))
+ ? DISCARDED
+ : VALID;
+ ++stat[i].samples;
+ if (stat[i].count == 0)
+ stat[i].min = stat[i].max = elapsed1;
+ else if (stat[i].min > elapsed1)
+ stat[i].min = elapsed1;
+ else if (stat[i].max < elapsed1)
+ stat[i].max = elapsed1;
+ stat[i].sum += elapsed;
+ stat[i].squares_sum += elapsed * elapsed1;
+ stat[i].count += factor;
+ }
+
+ static double tune_adjustment();
+
+ private:
+ //! File of this profiling point.
+ const char *file;
+
+ //! Line of this profiling point.
+ int line;
+
+ //! Computational weight to be added at each iteration.
+ Weightwatch_Traits::Delta delta;
+
+ //! Times less than this value are discarded.
+ double min_threshold;
+
+ //! Times greater than this value are discarded.
+ double max_threshold;
+
+ //! Statistical data for samples (both DISCARDED and VALID)
+ struct {
+ //! Number of collected samples.
+ unsigned int samples;
+
+ /*! \brief
+ Number of collected iterations.
+
+ \note
+ Multiple iterations are possibly collected for each sample.
+ */
+ unsigned int count;
+
+ //! Sum of the measured times.
+ double sum;
+
+ //! Sum of the squares of the measured times (to compute variance).
+ double squares_sum;
+
+ //! Minimum measured time.
+ double min;
+
+ //! Maximum measured time.
+ double max;
+ } stat[2];
+
+ //! Holds the time corresponding to last time begin() was called.
+ static struct timespec stamp;
+
+ /*! \brief
+ Time quantity used to adjust the elapsed times so as not to take
+ into account the time spent by the measurement infrastructure.
+ */
+ static double adjustment;
+};
+
+}
+
+#endif // Weight_Profiler_defs_hh
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 41. */
+#endif
+
+#if defined(NDEBUG)
+
+#if PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() Weight_Profiler::begin()
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ static Weight_Profiler wp__(__FILE__, __LINE__, delta); \
+ wp__.end(); \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ static Weight_Profiler wp__(__FILE__, __LINE__, delta); \
+ wp__.end(factor); \
+ } while (false)
+
+#else // !PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() \
+ do { \
+ } while (false)
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ Weightwatch_Traits::weight += (delta); \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ Weightwatch_Traits::weight += (delta)*(factor); \
+ } while (false)
+
+#endif // !PPL_PROFILE_ADD_WEIGHT
+
+#else // !defined(NDEBUG)
+
+#define WEIGHT_BEGIN()
+
+#define WEIGHT_ADD(delta) \
+ do { \
+ if (!In_Assert::asserting()) \
+ Weightwatch_Traits::weight += delta; \
+ } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor) \
+ do { \
+ if (!In_Assert::asserting()) \
+ Weightwatch_Traits::weight += delta * factor; \
+ } while (false)
+
+#endif // !defined(NDEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the hash code for space dimension \p dim.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int32_t
+hash_code_from_dimension(dimension_type dim);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Make sure swap() is specialized when needed.
+
+ This will cause a compile-time error whenever a specialization for \p T
+ is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+ PPL_COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
+}
+
+/*! \brief
+ Declare a local variable named \p id, of type Coefficient, and containing
+ an unknown initial value.
+
+ Use of this macro to declare temporaries of type Coefficient results
+ in decreased memory allocation overhead and in better locality.
+*/
+#define PPL_DIRTY_TEMP_COEFFICIENT(id) \
+PPL_DIRTY_TEMP(Parma_Polyhedra_Library::Coefficient, id)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+ \return
+ The actual capacity to be allocated.
+
+ \param requested_size
+ The number of elements we need.
+
+ \param maximum_size
+ The maximum number of elements to be allocated. It is assumed
+ to be no less than \p requested_size.
+
+ Computes a capacity given a requested size.
+ Allows for speculative allocation aimed at reducing the number of
+ reallocations enough to guarantee amortized constant insertion time
+ for our vector-like data structures. In all cases, the speculative
+ allocation will not exceed \p maximum_size.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+compute_capacity(dimension_type requested_size,
+ dimension_type maximum_size);
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Traits class for the deterministic timeout mechanism.
+/*! \ingroup PPL_CXX_interface
+ This abstract base class should be instantiated by those users
+ willing to provide a polynomial upper bound to the time spent
+ by any invocation of a library operator.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Weightwatch_Traits {
+ //! The type used to specify thresholds for computational weight.
+ typedef unsigned long long Threshold;
+
+ //! The type used to specify increments of computational weight.
+ typedef unsigned long long Delta;
+
+ //! Returns the current computational weight.
+ static const Threshold& get();
+
+ //! Compares the two weights \p a and \p b.
+ static bool less_than(const Threshold& a, const Threshold& b);
+
+ //! Computes a \c Delta value from \p unscaled and \p scale.
+ /*!
+ \return
+ \f$u \cdot 2^s\f$, where \f$u\f$ is the value of \p unscaled and
+ \f$s\f$ is the value of \p scale.
+
+ \param unscaled
+ The value of delta before scaling.
+
+ \param scale
+ The scaling to be applied to \p unscaled.
+ */
+ static Delta compute_delta(unsigned long unscaled, unsigned scale);
+
+ //! Sets \p threshold to be \p delta units bigger than the current weight.
+ static void from_delta(Threshold& threshold, const Delta& delta);
+
+ //! The current computational weight.
+ static Threshold weight;
+
+ /*! \brief
+ A pointer to the function that has to be called when checking
+ the reaching of thresholds.
+
+ The pointer can be null if no thresholds are set.
+ */
+ static void (*check_function)(void);
+};
+
+
+#ifndef NDEBUG
+
+class In_Assert {
+private:
+ //! Non zero during evaluation of PPL_ASSERT expression.
+ static unsigned int count;
+public:
+ In_Assert() {
+ ++count;
+ }
+ ~In_Assert() {
+ --count;
+ }
+ static bool asserting() {
+ return count != 0;
+ }
+};
+
+#endif
+
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+ This abstract base class should be instantiated by those users
+ willing to provide a polynomial upper bound to the time spent
+ by any invocation of a library operator.
+*/
+class Throwable {
+public:
+ //! Throws the user defined exception object.
+ virtual void throw_me() const = 0;
+
+ //! Virtual destructor.
+ virtual ~Throwable();
+};
+
+/*! \brief
+ A pointer to an exception object.
+
+ \ingroup PPL_CXX_interface
+ This pointer, which is initialized to zero, is repeatedly checked
+ along any super-linear (i.e., computationally expensive) computation
+ path in the library.
+ When it is found nonzero the exception it points to is thrown.
+ In other words, making this pointer point to an exception (and
+ leaving it in this state) ensures that the library will return
+ control to the client application, possibly by throwing the given
+ exception, within a time that is a linear function of the size
+ of the representation of the biggest object (powerset of polyhedra,
+ polyhedron, system of constraints or generators) on which the library
+ is operating upon.
+
+ \note
+ The only sensible way to assign to this pointer is from within a
+ signal handler or from a parallel thread. For this reason, the
+ library, apart from ensuring that the pointer is initially set to zero,
+ never assigns to it. In particular, it does not zero it again when
+ the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If the pointer abandon_expensive_computations is found
+ to be nonzero, the exception it points to is thrown.
+
+ \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+ Tag class to distinguish those constructors that recycle the data
+ structures of their arguments, instead of taking a copy.
+*/
+struct Recycle_Input {
+};
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#define PPL_OUTPUT_DECLARATIONS \
+ /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+ void ascii_dump() const; \
+ /*! \brief Writes to \p s an ASCII representation of \p *this. */ \
+ void ascii_dump(std::ostream& s) const; \
+ /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */ \
+ void print() const;
+
+#define PPL_OUTPUT_DEFINITIONS(class_name) \
+ void \
+ Parma_Polyhedra_Library::class_name::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ void \
+ Parma_Polyhedra_Library::class_name::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name) \
+ void \
+ Parma_Polyhedra_Library::class_name::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ void \
+ Parma_Polyhedra_Library::class_name::print() const { \
+ std::cerr << "No user level output operator defined " \
+ << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+ }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix) \
+ template <typename type_symbol> \
+ void \
+ class_prefix::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol> \
+ void \
+ class_prefix::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \
+ type_symbol2, \
+ class_prefix) \
+ template <typename type_symbol1, typename type_symbol2> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)> \
+ ::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol1, typename type_symbol2> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)> \
+ ::print() const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \
+ type_symbol2, \
+ type_symbol3, \
+ class_prefix) \
+ template <typename type_symbol1, typename type_symbol2, \
+ typename type_symbol3> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2, \
+ PPL_U(type_symbol3)>::ascii_dump() \
+ const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol1, typename type_symbol2, \
+ typename type_symbol3> \
+ void \
+ PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2, \
+ PPL_U(type_symbol3)>::print() \
+ const { \
+ using IO_Operators::operator<<; \
+ std::cerr << *this; \
+ }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+ template <typename type_symbol> \
+ void \
+ class_prefix::ascii_dump() const { \
+ ascii_dump(std::cerr); \
+ } \
+ \
+ template <typename type_symbol> \
+ void \
+ class_prefix::print() const { \
+ std::cerr << "No user level output operator defined " \
+ << "for " PPL_XSTR(class_prefix) << "." << std::endl; \
+ }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if \p c is any kind of space character.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_space(char c);
+
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type> {
+ enum {
+ value = (v >= static_cast<long long>(C_Integer<T>::min)
+ && v <= static_cast<long long>(C_Integer<T>::max))
+ };
+};
+
+template <typename T, T v>
+struct TConstant {
+ static const T value = v;
+};
+
+
+template <typename T, T v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+ typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+//! \cond
+// Keep Doxygen off until it learns how to deal properly with `||'.
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+ typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+ && (prefer_signed
+ || !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+ : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+ typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+ && (!prefer_signed
+ || !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+ : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+//! \endcond
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Memory Size Inspection Functions
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ For native types, returns the total size in bytes of the memory
+ occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ For native types, returns the size in bytes of the memory managed
+ by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@} // Memory Size Inspection Functions
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+ : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+ return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
+void ascii_dump(std::ostream& s, Representation r);
+bool ascii_load(std::istream& s, Representation& r);
+
+dimension_type
+check_space_dimension_overflow(dimension_type dim,
+ dimension_type max,
+ const char* domain,
+ const char* method,
+ const char* reason);
+
+template <typename RA_Container>
+typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n);
+
+template <typename RA_Container>
+typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n);
+
+dimension_type
+least_significant_one_mask(dimension_type i);
+
+} // namespace Parma_Polyhedra_Library
+
+// By default, use sparse matrices both for MIP_Problem and PIP_Problem.
+#ifndef PPL_USE_SPARSE_MATRIX
+#define PPL_USE_SPARSE_MATRIX 1
+#endif
+
+/* Automatically generated from PPL source file ../src/globals_inlines.hh line 1. */
+/* Implementation of global objects: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_inlines.hh line 28. */
+#include <limits>
+#include <cassert>
+#include <istream>
+#include <ostream>
+#include <cctype>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+ return std::numeric_limits<dimension_type>::max();
+}
+
+inline int32_t
+hash_code_from_dimension(dimension_type dim) {
+ const dimension_type divisor = 1U << (32 - 1);
+ dim = dim % divisor;
+ return static_cast<int32_t>(dim);
+}
+
+inline const Weightwatch_Traits::Threshold&
+Weightwatch_Traits::get() {
+ return weight;
+}
+
+inline bool
+Weightwatch_Traits::less_than(const Threshold& a, const Threshold& b) {
+ return b - a < (1ULL << (sizeof_to_bits(sizeof(Threshold)) - 1));
+}
+
+inline Weightwatch_Traits::Delta
+Weightwatch_Traits::compute_delta(unsigned long unscaled, unsigned scale) {
+ if ((std::numeric_limits<Delta>::max() >> scale) < unscaled)
+ throw std::invalid_argument("PPL::Weightwatch_Traits::"
+ "compute_delta(u, s):\n"
+ "values of u and s cause wrap around.");
+ return static_cast<Delta>(unscaled) << scale;
+}
+
+inline void
+Weightwatch_Traits::from_delta(Threshold& threshold, const Delta& delta) {
+ threshold = weight + delta;
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+#ifndef NDEBUG
+ if (In_Assert::asserting())
+ return;
+#endif
+ if (Weightwatch_Traits::check_function != 0)
+ Weightwatch_Traits::check_function();
+ if (const Throwable* const p = abandon_expensive_computations)
+ p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+ const dimension_type maximum_size) {
+ assert(requested_size <= maximum_size);
+ // Speculation factor 2.
+ return (requested_size < maximum_size/2)
+ ? (2*(requested_size + 1))
+ : maximum_size;
+ // Speculation factor 1.5.
+ // return (maximum_size - requested_size > requested_size/2)
+ // ? requested_size + requested_size/2 + 1
+ // : maximum_size;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+ return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+ return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+ return static_cast<memory_size_type>(x.get_mpz_t()[0]._mp_alloc)
+ * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+ return external_memory_in_bytes(x.get_num())
+ + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline void
+ascii_dump(std::ostream& s, Representation r) {
+ if (r == DENSE)
+ s << "DENSE";
+ else
+ s << "SPARSE";
+}
+
+inline bool
+ascii_load(std::istream& is, Representation& r) {
+ std::string s;
+ if (!(is >> s))
+ return false;
+
+ if (s == "DENSE") {
+ r = DENSE;
+ return true;
+ }
+ if (s == "SPARSE") {
+ r = SPARSE;
+ return true;
+ }
+ return false;
+}
+
+inline bool
+is_space(char c) {
+ return isspace(c) != 0;
+}
+
+template <typename RA_Container>
+inline typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n) {
+ typedef typename RA_Container::difference_type diff_t;
+ return cont.begin() + static_cast<diff_t>(n);
+}
+
+template <typename RA_Container>
+inline typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n) {
+ typedef typename RA_Container::difference_type diff_t;
+ return cont.begin() + static_cast<diff_t>(n);
+}
+
+inline dimension_type
+least_significant_one_mask(const dimension_type i) {
+ return i & (~i + 1U);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 568. */
+
+/* Automatically generated from PPL source file ../src/Variable_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+ return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+ : varid((i < max_space_dimension())
+ ? i
+ : (throw std::length_error("PPL::Variable::Variable(i):\n"
+ "i exceeds the maximum allowed "
+ "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+ return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+ return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+ return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+ current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+ return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+ return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+ return less(x, y);
+}
+
+inline void
+Variable::m_swap(Variable& v) {
+ using std::swap;
+ swap(varid, v.varid);
+}
+
+inline void
+swap(Variable& x, Variable& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 156. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 1. */
+/* Linear_Form class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+class Box_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 32. */
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Form */
+template <typename C>
+void swap(Linear_Form<C>& x, Linear_Form<C>& y);
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear form \p f1 + \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f);
+
+//! Returns the linear form - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f);
+
+//! Returns the linear form \p f1 - \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f * \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 + \p f2 and assigns it to \p e1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f + \p v and assigns it to \p f.
+/*! \relates Linear_Form
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f + \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 - \p f2 and assigns it to \p f1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f - \p v and assigns it to \p f.
+/*! \relates Linear_Form
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f - \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f / \p n and assigns it to \p f.
+/*!
+ \relates Linear_Form
+ Performs the division of a linear form by a scalar. It is up to the user to
+ ensure that division by 0 is not performed.
+*/
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream& operator<<(std::ostream& s, const Linear_Form<C>& f);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear form with interval coefficients.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Form represents the interval linear form
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the inhomogeneous term.
+ The coefficients and the inhomogeneous term of the linear form
+ have the template parameter \p C as their type. \p C must be the
+ type of an Interval.
+
+ \par How to build a linear form.
+ A full set of functions is defined in order to provide a convenient
+ interface for building complex linear forms starting from simpler ones
+ and from objects of the classes Variable and \p C. Available operators
+ include binary addition and subtraction, as well as multiplication and
+ division by a coefficient.
+ The space dimension of a linear form is defined as
+ the highest variable dimension among variables that have a nonzero
+ coefficient in the linear form, or zero if no such variable exists.
+ The space dimension for each variable \f$x_i\f$ is given by \f$i + 1\f$.
+
+ \par Example
+ Given the type \p T of an Interval with floating point coefficients (though
+ any integral type may also be used), the following code builds the interval
+ linear form \f$lf = x_5 - x_2 + 1\f$ with space dimension 6:
+ \code
+ Variable x5(5);
+ Variable x2(2);
+ T x5_coefficient;
+ x5_coefficient.lower() = 2.0;
+ x5_coefficient.upper() = 3.0;
+ T inhomogeneous_term;
+ inhomogeneous_term.lower() = 4.0;
+ inhomogeneous_term.upper() = 8.0;
+ Linear_Form<T> lf(x2);
+ lf = -lf;
+ lf += Linear_Form<T>(x2);
+ Linear_Form<T> lf_x5(x5);
+ lf_x5 *= x5_coefficient;
+ lf += lf_x5;
+ \endcode
+ Note that \c lf_x5 is created with space dimension 6, while \c lf is
+ created with space dimension 0 and then extended first to space
+ dimension 2 when \c x2 is subtracted and finally to space dimension
+ 6 when \c lf_x5 is added.
+*/
+template <typename C>
+class Parma_Polyhedra_Library::Linear_Form {
+public:
+ //! Default constructor: returns a copy of Linear_Form::zero().
+ Linear_Form();
+
+ //! Ordinary copy constructor.
+ Linear_Form(const Linear_Form& f);
+
+ //! Destructor.
+ ~Linear_Form();
+
+ //! Builds the linear form corresponding to the inhomogeneous term \p n.
+ explicit Linear_Form(const C& n);
+
+ //! Builds the linear form corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+ Linear_Form(Variable v);
+
+ //! Builds a linear form approximating the linear expression \p e.
+ Linear_Form(const Linear_Expression& e);
+
+ //! Returns the maximum space dimension a Linear_Form can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ const C& coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ const C& inhomogeneous_term() const;
+
+ //! Negates all the coefficients of \p *this.
+ void negate();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_Form& y);
+
+ // Floating point analysis related methods.
+
+ /*! \brief
+ Verifies if the linear form overflows.
+
+ \return
+ Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+ <CODE>true</CODE> otherwise.
+
+ \p T must be the type of possibly unbounded quantities.
+ */
+ bool overflows() const;
+
+ /*! \brief
+ Computes the relative error associated to floating point computations
+ that operate on a quantity that is overapproximated by \p *this.
+
+ \param analyzed_format The floating point format used by the analyzed
+ program.
+ \param result Becomes the linear form corresponding to the relative
+ error committed.
+
+ This method makes <CODE>result</CODE> become a linear form
+ obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+ on the linear form. This function is defined as:
+ \f[
+ \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+ \defeq
+ (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+ +
+ \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+ \amifp
+ [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+ \f]
+ where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+ \f$\beta\f$ the base.
+
+ The result is undefined if \p T is not the type of an interval with
+ floating point boundaries.
+ */
+ void relative_error(Floating_Point_Format analyzed_format,
+ Linear_Form& result) const;
+
+ /*! \brief
+ Makes \p result become an interval that overapproximates all the
+ possible values of \p *this.
+
+ \param oracle The FP_Oracle to be queried.
+ \param result The linear form that will store the result.
+
+ \return <CODE>true</CODE> if the operation was successful,
+ <CODE>false</CODE> otherwise (the possibility of failure
+ depends on the oracle's implementation).
+
+ \par Template type parameters
+
+ - The class template parameter \p Target specifies the implementation
+ of Concrete_Expression to be used.
+
+ This method makes <CODE>result</CODE> become
+ \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+ \f[
+ \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+ \defeq
+ i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+ \rho^{\#}(v)\right)
+ \f]
+ where \f$\rho^{\#}(v)\f$ is an interval (provided by the oracle)
+ that correctly approximates the value of \f$v\f$.
+
+ The result is undefined if \p C is not the type of an interval with
+ floating point boundaries.
+ */
+ template <typename Target>
+ bool intervalize(const FP_Oracle<Target,C>& oracle, C& result) const;
+
+private:
+ //! The generic coefficient equal to the singleton zero.
+ static C zero;
+
+ //! Type of the container vector.
+ typedef std::vector<C> vec_type;
+
+ //! The container vector.
+ vec_type vec;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with
+ the constructor Linear_Form(const C& n).
+ */
+ Linear_Form(dimension_type sz, bool);
+
+ /*! \brief
+ Builds the linear form corresponding to the difference of
+ \p v and \p w.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p v or the one of \p w exceed
+ <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+ Linear_Form(Variable v, Variable w);
+
+ //! Gives the number of generic coefficients currently in use.
+ dimension_type size() const;
+
+ //! Extends the vector of \p *this to size \p sz.
+ void extend(dimension_type sz);
+
+ //! Returns a reference to \p vec[i].
+ C& operator[](dimension_type i);
+
+ //! Returns a const reference to \p vec[i].
+ const C& operator[](dimension_type i) const;
+
+ friend Linear_Form<C>
+ operator+<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>
+ operator+<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator+<C>(const Linear_Form<C>& f, const C& n);
+ friend Linear_Form<C>
+ operator+<C>(Variable v, const Linear_Form<C>& f);
+
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f);
+
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>
+ operator-<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f, const C& n);
+ friend Linear_Form<C>
+ operator-<C>(Variable v, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator-<C>(const Linear_Form<C>& f, Variable v);
+
+ friend Linear_Form<C>
+ operator*<C>(const C& n, const Linear_Form<C>& f);
+ friend Linear_Form<C>
+ operator*<C>(const Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f, Variable v);
+ friend Linear_Form<C>&
+ operator+=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f, Variable v);
+ friend Linear_Form<C>&
+ operator-=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator*=<C>(Linear_Form<C>& f, const C& n);
+
+ friend Linear_Form<C>&
+ operator/=<C>(Linear_Form<C>& f, const C& n);
+
+ friend bool
+ operator==<C>(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<C>(std::ostream& s, const Linear_Form<C>& f);
+};
+
+/* Automatically generated from PPL source file ../src/Linear_Form_inlines.hh line 1. */
+/* Linear_Form class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Form_inlines.hh line 28. */
+#include <iostream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::max_space_dimension() {
+ return vec_type().max_size() - 1;
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form()
+ : vec(1, zero) {
+ vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(dimension_type sz, bool)
+ : vec(sz, zero) {
+ vec.reserve(compute_capacity(sz, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const Linear_Form& f)
+ : vec(f.vec) {
+}
+
+template <typename C>
+inline
+Linear_Form<C>::~Linear_Form() {
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::size() const {
+ return vec.size();
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::extend(dimension_type sz) {
+ assert(sz > size());
+ vec.reserve(compute_capacity(sz, vec_type().max_size()));
+ vec.resize(sz, zero);
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const C& n)
+ : vec(1, n) {
+ vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::space_dimension() const {
+ return size() - 1;
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return zero;
+ return vec[v.id()+1];
+}
+
+template <typename C>
+inline C&
+Linear_Form<C>::operator[](dimension_type i) {
+ assert(i < size());
+ return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::operator[](dimension_type i) const {
+ assert(i < size());
+ return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::inhomogeneous_term() const {
+ return vec[0];
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f) {
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n) {
+ return n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const Variable v) {
+ return v + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n) {
+ return -n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Variable v, const Variable w) {
+ return Linear_Form<C>(v, w);
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n) {
+ return n * f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n) {
+ f[0] += n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n) {
+ f[0] -= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+ return !(x == y);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::m_swap(Linear_Form& y) {
+ using std::swap;
+ swap(vec, y.vec);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::ascii_dump(std::ostream& s) const {
+ using namespace IO_Operators;
+ dimension_type space_dim = space_dimension();
+ s << space_dim << "\n";
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ const char separator = ' ';
+ s << vec[i] << separator;
+ }
+ s << "\n";
+}
+
+template <typename C>
+inline bool
+Linear_Form<C>::ascii_load(std::istream& s) {
+ using namespace IO_Operators;
+ dimension_type new_dim;
+ if (!(s >> new_dim))
+ return false;
+
+ vec.resize(new_dim + 1, zero);
+ for (dimension_type i = 0; i <= new_dim; ++i) {
+ if (!(s >> vec[i]))
+ return false;
+ }
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+inline bool
+Linear_Form<C>::overflows() const {
+ if (!inhomogeneous_term().is_bounded())
+ return true;
+
+ for (dimension_type i = space_dimension(); i-- > 0; ) {
+ if (!coefficient(Variable(i)).is_bounded())
+ return true;
+ }
+
+ return false;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline void
+swap(Linear_Form<C>& x, Linear_Form<C>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 497. */
+// Linear_Form_templates.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Float_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_half::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_half::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_half::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_half::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_half::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_half::dec() {
+ --word;
+}
+
+inline void
+float_ieee754_half::inc() {
+ ++word;
+}
+
+inline void
+float_ieee754_half::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_half::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint16_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint16_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_single::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_single::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_single::dec() {
+ --word;
+}
+
+inline void
+float_ieee754_single::inc() {
+ ++word;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_double::is_nan() const {
+ const uint32_t a = msp & ~MSP_SGN_MASK;
+ return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ if (msp == MSP_NEG_ZERO)
+ return -1;
+ if (msp == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_double::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_double::dec() {
+ if (lsp == 0) {
+ --msp;
+ lsp = LSP_MAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_ieee754_double::inc() {
+ if (lsp == LSP_MAX) {
+ ++msp;
+ lsp = 0;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_MAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+ unsigned long m;
+#if ULONG_MAX == 0xffffffffUL
+ lsp = mpz_get_ui(mantissa);
+ mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+ m = mpz_get_ui(mantissa);
+#else
+ m = mpz_get_ui(mantissa);
+ lsp = static_cast<uint32_t>(m & LSP_MAX);
+ m >>= 32;
+#endif
+ msp = static_cast<uint32_t>(m & ((1UL << (MANTISSA_BITS - 32)) - 1));
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint32_t>(exponent_repr) << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_ibm_single::inf_sign() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ibm_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ibm_single::zero_sign() const {
+ if (word == NEG_ZERO)
+ return -1;
+ if (word == POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ibm_single::negate() {
+ word ^= SGN_MASK;
+}
+
+inline bool
+float_ibm_single::sign_bit() const {
+ return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ibm_single::dec() {
+ --word;
+}
+
+inline void
+float_ibm_single::inc() {
+ ++word;
+}
+
+inline void
+float_ibm_single::set_max(bool negative) {
+ word = WRD_MAX;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ibm_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+ & ((1UL << MANTISSA_BITS) - 1));
+ if (negative)
+ word |= SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_intel_double_extended::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ const uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_INF)
+ return -1;
+ if (a == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_intel_double_extended::is_nan() const {
+ return (msp & MSP_POS_INF) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ const uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_ZERO)
+ return -1;
+ if (a == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_intel_double_extended::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_intel_double_extended::dec() {
+ if ((lsp & LSP_DMAX) == 0) {
+ --msp;
+ lsp = ((msp & MSP_NEG_INF) == 0) ? LSP_DMAX : LSP_NMAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_intel_double_extended::inc() {
+ if ((lsp & LSP_DMAX) == LSP_DMAX) {
+ ++msp;
+ lsp = LSP_DMAX + 1;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_NMAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+ mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+ mpz_export(&lsp, 0, -1, sizeof(lsp), 0, 0, mantissa);
+#else
+ lsp = mpz_get_ui(mantissa);
+#endif
+ msp = (negative ? MSP_SGN_MASK : 0);
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint32_t>(exponent_repr);
+}
+
+inline int
+float_ieee754_quad::inf_sign() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline bool
+float_ieee754_quad::is_nan() const {
+ return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::zero_sign() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ if (msp == MSP_NEG_ZERO)
+ return -1;
+ if (msp == MSP_POS_ZERO)
+ return 1;
+ return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+ msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_quad::sign_bit() const {
+ return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_quad::dec() {
+ if (lsp == 0) {
+ --msp;
+ lsp = LSP_MAX;
+ }
+ else
+ --lsp;
+}
+
+inline void
+float_ieee754_quad::inc() {
+ if (lsp == LSP_MAX) {
+ ++msp;
+ lsp = 0;
+ }
+ else
+ ++lsp;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+ msp = MSP_MAX;
+ lsp = LSP_MAX;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+ uint64_t parts[2];
+ mpz_export(parts, 0, -1, sizeof(parts[0]), 0, 0, mantissa);
+ lsp = parts[0];
+ msp = parts[1];
+ msp &= ((static_cast<uint64_t>(1) << (MANTISSA_BITS - 64)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ const int exponent_repr = exponent + EXPONENT_BIAS;
+ PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+ msp |= static_cast<uint64_t>(exponent_repr) << (MANTISSA_BITS - 64);
+}
+
+inline bool
+is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2) {
+ return f1 < f2;
+}
+
+inline unsigned int
+msb_position(unsigned long long v) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(v))) - 1U - clz(v);
+}
+
+template <typename FP_Interval_Type>
+inline void
+affine_form_image(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ const Variable var,
+ const Linear_Form<FP_Interval_Type>& lf) {
+ // Assign the new linear form for var.
+ lf_store[var.id()] = lf;
+ // Now invalidate all linear forms in which var occurs.
+ discard_occurrences(lf_store, var);
+}
+
+#if PPL_SUPPORTED_FLOAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+ u.number = v;
+}
+
+inline float
+Float<float>::value() {
+ return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+ u.number = v;
+}
+
+inline double
+Float<double>::value() {
+ return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+ u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+ return u.number;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_templates.hh line 1. */
+/* IEC 559 floating point format related functions:
+ non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Float_templates.hh line 30. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type>
+const FP_Interval_Type& compute_absolute_error(
+ const Floating_Point_Format analyzed_format) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+
+ // FIXME: check if initializing caches with EMPTY is better.
+ static const FP_Interval_Type ZERO_INTERVAL = FP_Interval_Type(0);
+ // Cached results for each different analyzed format.
+ static FP_Interval_Type ieee754_half_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_single_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_double_result = ZERO_INTERVAL;
+ static FP_Interval_Type ibm_single_result = ZERO_INTERVAL;
+ static FP_Interval_Type ieee754_quad_result = ZERO_INTERVAL;
+ static FP_Interval_Type intel_double_extended_result = ZERO_INTERVAL;
+
+ FP_Interval_Type* to_compute = NULL;
+ // Get the necessary information on the analyzed's format.
+ unsigned int f_base;
+ int f_exponent_bias;
+ unsigned int f_mantissa_bits;
+ switch (analyzed_format) {
+ case IEEE754_HALF:
+ if (ieee754_half_result != ZERO_INTERVAL)
+ return ieee754_half_result;
+
+ to_compute = &ieee754_half_result;
+ f_base = float_ieee754_half::BASE;
+ f_exponent_bias = float_ieee754_half::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+ break;
+ case IEEE754_SINGLE:
+ if (ieee754_single_result != ZERO_INTERVAL)
+ return ieee754_single_result;
+
+ to_compute = &ieee754_single_result;
+ f_base = float_ieee754_single::BASE;
+ f_exponent_bias = float_ieee754_single::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+ break;
+ case IEEE754_DOUBLE:
+ if (ieee754_double_result != ZERO_INTERVAL)
+ return ieee754_double_result;
+
+ to_compute = &ieee754_double_result;
+ f_base = float_ieee754_double::BASE;
+ f_exponent_bias = float_ieee754_double::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+ break;
+ case IBM_SINGLE:
+ if (ibm_single_result != ZERO_INTERVAL)
+ return ibm_single_result;
+
+ to_compute = &ibm_single_result;
+ f_base = float_ibm_single::BASE;
+ f_exponent_bias = float_ibm_single::EXPONENT_BIAS;
+ f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+ break;
+ case IEEE754_QUAD:
+ if (ieee754_quad_result != ZERO_INTERVAL)
+ return ieee754_quad_result;
+
+ to_compute = &ieee754_quad_result;
+ f_base = float_ieee754_quad::BASE;
+ f_exponent_bias = float_ieee754_quad::EXPONENT_BIAS;
+ f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+ break;
+ case INTEL_DOUBLE_EXTENDED:
+ if (intel_double_extended_result != ZERO_INTERVAL)
+ return intel_double_extended_result;
+
+ to_compute = &intel_double_extended_result;
+ f_base = float_intel_double_extended::BASE;
+ f_exponent_bias = float_intel_double_extended::EXPONENT_BIAS;
+ f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_ASSERT(to_compute != NULL);
+
+ // We assume that f_base is a power of 2.
+ analyzer_format omega;
+ int power = static_cast<int>(msb_position(f_base))
+ * ((1 - f_exponent_bias) - static_cast<int>(f_mantissa_bits));
+ omega = std::max(static_cast<analyzer_format>(ldexp(1.0, power)),
+ std::numeric_limits<analyzer_format>::denorm_min());
+
+ to_compute->build(i_constraint(GREATER_OR_EQUAL, -omega),
+ i_constraint(LESS_OR_EQUAL, omega));
+ return *to_compute;
+}
+
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& lf_store,
+ Variable var) {
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+ for (Iter i = lf_store.begin(); i != lf_store.end(); ) {
+ if((i->second).coefficient(var) != 0)
+ i = lf_store.erase(i);
+ else
+ ++i;
+ }
+}
+
+/* FIXME: improve efficiency by adding the list of potentially conflicting
+ variables as an argument. */
+template <typename FP_Interval_Type>
+void upper_bound_assign(std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls1,
+ const std::map<dimension_type,
+ Linear_Form<FP_Interval_Type> >& ls2) {
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+ typedef typename std::map<dimension_type,
+ FP_Linear_Form>::const_iterator Const_Iter;
+
+ Const_Iter i2_end = ls2.end();
+ for (Iter i1 = ls1.begin(), i1_end = ls1.end(); i1 != i1_end; ) {
+ Const_Iter i2 = ls2.find(i1->first);
+ if ((i2 == i2_end) || (i1->second != i2->second))
+ i1 = ls1.erase(i1);
+ else
+ ++i1;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 522. */
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 35. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+
+// It is a pity that function partial specialization is not permitted
+// by C++. To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define PPL_FUNCTION_CLASS(name) name ## _function_struct
+
+#define PPL_DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg) { \
+ return PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg); \
+ }
+
+#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, a1); \
+ }
+
+#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1, \
+ PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type, \
+ after1, after2, after3) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2, \
+ PPL_U(after3) a3) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, \
+ a1, a2, \
+ a3); \
+ }
+
+#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg, \
+ a1); \
+ }
+
+#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, \
+ after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \
+ after1, after2) \
+ template <typename Policy, typename type> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy, typename type> \
+ inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(before2) b2, \
+ PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return \
+ PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, b2, \
+ arg, \
+ a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2); \
+ }
+
+#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1, \
+ qual2, type2, after1) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2, a1); \
+ }
+
+#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \
+ after1, after2) \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, \
+ typename type1, typename type2> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(after1) a1, PPL_U(after2) a2) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, \
+ type1, PPL_U(type2)>::function(arg1, arg2, a1, a2); \
+ }
+
+#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1, \
+ qual2, type2, qual3, type3, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename type1, typename type2, typename type3> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename type1, typename type2, typename type3> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2)& arg2, \
+ PPL_U(qual3) PPL_U(type3)& arg3, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, \
+ type1, type2, PPL_U(type3)> \
+ ::function(arg1, arg2, arg3, a1); \
+ }
+
+#define PPL_DECLARE_FUN5_0_1(name, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, \
+ after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4,typename Policy5, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+ struct PPL_FUNCTION_CLASS(name); \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4,typename Policy5, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+ inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+ PPL_U(type2)& arg2, \
+ PPL_U(qual3) PPL_U(type3)& arg3, PPL_U(qual4) \
+ PPL_U(type4)& arg4, \
+ PPL_U(qual5) PPL_U(type5)& arg5, \
+ PPL_U(after1) a1) { \
+ return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, \
+ Policy4, Policy5, \
+ type1, type2, \
+ type3, type4, \
+ PPL_U(type5)> \
+ ::function(arg1, arg2, arg3, arg4, arg5, a1); \
+ }
+
+#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg) { \
+ return PPL_U(func)<Policy>(arg); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy>(arg, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, \
+ after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, \
+ after1, after2, after3) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2, \
+ PPL_U(after3) a3) { \
+ return PPL_U(func)<Policy>(arg, a1, a2, a3); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, \
+ qual, type, after1) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(qual) \
+ PPL_U(type)& arg, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy>(b1, arg, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, \
+ qual, type, after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(qual) \
+ PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(b1, arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \
+ qual, type, after1, after2) \
+ template <typename Policy> \
+ struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> { \
+ static inline ret_type function(PPL_U(before1) b1, PPL_U(before2) b2, \
+ PPL_U(qual) PPL_U(type)& arg, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy>(b1, b2, arg, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, \
+ qual2, type2) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2) { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, \
+ qual2, type2, after1) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, \
+ qual2, type2, after1, after2) \
+ template <typename Policy1, typename Policy2> \
+ struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1, \
+ PPL_U(type2)> { \
+ static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(after1) a1, PPL_U(after2) a2) \
+ { \
+ return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1, a2); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, \
+ qual2, type2, qual3, type3, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3> \
+ struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, \
+ type1, type2, \
+ PPL_U(type3)> { \
+ static inline Result function(PPL_U(qual1) PPL_U(type1)& arg1, \
+ PPL_U(qual2) PPL_U(type2) &arg2, \
+ PPL_U(qual3) PPL_U(type3) &arg3, \
+ PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2, Policy3>(arg1, arg2, arg3, \
+ a1); \
+ } \
+ };
+
+#define PPL_SPECIALIZE_FUN5_0_1(name, func, ret_type, \
+ qual1, type1, qual2, type2, \
+ qual3, type3, \
+ qual4, type4, qual5, type5, after1) \
+ template <typename Policy1, typename Policy2, typename Policy3, \
+ typename Policy4, typename Policy5> \
+ struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4, \
+ Policy5, \
+ type1, type2, \
+ type3, type4, \
+ PPL_U(type5)> { \
+ static inline Result \
+ function(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+ PPL_U(type2) &arg2, \
+ PPL_U(qual3) PPL_U(type3) &arg3, PPL_U(qual4) \
+ PPL_U(type4) &arg4, \
+ PPL_U(qual5) PPL_U(type5) &arg5, PPL_U(after1) a1) { \
+ return PPL_U(func)<Policy1, Policy2, Policy3, Policy4, \
+ Policy5>(arg1, arg2, arg3, arg4, arg5, a1); \
+ } \
+ };
+
+// The `nonconst' macro helps readability of the sequel.
+#ifdef nonconst
+#define PPL_SAVED_nonconst nonconst
+#undef nonconst
+#endif
+#define nonconst
+
+#define PPL_SPECIALIZE_COPY(func, Type) \
+ PPL_SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define PPL_SPECIALIZE_SGN(func, From) \
+ PPL_SPECIALIZE_FUN1_0_0(sgn, func, Result_Relation, const, From)
+#define PPL_SPECIALIZE_CMP(func, Type1, Type2) \
+ PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result_Relation, const, Type1, const, Type2)
+#define PPL_SPECIALIZE_CLASSIFY(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define PPL_SPECIALIZE_IS_NAN(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_MINF(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_PINF(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_INT(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define PPL_SPECIALIZE_ASSIGN_SPECIAL(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(assign_special, func, Result, \
+ nonconst, Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst, \
+ Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ASSIGN(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_FLOOR(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_CEIL(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_TRUNC(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_NEG(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ABS(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_SQRT(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To, \
+ const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_REM(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_IDIV(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(add_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(sub_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(mul_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(div_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SMOD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(smod_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_UMOD_2EXP(func, To, From) \
+ PPL_SPECIALIZE_FUN2_0_2(umod_2exp, func, Result, nonconst, To, \
+ const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_MUL(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCD(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3) \
+ PPL_SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1, \
+ nonconst, To2, nonconst, To3, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_LCM(func, To, From1, From2) \
+ PPL_SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To, \
+ const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_INPUT(func, Type) \
+ PPL_SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type, \
+ std::istream&, Rounding_Dir)
+#define PPL_SPECIALIZE_OUTPUT(func, Type) \
+ PPL_SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&, \
+ const, Type, \
+ const Numeric_Format&, Rounding_Dir)
+
+
+PPL_DECLARE_FUN2_0_0(copy,
+ void, nonconst, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_0(sgn,
+ Result_Relation, const, From)
+PPL_DECLARE_FUN2_0_0(cmp,
+ Result_Relation, const, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_3(classify,
+ Result, const, Type, bool, bool, bool)
+PPL_DECLARE_FUN1_0_0(is_nan,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_minf,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_pinf,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_int,
+ bool, const, Type)
+PPL_DECLARE_FUN1_0_2(assign_special,
+ Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(construct_special,
+ Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(construct,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(assign,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(floor,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(ceil,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(trunc,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(neg,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(abs,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(sqrt,
+ Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(div,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(rem,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(idiv,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(add_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(sub_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(mul_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(div_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(smod_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(umod_2exp,
+ Result, nonconst, To,
+ const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add_mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub_mul,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(gcd,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN5_0_1(gcdext,
+ Result, nonconst, To1, nonconst, To2, nonconst, To3,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(lcm,
+ Result, nonconst, To,
+ const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(input,
+ Result, nonconst, Type, std::istream&, Rounding_Dir)
+PPL_DECLARE_FUN1_1_2(output,
+ Result, std::ostream&, const, Type,
+ const Numeric_Format&, Rounding_Dir)
+
+#undef PPL_DECLARE_FUN1_0_0
+#undef PPL_DECLARE_FUN1_0_1
+#undef PPL_DECLARE_FUN1_0_2
+#undef PPL_DECLARE_FUN1_0_3
+#undef PPL_DECLARE_FUN1_1_1
+#undef PPL_DECLARE_FUN1_1_2
+#undef PPL_DECLARE_FUN1_2_2
+#undef PPL_DECLARE_FUN2_0_0
+#undef PPL_DECLARE_FUN2_0_1
+#undef PPL_DECLARE_FUN2_0_2
+#undef PPL_DECLARE_FUN3_0_1
+#undef PPL_DECLARE_FUN5_0_1
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+std::string float_mpq_to_string(mpq_class& q);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+ static const Result_Class vclass = VC_MINUS_INFINITY;
+};
+struct Plus_Infinity {
+ static const Result_Class vclass = VC_PLUS_INFINITY;
+};
+struct Not_A_Number {
+ static const Result_Class vclass = VC_NAN;
+};
+
+template <typename T>
+struct Is_Special : public False { };
+
+template <>
+struct Is_Special<Minus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Plus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Not_A_Number> : public True {};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+ //! Do not check for overflowed result.
+ const_bool_nodef(check_overflow, false);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not check for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Handle not-a-number special value if \p T has it.
+ const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+ //! Handle infinity special values if \p T have them.
+ const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+ /*! \brief
+ The checked number can always be safely converted to the
+ underlying type \p T and vice-versa.
+ */
+ const_bool_nodef(convertible, true);
+
+ //! Do not honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, false);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, false);
+
+ /*! \brief
+ For constructors, by default use the same rounding used by
+ underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+ /*! \brief
+ For overloaded operators (operator+(), operator-(), ...), by
+ default use the same rounding used by the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+ /*! \brief
+ For input functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For output functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For all other functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+/* Automatically generated from PPL source file ../src/checked_inlines.hh line 1. */
+/* Abstract checked arithmetic functions: fall-backs.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_inlines.hh line 31. */
+
+/*! \brief
+ Performs the test <CODE>a < b</CODE> avoiding the warning about the
+ comparison being always false due to limited range of data type.
+ FIXME: we have not found a working solution. The GCC option
+ -Wno-type-limits suppresses the warning
+*/
+#define PPL_LT_SILENT(a, b) ((a) < (b))
+#define PPL_GT_SILENT(a, b) ((a) > (b))
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define PPL_SAFE_CONVERSION(To, From) \
+ template <> struct Safe_Conversion<PPL_U(To), PPL_U(From)> \
+ : public True { }
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, unsigned char);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, signed char);
+PPL_SAFE_CONVERSION(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+PPL_SAFE_CONVERSION(signed int, unsigned short);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, signed char);
+PPL_SAFE_CONVERSION(signed long, signed short);
+PPL_SAFE_CONVERSION(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned int);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, signed char);
+PPL_SAFE_CONVERSION(signed long long, signed short);
+PPL_SAFE_CONVERSION(signed long long, signed int);
+PPL_SAFE_CONVERSION(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned long);
+#endif
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned short, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned short, unsigned char);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned int, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned int, unsigned char);
+PPL_SAFE_CONVERSION(unsigned int, unsigned short);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long, unsigned int);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned int);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, char);
+PPL_SAFE_CONVERSION(float, signed char);
+PPL_SAFE_CONVERSION(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed short);
+PPL_SAFE_CONVERSION(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed int);
+PPL_SAFE_CONVERSION(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long);
+PPL_SAFE_CONVERSION(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long long);
+PPL_SAFE_CONVERSION(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, char);
+PPL_SAFE_CONVERSION(double, signed char);
+PPL_SAFE_CONVERSION(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed short);
+PPL_SAFE_CONVERSION(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed int);
+PPL_SAFE_CONVERSION(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long);
+PPL_SAFE_CONVERSION(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long long);
+PPL_SAFE_CONVERSION(double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, char);
+PPL_SAFE_CONVERSION(long double, signed char);
+PPL_SAFE_CONVERSION(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed short);
+PPL_SAFE_CONVERSION(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed int);
+PPL_SAFE_CONVERSION(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long);
+PPL_SAFE_CONVERSION(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long long);
+PPL_SAFE_CONVERSION(long double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(long double, float);
+PPL_SAFE_CONVERSION(long double, double);
+
+PPL_SAFE_CONVERSION(mpz_class, char);
+PPL_SAFE_CONVERSION(mpz_class, signed char);
+PPL_SAFE_CONVERSION(mpz_class, signed short);
+PPL_SAFE_CONVERSION(mpz_class, signed int);
+PPL_SAFE_CONVERSION(mpz_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpz_class, unsigned char);
+PPL_SAFE_CONVERSION(mpz_class, unsigned short);
+PPL_SAFE_CONVERSION(mpz_class, unsigned int);
+PPL_SAFE_CONVERSION(mpz_class, unsigned long);
+// GMP's API does not support unsigned long long.
+
+PPL_SAFE_CONVERSION(mpq_class, char);
+PPL_SAFE_CONVERSION(mpq_class, signed char);
+PPL_SAFE_CONVERSION(mpq_class, signed short);
+PPL_SAFE_CONVERSION(mpq_class, signed int);
+PPL_SAFE_CONVERSION(mpq_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpq_class, unsigned char);
+PPL_SAFE_CONVERSION(mpq_class, unsigned short);
+PPL_SAFE_CONVERSION(mpq_class, unsigned int);
+PPL_SAFE_CONVERSION(mpq_class, unsigned long);
+// GMP's API does not support unsigned long long.
+PPL_SAFE_CONVERSION(mpq_class, float);
+PPL_SAFE_CONVERSION(mpq_class, double);
+// GMP's API does not support long double.
+
+#undef PPL_SAFE_CONVERSION
+
+template <typename Policy, typename Type>
+struct PPL_FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ new (&to) Type(from);
+ return V_EQ;
+ }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+struct PPL_FUNCTION_CLASS(construct) {
+ static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+ new (&to) To();
+ return assign<To_Policy, From_Policy>(to, from, dir);
+ }
+};
+
+template <typename To_Policy, typename To>
+struct PPL_FUNCTION_CLASS(construct_special) {
+ static inline Result function(To& to, Result_Class r, Rounding_Dir dir) {
+ new (&to) To();
+ return assign_special<To_Policy>(to, r, dir);
+ }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
+copy_generic(Type& to, const Type& from) {
+ to = from;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+ if (from < 0)
+ return neg<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From>
+inline void
+gcd_exact_no_abs(To& to, const From& x, const From& y) {
+ To w_x = x;
+ To w_y = y;
+ To remainder;
+ while (w_y != 0) {
+ // The following is derived from the assumption that w_x % w_y
+ // is always representable. This is true for both native integers
+ // and IEC 559 floating point numbers.
+ rem<To_Policy, From1_Policy, From2_Policy>(remainder, w_x, w_y,
+ ROUND_NOT_NEEDED);
+ w_x = w_y;
+ w_y = remainder;
+ }
+ to = w_x;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+ return abs<To_Policy, To_Policy>(to, to, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+ typename From1_Policy, typename From2_Policy,
+ typename To1, typename To2, typename To3,
+ typename From1, typename From2>
+inline Result
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+ Rounding_Dir dir) {
+ // In case this becomes a bottleneck, we may consider using the
+ // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+ // Prime Numbers - A Computational Perspective, Second Edition,
+ // Springer, 2005).
+ if (y == 0) {
+ if (x == 0) {
+ s = 0;
+ t = 1;
+ return V_EQ;
+ }
+ else {
+ if (x < 0)
+ s = -1;
+ else
+ s = 1;
+ t = 0;
+ return abs<To1_Policy, From1_Policy>(to, x, dir);
+ }
+ }
+
+ s = 1;
+ t = 0;
+ bool negative_x = x < 0;
+ bool negative_y = y < 0;
+
+ Result r;
+ r = abs<To1_Policy, From1_Policy>(to, x, dir);
+ if (r != V_EQ)
+ return r;
+
+ From2 a_y;
+ r = abs<To1_Policy, From2_Policy>(a_y, y, dir);
+ if (r != V_EQ)
+ return r;
+
+ // If PPL_MATCH_GMP_GCDEXT is defined then s is favored when the absolute
+ // values of the given numbers are equal. For instance if x and y
+ // are both 5 then s will be 1 and t will be 0, instead of the other
+ // way round. This is to match the behavior of GMP.
+#define PPL_MATCH_GMP_GCDEXT 1
+#ifdef PPL_MATCH_GMP_GCDEXT
+ if (to == a_y)
+ goto sign_check;
+#endif
+
+ {
+ To2 v1 = 0;
+ To3 v2 = 1;
+ To1 v3 = static_cast<To1>(a_y);
+ while (true) {
+ To1 q = to / v3;
+ // Remainder, next candidate GCD.
+ To1 t3 = to - q*v3;
+ To2 t1 = s - static_cast<To2>(q)*v1;
+ To3 t2 = t - static_cast<To3>(q)*v2;
+ s = v1;
+ t = v2;
+ to = v3;
+ if (t3 == 0)
+ break;
+ v1 = t1;
+ v2 = t2;
+ v3 = t3;
+ }
+ }
+
+#ifdef PPL_MATCH_GMP_GCDEXT
+ sign_check:
+#endif
+ if (negative_x) {
+ r = neg<To2_Policy, To2_Policy>(s, s, dir);
+ if (r != V_EQ)
+ return r;
+ }
+ if (negative_y)
+ return neg<To3_Policy, To3_Policy>(t, t, dir);
+ return V_EQ;
+#undef PPL_MATCH_GMP_GCDEXT
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (x == 0 || y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ To a_x;
+ To a_y;
+ Result r;
+ r = abs<From1_Policy, From1_Policy>(a_x, x, dir);
+ if (r != V_EQ)
+ return r;
+ r = abs<From2_Policy, From2_Policy>(a_y, y, dir);
+ if (r != V_EQ)
+ return r;
+ To gcd;
+ gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(gcd, a_x, a_y);
+ // The following is derived from the assumption that a_x / gcd(a_x, a_y)
+ // is always representable. This is true for both native integers
+ // and IEC 559 floating point numbers.
+ div<To_Policy, From1_Policy, To_Policy>(to, a_x, gcd, ROUND_NOT_NEEDED);
+ return mul<To_Policy, To_Policy, From2_Policy>(to, to, a_y, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_generic(const Type& x) {
+ if (x > 0)
+ return VR_GT;
+ if (x == 0)
+ return VR_EQ;
+ return VR_LT;
+}
+
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+ : public Bool<(C_Integer<T1>::is_signed
+ ? (C_Integer<T2>::is_signed
+ || sizeof(T2) < sizeof(T1)
+ || sizeof(T2) < sizeof(int))
+ : (!C_Integer<T2>::is_signed
+ || sizeof(T1) < sizeof(T2)
+ || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+ return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+ return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+ || Safe_Conversion<T1, T2>::value
+ || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+ return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+ return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+ return y >= 0 && x < static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+ return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+ return y >= 0 && x <= static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+ return x >= 0 && static_cast<typename C_Integer<S>::other_type>(x) == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+ && C_Integer<U>::value
+ && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+ return y >= 0 && x == static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, ROUND_CHECK);
+ // FIXME: We can do this also without fpu inexact check using a
+ // conversion back and forth and then testing equality. We should
+ // code this in checked_float_inlines.hh, probably it's faster also
+ // if fpu supports inexact check.
+ PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+ return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, ROUND_UP);
+ if (!result_representable(r))
+ return true;
+ switch (result_relation(r)) {
+ case VR_EQ:
+ case VR_LT:
+ case VR_LE:
+ return x < tmp;
+ default:
+ return false;
+ }
+}
+
+template <typename T1, typename T2>
+inline typename
+Enable_If<(!Safe_Conversion<T1, T2>::value
+ && !Safe_Conversion<T2, T1>::value
+ && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+ PPL_DIRTY_TEMP(T1, tmp);
+ Result r = assign_r(tmp, y, (ROUND_UP | ROUND_STRICT_RELATION));
+ // FIXME: We can do this also without fpu inexact check using a
+ // conversion back and forth and then testing equality. We should
+ // code this in checked_float_inlines.hh, probably it's faster also
+ // if fpu supports inexact check.
+ PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+ if (!result_representable(r))
+ return true;
+ switch (result_relation(r)) {
+ case VR_EQ:
+ return x <= tmp;
+ case VR_LT:
+ return x < tmp;
+ case VR_LE:
+ case VR_GE:
+ case VR_LGE:
+ // See comment above.
+ PPL_UNREACHABLE;
+ return false;
+ default:
+ return false;
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+ return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+ return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+ return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result_Relation
+cmp_generic(const Type1& x, const Type2& y) {
+ if (lt(y, x))
+ return VR_GT;
+ if (lt(x, y))
+ return VR_LT;
+ return VR_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+assign_nan(Type& to, Result r) {
+ assign_special<Policy>(to, VC_NAN, ROUND_IGNORE);
+ return r;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+ PPL_DIRTY_TEMP(mpq_class, q);
+ Result r = input_mpq(q, is);
+ Result_Class c = result_class(r);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ case VC_PLUS_INFINITY:
+ return assign_special<Policy>(to, c, dir);
+ case VC_NAN:
+ return assign_nan<Policy>(to, r);
+ default:
+ break;
+ }
+ PPL_ASSERT(r == V_EQ);
+ return assign<Policy, void>(to, q, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_int_inlines.hh line 1. */
+/* Specialized "checked" functions for native integer numbers.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_int_inlines.hh line 28. */
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+
+#if !PPL_HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !PPL_HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef PPL_HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+ static const Type plus_infinity = C_Integer<Type>::max;
+ static const Type minus_infinity = ((C_Integer<Type>::min >= 0)
+ ? (C_Integer<Type>::max - 1)
+ : C_Integer<Type>::min);
+ static const Type not_a_number
+ = ((C_Integer<Type>::min >= 0)
+ ? (C_Integer<Type>::max - 2 * (Policy::has_infinity ? 1 : 0))
+ : (C_Integer<Type>::min + (Policy::has_infinity ? 1 : 0)));
+ static const Type min
+ = (C_Integer<Type>::min
+ + ((C_Integer<Type>::min >= 0)
+ ? 0
+ : ((Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))));
+ static const Type max
+ = (C_Integer<Type>::max
+ - ((C_Integer<Type>::min >= 0)
+ ? (2 * (Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))
+ : (Policy::has_infinity ? 1 : 0)));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT_INF;
+ }
+ else {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT_MINUS_INFINITY;
+ }
+ return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT_SUP;
+ }
+ else {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT_PLUS_INFINITY;
+ }
+ return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ if (to == Extended_Int<Policy, To>::min) {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT_MINUS_INFINITY;
+ }
+ return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+ }
+ else {
+ --to;
+ return V_GT;
+ }
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ if (to == Extended_Int<Policy, To>::max) {
+ if (Policy::has_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT_PLUS_INFINITY;
+ }
+ return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+ }
+ else {
+ ++to;
+ return V_LT;
+ }
+ }
+ return V_GT;
+}
+
+PPL_SPECIALIZE_COPY(copy_generic, char)
+PPL_SPECIALIZE_COPY(copy_generic, signed char)
+PPL_SPECIALIZE_COPY(copy_generic, signed short)
+PPL_SPECIALIZE_COPY(copy_generic, signed int)
+PPL_SPECIALIZE_COPY(copy_generic, signed long)
+PPL_SPECIALIZE_COPY(copy_generic, signed long long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned char)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned short)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned int)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+ if (Policy::has_nan
+ && (nan || sign)
+ && v == Extended_Int<Policy, Type>::not_a_number)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (v == Extended_Int<Policy, Type>::minus_infinity)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (v == Extended_Int<Policy, Type>::plus_infinity)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_int, char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+ return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_int, char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+ return Policy::has_infinity
+ && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_int, char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+ return Policy::has_infinity
+ && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+ return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_int, char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed short)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed int)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned char)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned short)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned int)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+assign_special_int(Type& v, Result_Class c, Rounding_Dir dir) {
+ PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan) {
+ v = Extended_Int<Policy, Type>::not_a_number;
+ return V_NAN;
+ }
+ return V_NAN | V_UNREPRESENTABLE;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ v = Extended_Int<Policy, Type>::minus_infinity;
+ return V_EQ_MINUS_INFINITY;
+ }
+ if (round_up(dir)) {
+ v = Extended_Int<Policy, Type>::min;
+ return V_LT_INF;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ v = Extended_Int<Policy, Type>::plus_infinity;
+ return V_EQ_PLUS_INFINITY;
+ }
+ if (round_down(dir)) {
+ v = Extended_Int<Policy, Type>::max;
+ return V_GT_SUP;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) < sizeof(From)
+ || (sizeof(To) == sizeof(From)
+ && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+ || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_LT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::min))))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_GT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::max))))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) <= sizeof(From)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_overflow, from < 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (sizeof(To) < sizeof(From)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(To) < sizeof(From)
+ || (sizeof(To) == sizeof(From)
+ && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+ if (CHECK_P(To_Policy::check_overflow,
+ PPL_GT_SILENT(from,
+ static_cast<From>(Extended_Int<To_Policy, To>::max))))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = static_cast<To>(from);
+ return V_EQ;
+}
+
+
+#define PPL_ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN_SIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
+#define PPL_ASSIGN_UNSIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_SIGNED(char)
+#endif
+PPL_ASSIGN_SIGNED(signed char)
+PPL_ASSIGN_SIGNED(signed short)
+PPL_ASSIGN_SIGNED(signed int)
+PPL_ASSIGN_SIGNED(signed long)
+PPL_ASSIGN_SIGNED(signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_UNSIGNED(char)
+#endif
+PPL_ASSIGN_UNSIGNED(unsigned char)
+PPL_ASSIGN_UNSIGNED(unsigned short)
+PPL_ASSIGN_UNSIGNED(unsigned int)
+PPL_ASSIGN_UNSIGNED(unsigned long)
+PPL_ASSIGN_UNSIGNED(unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long long)
+#else
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, char)
+#endif
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+#if 0
+ // FIXME: this is correct but it is inefficient and breaks the build
+ // for the missing definition of static const members (a problem present
+ // also in other areas of the PPL).
+ if (CHECK_P(To_Policy::check_overflow, lt(from, Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+#else
+ if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+#endif
+ if (round_not_requested(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ From i_from = rint(from);
+ to = i_from;
+ if (from == i_from)
+ return V_EQ;
+ if (round_direct(ROUND_UP))
+ return round_lt_int<To_Policy>(to, dir);
+ if (round_direct(ROUND_DOWN))
+ return round_gt_int<To_Policy>(to, dir);
+ if (from < i_from)
+ return round_lt_int<To_Policy>(to, dir);
+ PPL_ASSERT(from > i_from);
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
+
+#undef PPL_ASSIGN_SIGNED
+#undef PPL_ASSIGN_UNSIGNED
+#undef PPL_ASSIGN2_SIGNED_SIGNED
+#undef PPL_ASSIGN2_UNSIGNED_UNSIGNED
+#undef PPL_ASSIGN2_UNSIGNED_SIGNED
+#undef PPL_ASSIGN2_SIGNED_UNSIGNED
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (sizeof(To) <= sizeof(signed long)) {
+ if (!To_Policy::check_overflow) {
+ to = from.get_si();
+ return V_EQ;
+ }
+ if (from.fits_slong_p()) {
+ signed long v = from.get_si();
+ if (PPL_LT_SILENT(v, (Extended_Int<To_Policy, To>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ else {
+ mpz_srcptr m = from.get_mpz_t();
+ size_t sz = mpz_size(m);
+ if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+ if (sz == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ To v;
+ mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+ if (v >= 0) {
+ if (::sgn(from) < 0)
+ return neg<To_Policy, To_Policy>(to, v, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ }
+ return (::sgn(from) < 0)
+ ? set_neg_overflow_int<To_Policy>(to, dir)
+ : set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (sizeof(To) <= sizeof(unsigned long)) {
+ if (!To_Policy::check_overflow) {
+ to = static_cast<To>(from.get_ui());
+ return V_EQ;
+ }
+ if (from.fits_ulong_p()) {
+ const unsigned long v = from.get_ui();
+ if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = static_cast<To>(v);
+ return V_EQ;
+ }
+ }
+ else {
+ const mpz_srcptr m = from.get_mpz_t();
+ const size_t sz = mpz_size(m);
+ if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+ if (sz == 0)
+ to = 0;
+ else
+ mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+ return V_EQ;
+ }
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+ mpz_srcptr n = from.get_num().get_mpz_t();
+ mpz_srcptr d = from.get_den().get_mpz_t();
+ PPL_DIRTY_TEMP(mpz_class, q);
+ mpz_ptr q_z = q.get_mpz_t();
+ if (round_not_requested(dir)) {
+ mpz_tdiv_q(q_z, n, d);
+ Result r = assign<To_Policy, void>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ return V_LGE;
+ }
+ mpz_t rem;
+ int sign;
+ mpz_init(rem);
+ mpz_tdiv_qr(q_z, rem, n, d);
+ sign = mpz_sgn(rem);
+ mpz_clear(rem);
+ Result r = assign<To_Policy, void>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ switch (sign) {
+ case -1:
+ return round_lt_int<To_Policy>(to, dir);
+ case 1:
+ return round_gt_int<To_Policy>(to, dir);
+ default:
+ return V_EQ;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
+
+#if ~0 != -1
+#error "Only two's complement is supported"
+#endif
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architectures.
+//
+// Current guidelines:
+// - avoid division where possible (larger type variant for mul)
+// - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef int_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef int_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast16_t type_for_neg;
+ typedef uint_fast16_t type_for_add;
+ typedef int_fast16_t type_for_sub;
+ typedef uint_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed short> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast32_t type_for_neg;
+ typedef int_fast32_t type_for_add;
+ typedef int_fast32_t type_for_sub;
+ typedef int_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+ const_bool_nodef(use_for_neg, true);
+ const_bool_nodef(use_for_add, true);
+ const_bool_nodef(use_for_sub, true);
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast32_t type_for_neg;
+ typedef uint_fast32_t type_for_add;
+ typedef int_fast32_t type_for_sub;
+ typedef uint_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<signed int> {
+ const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+ const_bool_nodef(use_for_add, (LONG_BITS == 64));
+ const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+ const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+ const_bool_nodef(use_for_add, (LONG_BITS == 64));
+ const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+ const_bool_nodef(use_for_mul, true);
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, false);
+ typedef int_fast64_t type_for_neg;
+ typedef int_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+ const_bool_nodef(use_for_neg, false);
+ const_bool_nodef(use_for_add, false);
+ const_bool_nodef(use_for_sub, false);
+ const_bool_nodef(use_for_mul, false);
+ typedef int_fast64_t type_for_neg;
+ typedef uint_fast64_t type_for_add;
+ typedef int_fast64_t type_for_sub;
+ typedef uint_fast64_t type_for_mul;
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_neg l = x;
+ l = -l;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_add l = x;
+ l += y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_sub l = x;
+ l -= y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ typename Larger<Type>::type_for_mul l = x;
+ l *= y;
+ return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (from < -Extended_Int<To_Policy, Type>::max)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+ if (CHECK_P(To_Policy::check_overflow, from != 0))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (To_Policy::check_overflow) {
+ if (y >= 0) {
+ if (x > Extended_Int<To_Policy, Type>::max - y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else if (x < Extended_Int<To_Policy, Type>::min - y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (x > Extended_Int<To_Policy, Type>::max - y)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (To_Policy::check_overflow) {
+ if (y >= 0) {
+ if (x < Extended_Int<To_Policy, Type>::min + y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ else if (x > Extended_Int<To_Policy, Type>::max + y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (CHECK_P(To_Policy::check_overflow,
+ (x < Extended_Int<To_Policy, Type>::min + y)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (!To_Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ if (x >= 0) {
+ if (y > 0) {
+ if (x > Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else {
+ if (x > Extended_Int<To_Policy, Type>::min / y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ }
+ else {
+ if (y < 0) {
+ if (x < Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ else {
+ if (x < Extended_Int<To_Policy, Type>::min / y)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ }
+ }
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ if (!To_Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (x > Extended_Int<To_Policy, Type>::max / y)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ if (To_Policy::check_overflow && y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ to = x / y;
+ if (round_not_requested(dir))
+ return V_LGE;
+ if (y == -1)
+ return V_EQ;
+ Type m = x % y;
+ if (m < 0)
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ else if (m > 0)
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ if (round_not_requested(dir))
+ return V_GE;
+ Type m = x % y;
+ if (m == 0)
+ return V_EQ;
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ if (To_Policy::check_overflow && y == -1)
+ return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+ to = x / y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = (y == -1) ? 0 : (x % y);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = x % y;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x & ((Type(1) << exp) - 1))
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (x < 0) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_LE;
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ }
+ typedef typename C_Integer<Type>::other_type UType;
+ UType ux = x;
+ ux = -ux;
+ to = ~Type(~-(ux >> exp));
+ if (round_not_requested(dir))
+ return V_LE;
+ if (ux & ((UType(1) << exp) -1))
+ return round_lt_int_no_overflow<To_Policy>(to, dir);
+ return V_EQ;
+ }
+ else {
+ if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+ to = 0;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (round_not_requested(dir))
+ return V_GE;
+ if (x & ((Type(1) << exp) - 1))
+ return round_gt_int_no_overflow<To_Policy>(to, dir);
+ else
+ return V_EQ;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x + (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ Type n = Type(1) << exp;
+ return add_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x + (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+ Type n = -2 * (Type(1) << (exp - 1));
+ return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+ else {
+ Type n = Type(1) << exp;
+ return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x - (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ Type n = Type(1) << exp;
+ return sub_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x - (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+ Type n = -2 * (Type(1) << (exp - 1));
+ return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+ else {
+ Type n = Type(1) << exp;
+ return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (!To_Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ if (x > Extended_Int<To_Policy, Type>::max >> exp)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x << exp;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (x < 0) {
+ if (!To_Policy::check_overflow) {
+ to = x * (Type(1) << exp);
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ typedef typename C_Integer<Type>::other_type UType;
+ UType mask = UType(-1) << (sizeof_to_bits(sizeof(Type)) - exp - 1);
+ UType ux = x;
+ if ((ux & mask) != mask)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ ux <<= exp;
+ Type n = ~(Type(~ux));
+ if (PPL_LT_SILENT(n, (Extended_Int<To_Policy, Type>::min)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ to = n;
+ }
+ else {
+ if (!To_Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ }
+ if (x > Extended_Int<To_Policy, Type>::max >> exp)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x << exp;
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp > sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else {
+ Type v = (exp == sizeof_to_bits(sizeof(Type)) ? x : (x & ((Type(1) << exp) - 1)));
+ if (v >= (Type(1) << (exp - 1)))
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ else
+ to = v;
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else {
+ Type m = Type(1) << (exp - 1);
+ to = (x & (m - 1)) - (x & m);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type)))
+ to = x;
+ else
+ to = x & ((Type(1) << exp) - 1);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+ Rounding_Dir dir) {
+ if (exp >= sizeof_to_bits(sizeof(Type))) {
+ if (x < 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ to = x;
+ }
+ else
+ to = x & ((Type(1) << exp) - 1);
+ return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrt_rem(Type& q, Type& r, const Type from) {
+ q = 0;
+ r = from;
+ Type t(1);
+ for (t <<= sizeof_to_bits(sizeof(Type)) - 2; t != 0; t >>= 2) {
+ Type s = q + t;
+ if (s <= r) {
+ r -= s;
+ q = s + t;
+ }
+ q >>= 1;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ Type rem;
+ isqrt_rem(to, rem, from);
+ if (round_not_requested(dir))
+ return V_GE;
+ if (rem == 0)
+ return V_EQ;
+ return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+ switch (result_overflow(r)) {
+ case 0:
+ return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+ case -1:
+ if (to <= 0)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case 1:
+ if (to >= 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+ switch (result_overflow(r)) {
+ case 0:
+ return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+ case -1:
+ if (to >= 0)
+ return set_pos_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case 1:
+ if (to <= 0)
+ return set_neg_overflow_int<To_Policy>(to, dir);
+ return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+ const Numeric_Format&, Rounding_Dir) {
+ os << int(from);
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(abs_generic, char, char)
+#endif
+PPL_SPECIALIZE_ABS(abs_generic, signed char, signed char)
+PPL_SPECIALIZE_ABS(abs_generic, signed short, signed short)
+PPL_SPECIALIZE_ABS(abs_generic, signed int, signed int)
+PPL_SPECIALIZE_ABS(abs_generic, signed long, signed long)
+PPL_SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCD(gcd_exact, char, char, char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, char, char, char, char, char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, char, char, char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SGN(sgn_generic, char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed short)
+PPL_SPECIALIZE_SGN(sgn_generic, signed int)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned char)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned short)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned int)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+PPL_SPECIALIZE_CMP(cmp_generic, char, char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+PPL_SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, char, char, char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, char, char, char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_INPUT(input_generic, char)
+PPL_SPECIALIZE_INPUT(input_generic, signed char)
+PPL_SPECIALIZE_INPUT(input_generic, signed short)
+PPL_SPECIALIZE_INPUT(input_generic, signed int)
+PPL_SPECIALIZE_INPUT(input_generic, signed long)
+PPL_SPECIALIZE_INPUT(input_generic, signed long long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned char)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned short)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned int)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+PPL_SPECIALIZE_OUTPUT(output_char, char)
+PPL_SPECIALIZE_OUTPUT(output_char, signed char)
+PPL_SPECIALIZE_OUTPUT(output_int, signed short)
+PPL_SPECIALIZE_OUTPUT(output_int, signed int)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long long)
+PPL_SPECIALIZE_OUTPUT(output_char, unsigned char)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned short)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned int)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_float_inlines.hh line 1. */
+/* Specialized "checked" functions for native floating-point numbers.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_float_inlines.hh line 28. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+multiply_add(float x, float y, float z) {
+#if PPL_HAVE_DECL_FMAF && defined(FP_FAST_FMAF) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fmaf(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline double
+multiply_add(double x, double y, double z) {
+#if PPL_HAVE_DECL_FMA && defined(FP_FAST_FMA) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fma(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline long double
+multiply_add(long double x, long double y, long double z) {
+#if PPL_HAVE_DECL_FMAL && defined(FP_FAST_FMAL) \
+ && !defined(__alpha) && !defined(__FreeBSD__)
+ return fmal(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if PPL_HAVE_DECL_RINTF
+inline float
+round_to_integer(float x) {
+ return rintf(x);
+}
+#endif
+
+inline double
+round_to_integer(double x) {
+ return rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
+inline long double
+round_to_integer(long double x) {
+ return rintl(x);
+}
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+round_to_integer(long double x) {
+ return rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+round_to_integer(long double x) {
+ long double i;
+ __asm__ ("frndint" : "=t" (i) : "0" (x));
+ return i;
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+ return round_direct(dir) || round_not_requested(dir);
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+ return round_inverse(dir);
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+// a = 0.3
+// b = 0.1
+// c_i = a * b = 0.03
+// c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+// a = 0.3
+// b = 0.1
+// c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+// c_i = -c_i = 0.03
+// c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline void
+limit_precision(const float& v) {
+ PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const double& v) {
+ PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const long double&) {
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+ Float<T> f(v);
+ if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
+ return V_NAN;
+ if (inf) {
+ if (Policy::has_infinity) {
+ int sign_inf = f.u.binary.inf_sign();
+ if (sign_inf < 0)
+ return V_EQ_MINUS_INFINITY;
+ if (sign_inf > 0)
+ return V_EQ_PLUS_INFINITY;
+ }
+ else
+ PPL_ASSERT(f.u.binary.inf_sign() == 0);
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return V_LGE;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
+}
+
+template <typename Policy, typename T>
+inline bool
+is_inf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() != 0));
+}
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() < 0));
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+ Float<T> f(v);
+ return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() > 0));
+}
+
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+ return round_to_integer(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_special_float(T& v, Result_Class c, Rounding_Dir) {
+ PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ v = -HUGE_VAL;
+ return V_EQ_MINUS_INFINITY;
+ case VC_PLUS_INFINITY:
+ v = HUGE_VAL;
+ return V_EQ_PLUS_INFINITY;
+ case VC_NAN:
+ v = PPL_NAN;
+ return V_NAN;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+ Float<T> f(v);
+ PPL_ASSERT(!f.u.binary.is_nan());
+ PPL_ASSERT(f.u.binary.inf_sign() >= 0);
+ if (f.u.binary.zero_sign() > 0) {
+ f.u.binary.negate();
+ f.u.binary.inc();
+ }
+ else if (f.u.binary.sign_bit()) {
+ f.u.binary.inc();
+ }
+ else {
+ f.u.binary.dec();
+ }
+ v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+ Float<T> f(v);
+ PPL_ASSERT(!f.u.binary.is_nan());
+ PPL_ASSERT(f.u.binary.inf_sign() <= 0);
+ if (f.u.binary.zero_sign() < 0) {
+ f.u.binary.negate();
+ f.u.binary.inc();
+ }
+ else if (!f.u.binary.sign_bit()) {
+ f.u.binary.inc();
+ }
+ else {
+ f.u.binary.dec();
+ }
+ v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ pred_float(to);
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ succ_float(to);
+ return V_LT;
+ }
+ return V_GT;
+}
+
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact
+ && !round_not_needed(dir) && round_strict_relation(dir))
+ fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact
+ && !round_not_needed(dir) && round_strict_relation(dir)) {
+ switch (fpu_check_inexact()) {
+ case 0:
+ return V_EQ;
+ case -1:
+ goto unknown;
+ case 1:
+ break;
+ }
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ return V_GT;
+ case ROUND_UP:
+ return V_LT;
+ default:
+ return V_NE;
+ }
+ }
+ else {
+ unknown:
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ return V_GE;
+ case ROUND_UP:
+ return V_LE;
+ default:
+ return V_LGE;
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else if (fpu_inverse_rounding(dir)) {
+ From tmp = -from;
+ to = tmp;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(from);
+ to = from;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) > sizeof(To))
+ return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (fpu_direct_rounding(ROUND_DOWN))
+ to = round_to_integer(from);
+ else if (fpu_inverse_rounding(ROUND_DOWN)) {
+ to = round_to_integer(-from);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+ limit_precision(from);
+ to = round_to_integer(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (fpu_direct_rounding(ROUND_UP))
+ to = round_to_integer(from);
+ else if (fpu_inverse_rounding(ROUND_UP)) {
+ to = round_to_integer(-from);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+ limit_precision(from);
+ to = round_to_integer(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (from >= 0)
+ return floor<To_Policy, From_Policy>(to, from, dir);
+ else
+ return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_add_inf
+ && is_inf_float<From1_Policy>(x) && x == -y) {
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x + y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = -x - y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x + y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_sub_inf
+ && is_inf_float<From1_Policy>(x) && x == y) {
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x - y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = y - x;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x - y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x * y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = x * -y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x * y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_div_inf
+ && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y)) {
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ if (To_Policy::check_div_zero && y == 0) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x / y;
+ else if (fpu_inverse_rounding(dir)) {
+ to = x / -y;
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ to = x / y;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type temp;
+ // The inexact check is useless
+ dir = round_dir(dir);
+ Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+ if (result_class(r) != VC_NORMAL) {
+ to = temp;
+ return r;
+ }
+ Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+ PPL_ASSERT(r1 == V_EQ);
+ if (r == V_EQ || to != temp)
+ return r1;
+ // FIXME: Prove that it is impossible to return a strict relation
+ return (dir == ROUND_UP) ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ if (To_Policy::check_div_zero && y == 0) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = std::fmod(x, y);
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return V_EQ;
+}
+
+struct Float_2exp {
+ const_bool_nodef(has_nan, false);
+ const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ add<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ sub<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ mul<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ return
+ div<To_Policy, From_Policy, Float_2exp>(to,
+ x,
+ Type(1ULL << exp),
+ dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ Type m = 1ULL << exp;
+ rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+ Type m2 = m / 2;
+ if (to < -m2)
+ return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ else if (to >= m2)
+ return sub_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+ Type m = 1ULL << exp;
+ rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+ if (to < 0)
+ return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ to = std::abs(from);
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (To_Policy::check_sqrt_neg && from < 0) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = std::sqrt(from);
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(from);
+ to = std::sqrt(from);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_float(const Type x) {
+ if (x > 0)
+ return VR_GT;
+ if (x < 0)
+ return VR_LT;
+ if (x == 0)
+ return VR_EQ;
+ return VR_EMPTY;
+}
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_float(const Type x, const Type y) {
+ if (x > y)
+ return VR_GT;
+ if (x < y)
+ return VR_LT;
+ if (x == y)
+ return VR_EQ;
+ return VR_EMPTY;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ to = from;
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof_to_bits(sizeof(From)) > Float<To>::Binary::MANTISSA_BITS)
+ return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
+ else
+ return assign_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_UP:
+ {
+ Float<T> f;
+ f.u.binary.set_max(true);
+ to = f.value();
+ return V_LT_INF;
+ }
+ case ROUND_DOWN: // Fall through.
+ case ROUND_IGNORE:
+ to = -HUGE_VAL;
+ return V_GT_MINUS_INFINITY;
+ default:
+ PPL_UNREACHABLE;
+ return V_GT_MINUS_INFINITY;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+ switch (round_dir(dir)) {
+ case ROUND_DOWN:
+ {
+ Float<T> f;
+ f.u.binary.set_max(false);
+ to = f.value();
+ return V_GT_SUP;
+ }
+ case ROUND_UP: // Fall through.
+ case ROUND_IGNORE:
+ to = HUGE_VAL;
+ return V_LT_PLUS_INFINITY;
+ default:
+ PPL_UNREACHABLE;
+ return V_LT_PLUS_INFINITY;
+ }
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& from, Rounding_Dir dir) {
+ int sign = sgn(from);
+ if (sign == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ mpz_srcptr from_z = from.get_mpz_t();
+ size_t exponent = mpz_sizeinbase(from_z, 2) - 1;
+ if (exponent > size_t(Float<T>::Binary::EXPONENT_MAX)) {
+ if (sign < 0)
+ return set_neg_overflow_float<To_Policy>(to, dir);
+ else
+ return set_pos_overflow_float<To_Policy>(to, dir);
+ }
+ unsigned long zeroes = mpn_scan1(from_z->_mp_d, 0);
+ size_t meaningful_bits = exponent - zeroes;
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ if (exponent > Float<T>::Binary::MANTISSA_BITS)
+ mpz_tdiv_q_2exp(mantissa,
+ from_z,
+ exponent - Float<T>::Binary::MANTISSA_BITS);
+ else
+ mpz_mul_2exp(mantissa, from_z, Float<T>::Binary::MANTISSA_BITS - exponent);
+ Float<T> f;
+ f.u.binary.build(sign < 0, mantissa, static_cast<long>(exponent));
+ mpz_clear(mantissa);
+ to = f.value();
+ if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+ if (sign < 0)
+ return round_lt_float<To_Policy>(to, dir);
+ else
+ return round_gt_float<To_Policy>(to, dir);
+ }
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) {
+ const mpz_class& numer = from.get_num();
+ const mpz_class& denom = from.get_den();
+ if (denom == 1)
+ return assign_float_mpz<To_Policy, From_Policy>(to, numer, dir);
+ mpz_srcptr numer_z = numer.get_mpz_t();
+ mpz_srcptr denom_z = denom.get_mpz_t();
+ int sign = sgn(numer);
+ long exponent = static_cast<long>(mpz_sizeinbase(numer_z, 2))
+ - static_cast<long>(mpz_sizeinbase(denom_z, 2));
+ if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+ to = 0;
+ inexact:
+ if (sign < 0)
+ return round_lt_float<To_Policy>(to, dir);
+ else
+ return round_gt_float<To_Policy>(to, dir);
+ }
+ if (exponent > Float<T>::Binary::EXPONENT_MAX + 1) {
+ overflow:
+ if (sign < 0)
+ return set_neg_overflow_float<To_Policy>(to, dir);
+ else
+ return set_pos_overflow_float<To_Policy>(to, dir);
+ }
+ unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+ if (exponent < Float<T>::Binary::EXPONENT_MIN) {
+ long diff = Float<T>::Binary::EXPONENT_MIN - exponent;
+ needed_bits -= static_cast<unsigned int>(diff);
+ }
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ {
+ long shift = static_cast<long>(needed_bits) - exponent;
+ if (shift > 0) {
+ mpz_mul_2exp(mantissa, numer_z, static_cast<unsigned long>(shift));
+ numer_z = mantissa;
+ }
+ else if (shift < 0) {
+ shift = -shift;
+ mpz_mul_2exp(mantissa, denom_z, static_cast<unsigned long>(shift));
+ denom_z = mantissa;
+ }
+ }
+ mpz_t r;
+ mpz_init(r);
+ mpz_tdiv_qr(mantissa, r, numer_z, denom_z);
+ size_t bits = mpz_sizeinbase(mantissa, 2);
+ bool inexact = (mpz_sgn(r) != 0);
+ mpz_clear(r);
+ if (bits == needed_bits + 1) {
+ inexact = (inexact || mpz_odd_p(mantissa));
+ mpz_tdiv_q_2exp(mantissa, mantissa, 1);
+ }
+ else
+ --exponent;
+ if (exponent > Float<T>::Binary::EXPONENT_MAX) {
+ mpz_clear(mantissa);
+ goto overflow;
+ }
+ else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+ // Denormalized.
+ exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+ }
+ Float<T> f;
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (inexact)
+ goto inexact;
+ return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ // FIXME: missing check_inf_add_inf
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = multiply_add(x, y, to);
+ else if (fpu_inverse_rounding(dir)) {
+ to = multiply_add(-x, y, -to);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ limit_precision(to);
+ to = multiply_add(x, y, to);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (To_Policy::check_inf_mul_zero
+ && ((x == 0 && is_inf_float<From2_Policy>(y))
+ ||
+ (y == 0 && is_inf_float<From1_Policy>(x)))) {
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ // FIXME: missing check_inf_add_inf
+ prepare_inexact<To_Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = multiply_add(x, -y, to);
+ else if (fpu_inverse_rounding(dir)) {
+ to = multiply_add(x, y, -to);
+ limit_precision(to);
+ to = -to;
+ }
+ else {
+ fpu_rounding_control_word_type old
+ = fpu_save_rounding_direction(round_fpu_dir(dir));
+ limit_precision(x);
+ limit_precision(y);
+ limit_precision(to);
+ to = multiply_add(x, -y, to);
+ limit_precision(to);
+ fpu_restore_rounding_direction(old);
+ }
+ if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+ return V_NAN;
+ return result_relation<To_Policy>(dir);
+}
+
+template <typename From>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const From from) {
+ to = from;
+}
+
+template <>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const long double from) {
+ to = 0;
+ if (from == 0.0L)
+ return;
+ mpz_class& num = to.get_num();
+ mpz_class& den = to.get_den();
+ int exp;
+ long double n = std::frexp(from, &exp);
+ bool neg = false;
+ if (n < 0.0L) {
+ neg = true;
+ n = -n;
+ }
+ const long double mult = static_cast<long double>(ULONG_MAX) + 1.0L;
+ const unsigned int bits = sizeof(unsigned long) * CHAR_BIT;
+ while (true) {
+ n *= mult;
+ exp -= bits;
+ const long double intpart = std::floor(n);
+ num += static_cast<unsigned long>(intpart);
+ n -= intpart;
+ if (n == 0.0L)
+ break;
+ num <<= bits;
+ }
+ if (exp < 0)
+ den <<= -exp;
+ else
+ num <<= exp;
+ if (neg)
+ to = -to;
+ to.canonicalize();
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+ Rounding_Dir) {
+ if (from == 0)
+ os << "0";
+ else if (is_minf<Policy>(from))
+ os << "-inf";
+ else if (is_pinf<Policy>(from))
+ os << "+inf";
+ else if (is_nan<Policy>(from))
+ os << "nan";
+ else {
+ mpq_class q;
+ assign_mpq_numeric_float(q, from);
+ std::string s = float_mpq_to_string(q);
+ os << s;
+ }
+ return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_CLASSIFY(classify_float, float)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, float)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, float)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, float)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, float)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, float)
+PPL_SPECIALIZE_IS_INT(is_int_float, float)
+PPL_SPECIALIZE_FLOOR(floor_float, float, float)
+PPL_SPECIALIZE_CEIL(ceil_float, float, float)
+PPL_SPECIALIZE_TRUNC(trunc_float, float, float)
+PPL_SPECIALIZE_NEG(neg_float, float, float)
+PPL_SPECIALIZE_ABS(abs_float, float, float)
+PPL_SPECIALIZE_ADD(add_float, float, float, float)
+PPL_SPECIALIZE_SUB(sub_float, float, float, float)
+PPL_SPECIALIZE_MUL(mul_float, float, float, float)
+PPL_SPECIALIZE_DIV(div_float, float, float, float)
+PPL_SPECIALIZE_REM(rem_float, float, float, float)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, float, float)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, float, float)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, float, float)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, float, float)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, float, float)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, float, float)
+PPL_SPECIALIZE_SQRT(sqrt_float, float, float)
+PPL_SPECIALIZE_GCD(gcd_exact, float, float, float)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+PPL_SPECIALIZE_SGN(sgn_float, float)
+PPL_SPECIALIZE_CMP(cmp_float, float, float)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+PPL_SPECIALIZE_INPUT(input_generic, float)
+PPL_SPECIALIZE_OUTPUT(output_float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, double)
+PPL_SPECIALIZE_IS_INT(is_int_float, double)
+PPL_SPECIALIZE_FLOOR(floor_float, double, double)
+PPL_SPECIALIZE_CEIL(ceil_float, double, double)
+PPL_SPECIALIZE_TRUNC(trunc_float, double, double)
+PPL_SPECIALIZE_NEG(neg_float, double, double)
+PPL_SPECIALIZE_ABS(abs_float, double, double)
+PPL_SPECIALIZE_ADD(add_float, double, double, double)
+PPL_SPECIALIZE_SUB(sub_float, double, double, double)
+PPL_SPECIALIZE_MUL(mul_float, double, double, double)
+PPL_SPECIALIZE_DIV(div_float, double, double, double)
+PPL_SPECIALIZE_REM(rem_float, double, double, double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, double, double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, double, double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, double, double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, double, double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, double, double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, double, double)
+PPL_SPECIALIZE_SQRT(sqrt_float, double, double)
+PPL_SPECIALIZE_GCD(gcd_exact, double, double, double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+PPL_SPECIALIZE_SGN(sgn_float, double)
+PPL_SPECIALIZE_CMP(cmp_float, double, double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+PPL_SPECIALIZE_INPUT(input_generic, double)
+PPL_SPECIALIZE_OUTPUT(output_float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, long double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, long double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, long double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, long double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, long double)
+PPL_SPECIALIZE_IS_INT(is_int_float, long double)
+PPL_SPECIALIZE_FLOOR(floor_float, long double, long double)
+PPL_SPECIALIZE_CEIL(ceil_float, long double, long double)
+PPL_SPECIALIZE_TRUNC(trunc_float, long double, long double)
+PPL_SPECIALIZE_NEG(neg_float, long double, long double)
+PPL_SPECIALIZE_ABS(abs_float, long double, long double)
+PPL_SPECIALIZE_ADD(add_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB(sub_float, long double, long double, long double)
+PPL_SPECIALIZE_MUL(mul_float, long double, long double, long double)
+PPL_SPECIALIZE_DIV(div_float, long double, long double, long double)
+PPL_SPECIALIZE_REM(rem_float, long double, long double, long double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, long double, long double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, long double, long double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, long double, long double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, long double, long double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, long double, long double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, long double, long double)
+PPL_SPECIALIZE_SQRT(sqrt_float, long double, long double)
+PPL_SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
+ long double, long double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_SGN(sgn_float, long double)
+PPL_SPECIALIZE_CMP(cmp_float, long double, long double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_INPUT(input_generic, long double)
+PPL_SPECIALIZE_OUTPUT(output_float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_mpz_inlines.hh line 1. */
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+*/
+
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (round_down(dir)) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (round_up(dir)) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+#ifdef PPL_HAVE_TYPEOF
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+ return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+ v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+ if (Policy::has_nan || Policy::has_infinity) {
+ mp_size_field_t s = get_mp_size(v);
+ if (Policy::has_nan
+ && (nan || sign)
+ && s == C_Integer<mp_size_field_t>::min + 1)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (s == C_Integer<mp_size_field_t>::min)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (s == C_Integer<mp_size_field_t>::max)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return static_cast<Result>(sgn<Policy>(v));
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+ return Policy::has_nan
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+ return Policy::has_infinity
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+ return Policy::has_infinity
+ && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+ return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpz(mpz_class& v, Result_Class c, Rounding_Dir) {
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan)
+ set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+ return V_NAN;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ set_mp_size(v, C_Integer<mp_size_field_t>::min);
+ return V_EQ_MINUS_INFINITY;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ set_mp_size(v, C_Integer<mp_size_field_t>::max);
+ return V_EQ_PLUS_INFINITY;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+ if (is_nan_mpz<From_Policy>(from))
+ PPL_ASSERT(To_Policy::has_nan);
+ else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+ PPL_ASSERT(To_Policy::has_infinity);
+ else {
+ to = from;
+ return;
+ }
+ set_mp_size(to, get_mp_size(from));
+}
+
+PPL_SPECIALIZE_COPY(copy_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ new (&to) mpz_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ if (round_not_requested(dir)) {
+ new (&to) mpz_class(from);
+ return V_LGE;
+ }
+ From n = rint(from);
+ new (&to) mpz_class(n);
+ if (from == n)
+ return V_EQ;
+ if (from < 0)
+ return round_lt_mpz<To_Policy>(to, dir);
+ else
+ return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(signed long))
+ to = static_cast<signed long>(from);
+ else {
+ mpz_ptr m = to.get_mpz_t();
+ if (from >= 0)
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+ else {
+ From n = -from;
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+ mpz_neg(m, m);
+ }
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(unsigned long))
+ to = static_cast<unsigned long>(from);
+ else
+ mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ if (round_not_requested(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ From i_from = rint(from);
+ to = i_from;
+ if (from == i_from)
+ return V_EQ;
+ if (round_direct(ROUND_UP))
+ return round_lt_mpz<To_Policy>(to, dir);
+ if (round_direct(ROUND_DOWN))
+ return round_gt_mpz<To_Policy>(to, dir);
+ if (from < i_from)
+ return round_lt_mpz<To_Policy>(to, dir);
+ if (from > i_from)
+ return round_gt_mpz<To_Policy>(to, dir);
+ PPL_UNREACHABLE;
+ return V_NAN;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ // FIXME: this is an incredibly inefficient implementation!
+ std::stringstream ss;
+ output<From_Policy>(ss, from, Numeric_Format(), dir);
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+#ifndef NDEBUG
+ Result r =
+#endif
+ input_mpq(tmp, ss);
+ PPL_ASSERT(r == V_EQ);
+ return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (round_not_needed(dir)) {
+ to = from.get_num();
+ return V_LGE;
+ }
+ if (round_ignore(dir)) {
+ to = from;
+ return V_LGE;
+ }
+ const mpz_srcptr n = from.get_num().get_mpz_t();
+ const mpz_srcptr d = from.get_den().get_mpz_t();
+ if (round_down(dir)) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
+
+PPL_SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ const mpz_srcptr n = x.get_mpz_t();
+ const mpz_srcptr d = y.get_mpz_t();
+ if (round_not_needed(dir)) {
+ mpz_divexact(to.get_mpz_t(), n, d);
+ return V_LGE;
+ }
+ if (round_ignore(dir)) {
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return V_LE;
+ }
+ if (round_down(dir)) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ mpz_srcptr n = x.get_mpz_t();
+ mpz_srcptr d = y.get_mpz_t();
+ mpz_tdiv_q(to.get_mpz_t(), n, d);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ to = x % y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x + v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x - v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir dir) {
+ const mpz_srcptr n = x.get_mpz_t();
+ if (round_not_requested(dir)) {
+ mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_LGE;
+ }
+ if (round_down(dir)) {
+ mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_GT;
+ return V_GE;
+ }
+ else {
+ PPL_ASSERT(round_up(dir));
+ mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+ if (round_strict_relation(dir))
+ return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_LT;
+ return V_LE;
+ }
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ if (mpz_tstbit(x.get_mpz_t(), exp - 1) != 0)
+ mpz_cdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ else
+ mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+ const mpz_class& x, const mpz_class& y,
+ Rounding_Dir) {
+ mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+ x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ if (round_not_requested(dir)) {
+ to = sqrt(from);
+ return V_GE;
+ }
+ PPL_DIRTY_TEMP(mpz_class, r);
+ mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+ if (r == 0)
+ return V_EQ;
+ return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_mp(const Type& x) {
+ const int sign = ::sgn(x);
+ return (sign > 0) ? VR_GT : ((sign < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_SGN(sgn_mp, mpz_class)
+PPL_SPECIALIZE_SGN(sgn_mp, mpq_class)
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_mp(const Type& x, const Type& y) {
+ int i = ::cmp(x, y);
+ return (i > 0) ? VR_GT : ((i < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_INPUT(input_generic, mpz_class)
+PPL_SPECIALIZE_OUTPUT(output_mpz, mpz_class)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_mpq_inlines.hh line 1. */
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+*/
+
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+ if ((Policy::has_nan || Policy::has_infinity)
+ && ::sgn(v.get_den()) == 0) {
+ int s = ::sgn(v.get_num());
+ if (Policy::has_nan && (nan || sign) && s == 0)
+ return V_NAN;
+ if (!inf && !sign)
+ return V_LGE;
+ if (Policy::has_infinity) {
+ if (s < 0)
+ return inf ? V_EQ_MINUS_INFINITY : V_LT;
+ if (s > 0)
+ return inf ? V_EQ_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return static_cast<Result>(sgn<Policy>(v));
+ return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+ return Policy::has_nan
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) == 0;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+ return Policy::has_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) < 0;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+ return Policy::has_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) > 0;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+ if ((Policy::has_infinity || Policy::has_nan)
+ && ::sgn(v.get_den()) == 0)
+ return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+ else
+ return v.get_den() == 1;
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpq(mpq_class& v, Result_Class c, Rounding_Dir) {
+ switch (c) {
+ case VC_NAN:
+ if (Policy::has_nan) {
+ v.get_num() = 0;
+ v.get_den() = 0;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+ return V_NAN;
+ case VC_MINUS_INFINITY:
+ if (Policy::has_infinity) {
+ v.get_num() = -1;
+ v.get_den() = 0;
+ return V_EQ_MINUS_INFINITY;
+ }
+ return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+ case VC_PLUS_INFINITY:
+ if (Policy::has_infinity) {
+ v.get_num() = 1;
+ v.get_den() = 0;
+ return V_EQ_PLUS_INFINITY;
+ }
+ return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN | V_UNREPRESENTABLE;
+ }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class)
+
+PPL_SPECIALIZE_COPY(copy_generic, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+ if (is_nan<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ assign_mpq_numeric_float(to, from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, long double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(signed long))
+ to = static_cast<signed long>(from);
+ else {
+ mpz_ptr m = to.get_num().get_mpz_t();
+ if (from >= 0)
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+ else {
+ From n = -from;
+ mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+ mpz_neg(m, m);
+ }
+ to.get_den() = 1;
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+ if (sizeof(From) <= sizeof(unsigned long))
+ to = static_cast<unsigned long>(from);
+ else {
+ mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+ to.get_den() = 1;
+ }
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_fdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_cdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpz_tdiv_q(to.get_num().get_mpz_t(),
+ from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+ to.get_den() = 1;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ to = x / y;
+ return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+ return assign_nan<To_Policy>(to, V_MOD_ZERO);
+ }
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+ tmp = x / y;
+ tmp.get_num() %= tmp.get_den();
+ to = tmp * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x + v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ PPL_DIRTY_TEMP(mpz_class, v);
+ v = 1;
+ mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+ to = x - v;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+ to.get_den() = x.get_den();
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ to.get_num() = x.get_num();
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+ mpz_fdiv_q_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+ bool neg = to.get_num() >= to.get_den();
+ mpz_mul_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+ if (neg)
+ to.get_num() -= to.get_den();
+ mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+ Rounding_Dir) {
+ mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+ mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+ mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+ to.canonicalize();
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+ Rounding_Dir) {
+ to += x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+ Rounding_Dir) {
+ to -= x * y;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned irrational_precision;
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ if (from == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ bool gt1 = from.get_num() > from.get_den();
+ const mpz_class& from_a = gt1 ? from.get_num() : from.get_den();
+ const mpz_class& from_b = gt1 ? from.get_den() : from.get_num();
+ mpz_class& to_a = gt1 ? to.get_num() : to.get_den();
+ mpz_class& to_b = gt1 ? to.get_den() : to.get_num();
+ Rounding_Dir rdir = gt1 ? dir : inverse(dir);
+ mul_2exp<To_Policy, From_Policy>(to_a, from_a,
+ 2*irrational_precision, ROUND_IGNORE);
+ Result r_div
+ = div<To_Policy, To_Policy, To_Policy>(to_a, to_a, from_b, rdir);
+ Result r_sqrt = sqrt<To_Policy, To_Policy>(to_a, to_a, rdir);
+ to_b = 1;
+ mul_2exp<To_Policy, To_Policy>(to_b, to_b,
+ irrational_precision, ROUND_IGNORE);
+ to.canonicalize();
+ return (r_div != V_EQ) ? r_div : r_sqrt;
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+ Result r = input_mpq(to, is);
+ Result_Class c = result_class(r);
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ case VC_PLUS_INFINITY:
+ return assign_special<Policy>(to, c, dir);
+ case VC_NAN:
+ return assign_nan<Policy>(to, r);
+ default:
+ return r;
+ }
+}
+
+PPL_SPECIALIZE_INPUT(input_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+ const mpq_class& from,
+ const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+PPL_SPECIALIZE_OUTPUT(output_mpq, mpq_class)
+
+} // namespace Checked
+
+//! Returns the precision parameter used for irrational calculations.
+inline unsigned
+irrational_precision() {
+ return Checked::irrational_precision;
+}
+
+//! Sets the precision parameter used for irrational calculations.
+/*! The lesser between numerator and denominator is limited to 2**\p p.
+
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for irrational calculations to \p p.
+
+ \exception std::invalid_argument
+ Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_irrational_precision(const unsigned p) {
+ if (p <= INT_MAX)
+ Checked::irrational_precision = p;
+ else
+ throw std::invalid_argument("PPL::set_irrational_precision(p)"
+ " with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_ext_inlines.hh line 1. */
+/* Checked extended arithmetic functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
+namespace Checked {
+
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+ return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+ return !handle_ext_natively(x)
+ && (Policy::has_infinity || Policy::has_nan);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_ext(const Type& x) {
+ if (!ext_to_handle<Policy>(x))
+ goto native;
+ if (is_nan<Policy>(x))
+ return VR_EMPTY;
+ else if (is_minf<Policy>(x))
+ return VR_LT;
+ else if (is_pinf<Policy>(x))
+ return VR_GT;
+ else {
+ native:
+ return sgn<Policy>(x);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return construct<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return assign<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else {
+ native:
+ return neg<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return floor<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return ceil<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return trunc<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return abs<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+ goto inf_add_inf;
+ else
+ goto minf;
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+ inf_add_inf:
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+ goto inf_sub_inf;
+ else
+ goto minf;
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+ inf_sub_inf:
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_pinf<From2_Policy>(y)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ else if (is_minf<From2_Policy>(y)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto minf;
+ case VR_GT:
+ goto pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ native:
+ return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<To_Policy>(to)
+ && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<To_Policy>(to)
+ || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_minf;
+ case VR_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ a_minf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+ goto inf_add_inf;
+ else
+ goto minf;
+ case VR_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+ inf_add_inf:
+ return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ native:
+ return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<To_Policy>(to)
+ && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<To_Policy>(to)
+ || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case VR_LT:
+ goto a_minf;
+ case VR_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ goto a_pinf;
+ case VR_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case VR_LT:
+ a_minf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+ goto inf_sub_inf;
+ else
+ goto pinf;
+ case VR_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+ inf_sub_inf:
+ return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto minf;
+ default:
+ inf_mul_zero:
+ PPL_ASSERT(To_Policy::check_inf_mul_zero);
+ return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ }
+ native:
+ return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y)))
+ goto inf_div_inf;
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto div_zero;
+ }
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y))) {
+ inf_div_inf:
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ PPL_ASSERT(To_Policy::check_div_zero);
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = 0;
+ return V_EQ;
+ }
+ else {
+ native:
+ return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ if (is_minf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y)))
+ goto inf_div_inf;
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ goto pinf;
+ case VR_GT:
+ goto minf;
+ default:
+ goto div_zero;
+ }
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+ || is_pinf<From2_Policy>(y))) {
+ inf_div_inf:
+ return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case VR_LT:
+ minf:
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ case VR_GT:
+ pinf:
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ PPL_ASSERT(To_Policy::check_div_zero);
+ return assign_nan<To_Policy>(to, V_DIV_ZERO);
+ }
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = 0;
+ return V_EQ;
+ }
+ else {
+ native:
+ return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+ goto native;
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+ || is_pinf<From1_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ to = x;
+ return V_EQ;
+ }
+ else {
+ native:
+ return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+add_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return add_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+sub_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return sub_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+mul_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return mul_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+div_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return div_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+smod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+ || is_pinf<From_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ native:
+ return smod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+umod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+ || is_pinf<From_Policy>(x))) {
+ return assign_nan<To_Policy>(to, V_INF_MOD);
+ }
+ else {
+ native:
+ return umod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+ if (!ext_to_handle<From_Policy>(x))
+ goto native;
+ if (is_nan<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From_Policy>(x)) {
+ return assign_nan<To_Policy>(to, V_SQRT_NEG);
+ }
+ else if (is_pinf<From_Policy>(x))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else {
+ native:
+ return sqrt<To_Policy, From_Policy>(to, x, dir);
+ }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+ return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+ else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+ else
+ return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+ typename From1_Policy, typename From2_Policy,
+ typename To1, typename To2, typename To3,
+ typename From1, typename From2>
+inline Result
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+ Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To1_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+ s = 0;
+ t = y > 0 ? -1 : 1;
+ return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+ }
+ else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+ s = x > 0 ? -1 : 1;
+ t = 0;
+ return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+ }
+ else
+ return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+ typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+ || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+ else
+ return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result_Relation
+cmp_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return VR_EMPTY;
+ else if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y) ? VR_EQ : VR_LT;
+ else if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y) ? VR_EQ : VR_GT;
+ else {
+ if (is_minf<Policy2>(y))
+ return VR_GT;
+ if (is_pinf<Policy2>(y))
+ return VR_LT;
+ native:
+ return cmp<Policy1, Policy2>(x, y);
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return true;
+ native:
+ return lt_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+ return lt_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return true;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return false;
+ native:
+ return le_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+ return le_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+ if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+ goto native;
+ if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+ return false;
+ if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y);
+ if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y);
+ else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+ return false;
+ native:
+ return eq_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+ return !eq_ext<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+ const Numeric_Format& format, Rounding_Dir dir) {
+ if (!ext_to_handle<Policy>(x))
+ goto native;
+ if (is_nan<Policy>(x)) {
+ os << "nan";
+ return V_NAN;
+ }
+ if (is_minf<Policy>(x)) {
+ os << "-inf";
+ return V_EQ;
+ }
+ if (is_pinf<Policy>(x)) {
+ os << "+inf";
+ return V_EQ;
+ }
+ native:
+ return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+ return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 706. */
+
+#undef nonconst
+#ifdef PPL_SAVED_nonconst
+#define nonconst PPL_SAVED_nonconst
+#undef PPL_SAVED_nonconst
+#endif
+
+#undef PPL_FUNCTION_CLASS
+#undef PPL_NAN
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 31. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+ const_bool_nodef(check_overflow, true);
+ const_bool_nodef(check_inf_add_inf, false);
+ const_bool_nodef(check_inf_sub_inf, false);
+ const_bool_nodef(check_inf_mul_zero, false);
+ const_bool_nodef(check_div_zero, false);
+ const_bool_nodef(check_inf_div_inf, false);
+ const_bool_nodef(check_inf_mod, false);
+ const_bool_nodef(check_sqrt_neg, false);
+ const_bool_nodef(has_nan, true);
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ const_bool_nodef(fpu_check_inexact, true);
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+ const_bool_nodef(check_overflow, true);
+ const_bool_nodef(check_inf_add_inf, false);
+ const_bool_nodef(check_inf_sub_inf, false);
+ const_bool_nodef(check_inf_mul_zero, false);
+ const_bool_nodef(check_div_zero, false);
+ const_bool_nodef(check_inf_div_inf, false);
+ const_bool_nodef(check_inf_mod, false);
+ const_bool_nodef(check_sqrt_neg, false);
+ const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+ const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+ const_bool_nodef(convertible, true);
+ const_bool_nodef(fpu_check_inexact, true);
+ const_bool_nodef(fpu_check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+ typedef Checked_Number_Transparent_Policy<T> Policy;
+ static const T& raw_value(const T& v) {
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+ typedef P Policy;
+ static const T& raw_value(const Checked_Number<T, P>& v) {
+ return v.raw_value();
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+ typedef Check_Overflow_Policy<T> Policy;
+ static T& raw_value(T& v) {
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+ typedef P Policy;
+ static T& raw_value(Checked_Number<T, P>& v) {
+ return v.raw_value();
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Checked : public False { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Native_Or_Checked
+ : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+ The wrapper and related functions implement an interface which is common
+ to all kinds of coefficient types, therefore allowing for a uniform
+ coding style. This class also implements the policy encoded by the
+ second template parameter. The default policy is to perform the detection
+ of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+ //! \name Constructors
+ //@{
+
+ //! Default constructor.
+ Checked_Number();
+
+ //! Copy constructor.
+ Checked_Number(const Checked_Number& y);
+
+ //! Direct initialization from a Checked_Number and rounding mode.
+ template <typename From, typename From_Policy>
+ Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+ //! Direct initialization from a plain char and rounding mode.
+ Checked_Number(char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed char and rounding mode.
+ Checked_Number(signed char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed short and rounding mode.
+ Checked_Number(signed short y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed int and rounding mode.
+ Checked_Number(signed int y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long and rounding mode.
+ Checked_Number(signed long y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long long and rounding mode.
+ Checked_Number(signed long long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned char and rounding mode.
+ Checked_Number(unsigned char y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned short and rounding mode.
+ Checked_Number(unsigned short y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned int and rounding mode.
+ Checked_Number(unsigned int y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long and rounding mode.
+ Checked_Number(unsigned long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long long and rounding mode.
+ Checked_Number(unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+ //! Direct initialization from a float and rounding mode.
+ Checked_Number(float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+ //! Direct initialization from a double and rounding mode.
+ Checked_Number(double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+ //! Direct initialization from a long double and rounding mode.
+ Checked_Number(long double y, Rounding_Dir dir);
+#endif
+
+ //! Direct initialization from a rational and rounding mode.
+ Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+ //! Direct initialization from an unbounded integer and rounding mode.
+ Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+ //! Direct initialization from a C string and rounding mode.
+ Checked_Number(const char* y, Rounding_Dir dir);
+
+ //! Direct initialization from special and rounding mode.
+ template <typename From>
+ Checked_Number(const From&, Rounding_Dir dir, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+ //! Direct initialization from a Checked_Number, default rounding mode.
+ template <typename From, typename From_Policy>
+ explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+ //! Direct initialization from a plain char, default rounding mode.
+ Checked_Number(char y);
+
+ //! Direct initialization from a signed char, default rounding mode.
+ Checked_Number(signed char y);
+
+ //! Direct initialization from a signed short, default rounding mode.
+ Checked_Number(signed short y);
+
+ //! Direct initialization from a signed int, default rounding mode.
+ Checked_Number(signed int y);
+
+ //! Direct initialization from a signed long, default rounding mode.
+ Checked_Number(signed long y);
+
+ //! Direct initialization from a signed long long, default rounding mode.
+ Checked_Number(signed long long y);
+
+ //! Direct initialization from an unsigned char, default rounding mode.
+ Checked_Number(unsigned char y);
+
+ //! Direct initialization from an unsigned short, default rounding mode.
+ Checked_Number(unsigned short y);
+
+ //! Direct initialization from an unsigned int, default rounding mode.
+ Checked_Number(unsigned int y);
+
+ //! Direct initialization from an unsigned long, default rounding mode.
+ Checked_Number(unsigned long y);
+
+ //! Direct initialization from an unsigned long long, default rounding mode.
+ Checked_Number(unsigned long long y);
+
+ //! Direct initialization from a float, default rounding mode.
+ Checked_Number(float y);
+
+ //! Direct initialization from a double, default rounding mode.
+ Checked_Number(double y);
+
+ //! Direct initialization from a long double, default rounding mode.
+ Checked_Number(long double y);
+
+ //! Direct initialization from a rational, default rounding mode.
+ Checked_Number(const mpq_class& y);
+
+ //! Direct initialization from an unbounded integer, default rounding mode.
+ Checked_Number(const mpz_class& y);
+
+ //! Direct initialization from a C string, default rounding mode.
+ Checked_Number(const char* y);
+
+ //! Direct initialization from special, default rounding mode
+ template <typename From>
+ Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+
+ //@} // Constructors
+
+ //! \name Accessors and Conversions
+ //@{
+
+ //! Conversion operator: returns a copy of the underlying numeric value.
+ operator T() const;
+
+ //! Returns a reference to the underlying numeric value.
+ T& raw_value();
+
+ //! Returns a const reference to the underlying numeric value.
+ const T& raw_value() const;
+
+ //@} // Accessors and Conversions
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Classifies *this.
+ /*!
+ Returns the appropriate Result characterizing:
+ - whether \p *this is NaN,
+ if \p nan is <CODE>true</CODE>;
+ - whether \p *this is a (positive or negative) infinity,
+ if \p inf is <CODE>true</CODE>;
+ - the sign of \p *this,
+ if \p sign is <CODE>true</CODE>.
+ */
+ Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+ //! \name Assignment Operators
+ //@{
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Checked_Number& y);
+
+ //! Assignment operator.
+ template <typename From>
+ Checked_Number& operator=(const From& y);
+
+ //! Add and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+ //! Add and assign operator.
+ Checked_Number& operator+=(const T& y);
+
+ //! Add and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator+=(const From& y);
+
+ //! Subtract and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+ //! Subtract and assign operator.
+ Checked_Number& operator-=(const T& y);
+
+ //! Subtract and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator-=(const From& y);
+
+ //! Multiply and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+ //! Multiply and assign operator.
+ Checked_Number& operator*=(const T& y);
+
+ //! Multiply and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator*=(const From& y);
+
+ //! Divide and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+ //! Divide and assign operator.
+ Checked_Number& operator/=(const T& y);
+
+ //! Divide and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>&>::type
+ operator/=(const From& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From_Policy>
+ Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+ //! Compute remainder and assign operator.
+ Checked_Number& operator%=(const T& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From>
+ typename Enable_If<Is_Native_Or_Checked<From>::value,
+ Checked_Number<T, Policy>& >::type
+ operator%=(const From& y);
+
+ //@} // Assignment Operators
+
+
+ //! \name Increment and Decrement Operators
+ //@{
+
+ //! Pre-increment operator.
+ Checked_Number& operator++();
+
+ //! Post-increment operator.
+ Checked_Number operator++(int);
+
+ //! Pre-decrement operator.
+ Checked_Number& operator--();
+
+ //! Post-decrement operator.
+ Checked_Number operator--(int);
+
+ //@} // Increment and Decrement Operators
+
+private:
+ //! The underlying numeric value.
+ T v;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename To_Policy>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define PPL_DECLARE_FUNC1_A(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_A(assign_r)
+PPL_DECLARE_FUNC1_A(floor_assign_r)
+PPL_DECLARE_FUNC1_A(ceil_assign_r)
+PPL_DECLARE_FUNC1_A(trunc_assign_r)
+PPL_DECLARE_FUNC1_A(neg_assign_r)
+PPL_DECLARE_FUNC1_A(abs_assign_r)
+PPL_DECLARE_FUNC1_A(sqrt_assign_r)
+
+#undef PPL_DECLARE_FUNC1_A
+
+#define PPL_DECLARE_FUNC1_B(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_B(add_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(sub_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(mul_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(div_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(smod_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(umod_2exp_assign_r)
+
+#undef PPL_DECLARE_FUNC1_B
+
+#define PPL_DECLARE_FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC2(add_assign_r)
+PPL_DECLARE_FUNC2(sub_assign_r)
+PPL_DECLARE_FUNC2(mul_assign_r)
+PPL_DECLARE_FUNC2(div_assign_r)
+PPL_DECLARE_FUNC2(idiv_assign_r)
+PPL_DECLARE_FUNC2(rem_assign_r)
+PPL_DECLARE_FUNC2(gcd_assign_r)
+PPL_DECLARE_FUNC2(lcm_assign_r)
+PPL_DECLARE_FUNC2(add_mul_assign_r)
+PPL_DECLARE_FUNC2(sub_mul_assign_r)
+
+#undef PPL_DECLARE_FUNC2
+
+#define PPL_DECLARE_FUNC4(name) \
+template <typename To1, typename To2, typename To3, \
+ typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+ && Is_Native_Or_Checked<To2>::value \
+ && Is_Native_Or_Checked<To3>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t, \
+ const From1& x, const From2& y, \
+ Rounding_Dir dir);
+
+PPL_DECLARE_FUNC4(gcdext_assign_r)
+
+#undef PPL_DECLARE_FUNC4
+
+//! \name Accessor Functions
+//@{
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+/*! \brief
+ Assigns to \p x the greatest common divisor of \p y and \p z,
+ setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+ Checked_Number<T, Policy>& s,
+ Checked_Number<T, Policy>& t,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+mul_2exp_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+div_2exp_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ unsigned int exp);
+
+/*! \brief
+ If \p z divides \p y, assigns to \p x the quotient of the integer
+ division of \p y and \p z.
+
+ \relates Checked_Number
+ The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator==(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+equal(const T1& x, const T2& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator!=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+not_equal(const T1& x, const T2& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator>=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+greater_or_equal(const T1& x, const T2& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator>(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+greater_than(const T1& x, const T2& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator<=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+less_or_equal(const T1& x, const T2& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+ bool>::type
+operator<(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+ && Is_Native_Or_Checked<T2>::value,
+ bool>::type
+less_than(const T1& x, const T2& y);
+
+/*! \brief
+ Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+ of \p x is negative, zero or positive, respectively.
+
+ \relates Checked_Number
+*/
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
+
+/*! \brief
+ Returns a negative, zero or positive value depending on whether
+ \p x is lower than, equal to or greater than \p y, respectively.
+
+ \relates Checked_Number
+*/
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+ && Is_Native_Or_Checked<From2>::value,
+ int>::type
+cmp(const From1& x, const From2& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os,
+ const T& x,
+ const Numeric_Format& format,
+ Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Ascii dump for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
+//! Input function.
+/*!
+ \relates Checked_Number
+
+ \param is
+ Input stream to read from;
+
+ \param x
+ Number (possibly extended) to assign to in case of successful reading;
+
+ \param dir
+ Rounding mode to be applied.
+
+ \return
+ Result of the input operation. Success, success with imprecision,
+ overflow, parsing error: all possibilities are taken into account,
+ checked for, and properly reported.
+
+ This function attempts reading a (possibly extended) number from the given
+ stream \p is, possibly rounding as specified by \p dir, assigning the result
+ to \p x upon success, and returning the appropriate Result.
+
+ The input syntax allows the specification of:
+ - plain base-10 integer numbers as <CODE>34976098</CODE>,
+ <CODE>-77</CODE> and <CODE>+13</CODE>;
+ - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+ and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+ <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+ - base-10 rational numbers in fraction notation as
+ <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+ - base-10 rational numbers in fraction/scientific notation as
+ <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+ (meaning \f$3/580000\f$);
+ - base-10 rational numbers in floating point notation as
+ <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+ <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+ - base-10 rational numbers in floating point scientific notation as
+ <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+ (meaning \f$-220001/100\f$);
+ - integers and rationals (in fractional, floating point and scientific
+ notations) specified by using Mathematica-style bases, in the range
+ from 2 to 36, as
+ <CODE>2^^11</CODE> (meaning \f$3\f$),
+ <CODE>36^^z</CODE> (meaning \f$35\f$),
+ <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+ <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+ <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+ <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+ <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+ <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+ <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+ note that the base and the exponent are always written as plain
+ base-10 integer numbers; also, when an ambiguity may arise, the
+ character <CODE>e</CODE> is interpreted as a digit, so that
+ <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+ <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+ - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+ the Mathematica-style prefix <CODE>16^^</CODE>;
+ - the C-style binary exponent indicator <CODE>p</CODE> can only be used
+ when base 16 has been specified; if used, the exponent will be
+ applied to base 2 (instead of base 16, as is the case when the
+ indicator <CODE>e</CODE> is used);
+ - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+ (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+ and <CODE>nan</CODE> (meaning "not a number").
+
+ The rationale behind the accepted syntax can be summarized as follows:
+ - if the syntax is accepted by Mathematica, then this function
+ accepts it with the same semantics;
+ - if the syntax is acceptable as standard C++ integer or floating point
+ literal (except for octal notation and type suffixes, which are not
+ supported), then this function accepts it with the same semantics;
+ - natural extensions of the above are accepted with the natural
+ extensions of the semantics;
+ - special values are accepted.
+
+ Valid syntax is more formally and completely specified by the
+ following grammar, with the additional provisos that everything is
+ <EM>case insensitive</EM>, that the syntactic category
+ <CODE>BDIGIT</CODE> is further restricted by the current base
+ and that for all bases above 14, any <CODE>e</CODE> is always
+ interpreted as a digit and never as a delimiter for the exponent part
+ (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number : NAN INF : 'inf'
+ | SIGN INF ;
+ | INF
+ | num NAN : 'nan'
+ | num DIV num ;
+ ;
+ SIGN : '-'
+num : u_num | '+'
+ | SIGN u_num ;
+
+u_num : u_num1 EXP : 'e'
+ | HEX u_num1 | 'p'
+ | base BASE u_num1 | '*^'
+ ; ;
+ POINT : '.'
+u_num1 : mantissa ;
+ | mantissa EXP exponent
+ ; DIV : '/'
+ ;
+mantissa: bdigits
+ | POINT bdigits MINUS : '-'
+ | bdigits POINT ;
+ | bdigits POINT bdigits
+ ; PLUS : '+'
+ ;
+exponent: SIGN digits
+ | digits HEX : '0x'
+ ; ;
+
+bdigits : BDIGIT BASE : '^^'
+ | bdigits BDIGIT ;
+ ;
+ DIGIT : '0' .. '9'
+digits : DIGIT ;
+ | digits DIGIT
+ ; BDIGIT : '0' .. '9'
+ | 'a' .. 'z'
+ ;
+\endcode
+*/
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//! Ascii load for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_inlines.hh line 1. */
+/* Checked_Number class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_inlines.hh line 28. */
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+#ifndef NDEBUG
+#define DEBUG_ROUND_NOT_NEEDED
+#endif
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ return ROUND_CHECK;
+#endif
+ }
+ return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ PPL_ASSERT(result_relation(r) == VR_EQ);
+#endif
+ return r;
+ }
+ return r;
+}
+
+
+template <typename T>
+inline void
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+ // TODO: avoid default construction of value member.
+ Checked::copy<Policy, Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member.
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+ (v,
+ y.raw_value(),
+ rounding_dir(dir)),
+ dir)
+ );
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+ // TODO: avoid default construction of value member.
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+ (v,
+ y.raw_value(),
+ rounding_dir(dir)),
+ dir));
+}
+
+// TODO: avoid default construction of value member.
+#define PPL_DEFINE_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y, Rounding_Dir dir) { \
+ Policy::handle_result \
+ (check_result(Checked::assign_ext<Policy, \
+ Checked_Number_Transparent_Policy<PPL_U(type)> > \
+ (v, y, rounding_dir(dir)), \
+ dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y) { \
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+ Policy::handle_result \
+ (check_result(Checked::assign_ext<Policy, \
+ Checked_Number_Transparent_Policy<PPL_U(type)> > \
+ (v, y, rounding_dir(dir)), \
+ dir)); \
+}
+
+PPL_DEFINE_CTOR(char)
+PPL_DEFINE_CTOR(signed char)
+PPL_DEFINE_CTOR(signed short)
+PPL_DEFINE_CTOR(signed int)
+PPL_DEFINE_CTOR(signed long)
+PPL_DEFINE_CTOR(signed long long)
+PPL_DEFINE_CTOR(unsigned char)
+PPL_DEFINE_CTOR(unsigned short)
+PPL_DEFINE_CTOR(unsigned int)
+PPL_DEFINE_CTOR(unsigned long)
+PPL_DEFINE_CTOR(unsigned long long)
+#if PPL_SUPPORTED_FLOAT
+PPL_DEFINE_CTOR(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_DEFINE_CTOR(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_DEFINE_CTOR(long double)
+#endif
+PPL_DEFINE_CTOR(mpq_class&)
+PPL_DEFINE_CTOR(mpz_class&)
+
+#undef PPL_DEFINE_CTOR
+
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y, Rounding_Dir dir) {
+ std::istringstream s(y);
+ Policy::handle_result(check_result(Checked::input<Policy>(v,
+ s,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y) {
+ std::istringstream s(y);
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::input<Policy>(v,
+ s,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const From&,
+ Rounding_Dir dir,
+ typename Enable_If<Is_Special<From>::value, bool>::type) {
+ Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+ From::vclass,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>::Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type) {
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+ Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+ From::vclass,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value
+ && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From&, Rounding_Dir dir) {
+ return check_result(Checked::assign_special<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ From::vclass,
+ rounding_dir(dir)),
+ dir);
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From&, Rounding_Dir dir) {
+ return check_result(Checked::construct_special<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ From::vclass,
+ rounding_dir(dir)),
+ dir);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x) {
+ return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x) {
+ return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x) {
+ return is_minus_infinity(x) ? -1 : (is_plus_infinity(x) ? 1 : 0);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x) {
+ return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x) {
+ return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+ ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+ if (Policy::convertible)
+ return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+ return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+ return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+ return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+ return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+ return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+ return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+ return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+ return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+ return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+ return total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+ return external_memory_in_bytes(x.raw_value());
+}
+
+
+/*! \relates Checked_Number */
+template <typename To>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+ std::istringstream s(x);
+ return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+ s,
+ rounding_dir(dir)),
+ dir);
+}
+
+#define PPL_DEFINE_FUNC1_A(name, func) \
+template <typename To, typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From>::raw_value(x), \
+ rounding_dir(dir)), dir); \
+}
+
+PPL_DEFINE_FUNC1_A(construct, construct_ext)
+PPL_DEFINE_FUNC1_A(assign_r, assign_ext)
+PPL_DEFINE_FUNC1_A(floor_assign_r, floor_ext)
+PPL_DEFINE_FUNC1_A(ceil_assign_r, ceil_ext)
+PPL_DEFINE_FUNC1_A(trunc_assign_r, trunc_ext)
+PPL_DEFINE_FUNC1_A(neg_assign_r, neg_ext)
+PPL_DEFINE_FUNC1_A(abs_assign_r, abs_ext)
+PPL_DEFINE_FUNC1_A(sqrt_assign_r, sqrt_ext)
+
+#undef PPL_DEFINE_FUNC1_A
+
+#define PPL_DEFINE_FUNC1_B(name, func) \
+template <typename To, typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From>::raw_value(x), \
+ exp, \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC1_B(add_2exp_assign_r, add_2exp_ext)
+PPL_DEFINE_FUNC1_B(sub_2exp_assign_r, sub_2exp_ext)
+PPL_DEFINE_FUNC1_B(mul_2exp_assign_r, mul_2exp_ext)
+PPL_DEFINE_FUNC1_B(div_2exp_assign_r, div_2exp_ext)
+PPL_DEFINE_FUNC1_B(smod_2exp_assign_r, smod_2exp_ext)
+PPL_DEFINE_FUNC1_B(umod_2exp_assign_r, umod_2exp_ext)
+
+#undef PPL_DEFINE_FUNC1_B
+
+#define PPL_DEFINE_FUNC2(name, func) \
+template <typename To, typename From1, typename From2> \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+ return \
+ check_result(Checked::func<typename Native_Checked_To_Wrapper<To> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From1> \
+ ::Policy, \
+ typename Native_Checked_From_Wrapper<From2> \
+ ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC2(add_assign_r, add_ext)
+PPL_DEFINE_FUNC2(sub_assign_r, sub_ext)
+PPL_DEFINE_FUNC2(mul_assign_r, mul_ext)
+PPL_DEFINE_FUNC2(div_assign_r, div_ext)
+PPL_DEFINE_FUNC2(idiv_assign_r, idiv_ext)
+PPL_DEFINE_FUNC2(rem_assign_r, rem_ext)
+PPL_DEFINE_FUNC2(gcd_assign_r, gcd_ext)
+PPL_DEFINE_FUNC2(lcm_assign_r, lcm_ext)
+PPL_DEFINE_FUNC2(add_mul_assign_r, add_mul_ext)
+PPL_DEFINE_FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef PPL_DEFINE_FUNC2
+
+#define PPL_DEFINE_FUNC4(name, func) \
+template <typename To1, \
+ typename To2, \
+ typename To3, \
+ typename From1, \
+ typename From2> \
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value \
+ && Is_Native_Or_Checked<To2>::value \
+ && Is_Native_Or_Checked<To3>::value \
+ && Is_Native_Or_Checked<From1>::value \
+ && Is_Native_Or_Checked<From2>::value, \
+ Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t, const From1& x, const From2& y, \
+ Rounding_Dir dir) { \
+ return \
+ check_result \
+ (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy, \
+ typename Native_Checked_To_Wrapper<To2>::Policy, \
+ typename Native_Checked_To_Wrapper<To3>::Policy, \
+ typename Native_Checked_From_Wrapper<From1>::Policy, \
+ typename Native_Checked_From_Wrapper<From2>::Policy> \
+ (Native_Checked_To_Wrapper<To1>::raw_value(to), \
+ Native_Checked_To_Wrapper<To2>::raw_value(s), \
+ Native_Checked_To_Wrapper<To3>::raw_value(t), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+PPL_DEFINE_FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef PPL_DEFINE_PPL_DEFINE_FUNC4
+
+#define PPL_DEFINE_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+ Policy::handle_result((fun)(*this, *this, T(1), \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+ T r = v;\
+ Policy::handle_result((fun)(*this, *this, T(1), \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r;\
+}
+
+PPL_DEFINE_INCREMENT(operator ++, add_assign_r)
+PPL_DEFINE_INCREMENT(operator --, sub_assign_r)
+
+#undef PPL_DEFINE_INCREMENT
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+ Checked::copy<Policy, Policy>(v, y.raw_value());
+ return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+ return *this;
+}
+
+#define PPL_DEFINE_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+ Policy::handle_result((fun)(*this, *this, y, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+ Policy::handle_result((fun)(*this, *this, y, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+ Checked_Number<T, Policy>& >::type \
+Checked_Number<T, Policy>::f(const From& y) { \
+ Checked_Number<T, Policy> cy(y); \
+ Policy::handle_result((fun)(*this, *this, cy, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+}
+
+PPL_DEFINE_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP_ASSIGN
+
+#define PPL_DEFINE_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, \
+ const Checked_Number<T, Policy>& y) { \
+ Checked_Number<T, Policy> r; \
+ Policy::handle_result((fun)(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+} \
+template <typename Type, typename T, typename Policy> \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Type& x, const Checked_Number<T, Policy>& y) { \
+ Checked_Number<T, Policy> r(x); \
+ Policy::handle_result((fun)(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+} \
+template <typename T, typename Policy, typename Type> \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, const Type& y) { \
+ Checked_Number<T, Policy> r(y); \
+ Policy::handle_result((fun)(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+ return r; \
+}
+
+PPL_DEFINE_BINARY_OP(operator +, add_assign_r)
+PPL_DEFINE_BINARY_OP(operator -, sub_assign_r)
+PPL_DEFINE_BINARY_OP(operator *, mul_assign_r)
+PPL_DEFINE_BINARY_OP(operator /, div_assign_r)
+PPL_DEFINE_BINARY_OP(operator %, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP
+
+#define PPL_DEFINE_COMPARE_OP(f, fun) \
+template <typename T1, typename T2> \
+inline \
+typename Enable_If<Is_Native_Or_Checked<T1>::value \
+ && Is_Native_Or_Checked<T2>::value \
+ && (Is_Checked<T1>::value || Is_Checked<T2>::value), \
+ bool>::type \
+ PPL_U(f)(const T1& x, const T2& y) { \
+ return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+ typename Native_Checked_From_Wrapper<T2>::Policy> \
+ (Native_Checked_From_Wrapper<T1>::raw_value(x), \
+ Native_Checked_From_Wrapper<T2>::raw_value(y)); \
+}
+
+PPL_DEFINE_COMPARE_OP(operator ==, eq_ext)
+PPL_DEFINE_COMPARE_OP(operator !=, ne_ext)
+PPL_DEFINE_COMPARE_OP(operator >=, ge_ext)
+PPL_DEFINE_COMPARE_OP(operator >, gt_ext)
+PPL_DEFINE_COMPARE_OP(operator <=, le_ext)
+PPL_DEFINE_COMPARE_OP(operator <, lt_ext)
+
+#undef PPL_DEFINE_COMPARE_OP
+
+#define PPL_DEFINE_COMPARE(f, fun) \
+template <typename T1, typename T2> \
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value \
+ && Is_Native_Or_Checked<T2>::value, \
+ bool>::type \
+ PPL_U(f)(const T1& x, const T2& y) { \
+ return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+ typename Native_Checked_From_Wrapper<T2>::Policy> \
+ (Native_Checked_From_Wrapper<T1>::raw_value(x), \
+ Native_Checked_From_Wrapper<T2>::raw_value(y)); \
+}
+
+PPL_DEFINE_COMPARE(equal, eq_ext)
+PPL_DEFINE_COMPARE(not_equal, ne_ext)
+PPL_DEFINE_COMPARE(greater_or_equal, ge_ext)
+PPL_DEFINE_COMPARE(greater_than, gt_ext)
+PPL_DEFINE_COMPARE(less_or_equal, le_ext)
+PPL_DEFINE_COMPARE(less_than, lt_ext)
+
+#undef PPL_DEFINE_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+ return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+ Checked_Number<T, Policy> r;
+ Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+ return r;
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x) { \
+ Policy::handle_result((fun)(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+ Policy::handle_result((fun)(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z) { \
+ Policy::handle_result((fun)(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN5_5(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, \
+ Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t, \
+ const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z) { \
+ Policy::handle_result((fun)(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef PPL_DEFINE_ASSIGN_FUN2_1
+#undef PPL_DEFINE_ASSIGN_FUN2_2
+#undef PPL_DEFINE_ASSIGN_FUN3_2
+#undef PPL_DEFINE_ASSIGN_FUN3_3
+#undef PPL_DEFINE_ASSIGN_FUN5_5
+
+#define PPL_DEFINE_ASSIGN_2EXP(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, \
+ const Checked_Number<T, Policy>& y, unsigned int exp) { \
+ Policy::handle_result((fun)(x, y, exp, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_2EXP(mul_2exp_assign, mul_2exp_assign_r)
+PPL_DEFINE_ASSIGN_2EXP(div_2exp_assign, div_2exp_assign_r)
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z) {
+ Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+ Result_Relation r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
+ switch (r) {
+ case VR_LT:
+ return -1;
+ case VR_EQ:
+ return 0;
+ case VR_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+ && Is_Native_Or_Checked<From2>::value,
+ int>::type
+cmp(const From1& x, const From2& y) {
+ Result_Relation r
+ = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+ typename Native_Checked_From_Wrapper<From2>::Policy>
+ (Native_Checked_From_Wrapper<From1>::raw_value(x),
+ Native_Checked_From_Wrapper<From2>::raw_value(y));
+ switch (r) {
+ case VR_LT:
+ return -1;
+ case VR_EQ:
+ return 0;
+ case VR_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
+ const Numeric_Format& format, Rounding_Dir dir) {
+ return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+ (os,
+ Native_Checked_From_Wrapper<T>::raw_value(x),
+ format,
+ rounding_dir(dir)),
+ dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+ Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+ return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+ return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+ (Native_Checked_To_Wrapper<T>::raw_value(x),
+ is,
+ rounding_dir(dir)),
+ dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+ Checked_Number<T, Policy>& x) {
+ Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+ if (r == V_CVT_STR_UNK)
+ is.setstate(std::ios::failbit);
+ else
+ Policy::handle_result(r);
+ return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+ return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+ return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+ return NOT_A_NUMBER;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+ using std::swap;
+ swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+ if (FPU_Related<T>::value)
+ return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+ if (FPU_Related<T>::value)
+ return fpu_check_inexact();
+ else
+ return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_templates.hh line 1. */
+/* Checked_Number class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_templates.hh line 28. */
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+ if (std::numeric_limits<T>::is_exact)
+ // An exact data type: pretty printer is accurate.
+ s << t;
+ else {
+ // An inexact data type (probably floating point):
+ // first dump its hexadecimal representation ...
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+ for (unsigned i = 0; i < sizeof(T); ++i) {
+ s << std::setw(2) << std::setfill('0') << static_cast<unsigned>(p[i]);
+ }
+ s.flags(old_flags);
+ // ... and then pretty print it for readability.
+ s << " (" << t << ")";
+ }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+ if (std::numeric_limits<T>::is_exact) {
+ // An exact data type: input from pretty printed version is accurate.
+ s >> t;
+ return !s.fail();
+ }
+ else {
+ // An inexact data type (probably floating point):
+ // first load its hexadecimal representation ...
+ std::string str;
+ if (!(s >> str) || str.size() != 2*sizeof(T))
+ return false;
+ unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+ // CHECKME: any (portable) simpler way?
+ for (unsigned i = 0; i < sizeof(T); ++i) {
+ unsigned byte_value = 0;
+ for (unsigned j = 0; j < 2; ++j) {
+ byte_value <<= 4;
+ unsigned half_byte_value;
+ // Interpret single hex character.
+ switch (str[2*i + j]) {
+ case '0':
+ half_byte_value = 0;
+ break;
+ case '1':
+ half_byte_value = 1;
+ break;
+ case '2':
+ half_byte_value = 2;
+ break;
+ case '3':
+ half_byte_value = 3;
+ break;
+ case '4':
+ half_byte_value = 4;
+ break;
+ case '5':
+ half_byte_value = 5;
+ break;
+ case '6':
+ half_byte_value = 6;
+ break;
+ case '7':
+ half_byte_value = 7;
+ break;
+ case '8':
+ half_byte_value = 8;
+ break;
+ case '9':
+ half_byte_value = 9;
+ break;
+ case 'A':
+ case 'a':
+ half_byte_value = 10;
+ break;
+ case 'B':
+ case 'b':
+ half_byte_value = 11;
+ break;
+ case 'C':
+ case 'c':
+ half_byte_value = 12;
+ break;
+ case 'D':
+ case 'd':
+ half_byte_value = 13;
+ break;
+ case 'E':
+ case 'e':
+ half_byte_value = 14;
+ break;
+ case 'F':
+ case 'f':
+ half_byte_value = 15;
+ break;
+ default:
+ return false;
+ }
+ byte_value += half_byte_value;
+ }
+ PPL_ASSERT(byte_value <= 255);
+ p[i] = static_cast<unsigned char>(byte_value);
+ }
+ // ... then read and discard pretty printed value.
+ if (!(s >> str))
+ return false;
+ const std::string::size_type sz = str.size();
+ return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 1067. */
+
+/* Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 29. */
+#include <limits>
+
+namespace std {
+
+using namespace Parma_Polyhedra_Library;
+
+#define PPL_SPECIALIZE_LIMITS_INT(T) \
+ /*! \brief Partial specialization of std::numeric_limits. */ \
+ template <typename Policy> \
+ class numeric_limits<Checked_Number<PPL_U(T), Policy> > \
+ : public numeric_limits<PPL_U(T)> { \
+ private: \
+ typedef Checked_Number<PPL_U(T), Policy> Type; \
+ \
+ public: \
+ static const bool has_infinity = Policy::has_infinity; \
+ static const bool has_quiet_NaN = Policy::has_nan; \
+ \
+ static Type min() { \
+ Type v; \
+ v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::min; \
+ return v; \
+ } \
+ \
+ static Type max() { \
+ Type v; \
+ v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::max; \
+ return v; \
+ } \
+ \
+ static Type infinity() { \
+ Type v; \
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY, \
+ ROUND_IGNORE); \
+ return v; \
+ } \
+ \
+ static Type quiet_NaN() { \
+ Type v; \
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, \
+ ROUND_IGNORE); \
+ return v; \
+ } \
+ };
+
+PPL_SPECIALIZE_LIMITS_INT(char)
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T) \
+ /*! \brief Partial specialization of std::numeric_limits. */ \
+ template <typename Policy> \
+ struct numeric_limits<Checked_Number<PPL_U(T), Policy> > \
+ : public numeric_limits<PPL_U(T)> { \
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpz_class, Policy> >
+ : public numeric_limits<mpz_class> {
+private:
+ typedef Checked_Number<mpz_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::has_infinity;
+ static const bool has_quiet_NaN = Policy::has_nan;
+
+ static Type infinity() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+ ROUND_IGNORE);
+ return v;
+ }
+
+ static Type quiet_NaN() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+ return v;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+ typedef Checked_Number<mpq_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::has_infinity;
+ static const bool has_quiet_NaN = Policy::has_nan;
+
+ static Type infinity() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+ ROUND_IGNORE);
+ return v;
+ }
+
+ static Type quiet_NaN() {
+ Type v;
+ Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+ return v;
+ }
+};
+
+} // namespace std
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 1. */
+/* stdiobuf class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/stdiobuf_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class stdiobuf;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 28. */
+#include <cstdio>
+#include <streambuf>
+
+class Parma_Polyhedra_Library::stdiobuf
+ : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+ //! Constructor.
+ stdiobuf(FILE* file);
+
+protected:
+ /*! \brief
+ Gets a character in case of underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type underflow();
+
+ /*! \brief
+ In case of underflow, gets a character and advances the next pointer.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type uflow();
+
+ /*! \brief
+ Gets a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+ /*! \brief
+ Puts character back in case of backup underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+ */
+ virtual int_type pbackfail(int_type c = traits_type::eof());
+
+ /*! \brief
+ Writes a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+ /*! \brief
+ Writes a character in case of overflow.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual int_type overflow(int_type c);
+
+ /*! \brief
+ Synchronizes the stream buffer.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+ */
+ virtual int sync();
+
+private:
+ //! Character type of the streambuf.
+ typedef char char_type;
+
+ //! Traits type of the streambuf.
+ typedef std::char_traits<char_type> traits_type;
+
+ //! Integer type of the streambuf.
+ typedef traits_type::int_type int_type;
+
+ //! The encapsulated stdio file.
+ FILE* fp;
+
+ //! Buffer for the last character read.
+ int_type unget_char_buf;
+};
+
+/* Automatically generated from PPL source file ../src/stdiobuf_inlines.hh line 1. */
+/* stdiobuf class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+stdiobuf::stdiobuf(FILE* file)
+ : fp(file), unget_char_buf(traits_type::eof()) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 110. */
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 1. */
+/* c_streambuf class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/c_streambuf_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class c_streambuf;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 28. */
+#include <streambuf>
+#include <cstddef>
+
+class Parma_Polyhedra_Library::c_streambuf
+ : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+ //! Constructor.
+ c_streambuf();
+
+ //! Destructor.
+ virtual ~c_streambuf();
+
+protected:
+ /*! \brief
+ Gets a character in case of underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type underflow();
+
+ /*! \brief
+ In case of underflow, gets a character and advances the next pointer.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type uflow();
+
+ /*! \brief
+ Gets a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+ /*! \brief
+ Puts character back in case of backup underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+ */
+ virtual int_type pbackfail(int_type c = traits_type::eof());
+
+ /*! \brief
+ Writes a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+ /*! \brief
+ Writes a character in case of overflow.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual int_type overflow(int_type c);
+
+ /*! \brief
+ Synchronizes the stream buffer.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+ */
+ virtual int sync();
+
+private:
+ //! Character type of the streambuf.
+ typedef char char_type;
+
+ //! Traits type of the streambuf.
+ typedef std::char_traits<char_type> traits_type;
+
+ //! Integer type of the streambuf.
+ typedef traits_type::int_type int_type;
+
+ //! Buffer for the last character read.
+ int_type unget_char_buf;
+
+ //! Buffer for next character
+ int_type next_char_buf;
+
+ virtual size_t cb_read(char *, size_t) {
+ return 0;
+ }
+ virtual size_t cb_write(const char *, size_t) {
+ return 0;
+ }
+ virtual int cb_sync() {
+ return 0;
+ }
+ virtual int cb_flush() {
+ return 0;
+ }
+};
+
+/* Automatically generated from PPL source file ../src/c_streambuf_inlines.hh line 1. */
+/* c_streambuf class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+c_streambuf::c_streambuf()
+ : unget_char_buf(traits_type::eof()), next_char_buf(traits_type::eof()) {
+}
+
+inline
+c_streambuf::~c_streambuf() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 126. */
+
+/* Automatically generated from PPL source file ../src/Integer_Interval.hh line 1. */
+/* Integer_Interval class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 1. */
+/* Declarations for the Interval class and its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/assign_or_swap.hh line 1. */
+/* The assign_or_swap() utility functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Has_Assign_Or_Swap.hh line 1. */
+/* Has_Assign_Or_Swap classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Has_Assign_Or_Swap.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+ typename Enable_If_Is<void (T::*)(T& x),
+ &T::assign_or_swap>::type>
+ : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/assign_or_swap.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is an assign_or_swap() method, use it.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ to.assign_or_swap(from);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is no assign_or_swap() method but copies are not slow, copy.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+ && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ to = from;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+ If there is no assign_or_swap() and copies are slow, delegate to swap().
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+ && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+ using std::swap;
+ swap(to, from);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 1. */
+/* Helper classes for intervals.
+*/
+
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 28. */
+#include <cstdlib>
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 31. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The result of an operation on intervals.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum I_Result {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_EMPTY = 1U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may have only one value.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SINGLETON = 2U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief \hideinitializer
+ Result may have more than one value, but it is not the domain universe.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SOME = 4U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_UNIVERSE = 8U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_EMPTY = I_SINGLETON | I_SOME | I_UNIVERSE,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_ANY = I_EMPTY | I_NOT_EMPTY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_UNIVERSE = I_EMPTY | I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is neither empty nor the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_NOT_DEGENERATE = I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is definitely exact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_EXACT = 16,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Result is definitely inexact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_INEXACT = 32,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation has definitely changed the set.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_CHANGED = 64,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation has left the set definitely unchanged.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_UNCHANGED = 128,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \hideinitializer Operation is undefined for some combination of values.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ I_SINGULARITIES = 256
+};
+
+inline I_Result
+operator|(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ | static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator&(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ & static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator-(I_Result a, I_Result b) {
+ return static_cast<I_Result>(static_cast<unsigned>(a)
+ & ~static_cast<unsigned>(b));
+}
+
+template <typename Criteria, typename T>
+struct Use_By_Ref;
+
+struct Use_Slow_Copy;
+template <typename T>
+struct Use_By_Ref<Use_Slow_Copy, T>
+ : public Bool<Slow_Copy<T>::value> {
+};
+
+struct By_Value;
+template <typename T>
+struct Use_By_Ref<By_Value, T>
+ : public False {
+};
+
+struct By_Ref;
+template <typename T>
+struct Use_By_Ref<By_Ref, T>
+ : public True {
+};
+
+template <typename T, typename Criteria = Use_Slow_Copy, typename Enable = void>
+class Val_Or_Ref;
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+ typename Enable_If<!Use_By_Ref<Criteria, T>::value>::type> {
+ T value;
+public:
+ typedef T Arg_Type;
+ typedef T Return_Type;
+ Val_Or_Ref()
+ : value() {
+ }
+ explicit Val_Or_Ref(Arg_Type v, bool = false)
+ : value(v) {
+ }
+ Val_Or_Ref& operator=(Arg_Type v) {
+ value = v;
+ return *this;
+ }
+ void set(Arg_Type v, bool = false) {
+ value = v;
+ }
+ Return_Type get() const {
+ return value;
+ }
+ operator Return_Type () const {
+ return get();
+ }
+};
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+ typename Enable_If<Use_By_Ref<Criteria, T>::value>::type> {
+ const T* ptr;
+public:
+ typedef T& Arg_Type;
+ typedef const T& Return_Type;
+ Val_Or_Ref()
+ : ptr(0) {
+ }
+ explicit Val_Or_Ref(Arg_Type v)
+ : ptr(&v) {
+ }
+ Val_Or_Ref(const T& v, bool)
+ : ptr(&v) {
+ }
+ Val_Or_Ref& operator=(Arg_Type v) {
+ ptr = &v;
+ return *this;
+ }
+ void set(Arg_Type v) {
+ ptr = &v;
+ }
+ void set(const T& v, bool) {
+ ptr = &v;
+ }
+ Return_Type get() const {
+ return *ptr;
+ }
+ operator Return_Type () const {
+ return get();
+ }
+};
+
+class I_Constraint_Base {
+};
+
+template <typename Derived>
+class I_Constraint_Common : public I_Constraint_Base {
+public:
+ template <typename T>
+ Result convert_real(T& to) const {
+ const Derived& c = static_cast<const Derived&>(*this);
+ Result r = c.rel();
+ switch (r) {
+ case V_EMPTY:
+ case V_LGE:
+ return r;
+ case V_LE:
+ r = assign_r(to, c.value(), (ROUND_UP | ROUND_STRICT_RELATION));
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_LE;
+ goto lt;
+ case V_LT:
+ r = assign_r(to, c.value(), ROUND_UP);
+ r = result_relation_class(r);
+ lt:
+ switch (r) {
+ case V_EMPTY:
+ case V_LT_PLUS_INFINITY:
+ case V_EQ_MINUS_INFINITY:
+ return r;
+ case V_LT:
+ case V_LE:
+ case V_EQ:
+ return V_LT;
+ default:
+ break;
+ }
+ break;
+ case V_GE:
+ r = assign_r(to, c.value(), (ROUND_DOWN | ROUND_STRICT_RELATION));
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_GE;
+ goto gt;
+ case V_GT:
+ r = assign_r(to, c.value(), ROUND_DOWN);
+ r = result_relation_class(r);
+ gt:
+ switch (r) {
+ case V_EMPTY:
+ case V_GT_MINUS_INFINITY:
+ case V_EQ_PLUS_INFINITY:
+ return r;
+ case V_LT:
+ case V_LE:
+ case V_EQ:
+ return V_GT;
+ default:
+ break;
+ }
+ break;
+ case V_EQ:
+ r = assign_r(to, c.value(), ROUND_CHECK);
+ r = result_relation_class(r);
+ PPL_ASSERT(r != V_LT && r != V_GT);
+ if (r == V_EQ)
+ return V_EQ;
+ else
+ return V_EMPTY;
+ case V_NE:
+ r = assign_r(to, c.value(), ROUND_CHECK);
+ r = result_relation_class(r);
+ if (r == V_EQ)
+ return V_NE;
+ else
+ return V_LGE;
+ default:
+ break;
+ }
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ template <typename T>
+ Result convert_real(T& to1, Result& rel2, T& to2) const {
+ const Derived& c = static_cast<const Derived&>(*this);
+ Result rel1;
+ if (c.rel() != V_EQ) {
+ rel2 = convert(to2);
+ return V_LGE;
+ }
+ rel2 = assign_r(to2, c.value(), ROUND_UP);
+ rel2 = result_relation_class(rel2);
+ switch (rel2) {
+ case V_EMPTY:
+ case V_EQ_MINUS_INFINITY:
+ case V_EQ:
+ return V_LGE;
+ default:
+ break;
+ }
+ rel1 = assign_r(to1, c.value(), ROUND_DOWN);
+ rel1 = result_relation_class(rel1);
+ switch (rel1) {
+ case V_EQ:
+ PPL_ASSERT(rel2 == V_LE);
+ goto eq;
+ case V_EQ_PLUS_INFINITY:
+ case V_EMPTY:
+ rel2 = rel1;
+ return V_LGE;
+ case V_GE:
+ if (rel2 == V_LE && to1 == to2) {
+ eq:
+ rel2 = V_EQ;
+ return V_LGE;
+ }
+ /* Fall through*/
+ case V_GT:
+ case V_GT_MINUS_INFINITY:
+ return rel1;
+ default:
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ switch (rel2) {
+ case V_LE:
+ case V_LT:
+ case V_LT_PLUS_INFINITY:
+ return rel1;
+ default:
+ PPL_UNREACHABLE;
+ return V_EMPTY;
+ }
+ }
+ template <typename T>
+ Result convert_integer(T& to) const {
+ Result rel = convert_real(to);
+ switch (rel) {
+ case V_LT:
+ if (is_integer(to)) {
+ rel = sub_assign_r(to, to, T(1), (ROUND_UP | ROUND_STRICT_RELATION));
+ rel = result_relation_class(rel);
+ return (rel == V_EQ) ? V_LE : rel;
+ }
+ /* Fall through */
+ case V_LE:
+ rel = floor_assign_r(to, to, ROUND_UP);
+ rel = result_relation_class(rel);
+ PPL_ASSERT(rel == V_EQ);
+ return V_LE;
+ case V_GT:
+ if (is_integer(to)) {
+ rel = add_assign_r(to, to, T(1), (ROUND_DOWN | ROUND_STRICT_RELATION));
+ rel = result_relation_class(rel);
+ return (rel == V_EQ) ? V_GE : rel;
+ }
+ /* Fall through */
+ case V_GE:
+ rel = ceil_assign_r(to, to, ROUND_DOWN);
+ rel = result_relation_class(rel);
+ PPL_ASSERT(rel == V_EQ);
+ return V_GE;
+ case V_EQ:
+ if (is_integer(to))
+ return V_EQ;
+ return V_EMPTY;
+ case V_NE:
+ if (is_integer(to))
+ return V_NE;
+ return V_LGE;
+ default:
+ return rel;
+ }
+ }
+};
+
+struct I_Constraint_Rel {
+ Result rel;
+ I_Constraint_Rel(Result r)
+ : rel(r) {
+ PPL_ASSERT(result_relation_class(r) == r);
+ }
+ I_Constraint_Rel(Relation_Symbol r)
+ : rel(static_cast<Result>(r)) {
+ }
+ operator Result() const {
+ return rel;
+ }
+};
+
+template <typename T, typename Val_Or_Ref_Criteria = Use_Slow_Copy,
+ bool extended = false>
+class I_Constraint
+ : public I_Constraint_Common<I_Constraint<T, Val_Or_Ref_Criteria,
+ extended> > {
+ typedef Val_Or_Ref<T, Val_Or_Ref_Criteria> Val_Ref;
+ typedef typename Val_Ref::Arg_Type Arg_Type;
+ typedef typename Val_Ref::Return_Type Return_Type;
+ Result rel_;
+ Val_Ref value_;
+public:
+ typedef T value_type;
+ explicit I_Constraint()
+ : rel_(V_LGE) {
+ }
+ I_Constraint(I_Constraint_Rel r, Arg_Type v)
+ : rel_(r), value_(v) {
+ }
+ I_Constraint(I_Constraint_Rel r, const T& v, bool force)
+ : rel_(r), value_(v, force) {
+ }
+ template <typename U>
+ I_Constraint(I_Constraint_Rel r, const U& v)
+ : rel_(r), value_(v) {
+ }
+ void set(I_Constraint_Rel r, Arg_Type v) {
+ rel_ = r;
+ value_.set(v);
+ }
+ void set(I_Constraint_Rel r, const T& v, bool force) {
+ rel_ = r;
+ value_.set(v, force);
+ }
+ template <typename U>
+ void set(I_Constraint_Rel r, const U& v) {
+ rel_ = r;
+ value_.set(v);
+ }
+ Return_Type value() const {
+ return value_;
+ }
+ Result rel() const {
+ return rel_;
+ }
+};
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v) {
+ return I_Constraint<T>(rel, v);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force) {
+ return I_Constraint<T>(rel, v, force);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, T& v) {
+ return I_Constraint<T>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force,
+ const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v, force);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, T& v, const Val_Or_Ref_Criteria&) {
+ return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 1. */
+/* Interval_Info class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Boundary_defs.hh line 1. */
+/* Interval boundary functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Boundary_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Property {
+ enum Type {
+ SPECIAL_,
+ OPEN_,
+ };
+ typedef bool Value;
+ static const Value default_value = true;
+ static const Value unsupported_value = false;
+ Property(Type t)
+ : type(t) {
+ }
+ Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+
+enum Boundary_Type {
+ LOWER = ROUND_DOWN,
+ UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+ if (check)
+ return static_cast<Rounding_Dir>(t) | ROUND_STRICT_RELATION;
+ else
+ return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+ PPL_ASSERT(Info::store_special);
+ info.set_boundary_property(type, SPECIAL);
+ return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+ return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_open)
+ return info.get_boundary_property(type, OPEN);
+ else
+ return !Info::store_special && !Info::may_contain_infinity
+ && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_open)
+ return info.get_boundary_property(type, OPEN);
+ else
+ return !Info::may_contain_infinity
+ && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+ PPL_COMPILE_TIME_CHECK(Info::store_special
+ || std::numeric_limits<T>::is_bounded
+ || std::numeric_limits<T>::has_infinity,
+ "unbounded is not representable");
+ Result r;
+ if (Info::store_special)
+ r = special_set_boundary_infinity(type, x, info);
+ else if (type == LOWER)
+ r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+ else
+ r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+ if (result_relation(r) == VR_EQ && !Info::may_contain_infinity)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ if (open) {
+ PPL_ASSERT(type == LOWER);
+ }
+ else {
+ PPL_ASSERT(Info::may_contain_infinity);
+ }
+ Result r;
+ if (Info::store_special) {
+ PPL_ASSERT(type == LOWER);
+ r = special_set_boundary_infinity(type, x, info);
+ }
+ else {
+ r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ }
+ if (open || result_relation(r) != VR_EQ)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ if (open) {
+ PPL_ASSERT(type == UPPER);
+ }
+ else {
+ PPL_ASSERT(Info::may_contain_infinity);
+ }
+ Result r;
+ if (Info::store_special) {
+ PPL_ASSERT(type == UPPER);
+ r = special_set_boundary_infinity(type, x, info);
+ }
+ else {
+ r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ }
+ if (open || result_relation(r) != VR_EQ)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+ PPL_ASSERT(open || Info::may_contain_infinity);
+ Result r;
+ if (Info::store_special)
+ r = special_set_boundary_infinity(type, x, info);
+ else if (type == LOWER)
+ r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+ else
+ r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+ PPL_ASSERT(result_representable(r));
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_inf(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special && type == LOWER)
+ return info.get_boundary_property(type, SPECIAL);
+ else if (std::numeric_limits<T>::has_infinity)
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+ else if (std::numeric_limits<T>::is_bounded)
+ return x == std::numeric_limits<T>::min();
+ else
+ return false;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_sup(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special && type == UPPER)
+ return info.get_boundary_property(type, SPECIAL);
+ else if (std::numeric_limits<T>::has_infinity)
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+ else if (std::numeric_limits<T>::is_bounded)
+ return x == std::numeric_limits<T>::max();
+ else
+ return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+ if (!std::numeric_limits<T>::has_infinity)
+ return false;
+ if (type == LOWER)
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+ else
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+ if (!Info::may_contain_infinity)
+ return false;
+ else if (type == LOWER)
+ return Parma_Polyhedra_Library::is_plus_infinity(x);
+ else
+ return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (type == LOWER) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+ }
+ else
+ return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+ if (type == UPPER) {
+ if (Info::store_special)
+ return info.get_boundary_property(type, SPECIAL);
+ else
+ return normal_is_boundary_infinity(type, x, info);
+ }
+ else
+ return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+ return normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+infinity_sign(Boundary_Type type, const T& x, const Info& info) {
+ if (is_boundary_infinity(type, x, info))
+ return (type == LOWER) ? -1 : 1;
+ else if (is_reverse_infinity(type, x, info))
+ return (type == UPPER) ? -1 : 1;
+ else
+ return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+ return Info::may_contain_infinity
+ && !info.get_boundary_property(type, OPEN)
+ && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+ return !Info::may_contain_infinity
+ || info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+ if (info.get_boundary_property(type, SPECIAL))
+ return (type == LOWER) ? -1 : 1;
+ else
+ // The following Parma_Polyhedra_Library:: qualification is to work
+ // around a bug of GCC 4.0.x.
+ return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+ int sign = sgn_b(type, x, info);
+ if (x == 0 && info.get_boundary_property(type, OPEN))
+ return (type == LOWER) ? -1 : 1;
+ else
+ return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (type1 == type2) {
+ if (is_open(type1, x1, info1)
+ != is_open(type2, x2, info2))
+ return false;
+ }
+ else if (is_open(type1, x1, info1)
+ || is_open(type2, x2, info2))
+ return false;
+ if (is_minus_infinity(type1, x1, info1))
+ return is_minus_infinity(type2, x2, info2);
+ else if (is_plus_infinity(type1, x1, info1))
+ return is_plus_infinity(type2, x2, info2);
+ else if (is_minus_infinity(type2, x2, info2)
+ || is_plus_infinity(type2, x2, info2))
+ return false;
+ else
+ return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (is_open(type1, x1, info1)) {
+ if (type1 == UPPER
+ && (type2 == LOWER
+ || !is_open(type2, x2, info2)))
+ goto le;
+ }
+ else if (type2 == LOWER
+ && is_open(type2, x2, info2)) {
+ le:
+ if (is_minus_infinity(type1, x1, info1)
+ || is_plus_infinity(type2, x2, info2))
+ return true;
+ if (is_plus_infinity(type1, x1, info1)
+ || is_minus_infinity(type2, x2, info2))
+ return false;
+ else
+ return less_or_equal(x1, x2);
+ }
+ if (is_plus_infinity(type1, x1, info1)
+ || is_minus_infinity(type2, x2, info2))
+ return false;
+ if (is_minus_infinity(type1, x1, info1)
+ || is_plus_infinity(type2, x2, info2))
+ return true;
+ else
+ return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+ bool open, Result r) {
+ r = result_relation_class(r);
+ if (type == LOWER) {
+ switch (r) {
+ case V_GT_MINUS_INFINITY:
+ open = true;
+ /* Fall through */
+ case V_EQ_MINUS_INFINITY:
+ if (!Info::store_special)
+ return r;
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return special_set_boundary_infinity(type, x, info);
+ case V_GT:
+ open = true;
+ /* Fall through */
+ case V_GE:
+ case V_EQ:
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+ }
+ else {
+ switch (r) {
+ case V_LT_PLUS_INFINITY:
+ open = true;
+ /* Fall through */
+ case V_EQ_PLUS_INFINITY:
+ if (!Info::store_special)
+ return r;
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return special_set_boundary_infinity(type, x, info);
+ case V_LT:
+ open = true;
+ /* Fall through */
+ case V_LE:
+ case V_EQ:
+ if (open)
+ info.set_boundary_property(type, OPEN);
+ return r;
+ default:
+ PPL_UNREACHABLE;
+ return V_NAN;
+ }
+ }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ PPL_ASSERT(to_type != type);
+ bool should_shrink;
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = !special_is_open(type, x, info);
+ if (type == LOWER)
+ return set_minus_infinity(to_type, to, to_info, should_shrink);
+ else
+ return set_plus_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = !normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ bool should_shrink = false) {
+ PPL_ASSERT(to_type == type);
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = (should_shrink || special_is_open(type, x, info));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (should_shrink || normal_is_open(type, x, info));
+ const bool check
+ = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ const Result r = assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ if (lt(type, x, info, to_type, to, to_info)) {
+ to_info.clear_boundary_properties(to_type);
+ return assign(to_type, to, to_info, type, x, info);
+ }
+ return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (lt(type1, x1, info1, type2, x2, info2))
+ return assign(to_type, to, to_info, type1, x1, info1);
+ else
+ return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ if (gt(type, x, info, to_type, to, to_info)) {
+ to_info.clear_boundary_properties(to_type);
+ return assign(to_type, to, to_info, type, x, info);
+ }
+ return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ if (gt(type1, x1, info1, type2, x2, info2))
+ return assign(to_type, to, to_info, type1, x1, info1);
+ else
+ return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info) {
+ PPL_ASSERT(to_type != type);
+ bool should_shrink;
+ if (info.get_boundary_property(type, SPECIAL)) {
+ should_shrink = special_is_open(type, x, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ PPL_ASSERT(type1 == type2);
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ // FIXME: extended handling is not needed
+ Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ PPL_ASSERT(type1 != type2);
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ // FIXME: extended handling is not needed
+ Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = (boundary_infinity_is_open(type1, info1)
+ && !is_boundary_infinity_closed(type2, x2, info2));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = (boundary_infinity_is_open(type2, info2)
+ && !is_boundary_infinity_closed(type1, x1, info1));
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+ // FIXME: extended handling is not needed
+ Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool should_shrink) {
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+ Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+ bool should_shrink;
+ if (x1s != 0) {
+ if (x2s != 0)
+ return mul_assign(to_type, to, to_info,
+ type1, x1, info1,
+ type2, x2, info2);
+ else
+ should_shrink = info2.get_boundary_property(type2, OPEN);
+ }
+ else {
+ should_shrink = (info1.get_boundary_property(type1, OPEN)
+ && (x2s != 0 || info2.get_boundary_property(type2, OPEN)));
+ }
+ return set_zero(to_type, to, to_info, should_shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1,
+ Boundary_Type type2, const T2& x2, const Info2& info2) {
+ bool should_shrink;
+ if (is_boundary_infinity(type1, x1, info1)) {
+ should_shrink = boundary_infinity_is_open(type1, info1);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ else if (is_boundary_infinity(type2, x2, info2)) {
+ should_shrink = boundary_infinity_is_open(type2, info2);
+ return set_zero(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = (normal_is_open(type1, x1, info1)
+ || normal_is_open(type2, x2, info2));
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+ // FIXME: extended handling is not needed
+ Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+ Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+ if (x1s != 0) {
+ if (x2s != 0)
+ return div_assign(to_type, to, to_info,
+ type1, x1, info1,
+ type2, x2, info2);
+ else {
+ return set_boundary_infinity(to_type, to, to_info, true);
+ }
+ }
+ else {
+ bool should_shrink = info1.get_boundary_property(type1, OPEN)
+ && !is_boundary_infinity_closed(type2, x2, info2);
+ return set_zero(to_type, to, to_info, should_shrink);
+ }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+umod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ unsigned int exp) {
+ PPL_ASSERT(to_type == type);
+ bool should_shrink;
+ if (is_boundary_infinity(type, x, info)) {
+ should_shrink = boundary_infinity_is_open(type, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = umod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+smod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+ Boundary_Type type, const T& x, const Info& info,
+ unsigned int exp) {
+ PPL_ASSERT(to_type == type);
+ bool should_shrink;
+ if (is_boundary_infinity(type, x, info)) {
+ should_shrink = boundary_infinity_is_open(type, info);
+ return set_boundary_infinity(to_type, to, to_info, should_shrink);
+ }
+ should_shrink = normal_is_open(type, x, info);
+ bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+ Result r = smod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+ return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 28. */
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+ enum Type {
+ CARDINALITY_0_,
+ CARDINALITY_1_,
+ CARDINALITY_IS_
+ };
+ typedef bool Value;
+ static const Value default_value = true;
+ static const Value unsupported_value = false;
+ Property(Type t)
+ : type(t) {
+ }
+ Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+ bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+ bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+ if (value)
+ bits |= static_cast<T>(1) << bit;
+ else
+ reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+ return (bits & (static_cast<T>(1) << bit)) != 0;
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+ bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+ bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+ return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+ const_bool_nodef(may_be_empty, Policy::may_be_empty);
+ const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+ const_bool_nodef(check_inexact, Policy::check_inexact);
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, false);
+ const_bool_nodef(cache_singleton, false);
+ Interval_Info_Null() {
+ }
+ void clear() {
+ }
+ void clear_boundary_properties(Boundary_Type) {
+ }
+
+ template <typename Property>
+ void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+ }
+ template <typename Property>
+ typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+ return Property::unsupported_value;
+ }
+ template <typename Property>
+ void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+ }
+ template <typename Property>
+ typename Property::Value get_interval_property(const Property&) const {
+ return Property::unsupported_value;
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval_Info_Null& y);
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+ const_bool_nodef(store_open, true);
+ Interval_Info_Null_Open(bool o)
+ : open(o) {
+ }
+ bool get_boundary_property(Boundary_Type,
+ const Boundary_NS::Property& p) const {
+ if (p.type == Boundary_NS::Property::OPEN_)
+ return open;
+ else
+ return Boundary_NS::Property::unsupported_value;
+ }
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+private:
+ bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+ const_bool_nodef(may_be_empty, Policy::may_be_empty);
+ const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+ const_bool_nodef(check_inexact, Policy::check_inexact);
+ const_bool_nodef(store_special, Policy::store_special);
+ const_bool_nodef(store_open, Policy::store_open);
+ const_bool_nodef(cache_empty, Policy::cache_empty);
+ const_bool_nodef(cache_singleton, Policy::cache_singleton);
+ const_int_nodef(lower_special_bit, Policy::next_bit);
+ const_int_nodef(lower_open_bit, lower_special_bit + (store_special ? 1 : 0));
+ const_int_nodef(upper_special_bit, lower_open_bit + (store_open ? 1 : 0));
+ const_int_nodef(upper_open_bit, upper_special_bit + (store_special ? 1 : 0));
+ const_int_nodef(cardinality_is_bit, upper_open_bit + (store_open ? 1 : 0));
+ const_int_nodef(cardinality_0_bit, cardinality_is_bit
+ + ((cache_empty || cache_singleton) ? 1 : 0));
+ const_int_nodef(cardinality_1_bit, cardinality_0_bit + (cache_empty ? 1 : 0));
+ const_int_nodef(next_bit, cardinality_1_bit + (cache_singleton ? 1 : 0));
+
+ Interval_Info_Bitset() {
+ // FIXME: would we have speed benefits with uninitialized info?
+ // (Dirty_Temp)
+ clear();
+ }
+
+ void clear() {
+ reset_bits(bitset);
+ }
+ void clear_boundary_properties(Boundary_Type t) {
+ set_boundary_property(t, SPECIAL, false);
+ set_boundary_property(t, OPEN, false);
+ }
+ void set_boundary_property(Boundary_Type t,
+ const Boundary_NS::Property& p,
+ bool value = true) {
+ switch (p.type) {
+ case Boundary_NS::Property::SPECIAL_:
+ if (store_special) {
+ if (t == LOWER)
+ set_bit(bitset, lower_special_bit, value);
+ else
+ set_bit(bitset, upper_special_bit, value);
+ }
+ break;
+ case Boundary_NS::Property::OPEN_:
+ if (store_open) {
+ if (t == LOWER)
+ set_bit(bitset, lower_open_bit, value);
+ else
+ set_bit(bitset, upper_open_bit, value);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+ switch (p.type) {
+ case Boundary_NS::Property::SPECIAL_:
+ if (!store_special)
+ return false;
+ if (t == LOWER)
+ return get_bit(bitset, lower_special_bit);
+ else
+ return get_bit(bitset, upper_special_bit);
+ case Boundary_NS::Property::OPEN_:
+ if (!store_open)
+ return false;
+ else if (t == LOWER)
+ return get_bit(bitset, lower_open_bit);
+ else
+ return get_bit(bitset, upper_open_bit);
+ default:
+ return false;
+ }
+ }
+ void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+ switch (p.type) {
+ case Interval_NS::Property::CARDINALITY_0_:
+ if (cache_empty)
+ set_bit(bitset, cardinality_0_bit, value);
+ break;
+ case Interval_NS::Property::CARDINALITY_1_:
+ if (cache_singleton)
+ set_bit(bitset, cardinality_1_bit, value);
+ break;
+ case Interval_NS::Property::CARDINALITY_IS_:
+ if (cache_empty || cache_singleton)
+ set_bit(bitset, cardinality_is_bit, value);
+ break;
+ default:
+ break;
+ }
+ }
+ bool get_interval_property(Interval_NS::Property p) const {
+ switch (p.type) {
+ case Interval_NS::Property::CARDINALITY_0_:
+ return cache_empty && get_bit(bitset, cardinality_0_bit);
+ case Interval_NS::Property::CARDINALITY_1_:
+ return cache_singleton && get_bit(bitset, cardinality_1_bit);
+ case Interval_NS::Property::CARDINALITY_IS_:
+ return (cache_empty || cache_singleton)
+ && get_bit(bitset, cardinality_is_bit);
+ default:
+ return false;
+ }
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval_Info_Bitset& y);
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+protected:
+ T bitset;
+};
+
+}
+
+/* Automatically generated from PPL source file ../src/Interval_Info_inlines.hh line 1. */
+/* Interval_Info class implementation: inline functions.
+*/
+
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::m_swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream&) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream&) {
+ return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+ s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str))
+ return false;
+ if (str == "open") {
+ open = true;
+ return true;
+ }
+ if (str == "closed") {
+ open = false;
+ return true;
+ }
+ return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::m_swap(Interval_Info_Bitset<T, Policy>& y) {
+ using std::swap;
+ swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ s << bitset;
+ s.flags(old_flags);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+ const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+ std::ios::basefield);
+ s >> bitset;
+ s.flags(old_flags);
+ return !s.fail();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Interval_Info_Null<Policy>& x, Interval_Info_Null<Policy>& y) {
+ x.m_swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Interval_Info_Bitset<T, Policy>& x, Interval_Info_Bitset<T, Policy>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 284. */
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 33. */
+#include <iosfwd>
+
+// Temporary!
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+enum Ternary { T_YES, T_NO, T_MAYBE };
+
+inline I_Result
+combine(Result l, Result u) {
+ const unsigned res
+ = static_cast<unsigned>(l) | (static_cast<unsigned>(u) << 6);
+ return static_cast<I_Result>(res);
+}
+
+struct Interval_Base {
+};
+
+using namespace Boundary_NS;
+using namespace Interval_NS;
+
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
+
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
+
+//! A generic, not necessarily closed, possibly restricted interval.
+/*! \ingroup PPL_CXX_interface
+ The class template type parameter \p Boundary represents the type
+ of the interval boundaries, and can be chosen, among other possibilities,
+ within one of the following number families:
+
+ - a bounded precision native integer type (that is,
+ from <CODE>signed char</CODE> to <CODE>long long</CODE>
+ and from <CODE>int8_t</CODE> to <CODE>int64_t</CODE>);
+ - a bounded precision floating point type (<CODE>float</CODE>,
+ <CODE>double</CODE> or <CODE>long double</CODE>);
+ - an unbounded integer or rational type, as provided by the C++ interface
+ of GMP (<CODE>mpz_class</CODE> or <CODE>mpq_class</CODE>).
+
+ The class template type parameter \p Info allows to control a number
+ of features of the class, among which:
+
+ - the ability to support open as well as closed boundaries;
+ - the ability to represent empty intervals in addition to nonempty ones;
+ - the ability to represent intervals of extended number families
+ that contain positive and negative infinities;
+*/
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+ PPL_COMPILE_TIME_CHECK(!Info::store_special
+ || !std::numeric_limits<Boundary>::has_infinity,
+ "store_special is meaningless"
+ " when boundary type may contains infinity");
+ Info& w_info() const {
+ return const_cast<Interval&>(*this);
+ }
+
+public:
+ typedef Boundary boundary_type;
+ typedef Info info_type;
+
+ typedef Interval_NS::Property Property;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator=(const T& x) {
+ assign(x);
+ return *this;
+ }
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator+=(const T& x) {
+ add_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator-=(const T& x) {
+ sub_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator*=(const T& x) {
+ mul_assign(*this, x);
+ return *this;
+ }
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ operator/=(const T& x) {
+ div_assign(*this, x);
+ return *this;
+ }
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Interval& y);
+
+ Info& info() {
+ return *this;
+ }
+
+ const Info& info() const {
+ return *this;
+ }
+
+ Boundary& lower() {
+ return lower_;
+ }
+
+ const Boundary& lower() const {
+ return lower_;
+ }
+
+ Boundary& upper() {
+ return upper_;
+ }
+
+ const Boundary& upper() const {
+ return upper_;
+ }
+
+ I_Constraint<boundary_type> lower_constraint() const {
+ PPL_ASSERT(!is_empty());
+ if (info().get_boundary_property(LOWER, SPECIAL))
+ return I_Constraint<boundary_type>();
+ return i_constraint(lower_is_open() ? GREATER_THAN : GREATER_OR_EQUAL,
+ lower(), true);
+ }
+ I_Constraint<boundary_type> upper_constraint() const {
+ PPL_ASSERT(!is_empty());
+ if (info().get_boundary_property(UPPER, SPECIAL))
+ return I_Constraint<boundary_type>();
+ return i_constraint(upper_is_open() ? LESS_THAN : LESS_OR_EQUAL,
+ upper(), true);
+ }
+
+ bool is_empty() const {
+ return lt(UPPER, upper(), info(), LOWER, lower(), info());
+ }
+
+ bool check_empty(I_Result r) const {
+ return (r & I_ANY) == I_EMPTY
+ || ((r & I_ANY) != I_NOT_EMPTY && is_empty());
+ }
+
+ bool is_singleton() const {
+ return eq(LOWER, lower(), info(), UPPER, upper(), info());
+ }
+
+ bool lower_is_open() const {
+ PPL_ASSERT(OK());
+ return is_open(LOWER, lower(), info());
+ }
+
+ bool upper_is_open() const {
+ PPL_ASSERT(OK());
+ return is_open(UPPER, upper(), info());
+ }
+
+ bool lower_is_boundary_infinity() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_boundary_infinity(LOWER, lower(), info());
+ }
+
+ bool upper_is_boundary_infinity() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_boundary_infinity(UPPER, upper(), info());
+ }
+
+ bool lower_is_domain_inf() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_domain_inf(LOWER, lower(), info());
+ }
+
+ bool upper_is_domain_sup() const {
+ PPL_ASSERT(OK());
+ return Boundary_NS::is_domain_sup(UPPER, upper(), info());
+ }
+
+ bool is_bounded() const {
+ PPL_ASSERT(OK());
+ return !lower_is_boundary_infinity() && !upper_is_boundary_infinity();
+ }
+
+ bool is_universe() const {
+ PPL_ASSERT(OK());
+ return lower_is_domain_inf() && upper_is_domain_sup();
+ }
+
+ I_Result lower_extend() {
+ info().clear_boundary_properties(LOWER);
+ set_unbounded(LOWER, lower(), info());
+ return I_ANY;
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ lower_extend(const C& c);
+
+ I_Result upper_extend() {
+ info().clear_boundary_properties(UPPER);
+ set_unbounded(UPPER, upper(), info());
+ return I_ANY;
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ upper_extend(const C& c);
+
+ I_Result build() {
+ return assign(UNIVERSE);
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ build(const C& c) {
+ Relation_Symbol rs;
+ switch (c.rel()) {
+ case V_LGE:
+ case V_GT_MINUS_INFINITY:
+ case V_LT_PLUS_INFINITY:
+ return assign(UNIVERSE);
+ default:
+ return assign(EMPTY);
+ case V_LT:
+ case V_LE:
+ case V_GT:
+ case V_GE:
+ case V_EQ:
+ case V_NE:
+ assign(UNIVERSE);
+ rs = static_cast<Relation_Symbol>(c.rel());
+ return refine_existential(rs, c.value());
+ }
+ }
+
+ template <typename C1, typename C2>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C1>::value
+ &&
+ Is_Same_Or_Derived<I_Constraint_Base, C2>::value,
+ I_Result>::type
+ build(const C1& c1, const C2& c2) {
+ switch (c1.rel()) {
+ case V_LGE:
+ return build(c2);
+ case V_NAN:
+ return assign(EMPTY);
+ default:
+ break;
+ }
+ switch (c2.rel()) {
+ case V_LGE:
+ return build(c1);
+ case V_NAN:
+ return assign(EMPTY);
+ default:
+ break;
+ }
+ build(c1);
+ const I_Result r = add_constraint(c2);
+ return r - (I_CHANGED | I_UNCHANGED);
+ }
+
+ template <typename C>
+ typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+ add_constraint(const C& c) {
+ Interval x;
+ x.build(c);
+ return intersect_assign(x);
+ }
+
+ I_Result assign(Degenerate_Element e) {
+ I_Result r;
+ info().clear();
+ switch (e) {
+ case EMPTY:
+ lower_ = 1;
+ upper_ = 0;
+ r = I_EMPTY | I_EXACT;
+ break;
+ case UNIVERSE:
+ set_unbounded(LOWER, lower(), info());
+ set_unbounded(UPPER, upper(), info());
+ r = I_UNIVERSE | I_EXACT;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ r = I_EMPTY;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return r;
+ }
+
+ template <typename From>
+ typename Enable_If<Is_Special<From>::value, I_Result>::type
+ assign(const From&) {
+ info().clear();
+ Result rl;
+ Result ru;
+ switch (From::vclass) {
+ case VC_MINUS_INFINITY:
+ rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+ ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info());
+ break;
+ case VC_PLUS_INFINITY:
+ rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info());
+ ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+ break;
+ default:
+ PPL_UNREACHABLE;
+ rl = V_NAN;
+ ru = V_NAN;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+ }
+
+ I_Result set_infinities() {
+ info().clear();
+ Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+ Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+ }
+
+ static bool is_always_topologically_closed() {
+ return !Info::store_open;
+ }
+
+ bool is_topologically_closed() const {
+ PPL_ASSERT(OK());
+ return is_always_topologically_closed()
+ || is_empty()
+ || ((lower_is_boundary_infinity() || !lower_is_open())
+ && (upper_is_boundary_infinity() || !upper_is_open()));
+ }
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign() {
+ if (!Info::store_open || is_empty())
+ return;
+ if (lower_is_open() && !lower_is_boundary_infinity())
+ info().set_boundary_property(LOWER, OPEN, false);
+ if (upper_is_open() && !upper_is_boundary_infinity())
+ info().set_boundary_property(UPPER, OPEN, false);
+ }
+
+ void remove_inf() {
+ PPL_ASSERT(!is_empty());
+ if (!Info::store_open)
+ return;
+ info().set_boundary_property(LOWER, OPEN, true);
+ }
+
+ void remove_sup() {
+ PPL_ASSERT(!is_empty());
+ if (!Info::store_open)
+ return;
+ info().set_boundary_property(UPPER, OPEN, true);
+ }
+
+ int infinity_sign() const {
+ PPL_ASSERT(OK());
+ if (is_reverse_infinity(LOWER, lower(), info()))
+ return 1;
+ else if (is_reverse_infinity(UPPER, upper(), info()))
+ return -1;
+ else
+ return 0;
+ }
+
+ bool contains_integer_point() const {
+ PPL_ASSERT(OK());
+ if (is_empty())
+ return false;
+ if (!is_bounded())
+ return true;
+ Boundary l;
+ if (lower_is_open()) {
+ add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+ floor_assign_r(l, l, ROUND_DOWN);
+ }
+ else
+ ceil_assign_r(l, lower(), ROUND_DOWN);
+ Boundary u;
+ if (upper_is_open()) {
+ sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+ ceil_assign_r(u, u, ROUND_UP);
+ }
+ else
+ floor_assign_r(u, upper(), ROUND_UP);
+ return u >= l;
+ }
+
+ void drop_some_non_integer_points() {
+ if (is_empty())
+ return;
+ if (lower_is_open() && !lower_is_boundary_infinity()) {
+ add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN);
+ floor_assign_r(lower(), lower(), ROUND_DOWN);
+ info().set_boundary_property(LOWER, OPEN, false);
+ }
+ else
+ ceil_assign_r(lower(), lower(), ROUND_DOWN);
+ if (upper_is_open() && !upper_is_boundary_infinity()) {
+ sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP);
+ ceil_assign_r(upper(), upper(), ROUND_UP);
+ info().set_boundary_property(UPPER, OPEN, false);
+ }
+ else
+ floor_assign_r(upper(), upper(), ROUND_UP);
+ }
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+ wrap_assign(Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ const From& refinement) {
+ if (is_empty())
+ return I_EMPTY;
+ if (lower_is_boundary_infinity() || upper_is_boundary_infinity())
+ return assign(refinement);
+ PPL_DIRTY_TEMP(Boundary, u);
+ Result result = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
+ if (result_overflow(result) == 0 && u > lower())
+ return assign(refinement);
+ info().clear();
+ switch (r) {
+ case UNSIGNED:
+ umod_2exp_assign(LOWER, lower(), info(),
+ LOWER, lower(), info(), w);
+ umod_2exp_assign(UPPER, upper(), info(),
+ UPPER, upper(), info(), w);
+ break;
+ case SIGNED_2_COMPLEMENT:
+ smod_2exp_assign(LOWER, lower(), info(),
+ LOWER, lower(), info(), w);
+ smod_2exp_assign(UPPER, upper(), info(),
+ UPPER, upper(), info(), w);
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ if (le(LOWER, lower(), info(), UPPER, upper(), info()))
+ return intersect_assign(refinement);
+ PPL_DIRTY_TEMP(Interval, tmp);
+ tmp.info().clear();
+ Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
+ LOWER, lower(), info());
+ set_unbounded(UPPER, tmp.upper(), tmp.info());
+ tmp.intersect_assign(refinement);
+ lower_extend();
+ intersect_assign(refinement);
+ return join_assign(tmp);
+ }
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+
+ bool OK() const {
+ if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+ std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+ return false;
+ }
+
+ if (is_open(LOWER, lower(), info())) {
+ if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is +inf open.\n";
+#endif
+ }
+ }
+ else if (!Info::may_contain_infinity
+ && (is_minus_infinity(LOWER, lower(), info())
+ || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+ return false;
+ }
+ if (!info().get_boundary_property(LOWER, SPECIAL)) {
+ if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+ std::cerr << "The lower boundary is not a number.\n";
+#endif
+ return false;
+ }
+ }
+
+ if (is_open(UPPER, upper(), info())) {
+ if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is -inf open.\n";
+#endif
+ }
+ }
+ else if (!Info::may_contain_infinity
+ && (is_minus_infinity(UPPER, upper(), info())
+ || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is unexpectedly infinity."
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!info().get_boundary_property(UPPER, SPECIAL)) {
+ if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+ std::cerr << "The upper boundary is not a number.\n";
+#endif
+ return false;
+ }
+ }
+
+ // Everything OK.
+ return true;
+ }
+
+ Interval() {
+ }
+
+ template <typename T>
+ explicit Interval(const T& x) {
+ assign(x);
+ }
+
+ /*! \brief
+ Builds the smallest interval containing the number whose textual
+ representation is contained in \p s.
+ */
+ explicit Interval(const char* s);
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ contains(const T& y) const;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ strictly_contains(const T& y) const;
+
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+ is_disjoint_from(const T& y) const;
+
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ assign(const From& x);
+
+ template <typename Type>
+ typename Enable_If<Is_Singleton<Type>::value
+ || Is_Interval<Type>::value, bool>::type
+ can_be_exactly_joined_to(const Type& x) const;
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ join_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ join_assign(const From1& x, const From2& y);
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ intersect_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ intersect_assign(const From1& x, const From2& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest interval containing the set-theoretic
+ difference of \p *this and \p x.
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ difference_assign(const From& x);
+
+ /*! \brief
+ Assigns to \p *this the smallest interval containing the set-theoretic
+ difference of \p x and \p y.
+ */
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+ difference_assign(const From1& x, const From2& y);
+
+ /*! \brief
+ Assigns to \p *this the largest interval contained in the set-theoretic
+ difference of \p *this and \p x.
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ lower_approximation_difference_assign(const From& x);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+
+ \return
+ \c false if and only if the meet of \p *this and \p y is empty.
+ */
+ template <typename From>
+ typename Enable_If<Is_Interval<From>::value, bool>::type
+ simplify_using_context_assign(const From& y);
+
+ /*! \brief
+ Assigns to \p *this an interval having empty intersection with \p y.
+ The assigned interval should be as large as possible.
+ */
+ template <typename From>
+ typename Enable_If<Is_Interval<From>::value, void>::type
+ empty_intersection_assign(const From& y);
+
+ /*! \brief
+ Refines \p to according to the existential relation \p rel with \p x.
+
+ The \p to interval is restricted to become, upon successful exit,
+ the smallest interval of its type that contains the set
+ \f[
+ \{\,
+ a \in \mathtt{to}
+ \mid
+ \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+ \,\}.
+ \f]
+ \return
+ ???
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ refine_existential(Relation_Symbol rel, const From& x);
+
+ /*! \brief
+ Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+ The \p to interval is restricted to become, upon successful exit,
+ the smallest interval of its type that contains the set
+ \f[
+ \{\,
+ a \in \mathtt{to}
+ \mid
+ \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+ \,\}.
+ \f]
+ \return
+ ???
+ */
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ refine_universal(Relation_Symbol rel, const From& x);
+
+ template <typename From>
+ typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+ neg_assign(const From& x);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ add_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ sub_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ mul_assign(const From1& x, const From2& y);
+
+ template <typename From1, typename From2>
+ typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+ div_assign(const From1& x, const From2& y);
+
+ template <typename From, typename Iterator>
+ typename Enable_If<Is_Interval<From>::value, void>::type
+ CC76_widening_assign(const From& y, Iterator first, Iterator last);
+
+private:
+ Boundary lower_;
+ Boundary upper_;
+};
+
+//! Swaps \p x with \p y.
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+void swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_inlines.hh line 1. */
+/* Inline functions for the Interval class and its constituents.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+ return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+ + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::m_swap(Interval<Boundary, Info>& y) {
+ using std::swap;
+ swap(lower(), y.lower());
+ swap(upper(), y.upper());
+ swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+ return x.is_empty();
+}
+template <typename Boundary, typename Info>
+inline bool
+f_is_singleton(const Interval<Boundary, Info>& x) {
+ return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+infinity_sign(const Interval<Boundary, Info>& x) {
+ return x.infinity_sign();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+ return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+ return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+ return x.info();
+}
+
+struct Scalar_As_Interval_Policy {
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, true);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Null<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Info_Null_Open<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+ return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+ return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+ const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+ return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+ Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+ return Scalar_As_Interval_Info_Open(open);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+ return is_not_a_number(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+ return !f_is_empty(x);
+}
+
+} // namespace Interval_NS
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+ return is_singleton(x) && is_integer(f_lower(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+ if (f_info(x).may_be_empty)
+ return f_is_empty(x);
+ else {
+ PPL_ASSERT(!f_is_empty(x));
+ return false;
+ }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+ || Is_Interval<T1>::value)
+ && (Is_Singleton<T2>::value
+ || Is_Interval<T2>::value)
+ && (Is_Interval<T1>::value
+ || Is_Interval<T2>::value)),
+ bool>::type
+operator==(const T1& x, const T2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x))
+ return check_empty_arg(y);
+ else if (check_empty_arg(y))
+ return false;
+ return eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+ && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+ || Is_Interval<T1>::value)
+ && (Is_Singleton<T2>::value
+ || Is_Interval<T2>::value)
+ && (Is_Interval<T1>::value
+ || Is_Interval<T2>::value)),
+ bool>::type
+operator!=(const T1& x, const T2& y) {
+ return !(x == y);
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(y))
+ return true;
+ if (check_empty_arg(*this))
+ return false;
+ return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(y))
+ return !check_empty_arg(*this);
+ if (check_empty_arg(*this))
+ return false;
+ return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+ || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+ && gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+ || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(*this) || check_empty_arg(y))
+ return true;
+ return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+ || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ const Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x));
+ const Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(*this))
+ return assign(x);
+ if (check_empty_arg(x))
+ return combine(V_EQ, V_EQ);
+ Result rl;
+ Result ru;
+ rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x))
+ return assign(y);
+ if (check_empty_arg(y))
+ return assign(x);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ rl = min_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ ru = max_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename Boundary, typename Info>
+template <typename Type>
+inline typename Enable_If<Is_Singleton<Type>::value
+ || Is_Interval<Type>::value, bool>::type
+Interval<Boundary, Info>::can_be_exactly_joined_to(const Type& x) const {
+ PPL_DIRTY_TEMP(Boundary, b);
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) {
+ b = lower();
+ return eq(LOWER, b, info(), UPPER, f_upper(x), f_info(x));
+ }
+ else if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) {
+ b = upper();
+ return eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x));
+ }
+ return true;
+}
+
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+ const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ max_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ min_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return I_NOT_EMPTY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))
+ || gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+ bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ Result rl = V_EQ;
+ Result ru = V_EQ;
+ if (nl) {
+ if (nu)
+ return assign(EMPTY);
+ else {
+ info().clear_boundary_properties(LOWER);
+ rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+ }
+ }
+ else if (nu) {
+ info().clear_boundary_properties(UPPER);
+ ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+ }
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+ const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y))
+ || gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+ return assign(x);
+ bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+ bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+ Result rl = V_EQ;
+ Result ru = V_EQ;
+ if (nl) {
+ if (nu)
+ return assign(EMPTY);
+ else {
+ rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+ }
+ }
+ else if (nu) {
+ ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+ rl = Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x));
+ }
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ switch (rel) {
+ case LESS_THAN:
+ {
+ if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x), true);
+ return I_ANY;
+ }
+ case LESS_OR_EQUAL:
+ {
+ if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x));
+ return I_ANY;
+ }
+ case GREATER_THAN:
+ {
+ if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x), true);
+ return I_ANY;
+ }
+ case GREATER_OR_EQUAL:
+ {
+ if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x));
+ return I_ANY;
+ }
+ case EQUAL:
+ return intersect_assign(x);
+ case NOT_EQUAL:
+ {
+ if (!f_is_singleton(x))
+ return combine(V_EQ, V_EQ);
+ if (check_empty_arg(*this))
+ return I_EMPTY;
+ if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ remove_inf();
+ if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ remove_sup();
+ return I_ANY;
+ }
+ default:
+ PPL_UNREACHABLE;
+ return I_EMPTY;
+ }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+ const From& x) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return combine(V_EQ, V_EQ);
+ switch (rel) {
+ case LESS_THAN:
+ {
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+ LOWER, f_lower(x), SCALAR_INFO,
+ !is_open(LOWER, f_lower(x), f_info(x)));
+ PPL_USED(ru);
+ return I_ANY;
+ }
+ case LESS_OR_EQUAL:
+ {
+ if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(UPPER);
+ Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+ LOWER, f_lower(x), SCALAR_INFO);
+ PPL_USED(ru);
+ return I_ANY;
+ }
+ case GREATER_THAN:
+ {
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+ UPPER, f_upper(x), SCALAR_INFO,
+ !is_open(UPPER, f_upper(x), f_info(x)));
+ PPL_USED(rl);
+ return I_ANY;
+ }
+ case GREATER_OR_EQUAL:
+ {
+ if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+ return combine(V_EQ, V_EQ);
+ info().clear_boundary_properties(LOWER);
+ Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+ UPPER, f_upper(x), SCALAR_INFO);
+ PPL_USED(rl);
+ return I_ANY;
+ }
+ case EQUAL:
+ if (!f_is_singleton(x))
+ return assign(EMPTY);
+ return intersect_assign(x);
+ case NOT_EQUAL:
+ {
+ if (check_empty_arg(*this))
+ return I_EMPTY;
+ if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+ remove_inf();
+ if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+ remove_sup();
+ return I_ANY;
+ }
+ default:
+ PPL_UNREACHABLE;
+ return I_EMPTY;
+ }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+ || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+ PPL_ASSERT(f_OK(x));
+ if (check_empty_arg(x))
+ return assign(EMPTY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+ ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) == -inf_sign)
+ return assign(EMPTY);
+ }
+ else
+ inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else if (inf_sign > 0)
+ return assign(PLUS_INFINITY);
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) == inf_sign)
+ return assign(EMPTY);
+ }
+ else
+ inf_sign = -Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else if (inf_sign > 0)
+ return assign(PLUS_INFINITY);
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+| * | yl > 0 | yu < 0 | yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0 |xl*yl,xu*yu|xu*yl,xl*yu| xu*yl,xu*yu |
++---------+-----------+-----------+-----------------+
+| xu < 0 |xl*yu,xu*yl|xu*yu,xl*yl| xl*yu,xl*yl |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+| | | |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+ int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+ int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+ int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ int ls;
+ int us;
+ if (inf_sign != 0) {
+ ls = yls;
+ us = yus;
+ goto inf;
+ }
+ else {
+ inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+ if (inf_sign != 0) {
+ ls = xls;
+ us = xus;
+ inf:
+ if (ls == 0 && us == 0)
+ return assign(EMPTY);
+ if (ls == -us)
+ return set_infinities();
+ if (ls < 0 || us < 0)
+ inf_sign = -inf_sign;
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else
+ return assign(PLUS_INFINITY);
+ }
+ }
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+
+ if (xls >= 0) {
+ if (yls >= 0) {
+ // 0 <= xl <= xu, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else if (yus <= 0) {
+ // 0 <= xl <= xu, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ // 0 <= xl <= xu, yl < 0 < yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ }
+ else if (xus <= 0) {
+ if (yls >= 0) {
+ // xl <= xu <= 0, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (yus <= 0) {
+ // xl <= xu <= 0, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else {
+ // xl <= xu <= 0, yl < 0 < yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ }
+ else if (yls >= 0) {
+ // xl < 0 < xu, 0 <= yl <= yu
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else if (yus <= 0) {
+ // xl < 0 < xu, yl <= yu <= 0
+ rl = mul_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = mul_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else {
+ // xl < 0 < xu, yl < 0 < yu
+ PPL_DIRTY_TEMP(To_Boundary, tmp);
+ PPL_DIRTY_TEMP(To_Info, tmp_info);
+ tmp_info.clear();
+ Result tmp_r;
+ tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+ UPPER, f_upper(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+ to_lower = tmp;
+ rl = tmp_r;
+ }
+ tmp_info.clear();
+ tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+ UPPER, f_upper(x), f_info(x),
+ UPPER, f_upper(y), f_info(y));
+ ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x),
+ LOWER, f_lower(y), f_info(y));
+ if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+ upper() = tmp;
+ ru = tmp_r;
+ }
+ }
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+| / | yu < 0 | yl > 0 |
++-----------+-----------+-----------+
+| xu<=0 |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+| xl>=0 |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+ || Is_Interval<From1>::value)
+ && (Is_Singleton<From2>::value
+ || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+ PPL_ASSERT(f_OK(x));
+ PPL_ASSERT(f_OK(y));
+ if (check_empty_arg(x) || check_empty_arg(y))
+ return assign(EMPTY);
+ int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+ int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+ if (yls == 0 && yus == 0)
+ return assign(EMPTY);
+ int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+ if (inf_sign != 0) {
+ if (Parma_Polyhedra_Library::infinity_sign(y) != 0)
+ return assign(EMPTY);
+ if (yls == -yus)
+ return set_infinities();
+ if (yls < 0 || yus < 0)
+ inf_sign = -inf_sign;
+ if (inf_sign < 0)
+ return assign(MINUS_INFINITY);
+ else
+ return assign(PLUS_INFINITY);
+ }
+ int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+ int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+ PPL_DIRTY_TEMP(To_Info, to_info);
+ to_info.clear();
+ Result rl;
+ Result ru;
+ PPL_DIRTY_TEMP(To_Boundary, to_lower);
+ if (yls >= 0) {
+ if (xls >= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (xus <= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ }
+ else if (yus <= 0) {
+ if (xls >= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ LOWER, f_lower(y), f_info(y), yls);
+ }
+ else if (xus <= 0) {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ LOWER, f_lower(y), f_info(y), yls);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ else {
+ rl = div_assign_z(LOWER, to_lower, to_info,
+ UPPER, f_upper(x), f_info(x), xus,
+ UPPER, f_upper(y), f_info(y), yus);
+ ru = div_assign_z(UPPER, upper(), to_info,
+ LOWER, f_lower(x), f_info(x), xls,
+ UPPER, f_upper(y), f_info(y), yus);
+ }
+ }
+ else {
+ return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+ }
+ assign_or_swap(lower(), to_lower);
+ assign_or_swap(info(), to_info);
+ PPL_ASSERT(OK());
+ return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.add_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.sub_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.mul_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+ Interval<B, Info> z;
+ z.div_assign(x, y);
+ return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+ if (check_empty_arg(x))
+ return os << "[]";
+ if (x.is_singleton()) {
+ output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+ return os;
+ }
+ os << (x.lower_is_open() ? "(" : "[");
+ if (x.info().get_boundary_property(LOWER, SPECIAL))
+ os << "-inf";
+ else
+ output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+ os << ", ";
+ if (x.info().get_boundary_property(UPPER, SPECIAL))
+ os << "+inf";
+ else
+ output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+ os << (x.upper_is_open() ? ")" : "]");
+ return os;
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+ using Parma_Polyhedra_Library::ascii_dump;
+ s << "info ";
+ info().ascii_dump(s);
+ s << " lower ";
+ ascii_dump(s, lower());
+ s << " upper ";
+ ascii_dump(s, upper());
+ s << '\n';
+}
+
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+ using Parma_Polyhedra_Library::ascii_load;
+ std::string str;
+ if (!(s >> str) || str != "info")
+ return false;
+ if (!info().ascii_load(s))
+ return false;
+ if (!(s >> str) || str != "lower")
+ return false;
+ if (!ascii_load(s, lower()))
+ return false;
+ if (!(s >> str) || str != "upper")
+ return false;
+ if (!ascii_load(s, upper()))
+ return false;
+ PPL_ASSERT(OK());
+ return true;
+}
+
+/*! \brief
+ Helper class to select the appropriate numerical type to perform
+ boundary computations so as to reduce the chances of overflow without
+ incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+ typedef Interval_Boundary_Type type;
+};
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+struct Select_Temp_Boundary_Type<float> {
+ typedef double type;
+};
+#endif
+
+template <>
+struct Select_Temp_Boundary_Type<char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+ typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+ typedef signed long long type;
+};
+
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_templates.hh line 1. */
+/* Interval class implementation: non-inline template functions.
+*/
+
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::lower_extend(const C& c) {
+ PPL_ASSERT(OK());
+ bool open;
+ switch (c.rel()) {
+ case V_LGE:
+ return lower_extend();
+ case V_NAN:
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ case V_GT:
+ open = true;
+ break;
+ case V_GE: // Fall through.
+ case V_EQ:
+ open = false;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ }
+ min_assign(LOWER, lower(), info(), LOWER, c.value(), f_info(c.value(), open));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::upper_extend(const C& c) {
+ PPL_ASSERT(OK());
+ bool open;
+ switch (c.rel()) {
+ case V_LGE:
+ return lower_extend();
+ case V_NAN:
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ case V_LT:
+ open = true;
+ break;
+ case V_LE: // Fall through.
+ case V_EQ:
+ open = false;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+ }
+ max_assign(UPPER, upper(), info(), UPPER, c.value(), f_info(c.value(), open));
+ PPL_ASSERT(OK());
+ return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+ Iterator first,
+ Iterator last) {
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_ASSERT(contains(y));
+ Interval<Boundary, Info>& x = *this;
+
+ // Upper bound.
+ if (!x.upper_is_boundary_infinity()) {
+ Boundary& x_ub = x.upper();
+ const Boundary& y_ub = y.upper();
+ PPL_ASSERT(!y.upper_is_boundary_infinity() && y_ub <= x_ub);
+ if (y_ub < x_ub) {
+ Iterator k = std::lower_bound(first, last, x_ub);
+ if (k != last) {
+ if (x_ub < *k)
+ x_ub = *k;
+ }
+ else
+ x.upper_extend();
+ }
+ }
+
+ // Lower bound.
+ if (!x.lower_is_boundary_infinity()) {
+ Boundary& x_lb = x.lower();
+ const Boundary& y_lb = y.lower();
+ PPL_ASSERT(!y.lower_is_boundary_infinity() && y_lb >= x_lb);
+ if (y_lb > x_lb) {
+ Iterator k = std::lower_bound(first, last, x_lb);
+ if (k != last) {
+ if (x_lb < *k) {
+ if (k != first)
+ x_lb = *--k;
+ else
+ x.lower_extend();
+ }
+ }
+ else {
+ if (k != first)
+ x_lb = *--k;
+ else
+ x.lower_extend();
+ }
+ }
+ }
+}
+
+template <typename Boundary, typename Info>
+Interval<Boundary, Info>::Interval(const char* s) {
+ // Get the lower bound.
+ Boundary lower_bound;
+ Result lower_r = assign_r(lower_bound, s, ROUND_DOWN);
+ if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN) {
+ throw std::invalid_argument("PPL::Interval(const char* s)"
+ " with s invalid");
+ }
+ lower_r = result_relation_class(lower_r);
+
+ // Get the upper bound.
+ Boundary upper_bound;
+ Result upper_r = assign_r(upper_bound, s, ROUND_UP);
+ PPL_ASSERT(upper_r != V_CVT_STR_UNK && upper_r != V_NAN);
+ upper_r = result_relation_class(upper_r);
+
+ // Build the interval.
+ bool lower_open = false;
+ bool upper_open = false;
+ bool lower_boundary_infinity = false;
+ bool upper_boundary_infinity = false;
+ switch (lower_r) {
+ case V_EQ: // Fall through.
+ case V_GE:
+ break;
+ case V_GT:
+ lower_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ lower_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ lower_boundary_infinity = true;
+ break;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+ assign(UNIVERSE);
+ else
+ assign(EMPTY);
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ switch (upper_r) {
+ case V_EQ: // Fall through.
+ case V_LE:
+ break;
+ case V_LT:
+ upper_open = true;
+ break;
+ case V_EQ_MINUS_INFINITY: // Fall through.
+ case V_GT_MINUS_INFINITY:
+ if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+ assign(UNIVERSE);
+ else
+ assign(EMPTY);
+ break;
+ case V_LT_PLUS_INFINITY:
+ upper_open = true;
+ // Fall through.
+ case V_EQ_PLUS_INFINITY:
+ upper_boundary_infinity = true;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ if (!lower_boundary_infinity
+ && !upper_boundary_infinity
+ && (lower_bound > upper_bound
+ || (lower_open && lower_bound == upper_bound)))
+ assign(EMPTY);
+ else {
+ if (lower_boundary_infinity)
+ set_minus_infinity(LOWER, lower(), info(), lower_open);
+ else
+ Boundary_NS::assign(LOWER, lower(), info(),
+ LOWER, lower_bound, SCALAR_INFO, lower_open);
+ if (upper_boundary_infinity)
+ set_plus_infinity(UPPER, upper(), info(), upper_open);
+ else
+ Boundary_NS::assign(UPPER, upper(), info(),
+ UPPER, upper_bound, SCALAR_INFO, upper_open);
+ }
+}
+
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+ Boundary lower_bound;
+ Boundary upper_bound;
+ bool lower_boundary_infinity = false;
+ bool upper_boundary_infinity = false;
+ bool lower_open = false;
+ bool upper_open = false;
+ Result lower_r;
+ Result upper_r;
+
+ // Eat leading white space.
+ char c;
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+
+ // Get the opening parenthesis and handle the empty interval case.
+ if (c == '(')
+ lower_open = true;
+ else if (c == '[') {
+ if (!is.get(c))
+ goto fail;
+ if (c == ']') {
+ // Empty interval.
+ x.assign(EMPTY);
+ return is;
+ }
+ else
+ is.unget();
+ }
+ else
+ goto unexpected;
+
+ // Get the lower bound.
+ lower_r = input(lower_bound, is, ROUND_DOWN);
+ if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN)
+ goto fail;
+ lower_r = result_relation_class(lower_r);
+
+ // Match the comma separating the lower and upper bounds.
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+ if (c != ',')
+ goto unexpected;
+
+ // Get the upper bound.
+ upper_r = input(upper_bound, is, ROUND_UP);
+ if (upper_r == V_CVT_STR_UNK || upper_r == V_NAN)
+ goto fail;
+ upper_r = result_relation_class(upper_r);
+
+ // Get the closing parenthesis.
+ do {
+ if (!is.get(c))
+ goto fail;
+ } while (is_space(c));
+ if (c == ')')
+ upper_open = true;
+ else if (c != ']') {
+ unexpected:
+ is.unget();
+ fail:
+ is.setstate(std::ios::failbit);
+ return is;
+ }
+
+ // Build interval.
+ switch (lower_r) {
+ case V_EQ: // Fall through.
+ case V_GE:
+ break;
+ case V_GT:
+ lower_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ lower_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ lower_boundary_infinity = true;
+ break;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+ x.assign(UNIVERSE);
+ else
+ x.assign(EMPTY);
+ return is;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ switch (upper_r) {
+ case V_EQ: // Fall through.
+ case V_LE:
+ break;
+ case V_LT:
+ upper_open = true;
+ break;
+ case V_GT_MINUS_INFINITY:
+ upper_open = true;
+ // Fall through.
+ case V_EQ_MINUS_INFINITY:
+ if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+ x.assign(UNIVERSE);
+ else
+ x.assign(EMPTY);
+ return is;
+ case V_EQ_PLUS_INFINITY: // Fall through.
+ case V_LT_PLUS_INFINITY:
+ upper_boundary_infinity = true;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ if (!lower_boundary_infinity
+ && !upper_boundary_infinity
+ && (lower_bound > upper_bound
+ || (lower_open && lower_bound == upper_bound)))
+ x.assign(EMPTY);
+ else {
+ if (lower_boundary_infinity)
+ set_minus_infinity(LOWER, x.lower(), x.info(), lower_open);
+ else
+ assign(LOWER, x.lower(), x.info(),
+ LOWER, lower_bound, SCALAR_INFO, lower_open);
+ if (upper_boundary_infinity)
+ set_plus_infinity(UPPER, x.upper(), x.info(), upper_open);
+ else
+ assign(UPPER, x.upper(), x.info(),
+ UPPER, upper_bound, SCALAR_INFO, upper_open);
+ }
+ return is;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, bool>::type
+Interval<Boundary, Info>::simplify_using_context_assign(const From& y) {
+ // FIXME: the following code wrongly assumes that intervals are closed
+ if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) {
+ lower_extend();
+ return false;
+ }
+ if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) {
+ upper_extend();
+ return false;
+ }
+ // Weakening the upper bound.
+ if (!upper_is_boundary_infinity() && !y.upper_is_boundary_infinity()
+ && y.upper() <= upper())
+ upper_extend();
+ // Weakening the lower bound.
+ if (!lower_is_boundary_infinity() && !y.lower_is_boundary_infinity()
+ && y.lower() >= lower())
+ lower_extend();
+ return true;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::empty_intersection_assign(const From&) {
+ // FIXME: write me.
+ assign(EMPTY);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 762. */
+
+/* Automatically generated from PPL source file ../src/Integer_Interval.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Integer_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int, Integer_Interval_Info_Policy> Integer_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with integral, necessarily closed boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpz_class, Integer_Interval_Info> Integer_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/initializer.hh line 1. */
+/* Nifty counter object for the initialization of the library.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 1. */
+/* Init class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Sets the FPU rounding mode so that the PPL abstractions based on
+ floating point numbers work correctly.
+
+ This is performed automatically at initialization-time. Calling
+ this function is needed only if restore_pre_PPL_rounding() has been
+ previously called.
+*/
+void set_rounding_for_PPL();
+
+/*! \brief
+ Sets the FPU rounding mode as it was before initialization of the PPL.
+
+ This is important if the application uses floating-point computations
+ outside the PPL. It is crucial when the application uses functions
+ from a mathematical library that are not guaranteed to work correctly
+ under all rounding modes.
+
+ After calling this function it is absolutely necessary to call
+ set_rounding_for_PPL() before using any PPL abstractions based on
+ floating point numbers.
+ This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+ <EM>Nifty Counter</EM> initialization class,
+ ensuring that the library is initialized only once
+ and before its first use.
+ A count of the number of translation units using the library
+ is maintained. A static object of Init type will be declared
+ by each translation unit using the library. As a result,
+ only one of them will initialize and properly finalize
+ the library.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Init {
+public:
+ //! Initializes the PPL.
+ Init();
+
+ //! Finalizes the PPL.
+ ~Init();
+
+private:
+ /*! \brief
+ Default precision parameter used for irrational calculations.
+
+ The default is chosen to have a precision greater than most
+ precise IEC 559 floating point (112 bits of mantissa).
+ */
+ static const unsigned DEFAULT_IRRATIONAL_PRECISION = 128U;
+
+ //! Count the number of objects created.
+ static unsigned int count;
+ static fpu_rounding_direction_type old_rounding_direction;
+
+ friend void set_rounding_for_PPL();
+ friend void restore_pre_PPL_rounding();
+};
+
+/* Automatically generated from PPL source file ../src/Init_inlines.hh line 1. */
+/* Init class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+ fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
+
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+ fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 98. */
+
+
+/* Automatically generated from PPL source file ../src/initializer.hh line 28. */
+
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
+
+static Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+#else
+
+static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
+
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ if (Parma_Polyhedra_Library_initializer_p == 0)
+ Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
+
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0);
+ delete Parma_Polyhedra_Library_initializer_p;
+ Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
+
+} //namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 1. */
+/* Linear_Expression_Impl class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_Expression_Impl;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 1. */
+/* Coefficient class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 17. */
+
+#ifdef PPL_GMP_INTEGERS
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 17. */
+#include <gmpxx.h>
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 19. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+ \brief
+ Unbounded integers as provided by the GMP library.
+
+ \ingroup PPL_CXX_interface
+ GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+ defined in the C++ interface of the GMP library.
+ For more information, see <CODE>http://gmplib.org/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+ //! The type used for references to const unbounded integers.
+ typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 20. */
+#endif
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! A policy for checked bounded integer coefficients.
+/*! \ingroup PPL_CXX_interface */
+struct Bounded_Integer_Coefficient_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Do not handle not-a-number special value.
+ const_bool_nodef(has_nan, false);
+
+ //! Do not handle infinity special values.
+ const_bool_nodef(has_infinity, false);
+
+ /*! \brief
+ The checked number can always be safely converted to the
+ underlying type \p T and vice-versa.
+ */
+ const_bool_nodef(convertible, true);
+
+ //! Do not honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, false);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ /*! \brief
+ For constructors, by default use the same rounding used by
+ underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+ /*! \brief
+ For overloaded operators (operator+(), operator-(), ...), by
+ default use the same rounding used by the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+ /*! \brief
+ For input functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For output functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For all other functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+ //! The type used for references to const 8 bit checked integers.
+ typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+ //! The type used for references to const 16 bit checked integers.
+ typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+ //! The type used for references to const 32 bit checked integers.
+ typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+ //! The type used for references to const 64 bit checked integers.
+ typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+ Objects of type Coefficient are used to implement the integral valued
+ coefficients occurring in linear expressions, constraints, generators,
+ intervals, bounding boxes and so on. Depending on the chosen
+ configuration options (see file <CODE>README.configure</CODE>),
+ a Coefficient may actually be:
+ - The GMP_Integer type, which in turn is an alias for the
+ <CODE>mpz_class</CODE> type implemented by the C++ interface
+ of the GMP library (this is the default configuration).
+ - An instance of the Checked_Number class template: with the policy
+ Bounded_Integer_Coefficient_Policy, this implements overflow
+ detection on top of a native integral type (available template
+ instances include checked integers having 8, 16, 32 or 64 bits);
+ with the Checked_Number_Transparent_Policy, this is a wrapper
+ for native integral types with no overflow detection
+ (available template instances are as above).
+*/
+typedef PPL_COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 28. */
+#include <iosfwd>
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 33. */
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 1. */
+/* GMP_Integer class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 29. */
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+ Assigns to \p x the greatest common divisor of \p y and \p z, and to
+ \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+/*! \brief
+ If \p z divides \p y, assigns to \p x the quotient of the integer
+ division of \p y and \p z.
+
+ \relates GMP_Integer
+ The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+ Returns a negative, zero or positive value depending on whether
+ \p x is lower than, equal to or greater than \p y, respectively.
+
+ \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_inlines.hh line 1. */
+/* GMP_Integer class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+ mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x) {
+ mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+ const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_gcdext(x.get_mpz_t(),
+ s.get_mpz_t(), t.get_mpz_t(),
+ y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+ mpz_mul_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+ mpz_tdiv_q_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ PPL_ASSERT(y % z == 0);
+ mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+ mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+ return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+ return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+ return x;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 133. */
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 37. */
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
+Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_inlines.hh line 1. */
+/* Coefficient class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_CHECKED_INTEGERS
+inline void
+Bounded_Integer_Coefficient_Policy::handle_result(Result r) {
+ // Note that the input functions can return VC_NAN.
+ if (result_overflow(r) || result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+#endif // PPL_CHECKED_INTEGERS
+
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ // FIXME: is there a way to avoid this static variable?
+ static Coefficient zero(0);
+ return zero;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ // FIXME: is there a way to avoid this static variable?
+ static Coefficient one(1);
+ return one;
+}
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ extern const Coefficient* Coefficient_zero_p;
+ return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ extern const Coefficient* Coefficient_one_p;
+ PPL_ASSERT(*Coefficient_one_p != 0);
+ return *Coefficient_one_p;
+}
+#endif // PPL_GMP_INTEGERS
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 60. */
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 1. */
+/* Variables_Set class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variables_Set_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 30. */
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& vs);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+ : public std::set<dimension_type> {
+private:
+ typedef std::set<dimension_type> Base;
+
+public:
+ //! Builds the empty set of variable indexes.
+ Variables_Set();
+
+ //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+ explicit Variables_Set(const Variable v);
+
+ /*! \brief
+ Builds the set of variables's indexes in the range from
+ <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+ If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+ set of variables' indexes
+ <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+ The empty set is built otherwise.
+ */
+ Variables_Set(const Variable v, const Variable w);
+
+ //! Returns the maximum space dimension a Variables_Set can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns the dimension of the smallest vector space enclosing all
+ the variables whose indexes are in the set.
+ */
+ dimension_type space_dimension() const;
+
+ //! Inserts the index of variable \p v into the set.
+ void insert(Variable v);
+
+ // The `insert' method above overloads (instead of hiding) the
+ // other `insert' method of std::set.
+ using Base::insert;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+};
+
+/* Automatically generated from PPL source file ../src/Variables_Set_inlines.hh line 1. */
+/* Variables_Set class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variables_Set_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+ : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+ insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable v)
+ : Base() {
+ insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+ return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+ reverse_iterator i = rbegin();
+ return (i == rend()) ? 0 : (*i + 1);
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+ // We assume sets are implemented by means of red-black trees that
+ // require to store the color (we assume an enum) and three pointers
+ // to the parent, left and right child, respectively.
+ enum color { red, black };
+ return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 106. */
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 1. */
+/* Dense_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Dense_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Dense_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 30. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Sparse_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 33. */
+#include <memory>
+#include <vector>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Dense_Row {
+public:
+ class iterator;
+ class const_iterator;
+
+ //! Constructs an empty row.
+ Dense_Row();
+
+ explicit Dense_Row(const Sparse_Row& row);
+
+ //! Tight constructor: resizing may require reallocation.
+ /*!
+ Constructs a row with size and capacity \p sz.
+ */
+ Dense_Row(dimension_type sz);
+
+ //! Sizing constructor with capacity.
+ /*!
+ \param sz
+ The size of the row that will be constructed;
+
+ \param capacity
+ The capacity of the row that will be constructed;
+
+ The row that is constructed has storage for \p capacity elements,
+ \p sz of which are default-constructed now.
+ */
+ Dense_Row(dimension_type sz, dimension_type capacity);
+
+ //! Ordinary copy constructor.
+ Dense_Row(const Dense_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Dense_Row(const Dense_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Dense_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity from a Sparse_Row.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Dense_Row();
+
+ //! Assignment operator.
+ Dense_Row& operator=(const Dense_Row& y);
+
+ //! Assignment operator.
+ Dense_Row& operator=(const Sparse_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Dense_Row& y);
+
+ //! Resizes the row to \p sz.
+ void resize(dimension_type sz);
+
+ //! Resizes the row to \p sz, with capacity \p capacity.
+ void resize(dimension_type sz, dimension_type capacity);
+
+ //! Resets all the elements of this row.
+ void clear();
+
+ //! Adds \p n zeroes before index \p i.
+ /*!
+ \param n
+ The number of zeroes that will be added to the row.
+
+ \param i
+ The index of the element before which the zeroes will be added.
+
+ Existing elements with index greater than or equal to \p i are shifted
+ to the right by \p n positions. The size is increased by \p n.
+
+ Existing iterators are invalidated.
+ */
+ void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+ //! Expands the row to size \p new_size.
+ /*!
+ Adds new positions to the implementation of the row
+ obtaining a new row with size \p new_size.
+ It is assumed that \p new_size is between the current size
+ and capacity of the row.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ Destroys elements of the row implementation
+ from position \p new_size to the end.
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Returns the size() of the largest possible Dense_Row.
+ static dimension_type max_size();
+
+ //! Gives the number of coefficients currently in use.
+ dimension_type size() const;
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the element of the row indexed by \p k.
+ Coefficient& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of the row indexed by \p k.
+ Coefficient_traits::const_reference operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of
+ the row and normalizes them by the GCD itself.
+ */
+ void normalize();
+
+ //! Swaps the i-th element with the j-th element.
+ //! Provided for compatibility with Sparse_Row
+ void swap_coefficients(dimension_type i, dimension_type j);
+
+ //! Swaps the element pointed to by i with the element pointed to by j.
+ //! Provided for compatibility with Sparse_Row
+ void swap_coefficients(iterator i, iterator j);
+
+ iterator begin();
+ const_iterator begin() const;
+
+ iterator end();
+ const_iterator end() const;
+
+ //! Resets the i-th element to 0.
+ //! Provided for compatibility with Sparse_Row
+ void reset(dimension_type i);
+
+ //! Resets the elements [first,last) to 0.
+ //! Provided for compatibility with Sparse_Row
+ void reset(dimension_type first, dimension_type last);
+
+ //! Resets the element pointed to by itr to 0.
+ //! Provided for compatibility with Sparse_Row.
+ iterator reset(iterator itr);
+
+ //! Gets the i-th element.
+ //! Provided for compatibility with Sparse_Row.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator find(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator find(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator find(iterator itr, dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator find(const_iterator itr, dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator lower_bound(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator lower_bound(dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator lower_bound(iterator itr, dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(dimension_type i);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x);
+
+ //! Provided for compatibility with Sparse_Row.
+ iterator insert(iterator itr, dimension_type i);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_second
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_first(const Dense_Row& y,
+ const Func1& f, const Func2& g);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, 0) must do nothing, for every c1.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_second(const Dense_Row& y,
+ const Func1& g, const Func2& h);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ */
+ template <typename Func1, typename Func2, typename Func3>
+ void combine(const Dense_Row& y,
+ const Func1& f, const Func2& g, const Func3& h);
+
+ //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+ //! each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param coeff1
+ The coefficient used for elements of *this.
+ It must not be 0.
+
+ \param coeff2
+ The coefficient used for elements of y.
+ It must not be 0.
+
+ This method takes \f$O(n)\f$ time.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ \see combine
+ */
+ void linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ /*!
+ This method detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+
+ coeff1 and coeff2 must not be 0.
+ */
+ void linear_combine(const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns the total size in bytes of the memory occupied by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ /*! \brief
+ Returns the size in bytes of the memory managed by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ /*! \brief
+ Checks if all the invariants are satisfied and that the actual
+ size matches the value provided as argument.
+ */
+ bool OK(dimension_type row_size) const;
+
+private:
+ void init(const Sparse_Row& row);
+
+ void destroy();
+
+ struct Impl {
+
+ Impl();
+
+ ~Impl();
+
+ //! The number of coefficients in the row.
+ dimension_type size;
+
+ //! The capacity of the row.
+ dimension_type capacity;
+
+ //! The allocator used to allocate/deallocate vec.
+ std::allocator<Coefficient> coeff_allocator;
+
+ //! The vector of coefficients.
+ //! An empty vector may be stored as NULL instead of using a valid pointer.
+ Coefficient* vec;
+ };
+
+ Impl impl;
+
+ //! Returns the capacity of the row.
+ dimension_type capacity() const;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::iterator {
+public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef value_type& reference;
+
+ iterator();
+ iterator(Dense_Row& row1, dimension_type i1);
+
+ Coefficient& operator*();
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+ equivalent to *itr.
+
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ iterator& operator++();
+ iterator operator++(int);
+
+ iterator& operator--();
+ iterator operator--(int);
+
+ bool operator==(const iterator& x) const;
+ bool operator!=(const iterator& x) const;
+
+ operator const_iterator() const;
+
+ bool OK() const;
+
+private:
+ Dense_Row* row;
+ dimension_type i;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::const_iterator {
+public:
+
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ const_iterator();
+ const_iterator(const Dense_Row& row1, dimension_type i1);
+
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+ equivalent to *itr.
+
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ const_iterator& operator++();
+ const_iterator operator++(int);
+
+ const_iterator& operator--();
+ const_iterator operator--(int);
+
+ bool operator==(const const_iterator& x) const;
+ bool operator!=(const const_iterator& x) const;
+
+ bool OK() const;
+
+private:
+ const Dense_Row* row;
+ dimension_type i;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Dense_Row& x, Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Dense_Row>::iterator x,
+ std::vector<Dense_Row>::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_inlines.hh line 1. */
+/* Dense_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Dense_Row_inlines.hh line 28. */
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Dense_Row::Impl::Impl()
+ : size(0), capacity(0), coeff_allocator(), vec(0) {
+}
+
+inline
+Dense_Row::Impl::~Impl() {
+ while (size != 0) {
+ --size;
+ vec[size].~Coefficient();
+ }
+ coeff_allocator.deallocate(vec, capacity);
+}
+
+inline dimension_type
+Dense_Row::max_size() {
+ return std::numeric_limits<size_t>::max() / sizeof(Coefficient);
+}
+
+inline dimension_type
+Dense_Row::size() const {
+ return impl.size;
+}
+
+inline dimension_type
+Dense_Row::capacity() const {
+ return impl.capacity;
+}
+
+inline
+Dense_Row::Dense_Row()
+ : impl() {
+
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz,
+ const dimension_type capacity)
+ : impl() {
+
+ resize(sz, capacity);
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz)
+ : impl() {
+
+ resize(sz);
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y)
+ : impl() {
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ if (y.impl.vec != 0) {
+ impl.capacity = y.capacity();
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+ while (impl.size != y.size()) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ }
+ PPL_ASSERT(size() == y.size());
+ PPL_ASSERT(capacity() == y.capacity());
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+ const dimension_type capacity)
+ : impl() {
+ PPL_ASSERT(y.size() <= capacity);
+ PPL_ASSERT(capacity <= max_size());
+
+ impl.capacity = capacity;
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+ if (y.impl.vec != 0) {
+ while (impl.size != y.size()) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ }
+
+ PPL_ASSERT(size() == y.size());
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : impl() {
+ PPL_ASSERT(sz <= capacity);
+ PPL_ASSERT(capacity <= max_size());
+ PPL_ASSERT(capacity != 0);
+
+ impl.capacity = capacity;
+ impl.coeff_allocator = y.impl.coeff_allocator;
+ impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+ const dimension_type n = std::min(sz, y.size());
+ while (impl.size != n) {
+ new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+ ++impl.size;
+ }
+ while (impl.size != sz) {
+ new (&impl.vec[impl.size]) Coefficient();
+ ++impl.size;
+ }
+
+ PPL_ASSERT(size() == sz);
+ PPL_ASSERT(impl.capacity == capacity);
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::~Dense_Row() {
+ // The `impl' field will be destroyed automatically.
+}
+
+inline void
+Dense_Row::destroy() {
+ resize(0);
+ impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+}
+
+inline void
+Dense_Row::m_swap(Dense_Row& y) {
+ using std::swap;
+ swap(impl.size, y.impl.size);
+ swap(impl.capacity, y.impl.capacity);
+ swap(impl.coeff_allocator, y.impl.coeff_allocator);
+ swap(impl.vec, y.impl.vec);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+inline Dense_Row&
+Dense_Row::operator=(const Dense_Row& y) {
+
+ if (this != &y && size() == y.size()) {
+ // Avoid reallocation.
+
+ for (dimension_type i = size(); i-- > 0; )
+ (*this)[i] = y[i];
+
+ return *this;
+ }
+
+ Dense_Row x(y);
+ swap(*this, x);
+
+ return *this;
+}
+
+inline Coefficient&
+Dense_Row::operator[](const dimension_type k) {
+ PPL_ASSERT(impl.vec != 0);
+ PPL_ASSERT(k < size());
+ return impl.vec[k];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::operator[](const dimension_type k) const {
+ PPL_ASSERT(impl.vec != 0);
+ PPL_ASSERT(k < size());
+ return impl.vec[k];
+}
+
+inline void
+Dense_Row::swap_coefficients(dimension_type i, dimension_type j) {
+ std::swap((*this)[i], (*this)[j]);
+}
+
+inline void
+Dense_Row::swap_coefficients(iterator i, iterator j) {
+ std::swap(*i, *j);
+}
+
+inline void
+Dense_Row::reset(dimension_type i) {
+ (*this)[i] = 0;
+}
+
+inline Dense_Row::iterator
+Dense_Row::reset(iterator itr) {
+ *itr = 0;
+ ++itr;
+ return itr;
+}
+
+inline Dense_Row::iterator
+Dense_Row::begin() {
+ return iterator(*this, 0);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::begin() const {
+ return const_iterator(*this, 0);
+}
+
+inline Dense_Row::iterator
+Dense_Row::end() {
+ return iterator(*this, size());
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::end() const {
+ return const_iterator(*this, size());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::get(dimension_type i) const {
+ return (*this)[i];
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(dimension_type i) {
+ return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(dimension_type i) const {
+ return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(iterator itr, dimension_type i) {
+ (void)itr;
+ return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(const_iterator itr, dimension_type i) const {
+ (void)itr;
+ return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(dimension_type i) {
+ return find(i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(dimension_type i) const {
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(iterator itr, dimension_type i) {
+ return find(itr, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(const_iterator itr, dimension_type i) const {
+ return find(itr, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i,
+ Coefficient_traits::const_reference x) {
+ (*this)[i] = x;
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i) {
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x) {
+ (void)itr;
+ (*this)[i] = x;
+ return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i) {
+ (void)itr;
+ return find(i);
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+/*! \relates Dense_Row */
+inline bool
+operator!=(const Dense_Row& x, const Dense_Row& y) {
+ return !(x == y);
+}
+
+
+inline
+Dense_Row::iterator::iterator()
+ : row(NULL), i(0) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::iterator::iterator(Dense_Row& row1,dimension_type i1)
+ : row(&row1), i(i1) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient&
+Dense_Row::iterator::operator*() {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::iterator::operator*() const {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::iterator::index() const {
+ return i;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator++() {
+ PPL_ASSERT(i < row->size());
+ ++i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator++(int) {
+ iterator tmp(*this);
+ ++(*this);
+ return tmp;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator--() {
+ PPL_ASSERT(i > 0);
+ --i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator--(int) {
+ iterator tmp(*this);
+ --(*this);
+ return tmp;
+}
+
+inline bool
+Dense_Row::iterator::operator==(const iterator& x) const {
+ return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::iterator::operator!=(const iterator& x) const {
+ return !(*this == x);
+}
+
+inline
+Dense_Row::iterator::operator const_iterator() const {
+ return const_iterator(*row, i);
+}
+
+inline bool
+Dense_Row::iterator::OK() const {
+ if (row == NULL)
+ return true;
+ // i can be equal to row.size() for past-the-end iterators
+ return (i <= row->size());
+}
+
+
+inline
+Dense_Row::const_iterator::const_iterator()
+ : row(NULL), i(0) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::const_iterator::const_iterator(const Dense_Row& row1,
+ dimension_type i1)
+ : row(&row1), i(i1) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::const_iterator::operator*() const {
+ PPL_ASSERT(i < row->size());
+ return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::const_iterator::index() const {
+ return i;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator++() {
+ PPL_ASSERT(i < row->size());
+ ++i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator++(int) {
+ const_iterator tmp(*this);
+ ++(*this);
+ return tmp;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator--() {
+ PPL_ASSERT(i > 0);
+ --i;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator--(int) {
+ const_iterator tmp(*this);
+ --(*this);
+ return tmp;
+}
+
+inline bool
+Dense_Row::const_iterator::operator==(const const_iterator& x) const {
+ return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::const_iterator::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+inline bool
+Dense_Row::const_iterator::OK() const {
+ if (row == NULL)
+ return true;
+ // i can be equal to row.size() for past-the-end iterators
+ return (i <= row->size());
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2) {
+ x.linear_combine(y, coeff1, coeff2);
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ x.linear_combine(y, c1, c2, start, end);
+}
+
+/*! \relates Dense_Row */
+inline void
+swap(Dense_Row& x, Dense_Row& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Dense_Row */
+inline void
+iter_swap(std::vector<Dense_Row>::iterator x,
+ std::vector<Dense_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_templates.hh line 1. */
+/* Dense_Row class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_first(const Dense_Row& y, const Func1& /* f */,
+ const Func2& g) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_second(const Dense_Row& y, const Func1& g,
+ const Func2& /* h */) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Dense_Row::combine(const Dense_Row& y, const Func1& /* f */, const Func2& g,
+ const Func3& /* h */) {
+ for (dimension_type i = size(); i-- > 0; )
+ g((*this)[i], y[i]);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 560. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 1. */
+/* Sparse_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 1. */
+/* CO_Tree class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/CO_Tree_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class CO_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 30. */
+#include <memory>
+
+#ifndef PPL_CO_TREE_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+ \brief
+ Enables extra debugging information for class CO_Tree.
+
+ \ingroup PPL_CXX_interface
+ When <CODE>PPL_CO_TREE_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+ each CO_Tree iterator and const_iterator carries a pointer to the associated
+ tree; this enables extra consistency checks to be performed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_CO_TREE_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_CO_TREE_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_CO_TREE_EXTRA_DEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A cache-oblivious binary search tree of pairs.
+/*! \ingroup PPL_CXX_interface
+ This class implements a binary search tree with keys of dimension_type type
+ and data of Coefficient type, laid out in a dynamically-sized array.
+
+ The array-based layout saves calls to new/delete (to insert \f$n\f$ elements
+ only \f$O(\log n)\f$ allocations are performed) and, more importantly, is
+ much more cache-friendly than a standard (pointer-based) tree, because the
+ elements are stored sequentially in memory (leaving some holes to allow
+ fast insertion of new elements).
+ The downside of this representation is that all iterators are invalidated
+ when an element is added or removed, because the array could have been
+ enlarged or shrunk. This is partially addressed by providing references to
+ internal end iterators that are updated when needed.
+
+ B-trees are cache-friendly too, but the cache size is fixed (usually at
+ compile-time). This raises two problems: firstly the cache size must be
+ known in advance and those data structures do not perform well with other
+ cache sizes and, secondly, even if the cache size is known, the
+ optimizations target only one level of cache. This kind of data structures
+ are called cache aware. This implementation, instead, is cache oblivious:
+ it performs well with every cache size, and thus exploits all of the
+ available caches.
+
+ Assuming \p n is the number of elements in the tree and \p B is the number
+ of (dimension_type, Coefficient) pairs that fit in a cache line, the
+ time and cache misses complexities are the following:
+
+ - Insertions/Queries/Deletions: \f$O(\log^2 n)\f$ time,
+ \f$O(\log \frac{n}{B}))\f$ cache misses.
+ - Tree traversal from begin() to end(), using an %iterator: \f$O(n)\f$ time,
+ \f$O(\frac{n}{B})\f$ cache misses.
+ - Queries with a hint: \f$O(\log k)\f$ time and \f$O(\log \frac{k}{B})\f$
+ cache misses, where k is the distance between the given %iterator and the
+ searched element (or the position where it would have been).
+
+ The binary search tree is embedded in a (slightly bigger) complete tree,
+ that is enlarged and shrunk when needed. The complete tree is laid out
+ in an in-order DFS layout in two arrays: one for the keys and one for the
+ associated data.
+ The indexes and values are stored in different arrays to reduce
+ cache-misses during key queries.
+
+ The tree can store up to \f$(-(dimension_type)1)/100\f$ elements.
+ This limit allows faster density computations, but can be removed if needed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class CO_Tree {
+
+public:
+ class const_iterator;
+ class iterator;
+
+private:
+ //! This is used for node heights and depths in the tree.
+ typedef unsigned height_t;
+
+ PPL_COMPILE_TIME_CHECK(C_Integer<height_t>::max
+ >= sizeof_to_bits(sizeof(dimension_type)),
+ "height_t is too small to store depths.");
+
+ class tree_iterator;
+
+ // This must be declared here, because it is a friend of const_iterator.
+ //! Returns the index of the current element in the DFS layout of the
+ //! complete tree.
+ /*!
+ \return the index of the current element in the DFS layout of the complete
+ tree.
+
+ \param itr the iterator that points to the desired element.
+ */
+ dimension_type dfs_index(const_iterator itr) const;
+
+ // This must be declared here, because it is a friend of iterator.
+ //! Returns the index of the current element in the DFS layout of the
+ //! complete tree.
+ /*!
+ \return the index of the current element in the DFS layout of the complete
+ tree.
+
+ \param itr the iterator that points to the desired element.
+ */
+ dimension_type dfs_index(iterator itr) const;
+
+public:
+
+ //! The type of the data elements associated with keys.
+ /*!
+ If this is changed, occurrences of Coefficient_zero() in the CO_Tree
+ implementation have to be replaced with constants of the correct type.
+ */
+ typedef Coefficient data_type;
+ typedef Coefficient_traits::const_reference data_type_const_reference;
+
+ //! A const %iterator on the tree elements, ordered by key.
+ /*!
+ Iterator increment and decrement operations are \f$O(1)\f$ time.
+ These iterators are invalidated by operations that add or remove elements
+ from the tree.
+ */
+ class const_iterator {
+ private:
+ public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const data_type value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef data_type_const_reference reference;
+
+ //! Constructs an invalid const_iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator();
+
+ //! Constructs an %iterator pointing to the first element of the tree.
+ /*!
+ \param tree
+ The tree that the new %iterator will point to.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator(const CO_Tree& tree);
+
+ //! Constructs a const_iterator pointing to the i-th node of the tree.
+ /*!
+ \param tree
+ The tree that the new %iterator will point to.
+
+ \param i
+ The index of the element in \p tree to which the %iterator will point
+ to.
+
+ The i-th node must be a node with a value or end().
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const CO_Tree& tree, dimension_type i);
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const const_iterator& itr);
+
+ //! Converts an iterator into a const_iterator.
+ /*!
+ \param itr
+ The iterator that will be converted into a const_iterator.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const iterator& itr);
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const iterator& itr);
+
+ //! Navigates to the next element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator++();
+
+ //! Navigates to the previous element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator--();
+
+ //! Navigates to the next element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator operator++(int);
+
+ //! Navigates to the previous element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator operator--(int);
+
+ //! Returns the current element.
+ data_type_const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& x) const;
+
+ private:
+ //! Checks the internal invariants, in debug mode only.
+ bool OK() const;
+
+ //! A pointer to the corresponding element of the tree's indexes[] array.
+ const dimension_type* current_index;
+
+ //! A pointer to the corresponding element of the tree's data[] array.
+ const data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+ //! A pointer to the corresponding tree, used for debug purposes only.
+ const CO_Tree* tree;
+#endif
+
+ friend dimension_type CO_Tree::dfs_index(const_iterator itr) const;
+ };
+
+ //! An %iterator on the tree elements, ordered by key.
+ /*!
+ Iterator increment and decrement operations are \f$O(1)\f$ time.
+ These iterators are invalidated by operations that add or remove elements
+ from the tree.
+ */
+ class iterator {
+ public:
+
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef data_type value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef value_type& reference;
+
+ //! Constructs an invalid iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator();
+
+ //! Constructs an %iterator pointing to first element of the tree.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit iterator(CO_Tree& tree);
+
+ //! Constructs an %iterator pointing to the i-th node.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+
+ \param i
+ The index of the element in \p tree to which the new %iterator will
+ point to.
+
+ The i-th node must be a node with a value or end().
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator(CO_Tree& tree, dimension_type i);
+
+ //! The constructor from a tree_iterator.
+ /*!
+ \param itr
+ The tree_iterator that will be converted into an iterator.
+
+ This is meant for use by CO_Tree only.
+ This is not private to avoid the friend declaration.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit iterator(const tree_iterator& itr);
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ iterator(const iterator& itr);
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator=(const iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator=(const tree_iterator& itr);
+
+ //! Navigates to the next element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator++();
+
+ //! Navigates to the previous element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator& operator--();
+
+ //! Navigates to the next element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator operator++(int);
+
+ //! Navigates to the previous element in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator operator--(int);
+
+ //! Returns the current element.
+ data_type& operator*();
+
+ //! Returns the current element.
+ data_type_const_reference operator*() const;
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const iterator& x) const;
+
+ private:
+ //! Checks the internal invariants, in debug mode only.
+ bool OK() const;
+
+ //! A pointer to the corresponding element of the tree's indexes[] array.
+ const dimension_type* current_index;
+
+ //! A pointer to the corresponding element of the tree's data[] array.
+ data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+ //! A pointer to the corresponding tree, used for debug purposes only.
+ CO_Tree* tree;
+#endif
+
+ friend const_iterator& const_iterator::operator=(const iterator&);
+ friend dimension_type CO_Tree::dfs_index(iterator itr) const;
+ };
+
+ //! Constructs an empty tree.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ CO_Tree();
+
+ //! The copy constructor.
+ /*!
+ \param y
+ The tree that will be copied.
+
+ This constructor takes \f$O(n)\f$ time.
+ */
+ CO_Tree(const CO_Tree& y);
+
+ //! A constructor from a sequence of \p n elements.
+ /*!
+ \param i
+ An iterator that points to the first element of the sequence.
+
+ \param n
+ The number of elements in the [i, i_end) sequence.
+
+ i must be an input iterator on a sequence of data_type elements,
+ sorted by index.
+ Objects of Iterator type must have an index() method that returns the
+ index with which the element pointed to by the iterator must be inserted.
+
+ This constructor takes \f$O(n)\f$ time, so it is more efficient than
+ the construction of an empty tree followed by n insertions, that would
+ take \f$O(n*\log^2 n)\f$ time.
+ */
+ template <typename Iterator>
+ CO_Tree(Iterator i, dimension_type n);
+
+ //! The assignment operator.
+ /*!
+ \param y
+ The tree that will be assigned to *this.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ CO_Tree& operator=(const CO_Tree& y);
+
+ //! Removes all elements from the tree.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ void clear();
+
+ //! The destructor.
+ /*!
+ This destructor takes \f$O(n)\f$ time.
+ */
+ ~CO_Tree();
+
+ //! Returns \p true if the tree has no elements.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool empty() const;
+
+ //! Returns the number of elements stored in the tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type size() const;
+
+ //! Returns the size() of the largest possible CO_Tree.
+ static dimension_type max_size();
+
+ //! Dumps the tree to stdout, for debugging purposes.
+ void dump_tree() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ dimension_type external_memory_in_bytes() const;
+
+ //! Inserts an element in the tree.
+ /*!
+ \returns
+ An %iterator that points to the inserted pair.
+
+ \param key
+ The key that will be inserted into the tree, associated with the default
+ data.
+
+ If such a pair already exists, an %iterator pointing to that pair is
+ returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(dimension_type key);
+
+ //! Inserts an element in the tree.
+ /*!
+ \returns
+ An %iterator that points to the inserted element.
+
+ \param key
+ The key that will be inserted into the tree..
+
+ \param data
+ The data that will be inserted into the tree.
+
+ If an element with the specified key already exists, its associated data
+ is set to \p data and an %iterator pointing to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.amortized
+ */
+ iterator insert(dimension_type key, data_type_const_reference data);
+
+ //! Inserts an element in the tree.
+ /*!
+ \return
+ An %iterator that points to the inserted element.
+
+ \param itr
+ The %iterator used as hint
+
+ \param key
+ The key that will be inserted into the tree, associated with the default
+ data.
+
+ This will be faster if \p itr points near to the place where the new
+ element will be inserted (or where is already stored).
+ However, the value of \p itr does not affect the result of this
+ method, as long it is a valid %iterator for this tree. \p itr may even be
+ end().
+
+ If an element with the specified key already exists, an %iterator pointing
+ to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(iterator itr, dimension_type key);
+
+ //! Inserts an element in the tree.
+ /*!
+ \return
+ An iterator that points to the inserted element.
+
+ \param itr
+ The iterator used as hint
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be inserted into the tree.
+
+ This will be faster if \p itr points near to the place where the new
+ element will be inserted (or where is already stored).
+ However, the value of \p itr does not affect the result of this
+ method, as long it is a valid iterator for this tree. \p itr may even be
+ end().
+
+ If an element with the specified key already exists, its associated data
+ is set to \p data and an iterator pointing to that pair is returned.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists,
+ and \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator insert(iterator itr, dimension_type key,
+ data_type_const_reference data);
+
+ //! Erases the element with key \p key from the tree.
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns an iterator to the next element (or end() if there are no
+ elements with key greater than \p key ).
+
+ \param key
+ The key of the element that will be erased from the tree.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists,
+ and \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator erase(dimension_type key);
+
+ //! Erases the element pointed to by \p itr from the tree.
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns an iterator to the next element (or end() if there are no
+ elements with key greater than \p key ).
+
+ \param itr
+ An iterator pointing to the element that will be erased from the tree.
+
+ This method takes \f$O(\log n)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ iterator erase(iterator itr);
+
+ /*!
+ \brief Removes the element with key \p key (if it exists) and decrements
+ by 1 all elements' keys that were greater than \p key.
+
+ \param key
+ The key of the element that will be erased from the tree.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k+\log^2 n)\f$ expected time, where k is the number
+ of elements with keys greater than \p key.
+ */
+ void erase_element_and_shift_left(dimension_type key);
+
+ //! Adds \p n to all keys greater than or equal to \p key.
+ /*!
+ \param key
+ The key of the first element whose key will be increased.
+
+ \param n
+ Specifies how much the keys will be increased.
+
+ This method takes \f$O(k+\log n)\f$ expected time, where k is the number
+ of elements with keys greater than or equal to \p key.
+ */
+ void increase_keys_from(dimension_type key, dimension_type n);
+
+ //! Sets to \p i the key of *itr. Assumes that i<=itr.index() and that there
+ //! are no elements with keys in [i,itr.index()).
+ /*!
+ All existing iterators remain valid.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void fast_shift(dimension_type i, iterator itr);
+
+ //! Swaps x with *this.
+ /*!
+ \param x
+ The tree that will be swapped with *this.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(CO_Tree& x);
+
+ //! Returns an iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const iterator& end();
+
+ //! Equivalent to cbegin().
+ const_iterator begin() const;
+
+ //! Equivalent to cend().
+ const const_iterator& end() const;
+
+ //! Returns a const_iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator cbegin() const;
+
+ //! Returns a const_iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const const_iterator& cend() const;
+
+ //! Searches an element with key \p key using bisection.
+ /*!
+ \param key
+ The key that will be searched for.
+
+ If the element is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator bisect(dimension_type key);
+
+ //! Searches an element with key \p key using bisection.
+ /*!
+ \param key
+ The key that will be searched for.
+
+ If the element is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator bisect(dimension_type key) const;
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ An %iterator pointing to the first element in the range.
+ It must not be end().
+
+ \param last
+ An %iterator pointing to the last element in the range.
+ Note that this is included in the search.
+ It must not be end().
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the specified key is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log(last - first + 1))\f$ time.
+ */
+ iterator bisect_in(iterator first, iterator last, dimension_type key);
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ An %iterator pointing to the first element in the range.
+ It must not be end().
+
+ \param last
+ An %iterator pointing to the last element in the range.
+ Note that this is included in the search.
+ It must not be end().
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the specified key is found, an %iterator pointing to that element is
+ returned; otherwise, the returned %iterator refers to the immediately
+ preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ This method takes \f$O(\log(last - first + 1))\f$ time.
+ */
+ const_iterator bisect_in(const_iterator first, const_iterator last,
+ dimension_type key) const;
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An %iterator used as a hint.
+
+ \param key
+ The key that will be searched for.
+
+ If the element is found, the returned %iterator points to that element;
+ otherwise, it points to the immediately preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this tree. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ iterator bisect_near(iterator hint, dimension_type key);
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An %iterator used as a hint.
+
+ \param key
+ The key that will be searched for.
+
+ If the element is found, the returned %iterator points to that element;
+ otherwise, it points to the immediately preceding or succeeding value.
+ If the tree is empty, end() is returned.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this tree. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ const_iterator bisect_near(const_iterator hint, dimension_type key) const;
+
+private:
+
+ //! Searches an element with key \p key in [first, last] using bisection.
+ /*!
+ \param first
+ The index of the first element in the range.
+ It must be the index of an element with a value.
+
+ \param last
+ The index of the last element in the range.
+ It must be the index of an element with a value.
+ Note that this is included in the search.
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the element is found, the index of that element is returned; otherwise,
+ the returned index refers to the immediately preceding or succeeding
+ value.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ dimension_type bisect_in(dimension_type first, dimension_type last,
+ dimension_type key) const;
+
+ //! Searches an element with key \p key near \p hint.
+ /*!
+ \param hint
+ An index used as a hint.
+ It must be the index of an element with a value.
+
+ \param key
+ The key that will be searched for.
+
+ \return
+ If the element is found, the index of that element is returned; otherwise,
+ the returned index refers to the immediately preceding or succeeding
+ value.
+
+ This uses a binary progression and then a bisection, so this method is
+ \f$O(\log n)\f$, and it is \f$O(1)\f$ if the distance between the returned
+ position and \p hint is \f$O(1)\f$.
+
+ This method takes \f$O(\log n)\f$ time. If the distance between the
+ returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+ */
+ dimension_type bisect_near(dimension_type hint, dimension_type key) const;
+
+ //! Inserts an element in the tree.
+ /*!
+ If there is already an element with key \p key in the tree, its
+ associated data is set to \p data.
+
+ This operation invalidates existing iterators.
+
+ \return
+ An %iterator that points to the inserted element.
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be associated with \p key.
+
+ \param itr
+ It must point to the element in the tree with key \p key or, if no such
+ element exists, it must point to the node that would be his parent.
+
+ This method takes \f$O(1)\f$ time if the element already exists, and
+ \f$O(\log^2 n)\f$ amortized time otherwise.
+ */
+ tree_iterator insert_precise(dimension_type key,
+ data_type_const_reference data,
+ tree_iterator itr);
+
+ //! Helper for \c insert_precise.
+ /*!
+ This helper method takes the same arguments as \c insert_precise,
+ but besides assuming that \p itr is a correct hint, it also assumes
+ that \p key and \p data are not in the tree; namely, a proper
+ insertion has to be done and the insertion can not invalidate \p data.
+ */
+ tree_iterator insert_precise_aux(dimension_type key,
+ data_type_const_reference data,
+ tree_iterator itr);
+
+ //! Inserts an element in the tree.
+ /*!
+
+ \param key
+ The key that will be inserted into the tree.
+
+ \param data
+ The data that will be associated with \p key.
+
+ The tree must be empty.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void insert_in_empty_tree(dimension_type key,
+ data_type_const_reference data);
+
+ //! Erases from the tree the element pointed to by \p itr .
+ /*!
+ This operation invalidates existing iterators.
+
+ \returns
+ An %iterator to the next element (or end() if there are no elements with
+ key greater than \p key ).
+
+ \param itr
+ An %iterator pointing to the element that will be erased.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator erase(tree_iterator itr);
+
+ //! Initializes a tree with reserved size at least \p n .
+ /*!
+ \param n
+ A lower bound on the tree's desired reserved size.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void init(dimension_type n);
+
+ //! Deallocates the tree's dynamic arrays.
+ /*!
+ After this call, the tree fields are uninitialized, so init() must be
+ called again before using the tree.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void destroy();
+
+ //! Checks the internal invariants, but not the densities.
+ bool structure_OK() const;
+
+ //! Checks the internal invariants.
+ bool OK() const;
+
+ //! Returns the floor of the base-2 logarithm of \p n .
+ /*!
+ \param n
+ It must be greater than zero.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ static unsigned integer_log2(dimension_type n);
+
+ //! Compares the fractions numer/denom with ratio/100.
+ /*!
+ \returns Returns true if the fraction numer/denom is less
+ than the fraction ratio/100.
+
+ \param ratio
+ It must be less than or equal to 100.
+
+ \param numer
+ The numerator of the fraction.
+
+ \param denom
+ The denominator of the fraction.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static bool is_less_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio);
+
+ //! Compares the fractions numer/denom with ratio/100.
+ /*!
+ \returns
+ Returns true if the fraction numer/denom is greater than the fraction
+ ratio/100.
+
+ \param ratio
+ It must be less than or equal to 100.
+
+ \param numer
+ The numerator of the fraction.
+
+ \param denom
+ The denominator of the fraction.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static bool is_greater_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio);
+
+ //! Dumps the subtree rooted at \p itr to stdout, for debugging purposes.
+ /*!
+ \param itr
+ A tree_iterator pointing to the root of the desired subtree.
+ */
+ static void dump_subtree(tree_iterator itr);
+
+ //! Increases the tree's reserved size.
+ /*!
+ This is called when the density is about to exceed the maximum density
+ (specified by max_density_percent).
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void rebuild_bigger_tree();
+
+ //! Decreases the tree's reserved size.
+ /*!
+ This is called when the density is about to become less than the minimum
+ allowed density (specified by min_density_percent).
+
+ \p reserved_size must be greater than 3 (otherwise the tree can just be
+ cleared).
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void rebuild_smaller_tree();
+
+ //! Re-initializes the cached iterators.
+ /*!
+ This method must be called when the indexes[] and data[] vector are
+ reallocated.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void refresh_cached_iterators();
+
+ //! Rebalances the tree.
+ /*!
+ For insertions, it adds the pair (key, value) in the process.
+
+ This operation invalidates existing iterators that point to nodes in the
+ rebalanced subtree.
+
+ \returns an %iterator pointing to the root of the subtree that was
+ rebalanced.
+
+ \param itr
+ It points to the node where the new element has to be inserted or where an
+ element has just been deleted.
+
+ \param key
+ The index that will be inserted in the tree (for insertions only).
+
+ \param value
+ The value that will be inserted in the tree (for insertions only).
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ tree_iterator rebalance(tree_iterator itr, dimension_type key,
+ data_type_const_reference value);
+
+ //! Moves all elements of a subtree to the rightmost end.
+ /*!
+ \returns
+ The index of the rightmost unused node in the subtree after the process.
+
+ \param last_in_subtree
+ It is the index of the last element in the subtree.
+
+ \param subtree_size
+ It is the number of valid elements in the subtree.
+ It must be greater than zero.
+
+ \param key
+ The key that may be added to the tree if add_element is \c true.
+
+ \param value
+ The value that may be added to the tree if add_element is \c true.
+
+ \param add_element
+ If it is true, it tries to add an element with key \p key and value
+ \p value in the process (but it may not).
+
+ This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+ */
+ dimension_type compact_elements_in_the_rightmost_end(
+ dimension_type last_in_subtree, dimension_type subtree_size,
+ dimension_type key, data_type_const_reference value,
+ bool add_element);
+
+ //! Redistributes the elements in the subtree rooted at \p root_index.
+ /*!
+ The subtree's elements must be compacted to the rightmost end.
+
+ \param root_index
+ The index of the subtree's root node.
+
+ \param subtree_size
+ It is the number of used elements in the subtree.
+ It must be greater than zero.
+
+ \param last_used
+ It points to the leftmost element with a value in the subtree.
+
+ \param add_element
+ If it is true, this method adds an element with the specified key and
+ value in the process.
+
+ \param key
+ The key that will be added to the tree if \p add_element is \c true.
+
+ \param value
+ The data that will be added to the tree if \p add_element is \c true.
+
+ This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+ */
+ void redistribute_elements_in_subtree(dimension_type root_index,
+ dimension_type subtree_size,
+ dimension_type last_used,
+ dimension_type key,
+ data_type_const_reference value,
+ bool add_element);
+
+ //! Moves all data in the tree \p tree into *this.
+ /*!
+ \param tree
+ The tree from which the element will be moved into *this.
+
+ *this must be empty and big enough to contain all of tree's data without
+ exceeding max_density.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void move_data_from(CO_Tree& tree);
+
+ //! Copies all data in the tree \p tree into *this.
+ /*!
+ \param tree
+ The tree from which the element will be copied into *this.
+
+ *this must be empty and must have the same reserved size of \p tree.
+ this->OK() may return false before this method is called, but
+ this->structure_OK() must return true.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void copy_data_from(const CO_Tree& tree);
+
+ //! Counts the number of used elements in the subtree rooted at itr.
+ /*!
+ \param itr
+ An %iterator pointing to the root of the desired subtree.
+
+ This method takes \f$O(k)\f$ time, where k is the number of elements in
+ the subtree.
+ */
+ static dimension_type count_used_in_subtree(tree_iterator itr);
+
+ //! Moves the value of \p from in \p to .
+ /*!
+ \param from
+ It must be a valid value.
+
+ \param to
+ It must be a non-constructed chunk of memory.
+
+ After the move, \p from becomes a non-constructed chunk of memory and
+ \p to gets the value previously stored by \p from.
+
+ The implementation of this method assumes that data_type values do not
+ keep pointers to themselves nor to their fields.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ static void move_data_element(data_type& to, data_type& from);
+
+ //! The maximum density of used nodes.
+ /*!
+ This must be greater than or equal to 50 and lower than 100.
+ */
+ static const dimension_type max_density_percent = 91;
+
+ //! The minimum density of used nodes.
+ /*!
+ Must be strictly lower than the half of max_density_percent.
+ */
+ static const dimension_type min_density_percent = 38;
+
+ //! The minimum density at the leaves' depth.
+ /*!
+ Must be greater than zero and strictly lower than min_density_percent.
+
+ Increasing the value is safe but leads to time inefficiencies
+ (measured against ppl_lpsol on 24 August 2010), because it forces trees to
+ be more balanced, increasing the cost of rebalancing.
+ */
+ static const dimension_type min_leaf_density_percent = 1;
+
+ //! An index used as a marker for unused nodes in the tree.
+ /*!
+ This must not be used as a key.
+ */
+ static const dimension_type unused_index = C_Integer<dimension_type>::max;
+
+ //! The %iterator returned by end().
+ /*!
+ It is updated when needed, to keep it valid.
+ */
+ iterator cached_end;
+
+ //! The %iterator returned by the const version of end().
+ /*!
+ It is updated when needed, to keep it valid.
+ */
+ const_iterator cached_const_end;
+
+ //! The depth of the leaves in the complete tree.
+ height_t max_depth;
+
+ //! The vector that contains the keys in the tree.
+ /*!
+ If an element of this vector is \p unused_index , it means that that
+ element and the corresponding element of data[] are not used.
+
+ Its size is reserved_size + 2, because the first and the last elements
+ are used as markers for iterators.
+ */
+ dimension_type* indexes;
+
+ //! The allocator used to allocate/deallocate data.
+ std::allocator<data_type> data_allocator;
+
+ //! The vector that contains the data of the keys in the tree.
+ /*!
+ If index[i] is \p unused_index, data[i] is unused.
+ Otherwise, data[i] contains the data associated to the indexes[i] key.
+
+ Its size is reserved_size + 1, because the first element is not used (to
+ allow using the same index in both indexes[] and data[] instead of
+ adding 1 to access data[]).
+ */
+ data_type* data;
+
+ //! The number of nodes in the complete tree.
+ /*!
+ It is one less than a power of 2.
+ If this is 0, data and indexes are set to NULL.
+ */
+ dimension_type reserved_size;
+
+ //! The number of values stored in the tree.
+ dimension_type size_;
+};
+
+class CO_Tree::tree_iterator {
+
+public:
+
+ /*!
+ \brief Constructs a tree_iterator pointing at the root node of the
+ specified tree
+
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+ */
+ explicit tree_iterator(CO_Tree& tree);
+
+ //! Constructs a tree_iterator pointing at the specified node of the tree.
+ /*!
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+
+ \param i
+ The index of the element in \p tree to which the new %iterator will point
+ to.
+ */
+ tree_iterator(CO_Tree& tree, dimension_type i);
+
+ //! Constructs a tree_iterator from an iterator.
+ /*!
+ \param itr
+ The iterator that will be converted into a tree_iterator.
+ It must not be end().
+
+ \param tree
+ The tree to which the new %iterator will point to.
+ It must not be empty.
+ */
+ tree_iterator(const iterator& itr, CO_Tree& tree);
+
+ //! The assignment operator.
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+ */
+ tree_iterator& operator=(const tree_iterator& itr);
+
+ //! The assignment operator from an iterator.
+ /*!
+ \param itr
+ The iterator that will be assigned into *this.
+ */
+ tree_iterator& operator=(const iterator& itr);
+
+ //! Compares *this with \p itr.
+ /*!
+ \param itr
+ The %iterator that will compared with *this.
+ */
+ bool operator==(const tree_iterator& itr) const;
+
+ //! Compares *this with \p itr.
+ /*!
+ \param itr
+ The %iterator that will compared with *this.
+ */
+ bool operator!=(const tree_iterator& itr) const;
+
+ //! Makes the %iterator point to the root of \p tree.
+ /*!
+ The values of all fields (beside tree) are overwritten.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_root();
+
+ //! Makes the %iterator point to the left child of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_left_child();
+
+ //! Makes the %iterator point to the right child of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_right_child();
+
+ //! Makes the %iterator point to the parent of the current node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ void get_parent();
+
+ /*!
+ \brief Searches for an element with key \p key in the subtree rooted at
+ \p *this.
+
+ \param key
+ The searched for key.
+
+ After this method, *this points to the found node (if it exists) or to
+ the node that would be his parent (otherwise).
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ void go_down_searching_key(dimension_type key);
+
+ /*!
+ \brief Follows left children with a value, until it arrives at a leaf or at
+ a node with no value.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void follow_left_children_with_value();
+
+ /*!
+ \brief Follows right children with a value, until it arrives at a leaf or at
+ a node with no value.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void follow_right_children_with_value();
+
+ //! Returns true if the pointed node is the root node.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_root() const;
+
+ //! Returns true if the pointed node has a parent and is its right child.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_right_child() const;
+
+ //! Returns true if the pointed node is a leaf of the complete tree.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ bool is_leaf() const;
+
+ //! Returns the key and value of the current node.
+ data_type& operator*();
+
+ //! Returns the key and value of the current node.
+ Coefficient_traits::const_reference operator*() const;
+
+ //! Returns a reference to the index of the element pointed to by \c *this.
+ /*!
+ \returns a reference to the index of the element pointed to by \c *this.
+ */
+ dimension_type& index();
+
+ //! Returns the index of the element pointed to by \c *this.
+ /*!
+ \returns the index of the element pointed to by \c *this.
+ */
+ dimension_type index() const;
+
+ //! Returns the index of the node pointed to by \c *this.
+ /*!
+ \returns the key of the node pointed to by \c *this, or unused_index if
+ the current node does not contain a valid element.
+ */
+ dimension_type key() const;
+
+ //! The tree containing the element pointed to by this %iterator.
+ CO_Tree& tree;
+
+ /*!
+ \brief Returns the index of the current node in the DFS layout of the
+ complete tree.
+ */
+ dimension_type dfs_index() const;
+
+ /*!
+ \brief Returns 2^h, with h the height of the current node in the tree,
+ counting from 0.
+
+ Thus leaves have offset 1.
+ This is faster than depth(), so it is useful to compare node depths.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type get_offset() const;
+
+ //! Returns the depth of the current node in the complete tree.
+ /*!
+ This method takes \f$O(\log n)\f$ time.
+ */
+ height_t depth() const;
+
+private:
+ //! Checks the internal invariant.
+ bool OK() const;
+
+ //! The index of the current node in the DFS layout of the complete tree.
+ dimension_type i;
+
+ /*!
+ \brief This is 2^h, with h the height of the current node in the tree,
+ counting from 0.
+
+ Thus leaves have offset 1.
+ This is equal to (i & -i), and is only stored to increase performance.
+ */
+ dimension_type offset;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree& x, CO_Tree& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::const_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::iterator& x, CO_Tree::iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_inlines.hh line 1. */
+/* CO_Tree class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+CO_Tree::dfs_index(const_iterator itr) const {
+ PPL_ASSERT(itr.current_index != 0);
+ PPL_ASSERT(itr.current_index >= indexes + 1);
+ PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+ const ptrdiff_t index = itr.current_index - indexes;
+ return static_cast<dimension_type>(index);
+}
+
+inline dimension_type
+CO_Tree::dfs_index(iterator itr) const {
+ PPL_ASSERT(itr.current_index != 0);
+ PPL_ASSERT(itr.current_index >= indexes + 1);
+ PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+ const ptrdiff_t index = itr.current_index - indexes;
+ return static_cast<dimension_type>(index);
+}
+
+inline
+CO_Tree::CO_Tree() {
+ init(0);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::CO_Tree(const CO_Tree& y) {
+ PPL_ASSERT(y.OK());
+ data_allocator = y.data_allocator;
+ init(y.reserved_size);
+ copy_data_from(y);
+}
+
+inline CO_Tree&
+CO_Tree::operator=(const CO_Tree& y) {
+ if (this != &y) {
+ destroy();
+ data_allocator = y.data_allocator;
+ init(y.reserved_size);
+ copy_data_from(y);
+ }
+ return *this;
+}
+
+inline void
+CO_Tree::clear() {
+ *this = CO_Tree();
+}
+
+inline
+CO_Tree::~CO_Tree() {
+
+ destroy();
+}
+
+inline bool
+CO_Tree::empty() const {
+ return size_ == 0;
+}
+
+inline dimension_type
+CO_Tree::size() const {
+ return size_;
+}
+
+inline dimension_type
+CO_Tree::max_size() {
+ return C_Integer<dimension_type>::max/100;
+}
+
+inline void
+CO_Tree::dump_tree() const {
+ if (empty())
+ std::cout << "(empty tree)" << std::endl;
+ else
+ dump_subtree(tree_iterator(*const_cast<CO_Tree*>(this)));
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(const dimension_type key) {
+ if (empty())
+ return insert(key, Coefficient_zero());
+ else {
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+ if (itr.index() == key)
+ return iterator(itr);
+ else
+ return iterator(insert_precise(key, Coefficient_zero(), itr));
+ }
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(dimension_type key, data_type_const_reference data1) {
+ if (empty()) {
+ insert_in_empty_tree(key, data1);
+ tree_iterator itr(*this);
+ PPL_ASSERT(itr.index() != unused_index);
+ return iterator(itr);
+ }
+ else {
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+ return iterator(insert_precise(key, data1, itr));
+ }
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(dimension_type key) {
+ PPL_ASSERT(key != unused_index);
+
+ if (empty())
+ return end();
+
+ tree_iterator itr(*this);
+ itr.go_down_searching_key(key);
+
+ if (itr.index() == key)
+ return erase(itr);
+
+ iterator result(itr);
+ if (result.index() < key)
+ ++result;
+
+ PPL_ASSERT(result == end() || result.index() > key);
+#ifndef NDEBUG
+ iterator last = end();
+ --last;
+ PPL_ASSERT((result == end()) == (last.index() < key));
+#endif
+
+ return result;
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(iterator itr) {
+ PPL_ASSERT(itr != end());
+ return erase(tree_iterator(itr, *this));
+}
+
+inline void
+CO_Tree::m_swap(CO_Tree& x) {
+ using std::swap;
+ swap(max_depth, x.max_depth);
+ swap(indexes, x.indexes);
+ swap(data_allocator, x.data_allocator);
+ swap(data, x.data);
+ swap(reserved_size, x.reserved_size);
+ swap(size_, x.size_);
+ // Cached iterators have been invalidated by the swap,
+ // they must be refreshed here.
+ refresh_cached_iterators();
+ x.refresh_cached_iterators();
+ PPL_ASSERT(structure_OK());
+ PPL_ASSERT(x.structure_OK());
+}
+
+inline CO_Tree::iterator
+CO_Tree::begin() {
+ return iterator(*this);
+}
+
+inline const CO_Tree::iterator&
+CO_Tree::end() {
+ return cached_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::begin() const {
+ return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::end() const {
+ return cached_const_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::cbegin() const {
+ return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::cend() const {
+ return cached_const_end;
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect(dimension_type key) {
+ if (empty())
+ return end();
+ iterator last = end();
+ --last;
+ return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect(dimension_type key) const {
+ if (empty())
+ return end();
+ const_iterator last = end();
+ --last;
+ return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_in(iterator first, iterator last, dimension_type key) {
+ PPL_ASSERT(first != end());
+ PPL_ASSERT(last != end());
+ const dimension_type index
+ = bisect_in(dfs_index(first), dfs_index(last), key);
+ return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_in(const_iterator first, const_iterator last,
+ dimension_type key) const {
+ PPL_ASSERT(first != end());
+ PPL_ASSERT(last != end());
+ const dimension_type index
+ = bisect_in(dfs_index(first), dfs_index(last), key);
+ return const_iterator(*this, index);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_near(iterator hint, dimension_type key) {
+ if (hint == end())
+ return bisect(key);
+ const dimension_type index
+ = bisect_near(dfs_index(hint), key);
+ return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_near(const_iterator hint, dimension_type key) const {
+ if (hint == end())
+ return bisect(key);
+ const dimension_type index = bisect_near(dfs_index(hint), key);
+ return const_iterator(*this, index);
+}
+
+inline void
+CO_Tree::fast_shift(dimension_type i, iterator itr) {
+ PPL_ASSERT(itr != end());
+ PPL_ASSERT(i <= itr.index());
+ indexes[dfs_index(itr)] = i;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::insert_in_empty_tree(dimension_type key,
+ data_type_const_reference data1) {
+ PPL_ASSERT(empty());
+ rebuild_bigger_tree();
+ tree_iterator itr(*this);
+ PPL_ASSERT(itr.index() == unused_index);
+ new (&(*itr)) data_type(data1);
+ // Set the index afterwards, so that if the constructor above throws
+ // the tree's structure is consistent.
+ itr.index() = key;
+ ++size_;
+
+ PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::is_less_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio) {
+ PPL_ASSERT(ratio <= 100);
+ // If these are true, no overflows are possible.
+ PPL_ASSERT(denom <= unused_index/100);
+ PPL_ASSERT(numer <= unused_index/100);
+ return 100*numer < ratio*denom;
+}
+
+inline bool
+CO_Tree::is_greater_than_ratio(dimension_type numer, dimension_type denom,
+ dimension_type ratio) {
+ PPL_ASSERT(ratio <= 100);
+ // If these are true, no overflows are possible.
+ PPL_ASSERT(denom <= unused_index/100);
+ PPL_ASSERT(numer <= unused_index/100);
+ return 100*numer > ratio*denom;
+}
+
+inline void
+CO_Tree::rebuild_smaller_tree() {
+ PPL_ASSERT(reserved_size > 3);
+ CO_Tree new_tree;
+ new_tree.init(reserved_size / 2);
+ new_tree.move_data_from(*this);
+ m_swap(new_tree);
+ PPL_ASSERT(new_tree.structure_OK());
+ PPL_ASSERT(structure_OK());
+}
+
+inline void
+CO_Tree::refresh_cached_iterators() {
+ cached_end = iterator(*this, reserved_size + 1);
+ cached_const_end = const_iterator(*this, reserved_size + 1);
+}
+
+inline void
+CO_Tree::move_data_element(data_type& to, data_type& from) {
+ // The following code is equivalent (but slower):
+ //
+ // <CODE>
+ // new (&to) data_type(from);
+ // from.~data_type();
+ // </CODE>
+ std::memcpy(&to, &from, sizeof(data_type));
+}
+
+
+inline
+CO_Tree::const_iterator::const_iterator()
+ : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = 0;
+#endif
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1)
+ : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ if (!tree1.empty())
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1,
+ dimension_type i)
+ : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ PPL_ASSERT(i != 0);
+ PPL_ASSERT(i <= tree1.reserved_size + 1);
+ PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const const_iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::const_iterator::m_swap(const_iterator& itr) {
+ using std::swap;
+ swap(current_data, itr.current_data);
+ swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ swap(tree, itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const const_iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator++() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ ++current_index;
+ ++current_data;
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator--() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ --current_index;
+ --current_data;
+ while (*current_index == unused_index) {
+ --current_index;
+ --current_data;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator++(int) {
+ const_iterator itr(*this);
+ ++(*this);
+ return itr;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator--(int) {
+ const_iterator itr(*this);
+ --(*this);
+ return itr;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::const_iterator::operator*() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline dimension_type
+CO_Tree::const_iterator::index() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_index;
+}
+
+inline bool
+CO_Tree::const_iterator::operator==(const const_iterator& x) const {
+ PPL_ASSERT((current_index == x.current_index)
+ == (current_data == x.current_data));
+ PPL_ASSERT(OK());
+ return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::const_iterator::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+
+inline
+CO_Tree::iterator::iterator()
+ : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = 0;
+#endif
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1)
+ : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ if (!tree1.empty())
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1, dimension_type i)
+ : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &tree1;
+#endif
+ PPL_ASSERT(i != 0);
+ PPL_ASSERT(i <= tree1.reserved_size + 1);
+ PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const tree_iterator& itr) {
+ *this = itr;
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const iterator& itr2) {
+ (*this) = itr2;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::iterator::m_swap(iterator& itr) {
+ using std::swap;
+ swap(current_data, itr.current_data);
+ swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ swap(tree, itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const tree_iterator& itr) {
+ current_index = &(itr.tree.indexes[itr.dfs_index()]);
+ current_data = &(itr.tree.data[itr.dfs_index()]);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = &(itr.tree);
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const iterator& itr2) {
+ current_index = itr2.current_index;
+ current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+ tree = itr2.tree;
+#endif
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator++() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ ++current_index;
+ ++current_data;
+ while (*current_index == unused_index) {
+ ++current_index;
+ ++current_data;
+ }
+
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator--() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ --current_index;
+ --current_data;
+ while (*current_index == unused_index) {
+ --current_index;
+ --current_data;
+ }
+
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator++(int) {
+ iterator itr(*this);
+ ++(*this);
+ return itr;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator--(int) {
+ iterator itr(*this);
+ --(*this);
+ return itr;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::iterator::operator*() {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::iterator::operator*() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_data;
+}
+
+inline dimension_type
+CO_Tree::iterator::index() const {
+ PPL_ASSERT(current_index != 0);
+ PPL_ASSERT(current_data != 0);
+ PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+ PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+ return *current_index;
+}
+
+inline bool
+CO_Tree::iterator::operator==(const iterator& x) const {
+ PPL_ASSERT((current_index == x.current_index)
+ == (current_data == x.current_data));
+ PPL_ASSERT(OK());
+ return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::iterator::operator!=(const iterator& x) const {
+ return !(*this == x);
+}
+
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ get_root();
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1, dimension_type i1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ PPL_ASSERT(i1 <= tree.reserved_size + 1);
+ i = i1;
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(const iterator& itr, CO_Tree& tree1)
+ : tree(tree1) {
+ PPL_ASSERT(tree.reserved_size != 0);
+ *this = itr;
+ PPL_ASSERT(OK());
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const tree_iterator& itr) {
+ PPL_ASSERT(&tree == &(itr.tree));
+ i = itr.i;
+ offset = itr.offset;
+ return *this;
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const iterator& itr) {
+ PPL_ASSERT(itr != tree.end());
+ i = tree.dfs_index(itr);
+ offset = least_significant_one_mask(i);
+ return *this;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator==(const tree_iterator& itr) const {
+ return i == itr.i;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator!=(const tree_iterator& itr) const {
+ return !(*this == itr);
+}
+
+inline void
+CO_Tree::tree_iterator::get_root() {
+ i = tree.reserved_size / 2 + 1;
+ offset = i;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_left_child() {
+ PPL_ASSERT(offset != 0);
+ PPL_ASSERT(offset != 1);
+ offset /= 2;
+ i -= offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_right_child() {
+ PPL_ASSERT(offset != 0);
+ PPL_ASSERT(offset != 1);
+ offset /= 2;
+ i += offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_parent() {
+ PPL_ASSERT(!is_root());
+ PPL_ASSERT(offset != 0);
+ i &= ~offset;
+ offset *= 2;
+ i |= offset;
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_left_children_with_value() {
+ PPL_ASSERT(index() != unused_index);
+ const dimension_type* p = tree.indexes;
+ p += i;
+ p -= (offset - 1);
+ while (*p == unused_index)
+ ++p;
+ const ptrdiff_t distance = p - tree.indexes;
+ PPL_ASSERT(distance >= 0);
+ i = static_cast<dimension_type>(distance);
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_right_children_with_value() {
+ PPL_ASSERT(index() != unused_index);
+ const dimension_type* p = tree.indexes;
+ p += i;
+ p += (offset - 1);
+ while (*p == unused_index)
+ --p;
+ const ptrdiff_t distance = p - tree.indexes;
+ PPL_ASSERT(distance >= 0);
+ i = static_cast<dimension_type>(distance);
+ offset = least_significant_one_mask(i);
+ PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::tree_iterator::is_root() const {
+ // This is implied by OK(), it is here for reference only.
+ PPL_ASSERT(offset <= (tree.reserved_size / 2 + 1));
+ return offset == (tree.reserved_size / 2 + 1);
+}
+
+inline bool
+CO_Tree::tree_iterator::is_right_child() const {
+ if (is_root())
+ return false;
+ return (i & (2*offset)) != 0;
+}
+
+inline bool
+CO_Tree::tree_iterator::is_leaf() const {
+ return offset == 1;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::tree_iterator::operator*() {
+ return tree.data[i];
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::tree_iterator::operator*() const {
+ return tree.data[i];
+}
+
+inline dimension_type&
+CO_Tree::tree_iterator::index() {
+ return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::index() const {
+ return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::dfs_index() const {
+ return i;
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::get_offset() const {
+ return offset;
+}
+
+inline CO_Tree::height_t
+CO_Tree::tree_iterator::depth() const {
+ return integer_log2((tree.reserved_size + 1) / offset);
+}
+
+inline void
+swap(CO_Tree& x, CO_Tree& y) {
+ x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y) {
+ x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::iterator& x, CO_Tree::iterator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_templates.hh line 1. */
+/* CO_Tree class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Iterator>
+CO_Tree::CO_Tree(Iterator i, dimension_type n) {
+
+ if (n == 0) {
+ init(0);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type new_max_depth = integer_log2(n) + 1;
+ reserved_size = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+
+ if (is_greater_than_ratio(n, reserved_size, max_density_percent)
+ && reserved_size != 3)
+ reserved_size = reserved_size*2 + 1;
+
+ init(reserved_size);
+
+ tree_iterator root(*this);
+
+ // This is static and with static allocation, to improve performance.
+ // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+ // 2^k-1 is a dimension_type, so it is the maximum tree height.
+ // For each node level, the stack may contain up to 4 elements: two elements
+ // with operation 0, one element with operation 2 and one element
+ // with operation 3. An additional element with operation 1 can be at the
+ // top of the tree.
+ static std::pair<dimension_type, signed char>
+ stack[4U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+ dimension_type stack_first_empty = 0;
+
+ // A pair (n, operation) in the stack means:
+ //
+ // * Go to the parent, if operation is 0.
+ // * Go to the left child, then fill the current tree with n elements, if
+ // operation is 1.
+ // * Go to the right child, then fill the current tree with n elements, if
+ // operation is 2.
+ // * Fill the current tree with n elements, if operation is 3.
+
+ stack[0].first = n;
+ stack[0].second = 3;
+ ++stack_first_empty;
+
+ while (stack_first_empty != 0) {
+
+ // Implement
+ //
+ // <CODE>
+ // top_n = stack.top().first;
+ // top_operation = stack.top().second;
+ // </CODE>
+ const dimension_type top_n = stack[stack_first_empty - 1].first;
+ const signed char top_operation = stack[stack_first_empty - 1].second;
+
+ switch (top_operation) {
+
+ case 0:
+ root.get_parent();
+ --stack_first_empty;
+ continue;
+
+ case 1:
+ root.get_left_child();
+ break;
+
+ case 2:
+ root.get_right_child();
+ break;
+#ifndef NDEBUG
+ case 3:
+ break;
+
+ default:
+ // We should not be here
+ PPL_UNREACHABLE;
+#endif
+ }
+
+ // We now visit the current tree
+
+ if (top_n == 0) {
+ --stack_first_empty;
+ }
+ else {
+ if (top_n == 1) {
+ PPL_ASSERT(root.index() == unused_index);
+ root.index() = i.index();
+ new (&(*root)) data_type(*i);
+ ++i;
+ --stack_first_empty;
+ }
+ else {
+ PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+ const dimension_type half = (top_n + 1) / 2;
+ stack[stack_first_empty - 1].second = 0;
+ stack[stack_first_empty ] = std::make_pair(top_n - half, 2);
+ stack[stack_first_empty + 1] = std::make_pair(1, 3);
+ stack[stack_first_empty + 2].second = 0;
+ stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+ stack_first_empty += 4;
+ }
+ }
+ }
+ size_ = n;
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 1558. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sparse sequence of coefficients.
+/*! \ingroup PPL_CXX_interface
+ This class is implemented using a CO_Tree. See the documentation of CO_Tree
+ for details on the implementation and the performance.
+
+ This class is a drop-in replacement of Dense_Row, meaning that code
+ using Dense_Row can be ported to Sparse_Row changing only the type.
+ The resulting code will work, but probably needs more CPU and memory (it
+ does not exploit the sparse representation yet).
+
+ To take advantage of the sparse representation, the client code must then be
+ modified to use methods which can have a faster implementation on sparse
+ data structures.
+
+ The main changes are the replacement of calls to operator[] with calls to
+ find(), lower_bound() or insert(), using hint iterators when possible.
+ Sequential scanning of rows should probably be implemented using iterators
+ rather than indexes, to improve performance.
+ reset() should be called to zero elements.
+
+ \see Sparse_Matrix
+ \see CO_Tree
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Sparse_Row {
+
+public:
+
+ //! An %iterator on the row elements
+ /*!
+ This %iterator skips non-stored zeroes.
+ \see CO_Tree::iterator
+ */
+ typedef CO_Tree::iterator iterator;
+
+ //! A const %iterator on the row elements
+ /*!
+ This %iterator skips non-stored zeroes.
+ \see CO_Tree::const_iterator
+ */
+ typedef CO_Tree::const_iterator const_iterator;
+
+ //! Constructs a row with the specified size.
+ /*!
+ \param n
+ The size for the new row.
+
+ The row will contain only non-stored zeroes.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit Sparse_Row(dimension_type n = 0);
+
+ //! Constructs a row with the specified size.
+ /*!
+ \param n
+ The size for the new row.
+
+ \param capacity
+ It is ignored. This parameter is needed for compatibility with Dense_Row.
+
+ The row will contain only non-stored zeroes.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ Sparse_Row(dimension_type n, dimension_type capacity);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Sparse_Row(const Sparse_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Constructor from a Dense_Row.
+ /*!
+ \param row
+ The row that will be copied into *this.
+
+ This constructor takes \f$O(n)\f$ time. Note that constructing of a row of
+ zeroes and then inserting n elements costs \f$O(n*\log^2 n)\f$ time.
+ */
+ explicit Sparse_Row(const Dense_Row& row);
+
+ //! Copy constructor from a Dense_Row with specified size and capacity.
+ /*!
+ It is assumed that \p sz is less than or equal to \p capacity.
+ */
+ Sparse_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+ Sparse_Row& operator=(const Dense_Row& row);
+
+ //! Swaps *this and x.
+ /*!
+ \param x
+ The row that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(Sparse_Row& x);
+
+ //! Returns the size of the row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type size() const;
+
+ //! Returns the number of elements explicitly stored in the row.
+ /*!
+ This is equivalent to std::distance(begin(), end()), but it's much faster.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_stored_elements() const;
+
+ //! Resizes the row to the specified size.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time when shrinking the
+ row and removing the trailing k elements.
+ It takes \f$O(1)\f$ time when enlarging the row.
+ */
+ void resize(dimension_type n);
+
+ //! Resizes the row to size \p n.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method, with this signature, is needed for compatibility with
+ Dense_Row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void expand_within_capacity(dimension_type n);
+
+ //! Resizes the row to size \p n.
+ /*!
+ \param n
+ The new size for the row.
+
+ This method, with this signature, is needed for compatibility with
+ Dense_Row.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time where k is the number
+ of removed elements.
+ */
+ void shrink(dimension_type n);
+
+ /*!
+ \brief Deletes the i-th element from the row, shifting the next elements
+ to the left.
+
+ \param i
+ The index of the element that will be deleted.
+
+ The size of the row is decreased by 1.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k+\log^2 n)\f$ amortized time, where k is the
+ number of elements with index greater than i.
+ */
+ void delete_element_and_shift(dimension_type i);
+
+ //! Adds \p n zeroes before index \p i.
+ /*!
+ \param n
+ The number of non-stored zeroes that will be added to the row.
+
+ \param i
+ The index of the element before which the zeroes will be added.
+
+ Existing elements with index greater than or equal to \p i are shifted to
+ the right by \p n positions. The size is increased by \p n.
+
+ Existing iterators are not invalidated, but are shifted to the right
+ by \p n if they pointed at or after index \p i (i.e., they point to
+ the same, possibly shifted, values as before).
+
+ This method takes \f$O(k + \log m)\f$ expected time, where \f$k\f$ is
+ the number of elements with index greater than or equal to \p i and
+ \f$m\f$ the number of stored elements.
+ */
+ void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+ //! Returns an %iterator that points at the first stored element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an %iterator that points after the last stored element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is kept valid.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const iterator& end();
+
+ //! Equivalent to <CODE>cbegin()</CODE>.
+ const_iterator begin() const;
+
+ //! Equivalent to <CODE>cend()</CODE>.
+ const const_iterator& end() const;
+
+ //! Returns an %iterator that points at the first element.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator cbegin() const;
+
+ //! Returns an %iterator that points after the last element.
+ /*!
+ This method always returns a reference to the same internal %iterator,
+ that is updated at each operation that modifies the structure.
+ Client code can keep a const reference to that %iterator instead of
+ keep updating a local %iterator.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const const_iterator& cend() const;
+
+ //! Returns the size() of the largest possible Sparse_Row.
+ static dimension_type max_size();
+
+ //! Resets all the elements of this row.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ void clear();
+
+ //! Gets a reference to the i-th element.
+ /*!
+ \param i
+ The index of the desired element.
+
+ For read-only access it's better to use get(), that avoids allocating
+ space for zeroes.
+
+ If possible, use the insert(), find() or lower_bound() methods with
+ a hint instead of this, to improve performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log n)\f$ amortized time when there is already an
+ element with index \p i, and \f$O(\log^2 n)\f$ otherwise.
+ */
+ Coefficient& operator[](dimension_type i);
+
+ //! Equivalent to <CODE>get(i)</CODE>, provided for convenience.
+ /*!
+ This method takes \f$O(\log n)\f$ time.
+ */
+ Coefficient_traits::const_reference operator[](dimension_type i) const;
+
+ //! Gets the i-th element in the sequence.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the insert(), find() or lower_bound() methods with
+ a hint instead of this, to improve performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator find(dimension_type i);
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ iterator find(iterator itr, dimension_type i);
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator find(dimension_type i) const;
+
+ //! Looks for an element with index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ const_iterator find(const_iterator itr, dimension_type i) const;
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ iterator lower_bound(dimension_type i);
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ iterator lower_bound(iterator itr, dimension_type i);
+
+ //! Lower bound of index i.
+ /*!
+
+ \param i
+ The index of the desired element.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ If possible, use the find() method that takes a hint %iterator, to improve
+ performance.
+
+ This method takes \f$O(\log n)\f$ time.
+ */
+ const_iterator lower_bound(dimension_type i) const;
+
+ //! Lower bound of index i.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr.
+
+ \returns an %iterator to the first element with index greater than or
+ equal to i.
+ If there are no such elements, returns end().
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This method takes \f$O(\log n)\f$ time.
+ If the distance between \p itr and the searched position is \f$O(1)\f$,
+ this method takes \f$O(1)\f$ time.
+ */
+ const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+ //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param x
+ The value that will be associated to the element.
+
+ If possible, use versions of this method that take a hint, to improve
+ performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+ //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param x
+ The value that will be associated to the element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr, even faster than <CODE>(*this)[i] = x</CODE>.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+ between \p itr and the searched position is \f$O(1)\f$ and the row already
+ contains an element with this index, this method takes \f$O(1)\f$ time.
+ */
+ iterator insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x);
+
+ //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ If possible, use versions of this method that take a hint, to improve
+ performance.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator insert(dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+ /*!
+ \param i
+ The index of the desired element.
+
+ \param itr
+ It is used as a hint. This method will be faster if the searched element
+ is near to \p itr, even faster than <CODE>(*this)[i]</CODE>.
+
+ The value of \p itr does not affect the result of this method, as long it
+ is a valid %iterator for this row. \p itr may even be end().
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+ between \p itr and the searched position is \f$O(1)\f$ and the row already
+ contains an element with this index, this method takes \f$O(1)\f$ time.
+ */
+ iterator insert(iterator itr, dimension_type i);
+
+ //! Swaps the i-th element with the j-th element.
+ /*!
+ \param i
+ The index of an element.
+
+ \param j
+ The index of another element.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ void swap_coefficients(dimension_type i, dimension_type j);
+
+ //! Equivalent to swap(i,itr.index()), but it assumes that
+ //! lower_bound(i)==itr.
+ /*!
+ Iterators that pointed to the itr.index()-th element remain valid
+ but now point to the i-th element. Other iterators are unaffected.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void fast_swap(dimension_type i, iterator itr);
+
+ //! Swaps the element pointed to by i with the element pointed to by j.
+ /*!
+ \param i
+ An %iterator pointing to an element.
+
+ \param j
+ An %iterator pointing to another element.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void swap_coefficients(iterator i, iterator j);
+
+ //! Resets to zero the value pointed to by i.
+ /*!
+ \param i
+ An %iterator pointing to the element that will be reset (not stored
+ anymore).
+
+ By calling this method instead of getting a reference to the value and
+ setting it to zero, the element will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ iterator reset(iterator i);
+
+ //! Resets to zero the values in the range [first,last).
+ /*!
+ \param first
+ An %iterator pointing to the first element to reset.
+
+ \param last
+ An %iterator pointing after the last element to reset.
+
+ By calling this method instead of getting a reference to the values and
+ setting them to zero, the elements will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+ number of elements in [first,last).
+ */
+ iterator reset(iterator first, iterator last);
+
+ //! Resets to zero the i-th element.
+ /*!
+ \param i
+ The index of the element to reset.
+
+ By calling this method instead of getting a reference to the value and
+ setting it to zero, the element will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\log^2 n)\f$ amortized time.
+ */
+ void reset(dimension_type i);
+
+ //! Resets to zero the elements with index greater than or equal to i.
+ /*!
+ \param i
+ The index of the first element to reset.
+
+ By calling this method instead of getting a reference to the values and
+ setting them to zero, the elements will no longer be stored.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+ number of elements with index greater than or equal to i.
+ */
+ void reset_after(dimension_type i);
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of the row
+ and normalizes them by the GCD itself.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ void normalize();
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_second
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_first(const Sparse_Row& y,
+ const Func1& f, const Func2& g);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, 0) must do nothing, for every c1.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine
+ */
+ template <typename Func1, typename Func2>
+ void combine_needs_second(const Sparse_Row& y,
+ const Func1& g, const Func2& h);
+
+ //! Calls g(x[i],y[i]), for each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param f
+ A functor that should take a Coefficient&.
+ f(c1) must be equivalent to g(c1, 0).
+
+ \param g
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+ \param h
+ A functor that should take a Coefficient& and a
+ Coefficient_traits::const_reference.
+ h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary, assuming the requested
+ properties hold.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ */
+ template <typename Func1, typename Func2, typename Func3>
+ void combine(const Sparse_Row& y,
+ const Func1& f, const Func2& g, const Func3& h);
+
+ //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+ //! each i.
+ /*!
+ \param y
+ The row that will be combined with *this.
+
+ \param coeff1
+ The coefficient used for elements of *this.
+ This must not be 0.
+
+ \param coeff2
+ The coefficient used for elements of y.
+ This must not be 0.
+
+ This method takes \f$O(n*\log^2 n)\f$ time.
+
+ \note
+ The functors will only be called when necessary.
+ This method can be implemented in user code, too. It is provided for
+ convenience only.
+
+ \see combine_needs_first
+ \see combine_needs_second
+ \see combine
+ */
+ void linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ /*!
+ This method, unlike the other linear_combine() method, detects when
+ coeff1==1 and/or coeff2==1 or coeff2==-1 in order to save some work.
+ */
+ void linear_combine(const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! Loads the row from an ASCII representation generated using ascii_dump().
+ /*!
+ \param s
+ The stream from which the ASCII representation will be loaded.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ This method takes \f$O(n)\f$ time.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method takes \f$O(n)\f$ time.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ This method takes \f$O(n)\f$ time.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks the invariant.
+ bool OK() const;
+
+ //! Checks the invariant.
+ /*!
+ This method is provided for compatibility with Dense_Row.
+
+ \param capacity
+ This parameter is ignored.
+ */
+ bool OK(dimension_type capacity) const;
+
+private:
+ //! The tree used to store the elements.
+ CO_Tree tree;
+
+ //! The size of the row.
+ /*!
+ The elements contained in this row have indexes that are less than size_.
+ */
+ dimension_type size_;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+ Parma_Polyhedra_Library::Sparse_Row& y);
+
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+ Parma_Polyhedra_Library::Dense_Row& y);
+
+void swap(Parma_Polyhedra_Library::Dense_Row& x,
+ Parma_Polyhedra_Library::Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Sparse_Row& x, const Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Sparse_Row& x, const Sparse_Row& y);
+
+bool operator==(const Dense_Row& x, const Sparse_Row& y);
+bool operator!=(const Dense_Row& x, const Sparse_Row& y);
+
+bool operator==(const Sparse_Row& x, const Dense_Row& y);
+bool operator!=(const Sparse_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference coeff1,
+ Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+ This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+ order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_inlines.hh line 1. */
+/* Sparse_Row class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n)
+ : size_(n) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n, dimension_type)
+ : size_(n) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type)
+ : tree(y.tree), size_(y.size_) {
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type)
+ : tree(y.begin(),
+ std::distance(y.begin(), y.lower_bound(std::min(y.size(), sz)))),
+ size_(sz) {
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::m_swap(Sparse_Row& x) {
+ using std::swap;
+ swap(tree, x.tree);
+ swap(size_, x.size_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(x.OK());
+}
+
+inline dimension_type
+Sparse_Row::size() const {
+ return size_;
+}
+
+inline dimension_type
+Sparse_Row::num_stored_elements() const {
+ return tree.size();
+}
+
+inline void
+Sparse_Row::resize(dimension_type n) {
+ if (n < size_)
+ reset_after(n);
+ size_ = n;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::shrink(dimension_type n) {
+ PPL_ASSERT(size() >= n);
+ resize(n);
+}
+
+inline void
+Sparse_Row::expand_within_capacity(dimension_type n) {
+ PPL_ASSERT(size() <= n);
+ resize(n);
+}
+
+inline void
+Sparse_Row::delete_element_and_shift(dimension_type i) {
+ PPL_ASSERT(i < size_);
+ tree.erase_element_and_shift_left(i);
+ --size_;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+ PPL_ASSERT(i <= size_);
+ tree.increase_keys_from(i, n);
+ size_ += n;
+ PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::begin() {
+ return tree.begin();
+}
+
+inline const Sparse_Row::iterator&
+Sparse_Row::end() {
+ return tree.end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::begin() const {
+ return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::end() const {
+ return tree.cend();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::cbegin() const {
+ return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::cend() const {
+ return tree.cend();
+}
+
+inline dimension_type
+Sparse_Row::max_size() {
+ return CO_Tree::max_size();
+}
+
+inline void
+Sparse_Row::clear() {
+ tree.clear();
+}
+
+inline Coefficient&
+Sparse_Row::operator[](dimension_type i) {
+ PPL_ASSERT(i < size_);
+ iterator itr = insert(i);
+ return *itr;
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::operator[](dimension_type i) const {
+ return get(i);
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::get(dimension_type i) const {
+ PPL_ASSERT(i < size_);
+ if (tree.empty())
+ return Coefficient_zero();
+ const_iterator itr = find(i);
+ if (itr != end())
+ return *itr;
+ else
+ return Coefficient_zero();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ iterator itr = tree.bisect(i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(iterator hint, dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ iterator itr = tree.bisect_near(hint, i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(dimension_type i) const {
+ PPL_ASSERT(i < size());
+
+ const_iterator itr = tree.bisect(i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(const_iterator hint, dimension_type i) const {
+ PPL_ASSERT(i < size());
+
+ const_iterator itr = tree.bisect_near(hint, i);
+
+ if (itr != end() && itr.index() == i)
+ return itr;
+
+ return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(dimension_type i) {
+ PPL_ASSERT(i <= size());
+
+ iterator itr = tree.bisect(i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(iterator hint, dimension_type i) {
+ PPL_ASSERT(i <= size());
+
+ iterator itr = tree.bisect_near(hint, i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(dimension_type i) const {
+ PPL_ASSERT(i <= size());
+
+ const_iterator itr = tree.bisect(i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(const_iterator hint, dimension_type i) const {
+ PPL_ASSERT(i <= size());
+
+ const_iterator itr = tree.bisect_near(hint, i);
+
+ if (itr == end())
+ return end();
+
+ if (itr.index() < i)
+ ++itr;
+
+ PPL_ASSERT(itr == end() || itr.index() >= i);
+
+ return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i, Coefficient_traits::const_reference x) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i,
+ Coefficient_traits::const_reference x) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(itr, i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(i);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i) {
+ PPL_ASSERT(i < size_);
+ return tree.insert(itr, i);
+}
+
+inline void
+Sparse_Row::swap_coefficients(iterator i, iterator j) {
+ PPL_ASSERT(i != end());
+ PPL_ASSERT(j != end());
+ using std::swap;
+ swap(*i, *j);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::fast_swap(dimension_type i, iterator itr) {
+ PPL_ASSERT(lower_bound(i) == itr);
+ PPL_ASSERT(itr != end());
+ tree.fast_shift(i, itr);
+ PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::reset(iterator i) {
+ iterator res = tree.erase(i);
+ PPL_ASSERT(OK());
+ return res;
+}
+
+inline void
+Sparse_Row::reset(dimension_type i) {
+ PPL_ASSERT(i < size());
+
+ tree.erase(i);
+ PPL_ASSERT(OK());
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes() const {
+ return tree.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+ return external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes(dimension_type /* capacity */) const {
+ return total_memory_in_bytes();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline void
+swap(Sparse_Row& x, Sparse_Row& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_templates.hh line 1. */
+/* Sparse_Row class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_first(const Sparse_Row& y,
+ const Func1& f, const Func2& g) {
+ if (this == &y) {
+ for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+ g(*i, *i);
+ }
+ else {
+ iterator i = begin();
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset().
+ const iterator& i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ while (i != i_end && j != j_end)
+ if (i.index() == j.index()) {
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ else
+ j = y.lower_bound(j, i.index());
+ while (i != i_end) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ }
+}
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_second(const Sparse_Row& y,
+ const Func1& g,
+ const Func2& /* h */) {
+ iterator i = begin();
+ for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+ i = insert(i, j.index());
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ }
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Sparse_Row::combine(const Sparse_Row& y, const Func1& f,
+ const Func2& g, const Func3& h) {
+ if (this == &y) {
+ for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+ g(*i, *i);
+ }
+ else {
+ iterator i = begin();
+ // This is a const reference to an internal iterator, that is kept valid.
+ // If we just stored a copy, that would be invalidated by the calls to
+ // reset() and insert().
+ const iterator& i_end = end();
+ const_iterator j = y.begin();
+ const_iterator j_end = y.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ g(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ else
+ if (i.index() < j.index()) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ i = insert(i, j.index());
+ h(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ ++j;
+ }
+ }
+ PPL_ASSERT(i == i_end || j == j_end);
+ while (i != i_end) {
+ f(*i);
+ if (*i == 0)
+ i = reset(i);
+ else
+ ++i;
+ }
+ while (j != j_end) {
+ i = insert(i, j.index());
+ h(*i, *j);
+ if (*i == 0)
+ i = reset(i);
+ ++j;
+ }
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 929. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 33. */
+#include <cstddef>
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_defs.hh line 1. */
+/* Linear_Expression_Interface class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression_Interface;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_defs.hh line 33. */
+#include <vector>
+#include <set>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of a class implementing Linear_Expression_Interface
+ represents a linear expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_Expression_Interface {
+public:
+ virtual ~Linear_Expression_Interface();
+
+ virtual bool OK() const = 0;
+
+ //! Returns the current representation of this linear expression.
+ virtual Representation representation() const = 0;
+
+ //! An interface for const iterators on the expression (homogeneous)
+ //! coefficients that are nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator_interface {
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ //! Returns a copy of *this.
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* clone() const = 0;
+
+ virtual ~const_iterator_interface();
+
+ //! Navigates to the next nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator++() = 0;
+
+ //! Navigates to the previous nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator--() = 0;
+
+ //! Returns the current element.
+ virtual reference operator*() const = 0;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ virtual Variable variable() const = 0;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ virtual bool operator==(const const_iterator_interface& x) const = 0;
+ };
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* begin() const = 0;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* end() const = 0;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ //! Returns (a pointer to) an iterator that points to the first nonzero
+ //! coefficient of a variable greater than or equal to v, or at end if no
+ //! such coefficient exists.
+ virtual const_iterator_interface* lower_bound(Variable v) const = 0;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ virtual dimension_type space_dimension() const = 0;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ virtual void set_space_dimension(dimension_type n) = 0;
+
+ //! Returns the coefficient of \p v in \p *this.
+ virtual Coefficient_traits::const_reference
+ coefficient(Variable v) const = 0;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ virtual void
+ set_coefficient(Variable v, Coefficient_traits::const_reference n) = 0;
+
+ //! Returns the inhomogeneous term of \p *this.
+ virtual Coefficient_traits::const_reference inhomogeneous_term() const = 0;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ virtual void
+ set_inhomogeneous_term(Coefficient_traits::const_reference n) = 0;
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, Variable v) = 0;
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) = 0;
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) = 0;
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ virtual void swap_space_dimensions(Variable v1, Variable v2) = 0;
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ virtual void remove_space_dimensions(const Variables_Set& vars) = 0;
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ virtual void shift_space_dimensions(Variable v, dimension_type n) = 0;
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ virtual void
+ permute_space_dimensions(const std::vector<Variable>& cycle) = 0;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ virtual bool is_zero() const = 0;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ virtual bool all_homogeneous_terms_are_zero() const = 0;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ virtual memory_size_type total_memory_in_bytes() const = 0;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const = 0;
+
+ //! Writes to \p s an ASCII representation of \p *this.
+ virtual void ascii_dump(std::ostream& s) const = 0;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ virtual bool ascii_load(std::istream& s) = 0;
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ virtual bool is_equal_to(const Linear_Expression_Interface& x) const = 0;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ virtual void normalize() = 0;
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ virtual void sign_normalize() = 0;
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ virtual void negate(dimension_type first, dimension_type last) = 0;
+
+ virtual Linear_Expression_Interface&
+ operator+=(Coefficient_traits::const_reference n) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(Coefficient_traits::const_reference n) = 0;
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Interface
+
+ \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ virtual int compare(const Linear_Expression_Interface& y) const = 0;
+
+ virtual Linear_Expression_Interface&
+ operator+=(const Linear_Expression_Interface& e2) = 0;
+ virtual Linear_Expression_Interface&
+ operator+=(const Variable v) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(const Linear_Expression_Interface& e2) = 0;
+ virtual Linear_Expression_Interface&
+ operator-=(const Variable v) = 0;
+ virtual Linear_Expression_Interface&
+ operator*=(Coefficient_traits::const_reference n) = 0;
+ virtual Linear_Expression_Interface&
+ operator/=(Coefficient_traits::const_reference n) = 0;
+
+ virtual void negate() = 0;
+
+ virtual Linear_Expression_Interface&
+ add_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+ virtual Linear_Expression_Interface&
+ sub_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+ virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2) = 0;
+
+ virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2) = 0;
+
+ virtual void print(std::ostream& s) const = 0;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ virtual bool all_zeroes(const Variables_Set& vars) const = 0;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+ Variable first, Variable last) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ virtual Coefficient_traits::const_reference get(dimension_type i) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ virtual void set(dimension_type i, Coefficient_traits::const_reference n) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ virtual bool all_zeroes(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ virtual dimension_type
+ num_zeroes(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ virtual Coefficient gcd(dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ virtual void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ virtual void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, dimension_type i) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ virtual dimension_type last_nonzero() const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ virtual dimension_type
+ last_nonzero(dimension_type first, dimension_type last) const = 0;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ virtual dimension_type
+ first_nonzero(dimension_type first, dimension_type last) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+ \f$0\f$, disregarding coefficients of variables in \p vars.
+ */
+ virtual bool
+ all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ virtual int
+ scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ virtual void
+ has_a_free_dimension_helper(std::set<dimension_type>& x) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Dense_Row& row) const = 0;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Sparse_Row& row) const = 0;
+};
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 35. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Expression_Impl represents the linear
+ expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+
+ \par How to build a linear expression.
+
+ Linear expressions are the basic blocks for defining
+ both constraints (i.e., linear equalities or inequalities)
+ and generators (i.e., lines, rays, points and closure points).
+ A full set of functions is defined to provide a convenient interface
+ for building complex linear expressions starting from simpler ones
+ and from objects of the classes Variable and Coefficient:
+ available operators include unary negation,
+ binary addition and subtraction,
+ as well as multiplication by a Coefficient.
+ The space dimension of a linear expression is defined as the maximum
+ space dimension of the arguments used to build it:
+ in particular, the space dimension of a Variable <CODE>x</CODE>
+ is defined as <CODE>x.id()+1</CODE>,
+ whereas all the objects of the class Coefficient have space dimension zero.
+
+ \par Example
+ The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+ having space dimension \f$3\f$:
+ \code
+ Linear_Expression_Impl e = 4*x - 2*y - z + 14;
+ \endcode
+ Another way to build the same linear expression is:
+ \code
+ Linear_Expression_Impl e1 = 4*x;
+ Linear_Expression_Impl e2 = 2*y;
+ Linear_Expression_Impl e3 = z;
+ Linear_Expression_Impl e = Linear_Expression_Impl(14);
+ e += e1 - e2 - e3;
+ \endcode
+ Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+ respectively; also, in the fourth line of code, \p e is created
+ with space dimension zero and then extended to space dimension 3
+ in the fifth line.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_Expression_Impl
+ : public Linear_Expression_Interface {
+public:
+ //! Default constructor: returns a copy of Linear_Expression_Impl::zero().
+ Linear_Expression_Impl();
+
+ //! Ordinary copy constructor.
+ Linear_Expression_Impl(const Linear_Expression_Impl& e);
+
+ //! Copy constructor for other row types.
+ template <typename Row2>
+ Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e);
+
+ //! Copy constructor from any implementation of Linear_Expression_Interface.
+ Linear_Expression_Impl(const Linear_Expression_Interface& e);
+
+ //! Destructor.
+ virtual ~Linear_Expression_Impl();
+
+ //! Checks if all the invariants are satisfied.
+ virtual bool OK() const;
+
+ /*! \brief
+ Builds the linear expression corresponding
+ to the inhomogeneous term \p n.
+ */
+ explicit Linear_Expression_Impl(Coefficient_traits::const_reference n);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression_Impl::max_space_dimension()</CODE>.
+ */
+ Linear_Expression_Impl(Variable v);
+
+ //! Returns the current representation of this linear expression.
+ virtual Representation representation() const;
+
+ //! An interface for const iterators on the expression (homogeneous)
+ //! coefficients that are nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator: public const_iterator_interface {
+ public:
+ explicit const_iterator(const Row& row, dimension_type i);
+
+ //! Returns a copy of *this.
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* clone() const;
+
+ //! Navigates to the next nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator++();
+
+ //! Navigates to the previous nonzero coefficient.
+ //! Note that this method does *not* return a reference, to increase
+ //! efficiency since it's virtual.
+ virtual void operator--();
+
+ //! Returns the current element.
+ virtual reference operator*() const;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ virtual Variable variable() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ virtual bool operator==(const const_iterator_interface& x) const;
+
+ private:
+
+ void skip_zeroes_forward();
+ void skip_zeroes_backward();
+
+ const Row* row;
+ typename Row::const_iterator itr;
+ };
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* begin() const;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ virtual const_iterator_interface* end() const;
+
+ //! This returns a pointer to dynamic-allocated memory. The caller has the
+ //! duty to free the memory when it's not needed anymore.
+ //! Returns (a pointer to) an iterator that points to the first nonzero
+ //! coefficient of a variable greater than or equal to v, or at end if no
+ //! such coefficient exists.
+ virtual const_iterator_interface* lower_bound(Variable v) const;
+
+ //! Returns the maximum space dimension a Linear_Expression_Impl can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ virtual dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ virtual void set_space_dimension(dimension_type n);
+
+ //! Returns the coefficient of \p v in \p *this.
+ virtual Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ virtual void set_coefficient(Variable v,
+ Coefficient_traits::const_reference n);
+
+ //! Returns the inhomogeneous term of \p *this.
+ virtual Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ virtual void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void linear_combine(const Linear_Expression_Interface& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ virtual void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ virtual void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ virtual void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ virtual void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ virtual bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ virtual bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ virtual memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+ //! Writes to \p s an ASCII representation of \p *this.
+ virtual void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ virtual bool ascii_load(std::istream& s);
+
+ //! Copy constructor with a specified space dimension.
+ Linear_Expression_Impl(const Linear_Expression_Interface& e,
+ dimension_type space_dim);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ virtual bool is_equal_to(const Linear_Expression_Interface& x) const;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ virtual void normalize();
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ virtual void sign_normalize();
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ virtual void negate(dimension_type first, dimension_type last);
+
+ virtual Linear_Expression_Impl&
+ operator+=(Coefficient_traits::const_reference n);
+ virtual Linear_Expression_Impl&
+ operator-=(Coefficient_traits::const_reference n);
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Impl
+
+ \returns
+ -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise.
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ virtual int compare(const Linear_Expression_Interface& y) const;
+
+ virtual Linear_Expression_Impl&
+ operator+=(const Linear_Expression_Interface& e2);
+ virtual Linear_Expression_Impl& operator+=(const Variable v);
+ virtual Linear_Expression_Impl&
+ operator-=(const Linear_Expression_Interface& e2);
+ virtual Linear_Expression_Impl& operator-=(const Variable v);
+ virtual Linear_Expression_Impl&
+ operator*=(Coefficient_traits::const_reference n);
+ virtual Linear_Expression_Impl&
+ operator/=(Coefficient_traits::const_reference n);
+
+ virtual void negate();
+
+ virtual Linear_Expression_Impl&
+ add_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+ virtual Linear_Expression_Impl&
+ sub_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+ virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2);
+
+ virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& e2);
+
+ virtual void print(std::ostream& s) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ virtual bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+ Variable first, Variable last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ virtual Coefficient_traits::const_reference get(dimension_type i) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ virtual void set(dimension_type i, Coefficient_traits::const_reference n);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ virtual bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ virtual dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ virtual Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ virtual void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ virtual void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ virtual void
+ linear_combine(const Linear_Expression_Interface& y, dimension_type i);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ virtual void linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ virtual dimension_type last_nonzero() const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ /*! \brief
+ Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+ \f$0\f$, disregarding coefficients of variables in \p vars.
+ */
+ virtual bool
+ all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Computes the sign of the sum of (*this)[i]*y[i], for each i in [start,end).
+ virtual int
+ scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ virtual dimension_type
+ first_nonzero(dimension_type first, dimension_type last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ virtual dimension_type
+ last_nonzero(dimension_type first, dimension_type last) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ virtual void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ virtual bool is_equal_to(const Linear_Expression_Interface& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Dense_Row& row) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets `row' to a copy of the row that implements *this.
+ virtual void get_row(Sparse_Row& row) const;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with the constructor
+ Linear_Expression_Impl(Coefficient_traits::const_reference n).
+ */
+ Linear_Expression_Impl(dimension_type space_dim, bool);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! \p *this and \p y have the same space dimension.
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ template <typename Row2>
+ void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x) const;
+
+ template <typename Row2>
+ Linear_Expression_Impl& operator+=(const Linear_Expression_Impl<Row2>& e2);
+ template <typename Row2>
+ Linear_Expression_Impl& operator-=(const Linear_Expression_Impl<Row2>& e2);
+
+ template <typename Row2>
+ Linear_Expression_Impl&
+ sub_mul_assign(Coefficient_traits::const_reference n,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end);
+
+ template <typename Row2>
+ void add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& e2);
+
+ template <typename Row2>
+ void sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& e2);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end).
+ template <typename Row2>
+ void linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ template <typename Row2>
+ void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! The basic comparison function.
+ /*! \relates Linear_Expression_Impl
+
+ \returns
+ -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise.
+
+ The order is a lexicographic. It starts comparing the variables'
+ coefficient, starting from Variable(0), and at the end it compares
+ the inhomogeneous terms.
+ */
+ template <typename Row2>
+ int compare(const Linear_Expression_Impl<Row2>& y) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ template <typename Row2>
+ void
+ scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ template <typename Row2>
+ int scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ template <typename Row2>
+ bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ template <typename Row2>
+ bool have_a_common_variable(const Linear_Expression_Impl<Row2>& x,
+ Variable first, Variable last) const;
+
+private:
+
+ void construct(const Linear_Expression_Interface& e);
+ void construct(const Linear_Expression_Interface& e,
+ dimension_type space_dim);
+
+ template <typename Row2>
+ void construct(const Linear_Expression_Impl<Row2>& e);
+ template <typename Row2>
+ void construct(const Linear_Expression_Impl<Row2>& e,
+ dimension_type space_dim);
+
+ Row row;
+
+ template <typename Row2>
+ friend class Linear_Expression_Impl;
+
+}; // class Parma_Polyhedra_Library::Linear_Expression_Impl
+
+
+namespace Parma_Polyhedra_Library {
+
+// NOTE: declaring explicit specializations.
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+ dimension_type end) const;
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+ dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+ Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+ Variable first, Variable last) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+
+template <>
+Representation
+Linear_Expression_Impl<Dense_Row>::representation() const;
+template <>
+Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_backward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_backward();
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_forward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_forward();
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_inlines.hh line 1. */
+/* Linear_Expression_Impl class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 1. */
+/* Declarations of some math utility functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 29. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+ Coefficient& numer, Coefficient& denom);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+ divided by \f$g\f$ are assigned to \p n_x and \p n_y, respectively.
+
+ \note
+ \p x and \p n_x may be the same object and likewise for
+ \p y and \p n_y. Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& n_x, Coefficient& n_y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 1. */
+/* Implementation of some math utility functions: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 28. */
+#include <limits>
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& n_x, Coefficient& n_y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd_assign(gcd, x, y);
+ exact_div_assign(n_x, x, gcd);
+ exact_div_assign(n_y, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+ PPL_ASSERT(n < unsigned(std::numeric_limits<T>::digits));
+ return ~((~static_cast<T>(0)) << n);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+ Coefficient& numer, Coefficient& denom) {
+ PPL_ASSERT(!is_not_a_number(from)
+ && !is_minus_infinity(from)
+ && !is_plus_infinity(from));
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q, from, ROUND_NOT_NEEDED);
+ numer = q.get_num();
+ denom = q.get_den();
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y) {
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ // Note: this code assumes that a Coefficient is always convertible
+ // to an mpq_class without loss of precision.
+ assign_r(q_x, x, ROUND_NOT_NEEDED);
+ assign_r(q_y, y, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_y, ROUND_NOT_NEEDED);
+ assign_r(to, q_x, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+ if (x > y)
+ x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+ if (x < y)
+ x = y;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x) {
+ T mod;
+ return umod_2exp_assign_r(mod, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+ && mod == 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y) {
+ T negated_x;
+ return neg_assign_r(negated_x, x, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+ && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+ if (x.get_den() <= 0)
+ return false;
+ PPL_DIRTY_TEMP(mpq_class, temp);
+ temp = x;
+ temp.canonicalize();
+ return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 109. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::max_space_dimension() {
+ return Row::max_size() - 1;
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::Linear_Expression_Impl()
+ : row(1) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(dimension_type space_dim, bool)
+ : row(space_dim + 1) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::~Linear_Expression_Impl() {
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(Coefficient_traits::const_reference n)
+ : row(1) {
+ if (n != 0)
+ row.insert(0, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::space_dimension() const {
+ return row.size() - 1;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::set_space_dimension(dimension_type n) {
+ row.resize(n + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return Coefficient_zero();
+ return row.get(v.id() + 1);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ const dimension_type i = v.space_dimension();
+ if (n == 0)
+ row.reset(i);
+ else
+ row.insert(i, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::inhomogeneous_term() const {
+ return row.get(0);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+ if (n == 0)
+ row.reset(0);
+ else
+ row.insert(0, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::swap_space_dimensions(Variable v1, Variable v2) {
+ row.swap_coefficients(v1.space_dimension(), v2.space_dimension());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::shift_space_dimensions(Variable v,
+ dimension_type n) {
+ row.add_zeroes_and_shift(n, v.space_dimension());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::external_memory_in_bytes() const {
+ return row.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(Coefficient_traits::const_reference n) {
+ typename Row::iterator itr = row.insert(0);
+ (*itr) += n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(Coefficient_traits::const_reference n) {
+ typename Row::iterator itr = row.insert(0);
+ (*itr) -= n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::normalize() {
+ row.normalize();
+ PPL_ASSERT(OK());
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const {
+ return row.num_stored_elements() == 0;
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const {
+ return row.lower_bound(1) == row.end();
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ return row.lower_bound(start) == row.lower_bound(end);
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(start <= end);
+ return (end - start)
+ - std::distance(row.lower_bound(start), row.lower_bound(end));
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const {
+ if (row.num_stored_elements() == 0)
+ return 0;
+ Sparse_Row::const_iterator i = row.end();
+ --i;
+ return i.index();
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ Sparse_Row::const_iterator i = row.lower_bound(first);
+
+ if (i != row.end() && i.index() < last)
+ return i.index();
+ else
+ return last;
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ Sparse_Row::const_iterator itr1 = row.lower_bound(first);
+ Sparse_Row::const_iterator itr2 = row.lower_bound(last);
+
+ if (itr1 == itr2)
+ return last;
+
+ --itr2;
+ return itr2.index();
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Dense_Row>::representation() const {
+ return DENSE;
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const {
+ return SPARSE;
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_forward() {
+ // Nothing to do.
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_backward() {
+ // Nothing to do.
+}
+
+namespace IO_Operators {
+
+template <typename Row>
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e) {
+ e.print(s);
+ return s;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 1. */
+/* Linear_Expression_Impl class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 29. */
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 1. */
+/* Constraint class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Congruence_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+/* Automatically generated from PPL source file ../src/Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+class Octagonal_Shape_Helper;
+
+}
+
+/* Automatically generated from PPL source file ../src/Grid_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 35. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 1. */
+/* Linear_Expression class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Generator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+/* Automatically generated from PPL source file ../src/Linear_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_System;
+
+template <typename Row>
+class Linear_System_With_Bit_Matrix_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+class Constraint_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum PIP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_PIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_PIP_PROBLEM
+};
+
+class PIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_MIP_PROBLEM,
+ //! The problem is unbounded.
+ UNBOUNDED_MIP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+class BD_Shape_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 47. */
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 1. */
+/* Expression_Adapter class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Expression_Adapter_Base;
+
+template <typename T>
+class Expression_Adapter;
+
+template <typename T>
+class Expression_Adapter_Transparent;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Adapters' base type (for template meta-programming).
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Expression_Adapter_Base {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression objects.
+/*!
+ The adapters are meant to provide read-only, customized access to the
+ Linear_Expression members in Constraint, Generator, Congruence and
+ Grid_Generator objects. They typically implement the user-level view
+ of these expressions.
+
+ \note
+ A few methods implement low-level access routines and will take
+ bare indexes as arguments (rather than Variable objects):
+ when such a bare index \c i is zero, the inhomogeneous term is meant;
+ when the bare index \c i is greater than zero, the coefficient of the
+ variable having id <CODE>i - 1</CODE> is meant.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter
+ : public Expression_Adapter_Base {
+public:
+ //! The type of this object.
+ typedef Expression_Adapter<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename T::const_reference inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename T::raw_type raw_type;
+
+ //! Returns an adapter after one-level unwrapping.
+ inner_type inner() const;
+
+ //! The type of const iterators on coefficients.
+ typedef typename raw_type::const_iterator const_iterator;
+
+ //! Returns the current representation of \p *this.
+ Representation representation() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient.
+ const_iterator begin() const;
+
+ //! Iterator pointing after the last nonzero variable coefficient.
+ const_iterator end() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient
+ //! of a variable bigger than or equal to \p v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are zero.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns the \p i -th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of variable \p v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ //! Returns the number of zero coefficient in [start, end).
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end).
+ Returns zero if all the coefficients in the range are zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last),
+ //! or \p last if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there
+ //! are no nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns \c true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both \p *this and \p y.
+ template <typename Expression>
+ bool have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const;
+
+protected:
+ //! Constructor.
+ explicit Expression_Adapter(const raw_type& expr);
+ //! The raw, completely unwrapped object subject to adaptation.
+ const raw_type& raw_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A transparent adapter for Linear_Expression objects.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter_Transparent
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Adapter_Transparent<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Constructor.
+ explicit Expression_Adapter_Transparent(const raw_type& expr);
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_inlines.hh line 1. */
+/* Expression_Adapter class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Adapter<T>::Expression_Adapter(const raw_type& expr)
+ : raw_(expr) {
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::inner_type
+Expression_Adapter<T>::inner() const {
+ return inner_type(raw_);
+}
+
+template <typename T>
+inline Representation
+Expression_Adapter<T>::representation() const {
+ return inner().representation();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::begin() const {
+ return inner().begin();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::end() const {
+ return inner().end();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::lower_bound(Variable v) const {
+ return inner().lower_bound(v);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::space_dimension() const {
+ return inner().space_dimension();
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::coefficient(Variable v) const {
+ return inner().coefficient(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::inhomogeneous_term() const {
+ return inner().inhomogeneous_term();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::is_zero() const {
+ return inner().is_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_homogeneous_terms_are_zero() const {
+ return inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>::is_equal_to(const Expression& y) const {
+ return inner().is_equal_to(y);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes(const Variables_Set& vars) const {
+ return inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(dimension_type i) const {
+ return inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(Variable v) const {
+ return inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ return inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ return inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Adapter<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ return inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero() const {
+ return inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ return inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ return inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ return inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ return inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ return inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Dense_Row& row) const {
+ inner().get_row(row);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Sparse_Row& row) const {
+ inner().get_row(row);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const {
+ return inner().have_a_common_variable(y, first, last);
+}
+
+template <typename T>
+inline
+Expression_Adapter_Transparent<T>
+::Expression_Adapter_Transparent(const raw_type& expr)
+ : base_type(expr) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 215. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Inhomo;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Last;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 51. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 54. */
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n / \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Assigns to \p e its own negation.
+/*! \relates Linear_Expression */
+void
+neg_assign(Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+//! Sums \p e2 multiplied by \p factor into \p e1.
+/*! \relates Linear_Expression */
+void add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+//! Subtracts \p e2 multiplied by \p factor from \p e1.
+/*! \relates Linear_Expression */
+void sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Expression
+
+ \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+ is greater. The absolute value of the result is 1 if the difference
+ is only in the inhomogeneous terms, 2 otherwise
+
+ The order is a lexicographic. It starts comparing the variables' coefficient,
+ starting from Variable(0), and at the end it compares the inhomogeneous
+ terms.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Linear_Expression& x, const Linear_Expression& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Linear_Expression represents the linear expression
+ \f[
+ \sum_{i=0}^{n-1} a_i x_i + b
+ \f]
+ where \f$n\f$ is the dimension of the vector space,
+ each \f$a_i\f$ is the integer coefficient
+ of the \f$i\f$-th variable \f$x_i\f$
+ and \f$b\f$ is the integer for the inhomogeneous term.
+
+ \par How to build a linear expression.
+
+ Linear expressions are the basic blocks for defining
+ both constraints (i.e., linear equalities or inequalities)
+ and generators (i.e., lines, rays, points and closure points).
+ A full set of functions is defined to provide a convenient interface
+ for building complex linear expressions starting from simpler ones
+ and from objects of the classes Variable and Coefficient:
+ available operators include unary negation,
+ binary addition and subtraction,
+ as well as multiplication by a Coefficient.
+ The space dimension of a linear expression is defined as the maximum
+ space dimension of the arguments used to build it:
+ in particular, the space dimension of a Variable <CODE>x</CODE>
+ is defined as <CODE>x.id()+1</CODE>,
+ whereas all the objects of the class Coefficient have space dimension zero.
+
+ \par Example
+ The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+ having space dimension \f$3\f$:
+ \code
+ Linear_Expression e = 4*x - 2*y - z + 14;
+ \endcode
+ Another way to build the same linear expression is:
+ \code
+ Linear_Expression e1 = 4*x;
+ Linear_Expression e2 = 2*y;
+ Linear_Expression e3 = z;
+ Linear_Expression e = Linear_Expression(14);
+ e += e1 - e2 - e3;
+ \endcode
+ Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+ respectively; also, in the fourth line of code, \p e is created
+ with space dimension zero and then extended to space dimension 3
+ in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression {
+public:
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: returns a copy of Linear_Expression::zero().
+ explicit Linear_Expression(Representation r = default_representation);
+
+ /*! \brief Ordinary copy constructor.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily the default_representation).
+ */
+ Linear_Expression(const Linear_Expression& e);
+
+ //! Copy constructor that takes also a Representation.
+ Linear_Expression(const Linear_Expression& e, Representation r);
+
+ // Queried by expression adapters.
+ typedef const Linear_Expression& const_reference;
+ typedef Linear_Expression raw_type;
+
+ /*! \brief Copy constructor from a linear expression adapter.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily the default_representation).
+ */
+ template <typename LE_Adapter>
+ explicit
+ Linear_Expression(const LE_Adapter& e,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief Copy constructor from a linear expression adapter that takes a
+ Representation.
+ */
+ template <typename LE_Adapter>
+ Linear_Expression(const LE_Adapter& e, Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief
+ Copy constructor from a linear expression adapter that takes a
+ space dimension.
+ \note
+ The new expression will have the same representation as \p e
+ (not necessarily default_representation).
+ */
+ template <typename LE_Adapter>
+ explicit
+ Linear_Expression(const LE_Adapter& e, dimension_type space_dim,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ /*! \brief
+ Copy constructor from a linear expression adapter that takes a
+ space dimension and a Representation.
+ */
+ template <typename LE_Adapter>
+ Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim, Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+ //! Assignment operator.
+ Linear_Expression& operator=(const Linear_Expression& e);
+
+ //! Destructor.
+ ~Linear_Expression();
+
+ /*! \brief
+ Builds the linear expression corresponding
+ to the inhomogeneous term \p n.
+ */
+ explicit Linear_Expression(Coefficient_traits::const_reference n,
+ Representation r = default_representation);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*!
+ \exception std::length_error
+ Thrown if the space dimension of \p v exceeds
+ <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+ Linear_Expression(Variable v, Representation r = default_representation);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! A const %iterator on the expression (homogeneous) coefficient that are
+ //! nonzero.
+ /*!
+ These iterators are invalidated by operations that modify the expression.
+ */
+ class const_iterator {
+ private:
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef const Coefficient value_type;
+ typedef ptrdiff_t difference_type;
+ typedef value_type* pointer;
+ typedef Coefficient_traits::const_reference reference;
+
+ //! Constructs an invalid const_iterator.
+ /*!
+ This constructor takes \f$O(1)\f$ time.
+ */
+ explicit const_iterator();
+
+ //! The copy constructor.
+ /*!
+ \param itr
+ The %iterator that will be copied.
+
+ This constructor takes \f$O(1)\f$ time.
+ */
+ const_iterator(const const_iterator& itr);
+
+ ~const_iterator();
+
+ //! Swaps itr with *this.
+ /*!
+ \param itr
+ The %iterator that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(const_iterator& itr);
+
+ //! Assigns \p itr to *this .
+ /*!
+ \param itr
+ The %iterator that will be assigned into *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator& operator=(const const_iterator& itr);
+
+ //! Navigates to the next nonzero coefficient.
+ /*!
+ This method takes \f$O(n)\f$ time for dense expressions, and
+ \f$O(1)\f$ time for sparse expressions.
+ */
+ const_iterator& operator++();
+
+ //! Navigates to the previous nonzero coefficient.
+ /*!
+ This method takes \f$O(n)\f$ time for dense expressions, and
+ \f$O(1)\f$ time for sparse expressions.
+ */
+ const_iterator& operator--();
+
+ //! Returns the current element.
+ reference operator*() const;
+
+ //! Returns the variable of the coefficient pointed to by \c *this.
+ /*!
+ \returns the variable of the coefficient pointed to by \c *this.
+ */
+ Variable variable() const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& x) const;
+
+ //! Compares \p *this with x .
+ /*!
+ \param x
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& x) const;
+
+ private:
+ //! Constructor from a const_iterator_interface*.
+ //! The new object takes ownership of the dynamic object.
+ const_iterator(Linear_Expression_Interface::const_iterator_interface* itr);
+
+ Linear_Expression_Interface::const_iterator_interface* itr;
+
+ friend class Linear_Expression;
+ };
+
+ //! Returns an iterator that points to the first nonzero coefficient in the
+ //! expression.
+ const_iterator begin() const;
+
+ //! Returns an iterator that points to the last nonzero coefficient in the
+ //! expression.
+ const_iterator end() const;
+
+ //! Returns an iterator that points to the first nonzero coefficient of a
+ //! variable bigger than or equal to v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the maximum space dimension a Linear_Expression can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to \p n .
+ void set_space_dimension(dimension_type n);
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Sets the coefficient of \p v in \p *this to \p n.
+ void set_coefficient(Variable v,
+ Coefficient_traits::const_reference n);
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Sets the inhomogeneous term of \p *this to \p n.
+ void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param v
+ The variable whose coefficient has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ void linear_combine(const Linear_Expression& y, Variable v);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+ //! c1 and c2 are not 0.
+ void linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+ //! c1 and c2 may be 0.
+ void linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the expression.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the expression.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are \f$0\f$.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the (zero-dimension space) constant 0.
+ static const Linear_Expression& zero();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_Expression& y);
+
+ //! Copy constructor with a specified space dimension.
+ Linear_Expression(const Linear_Expression& e, dimension_type space_dim);
+
+ //! Copy constructor with a specified space dimension and representation.
+ Linear_Expression(const Linear_Expression& e, dimension_type space_dim,
+ Representation r);
+
+ //! Returns \p true if *this is equal to \p x.
+ //! Note that (*this == x) has a completely different meaning.
+ bool is_equal_to(const Linear_Expression& x) const;
+
+ //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+ //! so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the coefficients
+ and the inhomogeneous term and normalizes them by the GCD itself.
+ */
+ void normalize();
+
+ //! Ensures that the first nonzero homogeneous coefficient is positive,
+ //! by negating the row if necessary.
+ void sign_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars[i] is \f$0\f$.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+private:
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the (zero-dimension space) constant 0.
+ */
+ static const Linear_Expression* zero_p;
+
+ Linear_Expression_Interface* impl;
+
+ //! Implementation sizing constructor.
+ /*!
+ The bool parameter is just to avoid problems with
+ the constructor Linear_Expression(Coefficient_traits::const_reference n).
+ */
+ Linear_Expression(dimension_type space_dim, bool,
+ Representation r = default_representation);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the i-th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the i-th coefficient to n.
+ void set(dimension_type i, Coefficient_traits::const_reference n);
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Returns the coefficient of v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ // NOTE: This method is public, but it's not exposed in Linear_Expression,
+ // so that it can be used internally in the PPL, by friends of
+ // Linear_Expression.
+ //! Sets the coefficient of v to n.
+ void set(Variable v, Coefficient_traits::const_reference n);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+ [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are 0 returns 0.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ void exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end);
+
+ //! Linearly combines \p *this with \p y so that the coefficient of \p v
+ //! is 0.
+ /*!
+ \param y
+ The expression that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting expression to \p *this.
+
+ \p *this and \p y must have the same space dimension.
+ */
+ void linear_combine(const Linear_Expression& y, dimension_type i);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). It assumes that c1 and c2 are nonzero.
+ void linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+ //! for each i in [start, end). c1 and c2 may be zero.
+ void linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end);
+
+ //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+ void mul_assign(Coefficient_traits::const_reference n,
+ dimension_type start, dimension_type end);
+
+ //! Returns the index of the last nonzero element, or 0 if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i.
+ void scalar_product_assign(Coefficient& result,
+ const Linear_Expression& y) const;
+
+ //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+ void scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i], for each i.
+ int scalar_product_sign(const Linear_Expression& y) const;
+
+ //! Computes the sign of the sum of (*this)[i]*y[i],
+ //! for each i in [start,end).
+ int scalar_product_sign(const Linear_Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from the set x all the indexes of nonzero elements of *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+ bool is_equal_to(const Linear_Expression& x,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+ //! [start,end).
+ bool is_equal_to(const Linear_Expression& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets `row' to a copy of the row that implements *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets `row' to a copy of the row that implements *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both *this and x.
+ bool have_a_common_variable(const Linear_Expression& x,
+ Variable first, Variable last) const;
+
+ /*! \brief
+ Negates the elements from index \p first (included)
+ to index \p last (excluded).
+ */
+ void negate(dimension_type first, dimension_type last);
+
+ template <typename Row>
+ friend class Linear_Expression_Impl;
+
+ // NOTE: The following classes are friends of Linear_Expression in order
+ // to access its private methods.
+ // Since they are *not* friend of Linear_Expression_Impl, they can only
+ // access its public methods so they cannot break the class invariant of
+ // Linear_Expression_Impl.
+ friend class Grid;
+ friend class Congruence;
+ friend class Polyhedron;
+ friend class PIP_Tree_Node;
+ friend class Grid_Generator;
+ friend class Generator;
+ friend class Constraint;
+ friend class Constraint_System;
+ friend class PIP_Problem;
+ friend class BHRZ03_Certificate;
+ friend class Scalar_Products;
+ friend class MIP_Problem;
+ friend class Box_Helpers;
+ friend class Congruence_System;
+ friend class BD_Shape_Helpers;
+ friend class Octagonal_Shape_Helper;
+ friend class Termination_Helpers;
+ template <typename T>
+ friend class BD_Shape;
+ template <typename T>
+ friend class Octagonal_Shape;
+ template <typename T>
+ friend class Linear_System;
+ template <typename T>
+ friend class Box;
+ template <typename T>
+ friend class Expression_Adapter;
+ template <typename T>
+ friend class Expression_Hide_Inhomo;
+ template <typename T>
+ friend class Expression_Hide_Last;
+
+ friend Linear_Expression
+ operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression
+ operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression
+ operator+(Variable v, const Linear_Expression& e);
+ friend Linear_Expression
+ operator+(Variable v, Variable w);
+
+ friend Linear_Expression
+ operator-(const Linear_Expression& e);
+
+ friend Linear_Expression
+ operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression
+ operator-(Variable v, Variable w);
+ friend Linear_Expression
+ operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression
+ operator-(Variable v, const Linear_Expression& e);
+ friend Linear_Expression
+ operator-(const Linear_Expression& e, Variable v);
+
+ friend Linear_Expression
+ operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+ friend Linear_Expression
+ operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e, Variable v);
+ friend Linear_Expression&
+ operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e, Variable v);
+ friend Linear_Expression&
+ operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+ friend Linear_Expression&
+ operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend void
+ neg_assign(Linear_Expression& e);
+
+ friend Linear_Expression&
+ add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+ friend Linear_Expression&
+ sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n, Variable v);
+
+ friend void
+ add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+ friend void
+ sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2);
+
+ friend int
+ compare(const Linear_Expression& x, const Linear_Expression& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<(std::ostream& s, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression */
+void swap(Linear_Expression& x, Linear_Expression& y);
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression::const_iterator */
+void swap(Linear_Expression::const_iterator& x,
+ Linear_Expression::const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_inlines.hh line 1. */
+/* Linear_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline Linear_Expression&
+Linear_Expression::operator=(const Linear_Expression& e) {
+ Linear_Expression tmp = e;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+ delete impl;
+}
+
+inline Representation
+Linear_Expression::representation() const {
+ return impl->representation();
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+ return impl->space_dimension();
+}
+
+inline void
+Linear_Expression::set_space_dimension(dimension_type n) {
+ impl->set_space_dimension(n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+ return impl->coefficient(v);
+}
+
+inline void
+Linear_Expression
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+ impl->set_coefficient(v, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+ return impl->inhomogeneous_term();
+}
+
+inline void
+Linear_Expression
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+ impl->set_inhomogeneous_term(n);
+}
+
+inline void
+Linear_Expression::swap_space_dimensions(Variable v1, Variable v2) {
+ impl->swap_space_dimensions(v1, v2);
+}
+
+inline void
+Linear_Expression::shift_space_dimensions(Variable v, dimension_type n) {
+ impl->shift_space_dimensions(v, n);
+}
+
+inline bool
+Linear_Expression::is_zero() const {
+ return impl->is_zero();
+}
+
+inline bool
+Linear_Expression::all_homogeneous_terms_are_zero() const {
+ return impl->all_homogeneous_terms_are_zero();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+ PPL_ASSERT(zero_p != 0);
+ return *zero_p;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+ return impl->total_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x += n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+ Linear_Expression x = e;
+ x += v;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x -= n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("Linear_Expression "
+ "PPL::operator+(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ if (v_space_dim >= w_space_dim) {
+ Linear_Expression e(v);
+ e -= w;
+ return e;
+ }
+ else {
+ Linear_Expression e(w.space_dimension(), true);
+ e -= w;
+ e += v;
+ return e;
+ }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression x = e;
+ x *= n;
+ return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl += n;
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl -= n;
+ return e;
+}
+
+inline void
+Linear_Expression::m_swap(Linear_Expression& y) {
+ using std::swap;
+ swap(impl, y.impl);
+}
+
+inline void
+Linear_Expression::normalize() {
+ impl->normalize();
+}
+
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+ impl->ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+ return impl->ascii_load(s);
+}
+
+inline void
+Linear_Expression::remove_space_dimensions(const Variables_Set& vars) {
+ impl->remove_space_dimensions(vars);
+}
+
+inline void
+Linear_Expression::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ impl->permute_space_dimensions(cycle);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+ if (e1.space_dimension() >= e2.space_dimension()) {
+ Linear_Expression e = e1;
+ e += e2;
+ return e;
+ }
+ else {
+ Linear_Expression e = e2;
+ e += e1;
+ return e;
+ }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+ return e + v;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ return e + n;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("Linear_Expression "
+ "PPL::operator+(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ if (v_space_dim >= w_space_dim) {
+ Linear_Expression e(v);
+ e += w;
+ return e;
+ }
+ else {
+ Linear_Expression e(w);
+ e += v;
+ return e;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e) {
+ Linear_Expression r(e);
+ neg_assign(r);
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+ if (e1.space_dimension() >= e2.space_dimension()) {
+ Linear_Expression e = e1;
+ e -= e2;
+ return e;
+ }
+ else {
+ Linear_Expression e = e2;
+ neg_assign(e);
+ e += e1;
+ return e;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+ Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+ result.negate(0, e.space_dimension() + 1);
+ result += v;
+ return result;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+ Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+ result -= v;
+ return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ Linear_Expression result(e);
+ neg_assign(result);
+ result += n;
+ return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator*(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ return e * n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+ *e1.impl += *e2.impl;
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, const Variable v) {
+ *e.impl += v;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+ *e1.impl -= *e2.impl;
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, const Variable v) {
+ *e.impl -= v;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl *= n;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ *e.impl /= n;
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+neg_assign(Linear_Expression& e) {
+ e.impl->negate();
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ const Variable v) {
+ e.impl->add_mul_assign(n, v);
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ const Variable v) {
+ e.impl->sub_mul_assign(n, v);
+ return e;
+}
+
+inline void
+add_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2) {
+ e1.impl->add_mul_assign(factor, *e2.impl);
+}
+
+inline void
+sub_mul_assign(Linear_Expression& e1,
+ Coefficient_traits::const_reference factor,
+ const Linear_Expression& e2) {
+ e1.impl->sub_mul_assign(factor, *e2.impl);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(dimension_type i) const {
+ return impl->get(i);
+}
+
+inline void
+Linear_Expression::set(dimension_type i,
+ Coefficient_traits::const_reference n) {
+ impl->set(i, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(Variable v) const {
+ return impl->get(v.space_dimension());
+}
+
+inline void
+Linear_Expression::set(Variable v,
+ Coefficient_traits::const_reference n) {
+ impl->set(v.space_dimension(), n);
+}
+
+inline bool
+Linear_Expression::all_zeroes(dimension_type start, dimension_type end) const {
+ return impl->all_zeroes(start, end);
+}
+
+inline dimension_type
+Linear_Expression::num_zeroes(dimension_type start, dimension_type end) const {
+ return impl->num_zeroes(start, end);
+}
+
+inline Coefficient
+Linear_Expression::gcd(dimension_type start, dimension_type end) const {
+ return impl->gcd(start, end);
+}
+
+inline void
+Linear_Expression
+::exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ impl->exact_div_assign(c, start, end);
+}
+
+inline void
+Linear_Expression
+::mul_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ impl->mul_assign(c, start, end);
+}
+
+inline void
+Linear_Expression::sign_normalize() {
+ impl->sign_normalize();
+}
+
+inline void
+Linear_Expression::negate(dimension_type first, dimension_type last) {
+ impl->negate(first, last);
+}
+
+inline bool
+Linear_Expression::all_zeroes(const Variables_Set& vars) const {
+ return impl->all_zeroes(vars);
+}
+
+inline bool
+Linear_Expression::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start,
+ dimension_type end) const {
+ return impl->all_zeroes_except(vars, start, end);
+}
+
+inline dimension_type
+Linear_Expression::last_nonzero() const {
+ return impl->last_nonzero();
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y) const {
+ scalar_product_assign(result, y, 0, space_dimension() + 1);
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+ dimension_type start, dimension_type end) const {
+ impl->scalar_product_assign(result, *(y.impl), start, end);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y) const {
+ return scalar_product_sign(y, 0, space_dimension() + 1);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y,
+ dimension_type start, dimension_type end) const {
+ return impl->scalar_product_sign(*(y.impl), start, end);
+}
+
+inline dimension_type
+Linear_Expression
+::first_nonzero(dimension_type first, dimension_type last) const {
+ return impl->first_nonzero(first, last);
+}
+
+inline dimension_type
+Linear_Expression
+::last_nonzero(dimension_type first, dimension_type last) const {
+ return impl->last_nonzero(first, last);
+}
+
+inline void
+Linear_Expression
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ return impl->has_a_free_dimension_helper(x);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+ dimension_type start, dimension_type end) const {
+ return impl->is_equal_to(*(x.impl), start, end);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ return impl->is_equal_to(*(x.impl), c1, c2, start, end);
+}
+
+inline void
+Linear_Expression
+::get_row(Dense_Row& row) const {
+ return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::get_row(Sparse_Row& row) const {
+ return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y, dimension_type i) {
+ impl->linear_combine(*y.impl, i);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ impl->linear_combine(*y.impl, c1, c2);
+}
+
+inline void
+Linear_Expression
+::linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ impl->linear_combine_lax(*y.impl, c1, c2);
+}
+
+inline int
+compare(const Linear_Expression& x, const Linear_Expression& y) {
+ return x.impl->compare(*y.impl);
+}
+
+inline bool
+Linear_Expression::is_equal_to(const Linear_Expression& x) const {
+ return impl->is_equal_to(*x.impl);
+}
+
+inline void
+Linear_Expression::linear_combine(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start,
+ dimension_type end) {
+ impl->linear_combine(*y.impl, c1, c2, start, end);
+}
+
+inline void
+Linear_Expression::linear_combine_lax(const Linear_Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start,
+ dimension_type end) {
+ impl->linear_combine_lax(*y.impl, c1, c2, start, end);
+}
+
+inline bool
+Linear_Expression
+::have_a_common_variable(const Linear_Expression& x,
+ Variable first, Variable last) const {
+ return impl->have_a_common_variable(*(x.impl), first, last);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator()
+ : itr(NULL) {
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(const const_iterator& x)
+ : itr(x.itr->clone()) {
+}
+
+inline
+Linear_Expression::const_iterator
+::~const_iterator() {
+ // Note that this does nothing if itr==NULL.
+ delete itr;
+}
+
+inline void
+Linear_Expression::const_iterator::m_swap(const_iterator& x) {
+ using std::swap;
+ swap(itr, x.itr);
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator=(const const_iterator& itr) {
+ const_iterator tmp = itr;
+ using std::swap;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator++() {
+ PPL_ASSERT(itr != NULL);
+ ++(*itr);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator--() {
+ PPL_ASSERT(itr != NULL);
+ --(*itr);
+ return *this;
+}
+
+inline Linear_Expression::const_iterator::reference
+Linear_Expression::const_iterator
+::operator*() const {
+ PPL_ASSERT(itr != NULL);
+ return *(*itr);
+}
+
+inline Variable
+Linear_Expression::const_iterator
+::variable() const {
+ PPL_ASSERT(itr != NULL);
+ return itr->variable();
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator==(const const_iterator& x) const {
+ PPL_ASSERT(itr != NULL);
+ PPL_ASSERT(x.itr != NULL);
+ return *itr == *(x.itr);
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator!=(const const_iterator& x) const {
+ return !(*this == x);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(Linear_Expression_Interface::const_iterator_interface* itr)
+ : itr(itr) {
+ PPL_ASSERT(itr != NULL);
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::begin() const {
+ return const_iterator(impl->begin());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::end() const {
+ return const_iterator(impl->end());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::lower_bound(Variable v) const {
+ return const_iterator(impl->lower_bound(v));
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(e.representation());
+ tmp.set_space_dimension(e.space_dimension());
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ for (typename LE_Adapter::const_iterator i = e.begin(),
+ i_end = e.end(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(r);
+ tmp.set_space_dimension(e.space_dimension());
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ for (typename LE_Adapter::const_iterator i = e.begin(),
+ i_end = e.end(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(e.representation());
+ tmp.set_space_dimension(space_dim);
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ typedef typename LE_Adapter::const_iterator itr_t;
+ itr_t i_end;
+ if (space_dim <= e.space_dimension())
+ i_end = e.lower_bound(Variable(space_dim));
+ else
+ i_end = e.end();
+ for (itr_t i = e.begin(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+ dimension_type space_dim,
+ Representation r,
+ typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+ : impl(NULL) {
+ Linear_Expression tmp(r);
+ tmp.set_space_dimension(space_dim);
+ tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+ typedef typename LE_Adapter::const_iterator itr_t;
+ itr_t i_end;
+ if (space_dim <= e.space_dimension())
+ i_end = e.lower_bound(Variable(space_dim));
+ else
+ i_end = e.end();
+ for (itr_t i = e.begin(); i != i_end; ++i)
+ add_mul_assign(tmp, *i, i.variable());
+ using std::swap;
+ swap(impl, tmp.impl);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression& e) {
+ e.impl->print(s);
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Linear_Expression& x, Linear_Expression& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Linear_Expression::const_iterator */
+inline void
+swap(Linear_Expression::const_iterator& x,
+ Linear_Expression::const_iterator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 927. */
+
+/* Automatically generated from PPL source file ../src/Topology_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum Topology {
+ NECESSARILY_CLOSED = 0,
+ NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 1. */
+/* Expression_Hide_Last class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression that maybe hides the last coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Last
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Hide_Last<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Constructor.
+ explicit Expression_Hide_Last(const raw_type& expr, bool hide_last);
+
+ //! Iterator pointing after the last nonzero variable coefficient.
+ const_iterator end() const;
+
+ //! Iterator pointing to the first nonzero variable coefficient
+ //! of a variable bigger than or equal to \p v.
+ const_iterator lower_bound(Variable v) const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous
+ terms of \p *this are zero.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ //! Returns the \p i -th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of variable \p v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ //! Returns the number of zero coefficient in [start, end).
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end).
+ Returns zero if all the coefficients in the range are zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last),
+ //! or \p last if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there are no
+ //! nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+
+ //! Returns \c true if there is a variable in [first,last) whose coefficient
+ //! is nonzero in both \p *this and \p y.
+ template <typename Expression>
+ bool have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const;
+
+private:
+ //! Whether or not the last coefficient is hidden.
+ const bool hide_last_;
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_inlines.hh line 1. */
+/* Expression_Hide_Last class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Hide_Last<T>::Expression_Hide_Last(const raw_type& expr,
+ const bool hide_last)
+ : base_type(expr), hide_last_(hide_last) {
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::space_dimension() const {
+ dimension_type dim = this->inner().space_dimension();
+ if (hide_last_) {
+ PPL_ASSERT(dim > 0);
+ --dim;
+ }
+ return dim;
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::end() const {
+ if (hide_last_) {
+ return this->inner().lower_bound(Variable(space_dimension()));
+ }
+ else {
+ return this->inner().end();
+ }
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::lower_bound(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension() + 1);
+ return this->inner().lower_bound(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::coefficient(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ return this->inner().coefficient(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::is_zero() const {
+ return this->inner().all_zeroes(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_homogeneous_terms_are_zero() const {
+ return this->inner().all_zeroes(1, space_dimension() + 1);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y) const {
+ const dimension_type x_dim = space_dimension();
+ const dimension_type y_dim = y.space_dimension();
+ if (x_dim != y_dim)
+ return false;
+ return is_equal_to(y, 0, x_dim + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(const Variables_Set& vars) const {
+ PPL_ASSERT(vars.space_dimension() <= space_dimension());
+ return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(dimension_type i) const {
+ PPL_ASSERT(i <= space_dimension());
+ return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(Variable v) const {
+ PPL_ASSERT(v.space_dimension() <= space_dimension());
+ return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Last<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero() const {
+ return this->inner().last_nonzero(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ PPL_ASSERT(last <= space_dimension() + 1);
+ return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ PPL_ASSERT(last <= space_dimension() + 1);
+ return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+ if (x.empty())
+ return;
+ PPL_ASSERT(*(--x.end()) <= space_dimension());
+ this->inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ PPL_ASSERT(end <= y.space_dimension() + 1);
+ return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ PPL_ASSERT(end <= space_dimension() + 1);
+ PPL_ASSERT(end <= y.space_dimension() + 1);
+ return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Dense_Row& row) const {
+ this->inner().get_row(row);
+ if (hide_last_) {
+ PPL_ASSERT(row.size() != 0);
+ row.resize(row.size() - 1);
+ }
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Sparse_Row& row) const {
+ this->inner().get_row(row);
+ if (hide_last_) {
+ PPL_ASSERT(row.size() != 0);
+ row.resize(row.size() - 1);
+ }
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::have_a_common_variable(const Expression& y,
+ Variable first, Variable last) const {
+ PPL_ASSERT(last.space_dimension() <= space_dimension() + 1);
+ PPL_ASSERT(last.space_dimension() <= y.space_dimension() + 1);
+ return this->inner().have_a_common_variable(y, first, last);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 164. */
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 40. */
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Constraint
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Constraint& x, const Constraint& y);
+
+}
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Constraint is either:
+ - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+ where \f$n\f$ is the dimension of the space,
+ \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+ and \f$b\f$ is the integer inhomogeneous term.
+
+ \par How to build a constraint
+ Constraints are typically built by applying a relation symbol
+ to a pair of linear expressions.
+ Available relation symbols are equality (<CODE>==</CODE>),
+ non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+ strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+ The space dimension of a constraint is defined as the maximum
+ space dimension of the arguments of its constructor.
+
+ \par
+ In the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds the equality constraint
+ \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+ \code
+ Constraint eq_c(3*x + 5*y - z == 0);
+ \endcode
+ The following code builds the (non-strict) inequality constraint
+ \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+ \code
+ Constraint ineq_c(4*x >= 2*y - 13);
+ \endcode
+ The corresponding strict inequality constraint
+ \f$4x > 2y - 13\f$ is obtained as follows:
+ \code
+ Constraint strict_ineq_c(4*x > 2*y - 13);
+ \endcode
+ An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+ can be specified as follows:
+ \code
+ Constraint false_c = Constraint::zero_dim_false();
+ \endcode
+ Equivalent, but more involved ways are the following:
+ \code
+ Constraint false_c1(Linear_Expression::zero() == 1);
+ Constraint false_c2(Linear_Expression::zero() >= 1);
+ Constraint false_c3(Linear_Expression::zero() > 0);
+ \endcode
+ In contrast, the following code defines an unsatisfiable constraint
+ having space dimension \f$3\f$:
+ \code
+ Constraint false_c(0*z == 1);
+ \endcode
+
+ \par How to inspect a constraint
+ Several methods are provided to examine a constraint and extract
+ all the encoded information: its space dimension, its type
+ (equality, non-strict inequality, strict inequality) and
+ the value of its integer coefficients.
+
+ \par Example 2
+ The following code shows how it is possible to access each single
+ coefficient of a constraint. Given an inequality constraint
+ (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+ corresponding to its complement (thus, in this case we want to obtain
+ the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+ \code
+ Constraint c1(x - 5*y + 3*z <= 4);
+ cout << "Constraint c1: " << c1 << endl;
+ if (c1.is_equality())
+ cout << "Constraint c1 is not an inequality." << endl;
+ else {
+ Linear_Expression e;
+ for (dimension_type i = c1.space_dimension(); i-- > 0; )
+ e += c1.coefficient(Variable(i)) * Variable(i);
+ e += c1.inhomogeneous_term();
+ Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+ cout << "Complement c2: " << c2 << endl;
+ }
+ \endcode
+ The actual output is the following:
+ \code
+ Constraint c1: -A + 5*B - 3*C >= -4
+ Complement c2: A - 5*B + 3*C > 4
+ \endcode
+ Note that, in general, the particular output obtained can be
+ syntactically different from the (semantically equivalent)
+ constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint {
+public:
+
+ //! The constraint type.
+ enum Type {
+ /*! The constraint is an equality. */
+ EQUALITY,
+ /*! The constraint is a non-strict inequality. */
+ NONSTRICT_INEQUALITY,
+ /*! The constraint is a strict inequality. */
+ STRICT_INEQUALITY
+ };
+
+ //! The representation used for new Constraints.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Constructs the \f$0<=0\f$ constraint.
+ explicit Constraint(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The new Constraint will have the same representation as `c',
+ not default_representation, so that they are indistinguishable.
+ */
+ Constraint(const Constraint& c);
+
+ //! Copy constructor with given size.
+ /*!
+ \note The new Constraint will have the same representation as `c',
+ not default_representation, so that they are indistinguishable.
+ */
+ Constraint(const Constraint& c, dimension_type space_dim);
+
+ //! Copy constructor with given representation.
+ Constraint(const Constraint& c, Representation r);
+
+ //! Copy constructor with given size and representation.
+ Constraint(const Constraint& c, dimension_type space_dim,
+ Representation r);
+
+ //! Copy-constructs from equality congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p cg is a proper congruence.
+ */
+ explicit Constraint(const Congruence& cg,
+ Representation r = default_representation);
+
+ //! Destructor.
+ ~Constraint();
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Assignment operator.
+ Constraint& operator=(const Constraint& c);
+
+ //! Returns the maximum space dimension a Constraint can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the constraint.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ Always returns \p true. The return value is needed for compatibility with
+ the Generator class.
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the constraint.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Returns the constraint type of \p *this.
+ Type type() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is an equality constraint.
+ */
+ bool is_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is an inequality constraint (either strict or non-strict).
+ */
+ bool is_inequality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a non-strict inequality constraint.
+ */
+ bool is_nonstrict_inequality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a strict inequality constraint.
+ */
+ bool is_strict_inequality() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument thrown if the index of \p v
+ is greater than or equal to the space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+ static const Constraint& zero_dim_false();
+
+ /*! \brief
+ The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+ also known as <EM>positivity constraint</EM>.
+ */
+ static const Constraint& zero_dim_positivity();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is a tautology (i.e., an always true constraint).
+
+ A tautology can have either one of the following forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+ where \f$b \geq 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+ where \f$b > 0\f$.
+ */
+ bool is_tautological() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is inconsistent (i.e., an always false constraint).
+
+ An inconsistent constraint can have either one of the following forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+ where \f$b \neq 0\f$; or
+ - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+ where \f$b < 0\f$; or
+ - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+ where \f$b \leq 0\f$.
+ */
+ bool is_inconsistent() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are equivalent constraints.
+
+ Constraints having different space dimensions are not equivalent.
+ Note that constraints having different types may nonetheless be
+ equivalent, if they both are tautologies or inconsistent.
+ */
+ bool is_equivalent_to(const Constraint& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent constraints.
+ */
+ bool is_equal_to(const Constraint& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constraint& y);
+
+ //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+ static const Constraint& epsilon_geq_zero();
+
+ /*! \brief
+ The zero-dimension space constraint \f$\epsilon \leq 1\f$
+ (used to implement NNC polyhedra).
+ */
+ static const Constraint& epsilon_leq_one();
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Linear_Expression> expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+
+ //! The possible kinds of Constraint objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ Linear_Expression expr;
+
+ Kind kind_;
+
+ Topology topology_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+ */
+ static const Constraint* zero_dim_false_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+ known as <EM>positivity constraint</EM>.
+ */
+ static const Constraint* zero_dim_positivity_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+ */
+ static const Constraint* epsilon_geq_zero_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the zero-dimension space constraint \f$\epsilon \leq 1\f$
+ (used to implement NNC polyhedra).
+ */
+ static const Constraint* epsilon_leq_one_p;
+
+ //! Constructs the \f$0<0\f$ constraint.
+ Constraint(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a constraint of kind \p kind and topology \p topology,
+ stealing the coefficients from \p e.
+
+ \note The new Constraint will have the same representation as `e'.
+ */
+ Constraint(Linear_Expression& e, Kind kind, Topology topology);
+
+ /*! \brief
+ Builds a constraint of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+
+ \note The new Constraint will have the same representation as `e'.
+ */
+ Constraint(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ // TODO: Consider setting the epsilon dimension in this method.
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+ //@} // Flags coercion methods
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ error message \p message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* message) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ Variable v) const;
+
+ //! Returns the epsilon coefficient. The constraint must be NNC.
+ Coefficient_traits::const_reference epsilon_coefficient() const;
+
+ //! Sets the epsilon coefficient to \p n. The constraint must be NNC.
+ void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+ void set_is_equality();
+
+ //! Sets the constraint to be an inequality.
+ /*!
+ Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+ or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+ of the low-level coefficients of the constraint.
+ */
+ void set_is_inequality();
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Constraint that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Constraint to \p *this and normalizes it.
+ */
+ void linear_combine(const Constraint& y, dimension_type i);
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Constraint objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Constraint::normalize() and Constraint::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ /*! \brief
+ Builds a new copy of the zero-dimension space constraint
+ \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+ */
+ static Constraint construct_epsilon_geq_zero();
+
+ friend int
+ compare(const Constraint& x, const Constraint& y);
+
+ friend class Linear_System<Constraint>;
+ friend class Constraint_System;
+ friend class Polyhedron;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+ friend class Termination_Helpers;
+ friend class Grid;
+ template <typename T>
+ friend class Octagonal_Shape;
+
+ friend Constraint
+ operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator<(Variable v1, Variable v2);
+
+ friend Constraint
+ operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator>(Variable v1, Variable v2);
+
+ friend Constraint
+ operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator==(Variable v1, Variable v2);
+
+ friend Constraint
+ operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator<=(Variable v1, Variable v2);
+
+ friend Constraint
+ operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+ friend Constraint
+ operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Constraint
+ operator>=(Variable v1, Variable v2);
+
+ friend Constraint
+ operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+ friend Constraint
+ operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+/*! \relates Constraint */
+void swap(Constraint& x, Constraint& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_inlines.hh line 1. */
+/* Constraint class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Constraint::is_necessarily_closed() const {
+ return (topology_ == NECESSARILY_CLOSED);
+}
+
+inline bool
+Constraint::is_not_necessarily_closed() const {
+ return !is_necessarily_closed();
+}
+
+inline Constraint::expr_type
+Constraint::expression() const {
+ return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline void
+Constraint::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Constraint::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Constraint::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Constraint::topology() const {
+ return topology_;
+}
+
+inline void
+Constraint::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Constraint::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Constraint::set_topology(Topology x) {
+ if (topology() == x)
+ return;
+ if (topology() == NECESSARILY_CLOSED) {
+ // Add a column for the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ }
+ else {
+ PPL_ASSERT(expr.space_dimension() != 0);
+ expr.set_space_dimension(expr.space_dimension() - 1);
+ }
+ topology_ = x;
+}
+
+inline void
+Constraint::mark_as_necessarily_closed() {
+ PPL_ASSERT(is_not_necessarily_closed());
+ topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(is_necessarily_closed());
+ topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Constraint::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Constraint::Constraint(Representation r)
+ : expr(r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY),
+ topology_(NECESSARILY_CLOSED) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r)
+ : expr(r),
+ kind_(kind),
+ topology_(topology) {
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Kind kind, Topology topology)
+ : kind_(kind),
+ topology_(topology) {
+ PPL_ASSERT(kind != RAY_OR_POINT_OR_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ // Add the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ strong_normalize();
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology)
+ : topology_(topology) {
+ PPL_ASSERT(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ if (type == EQUALITY)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ strong_normalize();
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+ : expr(c.expr),
+ kind_(c.kind_),
+ topology_(c.topology_) {
+ // NOTE: This does not call PPL_ASSERT(OK()) because this is called by OK().
+}
+
+inline
+Constraint::Constraint(const Constraint& c, Representation r)
+ : expr(c.expr, r),
+ kind_(c.kind_),
+ topology_(c.topology_) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim)
+ : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+ kind_(c.kind_), topology_(c.topology_) {
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim,
+ Representation r)
+ : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+ kind_(c.kind_), topology_(c.topology_) {
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+ Constraint tmp = c;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Representation
+Constraint::representation() const {
+ return expr.representation();
+}
+
+inline void
+Constraint::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Constraint::set_space_dimension_no_ok(dimension_type space_dim) {
+ const dimension_type old_expr_space_dim = expr.space_dimension();
+ if (topology() == NECESSARILY_CLOSED) {
+ expr.set_space_dimension(space_dim);
+ }
+ else {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+ if (expr.space_dimension() < old_expr_space_dim)
+ strong_normalize();
+}
+
+inline void
+Constraint::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline bool
+Constraint::remove_space_dimensions(const Variables_Set& vars) {
+ expr.remove_space_dimensions(vars);
+ return true;
+}
+
+inline bool
+Constraint::is_equality() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+ if (is_equality())
+ return EQUALITY;
+ if (is_necessarily_closed())
+ return NONSTRICT_INEQUALITY;
+ if (epsilon_coefficient() < 0)
+ return STRICT_INEQUALITY;
+ else
+ return NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+ return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+ return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+ set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+ return expr.inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Constraint::strong_normalize() {
+ expr.normalize();
+ sign_normalize();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+ return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1,
+ std::max(e1.space_dimension(), e2.space_dimension()),
+ Constraint::default_representation);
+ diff -= e2;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Variable v1, Variable v2) {
+ if (v1.space_dimension() > v2.space_dimension())
+ swap(v1, v2);
+ PPL_ASSERT(v1.space_dimension() <= v2.space_dimension());
+
+ Linear_Expression diff(v1, Constraint::default_representation);
+ diff -= v2;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1,
+ std::max(e1.space_dimension(), e2.space_dimension()),
+ Constraint::default_representation);
+ diff -= e2;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+ Linear_Expression diff(Constraint::default_representation);
+ diff.set_space_dimension(std::max(v1.space_dimension(),
+ v2.space_dimension()));
+ diff += v1;
+ diff -= v2;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff(e1, Constraint::default_representation);
+ diff -= e2;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Variable v1, const Variable v2) {
+ Linear_Expression diff(Constraint::default_representation);
+ diff.set_space_dimension(std::max(v1.space_dimension(),
+ v2.space_dimension()));
+ diff += v1;
+ diff -= v2;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ neg_assign(diff);
+ diff += n;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff(e, Constraint::default_representation);
+ diff -= n;
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+ // NOTE: this also enforces normalization.
+ c.set_epsilon_coefficient(-1);
+ PPL_ASSERT(c.OK());
+
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+ return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Variable v1, const Variable v2) {
+ return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+ PPL_ASSERT(zero_dim_false_p != 0);
+ return *zero_dim_false_p;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+ PPL_ASSERT(zero_dim_positivity_p != 0);
+ return *zero_dim_positivity_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+ PPL_ASSERT(epsilon_geq_zero_p != 0);
+ return *epsilon_geq_zero_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+ PPL_ASSERT(epsilon_leq_one_p != 0);
+ return *epsilon_leq_one_p;
+}
+
+inline void
+Constraint::m_swap(Constraint& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+ swap(topology_, y.topology_);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::epsilon_coefficient() const {
+ PPL_ASSERT(is_not_necessarily_closed());
+ return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+inline void
+Constraint::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+ PPL_ASSERT(is_not_necessarily_closed());
+ expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+/*! \relates Constraint */
+inline void
+swap(Constraint& x, Constraint& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 835. */
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 1. */
+/* Generator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+class Generator_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 38. */
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 1. */
+/* Class declarations for several distances.
+*/
+
+
+/* Automatically generated from PPL source file ../src/distances_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 29. */
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+ static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+ static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+ static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+ static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+ static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+ static void finalize(Temp&, Rounding_Dir);
+};
+
+/* Automatically generated from PPL source file ../src/distances_inlines.hh line 1. */
+/* Inline functions implementing distances.
+*/
+
+
+/* Automatically generated from PPL source file ../src/distances_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+ static inline Result
+ function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+ // When `To' and `From' are different types, we make the conversion
+ // and use `tmp'.
+ top = &tmp;
+ return assign_r(tmp, from, dir);
+ }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+ static inline Result
+ function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+ // When the types are the same, conversion is unnecessary.
+ top = &from;
+ return V_EQ;
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Assigns to \p top a pointer to a location that holds the
+ conversion, according to \p dir, of \p from to type \p To. When
+ necessary, and only when necessary, the variable \p tmp is used to
+ hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+ return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+ const Temp& current,
+ Rounding_Dir dir) {
+ add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+ Temp& current,
+ Rounding_Dir dir) {
+ mul_assign_r(current, current, current, dir);
+ add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+ Rounding_Dir dir) {
+ sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+ const Temp& current,
+ Rounding_Dir) {
+ if (current > running)
+ running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 53. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 1. */
+/* Expression_Hide_Inhomo class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ An adapter for Linear_Expression that hides the inhomogeneous term.
+
+ The methods of this class always pretend that the value of the
+ inhomogeneous term is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Inhomo
+ : public Expression_Adapter<T> {
+ typedef Expression_Adapter<T> base_type;
+public:
+ //! The type of this object.
+ typedef Expression_Hide_Inhomo<T> const_reference;
+ //! The type obtained by one-level unwrapping.
+ typedef typename base_type::inner_type inner_type;
+ //! The raw, completely unwrapped type.
+ typedef typename base_type::raw_type raw_type;
+
+ //! Constructor.
+ explicit Expression_Hide_Inhomo(const raw_type& expr);
+
+public:
+ //! The type of const iterators on coefficients.
+ typedef typename base_type::const_iterator const_iterator;
+
+ //! Returns the constant zero.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+ bool is_zero() const;
+
+ /*! \brief Returns \p true if \p *this is equal to \p y.
+
+ Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+ */
+ template <typename Expression>
+ bool is_equal_to(const Expression& y) const;
+
+ //! Returns the i-th coefficient.
+ Coefficient_traits::const_reference get(dimension_type i) const;
+
+ //! Returns the coefficient of v.
+ Coefficient_traits::const_reference get(Variable v) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the coefficient of each variable in
+ \p vars is zero.
+ */
+ bool all_zeroes(const Variables_Set& vars) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if (*this)[i] is zero,
+ for each i in [start, end).
+ */
+ bool all_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the number of zero coefficient in [start, end).
+ */
+ dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+ /*! \brief
+ Returns the gcd of the nonzero coefficients in [start,end). If all the
+ coefficients in this range are zero, returns zero.
+ */
+ Coefficient gcd(dimension_type start, dimension_type end) const;
+
+ //! Returns the index of the last nonzero element, or zero if there are no
+ //! nonzero elements.
+ dimension_type last_nonzero() const;
+
+ //! Returns the index of the last nonzero element in [first,last), or last
+ //! if there are no nonzero elements.
+ dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+ //! Returns the index of the first nonzero element, or \p last if there
+ //! are no nonzero elements, considering only elements in [first,last).
+ dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if all coefficients in [start,end),
+ except those corresponding to variables in \p vars, are zero.
+ */
+ bool all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const;
+
+ //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+ void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+ //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+ //! for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const;
+
+ //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+ //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+ template <typename Expression>
+ bool is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Dense_Row& row) const;
+
+ //! Sets \p row to a copy of the row as adapted by \p *this.
+ void get_row(Sparse_Row& row) const;
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_inlines.hh line 1. */
+/* Expression_Hide_Inhomo class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Expression_Hide_Inhomo<T>::Expression_Hide_Inhomo(const raw_type& expr)
+ : base_type(expr) {
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::inhomogeneous_term() const {
+ // Pretend it is zero.
+ return Coefficient_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::is_zero() const {
+ // Don't check the inhomogeneous_term (i.e., pretend it is zero).
+ return this->inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y) const {
+ const dimension_type x_dim = this->space_dimension();
+ const dimension_type y_dim = y.space_dimension();
+ if (x_dim != y_dim)
+ return false;
+ if (y.inhomogeneous_term() != 0)
+ return false;
+ // Note that the inhomogeneous term is not compared.
+ return this->inner().is_equal_to(y, 1, x_dim + 1);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(dimension_type i) const {
+ if (i == 0)
+ return Coefficient_zero();
+ else
+ return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(Variable v) const {
+ return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes(const Variables_Set& vars) const {
+ return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::all_zeroes(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::num_zeroes(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return 0;
+ dimension_type nz = 0;
+ if (start == 0) {
+ ++start;
+ ++nz;
+ }
+ nz += this->inner().num_zeroes(start, end);
+ return nz;
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Inhomo<T>::gcd(dimension_type start,
+ dimension_type end) const {
+ if (start == end)
+ return Coefficient_zero();
+ if (start == 0)
+ ++start;
+ return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero() const {
+ return this->inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero(dimension_type first,
+ dimension_type last) const {
+ if (first == last)
+ return last;
+ if (first == 0)
+ ++first;
+ return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::first_nonzero(dimension_type first,
+ dimension_type last) const {
+ if (first == last)
+ return last;
+ if (first == 0)
+ ++first;
+ return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes_except(const Variables_Set& vars,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& y) const {
+ bool had_0 = (y.count(0) == 1);
+ this->inner().has_a_free_dimension_helper(y);
+ if (had_0)
+ y.insert(0);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ if (start == end)
+ return true;
+ if (start == 0)
+ ++start;
+ return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Dense_Row& row) const {
+ this->inner().get_row(row);
+ row.reset(0);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Sparse_Row& row) const {
+ this->inner().get_row(row);
+ row.reset(0);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 146. */
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 46. */
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Generator
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Generator& x, const Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Generator */
+void swap(Generator& x, Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Generator is one of the following:
+
+ - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a point
+ \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ - a closure point
+ \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ where \f$n\f$ is the dimension of the space
+ and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+ \par A note on terminology.
+ As observed in Section \ref representation, there are cases when,
+ in order to represent a polyhedron \f$\cP\f$ using the generator system
+ \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+ \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+ of \f$\cP\f$.
+ This situation is even more frequent when working with NNC polyhedra
+ and it is the reason why we prefer to use the word `point'
+ where other libraries use the word `vertex'.
+
+ \par How to build a generator.
+ Each type of generator is built by applying the corresponding
+ function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+ or <CODE>closure_point</CODE>) to a linear expression,
+ representing a direction in the space;
+ the space dimension of the generator is defined as the space dimension
+ of the corresponding linear expression.
+ Linear expressions used to define a generator should be homogeneous
+ (any constant term will be simply ignored).
+ When defining points and closure points, an optional Coefficient argument
+ can be used as a common <EM>divisor</EM> for all the coefficients
+ occurring in the provided linear expression;
+ the default value for this argument is 1.
+
+ \par
+ In all the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a line with direction \f$x-y-z\f$
+ and having space dimension \f$3\f$:
+ \code
+ Generator l = line(x - y - z);
+ \endcode
+ As mentioned above, the constant term of the linear expression
+ is not relevant. Thus, the following code has the same effect:
+ \code
+ Generator l = line(x - y - z + 15);
+ \endcode
+ By definition, the origin of the space is not a line, so that
+ the following code throws an exception:
+ \code
+ Generator l = line(0*x);
+ \endcode
+
+ \par Example 2
+ The following code builds a ray with the same direction as the
+ line in Example 1:
+ \code
+ Generator r = ray(x - y - z);
+ \endcode
+ As is the case for lines, when specifying a ray the constant term
+ of the linear expression is not relevant; also, an exception is thrown
+ when trying to build a ray from the origin of the space.
+
+ \par Example 3
+ The following code builds the point
+ \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+ \code
+ Generator p = point(1*x + 0*y + 2*z);
+ \endcode
+ The same effect can be obtained by using the following code:
+ \code
+ Generator p = point(x + 2*z);
+ \endcode
+ Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+ using either one of the following lines of code:
+ \code
+ Generator origin3 = point(0*x + 0*y + 0*z);
+ Generator origin3_alt = point(0*z);
+ \endcode
+ Note however that the following code would have defined
+ a different point, namely \f$\vect{0} \in \Rset^2\f$:
+ \code
+ Generator origin2 = point(0*y);
+ \endcode
+ The following two lines of code both define the only point
+ having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+ In the second case we exploit the fact that the first argument
+ of the function <CODE>point</CODE> is optional.
+ \code
+ Generator origin0 = Generator::zero_dim_point();
+ Generator origin0_alt = point();
+ \endcode
+
+ \par Example 4
+ The point \f$\vect{p}\f$ specified in Example 3 above
+ can also be obtained with the following code,
+ where we provide a non-default value for the second argument
+ of the function <CODE>point</CODE> (the divisor):
+ \code
+ Generator p = point(2*x + 0*y + 4*z, 2);
+ \endcode
+ Obviously, the divisor can be usefully exploited to specify
+ points having some non-integer (but rational) coordinates.
+ For instance, the point
+ \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be specified by the following code:
+ \code
+ Generator q = point(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par Example 5
+ Closure points are specified in the same way we defined points,
+ but invoking their specific constructor function.
+ For instance, the closure point
+ \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+ \code
+ Generator c = closure_point(1*x + 0*y + 2*z);
+ \endcode
+ For the particular case of the (only) closure point
+ having space dimension zero, we can use any of the following:
+ \code
+ Generator closure_origin0 = Generator::zero_dim_closure_point();
+ Generator closure_origin0_alt = closure_point();
+ \endcode
+
+ \par How to inspect a generator
+ Several methods are provided to examine a generator and extract
+ all the encoded information: its space dimension, its type and
+ the value of its integer coefficients.
+
+ \par Example 6
+ The following code shows how it is possible to access each single
+ coefficient of a generator.
+ If <CODE>g1</CODE> is a point having coordinates
+ \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+ we construct the closure point <CODE>g2</CODE> having coordinates
+ \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+ \code
+ if (g1.is_point()) {
+ cout << "Point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (dimension_type i = g1.space_dimension(); i-- > 0; )
+ e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+ Generator g2 = closure_point(e, g1.divisor());
+ cout << "Closure point g2: " << g2 << endl;
+ }
+ else
+ cout << "Generator g1 is not a point." << endl;
+ \endcode
+ Therefore, for the point
+ \code
+ Generator g1 = point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Point g1: p((2*A - B + 3*C)/2)
+ Closure point g2: cp((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with (closure) points, be careful not to confuse
+ the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+ these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator {
+public:
+
+ //! The representation used for new Generators.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Generator line(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the ray of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Generator ray(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Generator point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the origin.
+ static Generator point(Representation r);
+
+ //! Returns the point at \p e.
+ static Generator point(const Linear_Expression& e,
+ Representation r);
+
+ //! Constructs the point at the origin.
+ explicit Generator(Representation r = default_representation);
+
+ //! Returns the closure point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Generator
+ closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the closure point at the origin.
+ static Generator
+ closure_point(Representation r);
+
+ //! Returns the closure point at \p e.
+ static Generator
+ closure_point(const Linear_Expression& e, Representation r);
+
+ //! Ordinary copy constructor.
+ //! The representation of the new Generator will be the same as g.
+ Generator(const Generator& g);
+
+ //! Copy constructor with given representation.
+ Generator(const Generator& g, Representation r);
+
+ //! Copy constructor with given space dimension.
+ //! The representation of the new Generator will be the same as g.
+ Generator(const Generator& g, dimension_type space_dim);
+
+ //! Copy constructor with given representation and space dimension.
+ Generator(const Generator& g, dimension_type space_dim, Representation r);
+
+ //! Destructor.
+ ~Generator();
+
+ //! Assignment operator.
+ Generator& operator=(const Generator& g);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Generator can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the generator.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ If all dimensions with nonzero coefficients are removed from a ray or a
+ line, it is changed into a point and this method returns \p false .
+ Otherwise, it returns \p true .
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the generator.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a line. */
+ LINE,
+ /*! The generator is a ray. */
+ RAY,
+ /*! The generator is a point. */
+ POINT,
+ /*! The generator is a closure point. */
+ CLOSURE_POINT
+ };
+
+ //! Returns the generator type of \p *this.
+ Type type() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+ bool is_line() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+ bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_line_or_ray() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+ bool is_point() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+ bool is_closure_point() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the index of \p v is greater than or equal to the
+ space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! If \p *this is either a point or a closure point, returns its divisor.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is neither a point nor a closure point.
+ */
+ Coefficient_traits::const_reference divisor() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ static const Generator& zero_dim_point();
+
+ /*! \brief
+ Returns, as a closure point,
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Generator& zero_dim_closure_point();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are equivalent generators.
+
+ Generators having different space dimensions are not equivalent.
+ */
+ bool is_equivalent_to(const Generator& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent generators.
+ */
+ bool is_equal_to(const Generator& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Generator& y);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+ expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+ //! The possible kinds of Generator objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ //! The linear expression encoding \p *this.
+ Linear_Expression expr;
+
+ //! The kind of \p *this.
+ Kind kind_;
+
+ //! The topology of \p *this.
+ Topology topology_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Generator* zero_dim_point_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+ */
+ static const Generator* zero_dim_closure_point_p;
+
+ /*! \brief
+ Builds a generator of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+
+ If the topology is NNC, the last dimension of \p e is used as the epsilon
+ coefficient.
+ */
+ Generator(Linear_Expression& e, Type type, Topology topology);
+
+ Generator(Linear_Expression& e, Kind kind, Topology topology);
+
+ Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+ //@} // Flags coercion methods
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Generator that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Generator to \p *this and normalizes it.
+ */
+ void linear_combine(const Generator& y, dimension_type i);
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ Variable v) const;
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception
+ containing the appropriate error message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* reason) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+ bool is_ray_or_point() const;
+
+ //! Sets the Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_ray_or_point();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the closure point
+ \p *this has the same \e coordinates of the point \p p.
+
+ It is \e assumed that \p *this is a closure point, \p p is a point
+ and both topologies and space dimensions agree.
+ */
+ bool is_matching_closure_point(const Generator& p) const;
+
+ //! Returns the epsilon coefficient. The generator must be NNC.
+ Coefficient_traits::const_reference epsilon_coefficient() const;
+
+ //! Sets the epsilon coefficient to \p n. The generator must be NNC.
+ void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Generator objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Generator::normalize() and Generator::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ /*! \brief
+ A print function, with fancy, more human-friendly output.
+
+ This is used by operator<<().
+ */
+ void fancy_print(std::ostream& s) const;
+
+ friend class Expression_Adapter<Generator>;
+ friend class Linear_System<Generator>;
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+ friend class Parma_Polyhedra_Library::Generator_System;
+ friend class Parma_Polyhedra_Library::Generator_System_const_iterator;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ // This is for access to Linear_Expression in `insert'.
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+ friend class Parma_Polyhedra_Library::MIP_Problem;
+ friend class Parma_Polyhedra_Library::Grid;
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Generator& g);
+
+ friend int
+ compare(const Generator& x, const Generator& y);
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator::line(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e,
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::ray(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e,
+ Representation r = Generator::default_representation);
+
+/*! \brief
+ Shorthand for
+ Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::point(Representation r).
+/*! \relates Generator */
+Generator
+point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::point(const Linear_Expression& e, Representation r).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e, Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::closure_point(Representation r).
+/*! \relates Generator */
+Generator
+closure_point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Generator::closure_point(const Linear_Expression& e, Representation r).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+
+ \note
+ Distances are \e only defined between generators that are points and/or
+ closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Generator_inlines.hh line 1. */
+/* Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Generator::is_necessarily_closed() const {
+ return (topology() == NECESSARILY_CLOSED);
+}
+
+inline bool
+Generator::is_not_necessarily_closed() const {
+ return (topology() == NOT_NECESSARILY_CLOSED);
+}
+
+inline Generator::expr_type
+Generator::expression() const {
+ return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline bool
+Generator::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Generator::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Generator::topology() const {
+ return topology_;
+}
+
+inline void
+Generator::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Generator::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Generator::set_topology(Topology x) {
+ if (topology() == x)
+ return;
+ if (topology() == NECESSARILY_CLOSED) {
+ // Add a column for the epsilon dimension.
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ }
+ else {
+ PPL_ASSERT(expr.space_dimension() > 0);
+ expr.set_space_dimension(expr.space_dimension() - 1);
+ }
+ topology_ = x;
+}
+
+inline void
+Generator::mark_as_necessarily_closed() {
+ PPL_ASSERT(is_not_necessarily_closed());
+ topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(is_necessarily_closed());
+ topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Generator::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Generator::Generator(Representation r)
+ : expr(r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY),
+ topology_(NECESSARILY_CLOSED) {
+ expr.set_inhomogeneous_term(Coefficient_one());
+ PPL_ASSERT(space_dimension() == 0);
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r)
+ : expr(r),
+ kind_(kind),
+ topology_(topology) {
+ if (is_necessarily_closed())
+ expr.set_space_dimension(space_dim);
+ else
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology)
+ : topology_(topology) {
+ PPL_ASSERT(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ if (type == LINE)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ strong_normalize();
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Kind kind, Topology topology)
+ : kind_(kind),
+ topology_(topology) {
+ swap(expr, e);
+ if (topology == NOT_NECESSARILY_CLOSED)
+ expr.set_space_dimension(expr.space_dimension() + 1);
+ strong_normalize();
+}
+
+inline
+Generator::Generator(const Generator& g)
+ : expr(g.expr),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+}
+
+inline
+Generator::Generator(const Generator& g, Representation r)
+ : expr(g.expr, r),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ // This does not assert OK() because it's called by OK().
+ PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim)
+ : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim,
+ Representation r)
+ : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+ kind_(g.kind_),
+ topology_(g.topology_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+ Generator tmp = g;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Representation
+Generator::representation() const {
+ return expr.representation();
+}
+
+inline void
+Generator::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+ const dimension_type old_expr_space_dim = expr.space_dimension();
+ if (topology() == NECESSARILY_CLOSED) {
+ expr.set_space_dimension(space_dim);
+ }
+ else {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+ if (expr.space_dimension() < old_expr_space_dim)
+ strong_normalize();
+}
+
+inline void
+Generator::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Generator::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Generator::is_line() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+ return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+ return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+ if (is_line())
+ return LINE;
+ if (is_line_or_ray())
+ return RAY;
+ if (is_necessarily_closed())
+ return POINT;
+ else {
+ // Checking the value of the epsilon coefficient.
+ if (epsilon_coefficient() == 0)
+ return CLOSURE_POINT;
+ else
+ return POINT;
+ }
+}
+
+inline bool
+Generator::is_point() const {
+ return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+ return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+ set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+ Coefficient_traits::const_reference d = expr.inhomogeneous_term();
+ if (!is_ray_or_point() || d == 0)
+ throw_invalid_argument("divisor()",
+ "*this is neither a point nor a closure point");
+ return d;
+}
+
+inline Coefficient_traits::const_reference
+Generator::epsilon_coefficient() const {
+ PPL_ASSERT(is_not_necessarily_closed());
+ return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+
+inline void
+Generator::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+ PPL_ASSERT(is_not_necessarily_closed());
+ expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Generator::strong_normalize() {
+ expr.normalize();
+ sign_normalize();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ return *zero_dim_point_p;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+ PPL_ASSERT(zero_dim_closure_point_p != 0);
+ return *zero_dim_closure_point_p;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e, Representation r) {
+ return Generator::line(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e, Representation r) {
+ return Generator::ray(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d,
+ Representation r) {
+ return Generator::point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(Representation r) {
+ return Generator::point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Representation r) {
+ return Generator::point(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d,
+ Representation r) {
+ return Generator::closure_point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(Representation r) {
+ return Generator::closure_point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Representation r) {
+ return Generator::closure_point(e, r);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+ return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+
+ expr.ascii_dump(s);
+
+ s << " ";
+
+ switch (type()) {
+ case Generator::LINE:
+ s << "L ";
+ break;
+ case Generator::RAY:
+ s << "R ";
+ break;
+ case Generator::POINT:
+ s << "P ";
+ break;
+ case Generator::CLOSURE_POINT:
+ s << "C ";
+ break;
+ }
+ if (is_necessarily_closed())
+ s << "(C)";
+ else
+ s << "(NNC)";
+ s << "\n";
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+ std::string str;
+
+ expr.ascii_load(s);
+
+ if (!(s >> str))
+ return false;
+ if (str == "L")
+ set_is_line();
+ else if (str == "R" || str == "P" || str == "C")
+ set_is_ray_or_point();
+ else
+ return false;
+
+ std::string str2;
+
+ if (!(s >> str2))
+ return false;
+ if (str2 == "(C)") {
+ if (is_not_necessarily_closed())
+ // TODO: Avoid using the mark_as_*() methods if possible.
+ mark_as_necessarily_closed();
+ }
+ else {
+ if (str2 == "(NNC)") {
+ if (is_necessarily_closed())
+ // TODO: Avoid using the mark_as_*() methods if possible.
+ mark_as_not_necessarily_closed();
+ }
+ else
+ return false;
+ }
+
+ // Checking for equality of actual and declared types.
+ switch (type()) {
+ case Generator::LINE:
+ if (str != "L")
+ return false;
+ break;
+ case Generator::RAY:
+ if (str != "R")
+ return false;
+ break;
+ case Generator::POINT:
+ if (str != "P")
+ return false;
+ break;
+ case Generator::CLOSURE_POINT:
+ if (str != "C")
+ return false;
+ break;
+ }
+
+ return true;
+}
+
+inline void
+Generator::m_swap(Generator& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+ swap(topology_, y.topology_);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Generator kind compatibility check: we only compute distances
+ // between (closure) points.
+ if (x.is_line_or_ray() || y.is_line_or_ray())
+ return false;
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // All zero-dim generators have distance zero.
+ if (x_space_dim == 0) {
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ PPL_DIRTY_TEMP(mpq_class, x_coord);
+ PPL_DIRTY_TEMP(mpq_class, y_coord);
+ PPL_DIRTY_TEMP(mpq_class, x_div);
+ PPL_DIRTY_TEMP(mpq_class, y_div);
+ assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+ assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ // TODO: This loop can be optimized more, if needed.
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+ assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+
+ if (x_coord > y_coord) {
+ maybe_assign(tmp1p, tmp1, x_coord, dir);
+ maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_coord, dir);
+ maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Generator& x,
+ const Generator& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+inline void
+swap(Generator& x, Generator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 1032. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 1. */
+/* Grid_Generator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 29. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 33. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 39. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 41. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Grid_Generator
+ \return
+ The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+ \param x
+ A row of coefficients;
+
+ \param y
+ Another row.
+
+ Compares \p x and \p y, where \p x and \p y may be of different size,
+ in which case the "missing" coefficients are assumed to be zero.
+ The comparison is such that:
+ -# equalities are smaller than inequalities;
+ -# lines are smaller than points and rays;
+ -# the ordering is lexicographic;
+ -# the positions compared are, in decreasing order of significance,
+ 1, 2, ..., \p size(), 0;
+ -# the result is negative, zero, or positive if x is smaller than,
+ equal to, or greater than y, respectively;
+ -# when \p x and \p y are different, the absolute value of the
+ result is 1 if the difference is due to the coefficient in
+ position 0; it is 2 otherwise.
+
+ When \p x and \p y represent the hyper-planes associated
+ to two equality or inequality constraints, the coefficient
+ at 0 is the known term.
+ In this case, the return value can be characterized as follows:
+ - -2, if \p x is smaller than \p y and they are \e not parallel;
+ - -1, if \p x is smaller than \p y and they \e are parallel;
+ - 0, if \p x and y are equal;
+ - +1, if \p y is smaller than \p x and they \e are parallel;
+ - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Grid_Generator& x, const Grid_Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator */
+void swap(Grid_Generator& x, Grid_Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator is one of the following:
+
+ - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+ - a parameter
+ \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ - a grid_point
+ \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+ where \f$n\f$ is the dimension of the space
+ and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
+
+ \par How to build a grid generator.
+ Each type of generator is built by applying the corresponding
+ function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+ or <CODE>grid_point</CODE>) to a linear expression;
+ the space dimension of the generator is defined as the space dimension
+ of the corresponding linear expression.
+ Linear expressions used to define a generator should be homogeneous
+ (any constant term will be simply ignored).
+ When defining grid points and parameters, an optional Coefficient argument
+ can be used as a common <EM>divisor</EM> for all the coefficients
+ occurring in the provided linear expression;
+ the default value for this argument is 1.
+
+ \par
+ In all the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a grid line with direction \f$x-y-z\f$
+ and having space dimension \f$3\f$:
+ \code
+ Grid_Generator l = grid_line(x - y - z);
+ \endcode
+ By definition, the origin of the space is not a line, so that
+ the following code throws an exception:
+ \code
+ Grid_Generator l = grid_line(0*x);
+ \endcode
+
+ \par Example 2
+ The following code builds the parameter as the vector
+ \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+ which has the same direction as the line in Example 1:
+ \code
+ Grid_Generator q = parameter(x - y - z);
+ \endcode
+ Note that, unlike lines, for parameters, the length as well
+ as the direction of the vector represented by the code is significant.
+ Thus \p q is \e not the same as the parameter \p q1 defined by
+ \code
+ Grid_Generator q1 = parameter(2x - 2y - 2z);
+ \endcode
+ By definition, the origin of the space is not a parameter, so that
+ the following code throws an exception:
+ \code
+ Grid_Generator q = parameter(0*x);
+ \endcode
+
+ \par Example 3
+ The following code builds the grid point
+ \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+ \code
+ Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+ \endcode
+ The same effect can be obtained by using the following code:
+ \code
+ Grid_Generator p = grid_point(x + 2*z);
+ \endcode
+ Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+ using either one of the following lines of code:
+ \code
+ Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+ Grid_Generator origin3_alt = grid_point(0*z);
+ \endcode
+ Note however that the following code would have defined
+ a different point, namely \f$\vect{0} \in \Rset^2\f$:
+ \code
+ Grid_Generator origin2 = grid_point(0*y);
+ \endcode
+ The following two lines of code both define the only grid point
+ having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+ In the second case we exploit the fact that the first argument
+ of the function <CODE>point</CODE> is optional.
+ \code
+ Grid_Generator origin0 = Generator::zero_dim_point();
+ Grid_Generator origin0_alt = grid_point();
+ \endcode
+
+ \par Example 4
+ The grid point \f$\vect{p}\f$ specified in Example 3 above
+ can also be obtained with the following code,
+ where we provide a non-default value for the second argument
+ of the function <CODE>grid_point</CODE> (the divisor):
+ \code
+ Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+ \endcode
+ Obviously, the divisor can be used to specify
+ points having some non-integer (but rational) coordinates.
+ For instance, the grid point
+ \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be specified by the following code:
+ \code
+ Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par Example 5
+ Parameters, like grid points can have a divisor.
+ For instance, the parameter
+ \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+ \code
+ Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+ \endcode
+ Also, the divisor can be used to specify
+ parameters having some non-integer (but rational) coordinates.
+ For instance, the parameter
+ \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+ can be defined:
+ \code
+ Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+ \endcode
+ If a zero divisor is provided, an exception is thrown.
+
+ \par How to inspect a grid generator
+ Several methods are provided to examine a grid generator and extract
+ all the encoded information: its space dimension, its type and
+ the value of its integer coefficients and the value of the denominator.
+
+ \par Example 6
+ The following code shows how it is possible to access each single
+ coefficient of a grid generator.
+ If <CODE>g1</CODE> is a grid point having coordinates
+ \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+ we construct the parameter <CODE>g2</CODE> having coordinates
+ \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+ \code
+ if (g1.is_point()) {
+ cout << "Grid point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (dimension_type i = g1.space_dimension(); i-- > 0; )
+ e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+ Grid_Generator g2 = parameter(e, g1.divisor());
+ cout << "Parameter g2: " << g2 << endl;
+ }
+ else
+ cout << "Grid generator g1 is not a grid point." << endl;
+ \endcode
+ Therefore, for the grid point
+ \code
+ Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Grid point g1: p((2*A - B + 3*C)/2)
+ Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with grid points and parameters, be careful not to confuse
+ the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+ these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator {
+public:
+
+ //! The possible kinds of Grid_Generator objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+ //! The representation used for new Grid_Generators.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Returns the line of direction \p e.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the homogeneous part of \p e represents the origin of
+ the vector space.
+ */
+ static Grid_Generator grid_line(const Linear_Expression& e,
+ Representation r = default_representation);
+
+ //! Returns the parameter of direction \p e and size \p e/d, with the same
+ //! representation as e.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Grid_Generator parameter(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ // TODO: Improve the documentation of this method.
+ //! Returns the parameter of direction and size \p Linear_Expression::zero() .
+ static Grid_Generator parameter(Representation r);
+
+ //! Returns the parameter of direction and size \p e .
+ static Grid_Generator parameter(const Linear_Expression& e,
+ Representation r);
+
+ //! Returns the point at \p e / \p d.
+ /*!
+ Both \p e and \p d are optional arguments, with default values
+ Linear_Expression::zero() and Coefficient_one(), respectively.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ static Grid_Generator grid_point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one(),
+ Representation r = default_representation);
+
+ //! Returns the point at \p e .
+ static Grid_Generator grid_point(Representation r);
+
+ //! Returns the point at \p e .
+ static Grid_Generator grid_point(const Linear_Expression& e,
+ Representation r);
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ explicit Grid_Generator(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Grid_Generator will have the same representation as g.
+ Grid_Generator(const Grid_Generator& g);
+
+ //! Copy constructor with specified representation.
+ Grid_Generator(const Grid_Generator& g, Representation r);
+
+ //! Copy constructor with specified space dimension.
+ //! The new Grid_Generator will have the same representation as g.
+ Grid_Generator(const Grid_Generator& g, dimension_type space_dim);
+
+ //! Copy constructor with specified space dimension and representation.
+ Grid_Generator(const Grid_Generator& g, dimension_type space_dim,
+ Representation r);
+
+ //! Destructor.
+ ~Grid_Generator();
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Grid_Generator& g);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Grid_Generator can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Removes all the specified dimensions from the grid generator.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+
+ Always returns \p true. The return value is needed for compatibility with
+ the Generator class.
+ */
+ bool remove_space_dimensions(const Variables_Set& vars);
+
+ //! Permutes the space dimensions of the grid generator.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a grid line. */
+ LINE,
+ /*! The generator is a parameter. */
+ PARAMETER,
+ /*! The generator is a grid point. */
+ POINT
+ };
+
+ //! Returns the generator type of \p *this.
+ Type type() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+ bool is_line() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+ bool is_parameter() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a line or
+ a parameter.
+ */
+ bool is_line_or_parameter() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+ bool is_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row represents a
+ parameter or a point.
+ */
+ bool is_parameter_or_point() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the index of \p v is greater than or equal to the
+ space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient_traits::const_reference divisor() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+ static const Grid_Generator& zero_dim_point();
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ equivalent generators.
+
+ Generators having different space dimensions are not equivalent.
+ */
+ bool is_equivalent_to(const Grid_Generator& y) const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ /*!
+ This is faster than is_equivalent_to(), but it may return `false' even
+ for equivalent generators.
+ */
+ bool is_equal_to(const Grid_Generator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the homogeneous terms
+ of \p *this are \f$0\f$.
+ */
+ bool all_homogeneous_terms_are_zero() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Grid_Generator& y);
+
+ /*! \brief
+ Scales \p *this to be represented with a divisor of \p d (if
+ \*this is a parameter or point). Does nothing at all on lines.
+
+ It is assumed that \p d is a multiple of the current divisor
+ and different from zero. The behavior is undefined if the assumption
+ does not hold.
+ */
+ void scale_to_divisor(Coefficient_traits::const_reference d);
+
+ //! Sets the divisor of \p *this to \p d.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ void set_divisor(Coefficient_traits::const_reference d);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+ expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+private:
+ Linear_Expression expr;
+
+ Kind kind_;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the origin of the zero-dimensional space \f$\Rset^0\f$.
+ */
+ static const Grid_Generator* zero_dim_point_p;
+
+ //! Constructs a Grid_Generator with the specified space dimension, kind
+ //! and topology.
+ Grid_Generator(dimension_type space_dim, Kind kind, Topology topology,
+ Representation r = default_representation);
+
+ // TODO: Avoid reducing the space dimension.
+ /*! \brief
+ Constructs a grid generator of type \p t from linear expression \p e,
+ stealing the underlying data structures from \p e.
+
+ The last column in \p e becomes the parameter divisor column of
+ the new Grid_Generator.
+
+ \note The new Grid_Generator will have the same representation as `e'.
+ */
+ Grid_Generator(Linear_Expression& e, Type t);
+
+ //! Sets the dimension of the vector space enclosing \p *this to
+ //! \p space_dim .
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid objects.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+ dimension \p dim.
+ */
+ bool is_equal_at_dimension(dimension_type dim,
+ const Grid_Generator& gg) const;
+
+ /*! \brief
+ A print function, with fancy, more human-friendly output.
+
+ This is used by operator<<().
+ */
+ void fancy_print(std::ostream& s) const;
+
+ //! Converts the Grid_Generator into a parameter.
+ void set_is_parameter();
+
+ //! Sets the Grid_Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Grid_Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_parameter_or_point();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns the topological kind of \p *this.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is not necessarily closed.
+ */
+ bool is_not_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the topology
+ of \p *this row is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a line or an equality.
+ */
+ bool is_line_or_equality() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this row
+ represents a ray, a point or an inequality.
+ */
+ bool is_ray_or_point_or_inequality() const;
+ //@} // Flags inspection methods
+
+ //! \name Flags coercion methods
+ //@{
+
+ //! Sets to \p x the topological kind of \p *this row.
+ void set_topology(Topology x);
+
+ //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_necessarily_closed();
+
+ //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+ void set_not_necessarily_closed();
+
+ //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+ void set_is_line_or_equality();
+
+ //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+ void set_is_ray_or_point_or_inequality();
+ //@} // Flags coercion methods
+
+ /*! \brief
+ Normalizes the sign of the coefficients so that the first non-zero
+ (homogeneous) coefficient of a line-or-equality is positive.
+ */
+ void sign_normalize();
+
+ /*! \brief
+ Strong normalization: ensures that different Grid_Generator objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Grid_Generator::normalize() and Grid_Generator::sign_normalize().
+ */
+ void strong_normalize();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the coefficients are
+ strongly normalized.
+ */
+ bool check_strong_normalized() const;
+
+ //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+ /*!
+ \param y
+ The Grid_Generator that will be combined with \p *this object;
+
+ \param i
+ The index of the coefficient that has to become \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the i-th coefficient equal to \f$0\f$. Then it assigns
+ the resulting Grid_Generator to \p *this and normalizes it.
+ */
+ void linear_combine(const Grid_Generator& y, dimension_type i);
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ const Variable v) const;
+
+ /*! \brief
+ Throw a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* reason) const;
+
+ friend std::ostream&
+ IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+
+ friend int
+ compare(const Grid_Generator& x, const Grid_Generator& y);
+
+ friend class Expression_Adapter<Grid_Generator>;
+ friend class Grid_Generator_System;
+ friend class Grid;
+ friend class Linear_System<Grid_Generator>;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_line(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_line(const Linear_Expression& e,
+ Representation r = Grid_Generator::default_representation);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::parameter(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::parameter(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::parameter(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e, Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one(),
+ Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::grid_point(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(Representation r);
+
+/*! \brief
+ Shorthand for
+ Grid_Generator::grid_point(const Linear_Expression& e, Representation r).
+
+ \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_inlines.hh line 1. */
+/* Grid Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid_Generator::is_necessarily_closed() const {
+ return true;
+}
+
+inline bool
+Grid_Generator::is_not_necessarily_closed() const {
+ return false;
+}
+
+inline bool
+Grid_Generator::is_line_or_equality() const {
+ return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Grid_Generator::is_ray_or_point_or_inequality() const {
+ return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Grid_Generator::topology() const {
+ return NECESSARILY_CLOSED;
+}
+
+inline void
+Grid_Generator::set_is_line_or_equality() {
+ kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Grid_Generator::set_is_ray_or_point_or_inequality() {
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Grid_Generator::set_topology(Topology x) {
+ PPL_USED(x);
+ PPL_ASSERT(x == NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Grid_Generator::Grid_Generator(Linear_Expression& e, Type type) {
+ swap(expr, e);
+ if (type == LINE)
+ kind_ = LINE_OR_EQUALITY;
+ else
+ kind_ = RAY_OR_POINT_OR_INEQUALITY;
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(Representation r)
+ : expr(Coefficient_one(), r),
+ kind_(RAY_OR_POINT_OR_INEQUALITY) {
+ expr.set_space_dimension(1);
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+ : expr(g.expr),
+ kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g, Representation r)
+ : expr(g.expr, r),
+ kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(dimension_type space_dim, Kind kind,
+ Topology topology, Representation r)
+ : expr(r),
+ kind_(kind) {
+ PPL_USED(topology);
+ PPL_ASSERT(topology == NECESSARILY_CLOSED);
+ expr.set_space_dimension(space_dim + 1);
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+ dimension_type space_dim)
+ : expr(g.expr, space_dim + 1),
+ kind_(g.kind_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+ dimension_type space_dim, Representation r)
+ : expr(g.expr, space_dim + 1, r),
+ kind_(g.kind_) {
+ PPL_ASSERT(OK());
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::~Grid_Generator() {
+}
+
+inline Grid_Generator::expr_type
+Grid_Generator::expression() const {
+ return expr_type(expr, true);
+}
+
+inline Representation
+Grid_Generator::representation() const {
+ return expr.representation();
+}
+
+inline void
+Grid_Generator::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+ return Linear_Expression::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+ return expression().space_dimension();
+}
+
+inline void
+Grid_Generator::set_space_dimension(dimension_type space_dim) {
+ const dimension_type old_space_dim = space_dimension();
+ if (space_dim > old_space_dim) {
+ expr.set_space_dimension(space_dim + 1);
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ }
+ else {
+ expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+ expr.set_space_dimension(space_dim + 1);
+ }
+ PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline void
+Grid_Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+ set_space_dimension(space_dim);
+}
+
+inline void
+Grid_Generator::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+ if (is_line())
+ return LINE;
+ return is_point() ? POINT : PARAMETER;
+}
+
+inline bool
+Grid_Generator::is_line() const {
+ return is_line_or_equality();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+ return is_parameter_or_point() && is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+ return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Grid_Generator::is_point() const {
+ return !is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+ PPL_ASSERT(!is_line());
+ if (is_line_or_parameter())
+ expr.set_coefficient(Variable(space_dimension()), d);
+ else
+ expr.set_inhomogeneous_term(d);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+ if (is_line())
+ throw_invalid_argument("divisor()", "*this is a line");
+ if (is_line_or_parameter())
+ return expr.coefficient(Variable(space_dimension()));
+ else
+ return expr.inhomogeneous_term();
+}
+
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+ const Grid_Generator& y) const {
+ const Grid_Generator& x = *this;
+ return x.expr.get(dim) * y.divisor() == y.expr.get(dim) * x.divisor();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+ set_is_line_or_equality();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+ set_is_ray_or_point_or_inequality();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+ Grid_Generator tmp = g;
+ swap(*this, tmp);
+
+ return *this;
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes();
+}
+
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+ PPL_ASSERT(zero_dim_point_p != 0);
+ return *zero_dim_point_p;
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+ PPL_ASSERT(!is_parameter());
+ expr.normalize();
+ sign_normalize();
+}
+
+inline void
+Grid_Generator::m_swap(Grid_Generator& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(kind_, y.kind_);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+ return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+ return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::grid_line(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d, Representation r) {
+ return Grid_Generator::parameter(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(Representation r) {
+ return Grid_Generator::parameter(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::parameter(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d, Representation r) {
+ return Grid_Generator::grid_point(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(Representation r) {
+ return Grid_Generator::grid_point(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e, Representation r) {
+ return Grid_Generator::grid_point(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline void
+swap(Grid_Generator& x, Grid_Generator& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 795. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 1. */
+/* Congruence class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 31. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 37. */
+
+#include <iosfwd>
+#include <vector>
+
+// These are declared here because they are friend of Congruence.
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Congruence is a congruence:
+ - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+ where \f$n\f$ is the dimension of the space,
+ \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+ \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+ if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+ \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+ and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+ said to be a proper congruence.
+
+ \par How to build a congruence
+ Congruences \f$\pmod{1}\f$ are typically built by
+ applying the congruence symbol `<CODE>\%=</CODE>'
+ to a pair of linear expressions.
+ Congruences with modulus \p m
+ are typically constructed by building a congruence \f$\pmod{1}\f$
+ using the given pair of linear expressions
+ and then adding the modulus \p m
+ using the modulus symbol is `<CODE>/</CODE>'.
+
+ The space dimension of a congruence is defined as the maximum
+ space dimension of the arguments of its constructor.
+
+ \par
+ In the following examples it is assumed that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+ are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds the equality congruence
+ \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+ \code
+ Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+ \endcode
+ The following code builds the congruence
+ \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+ \code
+ Congruence mod1_cg(4*x %= 2*y - 13);
+ \endcode
+ The following code builds the congruence
+ \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+ \code
+ Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+ \endcode
+ An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+ can be specified as follows:
+ \code
+ Congruence false_cg = Congruence::zero_dim_false();
+ \endcode
+ Equivalent, but more involved ways are the following:
+ \code
+ Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+ Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+ \endcode
+ In contrast, the following code defines an unsatisfiable congruence
+ having space dimension \f$3\f$:
+ \code
+ Congruence false_cg3((0*z %= 1) / 0);
+ \endcode
+
+ \par How to inspect a congruence
+ Several methods are provided to examine a congruence and extract
+ all the encoded information: its space dimension, its modulus
+ and the value of its integer coefficients.
+
+ \par Example 2
+ The following code shows how it is possible to access the modulus
+ as well as each of the coefficients.
+ Given a congruence with linear expression \p e and modulus \p m
+ (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+ congruence with the same modulus \p m but where the linear
+ expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+ \code
+ Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+ cout << "Congruence cg1: " << cg1 << endl;
+ const Coefficient& m = cg1.modulus();
+ if (m == 0)
+ cout << "Congruence cg1 is an equality." << endl;
+ else {
+ Linear_Expression e;
+ for (dimension_type i = cg1.space_dimension(); i-- > 0; )
+ e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+ e += 2 * cg1.inhomogeneous_term();
+ Congruence cg2((e %= 0) / m);
+ cout << "Congruence cg2: " << cg2 << endl;
+ }
+ \endcode
+ The actual output could be the following:
+ \code
+ Congruence cg1: A - 5*B + 3*C %= 4 / 5
+ Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+ \endcode
+ Note that, in general, the particular output obtained can be
+ syntactically different from the (semantically equivalent)
+ congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence {
+public:
+
+ //! The representation used for new Congruences.
+ /*!
+ \note The copy constructor and the copy constructor with specified size
+ use the representation of the original object, so that it is
+ indistinguishable from the original object.
+ */
+ static const Representation default_representation = SPARSE;
+
+ //! Constructs the 0 = 0 congruence with space dimension \p 0 .
+ explicit Congruence(Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The new Congruence will have the same representation as `cg',
+ not default_representation, so that they are indistinguishable.
+ */
+ Congruence(const Congruence& cg);
+
+ //! Copy constructor with specified representation.
+ Congruence(const Congruence& cg, Representation r);
+
+ //! Copy-constructs (modulo 0) from equality constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p c is an inequality.
+ */
+ explicit Congruence(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Destructor.
+ ~Congruence();
+
+ //! Assignment operator.
+ Congruence& operator=(const Congruence& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Congruence can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ void permute_space_dimensions(const std::vector<Variable>& cycles);
+
+ //! The type of the (adapted) internal expression.
+ typedef Expression_Adapter_Transparent<Linear_Expression> expr_type;
+ //! Partial read access to the (adapted) internal expression.
+ expr_type expression() const;
+
+ //! Returns the coefficient of \p v in \p *this.
+ /*!
+ \exception std::invalid_argument thrown if the index of \p v
+ is greater than or equal to the space dimension of \p *this.
+ */
+ Coefficient_traits::const_reference coefficient(Variable v) const;
+
+ //! Returns the inhomogeneous term of \p *this.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns a const reference to the modulus of \p *this.
+ Coefficient_traits::const_reference modulus() const;
+
+ //! Sets the modulus of \p *this to \p m .
+ //! If \p m is 0, the congruence becomes an equality.
+ void set_modulus(Coefficient_traits::const_reference m);
+
+ //! Multiplies all the coefficients, including the modulus, by \p factor .
+ void scale(Coefficient_traits::const_reference factor);
+
+ // TODO: Document this.
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Multiplies \p k into the modulus of \p *this.
+ /*!
+ If called with \p *this representing the congruence \f$ e_1 = e_2
+ \pmod{m}\f$, then it returns with *this representing
+ the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+ */
+ Congruence&
+ operator/=(Coefficient_traits::const_reference k);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a tautology
+ (i.e., an always true congruence).
+
+ A tautological congruence has one the following two forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+ - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b = 0 \pmod{m}\f$.
+ */
+ bool is_tautological() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this is inconsistent (i.e., an always false congruence).
+
+ An inconsistent congruence has one of the following two forms:
+ - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+ where \f$b \neq 0\f$; or
+ - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b \neq 0 \pmod{m}\f$.
+ */
+ bool is_inconsistent() const;
+
+ //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+ /*!
+ A congruence with a modulus of 0 is a linear equality.
+ */
+ bool is_proper_congruence() const;
+
+ //! Returns <CODE>true</CODE> if \p *this is an equality.
+ /*!
+ A modulus of zero denotes a linear equality.
+ */
+ bool is_equality() const;
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns a reference to the true (zero-dimension space) congruence
+ \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+ congruence</EM>.
+ */
+ static const Congruence& zero_dim_integrality();
+
+ /*! \brief
+ Returns a reference to the false (zero-dimension space) congruence
+ \f$0 = 1 \pmod{0}\f$.
+ */
+ static const Congruence& zero_dim_false();
+
+ //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+ static Congruence
+ create(const Linear_Expression& e1, const Linear_Expression& e2,
+ Representation r = default_representation);
+
+ //! Returns the congruence \f$e = n \pmod{1}\f$.
+ static Congruence
+ create(const Linear_Expression& e, Coefficient_traits::const_reference n,
+ Representation r = default_representation);
+
+ //! Returns the congruence \f$n = e \pmod{1}\f$.
+ static Congruence
+ create(Coefficient_traits::const_reference n, const Linear_Expression& e,
+ Representation r = default_representation);
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Congruence& y);
+
+ //! Copy-constructs with the specified space dimension.
+ /*!
+ \note The new Congruence will have the same representation as `cg',
+ not default_representation, for consistency with the copy
+ constructor.
+ */
+ Congruence(const Congruence& cg, dimension_type new_space_dimension);
+
+ //! Copy-constructs with the specified space dimension and representation.
+ Congruence(const Congruence& cg, dimension_type new_space_dimension,
+ Representation r);
+
+ //! Copy-constructs from a constraint, with the specified space dimension
+ //! and (optional) representation.
+ Congruence(const Constraint& cg, dimension_type new_space_dimension,
+ Representation r = default_representation);
+
+ //! Constructs from Linear_Expression \p le, using modulus \p m.
+ /*!
+ Builds a congruence with modulus \p m, stealing the coefficients
+ from \p le.
+
+ \note The new Congruence will have the same representation as `le'.
+
+ \param le
+ The Linear_Expression holding the coefficients.
+
+ \param m
+ The modulus for the congruence, which must be zero or greater.
+ */
+ Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m, Recycle_Input);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Sets the space dimension by \p n , adding or removing coefficients as
+ //! needed.
+ void set_space_dimension(dimension_type n);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Normalizes the signs.
+ /*!
+ The signs of the coefficients and the inhomogeneous term are
+ normalized, leaving the first non-zero homogeneous coefficient
+ positive.
+ */
+ void sign_normalize();
+
+ //! Normalizes signs and the inhomogeneous term.
+ /*!
+ Applies sign_normalize, then reduces the inhomogeneous term to the
+ smallest possible positive number.
+ */
+ void normalize();
+
+ //! Calls normalize, then divides out common factors.
+ /*!
+ Strongly normalized Congruences have equivalent semantics if and
+ only if they have the same syntax (as output by operator<<).
+ */
+ void strong_normalize();
+
+private:
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+ */
+ static const Congruence* zero_dim_false_p;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+ also known as the <EM>integrality congruence</EM>.
+ */
+ static const Congruence* zero_dim_integrality_p;
+
+ Linear_Expression expr;
+
+ Coefficient modulus_;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+ dimension \p v.
+ */
+ bool is_equal_at_dimension(Variable v,
+ const Congruence& cg) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ error message \p message.
+ */
+ void
+ throw_invalid_argument(const char* method, const char* message) const;
+
+ /*! \brief
+ Throws a <CODE>std::invalid_argument</CODE> exception containing
+ the appropriate error message.
+ */
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* v_name,
+ Variable v) const;
+
+ friend bool
+ operator==(const Congruence& x, const Congruence& y);
+
+ friend bool
+ operator!=(const Congruence& x, const Congruence& y);
+
+ friend class Scalar_Products;
+ friend class Grid;
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+} // namespace IO_Operators
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+ If \p cg represents the congruence \f$ e_1 = e_2
+ \pmod{m}\f$, then the result represents the
+ congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+ \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+/*! \relates Congruence */
+void
+swap(Congruence& x, Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_inlines.hh line 1. */
+/* Congruence class implementation: inline functions.
+*/
+
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(Representation r)
+ : expr(r) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg)
+ : expr(cg.expr), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg, Representation r)
+ : expr(cg.expr, r), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type new_space_dimension)
+ : expr(cg.expr, new_space_dimension), modulus_(cg.modulus_) {
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type new_space_dimension,
+ Representation r)
+ : expr(cg.expr, new_space_dimension, r), modulus_(cg.modulus_) {
+ PPL_ASSERT(OK());
+}
+
+inline Representation
+Congruence::representation() const {
+ return expr.representation();
+}
+
+inline void
+Congruence::set_representation(Representation r) {
+ expr.set_representation(r);
+}
+
+inline Congruence::expr_type
+Congruence::expression() const {
+ return expr_type(expr);
+}
+
+inline void
+Congruence::set_space_dimension(dimension_type n) {
+ expr.set_space_dimension(n);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Congruence::shift_space_dimensions(Variable v, dimension_type n) {
+ expr.shift_space_dimensions(v, n);
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ Recycle_Input)
+ : modulus_(m) {
+ PPL_ASSERT(m >= 0);
+ swap(expr, le);
+
+ PPL_ASSERT(OK());
+}
+
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+ Coefficient_traits::const_reference n,
+ Representation r) {
+ Linear_Expression diff(e, r);
+ diff -= n;
+ const Congruence cg(diff, 1, Recycle_Input());
+ return cg;
+}
+
+inline Congruence
+Congruence::create(Coefficient_traits::const_reference n,
+ const Linear_Expression& e,
+ Representation r) {
+ Linear_Expression diff(e, r);
+ diff -= n;
+ const Congruence cg(diff, 1, Recycle_Input());
+ return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+ Congruence ret = cg;
+ ret /= k;
+ return ret;
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+ return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+ return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& y) {
+ Congruence tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+ Congruence ret(c);
+ ret /= m;
+ return ret;
+}
+
+inline Congruence&
+Congruence::operator/=(Coefficient_traits::const_reference k) {
+ if (k >= 0)
+ modulus_ *= k;
+ else
+ modulus_ *= -k;
+ return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+ if (x.space_dimension() != y.space_dimension())
+ return false;
+ Congruence x_temp(x);
+ Congruence y_temp(y);
+ x_temp.strong_normalize();
+ y_temp.strong_normalize();
+ return x_temp.expr.is_equal_to(y_temp.expr)
+ && x_temp.modulus() == y_temp.modulus();
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+ return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+ return Linear_Expression::max_space_dimension();
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+ return expr.space_dimension();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ throw_dimension_incompatible("coefficient(v)", "v", v);
+ return expr.coefficient(v);
+}
+
+inline void
+Congruence::permute_space_dimensions(const std::vector<Variable>& cycles) {
+ expr.permute_space_dimensions(cycles);
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+ return expr.inhomogeneous_term();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+ return modulus_;
+}
+
+inline void
+Congruence::set_modulus(Coefficient_traits::const_reference m) {
+ modulus_ = m;
+ PPL_ASSERT(OK());
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+ return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+ return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(Variable v,
+ const Congruence& cg) const {
+ return coefficient(v) * cg.modulus() == cg.coefficient(v) * modulus();
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+ return expr.external_memory_in_bytes()
+ + Parma_Polyhedra_Library::external_memory_in_bytes(modulus_);
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Congruence::m_swap(Congruence& y) {
+ using std::swap;
+ swap(expr, y.expr);
+ swap(modulus_, y.modulus_);
+}
+
+inline void
+Congruence::swap_space_dimensions(Variable v1, Variable v2) {
+ expr.swap_space_dimensions(v1, v2);
+}
+
+/*! \relates Congruence */
+inline void
+swap(Congruence& x, Congruence& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 505. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 34. */
+#include <stdexcept>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl& e) {
+ construct(e);
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e) {
+ construct(e);
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+ construct(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+ construct(*p);
+ }
+ else {
+ // Add implementations for other derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e,
+ dimension_type space_dim) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+ construct(*p, space_dim);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+ construct(*p, space_dim);
+ }
+ else {
+ // Add implementations for other derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, Variable i) {
+ PPL_ASSERT(space_dimension() == y.space_dimension());
+ PPL_ASSERT(i.space_dimension() <= space_dimension());
+ linear_combine(y, i.space_dimension());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i) {
+ const Linear_Expression_Impl& x = *this;
+ PPL_ASSERT(i < x.space_dimension() + 1);
+ PPL_ASSERT(x.space_dimension() == y.space_dimension());
+ Coefficient_traits::const_reference x_i = x.row.get(i);
+ Coefficient_traits::const_reference y_i = y.row.get(i);
+ PPL_ASSERT(x_i != 0);
+ PPL_ASSERT(y_i != 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_v);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_v);
+ normalize2(x_i, y_i, normalized_x_v, normalized_y_v);
+ neg_assign(normalized_x_v);
+ linear_combine(y, normalized_y_v, normalized_x_v);
+ // We cannot use x_i here because it may have been invalidated by
+ // linear_combine().
+ assert(x.row.get(i) == 0);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ if (space_dimension() < y.space_dimension())
+ set_space_dimension(y.space_dimension());
+ linear_combine(y, c1, c2, 0, y.space_dimension() + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ if (space_dimension() < y.space_dimension())
+ set_space_dimension(y.space_dimension());
+ linear_combine_lax(y, c1, c2, 0, y.space_dimension() + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Impl<Row2>& y) const {
+ const Linear_Expression_Impl& x = *this;
+ // Compare all the coefficients of the row starting from position 1.
+ // NOTE: x and y may be of different size.
+ typename Row::const_iterator i = x.row.lower_bound(1);
+ typename Row::const_iterator i_end = x.row.end();
+ typename Row2::const_iterator j = y.row.lower_bound(1);
+ typename Row2::const_iterator j_end = y.row.end();
+ while (i != i_end && j != j_end) {
+ if (i.index() < j.index()) {
+ const int s = sgn(*i);
+ if (s != 0)
+ return 2*s;
+ ++i;
+ continue;
+ }
+ if (i.index() > j.index()) {
+ const int s = sgn(*j);
+ if (s != 0)
+ return -2*s;
+ ++j;
+ continue;
+ }
+ PPL_ASSERT(i.index() == j.index());
+ const int s = cmp(*i, *j);
+ if (s < 0)
+ return -2;
+ if (s > 0)
+ return 2;
+ PPL_ASSERT(s == 0);
+ ++i;
+ ++j;
+ }
+ for ( ; i != i_end; ++i) {
+ const int s = sgn(*i);
+ if (s != 0)
+ return 2*s;
+ }
+ for ( ; j != j_end; ++j) {
+ const int s = sgn(*j);
+ if (s != 0)
+ return -2*s;
+ }
+
+ // If all the coefficients in `x' equal all the coefficients in `y'
+ // (starting from position 1) we compare coefficients in position 0,
+ // i.e., inhomogeneous terms.
+ const int comp = cmp(x.row.get(0), y.row.get(0));
+ if (comp > 0)
+ return 1;
+ if (comp < 0)
+ return -1;
+ PPL_ASSERT(comp == 0);
+
+ // `x' and `y' are equal.
+ return 0;
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::Linear_Expression_Impl(const Variable v) {
+ if (v.space_dimension() > max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl::"
+ "Linear_Expression_Impl(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ set_space_dimension(v.space_dimension());
+ (*this) += v;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& x) const {
+ return row == x.row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Dense_Row& row) const {
+ row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Sparse_Row& row) const {
+ row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ const dimension_type n = cycle.size();
+ if (n < 2)
+ return;
+
+ if (n == 2) {
+ row.swap_coefficients(cycle[0].space_dimension(),
+ cycle[1].space_dimension());
+ }
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ tmp = row.get(cycle.back().space_dimension());
+ for (dimension_type i = n - 1; i-- > 0; )
+ row.swap_coefficients(cycle[i + 1].space_dimension(),
+ cycle[i].space_dimension());
+ if (tmp == 0)
+ row.reset(cycle[0].space_dimension());
+ else {
+ using std::swap;
+ swap(tmp, row[cycle[0].space_dimension()]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Linear_Expression_Impl<Row2>& e) {
+ linear_combine(e, Coefficient_one(), Coefficient_one());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "operator+=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ typename Row::iterator itr = row.insert(v_space_dim);
+ ++(*itr);
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Linear_Expression_Impl<Row2>& e2) {
+ linear_combine(e2, Coefficient_one(), -1);
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "operator-=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ typename Row::iterator itr = row.insert(v_space_dim);
+ --(*itr);
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator*=(Coefficient_traits::const_reference n) {
+ if (n == 0) {
+ row.clear();
+ PPL_ASSERT(OK());
+ return *this;
+ }
+ for (typename Row::iterator i = row.begin(),
+ i_end = row.end(); i != i_end; ++i)
+ (*i) *= n;
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator/=(Coefficient_traits::const_reference n) {
+ typename Row::iterator i = row.begin();
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end) {
+ (*i) /= n;
+ if (*i == 0)
+ i = row.reset(i);
+ else
+ ++i;
+ }
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate() {
+ for (typename Row::iterator i = row.begin(),
+ i_end = row.end(); i != i_end; ++i)
+ neg_assign(*i);
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::add_mul_assign(Coefficient_traits::const_reference n,
+ const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "add_mul_assign(e, n, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ if (n == 0)
+ return *this;
+ typename Row::iterator itr = row.insert(v_space_dim);
+ (*itr) += n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference n,
+ const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+ throw std::length_error("Linear_Expression_Impl& "
+ "sub_mul_assign(e, n, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (space_dimension() < v_space_dim)
+ set_space_dimension(v_space_dim);
+ if (n == 0)
+ return *this;
+ typename Row::iterator itr = row.insert(v_space_dim);
+ (*itr) -= n;
+ if (*itr == 0)
+ row.reset(itr);
+ PPL_ASSERT(OK());
+ return *this;
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& y) {
+ if (factor != 0)
+ linear_combine(y, Coefficient_one(), factor);
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Impl<Row2>& y) {
+ if (factor != 0)
+ linear_combine(y, Coefficient_one(), -factor);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::print(std::ostream& s) const {
+ PPL_DIRTY_TEMP_COEFFICIENT(ev);
+ bool first = true;
+ for (typename Row::const_iterator i = row.lower_bound(1), i_end = row.end();
+ i != i_end; ++i) {
+ ev = *i;
+ if (ev == 0)
+ continue;
+ if (!first) {
+ if (ev > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(ev);
+ }
+ }
+ else
+ first = false;
+ if (ev == -1)
+ s << "-";
+ else if (ev != 1)
+ s << ev << "*";
+ IO_Operators::operator<<(s, Variable(i.index() - 1));
+ }
+ // Inhomogeneous term.
+ PPL_DIRTY_TEMP_COEFFICIENT(it);
+ it = row[0];
+ if (it != 0) {
+ if (!first) {
+ if (it > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(it);
+ }
+ }
+ else
+ first = false;
+ s << it;
+ }
+
+ if (first)
+ // The null linear expression.
+ s << Coefficient_zero();
+}
+
+template <typename Row>
+Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::get(dimension_type i) const {
+ return row.get(i);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::set(dimension_type i, Coefficient_traits::const_reference n) {
+ if (n == 0)
+ row.reset(i);
+ else
+ row.insert(i, n);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::exact_div_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ // NOTE: Since all coefficients in [start,end) are multiple of c,
+ // each of the resulting coefficients will be nonzero iff the initial
+ // coefficient was.
+ for (typename Row::iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ Parma_Polyhedra_Library::exact_div_assign(*i, *i, c);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::mul_assign(Coefficient_traits::const_reference c,
+ dimension_type start, dimension_type end) {
+ if (c == 0) {
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ }
+ else {
+ for (typename Row::iterator
+ i = row.lower_bound(start), i_end = row.lower_bound(end); i != i_end; ++i)
+ (*i) *= c;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= row.size());
+ PPL_ASSERT(end <= y.row.size());
+ if (c1 == 0) {
+ if (c2 == 0) {
+ PPL_ASSERT(c1 == 0);
+ PPL_ASSERT(c2 == 0);
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ }
+ else {
+ PPL_ASSERT(c1 == 0);
+ PPL_ASSERT(c2 != 0);
+
+ typename Row::iterator i = row.lower_bound(start);
+ const typename Row::iterator& i_end = row.end();
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_last = y.row.lower_bound(end);
+
+ while (i != i_end && i.index() < end && j != j_last) {
+ if (i.index() < j.index()) {
+ i = row.reset(i);
+ continue;
+ }
+ if (i.index() > j.index()) {
+ i = row.insert(i, j.index(), *j);
+ (*i) *= c2;
+ ++i;
+ ++j;
+ continue;
+ }
+ PPL_ASSERT(i.index() == j.index());
+ (*i) = (*j);
+ (*i) *= c2;
+ ++i;
+ ++j;
+ }
+ while (i != i_end && i.index() < end)
+ i = row.reset(i);
+ while (j != j_last) {
+ i = row.insert(i, j.index(), *j);
+ (*i) *= c2;
+ // No need to increment i here.
+ ++j;
+ }
+ }
+ }
+ else {
+ if (c2 == 0) {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 == 0);
+ for (typename Row::iterator i = row.lower_bound(start),
+ i_end = row.lower_bound(end); i != i_end; ++i)
+ (*i) *= c1;
+ }
+ else {
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::sign_normalize() {
+ typename Row::iterator i = row.lower_bound(1);
+ typename Row::iterator i_end = row.end();
+
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ break;
+
+ if (i != i_end && *i < 0) {
+ for ( ; i != i_end; ++i)
+ neg_assign(*i);
+ // Negate the first coefficient, too.
+ typename Row::iterator first = row.begin();
+ if (first != row.end() && first.index() == 0)
+ neg_assign(*first);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate(dimension_type first, dimension_type last) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= row.size());
+ typename Row::iterator i = row.lower_bound(first);
+ typename Row::iterator i_end = row.lower_bound(last);
+ for ( ; i != i_end; ++i)
+ neg_assign(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e) {
+ row = e.row;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e,
+ dimension_type space_dim) {
+ Row x(e.row, space_dim + 1, space_dim + 1);
+ swap(row, x);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+ result = 0;
+ typename Row ::const_iterator x_i = x.row.lower_bound(start);
+ typename Row ::const_iterator x_end = x.row.lower_bound(end);
+ typename Row2::const_iterator y_i = y.row.lower_bound(start);
+ typename Row2::const_iterator y_end = y.row.lower_bound(end);
+ while (x_i != x_end && y_i != y_end) {
+ if (x_i.index() == y_i.index()) {
+ Parma_Polyhedra_Library::add_mul_assign(result, *x_i, *y_i);
+ ++x_i;
+ ++y_i;
+ }
+ else {
+ if (x_i.index() < y_i.index()) {
+ PPL_ASSERT(y.row.get(x_i.index()) == 0);
+ // (*x_i) * 0 == 0, nothing to do.
+ ++x_i;
+ }
+ else {
+ PPL_ASSERT(x.row.get(y_i.index()) == 0);
+ // 0 * (*y_i) == 0, nothing to do.
+ ++y_i;
+ }
+ }
+ }
+ // In the remaining positions (if any) at most one row is nonzero, so
+ // there's nothing left to do.
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ PPL_DIRTY_TEMP_COEFFICIENT(result);
+ scalar_product_assign(result, y, start, end);
+ return sgn(result);
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+
+ typename Row::const_iterator i = x.row.lower_bound(start);
+ typename Row::const_iterator i_end = x.row.lower_bound(end);
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_end = y.row.lower_bound(end);
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ if (*i != *j)
+ return false;
+ ++i;
+ ++j;
+ }
+ else {
+ if (i.index() < j.index()) {
+ if (*i != 0)
+ return false;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ if (*j != 0)
+ return false;
+ ++j;
+ }
+ }
+ }
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ return false;
+ for ( ; j != j_end; ++j)
+ if (*j != 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ const Linear_Expression_Impl<Row>& x = *this;
+ PPL_ASSERT(start <= end);
+ PPL_ASSERT(end <= x.row.size());
+ PPL_ASSERT(end <= y.row.size());
+
+ // Deal with trivial cases.
+ if (c1 == 0) {
+ if (c2 == 0)
+ return true;
+ else
+ return y.all_zeroes(start, end);
+ }
+ if (c2 == 0)
+ return x.all_zeroes(start, end);
+
+ PPL_ASSERT(c1 != 0);
+ PPL_ASSERT(c2 != 0);
+ typename Row::const_iterator i = x.row.lower_bound(start);
+ typename Row::const_iterator i_end = x.row.lower_bound(end);
+ typename Row2::const_iterator j = y.row.lower_bound(start);
+ typename Row2::const_iterator j_end = y.row.lower_bound(end);
+ while (i != i_end && j != j_end) {
+ if (i.index() == j.index()) {
+ if ((*i) * c1 != (*j) * c2)
+ return false;
+ ++i;
+ ++j;
+ }
+ else {
+ if (i.index() < j.index()) {
+ if (*i != 0)
+ return false;
+ ++i;
+ }
+ else {
+ PPL_ASSERT(i.index() > j.index());
+ if (*j != 0)
+ return false;
+ ++j;
+ }
+ }
+ }
+ for ( ; i != i_end; ++i)
+ if (*i != 0)
+ return false;
+ for ( ; j != j_end; ++j)
+ if (*j != 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, Variable v) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, v);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, v);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, c1, c2);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, c1, c2);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator+=(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return operator+=(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return operator+=(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return *this;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator-=(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return operator-=(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return operator-=(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return *this;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ add_mul_assign(factor, *p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ add_mul_assign(factor, *p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+ const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ sub_mul_assign(factor, *p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ sub_mul_assign(factor, *p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, dimension_type i) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, i);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, i);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ linear_combine_lax(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Interface& y) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return compare(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return compare(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return 0;
+ }
+}
+
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return construct(*p);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return construct(*p);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y,
+ dimension_type space_dim) {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return construct(*p, space_dim);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return construct(*p, space_dim);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+ const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ scalar_product_assign(result, *p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ scalar_product_assign(result, *p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return scalar_product_sign(*p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return scalar_product_sign(*p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return 0;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+ Coefficient_traits::const_reference c1,
+ Coefficient_traits::const_reference c2,
+ dimension_type start, dimension_type end) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return is_equal_to(*p, c1, c2, start, end);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return is_equal_to(*p, c1, c2, start, end);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::have_a_common_variable(const Linear_Expression_Interface& y,
+ Variable first, Variable last) const {
+ typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+ typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+ if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+ return have_a_common_variable(*p, first, last);
+ }
+ else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+ return have_a_common_variable(*p, first, last);
+ }
+ else {
+ // Add implementations for new derived classes here.
+ PPL_UNREACHABLE;
+ return false;
+ }
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::begin() const {
+ return new const_iterator(row, 1);
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::end() const {
+ return new const_iterator(row, row.size());
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::lower_bound(Variable v) const {
+ return new const_iterator(row, v.space_dimension());
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::const_iterator
+::const_iterator(const Row& row1, dimension_type i)
+ : row(&row1), itr(row1.lower_bound(i)) {
+ skip_zeroes_forward();
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::const_iterator
+::clone() const {
+ return new const_iterator(*this);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator++() {
+ ++itr;
+ skip_zeroes_forward();
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator--() {
+ --itr;
+ skip_zeroes_backward();
+}
+
+template <typename Row>
+typename Linear_Expression_Impl<Row>::const_iterator::reference
+Linear_Expression_Impl<Row>::const_iterator
+::operator*() const {
+ return *itr;
+}
+
+template <typename Row>
+Variable
+Linear_Expression_Impl<Row>::const_iterator
+::variable() const {
+ const dimension_type i = itr.index();
+ PPL_ASSERT(i != 0);
+ return Variable(i - 1);
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::const_iterator
+::operator==(const const_iterator_interface& x) const {
+ const const_iterator* const p = dynamic_cast<const const_iterator*>(&x);
+ // Comparing iterators belonging to different rows is forbidden.
+ PPL_ASSERT(p != 0);
+ PPL_ASSERT(row == p->row);
+ return itr == p->itr;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::ascii_dump(std::ostream& s) const {
+ s << "size " << (space_dimension() + 1) << " ";
+ for (dimension_type i = 0; i < row.size(); ++i) {
+ s << row.get(i);
+ if (i != row.size() - 1)
+ s << ' ';
+ }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str))
+ return false;
+ if (str != "size")
+ return false;
+
+ dimension_type new_size;
+ if (!(s >> new_size))
+ return false;
+
+ row.resize(0);
+ row.resize(new_size);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(c);
+
+ for (dimension_type j = 0; j < new_size; ++j) {
+ if (!(s >> c))
+ return false;
+ if (c != 0)
+ row.insert(j, c);
+ }
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::OK() const {
+ return row.OK();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 905. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_templates.hh line 1. */
+/* Linear_Form class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 1. */
+/* Box class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class Congruences_Reduction;
+
+template <typename D1, typename D2>
+class Shape_Preserving_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 50. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+//! Swaps \p x with \p y.
+/*! \relates Box */
+template <typename ITV>
+void swap(Box<ITV>& x, Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+ Note that \p x and \p y may be dimension-incompatible boxes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same box.
+/*! \relates Box
+ Note that \p x and \p y may be dimension-incompatible boxes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+ Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+ typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x, const Box<ITV>& y,
+ Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+ A Box object represents the smash product of \f$n\f$
+ not necessarily closed and possibly unbounded intervals
+ represented by objects of class \p ITV,
+ where \f$n\f$ is the space dimension of the box.
+
+ An <EM>interval constraint</EM> (resp., <EM>interval congruence</EM>)
+ is a syntactic constraint (resp., congruence) that only mentions
+ a single space dimension.
+
+ The Box domain <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - the interval constraints that are optimally supported by
+ the template argument class \c ITV;
+ - the interval congruences that are optimally supported by
+ the template argument class \c ITV.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ The user interface for the Box domain is meant to be as similar
+ as possible to the one developed for the polyhedron class C_Polyhedron.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+ //! The type of intervals used to implement the box.
+ typedef ITV interval_type;
+
+ //! Returns the maximum space dimension that a Box can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns false indicating that this domain does not recycle constraints
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns false indicating that this domain does not recycle congruences
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds a universe or empty box of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the box;
+
+ \param kind
+ Specifies whether the universe or the empty box has to be built.
+ */
+ explicit Box(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Box(const Box& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename Other_ITV>
+ explicit Box(const Box<Other_ITV>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a box from the system of constraints \p cs.
+ /*!
+ The box inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref intervals "interval constraints"
+ are ignored (even though they may have contributed
+ to the space dimension).
+ */
+ explicit Box(const Constraint_System& cs);
+
+ //! Builds a box recycling a system of constraints \p cs.
+ /*!
+ The box inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref intervals "interval constraints"
+ are ignored (even though they may have contributed
+ to the space dimension).
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ Box(const Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a box from the system of generators \p gs.
+ /*!
+ Builds the smallest box containing the polyhedron defined by \p gs.
+ The box inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit Box(const Generator_System& gs);
+
+ //! Builds a box recycling the system of generators \p gs.
+ /*!
+ Builds the smallest box containing the polyhedron defined by \p gs.
+ The box inherits the space dimension of \p gs.
+
+ \param gs
+ The generator system describing the polyhedron to be approximated.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ Box(const Generator_System& gs, Recycle_Input dummy);
+
+ /*!
+ Builds the smallest box containing the grid defined by a
+ system of congruences \p cgs.
+ The box inherits the space dimension of \p cgs.
+
+ \param cgs
+ A system of congruences: congruences that are not
+ non-relational equality constraints are ignored
+ (though they may have contributed to the space dimension).
+ */
+ explicit Box(const Congruence_System& cgs);
+
+ /*!
+ Builds the smallest box containing the grid defined by a
+ system of congruences \p cgs, recycling \p cgs.
+ The box inherits the space dimension of \p cgs.
+
+ \param cgs
+ A system of congruences: congruences that are not
+ non-relational equality constraints are ignored
+ (though they will contribute to the space dimension).
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds a box containing the BDS \p bds.
+ /*!
+ Builds the smallest box containing \p bds using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ template <typename T>
+ explicit Box(const BD_Shape<T>& bds,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the octagonal shape \p oct.
+ /*!
+ Builds the smallest box containing \p oct using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ template <typename T>
+ explicit Box(const Octagonal_Shape<T>& oct,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the polyhedron \p ph.
+ /*!
+ Builds a box containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the built box is the
+ smallest one containing \p ph.
+ */
+ explicit Box(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a box containing the grid \p gr.
+ /*!
+ Builds the smallest box containing \p gr using a polynomial algorithm.
+ The \p complexity argument is ignored.
+ */
+ explicit Box(const Grid& gr,
+ Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+ //! Builds a box containing the partially reduced product \p dp.
+ /*!
+ Builds a box containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity.
+ */
+ template <typename D1, typename D2, typename R>
+ explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ Box& operator=(const Box& y);
+
+ /*! \brief
+ Swaps \p *this with \p y
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ void m_swap(Box& y);
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the Box
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns the relations holding between \p *this and the constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and the congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and the generator \p g.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool contains(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Box& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this satisfies
+ all its invariants.
+ */
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the Box
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the Box domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the box domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints to be added. They may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the box domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the box domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the box domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the box domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+ To avoid termination problems, each constraint in \p cs
+ will be used for a single refinement step.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \note
+ The user is warned that the accuracy of this refinement operator
+ depends on the order of evaluation of the constraints in \p cs,
+ which is in general unpredictable. If a fine control on such an
+ order is needed, the user should consider calling the method
+ <code>refine_with_constraint(const Constraint& c)</code> inside
+ an appropriate looping construct.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the constraint \p c for constraint propagation on \p *this.
+
+ \param c
+ The constraint to be used for constraint propagation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void propagate_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraints in \p cs for constraint propagation on \p *this.
+
+ \param cs
+ The constraints to be used for constraint propagation.
+
+ \param max_iterations
+ The maximum number of propagation steps for each constraint in
+ \p cs. If zero (the default), the number of propagation steps
+ will be unbounded, possibly resulting in an infinite loop.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ This method may lead to non-termination if \p max_iterations is 0.
+ */
+ void propagate_constraints(const Constraint_System& cs,
+ dimension_type max_iterations = 0);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest box containing the union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Box& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Box& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ void affine_form_image(Variable var,
+ const Linear_Form<ITV>& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Box& y);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system. When non-null,
+ the pointed-to constraint system is assumed to represent the
+ conditional or looping construct guard with respect to which
+ wrapping is performed. Since wrapping requires the computation
+ of upper bounds and due to non-distributivity of constraint
+ refinement over upper bounds, passing a constraint system in this
+ way can be more precise than refining the result of the wrapping
+ operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter which is ignored for the Box domain.
+
+ \param wrap_individually
+ A precision parameter which is ignored for the Box domain.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename T>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_widening_assign(const T& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator that points to the first stop-point.
+
+ \param last
+ An iterator that points one past the last stop-point.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename T, typename Iterator>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_widening_assign(const T& y,
+ Iterator first, Iterator last);
+
+ //! Same as CC76_widening_assign(y, tp).
+ void widening_assign(const Box& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A box that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened box.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const Box& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of restoring in \p y the constraints
+ of \p *this that were lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ A Box that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ As was the case for widening operators, the argument \p y is meant to
+ denote the value computed in the previous iteration step, whereas
+ \p *this denotes the value computed in the current iteration step
+ (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+ <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+ the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+ */
+ template <typename T>
+ typename Enable_If<Is_Same<T, Box>::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+ CC76_narrowing_assign(const T& y);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old box into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new
+ box, which is defined by a system of interval constraints in which the
+ variables running through the new dimensions are unconstrained.
+ For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the box
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the box and does not embed it in
+ the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the
+ new box, which is defined by a system of bounded differences in
+ which the variables running through the new dimensions are all
+ constrained to be equal to 0.
+ For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the box
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Seeing a box as a set of tuples (its points),
+ assigns to \p *this all the tuples that can be obtained by concatenating,
+ in the order given, a tuple of \p *this with a tuple of \p y.
+
+ Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+ corresponding, on entry, to \p *this and \p y, respectively.
+ Upon successful completion, \p *this will represent the box
+ \f$R \sseq \Rset^{n+m}\f$ such that
+ \f[
+ R \defeq
+ \Bigl\{\,
+ (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+ \Bigm|
+ (x_1, \ldots, x_n)^\transpose \in B,
+ (y_1, \ldots, y_m)^\transpose \in D
+ \,\Bigl\}.
+ \f]
+ Another way of seeing it is as follows: first increases the space
+ dimension of \p *this by adding \p y.space_dimension() new
+ dimensions; then adds to the system of constraints of \p *this a
+ renamed-apart version of the constraints of \p y.
+ */
+ void concatenate_assign(const Box& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty co-domain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the co-domain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ /*! \brief
+ Returns a reference the interval that bounds \p var.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ const ITV& get_interval(Variable var) const;
+
+ /*! \brief
+ Sets to \p i the interval that bounds \p var.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void set_interval(Variable var, const ITV& i);
+
+ /*! \brief
+ If the space dimension of \p var is unbounded below, return
+ <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+ \p n, \p d and \p closed accordingly.
+
+ \note
+ It is assumed that <CODE>*this</CODE> is a non-empty box
+ having space dimension greater than or equal to that of \p var.
+ An undefined behavior is obtained if this assumption is not met.
+ \if Include_Implementation_Details
+ To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+ (having space dimension greater than or equal to that of \p var)
+ such that <CODE>!marked_empty()</CODE> holds, then the method can be
+ called without incurring in undefined behavior: it will return
+ <EM>unspecified</EM> boundary values that, if queried systematically
+ on all space dimensions, will encode the box emptiness.
+ \endif
+
+ Let \f$I\f$ be the interval corresponding to variable \p var
+ in the non-empty box <CODE>*this</CODE>.
+ If \f$I\f$ is not bounded from below, simply return <CODE>false</CODE>
+ (leaving all other parameters unchanged).
+ Otherwise, set \p n, \p d and \p closed as follows:
+ - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+ that the fraction \f$n/d\f$ corresponds to the greatest lower bound
+ of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+ that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+ and if \f$n\f$ is zero then \f$d\f$ is one;
+ - \p closed is set to <CODE>true</CODE> if and only if the lower
+ boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+ */
+ bool has_lower_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+
+ /*! \brief
+ If the space dimension of \p var is unbounded above, return
+ <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+ \p n, \p d and \p closed accordingly.
+
+ \note
+ It is assumed that <CODE>*this</CODE> is a non-empty box
+ having space dimension greater than or equal to that of \p var.
+ An undefined behavior is obtained if this assumption is not met.
+ \if Include_Implementation_Details
+ To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+ (having space dimension greater than or equal to that of \p var)
+ such that <CODE>!marked_empty()</CODE> holds, then the method can be
+ called without incurring in undefined behavior: it will return
+ <EM>unspecified</EM> boundary values that, if queried systematically
+ on all space dimensions, will encode the box emptiness.
+ \endif
+
+ Let \f$I\f$ be the interval corresponding to variable \p var
+ in the non-empty box <CODE>*this</CODE>.
+ If \f$I\f$ is not bounded from above, simply return <CODE>false</CODE>
+ (leaving all other parameters unchanged).
+ Otherwise, set \p n, \p d and \p closed as follows:
+ - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+ that the fraction \f$n/d\f$ corresponds to the least upper bound
+ of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+ that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+ and if \f$n\f$ is zero then \f$d\f$ is one;
+ - \p closed is set to <CODE>true</CODE> if and only if the upper
+ boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+ */
+ bool has_upper_bound(Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const;
+
+ //! Returns a system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of congruences approximating \p *this.
+ Congruence_System congruences() const;
+
+ //! Returns a minimized system of congruences approximating \p *this.
+ Congruence_System minimized_congruences() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If <CODE>x</CODE> and <CODE>y</CODE> are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool ascii_load(std::istream& s);
+
+private:
+ template <typename Other_ITV>
+ friend class Parma_Polyhedra_Library::Box;
+
+ friend bool
+ operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library
+ ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+ template <typename Specialization, typename Temp, typename To, typename I>
+ friend bool Parma_Polyhedra_Library::l_m_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+ //! The type of sequence used to implement the box.
+ typedef std::vector<ITV> Sequence;
+
+ /*! \brief
+ The type of intervals used by inner computations when trying to limit
+ the cumulative effect of approximation errors.
+ */
+ typedef ITV Tmp_Interval_Type;
+
+ //! A sequence of intervals, one for each dimension of the vector space.
+ Sequence seq;
+
+#define PPL_IN_Box_CLASS
+/* Automatically generated from PPL source file ../src/Box_Status_idefs.hh line 1. */
+/* Box<ITV>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status_idefs.hh directly; use Box_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+ - <EM>empty</EM>: the box is the empty set.
+ - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+ \f$\Rset^n\f$.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+ //! By default Status is the empty set of assertion.
+ Status();
+
+ //! Ordinary copy constructor.
+ Status(const Status& y);
+
+ //! Copy constructor from a box of different type.
+ template <typename Other_ITV>
+ Status(const typename Box<Other_ITV>::Status& y);
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_empty_up_to_date() const;
+ void reset_empty_up_to_date();
+ void set_empty_up_to_date();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_universe() const;
+ void reset_universe();
+ void set_universe();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions.
+ //@{
+ static const flags_t NONE = 0U;
+ static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+ static const flags_t EMPTY = 1U << 1;
+ static const flags_t UNIVERSE = 1U << 2;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 1768. */
+#undef PPL_IN_Box_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+public:
+ //! Causes the box to become empty, i.e., to represent the empty set.
+ void set_empty();
+
+private:
+ //! Marks \p *this as definitely not empty.
+ void set_nonempty();
+
+ //! Asserts the validity of the empty flag of \p *this.
+ void set_empty_up_to_date();
+
+ //! Invalidates empty flag of \p *this.
+ void reset_empty_up_to_date();
+
+ /*! \brief
+ Checks the hard way whether \p *this is an empty box:
+ returns <CODE>true</CODE> if and only if it is so.
+ */
+ bool check_empty() const;
+
+ /*! \brief
+ Returns a reference the interval that bounds
+ the box on the <CODE>k</CODE>-th space dimension.
+ */
+ const ITV& operator[](dimension_type k) const;
+
+ /*! \brief
+ WRITE ME.
+ */
+ static I_Result
+ refine_interval_no_check(ITV& itv,
+ Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void
+ add_interval_constraint_no_check(dimension_type var_id,
+ Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_constraints_no_check(const Constraint_System& cs);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_congruence_no_check(const Congruence& cg);
+
+ /*! \brief
+ WRITE ME.
+ */
+ void add_congruences_no_check(const Congruence_System& cgs);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for the refinement.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for the refinement.
+ To avoid termination problems, each constraint in \p cs
+ will be used for a single refinement step.
+
+ \warning
+ If \p cs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint_System& cs);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ /*! \brief
+ Uses the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be added.
+ Nontrivial proper congruences are ignored.
+
+ \warning
+ If \p cgs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence_System& cgs);
+
+ /*! \brief
+ Propagates the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be propagated.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+
+ \warning
+ This method may lead to non-termination.
+
+ \if Include_Implementation_Details
+
+ For any expression \f$e\f$, we denote by
+ \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+ \right\downarrow\f$) the result of any computation that is
+ guaranteed to yield an upper (resp., lower) approximation of
+ \f$e\f$. So there exists \f$\epsilon \in \Rset\f$ with
+ \f$\epsilon \geq 0\f$ such that
+ \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+ If \f$\epsilon = 0\f$ we say that the computation of
+ \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+ we say it is <EM>inexact</EM> otherwise.
+ Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+ Consider a constraint of the general form
+ \f[
+ z + \sum_{i \in I}{a_ix_i} \relsym 0,
+ \f]
+ where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+ \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+ \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+ The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+ such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+ \f$a_i < 0\f$ if \f$i \in N\f$.
+ Suppose that, for each \f$i \in P \union N\f$ a variation interval
+ \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+ and the supremum of \f$\chi_i\f$ are denoted, respectively,
+ by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+ \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+ For each \f$k \in P\f$, we have
+ \f[
+ x_k
+ \relsym
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_ix_i}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_ix_i}
+ \Biggr).
+ \f]
+ Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+ we have
+ \f[
+ x_k
+ \geq
+ \Biggl\downarrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+ \Biggr)
+ \Biggr\downarrow
+ \f]
+ and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+ \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+ \f[
+ x_k
+ \leq
+ \Biggl\uparrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in P}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+ \Biggr)
+ \Biggl\uparrow.
+ \f]
+ In the first inequality, the relation is strict if
+ \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+ \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+ In the second inequality, the relation is strict if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+ \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+ For each \f$k \in N\f$, we have
+ \f[
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_ix_i}
+ - \sum_{i \in P}{a_ix_i}
+ \Biggr)
+ \relsym
+ x_k.
+ \f]
+ Thus, if
+ \f$\chi_i^\mathrm{l} \in \Rset\f$
+ for each \f$i \in N \setdiff \{ k \}\f$ and
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+ we have
+ \f[
+ \Biggl\uparrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+ - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+ \Biggr)
+ \Biggl\uparrow
+ \geq
+ x_k
+ \f]
+ and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+ \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+ and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+ \f[
+ \Biggl\downarrow
+ \frac{1}{a_k}
+ \Biggl(
+ - z
+ - \sum_{\genfrac{}{}{0pt}{}
+ {\scriptstyle i \in N}
+ {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+ - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+ \Biggr)
+ \Biggl\downarrow
+ \leq
+ x_k.
+ \f]
+ In the first inequality, the relation is strict if
+ \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+ \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+ In the second inequality, the relation is strict if
+ \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+ \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+ \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+ \endif
+ */
+ void propagate_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ Propagates the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be propagated.
+
+ \param max_iterations
+ The maximum number of propagation steps for each constraint in \p cs.
+ If zero, the number of propagation steps will be unbounded, possibly
+ resulting in an infinite loop.
+
+ \warning
+ If \p cs and \p *this are dimension-incompatible,
+ the behavior is undefined.
+
+ \warning
+ This method may lead to non-termination if \p max_iterations is 0.
+ */
+ void propagate_constraints_no_check(const Constraint_System& cs,
+ dimension_type max_iterations);
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p *this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ /*! \brief
+ Adds to \p limiting_box the interval constraints in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_box(const Constraint_System& cs,
+ Box& limiting_box) const;
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const Box& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint_System& cs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence_System& cgs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns the relations holding between an interval and
+ an interval constraint.
+
+ \param i
+ The interval;
+
+ \param constraint_type
+ The constraint type;
+
+ \param numer
+ The numerator of the constraint bound;
+
+ \param denom
+ The denominator of the constraint bound
+
+ The interval constraint has the form
+ <CODE>denom * Variable(0) relsym numer</CODE>
+ where relsym is <CODE>==</CODE>, <CODE>></CODE> or <CODE>>=</CODE>
+ depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+ const Constraint::Type constraint_type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom = 1);
+
+class Box_Helpers {
+public:
+ // This is declared here so that Linear_Expression needs to be friend of
+ // Box_Helpers only, and doesn't need to be friend of this, too.
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as an interval constraint.
+ /*! \relates Box
+ \return
+ <CODE>true</CODE> if the constraint \p c is an
+ \ref intervals "interval constraint";
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0 and 1.
+
+ \param c_only_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the only variable having
+ a non-zero coefficient in \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_interval_constraint(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_only_var);
+
+ // This is declared here so that Linear_Expression needs to be friend of
+ // Box_Helpers only, and doesn't need to be friend of this, too.
+ static bool extract_interval_congruence(const Congruence& cg,
+ dimension_type& cg_num_vars,
+ dimension_type& cg_only_var);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_Status_inlines.hh line 1. */
+/* Box<ITV>::Status class implementation: inline functions.
+*/
+
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+ : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+ : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+ : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+ return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+ reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+ set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+ set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+ return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+ reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+ set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+ if (test_empty_up_to_date()
+ && test_empty()
+ && test_universe()) {
+#ifndef NDEBUG
+ std::cerr
+ << "The status asserts emptiness and universality at the same time."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::Boxes;
+ s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << separator
+ << (test_empty() ? yes : no) << empty << separator
+ << (test_universe() ? yes : no) << universe << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::Boxes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+ return false;
+ if (positive)
+ set_empty_up_to_date();
+
+ if (!get_field(s, Implementation::Boxes::empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, universe, positive))
+ return false;
+ if (positive)
+ set_universe();
+ else
+ reset_universe();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_inlines.hh line 1. */
+/* Box class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 1. */
+/* Constraint_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 1. */
+/* Linear_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 1. */
+/* Swapping_Vector class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Swapping_Vector;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 29. */
+
+#include <vector>
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A wrapper for std::vector that calls a swap() method instead of copying
+//! elements, when possible.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Swapping_Vector {
+
+public:
+ typedef typename std::vector<T>::const_iterator const_iterator;
+ typedef typename std::vector<T>::iterator iterator;
+ typedef typename std::vector<T>::size_type size_type;
+
+ Swapping_Vector();
+ explicit Swapping_Vector(dimension_type new_size);
+ Swapping_Vector(dimension_type new_size, const T& x);
+
+ void clear();
+ void reserve(dimension_type new_capacity);
+ void resize(dimension_type new_size);
+ void resize(dimension_type new_size, const T& x);
+
+ dimension_type size() const;
+ dimension_type capacity() const;
+ bool empty() const;
+
+ void m_swap(Swapping_Vector& v);
+
+ T& operator[](dimension_type i);
+ const T& operator[](dimension_type i) const;
+
+ T& back();
+ const T& back() const;
+
+ void push_back(const T& x);
+ void pop_back();
+
+ iterator begin();
+ iterator end();
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ iterator erase(iterator itr);
+ iterator erase(iterator first, iterator last);
+
+ // This is defined only if T has an external_memory_in_bytes() method.
+ memory_size_type external_memory_in_bytes() const;
+
+ dimension_type max_num_rows();
+
+private:
+ std::vector<T> impl;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Swapping_Vector */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Swapping_Vector<T>& x, Swapping_Vector<T>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_inlines.hh line 1. */
+/* Swapping_Vector class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector()
+ : impl() {
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type i)
+ : impl() {
+ // NOTE: This is not the same as constructing impl as `impl(i)', because
+ // this implementation calls compute_capacity().
+ resize(i);
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type new_size, const T& x)
+ : impl() {
+ resize(new_size, x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::clear() {
+ impl.clear();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::reserve(dimension_type new_capacity) {
+ if (impl.capacity() < new_capacity) {
+ // Reallocation will take place.
+ std::vector<T> new_impl;
+
+ new_impl.reserve(compute_capacity(new_capacity, max_num_rows()));
+ new_impl.resize(impl.size());
+
+ using std::swap;
+
+ // Steal the old elements.
+ for (dimension_type i = impl.size(); i-- > 0; )
+ swap(new_impl[i], impl[i]);
+
+ // Put the new vector into place.
+ swap(impl, new_impl);
+ }
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size) {
+ reserve(new_size);
+ impl.resize(new_size);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size, const T& x) {
+ reserve(new_size);
+ impl.resize(new_size, x);
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::size() const {
+ return impl.size();
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::capacity() const {
+ return impl.capacity();
+}
+
+template <typename T>
+inline bool
+Swapping_Vector<T>::empty() const {
+ return impl.empty();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::m_swap(Swapping_Vector& v) {
+ using std::swap;
+ swap(impl, v.impl);
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::operator[](dimension_type i) {
+ return impl[i];
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::operator[](dimension_type i) const {
+ return impl[i];
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::back() {
+ return impl.back();
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::back() const {
+ return impl.back();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::push_back(const T& x) {
+ reserve(size() + 1);
+ impl.push_back(x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::pop_back() {
+ impl.pop_back();
+}
+
+template <typename T>
+inline memory_size_type
+Swapping_Vector<T>::external_memory_in_bytes() const {
+ // Estimate the size of vector.
+ memory_size_type n = impl.capacity() * sizeof(T);
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ n += i->external_memory_in_bytes();
+ return n;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::begin() {
+ return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::end() {
+ return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::begin() const {
+ return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::end() const {
+ return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator itr) {
+ PPL_ASSERT(itr >= begin());
+ PPL_ASSERT(itr < end());
+ const dimension_type old_i = itr - begin();
+ dimension_type i = old_i;
+ ++i;
+ while (i != size())
+ swap(impl[i-1], impl[i]);
+ impl.pop_back();
+ return begin() + old_i;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator first, iterator last) {
+ PPL_ASSERT(begin() <= first);
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= end());
+ const iterator old_first = first;
+ typedef typename std::iterator_traits<iterator>::difference_type diff_t;
+ const diff_t k = last - first;
+ const dimension_type n = static_cast<dimension_type>(end() - last);
+ using std::swap;
+ for (dimension_type i = 0; i < n; ++i, ++first)
+ swap(*first, *(first + k));
+ impl.erase(end() - k, end());
+ return old_first;
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::max_num_rows() {
+ return impl.max_size();
+}
+
+template <typename T>
+inline void
+swap(Swapping_Vector<T>& vec1, Swapping_Vector<T>& vec2) {
+ vec1.m_swap(vec2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 97. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 33. */
+
+/* Automatically generated from PPL source file ../src/Bit_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 39. */
+
+// TODO: Check how much of this description is still true.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+ An object of this class represents either a constraint system
+ or a generator system. Each Linear_System object can be viewed
+ as a finite sequence of strong-normalized Row objects,
+ where each Row implements a constraint or a generator.
+ Linear systems are characterized by the matrix of coefficients,
+ also encoding the number, size and capacity of Row objects,
+ as well as a few additional information, including:
+ - the topological kind of (all) the rows;
+ - an indication of whether or not some of the rows in the Linear_System
+ are <EM>pending</EM>, meaning that they still have to undergo
+ an (unspecified) elaboration; if there are pending rows, then these
+ form a proper suffix of the overall sequence of rows;
+ - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+ non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_System {
+public:
+
+ // NOTE: `iterator' is actually a const_iterator.
+ typedef typename Swapping_Vector<Row>::const_iterator iterator;
+ typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+ //! Builds an empty linear system with specified topology.
+ /*!
+ Rows size and capacity are initialized to \f$0\f$.
+ */
+ Linear_System(Topology topol, Representation r);
+
+ //! Builds a system with specified topology and dimensions.
+ /*!
+ \param topol
+ The topology of the system that will be created;
+
+ \param space_dim
+ The number of space dimensions of the system that will be created.
+
+ \param r
+ The representation for system's rows.
+
+ Creates a \p n_rows \f$\times\f$ \p space_dim system whose
+ coefficients are all zero and with the given topology.
+ */
+ Linear_System(Topology topol, dimension_type space_dim, Representation r);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A tag class.
+ /*! \ingroup PPL_CXX_interface
+ Tag class to differentiate the Linear_System copy constructor that
+ copies pending rows as pending from the one that transforms
+ pending rows into non-pending ones.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ struct With_Pending {
+ };
+
+ //! Copy constructor: pending rows are transformed into non-pending ones.
+ Linear_System(const Linear_System& y);
+
+ //! Copy constructor with specified representation. Pending rows are
+ //! transformed into non-pending ones.
+ Linear_System(const Linear_System& y, Representation r);
+
+ //! Full copy constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, With_Pending);
+
+ //! Full copy constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, Representation r, With_Pending);
+
+ //! Assignment operator: pending rows are transformed into non-pending ones.
+ Linear_System& operator=(const Linear_System& y);
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Linear_System& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Linear_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Linear_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the rows in the system.
+ /*!
+ The computation of the space dimension correctly ignores
+ the column encoding the inhomogeneous terms of constraint
+ (resp., the divisors of generators);
+ if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+ also the column of the \f$\epsilon\f$-dimension coefficients
+ will be ignored.
+ */
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ // TODO: Consider removing this.
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ // TODO: Consider making this private.
+ //! Removes all the specified dimensions from the system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ // TODO: Consider making this private.
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ space dimensions must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a const reference to the \p k-th row of the system.
+ const Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ iterator begin();
+ iterator end();
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ bool has_no_rows() const;
+ dimension_type num_rows() const;
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ //! Sign-normalizes the system.
+ void sign_normalize();
+
+ //! \name Accessors
+ //@{
+ //! Returns the system topology.
+ Topology topology() const;
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+ //@} // Accessors
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ //! Sets the system topology to \p t .
+ void set_topology(Topology t);
+
+ //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+ void set_necessarily_closed();
+
+ //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ void set_not_necessarily_closed();
+
+ // TODO: Consider removing this, or making it private.
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ // TODO: Consider removing this, or making it private.
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ /*! \brief
+ Adds a copy of \p r to the system,
+ automatically resizing the system or the row's copy, if needed.
+ */
+ void insert(const Row& r);
+
+ /*! \brief
+ Adds a copy of the given row to the pending part of the system,
+ automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(const Row& r);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+ */
+ void insert(Row& r, Recycle_Input);
+
+ /*! \brief
+ Adds the given row to the pending part of the system, stealing its
+ contents and automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(Row& r, Recycle_Input);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Linear_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Linear_System& r);
+
+ //! Adds to \p *this a the rows of `y', stealing them from `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(Linear_System& r, Recycle_Input);
+
+ //! Adds the rows of `y' to the pending part of `*this', stealing them from
+ //! `y'.
+ void insert_pending(Linear_System& r, Recycle_Input);
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Sorts the rows (in growing order) form \p first_row to
+ \p last_row and eliminates duplicated ones.
+ */
+ void sort_rows(dimension_type first_row, dimension_type last_row);
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Linear_System& y);
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most space dimensions.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as to
+ simplify the linear system.
+ */
+ void simplify();
+
+ //! Clears the system deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Reads into a Linear_System object the information produced by the
+ output of ascii_dump(std::ostream&) const. The specialized methods
+ provided by Constraint_System and Generator_System take care of
+ properly reading the contents of the system.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! The vector that contains the rows.
+ /*!
+ \note This is public for convenience. Clients that modify if must preserve
+ the class invariant.
+ */
+ Swapping_Vector<Row> rows;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void remove_row_no_ok(dimension_type i, bool keep_sorted = false);
+
+ /*! \brief
+ Adds \p r to the pending part of the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void insert_pending_no_ok(Row& r, Recycle_Input);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void insert_no_ok(Row& r, Recycle_Input);
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ /*!
+ This method is for internal use, it does *not* assert OK() at the end,
+ so it can be used for invalid systems.
+ */
+ void set_space_dimension_no_ok(dimension_type space_dim);
+
+ //! Swaps the [first,last) row interval with the
+ //! [first + offset, last + offset) interval.
+ /*!
+ These intervals may not be disjunct.
+
+ Sorting of these intervals is *not* preserved.
+
+ Either both intervals contain only not-pending rows, or they both
+ contain pending rows.
+ */
+ void swap_row_intervals(dimension_type first, dimension_type last,
+ dimension_type offset);
+
+ //! The space dimension of each row. All rows must have this number of
+ //! space dimensions.
+ dimension_type space_dimension_;
+
+ //! The topological kind of the rows in the system. All rows must have this
+ //! topology.
+ Topology row_topology;
+
+ //! The index of the first pending row.
+ dimension_type index_first_pending;
+
+ /*! \brief
+ <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+ <CODE>bool compare(const Row&, const Row&)</CODE>.
+ If <CODE>false</CODE> may not be sorted.
+ */
+ bool sorted;
+
+ Representation representation_;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ struct Row_Less_Than {
+ bool operator()(const Row& x, const Row& y) const;
+ };
+
+ //! Comparison predicate (used when implementing the unique algorithm).
+ struct Unique_Compare {
+ Unique_Compare(const Swapping_Vector<Row>& cont,
+ dimension_type base = 0);
+
+ bool operator()(dimension_type i, dimension_type j) const;
+
+ const Swapping_Vector<Row>& container;
+ const dimension_type base_index;
+ };
+
+ friend class Polyhedron;
+ friend class Generator_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Parma_Polyhedra_Library::Linear_System<Row>& x,
+ Parma_Polyhedra_Library::Linear_System<Row>& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_inlines.hh line 1. */
+/* Linear_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 1. */
+/* Bit_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 29. */
+#include <iosfwd>
+#include <gmpxx.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Row */
+void swap(Bit_Row& x, Bit_Row& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Bit_Row>::iterator x,
+ std::vector<Bit_Row>::iterator y);
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+ Compares \p x with \p y starting from the least significant bits.
+ The ordering is total and has the following property: if \p x and \p y
+ are two rows seen as sets of naturals, if \p x is a strict subset
+ of \p y, then \p x comes before \p y.
+
+ Returns
+ - -1 if \p x comes before \p y in the ordering;
+ - 0 if \p x and \p y are equal;
+ - 1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+ indicating whether the inclusion is strict or not.
+
+ \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+ bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+ //! Default constructor.
+ Bit_Row();
+
+ //! Copy constructor.
+ Bit_Row(const Bit_Row& y);
+
+ //! Set-union constructor.
+ /*!
+ Constructs an object containing the set-union of \p y and \p z.
+ */
+ Bit_Row(const Bit_Row& y, const Bit_Row& z);
+
+ //! Destructor.
+ ~Bit_Row();
+
+ //! Assignment operator.
+ Bit_Row& operator=(const Bit_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Bit_Row& y);
+
+ //! Returns the truth value corresponding to the bit in position \p k.
+ bool operator[](unsigned long k) const;
+
+ //! Sets the bit in position \p k.
+ void set(unsigned long k);
+
+ //! Sets bits up to position \p k (excluded).
+ void set_until(unsigned long k);
+
+ //! Clears the bit in position \p k.
+ void clear(unsigned long k);
+
+ //! Clears bits from position \p k (included) onward.
+ void clear_from(unsigned long k);
+
+ //! Clears all the bits of the row.
+ void clear();
+
+ //! Assigns to \p *this the set-theoretic union of \p x and \p y.
+ void union_assign(const Bit_Row& x, const Bit_Row& y);
+
+ //! Assigns to \p *this the set-theoretic intersection of \p x and \p y.
+ void intersection_assign(const Bit_Row& x, const Bit_Row& y);
+
+ //! Assigns to \p *this the set-theoretic difference of \p x and \p y.
+ void difference_assign(const Bit_Row& x, const Bit_Row& y);
+
+
+ friend int compare(const Bit_Row& x, const Bit_Row& y);
+ friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+ friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+ friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+ friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+ bool& strict_subset);
+ friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+ //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+ unsigned long first() const;
+
+ /*! \brief
+ Returns the index of the first set bit after \p position
+ or ULONG_MAX if no bit after \p position is set.
+ */
+ unsigned long next(unsigned long position) const;
+
+ //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+ unsigned long last() const;
+
+ /*! \brief
+ Returns the index of the first set bit before \p position
+ or ULONG_MAX if no bits before \p position is set.
+ */
+ unsigned long prev(unsigned long position) const;
+
+ //! Returns the number of set bits in the row.
+ unsigned long count_ones() const;
+
+ //! Returns <CODE>true</CODE> if no bit is set in the row.
+ bool empty() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied
+ bool OK() const;
+
+private:
+ //! Bit-vector representing the row.
+ mpz_t vec;
+
+ //! Assigns to \p *this the union of \p y and \p z.
+ /*!
+ The size of \p y must be be less than or equal to the size of \p z.
+ Upon entry, \p vec must have allocated enough space to contain the result.
+ */
+ void union_helper(const Bit_Row& y, const Bit_Row& z);
+};
+
+/* Automatically generated from PPL source file ../src/Bit_Row_inlines.hh line 1. */
+/* Bit_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_inlines.hh line 30. */
+
+// For the declaration of ffs(3).
+#if defined(PPL_HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(PPL_HAVE_STRING_H)
+# include <string.h>
+#endif
+
+#define PPL_BITS_PER_GMP_LIMB sizeof_to_bits(PPL_SIZEOF_MP_LIMB_T)
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+ mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+ mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z) {
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ const mp_size_t z_size = z.vec->_mp_size;
+ PPL_ASSERT(z_size >= 0);
+ if (y_size < z_size) {
+ PPL_ASSERT(static_cast<unsigned long>(z_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_init2(vec, static_cast<unsigned long>(z_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(y, z);
+ }
+ else {
+ PPL_ASSERT(static_cast<unsigned long>(y_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_init2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(z, y);
+ }
+}
+
+inline
+Bit_Row::~Bit_Row() {
+ mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+ mpz_set(vec, y.vec);
+ return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+ mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+ mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+ mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+ const mp_size_t x_size = vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ return (x_size == 0) ? 0 : mpn_popcount(vec->_mp_d, x_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+ return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::m_swap(Bit_Row& y) {
+ mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+ mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+ return static_cast<memory_size_type>(vec[0]._mp_alloc) * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Bit_Row::union_assign(const Bit_Row& x, const Bit_Row& y) {
+ const mp_size_t x_size = x.vec->_mp_size;
+ PPL_ASSERT(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ PPL_ASSERT(y_size >= 0);
+ if (x_size < y_size) {
+ PPL_ASSERT(static_cast<unsigned long>(y_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_realloc2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(x, y);
+ }
+ else {
+ PPL_ASSERT(static_cast<unsigned long>(x_size)
+ <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+ mpz_realloc2(vec, static_cast<unsigned long>(x_size) * PPL_BITS_PER_GMP_LIMB);
+ union_helper(y, x);
+ }
+}
+
+inline void
+Bit_Row::intersection_assign(const Bit_Row& x, const Bit_Row& y) {
+ mpz_and(vec, x.vec, y.vec);
+}
+
+inline void
+Bit_Row::difference_assign(const Bit_Row& x, const Bit_Row& y) {
+ PPL_DIRTY_TEMP(mpz_class, complement_y);
+ mpz_com(complement_y.get_mpz_t(), y.vec);
+ mpz_and(vec, x.vec, complement_y.get_mpz_t());
+}
+
+namespace Implementation {
+
+/*! \brief
+ Assuming \p u is nonzero, returns the index of the first set bit in \p u.
+*/
+inline unsigned int
+first_one(unsigned int u) {
+ return ctz(u);
+}
+
+/*! \brief
+ Assuming \p ul is nonzero, returns the index of the first set bit in
+ \p ul.
+*/
+inline unsigned int
+first_one(unsigned long ul) {
+ return ctz(ul);
+}
+
+/*! \brief
+ Assuming \p ull is nonzero, returns the index of the first set bit in
+ \p ull.
+*/
+inline unsigned int
+first_one(unsigned long long ull) {
+ return ctz(ull);
+}
+
+/*! \brief
+ Assuming \p u is nonzero, returns the index of the last set bit in \p u.
+*/
+inline unsigned int
+last_one(unsigned int u) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(u)))
+ - 1U - clz(u);
+}
+
+/*! \brief
+ Assuming \p ul is nonzero, returns the index of the last set bit in
+ \p ul.
+*/
+inline unsigned int
+last_one(unsigned long ul) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(ul)))
+ - 1U - clz(ul);
+}
+
+/*! \brief
+ Assuming \p ull is nonzero, returns the index of the last set bit in
+ \p ull.
+*/
+inline unsigned int
+last_one(unsigned long long ull) {
+ return static_cast<unsigned int>(sizeof_to_bits(sizeof(ull)))
+ - 1U - clz(ull);
+}
+
+} // namespace Implementation
+
+/*! \relates Bit_Row */
+inline void
+swap(Bit_Row& x, Bit_Row& y) {
+ x.m_swap(y);
+}
+
+/*! \relates Bit_Row */
+inline void
+iter_swap(std::vector<Bit_Row>::iterator x,
+ std::vector<Bit_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 213. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_inlines.hh line 29. */
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_sorted() const {
+ // The flag `sorted' does not really reflect the sortedness status
+ // of a system (if `sorted' evaluates to `false' nothing is known).
+ // This assertion is used to ensure that the system
+ // is actually sorted when `sorted' value is 'true'.
+ PPL_ASSERT(!sorted || check_sorted());
+ return sorted;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_sorted(const bool b) {
+ sorted = b;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol, Representation r)
+ : rows(),
+ space_dimension_(0),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true),
+ representation_(r) {
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol,
+ dimension_type space_dim,
+ Representation r)
+ : rows(),
+ space_dimension_(0),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true),
+ representation_(r) {
+ set_space_dimension(space_dim);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::first_pending_row() const {
+ return index_first_pending;
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_pending_rows() const {
+ PPL_ASSERT(num_rows() >= first_pending_row());
+ return num_rows() - first_pending_row();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::unset_pending_rows() {
+ index_first_pending = num_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_index_first_pending_row(const dimension_type i) {
+ index_first_pending = i;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y)
+ : rows(y.rows),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ representation_(y.representation_) {
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ unset_pending_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r)
+ : rows(),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ representation_(r) {
+ rows.resize(y.num_rows());
+ for (dimension_type i = 0; i < y.num_rows(); ++i) {
+ // Create the copies with the right representation.
+ Row row(y.rows[i], r);
+ swap(rows[i], row);
+ }
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ unset_pending_rows();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, With_Pending)
+ : rows(y.rows),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted),
+ representation_(y.representation_) {
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r,
+ With_Pending)
+ : rows(),
+ space_dimension_(y.space_dimension_),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted),
+ representation_(r) {
+ rows.resize(y.num_rows());
+ for (dimension_type i = 0; i < y.num_rows(); ++i) {
+ // Create the copies with the right representation.
+ Row row(y.rows[i], r);
+ swap(rows[i], row);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Linear_System<Row>&
+Linear_System<Row>::operator=(const Linear_System& y) {
+ // NOTE: Pending rows are transformed into non-pending ones.
+ Linear_System<Row> tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::assign_with_pending(const Linear_System& y) {
+ Linear_System<Row> tmp(y, With_Pending());
+ swap(*this, tmp);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::m_swap(Linear_System& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(space_dimension_, y.space_dimension_);
+ swap(row_topology, y.row_topology);
+ swap(index_first_pending, y.index_first_pending);
+ swap(sorted, y.sorted);
+ swap(representation_, y.representation_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::clear() {
+ // Note: do NOT modify the value of `row_topology' and `representation'.
+ rows.clear();
+ index_first_pending = 0;
+ sorted = true;
+ space_dimension_ = 0;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_necessarily_closed() {
+ PPL_ASSERT(topology() == NOT_NECESSARILY_CLOSED);
+ row_topology = NECESSARILY_CLOSED;
+ ++space_dimension_;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].mark_as_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_not_necessarily_closed() {
+ PPL_ASSERT(topology() == NECESSARILY_CLOSED);
+ PPL_ASSERT(space_dimension() > 0);
+ row_topology = NOT_NECESSARILY_CLOSED;
+ --space_dimension_;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].mark_as_not_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_topology(Topology t) {
+ if (topology() == t)
+ return;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].set_topology(t);
+ row_topology = t;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_necessarily_closed() {
+ set_topology(NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_not_necessarily_closed() {
+ set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_necessarily_closed() const {
+ return row_topology == NECESSARILY_CLOSED;
+}
+
+template <typename Row>
+inline const Row&
+Linear_System<Row>::operator[](const dimension_type k) const {
+ return rows[k];
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::begin() {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::end() {
+ return rows.end();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::begin() const {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::end() const {
+ return rows.end();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::has_no_rows() const {
+ return rows.empty();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_rows() const {
+ return rows.size();
+}
+
+template <typename Row>
+inline Topology
+Linear_System<Row>::topology() const {
+ return row_topology;
+}
+
+template <typename Row>
+inline Representation
+Linear_System<Row>::representation() const {
+ return representation_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_representation(Representation r) {
+ representation_ = r;
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].set_representation(r);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::max_space_dimension() {
+ return Row::max_space_dimension();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::space_dimension() const {
+ return space_dimension_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension_no_ok(dimension_type space_dim) {
+ for (dimension_type i = rows.size(); i-- > 0; )
+ rows[i].set_space_dimension_no_ok(space_dim);
+ space_dimension_ = space_dim;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension(dimension_type space_dim) {
+ set_space_dimension_no_ok(space_dim);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row_no_ok(const dimension_type i,
+ const bool keep_sorted) {
+ PPL_ASSERT(i < num_rows());
+ const bool was_pending = (i >= index_first_pending);
+
+ if (sorted && keep_sorted && !was_pending) {
+ for (dimension_type j = i + 1; j < rows.size(); ++j)
+ swap(rows[j], rows[j-1]);
+ rows.pop_back();
+ }
+ else {
+ if (!was_pending)
+ sorted = false;
+ const bool last_row_is_pending = (num_rows() - 1 >= index_first_pending);
+ if (was_pending == last_row_is_pending)
+ // Either both rows are pending or both rows are not pending.
+ swap(rows[i], rows.back());
+ else {
+ // Pending rows are stored after the non-pending ones.
+ PPL_ASSERT(!was_pending);
+ PPL_ASSERT(last_row_is_pending);
+
+ // Swap the row with the last non-pending row.
+ swap(rows[i], rows[index_first_pending - 1]);
+
+ // Now the (non-pending) row that has to be deleted is between the
+ // non-pending and the pending rows.
+ swap(rows[i], rows.back());
+ }
+ rows.pop_back();
+ }
+ if (!was_pending)
+ // A non-pending row has been removed.
+ --index_first_pending;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row(const dimension_type i, bool keep_sorted) {
+ remove_row_no_ok(i, keep_sorted);
+ PPL_ASSERT(OK());
+}
+
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(dimension_type first,
+ dimension_type last,
+ bool keep_sorted) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last <= num_rows());
+ const dimension_type n = last - first;
+
+ if (n == 0)
+ return;
+
+ // All the rows that have to be removed must have the same (pending or
+ // non-pending) status.
+ PPL_ASSERT(first >= index_first_pending || last <= index_first_pending);
+
+ const bool were_pending = (first >= index_first_pending);
+
+ // Move the rows in [first,last) at the end of the system.
+ if (sorted && keep_sorted && !were_pending) {
+ // Preserve the row ordering.
+ for (dimension_type i = last; i < rows.size(); ++i)
+ swap(rows[i], rows[i - n]);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // We can ignore the row ordering, but we must not mix pending and
+ // non-pending rows.
+
+ const dimension_type offset = rows.size() - n - first;
+ // We want to swap the rows in [first, last) and
+ // [first + offset, last + offset) (note that these intervals may not be
+ // disjunct).
+
+ if (index_first_pending == num_rows()) {
+ // There are no pending rows.
+ PPL_ASSERT(!were_pending);
+
+ swap_row_intervals(first, last, offset);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+ }
+ else {
+ // There are some pending rows in [first + offset, last + offset).
+ if (were_pending) {
+ // Both intervals contain only pending rows, because the second
+ // interval is after the first.
+
+ swap_row_intervals(first, last, offset);
+
+ rows.resize(rows.size() - n);
+
+ // `n' non-pending rows have been removed.
+ index_first_pending -= n;
+ }
+ else {
+ PPL_ASSERT(rows.size() - n < index_first_pending);
+ PPL_ASSERT(rows.size() > index_first_pending);
+ PPL_ASSERT(!were_pending);
+ // In the [size() - n, size()) interval there are some non-pending
+ // rows and some pending ones. Be careful not to mix them.
+
+ PPL_ASSERT(index_first_pending >= last);
+ swap_row_intervals(first, last, index_first_pending - last);
+
+ // Mark the rows that must be deleted as pending.
+ index_first_pending -= n;
+ first = index_first_pending;
+ last = first + n;
+
+ // Move them at the end of the system.
+ swap_row_intervals(first, last, num_rows() - last);
+
+ // Actually remove the rows.
+ rows.resize(rows.size() - n);
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::swap_row_intervals(dimension_type first,
+ dimension_type last,
+ dimension_type offset) {
+ PPL_ASSERT(first <= last);
+ PPL_ASSERT(last + offset <= num_rows());
+#ifndef NDEBUG
+ if (first < last) {
+ bool first_interval_has_pending_rows = (last > index_first_pending);
+ bool second_interval_has_pending_rows = (last + offset > index_first_pending);
+ bool first_interval_has_not_pending_rows = (first < index_first_pending);
+ bool second_interval_has_not_pending_rows = (first + offset < index_first_pending);
+ PPL_ASSERT(first_interval_has_not_pending_rows
+ == !first_interval_has_pending_rows);
+ PPL_ASSERT(second_interval_has_not_pending_rows
+ == !second_interval_has_pending_rows);
+ PPL_ASSERT(first_interval_has_pending_rows
+ == second_interval_has_pending_rows);
+ }
+#endif
+ if (first + offset < last) {
+ // The intervals are not disjunct, make them so.
+ const dimension_type k = last - first - offset;
+ last -= k;
+ offset += k;
+ }
+
+ if (first == last)
+ // Nothing to do.
+ return;
+
+ for (dimension_type i = first; i < last; ++i)
+ swap(rows[i], rows[i + offset]);
+
+ if (first < index_first_pending)
+ // The swaps involved not pending rows, so they may not be sorted anymore.
+ set_sorted(false);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(const std::vector<dimension_type>& indexes) {
+#ifndef NDEBUG
+ {
+ // Check that `indexes' is sorted.
+ std::vector<dimension_type> sorted_indexes = indexes;
+ std::sort(sorted_indexes.begin(), sorted_indexes.end());
+ PPL_ASSERT(indexes == sorted_indexes);
+
+ // Check that the last index (if any) is lower than num_rows().
+ // This guarantees that all indexes are in [0, num_rows()).
+ if (!indexes.empty())
+ PPL_ASSERT(indexes.back() < num_rows());
+ }
+#endif
+
+ if (indexes.empty())
+ return;
+
+ const dimension_type rows_size = rows.size();
+ typedef std::vector<dimension_type>::const_iterator itr_t;
+
+ // `i' and last_unused_row' start with the value `indexes[0]' instead
+ // of `0', because the loop would just increment `last_unused_row' in the
+ // preceding iterations.
+ dimension_type last_unused_row = indexes[0];
+ dimension_type i = indexes[0];
+ itr_t itr = indexes.begin();
+ itr_t itr_end = indexes.end();
+ while (itr != itr_end) {
+ // i <= *itr < rows_size
+ PPL_ASSERT(i < rows_size);
+ if (*itr == i) {
+ // The current row has to be removed, don't increment last_unused_row.
+ ++itr;
+ }
+ else {
+ // The current row must not be removed, swap it after the last used row.
+ swap(rows[last_unused_row], rows[i]);
+ ++last_unused_row;
+ }
+ ++i;
+ }
+
+ // Move up the remaining rows, if any.
+ for ( ; i < rows_size; ++i) {
+ swap(rows[last_unused_row], rows[i]);
+ ++last_unused_row;
+ }
+
+ PPL_ASSERT(last_unused_row == num_rows() - indexes.size());
+
+ // The rows that have to be removed are now at the end of the system, just
+ // remove them.
+ rows.resize(last_unused_row);
+
+ // Adjust index_first_pending.
+ if (indexes[0] >= index_first_pending) {
+ // Removing pending rows only.
+ }
+ else {
+ if (indexes.back() < index_first_pending) {
+ // Removing non-pending rows only.
+ index_first_pending -= indexes.size();
+ }
+ else {
+ // Removing some pending and some non-pending rows, count the
+ // non-pending rows that must be removed.
+ // This exploits the fact that `indexes' is sorted by using binary
+ // search.
+ itr_t j = std::lower_bound(indexes.begin(), indexes.end(),
+ index_first_pending);
+ std::iterator_traits<itr_t>::difference_type
+ non_pending = j - indexes.begin();
+ index_first_pending -= static_cast<dimension_type>(non_pending);
+ }
+ }
+
+ // NOTE: This method does *not* call set_sorted(false), because it preserves
+ // the relative row ordering.
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_trailing_rows(const dimension_type n) {
+ PPL_ASSERT(rows.size() >= n);
+ rows.resize(rows.size() - n);
+ if (first_pending_row() > rows.size())
+ index_first_pending = rows.size();
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].permute_space_dimensions(cycle);
+ sorted = false;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::swap_space_dimensions(Variable v1, Variable v2) {
+ PPL_ASSERT(v1.space_dimension() <= space_dimension());
+ PPL_ASSERT(v2.space_dimension() <= space_dimension());
+ for (dimension_type k = num_rows(); k-- > 0; )
+ rows[k].swap_space_dimensions(v1, v2);
+ sorted = false;
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline bool
+operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+ return !(x == y);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Row_Less_Than::operator()(const Row& x,
+ const Row& y) const {
+ return compare(x, y) < 0;
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Unique_Compare
+::Unique_Compare(const Swapping_Vector<Row>& cont,
+ dimension_type base)
+ : container(cont), base_index(base) {
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Unique_Compare
+::operator()(dimension_type i, dimension_type j) const {
+ return container[base_index + i].is_equal_to(container[base_index + j]);
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline void
+swap(Linear_System<Row>& x, Linear_System<Row>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 1. */
+/* Linear_System class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 1. */
+/* Bit_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 30. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Matrix */
+void swap(Bit_Matrix& x, Bit_Matrix& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+ //! Default constructor.
+ Bit_Matrix();
+
+ //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+ Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+ //! Copy constructor.
+ Bit_Matrix(const Bit_Matrix& y);
+
+ //! Destructor.
+ ~Bit_Matrix();
+
+ //! Assignment operator.
+ Bit_Matrix& operator=(const Bit_Matrix& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Bit_Matrix& y);
+
+ //! Subscript operator.
+ Bit_Row& operator[](dimension_type k);
+
+ //! Constant subscript operator.
+ const Bit_Row& operator[](dimension_type k) const;
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ //! Transposes the matrix.
+ void transpose();
+
+ //! Makes \p *this a transposed copy of \p y.
+ void transpose_assign(const Bit_Matrix& y);
+
+ //! Returns the maximum number of rows of a Bit_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the number of columns of \p *this.
+ dimension_type num_columns() const;
+
+ //! Returns the number of rows of \p *this.
+ dimension_type num_rows() const;
+
+ //! Sorts the rows and removes duplicates.
+ void sort_rows();
+
+ //! Looks for \p row in \p *this, which is assumed to be sorted.
+ /*!
+ \return
+ <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+ \param row
+ The row that will be searched for in the matrix.
+
+ Given a sorted bit matrix (this ensures better efficiency),
+ tells whether it contains the given row.
+ */
+ bool sorted_contains(const Bit_Row& row) const;
+
+ //! Adds \p row to \p *this.
+ /*!
+ \param row
+ The row whose implementation will be recycled.
+
+ The only thing that can be done with \p row upon return is destruction.
+ */
+ void add_recycled_row(Bit_Row& row);
+
+ //! Removes the last \p n rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Removes the last \p n columns.
+ /*!
+ The last \p n columns of the matrix are all made of zeros.
+ If such an assumption is not met, the behavior is undefined.
+ */
+ void remove_trailing_columns(dimension_type n);
+
+ //! Resizes the matrix copying the old contents.
+ void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+ //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+ bool check_sorted() const;
+#endif
+
+private:
+ //! Contains the rows of the matrix.
+ std::vector<Bit_Row> rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ /*! \ingroup PPL_CXX_interface */
+ struct Bit_Row_Less_Than {
+ bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+ };
+
+ template <typename Row>
+ friend class Parma_Polyhedra_Library::Linear_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_inlines.hh line 1. */
+/* Bit_Matrix class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Bit_Matrix_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Matrix::Bit_Matrix()
+ : rows(),
+ row_size(0) {
+}
+
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+ return std::vector<Bit_Row>().max_size();
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+ const dimension_type n_columns)
+ : rows(n_rows),
+ row_size(n_columns) {
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size) {
+}
+
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
+
+inline void
+Bit_Matrix::remove_trailing_rows(const dimension_type n) {
+ // The number of rows to be erased cannot be greater
+ // than the actual number of the rows of the matrix.
+ PPL_ASSERT(n <= rows.size());
+ if (n != 0)
+ rows.resize(rows.size() - n);
+ PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::remove_trailing_columns(const dimension_type n) {
+ // The number of columns to be erased cannot be greater
+ // than the actual number of the columns of the matrix.
+ PPL_ASSERT(n <= row_size);
+ row_size -= n;
+ PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::m_swap(Bit_Matrix& y) {
+ using std::swap;
+ swap(row_size, y.row_size);
+ swap(rows, y.rows);
+}
+
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Bit_Matrix::num_columns() const {
+ return row_size;
+}
+
+inline dimension_type
+Bit_Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Bit_Row> tmp;
+ using std::swap;
+ swap(tmp, rows);
+ row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+ return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+ PPL_ASSERT(check_sorted());
+ return std::binary_search(rows.begin(), rows.end(), row,
+ Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+ return !(x == y);
+}
+
+/*! \relates Bit_Matrix */
+inline void
+swap(Bit_Matrix& x, Bit_Matrix& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 186. */
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_defs.hh line 1. */
+/* Scalar_Products class definition.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_defs.hh line 34. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+ When computing the scalar product of (Linear_Expression or Constraint or
+ Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+ that the space dimension of the first object <CODE>x</CODE> is less
+ than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+ //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Linear_Expression& x, const Linear_Expression& y);
+
+ //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+ static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+
+ //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+ static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+
+ //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Constraint& c, const Grid_Generator& gg);
+
+ //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Grid_Generator& gg, const Congruence& cg);
+
+ //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Congruence& cg, const Grid_Generator& gg);
+
+ //! Returns the sign of the scalar product between \p x and \p y.
+ static int sign(const Linear_Expression& x, const Linear_Expression& y);
+
+ //! Returns the sign of the scalar product between \p c and \p g.
+ static int sign(const Constraint& c, const Generator& g);
+
+ //! Returns the sign of the scalar product between \p g and \p c.
+ static int sign(const Generator& g, const Constraint& c);
+
+ //! Returns the sign of the scalar product between \p c and \p g.
+ static int sign(const Constraint& c, const Grid_Generator& g);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p x and \p y,
+ where the \f$\epsilon\f$ coefficient of \p x is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p c and \p g,
+ where the \f$\epsilon\f$ coefficient of \p c is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Computes the \e reduced scalar product of \p g and \p c,
+ where the \f$\epsilon\f$ coefficient of \p g is ignored,
+ and assigns the result to \p z.
+ */
+ static void reduced_assign(Coefficient& z,
+ const Generator& g, const Constraint& c);
+
+ //! \brief
+ //! Computes the \e reduced scalar product of \p g and \p cg,
+ //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+ //! and assigns the result to \p z.
+ static void reduced_assign(Coefficient& z,
+ const Grid_Generator& gg, const Congruence& cg);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p x and \p y,
+ where the \f$\epsilon\f$ coefficient of \p x is ignored.
+ */
+ static int reduced_sign(const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p c and \p g,
+ where the \f$\epsilon\f$ coefficient of \p c is ignored.
+ */
+ static int reduced_sign(const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Returns the sign of the \e reduced scalar product of \p g and \p c,
+ where the \f$\epsilon\f$ coefficient of \p g is ignored.
+ */
+ static int reduced_sign(const Generator& g, const Constraint& c);
+
+ /*! \brief
+ Computes the \e homogeneous scalar product of \p x and \p y,
+ where the inhomogeneous terms are ignored,
+ and assigns the result to \p z.
+ */
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+ /*! \brief
+ Computes the \e homogeneous scalar product of \p e and \p g,
+ where the inhomogeneous terms are ignored,
+ and assigns the result to \p z.
+ */
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p gg and \p c,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Constraint& c);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p g and \p cg,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Grid_Generator& gg,
+ const Congruence& cg);
+
+ //! \brief
+ //! Computes the \e homogeneous scalar product of \p e and \p g,
+ //! where the inhomogeneous terms are ignored,
+ //! and assigns the result to \p z.
+ static void homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g);
+
+ /*! \brief
+ Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+ where the inhomogeneous terms are ignored.
+ */
+ static int homogeneous_sign(const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ /*! \brief
+ Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+ where the inhomogeneous terms are ignored.
+ */
+ static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+
+ //! \brief
+ //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+ //! where the inhomogeneous terms are ignored,
+ static int homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g);
+
+ //! \brief
+ //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+ //! where the inhomogeneous terms are ignored,
+ static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+ //! Constructs the function object according to the topology of \p c.
+ Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+
+ //! Constructs the function object according to the topology of \p g.
+ Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+ //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+ int operator()(const Constraint&, const Generator&) const;
+
+ //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+ int operator()(const Generator&, const Constraint&) const;
+
+private:
+ //! The type of the scalar product sign function pointer.
+ typedef int (* const SPS_type)(const Linear_Expression&,
+ const Linear_Expression&);
+
+ //! The scalar product sign function pointer.
+ SPS_type sps_fp;
+};
+
+// NOTE: Scalar_Products_inlines.hh is NOT included here, to avoid cyclic
+// include dependencies.
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_inlines.hh line 1. */
+/* Scalar_Products class implementation (inline functions).
+*/
+
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_inlines.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Expression& x, const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Expression& x,
+ const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ reduced_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& x,
+ const Linear_Expression& y) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ homogeneous_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+ return sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+ return sign(g.expr, c.expr);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ assign(z, c, g);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+ // The reduced scalar product is only defined if the topology of `c' is
+ // NNC.
+ PPL_ASSERT(!c.is_necessarily_closed());
+ return reduced_sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+ // The reduced scalar product is only defined if the topology of `g' is
+ // NNC.
+ PPL_ASSERT(!c.is_necessarily_closed());
+ return reduced_sign(g.expr, c.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g) {
+ homogeneous_assign(z, e, g.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g) {
+ homogeneous_assign(z, e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Generator& g) {
+ return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g) {
+ return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+ const Constraint& c) {
+ PPL_DIRTY_TEMP_COEFFICIENT(z);
+ homogeneous_assign(z, g, c);
+ return sgn(z);
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+ : sps_fp(c.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+ : sps_fp(g.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+ const Generator& g) const {
+ PPL_ASSERT(c.space_dimension() <= g.space_dimension());
+ PPL_ASSERT(sps_fp == (c.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+ return sps_fp(c.expr, g.expr);
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+ const Constraint& c) const {
+ PPL_ASSERT(g.space_dimension() <= c.space_dimension());
+ PPL_ASSERT(sps_fp == (g.is_necessarily_closed()
+ ? static_cast<SPS_type>(&Scalar_Products::sign)
+ : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+ return sps_fp(g.expr, c.expr);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 31. */
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+/* Automatically generated from PPL source file ../src/swapping_sort_templates.hh line 1. */
+/* Sorting objects for which copies cost more than swaps.
+*/
+
+
+#include <vector>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename RA_Container, typename Compare>
+struct Indirect_Sort_Compare {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Sort_Compare(const RA_Container& cont,
+ size_type base = 0,
+ Compare comp = Compare())
+ : container(cont), base_index(base), compare(comp) {
+ }
+
+ bool operator()(size_type i, size_type j) const {
+ return compare(container[base_index + i], container[base_index + j]);
+ }
+
+ const RA_Container& container;
+ const size_type base_index;
+ const Compare compare;
+}; // struct Indirect_Sort_Compare
+
+template <typename RA_Container>
+struct Indirect_Unique_Compare {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Unique_Compare(const RA_Container& cont, size_type base = 0)
+ : container(cont), base_index(base) {
+ }
+
+ bool operator()(size_type i, size_type j) const {
+ return container[base_index + i] == container[base_index + j];
+ }
+
+ const RA_Container& container;
+ const size_type base_index;
+}; // struct Indirect_Unique_Compare
+
+template <typename RA_Container>
+struct Indirect_Swapper {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Swapper(RA_Container& cont, size_type base = 0)
+ : container(cont), base_index(base) {
+ }
+
+ void operator()(size_type i, size_type j) const {
+ using std::swap;
+ swap(container[base_index + i], container[base_index + j]);
+ }
+
+ RA_Container& container;
+ const size_type base_index;
+}; // struct Indirect_Swapper
+
+template <typename RA_Container1, typename RA_Container2>
+struct Indirect_Swapper2 {
+ typedef typename RA_Container1::size_type size_type;
+
+ Indirect_Swapper2(RA_Container1& cont1, RA_Container2& cont2)
+ : container1(cont1), container2(cont2) {
+ }
+
+ void operator()(size_type i, size_type j) const {
+ using std::swap;
+ swap(container1[i], container1[j]);
+ swap(container2[i], container2[j]);
+ }
+
+ RA_Container1& container1;
+ RA_Container2& container2;
+}; // struct Indirect_Swapper2
+
+template <typename Sort_Comparer, typename Unique_Comparer, typename Swapper>
+typename Sort_Comparer::size_type
+indirect_sort_and_unique(typename Sort_Comparer::size_type num_elems,
+ Sort_Comparer sort_cmp,
+ Unique_Comparer unique_cmp,
+ Swapper indirect_swap) {
+ typedef typename Sort_Comparer::size_type index_type;
+ // `iv' is a vector of indices for the portion of rows to be sorted.
+ PPL_ASSERT(num_elems >= 2);
+ std::vector<index_type> iv;
+ iv.reserve(num_elems);
+ for (index_type i = 0, i_end = num_elems; i != i_end; ++i)
+ iv.push_back(i);
+
+ typedef typename std::vector<index_type>::iterator Iter;
+ const Iter iv_begin = iv.begin();
+ Iter iv_end = iv.end();
+
+ // Sort `iv' by comparing the rows indexed by its elements.
+ std::sort(iv_begin, iv_end, sort_cmp);
+
+ // Swap the indexed rows according to `iv':
+ // for each index `i', the element that should be placed in
+ // position dst = i is the one placed in position src = iv[i].
+ for (index_type i = num_elems; i-- > 0; ) {
+ if (i != iv[i]) {
+ index_type dst = i;
+ index_type src = iv[i];
+ do {
+ indirect_swap(src, dst);
+ iv[dst] = dst;
+ dst = src;
+ src = iv[dst];
+ } while (i != src);
+ iv[dst] = dst;
+ }
+ }
+
+ // Restore `iv' indices to 0 .. num_elems-1 for the call to unique.
+ for (index_type i = num_elems; i-- > 0; )
+ iv[i] = i;
+
+ // Unique `iv' by comparing the rows indexed by its elements.
+ iv_end = std::unique(iv_begin, iv_end, unique_cmp);
+
+ const index_type num_sorted = static_cast<index_type>(iv_end - iv_begin);
+ const index_type num_duplicates = num_elems - num_sorted;
+ if (num_duplicates == 0)
+ return 0;
+
+ // There were duplicates: swap the rows according to `iv'.
+ index_type dst = 0;
+ while (dst < num_sorted && dst == iv[dst])
+ ++dst;
+ if (dst == num_sorted)
+ return num_duplicates;
+ do {
+ const index_type src = iv[dst];
+ indirect_swap(src, dst);
+ ++dst;
+ }
+ while (dst < num_sorted);
+ return num_duplicates;
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+ return swapping_unique(first, last, std::iter_swap<Iter, Iter>);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 37. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::num_lines_or_equalities() const {
+ PPL_ASSERT(num_pending_rows() == 0);
+ const Linear_System& x = *this;
+ dimension_type n = 0;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (x[i].is_line_or_equality())
+ ++n;
+ return n;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::merge_rows_assign(const Linear_System& y) {
+ PPL_ASSERT(space_dimension() >= y.space_dimension());
+ // Both systems have to be sorted and have no pending rows.
+ PPL_ASSERT(check_sorted() && y.check_sorted());
+ PPL_ASSERT(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+ Linear_System& x = *this;
+
+ // A temporary vector...
+ Swapping_Vector<Row> tmp;
+ // ... with enough capacity not to require any reallocations.
+ tmp.reserve(compute_capacity(x.rows.size() + y.rows.size(),
+ tmp.max_num_rows()));
+
+ dimension_type xi = 0;
+ const dimension_type x_num_rows = x.num_rows();
+ dimension_type yi = 0;
+ const dimension_type y_num_rows = y.num_rows();
+
+ while (xi < x_num_rows && yi < y_num_rows) {
+ const int comp = compare(x[xi], y[yi]);
+ if (comp <= 0) {
+ // Elements that can be taken from `x' are actually _stolen_ from `x'
+ tmp.resize(tmp.size() + 1);
+ swap(tmp.back(), x.rows[xi++]);
+ tmp.back().set_representation(representation());
+ if (comp == 0)
+ // A duplicate element.
+ ++yi;
+ }
+ else {
+ // (comp > 0)
+ tmp.resize(tmp.size() + 1);
+ Row copy(y[yi++], space_dimension(), representation());
+ swap(tmp.back(), copy);
+ }
+ }
+ // Insert what is left.
+ if (xi < x_num_rows)
+ while (xi < x_num_rows) {
+ tmp.resize(tmp.size() + 1);
+ swap(tmp.back(), x.rows[xi++]);
+ tmp.back().set_representation(representation());
+ }
+ else
+ while (yi < y_num_rows) {
+ tmp.resize(tmp.size() + 1);
+ Row copy(y[yi++], space_dimension(), representation());
+ swap(tmp.back(), copy);
+ }
+
+ // We get the result matrix and let the old one be destroyed.
+ swap(tmp, rows);
+ // There are no pending rows.
+ unset_pending_rows();
+ PPL_ASSERT(check_sorted());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::ascii_dump(std::ostream& s) const {
+ // Prints the topology, the number of rows, the number of columns
+ // and the sorted flag. The specialized methods provided by
+ // Constraint_System and Generator_System take care of properly
+ // printing the contents of the system.
+ s << "topology " << (is_necessarily_closed()
+ ? "NECESSARILY_CLOSED"
+ : "NOT_NECESSARILY_CLOSED")
+ << "\n"
+ << num_rows() << " x " << space_dimension() << " ";
+ Parma_Polyhedra_Library::ascii_dump(s, representation());
+ s << " " << (sorted ? "(sorted)" : "(not_sorted)")
+ << "\n"
+ << "index_first_pending " << first_pending_row()
+ << "\n";
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Linear_System<Row>)
+
+template <typename Row>
+bool
+Linear_System<Row>::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+
+ clear();
+
+ Topology t;
+ if (str == "NECESSARILY_CLOSED")
+ t = NECESSARILY_CLOSED;
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ t = NOT_NECESSARILY_CLOSED;
+ }
+
+ set_topology(t);
+
+ dimension_type nrows;
+ dimension_type space_dims;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> space_dims))
+ return false;
+
+ space_dimension_ = space_dims;
+
+ if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+ return false;
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ const bool sortedness = (str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+
+ Row row;
+ for (dimension_type i = 0; i < nrows; ++i) {
+ if (!row.ascii_load(s))
+ return false;
+ insert(row, Recycle_Input());
+ }
+ index_first_pending = index;
+ sorted = sortedness;
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Row& r) {
+ Row tmp(r, representation());
+ insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Row& r, Recycle_Input) {
+ insert_no_ok(r, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_no_ok(Row& r, Recycle_Input) {
+ PPL_ASSERT(topology() == r.topology());
+ // This method is only used when the system has no pending rows.
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ const bool was_sorted = is_sorted();
+
+ insert_pending_no_ok(r, Recycle_Input());
+
+ if (was_sorted) {
+ const dimension_type nrows = num_rows();
+ // The added row may have caused the system to be not sorted anymore.
+ if (nrows > 1) {
+ // If the system is not empty and the inserted row is the
+ // greatest one, the system is set to be sorted.
+ // If it is not the greatest one then the system is no longer sorted.
+ sorted = (compare(rows[nrows-2], rows[nrows-1]) <= 0);
+ }
+ else
+ // A system having only one row is sorted.
+ sorted = true;
+ }
+
+ unset_pending_rows();
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending_no_ok(Row& r, Recycle_Input) {
+ // TODO: A Grid_Generator_System may contain non-normalized lines that
+ // represent parameters, so this check is disabled. Consider re-enabling it
+ // when it's possibile.
+#if 0
+ // The added row must be strongly normalized and have the same
+ // number of elements as the existing rows of the system.
+ PPL_ASSERT(r.check_strong_normalized());
+#endif
+
+ PPL_ASSERT(r.topology() == topology());
+
+ r.set_representation(representation());
+
+ if (space_dimension() < r.space_dimension())
+ set_space_dimension_no_ok(r.space_dimension());
+ else
+ r.set_space_dimension_no_ok(space_dimension());
+
+ rows.resize(rows.size() + 1);
+ swap(rows.back(), r);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Row& r) {
+ Row tmp(r, representation());
+ insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Row& r, Recycle_Input) {
+ insert_pending_no_ok(r, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Linear_System& y) {
+ Linear_System tmp(y, representation(), With_Pending());
+ insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Linear_System& y, Recycle_Input) {
+ Linear_System& x = *this;
+ PPL_ASSERT(x.space_dimension() == y.space_dimension());
+
+ // Steal the rows of `y'.
+ // This loop must use an increasing index (instead of a decreasing one) to
+ // preserve the row ordering.
+ for (dimension_type i = 0; i < y.num_rows(); ++i)
+ x.insert_pending(y.rows[i], Recycle_Input());
+
+ y.clear();
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Linear_System& y) {
+ Linear_System tmp(y, representation(), With_Pending());
+ insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Linear_System& y, Recycle_Input) {
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ // Adding no rows is a no-op.
+ if (y.has_no_rows())
+ return;
+
+ // Check if sortedness is preserved.
+ if (is_sorted()) {
+ if (!y.is_sorted() || y.num_pending_rows() > 0)
+ sorted = false;
+ else {
+ // `y' is sorted and has no pending rows.
+ const dimension_type n_rows = num_rows();
+ if (n_rows > 0)
+ sorted = (compare(rows[n_rows-1], y[0]) <= 0);
+ }
+ }
+
+ // Add the rows of `y' as if they were pending.
+ insert_pending(y, Recycle_Input());
+
+ // TODO: May y have pending rows? Should they remain pending?
+
+ // There are no pending_rows.
+ unset_pending_rows();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::remove_space_dimensions(const Variables_Set& vars) {
+ // Dimension-compatibility assertion.
+ PPL_ASSERT(space_dimension() >= vars.space_dimension());
+
+ // The removal of no dimensions from any system is a no-op. This
+ // case also captures the only legal removal of dimensions from a
+ // 0-dim system.
+ if (vars.empty())
+ return;
+
+ // NOTE: num_rows() is *not* constant, because it may be decreased by
+ // remove_row_no_ok().
+ for (dimension_type i = 0; i < num_rows(); ) {
+ const bool valid = rows[i].remove_space_dimensions(vars);
+ if (!valid) {
+ // Remove the current row.
+ // We can't call remove_row(i) here, because the system is not OK as
+ // some rows already have the new space dimension and others still have
+ // the old one.
+ remove_row_no_ok(i, false);
+ }
+ else
+ ++i;
+ }
+
+ space_dimension_ -= vars.size();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::shift_space_dimensions(Variable v, dimension_type n) {
+ // NOTE: v.id() may be equal to the space dimension of the system
+ // (when no space dimension need to be shifted).
+ PPL_ASSERT(v.id() <= space_dimension());
+ for (dimension_type i = rows.size(); i-- > 0; )
+ rows[i].shift_space_dimensions(v, n);
+ space_dimension_ += n;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows() {
+ // We sort the non-pending rows only.
+ sort_rows(0, first_pending_row());
+ sorted = true;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows(const dimension_type first_row,
+ const dimension_type last_row) {
+ PPL_ASSERT(first_row <= last_row && last_row <= num_rows());
+ // We cannot mix pending and non-pending rows.
+ PPL_ASSERT(first_row >= first_pending_row()
+ || last_row <= first_pending_row());
+
+ const bool sorting_pending = (first_row >= first_pending_row());
+ const dimension_type old_num_pending = num_pending_rows();
+
+ const dimension_type num_elems = last_row - first_row;
+ if (num_elems < 2)
+ return;
+
+ // Build the function objects implementing indirect sort comparison,
+ // indirect unique comparison and indirect swap operation.
+ using namespace Implementation;
+ typedef Swapping_Vector<Row> Cont;
+ typedef Indirect_Sort_Compare<Cont, Row_Less_Than> Sort_Compare;
+ typedef Indirect_Swapper<Cont> Swapper;
+ const dimension_type num_duplicates
+ = indirect_sort_and_unique(num_elems,
+ Sort_Compare(rows, first_row),
+ Unique_Compare(rows, first_row),
+ Swapper(rows, first_row));
+
+ if (num_duplicates > 0) {
+ typedef typename Cont::iterator Iter;
+ typedef typename std::iterator_traits<Iter>::difference_type diff_t;
+ Iter last = rows.begin() + static_cast<diff_t>(last_row);
+ Iter first = last - + static_cast<diff_t>(num_duplicates);
+ rows.erase(first, last);
+ }
+
+ if (sorting_pending) {
+ PPL_ASSERT(old_num_pending >= num_duplicates);
+ index_first_pending = num_rows() - (old_num_pending - num_duplicates);
+ }
+ else {
+ index_first_pending = num_rows() - old_num_pending;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::strong_normalize() {
+ const dimension_type nrows = rows.size();
+ // We strongly normalize also the pending rows.
+ for (dimension_type i = nrows; i-- > 0; )
+ rows[i].strong_normalize();
+ sorted = (nrows <= 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sign_normalize() {
+ const dimension_type nrows = rows.size();
+ // We sign-normalize also the pending rows.
+ for (dimension_type i = nrows; i-- > 0; )
+ rows[i].sign_normalize();
+ sorted = (nrows <= 1);
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+template <typename Row>
+bool
+operator==(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+ if (x.space_dimension() != y.space_dimension())
+ return false;
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type y_num_rows = y.num_rows();
+ if (x_num_rows != y_num_rows)
+ return false;
+ if (x.first_pending_row() != y.first_pending_row())
+ return false;
+ // TODO: Check if the following comment is up to date.
+ // Notice that calling operator==(const Swapping_Vector<Row>&,
+ // const Swapping_Vector<Row>&)
+ // would be wrong here, as equality of the type fields would
+ // not be checked.
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ // We can only sort the non-pending part of the system.
+ PPL_ASSERT(first_pending_row() == sat.num_rows());
+ if (first_pending_row() <= 1) {
+ set_sorted(true);
+ return;
+ }
+
+ const dimension_type num_elems = sat.num_rows();
+ // Build the function objects implementing indirect sort comparison,
+ // indirect unique comparison and indirect swap operation.
+ typedef Swapping_Vector<Row> Cont;
+ const Implementation::Indirect_Sort_Compare<Cont, Row_Less_Than>
+ sort_cmp(rows);
+ const Unique_Compare unique_cmp(rows);
+ const Implementation::Indirect_Swapper2<Cont, Bit_Matrix> swapper(rows, sat);
+
+ const dimension_type num_duplicates
+ = Implementation::indirect_sort_and_unique(num_elems, sort_cmp,
+ unique_cmp, swapper);
+
+ const dimension_type new_first_pending_row
+ = first_pending_row() - num_duplicates;
+
+ if (num_pending_rows() > 0) {
+ // In this case, we must put the duplicates after the pending rows.
+ const dimension_type n_rows = num_rows() - 1;
+ for (dimension_type i = 0; i < num_duplicates; ++i)
+ swap(rows[new_first_pending_row + i], rows[n_rows - i]);
+ }
+
+ // Erasing the duplicated rows...
+ rows.resize(rows.size() - num_duplicates);
+ index_first_pending = new_first_pending_row;
+ // ... and the corresponding rows of the saturation matrix.
+ sat.remove_trailing_rows(num_duplicates);
+
+ // Now the system is sorted.
+ sorted = true;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::gauss(const dimension_type n_lines_or_equalities) {
+ // This method is only applied to a linear system having no pending rows and
+ // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+ // before the rays or points or inequalities.
+ PPL_ASSERT(num_pending_rows() == 0);
+ PPL_ASSERT(n_lines_or_equalities == num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+ dimension_type rank = 0;
+ // Will keep track of the variations on the system of equalities.
+ bool changed = false;
+ // TODO: Don't use the number of columns.
+ const dimension_type num_cols
+ = is_necessarily_closed() ? space_dimension() + 1 : space_dimension() + 2;
+ // TODO: Consider exploiting the row (possible) sparseness of rows in the
+ // following loop, if needed. It would probably make it more cache-efficient
+ // for dense rows, too.
+ for (dimension_type j = num_cols; j-- > 0; )
+ for (dimension_type i = rank; i < n_lines_or_equalities; ++i) {
+ // Search for the first row having a non-zero coefficient
+ // (the pivot) in the j-th column.
+ if ((*this)[i].expr.get(j) == 0)
+ continue;
+ // Pivot found: if needed, swap rows so that this one becomes
+ // the rank-th row in the linear system.
+ if (i > rank) {
+ swap(rows[i], rows[rank]);
+ // After swapping the system is no longer sorted.
+ changed = true;
+ }
+ // Combine the row containing the pivot with all the lines or
+ // equalities following it, so that all the elements on the j-th
+ // column in these rows become 0.
+ for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k) {
+ if (rows[k].expr.get(Variable(j - 1)) != 0) {
+ rows[k].linear_combine(rows[rank], j);
+ changed = true;
+ }
+ }
+ // Already dealt with the rank-th row.
+ ++rank;
+ // Consider another column index `j'.
+ break;
+ }
+ if (changed)
+ sorted = false;
+
+ PPL_ASSERT(OK());
+ return rank;
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::back_substitute(const dimension_type n_lines_or_equalities) {
+ // This method is only applied to a system having no pending rows and
+ // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+ // before the first ray or point or inequality.
+ PPL_ASSERT(num_pending_rows() == 0);
+ PPL_ASSERT(n_lines_or_equalities <= num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+ const dimension_type nrows = num_rows();
+ // Trying to keep sortedness.
+ bool still_sorted = is_sorted();
+ // This deque of Booleans will be used to flag those rows that,
+ // before exiting, need to be re-checked for sortedness.
+ std::deque<bool> check_for_sortedness;
+ if (still_sorted)
+ check_for_sortedness.insert(check_for_sortedness.end(), nrows, false);
+
+ for (dimension_type k = n_lines_or_equalities; k-- > 0; ) {
+ // For each line or equality, starting from the last one,
+ // looks for the last non-zero element.
+ // `j' will be the index of such a element.
+ Row& row_k = rows[k];
+ const dimension_type j = row_k.expr.last_nonzero();
+ // TODO: Check this.
+ PPL_ASSERT(j != 0);
+
+ // Go through the equalities above `row_k'.
+ for (dimension_type i = k; i-- > 0; ) {
+ Row& row_i = rows[i];
+ if (row_i.expr.get(Variable(j - 1)) != 0) {
+ // Combine linearly `row_i' with `row_k'
+ // so that `row_i[j]' becomes zero.
+ row_i.linear_combine(row_k, j);
+ if (still_sorted) {
+ // Trying to keep sortedness: remember which rows
+ // have to be re-checked for sortedness at the end.
+ if (i > 0)
+ check_for_sortedness[i-1] = true;
+ check_for_sortedness[i] = true;
+ }
+ }
+ }
+
+ // Due to strong normalization during previous iterations,
+ // the pivot coefficient `row_k[j]' may now be negative.
+ // Since an inequality (or ray or point) cannot be multiplied
+ // by a negative factor, the coefficient of the pivot must be
+ // forced to be positive.
+ const bool have_to_negate = (row_k.expr.get(Variable(j - 1)) < 0);
+ if (have_to_negate)
+ neg_assign(row_k.expr);
+
+ // NOTE: Here row_k will *not* be ok if we have negated it.
+
+ // Note: we do not mark index `k' in `check_for_sortedness',
+ // because we will later negate back the row.
+
+ // Go through all the other rows of the system.
+ for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) {
+ Row& row_i = rows[i];
+ if (row_i.expr.get(Variable(j - 1)) != 0) {
+ // Combine linearly the `row_i' with `row_k'
+ // so that `row_i[j]' becomes zero.
+ row_i.linear_combine(row_k, j);
+ if (still_sorted) {
+ // Trying to keep sortedness: remember which rows
+ // have to be re-checked for sortedness at the end.
+ if (i > n_lines_or_equalities)
+ check_for_sortedness[i-1] = true;
+ check_for_sortedness[i] = true;
+ }
+ }
+ }
+ if (have_to_negate)
+ // Negate `row_k' to restore strong-normalization.
+ neg_assign(row_k.expr);
+
+ PPL_ASSERT(row_k.OK());
+ }
+
+ // Trying to keep sortedness.
+ for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i)
+ if (check_for_sortedness[i])
+ // Have to check sortedness of `(*this)[i]' with respect to `(*this)[i+1]'.
+ still_sorted = (compare((*this)[i], (*this)[i+1]) <= 0);
+
+ // Set the sortedness flag.
+ sorted = still_sorted;
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::simplify() {
+ // This method is only applied to a system having no pending rows.
+ PPL_ASSERT(num_pending_rows() == 0);
+
+ // Partially sort the linear system so that all lines/equalities come first.
+ const dimension_type old_nrows = num_rows();
+ dimension_type nrows = old_nrows;
+ dimension_type n_lines_or_equalities = 0;
+ for (dimension_type i = 0; i < nrows; ++i)
+ if ((*this)[i].is_line_or_equality()) {
+ if (n_lines_or_equalities < i) {
+ swap(rows[i], rows[n_lines_or_equalities]);
+ // The system was not sorted.
+ PPL_ASSERT(!sorted);
+ }
+ ++n_lines_or_equalities;
+ }
+ // Apply Gaussian elimination to the subsystem of lines/equalities.
+ const dimension_type rank = gauss(n_lines_or_equalities);
+ // Eliminate any redundant line/equality that has been detected.
+ if (rank < n_lines_or_equalities) {
+ const dimension_type
+ n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities;
+ const dimension_type
+ num_swaps = std::min(n_lines_or_equalities - rank,
+ n_rays_or_points_or_inequalities);
+ for (dimension_type i = num_swaps; i-- > 0; )
+ swap(rows[--nrows], rows[rank + i]);
+ remove_trailing_rows(old_nrows - nrows);
+ if (n_rays_or_points_or_inequalities > num_swaps)
+ set_sorted(false);
+ unset_pending_rows();
+ n_lines_or_equalities = rank;
+ }
+ // Apply back-substitution to the system of rays/points/inequalities.
+ back_substitute(n_lines_or_equalities);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::add_universe_rows_and_space_dimensions(const dimension_type n) {
+ PPL_ASSERT(n > 0);
+ const bool was_sorted = is_sorted();
+ const dimension_type old_n_rows = num_rows();
+ const dimension_type old_space_dim
+ = is_necessarily_closed() ? space_dimension() : space_dimension() + 1;
+ set_space_dimension(space_dimension() + n);
+ rows.resize(rows.size() + n);
+ // The old system is moved to the bottom.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ swap(rows[i], rows[i + n]);
+ for (dimension_type i = n, c = old_space_dim; i-- > 0; ) {
+ // The top right-hand sub-system (i.e., the system made of new
+ // rows and columns) is set to the specular image of the identity
+ // matrix.
+ if (Variable(c).space_dimension() <= space_dimension()) {
+ // Variable(c) is a user variable.
+ Linear_Expression le(representation());
+ le.set_space_dimension(space_dimension());
+ le += Variable(c);
+ Row r(le, Row::LINE_OR_EQUALITY, row_topology);
+ swap(r, rows[i]);
+ }
+ else {
+ // Variable(c) is the epsilon dimension.
+ PPL_ASSERT(row_topology == NOT_NECESSARILY_CLOSED);
+ Linear_Expression le(Variable(c), representation());
+ Row r(le, Row::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+ r.mark_as_not_necessarily_closed();
+ swap(r, rows[i]);
+ // Note: `r' is strongly normalized.
+ }
+ ++c;
+ }
+ // If the old system was empty, the last row added is either
+ // a positivity constraint or a point.
+ if (was_sorted)
+ sorted = (compare(rows[n-1], rows[n]) <= 0);
+
+ // If the system is not necessarily closed, move the epsilon coefficients to
+ // the last column.
+ if (!is_necessarily_closed()) {
+ // Try to preserve sortedness of `gen_sys'.
+ PPL_ASSERT(old_space_dim != 0);
+ if (!is_sorted()) {
+ for (dimension_type i = n; i-- > 0; ) {
+ rows[i].expr.swap_space_dimensions(Variable(old_space_dim - 1),
+ Variable(old_space_dim - 1 + n));
+ PPL_ASSERT(rows[i].OK());
+ }
+ }
+ else {
+ dimension_type old_eps_index = old_space_dim - 1;
+ // The upper-right corner of `rows' contains the J matrix:
+ // swap coefficients to preserve sortedness.
+ for (dimension_type i = n; i-- > 0; ++old_eps_index) {
+ rows[i].expr.swap_space_dimensions(Variable(old_eps_index),
+ Variable(old_eps_index + 1));
+ PPL_ASSERT(rows[i].OK());
+ }
+
+ sorted = true;
+ }
+ }
+ // NOTE: this already checks for OK().
+ set_index_first_pending_row(index_first_pending + n);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_pending_and_remove_duplicates() {
+ PPL_ASSERT(num_pending_rows() > 0);
+ PPL_ASSERT(is_sorted());
+
+ // The non-pending part of the system is already sorted.
+ // Now sorting the pending part..
+ const dimension_type first_pending = first_pending_row();
+ sort_rows(first_pending, num_rows());
+ // Recompute the number of rows, because we may have removed
+ // some rows occurring more than once in the pending part.
+ const dimension_type old_num_rows = num_rows();
+ dimension_type num_rows = old_num_rows;
+
+ dimension_type k1 = 0;
+ dimension_type k2 = first_pending;
+ dimension_type num_duplicates = 0;
+ // In order to erase them, put at the end of the system
+ // those pending rows that also occur in the non-pending part.
+ while (k1 < first_pending && k2 < num_rows) {
+ const int cmp = compare(rows[k1], rows[k2]);
+ if (cmp == 0) {
+ // We found the same row.
+ ++num_duplicates;
+ --num_rows;
+ // By initial sortedness, we can increment index `k1'.
+ ++k1;
+ // Do not increment `k2'; instead, swap there the next pending row.
+ if (k2 < num_rows)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ }
+ else if (cmp < 0)
+ // By initial sortedness, we can increment `k1'.
+ ++k1;
+ else {
+ // Here `cmp > 0'.
+ // Increment `k2' and, if we already found any duplicate,
+ // swap the next pending row in position `k2'.
+ ++k2;
+ if (num_duplicates > 0 && k2 < num_rows)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ }
+ }
+ // If needed, swap any duplicates found past the pending rows
+ // that has not been considered yet; then erase the duplicates.
+ if (num_duplicates > 0) {
+ if (k2 < num_rows)
+ for (++k2; k2 < num_rows; ++k2)
+ swap(rows[k2], rows[k2 + num_duplicates]);
+ rows.resize(num_rows);
+ }
+ sorted = true;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::check_sorted() const {
+ for (dimension_type i = first_pending_row(); i-- > 1; )
+ if (compare(rows[i], rows[i-1]) < 0)
+ return false;
+ return true;
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ for (dimension_type i = rows.size(); i-- > 0; ) {
+ if (rows[i].representation() != representation()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong representation!"
+ << endl;
+#endif
+ return false;
+ }
+ if (rows[i].space_dimension() != space_dimension()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong number of space dimensions!"
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ for (dimension_type i = rows.size(); i-- > 0; )
+ if (rows[i].topology() != topology()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a row with the wrong topology!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // `index_first_pending' must be less than or equal to `num_rows()'.
+ if (first_pending_row() > num_rows()) {
+#ifndef NDEBUG
+ cerr << "Linear_System has a negative number of pending rows!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // Check for topology mismatches.
+ const dimension_type n_rows = num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i)
+ if (topology() != rows[i].topology()) {
+#ifndef NDEBUG
+ cerr << "Topology mismatch between the system "
+ << "and one of its rows!"
+ << endl;
+#endif
+ return false;
+ }
+
+ if (sorted && !check_sorted()) {
+#ifndef NDEBUG
+ cerr << "The system declares itself to be sorted but it is not!"
+ << endl;
+#endif
+ return false;
+ }
+
+ // All checks passed.
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 581. */
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 31. */
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 38. */
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Constraint_System
+ Writes <CODE>true</CODE> if \p cs is empty. Otherwise, writes on
+ \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Constraint_System& x, const Constraint_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Constraint_System& x, const Constraint_System& y);
+
+/*! \relates Constraint_System */
+void
+swap(Constraint_System& x, Constraint_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Constraint_System is a system of constraints,
+ i.e., a multiset of objects of the class Constraint.
+ When inserting constraints in a system, space dimensions are
+ automatically adjusted so that all the constraints in the system
+ are defined on the same vector space.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a system of constraints corresponding to
+ a square in \f$\Rset^2\f$:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ \endcode
+ Note that:
+ the constraint system is created with space dimension zero;
+ the first and third constraint insertions increase the space
+ dimension to \f$1\f$ and \f$2\f$, respectively.
+
+ \par Example 2
+ By adding four strict inequalities to the constraint system
+ of the previous example, we can remove just the four
+ vertices from the square defined above.
+ \code
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 6);
+ cs.insert(x - y < 3);
+ cs.insert(y - x < 3);
+ \endcode
+
+ \par Example 3
+ The following code builds a system of constraints corresponding to
+ a half-strip in \f$\Rset^2\f$:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x - y <= 0);
+ cs.insert(x - y + 1 >= 0);
+ \endcode
+
+ \note
+ After inserting a multiset of constraints in a constraint system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> constraint system
+ will be available, where original constraints may have been
+ reordered, removed (if they are trivial, duplicate or
+ implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System {
+public:
+ typedef Constraint row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of constraints.
+ explicit Constraint_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only constraint \p c.
+ explicit Constraint_System(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Builds a system containing copies of any equalities in \p cgs.
+ explicit Constraint_System(const Congruence_System& cgs,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note The copy will have the same representation as `cs', to make it
+ indistinguishable from `cs'.
+ */
+ Constraint_System(const Constraint_System& cs);
+
+ //! Copy constructor with specified representation.
+ Constraint_System(const Constraint_System& cs, Representation r);
+
+ //! Destructor.
+ ~Constraint_System();
+
+ //! Assignment operator.
+ Constraint_System& operator=(const Constraint_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Constraint_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more equality constraints.
+ */
+ bool has_equalities() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more strict inequality constraints.
+ */
+ bool has_strict_inequalities() const;
+
+ /*! \brief
+ Inserts in \p *this a copy of the constraint \p c,
+ increasing the number of space dimensions if needed.
+ */
+ void insert(const Constraint& c);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only Constraint::zero_dim_false().
+ */
+ static const Constraint_System& zero_dim_empty();
+
+ typedef Constraint_System_const_iterator const_iterator;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+ bool empty() const;
+
+ /*! \brief
+ Removes all the constraints from the constraint system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Returns the const_iterator pointing to the first constraint,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constraint_System& y);
+
+private:
+ Linear_System<Constraint> sys;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Constraint::zero_dim_false().
+ */
+ static const Constraint_System* zero_dim_empty_p;
+
+ friend class Constraint_System_const_iterator;
+
+ friend bool operator==(const Constraint_System& x,
+ const Constraint_System& y);
+
+ //! Builds an empty system of constraints having the specified topology.
+ explicit Constraint_System(Topology topol,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a system of constraints on a \p space_dim dimensional space. If
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+ dimension is added.
+ */
+ Constraint_System(Topology topol, dimension_type space_dim,
+ Representation r = default_representation);
+
+ //! Returns the number of equality constraints.
+ dimension_type num_equalities() const;
+
+ //! Returns the number of inequality constraints.
+ dimension_type num_inequalities() const;
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as
+ to provide a partial simplification of the system of constraints.
+
+ It is assumed that the system has no pending constraints.
+ */
+ void simplify();
+
+ /*! \brief
+ Adjusts \p *this so that it matches \p new_topology and
+ \p new_space_dim (adding or removing columns if needed).
+ Returns <CODE>false</CODE> if and only if \p topol is
+ equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+ contains strict inequalities.
+ */
+ bool adjust_topology_and_space_dimension(Topology new_topology,
+ dimension_type new_space_dim);
+
+ //! Returns a constant reference to the \p k- th constraint of the system.
+ const Constraint& operator[](dimension_type k) const;
+
+ //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+ bool satisfies_all_constraints(const Generator& g) const;
+
+ //! Substitutes a given column of coefficients by a given affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is substituted.
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We want to allow affine transformations
+ (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+ having any rational coefficients. Since the coefficients of the
+ constraints are integers we must also provide an integer \p
+ denominator that will be used as denominator of the affine
+ transformation.
+ The denominator is required to be a positive integer.
+
+ The affine transformation substitutes the matrix of constraints
+ by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+ the old one \f$a_{ij}\f$ as follows:
+ \f[
+ {a'}_{ij} =
+ \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+ \quad \text{for } j \neq v; \\
+ \mathrm{expr}[v] * a_{iv}
+ \quad \text{for } j = v.
+ \end{cases}
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ /*! \brief
+ Inserts in \p *this a copy of the constraint \p c,
+ increasing the number of space dimensions if needed.
+ It is a pending constraint.
+ */
+ void insert_pending(const Constraint& c);
+
+ //! Adds low-level constraints to the constraint system.
+ void add_low_level_constraints();
+
+ //! Returns the system topology.
+ Topology topology() const;
+
+ dimension_type num_rows() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Removes all the specified dimensions from the constraint system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ bool has_no_rows() const;
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Adds the given row to the pending part of the system, stealing its
+ contents and automatically resizing the system or the row, if needed.
+ */
+ void insert_pending(Constraint& r, Recycle_Input);
+
+ //! Adds the rows of `y' to the pending part of `*this', stealing them from
+ //! `y'.
+ void insert_pending(Constraint_System& r, Recycle_Input);
+
+ /*! \brief
+ Adds \p r to the system, stealing its contents and
+ automatically resizing the system or the row, if needed.
+ */
+ void insert(Constraint& r, Recycle_Input);
+
+ //! Adds to \p *this a the rows of `y', stealing them from `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(Constraint_System& r, Recycle_Input);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Constraint_System& r);
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Constraint_System& y);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Constraint_System& y);
+
+ //! Marks the epsilon dimension as a standard dimension.
+ /*!
+ The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is increased by 1.
+ */
+ void mark_as_necessarily_closed();
+
+ //! Marks the last dimension as the epsilon dimension.
+ /*!
+ The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+ the number of space dimensions is decreased by 1.
+ */
+ void mark_as_not_necessarily_closed();
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most columns.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Constraint_System& y);
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ friend class Polyhedron;
+ friend class Termination_Helpers;
+};
+
+//! An iterator over a system of constraints.
+/*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each constraint contained in a Constraint_System object.
+
+ \par Example
+ The following code prints the system of constraints
+ defining the polyhedron <CODE>ph</CODE>:
+ \code
+const Constraint_System& cs = ph.constraints();
+for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ cout << *i << endl;
+ \endcode
+*/
+// NOTE: This is not an inner class of Constraint_System, so Constraint can
+// declare that this class is his friend without including this file
+// (the .types.hh file suffices).
+class Parma_Polyhedra_Library::Constraint_System_const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Constraint,
+ ptrdiff_t,
+ const Constraint*,
+ const Constraint&> {
+public:
+ //! Default constructor.
+ Constraint_System_const_iterator();
+
+ //! Ordinary copy constructor.
+ Constraint_System_const_iterator(const Constraint_System_const_iterator& y);
+
+ //! Destructor.
+ ~Constraint_System_const_iterator();
+
+ //! Assignment operator.
+ Constraint_System_const_iterator&
+ operator=(const Constraint_System_const_iterator& y);
+
+ //! Dereference operator.
+ const Constraint& operator*() const;
+
+ //! Indirect member selector.
+ const Constraint* operator->() const;
+
+ //! Prefix increment operator.
+ Constraint_System_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ Constraint_System_const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const Constraint_System_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const Constraint_System_const_iterator& y) const;
+
+private:
+ friend class Constraint_System;
+
+ //! The const iterator over the matrix of constraints.
+ Linear_System<Constraint>::const_iterator i;
+
+ //! A const pointer to the matrix of constraints.
+ const Linear_System<Constraint>* csp;
+
+ //! Constructor.
+ Constraint_System_const_iterator(const Linear_System<Constraint>
+ ::const_iterator& iter,
+ const Constraint_System& cs);
+
+ //! \p *this skips to the next non-trivial constraint.
+ void skip_forward();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper returning number of constraints in system.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+num_constraints(const Constraint_System& cs);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Constraint_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Constraint_System_inlines.hh line 1. */
+/* Constraint_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c, Representation r)
+ : sys(c.topology(), r) {
+ sys.insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+ : sys(cs.sys) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs,
+ Representation r)
+ : sys(cs.sys, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol, Representation r)
+ : sys(topol, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+ const dimension_type space_dim,
+ Representation r)
+ : sys(topol, space_dim, r) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+ Constraint_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline Representation
+Constraint_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Constraint_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+ return Linear_System<Constraint>::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline void
+Constraint_System::set_space_dimension(dimension_type space_dim) {
+ return sys.set_space_dimension(space_dim);
+}
+
+inline void
+Constraint_System::clear() {
+ sys.clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ return *zero_dim_empty_p;
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator(const Constraint_System_const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System_const_iterator::~Constraint_System_const_iterator() {
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator=(const Constraint_System_const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System_const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Constraint*
+Constraint_System_const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator++() {
+ ++i;
+ skip_forward();
+ return *this;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System_const_iterator::operator++(int) {
+ const Constraint_System_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Constraint_System_const_iterator::operator==(const Constraint_System_const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Constraint_System_const_iterator::operator!=(const Constraint_System_const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Constraint_System_const_iterator::
+Constraint_System_const_iterator(const Linear_System<Constraint>::const_iterator& iter,
+ const Constraint_System& cs)
+ : i(iter), csp(&cs.sys) {
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::begin() const {
+ const_iterator i(sys.begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::end() const {
+ const Constraint_System_const_iterator i(sys.end(), *this);
+ return i;
+}
+
+inline bool
+Constraint_System::empty() const {
+ return begin() == end();
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+ if (sys.is_necessarily_closed())
+ // The positivity constraint.
+ insert(Constraint::zero_dim_positivity());
+ else {
+ // Add the epsilon constraints.
+ insert(Constraint::epsilon_leq_one());
+ insert(Constraint::epsilon_geq_zero());
+ }
+}
+
+inline void
+Constraint_System::m_swap(Constraint_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Constraint_System::simplify() {
+ sys.simplify();
+}
+
+inline Topology
+Constraint_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Constraint_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline bool
+Constraint_System::is_necessarily_closed() const {
+ return sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::num_pending_rows() const {
+ return sys.num_pending_rows();
+}
+
+inline dimension_type
+Constraint_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+inline bool
+Constraint_System::is_sorted() const {
+ return sys.is_sorted();
+}
+
+inline void
+Constraint_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Constraint_System::set_index_first_pending_row(dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline void
+Constraint_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline void
+Constraint_System::remove_row(dimension_type i, bool keep_sorted) {
+ sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted) {
+ sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(const std::vector<dimension_type>& indexes) {
+ sys.remove_rows(indexes);
+}
+
+inline void
+Constraint_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline void
+Constraint_System
+::remove_space_dimensions(const Variables_Set& vars) {
+ sys.remove_space_dimensions(vars);
+}
+
+inline void
+Constraint_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+ sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Constraint_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Constraint_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+ sys.swap_space_dimensions(v1, v2);
+}
+
+inline bool
+Constraint_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline void
+Constraint_System::strong_normalize() {
+ sys.strong_normalize();
+}
+
+inline void
+Constraint_System::sort_rows() {
+ sys.sort_rows();
+}
+
+inline void
+Constraint_System::insert_pending(Constraint_System& r, Recycle_Input) {
+ sys.insert_pending(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert(Constraint_System& r, Recycle_Input) {
+ sys.insert(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert_pending(const Constraint_System& r) {
+ sys.insert_pending(r.sys);
+}
+
+inline void
+Constraint_System::merge_rows_assign(const Constraint_System& y) {
+ sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Constraint_System::insert(const Constraint_System& y) {
+ sys.insert(y.sys);
+}
+
+inline void
+Constraint_System::mark_as_necessarily_closed() {
+ sys.mark_as_necessarily_closed();
+}
+
+inline void
+Constraint_System::mark_as_not_necessarily_closed() {
+ sys.mark_as_not_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::gauss(dimension_type n_lines_or_equalities) {
+ return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::back_substitute(dimension_type n_lines_or_equalities) {
+ sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::assign_with_pending(const Constraint_System& y) {
+ sys.assign_with_pending(y.sys);
+}
+
+inline void
+Constraint_System::sort_pending_and_remove_duplicates() {
+ sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Constraint_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ sys.sort_and_remove_with_sat(sat);
+}
+
+inline bool
+Constraint_System::check_sorted() const {
+ return sys.check_sorted();
+}
+
+inline dimension_type
+Constraint_System::num_lines_or_equalities() const {
+ return sys.num_lines_or_equalities();
+}
+
+inline void
+Constraint_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+ sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline bool
+operator==(const Constraint_System& x, const Constraint_System& y) {
+ return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Constraint_System& x, const Constraint_System& y) {
+ return !(x == y);
+}
+
+/*! \relates Constraint_System */
+inline void
+swap(Constraint_System& x, Constraint_System& y) {
+ x.m_swap(y);
+}
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+num_constraints(const Constraint_System& cs) {
+ return static_cast<dimension_type>(std::distance(cs.begin(), cs.end()));
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_System_defs.hh line 1. */
+/* Congruence_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_System_defs.hh line 35. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+}
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Congruence_System is a system of congruences,
+ i.e., a multiset of objects of the class Congruence.
+ When inserting congruences in a system, space dimensions are
+ automatically adjusted so that all the congruences in the system
+ are defined on the same vector space.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a system of congruences corresponding to
+ an integer grid in \f$\Rset^2\f$:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x %= 0);
+ cgs.insert(y %= 0);
+ \endcode
+ Note that:
+ the congruence system is created with space dimension zero;
+ the first and second congruence insertions increase the space
+ dimension to \f$1\f$ and \f$2\f$, respectively.
+
+ \par Example 2
+ By adding to the congruence system of the previous example,
+ the congruence \f$x + y = 1 \pmod{2}\f$:
+ \code
+ cgs.insert((x + y %= 1) / 2);
+ \endcode
+ we obtain the grid containing just those integral
+ points where the sum of the \p x and \p y values is odd.
+
+ \par Example 3
+ The following code builds a system of congruences corresponding to
+ the grid in \f$\Zset^2\f$ containing just the integral points on
+ the \p x axis:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x %= 0);
+ cgs.insert((y %= 0) / 0);
+ \endcode
+
+ \note
+ After inserting a multiset of congruences in a congruence system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> congruence system
+ will be available, where original congruences may have been
+ reordered, removed (if they are trivial, duplicate or
+ implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System {
+public:
+
+ typedef Congruence row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of congruences.
+ explicit Congruence_System(Representation r = default_representation);
+
+ //! Builds an empty (i.e. zero rows) system of dimension \p d.
+ explicit Congruence_System(dimension_type d,
+ Representation r = default_representation);
+
+ //! Builds the singleton system containing only congruence \p cg.
+ explicit Congruence_System(const Congruence& cg,
+ Representation r = default_representation);
+
+ /*! \brief
+ If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+ singleton system containing only constraint \f$ e_1 = e_2
+ \pmod{0}\f$.
+
+ \exception std::invalid_argument
+ Thrown if \p c is not an equality constraint.
+ */
+ explicit Congruence_System(const Constraint& c,
+ Representation r = default_representation);
+
+ //! Builds a system containing copies of any equalities in \p cs.
+ explicit Congruence_System(const Constraint_System& cs,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ /*!
+ \note
+ The new Congruence_System will have the same Representation as `cgs'
+ so that it's indistinguishable from `cgs'.
+ */
+ Congruence_System(const Congruence_System& cgs);
+
+ //! Copy constructor with specified representation.
+ Congruence_System(const Congruence_System& cgs, Representation r);
+
+ //! Destructor.
+ ~Congruence_System();
+
+ //! Assignment operator.
+ Congruence_System& operator=(const Congruence_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Congruence_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+ to \p y.
+ */
+ bool is_equal_to(const Congruence_System& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains one or
+ more linear equalities.
+ */
+ bool has_linear_equalities() const;
+
+ //! Removes all the congruences and sets the space dimension to 0.
+ void clear();
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruence \p cg, increasing the
+ number of space dimensions if needed.
+
+ The copy of \p cg will be strongly normalized after being
+ inserted.
+ */
+ void insert(const Congruence& cg);
+
+ /*! \brief
+ Inserts in \p *this the congruence \p cg, stealing its contents and
+ increasing the number of space dimensions if needed.
+
+ \p cg will be strongly normalized.
+ */
+ void insert(Congruence& cg, Recycle_Input);
+
+ /*! \brief
+ Inserts in \p *this a copy of the equality constraint \p c, seen
+ as a modulo 0 congruence, increasing the number of space
+ dimensions if needed.
+
+ The modulo 0 congruence will be strongly normalized after being
+ inserted.
+
+ \exception std::invalid_argument
+ Thrown if \p c is a relational constraint.
+ */
+ void insert(const Constraint& c);
+
+ // TODO: Consider adding a insert(cg, Recycle_Input).
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruences in \p y,
+ increasing the number of space dimensions if needed.
+
+ The inserted copies will be strongly normalized.
+ */
+ void insert(const Congruence_System& y);
+
+ /*! \brief
+ Inserts into \p *this the congruences in \p cgs, increasing the
+ number of space dimensions if needed.
+ */
+ void insert(Congruence_System& cgs, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ //! Returns the system containing only Congruence::zero_dim_false().
+ static const Congruence_System& zero_dim_empty();
+
+ //! An iterator over a system of congruences.
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each congruence contained in an object of Congruence_System.
+
+ \par Example
+ The following code prints the system of congruences
+ defining the grid <CODE>gr</CODE>:
+ \code
+ const Congruence_System& cgs = gr.congruences();
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Congruence,
+ ptrdiff_t,
+ const Congruence*,
+ const Congruence&> {
+ public:
+ //! Default constructor.
+ const_iterator();
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Destructor.
+ ~const_iterator();
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ const Congruence& operator*() const;
+
+ //! Indirect member selector.
+ const Congruence* operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ different.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ friend class Congruence_System;
+
+ //! The const iterator over the vector of congruences.
+ Swapping_Vector<Congruence>::const_iterator i;
+
+ //! A const pointer to the vector of congruences.
+ const Swapping_Vector<Congruence>* csp;
+
+ //! Constructor.
+ const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+ const Congruence_System& cgs);
+
+ //! \p *this skips to the next non-trivial congruence.
+ void skip_forward();
+ };
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first congruence, if \p
+ *this is not empty; otherwise, returns the past-the-end
+ const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*!
+ Returns <CODE>true</CODE> if and only if all rows have space dimension
+ space_dimension_, each row in the system is a valid Congruence and the
+ space dimension is consistent with the number of congruences.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the number of equalities.
+ dimension_type num_equalities() const;
+
+ //! Returns the number of proper congruences.
+ dimension_type num_proper_congruences() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Congruence_System& y);
+
+ /*! \brief
+ Adds \p dims rows and \p dims space dimensions to the matrix,
+ initializing the added rows as in the unit congruence system.
+
+ \param dims
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+ (c+dims)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_unit_rows_and_space_dimensions(dimension_type dims);
+
+ //! Permutes the space dimensions of the system.
+ /*!
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ //! Sets the number of space dimensions to \p new_space_dim.
+ /*!
+ If \p new_space_dim is lower than the current space dimension, the
+ coefficients referring to the removed space dimensions are lost.
+ */
+ bool set_space_dimension(dimension_type new_space_dim);
+
+ // Note: the following method is protected to allow tests/Grid/congruences2
+ // to call it using a derived class.
+protected:
+ //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+ bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+ //! Returns the number of rows in the system.
+ dimension_type num_rows() const;
+
+ //! Returns \c true if num_rows()==0.
+ bool has_no_rows() const;
+
+ //! Returns a constant reference to the \p k- th congruence of the system.
+ const Congruence& operator[](dimension_type k) const;
+
+ //! Adjusts all expressions to have the same moduli.
+ void normalize_moduli();
+
+ /*! \brief
+ Substitutes a given column of coefficients by a given affine
+ expression.
+
+ \param v
+ Index of the column to which the affine transformation is
+ substituted;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We allow affine transformations (see the Section \ref
+ rational_grid_operations) to have rational
+ coefficients. Since the coefficients of linear expressions are
+ integers we also provide an integer \p denominator that will
+ be used as denominator of the affine transformation. The
+ denominator is required to be a positive integer and its default value
+ is 1.
+
+ The affine transformation substitutes the matrix of congruences
+ by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+ the old one \f$a_{ij}\f$ as follows:
+ \f[
+ {a'}_{ij} =
+ \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+ \quad \text{for } j \neq v; \\
+ \mathrm{expr}[v] * a_{iv}
+ \quad \text{for } j = v.
+ \end{cases}
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_preimage(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ // TODO: Consider making this private.
+ /*! \brief
+ Concatenates copies of the congruences from \p y onto \p *this.
+
+ \param y
+ The congruence system to append to \p this. The number of rows in
+ \p y must be strictly positive.
+
+ The matrix for the new system of congruences is obtained by
+ leaving the old system in the upper left-hand side and placing the
+ congruences of \p y in the lower right-hand side, and padding
+ with zeroes.
+ */
+ void concatenate(const Congruence_System& y);
+
+ /*! \brief
+ Inserts in \p *this the congruence \p cg, stealing its contents and
+ increasing the number of space dimensions if needed.
+
+ This method inserts \p cg in the given form, instead of first strong
+ normalizing \p cg as \ref insert would do.
+ */
+ void insert_verbatim(Congruence& cg, Recycle_Input);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ If \p keep_sorted is <CODE>true</CODE>, the ordering of the remaining rows
+ will be preserved.
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted);
+
+ void remove_trailing_rows(dimension_type n);
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Congruence::zero_dim_false().
+ */
+ static const Congruence_System* zero_dim_empty_p;
+
+ Swapping_Vector<Congruence> rows;
+
+ dimension_type space_dimension_;
+
+ Representation representation_;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if any of the dimensions in
+ \p *this is free of constraint.
+
+ Any equality or proper congruence affecting a dimension constrains
+ that dimension.
+
+ This method assumes the system is in minimal form.
+ */
+ bool has_a_free_dimension() const;
+
+ friend class Grid;
+
+ friend bool
+ operator==(const Congruence_System& x, const Congruence_System& y);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Congruence_System
+ Writes <CODE>true</CODE> if \p cgs is empty. Otherwise, writes on
+ \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+/*! \relates Congruence_System */
+void
+swap(Congruence_System& x, Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Congruence_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Congruence_System_inlines.hh line 1. */
+/* Congruence_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+ return rows[k];
+}
+
+inline dimension_type
+Congruence_System::num_rows() const {
+ return rows.size();
+}
+
+inline bool
+Congruence_System::has_no_rows() const {
+ return num_rows() == 0;
+}
+
+inline void
+Congruence_System::remove_trailing_rows(dimension_type n) {
+ PPL_ASSERT(num_rows() >= n);
+ rows.resize(num_rows() - n);
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+ Congruence tmp = cg;
+ insert(tmp, Recycle_Input());
+}
+
+inline void
+Congruence_System::insert(Congruence& cg, Recycle_Input) {
+ PPL_ASSERT(cg.OK());
+ cg.strong_normalize();
+ PPL_ASSERT(cg.OK());
+ insert_verbatim(cg, Recycle_Input());
+ PPL_ASSERT(OK());
+}
+
+inline
+Congruence_System::Congruence_System(Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg, Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+ insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c, Representation r)
+ : rows(),
+ space_dimension_(0),
+ representation_(r) {
+ insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs)
+ : rows(cgs.rows),
+ space_dimension_(cgs.space_dimension_),
+ representation_(cgs.representation_) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs,
+ Representation r)
+ : rows(cgs.rows),
+ space_dimension_(cgs.space_dimension_),
+ representation_(r) {
+ if (cgs.representation() != r) {
+ for (dimension_type i = 0; i < num_rows(); ++i)
+ rows[i].set_representation(representation());
+ }
+}
+
+inline
+Congruence_System::Congruence_System(const dimension_type d, Representation r)
+ : rows(),
+ space_dimension_(d),
+ representation_(r) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+ Congruence_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Congruence_System::representation() const {
+ return representation_;
+}
+
+inline void
+Congruence_System::set_representation(Representation r) {
+ if (representation_ == r)
+ return;
+ representation_ = r;
+ for (dimension_type i = 0; i < num_rows(); ++i)
+ rows[i].set_representation(r);
+ PPL_ASSERT(OK());
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+ return Congruence::max_space_dimension();
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+ return space_dimension_;
+}
+
+inline void
+Congruence_System::clear() {
+ rows.clear();
+ space_dimension_ = 0;
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+ PPL_ASSERT(zero_dim_empty_p != 0);
+ return *zero_dim_empty_p;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+ ++i;
+ skip_forward();
+ return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+ const const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+ const Congruence_System& cgs)
+ : i(iter), csp(&cgs.rows) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+ const_iterator i(rows.begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+ const const_iterator i(rows.end(), *this);
+ return i;
+}
+
+inline bool
+Congruence_System::empty() const {
+ return begin() == end();
+}
+
+inline void
+Congruence_System::m_swap(Congruence_System& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(space_dimension_, y.space_dimension_);
+ swap(representation_, y.representation_);
+ PPL_ASSERT(OK());
+ PPL_ASSERT(y.OK());
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+ return rows.external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Congruence_System */
+inline void
+swap(Congruence_System& x, Congruence_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_inlines.hh line 33. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+ return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+ status.set_empty();
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+ status.reset_empty();
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+ status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+ return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+ : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+ seq = y.seq;
+ status = y.status;
+ return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::m_swap(Box& y) {
+ Box& x = *this;
+ using std::swap;
+ swap(x.seq, y.seq);
+ swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(cs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(gs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+ // Recycling is useless: just delegate.
+ Box<ITV> tmp(cgs);
+ this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+ return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline int32_t
+Box<ITV>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < seq.size());
+ return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+ if (space_dimension() < var.space_dimension())
+ throw_dimension_incompatible("get_interval(v)", "v", var);
+
+ if (is_empty()) {
+ static ITV empty_interval(EMPTY);
+ return empty_interval;
+ }
+
+ return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < var.space_dimension())
+ throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+ if (is_empty() && space_dim >= 2)
+ // If the box is empty, and has dimension >= 2, setting only one
+ // interval will not make it non-empty.
+ return;
+
+ seq[var.id()] = i;
+ reset_empty_up_to_date();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+ return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+ const Box& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+ const dimension_type m) {
+ const dimension_type space_dim = space_dimension();
+ // `var' should be one of the dimensions of the vector space.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // The space dimension of the resulting Box should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dim)
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // To expand the space dimension corresponding to variable `var',
+ // we append to the box `m' copies of the corresponding interval.
+ seq.insert(seq.end(), m, seq[var.id()]);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+ return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_lower_bound(const Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const {
+ // NOTE: assertion !is_empty() would be wrong;
+ // see the calls in method Box<ITV>::constraints().
+ PPL_ASSERT(!marked_empty());
+ const dimension_type k = var.id();
+ PPL_ASSERT(k < seq.size());
+ const ITV& seq_k = seq[k];
+
+ if (seq_k.lower_is_boundary_infinity())
+ return false;
+
+ closed = !seq_k.lower_is_open();
+
+ PPL_DIRTY_TEMP(mpq_class, lr);
+ assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+ n = lr.get_num();
+ d = lr.get_den();
+
+ return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_upper_bound(const Variable var,
+ Coefficient& n, Coefficient& d, bool& closed) const {
+ // NOTE: assertion !is_empty() would be wrong;
+ // see the calls in method Box<ITV>::constraints().
+ PPL_ASSERT(!marked_empty());
+ const dimension_type k = var.id();
+ PPL_ASSERT(k < seq.size());
+ const ITV& seq_k = seq[k];
+
+ if (seq_k.upper_is_boundary_infinity())
+ return false;
+
+ closed = !seq_k.upper_is_open();
+
+ PPL_DIRTY_TEMP(mpq_class, ur);
+ assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+ n = ur.get_num();
+ d = ur.get_den();
+
+ return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_constraints(cs)", cs);
+
+ add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+ if (cgs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", cgs);
+ add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+ CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+ // Only equalities can be congruences and these are already minimized.
+ return congruences();
+}
+
+template <typename ITV>
+inline I_Result
+Box<ITV>
+::refine_interval_no_check(ITV& itv,
+ const Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ PPL_ASSERT(denom != 0);
+ // The interval constraint is of the form
+ // `var + numer / denom rel 0',
+ // where `rel' is either the relation `==', `>=', or `>'.
+ // For the purpose of refining the interval, this is
+ // (morally) turned into `var rel -numer/denom'.
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ // Turn `numer/denom' into `-numer/denom'.
+ q = -q;
+
+ Relation_Symbol rel_sym;
+ switch (type) {
+ case Constraint::EQUALITY:
+ rel_sym = EQUAL;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ rel_sym = (denom > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ rel_sym = (denom > 0) ? GREATER_THAN : LESS_THAN;
+ break;
+ default:
+ // Silence compiler warning.
+ PPL_UNREACHABLE;
+ return I_ANY;
+ }
+ I_Result res = itv.add_constraint(i_constraint(rel_sym, q));
+ PPL_ASSERT(itv.OK());
+ return res;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>
+::add_interval_constraint_no_check(const dimension_type var_id,
+ const Constraint::Type type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(var_id < space_dimension());
+ PPL_ASSERT(denom != 0);
+ refine_interval_no_check(seq[var_id], type, numer, denom);
+ // FIXME: do check the value returned and set `empty' and
+ // `empty_up_to_date' as appropriate.
+ // This has to be done after reimplementation of intervals.
+ reset_empty_up_to_date();
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("propagate_constraint(c)", c);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ propagate_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraints(const Constraint_System& cs,
+ const dimension_type max_iterations) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_dimension_incompatible("propagate_constraints(cs)", cs);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ propagate_constraints_no_check(cs, max_iterations);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+ const dimension_type var_id = var.id();
+ // Dimension-compatibility check.
+ if (space_dimension() < var_id + 1)
+ throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ // Here the box might still be empty (but we haven't detected it yet):
+ // check emptiness of the interval for `var' before cylindrification.
+ ITV& seq_var = seq[var_id];
+ if (seq_var.is_empty())
+ set_empty();
+ else
+ seq_var.assign(UNIVERSE);
+
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+ (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x,
+ const Box<ITV>& y,
+ const Rounding_Dir dir) {
+ // FIXME: the following qualification is only to work around a bug
+ // in the Intel C/C++ compiler version 10.1.x.
+ return Parma_Polyhedra_Library
+ ::l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename ITV>
+inline void
+swap(Box<ITV>& x, Box<ITV>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_templates.hh line 1. */
+/* Box class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 1. */
+/* Generator_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 1. */
+/* Poly_Con_Relation class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 29. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+/*! \brief
+ Yields the assertion with all the conjuncts of \p x
+ that are not in \p y.
+
+ \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+ //! Poly_Con_Relation is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t NOTHING = 0U;
+ static const flags_t IS_DISJOINT = 1U << 0;
+ static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+ static const flags_t IS_INCLUDED = 1U << 2;
+ static const flags_t SATURATES = 1U << 3;
+ //@} // Bit-masks for the individual assertions
+
+ //! All assertions together.
+ static const flags_t EVERYTHING
+ = IS_DISJOINT
+ | STRICTLY_INTERSECTS
+ | IS_INCLUDED
+ | SATURATES;
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! True if and only if the conjunction \p x implies the conjunction \p y.
+ static bool implies(flags_t x, flags_t y);
+
+ //! Construct from a bit-mask.
+ Poly_Con_Relation(flags_t mask);
+
+ friend bool
+ operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+ friend bool
+ operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::
+ IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Access the internal flags: this is needed for some language
+ interfaces.
+ */
+#endif
+ flags_t get_flags() const;
+
+public:
+ //! The assertion that says nothing.
+ static Poly_Con_Relation nothing();
+
+ /*! \brief
+ The polyhedron and the set of points satisfying
+ the constraint are disjoint.
+ */
+ static Poly_Con_Relation is_disjoint();
+
+ /*! \brief
+ The polyhedron intersects the set of points satisfying
+ the constraint, but it is not included in it.
+ */
+ static Poly_Con_Relation strictly_intersects();
+
+ /*! \brief
+ The polyhedron is included in the set of points satisfying
+ the constraint.
+ */
+ static Poly_Con_Relation is_included();
+
+ /*! \brief
+ The polyhedron is included in the set of points saturating
+ the constraint.
+ */
+ static Poly_Con_Relation saturates();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! True if and only if \p *this implies \p y.
+ bool implies(const Poly_Con_Relation& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_inlines.hh line 1. */
+/* Poly_Con_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+ : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+ return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+ return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+ return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+ return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+ return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+ return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+ return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+ return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+ return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 165. */
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 35. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Generator_System
+ Writes <CODE>false</CODE> if \p gs is empty. Otherwise, writes on
+ \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Generator_System& x, const Generator_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Generator_System& x, const Generator_System& y);
+
+/*! \relates Generator_System */
+void
+swap(Generator_System& x, Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Generator_System is a system of generators,
+ i.e., a multiset of objects of the class Generator
+ (lines, rays, points and closure points).
+ When inserting generators in a system, space dimensions are automatically
+ adjusted so that all the generators in the system are defined
+ on the same vector space.
+ A system of generators which is meant to define a non-empty
+ polyhedron must include at least one point: the reason is that
+ lines, rays and closure points need a supporting point
+ (lines and rays only specify directions while closure points only
+ specify points in the topological closure of the NNC polyhedron).
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code defines the line having the same direction
+ as the \f$x\f$ axis (i.e., the first Cartesian axis)
+ in \f$\Rset^2\f$:
+ \code
+ Generator_System gs;
+ gs.insert(line(x + 0*y));
+ \endcode
+ As said above, this system of generators corresponds to
+ an empty polyhedron, because the line has no supporting point.
+ To define a system of generators that does correspond to
+ the \f$x\f$ axis, we can add the following code which
+ inserts the origin of the space as a point:
+ \code
+ gs.insert(point(0*x + 0*y));
+ \endcode
+ Since space dimensions are automatically adjusted, the following
+ code obtains the same effect:
+ \code
+ gs.insert(point(0*x));
+ \endcode
+ In contrast, if we had added the following code, we would have
+ defined a line parallel to the \f$x\f$ axis through
+ the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+ \code
+ gs.insert(point(0*x + 1*y));
+ \endcode
+
+ \par Example 2
+ The following code builds a ray having the same direction as
+ the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+ \code
+ Generator_System gs;
+ gs.insert(ray(x + 0*y));
+ \endcode
+ To define a system of generators indeed corresponding to the set
+ \f[
+ \bigl\{\,
+ (x, 0)^\transpose \in \Rset^2
+ \bigm|
+ x \geq 0
+ \,\bigr\},
+ \f]
+ one just has to add the origin:
+ \code
+ gs.insert(point(0*x + 0*y));
+ \endcode
+
+ \par Example 3
+ The following code builds a system of generators having four points
+ and corresponding to a square in \f$\Rset^2\f$
+ (the same as Example 1 for the system of constraints):
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 3*y));
+ gs.insert(point(3*x + 0*y));
+ gs.insert(point(3*x + 3*y));
+ \endcode
+
+ \par Example 4
+ By using closure points, we can define the \e kernel
+ (i.e., the largest open set included in a given set)
+ of the square defined in the previous example.
+ Note that a supporting point is needed and, for that purpose,
+ any inner point could be considered.
+ \code
+ Generator_System gs;
+ gs.insert(point(x + y));
+ gs.insert(closure_point(0*x + 0*y));
+ gs.insert(closure_point(0*x + 3*y));
+ gs.insert(closure_point(3*x + 0*y));
+ gs.insert(closure_point(3*x + 3*y));
+ \endcode
+
+ \par Example 5
+ The following code builds a system of generators having two points
+ and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+ (the same as Example 2 for the system of constraints):
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 1*y));
+ gs.insert(ray(x - y));
+ \endcode
+
+ \note
+ After inserting a multiset of generators in a generator system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> generator system
+ will be available, where original generators may have been
+ reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System {
+public:
+ typedef Generator row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of generators.
+ Generator_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Generator_System(const Generator& g,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Generator_System will have the same representation as `gs'.
+ Generator_System(const Generator_System& gs);
+
+ //! Copy constructor with specified representation.
+ Generator_System(const Generator_System& gs, Representation r);
+
+ //! Destructor.
+ ~Generator_System();
+
+ //! Assignment operator.
+ Generator_System& operator=(const Generator_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Generator_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Sets the space dimension of the rows in the system to \p space_dim .
+ void set_space_dimension(dimension_type space_dim);
+
+ /*! \brief
+ Removes all the generators from the generator system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Inserts in \p *this a copy of the generator \p g,
+ increasing the number of space dimensions if needed.
+ */
+ void insert(const Generator& g);
+
+ /*! \brief
+ Inserts in \p *this the generator \p g, stealing its contents and
+ increasing the number of space dimensions if needed.
+ */
+ void insert(Generator& g, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only Generator::zero_dim_point().
+ */
+ static const Generator_System& zero_dim_univ();
+
+ typedef Generator_System_const_iterator const_iterator;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first generator,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Resizes the matrix of generators using the numbers of rows and columns
+ read from \p s, then initializes the coordinates of each generator
+ and its type reading the contents from \p s.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Generator_System& y);
+
+private:
+
+ bool has_no_rows() const;
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ //! Swaps the coefficients of the variables \p v1 and \p v2 .
+ void swap_space_dimensions(Variable v1, Variable v2);
+
+ dimension_type num_rows() const;
+
+ //! Adds \p n rows and space dimensions to the system.
+ /*!
+ \param n
+ The number of rows and space dimensions to be added: must be strictly
+ positive.
+
+ Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+ the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+ such that
+ \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+ where \f$J\f$ is the specular image
+ of the \f$n \times n\f$ identity matrix.
+ */
+ void add_universe_rows_and_space_dimensions(dimension_type n);
+
+ Topology topology() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! Returns the value of the sortedness flag.
+ bool is_sorted() const;
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+ */
+ bool is_necessarily_closed() const;
+
+ //! Full assignment operator: pending rows are copied as pending.
+ void assign_with_pending(const Generator_System& y);
+
+ //! Returns the number of rows that are in the pending part of the system.
+ dimension_type num_pending_rows() const;
+
+ /*! \brief
+ Sorts the pending rows and eliminates those that also occur
+ in the non-pending part of the system.
+ */
+ void sort_pending_and_remove_duplicates();
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Bit matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+ /*! \brief
+ Sorts the non-pending rows (in growing order) and eliminates
+ duplicated ones.
+ */
+ void sort_rows();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is sorted,
+ without checking for duplicates.
+ */
+ bool check_sorted() const;
+
+ /*! \brief
+ Returns the number of rows in the system
+ that represent either lines or equalities.
+ */
+ dimension_type num_lines_or_equalities() const;
+
+ //! Makes the system shrink by removing its i-th row.
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(n).
+
+ Otherwise, this method just swaps the i-th row with the last and then
+ removes it, so it costs O(1).
+ */
+ void remove_row(dimension_type i, bool keep_sorted = false);
+
+ //! Makes the system shrink by removing the rows in [first,last).
+ /*!
+ When \p keep_sorted is \p true and the system is sorted, sortedness will
+ be preserved, but this method costs O(num_rows()).
+
+ Otherwise, this method just swaps the rows with the last ones and then
+ removes them, so it costs O(last - first).
+ */
+ void remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted = false);
+
+ //! Removes the specified rows. The row ordering of remaining rows is
+ //! preserved.
+ /*!
+ \param indexes specifies a list of row indexes.
+ It must be sorted.
+ */
+ void remove_rows(const std::vector<dimension_type>& indexes);
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ //! Minimizes the subsystem of equations contained in \p *this.
+ /*!
+ This method works only on the equalities of the system:
+ the system is required to be partially sorted, so that
+ all the equalities are grouped at its top; it is assumed that
+ the number of equalities is exactly \p n_lines_or_equalities.
+ The method finds a minimal system for the equalities and
+ returns its rank, i.e., the number of linearly independent equalities.
+ The result is an upper triangular subsystem of equalities:
+ for each equality, the pivot is chosen starting from
+ the right-most columns.
+ */
+ dimension_type gauss(dimension_type n_lines_or_equalities);
+
+ /*! \brief
+ Back-substitutes the coefficients to reduce
+ the complexity of the system.
+
+ Takes an upper triangular system having \p n_lines_or_equalities rows.
+ For each row, starting from the one having the minimum number of
+ coefficients different from zero, computes the expression of an element
+ as a function of the remaining ones and then substitutes this expression
+ in all the other rows.
+ */
+ void back_substitute(dimension_type n_lines_or_equalities);
+
+ //! Strongly normalizes the system.
+ void strong_normalize();
+
+ /*! \brief
+ Assigns to \p *this the result of merging its rows with
+ those of \p y, obtaining a sorted system.
+
+ Duplicated rows will occur only once in the result.
+ On entry, both systems are assumed to be sorted and have
+ no pending rows.
+ */
+ void merge_rows_assign(const Generator_System& y);
+
+ //! Adds to \p *this a copy of the rows of \p y.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void insert(const Generator_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void insert_pending(const Generator_System& r);
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Generator::zero_dim_point().
+ */
+ static const Generator_System* zero_dim_univ_p;
+
+ friend class Generator_System_const_iterator;
+
+ //! Builds an empty system of generators having the specified topology.
+ explicit Generator_System(Topology topol,
+ Representation r = default_representation);
+
+ /*! \brief
+ Builds a system of rays/points on a \p space_dim dimensional space. If
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+ dimension is added.
+ */
+ Generator_System(Topology topol, dimension_type space_dim,
+ Representation r = default_representation);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the \p new_topology and
+ \p new_space_dim (adding or removing columns if needed).
+ Returns <CODE>false</CODE> if and only if \p topol is
+ equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+ contains closure points.
+ */
+ bool adjust_topology_and_space_dimension(Topology new_topology,
+ dimension_type new_space_dim);
+
+ /*! \brief
+ For each unmatched closure point in \p *this, adds the
+ corresponding point.
+
+ It is assumed that the topology of \p *this
+ is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ */
+ void add_corresponding_points();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more points.
+ */
+ bool has_points() const;
+
+ /*! \brief
+ For each unmatched point in \p *this, adds the corresponding
+ closure point.
+
+ It is assumed that the topology of \p *this
+ is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ */
+ void add_corresponding_closure_points();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more closure points.
+
+ Note: the check for the presence of closure points is
+ done under the point of view of the user. Namely, we scan
+ the generator system using high-level iterators, so that
+ closure points that are matching the corresponding points
+ will be disregarded.
+ */
+ bool has_closure_points() const;
+
+ //! Converts this generator system into a non-necessarily closed generator
+ //! system.
+ void convert_into_non_necessarily_closed();
+
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Generator& operator[](dimension_type k) const;
+
+ /*! \brief
+ Returns the relations holding between the generator system
+ and the constraint \p c.
+ */
+ Parma_Polyhedra_Library::Poly_Con_Relation
+ relation_with(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ bool satisfied_by_all_generators(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ /*!
+ It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+ */
+ bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+ //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+ /*!
+ It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+ */
+ bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is assigned;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation.
+
+ We want to allow affine transformations (see the Introduction) having
+ any rational coefficients. Since the coefficients of the
+ constraints are integers we must also provide an integer \p denominator
+ that will be used as denominator of the affine transformation.
+ The denominator is required to be a positive integer.
+
+ The affine transformation assigns to each element of the column containing
+ the coefficients of v the follow expression:
+ \f[
+ \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+ {\mathrm{denominator}}.
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Returns the number of lines of the system.
+ dimension_type num_lines() const;
+
+ //! Returns the number of rays of the system.
+ dimension_type num_rays() const;
+
+ //! Removes all the invalid lines and rays.
+ /*!
+ The invalid lines and rays are those with all
+ the homogeneous terms set to zero.
+ */
+ void remove_invalid_lines_and_rays();
+
+ /*! \brief
+ Applies Gaussian elimination and back-substitution so as
+ to provide a partial simplification of the system of generators.
+
+ It is assumed that the system has no pending generators.
+ */
+ void simplify();
+
+ /*! \brief
+ Inserts in \p *this a copy of the generator \p g,
+ increasing the number of space dimensions if needed.
+ It is a pending generator.
+ */
+ void insert_pending(const Generator& g);
+
+ /*! \brief
+ Inserts in \p *this the generator \p g, stealing its contents and
+ increasing the number of space dimensions if needed.
+ It is a pending generator.
+ */
+ void insert_pending(Generator& g, Recycle_Input);
+
+ Linear_System<Generator> sys;
+
+ friend bool
+ operator==(const Generator_System& x, const Generator_System& y);
+
+ friend class Polyhedron;
+};
+
+//! An iterator over a system of generators
+/*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each generator contained in an object of Generator_System.
+
+ \par Example
+ The following code prints the system of generators
+ of the polyhedron <CODE>ph</CODE>:
+ \code
+const Generator_System& gs = ph.generators();
+for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ The same effect can be obtained more concisely by using
+ more features of the STL:
+ \code
+const Generator_System& gs = ph.generators();
+copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+ \endcode
+*/
+class Parma_Polyhedra_Library::Generator_System_const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Generator,
+ ptrdiff_t,
+ const Generator*,
+ const Generator&> {
+public:
+ //! Default constructor.
+ Generator_System_const_iterator();
+
+ //! Ordinary copy constructor.
+ Generator_System_const_iterator(const Generator_System_const_iterator& y);
+
+ //! Destructor.
+ ~Generator_System_const_iterator();
+
+ //! Assignment operator.
+ Generator_System_const_iterator& operator=(const Generator_System_const_iterator& y);
+
+ //! Dereference operator.
+ const Generator& operator*() const;
+
+ //! Indirect member selector.
+ const Generator* operator->() const;
+
+ //! Prefix increment operator.
+ Generator_System_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ Generator_System_const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const Generator_System_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const Generator_System_const_iterator& y) const;
+
+private:
+ friend class Generator_System;
+
+ //! The const iterator over the Linear_System.
+ Linear_System<Generator>::const_iterator i;
+
+ //! A const pointer to the Linear_System.
+ const Linear_System<Generator>* gsp;
+
+ //! Constructor.
+ Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+ const Generator_System& gsys);
+
+ /*! \brief
+ \p *this skips to the next generator, skipping those
+ closure points that are immediately followed by a matching point.
+ */
+ void skip_forward();
+};
+
+// Generator_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Generator_System_inlines.hh line 1. */
+/* Generator_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g, Representation r)
+ : sys(g.topology(), r) {
+ sys.insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+ : sys(gs.sys) {
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs,
+ Representation r)
+ : sys(gs.sys, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol, Representation r)
+ : sys(topol, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+ const dimension_type space_dim,
+ Representation r)
+ : sys(topol, space_dim, r) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+ Generator_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Generator_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Generator_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+ return Linear_System<Generator>::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline void
+Generator_System::set_space_dimension(dimension_type space_dim) {
+ const dimension_type old_space_dim = space_dimension();
+ sys.set_space_dimension_no_ok(space_dim);
+
+ if (space_dim < old_space_dim)
+ // We may have invalid lines and rays now.
+ remove_invalid_lines_and_rays();
+
+#ifndef NDEBUG
+ for (dimension_type i = 0; i < sys.num_rows(); ++i)
+ PPL_ASSERT(sys[i].OK());
+#endif
+ PPL_ASSERT(sys.OK());
+ PPL_ASSERT(OK());
+}
+
+inline void
+Generator_System::clear() {
+ sys.clear();
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline void
+Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+ sys.remove_space_dimensions(vars);
+}
+
+inline void
+Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+ sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Generator_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+ sys.swap_space_dimensions(v1, v2);
+}
+
+inline dimension_type
+Generator_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline void
+Generator_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+ sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline Topology
+Generator_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Generator_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+inline void
+Generator_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Generator_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline bool
+Generator_System::is_sorted() const {
+ return sys.is_sorted();
+}
+
+inline void
+Generator_System::set_index_first_pending_row(dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline bool
+Generator_System::is_necessarily_closed() const {
+ return sys.is_necessarily_closed();
+}
+
+inline void
+Generator_System::assign_with_pending(const Generator_System& y) {
+ sys.assign_with_pending(y.sys);
+}
+
+inline dimension_type
+Generator_System::num_pending_rows() const {
+ return sys.num_pending_rows();
+}
+
+inline void
+Generator_System::sort_pending_and_remove_duplicates() {
+ return sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Generator_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+ sys.sort_and_remove_with_sat(sat);
+}
+
+inline void
+Generator_System::sort_rows() {
+ sys.sort_rows();
+}
+
+inline bool
+Generator_System::check_sorted() const {
+ return sys.check_sorted();
+}
+
+inline dimension_type
+Generator_System::num_lines_or_equalities() const {
+ return sys.num_lines_or_equalities();
+}
+
+inline void
+Generator_System::remove_row(dimension_type i, bool keep_sorted) {
+ sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(dimension_type first, dimension_type last,
+ bool keep_sorted) {
+ sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(const std::vector<dimension_type>& indexes) {
+ sys.remove_rows(indexes);
+}
+
+inline void
+Generator_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline dimension_type
+Generator_System::gauss(dimension_type n_lines_or_equalities) {
+ return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::back_substitute(dimension_type n_lines_or_equalities) {
+ sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::strong_normalize() {
+ sys.strong_normalize();
+}
+
+inline void
+Generator_System::merge_rows_assign(const Generator_System& y) {
+ sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Generator_System::insert(const Generator_System& y) {
+ sys.insert(y.sys);
+}
+
+inline void
+Generator_System::insert_pending(const Generator_System& r) {
+ sys.insert_pending(r.sys);
+}
+
+inline bool
+operator==(const Generator_System& x, const Generator_System& y) {
+ return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Generator_System& x, const Generator_System& y) {
+ return !(x == y);
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator()
+ : i(), gsp(0) {
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator(const Generator_System_const_iterator& y)
+ : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System_const_iterator::~Generator_System_const_iterator() {
+}
+
+inline
+Generator_System_const_iterator&
+Generator_System_const_iterator::operator=(const Generator_System_const_iterator& y) {
+ i = y.i;
+ gsp = y.gsp;
+ return *this;
+}
+
+inline const Generator&
+Generator_System_const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Generator*
+Generator_System_const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Generator_System_const_iterator&
+Generator_System_const_iterator::operator++() {
+ ++i;
+ if (!gsp->is_necessarily_closed())
+ skip_forward();
+ return *this;
+}
+
+inline Generator_System_const_iterator
+Generator_System_const_iterator::operator++(int) {
+ const Generator_System_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Generator_System_const_iterator::operator==(const Generator_System_const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Generator_System_const_iterator::operator!=(const Generator_System_const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Generator_System_const_iterator::
+Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+ const Generator_System& gs)
+ : i(iter), gsp(&gs.sys) {
+}
+
+inline bool
+Generator_System::empty() const {
+ return sys.has_no_rows();
+}
+
+inline bool
+Generator_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+ const_iterator i(sys.begin(), *this);
+ if (!sys.is_necessarily_closed())
+ i.skip_forward();
+ return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+ const const_iterator i(sys.end(), *this);
+ return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ return *zero_dim_univ_p;
+}
+
+inline void
+Generator_System::m_swap(Generator_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Generator_System::simplify() {
+ sys.simplify();
+ remove_invalid_lines_and_rays();
+}
+
+/*! \relates Generator_System */
+inline void
+swap(Generator_System& x, Generator_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 1. */
+/* Poly_Gen_Relation class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 29. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+/*! \brief
+ Yields the assertion with all the conjuncts of \p x
+ that are not in \p y.
+
+ \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+ This class implements conjunctions of assertions on the relation
+ between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+ //! Poly_Gen_Relation is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t NOTHING = 0U;
+ static const flags_t SUBSUMES = 1U << 0;
+ //@} // Bit-masks for the individual assertions
+
+ //! All assertions together.
+ static const flags_t EVERYTHING
+ = SUBSUMES;
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! True if and only if the conjunction \p x implies the conjunction \p y.
+ static bool implies(flags_t x, flags_t y);
+
+ //! Construct from a bit-mask.
+ Poly_Gen_Relation(flags_t mask);
+
+ friend bool
+ operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+ friend bool
+ operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::
+ IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Access the internal flags: this is needed for some language
+ interfaces.
+ */
+#endif
+ flags_t get_flags() const;
+
+public:
+ //! The assertion that says nothing.
+ static Poly_Gen_Relation nothing();
+
+ //! Adding the generator would not change the polyhedron.
+ static Poly_Gen_Relation subsumes();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! True if and only if \p *this implies \p y.
+ bool implies(const Poly_Gen_Relation& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_inlines.hh line 1. */
+/* Poly_Gen_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+ : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+ return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+ return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+ return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+ return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+ return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+ return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 138. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 1. */
+/* Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 51. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Polyhedron
+ Writes a textual representation of \p ph on \p s:
+ <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+ <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+ a minimized system of constraints defining \p ph is written otherwise,
+ all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Polyhedron */
+void swap(Polyhedron& x, Polyhedron& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are the same polyhedron.
+
+ \relates Polyhedron
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are different polyhedra.
+
+ \relates Polyhedron
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Returns \c true if and only if
+ <code>ph.topology() == NECESSARILY_CLOSED</code>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_necessarily_closed_for_interfaces(const Polyhedron& ph);
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Polyhedron represents a convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ A polyhedron can be specified as either a finite system of constraints
+ or a finite system of generators (see Section \ref representation)
+ and it is always possible to obtain either representation.
+ That is, if we know the system of constraints, we can obtain
+ from this the system of generators that define the same polyhedron
+ and vice versa.
+ These systems can contain redundant members: in this case we say
+ that they are not in the minimal form.
+
+ Two key attributes of any polyhedron are its topological kind
+ (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+ and its space dimension (the dimension \f$n \in \Nset\f$ of
+ the enclosing vector space):
+
+ - all polyhedra, the empty ones included, are endowed with
+ a specific topology and space dimension;
+ - most operations working on a polyhedron and another object
+ (i.e., another polyhedron, a constraint or generator,
+ a set of variables, etc.) will throw an exception if
+ the polyhedron and the object are not both topology-compatible
+ and dimension-compatible (see Section \ref representation);
+ - the topology of a polyhedron cannot be changed;
+ rather, there are constructors for each of the two derived classes
+ that will build a new polyhedron with the topology of that class
+ from another polyhedron from either class and any topology;
+ - the only ways in which the space dimension of a polyhedron can
+ be changed are:
+ - <EM>explicit</EM> calls to operators provided for that purpose;
+ - standard copy, assignment and swap operators.
+
+ Note that four different polyhedra can be defined on
+ the zero-dimension space:
+ the empty polyhedron, either closed or NNC,
+ and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+ used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a polyhedron corresponding to
+ a square in \f$\Rset^2\f$, given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ C_Polyhedron ph(cs);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from a system of generators specifying
+ the four vertices of the square:
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 3*y));
+ gs.insert(point(3*x + 0*y));
+ gs.insert(point(3*x + 3*y));
+ C_Polyhedron ph(gs);
+ \endcode
+
+ \par Example 2
+ The following code builds an unbounded polyhedron
+ corresponding to a half-strip in \f$\Rset^2\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x - y <= 0);
+ cs.insert(x - y + 1 >= 0);
+ C_Polyhedron ph(cs);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from the system of generators specifying
+ the two vertices of the polyhedron and one ray:
+ \code
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + y));
+ gs.insert(ray(x - y));
+ C_Polyhedron ph(gs);
+ \endcode
+
+ \par Example 3
+ The following code builds the polyhedron corresponding to
+ a half-plane by adding a single constraint
+ to the universe polyhedron in \f$\Rset^2\f$:
+ \code
+ C_Polyhedron ph(2);
+ ph.add_constraint(y >= 0);
+ \endcode
+ The following code builds the same polyhedron as above,
+ but starting from the empty polyhedron in the space \f$\Rset^2\f$
+ and inserting the appropriate generators
+ (a point, a ray and a line).
+ \code
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(0*x + 0*y));
+ ph.add_generator(ray(y));
+ ph.add_generator(line(x));
+ \endcode
+ Note that, although the above polyhedron has no vertices, we must add
+ one point, because otherwise the result of the Minkowski's sum
+ would be an empty polyhedron.
+ To avoid subtle errors related to the minimization process,
+ it is required that the first generator inserted in an empty
+ polyhedron is a point (otherwise, an exception is thrown).
+
+ \par Example 4
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_embed</CODE>:
+ \code
+ C_Polyhedron ph(1);
+ ph.add_constraint(x == 2);
+ ph.add_space_dimensions_and_embed(1);
+ \endcode
+ We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+ Then we add a single equality constraint,
+ thus obtaining the polyhedron corresponding to the singleton set
+ \f$\{ 2 \} \sseq \Rset\f$.
+ After the last line of code, the resulting polyhedron is
+ \f[
+ \bigl\{\,
+ (2, y)^\transpose \in \Rset^2
+ \bigm|
+ y \in \Rset
+ \,\bigr\}.
+ \f]
+
+ \par Example 5
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_project</CODE>:
+ \code
+ C_Polyhedron ph(1);
+ ph.add_constraint(x == 2);
+ ph.add_space_dimensions_and_project(1);
+ \endcode
+ The first two lines of code are the same as in Example 4 for
+ <CODE>add_space_dimensions_and_embed</CODE>.
+ After the last line of code, the resulting polyhedron is
+ the singleton set
+ \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+ \par Example 6
+ The following code shows the use of the function
+ <CODE>affine_image</CODE>:
+ \code
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(0*x + 0*y));
+ ph.add_generator(point(0*x + 3*y));
+ ph.add_generator(point(3*x + 0*y));
+ ph.add_generator(point(3*x + 3*y));
+ Linear_Expression expr = x + 4;
+ ph.affine_image(x, expr);
+ \endcode
+ In this example the starting polyhedron is a square in
+ \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+ expression is \f$x+4\f$. The resulting polyhedron is the same
+ square translated to the right. Moreover, if the affine
+ transformation for the same variable \p x is \f$x+y\f$:
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting polyhedron is a parallelogram with the height equal to
+ the side of the square and the oblique sides parallel to the line
+ \f$x-y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable; for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting polyhedron is a diagonal of the square.
+
+ \par Example 7
+ The following code shows the use of the function
+ <CODE>affine_preimage</CODE>:
+ \code
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(x <= 3);
+ ph.add_constraint(y >= 0);
+ ph.add_constraint(y <= 3);
+ Linear_Expression expr = x + 4;
+ ph.affine_preimage(x, expr);
+ \endcode
+ In this example the starting polyhedron, \p var and the affine
+ expression and the denominator are the same as in Example 6,
+ while the resulting polyhedron is again the same square,
+ but translated to the left.
+ Moreover, if the affine transformation for \p x is \f$x+y\f$
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting polyhedron is a parallelogram with the height equal to
+ the side of the square and the oblique sides parallel to the line
+ \f$x+y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable \p x, for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+ \par Example 8
+ For this example we use also the variables:
+ \code
+ Variable z(2);
+ Variable w(3);
+ \endcode
+ The following code shows the use of the function
+ <CODE>remove_space_dimensions</CODE>:
+ \code
+ Generator_System gs;
+ gs.insert(point(3*x + y + 0*z + 2*w));
+ C_Polyhedron ph(gs);
+ Variables_Set vars;
+ vars.insert(y);
+ vars.insert(z);
+ ph.remove_space_dimensions(vars);
+ \endcode
+ The starting polyhedron is the singleton set
+ \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+ the resulting polyhedron is
+ \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+ Be careful when removing space dimensions <EM>incrementally</EM>:
+ since dimensions are automatically renamed after each application
+ of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+ results can be obtained.
+ For instance, by using the following code we would obtain
+ a different result:
+ \code
+ set<Variable> vars1;
+ vars1.insert(y);
+ ph.remove_space_dimensions(vars1);
+ set<Variable> vars2;
+ vars2.insert(z);
+ ph.remove_space_dimensions(vars2);
+ \endcode
+ In this case, the result is the polyhedron
+ \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+ when removing the set of dimensions \p vars2
+ we are actually removing variable \f$w\f$ of the original polyhedron.
+ For the same reason, the operator \p remove_space_dimensions
+ is not idempotent: removing twice the same non-empty set of dimensions
+ is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+ //! The numeric type of coefficients.
+ typedef Coefficient coefficient_type;
+
+ //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns \c true indicating that this domain has methods that
+ can recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+protected:
+ //! Builds a polyhedron having the specified properties.
+ /*!
+ \param topol
+ The topology of the polyhedron;
+
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the polyhedron;
+
+ \param kind
+ Specifies whether the universe or the empty polyhedron has to be built.
+ */
+ Polyhedron(Topology topol,
+ dimension_type num_dimensions,
+ Degenerate_Element kind);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Polyhedron(const Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param cs
+ The system of constraints defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, const Constraint_System& cs);
+
+ //! Builds a polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p gs is incompatible with \p topol,
+ or if the system of generators is not empty but has no points.
+ */
+ Polyhedron(Topology topol, const Generator_System& gs);
+
+ //! Builds a polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p gs is incompatible with \p topol,
+ or if the system of generators is not empty but has no points.
+ */
+ Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds a polyhedron from a box.
+ /*!
+ This will use an algorithm whose complexity is polynomial and build
+ the smallest polyhedron with topology \p topol containing \p box.
+
+ \param topol
+ The topology of the polyhedron;
+
+ \param box
+ The box representing the polyhedron to be built;
+
+ \param complexity
+ This argument is ignored.
+ */
+ template <typename Interval>
+ Polyhedron(Topology topol, const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ Polyhedron& operator=(const Polyhedron& y);
+
+public:
+ //! \name Member Functions that Do Not Modify the Polyhedron
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns the system of constraints.
+ const Constraint_System& constraints() const;
+
+ //! Returns the system of constraints, with no redundant constraint.
+ const Constraint_System& minimized_constraints() const;
+
+ //! Returns the system of generators.
+ const Generator_System& generators() const;
+
+ //! Returns the system of generators, with no redundant generator.
+ const Generator_System& minimized_generators() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a system of (equality) congruences satisfied by \p *this,
+ with no redundant congruences and having the same affine dimension
+ as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns the relations holding between the polyhedron \p *this
+ and the congruence \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is
+ an empty polyhedron.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a universe polyhedron.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a bounded polyhedron.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool contains(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool strictly_contains(const Polyhedron& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if \p *this satisfies all the
+ invariants and either \p check_not_empty is <CODE>false</CODE> or
+ \p *this is not empty.
+
+ \param check_not_empty
+ <CODE>true</CODE> if and only if, in addition to checking the
+ invariants, \p *this must be checked to be not empty.
+
+ The check is performed so as to intrude as little as possible. If
+ the library has been compiled with run-time assertions enabled,
+ error messages are written on <CODE>std::cerr</CODE> in case
+ invariants are violated. This is useful for the purpose of
+ debugging the library.
+ */
+ bool OK(bool check_not_empty = false) const;
+
+ //@} // Member Functions that Do Not Modify the Polyhedron
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ of \p *this (without minimizing the result).
+
+ \param c
+ The constraint that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of generator \p g to the system of generators
+ of \p *this (without minimizing the result).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are topology-incompatible or
+ dimension-incompatible, or if \p *this is an empty polyhedron and
+ \p g is not a point.
+ */
+ void add_generator(const Generator& g);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to \p *this,
+ if \p cg can be exactly represented by a polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ of if \p cg is a proper congruence which is neither a tautology,
+ nor a contradiction.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the system
+ of constraints of \p *this (without minimizing the result).
+
+ \param cs
+ Contains the constraints that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this (without minimizing the result).
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system
+ of generators of \p *this (without minimizing the result).
+
+ \param gs
+ Contains the generators that will be added to the system of
+ generators of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are topology-incompatible or
+ dimension-incompatible, or if \p *this is empty and the system of
+ generators \p gs is not empty, but has no points.
+ */
+ void add_generators(const Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators
+ of \p *this (without minimizing the result).
+
+ \param gs
+ The generator system to be added to \p *this. The generators in
+ \p gs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are topology-incompatible or
+ dimension-incompatible, or if \p *this is empty and the system of
+ generators \p gs is not empty, but has no points.
+
+ \warning
+ The only assumption that can be made on \p gs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_generators(Generator_System& gs);
+
+ /*! \brief
+ Adds a copy of the congruences in \p cgs to \p *this,
+ if all the congruences can be exactly represented by a polyhedron.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ of if there exists in \p cgs a proper congruence which is
+ neither a tautology, nor a contradiction.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds the congruences in \p cgs to \p *this,
+ if all the congruences can be exactly represented by a polyhedron.
+
+ \param cgs
+ The congruences to be added. Its elements may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ of if there exists in \p cgs a proper congruence which is
+ neither a tautology, nor a contradiction
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine \p *this.
+
+ \param cs
+ Contains the constraints used to refine the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ Contains the congruences used to refine the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines \p *this with the constraint expressed by \p left \f$<\f$
+ \p right if \p is_strict is set, with the constraint \p left \f$\leq\f$
+ \p right otherwise.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is on the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is on the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param is_strict
+ True if the comparison is strict.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ bool is_strict = false);
+
+ /*! \brief
+ Refines \p *this with the constraint expressed by \p left \f$\relsym\f$
+ \p right, where \f$\relsym\f$ is the relation symbol specified by
+ \p relsym..
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is on the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is on the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void refine_fp_interval_abstract_store(
+ Box< Interval<FP_Format, Interval_Info> >& store)
+ const;
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void intersection_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_hull_assign(const Polyhedron& y);
+
+ //! Same as poly_hull_assign(y).
+ void upper_bound_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this
+ the \ref Convex_Polyhedral_Difference "poly-difference"
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_difference_assign(const Polyhedron& y);
+
+ //! Same as poly_difference_assign(y).
+ void difference_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering the generators of a polyhedron, the
+ affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If constraints are up-to-date, it uses the specialized function
+ affine_preimage() (for the system of constraints)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq var} a_i x_i + b,
+ \f]
+ so that the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f]
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only generators remain
+ up-to-date.
+
+ In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+ the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+ matrix representing the points of the polyhedron and
+ \f[
+ P = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+ \vect{\lambda} \in \Rset^{m_1}_+,
+ \vect{\mu} \in \Rset^{m_2}_+,
+ \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+ \,\bigr\}
+ \f]
+ and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+ the resulting polyhedron is
+ \f[
+ P' = \bigl\{\,
+ (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+ \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+ \,\bigr\}.
+ \f]
+
+ Affine transformations are, for example:
+ - translations
+ - rotations
+ - symmetries.
+ \endif
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*!
+ Assigns to \p *this the
+ \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var is
+ not a space dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering constraints of a polyhedron, the affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If generators are up-to-date, then the specialized function
+ affine_image() is used (for the system of generators)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation, we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+ \f],
+ the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f].
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only constraints remain
+ up-to-date.
+
+ In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+ the constraints of the polyhedron, \f$T\f$ is the affine transformation
+ to apply to \f$P\f$ and
+ \f[
+ P = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+ \bigm|
+ A\vect{x} \geq \vect{0}
+ \,\bigr\}.
+ \f]
+ The resulting polyhedron is
+ \f[
+ P' = \bigl\{\,
+ \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+ \bigm|
+ A'\vect{x} \geq \vect{0}
+ \,\bigr\},
+ \f]
+ where \f$A'\f$ is defined as follows:
+ \f[
+ {a'}_{ij}
+ = \begin{cases}
+ a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+ \quad \mathrm{for } j \neq \mathrm{var}; \\
+ \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+ \quad \text{for } j = \mathrm{var}.
+ \end{cases}
+ \f]
+ \endif
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void time_elapse_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this (the best approximation of) the result of
+ computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref limited_extrapolation "limited extrapolation"
+ between \p *this and \p y using the \ref BHRZ03_widening
+ "BHRZ03-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref bounded_extrapolation "bounded extrapolation"
+ between \p *this and \p y using the \ref BHRZ03_widening
+ "BHRZ03-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref H79_widening "H79_widening" between \p *this and \p y.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ //! Same as H79_widening_assign(y, tp).
+ void widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref limited_extrapolation "limited extrapolation"
+ between \p *this and \p y using the \ref H79_widening
+ "H79-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void limited_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref bounded_extrapolation "bounded extrapolation"
+ between \p *this and \p y using the \ref H79_widening
+ "H79-widening" operator.
+
+ \param y
+ A polyhedron that <EM>must</EM> be contained in \p *this;
+
+ \param cs
+ The system of constraints used to improve the widened polyhedron;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void bounded_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old polyhedron
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new polyhedron, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are not constrained.
+ For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+ and adding a third space dimension, the result will be the polyhedron
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cP
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new space dimensions to the polyhedron
+ and does not embed it in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new polyhedron, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are all constrained to be equal to 0.
+ For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+ and adding a third space dimension, the result will be the polyhedron
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cP
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Polyhedron& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that
+ the resulting space will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each space dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain
+ of the partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing the polyhedron.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Polyhedron();
+
+ /*! \brief
+ Swaps \p *this with polyhedron \p y.
+ (\p *this and \p y can be dimension-incompatible.)
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible.
+ */
+ void m_swap(Polyhedron& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+ static const Representation default_con_sys_repr = DENSE;
+ static const Representation default_gen_sys_repr = DENSE;
+
+ //! The system of constraints.
+ Constraint_System con_sys;
+
+ //! The system of generators.
+ Generator_System gen_sys;
+
+ //! The saturation matrix having constraints on its columns.
+ Bit_Matrix sat_c;
+
+ //! The saturation matrix having generators on its columns.
+ Bit_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+/* Automatically generated from PPL source file ../src/Ph_Status_idefs.hh line 1. */
+/* Polyhedron::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status_idefs.hh directly; use Polyhedron_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the polyhedron is the empty set;
+ - <EM>constraints pending</EM>: the polyhedron is correctly
+ characterized by the attached system of constraints, which is
+ split in two non-empty subsets: the already processed constraints,
+ which are in minimal form, and the pending constraints, which
+ still have to be processed and may thus be inconsistent or
+ contain redundancies;
+ - <EM>generators pending</EM>: the polyhedron is correctly
+ characterized by the attached system of generators, which is
+ split in two non-empty subsets: the already processed generators,
+ which are in minimal form, and the pending generators, which still
+ have to be processed and may thus contain redundancies;
+ - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+ characterized by the attached system of constraints, modulo the
+ processing of pending generators;
+ - <EM>generators up-to-date</EM>: the polyhedron is correctly
+ characterized by the attached system of generators, modulo the
+ processing of pending constraints;
+ - <EM>constraints minimized</EM>: the non-pending part of the system
+ of constraints attached to the polyhedron is in minimal form;
+ - <EM>generators minimized</EM>: the non-pending part of the system
+ of generators attached to the polyhedron is in minimal form;
+ - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+ saturation matrix having rows indexed by non-pending generators and
+ columns indexed by non-pending constraints correctly expresses
+ the saturation relation between the attached non-pending constraints
+ and generators;
+ - <EM>generators' saturation matrix up-to-date</EM>: the attached
+ saturation matrix having rows indexed by non-pending constraints and
+ columns indexed by non-pending generators correctly expresses
+ the saturation relation between the attached non-pending constraints
+ and generators;
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>constraints pending</EM> and <EM>generators pending</EM>
+ are mutually exclusive;
+ - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+ - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+ - <EM>constraints' saturation matrix up-to-date</EM> implies both
+ <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+ - <EM>generators' saturation matrix up-to-date</EM> implies both
+ <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_c_up_to_date() const;
+ void reset_c_up_to_date();
+ void set_c_up_to_date();
+
+ bool test_g_up_to_date() const;
+ void reset_g_up_to_date();
+ void set_g_up_to_date();
+
+ bool test_c_minimized() const;
+ void reset_c_minimized();
+ void set_c_minimized();
+
+ bool test_g_minimized() const;
+ void reset_g_minimized();
+ void set_g_minimized();
+
+ bool test_sat_c_up_to_date() const;
+ void reset_sat_c_up_to_date();
+ void set_sat_c_up_to_date();
+
+ bool test_sat_g_up_to_date() const;
+ void reset_sat_g_up_to_date();
+ void set_sat_g_up_to_date();
+
+ bool test_c_pending() const;
+ void reset_c_pending();
+ void set_c_pending();
+
+ bool test_g_pending() const;
+ void reset_g_pending();
+ void set_g_pending();
+ //@} // Test, remove or add an individual assertion from the conjunction
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t C_UP_TO_DATE = 1U << 1;
+ static const flags_t G_UP_TO_DATE = 1U << 2;
+ static const flags_t C_MINIMIZED = 1U << 3;
+ static const flags_t G_MINIMIZED = 1U << 4;
+ static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+ static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+ static const flags_t CS_PENDING = 1U << 7;
+ static const flags_t GS_PENDING = 1U << 8;
+ //@} // Bit-masks for the individual assertions
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 2043. */
+#undef PPL_IN_Polyhedron_CLASS
+
+ //! The status flags to keep track of the polyhedron's internal state.
+ Status status;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ //! Returns the topological kind of the polyhedron.
+ Topology topology() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the polyhedron
+ is necessarily closed.
+ */
+ bool is_necessarily_closed() const;
+
+ friend bool
+ Parma_Polyhedra_Library::Interfaces
+ ::is_necessarily_closed_for_interfaces(const Polyhedron&);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of constraints
+ of \p *this.
+
+ \param c The constraint to be added. If it is dimension-incompatible
+ with \p *this, the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ //! \name Private Verifiers: Verify if Individual Flags are Set
+ //@{
+
+ //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+ bool constraints_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+ bool generators_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+ /*!
+ Note that only \em weak minimization is entailed, so that
+ an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+ */
+ bool constraints_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is minimized.
+ /*!
+ Note that only \em weak minimization is entailed, so that
+ an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+ */
+ bool generators_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if there are pending constraints.
+ bool has_pending_constraints() const;
+
+ //! Returns <CODE>true</CODE> if there are pending generators.
+ bool has_pending_generators() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if there are
+ either pending constraints or pending generators.
+ */
+ bool has_something_pending() const;
+
+ //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+ bool can_have_something_pending() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+ is up-to-date.
+ */
+ bool sat_c_is_up_to_date() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+ is up-to-date.
+ */
+ bool sat_g_is_up_to_date() const;
+
+ //@} // Private Verifiers: Verify if Individual Flags are Set
+
+ //! \name State Flag Setters: Set Only the Specified Flags
+ //@{
+
+ /*! \brief
+ Sets \p status to express that the polyhedron is the universe
+ 0-dimension vector space, clearing all corresponding matrices.
+ */
+ void set_zero_dim_univ();
+
+ /*! \brief
+ Sets \p status to express that the polyhedron is empty,
+ clearing all corresponding matrices.
+ */
+ void set_empty();
+
+ //! Sets \p status to express that constraints are up-to-date.
+ void set_constraints_up_to_date();
+
+ //! Sets \p status to express that generators are up-to-date.
+ void set_generators_up_to_date();
+
+ //! Sets \p status to express that constraints are minimized.
+ void set_constraints_minimized();
+
+ //! Sets \p status to express that generators are minimized.
+ void set_generators_minimized();
+
+ //! Sets \p status to express that constraints are pending.
+ void set_constraints_pending();
+
+ //! Sets \p status to express that generators are pending.
+ void set_generators_pending();
+
+ //! Sets \p status to express that \p sat_c is up-to-date.
+ void set_sat_c_up_to_date();
+
+ //! Sets \p status to express that \p sat_g is up-to-date.
+ void set_sat_g_up_to_date();
+
+ //@} // State Flag Setters: Set Only the Specified Flags
+
+ //! \name State Flag Cleaners: Clear Only the Specified Flag
+ //@{
+
+ //! Clears the \p status flag indicating that the polyhedron is empty.
+ void clear_empty();
+
+ //! Sets \p status to express that constraints are no longer up-to-date.
+ /*!
+ This also implies that they are neither minimized
+ and both saturation matrices are no longer meaningful.
+ */
+ void clear_constraints_up_to_date();
+
+ //! Sets \p status to express that generators are no longer up-to-date.
+ /*!
+ This also implies that they are neither minimized
+ and both saturation matrices are no longer meaningful.
+ */
+ void clear_generators_up_to_date();
+
+ //! Sets \p status to express that constraints are no longer minimized.
+ void clear_constraints_minimized();
+
+ //! Sets \p status to express that generators are no longer minimized.
+ void clear_generators_minimized();
+
+ //! Sets \p status to express that there are no longer pending constraints.
+ void clear_pending_constraints();
+
+ //! Sets \p status to express that there are no longer pending generators.
+ void clear_pending_generators();
+
+ //! Sets \p status to express that \p sat_c is no longer up-to-date.
+ void clear_sat_c_up_to_date();
+
+ //! Sets \p status to express that \p sat_g is no longer up-to-date.
+ void clear_sat_g_up_to_date();
+
+ //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+ //! \name The Handling of Pending Rows
+ //@{
+
+ /*! \brief
+ Processes the pending rows of either description of the polyhedron
+ and obtains a minimized polyhedron.
+
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ bool process_pending() const;
+
+ //! Processes the pending constraints and obtains a minimized polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some pending constraints.
+ */
+ bool process_pending_constraints() const;
+
+ //! Processes the pending generators and obtains a minimized polyhedron.
+ /*!
+ It is assumed that the polyhedron does have some pending generators.
+ */
+ void process_pending_generators() const;
+
+ /*! \brief
+ Lazily integrates the pending descriptions of the polyhedron
+ to obtain a constraint system without pending rows.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ void remove_pending_to_obtain_constraints() const;
+
+ /*! \brief
+ Lazily integrates the pending descriptions of the polyhedron
+ to obtain a generator system without pending rows.
+
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ It is assumed that the polyhedron does have some constraints or
+ generators pending.
+ */
+ bool remove_pending_to_obtain_generators() const;
+
+ //@} // The Handling of Pending Rows
+
+ //! \name Updating and Sorting Matrices
+ //@{
+
+ //! Updates constraints starting from generators and minimizes them.
+ /*!
+ The resulting system of constraints is only partially sorted:
+ the equalities are in the upper part of the matrix,
+ while the inequalities in the lower part.
+ */
+ void update_constraints() const;
+
+ //! Updates generators starting from constraints and minimizes them.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ The resulting system of generators is only partially sorted:
+ the lines are in the upper part of the matrix,
+ while rays and points are in the lower part.
+ It is illegal to call this method when the Status field
+ already declares the polyhedron to be empty.
+ */
+ bool update_generators() const;
+
+ //! Updates \p sat_c using the updated constraints and generators.
+ /*!
+ It is assumed that constraints and generators are up-to-date
+ and minimized and that the Status field does not already flag
+ \p sat_c to be up-to-date.
+ The values of the saturation matrix are computed as follows:
+ \f[
+ \begin{cases}
+ sat\_c[i][j] = 0,
+ \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+ sat\_c[i][j] = 1,
+ \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+ \end{cases}
+ \f]
+ */
+ void update_sat_c() const;
+
+ //! Updates \p sat_g using the updated constraints and generators.
+ /*!
+ It is assumed that constraints and generators are up-to-date
+ and minimized and that the Status field does not already flag
+ \p sat_g to be up-to-date.
+ The values of the saturation matrix are computed as follows:
+ \f[
+ \begin{cases}
+ sat\_g[i][j] = 0,
+ \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+ sat\_g[i][j] = 1,
+ \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+ \end{cases}
+ \f]
+ */
+ void update_sat_g() const;
+
+ //! Sorts the matrix of constraints keeping status consistency.
+ /*!
+ It is assumed that constraints are up-to-date.
+ If at least one of the saturation matrices is up-to-date,
+ then \p sat_g is kept consistent with the sorted matrix
+ of constraints.
+ The method is declared \p const because reordering
+ the constraints does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_constraints() const;
+
+ //! Sorts the matrix of generators keeping status consistency.
+ /*!
+ It is assumed that generators are up-to-date.
+ If at least one of the saturation matrices is up-to-date,
+ then \p sat_c is kept consistent with the sorted matrix
+ of generators.
+ The method is declared \p const because reordering
+ the generators does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_generators() const;
+
+ //! Sorts the matrix of constraints and updates \p sat_c.
+ /*!
+ It is assumed that both constraints and generators
+ are up-to-date and minimized.
+ The method is declared \p const because reordering
+ the constraints does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_constraints_with_sat_c() const;
+
+ //! Sorts the matrix of generators and updates \p sat_g.
+ /*!
+ It is assumed that both constraints and generators
+ are up-to-date and minimized.
+ The method is declared \p const because reordering
+ the generators does not modify the polyhedron
+ from a \e logical point of view.
+ */
+ void obtain_sorted_generators_with_sat_g() const;
+
+ //@} // Updating and Sorting Matrices
+
+ //! \name Weak and Strong Minimization of Descriptions
+ //@{
+
+ //! Applies (weak) minimization to both the constraints and generators.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+
+ Minimization is not attempted if the Status field already declares
+ both systems to be minimized.
+ */
+ bool minimize() const;
+
+ //! Applies strong minimization to the constraints of an NNC polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+ */
+ bool strongly_minimize_constraints() const;
+
+ //! Applies strong minimization to the generators of an NNC polyhedron.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty polyhedron.
+ */
+ bool strongly_minimize_generators() const;
+
+ //! If constraints are up-to-date, obtain a simplified copy of them.
+ Constraint_System simplified_constraints() const;
+
+ //@} // Weak and Strong Minimization of Descriptions
+
+ enum Three_Valued_Boolean {
+ TVB_TRUE,
+ TVB_FALSE,
+ TVB_DONT_KNOW
+ };
+
+ //! Polynomial but incomplete equivalence test between polyhedra.
+ Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+ bool is_included_in(const Polyhedron& y) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! \name Widening- and Extrapolation-Related Functions
+ //@{
+
+ /*! \brief
+ Copies to \p cs_selection the constraints of \p y corresponding
+ to the definition of the CH78-widening of \p *this and \p y.
+ */
+ void select_CH78_constraints(const Polyhedron& y,
+ Constraint_System& cs_selection) const;
+
+ /*! \brief
+ Splits the constraints of `x' into two subsets, depending on whether
+ or not they are selected to compute the \ref H79_widening "H79-widening"
+ of \p *this and \p y.
+ */
+ void select_H79_constraints(const Polyhedron& y,
+ Constraint_System& cs_selected,
+ Constraint_System& cs_not_selected) const;
+
+ bool BHRZ03_combining_constraints(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79,
+ const Constraint_System& x_minus_H79_cs);
+
+ bool BHRZ03_evolving_points(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79);
+
+ bool BHRZ03_evolving_rays(const Polyhedron& y,
+ const BHRZ03_Certificate& y_cert,
+ const Polyhedron& H79);
+
+ static void modify_according_to_evolution(Linear_Expression& ray,
+ const Linear_Expression& x,
+ const Linear_Expression& y);
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given linear systems.
+ /*!
+ \param sys1
+ The linear system to which columns are added;
+
+ \param sys2
+ The linear system to which rows and columns are added;
+
+ \param sat1
+ The saturation matrix whose columns are indexed by the rows of
+ \p sys1. On entry it is up-to-date;
+
+ \param sat2
+ The saturation matrix whose columns are indexed by the rows of \p
+ sys2;
+
+ \param add_dim
+ The number of space dimensions to add.
+
+ Adds new space dimensions to the vector space modifying the linear
+ systems and saturation matrices.
+ This function is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE> and
+ <CODE>add_space_dimensions_and_project()</CODE>, passing the
+ linear system of constraints and that of generators (and the
+ corresponding saturation matrices) in different order (see those
+ methods for details).
+ */
+ template <typename Linear_System1, typename Linear_System2>
+ static void add_space_dimensions(Linear_System1& sys1,
+ Linear_System2& sys2,
+ Bit_Matrix& sat1,
+ Bit_Matrix& sat2,
+ dimension_type add_dim);
+
+ //! \name Minimization-Related Static Member Functions
+ //@{
+
+ //! Builds and simplifies constraints from generators (or vice versa).
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static bool minimize(bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System1, typename Source_Linear_System2,
+ typename Dest_Linear_System>
+ static bool add_and_minimize(bool con_to_gen,
+ Source_Linear_System1& source1,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ const Source_Linear_System2& source2);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa. The given constraints are in \p source.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static bool add_and_minimize(bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat);
+
+ //! Performs the conversion from constraints to generators and vice versa.
+ // Detailed Doxygen comment to be found in file conversion.cc.
+ template <typename Source_Linear_System, typename Dest_Linear_System>
+ static dimension_type conversion(Source_Linear_System& source,
+ dimension_type start,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ dimension_type num_lines_or_equalities);
+
+ /*! \brief
+ Uses Gauss' elimination method to simplify the result of
+ <CODE>conversion()</CODE>.
+ */
+ // Detailed Doxygen comment to be found in file simplify.cc.
+ template <typename Linear_System1>
+ static dimension_type simplify(Linear_System1& sys, Bit_Matrix& sat);
+
+ //@} // Minimization-Related Static Member Functions
+
+ /*! \brief
+ Pointer to an array used by simplify().
+
+ Holds (between class initialization and finalization) a pointer to
+ an array, allocated with operator new[](), of
+ simplify_num_saturators_size elements.
+ */
+ static dimension_type* simplify_num_saturators_p;
+
+ /*! \brief
+ Dimension of an array used by simplify().
+
+ Holds (between class initialization and finalization) the size of the
+ array pointed to by simplify_num_saturators_p.
+ */
+ static size_t simplify_num_saturators_size;
+
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+ template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+ template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+ friend class Parma_Polyhedra_Library::Grid;
+ friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+ friend class Parma_Polyhedra_Library::H79_Certificate;
+
+protected:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Current implementation is based on (a variant of) Algorithm 8.1 in
+ A. Bemporad, K. Fukuda, and F. D. Torrisi
+ <em>Convexity Recognition of the Union of Polyhedra</em>
+ Technical Report AUT00-13, ETH Zurich, 2000
+
+ \note
+ It is assumed that \p *this and \p y are topologically closed
+ and dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool BFT00_poly_hull_assign_if_exact(const Polyhedron& y);
+
+ bool BHZ09_poly_hull_assign_if_exact(const Polyhedron& y);
+ bool BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y);
+ bool BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \name Exception Throwers
+ //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+ void throw_invalid_argument(const char* method, const char* reason) const;
+
+ void throw_topology_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const;
+ void throw_topology_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_topology_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_topology_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_topology_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System& gs) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* ph_name,
+ const Polyhedron& ph) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Generator_System& gs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const;
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: the following three methods need to be static, because they
+ // can be called inside constructors (before actually constructing the
+ // polyhedron object).
+ static dimension_type
+ check_space_dimension_overflow(dimension_type dim, dimension_type max,
+ const Topology topol,
+ const char* method, const char* reason);
+
+ static dimension_type
+ check_space_dimension_overflow(dimension_type dim, const Topology topol,
+ const char* method, const char* reason);
+
+ template <typename Object>
+ static Object&
+ check_obj_space_dimension_overflow(Object& input, Topology topol,
+ const char* method, const char* reason);
+
+ void throw_invalid_generator(const char* method,
+ const char* g_name) const;
+
+ void throw_invalid_generators(const char* method,
+ const char* gs_name) const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p *vars_p.
+
+ \param vars_p
+ When nonzero, points with non-integer coordinates for the
+ variables/space-dimensions contained in \p *vars_p can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set* vars_p,
+ Complexity_Class complexity);
+
+ //! Helper function that overapproximates an interval linear form.
+ /*!
+ \param lf
+ The linear form on intervals with floating point boundaries to approximate.
+ ALL of its coefficients MUST be bounded.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param result
+ Used to store the result.
+
+ This function makes \p result become a linear form that is a correct
+ approximation of \p lf under the constraints specified by \p *this.
+ The resulting linear form has the property that all of its variable
+ coefficients have a non-significant upper bound and can thus be
+ considered as singletons.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ void overapproximate_linear_form(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result);
+
+ /*! \brief
+ Helper function that makes \p result become a Linear_Expression obtained
+ by normalizing the denominators in \p lf.
+
+ \param lf
+ The linear form on intervals with floating point boundaries to normalize.
+ It should be the result of an application of static method
+ <CODE>overapproximate_linear_form</CODE>.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param result
+ Used to store the result.
+
+ This function ignores the upper bound of intervals in \p lf,
+ so that in fact \p result can be seen as \p lf multiplied by a proper
+ normalization constant.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ static void convert_to_integer_expression(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& result);
+
+ //! Normalization helper function.
+ /*!
+ \param lf
+ The linear form on intervals with floating point boundaries to normalize.
+ It should be the result of an application of static method
+ <CODE>overapproximate_linear_form</CODE>.
+
+ \param lf_dimension
+ Must be the space dimension of \p lf.
+
+ \param res
+ Stores the normalized linear form, except its inhomogeneous term.
+
+ \param res_low_coeff
+ Stores the lower boundary of the inhomogeneous term of the result.
+
+ \param res_hi_coeff
+ Stores the higher boundary of the inhomogeneous term of the result.
+
+ \param denominator
+ Becomes the common denominator of \p res_low_coeff, \p res_hi_coeff
+ and all coefficients in \p res.
+
+ Results are obtained by normalizing denominators in \p lf, ignoring
+ the upper bounds of variable coefficients in \p lf.
+ */
+ template <typename FP_Format, typename Interval_Info>
+ static void
+ convert_to_integer_expressions(const Linear_Form<Interval<FP_Format,
+ Interval_Info> >&
+ lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& res,
+ Coefficient& res_low_coeff,
+ Coefficient& res_hi_coeff,
+ Coefficient& denominator);
+
+ template <typename Linear_System1, typename Row2>
+ static bool
+ add_to_system_and_check_independence(Linear_System1& eq_sys,
+ const Row2& eq);
+
+ /*! \brief
+ Assuming \p *this is NNC, assigns to \p *this the result of the
+ "positive time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign_impl(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/Ph_Status_inlines.hh line 1. */
+/* Polyhedron::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+ flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+ return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+ reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+ set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+ return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+ reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+ set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+ return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+ reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+ set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+ return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+ reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+ set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+ return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+ reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+ set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+ return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+ reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+ set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+ return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+ reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+ set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+ return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+ reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+ set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_inlines.hh line 1. */
+/* Polyhedron class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_inlines.hh line 29. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+ return space_dim;
+}
+
+inline int32_t
+Polyhedron::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+ using std::min;
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return min(std::numeric_limits<dimension_type>::max() - 1,
+ min(Constraint_System::max_space_dimension(),
+ Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline Topology
+Polyhedron::topology() const {
+ // We can check either one of the two matrices.
+ // (`con_sys' is slightly better, since it is placed at offset 0.)
+ return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+ // We can check either one of the two matrices.
+ // (`con_sys' is slightly better, since it is placed at offset 0.)
+ return con_sys.is_necessarily_closed();
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+ poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+ poly_difference_assign(y);
+}
+
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+ H79_widening_assign(y, tp);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::m_swap(Polyhedron& y) {
+ if (topology() != y.topology())
+ throw_topology_incompatible("swap(y)", "y", y);
+ using std::swap;
+ swap(con_sys, y.con_sys);
+ swap(gen_sys, y.gen_sys);
+ swap(sat_c, y.sat_c);
+ swap(sat_g, y.sat_g);
+ swap(status, y.status);
+ swap(space_dim, y.space_dim);
+}
+
+/*! \relates Polyhedron */
+inline void
+swap(Polyhedron& x, Polyhedron& y) {
+ x.m_swap(y);
+}
+
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+ return true;
+}
+
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+ return false;
+}
+
+inline bool
+Polyhedron::marked_empty() const {
+ return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+ return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+ return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+ return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+ return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+ return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+ return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+ return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+ return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+ return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+ return constraints_are_minimized()
+ && generators_are_minimized()
+ && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline bool
+Polyhedron::is_empty() const {
+ if (marked_empty())
+ return true;
+ // Try a fast-fail test: if generators are up-to-date and
+ // there are no pending constraints, then the generator system
+ // (since it is well formed) contains a point.
+ if (generators_are_up_to_date() && !has_pending_constraints())
+ return false;
+ return !minimize();
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+ status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+ set_constraints_up_to_date();
+ status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+ set_generators_up_to_date();
+ status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+ status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+ status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+ status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+ status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+ status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+ status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+ status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+ status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+ status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+ status.reset_sat_c_up_to_date();
+ // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+ status.reset_sat_g_up_to_date();
+ // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+ clear_pending_constraints();
+ clear_constraints_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ status.reset_c_up_to_date();
+ // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+ clear_pending_generators();
+ clear_generators_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ status.reset_g_up_to_date();
+ // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+ PPL_ASSERT(space_dim > 0 && !marked_empty());
+ PPL_ASSERT(has_something_pending());
+
+ if (has_pending_constraints())
+ return process_pending_constraints();
+
+ PPL_ASSERT(has_pending_generators());
+ process_pending_generators();
+ return true;
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ Generator g(point());
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ Generator g(point());
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+ PPL_ASSERT(constraints_are_up_to_date());
+ Constraint_System cs(con_sys);
+ if (cs.num_pending_rows() > 0)
+ cs.unset_pending_rows();
+ if (has_pending_constraints() || !constraints_are_minimized())
+ cs.simplify();
+ return cs;
+}
+
+inline Congruence_System
+Polyhedron::congruences() const {
+ return Congruence_System(minimized_constraints());
+}
+
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+ return Congruence_System(minimized_constraints());
+}
+
+inline void
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right, false);
+ refine_with_linear_form_inequality(right, left, false);
+ break;
+ case LESS_THAN:
+ refine_with_linear_form_inequality(left, right, true);
+ break;
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right, false);
+ break;
+ case GREATER_THAN:
+ refine_with_linear_form_inequality(right, left, true);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left, false);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::
+refine_fp_interval_abstract_store(
+ Box< Interval<FP_Format, Interval_Info> >& store) const {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+ return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+ const Polyhedron& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(Complexity_Class complexity) {
+ const Variables_Set* const p_vs = 0;
+ drop_some_non_integer_points(p_vs, complexity);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ drop_some_non_integer_points(&vars, complexity);
+}
+
+
+namespace Interfaces {
+
+inline bool
+is_necessarily_closed_for_interfaces(const Polyhedron& ph) {
+ return ph.is_necessarily_closed();
+}
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 1. */
+/* Polyhedron class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 1. */
+/* MIP_Problem class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 1. */
+/* Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 31. */
+#include <ostream>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A sparse matrix of Coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Matrix {
+
+public:
+ typedef typename Swapping_Vector<Row>::iterator iterator;
+ typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+ //! Returns the maximum number of rows of a Sparse_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns of a Sparse_Matrix.
+ static dimension_type max_num_columns();
+
+ /*!
+ \brief Constructs a square matrix with the given size, filled with
+ unstored zeroes.
+
+ \param n
+ The size of the new square matrix.
+
+ This method takes \f$O(n)\f$ time.
+ */
+ explicit Matrix(dimension_type n = 0);
+
+ /*!
+ \brief Constructs a matrix with the given dimensions, filled with unstored
+ zeroes.
+
+ \param num_rows
+ The number of rows in the new matrix.
+
+ \param num_columns
+ The number of columns in the new matrix.
+
+ This method takes \f$O(n)\f$ time, where n is \p num_rows.
+ */
+ Matrix(dimension_type num_rows, dimension_type num_columns);
+
+ //! Swaps (*this) with x.
+ /*!
+
+ \param x
+ The matrix that will be swapped with *this.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ void m_swap(Matrix& x);
+
+ //! Returns the number of rows in the matrix.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_rows() const;
+
+ //! Returns the number of columns in the matrix.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ dimension_type num_columns() const;
+
+ // TODO: Check if this can be removed.
+ //! Returns the capacity of the row vector.
+ dimension_type capacity() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+ /*!
+ \note
+ The unusual naming for this method is \em intentional:
+ we do not want it to be named \c empty because this would cause
+ an error prone name clash with the corresponding methods in derived
+ classes Constraint_System and Congruence_System (which have a
+ different semantics).
+ */
+ bool has_no_rows() const;
+
+ //! Equivalent to resize(n, n).
+ void resize(dimension_type n);
+
+ // TODO: Check if this can become private.
+ //! Reserves space for at least \p n rows.
+ void reserve_rows(dimension_type n);
+
+ //! Resizes this matrix to the specified dimensions.
+ /*!
+
+ \param num_rows
+ The desired numer of rows.
+
+ \param num_columns
+ The desired numer of columns.
+
+ New rows and columns will contain non-stored zeroes.
+
+ This operation invalidates existing iterators.
+
+ Adding n rows takes \f$O(n)\f$ amortized time.
+
+ Adding n columns takes \f$O(r)\f$ time, where r is \p num_rows.
+
+ Removing n rows takes \f$O(n+k)\f$ amortized time, where k is the total
+ number of elements stored in the removed rows.
+
+ Removing n columns takes \f$O(\sum_{j=1}^{r} (k_j*\log^2 n_j))\f$ time,
+ where r is the number of rows, \f$k_j\f$ is the number of elements stored
+ in the columns of the j-th row that must be removed and \f$n_j\f$ is the
+ total number of elements stored in the j-th row.
+ A weaker (but simpler) bound is \f$O(r+k*\log^2 c)\f$, where r is the
+ number of rows, k is the number of elements that have to be removed and c
+ is the number of columns.
+ */
+ void resize(dimension_type num_rows, dimension_type num_columns);
+
+ //! Adds \p n rows and \p m columns of zeroes to the matrix.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ \param m
+ The number of columns to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times (c+m)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+
+ This method takes \f$O(r)\f$ time, where r is the number of the matrix's
+ rows after the operation.
+ */
+ void add_zero_rows_and_columns(dimension_type n, dimension_type m);
+
+ //! Adds to the matrix \p n rows of zeroes.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+
+ This method takes \f$O(k)\f$ amortized time, where k is the number of the
+ new rows.
+ */
+ void add_zero_rows(dimension_type n);
+
+ //! Adds a copy of the row \p x at the end of the matrix.
+ /*!
+
+ \param x
+ The row that will be appended to the matrix.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(n)\f$ amortized time, where n is the numer of
+ elements stored in \p x.
+ */
+ void add_row(const Row& x);
+
+ //! Adds the row \p y to the matrix.
+ /*!
+ \param y
+ The row to be added: it must have the same size and capacity as
+ \p *this. It is not declared <CODE>const</CODE> because its
+ data-structures will recycled to build the new matrix row.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\genfrac{(}{)}{0pt}{}{M}{y}\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_recycled_row(Row& y);
+
+ /*! \brief
+ Removes from the matrix the last \p n rows.
+
+ \param n
+ The number of row that will be removed.
+
+ It is equivalent to num_rows() - n, num_columns()).
+
+ This method takes \f$O(n+k)\f$ amortized time, where k is the total number
+ of elements stored in the removed rows and n is the number of removed
+ rows.
+ */
+ void remove_trailing_rows(dimension_type n);
+
+ void remove_rows(iterator first, iterator last);
+
+ //! Permutes the columns of the matrix.
+ /*!
+ This method may be slow for some Row types, and should be avoided if
+ possible.
+
+ \param cycles
+ A vector representing the non-trivial cycles of the permutation
+ according to which the columns must be rearranged.
+
+ The \p cycles vector contains, one after the other, the
+ non-trivial cycles (i.e., the cycles of length greater than one)
+ of a permutation of \e non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 7
+ columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+ 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+ represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+ turn can be represented by a vector of 6 elements containing 1, 3,
+ 6, 0, 2, 4, 0.
+
+ This method takes \f$O(k*\sum_{j=1}^{r} \log^2 n_j)\f$ expected time,
+ where k is the size of the \p cycles vector, r the number of rows and
+ \f$n_j\f$ the number of elements stored in row j.
+ A weaker (but simpler) bound is \f$O(k*r*\log^2 c)\f$, where k is the size
+ of the \p cycles vector, r is the number of rows and c is the number of
+ columns.
+
+ \note
+ The first column of the matrix, having index zero, is never involved
+ in a permutation.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_columns(dimension_type i, dimension_type j);
+
+ //! Adds \p n columns of zeroes to the matrix.
+ /*!
+ \param n
+ The number of columns to be added: must be strictly positive.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+
+ This method takes \f$O(r)\f$ amortized time, where r is the numer of the
+ matrix's rows.
+ */
+ void add_zero_columns(dimension_type n);
+
+ //! Adds \p n columns of non-stored zeroes to the matrix before column i.
+ /*!
+
+ \param n
+ The numer of columns that will be added.
+
+ \param i
+ The index of the column before which the new columns will be added.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\sum_{j=1}^{r} (k_j+\log n_j))\f$ time, where r is
+ the number of rows, \f$k_j\f$ is the number of elements stored in the
+ columns of the j-th row that must be shifted and \f$n_j\f$ is the number
+ of elements stored in the j-th row.
+ A weaker (but simpler) bound is \f$O(k+r*\log c)\f$ time, where k is the
+ number of elements that must be shifted, r is the number of the rows and c
+ is the number of the columns.
+ */
+ void add_zero_columns(dimension_type n, dimension_type i);
+
+ //! Removes the i-th from the matrix, shifting other columns to the left.
+ /*!
+
+ \param i
+ The index of the column that will be removed.
+
+ This operation invalidates existing iterators on rows' elements.
+
+ This method takes \f$O(k + \sum_{j=1}^{r} (\log^2 n_j))\f$ amortized time,
+ where k is the number of elements stored with column index greater than i,
+ r the number of rows in this matrix and \f$n_j\f$ the number of elements
+ stored in row j.
+ A weaker (but simpler) bound is \f$O(r*(c-i+\log^2 c))\f$, where r is the
+ number of rows, c is the number of columns and i is the parameter passed
+ to this method.
+ */
+ void remove_column(dimension_type i);
+
+ //! Shrinks the matrix by removing its \p n trailing columns.
+ /*!
+
+ \param n
+ The number of trailing columns that will be removed.
+
+ This operation invalidates existing iterators.
+
+ This method takes \f$O(\sum_{j=1}^r (k_j*\log n_j))\f$ amortized time,
+ where r is the number of rows, \f$k_j\f$ is the number of elements that
+ have to be removed from row j and \f$n_j\f$ is the total number of
+ elements stored in row j.
+ A weaker (but simpler) bound is \f$O(r*n*\log c)\f$, where r is the number
+ of rows, c the number of columns and n the parameter passed to this
+ method.
+ */
+ void remove_trailing_columns(dimension_type n);
+
+ //! Equivalent to resize(0,0).
+ void clear();
+
+ //! Returns an %iterator pointing to the first row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator begin();
+
+ //! Returns an %iterator pointing after the last row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ iterator end();
+
+ //! Returns an %iterator pointing to the first row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator begin() const;
+
+ //! Returns an %iterator pointing after the last row.
+ /*!
+ This method takes \f$O(1)\f$ time.
+ */
+ const_iterator end() const;
+
+ //! Returns a reference to the i-th row.
+ /*!
+ \param i
+ The index of the desired row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ Row& operator[](dimension_type i);
+
+ //! Returns a const reference to the i-th row.
+ /*!
+ \param i
+ The index of the desired row.
+
+ This method takes \f$O(1)\f$ time.
+ */
+ const Row& operator[](dimension_type i) const;
+
+ //! Loads the row from an ASCII representation generated using ascii_dump().
+ /*!
+ \param s
+ The stream from which read the ASCII representation.
+
+ This method takes \f$O(n*\log n)\f$ time.
+ */
+ bool ascii_load(std::istream& s);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ /*!
+ This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+ number of elements stored in the matrix.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+ number of elements stored in the matrix.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The vector that stores the matrix's elements.
+ Swapping_Vector<Row> rows;
+
+ //! The number of columns in this matrix.
+ dimension_type num_columns_;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Matrix<Row>& x, Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Matrix<Row>& x, const Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Matrix<Row>& x, const Matrix<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Matrix_inlines.hh line 1. */
+/* Matrix class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_rows() {
+ return std::vector<Row>().max_size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_columns() {
+ return Row::max_size();
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::m_swap(Matrix& x) {
+ using std::swap;
+ swap(rows, x.rows);
+ swap(num_columns_, x.num_columns_);
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_rows() const {
+ return rows.size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_columns() const {
+ return num_columns_;
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::capacity() const {
+ return rows.capacity();
+}
+
+template <typename Row>
+inline bool
+Matrix<Row>::has_no_rows() const {
+ return num_rows() == 0;
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::resize(dimension_type n) {
+ resize(n, n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::reserve_rows(dimension_type requested_capacity) {
+
+ rows.reserve(requested_capacity);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows_and_columns(dimension_type n, dimension_type m) {
+ resize(num_rows() + n, num_columns() + m);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows(dimension_type n) {
+ resize(num_rows() + n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_row(const Row& x) {
+ // TODO: Optimize this.
+ Row row(x);
+ add_zero_rows(1);
+ // Now x may have been invalidated, if it was a row of this matrix.
+ swap(rows.back(), row);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_recycled_row(Row& x) {
+ add_zero_rows(1);
+ swap(rows.back(), x);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_rows(dimension_type n) {
+ resize(num_rows() - n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_rows(iterator first, iterator last) {
+ rows.erase(first, last);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_columns(dimension_type n) {
+ resize(num_rows(), num_columns() + n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_columns(dimension_type n) {
+ PPL_ASSERT(n <= num_columns());
+ resize(num_rows(), num_columns() - n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::clear() {
+ resize(0, 0);
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::begin() {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::end() {
+ return rows.end();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::begin() const {
+ return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::end() const {
+ return rows.end();
+}
+
+template <typename Row>
+inline Row&
+Matrix<Row>::operator[](dimension_type i) {
+ PPL_ASSERT(i < rows.size());
+ return rows[i];
+}
+
+template <typename Row>
+inline const Row&
+Matrix<Row>::operator[](dimension_type i) const {
+ PPL_ASSERT(i < rows.size());
+ return rows[i];
+}
+
+template <typename Row>
+inline memory_size_type
+Matrix<Row>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline void
+swap(Matrix<Row>& x, Matrix<Row>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_templates.hh line 1. */
+/* Matrix class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type n)
+ : rows(n), num_columns_(n) {
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].resize(num_columns_);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type num_rows, dimension_type num_columns)
+ : rows(num_rows), num_columns_(num_columns) {
+ for (dimension_type i = 0; i < rows.size(); ++i)
+ rows[i].resize(num_columns_);
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::resize(dimension_type num_rows, dimension_type num_columns) {
+ const dimension_type old_num_rows = rows.size();
+ rows.resize(num_rows);
+ if (old_num_rows < num_rows) {
+ for (dimension_type i = old_num_rows; i < num_rows; ++i)
+ rows[i].resize(num_columns);
+ if (num_columns_ != num_columns) {
+ num_columns_ = num_columns;
+ for (dimension_type i = 0; i < old_num_rows; ++i)
+ rows[i].resize(num_columns);
+ }
+ }
+ else
+ if (num_columns_ != num_columns) {
+ num_columns_ = num_columns;
+ for (dimension_type i = 0; i < num_rows; ++i)
+ rows[i].resize(num_columns);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::permute_columns(const std::vector<dimension_type>& cycles) {
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ const dimension_type n = cycles.size();
+ PPL_ASSERT(cycles[n - 1] == 0);
+ for (dimension_type k = num_rows(); k-- > 0; ) {
+ Row& rows_k = (*this)[k];
+ for (dimension_type i = 0, j = 0; i < n; i = ++j) {
+ // Make `j' be the index of the next cycle terminator.
+ while (cycles[j] != 0)
+ ++j;
+ // Cycles of length less than 2 are not allowed.
+ PPL_ASSERT(j - i >= 2);
+ if (j - i == 2)
+ // For cycles of length 2 no temporary is needed, just a swap.
+ rows_k.swap_coefficients(cycles[i], cycles[i + 1]);
+ else {
+ // Longer cycles need a temporary.
+ tmp = rows_k.get(cycles[j - 1]);
+ for (dimension_type l = (j - 1); l > i; --l)
+ rows_k.swap_coefficients(cycles[l-1], cycles[l]);
+ if (tmp == 0)
+ rows_k.reset(cycles[i]);
+ else {
+ using std::swap;
+ swap(tmp, rows_k[cycles[i]]);
+ }
+ }
+ }
+ }
+}
+
+template <typename Row>
+void
+Matrix<Row>::swap_columns(dimension_type i, dimension_type j) {
+ for (dimension_type k = num_rows(); k-- > 0; )
+ (*this)[k].swap_coefficients(i, j);
+}
+
+template <typename Row>
+void
+Matrix<Row>::add_zero_columns(dimension_type n, dimension_type i) {
+ for (dimension_type j = rows.size(); j-- > 0; )
+ rows[j].add_zeroes_and_shift(n, i);
+ num_columns_ += n;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::remove_column(dimension_type i) {
+ for (dimension_type j = rows.size(); j-- > 0; )
+ rows[j].delete_element_and_shift(i);
+ --num_columns_;
+ PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::ascii_dump(std::ostream& s) const {
+ s << num_rows() << " x ";
+ s << num_columns() << "\n";
+ for (const_iterator i = begin(), i_end = end(); i !=i_end; ++i)
+ i->ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Matrix<Row>)
+
+template <typename Row>
+bool
+Matrix<Row>::ascii_load(std::istream& s) {
+ std::string str;
+ dimension_type new_num_rows;
+ dimension_type new_num_cols;
+ if (!(s >> new_num_rows))
+ return false;
+ if (!(s >> str) || str != "x")
+ return false;
+ if (!(s >> new_num_cols))
+ return false;
+
+ for (iterator i = rows.begin(), i_end = rows.end(); i != i_end; ++i)
+ i->clear();
+
+ resize(new_num_rows, new_num_cols);
+
+ for (dimension_type row = 0; row < new_num_rows; ++row)
+ if (!rows[row].ascii_load(s))
+ return false;
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename Row>
+memory_size_type
+Matrix<Row>::external_memory_in_bytes() const {
+ return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+bool
+Matrix<Row>::OK() const {
+ for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+ if (i->size() != num_columns_)
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator==(const Matrix<Row>& x, const Matrix<Row>& y) {
+ if (x.num_rows() != y.num_rows())
+ return false;
+ if (x.num_columns() != y.num_columns())
+ return false;
+ for (dimension_type i = x.num_rows(); i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator!=(const Matrix<Row>& x, const Matrix<Row>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 436. */
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 37. */
+#include <vector>
+#include <deque>
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& mip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates MIP_Problem */
+void swap(MIP_Problem& x, MIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+ An object of this class encodes a mixed integer (linear) programming
+ problem.
+ The MIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the feasible region, by means of a finite set of linear equality
+ and non-strict inequality constraints;
+ - the subset of the unknown variables that range over the integers
+ (the other variables implicitly ranging over the reals);
+ - the objective function, described by a Linear_Expression;
+ - the optimization mode (either maximization or minimization).
+
+ The class provides support for the (incremental) solution of the
+ MIP problem based on variations of the revised simplex method and
+ on branch-and-bound techniques. The result of the resolution
+ process is expressed in terms of an enumeration, encoding the
+ feasibility and the unboundedness of the optimization problem.
+ The class supports simple feasibility tests (i.e., no optimization),
+ as well as the extraction of an optimal (resp., feasible) point,
+ provided the MIP_Problem is optimizable (resp., feasible).
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given MIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of constraints,
+ the change of objective function and the change of optimization mode.
+*/
+class Parma_Polyhedra_Library::MIP_Problem {
+public:
+ //! Builds a trivial MIP problem.
+ /*!
+ A trivial MIP problem requires to maximize the objective function
+ \f$0\f$ on a vector space under no constraints at all:
+ the origin of the vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this
+ (optional argument with default value \f$0\f$).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ explicit MIP_Problem(dimension_type dim = 0);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$,
+ the objective function \p obj and optimization mode \p mode;
+ those dimensions whose indices occur in \p int_vars are
+ constrained to take an integer value.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param int_vars
+ The set of variables' indexes that are constrained to take integer values.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if a constraint in the sequence is a strict inequality,
+ if the space dimension of a constraint (resp., of the
+ objective function or of the integer variables) or the space dimension
+ of the integer variable set is strictly greater than \p dim.
+ */
+ template <typename In>
+ MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Variables_Set& int_vars,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$,
+ the objective function \p obj and optimization mode \p mode.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if a constraint in the sequence is a strict inequality
+ or if the space dimension of a constraint (resp., of the
+ objective function or of the integer variables) is strictly
+ greater than \p dim.
+ */
+ template <typename In>
+ MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ /*! \brief
+ Builds an MIP problem having space dimension \p dim from the constraint
+ system \p cs, the objective function \p obj and optimization mode \p mode.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this.
+
+ \param cs
+ The constraint system defining the feasible region.
+
+ \param obj
+ The objective function (optional argument with default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system contains any strict inequality
+ or if the space dimension of the constraint system (resp., the
+ objective function) is strictly greater than \p dim.
+ */
+ MIP_Problem(dimension_type dim,
+ const Constraint_System& cs,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ //! Ordinary copy constructor.
+ MIP_Problem(const MIP_Problem& y);
+
+ //! Destructor.
+ ~MIP_Problem();
+
+ //! Assignment operator.
+ MIP_Problem& operator=(const MIP_Problem& y);
+
+ //! Returns the maximum space dimension an MIP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the MIP problem.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a set containing all the variables' indexes constrained
+ to be integral.
+ */
+ const Variables_Set& integer_space_dimensions() const;
+
+private:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint*> Constraint_Sequence;
+
+public:
+ //! A read-only iterator on the constraints defining the feasible region.
+ class const_iterator {
+ private:
+ typedef Constraint_Sequence::const_iterator Base;
+ typedef std::iterator_traits<Base> Base_Traits;
+ public:
+ typedef Base_Traits::iterator_category iterator_category;
+ typedef Base_Traits::difference_type difference_type;
+ typedef const Constraint value_type;
+ typedef const Constraint* pointer;
+ typedef const Constraint& reference;
+
+ //! Iterator difference: computes distances.
+ difference_type operator-(const const_iterator& y) const;
+
+ //! Prefix increment.
+ const_iterator& operator++();
+
+ //! Prefix decrement.
+ const_iterator& operator--();
+
+ //! Postfix increment.
+ const_iterator operator++(int);
+
+ //! Postfix decrement.
+ const_iterator operator--(int);
+
+ //! Moves iterator forward of \p n positions.
+ const_iterator& operator+=(difference_type n);
+
+ //! Moves iterator backward of \p n positions.
+ const_iterator& operator-=(difference_type n);
+
+ //! Returns an iterator \p n positions forward.
+ const_iterator operator+(difference_type n) const;
+
+ //! Returns an iterator \p n positions backward.
+ const_iterator operator-(difference_type n) const;
+
+ //! Returns a reference to the "pointed" object.
+ reference operator*() const;
+
+ //! Returns the address of the "pointed" object.
+ pointer operator->() const;
+
+ //! Compares \p *this with y.
+ /*!
+ \param y
+ The %iterator that will be compared with *this.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ //! Compares \p *this with y.
+ /*!
+ \param y
+ The %iterator that will be compared with *this.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ //! Constructor from a Base iterator.
+ explicit const_iterator(Base base);
+
+ //! The Base iterator on the Constraint_Sequence.
+ Base itr;
+
+ friend class MIP_Problem;
+ };
+
+ /*! \brief
+ Returns a read-only iterator to the first constraint defining
+ the feasible region.
+ */
+ const_iterator constraints_begin() const;
+
+ /*! \brief
+ Returns a past-the-end read-only iterator to the sequence of
+ constraints defining the feasible region.
+ */
+ const_iterator constraints_end() const;
+
+ //! Returns the objective function.
+ const Linear_Expression& objective_function() const;
+
+ //! Returns the optimization mode.
+ Optimization_Mode optimization_mode() const;
+
+ //! Resets \p *this to be equal to the trivial MIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ void clear();
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the old MIP problem
+ in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new MIP problem; they are initially unconstrained.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Sets the variables whose indexes are in set \p i_vars to be
+ integer space dimensions.
+
+ \exception std::invalid_argument
+ Thrown if some index in \p i_vars does not correspond to
+ a space dimension in \p *this.
+ */
+ void add_to_integer_space_dimensions(const Variables_Set& i_vars);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the MIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the constraint \p c is a strict inequality or if its space
+ dimension is strictly greater than the space dimension of \p *this.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the MIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains any strict inequality
+ or if its space dimension is strictly greater than the space dimension
+ of \p *this.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ //! Sets the objective function to \p obj.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the space dimension of \p obj is strictly greater than
+ the space dimension of \p *this.
+ */
+ void set_objective_function(const Linear_Expression& obj);
+
+ //! Sets the optimization mode to \p mode.
+ void set_optimization_mode(Optimization_Mode mode);
+
+ //! Checks satisfiability of \p *this.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the MIP problem.
+ /*!
+ \return
+ An MIP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible, unbounded or optimized problem).
+ */
+ MIP_Problem_Status solve() const;
+
+ /*! \brief
+ Sets \p num and \p denom so that
+ \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the result of
+ evaluating the objective function on \p evaluating_point.
+
+ \param evaluating_point
+ The point on which the objective function will be evaluated.
+
+ \param numer
+ On exit will contain the numerator of the evaluated value.
+
+ \param denom
+ On exit will contain the denominator of the evaluated value.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p evaluating_point are dimension-incompatible
+ or if the generator \p evaluating_point is not a point.
+ */
+ void evaluate_objective_function(const Generator& evaluating_point,
+ Coefficient& numer,
+ Coefficient& denom) const;
+
+ //! Returns a feasible point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if the MIP problem is not satisfiable.
+ */
+ const Generator& feasible_point() const;
+
+ //! Returns an optimal point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if \p *this does not not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ const Generator& optimizing_point() const;
+
+ /*! \brief
+ Sets \p numer and \p denom so that
+ \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the solution of the
+ optimization problem.
+
+ \exception std::domain_error
+ Thrown if \p *this does not not have an optimizing point, i.e.,
+ if the MIP problem is unbounded or not satisfiable.
+ */
+ void optimal_value(Coefficient& numer, Coefficient& denom) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(MIP_Problem& y);
+
+ //! Names of MIP problems' control parameters.
+ enum Control_Parameter_Name {
+ //! The pricing rule.
+ PRICING
+ };
+
+ //! Possible values for MIP problem's control parameters.
+ enum Control_Parameter_Value {
+ //! Steepest edge pricing method, using floating points (default).
+ PRICING_STEEPEST_EDGE_FLOAT,
+ //! Steepest edge pricing method, using Coefficient.
+ PRICING_STEEPEST_EDGE_EXACT,
+ //! Textbook pricing method.
+ PRICING_TEXTBOOK
+ };
+
+ //! Returns the value of the control parameter \p name.
+ Control_Parameter_Value
+ get_control_parameter(Control_Parameter_Name name) const;
+
+ //! Sets control parameter \p value.
+ void set_control_parameter(Control_Parameter_Value value);
+
+private:
+ //! The dimension of the vector space.
+ dimension_type external_space_dim;
+
+ /*! \brief
+ The space dimension of the current (partial) solution of the
+ MIP problem; it may be smaller than \p external_space_dim.
+ */
+ dimension_type internal_space_dim;
+
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ //! The matrix encoding the current feasible region in tableau form.
+ Matrix<Row> tableau;
+
+ typedef Row working_cost_type;
+
+ //! The working cost function.
+ working_cost_type working_cost;
+
+ //! A map between the variables of `input_cs' and `tableau'.
+ /*!
+ Contains all the pairs (i, j) such that mapping[i].first encodes the index
+ of the column in the tableau where input_cs[i] is stored; if
+ mapping[i].second is not a zero, it encodes the split part of the tableau
+ of input_cs[i].
+ The "positive" one is represented by mapping[i].first and the "negative"
+ one is represented by mapping[i].second.
+ */
+ std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+ //! The current basic solution.
+ std::vector<dimension_type> base;
+
+ //! An enumerated type describing the internal status of the MIP problem.
+ enum Status {
+ //! The MIP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The MIP problem is satisfiable; a feasible solution has been computed.
+ SATISFIABLE,
+ //! The MIP problem is unbounded; a feasible solution has been computed.
+ UNBOUNDED,
+ //! The MIP problem is optimized; an optimal solution has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the MIP problem has been changed by adding
+ new space dimensions or new constraints; a feasible solution for
+ the old feasible region is still available.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the MIP problem.
+ Status status;
+
+ // TODO: merge `status', `initialized', `pricing' and (maybe) `opt_mode'
+ // into a single bitset status word, so as to save space and allow
+ // for other control parameters.
+
+ //! The pricing method in use.
+ Control_Parameter_Value pricing;
+
+ /*! \brief
+ A Boolean encoding whether or not internal data structures have
+ already been properly sized and populated: useful to allow for
+ deeper checks in method OK().
+ */
+ bool initialized;
+
+ //! The sequence of constraints describing the feasible region.
+ std::vector<Constraint*> input_cs;
+
+ /*! \brief
+ The number of constraints that are inherited from our parent
+ in the recursion tree built when solving via branch-and-bound.
+
+ The first \c inherited_constraints elements in \c input_cs point to
+ the inherited constraints, whose resources are owned by our ancestors.
+ The resources of the other elements in \c input_cs are owned by \c *this
+ and should be appropriately released on destruction.
+ */
+ dimension_type inherited_constraints;
+
+ //! The first index of `input_cs' containing a pending constraint.
+ dimension_type first_pending_constraint;
+
+ //! The objective function to be optimized.
+ Linear_Expression input_obj_function;
+
+ //! The optimization mode requested.
+ Optimization_Mode opt_mode;
+
+ //! The last successfully computed feasible or optimizing point.
+ Generator last_generator;
+
+ /*! \brief
+ A set containing all the indexes of variables that are constrained
+ to have an integer value.
+ */
+ Variables_Set i_variables;
+
+ //! A helper class to temporarily relax a MIP problem using RAII.
+ struct RAII_Temporary_Real_Relaxation {
+ MIP_Problem& lp;
+ Variables_Set i_vars;
+
+ RAII_Temporary_Real_Relaxation(MIP_Problem& mip)
+ : lp(mip), i_vars() {
+ // Turn mip into an LP problem (saving i_variables in i_vars).
+ using std::swap;
+ swap(i_vars, lp.i_variables);
+ }
+
+ ~RAII_Temporary_Real_Relaxation() {
+ // Restore the original set of integer variables.
+ using std::swap;
+ swap(i_vars, lp.i_variables);
+ }
+ };
+ friend struct RAII_Temporary_Real_Relaxation;
+
+ //! A tag type to distinguish normal vs. inheriting copy constructor.
+ struct Inherit_Constraints {};
+
+ //! Copy constructor inheriting constraints.
+ MIP_Problem(const MIP_Problem& y, Inherit_Constraints);
+
+ //! Helper method: implements exception safe addition.
+ void add_constraint_helper(const Constraint& c);
+
+ //! Processes the pending constraints of \p *this.
+ void process_pending_constraints();
+
+ /*! \brief
+ Optimizes the MIP problem using the second phase of the
+ primal simplex algorithm.
+ */
+ void second_phase();
+
+ /*! \brief
+ Assigns to \p this->tableau a simplex tableau representing the
+ MIP problem, inserting into \p this->mapping the information
+ that is required to recover the original MIP problem.
+
+ \return
+ <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+ any trivially unfeasible constraint (tableau was not computed);
+ <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+ (the computed tableau contains no constraints);
+ <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+ unfeasible nor trivially unbounded (the tableau was computed
+ successfully).
+ */
+ MIP_Problem_Status
+ compute_tableau(std::vector<dimension_type>& worked_out_row);
+
+ /*! \brief
+ Parses the pending constraints to gather information on
+ how to resize the tableau.
+
+ \note
+ All of the method parameters are output parameters; their value
+ is only meaningful when the function exit returning value \c true.
+
+ \return
+ \c false if a trivially false constraint is detected, \c true otherwise.
+
+ \param additional_tableau_rows
+ On exit, this will store the number of rows that have to be added
+ to the original tableau.
+
+ \param additional_slack_variables
+ This will store the number of slack variables that have to be added
+ to the original tableau.
+
+ \param is_tableau_constraint
+ This container of Boolean flags is initially empty. On exit, it size
+ will be equal to the number of pending constraints in \c input_cs.
+ For each pending constraint index \c i, the corresponding element
+ of this container (having index <CODE>i - first_pending_constraint</CODE>)
+ will be set to \c true if and only if the constraint has to be included
+ in the tableau.
+
+ \param is_satisfied_inequality
+ This container of Boolean flags is initially empty. On exit, its size
+ will be equal to the number of pending constraints in \c input_cs.
+ For each pending constraint index \c i, the corresponding element
+ of this container (having index <CODE>i - first_pending_constraint</CODE>)
+ will be set to \c true if and only if it is an inequality and it
+ is already satisfied by \c last_generator (hence it does not require
+ the introduction of an artificial variable).
+
+ \param is_nonnegative_variable
+ This container of Boolean flags is initially empty.
+ On exit, it size is equal to \c external_space_dim.
+ For each variable (index), the corresponding element of this container
+ is \c true if the variable is known to be nonnegative (and hence should
+ not be split into a positive and a negative part).
+
+ \param is_remergeable_variable
+ This container of Boolean flags is initially empty.
+ On exit, it size is equal to \c internal_space_dim.
+ For each variable (index), the corresponding element of this container
+ is \c true if the variable was previously split into positive and
+ negative parts that can now be merged back, since it is known
+ that the variable is nonnegative.
+ */
+ bool parse_constraints(dimension_type& additional_tableau_rows,
+ dimension_type& additional_slack_variables,
+ std::deque<bool>& is_tableau_constraint,
+ std::deque<bool>& is_satisfied_inequality,
+ std::deque<bool>& is_nonnegative_variable,
+ std::deque<bool>& is_remergeable_variable) const;
+
+ /*! \brief
+ Computes the row index of the variable exiting the base
+ of the MIP problem. Implemented with anti-cycling rule.
+
+ \return
+ The row index of the variable exiting the base.
+
+ \param entering_var_index
+ The column index of the variable entering the base.
+ */
+ dimension_type
+ get_exiting_base_index(dimension_type entering_var_index) const;
+
+ //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param x
+ The row that will be combined with \p y object.
+
+ \param y
+ The row that will be combined with \p x object.
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p x and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Row to \p x and normalizes it.
+ */
+ static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+ // TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+ //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param x
+ The row that will be combined with \p y object.
+
+ \param y
+ The row that will be combined with \p x object.
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p x and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Dense_Row to \p x and normalizes it.
+ */
+ static void linear_combine(Dense_Row& x, const Sparse_Row& y,
+ const dimension_type k);
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+ static bool is_unbounded_obj_function(
+ const Linear_Expression& obj_function,
+ const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+ Optimization_Mode optimization_mode);
+
+ /*! \brief
+ Performs the pivoting operation on the tableau.
+
+ \param entering_var_index
+ The index of the variable entering the base.
+
+ \param exiting_base_index
+ The index of the row exiting the base.
+ */
+ void pivot(dimension_type entering_var_index,
+ dimension_type exiting_base_index);
+
+ /*! \brief
+ Computes the column index of the variable entering the base,
+ using the textbook algorithm with anti-cycling rule.
+
+ \return
+ The column index of the variable that enters the base.
+ If no such variable exists, optimality was achieved
+ and <CODE>0</CODE> is returned.
+ */
+ dimension_type textbook_entering_index() const;
+
+ /*! \brief
+ Computes the column index of the variable entering the base,
+ using an exact steepest-edge algorithm with anti-cycling rule.
+
+ \return
+ The column index of the variable that enters the base.
+ If no such variable exists, optimality was achieved
+ and <CODE>0</CODE> is returned.
+
+ To compute the entering_index, the steepest edge algorithm chooses
+ the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+ largest in absolute value, where
+ \f[
+ \|\Delta x^{j} \|
+ = \left(
+ 1+\sum_{i=1}^{m} \alpha_{ij}^2
+ \right)^{\frac{1}{2}}.
+ \f]
+ Recall that, due to the exact integer implementation of the algorithm,
+ our tableau does not contain the ``real'' \f$\alpha\f$ values, but these
+ can be computed dividing the value of the coefficient by the value of
+ the variable in base. Obviously the result may not be an integer, so
+ we will proceed in another way: we compute the lcm of all the variables
+ in base to get the good ``weight'' of each Coefficient of the tableau.
+ */
+ dimension_type steepest_edge_exact_entering_index() const;
+
+ /*! \brief
+ Same as steepest_edge_exact_entering_index,
+ but using floating points.
+
+ \note
+ Due to rounding errors, the index of the variable entering the base
+ of the MIP problem is not predictable across different architectures.
+ Hence, the overall simplex computation may differ in the path taken
+ to reach the optimum. Anyway, the exact final result will be computed
+ for the MIP_Problem.
+ */
+ dimension_type steepest_edge_float_entering_index() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+
+ \note
+ Uses an exact pricing method (either textbook or exact steepest edge),
+ so that the result is deterministic across different architectures.
+ */
+ bool compute_simplex_using_exact_pricing();
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+
+ \note
+ Uses a floating point implementation of the steepest edge pricing
+ method, so that the result is correct, but not deterministic across
+ different architectures.
+ */
+ bool compute_simplex_using_steepest_edge_float();
+
+ /*! \brief
+ Drop unnecessary artificial variables from the tableau and get ready
+ for the second phase of the simplex algorithm.
+
+ \note
+ The two parameters denote a STL-like half-open range.
+ It is assumed that \p begin_artificials is strictly greater than 0
+ and smaller than \p end_artificials.
+
+ \param begin_artificials
+ The start of the tableau column index range for artificial variables.
+
+ \param end_artificials
+ The end of the tableau column index range for artificial variables.
+ Note that column index end_artificial is \e excluded from the range.
+ */
+ void erase_artificials(dimension_type begin_artificials,
+ dimension_type end_artificials);
+
+ bool is_in_base(dimension_type var_index,
+ dimension_type& row_index) const;
+
+ /*! \brief
+ Computes a valid generator that satisfies all the constraints of the
+ Linear Programming problem associated to \p *this.
+ */
+ void compute_generator() const;
+
+ /*! \brief
+ Merges back the positive and negative part of a (previously split)
+ variable after detecting a corresponding nonnegativity constraint.
+
+ \return
+ If the negative part of \p var_index was in base, the index of
+ the corresponding tableau row (which has become non-feasible);
+ otherwise \c not_a_dimension().
+
+ \param var_index
+ The index of the variable that has to be merged.
+ */
+ dimension_type merge_split_variable(dimension_type var_index);
+
+ //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+ static bool is_satisfied(const Constraint& c, const Generator& g);
+
+ //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+ static bool is_saturated(const Constraint& c, const Generator& g);
+
+ /*! \brief
+ Returns a status that encodes the solution of the MIP problem.
+
+ \param have_incumbent_solution
+ It is used to store if the solving process has found a provisional
+ optimum point.
+
+ \param incumbent_solution_value
+ Encodes the evaluated value of the provisional optimum point found.
+
+ \param incumbent_solution_point
+ If the method returns `OPTIMIZED', this will contain the optimality point.
+
+ \param mip
+ The problem that has to be solved.
+
+ \param i_vars
+ The variables that are constrained to take an integer value.
+ */
+ static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+ mpq_class& incumbent_solution_value,
+ Generator& incumbent_solution_point,
+ MIP_Problem& mip,
+ const Variables_Set& i_vars);
+
+ /*! \brief
+ Returns \c true if and if only the LP problem is satisfiable.
+ */
+ bool is_lp_satisfiable() const;
+
+ /*! \brief
+ Returns \c true if and if only the MIP problem \p mip is satisfiable
+ when variables in \p i_vars can only take integral values.
+
+ \param mip
+ The MIP problem. This is assumed to have no integral space dimension
+ (so that it is a pure LP problem).
+
+ \param i_vars
+ The variables that are constrained to take integral values.
+
+ \param p
+ If \c true is returned, it will encode a feasible point.
+ */
+ static bool is_mip_satisfiable(MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ Generator& p);
+
+ /*! \brief
+ Returns \c true if and if only \c mip.last_generator satisfies all the
+ integrality conditions implicitly stated using by \p i_vars.
+
+ \param mip
+ The MIP problem. This is assumed to have no integral space dimension
+ (so that it is a pure LP problem).
+
+ \param i_vars
+ The variables that are constrained to take an integer value.
+
+ \param branching_index
+ If \c false is returned, this will encode the non-integral variable
+ index on which the `branch and bound' algorithm should be applied.
+ */
+ static bool choose_branching_variable(const MIP_Problem& mip,
+ const Variables_Set& i_vars,
+ dimension_type& branching_index);
+};
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_inlines.hh line 1. */
+/* MIP_Problem class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+ return Constraint::max_space_dimension();
+}
+
+inline dimension_type
+MIP_Problem::space_dimension() const {
+ return external_space_dim;
+}
+
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+ : external_space_dim(y.external_space_dim),
+ internal_space_dim(y.internal_space_dim),
+ tableau(y.tableau),
+ working_cost(y.working_cost),
+ mapping(y.mapping),
+ base(y.base),
+ status(y.status),
+ pricing(y.pricing),
+ initialized(y.initialized),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(),
+ input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode),
+ last_generator(y.last_generator),
+ i_variables(y.i_variables) {
+ input_cs.reserve(y.input_cs.size());
+ for (Constraint_Sequence::const_iterator i = y.input_cs.begin(),
+ i_end = y.input_cs.end(); i != i_end; ++i)
+ add_constraint_helper(*(*i));
+ PPL_ASSERT(OK());
+}
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y, Inherit_Constraints)
+ : external_space_dim(y.external_space_dim),
+ internal_space_dim(y.internal_space_dim),
+ tableau(y.tableau),
+ working_cost(y.working_cost),
+ mapping(y.mapping),
+ base(y.base),
+ status(y.status),
+ pricing(y.pricing),
+ initialized(y.initialized),
+ input_cs(y.input_cs),
+ // NOTE: The constraints are inherited, NOT copied!
+ inherited_constraints(y.input_cs.size()),
+ first_pending_constraint(y.first_pending_constraint),
+ input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode),
+ last_generator(y.last_generator),
+ i_variables(y.i_variables) {
+ PPL_ASSERT(OK());
+}
+
+inline void
+MIP_Problem::add_constraint_helper(const Constraint& c) {
+ // For exception safety, reserve space for the new element.
+ const dimension_type size = input_cs.size();
+ if (size == input_cs.capacity()) {
+ const dimension_type max_size = input_cs.max_size();
+ if (size == max_size)
+ throw std::length_error("MIP_Problem::add_constraint(): "
+ "too many constraints");
+ // Use an exponential grow policy to avoid too many reallocations.
+ input_cs.reserve(compute_capacity(size + 1, max_size));
+ }
+
+ // This operation does not throw, because the space for the new element
+ // has already been reserved: hence the new-ed Constraint is safe.
+ input_cs.push_back(new Constraint(c));
+}
+
+inline
+MIP_Problem::~MIP_Problem() {
+ // NOTE: do NOT delete inherited constraints; they are owned
+ // (and will eventually be deleted) by ancestors.
+ for (Constraint_Sequence::const_iterator
+ i = nth_iter(input_cs, inherited_constraints),
+ i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+}
+
+
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+ if (opt_mode != mode) {
+ opt_mode = mode;
+ if (status == UNBOUNDED || status == OPTIMIZED)
+ status = SATISFIABLE;
+ PPL_ASSERT(OK());
+ }
+}
+
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+ return input_obj_function;
+}
+
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+ return opt_mode;
+}
+
+inline void
+MIP_Problem::optimal_value(Coefficient& numer, Coefficient& denom) const {
+ const Generator& g = optimizing_point();
+ evaluate_objective_function(g, numer, denom);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+ return const_iterator(input_cs.begin());
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+ return const_iterator(input_cs.end());
+}
+
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+ return i_variables;
+}
+
+inline MIP_Problem::Control_Parameter_Value
+MIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+ PPL_USED(name);
+ PPL_ASSERT(name == PRICING);
+ return pricing;
+}
+
+inline void
+MIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+ pricing = value;
+}
+
+inline void
+MIP_Problem::m_swap(MIP_Problem& y) {
+ using std::swap;
+ swap(external_space_dim, y.external_space_dim);
+ swap(internal_space_dim, y.internal_space_dim);
+ swap(tableau, y.tableau);
+ swap(working_cost, y.working_cost);
+ swap(mapping, y.mapping);
+ swap(initialized, y.initialized);
+ swap(base, y.base);
+ swap(status, y.status);
+ swap(pricing, y.pricing);
+ swap(input_cs, y.input_cs);
+ swap(inherited_constraints, y.inherited_constraints);
+ swap(first_pending_constraint, y.first_pending_constraint);
+ swap(input_obj_function, y.input_obj_function);
+ swap(opt_mode, y.opt_mode);
+ swap(last_generator, y.last_generator);
+ swap(i_variables, y.i_variables);
+}
+
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+ MIP_Problem tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+inline void
+MIP_Problem::clear() {
+ MIP_Problem tmp;
+ m_swap(tmp);
+}
+
+
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+ memory_size_type n
+ = working_cost.external_memory_in_bytes()
+ + tableau.external_memory_in_bytes()
+ + input_obj_function.external_memory_in_bytes()
+ + last_generator.external_memory_in_bytes();
+
+ // Adding the external memory for `input_cs'.
+ // NOTE: disregard inherited constraints, as they are owned by ancestors.
+ n += input_cs.capacity() * sizeof(Constraint*);
+ for (Constraint_Sequence::const_iterator
+ i = nth_iter(input_cs, inherited_constraints),
+ i_end = input_cs.end(); i != i_end; ++i)
+ n += ((*i)->total_memory_in_bytes());
+
+ // Adding the external memory for `base'.
+ n += base.capacity() * sizeof(dimension_type);
+ // Adding the external memory for `mapping'.
+ n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+ return n;
+}
+
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+MIP_Problem::const_iterator::const_iterator(Base base)
+ : itr(base) {
+}
+
+inline MIP_Problem::const_iterator::difference_type
+MIP_Problem::const_iterator::operator-(const const_iterator& y) const {
+ return itr - y.itr;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator++() {
+ ++itr;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator--() {
+ --itr;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator++(int) {
+ const_iterator x = *this;
+ operator++();
+ return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator--(int) {
+ const_iterator x = *this;
+ operator--();
+ return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator+(difference_type n) const {
+ return const_iterator(itr + n);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator-(difference_type n) const {
+ return const_iterator(itr - n);
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator+=(difference_type n) {
+ itr += n;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator-=(difference_type n) {
+ itr -= n;
+ return *this;
+}
+
+inline MIP_Problem::const_iterator::reference
+MIP_Problem::const_iterator::operator*() const {
+ return *(*itr);
+}
+
+inline MIP_Problem::const_iterator::pointer
+MIP_Problem::const_iterator::operator->() const {
+ return *itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator==(const const_iterator& y) const {
+ return itr == y.itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator!=(const const_iterator& y) const {
+ return itr != y.itr;
+}
+
+/*! \relates MIP_Problem */
+inline void
+swap(MIP_Problem& x, MIP_Problem& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_templates.hh line 1. */
+/* MIP_Problem class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+ In first, In last,
+ const Variables_Set& int_vars,
+ const Linear_Expression& obj,
+ const Optimization_Mode mode)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(obj),
+ opt_mode(mode),
+ last_generator(point()),
+ i_variables(int_vars) {
+ // Check that integer Variables_Set does not exceed the space dimension
+ // of the problem.
+ if (i_variables.space_dimension() > external_space_dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem"
+ << "(dim, first, last, int_vars, obj, mode):\n"
+ << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+ << " " << i_variables.space_dimension() << " are dimension"
+ "incompatible.";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+ "last, int_vars, obj, mode):\n"
+ "dim exceeds the maximum allowed"
+ "space dimension.");
+ // Check the objective function.
+ if (obj.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+ << "int_vars, obj, mode):\n"
+ << "obj.space_dimension() == "<< obj.space_dimension()
+ << " exceeds d == "<< dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // Check the constraints.
+ try {
+ for (In i = first; i != last; ++i) {
+ if (i->is_strict_inequality())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, int_vars,"
+ "obj, mode):\nrange [first, last) contains"
+ "a strict inequality constraint.");
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::"
+ << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+ << "range [first, last) contains a constraint having space"
+ << "dimension == " << i->space_dimension() << " that exceeds"
+ "this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ add_constraint_helper(*i);
+ }
+ } catch (...) {
+ // Delete the allocated constraints, to avoid memory leaks.
+
+ for (Constraint_Sequence::const_iterator
+ i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+
+ throw;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+ In first, In last,
+ const Linear_Expression& obj,
+ Optimization_Mode mode)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ tableau(),
+ working_cost(0),
+ mapping(),
+ base(),
+ status(PARTIALLY_SATISFIABLE),
+ pricing(PRICING_STEEPEST_EDGE_FLOAT),
+ initialized(false),
+ input_cs(),
+ inherited_constraints(0),
+ first_pending_constraint(0),
+ input_obj_function(obj),
+ opt_mode(mode),
+ last_generator(point()),
+ i_variables() {
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, obj, mode):\n"
+ "dim exceeds the maximum allowed space "
+ "dimension.");
+ // Check the objective function.
+ if (obj.space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+ << " obj, mode):\n"
+ << "obj.space_dimension() == "<< obj.space_dimension()
+ << " exceeds d == "<< dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // Check the constraints.
+ try {
+ for (In i = first; i != last; ++i) {
+ if (i->is_strict_inequality())
+ throw std::invalid_argument("PPL::MIP_Problem::"
+ "MIP_Problem(dim, first, last, obj, mode):"
+ "\n"
+ "range [first, last) contains a strict "
+ "inequality constraint.");
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::MIP_Problem::"
+ << "MIP_Problem(dim, first, last, obj, mode):\n"
+ << "range [first, last) contains a constraint having space"
+ << "dimension" << " == " << i->space_dimension() << " that exceeds"
+ "this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ add_constraint_helper(*i);
+ }
+ } catch (...) {
+ // Delete the allocated constraints, to avoid memory leaks.
+
+ for (Constraint_Sequence::const_iterator
+ i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+ delete *i;
+
+ throw;
+ }
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 974. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 31. */
+// For static method overflows.
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Floating_Point_Expression class and its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 31. */
+#include <cmath>
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_Interface \brief
+ A floating point expression on a given format.
+
+ This class represents a concrete <EM>floating point expression</EM>. This
+ includes constants, floating point variables, binary and unary
+ arithmetic operators.
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain. The interval bounds
+ should have a floating point type.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+ This parameter must be a struct similar to the ones defined in file
+ Float_defs.hh, even though it is sufficient to define the three
+ fields BASE, MANTISSA_BITS and EXPONENT_BIAS.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression {
+
+public:
+
+ //! Alias for a linear form with template argument \p FP_Interval_Type.
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ //! Alias for a map that associates a variable index to an interval.
+ /*! \brief
+ Alias for a Box storing lower and upper bounds for floating point
+ variables.
+
+ The type a linear form abstract store associating each variable with an
+ interval that correctly approximates its value.
+ */
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+
+ //! Alias for a map that associates a variable index to a linear form.
+ /*!
+ The type a linear form abstract store associating each variable with a
+ linear form that correctly approximates its value.
+ */
+ typedef std::map<dimension_type, FP_Linear_Form>
+ FP_Linear_Form_Abstract_Store;
+
+ //! The floating point format used by the analyzer.
+ typedef typename FP_Interval_Type::boundary_type boundary_type;
+
+ //! The interval policy used by \p FP_Interval_Type.
+ typedef typename FP_Interval_Type::info_type info_type;
+
+ //! Destructor.
+ virtual ~Floating_Point_Expression();
+
+ //! Linearizes a floating point expression.
+ /*! \brief
+ Makes \p result become a linear form that correctly approximates the
+ value of the floating point expression in the given composite
+ abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result Becomes the linearized expression.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Formally, if \p *this represents the expression \f$e\f$,
+ \p int_store represents the interval abstract store \f$\rho^{\#}\f$ and
+ \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+ then \p result will become
+ \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ if the linearization succeeds.
+
+ All variables occurring in the floating point expression MUST have
+ an associated interval in \p int_store.
+ If this precondition is not met, calling the method causes an
+ undefined behavior.
+ */
+ virtual bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const = 0;
+
+ /*! \brief
+ Absolute error.
+
+ Represents the interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+ smallest non-zero positive number in the less precise floating point
+ format between the analyzer format and the analyzed format.
+
+ */
+ static FP_Interval_Type absolute_error;
+
+ // FIXME: this may not be the best place for them.
+ /*! \brief
+ Verifies if a given linear form overflows.
+ \param lf The linear form to verify.
+ \return
+ Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+ <CODE>true</CODE> otherwise.
+ */
+ static bool overflows(const FP_Linear_Form& lf);
+
+ /*! \brief
+ Computes the relative error of a given linear form.
+
+ Static helper method that is used by <CODE>linearize</CODE>
+ to account for the relative errors on \p lf.
+ \param lf The linear form used to compute the relative error.
+ \param result Becomes the linear form corresponding to a relative
+ error committed on \p lf.
+
+ This method makes <CODE>result</CODE> become a linear form
+ obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+ on the linear form \p lf. This function is defined
+ such as:
+ \f[
+ \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+ \defeq
+ (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+ +
+ \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+ \amifp
+ [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+ \f]
+ where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+ \f$\beta\f$ the base.
+ */
+ static void relative_error(const FP_Linear_Form& lf,
+ FP_Linear_Form& result);
+
+ /*! \brief
+ Makes \p result become an interval that overapproximates all the
+ possible values of \p lf in the interval abstract store \p store.
+
+ \param lf The linear form to aproximate.
+ \param store The abstract store.
+ \param result The linear form that will be modified.
+
+ This method makes <CODE>result</CODE> become
+ \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+ \f[
+ \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+ \defeq
+ i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+ \rho^{\#}(v)\right)
+ \f]
+ */
+ static void intervalize(const FP_Linear_Form& lf,
+ const FP_Interval_Abstract_Store& store,
+ FP_Interval_Type& result);
+
+private:
+
+ /*! \brief
+ Computes the absolute error.
+
+ Static helper method that is used to compute the value of the public
+ static field <CODE>absolute_error</CODE>.
+
+ \return The interval \f$[-\omega, \omega]\f$ corresponding to the value
+ of <CODE>absolute_error</CODE>
+ */
+ static FP_Interval_Type compute_absolute_error();
+
+}; // class Floating_Point_Expression
+
+
+template <typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::absolute_error = compute_absolute_error();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_inlines.hh line 1. */
+/* Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::overflows(const FP_Linear_Form& lf) {
+ if (!lf.inhomogeneous_term().is_bounded())
+ return true;
+
+ dimension_type dimension = lf.space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ if (!lf.coefficient(Variable(i)).is_bounded())
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_templates.hh line 1. */
+/* Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_templates.hh line 29. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::relative_error(const FP_Linear_Form& lf, FP_Linear_Form& result) {
+
+ FP_Interval_Type error_propagator;
+ boundary_type lb = -pow(FP_Format::BASE,
+ -static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::boundary_type>(FP_Format::MANTISSA_BITS));
+ error_propagator.build(i_constraint(GREATER_OR_EQUAL, lb),
+ i_constraint(LESS_OR_EQUAL, -lb));
+
+ // Handle the inhomogeneous term.
+ const FP_Interval_Type* current_term = &lf.inhomogeneous_term();
+ assert(current_term->is_bounded());
+
+ FP_Interval_Type
+ current_multiplier(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ FP_Linear_Form current_result_term(current_multiplier);
+ current_result_term *= error_propagator;
+ result = FP_Linear_Form(current_result_term);
+
+ // Handle the other terms.
+ dimension_type dimension = lf.space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ current_term = &lf.coefficient(Variable(i));
+ assert(current_term->is_bounded());
+ current_multiplier
+ = FP_Interval_Type(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ current_result_term = FP_Linear_Form(Variable(i));
+ current_result_term *= current_multiplier;
+ current_result_term *= error_propagator;
+ result += current_result_term;
+ }
+
+ return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::intervalize(const FP_Linear_Form& lf,
+ const FP_Interval_Abstract_Store& store,
+ FP_Interval_Type& result) {
+ result = FP_Interval_Type(lf.inhomogeneous_term());
+ dimension_type dimension = lf.space_dimension();
+ assert(dimension <= store.space_dimension());
+ for (dimension_type i = 0; i < dimension; ++i) {
+ FP_Interval_Type current_addend = lf.coefficient(Variable(i));
+ const FP_Interval_Type& curr_int = store.get_interval(Variable(i));
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::compute_absolute_error() {
+ typedef typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::boundary_type Boundary;
+ boundary_type omega;
+ omega = std::max(pow(static_cast<Boundary>(FP_Format::BASE),
+ static_cast<Boundary>(1 - FP_Format::EXPONENT_BIAS
+ - FP_Format::MANTISSA_BITS)),
+ std::numeric_limits<Boundary>::denorm_min());
+ FP_Interval_Type result;
+ result.build(i_constraint(GREATER_OR_EQUAL, -omega),
+ i_constraint(LESS_OR_EQUAL, omega));
+ return result;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 211. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 33. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+ const Box<Interval>& box,
+ Complexity_Class)
+ : con_sys(topol, default_con_sys_repr),
+ gen_sys(topol, default_gen_sys_repr),
+ sat_c(),
+ sat_g() {
+ // Initialize the space dimension as indicated by the box.
+ space_dim = box.space_dimension();
+
+ // Check for emptiness.
+ if (box.is_empty()) {
+ set_empty();
+ return;
+ }
+
+ // Zero-dim universe polyhedron.
+ if (space_dim == 0) {
+ set_zero_dim_univ();
+ return;
+ }
+
+ // Properly set the space dimension of `con_sys'.
+ con_sys.set_space_dimension(space_dim);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+ if (topol == NECESSARILY_CLOSED) {
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+ // See if we have an implicit equality constraint.
+ if (l_bounded && u_bounded
+ && l_closed && u_closed
+ && l_n == u_n && l_d == u_d) {
+ // Add the constraint `l_d*v_k == l_n'.
+ con_sys.insert(l_d * v_k == l_n);
+ }
+ else {
+ if (l_bounded)
+ // Add the constraint `l_d*v_k >= l_n'.
+ con_sys.insert(l_d * v_k >= l_n);
+ if (u_bounded)
+ // Add the constraint `u_d*v_k <= u_n'.
+ con_sys.insert(u_d * v_k <= u_n);
+ }
+ }
+ }
+ else {
+ // topol == NOT_NECESSARILY_CLOSED
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+ // See if we have an implicit equality constraint.
+ if (l_bounded && u_bounded
+ && l_closed && u_closed
+ && l_n == u_n && l_d == u_d) {
+ // Add the constraint `l_d*v_k == l_n'.
+ con_sys.insert(l_d * v_k == l_n);
+ }
+ else {
+ // Check if a lower bound constraint is required.
+ if (l_bounded) {
+ if (l_closed)
+ // Add the constraint `l_d*v_k >= l_n'.
+ con_sys.insert(l_d * v_k >= l_n);
+ else
+ // Add the constraint `l_d*v_k > l_n'.
+ con_sys.insert(l_d * v_k > l_n);
+ }
+ // Check if an upper bound constraint is required.
+ if (u_bounded) {
+ if (u_closed)
+ // Add the constraint `u_d*v_k <= u_n'.
+ con_sys.insert(u_d * v_k <= u_n);
+ else
+ // Add the constraint `u_d*v_k < u_n'.
+ con_sys.insert(u_d * v_k < u_n);
+ }
+ }
+ }
+ }
+
+ // Adding the low-level constraints.
+ con_sys.add_low_level_constraints();
+
+ // Constraints are up-to-date.
+ set_constraints_up_to_date();
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the polyhedron becomes zero_dimensional.
+ if (marked_empty()
+ || (has_pending_constraints()
+ && !remove_pending_to_obtain_generators())
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing all dimensions from the empty polyhedron.
+ space_dim = 0;
+ con_sys.clear();
+ }
+ else
+ // Removing all dimensions from a non-empty polyhedron.
+ set_zero_dim_univ();
+
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+ if (new_space_dimension == space_dim) {
+ // The partial function `pfunc' is indeed total and thus specifies
+ // a permutation, that is, a renaming of the dimensions. For
+ // maximum efficiency, we will simply permute the columns of the
+ // constraint system and/or the generator system.
+
+ std::vector<Variable> cycle;
+ cycle.reserve(space_dim);
+
+ // Used to mark elements as soon as they are inserted in a cycle.
+ std::deque<bool> visited(space_dim);
+
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ if (visited[i])
+ continue;
+
+ dimension_type j = i;
+ do {
+ visited[j] = true;
+ // The following initialization is only to make the compiler happy.
+ dimension_type k = 0;
+ if (!pfunc.maps(j, k))
+ throw_invalid_argument("map_space_dimensions(pfunc)",
+ " pfunc is inconsistent");
+ if (k == j)
+ break;
+
+ cycle.push_back(Variable(j));
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+
+ // End of cycle.
+
+ // Permute all that is up-to-date. Notice that the contents of
+ // the saturation matrices is unaffected by the permutation of
+ // columns: they remain valid, if they were so.
+ if (constraints_are_up_to_date())
+ con_sys.permute_space_dimensions(cycle);
+
+ if (generators_are_up_to_date())
+ gen_sys.permute_space_dimensions(cycle);
+
+ cycle.clear();
+ }
+
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // If control gets here, then `pfunc' is not a permutation and some
+ // dimensions must be projected away.
+
+ // If there are pending constraints, using `generators()' we process them.
+ const Generator_System& old_gensys = generators();
+
+ if (old_gensys.has_no_rows()) {
+ // The polyhedron is empty.
+ Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+ m_swap(new_polyhedron);
+ PPL_ASSERT_HEAVY(OK());
+ return;
+ }
+
+ // Make a local copy of the partial function.
+ std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ dimension_type pfunc_j;
+ if (pfunc.maps(j, pfunc_j))
+ pfunc_maps[j] = pfunc_j;
+ }
+
+ Generator_System new_gensys;
+ for (Generator_System::const_iterator i = old_gensys.begin(),
+ old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+ const Generator& old_g = *i;
+ const Generator::expr_type old_e = old_g.expression();
+ Linear_Expression expr;
+ expr.set_space_dimension(new_space_dimension);
+ bool all_zeroes = true;
+ for (Generator::expr_type::const_iterator j = old_e.begin(),
+ j_end = old_e.end(); j != j_end; ++j) {
+ const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+ if (mapped_id != not_a_dimension()) {
+ add_mul_assign(expr, *j, Variable(mapped_id));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(line(expr));
+ break;
+ case Generator::RAY:
+ if (!all_zeroes)
+ new_gensys.insert(ray(expr));
+ break;
+ case Generator::POINT:
+ // A point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(point(expr, old_g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ // A closure point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(closure_point(expr, old_g.divisor()));
+ break;
+ }
+ }
+ Polyhedron new_polyhedron(topology(), new_gensys);
+ m_swap(new_polyhedron);
+ PPL_ASSERT_HEAVY(OK(true));
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+ const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+ const bool is_strict) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::refine_with_linear_form_inequality:"
+ " FP_Format not a floating point type.");
+
+ // Dimension compatibility checks.
+ // The dimensions of left and right should not be greater than the
+ // dimension of *this.
+ const dimension_type left_space_dim = left.space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(l1, l2, s)", "l1", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(l1, l2, s)", "l2", right);
+
+ // We assume that the analyzer will not refine an unreachable test.
+ PPL_ASSERT(!marked_empty());
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(left))
+ return;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(right))
+ return;
+
+ // Overapproximate left - right.
+ FP_Linear_Form left_minus_right(left);
+ left_minus_right -= right;
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(left_minus_right))
+ return;
+
+ dimension_type lf_space_dim = left_minus_right.space_dimension();
+ FP_Linear_Form lf_approx;
+ overapproximate_linear_form(left_minus_right, lf_space_dim, lf_approx);
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf_approx))
+ return;
+
+ // Normalize left - right.
+ Linear_Expression lf_approx_le;
+ convert_to_integer_expression(lf_approx, lf_space_dim, lf_approx_le);
+
+ // Finally, do the refinement.
+ if (!is_strict || is_necessarily_closed())
+ refine_with_constraint(lf_approx_le <= 0);
+ else
+ refine_with_constraint(lf_approx_le < 0);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::affine_form_image(const Variable var,
+const Linear_Form<Interval <FP_Format, Interval_Info> >& lf) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::affine_form_image:"
+ " FP_Format not a floating point type.");
+
+ // Dimension compatibility checks.
+ // The dimension of lf should not be greater than the dimension of *this.
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(v, l, s)", "l", lf);
+
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_form_image(v, l, s)", "v", var);
+
+ // We assume that the analyzer will not perform an unreachable assignment.
+ PPL_ASSERT(!marked_empty());
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf)) {
+ *this = Polyhedron(topology(), space_dim, UNIVERSE);
+ return;
+ }
+
+ // Overapproximate lf.
+ FP_Linear_Form lf_approx;
+ overapproximate_linear_form(lf, lf_space_dim, lf_approx);
+
+ if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+ overflows(lf_approx)) {
+ *this = Polyhedron(topology(), space_dim, UNIVERSE);
+ return;
+ }
+
+ // Normalize lf.
+ Linear_Expression lf_approx_le;
+ PPL_DIRTY_TEMP_COEFFICIENT(lo_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(hi_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+ convert_to_integer_expressions(lf_approx, lf_space_dim, lf_approx_le,
+ lo_coeff, hi_coeff, denominator);
+
+ // Finally, do the assignment.
+ bounded_affine_image(var, lf_approx_le + lo_coeff, lf_approx_le + hi_coeff,
+ denominator);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::overapproximate_linear_form
+(const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result) {
+
+ // Check that FP_Format is indeed a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+ "Polyhedron::overapproximate_linear_form:"
+ " FP_Format not a floating point type.");
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+ // Build a Box from the Polyhedron so that we can extract upper and
+ // lower bounds of variables easily.
+ Box<FP_Interval_Type> box(*this);
+
+ result = FP_Linear_Form(lf.inhomogeneous_term());
+ // FIXME: this may not be policy-neutral.
+ const FP_Interval_Type aux_divisor1(static_cast<FP_Format>(0.5));
+ FP_Interval_Type aux_divisor2(aux_divisor1);
+ aux_divisor2.lower() = static_cast<FP_Format>(-0.5);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ Variable curr_var(i);
+ const FP_Interval_Type& curr_coeff = lf.coefficient(curr_var);
+ PPL_ASSERT(curr_coeff.is_bounded());
+ FP_Format curr_lb = curr_coeff.lower();
+ FP_Format curr_ub = curr_coeff.upper();
+ if (curr_lb != 0 || curr_ub != 0) {
+ const FP_Interval_Type& curr_int = box.get_interval(curr_var);
+ FP_Interval_Type curr_addend(curr_ub - curr_lb);
+ curr_addend *= aux_divisor2;
+ curr_addend *= curr_int;
+ result += curr_addend;
+ curr_addend = FP_Interval_Type(curr_lb + curr_ub);
+ curr_addend *= aux_divisor1;
+ FP_Linear_Form curr_addend_lf(curr_var);
+ curr_addend_lf *= curr_addend;
+ result += curr_addend_lf;
+ }
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expression(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Expression& result) {
+ result = Linear_Expression();
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ std::vector<Coefficient> numerators(lf_dimension+1);
+ std::vector<Coefficient> denominators(lf_dimension+1);
+
+ // Convert each floating point number to a pair <numerator, denominator>
+ // and compute the lcm of all denominators.
+ PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+ lcm = 1;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+ // FIXME: are these checks numerator[i] != 0 really necessary?
+ numer_denom(b.lower(), numerators[lf_dimension],
+ denominators[lf_dimension]);
+ if (numerators[lf_dimension] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+ numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+ if (numerators[i] != 0)
+ lcm_assign(lcm, lcm, denominators[i]);
+ }
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ if (numerators[i] != 0) {
+ exact_div_assign(denominators[i], lcm, denominators[i]);
+ numerators[i] *= denominators[i];
+ result += numerators[i] * Variable(i);
+ }
+ }
+
+ if (numerators[lf_dimension] != 0) {
+ exact_div_assign(denominators[lf_dimension],
+ lcm, denominators[lf_dimension]);
+ numerators[lf_dimension] *= denominators[lf_dimension];
+ result += numerators[lf_dimension];
+ }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expressions(
+ const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension, Linear_Expression& res,
+ Coefficient& res_low_coeff, Coefficient& res_hi_coeff,
+ Coefficient& denominator) {
+ res = Linear_Expression();
+
+ typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+ std::vector<Coefficient> numerators(lf_dimension+2);
+ std::vector<Coefficient> denominators(lf_dimension+2);
+
+ // Convert each floating point number to a pair <numerator, denominator>
+ // and compute the lcm of all denominators.
+ Coefficient& lcm = denominator;
+ lcm = 1;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+ numer_denom(b.lower(), numerators[lf_dimension], denominators[lf_dimension]);
+ // FIXME: are these checks numerator[i] != 0 really necessary?
+ if (numerators[lf_dimension] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+ numer_denom(b.upper(), numerators[lf_dimension+1],
+ denominators[lf_dimension+1]);
+ if (numerators[lf_dimension+1] != 0)
+ lcm_assign(lcm, lcm, denominators[lf_dimension+1]);
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+ numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+ if (numerators[i] != 0)
+ lcm_assign(lcm, lcm, denominators[i]);
+ }
+
+ for (dimension_type i = 0; i < lf_dimension; ++i) {
+ if (numerators[i] != 0) {
+ exact_div_assign(denominators[i], lcm, denominators[i]);
+ numerators[i] *= denominators[i];
+ res += numerators[i] * Variable(i);
+ }
+ }
+
+ if (numerators[lf_dimension] != 0) {
+ exact_div_assign(denominators[lf_dimension],
+ lcm, denominators[lf_dimension]);
+ numerators[lf_dimension] *= denominators[lf_dimension];
+ res_low_coeff = numerators[lf_dimension];
+ }
+ else
+ res_low_coeff = Coefficient(0);
+
+ if (numerators[lf_dimension+1] != 0) {
+ exact_div_assign(denominators[lf_dimension+1],
+ lcm, denominators[lf_dimension+1]);
+ numerators[lf_dimension+1] *= denominators[lf_dimension+1];
+ res_hi_coeff = numerators[lf_dimension+1];
+ }
+ else
+ res_hi_coeff = Coefficient(0);
+}
+
+template <typename C>
+void
+Polyhedron::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ throw_dimension_incompatible(method, lf_name, lf.space_dimension());
+}
+
+template <typename Input>
+Input&
+Polyhedron::check_obj_space_dimension_overflow(Input& input,
+ const Topology topol,
+ const char* method,
+ const char* reason) {
+ check_space_dimension_overflow(input.space_dimension(),
+ max_space_dimension(),
+ topol, method, reason);
+ return input;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_chdims_templates.hh line 1. */
+/* Polyhedron class implementation (non-inline template operators that
+ may change the dimension of the vector space).
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Linear_System1, typename Linear_System2>
+void
+Polyhedron::add_space_dimensions(Linear_System1& sys1,
+ Linear_System2& sys2,
+ Bit_Matrix& sat1,
+ Bit_Matrix& sat2,
+ dimension_type add_dim) {
+
+ typedef typename Linear_System2::row_type sys2_row_type;
+
+ PPL_ASSERT(sys1.topology() == sys2.topology());
+ PPL_ASSERT(sys1.space_dimension() == sys2.space_dimension());
+ PPL_ASSERT(add_dim != 0);
+
+ sys1.set_space_dimension(sys1.space_dimension() + add_dim);
+ sys2.add_universe_rows_and_space_dimensions(add_dim);
+
+ // The resulting saturation matrix will be as follows:
+ // from row 0 to add_dim-1 : only zeroes
+ // add_dim add_dim+num_rows-1 : old saturation matrix
+
+ // In fact all the old generators saturate all the new constraints
+ // because the polyhedron has not been embedded in the new space.
+ sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns());
+ // The old matrix is moved to the end of the new matrix.
+ for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; )
+ swap(sat1[i], sat1[i+add_dim]);
+ // Computes the "sat_c", too.
+ sat2.transpose_assign(sat1);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_conversion_templates.hh line 1. */
+/* Polyhedron class implementation: conversion().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_conversion_templates.hh line 34. */
+
+#include <cstddef>
+#include <climits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ The number of lines of the polyhedron or the number of equality
+ constraints in the result of conversion.
+
+ \param source
+ The system to use to convert \p dest: it may be modified;
+
+ \param start
+ The index of \p source row from which conversion begin;
+
+ \param dest
+ The result of the conversion;
+
+ \param sat
+ The saturation matrix telling us, for each row in \p source, which
+ are the rows of \p dest that satisfy but do not saturate it;
+
+ \param num_lines_or_equalities
+ The number of rows in the system \p dest that are either lines of
+ the polyhedron (when \p dest is a system of generators) or equality
+ constraints (when \p dest is a system of constraints).
+
+ \if Include_Implementation_Details
+
+ For simplicity, all the following comments assume we are converting a
+ constraint system \p source to a generator system \p dest;
+ the comments for the symmetric case can be obtained by duality.
+
+ If some of the constraints in \p source are redundant, they will be removed.
+ This is why the \p source is not declared to be a constant parameter.
+
+ If \p start is 0, then \p source is a sorted system; also, \p dest is
+ a generator system corresponding to an empty constraint system.
+ If otherwise \p start is greater than 0, then the two sub-systems of
+ \p source made by the non-pending rows and the pending rows, respectively,
+ are both sorted; also, \p dest is the generator system corresponding to
+ the non-pending constraints of \p source.
+
+ Independently from the value of \p start, \p dest has lines from index 0
+ to index \p num_lines_or_equalities - 1 and rays/points from index
+ \p num_lines_or_equalities to the last of its rows.
+
+ Note that here the rows of \p sat are indexed by rows of \p dest
+ and its columns are indexed by rows of \p source.
+
+ We know that polyhedra can be represented by both a system of
+ constraints or a system of generators (points, rays and lines)
+ (see Section \ref representation).
+ When we have both descriptions for a polyhedron \f$P\f$
+ we have what is called a <EM>double description</EM>
+ (or <EM>DD pair</EM>) for \f$P\f$.
+
+ Here, the <EM>representation system</EM> refers to the system \f$C\f$
+ whose rows represent the constraints that characterize \f$P\f$
+ and the <EM>generating system</EM>, the system \f$G\f$ whose rows
+ represent the generators of \f$P\f$.
+ We say that a pair \f$(C, G)\f$ of (real) systems is
+ a <EM>double description pair</EM> if
+ \f[
+ C\vect{x} \geq \vect{0}
+ \quad\iff\quad
+ \exists \vect{\lambda} \geq \vect{0} \mathrel{.}
+ \vect{x} = G\vect{\lambda}.
+ \f]
+
+ The term "double description" is quite natural in the sense that
+ such a pair contains two different description of the same object.
+ In fact, if we refer to the cone representation of a polyhedron \f$P\f$
+ and we call \f$C\f$ and \f$G\f$ the systems of constraints and
+ rays respectively, we have
+ \f[
+ P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \}
+ = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda}
+ \text{ for some } \vect{\lambda} \geq \vect{0}\, \}.
+ \f]
+
+ Because of the theorem of Minkowski (see Section \ref prelims),
+ we can say that, given a \f$m \times n\f$ representation system
+ \f$C\f$ such that
+ \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$
+ for a non-empty polyhedron \f$P\f$,
+ it is always possible to find a generating system \f$G\f$ for \f$P\f$
+ such that \f$(C, G)\f$ is a DD pair.
+ Conversely, Weyl's theorem ensures that, for each generating system
+ \f$G\f$, it is possible to find a representation system \f$C\f$
+ such that \f$(C, G)\f$ is a DD pair.
+
+ For efficiency reasons, our representation of polyhedra makes use
+ of a double description.
+ We are thus left with two problems:
+ -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
+ -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
+
+ Using Farkas' Lemma we can prove that these two problems are
+ computationally equivalent (i.e., linear-time reducible to each other).
+ Farkas' Lemma establishes a fundamental property of vectors in
+ \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
+ Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
+ \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
+ Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that,
+ whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection
+ on the \f$\vect{a}_i\f$'s, it also has a non-negative projection
+ on \f$\vect{c}\f$.
+ The lemma states that \f$\vect{c}\f$ has this property if and only if
+ it is in the cone generated by the \f$\vect{a}_i\f$'s.
+ Formally, the lemma states the equivalence of the two following
+ assertions:
+ -# \f$
+ \forall \vect{y}
+ \mathrel{:} (A\vect{y} \geq 0 \implies
+ \langle \vect{y},\vect{c} \rangle \geq 0)
+ \f$;
+ -# \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A
+ \f$.
+
+ With this result we can prove that \f$(C, G)\f$ is a DD pair
+ if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair.
+
+ Suppose \f$(C, G)\f$ is a DD pair.
+ Thus, for each \f$x\f$ of the appropriate dimension,
+ \f$C\vect{x} \geq \vect{0}\f$ if and only if
+ \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$,
+ which is of course equivalent to
+ \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+ \f$.
+
+ First, we assume that \f$\vect{z}\f$ is such that
+ \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+ and we will show that
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+ Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$.
+ Since \f$(C, G)\f$ is a DD pair, this is equivalent to
+ \f$
+ \exists \vect{\lambda} \geq \vect{0}
+ \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+ \f$,
+ which, by Farkas' Lemma is equivalent to
+ \f$
+ \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
+ \langle \vect{y}, \vect{x} \rangle \geq 0)
+ \f$.
+ Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that
+ \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+ we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$,
+ that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$.
+ We have thus established that
+ \f$
+ \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
+ \langle \vect{x}, \vect{z} \rangle \geq 0)
+ \f$.
+ By Farkas' Lemma, this is equivalent to
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
+ which is equivalent to what we wanted to prove, that is,
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+
+ In order to prove the reverse implication, the following observation
+ turns out to be useful:
+ when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$.
+ In fact,
+ let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$
+ apart from the \f$j\f$-th one, which is \f$1\f$.
+ Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking
+ \f$\vect{\lambda} = \vect{e}_j\f$ and
+ \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have
+ \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$,
+ since \f$(C, G)\f$ is a DD pair.
+ Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$
+ and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$.
+
+ We now assume that \f$\vect{z}\f$ is such that
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z} = C^\mathrm{T}\vect{\mu}\f$
+ and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
+ By Farkas' Lemma, the assumption
+ \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+ \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
+ is equivalent to
+ \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0}
+ \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$.
+ If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y}
+ = CG\vect{e}_j \geq 0\f$,
+ since \f$CG \geq \vect{0}\f$.
+ So
+ \f$
+ \langle \vect{y}, \vect{z} \rangle
+ = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z}
+ = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z})
+ \geq 0
+ \f$,
+ that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$
+ is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude
+ that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required.
+
+ In view of this result, the following exposition assumes, for clarity,
+ that the conversion being performed is from constraints to generators.
+ Thus, even if the roles of \p source and \p dest can be interchanged,
+ in the sequel we assume the \p source system will contain the constraints
+ that represent the polyhedron and the \p dest system will contain
+ the generator that generates it.
+
+ There are some observations that are useful to understand this function:
+
+ Observation 1: Let \f$A\f$ be a system of constraints that generate
+ the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must
+ be added. Suppose that there is a line \f$\vect{z}\f$ that does not
+ saturate the constraint \f$\vect{c}\f$. If we combine the old lines
+ and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$)
+ with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$,
+ the new lines and rays also saturate the constraints saturated by
+ the old lines and rays.
+
+ In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate
+ \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that
+ \f[
+ \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z}
+ \f]
+ and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$
+ and \f$\vect{z}\f$ saturates, we can see
+ \f[
+ \langle \vect{c}_1, \vect{y}_2 \rangle
+ = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle
+ = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle
+ + \mu \langle \vect{c}_1, \vect{z} \rangle
+ = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle
+ = \mu \langle \vect{c}_1, \vect{z} \rangle
+ \f]
+ and
+ \f[
+ \mu \langle \vect{c}_1, \vect{z} \rangle = 0.
+ \f]
+
+ Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct
+ rays of \f$P\f$.
+ Then the following statements are equivalent:
+ a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays
+ (see Section \ref prelims);
+ b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the
+ rank of the system composed by the constraints saturated by both
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to
+ \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints.
+
+ In fact, let \f$F\f$ be the system of generators that saturate the
+ constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+ If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$ generate this set. So, every generator
+ \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e.
+ \f[
+ \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2.
+ \f]
+ This combination is non-negative because there exists at least a
+ constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not
+ \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which
+ \f[
+ \langle \vect{c}, \vect{x} \rangle \geq 0
+ \f]
+ and
+ \f[
+ \langle \vect{c}, \vect{x} \rangle
+ = \lambda \langle \vect{c}, \vect{r}_1 \rangle
+ (or = \mu \langle \vect{c}, \vect{r}_2 \rangle).
+ \f]
+ So, there is no other extreme ray in \f$F\f$ and a) holds.
+ Otherwise, if b) does not hold, the rank of the system generated by
+ the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+ is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is
+ \p k -dimensional and at least \p k extreme rays are necessary
+ to generate \f$F\f$.
+ So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and
+ a) does not hold.
+
+ Proposition 2: When we build the new system of generators starting from
+ a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the
+ constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate
+ \f$\vect{c}\f$, the new set of rays is the union of those rays that
+ saturate, of those that satisfy and of a set \f$\overline Q\f$ of
+ rays such that each of them
+ -# lies on the hyper-plane represented by the k-th constraint,
+ -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$ such that the first one satisfies the constraint and
+ the other does not satisfy it.
+ If the adjacency property is not taken in account, the new set of
+ rays is not irredundant, in general.
+
+ In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent,
+ the rank of the system composed by the constraints saturated by both
+ \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$
+ (see the previous proposition) or neither \f$\vect{r}_1\f$ nor
+ \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$
+ is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$,
+ it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and
+ \f$\vect{r}_2\f$.
+ If the rank is less than \f$d - 2\f$, the rank of
+ the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$)
+ and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$ is less
+ than \f$d - 1\f$. It means that \f$r\f$ is redundant (see
+ Section \ref prelims).
+ If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays,
+ they belong to a 2-dimensional face containing exactly two extreme rays
+ of \f$P\f$.
+ These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so
+ \f$\vect{r}\f$ is redundant.
+
+ \endif
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+dimension_type
+Polyhedron::conversion(Source_Linear_System& source,
+ const dimension_type start,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ dimension_type num_lines_or_equalities) {
+ typedef typename Dest_Linear_System::row_type dest_row_type;
+ typedef typename Source_Linear_System::row_type source_row_type;
+
+ // Constraints and generators must have the same dimension,
+ // otherwise the scalar products below will bomb.
+ PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+ const dimension_type source_space_dim = source.space_dimension();
+ const dimension_type source_num_rows = source.num_rows();
+ const dimension_type source_num_columns = source_space_dim
+ + (source.is_necessarily_closed() ? 1U : 2U);
+
+
+ dimension_type dest_num_rows = dest.num_rows();
+ // The rows removed from `dest' will be placed in this vector, so they
+ // can be recycled if needed.
+ std::vector<dest_row_type> recyclable_dest_rows;
+
+ using std::swap;
+
+ // By construction, the number of columns of `sat' is the same as
+ // the number of rows of `source'; also, the number of rows of `sat'
+ // is the same as the number of rows of `dest'.
+ PPL_ASSERT(source_num_rows == sat.num_columns());
+ PPL_ASSERT(dest_num_rows == sat.num_rows());
+
+ // If `start > 0', then we are converting the pending constraints.
+ PPL_ASSERT(start == 0 || start == source.first_pending_row());
+
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_o);
+
+ bool dest_sorted = dest.is_sorted();
+ const dimension_type dest_first_pending_row = dest.first_pending_row();
+
+ // This will contain the row indexes of the redundant rows of `source'.
+ std::vector<dimension_type> redundant_source_rows;
+
+ // Converting the sub-system of `source' having rows with indexes
+ // from `start' to the last one (i.e., `source_num_rows' - 1).
+ for (dimension_type k = start; k < source_num_rows; ++k) {
+ const source_row_type& source_k = source[k];
+
+ // `scalar_prod[i]' will contain the scalar product of the
+ // constraint `source_k' and the generator `dest_rows[i]'. This
+ // product is 0 if and only if the generator saturates the
+ // constraint.
+ PPL_DIRTY_TEMP(std::vector<Coefficient>, scalar_prod);
+ if (dest_num_rows > scalar_prod.size()) {
+ scalar_prod.insert(scalar_prod.end(),
+ dest_num_rows - scalar_prod.size(),
+ Coefficient_zero());
+ }
+ // `index_non_zero' will indicate the first generator in `dest_rows'
+ // that does not saturate the constraint `source_k'.
+ dimension_type index_non_zero = 0;
+ for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+ WEIGHT_BEGIN();
+ Scalar_Products::assign(scalar_prod[index_non_zero],
+ source_k,
+ dest.sys.rows[index_non_zero]);
+ WEIGHT_ADD_MUL(17, source_space_dim);
+ if (scalar_prod[index_non_zero] != 0)
+ // The generator does not saturate the constraint.
+ break;
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+ WEIGHT_BEGIN();
+ Scalar_Products::assign(scalar_prod[i], source_k, dest.sys.rows[i]);
+ WEIGHT_ADD_MUL(25, source_space_dim);
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+
+ // We first treat the case when `index_non_zero' is less than
+ // `num_lines_or_equalities', i.e., when the generator that
+ // does not saturate the constraint `source_k' is a line.
+ // The other case (described later) is when all the lines
+ // in `dest_rows' (i.e., all the rows having indexes less than
+ // `num_lines_or_equalities') do saturate the constraint.
+
+ if (index_non_zero < num_lines_or_equalities) {
+ // Since the generator `dest_rows[index_non_zero]' does not saturate
+ // the constraint `source_k', it can no longer be a line
+ // (see saturation rule in Section \ref prelims).
+ // Therefore, we first transform it to a ray.
+ dest.sys.rows[index_non_zero].set_is_ray_or_point_or_inequality();
+ // Of the two possible choices, we select the ray satisfying
+ // the constraint (namely, the ray whose scalar product
+ // with the constraint gives a positive result).
+ if (scalar_prod[index_non_zero] < 0) {
+ // The ray `dest_rows[index_non_zero]' lies on the wrong half-space:
+ // we change it to have the opposite direction.
+ neg_assign(scalar_prod[index_non_zero]);
+ neg_assign(dest.sys.rows[index_non_zero].expr);
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ }
+ // Having changed a line to a ray, we set `dest_rows' to be a
+ // non-sorted system, we decrement the number of lines of `dest_rows'
+ // and, if necessary, we move the new ray below all the remaining lines.
+ dest_sorted = false;
+ --num_lines_or_equalities;
+ if (index_non_zero != num_lines_or_equalities) {
+ swap(dest.sys.rows[index_non_zero],
+ dest.sys.rows[num_lines_or_equalities]);
+ swap(scalar_prod[index_non_zero],
+ scalar_prod[num_lines_or_equalities]);
+ }
+ const dest_row_type& dest_nle = dest.sys.rows[num_lines_or_equalities];
+
+ // Computing the new lineality space.
+ // Since each line must lie on the hyper-plane corresponding to
+ // the constraint `source_k', the scalar product between
+ // the line and the constraint must be 0.
+ // This property already holds for the lines having indexes
+ // between 0 and `index_non_zero' - 1.
+ // We have to consider the remaining lines, having indexes
+ // between `index_non_zero' and `num_lines_or_equalities' - 1.
+ // Each line that does not saturate the constraint has to be
+ // linearly combined with generator `dest_nle' so that the
+ // resulting new line saturates the constraint.
+ // Note that, by Observation 1 above, the resulting new line
+ // will still saturate all the constraints that were saturated by
+ // the old line.
+
+ Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities];
+ PPL_ASSERT(scalar_prod_nle != 0);
+ for (dimension_type
+ i = index_non_zero; i < num_lines_or_equalities; ++i) {
+ if (scalar_prod[i] != 0) {
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod_nle);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // dest[i][c] *= normalized_sp_n;
+ // dest[i][c] -= normalized_sp_i * dest_nle[c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ dest_row_type& dest_i = dest.sys.rows[i];
+ neg_assign(normalized_sp_i);
+ dest_i.expr.linear_combine(dest_nle.expr,
+ normalized_sp_o, normalized_sp_i);
+ dest_i.strong_normalize();
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ scalar_prod[i] = 0;
+ // dest_sorted has already been set to false.
+ }
+ }
+
+ // Computing the new pointed cone.
+ // Similarly to what we have done during the computation of
+ // the lineality space, we consider all the remaining rays
+ // (having indexes strictly greater than `num_lines_or_equalities')
+ // that do not saturate the constraint `source_k'. These rays
+ // are positively combined with the ray `dest_nle' so that the
+ // resulting new rays saturate the constraint.
+ for (dimension_type
+ i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) {
+ if (scalar_prod[i] != 0) {
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod_nle);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // dest[i][c] *= normalized_sp_n;
+ // dest[i][c] -= normalized_sp_i * dest_nle[c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ dest_row_type& dest_i = dest.sys.rows[i];
+ WEIGHT_BEGIN();
+ neg_assign(normalized_sp_i);
+ dest_i.expr.linear_combine(dest_nle.expr,
+ normalized_sp_o, normalized_sp_i);
+ dest_i.strong_normalize();
+ // The modified row may still not be OK(), so don't assert OK here.
+ // They are all checked at the end of this function.
+ scalar_prod[i] = 0;
+ // `dest_sorted' has already been set to false.
+ WEIGHT_ADD_MUL(41, source_space_dim);
+ }
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ // Since the `scalar_prod_nle' is positive (by construction), it
+ // does not saturate the constraint `source_k'. Therefore, if
+ // the constraint is an inequality, we set to 1 the
+ // corresponding element of `sat' ...
+ Bit_Row& sat_nle = sat[num_lines_or_equalities];
+ if (source_k.is_ray_or_point_or_inequality())
+ sat_nle.set(k - redundant_source_rows.size());
+ // ... otherwise, the constraint is an equality which is
+ // violated by the generator `dest_nle': the generator has to be
+ // removed from `dest_rows'.
+ else {
+ --dest_num_rows;
+ swap(dest.sys.rows[num_lines_or_equalities],
+ dest.sys.rows[dest_num_rows]);
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+
+ swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+ swap(sat_nle, sat[dest_num_rows]);
+ // dest_sorted has already been set to false.
+ }
+ }
+ // Here we have `index_non_zero' >= `num_lines_or_equalities',
+ // so that all the lines in `dest_rows' saturate the constraint `source_k'.
+ else {
+ // First, we reorder the generators in `dest_rows' as follows:
+ // -# all the lines should have indexes between 0 and
+ // `num_lines_or_equalities' - 1 (this already holds);
+ // -# all the rays that saturate the constraint should have
+ // indexes between `num_lines_or_equalities' and
+ // `lines_or_equal_bound' - 1; these rays form the set Q=.
+ // -# all the rays that have a positive scalar product with the
+ // constraint should have indexes between `lines_or_equal_bound'
+ // and `sup_bound' - 1; these rays form the set Q+.
+ // -# all the rays that have a negative scalar product with the
+ // constraint should have indexes between `sup_bound' and
+ // `dest_num_rows' - 1; these rays form the set Q-.
+ dimension_type lines_or_equal_bound = num_lines_or_equalities;
+ dimension_type inf_bound = dest_num_rows;
+ // While we find saturating generators, we simply increment
+ // `lines_or_equal_bound'.
+ while (inf_bound > lines_or_equal_bound
+ && scalar_prod[lines_or_equal_bound] == 0)
+ ++lines_or_equal_bound;
+ dimension_type sup_bound = lines_or_equal_bound;
+ while (inf_bound > sup_bound) {
+ const int sp_sign = sgn(scalar_prod[sup_bound]);
+ if (sp_sign == 0) {
+ // This generator has to be moved in Q=.
+ swap(dest.sys.rows[sup_bound], dest.sys.rows[lines_or_equal_bound]);
+ swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+ swap(sat[sup_bound], sat[lines_or_equal_bound]);
+ ++lines_or_equal_bound;
+ ++sup_bound;
+ dest_sorted = false;
+ }
+ else if (sp_sign < 0) {
+ // This generator has to be moved in Q-.
+ --inf_bound;
+ swap(dest.sys.rows[sup_bound], dest.sys.rows[inf_bound]);
+ swap(sat[sup_bound], sat[inf_bound]);
+ swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+ dest_sorted = false;
+ }
+ else
+ // sp_sign > 0: this generator has to be moved in Q+.
+ ++sup_bound;
+ }
+
+ if (sup_bound == dest_num_rows) {
+ // Here the set Q- is empty.
+ // If the constraint is an inequality, then all the generators
+ // in Q= and Q+ satisfy the constraint. The constraint is redundant
+ // and it can be safely removed from the constraint system.
+ // This is why the `source' parameter is not declared `const'.
+ if (source_k.is_ray_or_point_or_inequality()) {
+ redundant_source_rows.push_back(k);
+ }
+ else {
+ // The constraint is an equality, so that all the generators
+ // in Q+ violate it. Since the set Q- is empty, we can simply
+ // remove from `dest_rows' all the generators of Q+.
+ PPL_ASSERT(dest_num_rows >= lines_or_equal_bound);
+ while (dest_num_rows != lines_or_equal_bound) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ }
+ else {
+ // The set Q- is not empty, i.e., at least one generator
+ // violates the constraint `source_k'.
+ // We have to further distinguish two cases:
+ if (sup_bound == num_lines_or_equalities) {
+ // The set Q+ is empty, so that all generators that satisfy
+ // the constraint also saturate it.
+ // We can simply remove from `dest_rows' all the generators in Q-.
+ PPL_ASSERT(dest_num_rows >= sup_bound);
+ while (dest_num_rows != sup_bound) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ else {
+ // The sets Q+ and Q- are both non-empty.
+ // The generators of the new pointed cone are all those satisfying
+ // the constraint `source_k' plus a set of new rays enjoying
+ // the following properties:
+ // -# they lie on the hyper-plane represented by the constraint
+ // -# they are obtained as a positive combination of two
+ // adjacent rays, the first taken from Q+ and the second
+ // taken from Q-.
+
+ // The adjacency property is necessary to have an irredundant
+ // set of new rays (see proposition 2).
+ const dimension_type bound = dest_num_rows;
+
+ // In the following loop,
+ // `i' runs through the generators in the set Q+ and
+ // `j' runs through the generators in the set Q-.
+ for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) {
+ for(dimension_type j = sup_bound; j < bound; ++j) {
+ // Checking if generators `dest_rows[i]' and `dest_rows[j]' are
+ // adjacent.
+ // If there exist another generator that saturates
+ // all the constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]', then they are NOT adjacent.
+ PPL_ASSERT(sat[i].last() == C_Integer<unsigned long>::max
+ || sat[i].last() < k);
+ PPL_ASSERT(sat[j].last() == C_Integer<unsigned long>::max
+ || sat[j].last() < k);
+
+ // Being the union of `sat[i]' and `sat[j]',
+ // `new_satrow' corresponds to a ray that saturates all the
+ // constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]'.
+ Bit_Row new_satrow(sat[i], sat[j]);
+
+ // Compute the number of common saturators.
+ // NOTE: this number has to be less than `k' because
+ // we are treating the `k'-th constraint.
+ const dimension_type num_common_satur
+ = k - redundant_source_rows.size() - new_satrow.count_ones();
+
+ // Even before actually creating the new ray as a
+ // positive combination of `dest_rows[i]' and `dest_rows[j]',
+ // we exploit saturation information to check if
+ // it can be an extremal ray. To this end, we refer
+ // to the definition of a minimal proper face
+ // (see comments in Polyhedron_defs.hh):
+ // an extremal ray saturates at least `n' - `t' - 1
+ // constraints, where `n' is the dimension of the space
+ // and `t' is the dimension of the lineality space.
+ // Since `n == source_num_columns - 1' and
+ // `t == num_lines_or_equalities', we obtain that
+ // an extremal ray saturates at least
+ // `source_num_columns - num_lines_or_equalities - 2'
+ // constraints.
+ if (num_common_satur
+ >= source_num_columns - num_lines_or_equalities - 2) {
+ // The minimal proper face rule is satisfied.
+ // Now we actually check for redundancy by computing
+ // adjacency information.
+ bool redundant = false;
+ WEIGHT_BEGIN();
+ for (dimension_type
+ l = num_lines_or_equalities; l < bound; ++l)
+ if (l != i && l != j
+ && subset_or_equal(sat[l], new_satrow)) {
+ // Found another generator saturating all the
+ // constraints saturated by both `dest_rows[i]' and
+ // `dest_rows[j]'.
+ redundant = true;
+ break;
+ }
+ PPL_ASSERT(bound >= num_lines_or_equalities);
+ WEIGHT_ADD_MUL(15, bound - num_lines_or_equalities);
+ if (!redundant) {
+ // Adding the new ray to `dest_rows' and the corresponding
+ // saturation row to `sat'.
+ dest_row_type new_row;
+ if (recyclable_dest_rows.empty()) {
+ sat.add_recycled_row(new_satrow);
+ }
+ else {
+ swap(new_row, recyclable_dest_rows.back());
+ recyclable_dest_rows.pop_back();
+ new_row.set_space_dimension_no_ok(source_space_dim);
+ swap(sat[dest_num_rows], new_satrow);
+ }
+
+ // The following fragment optimizes the computation of
+ //
+ // <CODE>
+ // Coefficient scale = scalar_prod[i];
+ // scale.gcd_assign(scalar_prod[j]);
+ // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+ // Coefficient normalized_sp_j = scalar_prod[j] / scale;
+ // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ // new_row[c] = normalized_sp_i * dest[j][c];
+ // new_row[c] -= normalized_sp_j * dest[i][c];
+ // }
+ // </CODE>
+ normalize2(scalar_prod[i],
+ scalar_prod[j],
+ normalized_sp_i,
+ normalized_sp_o);
+ WEIGHT_BEGIN();
+
+ neg_assign(normalized_sp_o);
+ new_row = dest.sys.rows[j];
+ // TODO: Check if the following assertions hold.
+ PPL_ASSERT(normalized_sp_i != 0);
+ PPL_ASSERT(normalized_sp_o != 0);
+ new_row.expr.linear_combine(dest.sys.rows[i].expr,
+ normalized_sp_i, normalized_sp_o);
+
+ WEIGHT_ADD_MUL(86, source_space_dim);
+ new_row.strong_normalize();
+ // Don't assert new_row.OK() here, because it may fail if
+ // the parameter `dest' contained a row that wasn't ok.
+ // Since we added a new generator to `dest_rows',
+ // we also add a new element to `scalar_prod';
+ // by construction, the new ray lies on the hyper-plane
+ // represented by the constraint `source_k'.
+ // Thus, the added scalar product is 0.
+ PPL_ASSERT(scalar_prod.size() >= dest_num_rows);
+ if (scalar_prod.size() <= dest_num_rows)
+ scalar_prod.push_back(Coefficient_zero());
+ else
+ scalar_prod[dest_num_rows] = Coefficient_zero();
+
+ dest.sys.rows.resize(dest.sys.rows.size() + 1);
+ swap(dest.sys.rows.back(), new_row);
+ // Increment the number of generators.
+ ++dest_num_rows;
+ } // if (!redundant)
+ }
+ }
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+ }
+ // Now we substitute the rays in Q- (i.e., the rays violating
+ // the constraint) with the newly added rays.
+ dimension_type j;
+ if (source_k.is_ray_or_point_or_inequality()) {
+ // The constraint is an inequality:
+ // the violating generators are those in Q-.
+ j = sup_bound;
+ // For all the generators in Q+, set to 1 the corresponding
+ // entry for the constraint `source_k' in the saturation matrix.
+
+ // After the removal of redundant rows in `source', the k-th
+ // row will have index `new_k'.
+ const dimension_type new_k = k - redundant_source_rows.size();
+ for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+ sat[l].set(new_k);
+ }
+ else
+ // The constraint is an equality:
+ // the violating generators are those in the union of Q+ and Q-.
+ j = lines_or_equal_bound;
+
+ // Swapping the newly added rays
+ // (index `i' running through `dest_num_rows - 1' down-to `bound')
+ // with the generators violating the constraint
+ // (index `j' running through `j' up-to `bound - 1').
+ dimension_type i = dest_num_rows;
+ while (j < bound && i > bound) {
+ --i;
+ swap(dest.sys.rows[i], dest.sys.rows[j]);
+ swap(scalar_prod[i], scalar_prod[j]);
+ swap(sat[i], sat[j]);
+ ++j;
+ dest_sorted = false;
+ }
+ // Setting the number of generators in `dest':
+ // - if the number of generators violating the constraint
+ // is less than or equal to the number of the newly added
+ // generators, we assign `i' to `dest_num_rows' because
+ // all generators above this index are significant;
+ // - otherwise, we assign `j' to `dest_num_rows' because
+ // all generators below index `j-1' violates the constraint.
+ const dimension_type new_num_rows = (j == bound) ? i : j;
+ PPL_ASSERT(dest_num_rows >= new_num_rows);
+ while (dest_num_rows != new_num_rows) {
+ recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+ swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+ dest.sys.rows.pop_back();
+ --dest_num_rows;
+ }
+ PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+ }
+ }
+ }
+ }
+
+ // We may have identified some redundant constraints in `source',
+ // which have been swapped at the end of the system.
+ if (redundant_source_rows.size() > 0) {
+ source.remove_rows(redundant_source_rows);
+ sat.remove_trailing_columns(redundant_source_rows.size());
+ }
+
+ // If `start == 0', then `source' was sorted and remained so.
+ // If otherwise `start > 0', then the two sub-system made by the
+ // non-pending rows and the pending rows, respectively, were both sorted.
+ // Thus, the overall system is sorted if and only if either
+ // `start == source_num_rows' (i.e., the second sub-system is empty)
+ // or the row ordering holds for the two rows at the boundary between
+ // the two sub-systems.
+ if (start > 0 && start < source.num_rows())
+ source.set_sorted(compare(source[start - 1], source[start]) <= 0);
+ // There are no longer pending constraints in `source'.
+ source.unset_pending_rows();
+
+ // We may have identified some redundant rays in `dest_rows',
+ // which have been swapped into recyclable_dest_rows.
+ if (!recyclable_dest_rows.empty()) {
+ const dimension_type num_removed_rows = recyclable_dest_rows.size();
+ sat.remove_trailing_rows(num_removed_rows);
+ }
+ if (dest_sorted)
+ // If the non-pending generators in `dest' are still declared to be
+ // sorted, then we have to also check for the sortedness of the
+ // pending generators.
+ for (dimension_type i = dest_first_pending_row; i < dest_num_rows; ++i)
+ if (compare(dest.sys.rows[i - 1], dest.sys.rows[i]) > 0) {
+ dest_sorted = false;
+ break;
+ }
+
+#ifndef NDEBUG
+ // The previous code can modify the rows' fields, exploiting the friendness.
+ // Check that all rows are OK now.
+ for (dimension_type i = dest.num_rows(); i-- > 0; )
+ PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+ dest.sys.index_first_pending = dest.num_rows();
+ dest.set_sorted(dest_sorted);
+ PPL_ASSERT(dest.sys.OK());
+
+ return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_minimize_templates.hh line 1. */
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_minimize_templates.hh line 29. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ <CODE>true</CODE> if the polyhedron is empty, <CODE>false</CODE>
+ otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source represents the constraints,
+ <CODE>false</CODE> otherwise;
+
+ \param source
+ The given system, which is not empty;
+
+ \param dest
+ The system to build and minimize;
+
+ \param sat
+ The saturation matrix.
+
+ \p dest is not <CODE>const</CODE> because it will be built (and then
+ modified) during minimize(). Also, \p sat and \p source are
+ not <CODE>const</CODE> because the former will be built during
+ \p dest creation and the latter will maybe be sorted and modified by
+ <CODE>conversion()</CODE> and <CODE>simplify()</CODE>.
+
+ \p sat has the generators on its columns and the constraints on its rows
+ if \p con_to_gen is <CODE>true</CODE>, otherwise it has the generators on
+ its rows and the constraints on its columns.
+
+ Given \p source, this function builds (by means of
+ <CODE>conversion()</CODE>) \p dest and then simplifies (invoking
+ <CODE>simplify()</CODE>) \p source, erasing redundant rows.
+ For the sequel we assume that \p source is the system of constraints
+ and \p dest is the system of generators.
+ This will simplify the description of the function; the dual case is
+ similar.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::minimize(const bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat) {
+
+ typedef typename Dest_Linear_System::row_type dest_row_type;
+
+ // Topologies have to agree.
+ PPL_ASSERT(source.topology() == dest.topology());
+ // `source' cannot be empty: even if it is an empty constraint system,
+ // representing the universe polyhedron, homogenization has added
+ // the positive constraint. It also cannot be an empty generator system,
+ // since this function is always called starting from a non-empty
+ // polyhedron.
+ PPL_ASSERT(!source.has_no_rows());
+
+ // Sort the source system, if necessary.
+ if (!source.is_sorted())
+ source.sort_rows();
+
+ // Initialization of the system of generators `dest'.
+ // The algorithm works incrementally and we haven't seen any
+ // constraint yet: as a consequence, `dest' should describe
+ // the universe polyhedron of the appropriate dimension.
+ // To this end, we initialize it to the identity matrix of dimension
+ // `source.num_columns()': the rows represent the lines corresponding
+ // to the canonical basis of the vector space.
+ dimension_type dest_num_rows
+ = source.topology() == NECESSARILY_CLOSED ? source.space_dimension() + 1
+ : source.space_dimension() + 2;
+
+ dest.clear();
+ dest.set_space_dimension(source.space_dimension());
+
+ // Initialize `dest' to the identity matrix.
+ for (dimension_type i = 0; i < dest_num_rows; ++i) {
+ Linear_Expression expr;
+ expr.set_space_dimension(dest_num_rows - 1);
+ if (i == 0)
+ expr += 1;
+ else
+ expr += Variable(i - 1);
+ dest_row_type dest_i(expr, dest_row_type::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+ if (dest.topology() == NOT_NECESSARILY_CLOSED)
+ dest_i.mark_as_not_necessarily_closed();
+ dest.sys.insert_no_ok(dest_i, Recycle_Input());
+ }
+ // The identity matrix `dest' is not sorted (see the sorting rules
+ // in Constrant.cc and Generator.cc).
+ dest.set_sorted(false);
+
+ // NOTE: the system `dest', as it is now, is not a _legal_ system of
+ // generators, because in the first row we have a line with a
+ // non-zero divisor (which should only happen for
+ // points). However, this is NOT a problem, because `source'
+ // necessarily contains the positivity constraint (or a
+ // combination of it with another constraint) which will
+ // restore things as they should be.
+
+
+ // Building a saturation matrix and initializing it by setting
+ // all of its elements to zero. This matrix will be modified together
+ // with `dest' during the conversion.
+ // NOTE: since we haven't seen any constraint yet, the relevant
+ // portion of `tmp_sat' is the sub-matrix consisting of
+ // the first 0 columns: thus the relevant portion correctly
+ // characterizes the initial saturation information.
+ Bit_Matrix tmp_sat(dest_num_rows, source.num_rows());
+
+ // By invoking the function conversion(), we populate `dest' with
+ // the generators characterizing the polyhedron described by all
+ // the constraints in `source'.
+ // The `start' parameter is zero (we haven't seen any constraint yet)
+ // and the 5th parameter (representing the number of lines in `dest'),
+ // by construction, is equal to `dest_num_rows'.
+ const dimension_type num_lines_or_equalities
+ = conversion(source, 0U, dest, tmp_sat, dest_num_rows);
+ // conversion() may have modified the number of rows in `dest'.
+ dest_num_rows = dest.num_rows();
+
+#ifndef NDEBUG
+ for (dimension_type i = dest.num_rows(); i-- > 0; )
+ PPL_ASSERT(dest[i].OK());
+#endif
+
+ // Checking if the generators in `dest' represent an empty polyhedron:
+ // the polyhedron is empty if there are no points
+ // (because rays, lines and closure points need a supporting point).
+ // Points can be detected by looking at:
+ // - the divisor, for necessarily closed polyhedra;
+ // - the epsilon coordinate, for NNC polyhedra.
+ dimension_type first_point;
+ if (dest.is_necessarily_closed()) {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.inhomogeneous_term() > 0)
+ break;
+ }
+ else {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+ break;
+ }
+
+ if (first_point == dest_num_rows)
+ if (con_to_gen)
+ // No point has been found: the polyhedron is empty.
+ return true;
+ else {
+ // Here `con_to_gen' is false: `dest' is a system of constraints.
+ // In this case the condition `first_point == dest_num_rows'
+ // actually means that all the constraints in `dest' have their
+ // inhomogeneous term equal to 0.
+ // This is an ILLEGAL situation, because it implies that
+ // the constraint system `dest' lacks the positivity constraint
+ // and no linear combination of the constraints in `dest'
+ // can reintroduce the positivity constraint.
+ PPL_UNREACHABLE;
+ return false;
+ }
+ else {
+ // A point has been found: the polyhedron is not empty.
+ // Now invoking simplify() to remove all the redundant constraints
+ // from the system `source'.
+ // Since the saturation matrix `tmp_sat' returned by conversion()
+ // has rows indexed by generators (the rows of `dest') and columns
+ // indexed by constraints (the rows of `source'), we have to
+ // transpose it to obtain the saturation matrix needed by simplify().
+ sat.transpose_assign(tmp_sat);
+ simplify(source, sat);
+ return false;
+ }
+}
+
+
+/*!
+ \return
+ <CODE>true</CODE> if the obtained polyhedron is empty,
+ <CODE>false</CODE> otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source1 and \p source2 are system of
+ constraints, <CODE>false</CODE> otherwise;
+
+ \param source1
+ The first element of the given DD pair;
+
+ \param dest
+ The second element of the given DD pair;
+
+ \param sat
+ The saturation matrix that bind \p source1 to \p dest;
+
+ \param source2
+ The new system of generators or constraints.
+
+ It is assumed that \p source1 and \p source2 are sorted and have
+ no pending rows. It is also assumed that \p dest has no pending rows.
+ On entry, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of \p source1.
+ On exit, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of the system obtained
+ by merging \p source1 and \p source2.
+
+ Let us suppose we want to add some constraints to a given system of
+ constraints \p source1. This method, given a minimized double description
+ pair (\p source1, \p dest) and a system of new constraints \p source2,
+ modifies \p source1 by adding to it the constraints of \p source2 that
+ are not in \p source1. Then, by invoking
+ <CODE>add_and_minimize(bool, Linear_System_Class&, Linear_System_Class&, Bit_Matrix&)</CODE>,
+ processes the added constraints obtaining a new DD pair.
+
+ This method treats also the dual case, i.e., adding new generators to
+ a previous system of generators. In this case \p source1 contains the
+ old generators, \p source2 the new ones and \p dest is the system
+ of constraints in the given minimized DD pair.
+
+ Since \p source2 contains the constraints (or the generators) that
+ will be added to \p source1, it is constant: it will not be modified.
+*/
+template <typename Source_Linear_System1, typename Source_Linear_System2,
+ typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+ Source_Linear_System1& source1,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat,
+ const Source_Linear_System2& source2) {
+ // `source1' and `source2' cannot be empty.
+ PPL_ASSERT(!source1.has_no_rows() && !source2.has_no_rows());
+ // `source1' and `source2' must have the same number of columns
+ // to be merged.
+ PPL_ASSERT(source1.num_columns() == source2.num_columns());
+ // `source1' and `source2' are fully sorted.
+ PPL_ASSERT(source1.is_sorted() && source1.num_pending_rows() == 0);
+ PPL_ASSERT(source2.is_sorted() && source2.num_pending_rows() == 0);
+ PPL_ASSERT(dest.num_pending_rows() == 0);
+
+ const dimension_type old_source1_num_rows = source1.num_rows();
+ // `k1' and `k2' run through the rows of `source1' and `source2', resp.
+ dimension_type k1 = 0;
+ dimension_type k2 = 0;
+ dimension_type source2_num_rows = source2.num_rows();
+ while (k1 < old_source1_num_rows && k2 < source2_num_rows) {
+ // Add to `source1' the constraints from `source2', as pending rows.
+ // We exploit the property that initially both `source1' and `source2'
+ // are sorted and index `k1' only scans the non-pending rows of `source1',
+ // so that it is not influenced by the pending rows appended to it.
+ // This way no duplicate (i.e., trivially redundant) constraint
+ // is introduced in `source1'.
+ const int cmp = compare(source1[k1], source2[k2]);
+ if (cmp == 0) {
+ // We found the same row: there is no need to add `source2[k2]'.
+ ++k2;
+ // By sortedness, since `k1 < old_source1_num_rows',
+ // we can increment index `k1' too.
+ ++k1;
+ }
+ else if (cmp < 0)
+ // By sortedness, we can increment `k1'.
+ ++k1;
+ else {
+ // Here `cmp > 0'.
+ // By sortedness, `source2[k2]' cannot be in `source1'.
+ // We add it as a pending row of `source1' (sortedness unaffected).
+ source1.add_pending_row(source2[k2]);
+ // We can increment `k2'.
+ ++k2;
+ }
+ }
+ // Have we scanned all the rows in `source2'?
+ if (k2 < source2_num_rows)
+ // By sortedness, all the rows in `source2' having indexes
+ // greater than or equal to `k2' were not in `source1'.
+ // We add them as pending rows of 'source1' (sortedness not affected).
+ for ( ; k2 < source2_num_rows; ++k2)
+ source1.add_pending_row(source2[k2]);
+
+ if (source1.num_pending_rows() == 0)
+ // No row was appended to `source1', because all the constraints
+ // in `source2' were already in `source1'.
+ // There is nothing left to do ...
+ return false;
+
+ return add_and_minimize(con_to_gen, source1, dest, sat);
+}
+
+/*!
+ \return
+ <CODE>true</CODE> if the obtained polyhedron is empty,
+ <CODE>false</CODE> otherwise.
+
+ \param con_to_gen
+ <CODE>true</CODE> if \p source is a system of constraints,
+ <CODE>false</CODE> otherwise;
+
+ \param source
+ The first element of the given DD pair. It also contains the pending
+ rows to be processed;
+
+ \param dest
+ The second element of the given DD pair. It cannot have pending rows;
+
+ \param sat
+ The saturation matrix that bind the upper part of \p source to \p dest.
+
+ On entry, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the non-pending rows of \p source.
+ On exit, the rows of \p sat are indexed by the rows of \p dest
+ and its columns are indexed by the rows of \p source.
+
+ Let us suppose that \p source is a system of constraints.
+ This method assumes that the non-pending part of \p source and
+ system \p dest form a double description pair in minimal form and
+ will build a new DD pair in minimal form by processing the pending
+ constraints in \p source. To this end, it will call
+ <CODE>conversion()</CODE>) and <CODE>simplify</CODE>.
+
+ This method treats also the dual case, i.e., processing pending
+ generators. In this case \p source contains generators and \p dest
+ is the system of constraints corresponding to the non-pending part
+ of \p source.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+ Source_Linear_System& source,
+ Dest_Linear_System& dest,
+ Bit_Matrix& sat) {
+ PPL_ASSERT(source.num_pending_rows() > 0);
+ PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+ PPL_ASSERT(source.is_sorted());
+
+ // First, pad the saturation matrix with new columns (of zeroes)
+ // to accommodate for the pending rows of `source'.
+ sat.resize(dest.num_rows(), source.num_rows());
+
+ // Incrementally compute the new system of generators.
+ // Parameter `start' is set to the index of the first pending constraint.
+ const dimension_type num_lines_or_equalities
+ = conversion(source, source.first_pending_row(),
+ dest, sat,
+ dest.num_lines_or_equalities());
+
+ // conversion() may have modified the number of rows in `dest'.
+ const dimension_type dest_num_rows = dest.num_rows();
+
+ // Checking if the generators in `dest' represent an empty polyhedron:
+ // the polyhedron is empty if there are no points
+ // (because rays, lines and closure points need a supporting point).
+ // Points can be detected by looking at:
+ // - the divisor, for necessarily closed polyhedra;
+ // - the epsilon coordinate, for NNC polyhedra.
+ dimension_type first_point;
+ if (dest.is_necessarily_closed()) {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.inhomogeneous_term() > 0)
+ break;
+ }
+ else {
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+ break;
+ }
+
+ if (first_point == dest_num_rows)
+ if (con_to_gen)
+ // No point has been found: the polyhedron is empty.
+ return true;
+ else {
+ // Here `con_to_gen' is false: `dest' is a system of constraints.
+ // In this case the condition `first_point == dest_num_rows'
+ // actually means that all the constraints in `dest' have their
+ // inhomogeneous term equal to 0.
+ // This is an ILLEGAL situation, because it implies that
+ // the constraint system `dest' lacks the positivity constraint
+ // and no linear combination of the constraints in `dest'
+ // can reintroduce the positivity constraint.
+ PPL_UNREACHABLE;
+ return false;
+ }
+ else {
+ // A point has been found: the polyhedron is not empty.
+ // Now invoking `simplify()' to remove all the redundant constraints
+ // from the system `source'.
+ // Since the saturation matrix `sat' returned by `conversion()'
+ // has rows indexed by generators (the rows of `dest') and columns
+ // indexed by constraints (the rows of `source'), we have to
+ // transpose it to obtain the saturation matrix needed by `simplify()'.
+ sat.transpose();
+ simplify(source, sat);
+ // Transposing back.
+ sat.transpose();
+ return false;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_simplify_templates.hh line 1. */
+/* Polyhedron class implementation: simplify().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_simplify_templates.hh line 29. */
+#include <cstddef>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+ \return
+ The rank of \p sys.
+
+ \param sys
+ The system to simplify: it will be modified;
+
+ \param sat
+ The saturation matrix corresponding to \p sys.
+
+ \p sys may be modified by swapping some of its rows and by possibly
+ removing some of them, if they turn out to be redundant.
+
+ If \p sys is a system of constraints, then the rows of \p sat are
+ indexed by constraints and its columns are indexed by generators;
+ otherwise, if \p sys is a system of generators, then the rows of
+ \p sat are indexed by generators and its columns by constraints.
+
+ Given a system of constraints or a system of generators, this function
+ simplifies it using Gauss' elimination method (to remove redundant
+ equalities/lines), deleting redundant inequalities/rays/points and
+ making back-substitution.
+ The explanation that follows assumes that \p sys is a system of
+ constraints. For the case when \p sys is a system of generators,
+ a similar explanation can be obtain by applying duality.
+
+ The explanation relies on the notion of <EM>redundancy</EM>.
+ (See the Introduction.)
+
+ First we make some observations that can help the reader
+ in understanding the function:
+
+ Proposition: An inequality that is saturated by all the generators
+ can be transformed to an equality.
+
+ In fact, by combining any number of generators that saturate the
+ constraints, we obtain a generator that saturates the constraints too:
+ \f[
+ \langle \vect{c}, \vect{r}_1 \rangle = 0 \land
+ \langle \vect{c}, \vect{r}_2 \rangle = 0
+ \Rightarrow
+ \langle \vect{c}, (\lambda_1 \vect{r}_1 + \lambda_2 \vect{r}_2) \rangle =
+ \lambda_1 \langle \vect{c}, \vect{r}_1 \rangle
+ + \lambda_2 \langle \vect{c}, \vect{r}_2 \rangle
+ = 0,
+ \f]
+ where \f$\lambda_1, \lambda_2\f$ can be any real number.
+*/
+template <typename Linear_System1>
+dimension_type
+Polyhedron::simplify(Linear_System1& sys, Bit_Matrix& sat) {
+
+ typedef typename Linear_System1::row_type sys_row_type;
+
+ dimension_type num_rows = sys.num_rows();
+ const dimension_type num_cols_sat = sat.num_columns();
+
+ using std::swap;
+
+ // Looking for the first inequality in `sys'.
+ dimension_type num_lines_or_equalities = 0;
+ while (num_lines_or_equalities < num_rows
+ && sys[num_lines_or_equalities].is_line_or_equality())
+ ++num_lines_or_equalities;
+
+ // `num_saturators[i]' will contain the number of generators
+ // that saturate the constraint `sys[i]'.
+ if (num_rows > simplify_num_saturators_size) {
+ delete [] simplify_num_saturators_p;
+ simplify_num_saturators_p = 0;
+ simplify_num_saturators_size = 0;
+ const size_t max_size
+ = std::numeric_limits<size_t>::max() / sizeof(dimension_type);
+ const size_t new_size = compute_capacity(num_rows, max_size);
+ simplify_num_saturators_p = new dimension_type[new_size];
+ simplify_num_saturators_size = new_size;
+ }
+ dimension_type* const num_saturators = simplify_num_saturators_p;
+
+ bool sys_sorted = sys.is_sorted();
+
+ // Computing the number of saturators for each inequality,
+ // possibly identifying and swapping those that happen to be
+ // equalities (see Proposition above).
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) {
+ if (sat[i].empty()) {
+ // The constraint `sys_rows[i]' is saturated by all the generators.
+ // Thus, either it is already an equality or it can be transformed
+ // to an equality (see Proposition above).
+ sys.sys.rows[i].set_is_line_or_equality();
+ // Note: simple normalization already holds.
+ sys.sys.rows[i].sign_normalize();
+ // We also move it just after all the other equalities,
+ // so that system `sys_rows' keeps its partial sortedness.
+ if (i != num_lines_or_equalities) {
+ sys.sys.rows[i].m_swap(sys.sys.rows[num_lines_or_equalities]);
+ swap(sat[i], sat[num_lines_or_equalities]);
+ swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+ }
+ ++num_lines_or_equalities;
+ // `sys' is no longer sorted.
+ sys_sorted = false;
+ }
+ else
+ // There exists a generator which does not saturate `sys[i]',
+ // so that `sys[i]' is indeed an inequality.
+ // We store the number of its saturators.
+ num_saturators[i] = num_cols_sat - sat[i].count_ones();
+ }
+
+ sys.set_sorted(sys_sorted);
+ PPL_ASSERT(sys.OK());
+
+ // At this point, all the equalities of `sys' (included those
+ // inequalities that we just transformed to equalities) have
+ // indexes between 0 and `num_lines_or_equalities' - 1,
+ // which is the property needed by method gauss().
+ // We can simplify the system of equalities, obtaining the rank
+ // of `sys' as result.
+ const dimension_type rank = sys.gauss(num_lines_or_equalities);
+
+ // Now the irredundant equalities of `sys' have indexes from 0
+ // to `rank' - 1, whereas the equalities having indexes from `rank'
+ // to `num_lines_or_equalities' - 1 are all redundant.
+ // (The inequalities in `sys' have been left untouched.)
+ // The rows containing equalities are not sorted.
+
+ if (rank < num_lines_or_equalities) {
+ // We identified some redundant equalities.
+ // Moving them at the bottom of `sys':
+ // - index `redundant' runs through the redundant equalities
+ // - index `erasing' identifies the first row that should
+ // be erased after this loop.
+ // Note that we exit the loop either because we have removed all
+ // redundant equalities or because we have moved all the
+ // inequalities.
+ for (dimension_type redundant = rank,
+ erasing = num_rows;
+ redundant < num_lines_or_equalities
+ && erasing > num_lines_or_equalities;
+ ) {
+ --erasing;
+ sys.remove_row(redundant);
+ swap(sat[redundant], sat[erasing]);
+ swap(num_saturators[redundant], num_saturators[erasing]);
+ ++redundant;
+ }
+ // Adjusting the value of `num_rows' to the number of meaningful
+ // rows of `sys': `num_lines_or_equalities' - `rank' is the number of
+ // redundant equalities moved to the bottom of `sys', which are
+ // no longer meaningful.
+ num_rows -= num_lines_or_equalities - rank;
+
+ // If the above loop exited because it moved all inequalities, it may not
+ // have removed all the rendundant rows.
+ sys.remove_trailing_rows(sys.num_rows() - num_rows);
+
+ PPL_ASSERT(sys.num_rows() == num_rows);
+
+ sat.remove_trailing_rows(num_lines_or_equalities - rank);
+
+ // Adjusting the value of `num_lines_or_equalities'.
+ num_lines_or_equalities = rank;
+ }
+
+ const dimension_type old_num_rows = sys.num_rows();
+
+ // Now we use the definition of redundancy (given in the Introduction)
+ // to remove redundant inequalities.
+
+ // First we check the saturation rule, which provides a necessary
+ // condition for an inequality to be irredundant (i.e., it provides
+ // a sufficient condition for identifying redundant inequalities).
+ // Let
+ //
+ // num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i],
+ // dim_lin_space = num_irredundant_lines,
+ // dim_ray_space
+ // = dim_vector_space - num_irredundant_equalities - dim_lin_space
+ // = num_columns - 1 - num_lines_or_equalities - dim_lin_space,
+ // min_sat_rays_or_points = dim_ray_space.
+ //
+ // An inequality saturated by less than `dim_ray_space' _rays/points_
+ // is redundant. Thus we have the implication
+ //
+ // (num_saturators[i] - num_sat_lines[i] < dim_ray_space)
+ // ==>
+ // redundant(sys[i]).
+ //
+ // Moreover, since every line saturates all inequalities, we also have
+ // dim_lin_space = num_sat_lines[i]
+ // so that we can rewrite the condition above as follows:
+ //
+ // (num_saturators[i] < num_columns - num_lines_or_equalities - 1)
+ // ==>
+ // redundant(sys[i]).
+ //
+ const dimension_type sys_num_columns
+ = sys.topology() == NECESSARILY_CLOSED ? sys.space_dimension() + 1
+ : sys.space_dimension() + 2;
+ const dimension_type min_saturators
+ = sys_num_columns - num_lines_or_equalities - 1;
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+ if (num_saturators[i] < min_saturators) {
+ // The inequality `sys[i]' is redundant.
+ --num_rows;
+ sys.remove_row(i);
+ swap(sat[i], sat[num_rows]);
+ swap(num_saturators[i], num_saturators[num_rows]);
+ }
+ else
+ ++i;
+ }
+
+ // Now we check the independence rule.
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+ bool redundant = false;
+ // NOTE: in the inner loop, index `j' runs through _all_ the
+ // inequalities and we do not test if `sat[i]' is strictly
+ // contained into `sat[j]'. Experimentation has shown that this
+ // is faster than having `j' only run through the indexes greater
+ // than `i' and also doing the test `strict_subset(sat[i],
+ // sat[k])'.
+ for (dimension_type j = num_lines_or_equalities; j < num_rows; ) {
+ if (i == j)
+ // We want to compare different rows of `sys'.
+ ++j;
+ else {
+ // Let us recall that each generator lies on a facet of the
+ // polyhedron (see the Introduction).
+ // Given two constraints `c_1' and `c_2', if there are `m'
+ // generators lying on the hyper-plane corresponding to `c_1',
+ // the same `m' generators lie on the hyper-plane
+ // corresponding to `c_2', too, and there is another one lying
+ // on the latter but not on the former, then `c_2' is more
+ // restrictive than `c_1', i.e., `c_1' is redundant.
+ bool strict_subset;
+ if (subset_or_equal(sat[j], sat[i], strict_subset))
+ if (strict_subset) {
+ // All the saturators of the inequality `sys[i]' are
+ // saturators of the inequality `sys[j]' too,
+ // and there exists at least one saturator of `sys[j]'
+ // which is not a saturator of `sys[i]'.
+ // It follows that inequality `sys[i]' is redundant.
+ redundant = true;
+ break;
+ }
+ else {
+ // We have `sat[j] == sat[i]'. Hence inequalities
+ // `sys[i]' and `sys[j]' are saturated by the same set of
+ // generators. Then we can remove either one of the two
+ // inequalities: we remove `sys[j]'.
+ --num_rows;
+ sys.remove_row(j);
+ PPL_ASSERT(sys.num_rows() == num_rows);
+ swap(sat[j], sat[num_rows]);
+ swap(num_saturators[j], num_saturators[num_rows]);
+ }
+ else
+ // If we reach this point then we know that `sat[i]' does
+ // not contain (and is different from) `sat[j]', so that
+ // `sys[i]' is not made redundant by inequality `sys[j]'.
+ ++j;
+ }
+ }
+ if (redundant) {
+ // The inequality `sys[i]' is redundant.
+ --num_rows;
+ sys.remove_row(i);
+ PPL_ASSERT(sys.num_rows() == num_rows);
+ swap(sat[i], sat[num_rows]);
+ swap(num_saturators[i], num_saturators[num_rows]);
+ }
+ else
+ // The inequality `sys[i]' is not redundant.
+ ++i;
+ }
+
+ // Here we physically remove the `sat' rows corresponding to the redundant
+ // inequalities previously removed from `sys'.
+ sat.remove_trailing_rows(old_num_rows - num_rows);
+
+ // At this point the first `num_lines_or_equalities' rows of 'sys'
+ // represent the irredundant equalities, while the remaining rows
+ // (i.e., those having indexes from `num_lines_or_equalities' to
+ // `num_rows' - 1) represent the irredundant inequalities.
+#ifndef NDEBUG
+ // Check if the flag is set (that of the equalities is already set).
+ for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i)
+ PPL_ASSERT(sys[i].is_ray_or_point_or_inequality());
+#endif
+
+ // Finally, since now the sub-system (of `sys') of the irredundant
+ // equalities is in triangular form, we back substitute each
+ // variables with the expression obtained considering the equalities
+ // starting from the last one.
+ sys.back_substitute(num_lines_or_equalities);
+
+ // The returned value is the number of irredundant equalities i.e.,
+ // the rank of the sub-system of `sys' containing only equalities.
+ // (See the Introduction for definition of lineality space dimension.)
+ return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 2862. */
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 1. */
+/* Grid class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 1. */
+/* Grid_Generator_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 33. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Grid_Generator_System
+ Writes <CODE>false</CODE> if \p gs is empty. Otherwise, writes on
+ \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator_System */
+void swap(Grid_Generator_System& x, Grid_Generator_System& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator_System is a system of
+ grid generators, i.e., a multiset of objects of the class
+ Grid_Generator (lines, parameters and points).
+ When inserting generators in a system, space dimensions are
+ automatically adjusted so that all the generators in the system
+ are defined on the same vector space.
+ A system of grid generators which is meant to define a non-empty
+ grid must include at least one point: the reason is that
+ lines and parameters need a supporting point
+ (lines only specify directions while parameters only
+ specify direction and distance.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code defines the line having the same direction
+ as the \f$x\f$ axis (i.e., the first Cartesian axis)
+ in \f$\Rset^2\f$:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_line(x + 0*y));
+ \endcode
+ As said above, this system of generators corresponds to
+ an empty grid, because the line has no supporting point.
+ To define a system of generators that does correspond to
+ the \f$x\f$ axis, we can add the following code which
+ inserts the origin of the space as a point:
+ \code
+ gs.insert(grid_point(0*x + 0*y));
+ \endcode
+ Since space dimensions are automatically adjusted, the following
+ code obtains the same effect:
+ \code
+ gs.insert(grid_point(0*x));
+ \endcode
+ In contrast, if we had added the following code, we would have
+ defined a line parallel to the \f$x\f$ axis through
+ the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+ \code
+ gs.insert(grid_point(0*x + 1*y));
+ \endcode
+
+ \par Example 2
+ The following code builds a system of generators corresponding
+ to the grid consisting of all the integral points on the \f$x\f$ axes;
+ that is, all points satisfying the congruence relation
+ \f[
+ \bigl\{\,
+ (x, 0)^\transpose \in \Rset^2
+ \bigm|
+ x \pmod{1}\ 0
+ \,\bigr\},
+ \f]
+ \code
+ Grid_Generator_System gs;
+ gs.insert(parameter(x + 0*y));
+ gs.insert(grid_point(0*x + 0*y));
+ \endcode
+
+ \par Example 3
+ The following code builds a system of generators having three points
+ corresponding to a non-relational grid consisting of all points
+ whose coordinates are integer multiple of 3.
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_point(0*x + 3*y));
+ gs.insert(grid_point(3*x + 0*y));
+ \endcode
+
+ \par Example 4
+ By using parameters instead of two of the points we
+ can define the same grid as that defined in the previous example.
+ Note that there has to be at least one point and, for this purpose,
+ any point in the grid could be considered.
+ Thus the following code builds two identical grids from the
+ grid generator systems \p gs and \p gs1.
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(parameter(0*x + 3*y));
+ gs.insert(parameter(3*x + 0*y));
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(3*x + 3*y));
+ gs1.insert(parameter(0*x + 3*y));
+ gs1.insert(parameter(3*x + 0*y));
+ \endcode
+
+ \par Example 5
+ The following code builds a system of generators having one point and
+ a parameter corresponding to all the integral points that
+ lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(1*x + 1*y));
+ gs.insert(parameter(1*x - 1*y));
+ \endcode
+
+ \note
+ After inserting a multiset of generators in a grid generator system,
+ there are no guarantees that an <EM>exact</EM> copy of them
+ can be retrieved:
+ in general, only an <EM>equivalent</EM> grid generator system
+ will be available, where original generators may have been
+ reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System {
+public:
+ typedef Grid_Generator row_type;
+
+ static const Representation default_representation = SPARSE;
+
+ //! Default constructor: builds an empty system of generators.
+ explicit Grid_Generator_System(Representation r = default_representation);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Grid_Generator_System(const Grid_Generator& g,
+ Representation r = default_representation);
+
+ //! Builds an empty system of generators of dimension \p dim.
+ explicit Grid_Generator_System(dimension_type dim,
+ Representation r = default_representation);
+
+ //! Ordinary copy constructor.
+ //! The new Grid_Generator_System will have the same representation as `gs'.
+ Grid_Generator_System(const Grid_Generator_System& gs);
+
+ //! Copy constructor with specified representation.
+ Grid_Generator_System(const Grid_Generator_System& gs, Representation r);
+
+ //! Destructor.
+ ~Grid_Generator_System();
+
+ //! Assignment operator.
+ Grid_Generator_System& operator=(const Grid_Generator_System& y);
+
+ //! Returns the current representation of *this.
+ Representation representation() const;
+
+ //! Converts *this to the specified representation.
+ void set_representation(Representation r);
+
+ //! Returns the maximum space dimension a Grid_Generator_System can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Removes all the generators from the generator system and sets its
+ space dimension to 0.
+ */
+ void clear();
+
+ /*! \brief
+ Inserts into \p *this a copy of the generator \p g, increasing the
+ number of space dimensions if needed.
+
+ If \p g is an all-zero parameter then the only action is to ensure
+ that the space dimension of \p *this is at least the space
+ dimension of \p g.
+ */
+ void insert(const Grid_Generator& g);
+
+ /*! \brief
+ Inserts into \p *this the generator \p g, increasing the number of
+ space dimensions if needed.
+ */
+ void insert(Grid_Generator& g, Recycle_Input);
+
+ /*! \brief
+ Inserts into \p *this the generators in \p gs, increasing the
+ number of space dimensions if needed.
+ */
+ void insert(Grid_Generator_System& gs, Recycle_Input);
+
+ //! Initializes the class.
+ static void initialize();
+
+ //! Finalizes the class.
+ static void finalize();
+
+ /*! \brief
+ Returns the singleton system containing only
+ Grid_Generator::zero_dim_point().
+ */
+ static const Grid_Generator_System& zero_dim_univ();
+
+ //! An iterator over a system of grid generators
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each generator contained in an object of Grid_Generator_System.
+
+ \par Example
+ The following code prints the system of generators
+ of the grid <CODE>gr</CODE>:
+ \code
+ const Grid_Generator_System& ggs = gr.generators();
+ for (Grid_Generator_System::const_iterator i = ggs.begin(),
+ ggs_end = ggs.end(); i != ggs_end; ++i)
+ cout << *i << endl;
+ \endcode
+ The same effect can be obtained more concisely by using
+ more features of the STL:
+ \code
+ const Grid_Generator_System& ggs = gr.generators();
+ copy(ggs.begin(), ggs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+ \endcode
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Grid_Generator,
+ ptrdiff_t,
+ const Grid_Generator*,
+ const Grid_Generator&> {
+ public:
+ //! Default constructor.
+ const_iterator();
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Destructor.
+ ~const_iterator();
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ const Grid_Generator& operator*() const;
+
+ //! Indirect member selector.
+ const Grid_Generator* operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ different.
+ */
+ bool operator!=(const const_iterator& y) const;
+
+ private:
+ friend class Grid_Generator_System;
+
+ Linear_System<Grid_Generator>::const_iterator i;
+
+ //! Copy constructor from Linear_System< Grid_Generator>::const_iterator.
+ const_iterator(const Linear_System<Grid_Generator>::const_iterator& y);
+ };
+
+ //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+ bool empty() const;
+
+ /*! \brief
+ Returns the const_iterator pointing to the first generator, if \p
+ *this is not empty; otherwise, returns the past-the-end
+ const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ //! Returns the number of rows (generators) in the system.
+ dimension_type num_rows() const;
+
+ //! Returns the number of parameters in the system.
+ dimension_type num_parameters() const;
+
+ //! Returns the number of lines in the system.
+ dimension_type num_lines() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this contains one or
+ more points.
+ */
+ bool has_points() const;
+
+ //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+ bool is_equal_to(const Grid_Generator_System& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+ Resizes the matrix of generators using the numbers of rows and columns
+ read from \p s, then initializes the coordinates of each generator
+ and its type reading the contents from \p s.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Grid_Generator_System& y);
+
+private:
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Grid_Generator& operator[](dimension_type k) const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ The variable to which the affine transformation is assigned;
+
+ \param expr
+ The numerator of the affine transformation:
+ \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+ \param denominator
+ The denominator of the affine transformation;
+
+ We allow affine transformations (see the Section \ref
+ rational_grid_operations)to have rational
+ coefficients. Since the coefficients of linear expressions are
+ integers we also provide an integer \p denominator that will
+ be used as denominator of the affine transformation. The
+ denominator is required to be a positive integer and its
+ default value is 1.
+
+ The affine transformation assigns to every variable \p v, in every
+ column, the follow expression:
+ \f[
+ \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+ {\mathrm{denominator}}.
+ \f]
+
+ \p expr is a constant parameter and unaltered by this computation.
+ */
+ void affine_image(Variable v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ /*! \brief
+ Adds \p dims rows and \p dims columns of zeroes to the matrix,
+ initializing the added rows as in the universe system.
+
+ \param dims
+ The number of rows and columns to be added: must be strictly
+ positive.
+
+ Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+ \times (c+dims)\f$ matrix
+ \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_universe_rows_and_columns(dimension_type dims);
+
+ //! Resizes the system to the specified space dimension.
+ void set_space_dimension(dimension_type space_dim);
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ The space dimension of the variable with the highest space
+ dimension in \p vars must be at most the space dimension
+ of \p this.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ //! Shift by \p n positions the coefficients of variables, starting from
+ //! the coefficient of \p v. This increases the space dimension by \p n.
+ void shift_space_dimensions(Variable v, dimension_type n);
+
+ //! Sets the index to indicate that the system has no pending rows.
+ void unset_pending_rows();
+
+ //! Permutes the space dimensions of the matrix.
+ /*
+ \param cycle
+ A vector representing a cycle of the permutation according to which the
+ columns must be rearranged.
+
+ The \p cycle vector represents a cycle of a permutation of space
+ dimensions.
+ For example, the permutation
+ \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+ represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+ */
+ void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+ bool has_no_rows() const;
+
+ //! Makes the system shrink by removing its \p n trailing rows.
+ void remove_trailing_rows(dimension_type n);
+
+ void insert_verbatim(const Grid_Generator& g);
+
+ //! Returns the system topology.
+ Topology topology() const;
+
+ //! Returns the index of the first pending row.
+ dimension_type first_pending_row() const;
+
+ Linear_System<Grid_Generator> sys;
+
+ /*! \brief
+ Holds (between class initialization and finalization) a pointer to
+ the singleton system containing only Grid_Generator::zero_dim_point().
+ */
+ static const Grid_Generator_System* zero_dim_univ_p;
+
+ friend bool
+ operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
+
+ //! Sets the index of the first pending row to \p i.
+ void set_index_first_pending_row(dimension_type i);
+
+ //! Removes all the invalid lines and parameters.
+ /*!
+ The invalid lines and parameters are those with all
+ the homogeneous terms set to zero.
+ */
+ void remove_invalid_lines_and_parameters();
+
+ friend class Polyhedron;
+ friend class Grid;
+};
+
+// Grid_Generator_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_inlines.hh line 1. */
+/* Grid_Generator_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+ sys.set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+ sys.unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+ sys.set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+ return sys.permute_space_dimensions(cycle);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+ return (sys == y.sys);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.set_sorted(false);
+ PPL_ASSERT(space_dimension() == 0);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+ : sys(gs.sys) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs,
+ Representation r)
+ : sys(gs.sys, r) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim,
+ Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.set_space_dimension(dim);
+ sys.set_sorted(false);
+ PPL_ASSERT(space_dimension() == dim);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g,
+ Representation r)
+ : sys(NECESSARILY_CLOSED, r) {
+ sys.insert(g);
+ sys.set_sorted(false);
+}
+
+inline
+Grid_Generator_System::~Grid_Generator_System() {
+}
+
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+ Grid_Generator_System tmp = y;
+ swap(*this, tmp);
+ return *this;
+}
+
+inline Representation
+Grid_Generator_System::representation() const {
+ return sys.representation();
+}
+
+inline void
+Grid_Generator_System::set_representation(Representation r) {
+ sys.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+ // Grid generators use an extra column for the parameter divisor.
+ return Linear_System<Grid_Generator>::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+ return sys.space_dimension();
+}
+
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+ PPL_ASSERT(zero_dim_univ_p != 0);
+ return *zero_dim_univ_p;
+}
+
+inline void
+Grid_Generator_System::clear() {
+ sys.clear();
+ sys.set_sorted(false);
+ sys.unset_pending_rows();
+ PPL_ASSERT(space_dimension() == 0);
+}
+
+inline void
+Grid_Generator_System::m_swap(Grid_Generator_System& y) {
+ swap(sys, y.sys);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+ return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+ return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline dimension_type
+Grid_Generator_System::num_rows() const {
+ return sys.num_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+ : i() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+ return *i;
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+ return i.operator->();
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+ const const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline bool
+Grid_Generator_System::empty() const {
+ return sys.has_no_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator
+::const_iterator(const Linear_System<Grid_Generator>::const_iterator& y)
+ : i(y) {
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+ return static_cast<Grid_Generator_System::const_iterator>(sys.begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+ return static_cast<Grid_Generator_System::const_iterator>(sys.end());
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+ return sys[k];
+}
+
+inline bool
+Grid_Generator_System::has_no_rows() const {
+ return sys.has_no_rows();
+}
+
+inline void
+Grid_Generator_System::remove_trailing_rows(dimension_type n) {
+ sys.remove_trailing_rows(n);
+}
+
+inline void
+Grid_Generator_System::insert_verbatim(const Grid_Generator& g) {
+ sys.insert(g);
+}
+
+inline Topology
+Grid_Generator_System::topology() const {
+ return sys.topology();
+}
+
+inline dimension_type
+Grid_Generator_System::first_pending_row() const {
+ return sys.first_pending_row();
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y) {
+ return x.is_equal_to(y);
+}
+
+/*! \relates Grid_Generator_System */
+inline void
+swap(Grid_Generator_System& x, Grid_Generator_System& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 47. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Grid
+ Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+ is written if \p gr is an empty grid; <CODE>true</CODE> is written
+ if \p gr is a universe grid; a minimized system of congruences
+ defining \p gr is written otherwise, all congruences in one row
+ separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid */
+void swap(Grid& x, Grid& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+ grid.
+
+ \relates Grid
+ Note that \p x and \p y may be dimension-incompatible grids: in
+ those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different
+ grids.
+
+ \relates Grid
+ Note that \p x and \p y may be dimension-incompatible grids: in
+ those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid represents a rational grid.
+
+ The domain of grids <EM>optimally supports</EM>:
+ - all (proper and non-proper) congruences;
+ - tautological and inconsistent constraints;
+ - linear equality constraints (i.e., non-proper congruences).
+
+ Depending on the method, using a constraint that is not optimally
+ supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ The domain of grids support a concept of double description similar
+ to the one developed for polyhedra: hence, a grid can be specified
+ as either a finite system of congruences or a finite system of
+ generators (see Section \ref sect_rational_grids) and it is always
+ possible to obtain either representation.
+ That is, if we know the system of congruences, we can obtain
+ from this a system of generators that define the same grid
+ and vice versa.
+ These systems can contain redundant members, or they can be in the
+ minimal form.
+
+ A key attribute of any grid is its space dimension (the dimension
+ \f$n \in \Nset\f$ of the enclosing vector space):
+
+ - all grids, the empty ones included, are endowed with a space
+ dimension;
+ - most operations working on a grid and another object (another
+ grid, a congruence, a generator, a set of variables, etc.) will
+ throw an exception if the grid and the object are not
+ dimension-compatible (see Section \ref Grid_Space_Dimensions);
+ - the only ways in which the space dimension of a grid can be
+ changed are with <EM>explicit</EM> calls to operators provided for
+ that purpose, and with standard copy, assignment and swap
+ operators.
+
+ Note that two different grids can be defined on the zero-dimension
+ space: the empty grid and the universe grid \f$R^0\f$.
+
+ \par
+ In all the examples it is assumed that variables
+ <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+ used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a grid corresponding to the even integer
+ pairs in \f$\Rset^2\f$, given as a system of congruences:
+ \code
+ Congruence_System cgs;
+ cgs.insert((x %= 0) / 2);
+ cgs.insert((y %= 0) / 2);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying three of the points:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_point(0*x + 2*y));
+ gs.insert(grid_point(2*x + 0*y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 2
+ The following code builds a grid corresponding to a line in
+ \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x - y == 0);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying a point and a line:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(grid_line(x + y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 3
+ The following code builds a grid corresponding to the integral
+ points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+ by adding an equality and congruence to the universe grid:
+ \code
+ Congruence_System cgs;
+ cgs.insert(x - y == 0);
+ cgs.insert(x %= 0);
+ Grid gr(cgs);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from a system of generators specifying a point and a parameter:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*x + 0*y));
+ gs.insert(parameter(x + y));
+ Grid gr(gs);
+ \endcode
+
+ \par Example 4
+ The following code builds the grid corresponding to a plane by
+ creating the universe grid in \f$\Rset^2\f$:
+ \code
+ Grid gr(2);
+ \endcode
+ The following code builds the same grid as above, but starting
+ from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+ generators (a point, and two lines).
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_line(x));
+ gr.add_grid_generator(grid_line(y));
+ \endcode
+ Note that a generator system must contain a point when describing
+ a grid. To ensure that this is always the case it is required
+ that the first generator inserted in an empty grid is a point
+ (otherwise, an exception is thrown).
+
+ \par Example 5
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_embed</CODE>:
+ \code
+ Grid gr(1);
+ gr.add_congruence(x == 2);
+ gr.add_space_dimensions_and_embed(1);
+ \endcode
+ We build the universe grid in the 1-dimension space \f$\Rset\f$.
+ Then we add a single equality congruence,
+ thus obtaining the grid corresponding to the singleton set
+ \f$\{ 2 \} \sseq \Rset\f$.
+ After the last line of code, the resulting grid is
+ \f[
+ \bigl\{\,
+ (2, y)^\transpose \in \Rset^2
+ \bigm|
+ y \in \Rset
+ \,\bigr\}.
+ \f]
+
+ \par Example 6
+ The following code shows the use of the function
+ <CODE>add_space_dimensions_and_project</CODE>:
+ \code
+ Grid gr(1);
+ gr.add_congruence(x == 2);
+ gr.add_space_dimensions_and_project(1);
+ \endcode
+ The first two lines of code are the same as in Example 4 for
+ <CODE>add_space_dimensions_and_embed</CODE>.
+ After the last line of code, the resulting grid is
+ the singleton set
+ \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+ \par Example 7
+ The following code shows the use of the function
+ <CODE>affine_image</CODE>:
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_point(4*x + 0*y));
+ gr.add_grid_generator(grid_point(0*x + 2*y));
+ Linear_Expression expr = x + 3;
+ gr.affine_image(x, expr);
+ \endcode
+ In this example the starting grid is all the pairs of \f$x\f$ and
+ \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+ and \f$y\f$ is an integer multiple of 2. The considered variable
+ is \f$x\f$ and the affine expression is \f$x+3\f$. The resulting
+ grid is the given grid translated 3 integers to the right (all the
+ pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+ and \f$y\f$ is an integer multiple of 2).
+ Moreover, if the affine transformation for the same variable \p x
+ is instead \f$x+y\f$:
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting grid is every second integral point along the \f$x=y\f$
+ line, with this line of points repeated at every fourth integral value
+ along the \f$x\f$ axis.
+ Instead, if we do not use an invertible transformation for the
+ same variable; for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting grid is every second point along the \f$x=y\f$ line.
+
+ \par Example 8
+ The following code shows the use of the function
+ <CODE>affine_preimage</CODE>:
+ \code
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(0*x + 0*y));
+ gr.add_grid_generator(grid_point(4*x + 0*y));
+ gr.add_grid_generator(grid_point(0*x + 2*y));
+ Linear_Expression expr = x + 3;
+ gr.affine_preimage(x, expr);
+ \endcode
+ In this example the starting grid, \p var and the affine
+ expression and the denominator are the same as in Example 6, while
+ the resulting grid is similar but translated 3 integers to the
+ left (all the pairs \f$(x, y)\f$
+ where \f$x\f$ is -3 plus an integer multiple of 4 and
+ \f$y\f$ is an integer multiple of 2)..
+ Moreover, if the affine transformation for \p x is \f$x+y\f$
+ \code
+ Linear_Expression expr = x + y;
+ \endcode
+ the resulting grid is a similar grid to the result in Example 6,
+ only the grid is slanted along \f$x=-y\f$.
+ Instead, if we do not use an invertible transformation for the same
+ variable \p x, for example, the affine expression \f$y\f$:
+ \code
+ Linear_Expression expr = y;
+ \endcode
+ the resulting grid is every fourth line parallel to the \f$x\f$
+ axis.
+
+ \par Example 9
+ For this example we also use the variables:
+ \code
+ Variable z(2);
+ Variable w(3);
+ \endcode
+ The following code shows the use of the function
+ <CODE>remove_space_dimensions</CODE>:
+ \code
+ Grid_Generator_System gs;
+ gs.insert(grid_point(3*x + y +0*z + 2*w));
+ Grid gr(gs);
+ Variables_Set vars;
+ vars.insert(y);
+ vars.insert(z);
+ gr.remove_space_dimensions(vars);
+ \endcode
+ The starting grid is the singleton set
+ \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+ the resulting grid is
+ \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+ Be careful when removing space dimensions <EM>incrementally</EM>:
+ since dimensions are automatically renamed after each application
+ of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+ results can be obtained.
+ For instance, by using the following code we would obtain
+ a different result:
+ \code
+ set<Variable> vars1;
+ vars1.insert(y);
+ gr.remove_space_dimensions(vars1);
+ set<Variable> vars2;
+ vars2.insert(z);
+ gr.remove_space_dimensions(vars2);
+ \endcode
+ In this case, the result is the grid
+ \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+ when removing the set of dimensions \p vars2
+ we are actually removing variable \f$w\f$ of the original grid.
+ For the same reason, the operator \p remove_space_dimensions
+ is not idempotent: removing twice the same non-empty set of dimensions
+ is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+ //! The numeric type of coefficients.
+ typedef Coefficient coefficient_type;
+
+ //! Returns the maximum space dimension all kinds of Grid can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns true indicating that this domain has methods that
+ can recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+ /*! \brief
+ Returns true indicating that this domain has methods that
+ can recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ //! Builds a grid having the specified properties.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the grid;
+
+ \param kind
+ Specifies whether the universe or the empty grid has to be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a grid, copying a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Congruence_System& cgs);
+
+ //! Builds a grid, recycling a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ Grid(Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds a grid, copying a system of constraints.
+ /*!
+ The grid inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the grid.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains inequality constraints.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Constraint_System& cs);
+
+ //! Builds a grid, recycling a system of constraints.
+ /*!
+ The grid inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains inequality constraints.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ Grid(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a grid, copying a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of generators defining the grid.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Grid_Generator_System& ggs);
+
+ //! Builds a grid, recycling a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of generators defining the grid. Its data-structures
+ may be recycled to build the grid.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+ */
+ Grid(Grid_Generator_System& ggs, Recycle_Input dummy);
+
+ //! Builds a grid out of a box.
+ /*!
+ The grid inherits the space dimension of the box.
+ The built grid is the most precise grid that includes the box.
+
+ \param box
+ The box representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Grid(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a grid out of a bounded-difference shape.
+ /*!
+ The grid inherits the space dimension of the BDS.
+ The built grid is the most precise grid that includes the BDS.
+
+ \param bd
+ The BDS representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Grid(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a grid out of an octagonal shape.
+ /*!
+ The grid inherits the space dimension of the octagonal shape.
+ The built grid is the most precise grid that includes the octagonal shape.
+
+ \param os
+ The octagonal shape representing the grid to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Grid(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Builds a grid from a polyhedron using algorithms whose complexity
+ does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+ smallest one containing \p ph.
+
+ The grid inherits the space dimension of polyhedron.
+
+ \param ph
+ The polyhedron.
+
+ \param complexity
+ The complexity class.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Grid(const Grid& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ Grid& operator=(const Grid& y);
+
+ //! \name Member Functions that Do Not Modify the Grid
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns
+ the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ /*! \brief
+ Returns a system of equality constraints satisfied by \p *this
+ with the same affine dimension as \p *this.
+ */
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Returns a minimal system of equality constraints satisfied by
+ \p *this with the same affine dimension as \p *this.
+ */
+ Constraint_System minimized_constraints() const;
+
+ //! Returns the system of congruences.
+ const Congruence_System& congruences() const;
+
+ //! Returns the system of congruences in minimal form.
+ const Congruence_System& minimized_congruences() const;
+
+ //! Returns the system of generators.
+ const Grid_Generator_System& grid_generators() const;
+
+ //! Returns the minimized system of generators.
+ const Grid_Generator_System& minimized_grid_generators() const;
+
+ //! Returns the relations holding between \p *this and \p cg.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ // FIXME: Poly_Con_Relation seems to encode exactly what we want
+ // here. We must find a new name for that class. Temporarily,
+ // we keep using it without changing the name.
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ // FIXME: see the comment for Poly_Con_Relation above.
+ Poly_Gen_Relation
+ relation_with(const Grid_Generator& g) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ // FIXME: see the comment for Poly_Con_Relation above.
+ Poly_Gen_Relation
+ relation_with(const Generator& g) const;
+
+ //! Returns the relations holding between \p *this and \p c.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ // FIXME: Poly_Con_Relation seems to encode exactly what we want
+ // here. We must find a new name for that class. Temporarily,
+ // we keep using it without changing the name.
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns \c true if and only if \p *this is an empty grid.
+ bool is_empty() const;
+
+ //! Returns \c true if and only if \p *this is a universe grid.
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a
+ topologically closed subset of the vector space.
+
+ A grid is always topologically closed.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Grid& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ /*!
+ A grid is discrete if it can be defined by a generator system which
+ contains only points and parameters. This includes the empty grid
+ and any grid in dimension zero.
+ */
+ bool is_discrete() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_below.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_above.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+ Always <CODE>true</CODE> when \p this bounds \p expr. Present for
+ interface compatibility with class Polyhedron, where closure
+ points can result in a value of false.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+ maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+ Always <CODE>true</CODE> when \p this bounds \p expr. Present for
+ interface compatibility with class Polyhedron, where closure
+ points can result in a value of false;
+
+ \param point
+ When maximization succeeds, will be assigned a point where \p expr
+ reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p point are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& point) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the is the infimum value can be reached in \p
+ this. Always <CODE>true</CODE> when \p this bounds \p expr.
+ Present for interface compatibility with class Polyhedron, where
+ closure points can result in a value of false.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the is the infimum value can be reached in \p
+ this. Always <CODE>true</CODE> when \p this bounds \p expr.
+ Present for interface compatibility with class Polyhedron, where
+ closure points can result in a value of false;
+
+ \param point
+ When minimization succeeds, will be assigned a point where \p expr
+ reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+ is defined, in which case the frequency and the value for \p expr
+ that is closest to zero are computed.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ The numerator of the maximum frequency of \p expr;
+
+ \param freq_d
+ The denominator of the maximum frequency of \p expr;
+
+ \param val_n
+ The numerator of them value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \param val_d
+ The denominator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or frequency is undefined with respect to \p expr,
+ then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Grid& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this strictly
+ contains \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Grid& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \return
+ <CODE>true</CODE> if and only if \p *this satisfies all the
+ invariants and either \p check_not_empty is <CODE>false</CODE> or
+ \p *this is not empty.
+
+ \param check_not_empty
+ <CODE>true</CODE> if and only if, in addition to checking the
+ invariants, \p *this must be checked to be not empty.
+
+ The check is performed so as to intrude as little as possible. If
+ the library has been compiled with run-time assertions enabled,
+ error messages are written on <CODE>std::cerr</CODE> in case
+ invariants are violated. This is useful for the purpose of
+ debugging the library.
+ */
+ bool OK(bool check_not_empty = false) const;
+
+ //@} // Member Functions that Do Not Modify the Grid
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+ //@{
+
+ //! Adds a copy of congruence \p cg to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are
+ dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds a copy of grid generator \p g to the system of generators of
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible,
+ or if \p *this is an empty grid and \p g is not a point.
+ */
+ void add_grid_generator(const Grid_Generator& g);
+
+ //! Adds a copy of each congruence in \p cgs to \p *this.
+ /*!
+ \param cgs
+ Contains the congruences that will be added to the system of
+ congruences of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cgs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this a congruence equivalent to constraint \p c.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible
+ or if constraint \p c is not optimally supported by the grid domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+ \param cs
+ The constraints to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible
+ or if \p cs contains a constraint which is not optimally supported
+ by the grid domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+ \param cs
+ The constraints to be added. They may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible
+ or if \p cs contains a constraint which is not optimally supported
+ by the grid domain.
+
+ \warning
+ The only assumption that can be made about \p cs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ //! Uses a copy of the congruence \p cg to refine \p *this.
+ /*!
+ \param cg
+ The congruence used.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+ /*!
+ \param cgs
+ The congruences used.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ //! Uses a copy of the constraint \p c to refine \p *this.
+ /*!
+
+ \param c
+ The constraint used. If it is not an equality, it will be ignored
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Uses a copy of the constraints in \p cs to refine \p *this.
+ /*!
+ \param cs
+ The constraints used. Constraints that are not equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system of generators
+ of \p *this.
+
+ \param gs
+ Contains the generators that will be added to the system of
+ generators of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are dimension-incompatible, or if
+ \p *this is empty and the system of generators \p gs is not empty,
+ but has no points.
+ */
+ void add_grid_generators(const Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators of \p
+ *this.
+
+ \param gs
+ The generator system to be added to \p *this. The generators in
+ \p gs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p gs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p gs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_grid_generators(Grid_Generator_System& gs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the least upper bound of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Grid& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned to \p
+ *this and <CODE>true</CODE> is returned, otherwise
+ <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Convex_Polyhedral_Difference "grid-difference"
+ of \p *this and \p y.
+
+ The grid difference between grids x and y is the smallest grid
+ containing all the points from x and y that are only in x.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_Affine_Transformation
+ "affine image" of \p
+ *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering the generators of a grid, the
+ affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If congruences are up-to-date, it uses the specialized function
+ affine_preimage() (for the system of congruences)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq var} a_i x_i + b,
+ \f]
+ so that the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f]
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only generators remain
+ up-to-date.
+
+ \endif
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_Affine_Transformation
+ "affine preimage" of
+ \p *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+ \if Include_Implementation_Details
+
+ When considering congruences of a grid, the affine transformation
+ \f[
+ \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+ \f]
+ is assigned to \p var where \p expr is
+ \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+ (\f$b\f$ is the inhomogeneous term).
+
+ If generators are up-to-date, then the specialized function
+ affine_image() is used (for the system of generators)
+ and inverse transformation to reach the same result.
+ To obtain the inverse transformation, we use the following observation.
+
+ Observation:
+ -# The affine transformation is invertible if the coefficient
+ of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+ is different from zero.
+ -# If the transformation is invertible, then we can write
+ \f[
+ \mathrm{denominator} * {x'}_\mathrm{var}
+ = \sum_{i = 0}^{n - 1} a_i x_i + b
+ = a_\mathrm{var} x_\mathrm{var}
+ + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+ \f],
+ the inverse transformation is
+ \f[
+ a_\mathrm{var} x_\mathrm{var}
+ = \mathrm{denominator} * {x'}_\mathrm{var}
+ - \sum_{i \neq j} a_i x_i - b.
+ \f].
+
+ Then, if the transformation is invertible, all the entities that
+ were up-to-date remain up-to-date. Otherwise only congruences remain
+ up-to-date.
+
+ \endif
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to
+ the \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+ \pmod{\mathrm{modulus}}\f$.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+ Optional argument with an automatic value of one;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p
+ *this.
+ */
+ void
+ generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+ \pmod{\mathrm{modulus}}\f$.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+ Optional argument with an automatic value of one;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p
+ *this.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to
+ the \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p
+ rhs.
+ */
+ void
+ generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Grid_Generalized_Image "generalized affine relation"
+ \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol where EQUAL is the symbol for a congruence
+ relation;
+
+ \param rhs
+ The right hand side affine expression;
+
+ \param modulus
+ The modulus of the congruence lhs %= rhs. A modulus of zero
+ indicates lhs == rhs. Optional argument with an automatic value
+ of zero.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p
+ rhs.
+ */
+ void
+ generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_zero());
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+ "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Grid& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system.
+ This argument is for compatibility with wrap_assign()
+ for the other domains and only checked for dimension-compatibility.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator".
+ This argument is for compatibility with wrap_assign()
+ for the other domains and is ignored.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually.
+ As wrapping dimensions collectively does not improve the precision,
+ this argument is ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+
+ \warning
+ It is assumed that variables in \p Vars represent integers. Thus,
+ where the extra cost is negligible, the integrality of these
+ variables is enforced; possibly causing a non-integral grid to
+ become empty.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping all points with non-integer
+ coordinates.
+
+ \param complexity
+ This argument is ignored as the algorithm used has polynomial
+ complexity.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping all points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ This argument is ignored as the algorithm used has polynomial
+ complexity.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y using congruence systems.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y using generator systems.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Grid_Widening
+ "Grid widening" between \p *this and \p y.
+
+ This widening uses either the congruence or generator systems
+ depending on which of the systems describing x and y
+ are up to date and minimized.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the congruence variant of
+ \ref Grid_Widening "Grid widening" computation by also enforcing
+ those congruences in \p cgs that are satisfied by all the points
+ of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_congruence_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the generator variant of the
+ \ref Grid_Widening "Grid widening"
+ computation by also enforcing those congruences in \p cgs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_generator_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Improves the result of the \ref Grid_Widening "Grid widening"
+ computation by also enforcing those congruences in \p cgs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A grid that <EM>must</EM> be contained in \p *this;
+
+ \param cgs
+ The system of congruences used to improve the widened grid;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+ */
+ void limited_extrapolation_assign(const Grid& y,
+ const Congruence_System& cgs,
+ unsigned* tp = NULL);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+ \p m new space dimensions and embeds the old grid in the new
+ vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new grid, which is characterized by a system of congruences
+ in which the variables which are the new dimensions can have any
+ value. For instance, when starting from the grid \f$\cL \sseq
+ \Rset^2\f$ and adding a third space dimension, the result will be
+ the grid
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cL
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+ \p m new space dimensions to the grid and does not embed it
+ in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new grid, which is characterized by a system of congruences
+ in which the variables running through the new dimensions are all
+ constrained to be equal to 0. For instance, when starting from
+ the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+ dimension, the result will be the grid
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cL
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation" of
+ \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Grid& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that the
+ resulting space will have \ref Removing_Dimensions_from_the_Vector_Space
+ "dimension \p new_dimension."
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ If \p pfunc maps only some of the dimensions of \p *this then the
+ rest will be projected away.
+
+ If the highest dimension mapped to by \p pfunc is higher than the
+ highest dimension in \p *this then the number of dimensions in \p
+ *this will be increased to the highest dimension mapped to by \p
+ pfunc.
+
+ \param pfunc
+ The partial function specifying the destiny of each space
+ dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain of the
+ partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned. If \f$f\f$ is
+ undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing the grid.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==(const Grid& x, const Grid& y);
+
+ friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Grid();
+
+ /*! \brief
+ Swaps \p *this with grid \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void m_swap(Grid& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+
+ //! The system of congruences.
+ Congruence_System con_sys;
+
+ //! The system of generators.
+ Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+/* Automatically generated from PPL source file ../src/Grid_Status_idefs.hh line 1. */
+/* Grid::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status_idefs.hh directly; use Grid_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+ The assertions supported that are in use are:
+ - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the grid is the empty set;
+ - <EM>congruences up-to-date</EM>: the grid is correctly
+ characterized by the attached system of congruences, modulo the
+ processing of pending generators;
+ - <EM>generators up-to-date</EM>: the grid is correctly
+ characterized by the attached system of generators, modulo the
+ processing of pending congruences;
+ - <EM>congruences minimized</EM>: the non-pending part of the system
+ of congruences attached to the grid is in minimal form;
+ - <EM>generators minimized</EM>: the non-pending part of the system
+ of generators attached to the grid is in minimal form.
+
+ Other supported assertions are:
+ - <EM>congruences pending</EM>
+ - <EM>generators pending</EM>
+ - <EM>congruences' saturation matrix up-to-date</EM>
+ - <EM>generators' saturation matrix up-to-date</EM>.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>congruences pending</EM> and <EM>generators pending</EM>
+ are mutually exclusive;
+ - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+ and <EM>generators minimized</EM>;
+ - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+ - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+ - <EM>congruences' saturation matrix up-to-date</EM> implies both
+ <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+ - <EM>generators' saturation matrix up-to-date</EM> implies both
+ <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_c_up_to_date() const;
+ void reset_c_up_to_date();
+ void set_c_up_to_date();
+
+ bool test_g_up_to_date() const;
+ void reset_g_up_to_date();
+ void set_g_up_to_date();
+
+ bool test_c_minimized() const;
+ void reset_c_minimized();
+ void set_c_minimized();
+
+ bool test_g_minimized() const;
+ void reset_g_minimized();
+ void set_g_minimized();
+
+ bool test_sat_c_up_to_date() const;
+ void reset_sat_c_up_to_date();
+ void set_sat_c_up_to_date();
+
+ bool test_sat_g_up_to_date() const;
+ void reset_sat_g_up_to_date();
+ void set_sat_g_up_to_date();
+
+ bool test_c_pending() const;
+ void reset_c_pending();
+ void set_c_pending();
+
+ bool test_g_pending() const;
+ void reset_g_pending();
+ void set_g_pending();
+ //@} // Test, remove or add an individual assertion from the conjunction
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bitmasks for the individual assertions
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t C_UP_TO_DATE = 1U << 1;
+ static const flags_t G_UP_TO_DATE = 1U << 2;
+ static const flags_t C_MINIMIZED = 1U << 3;
+ static const flags_t G_MINIMIZED = 1U << 4;
+ static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+ static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+ static const flags_t CS_PENDING = 1U << 7;
+ static const flags_t GS_PENDING = 1U << 8;
+ //@} // Bitmasks for the individual assertions
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bitmask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 1977. */
+#undef PPL_IN_Grid_CLASS
+
+ //! The status flags to keep track of the grid's internal state.
+ Status status;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ enum Dimension_Kind {
+ PARAMETER = 0,
+ LINE = 1,
+ GEN_VIRTUAL = 2,
+ PROPER_CONGRUENCE = PARAMETER,
+ CON_VIRTUAL = LINE,
+ EQUALITY = GEN_VIRTUAL
+ };
+
+ typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+ // The type of row associated with each dimension. If the virtual
+ // rows existed then the reduced systems would be square and upper
+ // or lower triangular, and the rows in each would have the types
+ // given in this vector. As the congruence system is reduced to an
+ // upside-down lower triangular form the ordering of the congruence
+ // types is last to first.
+ Dimension_Kinds dim_kinds;
+
+ //! Builds a grid universe or empty grid.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the grid;
+
+ \param kind
+ specifies whether the universe or the empty grid has to be built.
+ */
+ void construct(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a grid from a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid. Its data-structures
+ may be recycled to build the grid.
+ */
+ void construct(Congruence_System& cgs);
+
+ //! Builds a grid from a system of grid generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param ggs
+ The system of grid generators defining the grid. Its data-structures
+ may be recycled to build the grid.
+ */
+ void construct(Grid_Generator_System& ggs);
+
+ //! \name Private Verifiers: Verify if Individual Flags are Set
+ //@{
+
+ //! Returns <CODE>true</CODE> if the grid is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+ bool congruences_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+ bool generators_are_up_to_date() const;
+
+ //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+ bool congruences_are_minimized() const;
+
+ //! Returns <CODE>true</CODE> if the system of generators is minimized.
+ bool generators_are_minimized() const;
+
+ //@} // Private Verifiers: Verify if Individual Flags are Set
+
+ //! \name State Flag Setters: Set Only the Specified Flags
+ //@{
+
+ /*! \brief
+ Sets \p status to express that the grid is the universe
+ 0-dimension vector space, clearing all corresponding matrices.
+ */
+ void set_zero_dim_univ();
+
+ /*! \brief
+ Sets \p status to express that the grid is empty, clearing all
+ corresponding matrices.
+ */
+ void set_empty();
+
+ //! Sets \p status to express that congruences are up-to-date.
+ void set_congruences_up_to_date();
+
+ //! Sets \p status to express that generators are up-to-date.
+ void set_generators_up_to_date();
+
+ //! Sets \p status to express that congruences are minimized.
+ void set_congruences_minimized();
+
+ //! Sets \p status to express that generators are minimized.
+ void set_generators_minimized();
+
+ //@} // State Flag Setters: Set Only the Specified Flags
+
+ //! \name State Flag Cleaners: Clear Only the Specified Flag
+ //@{
+
+ //! Clears the \p status flag indicating that the grid is empty.
+ void clear_empty();
+
+ //! Sets \p status to express that congruences are out of date.
+ void clear_congruences_up_to_date();
+
+ //! Sets \p status to express that generators are out of date.
+ void clear_generators_up_to_date();
+
+ //! Sets \p status to express that congruences are no longer minimized.
+ void clear_congruences_minimized();
+
+ //! Sets \p status to express that generators are no longer minimized.
+ void clear_generators_minimized();
+
+ //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+ //! \name Updating Matrices
+ //@{
+
+ //! Updates and minimizes the congruences from the generators.
+ void update_congruences() const;
+
+ //! Updates and minimizes the generators from the congruences.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty grid.
+
+ It is illegal to call this method when the Status field already
+ declares the grid to be empty.
+ */
+ bool update_generators() const;
+
+ //@} // Updating Matrices
+
+ //! \name Minimization of Descriptions
+ //@{
+
+ //! Minimizes both the congruences and the generators.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if \p *this turns out to be an
+ empty grid.
+
+ Minimization is performed on each system only if the minimized
+ Status field is clear.
+ */
+ bool minimize() const;
+
+ //@} // Minimization of Descriptions
+
+ enum Three_Valued_Boolean {
+ TVB_TRUE,
+ TVB_FALSE,
+ TVB_DONT_KNOW
+ };
+
+ //! Polynomial but incomplete equivalence test between grids.
+ Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+ bool is_included_in(const Grid& y) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param method_call
+ The call description of the public parent method, for example
+ "bounded_from_above(e)". Passed to throw_dimension_incompatible,
+ as the first argument.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param method_call
+ The call description of the public parent method, for example
+ "maximize(e)". Passed to throw_dimension_incompatible, as the
+ first argument;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr in \p
+ *this can actually be reached (which is always the case);
+
+ \param point
+ When maximization or minimization succeeds, will be assigned the
+ point where \p expr reaches the extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ const char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator* point = NULL) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+ is defined, in which case the frequency and the value for \p expr
+ that is closest to zero are computed.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ The numerator of the maximum frequency of \p expr;
+
+ \param freq_d
+ The denominator of the maximum frequency of \p expr;
+
+ \param val_n
+ The numerator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ \param val_d
+ The denominator of a value of \p expr at a point in the grid
+ that is closest to zero;
+
+ If \p *this is empty or frequency is undefined with respect to \p expr,
+ then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+
+ \warning
+ If \p expr and \p *this are dimension-incompatible,
+ the grid generator system is not minimized or \p *this is
+ empty, then the behavior is undefined.
+ */
+ bool frequency_no_check(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+ */
+ bool bounds_no_check(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Adds the congruence \p cg to \p *this.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the grid generator system is not minimized or \p *this is
+ empty, then the behavior is undefined.
+ */
+ void add_congruence_no_check(const Congruence& cg);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if c is a non-trivial inequality constraint.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void add_constraint_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added.
+ Non-trivial inequalities are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ //! \name Widening- and Extrapolation-Related Functions
+ //@{
+
+ //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+ void select_wider_congruences(const Grid& y,
+ Congruence_System& selected_cgs) const;
+
+ //! Copies widened generators from \p y to \p widened_ggs.
+ void select_wider_generators(const Grid& y,
+ Grid_Generator_System& widened_ggs) const;
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given systems.
+ /*!
+ \param cgs
+ A congruence system, to which columns are added;
+
+ \param gs
+ A generator system, to which rows and columns are added;
+
+ \param dims
+ The number of space dimensions to add.
+
+ This method is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE>.
+ */
+ void add_space_dimensions(Congruence_System& cgs,
+ Grid_Generator_System& gs,
+ dimension_type dims);
+
+ //! Adds new space dimensions to the given systems.
+ /*!
+ \param gs
+ A generator system, to which columns are added;
+
+ \param cgs
+ A congruence system, to which rows and columns are added;
+
+ \param dims
+ The number of space dimensions to add.
+
+ This method is invoked only by
+ <CODE>add_space_dimensions_and_project()</CODE>.
+ */
+ void add_space_dimensions(Grid_Generator_System& gs,
+ Congruence_System& cgs,
+ dimension_type dims);
+
+ //! \name Minimization-related Static Member Functions
+ //@{
+
+ //! Normalizes the divisors in \p sys.
+ /*!
+ Converts \p sys to an equivalent system in which the divisors are
+ of equal value.
+
+ \param sys
+ The generator system to be normalized. It must have at least one
+ row.
+
+ \param divisor
+ A reference to the initial value of the divisor. The resulting
+ value of this object is the new system divisor.
+
+ \param first_point
+ If \p first_point has a value other than NULL then it is taken as
+ the first point in \p sys, and it is assumed that any following
+ points have the same divisor as \p first_point.
+ */
+ static void
+ normalize_divisors(Grid_Generator_System& sys,
+ Coefficient& divisor,
+ const Grid_Generator* first_point = NULL);
+
+ //! Normalizes the divisors in \p sys.
+ /*!
+ Converts \p sys to an equivalent system in which the divisors are
+ of equal value.
+
+ \param sys
+ The generator system to be normalized. It must have at least one
+ row.
+ */
+ static void
+ normalize_divisors(Grid_Generator_System& sys);
+
+ //! Normalize all the divisors in \p sys and \p gen_sys.
+ /*!
+ Modify \p sys and \p gen_sys to use the same single divisor value
+ for all generators, leaving each system representing the grid it
+ represented originally.
+
+ \param sys
+ The first of the generator systems to be normalized.
+
+ \param gen_sys
+ The second of the generator systems to be normalized. This system
+ must have at least one row and the divisors of the generators in
+ this system must be equal.
+
+ \exception std::runtime_error
+ Thrown if all rows in \p gen_sys are lines and/or parameters.
+ */
+ static void normalize_divisors(Grid_Generator_System& sys,
+ Grid_Generator_System& gen_sys);
+
+ /*! \brief
+ Converts generator system \p dest to be equivalent to congruence
+ system \p source.
+ */
+ static void conversion(Congruence_System& source,
+ Grid_Generator_System& dest,
+ Dimension_Kinds& dim_kinds);
+
+ /*! \brief
+ Converts congruence system \p dest to be equivalent to generator
+ system \p source.
+ */
+ static void conversion(Grid_Generator_System& source,
+ Congruence_System& dest,
+ Dimension_Kinds& dim_kinds);
+
+ //! Converts \p cgs to upper triangular (i.e. minimized) form.
+ /*!
+ Returns <CODE>true</CODE> if \p cgs represents the empty set,
+ otherwise returns <CODE>false</CODE>.
+ */
+ static bool simplify(Congruence_System& cgs,
+ Dimension_Kinds& dim_kinds);
+
+ //! Converts \p gs to lower triangular (i.e. minimized) form.
+ /*!
+ Expects \p gs to contain at least one point.
+ */
+ static void simplify(Grid_Generator_System& ggs,
+ Dimension_Kinds& dim_kinds);
+
+ //! Reduces the line \p row using the line \p pivot.
+ /*!
+ Uses the line \p pivot to change the representation of the line
+ \p row so that the element at index \p column of \p row is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ static void reduce_line_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type column);
+
+ //! Reduces the equality \p row using the equality \p pivot.
+ /*!
+ Uses the equality \p pivot to change the representation of the
+ equality \p row so that the element at index \p column of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ static void reduce_equality_with_equality(Congruence& row,
+ const Congruence& pivot,
+ dimension_type column);
+
+ //! Reduces \p row using \p pivot.
+ /*!
+ Uses the point, parameter or proper congruence at \p pivot to
+ change the representation of the point, parameter or proper
+ congruence at \p row so that the element at index \p column of \p row
+ is zero. Only elements from index \p start to index \p end are
+ modified (i.e. it is assumed that all other elements are zero).
+ This means that \p col must be in [start,end).
+
+ NOTE: This may invalidate the rows, since it messes with the divisors.
+ Client code has to fix that (if needed) and assert OK().
+ */
+ // Part of Grid for access to Matrix<Dense_Row>::rows.
+ template <typename R>
+ static void reduce_pc_with_pc(R& row,
+ R& pivot,
+ dimension_type column,
+ dimension_type start,
+ dimension_type end);
+
+ //! Reduce \p row using \p pivot.
+ /*!
+ Use the line \p pivot to change the representation of the
+ parameter \p row such that the element at index \p column of \p row
+ is zero.
+ */
+ // This takes a parameter with type Swapping_Vector<Grid_Generator> (instead
+ // of Grid_Generator_System) to simplify the implementation of `simplify()'.
+ // NOTE: This may invalidate `row' and the rows in `sys'. Client code must
+ // fix/check this.
+ static void reduce_parameter_with_line(Grid_Generator& row,
+ const Grid_Generator& pivot,
+ dimension_type column,
+ Swapping_Vector<Grid_Generator>& sys,
+ dimension_type num_columns);
+
+ //! Reduce \p row using \p pivot.
+ /*!
+ Use the equality \p pivot to change the representation of the
+ congruence \p row such that element at index \p column of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix<Dense_Row>::rows.
+ // This takes a parameter with type Swapping_Vector<Congruence> (instead of
+ // Congruence_System) to simplify the implementation of `conversion()'.
+ static void reduce_congruence_with_equality(Congruence& row,
+ const Congruence& pivot,
+ dimension_type column,
+ Swapping_Vector<Congruence>& sys);
+
+ //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+ /*!
+ Required when converting (or simplifying) a congruence or generator
+ system to "strong minimal form"; informally, strong minimal form means
+ that, not only is the system in minimal form (ie a triangular matrix),
+ but also the absolute values of the coefficients of the proper congruences
+ and parameters are minimal. As a simple example, the set of congruences
+ \f$\{3x \equiv_3 0, 4x + y \equiv_3 1\}\f$,
+ (which is in minimal form) is equivalent to the set
+ \f$\{3x \equiv_3 0, x + y \equiv_3 1\}\f$
+ (which is in strong minimal form).
+
+ \param sys
+ The generator or congruence system to be reduced to strong minimal form.
+
+ \param dim
+ Column to be reduced.
+
+ \param pivot_index
+ Index of last row to be reduced.
+
+ \param start
+ Index of first column to be changed.
+
+ \param end
+ Index of last column to be changed.
+
+ \param sys_dim_kinds
+ Dimension kinds of the elements of \p sys.
+
+ \param generators
+ Flag indicating whether \p sys is a congruence or generator system
+ */
+ template <typename M>
+ // This takes a parameter with type `Swapping_Vector<M::row_type>'
+ // instead of `M' to simplify the implementation of simplify().
+ // NOTE: This may invalidate the rows in `sys'. Client code must
+ // fix/check this.
+ static void reduce_reduced(Swapping_Vector<typename M::row_type>& sys,
+ dimension_type dim,
+ dimension_type pivot_index,
+ dimension_type start, dimension_type end,
+ const Dimension_Kinds& sys_dim_kinds,
+ bool generators = true);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Matrix<Dense_Row>::rows and cgs::operator[].
+ // The type of `dest' is Swapping_Vector<Congruence> instead of
+ // Congruence_System to simplify the implementation of conversion().
+ static void multiply_grid(const Coefficient& multiplier,
+ Congruence& cg,
+ Swapping_Vector<Congruence>& dest,
+ dimension_type num_rows);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Grid_Generator::operator[].
+ // The type of `dest' is Swapping_Vector<Grid_Generator> instead of
+ // Grid_Generator_System to simplify the implementation of conversion().
+ // NOTE: This does not check whether the rows are OK(). Client code
+ // should do that.
+ static void multiply_grid(const Coefficient& multiplier,
+ Grid_Generator& gen,
+ Swapping_Vector<Grid_Generator>& dest,
+ dimension_type num_rows);
+
+ /*! \brief
+ If \p sys is lower triangular return <CODE>true</CODE>, else
+ return <CODE>false</CODE>.
+ */
+ static bool lower_triangular(const Congruence_System& sys,
+ const Dimension_Kinds& dim_kinds);
+
+ /*! \brief
+ If \p sys is upper triangular return <CODE>true</CODE>, else
+ return <CODE>false</CODE>.
+ */
+ static bool upper_triangular(const Grid_Generator_System& sys,
+ const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+ //! Checks that trailing rows contain only zero terms.
+ /*!
+ If all columns contain zero in the rows of \p system from row
+ index \p first to row index \p last then return <code>true</code>,
+ else return <code>false</code>. \p row_size gives the number of
+ columns in each row.
+
+ This method is only used in assertions in the simplify methods.
+ */
+ template <typename M, typename R>
+ static bool rows_are_zero(M& system,
+ dimension_type first,
+ dimension_type last,
+ dimension_type row_size);
+#endif
+
+ //@} // Minimization-Related Static Member Functions
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! \name Exception Throwers
+ //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+ void throw_dimension_incompatible(const char* method,
+ const char* other_name,
+ dimension_type other_dim) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gr_name,
+ const Grid& gr) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cg_name,
+ const Congruence& cg) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* c_name,
+ const Constraint& c) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Grid_Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* g_name,
+ const Generator& g) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cgs_name,
+ const Congruence_System& cgs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* cs_name,
+ const Constraint_System& cs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* gs_name,
+ const Grid_Generator_System& gs) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ static void throw_invalid_argument(const char* method,
+ const char* reason);
+ static void throw_invalid_constraint(const char* method,
+ const char* c_name);
+ static void throw_invalid_constraints(const char* method,
+ const char* cs_name);
+ static void throw_invalid_generator(const char* method,
+ const char* g_name);
+ static void throw_invalid_generators(const char* method,
+ const char* gs_name);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+};
+
+/* Automatically generated from PPL source file ../src/Grid_Status_inlines.hh line 1. */
+/* Grid::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+ flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+ return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+ reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+ set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+ return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+ reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+ set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+ return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+ reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+ set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+ return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+ reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+ set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+ return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+ reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+ set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+ return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+ reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+ set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+ return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+ reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+ set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+ return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+ reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+ set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_inlines.hh line 1. */
+/* Grid class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_inlines.hh line 30. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+ return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+ return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+ return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+ return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+ return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+ status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+ set_congruences_up_to_date();
+ status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+ set_generators_up_to_date();
+ status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+ status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+ status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+ status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+ clear_congruences_minimized();
+ status.reset_c_up_to_date();
+ // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+ clear_generators_minimized();
+ status.reset_g_up_to_date();
+ // Can get rid of gen_sys here.
+}
+
+inline dimension_type
+Grid::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return std::min(std::numeric_limits<dimension_type>::max() - 1,
+ std::min(Congruence_System::max_space_dimension(),
+ Grid_Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline
+Grid::Grid(dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : con_sys(),
+ gen_sys(check_space_dimension_overflow(num_dimensions,
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension")) {
+ construct(num_dimensions, kind);
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid::Grid(const Congruence_System& cgs)
+ : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cgs.space_dimension()) {
+ Congruence_System cgs_copy(cgs);
+ construct(cgs_copy);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+ : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(cgs, recycle)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(cgs.space_dimension()) {
+ construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& ggs)
+ : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(ggs)",
+ "the space dimension of ggs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(ggs.space_dimension()) {
+ Grid_Generator_System ggs_copy(ggs);
+ construct(ggs_copy);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+ : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(ggs, recycle)",
+ "the space dimension of ggs "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(ggs.space_dimension()) {
+ construct(ggs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd, Complexity_Class)
+ : con_sys(check_space_dimension_overflow(bd.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(bd.space_dimension()) {
+ Congruence_System cgs = bd.congruences();
+ construct(cgs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const Octagonal_Shape<U>& os, Complexity_Class)
+ : con_sys(check_space_dimension_overflow(os.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension")),
+ gen_sys(os.space_dimension()) {
+ Congruence_System cgs = os.congruences();
+ construct(cgs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+ return space_dim;
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline int32_t
+Grid::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+inline Constraint_System
+Grid::constraints() const {
+ return Constraint_System(congruences());
+}
+
+inline Constraint_System
+Grid::minimized_constraints() const {
+ return Constraint_System(minimized_congruences());
+}
+
+inline void
+Grid::m_swap(Grid& y) {
+ using std::swap;
+ swap(con_sys, y.con_sys);
+ swap(gen_sys, y.gen_sys);
+ swap(status, y.status);
+ swap(space_dim, y.space_dim);
+ swap(dim_kinds, y.dim_kinds);
+}
+
+inline void
+Grid::add_congruence(const Congruence& cg) {
+ // Dimension-compatibility check.
+ if (space_dim < cg.space_dimension())
+ throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+ if (!marked_empty())
+ add_congruence_no_check(cg);
+}
+
+inline void
+Grid::add_congruences(const Congruence_System& cgs) {
+ // TODO: this is just an executable specification.
+ // Space dimension compatibility check.
+ if (space_dim < cgs.space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+ if (!marked_empty()) {
+ Congruence_System cgs_copy = cgs;
+ add_recycled_congruences(cgs_copy);
+ }
+}
+
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+ add_congruence(cg);
+}
+
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+inline bool
+Grid::can_recycle_constraint_systems() {
+ return true;
+}
+
+inline bool
+Grid::can_recycle_congruence_systems() {
+ return true;
+}
+
+inline void
+Grid::add_constraint(const Constraint& c) {
+ // Space dimension compatibility check.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", "c", c);
+ if (!marked_empty())
+ add_constraint_no_check(c);
+}
+
+inline void
+Grid::add_recycled_constraints(Constraint_System& cs) {
+ // TODO: really recycle the constraints.
+ add_constraints(cs);
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+ return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& point) const {
+ return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+inline void
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+ PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+ divisor = 1;
+ normalize_divisors(sys, divisor);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+ return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+ const Grid& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+}
+
+/*! \relates Grid */
+inline void
+swap(Grid& x, Grid& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_templates.hh line 1. */
+/* Grid class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_templates.hh line 30. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box, Complexity_Class)
+ : con_sys(),
+ gen_sys() {
+ space_dim = check_space_dimension_overflow(box.space_dimension(),
+ max_space_dimension(),
+ "PPL::Grid::",
+ "Grid(box, from_bounding_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.set_space_dimension(space_dim);
+ gen_sys.set_space_dimension(space_dim);
+ // Add congruences and generators according to `box'.
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+ gen_sys.insert(grid_point());
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ const Variable v_k = Variable(k);
+ bool closed = false;
+ // TODO: Consider producing the system(s) in minimized form.
+ if (box.has_lower_bound(v_k, l_n, l_d, closed)) {
+ if (box.has_upper_bound(v_k, u_n, u_d, closed))
+ if (l_n * u_d == u_n * l_d) {
+ // A point interval sets dimension k of every point to a
+ // single value.
+ con_sys.insert(l_d * v_k == l_n);
+
+ // This is declared here because it may be invalidated
+ // by the call to gen_sys.insert() at the end of the loop.
+ Grid_Generator& point = gen_sys.sys.rows[0];
+
+ // Scale the point to use as divisor the lcm of the
+ // divisors of the existing point and the lower bound.
+ const Coefficient& point_divisor = point.divisor();
+ gcd_assign(u_n, l_d, point_divisor);
+ // `u_n' now holds the gcd.
+ exact_div_assign(u_n, point_divisor, u_n);
+ if (l_d < 0)
+ neg_assign(u_n);
+ // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+ point.scale_to_divisor(l_d * u_n);
+ // Set dimension k of the point to the lower bound.
+ if (l_d < 0)
+ neg_assign(u_n);
+ // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+ point.expr.set(Variable(k), l_n * u_n);
+ PPL_ASSERT(point.OK());
+
+ PPL_ASSERT(gen_sys.sys.OK());
+
+ continue;
+ }
+ }
+ // A universe interval allows any value in dimension k.
+ gen_sys.insert(grid_line(v_k));
+ }
+ set_congruences_up_to_date();
+ set_generators_up_to_date();
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the grid becomes zero_dimensional.
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing all dimensions from the empty grid.
+ space_dim = 0;
+ set_empty();
+ }
+ else
+ // Removing all dimensions from a non-empty grid.
+ set_zero_dim_univ();
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+ if (new_space_dimension == space_dim) {
+ // The partial function `pfunc' is indeed total and thus specifies
+ // a permutation, that is, a renaming of the dimensions. For
+ // maximum efficiency, we will simply permute the columns of the
+ // constraint system and/or the generator system.
+
+ std::vector<Variable> cycle;
+ cycle.reserve(space_dim);
+
+ // Used to mark elements as soon as they are inserted in a cycle.
+ std::deque<bool> visited(space_dim);
+
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ if (!visited[i]) {
+ dimension_type j = i;
+ do {
+ visited[j] = true;
+ // The following initialization is only to make the compiler happy.
+ dimension_type k = 0;
+ if (!pfunc.maps(j, k))
+ throw_invalid_argument("map_space_dimensions(pfunc)",
+ " pfunc is inconsistent");
+ if (k == j)
+ break;
+
+ cycle.push_back(Variable(j));
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+
+ // End of cycle.
+
+ // Avoid calling clear_*_minimized() if cycle.size() is less than 2,
+ // to improve efficiency.
+ if (cycle.size() >= 2) {
+ // Permute all that is up-to-date.
+ if (congruences_are_up_to_date()) {
+ con_sys.permute_space_dimensions(cycle);
+ clear_congruences_minimized();
+ }
+
+ if (generators_are_up_to_date()) {
+ gen_sys.permute_space_dimensions(cycle);
+ clear_generators_minimized();
+ }
+ }
+
+ cycle.clear();
+ }
+ }
+
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // If control gets here, then `pfunc' is not a permutation and some
+ // dimensions must be projected away.
+
+ const Grid_Generator_System& old_gensys = grid_generators();
+
+ if (old_gensys.has_no_rows()) {
+ // The grid is empty.
+ Grid new_grid(new_space_dimension, EMPTY);
+ m_swap(new_grid);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Make a local copy of the partial function.
+ std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ dimension_type pfunc_j;
+ if (pfunc.maps(j, pfunc_j))
+ pfunc_maps[j] = pfunc_j;
+ }
+
+ Grid_Generator_System new_gensys;
+ // Set sortedness, for the assertion met via gs::insert.
+ new_gensys.set_sorted(false);
+ // Get the divisor of the first point.
+ Grid_Generator_System::const_iterator i;
+ Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+ for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+ if (i->is_point())
+ break;
+ PPL_ASSERT(i != old_gensys_end);
+ const Coefficient& system_divisor = i->divisor();
+ for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
+ const Grid_Generator& old_g = *i;
+ const Grid_Generator::expr_type old_g_e = old_g.expression();
+ Linear_Expression expr;
+ expr.set_space_dimension(new_space_dimension);
+ bool all_zeroes = true;
+ for (Grid_Generator::expr_type::const_iterator j = old_g_e.begin(),
+ j_end = old_g_e.end(); j != j_end; ++j) {
+ const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+ if (mapped_id != not_a_dimension()) {
+ add_mul_assign(expr, *j, Variable(mapped_id));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Grid_Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(grid_line(expr));
+ break;
+ case Grid_Generator::PARAMETER:
+ if (!all_zeroes)
+ new_gensys.insert(parameter(expr, system_divisor));
+ break;
+ case Grid_Generator::POINT:
+ new_gensys.insert(grid_point(expr, old_g.divisor()));
+ break;
+ }
+ }
+
+ Grid new_grid(new_gensys);
+ m_swap(new_grid);
+
+ PPL_ASSERT(OK(true));
+}
+
+// Needed for converting the congruence or grid_generator system
+// to "strong minimal form".
+template <typename M>
+void
+Grid::reduce_reduced(Swapping_Vector<typename M::row_type>& rows,
+ const dimension_type dim,
+ const dimension_type pivot_index,
+ const dimension_type start,
+ const dimension_type end,
+ const Dimension_Kinds& sys_dim_kinds,
+ const bool generators) {
+ // TODO: Remove this.
+ typedef typename M::row_type M_row_type;
+
+ const M_row_type& pivot = rows[pivot_index];
+ const Coefficient& pivot_dim = pivot.expr.get(dim);
+
+ if (pivot_dim == 0)
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half);
+ pivot_dim_half = (pivot_dim + 1) / 2;
+ const Dimension_Kind row_kind = sys_dim_kinds[dim];
+ const bool row_is_line_or_equality
+ = (row_kind == (generators ? LINE : EQUALITY));
+
+ PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract);
+ PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder);
+ for (dimension_type kinds_index = dim,
+ row_index = pivot_index; row_index-- > 0; ) {
+ if (generators) {
+ --kinds_index;
+ // Move over any virtual rows.
+ while (sys_dim_kinds[kinds_index] == GEN_VIRTUAL)
+ --kinds_index;
+ }
+ else {
+ ++kinds_index;
+ // Move over any virtual rows.
+ while (sys_dim_kinds[kinds_index] == CON_VIRTUAL)
+ ++kinds_index;
+ }
+
+ // row_kind CONGRUENCE is included as PARAMETER
+ if (row_is_line_or_equality
+ || (row_kind == PARAMETER
+ && sys_dim_kinds[kinds_index] == PARAMETER)) {
+ M_row_type& row = rows[row_index];
+
+ const Coefficient& row_dim = row.expr.get(dim);
+ // num_rows_to_subtract may be positive or negative.
+ num_rows_to_subtract = row_dim / pivot_dim;
+
+ // Ensure that after subtracting num_rows_to_subtract * r_dim
+ // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+ // E.g., if pivot[dim] = 9, then after this reduction
+ // -5 < row_dim <= 5.
+ row_dim_remainder = row_dim % pivot_dim;
+ if (row_dim_remainder < 0) {
+ if (row_dim_remainder <= -pivot_dim_half)
+ --num_rows_to_subtract;
+ }
+ else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+ ++num_rows_to_subtract;
+
+ // Subtract num_rows_to_subtract copies of pivot from row i. Only the
+ // entries from dim need to be subtracted, as the preceding
+ // entries are all zero.
+ // If num_rows_to_subtract is negative, these copies of pivot are
+ // added to row i.
+ if (num_rows_to_subtract != 0)
+ row.expr.linear_combine(pivot.expr,
+ Coefficient_one(), -num_rows_to_subtract,
+ start, end + 1);
+ }
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 2664. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 1. */
+/* BD_Shape class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 1. */
+/* DB_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 1. */
+/* DB_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Row_Impl_Handler;
+
+template <typename T>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 1. */
+/* Ptr_Iterator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 28. */
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename P, typename Q>
+bool operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+ : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+ typename std::iterator_traits<P>::value_type,
+ typename std::iterator_traits<P>::difference_type,
+ typename std::iterator_traits<P>::pointer,
+ typename std::iterator_traits<P>::reference> {
+public:
+ typedef typename std::iterator_traits<P>::difference_type difference_type;
+ typedef typename std::iterator_traits<P>::reference reference;
+ typedef typename std::iterator_traits<P>::pointer pointer;
+
+ //! Default constructor: no guarantees.
+ Ptr_Iterator();
+
+ //! Construct an iterator pointing at \p q.
+ explicit Ptr_Iterator(const P& q);
+
+ /*! \brief
+ Copy constructor allowing the construction of a const_iterator
+ from a non-const iterator.
+ */
+ template<typename Q>
+ Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Subscript operator.
+ reference operator[](const difference_type m) const;
+
+ //! Prefix increment operator.
+ Ptr_Iterator& operator++();
+
+ //! Postfix increment operator.
+ Ptr_Iterator operator++(int);
+
+ //! Prefix decrement operator
+ Ptr_Iterator& operator--();
+
+ //! Postfix decrement operator.
+ Ptr_Iterator operator--(int);
+
+ //! Assignment-increment operator.
+ Ptr_Iterator& operator+=(const difference_type m);
+
+ //! Assignment-decrement operator.
+ Ptr_Iterator& operator-=(const difference_type m);
+
+ //! Returns the difference between \p *this and \p y.
+ difference_type operator-(const Ptr_Iterator& y) const;
+
+ //! Returns the sum of \p *this and \p m.
+ Ptr_Iterator operator+(const difference_type m) const;
+
+ //! Returns the difference of \p *this and \p m.
+ Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+ //! The base pointer implementing the iterator.
+ P p;
+
+ //! Returns the hidden pointer.
+ const P& base() const;
+
+ template <typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template <typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend bool Parma_Polyhedra_Library::Implementation::
+ operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ template<typename Q, typename R>
+ friend typename Ptr_Iterator<Q>::difference_type
+ Parma_Polyhedra_Library::Implementation::
+ operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+ friend Ptr_Iterator<P>
+ Parma_Polyhedra_Library::Implementation::
+ operator+<>(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y);
+};
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_inlines.hh line 1. */
+/* Ptr_Iterator class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+ return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+ : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+ : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& q)
+ : p(q.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+ return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+ return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+ return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+ ++p;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+ return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+ --p;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+ return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+ p += m;
+ return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+ p -= m;
+ return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+ return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+ return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+ return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+ return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+ const Ptr_Iterator<P>& y) {
+ return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 171. */
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 30. */
+#include <cstddef>
+#include <vector>
+
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
+ of the class DB_Row carries its own capacity; this enables extra
+ consistency checks to be performed.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+ Exception-safety is the only responsibility of this class: it has
+ to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+ //! Default constructor.
+ DB_Row_Impl_Handler();
+
+ //! Destructor.
+ ~DB_Row_Impl_Handler();
+
+ class Impl;
+
+ //! A pointer to the actual implementation.
+ Impl* impl;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+private:
+ //! Private and unimplemented: copy construction is not allowed.
+ DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+ //! Private and unimplemented: copy assignment is not allowed.
+ DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+ The class template DB_Row<T> allows for the efficient representation of
+ the single rows of a DB_Matrix. It contains elements of type T stored
+ as a vector. The class T is a family of extended numbers that
+ must provide representation for
+ \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+ <EM>not a number</EM>, since this arises as the ``result'' of
+ undefined sums like \f$ +\infty + (-\infty) \f$).
+
+ The class T must provide the following methods:
+
+ \code
+ T()
+ \endcode
+ is the default constructor: no assumption is made on the particular
+ object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+ (see below).
+ \code
+ ~T()
+ \endcode
+ is the destructor.
+ \code
+ bool is_nan() const
+ \endcode
+ returns <CODE>true</CODE> if and only \p *this represents
+ the <EM>not a number</EM> value.
+ \code
+ bool OK() const
+ \endcode
+ returns <CODE>true</CODE> if and only if \p *this satisfies all
+ its invariants.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+ //! Pre-constructs a row: construction must be completed by construct().
+ DB_Row();
+
+ //! \name Post-constructors.
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with size \p sz and minimum capacity.
+ */
+ void construct(dimension_type sz);
+
+ //! Constructs properly a default-constructed element.
+ /*!
+ \param sz
+ The size of the row that will be constructed.
+
+ \param capacity
+ The minimum capacity of the row that will be constructed.
+
+ The row that we are constructing has a minimum capacity of
+ (i.e., it can contain at least) \p elements, \p sz of which
+ will be constructed now.
+ */
+ void construct(dimension_type sz, dimension_type capacity);
+
+ //! Constructs properly a conservative approximation of \p y.
+ /*!
+ \param y
+ A row containing the elements whose upward approximations will
+ be used to properly construct \p *this.
+
+ \param capacity
+ The capacity of the constructed row.
+
+ It is assumed that \p capacity is greater than or equal to the
+ size of \p y.
+ */
+ template <typename U>
+ void construct_upward_approximation(const DB_Row<U>& y,
+ dimension_type capacity);
+
+ //@}
+
+ //! Tight constructor: resizing will require reallocation.
+ DB_Row(dimension_type sz);
+
+ //! Sizing constructor with capacity.
+ DB_Row(dimension_type sz, dimension_type capacity);
+
+ //! Ordinary copy constructor.
+ DB_Row(const DB_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to \p y size.
+ */
+ DB_Row(const DB_Row& y, dimension_type capacity);
+
+ //! Copy constructor with specified size and capacity.
+ /*!
+ It is assumed that \p sz is greater than or equal to the size of \p y
+ and, of course, that \p sz is less than or equal to \p capacity.
+ Any new position is initialized to \f$+\infty\f$.
+ */
+ DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~DB_Row();
+
+ //! Assignment operator.
+ DB_Row& operator=(const DB_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(DB_Row& y);
+
+ //! Assigns the implementation of \p y to \p *this.
+ void assign(DB_Row& y);
+
+ /*! \brief
+ Allocates memory for a default constructed DB_Row object,
+ allowing for \p capacity coefficients at most.
+
+ It is assumed that no allocation has been performed before
+ (otherwise, a memory leak will occur).
+ After execution, the size of the DB_Row object is zero.
+ */
+ void allocate(dimension_type capacity);
+
+ //! Expands the row to size \p new_size.
+ /*!
+ Adds new positions to the implementation of the row
+ obtaining a new row with size \p new_size.
+ It is assumed that \p new_size is between the current size
+ and capacity of the row. The new positions are initialized
+ to \f$+\infty\f$.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ Destroys elements of the row implementation
+ from position \p new_size to the end.
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Returns the size() of the largest possible DB_Row.
+ static dimension_type max_size();
+
+ //! Gives the number of coefficients currently in use.
+ dimension_type size() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the element of the row indexed by \p k.
+ T& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of the row indexed by \p k.
+ const T& operator[](dimension_type k) const;
+ //@}
+
+ //! A (non const) random access iterator to access the row's elements.
+ typedef Implementation::Ptr_Iterator<T*> iterator;
+
+ //! A const random access iterator to access the row's elements.
+ typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+ /*! \brief
+ Returns the const iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const iterator.
+ */
+ iterator begin();
+
+ //! Returns the past-the-end iterator.
+ iterator end();
+
+ /*! \brief
+ Returns the const iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const iterator.
+ const_iterator end() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns the total size in bytes of the memory occupied by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ /*! \brief
+ Returns the size in bytes of the memory managed by \p *this,
+ provided the capacity of \p *this is given by \p capacity.
+ */
+ memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const DB_Row& y);
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Row<T>& x, DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+ typename std::vector<DB_Row<T> >::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+ The class DB_Row_Impl_Handler::Impl provides the implementation of
+ DB_Row objects and, in particular, of the corresponding memory
+ allocation functions.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+ //! \name Custom allocator and deallocator.
+ //@{
+
+ /*! \brief
+ Allocates a chunk of memory able to contain \p capacity T objects
+ beyond the specified \p fixed_size and returns a pointer to the new
+ allocated memory.
+ */
+ static void* operator new(size_t fixed_size, dimension_type capacity);
+
+ //! Uses the standard delete operator to free the memory \p p points to.
+ static void operator delete(void* p);
+
+ /*! \brief
+ Placement version: uses the standard operator delete to free
+ the memory \p p points to.
+ */
+ static void operator delete(void* p, dimension_type capacity);
+ //@}
+
+ //! Default constructor.
+ Impl();
+
+ //! Destructor.
+ /*!
+ Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+ to delete all the row elements.
+ */
+ ~Impl();
+
+ //! Expands the row to size \p new_size.
+ /*!
+ It is assumed that \p new_size is between the current size and capacity.
+ */
+ void expand_within_capacity(dimension_type new_size);
+
+ //! Shrinks the row by erasing elements at the end.
+ /*!
+ It is assumed that \p new_size is not greater than the current size.
+ */
+ void shrink(dimension_type new_size);
+
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const Impl& y);
+
+ /*! \brief
+ Exception-safe upward approximation construction mechanism
+ for coefficients.
+ */
+ template <typename U>
+ void construct_upward_approximation(const U& y);
+
+ //! Returns the size() of the largest possible Impl.
+ static dimension_type max_size();
+
+ //! \name Size accessors.
+ //@{
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Sets to \p new_sz the actual size of \p *this.
+ void set_size(dimension_type new_sz);
+
+ //! Increments the size of \p *this by 1.
+ void bump_size();
+ //@}
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the element of \p *this indexed by \p k.
+ T& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of \p *this indexed by \p k.
+ const T& operator[](dimension_type k) const;
+ //@}
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+private:
+ friend class DB_Row<T>;
+
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The vector of coefficients.
+ T vec_[
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ 0
+#else
+ 1
+#endif
+ ];
+
+ //! Private and unimplemented: copy construction is not allowed.
+ Impl(const Impl& y);
+
+ //! Private and unimplemented: assignment is not allowed.
+ Impl& operator=(const Impl&);
+
+ //! Exception-safe copy construction mechanism.
+ void copy_construct(const Impl& y);
+};
+
+/* Automatically generated from PPL source file ../src/DB_Row_inlines.hh line 1. */
+/* DB_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_inlines.hh line 29. */
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+ const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+ PPL_ASSERT(capacity >= 1);
+ return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+ ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+ ::operator delete(p);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+ return
+ sizeof(*this)
+ + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ - 1*sizeof(T)
+#endif
+ + external_memory_in_bytes();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+ // In general, this is a lower bound, as the capacity of *this
+ // may be strictly greater than `size_'
+ return total_memory_in_bytes(size_);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+ return std::numeric_limits<size_t>::max() / sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+ return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+ size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+ ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+ : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+ shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+ : impl(0) {
+#if PPL_DB_ROW_EXTRA_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+ delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+ PPL_ASSERT(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+ return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+ return this->impl->size();
+}
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+ return this->capacity_;
+}
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+ : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ const
+#endif
+ dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ PPL_ASSERT(x.impl == 0);
+ x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(x.capacity_ == 0);
+ x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(new_size <= x.capacity_);
+#endif
+ x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl && y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ PPL_ASSERT(y.size() <= x.capacity_);
+#endif
+ x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+ const dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ PPL_ASSERT(y.impl);
+ x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+ const dimension_type capacity) {
+ PPL_ASSERT(sz <= capacity && capacity <= max_size());
+ allocate(capacity);
+ expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+ construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+ construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+ : DB_Row_Impl_Handler<T>() {
+ if (y.impl != 0) {
+ allocate(compute_capacity(y.size(), max_size()));
+ copy_construct_coefficients(y);
+ }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ PPL_ASSERT(y.impl);
+ PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : DB_Row_Impl_Handler<T>() {
+ PPL_ASSERT(y.impl);
+ PPL_ASSERT(y.size() <= sz && sz <= capacity && capacity <= max_size());
+ allocate(capacity);
+ copy_construct_coefficients(y);
+ expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+ DB_Row<T>& x = *this;
+ PPL_ASSERT(x.impl);
+ x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::m_swap(DB_Row& y) {
+ using std::swap;
+ DB_Row<T>& x = *this;
+ swap(x.impl, y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+ swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+ DB_Row<T>& x = *this;
+ x.impl = y.impl;
+#if PPL_DB_ROW_EXTRA_DEBUG
+ x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+ DB_Row tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+ DB_Row<T>& x = *this;
+ return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+ const DB_Row<T>& x = *this;
+ return (*x.impl)[k];
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+ const DB_Row<T>& x = *this;
+ return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+ const DB_Row<T>& x = *this;
+ return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
+ const DB_Row<T>& x = *this;
+ return x.impl->total_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+ const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+ return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+ return x.impl->total_memory_in_bytes();
+#endif
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+ return !(x == y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+swap(DB_Row<T>& x, DB_Row<T>& y) {
+ x.m_swap(y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+ typename std::vector<DB_Row<T> >::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_templates.hh line 1. */
+/* DB_Row class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+ const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < y_size; ++i) {
+ construct(vec_[i], y[i], ROUND_UP);
+ bump_size();
+ }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (y_size > 0) {
+ assign_r(vec_[0], y[0], ROUND_UP);
+ bump_size();
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 1; i < y_size; ++i) {
+ construct(vec_[i], y[i], ROUND_UP);
+ bump_size();
+ }
+ }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+ PPL_ASSERT(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (size() == 0 && new_size > 0) {
+ // vec_[0] is already constructed: we just need to assign +infinity.
+ assign_r(vec_[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ bump_size();
+ }
+#endif
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = size(); i < new_size; ++i) {
+ new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+ bump_size();
+ }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+ const dimension_type old_size = size();
+ PPL_ASSERT(new_size <= old_size);
+ // Since ~T() does not throw exceptions, nothing here does.
+ set_size(new_size);
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Make sure we do not try to destroy vec_[0].
+ if (new_size == 0)
+ ++new_size;
+#endif
+ // We assume construction was done "forward".
+ // We thus perform destruction "backward".
+ for (dimension_type i = old_size; i-- > new_size; )
+ vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+ const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < y_size; ++i) {
+ new (&vec_[i]) T(y.vec_[i]);
+ bump_size();
+ }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (y_size > 0) {
+ vec_[0] = y.vec_[0];
+ bump_size();
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 1; i < y_size; ++i) {
+ new (&vec_[i]) T(y.vec_[i]);
+ bump_size();
+ }
+ }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+ memory_size_type n = 0;
+ for (dimension_type i = size(); i-- > 0; )
+ n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+ return n;
+}
+
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+ const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+ row_capacity
+#endif
+ ) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ const DB_Row<T>& x = *this;
+ bool is_broken = false;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (x.capacity_ == 0) {
+ cerr << "Illegal row capacity: is 0, should be at least 1"
+ << endl;
+ is_broken = true;
+ }
+ else if (x.capacity_ == 1 && row_capacity == 0)
+ // This is fine.
+ ;
+ else
+# endif // !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+ if (x.capacity_ != row_capacity) {
+ cerr << "DB_Row capacity mismatch: is " << x.capacity_
+ << ", should be " << row_capacity << "."
+ << endl;
+ is_broken = true;
+ }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+ if (x.size() != row_size) {
+#ifndef NDEBUG
+ cerr << "DB_Row size mismatch: is " << x.size()
+ << ", should be " << row_size << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+ if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+ cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+ << ", size is " << x.size() << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+ for (dimension_type i = x.size(); i-- > 0; ) {
+ const T& element = x[i];
+ // Not OK is bad.
+ if (!element.OK()) {
+ is_broken = true;
+ break;
+ }
+ // In addition, nans should never occur.
+ if (is_not_a_number(element)) {
+#ifndef NDEBUG
+ cerr << "Not-a-number found in DB_Row."
+ << endl;
+#endif
+ is_broken = true;
+ break;
+ }
+ }
+
+ return !is_broken;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+ if (x.size() != y.size())
+ return false;
+ for (dimension_type i = x.size(); i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 469. */
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 32. */
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+ The template class DB_Matrix<T> allows for the representation of
+ a square matrix of T objects.
+ Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+ //! Returns the maximum number of rows a DB_Matrix can handle.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns a DB_Matrix can handle.
+ static dimension_type max_num_columns();
+
+ //! Builds an empty matrix.
+ /*!
+ DB_Rows' size and capacity are initialized to \f$0\f$.
+ */
+ DB_Matrix();
+
+ //! Builds a square matrix having the specified dimension.
+ explicit DB_Matrix(dimension_type n_rows);
+
+ //! Copy constructor.
+ DB_Matrix(const DB_Matrix& y);
+
+ //! Constructs a conservative approximation of \p y.
+ template <typename U>
+ explicit DB_Matrix(const DB_Matrix<U>& y);
+
+ //! Destructor.
+ ~DB_Matrix();
+
+ //! Assignment operator.
+ DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A read-only iterator over the rows of the matrix.
+ /*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ class const_iterator {
+ private:
+ typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+ //! The const iterator on the rows' vector \p rows.
+ Iter i;
+
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<Iter>::value_type value_type;
+ typedef typename std::iterator_traits<Iter>::difference_type
+ difference_type;
+ typedef typename std::iterator_traits<Iter>::pointer pointer;
+ typedef typename std::iterator_traits<Iter>::reference reference;
+
+ //! Default constructor.
+ const_iterator();
+
+ /*! \brief
+ Builds a const iterator on the matrix starting from
+ an iterator \p b on the elements of the vector \p rows.
+ */
+ explicit const_iterator(const Iter& b);
+
+ //! Ordinary copy constructor.
+ const_iterator(const const_iterator& y);
+
+ //! Assignment operator.
+ const_iterator& operator=(const const_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator& operator++();
+
+ //! Postfix increment operator.
+ const_iterator operator++(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const const_iterator& y) const;
+ };
+
+ /*! \brief
+ Returns the const_iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+private:
+ template <typename U> friend class DB_Matrix;
+
+ //! The rows of the matrix.
+ std::vector<DB_Row<T> > rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ /*! \brief
+ Capacity allocated for each row, i.e., number of
+ <CODE>long</CODE> objects that each row can contain.
+ */
+ dimension_type row_capacity;
+
+public:
+ //! Swaps \p *this with \p y.
+ void m_swap(DB_Matrix& y);
+
+ //! Makes the matrix grow by adding more rows and more columns.
+ /*!
+ \param new_n_rows
+ The number of rows and columns of the resized matrix.
+
+ A new matrix, with the specified dimension, is created.
+ The contents of the old matrix are copied in the upper, left-hand
+ corner of the new matrix, which is then assigned to \p *this.
+ */
+ void grow(dimension_type new_n_rows);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows and columns of the resized matrix.
+
+ A new matrix, with the specified dimension, is created without copying
+ the content of the old matrix and assigned to \p *this.
+ */
+ void resize_no_copy(dimension_type new_n_rows);
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ DB_Row<T>& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const DB_Row<T>& operator[](dimension_type k) const;
+ //@}
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Matrix<T>& x, DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the Euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_inlines.hh line 1. */
+/* DB_Matrix class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_inlines.hh line 31. */
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::m_swap(DB_Matrix& y) {
+ using std::swap;
+ swap(rows, y.rows);
+ swap(row_size, y.row_size);
+ swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+ return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+ return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+ : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+ : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+ return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+ return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+ return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+ return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+ return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+ : rows(),
+ row_size(0),
+ row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+ PPL_ASSERT(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+ return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+ // Without the following guard against auto-assignments we would
+ // recompute the row capacity based on row size, possibly without
+ // actually increasing the capacity of the rows. This would lead to
+ // an inconsistent state.
+ if (this != &y) {
+ // The following assignment may do nothing on auto-assignments...
+ rows = y.rows;
+ row_size = y.row_size;
+ // ... hence the following assignment must not be done on
+ // auto-assignments.
+ row_capacity = compute_capacity(y.row_size, max_num_columns());
+ }
+ return *this;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_num_rows = x.num_rows();
+ if (x_num_rows != y.num_rows())
+ return false;
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (dimension_type i = x_num_rows; i-- > 0; ) {
+ const DB_Row<T>& x_i = x[i];
+ const DB_Row<T>& y_i = y[i];
+ for (dimension_type j = x_num_rows; j-- > 0; ) {
+ const T& x_i_j = x_i[j];
+ const T& y_i_j = y_i[j];
+ if (is_plus_infinity(x_i_j)) {
+ if (is_plus_infinity(y_i_j))
+ continue;
+ else {
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+ }
+ else if (is_plus_infinity(y_i_j))
+ goto pinf;
+
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i_j > y_i_j) {
+ maybe_assign(tmp1p, tmp1, x_i_j, dir);
+ maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i_j, dir);
+ maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const DB_Matrix<T>& x,
+ const DB_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+swap(DB_Matrix<T>& x, DB_Matrix<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_templates.hh line 1. */
+/* DB_Matrix class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+ : rows(n_rows),
+ row_size(n_rows),
+ row_capacity(compute_capacity(n_rows, max_num_columns())) {
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0; i < n_rows; ++i)
+ rows[i].construct(n_rows, row_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+ : rows(y.rows.size()),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+ // Construct in direct order: will destroy in reverse order.
+ for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+ rows[i].construct_upward_approximation(y[i], row_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+ const dimension_type old_n_rows = rows.size();
+ PPL_ASSERT(new_n_rows >= old_n_rows);
+
+ if (new_n_rows > old_n_rows) {
+ if (new_n_rows <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation will take place.
+ std::vector<DB_Row<T> > new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows.
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_rows[i].construct(new_n_rows, row_capacity);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ swap(new_rows[i], rows[i]);
+ // Put the new vector into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+ for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+ rows[i].construct(new_n_rows, row_capacity);
+ }
+ }
+ else {
+ // We cannot even recycle the old rows.
+ DB_Matrix new_matrix;
+ new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows.
+ new_matrix.row_size = new_n_rows;
+ new_matrix.row_capacity = compute_capacity(new_n_rows,
+ max_num_columns());
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_matrix.rows[i].construct(new_matrix.row_size,
+ new_matrix.row_capacity);
+ // Copy the old rows.
+ ++i;
+ while (i-- > 0) {
+ // FIXME: copying may be unnecessarily costly.
+ DB_Row<T> new_row(rows[i],
+ new_matrix.row_size,
+ new_matrix.row_capacity);
+ swap(new_matrix.rows[i], new_row);
+ }
+ // Put the new vector into place.
+ m_swap(new_matrix);
+ return;
+ }
+ }
+ // Here we have the right number of rows.
+ if (new_n_rows > row_size) {
+ // We need more columns.
+ if (new_n_rows <= row_capacity)
+ // But we have enough capacity: we resize existing rows.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ rows[i].expand_within_capacity(new_n_rows);
+ else {
+ // Capacity exhausted: we must reallocate the rows and
+ // make sure all the rows have the same capacity.
+ const dimension_type new_row_capacity
+ = compute_capacity(new_n_rows, max_num_columns());
+ for (dimension_type i = old_n_rows; i-- > 0; ) {
+ // FIXME: copying may be unnecessarily costly.
+ DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+ swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ // Rows have grown or shrunk.
+ row_size = new_n_rows;
+ }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+ dimension_type old_n_rows = rows.size();
+
+ if (new_n_rows > old_n_rows) {
+ // Rows will be inserted.
+ if (new_n_rows <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation (of vector `rows') will take place.
+ std::vector<DB_Row<T> > new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+ // Construct the new rows (be careful: each new row must have
+ // the same capacity as each one of the old rows).
+ dimension_type i = new_n_rows;
+ while (i-- > old_n_rows)
+ new_rows[i].construct(new_n_rows, row_capacity);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ swap(new_rows[i], rows[i]);
+ // Put the new vector into place.
+ using std::swap;
+ swap(rows, new_rows);
+ }
+ else {
+ // Reallocation (of vector `rows') will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+ // Be careful: each new row must have
+ // the same capacity as each one of the old rows.
+ for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+ rows[i].construct(new_n_rows, row_capacity);
+ }
+ }
+ else {
+ // We cannot even recycle the old rows: allocate a new matrix and swap.
+ DB_Matrix new_matrix(new_n_rows);
+ m_swap(new_matrix);
+ return;
+ }
+ }
+ else if (new_n_rows < old_n_rows) {
+ // Drop some rows.
+ rows.resize(new_n_rows);
+ // Shrink the existing rows.
+ for (dimension_type i = new_n_rows; i-- > 0; )
+ rows[i].shrink(new_n_rows);
+ old_n_rows = new_n_rows;
+ }
+ // Here we have the right number of rows.
+ if (new_n_rows > row_size) {
+ // We need more columns.
+ if (new_n_rows <= row_capacity)
+ // But we have enough capacity: we resize existing rows.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ rows[i].expand_within_capacity(new_n_rows);
+ else {
+ // Capacity exhausted: we must reallocate the rows and
+ // make sure all the rows have the same capacity.
+ const dimension_type new_row_capacity
+ = compute_capacity(new_n_rows, max_num_columns());
+ for (dimension_type i = old_n_rows; i-- > 0; ) {
+ DB_Row<T> new_row(new_n_rows, new_row_capacity);
+ swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ }
+ // DB_Rows have grown or shrunk.
+ row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+ const DB_Matrix<T>& x = *this;
+ const char separator = ' ';
+ const dimension_type nrows = x.num_rows();
+ s << nrows << separator << "\n";
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j) {
+ using namespace IO_Operators;
+ s << x[i][j] << separator;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+ dimension_type nrows;
+ if (!(s >> nrows))
+ return false;
+ resize_no_copy(nrows);
+ DB_Matrix& x = *this;
+ for (dimension_type i = 0; i < nrows; ++i)
+ for (dimension_type j = 0; j < nrows; ++j) {
+ Result r = input(x[i][j], s, ROUND_CHECK);
+ if (result_relation(r) != VR_EQ || is_minus_infinity(x[i][j]))
+ return false;
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+ const dimension_type x_num_rows = x.num_rows();
+ if (x_num_rows != y.num_rows())
+ return false;
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+ memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+ for (dimension_type i = num_rows(); i-- > 0; )
+ n += rows[i].external_memory_in_bytes(row_capacity);
+ return n;
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // The matrix must be square.
+ if (num_rows() != row_size) {
+#ifndef NDEBUG
+ cerr << "DB_Matrix has fewer columns than rows:\n"
+ << "row_size is " << row_size
+ << ", num_rows() is " << num_rows() << "!"
+ << endl;
+#endif
+ return false;
+ }
+
+ const DB_Matrix& x = *this;
+ const dimension_type n_rows = x.num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ if (!x[i].OK(row_size, row_capacity))
+ return false;
+ }
+
+ // All checks passed.
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+ const dimension_type n = c.num_rows();
+ for (dimension_type i = 0; i < n; ++i) {
+ for (dimension_type j = 0; j < n; ++j)
+ s << c[i][j] << " ";
+ s << "\n";
+ }
+ return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 324. */
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 1. */
+/* Coefficient types of weakly-relational domains: declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+ The production policy for checked numbers used in weakly-relational
+ domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Handle not-a-number special value.
+ const_bool_nodef(has_nan, true);
+
+ //! Handle infinity special values.
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ //! Honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, true);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, false);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+ The debugging policy for checked numbers used in weakly-relational
+ domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Debug_WRD_Extended_Number_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, true);
+
+ //! Check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, true);
+
+ //! Check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, true);
+
+ //! Check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, true);
+
+ //! Check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, true);
+
+ //! Check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, true);
+
+ //! Checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, true);
+
+ //! Handle not-a-number special value.
+ const_bool_nodef(has_nan, true);
+
+ //! Handle infinity special values.
+ const_bool_nodef(has_infinity, true);
+
+ // `convertible' is intentionally not defined: the compile time
+ // error on conversions is the expected behavior.
+
+ //! Honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, true);
+
+ //! Make extra checks to detect FPU NaN results.
+ const_bool_nodef(fpu_check_nan_result, true);
+
+ // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+ // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+ // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+ // ROUND_DEFAULT_INPUT is intentionally not defined.
+ // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_inlines.hh line 1. */
+/* Coefficient types of weakly-relational domains: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+inline void
+Debug_WRD_Extended_Number_Policy::handle_result(Result r) {
+ if (result_class(r) == VC_NAN)
+ throw_result_exception(r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 152. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 52. */
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+ Writes a textual representation of \p bds on \p s:
+ <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+ <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+ a system of constraints defining \p bds is written otherwise,
+ all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates BD_Shape */
+template <typename T>
+void swap(BD_Shape<T>& x, BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*! \relates BD_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same BDS.
+/*! \relates BD_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class BD_Shape_Helpers {
+public:
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as a bounded difference.
+ /*! \relates BD_Shape
+ \return
+ <CODE>true</CODE> if the constraint \p c is a
+ \ref Bounded_Difference_Shapes "bounded difference";
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0, 1 and 2.
+
+ \param c_first_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the first variable having
+ a non-zero coefficient in \p c.
+
+ \param c_second_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+ then it will be set to the index of the second variable having
+ a non-zero coefficient in \p c. If \p c_num_vars is set to 1, this must be
+ 0.
+
+ \param c_coeff
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the value of the first non-zero coefficient
+ in \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_bounded_difference(const Constraint& c,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+ std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+ The class template BD_Shape<T> allows for the efficient representation
+ of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+ called <EM>bounded difference shapes</EM> (BDSs, for short).
+ The name comes from the fact that the closed affine half-spaces that
+ characterize the polyhedron can be expressed by constraints of the form
+ \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+ term \f$k\f$ is a rational number.
+
+ Based on the class template type parameter \p T, a family of extended
+ numbers is built and used to approximate the inhomogeneous term of
+ bounded differences. These extended numbers provide a representation
+ for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+ implementations for several arithmetic functions.
+ The value of the type parameter \p T may be one of the following:
+ - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+ - a bounded precision floating point type (e.g., \c float or \c double);
+ - an unbounded integer or rational type, as provided by GMP
+ (i.e., \c mpz_class or \c mpq_class).
+
+ The user interface for BDSs is meant to be as similar as possible to
+ the one developed for the polyhedron class C_Polyhedron.
+
+ The domain of BD shapes <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - bounded difference constraints;
+ - non-proper congruences (i.e., equalities) that are expressible
+ as bounded-difference constraints.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ A constraint is a bounded difference if it has the form
+ \f[
+ a_i x_i - a_j x_j \relsym b
+ \f]
+ where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+ \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+ \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+ The user is warned that the above bounded difference Constraint object
+ will be mapped into a \e correct and \e optimal approximation that,
+ depending on the expressive power of the chosen template argument \p T,
+ may loose some precision. Also note that strict constraints are not
+ bounded differences.
+
+ For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+ approximated by:
+ - \f$x - y \leq 1\f$,
+ if \p T is a (bounded or unbounded) integer type;
+ - \f$x - y \leq \frac{1}{3}\f$,
+ if \p T is the unbounded rational type \c mpq_class;
+ - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+ if \p T is a floating point type (having no exact representation
+ for \f$\frac{1}{3}\f$).
+
+ On the other hand, depending from the context, a Constraint object
+ encoding \f$3x - y \leq 1\f$ will be either upward approximated
+ (e.g., by safely ignoring it) or it will cause an exception.
+
+ In the following examples it is assumed that the type argument \p T
+ is one of the possible instances listed above and that variables
+ <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+ (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ cs.insert(z >= 0);
+ cs.insert(z <= 1);
+ BD_Shape<T> bd(cs);
+ \endcode
+ Since only those constraints having the syntactic form of a
+ <EM>bounded difference</EM> are optimally supported, the following code
+ will throw an exception (caused by constraints 7, 8 and 9):
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ cs.insert(z >= 0);
+ cs.insert(z <= 1);
+ cs.insert(x + y <= 0); // 7
+ cs.insert(x - z + x >= 0); // 8
+ cs.insert(3*z - y <= 1); // 9
+ BD_Shape<T> bd(cs);
+ \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of
+ the inequalities defining a BDS.
+ */
+#ifndef NDEBUG
+ typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+ typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+ //! The numeric base type upon which bounded differences are built.
+ typedef T coefficient_type_base;
+
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of the
+ inequalities defining a BDS.
+ */
+ typedef N coefficient_type;
+
+ //! Returns the maximum space dimension that a BDS can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle constraints.
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns \c false indicating that this domain cannot recycle congruences.
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds a universe or empty BDS of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the BDS;
+
+ \param kind
+ Specifies whether the universe or the empty BDS has to be built.
+ */
+ explicit BD_Shape(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ BD_Shape(const BD_Shape& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename U>
+ explicit BD_Shape(const BD_Shape<U>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS from the system of constraints \p cs.
+ /*!
+ The BDS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of BD constraints.
+
+ \exception std::invalid_argument
+ Thrown if \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+ */
+ explicit BD_Shape(const Constraint_System& cs);
+
+ //! Builds a BDS from a system of congruences.
+ /*!
+ The BDS inherits the space dimension of \p cgs
+
+ \param cgs
+ A system of congruences.
+
+ \exception std::invalid_argument
+ Thrown if \p cgs contains congruences which are not optimally
+ supported by the BD shape domain.
+ */
+ explicit BD_Shape(const Congruence_System& cgs);
+
+ //! Builds a BDS from the system of generators \p gs.
+ /*!
+ Builds the smallest BDS containing the polyhedron defined by \p gs.
+ The BDS inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit BD_Shape(const Generator_System& gs);
+
+ //! Builds a BDS from the polyhedron \p ph.
+ /*!
+ Builds a BDS containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+ smallest one containing \p ph.
+ */
+ explicit BD_Shape(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS out of a box.
+ /*!
+ The BDS inherits the space dimension of the box.
+ The built BDS is the most precise BDS that includes the box.
+
+ \param box
+ The box representing the BDS to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit BD_Shape(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS out of a grid.
+ /*!
+ The BDS inherits the space dimension of the grid.
+ The built BDS is the most precise BDS that includes the grid.
+
+ \param grid
+ The grid used to build the BDS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p grid exceeds the maximum
+ allowed space dimension.
+ */
+ explicit BD_Shape(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a BDS from an octagonal shape.
+ /*!
+ The BDS inherits the space dimension of the octagonal shape.
+ The built BDS is the most precise BDS that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the BDS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit BD_Shape(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ BD_Shape& operator=(const BD_Shape& y);
+
+ /*! \brief
+ Swaps \p *this with \p y
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ void m_swap(BD_Shape& y);
+
+ //! Destructor.
+ ~BD_Shape();
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the BD_Shape
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns a system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a minimal system of (equality) congruences
+ satisfied by \p *this with the same affine dimension as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const BD_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const BD_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const BD_Shape& y) const;
+
+ //! Returns the relations holding between \p *this and the constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and the congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and the generator \p g.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+ bool is_universe() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this satisfies
+ all its invariants.
+ */
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the BD_Shape
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of bounded differences
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the BD shape domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p *this.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the BD shape domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this.
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the BD shape domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ Contains the congruences that will be added to the system of
+ constraints of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the BD shape domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ Contains the congruences that will be added to the system of
+ constraints of \p *this. Its elements may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the BD shape domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of bounded differences
+ defining \p *this.
+
+ \param c
+ The constraint. If it is not a bounded difference, it will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine the system of
+ bounded differences of \p *this.
+
+ \param cg
+ The congruence. If it is not a bounded difference equality, it
+ will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine the system of
+ bounded differences defining \p *this.
+
+ \param cs
+ The constraint system to be used. Constraints that are not bounded
+ differences are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine the system of
+ bounded differences defining \p *this.
+
+ \param cgs
+ The congruence system to be used. Congruences that are not bounded
+ difference equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines the system of BD_Shape constraints defining \p *this using
+ the constraint expressed by \p left \f$\leq\f$ \p right.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Refines the system of BD_Shape constraints defining \p *this using
+ the constraint expressed by \p left \f$\relsym\f$ \p right, where
+ \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ //! Applies to \p dest the interval constraints embedded in \p *this.
+ /*!
+ \param dest
+ The object to which the constraints will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest.
+
+ The template type parameter U must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the space dimension of the object.
+ \code
+ void set_empty()
+ \endcode
+ sets the object to an empty object.
+ \code
+ bool restrict_lower(dimension_type dim, const T& lb)
+ \endcode
+ restricts the object by applying the lower bound \p lb to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ \code
+ bool restrict_upper(dimension_type dim, const T& ub)
+ \endcode
+ restricts the object by applying the upper bound \p ub to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ */
+ template <typename U>
+ void export_interval_constraints(U& dest) const;
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const BD_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ If the \e integer upper bound of \p *this and \p y is exact,
+ it is assigned to \p *this and <CODE>true</CODE> is returned;
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ The integer upper bound of two rational BDS is the smallest rational
+ BDS containing all the integral points of the two arguments.
+ This method requires that the coefficient type parameter \c T is
+ an integral type.
+ */
+ bool integer_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BD shape containing
+ the set difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point coefficients that
+ defines the affine expression. ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+ */
+ template <typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form<Interval<T, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const BD_Shape& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator referencing the first stop-point.
+
+ \param last
+ An iterator referencing one past the last stop-point.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename Iterator>
+ void CC76_extrapolation_assign(const BD_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of restoring in \p y the constraints
+ of \p *this that were lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ A BDS that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ As was the case for widening operators, the argument \p y is meant to
+ denote the value computed in the previous iteration step, whereas
+ \p *this denotes the value computed in the current iteration step
+ (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+ <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+ the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+ */
+ void CC76_narrowing_assign(const BD_Shape& y);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref H79_widening "H79-widening" between \p *this and \p y.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ //! Same as H79_widening_assign(y, tp).
+ void widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref H79_widening "H79-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ A BDS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened BDS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+ */
+ void limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old BDS into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new
+ BDS, which is defined by a system of bounded differences in which the
+ variables running through the new dimensions are unconstrained.
+ For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the BDS
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the BDS and does not embed it in
+ the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the
+ new BDS, which is defined by a system of bounded differences in
+ which the variables running through the new dimensions are all
+ constrained to be equal to 0.
+ For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the BDS
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cB
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const BD_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty co-domain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the co-domain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename Interval_Info>
+ void refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+ store) const;
+
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! The matrix representing the system of bounded differences.
+ DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+/* Automatically generated from PPL source file ../src/BDS_Status_idefs.hh line 1. */
+/* BD_Shape<T>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status_idefs.hh directly; use BD_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the BDS is the empty set;
+ - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+ closed system of bounded differences, so that all the constraints are
+ as tight as possible;
+ - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+ closed system of bounded differences and each constraint in such a system
+ is marked as being either redundant or non-redundant.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion;
+ - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_shortest_path_closed() const;
+ void reset_shortest_path_closed();
+ void set_shortest_path_closed();
+
+ bool test_shortest_path_reduced() const;
+ void reset_shortest_path_reduced();
+ void set_shortest_path_reduced();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bit-masks for the individual assertions.
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t SHORTEST_PATH_CLOSED = 1U << 1;
+ static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bit-mask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 1941. */
+#undef PPL_IN_BD_Shape_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ //! A matrix indicating which constraints are redundant.
+ Bit_Matrix redundancy_dbm;
+
+ //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+ bool marked_zero_dim_univ() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the BDS is known to be empty.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the system of bounded differences
+ is known to be shortest-path closed.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+ */
+ bool marked_shortest_path_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if the system of bounded differences
+ is known to be shortest-path reduced.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+ */
+ bool marked_shortest_path_reduced() const;
+
+ //! Turns \p *this into an empty BDS.
+ void set_empty();
+
+ //! Turns \p *this into an zero-dimensional universe BDS.
+ void set_zero_dim_univ();
+
+ //! Marks \p *this as shortest-path closed.
+ void set_shortest_path_closed();
+
+ //! Marks \p *this as shortest-path closed.
+ void set_shortest_path_reduced();
+
+ //! Marks \p *this as possibly not shortest-path closed.
+ void reset_shortest_path_closed();
+
+ //! Marks \p *this as possibly not shortest-path reduced.
+ void reset_shortest_path_reduced();
+
+ //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+ void shortest_path_closure_assign() const;
+
+ /*! \brief
+ Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+ records into <CODE>this->redundancy_dbm</CODE> which of the entries
+ in <CODE>this->dbm</CODE> are redundant.
+ */
+ void shortest_path_reduction_assign() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+ is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+ correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+ */
+ bool is_shortest_path_reduced() const;
+
+ /*! \brief
+ Incrementally computes shortest-path closure, assuming that only
+ constraints affecting variable \p var need to be considered.
+
+ \note
+ It is assumed that \c *this, which was shortest-path closed,
+ has only been modified by adding constraints affecting variable
+ \p var. If this assumption is not satisfied, i.e., if a non-redundant
+ constraint not affecting variable \p var has been added, the behavior
+ is undefined.
+ */
+ void incremental_shortest_path_closure_assign(Variable var) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Current implementation is based on a variant of Algorithm 4.1 in
+ A. Bemporad, K. Fukuda, and F. D. Torrisi
+ <em>Convexity Recognition of the Union of Polyhedra</em>
+ Technical Report AUT00-13, ETH Zurich, 2000
+ tailored to the special case of BD shapes.
+
+ \note
+ It is assumed that \p *this and \p y are dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+ */
+ bool BFT00_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact it is assigned
+ to \p *this and \c true is returned, otherwise \c false is returned.
+
+ Implementation for the rational (resp., integer) case is based on
+ Theorem 5.2 (resp. Theorem 5.3) of \ref BHZ09b "[BHZ09b]".
+ The Boolean template parameter \c integer_upper_bound allows for
+ choosing between the rational and integer upper bound algorithms.
+
+ \note
+ It is assumed that \p *this and \p y are dimension-compatible;
+ if the assumption does not hold, the behavior is undefined.
+
+ \note
+ The integer case is only enabled if T is an integer data type.
+ */
+ template <bool integer_upper_bound>
+ bool BHZ09_upper_bound_assign_if_exact(const BD_Shape& y);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added. Non BD constraints are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+ Non BD equalities are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= numer/denom</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ Adds to the BDS the constraint
+ \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+ Note that the coefficient of \p var in \p expr is null.
+ */
+ void refine(Variable var, Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ //! Removes all the constraints on row/column \p v.
+ void forget_all_dbm_constraints(dimension_type v);
+ //! Removes all binary constraints on row/column \p v.
+ void forget_binary_dbm_constraints(dimension_type v);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each dbm index \p u (less than or equal to \p last_v and different
+ from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+ starting from \p ub_v which is an upper bound for \p v.
+
+ The shortest-path closure is able to deduce the constraint
+ <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+ \p u played an active role in the computation of the upper bound for
+ \p v, i.e., if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero. In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+ */
+ void deduce_v_minus_u_bounds(dimension_type v,
+ dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form image" that
+ handle the general case: \f$l = c\f$
+ */
+ template <typename Interval_Info>
+ void inhomogeneous_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form
+ image" that handle the general case: \f$l = ax + c\f$
+ */
+ template <typename Interval_Info>
+ void one_variable_affine_form_image
+ (const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b,
+ const Interval<T, Interval_Info>& w_coeff,
+ const dimension_type& w_id,
+ const dimension_type& space_dim);
+
+ /*! \brief
+ Auxiliary function for \ref affine_form_relation "affine form image" that
+ handle the general case: \f$l = ax + by + c\f$
+ */
+ template <typename Interval_Info>
+ void two_variables_affine_form_image
+ (const dimension_type& var_id,
+ const Linear_Form<Interval<T,Interval_Info> >& lf,
+ const dimension_type& space_dim);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case: \f$l = ax + c\f$
+ */
+ template <typename Interval_Info>
+ void left_inhomogeneous_refine
+ (const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case: \f$ax + b = cy + d\f$
+ */
+ template <typename Interval_Info>
+ void left_one_var_refine
+ (const dimension_type& left_w_id,
+ const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Auxiliary function for refine with linear form that handle
+ the general case.
+ */
+ template <typename Interval_Info>
+ void general_refine(const dimension_type& left_w_id,
+ const dimension_type& right_w_id,
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right);
+
+ template <typename Interval_Info>
+ void linear_form_upper_bound(const Linear_Form<Interval<T, Interval_Info> >&
+ lf,
+ N& result) const;
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each dbm index \p u (less than or equal to \p last_v and different
+ from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+ starting from \p minus_lb_v which is a lower bound for \p v.
+
+ The shortest-path closure is able to deduce the constraint
+ <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+ \p u played an active role in the computation of the lower bound for
+ \p v, i.e., if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+ */
+ void deduce_u_minus_v_bounds(dimension_type v,
+ dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v);
+
+ /*! \brief
+ Adds to \p limiting_shape the bounded differences in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const;
+
+ //! Compute the (zero-equivalence classes) predecessor relation.
+ /*!
+ It is assumed that the BDS is not empty and shortest-path closed.
+ */
+ void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the BDS is not empty and shortest-path closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+ void drop_some_non_integer_points_helper(N& elem);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const BD_Shape& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template<typename Interval_Info>
+ void
+ throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<Interval<T, Interval_Info> >&
+ lf) const;
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+/* Automatically generated from PPL source file ../src/BDS_Status_inlines.hh line 1. */
+/* BD_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+ flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+ return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+ // A system is reduced only if it is also closed.
+ reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+ set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+ return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+ reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+ PPL_ASSERT(test_shortest_path_closed());
+ set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The empty flag is incompatible with any other one."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Shortest-path reduction implies shortest-path closure.
+ if (test_shortest_path_reduced()) {
+ if (test_shortest_path_closed())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The shortest-path reduction flag should also imply "
+ << "the closure flag."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::BD_Shapes;
+ s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << separator
+ << (test_empty() ? yes : no) << empty << separator
+ << separator
+ << (test_shortest_path_closed() ? yes : no) << sp_closed << separator
+ << (test_shortest_path_reduced() ? yes : no) << sp_reduced << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::BD_Shapes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, sp_closed, positive))
+ return false;
+ if (positive)
+ set_shortest_path_closed();
+ else
+ reset_shortest_path_closed();
+
+ if (!get_field(s, sp_reduced, positive))
+ return false;
+ if (positive)
+ set_shortest_path_reduced();
+ else
+ reset_shortest_path_reduced();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_inlines.hh line 1. */
+/* BD_Shape class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 1. */
+/* C_Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 33. */
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+ An object of the class C_Polyhedron represents a
+ <EM>topologically closed</EM> convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ When building a closed polyhedron starting from
+ a system of constraints, an exception is thrown if the system
+ contains a <EM>strict inequality</EM> constraint.
+ Similarly, an exception is thrown when building a closed polyhedron
+ starting from a system of generators containing a <EM>closure point</EM>.
+
+ \note
+ Such an exception will be obtained even if the system of
+ constraints (resp., generators) actually defines
+ a topologically closed subset of the vector space, i.e.,
+ even if all the strict inequalities (resp., closure points)
+ in the system happen to be redundant with respect to the
+ system obtained by removing all the strict inequality constraints
+ (resp., all the closure points).
+ In contrast, when building a closed polyhedron starting from
+ an object of the class NNC_Polyhedron,
+ the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+ //! Builds either the universe or the empty C polyhedron.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the C polyhedron;
+
+ \param kind
+ Specifies whether a universe or an empty C polyhedron should be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+ Both parameters are optional:
+ by default, a 0-dimension space universe C polyhedron is built.
+ */
+ explicit C_Polyhedron(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a C polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ explicit C_Polyhedron(const Constraint_System& cs);
+
+ //! Builds a C polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds a C polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points,
+ or if it contains closure points.
+ */
+ explicit C_Polyhedron(const Generator_System& gs);
+
+ //! Builds a C polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points,
+ or if it contains closure points.
+ */
+ C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds a C polyhedron from a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the polyhedron.
+ */
+ explicit C_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds a C polyhedron recycling a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence
+ system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+ /*! \brief
+ Builds a C polyhedron representing the topological closure
+ of the NNC polyhedron \p y.
+
+ \param y
+ The NNC polyhedron to be used;
+
+ \param complexity
+ This argument is ignored.
+ */
+ explicit C_Polyhedron(const NNC_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a box.
+ /*!
+ The polyhedron inherits the space dimension of the box
+ and is the most precise that includes the box.
+ The algorithm used has polynomial complexity.
+
+ \param box
+ The box representing the polyhedron to be approximated;
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Interval>
+ explicit C_Polyhedron(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a BD shape.
+ /*!
+ The polyhedron inherits the space dimension of the BDS and is
+ the most precise that includes the BDS.
+
+ \param bd
+ The BDS used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit C_Polyhedron(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of an octagonal shape.
+ /*!
+ The polyhedron inherits the space dimension of the octagonal shape
+ and is the most precise that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a C polyhedron out of a grid.
+ /*!
+ The polyhedron inherits the space dimension of the grid
+ and is the most precise that includes the grid.
+
+ \param grid
+ The grid used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ explicit C_Polyhedron(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ C_Polyhedron(const C_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ C_Polyhedron& operator=(const C_Polyhedron& y);
+
+ //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+ C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+ //! Destructor.
+ ~C_Polyhedron();
+
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+ //! Same as poly_hull_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest C polyhedron containing the
+ result of computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_inlines.hh line 1. */
+/* C_Polyhedron class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(num_dimensions,
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+ "C_Polyhedron(cs, recycle)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+ "C_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+ "C_Polyhedron(gs, recycle)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(box, NECESSARILY_CLOSED,
+ "C_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(bd.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+ : Polyhedron(NECESSARILY_CLOSED,
+ check_space_dimension_overflow(os.space_dimension(),
+ NECESSARILY_CLOSED,
+ "C_Polyhedron(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(os.constraints());
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+ : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+ Polyhedron::operator=(y);
+ return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+ C_Polyhedron c_y(y);
+ m_swap(c_y);
+ return *this;
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+ return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 290. */
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 1. */
+/* Octagonal_Shape class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 1. */
+/* OR_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 31. */
+#include <cstddef>
+#include <iosfwd>
+
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+ instance of the class OR_Matrix::Pseudo_Row carries its own size;
+ this enables extra consistency checks to be performed.
+ \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+ An OR_Matrix object is a DB_Row object that allows
+ the representation of a \em pseudo-triangular matrix,
+ like the following:
+
+<PRE>
+ _ _
+ 0 |_|_|
+ 1 |_|_|_ _
+ 2 |_|_|_|_|
+ 3 |_|_|_|_|_ _
+ 4 |_|_|_|_|_|_|
+ 5 |_|_|_|_|_|_|
+ . . .
+ _ _ _ _ _ _ _
+ 2n-2 |_|_|_|_|_|_| ... |_|
+ 2n-1 |_|_|_|_|_|_| ... |_|
+ 0 1 2 3 4 5 ... 2n-1
+
+</PRE>
+
+ It is characterized by parameter n that defines the structure,
+ and such that there are 2*n rows (and 2*n columns).
+ It provides row_iterators for the access to the rows
+ and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+ /*! \brief
+ An object that behaves like a matrix's row with respect to
+ the subscript operators.
+ */
+ template <typename U>
+ class Pseudo_Row {
+ public:
+ /*! \brief
+ Copy constructor allowing the construction of a const pseudo-row
+ from a non-const pseudo-row.
+ Ordinary copy constructor.
+ */
+ template <typename V>
+ Pseudo_Row(const Pseudo_Row<V>& y);
+
+ //! Destructor.
+ ~Pseudo_Row();
+
+ //! Subscript operator.
+ U& operator[](dimension_type k) const;
+
+ //! Default constructor: creates an invalid object that has to be assigned.
+ Pseudo_Row();
+
+ //! Assignment operator.
+ Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+ private:
+#else
+ // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+ public:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+ Pseudo_Row(U& y, dimension_type s);
+
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Private constructor for a Pseudo_Row beginning at \p y.
+ explicit Pseudo_Row(U& y);
+
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! Holds a reference to the beginning of this row.
+ U* first;
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+ // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+ private:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+ //! The size of the row.
+ dimension_type size_;
+
+ //! Returns the size of the row.
+ dimension_type size() const;
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+ // FIXME: the EDG-based compilers (such as Comeau and Intel)
+ // are here in wild disagreement with GCC: what is a legal friend
+ // declaration for one, is illegal for the others.
+#ifdef __EDG__
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::Pseudo_Row;
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::any_row_iterator;
+#else
+ template <typename V> friend class Pseudo_Row;
+ template <typename V> friend class any_row_iterator;
+#endif
+
+ friend class OR_Matrix;
+ }; // class Pseudo_Row
+
+public:
+ //! A (non const) reference to a matrix's row.
+ typedef Pseudo_Row<T> row_reference_type;
+
+ //! A const reference to a matrix's row.
+ typedef Pseudo_Row<const T> const_row_reference_type;
+
+private:
+ /*! \brief
+ A template class to derive both OR_Matrix::iterator
+ and OR_Matrix::const_iterator.
+ */
+ template <typename U>
+ class any_row_iterator {
+ public:
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef Pseudo_Row<U> value_type;
+ typedef long difference_type;
+ typedef const Pseudo_Row<U>* pointer;
+ typedef const Pseudo_Row<U>& reference;
+
+ //! Constructor to build past-the-end objects.
+ any_row_iterator(dimension_type n_rows);
+
+ /*! \brief
+ Builds an iterator pointing at the beginning of an OR_Matrix whose
+ first element is \p base;
+ */
+ explicit any_row_iterator(U& base);
+
+ /*! \brief
+ Copy constructor allowing the construction of a const_iterator
+ from a non-const iterator.
+ */
+ template <typename V>
+ any_row_iterator(const any_row_iterator<V>& y);
+
+ /*! \brief
+ Assignment operator allowing the assignment of a non-const iterator
+ to a const_iterator.
+ */
+ template <typename V>
+ any_row_iterator& operator=(const any_row_iterator<V>& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ any_row_iterator& operator++();
+
+ //! Postfix increment operator.
+ any_row_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ any_row_iterator& operator--();
+
+ //! Postfix decrement operator.
+ any_row_iterator operator--(int);
+
+ //! Subscript operator.
+ reference operator[](difference_type m) const;
+
+ //! Assignment-increment operator.
+ any_row_iterator& operator+=(difference_type m);
+
+ //! Assignment-increment operator for \p m of unsigned type.
+ template <typename Unsigned>
+ typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator&>::type
+ operator+=(Unsigned m);
+
+ //! Assignment-decrement operator.
+ any_row_iterator& operator-=(difference_type m);
+
+ //! Returns the difference between \p *this and \p y.
+ difference_type operator-(const any_row_iterator& y) const;
+
+ //! Returns the sum of \p *this and \p m.
+ any_row_iterator operator+(difference_type m) const;
+
+ //! Returns the sum of \p *this and \p m, for \p m of unsigned type.
+ template <typename Unsigned>
+ typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator>::type
+ operator+(Unsigned m) const;
+
+ //! Returns the difference of \p *this and \p m.
+ any_row_iterator operator-(difference_type m) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+ bool operator==(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is different from \p y.
+ */
+ bool operator!=(const any_row_iterator& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+ bool operator<(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is less than
+ or equal to \p y.
+ */
+ bool operator<=(const any_row_iterator& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+ bool operator>(const any_row_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is greater than
+ or equal to \p y.
+ */
+ bool operator>=(const any_row_iterator& y) const;
+
+ dimension_type row_size() const;
+
+ dimension_type index() const;
+
+ private:
+ //! Represents the beginning of a row.
+ Pseudo_Row<U> value;
+
+ //! External index.
+ dimension_type e;
+
+ //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+ dimension_type i;
+
+ // FIXME: the EDG-based compilers (such as Comeau and Intel)
+ // are here in wild disagreement with GCC: what is a legal friend
+ // declaration for one, is illegal for the others.
+#ifdef __EDG__
+ template <typename V> template<typename W>
+ friend class OR_Matrix<V>::any_row_iterator;
+#else
+ template <typename V> friend class any_row_iterator;
+#endif
+ }; // class any_row_iterator
+
+public:
+ //! A (non const) row iterator.
+ typedef any_row_iterator<T> row_iterator;
+
+ //! A const row iterator.
+ typedef any_row_iterator<const T> const_row_iterator;
+
+ //! A (non const) element iterator.
+ typedef typename DB_Row<T>::iterator element_iterator;
+
+ //! A const element iterator.
+ typedef typename DB_Row<T>::const_iterator const_element_iterator;
+
+public:
+ //! Returns the maximum number of rows of a OR_Matrix.
+ static dimension_type max_num_rows();
+
+ //! Builds a matrix with specified dimensions.
+ /*!
+ \param num_dimensions
+ The space dimension of the matrix that will be created.
+
+ This constructor creates a matrix with \p 2*num_dimensions rows.
+ Each element is initialized to plus infinity.
+ */
+ OR_Matrix(dimension_type num_dimensions);
+
+ //! Copy constructor.
+ OR_Matrix(const OR_Matrix& y);
+
+ //! Constructs a conservative approximation of \p y.
+ template <typename U>
+ explicit OR_Matrix(const OR_Matrix<U>& y);
+
+ //! Destructor.
+ ~OR_Matrix();
+
+ //! Assignment operator.
+ OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+ template <typename U> friend class OR_Matrix;
+
+ //! Contains the rows of the matrix.
+ /*!
+ A DB_Row which contains the rows of the OR_Matrix
+ inserting each successive row to the end of the vec.
+ To contain all the elements of OR_Matrix the size of the DB_Row
+ is 2*n*(n+1), where the n is the characteristic parameter of
+ OR_Matrix.
+ */
+ DB_Row<T> vec;
+
+ //! Contains the dimension of the space of the matrix.
+ dimension_type space_dim;
+
+ //! Contains the capacity of \p vec.
+ dimension_type vec_capacity;
+
+ //! Private and not implemented: default construction is not allowed.
+ OR_Matrix();
+
+ /*! \brief
+ Returns the index into <CODE>vec</CODE> of the first element
+ of the row of index \p k.
+ */
+ static dimension_type row_first_element_index(dimension_type k);
+
+public:
+ //! Returns the size of the row of index \p k.
+ static dimension_type row_size(dimension_type k);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(OR_Matrix& y);
+
+ //! Makes the matrix grow by adding more space dimensions.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ Adds new rows of right dimension to the end if
+ there is enough capacity; otherwise, creates a new matrix,
+ with the specified dimension, copying the old elements
+ in the upper part of the new matrix, which is
+ then assigned to \p *this.
+ Each new element is initialized to plus infinity.
+ */
+ void grow(dimension_type new_dim);
+
+ //! Makes the matrix shrink by removing the last space dimensions.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ Erases from matrix to the end the rows with index
+ greater than 2*new_dim-1.
+ */
+ void shrink(dimension_type new_dim);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_dim
+ The new dimension of the resized matrix.
+
+ If the new dimension is greater than the old one, it adds new rows
+ of right dimension to the end if there is enough capacity; otherwise,
+ it creates a new matrix, with the specified dimension, which is
+ then assigned to \p *this.
+ If the new dimension is less than the old one, it erase from the matrix
+ the rows having index greater than 2*new_dim-1
+ */
+ void resize_no_copy(dimension_type new_dim);
+
+ //! Returns the space-dimension of the matrix.
+ dimension_type space_dimension() const;
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+
+ //! \name Subscript operators.
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ row_reference_type operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const_row_reference_type operator[](dimension_type k) const;
+ //@}
+
+
+ /*! \brief
+ Returns an iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ row_iterator row_begin();
+
+ //! Returns the past-the-end const_iterator.
+ row_iterator row_end();
+
+ /*! \brief
+ Returns a const row iterator pointing to the first row,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_row_iterator row_begin() const;
+
+ //! Returns the past-the-end const row iterator.
+ const_row_iterator row_end() const;
+
+ /*! \brief
+ Returns an iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ element_iterator element_begin();
+
+ //! Returns the past-the-end const_iterator.
+ element_iterator element_end();
+
+ /*! \brief
+ Returns a const element iterator pointing to the first element,
+ if \p *this is not empty;
+ otherwise, returns the past-the-end const_iterator.
+ */
+ const_element_iterator element_begin() const;
+
+ //! Returns the past-the-end const element iterator.
+ const_element_iterator element_end() const;
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(OR_Matrix<T>& x, OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the Euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into to \p r
+ and returns <CODE>true</CODE>; returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_inlines.hh line 1. */
+/* OR_Matrix class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_inlines.hh line 33. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+ return ((k + 1)*(k + 1))/2;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+ return k + 2 - k % 2;
+}
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+ return size_;
+}
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+ : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(0)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , dimension_type s
+#endif
+ )
+ : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(s)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+ : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , size_(y.size_)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+ first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ size_ = y.size_;
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
+}
+
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ PPL_ASSERT(k < size_);
+#endif
+ return *(first + k);
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+ : value(),
+ e(n_rows)
+ // Field `i' is intentionally not initialized here.
+{
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ // Turn `value' into a valid object.
+ value.size_ = OR_Matrix::row_size(e);
+#endif
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+ : value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , OR_Matrix<T>::row_size(0)
+#endif
+ ),
+ e(0),
+ i(0) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+ : value(y.value),
+ e(y.e),
+ i(y.i) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+ value = y.value;
+ e = y.e;
+ i = y.i;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+ return value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+ return &value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+ ++e;
+ dimension_type increment = e;
+ if (e % 2 != 0)
+ ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ else {
+ value.size_ += 2;
+ }
+#endif
+ i += increment;
+ value.first += increment;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+ any_row_iterator old = *this;
+ ++(*this);
+ return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+ dimension_type decrement = e + 1;
+ --e;
+ if (e % 2 != 0) {
+ ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ value.size_ -= 2;
+#endif
+ }
+ i -= decrement;
+ value.first -= decrement;
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+ any_row_iterator old = *this;
+ --(*this);
+ return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(const difference_type m) {
+ difference_type e_dt = static_cast<difference_type>(e);
+ difference_type i_dt = static_cast<difference_type>(i);
+ difference_type increment = m + (m * m) / 2 + m * e_dt;
+ if (e_dt % 2 == 0 && m % 2 != 0)
+ ++increment;
+ e_dt += m;
+ i_dt += increment;
+ e = static_cast<dimension_type>(e_dt);
+ i = static_cast<dimension_type>(i_dt);
+ value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ difference_type value_size_dt = static_cast<difference_type>(value.size_);
+ value_size_dt += (m - m % 2);
+ value.size_ = static_cast<dimension_type>(value_size_dt);
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+ typename OR_Matrix<T>::template any_row_iterator<U>& >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+=(Unsigned m) {
+ dimension_type n = m;
+ dimension_type increment = n + (n*n)/2 + n*e;
+ if (e % 2 == 0 && n % 2 != 0)
+ ++increment;
+ e += n;
+ i += increment;
+ value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ value.size_ = value.size_ + n - n % 2;
+#endif
+ return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+ return *this += -m;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+ return e - y.e;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+ any_row_iterator r = *this;
+ r += m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+ typename OR_Matrix<T>::template any_row_iterator<U> >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+(Unsigned m) const {
+ any_row_iterator r = *this;
+ r += m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+ any_row_iterator r = *this;
+ r -= m;
+ return r;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+ return e == y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+ return e != y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+ return e < y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+ return e <= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+ return e > y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+ return e >= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+ return OR_Matrix::row_size(e);
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+ return e;
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+ return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+ return row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+ return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+ return const_row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+ return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+ return vec.end();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+ return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+ return vec.end();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::m_swap(OR_Matrix& y) {
+ using std::swap;
+ swap(vec, y.vec);
+ swap(space_dim, y.space_dim);
+ swap(vec_capacity, y.vec_capacity);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the integer square root of \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+isqrt(dimension_type x) {
+ dimension_type r = 0;
+ const dimension_type FIRST_BIT_MASK = 0x40000000U;
+ for (dimension_type t = FIRST_BIT_MASK; t != 0; t >>= 2) {
+ const dimension_type s = r + t;
+ if (s <= x) {
+ x -= s;
+ r = s + t;
+ }
+ r >>= 1;
+ }
+ return r;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+ // Compute the maximum number of rows that are contained in a DB_Row
+ // that allocates a pseudo-triangular matrix.
+ const dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+ return (k - 1) - (k - 1) % 2;
+}
+
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const dimension_type num_dimensions)
+ : vec(2*num_dimensions*(num_dimensions + 1)),
+ space_dim(num_dimensions),
+ vec_capacity(vec.size()) {
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::~OR_Matrix() {
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+ return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , row_size(k)
+#endif
+ );
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+ return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+ , row_size(k)
+#endif
+ );
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::num_rows() const {
+ return 2*space_dimension();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::clear() {
+ OR_Matrix<T>(0).m_swap(*this);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+ return x.space_dim == y.space_dim && x.vec == y.vec;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+ : vec(y.vec),
+ space_dim(y.space_dim),
+ vec_capacity(compute_capacity(y.vec.size(),
+ DB_Row<T>::max_size())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+ : vec(),
+ space_dim(y.space_dim),
+ vec_capacity(compute_capacity(y.vec.size(),
+ DB_Row<T>::max_size())) {
+ vec.construct_upward_approximation(y.vec, vec_capacity);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+ vec = y.vec;
+ space_dim = y.space_dim;
+ vec_capacity = compute_capacity(y.vec.size(), DB_Row<T>::max_size());
+ return *this;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+ PPL_ASSERT(new_dim >= space_dim);
+ if (new_dim > space_dim) {
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ if (new_size <= vec_capacity) {
+ // We can recycle the old vec.
+ vec.expand_within_capacity(new_size);
+ space_dim = new_dim;
+ }
+ else {
+ // We cannot recycle the old vec.
+ OR_Matrix<T> new_matrix(new_dim);
+ element_iterator j = new_matrix.element_begin();
+ for (element_iterator i = element_begin(),
+ mend = element_end(); i != mend; ++i, ++j)
+ assign_or_swap(*j, *i);
+ m_swap(new_matrix);
+ }
+ }
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+ PPL_ASSERT(new_dim <= space_dim);
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ vec.shrink(new_size);
+ space_dim = new_dim;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+ if (new_dim > space_dim) {
+ const dimension_type new_size = 2*new_dim*(new_dim + 1);
+ if (new_size <= vec_capacity) {
+ // We can recycle the old vec.
+ vec.expand_within_capacity(new_size);
+ space_dim = new_dim;
+ }
+ else {
+ // We cannot recycle the old vec.
+ OR_Matrix<T> new_matrix(new_dim);
+ m_swap(new_matrix);
+ }
+ }
+ else if (new_dim < space_dim)
+ shrink(new_dim);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ if (x.num_rows() != y.num_rows())
+ return false;
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (typename OR_Matrix<T>::const_element_iterator
+ i = x.element_begin(), j = y.element_begin(),
+ mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+ const T& x_i = *i;
+ const T& y_i = *j;
+ if (is_plus_infinity(x_i)) {
+ if (is_plus_infinity(y_i))
+ continue;
+ else {
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+ }
+ else if (is_plus_infinity(y_i))
+ goto pinf;
+
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i > y_i) {
+ maybe_assign(tmp1p, tmp1, x_i, dir);
+ maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i, dir);
+ maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const OR_Matrix<T>& x,
+ const OR_Matrix<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ return
+ l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+ dir,
+ tmp0,
+ tmp1,
+ tmp2);
+}
+
+/*! \relates OR_Matrix */
+template <typename T>
+inline void
+swap(OR_Matrix<T>& x, OR_Matrix<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_templates.hh line 1. */
+/* OR_Matrix class implementation: non-inline template functions.
+*/
+
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+ return vec.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+ // The right number of cells should be in use.
+ const dimension_type dim = space_dimension();
+ if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+ cerr << "OR_Matrix has a wrong number of cells:\n"
+ << "vec.size() is " << vec.size()
+ << ", expected size is " << (2*dim*(dim+1)) << "!\n";
+#endif
+ return false;
+ }
+
+ // The underlying DB_Row should be OK.
+ if (!vec.OK(vec.size(), vec_capacity))
+ return false;
+
+ // All checks passed.
+ return true;
+}
+
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+ const OR_Matrix<T>& x = *this;
+ const char separator = ' ';
+ dimension_type space = x.space_dimension();
+ s << space << separator << "\n";
+ for (const_row_iterator i = x.row_begin(),
+ x_row_end = x.row_end(); i != x_row_end; ++i) {
+ const_row_reference_type r = *i;
+ dimension_type rs = i.row_size();
+ for (dimension_type j = 0; j < rs; ++j) {
+ using namespace IO_Operators;
+ s << r[j] << separator;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
+
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+ dimension_type space;
+ if (!(s >> space))
+ return false;
+ resize_no_copy(space);
+ for (row_iterator i = row_begin(),
+ this_row_end = row_end(); i != this_row_end; ++i) {
+ row_reference_type r_i = *i;
+ const dimension_type rs = i.row_size();
+ for (dimension_type j = 0; j < rs; ++j) {
+ Result r = input(r_i[j], s, ROUND_CHECK);
+ if (result_relation(r) != VR_EQ || is_minus_infinity(r_i[j]))
+ return false;
+ }
+ }
+ PPL_ASSERT(OK());
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+ for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+ m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+ const dimension_type mr_size = m_iter.row_size();
+ for (dimension_type j = 0; j < mr_size; ++j)
+ s << r_m[j] << " ";
+ s << "\n";
+ }
+ return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 609. */
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 50. */
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+ Writes a textual representation of \p oct on \p s:
+ <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+ <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+ a system of constraints defining \p oct is written otherwise,
+ all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Octagonal_Shape */
+template <typename T>
+void swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
+
+ \relates Octagonal_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
+
+ \relates Octagonal_Shape
+ Note that \p x and \p y may be dimension-incompatible shapes:
+ in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the rectilinear distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the euclidean distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using variables of type
+ <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+ If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+ stores an approximation of it into \p r and returns <CODE>true</CODE>;
+ returns <CODE>false</CODE> otherwise.
+
+ The direction of the approximation is specified by \p dir.
+
+ All computations are performed using the temporary variables
+ \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class Octagonal_Shape_Helper {
+public:
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Decodes the constraint \p c as an octagonal difference.
+ /*! \relates Octagonal_Shape
+ \return
+ <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+ <CODE>false</CODE> otherwise.
+
+ \param c
+ The constraint to be decoded.
+
+ \param c_space_dim
+ The space dimension of the constraint \p c (it is <EM>assumed</EM>
+ to match the actual space dimension of \p c).
+
+ \param c_num_vars
+ If <CODE>true</CODE> is returned, then it will be set to the number
+ of variables having a non-zero coefficient. The only legal values
+ will therefore be 0, 1 and 2.
+
+ \param c_first_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the index of the first variable having
+ a non-zero coefficient in \p c.
+
+ \param c_second_var
+ If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+ then it will be set to the index of the second variable having
+ a non-zero coefficient in \p c.
+
+ \param c_coeff
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the value of the first non-zero coefficient
+ in \p c.
+
+ \param c_term
+ If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+ then it will be set to the right value of the inhomogeneous term
+ of \p c.
+ */
+ #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ static bool extract_octagonal_difference(const Constraint& c,
+ dimension_type c_space_dim,
+ dimension_type& c_num_vars,
+ dimension_type& c_first_var,
+ dimension_type& c_second_var,
+ Coefficient& c_coeff,
+ Coefficient& c_term);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+//! An octagonal shape.
+/*! \ingroup PPL_CXX_interface
+ The class template Octagonal_Shape<T> allows for the efficient
+ representation of a restricted kind of <EM>topologically closed</EM>
+ convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+ The name comes from the fact that, in a vector space of dimension 2,
+ bounded OSs are polygons with at most eight sides.
+ The closed affine half-spaces that characterize the OS can be expressed
+ by constraints of the form
+ \f[
+ ax_i + bx_j \leq k
+ \f]
+ where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+ which are called <EM>octagonal constraints</EM>.
+
+ Based on the class template type parameter \p T, a family of extended
+ numbers is built and used to approximate the inhomogeneous term of
+ octagonal constraints. These extended numbers provide a representation
+ for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+ implementations for several arithmetic functions.
+ The value of the type parameter \p T may be one of the following:
+ - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+ - a bounded precision floating point type (e.g., \c float or \c double);
+ - an unbounded integer or rational type, as provided by GMP
+ (i.e., \c mpz_class or \c mpq_class).
+
+ The user interface for OSs is meant to be as similar as possible to
+ the one developed for the polyhedron class C_Polyhedron.
+
+ The OS domain <EM>optimally supports</EM>:
+ - tautological and inconsistent constraints and congruences;
+ - octagonal constraints;
+ - non-proper congruences (i.e., equalities) that are expressible
+ as octagonal constraints.
+
+ Depending on the method, using a constraint or congruence that is not
+ optimally supported by the domain will either raise an exception or
+ result in a (possibly non-optimal) upward approximation.
+
+ A constraint is octagonal if it has the form
+ \f[
+ \pm a_i x_i \pm a_j x_j \relsym b
+ \f]
+ where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+ \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+ \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+ The user is warned that the above octagonal Constraint object
+ will be mapped into a \e correct and \e optimal approximation that,
+ depending on the expressive power of the chosen template argument \p T,
+ may loose some precision.
+ Also note that strict constraints are not octagonal.
+
+ For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+ approximated by:
+ - \f$x + y \leq 1\f$,
+ if \p T is a (bounded or unbounded) integer type;
+ - \f$x + y \leq \frac{1}{3}\f$,
+ if \p T is the unbounded rational type \c mpq_class;
+ - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+ if \p T is a floating point type (having no exact representation
+ for \f$\frac{1}{3}\f$).
+
+ On the other hand, depending from the context, a Constraint object
+ encoding \f$3x - y \leq 1\f$ will be either upward approximated
+ (e.g., by safely ignoring it) or it will cause an exception.
+
+ In the following examples it is assumed that the type argument \p T
+ is one of the possible instances listed above and that variables
+ \c x, \c y and \c z are defined (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ \endcode
+
+ \par Example 1
+ The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+ given as a system of constraints:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ cs.insert(z >= 0);
+ cs.insert(z <= 3);
+ Octagonal_Shape<T> oct(cs);
+ \endcode
+ In contrast, the following code will raise an exception,
+ since constraints 7, 8, and 9 are not octagonal:
+ \code
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ cs.insert(y >= 0);
+ cs.insert(y <= 3);
+ cs.insert(z >= 0);
+ cs.insert(z <= 3);
+ cs.insert(x - 3*y <= 5); // (7)
+ cs.insert(x - y + z <= 5); // (8)
+ cs.insert(x + y + z <= 5); // (9)
+ Octagonal_Shape<T> oct(cs);
+ \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of
+ the inequalities defining an OS.
+ */
+#ifndef NDEBUG
+ typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+ typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+
+ //! The numeric base type upon which OSs are built.
+ typedef T coefficient_type_base;
+
+ /*! \brief
+ The (extended) numeric type of the inhomogeneous term of the
+ inequalities defining an OS.
+ */
+ typedef N coefficient_type;
+
+ //! Returns the maximum space dimension that an OS can handle.
+ static dimension_type max_space_dimension();
+
+ /*! \brief
+ Returns false indicating that this domain cannot recycle constraints
+ */
+ static bool can_recycle_constraint_systems();
+
+ /*! \brief
+ Returns false indicating that this domain cannot recycle congruences
+ */
+ static bool can_recycle_congruence_systems();
+
+ //! \name Constructors, Assignment, Swap and Destructor
+ //@{
+
+ //! Builds an universe or empty OS of the specified space dimension.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the OS;
+
+ \param kind
+ Specifies whether the universe or the empty OS has to be built.
+ */
+ explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Octagonal_Shape(const Octagonal_Shape& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename U>
+ explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS from the system of constraints \p cs.
+ /*!
+ The OS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of octagonal constraints.
+
+ \exception std::invalid_argument
+ Thrown if \p cs contains a constraint which is not optimally supported
+ by the Octagonal shape domain.
+ */
+ explicit Octagonal_Shape(const Constraint_System& cs);
+
+ //! Builds an OS from a system of congruences.
+ /*!
+ The OS inherits the space dimension of \p cgs
+
+ \param cgs
+ A system of congruences.
+
+ \exception std::invalid_argument
+ Thrown if \p cgs contains a congruence which is not optimally supported
+ by the Octagonal shape domain.
+ */
+ explicit Octagonal_Shape(const Congruence_System& cgs);
+
+ //! Builds an OS from the system of generators \p gs.
+ /*!
+ Builds the smallest OS containing the polyhedron defined by \p gs.
+ The OS inherits the space dimension of \p gs.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit Octagonal_Shape(const Generator_System& gs);
+
+ //! Builds an OS from the polyhedron \p ph.
+ /*!
+ Builds an OS containing \p ph using algorithms whose complexity
+ does not exceed the one specified by \p complexity. If
+ \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+ smallest one containing \p ph.
+ */
+ explicit Octagonal_Shape(const Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS out of a box.
+ /*!
+ The OS inherits the space dimension of the box.
+ The built OS is the most precise OS that includes the box.
+
+ \param box
+ The box representing the OS to be built.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Octagonal_Shape(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS that approximates a grid.
+ /*!
+ The OS inherits the space dimension of the grid.
+ The built OS is the most precise OS that includes the grid.
+
+ \param grid
+ The grid used to build the OS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p grid exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Octagonal_Shape(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an OS from a BD shape.
+ /*!
+ The OS inherits the space dimension of the BD shape.
+ The built OS is the most precise OS that includes the BD shape.
+
+ \param bd
+ The BD shape used to build the OS.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ explicit Octagonal_Shape(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ Octagonal_Shape& operator=(const Octagonal_Shape& y);
+
+ /*! \brief
+ Swaps \p *this with octagon \p y.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ void m_swap(Octagonal_Shape& y);
+
+ //! Destructor.
+ ~Octagonal_Shape();
+
+ //@} Constructors, Assignment, Swap and Destructor
+
+ //! \name Member Functions that Do Not Modify the Octagonal_Shape
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+ \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+ of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns the system of constraints defining \p *this.
+ Constraint_System constraints() const;
+
+ //! Returns a minimized system of constraints defining \p *this.
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of (equality) congruences satisfied by \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a minimal system of (equality) congruences
+ satisfied by \p *this with the same affine dimension as \p *this.
+ */
+ Congruence_System minimized_congruences() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Octagonal_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Octagonal_Shape& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Octagonal_Shape& y) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the congruence \p cg.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns the relations holding between \p *this and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+ bool is_empty() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+ bool is_universe() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a bounded OS.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is a topologically closed subset of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains (at least) an integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there exist a
+ unique value \p val such that \p *this
+ saturates the equality <CODE>expr = val</CODE>.
+
+ \param expr
+ The linear expression for which the frequency is needed;
+
+ \param freq_n
+ If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+ Present for interface compatibility with class Grid, where
+ the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+ \param freq_d
+ If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+ \param val_n
+ The numerator of \p val;
+
+ \param val_d
+ The denominator of \p val;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+ \p val_n and \p val_d are left untouched.
+ */
+ bool frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+ //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+ //@{
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of constraints
+ defining \p *this.
+
+ \param c
+ The constraint to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or \p c is not optimally supported by the OS domain.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the OS domain.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this.
+
+ \param cs
+ The constraint system to be added to \p *this. The constraints in
+ \p cs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or \p cs contains a constraint which is not optimally supported
+ by the OS domain.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+ \param cg
+ The congruence to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible,
+ or \p cg is not optimally supported by the OS domain.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruences to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the OS domain.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+ \param cgs
+ The congruence system to be added to \p *this. The congruences in
+ \p cgs may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible,
+ or \p cgs contains a congruence which is not optimally supported
+ by the OS domain.
+
+ \warning
+ The only assumption that can be made on \p cgs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ /*! \brief
+ Uses a copy of constraint \p c to refine the system of octagonal
+ constraints defining \p *this.
+
+ \param c
+ The constraint. If it is not a octagonal constraint, it will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ /*! \brief
+ Uses a copy of congruence \p cg to refine the system of
+ octagonal constraints of \p *this.
+
+ \param cg
+ The congruence. If it is not a octagonal equality, it
+ will be ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ /*! \brief
+ Uses a copy of the constraints in \p cs to refine the system of
+ octagonal constraints defining \p *this.
+
+ \param cs
+ The constraint system to be used. Constraints that are not octagonal
+ are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Uses a copy of the congruences in \p cgs to refine the system of
+ octagonal constraints defining \p *this.
+
+ \param cgs
+ The congruence system to be used. Congruences that are not octagonal
+ equalities are ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Refines the system of octagonal constraints defining \p *this using
+ the constraint expressed by \p left \f$\leq\f$ \p right.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right);
+
+ /*! \brief
+ Refines the system of octagonal constraints defining \p *this using
+ the constraint expressed by \p left \f$\relsym\f$ \p right, where
+ \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+ \param left
+ The linear form on intervals with floating point boundaries that
+ is at the left of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param right
+ The linear form on intervals with floating point boundaries that
+ is at the right of the comparison operator. All of its coefficients
+ MUST be bounded.
+
+ \param relsym
+ The relation symbol.
+
+ \exception std::invalid_argument
+ Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+ \exception std::runtime_error
+ Thrown if \p relsym is not a valid relation symbol.
+
+ This function is used in abstract interpretation to model a filter
+ that is generated by a comparison of two expressions that are correctly
+ approximated by \p left and \p right respectively.
+ */
+ template <typename Interval_Info>
+ void generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right,
+ Relation_Symbol relsym);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest OS that contains
+ the convex union of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ If the upper bound of \p *this and \p y is exact, it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ Implementation is based on Theorem 6.3 of \ref BHZ09b "[BHZ09b]".
+ */
+ bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+ /*! \brief
+ If the \e integer upper bound of \p *this and \p y is exact,
+ it is assigned to \p *this and <CODE>true</CODE> is returned;
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \note
+ This operator is only available when the class template parameter
+ \c T is bound to an integer data type.
+
+ \note
+ The integer upper bound of two rational OS is the smallest
+ rational OS containing all the integral points in the two arguments.
+ In general, the result is \e not an upper bound for the two input
+ arguments, as it may cut away non-integral portions of the two
+ rational shapes.
+
+ Implementation is based on Theorem 6.8 of \ref BHZ09b "[BHZ09b]".
+ */
+ bool integer_upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest octagon containing
+ the set difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref affine_relation "affine image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ // FIXME: To be completed.
+ /*! \brief
+ Assigns to \p *this the \ref affine_form_relation "affine form image"
+ of \p *this under the function mapping variable \p var into the
+ affine expression(s) specified by \p lf.
+
+ \param var
+ The variable to which the affine expression is assigned.
+
+ \param lf
+ The linear form on intervals with floating point boundaries that
+ defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+ \exception std::invalid_argument
+ Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+ is not a dimension of \p *this.
+
+ This function is used in abstract interpretation to model an assignment
+ of a value that is correctly overapproximated by \p lf to the
+ floating point variable represented by \p var.
+ */
+ template <typename Interval_Info>
+ void affine_form_image(Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf);
+
+ /*! \brief
+ Assigns to \p *this the \ref affine_relation "affine preimage"
+ of \p *this under the function mapping variable \p var into the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted.
+
+ \param expr
+ The numerator of the affine expression.
+
+ \param denominator
+ The denominator of the affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine transfer function"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension of \p *this
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine transfer function"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \param relsym
+ The relation symbol.
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+/*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine transfer function.
+
+ \param relsym
+ The relation symbol.
+
+ \param expr
+ The numerator of the right hand side affine expression.
+
+ \param denominator
+ The denominator of the right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this
+ are dimension-incompatible or if \p var is not a dimension
+ of \p *this or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p relsym is a strict relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param first
+ An iterator that points to the first stop_point.
+
+ \param last
+ An iterator that points to the last stop_point.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ template <typename Iterator>
+ void CC76_extrapolation_assign(const Octagonal_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ //! Same as BHMZ05_widening_assign(y, tp).
+ void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+ /*! \brief
+ Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened OS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if there is in \p cs a strict inequality.
+ */
+ void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ /*! \brief
+ Restores from \p y the constraints of \p *this, lost by
+ \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+ \param y
+ An OS that <EM>must</EM> contain \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_narrowing_assign(const Octagonal_Shape& y);
+
+ /*! \brief
+ Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+ computation by also enforcing those constraints in \p cs that are
+ satisfied by all the points of \p *this.
+
+ \param y
+ An OS that <EM>must</EM> be contained in \p *this.
+
+ \param cs
+ The system of constraints used to improve the widened OS.
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+ if \p cs contains a strict inequality.
+ */
+ void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp = 0);
+
+ //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ //! Adds \p m new dimensions and embeds the old OS into the new space.
+ /*!
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes in the new OS,
+ which is characterized by a system of constraints in which the variables
+ running through the new dimensions are not constrained.
+ For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the OS
+ \f[
+ \bigl\{\,
+ (x, y, z)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cO
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the OS
+ and does not embed it in the new space.
+
+ \param m
+ The number of dimensions to add.
+
+ The new dimensions will be those having the highest indexes
+ in the new OS, which is characterized by a system
+ of constraints in which the variables running through
+ the new dimensions are all constrained to be equal to 0.
+ For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+ and adding a third dimension, the result will be the OS
+ \f[
+ \bigl\{\,
+ (x, y, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x, y)^\transpose \in \cO
+ \,\bigr\}.
+ \f]
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Octagonal_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the dimensions to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the Variable
+ objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimension is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ \param pfunc
+ The partial function specifying the destiny of each dimension.
+
+ The template type parameter Partial_Function must provide
+ the following methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain
+ of the partial function.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned.
+ If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+ returned.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in the
+ \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref expand_space_dimension "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars.
+ Also thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //! Applies to \p dest the interval constraints embedded in \p *this.
+ /*!
+ \param dest
+ The object to which the constraints will be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest.
+
+ The template type parameter U must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the space dimension of the object.
+ \code
+ void set_empty()
+ \endcode
+ sets the object to an empty object.
+ \code
+ bool restrict_lower(dimension_type dim, const T& lb)
+ \endcode
+ restricts the object by applying the lower bound \p lb to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ \code
+ bool restrict_upper(dimension_type dim, const T& ub)
+ \endcode
+ restricts the object by applying the upper bound \p ub to the space
+ dimension \p dim and returns <CODE>false</CODE> if and only if the
+ object becomes empty.
+ */
+ template <typename U>
+ void export_interval_constraints(U& dest) const;
+
+ //! Refines \p store with the constraints defining \p *this.
+ /*!
+ \param store
+ The interval floating point abstract store to refine.
+ */
+ template <typename Interval_Info>
+ void refine_fp_interval_abstract_store(
+ Box< Interval<T, Interval_Info> >& store) const;
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ friend bool
+ operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+ template <typename Temp, typename To, typename U>
+ friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+ (Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+ const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+ template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+ template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+ //! The matrix that represents the octagonal shape.
+ OR_Matrix<N> matrix;
+
+ //! Dimension of the space of the octagonal shape.
+ dimension_type space_dim;
+
+ // Please, do not move the following include directive:
+ // `Og_Status_idefs.hh' must be included exactly at this point.
+ // And please do not remove the space separating `#' from `include':
+ // this ensures that the directive will not be moved during the
+ // procedure that automatically creates the library's include file
+ // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+/* Automatically generated from PPL source file ../src/Og_Status_idefs.hh line 1. */
+/* Octagonal_Shape<T>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status_idefs.hh directly; use Octagonal_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+ The assertions supported are:
+ - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+ vector space \f$\Rset^0 = \{\cdot\}\f$;
+ - <EM>empty</EM>: the polyhedron is the empty set;
+ - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+ closed, so that all the constraints are as tight as possible.
+
+ Not all the conjunctions of these elementary assertions constitute
+ a legal Status. In fact:
+ - <EM>zero-dim universe</EM> excludes any other assertion;
+ - <EM>empty</EM>: excludes any other assertion.
+*/
+class Status {
+public:
+ //! By default Status is the <EM>zero-dim universe</EM> assertion.
+ Status();
+
+ //! \name Test, remove or add an individual assertion from the conjunction.
+ //@{
+ bool test_zero_dim_univ() const;
+ void reset_zero_dim_univ();
+ void set_zero_dim_univ();
+
+ bool test_empty() const;
+ void reset_empty();
+ void set_empty();
+
+ bool test_strongly_closed() const;
+ void reset_strongly_closed();
+ void set_strongly_closed();
+ //@}
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ /*! \brief
+ Writes to \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ //! Status is implemented by means of a finite bitset.
+ typedef unsigned int flags_t;
+
+ //! \name Bitmasks for the individual assertions.
+ //@{
+ static const flags_t ZERO_DIM_UNIV = 0U;
+ static const flags_t EMPTY = 1U << 0;
+ static const flags_t STRONGLY_CLOSED = 1U << 1;
+ //@}
+
+ //! This holds the current bitset.
+ flags_t flags;
+
+ //! Construct from a bitmask.
+ Status(flags_t mask);
+
+ //! Check whether <EM>all</EM> bits in \p mask are set.
+ bool test_all(flags_t mask) const;
+
+ //! Check whether <EM>at least one</EM> bit in \p mask is set.
+ bool test_any(flags_t mask) const;
+
+ //! Set the bits in \p mask.
+ void set(flags_t mask);
+
+ //! Reset the bits in \p mask.
+ void reset(flags_t mask);
+
+};
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 1923. */
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+ bool marked_zero_dim_univ() const;
+
+ //! Returns <CODE>true</CODE> if the OS is known to be empty.
+ /*!
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \p *this is non-empty.
+ */
+ bool marked_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \c this->matrix is known to be
+ strongly closed.
+
+ The return value <CODE>false</CODE> does not necessarily
+ implies that \c this->matrix is not strongly closed.
+ */
+ bool marked_strongly_closed() const;
+
+ //! Turns \p *this into a zero-dimensional universe OS.
+ void set_zero_dim_univ();
+
+ //! Turns \p *this into an empty OS.
+ void set_empty();
+
+ //! Marks \p *this as strongly closed.
+ void set_strongly_closed();
+
+ //! Marks \p *this as possibly not strongly closed.
+ void reset_strongly_closed();
+
+ N& matrix_at(dimension_type i, dimension_type j);
+ const N& matrix_at(dimension_type i, dimension_type j) const;
+
+ /*! \brief
+ Returns an upper bound for \p lf according to the constraints
+ embedded in \p *this.
+
+ \p lf must be a linear form on intervals with floating point coefficients.
+ If all coefficients in \p lf are bounded, then \p result will become a
+ correct overapproximation of the value of \p lf when variables in
+ \p lf satisfy the constraints expressed by \p *this. Otherwise the
+ behavior of the method is undefined.
+ */
+ template <typename Interval_Info>
+ void linear_form_upper_bound(
+ const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const;
+
+ // FIXME: this function is currently not used. Consider removing it.
+ static void interval_coefficient_upper_bound(const N& var_ub,
+ const N& minus_var_ub,
+ const N& int_ub, const N& int_lb,
+ N& result);
+
+ /*! \brief
+ Uses the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be added. Non-octagonal constraints are ignored.
+
+ \warning
+ If \p c and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Constraint& c);
+
+ /*! \brief
+ Uses the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be added.
+ Nontrivial proper congruences are ignored.
+ Non-octagonal equalities are ignored.
+
+ \warning
+ If \p cg and \p *this are dimension-incompatible,
+ the behavior is undefined.
+ */
+ void refine_no_check(const Congruence& cg);
+
+ //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+ void add_octagonal_constraint(dimension_type i,
+ dimension_type j,
+ const N& k);
+
+ //! Adds the constraint <CODE>matrix[i][j] <= numer/denom</CODE>.
+ void add_octagonal_constraint(dimension_type i,
+ dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom);
+
+ /*! \brief
+ Adds to the Octagonal_Shape the constraint
+ \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+ Note that the coefficient of \p var in \p expr is null.
+ */
+ void refine(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ //! Removes all the constraints on variable \p v_id.
+ void forget_all_octagonal_constraints(dimension_type v_id);
+
+ //! Removes all binary constraints on variable \p v_id.
+ void forget_binary_octagonal_constraints(dimension_type v_id);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each variable index \c u_id (less than or equal to \p last_id
+ and different from \p v_id), deduce constraints of the form
+ <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+ starting from \p ub_v, which is an upper bound for \c v
+ computed according to \p sc_expr and \p sc_denom.
+
+ Strong-closure will be able to deduce the constraints
+ <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+ We can be more precise if variable \c u played an active role in the
+ computation of the upper bound for \c v.
+
+ Namely, if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+ is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+
+ Conversely, if \c q is less than zero, we can improve the bound for
+ <CODE>v + u</CODE>. In particular:
+ - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+ - if <CODE>-1 \< q \< 0</CODE>, then
+ <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+ */
+ void deduce_v_pm_u_bounds(dimension_type v_id,
+ dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v);
+
+ //! An helper function for the computation of affine relations.
+ /*!
+ For each variable index \c u_id (less than or equal to \p last_id
+ and different from \p v_id), deduce constraints of the form
+ <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+ starting from \p minus_lb_v, which is the negation of a lower bound
+ for \c v computed according to \p sc_expr and \p sc_denom.
+
+ Strong-closure will be able to deduce the constraints
+ <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+ <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+ We can be more precise if variable \c u played an active role in the
+ computation of (the negation of) the lower bound for \c v.
+
+ Namely, if the corresponding coefficient
+ <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+ is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+ In particular:
+ - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+ - if <CODE>0 \< q \< 1</CODE>, then
+ <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+ Conversely, if \c q is less than zero, we can improve the bound for
+ <CODE>-v - u</CODE>. In particular:
+ - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+ - if <CODE>-1 \< q \< 0</CODE>, then
+ <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
+ */
+ void deduce_minus_v_pm_u_bounds(dimension_type v_id,
+ dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v);
+
+ /*! \brief
+ Adds to \p limiting_octagon the octagonal differences in \p cs
+ that are satisfied by \p *this.
+ */
+ void get_limiting_octagon(const Constraint_System& cs,
+ Octagonal_Shape& limiting_octagon) const;
+ //! Compute the (zero-equivalence classes) successor relation.
+ /*!
+ It is assumed that the octagon is not empty and strongly closed.
+ */
+ void compute_successors(std::vector<dimension_type>& successor) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the OS is not empty and strongly closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& successor,
+ std::vector<dimension_type>& no_sing_leaders,
+ bool& exist_sing_class,
+ dimension_type& sing_leader) const;
+
+ //! Compute the leaders of zero-equivalence classes.
+ /*!
+ It is assumed that the OS is not empty and strongly closed.
+ */
+ void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+ /*! \brief
+ Stores into \p non_redundant information about the matrix entries
+ that are non-redundant (i.e., they will occur in the strongly
+ reduced matrix).
+
+ It is assumed that the OS is not empty and strongly closed;
+ moreover, argument \p non_redundant is assumed to be empty.
+ */
+ void non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const;
+
+ //! Removes the redundant constraints from \c this->matrix.
+ void strong_reduction_assign() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \c this->matrix
+ is strongly reduced.
+ */
+ bool is_strongly_reduced() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if in the octagon taken two at a time
+ unary constraints, there is also the constraint that represent their sum.
+ */
+ bool is_strong_coherent() const;
+
+ bool tight_coherence_would_make_empty() const;
+
+ //! Assigns to \c this->matrix its strong closure.
+ /*!
+ Strong closure is a necessary condition for the precision and/or
+ the correctness of many methods. It explicitly records into \c matrix
+ those constraints that are implicitly obtainable by the other ones,
+ therefore obtaining a canonical representation for the OS.
+ */
+ void strong_closure_assign() const;
+
+ //! Applies the strong-coherence step to \c this->matrix.
+ void strong_coherence_assign();
+
+ //! Assigns to \c this->matrix its tight closure.
+ /*!
+ \note
+ This is \e not marked as a <code>const</code> method,
+ as it may modify the rational-valued geometric shape by cutting away
+ non-integral points. The method is only available if the template
+ parameter \c T is bound to an integer data type.
+ */
+ void tight_closure_assign();
+
+ /*! \brief
+ Incrementally computes strong closure, assuming that only
+ constraints affecting variable \p var need to be considered.
+
+ \note
+ It is assumed that \c *this, which was strongly closed, has only been
+ modified by adding constraints affecting variable \p var. If this
+ assumption is not satisfied, i.e., if a non-redundant constraint not
+ affecting variable \p var has been added, the behavior is undefined.
+ Worst-case complexity is \f$O(n^2)\f$.
+ */
+ void incremental_strong_closure_assign(Variable var) const;
+
+ //! Checks if and how \p expr is bounded in \p *this.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p from_above is
+ <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+ or \p from_above is <CODE>false</CODE> and \p expr is bounded
+ from below in \p *this.
+
+ \param expr
+ The linear expression to test;
+
+ \param from_above
+ <CODE>true</CODE> if and only if the boundedness of interest is
+ "from above".
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+ \p included are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+ //! Maximizes or minimizes \p expr subject to \p *this.
+ /*!
+ \param expr
+ The linear expression to be maximized or minimized subject to \p
+ *this;
+
+ \param maximize
+ <CODE>true</CODE> if maximization is what is wanted;
+
+ \param ext_n
+ The numerator of the extremum value;
+
+ \param ext_d
+ The denominator of the extremum value;
+
+ \param included
+ <CODE>true</CODE> if and only if the extremum of \p expr can
+ actually be reached in \p * this;
+
+ \param g
+ When maximization or minimization succeeds, will be assigned
+ a point or closure point where \p expr reaches the
+ corresponding extremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded in the appropriate
+ direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+ \p included and \p g are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& g) const;
+
+ void drop_some_non_integer_points_helper(N& elem);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators
+ ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const Octagonal_Shape& y) const;
+
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Constraint& c) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const;
+
+ template <typename C>
+ void throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& le);
+
+ static void throw_invalid_argument(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+/* Automatically generated from PPL source file ../src/Og_Status_inlines.hh line 1. */
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+ : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+ : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+ return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+ return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+ flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+ flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+ return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+ // This is a no-op if the current status is not zero-dim.
+ if (flags == ZERO_DIM_UNIV)
+ // In the zero-dim space, if it is not the universe it is empty.
+ flags = EMPTY;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+ // Zero-dim universe is incompatible with anything else.
+ flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+ return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+ reset(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+ flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+ return test_any(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+ reset(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+ set(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+ if (test_zero_dim_univ())
+ // Zero-dim universe is OK.
+ return true;
+
+ if (test_empty()) {
+ Status copy = *this;
+ copy.reset_empty();
+ if (copy.test_zero_dim_univ())
+ return true;
+ else {
+#ifndef NDEBUG
+ std::cerr << "The empty flag is incompatible with any other one."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Any other case is OK.
+ return true;
+}
+
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status
+ Reads a keyword and its associated on/off flag from \p s.
+ Returns <CODE>true</CODE> if the operation is successful,
+ returns <CODE>false</CODE> otherwise.
+ When successful, \p positive is set to <CODE>true</CODE> if the flag
+ is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+ std::string str;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != keyword)
+ return false;
+ positive = (str[0] == yes);
+ return true;
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+ using namespace Implementation::Octagonal_Shapes;
+ s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+ << separator
+ << (test_empty() ? yes : no) << empty
+ << separator
+ << separator
+ << (test_strongly_closed() ? yes : no) << strong_closed
+ << separator;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+ using namespace Implementation::Octagonal_Shapes;
+ PPL_UNINITIALIZED(bool, positive);
+
+ if (!get_field(s, zero_dim_univ, positive))
+ return false;
+ if (positive)
+ set_zero_dim_univ();
+
+ if (!get_field(s, empty, positive))
+ return false;
+ if (positive)
+ set_empty();
+
+ if (!get_field(s, strong_closed, positive))
+ return false;
+ if (positive)
+ set_strongly_closed();
+ else
+ reset_strongly_closed();
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_inlines.hh line 1. */
+/* Octagonal_Shape class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_assign.hh line 1. */
+/* Generic implementation of the wrap_assign() function.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_assign.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+struct Wrap_Dim_Translations {
+ Variable var;
+ Coefficient first_quadrant;
+ Coefficient last_quadrant;
+ Wrap_Dim_Translations(Variable v,
+ Coefficient_traits::const_reference f,
+ Coefficient_traits::const_reference l)
+ : var(v), first_quadrant(f), last_quadrant(l) {
+ }
+};
+
+typedef std::vector<Wrap_Dim_Translations> Wrap_Translations;
+
+template <typename PSET>
+void
+wrap_assign_ind(PSET& pointset,
+ Variables_Set& vars,
+ Wrap_Translations::const_iterator first,
+ Wrap_Translations::const_iterator end,
+ Bounded_Integer_Type_Width w,
+ Coefficient_traits::const_reference min_value,
+ Coefficient_traits::const_reference max_value,
+ const Constraint_System& cs,
+ Coefficient& tmp1,
+ Coefficient& tmp2) {
+ const dimension_type space_dim = pointset.space_dimension();
+ for (Wrap_Translations::const_iterator i = first; i != end; ++i) {
+ const Wrap_Dim_Translations& wrap_dim_translations = *i;
+ const Variable x(wrap_dim_translations.var);
+ const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+ const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+ Coefficient& quadrant = tmp1;
+ Coefficient& shift = tmp2;
+ PSET hull(space_dim, EMPTY);
+ for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+ PSET p(pointset);
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ p.affine_image(x, x - shift, 1);
+ }
+ // `x' has just been wrapped.
+ vars.erase(x.id());
+
+ // Refine `p' with all the constraints in `cs' not depending
+ // on variables in `vars'.
+ if (vars.empty())
+ p.refine_with_constraints(cs);
+ else {
+ for (Constraint_System::const_iterator j = cs.begin(),
+ cs_end = cs.end(); j != cs_end; ++j)
+ if (j->expression().all_zeroes(vars))
+ // `*j' does not depend on variables in `vars'.
+ p.refine_with_constraint(*j);
+ }
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ hull.upper_bound_assign(p);
+ }
+ pointset.m_swap(hull);
+ }
+}
+
+template <typename PSET>
+void
+wrap_assign_col(PSET& dest,
+ const PSET& src,
+ const Variables_Set& vars,
+ Wrap_Translations::const_iterator first,
+ Wrap_Translations::const_iterator end,
+ Bounded_Integer_Type_Width w,
+ Coefficient_traits::const_reference min_value,
+ Coefficient_traits::const_reference max_value,
+ const Constraint_System* cs_p,
+ Coefficient& tmp) {
+ if (first == end) {
+ PSET p(src);
+ if (cs_p != 0)
+ p.refine_with_constraints(*cs_p);
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+ const Variable x(*i);
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ }
+ dest.upper_bound_assign(p);
+ }
+ else {
+ const Wrap_Dim_Translations& wrap_dim_translations = *first;
+ const Variable x(wrap_dim_translations.var);
+ const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+ const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+ Coefficient& shift = tmp;
+ PPL_DIRTY_TEMP_COEFFICIENT(quadrant);
+ for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ PSET p(src);
+ p.affine_image(x, x - shift, 1);
+ wrap_assign_col(dest, p, vars, first+1, end, w, min_value, max_value,
+ cs_p, tmp);
+ }
+ else
+ wrap_assign_col(dest, src, vars, first+1, end, w, min_value, max_value,
+ cs_p, tmp);
+ }
+ }
+}
+
+template <typename PSET>
+void
+wrap_assign(PSET& pointset,
+ const Variables_Set& vars,
+ const Bounded_Integer_Type_Width w,
+ const Bounded_Integer_Type_Representation r,
+ const Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ const unsigned complexity_threshold,
+ const bool wrap_individually,
+ const char* class_name) {
+ // We must have cs_p->space_dimension() <= vars.space_dimension()
+ // and vars.space_dimension() <= pointset.space_dimension().
+
+ // Dimension-compatibility check of `*cs_p', if any.
+ if (cs_p != 0) {
+ const dimension_type vars_space_dim = vars.space_dimension();
+ if (cs_p->space_dimension() > vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::" << class_name << "::wrap_assign(..., cs_p, ...):"
+ << std::endl
+ << "vars.space_dimension() == " << vars_space_dim
+ << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+#ifndef NDEBUG
+ // Check that all variables upon which `*cs_p' depends are in `vars'.
+ // An assertion is violated otherwise.
+ const Constraint_System cs = *cs_p;
+ const dimension_type cs_space_dim = cs.space_dimension();
+ Variables_Set::const_iterator vars_end = vars.end();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ for (dimension_type d = cs_space_dim; d-- > 0; ) {
+ PPL_ASSERT(c.coefficient(Variable(d)) == 0
+ || vars.find(d) != vars_end);
+ }
+ }
+#endif
+ }
+
+ // Wrapping no variable only requires refining with *cs_p, if any.
+ if (vars.empty()) {
+ if (cs_p != 0)
+ pointset.refine_with_constraints(*cs_p);
+ return;
+ }
+
+ // Dimension-compatibility check of `vars'.
+ const dimension_type space_dim = pointset.space_dimension();
+ if (vars.space_dimension() > space_dim) {
+ std::ostringstream s;
+ s << "PPL::" << class_name << "::wrap_assign(vs, ...):" << std::endl
+ << "this->space_dimension() == " << space_dim
+ << ", required space dimension == " << vars.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping an empty polyhedron is a no-op.
+ if (pointset.is_empty())
+ return;
+
+ // Set `min_value' and `max_value' to the minimum and maximum values
+ // a variable of width `w' and signedness `s' can take.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ if (r == UNSIGNED) {
+ min_value = 0;
+ mul_2exp_assign(max_value, Coefficient_one(), w);
+ --max_value;
+ }
+ else {
+ PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+ mul_2exp_assign(max_value, Coefficient_one(), w-1);
+ neg_assign(min_value, max_value);
+ --max_value;
+ }
+
+ // If we are wrapping variables collectively, the ranges for the
+ // required translations are saved in `translations' instead of being
+ // immediately applied.
+ Wrap_Translations translations;
+
+ // Dimensions subject to translation are added to this set if we are
+ // wrapping collectively or if `cs_p' is non null.
+ Variables_Set dimensions_to_be_translated;
+
+ // This will contain a lower bound to the number of abstractions
+ // to be joined in order to obtain the collective wrapping result.
+ // As soon as this exceeds `complexity_threshold', counting will be
+ // interrupted and the full range will be the result of wrapping
+ // any dimension that is not fully contained in quadrant 0.
+ unsigned collective_wrap_complexity = 1;
+
+ // This flag signals that the maximum complexity for collective
+ // wrapping as been exceeded.
+ bool collective_wrap_too_complex = false;
+
+ if (!wrap_individually) {
+ translations.reserve(space_dim);
+ }
+
+ // We use `full_range_bounds' to delay conversions whenever
+ // this delay does not negatively affect precision.
+ Constraint_System full_range_bounds;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+
+ const Variable x(*i);
+
+ bool extremum;
+
+ if (!pointset.minimize(x, l_n, l_d, extremum)) {
+ set_full_range:
+ pointset.unconstrain(x);
+ full_range_bounds.insert(min_value <= x);
+ full_range_bounds.insert(x <= max_value);
+ continue;
+ }
+
+ if (!pointset.maximize(x, u_n, u_d, extremum))
+ goto set_full_range;
+
+ div_assign_r(l_n, l_n, l_d, ROUND_DOWN);
+ div_assign_r(u_n, u_n, u_d, ROUND_DOWN);
+ l_n -= min_value;
+ u_n -= min_value;
+ div_2exp_assign_r(l_n, l_n, w, ROUND_DOWN);
+ div_2exp_assign_r(u_n, u_n, w, ROUND_DOWN);
+ Coefficient& first_quadrant = l_n;
+ const Coefficient& last_quadrant = u_n;
+
+ // Special case: this variable does not need wrapping.
+ if (first_quadrant == 0 && last_quadrant == 0)
+ continue;
+
+ // If overflow is impossible, try not to add useless constraints.
+ if (o == OVERFLOW_IMPOSSIBLE) {
+ if (first_quadrant < 0)
+ full_range_bounds.insert(min_value <= x);
+ if (last_quadrant > 0)
+ full_range_bounds.insert(x <= max_value);
+ continue;
+ }
+
+ if (o == OVERFLOW_UNDEFINED || collective_wrap_too_complex)
+ goto set_full_range;
+
+ Coefficient& quadrants = u_d;
+ quadrants = last_quadrant - first_quadrant + 1;
+
+ PPL_UNINITIALIZED(unsigned, extension);
+ Result res = assign_r(extension, quadrants, ROUND_IGNORE);
+ if (result_overflow(res) != 0 || extension > complexity_threshold)
+ goto set_full_range;
+
+ if (!wrap_individually && !collective_wrap_too_complex) {
+ res = mul_assign_r(collective_wrap_complexity,
+ collective_wrap_complexity, extension, ROUND_IGNORE);
+ if (result_overflow(res) != 0
+ || collective_wrap_complexity > complexity_threshold)
+ collective_wrap_too_complex = true;
+ if (collective_wrap_too_complex) {
+ // Set all the dimensions in `translations' to full range.
+ for (Wrap_Translations::const_iterator j = translations.begin(),
+ translations_end = translations.end();
+ j != translations_end;
+ ++j) {
+ const Variable y(j->var);
+ pointset.unconstrain(y);
+ full_range_bounds.insert(min_value <= y);
+ full_range_bounds.insert(y <= max_value);
+ }
+ }
+ }
+
+ if (wrap_individually && cs_p == 0) {
+ Coefficient& quadrant = first_quadrant;
+ // Temporary variable holding the shifts to be applied in order
+ // to implement the translations.
+ Coefficient& shift = l_d;
+ PSET hull(space_dim, EMPTY);
+ for ( ; quadrant <= last_quadrant; ++quadrant) {
+ PSET p(pointset);
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ p.affine_image(x, x - shift, 1);
+ }
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ hull.upper_bound_assign(p);
+ }
+ pointset.m_swap(hull);
+ }
+ else if (wrap_individually || !collective_wrap_too_complex) {
+ PPL_ASSERT(!wrap_individually || cs_p != 0);
+ dimensions_to_be_translated.insert(x);
+ translations
+ .push_back(Wrap_Dim_Translations(x, first_quadrant, last_quadrant));
+ }
+ }
+
+ if (!translations.empty()) {
+ if (wrap_individually) {
+ PPL_ASSERT(cs_p != 0);
+ wrap_assign_ind(pointset, dimensions_to_be_translated,
+ translations.begin(), translations.end(),
+ w, min_value, max_value, *cs_p, l_n, l_d);
+ }
+ else {
+ PSET hull(space_dim, EMPTY);
+ wrap_assign_col(hull, pointset, dimensions_to_be_translated,
+ translations.begin(), translations.end(),
+ w, min_value, max_value, cs_p, l_n);
+ pointset.m_swap(hull);
+ }
+ }
+
+ if (cs_p != 0)
+ pointset.refine_with_constraints(*cs_p);
+ pointset.refine_with_constraints(full_range_bounds);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_inlines.hh line 36. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+coherent_index(const dimension_type i) {
+ return (i % 2 != 0) ? (i-1) : (i+1);
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+ return OR_Matrix<N>::max_num_rows()/2;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+ return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+ return status.test_strongly_closed();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+ status.set_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+ status.set_strongly_closed();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+ status.reset_strongly_closed();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : matrix(num_dimensions), space_dim(num_dimensions), status() {
+ if (kind == EMPTY)
+ set_empty();
+ else if (num_dimensions > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+ : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+ Complexity_Class)
+ // For maximum precision, enforce shortest-path closure
+ // before copying the DB matrix.
+ : matrix((y.strong_closure_assign(), y.matrix)),
+ space_dim(y.space_dim),
+ status() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.marked_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+ : matrix(cs.space_dimension()),
+ space_dim(cs.space_dimension()),
+ status() {
+ if (cs.space_dimension() > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ add_constraints(cs);
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+ : matrix(cgs.space_dimension()),
+ space_dim(cgs.space_dimension()),
+ status() {
+ if (cgs.space_dimension() > 0)
+ // A (non zero-dim) universe octagon is strongly closed.
+ set_strongly_closed();
+ add_congruences(cgs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+ Complexity_Class)
+ : matrix(box.space_dimension()),
+ space_dim(box.space_dimension()),
+ status() {
+ // Check for emptiness for maximum precision.
+ if (box.is_empty())
+ set_empty();
+ else if (box.space_dimension() > 0) {
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ refine_with_constraints(box.constraints());
+ }
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+ Complexity_Class)
+ : matrix(grid.space_dimension()),
+ space_dim(grid.space_dimension()),
+ status() {
+ if (grid.space_dimension() > 0)
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ // Taking minimized congruences ensures maximum precision.
+ refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+ Complexity_Class)
+ : matrix(bd.space_dimension()),
+ space_dim(bd.space_dimension()),
+ status() {
+ // Check for emptiness for maximum precision.
+ if (bd.is_empty())
+ set_empty();
+ else if (bd.space_dimension() > 0) {
+ // A (non zero-dim) universe OS is strongly closed.
+ set_strongly_closed();
+ refine_with_constraints(bd.constraints());
+ }
+}
+
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+ return minimized_congruences();
+}
+
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+ matrix = y.matrix;
+ space_dim = y.space_dim;
+ status = y.status;
+ return *this;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::m_swap(Octagonal_Shape& y) {
+ using std::swap;
+ swap(matrix, y.matrix);
+ swap(space_dim, y.space_dim);
+ swap(status, y.status);
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+ strong_closure_assign();
+ return marked_empty();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+ return true;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+ if (x.space_dim != y.space_dim)
+ // Dimension-incompatible OSs are different.
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty())
+ return y.marked_empty();
+ else
+ return !y.marked_empty();
+ }
+
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+ // If one of two octagons is empty, then they are equal if and only if
+ // the other octagon is empty too.
+ if (x.marked_empty())
+ return y.marked_empty();
+ if (y.marked_empty())
+ return false;
+ // Strong closure is a canonical form.
+ return x.matrix == y.matrix;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+ return !(x == y);
+}
+
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+ const dimension_type j) const {
+ PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+ using namespace Implementation::Octagonal_Shapes;
+ return (j < matrix.row_size(i))
+ ? matrix[i][j]
+ : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+ const dimension_type j) {
+ PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+ using namespace Implementation::Octagonal_Shapes;
+ return (j < matrix.row_size(i))
+ ? matrix[i][j]
+ : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+ strong_reduction_assign();
+ return constraints();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+ const dimension_type j,
+ const N& k) {
+ // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+ PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+ typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+ PPL_ASSERT(j < m_i.row_size());
+#endif
+ N& r_i_j = matrix[i][j];
+ if (r_i_j > k) {
+ r_i_j = k;
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ }
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+#ifndef NDEBUG
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+ typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+ PPL_ASSERT(j < m_i.row_size());
+ PPL_ASSERT(denom != 0);
+#endif
+ PPL_DIRTY_TEMP(N, k);
+ div_round_up(k, numer, denom);
+ add_octagonal_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ i_end = cs.end(); i != i_end; ++i)
+ add_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+ // Dimension-compatibility check.
+ if (c.space_dimension() > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_constraints(cs)",
+ "cs and *this are space-dimension incompatible");
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ if (!marked_empty())
+ refine_no_check(cg);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_congruences(cgs)",
+ "cgs and *this are space-dimension incompatible");
+
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent())
+ set_empty();
+ // Other proper congruences are just ignored.
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check.
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+ new_dimension);
+ // The removal of no dimensions from any octagon is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from an octagon in a 0-dim space.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ strong_closure_assign();
+ matrix.shrink(new_dimension);
+ // When we remove all dimensions from a non-empty octagon,
+ // we obtain the zero-dimensional universe octagon.
+ if (new_dimension == 0 && !marked_empty())
+ set_zero_dim_univ();
+ space_dim = new_dimension;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "Octagonal_Shape");
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+ BHMZ05_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+ unsigned* tp) {
+ static N stop_points[] = {
+ N(-2, ROUND_UP),
+ N(-1, ROUND_UP),
+ N( 0, ROUND_UP),
+ N( 1, ROUND_UP),
+ N( 2, ROUND_UP)
+ };
+ CC76_extrapolation_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]),
+ tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("time_elapse_assign(y)", y);
+ // Compute time-elapse on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.time_elapse_assign(ph_y);
+ Octagonal_Shape<T> x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+ const Octagonal_Shape<T>& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::generalized_refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right);
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case LESS_THAN:
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right);
+ break;
+ case GREATER_THAN:
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::
+refine_fp_interval_abstract_store(
+ Box< Interval<T, Interval_Info> >& store) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ return false;
+
+ // Zero-dim OSs are equal if and only if they are both empty or universe.
+ if (x.space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires strong closure.
+ x.strong_closure_assign();
+ y.strong_closure_assign();
+
+ // If one of two OSs is empty, then they are equal if and only if
+ // the other OS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+ tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Octagonal_Shape<T>& x,
+ const Octagonal_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+ if (!is_integer(elem)) {
+#ifndef NDEBUG
+ Result r =
+#endif
+ floor_assign_r(elem, elem, ROUND_DOWN);
+ PPL_ASSERT(r == V_EQ);
+ reset_strongly_closed();
+ }
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline void
+swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_templates.hh line 1. */
+/* Octagonal_Shape class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_templates.hh line 35. */
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+ const Complexity_Class complexity)
+ : matrix(0), space_dim(0), status() {
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = Octagonal_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ return;
+ }
+
+ // Build from generators when we do not care about complexity
+ // or when the process has polynomial complexity.
+ if (complexity == ANY_COMPLEXITY
+ || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+ *this = Octagonal_Shape(ph.generators());
+ return;
+ }
+
+ // We cannot afford exponential complexity, we do not have a complete set
+ // of generators for the polyhedron, and the polyhedron is not trivially
+ // empty or zero-dimensional. Constraints, however, are up to date.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+ // If the constraint system of the polyhedron is minimized,
+ // the test `is_universe()' has polynomial complexity.
+ if (ph.is_universe()) {
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ return;
+ }
+ }
+
+ // See if there is at least one inconsistent constraint in `ph.con_sys'.
+ for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+ cs_end = ph.con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ *this = Octagonal_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ // If `complexity' allows it, use simplex to derive the exact (modulo
+ // the fact that our OSs are topologically closed) variable bounds.
+ if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(num_dimensions);
+ lp.set_optimization_mode(MAXIMIZATION);
+
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Start with a universe OS that will be refined by the simplex.
+ *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+ // Get all the upper bounds.
+ Generator g(point());
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 0; i < num_dimensions; ++i) {
+ Variable x(i);
+ // Evaluate optimal upper bound for `x <= ub'.
+ lp.set_objective_function(x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ numer *= 2;
+ div_round_up(matrix[2*i + 1][2*i], numer, denom);
+ }
+ // Evaluate optimal upper bounds for `x + y <= ub'.
+ for (dimension_type j = 0; j < i; ++j) {
+ Variable y(j);
+ lp.set_objective_function(x + y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(matrix[2*i + 1][2*j], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `x - y <= ub'.
+ for (dimension_type j = 0; j < num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(((i < j) ?
+ matrix[2*j][2*i]
+ : matrix[2*i + 1][2*j + 1]),
+ numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `y - x <= ub'.
+ for (dimension_type j = 0; j < num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(((i < j)
+ ? matrix[2*j][2*i]
+ : matrix[2*i + 1][2*j + 1]),
+ numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x - y <= ub'.
+ for (dimension_type j = 0; j < i; ++j) {
+ Variable y(j);
+ lp.set_objective_function(-x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(matrix[2*i][2*j + 1], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ numer *= 2;
+ div_round_up(matrix[2*i][2*i + 1], numer, denom);
+ }
+ }
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+ *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+ refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+ : matrix(gs.space_dimension()),
+ space_dim(gs.space_dimension()),
+ status() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty polyhedron.
+ set_empty();
+ return;
+ }
+
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
+
+ PPL_DIRTY_TEMP(N, tmp);
+ bool mat_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+ const Generator& g = *k;
+ switch (g.type()) {
+ case Generator::POINT:
+ point_seen = true;
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ if (!mat_initialized) {
+ // When handling the first (closure) point, we initialize the matrix.
+ mat_initialized = true;
+ const Coefficient& d = g.divisor();
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any point the hyperplanes passing in the point
+ // and having the octagonal gradient.
+ // Let be P = [P_1, P_2, ..., P_n] point.
+ // Hyperplanes: X_i - X_j = P_i - P_j.
+ div_round_up(x_i[dj], g_j - g_i, d);
+ div_round_up(x_ii[dj + 1], g_i - g_j, d);
+ // Hyperplanes: X_i + X_j = P_i + P_j.
+ div_round_up(x_i[dj + 1], -g_j - g_i, d);
+ div_round_up(x_ii[dj], g_i + g_j, d);
+ }
+ // Hyperplanes: X_i = P_i.
+ div_round_up(x_i[di + 1], -g_i - g_i, d);
+ div_round_up(x_ii[di], g_i + g_i, d);
+ }
+ }
+ else {
+ // This is not the first point: the matrix already contains
+ // valid values and we must compute maxima.
+ const Coefficient& d = g.divisor();
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any point the straight lines passing in the point
+ // and having the octagonal gradient; compute maxima values.
+ // Let be P = [P_1, P_2, ..., P_n] point.
+ // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+ div_round_up(tmp, g_j - g_i, d);
+ max_assign(x_i[dj], tmp);
+ div_round_up(tmp, g_i - g_j, d);
+ max_assign(x_ii[dj + 1], tmp);
+ // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+ div_round_up(tmp, -g_j - g_i, d);
+ max_assign(x_i[dj + 1], tmp);
+ div_round_up(tmp, g_i + g_j, d);
+ max_assign(x_ii[dj], tmp);
+ }
+ // Hyperplane: X_i = max (P_i, const).
+ div_round_up(tmp, -g_i - g_i, d);
+ max_assign(x_i[di + 1], tmp);
+ div_round_up(tmp, g_i + g_i, d);
+ max_assign(x_ii[di], tmp);
+ }
+ }
+ break;
+ default:
+ // Lines and rays temporarily ignored.
+ break;
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw_invalid_argument("Octagonal_Shape(gs)",
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+ const Generator& g = *k;
+ switch (g.type()) {
+ case Generator::LINE:
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any line the right limit.
+ if (g_i != g_j) {
+ // Hyperplane: X_i - X_j <=/>= +Inf.
+ assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ if (g_i != -g_j) {
+ // Hyperplane: X_i + X_j <=/>= +Inf.
+ assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ if (g_i != 0) {
+ // Hyperplane: X_i <=/>= +Inf.
+ assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ break;
+ case Generator::RAY:
+ // TODO: This can be optimized more, if needed, exploiting the
+ // (possible) sparseness of g. Also consider if OR_Matrix should be
+ // sparse, too.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const Coefficient& g_i = g.coefficient(Variable(i));
+ const dimension_type di = 2*i;
+ row_reference x_i = *(mat_begin + di);
+ row_reference x_ii = *(mat_begin + (di + 1));
+ for (dimension_type j = 0; j < i; ++j) {
+ const Coefficient& g_j = g.coefficient(Variable(j));
+ const dimension_type dj = 2*j;
+ // Set for any ray the right limit in the case
+ // of the binary constraints.
+ if (g_i < g_j)
+ // Hyperplane: X_i - X_j >= +Inf.
+ assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > g_j)
+ // Hyperplane: X_i - X_j <= +Inf.
+ assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i < -g_j)
+ // Hyperplane: X_i + X_j >= +Inf.
+ assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > -g_j)
+ // Hyperplane: X_i + X_j <= +Inf.
+ assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ // Case: unary constraints.
+ if (g_i < 0)
+ // Hyperplane: X_i = +Inf.
+ assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i > 0)
+ // Hyperplane: X_i = +Inf.
+ assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ set_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ // Get rid of strict inequalities.
+ if (c.is_strict_inequality()) {
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (c.is_tautological())
+ return;
+ // Nontrivial strict inequalities are not allowed.
+ throw_invalid_argument("add_constraint(c)",
+ "strict inequalities are not allowed");
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ // Constraints that are not octagonal differences are not allowed.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, term))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not an octagonal constraint");
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (not a strict inequality).
+ if (c.inhomogeneous_term() < 0
+ || (c.is_equality() && c.inhomogeneous_term() != 0))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of constraint.
+ typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+ N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ bool is_oct_changed = false;
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, term, coeff);
+ if (m_i_j > d) {
+ m_i_j = d;
+ is_oct_changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Select the cell to be modified for the ">=" part of constraint.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+
+ typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& m_ci_cj = m_ci[cj];
+ // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci_cj > d) {
+ m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+
+ // This method does not preserve closure.
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check:
+ // the dimension of `cg' can not be greater than space_dim.
+ if (space_dimension() < cg_space_dim)
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ // Handle the case of proper congruences first.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_tautological())
+ return;
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Non-trivial and proper congruences are not allowed.
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a non-trivial, proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ add_constraint(c);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+ " T not a floating point type.");
+
+ // We assume that the analyzer will not try to apply an unreachable filter.
+ PPL_ASSERT(!marked_empty());
+
+ // Dimension-compatibility checks.
+ // The dimensions of `left' and `right' should not be greater than the
+ // dimension of `*this'.
+ const dimension_type left_space_dim = left.space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "left", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "right", right);
+
+ // Number of non-zero coefficients in `left': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type left_t = 0;
+ // Variable-index of the last non-zero coefficient in `left', if any.
+ dimension_type left_w_id = 0;
+ // Number of non-zero coefficients in `right': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type right_t = 0;
+ // Variable-index of the last non-zero coefficient in `right', if any.
+ dimension_type right_w_id = 0;
+
+ // Get information about the number of non-zero coefficients in `left'.
+ for (dimension_type i = left_space_dim; i-- > 0; )
+ if (left.coefficient(Variable(i)) != 0) {
+ if (left_t++ == 1)
+ break;
+ else
+ left_w_id = i;
+ }
+
+ // Get information about the number of non-zero coefficients in `right'.
+ for (dimension_type i = right_space_dim; i-- > 0; )
+ if (right.coefficient(Variable(i)) != 0) {
+ if (right_t++ == 1)
+ break;
+ else
+ right_w_id = i;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ // FIXME: there is plenty of duplicate code in the following lines. We could
+ // shorten it at the expense of a bit of efficiency.
+
+ if (left_t == 0) {
+ if (right_t == 0) {
+ // The constraint involves constants only. Ignore it: it is up to
+ // the analyzer to handle it.
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (right_t == 1) {
+ // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+ // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ if (right_w_coeff == 1) {
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_right, n_right + 1, b_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (right_w_coeff == -1) {
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_right + 1, n_right, b_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+ else if (left_t == 1) {
+ if (right_t == 0) {
+ // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+ // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ if (left_w_coeff == 1) {
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (left_w_coeff == -1) {
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ if (right_t == 1) {
+ // The constraint has the form
+ // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+ // Reduce it to the constraint +/-x +/-y <= c+ - a-
+ // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ bool is_left_coeff_one = (left_w_coeff == 1);
+ bool is_left_coeff_minus_one = (left_w_coeff == -1);
+ bool is_right_coeff_one = (right_w_coeff == 1);
+ bool is_right_coeff_minus_one = (right_w_coeff == -1);
+ if (left_w_id == right_w_id) {
+ if ((is_left_coeff_one && is_right_coeff_one)
+ || (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+ // Here we have an identity or a constants-only constraint.
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // We fall back to a previous case
+ // (but we do not need to multiply the result by two).
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // We fall back to a previous case
+ // (but we do not need to multiply the result by two).
+ const dimension_type n_left = left_w_id * 2;
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ else if (is_left_coeff_one && is_right_coeff_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right, n_left, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left + 1, n_right + 1,
+ c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right + 1, n_left, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left + 1, n_right, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right, n_left + 1, c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left, n_right + 1, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+ const dimension_type n_left = left_w_id * 2;
+ const dimension_type n_right = right_w_id * 2;
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ if (left_w_id < right_w_id)
+ add_octagonal_constraint(n_right + 1, n_left + 1,
+ c_plus_minus_a_minus);
+ else
+ add_octagonal_constraint(n_left, n_right, c_plus_minus_a_minus);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+
+ // FIRST, update the binary constraints for each pair of DIFFERENT variables
+ // in `left' and `right'.
+
+ // Declare temporaries outside of the loop.
+ PPL_DIRTY_TEMP(N, low_coeff);
+ PPL_DIRTY_TEMP(N, high_coeff);
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ Linear_Form<FP_Interval_Type> right_minus_left(right);
+ right_minus_left -= left;
+
+ dimension_type max_w_id = std::max(left_w_id, right_w_id);
+ for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+ for (dimension_type second_v = first_v + 1;
+ second_v <= max_w_id; ++second_v) {
+ const FP_Interval_Type& lfv_coefficient =
+ left.coefficient(Variable(first_v));
+ const FP_Interval_Type& lsv_coefficient =
+ left.coefficient(Variable(second_v));
+ const FP_Interval_Type& rfv_coefficient =
+ right.coefficient(Variable(first_v));
+ const FP_Interval_Type& rsv_coefficient =
+ right.coefficient(Variable(second_v));
+ // We update the constraints only when both variables appear in at
+ // least one argument.
+ bool do_update = false;
+ assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ else {
+ assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ }
+
+ if (do_update) {
+ Variable first(first_v);
+ Variable second(second_v);
+ dimension_type n_first_var = first_v * 2;
+ dimension_type n_second_var = second_v * 2;
+ linear_form_upper_bound(right_minus_left - first + second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var + 1, n_first_var + 1,
+ upper_bound);
+ linear_form_upper_bound(right_minus_left + first + second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var + 1, n_first_var, upper_bound);
+ linear_form_upper_bound(right_minus_left - first - second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var, n_first_var + 1, upper_bound);
+ linear_form_upper_bound(right_minus_left + first - second,
+ upper_bound);
+ add_octagonal_constraint(n_second_var, n_first_var, upper_bound);
+ }
+ }
+ }
+
+ // Finally, update the unary constraints.
+ for (dimension_type v = 0; v <= max_w_id; ++v) {
+ const FP_Interval_Type& lv_coefficient =
+ left.coefficient(Variable(v));
+ const FP_Interval_Type& rv_coefficient =
+ right.coefficient(Variable(v));
+ // We update the constraints only if v appears in at least one of the
+ // two arguments.
+ bool do_update = false;
+ assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+
+ if (do_update) {
+ Variable var(v);
+ dimension_type n_var = 2 * v;
+ /*
+ VERY DIRTY trick: since we need to keep the old unary constraints
+ while computing the new ones, we momentarily keep the new coefficients
+ in the main diagonal of the matrix. They will be moved later.
+ */
+ linear_form_upper_bound(right_minus_left + var, upper_bound);
+ mul_2exp_assign_r(matrix[n_var + 1][n_var + 1], upper_bound, 1,
+ ROUND_UP);
+ linear_form_upper_bound(right_minus_left - var, upper_bound);
+ mul_2exp_assign_r(matrix[n_var][n_var], upper_bound, 1,
+ ROUND_UP);
+ }
+ }
+
+ /*
+ Now move the newly computed coefficients from the main diagonal to
+ their proper place, and restore +infinity on the diagonal.
+ */
+ row_iterator m_ite = matrix.row_begin();
+ row_iterator m_end = matrix.row_end();
+ for (dimension_type i = 0; m_ite != m_end; i += 2) {
+ row_reference upper = *m_ite;
+ N& ul = upper[i];
+ add_octagonal_constraint(i, i + 1, ul);
+ assign_r(ul, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ ++m_ite;
+ row_reference lower = *m_ite;
+ N& lr = lower[i + 1];
+ add_octagonal_constraint(i + 1, i, lr);
+ assign_r(lr, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ ++m_ite;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ const dimension_type c_space_dim = c.space_dimension();
+ PPL_ASSERT(c_space_dim <= space_dim);
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ // Constraints that are not octagonal differences are ignored.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, term))
+ return;
+
+ if (num_vars == 0) {
+ const Coefficient& c_inhomo = c.inhomogeneous_term();
+ // Dealing with a trivial constraint (maybe a strict inequality).
+ if (c_inhomo < 0
+ || (c_inhomo != 0 && c.is_equality())
+ || (c_inhomo == 0 && c.is_strict_inequality()))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of constraint.
+ typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+ N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ bool is_oct_changed = false;
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, term, coeff);
+ if (m_i_j > d) {
+ m_i_j = d;
+ is_oct_changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Select the cell to be modified for the ">=" part of constraint.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+
+ typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& m_ci_cj = m_ci[cj];
+ // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci_cj > d) {
+ m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+
+ // This method does not preserve closure.
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+ const dimension_type n_rows = matrix.num_rows();
+ // A zero-space-dim shape always has affine dimension zero.
+ if (n_rows == 0)
+ return 0;
+
+ // Strong closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ strong_closure_assign();
+ if (marked_empty())
+ return 0;
+
+ // The vector `leaders' is used to represent non-singular
+ // equivalence classes:
+ // `leaders[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ // Due to the splitting of variables, the affine dimension is the
+ // number of non-singular positive zero-equivalence classes.
+ dimension_type affine_dim = 0;
+ for (dimension_type i = 0; i < n_rows; i += 2)
+ // Note: disregard the singular equivalence class.
+ if (leaders[i] == i && leaders[i + 1] == i + 1)
+ ++affine_dim;
+
+ return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+ // Strong closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ strong_closure_assign();
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ if (marked_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ // The vector `leaders' is used to represent equivalence classes:
+ // `leaders[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+ const dimension_type lead_i = leaders[i];
+ if (i == lead_i) {
+ if (leaders[i + 1] == i)
+ // `i' is the leader of the singular equivalence class.
+ goto singular;
+ else
+ // `i' is the leader of a non-singular equivalence class.
+ continue;
+ }
+ else {
+ // `i' is not a leader.
+ if (leaders[i + 1] == lead_i)
+ // `i' belongs to the singular equivalence class.
+ goto singular;
+ else
+ // `i' does not belong to the singular equivalence class.
+ goto non_singular;
+ }
+
+ singular:
+ // `i' belongs to the singular equivalence class:
+ // we have a unary equality constraint.
+ {
+ const Variable x(i/2);
+ const N& c_ii_i = matrix[i + 1][i];
+#ifndef NDEBUG
+ const N& c_i_ii = matrix[i][i + 1];
+ PPL_ASSERT(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+ numer_denom(c_ii_i, numer, denom);
+ denom *= 2;
+ cgs.insert(denom*x == numer);
+ }
+ continue;
+
+ non_singular:
+ // `i' does not belong to the singular equivalence class.
+ // we have a binary equality constraint.
+ {
+ const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+ using namespace Implementation::Octagonal_Shapes;
+ const N& c_ii_lii = matrix[i + 1][coherent_index(lead_i)];
+ PPL_ASSERT(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+ const Variable x(lead_i/2);
+ const Variable y(i/2);
+ numer_denom(c_i_li, numer, denom);
+ if (lead_i % 2 == 0)
+ cgs.insert(denom*x - denom*y == numer);
+ else
+ cgs.insert(denom*x + denom*y + numer == 0);
+ }
+ continue;
+ }
+ return cgs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+ // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+ // If `y' is an universal 0-dim space octagon, we simply return.
+ if (y.space_dim == 0) {
+ if (y.marked_empty())
+ set_empty();
+ return;
+ }
+
+ // If `*this' is an empty 0-dim space octagon, then it is sufficient
+ // to adjust the dimension of the vector space.
+ if (space_dim == 0 && marked_empty()) {
+ add_space_dimensions_and_embed(y.space_dim);
+ return;
+ }
+
+ // This is the old number of rows in the matrix. It is equal to
+ // the first index of columns to change.
+ dimension_type old_num_rows = matrix.num_rows();
+ // First we increase the space dimension of `*this' by adding
+ // `y.space_dimension()' new dimensions.
+ // The matrix for the new octagon is obtained
+ // by leaving the old system of constraints in the upper left-hand side
+ // (where they are at the present) and placing the constraints of `y' in the
+ // lower right-hand side.
+ add_space_dimensions_and_embed(y.space_dim);
+ typename OR_Matrix<N>::const_element_iterator
+ y_it = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::row_iterator
+ i = matrix.row_begin() + old_num_rows,
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::row_reference_type r = *i;
+ dimension_type rs_i = i.row_size();
+ for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+ r[j] = *y_it;
+ }
+
+ // The concatenation does not preserve the closure.
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("contains(y)", y);
+
+ if (space_dim == 0) {
+ // The zero-dimensional empty octagon only contains another
+ // zero-dimensional empty octagon.
+ // The zero-dimensional universe octagon contains any other
+ // zero-dimensional octagon.
+ return marked_empty() ? y.marked_empty() : true;
+ }
+
+ // `y' needs to be transitively closed.
+ y.strong_closure_assign();
+ // An empty octagon is in any other dimension-compatible octagons.
+ if (y.marked_empty())
+ return true;
+
+ // If `*this' is empty it can not contain `y' (which is not empty).
+ if (is_empty())
+ return false;
+
+ // `*this' contains `y' if and only if every element of `*this'
+ // is greater than or equal to the correspondent one of `y'.
+ for (typename OR_Matrix<N>::const_element_iterator
+ i = matrix.element_begin(), j = y.matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end; ++i, ++j)
+ if (*i < *j)
+ return false;
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+ strong_closure_assign();
+ if (marked_empty())
+ return true;
+ y.strong_closure_assign();
+ if (y.marked_empty())
+ return true;
+
+ // Two Octagonal_Shapes are disjoint if and only if their
+ // intersection is empty, i.e., if and only if there exists a
+ // variable such that the upper bound of the constraint on that
+ // variable in the first Octagonal_Shape is strictly less than the
+ // lower bound of the corresponding constraint in the second
+ // Octagonal_Shape or vice versa.
+
+ const dimension_type n_rows = matrix.num_rows();
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ const row_iterator y_begin = y.matrix.row_begin();
+
+ PPL_DIRTY_TEMP(N, neg_y_ci_cj);
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference m_i = *i_iter;
+ for (dimension_type j = 0; j < n_rows; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_reference m_cj = *(m_begin + cj);
+ const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+ row_reference y_ci = *(y_begin + ci);
+ row_reference y_j = *(y_begin + j);
+ const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+ neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+ if (m_i_j < neg_y_ci_cj)
+ return true;
+ }
+ }
+ return false;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+ // An empty octagon is not universe.
+ if (marked_empty())
+ return false;
+
+ // If the octagon is non-empty and zero-dimensional,
+ // then it is necessarily the universe octagon.
+ if (space_dim == 0)
+ return true;
+
+ // An universe octagon can only contains trivial constraints.
+ for (typename OR_Matrix<N>::const_element_iterator
+ i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i)
+ if (!is_plus_infinity(*i))
+ return false;
+
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+ strong_closure_assign();
+ // A zero-dimensional or empty octagon is bounded.
+ if (marked_empty() || space_dim == 0)
+ return true;
+
+ // A bounded octagon never can contains trivial constraints.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+ const dimension_type i_index = i.index();
+ for (dimension_type j = i.row_size(); j-- > 0; )
+ if (i_index != j)
+ if (is_plus_infinity(x_i[j]))
+ return false;
+ }
+
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+ // Force strong closure.
+ if (is_empty())
+ return false;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return true;
+
+ // A strongly closed and consistent Octagonal_Shape defined by
+ // integer constraints can only be empty due to tight coherence.
+ if (std::numeric_limits<T>::is_integer)
+ return !tight_coherence_would_make_empty();
+
+ // Build an integer Octagonal_Shape oct_z with bounds at least as
+ // tight as those in *this and then recheck for emptiness, also
+ // exploiting tight-coherence.
+ Octagonal_Shape<mpz_class> oct_z(space_dim);
+ oct_z.reset_strongly_closed();
+
+ typedef Octagonal_Shape<mpz_class>::N Z;
+ bool all_integers = true;
+ typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+ for (typename OR_Matrix<Z>::element_iterator
+ z_i = oct_z.matrix.element_begin(),
+ z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+ const N& d = *x_i;
+ if (is_plus_infinity(d))
+ continue;
+ if (is_integer(d))
+ assign_r(*z_i, d, ROUND_NOT_NEEDED);
+ else {
+ all_integers = false;
+ assign_r(*z_i, d, ROUND_DOWN);
+ }
+ }
+ // Restore strong closure.
+ if (all_integers)
+ // oct_z unchanged, so it is still strongly closed.
+ oct_z.set_strongly_closed();
+ else {
+ // oct_z changed: recompute strong closure.
+ oct_z.strong_closure_assign();
+ if (oct_z.marked_empty())
+ return false;
+ }
+ return !oct_z.tight_coherence_would_make_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ strong_closure_assign();
+ // For an empty Octagonal shape, we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The Octagonal shape has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff_j);
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ Linear_Expression le = expr;
+ // Boolean to keep track of a variable `v' in expression `le'.
+ // If we can replace `v' by an expression using variables other
+ // than `v' and are already in `le', then this is set to true.
+ bool constant_v = false;
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+ constant_v = false;
+ dimension_type i = i_iter.index();
+ const Variable v(i/2);
+ coeff = le.coefficient(v);
+ if (coeff == 0) {
+ constant_v = true;
+ continue;
+ }
+ // We check the unary constraints.
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ const N& m_i_ii = m_i[i + 1];
+ const N& m_ii_i = m_ii[i];
+ if ((!is_plus_infinity(m_i_ii) && !is_plus_infinity(m_ii_i))
+ && (is_additive_inverse(m_i_ii, m_ii_i))) {
+ // If `v' is constant, replace it in `le' by the value.
+ numer_denom(m_i_ii, numer, denom);
+ denom *= 2;
+ le -= coeff*v;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ continue;
+ }
+ // Check the octagonal constraints between `v' and the other dimensions
+ // that have non-zero coefficient in `le'.
+ else {
+ PPL_ASSERT(!constant_v);
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ for (row_iterator j_iter = i_iter; j_iter != m_end; j_iter += 2) {
+ dimension_type j = j_iter.index();
+ const Variable vj(j/2);
+ coeff_j = le.coefficient(vj);
+ if (coeff_j == 0)
+ // The coefficient in `le' is 0, so do nothing.
+ continue;
+ const dimension_type cj = coherent_index(j);
+ const dimension_type cjj = coherent_index(j + 1);
+
+ row_reference m_j = *(m_begin + j);
+ row_reference m_cj = *(m_begin + cj);
+ const N& m_j_i = m_j[i];
+ const N& m_i_j = m_cj[ci];
+ if ((!is_plus_infinity(m_i_j) && !is_plus_infinity(m_j_i))
+ && (is_additive_inverse(m_i_j, m_j_i))) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the constraint with `v' is an equality.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(m_i_j, numer, denom);
+ le -= coeff*v;
+ le += coeff*vj;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+
+ m_j = *(m_begin + (j + 1));
+ m_cj = *(m_begin + cjj);
+ const N& m_j_i1 = m_j[i];
+ const N& m_i_j1 = m_cj[ci];
+ if ((!is_plus_infinity(m_i_j1) && !is_plus_infinity(m_j_i1))
+ && (is_additive_inverse(m_i_j1, m_j_i1))) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the constraint with `v' is an equality.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(m_i_j1, numer, denom);
+ le -= coeff*v;
+ le -= coeff*vj;
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+
+ // The expression 'expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the octagonal shape.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ // An octagon known to be empty constrains all variables.
+ // (Note: do not force emptiness check _yet_)
+ if (marked_empty())
+ return true;
+
+ // Check whether `var' is syntactically constrained.
+ const dimension_type n_v = 2*(var_space_dim - 1);
+ typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+ for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+ if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+ return true;
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+ if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v + 1]))
+ return true;
+ }
+
+ // `var' is not syntactically constrained:
+ // now force an emptiness check.
+ return is_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+ // This method is only used by method OK() so as to check if a
+ // strongly closed matrix is also strong-coherent, as it must be.
+ const dimension_type num_rows = matrix.num_rows();
+
+ // Allocated here once and for all.
+ PPL_DIRTY_TEMP(N, semi_sum);
+ // The strong-coherence is: for every indexes i and j (and i != j)
+ // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+ // where ci = i + 1, if i is even number or
+ // ci = i - 1, if i is odd.
+ // Ditto for cj.
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+ using namespace Implementation::Octagonal_Shapes;
+ const N& m_i_ci = m_i[coherent_index(i)];
+ for (dimension_type j = matrix.row_size(i); j-- > 0; )
+ // Note: on the main diagonal only PLUS_INFINITY can occur.
+ if (i != j) {
+ const N& m_cj_j = matrix[coherent_index(j)][j];
+ if (!is_plus_infinity(m_i_ci)
+ && !is_plus_infinity(m_cj_j)) {
+ // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+ // rounding the result towards plus infinity.
+ add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+ div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+ if (m_i[j] > semi_sum)
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+ // This method is only used in assertions: efficiency is not a must.
+
+ // An empty octagon is already transitively reduced.
+ if (marked_empty())
+ return true;
+
+ Octagonal_Shape x = *this;
+ // The matrix representing an OS is strongly reduced if, by removing
+ // any constraint, the resulting matrix describes a different OS.
+ for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+ typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+ const dimension_type i = iter.index();
+ for (dimension_type j = iter.row_size(); j-- > 0; ) {
+ if (!is_plus_infinity(m_i[j])) {
+ Octagonal_Shape x_copy = *this;
+ assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (x == x_copy)
+ return false;
+ }
+ }
+ }
+ // The octagon is just reduced.
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+ const bool from_above) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+ strong_closure_assign();
+
+ // A zero-dimensional or empty octagon bounds everything.
+ if (space_dim == 0 || marked_empty())
+ return true;
+
+ // The constraint `c' is used to check if `expr' is an octagonal difference
+ // and, in this case, to select the cell.
+ const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ if (Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+ i, j, coeff, term)) {
+ if (num_vars == 0)
+ return true;
+ // Select the cell to be checked.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ return !is_plus_infinity(m_i[j]);
+ }
+ else {
+ // `c' is not an octagonal constraint: use the MIP solver.
+ Optimization_Mode mode_bounds =
+ from_above ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+ return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim octagons first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ strong_closure_assign();
+ // For an empty OS we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The constraint `c' is used to check if `expr' is an octagonal difference
+ // and, in this case, to select the cell.
+ const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+ i, j, coeff, term)) {
+ // `c' is not an octagonal constraint: use the MIP solver.
+ Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ mip.optimal_value(ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ else
+ // Here`expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // `c' is an octagonal constraint.
+ if (num_vars == 0) {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+
+ // Select the cell to be checked.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ PPL_DIRTY_TEMP(N, d);
+ if (!is_plus_infinity(m_i[j])) {
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = maximize ? b : minus_b;
+ assign_r(d, sc_b, ROUND_UP);
+ // Set `coeff_expr' to the absolute value of coefficient of a variable
+ // of `expr'.
+ PPL_DIRTY_TEMP(N, coeff_expr);
+ const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+ const int sign_i = sgn(coeff_i);
+ if (sign_i > 0)
+ assign_r(coeff_expr, coeff_i, ROUND_UP);
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+ neg_assign(minus_coeff_i, coeff_i);
+ assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+ }
+ // Approximating the maximum/minimum of `expr'.
+ if (num_vars == 1) {
+ PPL_DIRTY_TEMP(N, m_i_j);
+ div_2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+ add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+ }
+ else
+ add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+ numer_denom(d, ext_n, ext_d);
+ if (!maximize)
+ neg_assign(ext_n);
+ included = true;
+ return true;
+ }
+
+ // The `expr' is unbounded.
+ return false;
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included, Generator& g) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim octagons first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ g = point();
+ return true;
+ }
+ }
+
+ strong_closure_assign();
+ // For an empty OS we simply return false.
+ if (marked_empty())
+ return false;
+ if (!is_universe()) {
+ // We use MIP_Problems to handle constraints that are not
+ // octagonal difference.
+ Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = mip.optimizing_point();
+ mip.evaluate_objective_function(g, ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ }
+ // The `expr' is unbounded.
+ return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+ dimension_type cg_space_dim = cg.space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ // If the congruence is an equality,
+ // find the relation with the equivalent equality constraint.
+ if (cg.is_equality()) {
+ Constraint c(cg);
+ return relation_with(c);
+ }
+
+ strong_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
+ Linear_Expression le(cg.expression());
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ bool min_included;
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_numer / min_denom;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_denom < min_numer)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_numer / max_denom;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_denom > max_numer)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+ dimension_type c_space_dim = c.space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ // The closure needs to make explicit the implicit constraints.
+ strong_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ // Trivially false zero-dimensional constraint.
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ // Trivially true zero-dimensional constraint.
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(c_term);
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, c_space_dim, num_vars,
+ i, j, coeff, c_term)) {
+ // Constraints that are not octagonal differences.
+ // Use maximize() and minimize() to do much of the work.
+
+ // Find the linear expression for the constraint and use that to
+ // find if the expression is bounded from above or below and if it
+ // is, find the maximum and minimum values.
+ Linear_Expression le;
+ le.set_space_dimension(c.space_dimension());
+ le.linear_combine(c.expr, Coefficient_one(), Coefficient_one(),
+ 1, c_space_dim + 1);
+
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+ if (!bounded_above) {
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_strict_inequality() || c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ if (!bounded_below) {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ PPL_UNREACHABLE;
+ break;
+ case 0:
+ if (min_numer == 0) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ }
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+ }
+
+ // Select the cell to be checked for the "<=" part of constraint.
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ const N& m_i_j = m_i[j];
+ // Set `coeff' to the absolute value of itself.
+ if (coeff < 0)
+ neg_assign(coeff);
+
+ // Select the cell to be checked for the ">=" part of constraint.
+ // Select the right row of the cell.
+ if (i % 2 == 0)
+ ++i_iter;
+ else
+ --i_iter;
+ typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+ using namespace Implementation::Octagonal_Shapes;
+ const N& m_ci_cj = m_ci[coherent_index(j)];
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ // The following variables of mpq_class type are used to be precise
+ // when the octagon is defined by integer constraints.
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ PPL_DIRTY_TEMP(mpq_class, d);
+ PPL_DIRTY_TEMP(mpq_class, d1);
+ PPL_DIRTY_TEMP(mpq_class, c_denom);
+ PPL_DIRTY_TEMP(mpq_class, q_denom);
+ assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+ assign_r(d, c_term, ROUND_NOT_NEEDED);
+ neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+ div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+ div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+ if (is_plus_infinity(m_i_j)) {
+ if (!is_plus_infinity(m_ci_cj)) {
+ // `*this' is in the following form:
+ // `-m_ci_cj <= v - u'.
+ // In this case `*this' is disjoint from `c' if
+ // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+ // i.e., if `m_ci_cj < d1' (`m_ci_cj <= d1'
+ // if c is a strict inequality).
+ numer_denom(m_ci_cj, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+
+ // Here `m_i_j' is not plus-infinity.
+ numer_denom(m_i_j, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_x, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+ if (!is_plus_infinity(m_ci_cj)) {
+ numer_denom(m_ci_cj, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_x == d && q_y == d1) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+ // `*this' is disjoint from `c' when
+ // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // Here `m_ci_cj' can be also plus-infinity.
+ // If `c' is an equality, `*this' is disjoint from `c' if
+ // `m_i_j < d'.
+ if (d > q_x) {
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+
+ if (d == q_x && c.is_nonstrict_inequality())
+ return Poly_Con_Relation::is_included();
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ // The closure needs to make explicit the implicit constraints and if the
+ // octagon is empty.
+ strong_closure_assign();
+
+ // The empty octagon cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe octagon in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ const bool is_line = g.is_line();
+ const bool is_line_or_ray = g.is_line_or_ray();
+
+ // The relation between the octagon and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the octagon.
+ // To check if the generator satisfies all the constraints it's enough
+ // studying the sign of the scalar product between the generator and
+ // all the constraints in the octagon.
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+
+ // We find in `*this' all the constraints.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+ dimension_type i = i_iter.index();
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ const N& m_i_ii = m_i[i + 1];
+ const N& m_ii_i = m_ii[i];
+ // We have the unary constraints.
+ const Variable x(i/2);
+ const Coefficient& g_coeff_x
+ = (x.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(x);
+ if (is_additive_inverse(m_i_ii, m_ii_i)) {
+ // The constraint has form ax = b.
+ // To satisfy the constraint it is necessary that the scalar product
+ // is not zero. The scalar product has the form
+ // 'denom * g_coeff_x - numer * g.divisor()'.
+ numer_denom(m_ii_i, numer, denom);
+ denom *= 2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ // We have 0, 1 or 2 inequality constraints.
+ else {
+ if (!is_plus_infinity(m_i_ii)) {
+ // The constraint has form -ax <= b.
+ // If the generator is a line it's necessary to check if
+ // the scalar product is not zero, if it is positive otherwise.
+ numer_denom(m_i_ii, numer, denom);
+ denom *= -2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive and the scalar
+ // product has the form
+ // '-denom * g.coeff_x - numer * g.divisor()'.
+ if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_i)) {
+ // The constraint has form ax <= b.
+ numer_denom(m_ii_i, numer, denom);
+ denom *= 2;
+ product = denom * g_coeff_x;
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer , g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive and the scalar
+ // product has the form
+ // 'denom * g_coeff_x - numer * g.divisor()'.
+ if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+
+ // We have the binary constraints.
+ for (row_iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+ dimension_type i = i_iter.index();
+ row_reference m_i = *i_iter;
+ row_reference m_ii = *(i_iter + 1);
+ for (dimension_type j = 0; j < i; j += 2) {
+ const N& m_i_j = m_i[j];
+ const N& m_ii_jj = m_ii[j + 1];
+ const N& m_ii_j = m_ii[j];
+ const N& m_i_jj = m_i[j + 1];
+ const Variable x(j/2);
+ const Variable y(i/2);
+ const Coefficient& g_coeff_x
+ = (x.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(x);
+ const Coefficient& g_coeff_y
+ = (y.space_dimension() > g_space_dim)
+ ? Coefficient_zero()
+ : g.coefficient(y);
+
+ const bool difference_is_equality = is_additive_inverse(m_ii_jj, m_i_j);
+ if (difference_is_equality) {
+ // The constraint has form a*x - a*y = b.
+ // The scalar product has the form
+ // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.
+ numer_denom(m_i_j, numer, denom);
+ product = denom * g_coeff_x;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ if (!is_plus_infinity(m_i_j)) {
+ // The constraint has form a*x - a*y <= b.
+ // The scalar product has the form
+ // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_i_j, numer, denom);
+ product = denom * g_coeff_x;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_jj)) {
+ // The constraint has form -a*x + a*y <= b.
+ // The scalar product has the form
+ // '-denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_ii_jj, numer, denom);
+ product = denom * g_coeff_y;
+ neg_assign(denom);
+ add_mul_assign(product, denom, g_coeff_x);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+
+ const bool sum_is_equality = is_additive_inverse(m_i_jj, m_ii_j);
+ if (sum_is_equality) {
+ // The constraint has form a*x + a*y = b.
+ // The scalar product has the form
+ // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.
+ numer_denom(m_ii_j, numer, denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ if (!is_plus_infinity(m_i_jj)) {
+ // The constraint has form -a*x - a*y <= b.
+ // The scalar product has the form
+ // '-denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_i_jj, numer, denom);
+ neg_assign(denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ if (!is_plus_infinity(m_ii_j)) {
+ // The constraint has form a*x + a*y <= b.
+ // The scalar product has the form
+ // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+ // If the generator is not a line it's necessary to check
+ // that the scalar product sign is not positive.
+ numer_denom(m_ii_j, numer, denom);
+ product = denom * g_coeff_x;
+ add_mul_assign(product, denom, g_coeff_y);
+ // Note that if the generator `g' is a line or a ray,
+ // its divisor is zero.
+ if (!is_line_or_ray) {
+ neg_assign(numer);
+ add_mul_assign(product, numer, g.divisor());
+ }
+ if (is_line && product != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (product > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+ // If this point is reached the constraint 'g' satisfies
+ // all the constraints in the octagon.
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+ // Do something only if necessary (zero-dim implies strong closure).
+ if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+ return;
+
+ // Even though the octagon will not change, its internal representation
+ // is going to be modified by the closure algorithm.
+ Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const dimension_type n_rows = x.matrix.num_rows();
+ const row_iterator m_begin = x.matrix.row_begin();
+ const row_iterator m_end = x.matrix.row_end();
+
+ // Fill the main diagonal with zeros.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+ assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+ }
+
+ // This algorithm is given by two steps: the first one is a simple
+ // adaptation of the `shortest-path closure' using the Floyd-Warshall
+ // algorithm; the second one is the `strong-coherence' algorithm.
+ // It is important to note that after the strong-coherence,
+ // the octagon is still shortest-path closed and hence, strongly closed.
+
+ // Recall that, given an index `h', we indicate with `ch' the coherent
+ // index, i.e., the index such that:
+ // ch = h + 1, if h is an even number;
+ // ch = h - 1, if h is an odd number.
+
+ typename OR_Matrix<N>::element_iterator iter_ij;
+ std::vector<N> vec_k(n_rows);
+ std::vector<N> vec_ck(n_rows);
+ PPL_DIRTY_TEMP(N, sum1);
+ PPL_DIRTY_TEMP(N, sum2);
+ row_reference x_k;
+ row_reference x_ck;
+ row_reference x_i;
+ row_reference x_ci;
+
+ // Since the index `j' of the inner loop will go from 0 up to `i',
+ // the three nested loops have to be executed twice.
+ for (int twice = 0; twice < 2; ++twice) {
+
+ row_iterator x_k_iter = m_begin;
+ row_iterator x_i_iter = m_begin;
+ for (dimension_type k = 0; k < n_rows; k += 2) {
+ const dimension_type ck = k + 1;
+ // Re-initialize the element iterator.
+ iter_ij = x.matrix.element_begin();
+ // Compute the row references `x_k' and `x_ck'.
+ x_k = *x_k_iter;
+ ++x_k_iter;
+ x_ck = *x_k_iter;
+ ++x_k_iter;
+
+ for (dimension_type i = 0; i <= k; i += 2) {
+ const dimension_type ci = i + 1;
+ // Storing x_k_i == x_ci_ck.
+ vec_k[i] = x_k[i];
+ // Storing x_k_ci == x_i_ck.
+ vec_k[ci] = x_k[ci];
+ // Storing x_ck_i == x_ci_k.
+ vec_ck[i] = x_ck[i];
+ // Storing x_ck_ci == x_i_k.
+ vec_ck[ci] = x_ck[ci];
+ }
+ x_i_iter = x_k_iter;
+ for (dimension_type i = k + 2; i < n_rows; i += 2) {
+ const dimension_type ci = i + 1;
+ x_i = *x_i_iter;
+ ++x_i_iter;
+ x_ci = *x_i_iter;
+ ++x_i_iter;
+ // Storing x_k_i == x_ci_ck.
+ vec_k[i] = x_ci[ck];
+ // Storing x_k_ci == x_i_ck.
+ vec_k[ci] = x_i[ck];
+ // Storing x_ck_i == x_ci_k.
+ vec_ck[i] = x_ci[k];
+ // Storing x_ck_ci == x_i_k.
+ vec_ck[ci] = x_i[k];
+ }
+
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const N& vec_k_ci = vec_k[ci];
+ const N& vec_ck_ci = vec_ck[ci];
+ // Unfolding two iterations on `j': this ensures that
+ // the loop exit condition `j <= i' is OK.
+ for (dimension_type j = 0; j <= i; ) {
+ // First iteration: compute
+ //
+ // <CODE>
+ // sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+ // sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j;
+ // </CODE>
+ add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+ add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+ min_assign(sum1, sum2);
+ min_assign(*iter_ij, sum1);
+ // Exiting the first iteration: loop index control.
+ ++j;
+ ++iter_ij;
+ // Second iteration: ditto.
+ add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+ add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+ min_assign(sum1, sum2);
+ min_assign(*iter_ij, sum1);
+ // Exiting the second iteration: loop index control.
+ ++j;
+ ++iter_ij;
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the octagon is empty if and only if there is a
+ // negative value in the main diagonal.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ N& x_i_i = (*i)[i.index()];
+ if (sgn(x_i_i) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_i_i) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // Step 2: we enforce the strong coherence.
+ x.strong_coherence_assign();
+ // The octagon is not empty and it is now strongly closed.
+ x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+ // The strong-coherence is: for every indexes i and j
+ // m_i_j <= (m_i_ci + m_cj_j)/2
+ // where ci = i + 1, if i is even number or
+ // ci = i - 1, if i is odd.
+ // Ditto for cj.
+ PPL_DIRTY_TEMP(N, semi_sum);
+ for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+ i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+ typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+ const dimension_type i = i_iter.index();
+ using namespace Implementation::Octagonal_Shapes;
+ const N& x_i_ci = x_i[coherent_index(i)];
+ // Avoid to do unnecessary sums.
+ if (!is_plus_infinity(x_i_ci))
+ for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+ if (i != j) {
+ const N& x_cj_j = matrix[coherent_index(j)][j];
+ if (!is_plus_infinity(x_cj_j)) {
+ add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+ div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+ min_assign(x_i[j], semi_sum);
+ }
+ }
+ }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+ PPL_ASSERT(std::numeric_limits<N>::is_integer);
+ PPL_ASSERT(marked_strongly_closed());
+ const dimension_type space_dim = space_dimension();
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ const N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci)
+ // Check for oddness of `mat_i_ci'.
+ && !is_even(mat_i_ci)
+ // Check for zero-equivalence of `i' and `ci'.
+ && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+ return true;
+ }
+ return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::tight_closure_assign() {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "Octagonal_Shape<T>::tight_closure_assign():"
+ " T in not an integer datatype.");
+ // FIXME: this is just an executable specification.
+ // (The following call could be replaced by shortest-path closure.)
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+ if (tight_coherence_would_make_empty())
+ set_empty();
+ else {
+ // Tighten the unary constraints.
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ const dimension_type space_dim = space_dimension();
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci))
+ sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+ N& mat_ci_i = matrix[ci][i];
+ if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i))
+ sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+ }
+ // Propagate tightened unary constraints.
+ strong_coherence_assign();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+ // `var' should be one of the dimensions of the octagon.
+ if (var.id() >= space_dim)
+ throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+ var.id());
+
+ // Do something only if necessary.
+ if (marked_empty() || marked_strongly_closed())
+ return;
+
+ Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const row_iterator m_begin = x.matrix.row_begin();
+ const row_iterator m_end = x.matrix.row_end();
+
+ // Fill the main diagonal with zeros.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+ assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+ }
+
+ // Using the incremental Floyd-Warshall algorithm.
+ // Step 1: Improve all constraints on variable `var'.
+ const dimension_type v = 2*var.id();
+ const dimension_type cv = v + 1;
+ row_iterator v_iter = m_begin + v;
+ row_iterator cv_iter = v_iter + 1;
+ row_reference x_v = *v_iter;
+ row_reference x_cv = *cv_iter;
+ const dimension_type rs_v = v_iter.row_size();
+ const dimension_type n_rows = x.matrix.num_rows();
+ PPL_DIRTY_TEMP(N, sum);
+ using namespace Implementation::Octagonal_Shapes;
+ for (row_iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+ const dimension_type k = k_iter.index();
+ const dimension_type ck = coherent_index(k);
+ const dimension_type rs_k = k_iter.row_size();
+ row_reference x_k = *k_iter;
+ row_reference x_ck = (k % 2 != 0) ? *(k_iter-1) : *(k_iter + 1);
+
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference x_i = *i_iter;
+ row_reference x_ci = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+
+ const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+ if (!is_plus_infinity(x_i_k)) {
+ const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+ if (!is_plus_infinity(x_k_v)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+ min_assign(x_i_v, sum);
+ }
+ const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+ if (!is_plus_infinity(x_k_cv)) {
+ add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+ N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+ min_assign(x_i_cv, sum);
+ }
+ }
+ const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+ if (!is_plus_infinity(x_k_i)) {
+ const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+ if (!is_plus_infinity(x_v_k)) {
+ N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v_i, sum);
+ }
+ const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+ if (!is_plus_infinity(x_cv_k)) {
+ N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+ add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+ min_assign(x_cv_i, sum);
+ }
+ }
+
+ }
+ }
+
+ // Step 2: improve the other bounds by using the precise bounds
+ // for the constraints on `var'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = coherent_index(i);
+ const dimension_type rs_i = i_iter.row_size();
+ row_reference x_i = *i_iter;
+ const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+ // TODO: see if it is possible to optimize this inner loop
+ // by splitting it into several parts, so as to avoid
+ // conditional expressions.
+ for (dimension_type j = 0; j < n_rows; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_reference x_cj = *(m_begin + cj);
+ N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+ if (!is_plus_infinity(x_i_v)) {
+ const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+ if (!is_plus_infinity(x_v_j)) {
+ add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+ min_assign(x_i_j, sum);
+ }
+ }
+ const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+ if (!is_plus_infinity(x_i_cv)) {
+ const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+ if (!is_plus_infinity(x_cv_j)) {
+ add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+ min_assign(x_i_j, sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the octagon is empty if and only if there is a
+ // negative value on the main diagonal.
+ for (row_iterator i = m_begin; i != m_end; ++i) {
+ N& x_i_i = (*i)[i.index()];
+ if (sgn(x_i_i) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ // Restore PLUS_INFINITY on the main diagonal.
+ PPL_ASSERT(sgn(x_i_i) == 0);
+ assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // Step 3: we enforce the strong coherence.
+ x.strong_coherence_assign();
+ // The octagon is not empty and it is now strongly closed.
+ x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(successor.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `successor' is used to indicate which variable
+ // immediately follows a given one in the corresponding equivalence class.
+ const dimension_type successor_size = matrix.num_rows();
+ // Initially, each variable is successor of its own zero-equivalence class.
+ successor.reserve(successor_size);
+ for (dimension_type i = 0; i < successor_size; ++i)
+ successor.push_back(i);
+ // Now compute actual successors.
+ for (dimension_type i = successor_size; i-- > 0; ) {
+ typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ typename OR_Matrix<N>::const_row_reference_type m_ci
+ = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+ for (dimension_type j = 0; j < i; ++j) {
+ // FIXME: what is the following, commented-out for?
+ //for (dimension_type j = i; j-- > 0; ) {
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ if (is_additive_inverse(m_ci[cj], m_i[j]))
+ // Choose as successor the variable having the greatest index.
+ successor[j] = i;
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(leaders.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `leaders' is used to indicate the smallest variable
+ // that belongs to the corresponding equivalence class.
+ const dimension_type leader_size = matrix.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ leaders.reserve(leader_size);
+ for (dimension_type i = 0; i < leader_size; ++i)
+ leaders.push_back(i);
+ // Now compute actual leaders.
+ for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+ matrix_row_end = matrix.row_end();
+ i_iter != matrix_row_end; ++i_iter) {
+ typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+ dimension_type i = i_iter.index();
+ typename OR_Matrix<N>::const_row_reference_type m_ci
+ = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+ for (dimension_type j = 0; j < i; ++j) {
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ if (is_additive_inverse(m_ci[cj], m_i[j]))
+ // Choose as leader the variable having the smaller index.
+ leaders[i] = leaders[j];
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+ std::vector<dimension_type>& no_sing_leaders,
+ bool& exist_sing_class,
+ dimension_type& sing_leader) const {
+ PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(no_sing_leaders.size() == 0);
+ dimension_type successor_size = successor.size();
+ std::deque<bool> dealt_with(successor_size, false);
+ for (dimension_type i = 0; i < successor_size; ++i) {
+ dimension_type next_i = successor[i];
+ if (!dealt_with[i]) {
+ // The index is a leader.
+ // Now check if it is a leader of a singular class or not.
+ using namespace Implementation::Octagonal_Shapes;
+ if (next_i == coherent_index(i)) {
+ exist_sing_class = true;
+ sing_leader = i;
+ }
+ else
+ no_sing_leaders.push_back(i);
+ }
+ // The following index is not a leader.
+ dealt_with[next_i] = true;
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+ // Zero-dimensional octagonal shapes are necessarily reduced.
+ if (space_dim == 0)
+ return;
+ strong_closure_assign();
+ // If `*this' is empty, then there is nothing to reduce.
+ if (marked_empty())
+ return;
+
+ // Detect non-redundant constraints.
+ std::vector<Bit_Row> non_red;
+ non_redundant_matrix_entries(non_red);
+
+ // Throw away redundant constraints.
+ Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+#ifndef NDEBUG
+ const Octagonal_Shape x_copy_before(x);
+#endif
+ typename OR_Matrix<N>::element_iterator x_i = x.matrix.element_begin();
+ for (dimension_type i = 0; i < 2 * space_dim; ++i) {
+ const Bit_Row& non_red_i = non_red[i];
+ for (dimension_type j = 0,
+ j_end = OR_Matrix<N>::row_size(i); j < j_end; ++j, ++x_i) {
+ if (!non_red_i[j])
+ assign_r(*x_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ x.reset_strongly_closed();
+#ifndef NDEBUG
+ const Octagonal_Shape x_copy_after(x);
+ PPL_ASSERT(x_copy_before == x_copy_after);
+ PPL_ASSERT(x.is_strongly_reduced());
+ PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(space_dim > 0 && !marked_empty() && marked_strongly_closed());
+ PPL_ASSERT(non_redundant.empty());
+
+ // Initialize `non_redundant' as if it was an OR_Matrix of booleans
+ // (initially set to false).
+ non_redundant.resize(2*space_dim);
+
+ // Step 1: compute zero-equivalence classes.
+ // Variables corresponding to indices `i' and `j' are zero-equivalent
+ // if they lie on a zero-weight loop; since the matrix is strongly
+ // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+ std::vector<dimension_type> no_sing_leaders;
+ dimension_type sing_leader = 0;
+ bool exist_sing_class = false;
+ std::vector<dimension_type> successor;
+ compute_successors(successor);
+ compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+ const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+
+ // Step 2: flag redundant constraints in `redundancy'.
+ // Go through non-singular leaders first.
+ for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+ const dimension_type i = no_sing_leaders[li];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ typename OR_Matrix<N>::const_row_reference_type
+ m_i = *(matrix.row_begin() + i);
+ if (i % 2 == 0) {
+ // Each positive equivalence class must have a single 0-cycle
+ // connecting all equivalent variables in increasing order.
+ // Note: by coherence assumption, the variables in the
+ // corresponding negative equivalence class are
+ // automatically connected.
+ if (i != successor[i]) {
+ dimension_type j = i;
+ dimension_type next_j = successor[j];
+ while (j != next_j) {
+ non_redundant[next_j].set(j);
+ j = next_j;
+ next_j = successor[j];
+ }
+ const dimension_type cj = coherent_index(j);
+ non_redundant[cj].set(ci);
+ }
+ }
+
+ dimension_type rs_li = (li % 2 != 0) ? li : (li + 1);
+ // Check if the constraint is redundant.
+ PPL_DIRTY_TEMP(N, tmp);
+ for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+ const dimension_type j = no_sing_leaders[lj];
+ const dimension_type cj = coherent_index(j);
+ const N& m_i_j = m_i[j];
+ const N& m_i_ci = m_i[ci];
+ bool to_add = true;
+ // Control if the constraint is redundant by strong-coherence,
+ // that is:
+ // m_i_j >= (m_i_ci + m_cj_j)/2, where j != ci.
+ if (j != ci) {
+ add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+ div_2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+ if (m_i_j >= tmp)
+ // The constraint is redundant.
+ continue;
+ }
+ // Control if the constraint is redundant by strong closure, that is
+ // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+ // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k + 1)}.
+ // Since the octagon is already strongly closed, the above relation
+ // is reduced to three case, in accordance with k, i, j inter-depend:
+ // exit k such that
+ // 1.) m_i_j >= m_i_k + m_cj_ck, if k < j < i; or
+ // 2.) m_i_j >= m_i_k + m_k,_j, if j < k < i; or
+ // 3.) m_i_j >= m_ck_ci + m_k_j, if j < i < k.
+ // Note: `i > j'.
+ for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+ const dimension_type k = no_sing_leaders[lk];
+ if (k != i && k != j) {
+ dimension_type ck = coherent_index(k);
+ if (k < j)
+ // Case 1.
+ add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+ else if (k < i)
+ // Case 2.
+ add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+ else
+ // Case 3.
+ add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+ // Checks if the constraint is redundant.
+ if (m_i_j >= tmp) {
+ to_add = false;
+ break;
+ }
+ }
+ }
+
+ if (to_add)
+ // The constraint is not redundant.
+ non_redundant[i].set(j);
+ }
+ }
+
+ // If there exist a singular equivalence class, then it must have a
+ // single 0-cycle connecting all the positive and negative equivalent
+ // variables.
+ // Note: the singular class is not connected with the other classes.
+ if (exist_sing_class) {
+ non_redundant[sing_leader].set(sing_leader + 1);
+ if (successor[sing_leader + 1] != sing_leader + 1) {
+ dimension_type j = sing_leader;
+ dimension_type next_j = successor[j + 1];
+ while (next_j != j + 1) {
+ non_redundant[next_j].set(j);
+ j = next_j;
+ next_j = successor[j + 1];
+ }
+ non_redundant[j + 1].set(j);
+ }
+ else
+ non_redundant[sing_leader + 1].set(sing_leader);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The hull of an octagon `x' with an empty octagon is `x'.
+ y.strong_closure_assign();
+ if (y.marked_empty())
+ return;
+ strong_closure_assign();
+ if (marked_empty()) {
+ *this = y;
+ return;
+ }
+
+ // The oct-hull is obtained by computing maxima.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end; ++i, ++j)
+ max_assign(*i, *j);
+
+ // The result is still closed.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ Octagonal_Shape& x = *this;
+
+ // Being lazy here is only harmful.
+ // We close.
+ x.strong_closure_assign();
+ // The difference of an empty octagon and of an octagon `p' is empty.
+ if (x.marked_empty())
+ return;
+ // The difference of a octagon `p' and an empty octagon is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both octagons are zero-dimensional,
+ // then at this point they are necessarily universe octagons,
+ // so that their difference is empty.
+ if (x.space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ // TODO: This is just an executable specification.
+ // Have to find a more efficient method.
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ Octagonal_Shape new_oct(space_dim, EMPTY);
+ // We take a constraint of the octagon y at the time and we
+ // consider its complementary. Then we intersect the union
+ // of these complementary constraints with the octagon x.
+ const Constraint_System& y_cs = y.constraints();
+ for (Constraint_System::const_iterator i = y_cs.begin(),
+ y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+ const Constraint& c = *i;
+ // If the octagon `x' is included the octagon defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty octagon, and as we would obtain
+ // a result that is less precise than the difference.
+ if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ Octagonal_Shape z = x;
+ const Linear_Expression e(c.expression());
+ z.add_constraint(e <= 0);
+ if (!z.is_empty())
+ new_oct.upper_bound_assign(z);
+ if (c.is_equality()) {
+ z = x;
+ z.add_constraint(e >= 0);
+ if (!z.is_empty())
+ new_oct.upper_bound_assign(z);
+ }
+ }
+ *this = new_oct;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::simplify_using_context_assign(const Octagonal_Shape& y) {
+ Octagonal_Shape& x = *this;
+ const dimension_type dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (dim != y.space_dimension())
+ throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (dim == 0) {
+ if (y.marked_empty()) {
+ x.set_zero_dim_univ();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case where `x' contains `y'
+ // (this subsumes the case when `y' is empty).
+ if (x.contains(y)) {
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ x.m_swap(res);
+ return false;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator Row_Iter;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_CIter;
+ typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+ typedef typename OR_Matrix<N>::const_element_iterator Elem_CIter;
+
+ // Filter away the case where `x' is empty.
+ x.strong_closure_assign();
+ if (x.marked_empty()) {
+ // Search for a constraint of `y' that is not a tautology.
+ dimension_type i;
+ dimension_type j;
+ // Prefer unary constraints.
+ for (i = 0; i < 2*dim; i += 2) {
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i, i + 1))) {
+ j = i + 1;
+ goto found;
+ }
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i + 1, i))) {
+ j = i;
+ ++i;
+ goto found;
+ }
+ }
+ // Then search binary constraints.
+ // TODO: use better iteration scheme.
+ for (i = 2; i < 2*dim; ++i)
+ for (j = 0; j < i; ++j) {
+ // Use something like !is_maximal()?
+ if (!is_plus_infinity(y.matrix_at(i, j)))
+ goto found;
+ }
+
+ // Not found: we were not able to build a constraint contradicting
+ // one of the constraints in `y': `x' cannot be enlarged.
+ return false;
+
+ found:
+ // Found: build a new OS contradicting the constraint found.
+ PPL_ASSERT(i < dim && j < dim && i != j);
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ // FIXME: compute a proper contradicting constraint.
+ PPL_DIRTY_TEMP(N, tmp);
+ assign_r(tmp, 1, ROUND_UP);
+ add_assign_r(tmp, tmp, y.matrix_at(i, j), ROUND_UP);
+ // CHECKME: round down is really meant.
+ neg_assign_r(res.matrix_at(j, i), tmp, ROUND_DOWN);
+ PPL_ASSERT(!is_plus_infinity(res.matrix_at(j, i)));
+ x.m_swap(res);
+ return false;
+ }
+
+ // Here `x' and `y' are not empty and strongly closed;
+ // also, `x' does not contain `y'.
+ // Let `target' be the intersection of `x' and `y'.
+ Octagonal_Shape<T> target = x;
+ target.intersection_assign(y);
+ const bool bool_result = !target.is_empty();
+
+ // Compute redundancy information for x and ...
+ // TODO: provide a nicer data structure for redundancy.
+ std::vector<Bit_Row> x_non_redundant;
+ x.non_redundant_matrix_entries(x_non_redundant);
+ // ... count the non-redundant constraints.
+ dimension_type x_num_non_redundant = 0;
+ for (size_t i = x_non_redundant.size(); i-- > 0 ; )
+ x_num_non_redundant += x_non_redundant[i].count_ones();
+ PPL_ASSERT(x_num_non_redundant > 0);
+
+ // Let `yy' be a copy of `y': we will keep adding to `yy'
+ // the non-redundant constraints of `x',
+ // stopping as soon as `yy' becomes equal to `target'.
+ Octagonal_Shape<T> yy = y;
+
+ // The constraints added to `yy' will be recorded in `res' ...
+ Octagonal_Shape<T> res(dim, UNIVERSE);
+ // ... and we will count them too.
+ dimension_type res_num_non_redundant = 0;
+
+ // Compute leader information for `x'.
+ std::vector<dimension_type> x_leaders;
+ x.compute_leaders(x_leaders);
+
+ // First go through the unary equality constraints.
+ // Find the leader of the singular equivalence class (it is even!).
+ dimension_type sing_leader;
+ for (sing_leader = 0; sing_leader < 2*dim; sing_leader += 2) {
+ if (sing_leader == x_leaders[sing_leader]) {
+ const N& x_s_ss = x.matrix_at(sing_leader, sing_leader + 1);
+ const N& x_ss_s = x.matrix_at(sing_leader + 1, sing_leader);
+ if (is_additive_inverse(x_s_ss, x_ss_s))
+ // Singular leader found.
+ break;
+ }
+ }
+
+ // Unary equalities have `sing_leader' as a leader.
+ for (dimension_type i = sing_leader; i < 2*dim; i += 2) {
+ if (x_leaders[i] != sing_leader)
+ continue;
+ // Found a unary equality constraint:
+ // see if any of the two inequalities have to be added.
+ const N& x_i_ii = x.matrix_at(i, i + 1);
+ N& yy_i_ii = yy.matrix_at(i, i + 1);
+ if (x_i_ii < yy_i_ii) {
+ // The \leq inequality is not implied by context.
+ res.matrix_at(i, i + 1) = x_i_ii;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_ii = x_i_ii;
+ yy.reset_strongly_closed();
+ }
+ const N& x_ii_i = x.matrix_at(i + 1, i);
+ N& yy_ii_i = yy.matrix_at(i + 1, i);
+ if (x_ii_i < yy_ii_i) {
+ // The \geq inequality is not implied by context.
+ res.matrix_at(i + 1, i) = x_ii_i;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_ii_i = x_ii_i;
+ yy.reset_strongly_closed();
+ }
+ // Restore strong closure, if it was lost.
+ if (!yy.marked_strongly_closed()) {
+ Variable var_i(i/2);
+ yy.incremental_strong_closure_assign(var_i);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Go through the binary equality constraints.
+ for (dimension_type i = 0; i < 2*dim; ++i) {
+ const dimension_type j = x_leaders[i];
+ if (j == i || j == sing_leader)
+ continue;
+ const N& x_i_j = x.matrix_at(i, j);
+ PPL_ASSERT(!is_plus_infinity(x_i_j));
+ N& yy_i_j = yy.matrix_at(i, j);
+ if (x_i_j < yy_i_j) {
+ res.matrix_at(i, j) = x_i_j;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_j = x_i_j;
+ yy.reset_strongly_closed();
+ }
+ const N& x_j_i = x.matrix_at(j, i);
+ N& yy_j_i = yy.matrix_at(j, i);
+ PPL_ASSERT(!is_plus_infinity(x_j_i));
+ if (x_j_i < yy_j_i) {
+ res.matrix_at(j, i) = x_j_i;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_j_i = x_j_i;
+ yy.reset_strongly_closed();
+ }
+ // Restore strong closure, if it was lost.
+ if (!yy.marked_strongly_closed()) {
+ Variable var_j(j/2);
+ yy.incremental_strong_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Finally go through the (proper) inequality constraints:
+ // both indices i and j should be leaders.
+ // FIXME: improve iteration scheme (are we doing twice the work?)
+ for (dimension_type i = 0; i < 2*dim; ++i) {
+ if (i != x_leaders[i])
+ continue;
+ const Bit_Row& x_non_redundant_i = x_non_redundant[i];
+ for (dimension_type j = 0; j < 2*dim; ++j) {
+ if (j != x_leaders[j])
+ continue;
+ if (i >= j) {
+ if (!x_non_redundant_i[j])
+ continue;
+ }
+ else if (!x_non_redundant[j][i])
+ continue;
+ N& yy_i_j = yy.matrix_at(i, j);
+ const N& x_i_j = x.matrix_at(i, j);
+ if (x_i_j < yy_i_j) {
+ res.matrix_at(i, j) = x_i_j;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_i_j = x_i_j;
+ yy.reset_strongly_closed();
+ Variable var(i/2);
+ yy.incremental_strong_closure_assign(var);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_strongly_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+ }
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type new_dim = space_dim + m;
+ const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
+
+ // To embed an n-dimension space octagon in a (n + m)-dimension space,
+ // we just add `m' variables in the matrix of constraints.
+ matrix.grow(new_dim);
+ space_dim = new_dim;
+ // If `*this' was the zero-dim space universe octagon,
+ // then we can set the strongly closure flag.
+ if (was_zero_dim_univ)
+ set_strongly_closed();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type n = matrix.num_rows();
+
+ // To project an n-dimension space OS in a (space_dim + m)-dimension space,
+ // we just add `m' columns and rows in the matrix of constraints.
+ add_space_dimensions_and_embed(m);
+ // We insert 0 where it needs.
+ // Attention: now num_rows of matrix is update!
+ for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; i += 2) {
+ typename OR_Matrix<N>::row_reference_type x_i = *i;
+ typename OR_Matrix<N>::row_reference_type x_ci = *(i + 1);
+ const dimension_type ind = i.index();
+ assign_r(x_i[ind + 1], 0, ROUND_NOT_NEEDED);
+ assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+ }
+
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any octagon is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a octagon in a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ const dimension_type new_space_dim = space_dim - vars.size();
+
+ strong_closure_assign();
+ // When removing _all_ dimensions from an octagon,
+ // we obtain the zero-dimensional octagon.
+ if (new_space_dim == 0) {
+ matrix.shrink(0);
+ if (!marked_empty())
+ // We set the zero_dim_univ flag.
+ set_zero_dim_univ();
+ space_dim = 0;
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // We consider each variable and we check if it has to be removed.
+ // If it has to be removed, we pass to the next one, then we will
+ // overwrite its representation in the matrix.
+ typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+ typedef typename std::iterator_traits<Elem_Iter>::difference_type diff_t;
+
+ dimension_type first = *vars.begin();
+ const dimension_type first_size = 2 * first * (first + 1);
+ Elem_Iter iter = matrix.element_begin() + static_cast<diff_t>(first_size);
+
+ for (dimension_type i = first + 1; i < space_dim; ++i) {
+ if (vars.count(i) == 0) {
+ typename OR_Matrix<N>::row_iterator row_iter = matrix.row_begin() + 2*i;
+ typename OR_Matrix<N>::row_reference_type row_ref = *row_iter;
+ typename OR_Matrix<N>::row_reference_type row_ref1 = *(++row_iter);
+ // Beware: first we shift the cells corresponding to the first
+ // row of variable(j), then we shift the cells corresponding to the
+ // second row. We recall that every variable is represented
+ // in the `matrix' by two rows and two columns.
+ for (dimension_type j = 0; j <= i; ++j)
+ if (vars.count(j) == 0) {
+ assign_or_swap(*(iter++), row_ref[2*j]);
+ assign_or_swap(*(iter++), row_ref[2*j + 1]);
+ }
+ for (dimension_type j = 0; j <= i; ++j)
+ if (vars.count(j) == 0) {
+ assign_or_swap(*(iter++), row_ref1[2*j]);
+ assign_or_swap(*(iter++), row_ref1[2*j + 1]);
+ }
+ }
+ }
+ // Update the space dimension.
+ matrix.shrink(new_space_dim);
+ space_dim = new_space_dim;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the octagon becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If we are going to actually reduce the space dimension,
+ // then shortest-path closure is required to keep precision.
+ if (new_space_dim < space_dim)
+ strong_closure_assign();
+
+ // If the octagon is empty, then it is sufficient to adjust
+ // the space dimension of the octagon.
+ if (marked_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // We create a new matrix with the new space dimension.
+ OR_Matrix<N> x(new_space_dim);
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ row_iterator m_begin = x.row_begin();
+
+ for (row_iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+ i_iter != i_end; i_iter += 2) {
+ dimension_type new_i;
+ dimension_type i = i_iter.index()/2;
+ // We copy and place in the position into `x' the only cells of
+ // the `matrix' that refer to both mapped variables,
+ // the variable `i' and `j'.
+ if (pfunc.maps(i, new_i)) {
+ row_reference r_i = *i_iter;
+ row_reference r_ii = *(i_iter + 1);
+ dimension_type double_new_i = 2*new_i;
+ row_iterator x_iter = m_begin + double_new_i;
+ row_reference x_i = *x_iter;
+ row_reference x_ii = *(x_iter + 1);
+ for (dimension_type j = 0; j <= i; ++j) {
+ dimension_type new_j;
+ // If also the second variable is mapped, we work.
+ if (pfunc.maps(j, new_j)) {
+ dimension_type dj = 2*j;
+ dimension_type double_new_j = 2*new_j;
+ // Mapped the constraints, exchanging the indexes.
+ // Attention: our matrix is pseudo-triangular.
+ // If new_j > new_i, we must consider, as rows, the rows of
+ // the variable new_j, and not of new_i ones.
+ if (new_i >= new_j) {
+ assign_or_swap(x_i[double_new_j], r_i[dj]);
+ assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+ assign_or_swap(x_ii[double_new_j + 1], r_ii[dj + 1]);
+ assign_or_swap(x_i[double_new_j + 1], r_i[dj + 1]);
+ }
+ else {
+ row_iterator x_j_iter = m_begin + double_new_j;
+ row_reference x_j = *x_j_iter;
+ row_reference x_jj = *(x_j_iter + 1);
+ assign_or_swap(x_jj[double_new_i + 1], r_i[dj]);
+ assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+ assign_or_swap(x_j[double_new_i + 1], r_i[dj + 1]);
+ assign_or_swap(x_j[double_new_i], r_ii[dj + 1]);
+ }
+
+ }
+ }
+ }
+ }
+
+ using std::swap;
+ swap(matrix, x);
+ space_dim = new_space_dim;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two octagons is empty, the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+ // If both octagons are zero-dimensional,then at this point
+ // they are necessarily non-empty,
+ // so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // To intersect two octagons we compare the constraints
+ // and we choose the less values.
+ bool changed = false;
+
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ N& elem = *i;
+ const N& y_elem = *j;
+ if (y_elem < elem) {
+ elem = y_elem;
+ changed = true;
+ }
+ }
+
+ // This method not preserve the closure.
+ if (changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If both octagons are zero-dimensional,
+ // since `*this' contains `y', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ strong_closure_assign();
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ y.strong_closure_assign();
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Octagonal_Shape x_tmp(*this);
+ x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Compare each constraint in `y' to the corresponding one in `*this'.
+ // The constraint in `*this' is kept as is if it is stronger than or
+ // equal to the constraint in `y'; otherwise, the inhomogeneous term
+ // of the constraint in `*this' is further compared with elements taken
+ // from a sorted container (the stop-points, provided by the user), and
+ // is replaced by the first entry, if any, which is greater than or equal
+ // to the inhomogeneous term. If no such entry exists, the constraint
+ // is removed altogether.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ const N& y_elem = *j;
+ N& elem = *i;
+ if (y_elem < elem) {
+ Iterator k = std::lower_bound(first, last, elem);
+ if (k != last) {
+ if (elem < *k)
+ assign_r(elem, *k, ROUND_UP);
+ }
+ else
+ assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+ Octagonal_Shape& limiting_octagon) const {
+ const dimension_type cs_space_dim = cs.space_dimension();
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs_space_dim <= space_dim);
+
+ strong_closure_assign();
+ bool is_oct_changed = false;
+
+ // Allocate temporaries outside of the loop.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(term);
+ PPL_DIRTY_TEMP(N, d);
+
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ // Constraints that are not octagonal differences are ignored.
+ if (!Octagonal_Shape_Helper
+ ::extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+ coeff, term))
+ continue;
+
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ Row_iterator m_begin = matrix.row_begin();
+ // Select the cell to be modified for the "<=" part of the constraint.
+ Row_iterator i_iter = m_begin + i;
+ Row_reference m_i = *i_iter;
+ OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+ row_iterator lo_iter = lo_mat.row_begin() + i;
+ row_reference lo_m_i = *lo_iter;
+ N& lo_m_i_j = lo_m_i[j];
+ if (coeff < 0)
+ neg_assign(coeff);
+ // Compute the bound for `m_i_j', rounding towards plus infinity.
+ div_round_up(d, term, coeff);
+ if (m_i[j] <= d)
+ if (c.is_inequality()) {
+ if (lo_m_i_j > d) {
+ lo_m_i_j = d;
+ is_oct_changed = true;
+ }
+ else {
+ // Select the right row of the cell.
+ if (i % 2 == 0) {
+ ++i_iter;
+ ++lo_iter;
+ }
+ else {
+ --i_iter;
+ --lo_iter;
+ }
+ Row_reference m_ci = *i_iter;
+ row_reference lo_m_ci = *lo_iter;
+ // Select the right column of the cell.
+ using namespace Implementation::Octagonal_Shapes;
+ dimension_type cj = coherent_index(j);
+ N& lo_m_ci_cj = lo_m_ci[cj];
+ neg_assign(term);
+ div_round_up(d, term, coeff);
+ if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+ lo_m_ci_cj = d;
+ is_oct_changed = true;
+ }
+ }
+ }
+ }
+ // In general, adding a constraint does not preserve the strongly
+ // closure of the octagon.
+ if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+ limiting_octagon.reset_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two octagons.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // The limited CC76-extrapolation between two octagons in a
+ // zero-dimensional space is a octagon in a zero-dimensional
+ // space, too.
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+ get_limiting_octagon(cs, limiting_octagon);
+ CC76_extrapolation_assign(y, tp);
+ intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // Compute the affine dimension of `y'.
+ const dimension_type y_affine_dim = y.affine_dimension();
+ // If the affine dimension of `y' is zero, then either `y' is
+ // zero-dimensional, or it is empty, or it is a singleton.
+ // In all cases, due to the inclusion hypothesis, the result is `*this'.
+ if (y_affine_dim == 0)
+ return;
+
+ // If the affine dimension has changed, due to the inclusion hypothesis,
+ // the result is `*this'.
+ const dimension_type x_affine_dim = affine_dimension();
+ PPL_ASSERT(x_affine_dim >= y_affine_dim);
+ if (x_affine_dim != y_affine_dim)
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Octagonal_Shape x_tmp(*this);
+ x_tmp.BHMZ05_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Here no token is available.
+ PPL_ASSERT(marked_strongly_closed() && y.marked_strongly_closed());
+ // Minimize `y'.
+ y.strong_reduction_assign();
+
+ // Extrapolate unstable bounds.
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ N& elem = *i;
+ // Note: in the following line the use of `!=' (as opposed to
+ // the use of `<' that would seem -but is not- equivalent) is
+ // intentional.
+ if (*j != elem)
+ assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two octagons.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+ // The limited BHMZ05-extrapolation between two octagons in a
+ // zero-dimensional space is a octagon in a zero-dimensional
+ // space, too.
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+ get_limiting_octagon(cs, limiting_octagon);
+ BHMZ05_widening_assign(y, tp);
+ intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dim)
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // Assume `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both octagons are zero-dimensional, since `*this' contains `y',
+ // we simply return '*this'.
+ if (space_dim == 0)
+ return;
+
+ y.strong_closure_assign();
+ // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+ if (y.marked_empty())
+ return;
+ strong_closure_assign();
+ // If `*this' is empty, we return.
+ if (marked_empty())
+ return;
+
+ // We consider a constraint of `*this', if its value is `plus_infinity',
+ // we take the value of the corresponding constraint of `y'.
+ bool is_oct_changed = false;
+ typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ matrix_element_end = matrix.element_end();
+ i != matrix_element_end;
+ ++i, ++j) {
+ if (!is_plus_infinity(*i)
+ && !is_plus_infinity(*j)
+ && *i != *j) {
+ *i = *j;
+ is_oct_changed = true;
+ }
+ }
+
+ if (is_oct_changed && marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+ const dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(ub_v));
+
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+ // No need to consider indices greater than `last_id'.
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v + 1];
+
+ // Speculatively allocate temporaries out of the loop.
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_q);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+ const dimension_type u_id = u.variable().id();
+ // Skip the case when `u_id == v_id'.
+ if (u_id == v_id)
+ continue;
+ const Coefficient& expr_u = *u;
+
+ const dimension_type n_u = u_id*2;
+ // If `expr_u' is positive, we can improve `v - u'.
+ if (expr_u > 0) {
+ if (expr_u >= sc_denom) {
+ // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+ // We avoid to check if `ub_u' is plus infinity, because
+ // it is used for the computation of `ub_v'.
+ // Let half = m_cu_u / 2.
+ div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+ N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u + 1];
+ sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+ }
+ else {
+ // Here 0 < q < 1.
+ typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+ const N& m_u_cu = m_u[n_u + 1];
+ if (!is_plus_infinity(m_u_cu)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `v - u' is
+ // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+ // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+ assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+ N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u + 1];
+ add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(expr_u < 0);
+ // If `expr_u' is negative, we can improve `v + u'.
+ neg_assign(minus_expr_u, expr_u);
+ if (minus_expr_u >= sc_denom) {
+ // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+ // We avoid to check if `lb_u' is plus infinity, because
+ // it is used for the computation of `ub_v'.
+ // Let half = m_u_cu / 2.
+ div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+ N& m_v_plus_u = (n_v < n_u) ? matrix[n_u + 1][n_v] : m_cv[n_u];
+ sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+ }
+ else {
+ // Here -1 < q < 0.
+ typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+ const N& m_cu_u = m_cu[n_u];
+ if (!is_plus_infinity(m_cu_u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `v + u' is
+ // computed as `ub_v + ((-q) * lb_u + (1 + q) * ub_u)',
+ // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+ assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(minus_q, minus_q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+ neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+ // Compute `lb_u - ub_u'.
+ sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+ add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `v + u <= ub_v + ((-q) * lb_u + (1 + q) * ub_u)'.
+ N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+ add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+ const dimension_type last_id,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+ // No need to consider indices greater than `last_id'.
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+ // Speculatively allocate temporaries out of the loop.
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+ const dimension_type u_id = u.variable().id();
+ // Skip the case when `u_id == v_id'.
+ if (u_id == v_id)
+ continue;
+ const Coefficient& expr_u = *u;
+
+ const dimension_type n_u = u_id*2;
+ // If `expr_u' is positive, we can improve `-v + u'.
+ if (expr_u > 0) {
+ if (expr_u >= sc_denom) {
+ // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ // We avoid to check if `lb_u' is plus infinity, because
+ // it is used for the computation of `lb_v'.
+ // Let half = m_u_cu / 2.
+ div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+ N& m_u_minus_v = (n_v < n_u) ? matrix[n_u + 1][n_v + 1] : m_v[n_u];
+ sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+ }
+ else {
+ // Here 0 < q < 1.
+ typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+ const N& m_cu_u = m_cu[n_u];
+ if (!is_plus_infinity(m_cu_u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `u - v' is
+ // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+ // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+ assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+ N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v + 1] : m_v[n_u];
+ add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(expr_u < 0);
+ // If `expr_u' is negative, we can improve `-v - u'.
+ neg_assign(minus_expr_u, expr_u);
+ if (minus_expr_u >= sc_denom) {
+ // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+ // We avoid to check if `ub_u' is plus infinity, because
+ // it is used for the computation of `lb_v'.
+ // Let half = m_cu_u / 2.
+ div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+ N& m_minus_v_minus_u = (n_v < n_u)
+ ? matrix[n_u][n_v + 1]
+ : m_v[n_u + 1];
+ sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+ }
+ else {
+ // Here -1 < q < 0.
+ typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+ const N& m_u_cu = m_u[n_u + 1];
+ if (!is_plus_infinity(m_u_cu)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. The upper bound for `-v - u' is
+ // computed as `-lb_v - ((-q)*ub_u + (1 + q)*lb_u)',
+ // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+ assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, m_u[n_u + 1], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `-lb_u + q*(ub_u - lb_u)'.
+ add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1 + q) * lb_u)'.
+ N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v + 1] : m_v[n_u + 1];
+ add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+ PPL_ASSERT(v_id < space_dim);
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+ for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+ assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::row_reference_type r = *m_iter;
+ assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+ PPL_ASSERT(v_id < space_dim);
+ const dimension_type n_v = 2*v_id;
+ typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+ typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+ typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+ for (dimension_type k = n_v; k-- > 0; ) {
+ assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ ++m_iter;
+ for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+ m_iter != m_end; ++m_iter) {
+ typename OR_Matrix<N>::row_reference_type r = *m_iter;
+ assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ const dimension_type var_id = var.id();
+ if (space_dimension() < var_id + 1)
+ throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+ // Enforce strong closure for precision.
+ strong_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ forget_all_octagonal_constraints(var_id);
+ // Strong closure is preserved.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case captures the only legal cylindrification in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Enforce strong closure for precision.
+ strong_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+ forget_all_octagonal_constraints(*vsi);
+ // Strong closure is preserved.
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(denominator != 0);
+ PPL_ASSERT(space_dim >= expr.space_dimension());
+ const dimension_type var_id = var.id();
+ PPL_ASSERT(var_id <= space_dim);
+ PPL_ASSERT(expr.coefficient(var) == 0);
+ PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+
+ // Variable index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*j + b, where `j != v';
+ // - If t == 2, then `expr' is of the general form.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const dimension_type n_var = 2*var_id;
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ // Since we are only able to record octagonal differences, we can
+ // precisely deal with the case of a single variable only if its
+ // coefficient (taking into account the denominator) is 1.
+ // If this is not the case, we fall back to the general case
+ // so as to over-approximate the constraint.
+ if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+ && expr.coefficient(Variable(w_id)) != minus_denom)
+ t = 2;
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ switch (relsym) {
+ case EQUAL:
+ // Add the constraint `var == b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ const dimension_type n_w = 2*w_id;
+ switch (relsym) {
+ case EQUAL:
+ if (w_coeff == denominator)
+ // Add the new constraint `var - w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ else
+ // Add the new constraint `var + w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ break;
+ case LESS_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ // Note that: `w_id != v', so that `expr' is of the form
+ // w_coeff * w + b, with `w_id != v'.
+ if (w_coeff == denominator) {
+ // Add the new constraints `v - w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var, d);
+ else
+ add_octagonal_constraint(n_var + 1, n_w + 1, d);
+ }
+ else if (w_coeff == minus_denom) {
+ // Add the new constraints `v + w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var, d);
+ else
+ add_octagonal_constraint(n_var + 1, n_w, d);
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, minus_denom);
+ // Note that: `w_id != v', so that `expr' is of the form
+ // w_coeff * w + b, with `w_id != v'.
+ if (w_coeff == denominator) {
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `-v + w <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, d);
+ else
+ add_octagonal_constraint(n_var, n_w, d);
+ }
+ else if (w_coeff == minus_denom) {
+ // Add the new constraints `v + w >= b/denominator',
+ // i.e., `-v - w <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, d);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, d);
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Here t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Index of variable that is unbounded in `this'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& double_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_approx_i)) {
+ // Let half = double_approx_i / 2.
+ div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pinf_count;
+ pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_approx_minus_i)) {
+ // Let half = double_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& double_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_approx_minus_i)) {
+ // Let half = double_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pinf_count;
+ pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_approx_i)) {
+ // Let half = double_approx_i / 2.
+ div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards `minus_sc_denom'
+ // and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else
+ // Here `pinf_count == 1'.
+ if (pinf_index != var_id) {
+ const Coefficient& ppi
+ = sc_expr.coefficient(Variable(pinf_index));
+ if (ppi == sc_denom)
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index + 1] = sum;
+ else
+ if (ppi == minus_sc_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index + 1][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index] = sum;
+ }
+ }
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards `minus_sc_denom'
+ // and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom,
+ neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi
+ = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+ break;
+ }
+
+ case LESS_OR_EQUAL:
+ {
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w_id' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ row_reference m_i = *m_iter;
+ ++m_iter;
+ row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc-denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ add_octagonal_constraint(n_var + 1, n_var, double_sum);
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1) {
+ dimension_type pinf_ind = 2*pinf_index;
+ if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ add_octagonal_constraint(pinf_ind, n_var, sum);
+ else
+ add_octagonal_constraint(n_var + 1, pinf_ind + 1, sum);
+ }
+ else {
+ if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+ else
+ add_octagonal_constraint(n_var + 1, pinf_ind, sum);
+ }
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `-sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ for (row_iterator m_iter = m_begin,
+ m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ row_reference m_i = *m_iter;
+ ++m_iter;
+ row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved by rounding upwards `minus_sc_denom' and
+ // negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ add_octagonal_constraint(n_var, n_var + 1, double_sum);
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom,
+ sum);
+ }
+ else if (pinf_count == 1) {
+ dimension_type pinf_ind = 2*pinf_index;
+ if (expr.coefficient(Variable(pinf_index)) == denominator) {
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ add_octagonal_constraint(n_var, pinf_ind, sum);
+ else
+ add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+ }
+ else {
+ if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+ // Add the constraint `v + pinf_index >= -sum',
+ // i.e., `-pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ add_octagonal_constraint(n_var, pinf_ind + 1, sum);
+ else
+ add_octagonal_constraint(pinf_ind, n_var + 1, sum);
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_image(v, e, d)", var_id + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ using std::swap;
+
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Add the constraint `var == b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ const bool sign_symmetry = (w_coeff != denominator);
+ if (!sign_symmetry && b == 0)
+ // The transformation is the identity function.
+ return;
+ // Translate all the constraints on `var' adding or
+ // subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ PPL_DIRTY_TEMP(N, minus_d);
+ div_round_up(minus_d, b, minus_denom);
+ if (sign_symmetry)
+ swap(d, minus_d);
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ ++m_iter;
+ // NOTE: delay update of unary constraints on `var'.
+ for (dimension_type j = n_var; j-- > 0; ) {
+ N& m_v_j = m_v[j];
+ add_assign_r(m_v_j, m_v_j, minus_d, ROUND_UP);
+ N& m_cv_j = m_cv[j];
+ add_assign_r(m_cv_j, m_cv_j, d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_v_j, m_cv_j);
+ }
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+ N& m_i_cv = m_i[n_var + 1];
+ add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_i_v, m_i_cv);
+ }
+ // Now update unary constraints on var.
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ N& m_cv_v = m_cv[n_var];
+ add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+ mul_2exp_assign_r(minus_d, minus_d, 1, ROUND_UP);
+ N& m_v_cv = m_v[n_var + 1];
+ add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+ if (sign_symmetry)
+ swap(m_cv_v, m_v_cv);
+ // Note: strong closure is preserved.
+ }
+ else {
+ // Here `w != var', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ // Add the new constraint `var - w = b/denominator'.
+ if (w_coeff == denominator) {
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ }
+ else {
+ // Add the new constraint `var + w = b/denominator'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ }
+ incremental_strong_closure_assign(var);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ const row_iterator m_begin = matrix.row_begin();
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = id;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ PPL_DIRTY_TEMP(N, double_pos_sum);
+ mul_2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_pos_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != var_id) {
+ const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+ if (ppi == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ if (var_id < pos_pinf_index)
+ matrix[2*pos_pinf_index][n_var] = pos_sum;
+ else
+ matrix[n_var + 1][2*pos_pinf_index + 1] = pos_sum;
+ else
+ if (ppi == minus_sc_denom) {
+ // Add the constraint `v + pos_pinf_index <= pos_sum'.
+ if (var_id < pos_pinf_index)
+ matrix[2*pos_pinf_index + 1][n_var] = pos_sum;
+ else
+ matrix[n_var + 1][2*pos_pinf_index] = pos_sum;
+ }
+ }
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+
+ incremental_strong_closure_assign(var);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::affine_form_image(const Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf) {
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::affine_form_image(Variable, Linear_Form):"
+ " T is not a floating point type.");
+
+ // Dimension-compatibility checks.
+ // The dimension of `lf' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(v, l)", "l", lf);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_form_image(v, l)", var.id() + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lf': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `lf', if any.
+ dimension_type w_id = 0;
+
+ // Get information about the number of non-zero coefficients in `lf'.
+ for (dimension_type i = lf_space_dim; i-- > 0; )
+ if (lf.coefficient(Variable(i)) != 0) {
+ if (t++ == 1)
+ break;
+ else
+ w_id = i;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ using std::swap;
+
+ const dimension_type n_var = 2*var_id;
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `lf':
+ // - If t == 0, then lf == [lb, ub];
+ // - If t == 1, then lf == a*w + [lb, ub], where `w' can be `v' or another
+ // variable;
+ // - If t == 2, the `lf' is of the general form.
+
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ if (t == 0) {
+ // Case 1: lf = [lb, ub].
+ forget_all_octagonal_constraints(var_id);
+ mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+ mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+ // Add the constraint `var >= lb && var <= ub'.
+ add_octagonal_constraint(n_var + 1, n_var, b_ub);
+ add_octagonal_constraint(n_var, n_var + 1, b_mlb);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // True if `b' is in [0, 0].
+ bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `lf'.
+ const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id));
+ // True if `w_coeff' is in [1, 1].
+ bool is_w_coeff_one = (w_coeff == 1);
+ // True if `w_coeff' is in [-1, -1].
+ bool is_w_coeff_minus_one = (w_coeff == -1);
+ if (is_w_coeff_one || is_w_coeff_minus_one) {
+ // Case 2: lf = w_coeff*w + b, with w_coeff = [+/-1, +/-1].
+ if (w_id == var_id) {
+ // Here lf = w_coeff*v + b, with w_coeff = [+/-1, +/-1].
+ if (is_w_coeff_one && is_b_zero)
+ // The transformation is the identity function.
+ return;
+ // Translate all the constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_lb'.
+ if (is_w_coeff_minus_one)
+ swap(b_ub, b_mlb);
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ ++m_iter;
+ // NOTE: delay update of unary constraints on `var'.
+ for (dimension_type j = n_var; j-- > 0; ) {
+ N& m_v_j = m_v[j];
+ add_assign_r(m_v_j, m_v_j, b_mlb, ROUND_UP);
+ N& m_cv_j = m_cv[j];
+ add_assign_r(m_cv_j, m_cv_j, b_ub, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_v_j, m_cv_j);
+ }
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, b_ub, ROUND_UP);
+ N& m_i_cv = m_i[n_var + 1];
+ add_assign_r(m_i_cv, m_i_cv, b_mlb, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_i_v, m_i_cv);
+ }
+ // Now update unary constraints on var.
+ mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+ N& m_cv_v = m_cv[n_var];
+ add_assign_r(m_cv_v, m_cv_v, b_ub, ROUND_UP);
+ mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+ N& m_v_cv = m_v[n_var + 1];
+ add_assign_r(m_v_cv, m_v_cv, b_mlb, ROUND_UP);
+ if (is_w_coeff_minus_one)
+ swap(m_cv_v, m_v_cv);
+ // Note: strong closure is preserved.
+ }
+ else {
+ // Here `w != var', so that `lf' is of the form
+ // [+/-1, +/-1] * w + b.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ if (is_w_coeff_one)
+ // Add the new constraints `var - w >= b_lb'
+ // `and var - w <= b_ub'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w, n_var, b_ub);
+ add_octagonal_constraint(n_w + 1, n_var + 1, b_mlb);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w + 1, b_ub);
+ add_octagonal_constraint(n_var, n_w, b_mlb);
+ }
+ else
+ // Add the new constraints `var + w >= b_lb'
+ // `and var + w <= b_ub'.
+ if (var_id < w_id) {
+ add_octagonal_constraint(n_w + 1, n_var, b_ub);
+ add_octagonal_constraint(n_w, n_var + 1, b_mlb);
+ }
+ else {
+ add_octagonal_constraint(n_var + 1, n_w, b_ub);
+ add_octagonal_constraint(n_var, n_w + 1, b_mlb);
+ }
+ incremental_strong_closure_assign(var);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+ // or t == 1, expr == i*w + b, but i <> [+/-1, +/-1].
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ Linear_Form<FP_Interval_Type> minus_lf(lf);
+ minus_lf.negate();
+
+ // Declare temporaries outside the loop.
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ row_iterator m_iter = matrix.row_begin();
+ m_iter += n_var;
+ row_reference var_ite = *m_iter;
+ ++m_iter;
+ row_reference var_cv_ite = *m_iter;
+ ++m_iter;
+ row_iterator m_end = matrix.row_end();
+
+ // Update binary constraints on var FIRST.
+ for (dimension_type curr_var = var_id,
+ n_curr_var = n_var - 2; curr_var-- > 0; ) {
+ Variable current(curr_var);
+ linear_form_upper_bound(lf + current, upper_bound);
+ assign_r(var_cv_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(var_cv_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(var_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf - current, upper_bound);
+ assign_r(var_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ n_curr_var -= 2;
+ }
+ for (dimension_type curr_var = var_id + 1; m_iter != m_end; ++m_iter) {
+ row_reference m_v_ite = *m_iter;
+ ++m_iter;
+ row_reference m_cv_ite = *m_iter;
+ Variable current(curr_var);
+ linear_form_upper_bound(lf + current, upper_bound);
+ assign_r(m_cv_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(m_v_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(m_cv_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf - current, upper_bound);
+ assign_r(m_v_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+ ++curr_var;
+ }
+
+ // Finally, update unary constraints on var.
+ PPL_DIRTY_TEMP(N, lf_ub);
+ linear_form_upper_bound(lf, lf_ub);
+ PPL_DIRTY_TEMP(N, minus_lf_ub);
+ linear_form_upper_bound(minus_lf, minus_lf_ub);
+ mul_2exp_assign_r(lf_ub, lf_ub, 1, ROUND_UP);
+ assign_r(matrix[n_var + 1][n_var], lf_ub, ROUND_NOT_NEEDED);
+ mul_2exp_assign_r(minus_lf_ub, minus_lf_ub, 1, ROUND_UP);
+ assign_r(matrix[n_var][n_var + 1], minus_lf_ub, ROUND_NOT_NEEDED);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::linear_form_upper_bound:"
+ " T not a floating point type.");
+
+ const dimension_type lf_space_dimension = lf.space_dimension();
+ PPL_ASSERT(lf_space_dimension <= space_dim);
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ PPL_DIRTY_TEMP(N, curr_lb);
+ PPL_DIRTY_TEMP(N, curr_ub);
+ PPL_DIRTY_TEMP(N, curr_var_ub);
+ PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+ PPL_DIRTY_TEMP(N, first_comparison_term);
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+
+ PPL_DIRTY_TEMP(N, negator);
+
+ assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+ for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+ ++curr_var) {
+ const FP_Interval_Type& curr_coefficient =
+ lf.coefficient(Variable(curr_var));
+ assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (curr_lb != 0 || curr_ub != 0) {
+ assign_r(curr_var_ub, matrix[n_var + 1][n_var], ROUND_NOT_NEEDED);
+ div_2exp_assign_r(curr_var_ub, curr_var_ub, 1, ROUND_UP);
+ neg_assign_r(curr_minus_var_ub, matrix[n_var][n_var + 1],
+ ROUND_NOT_NEEDED);
+ div_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, 1, ROUND_DOWN);
+ // Optimize the most common case: curr = +/-[1, 1].
+ if (curr_lb == 1 && curr_ub == 1) {
+ add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+ ROUND_UP);
+ }
+ else if (curr_lb == -1 && curr_ub == -1) {
+ neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+ ROUND_NOT_NEEDED);
+ add_assign_r(result, result, negator, ROUND_UP);
+ }
+ else {
+ // Next addend will be the maximum of four quantities.
+ assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+
+ add_assign_r(result, result, first_comparison_term, ROUND_UP);
+ }
+ }
+
+ n_var += 2;
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::
+interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub,
+ const N& int_ub, const N& int_lb,
+ N& result) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::interval_coefficient_upper_bound:"
+ " T not a floating point type.");
+
+ // NOTE: we store the first comparison term directly into result.
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+ PPL_DIRTY_TEMP(N, third_comparison_term);
+ PPL_DIRTY_TEMP(N, fourth_comparison_term);
+
+ assign_r(result, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(third_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(fourth_comparison_term, 0, ROUND_NOT_NEEDED);
+
+ add_mul_assign_r(result, var_ub, int_ub, ROUND_UP);
+ add_mul_assign_r(second_comparison_term, minus_var_ub, int_ub, ROUND_UP);
+ add_mul_assign_r(third_comparison_term, var_ub, int_lb, ROUND_UP);
+ add_mul_assign_r(fourth_comparison_term, minus_var_ub, int_lb, ROUND_UP);
+
+ assign_r(result, std::max(result, second_comparison_term), ROUND_NOT_NEEDED);
+ assign_r(result, std::max(result, third_comparison_term), ROUND_NOT_NEEDED);
+ assign_r(result, std::max(result, fourth_comparison_term), ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", var_id + 1);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr = n; remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == -denominator) {
+ // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, denominator*var - b, w_coeff);
+ }
+ else {
+ // `expr == w_coeff*w + b', where `w != var'.
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ }
+ return;
+ }
+ }
+ // General case.
+ // Either t == 2, so that
+ // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t = 1, expr = a*w + b, but a <> +/- denominator.
+ const Coefficient& coeff_v = expr.coefficient(var);
+ if (coeff_v != 0) {
+ if (coeff_v > 0) {
+ // The transformation is invertible.
+ Linear_Expression inverse = ((coeff_v + denominator)*var);
+ inverse -= expr;
+ affine_image(var, inverse, coeff_v);
+ }
+ else {
+ // The transformation is invertible.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_v);
+ neg_assign(minus_coeff_v, coeff_v);
+ Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+ inverse += expr;
+ affine_image(var, inverse, minus_coeff_v);
+ }
+ }
+ else {
+ // The transformation is not invertible: all constraints on `var' are lost.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+ }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr ,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+ expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ var_id + 1);
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ return;
+ }
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `expr', if any.
+ dimension_type w_id = expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: expr = b.
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ // Strong closure is lost.
+ reset_strongly_closed();
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= n/denominator',
+ // i.e., `-var <= -b/denominator'.
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `expr'.
+ const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ // Strong closure is not preserved.
+ reset_strongly_closed();
+ if (w_coeff == denominator) {
+ // Translate all the constraints of the form `v - w <= cost'
+ // into the constraint `v - w <= cost + b/denominator';
+ // forget each constraint `w - v <= cost1'.
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ N& m_v_cv = m_v[n_var + 1];
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ N& m_cv_v = m_cv[n_var];
+ ++m_iter;
+ // NOTE: delay update of m_v_cv and m_cv_v.
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ N& m_i_v = m_i[n_var];
+ add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+ assign_r(m_i[n_var + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (dimension_type k = n_var; k-- > 0; ) {
+ assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+ }
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+ assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ // Here `w_coeff == -denominator'.
+ // `expr' is of the form: -a*var + b.
+ N& m_v_cv = matrix[n_var][n_var + 1];
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(matrix[n_var + 1][n_var], m_v_cv, d, ROUND_UP);
+ assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_octagonal_constraints(var_id);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is the form
+ // +/- denominator*w + b.
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ if (w_coeff == denominator) {
+ // Add the new constraint `v - w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var, b, denominator);
+ else
+ add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+ }
+ else {
+ // Add the new constraint `v + w <= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+ else
+ add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, minus_denom);
+ if (w_id == var_id) {
+ // Here `expr' is of the form: +/- denominator * v + b.
+ // Strong closure is not preserved.
+ reset_strongly_closed();
+ if (w_coeff == denominator) {
+ // Translate each constraint `w - v <= cost'
+ // into the constraint `w - v <= cost - b/denominator';
+ // forget each constraint `v - w <= cost1'.
+ row_iterator m_iter = m_begin + n_var;
+ row_reference m_v = *m_iter;
+ N& m_v_cv = m_v[n_var + 1];
+ ++m_iter;
+ row_reference m_cv = *m_iter;
+ N& m_cv_v = m_cv[n_var];
+ ++m_iter;
+ // NOTE: delay update of m_v_cv and m_cv_v.
+ for ( ; m_iter != m_end; ++m_iter) {
+ row_reference m_i = *m_iter;
+ assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ add_assign_r(m_i[n_var + 1], m_i[n_var + 1], d, ROUND_UP);
+ }
+ for (dimension_type k = n_var; k-- > 0; ) {
+ add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+ assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+ assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ // Here `w_coeff == -denominator'.
+ // `expr' is of the form: -a*var + b.
+ N& m_cv_v = matrix[n_var + 1][n_var];
+ mul_2exp_assign_r(d, d, 1, ROUND_UP);
+ add_assign_r(matrix[n_var][n_var + 1], m_cv_v, d, ROUND_UP);
+ assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_octagonal_constraints(var_id);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ const dimension_type n_w = 2*w_id;
+ // We have got an expression of the following form:
+ // var1 + n, with `var1' != `var'.
+ // We remove all constraints of the form `var (+/- var1) >= const'
+ // and we add the new constraint `var +/- var1 >= n/denominator'.
+ if (w_coeff == denominator) {
+ // Add the new constraint `var - w >= b/denominator',
+ // i.e., `w - var <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ }
+ else {
+ // Add the new constraint `var + w >= b/denominator',
+ // i.e., `-w - var <= -b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `v' and add back
+ // a constraint providing an upper or a lower bound for `v'
+ // (depending on `relsym').
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ {
+ // Compute an upper approximation for `sc_expr' into `sum'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+ // Remove all constraints on `v'.
+ forget_all_octagonal_constraints(var_id);
+ reset_strongly_closed();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var + 1][n_var] = double_sum;
+ // Deduce constraints of the form `v +/- u', where `u != v'.
+ deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != var_id) {
+ const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+ if (pi == denominator ) {
+ // Add the constraint `v - pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index + 1] = sum;
+ }
+ else {
+ if (pi == minus_denom) {
+ // Add the constraint `v + pinf_index <= sum'.
+ if (var_id < pinf_index)
+ matrix[2*pinf_index + 1][n_var] = sum;
+ else
+ matrix[n_var + 1][2*pinf_index] = sum;
+ }
+ }
+ }
+ break;
+ }
+
+ case GREATER_OR_EQUAL:
+ {
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, approx_i);
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+ if (is_plus_infinity(double_approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = id;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ reset_strongly_closed();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is
+ // achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_sum);
+ mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != var_id) {
+ const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+ if (pi == denominator) {
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ matrix[n_var][2*pinf_index] = sum;
+ else
+ matrix[2*pinf_index + 1][n_var + 1] = sum;
+ }
+ else {
+ if (pi == minus_denom) {
+ // Add the constraint `v + pinf_index >= -sum',
+ // i.e., `-pinf_index - v <= sum'.
+ if (pinf_index < var_id)
+ matrix[n_var][2*pinf_index + 1] = sum;
+ else
+ matrix[2*pinf_index][n_var + 1] = sum;
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ incremental_strong_closure_assign(var);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for octagons.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+ // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+ // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+ // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+ // more general form, it will be simply ignored.
+ // TODO: if it is not an octagonal difference, should we compute
+ // approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine images for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT an octagonal difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+
+#else // Currently unnecessarily complex computation.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not an octagonal constraint.
+ affine_image(new_var, rhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // TODO: each one of the following constraints is definitely NOT
+ // an octagonal difference (since it has 3 variables at least).
+ // Thus, the method refine_no_check() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= new_var);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == new_var);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ var_id + 1);
+
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lb_expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+ dimension_type w_id = lb_expr.last_nonzero();
+
+ if (w_id != 0) {
+ ++t;
+ if (!lb_expr.all_zeroes(1, w_id))
+ ++t;
+ --w_id;
+ }
+
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const dimension_type n_var = 2*var_id;
+ const Coefficient& b = lb_expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+ // `w' is the variable with index `w_id'.
+ // Now we know the form of `lb_expr':
+ // - If t == 0, then lb_expr == b, with `b' a constant;
+ // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `lb_expr' is of the general form.
+
+ if (t == 0) {
+ // Case 1: lb_expr == b.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+ two_b = 2*b;
+ // Add the constraint `var >= b/denominator'.
+ add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // The one and only non-zero homogeneous coefficient in `lb_expr'.
+ const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+ if (w_coeff == denominator || w_coeff == minus_denom) {
+ // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+ if (w_id == var_id) {
+ // Here `var' occurs in `lb_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `lb_expr'.
+ // Here `lb_expr' is of the form: +/- denominator * v + b.
+ affine_image(new_var, lb_expr, denominator);
+ // Enforce the strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ // Now apply the affine lower bound, as recorded in `new_var'
+ refine_no_check(var >= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ return;
+ }
+ else {
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ // Here `w != var', so that `lb_expr' is of the form
+ // +/-denominator * w + b.
+ const dimension_type n_w = 2*w_id;
+ // Add the new constraint `var - w >= b/denominator'.
+ if (w_coeff == denominator)
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w, b, minus_denom);
+ else {
+ // Add the new constraint `var + w >= b/denominator'.
+ if (var_id < w_id)
+ add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+ else
+ add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -lb_expr;
+ const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->matrix'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP(N, minus_coeff_i);
+ PPL_DIRTY_TEMP(N, half);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+ m_iter != m_iter_end; ) {
+ const dimension_type n_i = m_iter.index();
+ const dimension_type id = n_i/2;
+ Row_reference m_i = *m_iter;
+ ++m_iter;
+ Row_reference m_ci = *m_iter;
+ ++m_iter;
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_minus_i = m_i[n_i + 1];
+ if (!is_plus_infinity(double_up_approx_minus_i)) {
+ // Let half = double_up_approx_minus_i / 2.
+ div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& double_up_approx_i = m_ci[n_i];
+ if (!is_plus_infinity(double_up_approx_i)) {
+ // Let half = double_up_approx_i / 2.
+ div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+ add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+ }
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = id;
+ }
+ }
+ }
+ }
+
+ // Apply the affine upper bound.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+
+ // Return immediately if no approximation could be computed.
+ if (neg_pinf_count > 1) {
+ return;
+ }
+
+ // In the following, strong closure will be definitely lost.
+ reset_strongly_closed();
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ PPL_DIRTY_TEMP(N, double_neg_sum);
+ mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+ matrix[n_var][n_var + 1] = double_neg_sum;
+ // Deduce constraints of the form `-v +/- u', where `u != v'.
+ deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != var_id) {
+ const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+ if (npi == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index] = neg_sum;
+ else
+ matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+ else
+ if (npi == minus_sc_denom) {
+ // Add the constraint `v + neg_pinf_index >= -neg_sum',
+ // i.e., `-neg_pinf_index - v <= neg_sum'.
+ if (neg_pinf_index < var_id)
+ matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+ else
+ matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+ }
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ var_id + 1);
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // The image of an empty octagon is empty too.
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+ ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the Octagonal_Shape by adding the constraint induced
+ // by the affine relation.
+ refine(var, relsym, expr, denominator);
+
+ // If the shrunk OS is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // ... otherwise, since the relation was not invertible,
+ // we just forget all constraints on `var'.
+ forget_all_octagonal_constraints(var_id);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for octagons.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty.
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ j_lhs--;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ // If all variables have a zero coefficient, then `lhs' is a constant:
+ // in this case, preimage and image happen to be the same.
+ if (t_lhs == 0) {
+ generalized_affine_image(lhs, relsym, rhs);
+ return;
+ }
+
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine preimages for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_preimage(v, new_relsym, expr, denom);
+ }
+
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT an octagonal difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // Any image of an empty octagon is empty.
+ if (is_empty())
+ return;
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not an octagonal difference.
+ affine_image(new_var, lhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce strong closure for precision.
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+ dimension_type lhs_vars_i = lhs_vars[i].id();
+ forget_all_octagonal_constraints(lhs_vars_i);
+ }
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+ // one of the following constraints will be added, because they
+ // are octagonal differences.
+ // Else the following constraints are NOT octagonal differences,
+ // so the method refine_no_check() will ignore them.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(new_var <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(new_var == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(new_var >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // `var' should be one of the dimensions of the octagon.
+ const dimension_type var_id = var.id();
+ if (space_dim < var_id + 1)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ var_id + 1);
+
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ strong_closure_assign();
+ // The image of an empty octagon is empty too.
+ if (marked_empty())
+ return;
+
+ if (ub_expr.coefficient(var) == 0) {
+ refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+ generalized_affine_preimage(var, GREATER_OR_EQUAL,
+ lb_expr, denominator);
+ return;
+ }
+ if (lb_expr.coefficient(var) == 0) {
+ refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ return;
+ }
+
+ const Coefficient& expr_v = lb_expr.coefficient(var);
+ // Here `var' occurs in `lb_expr' and `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ const Linear_Expression lb_inverse
+ = lb_expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ affine_image(new_var, lb_inverse, inverse_denom);
+ strong_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ if (sgn(denominator) == sgn(inverse_denom))
+ refine_no_check(var >= new_var) ;
+ else
+ refine_no_check(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+}
+
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ row_iterator m_begin = matrix.row_begin();
+ row_iterator m_end = matrix.row_end();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(a);
+ PPL_DIRTY_TEMP_COEFFICIENT(b);
+
+ // Go through all the unary constraints in `matrix'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable x(i/2);
+ const N& c_i_ii = (*i_iter)[i + 1];
+ ++i_iter;
+ const N& c_ii_i = (*i_iter)[i];
+ ++i_iter;
+ // Go through unary constraints.
+ if (is_additive_inverse(c_i_ii, c_ii_i)) {
+ // We have a unary equality constraint.
+ numer_denom(c_ii_i, b, a);
+ a *= 2;
+ cs.insert(a*x == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_ii)) {
+ numer_denom(c_i_ii, b, a);
+ a *= 2;
+ cs.insert(-a*x <= b);
+ }
+ if (!is_plus_infinity(c_ii_i)) {
+ numer_denom(c_ii_i, b, a);
+ a *= 2;
+ cs.insert(a*x <= b);
+ }
+ }
+ }
+ // Go through all the binary constraints in `matrix'.
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ row_reference r_i = *i_iter;
+ ++i_iter;
+ row_reference r_ii = *i_iter;
+ ++i_iter;
+ const Variable y(i/2);
+ for (dimension_type j = 0; j < i; j += 2) {
+ const N& c_i_j = r_i[j];
+ const N& c_ii_jj = r_ii[j + 1];
+ const Variable x(j/2);
+ if (is_additive_inverse(c_ii_jj, c_i_j)) {
+ // We have an equality constraint of the form a*x - a*y = b.
+ numer_denom(c_i_j, b, a);
+ cs.insert(a*x - a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_j)) {
+ numer_denom(c_i_j, b, a);
+ cs.insert(a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(c_ii_jj)) {
+ numer_denom(c_ii_jj, b, a);
+ cs.insert(a*y - a*x <= b);
+ }
+ }
+
+ const N& c_ii_j = r_ii[j];
+ const N& c_i_jj = r_i[j + 1];
+ if (is_additive_inverse(c_i_jj, c_ii_j)) {
+ // We have an equality constraint of the form a*x + a*y = b.
+ numer_denom(c_ii_j, b, a);
+ cs.insert(a*x + a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 inequality constraints.
+ if (!is_plus_infinity(c_i_jj)) {
+ numer_denom(c_i_jj, b, a);
+ cs.insert(-a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(c_ii_j)) {
+ numer_denom(c_ii_j, b, a);
+ cs.insert(a*x + a*y <= b);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+ // `var' should be one of the dimensions of the vector space.
+ const dimension_type var_id = var.id();
+ if (var_id + 1 > space_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", var_id + 1);
+
+ // The space dimension of the resulting octagon should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dim)
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Nothing to do, if no dimensions must be added.
+ if (m == 0)
+ return;
+
+ // Keep track of the dimension before adding the new ones.
+ const dimension_type old_num_rows = matrix.num_rows();
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ // For each constraints involving variable `var', we add a
+ // similar constraint with the new variable substituted for
+ // variable `var'.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+ const row_iterator m_end = matrix.row_end();
+ const dimension_type n_var = 2*var_id;
+ Row_iterator v_iter = m_begin + n_var;
+ Row_reference m_v = *v_iter;
+ Row_reference m_cv = *(v_iter + 1);
+
+ for (row_iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+ i_iter += 2) {
+ row_reference m_i = *i_iter;
+ row_reference m_ci = *(i_iter + 1);
+ const dimension_type i = i_iter.index();
+ const dimension_type ci = i + 1;
+ m_i[ci] = m_v[n_var + 1];
+ m_ci[i] = m_cv[n_var];
+ for (dimension_type j = 0; j < n_var; ++j) {
+ m_i[j] = m_v[j];
+ m_ci[j] = m_cv[j];
+ }
+ for (dimension_type j = n_var + 2; j < old_num_rows; ++j) {
+ row_iterator j_iter = m_begin + j;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ m_i[j] = m_cj[n_var + 1];
+ m_ci[j] = m_cj[n_var];
+ }
+ }
+ // In general, adding a constraint does not preserve the strong closure
+ // of the octagon.
+ if (marked_strongly_closed())
+ reset_strongly_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ // `dest' should be one of the dimensions of the octagon.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the octagon.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ // Recompute the elements of the row and the column corresponding
+ // to variable `dest' by taking the join of their value with the
+ // value of the corresponding elements in the row and column of the
+ // variable `vars'.
+ typedef typename OR_Matrix<N>::row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+ const row_iterator m_begin = matrix.row_begin();
+
+ strong_closure_assign();
+ const dimension_type n_rows = matrix.num_rows();
+ const dimension_type n_dest = 2*dest.id();
+ row_iterator v_iter = m_begin + n_dest;
+ row_reference m_v = *v_iter;
+ row_reference m_cv = *(v_iter + 1);
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ const dimension_type tbf_id = *i;
+ const dimension_type tbf_var = 2*tbf_id;
+ row_iterator tbf_iter = m_begin + tbf_var;
+ row_reference m_tbf = *tbf_iter;
+ row_reference m_ctbf = *(tbf_iter + 1);
+ max_assign(m_v[n_dest + 1], m_tbf[tbf_var + 1]);
+ max_assign(m_cv[n_dest], m_ctbf[tbf_var]);
+
+ const dimension_type min_id = std::min(n_dest, tbf_var);
+ const dimension_type max_id = std::max(n_dest, tbf_var);
+
+ using namespace Implementation::Octagonal_Shapes;
+ for (dimension_type j = 0; j < min_id; ++j) {
+ const dimension_type cj = coherent_index(j);
+ max_assign(m_v[j], m_tbf[j]);
+ max_assign(m_cv[j], m_ctbf[j]);
+ max_assign(m_cv[cj], m_ctbf[cj]);
+ max_assign(m_v[cj], m_tbf[cj]);
+ }
+ for (dimension_type j = min_id + 2; j < max_id; ++j) {
+ const dimension_type cj = coherent_index(j);
+ row_iterator j_iter = m_begin + j;
+ row_reference m_j = *j_iter;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ if (n_dest == min_id) {
+ max_assign(m_cj[n_dest + 1], m_tbf[j]);
+ max_assign(m_cj[n_dest], m_ctbf[j]);
+ max_assign(m_j[n_dest], m_ctbf[cj]);
+ max_assign(m_j[n_dest + 1], m_tbf[cj]);
+ }
+ else {
+ max_assign(m_v[j], m_cj[tbf_var + 1]);
+ max_assign(m_cv[j], m_cj[tbf_var]);
+ max_assign(m_cv[cj], m_j[tbf_var]);
+ max_assign(m_v[cj], m_j[tbf_var + 1]);
+ }
+ }
+ for (dimension_type j = max_id + 2; j < n_rows; ++j) {
+ row_iterator j_iter = m_begin + j;
+ row_reference m_j = *j_iter;
+ row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+ max_assign(m_cj[n_dest + 1], m_cj[tbf_var + 1]);
+ max_assign(m_cj[n_dest], m_cj[tbf_var]);
+ max_assign(m_j[n_dest], m_j[tbf_var]);
+ max_assign(m_j[n_dest + 1], m_j[tbf_var + 1]);
+ }
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+ // FIXME, CHECKME: what about inexact computations?
+
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const Octagonal_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ PPL_ASSERT(x.marked_strongly_closed());
+ PPL_ASSERT(y.marked_strongly_closed());
+ // Pre-compute the upper bound of `x' and `y'.
+ Octagonal_Shape<T> ub(x);
+ ub.upper_bound_assign(y);
+
+ // Compute redundancy information for x and y.
+ // TODO: provide a nicer data structure for redundancy.
+ std::vector<Bit_Row> x_non_red;
+ x.non_redundant_matrix_entries(x_non_red);
+ std::vector<Bit_Row> y_non_red;
+ y.non_redundant_matrix_entries(y_non_red);
+
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, lhs_copy);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+ const dimension_type n_rows = x.matrix.num_rows();
+ const row_iterator x_m_begin = x.matrix.row_begin();
+ const row_iterator y_m_begin = y.matrix.row_begin();
+ const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Bit_Row& x_non_red_i = x_non_red[i];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+ row_reference x_i = *(x_m_begin + i);
+ row_reference y_i = *(y_m_begin + i);
+ row_reference ub_i = *(ub_m_begin + i);
+ const N& ub_i_ci = ub_i[ci];
+ for (dimension_type j = row_size_i; j-- > 0; ) {
+ // Check redundancy of x_i_j.
+ if (!x_non_red_i[j])
+ continue;
+ const N& x_i_j = x_i[j];
+ // Check 1st condition in BHZ09 theorem.
+ if (x_i_j >= y_i[j])
+ continue;
+ const dimension_type cj = coherent_index(j);
+ const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+ row_reference ub_cj = *(ub_m_begin + cj);
+ const N& ub_cj_j = ub_cj[j];
+ for (dimension_type k = 0; k < n_rows; ++k) {
+ const Bit_Row& y_non_red_k = y_non_red[k];
+ const dimension_type ck = coherent_index(k);
+ const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+ row_reference x_k = *(x_m_begin + k);
+ row_reference y_k = *(y_m_begin + k);
+ row_reference ub_k = *(ub_m_begin + k);
+ const N& ub_k_ck = ub_k[ck];
+ // Be careful: for each index h, the diagonal element m[h][h]
+ // is (by convention) +infty in our implementation; however,
+ // BHZ09 theorem assumes that it is equal to 0.
+ const N& ub_k_j
+ = (k == j)
+ ? temp_zero
+ : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+ const N& ub_i_ck
+ = (i == ck)
+ ? temp_zero
+ : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+ for (dimension_type ell = row_size_k; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (!y_non_red_k[ell])
+ continue;
+ const N& y_k_ell = y_k[ell];
+ // Check 2nd condition in BHZ09 theorem.
+ if (y_k_ell >= x_k[ell])
+ continue;
+ const dimension_type cell = coherent_index(ell);
+ row_reference ub_cell = *(ub_m_begin + cell);
+ const N& ub_i_ell
+ = (i == ell)
+ ? temp_zero
+ : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+ const N& ub_cj_ell
+ = (cj == ell)
+ ? temp_zero
+ : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+ // Check 3rd condition in BHZ09 theorem.
+ add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 4th condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 5th condition in BHZ09 theorem.
+ assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+ add_assign_r(lhs, lhs_copy, x_i_j, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_cj_j, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 6th condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_i_ci, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 7th condition of BHZ09 theorem.
+ add_assign_r(lhs, lhs_copy, y_k_ell, ROUND_UP);
+ add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_k_ck, ROUND_UP);
+ if (lhs >= rhs)
+ continue;
+ // Check 8th (last) condition in BHZ09 theorem.
+ add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_UP);
+ add_assign_r(rhs, rhs, ub_cell[ell], ROUND_UP);
+ if (lhs < rhs)
+ // All 8 conditions are satisfied:
+ // upper bound is not exact.
+ return false;
+ }
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>
+::integer_upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "Octagonal_Shape<T>::"
+ "integer_upper_bound_assign_if_exact(y):"
+ " T in not an integer datatype.");
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const Octagonal_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+
+ // If `x' or `y' is (known to) contain no integral point,
+ // then the integer upper bound can be computed exactly by tight closure.
+ if (x.marked_empty()) {
+ *this = y;
+ tight_closure_assign();
+ return true;
+ }
+ else if (y.marked_empty()) {
+ tight_closure_assign();
+ return true;
+ }
+ else if (x.is_empty() || x.tight_coherence_would_make_empty()) {
+ *this = y;
+ tight_closure_assign();
+ return true;
+ }
+ else if (y.is_empty() || y.tight_coherence_would_make_empty()) {
+ tight_closure_assign();
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty (and Z-consistent).
+ PPL_ASSERT(x.marked_strongly_closed());
+ PPL_ASSERT(y.marked_strongly_closed());
+ // Pre-compute the integer upper bound of `x' and `y':
+ // have to take copies, since tight closure might modify the rational shape.
+ Octagonal_Shape<T> tx(x);
+ tx.tight_closure_assign();
+ Octagonal_Shape<T> ty(y);
+ ty.tight_closure_assign();
+ Octagonal_Shape<T> ub(tx);
+ ub.upper_bound_assign(ty);
+
+ // Compute redundancy information for tx and ty.
+ // TODO: provide a nicer data structure for redundancy.
+ // NOTE: there is no need to identify all redundancies, since this is
+ // an optimization; hence we reuse the strong-reduction helper methods.
+ std::vector<Bit_Row> tx_non_red;
+ tx.non_redundant_matrix_entries(tx_non_red);
+ std::vector<Bit_Row> ty_non_red;
+ ty.non_redundant_matrix_entries(ty_non_red);
+
+ PPL_DIRTY_TEMP(N, lhs_i_j);
+ PPL_DIRTY_TEMP(N, lhs_k_ell);
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, lhs_copy);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_two);
+ assign_r(temp_two, 2, ROUND_NOT_NEEDED);
+
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+ const dimension_type n_rows = tx.matrix.num_rows();
+ const row_iterator tx_m_begin = tx.matrix.row_begin();
+ const row_iterator ty_m_begin = ty.matrix.row_begin();
+ const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Bit_Row& tx_non_red_i = tx_non_red[i];
+ using namespace Implementation::Octagonal_Shapes;
+ const dimension_type ci = coherent_index(i);
+ const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+ row_reference tx_i = *(tx_m_begin + i);
+ row_reference ty_i = *(ty_m_begin + i);
+ row_reference ub_i = *(ub_m_begin + i);
+ const N& ub_i_ci = ub_i[ci];
+ for (dimension_type j = row_size_i; j-- > 0; ) {
+ // Check redundancy of tx_i_j.
+ if (!tx_non_red_i[j])
+ continue;
+ const N& tx_i_j = tx_i[j];
+ const dimension_type cj = coherent_index(j);
+ const N& eps_i_j = (i == cj) ? temp_two : temp_one;
+ // Check condition 1a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs_i_j, tx_i_j, eps_i_j, ROUND_NOT_NEEDED);
+ if (lhs_i_j > ty_i[j])
+ continue;
+ const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+ row_reference ub_cj = *(ub_m_begin + cj);
+ const N& ub_cj_j = ub_cj[j];
+ for (dimension_type k = 0; k < n_rows; ++k) {
+ const Bit_Row& ty_non_red_k = ty_non_red[k];
+ const dimension_type ck = coherent_index(k);
+ const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+ row_reference tx_k = *(tx_m_begin + k);
+ row_reference ty_k = *(ty_m_begin + k);
+ row_reference ub_k = *(ub_m_begin + k);
+ const N& ub_k_ck = ub_k[ck];
+ // Be careful: for each index h, the diagonal element m[h][h]
+ // is (by convention) +infty in our implementation; however,
+ // BHZ09 theorem assumes that it is equal to 0.
+ const N& ub_k_j
+ = (k == j)
+ ? temp_zero
+ : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+ const N& ub_i_ck
+ = (i == ck)
+ ? temp_zero
+ : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+ for (dimension_type ell = row_size_k; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (!ty_non_red_k[ell])
+ continue;
+ const N& ty_k_ell = ty_k[ell];
+ const dimension_type cell = coherent_index(ell);
+ const N& eps_k_ell = (k == cell) ? temp_two : temp_one;
+ // Check condition 1b in BHZ09 Theorem 6.8.
+ add_assign_r(lhs_k_ell, ty_k_ell, eps_k_ell, ROUND_NOT_NEEDED);
+ if (lhs_k_ell > tx_k[ell])
+ continue;
+ row_reference ub_cell = *(ub_m_begin + cell);
+ const N& ub_i_ell
+ = (i == ell)
+ ? temp_zero
+ : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+ const N& ub_cj_ell
+ = (cj == ell)
+ ? temp_zero
+ : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+ // Check condition 2a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs, lhs_i_j, lhs_k_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 2b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 3a in BHZ09 Theorem 6.8.
+ assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+ add_assign_r(lhs, lhs, lhs_i_j, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_cj_j, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 3b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_i_ci, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 4a in BHZ09 Theorem 6.8.
+ add_assign_r(lhs, lhs_copy, lhs_k_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_k_ck, ROUND_NOT_NEEDED);
+ if (lhs > rhs)
+ continue;
+ // Check condition 4b in BHZ09 Theorem 6.8.
+ add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_NOT_NEEDED);
+ add_assign_r(rhs, rhs, ub_cell[ell], ROUND_NOT_NEEDED);
+ if (lhs <= rhs)
+ // All 8 conditions are satisfied:
+ // integer upper bound is not exact.
+ return false;
+ }
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<T>::is_integer)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ strong_closure_assign();
+ if (space_dim == 0 || marked_empty())
+ return;
+
+ for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+ i_end = matrix.element_end(); i != i_end; ++i)
+ drop_some_non_integer_points_helper(*i);
+
+ // Unary constraints should have an even integer boundary.
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+ for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+ const dimension_type ci = i + 1;
+ N& mat_i_ci = matrix[i][ci];
+ if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci)) {
+ sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ N& mat_ci_i = matrix[ci][i];
+ if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i)) {
+ sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+ return;
+
+ strong_closure_assign();
+ if (marked_empty())
+ return;
+
+ PPL_DIRTY_TEMP(N, temp_one);
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+ const Variables_Set::const_iterator v_begin = vars.begin();
+ const Variables_Set::const_iterator v_end = vars.end();
+ PPL_ASSERT(v_begin != v_end);
+ typedef typename OR_Matrix<N>::row_reference_type row_reference;
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = 2 * (*v_i);
+ const dimension_type ci = i + 1;
+ row_reference m_i = matrix[i];
+ row_reference m_ci = matrix[ci];
+
+ // Unary constraints: should be even integers.
+ N& m_i_ci = m_i[ci];
+ if (!is_plus_infinity(m_i_ci)) {
+ drop_some_non_integer_points_helper(m_i_ci);
+ if (!is_even(m_i_ci)) {
+ sub_assign_r(m_i_ci, m_i_ci, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+ N& m_ci_i = m_ci[i];
+ if (!is_plus_infinity(m_ci_i)) {
+ drop_some_non_integer_points_helper(m_ci_i);
+ if (!is_even(m_ci_i)) {
+ sub_assign_r(m_ci_i, m_ci_i, temp_one, ROUND_UP);
+ reset_strongly_closed();
+ }
+ }
+
+ // Binary constraints (note: only consider j < i).
+ for (Variables_Set::const_iterator v_j = v_begin; v_j != v_i; ++v_j) {
+ const dimension_type j = 2 * (*v_j);
+ const dimension_type cj = j + 1;
+ drop_some_non_integer_points_helper(m_i[j]);
+ drop_some_non_integer_points_helper(m_i[cj]);
+ drop_some_non_integer_points_helper(m_ci[j]);
+ drop_some_non_integer_points_helper(m_ci[cj]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+void
+Octagonal_Shape<T>
+::export_interval_constraints(U& dest) const {
+ if (space_dim > dest.space_dimension())
+ throw std::invalid_argument(
+ "Octagonal_Shape<T>::export_interval_constraints");
+
+ strong_closure_assign();
+
+ if (marked_empty()) {
+ dest.set_empty();
+ return;
+ }
+
+ PPL_DIRTY_TEMP(N, lb);
+ PPL_DIRTY_TEMP(N, ub);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ const dimension_type ii = 2*i;
+ const dimension_type cii = ii + 1;
+
+ // Set the upper bound.
+ const N& twice_ub = matrix[cii][ii];
+ if (!is_plus_infinity(twice_ub)) {
+ assign_r(ub, twice_ub, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(ub, ub, 1, ROUND_UP);
+ // FIXME: passing a raw value may not be general enough.
+ if (!dest.restrict_upper(i, ub.raw_value()))
+ return;
+ }
+
+ // Set the lower bound.
+ const N& twice_lb = matrix[ii][cii];
+ if (!is_plus_infinity(twice_lb)) {
+ assign_r(lb, twice_lb, ROUND_NOT_NEEDED);
+ neg_assign_r(lb, lb, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lb, lb, 1, ROUND_DOWN);
+ // FIXME: passing a raw value may not be general enough.
+ if (!dest.restrict_lower(i, lb.raw_value()))
+ return;
+ }
+ }
+
+}
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& oct) {
+ // Handle special cases first.
+ if (oct.marked_empty()) {
+ s << "false";
+ return s;
+ }
+ if (oct.is_universe()) {
+ s << "true";
+ return s;
+ }
+
+ typedef typename Octagonal_Shape<T>::coefficient_type N;
+ typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+ typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+ // Records whether or not we still have to print the first constraint.
+ bool first = true;
+
+ row_iterator m_begin = oct.matrix.row_begin();
+ row_iterator m_end = oct.matrix.row_end();
+
+ // Temporaries.
+ PPL_DIRTY_TEMP(N, negation);
+ PPL_DIRTY_TEMP(N, half);
+ // Go through all the unary constraints.
+ // (Note: loop iterator is incremented in the loop body.)
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable v_i(i/2);
+ const N& c_i_ii = (*i_iter)[i + 1];
+ ++i_iter;
+ const N& c_ii_i = (*i_iter)[i];
+ ++i_iter;
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_i_ii, c_ii_i)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_ii) && !is_plus_infinity(c_ii_i));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i = bound'.
+ if (div_2exp_assign_r(half, c_ii_i, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " = " << half;
+ else
+ s << "2*" << v_i << " = " << c_ii_i;
+ }
+ else {
+ // We will print unary non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_ii)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ neg_assign_r(negation, c_i_ii, ROUND_NOT_NEEDED);
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i >= negation'.
+ if (div_2exp_assign_r(half, negation, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " >= " << half;
+ else
+ s << "2*" << v_i << " >= " << negation;
+ }
+ if (!is_plus_infinity(c_ii_i)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ // If the value bound can NOT be divided by 2 exactly,
+ // then we output the constraint `2*v_i <= bound'.
+ if (div_2exp_assign_r(half, c_ii_i, 1,
+ ROUND_UP | ROUND_STRICT_RELATION)
+ == V_EQ)
+ s << v_i << " <= " << half;
+ else
+ s << "2*" << v_i << " <= " << c_ii_i;
+ }
+ }
+ }
+
+ // Go through all the binary constraints.
+ // (Note: loop iterator is incremented in the loop body.)
+ for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+ const dimension_type i = i_iter.index();
+ const Variable v_i(i/2);
+ row_reference r_i = *i_iter;
+ ++i_iter;
+ row_reference r_ii = *i_iter;
+ ++i_iter;
+
+ for (dimension_type j = 0; j < i; j += 2) {
+ const Variable v_j(j/2);
+ // Print binary differences.
+ const N& c_ii_jj = r_ii[j + 1];
+ const N& c_i_j = r_i[j];
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_ii_jj, c_i_j)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_j) && !is_plus_infinity(c_ii_jj));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_i_j) >= 0)
+ s << v_j << " - " << v_i << " = " << c_i_j;
+ else
+ s << v_i << " - " << v_j << " = " << c_ii_jj;
+ }
+ else {
+ // We will print non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_i_j) >= 0)
+ s << v_j << " - " << v_i << " <= " << c_i_j;
+ else {
+ neg_assign_r(negation, c_i_j, ROUND_DOWN);
+ s << v_i << " - " << v_j << " >= " << negation;
+ }
+ }
+ if (!is_plus_infinity(c_ii_jj)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (sgn(c_ii_jj) >= 0)
+ s << v_i << " - " << v_j << " <= " << c_ii_jj;
+ else {
+ neg_assign_r(negation, c_ii_jj, ROUND_DOWN);
+ s << v_j << " - " << v_i << " >= " << negation;
+ }
+ }
+ }
+ // Print binary sums.
+ const N& c_i_jj = r_i[j + 1];
+ const N& c_ii_j = r_ii[j];
+ // Check whether or not it is an equality constraint.
+ if (is_additive_inverse(c_i_jj, c_ii_j)) {
+ // It is an equality.
+ PPL_ASSERT(!is_plus_infinity(c_i_jj) && !is_plus_infinity(c_ii_j));
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ s << v_j << " + " << v_i << " = " << c_ii_j;
+ }
+ else {
+ // We will print non-strict inequalities, if any.
+ if (!is_plus_infinity(c_i_jj)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ neg_assign_r(negation, c_i_jj, ROUND_DOWN);
+ s << v_j << " + " << v_i << " >= " << negation;
+ }
+ if (!is_plus_infinity(c_ii_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ s << v_j << " + " << v_i << " <= " << c_ii_j;
+ }
+ }
+ }
+ }
+ return s;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+ s << "space_dim "
+ << space_dim
+ << "\n";
+ status.ascii_dump(s);
+ s << "\n";
+ matrix.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
+
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+ std::string str;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> space_dim))
+ return false;
+
+ if (!status.ascii_load(s))
+ return false;
+
+ if (!matrix.ascii_load(s))
+ return false;
+
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+ return matrix.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+ // Check whether the matrix is well-formed.
+ if (!matrix.OK())
+ return false;
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ return false;
+
+ // All empty octagons are OK.
+ if (marked_empty())
+ return true;
+
+ // 0-dim universe octagon is OK.
+ if (space_dim == 0)
+ return true;
+
+ // MINUS_INFINITY cannot occur at all.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+ for (dimension_type j = i.row_size(); j-- > 0; )
+ if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "Octagonal_Shape::"
+ << "matrix[" << i.index() << "][" << j << "] = "
+ << x_i[j] << "!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // On the main diagonal only PLUS_INFINITY can occur.
+ for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+ m_end = matrix.row_end(); i != m_end; ++i) {
+ typename OR_Matrix<N>::const_row_reference_type r = *i;
+ const N& m_i_i = r[i.index()];
+ if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+ const dimension_type j = i.index();
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+ << m_i_i << "! (+inf was expected.)\n";
+#endif
+ return false;
+ }
+ }
+
+ // The following tests might result in false alarms when using floating
+ // point coefficients: they are only meaningful if the coefficient type
+ // base is exact (since otherwise strong closure is approximated).
+ if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+ // Check whether the closure information is legal.
+ if (marked_strongly_closed()) {
+ Octagonal_Shape x = *this;
+ x.reset_strongly_closed();
+ x.strong_closure_assign();
+ if (x.matrix != matrix) {
+#ifndef NDEBUG
+ std::cerr << "Octagonal_Shape is marked as strongly closed "
+ << "but it is not!\n";
+#endif
+ return false;
+ }
+ }
+
+ // A closed octagon must be strong-coherent.
+ if (marked_strongly_closed())
+ if (!is_strong_coherent()) {
+#ifndef NDEBUG
+ std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+ return false;
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const Octagonal_Shape& y) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template <typename C>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_invalid_argument(const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Octagonal_Shape::" << method << ":\n"
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 2323. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_inlines.hh line 38. */
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+ // One dimension is reserved to have a value of type dimension_type
+ // that does not represent a legal dimension.
+ return std::min(DB_Matrix<N>::max_num_rows() - 1,
+ DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+ return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+ return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+ return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+ status.set_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_closed() {
+ status.set_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+ status.set_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+ status.reset_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+ status.reset_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+ if (kind == EMPTY)
+ set_empty();
+ else {
+ if (num_dimensions > 0)
+ // A (non zero-dim) universe BDS is closed.
+ set_shortest_path_closed();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
+ : dbm(y.dbm), status(y.status), redundancy_dbm() {
+ if (y.marked_shortest_path_reduced())
+ redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
+ // For maximum precision, enforce shortest-path closure
+ // before copying the DB matrix.
+ : dbm((y.shortest_path_closure_assign(), y.dbm)),
+ status(),
+ redundancy_dbm() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.marked_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+ return minimized_congruences();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ add_constraint(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+ add_constraints(cs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+ add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+ const dimension_type c_space_dim = c.space_dimension();
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+ if (!marked_empty())
+ refine_no_check(c);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+ // Dimension-compatibility check.
+ if (cs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_constraints(cs)",
+ "cs and *this are space-dimension incompatible");
+
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dimension())
+ throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+ if (!marked_empty())
+ refine_no_check(cg);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check.
+ if (cgs.space_dimension() > space_dimension())
+ throw_invalid_argument("refine_with_congruences(cgs)",
+ "cgs and *this are space-dimension incompatible");
+
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent())
+ set_empty();
+ // Other proper congruences are just ignored.
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+ return false;
+}
+
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+ return false;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+ : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+ if (cs.space_dimension() > 0)
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ add_constraints(cs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+ Complexity_Class)
+ : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+ // Check emptiness for maximum precision.
+ if (box.is_empty())
+ set_empty();
+ else if (box.space_dimension() > 0) {
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ refine_with_constraints(box.constraints());
+ }
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+ Complexity_Class)
+ : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+ if (grid.space_dimension() > 0)
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ // Taking minimized congruences ensures maximum precision.
+ refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+ Complexity_Class)
+ : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+ // Check for emptiness for maximum precision.
+ if (os.is_empty())
+ set_empty();
+ else if (os.space_dimension() > 0) {
+ // A (non zero-dim) universe BDS is shortest-path closed.
+ set_shortest_path_closed();
+ refine_with_constraints(os.constraints());
+ // After refining, shortest-path closure is possibly lost
+ // (even when `os' was strongly closed: recall that U
+ // is possibly different from T).
+ }
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+ dbm = y.dbm;
+ status = y.status;
+ if (y.marked_shortest_path_reduced())
+ redundancy_dbm = y.redundancy_dbm;
+ return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::m_swap(BD_Shape& y) {
+ using std::swap;
+ swap(dbm, y.dbm);
+ swap(status, y.status);
+ swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+ return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+ shortest_path_closure_assign();
+ return marked_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+ return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+ return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d,
+ bool& maximum) const {
+ return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const {
+ return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d,
+ bool& minimum) const {
+ return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const {
+ return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+ return true;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+ return affine_dimension() == 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty())
+ return y.marked_empty();
+ else
+ return !y.marked_empty();
+ }
+
+ // The exact equivalence test requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal
+ // if and only if the other BDS is empty too.
+ if (x.marked_empty())
+ return y.marked_empty();
+ if (y.marked_empty())
+ return false;
+ // Check for syntactic equivalence of the two (shortest-path closed)
+ // systems of bounded differences.
+ return x.dbm == y.dbm;
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+ return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim BDSs are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires shortest-path closure.
+ x.shortest_path_closure_assign();
+ y.shortest_path_closure_assign();
+
+ // If one of two BDSs is empty, then they are equal if and only if
+ // the other BDS is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+ PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+ PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+ return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const BD_Shape<T>& x,
+ const BD_Shape<T>& y,
+ const Rounding_Dir dir) {
+ return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ const N& k) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+ N& dbm_ij = dbm[i][j];
+ if (dbm_ij > k) {
+ dbm_ij = k;
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+ PPL_ASSERT(denom != 0);
+ PPL_DIRTY_TEMP(N, k);
+ div_round_up(k, numer, denom);
+ add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+ // Dimension-compatibility check.
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("time_elapse_assign(y)", y);
+ // Compute time-elapse on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.time_elapse_assign(ph_y);
+ BD_Shape<T> x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+ const BD_Shape<T>& x = *this;
+ return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+#if 0
+ return BFT00_upper_bound_assign_if_exact(y);
+#else
+ const bool integer_upper_bound = false;
+ return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+#endif
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::integer_upper_bound_assign_if_exact(const BD_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+ "BD_Shape<T>::integer_upper_bound_assign_if_exact(y):"
+ " T in not an integer datatype.");
+ if (space_dimension() != y.space_dimension())
+ throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+ const bool integer_upper_bound = true;
+ return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ const dimension_type space_dim = space_dimension();
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any BDS is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a zero-dim space BDS.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Shortest-path closure is necessary as in remove_space_dimensions().
+ shortest_path_closure_assign();
+ dbm.resize_no_copy(new_dimension + 1);
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether or not reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // If we removed _all_ dimensions from a non-empty BDS,
+ // the zero-dim universe BDS has been obtained.
+ if (new_dimension == 0 && !marked_empty())
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "BD_Shape");
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+ static N stop_points[] = {
+ N(-2, ROUND_UP),
+ N(-1, ROUND_UP),
+ N( 0, ROUND_UP),
+ N( 1, ROUND_UP),
+ N( 2, ROUND_UP)
+ };
+ CC76_extrapolation_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]),
+ tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+ // Compute the H79 widening on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.H79_widening_assign(ph_y, tp);
+ BD_Shape x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+ H79_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Compute the limited H79 extrapolation on polyhedra.
+ // TODO: provide a direct implementation.
+ C_Polyhedron ph_x(constraints());
+ C_Polyhedron ph_y(y.constraints());
+ ph_x.limited_H79_extrapolation_assign(ph_y, cs, tp);
+ BD_Shape x(ph_x);
+ m_swap(x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+BD_Shape<T>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>::generalized_refine_with_linear_form_inequality(
+ const Linear_Form<Interval<T, Interval_Info> >& left,
+ const Linear_Form<Interval<T, Interval_Info> >& right,
+ const Relation_Symbol relsym) {
+ switch (relsym) {
+ case EQUAL:
+ // TODO: see if we can handle this case more efficiently.
+ refine_with_linear_form_inequality(left, right);
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case LESS_THAN:
+ case LESS_OR_EQUAL:
+ refine_with_linear_form_inequality(left, right);
+ break;
+ case GREATER_THAN:
+ case GREATER_OR_EQUAL:
+ refine_with_linear_form_inequality(right, left);
+ break;
+ case NOT_EQUAL:
+ break;
+ default:
+ PPL_UNREACHABLE;
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>
+::refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+ store) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ store.intersection_assign(Box<FP_Interval_Type>(*this));
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+ if (!is_integer(elem)) {
+ Result r = floor_assign_r(elem, elem, ROUND_DOWN);
+ PPL_USED(r);
+ PPL_ASSERT(r == V_EQ);
+ reset_shortest_path_closed();
+ }
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline void
+swap(BD_Shape<T>& x, BD_Shape<T>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_templates.hh line 1. */
+/* BD_Shape class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/BD_Shape_templates.hh line 40. */
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+ : dbm(cgs.space_dimension() + 1),
+ status(),
+ redundancy_dbm() {
+ add_congruences(cgs);
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+ : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty BD shape.
+ set_empty();
+ return;
+ }
+
+ const dimension_type space_dim = space_dimension();
+ DB_Row<N>& dbm_0 = dbm[0];
+ PPL_DIRTY_TEMP(N, tmp);
+
+ bool dbm_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::POINT:
+ point_seen = true;
+ // Intentionally fall through.
+ case Generator::CLOSURE_POINT:
+ if (!dbm_initialized) {
+ // When handling the first (closure) point, we initialize the DBM.
+ dbm_initialized = true;
+ const Coefficient& d = g.divisor();
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (i != j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(dbm_i[j], g_j - g_i, d);
+ }
+ div_round_up(dbm_i[0], -g_i, d);
+ }
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(dbm_0[j], g_j, d);
+ }
+ // Note: no need to initialize the first element of the main diagonal.
+ }
+ else {
+ // This is not the first point: the DBM already contains
+ // valid values and we must compute maxima.
+ const Coefficient& d = g.divisor();
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(tmp, g_j - g_i, d);
+ max_assign(dbm_i[j], tmp);
+ }
+ div_round_up(tmp, -g_i, d);
+ max_assign(dbm_i[0], tmp);
+ }
+ for (dimension_type j = space_dim; j > 0; --j) {
+ const Coefficient& g_j = g.expression().get(Variable(j - 1));
+ div_round_up(tmp, g_j, d);
+ max_assign(dbm_0[j], tmp);
+ }
+ }
+ break;
+ default:
+ // Lines and rays temporarily ignored.
+ break;
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw_invalid_argument("BD_Shape(gs)",
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::LINE:
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g_i != g.expression().get(Variable(j - 1)))
+ assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i != 0)
+ assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end(); i != i_end; ++i)
+ assign_r(dbm_0[i.variable().space_dimension()],
+ PLUS_INFINITY, ROUND_NOT_NEEDED);
+ break;
+ case Generator::RAY:
+ // TODO: Check if the following loop can be optimized used
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.expression().get(Variable(i - 1));
+ DB_Row<N>& dbm_i = dbm[i];
+ // The loop correctly handles the case when i == j.
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g_i < g.expression().get(Variable(j - 1)))
+ assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ if (g_i < 0)
+ assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end(); i != i_end; ++i)
+ if (*i > 0)
+ assign_r(dbm_0[i.variable().space_dimension()],
+ PLUS_INFINITY, ROUND_NOT_NEEDED);
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ set_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+ : dbm(), status(), redundancy_dbm() {
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ return;
+ }
+
+ // Build from generators when we do not care about complexity
+ // or when the process has polynomial complexity.
+ if (complexity == ANY_COMPLEXITY
+ || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+ *this = BD_Shape<T>(ph.generators());
+ return;
+ }
+
+ // We cannot afford exponential complexity, we do not have a complete set
+ // of generators for the polyhedron, and the polyhedron is not trivially
+ // empty or zero-dimensional. Constraints, however, are up to date.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+ // If the constraint system of the polyhedron is minimized,
+ // the test `is_universe()' has polynomial complexity.
+ if (ph.is_universe()) {
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ return;
+ }
+ }
+
+ // See if there is at least one inconsistent constraint in `ph.con_sys'.
+ for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+ cs_end = ph.con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // If `complexity' allows it, use simplex to derive the exact (modulo
+ // the fact that our BDSs are topologically closed) variable bounds.
+ if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(num_dimensions);
+ lp.set_optimization_mode(MAXIMIZATION);
+
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = BD_Shape<T>(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Start with a universe BDS that will be refined by the simplex.
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ // Get all the upper bounds.
+ Generator g(point());
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ for (dimension_type i = 1; i <= num_dimensions; ++i) {
+ Variable x(i-1);
+ // Evaluate optimal upper bound for `x <= ub'.
+ lp.set_objective_function(x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[0][i], numer, denom);
+ }
+ // Evaluate optimal upper bound for `x - y <= ub'.
+ for (dimension_type j = 1; j <= num_dimensions; ++j) {
+ if (i == j)
+ continue;
+ Variable y(j-1);
+ lp.set_objective_function(x - y);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[j][i], numer, denom);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, numer, denom);
+ div_round_up(dbm[i][0], numer, denom);
+ }
+ }
+ set_shortest_path_closed();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+ *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+ refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+ const dimension_type space_dim = space_dimension();
+ // A zero-space-dim shape always has affine dimension zero.
+ if (space_dim == 0)
+ return 0;
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return 0;
+
+ // The vector `predecessor' is used to represent equivalence classes:
+ // `predecessor[i] == i' if and only if `i' is the leader of its
+ // equivalence class (i.e., the minimum index in the class).
+ std::vector<dimension_type> predecessor;
+ compute_predecessors(predecessor);
+
+ // Due to the fictitious variable `0', the affine dimension is one
+ // less the number of equivalence classes.
+ dimension_type affine_dim = 0;
+ // Note: disregard the first equivalence class.
+ for (dimension_type i = 1; i <= space_dim; ++i)
+ if (predecessor[i] == i)
+ ++affine_dim;
+
+ return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) equalities.
+ shortest_path_closure_assign();
+
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ if (marked_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Compute leader information.
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+
+ // Go through the non-leaders to generate equality constraints.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const dimension_type leader = leaders[i];
+ if (i != leader) {
+ // Generate the constraint relating `i' and its leader.
+ if (leader == 0) {
+ // A unary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], numer, denom);
+ cgs.insert(denom*Variable(i-1) == numer);
+ }
+ else {
+ // A binary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], numer, denom);
+ cgs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+ }
+ }
+ }
+ return cgs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+ // Dimension-compatibility check.
+ if (c.space_dimension() > space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", c);
+
+ // Get rid of strict inequalities.
+ if (c.is_strict_inequality()) {
+ if (c.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ if (c.is_tautological())
+ return;
+ // Nontrivial strict inequalities are not allowed.
+ throw_invalid_argument("add_constraint(c)",
+ "strict inequalities are not allowed");
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Constraints that are not bounded differences are not allowed.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not a bounded difference constraint");
+
+ const Coefficient& inhomo = c.inhomogeneous_term();
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (not a strict inequality).
+ if (inhomo < 0
+ || (inhomo != 0 && c.is_equality()))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ if (negative)
+ neg_assign(coeff);
+
+ bool changed = false;
+ N& x = negative ? dbm[i][j] : dbm[j][i];
+ // Compute the bound for `x', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, inhomo, coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ N& y = negative ? dbm[j][i] : dbm[i][j];
+ // Also compute the bound for `y', rounding towards plus infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ neg_assign(minus_c_term, inhomo);
+ div_round_up(d, minus_c_term, coeff);
+ if (y > d) {
+ y = d;
+ changed = true;
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ // Dimension-compatibility check:
+ // the dimension of `cg' can not be greater than space_dim.
+ if (space_dimension() < cg_space_dim)
+ throw_dimension_incompatible("add_congruence(cg)", cg);
+
+ // Handle the case of proper congruences first.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_tautological())
+ return;
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ // Non-trivial and proper congruences are not allowed.
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a non-trivial, proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ add_constraint(c);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(!marked_empty());
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+ return;
+
+ const Coefficient& inhomo = c.inhomogeneous_term();
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint (might be a strict inequality).
+ if (inhomo < 0
+ || (c.is_equality() && inhomo != 0)
+ || (c.is_strict_inequality() && inhomo == 0))
+ set_empty();
+ return;
+ }
+
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ N& x = negative ? dbm[i][j] : dbm[j][i];
+ N& y = negative ? dbm[j][i] : dbm[i][j];
+ if (negative)
+ neg_assign(coeff);
+
+ bool changed = false;
+ // Compute the bound for `x', rounding towards plus infinity.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, inhomo, coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Also compute the bound for `y', rounding towards plus infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ neg_assign(minus_c_term, inhomo);
+ div_round_up(d, minus_c_term, coeff);
+ if (y > d) {
+ y = d;
+ changed = true;
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+ BD_Shape& x = *this;
+
+ const dimension_type x_space_dim = x.space_dimension();
+ const dimension_type y_space_dim = y.space_dimension();
+
+ // If `y' is an empty 0-dim space bounded difference shape,
+ // let `*this' become empty.
+ if (y_space_dim == 0 && y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+ // the dimension of the vector space.
+ if (x_space_dim == 0 && marked_empty()) {
+ dbm.grow(y_space_dim + 1);
+ PPL_ASSERT(OK());
+ return;
+ }
+ // First we increase the space dimension of `x' by adding
+ // `y.space_dimension()' new dimensions.
+ // The matrix for the new system of constraints is obtained
+ // by leaving the old system of constraints in the upper left-hand side
+ // and placing the constraints of `y' in the lower right-hand side,
+ // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+ // placed in the right position on the new matrix.
+ add_space_dimensions_and_embed(y_space_dim);
+ const dimension_type new_space_dim = x_space_dim + y_space_dim;
+ for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[0] = y.dbm[i - x_space_dim][0];
+ dbm[0][i] = y.dbm[0][i - x_space_dim];
+ for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+ dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+ }
+
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+ const BD_Shape<T>& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ throw_dimension_incompatible("contains(y)", y);
+
+ if (x_space_dim == 0) {
+ // The zero-dimensional empty shape only contains another
+ // zero-dimensional empty shape.
+ // The zero-dimensional universe shape contains any other
+ // zero-dimensional shape.
+ return marked_empty() ? y.marked_empty() : true;
+ }
+
+ /*
+ The `y' bounded difference shape must be closed. As an example,
+ consider the case where in `*this' we have the constraints
+
+ x1 - x2 <= 1,
+ x1 <= 3,
+ x2 <= 2,
+
+ and in `y' the constraints are
+
+ x1 - x2 <= 0,
+ x2 <= 1.
+
+ Without closure the (erroneous) analysis of the inhomogeneous terms
+ would conclude containment does not hold. Closing `y' results into
+ the "discovery" of the implicit constraint
+
+ x1 <= 1,
+
+ at which point the inhomogeneous terms can be examined to determine
+ that containment does hold.
+ */
+ y.shortest_path_closure_assign();
+ // An empty shape is contained in any other dimension-compatible shapes.
+ if (y.marked_empty())
+ return true;
+
+ // If `x' is empty it can not contain `y' (which is not empty).
+ if (x.is_empty())
+ return false;
+
+ // `*this' contains `y' if and only if every cell of `dbm'
+ // is greater than or equal to the correspondent one of `y.dbm'.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; )
+ if (x_dbm_i[j] < y_dbm_i[j])
+ return false;
+ }
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+ const dimension_type space_dim = space_dimension();
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If one of the two bounded difference shape is empty,
+ // then the two bounded difference shape are disjoint.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return true;
+ y.shortest_path_closure_assign();
+ if (y.marked_empty())
+ return true;
+
+ // Two BDSs are disjoint when their intersection is empty.
+ // That is if and only if there exists at least a bounded difference
+ // such that the upper bound of the bounded difference in the first
+ // BD_Shape is strictly less than the lower bound of
+ // the corresponding bounded difference in the second BD_Shape
+ // or vice versa.
+ // For example: let be
+ // in `*this': -a_j_i <= v_j - v_i <= a_i_j;
+ // and in `y': -b_j_i <= v_j - v_i <= b_i_j;
+ // `*this' and `y' are disjoint if
+ // 1.) a_i_j < -b_j_i or
+ // 2.) b_i_j < -a_j_i.
+ PPL_DIRTY_TEMP(N, tmp);
+ for (dimension_type i = space_dim+1; i-- > 0; ) {
+ const DB_Row<N>& x_i = dbm[i];
+ for (dimension_type j = space_dim+1; j-- > 0; ) {
+ neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+ if (x_i[j] < tmp)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+ if (marked_empty())
+ return false;
+
+ const dimension_type space_dim = space_dimension();
+ // If the BDS is non-empty and zero-dimensional,
+ // then it is necessarily the universe BDS.
+ if (space_dim == 0)
+ return true;
+
+ // A bounded difference shape defining the universe BDS can only
+ // contain trivial constraints.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (!is_plus_infinity(dbm_i[j]))
+ return false;
+ }
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+ shortest_path_closure_assign();
+ const dimension_type space_dim = space_dimension();
+ // A zero-dimensional or empty BDS is bounded.
+ if (marked_empty() || space_dim == 0)
+ return true;
+
+ // A bounded difference shape defining the bounded BDS never can
+ // contain trivial constraints.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (i != j)
+ if (is_plus_infinity(dbm_i[j]))
+ return false;
+ }
+
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+ // Force shortest-path closure.
+ if (is_empty())
+ return false;
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return true;
+
+ // A non-empty BD_Shape defined by integer constraints
+ // necessarily contains an integer point.
+ if (std::numeric_limits<T>::is_integer)
+ return true;
+
+ // Build an integer BD_Shape z with bounds at least as tight as
+ // those in *this and then recheck for emptiness.
+ BD_Shape<mpz_class> bds_z(space_dim);
+ typedef BD_Shape<mpz_class>::N Z;
+ bds_z.reset_shortest_path_closed();
+ PPL_DIRTY_TEMP(N, tmp);
+ bool all_integers = true;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<Z>& z_i = bds_z.dbm[i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ const N& dbm_i_j = dbm_i[j];
+ if (is_plus_infinity(dbm_i_j))
+ continue;
+ if (is_integer(dbm_i_j))
+ assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+ else {
+ all_integers = false;
+ Z& z_i_j = z_i[j];
+ // Copy dbm_i_j into z_i_j, but rounding downwards.
+ neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+ assign_r(z_i_j, tmp, ROUND_UP);
+ neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+ }
+ }
+ }
+ return all_integers || !bds_z.is_empty();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BD shape, we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The BD shape has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP(N, tmp);
+ Linear_Expression le = expr;
+ // Boolean to keep track of a variable `v' in expression `le'.
+ // If we can replace `v' by an expression using variables other
+ // than `v' and are already in `le', then this is set to true.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ // TODO: This loop can be optimized more, if needed, exploiting the
+ // (possible) sparseness of le.
+ for (dimension_type i = dbm.num_rows(); i-- > 1; ) {
+ const Variable v(i-1);
+ coeff = le.coefficient(v);
+ if (coeff == 0)
+ continue;
+
+ const DB_Row<N>& dbm_i = dbm[i];
+ // Check if `v' is constant in the BD shape.
+ assign_r(tmp, dbm_i[0], ROUND_NOT_NEEDED);
+ if (is_additive_inverse(dbm[0][i], tmp)) {
+ // If `v' is constant, replace it in `le' by the value.
+ numer_denom(tmp, numer, denom);
+ sub_mul_assign(le, coeff, v);
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ continue;
+ }
+ // Check the bounded differences with the other dimensions that
+ // have non-zero coefficient in `le'.
+ else {
+ bool constant_v = false;
+ for (Linear_Expression::const_iterator j = le.begin(),
+ j_end = le.lower_bound(Variable(i - 1)); j != j_end; ++j) {
+ const Variable vj = j.variable();
+ const dimension_type j_dim = vj.space_dimension();
+ assign_r(tmp, dbm_i[j_dim], ROUND_NOT_NEEDED);
+ if (is_additive_inverse(dbm[j_dim][i], tmp)) {
+ // The coefficient for `vj' in `le' is not 0
+ // and the difference with `v' in the BD shape is constant.
+ // So apply this equality to eliminate `v' in `le'.
+ numer_denom(tmp, numer, denom);
+ // Modifying le invalidates the iterators, but it's not a problem
+ // since we are going to exit the loop.
+ sub_mul_assign(le, coeff, v);
+ add_mul_assign(le, coeff, vj);
+ le *= denom;
+ le -= numer*coeff;
+ val_denom *= denom;
+ constant_v = true;
+ break;
+ }
+ }
+ if (!constant_v)
+ // The expression `expr' is not constant.
+ return false;
+ }
+ }
+
+ // The expression `expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+ // `var' should be one of the dimensions of the BD shape.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ shortest_path_closure_assign();
+ // A BD shape known to be empty constrains all variables.
+ // (Note: do not force emptiness check _yet_)
+ if (marked_empty())
+ return true;
+
+ // Check whether `var' is syntactically constrained.
+ const DB_Row<N>& dbm_v = dbm[var_space_dim];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ if (!is_plus_infinity(dbm_v[i])
+ || !is_plus_infinity(dbm[i][var_space_dim]))
+ return true;
+ }
+
+ // `var' is not syntactically constrained:
+ // now force an emptiness check.
+ return is_empty();
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+ PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+ PPL_ASSERT(predecessor.size() == 0);
+ // Variables are ordered according to their index.
+ // The vector `predecessor' is used to indicate which variable
+ // immediately precedes a given one in the corresponding equivalence class.
+ // The `leader' of an equivalence class is the element having minimum
+ // index: leaders are their own predecessors.
+ const dimension_type predecessor_size = dbm.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ predecessor.reserve(predecessor_size);
+ for (dimension_type i = 0; i < predecessor_size; ++i)
+ predecessor.push_back(i);
+ // Now compute actual predecessors.
+ for (dimension_type i = predecessor_size; i-- > 1; )
+ if (i == predecessor[i]) {
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i; j-- > 0; )
+ if (j == predecessor[j]
+ && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+ // Choose as predecessor the variable having the smaller index.
+ predecessor[i] = j;
+ break;
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+ PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+ PPL_ASSERT(leaders.size() == 0);
+ // Compute predecessor information.
+ compute_predecessors(leaders);
+ // Flatten the predecessor chains so as to obtain leaders.
+ PPL_ASSERT(leaders[0] == 0);
+ for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
+ const dimension_type leaders_i = leaders[i];
+ PPL_ASSERT(leaders_i <= i);
+ if (leaders_i != i) {
+ const dimension_type leaders_leaders_i = leaders[leaders_i];
+ PPL_ASSERT(leaders_leaders_i == leaders[leaders_leaders_i]);
+ leaders[i] = leaders_leaders_i;
+ }
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+ // If the BDS is empty, it is also reduced.
+ if (marked_empty())
+ return true;
+
+ const dimension_type space_dim = space_dimension();
+ // Zero-dimensional BDSs are necessarily reduced.
+ if (space_dim == 0)
+ return true;
+
+ // A shortest-path reduced dbm is just a dbm with an indication of
+ // those constraints that are redundant. If there is no indication
+ // of the redundant constraints, then it cannot be reduced.
+ if (!marked_shortest_path_reduced())
+ return false;
+
+ const BD_Shape x_copy = *this;
+ x_copy.shortest_path_closure_assign();
+ // If we just discovered emptiness, it cannot be reduced.
+ if (x_copy.marked_empty())
+ return false;
+
+ // The vector `leader' is used to indicate which variables are equivalent.
+ std::vector<dimension_type> leader(space_dim + 1);
+
+ // We store the leader.
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ leader[i] = i;
+
+ // Step 1: we store really the leader with the corrected value.
+ // We search for the equivalent or zero-equivalent variables.
+ // The variable(i-1) and variable(j-1) are equivalent if and only if
+ // m_i_j == -(m_j_i).
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j)
+ if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+ // Two equivalent variables have got the same leader
+ // (the smaller variable).
+ leader[j] = leader[i];
+ }
+
+ // Step 2: we check if there are redundant constraints in the zero_cycle
+ // free bounded difference shape, considering only the leaders.
+ // A constraint `c' is redundant, when there are two constraints such that
+ // their sum is the same constraint with the inhomogeneous term
+ // less than or equal to the `c' one.
+ PPL_DIRTY_TEMP(N, c);
+ for (dimension_type k = 0; k <= space_dim; ++k)
+ if (leader[k] == k) {
+ const DB_Row<N>& x_k = x_copy.dbm[k];
+ for (dimension_type i = 0; i <= space_dim; ++i)
+ if (leader[i] == i) {
+ const DB_Row<N>& x_i = x_copy.dbm[i];
+ const Bit_Row& redundancy_i = redundancy_dbm[i];
+ const N& x_i_k = x_i[k];
+ for (dimension_type j = 0; j <= space_dim; ++j)
+ if (leader[j] == j) {
+ const N& x_i_j = x_i[j];
+ if (!is_plus_infinity(x_i_j)) {
+ add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+ if (x_i_j >= c && !redundancy_i[j])
+ return false;
+ }
+ }
+ }
+ }
+
+ // The vector `var_conn' is used to check if there is a single cycle
+ // that connected all zero-equivalent variables between them.
+ // The value `space_dim + 1' is used to indicate that the equivalence
+ // class contains a single variable.
+ std::vector<dimension_type> var_conn(space_dim + 1);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ var_conn[i] = space_dim + 1;
+
+ // Step 3: we store really the `var_conn' with the right value, putting
+ // the variable with the selected variable is connected:
+ // we check the row of each variable:
+ // a- each leader could be connected with only zero-equivalent one,
+ // b- each non-leader with only another zero-equivalent one.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ // It count with how many variables the selected variable is
+ // connected.
+ dimension_type t = 0;
+ dimension_type leader_i = leader[i];
+ // Case a: leader.
+ if (leader_i == i) {
+ for (dimension_type j = 0; j <= space_dim; ++j) {
+ dimension_type leader_j = leader[j];
+ // Only the connectedness with equivalent variables
+ // is considered.
+ if (j != leader_j)
+ if (!redundancy_dbm[i][j]) {
+ if (t == 1)
+ // Two non-leaders cannot be connected with the same leader.
+ return false;
+ else
+ if (leader_j != i)
+ // The variables are not in the same equivalence class.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ }
+ }
+ // Case b: non-leader.
+ else {
+ for (dimension_type j = 0; j <= space_dim; ++j) {
+ if (!redundancy_dbm[i][j]) {
+ dimension_type leader_j = leader[j];
+ if (leader_i != leader_j)
+ // The variables are not in the same equivalence class.
+ return false;
+ else {
+ if (t == 1)
+ // The variables cannot be connected with the same leader.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ // A non-leader must be connected with
+ // another variable.
+ if (t == 0)
+ return false;
+ }
+ }
+ }
+ }
+
+ // The vector `just_checked' is used to check if
+ // a variable is already checked.
+ std::vector<bool> just_checked(space_dim + 1);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ just_checked[i] = false;
+
+ // Step 4: we check if there are single cycles that
+ // connected all the zero-equivalent variables between them.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ // We do not re-check the already considered single cycles.
+ if (!just_checked[i]) {
+ dimension_type v_con = var_conn[i];
+ // We consider only the equivalence classes with
+ // 2 or plus variables.
+ if (v_con != space_dim + 1) {
+ // There is a single cycle if taken a variable,
+ // we return to this same variable.
+ while (v_con != i) {
+ just_checked[v_con] = true;
+ v_con = var_conn[v_con];
+ // If we re-pass to an already considered variable,
+ // then we haven't a single cycle.
+ if (just_checked[v_con])
+ return false;
+ }
+ }
+ }
+ just_checked[i] = true;
+ }
+
+ // The system bounded differences is just reduced.
+ return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+ const bool from_above) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+
+ shortest_path_closure_assign();
+ // A zero-dimensional or empty BDS bounds everything.
+ if (space_dim == 0 || marked_empty())
+ return true;
+
+ // The constraint `c' is used to check if `expr' is a difference
+ // bounded and, in this case, to select the cell.
+ const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Check if `c' is a BD constraint.
+ if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ if (num_vars == 0)
+ // Dealing with a trivial constraint.
+ return true;
+ // Select the cell to be checked.
+ const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ return !is_plus_infinity(x);
+ }
+ else {
+ // Not a DB constraint: use the MIP solver.
+ Optimization_Mode mode_bounds
+ = from_above ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+ // Problem is known to be feasible.
+ return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim BDS first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BDS we simply return false.
+ if (marked_empty())
+ return false;
+
+ // The constraint `c' is used to check if `expr' is a difference
+ // bounded and, in this case, to select the cell.
+ const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ // Check if `c' is a BD constraint.
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ Optimization_Mode mode_max_min
+ = maximize ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ mip.optimal_value(ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ else
+ // Here`expr' is unbounded in `*this'.
+ return false;
+ }
+ else {
+ // Here `expr' is a bounded difference.
+ if (num_vars == 0) {
+ // Dealing with a trivial expression.
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+
+ // Select the cell to be checked.
+ const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ if (!is_plus_infinity(x)) {
+ // Compute the maximize/minimize of `expr'.
+ PPL_DIRTY_TEMP(N, d);
+ const Coefficient& b = expr.inhomogeneous_term();
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = maximize ? b : minus_b;
+ assign_r(d, sc_b, ROUND_UP);
+ // Set `coeff_expr' to the absolute value of coefficient of
+ // a variable in `expr'.
+ PPL_DIRTY_TEMP(N, coeff_expr);
+ PPL_ASSERT(i != 0);
+ const Coefficient& coeff_i = expr.get(Variable(i - 1));
+ const int sign_i = sgn(coeff_i);
+ if (sign_i > 0)
+ assign_r(coeff_expr, coeff_i, ROUND_UP);
+ else {
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+ neg_assign(minus_coeff_i, coeff_i);
+ assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+ }
+ // Approximating the maximum/minimum of `expr'.
+ add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+ numer_denom(d, ext_n, ext_d);
+ if (!maximize)
+ neg_assign(ext_n);
+ included = true;
+ return true;
+ }
+
+ // `expr' is unbounded.
+ return false;
+ }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included,
+ Generator& g) const {
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim BDS first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ g = point();
+ return true;
+ }
+ }
+
+ shortest_path_closure_assign();
+ // For an empty BDS we simply return false.
+ if (marked_empty())
+ return false;
+
+ Optimization_Mode mode_max_min
+ = maximize ? MAXIMIZATION : MINIMIZATION;
+ MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+ if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = mip.optimizing_point();
+ mip.evaluate_objective_function(g, ext_n, ext_d);
+ included = true;
+ return true;
+ }
+ // Here `expr' is unbounded in `*this'.
+ return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg.space_dimension() > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ // If the congruence is an equality, find the relation with
+ // the equivalent equality constraint.
+ if (cg.is_equality()) {
+ Constraint c(cg);
+ return relation_with(c);
+ }
+
+ shortest_path_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
+ Linear_Expression le = Linear_Expression(cg.expression());
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ bool min_included;
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_numer / min_denom;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_denom < min_numer)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_numer / max_denom;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_denom > max_numer)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+ const dimension_type c_space_dim = c.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ shortest_path_closure_assign();
+
+ if (marked_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ // Constraints that are not bounded differences.
+ // Use maximize() and minimize() to do much of the work.
+
+ // Find the linear expression for the constraint and use that to
+ // find if the expression is bounded from above or below and if it
+ // is, find the maximum and minimum values.
+ Linear_Expression le(c.expression());
+ le.set_inhomogeneous_term(Coefficient_zero());
+
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+ bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+ if (!bounded_above) {
+ if (!bounded_below)
+ return Poly_Con_Relation::strictly_intersects();
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_strict_inequality() || c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ }
+ if (!bounded_below) {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ max_numer += c.inhomogeneous_term() * max_denom;
+ min_numer += c.inhomogeneous_term() * min_denom;
+ switch (sgn(max_numer)) {
+ case 1:
+ switch (sgn(min_numer)) {
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (c.is_equality())
+ return Poly_Con_Relation::strictly_intersects();
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::strictly_intersects();
+ return Poly_Con_Relation::is_included();
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ PPL_UNREACHABLE;
+ break;
+ case 0:
+ if (min_numer == 0) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ }
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+
+ // Constraints that are bounded differences.
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+ }
+
+ // Select the cell to be checked for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ const N& x = negative ? dbm[i][j] : dbm[j][i];
+ const N& y = negative ? dbm[j][i] : dbm[i][j];
+ if (negative)
+ neg_assign(coeff);
+ // Deduce the relation/s of the constraint `c' of the form
+ // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+ // with the respectively constraints in `*this'
+ // `-y <= v - u <= x'.
+ // Let `d == c.inhomogeneous_term()/coeff'
+ // and `d1 == -c.inhomogeneous_term()/coeff'.
+ // The following variables of mpq_class type are used to be precise
+ // when the bds is defined by integer constraints.
+ PPL_DIRTY_TEMP(mpq_class, q_x);
+ PPL_DIRTY_TEMP(mpq_class, q_y);
+ PPL_DIRTY_TEMP(mpq_class, d);
+ PPL_DIRTY_TEMP(mpq_class, d1);
+ PPL_DIRTY_TEMP(mpq_class, c_denom);
+ PPL_DIRTY_TEMP(mpq_class, q_denom);
+ assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+ assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+ div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+ div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+ if (is_plus_infinity(x)) {
+ if (!is_plus_infinity(y)) {
+ // `*this' is in the following form:
+ // `-y <= v - u'.
+ // In this case `*this' is disjoint from `c' if
+ // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+ // `y < d1' (`y <= d1' if c is a strict equality).
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ numer_denom(y, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+ }
+
+ // Here `x' is not plus-infinity.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ numer_denom(x, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_x, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+ if (!is_plus_infinity(y)) {
+ numer_denom(y, numer, denom);
+ assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+ assign_r(q_y, numer, ROUND_NOT_NEEDED);
+ div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+ if (q_x == d && q_y == d1) {
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+ // `*this' is disjoint from `c' when
+ // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+ // `y < d1' (`y <= d1' if c is a strict equality).
+ if (q_y < d1)
+ return Poly_Con_Relation::is_disjoint();
+ if (q_y == d1 && c.is_strict_inequality())
+ return Poly_Con_Relation::is_disjoint();
+ }
+
+ // Here `y' can be also plus-infinity.
+ // If `c' is an equality, `*this' is disjoint from `c' if
+ // `x < d'.
+ if (d > q_x) {
+ if (c.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::is_included();
+ }
+
+ if (d == q_x && c.is_nonstrict_inequality())
+ return Poly_Con_Relation::is_included();
+
+ // In all other cases `*this' intersects `c'.
+ return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+ const dimension_type space_dim = space_dimension();
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ shortest_path_closure_assign();
+ // The empty BDS cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe BDS in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ const bool is_line = g.is_line();
+ const bool is_line_or_ray = g.is_line_or_ray();
+
+ // The relation between the BDS and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the BDS.
+ // To check if the generator satisfies all the constraints it's enough
+ // studying the sign of the scalar product between the generator and
+ // all the constraints in the BDS.
+
+ // Allocation of temporaries done once and for all.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(product);
+ // We find in `*this' all the constraints.
+ // TODO: This loop can be optimized more, if needed.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+ ? Coefficient_zero() : g.coefficient(Variable(i-1));
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Coefficient& g_coeff_x = (j > g_space_dim)
+ ? Coefficient_zero() : g.coefficient(Variable(j-1));
+ const N& dbm_ij = dbm_i[j];
+ const N& dbm_ji = dbm[j][i];
+ if (is_additive_inverse(dbm_ji, dbm_ij)) {
+ // We have one equality constraint: denom*x - denom*y = numer.
+ // Compute the scalar product.
+ numer_denom(dbm_ij, numer, denom);
+ product = g_coeff_y;
+ product -= g_coeff_x;
+ product *= denom;
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (product != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else {
+ // We have 0, 1 or 2 binary inequality constraint/s.
+ if (!is_plus_infinity(dbm_ij)) {
+ // We have the binary inequality constraint:
+ // denom*x - denom*y <= numer.
+ // Compute the scalar product.
+ numer_denom(dbm_ij, numer, denom);
+ product = g_coeff_y;
+ product -= g_coeff_x;
+ product *= denom;
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (is_line) {
+ if (product != 0)
+ // Lines must saturate all constraints.
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ if (product < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+
+ if (!is_plus_infinity(dbm_ji)) {
+ // We have the binary inequality constraint: denom*y - denom*x <= b.
+ // Compute the scalar product.
+ numer_denom(dbm_ji, numer, denom);
+ product = 0;
+ add_mul_assign(product, denom, g_coeff_x);
+ add_mul_assign(product, -denom, g_coeff_y);
+ if (!is_line_or_ray)
+ add_mul_assign(product, numer, g.divisor());
+ if (is_line) {
+ if (product != 0)
+ // Lines must saturate all constraints.
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ if (product < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+
+ // The generator satisfies all the constraints.
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+ // Do something only if necessary.
+ if (marked_empty() || marked_shortest_path_closed())
+ return;
+ const dimension_type num_dimensions = space_dimension();
+ // Zero-dimensional BDSs are necessarily shortest-path closed.
+ if (num_dimensions == 0)
+ return;
+
+ // Even though the BDS will not change, its internal representation
+ // is going to be modified by the Floyd-Warshall algorithm.
+ BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+ // Fill the main diagonal with zeros.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ PPL_DIRTY_TEMP(N, sum);
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ const DB_Row<N>& x_dbm_k = x.dbm[k];
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_dbm_i = x.dbm[i];
+ const N& x_dbm_i_k = x_dbm_i[k];
+ if (!is_plus_infinity(x_dbm_i_k))
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& x_dbm_k_j = x_dbm_k[j];
+ if (!is_plus_infinity(x_dbm_k_j)) {
+ // Rounding upward for correctness.
+ add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+ min_assign(x_dbm_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the BDS is empty if and only if there is a
+ // negative value on the main diagonal of `dbm'.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ N& x_dbm_hh = x.dbm[h][h];
+ if (sgn(x_dbm_hh) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_dbm_hh) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::incremental_shortest_path_closure_assign(Variable var) const {
+ // Do something only if necessary.
+ if (marked_empty() || marked_shortest_path_closed())
+ return;
+ const dimension_type num_dimensions = space_dimension();
+ PPL_ASSERT(var.id() < num_dimensions);
+
+ // Even though the BDS will not change, its internal representation
+ // is going to be modified by the incremental Floyd-Warshall algorithm.
+ BD_Shape& x = const_cast<BD_Shape&>(*this);
+
+ // Fill the main diagonal with zeros.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ // Using the incremental Floyd-Warshall algorithm.
+ PPL_DIRTY_TEMP(N, sum);
+ const dimension_type v = var.id() + 1;
+ DB_Row<N>& x_v = x.dbm[v];
+ // Step 1: Improve all constraints on variable `var'.
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ DB_Row<N>& x_k = x.dbm[k];
+ const N& x_v_k = x_v[k];
+ const N& x_k_v = x_k[v];
+ const bool x_v_k_finite = !is_plus_infinity(x_v_k);
+ const bool x_k_v_finite = !is_plus_infinity(x_k_v);
+ // Specialize inner loop based on finiteness info.
+ if (x_v_k_finite) {
+ if (x_k_v_finite) {
+ // Here both x_v_k and x_k_v are finite.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_k = x_i[k];
+ if (!is_plus_infinity(x_i_k)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ min_assign(x_i[v], sum);
+ }
+ const N& x_k_i = x_k[i];
+ if (!is_plus_infinity(x_k_i)) {
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v[i], sum);
+ }
+ }
+ }
+ else {
+ // Here x_v_k is finite, but x_k_v is not.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ const N& x_k_i = x_k[i];
+ if (!is_plus_infinity(x_k_i)) {
+ add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+ min_assign(x_v[i], sum);
+ }
+ }
+ }
+ }
+ else if (x_k_v_finite) {
+ // Here x_v_k is infinite, but x_k_v is finite.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_k = x_i[k];
+ if (!is_plus_infinity(x_i_k)) {
+ add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+ min_assign(x_i[v], sum);
+ }
+ }
+ }
+ else
+ // Here both x_v_k and x_k_v are infinite.
+ continue;
+ }
+
+ // Step 2: improve the other bounds by using the precise bounds
+ // for the constraints on `var'.
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& x_i = x.dbm[i];
+ const N& x_i_v = x_i[v];
+ if (!is_plus_infinity(x_i_v)) {
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& x_v_j = x_v[j];
+ if (!is_plus_infinity(x_v_j)) {
+ add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+ min_assign(x_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptiness: the BDS is empty if and only if there is a
+ // negative value on the main diagonal of `dbm'.
+ for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+ N& x_dbm_hh = x.dbm[h][h];
+ if (sgn(x_dbm_hh) < 0) {
+ x.set_empty();
+ return;
+ }
+ else {
+ PPL_ASSERT(sgn(x_dbm_hh) == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+ // Do something only if necessary.
+ if (marked_shortest_path_reduced())
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ // Zero-dimensional BDSs are necessarily reduced.
+ if (space_dim == 0)
+ return;
+
+ // First find the tightest constraints for this BDS.
+ shortest_path_closure_assign();
+
+ // If `*this' is empty, then there is nothing to reduce.
+ if (marked_empty())
+ return;
+
+ // Step 1: compute zero-equivalence classes.
+ // Variables corresponding to indices `i' and `j' are zero-equivalent
+ // if they lie on a zero-weight loop; since the matrix is shortest-path
+ // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+ std::vector<dimension_type> predecessor;
+ compute_predecessors(predecessor);
+ std::vector<dimension_type> leaders;
+ compute_leader_indices(predecessor, leaders);
+ const dimension_type num_leaders = leaders.size();
+
+ Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+ // Init all constraints to be redundant.
+ // TODO: provide an appropriate method to set multiple bits.
+ Bit_Row& red_0 = redundancy[0];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ red_0.set(j);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ redundancy[i] = red_0;
+
+ // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+ // subsystem of bounded differences having only leaders as variables.
+ PPL_DIRTY_TEMP(N, c);
+ for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leaders[l_i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ Bit_Row& redundancy_i = redundancy[i];
+ for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+ const dimension_type j = leaders[l_j];
+ if (redundancy_i[j]) {
+ const N& dbm_i_j = dbm_i[j];
+ redundancy_i.clear(j);
+ for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+ const dimension_type k = leaders[l_k];
+ add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+ if (dbm_i_j >= c) {
+ redundancy_i.set(j);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Step 3: flag non-redundant constraints in zero-equivalence classes.
+ // Each equivalence class must have a single 0-cycle connecting
+ // all the equivalent variables in increasing order.
+ std::deque<bool> dealt_with(space_dim + 1, false);
+ for (dimension_type i = space_dim + 1; i-- > 0; )
+ // We only need to deal with non-singleton zero-equivalence classes
+ // that haven't already been dealt with.
+ if (i != predecessor[i] && !dealt_with[i]) {
+ dimension_type j = i;
+ while (true) {
+ const dimension_type predecessor_j = predecessor[j];
+ if (j == predecessor_j) {
+ // We finally found the leader of `i'.
+ PPL_ASSERT(redundancy[i][j]);
+ redundancy[i].clear(j);
+ // Here we dealt with `j' (i.e., `predecessor_j'), but it is useless
+ // to update `dealt_with' because `j' is a leader.
+ break;
+ }
+ // We haven't found the leader of `i' yet.
+ PPL_ASSERT(redundancy[predecessor_j][j]);
+ redundancy[predecessor_j].clear(j);
+ dealt_with[predecessor_j] = true;
+ j = predecessor_j;
+ }
+ }
+
+ // Even though shortest-path reduction is not going to change the BDS,
+ // it might change its internal representation.
+ BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+ using std::swap;
+ swap(x.redundancy_dbm, redundancy);
+ x.set_shortest_path_reduced();
+
+ PPL_ASSERT(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The upper bound of a BD shape `bd' with an empty shape is `bd'.
+ y.shortest_path_closure_assign();
+ if (y.marked_empty())
+ return;
+ shortest_path_closure_assign();
+ if (marked_empty()) {
+ *this = y;
+ return;
+ }
+
+ // The bds-hull consists in constructing `*this' with the maximum
+ // elements selected from `*this' and `y'.
+ PPL_ASSERT(space_dim == 0 || marked_shortest_path_closed());
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (dbm_ij < y_dbm_ij)
+ dbm_ij = y_dbm_ij;
+ }
+ }
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::BFT00_upper_bound_assign_if_exact(const BD_Shape& y) {
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const BD_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x_space_dim == y.space_dimension());
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ // Implementation based on Algorithm 4.1 (page 6) in [BemporadFT00TR],
+ // tailored to the special case of BD shapes.
+
+ Variable epsilon(x_space_dim);
+ Linear_Expression zero_expr;
+ zero_expr.set_space_dimension(x_space_dim + 1);
+ Linear_Expression db_expr;
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Step 1: compute the constraint system for the envelope env(x,y)
+ // and put into x_cs_removed and y_cs_removed those non-redundant
+ // constraints that are not in the constraint system for env(x,y).
+ // While at it, also add the additional space dimension (epsilon).
+ Constraint_System env_cs;
+ Constraint_System x_cs_removed;
+ Constraint_System y_cs_removed;
+ x.shortest_path_reduction_assign();
+ y.shortest_path_reduction_assign();
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const Bit_Row& x_red_i = x.redundancy_dbm[i];
+ const Bit_Row& y_red_i = y.redundancy_dbm[i];
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+ if (x_red_i[j] && y_red_i[j])
+ continue;
+ if (!x_red_i[j]) {
+ const N& x_dbm_ij = x_dbm_i[j];
+ PPL_ASSERT(!is_plus_infinity(x_dbm_ij));
+ numer_denom(x_dbm_ij, numer, denom);
+ // Build skeleton DB constraint (having the right space dimension).
+ db_expr = zero_expr;
+ if (i > 0)
+ db_expr += Variable(i-1);
+ if (j > 0)
+ db_expr -= Variable(j-1);
+ if (denom != 1)
+ db_expr *= denom;
+ db_expr += numer;
+ if (x_dbm_ij >= y_dbm_i[j])
+ env_cs.insert(db_expr >= 0);
+ else {
+ db_expr += epsilon;
+ x_cs_removed.insert(db_expr == 0);
+ }
+ }
+ if (!y_red_i[j]) {
+ const N& y_dbm_ij = y_dbm_i[j];
+ const N& x_dbm_ij = x_dbm_i[j];
+ PPL_ASSERT(!is_plus_infinity(y_dbm_ij));
+ numer_denom(y_dbm_ij, numer, denom);
+ // Build skeleton DB constraint (having the right space dimension).
+ db_expr = zero_expr;
+ if (i > 0)
+ db_expr += Variable(i-1);
+ if (j > 0)
+ db_expr -= Variable(j-1);
+ if (denom != 1)
+ db_expr *= denom;
+ db_expr += numer;
+ if (y_dbm_ij >= x_dbm_ij) {
+ // Check if same constraint was added when considering x_dbm_ij.
+ if (!x_red_i[j] && x_dbm_ij == y_dbm_ij)
+ continue;
+ env_cs.insert(db_expr >= 0);
+ }
+ else {
+ db_expr += epsilon;
+ y_cs_removed.insert(db_expr == 0);
+ }
+ }
+ }
+ }
+
+ if (x_cs_removed.empty())
+ // No constraint of x was removed: y is included in x.
+ return true;
+ if (y_cs_removed.empty()) {
+ // No constraint of y was removed: x is included in y.
+ *this = y;
+ return true;
+ }
+
+ // In preparation to Step 4: build the common part of LP problems,
+ // i.e., the constraints corresponding to env(x,y),
+ // where the additional space dimension (epsilon) has to be maximized.
+ MIP_Problem env_lp(x_space_dim + 1, env_cs, epsilon, MAXIMIZATION);
+ // Pre-solve `env_lp' to later exploit incrementality.
+ env_lp.solve();
+ PPL_ASSERT(env_lp.solve() != UNFEASIBLE_MIP_PROBLEM);
+
+ // Implementing loop in Steps 3-6.
+ for (Constraint_System::const_iterator i = x_cs_removed.begin(),
+ i_end = x_cs_removed.end(); i != i_end; ++i) {
+ MIP_Problem lp_i(env_lp);
+ lp_i.add_constraint(*i);
+ // Pre-solve to exploit incrementality.
+ if (lp_i.solve() == UNFEASIBLE_MIP_PROBLEM)
+ continue;
+ for (Constraint_System::const_iterator j = y_cs_removed.begin(),
+ j_end = y_cs_removed.end(); j != j_end; ++j) {
+ MIP_Problem lp_ij(lp_i);
+ lp_ij.add_constraint(*j);
+ // Solve and check for a positive optimal value.
+ switch (lp_ij.solve()) {
+ case UNFEASIBLE_MIP_PROBLEM:
+ // CHECKME: is the following actually impossible?
+ PPL_UNREACHABLE;
+ return false;
+ case UNBOUNDED_MIP_PROBLEM:
+ return false;
+ case OPTIMIZED_MIP_PROBLEM:
+ lp_ij.optimal_value(numer, denom);
+ if (numer > 0)
+ return false;
+ break;
+ }
+ }
+ }
+
+ // The upper bound of x and y is indeed exact.
+ upper_bound_assign(y);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+template <bool integer_upper_bound>
+bool
+BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) {
+ PPL_COMPILE_TIME_CHECK(!integer_upper_bound
+ || std::numeric_limits<T>::is_integer,
+ "BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(y):"
+ " instantiating for integer upper bound,"
+ " but T in not an integer datatype.");
+
+ // FIXME, CHECKME: what about inexact computations?
+ // Declare a const reference to *this (to avoid accidental modifications).
+ const BD_Shape& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Private method: the caller must ensure the following.
+ PPL_ASSERT(x_space_dim == y.space_dimension());
+
+ // The zero-dim case is trivial.
+ if (x_space_dim == 0) {
+ upper_bound_assign(y);
+ return true;
+ }
+ // If `x' or `y' is (known to be) empty, the upper bound is exact.
+ if (x.marked_empty()) {
+ *this = y;
+ return true;
+ }
+ else if (y.is_empty())
+ return true;
+ else if (x.is_empty()) {
+ *this = y;
+ return true;
+ }
+
+ // Here both `x' and `y' are known to be non-empty.
+ x.shortest_path_reduction_assign();
+ y.shortest_path_reduction_assign();
+ PPL_ASSERT(x.marked_shortest_path_closed());
+ PPL_ASSERT(y.marked_shortest_path_closed());
+ // Pre-compute the upper bound of `x' and `y'.
+ BD_Shape<T> ub(x);
+ ub.upper_bound_assign(y);
+
+ PPL_DIRTY_TEMP(N, lhs);
+ PPL_DIRTY_TEMP(N, rhs);
+ PPL_DIRTY_TEMP(N, temp_zero);
+ assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, temp_one);
+ if (integer_upper_bound)
+ assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+ for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+ const DB_Row<N>& x_i = x.dbm[i];
+ const Bit_Row& x_red_i = x.redundancy_dbm[i];
+ const DB_Row<N>& y_i = y.dbm[i];
+ const DB_Row<N>& ub_i = ub.dbm[i];
+ for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+ // Check redundancy of x_i_j.
+ if (x_red_i[j])
+ continue;
+ // By non-redundancy, we know that i != j.
+ PPL_ASSERT(i != j);
+ const N& x_i_j = x_i[j];
+ if (x_i_j < y_i[j]) {
+ for (dimension_type k = x_space_dim + 1; k-- > 0; ) {
+ const DB_Row<N>& x_k = x.dbm[k];
+ const DB_Row<N>& y_k = y.dbm[k];
+ const Bit_Row& y_red_k = y.redundancy_dbm[k];
+ const DB_Row<N>& ub_k = ub.dbm[k];
+ const N& ub_k_j = (k == j) ? temp_zero : ub_k[j];
+ for (dimension_type ell = x_space_dim + 1; ell-- > 0; ) {
+ // Check redundancy of y_k_ell.
+ if (y_red_k[ell])
+ continue;
+ // By non-redundancy, we know that k != ell.
+ PPL_ASSERT(k != ell);
+ const N& y_k_ell = y_k[ell];
+ if (y_k_ell < x_k[ell]) {
+ // The first condition in BHZ09 theorem holds;
+ // now check for the second condition.
+ add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+ const N& ub_i_ell = (i == ell) ? temp_zero : ub_i[ell];
+ add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+ if (integer_upper_bound) {
+ // Note: adding 1 rather than 2 (as in Theorem 5.3)
+ // so as to later test for < rather than <=.
+ add_assign_r(lhs, lhs, temp_one, ROUND_NOT_NEEDED);
+ }
+ // Testing for < in both the rational and integer case.
+ if (lhs < rhs)
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+ // The upper bound of x and y is indeed exact.
+ m_swap(ub);
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ BD_Shape new_bd_shape(space_dim, EMPTY);
+
+ BD_Shape& x = *this;
+
+ x.shortest_path_closure_assign();
+ // The difference of an empty bounded difference shape
+ // and of a bounded difference shape `p' is empty.
+ if (x.marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // The difference of a bounded difference shape `p'
+ // and an empty bounded difference shape is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both bounded difference shapes are zero-dimensional,
+ // then at this point they are necessarily universe system of
+ // bounded differences, so that their difference is empty.
+ if (space_dim == 0) {
+ x.set_empty();
+ return;
+ }
+
+ // TODO: This is just an executable specification.
+ // Have to find a more efficient method.
+ if (y.contains(x)) {
+ x.set_empty();
+ return;
+ }
+
+ // We take a constraint of the system y at the time and we
+ // consider its complementary. Then we intersect the union
+ // of these complementary constraints with the system x.
+ const Constraint_System& y_cs = y.constraints();
+ for (Constraint_System::const_iterator i = y_cs.begin(),
+ y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+ const Constraint& c = *i;
+ // If the bounded difference shape `x' is included
+ // in the bounded difference shape defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty bounded difference shape,
+ // and as we would obtain a result that is less precise
+ // than the bds-difference.
+ if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+ continue;
+ BD_Shape z = x;
+ const Linear_Expression e(c.expression());
+ z.add_constraint(e <= 0);
+ if (!z.is_empty())
+ new_bd_shape.upper_bound_assign(z);
+ if (c.is_equality()) {
+ z = x;
+ z.add_constraint(e >= 0);
+ if (!z.is_empty())
+ new_bd_shape.upper_bound_assign(z);
+ }
+ }
+ *this = new_bd_shape;
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+ BD_Shape& x = *this;
+ const dimension_type dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (dim != y.space_dimension())
+ throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (dim == 0) {
+ if (y.marked_empty()) {
+ x.set_zero_dim_univ();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case where `x' contains `y'
+ // (this subsumes the case when `y' is empty).
+ y.shortest_path_closure_assign();
+ if (x.contains(y)) {
+ BD_Shape<T> res(dim, UNIVERSE);
+ x.m_swap(res);
+ return false;
+ }
+
+ // Filter away the case where `x' is empty.
+ x.shortest_path_closure_assign();
+ if (x.marked_empty()) {
+ // Search for a constraint of `y' that is not a tautology.
+ dimension_type i;
+ dimension_type j;
+ // Prefer unary constraints.
+ i = 0;
+ const DB_Row<N>& y_dbm_0 = y.dbm[0];
+ for (j = 1; j <= dim; ++j) {
+ if (!is_plus_infinity(y_dbm_0[j]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ j = 0;
+ for (i = 1; i <= dim; ++i) {
+ if (!is_plus_infinity(y.dbm[i][0]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ // Then search binary constraints.
+ for (i = 1; i <= dim; ++i) {
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (j = 1; j <= dim; ++j)
+ if (!is_plus_infinity(y_dbm_i[j]))
+ // FIXME: if N is a float or bounded integer type, then
+ // we also need to check that we are actually able to construct
+ // a constraint inconsistent with respect to this one.
+ goto found;
+ }
+ // Not found: we were not able to build a constraint contradicting
+ // one of the constraints in `y': `x' cannot be enlarged.
+ return false;
+
+ found:
+ // Found: build a new BDS contradicting the constraint found.
+ PPL_ASSERT(i <= dim && j <= dim && (i > 0 || j > 0));
+ BD_Shape<T> res(dim, UNIVERSE);
+ PPL_DIRTY_TEMP(N, tmp);
+ assign_r(tmp, 1, ROUND_UP);
+ add_assign_r(tmp, tmp, y.dbm[i][j], ROUND_UP);
+ PPL_ASSERT(!is_plus_infinity(tmp));
+ // CHECKME: round down is really meant.
+ neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN);
+ x.m_swap(res);
+ return false;
+ }
+
+ // Here `x' and `y' are not empty and shortest-path closed;
+ // also, `x' does not contain `y'.
+ // Let `target' be the intersection of `x' and `y'.
+ BD_Shape<T> target = x;
+ target.intersection_assign(y);
+ const bool bool_result = !target.is_empty();
+
+ // Compute a reduced dbm for `x' and ...
+ x.shortest_path_reduction_assign();
+ // ... count the non-redundant constraints.
+ dimension_type x_num_non_redundant = (dim+1)*(dim+1);
+ for (dimension_type i = dim + 1; i-- > 0; )
+ x_num_non_redundant -= x.redundancy_dbm[i].count_ones();
+ PPL_ASSERT(x_num_non_redundant > 0);
+
+ // Let `yy' be a copy of `y': we will keep adding to `yy'
+ // the non-redundant constraints of `x',
+ // stopping as soon as `yy' becomes equal to `target'.
+ BD_Shape<T> yy = y;
+
+ // The constraints added to `yy' will be recorded in `res' ...
+ BD_Shape<T> res(dim, UNIVERSE);
+ // ... and we will count them too.
+ dimension_type res_num_non_redundant = 0;
+
+ // Compute leader information for `x'.
+ std::vector<dimension_type> x_leaders;
+ x.compute_leaders(x_leaders);
+
+ // First go through the unary equality constraints.
+ const DB_Row<N>& x_dbm_0 = x.dbm[0];
+ DB_Row<N>& yy_dbm_0 = yy.dbm[0];
+ DB_Row<N>& res_dbm_0 = res.dbm[0];
+ for (dimension_type j = 1; j <= dim; ++j) {
+ // Unary equality constraints are encoded in entries dbm_0j and dbm_j0
+ // provided index j has special variable index 0 as its leader.
+ if (x_leaders[j] != 0)
+ continue;
+ PPL_ASSERT(!is_plus_infinity(x_dbm_0[j]));
+ if (x_dbm_0[j] < yy_dbm_0[j]) {
+ res_dbm_0[j] = x_dbm_0[j];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_dbm_0[j] = x_dbm_0[j];
+ yy.reset_shortest_path_closed();
+ }
+ PPL_ASSERT(!is_plus_infinity(x.dbm[j][0]));
+ if (x.dbm[j][0] < yy.dbm[j][0]) {
+ res.dbm[j][0] = x.dbm[j][0];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[j][0] = x.dbm[j][0];
+ yy.reset_shortest_path_closed();
+ }
+ // Restore shortest-path closure, if it was lost.
+ if (!yy.marked_shortest_path_closed()) {
+ Variable var_j(j-1);
+ yy.incremental_shortest_path_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Go through the binary equality constraints.
+ // Note: no need to consider the case i == 1.
+ for (dimension_type i = 2; i <= dim; ++i) {
+ const dimension_type j = x_leaders[i];
+ if (j == i || j == 0)
+ continue;
+ PPL_ASSERT(!is_plus_infinity(x.dbm[i][j]));
+ if (x.dbm[i][j] < yy.dbm[i][j]) {
+ res.dbm[i][j] = x.dbm[i][j];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[i][j] = x.dbm[i][j];
+ yy.reset_shortest_path_closed();
+ }
+ PPL_ASSERT(!is_plus_infinity(x.dbm[j][i]));
+ if (x.dbm[j][i] < yy.dbm[j][i]) {
+ res.dbm[j][i] = x.dbm[j][i];
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy.dbm[j][i] = x.dbm[j][i];
+ yy.reset_shortest_path_closed();
+ }
+ // Restore shortest-path closure, if it was lost.
+ if (!yy.marked_shortest_path_closed()) {
+ Variable var_j(j-1);
+ yy.incremental_shortest_path_closure_assign(var_j);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+
+ // Finally go through the (proper) inequality constraints:
+ // both indices i and j should be leaders.
+ for (dimension_type i = 0; i <= dim; ++i) {
+ if (i != x_leaders[i])
+ continue;
+ const DB_Row<N>& x_dbm_i = x.dbm[i];
+ const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i];
+ DB_Row<N>& yy_dbm_i = yy.dbm[i];
+ DB_Row<N>& res_dbm_i = res.dbm[i];
+ for (dimension_type j = 0; j <= dim; ++j) {
+ if (j != x_leaders[j] || x_redundancy_dbm_i[j])
+ continue;
+ N& yy_dbm_ij = yy_dbm_i[j];
+ const N& x_dbm_ij = x_dbm_i[j];
+ if (x_dbm_ij < yy_dbm_ij) {
+ res_dbm_i[j] = x_dbm_ij;
+ ++res_num_non_redundant;
+ // Tighten context `yy' using the newly added constraint.
+ yy_dbm_ij = x_dbm_ij;
+ yy.reset_shortest_path_closed();
+ PPL_ASSERT(i > 0 || j > 0);
+ Variable var(((i > 0) ? i : j) - 1);
+ yy.incremental_shortest_path_closure_assign(var);
+ if (target.contains(yy)) {
+ // Target reached: swap `x' and `res' if needed.
+ if (res_num_non_redundant < x_num_non_redundant) {
+ res.reset_shortest_path_closed();
+ x.m_swap(res);
+ }
+ return bool_result;
+ }
+ }
+ }
+ }
+ // This point should be unreachable.
+ PPL_UNREACHABLE;
+ return false;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ const dimension_type new_space_dim = space_dim + m;
+ const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+ // To embed an n-dimension space BDS in a (n+m)-dimension space,
+ // we just add `m' rows and columns in the bounded difference shape,
+ // initialized to PLUS_INFINITY.
+ dbm.grow(new_space_dim + 1);
+
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // If `*this' was the zero-dim space universe BDS,
+ // the we can set the shortest-path closure flag.
+ if (was_zero_dim_univ)
+ set_shortest_path_closed();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+
+ // If `*this' was zero-dimensional, then we add `m' rows and columns.
+ // If it also was non-empty, then we zero all the added elements
+ // and set the flag for shortest-path closure.
+ if (space_dim == 0) {
+ dbm.grow(m + 1);
+ if (!marked_empty()) {
+ for (dimension_type i = m + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = m + 1; j-- > 0; )
+ if (i != j)
+ assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+ }
+ set_shortest_path_closed();
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // To project an n-dimension space bounded difference shape
+ // in a (n+m)-dimension space, we add `m' rows and columns.
+ // In the first row and column of the matrix we add `zero' from
+ // the (n+1)-th position to the end.
+ const dimension_type new_space_dim = space_dim + m;
+ dbm.grow(new_space_dim + 1);
+
+ // Bottom of the matrix and first row.
+ DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+ assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+ assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+ }
+
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any BDS is a no-op.
+ // Note that this case also captures the only legal removal of
+ // space dimensions from a BDS in a 0-dim space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type old_space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (old_space_dim < min_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+ // Shortest-path closure is necessary to keep precision.
+ shortest_path_closure_assign();
+
+ // When removing _all_ dimensions from a BDS, we obtain the
+ // zero-dimensional BDS.
+ const dimension_type new_space_dim = old_space_dim - vars.size();
+ if (new_space_dim == 0) {
+ dbm.resize_no_copy(1);
+ if (!marked_empty())
+ // We set the zero_dim_univ flag.
+ set_zero_dim_univ();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Handle the case of an empty BD_Shape.
+ if (marked_empty()) {
+ dbm.resize_no_copy(new_space_dim + 1);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // For each variable to remove, we fill the corresponding column and
+ // row by shifting respectively left and above those
+ // columns and rows, that will not be removed.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ dimension_type dst = *vsi + 1;
+ dimension_type src = dst + 1;
+ for (++vsi; vsi != vsi_end; ++vsi) {
+ const dimension_type vsi_next = *vsi + 1;
+ // All other columns and rows are moved respectively to the left
+ // and above.
+ while (src < vsi_next) {
+ using std::swap;
+ swap(dbm[dst], dbm[src]);
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ assign_or_swap(dbm_i[dst], dbm_i[src]);
+ }
+ ++dst;
+ ++src;
+ }
+ ++src;
+ }
+
+ // Moving the remaining rows and columns.
+ while (src <= old_space_dim) {
+ using std::swap;
+ swap(dbm[dst], dbm[src]);
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ assign_or_swap(dbm_i[dst], dbm_i[src]);
+ }
+ ++src;
+ ++dst;
+ }
+
+ // Update the space dimension.
+ dbm.resize_no_copy(new_space_dim + 1);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+ const dimension_type space_dim = space_dimension();
+ // TODO: this implementation is just an executable specification.
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the BDS becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If we are going to actually reduce the space dimension,
+ // then shortest-path closure is required to keep precision.
+ if (new_space_dim < space_dim)
+ shortest_path_closure_assign();
+
+ // If the BDS is empty, then it is sufficient to adjust the
+ // space dimension of the bounded difference shape.
+ if (marked_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // Shortest-path closure is maintained (if it was holding).
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ // We create a new matrix with the new space dimension.
+ DB_Matrix<N> x(new_space_dim+1);
+ // First of all we must map the unary constraints, because
+ // there is the fictitious variable `zero', that can't be mapped
+ // at all.
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& x_0 = x[0];
+ for (dimension_type j = 1; j <= space_dim; ++j) {
+ dimension_type new_j;
+ if (pfunc.maps(j - 1, new_j)) {
+ assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+ assign_or_swap(x[new_j + 1][0], dbm[j][0]);
+ }
+ }
+ // Now we map the binary constraints, exchanging the indexes.
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ dimension_type new_i;
+ if (pfunc.maps(i - 1, new_i)) {
+ DB_Row<N>& dbm_i = dbm[i];
+ ++new_i;
+ DB_Row<N>& x_new_i = x[new_i];
+ for (dimension_type j = i+1; j <= space_dim; ++j) {
+ dimension_type new_j;
+ if (pfunc.maps(j - 1, new_j)) {
+ ++new_j;
+ assign_or_swap(x_new_i[new_j], dbm_i[j]);
+ assign_or_swap(x[new_j][new_i], dbm[j][i]);
+ }
+ }
+ }
+ }
+
+ using std::swap;
+ swap(dbm, x);
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two bounded difference shapes is empty,
+ // the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If both bounded difference shapes are zero-dimensional,
+ // then at this point they are necessarily non-empty,
+ // so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // To intersect two bounded difference shapes we compare
+ // the constraints and we choose the less values.
+ bool changed = false;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (dbm_ij > y_dbm_ij) {
+ dbm_ij = y_dbm_ij;
+ changed = true;
+ }
+ }
+ }
+
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+ Iterator first, Iterator last,
+ unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If both bounded difference shapes are zero-dimensional,
+ // since `*this' contains `y', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ shortest_path_closure_assign();
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ BD_Shape<T> x_tmp(*this);
+ x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Compare each constraint in `y' to the corresponding one in `*this'.
+ // The constraint in `*this' is kept as is if it is stronger than or
+ // equal to the constraint in `y'; otherwise, the inhomogeneous term
+ // of the constraint in `*this' is further compared with elements taken
+ // from a sorted container (the stop-points, provided by the user), and
+ // is replaced by the first entry, if any, which is greater than or equal
+ // to the inhomogeneous term. If no such entry exists, the constraint
+ // is removed altogether.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (y_dbm_ij < dbm_ij) {
+ Iterator k = std::lower_bound(first, last, dbm_ij);
+ if (k != last) {
+ if (dbm_ij < *k)
+ assign_r(dbm_ij, *k, ROUND_UP);
+ }
+ else
+ assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ }
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+ shortest_path_closure_assign();
+ bool changed = false;
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+ PPL_DIRTY_TEMP(N, d);
+ PPL_DIRTY_TEMP(N, d1);
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ // Constraints that are not bounded differences are ignored.
+ if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+ // Select the cell to be modified for the "<=" part of the constraint,
+ // and set `coeff' to the absolute value of itself.
+ const bool negative = (coeff < 0);
+ const N& x = negative ? dbm[i][j] : dbm[j][i];
+ const N& y = negative ? dbm[j][i] : dbm[i][j];
+ DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+ if (negative)
+ neg_assign(coeff);
+ // Compute the bound for `x', rounding towards plus infinity.
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x <= d) {
+ if (c.is_inequality()) {
+ N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+ if (ls_x > d) {
+ ls_x = d;
+ changed = true;
+ }
+ }
+ else {
+ // Compute the bound for `y', rounding towards plus infinity.
+ neg_assign(minus_c_term, c.inhomogeneous_term());
+ div_round_up(d1, minus_c_term, coeff);
+ if (y <= d1) {
+ N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+ N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+ if ((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+ ls_x = d;
+ ls_y = d1;
+ changed = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure of the bounded difference shape.
+ if (changed && limiting_shape.marked_shortest_path_closed())
+ limiting_shape.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+
+ // `cs' must be dimension-compatible with the two systems
+ // of bounded differences.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+ "cs is space_dimension incompatible");
+
+ // Strict inequalities not allowed.
+ if (cs.has_strict_inequalities())
+ throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+ "cs has strict inequalities");
+
+ // The limited CC76-extrapolation between two systems of bounded
+ // differences in a zero-dimensional space is a system of bounded
+ // differences in a zero-dimensional space, too.
+ if (space_dim == 0)
+ return;
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+ get_limiting_shape(cs, limiting_shape);
+ CC76_extrapolation_assign(y, tp);
+ intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // Compute the affine dimension of `y'.
+ const dimension_type y_affine_dim = y.affine_dimension();
+ // If the affine dimension of `y' is zero, then either `y' is
+ // zero-dimensional, or it is empty, or it is a singleton.
+ // In all cases, due to the inclusion hypothesis, the result is `*this'.
+ if (y_affine_dim == 0)
+ return;
+
+ // If the affine dimension has changed, due to the inclusion hypothesis,
+ // the result is `*this'.
+ const dimension_type x_affine_dim = affine_dimension();
+ PPL_ASSERT(x_affine_dim >= y_affine_dim);
+ if (x_affine_dim != y_affine_dim)
+ return;
+
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ BD_Shape<T> x_tmp(*this);
+ x_tmp.BHMZ05_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!contains(x_tmp))
+ --(*tp);
+ return;
+ }
+
+ // Here no token is available.
+ PPL_ASSERT(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+ // Minimize `y'.
+ y.shortest_path_reduction_assign();
+
+ // Extrapolate unstable bounds, taking into account redundancy in `y'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ // Note: in the following line the use of `!=' (as opposed to
+ // the use of `<' that would seem -but is not- equivalent) is
+ // intentional.
+ if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+ assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ // NOTE: this will also reset the shortest-path reduction flag,
+ // even though the dbm is still in reduced form. However, the
+ // current implementation invariant requires that any reduced dbm
+ // is closed too.
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two systems
+ // of bounded differences.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+ "cs is space-dimension incompatible");
+
+ // Strict inequalities are not allowed.
+ if (cs.has_strict_inequalities())
+ throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+ "cs has strict inequalities");
+
+ // The limited BHMZ05-extrapolation between two systems of bounded
+ // differences in a zero-dimensional space is a system of bounded
+ // differences in a zero-dimensional space, too.
+ if (space_dim == 0)
+ return;
+
+ // We assume that `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+ get_limiting_shape(cs, limiting_shape);
+ BHMZ05_widening_assign(y, tp);
+ intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // We assume that `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both bounded difference shapes are zero-dimensional,
+ // since `y' contains `*this', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ y.shortest_path_closure_assign();
+ // If `y' is empty, since `y' contains `this', `*this' is empty too.
+ if (y.marked_empty())
+ return;
+ shortest_path_closure_assign();
+ // If `*this' is empty, we return.
+ if (marked_empty())
+ return;
+
+ // Replace each constraint in `*this' by the corresponding constraint
+ // in `y' if the corresponding inhomogeneous terms are both finite.
+ bool changed = false;
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const DB_Row<N>& y_dbm_i = y.dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ N& dbm_ij = dbm_i[j];
+ const N& y_dbm_ij = y_dbm_i[j];
+ if (!is_plus_infinity(dbm_ij)
+ && !is_plus_infinity(y_dbm_ij)
+ && dbm_ij != y_dbm_ij) {
+ dbm_ij = y_dbm_ij;
+ changed = true;
+ }
+ }
+ }
+ if (changed && marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+ const dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& ub_v) {
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(ub_v));
+ // Deduce constraints of the form `v - u', where `u != v'.
+ // Note: the shortest-path closure is able to deduce the constraint
+ // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+ // played an active role in the computation of the upper bound for `v',
+ // i.e., if the corresponding coefficient `q == expr_u/denom' is
+ // greater than zero. In particular:
+ // if `q >= 1', then `v - u <= ub_v - ub_u';
+ // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+ const dimension_type u_dim = u.variable().space_dimension();
+ if (u_dim == v)
+ continue;
+ const Coefficient& expr_u = *u;
+ if (expr_u < 0)
+ continue;
+ PPL_ASSERT(expr_u > 0);
+ if (expr_u >= sc_denom)
+ // Deducing `v - u <= ub_v - ub_u'.
+ sub_assign_r(dbm[u_dim][v], ub_v, dbm_0[u_dim], ROUND_UP);
+ else {
+ DB_Row<N>& dbm_u = dbm[u_dim];
+ const N& dbm_u0 = dbm_u[0];
+ if (!is_plus_infinity(dbm_u0)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+ // rational coefficient of `u' in `sc_expr/sc_denom',
+ // the upper bound for `v - u' is computed as
+ // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+ // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+ assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(ub_u, dbm_0[u_dim], ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+ // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, minus_lb_u, ROUND_UP);
+ // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+ add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+ const dimension_type last_v,
+ const Linear_Expression& sc_expr,
+ Coefficient_traits::const_reference sc_denom,
+ const N& minus_lb_v) {
+ PPL_ASSERT(sc_denom > 0);
+ PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+ // Deduce constraints of the form `u - v', where `u != v'.
+ // Note: the shortest-path closure is able to deduce the constraint
+ // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+ // played an active role in the computation of the lower bound for `v',
+ // i.e., if the corresponding coefficient `q == expr_u/denom' is
+ // greater than zero. In particular:
+ // if `q >= 1', then `u - v <= lb_u - lb_v';
+ // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+ PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+ assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(mpq_class, ub_u);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+ PPL_DIRTY_TEMP(N, up_approx);
+ // No need to consider indices greater than `last_v'.
+ for (Linear_Expression::const_iterator u = sc_expr.begin(),
+ u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+ const Variable u_var = u.variable();
+ const dimension_type u_dim = u_var.space_dimension();
+ if (u_var.space_dimension() == v)
+ continue;
+ const Coefficient& expr_u = *u;
+ if (expr_u < 0)
+ continue;
+ PPL_ASSERT(expr_u > 0);
+ if (expr_u >= sc_denom)
+ // Deducing `u - v <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ sub_assign_r(dbm_v[u_dim], minus_lb_v, dbm[u_dim][0], ROUND_UP);
+ else {
+ const N& dbm_0u = dbm_0[u_dim];
+ if (!is_plus_infinity(dbm_0u)) {
+ // Let `ub_u' and `lb_u' be the known upper and lower bound
+ // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+ // rational coefficient of `u' in `sc_expr/sc_denom',
+ // the upper bound for `u - v' is computed as
+ // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+ // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+ assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+ assign_r(minus_lb_u, dbm[u_dim][0], ROUND_NOT_NEEDED);
+ // Compute `ub_u - lb_u'.
+ add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+ // Compute `ub_u - q * (ub_u - lb_u)'.
+ sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+ assign_r(up_approx, ub_u, ROUND_UP);
+ // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+ add_assign_r(dbm_v[u_dim], up_approx, minus_lb_v, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+ PPL_ASSERT(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+ PPL_ASSERT(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+ // Dimension-compatibility check.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("unconstrain(var)", var_space_dim);
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) constraints.
+ shortest_path_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ forget_all_dbm_constraints(var_space_dim);
+ // Shortest-path closure is preserved, but not reduction.
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case captures the only legal cylindrification in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // Shortest-path closure is necessary to detect emptiness
+ // and all (possibly implicit) constraints.
+ shortest_path_closure_assign();
+
+ // If the shape is empty, this is a no-op.
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+ forget_all_dbm_constraints(*vsi + 1);
+ // Shortest-path closure is preserved, but not reduction.
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ PPL_ASSERT(denominator != 0);
+ PPL_ASSERT(space_dimension() >= expr.space_dimension());
+ const dimension_type v = var.id() + 1;
+ PPL_ASSERT(v <= space_dimension());
+ PPL_ASSERT(expr.coefficient(var) == 0);
+ PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Since we are only able to record bounded differences, we can
+ // precisely deal with the case of a single variable only if its
+ // coefficient (taking into account the denominator) is 1.
+ // If this is not the case, we fall back to the general case
+ // so as to over-approximate the constraint.
+ if (t == 1 && expr.get(Variable(w - 1)) != denominator)
+ t = 2;
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+ // - If t == 2, the `expr' is of the general form.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ switch (relsym) {
+ case EQUAL:
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ return;
+ }
+
+ if (t == 1) {
+ // Case 2: expr == a*w + b, w != v, a == denominator.
+ PPL_ASSERT(expr.get(Variable(w - 1)) == denominator);
+ PPL_DIRTY_TEMP(N, d);
+ switch (relsym) {
+ case EQUAL:
+ // Add the new constraint `v - w <= b/denominator'.
+ div_round_up(d, b, denominator);
+ add_dbm_constraint(w, v, d);
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ div_round_up(d, b, minus_denom);
+ add_dbm_constraint(v, w, d);
+ break;
+ case LESS_OR_EQUAL:
+ // Add the new constraint `v - w <= b/denominator'.
+ div_round_up(d, b, denominator);
+ add_dbm_constraint(w, v, d);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ div_round_up(d, b, minus_denom);
+ add_dbm_constraint(v, w, d);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ return;
+ }
+
+ // Here t == 2, so that either
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+ // expr == a*w + b, w != v and a != denominator.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ // Speculative allocation of temporaries that are used in most
+ // of the computational traces starting from this point (also loops).
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ PPL_DIRTY_TEMP(N, coeff_i);
+
+ switch (relsym) {
+ case EQUAL:
+ {
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type neg_pinf_count = 0;
+
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const dimension_type i_dim = i.variable().space_dimension();
+ const Coefficient& sc_i = *i;
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(approx_i))
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ else {
+ ++pinf_count;
+ pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(approx_minus_i))
+ add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pinf_count <= 1) {
+ const N& approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(approx_minus_i))
+ add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+ else {
+ ++pinf_count;
+ pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(approx_i))
+ add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+
+ // Exploit the upper approximation, if possible.
+ if (pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_denom != 1)
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ // Add the upper bound constraint, if meaningful.
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ dbm[0][v] = sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else
+ // Here `pinf_count == 1'.
+ if (pinf_index != v
+ && sc_expr.get(Variable(pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pinf_index <= sum'.
+ dbm[pinf_index][v] = sum;
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_denom != 1)
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ DB_Row<N>& dbm_v = dbm[v];
+ dbm_v[0] = neg_sum;
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ dbm[v][neg_pinf_index] = neg_sum;
+ }
+ }
+ break;
+
+ case LESS_OR_EQUAL:
+ // Compute an upper approximation for `expr' into `sum',
+ // taking into account the sign of `denominator'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc - denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ add_dbm_constraint(0, v, sum);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_OR_EQUAL:
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_denom' is known to be positive,
+ // this amounts to rounding downwards, which is achieved by rounding
+ // upwards `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+ add_dbm_constraint(v, 0, sum);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ add_dbm_constraint(v, pinf_index, sum);
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of the shape.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_denom);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ if (w == v) {
+ // `expr' is of the form: a*v + b.
+ if (a == denominator) {
+ if (b == 0)
+ // The transformation is the identity function.
+ return;
+ else {
+ // Translate all the constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+ N& dbm_iv = dbm[i][v];
+ add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+ }
+ // Both shortest-path closure and reduction are preserved.
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Remove the binary constraints on `var'.
+ forget_binary_dbm_constraints(v);
+ // Swap the unary constraints on `var'.
+ using std::swap;
+ swap(dbm[v][0], dbm[0][v]);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ if (b != 0) {
+ // Translate the unary constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ N& dbm_v0 = dbm[v][0];
+ add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ N& dbm_0v = dbm[0][v];
+ add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+ }
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator) {
+ // Add the new constraint `v - w == b/denominator'.
+ add_dbm_constraint(w, v, b, denominator);
+ add_dbm_constraint(v, w, b, minus_denom);
+ }
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v + w == b/denominator'.
+ // Approximate it by computing lower and upper bounds for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lower_w'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ const N& dbm_0w = dbm[0][w];
+ if (!is_plus_infinity(dbm_0w)) {
+ // Add the constraint `v >= b/denominator - upper_w'.
+ PPL_DIRTY_TEMP(N, c);
+ div_round_up(c, b, minus_denom);
+ add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `expr' and `-expr'
+ // into `pos_sum' and `neg_sum', respectively, taking into account
+ // the sign of `denominator'.
+ // Note: approximating `-expr' from above and then negating the
+ // result is the same as approximating `expr' from below.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ PPL_DIRTY_TEMP(N, neg_sum);
+ // Indices of the variables that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+ dimension_type neg_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+ assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on 'v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ dbm[0][v] = pos_sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ dbm[pos_pinf_index][v] = pos_sum;
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the lower bound constraint, if meaningful.
+ if (neg_pinf_count == 0) {
+ // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+ DB_Row<N>& dbm_v = dbm[v];
+ dbm_v[0] = neg_sum;
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ dbm[v][neg_pinf_index] = neg_sum;
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::affine_form_image(const Variable var,
+ const Linear_Form< Interval<T, Interval_Info> >& lf) {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::affine_form_image(Variable, Linear_Form):"
+ " T not a floating point type.");
+
+ // Dimension-compatibility checks.
+ // The dimension of `lf' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(var_id, l)", "l", lf);
+
+ // `var' should be one of the dimensions of the shape.
+ const dimension_type var_id = var.id() + 1;
+ if (space_dim < var_id)
+ throw_dimension_incompatible("affine_form_image(var_id, l)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lf': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `lf', if any.
+ dimension_type w_id = 0;
+ // Get information about the number of non-zero coefficients in `lf'.
+ for (dimension_type i = lf_space_dim; i-- > 0; )
+ if (lf.coefficient(Variable(i)) != 0) {
+ if (t++ == 1)
+ break;
+ else
+ w_id = i + 1;
+ }
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+ // Now we know the form of `lf':
+ // - If t == 0, then lf == b, with `b' a constant;
+ // - If t == 1, then lf == a*w + b, where `w' can be `v' or another
+ // variable;
+ // - If t == 2, the linear form 'lf' is of the general form.
+
+ if (t == 0) {
+ inhomogeneous_affine_form_image(var_id, b);
+ PPL_ASSERT(OK());
+ return;
+ }
+ else if (t == 1) {
+ const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id - 1));
+ if (w_coeff == 1 || w_coeff == -1) {
+ one_variable_affine_form_image(var_id, b, w_coeff, w_id, space_dim);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ two_variables_affine_form_image(var_id, lf, space_dim);
+ PPL_ASSERT(OK());
+}
+
+// Case 1: var = b, where b = [-b_mlb, b_ub]
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::inhomogeneous_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b) {
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(var_id);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Add the constraint `var >= lb && var <= ub'.
+ add_dbm_constraint(0, var_id, b_ub);
+ add_dbm_constraint(var_id, 0, b_mlb);
+ return;
+}
+
+// case 2: var = (+/-1) * w + [-b_mlb, b_ub], where `w' can be `var'
+// or another variable.
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::one_variable_affine_form_image(const dimension_type& var_id,
+ const Interval<T, Interval_Info>& b,
+ const Interval<T, Interval_Info>& w_coeff,
+ const dimension_type& w_id,
+ const dimension_type& space_dim) {
+
+ PPL_DIRTY_TEMP(N, b_ub);
+ assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(N, b_mlb);
+ neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+ // True if `w_coeff' is in [1, 1].
+ bool is_w_coeff_one = (w_coeff == 1);
+
+ if (w_id == var_id) {
+ // True if `b' is in [b_mlb, b_ub] and that is [0, 0].
+ bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+ // Here `lf' is of the form: [+/-1, +/-1] * v + b.
+ if (is_w_coeff_one) {
+ if (is_b_zero)
+ // The transformation is the identity function.
+ return;
+ else {
+ // Translate all the constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_mlb'.
+ DB_Row<N>& dbm_v = dbm[var_id];
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, b_mlb, ROUND_UP);
+ N& dbm_iv = dbm[i][var_id];
+ add_assign_r(dbm_iv, dbm_iv, b_ub, ROUND_UP);
+ }
+ // Both shortest-path closure and reduction are preserved.
+ }
+ }
+ else {
+ // Here `w_coeff = [-1, -1].
+ // Remove the binary constraints on `var'.
+ forget_binary_dbm_constraints(var_id);
+ using std::swap;
+ swap(dbm[var_id][0], dbm[0][var_id]);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ if (!is_b_zero) {
+ // Translate the unary constraints on `var' by adding the value
+ // `b_ub' or subtracting the value `b_mlb'.
+ N& dbm_v0 = dbm[var_id][0];
+ add_assign_r(dbm_v0, dbm_v0, b_mlb, ROUND_UP);
+ N& dbm_0v = dbm[0][var_id];
+ add_assign_r(dbm_0v, dbm_0v, b_ub, ROUND_UP);
+ }
+ }
+ }
+ else {
+ // Here `w != var', so that `lf' is of the form
+ // [+/-1, +/-1] * w + b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(var_id);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (is_w_coeff_one) {
+ // Add the new constraints `var - w >= b_mlb'
+ // `and var - w <= b_ub'.
+ add_dbm_constraint(w_id, var_id, b_ub);
+ add_dbm_constraint(var_id, w_id, b_mlb);
+ }
+ else {
+ // We have to add the constraint `v + w == b', over-approximating it
+ // by computing lower and upper bounds for `w'.
+ const N& mlb_w = dbm[w_id][0];
+ if (!is_plus_infinity(mlb_w)) {
+ // Add the constraint `v <= ub - lb_w'.
+ add_assign_r(dbm[0][var_id], b_ub, mlb_w, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ const N& ub_w = dbm[0][w_id];
+ if (!is_plus_infinity(ub_w)) {
+ // Add the constraint `v >= lb - ub_w'.
+ add_assign_r(dbm[var_id][0], ub_w, b_mlb, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ return;
+}
+
+// General case.
+// Either t == 2, so that
+// lf == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+// or t == 1, lf == i*w + b, but i <> [+/-1, +/-1].
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::two_variables_affine_form_image(const dimension_type& var_id,
+ const Linear_Form< Interval<T, Interval_Info> >& lf,
+ const dimension_type& space_dim) {
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+
+ reset_shortest_path_closed();
+
+ Linear_Form< Interval<T, Interval_Info> > minus_lf(lf);
+ minus_lf.negate();
+
+ // Declare temporaries outside the loop.
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ // Update binary constraints on var FIRST.
+ for (dimension_type curr_var = 1; curr_var < var_id; ++curr_var) {
+ Variable current(curr_var - 1);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+ }
+ for (dimension_type curr_var = var_id + 1; curr_var <= space_dim;
+ ++curr_var) {
+ Variable current(curr_var - 1);
+ linear_form_upper_bound(lf - current, upper_bound);
+ assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+ linear_form_upper_bound(minus_lf + current, upper_bound);
+ assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+ }
+ // Finally, update unary constraints on var.
+ PPL_DIRTY_TEMP(N, lf_ub);
+ linear_form_upper_bound(lf, lf_ub);
+ PPL_DIRTY_TEMP(N, minus_lf_ub);
+ linear_form_upper_bound(minus_lf, minus_lf_ub);
+ assign_r(dbm[0][var_id], lf_ub, ROUND_NOT_NEEDED);
+ assign_r(dbm[var_id][0], minus_lf_ub, ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>::refine_with_linear_form_inequality(
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+ " T not a floating point type.");
+
+ //We assume that the analyzer will not try to apply an unreachable filter.
+ PPL_ASSERT(!marked_empty());
+
+ // Dimension-compatibility checks.
+ // The dimensions of `left' and `right' should not be greater than the
+ // dimension of `*this'.
+ const dimension_type left_space_dim = left.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < left_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "left", left);
+
+ const dimension_type right_space_dim = right.space_dimension();
+ if (space_dim < right_space_dim)
+ throw_dimension_incompatible(
+ "refine_with_linear_form_inequality(left, right)", "right", right);
+
+ // Number of non-zero coefficients in `left': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type left_t = 0;
+ // Variable-index of the last non-zero coefficient in `left', if any.
+ dimension_type left_w_id = 0;
+ // Number of non-zero coefficients in `right': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type right_t = 0;
+ // Variable-index of the last non-zero coefficient in `right', if any.
+ dimension_type right_w_id = 0;
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ // Get information about the number of non-zero coefficients in `left'.
+ for (dimension_type i = left_space_dim; i-- > 0; )
+ if (left.coefficient(Variable(i)) != 0) {
+ if (left_t++ == 1)
+ break;
+ else
+ left_w_id = i;
+ }
+
+ // Get information about the number of non-zero coefficients in `right'.
+ for (dimension_type i = right_space_dim; i-- > 0; )
+ if (right.coefficient(Variable(i)) != 0) {
+ if (right_t++ == 1)
+ break;
+ else
+ right_w_id = i;
+ }
+
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+
+ if (left_t == 0) {
+ if (right_t == 0) {
+ // The constraint involves constants only. Ignore it: it is up to
+ // the analyzer to handle it.
+ PPL_ASSERT(OK());
+ return;
+ }
+ else if (right_w_coeff == 1 || right_w_coeff == -1) {
+ left_inhomogeneous_refine(right_t, right_w_id, left, right);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ else if (left_t == 1) {
+ if (left_w_coeff == 1 || left_w_coeff == -1) {
+ if (right_t == 0 || (right_w_coeff == 1 || right_w_coeff == -1)) {
+ left_one_var_refine(left_w_id, right_t, right_w_id, left, right);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ general_refine(left_w_id, right_w_id, left, right);
+ PPL_ASSERT(OK());
+} // end of refine_with_linear_form_inequality
+
+template <typename T>
+template <typename U>
+void
+BD_Shape<T>
+::export_interval_constraints(U& dest) const {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim > dest.space_dimension())
+ throw std::invalid_argument(
+ "BD_Shape<T>::export_interval_constraints");
+
+ // Expose all the interval constraints.
+ shortest_path_closure_assign();
+
+ if (marked_empty()) {
+ dest.set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ PPL_DIRTY_TEMP(N, tmp);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ // Set the upper bound.
+ const N& u = dbm_0[i+1];
+ if (!is_plus_infinity(u))
+ if (!dest.restrict_upper(i, u.raw_value()))
+ return;
+
+ // Set the lower bound.
+ const N& negated_l = dbm[i+1][0];
+ if (!is_plus_infinity(negated_l)) {
+ neg_assign_r(tmp, negated_l, ROUND_DOWN);
+ if (!dest.restrict_lower(i, tmp.raw_value()))
+ return;
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::left_inhomogeneous_refine(const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ if (right_t == 1) {
+ // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+ // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+ if (right_w_coeff == 1) {
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(right_w_id+1, 0, b_plus_minus_a_minus);
+ return;
+ }
+
+ if (right_w_coeff == -1) {
+ PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_b = right.inhomogeneous_term();
+ sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(0, right_w_id+1, b_plus_minus_a_minus);
+ return;
+ }
+ }
+} // end of left_inhomogeneous_refine
+
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::left_one_var_refine(const dimension_type& left_w_id,
+ const dimension_type& right_t,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ if (right_t == 0) {
+ // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+ // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+
+ if (left_w_coeff == 1) {
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_dbm_constraint(0, left_w_id+1, a_plus_minus_b_minus);
+ return;
+ }
+
+ if (left_w_coeff == -1) {
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ add_dbm_constraint(left_w_id+1, 0, a_plus_minus_b_minus);
+ return;
+ }
+ }
+ else if (right_t == 1) {
+ // The constraint has the form
+ // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+ // Reduce it to the constraint +/-x +/-y <= c+ - a-
+ // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+ const FP_Interval_Type& left_w_coeff =
+ left.coefficient(Variable(left_w_id));
+
+ const FP_Interval_Type& right_w_coeff =
+ right.coefficient(Variable(right_w_id));
+
+ bool is_left_coeff_one = (left_w_coeff == 1);
+ bool is_left_coeff_minus_one = (left_w_coeff == -1);
+ bool is_right_coeff_one = (right_w_coeff == 1);
+ bool is_right_coeff_minus_one = (right_w_coeff == -1);
+ if (left_w_id == right_w_id) {
+ if ((is_left_coeff_one && is_right_coeff_one)
+ ||
+ (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+ // Here we have an identity or a constants-only constraint.
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // We fall back to a previous case.
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_dbm_constraint(0, left_w_id + 1, a_plus_minus_b_minus);
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // We fall back to a previous case.
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_UP);
+ add_dbm_constraint(right_w_id + 1, 0, a_plus_minus_b_minus);
+ return;
+ }
+ }
+ else if (is_left_coeff_minus_one && is_right_coeff_one) {
+ // over-approximate (if is it possible) the inequality
+ // -B + [b1, b2] <= A + [a1, a2] by adding the constraints
+ // -B <= upper_bound(A) + (a2 - b1) and
+ // -A <= upper_bound(B) + (a2 - b1)
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ PPL_DIRTY_TEMP(N, ub);
+ ub = dbm[0][right_w_id + 1];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(left_w_id + 1, 0, ub);
+ }
+ ub = dbm[0][left_w_id + 1];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(right_w_id + 1, 0, ub);
+ }
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_minus_one) {
+ // over-approximate (if is it possible) the inequality
+ // B + [b1, b2] <= -A + [a1, a2] by adding the constraints
+ // B <= upper_bound(-A) + (a2 - b1) and
+ // A <= upper_bound(-B) + (a2 - b1)
+ PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+ const FP_Interval_Type& left_b = left.inhomogeneous_term();
+ const FP_Interval_Type& right_a = right.inhomogeneous_term();
+ sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+ ROUND_UP);
+ PPL_DIRTY_TEMP(N, ub);
+ ub = dbm[right_w_id + 1][0];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(0, left_w_id + 1, ub);
+ }
+ ub = dbm[left_w_id + 1][0];
+ if (!is_plus_infinity(ub)) {
+ add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+ add_dbm_constraint(0, right_w_id + 1, ub);
+ }
+ return;
+ }
+ if (is_left_coeff_one && is_right_coeff_one) {
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(right_w_id+1, left_w_id+1, c_plus_minus_a_minus);
+ return;
+ }
+ if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+ PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+ const FP_Interval_Type& left_a = left.inhomogeneous_term();
+ const FP_Interval_Type& right_c = right.inhomogeneous_term();
+ sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+ ROUND_UP);
+ add_dbm_constraint(left_w_id+1, right_w_id+1, c_plus_minus_a_minus);
+ return;
+ }
+ }
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::general_refine(const dimension_type& left_w_id,
+ const dimension_type& right_w_id,
+ const Linear_Form< Interval<T, Interval_Info> >& left,
+ const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+ Linear_Form<FP_Interval_Type> right_minus_left(right);
+ right_minus_left -= left;
+
+ // Declare temporaries outside of the loop.
+ PPL_DIRTY_TEMP(N, low_coeff);
+ PPL_DIRTY_TEMP(N, high_coeff);
+ PPL_DIRTY_TEMP(N, upper_bound);
+
+ dimension_type max_w_id = std::max(left_w_id, right_w_id);
+
+ for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+ for (dimension_type second_v = first_v+1;
+ second_v <= max_w_id; ++second_v) {
+ const FP_Interval_Type& lfv_coefficient =
+ left.coefficient(Variable(first_v));
+ const FP_Interval_Type& lsv_coefficient =
+ left.coefficient(Variable(second_v));
+ const FP_Interval_Type& rfv_coefficient =
+ right.coefficient(Variable(first_v));
+ const FP_Interval_Type& rsv_coefficient =
+ right.coefficient(Variable(second_v));
+ // We update the constraints only when both variables appear in at
+ // least one argument.
+ bool do_update = false;
+ assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ else {
+ assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0) {
+ assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+ }
+ }
+
+ if (do_update) {
+ Variable first(first_v);
+ Variable second(second_v);
+ dimension_type n_first_var = first_v +1 ;
+ dimension_type n_second_var = second_v + 1;
+ linear_form_upper_bound(right_minus_left - first + second,
+ upper_bound);
+ add_dbm_constraint(n_first_var, n_second_var, upper_bound);
+ linear_form_upper_bound(right_minus_left + first - second,
+ upper_bound);
+ add_dbm_constraint(n_second_var, n_first_var, upper_bound);
+ }
+ }
+ }
+
+ // Finally, update the unary constraints.
+ for (dimension_type v = 0; v < max_w_id; ++v) {
+ const FP_Interval_Type& lv_coefficient =
+ left.coefficient(Variable(v));
+ const FP_Interval_Type& rv_coefficient =
+ right.coefficient(Variable(v));
+ // We update the constraints only if v appears in at least one of the
+ // two arguments.
+ bool do_update = false;
+ assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ else {
+ assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (low_coeff != 0 || high_coeff != 0)
+ do_update = true;
+ }
+
+ if (do_update) {
+ Variable var(v);
+ dimension_type n_var = v + 1;
+ linear_form_upper_bound(right_minus_left + var, upper_bound);
+ add_dbm_constraint(0, n_var, upper_bound);
+ linear_form_upper_bound(right_minus_left - var, upper_bound);
+ add_dbm_constraint(n_var, 0, upper_bound);
+ }
+ }
+
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+ N& result) const {
+
+ // Check that T is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "BD_Shape<T>::linear_form_upper_bound:"
+ " T not a floating point type.");
+
+ const dimension_type lf_space_dimension = lf.space_dimension();
+ PPL_ASSERT(lf_space_dimension <= space_dimension());
+
+ typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+ PPL_DIRTY_TEMP(N, curr_lb);
+ PPL_DIRTY_TEMP(N, curr_ub);
+ PPL_DIRTY_TEMP(N, curr_var_ub);
+ PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+ PPL_DIRTY_TEMP(N, first_comparison_term);
+ PPL_DIRTY_TEMP(N, second_comparison_term);
+
+ PPL_DIRTY_TEMP(N, negator);
+
+ assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+ for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+ ++curr_var) {
+ n_var = curr_var + 1;
+ const FP_Interval_Type&
+ curr_coefficient = lf.coefficient(Variable(curr_var));
+ assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+ assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+ if (curr_lb != 0 || curr_ub != 0) {
+ assign_r(curr_var_ub, dbm[0][n_var], ROUND_NOT_NEEDED);
+ neg_assign_r(curr_minus_var_ub, dbm[n_var][0], ROUND_NOT_NEEDED);
+ // Optimize the most commons cases: curr = +/-[1, 1].
+ if (curr_lb == 1 && curr_ub == 1) {
+ add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+ ROUND_UP);
+ }
+ else if (curr_lb == -1 && curr_ub == -1) {
+ neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+ ROUND_NOT_NEEDED);
+ add_assign_r(result, result, negator, ROUND_UP);
+ }
+ else {
+ // Next addend will be the maximum of four quantities.
+ assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+ assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+ ROUND_UP);
+ assign_r(first_comparison_term, std::max(first_comparison_term,
+ second_comparison_term),
+ ROUND_NOT_NEEDED);
+
+ add_assign_r(result, result, first_comparison_term, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+ // `var' should be one of the dimensions of
+ // the bounded difference shapes.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type j = expr.last_nonzero();
+
+ if (j != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, j))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr = b, with `b' a constant;
+ // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t > 1, the `expr' is of the general form.
+ if (t == 0) {
+ // Case 1: expr = n; remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(j - 1));
+ if (a == denominator || a == -denominator) {
+ // Case 2: expr = a*w + b, with a = +/- denominator.
+ if (j == var.space_dimension())
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, denominator*var - b, a);
+ else {
+ // `expr == a*w + b', where `w != v'.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+ }
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t = 1, expr = a*w + b, but a <> +/- denominator.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ // The transformation is invertible.
+ Linear_Expression inverse((expr_v + denominator)*var);
+ inverse -= expr;
+ affine_image(var, inverse, expr_v);
+ }
+ else {
+ // Transformation not invertible: all constraints on `var' are lost.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the BD_Shape.
+ const dimension_type bds_space_dim = space_dimension();
+ const dimension_type v = var.id() + 1;
+ if (v > bds_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (bds_space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (bds_space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any image of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = ub_expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `ub_expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `ub_expr', if any.
+ dimension_type w = ub_expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!ub_expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `ub_expr':
+ // - If t == 0, then ub_expr == b, with `b' a constant;
+ // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `ub_expr' is of the general form.
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: ub_expr == b.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `ub_expr'.
+ const Coefficient& a = ub_expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ if (w == v) {
+ // Here `var' occurs in `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(bds_space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `ub_expr'.
+ affine_image(new_var, ub_expr, denominator);
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Now apply the affine upper bound, as recorded in `new_var'.
+ add_constraint(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(bds_space_dim);
+ return;
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b.
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (a == denominator) {
+ // Add the new constraint `v - w == b/denominator'.
+ add_dbm_constraint(w, v, b, denominator);
+ }
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v + w == b/denominator'.
+ // Approximate it by computing lower and upper bounds for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lower_w'.
+ PPL_DIRTY_TEMP(N, d);
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ reset_shortest_path_closed();
+ }
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `var' and add back
+ // constraints providing upper and lower bounds for `var'.
+
+ // Compute upper approximations for `ub_expr' into `pos_sum'
+ // taking into account the sign of `denominator'.
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -ub_expr;
+ const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, pos_sum);
+ // Index of the variable that are unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pos_pinf_count = 0;
+
+ // Approximate the inhomogeneous term.
+ assign_r(pos_sum, sc_b, ROUND_UP);
+
+ // Approximate the homogeneous part of `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // Speculative allocation of temporaries to be used in the following loop.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i_dim];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ }
+ else {
+ PPL_ASSERT(sign_i < 0);
+ neg_assign(minus_sc_i, sc_i);
+ // Note: using temporary named `coeff_i' to store -coeff_i.
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i_dim][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i_dim;
+ }
+ }
+ }
+ }
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1) {
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ reset_shortest_path_closed();
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (sc_denom != 1) {
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+ }
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ dbm[0][v] = pos_sum;
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ dbm[pos_pinf_index][v] = pos_sum;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the BD_Shape.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ if (ub_expr.coefficient(var) == 0) {
+ refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+ generalized_affine_preimage(var, GREATER_OR_EQUAL,
+ lb_expr, denominator);
+ return;
+ }
+ if (lb_expr.coefficient(var) == 0) {
+ refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ return;
+ }
+
+ const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+ // Here `var' occurs in `lb_expr' and `ub_expr'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ const Linear_Expression lb_inverse
+ = lb_expr - (lb_expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(lb_inverse_denom);
+ neg_assign(lb_inverse_denom, lb_expr_v);
+ affine_image(new_var, lb_inverse, lb_inverse_denom);
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ generalized_affine_preimage(var, LESS_OR_EQUAL,
+ ub_expr, denominator);
+ if (sgn(denominator) == sgn(lb_inverse_denom))
+ add_constraint(var >= new_var);
+ else
+ add_constraint(var <= new_var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim);
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the BDS.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ var.id());
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ return;
+ }
+
+ // The image of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Coefficient& b = expr.inhomogeneous_term();
+ // Number of non-zero coefficients in `expr': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t = 0;
+ // Index of the last non-zero coefficient in `expr', if any.
+ dimension_type w = expr.last_nonzero();
+
+ if (w != 0) {
+ ++t;
+ if (!expr.all_zeroes(1, w))
+ ++t;
+ }
+
+ // Now we know the form of `expr':
+ // - If t == 0, then expr == b, with `b' a constant;
+ // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+ // variable; in this second case we have to check whether `a' is
+ // equal to `denominator' or `-denominator', since otherwise we have
+ // to fall back on the general form;
+ // - If t == 2, the `expr' is of the general form.
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+ neg_assign(minus_denom, denominator);
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Both shortest-path closure and reduction are lost.
+ reset_shortest_path_closed();
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_denom);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.get(Variable(w - 1));
+ if (a == denominator || a == minus_denom) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ PPL_DIRTY_TEMP(N, d);
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ div_round_up(d, b, denominator);
+ if (w == v) {
+ // `expr' is of the form: a*v + b.
+ // Shortest-path closure and reduction are not preserved.
+ reset_shortest_path_closed();
+ if (a == denominator) {
+ // Translate each constraint `v - w <= dbm_wv'
+ // into the constraint `v - w <= dbm_wv + b/denominator';
+ // forget each constraint `w - v <= dbm_vw'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_iv = dbm[i][v];
+ add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+ assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Translate the constraint `0 - v <= dbm_v0'
+ // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+ N& dbm_v0 = dbm_v[0];
+ add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+ // Forget all the other constraints on `v'.
+ assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_dbm_constraints(v);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator)
+ // Add the new constraint `v - w <= b/denominator'.
+ add_dbm_constraint(w, v, d);
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v <= b/denominator - w'.
+ // Approximate it by computing a lower bound for `w'.
+ const N& dbm_w0 = dbm[w][0];
+ if (!is_plus_infinity(dbm_w0)) {
+ // Add the constraint `v <= b/denominator - lb_w'.
+ add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ case GREATER_OR_EQUAL:
+ div_round_up(d, b, minus_denom);
+ if (w == v) {
+ // `expr' is of the form: a*w + b.
+ // Shortest-path closure and reduction are not preserved.
+ reset_shortest_path_closed();
+ if (a == denominator) {
+ // Translate each constraint `w - v <= dbm_vw'
+ // into the constraint `w - v <= dbm_vw - b/denominator';
+ // forget each constraint `v - w <= dbm_wv'.
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ N& dbm_vi = dbm_v[i];
+ add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+ assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ }
+ else {
+ // Here `a == -denominator'.
+ // Translate the constraint `0 - v <= dbm_v0'
+ // into the constraint `0 - v <= dbm_0v - b/denominator'.
+ N& dbm_0v = dbm_0[v];
+ add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+ // Forget all the other constraints on `v'.
+ assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ forget_binary_dbm_constraints(v);
+ }
+ }
+ else {
+ // Here `w != v', so that `expr' is of the form
+ // +/-denominator * w + b, with `w != v'.
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ if (a == denominator)
+ // Add the new constraint `v - w >= b/denominator',
+ // i.e., `w - v <= -b/denominator'.
+ add_dbm_constraint(v, w, d);
+ else {
+ // Here a == -denominator, so that we should be adding
+ // the constraint `v >= -w + b/denominator',
+ // i.e., `-v <= w - b/denominator'.
+ // Approximate it by computing an upper bound for `w'.
+ const N& dbm_0w = dbm_0[w];
+ if (!is_plus_infinity(dbm_0w)) {
+ // Add the constraint `-v <= ub_w - b/denominator'.
+ add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+ // Shortest-path closure is not preserved.
+ reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ // General case.
+ // Either t == 2, so that
+ // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+ // or t == 1, expr == a*w + b, but a <> +/- denominator.
+ // We will remove all the constraints on `v' and add back
+ // a constraint providing an upper or a lower bound for `v'
+ // (depending on `relsym').
+ const bool is_sc = (denominator > 0);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+ neg_assign(minus_b, b);
+ const Coefficient& sc_b = is_sc ? b : minus_b;
+ const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+ const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+ const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+ // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+ // when `denominator' is negative. Do not use it unless you are sure
+ // it has been correctly assigned.
+ Linear_Expression minus_expr;
+ if (!is_sc)
+ minus_expr = -expr;
+ const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+ PPL_DIRTY_TEMP(N, sum);
+ // Index of variable that is unbounded in `this->dbm'.
+ PPL_UNINITIALIZED(dimension_type, pinf_index);
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ // Speculative allocation of temporaries to be used in the following loops.
+ PPL_DIRTY_TEMP(N, coeff_i);
+ PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ // Compute an upper approximation for `sc_expr' into `sum'.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `sc_expr'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ PPL_ASSERT(w != 0);
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const dimension_type i_dim = i.variable().space_dimension();
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v <= sum'.
+ add_dbm_constraint(0, v, sum);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_OR_EQUAL:
+ // Compute an upper approximation for `-sc_expr' into `sum'.
+ // Note: approximating `-sc_expr' from above and then negating the
+ // result is the same as approximating `sc_expr' from below.
+
+ // Approximate the inhomogeneous term.
+ assign_r(sum, minus_sc_b, ROUND_UP);
+ // Approximate the homogeneous part of `-sc_expr'.
+ for (Linear_Expression::const_iterator i = sc_expr.begin(),
+ i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+ const Coefficient& sc_i = *i;
+ const int sign_i = sgn(sc_i);
+ PPL_ASSERT(sign_i != 0);
+ const dimension_type i_dim = i.variable().space_dimension();
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i_dim;
+ continue;
+ }
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ neg_assign(minus_sc_i, sc_i);
+ assign_r(coeff_i, minus_sc_i, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+ }
+
+ // Remove all constraints on `var'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_denom != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_denom' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_denom' and negating again the result.
+ PPL_DIRTY_TEMP(N, down_sc_denom);
+ assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+ neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+ }
+
+ if (pinf_count == 0) {
+ // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+ add_dbm_constraint(v, 0, sum);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+ // Add the constraint `v - pinf_index >= -sum',
+ // i.e., `pinf_index - v <= sum'.
+ add_dbm_constraint(v, pinf_index, sum);
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lhs_space_dim = lhs.space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for BDSs.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // The image of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+ // Note that this constraint is a bounded difference if `t_rhs <= 1'
+ // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+ // more general form, it will be simply ignored.
+ // TODO: if it is not a bounded difference, should we compute
+ // approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine images for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT a bounded difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ else {
+ // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+ // More accurate computation that is worth doing only if
+ // the following TODO note is accurately dealt with.
+
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, rhs);
+ // Existentially quantify all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // TODO: each one of the following constraints is definitely NOT
+ // a bounded differences (since it has 3 variables at least).
+ // Thus, the method refine_no_check() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= new_var);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == new_var);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+
+ // `var' should be one of the dimensions of the BDS.
+ const dimension_type v = var.id() + 1;
+ if (v > space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ var.id());
+
+ // The relation symbol cannot be a strict relation symbol.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "=":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // The preimage of an empty BDS is empty too.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& expr_v = expr.coefficient(var);
+ if (expr_v != 0) {
+ const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+ ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+ neg_assign(inverse_denom, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+ return;
+ }
+
+ refine(var, relsym, expr, denominator);
+ // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // ... otherwise, since the relation was not invertible,
+ // we just forget all constraints on `v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ reset_shortest_path_reduced();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type bds_space_dim = space_dimension();
+ const dimension_type lhs_space_dim = lhs.space_dimension();
+ if (bds_space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e1", lhs);
+
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (bds_space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+ "e2", rhs);
+
+ // Strict relation symbols are not admitted for BDSs.
+ if (relsym == LESS_THAN || relsym == GREATER_THAN)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is a strict relation symbol");
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // The preimage of an empty BDS is empty.
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ // Number of non-zero coefficients in `lhs': will be set to
+ // 0, 1, or 2, the latter value meaning any value greater than 1.
+ dimension_type t_lhs = 0;
+ // Index of the last non-zero coefficient in `lhs', if any.
+ dimension_type j_lhs = lhs.last_nonzero();
+
+ if (j_lhs != 0) {
+ ++t_lhs;
+ if (!lhs.all_zeroes(1, j_lhs))
+ ++t_lhs;
+ --j_lhs;
+ }
+
+ const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+ if (t_lhs == 0) {
+ // `lhs' is a constant.
+ // In this case, preimage and image happen to be the same.
+ generalized_affine_image(lhs, relsym, rhs);
+ return;
+ }
+ else if (t_lhs == 1) {
+ // Here `lhs == a_lhs * v + b_lhs'.
+ // Independently from the form of `rhs', we can exploit the
+ // method computing generalized affine preimages for a single variable.
+ Variable v(j_lhs);
+ // Compute a sign-corrected relation symbol.
+ const Coefficient& denom = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (denom < 0) {
+ if (relsym == LESS_OR_EQUAL)
+ new_relsym = GREATER_OR_EQUAL;
+ else if (relsym == GREATER_OR_EQUAL)
+ new_relsym = LESS_OR_EQUAL;
+ }
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_preimage(v, new_relsym, expr, denom);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ std::vector<Variable> lhs_vars;
+ for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+ i != i_end; ++i)
+ lhs_vars.push_back(i.variable());
+
+ const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+ if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+ // `lhs' and `rhs' variables are disjoint.
+
+ // Constrain the left hand side expression so that it is related to
+ // the right hand side expression as dictated by `relsym'.
+ // TODO: if the following constraint is NOT a bounded difference,
+ // it will be simply ignored. Should we compute approximations for it?
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(lhs <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(lhs == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+ if (is_empty())
+ return;
+ // Existentially quantify all variables in the lhs.
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ }
+ else {
+
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var(bds_space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `lhs'.
+ // NOTE: calling affine_image() instead of refine_no_check()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, lhs);
+ // Existentiallly quantify all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ PPL_ASSERT(!marked_empty());
+ for (dimension_type i = lhs_vars.size(); i-- > 0; )
+ forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+ // Constrain the new dimension so that it is related to
+ // the left hand side as dictated by `relsym'.
+ // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+ // then one of the following constraints will be added,
+ // since it is a bounded difference. Else the method
+ // refine_no_check() will ignore it, because the
+ // constraint is NOT a bounded difference.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ refine_no_check(new_var <= rhs);
+ break;
+ case EQUAL:
+ refine_no_check(new_var == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_no_check(new_var >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(bds_space_dim);
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ if (marked_shortest_path_reduced()) {
+ // Disregard redundant constraints.
+ cs = minimized_constraints();
+ return cs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(a);
+ PPL_DIRTY_TEMP_COEFFICIENT(b);
+ // Go through all the unary constraints in `dbm'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type j = 1; j <= space_dim; ++j) {
+ const Variable x(j-1);
+ const N& dbm_0j = dbm_0[j];
+ const N& dbm_j0 = dbm[j][0];
+ if (is_additive_inverse(dbm_j0, dbm_0j)) {
+ // We have a unary equality constraint.
+ numer_denom(dbm_0j, b, a);
+ cs.insert(a*x == b);
+ }
+ else {
+ // We have 0, 1 or 2 unary inequality constraints.
+ if (!is_plus_infinity(dbm_0j)) {
+ numer_denom(dbm_0j, b, a);
+ cs.insert(a*x <= b);
+ }
+ if (!is_plus_infinity(dbm_j0)) {
+ numer_denom(dbm_j0, b, a);
+ cs.insert(-a*x <= b);
+ }
+ }
+ }
+
+ // Go through all the binary constraints in `dbm'.
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const Variable y(i-1);
+ const DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Variable x(j-1);
+ const N& dbm_ij = dbm_i[j];
+ const N& dbm_ji = dbm[j][i];
+ if (is_additive_inverse(dbm_ji, dbm_ij)) {
+ // We have a binary equality constraint.
+ numer_denom(dbm_ij, b, a);
+ cs.insert(a*x - a*y == b);
+ }
+ else {
+ // We have 0, 1 or 2 binary inequality constraints.
+ if (!is_plus_infinity(dbm_ij)) {
+ numer_denom(dbm_ij, b, a);
+ cs.insert(a*x - a*y <= b);
+ }
+ if (!is_plus_infinity(dbm_ji)) {
+ numer_denom(dbm_ji, b, a);
+ cs.insert(a*y - a*x <= b);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+ shortest_path_reduction_assign();
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+ // Compute leader information.
+ std::vector<dimension_type> leaders;
+ compute_leaders(leaders);
+ std::vector<dimension_type> leader_indices;
+ compute_leader_indices(leaders, leader_indices);
+ const dimension_type num_leaders = leader_indices.size();
+
+ // Go through the non-leaders to generate equality constraints.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = 1; i <= space_dim; ++i) {
+ const dimension_type leader = leaders[i];
+ if (i != leader) {
+ // Generate the constraint relating `i' and its leader.
+ if (leader == 0) {
+ // A unary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], numer, denom);
+ cs.insert(denom*Variable(i-1) == numer);
+ }
+ else {
+ // A binary equality has to be generated.
+ PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], numer, denom);
+ cs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+ }
+ }
+ }
+
+ // Go through the leaders to generate inequality constraints.
+ // First generate all the unary inequalities.
+ const Bit_Row& red_0 = redundancy_dbm[0];
+ for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leader_indices[l_i];
+ if (!red_0[i]) {
+ numer_denom(dbm_0[i], numer, denom);
+ cs.insert(denom*Variable(i-1) <= numer);
+ }
+ if (!redundancy_dbm[i][0]) {
+ numer_denom(dbm[i][0], numer, denom);
+ cs.insert(-denom*Variable(i-1) <= numer);
+ }
+ }
+ // Then generate all the binary inequalities.
+ for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+ const dimension_type i = leader_indices[l_i];
+ const DB_Row<N>& dbm_i = dbm[i];
+ const Bit_Row& red_i = redundancy_dbm[i];
+ for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+ const dimension_type j = leader_indices[l_j];
+ if (!red_i[j]) {
+ numer_denom(dbm_i[j], numer, denom);
+ cs.insert(denom*Variable(j-1) - denom*Variable(i-1) <= numer);
+ }
+ if (!redundancy_dbm[j][i]) {
+ numer_denom(dbm[j][i], numer, denom);
+ cs.insert(denom*Variable(i-1) - denom*Variable(j-1) <= numer);
+ }
+ }
+ }
+ return cs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+ dimension_type old_dim = space_dimension();
+ // `var' should be one of the dimensions of the vector space.
+ if (var.space_dimension() > old_dim)
+ throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+ // The space dimension of the resulting BDS should not
+ // overflow the maximum allowed space dimension.
+ if (m > max_space_dimension() - space_dimension())
+ throw_invalid_argument("expand_dimension(v, m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+
+ // Nothing to do, if no dimensions must be added.
+ if (m == 0)
+ return;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ // For each constraints involving variable `var', we add a
+ // similar constraint with the new variable substituted for
+ // variable `var'.
+ const dimension_type v_id = var.id() + 1;
+ const DB_Row<N>& dbm_v = dbm[v_id];
+ for (dimension_type i = old_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ const N& dbm_i_v = dbm[i][v_id];
+ const N& dbm_v_i = dbm_v[i];
+ for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+ dbm_i[j] = dbm_i_v;
+ dbm[j][i] = dbm_v_i;
+ }
+ }
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure or reduction of the bounded difference shape.
+ if (marked_shortest_path_closed())
+ reset_shortest_path_closed();
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ const dimension_type space_dim = space_dimension();
+ // `dest' should be one of the dimensions of the BDS.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the BDS.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ shortest_path_closure_assign();
+ if (!marked_empty()) {
+ // Recompute the elements of the row and the column corresponding
+ // to variable `dest' by taking the join of their value with the
+ // value of the corresponding elements in the row and column of the
+ // variable `vars'.
+ const dimension_type v_id = dest.id() + 1;
+ DB_Row<N>& dbm_v = dbm[v_id];
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i) {
+ const dimension_type to_be_folded_id = *i + 1;
+ const DB_Row<N>& dbm_to_be_folded_id = dbm[to_be_folded_id];
+ for (dimension_type j = space_dim + 1; j-- > 0; ) {
+ max_assign(dbm[j][v_id], dbm[j][to_be_folded_id]);
+ max_assign(dbm_v[j], dbm_to_be_folded_id[j]);
+ }
+ }
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<T>::is_integer)
+ return;
+
+ const dimension_type space_dim = space_dimension();
+ shortest_path_closure_assign();
+ if (space_dim == 0 || marked_empty())
+ return;
+
+ for (dimension_type i = space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim + 1; j-- > 0; )
+ if (i != j)
+ drop_some_non_integer_points_helper(dbm_i[j]);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dim < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+ return;
+
+ shortest_path_closure_assign();
+ if (marked_empty())
+ return;
+
+ const Variables_Set::const_iterator v_begin = vars.begin();
+ const Variables_Set::const_iterator v_end = vars.end();
+ PPL_ASSERT(v_begin != v_end);
+ // Unary constraints on a variable occurring in `vars'.
+ DB_Row<N>& dbm_0 = dbm[0];
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = *v_i + 1;
+ drop_some_non_integer_points_helper(dbm_0[i]);
+ drop_some_non_integer_points_helper(dbm[i][0]);
+ }
+
+ // Binary constraints where both variables occur in `vars'.
+ for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+ const dimension_type i = *v_i + 1;
+ DB_Row<N>& dbm_i = dbm[i];
+ for (Variables_Set::const_iterator v_j = v_begin; v_j != v_end; ++v_j) {
+ const dimension_type j = *v_j + 1;
+ if (i != j)
+ drop_some_non_integer_points_helper(dbm_i[j]);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& bds) {
+ typedef typename BD_Shape<T>::coefficient_type N;
+ if (bds.is_universe())
+ s << "true";
+ else {
+ // We control empty bounded difference shape.
+ dimension_type n = bds.space_dimension();
+ if (bds.marked_empty())
+ s << "false";
+ else {
+ PPL_DIRTY_TEMP(N, v);
+ bool first = true;
+ for (dimension_type i = 0; i <= n; ++i)
+ for (dimension_type j = i + 1; j <= n; ++j) {
+ const N& c_i_j = bds.dbm[i][j];
+ const N& c_j_i = bds.dbm[j][i];
+ if (is_additive_inverse(c_j_i, c_i_j)) {
+ // We will print an equality.
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a equality constraint with one variable.
+ s << Variable(j - 1);
+ s << " = " << c_i_j;
+ }
+ else {
+ // We have got a equality constraint with two variables.
+ if (sgn(c_i_j) >= 0) {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ s << " = " << c_i_j;
+ }
+ else {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ s << " = " << c_j_i;
+ }
+ }
+ }
+ else {
+ // We will print a non-strict inequality.
+ if (!is_plus_infinity(c_j_i)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a constraint with only one variable.
+ s << Variable(j - 1);
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ else {
+ // We have got a constraint with two variables.
+ if (sgn(c_j_i) >= 0) {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ s << " <= " << c_j_i;
+ }
+ else {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ }
+ }
+ if (!is_plus_infinity(c_i_j)) {
+ if (first)
+ first = false;
+ else
+ s << ", ";
+ if (i == 0) {
+ // We have got a constraint with only one variable.
+ s << Variable(j - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ // We have got a constraint with two variables.
+ if (sgn(c_i_j) >= 0) {
+ s << Variable(j - 1);
+ s << " - ";
+ s << Variable(i - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ s << Variable(i - 1);
+ s << " - ";
+ s << Variable(j - 1);
+ neg_assign_r(v, c_i_j, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+ status.ascii_dump(s);
+ s << "\n";
+ dbm.ascii_dump(s);
+ s << "\n";
+ redundancy_dbm.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+ if (!status.ascii_load(s))
+ return false;
+ if (!dbm.ascii_load(s))
+ return false;
+ if (!redundancy_dbm.ascii_load(s))
+ return false;
+ return true;
+}
+
+template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+ return dbm.external_memory_in_bytes()
+ + redundancy_dbm.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+ // Check whether the difference-bound matrix is well-formed.
+ if (!dbm.OK())
+ return false;
+
+ // Check whether the status information is legal.
+ if (!status.OK())
+ return false;
+
+ // An empty BDS is OK.
+ if (marked_empty())
+ return true;
+
+ // MINUS_INFINITY cannot occur at all.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ for (dimension_type j = dbm.num_rows(); j-- > 0; )
+ if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+ << dbm[i][j] << "!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // On the main diagonal only PLUS_INFINITY can occur.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+ << dbm[i][i] << "! (+inf was expected.)"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Check whether the shortest-path closure information is legal.
+ if (marked_shortest_path_closed()) {
+ BD_Shape x = *this;
+ x.reset_shortest_path_closed();
+ x.shortest_path_closure_assign();
+ if (x.dbm != dbm) {
+#ifndef NDEBUG
+ std::cerr << "BD_Shape is marked as closed but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // The following tests might result in false alarms when using floating
+ // point coefficients: they are only meaningful if the coefficient type
+ // base is exact (since otherwise shortest-path closure is approximated).
+ if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+ // Check whether the shortest-path reduction information is legal.
+ if (marked_shortest_path_reduced()) {
+ // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+ for (dimension_type i = dbm.num_rows(); i-- > 0; )
+ for (dimension_type j = dbm.num_rows(); j-- > 0; )
+ if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+ << dbm[i][j] << " is marked as non-redundant!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ BD_Shape x = *this;
+ x.reset_shortest_path_reduced();
+ x.shortest_path_reduction_assign();
+ if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+ std::cerr << "BD_Shape is marked as reduced but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ }
+
+ // All checks passed.
+ return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const BD_Shape& y) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template<typename Interval_Info>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form< Interval<T,
+ Interval_Info> >& lf) const {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_invalid_argument(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 2370. */
+
+/* Automatically generated from PPL source file ../src/Rational_Interval.hh line 1. */
+/* Rational_Interval class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rational_Interval.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Rational_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Rational_Interval_Info_Policy> Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_templates.hh line 42. */
+#include <vector>
+#include <map>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+ : seq(check_space_dimension_overflow(num_dimensions,
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // In a box that is marked empty the intervals are completely
+ // meaningless: we exploit this by avoiding their initialization.
+ if (kind == UNIVERSE) {
+ for (dimension_type i = num_dimensions; i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ set_empty_up_to_date();
+ }
+ else
+ set_empty();
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+ : seq(check_space_dimension_overflow(cs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(cs)",
+ "cs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // FIXME: check whether we can avoid the double initialization.
+ for (dimension_type i = cs.space_dimension(); i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+ : seq(check_space_dimension_overflow(cgs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(cgs)",
+ "cgs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // FIXME: check whether we can avoid the double initialization.
+ for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+ : seq(y.space_dimension()),
+ // FIXME: why the following does not work?
+ // status(y.status) {
+ status() {
+ // FIXME: remove when the above is fixed.
+ if (y.marked_empty())
+ set_empty();
+
+ if (!y.marked_empty())
+ for (dimension_type k = y.space_dimension(); k-- > 0; )
+ seq[k].assign(y.seq[k]);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+ : seq(check_space_dimension_overflow(gs.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(gs)",
+ "gs exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ const Generator_System::const_iterator gs_begin = gs.begin();
+ const Generator_System::const_iterator gs_end = gs.end();
+ if (gs_begin == gs_end) {
+ // An empty generator system defines the empty box.
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ PPL_DIRTY_TEMP(mpq_class, q);
+ bool point_seen = false;
+ // Going through all the points.
+ for (Generator_System::const_iterator
+ gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ if (g.is_point()) {
+ const Coefficient& d = g.divisor();
+ if (point_seen) {
+ // This is not the first point: `seq' already contains valid values.
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ PPL_DIRTY_TEMP(ITV, iq);
+ iq.build(i_constraint(EQUAL, q));
+ seq[i].join_assign(iq);
+ }
+ }
+ else {
+ // This is the first point seen: initialize `seq'.
+ point_seen = true;
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ seq[i].build(i_constraint(EQUAL, q));
+ }
+ }
+ }
+ }
+
+ if (!point_seen)
+ // The generator system is not empty, but contains no points.
+ throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines, rays and closure points.
+ for (Generator_System::const_iterator gs_i = gs_begin;
+ gs_i != gs_end; ++gs_i) {
+ const Generator& g = *gs_i;
+ switch (g.type()) {
+ case Generator::LINE:
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end();
+ i != i_end; ++i)
+ seq[i.variable().id()].assign(UNIVERSE);
+ break;
+ case Generator::RAY:
+ for (Generator::expr_type::const_iterator i = g.expression().begin(),
+ i_end = g.expression().end();
+ i != i_end; ++i)
+ switch (sgn(*i)) {
+ case 1:
+ seq[i.variable().id()].upper_extend();
+ break;
+ case -1:
+ seq[i.variable().id()].lower_extend();
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ break;
+ case Generator::CLOSURE_POINT:
+ {
+ const Coefficient& d = g.divisor();
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ ITV& seq_i = seq[i];
+ seq_i.lower_extend(i_constraint(GREATER_THAN, q));
+ seq_i.upper_extend(i_constraint(LESS_THAN, q));
+ }
+ }
+ break;
+ default:
+ // Points already dealt with.
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+ : seq(check_space_dimension_overflow(bds.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(bds)",
+ "bds exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // Expose all the interval constraints.
+ bds.shortest_path_closure_assign();
+ if (bds.marked_empty()) {
+ set_empty();
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ typedef typename BD_Shape<T>::coefficient_type Coeff;
+ PPL_DIRTY_TEMP(Coeff, tmp);
+ const DB_Row<Coeff>& dbm_0 = bds.dbm[0];
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ I_Constraint<Coeff> lower;
+ I_Constraint<Coeff> upper;
+ ITV& seq_i = seq[i];
+
+ // Set the upper bound.
+ const Coeff& u = dbm_0[i+1];
+ if (!is_plus_infinity(u))
+ upper.set(LESS_OR_EQUAL, u, true);
+
+ // Set the lower bound.
+ const Coeff& negated_l = bds.dbm[i+1][0];
+ if (!is_plus_infinity(negated_l)) {
+ neg_assign_r(tmp, negated_l, ROUND_DOWN);
+ lower.set(GREATER_OR_EQUAL, tmp);
+ }
+
+ seq_i.build(lower, upper);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+ : seq(check_space_dimension_overflow(oct.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(oct)",
+ "oct exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // Expose all the interval constraints.
+ oct.strong_closure_assign();
+ if (oct.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return;
+
+ PPL_DIRTY_TEMP(mpq_class, lower_bound);
+ PPL_DIRTY_TEMP(mpq_class, upper_bound);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ typedef typename Octagonal_Shape<T>::coefficient_type Coeff;
+ I_Constraint<mpq_class> lower;
+ I_Constraint<mpq_class> upper;
+ ITV& seq_i = seq[i];
+ const dimension_type ii = 2*i;
+ const dimension_type cii = ii + 1;
+
+ // Set the upper bound.
+ const Coeff& twice_ub = oct.matrix[cii][ii];
+ if (!is_plus_infinity(twice_ub)) {
+ assign_r(upper_bound, twice_ub, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_NOT_NEEDED);
+ upper.set(LESS_OR_EQUAL, upper_bound);
+ }
+
+ // Set the lower bound.
+ const Coeff& twice_lb = oct.matrix[ii][cii];
+ if (!is_plus_infinity(twice_lb)) {
+ assign_r(lower_bound, twice_lb, ROUND_NOT_NEEDED);
+ neg_assign_r(lower_bound, lower_bound, ROUND_NOT_NEEDED);
+ div_2exp_assign_r(lower_bound, lower_bound, 1, ROUND_NOT_NEEDED);
+ lower.set(GREATER_OR_EQUAL, lower_bound);
+ }
+ seq_i.build(lower, upper);
+ }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+ : seq(check_space_dimension_overflow(ph.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(ph)",
+ "ph exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ // We do not need to bother about `complexity' if:
+ // a) the polyhedron is already marked empty; or ...
+ if (ph.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // b) the polyhedron is zero-dimensional; or ...
+ const dimension_type space_dim = ph.space_dimension();
+ if (space_dim == 0)
+ return;
+
+ // c) the polyhedron is already described by a generator system.
+ if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+ Box tmp(ph.generators());
+ m_swap(tmp);
+ return;
+ }
+
+ // Here generators are not up-to-date or there are pending constraints.
+ PPL_ASSERT(ph.constraints_are_up_to_date());
+
+ if (complexity == POLYNOMIAL_COMPLEXITY) {
+ // FIXME: is there a way to avoid this initialization?
+ for (dimension_type i = space_dim; i-- > 0; )
+ seq[i].assign(UNIVERSE);
+ // Get a simplified version of the constraints.
+ const Constraint_System cs = ph.simplified_constraints();
+ // Propagate easy-to-find bounds from the constraints,
+ // allowing for a limited number of iterations.
+ // FIXME: 20 is just a wild guess.
+ const dimension_type max_iterations = 20;
+ propagate_constraints_no_check(cs, max_iterations);
+ }
+ else if (complexity == SIMPLEX_COMPLEXITY) {
+ MIP_Problem lp(space_dim);
+ const Constraint_System& ph_cs = ph.constraints();
+ if (!ph_cs.has_strict_inequalities())
+ lp.add_constraints(ph_cs);
+ else
+ // Adding to `lp' a topologically closed version of `ph_cs'.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_strict_inequality()) {
+ const Linear_Expression expr(c.expression());
+ lp.add_constraint(expr >= 0);
+ }
+ else
+ lp.add_constraint(c);
+ }
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ set_empty();
+ return;
+ }
+ // Get all the bounds for the space dimensions.
+ Generator g(point());
+ PPL_DIRTY_TEMP(mpq_class, lower_bound);
+ PPL_DIRTY_TEMP(mpq_class, upper_bound);
+ PPL_DIRTY_TEMP(Coefficient, bound_numer);
+ PPL_DIRTY_TEMP(Coefficient, bound_denom);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ I_Constraint<mpq_class> lower;
+ I_Constraint<mpq_class> upper;
+ ITV& seq_i = seq[i];
+ lp.set_objective_function(Variable(i));
+ // Evaluate upper bound.
+ lp.set_optimization_mode(MAXIMIZATION);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, bound_numer, bound_denom);
+ assign_r(upper_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(upper_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ PPL_ASSERT(is_canonical(upper_bound));
+ upper.set(LESS_OR_EQUAL, upper_bound);
+ }
+ // Evaluate optimal lower bound.
+ lp.set_optimization_mode(MINIMIZATION);
+ if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, bound_numer, bound_denom);
+ assign_r(lower_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(lower_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ PPL_ASSERT(is_canonical(lower_bound));
+ lower.set(GREATER_OR_EQUAL, lower_bound);
+ }
+ seq_i.build(lower, upper);
+ }
+ }
+ else {
+ PPL_ASSERT(complexity == ANY_COMPLEXITY);
+ if (ph.is_empty())
+ set_empty();
+ else {
+ Box tmp(ph.generators());
+ m_swap(tmp);
+ }
+ }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+ : seq(check_space_dimension_overflow(gr.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(gr)",
+ "gr exceeds the maximum "
+ "allowed space dimension")),
+ status() {
+
+ if (gr.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // The empty flag will be meaningful, whatever happens from now on.
+ set_empty_up_to_date();
+
+ const dimension_type space_dim = gr.space_dimension();
+
+ if (space_dim == 0)
+ return;
+
+ if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
+ // Updating found the grid empty.
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(!gr.gen_sys.empty());
+
+ // For each dimension that is bounded by the grid, set both bounds
+ // of the interval to the value of the associated coefficient in a
+ // generator point.
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ PPL_DIRTY_TEMP(Coefficient, bound_numer);
+ PPL_DIRTY_TEMP(Coefficient, bound_denom);
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ ITV& seq_i = seq[i];
+ Variable var(i);
+ bool max;
+ if (gr.maximize(var, bound_numer, bound_denom, max)) {
+ assign_r(bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+ assign_r(bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+ bound.canonicalize();
+ seq_i.build(i_constraint(EQUAL, bound));
+ }
+ else
+ seq_i.assign(UNIVERSE);
+ }
+}
+
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+ Complexity_Class complexity)
+ : seq(), status() {
+ check_space_dimension_overflow(dp.space_dimension(),
+ max_space_dimension(),
+ "PPL::Box::",
+ "Box(dp)",
+ "dp exceeds the maximum "
+ "allowed space dimension");
+ Box tmp1(dp.domain1(), complexity);
+ Box tmp2(dp.domain2(), complexity);
+ tmp1.intersection_assign(tmp2);
+ m_swap(tmp1);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "add_space_dimensions_and_embed(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+ // To embed an n-dimension space box in a (n+m)-dimension space,
+ // we just add `m' new universe elements to the sequence.
+ seq.insert(seq.end(), m, ITV(UNIVERSE));
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+ // Adding no dimensions is a no-op.
+ if (m == 0)
+ return;
+ check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "add_space_dimensions_and_project(m)",
+ "adding m new space dimensions exceeds "
+ "the maximum allowed space dimension");
+ // Add `m' new zero elements to the sequence.
+ seq.insert(seq.end(), m, ITV(0));
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+ const dimension_type x_space_dim = x.space_dimension();
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ if (x.is_empty())
+ return y.is_empty();
+
+ if (y.is_empty())
+ return x.is_empty();
+
+ for (dimension_type k = x_space_dim; k-- > 0; )
+ if (x.seq[k] != y.seq[k])
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+ // `expr' should be dimension-compatible with `*this'.
+ const dimension_type expr_space_dim = expr.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((from_above
+ ? "bounds_from_above(e)"
+ : "bounds_from_below(e)"), "e", expr);
+ // A zero-dimensional or empty Box bounds everything.
+ if (space_dim == 0 || is_empty())
+ return true;
+
+ const int from_above_sign = from_above ? 1 : -1;
+ // TODO: This loop can be optimized more, if needed, exploiting the
+ // (possible) sparseness of expr.
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ const Variable v = i.variable();
+ switch (sgn(*i) * from_above_sign) {
+ case 1:
+ if (seq[v.id()].upper_is_boundary_infinity())
+ return false;
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (seq[v.id()].lower_is_boundary_infinity())
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+ const Constraint::Type constraint_type,
+ Coefficient_traits::const_reference numer,
+ Coefficient_traits::const_reference denom) {
+
+ if (i.is_universe())
+ return Poly_Con_Relation::strictly_intersects();
+
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ assign_r(bound.get_num(), numer, ROUND_NOT_NEEDED);
+ assign_r(bound.get_den(), denom, ROUND_NOT_NEEDED);
+ bound.canonicalize();
+ neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+ const bool is_lower_bound = (denom > 0);
+
+ PPL_DIRTY_TEMP(mpq_class, bound_diff);
+ if (constraint_type == Constraint::EQUALITY) {
+ if (i.lower_is_boundary_infinity()) {
+ PPL_ASSERT(!i.upper_is_boundary_infinity());
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ return i.upper_is_open()
+ ? Poly_Con_Relation::is_disjoint()
+ : Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (i.lower_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+
+ PPL_ASSERT(constraint_type != Constraint::EQUALITY);
+ if (is_lower_bound) {
+ if (i.lower_is_boundary_infinity()) {
+ PPL_ASSERT(!i.upper_is_boundary_infinity());
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+ || i.lower_is_open()) {
+ Poly_Con_Relation result = Poly_Con_Relation::is_included();
+ if (i.is_singleton())
+ result = result && Poly_Con_Relation::saturates();
+ return result;
+ }
+ else {
+ PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+ && !i.lower_is_open());
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ case -1:
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case 1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.upper_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+ else {
+ // `c' is an upper bound.
+ if (i.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case -1:
+ return Poly_Con_Relation::is_included();
+ case 0:
+ if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+ || i.upper_is_open()) {
+ Poly_Con_Relation result = Poly_Con_Relation::is_included();
+ if (i.is_singleton())
+ result = result && Poly_Con_Relation::saturates();
+ return result;
+ }
+ else {
+ PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+ && !i.upper_is_open());
+ if (i.is_singleton())
+ return Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ case 1:
+ if (i.lower_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+ else {
+ assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+ sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+ switch (sgn(bound_diff)) {
+ case -1:
+ return Poly_Con_Relation::strictly_intersects();
+ case 0:
+ if (constraint_type == Constraint::STRICT_INEQUALITY
+ || i.lower_is_open())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case 1:
+ return Poly_Con_Relation::is_disjoint();
+ }
+ }
+ }
+ }
+ }
+
+ // Quiet a compiler warning: this program point is unreachable.
+ PPL_UNREACHABLE;
+ return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+ const dimension_type cg_space_dim = cg.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (cg_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(cg)", cg);
+
+ if (is_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if (cg.is_inconsistent())
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ }
+
+ if (cg.is_equality()) {
+ const Constraint c(cg);
+ return relation_with(c);
+ }
+
+ PPL_DIRTY_TEMP(Rational_Interval, r);
+ PPL_DIRTY_TEMP(Rational_Interval, t);
+ PPL_DIRTY_TEMP(mpq_class, m);
+ r = 0;
+ for (Congruence::expr_type::const_iterator i = cg.expression().begin(),
+ i_end = cg.expression().end(); i != i_end; ++i) {
+ const Coefficient& cg_i = *i;
+ const Variable v = i.variable();
+ assign_r(m, cg_i, ROUND_NOT_NEEDED);
+ // FIXME: an add_mul_assign() method would come handy here.
+ t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+ t *= m;
+ r += t;
+ }
+
+ if (r.lower_is_boundary_infinity() || r.upper_is_boundary_infinity())
+ return Poly_Con_Relation::strictly_intersects();
+
+
+ // Find the value that satisfies the congruence and is
+ // nearest to the lower bound such that the point lies on or above it.
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lower);
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ PPL_DIRTY_TEMP_COEFFICIENT(v);
+ mod = cg.modulus();
+ v = cg.inhomogeneous_term() % mod;
+ assign_r(lower, r.lower(), ROUND_DOWN);
+ v -= ((lower / mod) * mod);
+ if (v + lower > 0)
+ v -= mod;
+ return interval_relation(r, Constraint::EQUALITY, v);
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+ const dimension_type c_space_dim = c.space_dimension();
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (c_space_dim > space_dim)
+ throw_dimension_incompatible("relation_with(c)", c);
+
+ if (is_empty())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0) {
+ if ((c.is_equality() && c.inhomogeneous_term() != 0)
+ || (c.is_inequality() && c.inhomogeneous_term() < 0))
+ return Poly_Con_Relation::is_disjoint();
+ else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+ // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+ // thus, the zero-dimensional point also saturates it.
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (c.is_equality() || c.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else
+ // The zero-dimensional point saturates
+ // neither the positivity constraint 1 >= 0,
+ // nor the strict positivity constraint 1 > 0.
+ return Poly_Con_Relation::is_included();
+ }
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+
+ if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ if (c_num_vars == 0)
+ // c is a trivial constraint.
+ switch (sgn(c.inhomogeneous_term())) {
+ case -1:
+ return Poly_Con_Relation::is_disjoint();
+ case 0:
+ if (c.is_strict_inequality())
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ case 1:
+ return Poly_Con_Relation::is_included();
+ }
+ else {
+ // c is an interval constraint.
+ return interval_relation(seq[c_only_var],
+ c.type(),
+ c.inhomogeneous_term(),
+ c.coefficient(Variable(c_only_var)));
+ }
+ else {
+ // Deal with a non-trivial and non-interval constraint.
+ PPL_DIRTY_TEMP(Rational_Interval, r);
+ PPL_DIRTY_TEMP(Rational_Interval, t);
+ PPL_DIRTY_TEMP(mpq_class, m);
+ r = 0;
+ const Constraint::expr_type& e = c.expression();
+ for (Constraint::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i) {
+ assign_r(m, *i, ROUND_NOT_NEEDED);
+ const Variable v = i.variable();
+ // FIXME: an add_mul_assign() method would come handy here.
+ t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+ t *= m;
+ r += t;
+ }
+ return interval_relation(r,
+ c.type(),
+ c.inhomogeneous_term());
+ }
+
+ // Quiet a compiler warning: this program point is unreachable.
+ PPL_UNREACHABLE;
+ return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+ const dimension_type space_dim = space_dimension();
+ const dimension_type g_space_dim = g.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim < g_space_dim)
+ throw_dimension_incompatible("relation_with(g)", g);
+
+ // The empty box cannot subsume a generator.
+ if (is_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe box in a zero-dimensional space subsumes
+ // all the generators of a zero-dimensional space.
+ if (space_dim == 0)
+ return Poly_Gen_Relation::subsumes();
+
+ if (g.is_line_or_ray()) {
+ if (g.is_line()) {
+ const Generator::expr_type& e = g.expression();
+ for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i)
+ if (!seq[i.variable().id()].is_universe())
+ return Poly_Gen_Relation::nothing();
+ return Poly_Gen_Relation::subsumes();
+ }
+ else {
+ PPL_ASSERT(g.is_ray());
+ const Generator::expr_type& e = g.expression();
+ for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+ i != i_end; ++i) {
+ const Variable v = i.variable();
+ switch (sgn(*i)) {
+ case 1:
+ if (!seq[v.id()].upper_is_boundary_infinity())
+ return Poly_Gen_Relation::nothing();
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (!seq[v.id()].lower_is_boundary_infinity())
+ return Poly_Gen_Relation::nothing();
+ break;
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+ }
+ }
+
+ // Here `g' is a point or closure point.
+ const Coefficient& g_divisor = g.divisor();
+ PPL_DIRTY_TEMP(mpq_class, g_coord);
+ PPL_DIRTY_TEMP(mpq_class, bound);
+ // TODO: If the variables in the expression that have coefficient 0
+ // have no effect on seq[i], this loop can be optimized using
+ // Generator::expr_type::const_iterator.
+ for (dimension_type i = g_space_dim; i-- > 0; ) {
+ const ITV& seq_i = seq[i];
+ if (seq_i.is_universe())
+ continue;
+ assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+ assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+ g_coord.canonicalize();
+ // Check lower bound.
+ if (!seq_i.lower_is_boundary_infinity()) {
+ assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+ if (g_coord <= bound) {
+ if (seq_i.lower_is_open()) {
+ if (g.is_point() || g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ // Check upper bound.
+ if (!seq_i.upper_is_boundary_infinity()) {
+ assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+ if (g_coord >= bound) {
+ if (seq_i.upper_is_open()) {
+ if (g.is_point() || g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (g_coord != bound)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+}
+
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included) const {
+ // `expr' should be dimension-compatible with `*this'.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible((maximize
+ ? "maximize(e, ...)"
+ : "minimize(e, ...)"), "e", expr);
+ // Deal with zero-dim Box first.
+ if (space_dim == 0) {
+ if (marked_empty())
+ return false;
+ else {
+ ext_n = expr.inhomogeneous_term();
+ ext_d = 1;
+ included = true;
+ return true;
+ }
+ }
+
+ // For an empty Box we simply return false.
+ if (is_empty())
+ return false;
+
+ PPL_DIRTY_TEMP(mpq_class, result);
+ assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+ bool is_included = true;
+ const int maximize_sign = maximize ? 1 : -1;
+ PPL_DIRTY_TEMP(mpq_class, bound_i);
+ PPL_DIRTY_TEMP(mpq_class, expr_i);
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ const ITV& seq_i = seq[i.variable().id()];
+ assign_r(expr_i, *i, ROUND_NOT_NEEDED);
+ switch (sgn(expr_i) * maximize_sign) {
+ case 1:
+ if (seq_i.upper_is_boundary_infinity())
+ return false;
+ assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+ add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+ if (seq_i.upper_is_open())
+ is_included = false;
+ break;
+ case 0:
+ PPL_UNREACHABLE;
+ break;
+ case -1:
+ if (seq_i.lower_is_boundary_infinity())
+ return false;
+ assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+ add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+ if (seq_i.lower_is_open())
+ is_included = false;
+ break;
+ }
+ }
+ // Extract output info.
+ PPL_ASSERT(is_canonical(result));
+ ext_n = result.get_num();
+ ext_d = result.get_den();
+ included = is_included;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d,
+ bool& included,
+ Generator& g) const {
+ if (!max_min(expr, maximize, ext_n, ext_d, included))
+ return false;
+
+ // Compute generator `g'.
+ Linear_Expression g_expr;
+ PPL_DIRTY_TEMP(Coefficient, g_divisor);
+ g_divisor = 1;
+ const int maximize_sign = maximize ? 1 : -1;
+ PPL_DIRTY_TEMP(mpq_class, g_coord);
+ PPL_DIRTY_TEMP(Coefficient, numer);
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ PPL_DIRTY_TEMP(Coefficient, lcm);
+ PPL_DIRTY_TEMP(Coefficient, factor);
+ // TODO: Check if the following loop can be optimized to exploit the
+ // (possible) sparseness of expr.
+ for (dimension_type i = space_dimension(); i-- > 0; ) {
+ const ITV& seq_i = seq[i];
+ switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+ case 1:
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ break;
+ case 0:
+ // If 0 belongs to the interval, choose it
+ // (and directly proceed to the next iteration).
+ // FIXME: name qualification issue.
+ if (seq_i.contains(0))
+ continue;
+ if (!seq_i.lower_is_boundary_infinity())
+ if (seq_i.lower_is_open())
+ if (!seq_i.upper_is_boundary_infinity())
+ if (seq_i.upper_is_open()) {
+ // Bounded and open interval: compute middle point.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ PPL_DIRTY_TEMP(mpq_class, q_seq_i_upper);
+ assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+ g_coord += q_seq_i_upper;
+ g_coord /= 2;
+ }
+ else
+ // The upper bound is in the interval.
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ else {
+ // Lower is open, upper is unbounded.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ ++g_coord;
+ }
+ else
+ // The lower bound is in the interval.
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ else {
+ // Lower is unbounded, hence upper is bounded
+ // (since we know that 0 does not belong to the interval).
+ PPL_ASSERT(!seq_i.upper_is_boundary_infinity());
+ assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+ if (seq_i.upper_is_open())
+ --g_coord;
+ }
+ break;
+ case -1:
+ assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+ break;
+ }
+ // Add g_coord * Variable(i) to the generator.
+ assign_r(denom, g_coord.get_den(), ROUND_NOT_NEEDED);
+ lcm_assign(lcm, g_divisor, denom);
+ exact_div_assign(factor, lcm, g_divisor);
+ g_expr *= factor;
+ exact_div_assign(factor, lcm, denom);
+ assign_r(numer, g_coord.get_num(), ROUND_NOT_NEEDED);
+ numer *= factor;
+ g_expr += numer * Variable(i);
+ g_divisor = lcm;
+ }
+ g = Generator::point(g_expr, g_divisor);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+ const Box& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("contains(y)", y);
+
+ // If `y' is empty, then `x' contains `y'.
+ if (y.is_empty())
+ return true;
+
+ // If `x' is empty, then `x' cannot contain `y'.
+ if (x.is_empty())
+ return false;
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ // FIXME: fix this name qualification issue.
+ if (!x.seq[k].contains(y.seq[k]))
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+ const Box& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+ // If any of `x' or `y' is marked empty, then they are disjoint.
+ // Note: no need to use `is_empty', as the following loop is anyway correct.
+ if (x.marked_empty() || y.marked_empty())
+ return true;
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ // FIXME: fix this name qualification issue.
+ if (x.seq[k].is_disjoint_from(y.seq[k]))
+ return true;
+ return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+ Box& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+ // The lub of a box with an empty box is equal to the first box.
+ if (y.is_empty())
+ return true;
+ if (x.is_empty()) {
+ x = y;
+ return true;
+ }
+
+ bool x_j_does_not_contain_y_j = false;
+ bool y_j_does_not_contain_x_j = false;
+
+ for (dimension_type i = x.seq.size(); i-- > 0; ) {
+ const ITV& x_seq_i = x.seq[i];
+ const ITV& y_seq_i = y.seq[i];
+
+ if (!x_seq_i.can_be_exactly_joined_to(y_seq_i))
+ return false;
+
+ // Note: the use of `y_i_does_not_contain_x_i' is needed
+ // because we want to temporarily preserve the old value
+ // of `y_j_does_not_contain_x_j'.
+ bool y_i_does_not_contain_x_i = !y_seq_i.contains(x_seq_i);
+ if (y_i_does_not_contain_x_i && x_j_does_not_contain_y_j)
+ return false;
+ if (!x_seq_i.contains(y_seq_i)) {
+ if (y_j_does_not_contain_x_j)
+ return false;
+ else
+ x_j_does_not_contain_y_j = true;
+ }
+ if (y_i_does_not_contain_x_i)
+ y_j_does_not_contain_x_j = true;
+ }
+
+ // The upper bound is exact: compute it into *this.
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ x.seq[k].join_assign(y.seq[k]);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+ if (status.test_empty_up_to_date() && !status.test_empty()) {
+ Box tmp = *this;
+ tmp.reset_empty_up_to_date();
+ if (tmp.check_empty()) {
+#ifndef NDEBUG
+ std::cerr << "The box is empty, but it is marked as non-empty."
+ << std::endl;
+#endif // NDEBUG
+ return false;
+ }
+ }
+
+ // A box that is not marked empty must have meaningful intervals.
+ if (!marked_empty()) {
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].OK())
+ return false;
+ }
+
+ return true;
+}
+
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+ dimension_type d = space_dimension();
+ // A zero-space-dim box always has affine dimension zero.
+ if (d == 0)
+ return 0;
+
+ // An empty box has affine dimension zero.
+ if (is_empty())
+ return 0;
+
+ for (dimension_type k = d; k-- > 0; )
+ if (seq[k].is_singleton())
+ --d;
+
+ return d;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+ PPL_ASSERT(!marked_empty());
+ Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (seq[k].is_empty()) {
+ x.set_empty();
+ return true;
+ }
+ x.set_nonempty();
+ return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+ if (marked_empty())
+ return false;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_universe())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+ if (ITV::is_always_topologically_closed() || is_empty())
+ return true;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_topologically_closed())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+ if (is_empty())
+ return true;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_singleton())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+ if (is_empty())
+ return true;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].is_bounded())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+ if (marked_empty())
+ return false;
+ for (dimension_type k = seq.size(); k-- > 0; )
+ if (!seq[k].contains_integer_point())
+ return false;
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::frequency(const Linear_Expression& expr,
+ Coefficient& freq_n, Coefficient& freq_d,
+ Coefficient& val_n, Coefficient& val_d) const {
+ dimension_type space_dim = space_dimension();
+ // The dimension of `expr' must be at most the dimension of *this.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+ // Check if `expr' has a constant value.
+ // If it is constant, set the frequency `freq_n' to 0
+ // and return true. Otherwise the values for \p expr
+ // are not discrete so return false.
+
+ // Space dimension is 0: if empty, then return false;
+ // otherwise the frequency is 0 and the value is the inhomogeneous term.
+ if (space_dim == 0) {
+ if (is_empty())
+ return false;
+ freq_n = 0;
+ freq_d = 1;
+ val_n = expr.inhomogeneous_term();
+ val_d = 1;
+ return true;
+ }
+
+ // For an empty Box, we simply return false.
+ if (is_empty())
+ return false;
+
+ // The Box has at least 1 dimension and is not empty.
+ PPL_DIRTY_TEMP_COEFFICIENT(numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP(mpq_class, tmp);
+ Coefficient c = expr.inhomogeneous_term();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+ val_denom = 1;
+
+ for (Linear_Expression::const_iterator i = expr.begin(), i_end = expr.end();
+ i != i_end; ++i) {
+ const ITV& seq_i = seq[i.variable().id()];
+ // Check if `v' is constant in the BD shape.
+ if (seq_i.is_singleton()) {
+ // If `v' is constant, replace it in `le' by the value.
+ assign_r(tmp, seq_i.lower(), ROUND_NOT_NEEDED);
+ numer = tmp.get_num();
+ denom = tmp.get_den();
+ c *= denom;
+ c += numer * val_denom * (*i);
+ val_denom *= denom;
+ continue;
+ }
+ // The expression `expr' is not constant.
+ return false;
+ }
+
+ // The expression `expr' is constant.
+ freq_n = 0;
+ freq_d = 1;
+
+ // Reduce `val_n' and `val_d'.
+ normalize2(c, val_denom, val_n, val_d);
+ return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dimension() < var_space_dim)
+ throw_dimension_incompatible("constrains(v)", "v", var);
+
+ if (marked_empty() || !seq[var_space_dim-1].is_universe())
+ return true;
+ // Now force an emptiness check.
+ return is_empty();
+}
+
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& vars) {
+ // The cylindrification with respect to no dimensions is a no-op.
+ // This case also captures the only legal cylindrification
+ // of a box in a 0-dim space.
+ if (vars.empty())
+ return;
+
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+ // If the box is already empty, there is nothing left to do.
+ if (marked_empty())
+ return;
+
+ // Here the box might still be empty (but we haven't detected it yet):
+ // check emptiness of the interval for each of the variables in
+ // `vars' before cylindrification.
+ for (Variables_Set::const_iterator vsi = vars.begin(),
+ vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+ ITV& seq_vsi = seq[*vsi];
+ if (!seq_vsi.is_empty())
+ seq_vsi.assign(UNIVERSE);
+ else {
+ set_empty();
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+ if (ITV::is_always_topologically_closed() || is_empty())
+ return;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ seq[k].topological_closure_assign();
+}
+
+template <typename ITV>
+void
+Box<ITV>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+#if 0 // Generic implementation commented out.
+ Implementation::wrap_assign(*this,
+ vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually,
+ "Box");
+#else // Specialized implementation.
+ PPL_USED(wrap_individually);
+ PPL_USED(complexity_threshold);
+ Box& x = *this;
+
+ // Dimension-compatibility check for `*cs_p', if any.
+ const dimension_type vars_space_dim = vars.space_dimension();
+ if (cs_p != 0 && cs_p->space_dimension() > vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Box<ITV>::wrap_assign(vars, w, r, o, cs_p, ...):"
+ << std::endl
+ << "vars.space_dimension() == " << vars_space_dim
+ << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping no variable only requires refining with *cs_p, if any.
+ if (vars.empty()) {
+ if (cs_p != 0)
+ refine_with_constraints(*cs_p);
+ return;
+ }
+
+ // Dimension-compatibility check for `vars'.
+ const dimension_type space_dim = x.space_dimension();
+ if (space_dim < vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Box<ITV>::wrap_assign(vars, ...):"
+ << std::endl
+ << "this->space_dimension() == " << space_dim
+ << ", required space dimension == " << vars_space_dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping an empty polyhedron is a no-op.
+ if (x.is_empty())
+ return;
+
+ // FIXME: temporarily (ab-) using Coefficient.
+ // Set `min_value' and `max_value' to the minimum and maximum values
+ // a variable of width `w' and signedness `s' can take.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ if (r == UNSIGNED) {
+ min_value = 0;
+ mul_2exp_assign(max_value, Coefficient_one(), w);
+ --max_value;
+ }
+ else {
+ PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+ mul_2exp_assign(max_value, Coefficient_one(), w-1);
+ neg_assign(min_value, max_value);
+ --max_value;
+ }
+
+ // FIXME: Build the (integer) quadrant interval.
+ PPL_DIRTY_TEMP(ITV, integer_quadrant_itv);
+ PPL_DIRTY_TEMP(ITV, rational_quadrant_itv);
+ {
+ I_Constraint<Coefficient> lower = i_constraint(GREATER_OR_EQUAL, min_value);
+ I_Constraint<Coefficient> upper = i_constraint(LESS_OR_EQUAL, max_value);
+ integer_quadrant_itv.build(lower, upper);
+ // The rational quadrant is only needed if overflow is undefined.
+ if (o == OVERFLOW_UNDEFINED) {
+ ++max_value;
+ upper = i_constraint(LESS_THAN, max_value);
+ rational_quadrant_itv.build(lower, upper);
+ }
+ }
+
+ const Variables_Set::const_iterator vs_end = vars.end();
+
+ if (cs_p == 0) {
+ // No constraint refinement is needed here.
+ switch (o) {
+ case OVERFLOW_WRAPS:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+ x.seq[*i].wrap_assign(w, r, integer_quadrant_itv);
+ reset_empty_up_to_date();
+ break;
+ case OVERFLOW_UNDEFINED:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+ ITV& x_seq_v = x.seq[*i];
+ if (!rational_quadrant_itv.contains(x_seq_v)) {
+ x_seq_v.assign(integer_quadrant_itv);
+ }
+ }
+ break;
+ case OVERFLOW_IMPOSSIBLE:
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+ x.seq[*i].intersect_assign(integer_quadrant_itv);
+ reset_empty_up_to_date();
+ break;
+ }
+ PPL_ASSERT(x.OK());
+ return;
+ }
+
+ PPL_ASSERT(cs_p != 0);
+ const Constraint_System& cs = *cs_p;
+ // A map associating interval constraints to variable indexes.
+ typedef std::map<dimension_type, std::vector<const Constraint*> > map_type;
+ map_type var_cs_map;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ i_end = cs.end(); i != i_end; ++i) {
+ const Constraint& c = *i;
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+ if (c_num_vars == 1) {
+ // An interval constraint on variable index `c_only_var'.
+ PPL_ASSERT(c_only_var < space_dim);
+ // We do care about c if c_only_var is going to be wrapped.
+ if (vars.find(c_only_var) != vs_end)
+ var_cs_map[c_only_var].push_back(&c);
+ }
+ else {
+ PPL_ASSERT(c_num_vars == 0);
+ // Note: tautologies have been filtered out by iterators.
+ PPL_ASSERT(c.is_inconsistent());
+ x.set_empty();
+ return;
+ }
+ }
+ }
+
+ PPL_DIRTY_TEMP(ITV, refinement_itv);
+ const map_type::const_iterator var_cs_map_end = var_cs_map.end();
+ // Loop through the variable indexes in `vars'.
+ for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+ const dimension_type v = *i;
+ refinement_itv = integer_quadrant_itv;
+ // Look for the refinement constraints for space dimension index `v'.
+ map_type::const_iterator var_cs_map_iter = var_cs_map.find(v);
+ if (var_cs_map_iter != var_cs_map_end) {
+ // Refine interval for variable `v'.
+ const map_type::mapped_type& var_cs = var_cs_map_iter->second;
+ for (dimension_type j = var_cs.size(); j-- > 0; ) {
+ const Constraint& c = *var_cs[j];
+ refine_interval_no_check(refinement_itv,
+ c.type(),
+ c.inhomogeneous_term(),
+ c.coefficient(Variable(v)));
+ }
+ }
+ // Wrap space dimension index `v'.
+ ITV& x_seq_v = x.seq[v];
+ switch (o) {
+ case OVERFLOW_WRAPS:
+ x_seq_v.wrap_assign(w, r, refinement_itv);
+ break;
+ case OVERFLOW_UNDEFINED:
+ if (!rational_quadrant_itv.contains(x_seq_v))
+ x_seq_v.assign(UNIVERSE);
+ break;
+ case OVERFLOW_IMPOSSIBLE:
+ x_seq_v.intersect_assign(refinement_itv);
+ break;
+ }
+ }
+ PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(Complexity_Class) {
+ if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+ && !ITV::info_type::store_open)
+ return;
+
+ if (marked_empty())
+ return;
+
+ for (dimension_type k = seq.size(); k-- > 0; )
+ seq[k].drop_some_non_integer_points();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class) {
+ // Dimension-compatibility check.
+ const dimension_type min_space_dim = vars.space_dimension();
+ if (space_dimension() < min_space_dim)
+ throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+ min_space_dim);
+
+ if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+ && !ITV::info_type::store_open)
+ return;
+
+ if (marked_empty())
+ return;
+
+ for (Variables_Set::const_iterator v_i = vars.begin(),
+ v_end = vars.end(); v_i != v_end; ++v_i)
+ seq[*v_i].drop_some_non_integer_points();
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ x.throw_dimension_incompatible("intersection_assign(y)", y);
+
+ // If one of the two boxes is empty, the intersection is empty.
+ if (x.marked_empty())
+ return;
+ if (y.marked_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ // If both boxes are zero-dimensional, then at this point they are
+ // necessarily non-empty, so that their intersection is non-empty too.
+ if (space_dim == 0)
+ return;
+
+ // FIXME: here we may conditionally exploit a capability of the
+ // underlying interval to eagerly detect empty results.
+ reset_empty_up_to_date();
+
+ for (dimension_type k = space_dim; k-- > 0; )
+ x.seq[k].intersect_assign(y.seq[k]);
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::upper_bound_assign(const Box& y) {
+ Box& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dimension() != y.space_dimension())
+ x.throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+ // The lub of a box with an empty box is equal to the first box.
+ if (y.is_empty())
+ return;
+ if (x.is_empty()) {
+ x = y;
+ return;
+ }
+
+ for (dimension_type k = x.seq.size(); k-- > 0; )
+ x.seq[k].join_assign(y.seq[k]);
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+ const dimension_type y_space_dim = y.space_dimension();
+
+ // If `y' is marked empty, the result will be empty too.
+ if (y.marked_empty())
+ x.set_empty();
+
+ // If `y' is a 0-dim space box, there is nothing left to do.
+ if (y_space_dim == 0)
+ return;
+ // The resulting space dimension must be at most the maximum.
+ check_space_dimension_overflow(y.space_dimension(),
+ max_space_dimension() - space_dimension(),
+ "PPL::Box::",
+ "concatenate_assign(y)",
+ "concatenation exceeds the maximum "
+ "allowed space dimension");
+ // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+ // make sure that reallocation will occur once at most.
+ x.seq.reserve(x_space_dim + y_space_dim);
+
+ // If `x' is marked empty, then it is sufficient to adjust
+ // the dimension of the vector space.
+ if (x.marked_empty()) {
+ x.seq.insert(x.seq.end(), y_space_dim, ITV(EMPTY));
+ PPL_ASSERT(x.OK());
+ return;
+ }
+
+ // Here neither `x' nor `y' are marked empty: concatenate them.
+ std::copy(y.seq.begin(), y.seq.end(),
+ std::back_insert_iterator<Sequence>(x.seq));
+ // Update the `empty_up_to_date' flag.
+ if (!y.status.test_empty_up_to_date())
+ reset_empty_up_to_date();
+
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::difference_assign(const Box& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("difference_assign(y)", y);
+
+ Box& x = *this;
+ if (x.is_empty() || y.is_empty())
+ return;
+
+ switch (space_dim) {
+ case 0:
+ // If `x' is zero-dimensional, then at this point both `x' and `y'
+ // are the universe box, so that their difference is empty.
+ x.set_empty();
+ break;
+
+ case 1:
+ x.seq[0].difference_assign(y.seq[0]);
+ if (x.seq[0].is_empty())
+ x.set_empty();
+ break;
+
+ default:
+ {
+ dimension_type index_non_contained = space_dim;
+ dimension_type number_non_contained = 0;
+ for (dimension_type i = space_dim; i-- > 0; )
+ if (!y.seq[i].contains(x.seq[i])) {
+ if (++number_non_contained == 1)
+ index_non_contained = i;
+ else
+ break;
+ }
+
+ switch (number_non_contained) {
+ case 0:
+ // `y' covers `x': the difference is empty.
+ x.set_empty();
+ break;
+ case 1:
+ x.seq[index_non_contained]
+ .difference_assign(y.seq[index_non_contained]);
+ if (x.seq[index_non_contained].is_empty())
+ x.set_empty();
+ break;
+ default:
+ // Nothing to do: the difference is `x'.
+ break;
+ }
+ }
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type num_dims = x.space_dimension();
+ // Dimension-compatibility check.
+ if (num_dims != y.space_dimension())
+ x.throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+ // Filter away the zero-dimensional case.
+ if (num_dims == 0) {
+ if (y.marked_empty()) {
+ x.set_nonempty();
+ return false;
+ }
+ else
+ return !x.marked_empty();
+ }
+
+ // Filter away the case when `y' is empty.
+ if (y.is_empty()) {
+ for (dimension_type i = num_dims; i-- > 0; )
+ x.seq[i].assign(UNIVERSE);
+ x.set_nonempty();
+ return false;
+ }
+
+ if (x.is_empty()) {
+ // Find in `y' a non-universe interval, if any.
+ for (dimension_type i = 0; i < num_dims; ++i) {
+ if (y.seq[i].is_universe())
+ x.seq[i].assign(UNIVERSE);
+ else {
+ // Set x.seq[i] so as to contradict y.seq[i], if possible.
+ ITV& seq_i = x.seq[i];
+ seq_i.empty_intersection_assign(y.seq[i]);
+ if (seq_i.is_empty()) {
+ // We were not able to assign to `seq_i' a non-empty interval:
+ // reset `seq_i' to the universe interval and keep searching.
+ seq_i.assign(UNIVERSE);
+ continue;
+ }
+ // We assigned to `seq_i' a non-empty interval:
+ // set the other intervals to universe and return.
+ for (++i; i < num_dims; ++i)
+ x.seq[i].assign(UNIVERSE);
+ x.set_nonempty();
+ PPL_ASSERT(x.OK());
+ return false;
+ }
+ }
+ // All intervals in `y' are universe or could not be contradicted:
+ // simplification can leave the empty box `x' as is.
+ PPL_ASSERT(x.OK() && x.is_empty());
+ return false;
+ }
+
+ // Loop index `i' is intentionally going upwards.
+ for (dimension_type i = 0; i < num_dims; ++i) {
+ if (!x.seq[i].simplify_using_context_assign(y.seq[i])) {
+ PPL_ASSERT(!x.seq[i].is_empty());
+ // The intersection of `x' and `y' is empty due to the i-th interval:
+ // reset other intervals to UNIVERSE.
+ for (dimension_type j = num_dims; j-- > i; )
+ x.seq[j].assign(UNIVERSE);
+ for (dimension_type j = i; j-- > 0; )
+ x.seq[j].assign(UNIVERSE);
+ PPL_ASSERT(x.OK());
+ return false;
+ }
+ }
+ PPL_ASSERT(x.OK());
+ return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+ Box& x = *this;
+ const dimension_type x_space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ x.throw_dimension_incompatible("time_elapse_assign(y)", y);
+
+ // Dealing with the zero-dimensional case.
+ if (x_space_dim == 0) {
+ if (y.marked_empty())
+ x.set_empty();
+ return;
+ }
+
+ // If either one of `x' or `y' is empty, the result is empty too.
+ // Note: if possible, avoid cost of checking for emptiness.
+ if (x.marked_empty() || y.marked_empty()
+ || x.is_empty() || y.is_empty()) {
+ x.set_empty();
+ return;
+ }
+
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ ITV& x_seq_i = x.seq[i];
+ const ITV& y_seq_i = y.seq[i];
+ if (!x_seq_i.lower_is_boundary_infinity())
+ if (y_seq_i.lower_is_boundary_infinity() || y_seq_i.lower() < 0)
+ x_seq_i.lower_extend();
+ if (!x_seq_i.upper_is_boundary_infinity())
+ if (y_seq_i.upper_is_boundary_infinity() || y_seq_i.upper() > 0)
+ x_seq_i.upper_extend();
+ }
+ PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& vars) {
+ // The removal of no dimensions from any box is a no-op.
+ // Note that this case also captures the only legal removal of
+ // space dimensions from a box in a zero-dimensional space.
+ if (vars.empty()) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ const dimension_type old_space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ const dimension_type vsi_space_dim = vars.space_dimension();
+ if (old_space_dim < vsi_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)",
+ vsi_space_dim);
+
+ const dimension_type new_space_dim = old_space_dim - vars.size();
+
+ // If the box is empty (this must be detected), then resizing is all
+ // what is needed. If it is not empty and we are removing _all_ the
+ // dimensions then, again, resizing suffices.
+ if (is_empty() || new_space_dim == 0) {
+ seq.resize(new_space_dim);
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ // For each variable to be removed, we fill the corresponding interval
+ // by shifting left those intervals that will not be removed.
+ Variables_Set::const_iterator vsi = vars.begin();
+ Variables_Set::const_iterator vsi_end = vars.end();
+ dimension_type dst = *vsi;
+ dimension_type src = dst + 1;
+ for (++vsi; vsi != vsi_end; ++vsi) {
+ const dimension_type vsi_next = *vsi;
+ // All intervals in between are moved to the left.
+ while (src < vsi_next)
+ swap(seq[dst++], seq[src++]);
+ ++src;
+ }
+ // Moving the remaining intervals.
+ while (src < old_space_dim)
+ swap(seq[dst++], seq[src++]);
+
+ PPL_ASSERT(dst == new_space_dim);
+ seq.resize(new_space_dim);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dimension) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ const dimension_type space_dim = space_dimension();
+ if (new_dimension > space_dim)
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dimension);
+
+ // The removal of no dimensions from any box is a no-op.
+ // Note that this case also captures the only legal removal of
+ // dimensions from a zero-dim space box.
+ if (new_dimension == space_dim) {
+ PPL_ASSERT(OK());
+ return;
+ }
+
+ seq.resize(new_dimension);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0)
+ return;
+
+ if (pfunc.has_empty_codomain()) {
+ // All dimensions vanish: the box becomes zero_dimensional.
+ remove_higher_space_dimensions(0);
+ return;
+ }
+
+ const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+ // If the box is empty, then simply adjust the space dimension.
+ if (is_empty()) {
+ remove_higher_space_dimensions(new_space_dim);
+ return;
+ }
+
+ // We create a new Box with the new space dimension.
+ Box<ITV> tmp(new_space_dim);
+ // Map the intervals, exchanging the indexes.
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ dimension_type new_i;
+ if (pfunc.maps(i, new_i))
+ swap(seq[i], tmp.seq[new_i]);
+ }
+ m_swap(tmp);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& vars,
+ const Variable dest) {
+ const dimension_type space_dim = space_dimension();
+ // `dest' should be one of the dimensions of the box.
+ if (dest.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+ // The folding of no dimensions is a no-op.
+ if (vars.empty())
+ return;
+
+ // All variables in `vars' should be dimensions of the box.
+ if (vars.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+ vars.space_dimension());
+
+ // Moreover, `dest.id()' should not occur in `vars'.
+ if (vars.find(dest.id()) != vars.end())
+ throw_invalid_argument("fold_space_dimensions(vs, v)",
+ "v should not occur in vs");
+
+ // Note: the check for emptiness is needed for correctness.
+ if (!is_empty()) {
+ // Join the interval corresponding to variable `dest' with the intervals
+ // corresponding to the variables in `vars'.
+ ITV& seq_v = seq[dest.id()];
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vs_end = vars.end(); i != vs_end; ++i)
+ seq_v.join_assign(seq[*i]);
+ }
+ remove_space_dimensions(vars);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Throw an exception if c is not an interval constraints.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ throw_invalid_argument("add_constraint(c)",
+ "c is not an interval constraint");
+
+ // Throw an exception if c is a nontrivial strict constraint
+ // and ITV does not support open boundaries.
+ if (c.is_strict_inequality() && c_num_vars != 0
+ && ITV::is_always_topologically_closed())
+ throw_invalid_argument("add_constraint(c)",
+ "c is a nontrivial strict constraint");
+
+ // Avoid doing useless work if the box is known to be empty.
+ if (marked_empty())
+ return;
+
+ const Coefficient& n = c.inhomogeneous_term();
+ if (c_num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (n < 0
+ || (c.is_equality() && n != 0)
+ || (c.is_strict_inequality() && n == 0))
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(c_num_vars == 1);
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+ // Note: even when the box is known to be empty, we need to go
+ // through all the constraints to fulfill the method's contract
+ // for what concerns exception throwing.
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ add_constraint_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ // Set aside the case of proper congruences.
+ if (cg.is_proper_congruence()) {
+ if (cg.is_inconsistent()) {
+ set_empty();
+ return;
+ }
+ else if (cg.is_tautological())
+ return;
+ else
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is a nontrivial proper congruence");
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ dimension_type cg_num_vars = 0;
+ dimension_type cg_only_var = 0;
+ // Throw an exception if c is not an interval congruence.
+ if (!Box_Helpers::extract_interval_congruence(cg, cg_num_vars, cg_only_var))
+ throw_invalid_argument("add_congruence(cg)",
+ "cg is not an interval congruence");
+
+ // Avoid doing useless work if the box is known to be empty.
+ if (marked_empty())
+ return;
+
+ const Coefficient& n = cg.inhomogeneous_term();
+ if (cg_num_vars == 0) {
+ // Dealing with a trivial equality congruence.
+ if (n != 0)
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(cg_num_vars == 1);
+ const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+ add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+ PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+ // Note: even when the box is known to be empty, we need to go
+ // through all the congruences to fulfill the method's contract
+ // for what concerns exception throwing.
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ add_congruence_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+ PPL_ASSERT(!marked_empty());
+
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Non-interval constraints are approximated.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+ propagate_constraint_no_check(c);
+ return;
+ }
+
+ const Coefficient& n = c.inhomogeneous_term();
+ if (c_num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (n < 0
+ || (c.is_equality() && n != 0)
+ || (c.is_strict_inequality() && n == 0))
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(c_num_vars == 1);
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+ refine_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+ PPL_ASSERT(!marked_empty());
+
+ PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+ if (cg.is_proper_congruence()) {
+ // A proper congruences is also an interval constraint
+ // if and only if it is trivial.
+ if (cg.is_inconsistent())
+ set_empty();
+ return;
+ }
+
+ PPL_ASSERT(cg.is_equality());
+ Constraint c(cg);
+ refine_no_check(c);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+ PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+ refine_no_check(*i);
+ PPL_ASSERT(OK());
+}
+
+#if 1 // Alternative implementations for propagate_constraint_no_check.
+namespace Implementation {
+
+namespace Boxes {
+
+inline bool
+propagate_constraint_check_result(Result r, Ternary& open) {
+ r = result_relation_class(r);
+ switch (r) {
+ case V_GT_MINUS_INFINITY:
+ case V_LT_PLUS_INFINITY:
+ return true;
+ case V_LT:
+ case V_GT:
+ open = T_YES;
+ return false;
+ case V_LE:
+ case V_GE:
+ if (open == T_NO)
+ open = T_MAYBE;
+ return false;
+ case V_EQ:
+ return false;
+ default:
+ PPL_UNREACHABLE;
+ return true;
+ }
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+ using namespace Implementation::Boxes;
+
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ typedef
+ typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+ Temp_Boundary_Type;
+
+ const dimension_type c_space_dim = c.space_dimension();
+ const Constraint::Type c_type = c.type();
+ const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+
+ // Find a space dimension having a non-zero coefficient (if any).
+ const dimension_type last_k
+ = c.expression().last_nonzero(1, c_space_dim + 1);
+ if (last_k == c_space_dim + 1) {
+ // Constraint c is trivial: check if it is inconsistent.
+ if (c_inhomogeneous_term < 0
+ || (c_inhomogeneous_term == 0
+ && c_type != Constraint::NONSTRICT_INEQUALITY))
+ set_empty();
+ return;
+ }
+
+ // Here constraint c is non-trivial.
+ PPL_ASSERT(last_k <= c_space_dim);
+ Temp_Boundary_Type t_bound;
+ Temp_Boundary_Type t_a;
+ Temp_Boundary_Type t_x;
+ Ternary open;
+ const Constraint::expr_type c_e = c.expression();
+ for (Constraint::expr_type::const_iterator k = c_e.begin(),
+ k_end = c_e.lower_bound(Variable(last_k)); k != k_end; ++k) {
+ const Coefficient& a_k = *k;
+ const Variable k_var = k.variable();
+ const int sgn_a_k = sgn(a_k);
+ if (sgn_a_k == 0)
+ continue;
+ Result r;
+ if (sgn_a_k > 0) {
+ open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+ if (open == T_NO)
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(last_k)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.lower_is_boundary_infinity())
+ goto maybe_refine_upper_1;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.upper_is_boundary_infinity())
+ goto maybe_refine_upper_1;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_1;
+
+ // Refine the lower bound of `seq[k]' with `t_bound'.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ {
+ const Relation_Symbol rel
+ = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ }
+ reset_empty_up_to_date();
+ maybe_refine_upper_1:
+ if (c_type != Constraint::EQUALITY)
+ continue;
+ open = T_NO;
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.upper_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.lower_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+
+ // Refine the upper bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ const Relation_Symbol rel
+ = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ reset_empty_up_to_date();
+ }
+ else {
+ PPL_ASSERT(sgn_a_k < 0);
+ open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+ if (open == T_NO)
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.lower_is_boundary_infinity())
+ goto maybe_refine_upper_2;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.upper_is_boundary_infinity())
+ goto maybe_refine_upper_2;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto maybe_refine_upper_2;
+
+ // Refine the upper bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ {
+ const Relation_Symbol rel
+ = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ }
+ reset_empty_up_to_date();
+ maybe_refine_upper_2:
+ if (c_type != Constraint::EQUALITY)
+ continue;
+ open = T_NO;
+ maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+ r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ if (i_var.id() == k_var.id())
+ continue;
+ const Coefficient& a_i = *i;
+ const int sgn_a_i = sgn(a_i);
+ ITV& x_i = seq[i_var.id()];
+ if (sgn_a_i < 0) {
+ if (x_i.upper_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.upper(), ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.upper_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ else {
+ PPL_ASSERT(sgn_a_i > 0);
+ if (x_i.lower_is_boundary_infinity())
+ goto next_k;
+ r = assign_r(t_a, a_i, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ if (x_i.lower_is_open())
+ open = T_YES;
+ r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ }
+ }
+ r = assign_r(t_a, a_k, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+ r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+ if (propagate_constraint_check_result(r, open))
+ goto next_k;
+
+ // Refine the lower bound of seq[k] with t_bound.
+ if (open == T_MAYBE
+ && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+ open = T_YES;
+ const Relation_Symbol rel
+ = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+ reset_empty_up_to_date();
+ }
+ next_k:
+ ;
+ }
+}
+
+#else // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+ PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+ dimension_type c_space_dim = c.space_dimension();
+ ITV k[c_space_dim];
+ ITV p[c_space_dim];
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ k[i_var.id()] = *i;
+ ITV& p_i = p[i_var.id()];
+ p_i = seq[i_var.id()];
+ p_i.mul_assign(p_i, k[i_var.id()]);
+ }
+ const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+ for (Constraint::expr_type::const_iterator i = c_e.begin(),
+ i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+ const Variable i_var = i.variable();
+ int sgn_coefficient_i = sgn(*i);
+ ITV q(inhomogeneous_term);
+ for (Constraint::expr_type::const_iterator j = c_e.begin(),
+ j_end = c_e.lower_bound(Variable(c_space_dim)); j != j_end; ++j) {
+ const Variable j_var = j.variable();
+ if (i_var == j_var)
+ continue;
+ q.add_assign(q, p[j_var.id()]);
+ }
+ q.div_assign(q, k[i_var.id()]);
+ q.neg_assign(q);
+ Relation_Symbol rel;
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ rel = EQUAL;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+ break;
+ }
+ seq[i_var.id()].add_constraint(i_constraint(rel, q));
+ // FIXME: could/should we exploit the return value of add_constraint
+ // in case it is available?
+ // FIXME: should we instead be lazy and do not even bother about
+ // the possibility the interval becomes empty apart from setting
+ // empty_up_to_date = false?
+ if (seq[i_var.id()].is_empty()) {
+ set_empty();
+ break;
+ }
+ }
+
+ PPL_ASSERT(OK());
+}
+
+#endif // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>
+::propagate_constraints_no_check(const Constraint_System& cs,
+ const dimension_type max_iterations) {
+ const dimension_type space_dim = space_dimension();
+ PPL_ASSERT(cs.space_dimension() <= space_dim);
+
+ const Constraint_System::const_iterator cs_begin = cs.begin();
+ const Constraint_System::const_iterator cs_end = cs.end();
+ const dimension_type propagation_weight
+ = Implementation::num_constraints(cs) * space_dim;
+
+ Sequence copy;
+ bool changed;
+ dimension_type num_iterations = 0;
+ do {
+ WEIGHT_BEGIN();
+ ++num_iterations;
+ copy = seq;
+ for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i)
+ propagate_constraint_no_check(*i);
+
+ WEIGHT_ADD_MUL(40, propagation_weight);
+ // Check if the client has requested abandoning all expensive
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+
+ // NOTE: if max_iterations == 0 (i.e., no iteration limit is set)
+ // the following test will anyway trigger on wrap around.
+ if (num_iterations == max_iterations)
+ break;
+
+ changed = (copy != seq);
+ } while (changed);
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ if (is_empty())
+ return;
+
+ Tmp_Interval_Type expr_value;
+ Tmp_Interval_Type temp0;
+ Tmp_Interval_Type temp1;
+ expr_value.assign(expr.inhomogeneous_term());
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ temp0.assign(*i);
+ temp1.assign(seq[i.variable().id()]);
+ temp0.mul_assign(temp0, temp1);
+ expr_value.add_assign(expr_value, temp0);
+ }
+ if (denominator != 1) {
+ temp0.assign(denominator);
+ expr_value.div_assign(expr_value, temp0);
+ }
+ seq[var.id()].assign(expr_value);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_form_image(const Variable var,
+ const Linear_Form<ITV>& lf) {
+
+ // Check that ITV has a floating point boundary type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<typename ITV::boundary_type>
+ ::is_exact, "Box<ITV>::affine_form_image(Variable, Linear_Form):"
+ "ITV has not a floating point boundary type.");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ const dimension_type lf_space_dim = lf.space_dimension();
+ if (space_dim < lf_space_dim)
+ throw_dimension_incompatible("affine_form_image(var, lf)", "lf", lf);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_form_image(var, lf)", "var", var);
+
+ if (is_empty())
+ return;
+
+ // Intervalization of 'lf'.
+ ITV result = lf.inhomogeneous_term();
+ for (dimension_type i = 0; i < lf_space_dim; ++i) {
+ ITV current_addend = lf.coefficient(Variable(i));
+ const ITV& curr_int = seq[i];
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ seq[var.id()].assign(result);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type x_space_dim = space_dimension();
+ const dimension_type expr_space_dim = expr.space_dimension();
+ if (x_space_dim < expr_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (x_space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+ if (is_empty())
+ return;
+
+ const Coefficient& expr_v = expr.coefficient(var);
+ const bool invertible = (expr_v != 0);
+ if (!invertible) {
+ Tmp_Interval_Type expr_value;
+ Tmp_Interval_Type temp0;
+ Tmp_Interval_Type temp1;
+ expr_value.assign(expr.inhomogeneous_term());
+ for (Linear_Expression::const_iterator i = expr.begin(),
+ i_end = expr.end(); i != i_end; ++i) {
+ temp0.assign(*i);
+ temp1.assign(seq[i.variable().id()]);
+ temp0.mul_assign(temp0, temp1);
+ expr_value.add_assign(expr_value, temp0);
+ }
+ if (denominator != 1) {
+ temp0.assign(denominator);
+ expr_value.div_assign(expr_value, temp0);
+ }
+ ITV& x_seq_v = seq[var.id()];
+ expr_value.intersect_assign(x_seq_v);
+ if (expr_value.is_empty())
+ set_empty();
+ else
+ x_seq_v.assign(UNIVERSE);
+ }
+ else {
+ // The affine transformation is invertible.
+ // CHECKME: for efficiency, would it be meaningful to avoid
+ // the computation of inverse by partially evaluating the call
+ // to affine_image?
+ Linear_Expression inverse;
+ inverse -= expr;
+ inverse += (expr_v + denominator) * var;
+ affine_image(var, inverse, expr_v);
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+ "ub", ub_expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+ // Any image of an empty box is empty.
+ if (is_empty())
+ return;
+
+ // Add the constraint implied by the `lb_expr' and `ub_expr'.
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= ub_expr);
+ else
+ refine_with_constraint(lb_expr >= ub_expr);
+
+ // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+ if (lb_expr.coefficient(var) == 0) {
+ // Here `var' can only occur in `ub_expr'.
+ generalized_affine_image(var,
+ LESS_OR_EQUAL,
+ ub_expr,
+ denominator);
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= denominator*var);
+ else
+ refine_with_constraint(denominator*var <= lb_expr);
+ }
+ else if (ub_expr.coefficient(var) == 0) {
+ // Here `var' can only occur in `lb_expr'.
+ generalized_affine_image(var,
+ GREATER_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (denominator > 0)
+ refine_with_constraint(denominator*var <= ub_expr);
+ else
+ refine_with_constraint(ub_expr <= denominator*var);
+ }
+ else {
+ // Here `var' occurs in both `lb_expr' and `ub_expr'. As boxes
+ // can only use the non-relational constraints, we find the
+ // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+ // box and use these instead of the `ub-expr' and `lb-expr'.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ ITV& seq_v = seq[var.id()];
+ if (maximize(ub_expr, max_numer, max_denom, max_included)) {
+ if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+ // The `ub_expr' has a maximum value and the `lb_expr'
+ // has a minimum value for the box.
+ // Set the bounds for `var' using the minimum for `lb_expr'.
+ min_denom *= denominator;
+ PPL_DIRTY_TEMP(mpq_class, q1);
+ PPL_DIRTY_TEMP(mpq_class, q2);
+ assign_r(q1.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q1.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q1.canonicalize();
+ // Now make the maximum of lb_expr the upper bound. If the
+ // maximum is not at a box point, then inequality is strict.
+ max_denom *= denominator;
+ assign_r(q2.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q2.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q2.canonicalize();
+
+ if (denominator > 0) {
+ Relation_Symbol gr = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ Relation_Symbol lr = max_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_v.build(i_constraint(gr, q1), i_constraint(lr, q2));
+ }
+ else {
+ Relation_Symbol gr = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ Relation_Symbol lr = min_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_v.build(i_constraint(gr, q2), i_constraint(lr, q1));
+ }
+ }
+ else {
+ // The `ub_expr' has a maximum value but the `lb_expr'
+ // has no minimum value for the box.
+ // Set the bounds for `var' using the maximum for `lb_expr'.
+ PPL_DIRTY_TEMP(mpq_class, q);
+ max_denom *= denominator;
+ assign_r(q.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ Relation_Symbol rel = (denominator > 0)
+ ? (max_included ? LESS_OR_EQUAL : LESS_THAN)
+ : (max_included ? GREATER_OR_EQUAL : GREATER_THAN);
+ seq_v.build(i_constraint(rel, q));
+ }
+ }
+ else if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+ // The `ub_expr' has no maximum value but the `lb_expr'
+ // has a minimum value for the box.
+ // Set the bounds for `var' using the minimum for `lb_expr'.
+ min_denom *= denominator;
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q.canonicalize();
+
+ Relation_Symbol rel = (denominator > 0)
+ ? (min_included ? GREATER_OR_EQUAL : GREATER_THAN)
+ : (min_included ? LESS_OR_EQUAL : LESS_THAN);
+ seq_v.build(i_constraint(rel, q));
+ }
+ else {
+ // The `ub_expr' has no maximum value and the `lb_expr'
+ // has no minimum value for the box.
+ // So we set the bounds to be unbounded.
+ seq_v.assign(UNIVERSE);
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ const dimension_type space_dim = space_dimension();
+ if (denominator == 0)
+ throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ // `var' should be one of the dimensions of the polyhedron.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "v", var);
+ // The dimension of `lb_expr' and `ub_expr' should not be
+ // greater than the dimension of `*this'.
+ const dimension_type lb_space_dim = lb_expr.space_dimension();
+ if (space_dim < lb_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "lb", lb_expr);
+ const dimension_type ub_space_dim = ub_expr.space_dimension();
+ if (space_dim < ub_space_dim)
+ throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+ "ub", ub_expr);
+
+ // Any preimage of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ const bool negative_denom = (denominator < 0);
+ const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+ const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
+
+ // If the implied constraint between `ub_expr and `lb_expr' is
+ // independent of `var', then impose it now.
+ if (lb_var_coeff == ub_var_coeff) {
+ if (negative_denom)
+ refine_with_constraint(lb_expr >= ub_expr);
+ else
+ refine_with_constraint(lb_expr <= ub_expr);
+ }
+
+ ITV& seq_var = seq[var.id()];
+ if (!seq_var.is_universe()) {
+ // We want to work with a positive denominator,
+ // so the sign and its (unsigned) value are separated.
+ PPL_DIRTY_TEMP_COEFFICIENT(pos_denominator);
+ pos_denominator = denominator;
+ if (negative_denom)
+ neg_assign(pos_denominator, pos_denominator);
+ // Store all the information about the upper and lower bounds
+ // for `var' before making this interval unbounded.
+ bool open_lower = seq_var.lower_is_open();
+ bool unbounded_lower = seq_var.lower_is_boundary_infinity();
+ PPL_DIRTY_TEMP(mpq_class, q_seq_var_lower);
+ PPL_DIRTY_TEMP(Coefficient, numer_lower);
+ PPL_DIRTY_TEMP(Coefficient, denom_lower);
+ if (!unbounded_lower) {
+ assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+ assign_r(numer_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+ assign_r(denom_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+ if (negative_denom)
+ neg_assign(denom_lower, denom_lower);
+ numer_lower *= pos_denominator;
+ seq_var.lower_extend();
+ }
+ bool open_upper = seq_var.upper_is_open();
+ bool unbounded_upper = seq_var.upper_is_boundary_infinity();
+ PPL_DIRTY_TEMP(mpq_class, q_seq_var_upper);
+ PPL_DIRTY_TEMP(Coefficient, numer_upper);
+ PPL_DIRTY_TEMP(Coefficient, denom_upper);
+ if (!unbounded_upper) {
+ assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+ assign_r(numer_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+ assign_r(denom_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+ if (negative_denom)
+ neg_assign(denom_upper, denom_upper);
+ numer_upper *= pos_denominator;
+ seq_var.upper_extend();
+ }
+
+ if (!unbounded_lower) {
+ // `lb_expr' is revised by removing the `var' component,
+ // multiplying by `-' denominator of the lower bound for `var',
+ // and adding the lower bound for `var' to the inhomogeneous term.
+ Linear_Expression revised_lb_expr(ub_expr);
+ revised_lb_expr -= ub_var_coeff * var;
+ PPL_DIRTY_TEMP(Coefficient, d);
+ neg_assign(d, denom_lower);
+ revised_lb_expr *= d;
+ revised_lb_expr += numer_lower;
+
+ // Find the minimum value for the revised lower bound expression
+ // and use this to refine the appropriate bound.
+ bool included;
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ if (minimize(revised_lb_expr, numer_lower, denom, included)) {
+ denom_lower *= (denom * ub_var_coeff);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer_lower, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom_lower, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ if (!included)
+ open_lower = true;
+ Relation_Symbol rel;
+ if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+ rel = open_lower ? GREATER_THAN : GREATER_OR_EQUAL;
+ else
+ rel = open_lower ? LESS_THAN : LESS_OR_EQUAL;
+ seq_var.add_constraint(i_constraint(rel, q));
+ if (seq_var.is_empty()) {
+ set_empty();
+ return;
+ }
+ }
+ }
+
+ if (!unbounded_upper) {
+ // `ub_expr' is revised by removing the `var' component,
+ // multiplying by `-' denominator of the upper bound for `var',
+ // and adding the upper bound for `var' to the inhomogeneous term.
+ Linear_Expression revised_ub_expr(lb_expr);
+ revised_ub_expr -= lb_var_coeff * var;
+ PPL_DIRTY_TEMP(Coefficient, d);
+ neg_assign(d, denom_upper);
+ revised_ub_expr *= d;
+ revised_ub_expr += numer_upper;
+
+ // Find the maximum value for the revised upper bound expression
+ // and use this to refine the appropriate bound.
+ bool included;
+ PPL_DIRTY_TEMP(Coefficient, denom);
+ if (maximize(revised_ub_expr, numer_upper, denom, included)) {
+ denom_upper *= (denom * lb_var_coeff);
+ PPL_DIRTY_TEMP(mpq_class, q);
+ assign_r(q.get_num(), numer_upper, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), denom_upper, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ if (!included)
+ open_upper = true;
+ Relation_Symbol rel;
+ if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+ rel = open_upper ? LESS_THAN : LESS_OR_EQUAL;
+ else
+ rel = open_upper ? GREATER_THAN : GREATER_OR_EQUAL;
+ seq_var.add_constraint(i_constraint(rel, q));
+ if (seq_var.is_empty()) {
+ set_empty();
+ return;
+ }
+ }
+ }
+ }
+
+ // If the implied constraint between `ub_expr and `lb_expr' is
+ // dependent on `var', then impose on the new box.
+ if (lb_var_coeff != ub_var_coeff) {
+ if (denominator > 0)
+ refine_with_constraint(lb_expr <= ub_expr);
+ else
+ refine_with_constraint(lb_expr >= ub_expr);
+ }
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+ "v", var);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // First compute the affine image.
+ affine_image(var, expr, denominator);
+
+ if (relsym == EQUAL)
+ // The affine relation is indeed an affine function.
+ return;
+
+ // Any image of an empty box is empty.
+ if (is_empty())
+ return;
+
+ ITV& seq_var = seq[var.id()];
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ seq_var.lower_extend();
+ break;
+ case LESS_THAN:
+ seq_var.lower_extend();
+ if (!seq_var.upper_is_boundary_infinity())
+ seq_var.remove_sup();
+ break;
+ case GREATER_OR_EQUAL:
+ seq_var.upper_extend();
+ break;
+ case GREATER_THAN:
+ seq_var.upper_extend();
+ if (!seq_var.lower_is_boundary_infinity())
+ seq_var.remove_inf();
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator)
+{
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "d == 0");
+
+ // Dimension-compatibility checks.
+ const dimension_type space_dim = space_dimension();
+ // The dimension of `expr' should not be greater than the dimension
+ // of `*this'.
+ if (space_dim < expr.space_dimension())
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "e", expr);
+ // `var' should be one of the dimensions of the box.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (space_dim < var_space_dim)
+ throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+ "v", var);
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+ "r is the disequality relation symbol");
+
+ // Check whether the affine relation is indeed an affine function.
+ if (relsym == EQUAL) {
+ affine_preimage(var, expr, denominator);
+ return;
+ }
+
+ // Compute the reversed relation symbol to simplify later coding.
+ Relation_Symbol reversed_relsym;
+ switch (relsym) {
+ case LESS_THAN:
+ reversed_relsym = GREATER_THAN;
+ break;
+ case LESS_OR_EQUAL:
+ reversed_relsym = GREATER_OR_EQUAL;
+ break;
+ case GREATER_OR_EQUAL:
+ reversed_relsym = LESS_OR_EQUAL;
+ break;
+ case GREATER_THAN:
+ reversed_relsym = LESS_THAN;
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ // Check whether the preimage of this affine relation can be easily
+ // computed as the image of its inverse relation.
+ const Coefficient& var_coefficient = expr.coefficient(var);
+ if (var_coefficient != 0) {
+ Linear_Expression inverse_expr
+ = expr - (denominator + var_coefficient) * var;
+ PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+ neg_assign(inverse_denominator, var_coefficient);
+ Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_denominator))
+ ? relsym
+ : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse_expr,
+ inverse_denominator);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the box by adding the constraint induced
+ // by the affine relation.
+ // First, compute the maximum and minimum value reached by
+ // `denominator*var' on the box as we need to use non-relational
+ // expressions.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ bool bound_above = maximize(denominator*var, max_numer, max_denom, max_included);
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool bound_below = minimize(denominator*var, min_numer, min_denom, min_included);
+ // Use the correct relation symbol
+ const Relation_Symbol corrected_relsym
+ = (denominator > 0) ? relsym : reversed_relsym;
+ // Revise the expression to take into account the denominator of the
+ // maximum/minimum value for `var'.
+ Linear_Expression revised_expr;
+ PPL_DIRTY_TEMP_COEFFICIENT(d);
+ if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+ if (bound_below) {
+ revised_expr = expr;
+ revised_expr.set_inhomogeneous_term(Coefficient_zero());
+ revised_expr *= d;
+ }
+ }
+ else {
+ if (bound_above) {
+ revised_expr = expr;
+ revised_expr.set_inhomogeneous_term(Coefficient_zero());
+ revised_expr *= max_denom;
+ }
+ }
+
+ switch (corrected_relsym) {
+ case LESS_THAN:
+ if (bound_below)
+ refine_with_constraint(min_numer < revised_expr);
+ break;
+ case LESS_OR_EQUAL:
+ if (bound_below)
+ (min_included)
+ ? refine_with_constraint(min_numer <= revised_expr)
+ : refine_with_constraint(min_numer < revised_expr);
+ break;
+ case GREATER_OR_EQUAL:
+ if (bound_above)
+ (max_included)
+ ? refine_with_constraint(max_numer >= revised_expr)
+ : refine_with_constraint(max_numer > revised_expr);
+ break;
+ case GREATER_THAN:
+ if (bound_above)
+ refine_with_constraint(max_numer > revised_expr);
+ break;
+ default:
+ // The EQUAL and NOT_EQUAL cases have been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ // If the shrunk box is empty, its preimage is empty too.
+ if (is_empty())
+ return;
+ ITV& seq_v = seq[var.id()];
+ seq_v.assign(UNIVERSE);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty box is empty.
+ if (marked_empty())
+ return;
+
+ // Compute the maximum and minimum value reached by the rhs on the box.
+ PPL_DIRTY_TEMP(Coefficient, max_numer);
+ PPL_DIRTY_TEMP(Coefficient, max_denom);
+ bool max_included;
+ bool max_rhs = maximize(rhs, max_numer, max_denom, max_included);
+ PPL_DIRTY_TEMP(Coefficient, min_numer);
+ PPL_DIRTY_TEMP(Coefficient, min_denom);
+ bool min_included;
+ bool min_rhs = minimize(rhs, min_numer, min_denom, min_included);
+
+ // Check whether there is 0, 1 or more than one variable in the lhs
+ // and record the variable with the highest dimension; set the box
+ // intervals to be unbounded for all other dimensions with non-zero
+ // coefficients in the lhs.
+ bool has_var = false;
+ dimension_type has_var_id = lhs.last_nonzero();
+
+ if (has_var_id != 0) {
+ has_var = true;
+ --has_var_id;
+ dimension_type other_var = lhs.first_nonzero(1, has_var_id + 1);
+ --other_var;
+ if (other_var != has_var_id) {
+ // There is more than one dimension with non-zero coefficient, so
+ // we cannot have any information about the dimensions in the lhs.
+ ITV& seq_var = seq[has_var_id];
+ seq_var.assign(UNIVERSE);
+ // Since all but the highest dimension with non-zero coefficient
+ // in the lhs have been set unbounded, it remains to set the
+ // highest dimension in the lhs unbounded.
+ ITV& seq_i = seq[other_var];
+ seq_i.assign(UNIVERSE);
+ PPL_ASSERT(OK());
+ return;
+ }
+ }
+
+ if (has_var) {
+ // There is exactly one dimension with non-zero coefficient.
+ ITV& seq_var = seq[has_var_id];
+
+ // Compute the new bounds for this dimension defined by the rhs
+ // expression.
+ const Coefficient& inhomo = lhs.inhomogeneous_term();
+ const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+ PPL_DIRTY_TEMP(mpq_class, q_max);
+ PPL_DIRTY_TEMP(mpq_class, q_min);
+ if (max_rhs) {
+ max_numer -= inhomo * max_denom;
+ max_denom *= coeff;
+ assign_r(q_max.get_num(), max_numer, ROUND_NOT_NEEDED);
+ assign_r(q_max.get_den(), max_denom, ROUND_NOT_NEEDED);
+ q_max.canonicalize();
+ }
+ if (min_rhs) {
+ min_numer -= inhomo * min_denom;
+ min_denom *= coeff;
+ assign_r(q_min.get_num(), min_numer, ROUND_NOT_NEEDED);
+ assign_r(q_min.get_den(), min_denom, ROUND_NOT_NEEDED);
+ q_min.canonicalize();
+ }
+
+ // The choice as to which bounds should be set depends on the sign
+ // of the coefficient of the dimension `has_var_id' in the lhs.
+ if (coeff > 0)
+ // The coefficient of the dimension in the lhs is positive.
+ switch (relsym) {
+ case LESS_OR_EQUAL:
+ if (max_rhs) {
+ Relation_Symbol rel = max_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_var.build(i_constraint(rel, q_max));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case LESS_THAN:
+ if (max_rhs)
+ seq_var.build(i_constraint(LESS_THAN, q_max));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case EQUAL:
+ {
+ I_Constraint<mpq_class> l;
+ I_Constraint<mpq_class> u;
+ if (max_rhs)
+ u.set(max_included ? LESS_OR_EQUAL : LESS_THAN, q_max);
+ if (min_rhs)
+ l.set(min_included ? GREATER_OR_EQUAL : GREATER_THAN, q_min);
+ seq_var.build(l, u);
+ break;
+ }
+ case GREATER_OR_EQUAL:
+ if (min_rhs) {
+ Relation_Symbol rel = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ seq_var.build(i_constraint(rel, q_min));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case GREATER_THAN:
+ if (min_rhs)
+ seq_var.build(i_constraint(GREATER_THAN, q_min));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ else
+ // The coefficient of the dimension in the lhs is negative.
+ switch (relsym) {
+ case GREATER_OR_EQUAL:
+ if (min_rhs) {
+ Relation_Symbol rel = min_included ? LESS_OR_EQUAL : LESS_THAN;
+ seq_var.build(i_constraint(rel, q_min));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case GREATER_THAN:
+ if (min_rhs)
+ seq_var.build(i_constraint(LESS_THAN, q_min));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case EQUAL:
+ {
+ I_Constraint<mpq_class> l;
+ I_Constraint<mpq_class> u;
+ if (max_rhs)
+ l.set(max_included ? GREATER_OR_EQUAL : GREATER_THAN, q_max);
+ if (min_rhs)
+ u.set(min_included ? LESS_OR_EQUAL : LESS_THAN, q_min);
+ seq_var.build(l, u);
+ break;
+ }
+ case LESS_OR_EQUAL:
+ if (max_rhs) {
+ Relation_Symbol rel = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+ seq_var.build(i_constraint(rel, q_max));
+ }
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ case LESS_THAN:
+ if (max_rhs)
+ seq_var.build(i_constraint(GREATER_THAN, q_max));
+ else
+ seq_var.assign(UNIVERSE);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+
+ else {
+ // The lhs is a constant value, so we just need to add the
+ // appropriate constraint.
+ const Coefficient& inhomo = lhs.inhomogeneous_term();
+ switch (relsym) {
+ case LESS_THAN:
+ refine_with_constraint(inhomo < rhs);
+ break;
+ case LESS_OR_EQUAL:
+ refine_with_constraint(inhomo <= rhs);
+ break;
+ case EQUAL:
+ refine_with_constraint(inhomo == rhs);
+ break;
+ case GREATER_OR_EQUAL:
+ refine_with_constraint(inhomo >= rhs);
+ break;
+ case GREATER_THAN:
+ refine_with_constraint(inhomo > rhs);
+ break;
+ default:
+ // The NOT_EQUAL case has been already dealt with.
+ PPL_UNREACHABLE;
+ break;
+ }
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ // Dimension-compatibility checks.
+ // The dimension of `lhs' should not be greater than the dimension
+ // of `*this'.
+ dimension_type lhs_space_dim = lhs.space_dimension();
+ const dimension_type space_dim = space_dimension();
+ if (space_dim < lhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e1", lhs);
+ // The dimension of `rhs' should not be greater than the dimension
+ // of `*this'.
+ const dimension_type rhs_space_dim = rhs.space_dimension();
+ if (space_dim < rhs_space_dim)
+ throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+ "e2", rhs);
+
+ // The relation symbol cannot be a disequality.
+ if (relsym == NOT_EQUAL)
+ throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+ "r is the disequality relation symbol");
+
+ // Any image of an empty box is empty.
+ if (marked_empty())
+ return;
+
+ // For any dimension occurring in the lhs, swap and change the sign
+ // of this component for the rhs and lhs. Then use these in a call
+ // to generalized_affine_image/3.
+ Linear_Expression revised_lhs = lhs;
+ Linear_Expression revised_rhs = rhs;
+ for (Linear_Expression::const_iterator i = lhs.begin(),
+ i_end = lhs.end(); i != i_end; ++i) {
+ const Variable var = i.variable();
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+ tmp = *i;
+ tmp += rhs.coefficient(var);
+ sub_mul_assign(revised_rhs, tmp, var);
+ sub_mul_assign(revised_lhs, tmp, var);
+ }
+ generalized_affine_image(revised_lhs, relsym, revised_rhs);
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T, typename Iterator>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_widening_assign(const T& y, Iterator first, Iterator last) {
+ if (y.is_empty())
+ return;
+
+ for (dimension_type i = seq.size(); i-- > 0; )
+ seq[i].CC76_widening_assign(y.seq[i], first, last);
+
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_widening_assign(const T& y, unsigned* tp) {
+ static typename ITV::boundary_type stop_points[] = {
+ typename ITV::boundary_type(-2),
+ typename ITV::boundary_type(-1),
+ typename ITV::boundary_type(0),
+ typename ITV::boundary_type(1),
+ typename ITV::boundary_type(2)
+ };
+
+ Box& x = *this;
+ // If there are tokens available, work on a temporary copy.
+ if (tp != 0 && *tp > 0) {
+ Box<ITV> x_tmp(x);
+ x_tmp.CC76_widening_assign(y, 0);
+ // If the widening was not precise, use one of the available tokens.
+ if (!x.contains(x_tmp))
+ --(*tp);
+ return;
+ }
+ x.CC76_widening_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+template <typename ITV>
+void
+Box<ITV>::get_limiting_box(const Constraint_System& cs,
+ Box& limiting_box) const {
+ // Private method: the caller has to ensure the following.
+ PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+ for (Constraint_System::const_iterator cs_i = cs.begin(),
+ cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+ const Constraint& c = *cs_i;
+ dimension_type c_num_vars = 0;
+ dimension_type c_only_var = 0;
+ // Constraints that are not interval constraints are ignored.
+ if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+ continue;
+ // Trivial constraints are ignored.
+ if (c_num_vars != 0) {
+ // c is a non-trivial interval constraint.
+ // add interval constraint to limiting box
+ const Coefficient& n = c.inhomogeneous_term();
+ const Coefficient& d = c.coefficient(Variable(c_only_var));
+ if (interval_relation(seq[c_only_var], c.type(), n, d)
+ == Poly_Con_Relation::is_included())
+ limiting_box.add_interval_constraint_no_check(c_only_var, c.type(),
+ n, d);
+ }
+ }
+}
+
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ Box& x = *this;
+ const dimension_type space_dim = x.space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+ y);
+ // `cs' must be dimension-compatible with the two boxes.
+ const dimension_type cs_space_dim = cs.space_dimension();
+ if (space_dim < cs_space_dim)
+ throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+ // The limited CC76-extrapolation between two boxes in a
+ // zero-dimensional space is also a zero-dimensional box
+ if (space_dim == 0)
+ return;
+
+ // Assume `y' is contained in or equal to `*this'.
+ PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+ // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+ if (marked_empty())
+ return;
+ // If `y' is empty, we return.
+ if (y.marked_empty())
+ return;
+
+ // Build a limiting box using all the constraints in cs
+ // that are satisfied by *this.
+ Box limiting_box(space_dim, UNIVERSE);
+ get_limiting_box(cs, limiting_box);
+
+ x.CC76_widening_assign(y, tp);
+
+ // Intersect the widened box with the limiting box.
+ intersection_assign(limiting_box);
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+ && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+ void>::type
+Box<ITV>::CC76_narrowing_assign(const T& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+ // Assume `*this' is contained in or equal to `y'.
+ PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+ // If both boxes are zero-dimensional,
+ // since `y' contains `*this', we simply return `*this'.
+ if (space_dim == 0)
+ return;
+
+ // If `y' is empty, since `y' contains `this', `*this' is empty too.
+ if (y.is_empty())
+ return;
+ // If `*this' is empty, we return.
+ if (is_empty())
+ return;
+
+ // Replace each constraint in `*this' by the corresponding constraint
+ // in `y' if the corresponding inhomogeneous terms are both finite.
+ for (dimension_type i = space_dim; i-- > 0; ) {
+ ITV& x_i = seq[i];
+ const ITV& y_i = y.seq[i];
+ if (!x_i.lower_is_boundary_infinity()
+ && !y_i.lower_is_boundary_infinity()
+ && x_i.lower() != y_i.lower())
+ x_i.lower() = y_i.lower();
+ if (!x_i.upper_is_boundary_infinity()
+ && !y_i.upper_is_boundary_infinity()
+ && x_i.upper() != y_i.upper())
+ x_i.upper() = y_i.upper();
+ }
+ PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ if (marked_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k >= n);
+ else
+ cs.insert(d * v_k > n);
+ }
+ if (has_upper_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k <= n);
+ else
+ cs.insert(d * v_k < n);
+ }
+ }
+ return cs;
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+ const dimension_type space_dim = space_dimension();
+ Constraint_System cs;
+ cs.set_space_dimension(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ return cs;
+ }
+
+ // Make sure emptiness is detected.
+ if (is_empty()) {
+ cs.insert(Constraint::zero_dim_false());
+ return cs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed)) {
+ if (closed)
+ // Make sure equality constraints are detected.
+ if (seq[k].is_singleton()) {
+ cs.insert(d * v_k == n);
+ continue;
+ }
+ else
+ cs.insert(d * v_k >= n);
+ else
+ cs.insert(d * v_k > n);
+ }
+ if (has_upper_bound(v_k, n, d, closed)) {
+ if (closed)
+ cs.insert(d * v_k <= n);
+ else
+ cs.insert(d * v_k < n);
+ }
+ }
+ return cs;
+}
+
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+ const dimension_type space_dim = space_dimension();
+ Congruence_System cgs(space_dim);
+
+ if (space_dim == 0) {
+ if (marked_empty())
+ cgs = Congruence_System::zero_dim_empty();
+ return cgs;
+ }
+
+ // Make sure emptiness is detected.
+ if (is_empty()) {
+ cgs.insert(Congruence::zero_dim_false());
+ return cgs;
+ }
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ const Variable v_k = Variable(k);
+ PPL_DIRTY_TEMP(Coefficient, n);
+ PPL_DIRTY_TEMP(Coefficient, d);
+ bool closed = false;
+ if (has_lower_bound(v_k, n, d, closed) && closed)
+ // Make sure equality congruences are detected.
+ if (seq[k].is_singleton())
+ cgs.insert((d * v_k %= n) / 0);
+ }
+ return cgs;
+}
+
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+ memory_size_type n = seq.capacity() * sizeof(ITV);
+ for (dimension_type k = seq.size(); k-- > 0; )
+ n += seq[k].external_memory_in_bytes();
+ return n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+ if (box.is_empty())
+ s << "false";
+ else if (box.is_universe())
+ s << "true";
+ else
+ for (dimension_type k = 0,
+ space_dim = box.space_dimension(); k < space_dim; ) {
+ s << Variable(k) << " in " << box[k];
+ ++k;
+ if (k < space_dim)
+ s << ", ";
+ else
+ break;
+ }
+ return s;
+}
+
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+ const char separator = ' ';
+ status.ascii_dump(s);
+ const dimension_type space_dim = space_dimension();
+ s << "space_dim" << separator << space_dim;
+ s << "\n";
+ for (dimension_type i = 0; i < space_dim; ++i)
+ seq[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
+
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+ if (!status.ascii_load(s))
+ return false;
+
+ std::string str;
+ dimension_type space_dim;
+ if (!(s >> str) || str != "space_dim")
+ return false;
+ if (!(s >> space_dim))
+ return false;
+
+ seq.clear();
+ ITV seq_i;
+ for (dimension_type i = 0; i < space_dim; ++i) {
+ if (seq_i.ascii_load(s))
+ seq.push_back(seq_i);
+ else
+ return false;
+ }
+
+ // Check invariants.
+ PPL_ASSERT(OK());
+ return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Box& y) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << this->space_dimension()
+ << ", y->space_dimension() == " << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+ dimension_type required_dim) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", required dimension == " << required_dim << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Constraint& c) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", c->space_dimension == " << c.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Congruence& cg) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cg->space_dimension == " << cg.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Constraint_System& cs) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cs->space_dimension == " << cs.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Congruence_System& cgs) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", g->space_dimension == " << g.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& le) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << le << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const char* le_name,
+ const Linear_Expression& le) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << le_name << "->space_dimension() == "
+ << le.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+template <typename C>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+ const char* lf_name,
+ const Linear_Form<C>& lf) const {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << lf_name << "->space_dimension() == "
+ << lf.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_invalid_argument(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Box::" << method << ":" << std::endl
+ << reason;
+ throw std::invalid_argument(s.str());
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+ typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+ const Box<ITV>& x, const Box<ITV>& y,
+ const Rounding_Dir dir,
+ Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+ const dimension_type x_space_dim = x.space_dimension();
+ // Dimension-compatibility check.
+ if (x_space_dim != y.space_dimension())
+ return false;
+
+ // Zero-dim boxes are equal if and only if they are both empty or universe.
+ if (x_space_dim == 0) {
+ if (x.marked_empty() == y.marked_empty())
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ else
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+ }
+
+ // The distance computation requires a check for emptiness.
+ (void) x.is_empty();
+ (void) y.is_empty();
+ // If one of two boxes is empty, then they are equal if and only if
+ // the other box is empty too.
+ if (x.marked_empty() || y.marked_empty()) {
+ if (x.marked_empty() == y.marked_empty()) {
+ assign_r(r, 0, ROUND_NOT_NEEDED);
+ return true;
+ }
+ else
+ goto pinf;
+ }
+
+ assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+ for (dimension_type i = x_space_dim; i-- > 0; ) {
+ const ITV& x_i = x.seq[i];
+ const ITV& y_i = y.seq[i];
+ // Dealing with the lower bounds.
+ if (x_i.lower_is_boundary_infinity()) {
+ if (!y_i.lower_is_boundary_infinity())
+ goto pinf;
+ }
+ else if (y_i.lower_is_boundary_infinity())
+ goto pinf;
+ else {
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i.lower() > y_i.lower()) {
+ maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+ maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+ maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ // Dealing with the lower bounds.
+ if (x_i.upper_is_boundary_infinity())
+ if (y_i.upper_is_boundary_infinity())
+ continue;
+ else
+ goto pinf;
+ else if (y_i.upper_is_boundary_infinity())
+ goto pinf;
+ else {
+ const Temp* tmp1p;
+ const Temp* tmp2p;
+ if (x_i.upper() > y_i.upper()) {
+ maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+ maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+ }
+ else {
+ maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+ maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+ }
+ sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+ PPL_ASSERT(sgn(tmp1) >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+
+ pinf:
+ assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 2285. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_templates.hh line 30. */
+#include <stdexcept>
+#include <iostream>
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v)
+ : vec() {
+ const dimension_type space_dim = v.space_dimension();
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1, zero);
+ vec[v.space_dimension()] = C(typename C::boundary_type(1));
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v, const Variable w)
+ : vec() {
+ const dimension_type v_space_dim = v.space_dimension();
+ const dimension_type w_space_dim = w.space_dimension();
+ const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(v, w):\n"
+ "v or w exceed the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1, zero);
+ if (v_space_dim != w_space_dim) {
+ vec[v_space_dim] = C(typename C::boundary_type(1));
+ vec[w_space_dim] = C(typename C::boundary_type(-1));
+ }
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Linear_Expression& e)
+ : vec() {
+ const dimension_type space_dim = e.space_dimension();
+ if (space_dim > max_space_dimension())
+ throw std::length_error("Linear_Form<C>::"
+ "Linear_Form(e):\n"
+ "e exceeds the maximum allowed "
+ "space dimension.");
+ vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+ vec.resize(space_dim+1);
+ for (dimension_type i = space_dim; i-- > 0; )
+ vec[i+1] = e.coefficient(Variable(i));
+ vec[0] = e.inhomogeneous_term();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ dimension_type min_size;
+ dimension_type max_size;
+ const Linear_Form<C>* p_e_max;
+ if (f1_size > f2_size) {
+ min_size = f2_size;
+ max_size = f1_size;
+ p_e_max = &f1;
+ }
+ else {
+ min_size = f1_size;
+ max_size = f2_size;
+ p_e_max = &f2;
+ }
+
+ Linear_Form<C> r(max_size, false);
+ dimension_type i = max_size;
+ while (i > min_size) {
+ --i;
+ r[i] = p_e_max->vec[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] += f2[i];
+ }
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Variable v, const Linear_Form<C>& f) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator+(v, f):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ r[v_space_dim] += C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ r[0] += n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size > f2_size) {
+ Linear_Form<C> r(f1_size, false);
+ dimension_type i = f1_size;
+ while (i > f2_size) {
+ --i;
+ r[i] = f1[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] -= f2[i];
+ }
+ return r;
+ }
+ else {
+ Linear_Form<C> r(f2_size, false);
+ dimension_type i = f2_size;
+ while (i > f1_size) {
+ --i;
+ r[i].neg_assign(f2[i]);
+ }
+ while (i > 0) {
+ --i;
+ r[i] = f1[i];
+ r[i] -= f2[i];
+ }
+ return r;
+ }
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Variable v, const Linear_Form<C>& f) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator-(v, e):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ r[v_space_dim] += C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form "
+ "operator-(e, v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension.");
+ Linear_Form<C> r(f);
+ if (v_space_dim > f.space_dimension())
+ r.extend(v_space_dim+1);
+ r[v_space_dim] -= C(typename C::boundary_type(1));
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i].neg_assign(r[i]);
+ r[0] += n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f) {
+ Linear_Form<C> r(f);
+ for (dimension_type i = f.size(); i-- > 0; )
+ r[i] *= n;
+ return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size < f2_size)
+ f1.extend(f2_size);
+ for (dimension_type i = f2_size; i-- > 0; )
+ f1[i] += f2[i];
+ return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form<C>& "
+ "operator+=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (v_space_dim > f.space_dimension())
+ f.extend(v_space_dim+1);
+ f[v_space_dim] += C(typename C::boundary_type(1));
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+ dimension_type f1_size = f1.size();
+ dimension_type f2_size = f2.size();
+ if (f1_size < f2_size)
+ f1.extend(f2_size);
+ for (dimension_type i = f2_size; i-- > 0; )
+ f1[i] -= f2[i];
+ return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Form<C>::max_space_dimension())
+ throw std::length_error("Linear_Form<C>& "
+ "operator-=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ if (v_space_dim > f.space_dimension())
+ f.extend(v_space_dim+1);
+ f[v_space_dim] -= C(typename C::boundary_type(1));
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n) {
+ dimension_type f_size = f.size();
+ for (dimension_type i = f_size; i-- > 0; )
+ f[i] *= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n) {
+ dimension_type f_size = f.size();
+ for (dimension_type i = f_size; i-- > 0; )
+ f[i] /= n;
+ return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+ const dimension_type x_size = x.size();
+ const dimension_type y_size = y.size();
+ if (x_size >= y_size) {
+ for (dimension_type i = y_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ for (dimension_type i = x_size; --i >= y_size; )
+ if (x[i] != x.zero)
+ return false;
+
+ }
+ else {
+ for (dimension_type i = x_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ for (dimension_type i = y_size; --i >= x_size; )
+ if (y[i] != x.zero)
+ return false;
+
+ }
+
+ return true;
+}
+
+template <typename C>
+void
+Linear_Form<C>::negate() {
+ for (dimension_type i = vec.size(); i-- > 0; )
+ vec[i].neg_assign(vec[i]);
+ return;
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::external_memory_in_bytes() const {
+ memory_size_type n = 0;
+ for (dimension_type i = size(); i-- > 0; )
+ n += vec[i].external_memory_in_bytes();
+ n += vec.capacity()*sizeof(C);
+ return n;
+}
+
+template <typename C>
+bool
+Linear_Form<C>::OK() const {
+ for (dimension_type i = size(); i-- > 0; )
+ if (!vec[i].OK())
+ return false;
+ return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+void
+Linear_Form<C>::relative_error(
+ const Floating_Point_Format analyzed_format,
+ Linear_Form& result) const {
+ typedef typename C::boundary_type analyzer_format;
+
+ // Get the necessary information on the analyzed's format.
+ unsigned int f_base;
+ unsigned int f_mantissa_bits;
+ switch (analyzed_format) {
+ case IEEE754_HALF:
+ f_base = float_ieee754_half::BASE;
+ f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+ break;
+ case IEEE754_SINGLE:
+ f_base = float_ieee754_single::BASE;
+ f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+ break;
+ case IEEE754_DOUBLE:
+ f_base = float_ieee754_double::BASE;
+ f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+ break;
+ case IBM_SINGLE:
+ f_base = float_ibm_single::BASE;
+ f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+ break;
+ case IEEE754_QUAD:
+ f_base = float_ieee754_quad::BASE;
+ f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+ break;
+ case INTEL_DOUBLE_EXTENDED:
+ f_base = float_intel_double_extended::BASE;
+ f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ C error_propagator;
+ // We assume that f_base is a power of 2.
+ unsigned int u_power = msb_position(f_base) * f_mantissa_bits;
+ int neg_power = -static_cast<int>(u_power);
+ analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, neg_power));
+
+ error_propagator.build(i_constraint(GREATER_OR_EQUAL, -lb),
+ i_constraint(LESS_OR_EQUAL, lb));
+
+ // Handle the inhomogeneous term.
+ const C* current_term = &inhomogeneous_term();
+ assert(current_term->is_bounded());
+
+ C current_multiplier(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ Linear_Form current_result_term(current_multiplier);
+ current_result_term *= error_propagator;
+ result = Linear_Form(current_result_term);
+
+ // Handle the other terms.
+ dimension_type dimension = space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ current_term = &coefficient(Variable(i));
+ assert(current_term->is_bounded());
+ current_multiplier = C(std::max(std::abs(current_term->lower()),
+ std::abs(current_term->upper())));
+ current_result_term = Linear_Form(Variable(i));
+ current_result_term *= current_multiplier;
+ current_result_term *= error_propagator;
+ result += current_result_term;
+ }
+
+ return;
+}
+
+template <typename C>
+template <typename Target>
+bool
+Linear_Form<C>::intervalize(const FP_Oracle<Target,C>& oracle,
+ C& result) const {
+ result = C(inhomogeneous_term());
+ dimension_type dimension = space_dimension();
+ for (dimension_type i = 0; i < dimension; ++i) {
+ C current_addend = coefficient(Variable(i));
+ C curr_int;
+ if (!oracle.get_interval(i, curr_int))
+ return false;
+ current_addend *= curr_int;
+ result += current_addend;
+ }
+
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Linear_Form<C>& f) {
+ const dimension_type num_variables = f.space_dimension();
+ bool first = true;
+ for (dimension_type v = 0; v < num_variables; ++v) {
+ const C& fv = f[v+1];
+ if (fv != typename C::boundary_type(0)) {
+ if (first) {
+ if (fv == typename C::boundary_type(-1))
+ s << "-";
+ else if (fv != typename C::boundary_type(1))
+ s << fv << "*";
+ first = false;
+ }
+ else {
+ if (fv == typename C::boundary_type(-1))
+ s << " - ";
+ else {
+ s << " + ";
+ if (fv != typename C::boundary_type(1))
+ s << fv << "*";
+ }
+ }
+ s << Variable(v);
+ }
+ }
+ // Inhomogeneous term.
+ const C& it = f[0];
+ if (it != 0) {
+ if (!first)
+ s << " + ";
+ else
+ first = false;
+ s << it;
+ }
+
+ if (first)
+ // The null linear form.
+ s << Linear_Form<C>::zero;
+ return s;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(C, Linear_Form<C>)
+
+template <typename C>
+C Linear_Form<C>::zero(typename C::boundary_type(0));
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/linearize.hh line 1. */
+/* Linearization function implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 1. */
+/* Concrete_Expression class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+//! The type of a concrete expression.
+class Concrete_Expression_Type {
+public:
+ /*! \brief
+ Returns the bounded integer type corresponding to \p width,
+ \p representation and \p overflow.
+ */
+ static Concrete_Expression_Type
+ bounded_integer(Bounded_Integer_Type_Width width,
+ Bounded_Integer_Type_Representation representation,
+ Bounded_Integer_Type_Overflow overflow);
+
+ /*! \brief
+ Returns the floating point type corresponding to \p format.
+ */
+ static Concrete_Expression_Type
+ floating_point(Floating_Point_Format format);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a bounded
+ integer type.
+ */
+ bool is_bounded_integer() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a floating
+ point type.
+ */
+ bool is_floating_point() const;
+
+ /*! \brief
+ Returns the width in bits of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Width bounded_integer_type_width() const;
+
+ /*! \brief
+ Returns the representation of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Representation
+ bounded_integer_type_representation() const;
+
+ /*! \brief
+ Returns the overflow behavior of the bounded integer type encoded by
+ \p *this.
+
+ The behavior is undefined if \p *this does not encode a bounded
+ integer type.
+ */
+ Bounded_Integer_Type_Overflow
+ bounded_integer_type_overflow() const;
+
+ /*! \brief
+ Returns the format of the floating point type encoded by \p *this.
+
+ The behavior is undefined if \p *this does not encode a floating
+ point type.
+ */
+ Floating_Point_Format floating_point_format() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! A 32-bit word encoding the type.
+ struct Implementation {
+ bool bounded_integer:1;
+ unsigned int bounded_integer_type_width:23;
+ unsigned int bounded_integer_type_representation:2;
+ unsigned int bounded_integer_type_overflow:2;
+ unsigned int floating_point_format:4;
+ };
+
+ //! Constructor from \p implementation.
+ Concrete_Expression_Type(Implementation implementation);
+
+ //! The encoding of \p *this.
+ Implementation impl;
+};
+
+//! Base class for all concrete expressions.
+template <typename Target>
+class Concrete_Expression_Common {
+public:
+ //! Returns the type of \* this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the kind of \* this.
+ Concrete_Expression_Kind kind() const;
+
+ //! Tests if \p *this has the same kind as <CODE>Derived\<Target\></CODE>.
+ template <template <typename T> class Derived>
+ bool is() const;
+
+ /*! \brief
+ Returns a pointer to \p *this converted to type
+ <CODE>Derived\<Target\>*</CODE>.
+ */
+ template <template <typename T> class Derived>
+ Derived<Target>* as();
+
+ /*! \brief
+ Returns a pointer to \p *this converted to type
+ <CODE>const Derived\<Target\>*</CODE>.
+ */
+ template <template <typename T> class Derived>
+ const Derived<Target>* as() const;
+
+};
+
+//! Base class for binary operator applied to two concrete expressions.
+template <typename Target>
+class Binary_Operator_Common {
+public:
+ //! Returns a constant identifying the operator of \p *this.
+ Concrete_Expression_BOP binary_operator() const;
+
+ //! Returns the left-hand side of \p *this.
+ const Concrete_Expression<Target>* left_hand_side() const;
+
+ //! Returns the right-hand side of \p *this.
+ const Concrete_Expression<Target>* right_hand_side() const;
+};
+
+//! Base class for unary operator applied to one concrete expression.
+template <typename Target>
+class Unary_Operator_Common {
+public:
+ //! Returns a constant identifying the operator of \p *this.
+ Concrete_Expression_UOP unary_operator() const;
+
+ //! Returns the argument \p *this.
+ const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for cast operator concrete expressions.
+template <typename Target>
+class Cast_Operator_Common {
+ //! Returns the casted expression.
+ const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for integer constant concrete expressions.
+template <typename Target>
+class Integer_Constant_Common {
+};
+
+//! Base class for floating-point constant concrete expression.
+template <typename Target>
+class Floating_Point_Constant_Common {
+};
+
+//! Base class for references to some approximable.
+template <typename Target>
+class Approximable_Reference_Common {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_inlines.hh line 1. */
+/* Concrete_Expression class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression_Type
+::Concrete_Expression_Type(Implementation implementation)
+ : impl(implementation) {
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::bounded_integer(const Bounded_Integer_Type_Width width,
+ const Bounded_Integer_Type_Representation representation,
+ const Bounded_Integer_Type_Overflow overflow) {
+ Implementation impl;
+ impl.bounded_integer = true;
+ impl.bounded_integer_type_width = width;
+ impl.bounded_integer_type_representation = representation;
+ impl.bounded_integer_type_overflow = overflow;
+ // Arbitrary choice to ensure determinism.
+ impl.floating_point_format = IEEE754_HALF;
+ return Concrete_Expression_Type(impl);
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::floating_point(const Floating_Point_Format format) {
+ Implementation impl;
+ impl.bounded_integer = false;
+ impl.floating_point_format = format;
+ // Arbitrary choices to ensure determinism.
+ impl.bounded_integer_type_width = BITS_128;
+ impl.bounded_integer_type_representation = SIGNED_2_COMPLEMENT;
+ impl.bounded_integer_type_overflow = OVERFLOW_IMPOSSIBLE;
+ return Concrete_Expression_Type(impl);
+}
+
+inline bool
+Concrete_Expression_Type::is_bounded_integer() const {
+ return impl.bounded_integer;
+}
+
+inline bool
+Concrete_Expression_Type::is_floating_point() const {
+ return !impl.bounded_integer;
+}
+
+inline Bounded_Integer_Type_Width
+Concrete_Expression_Type::bounded_integer_type_width() const {
+ const unsigned int u = impl.bounded_integer_type_width;
+ return static_cast<Bounded_Integer_Type_Width>(u);
+}
+
+inline Bounded_Integer_Type_Representation
+Concrete_Expression_Type::bounded_integer_type_representation() const {
+ const unsigned int u = impl.bounded_integer_type_representation;
+ return static_cast<Bounded_Integer_Type_Representation>(u);
+}
+
+inline Bounded_Integer_Type_Overflow
+Concrete_Expression_Type::bounded_integer_type_overflow() const {
+ const unsigned int u = impl.bounded_integer_type_overflow;
+ return static_cast<Bounded_Integer_Type_Overflow>(u);
+}
+
+inline Floating_Point_Format
+Concrete_Expression_Type::floating_point_format() const {
+ const unsigned int u = impl.floating_point_format;
+ return static_cast<Floating_Point_Format>(u);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline bool
+Concrete_Expression_Common<Target>::is() const {
+ return static_cast<const Concrete_Expression<Target>*>(this)->kind() ==
+ Derived<Target>::KIND;
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline Derived<Target>*
+Concrete_Expression_Common<Target>::as() {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<Derived<Target>*>(this);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline const Derived<Target>*
+Concrete_Expression_Common<Target>::as() const {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<const Derived<Target>*>(this);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 200. */
+
+/* Automatically generated from PPL source file ../src/linearize.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ sum of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>ADD</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of sum floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+ error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+add_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::ADD);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+
+ result += linearized_second_operand;
+ linearized_second_operand.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ difference of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>SUB</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of difference floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+ operators on linear form such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \adifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ on \f$\cV\f$ as follows:
+ \f[
+ \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+ error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+sub_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::SUB);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+
+ result -= linearized_second_operand;
+ linearized_second_operand.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ product of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>MUL</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of multiplication floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+ operators on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ i
+ \amlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \amifp i'\right)
+ + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left([a, b]
+ \amlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+ \aslf
+ \left([a, b]
+ \amlf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1].
+ \f].
+
+ Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+ \f]
+
+ Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}
+ \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+ of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+ and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+ <CODE>compute_absolute_error</CODE>.
+
+ Even though we intervalize the first operand in the above example, the
+ actual implementation utilizes an heuristics for choosing which of the two
+ operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+mul_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::MUL);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ /*
+ FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+ decide which of the two linear forms must be intervalized, as described
+ in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+ thesis "Weakly Relational Numerical Abstract Domains".
+ In this Section are also described other multiplication strategies, such
+ as All-Cases, Relative-Size Local, Simplification-Driven Global and
+ Homogeneity Global.
+ */
+
+ // Here we choose which of the two linear forms must be intervalized.
+
+ // true if we intervalize the first form, false if we intervalize the second.
+ bool intervalize_first;
+ FP_Linear_Form linearized_first_operand;
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store,
+ linearized_first_operand))
+ return false;
+ FP_Interval_Type intervalized_first_operand;
+ if (!linearized_first_operand.intervalize(oracle, intervalized_first_operand))
+ return false;
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ if (!linearized_second_operand.intervalize(oracle,
+ intervalized_second_operand))
+ return false;
+
+ // FIXME: we are not sure that what we do here is policy-proof.
+ if (intervalized_first_operand.is_bounded()) {
+ if (intervalized_second_operand.is_bounded()) {
+ analyzer_format first_interval_size
+ = intervalized_first_operand.upper()
+ - intervalized_first_operand.lower();
+ analyzer_format second_interval_size
+ = intervalized_second_operand.upper()
+ - intervalized_second_operand.lower();
+ if (first_interval_size <= second_interval_size)
+ intervalize_first = true;
+ else
+ intervalize_first = false;
+ }
+ else
+ intervalize_first = true;
+ }
+ else {
+ if (intervalized_second_operand.is_bounded())
+ intervalize_first = false;
+ else
+ return false;
+ }
+
+ // Here we do the actual computation.
+ // For optimizing, we store the relative error directly into result.
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ if (intervalize_first) {
+ linearized_second_operand.relative_error(analyzed_format, result);
+ linearized_second_operand *= intervalized_first_operand;
+ result *= intervalized_first_operand;
+ result += linearized_second_operand;
+ }
+ else {
+ linearized_first_operand.relative_error(analyzed_format, result);
+ linearized_first_operand *= intervalized_second_operand;
+ result *= intervalized_second_operand;
+ result += linearized_first_operand;
+ }
+
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a
+ division of floating point expressions.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param bop_expr
+ The binary operator concrete expression to linearize.
+ Its binary operator type must be <CODE>DIV</CODE>.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+
+ \par Linearization of division floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+ operator on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adivlf
+ i'
+ =
+ \left(i \adivifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+ \f]
+ Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$,
+ we construct the interval linear form
+ \f$
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ \f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adivlf
+ [a, b]\right)
+ \aslf
+ \left(\varepsilon_{\mathbf{f}}\left(
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \adivlf
+ [a, b]\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1],
+ \f]
+ given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1} \oslash \iota\left(
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+ associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+ class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+ of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+ and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+ <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+div_linearize(const Binary_Operator<Target>& bop_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::DIV);
+
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ FP_Linear_Form linearized_second_operand;
+ if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ if (!linearized_second_operand.intervalize(oracle,
+ intervalized_second_operand))
+ return false;
+
+ // Check if we may divide by zero.
+ if ((intervalized_second_operand.lower_is_boundary_infinity() ||
+ intervalized_second_operand.lower() <= 0) &&
+ (intervalized_second_operand.upper_is_boundary_infinity() ||
+ intervalized_second_operand.upper() >= 0))
+ return false;
+
+ if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+ return false;
+
+ Floating_Point_Format analyzed_format =
+ bop_expr.type().floating_point_format();
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result /= intervalized_second_operand;
+ rel_error /= intervalized_second_operand;
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+ Helper function used by <CODE>linearize</CODE> to linearize a cast
+ floating point expression.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param cast_expr
+ The cast operator concrete expression to linearize.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ The modified linear form.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+cast_linearize(const Cast_Operator<Target>& cast_expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ Floating_Point_Format analyzed_format =
+ cast_expr.type().floating_point_format();
+ const Concrete_Expression<Target>* cast_arg = cast_expr.argument();
+ if (cast_arg->type().is_floating_point()) {
+ if (!linearize(*cast_arg, oracle, lf_store, result))
+ return false;
+ if (!is_less_precise_than(analyzed_format,
+ cast_arg->type().floating_point_format()) ||
+ result == FP_Linear_Form(FP_Interval_Type(0)) ||
+ result == FP_Linear_Form(FP_Interval_Type(1)))
+ /*
+ FIXME: find a general way to check if the casted constant
+ is exactly representable in the less precise format.
+ */
+ /*
+ We are casting to a more precise format or casting
+ a definitely safe value: do not add errors.
+ */
+ return true;
+ }
+ else {
+ FP_Interval_Type expr_value;
+ if (!oracle.get_integer_expr_value(*cast_arg, expr_value))
+ return false;
+ result = FP_Linear_Form(expr_value);
+ if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format) ||
+ result == FP_Linear_Form(FP_Interval_Type(0)) ||
+ result == FP_Linear_Form(FP_Interval_Type(1)))
+ /*
+ FIXME: find a general way to check if the casted constant
+ is exactly representable in the less precise format.
+ */
+ /*
+ We are casting to a more precise format or casting
+ a definitely safe value: do not add errors.
+ */
+ return true;
+ }
+
+ FP_Linear_Form rel_error;
+ result.relative_error(analyzed_format, rel_error);
+ result += rel_error;
+ FP_Interval_Type absolute_error =
+ compute_absolute_error<FP_Interval_Type>(analyzed_format);
+ result += absolute_error;
+ return !result.overflows();
+}
+
+//! Linearizes a floating point expression.
+/*! \relates Parma_Polyhedra_Library::Concrete_Expression
+ Makes \p result become a linear form that correctly approximates the
+ value of \p expr in the given composite abstract store.
+
+ \tparam Target
+ A type template parameter specifying the instantiation of
+ Concrete_Expression to be used.
+
+ \tparam FP_Interval_Type
+ A type template parameter for the intervals used in the abstract domain.
+ The interval bounds should have a floating point type.
+
+ \return
+ <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ \param expr
+ The concrete expression to linearize.
+
+ \param oracle
+ The FP_Oracle to be queried.
+
+ \param lf_store
+ The linear form abstract store.
+
+ \param result
+ Becomes the linearized expression.
+
+ Formally, if \p expr represents the expression \f$e\f$ and
+ \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+ then \p result will become \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ if the linearization succeeds.
+*/
+template <typename Target, typename FP_Interval_Type>
+bool
+linearize(const Concrete_Expression<Target>& expr,
+ const FP_Oracle<Target,FP_Interval_Type>& oracle,
+ const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+ Linear_Form<FP_Interval_Type>& result) {
+ typedef typename FP_Interval_Type::boundary_type analyzer_format;
+ typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+ typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+ typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+ PPL_ASSERT(expr.type().is_floating_point());
+ // Check that analyzer_format is a floating point type.
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<analyzer_format>::is_exact,
+ "linearize<Target, FP_Interval_Type>:"
+ " FP_Interval_Type is not the type of an interval with floating point boundaries.");
+
+ switch(expr.kind()) {
+ case Integer_Constant<Target>::KIND:
+ PPL_UNREACHABLE;
+ break;
+ case Floating_Point_Constant<Target>::KIND:
+ {
+ const Floating_Point_Constant<Target>* fpc_expr =
+ expr.template as<Floating_Point_Constant>();
+ FP_Interval_Type constant_value;
+ if (!oracle.get_fp_constant_value(*fpc_expr, constant_value))
+ return false;
+ result = FP_Linear_Form(constant_value);
+ return true;
+ }
+ case Unary_Operator<Target>::KIND:
+ {
+ const Unary_Operator<Target>* uop_expr =
+ expr.template as<Unary_Operator>();
+ switch (uop_expr->unary_operator()) {
+ case Unary_Operator<Target>::UPLUS:
+ return linearize(*(uop_expr->argument()), oracle, lf_store, result);
+ case Unary_Operator<Target>::UMINUS:
+ if (!linearize(*(uop_expr->argument()), oracle, lf_store, result))
+ return false;
+
+ result.negate();
+ return true;
+ case Unary_Operator<Target>::BNOT:
+ throw std::runtime_error("PPL internal error: unimplemented");
+ break;
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+ break;
+ }
+ case Binary_Operator<Target>::KIND:
+ {
+ const Binary_Operator<Target>* bop_expr =
+ expr.template as<Binary_Operator>();
+ switch (bop_expr->binary_operator()) {
+ case Binary_Operator<Target>::ADD:
+ return add_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::SUB:
+ return sub_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::MUL:
+ return mul_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::DIV:
+ return div_linearize(*bop_expr, oracle, lf_store, result);
+ case Binary_Operator<Target>::REM:
+ case Binary_Operator<Target>::BAND:
+ case Binary_Operator<Target>::BOR:
+ case Binary_Operator<Target>::BXOR:
+ case Binary_Operator<Target>::LSHIFT:
+ case Binary_Operator<Target>::RSHIFT:
+ // FIXME: can we do better?
+ return false;
+ default:
+ PPL_UNREACHABLE;
+ return false;
+ }
+ break;
+ }
+ case Approximable_Reference<Target>::KIND:
+ {
+ const Approximable_Reference<Target>* ref_expr =
+ expr.template as<Approximable_Reference>();
+ std::set<dimension_type> associated_dimensions;
+ if (!oracle.get_associated_dimensions(*ref_expr, associated_dimensions)
+ || associated_dimensions.empty())
+ /*
+ We were unable to find any associated space dimension:
+ linearization fails.
+ */
+ return false;
+
+ if (associated_dimensions.size() == 1) {
+ /* If a linear form associated to the only referenced
+ space dimension exists in lf_store, return that form.
+ Otherwise, return the simplest linear form. */
+ dimension_type variable_index = *associated_dimensions.begin();
+ PPL_ASSERT(variable_index != not_a_dimension());
+
+ typename FP_Linear_Form_Abstract_Store::const_iterator
+ variable_value = lf_store.find(variable_index);
+ if (variable_value == lf_store.end()) {
+ result = FP_Linear_Form(Variable(variable_index));
+ return true;
+ }
+
+ result = FP_Linear_Form(variable_value->second);
+ /* FIXME: do we really need to contemplate the possibility
+ that an unbounded linear form was saved into lf_store? */
+ return !result.overflows();
+ }
+
+ /*
+ Here associated_dimensions.size() > 1. Try to return the LUB
+ of all intervals associated to each space dimension.
+ */
+ PPL_ASSERT(associated_dimensions.size() > 1);
+ std::set<dimension_type>::const_iterator i = associated_dimensions.begin();
+ std::set<dimension_type>::const_iterator i_end =
+ associated_dimensions.end();
+ FP_Interval_Type lub(EMPTY);
+ for (; i != i_end; ++i) {
+ FP_Interval_Type curr_int;
+ PPL_ASSERT(*i != not_a_dimension());
+ if (!oracle.get_interval(*i, curr_int))
+ return false;
+
+ lub.join_assign(curr_int);
+ }
+
+ result = FP_Linear_Form(lub);
+ return !result.overflows();
+ }
+ case Cast_Operator<Target>::KIND:
+ {
+ const Cast_Operator<Target>* cast_expr =
+ expr.template as<Cast_Operator>();
+ return cast_linearize(*cast_expr, oracle, lf_store, result);
+ }
+ default:
+ PPL_UNREACHABLE;
+ break;
+ }
+
+ PPL_UNREACHABLE;
+ return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 1. */
+/* PIP_Tree_Node class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class PIP_Tree_Node;
+class PIP_Solution_Node;
+class PIP_Decision_Node;
+
+typedef const PIP_Tree_Node* PIP_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 1. */
+/* PIP_Problem class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 35. */
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 40. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const PIP_Problem& pip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Problem */
+void swap(PIP_Problem& x, PIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Parametric Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+ An object of this class encodes a parametric integer (linear)
+ programming problem. The PIP problem is specified by providing:
+ - the dimension of the vector space;
+ - the subset of those dimensions of the vector space that are
+ interpreted as integer parameters (the other space dimensions
+ are interpreted as non-parameter integer variables);
+ - a finite set of linear equality and (strict or non-strict)
+ inequality constraints involving variables and/or parameters;
+ these constraints are used to define:
+ - the <EM>feasible region</EM>, if they involve one or more
+ problem variable (and maybe some parameters);
+ - the <EM>initial context</EM>, if they only involve the
+ parameters;
+ - optionally, the so-called <EM>big parameter</EM>,
+ i.e., a problem parameter to be considered arbitrarily big.
+
+ Note that all problem variables and problem parameters are assumed
+ to take non-negative integer values, so that there is no need
+ to specify non-negativity constraints.
+
+ The class provides support for the (incremental) solution of the
+ PIP problem based on variations of the revised simplex method and
+ on Gomory cut generation techniques.
+
+ The solution for a PIP problem is the lexicographic minimum of the
+ integer points of the feasible region, expressed in terms of the
+ parameters. As the problem to be solved only involves non-negative
+ variables and parameters, the problem will always be either unfeasible
+ or optimizable.
+
+ As the feasibility and the solution value of a PIP problem depend on the
+ values of the parameters, the solution is a binary decision tree,
+ dividing the context parameter set into subsets.
+ The tree nodes are of two kinds:
+ - \e Decision nodes.
+ These are internal tree nodes encoding one or more linear tests
+ on the parameters; if all the tests are satisfied, then the solution
+ is the node's \e true child; otherwise, the solution is the node's
+ \e false child;
+ - \e Solution nodes.
+ These are leaf nodes in the tree, encoding the solution of the problem
+ in the current context subset, where each variable is defined in terms
+ of a linear expression of the parameters.
+ Solution nodes also optionally embed a set of parameter constraints:
+ if all these constraints are satisfied, the solution is described by
+ the node, otherwise the problem has no solution.
+
+ It may happen that a decision node has no \e false child. This means
+ that there is no solution if at least one of the corresponding
+ constraints is not satisfied. Decision nodes having two or more linear
+ tests on the parameters cannot have a \e false child. Decision nodes
+ always have a \e true child.
+
+ Both kinds of tree nodes may also contain the definition of extra
+ parameters which are artificially introduced by the solver to enforce
+ an integral solution. Such artificial parameters are defined by
+ the integer division of a linear expression on the parameters
+ by an integer coefficient.
+
+ By exploiting the incremental nature of the solver, it is possible
+ to reuse part of the computational work already done when solving
+ variants of a given PIP_Problem: currently, incremental resolution
+ supports the addition of space dimensions, the addition of parameters
+ and the addition of constraints.
+
+ \par Example problem
+ An example PIP problem can be defined the following:
+ \code
+ 3*j >= -2*i+8
+ j <= 4*i - 4
+ i <= n
+ j <= m
+ \endcode
+ where \c i and \c j are the problem variables
+ and \c n and \c m are the problem parameters.
+ This problem can be optimized; the resulting solution tree may be
+ represented as follows:
+ \verbatim
+ if 7*n >= 10 then
+ if 7*m >= 12 then
+ {i = 2 ; j = 2}
+ else
+ Parameter P = (m) div 2
+ if 2*n + 3*m >= 8 then
+ {i = -m - P + 4 ; j = m}
+ else
+ _|_
+ else
+ _|_
+ \endverbatim
+ The solution tree starts with a decision node depending on the
+ context constraint <code>7*n >= 10</code>.
+ If this constraint is satisfied by the values assigned to the
+ problem parameters, then the (textually first) \c then branch is taken,
+ reaching the \e true child of the root node (which in this case
+ is another decision node); otherwise, the (textually last) \c else
+ branch is taken, for which there is no corresponding \e false child.
+ \par
+ The \f$\perp\f$ notation, also called \e bottom, denotes the
+ lexicographic minimum of an empty set of solutions,
+ here meaning the corresponding subproblem is unfeasible.
+ \par
+ Notice that a tree node may introduce new (non-problem) parameters,
+ as is the case for parameter \c P in the (textually first) \c else
+ branch above. These \e artificial parameters are only meaningful
+ inside the subtree where they are defined and are used to define
+ the parametric values of the problem variables in solution nodes
+ (e.g., the <CODE>{i,j}</CODE> vector in the textually third \c then branch).
+
+ \par Context restriction
+ The above solution is correct in an unrestricted initial context,
+ meaning all possible values are allowed for the parameters. If we
+ restrict the context with the following parameter inequalities:
+ \code
+ m >= n
+ n >= 5
+ \endcode
+ then the resulting optimizing tree will be a simple solution node:
+ \verbatim
+ {i = 2 ; j = 2}
+ \endverbatim
+
+ \par Creating the PIP_Problem object
+ The PIP_Problem object corresponding to the above example can be
+ created as follows:
+ \code
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ \endcode
+ If you want to restrict the initial context, simply add the parameter
+ constraints the same way as for normal constraints.
+ \code
+ cs.insert(m >= n);
+ cs.insert(n >= 5);
+ \endcode
+
+ \par Solving the problem
+ Once the PIP_Problem object has been created, you can start the
+ resolution of the problem by calling the solve() method:
+ \code
+ PIP_Problem_Status status = pip.solve();
+ \endcode
+ where the returned \c status indicates if the problem has been optimized
+ or if it is unfeasible for any possible configuration of the parameter
+ values. The resolution process is also started if an attempt is made
+ to get its solution, as follows:
+ \code
+ const PIP_Tree_Node* node = pip.solution();
+ \endcode
+ In this case, an unfeasible problem will result in an empty solution
+ tree, i.e., assigning a null pointer to \c node.
+
+ \par Printing the solution tree
+ A previously computed solution tree may be printed as follows:
+ \code
+ pip.print_solution(std::cout);
+ \endcode
+ This will produce the following output (note: variables and parameters
+ are printed according to the default output function; see
+ <code>Variable::set_output_function</code>):
+ \verbatim
+ if 7*C >= 10 then
+ if 7*D >= 12 then
+ {2 ; 2}
+ else
+ Parameter E = (D) div 2
+ if 2*C + 3*D >= 8 then
+ {-D - E + 4 ; D}
+ else
+ _|_
+ else
+ _|_
+ \endverbatim
+
+ \par Spanning the solution tree
+ A parameter assignment for a PIP problem binds each of the problem
+ parameters to a non-negative integer value. After fixing a parameter
+ assignment, the ``spanning'' of the PIP problem solution tree refers
+ to the process whereby the solution tree is navigated, starting from
+ the root node: the value of artificial parameters is computed according
+ to the parameter assignment and the node's constraints are evaluated,
+ thereby descending in either the true or the false subtree of decision
+ nodes and eventually reaching a solution node or a bottom node.
+ If a solution node is found, each of the problem variables is provided
+ with a parametric expression, which can be evaluated to a fixed value
+ using the given parameter assignment and the computed values for
+ artificial parameters.
+ \par
+ The coding of the spanning process can be done as follows.
+ First, the root of the PIP solution tree is retrieved:
+ \code
+ const PIP_Tree_Node* node = pip.solution();
+ \endcode
+ If \c node represents an unfeasible solution (i.e., \f$\perp\f$),
+ its value will be \c 0. For a non-null tree node, the virtual methods
+ \c PIP_Tree_Node::as_decision() and \c PIP_Tree_Node::as_solution()
+ can be used to check whether the node is a decision or a solution node:
+ \code
+ const PIP_Solution_Node* sol = node->as_solution();
+ if (sol != 0) {
+ // The node is a solution node
+ ...
+ }
+ else {
+ // The node is a decision node
+ const PIP_Decision_Node* dec = node->as_decision();
+ ...
+ }
+ \endcode
+ \par
+ The true (resp., false) child node of a Decision Node may be accessed by
+ using method \c PIP_Decision_Node::child_node(bool), passing \c true
+ (resp., \c false) as the input argument.
+
+ \par Artificial parameters
+ A PIP_Tree_Node::Artificial_Parameter object represents the result
+ of the integer division of a Linear_Expression (on the other
+ parameters, including the previously-defined artificials)
+ by an integer denominator (a Coefficient object).
+ The dimensions of the artificial parameters (if any) in a tree node
+ have consecutive indices starting from <code>dim+1</code>, where the value
+ of \c dim is computed as follows:
+ - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+ - for any other node of the tree, it is recursively obtained by adding
+ the value of \c dim computed for the parent node to the number of
+ artificial parameters defined in the parent node.
+ \par
+ Since the numbering of dimensions for artificial parameters follows
+ the rule above, the addition of new problem variables and/or new problem
+ parameters to an already solved PIP_Problem object (as done when
+ incrementally solving a problem) will result in the systematic
+ renumbering of all the existing artificial parameters.
+
+ \par Node constraints
+ All kind of tree nodes can contain context constraints.
+ Decision nodes always contain at least one of them.
+ The node's local constraint system can be obtained using method
+ PIP_Tree_Node::constraints.
+ These constraints only involve parameters, including both the problem
+ parameters and the artificial parameters that have been defined
+ in nodes occurring on the path from the root node to the current node.
+ The meaning of these constraints is as follows:
+ - On a decision node, if all tests in the constraints are true, then the
+ solution is the \e true child; otherwise it is the \e false child.
+ - On a solution node, if the (possibly empty) system of constraints
+ evaluates to true for a given parameter assignment, then the solution
+ is described by the node; otherwise the solution is \f$\perp\f$
+ (i.e., the problem is unfeasible for that parameter assignment).
+
+ \par Getting the optimal values for the variables
+ After spanning the solution tree using the given parameter assignment,
+ if a solution node has been reached, then it is possible to retrieve
+ the parametric expression for each of the problem variables using
+ method PIP_Solution_Node::parametric_values. The retrieved expression
+ will be defined in terms of all the parameters (problem parameters
+ and artificial parameters defined along the path).
+
+ \par Solving maximization problems
+ You can solve a lexicographic maximization problem by reformulating its
+ constraints using variable substitution. Proceed the following steps:
+ - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+ which we will call \f$M\f$.
+ - Reformulate each of the maximization problem constraints by
+ substituting each \f$x_i\f$ variable with an expression of the form
+ \f$M-x'_i\f$, where the \f$x'_i\f$ variables are positive variables to
+ be minimized.
+ - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+ - In the solution expressions, the values of the \f$x'\f$ variables will
+ be expressed in the form: \f$x'_i = M-x_i\f$. To get back the value of
+ the expression of each \f$x_i\f$ variable, just apply the
+ formula: \f$x_i = M-x'_i\f$.
+ \par
+ Note that if the resulting expression of one of the \f$x'_i\f$ variables
+ is not in the \f$x'_i = M-x_i\f$ form, this means that the
+ sign-unrestricted problem is unbounded.
+ \par
+ You can choose to maximize only a subset of the variables while minimizing
+ the other variables. In that case, just apply the variable substitution
+ method on the variables you want to be maximized. The variable
+ optimization priority will still be in lexicographic order.
+
+ \par
+ \b Example: consider you want to find the lexicographic maximum of the
+ \f$(x,y)\f$ vector, under the constraints:
+ \f[\left\{\begin{array}{l}
+ y \geq 2x - 4\\
+ y \leq -x + p
+ \end{array}\right.\f]
+ \par
+ where \f$p\f$ is a parameter.
+ \par
+ After variable substitution, the constraints become:
+ \f[\left\{\begin{array}{l}
+ M - y \geq 2M - 2x - 4\\
+ M - y \leq -M + x + p
+ \end{array}\right.\f]
+ \par
+ The code for creating the corresponding problem object is the following:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+ Constraint_System cs;
+ cs.insert(M - y >= 2*M - 2*x - 4);
+ cs.insert(M - y <= -M + x + p);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+ \endcode
+ Solving the problem provides the following solution:
+ \verbatim
+ Parameter E = (C + 1) div 3
+ {D - E - 1 ; -C + D + E + 1}
+ \endverbatim
+ Under the notations above, the solution is:
+ \f[ \left\{\begin{array}{l}
+ x' = M - \left\lfloor\frac{p+1}{3}\right\rfloor - 1 \\
+ y' = M - p + \left\lfloor\frac{p+1}{3}\right\rfloor + 1
+ \end{array}\right.
+ \f]
+ \par
+ Performing substitution again provides us with the values of the original
+ variables:
+ \f[ \left\{\begin{array}{l}
+ x = \left\lfloor\frac{p+1}{3}\right\rfloor + 1 \\
+ y = p - \left\lfloor\frac{p+1}{3}\right\rfloor - 1
+ \end{array}\right.
+ \f]
+
+ \par Allowing variables to be arbitrarily signed
+ You can deal with arbitrarily signed variables by reformulating the
+ constraints using variable substitution. Proceed the following steps:
+ - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+ which we will call \f$M\f$.
+ - Reformulate each of the maximization problem constraints by
+ substituting each \f$x_i\f$ variable with an expression of the form
+ \f$x'_i-M\f$, where the \f$x'_i\f$ variables are positive.
+ - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+ - The solution expression can be read in the form:
+ - In the solution expressions, the values of the \f$x'\f$ variables will
+ be expressed in the form: \f$x'_i = x_i+M\f$. To get back the value of
+ the expression of each signed \f$x_i\f$ variable, just apply the
+ formula: \f$x_i = x'_i-M\f$.
+ \par
+ Note that if the resulting expression of one of the \f$x'_i\f$ variables
+ is not in the \f$x'_i = x_i+M\f$ form, this means that the
+ sign-unrestricted problem is unbounded.
+ \par
+ You can choose to define only a subset of the variables to be
+ sign-unrestricted. In that case, just apply the variable substitution
+ method on the variables you want to be sign-unrestricted.
+
+ \par
+ \b Example: consider you want to find the lexicographic minimum of the
+ \f$(x,y)\f$ vector, where the \f$x\f$ and \f$y\f$ variables are
+ sign-unrestricted, under the constraints:
+ \f[\left\{\begin{array}{l}
+ y \geq -2x - 4\\
+ 2y \leq x + 2p
+ \end{array}\right.\f]
+ \par
+ where \f$p\f$ is a parameter.
+ \par
+ After variable substitution, the constraints become:
+ \f[\left\{\begin{array}{l}
+ y' - M \geq -2x' + 2M - 4\\
+ 2y' - 2M \leq x' - M + 2p
+ \end{array}\right.\f]
+ \par
+ The code for creating the corresponding problem object is the following:
+ \code
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+ Constraint_System cs;
+ cs.insert(y - M >= -2*x + 2*M - 4);
+ cs.insert(2*y - 2*M <= x - M + 2*p);
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+ \endcode
+ \par
+ Solving the problem provides the following solution:
+ \verbatim
+ Parameter E = (2*C + 3) div 5
+ {D - E - 1 ; D + 2*E - 2}
+ \endverbatim
+ Under the notations above, the solution is:
+ \f[ \left\{\begin{array}{l}
+ x' = M - \left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+ y' = M + 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+ \end{array}\right.
+ \f]
+ \par
+ Performing substitution again provides us with the values of the original
+ variables:
+ \f[ \left\{\begin{array}{l}
+ x = -\left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+ y = 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+ \end{array}\right.
+ \f]
+
+ \par Allowing parameters to be arbitrarily signed
+ You can consider a parameter \f$p\f$ arbitrarily signed by replacing
+ \f$p\f$ with \f$p^+-p^-\f$, where both \f$p^+\f$ and \f$p^-\f$ are
+ positive parameters. To represent a set of arbitrarily signed parameters,
+ replace each parameter \f$p_i\f$ with \f$p^+_i-p^-\f$, where \f$-p^-\f$ is
+ the minimum negative value of all parameters.
+
+ \par Minimizing a linear cost function
+ Lexicographic solving can be used to find the parametric minimum of a
+ linear cost function.
+ \par
+ Suppose the variables are named \f$x_1, x_2, \dots, x_n\f$, and the
+ parameters \f$p_1, p_2, \dots, p_m\f$. You can minimize a linear cost
+ function \f$f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ by simply adding the
+ constraint \f$x_1 \geq f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ to the
+ constraint system. As lexicographic minimization ensures \f$x_1\f$ is
+ minimized in priority, and because \f$x_1\f$ is forced by a constraint to
+ be superior or equal to the cost function, optimal solutions of the
+ problem necessarily ensure that the solution value of \f$x_1\f$ is the
+ optimal value of the cost function.
+*/
+class Parma_Polyhedra_Library::PIP_Problem {
+public:
+ //! Builds a trivial PIP problem.
+ /*!
+ A trivial PIP problem requires to compute the lexicographic minimum
+ on a vector space under no constraints and with no parameters:
+ due to the implicit non-negativity constraints, the origin of the
+ vector space is an optimal solution.
+
+ \param dim
+ The dimension of the vector space enclosing \p *this
+ (optional argument with default value \f$0\f$).
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+ */
+ explicit PIP_Problem(dimension_type dim = 0);
+
+ /*! \brief
+ Builds a PIP problem having space dimension \p dim
+ from the sequence of constraints in the range
+ \f$[\mathrm{first}, \mathrm{last})\f$;
+ those dimensions whose indices occur in \p p_vars are
+ interpreted as parameters.
+
+ \param dim
+ The dimension of the vector space (variables and parameters) enclosing
+ \p *this.
+
+ \param first
+ An input iterator to the start of the sequence of constraints.
+
+ \param last
+ A past-the-end input iterator to the sequence of constraints.
+
+ \param p_vars
+ The set of variables' indexes that are interpreted as parameters.
+
+ \exception std::length_error
+ Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of a constraint in the sequence
+ (resp., the parameter variables) is strictly greater than \p dim.
+ */
+ template <typename In>
+ PIP_Problem(dimension_type dim, In first, In last,
+ const Variables_Set& p_vars);
+
+ //! Ordinary copy-constructor.
+ PIP_Problem(const PIP_Problem& y);
+
+ //! Destructor.
+ ~PIP_Problem();
+
+ //! Assignment operator.
+ PIP_Problem& operator=(const PIP_Problem& y);
+
+ //! Returns the maximum space dimension a PIP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the PIP problem.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a set containing all the variables' indexes representing
+ the parameters of the PIP problem.
+ */
+ const Variables_Set& parameter_space_dimensions() const;
+
+private:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint> Constraint_Sequence;
+
+public:
+ /*! \brief
+ A type alias for the read-only iterator on the constraints
+ defining the feasible region.
+ */
+ typedef Constraint_Sequence::const_iterator const_iterator;
+
+ /*! \brief
+ Returns a read-only iterator to the first constraint defining
+ the feasible region.
+ */
+ const_iterator constraints_begin() const;
+
+ /*! \brief
+ Returns a past-the-end read-only iterator to the sequence of
+ constraints defining the feasible region.
+ */
+ const_iterator constraints_end() const;
+
+ //! Resets \p *this to be equal to the trivial PIP problem.
+ /*!
+ The space dimension is reset to \f$0\f$.
+ */
+ void clear();
+
+ /*! \brief
+ Adds <CODE>m_vars + m_params</CODE> new space dimensions
+ and embeds the old PIP problem in the new vector space.
+
+ \param m_vars
+ The number of space dimensions to add that are interpreted as
+ PIP problem variables (i.e., non parameters). These are added
+ \e before adding the \p m_params parameters.
+
+ \param m_params
+ The number of space dimensions to add that are interpreted as
+ PIP problem parameters. These are added \e after having added the
+ \p m_vars problem variables.
+
+ \exception std::length_error
+ Thrown if adding <CODE>m_vars + m_params</CODE> new space
+ dimensions would cause the vector space to exceed dimension
+ <CODE>max_space_dimension()</CODE>.
+
+ The new space dimensions will be those having the highest indexes
+ in the new PIP problem; they are initially unconstrained.
+ */
+ void add_space_dimensions_and_embed(dimension_type m_vars,
+ dimension_type m_params);
+
+ /*! \brief
+ Sets the space dimensions whose indexes which are in set \p p_vars
+ to be parameter space dimensions.
+
+ \exception std::invalid_argument
+ Thrown if some index in \p p_vars does not correspond to
+ a space dimension in \p *this.
+ */
+ void add_to_parameter_space_dimensions(const Variables_Set& p_vars);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the PIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of \p c is strictly greater than
+ the space dimension of \p *this.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the PIP problem.
+
+ \exception std::invalid_argument
+ Thrown if the space dimension of constraint system \p cs is strictly
+ greater than the space dimension of \p *this.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ //! Checks satisfiability of \p *this.
+ /*!
+ \return
+ \c true if and only if the PIP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the PIP problem.
+ /*!
+ \return
+ A PIP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible or optimized problem).
+ */
+ PIP_Problem_Status solve() const;
+
+ //! Returns a feasible solution for \p *this, if it exists.
+ /*!
+ A null pointer is returned for an unfeasible PIP problem.
+ */
+ PIP_Tree solution() const;
+
+ //! Returns an optimizing solution for \p *this, if it exists.
+ /*!
+ A null pointer is returned for an unfeasible PIP problem.
+ */
+ PIP_Tree optimizing_solution() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Prints on \p s the solution computed for \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ An indentation parameter (default value 0).
+
+ \exception std::logic_error
+ Thrown if trying to print the solution when the PIP problem
+ still has to be solved.
+ */
+ void print_solution(std::ostream& s, int indent = 0) const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(PIP_Problem& y);
+
+ //! Possible names for PIP_Problem control parameters.
+ enum Control_Parameter_Name {
+ //! Cutting strategy
+ CUTTING_STRATEGY,
+ //! Pivot row strategy
+ PIVOT_ROW_STRATEGY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ CONTROL_PARAMETER_NAME_SIZE
+ };
+
+ //! Possible values for PIP_Problem control parameters.
+ enum Control_Parameter_Value {
+ //! Choose the first non-integer row.
+ CUTTING_STRATEGY_FIRST,
+ //! Choose row which generates the deepest cut.
+ CUTTING_STRATEGY_DEEPEST,
+ //! Always generate all possible cuts.
+ CUTTING_STRATEGY_ALL,
+
+ //! Choose the first row with negative parameter sign.
+ PIVOT_ROW_STRATEGY_FIRST,
+ //! Choose a row that generates a lexicographically maximal pivot column.
+ PIVOT_ROW_STRATEGY_MAX_COLUMN,
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ CONTROL_PARAMETER_VALUE_SIZE
+ };
+
+ //! Returns the value of control parameter \p name.
+ Control_Parameter_Value
+ get_control_parameter(Control_Parameter_Name name) const;
+
+ //! Sets control parameter \p value.
+ void set_control_parameter(Control_Parameter_Value value);
+
+ //! Sets the dimension for the big parameter to \p big_dim.
+ void set_big_parameter_dimension(dimension_type big_dim);
+
+ /*! \brief
+ Returns the space dimension for the big parameter.
+
+ If a big parameter was not set, returns \c not_a_dimension().
+ */
+ dimension_type get_big_parameter_dimension() const;
+
+private:
+ //! Initializes the control parameters with default values.
+ void control_parameters_init();
+
+ //! Copies the control parameters from problem object \p y.
+ void control_parameters_copy(const PIP_Problem& y);
+
+ //! The dimension of the vector space.
+ dimension_type external_space_dim;
+
+ /*! \brief
+ The space dimension of the current (partial) solution of the
+ PIP problem; it may be smaller than \p external_space_dim.
+ */
+ dimension_type internal_space_dim;
+
+ //! An enumerated type describing the internal status of the PIP problem.
+ enum Status {
+ //! The PIP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The PIP problem is optimized; the solution tree has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the PIP problem has been changed by adding
+ new variables, parameters or constraints; a feasible solution for
+ the old feasible region is still available.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the MIP problem.
+ Status status;
+
+ //! The current solution decision tree
+ PIP_Tree_Node* current_solution;
+
+ //! The sequence of constraints describing the feasible region.
+ Constraint_Sequence input_cs;
+
+ //! The first index of `input_cs' containing a pending constraint.
+ dimension_type first_pending_constraint;
+
+ /*! \brief
+ A set containing all the indices of space dimensions that are
+ interpreted as problem parameters.
+ */
+ Variables_Set parameters;
+
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ /*! \brief
+ The initial context
+
+ Contains problem constraints on parameters only
+ */
+ Matrix<Row> initial_context;
+
+ //! The control parameters for the problem object.
+ Control_Parameter_Value
+ control_parameters[CONTROL_PARAMETER_NAME_SIZE];
+
+ /*! \brief
+ The dimension for the big parameter, or \c not_a_dimension()
+ if not set.
+ */
+ dimension_type big_parameter_dimension;
+
+ friend class PIP_Solution_Node;
+};
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_inlines.hh line 1. */
+/* PIP_Problem class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+PIP_Problem::space_dimension() const {
+ return external_space_dim;
+}
+
+inline dimension_type
+PIP_Problem::max_space_dimension() {
+ return Constraint::max_space_dimension();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_begin() const {
+ return input_cs.begin();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_end() const {
+ return input_cs.end();
+}
+
+inline const Variables_Set&
+PIP_Problem::parameter_space_dimensions() const {
+ return parameters;
+}
+
+inline void
+PIP_Problem::m_swap(PIP_Problem& y) {
+ using std::swap;
+ swap(external_space_dim, y.external_space_dim);
+ swap(internal_space_dim, y.internal_space_dim);
+ swap(status, y.status);
+ swap(current_solution, y.current_solution);
+ swap(input_cs, y.input_cs);
+ swap(first_pending_constraint, y.first_pending_constraint);
+ swap(parameters, y.parameters);
+ swap(initial_context, y.initial_context);
+ for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+ swap(control_parameters[i], y.control_parameters[i]);
+ swap(big_parameter_dimension, y.big_parameter_dimension);
+}
+
+inline PIP_Problem&
+PIP_Problem::operator=(const PIP_Problem& y) {
+ PIP_Problem tmp(y);
+ m_swap(tmp);
+ return *this;
+}
+
+inline PIP_Problem::Control_Parameter_Value
+PIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+ PPL_ASSERT(name >= 0 && name < CONTROL_PARAMETER_NAME_SIZE);
+ return control_parameters[name];
+}
+
+inline dimension_type
+PIP_Problem::get_big_parameter_dimension() const {
+ return big_parameter_dimension;
+}
+
+/*! \relates PIP_Problem */
+inline void
+swap(PIP_Problem& x, PIP_Problem& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_templates.hh line 1. */
+/* PIP_Problem class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+PIP_Problem::PIP_Problem(dimension_type dim,
+ In first, In last,
+ const Variables_Set& p_vars)
+ : external_space_dim(dim),
+ internal_space_dim(0),
+ status(PARTIALLY_SATISFIABLE),
+ current_solution(0),
+ input_cs(),
+ first_pending_constraint(0),
+ parameters(p_vars),
+ initial_context(),
+ big_parameter_dimension(not_a_dimension()) {
+ // Check that integer Variables_Set does not exceed the space dimension
+ // of the problem.
+ if (p_vars.space_dimension() > external_space_dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Problem::PIP_Problem(dim, first, last, p_vars):\n"
+ << "dim == " << external_space_dim
+ << " and p_vars.space_dimension() == "
+ << p_vars.space_dimension()
+ << " are dimension incompatible.";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Check for space dimension overflow.
+ if (dim > max_space_dimension())
+ throw std::length_error("PPL::PIP_Problem::"
+ "PIP_Problem(dim, first, last, p_vars):\n"
+ "dim exceeds the maximum allowed "
+ "space dimension.");
+ // Check the constraints.
+ for (In i = first; i != last; ++i) {
+ if (i->space_dimension() > dim) {
+ std::ostringstream s;
+ s << "PPL::PIP_Problem::"
+ << "PIP_Problem(dim, first, last, p_vars):\n"
+ << "range [first, last) contains a constraint having space "
+ << "dimension == " << i->space_dimension()
+ << " that exceeds this->space_dimension == " << dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ input_cs.push_back(*i);
+ }
+ control_parameters_init();
+ PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 833. */
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 36. */
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 40. */
+
+namespace Parma_Polyhedra_Library {
+
+//! A node of the PIP solution tree.
+/*!
+ This is the base class for the nodes of the binary trees representing
+ the solutions of PIP problems. From this one, two classes are derived:
+ - PIP_Decision_Node, for the internal nodes of the tree;
+ - PIP_Solution_Node, for the leaves of the tree.
+*/
+class PIP_Tree_Node {
+protected:
+ //! Constructor: builds a node owned by \p *owner.
+ explicit PIP_Tree_Node(const PIP_Problem* owner);
+
+ //! Copy constructor.
+ PIP_Tree_Node(const PIP_Tree_Node& y);
+
+ //! Returns a pointer to the PIP_Problem owning object.
+ const PIP_Problem* get_owner() const;
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner) = 0;
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this are owned by \p *owner.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const = 0;
+
+public:
+#if PPL_USE_SPARSE_MATRIX
+ typedef Sparse_Row Row;
+#else
+ typedef Dense_Row Row;
+#endif
+
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const = 0;
+
+ //! Destructor.
+ virtual ~PIP_Tree_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const = 0;
+
+ //! Returns \p this if \p *this is a solution node, 0 otherwise.
+ virtual const PIP_Solution_Node* as_solution() const = 0;
+
+ //! Returns \p this if \p *this is a decision node, 0 otherwise.
+ virtual const PIP_Decision_Node* as_decision() const = 0;
+
+ /*! \brief
+ Returns the system of parameter constraints controlling \p *this.
+
+ The indices in the constraints are the same as the original variables and
+ parameters. Coefficients in indices corresponding to variables always are
+ zero.
+ */
+ const Constraint_System& constraints() const;
+
+ class Artificial_Parameter;
+
+ //! A type alias for a sequence of Artificial_Parameter's.
+ typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
+
+ //! Returns a const_iterator to the beginning of local artificial parameters.
+ Artificial_Parameter_Sequence::const_iterator art_parameter_begin() const;
+
+ //! Returns a const_iterator to the end of local artificial parameters.
+ Artificial_Parameter_Sequence::const_iterator art_parameter_end() const;
+
+ //! Returns the number of local artificial parameters.
+ dimension_type art_parameter_count() const;
+
+ //! Prints on \p s the tree rooted in \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ The amount of indentation.
+ */
+ void print(std::ostream& s, int indent = 0) const;
+
+ //! Dumps to \p s an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const = 0;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const = 0;
+
+protected:
+ //! A type alias for a sequence of constraints.
+ typedef std::vector<Constraint> Constraint_Sequence;
+
+ // Only PIP_Problem and PIP_Decision_Node are allowed to use the
+ // constructor and methods.
+ friend class PIP_Problem;
+ friend class PIP_Decision_Node;
+ friend class PIP_Solution_Node;
+
+ //! A pointer to the PIP_Problem object owning this node.
+ const PIP_Problem* owner_;
+
+ //! A pointer to the parent of \p *this, null if \p *this is the root.
+ const PIP_Decision_Node* parent_;
+
+ //! The local system of parameter constraints.
+ Constraint_System constraints_;
+
+ //! The local sequence of expressions for local artificial parameters.
+ Artificial_Parameter_Sequence artificial_parameters;
+
+ //! Returns a pointer to this node's parent.
+ const PIP_Decision_Node* parent() const;
+
+ //! Set this node's parent to \p *p.
+ void set_parent(const PIP_Decision_Node* p);
+
+ /*! \brief
+ Populates the parametric simplex tableau using external data.
+
+ \param pip
+ The PIP_Problem object containing this node.
+
+ \param external_space_dim
+ The number of all problem variables and problem parameters
+ (excluding artificial parameters).
+
+ \param first_pending_constraint
+ The first element in \p input_cs to be added to the tableau,
+ which already contains the previous elements.
+
+ \param input_cs
+ All the constraints of the PIP problem.
+
+ \param parameters
+ The set of indices of the problem parameters.
+ */
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters) = 0;
+
+ /*! \brief
+ Executes a parametric simplex on the tableau, under specified context.
+
+ \return
+ The root of the PIP tree solution, or 0 if unfeasible.
+
+ \param pip
+ The PIP_Problem object containing this node.
+
+ \param check_feasible_context
+ Whether the resolution process should (re-)check feasibility of
+ context (since the initial context may have been modified).
+
+ \param context
+ The context, being a set of constraints on the parameters.
+
+ \param params
+ The local parameter set, including parent's artificial parameters.
+
+ \param space_dim
+ The space dimension of parent, including artificial parameters.
+
+ \param indent_level
+ The indentation level (for debugging output only).
+ */
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level) = 0;
+
+ //! Inserts a new parametric constraint in internal row format.
+ void add_constraint(const Row& row, const Variables_Set& parameters);
+
+ //! Merges parent's artificial parameters into \p *this.
+ void parent_merge();
+
+ //! Prints on \p s the tree rooted in \p *this.
+ /*!
+ \param s
+ The output stream.
+
+ \param indent
+ The amount of indentation.
+
+ \param pip_dim_is_param
+ A vector of Boolean flags telling which PIP problem dimensions are
+ problem parameters. The size of the vector is equal to the PIP
+ problem internal space dimension (i.e., no artificial parameters).
+
+ \param first_art_dim
+ The first space dimension corresponding to an artificial parameter
+ that was created in this node (if any).
+ */
+ virtual void print_tree(std::ostream& s,
+ int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const = 0;
+
+ //! A helper function used when printing PIP trees.
+ static void
+ indent_and_print(std::ostream& s, int indent, const char* str);
+
+ /*! \brief
+ Checks whether a context matrix is satisfiable.
+
+ The satisfiability check is implemented by the revised dual simplex
+ algorithm on the context matrix. The algorithm ensures the feasible
+ solution is integer by applying a cut generation method when
+ intermediate non-integer solutions are found.
+ */
+ static bool compatibility_check(Matrix<Row>& s);
+
+ /*! \brief
+ Helper method: checks for satisfiability of the restricted context
+ obtained by adding \p row to \p context.
+ */
+ static bool compatibility_check(const Matrix<Row>& context, const Row& row);
+
+}; // class PIP_Tree_Node
+
+
+/*! \brief
+ Artificial parameters in PIP solution trees.
+
+ These parameters are built from a linear expression combining other
+ parameters (constant term included) divided by a positive integer
+ denominator. Coefficients at variables indices corresponding to
+ PIP problem variables are always zero.
+*/
+class PIP_Tree_Node::Artificial_Parameter
+ : public Linear_Expression {
+public:
+ //! Default constructor: builds a zero artificial parameter.
+ Artificial_Parameter();
+
+ //! Constructor.
+ /*!
+ Builds artificial parameter \f$\frac{\mathtt{expr}}{\mathtt{d}}\f$.
+
+ \param expr
+ The expression that, after normalization, will form the numerator of
+ the artificial parameter.
+
+ \param d
+ The integer constant that, after normalization, will form the
+ denominator of the artificial parameter.
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+
+ Normalization will ensure that the denominator is positive.
+ */
+ Artificial_Parameter(const Linear_Expression& expr,
+ Coefficient_traits::const_reference d);
+
+ //! Copy constructor.
+ Artificial_Parameter(const Artificial_Parameter& y);
+
+ //! Returns the normalized (i.e., positive) denominator.
+ Coefficient_traits::const_reference denominator() const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Artificial_Parameter& y);
+
+ //! Returns \c true if and only if \p *this and \p y are equal.
+ /*!
+ Note that two artificial parameters having different space dimensions
+ are considered to be different.
+ */
+ bool operator==(const Artificial_Parameter& y) const;
+ //! Returns \c true if and only if \p *this and \p y are different.
+ bool operator!=(const Artificial_Parameter& y) const;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns \c true if and only if the parameter is well-formed.
+ bool OK() const;
+
+private:
+ //! The normalized (i.e., positive) denominator.
+ Coefficient denom;
+}; // class PIP_Tree_Node::Artificial_Parameter
+
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+ PIP_Tree_Node::Artificial_Parameter& y);
+
+
+//! A tree node representing part of the space of solutions.
+class PIP_Solution_Node : public PIP_Tree_Node {
+public:
+
+ //! Constructor: builds a solution node owned by \p *owner.
+ explicit PIP_Solution_Node(const PIP_Problem* owner);
+
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const;
+
+ //! Destructor.
+ virtual ~PIP_Solution_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const;
+
+ //! Returns \p this.
+ virtual const PIP_Solution_Node* as_solution() const;
+
+ //! Returns 0, since \p this is not a decision node.
+ virtual const PIP_Decision_Node* as_decision() const;
+
+ /*! \brief
+ Returns a parametric expression for the values of problem variable \p var.
+
+ The returned linear expression may involve problem parameters
+ as well as artificial parameters.
+
+ \param var
+ The problem variable which is queried about.
+
+ \exception std::invalid_argument
+ Thrown if \p var is dimension-incompatible with the PIP_Problem
+ owning this solution node, or if \p var is a problem parameter.
+ */
+ const Linear_Expression& parametric_values(Variable var) const;
+
+ //! Dumps to \p os an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& os) const;
+
+ /*! \brief
+ Loads from \p is an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& is);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+ //! The type for parametric simplex tableau.
+ struct Tableau {
+ //! The matrix of simplex coefficients.
+ Matrix<Row> s;
+ //! The matrix of parameter coefficients.
+ Matrix<Row> t;
+ //! A common denominator for all matrix elements
+ Coefficient denom;
+
+ //! Default constructor.
+ Tableau();
+ //! Copy constructor.
+ Tableau(const Tableau& y);
+ //! Destructor.
+ ~Tableau();
+
+ //! Tests whether the matrix is integer, i.e., the denominator is 1.
+ bool is_integer() const;
+
+ //! Multiplies all coefficients and denominator with ratio.
+ void scale(Coefficient_traits::const_reference ratio);
+
+ //! Normalizes the modulo of coefficients so that they are mutually prime.
+ /*!
+ Computes the Greatest Common Divisor (GCD) among the elements of
+ the matrices and normalizes them and the denominator by the GCD itself.
+ */
+ void normalize();
+
+ /*! \brief
+ Compares two pivot row and column pairs before pivoting.
+
+ The algorithm searches the first (ie, leftmost) column \f$k\f$ in
+ parameter matrix for which the \f$c=s_{*j}\frac{t_{ik}}{s_{ij}}\f$
+ and \f$c'=s_{*j'}\frac{t_{i'k}}{s_{i'j'}}\f$ columns are different,
+ where \f$s_{*j}\f$ denotes the \f$j\f$<sup>th</sup> column from the
+ \f$s\f$ matrix and \f$s_{*j'}\f$ is the \f$j'\f$<sup>th</sup> column
+ of \f$s\f$.
+
+ \f$c\f$ is the computed column that would be subtracted to column
+ \f$k\f$ in parameter matrix if pivoting is done using the \f$(i,j)\f$
+ row and column pair.
+ \f$c'\f$ is the computed column that would be subtracted to column
+ \f$k\f$ in parameter matrix if pivoting is done using the
+ \f$(i',j')\f$ row and column pair.
+
+ The test is true if the computed \f$-c\f$ column is lexicographically
+ bigger than the \f$-c'\f$ column. Due to the column ordering in the
+ parameter matrix of the tableau, leftmost search will enforce solution
+ increase with respect to the following priority order:
+ - the constant term
+ - the coefficients for the original parameters
+ - the coefficients for the oldest artificial parameters.
+
+ \return
+ \c true if pivot row and column pair \f$(i,j)\f$ is more
+ suitable for pivoting than the \f$(i',j')\f$ pair
+
+ \param mapping
+ The PIP_Solution_Node::mapping vector for the tableau.
+
+ \param basis
+ The PIP_Solution_Node::basis vector for the tableau.
+
+ \param row_0
+ The row number for the first pivot row and column pair to be compared.
+
+ \param col_0
+ The column number for the first pivot row and column pair to be
+ compared.
+
+ \param row_1
+ The row number for the second pivot row and column pair to be compared.
+
+ \param col_1
+ The column number for the second pivot row and column pair to be
+ compared.
+ */
+ bool is_better_pivot(const std::vector<dimension_type>& mapping,
+ const std::vector<bool>& basis,
+ const dimension_type row_0,
+ const dimension_type col_0,
+ const dimension_type row_1,
+ const dimension_type col_1) const;
+
+ //! Returns the value of the denominator.
+ Coefficient_traits::const_reference denominator() const;
+
+ //! Dumps to \p os an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& os) const;
+
+ /*! \brief
+ Loads from \p is an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns \c true if successful, \c false otherwise.
+ */
+ bool ascii_load(std::istream& is);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ /*!
+ \note
+ No need for a \c total_memory_in_bytes() method, since
+ class Tableau is a private inner class of PIP_Solution_Node.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns \c true if and only if \p *this is well formed.
+ bool OK() const;
+ }; // struct Tableau
+
+ //! The parametric simplex tableau.
+ Tableau tableau;
+
+ /*! \brief
+ A boolean vector for identifying the basic variables.
+
+ Variable identifiers are numbered from 0 to <CODE>n+m-1</CODE>, where \p n
+ is the number of columns in the simplex tableau corresponding to variables,
+ and \p m is the number of rows.
+
+ Indices from 0 to <CODE>n-1</CODE> correspond to the original variables.
+
+ Indices from \p n to <CODE>n+m-1</CODE> correspond to the slack variables
+ associated to the internal constraints, which do not strictly correspond
+ to original constraints, since these may have been transformed to fit the
+ standard form of the dual simplex.
+
+ The value for <CODE>basis[i]</CODE> is:
+ - \b true if variable \p i is basic,
+ - \b false if variable \p i is nonbasic.
+ */
+ std::vector<bool> basis;
+
+ /*! \brief
+ A mapping between the tableau rows/columns and the original variables.
+
+ The value of <CODE>mapping[i]</CODE> depends of the value of <CODE>basis[i]</CODE>.
+
+ - If <CODE>basis[i]</CODE> is \b true, <CODE>mapping[i]</CODE> encodes the column
+ index of variable \p i in the \p s matrix of the tableau.
+ - If <CODE>basis[i]</CODE> is \b false, <CODE>mapping[i]</CODE> encodes the row
+ index of variable \p i in the tableau.
+ */
+ std::vector<dimension_type> mapping;
+
+ /*! \brief
+ The variable identifiers associated to the rows of the simplex tableau.
+ */
+ std::vector<dimension_type> var_row;
+
+ /*! \brief
+ The variable identifiers associated to the columns of the simplex tableau.
+ */
+ std::vector<dimension_type> var_column;
+
+ /*! \brief
+ The variable number of the special inequality used for modeling
+ equality constraints.
+
+ The subset of equality constraints in a specific problem can be expressed
+ as: \f$f_i(x,p) = 0 ; 1 \leq i \leq n\f$. As the dual simplex standard form
+ requires constraints to be inequalities, the following constraints can be
+ modeled as follows:
+
+ - \f$f_i(x,p) \geq 0 ; 1 \leq i \leq n\f$
+
+ - \f$\sum\limits_{i=1}^n f_i(x,p) \leq 0\f$
+
+ The \p special_equality_row value stores the variable number of the
+ specific constraint which is used to model the latter sum of
+ constraints. If no such constraint exists, the value is set to \p 0.
+ */
+ dimension_type special_equality_row;
+
+ /*! \brief
+ The column index in the parametric part of the simplex tableau
+ corresponding to the big parameter; \c not_a_dimension() if not set.
+ */
+ dimension_type big_dimension;
+
+ //! The possible values for the sign of a parametric linear expression.
+ enum Row_Sign {
+ //! Not computed yet (default).
+ UNKNOWN,
+ //! All row coefficients are zero.
+ ZERO,
+ //! All nonzero row coefficients are positive.
+ POSITIVE,
+ //! All nonzero row coefficients are negative.
+ NEGATIVE,
+ //! The row contains both positive and negative coefficients.
+ MIXED
+ };
+
+ //! A cache for computed sign values of constraint parametric RHS.
+ std::vector<Row_Sign> sign;
+
+ //! Parametric values for the solution.
+ std::vector<Linear_Expression> solution;
+
+ //! An indicator for solution validity.
+ bool solution_valid;
+
+ //! Returns the sign of row \p x.
+ static Row_Sign row_sign(const Row& x,
+ dimension_type big_dimension);
+
+protected:
+ //! Copy constructor.
+ PIP_Solution_Node(const PIP_Solution_Node& y);
+
+ //! A tag type to select the alternative copy constructor.
+ struct No_Constraints {};
+
+ //! Alternative copy constructor.
+ /*!
+ This constructor differs from the default copy constructor in that
+ it will not copy the constraint system, nor the artificial parameters.
+ */
+ PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
+
+ // PIP_Problem::ascii load() method needs access set_owner().
+ friend bool PIP_Problem::ascii_load(std::istream& s);
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner);
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this is owned by \p *pip.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const;
+
+ //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters);
+
+ /*! \brief
+ Update the solution values.
+
+ \param pip_dim_is_param
+ A vector of Boolean flags telling which PIP problem dimensions are
+ problem parameters. The size of the vector is equal to the PIP
+ problem internal space dimension (i.e., no artificial parameters).
+ */
+ void update_solution(const std::vector<bool>& pip_dim_is_param) const;
+
+ //! Helper method.
+ void update_solution() const;
+
+ //! Implements pure virtual method PIP_Tree_Node::solve.
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level);
+
+ /*! \brief
+ Generate a Gomory cut using non-integer tableau row \p index.
+
+ \param index
+ Row index in simplex tableau from which the cut is generated.
+
+ \param parameters
+ A std::set of the current parameter dimensions (including artificials);
+ to be updated if a new artificial parameter is to be created.
+
+ \param context
+ A set of linear inequalities on the parameters, in matrix form; to be
+ updated if a new artificial parameter is to be created.
+
+ \param space_dimension
+ The current space dimension, including variables and all parameters; to
+ be updated if an extra parameter is to be created.
+
+ \param indent_level
+ The indentation level (for debugging output only).
+ */
+ void generate_cut(dimension_type index, Variables_Set& parameters,
+ Matrix<Row>& context, dimension_type& space_dimension,
+ int indent_level);
+
+ //! Prints on \p s the tree rooted in \p *this.
+ virtual void print_tree(std::ostream& s, int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const;
+
+}; // class PIP_Solution_Node
+
+
+//! A tree node representing a decision in the space of solutions.
+class PIP_Decision_Node : public PIP_Tree_Node {
+public:
+ //! Returns a pointer to a dynamically-allocated copy of \p *this.
+ virtual PIP_Tree_Node* clone() const;
+
+ //! Destructor.
+ virtual ~PIP_Decision_Node();
+
+ //! Returns \c true if and only if \p *this is well formed.
+ virtual bool OK() const;
+
+ //! Returns \p this.
+ virtual const PIP_Decision_Node* as_decision() const;
+
+ //! Returns 0, since \p this is not a solution node.
+ virtual const PIP_Solution_Node* as_solution() const;
+
+ //! Returns a const pointer to the \p b (true or false) branch of \p *this.
+ const PIP_Tree_Node* child_node(bool b) const;
+
+ //! Returns a pointer to the \p b (true or false) branch of \p *this.
+ PIP_Tree_Node* child_node(bool b);
+
+ //! Dumps to \p s an ASCII representation of \p *this.
+ void ascii_dump(std::ostream& s) const;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ virtual memory_size_type total_memory_in_bytes() const;
+ //! Returns the size in bytes of the memory managed by \p *this.
+ virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+ // PIP_Solution_Node is allowed to use the constructor and methods.
+ friend class PIP_Solution_Node;
+
+ // PIP_Problem ascii load method needs access to private constructors.
+ friend bool PIP_Problem::ascii_load(std::istream& s);
+
+ //! Pointer to the "false" child of \p *this.
+ PIP_Tree_Node* false_child;
+
+ //! Pointer to the "true" child of \p *this.
+ PIP_Tree_Node* true_child;
+
+ /*! \brief
+ Builds a decision node having \p fcp and \p tcp as child.
+
+ The decision node will encode the structure
+ "if \c cs then \p tcp else \p fcp",
+ where the system of constraints \c cs is initially empty.
+
+ \param owner
+ Pointer to the owning PIP_Problem object; it may be null if and
+ only if both children are null.
+
+ \param fcp
+ Pointer to "false" child; it may be null.
+
+ \param tcp
+ Pointer to "true" child; it may be null.
+
+ \note
+ If any of \p fcp or \p tcp is not null, then \p owner is required
+ to be not null and equal to the owner of its non-null children;
+ otherwise the behavior is undefined.
+ */
+ explicit PIP_Decision_Node(const PIP_Problem* owner,
+ PIP_Tree_Node* fcp,
+ PIP_Tree_Node* tcp);
+
+ //! Sets the pointer to the PIP_Problem owning object.
+ virtual void set_owner(const PIP_Problem* owner);
+
+ /*! \brief
+ Returns \c true if and only if all the nodes in the subtree
+ rooted in \p *this is owned by \p *pip.
+ */
+ virtual bool check_ownership(const PIP_Problem* owner) const;
+
+protected:
+ //! Copy constructor.
+ PIP_Decision_Node(const PIP_Decision_Node& y);
+
+ //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+ virtual void update_tableau(const PIP_Problem& pip,
+ dimension_type external_space_dim,
+ dimension_type first_pending_constraint,
+ const Constraint_Sequence& input_cs,
+ const Variables_Set& parameters);
+
+ //! Implements pure virtual method PIP_Tree_Node::solve.
+ virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+ bool check_feasible_context,
+ const Matrix<Row>& context,
+ const Variables_Set& params,
+ dimension_type space_dim,
+ int indent_level);
+
+ //! Prints on \p s the tree rooted in \p *this.
+ virtual void print_tree(std::ostream& s, int indent,
+ const std::vector<bool>& pip_dim_is_param,
+ dimension_type first_art_dim) const;
+
+}; // class PIP_Decision_Node
+
+namespace IO_Operators {
+
+//! Output operator: prints the solution tree rooted in \p x.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node */
+std::ostream& operator<<(std::ostream& os, const PIP_Tree_Node& x);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter */
+std::ostream& operator<<(std::ostream& os,
+ const PIP_Tree_Node::Artificial_Parameter& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_inlines.hh line 1. */
+/* PIP_Tree related class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+PIP_Solution_Node::Tableau::Tableau()
+ : s(), t(), denom(1) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::Tableau(const Tableau& y)
+ : s(y.s), t(y.t), denom(y.denom) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::~Tableau() {
+}
+
+inline bool
+PIP_Solution_Node::Tableau::is_integer() const {
+ return denom == 1;
+}
+
+inline Coefficient_traits::const_reference
+PIP_Solution_Node::Tableau::denominator() const {
+ return denom;
+}
+
+inline
+PIP_Tree_Node::~PIP_Tree_Node() {
+}
+
+inline void
+PIP_Tree_Node::set_parent(const PIP_Decision_Node* p) {
+ parent_ = p;
+}
+
+inline const PIP_Decision_Node*
+PIP_Tree_Node::parent() const {
+ return parent_;
+}
+
+inline const PIP_Problem*
+PIP_Tree_Node::get_owner() const {
+ return owner_;
+}
+
+inline const Constraint_System&
+PIP_Tree_Node::constraints() const {
+ return constraints_;
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_begin() const {
+ return artificial_parameters.begin();
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_end() const {
+ return artificial_parameters.end();
+}
+
+inline dimension_type
+PIP_Tree_Node::art_parameter_count() const {
+ return artificial_parameters.size();
+}
+
+inline
+const PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) const {
+ return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) {
+ return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
+ : Linear_Expression(), denom(1) {
+ PPL_ASSERT(OK());
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Artificial_Parameter& y)
+ : Linear_Expression(y), denom(y.denom) {
+ PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+PIP_Tree_Node::Artificial_Parameter::denominator() const {
+ return denom;
+}
+
+inline void
+PIP_Tree_Node::Artificial_Parameter::m_swap(Artificial_Parameter& y) {
+ Linear_Expression::m_swap(y);
+ using std::swap;
+ swap(denom, y.denom);
+}
+
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+inline void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+ PIP_Tree_Node::Artificial_Parameter& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 835. */
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 1. */
+/* BHRZ03_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 31. */
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+
+ \note
+ Each convergence certificate has to be used together with a
+ compatible widening operator. In particular, BHRZ03_Certificate
+ can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+ //! Default constructor.
+ BHRZ03_Certificate();
+
+ //! Constructor: computes the certificate for \p ph.
+ BHRZ03_Certificate(const Polyhedron& ph);
+
+ //! Copy constructor.
+ BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+ //! Destructor.
+ ~BHRZ03_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+
+ Compares \p *this with \p y, using a total ordering which is a
+ refinement of the limited growth ordering relation for the
+ BHRZ03 widening.
+ */
+ int compare(const BHRZ03_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the certificate for
+ polyhedron \p ph is strictly smaller than \p *this.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_stabilizing(const Polyhedron& ph) const;
+
+ //! A total ordering on BHRZ03 certificates.
+ /*! \ingroup PPL_CXX_interface
+ This binary predicate defines a total ordering on BHRZ03 certificates
+ which is used when storing information about sets of polyhedra.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const BHRZ03_Certificate& x,
+ const BHRZ03_Certificate& y) const;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+private:
+ //! Affine dimension of the polyhedron.
+ dimension_type affine_dim;
+ //! Dimension of the lineality space of the polyhedron.
+ dimension_type lin_space_dim;
+ //! Cardinality of a non-redundant constraint system for the polyhedron.
+ dimension_type num_constraints;
+ /*! \brief
+ Number of non-redundant points in a generator system
+ for the polyhedron.
+ */
+ dimension_type num_points;
+ /*! \brief
+ A vector containing, for each index `0 <= i < space_dim',
+ the number of non-redundant rays in a generator system of the
+ polyhedron having exactly `i' null coordinates.
+ */
+ std::vector<dimension_type> num_rays_null_coord;
+};
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_inlines.hh line 1. */
+/* BHRZ03_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+ : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+ num_rays_null_coord() {
+ // This is the certificate for a zero-dim universe polyhedron.
+ PPL_ASSERT(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+ : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+ num_constraints(y.num_constraints), num_points(y.num_points),
+ num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+ return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+ const BHRZ03_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 117. */
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 1. */
+/* H79_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 31. */
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+ \note
+ The convergence of the H79 widening can also be certified by
+ BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+ //! Default constructor.
+ H79_Certificate();
+
+ //! Constructor: computes the certificate for \p ph.
+ template <typename PH>
+ H79_Certificate(const PH& ph);
+
+ //! Constructor: computes the certificate for \p ph.
+ H79_Certificate(const Polyhedron& ph);
+
+ //! Copy constructor.
+ H79_Certificate(const H79_Certificate& y);
+
+ //! Destructor.
+ ~H79_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+
+ Compares \p *this with \p y, using a total ordering which is a
+ refinement of the limited growth ordering relation for the
+ H79 widening.
+ */
+ int compare(const H79_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ template <typename PH>
+ int compare(const PH& ph) const;
+
+ //! Compares \p *this with the certificate for polyhedron \p ph.
+ int compare(const Polyhedron& ph) const;
+
+ //! A total ordering on H79 certificates.
+ /*! \ingroup PPL_CXX_interface
+ This binary predicate defines a total ordering on H79 certificates
+ which is used when storing information about sets of polyhedra.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const H79_Certificate& x,
+ const H79_Certificate& y) const;
+ };
+
+private:
+ //! Affine dimension of the polyhedron.
+ dimension_type affine_dim;
+ //! Cardinality of a non-redundant constraint system for the polyhedron.
+ dimension_type num_constraints;
+};
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_inlines.hh line 1. */
+/* H79_Certificate class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+ : affine_dim(0), num_constraints(0) {
+ // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+ : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+ const H79_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+ : affine_dim(0), num_constraints(0) {
+ H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+ affine_dim = cert.affine_dim;
+ num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+ return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 97. */
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 1. */
+/* Grid_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 32. */
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+ Convergence certificates are used to instantiate the BHZ03 framework
+ so as to define widening operators for the finite powerset domain.
+
+ \note
+ Each convergence certificate has to be used together with a
+ compatible widening operator. In particular, Grid_Certificate can
+ certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+ //! Default constructor.
+ Grid_Certificate();
+
+ //! Constructor: computes the certificate for \p gr.
+ Grid_Certificate(const Grid& gr);
+
+ //! Copy constructor.
+ Grid_Certificate(const Grid_Certificate& y);
+
+ //! Destructor.
+ ~Grid_Certificate();
+
+ //! The comparison function for certificates.
+ /*!
+ \return
+ \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+ is smaller than, equal to, or greater than \p y, respectively.
+ */
+ int compare(const Grid_Certificate& y) const;
+
+ //! Compares \p *this with the certificate for grid \p gr.
+ int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the certificate for grid
+ \p gr is strictly smaller than \p *this.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool is_stabilizing(const Grid& gr) const;
+
+ //! A total ordering on Grid certificates.
+ /*!
+ This binary predicate defines a total ordering on Grid certificates
+ which is used when storing information about sets of grids.
+ */
+ struct Compare {
+ //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+ bool operator()(const Grid_Certificate& x,
+ const Grid_Certificate& y) const;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ bool OK() const;
+
+private:
+ //! Number of a equalities in a minimized congruence system for the
+ //! grid.
+ dimension_type num_equalities;
+ //! Number of a proper congruences in a minimized congruence system
+ //! for the grid.
+ dimension_type num_proper_congruences;
+};
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_inlines.hh line 1. */
+/* Grid_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+ : num_equalities(0), num_proper_congruences(0) {
+ // This is the certificate for a zero-dim universe grid.
+ PPL_ASSERT(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+ : num_equalities(y.num_equalities),
+ num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+ return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+ const Grid_Certificate& y) const {
+ // For an efficient evaluation of the multiset ordering based
+ // on this LGO relation, we want larger elements to come first.
+ return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 103. */
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 1. */
+/* Partial_Function class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partial_Function_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 29. */
+#include <vector>
+#ifndef NDEBUG
+#include <set>
+#endif
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function {
+public:
+ /*! \brief
+ Default constructor: builds a function with empty codomain
+ (i.e., always undefined).
+ */
+ Partial_Function();
+
+ /*! \brief
+ Returns \c true if and only if the represented partial function
+ has an empty codomain (i.e., it is always undefined).
+ */
+ bool has_empty_codomain() const;
+
+ /*! \brief
+ If the codomain is \e not empty, returns the maximum value in it.
+
+ \exception std::runtime_error
+ Thrown if called when \p *this has an empty codomain.
+ */
+ dimension_type max_in_codomain() const;
+
+ /*! \brief
+ If \p *this maps \p i to a value \c k, assigns \c k to \p j and
+ returns \c true; otherwise, \p j is unchanged and \c false is returned.
+ */
+ bool maps(dimension_type i, dimension_type& j) const;
+
+ void print(std::ostream& s) const;
+
+ /*! \brief
+ Modifies \p *this so that \p i is mapped to \p j.
+
+ \exception std::runtime_error
+ Thrown if \p *this is already mapping \p j.
+ */
+ void insert(dimension_type i, dimension_type j);
+
+private:
+ std::vector<dimension_type> vec;
+ dimension_type max;
+#ifndef NDEBUG
+ std::set<dimension_type> codomain;
+#endif
+}; // class Partial_Function
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_inlines.hh line 1. */
+/* Partial_Function class implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+/* Automatically generated from PPL source file ../src/Partial_Function_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+ : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+ PPL_ASSERT(vec.empty() == codomain.empty());
+ return vec.empty();
+}
+
+inline dimension_type
+Partial_Function::max_in_codomain() const {
+ if (has_empty_codomain())
+ throw std::runtime_error("Partial_Function::max_in_codomain() called"
+ " when has_empty_codomain()");
+ PPL_ASSERT(codomain.begin() != codomain.end()
+ && max == *codomain.rbegin());
+ return max;
+}
+
+inline void
+Partial_Function::insert(dimension_type i, dimension_type j) {
+#ifndef NDEBUG
+ // The partial function has to be an injective map.
+ std::pair<std::set<dimension_type>::iterator, bool> s = codomain.insert(j);
+ PPL_ASSERT(s.second);
+#endif // #ifndef NDEBUG
+
+ // Expand `vec' if needed.
+ const dimension_type sz = vec.size();
+ if (i >= sz)
+ vec.insert(vec.end(), i - sz + 1, not_a_dimension());
+
+ // We cannot remap the same index to another one.
+ PPL_ASSERT(i < vec.size() && vec[i] == not_a_dimension());
+ vec[i] = j;
+
+ // Maybe update `max'.
+ if (j > max)
+ max = j;
+ PPL_ASSERT(codomain.begin() != codomain.end()
+ && max == *codomain.rbegin());
+}
+
+inline bool
+Partial_Function::maps(dimension_type i, dimension_type& j) const {
+ if (i >= vec.size())
+ return false;
+ const dimension_type vec_i = vec[i];
+ if (vec_i == not_a_dimension())
+ return false;
+ j = vec_i;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 86. */
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 1. */
+/* Widening_Function class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Widening_Function;
+
+template <typename PSET, typename CSYS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 29. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+ //! The (parametric) type of a widening method.
+ typedef void (PSET::* Widening_Method)(const PSET&, unsigned*);
+
+ //! Explicit unary constructor.
+ explicit
+ Widening_Function(Widening_Method wm);
+
+ //! Function-application operator.
+ /*!
+ Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+ method stored at construction time.
+ */
+ void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+ //! The widening method.
+ Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET, typename CSYS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+ //! The (parametric) type of a limited widening method.
+ typedef void (PSET::* Limited_Widening_Method)(const PSET&,
+ const CSYS&,
+ unsigned*);
+
+ //! Constructor.
+ /*!
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+ */
+ Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CSYS& cs);
+
+ //! Function-application operator.
+ /*!
+ Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+ are the limited widening method and the constraint system stored
+ at construction time.
+ */
+ void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+ //! The limited widening method.
+ Limited_Widening_Method lw_method;
+ //! A constant reference to the constraint system limiting the widening.
+ const CSYS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+ \relates Pointset_Powerset
+
+ \param wm
+ The widening method.
+*/
+template <typename PSET>
+Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+ \relates Pointset_Powerset
+
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+*/
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+ const CSYS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Widening_Function_inlines.hh line 1. */
+/* Widening_Function class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+Widening_Function<PSET>::Widening_Function(Widening_Method wm)
+ : w_method(wm) {
+}
+
+template <typename PSET>
+inline void
+Widening_Function<PSET>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+ (x.*w_method)(y, tp);
+}
+
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CSYS& cs)
+ : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PSET, typename CSYS>
+inline void
+Limited_Widening_Function<PSET, CSYS>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+ (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*)) {
+ return Widening_Function<PSET>(wm);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET, typename CSYS>
+inline Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+ const CSYS& cs) {
+ return Limited_Widening_Function<PSET, CSYS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 126. */
+
+/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 1. */
+/* Definition of functions yielding maximal space dimensions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 1. */
+/* NNC_Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 31. */
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+ An object of the class NNC_Polyhedron represents a
+ <EM>not necessarily closed</EM> (NNC) convex polyhedron
+ in the vector space \f$\Rset^n\f$.
+
+ \note
+ Since NNC polyhedra are a generalization of closed polyhedra,
+ any object of the class C_Polyhedron can be (explicitly) converted
+ into an object of the class NNC_Polyhedron.
+ The reason for defining two different classes is that objects of
+ the class C_Polyhedron are characterized by a more efficient
+ implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+ //! Builds either the universe or the empty NNC polyhedron.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+ \param kind
+ Specifies whether a universe or an empty NNC polyhedron should be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+ Both parameters are optional:
+ by default, a 0-dimension space universe NNC polyhedron is built.
+ */
+ explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds an NNC polyhedron from a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron.
+ */
+ explicit NNC_Polyhedron(const Constraint_System& cs);
+
+ //! Builds an NNC polyhedron recycling a system of constraints.
+ /*!
+ The polyhedron inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit NNC_Polyhedron(const Generator_System& gs);
+
+ //! Builds an NNC polyhedron recycling a system of generators.
+ /*!
+ The polyhedron inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds an NNC polyhedron recycling a system of congruences.
+ /*!
+ The polyhedron inherits the space dimension of the congruence
+ system.
+
+ \param cgs
+ The system of congruences defining the polyhedron. It is not
+ declared <CODE>const</CODE> because its data-structures may be
+ recycled to build the polyhedron.
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one
+ from the other constructors.
+ */
+ NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+ //! Builds an NNC polyhedron from the C polyhedron \p y.
+ /*!
+ \param y
+ The C polyhedron to be used;
+
+ \param complexity
+ This argument is ignored.
+ */
+ explicit NNC_Polyhedron(const C_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an NNC polyhedron out of a box.
+ /*!
+ The polyhedron inherits the space dimension of the box
+ and is the most precise that includes the box.
+
+ \param box
+ The box representing the polyhedron to be built;
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Interval>
+ explicit NNC_Polyhedron(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds an NNC polyhedron out of a grid.
+ /*!
+ The polyhedron inherits the space dimension of the grid
+ and is the most precise that includes the grid.
+
+ \param grid
+ The grid used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ explicit NNC_Polyhedron(const Grid& grid,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a NNC polyhedron out of a BD shape.
+ /*!
+ The polyhedron inherits the space dimension of the BD shape
+ and is the most precise that includes the BD shape.
+
+ \param bd
+ The BD shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a NNC polyhedron out of an octagonal shape.
+ /*!
+ The polyhedron inherits the space dimension of the octagonal shape
+ and is the most precise that includes the octagonal shape.
+
+ \param os
+ The octagonal shape used to build the polyhedron.
+
+ \param complexity
+ This argument is ignored as the algorithm used has
+ polynomial complexity.
+ */
+ template <typename U>
+ explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ NNC_Polyhedron(const NNC_Polyhedron& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator.
+ (\p *this and \p y can be dimension-incompatible.)
+ */
+ NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+ //! Assigns to \p *this the C polyhedron \p y.
+ NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+ //! Destructor.
+ ~NNC_Polyhedron();
+
+ /*! \brief
+ If the poly-hull of \p *this and \p y is exact it is assigned
+ to \p *this and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+ //! Same as poly_hull_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this (the best approximation of) the result of
+ computing the
+ \ref Positive_Time_Elapse_Operator "positive time-elapse"
+ between \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_inlines.hh line 1. */
+/* NNC_Polyhedron class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(num_dimensions,
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs, recycle)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs, recycle)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_obj_space_dimension_overflow(box, NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension")) {
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(bd.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(bd)",
+ "the space dimension of bd "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ check_space_dimension_overflow(os.space_dimension(),
+ NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(os)",
+ "the space dimension of os "
+ "exceeds the maximum allowed "
+ "space dimension"),
+ UNIVERSE) {
+ add_constraints(os.constraints());
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+ : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+ Polyhedron::operator=(y);
+ return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+ NNC_Polyhedron nnc_y(y);
+ m_swap(nnc_y);
+ return *this;
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+ return poly_hull_assign_if_exact(y);
+}
+
+inline void
+NNC_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+ Polyhedron::positive_time_elapse_assign_impl(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 266. */
+
+/* Automatically generated from PPL source file ../src/Rational_Box.hh line 1. */
+/* Rational_Box class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rational_Box.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 34. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+ // Note: we assume that the powerset and the ask-and-tell construction
+ // do not limit the space dimension more than their parameters.
+ static bool computed = false;
+ static dimension_type d = not_a_dimension();
+ if (!computed) {
+ d = Variable::max_space_dimension();
+ d = std::min(d, C_Polyhedron::max_space_dimension());
+ d = std::min(d, NNC_Polyhedron::max_space_dimension());
+ d = std::min(d, Grid::max_space_dimension());
+ // FIXME: what about all other boxes?
+ d = std::min(d, Rational_Box::max_space_dimension());
+ d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+ d = std::min(d, BD_Shape<float>::max_space_dimension());
+ d = std::min(d, BD_Shape<double>::max_space_dimension());
+ d = std::min(d, BD_Shape<long double>::max_space_dimension());
+ d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+ d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+ d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+ computed = true;
+ }
+ return d;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/algorithms.hh line 1. */
+/* A collection of useful convex polyhedra algorithms: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 1. */
+/* Pointset_Powerset class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Pointset_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 1. */
+/* Partially_Reduced_Product class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 49. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+ \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+ Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+void swap(Partially_Reduced_Product<D1, D2, R>& x,
+ Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+ are pairwise equal.
+
+ \relates Partially_Reduced_Product
+ Note that \p x and \p y may be dimension-incompatible: in
+ those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+ are not pairwise equal.
+
+ \relates Partially_Reduced_Product
+ Note that \p x and \p y may be dimension-incompatible: in
+ those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/*! \brief
+ This class provides the reduction method for the Smash_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+ //! Default constructor.
+ Smash_Reduction();
+
+ /*! \brief
+ The smash reduction operator for propagating emptiness between the
+ domain elements \p d1 and \p d2.
+
+ If either of the the domain elements \p d1 or \p d2 is empty
+ then the other is also set empty.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Smash_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Constraints_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain. This class adds the constraints defining each of the component
+ domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+ //! Default constructor.
+ Constraints_Reduction();
+
+ /*! \brief
+ The constraints reduction operator for sharing constraints between the
+ domains.
+
+ The minimized constraint system defining the domain element \p d1
+ is added to \p d2 and the minimized constraint system defining \p d2
+ is added to \p d1.
+ In each case, the donor domain must provide a constraint system
+ in minimal form; this must define a polyhedron in which the
+ donor element is contained.
+ The recipient domain selects a subset of these constraints
+ that it can add to the recipient element.
+ For example: if the domain \p D1 is the Grid domain and \p D2
+ the NNC Polyhedron domain, then only the equality constraints are copied
+ from \p d1 to \p d2 and from \p d2 to \p d1.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Constraints_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Congruences_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain.
+
+ This class uses the minimized congruences defining each of the components.
+ For each of the congruences, it checks if the other component
+ intersects none, one or more than one hyperplane defined by the congruence
+ and adds equalities or emptiness as appropriate; in more detail:
+ Letting the components be d1 and d2, then, for each congruence cg
+ representing d1:
+ - if more than one hyperplane defined by cg intersects
+ d2, then d1 and d2 are unchanged;
+ - if exactly one hyperplane intersects d2, then d1 and d2 are
+ refined with the corresponding equality ;
+ - otherwise, d1 and d2 are set to empty.
+ Unless d1 and d2 are already empty, the process is repeated where the
+ roles of d1 and d2 are reversed.
+ If d1 or d2 is empty, then the emptiness is propagated.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Congruences_Reduction {
+public:
+ //! Default constructor.
+ Congruences_Reduction();
+
+ /*! \brief
+ The congruences reduction operator for detect emptiness or any equalities
+ implied by each of the congruences defining one of the components
+ and the bounds of the other component. It is assumed that the
+ components are already constraints reduced.
+
+ The minimized congruence system defining the domain element \p d1
+ is used to check if \p d2 intersects none, one or more than one
+ of the hyperplanes defined by the congruences: if it intersects none,
+ then product is set empty; if it intersects one, then the equality
+ defining this hyperplane is added to both components; otherwise,
+ the product is unchanged.
+ In each case, the donor domain must provide a congruence system
+ in minimal form.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Congruences_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Shape_Preserving_Product
+ domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain.
+
+ This reduction method includes the congruences reduction.
+ This class uses the minimized constraints defining each of the components.
+ For each of the constraints, it checks the frequency and value for the same
+ linear expression in the other component. If the constraint does not satisfy
+ the implied congruence, the inhomogeneous term is adjusted so that it does.
+ Note that, unless the congruences reduction adds equalities, the
+ shapes of the domains are unaltered.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Shape_Preserving_Reduction {
+public:
+ //! Default constructor.
+ Shape_Preserving_Reduction();
+
+ /*! \brief
+ The congruences reduction operator for detect emptiness or any equalities
+ implied by each of the congruences defining one of the components
+ and the bounds of the other component. It is assumed that the
+ components are already constraints reduced.
+
+ The minimized congruence system defining the domain element \p d1
+ is used to check if \p d2 intersects none, one or more than one
+ of the hyperplanes defined by the congruences: if it intersects none,
+ then product is set empty; if it intersects one, then the equality
+ defining this hyperplane is added to both components; otherwise,
+ the product is unchanged.
+ In each case, the donor domain must provide a congruence system
+ in minimal form.
+
+ \param d1
+ A pointset domain element;
+
+ \param d2
+ A pointset domain element;
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~Shape_Preserving_Reduction();
+};
+
+/*! \brief
+ This class provides the reduction method for the Direct_Product domain.
+
+ \ingroup PPL_CXX_interface
+ The reduction classes are used to instantiate the Partially_Reduced_Product
+ domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+ //! Default constructor.
+ No_Reduction();
+
+ /*! \brief
+ The null reduction operator.
+
+ The parameters \p d1 and \p d2 are ignored.
+ */
+ void product_reduce(D1& d1, D2& d2);
+
+ //! Destructor.
+ ~No_Reduction();
+};
+
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
+
+ \warning
+ At present, the supported instantiations for the
+ two domain templates \p D1 and \p D2 are the simple pointset domains:
+ <CODE>C_Polyhedron</CODE>,
+ <CODE>NNC_Polyhedron</CODE>,
+ <CODE>Grid</CODE>,
+ <CODE>Octagonal_Shape\<T\></CODE>,
+ <CODE>BD_Shape\<T\></CODE>,
+ <CODE>Box\<T\></CODE>.
+
+ An object of the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE>
+ represents the (partially reduced) product of two pointset domains \p D1
+ and \p D2 where the form of any reduction is defined by the
+ reduction class \p R.
+
+ Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+ with concretization functions:
+ \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+ \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+ The partially reduced product \f$D = D_1 \times D_2\f$,
+ for any reduction class \p R, has a concretization
+ \f$\fund{\gamma}{D}{\Rset^n}\f$
+ where, if \f$d = (d_1, d_2) \in D\f$
+ \f[
+ \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+ \f]
+
+ The operations are defined to be the result of applying the corresponding
+ operations on each of the components provided the product is already reduced
+ by the reduction method defined by \p R.
+ In particular, if \p R is the <CODE>No_Reduction\<D1, D2\></CODE> class,
+ then the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> domain
+ is the direct product as defined in \ref CC79 "[CC79]".
+
+ How the results on the components are interpreted and
+ combined depend on the specific test.
+ For example, the test for emptiness will first make sure
+ the product is reduced (using the reduction method provided by \p R
+ if it is not already known to be reduced) and then test if either component
+ is empty; thus, if \p R defines no reduction between its components and
+ \f$d = (G, P) \in (\Gset \times \Pset)\f$
+ is a direct product in one dimension where \f$G\f$ denotes the set of
+ numbers that are integral multiples of 3 while \f$P\f$ denotes the
+ set of numbers between 1 and 2, then an operation that tests for
+ emptiness should return false.
+ However, the test for the universe returns true if and only if the
+ test <CODE>is_universe()</CODE> on both components returns true.
+
+ \par
+ In all the examples it is assumed that the template \c R is the
+ <CODE>No_Reduction\<D1, D2\></CODE> class and that variables
+ \c x and \c y are defined (where they are used) as follows:
+ \code
+ Variable x(0);
+ Variable y(1);
+ \endcode
+
+ \par Example 1
+ The following code builds a direct product of a Grid and NNC Polyhedron,
+ corresponding to the positive even integer
+ pairs in \f$\Rset^2\f$, given as a system of congruences:
+ \code
+ Congruence_System cgs;
+ cgs.insert((x %= 0) / 2);
+ cgs.insert((y %= 0) / 2);
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+ dp(cgs);
+ dp.add_constraint(x >= 0);
+ dp.add_constraint(y >= 0);
+ \endcode
+
+ \par Example 2
+ The following code builds the same product
+ in \f$\Rset^2\f$:
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+ dp.add_constraint(x >= 0);
+ dp.add_constraint(y >= 0);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_congruence((y %= 0) / 2);
+ \endcode
+
+ \par Example 3
+ The following code will write "dp is empty":
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_congruence((x %= 1) / 2);
+ if (dp.is_empty())
+ cout << "dp is empty." << endl;
+ else
+ cout << "dp is not empty." << endl;
+ \endcode
+
+ \par Example 4
+ The following code will write "dp is not empty":
+ \code
+ Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+ dp.add_congruence((x %= 0) / 2);
+ dp.add_constraint(x >= 1);
+ dp.add_constraint(x <= 1);
+ if (dp.is_empty())
+ cout << "dp is empty." << endl;
+ else
+ cout << "dp is not empty." << endl;
+ \endcode
+*/
+
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+ /*! \brief
+ Returns the maximum space dimension this product
+ can handle.
+ */
+ static dimension_type max_space_dimension();
+
+ //! Builds an object having the specified properties.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the pair;
+
+ \param kind
+ Specifies whether a universe or an empty pair has to be built.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Builds a pair, copying a system of congruences.
+ /*!
+ The pair inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(const Congruence_System& cgs);
+
+ //! Builds a pair, recycling a system of congruences.
+ /*!
+ The pair inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences to be approximates by the pair.
+ Its data-structures may be recycled to build the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(Congruence_System& cgs);
+
+ //! Builds a pair, copying a system of constraints.
+ /*!
+ The pair inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Partially_Reduced_Product(const Constraint_System& cs);
+
+ //! Builds a pair, recycling a system of constraints.
+ /*!
+ The pair inherits the space dimension of the constraint system.
+
+ \param cs
+ The system of constraints to be approximated by the pair.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p cs exceeds the maximum allowed
+ space dimension.
+ */
+ explicit Partially_Reduced_Product(Constraint_System& cs);
+
+ //! Builds a product, from a C polyhedron.
+ /*!
+ Builds a product containing \p ph using algorithms whose
+ complexity does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+ smallest one containing \p ph.
+ The product inherits the space dimension of the polyhedron.
+
+ \param ph
+ The polyhedron to be approximated by the product.
+
+ \param complexity
+ The complexity that will not be exceeded.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const C_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product, from an NNC polyhedron.
+ /*!
+ Builds a product containing \p ph using algorithms whose
+ complexity does not exceed the one specified by \p complexity.
+ If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+ smallest one containing \p ph.
+ The product inherits the space dimension of the polyhedron.
+
+ \param ph
+ The polyhedron to be approximated by the product.
+
+ \param complexity
+ The complexity that will not be exceeded.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const NNC_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product, from a grid.
+ /*!
+ Builds a product containing \p gr.
+ The product inherits the space dimension of the grid.
+
+ \param gr
+ The grid to be approximated by the product.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p gr exceeds the maximum allowed
+ space dimension.
+ */
+ explicit
+ Partially_Reduced_Product(const Grid& gr,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of a box.
+ /*!
+ Builds a product containing \p box.
+ The product inherits the space dimension of the box.
+
+ \param box
+ The box representing the pair to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ Partially_Reduced_Product(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of a BD shape.
+ /*!
+ Builds a product containing \p bd.
+ The product inherits the space dimension of the BD shape.
+
+ \param bd
+ The BD shape representing the product to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bd exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ Partially_Reduced_Product(const BD_Shape<U>& bd,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a product out of an octagonal shape.
+ /*!
+ Builds a product containing \p os.
+ The product inherits the space dimension of the octagonal shape.
+
+ \param os
+ The octagonal shape representing the product to be built.
+
+ \param complexity
+ The complexity is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename U>
+ Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Ordinary copy constructor.
+ Partially_Reduced_Product(const Partially_Reduced_Product& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a conservative, upward approximation of \p y.
+ /*!
+ The complexity argument is ignored.
+ */
+ template <typename E1, typename E2, typename S>
+ explicit
+ Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ The assignment operator. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
+
+ //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+ "affine dimension"
+ (see also \ref Grid_Affine_Dimension "grid affine dimension")
+ of the components of \p *this.
+ */
+ dimension_type affine_dimension() const;
+
+ //! Returns a constant reference to the first of the pair.
+ const D1& domain1() const;
+
+ //! Returns a constant reference to the second of the pair.
+ const D2& domain2() const;
+
+ //! Returns a system of constraints which approximates \p *this.
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Returns a system of constraints which approximates \p *this, in
+ reduced form.
+ */
+ Constraint_System minimized_constraints() const;
+
+ //! Returns a system of congruences which approximates \p *this.
+ Congruence_System congruences() const;
+
+ /*! \brief
+ Returns a system of congruences which approximates \p *this, in
+ reduced form.
+ */
+ Congruence_System minimized_congruences() const;
+
+ //! Returns the relations holding between \p *this and \p c.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+ Returns the Poly_Con_Relation \p r for \p *this:
+ suppose the first component returns \p r1 and the second \p r2,
+ then \p r implies <CODE>is_included()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>is_included()</CODE>;
+ \p r implies <CODE>saturates()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>saturates()</CODE>;
+ \p r implies <CODE>is_disjoint()</CODE>
+ if and only if one or both of \p r1 and \p r2 imply
+ <CODE>is_disjoint()</CODE>;
+ and \p r implies <CODE>nothing()</CODE>
+ if and only if both \p r1 and \p r2 imply
+ <CODE>strictly_intersects()</CODE>.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ //! Returns the relations holding between \p *this and \p cg.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ //! Returns the relations holding between \p *this and \p g.
+ /*
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+
+ Returns the Poly_Gen_Relation \p r for \p *this:
+ suppose the first component returns \p r1 and the second \p r2,
+ then \p r = <CODE>subsumes()</CODE>
+ if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+ and \p r = <CODE>nothing()</CODE>
+ if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if either of the components
+ of \p *this are empty.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if both of the components
+ of \p *this are the universe.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if both of the components
+ of \p *this are topologically closed subsets of the vector space.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y are
+ componentwise disjoint.
+
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are dimension-incompatible.
+ */
+ bool is_disjoint_from(const Partially_Reduced_Product& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if a component of \p *this
+ is discrete.
+ */
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if a component of \p *this
+ is bounded.
+ */
+ bool is_bounded() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ bool constrains(Variable var) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_below.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+ /*!
+ This method is the same as bounds_from_above.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+ maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from above in \p *this, in which case the
+ supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded by \p *this,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below i \p *this, in which case the
+ infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty and
+ \p expr is bounded from below in \p *this, in which case the
+ infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+ \param g
+ When minimization succeeds, will be assigned the point or closure
+ point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each component of \p *this
+ contains the corresponding component of \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool contains(const Partially_Reduced_Product& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each component of \p *this
+ strictly contains the corresponding component of \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool strictly_contains(const Partially_Reduced_Product& y) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+ //@{
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Adds a copy of congruence \p cg to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are
+ dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Adds a copy of the congruences in \p cgs to \p *this.
+ /*!
+ \param cgs
+ The congruence system to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system to be added that may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cgs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_congruences(Congruence_System& cgs);
+
+ //! Adds a copy of the constraint system in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system to be added.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ //! Adds the constraint system in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system to be added that may be recycled.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+
+ \warning
+ The only assumption that can be made about \p cs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ void add_recycled_constraints(Constraint_System& cs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Assigns to \p *this the componentwise intersection of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void intersection_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an upper bound of \p *this and \p y
+ computed on the corresponding components.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void upper_bound_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an upper bound of \p *this and \p y
+ computed on the corresponding components.
+ If it is exact on each of the components of \p *this, <CODE>true</CODE>
+ is returned, otherwise <CODE>false</CODE> is returned.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this an approximation of the set-theoretic difference
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Partially_Reduced_Product& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Single_Update_Affine_Functions
+ "affine image" of \p
+ *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the \ref Single_Update_Affine_Functions
+ "affine preimage" of
+ \p *this under the function mapping variable \p var to the affine
+ expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+ (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+ "time-elapse" between \p *this and \p y.
+ (See also \ref Grid_Time_Elapse "time-elapse".)
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void time_elapse_assign(const Partially_Reduced_Product& y);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ // TODO: Add a way to call other widenings.
+
+ // CHECKME: This may not be a real widening; it depends on the reduction
+ // class R and the widening used.
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ "widening" between \p *this and \p y.
+
+ This widening uses either the congruence or generator systems
+ depending on which of the systems describing x and y
+ are up to date and minimized.
+
+ \param y
+ A product that <EM>must</EM> be contained in \p *this;
+
+ \param tp
+ An optional pointer to an unsigned variable storing the number of
+ available tokens (to be used when applying the
+ \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void widening_assign(const Partially_Reduced_Product& y,
+ unsigned* tp = NULL);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ Adds \p m new space dimensions and embeds the components
+ of \p *this in the new vector space.
+
+ \param m
+ The number of dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new space dimensions and does not embed the components
+ in the new vector space.
+
+ \param m
+ The number of space dimensions to add.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the
+ vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ /*! \brief
+ Assigns to the first (resp., second) component of \p *this
+ the "concatenation" of the first (resp., second) components
+ of \p *this and \p y, taken in this order.
+ See also \ref Concatenating_Polyhedra.
+
+ \exception std::length_error
+ Thrown if the concatenation would cause the vector space
+ to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+ void concatenate_assign(const Partially_Reduced_Product& y);
+
+ //! Removes all the specified dimensions from the vector space.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher dimensions of the vector space so that the
+ resulting space will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension of
+ \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+ If \p pfunc maps only some of the dimensions of \p *this then the
+ rest will be projected away.
+
+ If the highest dimension mapped to by \p pfunc is higher than the
+ highest dimension in \p *this then the number of dimensions in \p
+ *this will be increased to the highest dimension mapped to by \p
+ pfunc.
+
+ \param pfunc
+ The partial function specifying the destiny of each space
+ dimension.
+
+ The template class <CODE>Partial_Function</CODE> must provide the following
+ methods.
+ \code
+ bool has_empty_codomain() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the represented partial
+ function has an empty codomain (i.e., it is always undefined).
+ The <CODE>has_empty_codomain()</CODE> method will always be called
+ before the methods below. However, if
+ <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+ of the functions below will be called.
+ \code
+ dimension_type max_in_codomain() const
+ \endcode
+ returns the maximum value that belongs to the codomain of the
+ partial function.
+ The <CODE>max_in_codomain()</CODE> method is called at most once.
+ \code
+ bool maps(dimension_type i, dimension_type& j) const
+ \endcode
+ Let \f$f\f$ be the represented function and \f$k\f$ be the value
+ of \p i. If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+ assigned to \p j and <CODE>true</CODE> is returned. If \f$f\f$ is
+ undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+ This method is called at most \f$n\f$ times, where \f$n\f$ is the
+ dimension of the vector space enclosing \p *this.
+
+ The result is undefined if \p pfunc does not encode a partial
+ function with the properties described in
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+ "folded" into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::
+ operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Partially_Reduced_Product();
+
+ /*! \brief
+ Swaps \p *this with product \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void m_swap(Partially_Reduced_Product& y);
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //@} // Miscellaneous Member Functions
+
+ //! Reduce.
+ /*
+ \return
+ <CODE>true</CODE> if and only if either of the resulting component
+ is strictly contained in the respective original.
+ */
+ bool reduce() const;
+
+protected:
+ //! The type of the first component.
+ typedef D1 Domain1;
+
+ //! The type of the second component.
+ typedef D2 Domain2;
+
+ //! The first component.
+ D1 d1;
+
+ //! The second component.
+ D2 d2;
+
+protected:
+ //! Clears the reduced flag.
+ void clear_reduced_flag() const;
+
+ //! Sets the reduced flag.
+ void set_reduced_flag() const;
+
+ //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+ bool is_reduced() const;
+
+ /*! \brief
+ Flag to record whether the components are reduced with respect
+ to each other and the reduction class.
+ */
+ bool reduced;
+
+private:
+ void throw_space_dimension_overflow(const char* method,
+ const char* reason);
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ This class is temporary and will be removed when template typedefs will
+ be supported in C++.
+
+ When template typedefs will be supported in C++, what now is verbosely
+ denoted by <CODE>Domain_Product\<Domain1, Domain2\>::%Direct_Product</CODE>
+ will simply be denoted by <CODE>Direct_Product\<Domain1, Domain2\></CODE>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+ typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+ Direct_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+ Smash_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+ Constraints_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Congruences_Reduction<D1, D2> >
+ Congruences_Product;
+
+ typedef Partially_Reduced_Product<D1, D2, Shape_Preserving_Reduction<D1, D2> >
+ Shape_Preserving_Product;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_inlines.hh line 1. */
+/* Partially_Reduced_Product class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_inlines.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+ return (D1::max_space_dimension() < D2::max_space_dimension())
+ ? D1::max_space_dimension()
+ : D2::max_space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : d1(num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow("Partially_Reduced_Product(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind),
+ d2(num_dimensions, kind) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& cgs)
+ : d1(cgs), d2(cgs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+ : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& cs)
+ : d1(cs), d2(cs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+ : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+ Complexity_Class complexity)
+ : d1(ph, complexity), d2(ph, complexity) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+ Complexity_Class complexity)
+ : d1(ph, complexity), d2(ph, complexity) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+ : d1(gr), d2(gr) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+ : d1(box), d2(box) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+ : d1(bd), d2(bd) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+ : d1(os), d2(os) {
+ set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+ Complexity_Class)
+ : d1(y.d1), d2(y.d2) {
+ reduced = y.reduced;
+}
+
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+ Complexity_Class complexity)
+ : d1(y.space_dimension()), d2(y.space_dimension()), reduced(false) {
+ Partially_Reduced_Product<D1, D2, R> pg1(y.domain1(), complexity);
+ Partially_Reduced_Product<D1, D2, R> pg2(y.domain2(), complexity);
+ pg1.intersection_assign(pg2);
+ m_swap(pg1);
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+ return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+ PPL_ASSERT(d1.space_dimension() == d2.space_dimension());
+ return d1.space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+ reduce();
+ const dimension_type d1_dim = d1.affine_dimension();
+ const dimension_type d2_dim = d2.affine_dimension();
+ return std::min(d1_dim, d2_dim);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+ reduce();
+ d1.unconstrain(var);
+ d2.unconstrain(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::unconstrain(const Variables_Set& vars) {
+ reduce();
+ d1.unconstrain(vars);
+ d2.unconstrain(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+ d1.intersection_assign(y.d1);
+ d2.intersection_assign(y.d2);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.difference_assign(y.d1);
+ d2.difference_assign(y.d2);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.upper_bound_assign(y.d1);
+ d2.upper_bound_assign(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ D1 d1_copy = d1;
+ bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+ if (!ub_exact)
+ return false;
+ ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+ if (!ub_exact)
+ return false;
+ using std::swap;
+ swap(d1, d1_copy);
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.affine_image(var, expr, denominator);
+ d2.affine_image(var, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.affine_preimage(var, expr, denominator);
+ d2.affine_preimage(var, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.generalized_affine_image(var, relsym, expr, denominator);
+ d2.generalized_affine_image(var, relsym, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.generalized_affine_preimage(var, relsym, expr, denominator);
+ d2.generalized_affine_preimage(var, relsym, expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ d1.generalized_affine_image(lhs, relsym, rhs);
+ d2.generalized_affine_image(lhs, relsym, rhs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ d1.generalized_affine_preimage(lhs, relsym, rhs);
+ d2.generalized_affine_preimage(lhs, relsym, rhs);
+ clear_reduced_flag();
+}
+
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+ d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+ reduce();
+ y.reduce();
+ d1.time_elapse_assign(y.d1);
+ d2.time_elapse_assign(y.d2);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+ d1.topological_closure_assign();
+ d2.topological_closure_assign();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::m_swap(Partially_Reduced_Product& y) {
+ using std::swap;
+ swap(d1, y.d1);
+ swap(d2, y.d2);
+ swap(reduced, y.reduced);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+ d1.add_constraint(c);
+ d2.add_constraint(c);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+ d1.refine_with_constraint(c);
+ d2.refine_with_constraint(c);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+ d1.add_congruence(cg);
+ d2.add_congruence(cg);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+ d1.refine_with_congruence(cg);
+ d2.refine_with_congruence(cg);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+ d1.add_constraints(cs);
+ d2.add_constraints(cs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+ d1.refine_with_constraints(cs);
+ d2.refine_with_constraints(cs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+ d1.add_congruences(cgs);
+ d2.add_congruences(cgs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+ d1.refine_with_congruences(cgs);
+ d2.refine_with_congruences(cgs);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+ reduce();
+ d1.drop_some_non_integer_points(complexity);
+ d2.drop_some_non_integer_points(complexity);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ reduce();
+ d1.drop_some_non_integer_points(vars, complexity);
+ d2.drop_some_non_integer_points(vars, complexity);
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+ d1 = y.d1;
+ d2 = y.d2;
+ reduced = y.reduced;
+ return *this;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+ reduce();
+ return d1;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+ reduce();
+ return d2;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+ reduce();
+ return d1.is_empty() || d2.is_empty();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+ return d1.is_universe() && d2.is_universe();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+ reduce();
+ return d1.is_topologically_closed() && d2.is_topologically_closed();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+ reduce();
+ return d1.is_discrete() || d2.is_discrete();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+ reduce();
+ return d1.is_bounded() || d2.is_bounded();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+ reduce();
+ return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+ reduce();
+ return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+ reduce();
+ return d1.constrains(var) || d2.constrains(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+ unsigned* tp) {
+ // FIXME(0.10.1): In general this is _NOT_ a widening since the reduction
+ // may mean that the sequence does not satisfy the ascending
+ // chain condition.
+ // However, for the direct, smash and constraints product
+ // it may be ok - but this still needs checking.
+ reduce();
+ y.reduce();
+ d1.widening_assign(y.d1, tp);
+ d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+ d1.add_space_dimensions_and_embed(m);
+ d2.add_space_dimensions_and_embed(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+ d1.add_space_dimensions_and_project(m);
+ d2.add_space_dimensions_and_project(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+ d1.concatenate_assign(y.d1);
+ d2.concatenate_assign(y.d2);
+ if (!is_reduced() || !y.is_reduced())
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& vars) {
+ d1.remove_space_dimensions(vars);
+ d2.remove_space_dimensions(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+ d1.remove_higher_space_dimensions(new_dimension);
+ d2.remove_higher_space_dimensions(new_dimension);
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+ d1.map_space_dimensions(pfunc);
+ d2.map_space_dimensions(pfunc);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+ d1.expand_space_dimension(var, m);
+ d2.expand_space_dimension(var, m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ d1.fold_space_dimensions(vars, dest);
+ d2.fold_space_dimensions(vars, dest);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return d1.contains(y.d1) && d2.contains(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+ reduce();
+ y.reduce();
+ return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+ || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+ Partially_Reduced_Product& dp
+ = const_cast<Partially_Reduced_Product&>(*this);
+ if (dp.is_reduced())
+ return false;
+ R r;
+ r.product_reduce(dp.d1, dp.d2);
+ set_reduced_flag();
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+ return reduced;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+ const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+ const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
+
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+ const char yes = '+';
+ const char no = '-';
+ s << "Partially_Reduced_Product\n";
+ s << (reduced ? yes : no) << "reduced\n";
+ s << "Domain 1:\n";
+ d1.ascii_dump(s);
+ s << "Domain 2:\n";
+ d2.ascii_dump(s);
+}
+
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y) {
+ x.reduce();
+ y.reduce();
+ return x.d1 == y.d1 && x.d2 == y.d2;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+ const Partially_Reduced_Product<D1, D2, R>& y) {
+ return !(x == y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s,
+ const Partially_Reduced_Product<D1, D2, R>& dp) {
+ return s << "Domain 1:\n"
+ << dp.d1
+ << "Domain 2:\n"
+ << dp.d2;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
+
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::~Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::Shape_Preserving_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::~Shape_Preserving_Reduction() {
+}
+
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+swap(Partially_Reduced_Product<D1, D2, R>& x,
+ Partially_Reduced_Product<D1, D2, R>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_templates.hh line 1. */
+/* Partially_Reduced_Product class implementation:
+ non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_templates.hh line 31. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::throw_space_dimension_overflow(const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Partially_Reduced_Product::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::length_error(s.str());
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+ reduce();
+ Constraint_System cs = d2.constraints();
+ const Constraint_System& cs1 = d1.constraints();
+ for (Constraint_System::const_iterator i = cs1.begin(),
+ cs_end = cs1.end(); i != cs_end; ++i)
+ cs.insert(*i);
+ return cs;
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+ reduce();
+ Constraint_System cs = d2.constraints();
+ const Constraint_System& cs1 = d1.constraints();
+ for (Constraint_System::const_iterator i = cs1.begin(),
+ cs_end = cs1.end(); i != cs_end; ++i)
+ cs.insert(*i);
+ if (cs.has_strict_inequalities()) {
+ NNC_Polyhedron ph(cs);
+ return ph.minimized_constraints();
+ }
+ else {
+ C_Polyhedron ph(cs);
+ return ph.minimized_constraints();
+ }
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+ reduce();
+ Congruence_System cgs = d2.congruences();
+ const Congruence_System& cgs1 = d1.congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i)
+ cgs.insert(*i);
+ return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+ reduce();
+ Congruence_System cgs = d2.congruences();
+ const Congruence_System& cgs1 = d1.congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i)
+ cgs.insert(*i);
+ Grid gr(cgs);
+ return gr.minimized_congruences();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+ if (d1.can_recycle_constraint_systems()) {
+ d2.refine_with_constraints(cs);
+ d1.add_recycled_constraints(cs);
+ }
+ else
+ if (d2.can_recycle_constraint_systems()) {
+ d1.refine_with_constraints(cs);
+ d2.add_recycled_constraints(cs);
+ }
+ else {
+ d1.add_constraints(cs);
+ d2.add_constraints(cs);
+ }
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+ if (d1.can_recycle_congruence_systems()) {
+ d2.refine_with_congruences(cgs);
+ d1.add_recycled_congruences(cgs);
+ }
+ else
+ if (d2.can_recycle_congruence_systems()) {
+ d1.refine_with_congruences(cgs);
+ d2.add_recycled_congruences(cgs);
+ }
+ else {
+ d1.add_congruences(cgs);
+ d2.add_congruences(cgs);
+ }
+ clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+ reduce();
+ if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+ || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+ return Poly_Gen_Relation::nothing();
+ else
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+ reduce();
+ Poly_Con_Relation relation1 = d1.relation_with(c);
+ Poly_Con_Relation relation2 = d2.relation_with(c);
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+ if (relation1.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ else if (relation2.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ if (relation1.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ else if (relation2.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+ else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+
+ return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+ reduce();
+ Poly_Con_Relation relation1 = d1.relation_with(cg);
+ Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+ if (relation1.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ else if (relation2.implies(Poly_Con_Relation::is_included()))
+ result = result && Poly_Con_Relation::is_included();
+ if (relation1.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ else if (relation2.implies(Poly_Con_Relation::saturates()))
+ result = result && Poly_Con_Relation::saturates();
+ if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+ else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+ result = result && Poly_Con_Relation::is_disjoint();
+
+ return result;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+ bool maximum1;
+ bool maximum2;
+ bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+ bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+ // If neither is bounded from above, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from above, then use the values for d2.
+ if (!r1) {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ return true;
+ }
+ // If only d1 is bounded from above, then use the values for d1.
+ if (!r2) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from above, then use the minimum values.
+ if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ }
+ else {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+ bool minimum1;
+ bool minimum2;
+ bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+ bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+ // If neither is bounded from below, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from below, then use the values for d2.
+ if (!r1) {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ return true;
+ }
+ // If only d1 is bounded from below, then use the values for d1.
+ if (!r2) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from below, then use the minimum values.
+ if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ }
+ else {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+ bool maximum1;
+ bool maximum2;
+ Generator g1(point());
+ Generator g2(point());
+ bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, g1);
+ bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, g2);
+ // If neither is bounded from above, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from above, then use the values for d2.
+ if (!r1) {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ g = g2;
+ return true;
+ }
+ // If only d1 is bounded from above, then use the values for d1.
+ if (!r2) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ g = g1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from above, then use the minimum values.
+ if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+ sup_n = sup1_n;
+ sup_d = sup1_d;
+ maximum = maximum1;
+ g = g1;
+ }
+ else {
+ sup_n = sup2_n;
+ sup_d = sup2_d;
+ maximum = maximum2;
+ g = g2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ reduce();
+
+ if (is_empty())
+ return false;
+ PPL_ASSERT(reduced);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+ bool minimum1;
+ bool minimum2;
+ Generator g1(point());
+ Generator g2(point());
+ bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, g1);
+ bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, g2);
+ // If neither is bounded from below, return false.
+ if (!r1 && !r2)
+ return false;
+ // If only d2 is bounded from below, then use the values for d2.
+ if (!r1) {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ g = g2;
+ return true;
+ }
+ // If only d1 is bounded from below, then use the values for d1.
+ if (!r2) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ g = g1;
+ return true;
+ }
+ // If both d1 and d2 are bounded from below, then use the minimum values.
+ if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+ inf_n = inf1_n;
+ inf_d = inf1_d;
+ minimum = minimum1;
+ g = g1;
+ }
+ else {
+ inf_n = inf2_n;
+ inf_d = inf2_d;
+ minimum = minimum2;
+ g = g2;
+ }
+ return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+ if (reduced) {
+ Partially_Reduced_Product<D1, D2, R> dp1 = *this;
+ Partially_Reduced_Product<D1, D2, R> dp2 = *this;
+ /* Force dp1 reduction */
+ dp1.clear_reduced_flag();
+ dp1.reduce();
+ if (dp1 != dp2)
+ return false;
+ }
+ return d1.OK() && d2.OK();
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+ const char yes = '+';
+ const char no = '-';
+ std::string str;
+ if (!(s >> str) || str != "Partially_Reduced_Product")
+ return false;
+ if (!(s >> str)
+ || (str[0] != yes && str[0] != no)
+ || str.substr(1) != "reduced")
+ return false;
+ reduced = (str[0] == yes);
+ if (!(s >> str) || str != "Domain")
+ return false;
+ if (!(s >> str) || str != "1:")
+ return false;
+ if (!d1.ascii_load(s))
+ return false;
+ if (!(s >> str) || str != "Domain")
+ return false;
+ if (!(s >> str) || str != "2:")
+ return false;
+ return d2.ascii_load(s);
+}
+
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ using std::swap;
+ if (d2.is_empty()) {
+ if (!d1.is_empty()) {
+ D1 new_d1(d1.space_dimension(), EMPTY);
+ swap(d1, new_d1);
+ }
+ }
+ else if (d1.is_empty()) {
+ D2 new_d2(d2.space_dimension(), EMPTY);
+ swap(d2, new_d2);
+ }
+}
+
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ if (d1.is_empty() || d2.is_empty()) {
+ // If one of the components is empty, do the smash reduction and return.
+ Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+ sr.product_reduce(d1, d2);
+ return;
+ }
+ else {
+ using std::swap;
+ dimension_type space_dim = d1.space_dimension();
+ d1.refine_with_constraints(d2.minimized_constraints());
+ if (d1.is_empty()) {
+ D2 new_d2(space_dim, EMPTY);
+ swap(d2, new_d2);
+ return;
+ }
+ d2.refine_with_constraints(d1.minimized_constraints());
+ if (d2.is_empty()) {
+ D1 new_d1(space_dim, EMPTY);
+ swap(d1, new_d1);
+ }
+ }
+}
+
+/* Auxiliary procedure for the Congruences_Reduction() method.
+ If more than one hyperplane defined by congruence cg intersect
+ d2, then d1 and d2 are unchanged; if exactly one intersects d2, then
+ the corresponding equality is added to d1 and d2;
+ otherwise d1 and d2 are set empty. */
+template <typename D1, typename D2>
+bool shrink_to_congruence_no_check(D1& d1, D2& d2, const Congruence& cg) {
+ // It is assumed that cg is a proper congruence.
+ PPL_ASSERT(cg.modulus() != 0);
+ // It is assumed that cg is satisfied by all points in d1.
+ PPL_ASSERT(d1.relation_with(cg) == Poly_Con_Relation::is_included());
+
+ Linear_Expression e(cg.expression());
+
+ // Find the maximum and minimum bounds for the domain element d with the
+ // linear expression e.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+ bool max_included;
+ PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+ if (d2.maximize(e, max_numer, max_denom, max_included)) {
+ bool min_included;
+ if (d2.minimize(e, min_numer, min_denom, min_included)) {
+ // Adjust values to allow for the denominators max_denom and min_denom.
+ max_numer *= min_denom;
+ min_numer *= max_denom;
+ PPL_DIRTY_TEMP_COEFFICIENT(denom);
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ denom = max_denom * min_denom;
+ mod = cg.modulus() * denom;
+ // If the difference between the maximum and minimum bounds is more than
+ // twice the modulus, then there will be two neighboring hyperplanes
+ // defined by cg that are intersected by the domain element d;
+ // there is no possible reduction in this case.
+ PPL_DIRTY_TEMP_COEFFICIENT(mod2);
+ mod2 = 2 * mod;
+ if (max_numer - min_numer < mod2
+ || (max_numer - min_numer == mod2 && (!max_included || !min_included)))
+ {
+ PPL_DIRTY_TEMP_COEFFICIENT(shrink_amount);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_decreased);
+ PPL_DIRTY_TEMP_COEFFICIENT(min_increased);
+ // Find the amount by which the maximum value may be decreased.
+ shrink_amount = max_numer % mod;
+ if (!max_included && shrink_amount == 0)
+ shrink_amount = mod;
+ if (shrink_amount < 0)
+ shrink_amount += mod;
+ max_decreased = max_numer - shrink_amount;
+ // Find the amount by which the minimum value may be increased.
+ shrink_amount = min_numer % mod;
+ if (!min_included && shrink_amount == 0)
+ shrink_amount = - mod;
+ if (shrink_amount > 0)
+ shrink_amount -= mod;
+ min_increased = min_numer - shrink_amount;
+ if (max_decreased == min_increased) {
+ // The domain element d2 intersects exactly one hyperplane
+ // defined by cg, so add the equality to d1 and d2.
+ Constraint new_c(denom * e == min_increased);
+ d1.refine_with_constraint(new_c);
+ d2.refine_with_constraint(new_c);
+ return true;
+ }
+ else {
+ if (max_decreased < min_increased) {
+ using std::swap;
+ // In this case, d intersects no hyperplanes defined by cg,
+ // so set d to empty and return false.
+ D1 new_d1(d1.space_dimension(), EMPTY);
+ swap(d1, new_d1);
+ D2 new_d2(d2.space_dimension(), EMPTY);
+ swap(d2, new_d2);
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+template <typename D1, typename D2>
+void
+Congruences_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ if (d1.is_empty() || d2.is_empty()) {
+ // If one of the components is empty, do the smash reduction and return.
+ Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+ sr.product_reduce(d1, d2);
+ return;
+ }
+ // Use the congruences representing d1 to shrink both components.
+ const Congruence_System cgs1 = d1.minimized_congruences();
+ for (Congruence_System::const_iterator i = cgs1.begin(),
+ cgs_end = cgs1.end(); i != cgs_end; ++i) {
+ const Congruence& cg1 = *i;
+ if (cg1.is_equality())
+ d2.refine_with_congruence(cg1);
+ else
+ if (!Parma_Polyhedra_Library::
+ shrink_to_congruence_no_check(d1, d2, cg1))
+ // The product is empty.
+ return;
+ }
+ // Use the congruences representing d2 to shrink both components.
+ const Congruence_System cgs2 = d2.minimized_congruences();
+ for (Congruence_System::const_iterator i = cgs2.begin(),
+ cgs_end = cgs2.end(); i != cgs_end; ++i) {
+ const Congruence& cg2 = *i;
+ if (cg2.is_equality())
+ d1.refine_with_congruence(cg2);
+ else
+ if (!Parma_Polyhedra_Library::
+ shrink_to_congruence_no_check(d2, d1, cg2))
+ // The product is empty.
+ return;
+ }
+}
+
+template <typename D1, typename D2>
+void
+Shape_Preserving_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+ // First do the congruences reduction.
+ Parma_Polyhedra_Library::Congruences_Reduction<D1, D2> cgr;
+ cgr.product_reduce(d1, d2);
+ if (d1.is_empty())
+ return;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(freq_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(freq_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(val_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(val_d);
+
+ // Use the constraints representing d2.
+ Constraint_System cs = d2.minimized_constraints();
+ Constraint_System refining_cs;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ continue;
+ // Check the frequency and value of the linear expression for
+ // the constraint `c'.
+ Linear_Expression le(c.expression());
+ if (!d1.frequency(le, freq_n, freq_d, val_n, val_d))
+ // Nothing to do.
+ continue;
+ if (val_n == 0)
+ // Nothing to do.
+ continue;
+ // Adjust the value of the inhomogeneous term to satisfy
+ // the implied congruence.
+ if (val_n < 0) {
+ val_n = val_n*freq_d + val_d*freq_n;
+ val_d *= freq_d;
+ }
+ le *= val_d;
+ le -= val_n;
+ refining_cs.insert(le >= 0);
+ }
+ d2.refine_with_constraints(refining_cs);
+
+ // Use the constraints representing d1.
+ cs = d1.minimized_constraints();
+ refining_cs.clear();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ // Equalities already shared.
+ continue;
+ // Check the frequency and value of the linear expression for
+ // the constraint `c'.
+ Linear_Expression le(c.expression());
+ if (!d2.frequency(le, freq_n, freq_d, val_n, val_d))
+ // Nothing to do.
+ continue;
+ if (val_n == 0)
+ // Nothing to do.
+ continue;
+ // Adjust the value of the inhomogeneous term to satisfy
+ // the implied congruence.
+ if (val_n < 0) {
+ val_n = val_n*freq_d + val_d*freq_n;
+ val_d *= freq_d;
+ }
+ le *= val_d;
+ le -= val_n;
+ refining_cs.insert(le >= 0);
+ }
+ d1.refine_with_constraints(refining_cs);
+
+ // The reduction may have introduced additional equalities
+ // so these must be shared with the other component.
+ Parma_Polyhedra_Library::Constraints_Reduction<D1, D2> cr;
+ cr.product_reduce(d1, d2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 1688. */
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 1. */
+/* Determinate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Determinate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 32. */
+#include <iosfwd>
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 34. */
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Determinate */
+template <typename PSET>
+void swap(Determinate<PSET>& x, Determinate<PSET>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+ COW-wrapped pointset.
+
+ \relates Determinate
+*/
+template <typename PSET>
+bool operator==(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x and \p y are different
+ COW-wrapped pointsets.
+
+ \relates Determinate
+*/
+template <typename PSET>
+bool operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PSET>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \brief
+ A wrapper for PPL pointsets, providing them with a
+ <EM>determinate constraint system</EM> interface, as defined
+ in \ref Bag98 "[Bag98]".
+
+ The implementation uses a copy-on-write optimization, making the
+ class suitable for constructions, like the <EM>finite powerset</EM>
+ and <EM>ask-and-tell</EM> of \ref Bag98 "[Bag98]", that are likely
+ to perform many copies.
+
+ \ingroup PPL_CXX_interface
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Determinate {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset \p pset.
+ */
+ Determinate(const PSET& pset);
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset
+ defined by \p cs.
+ */
+ Determinate(const Constraint_System& cs);
+
+ /*! \brief
+ Constructs a COW-wrapped object corresponding to the pointset
+ defined by \p cgs.
+ */
+ Determinate(const Congruence_System& cgs);
+
+ //! Copy constructor.
+ Determinate(const Determinate& y);
+
+ //! Destructor.
+ ~Determinate();
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Domain Element
+ //@{
+
+ //! Returns a const reference to the embedded pointset.
+ const PSET& pointset() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this embeds the universe
+ element \p PSET.
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this embeds the empty
+ element of \p PSET.
+ */
+ bool is_bottom() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+ bool definitely_entails(const Determinate& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are definitely equivalent.
+ */
+ bool is_definitely_equivalent_to(const Determinate& y) const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*!
+ Returns <CODE>true</CODE> if and only if this domain
+ has a nontrivial weakening operator.
+ */
+ static bool has_nontrivial_weakening();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Domain Element
+
+
+ //! \name Member Functions that May Modify the Domain Element
+ //@{
+
+ //! Assigns to \p *this the upper bound of \p *this and \p y.
+ void upper_bound_assign(const Determinate& y);
+
+ //! Assigns to \p *this the meet of \p *this and \p y.
+ void meet_assign(const Determinate& y);
+
+ //! Assigns to \p *this the result of weakening \p *this with \p y.
+ void weakening_assign(const Determinate& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+ of \p *this and \p y, taken in this order.
+ */
+ void concatenate_assign(const Determinate& y);
+
+ //! Returns a reference to the embedded element.
+ PSET& pointset();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ On return from this method, the representation of \p *this
+ is not shared by different Determinate objects.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ void mutate();
+
+ //! Assignment operator.
+ Determinate& operator=(const Determinate& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Determinate& y);
+
+ //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! A function adapter for the Determinate class.
+ /*! \ingroup PPL_CXX_interface
+ It lifts a Binary_Operator_Assign function object, taking arguments
+ of type PSET, producing the corresponding function object taking
+ arguments of type Determinate<PSET>.
+
+ The template parameter Binary_Operator_Assign is supposed to
+ implement an <EM>apply and assign</EM> function, i.e., a function
+ having signature <CODE>void foo(PSET& x, const PSET& y)</CODE> that
+ applies an operator to \c x and \c y and assigns the result to \c x.
+ For instance, such a function object is obtained by
+ <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ template <typename Binary_Operator_Assign>
+ class Binary_Operator_Assign_Lifter {
+ public:
+ //! Explicit unary constructor.
+ explicit
+ Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+ //! Function-application operator.
+ void operator()(Determinate& x, const Determinate& y) const;
+
+ private:
+ //! The function object to be lifted.
+ Binary_Operator_Assign op_assign_;
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Helper function returning a Binary_Operator_Assign_Lifter object,
+ also allowing for the deduction of template arguments.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+ template <typename Binary_Operator_Assign>
+ static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+ lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+ //! The possibly shared representation of a Determinate object.
+ /*! \ingroup PPL_CXX_interface
+ By adopting the <EM>copy-on-write</EM> technique, a single
+ representation of the base-level object may be shared by more than
+ one object of the class Determinate.
+ */
+ class Rep {
+ private:
+ /*! \brief
+ Count the number of references:
+ - 0: leaked, \p pset is non-const;
+ - 1: one reference, \p pset is non-const;
+ - > 1: more than one reference, \p pset is const.
+ */
+ mutable unsigned long references;
+
+ //! Private and unimplemented: assignment not allowed.
+ Rep& operator=(const Rep& y);
+
+ //! Private and unimplemented: copies not allowed.
+ Rep(const Rep& y);
+
+ //! Private and unimplemented: default construction not allowed.
+ Rep();
+
+ public:
+ //! The possibly shared, embedded pointset.
+ PSET pset;
+
+ /*! \brief
+ Builds a new representation by creating a pointset
+ of the specified kind, in the specified vector space.
+ */
+ Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a new representation by copying the pointset \p p.
+ Rep(const PSET& p);
+
+ //! Builds a new representation by copying the constraints in \p cs.
+ Rep(const Constraint_System& cs);
+
+ //! Builds a new representation by copying the constraints in \p cgs.
+ Rep(const Congruence_System& cgs);
+
+ //! Destructor.
+ ~Rep();
+
+ //! Registers a new reference.
+ void new_reference() const;
+
+ /*! \brief
+ Unregisters one reference; returns <CODE>true</CODE> if and only if
+ the representation has become unreferenced.
+ */
+ bool del_reference() const;
+
+ //! True if and only if this representation is currently shared.
+ bool is_shared() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+ };
+
+ /*! \brief
+ A pointer to the possibly shared representation of
+ the base-level domain element.
+ */
+ Rep* prep;
+
+ friend bool
+ operator==<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+ friend bool
+ operator!=<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+};
+
+/* Automatically generated from PPL source file ../src/Determinate_inlines.hh line 1. */
+/* Determinate class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Determinate_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : references(0), pset(num_dimensions, kind) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const PSET& p)
+ : references(0), pset(p) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Constraint_System& cs)
+ : references(0), pset(cs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Congruence_System& cgs)
+ : references(0), pset(cgs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::~Rep() {
+ PPL_ASSERT(references == 0);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::Rep::new_reference() const {
+ ++references;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::del_reference() const {
+ return --references == 0;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::is_shared() const {
+ return references > 1;
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::external_memory_in_bytes() const {
+ return pset.external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const PSET& pset)
+ : prep(new Rep(pset)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Constraint_System& cs)
+ : prep(new Rep(cs)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Congruence_System& cgs)
+ : prep(new Rep(cgs)) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Determinate& y)
+ : prep(y.prep) {
+ prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::~Determinate() {
+ if (prep->del_reference())
+ delete prep;
+}
+
+template <typename PSET>
+inline Determinate<PSET>&
+Determinate<PSET>::operator=(const Determinate& y) {
+ y.prep->new_reference();
+ if (prep->del_reference())
+ delete prep;
+ prep = y.prep;
+ return *this;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::m_swap(Determinate& y) {
+ using std::swap;
+ swap(prep, y.prep);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::mutate() {
+ if (prep->is_shared()) {
+ Rep* const new_prep = new Rep(prep->pset);
+ (void) prep->del_reference();
+ new_prep->new_reference();
+ prep = new_prep;
+ }
+}
+
+template <typename PSET>
+inline const PSET&
+Determinate<PSET>::pointset() const {
+ return prep->pset;
+}
+
+template <typename PSET>
+inline PSET&
+Determinate<PSET>::pointset() {
+ mutate();
+ return prep->pset;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::upper_bound_assign(const Determinate& y) {
+ pointset().upper_bound_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::meet_assign(const Determinate& y) {
+ pointset().intersection_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::has_nontrivial_weakening() {
+ // FIXME: the following should be turned into a query to PSET. This
+ // can be postponed until the time the ask-and-tell construction is
+ // revived.
+ return false;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::weakening_assign(const Determinate& y) {
+ // FIXME: the following should be turned into a proper
+ // implementation. This can be postponed until the time the
+ // ask-and-tell construction is revived.
+ pointset().difference_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::concatenate_assign(const Determinate& y) {
+ pointset().concatenate_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::definitely_entails(const Determinate& y) const {
+ return prep == y.prep || y.prep->pset.contains(prep->pset);
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_definitely_equivalent_to(const Determinate& y) const {
+ return prep == y.prep || prep->pset == y.prep->pset;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_top() const {
+ return prep->pset.is_universe();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_bottom() const {
+ return prep->pset.is_empty();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::external_memory_in_bytes() const {
+ return prep->total_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::OK() const {
+ return prep->pset.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PSET>& x) {
+ s << x.pointset();
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator==(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+ return x.prep == y.prep || x.prep->pset == y.prep->pset;
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+ return x.prep != y.prep && x.prep->pset != y.prep->pset;
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+ : op_assign_(op_assign) {
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+ op_assign_(x.pointset(), y.pointset());
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PSET>::lift_op_assign(Binary_Operator_Assign op_assign) {
+ return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline void
+swap(Determinate<PSET>& x, Determinate<PSET>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 330. */
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 1. */
+/* Powerset class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Powerset_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 1. */
+/* iterator_to_const and const_iterator_to_const class declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 29. */
+//#include "Ask_Tell_types.hh"
+#include <iterator>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+ This template class implements a bidirectional <EM>read-only</EM>
+ iterator on the sequence of objects <CODE>Container</CODE>.
+ By using this iterator class it is not possible to modify the objects
+ contained in <CODE>Container</CODE>; rather, object modification has
+ to be implemented by object replacement, i.e., by using the methods
+ provided by <CODE>Container</CODE> to remove/insert objects.
+ Such a policy (a modifiable container of read-only objects) allows
+ for a reliable enforcement of invariants (such as sortedness of the
+ objects in the sequence).
+
+ \note
+ For any developers' need, suitable friend declarations allow for
+ accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+ //! The type of the underlying mutable iterator.
+ typedef typename Container::iterator Base;
+
+ //! A shortcut for naming the const_iterator traits.
+ typedef typename
+ std::iterator_traits<typename Container::const_iterator> Traits;
+
+ //! A (mutable) iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level iterator.
+ iterator_to_const(const Base& b);
+
+ friend class const_iterator_to_const<Container>;
+ template <typename T> friend class Powerset;
+
+public:
+ // Same traits of the const_iterator, therefore
+ // forbidding the direct modification of sequence elements.
+ typedef typename Traits::iterator_category iterator_category;
+ typedef typename Traits::value_type value_type;
+ typedef typename Traits::difference_type difference_type;
+ typedef typename Traits::pointer pointer;
+ typedef typename Traits::reference reference;
+
+ //! Default constructor.
+ iterator_to_const();
+
+ //! Copy constructor.
+ iterator_to_const(const iterator_to_const& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect access operator.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ iterator_to_const& operator++();
+
+ //! Postfix increment operator.
+ iterator_to_const operator++(int);
+
+ //! Prefix decrement operator.
+ iterator_to_const& operator--();
+
+ //! Postfix decrement operator.
+ iterator_to_const operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const iterator_to_const& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+ This class, besides implementing a read-only bidirectional iterator
+ on a read-only sequence of objects, ensures interoperability
+ with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+ //! The type of the underlying %const_iterator.
+ typedef typename Container::const_iterator Base;
+
+ //! A shortcut for naming traits.
+ typedef typename std::iterator_traits<Base> Traits;
+
+ //! A %const_iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level const_iterator.
+ const_iterator_to_const(const Base& b);
+
+ friend class iterator_to_const<Container>;
+ template <typename T> friend class Powerset;
+
+public:
+ // Same traits of the underlying const_iterator.
+ typedef typename Traits::iterator_category iterator_category;
+ typedef typename Traits::value_type value_type;
+ typedef typename Traits::difference_type difference_type;
+ typedef typename Traits::pointer pointer;
+ typedef typename Traits::reference reference;
+
+ //! Default constructor.
+ const_iterator_to_const();
+
+ //! Copy constructor.
+ const_iterator_to_const(const const_iterator_to_const& y);
+
+ //! Constructs from the corresponding non-const iterator.
+ const_iterator_to_const(const iterator_to_const<Container>& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ const_iterator_to_const& operator++();
+
+ //! Postfix increment operator.
+ const_iterator_to_const operator++(int);
+
+ //! Prefix decrement operator.
+ const_iterator_to_const& operator--();
+
+ //! Postfix decrement operator.
+ const_iterator_to_const operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const const_iterator_to_const& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Mixed comparison operator: returns <CODE>true</CODE> if and only
+ if (the const version of) \p x is identical to \p y.
+
+ \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ Mixed comparison operator: returns <CODE>true</CODE> if and only
+ if (the const version of) \p x is different from \p y.
+
+ \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_inlines.hh line 1. */
+/* iterator_to_const and const_iterator_to_const class implementations:
+ inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+ : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+ : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+ : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+ return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+ return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+ iterator_to_const tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+ iterator_to_const tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+ return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+ return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+ : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+ : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+ : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+ return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+ return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+ const_iterator_to_const tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+ const_iterator_to_const tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+ return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+ return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+ : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y) {
+ return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+ const const_iterator_to_const<Container>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 220. */
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 30. */
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Powerset */
+template <typename D>
+void swap(Powerset<D>& x, Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+ This class offers a generic implementation of a
+ <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+ Besides invoking the available methods on the disjuncts of a Powerset,
+ this class also provides bidirectional iterators that allow for a
+ direct inspection of these disjuncts. For a consistent handling of
+ Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+ that the disjuncts cannot be overwritten. Rather, by using the class
+ <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+ (possibly so as to later add back modified versions). As an example
+ of iterator usage, the following template function drops from
+ powerset \p ps all the disjuncts that would have become redundant by
+ the addition of an external element \p d.
+
+ \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+ for (typename Powerset<D>::iterator i = ps.begin(),
+ ps_end = ps.end(), i != ps_end; )
+ if (i->definitely_entails(d))
+ i = ps.drop_disjunct(i);
+ else
+ ++i;
+}
+ \endcode
+
+ The template class D must provide the following methods.
+ \code
+ memory_size_type total_memory_in_bytes() const
+ \endcode
+ Returns a lower bound on the total size in bytes of the memory
+ occupied by the instance of D.
+ \code
+ bool is_top() const
+ \endcode
+ Returns <CODE>true</CODE> if and only if the instance of D is the top
+ element of the domain.
+ \code
+ bool is_bottom() const
+ \endcode
+ Returns <CODE>true</CODE> if and only if the instance of D is the
+ bottom element of the domain.
+ \code
+ bool definitely_entails(const D& y) const
+ \endcode
+ Returns <CODE>true</CODE> if the instance of D definitely entails
+ <CODE>y</CODE>. Returns <CODE>false</CODE> if the instance may not
+ entail <CODE>y</CODE> (i.e., if the instance does not entail
+ <CODE>y</CODE> or if entailment could not be decided).
+ \code
+ void upper_bound_assign(const D& y)
+ \endcode
+ Assigns to the instance of D an upper bound of the instance and
+ <CODE>y</CODE>.
+ \code
+ void meet_assign(const D& y)
+ \endcode
+ Assigns to the instance of D the meet of the instance and
+ <CODE>y</CODE>.
+ \code
+ bool OK() const
+ \endcode
+ Returns <CODE>true</CODE> if the instance of D is in a consistent
+ state, else returns <CODE>false</CODE>.
+
+ The following operators on the template class D must be defined.
+ \code
+ operator<<(std::ostream& s, const D& x)
+ \endcode
+ Writes a textual representation of the instance of D on
+ <CODE>s</CODE>.
+ \code
+ operator==(const D& x, const D& y)
+ \endcode
+ Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+ <CODE>y</CODE> are equivalent D's.
+ \code
+ operator!=(const D& x, const D& y)
+ \endcode
+ Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+ <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Default constructor: builds the bottom of the powerset constraint
+ system (i.e., the empty powerset).
+ */
+ Powerset();
+
+ //! Copy constructor.
+ Powerset(const Powerset& y);
+
+ /*! \brief
+ If \p d is not bottom, builds a powerset containing only \p d.
+ Builds the empty powerset otherwise.
+ */
+ explicit Powerset(const D& d);
+
+ //! Destructor.
+ ~Powerset();
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Powerset Object
+ //@{
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+ Returns <CODE>false</CODE> if \p *this may not entail \p y
+ (i.e., if \p *this does not entail \p y or if entailment could
+ not be decided).
+ */
+ bool definitely_entails(const Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the top
+ element of the powerset constraint system (i.e., it represents
+ the universe).
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the bottom
+ element of the powerset constraint system (i.e., it represents
+ the empty set).
+ */
+ bool is_bottom() const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Checks if all the invariants are satisfied.
+ // FIXME: document and perhaps use an enum instead of a bool.
+ bool OK(bool disallow_bottom = false) const;
+
+ //@} // Member Functions that Do Not Modify the Powerset Object
+
+protected:
+ //! A powerset is implemented as a sequence of elements.
+ /*!
+ The particular sequence employed must support efficient deletion
+ in any position and efficient back insertion.
+ */
+ typedef std::list<D> Sequence;
+
+ //! Alias for the low-level iterator on the disjuncts.
+ typedef typename Sequence::iterator Sequence_iterator;
+
+ //! Alias for the low-level %const_iterator on the disjuncts.
+ typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+ //! The sequence container holding powerset's elements.
+ Sequence sequence;
+
+ //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+ mutable bool reduced;
+
+public:
+ // Sequence manipulation types, accessors and modifiers
+ typedef typename Sequence::size_type size_type;
+ typedef typename Sequence::value_type value_type;
+
+ /*! \brief
+ Alias for a <EM>read-only</EM> bidirectional %iterator on the
+ disjuncts of a Powerset element.
+
+ By using this iterator type, the disjuncts cannot be overwritten,
+ but they can be removed using methods
+ <CODE>drop_disjunct(iterator position)</CODE> and
+ <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+ while still ensuring a correct handling of Omega-reduction.
+ */
+ typedef iterator_to_const<Sequence> iterator;
+
+ //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+ typedef const_iterator_to_const<Sequence> const_iterator;
+
+ //! The reverse iterator type built from Powerset::iterator.
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+
+ //! The reverse iterator type built from Powerset::const_iterator.
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+ //! \name Member Functions for the Direct Manipulation of Disjuncts
+ //@{
+
+ /*! \brief
+ Drops from the sequence of disjuncts in \p *this all the
+ non-maximal elements so that \p *this is non-redundant.
+
+ This method is declared <CODE>const</CODE> because, even though
+ Omega-reduction may change the syntactic representation of \p *this,
+ its semantics will be unchanged.
+ */
+ void omega_reduce() const;
+
+ //! Returns the number of disjuncts.
+ size_type size() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if there are no disjuncts in
+ \p *this.
+ */
+ bool empty() const;
+
+ /*! \brief
+ Returns an iterator pointing to the first disjunct, if \p *this
+ is not empty; otherwise, returns the past-the-end iterator.
+ */
+ iterator begin();
+
+ //! Returns the past-the-end iterator.
+ iterator end();
+
+ /*! \brief
+ Returns a const_iterator pointing to the first disjunct, if \p *this
+ is not empty; otherwise, returns the past-the-end const_iterator.
+ */
+ const_iterator begin() const;
+
+ //! Returns the past-the-end const_iterator.
+ const_iterator end() const;
+
+ /*! \brief
+ Returns a reverse_iterator pointing to the last disjunct, if \p *this
+ is not empty; otherwise, returns the before-the-start reverse_iterator.
+ */
+ reverse_iterator rbegin();
+
+ //! Returns the before-the-start reverse_iterator.
+ reverse_iterator rend();
+
+ /*! \brief
+ Returns a const_reverse_iterator pointing to the last disjunct,
+ if \p *this is not empty; otherwise, returns the before-the-start
+ const_reverse_iterator.
+ */
+ const_reverse_iterator rbegin() const;
+
+ //! Returns the before-the-start const_reverse_iterator.
+ const_reverse_iterator rend() const;
+
+ //! Adds to \p *this the disjunct \p d.
+ void add_disjunct(const D& d);
+
+ /*! \brief
+ Drops the disjunct in \p *this pointed to by \p position, returning
+ an iterator to the disjunct following \p position.
+ */
+ iterator drop_disjunct(iterator position);
+
+ //! Drops all the disjuncts from \p first to \p last (excluded).
+ void drop_disjuncts(iterator first, iterator last);
+
+ //! Drops all the disjuncts, making \p *this an empty powerset.
+ void clear();
+
+ //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+ //! \name Member Functions that May Modify the Powerset Object
+ //@{
+
+ //! The assignment operator.
+ Powerset& operator=(const Powerset& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Powerset& y);
+
+ //! Assigns to \p *this the least upper bound of \p *this and \p y.
+ void least_upper_bound_assign(const Powerset& y);
+
+ //! Assigns to \p *this an upper bound of \p *this and \p y.
+ /*!
+ The result will be the least upper bound of \p *this and \p y.
+ */
+ void upper_bound_assign(const Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this the least upper bound of \p *this and \p y
+ and returns \c true.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool upper_bound_assign_if_exact(const Powerset& y);
+
+ //! Assigns to \p *this the meet of \p *this and \p y.
+ void meet_assign(const Powerset& y);
+
+ /*! \brief
+ If \p *this is not empty (i.e., it is not the bottom element),
+ it is reduced to a singleton obtained by computing an upper-bound
+ of all the disjuncts.
+ */
+ void collapse();
+
+ //@} // Member Functions that May Modify the Powerset element
+
+protected:
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this does not contain
+ non-maximal elements.
+ */
+ bool is_omega_reduced() const;
+
+ /*! \brief Upon return, \p *this will contain at most \p
+ max_disjuncts elements; the set of disjuncts in positions greater
+ than or equal to \p max_disjuncts, will be replaced at that
+ position by their upper-bound.
+ */
+ void collapse(unsigned max_disjuncts);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d,
+ assuming \p d is not the bottom element and ensuring
+ partial Omega-reduction.
+
+ If \p d is not the bottom element and is not Omega-redundant with
+ respect to elements in positions between \p first and \p last, all
+ elements in these positions that would be made Omega-redundant by the
+ addition of \p d are dropped and \p d is added to the reduced
+ sequence.
+ If \p *this is reduced before an invocation of this method,
+ it will be reduced upon successful return from the method.
+ */
+ iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+ iterator first,
+ iterator last);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d, assuming \p d is not the
+ bottom element and preserving Omega-reduction.
+
+ If \p *this is reduced before an invocation of this method,
+ it will be reduced upon successful return from the method.
+ */
+ void add_non_bottom_disjunct_preserve_reduction(const D& d);
+
+ /*! \brief
+ Assigns to \p *this the result of applying \p op_assign pairwise
+ to the elements in \p *this and \p y.
+
+ The elements of the powerset result are obtained by applying
+ \p op_assign to each pair of elements whose components are drawn
+ from \p *this and \p y, respectively.
+ */
+ template <typename Binary_Operator_Assign>
+ void pairwise_apply_assign(const Powerset& y,
+ Binary_Operator_Assign op_assign);
+
+private:
+ /*! \brief
+ Does the hard work of checking whether \p *this contains non-maximal
+ elements and returns <CODE>true</CODE> if and only if it does not.
+ */
+ bool check_omega_reduced() const;
+
+ /*! \brief
+ Replaces the disjunct \p *sink by an upper bound of itself and
+ all the disjuncts following it.
+ */
+ void collapse(Sequence_iterator sink);
+};
+
+/* Automatically generated from PPL source file ../src/Powerset_inlines.hh line 1. */
+/* Powerset class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Powerset_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+ return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+ return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+ return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+ return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+ return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+ return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+ return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+ return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+ return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+ return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+ return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+ sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+ sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+ : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+ sequence = y.sequence;
+ reduced = y.reduced;
+ return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::m_swap(Powerset& y) {
+ using std::swap;
+ swap(sequence, y.sequence);
+ swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+ : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+ : sequence(), reduced(false) {
+ sequence.push_back(d);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+ // !d.is_bottom() is asserted by the callee.
+ add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+ sequence.push_back(d);
+ reduced = false;
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+ return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+ // Must perform omega-reduction for correctness.
+ omega_reduce();
+ const_iterator xi = begin();
+ const_iterator x_end = end();
+ return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+ // Must perform omega-reduction for correctness.
+ omega_reduce();
+ return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+ if (!empty())
+ collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+ pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+ least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+ least_upper_bound_assign(y);
+ return true;
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline void
+swap(Powerset<D>& x, Powerset<D>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 1. */
+/* Powerset class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 28. */
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 30. */
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+ PPL_ASSERT(sink != sequence.end());
+ D& d = *sink;
+ iterator x_sink = sink;
+ iterator next_x_sink = x_sink;
+ ++next_x_sink;
+ iterator x_end = end();
+ for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+ d.upper_bound_assign(*xi);
+ // Drop the surplus disjuncts.
+ drop_disjuncts(next_x_sink, x_end);
+
+ // Ensure omega-reduction.
+ for (iterator xi = begin(); xi != x_sink; )
+ if (xi->definitely_entails(d))
+ xi = drop_disjunct(xi);
+ else
+ ++xi;
+
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+ if (reduced)
+ return;
+
+ Powerset& x = const_cast<Powerset&>(*this);
+ // First remove all bottom elements.
+ for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+ if (xi->is_bottom())
+ xi = x.drop_disjunct(xi);
+ else
+ ++xi;
+ // Then remove non-maximal elements.
+ for (iterator xi = x.begin(); xi != x.end(); ) {
+ const D& xv = *xi;
+ bool dropping_xi = false;
+ for (iterator yi = x.begin(); yi != x.end(); )
+ if (xi == yi)
+ ++yi;
+ else {
+ const D& yv = *yi;
+ if (yv.definitely_entails(xv))
+ yi = x.drop_disjunct(yi);
+ else if (xv.definitely_entails(yv)) {
+ dropping_xi = true;
+ break;
+ }
+ else
+ ++yi;
+ }
+ if (dropping_xi)
+ xi = x.drop_disjunct(xi);
+ else
+ ++xi;
+ if (abandon_expensive_computations != 0 && xi != x.end()) {
+ // Hurry up!
+ x.collapse(xi.base);
+ break;
+ }
+ }
+ reduced = true;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+ PPL_ASSERT(max_disjuncts > 0);
+ // Omega-reduce before counting the number of disjuncts.
+ omega_reduce();
+ size_type n = size();
+ if (n > max_disjuncts) {
+ // Let `i' point to the last disjunct that will survive.
+ iterator i = begin();
+ std::advance(i, max_disjuncts-1);
+ // This disjunct will be assigned an upper-bound of itself and of
+ // all the disjuncts that follow.
+ collapse(i.base);
+ }
+ PPL_ASSERT_HEAVY(OK());
+ PPL_ASSERT(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+ for (const_iterator x_begin = begin(), x_end = end(),
+ xi = x_begin; xi != x_end; ++xi) {
+ const D& xv = *xi;
+ if (xv.is_bottom())
+ return false;
+ for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+ if (xi == yi)
+ continue;
+ const D& yv = *yi;
+ if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+ return false;
+ }
+ }
+ return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+ if (!reduced && check_omega_reduced())
+ reduced = true;
+ return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+ iterator first,
+ iterator last) {
+ PPL_ASSERT_HEAVY(!d.is_bottom());
+ for (iterator xi = first; xi != last; ) {
+ const D& xv = *xi;
+ if (d.definitely_entails(xv))
+ return first;
+ else if (xv.definitely_entails(d)) {
+ if (xi == first)
+ ++first;
+ xi = drop_disjunct(xi);
+ }
+ else
+ ++xi;
+ }
+ sequence.push_back(d);
+ PPL_ASSERT_HEAVY(OK());
+ return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+ const Powerset<D>& x = *this;
+ bool found = true;
+ for (const_iterator xi = x.begin(),
+ x_end = x.end(); found && xi != x_end; ++xi) {
+ found = false;
+ for (const_iterator yi = y.begin(),
+ y_end = y.end(); !found && yi != y_end; ++yi)
+ found = (*xi).definitely_entails(*yi);
+ }
+ return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+ x.omega_reduce();
+ y.omega_reduce();
+ if (x.size() != y.size())
+ return false;
+ // Take a copy of `y' and work with it.
+ Powerset<D> z = y;
+ for (typename Powerset<D>::const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi) {
+ typename Powerset<D>::iterator zi = z.begin();
+ typename Powerset<D>::iterator z_end = z.end();
+ zi = std::find(zi, z_end, *xi);
+ if (zi == z_end)
+ return false;
+ else
+ z.drop_disjunct(zi);
+ }
+ return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+ Binary_Operator_Assign op_assign) {
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ omega_reduce();
+ y.omega_reduce();
+ Sequence new_sequence;
+ for (const_iterator xi = begin(), x_end = end(),
+ y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+ for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+ D zi = *xi;
+ op_assign(zi, *yi);
+ if (!zi.is_bottom())
+ new_sequence.push_back(zi);
+ }
+ // Put the new sequence in place.
+ using std::swap;
+ swap(sequence, new_sequence);
+ reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ omega_reduce();
+ y.omega_reduce();
+ iterator old_begin = begin();
+ iterator old_end = end();
+ for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+ old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+ old_begin,
+ old_end);
+ PPL_ASSERT_HEAVY(OK());
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+ if (x.is_bottom())
+ s << "false";
+ else if (x.is_top())
+ s << "true";
+ else
+ for (typename Powerset<D>::const_iterator i = x.begin(),
+ x_end = x.end(); i != x_end; ) {
+ s << "{ " << *i << " }";
+ ++i;
+ if (i != x_end)
+ s << ", ";
+ }
+ return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+ memory_size_type bytes = 0;
+ for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+ bytes += xi->total_memory_in_bytes();
+ // We assume there is at least a forward and a backward link, and
+ // that the pointers implementing them are at least the size of
+ // pointers to `D'.
+ bytes += 2*sizeof(D*);
+ }
+ return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+ for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+ if (!xi->OK())
+ return false;
+ if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+ std::cerr << "Bottom element in powerset!"
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+ std::cerr << "Powerset claims to be reduced, but it is not!"
+ << std::endl;
+#endif
+ return false;
+ }
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 449. */
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 44. */
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL pointset domains.
+/*! \ingroup PPL_CXX_interface
+ \warning
+ At present, the supported instantiations for the
+ disjunct domain template \p PSET are the simple pointset domains:
+ <CODE>C_Polyhedron</CODE>,
+ <CODE>NNC_Polyhedron</CODE>,
+ <CODE>Grid</CODE>,
+ <CODE>Octagonal_Shape\<T\></CODE>,
+ <CODE>BD_Shape\<T\></CODE>,
+ <CODE>Box\<T\></CODE>.
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Pointset_Powerset
+ : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PSET> > {
+public:
+ typedef PSET element_type;
+
+private:
+ typedef Determinate<PSET> Det_PSET;
+ typedef Powerset<Det_PSET> Base;
+
+public:
+ //! Returns the maximum space dimension a Pointset_Powerset<PSET> can handle.
+ static dimension_type max_space_dimension();
+
+ //! \name Constructors
+ //@{
+
+ //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+ /*!
+ \param num_dimensions
+ The number of dimensions of the vector space enclosing the powerset;
+
+ \param kind
+ Specifies whether the universe or the empty powerset has to be built.
+ */
+ explicit
+ Pointset_Powerset(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy constructor.
+ /*!
+ The complexity argument is ignored.
+ */
+ Pointset_Powerset(const Pointset_Powerset& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+ in the source powerset is different from <CODE>PSET</CODE>.
+
+ \param y
+ The powerset to be used to build the new powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+ */
+ template <typename QH>
+ explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Creates a Pointset_Powerset from a product
+ This will be created as a single disjunct of type PSET that
+ approximates the product.
+ */
+ template <typename QH1, typename QH2, typename R>
+ explicit
+ Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ /*! \brief
+ Creates a Pointset_Powerset with a single disjunct approximating
+ the system of constraints \p cs.
+ */
+ explicit Pointset_Powerset(const Constraint_System& cs);
+
+ /*! \brief
+ Creates a Pointset_Powerset with a single disjunct approximating
+ the system of congruences \p cgs.
+ */
+ explicit Pointset_Powerset(const Congruence_System& cgs);
+
+
+ //! Builds a pointset_powerset out of a closed polyhedron.
+ /*!
+ Builds a powerset that is either empty (if the polyhedron is found
+ to be empty) or contains a single disjunct approximating the
+ polyhedron; this must only use algorithms that do not exceed the
+ specified complexity. The powerset inherits the space dimension
+ of the polyhedron.
+
+ \param ph
+ The closed polyhedron to be used to build the powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const C_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of an nnc polyhedron.
+ /*!
+ Builds a powerset that is either empty (if the polyhedron is found
+ to be empty) or contains a single disjunct approximating the
+ polyhedron; this must only use algorithms that do not exceed the
+ specified complexity. The powerset inherits the space dimension
+ of the polyhedron.
+
+ \param ph
+ The closed polyhedron to be used to build the powerset.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p ph exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+
+ //! Builds a pointset_powerset out of a grid.
+ /*!
+ If the grid is nonempty, builds a powerset containing a single
+ disjunct approximating the grid. Builds the empty powerset
+ otherwise. The powerset inherits the space dimension of the grid.
+
+ \param gr
+ The grid to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p gr exceeds the maximum
+ allowed space dimension.
+ */
+ explicit Pointset_Powerset(const Grid& gr,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of an octagonal shape.
+ /*!
+ If the octagonal shape is nonempty, builds a powerset
+ containing a single disjunct approximating the octagonal
+ shape. Builds the empty powerset otherwise. The powerset
+ inherits the space dimension of the octagonal shape.
+
+ \param os
+ The octagonal shape to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p os exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename T>
+ explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of a bd shape.
+ /*!
+ If the bd shape is nonempty, builds a powerset containing a
+ single disjunct approximating the bd shape. Builds the empty
+ powerset otherwise. The powerset inherits the space dimension
+ of the bd shape.
+
+ \param bds
+ The bd shape to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p bds exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename T>
+ explicit Pointset_Powerset(const BD_Shape<T>& bds,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //! Builds a pointset_powerset out of a box.
+ /*!
+ If the box is nonempty, builds a powerset containing a single
+ disjunct approximating the box. Builds the empty powerset
+ otherwise. The powerset inherits the space dimension of the box.
+
+ \param box
+ The box to be used to build the powerset.
+
+ \param complexity
+ This argument is ignored.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+ */
+ template <typename Interval>
+ explicit Pointset_Powerset(const Box<Interval>& box,
+ Complexity_Class complexity = ANY_COMPLEXITY);
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Pointset_Powerset
+ //@{
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type affine_dimension() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is
+ an empty powerset.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ is the top element of the powerset lattice.
+ */
+ bool is_universe() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the disjuncts
+ in \p *this are topologically closed.
+ */
+ bool is_topologically_closed() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all elements in \p *this
+ are bounded.
+ */
+ bool is_bounded() const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p x and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool is_disjoint_from(const Pointset_Powerset& y) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+ bool is_discrete() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p var is constrained in
+ \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+
+ \note
+ A variable is constrained if there exists a non-redundant disjunct
+ that is constraining the variable: this definition relies on the
+ powerset lattice structure and may be somewhat different from the
+ geometric intuition.
+ For instance, variable \f$x\f$ is constrained in the powerset
+ \f[
+ \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+ \f]
+ even though \f$\mathit{ps}\f$ is geometrically equal to the
+ whole vector space.
+ */
+ bool constrains(Variable var) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from above in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_above(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p expr is
+ bounded from below in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+ */
+ bool bounds_from_below(const Linear_Expression& expr) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value is computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+ and \p maximum are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from above in \p *this, in which case
+ the supremum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be maximized subject to \p *this;
+
+ \param sup_n
+ The numerator of the supremum value;
+
+ \param sup_d
+ The denominator of the supremum value;
+
+ \param maximum
+ <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+ \param g
+ When maximization succeeds, will be assigned the point or
+ closure point where \p expr reaches its supremum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from above,
+ <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+ and \p g are left untouched.
+ */
+ bool maximize(const Linear_Expression& expr,
+ Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value is computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+ and \p minimum are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is not empty
+ and \p expr is bounded from below in \p *this, in which case
+ the infimum value and a point where \p expr reaches it are computed.
+
+ \param expr
+ The linear expression to be minimized subject to \p *this;
+
+ \param inf_n
+ The numerator of the infimum value;
+
+ \param inf_d
+ The denominator of the infimum value;
+
+ \param minimum
+ <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+ \param g
+ When minimization succeeds, will be assigned a point or
+ closure point where \p expr reaches its infimum value.
+
+ \exception std::invalid_argument
+ Thrown if \p expr and \p *this are dimension-incompatible.
+
+ If \p *this is empty or \p expr is not bounded from below,
+ <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+ and \p g are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& g) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this geometrically
+ covers \p y, i.e., if any point (in some element) of \p y is also
+ a point (of some element) of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_covers(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is geometrically
+ equal to \p y, i.e., if (the elements of) \p *this and \p y
+ contain the same set of points.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_equals(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each disjunct
+ of \p y is contained in a disjunct of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool contains(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if each disjunct
+ of \p y is strictly contained in a disjunct of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool strictly_contains(const Pointset_Powerset& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains at least one integer point.
+ */
+ bool contains_integer_point() const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the constraint \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the generator \p g.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and generator \p g are dimension-incompatible.
+ */
+ Poly_Gen_Relation relation_with(const Generator& g) const;
+
+ /*! \brief
+ Returns the relations holding between the powerset \p *this
+ and the congruence \p c.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p c are dimension-incompatible.
+ */
+ Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+ /*! \brief
+ Returns a lower bound to the total size in bytes of the memory
+ occupied by \p *this.
+ */
+ memory_size_type total_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a lower bound to the size in bytes of the memory
+ managed by \p *this.
+ */
+ memory_size_type external_memory_in_bytes() const;
+
+ /*! \brief
+ Returns a 32-bit hash code for \p *this.
+
+ If \p x and \p y are such that <CODE>x == y</CODE>,
+ then <CODE>x.hash_code() == y.hash_code()</CODE>.
+ */
+ int32_t hash_code() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Pointset_Powerset
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
+ //@{
+
+ //! Adds to \p *this the disjunct \p ph.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p ph are dimension-incompatible.
+ */
+ void add_disjunct(const PSET& ph);
+
+ //! Intersects \p *this with constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Use the constraint \p c to refine \p *this.
+
+ \param c
+ The constraint to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void refine_with_constraint(const Constraint& c);
+
+ //! Intersects \p *this with the constraints in \p cs.
+ /*!
+ \param cs
+ The constraints to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Use the constraints in \p cs to refine \p *this.
+
+ \param cs
+ The constraints to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void refine_with_constraints(const Constraint_System& cs);
+
+ //! Intersects \p *this with congruence \p cg.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are topology-incompatible
+ or dimension-incompatible.
+ */
+ void add_congruence(const Congruence& cg);
+
+ /*! \brief
+ Use the congruence \p cg to refine \p *this.
+
+ \param cg
+ The congruence to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cg are dimension-incompatible.
+ */
+ void refine_with_congruence(const Congruence& cg);
+
+ //! Intersects \p *this with the congruences in \p cgs.
+ /*!
+ \param cgs
+ The congruences to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Use the congruences in \p cgs to refine \p *this.
+
+ \param cgs
+ The congruences to be used for refinement.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cgs are dimension-incompatible.
+ */
+ void refine_with_congruences(const Congruence_System& cgs);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to space dimension \p var, assigning the result to \p *this.
+
+ \param var
+ The space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p var is not a space dimension of \p *this.
+ */
+ void unconstrain(Variable var);
+
+ /*! \brief
+ Computes the \ref Cylindrification "cylindrification" of \p *this with
+ respect to the set of space dimensions \p vars,
+ assigning the result to \p *this.
+
+ \param vars
+ The set of space dimension that will be unconstrained.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void unconstrain(const Variables_Set& vars);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ /*! \brief
+ Possibly tightens \p *this by dropping some points with non-integer
+ coordinates for the space dimensions corresponding to \p vars.
+
+ \param vars
+ Points with non-integer coordinates for these variables/space-dimensions
+ can be discarded.
+
+ \param complexity
+ The maximal complexity of any algorithms used.
+
+ \note
+ Currently there is no optimality guarantee, not even if
+ \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+ */
+ void drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity
+ = ANY_COMPLEXITY);
+
+ //! Assigns to \p *this its topological closure.
+ void topological_closure_assign();
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ The result is obtained by intersecting each disjunct in \p *this
+ with each disjunct in \p y and collecting all these intersections.
+ */
+ void intersection_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this an (a smallest)
+ over-approximation as a powerset of the disjunct domain of the
+ set-theoretical difference of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void difference_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+ "meet-preserving simplification" of \p *this with respect to \p y.
+ If \c false is returned, then the intersection is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine image"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the
+ \ref Single_Update_Affine_Functions "affine preimage"
+ of \p *this under the function mapping variable \p var to the
+ affine expression specified by \p expr and \p denominator.
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param expr
+ The numerator of the affine expression;
+
+ \param denominator
+ The denominator of the affine expression (optional argument with
+ default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of
+ \p *this.
+ */
+ void affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param var
+ The left hand side variable of the generalized affine relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param expr
+ The numerator of the right hand side affine expression;
+
+ \param denominator
+ The denominator of the right hand side affine expression (optional
+ argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p expr and \p *this are
+ dimension-incompatible or if \p var is not a space dimension of \p *this
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void
+ generalized_affine_preimage(Variable var,
+ Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_image(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*! \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Generalized_Affine_Relations "generalized affine relation"
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+ or if \p *this is a C_Polyhedron and \p relsym is a strict
+ relation symbol.
+ */
+ void generalized_affine_preimage(const Linear_Expression& lhs,
+ Relation_Symbol relsym,
+ const Linear_Expression& rhs);
+
+ /*!
+ \brief
+ Assigns to \p *this the image of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*!
+ \brief
+ Assigns to \p *this the preimage of \p *this with respect to the
+ \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+ \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+ \param var
+ The variable updated by the affine relation;
+
+ \param lb_expr
+ The numerator of the lower bounding affine expression;
+
+ \param ub_expr
+ The numerator of the upper bounding affine expression;
+
+ \param denominator
+ The (common) denominator for the lower and upper bounding
+ affine expressions (optional argument with default value 1).
+
+ \exception std::invalid_argument
+ Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+ and \p *this are dimension-incompatible or if \p var is not a space
+ dimension of \p *this.
+ */
+ void bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one());
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+ The result is obtained by computing the pairwise
+ \ref Time_Elapse_Operator "time elapse" of each disjunct
+ in \p *this with each disjunct in \p y.
+ */
+ void time_elapse_assign(const Pointset_Powerset& y);
+
+ /*! \brief
+ \ref Wrapping_Operator "Wraps" the specified dimensions of the
+ vector space.
+
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param cs_p
+ Possibly null pointer to a constraint system whose variables
+ are contained in \p vars. If <CODE>*cs_p</CODE> depends on
+ variables not in \p vars, the behavior is undefined.
+ When non-null, the pointed-to constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+ \param complexity_threshold
+ A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+ higher values result in possibly improved precision.
+
+ \param wrap_individually
+ <CODE>true</CODE> if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+
+ \exception std::invalid_argument
+ Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+ \p vars, or if \p *this is dimension-incompatible \p vars or with
+ <CODE>*cs_p</CODE>.
+ */
+ void wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p = 0,
+ unsigned complexity_threshold = 16,
+ bool wrap_individually = true);
+
+ /*! \brief
+ Assign to \p *this the result of (recursively) merging together
+ the pairs of disjuncts whose upper-bound is the same as their
+ set-theoretical union.
+
+ On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+ in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+ */
+ void pairwise_reduce();
+
+ /*! \brief
+ Assigns to \p *this the result of applying the
+ \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+ to \p *this and \p y, using the widening function \p widen_fun
+ and the cardinality threshold \p max_disjuncts.
+
+ \param y
+ A powerset that <EM>must</EM> definitely entail \p *this;
+
+ \param widen_fun
+ The widening function to be used on polyhedra objects. It is obtained
+ from the corresponding widening method by using the helper function
+ Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+ <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+ <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+ \param max_disjuncts
+ The maximum number of disjuncts occurring in the powerset \p *this
+ <EM>before</EM> starting the computation. If this number is exceeded,
+ some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ For a description of the extrapolation operator,
+ see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+ */
+ template <typename Widening>
+ void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+ Widening widen_fun,
+ unsigned max_disjuncts);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref pps_certificate_widening "BHZ03-widening"
+ between \p *this and \p y, using the widening function \p widen_fun
+ certified by the convergence certificate \p Cert.
+
+ \param y
+ The finite powerset computed in the previous iteration step.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param widen_fun
+ The widening function to be used on disjuncts.
+ It is obtained from the corresponding widening method by using
+ the helper function widen_fun_ref. Legal values are, e.g.,
+ <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+ <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+
+ \warning
+ In order to obtain a proper widening operator, the template parameter
+ \p Cert should be a finite convergence certificate for the base-level
+ widening function \p widen_fun; otherwise, an extrapolation operator is
+ obtained.
+ For a description of the methods that should be provided
+ by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+ */
+ template <typename Cert, typename Widening>
+ void BHZ03_widening_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+ //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+ //! \name Member Functions that May Modify the Dimension of the Vector Space
+ //@{
+
+ /*! \brief
+ The assignment operator
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ Pointset_Powerset& operator=(const Pointset_Powerset& y);
+
+ /*! \brief
+ Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+ in the source powerset is different from <CODE>PSET</CODE>
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ template <typename QH>
+ Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Pointset_Powerset& y);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ and embeds each disjunct in \p *this in the new space.
+ */
+ void add_space_dimensions_and_embed(dimension_type m);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ without embedding the disjuncts in \p *this in the new space.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ //! Assigns to \p *this the concatenation of \p *this and \p y.
+ /*!
+ The result is obtained by computing the pairwise
+ \ref Concatenating_Polyhedra "concatenation" of each disjunct
+ in \p *this with each disjunct in \p y.
+ */
+ void concatenate_assign(const Pointset_Powerset& y);
+
+ //! Removes all the specified space dimensions.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be removed.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with one of the
+ Variable objects contained in \p vars.
+ */
+ void remove_space_dimensions(const Variables_Set& vars);
+
+ /*! \brief
+ Removes the higher space dimensions so that the resulting space
+ will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p new_dimensions is greater than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+ /*! \brief
+ Remaps the dimensions of the vector space according to
+ a partial function.
+
+ See also Polyhedron::map_space_dimensions.
+ */
+ template <typename Partial_Function>
+ void map_space_dimensions(const Partial_Function& pfunc);
+
+ //! Creates \p m copies of the space dimension corresponding to \p var.
+ /*!
+ \param var
+ The variable corresponding to the space dimension to be replicated;
+
+ \param m
+ The number of replicas to be created.
+
+ \exception std::invalid_argument
+ Thrown if \p var does not correspond to a dimension of the vector
+ space.
+
+ \exception std::length_error
+ Thrown if adding \p m new space dimensions would cause the vector
+ space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ then the \f$k\f$-th space dimension is
+ \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+ "expanded" to \p m new space dimensions
+ \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+ */
+ void expand_space_dimension(Variable var, dimension_type m);
+
+ //! Folds the space dimensions in \p vars into \p dest.
+ /*!
+ \param vars
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param dest
+ The variable corresponding to the space dimension that is the
+ destination of the folding operation.
+
+ \exception std::invalid_argument
+ Thrown if \p *this is dimension-incompatible with \p dest or with
+ one of the Variable objects contained in \p vars. Also
+ thrown if \p dest is contained in \p vars.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+ \p vars is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p dest is not a member
+ of \p vars, then the space dimensions corresponding to
+ variables in \p vars are
+ \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+ "folded" into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::value_type value_type;
+ typedef typename Base::iterator iterator;
+ typedef typename Base::const_iterator const_iterator;
+ typedef typename Base::reverse_iterator reverse_iterator;
+ typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+ PPL_OUTPUT_DECLARATIONS
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+ bool ascii_load(std::istream& s);
+
+private:
+ typedef typename Base::Sequence Sequence;
+ typedef typename Base::Sequence_iterator Sequence_iterator;
+ typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+ //! The number of dimensions of the enclosing vector space.
+ dimension_type space_dim;
+
+ /*! \brief
+ Assigns to \p dest a \ref Powerset_Meet_Preserving_Simplification
+ "powerset meet-preserving enlargement" of itself with respect to
+ \p *this. If \c false is returned, then the intersection is empty.
+
+ \note
+ It is assumed that \p *this and \p dest are topology-compatible
+ and dimension-compatible.
+ */
+ bool intersection_preserving_enlarge_element(PSET& dest) const;
+
+ /*! \brief
+ Assigns to \p *this the result of applying the BGP99 heuristics
+ to \p *this and \p y, using the widening function \p widen_fun.
+ */
+ template <typename Widening>
+ void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+ //! Records in \p cert_ms the certificates for this set of disjuncts.
+ template <typename Cert>
+ void collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if the current set of disjuncts
+ is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+ */
+ template <typename Cert>
+ bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+ typename Cert::Compare>&
+ y_cert_ms) const;
+
+ // FIXME: here it should be enough to befriend the template constructor
+ // template <typename QH>
+ // Pointset_Powerset(const Pointset_Powerset<QH>&),
+ // but, apparently, this cannot be done.
+ friend class Pointset_Powerset<NNC_Polyhedron>;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+void swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y);
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+ Let \p p and \p q be two polyhedra.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PSET, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+ such that
+ - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+ - <CODE>r.second</CODE> has the property that all its elements are
+ pairwise disjoint and disjoint from \p p;
+ - the set-theoretical union of <CODE>r.first</CODE> with all the
+ elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+ is the representation of a partition of \p q).
+
+ \if Include_Implementation_Details
+
+ See
+ <A HREF="http://bugseng.com/products/ppl/Documentation/bibliography#Srivastava93">
+ this paper</A> for more information about the implementation.
+ \endif
+*/
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+ \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+ const Pointset_Powerset<NNC_Polyhedron>& ps);
+
+
+/*! \brief
+ Partitions the grid \p q with respect to grid \p p if and only if
+ such a partition is finite.
+
+ \relates Parma_Polyhedra_Library::Pointset_Powerset
+ Let \p p and \p q be two grids.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PSET, Pointset_Powerset\<Grid\> \></CODE>
+ such that
+ - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+ - If there is a finite partition of \p q with respect to \p p
+ the Boolean <CODE>finite_partition</CODE> is set to true and
+ <CODE>r.second</CODE> has the property that all its elements are
+ pairwise disjoint and disjoint from \p p and the set-theoretical
+ union of <CODE>r.first</CODE> with all the elements of
+ <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+ is the representation of a partition of \p q).
+ - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+ and the singleton set that contains \p q is stored in
+ <CODE>r.second</CODE>r.
+*/
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the grids \p ps contains the grid \p g.
+
+ \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+ const Pointset_Powerset<Grid>& ps);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the objects in \p ps contains \p ph.
+
+ \relates Pointset_Powerset
+ \note
+ It is assumed that the template parameter PSET can be converted
+ without precision loss into an NNC_Polyhedron; otherwise,
+ an incorrect result might be obtained.
+*/
+template <typename PSET>
+bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+ Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+ Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+ Complexity_Class);
+
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+void
+Pointset_Powerset<Grid>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_inlines.hh line 1. */
+/* Pointset_Powerset class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_inlines.hh line 35. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::max_space_dimension() {
+ return PSET::max_space_dimension();
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Base(), space_dim(num_dimensions) {
+ Pointset_Powerset& x = *this;
+ if (kind == UNIVERSE)
+ x.sequence.push_back(Determinate<PSET>(PSET(num_dimensions, kind)));
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Pointset_Powerset& y,
+ Complexity_Class)
+ : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const C_Polyhedron& ph,
+ Complexity_Class complexity)
+ : Base(), space_dim(ph.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (ph.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const NNC_Polyhedron& ph,
+ Complexity_Class complexity)
+ : Base(), space_dim(ph.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (ph.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Grid& gr,
+ Complexity_Class)
+ : Base(), space_dim(gr.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!gr.is_empty()) {
+ x.sequence.push_back(Determinate<PSET>(PSET(gr)));
+ }
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+ Complexity_Class complexity)
+ : Base(), space_dim(prp.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (complexity == ANY_COMPLEXITY) {
+ if (prp.is_empty())
+ return;
+ }
+ else
+ x.reduced = false;
+ x.sequence.push_back(Determinate<PSET>(PSET(prp, complexity)));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename Interval>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Box<Interval>& box,
+ Complexity_Class)
+ : Base(), space_dim(box.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!box.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(box)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+ Complexity_Class)
+ : Base(), space_dim(os.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!os.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(os)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const BD_Shape<T>& bds,
+ Complexity_Class)
+ : Base(), space_dim(bds.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ if (!bds.is_empty())
+ x.sequence.push_back(Determinate<PSET>(PSET(bds)));
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Constraint_System& cs)
+ : Base(Determinate<PSET>(cs)), space_dim(cs.space_dimension()) {
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Congruence_System& cgs)
+ : Base(Determinate<PSET>(cgs)), space_dim(cgs.space_dimension()) {
+ PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.Base::operator=(y);
+ x.space_dim = y.space_dim;
+ return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::m_swap(Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.Base::m_swap(y);
+ using std::swap;
+ swap(x.space_dim, y.space_dim);
+}
+
+template <typename PSET>
+template <typename QH>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset<QH>& y) {
+ Pointset_Powerset& x = *this;
+ Pointset_Powerset<PSET> ps(y);
+ swap(x, ps);
+ return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::intersection_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y,
+ Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::intersection_assign)));
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::time_elapse_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y,
+ Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::time_elapse_assign)));
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_covers(const Pointset_Powerset& y) const {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+ const Pointset_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy);
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+ const Pointset_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::external_memory_in_bytes() const {
+ return Base::external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline int32_t
+Pointset_Powerset<PSET>::hash_code() const {
+ return hash_code_from_dimension(space_dimension());
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>
+::difference_assign(const Pointset_Powerset& y) {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+ Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+ nnc_this.difference_assign(nnc_y);
+ *this = nnc_this;
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps) {
+ // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+ const NNC_Polyhedron ph_nnc = NNC_Polyhedron(ph.constraints());
+ const Pointset_Powerset<NNC_Polyhedron> ps_nnc(ps);
+ return check_containment(ph_nnc, ps_nnc);
+}
+
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+ const Pointset_Powerset<C_Polyhedron>& ps) {
+ return check_containment(NNC_Polyhedron(ph),
+ Pointset_Powerset<NNC_Polyhedron>(ps));
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline void
+swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_templates.hh line 1. */
+/* Pointset_Powerset class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_templates.hh line 33. */
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_disjunct(const PSET& ph) {
+ Pointset_Powerset& x = *this;
+ if (x.space_dimension() != ph.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::Pointset_Powerset<PSET>::add_disjunct(ph):\n"
+ << "this->space_dimension() == " << x.space_dimension() << ", "
+ << "ph.space_dimension() == " << ph.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+ x.sequence.push_back(Determinate<PSET>(ph));
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<NNC_Polyhedron>
+ (NNC_Polyhedron(i->pointset(), complexity)));
+
+ // FIXME: If the domain elements can be represented _exactly_ as NNC
+ // polyhedra, then having x.reduced = y.reduced is correct. This is
+ // the case if the domains are both linear and convex which holds
+ // for all the currently supported instantiations except for
+ // Grids; for this reason the Grid specialization has a
+ // separate implementation. For any non-linear or non-convex
+ // domains (e.g., a domain of Intervals with restrictions or a
+ // domain of circles) that may be supported in the future, the
+ // assignment x.reduced = y.reduced will be a bug.
+ x.reduced = y.reduced;
+
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename QH>
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+ Complexity_Class complexity)
+ : Base(), space_dim(y.space_dimension()) {
+ Pointset_Powerset& x = *this;
+ for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<PSET>(PSET(i->pointset(), complexity)));
+ // Note: this might be non-reduced even when `y' is known to be
+ // omega-reduced, because the constructor of PSET may have made
+ // different QH elements to become comparable.
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::concatenate_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ x.omega_reduce();
+ y.omega_reduce();
+ Pointset_Powerset<PSET> new_x(x.space_dim + y.space_dim, EMPTY);
+ for (const_iterator xi = x.begin(), x_end = x.end(),
+ y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+ for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+ Det_PSET zi = *xi;
+ zi.concatenate_assign(*yi);
+ PPL_ASSERT_HEAVY(!zi.is_bottom());
+ new_x.sequence.push_back(zi);
+ }
+ ++xi;
+ if ((abandon_expensive_computations != 0)
+ && (xi != x_end) && (y_begin != y_end)) {
+ // Hurry up!
+ PSET x_ph = xi->pointset();
+ for (++xi; xi != x_end; ++xi)
+ x_ph.upper_bound_assign(xi->pointset());
+ const_iterator yi = y_begin;
+ PSET y_ph = yi->pointset();
+ for (++yi; yi != y_end; ++yi)
+ y_ph.upper_bound_assign(yi->pointset());
+ x_ph.concatenate_assign(y_ph);
+ swap(x, new_x);
+ x.add_disjunct(x_ph);
+ PPL_ASSERT_HEAVY(x.OK());
+ return;
+ }
+ }
+ swap(x, new_x);
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraint(const Constraint& c) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_constraint(c);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraint(const Constraint& c) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_constraint(c);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraints(const Constraint_System& cs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_constraints(cs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraints(const Constraint_System& cs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_constraints(cs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruence(const Congruence& cg) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_congruence(cg);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruence(const Congruence& cg) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_congruence(cg);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruences(const Congruence_System& cgs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_congruences(cgs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruences(const Congruence_System& cgs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().refine_with_congruences(cgs);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variable var) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().unconstrain(var);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variables_Set& vars) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().unconstrain(vars);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_embed(dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_space_dimensions_and_embed(m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_project(dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().add_space_dimensions_and_project(m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::remove_space_dimensions(const Variables_Set& vars) {
+ Pointset_Powerset& x = *this;
+ Variables_Set::size_type num_removed = vars.size();
+ if (num_removed > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().remove_space_dimensions(vars);
+ x.reduced = false;
+ }
+ x.space_dim -= num_removed;
+ PPL_ASSERT_HEAVY(x.OK());
+ }
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+ Pointset_Powerset& x = *this;
+ if (new_dimension < x.space_dim) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().remove_higher_space_dimensions(new_dimension);
+ x.reduced = false;
+ }
+ x.space_dim = new_dimension;
+ PPL_ASSERT_HEAVY(x.OK());
+ }
+}
+
+template <typename PSET>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PSET>::map_space_dimensions(const Partial_Function& pfunc) {
+ Pointset_Powerset& x = *this;
+ if (x.is_bottom()) {
+ dimension_type n = 0;
+ for (dimension_type i = x.space_dim; i-- > 0; ) {
+ dimension_type new_i;
+ if (pfunc.maps(i, new_i))
+ ++n;
+ }
+ x.space_dim = n;
+ }
+ else {
+ Sequence_iterator s_begin = x.sequence.begin();
+ for (Sequence_iterator si = s_begin,
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().map_space_dimensions(pfunc);
+ x.space_dim = s_begin->pointset().space_dimension();
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::expand_space_dimension(Variable var,
+ dimension_type m) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().expand_space_dimension(var, m);
+ x.space_dim += m;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::fold_space_dimensions(const Variables_Set& vars,
+ Variable dest) {
+ Pointset_Powerset& x = *this;
+ Variables_Set::size_type num_folded = vars.size();
+ if (num_folded > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().fold_space_dimensions(vars, dest);
+ }
+ x.space_dim -= num_folded;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_image(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().affine_image(var, expr, denominator);
+ // Note that the underlying domain can apply conservative approximation:
+ // that is why it would not be correct to make the loss of reduction
+ // conditional on `var' and `expr'.
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_preimage(Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().affine_preimage(var, expr, denominator);
+ // Note that the underlying domain can apply conservative approximation:
+ // that is why it would not be correct to make the loss of reduction
+ // conditional on `var' and `expr'.
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_image(lhs, relsym, rhs);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+ const Relation_Symbol relsym,
+ const Linear_Expression& rhs) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_preimage(lhs, relsym, rhs);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_image(var, relsym, expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(Variable var,
+ const Relation_Symbol relsym,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference
+ denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().generalized_affine_preimage(var, relsym, expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_image(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_preimage(Variable var,
+ const Linear_Expression& lb_expr,
+ const Linear_Expression& ub_expr,
+ Coefficient_traits::const_reference denominator) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->pointset().bounded_affine_preimage(var, lb_expr, ub_expr,
+ denominator);
+ x.reduced = false;
+ }
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+dimension_type
+Pointset_Powerset<PSET>::affine_dimension() const {
+ // The affine dimension of the powerset is the affine dimension of
+ // the smallest vector space in which it can be embedded.
+ const Pointset_Powerset& x = *this;
+ C_Polyhedron x_ph(space_dim, EMPTY);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ PSET pi(si->pointset());
+ if (!pi.is_empty()) {
+ C_Polyhedron phi(space_dim);
+ const Constraint_System& cs = pi.minimized_constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality())
+ phi.add_constraint(c);
+ }
+ x_ph.poly_hull_assign(phi);
+ }
+ }
+
+ return x_ph.affine_dimension();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_universe() const {
+ const Pointset_Powerset& x = *this;
+ // Exploit omega-reduction, if already computed.
+ if (x.is_omega_reduced())
+ return x.size() == 1 && x.begin()->pointset().is_universe();
+
+ // A powerset is universe iff one of its disjuncts is.
+ for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+ if (x_i->pointset().is_universe()) {
+ // Speculative omega-reduction, if it is worth.
+ if (x.size() > 1) {
+ Pointset_Powerset<PSET> universe(x.space_dimension(), UNIVERSE);
+ Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+ swap(xx, universe);
+ }
+ return true;
+ }
+ return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_empty() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_empty())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_discrete() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_discrete())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_topologically_closed() const {
+ const Pointset_Powerset& x = *this;
+ // The powerset must be omega-reduced before checking
+ // topological closure.
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_topologically_closed())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_bounded() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().is_bounded())
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::constrains(Variable var) const {
+ const Pointset_Powerset& x = *this;
+ // `var' should be one of the dimensions of the powerset.
+ const dimension_type var_space_dim = var.space_dimension();
+ if (x.space_dimension() < var_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Pointset_Powerset<PSET>::constrains(v):\n"
+ << "this->space_dimension() == " << x.space_dimension() << ", "
+ << "v.space_dimension() == " << var_space_dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+ // omega_reduction needed, since a redundant disjunct may constrain var.
+ x.omega_reduce();
+ // An empty powerset constrains all variables.
+ if (x.is_empty())
+ return true;
+ for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+ if (x_i->pointset().constrains(var))
+ return true;
+ return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_disjoint_from(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ x_s_end = x.sequence.end(); si != x_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ for (Sequence_const_iterator sj = y.sequence.begin(),
+ y_s_end = y.sequence.end(); sj != y_s_end; ++sj) {
+ const PSET& pj = sj->pointset();
+ if (!pi.is_disjoint_from(pj))
+ return false;
+ }
+ }
+ return true;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(const Variables_Set& vars,
+ Complexity_Class complexity) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().drop_some_non_integer_points(vars, complexity);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().drop_some_non_integer_points(complexity);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::topological_closure_assign() {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().topological_closure_assign();
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::intersection_preserving_enlarge_element(PSET& dest) const {
+ // FIXME: this is just an executable specification.
+ const Pointset_Powerset& context = *this;
+ PPL_ASSERT(context.space_dimension() == dest.space_dimension());
+ bool nonempty_intersection = false;
+ // TODO: maybe use a *sorted* constraint system?
+ PSET enlarged(context.space_dimension(), UNIVERSE);
+ for (Sequence_const_iterator si = context.sequence.begin(),
+ s_end = context.sequence.end(); si != s_end; ++si) {
+ PSET context_i(si->pointset());
+ context_i.intersection_assign(enlarged);
+ PSET enlarged_i(dest);
+ if (enlarged_i.simplify_using_context_assign(context_i))
+ nonempty_intersection = true;
+ // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+ enlarged.intersection_assign(enlarged_i);
+ }
+ swap(dest, enlarged);
+ return nonempty_intersection;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+ Pointset_Powerset& x = *this;
+
+ // Omega reduction is required.
+ // TODO: check whether it would be more efficient to Omega-reduce x
+ // during the simplification process: when examining *si, we check
+ // if it has been made redundant by any of the elements preceding it
+ // (which have been already simplified).
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+ y.omega_reduce();
+ if (y.is_empty()) {
+ x = y;
+ return false;
+ }
+
+ if (y.size() == 1) {
+ // More efficient, special handling of the singleton context case.
+ const PSET& y_i = y.sequence.begin()->pointset();
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ) {
+ PSET& x_i = si->pointset();
+ if (x_i.simplify_using_context_assign(y_i))
+ ++si;
+ else
+ // Intersection is empty: drop the disjunct.
+ si = x.sequence.erase(si);
+ }
+ }
+ else {
+ // The context is not a singleton.
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ) {
+ if (y.intersection_preserving_enlarge_element(si->pointset()))
+ ++si;
+ else
+ // Intersection with `*si' is empty: drop the disjunct.
+ si = x.sequence.erase(si);
+ }
+ }
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+ return !x.sequence.empty();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains(const Pointset_Powerset& y) const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = y.sequence.begin(),
+ y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ bool pi_is_contained = false;
+ for (Sequence_const_iterator sj = x.sequence.begin(),
+ x_s_end = x.sequence.end();
+ (sj != x_s_end && !pi_is_contained);
+ ++sj) {
+ const PSET& pj = sj->pointset();
+ if (pj.contains(pi))
+ pi_is_contained = true;
+ }
+ if (!pi_is_contained)
+ return false;
+ }
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::strictly_contains(const Pointset_Powerset& y) const {
+ /* omega reduction ensures that a disjunct of y cannot be strictly
+ contained in one disjunct and also contained but not strictly
+ contained in another disjunct of *this */
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = y.sequence.begin(),
+ y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+ const PSET& pi = si->pointset();
+ bool pi_is_strictly_contained = false;
+ for (Sequence_const_iterator sj = x.sequence.begin(),
+ x_s_end = x.sequence.end();
+ (sj != x_s_end && !pi_is_strictly_contained); ++sj) {
+ const PSET& pj = sj->pointset();
+ if (pj.strictly_contains(pi))
+ pi_is_strictly_contained = true;
+ }
+ if (!pi_is_strictly_contained)
+ return false;
+ }
+ return true;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
+ const Pointset_Powerset& x = *this;
+
+ /* *this is included in cg if every disjunct is included in cg */
+ bool is_included = true;
+ /* *this is disjoint with cg if every disjunct is disjoint with cg */
+ bool is_disjoint = true;
+ /* *this strictly_intersects with cg if some disjunct strictly
+ intersects with cg */
+ bool is_strictly_intersecting = false;
+ /* *this saturates cg if some disjunct saturates cg and
+ every disjunct is either disjoint from cg or saturates cg */
+ bool saturates_once = false;
+ bool may_saturate = true;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Con_Relation relation_i = si->pointset().relation_with(cg);
+ if (!relation_i.implies(Poly_Con_Relation::is_included()))
+ is_included = false;
+ if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ is_disjoint = false;
+ if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+ is_strictly_intersecting = true;
+ if (relation_i.implies(Poly_Con_Relation::saturates()))
+ saturates_once = true;
+ else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ may_saturate = false;
+ }
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+ if (is_included)
+ result = result && Poly_Con_Relation::is_included();
+ if (is_disjoint)
+ result = result && Poly_Con_Relation::is_disjoint();
+ if (is_strictly_intersecting)
+ result = result && Poly_Con_Relation::strictly_intersects();
+ if (saturates_once && may_saturate)
+ result = result && Poly_Con_Relation::saturates();
+
+ return result;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+ const Pointset_Powerset& x = *this;
+
+ /* *this is included in c if every disjunct is included in c */
+ bool is_included = true;
+ /* *this is disjoint with c if every disjunct is disjoint with c */
+ bool is_disjoint = true;
+ /* *this strictly_intersects with c if some disjunct strictly
+ intersects with c */
+ bool is_strictly_intersecting = false;
+ /* *this saturates c if some disjunct saturates c and
+ every disjunct is either disjoint from c or saturates c */
+ bool saturates_once = false;
+ bool may_saturate = true;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Con_Relation relation_i = si->pointset().relation_with(c);
+ if (!relation_i.implies(Poly_Con_Relation::is_included()))
+ is_included = false;
+ if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ is_disjoint = false;
+ if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+ is_strictly_intersecting = true;
+ if (relation_i.implies(Poly_Con_Relation::saturates()))
+ saturates_once = true;
+ else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+ may_saturate = false;
+ }
+
+ Poly_Con_Relation result = Poly_Con_Relation::nothing();
+ if (is_included)
+ result = result && Poly_Con_Relation::is_included();
+ if (is_disjoint)
+ result = result && Poly_Con_Relation::is_disjoint();
+ if (is_strictly_intersecting)
+ result = result && Poly_Con_Relation::strictly_intersects();
+ if (saturates_once && may_saturate)
+ result = result && Poly_Con_Relation::saturates();
+
+ return result;
+}
+
+template <typename PSET>
+Poly_Gen_Relation
+Pointset_Powerset<PSET>::relation_with(const Generator& g) const {
+ const Pointset_Powerset& x = *this;
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ Poly_Gen_Relation relation_i = si->pointset().relation_with(g);
+ if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+ return Poly_Gen_Relation::subsumes();
+ }
+
+ return Poly_Gen_Relation::nothing();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_above(const Linear_Expression& expr) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().bounds_from_above(expr))
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_below(const Linear_Expression& expr) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (!si->pointset().bounds_from_below(expr))
+ return false;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+ best_sup_n = 0;
+ best_sup_d = 1;
+ bool best_max = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+ iter_sup_n = 0;
+ iter_sup_d = 1;
+ bool iter_max = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().maximize(expr, iter_sup_n, iter_sup_d, iter_max))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ }
+ else {
+ tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+ if (tmp < 0) {
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ }
+ else if (tmp == 0)
+ best_max = (best_max || iter_max);
+ }
+ }
+ sup_n = best_sup_n;
+ sup_d = best_sup_d;
+ maximum = best_max;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+ Coefficient& sup_n,
+ Coefficient& sup_d,
+ bool& maximum,
+ Generator& g) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+ best_sup_n = 0;
+ best_sup_d = 1;
+ bool best_max = false;
+ Generator best_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+ iter_sup_n = 0;
+ iter_sup_d = 1;
+ bool iter_max = false;
+ Generator iter_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().maximize(expr,
+ iter_sup_n, iter_sup_d, iter_max, iter_g))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ best_g = iter_g;
+ }
+ else {
+ tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+ if (tmp < 0) {
+ best_sup_n = iter_sup_n;
+ best_sup_d = iter_sup_d;
+ best_max = iter_max;
+ best_g = iter_g;
+ }
+ else if (tmp == 0) {
+ best_max = (best_max || iter_max);
+ best_g = iter_g;
+ }
+ }
+ }
+ sup_n = best_sup_n;
+ sup_d = best_sup_d;
+ maximum = best_max;
+ g = best_g;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+ best_inf_n = 0;
+ best_inf_d = 1;
+ bool best_min = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+ iter_inf_n = 0;
+ iter_inf_d = 1;
+ bool iter_min = false;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().minimize(expr, iter_inf_n, iter_inf_d, iter_min))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ }
+ else {
+ tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+ if (tmp > 0) {
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ }
+ else if (tmp == 0)
+ best_min = (best_min || iter_min);
+ }
+ }
+ inf_n = best_inf_n;
+ inf_d = best_inf_d;
+ minimum = best_min;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+ Coefficient& inf_n,
+ Coefficient& inf_d,
+ bool& minimum,
+ Generator& g) const {
+ const Pointset_Powerset& x = *this;
+ x.omega_reduce();
+ if (x.is_empty())
+ return false;
+
+ bool first = true;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+ best_inf_n = 0;
+ best_inf_d = 1;
+ bool best_min = false;
+ Generator best_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+ iter_inf_n = 0;
+ iter_inf_d = 1;
+ bool iter_min = false;
+ Generator iter_g = point();
+
+ PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ if (!si->pointset().minimize(expr,
+ iter_inf_n, iter_inf_d, iter_min, iter_g))
+ return false;
+ else
+ if (first) {
+ first = false;
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ best_g = iter_g;
+ }
+ else {
+ tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+ if (tmp > 0) {
+ best_inf_n = iter_inf_n;
+ best_inf_d = iter_inf_d;
+ best_min = iter_min;
+ best_g = iter_g;
+ }
+ else if (tmp == 0) {
+ best_min = (best_min || iter_min);
+ best_g = iter_g;
+ }
+ }
+ }
+ inf_n = best_inf_n;
+ inf_d = best_inf_d;
+ minimum = best_min;
+ g = best_g;
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains_integer_point() const {
+ const Pointset_Powerset& x = *this;
+ for (Sequence_const_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ if (si->pointset().contains_integer_point())
+ return true;
+ return false;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::wrap_assign(const Variables_Set& vars,
+ Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Representation r,
+ Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ unsigned complexity_threshold,
+ bool wrap_individually) {
+ Pointset_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->pointset().wrap_assign(vars, w, r, o, cs_p,
+ complexity_threshold, wrap_individually);
+ x.reduced = false;
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::pairwise_reduce() {
+ Pointset_Powerset& x = *this;
+ // It is wise to omega-reduce before pairwise-reducing.
+ x.omega_reduce();
+
+ size_type n = x.size();
+ size_type deleted;
+ do {
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ std::deque<bool> marked(n, false);
+ deleted = 0;
+ Sequence_iterator s_begin = x.sequence.begin();
+ Sequence_iterator s_end = x.sequence.end();
+ unsigned si_index = 0;
+ for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+ if (marked[si_index])
+ continue;
+ PSET& pi = si->pointset();
+ Sequence_const_iterator sj = si;
+ unsigned sj_index = si_index;
+ for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+ if (marked[sj_index])
+ continue;
+ const PSET& pj = sj->pointset();
+ if (pi.upper_bound_assign_if_exact(pj)) {
+ marked[si_index] = true;
+ marked[sj_index] = true;
+ new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+ ++deleted;
+ goto next;
+ }
+ }
+ next:
+ ;
+ }
+ iterator new_x_begin = new_x.begin();
+ iterator new_x_end = new_x.end();
+ unsigned xi_index = 0;
+ for (const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+ if (!marked[xi_index])
+ new_x_begin
+ = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+ new_x_begin,
+ new_x_end);
+ using std::swap;
+ swap(x.sequence, new_x.sequence);
+ n -= deleted;
+ } while (deleted > 0);
+ PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ size_type n = x.size();
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ std::deque<bool> marked(n, false);
+ const_iterator x_begin = x.begin();
+ const_iterator x_end = x.end();
+ unsigned i_index = 0;
+ for (const_iterator i = x_begin,
+ y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+ for (const_iterator j = y_begin; j != y_end; ++j) {
+ const PSET& pi = i->pointset();
+ const PSET& pj = j->pointset();
+ if (pi.contains(pj)) {
+ PSET pi_copy = pi;
+ widen_fun(pi_copy, pj);
+ new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+ marked[i_index] = true;
+ }
+ }
+ iterator new_x_begin = new_x.begin();
+ iterator new_x_end = new_x.end();
+ i_index = 0;
+ for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+ if (!marked[i_index])
+ new_x_begin
+ = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+ new_x_begin,
+ new_x_end);
+ using std::swap;
+ swap(x.sequence, new_x.sequence);
+ PPL_ASSERT_HEAVY(x.OK());
+ PPL_ASSERT(x.is_omega_reduced());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+ Widening widen_fun,
+ unsigned max_disjuncts) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ x.pairwise_reduce();
+ if (max_disjuncts != 0)
+ x.collapse(max_disjuncts);
+ x.BGP99_heuristics_assign(y, widen_fun);
+}
+
+template <typename PSET>
+template <typename Cert>
+void
+Pointset_Powerset<PSET>::
+collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const {
+ const Pointset_Powerset& x = *this;
+ PPL_ASSERT(x.is_omega_reduced());
+ PPL_ASSERT(cert_ms.size() == 0);
+ for (const_iterator i = x.begin(), end = x.end(); i != end; ++i) {
+ Cert ph_cert(i->pointset());
+ ++cert_ms[ph_cert];
+ }
+}
+
+template <typename PSET>
+template <typename Cert>
+bool
+Pointset_Powerset<PSET>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+ typename Cert::Compare>& y_cert_ms) const {
+ typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+ Cert_Multiset x_cert_ms;
+ collect_certificates(x_cert_ms);
+ typename Cert_Multiset::const_iterator xi = x_cert_ms.begin();
+ typename Cert_Multiset::const_iterator x_cert_ms_end = x_cert_ms.end();
+ typename Cert_Multiset::const_iterator yi = y_cert_ms.begin();
+ typename Cert_Multiset::const_iterator y_cert_ms_end = y_cert_ms.end();
+ while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+ const Cert& xi_cert = xi->first;
+ const Cert& yi_cert = yi->first;
+ switch (xi_cert.compare(yi_cert)) {
+ case 0:
+ // xi_cert == yi_cert: check the number of multiset occurrences.
+ {
+ const size_type& xi_count = xi->second;
+ const size_type& yi_count = yi->second;
+ if (xi_count == yi_count) {
+ // Same number of occurrences: compare the next pair.
+ ++xi;
+ ++yi;
+ }
+ else
+ // Different number of occurrences: can decide ordering.
+ return xi_count < yi_count;
+ break;
+ }
+ case 1:
+ // xi_cert > yi_cert: it is not stabilizing.
+ return false;
+
+ case -1:
+ // xi_cert < yi_cert: it is stabilizing.
+ return true;
+ }
+ }
+ // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+ // Stabilization is achieved if `y_cert_ms' still has other elements.
+ return yi != y_cert_ms_end;
+}
+
+template <typename PSET>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PSET>::BHZ03_widening_assign(const Pointset_Powerset& y,
+ Widening widen_fun) {
+ // `x' is the current iteration value.
+ Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Pointset_Powerset<PSET> x_copy = x;
+ const Pointset_Powerset<PSET> y_copy = y;
+ PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ // First widening technique: do nothing.
+
+ // If `y' is the empty collection, do nothing.
+ PPL_ASSERT(x.size() > 0);
+ if (y.size() == 0)
+ return;
+
+ // Compute the poly-hull of `x'.
+ PSET x_hull(x.space_dim, EMPTY);
+ for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+ x_hull.upper_bound_assign(i->pointset());
+
+ // Compute the poly-hull of `y'.
+ PSET y_hull(y.space_dim, EMPTY);
+ for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+ y_hull.upper_bound_assign(i->pointset());
+ // Compute the certificate for `y_hull'.
+ const Cert y_hull_cert(y_hull);
+
+ // If the hull is stabilizing, do nothing.
+ int hull_stabilization = y_hull_cert.compare(x_hull);
+ if (hull_stabilization == 1)
+ return;
+
+ // Multiset ordering is only useful when `y' is not a singleton.
+ const bool y_is_not_a_singleton = y.size() > 1;
+
+ // The multiset certificate for `y':
+ // we want to be lazy about its computation.
+ typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+ Cert_Multiset y_cert_ms;
+ bool y_cert_ms_computed = false;
+
+ if (hull_stabilization == 0 && y_is_not_a_singleton) {
+ // Collect the multiset certificate for `y'.
+ y.collect_certificates(y_cert_ms);
+ y_cert_ms_computed = true;
+ // If multiset ordering is stabilizing, do nothing.
+ if (x.is_cert_multiset_stabilizing(y_cert_ms))
+ return;
+ }
+
+ // Second widening technique: try the BGP99 powerset heuristics.
+ Pointset_Powerset<PSET> bgp99_heuristics = x;
+ bgp99_heuristics.BGP99_heuristics_assign(y, widen_fun);
+
+ // Compute the poly-hull of `bgp99_heuristics'.
+ PSET bgp99_heuristics_hull(x.space_dim, EMPTY);
+ for (const_iterator i = bgp99_heuristics.begin(),
+ b_h_end = bgp99_heuristics.end(); i != b_h_end; ++i)
+ bgp99_heuristics_hull.upper_bound_assign(i->pointset());
+
+ // Check for stabilization and, if successful,
+ // commit to the result of the extrapolation.
+ hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+ if (hull_stabilization == 1) {
+ // The poly-hull is stabilizing.
+ swap(x, bgp99_heuristics);
+ return;
+ }
+ else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+ // If not already done, compute multiset certificate for `y'.
+ if (!y_cert_ms_computed) {
+ y.collect_certificates(y_cert_ms);
+ y_cert_ms_computed = true;
+ }
+ if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ swap(x, bgp99_heuristics);
+ return;
+ }
+ // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+ // Note that pairwise-reduction does not affect the computation
+ // of the poly-hulls, so that we only have to check the multiset
+ // certificate relation.
+ Pointset_Powerset<PSET> reduced_bgp99_heuristics(bgp99_heuristics);
+ reduced_bgp99_heuristics.pairwise_reduce();
+ if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ swap(x, reduced_bgp99_heuristics);
+ return;
+ }
+ }
+
+ // Fourth widening technique: this is applicable only when
+ // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+ if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+ // Compute (y_hull \widen bgp99_heuristics_hull).
+ PSET ph = bgp99_heuristics_hull;
+ widen_fun(ph, y_hull);
+ // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+ ph.difference_assign(bgp99_heuristics_hull);
+ x.add_disjunct(ph);
+ return;
+ }
+
+ // Fall back to the computation of the poly-hull.
+ Pointset_Powerset<PSET> x_hull_singleton(x.space_dim, EMPTY);
+ x_hull_singleton.add_disjunct(x_hull);
+ swap(x, x_hull_singleton);
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::ascii_dump(std::ostream& s) const {
+ const Pointset_Powerset& x = *this;
+ s << "size " << x.size()
+ << "\nspace_dim " << x.space_dim
+ << "\n";
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+ xi->pointset().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PSET, Pointset_Powerset<PSET>)
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::ascii_load(std::istream& s) {
+ Pointset_Powerset& x = *this;
+ std::string str;
+
+ if (!(s >> str) || str != "size")
+ return false;
+
+ size_type sz;
+
+ if (!(s >> sz))
+ return false;
+
+ if (!(s >> str) || str != "space_dim")
+ return false;
+
+ if (!(s >> x.space_dim))
+ return false;
+
+ Pointset_Powerset new_x(x.space_dim, EMPTY);
+ while (sz-- > 0) {
+ PSET ph;
+ if (!ph.ascii_load(s))
+ return false;
+ new_x.add_disjunct(ph);
+ }
+ swap(x, new_x);
+
+ // Check invariants.
+ PPL_ASSERT_HEAVY(x.OK());
+ return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::OK() const {
+ const Pointset_Powerset& x = *this;
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+ const PSET& pi = xi->pointset();
+ if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+ std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+ << " in an element of the sequence,\nshould be "
+ << x.space_dim << "."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+ return x.Base::OK();
+}
+
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p pset according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+ On exit, the intersection of \p pset and constraint \p c is stored
+ in \p pset, whereas the intersection of \p pset with the negation of \p c
+ is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+void
+linear_partition_aux(const Constraint& c,
+ PSET& pset,
+ Pointset_Powerset<NNC_Polyhedron>& r) {
+ const Linear_Expression le(c.expression());
+ const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+ NNC_Polyhedron nnc_ph_pset(pset);
+ nnc_ph_pset.add_constraint(neg_c);
+ if (!nnc_ph_pset.is_empty())
+ r.add_disjunct(nnc_ph_pset);
+ pset.add_constraint(c);
+}
+
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q) {
+ using Implementation::Pointset_Powersets::linear_partition_aux;
+
+ Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+ PSET pset = q;
+ const Constraint_System& p_constraints = p.constraints();
+ for (Constraint_System::const_iterator i = p_constraints.begin(),
+ p_constraints_end = p_constraints.end();
+ i != p_constraints_end;
+ ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality()) {
+ const Linear_Expression le(c.expression());
+ linear_partition_aux(le <= 0, pset, r);
+ linear_partition_aux(le >= 0, pset, r);
+ }
+ else
+ linear_partition_aux(c, pset, r);
+ }
+ return std::make_pair(pset, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 1448. */
+
+/* Automatically generated from PPL source file ../src/algorithms.hh line 29. */
+#include <utility>
+/* Automatically generated from PPL source file ../src/algorithms.hh line 31. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ If the poly-hull of \p p and \p q is exact it is assigned
+ to \p p and <CODE>true</CODE> is returned,
+ otherwise <CODE>false</CODE> is returned.
+
+ \relates Polyhedron
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+ PH poly_hull = p;
+ NNC_Polyhedron nnc_p(p);
+ poly_hull.poly_hull_assign(q);
+ std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(q, poly_hull);
+ const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+ typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+ // The polyhedral hull is exact if and only if all the elements
+ // of the partition of the polyhedral hull of `p' and `q' with
+ // respect to `q' are included in `p'
+ if (!nnc_p.contains(i->pointset()))
+ return false;
+ p = poly_hull;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 1. */
+/* Utilities for termination analysis: declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 33. */
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers {
+public:
+ static void
+ all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space);
+ static bool
+ one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu);
+ static bool
+ one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu);
+ static void
+ all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space);
+
+ template <typename PSET>
+ static void
+ assign_all_inequalities_approximation(const PSET& pset_before,
+ const PSET& pset_after,
+ Constraint_System& cs);
+}; // class Termination_Helpers
+
+//! \name Functions for the Synthesis of Linear Rankings
+//@{
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test using an improvement of the method by Mesnard and
+ Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then <CODE>true</CODE> is returned <EM>if and only if</EM>
+ the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test using an improvement of the method by Mesnard and
+ Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then <CODE>true</CODE> is returned
+ <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with witness ranking function using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param mu
+ When <CODE>true</CODE> is returned, this is assigned a point
+ of space dimension \f$ n+1 \f$ encoding one (not further specified)
+ affine ranking function for the loop being analyzed.
+ The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+ of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+ respectively.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then <CODE>true</CODE> is returned <EM>if and only if</EM>
+ the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with witness ranking function using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param mu
+ When <CODE>true</CODE> is returned, this is assigned a point
+ of space dimension \f$ n+1 \f$ encoding one (not further specified)
+ affine ranking function for the loop being analyzed.
+ The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+ of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+ respectively.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then <CODE>true</CODE> is returned
+ <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with ranking function space using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the affine ranking functions for the loops
+ that are precisely characterized by \p pset.
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p mu_space polyhedron.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions of \p mu_space
+ \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p mu_space is empty, it means that the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then \p mu_space is empty <EM>if and only if</EM>
+ the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with ranking function space using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the affine ranking functions for the loops
+ that are precisely characterized by \p pset.
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p mu_space polyhedron.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions of \p mu_space
+ \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p mu_space is empty, it means that the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then \p mu_space is empty <EM>if and only if</EM>
+ the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Computes the spaces of affine \e quasi ranking functions
+ using an improvement of the method by Mesnard and Serebrenik
+ \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param decreasing_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the decreasing affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ \param bounded_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the lower bounded affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ These quasi-ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+ it means that the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then \p decreasing_mu_space (resp., \p bounded_mu_space) will be empty
+ <EM>if and only if</EM> there is no decreasing (resp., lower bounded)
+ affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Computes the spaces of affine \e quasi ranking functions
+ using an improvement of the method by Mesnard and Serebrenik
+ \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param decreasing_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the decreasing affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ \param bounded_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the lower bounded affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+ it means that the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then \p decreasing_mu_space (resp., \p bounded_mu_space)
+ will be empty <EM>if and only if</EM> there is no decreasing
+ (resp., lower bounded) affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like termination_test_MS() but using the method by Podelski and
+ Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like termination_test_MS_2() but using an alternative formalization
+ of the method by Podelski and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like one_affine_ranking_function_MS() but using the method by Podelski
+ and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like one_affine_ranking_function_MS_2() but using an alternative
+ formalization of the method by Podelski and Rybalchenko
+ \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like all_affine_ranking_functions_MS() but using the method by Podelski
+ and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset, NNC_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like all_affine_ranking_functions_MS_2() but using an alternative
+ formalization of the method by Podelski and Rybalchenko
+ \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ NNC_Polyhedron& mu_space);
+
+//@} // Functions for the Synthesis of Linear Rankings
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_templates.hh line 1. */
+/* Utilities for termination analysis: template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/termination_templates.hh line 33. */
+
+#include <stdexcept>
+
+#define PRINT_DEBUG_INFO 0
+
+#if PRINT_DEBUG_INFO
+#include <iostream>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+#if PRINT_DEBUG_INFO
+static dimension_type output_function_MS_n;
+static dimension_type output_function_MS_m;
+
+/* Encodes which object are we printing:
+
+ 0 means input constraint system;
+ 1 means first output constraint system;
+ 2 means second output constraint system;
+ 3 means only output constraint system
+ (i.e., when first and second are the same);
+ 4 means mu space.
+*/
+static int output_function_MS_which = -1;
+
+/*
+ Debugging output function. See the documentation of
+ fill_constraint_systems_MS() for the allocation of variable indices.
+*/
+inline void
+output_function_MS(std::ostream& s, const Variable v) {
+ dimension_type id = v.id();
+ switch (output_function_MS_which) {
+ case 0:
+ if (id < output_function_MS_n)
+ s << "x'" << id + 1;
+ else if (id < 2*output_function_MS_n)
+ s << "x" << id - output_function_MS_n + 1;
+ else
+ s << "WHAT?";
+ break;
+ case 1:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "WHAT?";
+ else if (id <= output_function_MS_n + output_function_MS_m)
+ s << "y" << id - output_function_MS_n;
+ else
+ s << "WHAT?";
+ break;
+ case 2:
+ case 4:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "mu0";
+ else if (output_function_MS_which == 2
+ && id <= output_function_MS_n + output_function_MS_m + 2)
+ s << "z" << id - output_function_MS_n;
+ else
+ s << "WHAT?";
+ break;
+ case 3:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "mu0";
+ else if (id <= output_function_MS_n + output_function_MS_m)
+ s << "y" << id - output_function_MS_n;
+ else if (id <= output_function_MS_n + 2*output_function_MS_m + 2)
+ s << "z" << id - (output_function_MS_n + output_function_MS_m);
+ else
+ s << "WHAT?";
+ break;
+ default:
+ abort();
+ break;
+ }
+}
+
+static dimension_type output_function_PR_s;
+static dimension_type output_function_PR_r;
+
+/*
+ Debugging output function. See the documentation of
+ fill_constraint_system_PR() for the allocation of variable indices.
+*/
+inline void
+output_function_PR(std::ostream& s, const Variable v) {
+ dimension_type id = v.id();
+ if (id < output_function_PR_s)
+ s << "u3_" << id + 1;
+ else if (id < output_function_PR_s + output_function_PR_r)
+ s << "u2_" << id - output_function_PR_s + 1;
+ else if (id < output_function_PR_s + 2*output_function_PR_r)
+ s << "u1_" << id - (output_function_PR_s + output_function_PR_r) + 1;
+ else
+ s << "WHAT?";
+}
+#endif
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+ Constraint_System& cs_out);
+
+template <typename PSET>
+inline void
+assign_all_inequalities_approximation(const PSET& pset,
+ Constraint_System& cs) {
+ assign_all_inequalities_approximation(pset.minimized_constraints(), cs);
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+ Constraint_System& cs);
+
+bool
+termination_test_MS(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& mu_space);
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after);
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space);
+
+bool
+termination_test_PR_original(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space);
+
+} // namespace Termination
+
+} // namespace Implementation
+
+template <typename PSET>
+void
+Termination_Helpers
+::assign_all_inequalities_approximation(const PSET& pset_before,
+ const PSET& pset_after,
+ Constraint_System& cs) {
+ Implementation::Termination
+ ::assign_all_inequalities_approximation(pset_before, cs);
+ cs.shift_space_dimensions(Variable(0), cs.space_dimension());
+ Constraint_System cs_after;
+ Implementation::Termination
+ ::assign_all_inequalities_approximation(pset_after, cs_after);
+ // FIXME: provide an "append" for constraint systems.
+ for (Constraint_System::const_iterator i = cs_after.begin(),
+ cs_after_end = cs_after.end(); i != cs_after_end; ++i)
+ cs.insert(*i);
+}
+
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::termination_test_MS(pset):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::termination_test_MS_2(pset_before, pset_after):\n"
+ "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_MS(pset, mu):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_MS_2(pset_before, pset_after, mu):\n"
+ "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS(pset, mu_space):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS_2"
+ << "(pset_before, pset_after, mu_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_quasi_ranking_functions_MS"
+ << "(pset, decr_space, bounded_space):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ decreasing_mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+ bounded_mu_space = decreasing_mu_space;
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_quasi_ranking_functions_MS(cs,
+ decreasing_mu_space,
+ bounded_mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_quasi_ranking_functions_MS_2"
+ << "(pset_before, pset_after, decr_space, bounded_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ decreasing_mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+ bounded_mu_space = decreasing_mu_space;
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ all_affine_quasi_ranking_functions_MS(cs,
+ decreasing_mu_space,
+ bounded_mu_space);
+}
+
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::termination_test_PR_2(pset_before, pset_after):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ return termination_test_PR(cs_before, cs_after);
+}
+
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::termination_test_PR(pset):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return termination_test_PR_original(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_PR_2"
+ << "(pset_before, pset_after, mu):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ return one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_PR(pset, mu):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return one_affine_ranking_function_PR_original(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ NNC_Polyhedron& mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS_2"
+ << "(pset_before, pset_after, mu_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ mu_space = NNC_Polyhedron(1 + before_space_dim);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ all_affine_ranking_functions_PR(cs_before, cs_after, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset,
+ NNC_Polyhedron& mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_PR(pset, mu_space):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ mu_space = NNC_Polyhedron(1 + space_dim/2);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 501. */
+
+/* Automatically generated from PPL source file ../src/wrap_string.hh line 1. */
+/* Declaration of string wrapping function.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_string.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Utility function for the wrapping of lines of text.
+/*!
+ \param src_string
+ The source string holding the lines to wrap.
+
+ \param indent_depth
+ The indentation depth.
+
+ \param preferred_first_line_length
+ The preferred length for the first line of text.
+
+ \param preferred_line_length
+ The preferred length for all the lines but the first one.
+
+ \return
+ The wrapped string.
+*/
+std::string
+wrap_string(const std::string& src_string,
+ unsigned indent_depth,
+ unsigned preferred_first_line_length,
+ unsigned preferred_line_length);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Cast_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Cast_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Cast Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point cast expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given a floating point expression \f$e\f$ and a composite abstract store
+ \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$,
+ we construct the interval linear form
+ \f$\linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}\f$ as follows:
+ \f[
+ \linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Builds a cast floating point expression with the value
+ expressed by \p expr.
+ */
+ Cast_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const expr);
+
+ //! Destructor.
+ ~Cast_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ See the class description for an explanation of how \p result is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Cast_Floating_Point_Expression& y);
+
+private:
+
+ //! Pointer to the casted expression.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* expr;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Cast_Floating_Point_Expression(
+ const Cast_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+ Cast_Floating_Point_Expression& operator=(
+ const Cast_Floating_Point_Expression& y);
+
+}; // class Cast_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_inlines.hh line 1. */
+/* Cast_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Cast_Floating_Point_Expression(
+Floating_Point_Expression<FP_Interval_Type, FP_Format>* const e)
+ : expr(e) {
+ assert(e != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Cast_Floating_Point_Expression() {
+ delete expr;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Cast_Floating_Point_Expression& y) {
+ swap(expr, y.expr);
+}
+
+/*! \relates Cast_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 181. */
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_templates.hh line 1. */
+/* Cast_Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!expr->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Constant_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Constant_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Constant Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point constant expressions
+
+ The linearization of a constant floating point expression results in a
+ linear form consisting of only the inhomogeneous term
+ \f$[l, u]\f$, where \f$l\f$ and \f$u\f$ are the lower
+ and upper bounds of the constant value given to the class constructor.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the constant floating point
+ expression from a \p lower_bound and an \p upper_bound of its
+ value in the concrete domain.
+ */
+ Constant_Floating_Point_Expression(const boundary_type lower_bound,
+ const boundary_type upper_bound);
+
+ /*! \brief
+ Builds a constant floating point expression with the value
+ expressed by the string \p str_value.
+ */
+ Constant_Floating_Point_Expression(const char* str_value);
+
+ //! Destructor.
+ ~Constant_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ See the class description for an explanation of how \p result is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Constant_Floating_Point_Expression& y);
+
+private:
+
+ FP_Interval_Type value;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Constant_Floating_Point_Expression(
+ const Constant_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+ Constant_Floating_Point_Expression& operator=(
+ const Constant_Floating_Point_Expression& y);
+
+}; // class Constant_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_inlines.hh line 1. */
+/* Constant_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const char* str_value)
+ : value(str_value) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const boundary_type lb,
+ const boundary_type ub) {
+ assert(lb <= ub);
+ value.build(i_constraint(GREATER_OR_EQUAL, lb),
+ i_constraint(LESS_OR_EQUAL, ub));
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Constant_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Constant_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(value, y.value);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+ const FP_Linear_Form_Abstract_Store&,
+ FP_Linear_Form& result) const {
+ result = FP_Linear_Form(value);
+ return true;
+}
+
+/*! \relates Constant_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 172. */
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Variable_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+#include <utility>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Variable_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Variable Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of floating-point variable expressions
+
+ Given a variable expression \f$v\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval
+ linear form \f$\linexprenv{v}{\rho^{\#}}{\rho^{\#}_l}\f$ as
+ \f$\rho^{\#}_l(v)\f$ if it is defined; otherwise we construct it as
+ \f$[-1, 1]v\f$.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression
+: public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with a parameter: builds the variable floating point
+ expression corresponding to the variable having \p v_index as its index.
+ */
+ explicit Variable_Floating_Point_Expression(const dimension_type v_index);
+
+ //! Destructor.
+ ~Variable_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given abstract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that the variable in the expression MUST have an associated value
+ in \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result is
+ computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ /*! \brief
+ Assigns a linear form to the variable with the same index of
+ \p *this in a given linear form abstract store.
+
+ \param lf The linear form assigned to the variable.
+ \param lf_store The linear form abstract store.
+
+ Note that once \p lf is assigned to a variable, all the other entries
+ of \p lf_store which contain that variable are discarded.
+ */
+ void linear_form_assign(const FP_Linear_Form& lf,
+ FP_Linear_Form_Abstract_Store& lf_store) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Variable_Floating_Point_Expression& y);
+
+private:
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Variable_Floating_Point_Expression(
+ const Variable_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Variable_Floating_Point_Expression& operator=(
+ const Variable_Floating_Point_Expression& y);
+
+ //! The index of the variable.
+ dimension_type variable_index;
+
+}; // class Variable_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_inlines.hh line 1. */
+/* Variable_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Variable_Floating_Point_Expression(const dimension_type v_index)
+ : variable_index(v_index) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Variable_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Variable_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(variable_index, y.variable_index);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ typename FP_Linear_Form_Abstract_Store::const_iterator
+ variable_value = lf_store.find(variable_index);
+
+ if (variable_value == lf_store.end()) {
+ result = FP_Linear_Form(Variable(variable_index));
+ return true;
+ }
+
+ result = FP_Linear_Form(variable_value->second);
+ return !this->overflows(result);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linear_form_assign(const FP_Linear_Form& lf,
+ FP_Linear_Form_Abstract_Store& lf_store) const {
+ for (typename FP_Linear_Form_Abstract_Store::iterator
+ i = lf_store.begin(); i != lf_store.end(); ) {
+ if ((i->second).coefficient(Variable(variable_index)) != 0)
+ i = lf_store.erase(i);
+ else
+ ++i;
+ }
+ lf_store[variable_index] = lf;
+ return;
+}
+
+/*! \relates Variable_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 186. */
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Sum_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Sum Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of sum floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+ forms such that:
+
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v \right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+ \f]
+
+ Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the sum floating point expression
+ corresponding to \p x \f$\oplus\f$ \p y.
+ */
+ Sum_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Sum_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Sum_Floating_Point_Expression(
+ const Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Sum_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Sum_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_inlines.hh line 1. */
+/* Sum_Floating_Point_Expression class implementation: inline
+ functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Sum_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y) {
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Sum_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_templates.hh line 1. */
+/* Sum_Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ result += linearized_second_operand;
+ relative_error(linearized_second_operand, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 212. */
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Difference_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Difference Floating Point Expression.
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of difference floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+ operators on linear form such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \adifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ on \f$\cV\f$ as follows:
+ \f[
+ \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1]
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the difference floating point
+ expression corresponding to \p x \f$\ominus\f$ \p y.
+ */
+ Difference_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Difference_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Difference_Floating_Point_Expression(
+ const Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited asssignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Difference_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Difference_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_inlines.hh line 1. */
+/* Difference_Floating_Point_Expression class implementation: inline
+ functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Difference_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y){
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Difference_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_templates.hh line 1. */
+/* Difference_Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result += rel_error;
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ result -= linearized_second_operand;
+ relative_error(linearized_second_operand, rel_error);
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 220. */
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Multiplication_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Multiplication Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of multiplication floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+ operators on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ i
+ \amlf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \amifp i'\right)
+ + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+ \f]
+ Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left([a, b]
+ \amlf
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+ \aslf
+ \left([a, b]
+ \amlf
+ \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1].
+ \f].
+
+ Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+ \f]
+
+ Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}
+ \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+ method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+ and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+
+ Even though we intervalize the first operand in the above example, the
+ actual implementation utilizes an heuristics for choosing which of the two
+ operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the multiplication floating point
+ expression corresponding to \p x \f$\otimes\f$ \p y.
+ */
+ Multiplication_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+ //! Destructor.
+ ~Multiplication_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor.
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Multiplication_Floating_Point_Expression(
+ const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+
+}; // class Multiplication_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_inlines.hh line 1. */
+/* Multiplication_Floating_Point_Expression class implementation: inline
+ functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Multiplication_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+ : first_operand(x), second_operand(y) {
+ assert(x != 0);
+ assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Multiplication_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_templates.hh line 1. */
+/* Multiplication_Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ /*
+ FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+ decide which of the two linear forms must be intervalized, as described
+ in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+ thesis "Weakly Relational Numerical Abstract Domains".
+ In this Section are also described other multiplication strategies, such
+ as All-Cases, Relative-Size Local, Simplification-Driven Global and
+ Homogeneity Global.
+ */
+
+ // Here we choose which of the two linear forms must be intervalized.
+
+ // true if we intervalize the first form, false if we intervalize the second.
+ bool intervalize_first;
+ FP_Linear_Form linearized_first_operand;
+ if (!first_operand->linearize(int_store, lf_store,
+ linearized_first_operand))
+ return false;
+ FP_Interval_Type intervalized_first_operand;
+ this->intervalize(linearized_first_operand, int_store,
+ intervalized_first_operand);
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ this->intervalize(linearized_second_operand, int_store,
+ intervalized_second_operand);
+
+ // FIXME: we are not sure that what we do here is policy-proof.
+ if (intervalized_first_operand.is_bounded()) {
+ if (intervalized_second_operand.is_bounded()) {
+ boundary_type first_interval_size
+ = intervalized_first_operand.upper()
+ - intervalized_first_operand.lower();
+ boundary_type second_interval_size
+ = intervalized_second_operand.upper()
+ - intervalized_second_operand.lower();
+ if (first_interval_size <= second_interval_size)
+ intervalize_first = true;
+ else
+ intervalize_first = false;
+ }
+ else
+ intervalize_first = true;
+ }
+ else {
+ if (intervalized_second_operand.is_bounded())
+ intervalize_first = false;
+ else
+ return false;
+ }
+
+ // Here we do the actual computation.
+ // For optimizing, we store the relative error directly into result.
+ if (intervalize_first) {
+ relative_error(linearized_second_operand, result);
+ linearized_second_operand *= intervalized_first_operand;
+ result *= intervalized_first_operand;
+ result += linearized_second_operand;
+ }
+ else {
+ relative_error(linearized_first_operand, result);
+ linearized_first_operand *= intervalized_second_operand;
+ result *= intervalized_second_operand;
+ result += linearized_first_operand;
+ }
+
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 250. */
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Division_Floating_Point_Expression class and its
+ constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Division Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearizationd of division floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+ \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+ be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+ operator on linear forms such that:
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \aslf
+ \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+ =
+ \left(i \asifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+ \f]
+ \f[
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ \adivlf
+ i'
+ =
+ \left(i \adivifp i'\right)
+ + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+ \f]
+ Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$,
+ we construct the interval linear form
+ \f$
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ \f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \adivlf
+ [a, b]\right)
+ \aslf
+ \left(\varepsilon_{\mathbf{f}}\left(
+ \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)
+ \adivlf
+ [a, b]\right)
+ \aslf
+ mf_{\mathbf{f}}[-1, 1],
+ \f]
+ given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \linexprenv{e_{1} \oslash \iota\left(
+ \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+ \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+ \f]
+ where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+ calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+ on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+ method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+ and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+ <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the Box<FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>
+ ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with two parameters: builds the division floating point
+ expression corresponding to \p num \f$\oslash\f$ \p den.
+ */
+ Division_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den);
+
+ //! Destructor.
+ ~Division_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expressions represented
+ by \p first_operand and \p second_operand MUST have an associated value in
+ \p int_store. If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& y);
+
+private:
+
+ //! Pointer to the first operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+ //! Pointer to the second operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Copy constructor: temporary inhibited.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Division_Floating_Point_Expression(
+ const Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Assignment operator: temporary inhibited.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+ operator=(const Division_Floating_Point_Expression<FP_Interval_Type,
+ FP_Format>& e);
+
+}; // class Division_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_inlines.hh line 1. */
+/* Division_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Division_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den)
+ : first_operand(num), second_operand(den) {
+ assert(num != 0);
+ assert(den != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Division_Floating_Point_Expression() {
+ delete first_operand;
+ delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ using std::swap;
+ swap(first_operand, y.first_operand);
+ swap(second_operand, y.second_operand);
+}
+
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_templates.hh line 1. */
+/* Division_Floating_Point_Expression class implementation:
+ non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ FP_Linear_Form linearized_second_operand;
+ if (!second_operand->linearize(int_store, lf_store,
+ linearized_second_operand))
+ return false;
+ FP_Interval_Type intervalized_second_operand;
+ this->intervalize(linearized_second_operand, int_store,
+ intervalized_second_operand);
+
+ // Check if we may divide by zero.
+ if (intervalized_second_operand.lower() <= 0
+ && intervalized_second_operand.upper() >= 0)
+ return false;
+
+ if (!first_operand->linearize(int_store, lf_store, result))
+ return false;
+ FP_Linear_Form rel_error;
+ relative_error(result, rel_error);
+ result /= intervalized_second_operand;
+ rel_error /= intervalized_second_operand;
+ result += rel_error;
+ result += this->absolute_error;
+ return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 236. */
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Opposite_Floating_Point_Expression class and
+ its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Opposite_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+ A generic Opposite Floating Point Expression.
+
+ \ingroup PPL_CXX_interface
+
+ \par Template type parameters
+
+ - The class template type parameter \p FP_Interval_Type represents the type
+ of the intervals used in the abstract domain.
+ - The class template type parameter \p FP_Format represents the floating
+ point format used in the concrete domain.
+
+ \par Linearization of opposite floating-point expressions
+
+ Let \f$i + \sum_{v \in \cV}i_{v}v \f$ be an interval linear form and
+ let \f$\adlf\f$ be a sound unary operator on linear forms such that:
+
+ \f[
+ \adlf
+ \left(i + \sum_{v \in \cV}i_{v}v\right)
+ =
+ \left(\adifp i\right)
+ + \sum_{v \in \cV}\left(\adifp i_{v} \right)v,
+ \f]
+
+ Given a floating point expression \f$\ominus e\f$ and a composite
+ abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+ \rrbracket\f$, we construct the interval linear form
+ \f$\linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}\f$
+ as follows:
+ \f[
+ \linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}
+ =
+ \adlf
+ \left(
+ \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+ \right).
+ \f]
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression
+ : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+ /*! \brief
+ Alias for the Linear_Form<FP_Interval_Type> from
+ Floating_Point_Expression
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form FP_Linear_Form;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Interval_Type> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+ /*! \brief
+ Alias for the std::map<dimension_type, FP_Linear_Form> from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+ FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::boundary_type from
+ Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+ boundary_type;
+
+ /*! \brief
+ Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+ */
+ typedef typename
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+ //! \name Constructors and Destructor
+ //@{
+ /*! \brief
+ Constructor with one parameter: builds the opposite floating point
+ expression \f$\ominus\f$ \p op.
+ */
+ explicit Opposite_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op);
+
+ //! Destructor.
+ ~Opposite_Floating_Point_Expression();
+
+ //@} // Constructors and Destructor
+
+ /*! \brief
+ Linearizes the expression in a given astract store.
+
+ Makes \p result become the linearization of \p *this in the given
+ composite abstract store.
+
+ \param int_store The interval abstract store.
+ \param lf_store The linear form abstract store.
+ \param result The modified linear form.
+
+ \return <CODE>true</CODE> if the linearization succeeded,
+ <CODE>false</CODE> otherwise.
+
+ Note that all variables occuring in the expression represented
+ by \p operand MUST have an associated value in \p int_store.
+ If this precondition is not met, calling the method
+ causes an undefined behavior.
+
+ See the class description for a detailed explanation of how \p result
+ is computed.
+ */
+ bool linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const;
+
+ //! Swaps \p *this with \p y.
+ void m_swap(Opposite_Floating_Point_Expression& y);
+
+private:
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited copy constructor.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Opposite_Floating_Point_Expression(
+ const Opposite_Floating_Point_Expression& y);
+
+ #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Inhibited assignment operator.
+ */
+ #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ Opposite_Floating_Point_Expression& operator=(
+ const Opposite_Floating_Point_Expression& y);
+
+ //! Pointer to the operand.
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* operand;
+
+}; // class Opposite_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_inlines.hh line 1. */
+/* Opposite_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Opposite_Floating_Point_Expression(
+ Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op)
+ : operand(op)
+{
+ assert(op != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Opposite_Floating_Point_Expression() {
+ delete operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Opposite_Floating_Point_Expression& y) {
+ using std::swap;
+ swap(operand, y.operand);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+ const FP_Linear_Form_Abstract_Store& lf_store,
+ FP_Linear_Form& result) const {
+ if (!operand->linearize(int_store, lf_store, result))
+ return false;
+
+ result.negate();
+ return true;
+}
+
+/*! \relates Opposite_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+ Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+ x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 192. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 1. */
+/* Watchdog and associated classes' declaration and inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Watchdog_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Watchdog;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 1. */
+/* Time class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Time_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Time;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x is shorter than
+ or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if \p x is longer than
+ or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+ Returns the difference of \p x and \p y or the null interval,
+ if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Time {
+public:
+ //! Zero seconds.
+ Time();
+
+ //! Constructor taking a number of centiseconds.
+ explicit Time(long centisecs);
+
+ //! Constructor with seconds and microseconds.
+ Time(long s, long m);
+
+ /*! \brief
+ Returns the number of whole seconds contained in the represented
+ time interval.
+ */
+ long seconds() const;
+
+ /*! \brief
+ Returns the number of microseconds that, when added to the number
+ of seconds returned by seconds(), give the represent time interval.
+ */
+ long microseconds() const;
+
+ //! Adds \p y to \p *this.
+ Time& operator+=(const Time& y);
+
+ /*! \brief
+ Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+ \p *this is set to the null interval.
+ */
+ Time& operator-=(const Time& y);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! Number of microseconds in a second.
+ static const long USECS_PER_SEC = 1000000L;
+
+ //! Number of centiseconds in a second.
+ static const long CSECS_PER_SEC = 100L;
+
+ //! Number of seconds.
+ long secs;
+
+ //! Number of microseconds.
+ long microsecs;
+};
+
+/* Automatically generated from PPL source file ../src/Time_inlines.hh line 1. */
+/* Time class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Time::Time()
+ : secs(0), microsecs(0) {
+ assert(OK());
+}
+
+inline
+Time::Time(long centisecs)
+ : secs(centisecs / CSECS_PER_SEC),
+ microsecs((centisecs % CSECS_PER_SEC) * (USECS_PER_SEC/CSECS_PER_SEC)) {
+ assert(OK());
+}
+
+inline
+Time::Time(long s, long m)
+ : secs(s),
+ microsecs(m) {
+ if (microsecs >= USECS_PER_SEC) {
+ secs += microsecs / USECS_PER_SEC;
+ microsecs %= USECS_PER_SEC;
+ }
+ assert(OK());
+}
+
+inline long
+Time::seconds() const {
+ return secs;
+}
+
+inline long
+Time::microseconds() const {
+ return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+ long r_secs = secs + y.secs;
+ long r_microsecs = microsecs + y.microsecs;
+ if (r_microsecs >= USECS_PER_SEC) {
+ ++r_secs;
+ r_microsecs %= USECS_PER_SEC;
+ }
+ secs = r_secs;
+ microsecs = r_microsecs;
+ assert(OK());
+ return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+ long r_secs = secs - y.secs;
+ long r_microsecs = microsecs - y.microsecs;
+ if (r_microsecs < 0) {
+ --r_secs;
+ r_microsecs += USECS_PER_SEC;
+ }
+ if (r_secs < 0) {
+ r_secs = 0;
+ r_microsecs = 0;
+ }
+ secs = r_secs;
+ microsecs = r_microsecs;
+ assert(OK());
+ return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+ Time z = x;
+ z += y;
+ return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+ Time z = x;
+ z -= y;
+ return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+ assert(x.OK() && y.OK());
+ return x.seconds() < y.seconds()
+ || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+ return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+ return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+ return y <= x;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 125. */
+
+/* Automatically generated from PPL source file ../src/Handler_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 1. */
+/* Pending_List class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pending_List_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+class Pending_List;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 1. */
+/* Pending_Element class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pending_Element_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <class Threshold>
+class Pending_Element;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 1. */
+/* Doubly_Linked_Object class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+class Doubly_Linked_Object;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 30. */
+
+//! A (base) class for doubly linked objects.
+class Parma_Polyhedra_Library::Implementation::Doubly_Linked_Object {
+public:
+ //! Default constructor.
+ Doubly_Linked_Object();
+
+ //! Creates a chain element with forward link \p f and backward link \p b.
+ Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+ //! Inserts \p y before \p *this.
+ void insert_before(Doubly_Linked_Object& y);
+
+ //! Inserts \p y after \p *this.
+ void insert_after(Doubly_Linked_Object& y);
+
+ //! Erases \p *this from the chain and returns a pointer to the next element.
+ Doubly_Linked_Object* erase();
+
+ //! Erases \p *this from the chain.
+ ~Doubly_Linked_Object();
+
+private:
+ //! Forward link.
+ Doubly_Linked_Object* next;
+
+ //! Backward link.
+ Doubly_Linked_Object* prev;
+
+ template <typename T> friend class EList;
+ template <typename T> friend class EList_Iterator;
+};
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_inlines.hh line 1. */
+/* Doubly_Linked_Object class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+ Doubly_Linked_Object* b)
+ : next(f),
+ prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+ y.next = this;
+ y.prev = prev;
+ prev->next = &y;
+ prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+ y.next = next;
+ y.prev = this;
+ next->prev = &y;
+ next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+ next->prev = prev;
+ prev->next = next;
+ return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+ erase();
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 64. */
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 30. */
+
+//! A class for pending watchdog events with embedded links.
+/*!
+ Each pending watchdog event is characterized by a deadline (a positive
+ time interval), an associated handler that will be invoked upon event
+ expiration, and a Boolean flag that indicates whether the event has already
+ expired or not.
+*/
+template <typename Threshold>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_Element
+ : public Doubly_Linked_Object {
+public:
+ //! Constructs an element with the given attributes.
+ Pending_Element(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Modifies \p *this so that it has the given attributes.
+ void assign(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Returns the deadline of the event.
+ const Threshold& deadline() const;
+
+ //! Returns the handler associated to the event.
+ const Handler& handler() const;
+
+ //! Returns a reference to the "event-expired" flag.
+ bool& expired_flag() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The deadline of the event.
+ Threshold d;
+
+ //! A pointer to the handler associated to the event.
+ const Handler* p_h;
+
+ //! A pointer to a flag saying whether the event has already expired or not.
+ bool* p_f;
+};
+
+/* Automatically generated from PPL source file ../src/Pending_Element_inlines.hh line 1. */
+/* Pending_Element class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Threshold>
+inline bool
+Pending_Element<Threshold>::OK() const {
+ return true;
+}
+
+template <typename Threshold>
+inline
+Pending_Element<Threshold>::Pending_Element(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag)
+ : d(deadline), p_h(&handler), p_f(&expired_flag) {
+ assert(OK());
+}
+
+template <typename Threshold>
+inline void
+Pending_Element<Threshold>::assign(const Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ d = deadline;
+ p_h = &handler;
+ p_f = &expired_flag;
+ assert(OK());
+}
+
+template <typename Threshold>
+inline const Threshold&
+Pending_Element<Threshold>::deadline() const {
+ return d;
+}
+
+template <typename Threshold>
+inline const Handler&
+Pending_Element<Threshold>::handler() const {
+ return *p_h;
+}
+
+template <typename Threshold>
+inline bool&
+Pending_Element<Threshold>::expired_flag() const {
+ return *p_f;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 76. */
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 1. */
+/* EList class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 1. */
+/* EList_Iterator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList_Iterator {
+public:
+ //! Constructs an iterator pointing to nothing.
+ EList_Iterator();
+
+ //! Constructs an iterator pointing to \p p.
+ explicit EList_Iterator(Doubly_Linked_Object* p);
+
+ //! Changes \p *this so that it points to \p p.
+ EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+ //! Indirect member selector.
+ T* operator->();
+
+ //! Dereference operator.
+ T& operator*();
+
+ //! Preincrement operator.
+ EList_Iterator& operator++();
+
+ //! Postincrement operator.
+ EList_Iterator operator++(int);
+
+ //! Predecrement operator.
+ EList_Iterator& operator--();
+
+ //! Postdecrement operator.
+ EList_Iterator operator--(int);
+
+private:
+ //! Embedded pointer.
+ Doubly_Linked_Object* ptr;
+
+ friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+ friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_inlines.hh line 1. */
+/* EList_Iterator class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+ : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+ ptr = p;
+ return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+ return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+ return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+ ptr = ptr->next;
+ return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+ EList_Iterator tmp = *this;
+ ++*this;
+ return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+ ptr = ptr->prev;
+ return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+ EList_Iterator tmp = *this;
+ --*this;
+ return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+ return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+ return x.ptr != y.ptr;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 87. */
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 30. */
+
+/*! \brief
+ A simple kind of embedded list (i.e., a doubly linked objects
+ where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList
+ : private Doubly_Linked_Object {
+public:
+ //! A const iterator to traverse the list.
+ typedef EList_Iterator<const T> const_iterator;
+
+ //! A non-const iterator to traverse the list.
+ typedef EList_Iterator<T> iterator;
+
+ //! Constructs an empty list.
+ EList();
+
+ //! Destructs the list and all the elements in it.
+ ~EList();
+
+ //! Pushes \p obj to the front of the list.
+ void push_front(T& obj);
+
+ //! Pushes \p obj to the back of the list.
+ void push_back(T& obj);
+
+ /*! \brief
+ Inserts \p obj just before \p position and returns an iterator
+ that points to the inserted object.
+ */
+ iterator insert(iterator position, T& obj);
+
+ /*! \brief
+ Removes the element pointed to by \p position, returning
+ an iterator pointing to the next element, if any, or end(), otherwise.
+ */
+ iterator erase(iterator position);
+
+ //! Returns <CODE>true</CODE> if and only if the list is empty.
+ bool empty() const;
+
+ //! Returns an iterator pointing to the beginning of the list.
+ iterator begin();
+
+ //! Returns an iterator pointing one past the last element in the list.
+ iterator end();
+
+ //! Returns a const iterator pointing to the beginning of the list.
+ const_iterator begin() const;
+
+ //! Returns a const iterator pointing one past the last element in the list.
+ const_iterator end() const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/EList_inlines.hh line 1. */
+/* EList class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList<T>::EList()
+ : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+ next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+ prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::insert(iterator position, T& obj) {
+ position->insert_before(obj);
+ return iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::begin() {
+ return iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::end() {
+ return iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::begin() const {
+ return const_iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::end() const {
+ return const_iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+ return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::erase(iterator position) {
+ assert(!empty());
+ return iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+ // Erase and deallocate all the elements.
+ for (iterator i = begin(), lend = end(), next; i != lend; i = next) {
+ next = erase(i);
+ delete &*i;
+ }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+ for (const_iterator i = begin(), lend = end(); i != lend; ++i)
+ if (!i->OK())
+ return false;
+
+ return true;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 89. */
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 31. */
+
+//! An ordered list for recording pending watchdog events.
+template <typename Traits>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_List {
+public:
+ //! A non-const iterator to traverse the list.
+ typedef typename EList<Pending_Element<typename Traits::Threshold> >::iterator iterator;
+
+ //! A const iterator to traverse the list.
+ typedef typename EList<Pending_Element<typename Traits::Threshold> >::const_iterator const_iterator;
+
+ //! Constructs an empty list.
+ Pending_List();
+
+ //! Destructor.
+ ~Pending_List();
+
+ //! Inserts a new Pending_Element object with the given attributes.
+ iterator insert(const typename Traits::Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ /*! \brief
+ Removes the element pointed to by \p position, returning
+ an iterator pointing to the next element, if any, or end(), otherwise.
+ */
+ iterator erase(iterator position);
+
+ //! Returns <CODE>true</CODE> if and only if the list is empty.
+ bool empty() const;
+
+ //! Returns an iterator pointing to the beginning of the list.
+ iterator begin();
+
+ //! Returns an iterator pointing one past the last element in the list.
+ iterator end();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ EList<Pending_Element<typename Traits::Threshold> > active_list;
+ EList<Pending_Element<typename Traits::Threshold> > free_list;
+};
+
+/* Automatically generated from PPL source file ../src/Pending_List_inlines.hh line 1. */
+/* Pending_List class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+inline
+Pending_List<Traits>::Pending_List()
+ : active_list(),
+ free_list() {
+ assert(OK());
+}
+
+template <typename Traits>
+inline
+Pending_List<Traits>::~Pending_List() {
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::begin() {
+ return active_list.begin();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::end() {
+ return active_list.end();
+}
+
+template <typename Traits>
+inline bool
+Pending_List<Traits>::empty() const {
+ return active_list.empty();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::erase(iterator position) {
+ assert(!empty());
+ iterator next = active_list.erase(position);
+ free_list.push_back(*position);
+ assert(OK());
+ return next;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_templates.hh line 1. */
+/* Pending_List class implementation.
+*/
+
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+typename Pending_List<Traits>::iterator
+Pending_List<Traits>::insert(const typename Traits::Threshold& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ iterator position = active_list.begin();
+ for (iterator active_list_end = active_list.end();
+ position != active_list_end
+ && Traits::less_than(position->deadline(), deadline);
+ ++position)
+ ;
+ iterator pending_element_p;
+ // Only allocate a new element if the free list is empty.
+ if (free_list.empty())
+ pending_element_p
+ = new Pending_Element<typename Traits::Threshold>(deadline,
+ handler,
+ expired_flag);
+ else {
+ pending_element_p = free_list.begin();
+ free_list.erase(pending_element_p);
+ pending_element_p->assign(deadline, handler, expired_flag);
+ }
+ iterator r = active_list.insert(position, *pending_element_p);
+ assert(OK());
+ return r;
+}
+
+template <typename Traits>
+bool
+Pending_List<Traits>::OK() const {
+ if (!active_list.OK())
+ return false;
+
+ if (!free_list.OK())
+ return false;
+
+ const typename Traits::Threshold* old;
+ const_iterator i = active_list.begin();
+ old = &i->deadline();
+ ++i;
+ for (const_iterator active_list_end = active_list.end(); i != active_list_end; ++i) {
+ const typename Traits::Threshold& t = i->deadline();
+ if (Traits::less_than(t, *old)) {
+#ifndef NDEBUG
+ std::cerr << "The active list is not sorted!"
+ << std::endl;
+#endif
+ return false;
+ }
+ old = &t;
+ }
+ return true;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 78. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 31. */
+#include <cassert>
+#include <functional>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PPL_handle_timeout(int signum);
+
+struct Watchdog_Traits {
+ typedef Implementation::Watchdog::Time Threshold;
+ static bool less_than(const Threshold& a, const Threshold& b) {
+ return a < b;
+ }
+};
+
+//! A watchdog timer.
+class Watchdog {
+public:
+ template <typename Flag_Base, typename Flag>
+ Watchdog(long csecs, const Flag_Base* volatile& holder, Flag& flag);
+
+ /*! \brief
+ Constructor: if not reset, the watchdog will trigger after \p csecs
+ centiseconds, invoking handler \p function.
+ */
+ Watchdog(long csecs, void (* const function)());
+
+ //! Destructor.
+ ~Watchdog();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+ //! Static class initialization.
+ static void initialize();
+ //! Static class finalization.
+ static void finalize();
+
+private:
+ //! Whether or not this watchdog has expired.
+ bool expired;
+
+ typedef Implementation::Watchdog::Pending_List<Watchdog_Traits>
+ WD_Pending_List;
+
+ typedef Implementation::Watchdog::Handler
+ WD_Handler;
+
+ const WD_Handler& handler;
+ WD_Pending_List::iterator pending_position;
+
+ // Private and not implemented: copy construction is not allowed.
+ Watchdog(const Watchdog&);
+ // Private and not implemented: copy assignment is not allowed.
+ Watchdog& operator=(const Watchdog&);
+
+ // Pass this to getitimer().
+ static itimerval current_timer_status;
+
+ //! Reads the timer value into \p time.
+ static void get_timer(Implementation::Watchdog::Time& time);
+
+ // Pass this to setitimer().
+ static itimerval signal_once;
+
+ // Last time value we set the timer to.
+ static Implementation::Watchdog::Time last_time_requested;
+
+ //! Sets the timer value to \p time.
+ static void set_timer(const Implementation::Watchdog::Time& time);
+
+ //! Stops the timer.
+ static void stop_timer();
+
+ //! Quick reschedule to avoid race conditions.
+ static void reschedule();
+
+ // Used by the above.
+ static Implementation::Watchdog::Time reschedule_time;
+
+ // Records the time elapsed since last fresh start.
+ static Implementation::Watchdog::Time time_so_far;
+
+ //! The ordered queue of pending watchdog events.
+ static WD_Pending_List pending;
+
+ //! The actual signal handler.
+ static void handle_timeout(int);
+
+ //! Handles the addition of a new watchdog event.
+ static WD_Pending_List::iterator
+ new_watchdog_event(long csecs,
+ const WD_Handler& handler,
+ bool& expired_flag);
+
+ //! Handles the removal of the watchdog event referred by \p position.
+ void remove_watchdog_event(WD_Pending_List::iterator position);
+
+ //! Whether the alarm clock is running.
+ static volatile bool alarm_clock_running;
+
+ //! Whether we are changing data that is also changed by the signal handler.
+ static volatile bool in_critical_section;
+
+ friend void PPL_handle_timeout(int signum);
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Watchdog_inlines.hh line 1. */
+/* Watchdog and associated classes' implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 1. */
+/* Handler and derived classes' declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 28. */
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler {
+public:
+ //! Does the job.
+ virtual void act() const = 0;
+
+ //! Virtual destructor.
+ virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+ The template class <CODE>Handler_Flag\<Flag_Base, Flag\></CODE>
+ is an handler whose job is to install a flag onto an <EM>holder</EM>
+ for the flag.
+ The flag is of type \p Flag and the holder is a (volatile) pointer
+ to \p Flag_Base. Installing the flag onto the holder means making
+ the holder point to the flag, so that it must be possible to assign
+ a value of type <CODE>Flag*</CODE> to an entity of type
+ <CODE>Flag_Base*</CODE>.
+ The class \p Flag must provide the method
+
+ \code
+ int priority() const
+ \endcode
+ returning an integer priority associated to the flag.
+
+ The handler will install its flag onto the holder only if the holder
+ is empty, namely, it is the null pointer, or if the holder holds a
+ flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Flag
+ : public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+ /*! \brief
+ Does its job: installs the flag onto the holder, if a flag with
+ an higher priority has not already been installed.
+ */
+ virtual void act() const;
+
+private:
+ // declare holder as reference to volatile pointer to const Flag_Base
+ const Flag_Base* volatile& h;
+ Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Function
+ : public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Function(void (* const function)());
+
+ //! Does its job: calls the embedded function.
+ virtual void act() const;
+
+private:
+ //! Pointer to the embedded function.
+ void (* const f)();
+};
+
+/* Automatically generated from PPL source file ../src/Handler_inlines.hh line 1. */
+/* Handler and derived classes' implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+ Flag& flag)
+ : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+ if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+ h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (* const function)())
+ : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+ (*f)();
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 95. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long csecs,
+ const Flag_Base* volatile& holder,
+ Flag& flag)
+ : expired(false),
+ handler(*new
+ Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+ flag)) {
+ if (csecs == 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of centiseconds");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(csecs, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(long csecs, void (* const function)())
+ : expired(false),
+ handler(*new Implementation::Watchdog::Handler_Function(function)) {
+ if (csecs == 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of centiseconds");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(csecs, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::~Watchdog() {
+ if (!expired) {
+ in_critical_section = true;
+ remove_watchdog_event(pending_position);
+ in_critical_section = false;
+ }
+ delete &handler;
+}
+
+inline void
+Watchdog::reschedule() {
+ set_timer(reschedule_time);
+}
+
+#else // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long /* csecs */,
+ const Flag_Base* volatile& /* holder */,
+ Flag& /* flag */) {
+ throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+ " system does not provide setitimer()");
+}
+
+inline
+Watchdog::Watchdog(long /* csecs */, void (* /* function */)()) {
+ throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+ " system does not provide setitimer()");
+}
+
+inline
+Watchdog::~Watchdog() {
+}
+
+#endif // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 146. */
+
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 1. */
+/* Threshold_Watcher and associated classes' declaration and inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+class Threshold_Watcher;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 30. */
+#include <cassert>
+
+/*! \brief
+ A class of watchdogs controlling the exceeding of a threshold.
+
+ \tparam Traits
+ A class to set data types and functions for the threshold handling.
+ See \c Parma_Polyhedra_Library::Weightwatch_Traits for an example.
+*/
+template <typename Traits>
+class Parma_Polyhedra_Library::Threshold_Watcher {
+public:
+ template <typename Flag_Base, typename Flag>
+ Threshold_Watcher(const typename Traits::Delta& delta,
+ const Flag_Base* volatile& holder,
+ Flag& flag);
+
+ Threshold_Watcher(const typename Traits::Delta& delta,
+ void (*function)());
+
+ ~Threshold_Watcher();
+
+private:
+ typedef Implementation::Watchdog::Pending_List<Traits> TW_Pending_List;
+ typedef Implementation::Watchdog::Handler TW_Handler;
+
+ bool expired;
+ const TW_Handler& handler;
+ typename TW_Pending_List::iterator pending_position;
+
+ // Just to prevent their use.
+ Threshold_Watcher(const Threshold_Watcher&);
+ Threshold_Watcher& operator=(const Threshold_Watcher&);
+
+ struct Initialize {
+ //! The ordered queue of pending thresholds.
+ TW_Pending_List pending;
+ };
+ static Initialize init;
+
+ // Handle the addition of a new threshold.
+ static typename TW_Pending_List::iterator
+ add_threshold(typename Traits::Threshold threshold,
+ const TW_Handler& handler,
+ bool& expired_flag);
+
+ // Handle the removal of a threshold.
+ static typename TW_Pending_List::iterator
+ remove_threshold(typename TW_Pending_List::iterator position);
+
+ //! Check threshold reaching.
+ static void check();
+
+}; // class Parma_Polyhedra_Library::Threshold_Watcher
+
+
+// Templatic initialization of static data member.
+template <typename Traits>
+typename
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::Initialize
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::init;
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_inlines.hh line 1. */
+/* Threshold_Watcher and associated classes' implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+template <typename Flag_Base, typename Flag>
+Threshold_Watcher<Traits>
+::Threshold_Watcher(const typename Traits::Delta& delta,
+ const Flag_Base* volatile& holder,
+ Flag& flag)
+ : expired(false),
+ handler(*new
+ Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+ flag)) {
+ typename Traits::Threshold threshold;
+ Traits::from_delta(threshold, delta);
+ if (!Traits::less_than(Traits::get(), threshold))
+ throw std::invalid_argument("Threshold_Watcher constructor called with a"
+ " threshold already reached");
+ pending_position = add_threshold(threshold, handler, expired);
+}
+
+template <typename Traits>
+inline
+Threshold_Watcher<Traits>::Threshold_Watcher(const typename Traits::Delta& delta, void (*function)())
+ : expired(false),
+ handler(*new Implementation::Watchdog::Handler_Function(function)) {
+ typename Traits::Threshold threshold;
+ Traits::from_delta(threshold, delta);
+ if (!Traits::less_than(Traits::get(), threshold))
+ throw std::invalid_argument("Threshold_Watcher constructor called with a"
+ " threshold already reached");
+ pending_position = add_threshold(threshold, handler, expired);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_templates.hh line 1. */
+/* Threshold_Watcher and associated classes'.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>::add_threshold(typename Traits::Threshold threshold,
+ const TW_Handler& handler,
+ bool& expired_flag) {
+ Traits::check_function = Threshold_Watcher::check;
+ return init.pending.insert(threshold, handler, expired_flag);
+}
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>
+::remove_threshold(typename TW_Pending_List::iterator position) {
+ typename TW_Pending_List::iterator i = init.pending.erase(position);
+ if (init.pending.empty())
+ Traits::check_function = 0;
+ return i;
+}
+
+template <typename Traits>
+Threshold_Watcher<Traits>::~Threshold_Watcher() {
+ if (!expired)
+ remove_threshold(pending_position);
+ delete &handler;
+}
+
+template <typename Traits>
+void
+Threshold_Watcher<Traits>::check() {
+ typename TW_Pending_List::iterator i = init.pending.begin();
+ assert(i != init.pending.end());
+ const typename Traits::Threshold& current = Traits::get();
+ while (!Traits::less_than(current, i->deadline())) {
+ i->handler().act();
+ i->expired_flag() = true;
+ i = remove_threshold(i);
+ if (i == init.pending.end())
+ break;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 94. */
+
+
+
+//! Defined to 1 if PPL::Watchdog objects are supported, to 0 otherwise.
+#define PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED \
+ (PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION)
+
+#undef PPL_SPECIALIZE_ABS
+#undef PPL_SPECIALIZE_ADD
+#undef PPL_SPECIALIZE_ADD_MUL
+#undef PPL_SPECIALIZE_ASSIGN
+#undef PPL_SPECIALIZE_ASSIGN_SPECIAL
+#undef PPL_SPECIALIZE_CEIL
+#undef PPL_SPECIALIZE_CLASSIFY
+#undef PPL_SPECIALIZE_CMP
+#undef PPL_SPECIALIZE_CONSTRUCT
+#undef PPL_SPECIALIZE_CONSTRUCT_SPECIAL
+#undef PPL_SPECIALIZE_COPY
+#undef PPL_SPECIALIZE_DIV
+#undef PPL_SPECIALIZE_DIV2EXP
+#undef PPL_SPECIALIZE_FLOOR
+#undef PPL_SPECIALIZE_FUN1_0_0
+#undef PPL_SPECIALIZE_FUN1_0_1
+#undef PPL_SPECIALIZE_FUN1_0_2
+#undef PPL_SPECIALIZE_FUN1_0_3
+#undef PPL_SPECIALIZE_FUN1_1_1
+#undef PPL_SPECIALIZE_FUN1_1_2
+#undef PPL_SPECIALIZE_FUN1_2_2
+#undef PPL_SPECIALIZE_FUN2_0_0
+#undef PPL_SPECIALIZE_FUN2_0_1
+#undef PPL_SPECIALIZE_FUN2_0_2
+#undef PPL_SPECIALIZE_FUN3_0_1
+#undef PPL_SPECIALIZE_FUN5_0_1
+#undef PPL_SPECIALIZE_GCD
+#undef PPL_SPECIALIZE_GCDEXT
+#undef PPL_SPECIALIZE_IDIV
+#undef PPL_SPECIALIZE_INPUT
+#undef PPL_SPECIALIZE_IS_INT
+#undef PPL_SPECIALIZE_IS_MINF
+#undef PPL_SPECIALIZE_IS_NAN
+#undef PPL_SPECIALIZE_IS_PINF
+#undef PPL_SPECIALIZE_LCM
+#undef PPL_SPECIALIZE_MUL
+#undef PPL_SPECIALIZE_MUL2EXP
+#undef PPL_SPECIALIZE_NEG
+#undef PPL_SPECIALIZE_OUTPUT
+#undef PPL_SPECIALIZE_REM
+#undef PPL_SPECIALIZE_SGN
+#undef PPL_SPECIALIZE_SQRT
+#undef PPL_SPECIALIZE_SUB
+#undef PPL_SPECIALIZE_SUB_MUL
+#undef PPL_SPECIALIZE_TRUNC
+
+#undef PPL_COMPILE_TIME_CHECK
+#undef PPL_COMPILE_TIME_CHECK_AUX
+#undef PPL_COMPILE_TIME_CHECK_NAME
+
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
+#ifdef PPL_SAVE_NDEBUG
+# ifndef NDEBUG
+# define NDEBUG PPL_SAVE_NDEBUG
+# endif
+# undef PPL_SAVE_NDEBUG
+#else
+# ifdef NDEBUG
+# undef NDEBUG
+# endif
+#endif
+// Must include <cassert> again in order to make the latest changes to
+// NDEBUG effective.
+#include <cassert>
+
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
+
+#endif // !defined(PPL_ppl_hh)
diff --git a/src/ppl_header.hh b/src/ppl_header.hh
new file mode 100644
index 0000000..ca25513
--- /dev/null
+++ b/src/ppl_header.hh
@@ -0,0 +1,121 @@
+/* This is the header file of the Parma Polyhedra Library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG NDEBUG
+# undef NDEBUG
+#endif
+
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
+
+#include "ppl-config.h"
+#include "version.hh"
+#include "ppl_include_files.hh"
+
+//! Defined to 1 if PPL::Watchdog objects are supported, to 0 otherwise.
+#define PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED \
+ (PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION)
+
+#undef PPL_SPECIALIZE_ABS
+#undef PPL_SPECIALIZE_ADD
+#undef PPL_SPECIALIZE_ADD_MUL
+#undef PPL_SPECIALIZE_ASSIGN
+#undef PPL_SPECIALIZE_ASSIGN_SPECIAL
+#undef PPL_SPECIALIZE_CEIL
+#undef PPL_SPECIALIZE_CLASSIFY
+#undef PPL_SPECIALIZE_CMP
+#undef PPL_SPECIALIZE_CONSTRUCT
+#undef PPL_SPECIALIZE_CONSTRUCT_SPECIAL
+#undef PPL_SPECIALIZE_COPY
+#undef PPL_SPECIALIZE_DIV
+#undef PPL_SPECIALIZE_DIV2EXP
+#undef PPL_SPECIALIZE_FLOOR
+#undef PPL_SPECIALIZE_FUN1_0_0
+#undef PPL_SPECIALIZE_FUN1_0_1
+#undef PPL_SPECIALIZE_FUN1_0_2
+#undef PPL_SPECIALIZE_FUN1_0_3
+#undef PPL_SPECIALIZE_FUN1_1_1
+#undef PPL_SPECIALIZE_FUN1_1_2
+#undef PPL_SPECIALIZE_FUN1_2_2
+#undef PPL_SPECIALIZE_FUN2_0_0
+#undef PPL_SPECIALIZE_FUN2_0_1
+#undef PPL_SPECIALIZE_FUN2_0_2
+#undef PPL_SPECIALIZE_FUN3_0_1
+#undef PPL_SPECIALIZE_FUN5_0_1
+#undef PPL_SPECIALIZE_GCD
+#undef PPL_SPECIALIZE_GCDEXT
+#undef PPL_SPECIALIZE_IDIV
+#undef PPL_SPECIALIZE_INPUT
+#undef PPL_SPECIALIZE_IS_INT
+#undef PPL_SPECIALIZE_IS_MINF
+#undef PPL_SPECIALIZE_IS_NAN
+#undef PPL_SPECIALIZE_IS_PINF
+#undef PPL_SPECIALIZE_LCM
+#undef PPL_SPECIALIZE_MUL
+#undef PPL_SPECIALIZE_MUL2EXP
+#undef PPL_SPECIALIZE_NEG
+#undef PPL_SPECIALIZE_OUTPUT
+#undef PPL_SPECIALIZE_REM
+#undef PPL_SPECIALIZE_SGN
+#undef PPL_SPECIALIZE_SQRT
+#undef PPL_SPECIALIZE_SUB
+#undef PPL_SPECIALIZE_SUB_MUL
+#undef PPL_SPECIALIZE_TRUNC
+
+#undef PPL_COMPILE_TIME_CHECK
+#undef PPL_COMPILE_TIME_CHECK_AUX
+#undef PPL_COMPILE_TIME_CHECK_NAME
+
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
+#ifdef PPL_SAVE_NDEBUG
+# ifndef NDEBUG
+# define NDEBUG PPL_SAVE_NDEBUG
+# endif
+# undef PPL_SAVE_NDEBUG
+#else
+# ifdef NDEBUG
+# undef NDEBUG
+# endif
+#endif
+// Must include <cassert> again in order to make the latest changes to
+// NDEBUG effective.
+#include <cassert>
+#include "assert.hh"
+
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
+
+#endif // !defined(PPL_ppl_hh)
diff --git a/src/stdiobuf.cc b/src/stdiobuf.cc
new file mode 100644
index 0000000..318c07b
--- /dev/null
+++ b/src/stdiobuf.cc
@@ -0,0 +1,84 @@
+/* stdiobuf class implementation (non-inline functions).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "stdiobuf_defs.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+stdiobuf::int_type
+stdiobuf::uflow() {
+ unget_char_buf = getc(fp);
+ return unget_char_buf;
+}
+
+stdiobuf::int_type
+stdiobuf::underflow() {
+ const int_type c = getc(fp);
+ return ungetc(c, fp);
+}
+
+std::streamsize
+stdiobuf::xsgetn(char_type* s, std::streamsize n) {
+ PPL_ASSERT(n >= 0);
+ const size_t r = fread(s, 1, static_cast<size_t>(n), fp);
+ if (r > 0)
+ unget_char_buf = traits_type::to_int_type(s[r - 1]);
+ else
+ unget_char_buf = traits_type::eof();
+ return static_cast<std::streamsize>(r);
+}
+
+stdiobuf::int_type
+stdiobuf::pbackfail(int_type c) {
+ const int_type eof = traits_type::eof();
+ const int_type u = traits_type::eq_int_type(c, eof) ? unget_char_buf : c;
+ unget_char_buf = eof;
+ return traits_type::eq_int_type(u, eof) ? eof : ungetc(u, fp);
+}
+
+std::streamsize
+stdiobuf::xsputn(const char_type* s, std::streamsize n) {
+ PPL_ASSERT(n >= 0);
+ const size_t r = fwrite(s, 1, static_cast<size_t>(n), fp);
+ return static_cast<std::streamsize>(r);
+}
+
+stdiobuf::int_type
+stdiobuf::overflow(int_type c) {
+ const int_type eof = traits_type::eof();
+ if (traits_type::eq_int_type(c, eof))
+ return (fflush(fp) != 0) ? eof : traits_type::not_eof(c);
+ else
+ return putc(c, fp);
+}
+
+int
+stdiobuf::sync() {
+ return fflush(fp);
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/stdiobuf_defs.hh b/src/stdiobuf_defs.hh
new file mode 100644
index 0000000..103e480
--- /dev/null
+++ b/src/stdiobuf_defs.hh
@@ -0,0 +1,111 @@
+/* stdiobuf class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_stdiobuf_defs_hh
+#define PPL_stdiobuf_defs_hh 1
+
+#include "stdiobuf_types.hh"
+#include <cstdio>
+#include <streambuf>
+
+class Parma_Polyhedra_Library::stdiobuf
+ : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+ //! Constructor.
+ stdiobuf(FILE* file);
+
+protected:
+ /*! \brief
+ Gets a character in case of underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type underflow();
+
+ /*! \brief
+ In case of underflow, gets a character and advances the next pointer.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual int_type uflow();
+
+ /*! \brief
+ Gets a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+ /*! \brief
+ Puts character back in case of backup underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+ */
+ virtual int_type pbackfail(int_type c = traits_type::eof());
+
+ /*! \brief
+ Writes a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+ /*! \brief
+ Writes a character in case of overflow.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ virtual int_type overflow(int_type c);
+
+ /*! \brief
+ Synchronizes the stream buffer.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+ */
+ virtual int sync();
+
+private:
+ //! Character type of the streambuf.
+ typedef char char_type;
+
+ //! Traits type of the streambuf.
+ typedef std::char_traits<char_type> traits_type;
+
+ //! Integer type of the streambuf.
+ typedef traits_type::int_type int_type;
+
+ //! The encapsulated stdio file.
+ FILE* fp;
+
+ //! Buffer for the last character read.
+ int_type unget_char_buf;
+};
+
+#include "stdiobuf_inlines.hh"
+
+#endif // !defined(PPL_stdiobuf_defs_hh)
diff --git a/src/stdiobuf_inlines.hh b/src/stdiobuf_inlines.hh
new file mode 100644
index 0000000..53b8c44
--- /dev/null
+++ b/src/stdiobuf_inlines.hh
@@ -0,0 +1,36 @@
+/* stdiobuf class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_stdiobuf_inlines_hh
+#define PPL_stdiobuf_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+stdiobuf::stdiobuf(FILE* file)
+ : fp(file), unget_char_buf(traits_type::eof()) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_stdiobuf_inlines_hh)
diff --git a/src/stdiobuf_types.hh b/src/stdiobuf_types.hh
new file mode 100644
index 0000000..f028d2a
--- /dev/null
+++ b/src/stdiobuf_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_stdiobuf_types_hh
+#define PPL_stdiobuf_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class stdiobuf;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_stdiobuf_types_hh)
diff --git a/src/swapping_sort_templates.hh b/src/swapping_sort_templates.hh
new file mode 100644
index 0000000..6535621
--- /dev/null
+++ b/src/swapping_sort_templates.hh
@@ -0,0 +1,179 @@
+/* Sorting objects for which copies cost more than swaps.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_swapping_sort_templates_hh
+#define PPL_swapping_sort_templates_hh 1
+
+#include <vector>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename RA_Container, typename Compare>
+struct Indirect_Sort_Compare {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Sort_Compare(const RA_Container& cont,
+ size_type base = 0,
+ Compare comp = Compare())
+ : container(cont), base_index(base), compare(comp) {
+ }
+
+ bool operator()(size_type i, size_type j) const {
+ return compare(container[base_index + i], container[base_index + j]);
+ }
+
+ const RA_Container& container;
+ const size_type base_index;
+ const Compare compare;
+}; // struct Indirect_Sort_Compare
+
+template <typename RA_Container>
+struct Indirect_Unique_Compare {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Unique_Compare(const RA_Container& cont, size_type base = 0)
+ : container(cont), base_index(base) {
+ }
+
+ bool operator()(size_type i, size_type j) const {
+ return container[base_index + i] == container[base_index + j];
+ }
+
+ const RA_Container& container;
+ const size_type base_index;
+}; // struct Indirect_Unique_Compare
+
+template <typename RA_Container>
+struct Indirect_Swapper {
+ typedef typename RA_Container::size_type size_type;
+
+ Indirect_Swapper(RA_Container& cont, size_type base = 0)
+ : container(cont), base_index(base) {
+ }
+
+ void operator()(size_type i, size_type j) const {
+ using std::swap;
+ swap(container[base_index + i], container[base_index + j]);
+ }
+
+ RA_Container& container;
+ const size_type base_index;
+}; // struct Indirect_Swapper
+
+template <typename RA_Container1, typename RA_Container2>
+struct Indirect_Swapper2 {
+ typedef typename RA_Container1::size_type size_type;
+
+ Indirect_Swapper2(RA_Container1& cont1, RA_Container2& cont2)
+ : container1(cont1), container2(cont2) {
+ }
+
+ void operator()(size_type i, size_type j) const {
+ using std::swap;
+ swap(container1[i], container1[j]);
+ swap(container2[i], container2[j]);
+ }
+
+ RA_Container1& container1;
+ RA_Container2& container2;
+}; // struct Indirect_Swapper2
+
+template <typename Sort_Comparer, typename Unique_Comparer, typename Swapper>
+typename Sort_Comparer::size_type
+indirect_sort_and_unique(typename Sort_Comparer::size_type num_elems,
+ Sort_Comparer sort_cmp,
+ Unique_Comparer unique_cmp,
+ Swapper indirect_swap) {
+ typedef typename Sort_Comparer::size_type index_type;
+ // `iv' is a vector of indices for the portion of rows to be sorted.
+ PPL_ASSERT(num_elems >= 2);
+ std::vector<index_type> iv;
+ iv.reserve(num_elems);
+ for (index_type i = 0, i_end = num_elems; i != i_end; ++i)
+ iv.push_back(i);
+
+ typedef typename std::vector<index_type>::iterator Iter;
+ const Iter iv_begin = iv.begin();
+ Iter iv_end = iv.end();
+
+ // Sort `iv' by comparing the rows indexed by its elements.
+ std::sort(iv_begin, iv_end, sort_cmp);
+
+ // Swap the indexed rows according to `iv':
+ // for each index `i', the element that should be placed in
+ // position dst = i is the one placed in position src = iv[i].
+ for (index_type i = num_elems; i-- > 0; ) {
+ if (i != iv[i]) {
+ index_type dst = i;
+ index_type src = iv[i];
+ do {
+ indirect_swap(src, dst);
+ iv[dst] = dst;
+ dst = src;
+ src = iv[dst];
+ } while (i != src);
+ iv[dst] = dst;
+ }
+ }
+
+ // Restore `iv' indices to 0 .. num_elems-1 for the call to unique.
+ for (index_type i = num_elems; i-- > 0; )
+ iv[i] = i;
+
+ // Unique `iv' by comparing the rows indexed by its elements.
+ iv_end = std::unique(iv_begin, iv_end, unique_cmp);
+
+ const index_type num_sorted = static_cast<index_type>(iv_end - iv_begin);
+ const index_type num_duplicates = num_elems - num_sorted;
+ if (num_duplicates == 0)
+ return 0;
+
+ // There were duplicates: swap the rows according to `iv'.
+ index_type dst = 0;
+ while (dst < num_sorted && dst == iv[dst])
+ ++dst;
+ if (dst == num_sorted)
+ return num_duplicates;
+ do {
+ const index_type src = iv[dst];
+ indirect_swap(src, dst);
+ ++dst;
+ }
+ while (dst < num_sorted);
+ return num_duplicates;
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+ return swapping_unique(first, last, std::iter_swap<Iter, Iter>);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_swapping_sort_templates_hh)
diff --git a/src/termination.cc b/src/termination.cc
new file mode 100644
index 0000000..18e7abd
--- /dev/null
+++ b/src/termination.cc
@@ -0,0 +1,935 @@
+/* Utilities for termination analysis: non-inline, non-template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "termination_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+ Constraint_System& cs_out) {
+ if (cs_in.has_strict_inequalities() || cs_in.has_equalities()) {
+ // Here we have some strict inequality and/or equality constraints:
+ // translate them into non-strict inequality constraints.
+ for (Constraint_System::const_iterator i = cs_in.begin(),
+ i_end = cs_in.end(); i != i_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality()) {
+ // Insert the two corresponding opposing inequalities.
+ const Linear_Expression expr(c.expression());
+ cs_out.insert(expr >= 0);
+ cs_out.insert(expr <= 0);
+ }
+ else if (c.is_strict_inequality()) {
+ // Insert the non-strict approximation.
+ const Linear_Expression expr(c.expression());
+ cs_out.insert(expr >= 0);
+ }
+ else
+ // Insert as is.
+ cs_out.insert(c);
+ }
+ }
+ else
+ // No strict inequality and no equality constraints.
+ cs_out = cs_in;
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+ Constraint_System& cs) {
+ const Constraint_System& ph_cs = ph.minimized_constraints();
+ if (ph_cs.has_equalities()) {
+ // Translate equalities into inequalities.
+ for (Constraint_System::const_iterator i = ph_cs.begin(),
+ i_end = ph_cs.end(); i != i_end; ++i) {
+ const Constraint& c = *i;
+ if (c.is_equality()) {
+ // Insert the two corresponding opposing inequalities.
+ const Linear_Expression expr(c.expression());
+ cs.insert(expr >= 0);
+ cs.insert(expr <= 0);
+ }
+ else
+ // Insert as is.
+ cs.insert(c);
+ }
+ }
+ else
+ // No equality constraints (and no strict inequalities).
+ cs = ph_cs;
+}
+
+/*! \brief
+ Fill the constraint system(s) for the application of the
+ Mesnard and Serebrenik improved termination tests.
+
+ \param cs
+ The input constraint system, where variables indices are allocated
+ as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$.
+ .
+ The system does not contain any equality.
+
+ \param cs_out1
+ The first output constraint system.
+
+ \param cs_out2
+ The second output constraint system, if any: it may be an alias
+ for \p cs_out1.
+
+ The allocation of variable indices in the output constraint
+ systems \p cs_out1 and \p cs_out2 is as follows,
+ where \f$m\f$ is the number of constraints in \p cs:
+ - \f$ \mu_1, \ldots, \mu_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$;
+ - \f$ \mu_0\f$ goes onto space dimension \f$ n \f$;
+ - \f$ y_1, \ldots, y_m \f$ go onto space dimensions
+ \f$ n+1, \ldots, n+m \f$;
+ .
+ if we use the same constraint system, that is
+ <CODE>&cs_out1 == &cs_out2</CODE>, then
+ - \f$ z_1, ..., z_m, z_{m+1}, z_{m+2} \f$ go onto space dimensions
+ \f$ n+m+1, ..., n+2*m+2 \f$;
+ .
+ otherwise
+ - \f$ z_1, ..., z_m, z_{m+1}, z_{m+2} \f$ go onto space dimensions
+ \f$ n+1, ..., n+m+2 \f$.
+*/
+void
+fill_constraint_systems_MS(const Constraint_System& cs,
+ Constraint_System& cs_out1,
+ Constraint_System& cs_out2) {
+ PPL_ASSERT(cs.space_dimension() % 2 == 0);
+ const dimension_type n = cs.space_dimension() / 2;
+ const dimension_type m = num_constraints(cs);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_MS);
+
+ output_function_MS_n = n;
+ output_function_MS_m = m;
+
+ std::cout << "*** cs ***" << std::endl;
+ output_function_MS_which = 0;
+ using namespace IO_Operators;
+ std::cout << cs << std::endl;
+#endif
+
+ const dimension_type y_begin = n+1;
+ const dimension_type z_begin = y_begin + ((&cs_out1 == &cs_out2) ? m : 0);
+
+ // Make sure linear expressions have the correct space dimension.
+ Linear_Expression y_le;
+ y_le.set_space_dimension(y_begin + m);
+ Linear_Expression z_le;
+ z_le.set_space_dimension(z_begin + m + 2);
+ std::vector<Linear_Expression> y_les(2*n, y_le);
+ std::vector<Linear_Expression> z_les(2*n + 1, z_le);
+
+ dimension_type y = y_begin;
+ dimension_type z = z_begin;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Variable v_y(y);
+ const Variable v_z(z);
+ ++y;
+ ++z;
+ cs_out1.insert(v_y >= 0);
+ cs_out2.insert(v_z >= 0);
+ const Constraint& c_i = *i;
+ Coefficient_traits::const_reference b_i = c_i.inhomogeneous_term();
+ if (b_i != 0) {
+ // Note that b_i is to the left ot the relation sign, hence here
+ // we have -= and not += just to avoid negating b_i.
+ sub_mul_assign(y_le, b_i, v_y);
+ sub_mul_assign(z_le, b_i, v_z);
+ }
+ for (Constraint::expr_type::const_iterator j = c_i.expression().begin(),
+ j_end = c_i.expression().end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference a_i_j = *j;
+ const Variable v = j.variable();
+ add_mul_assign(y_les[v.id()], a_i_j, v_y);
+ add_mul_assign(z_les[v.id()], a_i_j, v_z);
+ }
+ }
+ z_le += Variable(z);
+ z_les[2*n] += Variable(z);
+ cs_out2.insert(Variable(z) >= 0);
+ ++z;
+ z_le -= Variable(z);
+ z_les[2*n] -= Variable(z);
+ cs_out2.insert(Variable(z) >= 0);
+ cs_out1.insert(y_le >= 1);
+ cs_out2.insert(z_le >= 0);
+ dimension_type j = 2*n;
+ while (j-- > n) {
+ cs_out1.insert(y_les[j] == Variable(j-n));
+ cs_out2.insert(z_les[j] == Variable(j-n));
+ }
+ ++j;
+ while (j-- > 0) {
+ cs_out1.insert(y_les[j] == -Variable(j));
+ cs_out2.insert(z_les[j] == 0);
+ }
+ cs_out2.insert(z_les[2*n] == Variable(n));
+
+#if PRINT_DEBUG_INFO
+ if (&cs_out1 == &cs_out2) {
+ std::cout << "*** cs_mip ***" << std::endl;
+ output_function_MS_which = 3;
+ using namespace IO_Operators;
+ std::cout << cs_mip << std::endl;
+ }
+ else {
+ std::cout << "*** cs_out1 ***" << std::endl;
+ output_function_MS_which = 1;
+ using namespace IO_Operators;
+ std::cout << cs_out1 << std::endl;
+
+ std::cout << "*** cs_out2 ***" << std::endl;
+ output_function_MS_which = 2;
+ using namespace IO_Operators;
+ std::cout << cs_out2 << std::endl;
+ }
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+}
+
+/*! \brief
+ Fill the constraint system(s) for the application of the
+ Podelski and Rybalchenko improved termination tests.
+
+ \param cs_before
+ The input constraint system describing the state <EM>before</EM>
+ the execution of the loop body, where variables indices are allocated
+ as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+ .
+ The system does not contain any equality.
+
+ \param cs_after
+ The input constraint system describing the state <EM>after</EM>
+ the execution of the loop body, where variables indices are allocated
+ as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$.
+ .
+ The system does not contain any equality.
+
+ \param cs_out
+ The output constraint system, where variables indices are allocated
+ as follows:
+ - \f$ u_3 \f$ goes onto space dimensions \f$ 0, \ldots, s-1 \f$;
+ - \f$ u_2 \f$ goes onto space dimensions \f$ s, \ldots, s+r-1 \f$;
+ - \f$ u_1 \f$ goes onto space dimensions \f$ s+r, \ldots, s+2r-1 \f$.
+
+ The improved Podelski-Rybalchenko method described in the paper
+ is based on a loop encoding of the form
+ \f[
+ \begin{pmatrix}
+ A_B & \vect{0} \\
+ A_C & A'_C
+ \end{pmatrix}
+ \begin{pmatrix}
+ \vect{x} \\ \vect{x}'
+ \end{pmatrix}
+ \leq
+ \begin{pmatrix}
+ \vect{b}_B \\ \vect{b}_C
+ \end{pmatrix},
+ \f]
+ where
+ \f$ A_B \in \Qset^{r \times n} \f$,
+ \f$ A_C \in \Qset^{s \times n} \f$,
+ \f$ A'_C \in \Qset^{s \times n} \f$,
+ \f$ \vect{b}_B \in \Qset^r \f$,
+ \f$ \vect{b}_C \in \Qset^s \f$.
+ The corresponding system is:
+ \f[
+ \begin{aligned}
+ (\vect{v}_1-\vect{v}_2)^\transpose A_B
+ - \vect{v}_3^\transpose A_C
+ &= \vect{0}^\transpose, \\
+ \vect{v}_2^\transpose A_B
+ + \vect{v}_3^\transpose (A_C+A_C')
+ &= \vect{0}^\transpose, \\
+ \vect{v}_2 \vect{b}_B + \vect{v}_3 \vect{b}_C
+ &< 0,
+ \end{aligned}
+ \f]
+ where \f$ \vect{v}_1 \in \Qset_+^r \f$, \f$ \vect{v}_2 \in \Qset_+^r \f$,
+ \f$ \vect{v}_3 \in \Qset_+^s \f$.
+ The space of ranking functions is then spanned by
+ \f$ \vect{v}_3^\transpose A_C' \vect x \f$.
+
+ In contrast, our encoding is of the form
+ \f[
+ \begin{pmatrix}
+ \vect{0} & E_B \\
+ E'_C & E_C
+ \end{pmatrix}
+ \begin{pmatrix}
+ \vect{x}' \\ \vect{x}
+ \end{pmatrix}
+ +
+ \begin{pmatrix}
+ \vect{d}_B \\ \vect{d}_C
+ \end{pmatrix}
+ \geq
+ \vect{0},
+ \f]
+ where \f$ {E}_B = -{A}_B \f$, \f$ {E}_C = -{A}_C \f$,
+ \f$ {E}'_C = -{A}'_C \f$, \f$ \vect{d}_B = \vect{b}_B \f$
+ and \f$ \vect{d}_C = \vect{b}_C \f$.
+ The corresponding system is:
+ \f[
+ \begin{aligned}
+ (\vect{u}_1-\vect{u}_2)^\transpose E_B
+ - \vect{u}_3^\transpose E_C
+ &= \vect{0}^\transpose, \\
+ \vect{u}_2^\transpose E_B
+ + \vect{u}_3^\transpose (E_C+E_C')
+ &= \vect{0}^\transpose, \\
+ \vect{u}_2 \vect{d}_B + \vect{u}_3 \vect{d}_C
+ &> 0,
+ \end{aligned}
+ \f]
+ where \f$ \vect{u}_1 \in \Qset_-^r \f$, \f$ \vect{u}_2 \in \Qset_-^r \f$,
+ \f$ \vect{u}_3 \in \Qset_-^s \f$.
+ The space of ranking functions is then spanned by
+ \f$ \vect{u}_3^\transpose E_C' \vect x \f$.
+
+ \param le_out
+ The expression to be minimized in the context of \p cs_out:
+ a value of \f$ -1 \f$ or less entails termination.
+*/
+void
+fill_constraint_system_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Constraint_System& cs_out,
+ Linear_Expression& le_out) {
+ PPL_ASSERT(cs_after.space_dimension() % 2 == 0);
+ PPL_ASSERT(2*cs_before.space_dimension() == cs_after.space_dimension());
+ const dimension_type n = cs_before.space_dimension();
+ const dimension_type r = num_constraints(cs_before);
+ const dimension_type s = num_constraints(cs_after);
+ const dimension_type m = r + s;
+
+ // Make sure linear expressions are not reallocated multiple times.
+ if (m > 0)
+ le_out.set_space_dimension(m + r);
+ std::vector<Linear_Expression> les_eq(2*n, le_out);
+
+ dimension_type row_index = 0;
+ for (Constraint_System::const_iterator i = cs_before.begin(),
+ cs_before_end = cs_before.end();
+ i != cs_before_end;
+ ++i, ++row_index) {
+ const Variable u1_i(m + row_index);
+ const Variable u2_i(s + row_index);
+ const Constraint::expr_type e_i = i->expression();
+ for (Constraint::expr_type::const_iterator
+ j = e_i.begin(), j_end = e_i.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference A_ij_B = *j;
+ const Variable v = j.variable();
+ // (u1 - u2) A_B, in the context of j-th constraint.
+ add_mul_assign(les_eq[v.id()], A_ij_B, u1_i);
+ sub_mul_assign(les_eq[v.id()], A_ij_B, u2_i);
+ // u2 A_B, in the context of (j+n)-th constraint.
+ add_mul_assign(les_eq[v.id() + n], A_ij_B, u2_i);
+ }
+ Coefficient_traits::const_reference b_B = e_i.inhomogeneous_term();
+ if (b_B != 0)
+ // u2 b_B, in the context of the strict inequality constraint.
+ add_mul_assign(le_out, b_B, u2_i);
+ }
+
+ row_index = 0;
+ for (Constraint_System::const_iterator i = cs_after.begin(),
+ cs_after_end = cs_after.end();
+ i != cs_after_end;
+ ++i, ++row_index) {
+ const Variable u3_i(row_index);
+ const Constraint::expr_type e_i = i->expression();
+ for (Constraint::expr_type::const_iterator
+ j = e_i.lower_bound(Variable(n)),
+ j_end = e_i.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference A_ij_C = *j;
+ const Variable v = j.variable();
+ // - u3 A_C, in the context of the j-th constraint.
+ sub_mul_assign(les_eq[v.id() - n], A_ij_C, u3_i);
+ // u3 A_C, in the context of the (j+n)-th constraint.
+ add_mul_assign(les_eq[v.id()], A_ij_C, u3_i);
+ }
+ for (Constraint::expr_type::const_iterator j = e_i.begin(),
+ j_end = e_i.lower_bound(Variable(n)); j != j_end; ++j) {
+ Coefficient_traits::const_reference Ap_ij_C = *j;
+ // u3 Ap_C, in the context of the (j+n)-th constraint.
+ add_mul_assign(les_eq[j.variable().id() + n], Ap_ij_C, u3_i);
+ }
+ Coefficient_traits::const_reference b_C = e_i.inhomogeneous_term();
+ if (b_C != 0)
+ // u3 b_C, in the context of the strict inequality constraint.
+ add_mul_assign(le_out, b_C, u3_i);
+ }
+
+ // Add the nonnegativity constraints for u_1, u_2 and u_3.
+ for (dimension_type i = s + 2*r; i-- > 0; )
+ cs_out.insert(Variable(i) >= 0);
+
+ for (dimension_type j = 2*n; j-- > 0; )
+ cs_out.insert(les_eq[j] == 0);
+}
+
+void
+fill_constraint_system_PR_original(const Constraint_System& cs,
+ Constraint_System& cs_out,
+ Linear_Expression& le_out) {
+ PPL_ASSERT(cs.space_dimension() % 2 == 0);
+ const dimension_type n = cs.space_dimension() / 2;
+ const dimension_type m = num_constraints(cs);
+
+ // Make sure linear expressions are not reallocated multiple times.
+ if (m > 0)
+ le_out.set_space_dimension(2*m);
+ std::vector<Linear_Expression> les_eq(3*n, le_out);
+
+ dimension_type row_index = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+ const Constraint::expr_type e_i = i->expression();
+ const Variable lambda1_i(row_index);
+ const Variable lambda2_i(m + row_index);
+ for (Constraint::expr_type::const_iterator j = e_i.begin(),
+ j_end = e_i.lower_bound(Variable(n)); j != j_end; ++j) {
+ Coefficient_traits::const_reference Ap_ij = *j;
+ const Variable v = j.variable();
+ // lambda_1 A'
+ add_mul_assign(les_eq[v.id()], Ap_ij, lambda1_i);
+ // lambda_2 A'
+ add_mul_assign(les_eq[v.id()+n+n], Ap_ij, lambda2_i);
+ }
+ for (Constraint::expr_type::const_iterator
+ j = e_i.lower_bound(Variable(n)),
+ j_end = e_i.end(); j != j_end; ++j) {
+ Coefficient_traits::const_reference A_ij = *j;
+ const Variable v = j.variable();
+ // (lambda_1 - lambda_2) A
+ add_mul_assign(les_eq[v.id()], A_ij, lambda1_i);
+ sub_mul_assign(les_eq[v.id()], A_ij, lambda2_i);
+ // lambda_2 A
+ add_mul_assign(les_eq[v.id()+n], A_ij, lambda2_i);
+ }
+ Coefficient_traits::const_reference b = e_i.inhomogeneous_term();
+ if (b != 0)
+ // lambda2 b
+ add_mul_assign(le_out, b, lambda2_i);
+ }
+
+ // Add the non-negativity constraints for lambda_1 and lambda_2.
+ for (dimension_type i = 2*m; i-- > 0; )
+ cs_out.insert(Variable(i) >= 0);
+
+ for (dimension_type j = 3*n; j-- > 0; )
+ cs_out.insert(les_eq[j] == 0);
+}
+
+bool
+termination_test_MS(const Constraint_System& cs) {
+ Constraint_System cs_mip;
+ fill_constraint_systems_MS(cs, cs_mip, cs_mip);
+
+ const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+ return mip.is_satisfiable();
+}
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs, Generator& mu) {
+ Constraint_System cs_mip;
+ fill_constraint_systems_MS(cs, cs_mip, cs_mip);
+
+ const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+ if (!mip.is_satisfiable())
+ return false;
+
+ const Generator fp = mip.feasible_point();
+ PPL_ASSERT(fp.is_point());
+ const dimension_type n = cs.space_dimension() / 2;
+ const Linear_Expression le(fp.expression(), n + 1);
+ mu = point(le, fp.divisor());
+ return true;
+}
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& mu_space) {
+ Constraint_System cs_out1;
+ Constraint_System cs_out2;
+ fill_constraint_systems_MS(cs, cs_out1, cs_out2);
+
+ C_Polyhedron ph1(cs_out1);
+ C_Polyhedron ph2(cs_out2);
+ const dimension_type n = cs.space_dimension() / 2;
+ ph1.remove_higher_space_dimensions(n);
+ ph1.add_space_dimensions_and_embed(1);
+ ph2.remove_higher_space_dimensions(n+1);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_MS);
+
+ output_function_MS_n = n;
+ output_function_MS_m = num_constraints(cs);
+
+ std::cout << "*** ph1 projected ***" << std::endl;
+ output_function_MS_which = 4;
+ using namespace IO_Operators;
+ std::cout << ph1.minimized_constraints() << std::endl;
+
+ std::cout << "*** ph2 projected ***" << std::endl;
+ std::cout << ph2.minimized_constraints() << std::endl;
+#endif
+
+ ph1.intersection_assign(ph2);
+
+#if PRINT_DEBUG_INFO
+ std::cout << "*** intersection ***" << std::endl;
+ using namespace IO_Operators;
+ std::cout << ph1.minimized_constraints() << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ mu_space.m_swap(ph1);
+}
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space) {
+ Constraint_System cs_out1;
+ Constraint_System cs_out2;
+ fill_constraint_systems_MS(cs, cs_out1, cs_out2);
+
+ C_Polyhedron ph1(cs_out1);
+ C_Polyhedron ph2(cs_out2);
+ const dimension_type n = cs.space_dimension() / 2;
+ ph1.remove_higher_space_dimensions(n);
+ ph1.add_space_dimensions_and_embed(1);
+ ph2.remove_higher_space_dimensions(n+1);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_MS);
+
+ output_function_MS_n = n;
+ output_function_MS_m = num_constraints(cs);
+
+ std::cout << "*** ph1 projected ***" << std::endl;
+ output_function_MS_which = 4;
+ using namespace IO_Operators;
+ std::cout << ph1.minimized_constraints() << std::endl;
+
+ std::cout << "*** ph2 projected ***" << std::endl;
+ std::cout << ph2.minimized_constraints() << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ decreasing_mu_space.m_swap(ph1);
+ bounded_mu_space.m_swap(ph2);
+}
+
+bool
+termination_test_PR_original(const Constraint_System& cs) {
+ PPL_ASSERT(cs.space_dimension() % 2 == 0);
+
+ Constraint_System cs_mip;
+ Linear_Expression le_ineq;
+ fill_constraint_system_PR_original(cs, cs_mip, le_ineq);
+
+ // Turn minimization problem into satisfiability.
+ cs_mip.insert(le_ineq <= -1);
+
+ const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+ return mip.is_satisfiable();
+}
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after) {
+ Constraint_System cs_mip;
+ Linear_Expression le_ineq;
+ fill_constraint_system_PR(cs_before, cs_after, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_PR);
+
+ output_function_PR_r = num_constraints(cs_before);
+ output_function_PR_s = num_constraints(cs_after);
+
+ std::cout << "*** cs_mip ***" << std::endl;
+ using namespace IO_Operators;
+ std::cout << cs_mip << std::endl;
+ std::cout << "*** le_ineq ***" << std::endl;
+ std::cout << le_ineq << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ // Turn minimization problem into satisfiability.
+ cs_mip.insert(le_ineq <= -1);
+
+ const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+ return mip.is_satisfiable();
+}
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu) {
+ return Termination_Helpers
+ ::one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu) {
+ return Termination_Helpers::one_affine_ranking_function_PR_original(cs, mu);
+}
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space) {
+ Termination_Helpers::all_affine_ranking_functions_PR(cs_before, cs_after,
+ mu_space);
+}
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space) {
+ Termination_Helpers::all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Termination
+
+} // namespace Implementation
+
+bool
+Termination_Helpers
+::one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu) {
+ Constraint_System cs_mip;
+ Linear_Expression le_ineq;
+ Parma_Polyhedra_Library::Implementation::Termination
+ ::fill_constraint_system_PR(cs_before, cs_after, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_PR);
+
+ output_function_PR_r = num_constraints(cs_before);
+ output_function_PR_s = num_constraints(cs_after);
+
+ std::cout << "*** cs_mip ***" << std::endl;
+ using namespace IO_Operators;
+ std::cout << cs_mip << std::endl;
+ std::cout << "*** le_ineq ***" << std::endl;
+ std::cout << le_ineq << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ // Turn minimization problem into satisfiability.
+ cs_mip.insert(le_ineq <= -1);
+
+ const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+ if (!mip.is_satisfiable())
+ return false;
+
+ const Generator& fp = mip.feasible_point();
+ PPL_ASSERT(fp.is_point());
+
+ // u_3 corresponds to space dimensions 0, ..., s - 1.
+ const dimension_type n = cs_before.space_dimension();
+ // mu_0 is zero: properly set space dimension.
+ Linear_Expression le;
+ le.set_space_dimension(1 + n);
+ // Multiply u_3 by E'_C to obtain mu_1, ..., mu_n.
+ dimension_type row_index = 0;
+ for (Constraint_System::const_iterator i = cs_after.begin(),
+ cs_after_end = cs_after.end();
+ i != cs_after_end;
+ ++i, ++row_index) {
+ Coefficient_traits::const_reference
+ fp_i = fp.coefficient(Variable(row_index));
+ if (fp_i != 0)
+ le.linear_combine(i->expr, 1, -fp_i, 1, n + 1);
+ }
+ // Note that we can neglect the divisor of `fp' since it is positive.
+ mu = point(le);
+ return true;
+}
+
+bool
+Termination_Helpers
+::one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu) {
+ PPL_ASSERT(cs.space_dimension() % 2 == 0);
+ const dimension_type n = cs.space_dimension() / 2;
+ const dimension_type m = Implementation::num_constraints(cs);
+
+ Constraint_System cs_mip;
+ Linear_Expression le_ineq;
+ Parma_Polyhedra_Library::Implementation::Termination
+ ::fill_constraint_system_PR_original(cs, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+ std::cout << "*** cs_mip ***" << std::endl;
+ using namespace IO_Operators;
+ std::cout << cs_mip << std::endl;
+ std::cout << "*** le_ineq ***" << std::endl;
+ std::cout << le_ineq << std::endl;
+#endif
+
+ // Turn minimization problem into satisfiability.
+ cs_mip.insert(le_ineq <= -1);
+
+ const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+ if (!mip.is_satisfiable())
+ return false;
+
+ const Generator& fp = mip.feasible_point();
+ PPL_ASSERT(fp.is_point());
+ // mu_0 is zero: properly set space dimension.
+ Linear_Expression le;
+ le.set_space_dimension(1 + n);
+ // Multiply -lambda_2 by A' to obtain mu_1, ..., mu_n.
+ // lambda_2 corresponds to space dimensions m, ..., 2*m - 1.
+ dimension_type row_index = m;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+ const Variable lambda_2(row_index);
+ Coefficient_traits::const_reference fp_i = fp.coefficient(lambda_2);
+ if (fp_i != 0)
+ le.linear_combine(i->expr, 1, -fp_i, 1, n + 1);
+ }
+ // Note that we can neglect the divisor of `fp' since it is positive.
+ mu = point(le);
+ return true;
+}
+
+void
+Termination_Helpers
+::all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space) {
+ Constraint_System cs_eqs;
+ Linear_Expression le_ineq;
+ Parma_Polyhedra_Library::Implementation::Termination
+ ::fill_constraint_system_PR(cs_before, cs_after, cs_eqs, le_ineq);
+
+#if PRINT_DEBUG_INFO
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+ Variable::set_output_function(output_function_PR);
+
+ output_function_PR_r = num_constraints(cs_before);
+ output_function_PR_s = num_constraints(cs_after);
+
+ std::cout << "*** cs_eqs ***" << std::endl;
+ using namespace IO_Operators;
+ std::cout << cs_eqs << std::endl;
+ std::cout << "*** le_ineq ***" << std::endl;
+ std::cout << le_ineq << std::endl;
+#endif
+
+ NNC_Polyhedron ph(cs_eqs);
+ ph.add_constraint(le_ineq < 0);
+ // u_3 corresponds to space dimensions 0, ..., s - 1.
+ const dimension_type s = Implementation::num_constraints(cs_after);
+ ph.remove_higher_space_dimensions(s);
+
+#if PRINT_DEBUG_INFO
+ std::cout << "*** ph ***" << std::endl;
+ std::cout << ph << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ const dimension_type n = cs_before.space_dimension();
+
+ const Generator_System& gs_in = ph.generators();
+ Generator_System gs_out;
+ Generator_System::const_iterator gs_in_it = gs_in.begin();
+ Generator_System::const_iterator gs_in_end = gs_in.end();
+ if (gs_in_it == gs_in_end)
+ // The system is unsatisfiable.
+ mu_space = NNC_Polyhedron(n + 1, EMPTY);
+ else {
+ for ( ; gs_in_it != gs_in_end; ++gs_in_it) {
+ const Generator& g = *gs_in_it;
+ Linear_Expression le;
+ le.set_space_dimension(n);
+ // Set le to the multiplication of Linear_Expression(g) by E'_C.
+ dimension_type row_index = 0;
+ for (Constraint_System::const_iterator i = cs_after.begin(),
+ cs_after_end = cs_after.end();
+ i != cs_after_end;
+ ++i, ++row_index) {
+ Coefficient_traits::const_reference
+ g_i = g.coefficient(Variable(row_index));
+ if (g_i != 0)
+ le.linear_combine(i->expr, 1, -g_i, 1, n + 1);
+ }
+
+ // Add to gs_out the transformed generator.
+ switch (g.type()) {
+ case Generator::LINE:
+ if (!le.all_homogeneous_terms_are_zero())
+ gs_out.insert(line(le));
+ break;
+ case Generator::RAY:
+ if (!le.all_homogeneous_terms_are_zero())
+ gs_out.insert(ray(le));
+ break;
+ case Generator::POINT:
+ gs_out.insert(point(le, g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ gs_out.insert(closure_point(le, g.divisor()));
+ break;
+ }
+ }
+
+ mu_space = NNC_Polyhedron(gs_out);
+ // mu_0 is zero.
+ mu_space.add_space_dimensions_and_embed(1);
+ }
+}
+
+void
+Termination_Helpers
+::all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space) {
+ PPL_ASSERT(cs.space_dimension() % 2 == 0);
+ const dimension_type n = cs.space_dimension() / 2;
+ const dimension_type m = Implementation::num_constraints(cs);
+
+ if (m == 0) {
+ // If there are no constraints at all, we have non-termination,
+ // i.e., no affine ranking function at all.
+ mu_space = NNC_Polyhedron(n + 1, EMPTY);
+ return;
+ }
+
+ Constraint_System cs_eqs;
+ Linear_Expression le_ineq;
+ Parma_Polyhedra_Library::Implementation::Termination
+ ::fill_constraint_system_PR_original(cs, cs_eqs, le_ineq);
+
+ NNC_Polyhedron ph(cs_eqs);
+ ph.add_constraint(le_ineq < 0);
+ // lambda_2 corresponds to space dimensions m, ..., 2*m-1.
+ const Variables_Set lambda1(Variable(0), Variable(m-1));
+ ph.remove_space_dimensions(lambda1);
+
+#if PRINT_DEBUG_INFO
+ std::cout << "*** ph ***" << std::endl;
+ std::cout << ph << std::endl;
+
+ Variable::set_output_function(p_default_output_function);
+#endif
+
+ const Generator_System& gs_in = ph.generators();
+ Generator_System::const_iterator gs_in_it = gs_in.begin();
+ Generator_System::const_iterator gs_in_end = gs_in.end();
+ if (gs_in_it == gs_in_end)
+ // The system is unsatisfiable.
+ mu_space = NNC_Polyhedron(n + 1, EMPTY);
+ else {
+ Generator_System gs_out;
+ for ( ; gs_in_it != gs_in_end; ++gs_in_it) {
+ const Generator& g = *gs_in_it;
+ Linear_Expression le;
+ le.set_space_dimension(n);
+ // Set le to the multiplication of Linear_Expression(g) by E'_C.
+ dimension_type row_index = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+ const Variable lambda2_i(row_index);
+ Coefficient_traits::const_reference g_i = g.coefficient(lambda2_i);
+ if (g_i != 0)
+ le.linear_combine(i->expr, 1, -g_i, 1, n + 1);
+ }
+
+ // Add to gs_out the transformed generator.
+ switch (g.type()) {
+ case Generator::LINE:
+ if (!le.all_homogeneous_terms_are_zero())
+ gs_out.insert(line(le));
+ break;
+ case Generator::RAY:
+ if (!le.all_homogeneous_terms_are_zero())
+ gs_out.insert(ray(le));
+ break;
+ case Generator::POINT:
+ gs_out.insert(point(le, g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ gs_out.insert(closure_point(le, g.divisor()));
+ break;
+ }
+ }
+
+ mu_space = NNC_Polyhedron(gs_out);
+ // mu_0 is zero.
+ mu_space.add_space_dimensions_and_embed(1);
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/termination_defs.hh b/src/termination_defs.hh
new file mode 100644
index 0000000..e4334bf
--- /dev/null
+++ b/src/termination_defs.hh
@@ -0,0 +1,502 @@
+/* Utilities for termination analysis: declarations.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_termination_defs_hh
+#define PPL_termination_defs_hh 1
+
+#include "termination_types.hh"
+
+#include "Generator_types.hh"
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Constraint_System_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers {
+public:
+ static void
+ all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space);
+ static bool
+ one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu);
+ static bool
+ one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu);
+ static void
+ all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space);
+
+ template <typename PSET>
+ static void
+ assign_all_inequalities_approximation(const PSET& pset_before,
+ const PSET& pset_after,
+ Constraint_System& cs);
+}; // class Termination_Helpers
+
+//! \name Functions for the Synthesis of Linear Rankings
+//@{
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test using an improvement of the method by Mesnard and
+ Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then <CODE>true</CODE> is returned <EM>if and only if</EM>
+ the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test using an improvement of the method by Mesnard and
+ Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then <CODE>true</CODE> is returned
+ <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with witness ranking function using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param mu
+ When <CODE>true</CODE> is returned, this is assigned a point
+ of space dimension \f$ n+1 \f$ encoding one (not further specified)
+ affine ranking function for the loop being analyzed.
+ The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+ of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+ respectively.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then <CODE>true</CODE> is returned <EM>if and only if</EM>
+ the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with witness ranking function using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param mu
+ When <CODE>true</CODE> is returned, this is assigned a point
+ of space dimension \f$ n+1 \f$ encoding one (not further specified)
+ affine ranking function for the loop being analyzed.
+ The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+ of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+ respectively.
+
+ \return
+ <CODE>true</CODE> if any loop approximated by \p pset definitely
+ terminates; <CODE>false</CODE> if the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then <CODE>true</CODE> is returned
+ <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with ranking function space using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the affine ranking functions for the loops
+ that are precisely characterized by \p pset.
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p mu_space polyhedron.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions of \p mu_space
+ \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p mu_space is empty, it means that the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then \p mu_space is empty <EM>if and only if</EM>
+ the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Termination test with ranking function space using an improvement
+ of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the affine ranking functions for the loops
+ that are precisely characterized by \p pset.
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p mu_space polyhedron.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions of \p mu_space
+ \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p mu_space is empty, it means that the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then \p mu_space is empty <EM>if and only if</EM>
+ the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Computes the spaces of affine \e quasi ranking functions
+ using an improvement of the method by Mesnard and Serebrenik
+ \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset
+ A pointset approximating the behavior of a loop whose termination
+ is being analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+ .
+ where unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update.
+
+ \param decreasing_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the decreasing affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ \param bounded_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the lower bounded affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ These quasi-ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+ it means that the test is inconclusive.
+ However, if \p pset <EM>precisely</EM> characterizes the effect
+ of the loop body onto the loop-relevant program variables,
+ then \p decreasing_mu_space (resp., \p bounded_mu_space) will be empty
+ <EM>if and only if</EM> there is no decreasing (resp., lower bounded)
+ affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Computes the spaces of affine \e quasi ranking functions
+ using an improvement of the method by Mesnard and Serebrenik
+ \ref BMPZ10 "[BMPZ10]".
+
+ \tparam PSET
+ Any pointset supported by the PPL that provides the
+ <CODE>minimized_constraints()</CODE> method.
+
+ \param pset_before
+ A pointset approximating the values of loop-relevant variables
+ <EM>before</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$.
+
+ \param pset_after
+ A pointset approximating the values of loop-relevant variables
+ <EM>after</EM> the update performed in the loop body that is being
+ analyzed. The variables indices are allocated as follows:
+ - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+ \f$ 0, \ldots, n-1 \f$,
+ - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+ \f$ n, \ldots, 2n-1 \f$,
+
+ Note that unprimed variables represent the values of the loop-relevant
+ program variables before the update performed in the loop body,
+ and primed variables represent the values of those program variables
+ after the update. Note also that unprimed variables are assigned
+ to different space dimensions in \p pset_before and \p pset_after.
+
+ \param decreasing_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the decreasing affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ \param bounded_mu_space
+ This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+ representing the space of all the lower bounded affine functions
+ for the loops that are precisely characterized by \p pset.
+
+ These ranking functions are of the form
+ \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+ where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+ \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+ The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+ correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+ When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+ it means that the test is inconclusive.
+ However, if \p pset_before and \p pset_after <EM>precisely</EM>
+ characterize the effect of the loop body onto the loop-relevant
+ program variables, then \p decreasing_mu_space (resp., \p bounded_mu_space)
+ will be empty <EM>if and only if</EM> there is no decreasing
+ (resp., lower bounded) affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like termination_test_MS() but using the method by Podelski and
+ Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like termination_test_MS_2() but using an alternative formalization
+ of the method by Podelski and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like one_affine_ranking_function_MS() but using the method by Podelski
+ and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like one_affine_ranking_function_MS_2() but using an alternative
+ formalization of the method by Podelski and Rybalchenko
+ \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like all_affine_ranking_functions_MS() but using the method by Podelski
+ and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset, NNC_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+ Like all_affine_ranking_functions_MS_2() but using an alternative
+ formalization of the method by Podelski and Rybalchenko
+ \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ NNC_Polyhedron& mu_space);
+
+//@} // Functions for the Synthesis of Linear Rankings
+
+} // namespace Parma_Polyhedra_Library
+
+#include "termination_templates.hh"
+
+#endif // !defined(PPL_termination_defs_hh)
diff --git a/src/termination_templates.hh b/src/termination_templates.hh
new file mode 100644
index 0000000..b106e52
--- /dev/null
+++ b/src/termination_templates.hh
@@ -0,0 +1,552 @@
+/* Utilities for termination analysis: template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_termination_templates_hh
+#define PPL_termination_templates_hh 1
+
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Generator_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+
+#include <stdexcept>
+
+#define PRINT_DEBUG_INFO 0
+
+#if PRINT_DEBUG_INFO
+#include <iostream>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+#if PRINT_DEBUG_INFO
+static dimension_type output_function_MS_n;
+static dimension_type output_function_MS_m;
+
+/* Encodes which object are we printing:
+
+ 0 means input constraint system;
+ 1 means first output constraint system;
+ 2 means second output constraint system;
+ 3 means only output constraint system
+ (i.e., when first and second are the same);
+ 4 means mu space.
+*/
+static int output_function_MS_which = -1;
+
+/*
+ Debugging output function. See the documentation of
+ fill_constraint_systems_MS() for the allocation of variable indices.
+*/
+inline void
+output_function_MS(std::ostream& s, const Variable v) {
+ dimension_type id = v.id();
+ switch (output_function_MS_which) {
+ case 0:
+ if (id < output_function_MS_n)
+ s << "x'" << id + 1;
+ else if (id < 2*output_function_MS_n)
+ s << "x" << id - output_function_MS_n + 1;
+ else
+ s << "WHAT?";
+ break;
+ case 1:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "WHAT?";
+ else if (id <= output_function_MS_n + output_function_MS_m)
+ s << "y" << id - output_function_MS_n;
+ else
+ s << "WHAT?";
+ break;
+ case 2:
+ case 4:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "mu0";
+ else if (output_function_MS_which == 2
+ && id <= output_function_MS_n + output_function_MS_m + 2)
+ s << "z" << id - output_function_MS_n;
+ else
+ s << "WHAT?";
+ break;
+ case 3:
+ if (id < output_function_MS_n)
+ s << "mu" << id + 1;
+ else if (id == output_function_MS_n)
+ s << "mu0";
+ else if (id <= output_function_MS_n + output_function_MS_m)
+ s << "y" << id - output_function_MS_n;
+ else if (id <= output_function_MS_n + 2*output_function_MS_m + 2)
+ s << "z" << id - (output_function_MS_n + output_function_MS_m);
+ else
+ s << "WHAT?";
+ break;
+ default:
+ abort();
+ break;
+ }
+}
+
+static dimension_type output_function_PR_s;
+static dimension_type output_function_PR_r;
+
+/*
+ Debugging output function. See the documentation of
+ fill_constraint_system_PR() for the allocation of variable indices.
+*/
+inline void
+output_function_PR(std::ostream& s, const Variable v) {
+ dimension_type id = v.id();
+ if (id < output_function_PR_s)
+ s << "u3_" << id + 1;
+ else if (id < output_function_PR_s + output_function_PR_r)
+ s << "u2_" << id - output_function_PR_s + 1;
+ else if (id < output_function_PR_s + 2*output_function_PR_r)
+ s << "u1_" << id - (output_function_PR_s + output_function_PR_r) + 1;
+ else
+ s << "WHAT?";
+}
+#endif
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+ Constraint_System& cs_out);
+
+template <typename PSET>
+inline void
+assign_all_inequalities_approximation(const PSET& pset,
+ Constraint_System& cs) {
+ assign_all_inequalities_approximation(pset.minimized_constraints(), cs);
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+ Constraint_System& cs);
+
+bool
+termination_test_MS(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& mu_space);
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space);
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after);
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+ const Constraint_System& cs_after,
+ NNC_Polyhedron& mu_space);
+
+bool
+termination_test_PR_original(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+ Generator& mu);
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+ NNC_Polyhedron& mu_space);
+
+} // namespace Termination
+
+} // namespace Implementation
+
+template <typename PSET>
+void
+Termination_Helpers
+::assign_all_inequalities_approximation(const PSET& pset_before,
+ const PSET& pset_after,
+ Constraint_System& cs) {
+ Implementation::Termination
+ ::assign_all_inequalities_approximation(pset_before, cs);
+ cs.shift_space_dimensions(Variable(0), cs.space_dimension());
+ Constraint_System cs_after;
+ Implementation::Termination
+ ::assign_all_inequalities_approximation(pset_after, cs_after);
+ // FIXME: provide an "append" for constraint systems.
+ for (Constraint_System::const_iterator i = cs_after.begin(),
+ cs_after_end = cs_after.end(); i != cs_after_end; ++i)
+ cs.insert(*i);
+}
+
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::termination_test_MS(pset):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::termination_test_MS_2(pset_before, pset_after):\n"
+ "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_MS(pset, mu):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_MS_2(pset_before, pset_after, mu):\n"
+ "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS(pset, mu_space):\n"
+ "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS_2"
+ << "(pset_before, pset_after, mu_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_quasi_ranking_functions_MS"
+ << "(pset, decr_space, bounded_space):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ decreasing_mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+ bounded_mu_space = decreasing_mu_space;
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_quasi_ranking_functions_MS(cs,
+ decreasing_mu_space,
+ bounded_mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+ const PSET& pset_after,
+ C_Polyhedron& decreasing_mu_space,
+ C_Polyhedron& bounded_mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_quasi_ranking_functions_MS_2"
+ << "(pset_before, pset_after, decr_space, bounded_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ decreasing_mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+ bounded_mu_space = decreasing_mu_space;
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ Termination_Helpers
+ ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+ all_affine_quasi_ranking_functions_MS(cs,
+ decreasing_mu_space,
+ bounded_mu_space);
+}
+
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::termination_test_PR_2(pset_before, pset_after):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ return termination_test_PR(cs_before, cs_after);
+}
+
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::termination_test_PR(pset):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return termination_test_PR_original(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ Generator& mu) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_PR_2"
+ << "(pset_before, pset_after, mu):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ return one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::one_affine_ranking_function_PR(pset, mu):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ return one_affine_ranking_function_PR_original(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+ const PSET& pset_after,
+ NNC_Polyhedron& mu_space) {
+ const dimension_type before_space_dim = pset_before.space_dimension();
+ const dimension_type after_space_dim = pset_after.space_dimension();
+ if (after_space_dim != 2*before_space_dim) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_MS_2"
+ << "(pset_before, pset_after, mu_space):\n"
+ << "pset_before.space_dimension() == " << before_space_dim
+ << ", pset_after.space_dimension() == " << after_space_dim
+ << ";\nthe latter should be twice the former.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset_before.is_empty()) {
+ mu_space = NNC_Polyhedron(1 + before_space_dim);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs_before;
+ Constraint_System cs_after;
+ assign_all_inequalities_approximation(pset_before, cs_before);
+ assign_all_inequalities_approximation(pset_after, cs_after);
+ all_affine_ranking_functions_PR(cs_before, cs_after, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset,
+ NNC_Polyhedron& mu_space) {
+ const dimension_type space_dim = pset.space_dimension();
+ if (space_dim % 2 != 0) {
+ std::ostringstream s;
+ s << "PPL::all_affine_ranking_functions_PR(pset, mu_space):\n"
+ << "pset.space_dimension() == " << space_dim
+ << " is odd.";
+ throw std::invalid_argument(s.str());
+ }
+
+ if (pset.is_empty()) {
+ mu_space = NNC_Polyhedron(1 + space_dim/2);
+ return;
+ }
+
+ using namespace Implementation::Termination;
+ Constraint_System cs;
+ assign_all_inequalities_approximation(pset, cs);
+ all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_termination_templates_hh)
diff --git a/src/termination_types.hh b/src/termination_types.hh
new file mode 100644
index 0000000..314c0b9
--- /dev/null
+++ b/src/termination_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_termination_types_hh
+#define PPL_termination_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_termination_types_hh)
diff --git a/src/version.cc b/src/version.cc
new file mode 100644
index 0000000..3337409
--- /dev/null
+++ b/src/version.cc
@@ -0,0 +1,108 @@
+/* Definition of functions providing version and licensing information.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "version.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+const char version_string[] = PPL_PACKAGE_VERSION;
+
+const char banner_string[] =
+"This is "PPL_PACKAGE_NAME" (PPL) version "PPL_PACKAGE_VERSION".\n"
+"Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n"
+"Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n"
+"\n"
+"The PPL is free software; see the source for copying conditions.\n"
+"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
+"PARTICULAR PURPOSE.\n"
+"\n"
+#if defined(__COMO__)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Comeau C++ compiler version "xstr(__COMO_VERSION__)".\n"
+#elif defined(__INTEL_COMPILER)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Intel C++ compiler version "xstr(__INTEL_COMPILER)".\n"
+#elif defined(__GNUC__)
+"Compiled by the GNU C++ compiler version "__VERSION__".\n"
+#else
+"Compiled by an unknown compiler.\n"
+#endif
+"\n"
+"Report bugs to "PPL_PACKAGE_BUGREPORT"."
+" For the most up-to-date information\n"
+"see the Parma Polyhedra Library site: http://bugseng.com/products/ppl/ .\n"
+"\n"
+"Contributors:\n"
+"Roberto Bagnara, Patricia M. Hill, Enea Zaffanella, Abramo Bagnara,\n"
+"Elisa Ricci, Andrea Cimino, Marco Poletti, Alessandro Zaccagnini,\n"
+"Roberto Amadini, Irene Bacchi, Fabio Biselli, Fabio Bossi,\n"
+"Danilo Bonardi, Sara Bonini, Katy Dobson, Giordano Fracasso,\n"
+"Francois Galea, Maximiliano Marchesi, Elena Mazzi, David Merchat,\n"
+"Matthew Mundell, Andrea Pescetti, Barbara Quartieri,\n"
+"Enric Rodriguez Carbonell, Angela Stazzone, Fabio Trabucchi,\n"
+"Claudio Trento, Tatiana Zolo.\n"
+"\n"
+"Special thanks to:\n"
+"Lucia Alessandrini, Frederic Besson, Tevfik Bultan, Manuel Carro,\n"
+"Marco Comini, Goran Frehse, Denis Gopan, Martin Guy, Bruno Haible,\n"
+"Bertrand Jeannet, Herve Le Verge, Francesco Logozzo, Kenneth MacKenzie,\n"
+"Costantino Medori, Fred Mesnard, Ken Mixter, Jose Morales, Sebastian Pop,\n"
+"Thomas Reps, Mooly Sagiv, Sriram Sankaranarayanan, Axel Simon,\n"
+"Fausto Spoto, Basile Starynkevitch, Pedro Vasconcelos, Ralf Wildenhues.";
+
+} // namespace
+
+unsigned
+PPL::version_major() {
+ return PPL_VERSION_MAJOR;
+}
+
+unsigned
+PPL::version_minor() {
+ return PPL_VERSION_MINOR;
+}
+
+unsigned
+PPL::version_revision() {
+ return PPL_VERSION_REVISION;
+}
+
+unsigned
+PPL::version_beta() {
+ return PPL_VERSION_BETA;
+}
+
+const char*
+PPL::version() {
+ return version_string;
+}
+
+const char*
+PPL::banner() {
+ return banner_string;
+}
diff --git a/src/version.hh.in b/src/version.hh.in
new file mode 100644
index 0000000..4d0fd20
--- /dev/null
+++ b/src/version.hh.in
@@ -0,0 +1,98 @@
+/* Declaration of macros and functions providing version -*- C++ -*-
+ and licensing information.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_version_hh
+#define PPL_version_hh 1
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+ The beta number of the PPL version. This is zero for official
+ releases and nonzero for development snapshots.
+ \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+ Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+ to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The
+ format of PPL_VERSION is <CODE>M "." m</CODE> if both
+ PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+ (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+ PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+ <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+ PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+ neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Library Version Control Functions
+//@{
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+ The banner provides information about the PPL version, the licensing,
+ the lack of any warranty whatsoever, the C++ compiler used to build
+ the library, where to report bugs and where to look for further
+ information.
+*/
+const char* banner();
+
+//@} // Library Version Control Functions
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_version_hh)
diff --git a/src/wrap_assign.hh b/src/wrap_assign.hh
new file mode 100644
index 0000000..d45f9d6
--- /dev/null
+++ b/src/wrap_assign.hh
@@ -0,0 +1,380 @@
+/* Generic implementation of the wrap_assign() function.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_wrap_assign_hh
+#define PPL_wrap_assign_hh 1
+
+#include "globals_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+struct Wrap_Dim_Translations {
+ Variable var;
+ Coefficient first_quadrant;
+ Coefficient last_quadrant;
+ Wrap_Dim_Translations(Variable v,
+ Coefficient_traits::const_reference f,
+ Coefficient_traits::const_reference l)
+ : var(v), first_quadrant(f), last_quadrant(l) {
+ }
+};
+
+typedef std::vector<Wrap_Dim_Translations> Wrap_Translations;
+
+template <typename PSET>
+void
+wrap_assign_ind(PSET& pointset,
+ Variables_Set& vars,
+ Wrap_Translations::const_iterator first,
+ Wrap_Translations::const_iterator end,
+ Bounded_Integer_Type_Width w,
+ Coefficient_traits::const_reference min_value,
+ Coefficient_traits::const_reference max_value,
+ const Constraint_System& cs,
+ Coefficient& tmp1,
+ Coefficient& tmp2) {
+ const dimension_type space_dim = pointset.space_dimension();
+ for (Wrap_Translations::const_iterator i = first; i != end; ++i) {
+ const Wrap_Dim_Translations& wrap_dim_translations = *i;
+ const Variable x(wrap_dim_translations.var);
+ const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+ const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+ Coefficient& quadrant = tmp1;
+ Coefficient& shift = tmp2;
+ PSET hull(space_dim, EMPTY);
+ for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+ PSET p(pointset);
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ p.affine_image(x, x - shift, 1);
+ }
+ // `x' has just been wrapped.
+ vars.erase(x.id());
+
+ // Refine `p' with all the constraints in `cs' not depending
+ // on variables in `vars'.
+ if (vars.empty())
+ p.refine_with_constraints(cs);
+ else {
+ for (Constraint_System::const_iterator j = cs.begin(),
+ cs_end = cs.end(); j != cs_end; ++j)
+ if (j->expression().all_zeroes(vars))
+ // `*j' does not depend on variables in `vars'.
+ p.refine_with_constraint(*j);
+ }
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ hull.upper_bound_assign(p);
+ }
+ pointset.m_swap(hull);
+ }
+}
+
+template <typename PSET>
+void
+wrap_assign_col(PSET& dest,
+ const PSET& src,
+ const Variables_Set& vars,
+ Wrap_Translations::const_iterator first,
+ Wrap_Translations::const_iterator end,
+ Bounded_Integer_Type_Width w,
+ Coefficient_traits::const_reference min_value,
+ Coefficient_traits::const_reference max_value,
+ const Constraint_System* cs_p,
+ Coefficient& tmp) {
+ if (first == end) {
+ PSET p(src);
+ if (cs_p != 0)
+ p.refine_with_constraints(*cs_p);
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+ const Variable x(*i);
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ }
+ dest.upper_bound_assign(p);
+ }
+ else {
+ const Wrap_Dim_Translations& wrap_dim_translations = *first;
+ const Variable x(wrap_dim_translations.var);
+ const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+ const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+ Coefficient& shift = tmp;
+ PPL_DIRTY_TEMP_COEFFICIENT(quadrant);
+ for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ PSET p(src);
+ p.affine_image(x, x - shift, 1);
+ wrap_assign_col(dest, p, vars, first+1, end, w, min_value, max_value,
+ cs_p, tmp);
+ }
+ else
+ wrap_assign_col(dest, src, vars, first+1, end, w, min_value, max_value,
+ cs_p, tmp);
+ }
+ }
+}
+
+template <typename PSET>
+void
+wrap_assign(PSET& pointset,
+ const Variables_Set& vars,
+ const Bounded_Integer_Type_Width w,
+ const Bounded_Integer_Type_Representation r,
+ const Bounded_Integer_Type_Overflow o,
+ const Constraint_System* cs_p,
+ const unsigned complexity_threshold,
+ const bool wrap_individually,
+ const char* class_name) {
+ // We must have cs_p->space_dimension() <= vars.space_dimension()
+ // and vars.space_dimension() <= pointset.space_dimension().
+
+ // Dimension-compatibility check of `*cs_p', if any.
+ if (cs_p != 0) {
+ const dimension_type vars_space_dim = vars.space_dimension();
+ if (cs_p->space_dimension() > vars_space_dim) {
+ std::ostringstream s;
+ s << "PPL::" << class_name << "::wrap_assign(..., cs_p, ...):"
+ << std::endl
+ << "vars.space_dimension() == " << vars_space_dim
+ << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+#ifndef NDEBUG
+ // Check that all variables upon which `*cs_p' depends are in `vars'.
+ // An assertion is violated otherwise.
+ const Constraint_System cs = *cs_p;
+ const dimension_type cs_space_dim = cs.space_dimension();
+ Variables_Set::const_iterator vars_end = vars.end();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+ for (dimension_type d = cs_space_dim; d-- > 0; ) {
+ PPL_ASSERT(c.coefficient(Variable(d)) == 0
+ || vars.find(d) != vars_end);
+ }
+ }
+#endif
+ }
+
+ // Wrapping no variable only requires refining with *cs_p, if any.
+ if (vars.empty()) {
+ if (cs_p != 0)
+ pointset.refine_with_constraints(*cs_p);
+ return;
+ }
+
+ // Dimension-compatibility check of `vars'.
+ const dimension_type space_dim = pointset.space_dimension();
+ if (vars.space_dimension() > space_dim) {
+ std::ostringstream s;
+ s << "PPL::" << class_name << "::wrap_assign(vs, ...):" << std::endl
+ << "this->space_dimension() == " << space_dim
+ << ", required space dimension == " << vars.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // Wrapping an empty polyhedron is a no-op.
+ if (pointset.is_empty())
+ return;
+
+ // Set `min_value' and `max_value' to the minimum and maximum values
+ // a variable of width `w' and signedness `s' can take.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ if (r == UNSIGNED) {
+ min_value = 0;
+ mul_2exp_assign(max_value, Coefficient_one(), w);
+ --max_value;
+ }
+ else {
+ PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+ mul_2exp_assign(max_value, Coefficient_one(), w-1);
+ neg_assign(min_value, max_value);
+ --max_value;
+ }
+
+ // If we are wrapping variables collectively, the ranges for the
+ // required translations are saved in `translations' instead of being
+ // immediately applied.
+ Wrap_Translations translations;
+
+ // Dimensions subject to translation are added to this set if we are
+ // wrapping collectively or if `cs_p' is non null.
+ Variables_Set dimensions_to_be_translated;
+
+ // This will contain a lower bound to the number of abstractions
+ // to be joined in order to obtain the collective wrapping result.
+ // As soon as this exceeds `complexity_threshold', counting will be
+ // interrupted and the full range will be the result of wrapping
+ // any dimension that is not fully contained in quadrant 0.
+ unsigned collective_wrap_complexity = 1;
+
+ // This flag signals that the maximum complexity for collective
+ // wrapping as been exceeded.
+ bool collective_wrap_too_complex = false;
+
+ if (!wrap_individually) {
+ translations.reserve(space_dim);
+ }
+
+ // We use `full_range_bounds' to delay conversions whenever
+ // this delay does not negatively affect precision.
+ Constraint_System full_range_bounds;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+ PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+ for (Variables_Set::const_iterator i = vars.begin(),
+ vars_end = vars.end(); i != vars_end; ++i) {
+
+ const Variable x(*i);
+
+ bool extremum;
+
+ if (!pointset.minimize(x, l_n, l_d, extremum)) {
+ set_full_range:
+ pointset.unconstrain(x);
+ full_range_bounds.insert(min_value <= x);
+ full_range_bounds.insert(x <= max_value);
+ continue;
+ }
+
+ if (!pointset.maximize(x, u_n, u_d, extremum))
+ goto set_full_range;
+
+ div_assign_r(l_n, l_n, l_d, ROUND_DOWN);
+ div_assign_r(u_n, u_n, u_d, ROUND_DOWN);
+ l_n -= min_value;
+ u_n -= min_value;
+ div_2exp_assign_r(l_n, l_n, w, ROUND_DOWN);
+ div_2exp_assign_r(u_n, u_n, w, ROUND_DOWN);
+ Coefficient& first_quadrant = l_n;
+ const Coefficient& last_quadrant = u_n;
+
+ // Special case: this variable does not need wrapping.
+ if (first_quadrant == 0 && last_quadrant == 0)
+ continue;
+
+ // If overflow is impossible, try not to add useless constraints.
+ if (o == OVERFLOW_IMPOSSIBLE) {
+ if (first_quadrant < 0)
+ full_range_bounds.insert(min_value <= x);
+ if (last_quadrant > 0)
+ full_range_bounds.insert(x <= max_value);
+ continue;
+ }
+
+ if (o == OVERFLOW_UNDEFINED || collective_wrap_too_complex)
+ goto set_full_range;
+
+ Coefficient& quadrants = u_d;
+ quadrants = last_quadrant - first_quadrant + 1;
+
+ PPL_UNINITIALIZED(unsigned, extension);
+ Result res = assign_r(extension, quadrants, ROUND_IGNORE);
+ if (result_overflow(res) != 0 || extension > complexity_threshold)
+ goto set_full_range;
+
+ if (!wrap_individually && !collective_wrap_too_complex) {
+ res = mul_assign_r(collective_wrap_complexity,
+ collective_wrap_complexity, extension, ROUND_IGNORE);
+ if (result_overflow(res) != 0
+ || collective_wrap_complexity > complexity_threshold)
+ collective_wrap_too_complex = true;
+ if (collective_wrap_too_complex) {
+ // Set all the dimensions in `translations' to full range.
+ for (Wrap_Translations::const_iterator j = translations.begin(),
+ translations_end = translations.end();
+ j != translations_end;
+ ++j) {
+ const Variable y(j->var);
+ pointset.unconstrain(y);
+ full_range_bounds.insert(min_value <= y);
+ full_range_bounds.insert(y <= max_value);
+ }
+ }
+ }
+
+ if (wrap_individually && cs_p == 0) {
+ Coefficient& quadrant = first_quadrant;
+ // Temporary variable holding the shifts to be applied in order
+ // to implement the translations.
+ Coefficient& shift = l_d;
+ PSET hull(space_dim, EMPTY);
+ for ( ; quadrant <= last_quadrant; ++quadrant) {
+ PSET p(pointset);
+ if (quadrant != 0) {
+ mul_2exp_assign(shift, quadrant, w);
+ p.affine_image(x, x - shift, 1);
+ }
+ p.refine_with_constraint(min_value <= x);
+ p.refine_with_constraint(x <= max_value);
+ hull.upper_bound_assign(p);
+ }
+ pointset.m_swap(hull);
+ }
+ else if (wrap_individually || !collective_wrap_too_complex) {
+ PPL_ASSERT(!wrap_individually || cs_p != 0);
+ dimensions_to_be_translated.insert(x);
+ translations
+ .push_back(Wrap_Dim_Translations(x, first_quadrant, last_quadrant));
+ }
+ }
+
+ if (!translations.empty()) {
+ if (wrap_individually) {
+ PPL_ASSERT(cs_p != 0);
+ wrap_assign_ind(pointset, dimensions_to_be_translated,
+ translations.begin(), translations.end(),
+ w, min_value, max_value, *cs_p, l_n, l_d);
+ }
+ else {
+ PSET hull(space_dim, EMPTY);
+ wrap_assign_col(hull, pointset, dimensions_to_be_translated,
+ translations.begin(), translations.end(),
+ w, min_value, max_value, cs_p, l_n);
+ pointset.m_swap(hull);
+ }
+ }
+
+ if (cs_p != 0)
+ pointset.refine_with_constraints(*cs_p);
+ pointset.refine_with_constraints(full_range_bounds);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_wrap_assign_hh)
diff --git a/src/wrap_string.cc b/src/wrap_string.cc
new file mode 100644
index 0000000..e789f3a
--- /dev/null
+++ b/src/wrap_string.cc
@@ -0,0 +1,95 @@
+/* String wrapping helper function.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "wrap_string.hh"
+#include "assert.hh"
+#include <cstdlib>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+std::string
+wrap_string(const std::string& src_string,
+ const unsigned indent_depth,
+ const unsigned preferred_first_line_length,
+ const unsigned preferred_line_length) {
+ const unsigned npos = C_Integer<unsigned>::max;
+ std::string dst_string;
+ const char *src = src_string.c_str();
+ for (unsigned line = 0; ; ++line) {
+ const unsigned line_length = ((line == 0)
+ ? preferred_first_line_length
+ : preferred_line_length);
+ unsigned last_comma = npos;
+ unsigned last_space = npos;
+ unsigned split_pos = npos;
+ unsigned idx;
+ for (idx = 0; idx <= line_length; ++idx) {
+ if (src[idx] == '\0' || src[idx] == '\n') {
+ split_pos = idx;
+ break;
+ }
+ if (src[idx] == ',' && idx < line_length)
+ last_comma = idx;
+ if (is_space(src[idx]) && (idx == 0 || !is_space(src[idx-1])))
+ last_space = idx;
+ }
+ if (split_pos == npos) {
+ if (last_comma != npos)
+ split_pos = last_comma + 1;
+ else if (last_space != npos)
+ split_pos = last_space;
+ else {
+ for ( ; src[idx] != '\0'; ++idx) {
+ if (src[idx] == ',') {
+ ++idx;
+ break;
+ }
+ if (is_space(src[idx]))
+ break;
+ }
+ split_pos = idx;
+ }
+ }
+ PPL_ASSERT(split_pos != npos);
+ if (split_pos > 0 && line > 0 && indent_depth > 0)
+ dst_string.append(indent_depth, ' ');
+ dst_string.append(src, split_pos);
+ src += split_pos;
+ if (is_space(*src))
+ ++src;
+ while (*src == ' ')
+ ++src;
+ if (*src == '\0')
+ break;
+ dst_string.push_back('\n');
+ }
+ return dst_string;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/wrap_string.hh b/src/wrap_string.hh
new file mode 100644
index 0000000..fa278c7
--- /dev/null
+++ b/src/wrap_string.hh
@@ -0,0 +1,60 @@
+/* Declaration of string wrapping function.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_wrap_hh
+#define PPL_wrap_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Utility function for the wrapping of lines of text.
+/*!
+ \param src_string
+ The source string holding the lines to wrap.
+
+ \param indent_depth
+ The indentation depth.
+
+ \param preferred_first_line_length
+ The preferred length for the first line of text.
+
+ \param preferred_line_length
+ The preferred length for all the lines but the first one.
+
+ \return
+ The wrapped string.
+*/
+std::string
+wrap_string(const std::string& src_string,
+ unsigned indent_depth,
+ unsigned preferred_first_line_length,
+ unsigned preferred_line_length);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_wrap_hh)
diff --git a/test-driver b/test-driver
new file mode 100755
index 0000000..32bf39e
--- /dev/null
+++ b/test-driver
@@ -0,0 +1,127 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2012-06-27.10; # UTC
+
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+ [--expect-failure={yes|no}] [--color-tests={yes|no}]
+ [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+# TODO: better error handling in option parsing (in particular, ensure
+# TODO: $log_file, $trs_file and $test_name are defined).
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ esac
+ shift
+done
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='[0;31m' # Red.
+ grn='[0;32m' # Green.
+ lgn='[1;32m' # Light green.
+ blu='[1;34m' # Blue.
+ mgn='[0;35m' # Magenta.
+ std='[m' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ estatus=1
+fi
+
+case $estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am
new file mode 100644
index 0000000..ee2de99
--- /dev/null
+++ b/tests/BD_Shape/Makefile.am
@@ -0,0 +1,319 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhmz05widening1 \
+bhz03widening1 \
+bounded1 \
+bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76extrapolation1 \
+closure1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+geomcovers1 \
+h79widening1 \
+integerupperboundifexact1 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+limitedh79extrapolation1 \
+mapspacedims1 \
+max_min1 max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+relations1 relations2 relations3 relations4 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebdshape1
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DBD_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+closure1_SOURCES = closure1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writebdshape1_SOURCES = writebdshape1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
diff --git a/tests/BD_Shape/Makefile.in b/tests/BD_Shape/Makefile.in
new file mode 100644
index 0000000..540ae3f
--- /dev/null
+++ b/tests/BD_Shape/Makefile.in
@@ -0,0 +1,1868 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+ affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+ affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+ ascii_dump_load1$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+ bhmz05widening1$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) bounds1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+ cc76narrowing1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+ closure1$(EXEEXT) concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+ constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+ discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+ dropsomenonintegerpoints1$(EXEEXT) empty1$(EXEEXT) \
+ equality1$(EXEEXT) expandspacedim1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+ fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+ frompolyhedron1$(EXEEXT) fromspacedim1$(EXEEXT) \
+ generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) \
+ generalizedaffinepreimage3$(EXEEXT) geomcovers1$(EXEEXT) \
+ h79widening1$(EXEEXT) integerupperboundifexact1$(EXEEXT) \
+ intersection1$(EXEEXT) limitedbhmz05extrapolation1$(EXEEXT) \
+ limitedcc76extrapolation1$(EXEEXT) \
+ limitedh79extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+ max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+ membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+ relations1$(EXEEXT) relations2$(EXEEXT) relations3$(EXEEXT) \
+ relations4$(EXEEXT) removespacedims1$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+ unconstrain1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT) \
+ upperboundifexact1$(EXEEXT) wrap1$(EXEEXT) \
+ writebdshape1$(EXEEXT)
+XFAIL_TESTS =
+subdir = tests/BD_Shape
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+ $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_closure1_OBJECTS = closure1.$(OBJEXT)
+closure1_OBJECTS = $(am_closure1_OBJECTS)
+closure1_LDADD = $(LDADD)
+closure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS = \
+ dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS = \
+ $(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS = \
+ generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS = \
+ $(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS = \
+ generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS = \
+ $(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS = \
+ generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS = \
+ $(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS = \
+ generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS = \
+ $(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_integerupperboundifexact1_OBJECTS = \
+ integerupperboundifexact1.$(OBJEXT)
+integerupperboundifexact1_OBJECTS = \
+ $(am_integerupperboundifexact1_OBJECTS)
+integerupperboundifexact1_LDADD = $(LDADD)
+integerupperboundifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS = \
+ limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS = \
+ $(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS = \
+ limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS = \
+ $(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS = \
+ limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS = \
+ $(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writebdshape1_OBJECTS = writebdshape1.$(OBJEXT)
+writebdshape1_OBJECTS = $(am_writebdshape1_OBJECTS)
+writebdshape1_LDADD = $(LDADD)
+writebdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+ $(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(closure1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+ $(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+ $(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+ $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
+ $(h79widening1_SOURCES) $(integerupperboundifexact1_SOURCES) \
+ $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(max_min2_SOURCES) \
+ $(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+ $(minconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(relations4_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(unconstrain1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+ $(wrap1_SOURCES) $(writebdshape1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+ $(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(closure1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+ $(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+ $(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+ $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
+ $(h79widening1_SOURCES) $(integerupperboundifexact1_SOURCES) \
+ $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(max_min2_SOURCES) \
+ $(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+ $(minconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(relations4_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(unconstrain1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+ $(wrap1_SOURCES) $(writebdshape1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DBD_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+closure1_SOURCES = closure1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writebdshape1_SOURCES = writebdshape1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/BD_Shape/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/BD_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES)
+ @rm -f affinedimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES)
+ @rm -f bgp99extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) $(EXTRA_bhmz05widening1_DEPENDENCIES)
+ @rm -f bhmz05widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) $(EXTRA_cc76extrapolation1_DEPENDENCIES)
+ @rm -f cc76extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES)
+ @rm -f cc76narrowing1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) $(EXTRA_closure1_DEPENDENCIES)
+ @rm -f closure1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES)
+ @rm -f constrains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES)
+ @rm -f difference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES)
+ @rm -f dropsomenonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) $(EXTRA_equality1_DEPENDENCIES)
+ @rm -f equality1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES)
+ @rm -f frequency1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES)
+ @rm -f fromgensys1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES)
+ @rm -f fromspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES)
+ @rm -f geomcovers1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) $(EXTRA_h79widening1_DEPENDENCIES)
+ @rm -f h79widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+
+integerupperboundifexact1$(EXEEXT): $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_DEPENDENCIES) $(EXTRA_integerupperboundifexact1_DEPENDENCIES)
+ @rm -f integerupperboundifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhmz05extrapolation1_DEPENDENCIES)
+ @rm -f limitedbhmz05extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES)
+ @rm -f limitedcc76extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f limitedh79extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES)
+ @rm -f max_min1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) $(EXTRA_max_min2_DEPENDENCIES)
+ @rm -f max_min2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES)
+ @rm -f maxspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) $(EXTRA_relations4_DEPENDENCIES)
+ @rm -f relations4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES)
+ @rm -f unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES)
+ @rm -f upperboundifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES)
+ @rm -f wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES) $(EXTRA_writebdshape1_DEPENDENCIES)
+ @rm -f writebdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/integerupperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebdshape1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ fi; \
+ echo "$${col}$$dashes$${std}"; \
+ echo "$${col}$$banner$${std}"; \
+ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+ test -z "$$report" || echo "$${col}$$report$${std}"; \
+ echo "$${col}$$dashes$${std}"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+ $(dist_check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/BD_Shape/addconstraints1.cc b/tests/BD_Shape/addconstraints1.cc
new file mode 100644
index 0000000..36c855c
--- /dev/null
+++ b/tests/BD_Shape/addconstraints1.cc
@@ -0,0 +1,182 @@
+/* Test BD_Shape::add_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B == 5);
+
+ TBD_Shape bds(2);
+ bds.add_constraints(cs);
+
+ print_constraints(bds, "*** bds.add_constraints(cs) ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+ known_result.add_constraint(B - A <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::add_constraint: it is illegal
+ // to add a strict inequality.
+ bds.add_constraint(x <= 0);
+ bds.add_constraint(y < 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::add_constraint: it is illegal
+ // to add a constraint with bigger dimension.
+ bds.add_constraint(x <= 0);
+ bds.add_constraint(y - x + z >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(1);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::add_constraints(cs): it is illegal to
+ // add a system of constraints that is not dimensional incompatible
+ // with the polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y >= 0);
+ bds.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable y(1);
+
+ TBD_Shape bds(1);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::add_constraint(c): it is illegal to insert a
+ // constraints that contains a variable that is not in the space
+ // of the polyhedron.
+ bds.add_constraint(y >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(1);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::add_constraints(cs): it is illegal to add a system
+ // of constraints that is dimensional incompatible with the
+ // polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y == 0);
+ bds.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/addspacedims1.cc b/tests/BD_Shape/addspacedims1.cc
new file mode 100644
index 0000000..b5a2bf6
--- /dev/null
+++ b/tests/BD_Shape/addspacedims1.cc
@@ -0,0 +1,334 @@
+/* Test BD_Shape::add_space_dimensions_and_embed():
+ we add two variables to a BD_Shape.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_embed(2);
+ bds.add_constraint(z <= 2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.add_space_dimensions_and_embed(2) "
+ "and bds.add_constraint(z <= 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1(0, EMPTY);
+ TBD_Shape bds2(1, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.add_space_dimensions_and_embed(2);
+ bds2.add_space_dimensions_and_embed(1);
+
+ bool ok = (bds1 == bds2);
+
+ print_constraints(bds1, "*** bds1.add_space_dimensions_and_embed(2) ***");
+ print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bds(0, UNIVERSE);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_embed(3);
+
+ BD_Shape<mpq_class> known_result(3, UNIVERSE);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimension_and_embed(3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(4);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(C - B >= 9);
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(0);
+
+ print_constraints(bds, "*** bds.add_space_dimensions_and_project(0) ***");
+
+ bool ok = check_result(bds, known_result);
+
+ return ok;
+}
+
+bool
+test06() {
+ //Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(3);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimensions_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bds(10, UNIVERSE);
+
+ bds.remove_higher_space_dimensions(5);
+ bds.add_space_dimensions_and_embed(6);
+
+ return bds == TBD_Shape(11, UNIVERSE);
+}
+
+bool
+test08() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(w == 0);
+ known_result.add_constraint(z == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TBD_Shape bds1(0, EMPTY);
+ TBD_Shape bds2(1, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.add_space_dimensions_and_project(2);
+ bds2.add_space_dimensions_and_project(1);
+
+ bool ok = (bds1 == bds2);
+
+ print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(2) ***");
+ print_constraints(bds2, "*** bds2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ TBD_Shape bds(0, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(3);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimension_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.add_space_dimensions_and_project(4);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(A <= 2);
+
+ TBD_Shape bds2(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.add_space_dimensions_and_project(0);
+ bds1.add_space_dimensions_and_embed(0);
+
+ bool ok = (bds1 == bds2);
+
+ print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(0) ***");
+ print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(0) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x <= 2);
+
+ TBD_Shape bds(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.minimized_constraints();
+ bds.add_space_dimensions_and_embed(3);
+ bds.add_constraint(z <= 2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(bds, known_result) ;
+
+ print_constraints(bds,
+ "*** bds.add_space_dimensions_and_embed(2) "
+ "and bds.add_constraint(z <= 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/BD_Shape/affinedimension1.cc b/tests/BD_Shape/affinedimension1.cc
new file mode 100644
index 0000000..5b06632
--- /dev/null
+++ b/tests/BD_Shape/affinedimension1.cc
@@ -0,0 +1,307 @@
+/* Test BD_Shape::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y == 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(A - B == 3);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(E - D == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+
+ bds.add_constraint(A == 5);
+ bds.add_constraint(A - B == 3);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(E - D == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 3);
+ bds.add_constraint(B - A <= -5);
+ bds.add_constraint(-B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds(2, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test06() {
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(A - D == 8);
+ bds.add_constraint(B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(E == 1);
+ bds.add_constraint(A - D == 8);
+ bds.add_constraint(B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(7);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B == 2);
+ bds.add_constraint(B - A <= -6);
+
+ print_constraints(bds, "*** bds ***");
+
+ dimension_type affine_dim = bds.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bds' "
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test11() {
+ TBD_Shape bds(0, UNIVERSE);
+
+ const dimension_type affine_dim = bds.affine_dimension();
+
+ print_constraints(bds, "*** bds ***");
+
+ return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
+
+
diff --git a/tests/BD_Shape/affineimage1.cc b/tests/BD_Shape/affineimage1.cc
new file mode 100644
index 0000000..eb9de6a
--- /dev/null
+++ b/tests/BD_Shape/affineimage1.cc
@@ -0,0 +1,443 @@
+/* Test BD_Shape::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, y);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, x + 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 7);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, x + 4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, Linear_Expression(4));
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x == 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.affine_image(x, x);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, x) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, 2*x - 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(y, 2*x, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y - x == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(y, 2*x, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(y, 3*x + 3, 3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y - x == 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(y, 3*x + 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -2*x - 3*y + 1, -5);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(5*x >= -4);
+ known_result.add_constraint(5*x <= 7);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+ known_result.add_constraint(y - x <= 1);
+ known_result.add_constraint(5*x - 5*y <= 3);
+
+ bool ok = check_result(bds, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
+
+ print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, -5) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(z >= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(z, x + 2*y -3*z + 2, 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(2*z <= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(z, x + 2*y -3*z + 2, 4) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 2);
+ bds.add_constraint(B >= 1);
+ bds.add_constraint(C <= 0);
+ bds.add_constraint(D == 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(A, -B + 2*C + 1, -3);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C <= 0);
+ known_result.add_constraint(D == 3);
+ known_result.add_constraint(3*B - 3*A <= 5);
+
+ bool ok = check_result(bds, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+ print_constraints(bds, "*** bds.affine_image(A, -B + 2*C + 1, -3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, 2*y + z + 2, 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, 2*y + z + 2, 4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x - y >= 0);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(x <= 2);
+
+ Linear_Expression coeff1 = x + 1;
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ bds.affine_image(x, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // BD_Shape::affine_image(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space of
+ // the polyhedron.
+ bds.affine_image(y, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= 1);
+ bds.add_constraint(y >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // BD_Shape::affine_image(v, expr, d): it is illegal to
+ // use a variable in the expression that does not appear in the
+ // space of the polyhedron.
+ bds.affine_image(y, x + z + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x - y >= 0);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(x <= 2);
+
+ Linear_Expression coeff1 = 2*x + 1;
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ bds.affine_image(x, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/affineimage2.cc b/tests/BD_Shape/affineimage2.cc
new file mode 100644
index 0000000..07cfca4
--- /dev/null
+++ b/tests/BD_Shape/affineimage2.cc
@@ -0,0 +1,352 @@
+/* Test BD_Shape::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(z >= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -x);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= -1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(z >= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -x) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(z >= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -z);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= -3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(z >= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -z) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -y + 1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 0);
+ known_result.add_constraint(x >= -1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -y + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -2*y + 1, -2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*x - 2*y == -1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -2*y + 1, 2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*x <= -1);
+ known_result.add_constraint(2*x >= -3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, 2*x + y + 1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+ known_result.add_constraint(x - y <= 3);
+ known_result.add_constraint(x - y >= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, 2*x + y + 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -2*x + y + 1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+ known_result.add_constraint(x - y <= 1);
+ known_result.add_constraint(x - y >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_image(x, -2*x + y + 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, 2*x - 3*y + 1, 5);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(5*x <= 6);
+ known_result.add_constraint(x >= -1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+
+ bool ok = check_result(bds, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
+
+ print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, -2*x - 3*y + 1, 5);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(5*x <= 4);
+ known_result.add_constraint(5*x >= -7);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+
+ bool ok = check_result(bds, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
+
+ print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, 2*x - 3*y + 1, -5);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(5*x >= -6);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+ known_result.add_constraint(5*x - 5*y <= 1);
+ known_result.add_constraint(5*x - 5*y >= -7);
+
+ bool ok = check_result(bds, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
+
+ print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, -5) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(y >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(z <= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(x, y + 5*z, 3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*x <= 17);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(z <= 3);
+ known_result.add_constraint(x - y <= 5);
+ known_result.add_constraint(3*x - 3*z <= 8);
+
+ bool ok = check_result(bds, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
+
+ print_constraints(bds, "*** bds.affine_image(x, y + 5*z, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/affinepreimage1.cc b/tests/BD_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..268cee8
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage1.cc
@@ -0,0 +1,455 @@
+/* Test BD_Shape::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(x, y);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B - 3 >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, B-1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, B-1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 2);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, 2*A + 2, 2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 2);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(B, Linear_Expression(3));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(B, 3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::affine_preimage(v, expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ bds.affine_preimage(x, x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::affine_preimage(v, expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BDS.
+ bds.affine_preimage(y, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -2);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -2);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, 3*A + C - 1, -2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, 3*A + C - 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(A, -3*A + C - 1, -2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A == 2);
+ bds.add_constraint(B == 0);
+ bds.add_constraint(C >= -3);
+ bds.add_constraint(D <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A == 2);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C >= -3);
+ known_result.add_constraint(5*D <= 14);
+
+ bool ok = check_result(bds, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
+
+ print_constraints(bds, "*** bds.affine_preimage"
+ "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_preimage(B, -B);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(B, -B) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.affine_preimage(B, -B, -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(B, -B, -1) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(B <= 0);
+ bds.add_constraint(C >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C >= 0);
+
+ bds.affine_preimage(B, -3*B + 6, 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.affine_preimage(B, -3*B + 6, 3) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A <= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.affine_image(A, 2*A, 3);
+
+ BD_Shape<mpq_class> mpq_known_result(1);
+ mpq_known_result.add_constraint(3*A <= -2);
+
+ bool ok = check_result(bds, mpq_known_result,
+ "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(bds, "*** bds.affine_image(A, 2*A, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/ascii_dump_load1.cc b/tests/BD_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..5161c4c
--- /dev/null
+++ b/tests/BD_Shape/ascii_dump_load1.cc
@@ -0,0 +1,247 @@
+/* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+ nout << "test01()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-EM");
+ f.seekp(0, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bool ok = !bds2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test02() {
+
+ nout << "test02()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 1);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "+ZE");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bool ok = !bds2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+
+ nout << "test03()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-SPC");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bool ok = !bds2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+
+ nout << "test04()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "+inf");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bool ok = !bds2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+
+ nout << "test05()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "+inf");
+ do
+ f >> str;
+ while (str != "+inf");
+ f.seekp(0, ios_base::cur);
+ f << " 3 ";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bool ok = !bds2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A - B >= 2);
+ bds1.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bds1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bds2;
+ bds2.ascii_load(f);
+ close(f);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = (bds1 == bds2);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/bgp99extrapolation1.cc b/tests/BD_Shape/bgp99extrapolation1.cc
new file mode 100644
index 0000000..e44b969
--- /dev/null
+++ b/tests/BD_Shape/bgp99extrapolation1.cc
@@ -0,0 +1,94 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ typedef Pointset_Powerset<TBD_Shape> BDS_Set;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(-A + B >= 2);
+ bds1.add_constraint(A - B >= -4);
+ bds1.add_constraint(A >= 0);
+ TBD_Shape bds2(2);
+ bds2.add_constraint(-A + B >= 3);
+ bds2.add_constraint(A - B >= -8);
+ bds2.add_constraint(A >= 1);
+ TBD_Shape bds3(2);
+ bds3.add_constraint(-A + B >= 4);
+ bds3.add_constraint(A - B >= -12);
+ bds3.add_constraint(A >= 2);
+ TBD_Shape bds4(2);
+ bds4.add_constraint(-A + B >= 6);
+ bds4.add_constraint(A - B >= -16);
+ bds4.add_constraint(A >= 3);
+
+ BDS_Set bdss1(2, EMPTY);
+ bdss1.add_disjunct(bds1);
+ bdss1.add_disjunct(bds2);
+ bdss1.add_disjunct(bds3);
+
+ BDS_Set bdss2(bdss1);
+ bdss1.add_disjunct(bds4);
+
+ using namespace IO_Operators;
+ nout << "*** bdss1 ***" << endl
+ << bdss1 << endl;
+ nout << "*** bdss2 ***" << endl
+ << bdss2 << endl;
+
+ TBD_Shape bds5(2);
+ bds5.add_constraint(-A + B >= 4);
+ bds5.add_constraint(A >= 2);
+ bds5.add_constraint(B >= 6);
+
+ BDS_Set known_result(2, EMPTY);
+ known_result.add_disjunct(bds1);
+ known_result.add_disjunct(bds2);
+ known_result.add_disjunct(bds5);
+
+ bdss1.BGP99_extrapolation_assign
+ (bdss2, widen_fun_ref(&TBD_Shape::H79_widening_assign), 3);
+
+ bool ok = bdss1.geometrically_equals(known_result);
+
+ nout
+ << "*** bdss1.BGP99_extrapolation_assign"
+ << "(bdss2, widen_fun_ref(&H79_widening_assign), 3) ***"
+ << endl
+ << bdss1 << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/bhmz05widening1.cc b/tests/BD_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..b742e0d
--- /dev/null
+++ b/tests/BD_Shape/bhmz05widening1.cc
@@ -0,0 +1,344 @@
+/* Test BD_Shape::BHMZ05_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 1);
+ bds1.add_constraint(x - y <= 2);
+ bds1.add_constraint(y - x <= 7);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y <= 2);
+ bds2.add_constraint(-x <= 3);
+ bds2.add_constraint(x <= 0);
+ bds2.add_constraint(y - x <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1;
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds1(5);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(C >= 1);
+ bds1.add_constraint(D >= 0);
+ bds1.add_constraint(E >= 0);
+ bds1.add_constraint(C - D <= 76);
+ bds1.add_constraint(C - E <= 76);
+ bds1.add_constraint(E - D == 0);
+
+ TBD_Shape bds2(5);
+ bds2.add_constraint(A >= 0);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(C >= 1);
+ bds2.add_constraint(D >= 0);
+ bds2.add_constraint(E >= 0);
+ bds2.add_constraint(C - D <= 75);
+ bds2.add_constraint(C - E <= 75);
+ bds2.add_constraint(E - D == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 1);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(E - D == 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A - B <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A - B <= 1);
+ bds2.add_constraint(A - C <= 1);
+ bds2.add_constraint(C - B <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A - B <= 1);
+ bds1.add_constraint(A - B >= 2);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A - B <= 1);
+ bds2.add_constraint(A - B >= 2);
+ bds2.add_constraint(A - C <= 1);
+ bds2.add_constraint(C - B <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+TBD_Shape
+aux_test06(int i, Variable a, Variable b, Variable c) {
+ TBD_Shape bds(3);
+ if (i == 0) {
+ bds.add_constraint(0 <= a-b);
+ bds.add_constraint( a-b <= 0);
+ bds.add_constraint(-1 <= b-c);
+ bds.add_constraint( b-c <= 1);
+ }
+ else {
+ bds.add_constraint(-i <= a-b);
+ bds.add_constraint( a-b <= i);
+ bds.add_constraint(-1 <= b-c);
+ bds.add_constraint( b-c <= 1);
+ bds.add_constraint(-i <= a-c);
+ bds.add_constraint( a-c <= i);
+ }
+
+ using namespace IO_Operators;
+ nout << "*** n_" << i << " ***" << endl
+ << bds << endl;
+
+ // Force closure.
+ (void) (bds == bds);
+ return bds;
+}
+
+bool
+test06() {
+ Variable a(0);
+ Variable b(1);
+ Variable c(2);
+ unsigned i = 0;
+ TBD_Shape m_i = aux_test06(i, a, b, c);
+ TBD_Shape m_i_next;
+ while (i < 100) {
+
+ using namespace IO_Operators;
+ nout << "*** m_" << i << " ***" << endl
+ << m_i << endl;
+
+ m_i_next = aux_test06(++i, a, b, c);
+ m_i_next.upper_bound_assign(m_i);
+ m_i_next.BHMZ05_widening_assign(m_i);
+ // Force closure.
+ (void) (m_i_next == m_i_next);
+ if (m_i == m_i_next) {
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(-1 <= b-c);
+ known_result.add_constraint( b-c <= 1);
+
+ bool ok = (BD_Shape<mpq_class>(m_i) == known_result);
+
+ nout << "*** m_" << i << " (fixpoint) ***" << endl
+ << m_i << endl;
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+ }
+ m_i = m_i_next;
+ }
+
+ return false;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A - B <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A - B <= 1);
+ bds2.add_constraint(A - B >= 2);
+ bds2.add_constraint(A - C <= 1);
+ bds2.add_constraint(C - B <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.BHMZ05_widening_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+
+ TBD_Shape bds1(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+
+ TBD_Shape bds2(cs2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds2);
+
+ bds2.BHMZ05_widening_assign(bds1);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2,
+ "*** bds2.BHMZ05_widening_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TBD_Shape bds1(5);
+ TBD_Shape bds2(10);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::BHMZ05_widening_assign(bds1): it is illegal to apply
+ // the method to two polyhedra that are not dimensional
+ // compatible.
+ bds2.BHMZ05_widening_assign(bds1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/bhz03widening1.cc b/tests/BD_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..bdc1f10
--- /dev/null
+++ b/tests/BD_Shape/bhz03widening1.cc
@@ -0,0 +1,77 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ typedef Pointset_Powerset<TBD_Shape> PSet;
+
+ TBD_Shape p(2);
+ TBD_Shape q(2);
+ TBD_Shape r(2);
+ TBD_Shape s(2);
+ p.add_constraint(A >= 1);
+ p.add_constraint(B == 0);
+ q.add_constraint(A >= 2);
+ q.add_constraint(A <= 7);
+ q.add_constraint(B == 1);
+ r.add_constraint(A >= 3);
+ r.add_constraint(A <= 8);
+ r.add_constraint(B == 1);
+ s.add_constraint(A >= 1);
+ s.add_constraint(A <= 6);
+ s.add_constraint(B == 1);
+ PSet P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ PSet Q(2, EMPTY);
+ Q.add_disjunct(p);
+ Q.add_disjunct(q);
+ Q.add_disjunct(s);
+
+ using namespace IO_Operators;
+ nout << "P = " << P << endl
+ << "Q = " << Q << endl;
+
+ PSet old_P = P;
+ P.BHZ03_widening_assign<H79_Certificate>
+ (Q, widen_fun_ref(&TBD_Shape::H79_widening_assign));
+
+ nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+ return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/bounded1.cc b/tests/BD_Shape/bounded1.cc
new file mode 100644
index 0000000..205a00f
--- /dev/null
+++ b/tests/BD_Shape/bounded1.cc
@@ -0,0 +1,97 @@
+/* Test BD_Shape::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ // This is a non-bounded BDS.
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ return !bds.is_bounded();
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a bounded BDS (it is a square);
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= 2);
+ bds.add_constraint(y >= 2);
+ bds.add_constraint(x <= 4);
+ bds.add_constraint(y <= 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ return bds.is_bounded();
+}
+
+bool
+test03() {
+ // This is a universal, zero-dimensional BDS.
+ TBD_Shape bds;
+
+ print_constraints(bds, "*** bds ***");
+
+ return bds.is_bounded();
+}
+
+bool
+test04() {
+ // This is an empty, zero-dimensional BDS.
+ TBD_Shape bds;
+ bds.add_constraint(Linear_Expression(-3) >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ return bds.is_bounded();
+}
+
+bool
+test05() {
+ // This is an empty BDS.
+ TBD_Shape bds(4, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ return bds.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffineimage1.cc b/tests/BD_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..f1b2ad5
--- /dev/null
+++ b/tests/BD_Shape/boundedaffineimage1.cc
@@ -0,0 +1,488 @@
+/* Test BD_Shape::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(x, y, y);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(x, y, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(x, x + 4, x + 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 7);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(x, x + 4, x + 4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(x, Linear_Expression(4), Linear_Expression(4));
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x == 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(x, 4, 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.bounded_affine_image(x, x, x);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(x, x, x) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(y, 2*x, 2*x, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y - x == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(y <= 2);
+ bds.add_constraint(y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+ known_result.add_constraint(x - y <= 1);
+ known_result.add_constraint(x - y >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A - B <= 0);
+ bds.add_constraint(B - C == 2);
+ bds.add_constraint(C - A <= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(B, Linear_Expression(-1), D + E);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(A - C == 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(B >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_image(B, -1, D + E) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(C, 3*D - E, 2*C + 1, 5);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(5*C <= 7);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(C, "
+ "3*D - E, 2*C + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable F(5);
+
+ TBD_Shape bds(6);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(A >= -6);
+ bds.add_constraint(B == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(A, -A - 3, B - C + 6*D + F);
+
+ BD_Shape<mpq_class> known_result(6);
+ known_result.add_constraint(A >= -7);
+ known_result.add_constraint(B == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(A, "
+ "-A - 3, B - C + 6*D + F) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(B >= -1);
+ known_result.add_constraint(C - A <= 2);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(B, "
+ "-B - 2, 7*D - E + 5, 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C - A <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_image(B, "
+ "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the BDS's space dimension.
+ bds.bounded_affine_image(y, x, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the BDS's space dimension.
+ bds.bounded_affine_image(y, z, x);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ bds.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // BD_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+ // apply the method to a variable that is not in the space of
+ // the polyhedron.
+ bds.bounded_affine_image(y, x + 1, Linear_Expression(8));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffinepreimage1.cc b/tests/BD_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..e0f39f9
--- /dev/null
+++ b/tests/BD_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,381 @@
+/* Test BD_Shape::bounded_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 7, 3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, 7) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+ -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(7),
+ Linear_Expression(3), -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(B - A <= 3);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, A+2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, -A+2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, B+5) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(2*B <= 8);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");;
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A >= -5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(4*(B - A) <= 21);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 2, 4*A + 3*B - 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 4);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(A - B >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A <= 5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+
+ bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, 2, "
+ "4*A + 3*B - 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+
+ bds.bounded_affine_preimage(A, A, A);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.bounded_affine_preimage(A, A, A) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable C(2);
+
+ BD_Shape<mpz_class> bds(3);
+ bds.add_constraint(C == 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.bounded_affine_preimage(C, A, A, 5);
+
+ BD_Shape<mpz_class> known_result(3);
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.bounded_affine_preimage(C, A, A, 5) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/bounds1.cc b/tests/BD_Shape/bounds1.cc
new file mode 100644
index 0000000..63fea67
--- /dev/null
+++ b/tests/BD_Shape/bounds1.cc
@@ -0,0 +1,273 @@
+/* Test BD_Shape::bounds_from_below() and BD_Shape::bounds_from_above().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bds1;
+ TBD_Shape bds2(2, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = bds1.bounds_from_above(Linear_Expression(3))
+ && bds2.bounds_from_below(A);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = !bds.bounds_from_above(A + B) && bds.bounds_from_below(A + B);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B - C <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.bounds_from_above(A + B - C)
+ && !bds.bounds_from_below(A + B - C);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B - C <= 0);
+ bds.add_constraint(E - D <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+ && !bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = !bds.bounds_from_above(A + B - C + 2*E - 2*D)
+ && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(B - C <= -1);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+ && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.bounds_from_above(Linear_Expression(3))
+ && bds.bounds_from_below(Linear_Expression(3));
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::bounds_from_below(expr): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BDS.
+ bds.bounds_from_below(z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::bounds_from_below(expr): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BDS.
+ bds.bounds_from_above(z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = !bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = !bds.bounds_from_above(A + B) && !bds.bounds_from_below(A + B);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76extrapolation1.cc b/tests/BD_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..7e0c5c4
--- /dev/null
+++ b/tests/BD_Shape/cc76extrapolation1.cc
@@ -0,0 +1,489 @@
+/* Test BD_Shape::CC76_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 1);
+ bds1.add_constraint(x - y <= 2);
+ bds1.add_constraint(y - x <= 7);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x - y <= 2);
+ bds2.add_constraint(-x <= 3);
+ bds2.add_constraint(x <= 0);
+ bds2.add_constraint(y - x <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds1(4);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B <= 25);
+ bds1.add_constraint(C >= 0);
+ bds1.add_constraint(C <= 29);
+ bds1.add_constraint(D >= 0);
+ bds1.add_constraint(D <= 27);
+ bds1.add_constraint(B - A <= 25);
+ bds1.add_constraint(C - A <= 29);
+ bds1.add_constraint(D - A <= 27);
+ bds1.add_constraint(B - C <= 2);
+ bds1.add_constraint(C - B <= 6);
+ bds1.add_constraint(B - D <= 2);
+ bds1.add_constraint(D - B <= 4);
+ bds1.add_constraint(C - D <= 4);
+ bds1.add_constraint(D - C <= 4);
+
+ TBD_Shape bds2(4);
+ bds2.add_constraint(A >= 0);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 26);
+ bds2.add_constraint(C >= 3);
+ bds2.add_constraint(C <= 29);
+ bds2.add_constraint(D >= 2);
+ bds2.add_constraint(D <= 28);
+ bds2.add_constraint(B - A <= 26);
+ bds2.add_constraint(C - A <= 29);
+ bds2.add_constraint(D - A <= 28);
+ bds2.add_constraint(B - C <= 0);
+ bds2.add_constraint(C - B <= 6);
+ bds2.add_constraint(B - D == 2);
+ bds2.add_constraint(C - D <= 4);
+ bds2.add_constraint(D - C <= 2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D >= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.upper_bound_assign(bds2);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 26);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(B - A <= 26);
+ known_result.add_constraint(B - C <= 2);
+ known_result.add_constraint(B - D <= 2);
+ known_result.add_constraint(C - D <= 4);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds1(4);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B <= 39);
+ bds1.add_constraint(C >= 0);
+ bds1.add_constraint(C <= 40);
+ bds1.add_constraint(D >= 0);
+ bds1.add_constraint(D <= 40);
+ bds1.add_constraint(B - A <= 39);
+ bds1.add_constraint(C - A <= 40);
+ bds1.add_constraint(D - A <= 40);
+ bds1.add_constraint(B - C <= 0);
+ bds1.add_constraint(C - B <= 1);
+ bds1.add_constraint(B - D <= 0);
+ bds1.add_constraint(D - B <= 2);
+ bds1.add_constraint(C - D <= 0);
+ bds1.add_constraint(D - C <= 1);
+
+ TBD_Shape bds2(4);
+ bds2.add_constraint(A >= 0);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 38);
+ bds2.add_constraint(C >= 0);
+ bds2.add_constraint(C <= 39);
+ bds2.add_constraint(D >= 0);
+ bds2.add_constraint(D <= 40);
+ bds2.add_constraint(B - A <= 38);
+ bds2.add_constraint(C - A <= 39);
+ bds2.add_constraint(D - A <= 40);
+ bds2.add_constraint(B - C <= 0);
+ bds2.add_constraint(C - B <= 1);
+ bds2.add_constraint(B - D <= 0);
+ bds2.add_constraint(D - B <= 2);
+ bds2.add_constraint(C - D <= 0);
+ bds2.add_constraint(D - C <= 1);
+
+ // Force the closure of `bds1'.
+ (void) (bds1 == bds2);
+
+ BD_Shape<mpq_class> known_widening(4);
+ known_widening.add_constraint(A >= 0);
+ known_widening.add_constraint(B >= 0);
+ known_widening.add_constraint(C >= 0);
+ known_widening.add_constraint(D >= 0);
+ known_widening.add_constraint(D <= 40);
+ known_widening.add_constraint(D - A <= 40);
+ known_widening.add_constraint(B - C <= 0);
+ known_widening.add_constraint(C - B <= 1);
+ known_widening.add_constraint(B - D <= 0);
+ known_widening.add_constraint(D - B <= 2);
+ known_widening.add_constraint(C - D <= 0);
+ known_widening.add_constraint(D - C <= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ // Force the closure of `bds1'.
+ (void) (bds1 == bds2);
+
+ bool ok = (BD_Shape<mpq_class>(bds1) == known_widening);
+
+ print_constraints(bds1, "*** bds1.closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B <= 2);
+ bds1.add_constraint(B - A <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= 0);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 1);
+ bds2.add_constraint(B - A <= 1);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+TBD_Shape
+aux_test05(int i, Variable a, Variable b, Variable c) {
+ TBD_Shape bds(3);
+ if (i == 0) {
+ bds.add_constraint(0 <= a-b);
+ bds.add_constraint( a-b <= 0);
+ bds.add_constraint(-1 <= b-c);
+ bds.add_constraint( b-c <= 1);
+ }
+ else {
+ bds.add_constraint(-i <= a-b);
+ bds.add_constraint( a-b <= i);
+ bds.add_constraint(-1 <= b-c);
+ bds.add_constraint( b-c <= 1);
+ bds.add_constraint(-i <= a-c);
+ bds.add_constraint( a-c <= i);
+ }
+
+ using namespace IO_Operators;
+ nout << "*** n_" << i << " ***" << endl
+ << bds << endl;
+
+ // Force closure.
+ (void) (bds == bds);
+ return bds;
+}
+
+bool
+test05() {
+ Variable a(0);
+ Variable b(1);
+ Variable c(2);
+ unsigned i = 0;
+ TBD_Shape m_i = aux_test05(i, a, b, c);
+ TBD_Shape m_i_next;
+ while (i < 100) {
+
+ using namespace IO_Operators;
+ nout << "*** m_" << i << " ***" << endl
+ << m_i << endl;
+
+ m_i_next = aux_test05(++i, a, b, c);
+ TBD_Shape::coefficient_type_base* no_stop_points = 0;
+ m_i_next.CC76_extrapolation_assign(m_i, no_stop_points, no_stop_points);
+ m_i_next.upper_bound_assign(m_i);
+ // Force closure.
+ (void) (m_i_next == m_i_next);
+ if (m_i == m_i_next) {
+
+ nout << "*** m_" << i << " (fixpoint) ***" << endl
+ << m_i << endl;
+
+ return false;
+ }
+ m_i = m_i_next;
+ }
+ return true;
+}
+
+bool
+test06() {
+ TBD_Shape bds1(0);
+
+ TBD_Shape bds2(0, EMPTY);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bds1(2, EMPTY);
+ TBD_Shape bds2(2, EMPTY);
+ BD_Shape<mpq_class> known_result(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_extrapolation_assign(bds1);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2,
+ "*** bds2.CC76_extrapolation_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A - B >= 2);
+ bds1.add_constraint(B - C >= -1);
+ bds1.add_constraint(C - A >= -3);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A - B >= 2);
+ bds2.add_constraint(B - C >= 1);
+ bds2.add_constraint(C - A >= 3);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= 1);
+ bds2.add_constraint(B == -1);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(C <= 4);
+ bds1.add_constraint(B >= 2);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(C == 3);
+ bds2.add_constraint(A - C >= 0);
+ bds2.add_constraint(B - A >= 1);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C - B <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.CC76_extrapolation_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ TBD_Shape bds1(1);
+ TBD_Shape bds2(2);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::CC76_extrapolation_assign(bds): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ bds2.CC76_extrapolation_assign(bds1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ TBD_Shape bds1(5);
+ TBD_Shape bds2(10);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::CC76_widening_assign(bds2): it is illegal to apply
+ // this method to two polyhedra that are not dimensional
+ // compatible.
+ bds2.CC76_extrapolation_assign(bds1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76narrowing1.cc b/tests/BD_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..9783a85
--- /dev/null
+++ b/tests/BD_Shape/cc76narrowing1.cc
@@ -0,0 +1,217 @@
+/* Test BD_Shape::CC76_narrowing_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 1);
+ bds1.add_constraint(y - x <= 7);
+ bds1.add_constraint(x - y <= 6);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(-x <= 3);
+ bds2.add_constraint(y - x <= 2);
+ bds2.add_constraint(x - y <= 5);
+ bds2.add_constraint(x <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_narrowing_assign(bds1);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y - x <= 7);
+ known_result.add_constraint(-x <= 3);
+ known_result.add_constraint(x - y <= 6);
+ known_result.add_constraint(-y <= 8);
+ known_result.add_constraint(y <= 8);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(4);
+ bds1.add_constraint(z <= 1);
+
+ TBD_Shape bds2(4);
+ bds2.add_constraint(-y <= 3);
+ bds2.add_constraint(-x <= 2);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y - x <= 4);
+ bds2.add_constraint(z <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_narrowing_assign(bds1);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(z <= 1);
+ known_result.add_constraint(-y <= 3);
+ known_result.add_constraint(y <= 7);
+ known_result.add_constraint(-x <= 2);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(y - x <= 4);
+ known_result.add_constraint(x - y <= 6);
+ known_result.add_constraint(z - y <= 3);
+ known_result.add_constraint(z - x <= 2);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ TBD_Shape bds2(3);
+
+ bds1.add_constraint(z <= 1);
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bds2.add_constraint(-y <= 3);
+ bds2.add_constraint(x >= 4);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y - x <= 4);
+ bds2.add_constraint(z <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_narrowing_assign(bds1);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(z <= 1);
+ bds1.add_constraint(z >= 3);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(-y <= 3);
+ bds2.add_constraint(x >= 4);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y - x <= 4);
+ bds2.add_constraint(z <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_narrowing_assign(bds1);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds1;
+ TBD_Shape bds2(0, EMPTY);
+ BD_Shape<mpq_class> known_result(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.CC76_narrowing_assign(bds1);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable y(1);
+
+ TBD_Shape bds1(1);
+ TBD_Shape bds2(2);
+
+ Constraint_System cs;
+ cs.insert(y >= 6);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::CC76_narrowing_assign(bds2, cs): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ bds2.CC76_narrowing_assign(bds1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/closure1.cc b/tests/BD_Shape/closure1.cc
new file mode 100644
index 0000000..f86472f
--- /dev/null
+++ b/tests/BD_Shape/closure1.cc
@@ -0,0 +1,600 @@
+/* Test shortest path closure.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Edge {
+ unsigned int from;
+ unsigned int to;
+ unsigned long distance;
+};
+
+Edge hawaii[] = {
+ { 0, 1, 6191 },
+ { 1, 0, 6191 },
+ { 2, 3, 4147 },
+ { 3, 2, 4147 },
+ { 4, 5, 3884 },
+ { 5, 4, 3884 },
+ { 5, 6, 1609 },
+ { 6, 5, 1609 },
+ { 7, 0, 12521 },
+ { 0, 7, 12521 },
+ { 8, 1, 2872 },
+ { 1, 8, 2872 },
+ { 9, 10, 4036 },
+ { 10, 9, 4036 },
+ { 4, 11, 2959 },
+ { 11, 4, 2959 },
+ { 12, 13, 27415 },
+ { 13, 12, 27415 },
+ { 14, 15, 6068 },
+ { 15, 14, 6068 },
+ { 15, 16, 7337 },
+ { 16, 15, 7337 },
+ { 17, 18, 2894 },
+ { 18, 17, 2894 },
+ { 18, 19, 5425 },
+ { 19, 18, 5425 },
+ { 20, 21, 2265 },
+ { 21, 20, 2265 },
+ { 19, 20, 3008 },
+ { 20, 19, 3008 },
+ { 21, 12, 6654 },
+ { 12, 21, 6654 },
+ { 22, 23, 1563 },
+ { 23, 22, 1563 },
+ { 23, 24, 3470 },
+ { 24, 23, 3470 },
+ { 25, 26, 6536 },
+ { 26, 25, 6536 },
+ { 27, 28, 10373 },
+ { 28, 27, 10373 },
+ { 28, 29, 7866 },
+ { 29, 28, 7866 },
+ { 29, 30, 8961 },
+ { 30, 29, 8961 },
+ { 31, 32, 6954 },
+ { 32, 31, 6954 },
+ { 33, 34, 24135 },
+ { 34, 33, 24135 },
+ { 34, 35, 5943 },
+ { 35, 34, 5943 },
+ { 33, 36, 2389 },
+ { 36, 33, 2389 },
+ { 35, 37, 3374 },
+ { 37, 35, 3374 },
+ { 34, 38, 4494 },
+ { 38, 34, 4494 },
+ { 37, 38, 8295 },
+ { 38, 37, 8295 },
+ { 38, 39, 12091 },
+ { 39, 38, 12091 },
+ { 39, 40, 4356 },
+ { 40, 39, 4356 },
+ { 39, 30, 3986 },
+ { 30, 39, 3986 },
+ { 29, 41, 3937 },
+ { 41, 29, 3937 },
+ { 41, 28, 7159 },
+ { 28, 41, 7159 },
+ { 42, 43, 3887 },
+ { 43, 42, 3887 },
+ { 43, 44, 3685 },
+ { 44, 43, 3685 },
+ { 43, 45, 20903 },
+ { 45, 43, 20903 },
+ { 45, 46, 2226 },
+ { 46, 45, 2226 },
+ { 47, 44, 7487 },
+ { 44, 47, 7487 },
+ { 44, 48, 22511 },
+ { 48, 44, 22511 },
+ { 46, 48, 7280 },
+ { 48, 46, 7280 },
+ { 48, 49, 3112 },
+ { 49, 48, 3112 },
+ { 49, 50, 2530 },
+ { 50, 49, 2530 },
+ { 50, 51, 17408 },
+ { 51, 50, 17408 },
+ { 45, 52, 15249 },
+ { 52, 45, 15249 },
+ { 53, 54, 36470 },
+ { 54, 53, 36470 },
+ { 54, 49, 7694 },
+ { 49, 54, 7694 },
+ { 51, 55, 11400 },
+ { 55, 51, 11400 },
+ { 52, 46, 15473 },
+ { 46, 52, 15473 },
+ { 55, 56, 37433 },
+ { 56, 55, 37433 },
+ { 53, 57, 3855 },
+ { 57, 53, 3855 },
+ { 57, 58, 1508 },
+ { 58, 57, 1508 },
+ { 59, 60, 3574 },
+ { 60, 59, 3574 },
+ { 59, 53, 7377 },
+ { 53, 59, 7377 },
+ { 58, 60, 6801 },
+ { 60, 58, 6801 },
+ { 60, 61, 9191 },
+ { 61, 60, 9191 },
+ { 61, 62, 3940 },
+ { 62, 61, 3940 },
+ { 62, 63, 1941 },
+ { 63, 62, 1941 },
+ { 63, 64, 17861 },
+ { 64, 63, 17861 },
+ { 65, 66, 12138 },
+ { 66, 65, 12138 },
+ { 66, 67, 5764 },
+ { 67, 66, 5764 },
+ { 68, 62, 2365 },
+ { 62, 68, 2365 },
+ { 69, 70, 14756 },
+ { 70, 69, 14756 },
+ { 70, 71, 3931 },
+ { 71, 70, 3931 },
+ { 71, 72, 6955 },
+ { 72, 71, 6955 },
+ { 69, 73, 4265 },
+ { 73, 69, 4265 },
+ { 73, 56, 5278 },
+ { 56, 73, 5278 },
+ { 74, 75, 1088 },
+ { 75, 74, 1088 },
+ { 76, 77, 2549 },
+ { 77, 76, 2549 },
+ { 78, 79, 2029 },
+ { 79, 78, 2029 },
+ { 80, 81, 4607 },
+ { 81, 80, 4607 },
+ { 81, 82, 995 },
+ { 82, 81, 995 },
+ { 82, 83, 5708 },
+ { 83, 82, 5708 },
+ { 83, 84, 1015 },
+ { 84, 83, 1015 },
+ { 85, 86, 2592 },
+ { 86, 85, 2592 },
+ { 86, 75, 9272 },
+ { 75, 86, 9272 },
+ { 86, 87, 1549 },
+ { 87, 86, 1549 },
+ { 87, 88, 1155 },
+ { 88, 87, 1155 },
+ { 85, 84, 8375 },
+ { 84, 85, 8375 },
+ { 84, 89, 3022 },
+ { 89, 84, 3022 },
+ { 89, 90, 6455 },
+ { 90, 89, 6455 },
+ { 80, 91, 2912 },
+ { 91, 80, 2912 },
+ { 78, 92, 2087 },
+ { 92, 78, 2087 },
+ { 91, 76, 7736 },
+ { 76, 91, 7736 },
+ { 88, 85, 2143 },
+ { 85, 88, 2143 },
+ { 93, 8, 9507 },
+ { 8, 93, 9507 },
+ { 89, 88, 9385 },
+ { 88, 89, 9385 },
+ { 64, 65, 24795 },
+ { 65, 64, 24795 },
+ { 54, 94, 32035 },
+ { 94, 54, 32035 },
+ { 94, 56, 35025 },
+ { 56, 94, 35025 },
+ { 69, 95, 25243 },
+ { 95, 69, 25243 },
+ { 67, 96, 30757 },
+ { 96, 67, 30757 },
+ { 96, 97, 859 },
+ { 97, 96, 859 },
+ { 97, 95, 3230 },
+ { 95, 97, 3230 },
+ { 1, 9, 16155 },
+ { 9, 1, 16155 },
+ { 98, 51, 11706 },
+ { 51, 98, 11706 },
+ { 75, 99, 51590 },
+ { 99, 75, 51590 },
+ { 11, 100, 23417 },
+ { 100, 11, 23417 },
+ { 100, 101, 12368 },
+ { 101, 100, 12368 },
+ { 102, 103, 4846 },
+ { 103, 102, 4846 },
+ { 103, 104, 2901 },
+ { 104, 103, 2901 },
+ { 10, 104, 7849 },
+ { 104, 10, 7849 },
+ { 104, 2, 2147 },
+ { 2, 104, 2147 },
+ { 2, 102, 1761 },
+ { 102, 2, 1761 },
+ { 102, 4, 4444 },
+ { 4, 102, 4444 },
+ { 74, 105, 8183 },
+ { 105, 74, 8183 },
+ { 106, 107, 7075 },
+ { 107, 106, 7075 },
+ { 89, 107, 1178 },
+ { 107, 89, 1178 },
+ { 108, 81, 1312 },
+ { 81, 108, 1312 },
+ { 81, 109, 1793 },
+ { 109, 81, 1793 },
+ { 82, 108, 1001 },
+ { 108, 82, 1001 },
+ { 108, 80, 7421 },
+ { 80, 108, 7421 },
+ { 110, 92, 434 },
+ { 92, 110, 434 },
+ { 92, 79, 3285 },
+ { 79, 92, 3285 },
+ { 79, 99, 2706 },
+ { 99, 79, 2706 },
+ { 111, 78, 3052 },
+ { 78, 111, 3052 },
+ { 77, 111, 2036 },
+ { 111, 77, 2036 },
+ { 24, 25, 2634 },
+ { 25, 24, 2634 },
+ { 25, 21, 1832 },
+ { 21, 25, 1832 },
+ { 33, 112, 14461 },
+ { 112, 33, 14461 },
+ { 113, 114, 7998 },
+ { 114, 113, 7998 },
+ { 41, 115, 6937 },
+ { 115, 41, 6937 },
+ { 32, 116, 47595 },
+ { 116, 32, 47595 },
+ { 99, 117, 3887 },
+ { 117, 99, 3887 },
+ { 117, 118, 736 },
+ { 118, 117, 736 },
+ { 85, 83, 9281 },
+ { 83, 85, 9281 },
+ { 118, 80, 4823 },
+ { 80, 118, 4823 },
+ { 77, 119, 22341 },
+ { 119, 77, 22341 },
+ { 56, 120, 1612 },
+ { 120, 56, 1612 },
+ { 79, 121, 3258 },
+ { 121, 79, 3258 },
+ { 52, 57, 25357 },
+ { 57, 52, 25357 },
+ { 99, 121, 1646 },
+ { 121, 99, 1646 },
+ { 121, 76, 1359 },
+ { 76, 121, 1359 },
+ { 37, 27, 3890 },
+ { 27, 37, 3890 },
+ { 27, 31, 5066 },
+ { 31, 27, 5066 },
+ { 122, 123, 2556 },
+ { 123, 122, 2556 },
+ { 90, 122, 947 },
+ { 122, 90, 947 },
+ { 122, 124, 911 },
+ { 124, 122, 911 },
+ { 124, 125, 23829 },
+ { 125, 124, 23829 },
+ { 91, 119, 7911 },
+ { 119, 91, 7911 },
+};
+
+const mpq_class&
+perturbate(unsigned long a) {
+ static mpq_class q;
+ q = a;
+ q = (q*q)/(q-1);
+ return q;
+}
+
+template <typename T>
+void
+add_edges(BD_Shape<T>& bds, const Edge* edges, unsigned n) {
+ for (unsigned i = 0; i < n; ++i) {
+ const mpq_class& q = perturbate(edges[i].distance);
+ Coefficient a;
+ a = q.get_den();
+ Coefficient b;
+ b = q.get_num();
+
+ nout << "a = " << a << "; b = " << b << endl;
+
+ bds.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
+ <= b);
+ }
+}
+
+bool
+test01() {
+ BD_Shape<mpq_class> qbds1(126);
+ add_edges(qbds1, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ TBD_Shape tbds(126);
+ add_edges(tbds, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ BD_Shape<mpq_class> qbds2(tbds);
+ if (!qbds2.contains(qbds1))
+ return false;
+
+ return true;
+}
+
+bool
+test02() {
+ // This test shows that the Floyd-Warshall algorithm does not compute
+ // the shortest path closure when using a floating point datatype.
+ // In particular, here it is shown that FW is not idempotent.
+ typedef TBD_Shape BDS;
+ typedef BDS::coefficient_type Coeff;
+
+ Coeff f_1, f_2, f_3, f_1_2, f_1_3;
+ assign_r(f_1, 1, ROUND_UP);
+ assign_r(f_2, 2, ROUND_DOWN);
+ assign_r(f_3, 3, ROUND_DOWN);
+ div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+ div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+
+ nout << "*** Possible up-approximations ***\n";
+ nout << "1/2 = " << f_1_2 << "\n";
+ nout << "1/3 = " << f_1_3 << "\n";
+
+ mpq_class q_1_2, q_1_3;
+ assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+ assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+
+ nout << "\n*** Corresponding mpq_class values ***\n";
+ nout << "up(1/2) = " << q_1_2 << "\n";
+ nout << "up(1/3) = " << q_1_3 << "\n\n";
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ BDS bds1(4);
+ Constraint_System cs;
+ Coefficient numer, denom;
+
+ numer = q_1_3.get_num();
+ denom = q_1_3.get_den();
+ cs.insert(denom*A - denom*B >= numer);
+ cs.insert(denom*B - denom*C >= -numer);
+
+ numer = q_1_2.get_num();
+ denom = q_1_2.get_den();
+ cs.insert(denom*C - denom*D >= -numer);
+
+ bds1.add_constraints(cs);
+
+ print_constraints(bds1.constraints(), "*** BEFORE FIRST Floyd-Warshall ***");
+ nout << "\n";
+
+ // Force application of Floyd-Warshall.
+ bds1.is_empty();
+
+ print_constraints(bds1.constraints(), "*** AFTER FIRST Floyd-Warshall ***");
+ nout << "\n";
+
+ // Copy constraints (so that the BDS is marked as not closed)
+ // and then force again application of Floyd-Warshall.
+ BDS bds2(bds1.constraints());
+ bds2.is_empty();
+
+ print_constraints(bds2.constraints(), "*** AFTER SECOND Floyd-Warshall ***");
+
+ bool coefficients_exact = std::numeric_limits<Coeff>::is_exact;
+ int coefficients_digits = std::numeric_limits<Coeff>::digits;
+
+ nout << " coefficients_exact = " << coefficients_exact << endl;
+ nout << "coefficients_digits = " << coefficients_digits << endl;
+
+ bool imprecise_coefficients
+ = !coefficients_exact && (coefficients_digits == 24
+ || coefficients_digits == 64);
+ bool bds1_contains_bds2 = bds1.contains(bds2);
+ bool bds2_contains_bds1 = bds2.contains(bds1);
+
+ nout << " bds1_contains_bds2 = " << bds1_contains_bds2 << endl;
+ nout << " bds2_contains_bds1 = " << bds2_contains_bds1 << endl;
+
+ return bds1_contains_bds2
+ && ((bds2_contains_bds1 && !imprecise_coefficients)
+ || (!bds2_contains_bds1 && imprecise_coefficients));
+}
+
+bool
+test03() {
+
+ // Detect and systematically ignore overflows (which can only be
+ // due to configurations using bounded integer coefficients).
+ try {
+
+ // This test shows that the Floyd-Warshall algorithm does not compute
+ // the shortest path closure when using a floating point datatype.
+ // In particular, here it is shown that even two applications of FW
+ // are not enough to obtain idempotency.
+ typedef TBD_Shape BDS;
+ typedef BDS::coefficient_type Coeff;
+
+ Coeff f_1, f_2, f_3, f_5, f_7;
+ Coeff f_1_2, f_1_3, f_1_5, f_1_7;
+ assign_r(f_1, 1, ROUND_UP);
+ assign_r(f_2, 2, ROUND_DOWN);
+ assign_r(f_3, 3, ROUND_DOWN);
+ assign_r(f_5, 5, ROUND_DOWN);
+ assign_r(f_7, 7, ROUND_DOWN);
+ div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+ div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+ div_assign_r(f_1_5, f_1, f_5, ROUND_UP);
+ div_assign_r(f_1_7, f_1, f_7, ROUND_UP);
+
+ nout << "*** Possible up-approximations ***\n";
+ nout << "1/2 = " << f_1_2 << "\n";
+ nout << "1/3 = " << f_1_3 << "\n";
+ nout << "1/5 = " << f_1_5 << "\n";
+ nout << "1/7 = " << f_1_7 << "\n";
+
+ mpq_class q_1_2, q_1_3, q_1_5, q_1_7;
+ assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+ assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+ assign_r(q_1_5, f_1_5, ROUND_NOT_NEEDED);
+ assign_r(q_1_7, f_1_7, ROUND_NOT_NEEDED);
+
+ nout << "\n*** Corresponding mpq_class values ***\n";
+ nout << "1/2 = " << q_1_2 << "\n";
+ nout << "1/3 = " << q_1_3 << "\n";
+ nout << "1/5 = " << q_1_5 << "\n";
+ nout << "1/7 = " << q_1_7 << "\n\n";
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+
+ Constraint_System cs;
+ Coefficient numer, denom;
+
+ numer = q_1_3.get_num();
+ denom = q_1_3.get_den();
+ cs.insert(denom*B - denom*A <= -numer);
+ cs.insert(denom*C - denom*B <= numer);
+ cs.insert(denom*G - denom*F <= -numer);
+ cs.insert(denom*H - denom*G <= numer);
+
+ numer = q_1_2.get_num();
+ denom = q_1_2.get_den();
+ cs.insert(denom*D - denom*C <= numer);
+
+ numer = q_1_5.get_num();
+ denom = q_1_5.get_den();
+ cs.insert(denom*J - denom*I <= numer);
+ cs.insert(denom*E - denom*D <= numer);
+ cs.insert(denom*I - denom*H <= numer);
+
+ numer = q_1_7.get_num();
+ denom = q_1_7.get_den();
+ cs.insert(denom*F - denom*E <= -numer);
+
+ BDS bds1(10);
+ bds1.add_constraints(cs);
+ print_constraints(bds1.constraints(),
+ "*** BEFORE FIRST Floyd-Warshall ***");
+ nout << "\n";
+
+ // Force application of Floyd-Warshall.
+ bds1.is_empty();
+
+ print_constraints(bds1.constraints(),
+ "*** AFTER FIRST Floyd-Warshall ***");
+ nout << "\n";
+
+ // Copy constraints (so that the BDS is marked as not closed)
+ // and then force again application of Floyd-Warshall.
+ BDS bds2(bds1.constraints());
+ bds2.is_empty();
+
+ print_constraints(bds2.constraints(),
+ "*** AFTER SECOND Floyd-Warshall ***");
+ nout << "\n";
+
+ // Copy constraints (so that the BDS is marked as not closed)
+ // and then force once again application of Floyd-Warshall.
+ BDS bds3(bds2.constraints());
+ bds3.is_empty();
+
+ print_constraints(bds2.constraints(),
+ "*** AFTER THIRD Floyd-Warshall ***");
+ nout << "\n";
+
+
+ bool coefficients_exact = std::numeric_limits<Coeff>::is_exact;
+ int coefficients_digits = std::numeric_limits<Coeff>::digits;
+
+ nout << " coefficients_exact = " << coefficients_exact << endl;
+ nout << "coefficients_digits = " << coefficients_digits << endl;
+
+ bool imprecise_coefficients_12
+ = !coefficients_exact;
+ // && (coefficients_digits == 24
+ // || coefficients_digits == 64);
+
+ bool bds1_contains_bds2 = bds1.contains(bds2);
+ bool bds2_contains_bds1 = bds2.contains(bds1);
+
+ nout << " bds1_contains_bds2 = " << bds1_contains_bds2 << endl;
+ nout << " bds2_contains_bds1 = " << bds2_contains_bds1 << endl;
+
+ bool ok = (bds1_contains_bds2
+ && ((bds2_contains_bds1 && !imprecise_coefficients_12)
+ || (!bds2_contains_bds1 && imprecise_coefficients_12)));
+
+ bool imprecise_coefficients_23
+ = !coefficients_exact && coefficients_digits <= 24;
+
+ bool bds2_contains_bds3 = bds2.contains(bds3);
+ bool bds3_contains_bds2 = bds3.contains(bds2);
+
+ nout << " bds2_contains_bds3 = " << bds2_contains_bds3 << endl;
+ nout << " bds3_contains_bds2 = " << bds3_contains_bds2 << endl;
+
+ ok &= (bds2_contains_bds3
+ && ((bds3_contains_bds2 && !imprecise_coefficients_23)
+ || (!bds3_contains_bds2 && imprecise_coefficients_23)));
+ return ok;
+
+ }
+ catch (const std::overflow_error& e) {
+ // Systematically ignore overflows.
+ nout << "Ignoring arithmetic overflow: " << e.what() << endl;
+ return true;
+ }
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F32(test01);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test02, TBD_Shape);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/concatenate1.cc b/tests/BD_Shape/concatenate1.cc
new file mode 100644
index 0000000..8ea7dad
--- /dev/null
+++ b/tests/BD_Shape/concatenate1.cc
@@ -0,0 +1,204 @@
+/* Test BD_Shape::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ // Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ // Variable x7(6);
+ Variable x8(7);
+ Variable x9(8);
+
+ TBD_Shape bds1(6);
+ bds1.add_constraint(x2 - x3 <= 0);
+ bds1.add_constraint(x3 <= 2);
+ bds1.add_constraint(x6 - x5 <= 2);
+ bds1.add_constraint(x5 <= 3);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x2 - x3 <= 2);
+ bds2.add_constraint(x3 <= 7);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.concatenate_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(9);
+ known_result.add_constraint(x2 - x3 <= 0);
+ known_result.add_constraint(x3 <= 2);
+ known_result.add_constraint(x6 - x5 <= 2);
+ known_result.add_constraint(x5 <= 3);
+ known_result.add_constraint(x8 - x9 <= 2);
+ known_result.add_constraint(x9 <= 7);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(x - y <= 4);
+
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.concatenate_assign(bds1);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.concatenate_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x <= 0);
+ cs.insert(y == 3);
+ cs.insert(3*x - 3*y <= 5);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraints(cs);
+
+ TBD_Shape bds2(0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.concatenate_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 0);
+ known_result.add_constraint(y == 3);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(C >= 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A >= 0);
+ bds2.add_constraint(A <= 1);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 2);
+ bds2.add_constraint(A - B <= 0);
+ bds2.add_constraint(B - A <= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.concatenate_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D <= 1);
+ known_result.add_constraint(E >= 0);
+ known_result.add_constraint(E <= 2);
+ known_result.add_constraint(D - E <= 0);
+ known_result.add_constraint(E - D <= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(x - y <= 4);
+
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.concatenate_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/congruences1.cc b/tests/BD_Shape/congruences1.cc
new file mode 100644
index 0000000..4aaac30
--- /dev/null
+++ b/tests/BD_Shape/congruences1.cc
@@ -0,0 +1,220 @@
+/* Test BD_Shape::congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bds1(2);
+ bds1.add_congruence((0*A %= 1) / 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Constraint_System cs = bds1.minimized_constraints();
+
+ print_constraints(cs, "*** cs ***");
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(cgs);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = check_result(bds2, known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1(3, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(cgs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_congruence((x %= 1) / 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(3);
+ bds2.add_congruences(cgs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TBD_Shape bds1(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ print_constraints(bds1, "*** bds1 ***");
+ TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = check_result(bds2, known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds1(0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(cgs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_congruence((x %= 1) / 0);
+ bds.add_congruence((x %= 2) / 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds.space_dimension(), EMPTY);
+
+ Congruence_System cgs = bds.congruences();
+ TBD_Shape bds1(3);
+ bds1.add_congruences(bds.congruences());
+
+ bool ok = check_result(bds, bds1) && check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bds1(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+ bds2.add_congruences(cgs);
+ bool b = !bds2.is_empty();
+
+ bool ok = !b && check_result(bds2, known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.refine_with_congruence((x %= 1) / 0);
+ bds1.refine_with_congruence((y %= 3) / 2);
+ bds1.refine_with_congruence((y - z %= 0) / 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Congruence_System cgs = bds1.congruences();
+ TBD_Shape bds2(3);
+ bds2.add_congruences(cgs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/BD_Shape/constrains1.cc b/tests/BD_Shape/constrains1.cc
new file mode 100644
index 0000000..091dd44
--- /dev/null
+++ b/tests/BD_Shape/constrains1.cc
@@ -0,0 +1,229 @@
+/* Test BD_Shape::constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred) \
+ if (!pred) { \
+ nout << "!" #pred << endl; \
+ ok = false; \
+ }
+
+#define TEST_PREDICATE_FALSE(pred) \
+ if (pred) { \
+ nout << #pred << endl; \
+ ok = false; \
+ }
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(0*A == 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(0*A == 1);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds = TBD_Shape(2);
+ bds.add_constraint(A == B);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds = TBD_Shape(2);
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(A >= 1);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(B >= 2);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds.add_constraint(A <= B);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3, EMPTY);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ TBD_Shape bds(0);
+ bds.add_constraint(Linear_Expression::zero() == 1);
+
+ try {
+ (void) bds.constrains(A);
+ }
+ catch (std::invalid_argument& e) {
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B >= 7);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B == 0);
+ bds.unconstrain(A);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(B >= A);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= B+1);
+ bds.add_constraint(A <= B);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= B);
+ bds.add_constraint(A <= B-1);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/constraints1.cc b/tests/BD_Shape/constraints1.cc
new file mode 100644
index 0000000..5e90c46
--- /dev/null
+++ b/tests/BD_Shape/constraints1.cc
@@ -0,0 +1,197 @@
+/* Test BD_Shape::constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bds1(0, EMPTY);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Constraint_System cs = bds1.constraints();
+ TBD_Shape bds2(cs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1(0, UNIVERSE);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ Constraint_System cs = bds1.constraints();
+ TBD_Shape bds2(cs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B - C >= 1);
+ bds1.add_constraint(C - A <= 9);
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.contains(bds1);
+
+ Constraint_System cs = bds1.constraints();
+ TBD_Shape bds2(cs);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B - C == 1);
+ bds1.add_constraint(C - A <= 9);
+
+ Constraint_System cs = bds1.constraints();
+ TBD_Shape bds2(cs);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bool ok = check_result(bds2, known_result);
+
+ return ok;
+}
+
+bool
+test05() {
+
+ TBD_Shape bds1(0);
+ bds1.add_constraint(Linear_Expression(1) == 0);
+
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.refine_with_constraint(A > 0);
+ bds.refine_with_constraint(B < 0);
+ bds.refine_with_constraint(2*B - 2*C < 1);
+ bds.refine_with_constraint(A - C > 2);
+ bds.refine_with_constraint(A + 2*D >= 5);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(2*B - 2*C <= 1);
+ known_result.add_constraint(A - C >= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs(A > 0);
+ cs.insert(2*B - 2*C <= 1);
+ cs.insert(A - 5*C > 4);
+
+ TBD_Shape bds(3);
+ bds.refine_with_constraints(cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(2*B - 2*C <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/contains1.cc b/tests/BD_Shape/contains1.cc
new file mode 100644
index 0000000..99514f9
--- /dev/null
+++ b/tests/BD_Shape/contains1.cc
@@ -0,0 +1,203 @@
+/* Test BD_Shape::contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x - y <= 1);
+
+ // The BD_Shape is empty, because it has got a negative cycle.
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x - y <= 2);
+ bds2.add_constraint(y - z <= 2);
+ bds2.add_constraint(z - x <= -5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1;
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bds1(0, EMPTY);
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool ok = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x - y >= 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y == 0);
+
+ try {
+ // This is an invalid use of Polyhedron::contains(): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ bds1.contains(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(D >= 0);
+ cs.insert(C >= 0);
+ cs.insert(B <= 0);
+ cs.insert(A >= 0);
+
+ TBD_Shape bds1(cs);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(cs);
+ bds2.add_constraint(A - B >= 0);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool contained = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(C <= 0);
+ bds1.add_constraint(B - C <= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A == 0);
+ bds2.add_constraint(C <= 0);
+ bds2.add_constraint(B - C <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool contained = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***" << endl;
+ nout << (!contained ? "true" : "false") << endl;
+
+ return !contained;
+}
+
+bool
+test07() {
+ TBD_Shape bds1(3, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(3, UNIVERSE);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool contained = bds1.contains(bds2);
+
+ nout << "*** bds1.contains(bds2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return !contained;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/containsintegerpoint1.cc b/tests/BD_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..66b3063
--- /dev/null
+++ b/tests/BD_Shape/containsintegerpoint1.cc
@@ -0,0 +1,138 @@
+/* Test BD_Shape::contains_integer_point().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ BD_Shape<mpz_class> bds(3);
+ bds.add_constraints(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool contains = bds.contains_integer_point();
+
+ nout << "bds.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ BD_Shape<mpq_class> bds(3);
+ bds.add_constraints(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool contains = bds.contains_integer_point();
+
+ nout << "bds.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ TBD_Shape bds(3);
+ bds.add_constraints(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool contains = bds.contains_integer_point();
+
+ nout << "bds.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ // NOTE: results depends on whether or not the rational constraints
+ // on y have been approximated as integral constraints.
+ typedef TBD_Shape::coefficient_type_base T;
+ return std::numeric_limits<T>::is_integer ? contains : !contains;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y - 3*z <= 2);
+ cs.insert(8*z - 8*y >= 7);
+
+ BD_Shape<mpq_class> bds(3);
+ bds.add_constraints(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool contains = bds.contains_integer_point();
+
+ nout << "bds.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/difference1.cc b/tests/BD_Shape/difference1.cc
new file mode 100644
index 0000000..7bdc0cf
--- /dev/null
+++ b/tests/BD_Shape/difference1.cc
@@ -0,0 +1,279 @@
+/* Test BD_Shape::difference_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(A <= -2);
+ bds1.add_constraint(B == 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A >= 0);
+ bds2.add_constraint(A <= 2);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** ph2 ***");
+
+ bds1.difference_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1;
+ TBD_Shape bds2;
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.difference_assign(bds2);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-4) >= 0);
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 2);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y <= 5);
+ bds1.add_constraint(y >= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(x >= 1);
+ bds2.add_constraint(y <= 4);
+ bds2.add_constraint(y >= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.difference_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 5);
+ known_result.add_constraint(y >= 2);
+ known_result.add_constraint(y - x >= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 8);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y <= 7);
+ bds1.add_constraint(y >= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(x >= 1);
+ bds2.add_constraint(y <= 0);
+ bds2.add_constraint(y >= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.difference_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 8);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y <= 7);
+ bds1.add_constraint(y >= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x <= 9);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(y <= 8);
+ bds2.add_constraint(y >= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.difference_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 8);
+ bds1.add_constraint(y <= 7);
+ bds1.add_constraint(y >= 1);
+ bds1.add_constraint(z <= 2);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x == 8);
+ bds2.add_constraint(y <= 2);
+ bds2.add_constraint(y >= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.difference_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 8);
+ known_result.add_constraint(y <= 7);
+ known_result.add_constraint(y >= 1);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(B <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A >= 2);
+ bds2.add_constraint(A <= 4);
+ bds2.add_constraint(B >= 0);
+ bds2.add_constraint(B <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ bds1.difference_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TBD_Shape bds1(3);
+ TBD_Shape bds2(5);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::difference_assign(bds2): it is impossible to apply
+ // this method to two polyhedra of different dimensions.
+ bds1.difference_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/discrete1.cc b/tests/BD_Shape/discrete1.cc
new file mode 100644
index 0000000..a9a56e5
--- /dev/null
+++ b/tests/BD_Shape/discrete1.cc
@@ -0,0 +1,215 @@
+/* Test BD_Shape::is_discrete().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(x - y == 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(A - B == 3);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(E - D == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+
+ bds.add_constraint(A == 5);
+ bds.add_constraint(A - B == 3);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(E - D == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 3);
+ bds.add_constraint(B - A <= -5);
+ bds.add_constraint(-B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds(2, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return ok;
+}
+
+bool
+test06() {
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(A - D == 8);
+ bds.add_constraint(B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(E == 1);
+ bds.add_constraint(A - D == 8);
+ bds.add_constraint(B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return !ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(7);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B == 2);
+ bds.add_constraint(B - A <= -6);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool ok = bds.is_discrete();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/BD_Shape/disjoint1.cc b/tests/BD_Shape/disjoint1.cc
new file mode 100644
index 0000000..0474325
--- /dev/null
+++ b/tests/BD_Shape/disjoint1.cc
@@ -0,0 +1,193 @@
+/* Test BD_Shape::is_disjoint_from(const BD_Shape& y).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(B == 0);
+ bds1.add_constraint(A >= 1);
+ bds1.add_constraint(A <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A == 0);
+ bds2.add_constraint(B >= 1);
+ bds2.add_constraint(B <= 2);
+
+ bool ok = bds1.is_disjoint_from(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(3);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A <= 3);
+ bds2.add_constraint(B - A <= -1);
+ bds2.add_constraint(B >= -5);
+
+ bool disjoint = bds1.is_disjoint_from(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return !disjoint;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+
+ Constraint_System cs1;
+ cs1.insert(x1 >= -4);
+ cs1.insert(x2 - x1 <= 0);
+ cs1.insert(x1 - x2 <= -5);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraints(cs1);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(2*x1 >= 1);
+ cs2.insert(2*x1 <= 3);
+ cs2.insert(6*x2 <= 1);
+ cs2.insert(3*x2 >= -2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraints(cs2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool disjoint = bds1.is_disjoint_from(bds2);
+
+ return disjoint;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= y);
+
+ TBD_Shape bds2(3);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::is_disjoint_from(bds2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ bds1.is_disjoint_from(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2, EMPTY);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A - B <= 5);
+
+ bool disjoint = bds1.is_disjoint_from(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return disjoint;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A >= 0);
+ bds1.add_constraint(B >= -4);
+
+ TBD_Shape bds2(2, EMPTY);
+
+ bool disjoint = bds1.is_disjoint_from(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return disjoint;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A == 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A == 1);
+
+ bool ok = bds1.is_disjoint_from(bds2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/dropsomenonintegerpoints1.cc b/tests/BD_Shape/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..f383155
--- /dev/null
+++ b/tests/BD_Shape/dropsomenonintegerpoints1.cc
@@ -0,0 +1,356 @@
+/* Test BD_Shape::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+
+ bds.add_constraint(2*A >= 1);
+ bds.add_constraint(2*B >= -1);
+ bds.add_constraint(2*A - 2*B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points();
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 1);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ BD_Shape<mpq_class> bds1;
+ BD_Shape<mpq_class> bds2(0, EMPTY);
+ BD_Shape<mpq_class> bds3(2, EMPTY);
+ BD_Shape<mpq_class> bds4(2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result1(bds1);
+ BD_Shape<mpq_class> known_result2(bds2);
+ BD_Shape<mpq_class> known_result3(bds3);
+ BD_Shape<mpq_class> known_result4(bds4);
+
+ bds1.drop_some_non_integer_points();
+ bds2.drop_some_non_integer_points();
+ bds3.drop_some_non_integer_points();
+ bds4.drop_some_non_integer_points();
+
+ bool ok = (bds1 == known_result1 && bds2 == known_result2
+ && bds3 == known_result3 && bds4 == known_result4);
+
+ print_constraints(bds1, "*** after bds1.drop_some_non_integer_points() ***");
+ print_constraints(bds2, "*** after bds2.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(A >= 0);
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points();
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A == B);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points();
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(2*A == 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points();
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(2*A <= 1);
+ bds.add_constraint(2*B <= -1);
+ bds.add_constraint(4*A - 4*B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points();
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= -1);
+ known_result.add_constraint(A - B <= 1);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ BD_Shape<mpq_class> bds(2);
+
+ bds.add_constraint(2*A >= 1);
+ bds.add_constraint(2*B >= -1);
+ bds.add_constraint(2*A - 2*B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points(varset_A);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(2*B >= -1);
+ known_result.add_constraint(2*A - 2*B >= 1);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds,
+ "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ BD_Shape<mpq_class> bds1(2, EMPTY);
+ BD_Shape<mpq_class> bds2(2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result1(bds1);
+ BD_Shape<mpq_class> known_result2(bds2);
+
+ bds1.drop_some_non_integer_points(varset_A);
+ bds2.drop_some_non_integer_points(varset_A);
+
+ bool ok = (bds1 == known_result1 && bds2 == known_result2);
+
+ print_constraints(bds1,
+ "*** after bds1.drop_some_non_integer_points(varset_A) ***");
+ print_constraints(bds2,
+ "*** after bds2.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(2*A - 2*B == 1);
+ bds.add_constraint(A >= 0);
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points(varset_A);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds,
+ "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A == B);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points(varset_A);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds,
+ "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_B;
+ varset_B.insert(B);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(2*A == 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points(varset_B);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds,
+ "*** after bds.drop_some_non_integer_points(varset_B) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(2*A <= 1);
+ bds.add_constraint(2*B <= -1);
+ bds.add_constraint(4*A - 4*B <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.drop_some_non_integer_points(varset_A);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(2*B <= -1);
+ known_result.add_constraint(4*A - 4*B <= 7);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds,
+ "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc
new file mode 100644
index 0000000..5990f0b
--- /dev/null
+++ b/tests/BD_Shape/empty1.cc
@@ -0,0 +1,207 @@
+/* Different ways of creating an empty BD_Shape.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(4);
+ TBD_Shape bds2(4);
+
+ bds1.add_constraint(-x <= 4);
+ bds1.add_constraint(y - x <= 0);
+ bds1.add_constraint(x - y <= -5);
+
+ bool empty = bds1.is_empty();
+
+ nout << "*** bds1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false ") << endl;
+
+ bds2.add_constraint(-x <= 4);
+ bds2.add_constraint(y - x <= 0);
+ bds2.add_constraint(x - y <= 5);
+ bds2.add_constraint(z - x <= 1);
+
+ bool empty1 = bds2.is_empty();
+
+ nout << "*** bds2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return !empty1 && empty;
+
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(4);
+ TBD_Shape bds2(4);
+
+ bds1.add_constraint(-x <= 2);
+ bds1.add_constraint(y - x <= -9);
+ bds1.add_constraint(x - y <= -7);
+
+ bool empty = bds1.is_empty();
+
+ print_constraints(bds1, "*** bds1 ***");
+ nout << "*** bds1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ bds2.add_constraint(-x <= 7);
+ bds2.add_constraint(y - x <= 1);
+ bds2.add_constraint(-y <= 2);
+ bds2.add_constraint(z - x <= 1);
+
+ bool empty1 = bds2.is_empty();
+
+ print_constraints(bds2, "*** bds2 ***");
+ nout << "*** bds2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return !empty1 && empty;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ // Variable x6(5);
+
+ TBD_Shape bds1(6);
+ TBD_Shape bds2(6);
+
+ bds1.add_constraint(x1 <= 3);
+ bds1.add_constraint(x4 <= 3);
+ bds1.add_constraint(x2 - x1 <= 0);
+ bds1.add_constraint(x3 - x1 <= -2);
+ bds1.add_constraint(x5 - x1 <= 2);
+ bds1.add_constraint(-x2 <= 0);
+ bds1.add_constraint(x3 - x2 <= 5);
+ bds1.add_constraint(x4 - x3 <= -6);
+ bds1.add_constraint(x1 - x4 <= 5);
+ bds1.add_constraint(x5 - x4 <= 2);
+ bds1.add_constraint(-x5 <= -5);
+ bds1.add_constraint(x3 - x5 <= 7);
+
+ bool empty = bds1.is_empty();
+
+ nout << "*** bds1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ bds2.add_constraint(x1 <= 3);
+ bds2.add_constraint(x4 <= 3);
+ bds2.add_constraint(x2 - x1 <= 0);
+ bds2.add_constraint(x3 - x1 <= 2);
+ bds2.add_constraint(x5 - x1 <= 2);
+ bds2.add_constraint(-x2 <= 0);
+ bds2.add_constraint(x3 - x2 <= 5);
+ bds2.add_constraint(x4 - x3 <= 6);
+ bds2.add_constraint(x1 - x4 <= 5);
+ bds2.add_constraint(x5 - x4 <= 2);
+ bds2.add_constraint(-x5 <= 5);
+ bds2.add_constraint(x3 - x5 <= 7);
+
+ bool empty1 = bds2.is_empty();
+
+ nout << "*** bds2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return !empty1 && empty;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(A == 0);
+ bds.add_constraint(C >= 0);
+ bds.add_constraint(B - C >= 1);
+
+ bool empty = bds.is_empty();
+
+ print_constraints(bds, "*** bds ***");
+ nout << "*** bds.is_empty() ***"
+ << endl
+ << (empty ? "true" : "false") << endl;
+
+ return !empty;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ TBD_Shape bds(5);
+
+ Coefficient a;
+ if (std::numeric_limits<Coefficient>::is_bounded)
+ a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+ else
+ a = 1300000000;
+
+ bds.add_constraint(x1 - x2 <= -a);
+ bds.add_constraint(x2 - x3 <= -a);
+ bds.add_constraint(x3 - x4 <= a);
+ bds.add_constraint(x4 - x5 <= a);
+ bds.add_constraint(x5 - x1 <= a);
+
+ print_constraints(bds, "*** bds ***");
+
+ bool empty = bds.is_empty();
+
+ nout << "*** bds.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ return !empty;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/equality1.cc b/tests/BD_Shape/equality1.cc
new file mode 100644
index 0000000..cd96684
--- /dev/null
+++ b/tests/BD_Shape/equality1.cc
@@ -0,0 +1,132 @@
+/* Test BD_Shape::operator==().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+ TBD_Shape bds2(2);
+
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(x - y <= 4);
+
+ bds2.add_constraint(x - y <= 5);
+ bds2.add_constraint(-y <= -2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool known_result = false;
+ bool ok = ((bds1 == bds2) == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds1(0, EMPTY);
+ TBD_Shape bds2(0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool known_result = false;
+ bool ok = ((bds1 == bds2) == known_result);
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bds1(0);
+ TBD_Shape bds2(0, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool known_result = false;
+ bool ok = ((bds1 == bds2) == known_result);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A - B <= 1);
+ bds1.add_constraint(B - A <= -2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A - B <= 1);
+ bds2.add_constraint(B - A <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool known_result = false;
+ bool ok = ((bds1 == bds2) == known_result);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A - B <= 1);
+ bds1.add_constraint(B - A <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A - B <= 1);
+ bds2.add_constraint(B - A <= -2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bool known_result = false;
+ bool ok = ((bds1 == bds2) == known_result);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/expandspacedim1.cc b/tests/BD_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..3e286a0
--- /dev/null
+++ b/tests/BD_Shape/expandspacedim1.cc
@@ -0,0 +1,246 @@
+/* Test BD_Shape::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bds(3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 1);
+
+ TBD_Shape known_result(4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** After bds.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ // Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(3, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(B, 1);
+
+ TBD_Shape known_result(4, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(B, 1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 0);
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(A, 0) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2, EMPTY);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 1);
+
+ TBD_Shape known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 1);
+
+ TBD_Shape known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 2);
+
+ TBD_Shape known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B <= 2);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D - B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(C == 1);
+ bds.add_constraint(A - B >= 1);
+ bds.add_constraint(B <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(A, 1);
+ bds.expand_space_dimension(C, 1);
+
+ TBD_Shape known_result(5);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(A - B >= 1);
+ known_result.add_constraint(C == 1);
+ known_result.add_constraint(E == 1);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(D <= 1);
+ known_result.add_constraint(D - B >= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.expand_space_dimension(A, 1);"
+ " bds.expand_space_dimension(C, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2, EMPTY);
+ bds.add_constraint(A <= 2);
+ bds.add_constraint(A - B >= 1);
+ bds.add_constraint(B <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.expand_space_dimension(B, 1);
+
+ TBD_Shape known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/foldspacedims1.cc b/tests/BD_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..36a3aa1
--- /dev/null
+++ b/tests/BD_Shape/foldspacedims1.cc
@@ -0,0 +1,338 @@
+/* Test BD_Shape::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(3);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(3, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A - C <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - C <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {} into B ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 3);
+ bds.add_constraint(B >= 7);
+ bds.add_constraint(B <= 12);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 12);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 3);
+ bds.add_constraint(B >= 7);
+ bds.add_constraint(B <= 12);
+ bds.add_constraint(C == 15);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ bds.fold_space_dimensions(to_fold, C);
+
+ TBD_Shape known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 15);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A, B} into C ***");
+
+ return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(C >= 0);
+ bds.add_constraint(C - B <= 2);
+ bds.add_constraint(D >= 0);
+ bds.add_constraint(D - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ bds.fold_space_dimensions(to_fold, A);
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {C, D} into A ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B == 0);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(C >= 0);
+ bds.add_constraint(C - B <= 2);
+ bds.add_constraint(D >= 0);
+ bds.add_constraint(D - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ bds.fold_space_dimensions(to_fold, C);
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(C >= 0);
+ bds.add_constraint(C - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+
+ bds.fold_space_dimensions(to_fold, A);
+
+ TBD_Shape known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ bds.OK();
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(1, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(1, EMPTY);
+
+ bds.add_space_dimensions_and_embed(1);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ bds.OK();
+
+ bds.fold_space_dimensions(to_fold, B);
+
+ TBD_Shape known_result(1, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/frequency1.cc b/tests/BD_Shape/frequency1.cc
new file mode 100644
index 0000000..ca980b2
--- /dev/null
+++ b/tests/BD_Shape/frequency1.cc
@@ -0,0 +1,279 @@
+/* Test BD_Shape::frequency().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bds1(1);
+
+ TBD_Shape bds2(1, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (!bds1.frequency(A, num1, den1, valn1, vald1)
+ && !bds2.frequency(A, num2, den2, valn2, vald2));
+ print_constraints(bds1, "*** bds1 ***");
+ nout << "num1 " << num1 << ", den1 " << den1 << endl;
+ nout << "valn1 " << valn1 << ", vald1 " << vald1 << endl;
+ print_constraints(bds2, "*** bds2 ***");
+ nout << "num2 " << num2 << ", den2 " << den2 << endl;
+ nout << "valn2 " << valn2 << ", vald2 " << vald2 << endl;
+
+ return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+ TBD_Shape bds1(0);
+
+ TBD_Shape bds2(0, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ Linear_Expression three(3);
+ bool ok = (bds1.frequency(three, num1, den1, valn1, vald1)
+ && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+ && !bds2.frequency(three, num2, den2, valn2, vald2));
+ print_constraints(bds1, "*** bds1 ***");
+ nout << "num1 " << num1 << ", den1 " << den1 << endl;
+ nout << "valn1 " << valn1 << ", vald1 " << vald1 << endl;
+ print_constraints(bds2, "*** bds2 ***");
+ nout << "num2 " << num2 << ", den2 " << den2 << endl;
+ nout << "valn2 " << valn2 << ", vald2 " << vald2 << endl;
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (bds.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!bds.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(A - B >= 5);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!bds.frequency(Linear_Expression(B), num, den, valn, vald));
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(B == 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (bds.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!bds.frequency(Linear_Expression(A - B), num, den, valn, vald));
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(2*A - 2*B == 2);
+ bds.add_constraint(3*C == 3);
+ bds.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (bds.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 3 && vald == 1);
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(4*A - 4*B == 1);
+ bds.add_constraint(3*C == 1);
+ bds.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool discrete = bds.frequency(Linear_Expression(A - B),
+ num, den, valn, vald);
+ // If the shape is based on an integral coefficient type, then
+ // approximations will induce non discreteness of the linear expression.
+ bool ok = std::numeric_limits<TBD_Shape::coefficient_type_base>::is_integer
+ ? (!discrete && num == 0 && den == 0 && valn == 0 && vald == 0)
+ : (discrete && num == 0 && den == 1 && valn == 1 && vald == 4);
+ print_constraints(bds, "*** bds ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+// Non-relational test of an empty bd_shape in 1-dimension.
+bool
+test10() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(A >= 1);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!bds.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/frombdshape1.cc b/tests/BD_Shape/frombdshape1.cc
new file mode 100644
index 0000000..982576d
--- /dev/null
+++ b/tests/BD_Shape/frombdshape1.cc
@@ -0,0 +1,147 @@
+/* Test BD_Shape copy construct, construction from other
+ BD shapes and assignment.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TBD_Shape bds1(cs);
+
+ TBD_Shape bds(bds1);
+
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TBD_Shape bds1(cs);
+
+ TBD_Shape bds = bds1;
+
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TBD_Shape bds1(cs);
+
+ TBD_Shape bds(1);
+ bds = bds1;
+
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TBD_Shape bds1(cs);
+
+ BD_Shape<mpq_class> bds(bds1);
+
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+
+ BD_Shape<mpq_class> bds_q(1, UNIVERSE);
+ bds_q.refine_with_constraint(3*A <= 1);
+ bds_q.refine_with_constraint(3*A >= 2);
+
+ print_constraints(bds_q, "*** bds_q ***");
+
+ BD_Shape<mpz_class> bds_z(bds_q);
+
+ BD_Shape<mpz_class> known_result(bds_q.space_dimension(), EMPTY);
+
+ bool ok = (check_result(bds_z, known_result));
+
+ print_constraints(bds_z, "*** bds_z ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/frombox1.cc b/tests/BD_Shape/frombox1.cc
new file mode 100644
index 0000000..9482023
--- /dev/null
+++ b/tests/BD_Shape/frombox1.cc
@@ -0,0 +1,375 @@
+/* Test BD_Shape::BD_Shape(const Box<Interval>&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+ Rational_Box box(2);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(3*B == 2);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(3*B == 2);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(3*A == -2);
+ box.add_constraint(B == -10);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(3*A == -2);
+ known_bds.add_constraint(B == -10);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+ print_constraints(known_bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Rational_Box box(3);
+ box.add_constraint(5*C == 15);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(3);
+ known_bds.add_constraint(5*C == 15);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+ Rational_Box box(0);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds;
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+ Rational_Box box(2);
+ box.set_empty();
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2, EMPTY);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Rational_Box box(4);
+ box.add_constraint(D == 4);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(4);
+ known_bds.add_constraint(D == 4);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Unit square.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 1);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(A >= 0);
+ known_bds.add_constraint(A <= 1);
+ known_bds.add_constraint(B >= 0);
+ known_bds.add_constraint(B <= 1);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(2*B == 1);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(A >= 0);
+ known_bds.add_constraint(2*B == 1);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A <= 3);
+ box.add_constraint(2*B == 1);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(7*A <= 3);
+ known_bds.add_constraint(2*B == 1);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A == 3);
+ box.add_constraint(2*B >= 1);
+ box.add_constraint(2*B <= 0);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2, EMPTY);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+ Rational_Box box(0);
+ box.set_empty();
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(0, EMPTY);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Rational_Box box(6);
+ box.add_constraint(3*A == -2);
+ box.add_constraint(4*B == -11);
+ box.add_constraint(3*D == 18);
+ box.add_constraint(7*E == 15);
+ box.add_constraint(7*F == -15);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(6);
+ known_bds.add_constraint(3*A == -2);
+ known_bds.add_constraint(4*B == -11);
+ known_bds.add_constraint(3*D == 18);
+ known_bds.add_constraint(7*E == 15);
+ known_bds.add_constraint(7*F == -15);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A == 3);
+ box.add_constraint(2*B >= 1);
+ box.add_constraint(B >= 1);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(2);
+ known_bds.add_constraint(7*A == 3);
+ known_bds.add_constraint(2*B >= 1);
+ known_bds.add_constraint(B >= 1);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+
+ Rational_Box box(1);
+ box.add_constraint(A >= 5);
+ box.add_constraint(A <= -5);
+
+ TBD_Shape bds(box);
+
+ TBD_Shape known_bds(1, EMPTY);
+
+ bool ok = (bds == known_bds);
+
+ print_constraints(bds, "*** bds(box) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/fromgensys1.cc b/tests/BD_Shape/fromgensys1.cc
new file mode 100644
index 0000000..313dc09
--- /dev/null
+++ b/tests/BD_Shape/fromgensys1.cc
@@ -0,0 +1,156 @@
+/* Test BD_Shape::BD_Shape(const Generator_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Generator_System gs;
+ TBD_Shape bds(gs);
+
+ BD_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(closure_point(V));
+
+ try {
+ // It is illegal to build a BD_Shape starting from a non-empty
+ // generator system having no points.
+ TBD_Shape bds(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(ray(V));
+
+ try {
+ // It is illegal to build a BD_Shape starting from a non-empty
+ // generator system having no points.
+ TBD_Shape bds(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(ray(A + B));
+ gs.insert(point(1*A + 2*B + 3*C + 4*D));
+ gs.insert(point(2*A + 3*B + 4*C + 5*D));
+ TBD_Shape bds(gs);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C >= 3);
+ known_result.add_constraint(C <= 4);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 5);
+ known_result.add_constraint(A == B-1);
+ known_result.add_constraint(C == D-1);
+ known_result.add_constraint(C <= A+2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(A >= B);
+ ph.add_constraint(B >= 2*C);
+ ph.add_constraint(C >= 3*D);
+ ph.add_constraint(D >= 4);
+ ph.add_constraint(A-D <= 50);
+
+ TBD_Shape bds(ph.generators());
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(C <= 30);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 10);
+ known_result.add_constraint(B - A <= 0);
+ known_result.add_constraint(A - D <= 50);
+ known_result.add_constraint(B - C >= 12);
+ known_result.add_constraint(C - D <= 23);
+ known_result.add_constraint(C - D >= 8);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/fromgrid1.cc b/tests/BD_Shape/fromgrid1.cc
new file mode 100644
index 0000000..3bbb65c
--- /dev/null
+++ b/tests/BD_Shape/fromgrid1.cc
@@ -0,0 +1,223 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+ and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x - y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x - y %= 0) / 0);
+ gr.add_congruence((y - z %= 0) / 0);
+ gr.add_congruence((z %= 0) / 1);
+
+ TBD_Shape bds(gr);
+
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension());
+ known_bds.add_constraint(x - y == 0);
+ known_bds.add_constraint(y - z == 0);
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+ Grid gr(2);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 1) / 3);
+ gr.add_congruence((y - z %= 2) / 5);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+ Grid gr(0);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds;
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+ Grid gr(2, EMPTY);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(2, EMPTY);
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// A single point.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x - y %= 1) / 0);
+ gr.add_congruence((y %= 0) / 0);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension());
+ known_bds.add_constraint(x == 1);
+ known_bds.add_constraint(y == 0);
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+ Grid gr(0, EMPTY);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(0, EMPTY);
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+ Grid gr(2);
+ Constraint_System cs = gr.constraints();
+
+ TBD_Shape bds(cs);
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+// An empty grid, but not known to be so (yet).
+bool
+test09() {
+ Variable A(0);
+ Grid gr(1);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A %= 1) / 2);
+
+ TBD_Shape bds(gr);
+
+ BD_Shape<mpq_class> known_bds(gr.space_dimension(), EMPTY);
+
+ bool ok = (check_result(bds, known_bds));
+
+ print_constraints(bds, "*** bds ***");
+ print_constraints(known_bds, "*** known_bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/fromoctagonalshape1.cc b/tests/BD_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..51ed504
--- /dev/null
+++ b/tests/BD_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,81 @@
+/* Test BD_Shape::BD_Shape(const Octagonal_Shape&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TOctagonal_Shape os(cs);
+ os.add_constraint(A + B <= 5);
+ os.add_constraint(A + B >= -10);
+
+ TBD_Shape bds(os);
+
+ BD_Shape<mpq_class> known_result(cs);
+ known_result.add_constraint(2*A <= 23);
+ known_result.add_constraint(B >= -14);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= 10);
+ TOctagonal_Shape os(cs);
+
+ TBD_Shape bds(os);
+
+ BD_Shape<mpq_class> known_result(os.space_dimension(), EMPTY);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/frompolyhedron1.cc b/tests/BD_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..95c2cdd
--- /dev/null
+++ b/tests/BD_Shape/frompolyhedron1.cc
@@ -0,0 +1,65 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B <= 5);
+ cs.insert(A + 2*B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(3*A - 5*B <= 18);
+ C_Polyhedron ph(cs);
+
+ TBD_Shape bds1(ph, SIMPLEX_COMPLEXITY);
+ TBD_Shape bds2(ph, ANY_COMPLEXITY);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(11*A <= 61);
+ known_result.add_constraint(2*B <= 5);
+ known_result.add_constraint(5*B >= -18);
+ known_result.add_constraint(11*A - 11*B <= 64);
+
+ bool ok = (bds1 == bds2
+ && check_result(bds1, known_result,
+ "7.50e-7", "4.89e-7", "4.34e-7"));
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/BD_Shape/fromspacedim1.cc b/tests/BD_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..97aa7a4
--- /dev/null
+++ b/tests/BD_Shape/fromspacedim1.cc
@@ -0,0 +1,123 @@
+/* Test BD_Shape::BD_Shape(dimension_type, Degenerate_Element).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bds(0, EMPTY);
+
+ bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds(0, UNIVERSE);
+
+ bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bds(4, EMPTY);
+
+ bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TBD_Shape bds(4, UNIVERSE);
+
+ bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A <= -1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(C >= 1);
+
+ bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(C >= 1);
+
+ bool ok = (bds.OK() && bds.space_dimension() == 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage1.cc b/tests/BD_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..9c533c3
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,591 @@
+/* Test BD_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A <= B);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B - A >= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image"
+ "(B, GREATER_OR_EQUAL, A+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image"
+ "(A, LESS_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(x >= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(- y <= 1);
+ known_result.add_constraint(x - y >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(x, "
+ "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x >= 2);
+ bds.add_constraint(x - y <= 3);
+ bds.add_constraint(y <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y >= x - 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(y, "
+ "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A);
+ Linear_Expression e2(A);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A <= B);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, A) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A - B <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A - B <= 0);
+ bds.add_constraint(B - C == 2);
+ bds.add_constraint(C - A <= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(A - C == 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(B >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(-B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C);
+ Linear_Expression e2(A + 1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B <= 5);
+ known_result.add_constraint(C - A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(C, "
+ "LESS_OR_EQUAL, A + 1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 4);
+ bds.add_constraint(y <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(3*x + 2, LESS_OR_EQUAL, 2*x - 3);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(3*x + 2, "
+ "LESS_OR_EQUAL, 2*x - 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x - y <= 7);
+ bds.add_constraint(y >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+ known_result.add_constraint(3*x == 10);
+
+ bool ok = check_result(bds, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(2*B + 3*A,
+ LESS_OR_EQUAL, Linear_Expression(1));
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(3*A + 2*B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+ known_result.affine_image(A, 4*B + 5, 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(-2*A + 5, "
+ "EQUAL, -4*B) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(A + 2*B - 5, GREATER_OR_EQUAL, 3*B);
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A + 2*B - 5, "
+ "GREATER_OR_EQUAL, 3*B) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(2*B + C + 1, LESS_OR_EQUAL, A - 3*B + 2*C);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(2*B + C + 1, "
+ "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(2*B + C + 1, GREATER_OR_EQUAL, A - 3*B + 2*C);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(2*B + C + 1, "
+ "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(-2*A - B - 1,
+ GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(-2*A - B - 1, "
+ "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(-2*C + 3, LESS_OR_EQUAL, -3*B + 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(-2*C + 3, "
+ "LESS_OR_EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(Linear_Expression(3),
+ GREATER_OR_EQUAL,
+ Linear_Expression(4));
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(3, "
+ "GREATER_OR_EQUAL, 4) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage2.cc b/tests/BD_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..35bad23
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,518 @@
+/* Test BD_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 4);
+ bds.add_constraint(x >= -6);
+ bds.add_constraint(y == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(x >= -6);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(y, "
+ "LESS_OR_EQUAL, -y + 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 4);
+ bds.add_constraint(x >= -6);
+ bds.add_constraint(y == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= -7);
+ known_result.add_constraint(y == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(x, "
+ "GREATER_OR_EQUAL, -x - 3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 3*B + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B >= -1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(A - B == 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(2*B - 2*A <= -3);
+
+ bool ok = check_result(bds, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(5*C <= 7);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(bds, "*** bds.generalized_affine_image(C, "
+ "LESS_OR_EQUAL, 2*C + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+ known_result.affine_image(C, 5*C - 3, 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(C, "
+ "EQUAL, 5*C - 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -1);
+ known_result.add_constraint(C - A <= 2);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, -B - 2, 3) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(B, LESS_OR_EQUAL, 4*A -2*C + 3, -3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C - A <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A - B == 0);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(C - A <=2);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+ known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(B, "
+ "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A);
+ Linear_Expression e2(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.generalized_affine_image(A, EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(B - 3);
+ Linear_Expression e2(B + 1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 4);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_image(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B <= 9);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_image(B-3, EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ bds.generalized_affine_image(x, LESS_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ bds.generalized_affine_image(x, GREATER_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ bds.generalized_affine_image(x, LESS_OR_EQUAL, x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the BDS's space dimension.
+ bds.generalized_affine_image(y, GREATER_OR_EQUAL, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `rhs' expression that
+ // does not appear in the BDS.
+
+ bds.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `lhs' expression that
+ // does not appear in the BDS.
+ bds.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage1.cc b/tests/BD_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..336e7d9
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,477 @@
+/* Test BD_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(2*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(2*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(4*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A == 1);
+ known_result.add_constraint(-B >= 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -B+1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(4*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A == 1);
+ known_result.add_constraint(B >= 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(7*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(7*A == 1);
+ known_result.add_constraint(B >= 2);
+
+ bool ok = check_result(bds, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(5*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(5*A == 1);
+ known_result.add_constraint(-B >= 2);
+
+ bool ok = check_result(bds, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(-2*B >= 3);
+
+ bool ok = check_result(bds, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(B >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(-2*B >= 5);
+
+ bool ok = check_result(bds, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B >= 7);
+ bds.add_constraint(3*C <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*B <= 14);
+ known_result.add_constraint(3*B - 3*A <= 13);
+ known_result.add_constraint(3*B - 3*C <= 7);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(bds, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ // If the Coefficient type is not wide enough, do nothing.
+ if (std::numeric_limits<Coefficient>::is_bounded
+ && (std::numeric_limits<Coefficient>::min() > -203
+ || std::numeric_limits<Coefficient>::max() < 629))
+ return true;
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B >= 7);
+ bds.add_constraint(3*C <= 7);
+ bds.add_constraint(5*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(20*B <= -203);
+ known_result.add_constraint(60*A - 60*B >= 629);
+ known_result.add_constraint(20*C - 20*B >= 231);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(bds, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B >= 7);
+ bds.add_constraint(3*C <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(bds, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B >= 7);
+ bds.add_constraint(3*C <= 7);
+ bds.add_constraint(5*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(12*B >= -35);
+ known_result.add_constraint(4*A - 4*B <= 13);
+ known_result.add_constraint(4*C - 4*B <= 21);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(bds, known_result, "1.0e-5", "1.0e-5", "1.0e-5");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B <= 7);
+ bds.add_constraint(3*C <= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*B <= 35);
+ known_result.add_constraint(3*B - 3*A <= 34);
+ known_result.add_constraint(3*B - 3*C <= 28);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(bds, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B <= 7);
+ bds.add_constraint(3*C <= 7);
+ bds.add_constraint(5*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(20*B <= 27);
+ known_result.add_constraint(60*B - 60*A <= 61);
+ known_result.add_constraint(20*C - 20*B >= 1);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(bds, known_result, "1.0e-5", "1.0e-5", "1.0e-5");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(3*A == 1);
+ bds.add_constraint(2*B >= 7);
+ bds.add_constraint(3*C <= 7);
+ bds.add_constraint(5*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(bds, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage2.cc b/tests/BD_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..63f19a3
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,610 @@
+/* Test BD_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(2*A == 1);
+ bds.add_constraint(B >= 5);
+ bds.add_constraint(3*C <= 7);
+ bds.add_constraint(5*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A == 1);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(bds, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(2*A == 1);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(2*A == 1);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(3*C <= 8);
+ bds.add_constraint(2*C >= 7);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B, "
+ "EQUAL, 3*A+2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<mpq_class> bds(2);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B, 5) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, B + 3) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A);
+ Linear_Expression e2(B + 3);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(B <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, B + 3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(A - B);
+ Linear_Expression e2(B + C + 2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A - B, "
+ "GREATER_OR_EQUAL, B + C + 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(A - B);
+ Linear_Expression e2(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A - B, "
+ "GREATER_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(A - B);
+ Linear_Expression e2(C + 2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B - A <= 2);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A - B, "
+ "GREATER_OR_EQUAL, C + 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(0);
+ Linear_Expression e2(1);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 2);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(0, "
+ "GREATER_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(B + C);
+ Linear_Expression e2(3);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 2);
+ bds.add_constraint(A - B <= 2);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B + C, "
+ "GREATER_OR_EQUAL, 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(B + C);
+ Linear_Expression e2(B + C);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 2);
+ bds.add_constraint(B <= 2);
+ bds.add_constraint(B - C <= 3);
+ bds.add_constraint(C <= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B + C, "
+ "GREATER_OR_EQUAL, B + C) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(B - A);
+ Linear_Expression e2(A);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A >= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B - A, "
+ "GREATER_OR_EQUAL, A) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(B - A);
+ Linear_Expression e2(2*A);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A >= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(B - A, "
+ "EQUAL, 2*A) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(A - B);
+ Linear_Expression e2(B - C);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A >= 2);
+ bds.add_constraint(C >= -2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C >= -2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A - B, "
+ "LESS_OR_EQUAL, B - C) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C);
+ Linear_Expression e2(A + B);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B <= 5);
+ bds.add_constraint(A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 5);
+ known_result.add_constraint(A <= 2);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(C, "
+ "LESS_OR_EQUAL, A + B) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C);
+ Linear_Expression e2(A + 2*B + C);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(A <= 2);
+ bds.add_constraint(C <= 2);
+ bds.add_constraint(A - B <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A - B <= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(C, "
+ "EQUAL, A + 2*B + C) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A - B);
+ Linear_Expression e2(10);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(A >= 2);
+ bds.add_constraint(A - B >= 11);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(A - B, "
+ "LESS_OR_EQUAL, 10) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Linear_Expression e1(2*A - 2*C);
+ Linear_Expression e2(6);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(D - A <= 1);
+ bds.add_constraint(C - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(D - B <= 6);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(2*A - 2*C, "
+ "LESS_OR_EQUAL, 6) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Linear_Expression e1(4*A - 2*B + 3*C);
+ Linear_Expression e2(1 + C);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(D - A <= 1);
+ bds.add_constraint(C - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(4*A - 2*B + 3*C, "
+ "EQUAL, 1 + C) ***");
+
+ return ok;
+}
+
+} // namespace
+
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage3.cc b/tests/BD_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..90b3388
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,174 @@
+/* Test BD_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Linear_Expression e1(3*B + C);
+ Linear_Expression e2(2*A);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 13);
+ bds.add_constraint(C <= 5);
+ bds.add_constraint(D <= 2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B >= 9);
+ bds.add_constraint(C >= 3);
+ bds.add_constraint(D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(D <= 2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(D >= 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.generalized_affine_preimage(3*B + C, "
+ "EQUAL, 2*A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a variable in the `rhs' expression that
+ // does not appear in the BDS.
+
+ bds.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a variable in the `lhs' expression that
+ // does not appear in the BDS.
+ bds.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a strict relation symbol.
+ bds.generalized_affine_preimage(A + B, GREATER_THAN, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a strict relation symbol.
+ bds.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/geomcovers1.cc b/tests/BD_Shape/geomcovers1.cc
new file mode 100644
index 0000000..0a734f9
--- /dev/null
+++ b/tests/BD_Shape/geomcovers1.cc
@@ -0,0 +1,72 @@
+/* Test Pointset_Powerset<BD_Shape>::geometrically_covers().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ Constraint_System cs1, cs2, cs3, cs4;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 4);
+ cs2.insert(x >= 4);
+ cs2.insert(x <= 6);
+ cs3.insert(x >= 1);
+ cs3.insert(x <= 5);
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+ TBD_Shape bds3(cs3);
+
+ Pointset_Powerset<TBD_Shape> ps12(1, EMPTY);
+ ps12.add_disjunct(bds1);
+ ps12.add_disjunct(bds2);
+
+ Pointset_Powerset<TBD_Shape> ps3(1, EMPTY);
+ ps3.add_disjunct(bds3);
+
+ using namespace IO_Operators;
+ nout << "ps12 = " << ps12 << endl
+ << " ps3 = " << ps3 << endl;
+
+ if (ps12.geometrically_covers(ps3)) {
+
+ nout << "ps12 covers ps3." << endl;
+
+ return true;
+ }
+ else {
+
+ nout << "ps12 does not cover ps3." << endl;
+
+ return false;
+ }
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/h79widening1.cc b/tests/BD_Shape/h79widening1.cc
new file mode 100644
index 0000000..da59149
--- /dev/null
+++ b/tests/BD_Shape/h79widening1.cc
@@ -0,0 +1,63 @@
+/* Test BD_Shape::H79_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 1);
+ bds1.add_constraint(x - y <= 2);
+ bds1.add_constraint(y - x <= 7);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y <= 2);
+ bds2.add_constraint(-x <= 3);
+ bds2.add_constraint(x <= 0);
+ bds2.add_constraint(y - x <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.H79_widening_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/integerupperboundifexact1.cc b/tests/BD_Shape/integerupperboundifexact1.cc
new file mode 100644
index 0000000..b222eab
--- /dev/null
+++ b/tests/BD_Shape/integerupperboundifexact1.cc
@@ -0,0 +1,388 @@
+/* Test BD_Shape::integer_upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ BD_Shape<mpz_class> bds_empty(0, EMPTY);
+ BD_Shape<mpz_class> bds_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ BD_Shape<mpz_class> bds;
+
+ // empty, empty
+ bds = bds_empty;
+ ok &= bds.integer_upper_bound_assign_if_exact(bds_empty);
+ ok &= (bds == bds_empty);
+ print_constraints(bds, "*** empty union empty ***");
+
+ // empty, universe
+ bds = bds_empty;
+ ok &= bds.integer_upper_bound_assign_if_exact(bds_universe);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** empty union universe ***");
+
+ // universe, empty
+ bds = bds_universe;
+ ok &= bds.integer_upper_bound_assign_if_exact(bds_empty);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** universe union empty ***");
+
+ // universe, universe
+ bds = bds_universe;
+ ok &= bds.integer_upper_bound_assign_if_exact(bds_universe);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= -2);
+ bds1.add_constraint(x <= -1);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 1);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(bds1);
+
+ bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= -2);
+ bds1.add_constraint(x <= 0);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x == 0);
+ bds1.add_constraint(y == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= -2);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(bds2);
+
+ bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(y >= 2);
+ bds2.add_constraint(y <= 4);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(bds1);
+
+ bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x == y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x == 0);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(bds1);
+
+ bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(bds1);
+
+ bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x <= y);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(2, UNIVERSE);
+
+ bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ BD_Shape<mpz_class> bds(3, UNIVERSE);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(y >= 0);
+ bds.add_constraint(y <= 4);
+ bds.add_constraint(z >= 0);
+ bds.add_constraint(z <= 4);
+ bds.add_constraint(x - y <= 2);
+ bds.add_constraint(z - y <= 2);
+
+ BD_Shape<mpz_class> bds1(bds);
+ bds1.add_constraint(z <= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ BD_Shape<mpz_class> bds2(bds);
+ bds2.add_constraint(x - y <= 1);
+
+ bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+
+ ok &= (bds1 == bds);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ // const dimension_type dim = 500;
+ const dimension_type dim = 50;
+ Constraint_System cs;
+ for (dimension_type i = 1; i < dim; ++i) {
+ Variable x(i);
+ cs.insert(x >= 0);
+ cs.insert(x <= 4);
+ }
+
+ Variable x(0);
+
+ BD_Shape<mpz_class> hypercube1(cs);
+ hypercube1.add_constraint(x >= 0);
+ hypercube1.add_constraint(x <= 4);
+
+ BD_Shape<mpz_class> hypercube2(cs);
+ hypercube2.add_constraint(x >= 2);
+ hypercube2.add_constraint(x <= 6);
+
+ BD_Shape<mpz_class> known_result(cs);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = hypercube1.integer_upper_bound_assign_if_exact(hypercube2);
+
+ ok &= (hypercube1 == known_result);
+
+ print_constraints(hypercube1, "*** hyp1 ***");
+ print_constraints(hypercube2, "*** hyp2 ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ BD_Shape<mpz_class> bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+ bds1.add_constraint(x - y <= 2);
+
+ BD_Shape<mpz_class> bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 3);
+ bds2.add_constraint(x <= 6);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/intersection1.cc b/tests/BD_Shape/intersection1.cc
new file mode 100644
index 0000000..4a02ae5
--- /dev/null
+++ b/tests/BD_Shape/intersection1.cc
@@ -0,0 +1,365 @@
+/* Test BD_Shape::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(x - y <= 4);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(-y <= -2);
+ bds2.add_constraint(x - y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-y <= -2);
+ known_result.add_constraint(x - y <= 4);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(4);
+ bds1.add_constraint(x - y <= 4);
+ bds1.add_constraint(x <= 3);
+
+ TBD_Shape bds2(4);
+ bds2.add_constraint(x - y <= 5);
+ bds2.add_constraint(-y <= -2);
+ bds2.add_constraint(z - x <= 0);
+ bds2.add_constraint(y - z <= -1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x - y <= 4);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-y <= -2);
+ known_result.add_constraint(z - x <= 0);
+ known_result.add_constraint(y - z <= -1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 4);
+ bds1.add_constraint(-x <= -1);
+ bds1.add_constraint(y <= 3);
+ bds1.add_constraint(-y <= -1);
+ bds1.add_constraint(x - y <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(-y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-x <= -1);
+ known_result.add_constraint(y <= 3);
+ known_result.add_constraint(-y <= -1);
+ known_result.add_constraint(y - x <= -1);
+ known_result.add_constraint(x - y <= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 4);
+ bds1.add_constraint(x >= 5);
+ bds1.add_constraint(y <= 3);
+ bds1.add_constraint(y >= 1);
+ bds1.add_constraint(x - y <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y >= -5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 4);
+ bds1.add_constraint(x >= 5);
+ bds1.add_constraint(y <= 3);
+ bds1.add_constraint(y >= 1);
+ bds1.add_constraint(x - y <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y >= -5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds2.intersection_assign(bds1);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds2, known_result);
+
+ print_constraints(bds2, "*** bds2.intersection_assign(bds1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TBD_Shape bds1;
+ TBD_Shape bds2;
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y >= -5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds2);
+
+ bds1.intersection_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds1(3);
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(y >= -5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds2);
+
+ bds1.intersection_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= y);
+
+ TBD_Shape bds2(3);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::intersection_assign(bds2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ bds1.intersection_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ TBD_Shape bds1(7);
+ TBD_Shape bds2(15);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::intersection_assign(bds2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ bds1.intersection_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ TBD_Shape bds1(3, EMPTY);
+ TBD_Shape bds2(3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds1, known_result) ;
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ TBD_Shape bds1(3);
+ TBD_Shape bds2(3, EMPTY);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.intersection_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds1, known_result) ;
+
+ print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/limitedbhmz05extrapolation1.cc b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..9c33473
--- /dev/null
+++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,527 @@
+/* Test BD_Shape::limited_BHMZ05_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+
+ Constraint_System cs2;
+ cs2.insert(x <= 0);
+ cs2.insert(y >= 5);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 3);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y - x <= 0);
+ known_result.add_constraint(x >= 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 3);
+ cs1.insert(x <= 2);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 2);
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 3);
+ cs2.insert(x <= 2);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x + y <= 0);
+ cs.insert(x - y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+ BD_Shape<mpq_class> known_result(bds1);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds1;
+ TBD_Shape bds2;
+ Constraint_System cs;
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+ cs1.insert(z <= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+ cs2.insert(z <= 0);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+ cs.insert(x - y + z <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y - x <= 0);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(z <= 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs1;
+ cs1.insert(x == 0);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+ cs1.insert(z <= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+ cs2.insert(z <= -1);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x == 0);
+ cs.insert(y >= 0);
+ cs.insert(y <= 5);
+ cs.insert(x - y + z <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y - x <= 0);
+ known_result.add_constraint(x == 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+ cs1.insert(z <= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+ cs2.insert(z <= 0);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+ cs.insert(2*x - 3*y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y - x <= 0);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(z <= 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+ cs1.insert(z <= 0);
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+ cs2.insert(z <= 0);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+ cs.insert(x - y >= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y - x <= 0);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(z <= 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x - y >= 0);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y >= 0);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+ // illegal to apply the method to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable y(1);
+
+ TBD_Shape bds1(1);
+ TBD_Shape bds2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bds2, cs): it is
+ // illegal to apply the method to two polyhedra that are not
+ // dimension-compatible.
+ bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x - y >= 0);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y >= 0);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+ // illegal to apply the method to a system of constraints that
+ // has a strict-inequality.
+ bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/limitedcc76extrapolation1.cc b/tests/BD_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..ceb222c
--- /dev/null
+++ b/tests/BD_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,539 @@
+/* Test BD_Shape::limited_CC76_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bds1(0);
+ TBD_Shape bds2(0);
+ Constraint_System cs;
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A == -2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A == -2);
+ bds2.add_constraint(B == 3);
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A == -2);
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B >= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(A <= -2);
+ bds2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(A - B + C <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 5);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B >= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= -2);
+ bds2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A + B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B >= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= -2);
+ bds2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(A - B <= 6);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(A >= 5);
+ bds1.add_constraint(B >= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= -2);
+ bds2.add_constraint(A >= 3);
+ bds2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B >= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= -2);
+ bds2.add_constraint(A >= 3);
+ bds2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bds1(4);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(B <= 6);
+ bds1.add_constraint(C - D == 5);
+
+ TBD_Shape bds2(4);
+ bds2.add_constraint(A <= 4);
+ bds2.add_constraint(C - D == 5);
+ bds2.add_constraint(B <= 5);
+
+ Constraint_System cs;
+ cs.insert(A == 4);
+ cs.insert(C - D == 5);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(C - D == 5);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 5);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 3);
+ known_result.add_constraint(y - x >= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3, EMPTY);
+ TBD_Shape bds2(3, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(x <= 1);
+ cs.insert(y >= 4);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+ cs1.insert(x - y >= 2);
+
+ TBD_Shape bds1(cs1);
+ TBD_Shape bds2(2, EMPTY);
+
+ Constraint_System cs2;
+ cs2.insert(x <= 0);
+ cs2.insert(y >= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+ print_constraints(cs2, "*** cs2 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.limited_CC76_extrapolation_assign(bds2, cs2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1,
+ "*** bds1.limited_CC76_extrapolation_assign(bds2, cs2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable y(1);
+
+ TBD_Shape bds1(1);
+ TBD_Shape bds2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_CC76_extrapolation_assign(bds2, cs): it is
+ // illegal to apply the method to two polyhedra that are not
+ // dimension-compatible.
+ bds2.limited_CC76_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x - y >= 0);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y >= 0);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+ // illegal to apply the method to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ bds2.limited_CC76_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x - y >= 0);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x - y >= 0);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+ // illegal to apply the method to a system of constraints that
+ // in which there is a strict inequality.
+ bds2.limited_CC76_extrapolation_assign(bds1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/limitedh79extrapolation1.cc b/tests/BD_Shape/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..95836c2
--- /dev/null
+++ b/tests/BD_Shape/limitedh79extrapolation1.cc
@@ -0,0 +1,71 @@
+/* Test BD_Shape::limited_H79_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+
+ TBD_Shape bds1(cs1);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 5);
+
+ TBD_Shape bds2(cs2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(cs, "*** cs ***");
+
+ bds1.limited_H79_extrapolation_assign(bds2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 3);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.limited_H79_extrapolation_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/mapspacedims1.cc b/tests/BD_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..84b1223
--- /dev/null
+++ b/tests/BD_Shape/mapspacedims1.cc
@@ -0,0 +1,293 @@
+/* Test BD_Shape::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Partial_Function function;
+
+ TBD_Shape bds(3);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Partial_Function function;
+
+ TBD_Shape bds(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBD_Shape bds(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(2, 1);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 3);
+
+ TBD_Shape bds(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ cs = bds.minimized_constraints();
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x == 1);
+ known_result.add_constraint(y - x <= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 0);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 3);
+ cs.insert(z - y <= 7);
+ cs.insert(y - x <= 2);
+
+ TBD_Shape bds(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(x <= 4);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 1);
+ function.insert(1, 0);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 1);
+ cs.insert(z - y <= 7);
+ cs.insert(y - x <= 1);
+
+ TBD_Shape bds(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y - x <= 7);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x <= 1);
+ bds.add_constraint(y <= -1);
+ bds.add_constraint(y - x <= 3);
+
+ print_constraints(bds, "*** bds ***");
+ print_function(function, "*** function ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= -1);
+ known_result.add_constraint(y <= 1);
+ known_result.add_constraint(x - y <= 3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimension(function) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D == 0);
+ cs.insert(B - A == 0);
+ TBD_Shape bds(cs);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(1, 1);
+ function.insert(3, 0);
+
+ print_function(function, "*** function ***");
+ print_constraints(bds, "*** bds ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(B - C == 0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBD_Shape bds(0);
+
+ print_constraints(bds, "*** bds ***");
+ print_function(function, "*** function ***");
+
+ bds.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.map_space_dimension(function) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/max_min1.cc b/tests/BD_Shape/max_min1.cc
new file mode 100644
index 0000000..283592b
--- /dev/null
+++ b/tests/BD_Shape/max_min1.cc
@@ -0,0 +1,781 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+ and BD_Shape::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = !bds.maximize(x1-2*x2, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(x1-2*x2, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = !bds.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test03() {
+
+ TBD_Shape bds(0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE;
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B);
+ bool ok = !bds.maximize(LE, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 2 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A - B);
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B - C <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C);
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(B - C <= 0);
+ bds.add_constraint(E - D <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C + 2*E - 2*D);
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C + 2*E - 2*D);
+ bool ok = !bds.maximize(LE, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(B - C <= -1);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C + 2*E - 2*D);
+ bool ok = !bds.maximize(LE, num, den, included, g)
+ && ! bds.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B - C >= 0);
+ bds.add_constraint(E - D >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(Linear_Expression(3));
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(z);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::minimize(LE, num, den, included, g): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BDS.
+ bds.minimize(LE, num, den, included, g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= y);
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(z);
+
+ try {
+ // This is an incorrect use of the method
+ // BD_Shape::maximize(LE, num, den, included, g): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BDS.
+ bds.maximize(LE, num, den, included, g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(B <= 3);
+ bds.add_constraint(B >= -5);
+ bds.add_constraint(A - B <= 6);
+ bds.add_constraint(B - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(A-2, num, den, included)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(A-2, num, den, included)
+ && num == -1 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(B <= 3);
+ bds.add_constraint(B >= -5);
+ bds.add_constraint(A - B <= 6);
+ bds.add_constraint(B - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(A+2, num, den, included)
+ && num == 7 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(A+2, num, den, included)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 100);
+ bds.add_constraint(B <= 55);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-A+2, num, den, included)
+ && num == 2 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-A+2, num, den, included)
+ && num == -98 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 100);
+ bds.add_constraint(B <= 55);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-A-2, num, den, included)
+ && num == -2 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-A-2, num, den, included)
+ && num == -102 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(B <= 3);
+ bds.add_constraint(B >= -5);
+ bds.add_constraint(A - B <= 6);
+ bds.add_constraint(B - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(A - B - 2, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(A - B - 2, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(A <= 5);
+ bds.add_constraint(B <= 3);
+ bds.add_constraint(B >= -5);
+ bds.add_constraint(A - B <= 6);
+ bds.add_constraint(B - A <= 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(A - B + 2, num, den, included)
+ && num == 8 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(A - B + 2, num, den, included)
+ && num == 0 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 100);
+ bds.add_constraint(B <= 55);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-A + B + 2, num, den, included)
+ && num == 57 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-A + B + 2, num, den, included)
+ && num == -98 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 100);
+ bds.add_constraint(B <= 55);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-A + B - 2, num, den, included)
+ && num == 53 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-A + B - 2, num, den, included)
+ && num == -102 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);;
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/max_min2.cc b/tests/BD_Shape/max_min2.cc
new file mode 100644
index 0000000..11001ca
--- /dev/null
+++ b/tests/BD_Shape/max_min2.cc
@@ -0,0 +1,440 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+ and BD_Shape::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= -1);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(5*A - 1, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(5*A - 1, num, den, included)
+ && num == -6 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= -1);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-5*A - 1, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-5*A - 1, num, den, included)
+ && num == -6 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= -1);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(-5*A + 1, num, den, included)
+ && num == 6 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(-5*A + 1, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= -1);
+ bds.add_constraint(A <= 1);
+ bds.add_constraint(B <= 1);
+ bds.add_constraint(B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = bds.maximize(5*A + 1, num, den, included)
+ && num == 6 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(5*A + 1, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(Linear_Expression(3));
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A >= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A);
+ bool ok = !bds.maximize(LE, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A <= 0);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A);
+
+ bool ok = bds.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !bds.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ BD_Shape<mpq_class> bds(1);
+ bds.add_constraint(5*A <= 2);
+ bds.add_constraint(5*A >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Linear_Expression LE(3*A);
+
+ bool ok = bds.maximize(LE, num, den, included)
+ && num == 6 && den == 5 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included)
+ && num == 3 && den == 5 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+
+ BD_Shape<mpq_class> bds(1);
+ bds.add_constraint(5*A <= 2);
+ bds.add_constraint(3*A >= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Linear_Expression LE(-7*A);
+
+ bool ok = bds.maximize(LE, num, den, included)
+ && num == -7 && den == 3 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = bds.minimize(LE, num, den, included)
+ && num == -14 && den == 5 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(2*A >= 1);
+ bds.add_constraint(B >= 1);
+ bds.add_constraint(2*A <= 3);
+ bds.add_constraint(B <= 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + 4*B - 1);
+
+ Checked_Number<mpq_class, Extended_Number_Policy> divisor;
+ assign_r(divisor, 2, ROUND_NOT_NEEDED);
+ Checked_Number<mpq_class, Extended_Number_Policy> known_max_value;
+ assign_r(known_max_value, 33, ROUND_NOT_NEEDED);
+ div_assign_r(known_max_value, known_max_value, divisor, ROUND_NOT_NEEDED);
+ Generator known_max_location = point(3*A + 8*B, 2);
+
+ bool ok_max = bds.maximize(LE, num, den, included, g);
+ Checked_Number<mpq_class, Extended_Number_Policy> max_value;
+ assign_r(max_value, num, ROUND_NOT_NEEDED);
+ assign_r(divisor, den, ROUND_NOT_NEEDED);
+ div_assign_r(max_value, max_value, divisor, ROUND_NOT_NEEDED);
+ ok_max &= included && g.is_point()
+ && check_result(max_value, known_max_value, "0.5")
+ && check_result(g, known_max_location, "0.5", "0.5", "0.5");
+
+ nout << (included ? "maximum" : "supremum") << " = " << max_value;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ Checked_Number<mpq_class, Extended_Number_Policy> known_min_value;
+ assign_r(known_min_value, 7, ROUND_NOT_NEEDED);
+ assign_r(divisor, 2, ROUND_NOT_NEEDED);
+ div_assign_r(known_min_value, known_min_value, divisor, ROUND_NOT_NEEDED);
+ Generator known_min_location = point(A + 2*B, 2);
+
+ bool ok_min = bds.minimize(LE, num, den, included, g);
+ Checked_Number<mpq_class, Extended_Number_Policy> min_value;
+ assign_r(min_value, num, ROUND_NOT_NEEDED);
+ assign_r(divisor, den, ROUND_NOT_NEEDED);
+ div_assign_r(min_value, min_value, divisor, ROUND_NOT_NEEDED);
+ ok_min &= included && g.is_point()
+ && check_result(min_value, known_min_value, "0.5")
+ && check_result(g, known_min_location, "0.5", "0.5", "0.5");
+
+ nout << (included ? "minimum" : "infinum") << " = " << min_value;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok_max && ok_min;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/maxspacedim1.cc b/tests/BD_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..c3cb1b6
--- /dev/null
+++ b/tests/BD_Shape/maxspacedim1.cc
@@ -0,0 +1,96 @@
+/* Test BD_Shape::max_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ nout << BD_Shape<signed char>::max_space_dimension() << " (signed char)"
+ << endl
+ << BD_Shape<short>::max_space_dimension() << " (short)"
+ << endl
+ << BD_Shape<int>::max_space_dimension() << " (int)"
+ << endl
+ << BD_Shape<long>::max_space_dimension() << " (long)"
+ << endl
+ << BD_Shape<long long>::max_space_dimension() << " (long long)"
+ << endl
+#if PPL_SUPPORTED_FLOAT
+ << BD_Shape<float>::max_space_dimension() << " (float)"
+ << endl
+#endif
+#if PPL_SUPPORTED_DOUBLE
+ << BD_Shape<double>::max_space_dimension() << " (double)"
+ << endl
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+ << BD_Shape<long double>::max_space_dimension() << " (long double)"
+ << endl
+#endif
+ << BD_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+ << endl
+ << BD_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+ << endl;
+
+ if (BD_Shape<signed char>::max_space_dimension()
+ < BD_Shape<short>::max_space_dimension())
+ return false;
+
+ if (BD_Shape<short>::max_space_dimension()
+ < BD_Shape<int>::max_space_dimension())
+ return false;
+
+ if (BD_Shape<int>::max_space_dimension()
+ < BD_Shape<long>::max_space_dimension())
+ return false;
+
+ if (BD_Shape<long>::max_space_dimension()
+ < BD_Shape<long long>::max_space_dimension())
+ return false;
+
+#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE
+ if (BD_Shape<float>::max_space_dimension()
+ < BD_Shape<double>::max_space_dimension())
+ return false;
+#endif
+
+#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE
+ if (BD_Shape<double>::max_space_dimension()
+ < BD_Shape<long double>::max_space_dimension())
+ return false;
+#endif
+
+ if (2*BD_Shape<mpz_class>::max_space_dimension()
+ < BD_Shape<mpq_class>::max_space_dimension())
+ return false;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/membytes1.cc b/tests/BD_Shape/membytes1.cc
new file mode 100644
index 0000000..d43396b
--- /dev/null
+++ b/tests/BD_Shape/membytes1.cc
@@ -0,0 +1,241 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TBD_Shape& bds, const Constraint& c) {
+ const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+ const memory_size_type c_memory = c.total_memory_in_bytes();
+ bds.add_constraint(c);
+ const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+ nout << bd_memory_before
+ << " + " << c_memory
+ << " -> " << bd_memory_after
+ << endl;
+}
+
+void
+minimize(TBD_Shape& bds) {
+ const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+ (void) bds.minimized_constraints();
+ const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+ nout << bd_memory_before
+ << " -m-> " << bd_memory_after
+ << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+ using namespace test01_namespace;
+
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ const memory_size_type x_total_size = x.total_memory_in_bytes();
+ const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+ nout << "*** Size of variables ***"
+ << endl
+ << "x.total_memory_in_bytes() = " << x_total_size
+ << endl
+ << "x.external_memory_in_bytes() = " << x_external_size
+ << endl << endl;
+ nout << "*** Size of linear expressions ***"
+ << endl;
+
+ Linear_Expression le(0);
+ memory_size_type le_total_size = le.total_memory_in_bytes();
+ memory_size_type le_external_size = le.external_memory_in_bytes();
+
+ using namespace IO_Operators;
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += x;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le -= 4*y;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += 4;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl << endl;
+
+ nout << "*** Adding constraints to a bounded difference shape ***" << endl;
+
+ TBD_Shape bds(3);
+ add_constraint(bds, 2*x - 2*y >= 0);
+ add_constraint(bds, x - y - 1 <= 0);
+ add_constraint(bds, x >= 0);
+ minimize(bds);
+ add_constraint(bds, x + 1 >= 0);
+ add_constraint(bds, x - z - 1 >= 0);
+ add_constraint(bds, 2*x - 2*z + 7 >= 0);
+ minimize(bds);
+ add_constraint(bds, x - y + 5 >= 0);
+ add_constraint(bds, 2*x - 2*z + 13 >= 0);
+ add_constraint(bds, -2*x + 2*z + 1 >= 0);
+ add_constraint(bds, -x + y - 1 >= 0);
+ minimize(bds);
+ add_constraint(bds, -x + y + 7 >= 0);
+ add_constraint(bds, -4*x + 4*y - 4 >= 0);
+ add_constraint(bds, -2*x + 2*z - 5 >= 0);
+ add_constraint(bds, -x + 1 >= 0);
+ minimize(bds);
+ add_constraint(bds, -x + y + 5 >= 0);
+ minimize(bds);
+
+ const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+ const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+ const Constraint_System& cs = bds.constraints();
+ const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+ const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+ nout << endl;
+
+ nout << "*** Size of the user-visible polyhedra components ***"
+ << endl
+ << "bds.total_memory_in_bytes() = " << bd_total_size
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl
+ << "bds.external_memory_in_bytes() = " << bd_external_size
+ << endl
+ << "cs.external_memory_in_bytes() = " << cs_external_size
+ << endl << endl;
+
+ nout << "*** Size of a constraint system vs size of contained constraints"
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl;
+
+ memory_size_type cs_elements_size = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ cs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained constraints = " << cs_elements_size
+ << endl << endl;
+
+ return true;
+}
+
+bool test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(4*x - 4*y + 14 >= 0);
+ bds.add_constraint(x - z + 2 >= 0);
+ bds.add_constraint(y - z - 5 >= 0);
+
+ const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+ const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+
+ Determinate<TBD_Shape> dbds(bds);
+
+ const memory_size_type dbd_total_size = dbds.total_memory_in_bytes();
+ const memory_size_type dbd_external_size = dbds.external_memory_in_bytes();
+
+ nout << "bds.total_memory_in_bytes() = " << bd_total_size
+ << endl
+ << "bds.external_memory_in_bytes() = " << bd_external_size
+ << endl
+ << "dbds.total_memory_in_bytes() = " << dbd_total_size
+ << endl
+ << "dbds.external_memory_in_bytes() = " << dbd_external_size
+ << endl;
+
+ Pointset_Powerset<TBD_Shape> pbds(bds);
+
+ TBD_Shape qbds(3);
+ qbds.add_constraint(x >= 0);
+ qbds.add_constraint(y >= 0);
+ qbds.add_constraint(z >= 0);
+ qbds.add_constraint(x <= 1);
+ qbds.add_constraint(y <= 1);
+ qbds.add_constraint(z <= 1);
+ Pointset_Powerset<TBD_Shape> pqbds(qbds);
+
+ Pointset_Powerset<TBD_Shape> prbds = pqbds;
+ prbds.difference_assign(pbds);
+
+ const memory_size_type pbd_total_size = pbds.total_memory_in_bytes();
+ const memory_size_type pbd_external_size = pbds.external_memory_in_bytes();
+ const memory_size_type pqbd_total_size = pqbds.total_memory_in_bytes();
+ const memory_size_type pqbd_external_size = pqbds.external_memory_in_bytes();
+ const memory_size_type prbd_total_size = prbds.total_memory_in_bytes();
+ const memory_size_type prbd_external_size = prbds.external_memory_in_bytes();
+
+ nout << "pbds.total_memory_in_bytes() = " << pbd_total_size
+ << endl
+ << "pbds.external_memory_in_bytes() = " << pbd_external_size
+ << endl
+ << "pqbds.total_memory_in_bytes() = " << pqbd_total_size
+ << endl
+ << "pqbds.external_memory_in_bytes() = " << pqbd_external_size
+ << endl
+ << "prbds.total_memory_in_bytes() = " << prbd_total_size
+ << endl
+ << "prbds.external_memory_in_bytes() = " << prbd_external_size
+ << endl;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/minconstraints1.cc b/tests/BD_Shape/minconstraints1.cc
new file mode 100644
index 0000000..08cb03d
--- /dev/null
+++ b/tests/BD_Shape/minconstraints1.cc
@@ -0,0 +1,95 @@
+/* Test BD_Shape<T>::minimized_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(A - B >= -2);
+ bds.add_constraint(A >= -3);
+ bds.add_constraint(A <= 1);
+
+ print_constraints(bds, "*** bds ***");
+
+ const Constraint_System cs = bds.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** bds.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ C_Polyhedron ph_bds(cs);
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (num_constraints == 3 && ph_bds == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bds(0, UNIVERSE);
+
+ print_constraints(bds, "*** bds ***");
+
+ const Constraint_System cs = bds.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** bds.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ return num_constraints == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/relations1.cc b/tests/BD_Shape/relations1.cc
new file mode 100644
index 0000000..4cf7b40
--- /dev/null
+++ b/tests/BD_Shape/relations1.cc
@@ -0,0 +1,471 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Poly_Con_Relation rel = bds.relation_with(A >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ // Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(y <= -1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ // Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(y <= 1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ // Variable x(0);
+ // Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(z >= 1);
+
+ Constraint c(z >= 0);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable x(0);
+ // Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 1);
+
+ Constraint c(x >= 1);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x == 1);
+ bds.add_constraint(y <= 0);
+ bds.add_constraint(z >= 2);
+
+ Constraint c(x == 1);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x >= 3);
+ bds.add_constraint(y <= 0);
+ bds.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 3);
+ bds.add_constraint(y <= 0);
+ bds.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x <= 3);
+ bds.add_constraint(y <= 0);
+ bds.add_constraint(z >= 2);
+
+ Constraint c(-x >= 2);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds(0);
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(0 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds(0);
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(0 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds;
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable x(0);
+ // Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 1);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x == 1);
+ bds.add_constraint(y <= 0);
+ bds.add_constraint(z >= 2);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 0);
+ bds.add_constraint(y >= 1);
+
+ Poly_Con_Relation rel = bds.relation_with(-y >= -1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(-y >= -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(x - y <= 2);
+ bds.add_constraint(x - z >= -1);
+ bds.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = bds.relation_with(y > 3);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(y > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3);
+
+ bds.add_constraint(x - y <= 2);
+ bds.add_constraint(x - z >= -1);
+ bds.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = bds.relation_with(-y >= -4);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(A >= -2);
+
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= -1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(0 >= -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ // We verify that a generator is not subsumed by an empty BDS.
+ Variable x(0);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Generator g = point(x);
+ Poly_Gen_Relation rel = bds.relation_with(g);
+
+ print_constraints(bds, "*** bds ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(v(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ // We verify that a zero-dimensional generator is subsumed
+ // by a zero-dimensional, universal BDS.
+ TBD_Shape bds;
+
+ Generator g = point();
+ Poly_Gen_Relation rel = bds.relation_with(g);
+
+ print_constraints(bds, "*** bds ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations2.cc b/tests/BD_Shape/relations2.cc
new file mode 100644
index 0000000..0ed503b
--- /dev/null
+++ b/tests/BD_Shape/relations2.cc
@@ -0,0 +1,445 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds(0);
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(0 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds(0);
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(0 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ // The zero-dim universe BDS.
+ TBD_Shape bds(0);
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ // An empty BDS.
+ TBD_Shape bds(1);
+ bds.add_constraint(Linear_Expression(0) >= 1);
+
+ Variable A(0);
+
+ Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A > 0) = " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B == 3);
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B > 3);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A - B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B <= 3);
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B > 3);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A - B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A <= 1);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B > 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A - B > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+ cs.insert(B <= -1);
+ cs.insert(A - B <= 2);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(B - A > 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(B - A > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A >= 0);
+
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(B >= 2);
+
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A == 1);
+ bds.add_constraint(B >= 2);
+ bds.add_constraint(C <= 1);
+
+ Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) == 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(1 == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B >= 0);
+ bds.add_constraint(B >= 0);
+
+ Poly_Gen_Relation rel1 = bds.relation_with(point(B));
+ Poly_Gen_Relation rel2 = bds.relation_with(point(-B));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(point(B)) == " << rel1 << endl;
+ nout << "bds.relation_with(point(-B)) == " << rel2 << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = bds.relation_with(ray(-A));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(ray(-A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = bds.relation_with(line(A));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = bds.relation_with(closure_point(A));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(closure_point(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 2);
+ bds.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = bds.relation_with(ray(A + B));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(ray(A + B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ // The system of constraints of the BDS contains only
+ // an equality and the generator `g' is a point.
+ Variable A(0);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == 0);
+
+ Poly_Gen_Relation rel = bds.relation_with(point(2*A));
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(point(2*A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - C - B <= 2);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A - C - B <= 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations3.cc b/tests/BD_Shape/relations3.cc
new file mode 100644
index 0000000..db5aae6
--- /dev/null
+++ b/tests/BD_Shape/relations3.cc
@@ -0,0 +1,464 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a constraint that is
+ // dimensional incompatible with the BDS.
+ Poly_Con_Relation rel = bds.relation_with(C - B <= 2);
+ (void) rel;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(A >= 1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - 2*B <= 2);
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+ print_constraints(bds, "*** bds ***");
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a generator that is
+ // dimensional incompatible with the BDS.
+ Poly_Gen_Relation rel = bds.relation_with(ray(C));
+ (void) rel;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A == 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A <= -2);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A == -1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+ Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B == 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B <= -2);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B == -1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+ Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A - B == -1);
+
+ Poly_Con_Relation rel = bds.relation_with(A - B == -2);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ // A 1D empty BDS that is not in minimal form and the point is the origin.
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A <= 0);
+ bds.add_constraint(A >= 1);
+
+ Generator g = point();
+ Poly_Gen_Relation rel = bds.relation_with(g);
+
+ print_constraints(bds, "*** bds ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ // A single point does not subsume another (different) point.
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == 1);
+
+ Generator g = point();
+ Poly_Gen_Relation rel = bds.relation_with(g);
+
+ print_constraints(bds, "*** bds ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ // A single point does not subsume another (different) point.
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A == 1);
+
+ Generator g = point(3*A, 2);
+ Poly_Gen_Relation rel = bds.relation_with(g);
+
+ print_constraints(bds, "*** bds ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ // A single point does not subsume another (different) point.
+ Variable A(0);
+
+ BD_Shape<mpz_class> bds(1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 1);
+
+ Constraint c(2*A == 1);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 1);
+
+ Constraint c(Linear_Expression(1) == 0);
+ Poly_Con_Relation rel = bds.relation_with(c);
+
+ print_constraints(bds, "*** bds ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+
+ TBD_Shape bds(1);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(A <= 1);
+
+ Congruence cg((A %= 0) / 0);
+ Poly_Con_Relation rel = bds.relation_with(cg);
+
+ print_constraints(bds, "--- bds ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 2);
+ bds.add_constraint(A - B <= 1);
+
+ Congruence cg((A + 3*B %= 1) / 10);
+ Poly_Con_Relation rel = bds.relation_with(cg);
+
+ print_constraints(bds, "--- bds ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A >= 0);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B <= 2);
+ bds.add_constraint(A - B <= 1);
+
+ Congruence cg((A + 3*B %= 10) / 11);
+ Poly_Con_Relation rel = bds.relation_with(cg);
+
+ print_constraints(bds, "--- bds ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations4.cc b/tests/BD_Shape/relations4.cc
new file mode 100644
index 0000000..4519c68
--- /dev/null
+++ b/tests/BD_Shape/relations4.cc
@@ -0,0 +1,436 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B <= -1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= -1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(B - 4*A >= 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(B + 4*A == 5);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(B + 4*A == 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(B + 4*A > 14);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(B + 4*A > 14) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(B + 4*A >= 15);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(B + 4*A >= 15) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 2);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+ test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 2);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B == 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 3);
+ cs.insert(B <= 3);
+ cs.insert(B >= 3);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 1);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 1);
+
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A + B >= 8);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A + B >= 8) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A - B == 3);
+ cs.insert(B == 1);
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(A - 2*B > 2);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(A - 2*B > 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B <= 3);
+ cs.insert(A <= 1);
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(2*A - B > 4);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(2*A - B > 4) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B >= 3);
+ cs.insert(A >= 1);
+ TBD_Shape bds(cs);
+
+ Poly_Con_Relation rel = bds.relation_with(2*A - B < 4);
+
+ print_constraints(bds, "*** bds ***");
+ using namespace IO_Operators;
+ nout << "bds.relation_with(2*A - B < 4) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/BD_Shape/removespacedims1.cc b/tests/BD_Shape/removespacedims1.cc
new file mode 100644
index 0000000..3972733
--- /dev/null
+++ b/tests/BD_Shape/removespacedims1.cc
@@ -0,0 +1,388 @@
+/* Remove some variables from the space.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+
+ TBD_Shape bds(6);
+ bds.add_constraint(x2 - x3 <= 0);
+ bds.add_constraint(x3 <= 2);
+ bds.add_constraint(x6 - x5 <= 2);
+ bds.add_constraint(x5 <= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x5);
+
+ bds.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x2 <= 2);
+ known_result.add_constraint(x4 <= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_space_dimensions({x3, x5}) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ Variable x7(6);
+ Variable x8(7);
+
+ TBD_Shape bds(8);
+ bds.add_constraint(x7 - x3 <= 0);
+ bds.add_constraint(x1 <= 2);
+ bds.add_constraint(x4 - x8 <= 2);
+ bds.add_constraint(x5 <= 7);
+ bds.add_constraint(x2 <= 10);
+ bds.add_constraint(x6 - x8 <= 4);
+
+ print_constraints(bds, "*** bds ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x1);
+ to_be_removed.insert(x2);
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x4);
+ to_be_removed.insert(x5);
+ to_be_removed.insert(x6);
+ to_be_removed.insert(x7);
+ to_be_removed.insert(x8);
+
+ bds.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(0);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds,
+ "*** bds.remove_space_dimensions"
+ "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(x1 - x2 <=1);
+ bds.add_constraint(x2 - x3 <= -2);
+ bds.add_constraint(x3 - x1 <= 0);
+ bds.add_constraint(x2 >= 5);
+ bds.add_constraint(x4 >= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x1);
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x4);
+
+ bds.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_space_dimensions({x1, x3, x4}) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x1 <= 2);
+ bds.add_constraint(x2 <= 10);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.remove_higher_space_dimensions(0);
+
+ BD_Shape<mpq_class> known_result(0, UNIVERSE);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(x1 - x2 <=1);
+ bds.add_constraint(x2 - x3 <= -2);
+ bds.add_constraint(x3 - x1 <= 0);
+ bds.add_constraint(x2 >= 5);
+ bds.add_constraint(x4 >= 3);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.remove_higher_space_dimensions(1);
+
+ BD_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_higher_space_dimensions(1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(x1 - x2 <=1);
+ bds.add_constraint(x2 - x3 <= 2);
+ bds.add_constraint(x3 - x1 <= 0);
+ bds.add_constraint(x2 >= 5);
+ bds.add_constraint(x4 >= 3);
+ bds.add_constraint(x5 - x3 == 2);
+
+ print_constraints(bds, "*** bds ***");
+
+ bds.remove_higher_space_dimensions(3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 - x2 <=1);
+ known_result.add_constraint(x2 - x3 <= 2);
+ known_result.add_constraint(x3 - x1 <= 0);
+ known_result.add_constraint(x2 >= 5);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TBD_Shape bds(3);
+ bds.add_constraint(x1 - x2 <=1);
+ bds.add_constraint(x2 - x3 <= 2);
+ bds.add_constraint(x3 - x1 <= 0);
+ bds.add_constraint(x2 >= 5);
+
+ print_constraints(bds, "*** bds ***");
+
+ BD_Shape<mpq_class> known_result(bds);
+
+ bds.remove_higher_space_dimensions(3);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TBD_Shape bds(5);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::remove_higher_dimensions(n): it is illegal to erase
+ // a variable that is not in the space of the polyhedron.
+ bds.remove_higher_space_dimensions(7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x <= 3);
+ cs.insert(y - z <= 2);
+ TBD_Shape bds(cs);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(z);
+
+ bds.remove_space_dimensions(to_be_removed);
+
+ try {
+ to_be_removed.insert(x);
+ // This is an incorrect use use of method
+ // BD_Shape::remove_dimensions(to_be_remove).
+ // Here the set `to_be_removed' still contains variable `z'.
+ // This variable is now beyond the space dimension,
+ // so that a dimension-incompatibility exception is obtained.
+ bds.remove_space_dimensions(to_be_removed);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ Constraint_System cs;
+ cs.insert(x1 - x2 <= 1);
+ cs.insert(x2 - x3 <= 3);
+ cs.insert(x3 - x1 <= 0);
+ cs.insert(x2 >= 6);
+ cs.insert(x4 >= 4);
+ cs.insert(x5 - x3 == 3);
+ TBD_Shape bds(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ cs = bds.minimized_constraints();
+ bds.remove_higher_space_dimensions(3);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 - x2 <=1);
+ known_result.add_constraint(x2 - x3 <= 3);
+ known_result.add_constraint(x3 - x1 <= 0);
+ known_result.add_constraint(x2 >= 6);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ Constraint_System cs;
+ cs.insert(x1 - x2 <= 1);
+ cs.insert(x2 - x3 <= 3);
+ cs.insert(x3 - x1 <= 0);
+ cs.insert(x2 >= 6);
+ cs.insert(x4 >= 4);
+ cs.insert(x5 - x3 == 3);
+ TBD_Shape bds(cs);
+
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x4);
+ to_be_removed.insert(x5);
+
+ cs = bds.minimized_constraints();
+ bds.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 - x2 <=1);
+ known_result.add_constraint(x2 - x3 <= 3);
+ known_result.add_constraint(x3 - x1 <= 0);
+ known_result.add_constraint(x2 >= 6);
+
+ bool ok = check_result(bds, known_result);
+
+ print_constraints(bds, "*** bds.remove_space_dimensions({x4, x5}) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/run_tests b/tests/BD_Shape/run_tests
new file mode 100755
index 0000000..ad5730e
--- /dev/null
+++ b/tests/BD_Shape/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the BD_Shape tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+ MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+ echo "**************************** " $instance " ****************************"
+ eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+ [ -f dirty_marker ] && $MAKE clean
+ touch dirty_marker
+ $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBD_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+ $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/BD_Shape/simplifyusingcontext1.cc b/tests/BD_Shape/simplifyusingcontext1.cc
new file mode 100644
index 0000000..cbe21a7
--- /dev/null
+++ b/tests/BD_Shape/simplifyusingcontext1.cc
@@ -0,0 +1,306 @@
+/* Test BD_Shape::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(bds1);
+ bds2.affine_image(x, x + 6);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(x <= 2);
+
+ bool ok = !bds1.simplify_using_context_assign(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.simplify_using_context_assign(bds2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 2);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(bds1);
+ bds2.affine_image(x, x + 1);
+ bds2.affine_image(y, y + 6);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ // NOTE: this is the result computed when using the current heuristics.
+ // It turns out that the current heuristics is not smart enough to see
+ // that constraint y <= 2 is not really needed.
+ TBD_Shape known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = !bds1.simplify_using_context_assign(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.simplify_using_context_assign(bds2) ***");
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ TBD_Shape bds1(1);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 6);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(1);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 5);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape computed_result = bds1;
+
+ computed_result.simplify_using_context_assign(bds2);
+
+ TBD_Shape known_result(1);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result,
+ "*** bds1.simplify_using_context_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBD_Shape bds1 = TBD_Shape(3, UNIVERSE);
+ bds1.add_constraint(i >= 1);
+ bds1.add_constraint(i <= 10);
+ bds1.add_constraint(j >= 1);
+ bds1.add_constraint(j <= 10);
+ bds1.add_constraint(k == 0);
+
+ TBD_Shape bds2 = TBD_Shape(3, UNIVERSE);
+ bds2.add_constraint(i >= 0);
+ bds2.add_constraint(i <= 2);
+ bds2.add_constraint(j >= 2);
+ bds2.add_constraint(j <= 9);
+ bds2.add_constraint(k == 0);
+
+ print_constraints(bds1, "=== bds1 ===");
+ print_constraints(bds2, "=== bds2 ===");
+
+ TBD_Shape known_result = TBD_Shape(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+
+ bds1.simplify_using_context_assign(bds2);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1, "=== bds1.simplify_using_context_assign(bds2) ===");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBD_Shape bds1(3, UNIVERSE);
+ bds1.add_constraint(i == 1);
+ bds1.add_constraint(j + 1 == 0);
+ bds1.add_constraint(k == 3);
+
+ TBD_Shape bds2(3, UNIVERSE);
+ bds2.add_constraint(i == 1);
+ bds2.add_constraint(k >= 0);
+ bds2.add_constraint(k <= 3);
+
+ TBD_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(k >= 3);
+ known_result.add_constraint(j + 1 == 0);
+
+ bds1.simplify_using_context_assign(bds2);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1.minimized_constraints(),
+ "=== bds1.simplify_using_context_assign(bds2) ===");
+ print_constraints(known_result.minimized_constraints(),
+ "=== known_result ===");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bds1(3, UNIVERSE);
+ bds1.add_constraint(A == 0);
+ bds1.add_constraint(B == C);
+ bds1.add_constraint(B >= 2);
+ print_constraints(bds1, "\n=== bds1 ===");
+
+ TBD_Shape bds2(3, UNIVERSE);
+ bds2.add_constraint(A == 0);
+ bds2.add_constraint(C >= 2);
+ print_constraints(bds2, "\n=== bds2 ===");
+
+ bds1.simplify_using_context_assign(bds2);
+
+ TBD_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(B == C);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1, "\n=== bds1.simplify_using_context_assign(bds2) ===");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bds1(0, EMPTY);
+ TBD_Shape bds2;
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result = bds1;
+
+ bds1.simplify_using_context_assign(bds2);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.simplify_using_context_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ TBD_Shape bds1(1);
+ TBD_Shape bds2(1);
+
+ bds2.add_constraint(A == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result = bds1;
+
+ bds1.simplify_using_context_assign(bds2);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1,
+ "*** bds1.simplify_using_context_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBD_Shape bds1(3, UNIVERSE);
+ bds1.add_constraint(i >= 1);
+ bds1.add_constraint(i <= 10);
+ bds1.add_constraint(j >= 1);
+ bds1.add_constraint(j <= 10);
+ bds1.add_constraint(k == 0);
+
+ TBD_Shape bds2(3, UNIVERSE);
+ bds2.add_constraint(i <= 25);
+ bds2.add_constraint(j <= 25);
+ bds2.add_constraint(k == 0);
+
+ TBD_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+ known_result.add_constraint(i <= 10);
+ known_result.add_constraint(j >= 1);
+ known_result.add_constraint(j <= 10);
+
+ bds1.simplify_using_context_assign(bds2);
+
+ bool ok = (bds1 == known_result);
+
+ print_constraints(bds1);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/timeelapse1.cc b/tests/BD_Shape/timeelapse1.cc
new file mode 100644
index 0000000..71e9e60
--- /dev/null
+++ b/tests/BD_Shape/timeelapse1.cc
@@ -0,0 +1,243 @@
+/* Test time_elapse_assign() for particular polyhedra.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bds1(2, EMPTY);
+ TBD_Shape bds2(2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ TBD_Shape bds3(2);
+ TBD_Shape bds4(2, EMPTY);
+
+ print_constraints(bds3, "*** bds3 ***");
+ print_constraints(bds4, "*** bds4 ***");
+
+ bds3.time_elapse_assign(bds4);
+
+ bool ok = (bds1.is_empty() && bds3.is_empty());
+
+ print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+ print_constraints(bds3, "*** bds3_time_elapse_assign(bds4) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y >= 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x >= 2);
+ bds2.add_constraint(x <= 4);
+ bds2.add_constraint(y == 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 0);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= 1);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(y >= 1);
+ bds1.add_constraint(y <= 3);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(y == 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(y <= 5);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y <= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 2);
+ bds1.add_constraint(x >= 1);
+ bds1.add_constraint(y <= 5);
+ bds1.add_constraint(y >= 10);
+ bds1.add_constraint(z >= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(x <= 9);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(y <= 3);
+ bds2.add_constraint(y >= -1);
+ bds2.add_constraint(z >= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+
+ TBD_Shape bds1(1);
+ bds1.add_constraint(x == 1);
+
+ TBD_Shape bds2(2);
+
+ try {
+ // This is an invalid use of the method
+ // BD_Shape::time_elapse_assign(bds2): it is illegal to apply the
+ // method to two polyhedra that are not dimension-compatible.
+ bds1.time_elapse_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(x >= 1);
+ bds1.add_constraint(y <= 5);
+ bds1.add_constraint(y >= 1);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(y <= 3);
+ bds2.add_constraint(y >= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.time_elapse_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(y >= 1);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/unconstrain1.cc b/tests/BD_Shape/unconstrain1.cc
new file mode 100644
index 0000000..747a36e
--- /dev/null
+++ b/tests/BD_Shape/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test BD_Shape::unconstrain().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2, EMPTY);
+ print_constraints(bds, "*** bds ***");
+
+ bds.unconstrain(A);
+
+ TBD_Shape known_result(2, EMPTY);
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2, EMPTY);
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set vs(A, B);
+ bds.unconstrain(vs);
+
+ TBD_Shape known_result(2, EMPTY);
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == B);
+ bds.add_constraint(B >= 0);
+ print_constraints(bds, "*** bds ***");
+
+ bds.unconstrain(B);
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(A == B);
+ bds.add_constraint(B >= 0);
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set vs(B);
+ bds.unconstrain(vs);
+
+ TBD_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds(0, EMPTY);
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set vs;
+ bds.unconstrain(vs);
+
+ TBD_Shape known_result(0, EMPTY);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TBD_Shape bds(0);
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set vs;
+ bds.unconstrain(vs);
+
+ TBD_Shape known_result(0);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ try {
+ TBD_Shape bds(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ bds.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ TBD_Shape bds(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ Variables_Set vs(Variable(0), Variable(3));
+ bds.unconstrain(vs);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bds(5);
+ bds.add_constraint(A - B == 9);
+ bds.add_constraint(A >= D + 2);
+ bds.add_constraint(C <= D);
+ bds.add_constraint(E <= B);
+ bds.add_constraint(E >= 0);
+ print_constraints(bds, "*** bds ***");
+
+ Variables_Set vs(A, B);
+ vs.insert(D);
+ bds.unconstrain(vs);
+
+ TBD_Shape known_result(5);
+ known_result.add_constraint(E >= 0);
+
+ bool ok = (bds == known_result);
+
+ print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ try {
+ TBD_Shape bds(7);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ bds.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/universe1.cc b/tests/BD_Shape/universe1.cc
new file mode 100644
index 0000000..1d4b9eb
--- /dev/null
+++ b/tests/BD_Shape/universe1.cc
@@ -0,0 +1,90 @@
+/* Test BD_Shape::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(4);
+
+ bds.add_constraint(-x <= 4);
+ bds.add_constraint(y - x <= 0);
+ bds.add_constraint(x - y <= -5);
+
+ bool universe = bds.is_universe();
+
+ nout << "*** bds.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+bool
+test02() {
+ TBD_Shape bds(4);
+
+ bool universe = bds.is_universe();
+
+ nout << "*** bds.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test03() {
+ TBD_Shape bds(0);
+
+ bool universe = bds.is_universe();
+
+ nout << "*** bds.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test04() {
+ TBD_Shape bds(20, EMPTY);
+
+ bool universe = bds.is_universe();
+
+ nout << "*** bds.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/upperbound1.cc b/tests/BD_Shape/upperbound1.cc
new file mode 100644
index 0000000..05a8c15
--- /dev/null
+++ b/tests/BD_Shape/upperbound1.cc
@@ -0,0 +1,281 @@
+/* Test BD_Shape::upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBD_Shape bds1(5);
+ bds1.add_constraint(x1 <= 5);
+ bds1.add_constraint(x2 <= -1);
+ bds1.add_constraint(x1 -x2 <= 10);
+
+ TBD_Shape bds2(5);
+ bds2.add_constraint(x1 <= 2);
+ bds2.add_constraint(x4 <= 7);
+ bds2.add_constraint(x1 - x2 <= 20);
+ bds2.add_constraint(x4 - x3 <= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.upper_bound_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(x1 <= 5);
+ known_result.add_constraint(x1 - x2 <= 20);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(3);
+ bds1.add_constraint(x <= 4);
+ bds1.add_constraint(-x <= -1);
+ bds1.add_constraint(y <= 3);
+ bds1.add_constraint(-y <= -1);
+ bds1.add_constraint(x - y <= 1);
+
+ TBD_Shape bds2(3);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(-y <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.upper_bound_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(y >= -5);
+ known_result.add_constraint(x >= -4);
+ known_result.add_constraint(y <= 3);
+ known_result.add_constraint(x - y <= 8);
+ known_result.add_constraint(y - x <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x <= 4);
+ bds1.add_constraint(-x <= -1);
+ bds1.add_constraint(y <= 3);
+ bds1.add_constraint(-y <= -1);
+ bds1.add_constraint(x - y <= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(y - x <= -1);
+ bds2.add_constraint(x <= 3);
+ bds2.add_constraint(x >= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ BD_Shape<mpq_class> known_result(bds1);
+
+ bds1.upper_bound_assign(bds2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 4);
+ bds1.add_constraint(A >= 1);
+ bds1.add_constraint(B <= 3);
+ bds1.add_constraint(-B <= -1);
+ bds1.add_constraint(A - B <= 1);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(B - A <= -1);
+ bds2.add_constraint(A <= 3);
+ bds2.add_constraint(-B <= 5);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.upper_bound_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B >= -5);
+ known_result.add_constraint(A >= -4);
+ known_result.add_constraint(B <= 3);
+ known_result.add_constraint(A - B <= 8);
+ known_result.add_constraint(B - A <= 2);
+
+ bool ok = check_result(bds1, known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bds1(12);
+ TBD_Shape bds2(5);
+
+ try {
+ // This is an incorrect use of method
+ // BD_Shape::upper_bound_assign(bds2): it is impossible to apply
+ // this method to two polyhedra of different dimensions.
+ bds1.upper_bound_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(x >= y);
+
+ TBD_Shape bds2(3);
+
+ try {
+ // This is an invalid use of method
+ // BD_Shape::upper_bound_assign(bds2): it is illegal
+ // to apply the method to two polyhedra of different dimensions.
+ bds1.upper_bound_assign(bds2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TBD_Shape bds1(1);
+ bds1.add_constraint(A <= 0);
+ bds1.add_constraint(A >= 1);
+
+ TBD_Shape bds2(1);
+ bds2.add_constraint(A <= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ bds1.upper_bound_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(A <= 3);
+
+ bool ok = check_result(bds1, known_result) ;
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bds1(2);
+ bds1.add_constraint(A <= 0);
+ bds1.add_constraint(B >= 0);
+ bds1.add_constraint(A - B <= 0);
+
+ TBD_Shape bds2(2);
+ bds2.add_constraint(A <= 0);
+ bds2.add_constraint(A - B <= 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ (void) bds1.minimized_constraints();
+
+ bds1.upper_bound_assign(bds2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(A - B <= 0);
+
+ bool ok = check_result(bds1, known_result) ;
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/upperboundifexact1.cc b/tests/BD_Shape/upperboundifexact1.cc
new file mode 100644
index 0000000..cc90f37
--- /dev/null
+++ b/tests/BD_Shape/upperboundifexact1.cc
@@ -0,0 +1,376 @@
+/* Test BD_Shape::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bds_empty(0, EMPTY);
+ TBD_Shape bds_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ TBD_Shape bds;
+
+ // empty, empty
+ bds = bds_empty;
+ ok &= bds.upper_bound_assign_if_exact(bds_empty);
+ ok &= (bds == bds_empty);
+ print_constraints(bds, "*** empty union empty ***");
+
+ // empty, universe
+ bds = bds_empty;
+ ok &= bds.upper_bound_assign_if_exact(bds_universe);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** empty union universe ***");
+
+ // universe, empty
+ bds = bds_universe;
+ ok &= bds.upper_bound_assign_if_exact(bds_empty);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** universe union empty ***");
+
+ // universe, universe
+ bds = bds_universe;
+ ok &= bds.upper_bound_assign_if_exact(bds_universe);
+ ok &= (bds == bds_universe);
+ print_constraints(bds, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= -2);
+ bds1.add_constraint(x <= -1);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 1);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds1);
+
+ bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= -2);
+ bds1.add_constraint(x <= 0);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x == 0);
+ bds1.add_constraint(y == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(x <= 2);
+ bds2.add_constraint(y >= -2);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds2);
+
+ bool ok = bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(y == 0);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+ bds2.add_constraint(y >= 2);
+ bds2.add_constraint(y <= 4);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds1);
+
+ bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x == y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x == 0);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds1);
+
+ bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 0);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds1);
+
+ bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= y);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x <= y);
+
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(2, UNIVERSE);
+
+ bool ok = bds1.upper_bound_assign_if_exact(bds2);
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bds(3, UNIVERSE);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(x <= 2);
+ bds.add_constraint(y >= 0);
+ bds.add_constraint(y <= 4);
+ bds.add_constraint(z >= 0);
+ bds.add_constraint(z <= 4);
+ bds.add_constraint(x - y <= 2);
+ bds.add_constraint(z - y <= 2);
+
+ TBD_Shape bds1(bds);
+ bds1.add_constraint(z <= 3);
+
+ print_constraints(bds1, "*** bds1 ***");
+
+ TBD_Shape bds2(bds);
+ bds2.add_constraint(x - y <= 1);
+
+ bool ok = bds1.upper_bound_assign_if_exact(bds2);
+
+ ok &= (bds1 == bds);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds1(2, UNIVERSE);
+ bds1.add_constraint(x >= 0);
+ bds1.add_constraint(x <= 3);
+ bds1.add_constraint(y >= 0);
+ bds1.add_constraint(y <= 2);
+ bds1.add_constraint(x - y <= 2);
+
+ TBD_Shape bds2(2, UNIVERSE);
+ bds2.add_constraint(x >= 3);
+ bds2.add_constraint(x <= 6);
+ bds2.add_constraint(y >= 0);
+ bds2.add_constraint(y <= 2);
+
+ print_constraints(bds1, "*** bds1 ***");
+ print_constraints(bds2, "*** bds2 ***");
+
+ TBD_Shape known_result(bds1);
+
+ bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+
+ ok &= (bds1 == known_result);
+
+ print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ // const dimension_type dim = 500;
+ const dimension_type dim = 50;
+ Constraint_System cs;
+ for (dimension_type i = 1; i < dim; ++i) {
+ Variable x(i);
+ cs.insert(x >= 0);
+ cs.insert(x <= 4);
+ }
+
+ Variable x(0);
+
+ TBD_Shape hypercube1(cs);
+ hypercube1.add_constraint(x >= 0);
+ hypercube1.add_constraint(x <= 4);
+
+ TBD_Shape hypercube2(cs);
+ hypercube2.add_constraint(x >= 2);
+ hypercube2.add_constraint(x <= 6);
+
+ TBD_Shape known_result(cs);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+ ok &= (hypercube1 == known_result);
+
+ print_constraints(hypercube1, "*** hyp1 ***");
+ print_constraints(hypercube2, "*** hyp2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/wrap1.cc b/tests/BD_Shape/wrap1.cc
new file mode 100644
index 0000000..fdfcdf4
--- /dev/null
+++ b/tests/BD_Shape/wrap1.cc
@@ -0,0 +1,120 @@
+/* Test BD_Shape::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ TBD_Shape bd(2);
+ bd.refine_with_constraint(x >= 224);
+ bd.refine_with_constraint(x <= 260);
+ bd.refine_with_constraint(x-y >= 164);
+ bd.refine_with_constraint(x-y <= 168);
+
+ print_constraints(bd, "*** bd ***");
+
+ Variables_Set vars(x, y);
+
+ bd.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ TBD_Shape known_result(2);
+ typedef TBD_Shape::coefficient_type T;
+ if (!std::numeric_limits<T>::is_bounded
+ || (std::numeric_limits<T>::max() >= 260
+ && (std::numeric_limits<T>::is_iec559
+ || std::numeric_limits<T>::min() <= -260))) {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(y >= 56);
+ known_result.refine_with_constraint(y <= 96);
+ known_result.refine_with_constraint(x-y <= 168);
+ known_result.refine_with_constraint(y-x <= 92);
+ }
+ else {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 0);
+ }
+
+ bool ok = (bd == known_result);
+
+ print_constraints(bd, "*** bd.wrap_assign(...) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ TBD_Shape bd(2);
+ bd.refine_with_constraint(x >= 224);
+ bd.refine_with_constraint(x <= 260);
+ bd.refine_with_constraint(x-y >= 164);
+ bd.refine_with_constraint(x-y <= 168);
+
+ print_constraints(bd, "*** bd ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ bd.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ TBD_Shape known_result(2);
+ typedef TBD_Shape::coefficient_type_base T;
+ if (!std::numeric_limits<T>::is_bounded
+ || (std::numeric_limits<T>::max() >= 260
+ && (std::numeric_limits<T>::is_iec559
+ || std::numeric_limits<T>::min() <= -260))) {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 4);
+ known_result.refine_with_constraint(y >= 88);
+ known_result.refine_with_constraint(y-x >= 88);
+ known_result.refine_with_constraint(y-x <= 92);
+ }
+ else {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 0);
+ known_result.refine_with_constraint(+x-y <= 0);
+ }
+
+ bool ok = (bd == known_result);
+
+ print_constraints(bd, "*** bd.wrap_assign(...) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/BD_Shape/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc
new file mode 100644
index 0000000..bf04e8e
--- /dev/null
+++ b/tests/BD_Shape/writebdshape1.cc
@@ -0,0 +1,127 @@
+/* Test operator<<(ostream&, const BD_Shape&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ std::stringstream s;
+ using namespace IO_Operators;
+
+ TBD_Shape bds(3, UNIVERSE);
+
+ s << bds;
+ if (s.str() != "true")
+ return false;
+ print_constraints(bds, "*** bds ***");
+ s.str("");
+
+ bds.add_constraint(x <= 3);
+
+ s << bds;
+ if (s.str() != "A <= 3")
+ return false;
+ print_constraints(bds, "*** bds ***");
+ s.str("");
+
+ bds.add_constraint(x - y <= 4);
+
+ s << bds;
+ if (s.str() != "A <= 3, A - B <= 4")
+ return false;
+ print_constraints(bds, "*** bds ***");
+ s.str("");
+
+ bds.add_constraint(-y <= -2);
+
+ s << bds;
+ if (s.str() != "A <= 3, B >= 2, A - B <= 4")
+ return false;
+ print_constraints(bds, "*** bds ***");
+ s.str("");
+
+ bds.add_constraint(x-z <= 0);
+
+ s << bds;
+ if (s.str() != "A <= 3, B >= 2, A - B <= 4, A - C <= 0")
+ return false;
+ print_constraints(bds, "*** bds ***");
+ s.str("");
+
+ return true;
+}
+
+bool
+test02() {
+ std::stringstream s;
+ using namespace IO_Operators;
+
+ TBD_Shape bds1(0, EMPTY);
+
+ s << bds1;
+ if (s.str() != "false")
+ return false;
+ print_constraints(bds1, "*** bds1 ***");
+ s.str("");
+
+ TBD_Shape bds2(0, UNIVERSE);
+
+ s << bds2;
+ if (s.str() != "true")
+ return false;
+ print_constraints(bds2, "*** bds2 ***");
+ s.str("");
+
+ TBD_Shape bds3(1, EMPTY);
+
+ s << bds3;
+ if (s.str() != "false")
+ return false;
+ print_constraints(bds3, "*** bds3 ***");
+ s.str("");
+
+ TBD_Shape bds4(1, UNIVERSE);
+
+ s << bds4;
+ if (s.str() != "true")
+ return false;
+ print_constraints(bds4, "*** bds4 ***");
+ s.str("");
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Box/Makefile.am b/tests/Box/Makefile.am
new file mode 100644
index 0000000..3009a5c
--- /dev/null
+++ b/tests/Box/Makefile.am
@@ -0,0 +1,330 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+interval1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+propagateconstraints1 propagateconstraints2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithconstraints2 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DBOX_INSTANCE=rt_r_oc
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCES=fl_r_oc
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCES=db_r_oc
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCES=ld_r_oc
+endif
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76widening_SOURCES = cc76widening.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+interval1_SOURCES = interval1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+
+propagateconstraints1_SOURCES = propagateconstraints1.cc
+propagateconstraints2_SOURCES = propagateconstraints2.cc
+
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithconstraints2_SOURCES = refinewithconstraints2.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writebox1_SOURCES = writebox1.cc
+
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+BUGS =
+
+check_PROGRAMS = $(ALL_TESTS) $(BUGS)
+
+EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Box/Makefile.in b/tests/Box/Makefile.in
new file mode 100644
index 0000000..f37527b
--- /dev/null
+++ b/tests/Box/Makefile.in
@@ -0,0 +1,1957 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4)
+subdir = tests/Box
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+ $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+ affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+ affinepreimage1$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+ bgp99extrapolation1$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
+ boundedaffinepreimage1$(EXEEXT) cc76narrowing1$(EXEEXT) \
+ cc76widening$(EXEEXT) concatenate1$(EXEEXT) \
+ congruences1$(EXEEXT) constrains1$(EXEEXT) \
+ constraints1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+ discrete1$(EXEEXT) disjoint1$(EXEEXT) empty1$(EXEEXT) \
+ equality1$(EXEEXT) expandspacedim1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+ fromgrid1$(EXEEXT) frompartiallyreducedproduct1$(EXEEXT) \
+ frompolyhedron1$(EXEEXT) frompolyhedron2$(EXEEXT) \
+ fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) geomcovers1$(EXEEXT) \
+ intersection1$(EXEEXT) interval1$(EXEEXT) \
+ limitedcc76extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+ max_min1$(EXEEXT) maxspacedim1$(EXEEXT) membytes1$(EXEEXT) \
+ minconstraints1$(EXEEXT) propagateconstraints1$(EXEEXT) \
+ propagateconstraints2$(EXEEXT) relations1$(EXEEXT) \
+ relations2$(EXEEXT) relations3$(EXEEXT) relations4$(EXEEXT) \
+ refinewithconstraint1$(EXEEXT) refinewithconstraint2$(EXEEXT) \
+ refinewithconstraints1$(EXEEXT) \
+ refinewithconstraints2$(EXEEXT) refinewithcongruence1$(EXEEXT) \
+ refinewithcongruences1$(EXEEXT) removespacedims1$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+ topclosed1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+ upperbound1$(EXEEXT) upperboundifexact1$(EXEEXT) \
+ wrap1$(EXEEXT) writebox1$(EXEEXT)
+am__EXEEXT_2 = nnc_frompolyhedron1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am__EXEEXT_4 =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76widening_OBJECTS = cc76widening.$(OBJEXT)
+cc76widening_OBJECTS = $(am_cc76widening_OBJECTS)
+cc76widening_LDADD = $(LDADD)
+cc76widening_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompartiallyreducedproduct1_OBJECTS = \
+ frompartiallyreducedproduct1.$(OBJEXT)
+frompartiallyreducedproduct1_OBJECTS = \
+ $(am_frompartiallyreducedproduct1_OBJECTS)
+frompartiallyreducedproduct1_LDADD = $(LDADD)
+frompartiallyreducedproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron2_OBJECTS = frompolyhedron2.$(OBJEXT)
+frompolyhedron2_OBJECTS = $(am_frompolyhedron2_OBJECTS)
+frompolyhedron2_LDADD = $(LDADD)
+frompolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS = \
+ generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS = \
+ $(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS = \
+ generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS = \
+ $(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_interval1_OBJECTS = interval1.$(OBJEXT)
+interval1_OBJECTS = $(am_interval1_OBJECTS)
+interval1_LDADD = $(LDADD)
+interval1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS = \
+ limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS = \
+ $(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nnc_frompolyhedron1_OBJECTS = \
+ nnc_frompolyhedron1-frompolyhedron1.$(OBJEXT)
+nnc_frompolyhedron1_OBJECTS = $(am_nnc_frompolyhedron1_OBJECTS)
+nnc_frompolyhedron1_LDADD = $(LDADD)
+nnc_frompolyhedron1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_frompolyhedron1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_propagateconstraints1_OBJECTS = propagateconstraints1.$(OBJEXT)
+propagateconstraints1_OBJECTS = $(am_propagateconstraints1_OBJECTS)
+propagateconstraints1_LDADD = $(LDADD)
+propagateconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_propagateconstraints2_OBJECTS = propagateconstraints2.$(OBJEXT)
+propagateconstraints2_OBJECTS = $(am_propagateconstraints2_OBJECTS)
+propagateconstraints2_LDADD = $(LDADD)
+propagateconstraints2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruence1_OBJECTS = refinewithcongruence1.$(OBJEXT)
+refinewithcongruence1_OBJECTS = $(am_refinewithcongruence1_OBJECTS)
+refinewithcongruence1_LDADD = $(LDADD)
+refinewithcongruence1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraint2_OBJECTS = refinewithconstraint2.$(OBJEXT)
+refinewithconstraint2_OBJECTS = $(am_refinewithconstraint2_OBJECTS)
+refinewithconstraint2_LDADD = $(LDADD)
+refinewithconstraint2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraints2_OBJECTS = refinewithconstraints2.$(OBJEXT)
+refinewithconstraints2_OBJECTS = $(am_refinewithconstraints2_OBJECTS)
+refinewithconstraints2_LDADD = $(LDADD)
+refinewithconstraints2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writebox1_OBJECTS = writebox1.$(OBJEXT)
+writebox1_OBJECTS = $(am_writebox1_OBJECTS)
+writebox1_LDADD = $(LDADD)
+writebox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+ $(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) $(empty1_SOURCES) \
+ $(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+ $(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+ $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+ $(frompartiallyreducedproduct1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+ $(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+ $(intersection1_SOURCES) $(interval1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+ $(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+ $(nnc_frompolyhedron1_SOURCES) \
+ $(propagateconstraints1_SOURCES) \
+ $(propagateconstraints2_SOURCES) \
+ $(refinewithcongruence1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraint1_SOURCES) \
+ $(refinewithconstraint2_SOURCES) \
+ $(refinewithconstraints1_SOURCES) \
+ $(refinewithconstraints2_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(relations4_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(unconstrain1_SOURCES) \
+ $(universe1_SOURCES) $(upperbound1_SOURCES) \
+ $(upperboundifexact1_SOURCES) $(wrap1_SOURCES) \
+ $(writebox1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+ $(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) $(empty1_SOURCES) \
+ $(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+ $(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+ $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+ $(frompartiallyreducedproduct1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+ $(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+ $(intersection1_SOURCES) $(interval1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+ $(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+ $(nnc_frompolyhedron1_SOURCES) \
+ $(propagateconstraints1_SOURCES) \
+ $(propagateconstraints2_SOURCES) \
+ $(refinewithcongruence1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraint1_SOURCES) \
+ $(refinewithconstraint2_SOURCES) \
+ $(refinewithconstraints1_SOURCES) \
+ $(refinewithconstraints2_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(relations4_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(unconstrain1_SOURCES) \
+ $(universe1_SOURCES) $(upperbound1_SOURCES) \
+ $(upperboundifexact1_SOURCES) $(wrap1_SOURCES) \
+ $(writebox1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+interval1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+propagateconstraints1 propagateconstraints2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithconstraints2 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DBOX_INSTANCE=rt_r_oc
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = fl_r_oc
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = db_r_oc
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCES = ld_r_oc
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76widening_SOURCES = cc76widening.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+intersection1_SOURCES = intersection1.cc
+interval1_SOURCES = interval1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+propagateconstraints1_SOURCES = propagateconstraints1.cc
+propagateconstraints2_SOURCES = propagateconstraints2.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithconstraints2_SOURCES = refinewithconstraints2.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writebox1_SOURCES = writebox1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+BUGS =
+EXTRA_DIST =
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Box/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Box/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES)
+ @rm -f affinedimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES)
+ @rm -f bgp99extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES)
+ @rm -f cc76narrowing1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+cc76widening$(EXEEXT): $(cc76widening_OBJECTS) $(cc76widening_DEPENDENCIES) $(EXTRA_cc76widening_DEPENDENCIES)
+ @rm -f cc76widening$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76widening_OBJECTS) $(cc76widening_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES)
+ @rm -f constrains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES)
+ @rm -f difference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) $(EXTRA_equality1_DEPENDENCIES)
+ @rm -f equality1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES)
+ @rm -f frequency1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES)
+ @rm -f fromgensys1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+frompartiallyreducedproduct1$(EXEEXT): $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_DEPENDENCIES) $(EXTRA_frompartiallyreducedproduct1_DEPENDENCIES)
+ @rm -f frompartiallyreducedproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+frompolyhedron2$(EXEEXT): $(frompolyhedron2_OBJECTS) $(frompolyhedron2_DEPENDENCIES) $(EXTRA_frompolyhedron2_DEPENDENCIES)
+ @rm -f frompolyhedron2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron2_OBJECTS) $(frompolyhedron2_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES)
+ @rm -f fromspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES)
+ @rm -f geomcovers1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+interval1$(EXEEXT): $(interval1_OBJECTS) $(interval1_DEPENDENCIES) $(EXTRA_interval1_DEPENDENCIES)
+ @rm -f interval1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(interval1_OBJECTS) $(interval1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES)
+ @rm -f limitedcc76extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES)
+ @rm -f max_min1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES)
+ @rm -f maxspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+nnc_frompolyhedron1$(EXEEXT): $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_DEPENDENCIES) $(EXTRA_nnc_frompolyhedron1_DEPENDENCIES)
+ @rm -f nnc_frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_frompolyhedron1_LINK) $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_LDADD) $(LIBS)
+
+propagateconstraints1$(EXEEXT): $(propagateconstraints1_OBJECTS) $(propagateconstraints1_DEPENDENCIES) $(EXTRA_propagateconstraints1_DEPENDENCIES)
+ @rm -f propagateconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(propagateconstraints1_OBJECTS) $(propagateconstraints1_LDADD) $(LIBS)
+
+propagateconstraints2$(EXEEXT): $(propagateconstraints2_OBJECTS) $(propagateconstraints2_DEPENDENCIES) $(EXTRA_propagateconstraints2_DEPENDENCIES)
+ @rm -f propagateconstraints2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(propagateconstraints2_OBJECTS) $(propagateconstraints2_LDADD) $(LIBS)
+
+refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) $(EXTRA_refinewithcongruence1_DEPENDENCIES)
+ @rm -f refinewithcongruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES)
+ @rm -f refinewithcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) $(EXTRA_refinewithconstraint1_DEPENDENCIES)
+ @rm -f refinewithconstraint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+
+refinewithconstraint2$(EXEEXT): $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_DEPENDENCIES) $(EXTRA_refinewithconstraint2_DEPENDENCIES)
+ @rm -f refinewithconstraint2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES)
+ @rm -f refinewithconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+refinewithconstraints2$(EXEEXT): $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_DEPENDENCIES) $(EXTRA_refinewithconstraints2_DEPENDENCIES)
+ @rm -f refinewithconstraints2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) $(EXTRA_relations4_DEPENDENCIES)
+ @rm -f relations4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES)
+ @rm -f unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES)
+ @rm -f upperboundifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES)
+ @rm -f wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writebox1$(EXEEXT): $(writebox1_OBJECTS) $(writebox1_DEPENDENCIES) $(EXTRA_writebox1_DEPENDENCIES)
+ @rm -f writebox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writebox1_OBJECTS) $(writebox1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76widening.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompartiallyreducedproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/interval1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/propagateconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/propagateconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebox1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+nnc_frompolyhedron1-frompolyhedron1.o: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+
+nnc_frompolyhedron1-frompolyhedron1.obj: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ fi; \
+ echo "$${col}$$dashes$${std}"; \
+ echo "$${col}$$banner$${std}"; \
+ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+ test -z "$$report" || echo "$${col}$$report$${std}"; \
+ echo "$${col}$$dashes$${std}"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+ $(dist_check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Box/addconstraints1.cc b/tests/Box/addconstraints1.cc
new file mode 100644
index 0000000..0dfee27
--- /dev/null
+++ b/tests/Box/addconstraints1.cc
@@ -0,0 +1,290 @@
+/* Test Box::add_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B >= 0);
+ cs.insert(A >= 0);
+ cs.insert(B == 5);
+ cs.insert(B <= 7);
+
+ TBox box(2);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+
+ try {
+ // This is an invalid use of method
+ // Box::add_constraint: it is illegal
+ // to add a constraint with bigger dimension.
+ box.add_constraint(x <= 0);
+ box.add_constraint(y - x + z >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::add_constraints(cs): it is illegal to
+ // add a system of constraints that is not dimensional incompatible
+ // with the polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y >= 0);
+ box.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::add_constraint(c): it is illegal to insert a
+ // constraints that contains a variable that is not in the space
+ // of the polyhedron.
+ box.add_constraint(y >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::add_constraints(cs): it is illegal to add a system
+ // of constraints that is dimensional incompatible with the
+ // polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y == 0);
+ box.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 5);
+
+ TBox box(2);
+ box.add_constraints(cs);
+ bool ok = !box.is_empty();
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 5);
+
+ TBox box(2);
+ box.add_recycled_constraints(cs);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 5);
+
+ TBox box(2);
+ box.add_recycled_constraints(cs);
+ bool ok = !box.is_empty();
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 4);
+
+ TBox box(2);
+ box.add_constraints(cs);
+ bool ok = box.is_empty();
+
+ Rational_Box known_result(2, EMPTY);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 5);
+ cs.insert(A + 3 <= 2);
+
+ TBox box(2);
+ box.add_recycled_constraints(cs);
+ bool ok = box.is_empty();
+
+ Rational_Box known_result(2, EMPTY);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/addspacedims1.cc b/tests/Box/addspacedims1.cc
new file mode 100644
index 0000000..0e7f489
--- /dev/null
+++ b/tests/Box/addspacedims1.cc
@@ -0,0 +1,333 @@
+/* Test Box::add_space_dimensions_and_embed():
+ we add two variables to a Box.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+ box.add_constraint(x <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_embed(2);
+ box.add_constraint(z <= 2);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.add_space_dimensions_and_embed(2) "
+ "and box.add_constraint(z <= 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box1(0, EMPTY);
+ TBox box2(1, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.add_space_dimensions_and_embed(2);
+ box2.add_space_dimensions_and_embed(1);
+
+ bool ok = (box1 == box2);
+
+ print_constraints(box1, "*** box1.add_space_dimensions_and_embed(2) ***");
+ print_constraints(box2, "*** box2.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox box(0, UNIVERSE);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_embed(3);
+
+ Rational_Box known_result(3, UNIVERSE);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimension_and_embed(3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(4);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+
+ Rational_Box known_result(box);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(0);
+
+ print_constraints(box, "*** box.add_space_dimensions_and_project(0) ***");
+
+ bool ok = check_result(box, known_result);
+
+ return ok;
+}
+
+bool
+test06() {
+ //Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(1);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(3);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimensions_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBox box(10, UNIVERSE);
+
+ box.remove_higher_space_dimensions(5);
+ box.add_space_dimensions_and_embed(6);
+
+ return box == TBox(11, UNIVERSE);
+}
+
+bool
+test08() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TBox box(2);
+ box.add_constraint(x <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(2);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(w == 0);
+ known_result.add_constraint(z == 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TBox box1(0, EMPTY);
+ TBox box2(1, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.add_space_dimensions_and_project(2);
+ box2.add_space_dimensions_and_project(1);
+
+ bool ok = (box1 == box2);
+
+ print_constraints(box1, "*** box1.add_space_dimensions_and_project(2) ***");
+ print_constraints(box2, "*** box2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ TBox box(0, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(3);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimension_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+
+ box.add_space_dimensions_and_project(4);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D == 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 2);
+
+ TBox box2(box1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.add_space_dimensions_and_project(0);
+ box1.add_space_dimensions_and_embed(0);
+
+ bool ok = (box1 == box2);
+
+ print_constraints(box1, "*** box1.add_space_dimensions_and_project(0) ***");
+ print_constraints(box2, "*** box2.add_space_dimensions_and_embed(0) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x <= 2);
+
+ TBox box(cs);
+
+ print_constraints(box, "*** box ***");
+
+ box.minimized_constraints();
+ box.add_space_dimensions_and_embed(3);
+ box.add_constraint(z <= 2);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(box, known_result) ;
+
+ print_constraints(box,
+ "*** box.add_space_dimensions_and_embed(2) "
+ "and box.add_constraint(z <= 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Box/affinedimension1.cc b/tests/Box/affinedimension1.cc
new file mode 100644
index 0000000..cd5efe7
--- /dev/null
+++ b/tests/Box/affinedimension1.cc
@@ -0,0 +1,292 @@
+/* Test Box::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of `box' is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+
+ box.add_constraint(A <= 5);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 5);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+
+ box.add_constraint(A == 5);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 4);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 3);
+ box.add_constraint(-B <= 2);
+ box.add_constraint(B <= -2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 1);
+
+ return ok;
+}
+
+bool
+test05() {
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test06() {
+ TBox box(2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A <= 1);
+ box.add_constraint(A >= 1);
+ box.add_constraint(B == 0);
+ box.add_constraint(C == 7);
+ box.add_constraint(D <= 9);
+ box.add_constraint(-D <= -9);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A == 1);
+ box.add_constraint(E == 1);
+ box.add_constraint(B <= 7);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B == 2);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(7, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ dimension_type affine_dim = box.affine_dimension();
+
+ nout << endl
+ << "The affine dimension is "
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test11() {
+ TBox box(0, UNIVERSE);
+
+ const dimension_type affine_dim = box.affine_dimension();
+
+ print_constraints(box, "*** box ***");
+
+ return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
+
+
diff --git a/tests/Box/affineimage1.cc b/tests/Box/affineimage1.cc
new file mode 100644
index 0000000..cf91d94
--- /dev/null
+++ b/tests/Box/affineimage1.cc
@@ -0,0 +1,429 @@
+/* Test Box::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 4);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, B);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B <= 4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, B) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, A + 4);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(A <= 6);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, A + 4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, Linear_Expression(4));
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(A == 4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ Rational_Box known_result(box);
+
+ box.affine_image(A, A);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, A) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, 2*A - 2, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, 2*A - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 4);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(B, 2*A, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(B, 2*A, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 4);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(B, 3*A + 3, 3);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(B, 3*A + 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 1);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B <= 2);
+ box.add_constraint(B >= -1);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, -2*A - 3*B + 1, -5);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(5*A >= -4);
+ known_result.add_constraint(5*A <= 7);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B >= -1);
+
+ bool ok = check_result(box, known_result, "1.08e-7", "9.62e-8", "9.54e-8");
+
+ print_constraints(box, "*** box.affine_image(A, -2*A - 3*B + 1, -5) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 2);
+ box.add_constraint(C >= 3);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(C, A + 2*B -3*C + 2, 4);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(2*C <= -1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(C, A + 2*B -3*C + 2, 4) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 2);
+ box.add_constraint(B >= 1);
+ box.add_constraint(C <= 0);
+ box.add_constraint(D == 3);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, -B + 2*C + 1, -3);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C <= 0);
+ known_result.add_constraint(D == 3);
+
+ bool ok = check_result(box, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+ print_constraints(box, "*** box.affine_image(A, -B + 2*C + 1, -3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_image(A, 2*B + C + 2, 4);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_image(A, 2*B + C + 2, 4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 2);
+
+ Linear_Expression coeff1 = A + 1;
+
+ try {
+ // This is an incorrect use of method
+ // Box::affine_image(v, expr, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ box.affine_image(A, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(1);
+ box.add_constraint(A >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // Box::affine_image(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space of
+ // the polyhedron.
+ box.affine_image(B, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(B >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // Box::affine_image(v, expr, d): it is illegal to
+ // use a variable in the expression that does not appear in the
+ // space of the polyhedron.
+ box.affine_image(B, A + C + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 2);
+
+ Linear_Expression coeff1 = 2*A + 1;
+
+ try {
+ // This is an incorrect use of method
+ // Box::affine_image(v, expr, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ box.affine_image(A, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/affinepreimage1.cc b/tests/Box/affinepreimage1.cc
new file mode 100644
index 0000000..32bca96
--- /dev/null
+++ b/tests/Box/affinepreimage1.cc
@@ -0,0 +1,178 @@
+/* Test Box::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_preimage(x, y);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_preimage(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_preimage(A, B-1);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_preimage(A, B-1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 2);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_preimage(A, 2*A + 2, 2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_preimage(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 2);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.affine_preimage(B, Linear_Expression(3));
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.affine_preimage(B, 3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::affine_preimage(v, expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ box.affine_preimage(x, x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::affine_preimage(v, expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the box.
+ box.affine_preimage(y, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/ascii_dump_load1.cc b/tests/Box/ascii_dump_load1.cc
new file mode 100644
index 0000000..704b472
--- /dev/null
+++ b/tests/Box/ascii_dump_load1.cc
@@ -0,0 +1,254 @@
+/* Test Box::ascii_dump() and Box::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-EUP");
+ f.seekp(0, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = !box2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 1);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-EM");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = !box2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-UN");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = !box2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= -10);
+ box.add_constraint(A <= 10);
+ box.add_constraint(B >= 3);
+ box.add_constraint(B <= 6);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "lower");
+ f.seekp(0, ios_base::cur);
+ f << "Z(";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = !box2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(3);
+ box1.add_constraint(A >= 2);
+ box1.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = box2.ascii_load(f);
+ close(f);
+
+ if (!ok) {
+ nout << "ascii_load() failed" << endl;
+ return false;
+ }
+
+ ok = (box1 == box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(3*C == 5);
+ TBox box1(cs);
+
+ print_constraints(box1, "*** box1(cs) ***");
+
+ TBox box1_copy(box1);
+
+ box1.difference_assign(box1_copy);
+
+ print_constraints(box1, "*** box1.difference_assign(box1_copy) ***");
+
+ box1.concatenate_assign(box1_copy);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box1_copy) ***");
+
+ nout << "box1.space_dimension() = " << box1.space_dimension() << endl;
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ box1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBox box2;
+ bool ok = box2.ascii_load(f);
+ close(f);
+
+ if (!ok) {
+ nout << "ascii_load() failed" << endl;
+ return false;
+ }
+
+ ok = (box1 == box2);
+
+ nout << "box2.space_dimension() = " << box2.space_dimension() << endl;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/bgp99extrapolation1.cc b/tests/Box/bgp99extrapolation1.cc
new file mode 100644
index 0000000..0022d4f
--- /dev/null
+++ b/tests/Box/bgp99extrapolation1.cc
@@ -0,0 +1,86 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ typedef Pointset_Powerset<TBox> Box_Set;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ TBox box2(2);
+ box2.add_constraint(A >= 1);
+ TBox box3(2);
+ box3.add_constraint(A >= 2);
+ TBox box4(2);
+ box4.add_constraint(A >= 3);
+
+ Box_Set box_set1(2, EMPTY);
+ box_set1.add_disjunct(box1);
+ box_set1.add_disjunct(box2);
+ box_set1.add_disjunct(box3);
+
+ Box_Set box_set2(box_set1);
+ box_set1.add_disjunct(box4);
+
+ using namespace IO_Operators;
+ nout << "*** box_set1 ***" << endl
+ << box_set1 << endl;
+ nout << "*** box_set2 ***" << endl
+ << box_set2 << endl;
+
+ TBox box5(2);
+ box5.add_constraint(A >= 2);
+ box5.add_constraint(B >= 6);
+
+ Box_Set known_result(2, EMPTY);
+ known_result.add_disjunct(box1);
+ known_result.add_disjunct(box2);
+ known_result.add_disjunct(box5);
+
+ typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+ Widening_Member wm = &TBox::CC76_widening_assign;
+ box_set1.BGP99_extrapolation_assign(box_set2, widen_fun_ref(wm), 3);
+
+ bool ok = box_set1.geometrically_equals(known_result);
+
+ nout
+ << "*** box_set1.BGP99_extrapolation_assign"
+ << "(box_set2, widen_fun_ref(&CC76_widening_assign), 3) ***"
+ << endl
+ << box_set1 << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bhz03widening1.cc b/tests/Box/bhz03widening1.cc
new file mode 100644
index 0000000..106ffc5
--- /dev/null
+++ b/tests/Box/bhz03widening1.cc
@@ -0,0 +1,79 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ typedef Pointset_Powerset<TBox> PSet;
+
+ TBox p(2);
+ TBox q(2);
+ TBox r(2);
+ TBox s(2);
+ p.add_constraint(A >= 1);
+ p.add_constraint(B == 0);
+ q.add_constraint(A >= 2);
+ q.add_constraint(A <= 7);
+ q.add_constraint(B == 1);
+ r.add_constraint(A >= 3);
+ r.add_constraint(A <= 8);
+ r.add_constraint(B == 1);
+ s.add_constraint(A >= 1);
+ s.add_constraint(A <= 6);
+ s.add_constraint(B == 1);
+ PSet P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ PSet Q(2, EMPTY);
+ Q.add_disjunct(p);
+ Q.add_disjunct(q);
+ Q.add_disjunct(s);
+
+ using namespace IO_Operators;
+ nout << "P = " << P << endl
+ << "Q = " << Q << endl;
+
+ PSet old_P = P;
+ typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+ Widening_Member wm = &TBox::CC76_widening_assign;
+ // FIXME: provide a widening certificate for CC76.
+ P.BHZ03_widening_assign<H79_Certificate>(Q, widen_fun_ref(wm));
+
+ nout << "P.BHZ03(Q, CC76)" << " = " << P << endl;
+
+ return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bounded1.cc b/tests/Box/bounded1.cc
new file mode 100644
index 0000000..dabdf00
--- /dev/null
+++ b/tests/Box/bounded1.cc
@@ -0,0 +1,97 @@
+/* Test Box::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ // This is a non-bounded box.
+ TBox box(2);
+ box.add_constraint(x >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ return !box.is_bounded();
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a bounded box (it is a square);
+ TBox box(2);
+ box.add_constraint(x >= 2);
+ box.add_constraint(y >= 2);
+ box.add_constraint(x <= 4);
+ box.add_constraint(y <= 4);
+
+ print_constraints(box, "*** box ***");
+
+ return box.is_bounded();
+}
+
+bool
+test03() {
+ // This is a universal, zero-dimensional box.
+ TBox box;
+
+ print_constraints(box, "*** box ***");
+
+ return box.is_bounded();
+}
+
+bool
+test04() {
+ // This is an empty, zero-dimensional box.
+ TBox box;
+ box.add_constraint(Linear_Expression(-3) >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ return box.is_bounded();
+}
+
+bool
+test05() {
+ // This is an empty box.
+ TBox box(4, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ return box.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/boundedaffineimage1.cc b/tests/Box/boundedaffineimage1.cc
new file mode 100644
index 0000000..4ee40a2
--- /dev/null
+++ b/tests/Box/boundedaffineimage1.cc
@@ -0,0 +1,516 @@
+/* Test Box::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(x, y, y);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(x, y, y) ***");
+
+ return ok;
+}
+
+// Affine image variable is in neither ub_expr nor lb_expr, negative
+// denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(A <= 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(B, "
+ "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+ return ok;
+}
+
+// Affine image variable is in lb_expr but not ub_expr, negative denominator.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(C, 3*D - E, 2*C + 1, -5);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(C, "
+ "3*D - E, 2*C + 1, -5) ***");
+
+ return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, positive denominator.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A <= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(A <= 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(B, "
+ "-B - 2, 7*D - E + 5, 3) ***");
+
+ return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, negative denominator.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable F(5);
+
+ TBox box(6);
+ box.add_constraint(A <= 4);
+ box.add_constraint(A >= -6);
+ box.add_constraint(B == 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(A, -A - 3, B - C + 6*D + F, -1);
+
+ Rational_Box known_result(6);
+ known_result.add_constraint(A >= -3);
+ known_result.add_constraint(B == 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(A, "
+ "-A - 3, B - C + 6*D + F, -1) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y <= 2);
+ box.add_constraint(y >= -1);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y <= 2);
+ box.add_constraint(y >= -1);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+ box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+ ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(x >= -3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.bounded_affine_image("
+ "x, -2*x+y+1, -2*x+y+1, -1) ***");
+ print_constraints(ph,
+ "*** ph.bounded_affine_image("
+ "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower is open.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x > 0);
+ box.add_constraint(y <= 2);
+ box.add_constraint(y >= -1);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x < 3);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y >= -1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.bounded_affine_image("
+ "x, -2*x+y+1, -2*x+y+1) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(3*x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ box.bounded_affine_image(x, x + 4, x + 4, -1);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(3*x >= -14);
+
+ bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+ print_constraints(box,
+ "*** box.bounded_affine_image("
+ "x, x + 4, x + 4, -1) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value (which is open) but the lb_expr has no minimum.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(3*x < 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ box.bounded_affine_image(x, x + 4, x + 4);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(3*x < 14);
+
+ bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+ print_constraints(box,
+ "*** box.bounded_affine_image(x, x + 4, x + 4) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine image has a denominator > 1.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(y, 2*x, 2*x, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+ return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine image has a denominator > 1.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x < 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x < 1);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the box's space dimension.
+ box.bounded_affine_image(y, x, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the box's space dimension.
+ box.bounded_affine_image(y, z, x);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ box.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // Box::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+ // apply the method to a variable that is not in the space of
+ // the polyhedron.
+ box.bounded_affine_image(y, x + 1, Linear_Expression(8));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable x(0);
+
+ TBox box(1);
+
+ print_constraints(box, "*** box ***");
+ box.bounded_affine_image(x, 3*x, 3*x);
+
+ Rational_Box known_result(1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.bounded_affine_image(x, 3*x, 3*x) ***");
+
+ return ok;
+
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test10, TBox);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/Box/boundedaffinepreimage1.cc b/tests/Box/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..ce740dc
--- /dev/null
+++ b/tests/Box/boundedaffinepreimage1.cc
@@ -0,0 +1,519 @@
+/* Test Box::bounded_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(x, y, y+1);
+ ph.bounded_affine_preimage(x, y, y+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.bounded_affine_preimage(x, y, y+1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph.bounded_affine_preimage("
+ "x, y, y+1)) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in the lb_expr but not the ub_expr;
+// negative denominator.
+
+// Illustrates where, when the corresponding polyhedron (still with
+// non-relational constraints) is used to compute the
+// transformation, we get more precise results. This is due to the
+// relational constraint obtained from comparing the lhs expression
+// with the rhs expression.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(B <= 0);
+ box.add_constraint(B >= -2);
+ box.add_constraint(C <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+ ph.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(C <= 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.bounded_affine_preimage(B, "
+ "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph.bounded_affine_preimage(B, "
+ "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3)) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in lb_expr but not ub_expr, negative
+// denominator.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+ box.add_constraint(C == 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+ ph.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.bounded_affine_preimage(C, "
+ "3*D - E, 2*C + 1, -5) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage(C, "
+ "3*D - E, 2*C + 1, -5) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, positive
+// denominator and negative coefficient for the transformed variable.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B <= 15);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+ ph.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.bounded_affine_preimage(B, "
+ "-B - 2, 7*D - E + 5, 3) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage(B, "
+ "-B - 2, 7*D - E + 5, 3) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, negative
+// denominator and negative coefficient for the transformed variable.
+bool
+test05() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_constraint(A <= 4);
+ box.add_constraint(A >= -6);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(A, A - 3, A, -1);
+ ph.bounded_affine_preimage(A, A - 3, A, -1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.bounded_affine_preimage(A, "
+ "A - 3, A, -1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage(A, "
+ "A - 3, A, -1) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, and negative coefficient for the
+// transformed variable.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y <= 2);
+ box.add_constraint(y >= -1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+ ph.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "x, -2*x+1, -2*x+2) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, -2*x+1, -2*x+2) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y <= 2);
+ box.add_constraint(y >= -1);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+ box.bounded_affine_preimage(x, x + y, x + y, -1);
+ ph.bounded_affine_preimage(x, x + y, x + y, -1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "x, -2*x+y+1, -2*x+y+1, -1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower bound is open.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(x > 0);
+ box.add_constraint(y <= 3);
+ box.add_constraint(y >= -8);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+ box.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+ ph.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "x, -2*x+y, -2*x+2*y+1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, -2*x+y, -2*x+2*y+1) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(10*x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+ box.bounded_affine_preimage(x, x + 5, x + 4, -1);
+ ph.bounded_affine_preimage(x, x + 5, x + 4, -1);
+
+ bool ok = check_result(box, Rational_Box(ph),
+ "2.84e-07", "2.84e-07", "2.84e-07");
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "x, x + 5, x + 4, -1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, x + 5, x + 4, -1) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has
+// a maximum value (which is open) but the lb_expr has no minimum
+// Negative coefficient for the transformed variable and negative
+// denominator.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x < 2);
+ box.add_constraint(x > 0);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+ box.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+ ph.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "x, -x + 5, x + 4, -1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, -x + 5, x + 4, -1) ***");
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine preimage has a denominator > 1.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+ box.bounded_affine_preimage(y, 2*x, 2*x, 2);
+ ph.bounded_affine_preimage(y, 2*x, 2*x, 2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.bounded_affine_preimage("
+ "y, 2*x, 2*x, 2) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "y, 2*x, 2*x, 2) ***");
+
+ return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine preimage has a denominator > 1.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x < 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+ box.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+ ph.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+
+ bool ok = check_result(box, Rational_Box(ph),
+ "3.98e-08", "3.98e-08", "3.98e-08");
+
+ print_constraints(box,
+ "*** box .bounded_affine_preimage("
+ "x, 2*x-2, 5*x+2, 2) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).bounded_affine_preimage("
+ "x, 2*x-2, 5*x+2, 2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is
+ // illegal to apply it to an expression whose space dimension is
+ // greater than the box's space dimension.
+ box.bounded_affine_preimage(y, x, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the box's space dimension.
+ box.bounded_affine_preimage(y, z, x);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+ // to apply it to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ box.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+ box.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the method
+ // Box::bounded_affine_preimage(v, lb_expr, ub_epxr, d): it is illegal to
+ // apply the method to a variable that is not in the space of
+ // the polyhedron.
+ box.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/cc76narrowing1.cc b/tests/Box/cc76narrowing1.cc
new file mode 100644
index 0000000..0d87fc1
--- /dev/null
+++ b/tests/Box/cc76narrowing1.cc
@@ -0,0 +1,207 @@
+/* Test Box::CC76_narrowing_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 1);
+ box1.add_constraint(y <= 7);
+ box1.add_constraint(-y <= 6);
+
+ TBox box2(3);
+ box2.add_constraint(-x <= 3);
+ box2.add_constraint(y <= 2);
+ box2.add_constraint(-y <= 5);
+ box2.add_constraint(x <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.CC76_narrowing_assign(box1);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(-x <= 3);
+ known_result.add_constraint(-y <= 6);
+ known_result.add_constraint(y <= 7);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(4);
+ box1.add_constraint(z <= 1);
+
+ TBox box2(4);
+ box2.add_constraint(-y <= 3);
+ box2.add_constraint(-x <= 2);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(z <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.CC76_narrowing_assign(box1);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(z <= 1);
+ known_result.add_constraint(-y <= 3);
+ known_result.add_constraint(-x <= 2);
+ known_result.add_constraint(x <= 3);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(3);
+ TBox box2(3);
+
+ box1.add_constraint(z <= 1);
+ Rational_Box known_result(3, EMPTY);
+
+ box2.add_constraint(-y <= 3);
+ box2.add_constraint(x >= 4);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(z <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.CC76_narrowing_assign(box1);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(z <= 1);
+ box1.add_constraint(z >= 3);
+
+ TBox box2(3);
+ box2.add_constraint(-y <= 3);
+ box2.add_constraint(x >= 4);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(z <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.CC76_narrowing_assign(box1);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBox box1;
+ TBox box2(0, EMPTY);
+ Rational_Box known_result(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.CC76_narrowing_assign(box1);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable y(1);
+
+ TBox box1(1);
+ TBox box2(2);
+
+ Constraint_System cs;
+ cs.insert(y >= 6);
+
+ try {
+ // This is an invalid use of the method
+ // Box::CC76_narrowing_assign(box2, cs): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ box2.CC76_narrowing_assign(box1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/cc76widening.cc b/tests/Box/cc76widening.cc
new file mode 100644
index 0000000..b125612
--- /dev/null
+++ b/tests/Box/cc76widening.cc
@@ -0,0 +1,120 @@
+/* Test Box::CC76_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 1);
+
+ TBox box2(2);
+ box2.add_constraint(-x <= 3);
+ box2.add_constraint(x <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.CC76_widening_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 1);
+
+ TBox box2(2);
+ box2.add_constraint(-x <= 3);
+ box2.add_constraint(x <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.widening_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ typedef TBox::interval_type::boundary_type tbt;
+ // No stop point indeed.
+ tbt stop_points;
+
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 1);
+ box1.add_constraint(x <= 4);
+
+ TBox box2(2);
+ box2.add_constraint(x >= 3);
+ box2.add_constraint(x <= 4);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.CC76_widening_assign(box2, &stop_points, &stop_points);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 4);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/concatenate1.cc b/tests/Box/concatenate1.cc
new file mode 100644
index 0000000..45e7aa8
--- /dev/null
+++ b/tests/Box/concatenate1.cc
@@ -0,0 +1,225 @@
+/* Test Box::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ // Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ // Variable x7(6);
+ Variable x8(7);
+ Variable x9(8);
+
+ TBox box1(6);
+ box1.add_constraint(x3 <= 2);
+ box1.add_constraint(x5 <= 3);
+
+ TBox box2(3);
+ box2.add_constraint(x3 <= 7);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.concatenate_assign(box2);
+
+ Rational_Box known_result(9);
+ known_result.add_constraint(x3 <= 2);
+ known_result.add_constraint(x5 <= 3);
+ known_result.add_constraint(x9 <= 7);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 3);
+
+ TBox box2(0, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.concatenate_assign(box1);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.concatenate_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x <= 0);
+ cs.insert(y == 3);
+ cs.insert(3*x - 3*y <= 5);
+
+ TBox box1(2);
+ box1.refine_with_constraints(cs);
+
+ TBox box2(0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.concatenate_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 0);
+ known_result.add_constraint(y == 3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box1(3);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(C >= 0);
+
+ TBox box2(2);
+ box2.add_constraint(A >= 0);
+ box2.add_constraint(A <= 1);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.concatenate_assign(box2);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D <= 1);
+ known_result.add_constraint(E >= 0);
+ known_result.add_constraint(E <= 2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 3);
+
+ TBox box2(0, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.concatenate_assign(box2);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+ return ok;
+}
+
+/* Concatenate an empty box to a universe */
+/*
+ This shows a bug in either concatenate_assign() or OK()
+ When executing box1.concatenate_assign(box2),
+ the assertion `box1.OK()' fails.
+*/
+bool
+test06() {
+ Variable x(0);
+
+ TBox box1(1);
+
+ TBox box2(1);
+ box2.add_constraint(x <= 0);
+ box2.add_constraint(x >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.OK();
+ box2.OK();
+
+ box1.concatenate_assign(box2);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/congruences1.cc b/tests/Box/congruences1.cc
new file mode 100644
index 0000000..861779f
--- /dev/null
+++ b/tests/Box/congruences1.cc
@@ -0,0 +1,378 @@
+/* Test Box::Box(const Congruence_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+ Congruence_System cgs;
+ TBox box(cgs);
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from empty congruences and add_congruences()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Congruence_System cgs;
+ cgs.insert(0*D %= 0);
+ TBox box(cgs);
+
+ Rational_Box known_result(4);
+ known_result.add_congruences(cgs);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((C %= 7) / 0);
+
+ TBox box(cgs);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(C == 7);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// add_recycled_congruences()
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+
+ TBox box(3);
+ box.add_recycled_congruences(cgs);
+ bool ok = !box.is_empty();
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 7) / 0);
+
+ TBox box(cgs);
+
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box, "*** box ***");
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ // This inconsistent equality is not ignored when refining.
+ cgs.insert((A + B %= 0) / 0);
+ cgs.insert(C %= 7);
+
+ TBox box(cgs.space_dimension(), UNIVERSE);
+ box.refine_with_congruences(cgs);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// add_congruences() for inconsistent equality congruences
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ cgs.insert((A %= 0) / 0);
+
+ TBox box(3);
+ box.add_congruences(cgs);
+ bool ok = box.is_empty();
+
+ Rational_Box known_result(3, EMPTY);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// add_congruence()
+bool
+test08() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_congruence((A %= 7) / 0);
+ bool ok = !box.is_empty();
+ box.add_congruence((A %= 2) / 0);
+ ok = ok && box.is_empty();
+
+ Rational_Box known_result(1, EMPTY);
+
+ ok = ok && check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((C %= 3) / 0);
+
+ TBox box(cgs);
+ TBox box1(box.minimized_congruences());
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+ known_result.add_constraint(C == 3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ cgs.insert((A %= 0) / 0);
+
+ TBox box(3);
+ box.add_congruences(cgs);
+
+ TBox box1(box.minimized_congruences());
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test11() {
+ TBox box(0);
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test12() {
+ TBox box(0, EMPTY);
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(0, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(2);
+
+ try {
+ box1.add_congruence((x %= 0) / 0);
+ // This is an invalid use of method
+ // Box::add_congruence: it is illegal
+ // to add a congruence with bigger dimension.
+ box1.add_congruence(y - x + z %= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::add_congruences(cs): it is illegal to
+ // add a system of congruences that is dimensional incompatible
+ // with the box.
+ Congruence_System cgs;
+ cgs.insert(x - y %= 0);
+ box.add_congruences(cgs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::add_congruence(c): it is illegal to insert a
+ // congruence that contains a variable that is not in the space
+ // of the box.
+ box.add_congruence((y %= 0) / 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/constrains1.cc b/tests/Box/constrains1.cc
new file mode 100644
index 0000000..ce7bee4
--- /dev/null
+++ b/tests/Box/constrains1.cc
@@ -0,0 +1,188 @@
+/* Test Box::constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred) \
+ if (!pred) { \
+ nout << "!" #pred << endl; \
+ ok = false; \
+ }
+
+#define TEST_PREDICATE_FALSE(pred) \
+ if (pred) { \
+ nout << #pred << endl; \
+ ok = false; \
+ }
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(0*A == 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(box.constrains(A));
+ TEST_PREDICATE_FALSE(box.constrains(B));
+
+ box.add_constraint(0*A == 1);
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ box = TBox(2);
+ box.add_constraint(A == 2);
+ box.add_constraint(B == 4);
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ box = TBox(2);
+
+ TEST_PREDICATE_FALSE(box.constrains(A));
+ TEST_PREDICATE_FALSE(box.constrains(B));
+
+ box.add_constraint(A >= 1);
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_FALSE(box.constrains(B));
+
+ box.add_constraint(B >= 2);
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ box.add_constraint(A <= 2);
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3, EMPTY);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+ TEST_PREDICATE_TRUE(box.constrains(C));
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ TBox box(0);
+ box.add_constraint(Linear_Expression::zero() == 1);
+
+ try {
+ (void) box.constrains(A);
+ }
+ catch (std::invalid_argument& e) {
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B >= 7);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B == 0);
+ box.unconstrain(A);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(box.constrains(A));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(C >= 1);
+ box.add_constraint(C <= 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(box.constrains(C));
+ TEST_PREDICATE_TRUE(box.constrains(B));
+ TEST_PREDICATE_TRUE(box.constrains(A));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/constraints1.cc b/tests/Box/constraints1.cc
new file mode 100644
index 0000000..49ae495
--- /dev/null
+++ b/tests/Box/constraints1.cc
@@ -0,0 +1,162 @@
+/* Test Box::constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox box1(0, EMPTY);
+
+ Rational_Box known_result(box1);
+
+ Constraint_System cs = box1.constraints();
+ TBox box2(cs);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box1(0, UNIVERSE);
+
+ Rational_Box known_result(box1);
+
+ Constraint_System cs = box1.constraints();
+ TBox box2(cs);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box1(3);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(B >= 0);
+
+ Rational_Box known_result(box1);
+
+ box1.contains(box1);
+
+ Constraint_System cs = box1.constraints();
+ TBox box2(cs);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box1(3);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(B >= 0);
+
+ Constraint_System cs = box1.constraints();
+ TBox box2(cs);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(box1);
+
+ bool ok = check_result(box2, known_result);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+
+ Constraint_System cs(Linear_Expression(0) == -1);
+
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(cs);
+
+ Rational_Box known_result(0, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ Constraint_System cs(Linear_Expression(0) == -1);
+ cs.insert(A >= 0);
+
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(cs);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/contains1.cc b/tests/Box/contains1.cc
new file mode 100644
index 0000000..0e09726
--- /dev/null
+++ b/tests/Box/contains1.cc
@@ -0,0 +1,177 @@
+/* Test Box::contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 1);
+ box1.add_constraint(x >= 7);
+
+ // The Box is empty, because it has got a negative cycle.
+ TBox box2(3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool ok = !box1.contains(box2);
+
+ nout << "*** !box1.contains(box2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box1;
+ TBox box2(0, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool ok = box1.contains(box2);
+
+ nout << "*** box1.contains(box2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox box1(0, EMPTY);
+ TBox box2(0, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool ok = box1.contains(box2);
+
+ nout << "*** box1.contains(box2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+
+ TBox box2(2);
+
+ try {
+ // This is an invalid use of Polyhedron::contains(): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ box1.contains(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(D >= 0);
+ cs.insert(C >= 0);
+ cs.insert(B <= 0);
+ cs.insert(A >= 0);
+
+ TBox box1(cs);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(cs);
+
+ print_constraints(box2, "*** box2 ***");
+
+ bool contained = box1.contains(box2);
+
+ nout << "*** box1.contains(box2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box1(3);
+ box1.add_constraint(C <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(3);
+ box2.add_constraint(A == 0);
+ box2.add_constraint(C <= 0);
+
+ print_constraints(box2, "*** box2 ***");
+
+ bool ok = box1.contains(box2);
+
+ nout << "*** box1.contains(box2) ***" << endl;
+ nout << (ok ? "true" : "false") << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/containsintegerpoint1.cc b/tests/Box/containsintegerpoint1.cc
new file mode 100644
index 0000000..bb87bda
--- /dev/null
+++ b/tests/Box/containsintegerpoint1.cc
@@ -0,0 +1,220 @@
+/* Test Box::contains_integer_point().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test02() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x > 0);
+ cs.insert(x < 1);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(8*z >= 7);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test04() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x > 0);
+ cs.insert(x < 1);
+
+ TBox box(1);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+ return !contains;
+}
+
+bool
+test05() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(2*x < 1);
+
+ TBox box(1);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test06() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= -7);
+
+ TBox box(1);
+ box.add_constraints(cs);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test07() {
+ TBox box(1);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test08() {
+ Variable x(0);
+
+ TBox box(1);
+ box.add_constraint(x >= 6);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test09() {
+ Variable x(0);
+
+ TBox box(1);
+ box.add_constraint(x > 6);
+
+ print_constraints(box, "*** box ***");
+
+ bool contains = box.contains_integer_point();
+
+ nout << "box.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/difference1.cc b/tests/Box/difference1.cc
new file mode 100644
index 0000000..208ac5c
--- /dev/null
+++ b/tests/Box/difference1.cc
@@ -0,0 +1,514 @@
+/* Test Box::difference_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Difference of an empty with a non-empty box.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= -2);
+ print_constraints(box1, "*** box1 ***");
+ box1.add_constraint(B == 0);
+
+ TBox box2(2);
+ box2.add_constraint(A >= 0);
+ box2.add_constraint(A <= 2);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Difference of a non-empty with an empty box.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 2);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(B <= 2);
+
+ TBox box2(2, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** ph2 ***");
+
+ Rational_Box known_result(box1);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test03() {
+ TBox box1;
+ TBox box2;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-4) >= 0);
+ Rational_Box known_result(cs);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Intersecting rectangles; difference leaves the original box unchanged.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(y <= 5);
+ box1.add_constraint(y >= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(x >= 1);
+ box2.add_constraint(y <= 4);
+ box2.add_constraint(y >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 5);
+ known_result.add_constraint(y >= 2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Both are rectangles, second strictly included in first;
+// so the first box is unchanged.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 8);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(y <= 7);
+ box1.add_constraint(y >= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(x >= 1);
+ box2.add_constraint(y <= 0);
+ box2.add_constraint(y >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(box1);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Both rectangles; original box unchanged.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 8);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(y <= 7);
+ box1.add_constraint(y >= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x <= 9);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(y <= 8);
+ box2.add_constraint(y >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Unbounded boxes in 3D; original box is unchanged.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 8);
+ box1.add_constraint(y <= 7);
+ box1.add_constraint(y >= 1);
+ box1.add_constraint(z <= 2);
+
+ TBox box2(3);
+ box2.add_constraint(x == 8);
+ box2.add_constraint(y <= 2);
+ box2.add_constraint(y >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 8);
+ known_result.add_constraint(y <= 7);
+ known_result.add_constraint(y >= 1);
+ known_result.add_constraint(z <= 2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+// Both closed rectangles; the difference makes the first strictly smaller.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(B <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(A >= 2);
+ box2.add_constraint(A <= 4);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A < 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Both rectangles; difference removes an open section of the original box.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(B <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(A > 2);
+ box2.add_constraint(A <= 8);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Both rectangles; difference removes a closed section of the original box.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(B <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(A >= 2);
+ box2.add_constraint(A <= 8);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A < 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= -2);
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** ph2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+// Find difference of a rectangle and a boundary edge.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(B >= 0);
+ box1.add_constraint(B <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(A == 4);
+ box2.add_constraint(B >= 0);
+ box2.add_constraint(B <= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A < 4);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ box1.difference_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Different number of dimensions.
+bool
+test13() {
+ TBox box1(3);
+ TBox box2(5);
+
+ try {
+ // This is an incorrect use of method
+ // Box::difference_assign(box2): it is impossible to apply
+ // this method to two boxes of different dimensions.
+ box1.difference_assign(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Difference of 2 closed half spaces, where the second is
+// strictly contained in the first.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(3);
+ box1.refine_with_constraint(A >= 0);
+ TBox box2(3);
+ box2.refine_with_constraint(A >= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_box(3);
+ known_box.refine_with_constraint(A >= 0);
+ known_box.refine_with_constraint(A < 3);
+
+ bool ok = check_result(box1, known_box);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test15() {
+ Variable A(0);
+
+ TBox box1(1);
+ box1.refine_with_constraint(A == A);
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(1);
+ box2.refine_with_constraint(A == A);
+
+ print_constraints(box1, "*** box1 ***");
+
+ box1.difference_assign(box2);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/discrete1.cc b/tests/Box/discrete1.cc
new file mode 100644
index 0000000..f69b0b2
--- /dev/null
+++ b/tests/Box/discrete1.cc
@@ -0,0 +1,204 @@
+/* Test Box::is_discrete().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = !box.is_discrete();
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+
+ box.add_constraint(A <= 5);
+ box.add_constraint(A == 3);
+ box.add_constraint(B == 0);
+ box.add_constraint(C <= 2);
+ box.add_constraint(D == -7);
+ box.add_constraint(E == 1);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = !box.is_discrete();
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 3);
+ box.add_constraint(B <= -5);
+ box.add_constraint(A >= 3);
+ box.add_constraint(B >= -5);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return ok;
+}
+
+bool
+test05() {
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return ok;
+}
+
+bool
+test06() {
+ TBox box(2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = !box.is_discrete();
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 7);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return !ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A == 1);
+ box.add_constraint(E == 1);
+ box.add_constraint(B <= 7);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return !ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B == 2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(7);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B == 2);
+ box.add_constraint(A >= 6);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_discrete();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/disjoint1.cc b/tests/Box/disjoint1.cc
new file mode 100644
index 0000000..44861d2
--- /dev/null
+++ b/tests/Box/disjoint1.cc
@@ -0,0 +1,189 @@
+/* Test Box::is_disjoint_from(const Box& y).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(B == 0);
+ box1.add_constraint(A >= 1);
+ box1.add_constraint(A <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(A == 0);
+ box2.add_constraint(B >= 1);
+ box2.add_constraint(B <= 2);
+
+ bool ok = box1.is_disjoint_from(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(3);
+
+ TBox box2(3);
+ box2.add_constraint(A <= 3);
+ box2.add_constraint(B >= -5);
+
+ bool disjoint = box1.is_disjoint_from(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return !disjoint;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+
+ Constraint_System cs1;
+ cs1.insert(x1 >= -4);
+
+ TBox box1(2);
+ box1.add_constraints(cs1);
+
+ print_constraints(box1, "*** box1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(2*x1 >= 1);
+ cs2.insert(2*x1 <= 3);
+ cs2.insert(6*x2 <= 1);
+ cs2.insert(3*x2 >= -2);
+
+ TBox box2(2);
+ box2.add_constraints(cs2);
+
+ print_constraints(box2, "*** box2 ***");
+
+ bool disjoint = box1.is_disjoint_from(box2);
+
+ return !disjoint;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+
+ TBox box2(3);
+
+ try {
+ // This is an invalid use of method
+ // Box::is_disjoint_from(box2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ box1.is_disjoint_from(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2, EMPTY);
+
+ TBox box2(2);
+
+ bool disjoint = box1.is_disjoint_from(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return disjoint;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 0);
+ box1.add_constraint(B >= -4);
+
+ TBox box2(2, EMPTY);
+
+ bool disjoint = box1.is_disjoint_from(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return disjoint;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TBox box1(2);
+ box1.add_constraint(A == 0);
+
+ TBox box2(2);
+ box2.add_constraint(A == 1);
+
+ bool ok = box1.is_disjoint_from(box2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/empty1.cc b/tests/Box/empty1.cc
new file mode 100644
index 0000000..dd60569
--- /dev/null
+++ b/tests/Box/empty1.cc
@@ -0,0 +1,226 @@
+/* Different ways of creating an empty Box.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(4);
+ TBox box2(4);
+
+ box1.add_constraint(-x <= 4);
+ box1.add_constraint(y <= 0);
+ box1.add_constraint(z >= 0);
+ box1.add_constraint(y >= 5);
+
+ bool empty1 = box1.is_empty();
+
+ nout << "*** box1.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false ") << endl;
+
+ box2.add_constraint(-x <= 4);
+ box2.add_constraint(y <= 0);
+ box2.add_constraint(z >= 0);
+
+ bool empty2 = box2.is_empty();
+
+ nout << "*** box2.is_empty() ***" << endl;
+ nout << (empty2 ? "true" : "false") << endl;
+
+ return empty1 && !empty2;
+
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(4);
+ TBox box2(4);
+
+ box1.add_constraint(-5*x <= 2);
+ box1.add_constraint(6*y <= -7);
+ box1.add_constraint(6*y >= -5);
+
+ bool empty1 = box1.is_empty();
+
+ print_constraints(box1, "*** box1 ***");
+ nout << "*** box1.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ box2.add_constraint(-5*x <= 7);
+ box2.add_constraint(6*y <= 1);
+ box2.add_constraint(-6*y <= 2);
+ box2.add_constraint(z <= 1);
+
+ bool empty2 = box2.is_empty();
+
+ print_constraints(box2, "*** box2 ***");
+ nout << "*** box2.is_empty() ***" << endl;
+ nout << (empty2 ? "true" : "false") << endl;
+
+ return empty1 && !empty2;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ // Variable x6(5);
+
+ TBox box1(6);
+ TBox box2(6);
+
+ box1.add_constraint(x1 <= 3);
+ box1.add_constraint(x4 <= 3);
+ box1.add_constraint(x2 <= 0);
+ box1.add_constraint(x3 <= -2);
+ box1.add_constraint(x5 <= 2);
+ box1.add_constraint(-x2 <= 0);
+ box1.add_constraint(x3 <= 5);
+ box1.add_constraint(x4 <= -6);
+ box1.add_constraint(x1 <= 5);
+ box1.add_constraint(3*x5 <= 2);
+ box1.add_constraint(-x5 <= -5);
+ box1.add_constraint(-x5 <= 7);
+
+ bool empty1 = box1.is_empty();
+
+ nout << "*** box1.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ box2.add_constraint(x1 <= 3);
+ box2.add_constraint(x4 <= 3);
+ box2.add_constraint(x2 <= 0);
+ box2.add_constraint(x3 <= 2);
+ box2.add_constraint(x5 <= 2);
+ box2.add_constraint(-x2 <= 0);
+ box2.add_constraint(x3 <= 5);
+ box2.add_constraint(x4 <= 6);
+ box2.add_constraint(x1 <= 5);
+ box2.add_constraint(x5 <= 2);
+ box2.add_constraint(-x5 <= 5);
+ box2.add_constraint(x3 <= 7);
+
+ bool empty2 = box2.is_empty();
+
+ nout << "*** box2.is_empty() ***" << endl;
+ nout << (empty2 ? "true" : "false") << endl;
+
+ return empty1 && !empty2;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+
+ box.add_constraint(A == 0);
+ box.add_constraint(C >= 0);
+ box.add_constraint(B >= 1);
+
+ bool empty = box.is_empty();
+
+ print_constraints(box, "*** box ***");
+ nout << "*** box.is_empty() ***"
+ << endl
+ << (empty ? "true" : "false") << endl;
+
+ return !empty;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ TBox box(5);
+
+ Coefficient a;
+ if (std::numeric_limits<Coefficient>::is_bounded)
+ a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+ else
+ a = 1300000000;
+
+ box.add_constraint(2*x1 >= -a);
+ box.add_constraint(3*x2 >= -a);
+ box.add_constraint(5*x3 <= a);
+ box.add_constraint(7*x4 <= a);
+ box.add_constraint(11*x5 <= a);
+
+ print_constraints(box, "*** box ***");
+
+ bool empty = box.is_empty();
+
+ nout << "*** box.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ return !empty;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(3*x >= 7);
+ box.add_constraint(3*x <= 7);
+ box.add_constraint(2*y > 1);
+ box.add_constraint(2*y <= 1);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
+
diff --git a/tests/Box/equality1.cc b/tests/Box/equality1.cc
new file mode 100644
index 0000000..df59182
--- /dev/null
+++ b/tests/Box/equality1.cc
@@ -0,0 +1,131 @@
+/* Test Box::operator==().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+ TBox box2(2);
+
+ box1.add_constraint(x == 3);
+
+ box2.add_constraint(x == 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool known_result = false;
+ bool ok = ((box1 == box2) == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box1(0, EMPTY);
+ TBox box2(0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool known_result = false;
+ bool ok = ((box1 == box2) == known_result);
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox box1(0);
+ TBox box2(0, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool known_result = false;
+ bool ok = ((box1 == box2) == known_result);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A >= 7);
+ box1.add_constraint(B <= -2);
+ box1.add_constraint(A >= 9);
+
+ TBox box2(2);
+ box2.add_constraint(A >= 9);
+ box2.add_constraint(B <= -2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool known_result = true;
+ bool ok = ((box1 == box2) == known_result);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A <= 1);
+ box1.add_constraint(A >= 7);
+
+ TBox box2(2);
+ box2.add_constraint(B <= 5);
+ box2.add_constraint(B >= 10);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ bool known_result = true;
+ bool ok = ((box1 == box2) == known_result);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/expandspacedim1.cc b/tests/Box/expandspacedim1.cc
new file mode 100644
index 0000000..e11ad1a
--- /dev/null
+++ b/tests/Box/expandspacedim1.cc
@@ -0,0 +1,232 @@
+/* Test Box::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBox box(3);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 1);
+
+ TBox known_result(4);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ // Variable A(0);
+ Variable B(1);
+
+ TBox box(3, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(B, 1);
+
+ TBox known_result(4, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(B, 1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 0);
+
+ TBox known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(A, 0) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2, EMPTY);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 1);
+
+ TBox known_result(3, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 1);
+
+ TBox known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 2);
+
+ TBox known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(C == 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(A, 1);
+ box.expand_space_dimension(C, 1);
+
+ TBox known_result(5);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C == 1);
+ known_result.add_constraint(E == 1);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(D <= 1);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box,
+ "*** box.expand_space_dimension(A, 1);"
+ " box.expand_space_dimension(C, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2, EMPTY);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.expand_space_dimension(B, 1);
+
+ TBox known_result(3, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/foldspacedims1.cc b/tests/Box/foldspacedims1.cc
new file mode 100644
index 0000000..a6cb5ba
--- /dev/null
+++ b/tests/Box/foldspacedims1.cc
@@ -0,0 +1,269 @@
+/* Test Box::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ box.fold_space_dimensions(to_fold, B);
+
+ TBox known_result(2);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(3, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ box.fold_space_dimensions(to_fold, B);
+
+ TBox known_result(2, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+
+ box.fold_space_dimensions(to_fold, B);
+
+ TBox known_result(3);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {} into B ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 3);
+ box.add_constraint(B >= 7);
+ box.add_constraint(B <= 12);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ box.fold_space_dimensions(to_fold, B);
+
+ TBox known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 12);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 3);
+ box.add_constraint(B >= 7);
+ box.add_constraint(B <= 12);
+ box.add_constraint(C == 15);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ box.fold_space_dimensions(to_fold, C);
+
+ TBox known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 15);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {A, B} into C ***");
+
+ return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A >= 0);
+ box.add_constraint(C >= 0);
+ box.add_constraint(D >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ box.fold_space_dimensions(to_fold, A);
+
+ TBox known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {C, D} into A ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B == 0);
+ box.add_constraint(C >= 0);
+ box.add_constraint(D >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ box.fold_space_dimensions(to_fold, C);
+
+ TBox known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= -1);
+ box.add_constraint(C >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+
+ box.fold_space_dimensions(to_fold, A);
+
+ TBox known_result(2, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/frequency1.cc b/tests/Box/frequency1.cc
new file mode 100644
index 0000000..7ab5a4e
--- /dev/null
+++ b/tests/Box/frequency1.cc
@@ -0,0 +1,231 @@
+/* Test Box::frequency().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+ Variable A(0);
+
+ TBox box1(1);
+
+ TBox box2(1, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (!box1.frequency(A, num1, den1, valn1, vald1)
+ && !box2.frequency(A, num2, den2, valn2, vald2));
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+ TBox box1(0);
+
+ TBox box2(0, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (box1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+ && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+ && !box2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_constraint(A == 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (box.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!box.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B >= 5);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!box.frequency(Linear_Expression(B), num, den, valn, vald));
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(2*A == 1);
+ box.add_constraint(B == 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (box.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == -1 && vald == 2);
+ print_constraints(box, "*** box ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 1);
+ box.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!box.frequency(Linear_Expression(A - B), num, den, valn, vald));
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(2*B == -1);
+ box.add_constraint(2*C == 1);
+ box.add_constraint(B <= 4);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (box.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 3 && vald == 1);
+ print_constraints(box, "*** box ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+// Non-relational test of an empty box in 1-dimension.
+bool
+test09() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_constraint(A <= 0);
+ box.add_constraint(A >= 1);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!box.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/frombdshape1.cc b/tests/Box/frombdshape1.cc
new file mode 100644
index 0000000..9f28610
--- /dev/null
+++ b/tests/Box/frombdshape1.cc
@@ -0,0 +1,88 @@
+/* Test Box::Box(const BD_Shape&, Complexity_Class).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x - y <= 2);
+ bd.add_constraint(y - x <= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ TBox box(bd, SIMPLEX_COMPLEXITY);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 8);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x - y <= 2);
+ bd.add_constraint(-x <= 3);
+ bd.add_constraint(x <= 0);
+ bd.add_constraint(y - x <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ TBox box(bd, SIMPLEX_COMPLEXITY);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x >= -3);
+ known_result.add_constraint(x <= 0);
+ known_result.add_constraint(y >= -5);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/frombox1.cc b/tests/Box/frombox1.cc
new file mode 100644
index 0000000..742c36a
--- /dev/null
+++ b/tests/Box/frombox1.cc
@@ -0,0 +1,161 @@
+/* Test Box<Interval>::Box(const Box<Other_Interval>&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox src(0, EMPTY);
+ TBox dst(src);
+
+ bool ok = (dst == src);
+
+ print_constraints(src, "*** src ***");
+ print_constraints(dst, "*** dst ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox src(0, UNIVERSE);
+ TBox dst(src);
+
+ bool ok = (dst == src);
+
+ print_constraints(src, "*** src ***");
+ print_constraints(dst, "*** dst ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox src(24, EMPTY);
+ TBox dst(src);
+
+ bool ok = (dst == src);
+
+ print_constraints(src, "*** src ***");
+ print_constraints(dst, "*** dst ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TBox src(24, UNIVERSE);
+ TBox dst(src);
+
+ bool ok = (dst == src);
+
+ print_constraints(src, "*** src ***");
+ print_constraints(dst, "*** dst ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ const int DIM = 10;
+ typedef Checked_Number<mpq_class, Checked_Number_Transparent_Policy<mpq_class> > Q;
+ Rational_Box src(DIM, UNIVERSE);
+ Q k;
+ Q a;
+ k = 2;
+ sqrt_assign(a, k);
+ Q y = a;
+ k = 1;
+ y -= k;
+ // Now y ~= sqrt(2) - 1.
+ k = -4;
+ a *= k;
+ k = 6;
+ a += k;
+ // Now a ~= 6 - 4*sqrt(2).
+ Q s;
+ Q m;
+ Q d;
+ for (int n = 0; n < DIM; ++n) {
+ s = y;
+ s *= s;
+ s *= s;
+ neg_assign(s, s);
+ // Now s ~= -y^4.
+ k = 1;
+ s += k;
+ sqrt_assign(s, s);
+ sqrt_assign(s, s);
+ // Now s ~= sqrt(sqrt(1-y^4)).
+ m = k;
+ m -= s;
+ // Now m ~= 1 - sqrt(sqrt(1-y^4)).
+ d = k;
+ d += s;
+ // Now d ~= 1 + sqrt(sqrt(1-y^4)).
+ y = m/d;
+ // Now y ~= (1 - sqrt(sqrt(1-y^4)))/(1 + sqrt(sqrt(1-y^4))).
+ s = y;
+ s += k;
+ s *= s;
+ s *= s;
+ // Now s ~= (1 + y)^4.
+ a *= s;
+ s = y;
+ s *= s;
+ s += y;
+ s += k;
+ s *= y;
+ // Now s ~= y*(1 + y + y^2).
+ k = 1ULL << (2*n+3);
+ s *= k;
+ a -= s;
+ m = 1;
+ m /= a;
+ Coefficient num;
+ Coefficient den;
+ numer_denom(m, num, den);
+ src.add_constraint(den*Variable(n) == num);
+ }
+
+ TBox dst(src);
+
+ bool ok = check_result(dst, src, "2.39e-6", "5.51e-7", "1.51e-7");
+
+ print_constraints(src, "*** src ***");
+ print_constraints(dst, "*** dst ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST_F64(test05);
+END_MAIN
diff --git a/tests/Box/fromgensys1.cc b/tests/Box/fromgensys1.cc
new file mode 100644
index 0000000..44df261
--- /dev/null
+++ b/tests/Box/fromgensys1.cc
@@ -0,0 +1,182 @@
+/* Test Box::Box(const Generator_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Generator_System gs;
+ TBox box(gs);
+
+ Rational_Box known_result(0, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(closure_point(V));
+
+ try {
+ // It is illegal to build a Box starting from a non-empty
+ // generator system having no points.
+ TBox box(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(ray(V));
+
+ try {
+ // It is illegal to build a Box starting from a non-empty
+ // generator system having no points.
+ TBox box(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(ray(A + B));
+ gs.insert(point(1*A + 2*B + 3*C + 4*D));
+ gs.insert(point(2*A + 3*B + 4*C + 5*D));
+ TBox box(gs);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C >= 3);
+ known_result.add_constraint(C <= 4);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(A >= B);
+ ph.add_constraint(B >= 2*C);
+ ph.add_constraint(C >= 3*D);
+ ph.add_constraint(D >= 4);
+ ph.add_constraint(A-D <= 50);
+
+ TBox box(ph.generators());
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A >= 24);
+ known_result.add_constraint(A <= 60);
+ known_result.add_constraint(B >= 24);
+ known_result.add_constraint(B <= 60);
+ known_result.add_constraint(C >= 12);
+ known_result.add_constraint(C <= 30);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 10);
+
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph(4);
+ ph.add_constraint(A == 7);
+ ph.add_constraint(B < 3);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(C < 7);
+
+ TBox box(ph.generators());
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(A == 7);
+ known_result.add_constraint(B < 3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C < 7);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/fromgrid1.cc b/tests/Box/fromgrid1.cc
new file mode 100644
index 0000000..3aea0f3
--- /dev/null
+++ b/tests/Box/fromgrid1.cc
@@ -0,0 +1,512 @@
+/* Test Box::Box(const Grid&, Complexity_Class).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Minimized rectilinear grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_point(3*A + B));
+ gr.add_grid_generator(grid_point(3*A + 3*B));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(2, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point( A + B));
+ gr.add_grid_generator(grid_point(2*A + 3*B));
+ gr.add_grid_generator(grid_point( A + 4*B));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(2, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A));
+ gr.add_grid_generator(grid_point( A + 2*B, 2));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(2, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Grid containing a line.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_line(A + 2*B));
+ gr.add_grid_generator(grid_point(C, 2));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(3, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+ Grid gr(3, UNIVERSE);
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(3, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+ print_congruences(gr1, "*** gr1 before ***");
+
+ Rational_Box box1(gr1);
+
+ Rational_Box known_box(3);
+ known_box.add_constraint(7*A == 16);
+ known_box.add_constraint(7*B == 6);
+ known_box.add_constraint(7*C == -6);
+
+ bool ok = (box1 == known_box);
+
+ print_constraints(box1, "*** box1 ***");
+ print_congruences(gr1, "*** gr1 after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ if (ok) {
+ Grid gr2(box1);
+
+ print_congruences(gr2, "*** gr2 before ***");
+
+ Rational_Box box2(gr2);
+
+ ok = (box2 == known_box);
+
+ print_constraints(box2, "*** box2 ***");
+ print_congruences(gr2, "*** gr2 after ***");
+ print_constraints(known_box, "*** known_box ***");
+ }
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+ Grid gr1(3, EMPTY);
+
+ print_congruences(gr1, "*** gr1 before ***");
+
+ Rational_Box box1(gr1);
+
+ Rational_Box known_box(3, EMPTY);
+
+ bool ok = (box1 == known_box);
+
+ print_constraints(box1, "*** box1 ***");
+ print_congruences(gr1, "*** gr1 after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ if (ok) {
+ Grid gr2(box1);
+
+ print_congruences(gr2, "*** gr2 before ***");
+
+ Rational_Box box2(gr2);
+
+ ok = (box2 == known_box);
+
+ print_constraints(box2, "*** box2 ***");
+ print_congruences(gr2, "*** gr2 after ***");
+ print_constraints(known_box, "*** known_box ***");
+ }
+
+ return ok;
+}
+
+// A grid with redundant generators.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A + B));
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(2*A));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(3);
+ known_box.add_constraint(C == 0);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A + 2*C %= 0) / 2);
+ gr.add_congruence((A %= 0) / 5);
+ gr.add_constraint(2*B == 3);
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(3);
+ known_box.add_constraint(2*B == 3);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Grid which is a single point.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(16*A + 14*B - 6*C, 7));
+
+ print_congruences(gr1, "*** gr1 before ***");
+
+ Rational_Box box1(gr1);
+
+ Rational_Box known_box(3);
+ known_box.add_constraint(7*A == 16);
+ known_box.add_constraint(B == 2);
+ known_box.add_constraint(7*C == -6);
+
+ bool ok = (box1 == known_box);
+
+ print_constraints(box1, "*** box1 ***");
+ print_congruences(gr1, "*** gr1 after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ if (ok) {
+ Grid gr2(box1);
+
+ print_congruences(gr2, "*** gr2 before ***");
+
+ Rational_Box box2(gr2);
+
+ ok = (box2 == known_box);
+
+ print_constraints(box2, "*** box2 ***");
+ print_congruences(gr2, "*** gr2 after ***");
+ print_constraints(known_box, "*** known_box ***");
+ }
+
+ return ok;
+}
+
+// An empty grid defined by congruences.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((A %= 1) / 2);
+
+ print_congruences(gr1, "*** gr1 before ***");
+
+ Rational_Box box1(gr1);
+
+ Rational_Box known_box(3, EMPTY);
+
+ bool ok = (box1 == known_box);
+
+ print_constraints(box1, "*** box1 ***");
+ print_congruences(gr1, "*** gr1 after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ if (ok) {
+ Grid gr2(box1);
+
+ print_congruences(gr2, "*** gr2 before ***");
+
+ Rational_Box box2(gr2);
+
+ ok = (box2 == known_box);
+
+ print_constraints(box2, "*** box2 ***");
+ print_congruences(gr2, "*** gr2 after ***");
+ print_constraints(known_box, "*** known_box ***");
+ }
+
+ return ok;
+}
+
+// Simple grid where all the points have the same value in one of the
+// dimensions (B).
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(C));
+ gr.add_grid_generator(grid_point(D));
+
+ print_generators(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(4);
+ known_box.add_constraint(B == 0);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Simple grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ gr.add_grid_generator(grid_point( A + 2*B + 4*C, 4));
+ gr.add_grid_generator(grid_point(2*A + 2*B + 4*C, 4));
+ gr.add_grid_generator(grid_point( A + 2*B + 4*C + D, 4));
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(4, UNIVERSE);
+ known_box.add_constraint(2*B == 1);
+ known_box.add_constraint(C == 1);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test14() {
+ Grid gr(0, EMPTY);
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(0, EMPTY);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test15() {
+ Grid gr(0, UNIVERSE);
+
+ print_congruences(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(0, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// Simple grid, with a divisor and 2 points.
+bool
+test16() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(A, 2));
+ print_generators(gr, "*** gr before ***");
+
+ Rational_Box box(gr);
+
+ Rational_Box known_box(1, UNIVERSE);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_generators(gr, "*** gr after ***");
+ print_congruences(gr, "*** gr after ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/frompartiallyreducedproduct1.cc b/tests/Box/frompartiallyreducedproduct1.cc
new file mode 100644
index 0000000..2000dd1
--- /dev/null
+++ b/tests/Box/frompartiallyreducedproduct1.cc
@@ -0,0 +1,137 @@
+/* Test Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+typedef Domain_Product<C_Polyhedron, Grid>::Direct_Product DProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Smash_Product SProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Constraints_Product CProduct;
+
+bool
+test01() {
+ Variable A(0);
+
+ DProduct dp(1);
+ dp.refine_with_constraint(A <= 4);
+ dp.refine_with_constraint(A >= 2);
+ dp.refine_with_congruence((A %= 1) / 5);
+
+ print_congruences(dp, "*** dp.congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ Rational_Box box(dp);
+
+ Rational_Box known_box(1);
+ known_box.refine_with_constraint(A >= 2);
+ known_box.refine_with_constraint(A <= 4);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ DProduct dp(1);
+ dp.refine_with_constraint(A <= 4);
+ dp.refine_with_constraint(A >= 2);
+ dp.refine_with_congruence((A %= 0) / 3);
+
+ Rational_Box box(dp);
+ box.refine_with_constraint(3*A >= 2);
+ box.refine_with_constraint(A <= 6);
+
+ print_congruences(dp, "*** dp.congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ Rational_Box known_box(1);
+ known_box.refine_with_constraint(A >= 2);
+ known_box.refine_with_constraint(A <= 4);
+
+ bool ok = (box == known_box);
+
+ print_constraints(box, "*** box ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ SProduct sp(1);
+ sp.refine_with_constraint(A >= 4);
+ sp.refine_with_constraint(A <= 2);
+ sp.refine_with_congruence((A %= 0) / 3);
+
+ Rational_Box box(sp);
+
+ print_congruences(sp, "*** sp.congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ CProduct cp(1);
+ cp.refine_with_constraint(A <= 4);
+ cp.refine_with_constraint(A >= 4);
+ cp.refine_with_congruence((A %= 0) / 3);
+
+ Rational_Box box(cp);
+
+ print_congruences(cp, "*** cp.congruences ***");
+ print_constraints(cp, "*** cp constraints ***");
+
+ Rational_Box known_box(1, EMPTY);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/frompolyhedron1.cc b/tests/Box/frompolyhedron1.cc
new file mode 100644
index 0000000..eeb56fd
--- /dev/null
+++ b/tests/Box/frompolyhedron1.cc
@@ -0,0 +1,511 @@
+/* Test Box::Box(const Polyhedron&, Complexity_Class).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A non-bounded closed polyhedron consisting of the line x = y.
+// The bounding box is the xy plane - the universal polyhedron.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x - y >= 0);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2, UNIVERSE);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A non-bounded closed polyhedron in 2D consisting of a wedge bounded
+// by y >= 0 and x >= y.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= y);
+ ph.add_constraint(y >= 0);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2);
+ known_box.add_constraint(x >= 0);
+ known_box.add_constraint(y >= 0);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A bounded non-rectangular closed polyhedron in 2D.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(3*x + y >= 2);
+ ph.add_constraint(x <= 4);
+ ph.add_constraint(y <= 4);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2);
+ known_box.add_constraint(3*x >= -2);
+ known_box.add_constraint(x <= 4);
+ known_box.add_constraint(y >= -10);
+ known_box.add_constraint(y <= 4);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// An unbounded closed polyhedron in 4D but bounded in 2D.
+bool
+test04() {
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(3*x + y >= 2);
+ ph.add_constraint(x <= 4);
+ ph.add_constraint(y <= 4);
+ ph.add_constraint(z >= 5);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(4);
+ known_box.add_constraint(3*x >= -2);
+ known_box.add_constraint(x <= 4);
+ known_box.add_constraint(y >= -10);
+ known_box.add_constraint(3*y <= 12);
+ known_box.add_constraint(3*z >= 15);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// This is the universal, 2-dimensional closed polyhedron.
+bool
+test05() {
+ C_Polyhedron ph(2);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2, UNIVERSE);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A zero-dimensional closed polyhedron.
+bool
+test06() {
+ C_Polyhedron ph;
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(0);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// An empty closed polyhedron in 2D.
+bool
+test07() {
+ C_Polyhedron ph(2, EMPTY);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(ph.space_dimension(), EMPTY);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A bounded polyhedron that is a single point.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x == 2);
+ ph.add_constraint(y == 4);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2);
+ known_box.add_constraint(x == 2);
+ known_box.add_constraint(y == 4);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A unit square closed polyhedron.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+
+ C_Polyhedron ph(cs);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2);
+ known_box.add_constraint(x >= 0);
+ known_box.add_constraint(x <= 1);
+ known_box.add_constraint(y >= 0);
+ known_box.add_constraint(y <= 1);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A bounded rectangular closed polyhedron;
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(x <= 3);
+ ph.add_constraint(y <= 3);
+ ph.add_constraint(y >= 1);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ TBox known_box(2);
+ known_box.add_constraint(x >= 1);
+ known_box.add_constraint(x <= 3);
+ known_box.add_constraint(y <= 3);
+ known_box.add_constraint(y >= 1);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A bounded polyhedron having redundant constraints.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x == 3);
+ ph.add_constraint(y == 1);
+ ph.add_constraint(x + y == 4);
+ ph.add_constraint(x - y == 2);
+ ph.add_constraint(3*x + y == 10);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(y <= 5);
+ ph.add_constraint(x + 2*y >= 5);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox known_box(2);
+ known_box.add_constraint(x == 3);
+ known_box.add_constraint(y == 1);
+
+ bool ok = (pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B <= 5);
+ cs.insert(A + 2*B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(3*A - 5*B <= 18);
+ C_Polyhedron ph(cs);
+
+ TBox sbox(ph, SIMPLEX_COMPLEXITY);
+ TBox nbox(ph, ANY_COMPLEXITY);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(11*A <= 61);
+ known_result.add_constraint(2*B <= 5);
+ known_result.add_constraint(5*B >= -18);
+
+ bool ok = (sbox == nbox
+ && check_result(sbox, known_result,
+ "7.50e-7", "4.89e-7", "4.34e-7"));
+
+ print_constraints(sbox, "*** sbox ***");
+ print_constraints(nbox, "*** nbox ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ C_Polyhedron ph(1, EMPTY);
+
+ TBox box(ph);
+
+ TBox known_box(1, EMPTY);
+
+ bool ok (box == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(box, "*** box ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable X01(0);
+ Variable X02(1);
+ Variable X03(2);
+ Variable X04(3);
+ Variable X05(4);
+ Variable X06(5);
+ Variable X07(6);
+ Variable X08(7);
+ Variable X09(8);
+ Variable X10(9);
+ Variable X11(10);
+ Variable X12(11);
+ Variable X13(12);
+ Variable X14(13);
+ Variable X15(14);
+ Variable X16(15);
+ Variable X17(16);
+ Variable X18(17);
+ Variable X19(18);
+ Variable X20(19);
+ Variable X21(20);
+ Variable X22(21);
+ Variable X23(22);
+ Variable X24(23);
+ Variable X25(24);
+ Variable X26(25);
+ Variable X27(26);
+ Variable X28(27);
+ Variable X29(28);
+ Variable X30(29);
+ Variable X31(30);
+ Variable X32(31);
+ Variable X33(32);
+ Variable X34(33);
+ Variable X35(34);
+ Variable X36(35);
+ Variable X37(36);
+ Variable X38(37);
+ Variable X39(38);
+
+ Constraint_System cs;
+ cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+ cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+ cs.insert(-X01 >= -80);
+ cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+ cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+ cs.insert(Coefficient("2386907802506363")*X06
+ + Coefficient("2386907802506363")*X07
+ + Coefficient("1080863910568919")*X08
+ + Coefficient("7746191359077253")*X09
+ - X16 == 0);
+ cs.insert(-X06 + X10 >= -80);
+ cs.insert(-X07 + X11 >= 0);
+ cs.insert(-X08 + X12 >= 0);
+ cs.insert(-X09 + X13 >= 0);
+ cs.insert(X22 - X23 - X24 - X25 == 0);
+ cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+ cs.insert(-X22 >= -500);
+ cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+ cs.insert(Coefficient("7746191359077253")*X28
+ + Coefficient("7746191359077253")*X29
+ + Coefficient("3512807709348987")*X30
+ + Coefficient("3332663724254167")*X31
+ - X38 == 0);
+ cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+ cs.insert(-X28 + X32 >= -500);
+ cs.insert(-X29 + X33 >= 0);
+ cs.insert(-X30 + X34 >= 0);
+ cs.insert(-X31 + X35 >= 0);
+ cs.insert(Coefficient("-2661627379775963")*X10
+ - Coefficient("2686397177726501")*X11
+ - Coefficient("5422333951354077")*X12
+ - Coefficient("5469621747441467")*X13
+ + X25
+ - Coefficient("2466846695892189")*X32
+ - Coefficient("4996743786567565")*X33
+ - Coefficient("5064297780978123")*X34
+ - Coefficient("641481471923585")*X35 >= 0);
+ cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+ cs.insert(X15
+ - Coefficient("7854277750134145")*X28
+ - Coefficient("7782220156096217")*X29
+ - Coefficient("7782220156096217")*X30
+ - Coefficient("7710162562058289")*X31 >= 0);
+ cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+ cs.insert(X21 >= 2);
+ cs.insert(-X16 - X38 >= -300);
+ for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+ cs.insert(Variable(i) >= 0);
+
+ C_Polyhedron ph(cs);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+ TBox sbox(ph, SIMPLEX_COMPLEXITY);
+ TBox nbox(ph, ANY_COMPLEXITY);
+
+ Rational_Box known_result(2);
+
+ bool ok = true;
+
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(sbox, "*** sbox ***");
+ print_constraints(nbox, "*** nbox ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST_F8(test12);
+ DO_TEST(test13);
+ DO_TEST_F64(test14);
+END_MAIN
diff --git a/tests/Box/frompolyhedron2.cc b/tests/Box/frompolyhedron2.cc
new file mode 100644
index 0000000..f88d563
--- /dev/null
+++ b/tests/Box/frompolyhedron2.cc
@@ -0,0 +1,131 @@
+/* Test Box::Box(const NNC_Polyhedron&, Complexity_Class).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded NNC polyhedron in 4D but bounded in 2D
+// with strict inequality and closure points at the lower bound.
+bool
+test01() {
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ NNC_Polyhedron ph(4);
+ ph.add_constraint(3 * x + y > 2);
+ ph.add_constraint(x <= 4);
+ ph.add_constraint(y <= 4);
+ ph.add_constraint(z >= 5);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ // Same precision for both complexities.
+ TBox known_box(4);
+ known_box.add_constraint(3*x > -2);
+ known_box.add_constraint(x <= 4);
+ known_box.add_constraint(y > -10);
+ known_box.add_constraint(y <= 4);
+ known_box.add_constraint(z >= 5);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(3 * x + y >= 2);
+ ph.add_constraint(x < 4);
+ ph.add_constraint(y <= 4);
+
+ TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox nbox(ph);
+
+ // Same precision for both complexities.
+ TBox known_box(2);
+ known_box.add_constraint(3*x >= -2);
+ known_box.add_constraint(x < 4);
+ known_box.add_constraint(y > -10);
+ known_box.add_constraint(y <= 4);
+
+ bool ok = (nbox == known_box && pbox == known_box);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nbox, "*** nbox ***");
+ print_constraints(pbox, "*** pbox ***");
+ print_constraints(known_box, "*** known_box ***");
+
+ return ok;
+}
+
+// An empty polyhedron in 2D defined using strict constraints.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(x > 0);
+ ph.add_constraint(x < 0);
+ ph.add_constraint(y > 0);
+ ph.add_constraint(y < 0);
+
+ Rational_Box pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+ Rational_Box nbox(ph);
+
+ NNC_Polyhedron known_ph(2, EMPTY);
+ NNC_Polyhedron known_pph(pbox);
+ NNC_Polyhedron known_nph(nbox);
+
+ bool ok = (ph == known_ph && ph == known_nph && ph == known_ph);
+
+ print_generators(ph, "*** ph ***");
+ print_generators(known_pph, "*** known_pph ***");
+ print_generators(known_nph, "*** known_nph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/fromspacedim1.cc b/tests/Box/fromspacedim1.cc
new file mode 100644
index 0000000..6aa0aee
--- /dev/null
+++ b/tests/Box/fromspacedim1.cc
@@ -0,0 +1,111 @@
+/* Test Box::Box(dimension_type, Degenerate_Element).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox box(0, EMPTY);
+
+ bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 0);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box(0, UNIVERSE);
+
+ bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 0);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBox box(4, EMPTY);
+
+ bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 4);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TBox box(4, UNIVERSE);
+
+ bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 4);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ try {
+ TBox box(not_a_dimension(), EMPTY);
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test06() {
+ try {
+ TBox box(not_a_dimension(), UNIVERSE);
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage1.cc b/tests/Box/generalizedaffineimage1.cc
new file mode 100644
index 0000000..7792965
--- /dev/null
+++ b/tests/Box/generalizedaffineimage1.cc
@@ -0,0 +1,605 @@
+/* Test Box::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 4);
+ cs.insert(B >= 2);
+
+ Rational_Box known_result(cs);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image"
+ "(B, GREATER_OR_EQUAL, A+2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= 0);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Rational_Box known_result(box);
+
+ box.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image"
+ "(A, LESS_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+
+ box.add_constraint(x >= 2);
+ box.add_constraint(x <= 5);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(x, "
+ "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x >= 2);
+ box.add_constraint(x <= 5);
+ box.add_constraint(y >= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y > -4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(y, "
+ "GREATER_THAN, 2*x - 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A < 1);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(A, "
+ "LESS_THAN, 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A);
+ Linear_Expression e2(A);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+ ph.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, A) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, A) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+ box.add_constraint(C >= -2);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+ ph.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-B, "
+ "LESS_OR_EQUAL, 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** ph.generalized_affine_image(-B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C);
+ Linear_Expression e2(A + 1);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+ ph.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(C, "
+ "LESS_OR_EQUAL, A + 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(C, "
+ "LESS_OR_EQUAL, A + 1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x == 4);
+ box.add_constraint(y <= 0);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+ ph.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(3*x + 2, "
+ "GREATER_OR_EQUAL, 2*x - 3) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(3*x + 2, "
+ "GREATER_OR_EQUAL, 2*x - 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x <= 7);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y >= 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+ ph.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+ bool ok = check_result(box, Rational_Box(ph),
+ "2.39e-7", "1.78e-7", "1.59e-7");
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "6, EQUAL, 3*x - 4) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(2*B + 3*A,
+ LESS_OR_EQUAL, Linear_Expression(1));
+ ph.generalized_affine_image(2*B + 3*A,
+ LESS_OR_EQUAL, Linear_Expression(1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(3*A + 2*B, "
+ "LESS_OR_EQUAL, 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B >= 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+ ph.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-2*A + 5, "
+ "EQUAL, -4*B) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(-2*A + 5, "
+ "EQUAL, -4*B) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+ ph.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(2*B - 5, "
+ "EQUAL, 3*B) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "2*B - 5, EQUAL, 3*B) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(Linear_Expression(-4),
+ LESS_OR_EQUAL, A - 3*B + 2*C);
+ ph.generalized_affine_image(Linear_Expression(-4),
+ LESS_OR_EQUAL, A - 3*B + 2*C);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-4, "
+ "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "-4, LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(Linear_Expression(2),
+ GREATER_OR_EQUAL, A - 3*B + 2*C);
+ ph.generalized_affine_image(Linear_Expression(2),
+ GREATER_OR_EQUAL, A - 3*B + 2*C);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(2, "
+ "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "2, GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B <= 1);
+ box.add_constraint(B >= 2);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(-2*A - B - 1,
+ GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+ ph.generalized_affine_image(-2*A - B - 1,
+ GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-2*A - B - 1, "
+ "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "-2*A - B - 1, GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+ ph.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-2*C + 3, "
+ "GREATER_OR_EQUAL, -3*B + 4) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+ "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage2.cc b/tests/Box/generalizedaffineimage2.cc
new file mode 100644
index 0000000..2270dd3
--- /dev/null
+++ b/tests/Box/generalizedaffineimage2.cc
@@ -0,0 +1,609 @@
+/* Test Box::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(B, GREATER_THAN, A+2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 4);
+ cs.insert(B > 2);
+
+ Rational_Box known_result(cs);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image"
+ "(B, GREATER_THAN, A+2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= 0);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Rational_Box known_result(box);
+
+ box.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, LESS_THAN, B + 1);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image"
+ "(A, LESS_THAN, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+
+ box.add_constraint(x <= 5);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(x, GREATER_THAN, 2*x - 2, 2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image(x, "
+ "GREATER_THAN, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+ box.add_constraint(x >= 2);
+ box.add_constraint(x <= 5);
+ box.add_constraint(y >= 2);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(y > -4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image(y, "
+ "GREATER_THAN, 2*x - 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A < 1);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image(A, "
+ "LESS_THAN, 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(A, GREATER_THAN, Linear_Expression(1));
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A > 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.generalized_affine_image(A, "
+ "GREATER_THAN, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A);
+ Linear_Expression e2(A);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(e1, GREATER_THAN, e2);
+ ph.generalized_affine_image(e1, GREATER_THAN, e2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(A, "
+ "GREATER_THAN, A) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(A, "
+ "GREATER_THAN, A) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(B >= 0);
+ box.add_constraint(C >= -2);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+ ph.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-B, "
+ "LESS_THAN, 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** ph.generalized_affine_image(-B, "
+ "LESS_THAN, 1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C);
+ Linear_Expression e2(A + 1);
+
+ TBox box(3);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B <= 5);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(e1, LESS_THAN, e2);
+ ph.generalized_affine_image(e1, LESS_THAN, e2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(C, "
+ "LESS_THAN, A + 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(C, "
+ "LESS_THAN, A + 1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 4);
+ box.add_constraint(B <= 0);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+ ph.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(3*A + 2, "
+ "GREATER_THAN, 2*A - 3) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(3*A + 2, "
+ "GREATER_THAN, 2*A - 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(2*B + 3*A,
+ LESS_THAN, Linear_Expression(1));
+ ph.generalized_affine_image(2*B + 3*A,
+ LESS_THAN, Linear_Expression(1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(3*A + 2*B, "
+ "LESS_THAN, 1) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+ "LESS_THAN, 1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(Linear_Expression(-4),
+ LESS_THAN, A - 3*B + 2*C);
+ ph.generalized_affine_image(Linear_Expression(-4),
+ LESS_THAN, A - 3*B + 2*C);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(-4, "
+ "LESS_THAN, A - 3*B + 2*C) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "-4, LESS_THAN, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(Linear_Expression(2),
+ GREATER_THAN, A - 3*B + 2*C);
+ ph.generalized_affine_image(Linear_Expression(2),
+ GREATER_THAN, A - 3*B + 2*C);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(2, "
+ "GREATER_THAN, A - 3*B + 2*C) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "2, GREATER_THAN, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B <= 1);
+ box.add_constraint(B >= 2);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(-2*A - B - 1,
+ GREATER_THAN, 3*A + B + 4*C - 2);
+ ph.generalized_affine_image(-2*A - B - 1,
+ GREATER_THAN, 3*A + B + 4*C - 2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(-2*A - B - 1, "
+ "GREATER_THAN, 3*A + B + 4*C - 2) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image("
+ "-2*A - B - 1, GREATER_THAN, 3*A + B + 4*C - 2) ***");
+
+ return ok;
+}
+
+bool
+ test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+ box.add_constraint(C <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+ ph.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box, "*** box.generalized_affine_image(-2*C + 3, "
+ "GREATER_THAN, -3*B + 4) ***");
+ print_constraints(Rational_Box(ph),
+ "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+ "GREATER_THAN, -3*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.generalized_affine_image(Linear_Expression(3),
+ GREATER_THAN,
+ Linear_Expression(4));
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.generalized_affine_image(3, "
+ "GREATER_THAN, 4) ***");
+
+ return ok;
+}
+
+bool
+ test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::generalized_affine_image(): it is illegal
+ // for either expression to have space dimension
+ // greater than the box's space dimension.
+ box.generalized_affine_image(B, EQUAL, C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::generalized_affine_image(): it is illegal
+ // for either expression to have space dimension
+ // greater than the box's space dimension.
+ box.generalized_affine_image(C + 1, GREATER_THAN, B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B <= 1);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::generalized_affine_image(): it is illegal to apply it with
+ // the denominator equal to zero.
+ box.generalized_affine_image(C, GREATER_OR_EQUAL, B, 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/generalizedaffinepreimage1.cc b/tests/Box/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..816edcc
--- /dev/null
+++ b/tests/Box/generalizedaffinepreimage1.cc
@@ -0,0 +1,475 @@
+/*Test Box::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(2*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+ Linear_Expression(-1));
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+ Linear_Expression(-1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(2*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(4*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -B+1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -B+1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(4*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, B+1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(2*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 2*B+1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(5*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -2*B+1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(5*A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+ bool ok = check_result(box, Rational_Box(ph),
+ "6.71e-8", "6.71e-8", "6.71e-8");
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 5);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 0);
+ box.add_constraint(2*C <= 1);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ // If the Coefficient type is not wide enough, do nothing.
+ if (std::numeric_limits<Coefficient>::is_bounded
+ && (std::numeric_limits<Coefficient>::min() > -203
+ || std::numeric_limits<Coefficient>::max() < 629))
+ return true;
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 7);
+ box.add_constraint(C >= 7);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(4*A == 1);
+ box.add_constraint(2*B >= 7);
+ box.add_constraint(5*C <= 7);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 7);
+ box.add_constraint(C >= 0);
+ box.add_constraint(C <= 1);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B <= 4);
+ box.add_constraint(C <= 2);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(2*B <= 3);
+ box.add_constraint(C <= 9);
+ box.add_constraint(C >= 7);
+
+ print_constraints(box, "*** box ***");
+ C_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(2*B >= 7);
+ box.add_constraint(C <= 7);
+ box.add_constraint(5*C >= 7);
+
+ print_constraints(box, "*** box ***");
+ NNC_Polyhedron ph(box);
+
+ box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+ bool ok = check_result(box, Rational_Box(ph));
+
+ print_constraints(box,
+ "*** box.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+ print_constraints(ph,
+ "*** ph.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+DO_TEST(test02);
+DO_TEST(test03);
+DO_TEST(test04);
+DO_TEST(test05);
+DO_TEST_MAY_OVERFLOW_IF_INEXACT(test06, TBox);
+DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+DO_TEST(test08);
+DO_TEST(test09);
+DO_TEST(test10);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test11, TBox);
+DO_TEST(test12);
+DO_TEST(test13);
+DO_TEST(test14);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test15, TBox);
+END_MAIN
diff --git a/tests/Box/geomcovers1.cc b/tests/Box/geomcovers1.cc
new file mode 100644
index 0000000..8b95cc5
--- /dev/null
+++ b/tests/Box/geomcovers1.cc
@@ -0,0 +1,72 @@
+/* Test Pointset_Powerset<Box>::geometrically_covers().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ Constraint_System cs1, cs2, cs3, cs4;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 4);
+ cs2.insert(x >= 4);
+ cs2.insert(x <= 6);
+ cs3.insert(x >= 1);
+ cs3.insert(x <= 5);
+ TBox box1(cs1);
+ TBox box2(cs2);
+ TBox box3(cs3);
+
+ Pointset_Powerset<TBox> ps12(1, EMPTY);
+ ps12.add_disjunct(box1);
+ ps12.add_disjunct(box2);
+
+ Pointset_Powerset<TBox> ps3(1, EMPTY);
+ ps3.add_disjunct(box3);
+
+ using namespace IO_Operators;
+ nout << "ps12 = " << ps12 << endl
+ << " ps3 = " << ps3 << endl;
+
+ if (ps12.geometrically_covers(ps3)) {
+
+ nout << "ps12 covers ps3." << endl;
+
+ return true;
+ }
+ else {
+
+ nout << "ps12 does not cover ps3." << endl;
+
+ return false;
+ }
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/intersection1.cc b/tests/Box/intersection1.cc
new file mode 100644
index 0000000..015e7a4
--- /dev/null
+++ b/tests/Box/intersection1.cc
@@ -0,0 +1,442 @@
+/* Test Box::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 3);
+
+ TBox box2(3);
+ box2.add_constraint(-y <= -2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-y <= -2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(4);
+ box1.add_constraint(x <= 3);
+
+ TBox box2(4);
+ box2.add_constraint(-y <= -2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(4);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-y <= -2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(-x <= -1);
+ box1.add_constraint(y <= 3);
+ box1.add_constraint(-y <= -1);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(-y <= 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-x <= -1);
+ known_result.add_constraint(y <= 3);
+ known_result.add_constraint(-y <= -1);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(x >= 5);
+ box1.add_constraint(y <= 3);
+ box1.add_constraint(y >= 1);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= -5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(x >= 5);
+ box1.add_constraint(y <= 3);
+ box1.add_constraint(y >= 1);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= -5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box2.intersection_assign(box1);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2, "*** box2.intersection_assign(box1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TBox box1;
+ TBox box2;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result;
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= -5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(box2);
+
+ box1.intersection_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box1(3);
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= -5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(box2);
+
+ box1.intersection_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+
+ TBox box2(3);
+
+ try {
+ // This is an invalid use of method
+ // Box::intersection_assign(box2): it is illegal
+ // to apply this method to two shapes having different dimensions.
+ box1.intersection_assign(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ TBox box1(7);
+ TBox box2(15);
+
+ try {
+ // This is an invalid use of method
+ // Box::intersection_assign(box2): it is illegal
+ // to apply this method to two shapes having different dimensions.
+ box1.intersection_assign(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ TBox box1(3, EMPTY);
+ TBox box2(3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result) ;
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ TBox box1(3);
+ TBox box2(3, EMPTY);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.intersection_assign(box2);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result) ;
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+
+ TBox box1(1);
+ box1.add_constraint(x > 0);
+ box1.add_constraint(x <= 1);
+
+ TBox box2(1);
+ box2.add_constraint(x == 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ if (box1.is_empty())
+ return false;
+
+ box1.intersection_assign(box2);
+
+ TBox known_result(1, EMPTY);
+
+ bool ok = (known_result == box1) ;
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable x(0);
+
+ TBox box1(1);
+ box1.add_constraint(x > 0);
+ box1.add_constraint(x <= 1);
+
+ TBox box2(1);
+ box2.add_constraint(x == 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ if (box1.is_empty())
+ return false;
+
+ box1.intersection_assign(box2);
+ bool non_empty = !box1.is_empty();
+
+ TBox known_result(1, EMPTY);
+
+ bool ok = (known_result == box1) && !non_empty;
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 2);
+ box1.add_constraint(y <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x == 1);
+ box2.add_constraint(y >= 1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ if (box1.is_empty())
+ return false;
+
+ box1.intersection_assign(box2);
+ bool non_empty = !box1.is_empty();
+
+ TBox known_result(2);
+ known_result.add_constraint(x == 1);
+ known_result.add_constraint(y >= 1);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = (known_result == box1) && non_empty;
+
+ print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/interval1.cc b/tests/Box/interval1.cc
new file mode 100644
index 0000000..5d8efbe
--- /dev/null
+++ b/tests/Box/interval1.cc
@@ -0,0 +1,224 @@
+/* Test Box::add_space_dimensions_and_embed():
+ we add two variables to a Box.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <complex>
+#include <cmath>
+#include <cstdio>
+
+namespace {
+
+template <typename F>
+struct My_Interval {
+
+ struct Floating_Point_Real_Interval_Info_Policy {
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, false);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+ };
+
+ typedef Interval_Info_Bitset<unsigned int,
+ Floating_Point_Real_Interval_Info_Policy>
+ Floating_Point_Real_Interval_Info;
+
+ typedef Interval<F, Floating_Point_Real_Interval_Info> interval_type;
+};
+
+template<typename F>
+bool
+test01() {
+ typename My_Interval<F>::interval_type x;
+ x = 2;
+ typename My_Interval<F>::interval_type two;
+ two = 2;
+ typename My_Interval<F>::interval_type y;
+
+ nout << "x = " << x << endl;
+
+ for (int i = 0; i <= 100; ++i) {
+ // Compute x = (x+(2/x))/2.
+ y = two;
+ y /= x;
+ x += y;
+ x /= two;
+ nout << "x = " << x << endl;
+ }
+
+ typename My_Interval<F>::interval_type z(F(1.41420757770538330078125));
+ z.join_assign(F(1.41421949863433837890625));
+
+ nout << "z = " << x << endl;
+
+ return !x.is_empty()
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+ && x.is_disjoint_from(F(1.41420757770538330078125))
+ && x.is_disjoint_from(F(1.41421949863433837890625))
+ && z.strictly_contains(x)
+#else
+ && x.is_topologically_closed()
+ && z.contains(x)
+#endif
+ && !x.contains_integer_point();
+}
+
+// Note: this function works both with interval and native floating
+// point types.
+template <typename N>
+void
+polynomial_evaluate(const std::vector<N>& P,
+ const std::complex<N>& x,
+ std::complex<N>& P_x) {
+ // Note: the coefficient of the leading term is implicitly 1.
+ P_x = std::complex<N>(N(1), N(0));
+ for (int i = P.size(); i >= 1; --i)
+ P_x = P_x*x + P[i-1];
+}
+
+// Note: this function works both with interval and native floating
+// point types.
+template <typename N>
+void
+solve(const std::vector<N>& P,
+ std::vector<std::complex<N> >& roots) {
+ const int degree = P.size();
+ if (degree < 1)
+ throw std::invalid_argument("the polynomial must have degree at least 1");
+
+ // Initial estimates are given by roots of unity.
+ std::vector<std::complex<N> > x(5);
+ double theta = 2*M_PI/degree;
+ for (int i = 0; i < degree; ++i) {
+ // Many libm implementations only work with round-to-nearest.
+ // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976
+ restore_pre_PPL_rounding();
+ N cos_i_theta = N(cos(i*theta));
+ N sin_i_theta = N(sin(i*theta));
+ set_rounding_for_PPL();
+
+ x[i] = std::complex<N>(cos_i_theta, sin_i_theta);
+ }
+
+ for (int iteration = 0; iteration < 50; ++iteration) {
+ for (int i = 0; i < degree; ++i)
+ nout << "x[" << i << "] = " << x[i] << endl;
+ for (int i = 0; i < degree; ++i) {
+ std::complex<N> P_x_i;
+ polynomial_evaluate(P, x[i], P_x_i);
+ std::complex<N> d(N(1), N(0));
+ for (int j = 0; j < degree; ++j)
+ if (i != j)
+ d *= (x[i] - x[j]);
+ P_x_i /= d;
+ x[i] -= P_x_i;
+ }
+ }
+ roots.resize(degree+1);
+ for (int i = 0; i < degree; ++i)
+ roots[i] = x[i];
+}
+
+template <typename N>
+bool test02() {
+ std::vector<N> P(4);
+ // x^4 + 5*x^3 + 7*x^2 + 134*x + 1
+ P[3] = 5;
+ P[2] = 7;
+ P[1] = 134;
+ P[0] = 1;
+ std::vector<std::complex<N> > roots;
+ solve(P, roots);
+ return true;
+}
+
+template <typename N>
+bool test03() {
+ std::vector<N> P(2);
+ // x^2 - 1
+ P[1] = 0;
+ P[0] = -1;
+ std::vector<std::complex<N> > roots;
+ solve(P, roots);
+ return true;
+}
+
+template <typename N>
+bool test04() {
+ std::vector<N> P(2);
+ // x^2 - 1
+ P[1] = 0;
+ P[0] = -1;
+ for (int d = 0; d <= 10; ++d) {
+ std::complex<N> P_x_i;
+ polynomial_evaluate(P,
+ std::complex<N>(N(d), N(0)),
+ P_x_i);
+ nout << d << " " << P_x_i << endl;
+ }
+ return true;
+}
+
+template<typename F>
+bool
+test05() {
+ typename My_Interval<F>::interval_type x("123.00123");
+ nout << "x = " << x << endl;
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+
+#if PPL_SUPPORTED_FLOAT
+ DO_TEST(test01<float>);
+ DO_TEST(test02<float>);
+ DO_TEST(test03<float>);
+ DO_TEST(test04<float>);
+ DO_TEST(test05<float>);
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+ DO_TEST(test01<double>);
+ DO_TEST(test02<double>);
+ DO_TEST(test03<double>);
+ DO_TEST(test04<double>);
+ DO_TEST(test05<double>);
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+ DO_TEST(test01<long double>);
+ DO_TEST(test02<long double>);
+ DO_TEST(test03<long double>);
+ DO_TEST(test04<long double>);
+ DO_TEST(test05<long double>);
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+END_MAIN
diff --git a/tests/Box/limitedcc76extrapolation1.cc b/tests/Box/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..a15caab
--- /dev/null
+++ b/tests/Box/limitedcc76extrapolation1.cc
@@ -0,0 +1,317 @@
+/* Test Box::limited_CC76_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox box1(0);
+ TBox box2(0);
+ Constraint_System cs;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(box1);
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A == -2);
+
+ TBox box2(2);
+ box2.add_constraint(A == -2);
+ box2.add_constraint(B == 3);
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(box1);
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2, cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+ TBox box1(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 5);
+ TBox box2(cs2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(cs, "*** cs ***");
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box1(3);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(B >= 1);
+
+ TBox box2(3);
+ box2.add_constraint(A <= -2);
+ box2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(A - B + C <= 6);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A <= 5);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2, cs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+
+ TBox box1(cs1);
+ TBox box2(2, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(x <= 0);
+ cs.insert(y >= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(box1);
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, EMPTY);
+ TBox box2(2, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(x <= 0);
+ cs.insert(y >= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(box1);
+
+ box1.limited_CC76_extrapolation_assign(box2, cs);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1,
+ "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable y(1);
+
+ TBox box1(1);
+ TBox box2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the method
+ // Box::limited_CC76_extrapolation_assign(box2, cs): it is
+ // illegal to apply the method to two polyhedra that are not
+ // dimension-compatible.
+ box2.limited_CC76_extrapolation_assign(box1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the method
+ // Box::limited_CC76_extrapolation_assign(box, cs): it is
+ // illegal to apply the method to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ box2.limited_CC76_extrapolation_assign(box1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 2);
+
+ TBox box2(2);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x < 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(box2);
+
+ box2.limited_CC76_extrapolation_assign(box1, cs);
+
+ bool ok = check_result(box2, known_result);
+
+ print_constraints(box2,
+ "*** box2.limited_CC76_extrapolation_assign(box1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/mapspacedims1.cc b/tests/Box/mapspacedims1.cc
new file mode 100644
index 0000000..d194122
--- /dev/null
+++ b/tests/Box/mapspacedims1.cc
@@ -0,0 +1,280 @@
+/* Test Box::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Partial_Function function;
+
+ TBox box(3);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result;
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Partial_Function function;
+
+ TBox box(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(0, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBox box(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(2, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(2, 1);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ cs = box.minimized_constraints();
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x == 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 0);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 1);
+ function.insert(1, 0);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+
+ TBox box(3);
+ box.add_constraints(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(2);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBox box(2);
+ box.add_constraint(x <= 1);
+ box.add_constraint(y <= -1);
+
+ print_constraints(box, "*** box ***");
+ print_function(function, "*** function ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x <= -1);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D == 0);
+ TBox box(cs);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(1, 1);
+ function.insert(3, 0);
+
+ print_function(function, "*** function ***");
+ print_constraints(box, "*** box ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+ print_function(function, "*** function ***");
+
+ box.map_space_dimensions(function);
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/max_min1.cc b/tests/Box/max_min1.cc
new file mode 100644
index 0000000..81eec69
--- /dev/null
+++ b/tests/Box/max_min1.cc
@@ -0,0 +1,762 @@
+/* Test Box::maximize(const Linear_Expression&, ...)
+ and Box::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBox box(2);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = !box.maximize(x1-2*x2, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = !box.minimize(x1-2*x2, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = !box.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = !box.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test03() {
+
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le;
+ bool ok = box.maximize(le, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(le, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(B >= 1);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(A + B);
+ bool ok = !box.maximize(le, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(le, num, den, included, g)
+ && num == 2 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(A - B);
+ bool ok = box.maximize(le, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !box.minimize(le, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A <= 0);
+ box.add_constraint(B <= 0);
+ box.add_constraint(C >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(A + B - C);
+ bool ok = box.maximize(le, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !box.minimize(le, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(3*A == 1);
+ box.add_constraint(B < 5);
+ box.add_constraint(B > 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(12*A);
+ bool ok = box.maximize(le, num, den, included, g)
+ // FIXME: check the result for floating point computations.
+ // && num == 4 && den == 1 && included
+ && g.is_point()
+ && g.divisor() != 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(le, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(3*A == 1);
+ box.add_constraint(B > 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(12*A);
+
+ bool ok = box.maximize(le, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(le, num, den, included, g)
+ // FIXME: check the result for floating point computations.
+ // && num == 4 && den == 1 && included
+ && g.is_point()
+ && g.divisor() != 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(A + B - C + 2*E - 2*D);
+ bool ok = !box.maximize(le, num, den, included, g)
+ && ! box.minimize(le, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(Linear_Expression(3));
+ bool ok = box.maximize(le, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(le, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(z);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::minimize(le, num, den, included, g): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BOXS.
+ box.minimize(le, num, den, included, g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression le(z);
+
+ try {
+ // This is an incorrect use of the method
+ // Box::maximize(le, num, den, included, g): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the BOXS.
+ box.maximize(le, num, den, included, g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 5);
+ box.add_constraint(B <= 3);
+ box.add_constraint(B >= -5);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(A-2, num, den, included)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(A-2, num, den, included)
+ && num == -1 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 5);
+ box.add_constraint(B <= 3);
+ box.add_constraint(B >= -5);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(A+2, num, den, included)
+ && num == 7 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(A+2, num, den, included)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 100);
+ box.add_constraint(B <= 55);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(-A+2, num, den, included)
+ && num == 2 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(-A+2, num, den, included)
+ && num == -98 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 100);
+ box.add_constraint(B <= 55);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(-A-2, num, den, included)
+ && num == -2 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(-A-2, num, den, included)
+ && num == -102 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 5);
+ box.add_constraint(B <= 3);
+ box.add_constraint(B >= -5);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(A - B - 2, num, den, included)
+ && num == 8 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(A - B - 2, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 5);
+ box.add_constraint(B <= 3);
+ box.add_constraint(B >= -5);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(A - B + 2, num, den, included)
+ && num == 12 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(A - B + 2, num, den, included)
+ && num == 0 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 100);
+ box.add_constraint(B <= 55);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(-A + B + 2, num, den, included)
+ && num == 57 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(-A + B + 2, num, den, included)
+ && num == -98 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 100);
+ box.add_constraint(B <= 55);
+ box.add_constraint(B >= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = box.maximize(-A + B - 2, num, den, included)
+ && num == 53 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = box.minimize(-A + B - 2, num, den, included)
+ && num == -102 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test08, TBox);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/maxspacedim1.cc b/tests/Box/maxspacedim1.cc
new file mode 100644
index 0000000..b194d6c
--- /dev/null
+++ b/tests/Box/maxspacedim1.cc
@@ -0,0 +1,59 @@
+/* Test Box::max_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ nout << Box<fl_r_oc>::max_space_dimension() << " (fl_r_oc)"
+ << endl
+ << Box<db_r_oc>::max_space_dimension() << " (db_r_oc)"
+ << endl
+ << Box<ld_r_oc>::max_space_dimension() << " (ld_r_oc)"
+ << endl
+ << Box<rt_r_oc>::max_space_dimension() << " (rt_r_oc)"
+ << endl;
+
+ if (Box<fl_r_oc>::max_space_dimension()
+ < Box<db_r_oc>::max_space_dimension())
+ return false;
+
+ if (Box<db_r_oc>::max_space_dimension()
+ < Box<ld_r_oc>::max_space_dimension())
+ return false;
+
+ // CHECKME: is this a valid assertion?
+ if (Box<ld_r_oc>::max_space_dimension()
+ < Box<rt_r_oc>::max_space_dimension())
+ return false;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/membytes1.cc b/tests/Box/membytes1.cc
new file mode 100644
index 0000000..a2a99c5
--- /dev/null
+++ b/tests/Box/membytes1.cc
@@ -0,0 +1,129 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <cmath>
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.refine_with_constraint(x >= 0);
+ box.refine_with_constraint(x < 7);
+ box.refine_with_constraint(z < 3);
+ box.refine_with_constraint(x - y - 1 <= 0);
+ box.refine_with_constraint(2*x - 2*y >= 0);
+ box.refine_with_constraint(4*x - 2*y - z + 2 >= 0);
+
+ using namespace IO_Operators;
+ nout << "box = " << box << endl;
+
+ const memory_size_type box_total_size = box.total_memory_in_bytes();
+ const memory_size_type box_external_size = box.external_memory_in_bytes();
+
+ nout << "box.total_memory_in_bytes() = " << box_total_size
+ << endl
+ << "box.external_memory_in_bytes() = " << box_external_size
+ << endl
+ << endl;
+
+ return true;
+}
+
+#if PPL_SUPPORTED_DOUBLE
+
+bool test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Pointset_Powerset<TBox> pbox(2, EMPTY);
+ TBox box(2);
+
+ typedef TBox::interval_type interval_type;
+ typedef interval_type::boundary_type boundary_type;
+
+ interval_type ix;
+ interval_type iy;
+
+ for (double d = -M_PI; d <= M_PI; d += 0.01) {
+ ix.assign(EMPTY);
+ ix.join_assign(boundary_type(d-0.015));
+ ix.join_assign(boundary_type(d+0.015));
+
+ // Many libm implementations only work with round-to-nearest.
+ // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976
+ restore_pre_PPL_rounding();
+ boundary_type sdm = boundary_type(sin(d-0.015));
+ boundary_type sdp = boundary_type(sin(d-0.015));
+ set_rounding_for_PPL();
+
+ iy.assign(EMPTY);
+ iy.join_assign(sdm);
+ iy.join_assign(sdp);
+
+ box.set_interval(x, ix);
+ box.set_interval(y, iy);
+
+ pbox.add_disjunct(box);
+ }
+
+ using namespace IO_Operators;
+ nout << "pbox = " << pbox << endl;
+
+ nout << "pbox.total_memory_in_bytes() = "
+ << pbox.total_memory_in_bytes()
+ << endl
+ << "pbox.external_memory_in_bytes() = "
+ << pbox.external_memory_in_bytes()
+ << endl;
+
+ pbox.refine_with_constraint(x < y);
+
+ using namespace IO_Operators;
+ nout << "pbox = " << pbox << endl;
+
+ nout << "pbox.total_memory_in_bytes() = "
+ << pbox.total_memory_in_bytes()
+ << endl
+ << "pbox.external_memory_in_bytes() = "
+ << pbox.external_memory_in_bytes()
+ << endl;
+
+ return true;
+}
+
+#endif // PPL_SUPPORTED_DOUBLE
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+#if PPL_SUPPORTED_DOUBLE
+ DO_TEST(test02);
+#endif
+END_MAIN
diff --git a/tests/Box/minconstraints1.cc b/tests/Box/minconstraints1.cc
new file mode 100644
index 0000000..c21ac34
--- /dev/null
+++ b/tests/Box/minconstraints1.cc
@@ -0,0 +1,95 @@
+/* Test Box<T>::minimized_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 3);
+ box.add_constraint(A >= -3);
+ box.add_constraint(A <= 1);
+
+ print_constraints(box, "*** box ***");
+
+ const Constraint_System cs = box.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** box.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ C_Polyhedron ph_box(cs);
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (num_constraints == 3 && known_result == ph_box);
+
+ return ok;
+}
+
+bool
+test02() {
+ TBox box(0, UNIVERSE);
+
+ print_constraints(box, "*** box ***");
+
+ const Constraint_System cs = box.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** box.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ return num_constraints == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/propagateconstraints1.cc b/tests/Box/propagateconstraints1.cc
new file mode 100644
index 0000000..79a3d24
--- /dev/null
+++ b/tests/Box/propagateconstraints1.cc
@@ -0,0 +1,211 @@
+/* Test Box::propagate_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= A);
+ cs.insert(11*A < 127);
+ cs.insert(7*A - 15*B > 8);
+ cs.insert(3*B > 2*A);
+ cs.insert(A == B);
+
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(2);
+ box.propagate_constraints(cs);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+ Variable S(18);
+ Variable T(19);
+ Variable U(20);
+ Variable V(21);
+ Variable W(22);
+ Variable X(23);
+ Variable Y(24);
+ Variable Z(25);
+ Variable A1(26);
+ Variable B1(27);
+ Variable C1(28);
+ Variable D1(29);
+ Variable E1(30);
+ Variable F1(31);
+ Variable G1(32);
+ Variable H1(33);
+
+ Constraint_System cs;
+ cs.insert(A + C - Q == 130);
+ cs.insert(B + D - R == 190);
+ cs.insert(-450*A1 - 45*B1 >= -4);
+ cs.insert(-90*C1 - 9*D1 >= -8000);
+ cs.insert(-30*E1 - 3*F1 >= -3500);
+ cs.insert(-30*G1 - 3*H1 >= -3500);
+ cs.insert(-E - G >= -1000);
+ cs.insert(-F - H >= -1000);
+ cs.insert(E + I - 6*A1 == 0);
+ cs.insert(G + K - 6*E1 == 0);
+ cs.insert(F + J - 6*C1 == 0);
+ cs.insert(H + L - 6*G1 == 0);
+ cs.insert(A + W - A1 == 5);
+ cs.insert(B - W + X - C1 == 0);
+ cs.insert(C + Y - E1 == 2);
+ cs.insert(D - Y + Z - G1 == 0);
+ cs.insert(M + S + A1 - B1 == 6);
+ cs.insert(N - O - S + T + C1 - D1 == 0);
+ cs.insert(O + U + E1 - F1 == 4);
+ cs.insert(M - P + U - V - G1 + H1 == 0);
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D >= 0);
+ cs.insert(E >= 0);
+ cs.insert(F >= 0);
+ cs.insert(G >= 0);
+ cs.insert(H >= 0);
+ cs.insert(I >= 0);
+ cs.insert(J >= 0);
+ cs.insert(K >= 0);
+ cs.insert(L >= 0);
+ cs.insert(M >= 0);
+ cs.insert(N >= 0);
+ cs.insert(O >= 0);
+ cs.insert(P >= 0);
+ cs.insert(Q >= 0);
+ cs.insert(R >= 0);
+ cs.insert(S >= 0);
+ cs.insert(T >= 0);
+ cs.insert(U >= 0);
+ cs.insert(V >= 0);
+ cs.insert(W >= 0);
+ cs.insert(X >= 0);
+ cs.insert(Y >= 0);
+ cs.insert(Z >= 0);
+ cs.insert(A1 >= 0);
+ cs.insert(B1 >= 0);
+ cs.insert(C1 >= 0);
+ cs.insert(D1 >= 0);
+ cs.insert(E1 >= 0);
+ cs.insert(F1 >= 0);
+ cs.insert(G1 >= 0);
+ cs.insert(H1 >= 0);
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(cs.space_dimension());
+ box.propagate_constraints(cs);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+
+ Constraint_System cs;
+ cs.insert(-A >= -20);
+ cs.insert(-B - C >= -20);
+ cs.insert(-D >= -20);
+ cs.insert(A + B - E - F == 0);
+ cs.insert(C + D - G - H == 0);
+ cs.insert(E >= 10);
+ cs.insert(F + G >= 20);
+ cs.insert(H >= 30);
+ cs.insert(A >= 0);
+ cs.insert(-A >= -30);
+ cs.insert(B >= 0);
+ cs.insert(-B >= -20);
+ cs.insert(C >= 0);
+ cs.insert(-C >= -10);
+ cs.insert(D >= 0);
+ cs.insert(-D >= -10);
+ cs.insert(E >= 0);
+ cs.insert(-E >= -10);
+ cs.insert(F >= 0);
+ cs.insert(-F >= -2);
+ cs.insert(G >= 0);
+ cs.insert(-G >= -20);
+ cs.insert(H >= 0);
+ cs.insert(-H >= -30);
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(cs.space_dimension());
+ box.propagate_constraints(cs);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/propagateconstraints2.cc b/tests/Box/propagateconstraints2.cc
new file mode 100644
index 0000000..3a18d5f
--- /dev/null
+++ b/tests/Box/propagateconstraints2.cc
@@ -0,0 +1,454 @@
+/* Test Box::propagate_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Edge {
+ unsigned int from;
+ unsigned int to;
+ unsigned long distance;
+};
+
+Edge hawaii[] = {
+ { 0, 1, 6191 },
+ { 1, 0, 6191 },
+ { 2, 3, 4147 },
+ { 3, 2, 4147 },
+ { 4, 5, 3884 },
+ { 5, 4, 3884 },
+ { 5, 6, 1609 },
+ { 6, 5, 1609 },
+ { 7, 0, 12521 },
+ { 0, 7, 12521 },
+ { 8, 1, 2872 },
+ { 1, 8, 2872 },
+ { 9, 10, 4036 },
+ { 10, 9, 4036 },
+ { 4, 11, 2959 },
+ { 11, 4, 2959 },
+ { 12, 13, 27415 },
+ { 13, 12, 27415 },
+ { 14, 15, 6068 },
+ { 15, 14, 6068 },
+ { 15, 16, 7337 },
+ { 16, 15, 7337 },
+ { 17, 18, 2894 },
+ { 18, 17, 2894 },
+ { 18, 19, 5425 },
+ { 19, 18, 5425 },
+ { 20, 21, 2265 },
+ { 21, 20, 2265 },
+ { 19, 20, 3008 },
+ { 20, 19, 3008 },
+ { 21, 12, 6654 },
+ { 12, 21, 6654 },
+ { 22, 23, 1563 },
+ { 23, 22, 1563 },
+ { 23, 24, 3470 },
+ { 24, 23, 3470 },
+ { 25, 26, 6536 },
+ { 26, 25, 6536 },
+ { 27, 28, 10373 },
+ { 28, 27, 10373 },
+ { 28, 29, 7866 },
+ { 29, 28, 7866 },
+ { 29, 30, 8961 },
+ { 30, 29, 8961 },
+ { 31, 32, 6954 },
+ { 32, 31, 6954 },
+ { 33, 34, 24135 },
+ { 34, 33, 24135 },
+ { 34, 35, 5943 },
+ { 35, 34, 5943 },
+ { 33, 36, 2389 },
+ { 36, 33, 2389 },
+ { 35, 37, 3374 },
+ { 37, 35, 3374 },
+ { 34, 38, 4494 },
+ { 38, 34, 4494 },
+ { 37, 38, 8295 },
+ { 38, 37, 8295 },
+ { 38, 39, 12091 },
+ { 39, 38, 12091 },
+ { 39, 40, 4356 },
+ { 40, 39, 4356 },
+ { 39, 30, 3986 },
+ { 30, 39, 3986 },
+ { 29, 41, 3937 },
+ { 41, 29, 3937 },
+ { 41, 28, 7159 },
+ { 28, 41, 7159 },
+ { 42, 43, 3887 },
+ { 43, 42, 3887 },
+ { 43, 44, 3685 },
+ { 44, 43, 3685 },
+ { 43, 45, 20903 },
+ { 45, 43, 20903 },
+ { 45, 46, 2226 },
+ { 46, 45, 2226 },
+ { 47, 44, 7487 },
+ { 44, 47, 7487 },
+ { 44, 48, 22511 },
+ { 48, 44, 22511 },
+ { 46, 48, 7280 },
+ { 48, 46, 7280 },
+ { 48, 49, 3112 },
+ { 49, 48, 3112 },
+ { 49, 50, 2530 },
+ { 50, 49, 2530 },
+ { 50, 51, 17408 },
+ { 51, 50, 17408 },
+ { 45, 52, 15249 },
+ { 52, 45, 15249 },
+ { 53, 54, 36470 },
+ { 54, 53, 36470 },
+ { 54, 49, 7694 },
+ { 49, 54, 7694 },
+ { 51, 55, 11400 },
+ { 55, 51, 11400 },
+ { 52, 46, 15473 },
+ { 46, 52, 15473 },
+ { 55, 56, 37433 },
+ { 56, 55, 37433 },
+ { 53, 57, 3855 },
+ { 57, 53, 3855 },
+ { 57, 58, 1508 },
+ { 58, 57, 1508 },
+ { 59, 60, 3574 },
+ { 60, 59, 3574 },
+ { 59, 53, 7377 },
+ { 53, 59, 7377 },
+ { 58, 60, 6801 },
+ { 60, 58, 6801 },
+ { 60, 61, 9191 },
+ { 61, 60, 9191 },
+ { 61, 62, 3940 },
+ { 62, 61, 3940 },
+ { 62, 63, 1941 },
+ { 63, 62, 1941 },
+ { 63, 64, 17861 },
+ { 64, 63, 17861 },
+ { 65, 66, 12138 },
+ { 66, 65, 12138 },
+ { 66, 67, 5764 },
+ { 67, 66, 5764 },
+ { 68, 62, 2365 },
+ { 62, 68, 2365 },
+ { 69, 70, 14756 },
+ { 70, 69, 14756 },
+ { 70, 71, 3931 },
+ { 71, 70, 3931 },
+ { 71, 72, 6955 },
+ { 72, 71, 6955 },
+ { 69, 73, 4265 },
+ { 73, 69, 4265 },
+ { 73, 56, 5278 },
+ { 56, 73, 5278 },
+ { 74, 75, 1088 },
+ { 75, 74, 1088 },
+ { 76, 77, 2549 },
+ { 77, 76, 2549 },
+ { 78, 79, 2029 },
+ { 79, 78, 2029 },
+ { 80, 81, 4607 },
+ { 81, 80, 4607 },
+ { 81, 82, 995 },
+ { 82, 81, 995 },
+ { 82, 83, 5708 },
+ { 83, 82, 5708 },
+ { 83, 84, 1015 },
+ { 84, 83, 1015 },
+ { 85, 86, 2592 },
+ { 86, 85, 2592 },
+ { 86, 75, 9272 },
+ { 75, 86, 9272 },
+ { 86, 87, 1549 },
+ { 87, 86, 1549 },
+ { 87, 88, 1155 },
+ { 88, 87, 1155 },
+ { 85, 84, 8375 },
+ { 84, 85, 8375 },
+ { 84, 89, 3022 },
+ { 89, 84, 3022 },
+ { 89, 90, 6455 },
+ { 90, 89, 6455 },
+ { 80, 91, 2912 },
+ { 91, 80, 2912 },
+ { 78, 92, 2087 },
+ { 92, 78, 2087 },
+ { 91, 76, 7736 },
+ { 76, 91, 7736 },
+ { 88, 85, 2143 },
+ { 85, 88, 2143 },
+ { 93, 8, 9507 },
+ { 8, 93, 9507 },
+ { 89, 88, 9385 },
+ { 88, 89, 9385 },
+ { 64, 65, 24795 },
+ { 65, 64, 24795 },
+ { 54, 94, 32035 },
+ { 94, 54, 32035 },
+ { 94, 56, 35025 },
+ { 56, 94, 35025 },
+ { 69, 95, 25243 },
+ { 95, 69, 25243 },
+ { 67, 96, 30757 },
+ { 96, 67, 30757 },
+ { 96, 97, 859 },
+ { 97, 96, 859 },
+ { 97, 95, 3230 },
+ { 95, 97, 3230 },
+ { 1, 9, 16155 },
+ { 9, 1, 16155 },
+ { 98, 51, 11706 },
+ { 51, 98, 11706 },
+ { 75, 99, 51590 },
+ { 99, 75, 51590 },
+ { 11, 100, 23417 },
+ { 100, 11, 23417 },
+ { 100, 101, 12368 },
+ { 101, 100, 12368 },
+ { 102, 103, 4846 },
+ { 103, 102, 4846 },
+ { 103, 104, 2901 },
+ { 104, 103, 2901 },
+ { 10, 104, 7849 },
+ { 104, 10, 7849 },
+ { 104, 2, 2147 },
+ { 2, 104, 2147 },
+ { 2, 102, 1761 },
+ { 102, 2, 1761 },
+ { 102, 4, 4444 },
+ { 4, 102, 4444 },
+ { 74, 105, 8183 },
+ { 105, 74, 8183 },
+ { 106, 107, 7075 },
+ { 107, 106, 7075 },
+ { 89, 107, 1178 },
+ { 107, 89, 1178 },
+ { 108, 81, 1312 },
+ { 81, 108, 1312 },
+ { 81, 109, 1793 },
+ { 109, 81, 1793 },
+ { 82, 108, 1001 },
+ { 108, 82, 1001 },
+ { 108, 80, 7421 },
+ { 80, 108, 7421 },
+ { 110, 92, 434 },
+ { 92, 110, 434 },
+ { 92, 79, 3285 },
+ { 79, 92, 3285 },
+ { 79, 99, 2706 },
+ { 99, 79, 2706 },
+ { 111, 78, 3052 },
+ { 78, 111, 3052 },
+ { 77, 111, 2036 },
+ { 111, 77, 2036 },
+ { 24, 25, 2634 },
+ { 25, 24, 2634 },
+ { 25, 21, 1832 },
+ { 21, 25, 1832 },
+ { 33, 112, 14461 },
+ { 112, 33, 14461 },
+ { 113, 114, 7998 },
+ { 114, 113, 7998 },
+ { 41, 115, 6937 },
+ { 115, 41, 6937 },
+ { 32, 116, 47595 },
+ { 116, 32, 47595 },
+ { 99, 117, 3887 },
+ { 117, 99, 3887 },
+ { 117, 118, 736 },
+ { 118, 117, 736 },
+ { 85, 83, 9281 },
+ { 83, 85, 9281 },
+ { 118, 80, 4823 },
+ { 80, 118, 4823 },
+ { 77, 119, 22341 },
+ { 119, 77, 22341 },
+ { 56, 120, 1612 },
+ { 120, 56, 1612 },
+ { 79, 121, 3258 },
+ { 121, 79, 3258 },
+ { 52, 57, 25357 },
+ { 57, 52, 25357 },
+ { 99, 121, 1646 },
+ { 121, 99, 1646 },
+ { 121, 76, 1359 },
+ { 76, 121, 1359 },
+ { 37, 27, 3890 },
+ { 27, 37, 3890 },
+ { 27, 31, 5066 },
+ { 31, 27, 5066 },
+ { 122, 123, 2556 },
+ { 123, 122, 2556 },
+ { 90, 122, 947 },
+ { 122, 90, 947 },
+ { 122, 124, 911 },
+ { 124, 122, 911 },
+ { 124, 125, 23829 },
+ { 125, 124, 23829 },
+ { 91, 119, 7911 },
+ { 119, 91, 7911 },
+};
+
+Edge hawaii1[] = {
+ { 1, 0, 600 },
+ { 2, 1, 2872 },
+};
+
+Edge hawaii2[] = {
+ { 0, 1, 600 },
+ { 1, 2, 2872 },
+};
+
+const mpq_class&
+perturbate(unsigned long a) {
+ static mpq_class q;
+ q = a;
+ q = (q*q)/(q-1);
+ return q;
+}
+
+template <typename T>
+void
+propagate_edges(Box<T>& box, const Edge* edges, unsigned n) {
+ Constraint_System cs;
+ for (unsigned i = 0; i < n; ++i) {
+ const mpq_class& q = perturbate(edges[i].distance);
+ Coefficient a;
+ a = q.get_den();
+ Coefficient b;
+ b = q.get_num();
+
+ vnout << "a = " << a << "; b = " << b << endl;
+
+ cs.insert(a*Variable(edges[i].from) - a*Variable(edges[i].to) <= b);
+ }
+ box.propagate_constraints(cs);
+}
+
+} // namespace
+
+bool test01() {
+ Rational_Box qbox1(126);
+
+ qbox1.add_constraint(Variable(0) >= 100000);
+ qbox1.add_constraint(Variable(0) <= 100001);
+ qbox1.add_constraint(Variable(12) >= 110000);
+ qbox1.add_constraint(Variable(12) <= 110001);
+ qbox1.add_constraint(Variable(14) >= 120000);
+ qbox1.add_constraint(Variable(14) <= 120001);
+ qbox1.add_constraint(Variable(27) >= 130000);
+ qbox1.add_constraint(Variable(27) <= 130001);
+ qbox1.add_constraint(Variable(42) >= 140000);
+ qbox1.add_constraint(Variable(42) <= 140001);
+ qbox1.add_constraint(Variable(113) >= 150000);
+ qbox1.add_constraint(Variable(113) <= 150001);
+ qbox1.add_constraint(Variable(125) >= 200000);
+ qbox1.add_constraint(Variable(125) <= 200001);
+
+ Rational_Box qbox2(qbox1);
+
+ print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+ propagate_edges(qbox2, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+ TBox tbox(qbox1);
+
+ print_constraints(tbox, "*** tbox ***");
+
+ propagate_edges(tbox, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+#if PPL_SUPPORTED_DOUBLE
+ bool ok = check_result(tbox, qbox2, "18.36", "2.83", "2.79");
+#else
+ bool ok = check_result(tbox, qbox2, "30.96", "2.83", "2.79");
+#endif
+
+ return ok;
+}
+
+bool test02() {
+ Rational_Box qbox1(3);
+
+ qbox1.add_constraint(Variable(0) <= 0);
+
+ Rational_Box qbox2(qbox1);
+
+ print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+ propagate_edges(qbox2, hawaii1, sizeof(hawaii1)/sizeof(Edge));
+
+ print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+ TBox tbox(qbox1);
+
+ print_constraints(tbox, "*** tbox ***");
+
+ propagate_edges(tbox, hawaii1, sizeof(hawaii1)/sizeof(Edge));
+
+ print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+ bool ok = check_result(tbox, qbox2, "3.28", "2.83", "2.79");
+
+ return ok;
+}
+
+bool test03() {
+ Rational_Box qbox1(3);
+
+ qbox1.add_constraint(Variable(0) >= 0);
+
+ Rational_Box qbox2(qbox1);
+
+ print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+ propagate_edges(qbox2, hawaii2, sizeof(hawaii2)/sizeof(Edge));
+
+ print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+ TBox tbox(qbox1);
+
+ print_constraints(tbox, "*** tbox ***");
+
+ propagate_edges(tbox, hawaii2, sizeof(hawaii2)/sizeof(Edge));
+
+ print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+ bool ok = check_result(tbox, qbox2, "3.28", "2.83", "2.78");
+
+ return ok;
+}
+
+BEGIN_MAIN
+ DO_TEST_F32(test01);
+ DO_TEST_F16(test02);
+ DO_TEST_F16(test03);
+END_MAIN
diff --git a/tests/Box/refinewithcongruence1.cc b/tests/Box/refinewithcongruence1.cc
new file mode 100644
index 0000000..9def123
--- /dev/null
+++ b/tests/Box/refinewithcongruence1.cc
@@ -0,0 +1,197 @@
+/* Test Box::refine_with_congruences(const Congruence_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box, zero dimensions and trivial congruence.
+bool
+test01() {
+ Congruence cg(Linear_Expression(0) %= 1);
+ TBox box(0);
+ box.refine_with_congruence(cg);
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Universe Box, 4 dimensions and refine with a proper congruence
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Congruence cg(A + B %= 0);
+ TBox box(4);
+ box.refine_with_congruence(cg);
+
+ Rational_Box known_result(4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Universe Box in 3D and refine with an equality congruence.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence cg((A %= 7) / 0);
+
+ TBox box(3);
+ box.refine_with_congruence(cg);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box in 1D and refine with an inconsistent proper congruence.
+bool
+test04() {
+ Variable A(0);
+
+ Congruence cg((0*A %= 1) / 2);
+
+ TBox box(1);
+ box.refine_with_congruence(cg);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// refine_with_congruence()
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(A >= 0);
+ cs.insert(B <= 5);
+ cs.insert(B >= 0);
+ cs.insert(C <= 5);
+ cs.insert(C >= 0);
+ cs.insert(D <= 5);
+ cs.insert(D >= 0);
+ TBox box(cs);
+ box.refine_with_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+
+ Constraint_System known_cs;
+ known_cs.insert(A == 0);
+ known_cs.insert(B == 0);
+ known_cs.insert(C == 0);
+ known_cs.insert(D == 0);
+ Rational_Box known_result(known_cs);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(2);
+
+ try {
+ // This is an invalid use of method
+ // Box::refine_with_congruence: it is illegal
+ // to refine with a congruence with bigger dimension.
+ box1.refine_with_congruence(x %= 0);
+ box1.refine_with_congruence(y - x + z %= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_congruence(c): it is illegal to refine with a
+ // congruence that contains a variable that is not in the space
+ // of the box.
+ box.refine_with_congruence((y %= 0) / 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/refinewithcongruences1.cc b/tests/Box/refinewithcongruences1.cc
new file mode 100644
index 0000000..3f4a8d0
--- /dev/null
+++ b/tests/Box/refinewithcongruences1.cc
@@ -0,0 +1,388 @@
+/* Test Box::refine_with_congruences(const Congruence_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+ Congruence_System cgs;
+ TBox box(cgs);
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences and refine_with_congruences()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Congruence_System cgs;
+ cgs.insert(A + B %= 0);
+ cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+ cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+ TBox box(4);
+ box.refine_with_congruences(cgs);
+
+ Rational_Box known_result(4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert(B %= 3);
+ cgs.insert(B %= 0);
+ cgs.insert(C %= 7);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((0*A %= 1) / 2);
+
+ TBox box(1);
+ box.refine_with_congruences(cgs);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert(B %= 3);
+ cgs.insert(B %= 0);
+ cgs.insert(C %= 7);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box, "*** box ***");
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ cgs.insert((A + B %= 0) / 0);
+ cgs.insert(C %= 7);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// refine_with_congruence()
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBox box(4);
+ box.refine_with_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+ box.refine_with_congruence((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+
+ Rational_Box known_result(4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box ***");
+
+ return ok;
+}
+
+// Non-empty box; congruences().
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert(B %= 3);
+ cgs.insert(B %= 0);
+ cgs.insert(C %= 7);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ cgs.insert((C %= 3) / 5);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+ TBox box1(box.minimized_congruences());
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(A == 7);
+ known_result.add_constraint(B == 3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 0);
+ cgs.insert((B %= 3) / 0);
+ cgs.insert((A %= 0) / 0);
+ cgs.insert(C %= 7);
+
+ TBox box(3);
+ box.refine_with_congruences(cgs);
+
+ TBox box1(box.minimized_congruences());
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test11() {
+ TBox box(0);
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test12() {
+ TBox box(0, EMPTY);
+ TBox box1(box.congruences());
+
+ Rational_Box known_result(0, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1(box.congruences()) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(2);
+
+ try {
+ // This is an invalid use of method
+ // Box::refine_with_congruence: it is illegal
+ // to refine with a congruence with bigger dimension.
+ box1.refine_with_congruence(x %= 0);
+ box1.refine_with_congruence(y - x + z %= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_congruences(cs): it is illegal to
+ // refine with a system of congruences that is dimensional incompatible
+ // with the box.
+ Congruence_System cgs;
+ cgs.insert(x - y %= 0);
+ box.refine_with_congruences(cgs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_congruence(c): it is illegal to refine with a
+ // congruence that contains a variable that is not in the space
+ // of the box.
+ box.refine_with_congruence((y %= 0) / 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint1.cc b/tests/Box/refinewithconstraint1.cc
new file mode 100644
index 0000000..50d9f0f
--- /dev/null
+++ b/tests/Box/refinewithconstraint1.cc
@@ -0,0 +1,151 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.refine_with_constraint(A >= 0);
+
+ print_constraints(box, "*** box.refine_with_constraint(A >= 0) ***");
+
+ box.refine_with_constraint(B >= A);
+
+ print_constraints(box, "*** box.refine_with_constraint(B >= A) ***");
+
+ box.refine_with_constraint(11*A < 127);
+
+ print_constraints(box, "*** box.refine_with_constraint(11*A < 127) ***");
+
+ box.refine_with_constraint(7*A - 15*B > 8);
+
+ print_constraints(box, "*** box.refine_with_constraint(7*A - 15*B > 8) ***");
+
+ box.refine_with_constraint(3*B > 2*A);
+
+ print_constraints(box, "*** box.refine_with_constraint(3*B > 2*A) ***");
+
+ box.refine_with_constraint(A == B);
+
+ print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(7*A > 8);
+ known_result.add_constraint(55*A < 267);
+ known_result.add_constraint(7*B > 8);
+ known_result.add_constraint(55*B < 267);
+
+ bool ok = check_result(box, known_result, "2.33e-6", "1.55e-6", "1.10e-6");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= -2);
+ box.add_constraint(B <= 4);
+
+ print_constraints(box, "*** box ***");
+
+ box.refine_with_constraint(A - 2*B >= 0);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= -4);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.refine_with_constraint(A - 2*B >= 0) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ Constraint_System cs;
+
+ TBox box(1);
+ print_constraints(box, "*** box ***");
+
+ Constraint c(A == 1);
+ print_constraint(c, "*** c ***");
+
+ box.refine_with_constraint(c);
+
+ Rational_Box known_result(1);
+ known_result.add_constraint(A == 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.refine_with_constraint(c) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ TBox box(1);
+ print_constraints(box, "*** box ***");
+
+ Constraint c(Linear_Expression(1) <= 0);
+ print_constraint(c, "*** c ***");
+
+ box.refine_with_constraint(c);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.refine_with_constraint(c) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint2.cc b/tests/Box/refinewithconstraint2.cc
new file mode 100644
index 0000000..98934db
--- /dev/null
+++ b/tests/Box/refinewithconstraint2.cc
@@ -0,0 +1,79 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Unsigned_Integer_Closed_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Unsigned_Integer_Closed_Interval_Info_Policy> Unsigned_Integer_Closed_Interval_Info;
+
+typedef Interval<unsigned long long, Unsigned_Integer_Closed_Interval_Info>
+Unsigned_Integer_Closed_Interval;
+
+typedef Box<Unsigned_Integer_Closed_Interval> UILL_Box;
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ UILL_Box box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 1);
+
+ print_constraints(box, "*** box ***");
+
+ box.refine_with_constraint(A == B);
+
+ print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints1.cc b/tests/Box/refinewithconstraints1.cc
new file mode 100644
index 0000000..2f2de64
--- /dev/null
+++ b/tests/Box/refinewithconstraints1.cc
@@ -0,0 +1,436 @@
+/* Test Box::refine_with_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if defined(__sun) || defined(__sun__)
+
+// Some versions of Solaris define R1 in /usr/include/ia32/sys/reg.h.
+// This conflicts with the use or R1 being made in this proram.
+# undef R1
+
+#endif // defined(__sun) || defined(__sun__)
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B == 5);
+
+ TBox box(2);
+ box.refine_with_constraints(cs);
+
+ print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+ known_result.refine_with_constraint(B - A <= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(2);
+
+ try {
+ // This is an invalid use of method
+ // Box::refine_with_constraint: it is illegal
+ // to add a constraint with bigger dimension.
+ box.refine_with_constraint(x <= 0);
+ box.refine_with_constraint(y - x + z >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_constraints(cs): it is illegal to
+ // add a system of constraints that is not dimensional incompatible
+ // with the polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y >= 0);
+ box.refine_with_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_constraint(c): it is illegal to insert a
+ // constraints that contains a variable that is not in the space
+ // of the polyhedron.
+ box.refine_with_constraint(y >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(1);
+
+ try {
+ // This is an invalid use of the method
+ // Box::refine_with_constraints(cs): it is illegal to add a system
+ // of constraints that is dimensional incompatible with the
+ // polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y == 0);
+ box.refine_with_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 5);
+ cs.insert(B <= 5);
+
+ TBox box(2);
+ box.refine_with_constraints(cs);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.add_constraints(cs) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+ Variable S(18);
+ Variable T(19);
+ Variable U(20);
+ Variable V(21);
+ Variable W(22);
+ Variable X(23);
+ Variable Y(24);
+ Variable Z(25);
+ Variable A1(26);
+ Variable B1(27);
+ Variable C1(28);
+ Variable D1(29);
+ Variable E1(30);
+ Variable F1(31);
+ Variable G1(32);
+ Variable H1(33);
+ Variable I1(34);
+ Variable J1(35);
+ Variable K1(36);
+ Variable L1(37);
+ Variable M1(38);
+ Variable N1(39);
+ Variable O1(40);
+ Variable P1(41);
+ Variable Q1(42);
+ Variable R1(43);
+ Variable S1(44);
+ Variable T1(45);
+ Variable U1(46);
+ Variable V1(47);
+ Variable W1(48);
+ Variable X1(49);
+ Variable Y1(50);
+ Variable Z1(51);
+ Variable A2(52);
+ Variable B2(53);
+ Variable C2(54);
+ Variable D2(55);
+ Variable E2(56);
+ Variable F2(57);
+ Variable G2(58);
+ Variable H2(59);
+ Variable I2(60);
+ Variable J2(61);
+ Variable K2(62);
+ Variable L2(63);
+ Variable M2(64);
+ Variable N2(65);
+ Variable O2(66);
+ Variable P2(67);
+ Variable Q2(68);
+ Variable R2(69);
+ Variable S2(70);
+ Variable T2(71);
+ Variable U2(72);
+ Variable V2(73);
+ Variable W2(74);
+ Variable X2(75);
+ Variable Y2(76);
+ Variable Z2(77);
+ Variable A3(78);
+ Variable B3(79);
+ Variable C3(80);
+ Variable D3(81);
+ Variable E3(82);
+ Variable F3(83);
+ Variable G3(84);
+ Variable H3(85);
+ Variable I3(86);
+ Variable J3(87);
+ Variable K3(88);
+
+ Constraint_System cs;
+ cs.insert(A + F - M1 - O1 - Q1 - S1 == 0);
+ cs.insert(S - U1 - D2 - P2 - V2 == 0);
+ cs.insert(B + G - U1 - X1 - A2 == 0);
+ cs.insert(T - M1 - H2 - R2 - Z2 == 0);
+ cs.insert(C + H - D2 - H2 - L2 == 0);
+ cs.insert(U - O1 - X1 - T2 - D3 == 0);
+ cs.insert(D - P2 - R2 - T2 == 0);
+ cs.insert(V - Q1 - A2 - L2 - H3 == 0);
+ cs.insert(E - V2 - Z2 - D3 - H3 == 0);
+ cs.insert(W - S1 == 0);
+ cs.insert(X - V1 - E2 - W2 == 0);
+ cs.insert(I - V1 - Y1 - B2 == 0);
+ cs.insert(Y - I2 - A3 == 0);
+ cs.insert(J - E2 - I2 - M2 == 0);
+ cs.insert(Z - Y1 - E3 == 0);
+ cs.insert(A1 - B2 - M2 - I3 == 0);
+ cs.insert(K - W2 - A3 - E3 - I3 == 0);
+ cs.insert(B1 == 0);
+ cs.insert(L - N1 - P1 - R1 - T1 == 0);
+ cs.insert(C1 - W1 - F2 - Q2 - X2 == 0);
+ cs.insert(M - W1 - Z1 - C2 == 0);
+ cs.insert(D1 - N1 - J2 - S2 - B3 == 0);
+ cs.insert(N - F2 - J2 - N2 == 0);
+ cs.insert(E1 - P1 - Z1 - U2 - F3 == 0);
+ cs.insert(O - Q2 - S2 - U2 == 0);
+ cs.insert(F1 - R1 - C2 - N2 - J3 == 0);
+ cs.insert(P - X2 - B3 - F3 - J3 == 0);
+ cs.insert(G1 - T1 == 0);
+ cs.insert(H1 - G2 - Y2 == 0);
+ cs.insert(I1 - K2 - C3 == 0);
+ cs.insert(Q - G2 - K2 - O2 == 0);
+ cs.insert(J1 - G3 == 0);
+ cs.insert(K1 - O2 - K3 == 0);
+ cs.insert(R - Y2 - C3 - G3 - K3 == 0);
+ cs.insert(L1 == 0);
+ cs.insert(A >= 0);
+ cs.insert(-A >= -100);
+ cs.insert(B >= 0);
+ cs.insert(-B >= -100);
+ cs.insert(C >= 0);
+ cs.insert(-C >= -90);
+ cs.insert(D >= 0);
+ cs.insert(-D >= -50);
+ cs.insert(E >= 0);
+ cs.insert(-E >= -10);
+ cs.insert(F >= 0);
+ cs.insert(-F >= -200);
+ cs.insert(G >= 0);
+ cs.insert(-G >= -100);
+ cs.insert(H >= 0);
+ cs.insert(I >= 0);
+ cs.insert(-I >= -25);
+ cs.insert(J >= 0);
+ cs.insert(-J >= -10);
+ cs.insert(K >= 0);
+ cs.insert(L >= 0);
+ cs.insert(-L >= -50);
+ cs.insert(M >= 0);
+ cs.insert(-M >= -40);
+ cs.insert(N >= 0);
+ cs.insert(-N >= -20);
+ cs.insert(O >= 0);
+ cs.insert(-O >= -5);
+ cs.insert(P >= 0);
+ cs.insert(Q >= 0);
+ cs.insert(-Q >= -30);
+ cs.insert(R >= 0);
+ cs.insert(S >= 100);
+ cs.insert(T >= 100);
+ cs.insert(U >= 90);
+ cs.insert(V >= 50);
+ cs.insert(W >= 10);
+ cs.insert(X >= 20);
+ cs.insert(Y >= 25);
+ cs.insert(Z >= 10);
+ cs.insert(A1 >= 15);
+ cs.insert(B1 >= 5);
+ cs.insert(C1 >= 50);
+ cs.insert(D1 >= 40);
+ cs.insert(E1 >= 20);
+ cs.insert(F1 >= 5);
+ cs.insert(G1 >= 15);
+ cs.insert(H1 >= 20);
+ cs.insert(I1 >= 25);
+ cs.insert(J1 >= 30);
+ cs.insert(K1 >= 20);
+ cs.insert(L1 >= 10);
+ cs.insert(M1 >= 0);
+ cs.insert(N1 >= 0);
+ cs.insert(O1 >= 0);
+ cs.insert(P1 >= 0);
+ cs.insert(Q1 >= 0);
+ cs.insert(R1 >= 0);
+ cs.insert(S1 >= 0);
+ cs.insert(T1 >= 0);
+ cs.insert(U1 >= 0);
+ cs.insert(V1 >= 0);
+ cs.insert(W1 >= 0);
+ cs.insert(X1 >= 0);
+ cs.insert(Y1 >= 0);
+ cs.insert(Z1 >= 0);
+ cs.insert(A2 >= 0);
+ cs.insert(B2 >= 0);
+ cs.insert(C2 >= 0);
+ cs.insert(D2 >= 0);
+ cs.insert(E2 >= 0);
+ cs.insert(F2 >= 0);
+ cs.insert(G2 >= 0);
+ cs.insert(H2 >= 0);
+ cs.insert(I2 >= 0);
+ cs.insert(J2 >= 0);
+ cs.insert(K2 >= 0);
+ cs.insert(L2 >= 0);
+ cs.insert(M2 >= 0);
+ cs.insert(N2 >= 0);
+ cs.insert(O2 >= 0);
+ cs.insert(P2 >= 0);
+ cs.insert(Q2 >= 0);
+ cs.insert(R2 >= 0);
+ cs.insert(S2 >= 0);
+ cs.insert(T2 >= 0);
+ cs.insert(U2 >= 0);
+ cs.insert(V2 >= 0);
+ cs.insert(W2 >= 0);
+ cs.insert(X2 >= 0);
+ cs.insert(Y2 >= 0);
+ cs.insert(Z2 >= 0);
+ cs.insert(A3 >= 0);
+ cs.insert(B3 >= 0);
+ cs.insert(C3 >= 0);
+ cs.insert(D3 >= 0);
+ cs.insert(E3 >= 0);
+ cs.insert(F3 >= 0);
+ cs.insert(G3 >= 0);
+ cs.insert(H3 >= 0);
+ cs.insert(I3 >= 0);
+ cs.insert(J3 >= 0);
+ cs.insert(K3 >= 0);
+ print_constraints(cs, "*** cs ***");
+
+ TBox box(cs.space_dimension());
+ box.refine_with_constraints(cs);
+
+ bool ok = box.is_empty();
+
+ print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST_F8(test07);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints2.cc b/tests/Box/refinewithconstraints2.cc
new file mode 100644
index 0000000..3e30eda
--- /dev/null
+++ b/tests/Box/refinewithconstraints2.cc
@@ -0,0 +1,447 @@
+/* Test Box::refine_with_constraints(const Constraint_System&) with
+ instances that may require a watchdog timer.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+namespace {
+
+class Timeout : virtual public std::exception,
+ public Parma_Polyhedra_Library::Throwable {
+public:
+ const char* what() const throw() {
+ return "Timeout in refine1.cc";
+ }
+
+ void throw_me() const {
+ throw *this;
+ }
+
+ int priority() const {
+ return 0;
+ }
+
+ Timeout() {
+ }
+
+ ~Timeout() throw() {
+ }
+};
+
+Timeout t;
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= -5);
+ cs.insert(A <= 5);
+ cs.insert(A == B);
+ cs.insert(A == 2*B);
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+ print_constraints(known_result, "*** known_result ***");
+
+ TBox box(2);
+
+ bool ok = false;
+
+ typedef TBox::interval_type::boundary_type boundary_type;
+ if (std::numeric_limits<boundary_type>::is_exact
+ && !std::numeric_limits<boundary_type>::is_integer) {
+ // With interval boundaries made of rational numbers, this
+ // refinement instance does not terminate: we use a watchdog timer.
+ try {
+ // Set a 0.1 seconds timeout.
+ Parma_Polyhedra_Library::Watchdog
+ w(10, abandon_expensive_computations, t);
+
+ box.refine_with_constraints(cs);
+
+ // We should never get here.
+ abandon_expensive_computations = 0;
+ nout << "unexpected termination" << endl;
+ ok = false;
+ }
+ catch (const Timeout&) {
+ abandon_expensive_computations = 0;
+ nout << "timeout, as expected" << endl;
+
+ // The box will have been shrunk, nonetheless.
+ ok = check_result(box, known_result, "1.0e-6", "1.0e-6", "1.0e-6");
+ }
+ catch (...) {
+ abandon_expensive_computations = 0;
+ nout << "unexpected exception" << endl;
+ ok = false;
+ }
+ }
+ else {
+ // With interval boundaries other than rational numbers, this instance
+ // of refinement terminates rather quickly: no timer is necessary.
+ box.refine_with_constraints(cs);
+
+ ok = check_result(box, known_result, "5.61e-45", "2.81e-45", "1.41e-45");
+ }
+
+ print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ std::stringstream ss;
+ ss.str("topology NECESSARILY_CLOSED\n"
+ "175 x 80 (not_sorted)\n"
+ "index_first_pending 175\n"
+ "0 -292733975779082240 -24769797950537728 -3602879701896397 -20266198323167232 -6755399441055744 -27021597764222976 -14861878770322636 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 -18014398509481984 -12249790986447750 0 -4863887597560136 -2161727821137838 -3422735716801577 -1261007895663739 -9007199254740992 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 18014398509481984 17293822569102704 0 17473966554197524 6485183463413514 6305039478318694 5224175567749775 11168927075878830 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 9007199254740992 9007199254740992 7025615418697974 9007199254740992 8556839292003942 8016407336719483 8736983277098762 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 219325301852943168 189151184349560832 197933203622933312 220451201759785792 136459068709326032 213470622337361504 220451201759785792 217298682020626432 4728779608739021 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 449909602774312576 396767127171340672 373348409109014144 451711042625260736 343624651568368832 435047724003989888 451711042625260736 441803123445045632 3152519739159347 -450359962737049600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 94237822202727632 89396452603304352 83992133050459744 106960491150049280 77236733609404000 94350412193411888 106960491150049280 90972712472884016 2589569785738035 -101330991615836160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 5981343255101440 5854679515581645 5671720780719718 6896136929411072 5404319552844595 6108006994621235 6896136929411072 5735052650479616 70368744177664 -6333186975989760 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 -292733975779082240 -24769797950537728 -3602879701896397 -6755399441055744 -12159718993900340 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -10268207150404730 0 -2161727821137838 -2341871806232658 -8286623314361713 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 576460752303423488 576460752303423488 5764607523034235 207525870829232448 161409010644958592 386228704043293760 0 -288230376151711744 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8827055269646172 8556839292003942 7115687411245384 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 13707831365808948 11821949021847552 12370825226433332 8528691794332877 10963450342880052 13581167626289152 492581209243648 -12525636463624192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 224954801387156288 198383563585670336 186674204554507072 171812325784184416 183296504833979200 220901561722522816 4278419646001971 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 188475644405455264 178792905206608704 167984266100919488 154473467218808000 158977066846178496 181945424945768032 7656119366529843 -184647584722190336 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 382805968326492160 374699488997225280 362990129966061952 345876451382054080 333266372425416704 367043369630695424 8106479329266893 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -1688849860263936 -6980579422424269 -6755399441055744 -5066549580791808 -6192449487634432 -7318349394477056 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -12610078956637388 -2341871806232658 -17473966554197524 -2161727821137838 -3422735716801577 -3422735716801577 -4863887597560136 -12249790986447750 -8646911284551352 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 7475975381435023 2522015791327478 9007199254740992 3242591731706757 3152519739159347 3152519739159347 8736983277098762 8646911284551352 5044031582654956 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7115687411245384 9007199254740992 8556839292003942 8016407336719483 8016407336719483 9007199254740992 9007199254740992 8736983277098762 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 136459068709326032 215947602132415296 213470622337361504 220451201759785792 189151184349560832 217298682020626432 4278419646001971 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 921436483760003456 828662331436171264 733186019335916800 807945773150267008 687249303136737664 879102647262720768 870095448007979776 903422085250521472 793534254342681344 874599047635350272 8106479329266893 -900719925474099200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 213470622337361504 174289305579238208 158977066846178496 188250464424086720 154473467218808000 192303704088720192 188700824386823776 213920982300098560 178792905206608704 185097944684927392 5404319552844595 -202661983231672320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 898918485623150976 721476660304753408 666532744850833408 805243613373844736 691752902764108160 790832094566259072 781824895311518080 882705526964617216 749398977994450560 750299697919924608 8106479329266893 -810647932926689280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -6980579422424269 -7318349394477056 -1688849860263936 -6192449487634432 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -36028797018963968 -24499581972895500 -3242591731706757 -33506781227636492 -5404319552844595 -16212958658533786 -4323455642275676 -24499581972895500 0 18014398509481984 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 16212958658533786 6665327448508334 18014398509481984 8106479329266893 11349071060973650 6485183463413514 17293822569102704 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8286623314361713 9007199254740992 8827055269646172 9007199254740992 8556839292003942 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 215947602132415296 217298682020626432 136459068709326032 189151184349560832 8782019273372467 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230359120940000864 207165582859042816 183296504833979200 201986443287566752 219775661815680192 218649761908837568 171812325784184416 198383563585670336 3152519739159347 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6670956948042547 5446540799351194 4968033338943078 5882827013252710 6009490752772506 5784310771403981 4827295850587750 5587278287706522 246290604621824 -5770237022568448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 449459242811575488 360738330152376704 333266372425416704 402621806686922368 395416047283129536 375149848959962304 345876451382054080 374699488997225280 5854679515581645 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -252201579132747776 -8106479329266893 -6305039478318694 -47738156050127256 -11258999068426240 -51791395714760704 -6755399441055744 -18915118434956084 -19365478397693132 0 45035996273704960 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -72057594037927936 0 0 -48999163945791000 0 -55484347409204512 -8646911284551352 -5764607523034235 -5044031582654956 0 36028797018963968 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 0 0 15672526703249326 0 16753390613818246 6485183463413514 5404319552844595 4863887597560136 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 4863887597560136 9007199254740992 5854679515581645 9007199254740992 8556839292003942 8196551321814303 8106479329266893 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223828901480313664 197933203622933312 194105143939668384 224954801387156288 201761263306198208 179018085187977216 136459068709326032 224054081461682176 228332501107684160 3602879701896397 -227431781182210048 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 463870761619161088 412529725867137408 405323966463344640 452161402587997824 412980085829874496 383256328289229184 343624651568368832 449909602774312576 457115362178105344 3602879701896397 -454863562364420096 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6804657561980109 6199486362052198 6192449487634432 5685794529555251 5580241413288755 5643573283048653 4827295850587750 6164301989963366 6262818231812096 140737488355328 -6403555720167424 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 455764282289894208 414331165718085632 411178645978926272 367944089556169536 369745529407117696 388210287879336768 345876451382054080 400820366835974144 406224686388818752 3602879701896397 -409827566090715136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -13735978863480012 -9457559217478042 0 24769797950537728 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -47558012065032440 -5764607523034235 0 72057594037927936 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 5854679515581645 3242591731706757 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 79601123413773520 110113010889208624 3715469692580659 -100205091708993536 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 170911605858710336 219550481834311680 3602879701896397 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 78362633516246624 96151852044360096 4728779608739021 -92323792361095168 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 339121051940998336 388660647842073792 7656119366529843 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "7 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "7 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "31525197391593472 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "21 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "31525197391593472 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -5404319552844595 -4953959590107546 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 >=\n"
+ "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 >=\n"
+ "17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 >=\n"
+ "58546795155816448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 0 0 0 0 0 0 0 0 0 0 -4953959590107546 -5404319552844595 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 >=\n"
+ "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 >=\n"
+ "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 >=\n"
+ "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "-15 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "-15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "-20 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "-20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "-15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+ "1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -9457559217478042 -9682739198846566 0 22517998136852480 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -5764607523034235 -10088063165309912 0 72057594037927936 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 3242591731706757 2431943798780068 0 -4503599627370496 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 8106479329266893 0 -8106479329266893 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 110113010889208624 114166250553842080 3715469692580659 -101330991615836160 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 219550481834311680 228557681089052672 3602879701896397 -202661983231672320 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 96151852044360096 100205091708993536 4728779608739021 -93449692267937792 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 388660647842073792 406224686388818752 7656119366529843 -373798769071751168 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 =\n"
+ "0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 >=\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 >=\n");
+ Constraint_System cs;
+ cs.ascii_load(ss);
+ print_constraints(cs, "*** cs ***");
+
+ Rational_Box known_result(cs.space_dimension());
+ ss.str("+EUP -EM -UN space_dim 79\n"
+ "[0, 10314880348817334512601175099915806371166908797205087714999656461/4472327120746785297653956552193407232008520545204266972149396275]\n"
+ "[0, 13845204640026631030889305159390169337029989311711657705741484032/5852044125547558797457743823140996705204670473363875812631956685]\n"
+ "[0, 6922602320013315515444652579695084668514994655855828852870742016/4472327120746785297653956552193407232008520545204266972149396275]\n"
+ "[0, 1]\n"
+ "[0, 183286621582592395603923918336706397030221465067768516480006942467094251874476342276273313773966732258762031104/201947514318058825266405552296969018502505571136310660027103675348978638253530036293093560899136162654074928785]\n"
+ "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/288082953845409310261586095056492490791362249192985502452443896193756261634064606718440121711088142441174012160]\n"
+ "[2686500548319859668267236271679836106854450377612806461753177278269968849965950567943501971086918159087023381675088683299453183/778446170153986271646293722222758610239588615644139185506718044413398598788584196557239652607927138993387106707838558560137600, 31525197391593472/5404319552844595]\n"
+ "[808260464002815979451978388304660281069312131948424687841199686824624428575770834454261530624/151009237862627616327241484028267709860068350280703545777427164042459931581501950526059886939, 73859033888876134/5404319552844595]\n"
+ "[226618556208645903758643992043214159409275947657289604887186627910330909797925643152677900801504922848811608768/10961195840757945196265067281093921849892738542919421265335678633895419160365563327020735054453549917239687515, 79624855970192365478639383910721447943227661124538323699857998144/1170408825109511759491548764628199341040934094672775162526391337]\n"
+ "[15, 26541618656730788492879794636907149314409220374846107899952666048/1170408825109511759491548764628199341040934094672775162526391337]\n"
+ "[0, 8985486280088112100506563167484159198795208954754480462056795993/1170408825109511759491548764628199341040934094672775162526391337]\n"
+ "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/139580617693730330144431108207543093864914258318465321284436138492151206127797310314742739840929485352303263010]\n"
+ "[0, 303804758953955866721752289291478575769374180673152882292480754701942640399851473710715528744543627330227738410675228287069127359/114636083423731409790347440941157613447471749368242157860749224890585062371407435860707842957895607705984937192636439527142281664]\n"
+ "[0, 7]\n"
+ "[0, 7]\n"
+ "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/386268417790710553084111681668112997768232491914126126127983236005267549264797679992985537041321412971263426560]\n"
+ "[0, 3]\n"
+ "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+ "[25839794736957542736653447787390098039029695261748271831543709793310100059819748166779436608293786761483582251489687769847889922549/3692318603621377070171731880846638790832352647482537903463700684578188218693428418242417440634684128553797348741645618454197176800, 60]\n"
+ "[15, 20]\n"
+ "[0, 72409676610081820024337606323284033316057667404425726484298112/61528739464365799250640879039394801804157129845741815314149415]\n"
+ "[0, 215364736487606238026344927308510412614242449964/134794645266934963747177709084220527189140255405]\n"
+ "[0, 2061072662362948098854568832072986384021826066051896235110957056/3670355764874540374735204645644094629677039803631891367408505105]\n"
+ "[0, 515268165590737024713642208018246596005456516512974058777739264/430701176250560594754486153275763612629099908920192707199045905]\n"
+ "[0, 3661200520289306046447863764244677014442121649388/8769571208077881580806264580025357648475702951979]\n"
+ "[0, 31525197391593472/5404319552844595]\n"
+ "[0, 15762598695796736/2476979795053773]\n"
+ "[0, 1]\n"
+ "[0, 915300130072326511611965941061169253610530412347/914192110113563926269710132379456852481344786795]\n"
+ "[100569907736012592200176731907593393653603286897200373375948598819289159112952295415766216387512943/146346253870074105858602763694412510197753270126660267092506527819743231998370774150586226021951840, 1423138307257267058304665020078992042801252847756788883057586059/184586218393097397751922637118184405412471389537225445942448245]\n"
+ "[14869667571313552605650378924578127204258391821680034719538033247871471932211925243936500890280188256699229259926555073134812416/718752927277209687656244167506910570008434195163317640707227921525181116141905353375202615336471652237552905414680120645944371, 21857749969521291174186682493347326296602048361498167335484176256/430701176250560594754486153275763612629099908920192707199045905]\n"
+ "[8570646096554564291866668301938830916818802465337146975839074062/1170408825109511759491548764628199341040934094672775162526391337, 21857749969521291174186682493347326296602048361498167335484176256/1292103528751681784263458459827290837887299726760578121597137715]\n"
+ "[0, 8797647701304867238000079012369780913937948508972739599385139620161632864004094691936722362939144743295396038778/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445]\n"
+ "[0, 2669624945007775364069874412248427045229215715349940210565159012362111738459851082209412940870318845779551526695718690690481550044170778794259142059204115616411333581967780864779/1708360668329758714025236540492916320511806002258624502201417631387139555375059087959692708852788041301919137087636450154229857124447755653498823376904941199764632073673925197824]\n"
+ "[0, 3]\n"
+ "[0, 3]\n"
+ "[0, 3]\n"
+ "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1157782275275578837083828258845188344809959076054449796563020342561686251725343246520483048742598889585601640032]\n"
+ "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+ "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1052529341159617039636766879026295001378528414597855069798212223052291123121300381836309227297285312255918866432]\n"
+ "[0, 7]\n"
+ "[0, 1498223798318303919831024844733424211709929066732763569681630325246353050135890887826963426113547608433634486015043774792176591439896471154476282777/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+ "[0, 499407932772767973277008281577808070569976355577587856560543441748784350045296962608987808704515869477878162005014591597392197146632157051492094259/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+ "[0, 5]\n"
+ "[1088990638376279656349232564077841878585326883393145232156543106725860769701036461875975422248087277562164759965636299994676381419779389192434465452555574437/2258962538374806529068089961097446198274435865824587927247946112063701506797953147532001062632455227539779726419333176316008587778726957833593452101170626560, 7771524006488802993376382138936142531043834044589401854804790150420533543300059/4977137688523269900666388869765991278013084676989364557386155543450133944795744]\n"
+ "[0, 3/2]\n"
+ "[0, 3/2]\n"
+ "[1344731246397095180937221057427674208422663814958361282355618977488441268849128875802333363211497752676459590600393921949694634262748267846174416688274480521783/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400, 2926486520230784671697951406927216601955418993295/524827521561835640889301183905776373669342216192]\n"
+ "[0, 8098698173131643610422973994024390152024259063050436511914034781041627844575232/7928431521824465019198574989109348959534008394399277106209182654398428320014455]\n"
+ "[255625743144916938376557465993431512631549899985942527668219134605026453252022742017194652158692271084961998287730522703741817071443625417096646865856016016637/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880, 7170392166438080056989470254311656820039851912472813793909407744/2245971024645116171876361734571755974833113225752842920420057075]\n"
+ "[0, 226537011835850170920922349483199724532147106658753468864728245623542037610496/295286773686929687042241100901562780978972101417629942418684891714427504870407]\n"
+ "[0, 29273397577908224/2476979795053773]\n"
+ "[0, 58546795155816448/5404319552844595]\n"
+ "[4886121758410660121399898393468498287761348147836794297860689782559815498292668383511688347221116029983439921364194244223876464951616007309127944670355058347958525880280511104/161787872311589039754537174148841335581508847196926049073414475652896143384975252871620319949599560382345933056706166004377459069700243126385807323566214512647413320655096595, 60]\n"
+ "[19185326995483886226743054182167824240505411823442442486905223117672031508425218509427406136271309766838909450122/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445, 20]\n"
+ "[0, 538537423212680385284373989330528551512140313847671962569697057921440092965209437981361342634620164343644389826716557499329872961929701779022177574622920411231181548734688467653205269453086868420694127457409/216325670355300629343398793111970587004244916598977668851214602484751463124754806790692265920288849668696149072929310323627620010574599881816934452674152407689569704749716632512928181545672403224920682659840]\n"
+ "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+ "[0, 10]\n"
+ "[0, 3/2]\n"
+ "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+ "[0, 3/2]\n"
+ "[0, 1]\n"
+ "[0, 1]\n"
+ "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+ "[0, 60]\n"
+ "[103329071798316531709026909095463703501013053247478398826357779304145021771658399939262244128683394924564952448387225814185493208137888063349687824244782667478861/79269283303952994524846315029296066792799612173049976075893590468760030484709218718674284127122889338165671718089949371224177700480858989945121469063628471664640, 20]\n"
+ "[0, 5]\n"
+ "[0, 20]\n"
+ "[0, +inf)\n"
+ "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+ "[0, 10]\n"
+ "[0, 3/2]\n"
+ "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+ "[0, 3/2]\n"
+ "[0, 1]\n"
+ "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+ "[0, 1003103763243376167245512594359025257770014950875504345033902074396910083882314058185398284512045164951362760936893974115283272767360056962850416964870352278253577436743144371/205027069450169761565873382712224453082020642139182002012346602023286123956967691684038960374515291662700700381411197137724083103996816374687476082968091232453611203577584512]\n"
+ "[0, +inf)\n"
+ "[0, +inf)\n");
+ known_result.ascii_load(ss);
+ print_constraints(known_result, "*** known_result ***");
+
+ TBox box(cs.space_dimension());
+
+ bool ok = false;
+
+ typedef TBox::interval_type::boundary_type boundary_type;
+ if (std::numeric_limits<boundary_type>::is_exact
+ && !std::numeric_limits<boundary_type>::is_integer) {
+ // With interval boundaries made of rational numbers, this
+ // refinement instance either does not terminate or terminates
+ // very slowly: we use a watchdog timer.
+ try {
+ // Set a 0.5 seconds timeout.
+ Parma_Polyhedra_Library::Watchdog
+ w(50, abandon_expensive_computations, t);
+
+ box.refine_with_constraints(cs);
+
+ // We should never get here.
+ abandon_expensive_computations = 0;
+ nout << "unexpected termination" << endl;
+ ok = false;
+ }
+ catch (const Timeout&) {
+ abandon_expensive_computations = 0;
+ nout << "timeout, as expected" << endl;
+
+ // The box will have been shrunk, but no bounds on the distances
+ // can be set: we check containment though.
+ ok = check_result(box, known_result, "+inf", "+inf", "+inf");
+ }
+ catch (...) {
+ abandon_expensive_computations = 0;
+ nout << "unexpected exception" << endl;
+ ok = false;
+ }
+ }
+ else {
+ // With interval boundaries other than rational numbers, this instance
+ // of refinement terminates: no timer is necessary.
+ box.refine_with_constraints(cs);
+
+ ok = check_result(box, known_result, "624", "158", "121");
+ }
+
+ print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+// Temporarily set to always fail: this is meant to be a test for
+// constraint propagation, rather than syntactical refinement.
+// DO_TEST(test01);
+ DO_TEST_F(test01);
+ // Temporarily always failing.
+ // (Wait for ascii_dump/load to stabilize before correct/restore test.)
+ // DO_TEST_F32(test02);
+ DO_TEST_F(test02);
+END_MAIN
diff --git a/tests/Box/relations1.cc b/tests/Box/relations1.cc
new file mode 100644
index 0000000..af5a5a2
--- /dev/null
+++ b/tests/Box/relations1.cc
@@ -0,0 +1,465 @@
+/* Test Box::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBox box(2, EMPTY);
+
+ Poly_Con_Relation rel = box.relation_with(A >= 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ // Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(y <= -1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ // Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(y <= 1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ // Variable x(0);
+ // Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(z >= 1);
+
+ Constraint c(z >= 0);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable x(0);
+ // Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x == 1);
+
+ Constraint c(x >= 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(x == 1);
+ box.add_constraint(y <= 0);
+ box.add_constraint(z >= 2);
+
+ Constraint c(x == 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(x >= 3);
+ box.add_constraint(y <= 0);
+ box.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(x <= 3);
+ box.add_constraint(y <= 0);
+ box.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(x <= 3);
+ box.add_constraint(y <= 0);
+ box.add_constraint(z >= 2);
+
+ Constraint c(-x >= 2);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ // The zero-dim universe box.
+ TBox box(0);
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ // The zero-dim universe box.
+ TBox box(0);
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ // The zero-dim universe box.
+ TBox box;
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable x(0);
+ // Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x == 1);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(x == 1);
+ box.add_constraint(y <= 0);
+ box.add_constraint(z >= 2);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ print_constraint(c, "*** c ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x == 0);
+ box.add_constraint(y >= 1);
+
+ Poly_Con_Relation rel = box.relation_with(-y >= -1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(-y >= -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = box.relation_with(y > 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(y > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box(3);
+ box.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = box.relation_with(-y >= -4);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_constraint(A <= 0);
+ box.add_constraint(A >= -2);
+
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= -1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 >= -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ // We verify that a generator is not subsumed by an empty box.
+ Variable x(0);
+
+ TBox box(2, EMPTY);
+
+ Generator g = point(x);
+ Poly_Gen_Relation rel = box.relation_with(g);
+
+ print_constraints(box, "*** box ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(v(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ // We verify that a zero-dimensional generator is subsumed
+ // by a zero-dimensional, universal box.
+ TBox box;
+
+ Generator g = point();
+ Poly_Gen_Relation rel = box.relation_with(g);
+
+ print_constraints(box, "*** box ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations2.cc b/tests/Box/relations2.cc
new file mode 100644
index 0000000..bd1833d
--- /dev/null
+++ b/tests/Box/relations2.cc
@@ -0,0 +1,442 @@
+/* Test Box::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // The zero-dim universe BDS.
+ TBox box(0);
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ // The zero-dim universe box.
+ TBox box(0);
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ // The zero-dim universe box.
+ TBox box(0);
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ // An empty box.
+ TBox box(1);
+ box.add_constraint(Linear_Expression(0) >= 1);
+
+ Variable A(0);
+
+ Poly_Con_Relation rel = box.relation_with(A > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A > 0) = " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A == 3);
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A > 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A <= 3);
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A > 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A <= 1);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A - B > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+ cs.insert(B <= -1);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(B > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(B - A > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+
+ TBox box(1);
+ box.add_constraint(A >= 0);
+
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 2);
+
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B >= 2);
+ box.add_constraint(C <= 1);
+
+ Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) == 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(1 == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel1 = box.relation_with(point(B));
+ Poly_Gen_Relation rel2 = box.relation_with(point(-B));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(point(B)) == " << rel1 << endl;
+ nout << "box.relation_with(point(-B)) == " << rel2 << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = box.relation_with(ray(-A));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(ray(-A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = box.relation_with(line(A));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = box.relation_with(closure_point(A));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(closure_point(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 2);
+ box.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = box.relation_with(ray(A + B));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(ray(A + B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ // The system of constraints of the box contains only
+ // an equality and the generator `g' is a point.
+ Variable A(0);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+
+ Poly_Gen_Relation rel = box.relation_with(point(2*A));
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(point(2*A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ // The relation is on a variable (B) other than the first.
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(B >= 0);
+
+ Poly_Con_Relation rel = box.relation_with(B > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(B > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations3.cc b/tests/Box/relations3.cc
new file mode 100644
index 0000000..4a20c8a
--- /dev/null
+++ b/tests/Box/relations3.cc
@@ -0,0 +1,402 @@
+/* Test Box::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A == 3);
+ TBox box(2);
+ box.add_constraints(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B > 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A <= 3);
+ TBox box(2);
+ box.add_constraints(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B >= 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B >= 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B == 2);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B == 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B == 7);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B == 7) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B == -1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B == -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A < 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B == 6);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B == 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B >= 6);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B >= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 3);
+ cs.insert(B == 3);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result
+ = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + 2*B > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + 2*B > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A > 1);
+ cs.insert(B > 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B > 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B <= -1);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(2*B - 3*A > 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(2*B - 3*A > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 1);
+
+ Poly_Con_Relation rel = box.relation_with(A - C - B <= 2);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A - C - B <= 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(1);
+ box.add_constraint(A >= 1);
+
+ Poly_Con_Relation rel = box.relation_with(A == 2);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A == 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(B >= 1);
+
+ Constraint c(A == 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "--- oc ---");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 4);
+ box.add_constraint(B >= 1);
+ box.add_constraint(B <= 4);
+
+ Constraint c(A == 1);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "--- oc ---");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/relations4.cc b/tests/Box/relations4.cc
new file mode 100644
index 0000000..342d2f3
--- /dev/null
+++ b/tests/Box/relations4.cc
@@ -0,0 +1,487 @@
+/* Test Box::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A == 3);
+ TBox box(2);
+ box.add_constraints(cs);
+
+ Poly_Con_Relation rel = box.relation_with(A + B %= 3);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + B %= 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 2) / 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= -7) / 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 7 / 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A < 3);
+ cs.insert(A >= 0);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 6) / 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 6 / 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 3);
+ cs.insert(B <= 3);
+ cs.insert(B >= 3);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 6);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 0) / 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result
+ = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+
+ TBox box(0);
+
+ Poly_Con_Relation rel = box.relation_with((Linear_Expression(1) %= 0) / 2);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((Linear_Expression(1) %= 0) / 2) == "
+ << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2, EMPTY);
+
+ Poly_Con_Relation rel = box.relation_with(A - 2*B %= 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(A + 2*B %= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A > 0);
+ cs.insert(3*A < 1);
+ cs.insert(B < 1);
+ cs.insert(2*B > 1);
+
+ TBox box(cs);
+
+ Poly_Con_Relation rel = box.relation_with(2*B - 3*A %= 1);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(2*B - 3*A %= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ // The zero-dim universe box.
+ TBox box(0);
+
+ Congruence c(Linear_Expression(0) == 0);
+ Poly_Con_Relation rel = box.relation_with(c);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 %= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result
+ = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 1);
+ box.add_constraint(B == 0);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 2);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 1);
+ box.add_constraint(A <= 2);
+ box.add_constraint(B >= 1);
+ box.add_constraint(B <= 2);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 5);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A >= 4);
+ box.add_constraint(A <= 7);
+ box.add_constraint(B == 0);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 5);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 2) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 6);
+ box.add_constraint(B == 0);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 5);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result
+ = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 6);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 3);
+
+ Poly_Con_Relation rel = box.relation_with((A - 2*B %= -9) / 8);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 6);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 3);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 4) / 5);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(A == 6);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 3);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 24) / 5);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(3*A >= 1);
+ box.add_constraint(7*A <= 20);
+ box.add_constraint(11*B >= 5);
+ box.add_constraint(B <= 3);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 9) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box(3);
+ box.add_constraint(3*A >= 1);
+ box.add_constraint(7*A <= 20);
+ box.add_constraint(11*B >= 5);
+ box.add_constraint(B <= 3);
+
+ Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 10);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(1);
+ box.add_constraint(A >= 1);
+
+ try {
+ // This tests the space dimension exception..
+ Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+ (void) rel;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test20() {
+ // The zero-dim empty box.
+ TBox box(0, EMPTY);
+ Poly_Con_Relation rel = box.relation_with((Linear_Expression(0) %= 1) / 0);
+
+ print_constraints(box, "*** box ***");
+ using namespace IO_Operators;
+ nout << "box.relation_with(0 %= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result
+ = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/removespacedims1.cc b/tests/Box/removespacedims1.cc
new file mode 100644
index 0000000..4ebc992
--- /dev/null
+++ b/tests/Box/removespacedims1.cc
@@ -0,0 +1,356 @@
+/* Remove some variables from the space.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+
+ TBox box(6);
+ box.add_constraint(x3 <= 2);
+ box.add_constraint(x5 <= 3);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x5);
+
+ box.remove_space_dimensions(to_be_removed);
+
+ Rational_Box known_result(4);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_space_dimensions({x3, x5}) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ Variable x7(6);
+ Variable x8(7);
+
+ TBox box(8);
+ box.add_constraint(x1 <= 2);
+ box.add_constraint(x5 <= 7);
+ box.add_constraint(x2 <= 10);
+
+ print_constraints(box, "*** box ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x1);
+ to_be_removed.insert(x2);
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x4);
+ to_be_removed.insert(x5);
+ to_be_removed.insert(x6);
+ to_be_removed.insert(x7);
+ to_be_removed.insert(x8);
+
+ box.remove_space_dimensions(to_be_removed);
+
+ Rational_Box known_result(0);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.remove_space_dimensions"
+ "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBox box(4);
+ box.add_constraint(x2 >= 5);
+ box.add_constraint(x4 >= 3);
+ box.add_constraint(x4 <= 0);
+
+ print_constraints(box, "*** box ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x1);
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x4);
+
+ box.remove_space_dimensions(to_be_removed);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box,
+ "*** box.remove_space_dimensions({x1, x3, x4}) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBox box(2);
+ box.add_constraint(x1 <= 2);
+ box.add_constraint(x2 <= 10);
+
+ print_constraints(box, "*** box ***");
+
+ box.remove_higher_space_dimensions(0);
+
+ Rational_Box known_result(0, UNIVERSE);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBox box(4);
+ box.add_constraint(x2 >= 5);
+ box.add_constraint(x2 <= 0);
+ box.add_constraint(x4 >= 3);
+
+ print_constraints(box, "*** box ***");
+
+ box.remove_higher_space_dimensions(1);
+
+ Rational_Box known_result(1, EMPTY);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_higher_space_dimensions(1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ TBox box(5);
+ box.add_constraint(x2 >= 5);
+ box.add_constraint(x4 >= 3);
+
+ print_constraints(box, "*** box ***");
+
+ box.remove_higher_space_dimensions(3);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x2 >= 5);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TBox box(3);
+ box.add_constraint(x2 >= 5);
+
+ print_constraints(box, "*** box ***");
+
+ Rational_Box known_result(box);
+
+ box.remove_higher_space_dimensions(3);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TBox box(5);
+
+ try {
+ // This is an invalid use of the method
+ // Box::remove_higher_dimensions(n): it is illegal to erase
+ // a variable that is not in the space of the polyhedron.
+ box.remove_higher_space_dimensions(7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x <= 3);
+ cs.insert(y - 0*z <= 2);
+ TBox box(cs);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(z);
+
+ box.remove_space_dimensions(to_be_removed);
+
+ try {
+ to_be_removed.insert(x);
+ // This is an incorrect use use of method
+ // Box::remove_dimensions(to_be_remove).
+ // Here the set `to_be_removed' still contains variable `z'.
+ // This variable is now beyond the space dimension,
+ // so that a dimension-incompatibility exception is obtained.
+ box.remove_space_dimensions(to_be_removed);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ Constraint_System cs;
+ cs.insert(x2 >= 6);
+ cs.insert(x4 >= 4);
+ cs.insert(x5 == 3);
+ TBox box(cs);
+
+ print_constraints(box, "*** box ***");
+
+ cs = box.minimized_constraints();
+ box.remove_higher_space_dimensions(3);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x2 >= 6);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+
+ Constraint_System cs;
+ cs.insert(x2 >= 6);
+ cs.insert(x4 >= 4);
+ cs.insert(x5 == 3);
+ TBox box(cs);
+
+ print_constraints(box, "*** box ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x4);
+ to_be_removed.insert(x5);
+
+ cs = box.minimized_constraints();
+ box.remove_space_dimensions(to_be_removed);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x2 >= 6);
+
+ bool ok = check_result(box, known_result);
+
+ print_constraints(box, "*** box.remove_space_dimensions({x4, x5}) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Box/run_tests b/tests/Box/run_tests
new file mode 100755
index 0000000..6a9c2b4
--- /dev/null
+++ b/tests/Box/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the Box tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+ MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+ echo "**************************** " $instance " ****************************"
+ eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+ [ -f dirty_marker ] && $MAKE clean
+ touch dirty_marker
+ $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBOX_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+ $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Box/simplifyusingcontext1.cc b/tests/Box/simplifyusingcontext1.cc
new file mode 100644
index 0000000..83a2e53
--- /dev/null
+++ b/tests/Box/simplifyusingcontext1.cc
@@ -0,0 +1,306 @@
+/* Test Box::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 2);
+ box1.add_constraint(y >= 0);
+ box1.add_constraint(y <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(box1);
+ box2.affine_image(x, x + 6);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(2);
+ known_result.add_constraint(x <= 2);
+
+ bool ok = !box1.simplify_using_context_assign(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1,
+ "*** box1.simplify_using_context_assign(box2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 2);
+ box1.add_constraint(y >= 0);
+ box1.add_constraint(y <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(box1);
+ box2.affine_image(x, x + 1);
+ box2.affine_image(y, y + 6);
+
+ print_constraints(box2, "*** box2 ***");
+
+ // NOTE: this is the result computed when using the current heuristics.
+ // It turns out that the current heuristics is not smart enough to see
+ // that constraint y <= 2 is not really needed.
+ TBox known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = !box1.simplify_using_context_assign(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1,
+ "*** box1.simplify_using_context_assign(box2) ***");
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ TBox box1(1);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 6);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(1);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x <= 5);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox computed_result = box1;
+
+ computed_result.simplify_using_context_assign(box2);
+
+ TBox known_result(1);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result,
+ "*** box1.simplify_using_context_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBox box1 = TBox(3, UNIVERSE);
+ box1.add_constraint(i >= 1);
+ box1.add_constraint(i <= 10);
+ box1.add_constraint(j >= 1);
+ box1.add_constraint(j <= 10);
+ box1.add_constraint(k == 0);
+
+ TBox box2 = TBox(3, UNIVERSE);
+ box2.add_constraint(i >= 0);
+ box2.add_constraint(i <= 2);
+ box2.add_constraint(j >= 2);
+ box2.add_constraint(j <= 9);
+ box2.add_constraint(k == 0);
+
+ print_constraints(box1, "=== box1 ===");
+ print_constraints(box2, "=== box2 ===");
+
+ TBox known_result = TBox(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+
+ box1.simplify_using_context_assign(box2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1, "=== box1.simplify_using_context_assign(box2) ===");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBox box1(3, UNIVERSE);
+ box1.add_constraint(i == 1);
+ box1.add_constraint(j + 1 == 0);
+ box1.add_constraint(k == 3);
+
+ TBox box2(3, UNIVERSE);
+ box2.add_constraint(i == 1);
+ box2.add_constraint(k >= 0);
+ box2.add_constraint(k <= 3);
+
+ TBox known_result(3, UNIVERSE);
+ known_result.add_constraint(k >= 3);
+ known_result.add_constraint(j + 1 == 0);
+
+ box1.simplify_using_context_assign(box2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1.minimized_constraints(),
+ "=== box1.simplify_using_context_assign(box2) ===");
+ print_constraints(known_result.minimized_constraints(),
+ "=== known_result ===");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBox box1(3, UNIVERSE);
+ box1.add_constraint(A == 0);
+ box1.add_constraint(B >= 2);
+ box1.add_constraint(C >= 2);
+ print_constraints(box1, "\n=== box1 ===");
+
+ TBox box2(3, UNIVERSE);
+ box2.add_constraint(A == 0);
+ box2.add_constraint(C >= 2);
+ print_constraints(box2, "\n=== box2 ===");
+
+ box1.simplify_using_context_assign(box2);
+
+ TBox known_result(3, UNIVERSE);
+ known_result.add_constraint(B >= 2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1, "\n=== box1.simplify_using_context_assign(box2) ===");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBox box1(0, EMPTY);
+ TBox box2;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result = box1;
+
+ box1.simplify_using_context_assign(box2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1,
+ "*** box1.simplify_using_context_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ TBox box1(1);
+ TBox box2(1);
+
+ box2.add_constraint(A == 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result = box1;
+
+ box1.simplify_using_context_assign(box2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1,
+ "*** box1.simplify_using_context_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TBox box1(3, UNIVERSE);
+ box1.add_constraint(i >= 1);
+ box1.add_constraint(i <= 10);
+ box1.add_constraint(j >= 1);
+ box1.add_constraint(j <= 10);
+ box1.add_constraint(k == 0);
+
+ TBox box2(3, UNIVERSE);
+ box2.add_constraint(i <= 25);
+ box2.add_constraint(j <= 25);
+ box2.add_constraint(k == 0);
+
+ TBox known_result(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+ known_result.add_constraint(i <= 10);
+ known_result.add_constraint(j >= 1);
+ known_result.add_constraint(j <= 10);
+
+ box1.simplify_using_context_assign(box2);
+
+ bool ok = (box1 == known_result);
+
+ print_constraints(box1);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F(test01);
+ DO_TEST_F(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/timeelapse1.cc b/tests/Box/timeelapse1.cc
new file mode 100644
index 0000000..06af25c
--- /dev/null
+++ b/tests/Box/timeelapse1.cc
@@ -0,0 +1,207 @@
+/* Test Box<Interval>::time_elapse_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox box1(2, EMPTY);
+ TBox box2(2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.time_elapse_assign(box2);
+
+ TBox box3(2);
+ TBox box4(2, EMPTY);
+
+ print_constraints(box3, "*** box3 ***");
+ print_constraints(box4, "*** box4 ***");
+
+ box3.time_elapse_assign(box4);
+
+ bool ok = (box1.is_empty() && box3.is_empty());
+
+ print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+ print_constraints(box3, "*** box3_time_elapse_assign(box4) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(y >= 0);
+
+ TBox box2(2);
+ box2.add_constraint(x >= 2);
+ box2.add_constraint(x <= 4);
+ box2.add_constraint(y == 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.time_elapse_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 0);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x >= 1);
+ box1.add_constraint(x <= 3);
+ box1.add_constraint(y >= 1);
+ box1.add_constraint(y <= 3);
+
+ TBox box2(2);
+ box2.add_constraint(y == 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.time_elapse_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 3);
+ box1.add_constraint(y <= 5);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 2);
+ box2.add_constraint(y <= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.time_elapse_assign(box2);
+
+ Rational_Box known_result(3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 2);
+ box1.add_constraint(x >= 1);
+ box1.add_constraint(y <= 5);
+ box1.add_constraint(y >= 10);
+ box1.add_constraint(z >= 1);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 9);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(y <= 3);
+ box2.add_constraint(y >= -1);
+ box2.add_constraint(z >= 2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.time_elapse_assign(box2);
+
+ Rational_Box known_result(3, EMPTY);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.time_elapse_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+
+ TBox box1(1);
+ box1.add_constraint(x == 1);
+
+ TBox box2(2);
+
+ try {
+ // This is an invalid use of the method Box::time_elapse_assign(box2):
+ // it is illegal to apply the method to two boxes that are not
+ // dimension-compatible.
+ box1.time_elapse_assign(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/topclosed1.cc b/tests/Box/topclosed1.cc
new file mode 100644
index 0000000..9a32cb8
--- /dev/null
+++ b/tests/Box/topclosed1.cc
@@ -0,0 +1,206 @@
+/* Test Box::is_topologically_closed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+/* unbounded 2-dimensional box */
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(3);
+
+ box.add_constraint(x <= 2);
+ box.add_constraint(y <= 2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* bounded 5-dimensional box */
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+
+ box.add_constraint(A <= 5);
+ box.add_constraint(A >= 3);
+ box.add_constraint(B == 0);
+ box.add_constraint(C <= 2);
+ box.add_constraint(C >= 1);
+ box.add_constraint(D == -7);
+ box.add_constraint(E == 1);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 0-dimensional universe box */
+bool
+test03() {
+ TBox box(0);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A <= 3);
+ box.add_constraint(B <= -5);
+ box.add_constraint(A >= 3);
+ box.add_constraint(B > -5);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test05() {
+ TBox box(2, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 2-dimensional universe box */
+bool
+test06() {
+ TBox box(2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 4-dimensional topologically open box */
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TBox box(4);
+ box.add_constraint(A < 1);
+ box.add_constraint(B <= 7);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = !box.is_topologically_closed();
+
+ return ok;
+}
+
+/* 0-dimensional empty box */
+bool
+test08() {
+
+ TBox box(0, EMPTY);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(A == 0);
+ box.add_constraint(B == 2);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(7);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B == 2);
+ box.add_constraint(A >= 6);
+
+ print_constraints(box, "*** box ***");
+
+ bool ok = box.is_topologically_closed();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/unconstrain1.cc b/tests/Box/unconstrain1.cc
new file mode 100644
index 0000000..00ac3ca
--- /dev/null
+++ b/tests/Box/unconstrain1.cc
@@ -0,0 +1,248 @@
+/* Test Box::unconstrain().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2, EMPTY);
+ print_constraints(box, "*** box ***");
+
+ box.unconstrain(A);
+
+ TBox known_result(2, EMPTY);
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2, EMPTY);
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vs(A, B);
+ box.unconstrain(vs);
+
+ TBox known_result(2, EMPTY);
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= 0);
+ print_constraints(box, "*** box ***");
+
+ box.unconstrain(B);
+
+ TBox known_result(2);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.add_constraint(B >= 0);
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vs(B);
+ box.unconstrain(vs);
+
+ TBox known_result(2);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBox box(0, EMPTY);
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vs;
+ box.unconstrain(vs);
+
+ TBox known_result(0, EMPTY);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TBox box(0);
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vs;
+ box.unconstrain(vs);
+
+ TBox known_result(0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ try {
+ TBox box(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ box.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ TBox box(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ Variables_Set vs(Variable(0), Variable(3));
+ box.unconstrain(vs);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBox box(5);
+ box.add_constraint(A == 9);
+ box.add_constraint(E >= 0);
+ box.add_constraint(9 >= D + 2);
+ box.add_constraint(C <= 7);
+ box.add_constraint(0 <= B);
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vs(A, B);
+ vs.insert(D);
+ box.unconstrain(vs);
+
+ TBox known_result(5);
+ known_result.add_constraint(C <= 7);
+ known_result.add_constraint(E >= 0);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ try {
+ TBox box(128);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ box.unconstrain(Variable(128));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/universe1.cc b/tests/Box/universe1.cc
new file mode 100644
index 0000000..e169b3f
--- /dev/null
+++ b/tests/Box/universe1.cc
@@ -0,0 +1,87 @@
+/* Test Box::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(4);
+ box.add_constraint(-x <= 4);
+
+ bool universe = box.is_universe();
+
+ nout << "*** box.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+bool
+test02() {
+ TBox box(4);
+
+ bool universe = box.is_universe();
+
+ nout << "*** box.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test03() {
+ TBox box(0);
+
+ bool universe = box.is_universe();
+
+ nout << "*** box.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test04() {
+ TBox box(20, EMPTY);
+
+ bool universe = box.is_universe();
+
+ nout << "*** box.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/upperbound1.cc b/tests/Box/upperbound1.cc
new file mode 100644
index 0000000..f46b881
--- /dev/null
+++ b/tests/Box/upperbound1.cc
@@ -0,0 +1,251 @@
+/* Test Box::upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBox box1(5);
+ box1.add_constraint(x1 <= 5);
+ box1.add_constraint(x2 <= -1);
+
+ TBox box2(5);
+ box2.add_constraint(x1 <= 2);
+ box2.add_constraint(x4 <= 7);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.upper_bound_assign(box2);
+
+ Rational_Box known_result(5);
+ known_result.add_constraint(x1 <= 5);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(-x <= -1);
+ box1.add_constraint(y <= 3);
+ box1.add_constraint(-y <= -1);
+
+ TBox box2(3);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(-y <= 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.upper_bound_assign(box2);
+
+ Rational_Box known_result(3);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(y >= -5);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(-x <= -1);
+ box1.add_constraint(y <= 3);
+ box1.add_constraint(-y <= -1);
+
+ TBox box2(2);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(x >= 5);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ Rational_Box known_result(box1);
+
+ box1.upper_bound_assign(box2);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2);
+ box1.add_constraint(A <= 4);
+ box1.add_constraint(A >= 1);
+ box1.add_constraint(B <= 3);
+ box1.add_constraint(-B <= -1);
+
+ TBox box2(2);
+ box2.add_constraint(A <= 8);
+ box2.add_constraint(-B <= 5);
+ box2.add_constraint(B <= 0);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.upper_bound_assign(box2);
+
+ Rational_Box known_result(2);
+ known_result.add_constraint(A <= 8);
+ known_result.add_constraint(B >= -5);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBox box1(12);
+ TBox box2(5);
+
+ try {
+ // This is an incorrect use of method
+ // Box::upper_bound_assign(box2): it is impossible to apply
+ // this method to two polyhedra of different dimensions.
+ box1.upper_bound_assign(box2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ TBox box1(1);
+ box1.add_constraint(A <= 0);
+ box1.add_constraint(A >= 1);
+
+ TBox box2(1);
+ box2.add_constraint(A <= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.upper_bound_assign(box2);
+
+ Rational_Box known_result(1);
+ known_result.add_constraint(A <= 3);
+
+ bool ok = check_result(box1, known_result) ;
+
+ print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x1(0);
+
+ TBox box1(1);
+ box1.add_constraint(x1 <= 5);
+
+ TBox box2(1);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ box1.upper_bound_assign(box2);
+
+ return true;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(A == 0);
+ box1.add_constraint(B == 1);
+
+ TBox box2(box1);
+ box1.affine_image(B, Linear_Expression(4));
+
+ box2.add_constraint(A > 1);
+ box1.upper_bound_assign(box2);
+
+ TBox known_result(2, UNIVERSE);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 4);
+
+ bool ok = check_result(box1, known_result);
+
+ print_constraints(box1, "=== box1 ===");
+ print_constraints(box2, "=== known_result ===");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/upperboundifexact1.cc b/tests/Box/upperboundifexact1.cc
new file mode 100644
index 0000000..0022fd3
--- /dev/null
+++ b/tests/Box/upperboundifexact1.cc
@@ -0,0 +1,311 @@
+/* Test BD_Shape::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBox box_empty(0, EMPTY);
+ TBox box_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ TBox box;
+
+ // empty, empty
+ box = box_empty;
+ ok &= box.upper_bound_assign_if_exact(box_empty);
+ ok &= (box == box_empty);
+ print_constraints(box, "*** empty union empty ***");
+
+ // empty, universe
+ box = box_empty;
+ ok &= box.upper_bound_assign_if_exact(box_universe);
+ ok &= (box == box_universe);
+ print_constraints(box, "*** empty union universe ***");
+
+ // universe, empty
+ box = box_universe;
+ ok &= box.upper_bound_assign_if_exact(box_empty);
+ ok &= (box == box_universe);
+ print_constraints(box, "*** universe union empty ***");
+
+ // universe, universe
+ box = box_universe;
+ ok &= box.upper_bound_assign_if_exact(box_universe);
+ ok &= (box == box_universe);
+ print_constraints(box, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x >= -2);
+ box1.add_constraint(x <= -1);
+ box1.add_constraint(y >= 0);
+ box1.add_constraint(y <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 1);
+ box2.add_constraint(x <= 2);
+ box2.add_constraint(y >= 0);
+ box2.add_constraint(y <= 2);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box1);
+
+ bool ok = !box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x >= -2);
+ box1.add_constraint(x <= 0);
+ box1.add_constraint(y >= 0);
+ box1.add_constraint(y <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x <= 2);
+ box2.add_constraint(y >= 0);
+ box2.add_constraint(y <= 2);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x == 0);
+ box1.add_constraint(y == 0);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x <= 2);
+ box2.add_constraint(y >= -2);
+ box2.add_constraint(y <= 2);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box2);
+
+ bool ok = box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(y == 0);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(y >= 2);
+ box2.add_constraint(y <= 4);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box1);
+
+ bool ok = !box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x == 0);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(y == 0);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box1);
+
+ bool ok = !box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(y >= 0);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(y <= 5);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(2, UNIVERSE);
+
+ bool ok = box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 4);
+ box1.add_constraint(y >= 1);
+ box1.add_constraint(y <= 3);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 1);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= 0);
+ box2.add_constraint(y <= 4);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box1);
+
+ bool ok = !box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(2, UNIVERSE);
+ box1.add_constraint(x >= 0);
+ box1.add_constraint(x <= 1);
+ box1.add_constraint(y >= 0);
+ box1.add_constraint(y <= 2);
+
+ print_constraints(box1, "*** box1 ***");
+
+ TBox box2(2, UNIVERSE);
+ box2.add_constraint(x >= 0);
+ box2.add_constraint(x <= 3);
+ box2.add_constraint(y >= 1);
+ box2.add_constraint(y <= 2);
+
+ print_constraints(box2, "*** box2 ***");
+
+ TBox known_result(box1);
+
+ bool ok = !box1.upper_bound_assign_if_exact(box2);
+ ok &= (box1 == known_result);
+
+ print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/wrap1.cc b/tests/Box/wrap1.cc
new file mode 100644
index 0000000..a579d0e
--- /dev/null
+++ b/tests/Box/wrap1.cc
@@ -0,0 +1,202 @@
+/* Test Box::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ TBox box(2);
+ box.add_constraint(100 <= x);
+ box.add_constraint(x <= 300);
+ box.add_constraint(-50 <= y);
+ box.add_constraint(y <= 50);
+
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vars(x, y);
+
+ box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ // FIXME.
+ TBox known_result(2);
+ known_result.refine_with_constraint(0 <= x);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(0 <= y);
+ known_result.refine_with_constraint(y <= 255);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ TBox box(2);
+ box.add_constraint(100 <= x);
+ box.add_constraint(x <= 300);
+ box.add_constraint(-50 <= y);
+ box.add_constraint(y <= 50);
+
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x >= y);
+ cs.insert(y <= 75);
+
+ box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ // FIXME.
+ TBox known_result(2);
+ known_result.refine_with_constraint(0 <= x);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(0 <= y);
+ known_result.refine_with_constraint(y <= 50);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ TBox box(2);
+ box.add_constraint(100 <= x);
+ box.add_constraint(x <= 300);
+ box.add_constraint(-50 <= y);
+ box.add_constraint(y <= 50);
+
+ print_constraints(box, "*** box ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x + y >= 50);
+ cs.insert(x >= y);
+ cs.insert(y <= 75);
+
+ box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ TBox known_result(2);
+ known_result.refine_with_constraint(0 <= x);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(0 <= y);
+ known_result.refine_with_constraint(y <= 50);
+
+ bool ok = (box == known_result);
+
+ print_constraints(box, "*** box.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ TBox box1(1);
+ box1.add_constraint(2*x == 511);
+
+ print_constraints(box1, "*** box ***");
+
+ Variables_Set vars(x);
+
+ // Making copies before affecting box1.
+ TBox box2(box1);
+ TBox box3(box1);
+
+ TBox good_enough_result(box1);
+ TBox precise_result(1, EMPTY);
+
+ box1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ box2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+ box3.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+ // FIXME: Implementation can be more precise than expected.
+ bool ok = box1.contains(precise_result) && good_enough_result.contains(box1)
+ && box2.contains(precise_result) && good_enough_result.contains(box2)
+ && box3.contains(precise_result) && good_enough_result.contains(box3);
+
+ print_constraints(box1, "*** box.wrap_assign(..., OVERFLOW_WRAPS) ***");
+ print_constraints(box2, "*** box.wrap_assign(..., OVERFLOW_UNDEFINED) ***");
+ print_constraints(box3, "*** box.wrap_assign(..., OVERFLOW_IMPOSSIBLE) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ TBox box1(1);
+ box1.add_constraint(2*x == 18*256 + 511);
+
+ print_constraints(box1, "*** box ***");
+
+ Variables_Set vars(x);
+
+ // Making copies before affecting box1.
+ TBox box2(box1);
+ TBox box3(box1);
+
+ box1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ box2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+ box3.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+ TBox known_result1(1, EMPTY);
+ TBox known_result2(1);
+ known_result2.add_constraint(x >= 0);
+ known_result2.add_constraint(x <= 255);
+ TBox known_result3(1, EMPTY);
+
+ bool ok = (box1 == known_result1)
+ && (box2 == known_result2)
+ && (box3 == known_result3);
+
+ print_constraints(box1, "*** box.wrap_assign(..., OVERFLOW_WRAPS) ***");
+ print_constraints(box2, "*** box.wrap_assign(..., OVERFLOW_UNDEFINED) ***");
+ print_constraints(box3, "*** box.wrap_assign(..., OVERFLOW_IMPOSSIBLE) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+ DO_TEST_F8(test03);
+ DO_TEST_F8(test04);
+ DO_TEST_F8(test05);
+END_MAIN
diff --git a/tests/Box/writebox1.cc b/tests/Box/writebox1.cc
new file mode 100644
index 0000000..a54a49e
--- /dev/null
+++ b/tests/Box/writebox1.cc
@@ -0,0 +1,76 @@
+/* Test operator<<(ostream&, const Box&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(3);
+ TBox box2(3);
+
+ box1.add_constraint(x <= 3);
+
+ box2.add_constraint(-y <= -2);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+
+ // FIXME!!!
+ return true;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box1(0, EMPTY);
+ TBox box2(3);
+ TBox box3(3);
+
+ box2.add_constraint(-y <= -2);
+
+ box3.add_constraint(x <= 0);
+ box3.add_constraint(-x <= -1);
+ box3.add_constraint(y <= 3);
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(box2, "*** box2 ***");
+ print_constraints(box3, "*** box3 ***");
+
+ // FIXME!!!
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/CO_Tree/Makefile.am b/tests/CO_Tree/Makefile.am
new file mode 100644
index 0000000..12048cc
--- /dev/null
+++ b/tests/CO_Tree/Makefile.am
@@ -0,0 +1,78 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+cotree1
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+cotree1_SOURCES = cotree1.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/CO_Tree/Makefile.in b/tests/CO_Tree/Makefile.in
new file mode 100644
index 0000000..58e3ea3
--- /dev/null
+++ b/tests/CO_Tree/Makefile.in
@@ -0,0 +1,1105 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = cotree1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/CO_Tree
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = cotree1$(EXEEXT)
+am__EXEEXT_2 =
+am_cotree1_OBJECTS = cotree1.$(OBJEXT)
+cotree1_OBJECTS = $(am_cotree1_OBJECTS)
+cotree1_LDADD = $(LDADD)
+cotree1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(cotree1_SOURCES)
+DIST_SOURCES = $(cotree1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS =
+
+#
+# Sources for the tests
+#
+cotree1_SOURCES = cotree1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/CO_Tree/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/CO_Tree/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+cotree1$(EXEEXT): $(cotree1_OBJECTS) $(cotree1_DEPENDENCIES) $(EXTRA_cotree1_DEPENDENCIES)
+ @rm -f cotree1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cotree1_OBJECTS) $(cotree1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cotree1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+cotree1.log: cotree1$(EXEEXT)
+ @p='cotree1$(EXEEXT)'; \
+ b='cotree1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/CO_Tree/cotree1.cc b/tests/CO_Tree/cotree1.cc
new file mode 100644
index 0000000..c0a5361
--- /dev/null
+++ b/tests/CO_Tree/cotree1.cc
@@ -0,0 +1,2496 @@
+/* Test the CO_Tree class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_USE_SPARSE_MATRIX
+
+#include <vector>
+#include <algorithm>
+#include <set>
+
+namespace {
+
+bool
+test01() {
+
+ CO_Tree tree;
+
+ for (CO_Tree::iterator i = tree.begin(), i_end = tree.end(); i != i_end; ++i)
+ ;
+
+ return true;
+}
+
+bool
+test02() {
+
+ CO_Tree tree;
+
+ tree.insert(0, Coefficient_zero());
+ tree.insert(1, Coefficient_zero());
+ tree.insert(2, Coefficient_zero());
+ tree.insert(3, Coefficient_zero());
+ tree.insert(4, Coefficient_zero());
+
+ return true;
+}
+
+bool
+test03() {
+
+ // Sequential insertion, sequential erase.
+
+ CO_Tree tree;
+
+ for (unsigned n = 0; n < 500; ++n)
+ tree.insert(n, 0);
+
+ for (unsigned n = 0; n < 500; ++n)
+ tree.erase(n);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool
+test04() {
+
+ // Sequential insertion, backwards erase.
+
+ CO_Tree tree;
+
+ for (unsigned n = 0; n < 500; ++n)
+ tree.insert(n, 0);
+
+ for (unsigned n = 500; n-- > 0; )
+ tree.erase(n);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool
+test05() {
+
+ // Backwards insertion, sequential erase.
+
+ CO_Tree tree;
+
+ for (unsigned n = 500; n-- > 0; )
+ tree.insert(n, 0);
+
+ for (unsigned n = 0; n < 500; ++n)
+ tree.erase(n);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool
+test06() {
+
+ // Backwards insertion, backwards erase.
+
+ CO_Tree tree;
+
+ for (unsigned n = 500; --n > 0; )
+ tree.insert(n, 0);
+
+ for (unsigned n = 500; --n > 0; )
+ tree.erase(n);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool
+test07() {
+
+ // Sequential insertion, pseudo-random erase.
+
+ CO_Tree tree;
+
+ for (unsigned n = 0; n < 500; ++n)
+ tree.insert(n, 0);
+
+ tree.erase(110);
+ tree.erase(290);
+ tree.erase(11);
+ tree.erase(69);
+ tree.erase(209);
+ tree.erase(468);
+ tree.erase(17);
+ tree.erase(293);
+ tree.erase(164);
+ tree.erase(350);
+ tree.erase(115);
+ tree.erase(322);
+ tree.erase(361);
+ tree.erase(2);
+ tree.erase(446);
+ tree.erase(281);
+ tree.erase(400);
+ tree.erase(375);
+ tree.erase(153);
+ tree.erase(116);
+ tree.erase(143);
+ tree.erase(329);
+ tree.erase(420);
+ tree.erase(133);
+ tree.erase(363);
+ tree.erase(192);
+ tree.erase(27);
+ tree.erase(275);
+ tree.erase(104);
+ tree.erase(213);
+ tree.erase(352);
+ tree.erase(427);
+ tree.erase(273);
+ tree.erase(288);
+ tree.erase(396);
+ tree.erase(114);
+ tree.erase(341);
+ tree.erase(413);
+ tree.erase(201);
+ tree.erase(280);
+ tree.erase(66);
+ tree.erase(227);
+ tree.erase(406);
+ tree.erase(79);
+ tree.erase(259);
+ tree.erase(176);
+ tree.erase(106);
+ tree.erase(0);
+ tree.erase(328);
+ tree.erase(270);
+ tree.erase(449);
+ tree.erase(165);
+ tree.erase(163);
+ tree.erase(43);
+ tree.erase(391);
+ tree.erase(202);
+ tree.erase(49);
+ tree.erase(105);
+ tree.erase(149);
+ tree.erase(318);
+ tree.erase(387);
+ tree.erase(389);
+ tree.erase(141);
+ tree.erase(408);
+ tree.erase(486);
+ tree.erase(354);
+ tree.erase(8);
+ tree.erase(33);
+ tree.erase(421);
+ tree.erase(385);
+ tree.erase(25);
+ tree.erase(485);
+ tree.erase(196);
+ tree.erase(31);
+ tree.erase(82);
+ tree.erase(434);
+ tree.erase(423);
+ tree.erase(358);
+ tree.erase(255);
+ tree.erase(287);
+ tree.erase(23);
+ tree.erase(122);
+ tree.erase(489);
+ tree.erase(19);
+ tree.erase(126);
+ tree.erase(44);
+ tree.erase(120);
+ tree.erase(131);
+ tree.erase(332);
+ tree.erase(448);
+ tree.erase(238);
+ tree.erase(264);
+ tree.erase(454);
+ tree.erase(218);
+ tree.erase(157);
+ tree.erase(436);
+ tree.erase(225);
+ tree.erase(437);
+ tree.erase(443);
+ tree.erase(179);
+ tree.erase(265);
+ tree.erase(475);
+ tree.erase(180);
+ tree.erase(487);
+ tree.erase(339);
+ tree.erase(492);
+ tree.erase(395);
+ tree.erase(491);
+ tree.erase(223);
+ tree.erase(113);
+ tree.erase(92);
+ tree.erase(48);
+ tree.erase(61);
+ tree.erase(127);
+ tree.erase(190);
+ tree.erase(67);
+ tree.erase(484);
+ tree.erase(439);
+ tree.erase(355);
+ tree.erase(243);
+ tree.erase(392);
+ tree.erase(159);
+ tree.erase(74);
+ tree.erase(337);
+ tree.erase(151);
+ tree.erase(458);
+ tree.erase(480);
+ tree.erase(334);
+ tree.erase(419);
+ tree.erase(309);
+ tree.erase(301);
+ tree.erase(125);
+ tree.erase(407);
+ tree.erase(496);
+ tree.erase(187);
+ tree.erase(50);
+ tree.erase(368);
+ tree.erase(283);
+ tree.erase(244);
+ tree.erase(170);
+ tree.erase(118);
+ tree.erase(457);
+ tree.erase(181);
+ tree.erase(479);
+ tree.erase(401);
+ tree.erase(494);
+ tree.erase(99);
+ tree.erase(236);
+ tree.erase(240);
+ tree.erase(147);
+ tree.erase(233);
+ tree.erase(172);
+ tree.erase(266);
+ tree.erase(32);
+ tree.erase(210);
+ tree.erase(161);
+ tree.erase(156);
+ tree.erase(178);
+ tree.erase(221);
+ tree.erase(78);
+ tree.erase(85);
+ tree.erase(135);
+ tree.erase(145);
+ tree.erase(356);
+ tree.erase(397);
+ tree.erase(450);
+ tree.erase(276);
+ tree.erase(41);
+ tree.erase(414);
+ tree.erase(14);
+ tree.erase(22);
+ tree.erase(29);
+ tree.erase(34);
+ tree.erase(498);
+ tree.erase(250);
+ tree.erase(36);
+ tree.erase(320);
+ tree.erase(268);
+ tree.erase(195);
+ tree.erase(382);
+ tree.erase(441);
+ tree.erase(235);
+ tree.erase(346);
+ tree.erase(476);
+ tree.erase(217);
+ tree.erase(335);
+ tree.erase(121);
+ tree.erase(94);
+ tree.erase(278);
+ tree.erase(272);
+ tree.erase(207);
+ tree.erase(463);
+ tree.erase(150);
+ tree.erase(432);
+ tree.erase(410);
+ tree.erase(208);
+ tree.erase(70);
+ tree.erase(84);
+ tree.erase(186);
+ tree.erase(6);
+ tree.erase(224);
+ tree.erase(9);
+ tree.erase(60);
+ tree.erase(175);
+ tree.erase(430);
+ tree.erase(128);
+ tree.erase(129);
+ tree.erase(465);
+ tree.erase(459);
+ tree.erase(289);
+ tree.erase(261);
+ tree.erase(26);
+ tree.erase(461);
+ tree.erase(279);
+ tree.erase(245);
+ tree.erase(478);
+ tree.erase(403);
+ tree.erase(45);
+ tree.erase(359);
+ tree.erase(327);
+ tree.erase(393);
+ tree.erase(373);
+ tree.erase(304);
+ tree.erase(83);
+ tree.erase(160);
+ tree.erase(198);
+ tree.erase(103);
+ tree.erase(367);
+ tree.erase(76);
+ tree.erase(73);
+ tree.erase(167);
+ tree.erase(291);
+ tree.erase(215);
+ tree.erase(219);
+ tree.erase(119);
+ tree.erase(456);
+ tree.erase(197);
+ tree.erase(477);
+ tree.erase(222);
+ tree.erase(174);
+ tree.erase(451);
+ tree.erase(214);
+ tree.erase(112);
+ tree.erase(464);
+ tree.erase(262);
+ tree.erase(47);
+ tree.erase(347);
+ tree.erase(111);
+ tree.erase(148);
+ tree.erase(308);
+ tree.erase(340);
+ tree.erase(100);
+ tree.erase(130);
+ tree.erase(323);
+ tree.erase(312);
+ tree.erase(292);
+ tree.erase(35);
+ tree.erase(306);
+ tree.erase(58);
+ tree.erase(353);
+ tree.erase(452);
+ tree.erase(91);
+ tree.erase(319);
+ tree.erase(330);
+ tree.erase(473);
+ tree.erase(488);
+ tree.erase(134);
+ tree.erase(315);
+ tree.erase(253);
+ tree.erase(374);
+ tree.erase(384);
+ tree.erase(95);
+ tree.erase(370);
+ tree.erase(13);
+ tree.erase(183);
+ tree.erase(136);
+ tree.erase(313);
+ tree.erase(307);
+ tree.erase(239);
+ tree.erase(258);
+ tree.erase(405);
+ tree.erase(56);
+ tree.erase(228);
+ tree.erase(455);
+ tree.erase(317);
+ tree.erase(497);
+ tree.erase(102);
+ tree.erase(117);
+ tree.erase(68);
+ tree.erase(234);
+ tree.erase(51);
+ tree.erase(107);
+ tree.erase(349);
+ tree.erase(348);
+ tree.erase(416);
+ tree.erase(88);
+ tree.erase(89);
+ tree.erase(366);
+ tree.erase(109);
+ tree.erase(189);
+ tree.erase(333);
+ tree.erase(3);
+ tree.erase(394);
+ tree.erase(267);
+ tree.erase(269);
+ tree.erase(246);
+ tree.erase(152);
+ tree.erase(173);
+ tree.erase(438);
+ tree.erase(24);
+ tree.erase(15);
+ tree.erase(390);
+ tree.erase(284);
+ tree.erase(360);
+ tree.erase(371);
+ tree.erase(81);
+ tree.erase(65);
+ tree.erase(299);
+ tree.erase(132);
+ tree.erase(98);
+ tree.erase(303);
+ tree.erase(139);
+ tree.erase(453);
+ tree.erase(402);
+ tree.erase(20);
+ tree.erase(54);
+ tree.erase(499);
+ tree.erase(260);
+ tree.erase(285);
+ tree.erase(381);
+ tree.erase(357);
+ tree.erase(248);
+ tree.erase(362);
+ tree.erase(62);
+ tree.erase(203);
+ tree.erase(411);
+ tree.erase(444);
+ tree.erase(388);
+ tree.erase(10);
+ tree.erase(342);
+ tree.erase(229);
+ tree.erase(481);
+ tree.erase(369);
+ tree.erase(378);
+ tree.erase(38);
+ tree.erase(77);
+ tree.erase(415);
+ tree.erase(466);
+ tree.erase(404);
+ tree.erase(90);
+ tree.erase(101);
+ tree.erase(169);
+ tree.erase(435);
+ tree.erase(296);
+ tree.erase(282);
+ tree.erase(63);
+ tree.erase(52);
+ tree.erase(40);
+ tree.erase(231);
+ tree.erase(302);
+ tree.erase(18);
+ tree.erase(383);
+ tree.erase(194);
+ tree.erase(351);
+ tree.erase(254);
+ tree.erase(431);
+ tree.erase(199);
+ tree.erase(80);
+ tree.erase(300);
+ tree.erase(140);
+ tree.erase(324);
+ tree.erase(286);
+ tree.erase(188);
+ tree.erase(386);
+ tree.erase(344);
+ tree.erase(166);
+ tree.erase(4);
+ tree.erase(226);
+ tree.erase(316);
+ tree.erase(158);
+ tree.erase(447);
+ tree.erase(86);
+ tree.erase(398);
+ tree.erase(108);
+ tree.erase(230);
+ tree.erase(310);
+ tree.erase(495);
+ tree.erase(171);
+ tree.erase(380);
+ tree.erase(249);
+ tree.erase(433);
+ tree.erase(16);
+ tree.erase(470);
+ tree.erase(277);
+ tree.erase(21);
+ tree.erase(372);
+ tree.erase(252);
+ tree.erase(424);
+ tree.erase(144);
+ tree.erase(377);
+ tree.erase(59);
+ tree.erase(46);
+ tree.erase(55);
+ tree.erase(429);
+ tree.erase(474);
+ tree.erase(321);
+ tree.erase(399);
+ tree.erase(471);
+ tree.erase(237);
+ tree.erase(442);
+ tree.erase(97);
+ tree.erase(220);
+ tree.erase(445);
+ tree.erase(326);
+ tree.erase(37);
+ tree.erase(336);
+ tree.erase(343);
+ tree.erase(412);
+ tree.erase(409);
+ tree.erase(460);
+ tree.erase(57);
+ tree.erase(168);
+ tree.erase(295);
+ tree.erase(247);
+ tree.erase(482);
+ tree.erase(425);
+ tree.erase(256);
+ tree.erase(96);
+ tree.erase(53);
+ tree.erase(469);
+ tree.erase(162);
+ tree.erase(493);
+ tree.erase(294);
+ tree.erase(177);
+ tree.erase(212);
+ tree.erase(30);
+ tree.erase(5);
+ tree.erase(193);
+ tree.erase(483);
+ tree.erase(124);
+ tree.erase(87);
+ tree.erase(64);
+ tree.erase(490);
+ tree.erase(155);
+ tree.erase(422);
+ tree.erase(191);
+ tree.erase(75);
+ tree.erase(325);
+ tree.erase(1);
+ tree.erase(182);
+ tree.erase(28);
+ tree.erase(364);
+ tree.erase(42);
+ tree.erase(39);
+ tree.erase(376);
+ tree.erase(467);
+ tree.erase(426);
+ tree.erase(205);
+ tree.erase(365);
+ tree.erase(137);
+ tree.erase(297);
+ tree.erase(462);
+ tree.erase(241);
+ tree.erase(123);
+ tree.erase(206);
+ tree.erase(440);
+ tree.erase(216);
+ tree.erase(146);
+ tree.erase(142);
+ tree.erase(72);
+ tree.erase(379);
+ tree.erase(472);
+ tree.erase(305);
+ tree.erase(271);
+ tree.erase(298);
+ tree.erase(232);
+ tree.erase(242);
+ tree.erase(184);
+ tree.erase(138);
+ tree.erase(154);
+ tree.erase(200);
+ tree.erase(71);
+ tree.erase(211);
+ tree.erase(274);
+ tree.erase(263);
+ tree.erase(311);
+ tree.erase(428);
+ tree.erase(331);
+ tree.erase(7);
+ tree.erase(345);
+ tree.erase(185);
+ tree.erase(338);
+ tree.erase(251);
+ tree.erase(417);
+ tree.erase(12);
+ tree.erase(93);
+ tree.erase(204);
+ tree.erase(257);
+ tree.erase(418);
+ tree.erase(314);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool test08() {
+
+ // Pseudo-random insertion, pseudo-random erase (in the same order).
+
+ CO_Tree tree;
+
+ tree.insert(110, 0);
+ tree.insert(290, 0);
+ tree.insert(11, 0);
+ tree.insert(69, 0);
+ tree.insert(209, 0);
+ tree.insert(468, 0);
+ tree.insert(17, 0);
+ tree.insert(293, 0);
+ tree.insert(164, 0);
+ tree.insert(350, 0);
+ tree.insert(115, 0);
+ tree.insert(322, 0);
+ tree.insert(361, 0);
+ tree.insert(2, 0);
+ tree.insert(446, 0);
+ tree.insert(281, 0);
+ tree.insert(400, 0);
+ tree.insert(375, 0);
+ tree.insert(153, 0);
+ tree.insert(116, 0);
+ tree.insert(143, 0);
+ tree.insert(329, 0);
+ tree.insert(420, 0);
+ tree.insert(133, 0);
+ tree.insert(363, 0);
+ tree.insert(192, 0);
+ tree.insert(27, 0);
+ tree.insert(275, 0);
+ tree.insert(104, 0);
+ tree.insert(213, 0);
+ tree.insert(352, 0);
+ tree.insert(427, 0);
+ tree.insert(273, 0);
+ tree.insert(288, 0);
+ tree.insert(396, 0);
+ tree.insert(114, 0);
+ tree.insert(341, 0);
+ tree.insert(413, 0);
+ tree.insert(201, 0);
+ tree.insert(280, 0);
+ tree.insert(66, 0);
+ tree.insert(227, 0);
+ tree.insert(406, 0);
+ tree.insert(79, 0);
+ tree.insert(259, 0);
+ tree.insert(176, 0);
+ tree.insert(106, 0);
+ tree.insert(0, 0);
+ tree.insert(328, 0);
+ tree.insert(270, 0);
+ tree.insert(449, 0);
+ tree.insert(165, 0);
+ tree.insert(163, 0);
+ tree.insert(43, 0);
+ tree.insert(391, 0);
+ tree.insert(202, 0);
+ tree.insert(49, 0);
+ tree.insert(105, 0);
+ tree.insert(149, 0);
+ tree.insert(318, 0);
+ tree.insert(387, 0);
+ tree.insert(389, 0);
+ tree.insert(141, 0);
+ tree.insert(408, 0);
+ tree.insert(486, 0);
+ tree.insert(354, 0);
+ tree.insert(8, 0);
+ tree.insert(33, 0);
+ tree.insert(421, 0);
+ tree.insert(385, 0);
+ tree.insert(25, 0);
+ tree.insert(485, 0);
+ tree.insert(196, 0);
+ tree.insert(31, 0);
+ tree.insert(82, 0);
+ tree.insert(434, 0);
+ tree.insert(423, 0);
+ tree.insert(358, 0);
+ tree.insert(255, 0);
+ tree.insert(287, 0);
+ tree.insert(23, 0);
+ tree.insert(122, 0);
+ tree.insert(489, 0);
+ tree.insert(19, 0);
+ tree.insert(126, 0);
+ tree.insert(44, 0);
+ tree.insert(120, 0);
+ tree.insert(131, 0);
+ tree.insert(332, 0);
+ tree.insert(448, 0);
+ tree.insert(238, 0);
+ tree.insert(264, 0);
+ tree.insert(454, 0);
+ tree.insert(218, 0);
+ tree.insert(157, 0);
+ tree.insert(436, 0);
+ tree.insert(225, 0);
+ tree.insert(437, 0);
+ tree.insert(443, 0);
+ tree.insert(179, 0);
+ tree.insert(265, 0);
+ tree.insert(475, 0);
+ tree.insert(180, 0);
+ tree.insert(487, 0);
+ tree.insert(339, 0);
+ tree.insert(492, 0);
+ tree.insert(395, 0);
+ tree.insert(491, 0);
+ tree.insert(223, 0);
+ tree.insert(113, 0);
+ tree.insert(92, 0);
+ tree.insert(48, 0);
+ tree.insert(61, 0);
+ tree.insert(127, 0);
+ tree.insert(190, 0);
+ tree.insert(67, 0);
+ tree.insert(484, 0);
+ tree.insert(439, 0);
+ tree.insert(355, 0);
+ tree.insert(243, 0);
+ tree.insert(392, 0);
+ tree.insert(159, 0);
+ tree.insert(74, 0);
+ tree.insert(337, 0);
+ tree.insert(151, 0);
+ tree.insert(458, 0);
+ tree.insert(480, 0);
+ tree.insert(334, 0);
+ tree.insert(419, 0);
+ tree.insert(309, 0);
+ tree.insert(301, 0);
+ tree.insert(125, 0);
+ tree.insert(407, 0);
+ tree.insert(496, 0);
+ tree.insert(187, 0);
+ tree.insert(50, 0);
+ tree.insert(368, 0);
+ tree.insert(283, 0);
+ tree.insert(244, 0);
+ tree.insert(170, 0);
+ tree.insert(118, 0);
+ tree.insert(457, 0);
+ tree.insert(181, 0);
+ tree.insert(479, 0);
+ tree.insert(401, 0);
+ tree.insert(494, 0);
+ tree.insert(99, 0);
+ tree.insert(236, 0);
+ tree.insert(240, 0);
+ tree.insert(147, 0);
+ tree.insert(233, 0);
+ tree.insert(172, 0);
+ tree.insert(266, 0);
+ tree.insert(32, 0);
+ tree.insert(210, 0);
+ tree.insert(161, 0);
+ tree.insert(156, 0);
+ tree.insert(178, 0);
+ tree.insert(221, 0);
+ tree.insert(78, 0);
+ tree.insert(85, 0);
+ tree.insert(135, 0);
+ tree.insert(145, 0);
+ tree.insert(356, 0);
+ tree.insert(397, 0);
+ tree.insert(450, 0);
+ tree.insert(276, 0);
+ tree.insert(41, 0);
+ tree.insert(414, 0);
+ tree.insert(14, 0);
+ tree.insert(22, 0);
+ tree.insert(29, 0);
+ tree.insert(34, 0);
+ tree.insert(498, 0);
+ tree.insert(250, 0);
+ tree.insert(36, 0);
+ tree.insert(320, 0);
+ tree.insert(268, 0);
+ tree.insert(195, 0);
+ tree.insert(382, 0);
+ tree.insert(441, 0);
+ tree.insert(235, 0);
+ tree.insert(346, 0);
+ tree.insert(476, 0);
+ tree.insert(217, 0);
+ tree.insert(335, 0);
+ tree.insert(121, 0);
+ tree.insert(94, 0);
+ tree.insert(278, 0);
+ tree.insert(272, 0);
+ tree.insert(207, 0);
+ tree.insert(463, 0);
+ tree.insert(150, 0);
+ tree.insert(432, 0);
+ tree.insert(410, 0);
+ tree.insert(208, 0);
+ tree.insert(70, 0);
+ tree.insert(84, 0);
+ tree.insert(186, 0);
+ tree.insert(6, 0);
+ tree.insert(224, 0);
+ tree.insert(9, 0);
+ tree.insert(60, 0);
+ tree.insert(175, 0);
+ tree.insert(430, 0);
+ tree.insert(128, 0);
+ tree.insert(129, 0);
+ tree.insert(465, 0);
+ tree.insert(459, 0);
+ tree.insert(289, 0);
+ tree.insert(261, 0);
+ tree.insert(26, 0);
+ tree.insert(461, 0);
+ tree.insert(279, 0);
+ tree.insert(245, 0);
+ tree.insert(478, 0);
+ tree.insert(403, 0);
+ tree.insert(45, 0);
+ tree.insert(359, 0);
+ tree.insert(327, 0);
+ tree.insert(393, 0);
+ tree.insert(373, 0);
+ tree.insert(304, 0);
+ tree.insert(83, 0);
+ tree.insert(160, 0);
+ tree.insert(198, 0);
+ tree.insert(103, 0);
+ tree.insert(367, 0);
+ tree.insert(76, 0);
+ tree.insert(73, 0);
+ tree.insert(167, 0);
+ tree.insert(291, 0);
+ tree.insert(215, 0);
+ tree.insert(219, 0);
+ tree.insert(119, 0);
+ tree.insert(456, 0);
+ tree.insert(197, 0);
+ tree.insert(477, 0);
+ tree.insert(222, 0);
+ tree.insert(174, 0);
+ tree.insert(451, 0);
+ tree.insert(214, 0);
+ tree.insert(112, 0);
+ tree.insert(464, 0);
+ tree.insert(262, 0);
+ tree.insert(47, 0);
+ tree.insert(347, 0);
+ tree.insert(111, 0);
+ tree.insert(148, 0);
+ tree.insert(308, 0);
+ tree.insert(340, 0);
+ tree.insert(100, 0);
+ tree.insert(130, 0);
+ tree.insert(323, 0);
+ tree.insert(312, 0);
+ tree.insert(292, 0);
+ tree.insert(35, 0);
+ tree.insert(306, 0);
+ tree.insert(58, 0);
+ tree.insert(353, 0);
+ tree.insert(452, 0);
+ tree.insert(91, 0);
+ tree.insert(319, 0);
+ tree.insert(330, 0);
+ tree.insert(473, 0);
+ tree.insert(488, 0);
+ tree.insert(134, 0);
+ tree.insert(315, 0);
+ tree.insert(253, 0);
+ tree.insert(374, 0);
+ tree.insert(384, 0);
+ tree.insert(95, 0);
+ tree.insert(370, 0);
+ tree.insert(13, 0);
+ tree.insert(183, 0);
+ tree.insert(136, 0);
+ tree.insert(313, 0);
+ tree.insert(307, 0);
+ tree.insert(239, 0);
+ tree.insert(258, 0);
+ tree.insert(405, 0);
+ tree.insert(56, 0);
+ tree.insert(228, 0);
+ tree.insert(455, 0);
+ tree.insert(317, 0);
+ tree.insert(497, 0);
+ tree.insert(102, 0);
+ tree.insert(117, 0);
+ tree.insert(68, 0);
+ tree.insert(234, 0);
+ tree.insert(51, 0);
+ tree.insert(107, 0);
+ tree.insert(349, 0);
+ tree.insert(348, 0);
+ tree.insert(416, 0);
+ tree.insert(88, 0);
+ tree.insert(89, 0);
+ tree.insert(366, 0);
+ tree.insert(109, 0);
+ tree.insert(189, 0);
+ tree.insert(333, 0);
+ tree.insert(3, 0);
+ tree.insert(394, 0);
+ tree.insert(267, 0);
+ tree.insert(269, 0);
+ tree.insert(246, 0);
+ tree.insert(152, 0);
+ tree.insert(173, 0);
+ tree.insert(438, 0);
+ tree.insert(24, 0);
+ tree.insert(15, 0);
+ tree.insert(390, 0);
+ tree.insert(284, 0);
+ tree.insert(360, 0);
+ tree.insert(371, 0);
+ tree.insert(81, 0);
+ tree.insert(65, 0);
+ tree.insert(299, 0);
+ tree.insert(132, 0);
+ tree.insert(98, 0);
+ tree.insert(303, 0);
+ tree.insert(139, 0);
+ tree.insert(453, 0);
+ tree.insert(402, 0);
+ tree.insert(20, 0);
+ tree.insert(54, 0);
+ tree.insert(499, 0);
+ tree.insert(260, 0);
+ tree.insert(285, 0);
+ tree.insert(381, 0);
+ tree.insert(357, 0);
+ tree.insert(248, 0);
+ tree.insert(362, 0);
+ tree.insert(62, 0);
+ tree.insert(203, 0);
+ tree.insert(411, 0);
+ tree.insert(444, 0);
+ tree.insert(388, 0);
+ tree.insert(10, 0);
+ tree.insert(342, 0);
+ tree.insert(229, 0);
+ tree.insert(481, 0);
+ tree.insert(369, 0);
+ tree.insert(378, 0);
+ tree.insert(38, 0);
+ tree.insert(77, 0);
+ tree.insert(415, 0);
+ tree.insert(466, 0);
+ tree.insert(404, 0);
+ tree.insert(90, 0);
+ tree.insert(101, 0);
+ tree.insert(169, 0);
+ tree.insert(435, 0);
+ tree.insert(296, 0);
+ tree.insert(282, 0);
+ tree.insert(63, 0);
+ tree.insert(52, 0);
+ tree.insert(40, 0);
+ tree.insert(231, 0);
+ tree.insert(302, 0);
+ tree.insert(18, 0);
+ tree.insert(383, 0);
+ tree.insert(194, 0);
+ tree.insert(351, 0);
+ tree.insert(254, 0);
+ tree.insert(431, 0);
+ tree.insert(199, 0);
+ tree.insert(80, 0);
+ tree.insert(300, 0);
+ tree.insert(140, 0);
+ tree.insert(324, 0);
+ tree.insert(286, 0);
+ tree.insert(188, 0);
+ tree.insert(386, 0);
+ tree.insert(344, 0);
+ tree.insert(166, 0);
+ tree.insert(4, 0);
+ tree.insert(226, 0);
+ tree.insert(316, 0);
+ tree.insert(158, 0);
+ tree.insert(447, 0);
+ tree.insert(86, 0);
+ tree.insert(398, 0);
+ tree.insert(108, 0);
+ tree.insert(230, 0);
+ tree.insert(310, 0);
+ tree.insert(495, 0);
+ tree.insert(171, 0);
+ tree.insert(380, 0);
+ tree.insert(249, 0);
+ tree.insert(433, 0);
+ tree.insert(16, 0);
+ tree.insert(470, 0);
+ tree.insert(277, 0);
+ tree.insert(21, 0);
+ tree.insert(372, 0);
+ tree.insert(252, 0);
+ tree.insert(424, 0);
+ tree.insert(144, 0);
+ tree.insert(377, 0);
+ tree.insert(59, 0);
+ tree.insert(46, 0);
+ tree.insert(55, 0);
+ tree.insert(429, 0);
+ tree.insert(474, 0);
+ tree.insert(321, 0);
+ tree.insert(399, 0);
+ tree.insert(471, 0);
+ tree.insert(237, 0);
+ tree.insert(442, 0);
+ tree.insert(97, 0);
+ tree.insert(220, 0);
+ tree.insert(445, 0);
+ tree.insert(326, 0);
+ tree.insert(37, 0);
+ tree.insert(336, 0);
+ tree.insert(343, 0);
+ tree.insert(412, 0);
+ tree.insert(409, 0);
+ tree.insert(460, 0);
+ tree.insert(57, 0);
+ tree.insert(168, 0);
+ tree.insert(295, 0);
+ tree.insert(247, 0);
+ tree.insert(482, 0);
+ tree.insert(425, 0);
+ tree.insert(256, 0);
+ tree.insert(96, 0);
+ tree.insert(53, 0);
+ tree.insert(469, 0);
+ tree.insert(162, 0);
+ tree.insert(493, 0);
+ tree.insert(294, 0);
+ tree.insert(177, 0);
+ tree.insert(212, 0);
+ tree.insert(30, 0);
+ tree.insert(5, 0);
+ tree.insert(193, 0);
+ tree.insert(483, 0);
+ tree.insert(124, 0);
+ tree.insert(87, 0);
+ tree.insert(64, 0);
+ tree.insert(490, 0);
+ tree.insert(155, 0);
+ tree.insert(422, 0);
+ tree.insert(191, 0);
+ tree.insert(75, 0);
+ tree.insert(325, 0);
+ tree.insert(1, 0);
+ tree.insert(182, 0);
+ tree.insert(28, 0);
+ tree.insert(364, 0);
+ tree.insert(42, 0);
+ tree.insert(39, 0);
+ tree.insert(376, 0);
+ tree.insert(467, 0);
+ tree.insert(426, 0);
+ tree.insert(205, 0);
+ tree.insert(365, 0);
+ tree.insert(137, 0);
+ tree.insert(297, 0);
+ tree.insert(462, 0);
+ tree.insert(241, 0);
+ tree.insert(123, 0);
+ tree.insert(206, 0);
+ tree.insert(440, 0);
+ tree.insert(216, 0);
+ tree.insert(146, 0);
+ tree.insert(142, 0);
+ tree.insert(72, 0);
+ tree.insert(379, 0);
+ tree.insert(472, 0);
+ tree.insert(305, 0);
+ tree.insert(271, 0);
+ tree.insert(298, 0);
+ tree.insert(232, 0);
+ tree.insert(242, 0);
+ tree.insert(184, 0);
+ tree.insert(138, 0);
+ tree.insert(154, 0);
+ tree.insert(200, 0);
+ tree.insert(71, 0);
+ tree.insert(211, 0);
+ tree.insert(274, 0);
+ tree.insert(263, 0);
+ tree.insert(311, 0);
+ tree.insert(428, 0);
+ tree.insert(331, 0);
+ tree.insert(7, 0);
+ tree.insert(345, 0);
+ tree.insert(185, 0);
+ tree.insert(338, 0);
+ tree.insert(251, 0);
+ tree.insert(417, 0);
+ tree.insert(12, 0);
+ tree.insert(93, 0);
+ tree.insert(204, 0);
+ tree.insert(257, 0);
+ tree.insert(418, 0);
+ tree.insert(314, 0);
+
+ tree.erase(110);
+ tree.erase(290);
+ tree.erase(11);
+ tree.erase(69);
+ tree.erase(209);
+ tree.erase(468);
+ tree.erase(17);
+ tree.erase(293);
+ tree.erase(164);
+ tree.erase(350);
+ tree.erase(115);
+ tree.erase(322);
+ tree.erase(361);
+ tree.erase(2);
+ tree.erase(446);
+ tree.erase(281);
+ tree.erase(400);
+ tree.erase(375);
+ tree.erase(153);
+ tree.erase(116);
+ tree.erase(143);
+ tree.erase(329);
+ tree.erase(420);
+ tree.erase(133);
+ tree.erase(363);
+ tree.erase(192);
+ tree.erase(27);
+ tree.erase(275);
+ tree.erase(104);
+ tree.erase(213);
+ tree.erase(352);
+ tree.erase(427);
+ tree.erase(273);
+ tree.erase(288);
+ tree.erase(396);
+ tree.erase(114);
+ tree.erase(341);
+ tree.erase(413);
+ tree.erase(201);
+ tree.erase(280);
+ tree.erase(66);
+ tree.erase(227);
+ tree.erase(406);
+ tree.erase(79);
+ tree.erase(259);
+ tree.erase(176);
+ tree.erase(106);
+ tree.erase(0);
+ tree.erase(328);
+ tree.erase(270);
+ tree.erase(449);
+ tree.erase(165);
+ tree.erase(163);
+ tree.erase(43);
+ tree.erase(391);
+ tree.erase(202);
+ tree.erase(49);
+ tree.erase(105);
+ tree.erase(149);
+ tree.erase(318);
+ tree.erase(387);
+ tree.erase(389);
+ tree.erase(141);
+ tree.erase(408);
+ tree.erase(486);
+ tree.erase(354);
+ tree.erase(8);
+ tree.erase(33);
+ tree.erase(421);
+ tree.erase(385);
+ tree.erase(25);
+ tree.erase(485);
+ tree.erase(196);
+ tree.erase(31);
+ tree.erase(82);
+ tree.erase(434);
+ tree.erase(423);
+ tree.erase(358);
+ tree.erase(255);
+ tree.erase(287);
+ tree.erase(23);
+ tree.erase(122);
+ tree.erase(489);
+ tree.erase(19);
+ tree.erase(126);
+ tree.erase(44);
+ tree.erase(120);
+ tree.erase(131);
+ tree.erase(332);
+ tree.erase(448);
+ tree.erase(238);
+ tree.erase(264);
+ tree.erase(454);
+ tree.erase(218);
+ tree.erase(157);
+ tree.erase(436);
+ tree.erase(225);
+ tree.erase(437);
+ tree.erase(443);
+ tree.erase(179);
+ tree.erase(265);
+ tree.erase(475);
+ tree.erase(180);
+ tree.erase(487);
+ tree.erase(339);
+ tree.erase(492);
+ tree.erase(395);
+ tree.erase(491);
+ tree.erase(223);
+ tree.erase(113);
+ tree.erase(92);
+ tree.erase(48);
+ tree.erase(61);
+ tree.erase(127);
+ tree.erase(190);
+ tree.erase(67);
+ tree.erase(484);
+ tree.erase(439);
+ tree.erase(355);
+ tree.erase(243);
+ tree.erase(392);
+ tree.erase(159);
+ tree.erase(74);
+ tree.erase(337);
+ tree.erase(151);
+ tree.erase(458);
+ tree.erase(480);
+ tree.erase(334);
+ tree.erase(419);
+ tree.erase(309);
+ tree.erase(301);
+ tree.erase(125);
+ tree.erase(407);
+ tree.erase(496);
+ tree.erase(187);
+ tree.erase(50);
+ tree.erase(368);
+ tree.erase(283);
+ tree.erase(244);
+ tree.erase(170);
+ tree.erase(118);
+ tree.erase(457);
+ tree.erase(181);
+ tree.erase(479);
+ tree.erase(401);
+ tree.erase(494);
+ tree.erase(99);
+ tree.erase(236);
+ tree.erase(240);
+ tree.erase(147);
+ tree.erase(233);
+ tree.erase(172);
+ tree.erase(266);
+ tree.erase(32);
+ tree.erase(210);
+ tree.erase(161);
+ tree.erase(156);
+ tree.erase(178);
+ tree.erase(221);
+ tree.erase(78);
+ tree.erase(85);
+ tree.erase(135);
+ tree.erase(145);
+ tree.erase(356);
+ tree.erase(397);
+ tree.erase(450);
+ tree.erase(276);
+ tree.erase(41);
+ tree.erase(414);
+ tree.erase(14);
+ tree.erase(22);
+ tree.erase(29);
+ tree.erase(34);
+ tree.erase(498);
+ tree.erase(250);
+ tree.erase(36);
+ tree.erase(320);
+ tree.erase(268);
+ tree.erase(195);
+ tree.erase(382);
+ tree.erase(441);
+ tree.erase(235);
+ tree.erase(346);
+ tree.erase(476);
+ tree.erase(217);
+ tree.erase(335);
+ tree.erase(121);
+ tree.erase(94);
+ tree.erase(278);
+ tree.erase(272);
+ tree.erase(207);
+ tree.erase(463);
+ tree.erase(150);
+ tree.erase(432);
+ tree.erase(410);
+ tree.erase(208);
+ tree.erase(70);
+ tree.erase(84);
+ tree.erase(186);
+ tree.erase(6);
+ tree.erase(224);
+ tree.erase(9);
+ tree.erase(60);
+ tree.erase(175);
+ tree.erase(430);
+ tree.erase(128);
+ tree.erase(129);
+ tree.erase(465);
+ tree.erase(459);
+ tree.erase(289);
+ tree.erase(261);
+ tree.erase(26);
+ tree.erase(461);
+ tree.erase(279);
+ tree.erase(245);
+ tree.erase(478);
+ tree.erase(403);
+ tree.erase(45);
+ tree.erase(359);
+ tree.erase(327);
+ tree.erase(393);
+ tree.erase(373);
+ tree.erase(304);
+ tree.erase(83);
+ tree.erase(160);
+ tree.erase(198);
+ tree.erase(103);
+ tree.erase(367);
+ tree.erase(76);
+ tree.erase(73);
+ tree.erase(167);
+ tree.erase(291);
+ tree.erase(215);
+ tree.erase(219);
+ tree.erase(119);
+ tree.erase(456);
+ tree.erase(197);
+ tree.erase(477);
+ tree.erase(222);
+ tree.erase(174);
+ tree.erase(451);
+ tree.erase(214);
+ tree.erase(112);
+ tree.erase(464);
+ tree.erase(262);
+ tree.erase(47);
+ tree.erase(347);
+ tree.erase(111);
+ tree.erase(148);
+ tree.erase(308);
+ tree.erase(340);
+ tree.erase(100);
+ tree.erase(130);
+ tree.erase(323);
+ tree.erase(312);
+ tree.erase(292);
+ tree.erase(35);
+ tree.erase(306);
+ tree.erase(58);
+ tree.erase(353);
+ tree.erase(452);
+ tree.erase(91);
+ tree.erase(319);
+ tree.erase(330);
+ tree.erase(473);
+ tree.erase(488);
+ tree.erase(134);
+ tree.erase(315);
+ tree.erase(253);
+ tree.erase(374);
+ tree.erase(384);
+ tree.erase(95);
+ tree.erase(370);
+ tree.erase(13);
+ tree.erase(183);
+ tree.erase(136);
+ tree.erase(313);
+ tree.erase(307);
+ tree.erase(239);
+ tree.erase(258);
+ tree.erase(405);
+ tree.erase(56);
+ tree.erase(228);
+ tree.erase(455);
+ tree.erase(317);
+ tree.erase(497);
+ tree.erase(102);
+ tree.erase(117);
+ tree.erase(68);
+ tree.erase(234);
+ tree.erase(51);
+ tree.erase(107);
+ tree.erase(349);
+ tree.erase(348);
+ tree.erase(416);
+ tree.erase(88);
+ tree.erase(89);
+ tree.erase(366);
+ tree.erase(109);
+ tree.erase(189);
+ tree.erase(333);
+ tree.erase(3);
+ tree.erase(394);
+ tree.erase(267);
+ tree.erase(269);
+ tree.erase(246);
+ tree.erase(152);
+ tree.erase(173);
+ tree.erase(438);
+ tree.erase(24);
+ tree.erase(15);
+ tree.erase(390);
+ tree.erase(284);
+ tree.erase(360);
+ tree.erase(371);
+ tree.erase(81);
+ tree.erase(65);
+ tree.erase(299);
+ tree.erase(132);
+ tree.erase(98);
+ tree.erase(303);
+ tree.erase(139);
+ tree.erase(453);
+ tree.erase(402);
+ tree.erase(20);
+ tree.erase(54);
+ tree.erase(499);
+ tree.erase(260);
+ tree.erase(285);
+ tree.erase(381);
+ tree.erase(357);
+ tree.erase(248);
+ tree.erase(362);
+ tree.erase(62);
+ tree.erase(203);
+ tree.erase(411);
+ tree.erase(444);
+ tree.erase(388);
+ tree.erase(10);
+ tree.erase(342);
+ tree.erase(229);
+ tree.erase(481);
+ tree.erase(369);
+ tree.erase(378);
+ tree.erase(38);
+ tree.erase(77);
+ tree.erase(415);
+ tree.erase(466);
+ tree.erase(404);
+ tree.erase(90);
+ tree.erase(101);
+ tree.erase(169);
+ tree.erase(435);
+ tree.erase(296);
+ tree.erase(282);
+ tree.erase(63);
+ tree.erase(52);
+ tree.erase(40);
+ tree.erase(231);
+ tree.erase(302);
+ tree.erase(18);
+ tree.erase(383);
+ tree.erase(194);
+ tree.erase(351);
+ tree.erase(254);
+ tree.erase(431);
+ tree.erase(199);
+ tree.erase(80);
+ tree.erase(300);
+ tree.erase(140);
+ tree.erase(324);
+ tree.erase(286);
+ tree.erase(188);
+ tree.erase(386);
+ tree.erase(344);
+ tree.erase(166);
+ tree.erase(4);
+ tree.erase(226);
+ tree.erase(316);
+ tree.erase(158);
+ tree.erase(447);
+ tree.erase(86);
+ tree.erase(398);
+ tree.erase(108);
+ tree.erase(230);
+ tree.erase(310);
+ tree.erase(495);
+ tree.erase(171);
+ tree.erase(380);
+ tree.erase(249);
+ tree.erase(433);
+ tree.erase(16);
+ tree.erase(470);
+ tree.erase(277);
+ tree.erase(21);
+ tree.erase(372);
+ tree.erase(252);
+ tree.erase(424);
+ tree.erase(144);
+ tree.erase(377);
+ tree.erase(59);
+ tree.erase(46);
+ tree.erase(55);
+ tree.erase(429);
+ tree.erase(474);
+ tree.erase(321);
+ tree.erase(399);
+ tree.erase(471);
+ tree.erase(237);
+ tree.erase(442);
+ tree.erase(97);
+ tree.erase(220);
+ tree.erase(445);
+ tree.erase(326);
+ tree.erase(37);
+ tree.erase(336);
+ tree.erase(343);
+ tree.erase(412);
+ tree.erase(409);
+ tree.erase(460);
+ tree.erase(57);
+ tree.erase(168);
+ tree.erase(295);
+ tree.erase(247);
+ tree.erase(482);
+ tree.erase(425);
+ tree.erase(256);
+ tree.erase(96);
+ tree.erase(53);
+ tree.erase(469);
+ tree.erase(162);
+ tree.erase(493);
+ tree.erase(294);
+ tree.erase(177);
+ tree.erase(212);
+ tree.erase(30);
+ tree.erase(5);
+ tree.erase(193);
+ tree.erase(483);
+ tree.erase(124);
+ tree.erase(87);
+ tree.erase(64);
+ tree.erase(490);
+ tree.erase(155);
+ tree.erase(422);
+ tree.erase(191);
+ tree.erase(75);
+ tree.erase(325);
+ tree.erase(1);
+ tree.erase(182);
+ tree.erase(28);
+ tree.erase(364);
+ tree.erase(42);
+ tree.erase(39);
+ tree.erase(376);
+ tree.erase(467);
+ tree.erase(426);
+ tree.erase(205);
+ tree.erase(365);
+ tree.erase(137);
+ tree.erase(297);
+ tree.erase(462);
+ tree.erase(241);
+ tree.erase(123);
+ tree.erase(206);
+ tree.erase(440);
+ tree.erase(216);
+ tree.erase(146);
+ tree.erase(142);
+ tree.erase(72);
+ tree.erase(379);
+ tree.erase(472);
+ tree.erase(305);
+ tree.erase(271);
+ tree.erase(298);
+ tree.erase(232);
+ tree.erase(242);
+ tree.erase(184);
+ tree.erase(138);
+ tree.erase(154);
+ tree.erase(200);
+ tree.erase(71);
+ tree.erase(211);
+ tree.erase(274);
+ tree.erase(263);
+ tree.erase(311);
+ tree.erase(428);
+ tree.erase(331);
+ tree.erase(7);
+ tree.erase(345);
+ tree.erase(185);
+ tree.erase(338);
+ tree.erase(251);
+ tree.erase(417);
+ tree.erase(12);
+ tree.erase(93);
+ tree.erase(204);
+ tree.erase(257);
+ tree.erase(418);
+ tree.erase(314);
+
+ if (!tree.empty())
+ return false;
+
+ return true;
+}
+
+bool
+test09() {
+
+ // Pseudo-random insertion and erases, pseudo-randomly interleaved.
+
+ CO_Tree tree;
+
+ tree.insert(172261, 5);
+ tree.insert(690360, 5);
+ tree.erase(228023);
+ tree.erase(81);
+ tree.erase(903190);
+ tree.erase(618996);
+ tree.erase(214677);
+ tree.insert(730690, 5);
+ tree.insert(764524, 5);
+ tree.erase(349614);
+ tree.insert(328205, 5);
+ tree.insert(726312, 5);
+ tree.insert(565100, 5);
+ tree.insert(602726, 5);
+ tree.insert(204916, 5);
+ tree.insert(325578, 5);
+ tree.erase(528946);
+ tree.insert(302647, 5);
+ tree.insert(799051, 5);
+ tree.insert(799631, 5);
+ tree.erase(830857);
+ tree.erase(541312);
+ tree.insert(439214, 5);
+ tree.erase(193512);
+ tree.insert(14412, 5);
+ tree.erase(909610);
+ tree.erase(966189);
+ tree.insert(806355, 5);
+ tree.erase(356620);
+ tree.erase(198987);
+ tree.insert(498338, 5);
+ tree.insert(487770, 5);
+ tree.insert(56856, 5);
+ tree.erase(300606);
+ tree.insert(125849, 5);
+ tree.erase(107205);
+ tree.erase(35217);
+ tree.insert(34945, 5);
+ tree.erase(436873);
+ tree.insert(710873, 5);
+ tree.erase(804289);
+ tree.erase(826607);
+ tree.insert(772757, 5);
+ tree.insert(334471, 5);
+ tree.erase(591100);
+ tree.erase(723618);
+ tree.insert(58025, 5);
+ tree.insert(633074, 5);
+ tree.erase(518157);
+ tree.erase(3493);
+ tree.insert(550270, 5);
+ tree.erase(633417);
+ tree.erase(275569);
+ tree.erase(92622);
+ tree.insert(413173, 5);
+ tree.erase(196431);
+ tree.insert(456682, 5);
+ tree.insert(504292, 5);
+ tree.erase(205057);
+ tree.erase(391521);
+ tree.erase(888574);
+ tree.erase(401947);
+ tree.erase(359231);
+ tree.erase(610537);
+ tree.insert(485054, 5);
+ tree.insert(554098, 5);
+ tree.erase(241081);
+ tree.insert(653516, 5);
+ tree.insert(372231, 5);
+ tree.erase(261796);
+ tree.insert(582338, 5);
+ tree.insert(519218, 5);
+ tree.erase(513970);
+ tree.insert(784812, 5);
+ tree.erase(894977);
+ tree.erase(31536);
+ tree.insert(324176, 5);
+ tree.erase(279207);
+ tree.erase(984857);
+ tree.insert(593499, 5);
+ tree.erase(20127);
+ tree.insert(505236, 5);
+ tree.insert(367818, 5);
+ tree.erase(810563);
+ tree.erase(421244);
+ tree.erase(41805);
+ tree.insert(563291, 5);
+ tree.erase(558955);
+ tree.insert(133589, 5);
+ tree.insert(828993, 5);
+ tree.insert(552805, 5);
+ tree.insert(844822, 5);
+ tree.insert(326717, 5);
+ tree.insert(593093, 5);
+ tree.insert(530126, 5);
+ tree.erase(781486);
+ tree.erase(850543);
+ tree.insert(327814, 5);
+ tree.erase(478179);
+ tree.erase(474762);
+ tree.erase(727088);
+ tree.erase(935710);
+ tree.insert(110294, 5);
+ tree.erase(400346);
+ tree.erase(871137);
+ tree.erase(305153);
+ tree.erase(122573);
+ tree.insert(300925, 5);
+ tree.erase(306710);
+ tree.insert(277217, 5);
+ tree.insert(596963, 5);
+ tree.erase(387090);
+ tree.insert(378130, 5);
+ tree.insert(698571, 5);
+ tree.erase(369633);
+ tree.erase(304789);
+ tree.erase(722604);
+ tree.erase(419805);
+ tree.insert(767868, 5);
+ tree.erase(109485);
+ tree.insert(82195, 5);
+ tree.erase(62949);
+ tree.insert(80967, 5);
+ tree.insert(686763, 5);
+ tree.erase(290596);
+ tree.erase(740865);
+ tree.insert(539036, 5);
+ tree.erase(367770);
+ tree.insert(359211, 5);
+ tree.insert(322532, 5);
+ tree.insert(272379, 5);
+ tree.erase(858270);
+ tree.insert(384172, 5);
+ tree.erase(344234);
+ tree.insert(647283, 5);
+ tree.insert(307398, 5);
+ tree.insert(901063, 5);
+ tree.erase(966950);
+ tree.insert(250573, 5);
+ tree.insert(886059, 5);
+ tree.insert(134047, 5);
+ tree.insert(945082, 5);
+ tree.erase(271232);
+ tree.insert(622954, 5);
+ tree.erase(411898);
+ tree.insert(875640, 5);
+ tree.insert(89159, 5);
+ tree.insert(679262, 5);
+ tree.erase(561041);
+ tree.insert(141723, 5);
+ tree.insert(26272, 5);
+ tree.insert(454154, 5);
+ tree.erase(335821);
+ tree.erase(909365);
+ tree.erase(591171);
+ tree.insert(160269, 5);
+ tree.insert(938701, 5);
+ tree.erase(914653);
+ tree.erase(450907);
+ tree.erase(356728);
+ tree.insert(515797, 5);
+ tree.insert(547084, 5);
+ tree.insert(515334, 5);
+ tree.insert(110991, 5);
+ tree.insert(798898, 5);
+ tree.erase(801052);
+ tree.erase(218189);
+ tree.erase(752506);
+ tree.insert(709016, 5);
+ tree.insert(173109, 5);
+ tree.erase(490000);
+ tree.insert(58109, 5);
+ tree.erase(955081);
+ tree.insert(671338, 5);
+ tree.erase(59426);
+ tree.erase(785147);
+ tree.erase(776787);
+ tree.erase(696532);
+ tree.insert(591281, 5);
+ tree.erase(884850);
+ tree.erase(576590);
+ tree.insert(215350, 5);
+ tree.erase(973813);
+ tree.erase(381494);
+ tree.erase(146081);
+ tree.erase(15720);
+ tree.erase(887982);
+ tree.erase(97487);
+ tree.erase(79296);
+ tree.erase(765404);
+ tree.insert(796892, 5);
+ tree.erase(230297);
+ tree.insert(399134, 5);
+ tree.erase(898506);
+ tree.erase(767057);
+ tree.insert(380595, 5);
+ tree.erase(501962);
+ tree.erase(687483);
+ tree.insert(80154, 5);
+ tree.erase(191309);
+ tree.erase(139932);
+ tree.insert(895021, 5);
+ tree.insert(313563, 5);
+ tree.insert(903682, 5);
+ tree.erase(277685);
+ tree.insert(564285, 5);
+ tree.insert(735990, 5);
+ tree.erase(197314);
+ tree.insert(754116, 5);
+ tree.insert(641892, 5);
+ tree.erase(395528);
+ tree.erase(897525);
+ tree.insert(651136, 5);
+ tree.insert(889618, 5);
+ tree.erase(170337);
+ tree.insert(506582, 5);
+ tree.erase(804310);
+ tree.erase(370888);
+ tree.erase(426815);
+ tree.insert(543437, 5);
+ tree.erase(460008);
+ tree.insert(811783, 5);
+ tree.insert(418657, 5);
+ tree.erase(363827);
+ tree.insert(621269, 5);
+ tree.erase(726651);
+ tree.erase(60910);
+ tree.insert(430639, 5);
+ tree.insert(241888, 5);
+ tree.insert(992393, 5);
+ tree.erase(433890);
+ tree.insert(755199, 5);
+ tree.insert(416931, 5);
+ tree.erase(388777);
+ tree.erase(400657);
+ tree.insert(580952, 5);
+ tree.erase(72641);
+ tree.erase(89368);
+ tree.insert(918184, 5);
+ tree.erase(696776);
+ tree.erase(975266);
+ tree.insert(588954, 5);
+ tree.insert(80308, 5);
+ tree.erase(297278);
+ tree.erase(372555);
+ tree.insert(250774, 5);
+ tree.erase(305000);
+ tree.erase(560997);
+ tree.erase(648412);
+ tree.erase(598382);
+ tree.erase(914693);
+ tree.insert(942439, 5);
+ tree.insert(88421, 5);
+ tree.erase(994985);
+ tree.erase(1354);
+ tree.erase(578762);
+ tree.insert(631541, 5);
+ tree.insert(561852, 5);
+ tree.insert(703662, 5);
+ tree.insert(550399, 5);
+ tree.erase(665154);
+ tree.erase(399015);
+ tree.insert(839851, 5);
+ tree.insert(724790, 5);
+ tree.erase(942491);
+ tree.insert(570037, 5);
+ tree.erase(18859);
+ tree.insert(360871, 5);
+ tree.insert(576987, 5);
+ tree.insert(146590, 5);
+ tree.erase(563970);
+ tree.insert(587665, 5);
+ tree.erase(893069);
+ tree.erase(907361);
+ tree.erase(41351);
+ tree.insert(189300, 5);
+ tree.insert(291638, 5);
+ tree.erase(709364);
+ tree.erase(581032);
+ tree.insert(136104, 5);
+ tree.erase(273679);
+ tree.erase(413412);
+ tree.insert(734969, 5);
+ tree.insert(916170, 5);
+ tree.insert(162844, 5);
+ tree.insert(406649, 5);
+ tree.insert(304465, 5);
+ tree.insert(922326, 5);
+ tree.insert(660183, 5);
+ tree.erase(826969);
+ tree.erase(320152);
+ tree.erase(924393);
+ tree.insert(637289, 5);
+ tree.erase(259631);
+ tree.erase(584264);
+ tree.erase(774548);
+ tree.erase(101877);
+ tree.erase(666833);
+ tree.insert(994949, 5);
+ tree.erase(665155);
+ tree.erase(678468);
+ tree.insert(400960, 5);
+ tree.erase(98823);
+ tree.insert(213171, 5);
+ tree.insert(185677, 5);
+ tree.insert(493245, 5);
+ tree.erase(572761);
+ tree.insert(150323, 5);
+ tree.insert(84100, 5);
+ tree.insert(461075, 5);
+ tree.insert(322042, 5);
+ tree.insert(42659, 5);
+ tree.erase(456289);
+ tree.insert(293469, 5);
+ tree.insert(841551, 5);
+ tree.insert(125383, 5);
+ tree.erase(63133);
+ tree.erase(19304);
+ tree.insert(365981, 5);
+ tree.erase(953666);
+ tree.erase(788967);
+ tree.insert(90192, 5);
+ tree.erase(380902);
+ tree.insert(88131, 5);
+ tree.insert(683174, 5);
+ tree.erase(649718);
+ tree.insert(301183, 5);
+ tree.erase(945487);
+ tree.insert(434573, 5);
+ tree.erase(725062);
+ tree.erase(713933);
+ tree.erase(312496);
+ tree.insert(893141, 5);
+ tree.erase(971726);
+ tree.insert(596980, 5);
+ tree.erase(843485);
+ tree.insert(372305, 5);
+ tree.insert(264029, 5);
+ tree.erase(206898);
+ tree.insert(734562, 5);
+ tree.insert(417719, 5);
+ tree.insert(411641, 5);
+ tree.insert(593010, 5);
+ tree.insert(992726, 5);
+ tree.erase(628789);
+ tree.insert(303708, 5);
+ tree.erase(600938);
+ tree.erase(152493);
+ tree.erase(980710);
+ tree.insert(785905, 5);
+ tree.insert(49613, 5);
+ tree.erase(963638);
+ tree.insert(79421, 5);
+ tree.erase(207829);
+ tree.erase(96180);
+ tree.erase(209095);
+ tree.erase(843024);
+ tree.insert(749154, 5);
+ tree.insert(10569, 5);
+ tree.insert(979969, 5);
+ tree.insert(492373, 5);
+ tree.insert(498433, 5);
+ tree.erase(932587);
+ tree.erase(620094);
+ tree.erase(291499);
+ tree.erase(7339);
+ tree.insert(551742, 5);
+ tree.insert(312086, 5);
+ tree.erase(231349);
+ tree.erase(950186);
+ tree.erase(495011);
+ tree.insert(874133, 5);
+ tree.erase(812722);
+ tree.erase(806773);
+ tree.erase(881519);
+ tree.insert(495354, 5);
+ tree.insert(103124, 5);
+ tree.erase(16259);
+ tree.erase(677418);
+ tree.erase(981712);
+ tree.erase(558705);
+ tree.insert(342733, 5);
+ tree.erase(992734);
+ tree.erase(774315);
+ tree.erase(691087);
+ tree.erase(100669);
+ tree.insert(916487, 5);
+ tree.insert(556837, 5);
+ tree.insert(598089, 5);
+ tree.insert(585205, 5);
+ tree.insert(666704, 5);
+ tree.erase(402557);
+ tree.erase(623403);
+ tree.insert(321892, 5);
+ tree.erase(571522);
+ tree.erase(302443);
+ tree.erase(325361);
+ tree.insert(273378, 5);
+ tree.erase(332700);
+ tree.erase(574882);
+ tree.erase(804899);
+ tree.erase(242589);
+ tree.insert(650353, 5);
+ tree.insert(966948, 5);
+ tree.insert(163036, 5);
+ tree.insert(277107, 5);
+ tree.insert(665417, 5);
+ tree.insert(115921, 5);
+ tree.insert(98480, 5);
+ tree.insert(105994, 5);
+ tree.insert(774123, 5);
+ tree.erase(832933);
+ tree.insert(86317, 5);
+ tree.insert(933931, 5);
+ tree.erase(186709);
+ tree.erase(959156);
+ tree.insert(217069, 5);
+ tree.erase(712995);
+ tree.insert(1171, 5);
+ tree.erase(148569);
+ tree.erase(264801);
+ tree.insert(26652, 5);
+ tree.erase(105340);
+ tree.erase(251743);
+ tree.insert(613091, 5);
+ tree.erase(906527);
+ tree.insert(798878, 5);
+ tree.insert(3050, 5);
+ tree.insert(362124, 5);
+ tree.erase(304213);
+ tree.insert(478499, 5);
+ tree.insert(56794, 5);
+ tree.insert(465115, 5);
+ tree.erase(79342);
+ tree.erase(482437);
+ tree.erase(663198);
+ tree.insert(169939, 5);
+ tree.insert(226513, 5);
+ tree.erase(865128);
+ tree.erase(511804);
+ tree.erase(352346);
+ tree.erase(898138);
+ tree.erase(190495);
+ tree.insert(36421, 5);
+ tree.insert(387226, 5);
+ tree.insert(134158, 5);
+ tree.erase(120356);
+ tree.insert(77645, 5);
+ tree.insert(993446, 5);
+ tree.erase(568111);
+ tree.erase(417603);
+ tree.erase(255825);
+ tree.insert(470216, 5);
+ tree.erase(379174);
+ tree.insert(960596, 5);
+ tree.insert(846267, 5);
+ tree.insert(342013, 5);
+ tree.erase(980519);
+ tree.insert(194650, 5);
+ tree.insert(117832, 5);
+ tree.insert(390279, 5);
+ tree.insert(963953, 5);
+ tree.erase(959295);
+ tree.insert(96107, 5);
+ tree.erase(714937);
+ tree.insert(944976, 5);
+ tree.insert(444584, 5);
+ tree.erase(720083);
+ tree.insert(199492, 5);
+ tree.erase(766496);
+ tree.insert(22939, 5);
+ tree.erase(505735);
+ tree.insert(389873, 5);
+ tree.insert(930164, 5);
+ tree.erase(52251);
+ tree.erase(682751);
+ tree.insert(816339, 5);
+ tree.insert(953165, 5);
+ tree.insert(688302, 5);
+ tree.erase(761079);
+ tree.erase(262547);
+ tree.erase(568484);
+ tree.erase(939561);
+ tree.erase(621931);
+ tree.erase(420528);
+ tree.erase(815494);
+ tree.erase(517543);
+ tree.erase(841123);
+ tree.insert(840187, 5);
+ tree.erase(524643);
+ tree.insert(851988, 5);
+ tree.insert(851320, 5);
+ tree.insert(854098, 5);
+ tree.insert(993018, 5);
+ tree.insert(886463, 5);
+ tree.insert(494695, 5);
+ tree.insert(976505, 5);
+ tree.erase(856142);
+ tree.insert(868098, 5);
+ tree.erase(571472);
+
+ return true;
+}
+
+bool
+test10() {
+
+ CO_Tree tree;
+
+ CO_Tree::iterator itr = tree.end();
+
+ itr = tree.insert(itr, 1, Coefficient(10));
+
+ itr = tree.end();
+
+ itr = tree.insert(itr, 2, 0);
+ itr = tree.insert(itr, 2, 0);
+ itr = tree.insert(itr, 4, 0);
+ itr = tree.insert(itr, 6, 0);
+ itr = tree.insert(itr, 8, 0);
+ itr = tree.insert(itr, 10, 0);
+ itr = tree.insert(itr, 12, 0);
+
+ if (itr.index() != 12)
+ return false;
+
+ --itr;
+ --itr;
+
+ itr = tree.insert(itr, 5, 0);
+ itr = tree.erase(itr);
+
+ if (itr.index() != 6)
+ return false;
+
+ itr = tree.insert(itr, 5, 0);
+ itr = tree.erase(itr);
+
+ if (itr.index() != 6)
+ return false;
+
+ return true;
+}
+
+bool
+test11() {
+
+ CO_Tree tree;
+
+ tree.insert(1, 10);
+
+ tree.erase_element_and_shift_left(1);
+
+ if (!tree.empty())
+ return false;
+
+ tree.increase_keys_from(1, 5);
+
+ if (!tree.empty())
+ return false;
+
+ tree.insert(1, 0);
+ tree.insert(2, 0);
+ tree.insert(3, 0);
+ tree.insert(4, 0);
+
+ tree.increase_keys_from(2, 5);
+
+ CO_Tree::iterator itr = tree.begin();
+
+ if (itr.index() != 1)
+ return false;
+
+ ++itr;
+
+ if (itr.index() != 7)
+ return false;
+
+ ++itr;
+
+ if (itr.index() != 8)
+ return false;
+
+ ++itr;
+
+ if (itr.index() != 9)
+ return false;
+
+ ++itr;
+
+ if (itr != tree.end())
+ return false;
+
+ return true;
+}
+
+bool
+test12() {
+
+ CO_Tree tree;
+
+ tree.insert(1, 10);
+ tree.insert(2, 10);
+ tree.insert(3, 10);
+
+ tree.clear();
+
+ if (!tree.empty())
+ return false;
+
+ if (tree.erase(1) != tree.end())
+ return false;
+
+ CO_Tree::iterator itr = tree.end();
+
+ if (tree.bisect_near(itr, 1) != tree.end())
+ return false;
+
+ CO_Tree::const_iterator citr = tree.cend();
+
+ if (tree.bisect_near(citr, 1) != tree.cend())
+ return false;
+
+ if (static_cast<const CO_Tree&>(tree).bisect(1) != tree.end())
+ return false;
+
+ return true;
+}
+
+bool
+test13() {
+
+ CO_Tree tree;
+
+ tree.insert(2, 10);
+ tree.insert(2, 10);
+ tree.insert(4, 10);
+ tree.insert(6, 10);
+ tree.insert(8, 10);
+ tree.insert(10, 10);
+ tree.insert(12, 10);
+ tree.insert(14, 10);
+
+ CO_Tree::iterator itr;
+
+ itr = tree.bisect(12);
+
+ if (itr.index() != 12)
+ return false;
+
+ itr = tree.bisect_near(itr, 4);
+
+ if (itr.index() != 4)
+ return false;
+
+ itr = tree.bisect(12);
+ itr = tree.bisect_near(itr, 10);
+
+ if (itr.index() != 10)
+ return false;
+
+ return true;
+}
+
+bool
+test14() {
+
+ // Iterating on an empty tree.
+
+ CO_Tree tree;
+
+ if (tree.begin() != tree.end())
+ return false;
+
+ if (tree.cbegin() != tree.cend())
+ return false;
+
+ tree.erase(1);
+ tree.bisect(1);
+ static_cast<const CO_Tree&>(tree).bisect(1);
+
+ return true;
+}
+
+bool
+test15() {
+
+ // Test iterator::swap(), const_iterator::swap(),
+ // iterator::operator*() and const_iterator::operator*().
+
+ CO_Tree tree;
+
+ tree.insert(1, 1);
+ tree.insert(2, 2);
+
+ CO_Tree::iterator itr1 = tree.bisect(1);
+ CO_Tree::iterator itr2 = tree.bisect(2);
+
+ swap(itr1, itr2);
+
+ if (itr2.index() != 1)
+ return false;
+
+ if (*itr2 != 1)
+ return false;
+
+ if (itr1.index() != 2)
+ return false;
+
+ if (*itr1 != 2)
+ return false;
+
+ CO_Tree::const_iterator itr3 = tree.bisect(1);
+ CO_Tree::const_iterator itr4 = tree.bisect(2);
+
+ swap(itr3, itr4);
+
+ if (itr4.index() != 1)
+ return false;
+
+ if (*itr4 != 1)
+ return false;
+
+ if (itr3.index() != 2)
+ return false;
+
+ if (*itr3 != 2)
+ return false;
+
+ return true;
+}
+
+bool
+test16() {
+
+ // Test iterators' and const_iterators' postfix increment and decrement
+ // operators.
+
+ CO_Tree tree;
+
+ tree.insert(1, 0);
+ tree.insert(2, 0);
+ tree.insert(3, 0);
+
+ CO_Tree::iterator itr = tree.bisect(1);
+
+ itr++;
+
+ if (itr.index() != 2)
+ return false;
+
+ itr++;
+
+ if (itr.index() != 3)
+ return false;
+
+ itr--;
+
+ if (itr.index() != 2)
+ return false;
+
+ itr--;
+
+ if (itr.index() != 1)
+ return false;
+
+ CO_Tree::const_iterator itr2 = tree.bisect(1);
+
+ itr2++;
+
+ if (itr2.index() != 2)
+ return false;
+
+ itr2++;
+
+ if (itr2.index() != 3)
+ return false;
+
+ itr2--;
+
+ if (itr2.index() != 2)
+ return false;
+
+ itr2--;
+
+ if (itr2.index() != 1)
+ return false;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+// A fake test to avoid compiler warnings in BEGIN_MAIN.
+bool test01() {
+ return true;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
+#endif // !PPL_USE_SPARSE_MATRIX
diff --git a/tests/Concrete_Expression/C_Expr.cc b/tests/Concrete_Expression/C_Expr.cc
new file mode 100644
index 0000000..977b71b
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr.cc
@@ -0,0 +1,32 @@
+/* Definitions for the C_Expr class and its subclasses: non-inline,
+ non-template functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "C_Expr_defs.hh"
+
+int
+main() {
+ return 0;
+}
diff --git a/tests/Concrete_Expression/C_Expr_defs.hh b/tests/Concrete_Expression/C_Expr_defs.hh
new file mode 100644
index 0000000..a635a19
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr_defs.hh
@@ -0,0 +1,257 @@
+/* Declarations for the C_Expr class and its subclasses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Expr_defs_hh
+#define PPL_C_Expr_defs_hh 1
+
+#include "Concrete_Expression_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct C_Expr;
+
+enum C_Expr_Kind {
+ BOP,
+ UOP,
+ CAST,
+ INT_CON,
+ FP_CON,
+ APPROX_REF
+};
+
+//! Toy class for testing analysis of floating point computations.
+template <>
+class Concrete_Expression<C_Expr> : public Concrete_Expression_Common<C_Expr> {
+public:
+ //! Builds a concrete expression of the given kind.
+ Concrete_Expression<C_Expr>(Concrete_Expression_Type type, C_Expr_Kind KIND);
+
+ //! Returns the type of \* this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the kind of \* this.
+ Concrete_Expression_Kind kind() const;
+
+ //! The expression's type.
+ Concrete_Expression_Type expr_type;
+
+ //! The expression's kind.
+ C_Expr_Kind expr_kind;
+};
+
+template <>
+class Binary_Operator<C_Expr> : public Concrete_Expression<C_Expr>,
+ public Binary_Operator_Common<C_Expr> {
+public:
+ //! Constructor from operator, lhs and rhs.
+ Binary_Operator<C_Expr>(Concrete_Expression_Type type,
+ Concrete_Expression_BOP binary_operator,
+ const Concrete_Expression<C_Expr>* left_hand_side,
+ const Concrete_Expression<C_Expr>* right_hand_side);
+
+ //! Do-nothing destructor.
+ ~Binary_Operator<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the binary operator of \p *this.
+ Concrete_Expression_BOP binary_operator() const;
+
+ //! Returns the left-hand side of \p *this.
+ const Concrete_Expression<C_Expr>* left_hand_side() const;
+
+ //! Returns the right-hand side of \p *this.
+ const Concrete_Expression<C_Expr>* right_hand_side() const;
+
+ //! Constant identifying binary operator nodes.
+ enum Kind {
+ KIND = BOP
+ };
+
+ //! Constants encoding the different binary operators.
+ enum Operation {
+ ADD,
+ SUB,
+ MUL,
+ DIV,
+ REM,
+ BAND,
+ BOR,
+ BXOR,
+ LSHIFT,
+ RSHIFT
+ };
+
+ //! The operator of \p *this.
+ const Concrete_Expression_BOP bop;
+
+ //! The left-hand side of \p *this.
+ const Concrete_Expression<C_Expr>* lhs;
+
+ //! The right-hand side of \p *this.
+ const Concrete_Expression<C_Expr>* rhs;
+};
+
+template <>
+class Unary_Operator<C_Expr> : public Concrete_Expression<C_Expr>,
+ public Unary_Operator_Common<C_Expr> {
+public:
+ //! Constructor from operator and argument.
+ Unary_Operator<C_Expr>(Concrete_Expression_Type type,
+ Concrete_Expression_UOP unary_operator,
+ const Concrete_Expression<C_Expr>* argument);
+
+ //! Do-nothing destructor.
+ ~Unary_Operator<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the unary operator of \p *this.
+ Concrete_Expression_UOP unary_operator() const;
+
+ //! Returns the argument of \p *this.
+ const Concrete_Expression<C_Expr>* argument() const;
+
+ //! Constant identifying unary operator nodes.
+ enum Kind {
+ KIND = UOP
+ };
+
+ //! Constants encoding the different unary operators.
+ enum Operation {
+ UPLUS,
+ UMINUS,
+ BNOT
+ };
+
+ //! The operator of \p *this.
+ const Concrete_Expression_UOP uop;
+
+ //! The argument of \p *this.
+ const Concrete_Expression<C_Expr>* arg;
+};
+
+template <>
+class Cast_Operator<C_Expr>
+ : public Concrete_Expression<C_Expr>,
+ public Cast_Operator_Common<C_Expr> {
+public:
+ //! Constructor from cast type and argument.
+ Cast_Operator<C_Expr>(Concrete_Expression_Type type,
+ const Concrete_Expression<C_Expr>* ar);
+
+ //! Do-nothing destructor.
+ ~Cast_Operator<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Returns the casted expression.
+ const Concrete_Expression<C_Expr>* argument() const;
+
+ //! Constant identifying cast nodes.
+ enum Kind { KIND = CAST };
+
+ //! The casted expression.
+ const Concrete_Expression<C_Expr>* arg;
+};
+
+template <>
+class Integer_Constant<C_Expr>
+ : public Concrete_Expression<C_Expr>,
+ public Integer_Constant_Common<C_Expr> {
+public:
+ //! Constructor from type and value.
+ Integer_Constant<C_Expr>(Concrete_Expression_Type type,
+ const Integer_Interval& val);
+
+ //! Do-nothing destructor.
+ ~Integer_Constant<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Constant identifying integer constant nodes.
+ enum Kind { KIND = INT_CON };
+
+ //! An interval in which the value of the constant falls.
+ Integer_Interval value;
+};
+
+template <>
+class Floating_Point_Constant<C_Expr>
+ : public Concrete_Expression<C_Expr>,
+ public Floating_Point_Constant_Common<C_Expr> {
+public:
+ //! Constructor from value.
+ Floating_Point_Constant<C_Expr>(const char* value_string,
+ unsigned int string_size);
+
+ //! Do-nothing destructor.
+ ~Floating_Point_Constant<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Constant identifying floating constant nodes.
+ enum Kind { KIND = FP_CON };
+
+ //! The floating point constant as written.
+ char* value;
+};
+
+// The use of Integer_Interval here is for simplicity only.
+template <>
+class Approximable_Reference<C_Expr>
+ : public Concrete_Expression<C_Expr>,
+ public Approximable_Reference_Common<C_Expr> {
+public:
+ //! Builds a reference to the entity having the given index.
+ Approximable_Reference<C_Expr>(Concrete_Expression_Type type,
+ const Integer_Interval& val,
+ dimension_type index);
+
+ //! Do-nothing destructor.
+ ~Approximable_Reference<C_Expr>();
+
+ //! Returns the type of \p *this.
+ Concrete_Expression_Type type() const;
+
+ //! Constant identifying approximable reference nodes.
+ enum Kind { KIND = APPROX_REF };
+
+ //! An interval in which the referenced entity's value falls.
+ Integer_Interval value;
+
+ //! The set of possible indexes for the referenced entity.
+ std::set<dimension_type> dimensions;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "C_Expr_inlines.hh"
+//#include "C_Expr_templates.hh"
+
+#endif // !defined(PPL_C_Expr_defs_hh)
diff --git a/tests/Concrete_Expression/C_Expr_inlines.hh b/tests/Concrete_Expression/C_Expr_inlines.hh
new file mode 100644
index 0000000..c35f888
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr_inlines.hh
@@ -0,0 +1,187 @@
+/* Definitions for the C_Expr class and its subclasses: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Expr_inlines_hh
+#define PPL_C_Expr_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression<C_Expr>::
+Concrete_Expression(const Concrete_Expression_Type type,
+ const C_Expr_Kind KIND)
+ : expr_type(type),
+ expr_kind(KIND) {
+}
+
+inline Concrete_Expression_Kind
+Concrete_Expression<C_Expr>::kind() const {
+ return expr_kind;
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression<C_Expr>::type() const {
+ return expr_type;
+}
+
+inline
+Binary_Operator<C_Expr>
+::Binary_Operator(const Concrete_Expression_Type type,
+ const Concrete_Expression_BOP binary_operator,
+ const Concrete_Expression<C_Expr>* left_hand_side,
+ const Concrete_Expression<C_Expr>* right_hand_side)
+ : Concrete_Expression<C_Expr>(type, BOP),
+ bop(binary_operator),
+ lhs(left_hand_side),
+ rhs(right_hand_side) {
+}
+
+inline
+Binary_Operator<C_Expr>::~Binary_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Binary_Operator<C_Expr>::type() const {
+ return expr_type;
+}
+
+inline Concrete_Expression_BOP
+Binary_Operator<C_Expr>::binary_operator() const {
+ return bop;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Binary_Operator<C_Expr>::left_hand_side() const {
+ return lhs;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Binary_Operator<C_Expr>::right_hand_side() const {
+ return rhs;
+}
+
+inline
+Unary_Operator<C_Expr>
+::Unary_Operator(const Concrete_Expression_Type type,
+ const Concrete_Expression_UOP unary_operator,
+ const Concrete_Expression<C_Expr>* argument)
+ : Concrete_Expression<C_Expr>(type, UOP),
+ uop(unary_operator),
+ arg(argument) {
+}
+
+inline
+Unary_Operator<C_Expr>::~Unary_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Unary_Operator<C_Expr>::type() const {
+ return expr_type;
+}
+
+inline Concrete_Expression_BOP
+Unary_Operator<C_Expr>::unary_operator() const {
+ return uop;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Unary_Operator<C_Expr>::argument() const {
+ return arg;
+}
+
+inline
+Cast_Operator<C_Expr>::
+Cast_Operator(const Concrete_Expression_Type type,
+ const Concrete_Expression<C_Expr>* ar)
+ : Concrete_Expression<C_Expr>(type, CAST),
+ arg(ar) {
+}
+
+inline
+Cast_Operator<C_Expr>::~Cast_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Cast_Operator<C_Expr>::type() const {
+ return expr_type;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Cast_Operator<C_Expr>::argument() const {
+ return arg;
+}
+
+inline
+Integer_Constant<C_Expr>::
+Integer_Constant(Concrete_Expression_Type type,
+ const Integer_Interval& val)
+ : Concrete_Expression<C_Expr>(type, INT_CON),
+ value(val) {
+}
+
+inline
+Integer_Constant<C_Expr>::~Integer_Constant<C_Expr>() {
+}
+
+inline
+Floating_Point_Constant<C_Expr>::
+Floating_Point_Constant(const char* value_string,
+ const unsigned int string_size)
+ : Concrete_Expression<C_Expr>(Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT), FP_CON),
+ value(new char[string_size]) {
+ strcpy(value, value_string);
+}
+
+inline
+Floating_Point_Constant<C_Expr>::~Floating_Point_Constant<C_Expr>() {
+ delete[] value;
+}
+
+inline Concrete_Expression_Type
+Floating_Point_Constant<C_Expr>::type() const {
+ return expr_type;
+}
+
+inline
+Approximable_Reference<C_Expr>::
+Approximable_Reference(Concrete_Expression_Type type,
+ const Integer_Interval& val,
+ dimension_type index)
+ : Concrete_Expression<C_Expr>(type, APPROX_REF),
+ value(val),
+ dimensions() {
+ dimensions.insert(index);
+}
+
+inline
+Approximable_Reference<C_Expr>::~Approximable_Reference<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Approximable_Reference<C_Expr>::type() const {
+ return expr_type;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Expr_inlines_hh)
diff --git a/tests/Concrete_Expression/Makefile.am b/tests/Concrete_Expression/Makefile.am
new file mode 100644
index 0000000..0ba8e68
--- /dev/null
+++ b/tests/Concrete_Expression/Makefile.am
@@ -0,0 +1,181 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ALL_TESTS = \
+C_Expr \
+linearform1 \
+linearize \
+digitalfilters1 \
+bdshape1 \
+bdshape2 \
+octagonalshape1 \
+octagonalshape2 \
+polyhedron1 \
+polyhedron2
+
+BUGS =
+
+
+# There are platforms where no floating-point type is supported.
+if SUPPORTED_SOME_FLOATING_POINT_TYPE
+
+check_PROGRAMS = $(ALL_TESTS) $(BUGS)
+
+TESTS = run_tests.stamp
+
+endif SUPPORTED_SOME_FLOATING_POINT_TYPE
+
+
+# This will be overridden by the `run_tests' script.
+if SUPPORTED_FLOAT
+FLOAT_FLAGS = \
+-DANALYZER_FP_FORMAT=float -DANALYZED_FP_FORMAT=IEEE754_SINGLE
+else
+if SUPPORTED_DOUBLE
+DOUBLE_FLAGS = \
+-DANALYZER_FP_FORMAT=double -DANALYZED_FP_FORMAT=IEEE754_DOUBLE
+else
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_FLAGS = \
+-DANALYZER_FP_FORMAT=long_double -DANALYZED_FP_FORMAT=IEEE754_QUAD
+endif
+endif
+endif
+
+TEST_CPPFLAGS = $(FLOAT_FLAGS) $(DOUBLE_FLAGS) $(LONG_DOUBLE_FLAGS)
+
+dist_check_SCRIPTS = run_tests
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+# Do not change the ordering in what follows.
+# Analyzer format should be less precise or equal than analyzed format.
+if SUPPORTED_FLOAT
+FLOAT_INSTANCES= \
+float/IEEE754_SINGLE \
+float/IEEE754_DOUBLE \
+float/IEEE754_QUAD
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCES= \
+double/IEEE754_DOUBLE \
+double/IEEE754_QUAD
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCES= \
+long_double/IEEE754_QUAD
+endif
+
+# Do not change the ordering in what follows.
+INSTANCES = \
+$(FLOAT_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(LONG_DOUBLE_INSTANCES)
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+
+#
+# Sources for the tests
+#
+
+C_Expr_SOURCES = C_Expr_defs.hh C_Expr_inlines.hh C_Expr.cc
+
+bdshape1_SOURCES = bdshape1.cc
+
+bdshape2_SOURCES = bdshape2.cc
+
+digitalfilters1_SOURCES = digitalfilters1.cc
+
+linearform1_SOURCES = linearform1.cc
+
+linearize_SOURCES = linearize.cc
+
+octagonalshape1_SOURCES = octagonalshape1.cc
+
+octagonalshape2_SOURCES = octagonalshape2.cc
+
+polyhedron1_SOURCES = polyhedron1.cc
+
+polyhedron2_SOURCES = polyhedron2.cc
+
+
+CLEANFILES = \
+run_tests.stamp
+
+
+DISTCLEANFILES = \
+dirty_marker
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Concrete_Expression/Makefile.in b/tests/Concrete_Expression/Makefile.in
new file mode 100644
index 0000000..b2efd80
--- /dev/null
+++ b/tests/Concrete_Expression/Makefile.in
@@ -0,0 +1,1059 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@check_PROGRAMS = \
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@ $(am__EXEEXT_1) \
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@ $(am__EXEEXT_2)
+XFAIL_TESTS =
+subdir = tests/Concrete_Expression
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+ $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = C_Expr$(EXEEXT) linearform1$(EXEEXT) linearize$(EXEEXT) \
+ digitalfilters1$(EXEEXT) bdshape1$(EXEEXT) bdshape2$(EXEEXT) \
+ octagonalshape1$(EXEEXT) octagonalshape2$(EXEEXT) \
+ polyhedron1$(EXEEXT) polyhedron2$(EXEEXT)
+am__EXEEXT_2 =
+am_C_Expr_OBJECTS = C_Expr.$(OBJEXT)
+C_Expr_OBJECTS = $(am_C_Expr_OBJECTS)
+C_Expr_LDADD = $(LDADD)
+C_Expr_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_bdshape1_OBJECTS = bdshape1.$(OBJEXT)
+bdshape1_OBJECTS = $(am_bdshape1_OBJECTS)
+bdshape1_LDADD = $(LDADD)
+bdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bdshape2_OBJECTS = bdshape2.$(OBJEXT)
+bdshape2_OBJECTS = $(am_bdshape2_OBJECTS)
+bdshape2_LDADD = $(LDADD)
+bdshape2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_digitalfilters1_OBJECTS = digitalfilters1.$(OBJEXT)
+digitalfilters1_OBJECTS = $(am_digitalfilters1_OBJECTS)
+digitalfilters1_LDADD = $(LDADD)
+digitalfilters1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_linearform1_OBJECTS = linearform1.$(OBJEXT)
+linearform1_OBJECTS = $(am_linearform1_OBJECTS)
+linearform1_LDADD = $(LDADD)
+linearform1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_linearize_OBJECTS = linearize.$(OBJEXT)
+linearize_OBJECTS = $(am_linearize_OBJECTS)
+linearize_LDADD = $(LDADD)
+linearize_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_octagonalshape1_OBJECTS = octagonalshape1.$(OBJEXT)
+octagonalshape1_OBJECTS = $(am_octagonalshape1_OBJECTS)
+octagonalshape1_LDADD = $(LDADD)
+octagonalshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_octagonalshape2_OBJECTS = octagonalshape2.$(OBJEXT)
+octagonalshape2_OBJECTS = $(am_octagonalshape2_OBJECTS)
+octagonalshape2_LDADD = $(LDADD)
+octagonalshape2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhedron1_OBJECTS = polyhedron1.$(OBJEXT)
+polyhedron1_OBJECTS = $(am_polyhedron1_OBJECTS)
+polyhedron1_LDADD = $(LDADD)
+polyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhedron2_OBJECTS = polyhedron2.$(OBJEXT)
+polyhedron2_OBJECTS = $(am_polyhedron2_OBJECTS)
+polyhedron2_LDADD = $(LDADD)
+polyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(C_Expr_SOURCES) $(bdshape1_SOURCES) $(bdshape2_SOURCES) \
+ $(digitalfilters1_SOURCES) $(linearform1_SOURCES) \
+ $(linearize_SOURCES) $(octagonalshape1_SOURCES) \
+ $(octagonalshape2_SOURCES) $(polyhedron1_SOURCES) \
+ $(polyhedron2_SOURCES)
+DIST_SOURCES = $(C_Expr_SOURCES) $(bdshape1_SOURCES) \
+ $(bdshape2_SOURCES) $(digitalfilters1_SOURCES) \
+ $(linearform1_SOURCES) $(linearize_SOURCES) \
+ $(octagonalshape1_SOURCES) $(octagonalshape2_SOURCES) \
+ $(polyhedron1_SOURCES) $(polyhedron2_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ALL_TESTS = \
+C_Expr \
+linearform1 \
+linearize \
+digitalfilters1 \
+bdshape1 \
+bdshape2 \
+octagonalshape1 \
+octagonalshape2 \
+polyhedron1 \
+polyhedron2
+
+BUGS =
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@TESTS = run_tests.stamp
+
+# This will be overridden by the `run_tests' script.
+ at SUPPORTED_FLOAT_TRUE@FLOAT_FLAGS = \
+ at SUPPORTED_FLOAT_TRUE@-DANALYZER_FP_FORMAT=float -DANALYZED_FP_FORMAT=IEEE754_SINGLE
+
+ at SUPPORTED_DOUBLE_TRUE@@SUPPORTED_FLOAT_FALSE at DOUBLE_FLAGS = \
+ at SUPPORTED_DOUBLE_TRUE@@SUPPORTED_FLOAT_FALSE at -DANALYZER_FP_FORMAT=double -DANALYZED_FP_FORMAT=IEEE754_DOUBLE
+
+ at SUPPORTED_DOUBLE_FALSE@@SUPPORTED_FLOAT_FALSE@@SUPPORTED_LONG_DOUBLE_TRUE at LONG_DOUBLE_FLAGS = \
+ at SUPPORTED_DOUBLE_FALSE@@SUPPORTED_FLOAT_FALSE@@SUPPORTED_LONG_DOUBLE_TRUE at -DANALYZER_FP_FORMAT=long_double -DANALYZED_FP_FORMAT=IEEE754_QUAD
+
+TEST_CPPFLAGS = $(FLOAT_FLAGS) $(DOUBLE_FLAGS) $(LONG_DOUBLE_FLAGS)
+dist_check_SCRIPTS = run_tests
+
+# Do not change the ordering in what follows.
+# Analyzer format should be less precise or equal than analyzed format.
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_SINGLE \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_DOUBLE \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_QUAD
+
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = \
+ at SUPPORTED_DOUBLE_TRUE@double/IEEE754_DOUBLE \
+ at SUPPORTED_DOUBLE_TRUE@double/IEEE754_QUAD
+
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCES = \
+ at SUPPORTED_LONG_DOUBLE_TRUE@long_double/IEEE754_QUAD
+
+
+# Do not change the ordering in what follows.
+INSTANCES = \
+$(FLOAT_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(LONG_DOUBLE_INSTANCES)
+
+
+#
+# Sources for the tests
+#
+C_Expr_SOURCES = C_Expr_defs.hh C_Expr_inlines.hh C_Expr.cc
+bdshape1_SOURCES = bdshape1.cc
+bdshape2_SOURCES = bdshape2.cc
+digitalfilters1_SOURCES = digitalfilters1.cc
+linearform1_SOURCES = linearform1.cc
+linearize_SOURCES = linearize.cc
+octagonalshape1_SOURCES = octagonalshape1.cc
+octagonalshape2_SOURCES = octagonalshape2.cc
+polyhedron1_SOURCES = polyhedron1.cc
+polyhedron2_SOURCES = polyhedron2.cc
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Concrete_Expression/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Concrete_Expression/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+C_Expr$(EXEEXT): $(C_Expr_OBJECTS) $(C_Expr_DEPENDENCIES) $(EXTRA_C_Expr_DEPENDENCIES)
+ @rm -f C_Expr$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(C_Expr_OBJECTS) $(C_Expr_LDADD) $(LIBS)
+
+bdshape1$(EXEEXT): $(bdshape1_OBJECTS) $(bdshape1_DEPENDENCIES) $(EXTRA_bdshape1_DEPENDENCIES)
+ @rm -f bdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bdshape1_OBJECTS) $(bdshape1_LDADD) $(LIBS)
+
+bdshape2$(EXEEXT): $(bdshape2_OBJECTS) $(bdshape2_DEPENDENCIES) $(EXTRA_bdshape2_DEPENDENCIES)
+ @rm -f bdshape2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bdshape2_OBJECTS) $(bdshape2_LDADD) $(LIBS)
+
+digitalfilters1$(EXEEXT): $(digitalfilters1_OBJECTS) $(digitalfilters1_DEPENDENCIES) $(EXTRA_digitalfilters1_DEPENDENCIES)
+ @rm -f digitalfilters1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(digitalfilters1_OBJECTS) $(digitalfilters1_LDADD) $(LIBS)
+
+linearform1$(EXEEXT): $(linearform1_OBJECTS) $(linearform1_DEPENDENCIES) $(EXTRA_linearform1_DEPENDENCIES)
+ @rm -f linearform1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(linearform1_OBJECTS) $(linearform1_LDADD) $(LIBS)
+
+linearize$(EXEEXT): $(linearize_OBJECTS) $(linearize_DEPENDENCIES) $(EXTRA_linearize_DEPENDENCIES)
+ @rm -f linearize$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(linearize_OBJECTS) $(linearize_LDADD) $(LIBS)
+
+octagonalshape1$(EXEEXT): $(octagonalshape1_OBJECTS) $(octagonalshape1_DEPENDENCIES) $(EXTRA_octagonalshape1_DEPENDENCIES)
+ @rm -f octagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(octagonalshape1_OBJECTS) $(octagonalshape1_LDADD) $(LIBS)
+
+octagonalshape2$(EXEEXT): $(octagonalshape2_OBJECTS) $(octagonalshape2_DEPENDENCIES) $(EXTRA_octagonalshape2_DEPENDENCIES)
+ @rm -f octagonalshape2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(octagonalshape2_OBJECTS) $(octagonalshape2_LDADD) $(LIBS)
+
+polyhedron1$(EXEEXT): $(polyhedron1_OBJECTS) $(polyhedron1_DEPENDENCIES) $(EXTRA_polyhedron1_DEPENDENCIES)
+ @rm -f polyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhedron1_OBJECTS) $(polyhedron1_LDADD) $(LIBS)
+
+polyhedron2$(EXEEXT): $(polyhedron2_OBJECTS) $(polyhedron2_DEPENDENCIES) $(EXTRA_polyhedron2_DEPENDENCIES)
+ @rm -f polyhedron2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhedron2_OBJECTS) $(polyhedron2_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Expr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshape2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/digitalfilters1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearform1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearize.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octagonalshape2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhedron2.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ fi; \
+ echo "$${col}$$dashes$${std}"; \
+ echo "$${col}$$banner$${std}"; \
+ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+ test -z "$$report" || echo "$${col}$$report$${std}"; \
+ echo "$${col}$$dashes$${std}"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+ $(dist_check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Concrete_Expression/bdshape1.cc b/tests/Concrete_Expression/bdshape1.cc
new file mode 100644
index 0000000..f94e8d1
--- /dev/null
+++ b/tests/Concrete_Expression/bdshape1.cc
@@ -0,0 +1,335 @@
+/* Test BD_Shape::affine_form_image on interval linear forms.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests space_dimensions and trivial cases.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ FP_BD_Shape bd1(0);
+ bool ok1 = false;
+ FP_Linear_Form l(A);
+
+ try {
+ bd1.affine_form_image(A, l);
+ }
+ catch(std::invalid_argument e) {
+ nout << "bd1_space_dim < lf_space_dim" << endl;
+ ok1 = true;
+ }
+
+ bool ok2 = false;
+ FP_BD_Shape bd2(1);
+
+ try {
+ bd2.affine_form_image(B, l);
+ }
+ catch(std::invalid_argument e) {
+ nout << "space_dim < var_id + 1" << endl;
+ bd2.affine_form_image(A, l);
+ Constraint_System cs(A < A);
+ bd2.add_constraints(cs);
+ bd2.affine_form_image(A, l);
+ ok2 = true;
+ }
+
+ return ok1 && ok2;
+}
+
+
+// Tests affine_form_image(A, [-2, 1]).
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(-2);
+ free_term.join_assign(1);
+ FP_Linear_Form l(free_term);
+ bd1.affine_form_image(A, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(A, [-2, 1]) ***");
+
+ FP_BD_Shape known_result(2);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(-A <= 2);
+ known_result.add_constraint(B <= 2);
+ print_constraints(bd1, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*A + [0.5, 2]).
+bool test03() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(static_cast<FP_Interval::boundary_type>(0.5));
+ free_term.join_assign(2);
+ FP_Linear_Form l(-A);
+ l += free_term;
+ bd1.affine_form_image(A, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(A, -A + [0.5, 2]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(-2*A <= 3);
+ known_result.add_constraint(B <= 2);
+ print_constraints(known_result, "*** known_result ***");
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*B + [-1.5, 3.5]).
+bool test04() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(static_cast<FP_Interval::boundary_type>(-1.5));
+ free_term.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+ FP_Linear_Form l(B);
+ l += free_term;
+ bd1.affine_form_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(B, B + [-1.5, 3.5]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(2*B <= 11);
+ known_result.add_constraint(-2*B + 2*A <= 9);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, [1, 1]*B + [-1, 0.5]).
+bool test05() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(-1);
+ free_term.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+ FP_Linear_Form l(B);
+ l += free_term;
+ bd1.affine_form_image(A, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(A, B + [-1, 0.5]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(2*A <= 5);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B - A <= 1);
+ known_result.add_constraint(2*A - 2*B <= 1);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*A + [-3, 1]).
+bool test06() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(-3);
+ free_term.join_assign(1);
+ FP_Linear_Form l(A);
+ l += free_term;
+ bd1.affine_form_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(B, A + [-3, 1]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 3);
+ known_result.add_constraint(B - A <= 1);
+ known_result.add_constraint(A - B <= 3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [-1, -1]*A + [0, 4]).
+bool test07() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval free_term(0);
+ free_term.join_assign(4);
+ FP_Linear_Form l(-A);
+ l += free_term;
+ bd1.affine_form_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(B, -A + [0, 4]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(-B <= 2);
+ known_result.add_constraint(A - B <= 4);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*B + [0, 2]).
+bool test08() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ bd1.add_constraint(B >= -10);
+ FP_Interval free_term(0);
+ free_term.join_assign(2);
+ FP_Linear_Form l(-B);
+ l += free_term;
+ bd1.affine_form_image(A, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(A, -B + [0, 2]) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(-A <= 2);
+ known_result.add_constraint(A <= 12);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B >= -10);
+ known_result.add_constraint(-A + B <= 4);
+ known_result.add_constraint(A - B <= 22);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [-0.5, 0.5]*A).
+bool test09() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Interval coeff(static_cast<FP_Interval::boundary_type>(-0.5));
+ coeff.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+ FP_Linear_Form l(A);
+ l *= coeff;
+ bd1.affine_form_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_form_image(B, [-0.5, 0.5]*A) ***");
+
+ FP_BD_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(A - B <= 3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, i + i0*A + i1*B) where
+// i = [0, 2], i0 = [1, 1] and i1 = [1, 2].
+bool test10() {
+
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B <= 2);
+ bd1.add_constraint(A - B >= 0);
+ FP_Interval tmp(1);
+ FP_Linear_Form l(A);
+ l *= tmp;
+ tmp.lower() = 0;
+ tmp.upper() = 2;
+ l += tmp;
+ tmp.lower() = 1;
+ tmp.upper() = 2;
+ l += tmp * FP_Linear_Form(B);
+ bd1.affine_form_image(A,l);
+ print_constraints(bd1, "*** bd1.affine_form_image(A, i + i0*A + i1*B) ***");
+
+ FP_BD_Shape know_result(2);
+ know_result.add_constraint(A >= 0);
+ know_result.add_constraint(A <= 8);
+ know_result.add_constraint(B >= 0);
+ know_result.add_constraint(B <= 2);
+ know_result.add_constraint(A - B <= 6);
+ know_result.add_constraint(-A + B <= 0);
+ print_constraints(know_result, "*** know_result ***");
+
+ bool ok = (bd1 == know_result);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/bdshape2.cc b/tests/Concrete_Expression/bdshape2.cc
new file mode 100644
index 0000000..2f36e90
--- /dev/null
+++ b/tests/Concrete_Expression/bdshape2.cc
@@ -0,0 +1,571 @@
+/* Test BD_Shape::refine_wiht_linear_form_inequaity on interval linear forms.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests trivial cases.
+bool
+test01() {
+ Variable A(0);
+ FP_BD_Shape bd1(0);
+ bool ok1 = false;
+ FP_Linear_Form l1(A);
+ FP_Linear_Form l2;
+
+ try{
+ bd1.refine_with_linear_form_inequality(l1,l2);
+ std::cout <<"no eccezione" <<std::endl;
+ }
+ catch(std::invalid_argument e) {
+ ok1 = true;
+ }
+
+
+ bool ok2 = false;
+ try{
+ bd1.refine_with_linear_form_inequality(l2,l1);
+ std::cout <<"no eccezione" <<std::endl;
+ }
+ catch(std::invalid_argument e){
+ FP_BD_Shape bd2(1);
+ bd2.refine_with_linear_form_inequality(l1, l1);
+ bd2.refine_with_linear_form_inequality(-l1, l1);
+ bd2.refine_with_linear_form_inequality(l1, -l1);
+ FP_Interval tmp(0);
+ l1 -= A;
+ l1 += tmp;
+ l2 += tmp;
+ bd2.refine_with_linear_form_inequality(l1, l2);
+ ok2 = true;
+ }
+
+ return ok1 && ok2;
+}
+
+// Tests [-1, 2] <= [-4, -1] + A and [-4, -1] + A <= [-1, 2].
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(-1);
+ tmp.join_assign(2);
+ FP_Linear_Form l1(tmp);
+ FP_Linear_Form l2(A);
+ tmp.lower() = -4;
+ tmp.upper() = -1;
+ l2 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [-1, 2] <= [-4, -1] + A ***");
+
+ known_result.add_constraint(-A <= 0);
+ print_constraints(known_result, "*** known_result1 ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [-4, -1] + A <= [-1, 2] ***");
+
+ known_result.add_constraint(A <= 6);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [3.5, 6] <= [-2.5, 0] - A and [-2.5, 0] - A <= [3.5, 6].
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(bd1);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(3.5));
+ tmp.join_assign(6);
+ FP_Linear_Form l1(tmp);
+ FP_Linear_Form l2(-A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(-2.5);
+ tmp.upper() = 0;
+ l2 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [3.5, 6] <= [-2.5, 0] - A ***");
+
+ known_result.add_constraint(2*A <= -7);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [-2.5, 0] - A <= [3.5, 6] ***");
+
+ known_result.add_constraint(2*(-A) <= 17);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [-0.5, 1] + A <= [2.5, 5] + B and [2.5, 5] + B <= [-0.5, 1] + A.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-0.5));
+ tmp.join_assign(1);
+ FP_Linear_Form l1(A);
+ l1 += tmp;
+ FP_Linear_Form l2(B);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(2.5);
+ tmp.upper() = 5;
+ l2 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [-0.5, 1] + A <= [2.5, 5] + B ***");
+
+ known_result.add_constraint(2*A - 2*B <= 11);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [2.5, 5] + B <= [-0.5, 1] + A ***");
+
+ known_result.add_constraint((2*B) - (2*A) <= -3);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 3] + A <= [4, 4] - B and [4, 4] - B <= [1, 3] + A.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(4);
+ FP_Linear_Form l2(-B);
+ l2 += tmp;
+ FP_Linear_Form l1(A);
+ tmp.lower() = 1;
+ tmp.upper() = 3;
+ l1 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [1, 3] + A <= [4, 4] - B ***");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+ known_result.add_constraint(-A <= 1);
+ known_result.add_constraint(-B <= 1);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 4] - A <= [-2, -2] + B and [-2, -2] + B <= [1, 4] - A.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(-2);
+ FP_Linear_Form l2(B);
+ l2 += tmp;
+ FP_Linear_Form l1(-A);
+ tmp.lower() = 1;
+ tmp.upper() = 4;
+ l1 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [1, 4] - A <= [-2, -2] + B ***");
+
+ known_result.add_constraint(-A <= -1);
+ known_result.add_constraint(-B <= -1);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [-2, -2] + B <= [1, 4] - A ***");
+
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [-3, -0.5] - A <= [-2, -1] - B and [-2, -1] - B <= [-3, -0.5] - A.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(-2);
+ tmp.join_assign(-1);
+ FP_Linear_Form l2(-B);
+ l2 += tmp;
+ FP_Linear_Form l1(-A);
+ tmp.lower() = -3;
+ tmp.upper() = static_cast<FP_Interval::boundary_type>(-0.5);
+ l1 += tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [-3, -0.5] - A <= [-2, -1] - B ***");
+
+ known_result.add_constraint(B - A <= 2);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [-2, -1] - B <= [-3, -0.5] - A ***");
+
+ known_result.add_constraint(-2*B + 2*A <= 3);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 3] * B <= [-1.5, 0] * A.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(1);
+ tmp.join_assign(3);
+ FP_Linear_Form l1(B);
+ l1 *= tmp;
+ FP_Linear_Form l2(A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(-1.5);
+ tmp.upper() = 0;
+ l2 *= tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [1, 3] * B <= [-1.5, 0] * A ***");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests [0.25, 0.5] * A + [-2, -1] * B <= [-7, -2]
+// and [-7, -2] <= [0.25, 0.5] * A + [-2, -1] * B.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+
+ FP_Interval tmp(-7);
+ tmp.join_assign(-2);
+ FP_Linear_Form l2(tmp);
+ FP_Linear_Form l1(A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(0.25);
+ tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+ l1 *= tmp;
+ tmp.lower() = -2;
+ tmp.upper() = -1;
+ l1 += tmp * FP_Linear_Form(B);
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [0.25, 0.5]*A + [-2, -1]*B <= [-7, -2] ***");
+
+ known_result.add_constraint(-2*B + 2*A <= 3);
+ known_result.add_constraint(2*A <= 7);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [-7, -2] <= [0.25, 0.5]*A + [-2, -1]*B ***");
+
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+}
+
+// Tests [-5, -1] * A <= [2, 3] * B + [0.5, 1].
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(2);
+ tmp.join_assign(3);
+ FP_Linear_Form l2(B);
+ l2 *= tmp;
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(0.5);
+ tmp.upper() = 1;
+ l2 += tmp;
+ FP_Linear_Form l1(A);
+ tmp.lower() = -5;
+ tmp.upper() = -1;
+ l1 *= tmp;
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** [-5, -1] * A <= [2, 3] * B + [0.5, 1] ***");
+
+ known_result.add_constraint(B - A <= 17);
+ known_result.add_constraint(-B + A <= 17);
+ known_result.add_constraint(A <= 19);
+ known_result.add_constraint(-A <= 15);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// Tests Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-2.5));
+ tmp.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+ store.set_interval(A, tmp);
+ tmp.lower() = -4;
+ tmp.upper() = 4;
+ store.set_interval(B, tmp);
+ BD_Shape<ANALYZER_FP_FORMAT> bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(B <= 2);
+ bd1.add_constraint(-A <= 3);
+ bd1.add_constraint(2*(-B) <= 3);
+ bd1.refine_fp_interval_abstract_store(store);
+
+ tmp = store.get_interval(A);
+ nout << "*** store.get_interval(A) ***" << endl
+ << tmp << endl;
+
+ FP_Interval known_result1(static_cast<FP_Interval::boundary_type>(-2.5));
+ known_result1.join_assign(2);
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ bool ok1 = (tmp == known_result1);
+
+ tmp = store.get_interval(B);
+ nout << "*** store.get_interval(B) ***" << endl
+ << tmp << endl;
+
+ FP_Interval known_result2(static_cast<FP_Interval::boundary_type>(-1.5));
+ known_result2.join_assign(2);
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ bool ok2 = (tmp == known_result2);
+
+ return ok1 && ok2;
+}
+
+// Tests - A <= [-1, 0] and [0, 1] <= A.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(0);
+ tmp.join_assign(-1);
+ FP_Linear_Form l2(tmp);
+ FP_Linear_Form l1(-A);
+
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** - A <= [-1, 0] ***");
+
+ known_result.add_constraint( - A <= 0);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** [0, 1] <= - A ***");
+ known_result.add_constraint( A <= 1);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+}
+
+// Tests A <= - B + [-1, 0] and - B + [-1, 0] <= A.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(0);
+ tmp.join_assign(-1);
+ FP_Linear_Form l2(-B);
+ FP_Linear_Form l1(A);
+ l2 += tmp;
+
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** A <= - B + [-1, 0] ***");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** - B + [-1, 0] <= A ***");
+ known_result.add_constraint(-A <= 3);
+ known_result.add_constraint(-B <= 3);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+}
+
+// Tests A <= - A + [-1, 0] and - A + [0, 1] <= A.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_BD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ FP_BD_Shape known_result(bd1);
+ FP_Interval tmp(0);
+ tmp.join_assign(-1);
+ FP_Linear_Form l2(-A);
+ FP_Linear_Form l1(A);
+ l2 += tmp;
+
+ bd1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(bd1, "*** A <= - A + [-1, 0] ***");
+
+ known_result.add_constraint(2*A <= 0);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (bd1 == known_result);
+
+ bd1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(bd1, "*** - A + [0, 1] <= A ***");
+
+ known_result.add_constraint(2*(-A) <= 1);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok2 = (bd1 == known_result);
+
+ return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Concrete_Expression/digitalfilters1.cc b/tests/Concrete_Expression/digitalfilters1.cc
new file mode 100644
index 0000000..ef83d12
--- /dev/null
+++ b/tests/Concrete_Expression/digitalfilters1.cc
@@ -0,0 +1,1121 @@
+/* Test Rate Limiter on differents abstract domains.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "C_Expr_defs.hh"
+
+namespace {
+
+class Test_Oracle : public FP_Oracle<C_Expr,FP_Interval> {
+public:
+ Test_Oracle() : int_store(0) {}
+
+ Test_Oracle(FP_Interval_Abstract_Store init) : int_store(init) {}
+
+ bool get_interval(dimension_type dim, FP_Interval& result) const {
+ result = int_store.get_interval(Variable(dim));
+ return true;
+ }
+
+ bool get_fp_constant_value(const Floating_Point_Constant<C_Expr>& expr,
+ FP_Interval& result) const {
+ result = FP_Interval((const char *)expr.value);
+ return true;
+ }
+
+ bool get_integer_expr_value(const Concrete_Expression<C_Expr>& expr,
+ FP_Interval& result) const {
+ if (expr.kind() == INT_CON) {
+ const Integer_Constant<C_Expr>* ic_expr =
+ reinterpret_cast< const Integer_Constant<C_Expr>* >(&expr);
+ result = FP_Interval(ic_expr->value);
+ }
+ else {
+ const Approximable_Reference<C_Expr>* ar_expr =
+ reinterpret_cast< const Approximable_Reference<C_Expr>* >(&expr);
+ result = FP_Interval(ar_expr->value);
+ }
+
+ return true;
+ }
+
+ bool get_associated_dimensions(
+ const Approximable_Reference<C_Expr>& expr,
+ std::set<dimension_type>& result) const {
+ result = expr.dimensions;
+ return true;
+ }
+
+ FP_Interval_Abstract_Store int_store;
+};
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+Concrete_Expression_Type FP_Type
+= Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT);
+
+typedef Integer_Interval Int_Interval;
+
+/*
+This file tests a rate limiter that, given random input flows of floating
+point values X and D, bounded respectively by [-128, 128] and [0, 16],
+computes an output flow Y that tries to follow X while having a change rate
+limited by D. The pseudo-code of such rate limiter is the following:
+
+Y = 0;
+for (n = 0; n < N; ++n) {
+ X = [-128, 128];
+ D = [0, 16];
+ S = Y;
+ R = X - S;
+ Y = X;
+ if (R <= -D)
+ Y = S - D;
+ if (R >= D)
+ Y = S + D;
+}
+*/
+
+void
+set_M(Coefficient& M, int m) {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ if (greater_than(std::numeric_limits<Coefficient>::min(),
+ std::numeric_limits<ANALYZER_FP_FORMAT>::min())
+ || less_than(std::numeric_limits<Coefficient>::max(),
+ std::numeric_limits<ANALYZER_FP_FORMAT>::max())) {
+ // This may still provoke an arithmetic overflow exception:
+ // no problem.
+ M = m;
+ return;
+ }
+ }
+ // Cannot provoke an overflow.
+ assign_r(M, m, ROUND_DOWN);
+}
+
+// Tests rate limiter using boxes and ignoring rounding errors.
+bool
+test01() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ FP_Interval_Abstract_Store abstract_store(5);
+ FP_Interval_Abstract_Store as_begin(5);
+ FP_Interval tmp(0);
+ unsigned short n = 0;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 144);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ // Y = 0;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+ do {
+
+ nout << "*** n = " << n << " ***" << endl;
+ as_begin = abstract_store;
+ print_constraints(abstract_store, "*** begin loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+ // S = Y;
+ abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+ // R = X - S;
+ abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+ // Y = X;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+ // if (R <= -D) Y = S - D;
+ FP_Interval_Abstract_Store as_then(abstract_store);
+ as_then.refine_with_constraint(R <= -D);
+ as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+ abstract_store.refine_with_constraint(R > -D);
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D) Y = S + D;
+ as_then = abstract_store;
+ as_then.refine_with_constraint(R >= D);
+ as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+ abstract_store.refine_with_constraint(R < D);
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ abstract_store.upper_bound_assign(as_begin);
+ abstract_store.limited_CC76_extrapolation_assign(as_begin, cs);
+ print_constraints(abstract_store, "*** end loop ***");
+ ++n;
+
+ } while (as_begin != abstract_store);
+
+ FP_Interval y = abstract_store.get_interval(Y);
+ nout << "*** Y in " << y << " ***" << endl;
+ return !y.is_bounded();
+}
+
+// Tests rate limiter using bounded differences and ignoring rounding
+// errors.
+bool
+test02() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ FP_BD_Shape abstract_store(5);
+ FP_BD_Shape as_begin(5);
+ FP_Interval tmp(0);
+ unsigned short n = 0;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 144);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ // Y = 0;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+ do {
+
+ nout << "*** n = " << n << " ***" << endl;
+ as_begin = abstract_store;
+ print_constraints(abstract_store, "*** begin loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+ // S = Y;
+ abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+ // R = X - S;
+ abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+ // Y = X;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+ // if (R <= -D) Y = S - D;
+ FP_BD_Shape as_then(abstract_store);
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+ abstract_store.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D) Y = S + D;
+ as_then = abstract_store;
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+ abstract_store.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ FP_Linear_Form(D));
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ abstract_store.upper_bound_assign(as_begin);
+ abstract_store.limited_BHMZ05_extrapolation_assign(as_begin, cs);
+ print_constraints(abstract_store, "*** end loop ***");
+ n++;
+
+ } while (as_begin != abstract_store);
+
+ tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return !tmp.is_bounded();
+}
+
+// Tests rate limiter using octagonal shapes and ignoring rounding
+// errors.
+bool
+test03() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ //FP_Interval_Abstract_Store abstract_store();
+ FP_Octagonal_Shape abstract_store(5, UNIVERSE);
+ FP_Octagonal_Shape as_begin(5, EMPTY);
+ FP_Interval tmp(0);
+ unsigned short n = 0;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 136);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ // Y = 0;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+ do {
+
+ nout << "*** n = " << n << " ***" << endl;
+ as_begin = abstract_store;
+ print_constraints(abstract_store, "*** begin loop ***");
+
+ //X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+ // S = Y;
+ abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+ // R = X - S;
+ abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+ // Y = X;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+ //if (R <= -D) Y = S - D;
+ FP_Octagonal_Shape as_then(abstract_store);
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+ abstract_store.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ //if (R >= D) Y = S + D;
+ as_then = abstract_store;
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+ abstract_store.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ FP_Linear_Form(D));
+
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after (R >= D) Y = S + D; ***");
+
+ abstract_store.upper_bound_assign(as_begin);
+ abstract_store.limited_BHMZ05_extrapolation_assign(as_begin, cs);
+ print_constraints(abstract_store, "*** end loop ***");
+ ++n;
+
+ } while (as_begin != abstract_store);
+
+ tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return (tmp.lower() == -136 && tmp.upper() == 136);
+}
+
+// Tests rate limiter using polyhedra and ignoring rounding errors.
+bool
+test04() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ NNC_Polyhedron abstract_store(5);
+ NNC_Polyhedron as_begin(5);
+ FP_Interval tmp(0);
+ unsigned short n = 0;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 128);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ // Y = 0;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+ do {
+
+ nout << "*** n = " << n << " ***" << endl;
+ as_begin = abstract_store;
+ print_constraints(abstract_store, "*** begin loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+ // S = Y;
+ abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+ // R = X - S;
+ abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+ // Y = X;
+ abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+ // if (R <= -D) Y = S - D;
+ NNC_Polyhedron as_then(abstract_store);
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+ abstract_store.generalized_refine_with_linear_form_inequality(
+ -FP_Linear_Form(D), FP_Linear_Form(R), LESS_THAN);
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D) Y = S + D;
+ as_then = abstract_store;
+ as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+ abstract_store.generalized_refine_with_linear_form_inequality(
+ FP_Linear_Form(R), FP_Linear_Form(D), LESS_THAN);
+ abstract_store.upper_bound_assign(as_then);
+ print_constraints(abstract_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ abstract_store.upper_bound_assign(as_begin);
+ abstract_store.limited_BHRZ03_extrapolation_assign(as_begin, cs);
+ print_constraints(abstract_store, "*** end loop ***");
+ ++n;
+
+ } while(as_begin != abstract_store);
+
+ tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return (tmp.lower() == -128 && tmp.upper() == 128);
+}
+
+
+// Tests rate limiter using bounded differences and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with bounded differences domain.
+bool
+test05() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+ Test_Oracle or_begin(FP_Interval_Abstract_Store (5));
+ FP_Linear_Form_Abstract_Store lf_abstract_store;
+ FP_BD_Shape bd(5);
+ FP_BD_Shape bd_begin(5);
+ unsigned short n = 0;
+ FP_Interval tmp(0);
+ FP_Linear_Form lx;
+ FP_Linear_Form ly;
+ FP_Linear_Form lr;
+ FP_Linear_Form lk;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 144);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ bool lin_success;
+
+ Floating_Point_Constant<C_Expr> con_y("0", 2);
+ // The constant floating point expression con_y is linearized into
+ // the interval linear form lk. If linearization succeeded, we model
+ // the assignment Y = 0, invoking affine_form_image method.
+ // In order to refine the analysis, all the transer function are
+ // performed in parallel in the interval domain and in the bounded
+ // differences domain.
+ // Then, we consider the intersection between these abstract domains.
+
+ lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+ if (lin_success) {
+ bd.affine_form_image(Y, lk);
+ }
+ else {
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // This loop iterate until a fixed point is reached.
+ do {
+
+ // Iteration no. n+1.
+ nout << "*** n = " << n << " ***" << endl;
+ bd_begin = bd;
+ or_begin.int_store = oracle.int_store;
+ print_constraints(oracle.int_store, "*** before loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+ bd.affine_form_image(X, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+ bd.affine_form_image(D, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // S = Y;
+ Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+ Y.id());
+ lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+ oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+ if (lin_success) {
+ bd.affine_form_image(S, ly);
+ }
+ else {
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // R = X - S;
+ Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+ X.id());
+ Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+ S.id());
+ Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &px, &ps);
+ lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+ oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+ if (lin_success) {
+ bd.affine_form_image(R, lr);
+ }
+ else {
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // Y = X;
+ lin_success = linearize(px, oracle, lf_abstract_store, lx);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+ if (lin_success) {
+ bd.affine_form_image(Y, lx);
+ }
+ else {
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // if (R <= -D)
+ FP_BD_Shape bd_then(bd);
+ Test_Oracle or_then(oracle.int_store);
+ or_then.int_store.refine_with_constraint(R <= -D);
+ bd_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+ // then Y = S - D;
+ Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+ D.id());
+ Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &ps, &pd);
+ lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+ if (lin_success) {
+ bd_then.affine_form_image(Y, ly);
+ }
+ else {
+ bd_then.intersection_assign(FP_BD_Shape(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+ // else skip;
+ oracle.int_store.refine_with_constraint(R > -D);
+ bd.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // LUB between then and else branches.
+ bd.upper_bound_assign(bd_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D)
+ bd_then = bd;
+ or_then.int_store = oracle.int_store;
+ or_then.int_store.refine_with_constraint(R >= D);
+ bd_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+ // then Y = S + D;
+ Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+ &ps, &pd);
+ lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+ if (lin_success) {
+ bd_then.affine_form_image(Y, ly);
+ }
+ else {
+ bd_then.intersection_assign(FP_BD_Shape(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+ // else skip;
+ bd.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ FP_Linear_Form(D));
+ oracle.int_store.refine_with_constraint(R < D);
+ bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+ // LUB between then and else branches.
+ bd.upper_bound_assign(bd_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ // LUB between the actual abstract domains and the corresponding
+ // domains at the beginning of the loop.
+ bd.upper_bound_assign(bd_begin);
+ oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+ // Limited extrapolation: we enforce the satisfaction
+ // of the constraint system cs = {Y <= M; Y >= -M}
+ bd.limited_BHMZ05_extrapolation_assign(bd_begin, cs);
+ oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+ print_constraints(oracle.int_store, "*** end loop ***");
+ ++n;
+
+ } while(or_begin.int_store != oracle.int_store);
+
+ tmp = oracle.int_store.get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+// Tests rate limiter using octagonal shapes and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with octagons domain.
+bool
+test06() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+ Test_Oracle or_begin(FP_Interval_Abstract_Store(5));
+ FP_Linear_Form_Abstract_Store lf_abstract_store;
+ FP_Octagonal_Shape oc(5);
+ FP_Octagonal_Shape oc_begin(5);
+ unsigned short n = 0;
+ FP_Interval tmp(0);
+ FP_Linear_Form lx;
+ FP_Linear_Form ly;
+ FP_Linear_Form lr;
+ FP_Linear_Form lk;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 144);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ bool lin_success;
+
+ Floating_Point_Constant<C_Expr> con_y("0", 2);
+ // The constant floating point expression con_y is linearized into
+ // the interval linear form lk. If linearization succeeded, we model
+ // the assignment Y = 0, invoking affine_form_image method.
+ // In order to refine the analysis, all the transer function are
+ // performed in parallel in the interval domain and in the bounded
+ // differences domain.
+ // Then, we consider the intersection between these abstract domains.
+
+ lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+ if (lin_success) {
+ oc.affine_form_image(Y, lk);
+ }
+ else {
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // This loop iterates until a fixed point is reached.
+ do {
+
+ // Iteration no. n+1.
+ nout << "*** n = " << n << " ***" << endl;
+ oc_begin = oc;
+ or_begin.int_store = oracle.int_store;
+ print_constraints(oracle.int_store, "*** before loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+ oc.affine_form_image(X, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+ oc.affine_form_image(D, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // S = Y;
+ Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+ Y.id());
+ lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+ oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+ if (lin_success) {
+ oc.affine_form_image(S, ly);
+ }
+ else {
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // R = X - S;
+ Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+ X.id());
+ Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+ S.id());
+ Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &px, &ps);
+ lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+ oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+ if (lin_success) {
+ oc.affine_form_image(R, lr);
+ }
+ else {
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // Y = X;
+ lin_success = linearize(px, oracle, lf_abstract_store, lx);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+ if (lin_success) {
+ oc.affine_form_image(Y, lx);
+ }
+ else {
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // if (R <= -D)
+ FP_Octagonal_Shape oc_then(oc);
+ Test_Oracle or_then(oracle.int_store);
+ or_then.int_store.refine_with_constraint(R <= -D);
+ oc_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+ // then Y = S - D;
+ Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+ D.id());
+ Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &ps, &pd);
+ lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+ if (lin_success) {
+ oc_then.affine_form_image(Y, ly);
+ }
+ else {
+ oc_then.intersection_assign(FP_Octagonal_Shape(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+ // else skip;
+ oracle.int_store.refine_with_constraint(R > -D);
+ oc.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // LUB between then and else branches.
+ oc.upper_bound_assign(oc_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store,
+ "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D)
+ oc_then = oc;
+ or_then.int_store = oracle.int_store;
+ or_then.int_store.refine_with_constraint(R >= D);
+ oc_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+ // then Y = S + D;
+ Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+ &ps, &pd);
+ lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+ if (lin_success) {
+ oc_then.affine_form_image(Y, ly);
+ }
+ else {
+ oc_then.intersection_assign(FP_Octagonal_Shape(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+ // else skip;
+ oc.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ FP_Linear_Form(D));
+ oracle.int_store.refine_with_constraint(R < D);
+ oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+ // LUB between then and else branches.
+ oc.upper_bound_assign(oc_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ // LUB between the actual abstract domains and the corresponding
+ // domains at the beginning of the loop.
+ oc.upper_bound_assign(oc_begin);
+ oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+ // Limited extrapolation: we enforce the satisfaction
+ // of the constraint system cs = {Y <= M; Y >= -M}
+ oc.limited_BHMZ05_extrapolation_assign(oc_begin, cs);
+ oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+ print_constraints(oracle.int_store, "*** end loop ***");
+ ++n;
+
+ } while(or_begin.int_store != oracle.int_store);
+
+ tmp = oracle.int_store.get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+// Tests rate limiter using polyhedra domain and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with poyhedra domain.
+bool
+test07() {
+ // Input signal.
+ Variable X(0);
+ // Maximum allowed for |R|.
+ Variable D(1);
+ // Output signal.
+ Variable Y(2);
+ // Last output.
+ Variable S(3);
+ // Actual rate.
+ Variable R(4);
+
+ Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+ Test_Oracle or_begin(FP_Interval_Abstract_Store(5));
+ FP_Linear_Form_Abstract_Store lf_abstract_store;
+ NNC_Polyhedron ph(5);
+ NNC_Polyhedron ph_begin(5);
+ unsigned short n = 0;
+ FP_Interval tmp(0);
+ FP_Linear_Form lx;
+ FP_Linear_Form ly;
+ FP_Linear_Form lr;
+ FP_Linear_Form lk;
+
+ Constraint_System cs;
+ Coefficient M;
+ set_M(M, 144);
+ cs.insert(Y <= M);
+ cs.insert(Y >= -M);
+
+ bool lin_success;
+
+ Floating_Point_Constant<C_Expr> con_y("0", 2);
+ // The constant floating point expression con_y is linearized into
+ // the interval linear form lk. If linearization succeeded, we model
+ // the assignment Y = 0, invoking affine_form_image method.
+ // In order to refine the analysis, all the transer function are
+ // performed in parallel in the interval domain and in the bounded
+ // differences domain.
+ // Then, we consider the intersection between these abstract domains.
+
+ lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+ if (lin_success) {
+ ph.affine_form_image(Y, lk);
+ }
+ else {
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // This loop iterate until a fixed point is reached.
+ do {
+
+ // Iteration no. n+1.
+ nout << "*** n = " << n << " ***" << endl;
+ ph_begin = ph;
+ or_begin.int_store = oracle.int_store;
+ print_constraints(oracle.int_store, "*** before loop ***");
+
+ // X = [-128, 128];
+ tmp.lower() = -128;
+ tmp.upper() = 128;
+ oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+ ph.affine_form_image(X, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // D = [0, 16];
+ tmp.lower() = 0;
+ tmp.upper() = 16;
+ oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+ ph.affine_form_image(D, FP_Linear_Form(tmp));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // S = Y;
+ Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+ Y.id());
+ lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+ oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+ if (lin_success) {
+ ph.affine_form_image(S, ly);
+ }
+ else {
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // R = X - S;
+ Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+ X.id());
+ Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+ S.id());
+ Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &px, &ps);
+ lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+ oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+ if (lin_success) {
+ ph.affine_form_image(R, lr);
+ }
+ else {
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // Y = X;
+ lin_success = linearize(px, oracle, lf_abstract_store, lx);
+ oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+ if (lin_success) {
+ ph.affine_form_image(Y, lx);
+ }
+ else {
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ }
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // if (R <= -D)
+ NNC_Polyhedron ph_then(ph);
+ Test_Oracle or_then(oracle.int_store);
+ or_then.int_store.refine_with_constraint(R <= -D);
+ ph_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ -FP_Linear_Form(D));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+ // then Y = S - D;
+ Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+ D.id());
+ Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &ps, &pd);
+ lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+ if (lin_success) {
+ ph_then.affine_form_image(Y, ly);
+ }
+ else {
+ ph_then.intersection_assign(NNC_Polyhedron(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+ // else skip;
+ oracle.int_store.refine_with_constraint(R > -D);
+ ph.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // LUB between then and else branches.
+ ph.upper_bound_assign(ph_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store, "*** after if (R <= -D) Y = S - D; ***");
+
+ // if (R >= D)
+ ph_then = ph;
+ or_then.int_store = oracle.int_store;
+ or_then.int_store.refine_with_constraint(R >= D);
+ ph_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+ FP_Linear_Form(R));
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+ // then Y = S + D;
+ Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+ &ps, &pd);
+ lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+ or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+ if (lin_success) {
+ ph_then.affine_form_image(Y, ly);
+ }
+ else {
+ ph_then.intersection_assign(NNC_Polyhedron(or_then.int_store));
+ }
+ or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+ // else skip;
+ ph.refine_with_linear_form_inequality(FP_Linear_Form(R),
+ FP_Linear_Form(D));
+ oracle.int_store.refine_with_constraint(R < D);
+ ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+ oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+ // LUB between then and else branches.
+ ph.upper_bound_assign(ph_then);
+ oracle.int_store.upper_bound_assign(or_then.int_store);
+ print_constraints(oracle.int_store,
+ "*** after if (R >= D) Y = S + D; ***");
+
+ // LUB between the actual abstract domains and the corresponding
+ // domains at the beginning of the loop.
+ ph.upper_bound_assign(ph_begin);
+ oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+ // Limited extrapolation: we enforce the satisfaction
+ // of the constraint system cs = {Y <= M; Y >= -M}
+ ph.limited_BHRZ03_extrapolation_assign(ph_begin, cs);
+ oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+ print_constraints(oracle.int_store, "*** end loop ***");
+ ++n;
+
+ } while(or_begin.int_store != oracle.int_store);
+
+ tmp = oracle.int_store.get_interval(Y);
+ nout << "*** Y in " << tmp << " ***" << endl;
+ return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+ DO_TEST_F8(test03);
+ DO_TEST_F64A(test04);
+
+#define COND_float PPL_CPP_EQ(PPL_CPP_FP_FORMAT(ANALYZER_FP_FORMAT), 1)
+#define COND_double PPL_CPP_EQ(PPL_CPP_FP_FORMAT(ANALYZER_FP_FORMAT), 2)
+#define COND_float_or_double PPL_CPP_OR(COND_float, COND_double)
+#define PPL_CUSTOM_COND_32 \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 5), COND_float)
+#define PPL_CUSTOM_COND_64 \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 6), COND_float_or_double)
+#define PPL_CUSTOM_COND \
+ PPL_CPP_OR(COND_F64, PPL_CPP_OR(PPL_CUSTOM_COND_32, PPL_CUSTOM_COND_64))
+
+ COND_DO_TEST(PPL_CUSTOM_COND, test05);
+ COND_DO_TEST(PPL_CUSTOM_COND, test06);
+
+ DO_TEST_F64(test07);
+
+END_MAIN
diff --git a/tests/Concrete_Expression/linearform1.cc b/tests/Concrete_Expression/linearform1.cc
new file mode 100644
index 0000000..e6417c8
--- /dev/null
+++ b/tests/Concrete_Expression/linearform1.cc
@@ -0,0 +1,342 @@
+/* Testing Linear_Form on floating point intervals.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+// Test operator-=(FP_Linear_Form& f1, const FP_Linear_Form& f2):
+// in this case the dimension of f2 is strictly greater than
+// the dimension of f1.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Linear_Form f;
+ FP_Linear_Form f1 = A;
+ FP_Linear_Form f2 = B;
+
+ f1 += f.coefficient(A);
+ f1 -= f2;
+
+ FP_Linear_Form known_result = A - FP_Linear_Form(B);
+
+ bool ok = (f1 == known_result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(15);
+ Variable B(0);
+
+ FP_Linear_Form f1 = A;
+ FP_Linear_Form f2 = B;
+
+ FP_Linear_Form known_result1 = f1 + f2;
+
+ bool ok1 = (FP_Linear_Form(A) + B == known_result1)
+ && (B + FP_Linear_Form(A) == known_result1)
+ && (A + FP_Linear_Form(B) == known_result1)
+ && (FP_Linear_Form(B) + A == known_result1)
+ && (FP_Linear_Form(B) + FP_Linear_Form(A) == known_result1);
+
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ FP_Linear_Form known_result2 = f1 + f1;
+
+ bool ok2 = (FP_Linear_Form(A) + A == known_result2)
+ && (A + FP_Linear_Form(A) == known_result2)
+ && (A + FP_Linear_Form(A) == known_result2)
+ && (FP_Linear_Form(A) + A == known_result2)
+ && (FP_Linear_Form(A) + FP_Linear_Form(A) == known_result2);
+
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ return ok1 && ok2;
+}
+
+bool
+test03() {
+ Variable A(15);
+ Variable B(10);
+
+ FP_Linear_Form f1 = A;
+ FP_Linear_Form f2 = B;
+
+ FP_Linear_Form known_result1 = f1 - f2;
+
+ bool ok1 = (FP_Linear_Form(A) - B == known_result1)
+ && (A - FP_Linear_Form(B) == known_result1)
+ && (FP_Linear_Form(A) - FP_Linear_Form(B) == known_result1);
+
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ FP_Linear_Form known_result2 = f2 - f1;
+
+ bool ok2 = (FP_Linear_Form(B) - A == known_result2)
+ && (B - FP_Linear_Form(A) == known_result2)
+ && (FP_Linear_Form(B) - FP_Linear_Form(A) == known_result2);
+
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ FP_Linear_Form known_result3 = f1 - f1;
+
+ bool ok3 = (FP_Linear_Form(A) - A == known_result3)
+ && (A - FP_Linear_Form(A) == known_result3)
+ && (FP_Linear_Form(A) - FP_Linear_Form(A) == known_result3);
+
+ nout << "*** known_result3 ***" << endl
+ << known_result3 << endl;
+
+ return ok1 && ok2 && ok3;
+}
+
+// Test operator+=(FP_Linear_Form& f1, const FP_Linear_Form& f2):
+// in this case the dimension of f2 is strictly greater than
+// the dimension of f1.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Linear_Form f1 = A;
+ FP_Linear_Form f2 = B;
+ f1 += f2;
+
+ FP_Linear_Form known_result = FP_Linear_Form(A) + B;
+
+ bool ok = (f1 == known_result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return ok;
+}
+
+// Test operator+=(FP_Linear_Form& f, Variable v):
+// in this case the dimension of v is strictly greater than
+// the dimension of f.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Linear_Form f = A;
+ FP_Interval x(FP_Interval::boundary_type(2));
+ x /= FP_Interval(FP_Interval::boundary_type(3));
+ f *= x;
+
+ FP_Linear_Form known_result = f + B;
+
+ f += B;
+
+ bool ok = (f == known_result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(16);
+ Variable D(120);
+
+ FP_Linear_Form f = A + 2*B + 16*C + 120*D;
+
+ FP_Linear_Form known_result = A;
+ known_result += FP_Interval(2) * FP_Linear_Form(B);
+ known_result += FP_Interval(16) * FP_Linear_Form(C);
+ known_result += FP_Interval(120) * FP_Linear_Form(D);
+
+ bool ok = (f == known_result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return ok;
+}
+
+// Tests operator==(const Linear_Form<C>& x, const Linear_Form<C>& y).
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ FP_Linear_Form f1 = A;
+ FP_Linear_Form f2;
+ bool known_result = false;
+
+ bool result1 = (f1 == f2);
+
+ f2 += FP_Interval(FP_Interval::boundary_type(1));
+ bool result2 = (f1 == f2);
+
+ bool result3 = (f2 == f1);
+
+ f1 += FP_Interval(FP_Interval::boundary_type(1));
+ bool result4 = (f2 == f1);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return (known_result == (result1 || result2 || result3 || result4));
+}
+
+
+// Tests overflows of space dimension.
+bool
+test08() {
+ FP_Linear_Form f;
+ Variable A(f.max_space_dimension());
+
+ bool ok1 = false;
+ try {
+ f = FP_Linear_Form(A);
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in Linear_Form(const Variable v)." << endl;
+ ok1 = true;
+ }
+
+ bool ok2 = false;
+ try {
+ f += A;
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in operator+=(Linear_Form<C>& f, const Variable v)."
+ << endl;
+ ok2 = true;
+ }
+
+ bool ok3 = false;
+ try {
+ f -= A;
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in operator-=(Linear_Form<C>& f, const Variable v)."
+ << endl;
+ Variable B(1);
+ Variable C(2);
+ FP_Linear_Form g(B);
+ g -= C;
+ ok3 = true;
+ }
+
+ FP_Linear_Form g;
+ bool ok4 = false;
+ try {
+ g = f - A;
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in operator-(Linear_Form<C>& f, const Variable v)."
+ << endl;
+ ok4 = true;
+ }
+
+ bool ok5 = false;
+ try {
+ g = A - f;
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in operator-(const Variable v, Linear_Form<C>& f)."
+ << endl;
+ ok5 = true;
+ }
+
+ bool ok6 = false;
+ try {
+ g = A + f;
+ }
+ catch(std::length_error e) {
+ nout << "Overflow in operator+(const Variable v, Linear_Form<C>& f)."
+ << endl;
+ ok6 = true;
+ }
+
+ return ok1 && ok2 && ok3 && ok4 && ok5 && ok6;
+}
+
+bool
+test09() {
+ Variable A(0);
+ FP_Linear_Form f;
+ bool ok1 = !f.overflows();
+ f += A;
+ bool ok2 = !f.overflows();
+ FP_Interval max(std::numeric_limits<ANALYZER_FP_FORMAT>::max());
+ f *= max;
+ f *= max;
+ bool ok3 = f.overflows();
+ return ok1 && ok2 && ok3;
+}
+
+bool
+test10() {
+ Variable x5(5);
+ Variable x2(2);
+ FP_Interval x5_coefficient;
+ x5_coefficient.lower() = FP_Interval::boundary_type(2);
+ x5_coefficient.upper() = FP_Interval::boundary_type(3);
+ FP_Interval inhomogeneous_term;
+ inhomogeneous_term.lower() = FP_Interval::boundary_type(4);
+ inhomogeneous_term.upper() = FP_Interval::boundary_type(8);
+ FP_Linear_Form lf(x2);
+ lf = -lf;
+ lf += FP_Linear_Form(x2);
+ FP_Linear_Form lx5(x5);
+ lx5 *= x5_coefficient;
+ lf += lx5;
+ return lf.space_dimension() == 6;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/linearize.cc b/tests/Concrete_Expression/linearize.cc
new file mode 100644
index 0000000..6b909b8
--- /dev/null
+++ b/tests/Concrete_Expression/linearize.cc
@@ -0,0 +1,326 @@
+/* Testing linearization algorithm ad its related functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "C_Expr_defs.hh"
+
+namespace {
+
+class Test_Oracle : public FP_Oracle<C_Expr,FP_Interval> {
+public:
+ Test_Oracle() : int_store(0) {}
+
+ Test_Oracle(FP_Interval_Abstract_Store init) : int_store(init) {}
+
+ bool get_interval(dimension_type dim, FP_Interval& result) const {
+ result = int_store.get_interval(Variable(dim));
+ return true;
+ }
+
+ bool get_fp_constant_value(const Floating_Point_Constant<C_Expr>& expr,
+ FP_Interval& result) const {
+ result = FP_Interval((const char *)expr.value);
+ return true;
+ }
+
+ bool get_integer_expr_value(const Concrete_Expression<C_Expr>& expr,
+ FP_Interval& result) const {
+ if (expr.kind() == INT_CON) {
+ const Integer_Constant<C_Expr>* ic_expr =
+ reinterpret_cast< const Integer_Constant<C_Expr>* >(&expr);
+ result = FP_Interval(ic_expr->value);
+ }
+ else {
+ const Approximable_Reference<C_Expr>* ar_expr =
+ reinterpret_cast< const Approximable_Reference<C_Expr>* >(&expr);
+ result = FP_Interval(ar_expr->value);
+ }
+
+ return true;
+ }
+
+ bool get_associated_dimensions(
+ const Approximable_Reference<C_Expr>& expr,
+ std::set<dimension_type>& result) const {
+ result = expr.dimensions;
+ return true;
+ }
+
+ FP_Interval_Abstract_Store int_store;
+};
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+Concrete_Expression_Type FP_Type =
+ Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT);
+
+typedef Integer_Interval Int_Interval;
+
+// Tests division by zero.
+bool
+test01() {
+ Floating_Point_Constant<C_Expr> num("3", 2);
+ Floating_Point_Constant<C_Expr> den("0", 2);
+ Binary_Operator<C_Expr> div(FP_Type, Binary_Operator<C_Expr>::DIV, &num, &den);
+ FP_Linear_Form result;
+ if (!linearize(div, Test_Oracle(), FP_Linear_Form_Abstract_Store(),
+ result)) {
+ nout << "*** Linearization failed due to division by zero. ***" << endl;
+ return true;
+ }
+ return false;
+}
+
+// Tests multiplication by zero.
+bool
+test02() {
+ Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+ oracle.int_store.set_interval(Variable(0), FP_Interval(0));
+ oracle.int_store.set_interval(Variable(1), FP_Interval(10));
+ Floating_Point_Constant<C_Expr> con("5.5", 4);
+ Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+ Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+ Binary_Operator<C_Expr> dif(FP_Type, Binary_Operator<C_Expr>::SUB, &var1, &con);
+ Binary_Operator<C_Expr> mul(FP_Type, Binary_Operator<C_Expr>::MUL, &dif, &var0);
+ FP_Linear_Form result;
+ if (!linearize(mul, oracle, FP_Linear_Form_Abstract_Store(), result))
+ return false;
+
+ FP_Linear_Form known_result(compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT));
+
+ nout << "*** result ***" << endl
+ << result << endl;
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+// Tests linearization of variables in a given linear form abstract store.
+bool
+test03() {
+ FP_Linear_Form_Abstract_Store store;
+ Variable A(0);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ store[0] = known_result;
+ Approximable_Reference<C_Expr> var(FP_Type, Int_Interval(mpz_class(0)), 0);
+ FP_Linear_Form result;
+ linearize(var, Test_Oracle(), store, result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+// Tests linearization of A + B.
+bool
+test04() {
+ FP_Interval tmp(0);
+ Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+ oracle.int_store.set_interval(Variable(0), tmp);
+ oracle.int_store.set_interval(Variable(1), tmp);
+ Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+ Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+ Binary_Operator<C_Expr> sum(FP_Type, Binary_Operator<C_Expr>::ADD,
+ &var0, &var1);
+ FP_Linear_Form result;
+ linearize(sum, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ Variable B(1);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err1;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+ known_result += rel_err1;
+ FP_Linear_Form lb = FP_Linear_Form(B);
+ known_result += lb;
+ FP_Linear_Form rel_err2;
+ lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+ known_result += rel_err2;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = result == known_result;
+
+ return ok;
+}
+
+// Tests the linearization of A - B.
+bool
+test05() {
+ FP_Interval tmp(0);
+ Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+ oracle.int_store.set_interval(Variable(0), tmp);
+ oracle.int_store.set_interval(Variable(1), tmp);
+ Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+ Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+ Binary_Operator<C_Expr> dif(FP_Type, Binary_Operator<C_Expr>::SUB,
+ &var0, &var1);
+ FP_Linear_Form result;
+ linearize(dif, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ Variable B(1);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err1;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+ known_result += rel_err1;
+ FP_Linear_Form lb = FP_Linear_Form(B);
+ lb.negate();
+ known_result += lb;
+ FP_Linear_Form rel_err2;
+ lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+ known_result += rel_err2;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = result == known_result;
+
+ return ok;
+}
+
+// Tests linearization of A * B where A in [0, 1] and B in [2, 2].
+bool
+test06() {
+ FP_Interval tmp(0);
+ tmp.join_assign(1);
+ Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+ oracle.int_store.set_interval(Variable(0), tmp);
+ oracle.int_store.set_interval(Variable(1), FP_Interval(2));
+ Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+ Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+ Binary_Operator<C_Expr> mul(FP_Type, Binary_Operator<C_Expr>::MUL,
+ &var0, &var1);
+ FP_Linear_Form result;
+ linearize(mul, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ FP_Interval coeff = FP_Interval(2);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+ known_result *= coeff;
+ known_result += coeff * rel_err;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+// Tests the linearization of A / B where A = [0, 1] and B = [2, 2].
+bool
+test07() {
+ FP_Interval tmp(0);
+ tmp.join_assign(1);
+ Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+ oracle.int_store.set_interval(Variable(0), tmp);
+ oracle.int_store.set_interval(Variable(1), FP_Interval(2));
+ Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+ Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+ Binary_Operator<C_Expr> div(FP_Type, Binary_Operator<C_Expr>::DIV,
+ &var0, &var1);
+ FP_Linear_Form result;
+ linearize(div, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ FP_Interval coeff(FP_Interval::boundary_type(1 / 2.0));
+ FP_Linear_Form known_result(A);
+ FP_Linear_Form rel_err;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+ known_result *= coeff;
+ known_result += rel_err * coeff;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+// Tests linearization of cast expressions.
+bool
+test08() {
+ Int_Interval i(mpz_class(123456789));
+ Integer_Constant<C_Expr> ic_expr(Concrete_Expression_Type::bounded_integer(BITS_32, UNSIGNED, OVERFLOW_WRAPS), i);
+ Cast_Operator<C_Expr> cast(FP_Type, &ic_expr);
+ FP_Linear_Form result;
+ linearize(cast, Test_Oracle(),
+ FP_Linear_Form_Abstract_Store(), result);
+
+ Int_Interval approx(mpz_class(123456700));
+ approx.join_assign(mpz_class(123456850));
+ bool ok1 = approx.contains(result.inhomogeneous_term());
+
+ Approximable_Reference<C_Expr> var(Concrete_Expression_Type::bounded_integer(BITS_32, UNSIGNED, OVERFLOW_WRAPS), i, 0);
+ Cast_Operator<C_Expr> cast2(FP_Type, &var);
+ linearize(cast2, Test_Oracle(), FP_Linear_Form_Abstract_Store(), result);
+
+ bool ok2 = approx.contains(result.inhomogeneous_term());
+
+ return ok1 && ok2;
+}
+
+/*
+ Tests linearization of an approximable reference having more than
+ one associated index.
+*/
+bool
+test09() {
+ Test_Oracle oracle(FP_Interval_Abstract_Store(4));
+ oracle.int_store.set_interval(Variable(0), FP_Interval(0));
+ oracle.int_store.set_interval(Variable(1), FP_Interval(10));
+ oracle.int_store.set_interval(Variable(2), FP_Interval(20));
+ oracle.int_store.set_interval(Variable(3), FP_Interval(5));
+ Approximable_Reference<C_Expr> ref(FP_Type, Int_Interval(mpz_class(0)), 0);
+ ref.dimensions.insert(1);
+ ref.dimensions.insert(3);
+ FP_Linear_Form result;
+ if (!linearize(ref, oracle, FP_Linear_Form_Abstract_Store(), result))
+ return false;
+
+ FP_Interval known_int(FP_Interval(0));
+ known_int.join_assign(FP_Interval(10));
+ FP_Linear_Form known_result(known_int);
+
+ nout << "*** result ***" << endl
+ << result << endl;
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Concrete_Expression/octagonalshape1.cc b/tests/Concrete_Expression/octagonalshape1.cc
new file mode 100644
index 0000000..e7e5a3b
--- /dev/null
+++ b/tests/Concrete_Expression/octagonalshape1.cc
@@ -0,0 +1,347 @@
+/* Test Octagonal_Shape::affine_form_image on interval linear forms.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests space_dimensions and trivial cases.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ FP_Octagonal_Shape oc1(0);
+ bool ok1 = false;
+ FP_Linear_Form l(A);
+
+ try {
+ oc1.affine_form_image(A, l);
+ }
+ catch(std::invalid_argument e) {
+ nout << "oc1_space_dim < lf_space_dim" << endl;
+ ok1 = true;
+ }
+
+ bool ok2 = false;
+ FP_Octagonal_Shape oc2(1);
+
+ try {
+ oc2.affine_form_image(B, l);
+ }
+ catch(std::invalid_argument e) {
+ nout << "space_dim < var_id + 1" << endl;
+ oc2.affine_form_image(A, l);
+ Constraint_System cs(A < A);
+ oc2.add_constraints(cs);
+ oc2.affine_form_image(A, l);
+ ok2 = true;
+ }
+
+ return ok1 && ok2;
+}
+
+// Tests affine_form_image(A, [-2, 1]).
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(-2);
+ free_term.join_assign(1);
+ FP_Linear_Form l(free_term);
+ oc1.affine_form_image(A, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(A, [-2, 1]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(A >= -2);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(A <= 1);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+
+// Tests affine_form_image(A, [-1, -1]*A + [0.5, 2]).
+bool test03() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(static_cast<FP_Interval::boundary_type>(0.5));
+ free_term.join_assign(2);
+ FP_Linear_Form l(-A);
+ l += free_term;
+ print_constraints(oc1, "*** oc1 ***");
+ oc1.affine_form_image(A, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(A, -A + [0.5, 2]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(-2 * A <= 3);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(2*B - 2*A <= 7);
+ known_result.add_constraint(2*A + 2*B >= -5);
+ print_constraints(known_result, "*** known_result ***");
+ bool ok = (oc1 == known_result);
+
+ return ok;
+
+}
+
+
+// Tests affine_form_image(B, [1, 1]*B + [-1.5, 3.5]).
+bool test04() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(static_cast<FP_Interval::boundary_type>(-1.5));
+ free_term.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+ FP_Linear_Form l(B);
+ l += free_term;
+ oc1.affine_form_image(B, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(B, B + [-1.5, 3.5]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(2*B <= 11);
+ known_result.add_constraint(2*B + 2*A <= 15);
+ known_result.add_constraint(-2*B + 2*A <= 9);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, [1, 1]*B + [-2, 0.5]).
+bool test05() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(-2);
+ free_term.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+ FP_Linear_Form l(B);
+ l += free_term;
+ oc1.affine_form_image(A, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(A, B + [-2, 0.5]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(2*A <= 5);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B - A <= 2);
+ known_result.add_constraint(2*A - 2*B <= 1);
+ known_result.add_constraint(2*A + 2*B <= 9);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*A + [-3, 1]).
+bool test06() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(-3);
+ free_term.join_assign(1);
+ FP_Linear_Form l(A);
+ l += free_term;
+ oc1.affine_form_image(B, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(B, A + [-3, 1]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 3);
+ known_result.add_constraint(B - A <= 1);
+ known_result.add_constraint(A - B <= 3);
+ known_result.add_constraint(A + B <= 5);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [-1, -1]*A + [0, 4]).
+bool test07() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(0);
+ free_term.join_assign(4);
+ FP_Linear_Form l(-A);
+ l += free_term;
+ oc1.affine_form_image(B, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(B, -A + [0, 4]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(-B <= 2);
+ known_result.add_constraint(-B - A <= 0);
+ known_result.add_constraint(A - B <= 4);
+ known_result.add_constraint(A + B <= 4);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*B + [0, 2]).
+bool test08() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval free_term(0);
+ free_term.join_assign(2);
+ FP_Linear_Form l(-B);
+ l += free_term;
+ oc1.affine_form_image(A, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(A, -B + [0, 2]) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(-A <= 2);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(-B - A <= 0);
+ known_result.add_constraint(-A + B <= 4);
+ known_result.add_constraint(A + B <= 2);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests affine_form_image(B, [-0.5, 0.5]*A).
+bool test09() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Interval coeff(static_cast<FP_Interval::boundary_type>(-0.5));
+ coeff.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+ FP_Linear_Form l(A);
+ l *= coeff;
+ oc1.affine_form_image(B, l);
+ print_constraints(oc1, "*** oc1.affine_form_image(B, [-0.5, 0.5]*A) ***");
+
+ FP_Octagonal_Shape known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(-B + A <= 3);
+ known_result.add_constraint(A + B <= 3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+
+// Tests affine_form_image(A, i + i0*A + i1*B) where
+// i = [0, 2], i0 = [1, 1] and i1 = [1, 2].
+bool test10() {
+
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(2);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(B <= 2);
+ oc1.add_constraint(A - B >= 0);
+ FP_Interval tmp(1);
+ FP_Linear_Form l(A);
+ l *= tmp;
+ tmp.lower() = 0;
+ tmp.upper() = 2;
+ l += tmp;
+ tmp.lower() = 1;
+ tmp.upper() = 2;
+ l += tmp * FP_Linear_Form(B);
+ oc1.affine_form_image(A,l);
+ print_constraints(oc1, "*** oc1.affine_form_image(A, i + i0*A + i1*B) ***");
+
+ FP_Octagonal_Shape know_result(2);
+ know_result.add_constraint(A >= 0);
+ know_result.add_constraint(A <= 8);
+ know_result.add_constraint(B >= 0);
+ know_result.add_constraint(B <= 2);
+ know_result.add_constraint(A - B <= 6);
+ know_result.add_constraint(A + B <= 10);
+ know_result.add_constraint(-A + B <= 0);
+ know_result.add_constraint(-A - B <= 0);
+ print_constraints(know_result, "*** know_result ***");
+
+ bool ok = (oc1 == know_result);
+
+ return ok;
+}
+
+} //namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/octagonalshape2.cc b/tests/Concrete_Expression/octagonalshape2.cc
new file mode 100644
index 0000000..d00e9c1
--- /dev/null
+++ b/tests/Concrete_Expression/octagonalshape2.cc
@@ -0,0 +1,464 @@
+/* Test Octagonal_Shape::refine_fp_interval_abstract_store and
+ Octagonal_Shape::refine_with_linear_form_inequality.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests trivial cases.
+bool
+test01() {
+ Variable A(0);
+ FP_Octagonal_Shape oc1(0);
+ bool ok1 = false;
+ FP_Linear_Form l1(A);
+ FP_Linear_Form l2;
+ try {
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ }
+ catch(std::invalid_argument e) {
+ nout << "space_dim < left_space_dim" << endl;
+ ok1 = true;
+ }
+
+ bool ok2 = false;
+ try {
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ }
+ catch(std::invalid_argument e) {
+ nout << "space_dim < right_space_dim" << endl;
+ FP_Octagonal_Shape oc2(1);
+ oc2.refine_with_linear_form_inequality(l1, l1);
+ oc2.refine_with_linear_form_inequality(-l1, l1);
+ oc2.refine_with_linear_form_inequality(l1, -l1);
+ FP_Interval tmp(0);
+ l1 -= A;
+ l1 += tmp;
+ l2 += tmp;
+ oc2.refine_with_linear_form_inequality(l1, l2);
+ ok2 = true;
+ }
+
+ return ok1 && ok2;
+}
+
+// Tests [-1, 2] <= [-4, -1] + A and [-4, -1] + A <= [-1, 2].
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(-1);
+ tmp.join_assign(2);
+ FP_Linear_Form l1(tmp);
+ FP_Linear_Form l2(A);
+ tmp.lower() = -4;
+ tmp.upper() = -1;
+ l2 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [-1, 2] <= [-4, -1] + A ***");
+
+ known_result.add_constraint(-A <= 0);
+ print_constraints(known_result, "*** known_result1 ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [-4, -1] + A <= [-1, 2] ***");
+
+ known_result.add_constraint(A <= 6);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [3.5, 6] <= [-2.5, 0] - A and [-2.5, 0] - A <= [3.5, 6].
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(3.5));
+ tmp.join_assign(6);
+ FP_Linear_Form l1(tmp);
+ FP_Linear_Form l2(-A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(-2.5);
+ tmp.upper() = 0;
+ l2 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [3.5, 6] <= [-2.5, 0] - A ***");
+
+ known_result.add_constraint(2*A <= -7);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [-2.5, 0] - A <= [3.5, 6] ***");
+
+ known_result.add_constraint(2*A >= -17);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [-0.5, 1] + A <= [2.5, 5] + B and [2.5, 5] + B <= [-0.5, 1] + A.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-0.5));
+ tmp.join_assign(1);
+ FP_Linear_Form l1(A);
+ l1 += tmp;
+ FP_Linear_Form l2(B);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(2.5);
+ tmp.upper() = 5;
+ l2 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [-0.5, 1] + A <= [2.5, 5] + B ***");
+
+ known_result.add_constraint(2*A - 2*B <= 11);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [2.5, 5] + B <= [-0.5, 1] + A ***");
+
+ known_result.add_constraint(2*B - 2*A <= -3);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 3] + A <= [4, 4] - B and [4, 4] - B <= [1, 3] + A.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(4);
+ FP_Linear_Form l2(-B);
+ l2 += tmp;
+ FP_Linear_Form l1(A);
+ tmp.lower() = 1;
+ tmp.upper() = 3;
+ l1 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [1, 3] + A <= [4, 4] - B ***");
+
+ known_result.add_constraint(A + B <= 3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+ known_result.add_constraint(-B - A <= -1);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 4] - A <= [-2, -2] + B and [-2, -2] + B <= [1, 4] - A.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(-2);
+ FP_Linear_Form l2(B);
+ l2 += tmp;
+ FP_Linear_Form l1(-A);
+ tmp.lower() = 1;
+ tmp.upper() = 4;
+ l1 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [1, 4] - A <= [-2, -2] + B ***");
+
+ known_result.add_constraint(-B - A <= -3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+ known_result.add_constraint(-B - A <= -1);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [-3, -0.5] - A <= [-2, -1] - B and [-2, -1] - B <= [-3, -0.5] - A.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(-2);
+ tmp.join_assign(-1);
+ FP_Linear_Form l2(-B);
+ l2 += tmp;
+ FP_Linear_Form l1(-A);
+ tmp.lower() = -3;
+ tmp.upper() = static_cast<FP_Interval::boundary_type>(-0.5);
+ l1 += tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [-3, -0.5] - A <= [-2, -1] - B ***");
+
+ known_result.add_constraint(B - A <= 2);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [-2, -1] - B <= [-3, -0.5] - A ***");
+
+ known_result.add_constraint(-2*B + 2*A <= 3);
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+
+}
+
+// Tests [1, 3] * B <= [-1.5, 0] * A.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(1);
+ tmp.join_assign(3);
+ FP_Linear_Form l1(B);
+ l1 *= tmp;
+ FP_Linear_Form l2(A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(-1.5);
+ tmp.upper() = 0;
+ l2 *= tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [1, 3] * B <= [-1.5, 0] * A ***");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests [0.25, 0.5] * A + [-2, -1] * B <= [-7, -2]
+// and [-7, -2] <= [0.25, 0.5] * A + [-2, -1] * B.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+
+ FP_Interval tmp(-7);
+ tmp.join_assign(-2);
+ FP_Linear_Form l2(tmp);
+ FP_Linear_Form l1(A);
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(0.25);
+ tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+ l1 *= tmp;
+ tmp.lower() = -2;
+ tmp.upper() = -1;
+ l1 += tmp * FP_Linear_Form(B);
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [0.25, 0.5]*A + [-2, -1]*B <= [-7, -2] ***");
+
+ known_result.add_constraint(2*B + 2*A <= 11);
+ known_result.add_constraint(-2*B + 2*A <= 3);
+ known_result.add_constraint(2*A <= 7);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok1 = (oc1 == known_result);
+
+ oc1.refine_with_linear_form_inequality(l2, l1);
+ print_constraints(oc1, "*** [-7, -2] <= [0.25, 0.5]*A + [-2, -1]*B ***");
+
+ print_constraints(known_result, "*** known_result2 ***");
+
+ bool ok2 = (oc1 == known_result);
+
+ return ok1 && ok2;
+}
+
+// Tests [-5, -1] * A <= [2, 3] * B + [0.5, 1].
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ FP_Octagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= 3);
+ oc1.add_constraint(B <= 2);
+ FP_Octagonal_Shape known_result(oc1);
+ FP_Interval tmp(2);
+ tmp.join_assign(3);
+ FP_Linear_Form l2(B);
+ l2 *= tmp;
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(0.5);
+ tmp.upper() = 1;
+ l2 += tmp;
+ FP_Linear_Form l1(A);
+ tmp.lower() = -5;
+ tmp.upper() = -1;
+ l1 *= tmp;
+ oc1.refine_with_linear_form_inequality(l1, l2);
+ print_constraints(oc1, "*** [-5, -1] * A <= [2, 3] * B + [0.5, 1] ***");
+
+ known_result.add_constraint(B - A <= 17);
+ known_result.add_constraint(B + A <= 21);
+ known_result.add_constraint(-B - A <= 13);
+ known_result.add_constraint(-B + A <= 17);
+ known_result.add_constraint(A <= 19);
+ known_result.add_constraint(-A <= 15);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (oc1 == known_result);
+
+ return ok;
+}
+
+// Tests Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-2.5));
+ tmp.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+ store.set_interval(A, tmp);
+ tmp.lower() = -4;
+ tmp.upper() = 4;
+ store.set_interval(B, tmp);
+ Octagonal_Shape<ANALYZER_FP_FORMAT> oc1(2);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(B <= 2);
+ oc1.add_constraint(A >= -3);
+ oc1.add_constraint(2*B >= -3);
+ oc1.refine_fp_interval_abstract_store(store);
+
+ tmp = store.get_interval(A);
+ nout << "*** store.get_interval(A) ***" << endl
+ << tmp << endl;
+
+ FP_Interval known_result1(static_cast<FP_Interval::boundary_type>(-2.5));
+ known_result1.join_assign(2);
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ bool ok1 = (tmp == known_result1);
+
+ tmp = store.get_interval(B);
+ nout << "*** store.get_interval(B) ***" << endl
+ << tmp << endl;
+
+ FP_Interval known_result2(static_cast<FP_Interval::boundary_type>(-1.5));
+ known_result2.join_assign(2);
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ bool ok2 = (tmp == known_result2);
+
+ return ok1 && ok2;
+}
+
+} //namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Concrete_Expression/polyhedron1.cc b/tests/Concrete_Expression/polyhedron1.cc
new file mode 100644
index 0000000..48efb2b
--- /dev/null
+++ b/tests/Concrete_Expression/polyhedron1.cc
@@ -0,0 +1,278 @@
+/* Test Polyhedron::affine_form_image on interval linear forms.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests ph.affine_form_image(B, 3).
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ FP_Interval_Abstract_Store store(3);
+ FP_Interval tmp(0);
+ store.set_interval(B, tmp);
+ tmp.lower() = -2;
+ tmp.upper() = 2;
+ store.set_interval(A, tmp);
+ tmp.lower() = -1;
+ tmp.upper() = 1;
+ store.set_interval(C, tmp);
+ C_Polyhedron ph(3);
+ ph.add_constraint(C == 0);
+ ph.add_constraint(A == -2);
+ tmp = 3;
+ FP_Linear_Form l(tmp);
+
+ ph.affine_form_image(B, l);
+ print_constraints(ph, "*** ph.affine_form_image(B, 3) ***");
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point(-2 * A + 3 * B));
+ print_constraints(known_result, "*** know_result ***");
+
+ bool ok = (ph == known_result);
+ return ok;
+}
+
+// Tests ph.affine_form_image(A, A + B + 1).
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(1);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= B);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A <= 3);
+ FP_Linear_Form l(A);
+ l += B;
+ l += tmp;
+ ph.affine_form_image(A, l);
+ print_constraints(ph, "*** ph.affine_form_image(A, A + B + 1) ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - 2*B - 1 >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B <= 4);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (ph == known_result);
+
+ return ok;
+}
+
+// Tests ph.affine_form_image(A, (A + 1) / 2).
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(FP_Interval::boundary_type(1 / 2.0));
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(B));
+ C_Polyhedron ph(gs);
+ FP_Linear_Form l(A);
+ l *= tmp;
+ l += tmp;
+ ph.affine_form_image(A, l);
+ print_constraints(ph, "*** ph.affine_form_image(A, (A + 1) / 2) ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(2*A >= 1);
+ known_result.add_constraint(B >= 0);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (ph == known_result);
+
+ return ok;
+}
+
+// Tests ph.affine_form_image(A, (B + 2) / (-3)).
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(-1);
+ tmp /= FP_Interval(3);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A));
+ FP_Linear_Form l(B);
+ l *= tmp;
+ tmp += tmp;
+ l += tmp;
+ ph.affine_form_image(A, l);
+ print_constraints(ph, "*** ph.affine_form_image(A, (B + 2) / (-3)) ***");
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(-2*A, 3));
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (ph.contains(known_result));
+
+ return ok;
+}
+
+// Tests ph.affine_form_image(B, (A - B + 2) / (-3)).
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(2);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(A <= 3);
+ ph.add_constraint(B >= 1);
+ ph.add_constraint(2*A >= B);
+ FP_Linear_Form l(A);
+ l += tmp;
+ l -= B;
+ l /= FP_Interval(-3);
+
+ ph.affine_form_image(B, l);
+ print_constraints(ph,
+ "*** ph.affine_form_image(B, (A - B + 2) / (-3)) ***");
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(2*A));
+ known_result.add_generator(point(2*A - B));
+ known_result.add_generator(point(9*A + B, 3));
+ known_result.add_generator(point(9*A - 4*B, 3));
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (ph.contains(known_result));
+
+ return ok;
+}
+
+// Tests ph.affine_form_image(A, (-A - 1) / (-1)).
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(-1);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ FP_Linear_Form l(-A);
+ l += tmp;
+ l /= tmp;
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(point(B));
+ gs.insert(point(A + B));
+ C_Polyhedron ph(gs);
+ ph.affine_form_image(A, l);
+ print_constraints(ph,
+ "*** ph.affine_form_image(A, (-A - 1) / (-1)) ***");
+
+ Generator_System known_gs;
+ known_gs.insert(point(A));
+ known_gs.insert(point(2*A));
+ known_gs.insert(point(A + B));
+ known_gs.insert(point(2*A + B));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** known_result ***");
+
+ return ok;
+}
+
+// Tests affine_form_image on NNC_Polyhedron.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval_Abstract_Store store(2);
+ FP_Interval tmp(2);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ FP_Linear_Form l(A);
+
+ NNC_Polyhedron p1(2);
+ p1.add_constraint(B == 0);
+ p1.add_constraint(-A > 0);
+
+ NNC_Polyhedron p2(2);
+ p2.add_constraint(B == 0);
+ p2.add_constraint(A >= 0);
+
+ p1.affine_form_image(B, l);
+ print_constraints(p1, "*** p1.affine_form_image(B, A) ***");
+ NNC_Polyhedron known_result1(2);
+ known_result1.add_constraint(A - B == 0);
+ known_result1.add_constraint(A < 0);
+ print_constraints(p1, "*** known_result1 ***");
+ bool ok1 = (p1 == known_result1);
+
+ l += tmp;
+ p2.affine_form_image(B, l);
+ print_constraints(p2, "*** p2.affine_form_image(B, A + 2) ***");
+ NNC_Polyhedron known_result2(2);
+ known_result2.add_constraint(A - B == -2);
+ known_result2.add_constraint(A >= 0);
+ print_constraints(p2, "*** known_result2 ***");
+ bool ok2 = (p2 == known_result2);
+
+ return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ if (sizeof(ANALYZER_FP_FORMAT) == 4) {
+ DO_TEST_F32A(test04);
+ DO_TEST_F64A(test05);
+ }
+ else if (sizeof(ANALYZER_FP_FORMAT) == 8) {
+ DO_TEST_F64A(test04);
+ DO_TEST_F64(test05);
+ }
+ else {
+ DO_TEST_F64(test04);
+ DO_TEST_F64(test05);
+ }
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Concrete_Expression/polyhedron2.cc b/tests/Concrete_Expression/polyhedron2.cc
new file mode 100644
index 0000000..9b4a65f
--- /dev/null
+++ b/tests/Concrete_Expression/polyhedron2.cc
@@ -0,0 +1,247 @@
+/* Test Polyhedron::refine_fp_interval_abstract_store,
+ Polyhedron::refine_with_linear_form_inequality and
+ Polyhedron::generalized_refine_with_linear_form_inequality.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests incompatible dimensions.
+bool
+test01() {
+ C_Polyhedron pol(1);
+ FP_Interval_Abstract_Store store(1);
+ store.set_interval(Variable(0), FP_Interval(0));
+ try {
+ FP_Linear_Form l1(Variable(3));
+ FP_Linear_Form l2;
+ pol.refine_with_linear_form_inequality(l1, l2);
+ }
+ catch (std::invalid_argument) {
+ try {
+ FP_Linear_Form l1;
+ FP_Linear_Form l2(Variable(3));
+ pol.refine_with_linear_form_inequality(l1, l2);
+ }
+ catch (std::invalid_argument) {
+ nout << "incompatible dimensions." << endl;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Tests A <= [57, 57].
+bool
+test02() {
+ C_Polyhedron ph(1);
+ FP_Interval_Abstract_Store store(1);
+ store.set_interval(Variable(0), FP_Interval(static_cast<FP_Interval::boundary_type>(1.5)));
+ FP_Interval interval(57);
+ FP_Linear_Form lf1(Variable(0));
+ FP_Linear_Form lf2(interval);
+ ph.refine_with_linear_form_inequality(lf1, lf2);
+ print_constraints(ph, "*** A <= [57, 57] ***");
+ C_Polyhedron known_result(1);
+ known_result.refine_with_constraint(Variable(0) <= 57);
+ print_constraints(known_result, "*** known_result ***");
+
+ return ph == known_result;
+}
+
+// Tests -A <= 0 && A <= 2 && -A <= 1 && -B <= -1 && C = 0.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ FP_Interval_Abstract_Store store(3);
+ FP_Interval tmp(0);
+ store.set_interval(A, tmp);
+ store.set_interval(B, tmp);
+ store.set_interval(C, tmp);
+
+ C_Polyhedron ph(3);
+ ph.refine_with_linear_form_inequality(-FP_Linear_Form(A),
+ FP_Linear_Form(FP_Interval(0)));
+ ph.refine_with_linear_form_inequality(FP_Linear_Form(A),
+ FP_Linear_Form(FP_Interval(2)));
+ ph.refine_with_linear_form_inequality(-FP_Linear_Form(A),
+ FP_Linear_Form(FP_Interval(1)));
+ ph.refine_with_linear_form_inequality(-FP_Linear_Form(B),
+ FP_Linear_Form(FP_Interval(-1)));
+ ph.generalized_refine_with_linear_form_inequality(
+ FP_Linear_Form(C), FP_Linear_Form(tmp), EQUAL);
+ ph.generalized_refine_with_linear_form_inequality(
+ FP_Linear_Form(C), FP_Linear_Form(tmp), NOT_EQUAL);
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C == 0);
+ print_constraints(known_result, "*** known_result ***");
+
+ return ph == known_result;
+}
+
+// Tests -A <= -1/3 && A <= 2/3 && -B <= 0 && B <= 1/3
+// and refine_fp_interval_abstract_store.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval tmp0(0);
+ tmp0.join_assign(10);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(A, tmp0);
+ store.set_interval(B, tmp0);
+ FP_Linear_Form la(A);
+ FP_Linear_Form lb(B);
+
+ FP_Interval tmp(2);
+ tmp /= FP_Interval(3);
+
+ C_Polyhedron ph(2);
+ ph.generalized_refine_with_linear_form_inequality(
+ FP_Linear_Form(tmp), la, GREATER_THAN);
+ tmp = -1;
+ tmp /= FP_Interval(3);
+ ph.generalized_refine_with_linear_form_inequality(
+ FP_Linear_Form(tmp), -la, GREATER_OR_EQUAL);
+ tmp = 1;
+ tmp /= FP_Interval(3);
+ ph.generalized_refine_with_linear_form_inequality(
+ lb, FP_Linear_Form(tmp), LESS_OR_EQUAL);
+ tmp = 0;
+ ph.generalized_refine_with_linear_form_inequality(
+ -lb, FP_Linear_Form(tmp), LESS_THAN);
+
+ C_Polyhedron known_result1(2);
+ known_result1.add_constraint(3*A >= 1);
+ known_result1.add_constraint(3*A <= 2);
+ known_result1.add_constraint(B >= 0);
+ known_result1.add_constraint(3*B <= 1);
+ print_constraints(known_result1, "*** known_result1 ***");
+
+ Box<FP_Interval> box(ph);
+ print_constraints(ph, "*** ph ***");
+ print_constraints(box, "*** box ***");
+
+ bool ok1 = ph.contains(known_result1);
+
+ ph.refine_fp_interval_abstract_store(store);
+ nout << "*** FP_Interval_Abstract_Store ***" << endl;
+
+ nout << "tmp0 = " << tmp0 << endl;
+
+ nout << "A = " << store.get_interval(A) << endl;
+ bool ok2 = tmp0.contains(store.get_interval(A));
+
+ nout << "B = " << store.get_interval(B) << endl;
+ bool ok3 = tmp0.contains(store.get_interval(B));
+
+ return ok1 && ok2 && ok3;
+
+}
+
+// Tests (2/3)*B + [-0.5, 0.5] >= (1/3)*A
+// where A = B = [-1, 1].
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ FP_Interval tmp0(-1);
+ tmp0.join_assign(1);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(A, tmp0);
+ store.set_interval(B, tmp0);
+ FP_Interval tmp(1);
+ tmp /= FP_Interval(3);
+ FP_Linear_Form la(A);
+ la *= tmp;
+ FP_Linear_Form lb(B);
+ tmp += tmp;
+ lb *= tmp;
+ tmp.lower() = static_cast<FP_Interval::boundary_type>(-0.5);
+ tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+ lb += tmp;
+
+ NNC_Polyhedron ph(2);
+ FP_Linear_Form l(tmp0);
+ ph.affine_form_image(A, l);
+ ph.affine_form_image(B, l);
+ ph.generalized_refine_with_linear_form_inequality(
+ lb, la, GREATER_OR_EQUAL);
+ print_constraints(ph, "*** ph ***");
+
+ NNC_Polyhedron known_result1(2);
+ known_result1.add_constraint(2*A <= 4*B + 3);
+ known_result1.add_constraint(A >= -1);
+ known_result1.add_constraint(A <= 1);
+ known_result1.add_constraint(B >= -1);
+ known_result1.add_constraint(B <= 1);
+ print_constraints(known_result1, "*** known_result1 ***");
+
+ bool ok1 = ph.contains(known_result1);
+
+ ph.refine_fp_interval_abstract_store(store);
+ nout << "*** FP_Interval_Abstract_Store ***" << endl;
+
+ nout << "A = " << store.get_interval(A) << endl;
+ bool ok2 = tmp0.contains(store.get_interval(A));
+
+ nout << "B = " << store.get_interval(B) << endl;
+ bool ok3 = tmp0.contains(store.get_interval(B));
+
+ return ok1 && ok2 && ok3;
+
+ return ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ if (sizeof(ANALYZER_FP_FORMAT) == 4) {
+ DO_TEST_F32(test04);
+#ifdef NDEBUG
+ DO_TEST_F16(test05);
+#else
+ DO_TEST_F64A(test05);
+#endif
+ }
+ else if (sizeof(ANALYZER_FP_FORMAT) == 8) {
+ DO_TEST_F64(test04);
+ DO_TEST_F64A(test05);
+ }
+ else {
+ DO_TEST_F64(test04);
+ DO_TEST_F64(test05);
+ }
+END_MAIN
diff --git a/tests/Concrete_Expression/run_tests b/tests/Concrete_Expression/run_tests
new file mode 100755
index 0000000..2f4ce05
--- /dev/null
+++ b/tests/Concrete_Expression/run_tests
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+# Run the Floating_Point_Expression tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+ MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+ echo "**************************** " $instance " ****************************"
+ eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+ [ -f dirty_marker ] && $MAKE clean
+ touch dirty_marker
+ analyzer_fp_format=${instance%/*}
+ analyzed_fp_format=${instance#*/}
+ $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DANALYZER_FP_FORMAT=$analyzer_fp_format -DANALYZED_FP_FORMAT=$analyzed_fp_format" XFAIL_TESTS=$xfail_tests || exit 1
+ $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Grid/Makefile.am b/tests/Grid/Makefile.am
new file mode 100644
index 0000000..82cec2f
--- /dev/null
+++ b/tests/Grid/Makefile.am
@@ -0,0 +1,310 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+approximatepartition1 \
+asciidumpload1 asciidumpload2 asciidumpload3 asciidumpload4 asciidumpload5 \
+asciidumpload6 \
+bhz03widening1 \
+bounded1 \
+bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruences2 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+dropnonintegerpoints1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+generalizedaffineimage1 generalizedaffineimage2 generalizedaffineimage3 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+generator1 \
+generators1 generators2 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+limitedextrapolation1 limitedextrapolation2 limitedextrapolation3 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 outputoperator2 outputoperator3 \
+partition1 \
+powersetdifference1 \
+powersetgeometricallycovers1 \
+powersetgeometricallyequals1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+upperbound1 upperbound2 \
+widening1 widening2 widening3 \
+wrap1 \
+writecongruencesystem
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedim1_SOURCES = affinedim1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+approximatepartition1_SOURCES = approximatepartition1.cc
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+certificate1_SOURCES = certificate1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruence1_SOURCES = congruence1.cc
+
+congruences1_SOURCES = congruences1.cc
+congruences2_SOURCES = congruences2.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropnonintegerpoints1_SOURCES = dropnonintegerpoints1.cc
+
+equals1_SOURCES = equals1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+
+generator1_SOURCES = generator1.cc
+
+generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
+
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+
+griddifference1_SOURCES = griddifference1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+isempty1_SOURCES = isempty1.cc
+
+isuniverse1_SOURCES = isuniverse1.cc
+
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+mincongruences1_SOURCES = mincongruences1.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+
+outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+
+partition1_SOURCES = partition1.cc
+
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+upperbound2_SOURCES = upperbound2.cc
+
+widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
+
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+
+wrap1_SOURCES = wrap1.cc
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Grid/Makefile.in b/tests/Grid/Makefile.in
new file mode 100644
index 0000000..3e7a75c
--- /dev/null
+++ b/tests/Grid/Makefile.in
@@ -0,0 +1,3108 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+ addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+ addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+ addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+ affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+ affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+ approximatepartition1$(EXEEXT) asciidumpload1$(EXEEXT) \
+ asciidumpload2$(EXEEXT) asciidumpload3$(EXEEXT) \
+ asciidumpload4$(EXEEXT) asciidumpload5$(EXEEXT) \
+ asciidumpload6$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) bounds1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+ certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+ congruence1$(EXEEXT) congruences1$(EXEEXT) \
+ congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+ disjoint1$(EXEEXT) dropnonintegerpoints1$(EXEEXT) \
+ equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+ fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+ generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffineimage3$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) \
+ generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+ generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+ grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+ intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+ limitedextrapolation1$(EXEEXT) limitedextrapolation2$(EXEEXT) \
+ limitedextrapolation3$(EXEEXT) mapspacedims1$(EXEEXT) \
+ maxmin1$(EXEEXT) membytes1$(EXEEXT) mingenerators1$(EXEEXT) \
+ mincongruences1$(EXEEXT) outputoperator1$(EXEEXT) \
+ outputoperator2$(EXEEXT) outputoperator3$(EXEEXT) \
+ partition1$(EXEEXT) powersetdifference1$(EXEEXT) \
+ powersetgeometricallycovers1$(EXEEXT) \
+ powersetgeometricallyequals1$(EXEEXT) \
+ refinewithcongruences1$(EXEEXT) \
+ refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+ relations2$(EXEEXT) relations3$(EXEEXT) \
+ removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+ topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \
+ upperbound1$(EXEEXT) upperbound2$(EXEEXT) widening1$(EXEEXT) \
+ widening2$(EXEEXT) widening3$(EXEEXT) wrap1$(EXEEXT) \
+ writecongruencesystem$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Grid
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+ addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+ addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+ addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+ affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+ affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+ approximatepartition1$(EXEEXT) asciidumpload1$(EXEEXT) \
+ asciidumpload2$(EXEEXT) asciidumpload3$(EXEEXT) \
+ asciidumpload4$(EXEEXT) asciidumpload5$(EXEEXT) \
+ asciidumpload6$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) bounds1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+ certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+ congruence1$(EXEEXT) congruences1$(EXEEXT) \
+ congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+ disjoint1$(EXEEXT) dropnonintegerpoints1$(EXEEXT) \
+ equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+ fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+ generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffineimage3$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) \
+ generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+ generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+ grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+ intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+ limitedextrapolation1$(EXEEXT) limitedextrapolation2$(EXEEXT) \
+ limitedextrapolation3$(EXEEXT) mapspacedims1$(EXEEXT) \
+ maxmin1$(EXEEXT) membytes1$(EXEEXT) mingenerators1$(EXEEXT) \
+ mincongruences1$(EXEEXT) outputoperator1$(EXEEXT) \
+ outputoperator2$(EXEEXT) outputoperator3$(EXEEXT) \
+ partition1$(EXEEXT) powersetdifference1$(EXEEXT) \
+ powersetgeometricallycovers1$(EXEEXT) \
+ powersetgeometricallyequals1$(EXEEXT) \
+ refinewithcongruences1$(EXEEXT) \
+ refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+ relations2$(EXEEXT) relations3$(EXEEXT) \
+ removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+ topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \
+ upperbound1$(EXEEXT) upperbound2$(EXEEXT) widening1$(EXEEXT) \
+ widening2$(EXEEXT) widening3$(EXEEXT) wrap1$(EXEEXT) \
+ writecongruencesystem$(EXEEXT)
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinedim1_OBJECTS = affinedim1.$(OBJEXT)
+affinedim1_OBJECTS = $(am_affinedim1_OBJECTS)
+affinedim1_LDADD = $(LDADD)
+affinedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_approximatepartition1_OBJECTS = approximatepartition1.$(OBJEXT)
+approximatepartition1_OBJECTS = $(am_approximatepartition1_OBJECTS)
+approximatepartition1_LDADD = $(LDADD)
+approximatepartition1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload1_OBJECTS = asciidumpload1.$(OBJEXT)
+asciidumpload1_OBJECTS = $(am_asciidumpload1_OBJECTS)
+asciidumpload1_LDADD = $(LDADD)
+asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload2_OBJECTS = asciidumpload2.$(OBJEXT)
+asciidumpload2_OBJECTS = $(am_asciidumpload2_OBJECTS)
+asciidumpload2_LDADD = $(LDADD)
+asciidumpload2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload3_OBJECTS = asciidumpload3.$(OBJEXT)
+asciidumpload3_OBJECTS = $(am_asciidumpload3_OBJECTS)
+asciidumpload3_LDADD = $(LDADD)
+asciidumpload3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload4_OBJECTS = asciidumpload4.$(OBJEXT)
+asciidumpload4_OBJECTS = $(am_asciidumpload4_OBJECTS)
+asciidumpload4_LDADD = $(LDADD)
+asciidumpload4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload5_OBJECTS = asciidumpload5.$(OBJEXT)
+asciidumpload5_OBJECTS = $(am_asciidumpload5_OBJECTS)
+asciidumpload5_LDADD = $(LDADD)
+asciidumpload5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload6_OBJECTS = asciidumpload6.$(OBJEXT)
+asciidumpload6_OBJECTS = $(am_asciidumpload6_OBJECTS)
+asciidumpload6_LDADD = $(LDADD)
+asciidumpload6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_certificate1_OBJECTS = certificate1.$(OBJEXT)
+certificate1_OBJECTS = $(am_certificate1_OBJECTS)
+certificate1_LDADD = $(LDADD)
+certificate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruence1_OBJECTS = congruence1.$(OBJEXT)
+congruence1_OBJECTS = $(am_congruence1_OBJECTS)
+congruence1_LDADD = $(LDADD)
+congruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences2_OBJECTS = congruences2.$(OBJEXT)
+congruences2_OBJECTS = $(am_congruences2_OBJECTS)
+congruences2_LDADD = $(LDADD)
+congruences2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropnonintegerpoints1_OBJECTS = dropnonintegerpoints1.$(OBJEXT)
+dropnonintegerpoints1_OBJECTS = $(am_dropnonintegerpoints1_OBJECTS)
+dropnonintegerpoints1_LDADD = $(LDADD)
+dropnonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS = \
+ generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS = \
+ $(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS = \
+ generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS = \
+ $(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS = \
+ generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS = \
+ $(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS = \
+ generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS = \
+ $(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS = \
+ generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS = \
+ $(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generator1_OBJECTS = generator1.$(OBJEXT)
+generator1_OBJECTS = $(am_generator1_OBJECTS)
+generator1_LDADD = $(LDADD)
+generator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generators2_OBJECTS = generators2.$(OBJEXT)
+generators2_OBJECTS = $(am_generators2_OBJECTS)
+generators2_LDADD = $(LDADD)
+generators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_grid1_OBJECTS = grid1.$(OBJEXT)
+grid1_OBJECTS = $(am_grid1_OBJECTS)
+grid1_LDADD = $(LDADD)
+grid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_grid2_OBJECTS = grid2.$(OBJEXT)
+grid2_OBJECTS = $(am_grid2_OBJECTS)
+grid2_LDADD = $(LDADD)
+grid2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_grid3_OBJECTS = grid3.$(OBJEXT)
+grid3_OBJECTS = $(am_grid3_OBJECTS)
+grid3_LDADD = $(LDADD)
+grid3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_griddifference1_OBJECTS = griddifference1.$(OBJEXT)
+griddifference1_OBJECTS = $(am_griddifference1_OBJECTS)
+griddifference1_LDADD = $(LDADD)
+griddifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_isempty1_OBJECTS = isempty1.$(OBJEXT)
+isempty1_OBJECTS = $(am_isempty1_OBJECTS)
+isempty1_LDADD = $(LDADD)
+isempty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_isuniverse1_OBJECTS = isuniverse1.$(OBJEXT)
+isuniverse1_OBJECTS = $(am_isuniverse1_OBJECTS)
+isuniverse1_LDADD = $(LDADD)
+isuniverse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedextrapolation1_OBJECTS = limitedextrapolation1.$(OBJEXT)
+limitedextrapolation1_OBJECTS = $(am_limitedextrapolation1_OBJECTS)
+limitedextrapolation1_LDADD = $(LDADD)
+limitedextrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedextrapolation2_OBJECTS = limitedextrapolation2.$(OBJEXT)
+limitedextrapolation2_OBJECTS = $(am_limitedextrapolation2_OBJECTS)
+limitedextrapolation2_LDADD = $(LDADD)
+limitedextrapolation2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedextrapolation3_OBJECTS = limitedextrapolation3.$(OBJEXT)
+limitedextrapolation3_OBJECTS = $(am_limitedextrapolation3_OBJECTS)
+limitedextrapolation3_LDADD = $(LDADD)
+limitedextrapolation3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mincongruences1_OBJECTS = mincongruences1.$(OBJEXT)
+mincongruences1_OBJECTS = $(am_mincongruences1_OBJECTS)
+mincongruences1_LDADD = $(LDADD)
+mincongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_outputoperator1_OBJECTS = outputoperator1.$(OBJEXT)
+outputoperator1_OBJECTS = $(am_outputoperator1_OBJECTS)
+outputoperator1_LDADD = $(LDADD)
+outputoperator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_outputoperator2_OBJECTS = outputoperator2.$(OBJEXT)
+outputoperator2_OBJECTS = $(am_outputoperator2_OBJECTS)
+outputoperator2_LDADD = $(LDADD)
+outputoperator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_outputoperator3_OBJECTS = outputoperator3.$(OBJEXT)
+outputoperator3_OBJECTS = $(am_outputoperator3_OBJECTS)
+outputoperator3_LDADD = $(LDADD)
+outputoperator3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_partition1_OBJECTS = partition1.$(OBJEXT)
+partition1_OBJECTS = $(am_partition1_OBJECTS)
+partition1_LDADD = $(LDADD)
+partition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_powersetdifference1_OBJECTS = powersetdifference1.$(OBJEXT)
+powersetdifference1_OBJECTS = $(am_powersetdifference1_OBJECTS)
+powersetdifference1_LDADD = $(LDADD)
+powersetdifference1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_powersetgeometricallycovers1_OBJECTS = \
+ powersetgeometricallycovers1.$(OBJEXT)
+powersetgeometricallycovers1_OBJECTS = \
+ $(am_powersetgeometricallycovers1_OBJECTS)
+powersetgeometricallycovers1_LDADD = $(LDADD)
+powersetgeometricallycovers1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_powersetgeometricallyequals1_OBJECTS = \
+ powersetgeometricallyequals1.$(OBJEXT)
+powersetgeometricallyequals1_OBJECTS = \
+ $(am_powersetgeometricallyequals1_OBJECTS)
+powersetgeometricallyequals1_LDADD = $(LDADD)
+powersetgeometricallyequals1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound2_OBJECTS = upperbound2.$(OBJEXT)
+upperbound2_OBJECTS = $(am_upperbound2_OBJECTS)
+upperbound2_LDADD = $(LDADD)
+upperbound2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_widening1_OBJECTS = widening1.$(OBJEXT)
+widening1_OBJECTS = $(am_widening1_OBJECTS)
+widening1_LDADD = $(LDADD)
+widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_widening2_OBJECTS = widening2.$(OBJEXT)
+widening2_OBJECTS = $(am_widening2_OBJECTS)
+widening2_LDADD = $(LDADD)
+widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_widening3_OBJECTS = widening3.$(OBJEXT)
+widening3_OBJECTS = $(am_widening3_OBJECTS)
+widening3_LDADD = $(LDADD)
+widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writecongruencesystem_OBJECTS = writecongruencesystem.$(OBJEXT)
+writecongruencesystem_OBJECTS = $(am_writecongruencesystem_OBJECTS)
+writecongruencesystem_LDADD = $(LDADD)
+writecongruencesystem_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+ $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+ $(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+ $(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+ $(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+ $(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+ $(approximatepartition1_SOURCES) $(asciidumpload1_SOURCES) \
+ $(asciidumpload2_SOURCES) $(asciidumpload3_SOURCES) \
+ $(asciidumpload4_SOURCES) $(asciidumpload5_SOURCES) \
+ $(asciidumpload6_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(certificate1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruence1_SOURCES) $(congruences1_SOURCES) \
+ $(congruences2_SOURCES) $(constraints1_SOURCES) \
+ $(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropnonintegerpoints1_SOURCES) $(equals1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffineimage3_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+ $(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+ $(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
+ $(intersection1_SOURCES) $(isempty1_SOURCES) \
+ $(isuniverse1_SOURCES) $(limitedextrapolation1_SOURCES) \
+ $(limitedextrapolation2_SOURCES) \
+ $(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxmin1_SOURCES) $(membytes1_SOURCES) \
+ $(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+ $(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+ $(outputoperator3_SOURCES) $(partition1_SOURCES) \
+ $(powersetdifference1_SOURCES) \
+ $(powersetgeometricallycovers1_SOURCES) \
+ $(powersetgeometricallyequals1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(unconstrain1_SOURCES) $(upperbound1_SOURCES) \
+ $(upperbound2_SOURCES) $(widening1_SOURCES) \
+ $(widening2_SOURCES) $(widening3_SOURCES) $(wrap1_SOURCES) \
+ $(writecongruencesystem_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+ $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+ $(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+ $(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+ $(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+ $(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+ $(approximatepartition1_SOURCES) $(asciidumpload1_SOURCES) \
+ $(asciidumpload2_SOURCES) $(asciidumpload3_SOURCES) \
+ $(asciidumpload4_SOURCES) $(asciidumpload5_SOURCES) \
+ $(asciidumpload6_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(certificate1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruence1_SOURCES) $(congruences1_SOURCES) \
+ $(congruences2_SOURCES) $(constraints1_SOURCES) \
+ $(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropnonintegerpoints1_SOURCES) $(equals1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffineimage3_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+ $(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+ $(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
+ $(intersection1_SOURCES) $(isempty1_SOURCES) \
+ $(isuniverse1_SOURCES) $(limitedextrapolation1_SOURCES) \
+ $(limitedextrapolation2_SOURCES) \
+ $(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxmin1_SOURCES) $(membytes1_SOURCES) \
+ $(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+ $(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+ $(outputoperator3_SOURCES) $(partition1_SOURCES) \
+ $(powersetdifference1_SOURCES) \
+ $(powersetgeometricallycovers1_SOURCES) \
+ $(powersetgeometricallyequals1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(unconstrain1_SOURCES) $(upperbound1_SOURCES) \
+ $(upperbound2_SOURCES) $(widening1_SOURCES) \
+ $(widening2_SOURCES) $(widening3_SOURCES) $(wrap1_SOURCES) \
+ $(writecongruencesystem_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedim1_SOURCES = affinedim1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+approximatepartition1_SOURCES = approximatepartition1.cc
+asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+certificate1_SOURCES = certificate1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruence1_SOURCES = congruence1.cc
+congruences1_SOURCES = congruences1.cc
+congruences2_SOURCES = congruences2.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropnonintegerpoints1_SOURCES = dropnonintegerpoints1.cc
+equals1_SOURCES = equals1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generator1_SOURCES = generator1.cc
+generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+griddifference1_SOURCES = griddifference1.cc
+intersection1_SOURCES = intersection1.cc
+isempty1_SOURCES = isempty1.cc
+isuniverse1_SOURCES = isuniverse1.cc
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxmin1_SOURCES = maxmin1.cc
+membytes1_SOURCES = membytes1.cc
+mincongruences1_SOURCES = mincongruences1.cc
+mingenerators1_SOURCES = mingenerators1.cc
+outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+partition1_SOURCES = partition1.cc
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperbound2_SOURCES = upperbound2.cc
+widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+wrap1_SOURCES = wrap1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Grid/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Grid/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) $(EXTRA_addcongruence1_DEPENDENCIES)
+ @rm -f addcongruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) $(EXTRA_addconstraint1_DEPENDENCIES)
+ @rm -f addconstraint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) $(EXTRA_addgenerator1_DEPENDENCIES)
+ @rm -f addgenerator1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) $(EXTRA_addgenerators1_DEPENDENCIES)
+ @rm -f addgenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES) $(EXTRA_affinedim1_DEPENDENCIES)
+ @rm -f affinedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) $(EXTRA_affinepreimage2_DEPENDENCIES)
+ @rm -f affinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+
+approximatepartition1$(EXEEXT): $(approximatepartition1_OBJECTS) $(approximatepartition1_DEPENDENCIES) $(EXTRA_approximatepartition1_DEPENDENCIES)
+ @rm -f approximatepartition1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(approximatepartition1_OBJECTS) $(approximatepartition1_LDADD) $(LIBS)
+
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) $(EXTRA_asciidumpload1_DEPENDENCIES)
+ @rm -f asciidumpload1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+
+asciidumpload2$(EXEEXT): $(asciidumpload2_OBJECTS) $(asciidumpload2_DEPENDENCIES) $(EXTRA_asciidumpload2_DEPENDENCIES)
+ @rm -f asciidumpload2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload2_OBJECTS) $(asciidumpload2_LDADD) $(LIBS)
+
+asciidumpload3$(EXEEXT): $(asciidumpload3_OBJECTS) $(asciidumpload3_DEPENDENCIES) $(EXTRA_asciidumpload3_DEPENDENCIES)
+ @rm -f asciidumpload3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload3_OBJECTS) $(asciidumpload3_LDADD) $(LIBS)
+
+asciidumpload4$(EXEEXT): $(asciidumpload4_OBJECTS) $(asciidumpload4_DEPENDENCIES) $(EXTRA_asciidumpload4_DEPENDENCIES)
+ @rm -f asciidumpload4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload4_OBJECTS) $(asciidumpload4_LDADD) $(LIBS)
+
+asciidumpload5$(EXEEXT): $(asciidumpload5_OBJECTS) $(asciidumpload5_DEPENDENCIES) $(EXTRA_asciidumpload5_DEPENDENCIES)
+ @rm -f asciidumpload5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload5_OBJECTS) $(asciidumpload5_LDADD) $(LIBS)
+
+asciidumpload6$(EXEEXT): $(asciidumpload6_OBJECTS) $(asciidumpload6_DEPENDENCIES) $(EXTRA_asciidumpload6_DEPENDENCIES)
+ @rm -f asciidumpload6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload6_OBJECTS) $(asciidumpload6_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES) $(EXTRA_certificate1_DEPENDENCIES)
+ @rm -f certificate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES) $(EXTRA_congruence1_DEPENDENCIES)
+ @rm -f congruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+congruences2$(EXEEXT): $(congruences2_OBJECTS) $(congruences2_DEPENDENCIES) $(EXTRA_congruences2_DEPENDENCIES)
+ @rm -f congruences2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences2_OBJECTS) $(congruences2_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropnonintegerpoints1$(EXEEXT): $(dropnonintegerpoints1_OBJECTS) $(dropnonintegerpoints1_DEPENDENCIES) $(EXTRA_dropnonintegerpoints1_DEPENDENCIES)
+ @rm -f dropnonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropnonintegerpoints1_OBJECTS) $(dropnonintegerpoints1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES)
+ @rm -f frequency1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) $(EXTRA_generalizedaffineimage3_DEPENDENCIES)
+ @rm -f generalizedaffineimage3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES) $(EXTRA_generator1_DEPENDENCIES)
+ @rm -f generator1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
+
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) $(EXTRA_generators1_DEPENDENCIES)
+ @rm -f generators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+
+generators2$(EXEEXT): $(generators2_OBJECTS) $(generators2_DEPENDENCIES) $(EXTRA_generators2_DEPENDENCIES)
+ @rm -f generators2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generators2_OBJECTS) $(generators2_LDADD) $(LIBS)
+
+grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES) $(EXTRA_grid1_DEPENDENCIES)
+ @rm -f grid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
+
+grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES) $(EXTRA_grid2_DEPENDENCIES)
+ @rm -f grid2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
+
+grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES) $(EXTRA_grid3_DEPENDENCIES)
+ @rm -f grid3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
+
+griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES) $(EXTRA_griddifference1_DEPENDENCIES)
+ @rm -f griddifference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) $(EXTRA_isempty1_DEPENDENCIES)
+ @rm -f isempty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) $(EXTRA_isuniverse1_DEPENDENCIES)
+ @rm -f isuniverse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+
+limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES) $(EXTRA_limitedextrapolation1_DEPENDENCIES)
+ @rm -f limitedextrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+
+limitedextrapolation2$(EXEEXT): $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_DEPENDENCIES) $(EXTRA_limitedextrapolation2_DEPENDENCIES)
+ @rm -f limitedextrapolation2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_LDADD) $(LIBS)
+
+limitedextrapolation3$(EXEEXT): $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_DEPENDENCIES) $(EXTRA_limitedextrapolation3_DEPENDENCIES)
+ @rm -f limitedextrapolation3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES)
+ @rm -f maxmin1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES) $(EXTRA_mincongruences1_DEPENDENCIES)
+ @rm -f mincongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
+
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) $(EXTRA_mingenerators1_DEPENDENCIES)
+ @rm -f mingenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+
+outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES) $(EXTRA_outputoperator1_DEPENDENCIES)
+ @rm -f outputoperator1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+
+outputoperator2$(EXEEXT): $(outputoperator2_OBJECTS) $(outputoperator2_DEPENDENCIES) $(EXTRA_outputoperator2_DEPENDENCIES)
+ @rm -f outputoperator2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(outputoperator2_OBJECTS) $(outputoperator2_LDADD) $(LIBS)
+
+outputoperator3$(EXEEXT): $(outputoperator3_OBJECTS) $(outputoperator3_DEPENDENCIES) $(EXTRA_outputoperator3_DEPENDENCIES)
+ @rm -f outputoperator3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(outputoperator3_OBJECTS) $(outputoperator3_LDADD) $(LIBS)
+
+partition1$(EXEEXT): $(partition1_OBJECTS) $(partition1_DEPENDENCIES) $(EXTRA_partition1_DEPENDENCIES)
+ @rm -f partition1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(partition1_OBJECTS) $(partition1_LDADD) $(LIBS)
+
+powersetdifference1$(EXEEXT): $(powersetdifference1_OBJECTS) $(powersetdifference1_DEPENDENCIES) $(EXTRA_powersetdifference1_DEPENDENCIES)
+ @rm -f powersetdifference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(powersetdifference1_OBJECTS) $(powersetdifference1_LDADD) $(LIBS)
+
+powersetgeometricallycovers1$(EXEEXT): $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_DEPENDENCIES) $(EXTRA_powersetgeometricallycovers1_DEPENDENCIES)
+ @rm -f powersetgeometricallycovers1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_LDADD) $(LIBS)
+
+powersetgeometricallyequals1$(EXEEXT): $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_DEPENDENCIES) $(EXTRA_powersetgeometricallyequals1_DEPENDENCIES)
+ @rm -f powersetgeometricallyequals1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES)
+ @rm -f refinewithcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES)
+ @rm -f refinewithconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) $(EXTRA_removespacedims2_DEPENDENCIES)
+ @rm -f removespacedims2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES)
+ @rm -f topclosure1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES)
+ @rm -f unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperbound2$(EXEEXT): $(upperbound2_OBJECTS) $(upperbound2_DEPENDENCIES) $(EXTRA_upperbound2_DEPENDENCIES)
+ @rm -f upperbound2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound2_OBJECTS) $(upperbound2_LDADD) $(LIBS)
+
+widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES) $(EXTRA_widening1_DEPENDENCIES)
+ @rm -f widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+
+widening2$(EXEEXT): $(widening2_OBJECTS) $(widening2_DEPENDENCIES) $(EXTRA_widening2_DEPENDENCIES)
+ @rm -f widening2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(widening2_OBJECTS) $(widening2_LDADD) $(LIBS)
+
+widening3$(EXEEXT): $(widening3_OBJECTS) $(widening3_DEPENDENCIES) $(EXTRA_widening3_DEPENDENCIES)
+ @rm -f widening3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(widening3_OBJECTS) $(widening3_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES)
+ @rm -f wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES) $(EXTRA_writecongruencesystem_DEPENDENCIES)
+ @rm -f writecongruencesystem$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/approximatepartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload6.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/certificate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropnonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/griddifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isempty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isuniverse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mincongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallycovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallyequals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writecongruencesystem.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+addcongruence1.log: addcongruence1$(EXEEXT)
+ @p='addcongruence1$(EXEEXT)'; \
+ b='addcongruence1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addcongruences1.log: addcongruences1$(EXEEXT)
+ @p='addcongruences1$(EXEEXT)'; \
+ b='addcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraint1.log: addconstraint1$(EXEEXT)
+ @p='addconstraint1$(EXEEXT)'; \
+ b='addconstraint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+ @p='addconstraints1$(EXEEXT)'; \
+ b='addconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator1.log: addgenerator1$(EXEEXT)
+ @p='addgenerator1$(EXEEXT)'; \
+ b='addgenerator1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators1.log: addgenerators1$(EXEEXT)
+ @p='addgenerators1$(EXEEXT)'; \
+ b='addgenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims1.log: addspacedims1$(EXEEXT)
+ @p='addspacedims1$(EXEEXT)'; \
+ b='addspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinedim1.log: affinedim1$(EXEEXT)
+ @p='affinedim1$(EXEEXT)'; \
+ b='affinedim1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+ @p='affineimage1$(EXEEXT)'; \
+ b='affineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage2.log: affineimage2$(EXEEXT)
+ @p='affineimage2$(EXEEXT)'; \
+ b='affineimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+ @p='affinepreimage1$(EXEEXT)'; \
+ b='affinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage2.log: affinepreimage2$(EXEEXT)
+ @p='affinepreimage2$(EXEEXT)'; \
+ b='affinepreimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+approximatepartition1.log: approximatepartition1$(EXEEXT)
+ @p='approximatepartition1$(EXEEXT)'; \
+ b='approximatepartition1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload1.log: asciidumpload1$(EXEEXT)
+ @p='asciidumpload1$(EXEEXT)'; \
+ b='asciidumpload1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload2.log: asciidumpload2$(EXEEXT)
+ @p='asciidumpload2$(EXEEXT)'; \
+ b='asciidumpload2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload3.log: asciidumpload3$(EXEEXT)
+ @p='asciidumpload3$(EXEEXT)'; \
+ b='asciidumpload3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload4.log: asciidumpload4$(EXEEXT)
+ @p='asciidumpload4$(EXEEXT)'; \
+ b='asciidumpload4'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload5.log: asciidumpload5$(EXEEXT)
+ @p='asciidumpload5$(EXEEXT)'; \
+ b='asciidumpload5'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload6.log: asciidumpload6$(EXEEXT)
+ @p='asciidumpload6$(EXEEXT)'; \
+ b='asciidumpload6'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bhz03widening1.log: bhz03widening1$(EXEEXT)
+ @p='bhz03widening1$(EXEEXT)'; \
+ b='bhz03widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+ @p='bounded1$(EXEEXT)'; \
+ b='bounded1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+ @p='bounds1$(EXEEXT)'; \
+ b='bounds1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+ @p='boundedaffineimage1$(EXEEXT)'; \
+ b='boundedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffinepreimage1.log: boundedaffinepreimage1$(EXEEXT)
+ @p='boundedaffinepreimage1$(EXEEXT)'; \
+ b='boundedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+certificate1.log: certificate1$(EXEEXT)
+ @p='certificate1$(EXEEXT)'; \
+ b='certificate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+ @p='concatenate1$(EXEEXT)'; \
+ b='concatenate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruence1.log: congruence1$(EXEEXT)
+ @p='congruence1$(EXEEXT)'; \
+ b='congruence1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+ @p='congruences1$(EXEEXT)'; \
+ b='congruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences2.log: congruences2$(EXEEXT)
+ @p='congruences2$(EXEEXT)'; \
+ b='congruences2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+ @p='constraints1$(EXEEXT)'; \
+ b='constraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+ @p='contains1$(EXEEXT)'; \
+ b='contains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+ @p='containsintegerpoint1$(EXEEXT)'; \
+ b='containsintegerpoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+ @p='discrete1$(EXEEXT)'; \
+ b='discrete1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+ @p='disjoint1$(EXEEXT)'; \
+ b='disjoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dropnonintegerpoints1.log: dropnonintegerpoints1$(EXEEXT)
+ @p='dropnonintegerpoints1$(EXEEXT)'; \
+ b='dropnonintegerpoints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+ @p='equals1$(EXEEXT)'; \
+ b='equals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim1.log: expandspacedim1$(EXEEXT)
+ @p='expandspacedim1$(EXEEXT)'; \
+ b='expandspacedim1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims1.log: foldspacedims1$(EXEEXT)
+ @p='foldspacedims1$(EXEEXT)'; \
+ b='foldspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frequency1.log: frequency1$(EXEEXT)
+ @p='frequency1$(EXEEXT)'; \
+ b='frequency1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+ @p='frombdshape1$(EXEEXT)'; \
+ b='frombdshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+ @p='frombox1$(EXEEXT)'; \
+ b='frombox1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+ @p='fromgrid1$(EXEEXT)'; \
+ b='fromgrid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+ @p='fromoctagonalshape1$(EXEEXT)'; \
+ b='fromoctagonalshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+ @p='frompolyhedron1$(EXEEXT)'; \
+ b='frompolyhedron1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+ @p='generalizedaffineimage1$(EXEEXT)'; \
+ b='generalizedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage2.log: generalizedaffineimage2$(EXEEXT)
+ @p='generalizedaffineimage2$(EXEEXT)'; \
+ b='generalizedaffineimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage3.log: generalizedaffineimage3$(EXEEXT)
+ @p='generalizedaffineimage3$(EXEEXT)'; \
+ b='generalizedaffineimage3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage1.log: generalizedaffinepreimage1$(EXEEXT)
+ @p='generalizedaffinepreimage1$(EXEEXT)'; \
+ b='generalizedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage2.log: generalizedaffinepreimage2$(EXEEXT)
+ @p='generalizedaffinepreimage2$(EXEEXT)'; \
+ b='generalizedaffinepreimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage3.log: generalizedaffinepreimage3$(EXEEXT)
+ @p='generalizedaffinepreimage3$(EXEEXT)'; \
+ b='generalizedaffinepreimage3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generator1.log: generator1$(EXEEXT)
+ @p='generator1$(EXEEXT)'; \
+ b='generator1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generators1.log: generators1$(EXEEXT)
+ @p='generators1$(EXEEXT)'; \
+ b='generators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generators2.log: generators2$(EXEEXT)
+ @p='generators2$(EXEEXT)'; \
+ b='generators2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+grid1.log: grid1$(EXEEXT)
+ @p='grid1$(EXEEXT)'; \
+ b='grid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+grid2.log: grid2$(EXEEXT)
+ @p='grid2$(EXEEXT)'; \
+ b='grid2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+grid3.log: grid3$(EXEEXT)
+ @p='grid3$(EXEEXT)'; \
+ b='grid3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+griddifference1.log: griddifference1$(EXEEXT)
+ @p='griddifference1$(EXEEXT)'; \
+ b='griddifference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+ @p='intersection1$(EXEEXT)'; \
+ b='intersection1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+isempty1.log: isempty1$(EXEEXT)
+ @p='isempty1$(EXEEXT)'; \
+ b='isempty1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+isuniverse1.log: isuniverse1$(EXEEXT)
+ @p='isuniverse1$(EXEEXT)'; \
+ b='isuniverse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation1.log: limitedextrapolation1$(EXEEXT)
+ @p='limitedextrapolation1$(EXEEXT)'; \
+ b='limitedextrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation2.log: limitedextrapolation2$(EXEEXT)
+ @p='limitedextrapolation2$(EXEEXT)'; \
+ b='limitedextrapolation2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation3.log: limitedextrapolation3$(EXEEXT)
+ @p='limitedextrapolation3$(EXEEXT)'; \
+ b='limitedextrapolation3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mapspacedims1.log: mapspacedims1$(EXEEXT)
+ @p='mapspacedims1$(EXEEXT)'; \
+ b='mapspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+ @p='maxmin1$(EXEEXT)'; \
+ b='maxmin1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+ @p='membytes1$(EXEEXT)'; \
+ b='membytes1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators1.log: mingenerators1$(EXEEXT)
+ @p='mingenerators1$(EXEEXT)'; \
+ b='mingenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mincongruences1.log: mincongruences1$(EXEEXT)
+ @p='mincongruences1$(EXEEXT)'; \
+ b='mincongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator1.log: outputoperator1$(EXEEXT)
+ @p='outputoperator1$(EXEEXT)'; \
+ b='outputoperator1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator2.log: outputoperator2$(EXEEXT)
+ @p='outputoperator2$(EXEEXT)'; \
+ b='outputoperator2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator3.log: outputoperator3$(EXEEXT)
+ @p='outputoperator3$(EXEEXT)'; \
+ b='outputoperator3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+partition1.log: partition1$(EXEEXT)
+ @p='partition1$(EXEEXT)'; \
+ b='partition1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetdifference1.log: powersetdifference1$(EXEEXT)
+ @p='powersetdifference1$(EXEEXT)'; \
+ b='powersetdifference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetgeometricallycovers1.log: powersetgeometricallycovers1$(EXEEXT)
+ @p='powersetgeometricallycovers1$(EXEEXT)'; \
+ b='powersetgeometricallycovers1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetgeometricallyequals1.log: powersetgeometricallyequals1$(EXEEXT)
+ @p='powersetgeometricallyequals1$(EXEEXT)'; \
+ b='powersetgeometricallyequals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+ @p='refinewithcongruences1$(EXEEXT)'; \
+ b='refinewithcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+ @p='refinewithconstraints1$(EXEEXT)'; \
+ b='refinewithconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+ @p='relations1$(EXEEXT)'; \
+ b='relations1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations2.log: relations2$(EXEEXT)
+ @p='relations2$(EXEEXT)'; \
+ b='relations2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations3.log: relations3$(EXEEXT)
+ @p='relations3$(EXEEXT)'; \
+ b='relations3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims1.log: removespacedims1$(EXEEXT)
+ @p='removespacedims1$(EXEEXT)'; \
+ b='removespacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims2.log: removespacedims2$(EXEEXT)
+ @p='removespacedims2$(EXEEXT)'; \
+ b='removespacedims2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+ @p='simplifyusingcontext1$(EXEEXT)'; \
+ b='simplifyusingcontext1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+ @p='timeelapse1$(EXEEXT)'; \
+ b='timeelapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+ @p='topclosed1$(EXEEXT)'; \
+ b='topclosed1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+ @p='topclosure1$(EXEEXT)'; \
+ b='topclosure1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unconstrain1.log: unconstrain1$(EXEEXT)
+ @p='unconstrain1$(EXEEXT)'; \
+ b='unconstrain1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+ @p='upperbound1$(EXEEXT)'; \
+ b='upperbound1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound2.log: upperbound2$(EXEEXT)
+ @p='upperbound2$(EXEEXT)'; \
+ b='upperbound2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+widening1.log: widening1$(EXEEXT)
+ @p='widening1$(EXEEXT)'; \
+ b='widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+widening2.log: widening2$(EXEEXT)
+ @p='widening2$(EXEEXT)'; \
+ b='widening2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+widening3.log: widening3$(EXEEXT)
+ @p='widening3$(EXEEXT)'; \
+ b='widening3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap1.log: wrap1$(EXEEXT)
+ @p='wrap1$(EXEEXT)'; \
+ b='wrap1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writecongruencesystem.log: writecongruencesystem$(EXEEXT)
+ @p='writecongruencesystem$(EXEEXT)'; \
+ b='writecongruencesystem'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Grid/addcongruence1.cc b/tests/Grid/addcongruence1.cc
new file mode 100644
index 0000000..0afc774
--- /dev/null
+++ b/tests/Grid/addcongruence1.cc
@@ -0,0 +1,129 @@
+/* Test methods which add a single congruence to a grid.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// Many cases are covered in addgenerator1, in which the known grid is
+// always created with Grid::add_congruence.
+
+namespace {
+
+// Add to the universe grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence((A + B %= 0) / 6);
+
+ print_congruences(gr, "*** gr.add_congruence((A + B %= 0) / 6) ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 6);
+
+ bool ok = (gr == known_gr) ;
+
+ print_congruences(gr,
+ "*** gr.add_congruence((A + B %= 0) / 3) ***");
+
+ return ok;
+}
+
+// Add to an empty grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence((A + B + C %= 0) / 3);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence((A + B + C %= 0) / 3) ***");
+
+ return ok;
+}
+
+// Add a congruence with less dimensions than the grid.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 7);
+ gr.add_congruence((A %= 0) / 7);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(parameter(7*A));
+ known_gr.add_grid_generator(parameter(7*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence((A %= 0) / 7) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+static bool
+test04() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.add_congruence(A + C %= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/addcongruences1.cc b/tests/Grid/addcongruences1.cc
new file mode 100644
index 0000000..40365af
--- /dev/null
+++ b/tests/Grid/addcongruences1.cc
@@ -0,0 +1,332 @@
+/* Test methods which can add multiple congruences to a grid.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// add_congruences
+bool
+test01() {
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((B == 0) / 2);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruences(cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((B == 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences(cgs) -- space dimension exception
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_congruences(cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_recycled_congruences, empty grid.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences, add system of single trivial
+// congruence to zero dim grid.
+bool
+test05() {
+
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ Congruence_System cgs;
+ cgs.insert(Congruence::zero_dim_integrality());
+
+ gr.add_recycled_congruences(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_congruences(cgs) -- space dimension exception
+bool
+test06() {
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert(B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_congruences(cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_recycled_congruences, add to empty grid.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ Congruence_System cgs;
+ cgs.insert(A + B == 0);
+
+ gr.add_recycled_congruences(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with minimized generators and up to date congruences.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr(2);
+
+ // Ensure both systems are up to date with only generators minimal.
+ gr.affine_image(A, 1*A);
+ gr.minimized_grid_generators();
+
+ print_congruences(gr, "*** gr ***");
+
+ Congruence_System cgs;
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with up to date congruences and generators.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(2);
+
+ // Ensure both systems are just up to date.
+ gr.affine_image(A, 1*A);
+
+ print_congruences(gr, "*** gr ***");
+
+ Congruence_System cgs;
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences, add congruence in 1D to
+// universe grid in 2D.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 7);
+
+ gr1.add_recycled_congruences(cgs);
+ print_generators(gr1, "*** gr1 ***");
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 7);
+ print_generators(gr2, "*** gr2 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with minimized congruences and up to date generators.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(3*A));
+
+ // Ensure both systems are up to date with only congruences minimal.
+ gr.affine_image(A, 1*A);
+ gr.minimized_congruences();
+
+ print_congruences(gr, "*** gr ***");
+
+ Congruence_System cgs;
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/addconstraint1.cc b/tests/Grid/addconstraint1.cc
new file mode 100644
index 0000000..8fa2cb4
--- /dev/null
+++ b/tests/Grid/addconstraint1.cc
@@ -0,0 +1,241 @@
+/* Test adding single constraints to grids.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_constraint
+bool
+test01() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(A == 3);
+ print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 3) / 0);
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+ return ok;
+}
+
+// Add an NNC constraint with add_constraint.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B + 0*C == 0);
+
+ NNC_Polyhedron ph(cs);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(*ph.constraints().begin());
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B %= 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_constraint(*ph.constraints().begin()) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(2*A == C);
+ print_congruences(gr, "*** gr.add_constraint(2*A == C) ***");
+ gr.add_constraint(D == 0);
+ print_congruences(gr, "*** gr.add_constraint(D == 0) ***");
+ gr.refine_with_constraint(B > 2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence((2*A %= C) / 0);
+ known_gr.add_congruence((D %= 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraint(B > 2) ***");
+
+ return ok;
+}
+
+// add_congruence(c), adding equality
+bool
+test04() {
+ Variable D(3);
+
+ Grid gr(4);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence((D %= 4) / 0);
+
+ Grid known_gr(4);
+
+ known_gr.add_congruence((D %= 4) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence(D == 4) ***");
+
+ return ok;
+}
+
+// add_constraint - an inequality constraint.
+bool
+test05() {
+ Variable B(1);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraint(B >= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+
+// add_constraint - inconsistent equality
+// (so that no exception should be thrown).
+bool
+test06() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(0*A >= 3);
+ print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+ Grid known_gr(2, EMPTY);
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+ return ok;
+}
+
+// add_constraint - inconsistent equality
+// (so that no exception should be thrown).
+bool
+test07() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(Linear_Expression(1) <= 0);
+ print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+ Grid known_gr(2, EMPTY);
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+ return ok;
+}
+
+// add_constraint -- space dimension exception
+bool
+test08() {
+ Variable B(1);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraint(B == 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_constraints(1 == 0) to an empty 0-dimensional grid
+bool
+test09() {
+
+ Grid gr(0, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint(Linear_Expression(1) == 0);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc
new file mode 100644
index 0000000..784634d
--- /dev/null
+++ b/tests/Grid/addconstraints1.cc
@@ -0,0 +1,347 @@
+/* Test adding constraints to a grid.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_constraints(1 == 0) to an empty 0-dimensional grid
+bool
+test01() {
+
+ Grid gr(0, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(1) == 0);
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_constraints
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B == 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_constraints, resulting grid empty.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_constraints with inconsistency
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cs) ***");
+
+ return ok;
+}
+
+// add_constraints with inconsistency
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(1) >= 3);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cs) ***");
+
+ return ok;
+}
+
+// refine_with_constraints
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B >= 3);
+ cs.insert(0*B >= 7);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraints(cs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_constraints
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(2*C == 6*D);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_constraints(cs);
+
+ Grid known_gr(4);
+ known_gr.add_congruence((C == 3*D) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_constraints(cs) ***");
+
+ return ok;
+}
+
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_constraints(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraints(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_constraints(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Construct a congruence system from a constraint system
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+ cs.insert(2*C + A == 3);
+
+ Congruence_System cgs(cs);
+
+ Grid gr(3);
+ Grid gr1(3);
+
+ gr.add_constraints(cs);
+ gr1.add_congruences(cgs);
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+ print_congruences(gr1, "*** gr1.add_congruences(cgs) ***");
+ bool ok = (gr1 == gr);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B == 0) / 0);
+ known_gr.add_congruence((2*C + A == 3) / 0);
+
+ ok &= (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_constraints(cs) -- non-equality constraint in constraint system.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+ cs.insert(A + B >= 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraints(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc
new file mode 100644
index 0000000..529ddfb
--- /dev/null
+++ b/tests/Grid/addgenerator1.cc
@@ -0,0 +1,330 @@
+/* Test Grid::add_grid_generator().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// grid1.cc also tests add_grid_generator.
+
+// One dimension.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point(-A));
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A == -1) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(grid_point(-A)) ***");
+
+ return ok;
+}
+
+// Two dimensions.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+ gr.add_grid_generator(grid_point(A + B));
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A == 1) / 0);
+ known_gr.add_congruence((B == 1) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(grid_point(A + B)) ***");
+
+ return ok;
+}
+
+// Add many generators to grid of two dimensions.
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A + 2*B));
+ gr.add_grid_generator(grid_point(A + B));
+ gr.add_grid_generator(grid_point(2*A + 2*B));
+ gr.add_grid_generator(grid_line(A));
+
+ Grid known_gr(2);
+ known_gr.add_congruence(B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(...) ***");
+
+ return ok;
+}
+
+// Add generators where one has a divisor.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(7*A, 4));
+ gs.insert(grid_line(A - B));
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ for (Grid_Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ gr.add_grid_generator(*i);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((4*A + 4*B == 7) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(*i) ***");
+
+ return ok;
+}
+
+// Add generators to a grid of a higher space dimension.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point(7*A, 3));
+ print_congruences(gr, "*** gr.add_grid_generator(grid_point(7*A, 3)) ***");
+ gr.add_grid_generator(grid_line(A - B));
+
+ Grid known_gr(4);
+
+ known_gr.add_congruence((3*A + 3*B == 7) / 0);
+ known_gr.add_congruence((C == 0) / 0);
+ known_gr.add_congruence((D == 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(grid_line(A - B)) ***");
+
+ return ok;
+}
+
+// Add a generator to a universe grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point(12*A + 7*D));
+
+ Grid known_gr(4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_grid_generator(grid_point(12*A + 7*D)) ***");
+
+ return ok;
+}
+
+// adding a generator with a divisor to a grid of many generators.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+
+ print_congruences(gr, "*** gr ***");
+
+ // Minimize the grid.
+
+ gr.add_grid_generator(grid_point(B, 3));
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(3*B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_grid_generator(grid_point(B, 3)) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.add_grid_generator(grid_point(A + C));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Zero dimensions empty.
+bool
+test09() {
+ Grid gr(0, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point());
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test10() {
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point());
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_grid_generator(grid_line(A));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Try add parameter to empty grid.
+bool
+test12() {
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_grid_generator(parameter());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Try add parameter to zero dimension empty grid.
+bool
+test13() {
+ Grid gr(0, EMPTY);
+
+ try {
+ gr.add_grid_generator(parameter());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/addgenerators1.cc b/tests/Grid/addgenerators1.cc
new file mode 100644
index 0000000..e47a33f
--- /dev/null
+++ b/tests/Grid/addgenerators1.cc
@@ -0,0 +1,223 @@
+/* Test method which can add multiple generators to a grid.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// grid1.cc also tests add_grid_generators.
+
+// add_recycled_grid_generators -- space dimension exception.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B));
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_grid_generators(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_recycled_grid_generators -- zero dimension universe.
+bool
+test02() {
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+
+ Grid gr(0);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_recycled_grid_generators(gs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_grid_generators -- zero dimension empty.
+bool
+test03() {
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+
+ Grid gr(0, EMPTY);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_recycled_grid_generators(gs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_grid_generators -- add system with a single parameter
+// generator to the empty grid.
+bool
+test04() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(A));
+
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_recycled_grid_generators(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// add_recycled_grid_generators -- add an empty system.
+bool
+test05() {
+ Grid_Generator_System gs;
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.add_recycled_grid_generators(gs);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.add_recycled_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// add_grid_generators -- add a zero dimension universe system.
+bool
+test06() {
+ Grid gr(0);
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.add_grid_generators(Grid_Generator_System::zero_dim_univ());
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.add_grid_generators(Grid_Generator_System::zero_dim_univ()) ***");
+
+ return ok;
+}
+
+// add_grid_generators -- add to a grid where the generator system of the
+// grid starts with a parameter (test point finding loop in
+// Grid::normalize_divisors(gs, gs)).
+bool
+test07() {
+ Variable A(0);
+
+ Grid_Generator_System gs1;
+ gs1.insert(parameter(2*A));
+ gs1.insert(grid_point());
+
+ Grid gr(gs1);
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point());
+ gs2.insert(parameter(A));
+
+ gr.add_grid_generators(gs2);
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(parameter(A));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_grid_generators -- add to a zero
+// dimension universe grid.
+bool
+test08() {
+ Grid gr(0);
+
+ Grid_Generator_System gs2(grid_point());
+
+ gr.add_recycled_grid_generators(gs2);
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.add_grid_generators(gs2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc
new file mode 100644
index 0000000..d13203e
--- /dev/null
+++ b/tests/Grid/addspacedims1.cc
@@ -0,0 +1,532 @@
+/* Test Grid::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// From congruences, adding to both congruences and generators.
+bool
+test01() {
+ Variable A(0);
+ Variable C(2);
+ Variable E(4);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 0) / 2);
+
+ Grid gr(cgs);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A + 0*E %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// An empty grid.
+bool
+test02() {
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(3);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(3) ***");
+
+ return ok;
+}
+
+// A universe grid.
+bool
+test03() {
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(4);
+
+ Grid known_gr(5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(4) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(A + C));
+
+ Grid gr(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A == 1) / 0);
+ known_cgs.insert((C + 0*E %= 0) / 1);
+ known_cgs.insert((B == 0) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+ return ok;
+}
+
+// From congruences, where dimensions are only added to the grid's
+// congruence system.
+bool
+test05() {
+ Variable A(0);
+ Variable C(2);
+ Variable E(4);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 0) / 2);
+
+ Grid gr(cgs);
+
+ print_congruences(gr, "*** gr ***");
+
+ // Add space dimensions directly after creating the grid, to ensure
+ // that only the congruences are up to date.
+
+ gr.add_space_dimensions_and_embed(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A + 0*E %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test06() {
+ Grid gr(10);
+
+ try {
+ gr.add_space_dimensions_and_embed(Grid::max_space_dimension());
+ }
+ catch (const std::length_error& e) {
+ nout << "max_space_dimension_exceeded: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(13);
+
+ Grid known_gr(13);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(13) ***");
+
+ return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ gr.minimized_congruences();
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+ return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(A));
+
+ gr.minimized_grid_generators();
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_embed(2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+ return ok;
+}
+
+// From congruences.
+bool
+test10() {
+ Variable A(0);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 0) / 2);
+
+ Grid gr(cgs);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((E %= 0) / 0);
+ known_cgs.insert((D %= 0) / 0);
+ known_cgs.insert((A %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+ Grid gr(2, EMPTY);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(3);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(3) ***");
+
+ return ok;
+}
+
+// Universe grid, compared to congruences.
+bool
+test12() {
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(4);
+
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((B %= 0) / 0);
+ known_cgs.insert((C %= 0) / 0);
+ known_cgs.insert((D %= 0) / 0);
+ known_cgs.insert((E %= 0) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+// Universe grid, compared to generators.
+bool
+test13() {
+ Grid gr(1);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(3);
+
+ Variable A(0);
+ Variable D(3);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_line(A + 0*D));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(A + B + C));
+
+ Grid gr(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(A == 1);
+ known_cgs.insert(B - C == 0);
+ known_cgs.insert(B %= 0);
+ known_cgs.insert(D == 0);
+ known_cgs.insert(E == 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+// From generators, where dimensions are only added to the grid's
+// generator system.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(A + B + C));
+
+ Grid gr(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ // Add space dimensions directly after creating the grid, to ensure
+ // that only the generators are up to date.
+
+ gr.add_space_dimensions_and_project(2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A == 1) / 0);
+ known_cgs.insert((B - C %= 0) / 0);
+ known_cgs.insert((B %= 0) / 1);
+ known_cgs.insert((D %= 0) / 0);
+ known_cgs.insert((E %= 0) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test16() {
+ Grid gr(10);
+
+ try {
+ gr.add_space_dimensions_and_project(Grid::max_space_dimension());
+ }
+ catch (const std::length_error& e) {
+ nout << "max_space_dimension_exceeded: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(13);
+
+ Grid known_gr(13);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(13) ***");
+
+ return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ gr.minimized_congruences();
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(2);
+
+ Grid known_gr(4, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(parameter(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_line(A));
+
+ gr.minimized_grid_generators();
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(2);
+
+ Grid known_gr(4);
+ known_gr.add_constraint(B == 0);
+ known_gr.add_constraint(C == 0);
+ known_gr.add_constraint(D == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/affinedim1.cc b/tests/Grid/affinedim1.cc
new file mode 100644
index 0000000..c9564be
--- /dev/null
+++ b/tests/Grid/affinedim1.cc
@@ -0,0 +1,322 @@
+/* Test Grid::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (gr.affine_dimension() == 0);
+
+ print_congruences(gr, "*** gr**");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.affine_dimension() == 0);
+
+ print_congruences(gr, "*** gr**");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.affine_dimension() == 0);
+
+ print_congruences(gr, "*** gr**");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 0
+ && gr_gs_needs_min.affine_dimension() == 0
+ && gr_cgs_needs_min.affine_dimension() == 0;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 1
+ && gr_gs_needs_min.affine_dimension() == 1
+ && gr_cgs_needs_min.affine_dimension() == 1;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence((C == 0) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 1
+ && gr_gs_needs_min.affine_dimension() == 1
+ && gr_cgs_needs_min.affine_dimension() == 1;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 2
+ && gr_gs_needs_min.affine_dimension() == 2
+ && gr_cgs_needs_min.affine_dimension() == 2;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Skew.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 2
+ && gr_gs_needs_min.affine_dimension() == 2
+ && gr_cgs_needs_min.affine_dimension() == 2;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_line(C));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 3
+ && gr_gs_needs_min.affine_dimension() == 3
+ && gr_cgs_needs_min.affine_dimension() == 3;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Plane.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(4, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence((A == 0) / 0);
+ gr_cgs_needs_min.add_congruence((D == 0) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.affine_dimension() == 2
+ && gr_gs_needs_min.affine_dimension() == 2
+ && gr_cgs_needs_min.affine_dimension() == 2;
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/affineimage1.cc b/tests/Grid/affineimage1.cc
new file mode 100644
index 0000000..8d0055e
--- /dev/null
+++ b/tests/Grid/affineimage1.cc
@@ -0,0 +1,390 @@
+/* Test Grid::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Variable to be updated does not occur in expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(B, A + 2, 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*B - 2*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(B, A + 2, 1) ***");
+
+ return ok;
+}
+
+// Variable to be updated occurs in expression.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A - B %= 0) / 0);
+ gr.add_congruence((A %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + B + 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(7*A + 3*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_image(A, A + B + 1) ***");
+
+ return ok;
+}
+
+// Denominator.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 3) / 0);
+ gr.add_congruence((B %= 2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 1, 2);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*A + 2*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + 1, 2) ***");
+
+ return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 3) / 5);
+ gr.add_congruence((B %= 2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(3*A + 2*B));
+ gr.add_grid_generator(grid_point(8*A + 2*B));
+ gr.add_grid_generator(grid_line(C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Simple invertible transformation with denominator and modulus
+// Congruences are up-to-date and minimized.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr = Grid(3);
+ gr.add_congruence((A %= 3) / 5);
+ gr.add_congruence((B %= 2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, 3*A + 2*B + 4);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*A));
+ known_gr.add_grid_generator(grid_point(7*A));
+ known_gr.add_grid_generator(grid_point(6*A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+ return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, 3*A + 2*B + 4);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*A));
+ known_gr.add_grid_generator(grid_point(7*A));
+ known_gr.add_grid_generator(grid_point(6*A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+ return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, 2*A);
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
+
+ return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr = Grid(1);
+ gr.add_congruence(A %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, 2*A);
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
+
+ return ok;
+}
+
+// The first example described at anchor grid_affine_transformation in
+// definitions.dox.
+// Congruences are out-of-date.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(grid_point(3*B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, 3*A + 2*B + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(7*A + 3*B));
+ known_gr.add_grid_generator(grid_point(10*A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 1) ***");
+
+ return ok;
+}
+
+// This example considers the case when the congruences are out-of-date.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(grid_point(3*B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(3*A + 3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_image(A, B) ***");
+
+ return ok;
+}
+
+// This example is as described at anchor grid_affine_transformation
+// in definitions.dox.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+ gr.add_congruence((A %= 0) / 3);
+ gr.add_congruence((B %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(3*A + 3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, B) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/affineimage2.cc b/tests/Grid/affineimage2.cc
new file mode 100644
index 0000000..273b740
--- /dev/null
+++ b/tests/Grid/affineimage2.cc
@@ -0,0 +1,398 @@
+/* Test Grid::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(A, 3));
+ gs.insert(grid_point(B, 2));
+
+ // The divisors are normalized on construction.
+ Grid gr(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ // All divisors should change, even when the coefficient of A is 0.
+ gr.affine_image(A, 2*A, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(2*A, 15));
+ known_gr.add_grid_generator(grid_point(5*B, 10));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_image(A, 2*A, 5) ***");
+
+ return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, B + 2, -3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-2*A, 3));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_image(A, B + 2, -3) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, 2*A + B + 1);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, 2*A + B + 1) ***");
+
+ return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 3);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= 3) / 4);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + 3) ***");
+
+ return ok;
+}
+
+// Slant a rectilinear pointed grid along A == B.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_image(A, A + B);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 4);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, A + B) ***");
+
+ return ok;
+}
+
+// Compress a rectilinear pointed grid to a line of points.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ gr.affine_image(A, B);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B == 0) / 0);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_image(A, B) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_image(B, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_image(B, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_image(D, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(2*A + 0*B));
+
+ print_congruences(gr, "*** gr ***");
+
+ Grid gr0 = gr; // first grid (using trivial transformation)
+
+ Grid gr1 = gr; // second grid - initial state
+
+ gr1.generalized_affine_image(B, EQUAL, 18*A + B, 1, 0);
+ gr1.generalized_affine_image(A, EQUAL, 15*A, 1, 0);
+ // second grid - 1 pass through procedure
+
+ Grid gr2 = gr; // third grid - initial state
+
+ gr2.affine_image(B, 282*A + B);
+ gr2.affine_image(A, 225*A);
+ // third grid - 2 passes through procedure
+
+ gr.upper_bound_assign(gr1); // join of gr0 and gr1
+
+ print_congruences(gr, "*** gr.upper_bound_assign(gr1) ***");
+
+ gr.upper_bound_assign(gr2); // join of gr0, gr1 and gr2
+
+ Grid known_gr(2);
+
+ known_gr.add_congruence((A %= 2) / 28);
+ known_gr.add_congruence((B %= 0) / 12);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test11() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System ggs;
+ ggs.insert(grid_point(A + 0*B));
+
+ Grid gr1(ggs);
+ Grid gr(2, EMPTY);
+
+ for(int j = 0; j < 4; j++) {
+ gr.add_grid_generators(ggs);
+
+ for(int i = 0; i < j; i++) {
+ gr.affine_image(A, 3*A);
+ gr.affine_image(B, B + A);
+ }
+ for(int i = 0; i < j; i++) {
+ gr.affine_image(A, 5*A);
+ gr.affine_image(B, B + A);
+ }
+ gr1.upper_bound_assign(gr);
+ }
+
+ gr.add_grid_generators(ggs);
+
+ bool ok = (gr == gr1);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_generators(gr1, "*** gr1 ***");
+ print_congruences(gr, "*** gr ***");
+ print_generators(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Example from Muller-Olm and Seidl ESOP 2005 paper
+bool
+test12() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Coefficient* tem1 = new Coefficient("7654321");
+ Coefficient* tem2 = new Coefficient("69246289");
+ Coefficient* tem3 = new Coefficient("4294967296");
+
+ Grid_Generator_System ggs;
+ ggs.insert(grid_point(A));
+ ggs.insert(parameter(*tem3*A));
+ ggs.insert(parameter(*tem3*B));
+
+ Grid gr1(ggs);
+ Grid gr(2, EMPTY);
+
+ for(int j = 0; j < 3; j++) {
+ gr.add_grid_generators(ggs);
+
+ for(int i = 0; i < j; i++) {
+ gr.affine_image(A, *tem1*A);
+ gr.affine_image(B, B + A);
+ }
+ for(int i = 0; i < j; i++) {
+ gr.affine_image(A, *tem2*A);
+ gr.affine_image(B, B + A);
+ }
+ gr1.upper_bound_assign(gr);
+ }
+
+ gr.add_grid_generators(ggs);
+
+ delete tem1; delete tem2; delete tem3;
+
+ bool ok = (gr == gr1);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_generators(gr1, "*** gr1 ***");
+ print_congruences(gr, "*** gr ***");
+ print_generators(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST_F16(test10);
+ DO_TEST_F32(test11);
+ DO_TEST_F64(test12);
+END_MAIN
diff --git a/tests/Grid/affinepreimage1.cc b/tests/Grid/affinepreimage1.cc
new file mode 100644
index 0000000..2510b11
--- /dev/null
+++ b/tests/Grid/affinepreimage1.cc
@@ -0,0 +1,429 @@
+/* Test Grid::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// The first twelve tests mirror those in affineimage1.cc.
+
+// Grid defined by generators.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(2*B - 2*C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A + 2, 1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((C == -2) / 0);
+ known_gr.add_congruence((A == 0) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(B, A + 2, 1) ***");
+
+ return ok;
+}
+
+// Grid defined by congruences.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 1) / 6);
+ gr.add_congruence((3*A - 6*B %= 3) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + B + 1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A - B %= 0) / 0);
+ known_gr.add_congruence((A %= 0) / 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + B + 1) ***");
+
+ return ok;
+}
+
+// Denominator.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(2*A + 2*B));
+ gr.add_grid_generator(grid_line(C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 1, 2);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= 3) / 0);
+ known_gr.add_congruence((B %= 2) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 2) ***");
+
+ return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 2) / 0);
+ gr.add_congruence((3*A %= 4) / 5);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 1, 3);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= 3) / 5);
+ known_gr.add_congruence((B %= 2) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are out-of-date.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+ gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+ gr.add_grid_generator(grid_line(C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(3*A + 2*B));
+ known_gr.add_grid_generator(grid_point(8*A + 2*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are up-to-date.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr = Grid(3);
+ gr.add_congruence((3*A %= 4) / 5);
+ gr.add_congruence((B %= 2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(3*A + 2*B));
+ known_gr.add_grid_generator(grid_point(8*A + 2*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(4*A));
+ gr.add_grid_generator(grid_point(7*A));
+ gr.add_grid_generator(grid_point(6*A + B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 3*A + 2*B + 4);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+ return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+ gr.add_congruence((A - 2*B %= 4) / 3);
+ gr.add_congruence(B %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 3*A + 2*B + 4);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+ return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 2*A);
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, 2*A) ***");
+
+ return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr = Grid(1);
+ gr.add_congruence((A %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 2*A);
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, 2*A) ***");
+
+ return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(7*A + 3*B));
+ gr.add_grid_generator(grid_point(10*A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 3*A + 2*B + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(3*A));
+ known_gr.add_grid_generator(grid_point(3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+ return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+
+ gr.add_congruence((3*A - 6*B %= 3) / 9);
+ gr.add_congruence((A - 2*B %= 1) / 9);
+ gr.add_congruence((B %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 3*A + 2*B + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(3*A));
+ known_gr.add_grid_generator(grid_point(3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+ return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(3*A + 3*B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+ known_gr.add_grid_generator(grid_point(3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr ***");
+
+ return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+ gr.add_congruence((A - B == 0) / 0);
+ gr.add_congruence((A %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+ known_gr.add_grid_generator(grid_point(3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
+
+ return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/affinepreimage2.cc b/tests/Grid/affinepreimage2.cc
new file mode 100644
index 0000000..159450d
--- /dev/null
+++ b/tests/Grid/affinepreimage2.cc
@@ -0,0 +1,363 @@
+/* Test Grid::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(2*A, 15));
+ gs.insert(grid_point(5*B, 10));
+
+ // The divisors are normalized on construction.
+ Grid gr(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ // All divisors should change, even when the coefficient of A is 0.
+ gr.affine_preimage(A, 2*A, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A, 3));
+ known_gr.add_grid_generator(grid_point(B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, 2*A, 5) ***");
+
+ return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(-2*A, 3));
+
+ gr.affine_preimage(A, B + 2, -3);
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(A, B + 2, -3) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 11*A - B + 1);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, 11*A - B + 1) ***");
+
+ return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are out-of-date
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(5*A + 4*B, 7));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A - B, -1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
+
+ return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are up-to-date
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr = Grid(2);
+ gr.add_congruence((7*A == 5) / 0);
+ gr.add_congruence((7*B == 4) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A - B, -1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
+
+ return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 3);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= -3) / 4);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + 3) ***");
+
+ return ok;
+}
+
+// Slant a rectilinear pointed grid along A == -B.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ gr.affine_preimage(A, A + B);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 4);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, A + B) ***");
+
+ return ok;
+}
+
+// Expand a rectilinear pointed grid to a sequence of lines.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 4);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(A, B);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((B %= 0) / 4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
+
+ return ok;
+}
+
+// Transform a grid into the empty grid.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A == 3) / 0);
+ gr.add_congruence((B == 0) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
+
+ return ok;
+}
+
+// Transform away the constraint on a dimension (B).
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A == 3) / 0);
+ gr.add_congruence((B == 3) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A == 3) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_preimage(B, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_preimage(B, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.affine_preimage(D, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/approximatepartition1.cc b/tests/Grid/approximatepartition1.cc
new file mode 100644
index 0000000..8843c98
--- /dev/null
+++ b/tests/Grid/approximatepartition1.cc
@@ -0,0 +1,103 @@
+/* Test approximate_partition().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ using namespace IO_Operators;
+ nout << "p = " << p << endl;
+
+ Grid q(2);
+ q.add_congruence((x %= 4) / 9);
+
+ nout << "q = " << q << endl;
+
+ bool finite_partition;
+
+ std::pair<Grid, Pointset_Powerset<Grid> >
+ result = approximate_partition(p, q, finite_partition);
+
+ nout << "*** q partition ***" << endl;
+ nout << " === p inters q === " << endl << " " << result.first << endl;
+ nout << " === rest === " << endl << " " << result.second << endl;
+
+ if (!finite_partition)
+ return false;
+
+ result = approximate_partition(q, p, finite_partition);
+
+ nout << "*** p partition ***" << endl;
+ nout << " === q inters p === " << endl << " " << result.first << endl;
+ nout << " === rest === " << endl << " " << result.second << endl;
+
+ return finite_partition;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ print_congruences(p, "*** p ***");
+
+ Grid q(2);
+ q.add_congruence((x %= 0) / 2);
+ q.add_congruence((y %= 0) / 1);
+
+ print_congruences(q, "*** q ***");
+
+ bool finite_partition;
+
+ std::pair<Grid, Pointset_Powerset<Grid> >
+ result = approximate_partition(q, p, finite_partition);
+
+ print_congruences(result.first,
+ "*** result.first ***");
+
+ print_congruences(result.second,
+ "*** result.second ***");
+
+ if (finite_partition)
+ return false;
+
+ Grid known_gr(p);
+
+ Pointset_Powerset<Grid>::iterator i = (result.second).begin();
+
+return i->pointset() == known_gr;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/asciidumpload1.cc b/tests/Grid/asciidumpload1.cc
new file mode 100644
index 0000000..a59b18f
--- /dev/null
+++ b/tests/Grid/asciidumpload1.cc
@@ -0,0 +1,633 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+#include <sstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+using std::stringstream;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+ Grid gr1(1, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ stringstream ss1;
+ gr1.ascii_dump(ss1);
+
+ gr1.ascii_dump(vnout);
+
+ Grid gr2(1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+ Grid gr1(3, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ stringstream ss1;
+ gr1.ascii_dump(ss1);
+
+ gr1.ascii_dump(vnout);
+
+ Grid gr2(3);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+ Grid gr1(4, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ stringstream ss1;
+ gr1.ascii_dump(ss1);
+
+ gr1.ascii_dump(vnout);
+
+ Grid gr2(3);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr1(4, EMPTY);
+ gr1.add_grid_generator(grid_point(3*A + C));
+ gr1.add_grid_generator(parameter(3*A));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ stringstream ss1;
+ gr1.ascii_dump(ss1);
+
+ gr1.ascii_dump(vnout);
+
+ Grid gr2(4);
+ gr2.add_congruence((3*A == 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*A + C));
+ gr1.add_grid_generator(parameter(3*A));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ stringstream ss1;
+ gr1.ascii_dump(ss1);
+
+ gr1.ascii_dump(vnout);
+
+ Grid gr2(4);
+ gr2.add_congruence((3*A == 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test06() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_err 2\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test07() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test08() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +err +CM +GM +CS +GS -CP -GP -SC -SG\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test09() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "err_sys (up-to-date)";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test10() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-err)";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test11() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test12() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test13() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "0 1 m 1\n"
+ << "1 0 m 1\n"
+ << "err_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test14() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-err)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test15() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test16() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-date)\n"
+ << "err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test17() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-date)\n"
+ << "2 x err\n"
+ << "size 3 1 0 0 P\n"
+ << "size 3 0 1 1 Q\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test18() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 1 0 0 P\n"
+ << "size 3 0 1 1 Q\n"
+ << "dimerrnsion_kinds 0 0\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test19() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 1 0 0 P\n"
+ << "size 3 0 1 1 Q\n"
+ << "dimension_kinds 0\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test20() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 0 1 m 1\n"
+ << "size 3 1 0 m 1\n"
+ << "gen_sys (up-to-date)\n"
+ << "2 x 3\n"
+ << "size 3 1 0 0 P\n"
+ << "size 3 0 1 1 Q\n"
+ << "dimension_kinds 0 700\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test21() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS err -CP -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test22() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS err -GP -SC -SG\n"
+ << "con_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test23() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP err -SC -SG\n"
+ << "con_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test24() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP err -SG\n"
+ << "con_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test25() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 1\n"
+ << "-ZE -EM +CM +GM +CS +GS -CP -GP -SC err\n"
+ << "con_sys (up-to-date)\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr;
+ bool ok = !gr.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+ DO_TEST(test23);
+ DO_TEST(test24);
+ DO_TEST(test25);
+END_MAIN
diff --git a/tests/Grid/asciidumpload2.cc b/tests/Grid/asciidumpload2.cc
new file mode 100644
index 0000000..efd9717
--- /dev/null
+++ b/tests/Grid/asciidumpload2.cc
@@ -0,0 +1,495 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// ascii_load simple test of loading the result of ascii_dump()
+bool
+test01() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A - B %= 2) / 5);
+ gr1.add_congruence(B %= 0);
+
+ gr1.minimized_grid_generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ gr2.ascii_load(f);
+ close(f);
+
+ bool ok = (gr1 == gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 2) / 5);
+ gr1.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr1.ascii_dump(f);
+ close(f);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "space_dim");
+ f.seekp(0, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-ZE");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "con_sys");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "A\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "gen_sys");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test07() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(not_up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "A\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test08() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test09() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(not_up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test10() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test11() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test12() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test13() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ bool ok = !gr2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// A grid with a virtual generator.
+bool
+test14() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A - B %= 2) / 5);
+ gr1.add_congruence(B %= 0);
+ gr1.add_congruence((C == 4) / 0);
+
+ gr1.minimized_grid_generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ gr2.ascii_load(f);
+ close(f);
+
+ bool ok = (gr1 == gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test15() {
+ const char* my_file = "ascii_dump_load2.dat";
+
+ Grid gr1(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ gr2.ascii_load(f);
+ close(f);
+
+ bool ok = (gr1 == gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test16() {
+ const char* my_file = "ascii_dump_load2.dat";
+
+ Grid gr1(0, EMPTY);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gr1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid gr2;
+ gr2.ascii_load(f);
+ close(f);
+
+ bool ok = (gr1 == gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/asciidumpload3.cc b/tests/Grid/asciidumpload3.cc
new file mode 100644
index 0000000..8faabbc
--- /dev/null
+++ b/tests/Grid/asciidumpload3.cc
@@ -0,0 +1,124 @@
+/* Test Congruence::ascii_dump() and Congruence::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Congruence cg1 = (A - B %= 2) / 5;
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ cg1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence cg2(B == 0);
+ cg2.ascii_load(f);
+ close(f);
+
+ bool ok = (cg1 == cg2);
+
+ print_congruence(cg1, "*** cg1 ***");
+ print_congruence(cg2, "*** cg2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "size 2 1\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence cg(0*A %= 0);
+ bool ok = !cg.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "size 3 1 0 err 1\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence cg(0*A %= 0);
+ bool ok = !cg.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "size 3 1 0 m\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence cg(0*A %= 0);
+ bool ok = !cg.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/asciidumpload4.cc b/tests/Grid/asciidumpload4.cc
new file mode 100644
index 0000000..bcc0d6a
--- /dev/null
+++ b/tests/Grid/asciidumpload4.cc
@@ -0,0 +1,145 @@
+/* Test Congruence_System ascii_dump() and ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+ const char* my_file = "ascii_dump_load4.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs1((A + B %= 2) / 3);
+ cgs1.insert(A == 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ cgs1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence_System cgs2;
+ cgs2.ascii_load(f);
+ close(f);
+
+ bool ok = (cgs1 == cgs2);
+
+ print_congruences(cgs1, "*** cgs1 ***");
+ print_congruences(cgs2, "*** cgs2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load4.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "err x 3\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence_System cgs(0*A %= 0);
+ bool ok = !cgs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load4.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence_System cgs(0*A %= 0);
+ bool ok = !cgs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load4.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2 x err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence_System cgs(0*A %= 0);
+ bool ok = !cgs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load4.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2 x 3\n"
+ << "size 3 0 1 err 1\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Congruence_System cgs(0*A %= 0);
+ bool ok = !cgs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload5.cc b/tests/Grid/asciidumpload5.cc
new file mode 100644
index 0000000..e9f571e
--- /dev/null
+++ b/tests/Grid/asciidumpload5.cc
@@ -0,0 +1,155 @@
+/* Test Grid_Generator ascii_dump() and ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+ const char* my_file = "ascii_dump_load5.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator g1 = grid_point(A - B);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ g1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator g2(grid_point(0*B));
+ g2.ascii_load(f);
+ close(f);
+
+ bool ok = (g1 == g2);
+
+ print_generator(g1, "*** g1 ***");
+ print_generator(g2, "*** g2 ***");
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test02() {
+ const char* my_file = "ascii_dump_load5.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "1\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator g(grid_point(0*A));
+ bool ok = !g.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test03() {
+ const char* my_file = "ascii_dump_load5.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "1 0 3\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator g(grid_point(0*A));
+ bool ok = !g.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// ascii_load failure.
+bool
+test04() {
+ const char* my_file = "ascii_dump_load5.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "1 0 1 err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator g(grid_point(0*A));
+ bool ok = !g.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+// Load and dump a line.
+bool
+test05() {
+ const char* my_file = "ascii_dump_load5.dat";
+ Variable A(0);
+ Variable B(0);
+
+ Grid_Generator g1 = grid_line(2*A - B);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ g1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator g2(grid_point(0*B));
+ g2.ascii_load(f);
+ close(f);
+
+ bool ok = (g1 == g2);
+
+ print_generator(g1, "*** g1 ***");
+ print_generator(g2, "*** g2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload6.cc b/tests/Grid/asciidumpload6.cc
new file mode 100644
index 0000000..91a35d2
--- /dev/null
+++ b/tests/Grid/asciidumpload6.cc
@@ -0,0 +1,145 @@
+/* Test Generator_System ascii_dump() and ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+ const char* my_file = "ascii_dump_load6.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs1(grid_point());
+ gs1.insert(parameter(A + B));
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ gs1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator_System gs2;
+ gs2.ascii_load(f);
+ close(f);
+
+ bool ok = (gs1 == gs2);
+
+ print_generators(gs1, "*** gs1 ***");
+ print_generators(gs2, "*** gs2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load6.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "err x 3\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator_System gs(grid_point(0*A));
+ bool ok = !gs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load6.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator_System gs(grid_point(0*A));
+ bool ok = !gs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load6.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2 x err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator_System gs(grid_point(0*A));
+ bool ok = !gs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load6.dat";
+ Variable A(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "2 x 3\n"
+ << "1 0 0 err\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ Grid_Generator_System gs(grid_point(0*A));
+ bool ok = !gs.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/bhz03widening1.cc b/tests/Grid/bhz03widening1.cc
new file mode 100644
index 0000000..b451163
--- /dev/null
+++ b/tests/Grid/bhz03widening1.cc
@@ -0,0 +1,113 @@
+/* Test Pointset_Powerset<Grid>::BHZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef Pointset_Powerset<Grid> GSet;
+
+namespace {
+
+// Joins of grids in powersets shows that series is stabilizing.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ GSet grs1(2, EMPTY);
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence(B %= 0);
+ grs1.add_disjunct(gr1);
+
+ print_congruences<Grid>(grs1, "*** grs1 ***");
+
+ GSet grs2(2, EMPTY);
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ grs2.add_disjunct(gr2);
+
+ print_congruences<Grid>(grs2, "*** grs2 ***");
+
+ GSet known_grs = grs2;
+
+ grs2.BHZ03_widening_assign<Grid_Certificate>
+ (grs1, widen_fun_ref(&Grid::widening_assign));
+
+ bool ok = (grs2 == known_grs);
+
+ print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+ return ok;
+}
+
+// Widening falls back to a singleton join of the grids in the larger
+// grid set.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ GSet grs1(2, EMPTY);
+ Grid gr1(2);
+ gr1.add_congruence(A - B %= 0);
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 2);
+ grs1.add_disjunct(gr1);
+ grs1.add_disjunct(gr2);
+
+ print_congruences<Grid>(grs1, "*** grs1 ***");
+
+ GSet grs2(2, EMPTY);
+ Grid gr3(2);
+ gr3.add_congruence(A - B %= 0);
+ Grid gr4(2);
+ gr4.add_congruence((A %= 0) / 2);
+ grs2.add_disjunct(gr3);
+ grs2.add_disjunct(gr4);
+
+ print_congruences<Grid>(grs2, "*** grs2 ***");
+
+ Grid known_gr = gr3;
+ known_gr.upper_bound_assign(gr4);
+
+ grs2.BHZ03_widening_assign<Grid_Certificate>
+ (grs1, widen_fun_ref(&Grid::widening_assign));
+
+ GSet known_grs(2, EMPTY);
+ known_grs.add_disjunct(known_gr);
+
+ bool ok = (grs2 == known_grs);
+
+ print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/bounded1.cc b/tests/Grid/bounded1.cc
new file mode 100644
index 0000000..8e5a869
--- /dev/null
+++ b/tests/Grid/bounded1.cc
@@ -0,0 +1,392 @@
+/* Test Grid::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (gr.is_bounded());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.is_bounded());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.is_bounded());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.is_bounded()
+ && gr_gs_needs_min.is_bounded()
+ && gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence((C == 0) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((A == 3) / 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Skew.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_line(C));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Plane.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(4, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence((A == 0) / 0);
+ gr_cgs_needs_min.add_congruence((D == 0) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = !gr_gs_min.is_bounded()
+ && !gr_gs_needs_min.is_bounded()
+ && !gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Point in 6D.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Grid gr_gs_min(6, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_gs_needs_min(6, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_cgs_needs_min(6);
+ gr_cgs_needs_min.add_congruence((A == 7) / 0);
+ gr_cgs_needs_min.add_congruence((B == -11) / 0);
+ gr_cgs_needs_min.add_congruence((C == 0) / 0);
+ gr_cgs_needs_min.add_congruence((D == 0) / 0);
+ gr_cgs_needs_min.add_congruence((E == 0) / 0);
+ gr_cgs_needs_min.add_congruence((F == 19) / 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = gr_gs_min.is_bounded()
+ && gr_gs_needs_min.is_bounded()
+ && gr_cgs_needs_min.is_bounded();
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// A single point, duplicated.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(3*A + 2*B));
+ gr.add_grid_generator(grid_point(3*A + 2*B));
+
+ bool ok = (gr.is_bounded());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// A parameter that comes first in the generator system.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(3*A + 2*B));
+ gs.insert(grid_point(3*A + 2*B));
+
+ Grid gr(gs);
+
+ bool ok = (!gr.is_bounded());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/boundedaffineimage1.cc b/tests/Grid/boundedaffineimage1.cc
new file mode 100644
index 0000000..5ab38ad
--- /dev/null
+++ b/tests/Grid/boundedaffineimage1.cc
@@ -0,0 +1,185 @@
+/* Test Grid::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A == 0) / 0);
+ gr.add_congruence((B == 0) / 0);
+ gr.add_congruence((C == -2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.bounded_affine_image(A, 7-B, B+3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(-2*C));
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A == 0) / 0);
+ gr.add_congruence((A == 1) / 0);
+ gr.add_congruence((C == -2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.bounded_affine_image(A, 7-B, B+3);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // any call with a denominator equal to zero is illegal.
+ Coefficient d = 0;
+ gr.bounded_affine_image(B, A - 7, B + 2, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the lower bounding expression
+ // that does not appear in the grid.
+ gr.bounded_affine_image(A, B, A + 7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the upper bounding expression
+ // that does not appear in the grid.
+ gr.bounded_affine_image(A, A + 7, B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 1);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to bound a variable not occurring in the
+ // vector space embedding the grid.
+ gr.bounded_affine_image(B, A - 7, 2*A - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/boundedaffinepreimage1.cc b/tests/Grid/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..0307a89
--- /dev/null
+++ b/tests/Grid/boundedaffinepreimage1.cc
@@ -0,0 +1,185 @@
+/* Test Grid::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A == 0) / 0);
+ gr.add_congruence((B == 0) / 0);
+ gr.add_congruence((C == -2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.bounded_affine_preimage(A, 7-B, B+3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(-2*C));
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A == 0) / 0);
+ gr.add_congruence((A == 1) / 0);
+ gr.add_congruence((C == -2) / 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.bounded_affine_preimage(A, 7-B, B+3);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // any call with a denominator equal to zero is illegal.
+ Coefficient d = 0;
+ gr.bounded_affine_preimage(B, A - 7, B + 2, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the lower bounding expression
+ // that does not appear in the grid.
+ gr.bounded_affine_preimage(A, B, A + 7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 0);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the upper bounding expression
+ // that does not appear in the grid.
+ gr.bounded_affine_preimage(A, A + 7, B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 1);
+
+ try {
+ // This is an incorrect use of function
+ // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to bound a variable not occurring in the
+ // vector space embedding the grid.
+ gr.bounded_affine_preimage(B, A - 7, 2*A - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/bounds1.cc b/tests/Grid/bounds1.cc
new file mode 100644
index 0000000..d024ad7
--- /dev/null
+++ b/tests/Grid/bounds1.cc
@@ -0,0 +1,459 @@
+/* Test Grid::bounds_from_above() and Grid::bounds_from_below().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (gr.bounds_from_above(Linear_Expression(0))
+ && gr.bounds_from_below(Linear_Expression(0)));
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.bounds_from_above(Linear_Expression(3))
+ && gr.bounds_from_below(Linear_Expression(3)));
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.bounds_from_above(Linear_Expression(1))
+ && gr.bounds_from_below(Linear_Expression(1)));
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 1);
+ gr_cgs_needs_min.add_constraint(3*B == 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A + B;
+ bool ok = gr_gs_min.bounds_from_above(le)
+ && gr_gs_min.bounds_from_below(le)
+ && gr_gs_needs_min.bounds_from_above(le)
+ && gr_gs_needs_min.bounds_from_below(le)
+ && gr_cgs_needs_min.bounds_from_above(le)
+ && gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+
+ bool ok = !gr_gs_min.bounds_from_above(le)
+ && !gr_gs_min.bounds_from_below(le)
+ && !gr_gs_needs_min.bounds_from_above(le)
+ && !gr_gs_needs_min.bounds_from_below(le)
+ && !gr_cgs_needs_min.bounds_from_above(le)
+ && !gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Line.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(2*A + B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A - 2*B == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B;
+ bool ok = !gr_gs_min.bounds_from_above(le)
+ && !gr_gs_min.bounds_from_below(le)
+ && !gr_gs_needs_min.bounds_from_above(le)
+ && !gr_gs_needs_min.bounds_from_below(le)
+ && !gr_cgs_needs_min.bounds_from_above(le)
+ && !gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// A line along expr in the grid.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(2*A - B == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+ bool ok = gr_gs_min.bounds_from_above(le)
+ && gr_gs_min.bounds_from_below(le)
+ && gr_gs_needs_min.bounds_from_above(le)
+ && gr_gs_needs_min.bounds_from_below(le)
+ && gr_cgs_needs_min.bounds_from_above(le)
+ && gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+
+// A parameter along expr in the grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(2*A - B == 0);
+ gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+ bool ok = gr_gs_min.bounds_from_above(le)
+ && gr_gs_min.bounds_from_below(le)
+ && gr_gs_needs_min.bounds_from_above(le)
+ && gr_gs_needs_min.bounds_from_below(le)
+ && gr_cgs_needs_min.bounds_from_above(le)
+ && gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Two lines which combine to cover any line bounded by expr.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A));
+ gr_gs_min.add_grid_generator(grid_line(B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+
+ Grid gr_cgs_needs_min(2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A - B;
+ bool ok = !gr_gs_min.bounds_from_above(le)
+ && !gr_gs_min.bounds_from_below(le)
+ && !gr_gs_needs_min.bounds_from_above(le)
+ && !gr_gs_needs_min.bounds_from_below(le)
+ && !gr_cgs_needs_min.bounds_from_above(le)
+ && !gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A));
+ gr_gs_min.add_grid_generator(grid_point(B + C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(B + C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(B - C == 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B - C;
+ bool ok = !gr_gs_min.bounds_from_above(le)
+ && !gr_gs_min.bounds_from_below(le)
+ && !gr_gs_needs_min.bounds_from_above(le)
+ && !gr_gs_needs_min.bounds_from_below(le)
+ && !gr_cgs_needs_min.bounds_from_above(le)
+ && !gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(3*B + C));
+ gr_gs_min.add_grid_generator(grid_line(A - 2*B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+ gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(2*A + B - 3*C == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B - 3*C;
+ bool ok = gr_gs_min.bounds_from_above(le)
+ && gr_gs_min.bounds_from_below(le)
+ && gr_gs_needs_min.bounds_from_above(le)
+ && gr_gs_needs_min.bounds_from_below(le)
+ && gr_cgs_needs_min.bounds_from_above(le)
+ && gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Grid gr_gs_min(6, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_gs_needs_min(6, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_cgs_needs_min(6);
+ gr_cgs_needs_min.add_constraint(A == 7);
+ gr_cgs_needs_min.add_constraint(B == -11);
+ gr_cgs_needs_min.add_constraint(C == 0);
+ gr_cgs_needs_min.add_constraint(D == 0);
+ gr_cgs_needs_min.add_constraint(E == 0);
+ gr_cgs_needs_min.add_constraint(F == 19);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+ bool ok = gr_gs_min.bounds_from_above(le)
+ && gr_gs_min.bounds_from_below(le)
+ && gr_gs_needs_min.bounds_from_above(le)
+ && gr_gs_needs_min.bounds_from_below(le)
+ && gr_cgs_needs_min.bounds_from_above(le)
+ && gr_cgs_needs_min.bounds_from_below(le);
+
+ print_congruences(gr_gs_min, "*** gr_gs_min **");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+
+ Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+ try {
+ gr.bounds_from_above(le);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// The generator system is up-to-date but not minimized.
+bool
+test14() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(A, 2));
+ print_generators(gr, "*** gr generators before ***");
+
+ bool ok = !gr.bounds_from_above(A) && !gr.bounds_from_below(A);
+ print_generators(gr, "*** gr generators after ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/certificate1.cc b/tests/Grid/certificate1.cc
new file mode 100644
index 0000000..2767649
--- /dev/null
+++ b/tests/Grid/certificate1.cc
@@ -0,0 +1,229 @@
+/* Test class Grid_Certificate.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Compare a grid to one that is more constrained (due to equalities).
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A + C %= 0);
+ gr1.add_constraint(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(3*B + A));
+ gr2.add_grid_generator(grid_point(3*B + A + C));
+
+ Grid_Certificate grc2(gr2);
+
+ bool ok = grc1.compare(grc2) == -1;
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare a grid to one that is more constrained (due to proper
+// congruences).
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A + C %= 0);
+ gr1.add_constraint(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(3*B + A));
+ gr2.add_grid_generator(grid_point(3*B + A + C));
+
+ bool ok = grc1.compare(gr2) == -1;
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare a grid to an equally constrained one.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A + C %= 0);
+ gr1.add_constraint(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(3*B));
+ gr2.add_grid_generator(grid_line(A - C));
+ gr2.add_grid_generator(grid_point(3*B + A));
+
+ Grid_Certificate grc2(gr2);
+
+ bool ok = grc1.compare(grc2) == 0
+ && !grc1.is_stabilizing(gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare a grid to one that is less constrained (due to equalities).
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B + A));
+ gr1.add_grid_generator(grid_point(3*B + A + C));
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3);
+ gr2.add_congruence(A + C %= 0);
+ gr2.add_constraint(B == 3);
+
+ bool ok = grc1.compare(gr2) == 1
+ && grc1.is_stabilizing(gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare a grid to one that is less constrained (due to proper
+// congruences).
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + C %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 3);
+ gr1.add_congruence(A %= 0);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3);
+ gr2.add_congruence((A + C %= 0) / 2);
+ gr2.add_congruence((B %= 0) / 3);
+
+ Grid_Certificate grc2(gr2);
+
+ Grid_Certificate::Compare cmp;
+
+ bool ok = cmp(grc1, grc2)
+ && grc1.is_stabilizing(gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare certificates for zero dimension universe grids.
+bool
+test06() {
+ Grid gr1(0);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(0);
+
+ Grid_Certificate grc2(gr2);
+
+ bool ok = (grc1.compare(grc2) == 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Compare a grid to one that is more constrained, where the minimized
+// generators are used for the comparison.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A + C %= 0);
+ gr1.add_constraint(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(3*B + A + C));
+ gr2.add_grid_generator(grid_point(3*B + A));
+
+ // Ensure up to date congruences and minimized generators.
+ gr2.affine_image(A, 1*A);
+ gr2.minimized_grid_generators();
+
+ bool ok = (grc1.compare(gr2) == -1);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/concatenate1.cc b/tests/Grid/concatenate1.cc
new file mode 100644
index 0000000..570b40f
--- /dev/null
+++ b/tests/Grid/concatenate1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+ Variable B(1);
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+
+ Grid gr1(cgs);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ cgs.clear();
+ cgs.insert((A %= 1) / 2);
+
+ Grid gr2(cgs);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 0) / 2);
+ known_cgs.insert((B %= 1) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid empty.
+bool
+test02() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 0) / 2);
+
+ Grid gr2(cgs);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid empty.
+bool
+test03() {
+ Variable A(0);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 0) / 2);
+
+ Grid gr1(cgs);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid a universe.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr1(1, UNIVERSE);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(A + C));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(gs);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(B));
+ known_gs.insert(grid_point(B + D));
+ known_gs.insert(grid_line(A));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(A + C));
+
+ Grid gr1(gs);
+
+ print_generators(gr1, "*** gr1 ***");
+
+ gs.clear();
+ gs.insert(grid_point(0*B));
+ gs.insert(grid_point(B));
+
+ Grid gr2(gs);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A == 1) / 0);
+ known_cgs.insert((B == 0) / 0);
+ known_cgs.insert((C %= 0) / 1);
+ known_cgs.insert((D == 0) / 0);
+ known_cgs.insert((E %= 0) / 1);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid empty via the congruence system.
+bool
+test06() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((A %= 1) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid empty via the congruence system.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr1(2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence((A %= 1) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr1(0, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.concatenate_assign(gr2);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+ Grid gr1(7);
+
+ Grid gr2(1);
+ gr2.add_congruence(Congruence::zero_dim_integrality());
+ gr2.minimized_congruences();
+ gr2.ascii_dump();
+ // This needs to allocate a lot of memory, in order to create the
+ // integrality congruence. The presence of the integrality
+ // congruence is required by the conversion.
+
+ gr2.add_space_dimensions_and_project(Grid::max_space_dimension() - 1);
+
+ try {
+ gr1.concatenate_assign(gr2);
+ }
+ catch (const std::length_error& e) {
+ nout << "max_space_dimension_exceeded: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ // DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/congruence1.cc b/tests/Grid/congruence1.cc
new file mode 100644
index 0000000..668c3cf
--- /dev/null
+++ b/tests/Grid/congruence1.cc
@@ -0,0 +1,459 @@
+/* Test class Congruence.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+class Test_Congruence : public Congruence {
+public:
+ Test_Congruence(Congruence cg) : Congruence(cg) {}
+ Test_Congruence(Constraint c) : Congruence(c) {}
+ void strong_normalize() { Congruence::strong_normalize(); }
+ void normalize() { Congruence::normalize(); }
+};
+
+// Negative inhomogeneous term.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+ a.strong_normalize();
+
+ Test_Congruence b((A %= 5 - 3*C - 2*B) / 7);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Positive inhomogeneous term.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A + 2*B + 3*C %= -5) / 7);
+ a.strong_normalize();
+
+ Test_Congruence b((A %= -5 - 3*C - 2*B) / 7);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Common factors and reducible positive inhomogeneous term.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((16*A + 2*B + 8*C + 64 %= 0) / 4);
+ a.strong_normalize();
+
+ Test_Congruence b((16*A + 2*B %= - 64 - 8*C) / 4);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Negative first coefficient.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((- A + 2*B + 3*C %= 5) / 7);
+ a.strong_normalize();
+
+ Test_Congruence b((- A %= - 2*B + 5 - 3*C) / 7);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Constructed with only the %= operator.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence c(A + 4*B + 3*C %= 5);
+ Test_Congruence a(c);
+ //Test_Congruence a = (A + 4*B + 3*C %= 5);
+ //Test_Congruence a(A + 4*B + 3*C %= 5);
+ a.strong_normalize();
+
+ Test_Congruence b(A + 4*B %= 5 - 3*C);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Equality congruence (a modulus of 0).
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((3*A + 24*B + 3*C %= -19) / 0);
+ a.strong_normalize();
+
+ Test_Congruence b((3*A + 24*B %= -19 - 3*C) / 0);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Constructed from a Constraint with the `/' operator.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A + 4*B + 3*C == 17) / 3);
+ a.strong_normalize();
+
+ Test_Congruence b((A + 4*B == 17 - 3*C) / 3);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Constructed from a Constraint.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a(A + 4*B + 3*C == 17);
+ a.strong_normalize();
+
+ Test_Congruence b(A + 4*B == 17 - 3*C);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Set modulus with `/='.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a(A + 4*B + 3*C == 17);
+ a /= 3;
+ a.strong_normalize();
+
+ Test_Congruence b(A + 4*B == 17 - 3*C);
+ b /= 3;
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// is_tautological and is_inconsistent.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a(0*A + 0*B + 0*C %= 17);
+
+ bool ok = (a.is_tautological()) && (!a.is_inconsistent());
+
+ print_congruence(a,
+ "*** a(0*A + 0*B + 0*C %= 17) ***");
+
+ a = Test_Congruence((0*A + 0*B + 0*C %= 0) / 3);
+ ok &= a.is_tautological()
+ && !a.is_inconsistent();
+
+ a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4);
+ ok &= a.is_tautological()
+ && !a.is_inconsistent();
+
+ print_congruence(a,
+ "*** a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4) ***");
+
+ a = Test_Congruence(0*A + 0*B %= 17);
+ a /= 0;
+ ok &= !a.is_tautological()
+ && a.is_inconsistent();
+
+ print_congruence(a,
+ "*** a = Test_Congruence(0*A + 0*B %= 17) ***");
+
+ a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0);
+ a.strong_normalize();
+ ok &= !a.is_tautological()
+ && a.is_inconsistent();
+
+ print_congruence(a,
+ "*** a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0) ***");
+
+ a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3);
+ a.strong_normalize();
+ ok &= !a.is_tautological()
+ && a.is_inconsistent();
+
+ print_congruence(a,
+ "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+
+ a = Test_Congruence((0*A + 1*B %= 1) / 3);
+ ok &= !a.is_tautological()
+ && !a.is_inconsistent();
+
+ print_congruence(a,
+ "*** a = Test_Congruence((0*A + 1*B %= 1) / 3) ***");
+
+ return ok;
+}
+
+// Negative moduli.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A + 4*B + 3*C %= -4) / -3);
+ a.strong_normalize();
+
+ Test_Congruence b((A + 4*B %= -1 - 3*C) / -3);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Negative modulus and negative first coefficient.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Test_Congruence a((-A + 4*B + 3*C + 17*D + 2*E %= -4) / -3);
+ a.strong_normalize();
+
+ Test_Congruence b((-A + 4*B %= - 3*C - 17*D - 2*E - 4) / -3);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Create from empty linear expression.
+bool
+test13() {
+ Linear_Expression le;
+ Test_Congruence a(le %= le);
+ a.strong_normalize();
+
+ Test_Congruence b(le %= 0);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Linear expressions on both sides.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A - 5 %= 2*B + 3*C) / 7);
+ a.strong_normalize();
+
+ Test_Congruence b((-A %= -5 - 3*C - 2*B) / 7);
+ b.strong_normalize();
+
+ bool ok = (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Try construct congruence from inequality constraint.
+bool
+test15() {
+ Variable A(0);
+ Variable C(2);
+
+ try {
+ Congruence cg(A + C > 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Try access the coefficient of a space dimension higher than that of
+// a congruence.
+bool
+test16() {
+ Variable A(0);
+ Variable C(2);
+
+ Congruence cg(A + C %= 0);
+
+ try {
+ cg.coefficient(Variable(3));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Check if the congruences are equivalent.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+
+ Test_Congruence b((A + 2*B + 3*C %= 12) / 7);
+
+ Test_Congruence c((2*A + 4*B + 6*C %= 10) / 14);
+
+ bool ok = (a == b);
+ ok &= (a == c);
+
+ Test_Congruence d((2*A + 4*B + 6*C %= 10) / 7);
+
+ ok &= (a != d);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+ print_congruence(c, "*** c ***");
+ print_congruence(d, "*** d ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/congruences1.cc b/tests/Grid/congruences1.cc
new file mode 100644
index 0000000..0a08531
--- /dev/null
+++ b/tests/Grid/congruences1.cc
@@ -0,0 +1,403 @@
+/* Test Grid::congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(7, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+ Grid gr1(7);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ print_congruences(cgs, "*** cgs ***");
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+ Grid gr1(0, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+ Grid gr1(0);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 7);
+ gr1.add_congruence((A %= 0) / 5);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// 3D rectilinear grid defined by generators.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_grid_generator(grid_point(10*B));
+ gr1.add_grid_generator(grid_point(10*A + 10*B));
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Get a reference to the congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test07() {
+ Grid gr1(3);
+ gr1.add_congruence(Congruence::zero_dim_integrality());
+
+ const Congruence_System& cgs = gr1.congruences();
+
+ // Empty the grid. The idea is to check that `cgs' still refers to
+ // a congruence system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// In zero dimensions get a reference to the universe congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test08() {
+ Grid gr1(0);
+ gr1.add_congruence(Congruence::zero_dim_integrality());
+
+ const Congruence_System& cgs = gr1.congruences();
+
+ // Empty the grid. The idea is to check that `cgs' still refers to
+ // a congruence system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// add congruence systems to a congruence system with smaller space
+// dimension.
+// This test showed a bug in Congruence_System insert(), now corrected.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ Congruence_System cgs1;
+ cgs1.insert((A %= 0) / 2);
+ cgs.insert(cgs1);
+ cgs1.insert((A + B %= 0) / 2);
+ cgs.insert(cgs1, Recycle_Input());
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add congruence systems to a congruence system
+// with larger space dimension.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ Congruence_System cgs1;
+ cgs.insert((A + B %= 0) / 2);
+ cgs1.insert((A %= 0) / 2);
+ cgs.insert(cgs1);
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(cgs1, "*** cgs1 ***");
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// Test is_equal_to() for same congruence systems.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs1;
+ cgs1.insert((A %= 0) / 2);
+ cgs1.insert((A + B %= 0) / 2);
+ Congruence_System cgs(cgs1);
+ bool ok = cgs.is_equal_to(cgs1);
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(cgs1, "*** cgs1 ***");
+
+ return ok;
+}
+
+// Test is_equal_to() for congruence systems with different numbers
+// numbers of congruences.
+// This test showed a bug in Congruence_System is_equal_to(), now corrected.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs1;
+ cgs1.insert((A %= 0) / 2);
+ cgs1.insert((A + B %= 0) / 2);
+ Congruence_System cgs(cgs1);
+ cgs1.insert((B %= 0) / 2);
+
+ bool ok = !cgs.is_equal_to(cgs1);
+ print_congruences(cgs, "*** cgs ***");
+ print_congruences(cgs1, "*** cgs1 ***");
+
+ return ok;
+}
+
+// Test is_equal_to() for different congruence systems with the same
+// number of congruences.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs1;
+ Congruence_System cgs2;
+ cgs1.insert((A %= 0) / 2);
+ cgs1.insert((A + B %= 0) / 2);
+ cgs2.insert((B %= 0) / 2);
+ cgs2.insert((A + B %= 0) / 2);
+ bool ok = !cgs1.is_equal_to(cgs2);
+ print_congruences(cgs1, "*** cgs1 ***");
+ print_congruences(cgs2, "*** cgs2 ***");
+
+ return ok;
+}
+
+// Test has_linear_equalities() for congruence systems.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+ print_congruences(cgs, "*** cgs.insert((A + B %= 0) / 2) ***");
+ bool ok = !cgs.has_linear_equalities();
+
+ cgs.insert(A == 0);
+ print_congruences(cgs, "*** cgs.insert(A == 0) ***");
+ ok &= cgs.has_linear_equalities();
+
+ return ok;
+}
+
+// Test num_equalities() for congruence systems.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+ cgs.insert(A == 0);
+ print_congruences(cgs, "*** cgs ***");
+
+ bool ok = ((cgs.num_equalities() == 1)
+ && (cgs.num_proper_congruences() == 1));
+
+ return ok;
+}
+
+// Add to a non-empty congruence system a nonempty constraint system
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert(B == 0);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(B == 0);
+ known_cgs.insert(A %= 0);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ Grid gr(cgs);
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/congruences2.cc b/tests/Grid/congruences2.cc
new file mode 100644
index 0000000..8072568
--- /dev/null
+++ b/tests/Grid/congruences2.cc
@@ -0,0 +1,337 @@
+/* Test Congruence_System::satisfies_all_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+class Test_Congruence_System : public Congruence_System {
+public:
+ Test_Congruence_System() : Congruence_System() {}
+ Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {}
+ Test_Congruence_System(Congruence cg) : Congruence_System(cg) {}
+ bool
+ satisfies_all_congruences(const Grid_Generator& g) const {
+ return Congruence_System::satisfies_all_congruences(g);
+ }
+};
+
+// Public constructors.
+bool
+test01() {
+ Test_Congruence_System cgs0;
+
+ print_congruences(cgs0, "*** cgs0 ***");
+
+ Test_Congruence_System cgs1(cgs0);
+
+ bool ok = (cgs1 == cgs0);
+
+ print_congruences(cgs1, "*** cgs1(cgs0) ***");
+
+ if (ok) {
+ Variable A(0);
+ Variable B(1);
+
+ Test_Congruence_System cgs2((A - 3*B %= 5) / 2);
+
+ ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1);
+
+ print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***");
+ };
+
+ return ok;
+}
+
+// operator=
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence_System cgs0;
+
+ Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2);
+
+ cgs0 = cgs1;
+
+ bool ok = (cgs0 == cgs1);
+
+ print_congruences(cgs0, "*** cgs0 ***");
+
+ return ok;
+}
+
+// space_dimension
+bool
+test03() {
+ Variable A(3);
+ Variable B(7);
+ Variable C(4);
+
+ Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21);
+
+ bool ok = (cgs0.space_dimension() == 8);
+
+ print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***");
+
+ return ok;
+}
+
+// clear
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Test_Congruence_System cgs0((A - 3*B %= 5) / 7);
+
+ print_congruences(cgs0, "*** cgs0 ***");
+
+ cgs0.clear();
+
+ bool ok = (cgs0.space_dimension() == 0);
+
+ print_congruences(cgs0, "*** cgs0.clear() ***");
+
+ return ok;
+}
+
+// insert
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7);
+ cgs0.insert((A %= 0) / 3);
+ cgs0.insert((A + B %= 3) / 5);
+
+ dimension_type tem = cgs0.num_proper_congruences();
+ bool ok = (tem == 3);
+
+ print_congruences(cgs0, "*** cgs0.insert ***");
+
+ return ok;
+}
+
+// num_[non_]equalities
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7);
+ cgs0.insert((A %= 0) / 0);
+ cgs0.insert((A + B %= 3) / 0);
+
+ dimension_type neqs = cgs0.num_equalities();
+ dimension_type npcgs = cgs0.num_proper_congruences();
+ bool ok = (neqs == 2 && npcgs == 1);
+
+ print_congruences(cgs0, "*** cgs0.insert ***");
+
+ return ok;
+}
+
+// insert, including a row with all terms zero and an equality.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Test_Congruence_System cgs0(0*A + 0*B %= -1);
+ cgs0.insert((A + 0*B %= 1) / 0);
+ cgs0.insert(0*A + 1*B %= 1);
+
+ dimension_type neqs = cgs0.num_equalities();
+ dimension_type npcgs = cgs0.num_proper_congruences();
+ bool ok = (neqs == 1 && npcgs == 2);
+
+ print_congruences(cgs0, "*** cgs0.insert ***");
+
+ return ok;
+}
+
+/* If EXPECTED is true:
+ If G satisfies CGS, then return true, else print an error message
+ and return false.
+
+ And if EXPECTED is false:
+ If G satisfies CGS, then print an error message and return false,
+ else return true.
+*/
+bool
+satisfies(const Grid_Generator& g,
+ const Test_Congruence_System& cgs,
+ bool expected = true) {
+ if (cgs.satisfies_all_congruences(g) == expected)
+ return true;
+
+ nout << g << " should";
+ expected || nout << "fail to";
+ nout << " satisfy " << cgs << "." << endl
+ << "ASCII dump of " << g << ":" << endl;
+ g.ascii_dump(nout);
+ nout << "ASCII dump of " << cgs << ":" << endl;
+ cgs.ascii_dump(nout);
+
+ return false;
+}
+
+inline bool
+fails_to_satisfy(const Grid_Generator& g,
+ const Congruence_System& cgs) {
+ return satisfies(g, cgs, false);
+}
+
+// Divisor of 1.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Test_Congruence_System cgs0((A - B %= 0) / 7);
+ print_congruences(cgs0, "*** cgs0((A - B %= 0) / 7) ***");
+
+ // Points.
+
+ bool ok = (satisfies(grid_point(), cgs0));
+
+ ok &= (satisfies(grid_point(A + B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_point(A + 2*B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_point(5*A + 2*B), cgs0));
+
+ ok &= (satisfies(grid_point(5*A - 2*B), cgs0));
+
+ // Parameters.
+
+ ok &= (satisfies(parameter(3*A + 3*B), cgs0));
+
+ ok &= (satisfies(parameter(0*A + 14*B), cgs0));
+
+ ok &= (satisfies(parameter(-A + 13*B), cgs0));
+
+ // Lines.
+
+ ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+ cgs0.insert((A %= 0) / 2);
+ ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+ print_congruences(cgs0,
+ "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+ return ok;
+}
+
+// Divisors greater than 1.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Test_Congruence_System cgs0((A - B %= 0) / 7);
+ print_congruences(cgs0,
+ "*** cgs0((A - B %= 0) / 7) ***");
+
+ // Points.
+
+ bool ok = (satisfies(grid_point(A + B, 3), cgs0));
+
+ ok &= (fails_to_satisfy(grid_point(A + 2*B, 3), cgs0));
+
+ ok &= (fails_to_satisfy(grid_point(5*A + 2*B, 5), cgs0));
+
+ ok &= (fails_to_satisfy(grid_point(5*A - 2*B, 7), cgs0));
+
+ // Parameters.
+
+ ok &= (satisfies(parameter(3*A + 3*B, 4), cgs0));
+
+ ok &= (fails_to_satisfy(parameter(A + 14*B, 5), cgs0));
+
+ ok &= (satisfies(parameter(-A + 13*B, 2), cgs0));
+
+ // Lines.
+
+ ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+ ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+ cgs0.clear();
+ cgs0.insert((A %= 0) / 2);
+ ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+ print_congruences(cgs0,
+ "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+ return ok;
+}
+
+// clear empty congruence system
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Test_Congruence_System cgs0;
+
+ print_congruences(cgs0, "*** cgs0 ***");
+
+ cgs0.clear();
+
+ bool ok = (cgs0.space_dimension() == 0);
+
+ print_congruences(cgs0, "*** cgs0.clear() ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/constraints1.cc b/tests/Grid/constraints1.cc
new file mode 100644
index 0000000..1afa37f
--- /dev/null
+++ b/tests/Grid/constraints1.cc
@@ -0,0 +1,354 @@
+/* Test Grid::congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(7, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+ Grid gr1(7);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(7);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+ Grid gr1(0, EMPTY);
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid known_gr(Constraint_System::zero_dim_empty());
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+ Grid gr1(0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(0);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 7);
+ gr1.add_congruence((A %= 0) / 5);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+ gr2.add_congruence((A + B %= 3) / 7);
+ gr2.add_congruence((A %= 0) / 5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Single point in 2D
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 0);
+ gr1.add_congruence((A %= 0) / 0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Linear points in 2D
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 2);
+ gr1.add_congruence((A %= 0) / 0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+ gr2.add_congruence((A + B %= 3) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+ Grid gr1(7, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test09() {
+ Grid gr1(7);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(7);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test10() {
+ Grid gr1(0, EMPTY);
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid known_gr(Constraint_System::zero_dim_empty());
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test11() {
+ Grid gr1(0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(0);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 7);
+ gr1.add_congruence((A %= 0) / 5);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+ gr2.add_congruence((A + B %= 3) / 7);
+ gr2.add_congruence((A %= 0) / 5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Single point in 2D
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 0);
+ gr1.add_congruence((A %= 0) / 0);
+ gr1.add_congruence((B %= 3) / 0);
+ gr1.add_congruence((A - B %= -3) / 0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Linear points in 2D
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A + B %= 3) / 2);
+ gr1.add_congruence((A %= 0) / 0);
+ gr1.add_congruence((3*A %= 0) / 0);
+
+ Grid known_gr = gr1;
+
+ Constraint_System cs = gr1.minimized_constraints();
+
+ Grid gr2(3);
+ gr2.add_constraints(cs);
+ gr2.add_congruence((A + B %= 3) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_constraints(cs, "*** cs ***");
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/contains1.cc b/tests/Grid/contains1.cc
new file mode 100644
index 0000000..ead6055
--- /dev/null
+++ b/tests/Grid/contains1.cc
@@ -0,0 +1,214 @@
+/* Test Grid::contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid of points containing empty grid.
+bool
+test01() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+
+ Grid gr1(gs);
+
+ Grid gr2(1, EMPTY);
+
+ bool ok = (gr1.contains(gr2));
+
+ print_generators(gr1, "*** gr1 ***");
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+
+ Grid gr2(gs);
+
+ bool ok = (!gr1.contains(gr2));
+
+ print_generators(gr1, "*** gr1 ***");
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test03() {
+ Grid gr1(4, EMPTY);
+
+ Grid gr2(4, EMPTY);
+
+ bool ok = (gr1.contains(gr2));
+
+ print_generators(gr1, "*** gr1 ***");
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+ Grid gr1(0);
+
+ Grid gr2(0);
+
+ bool ok = (gr1.contains(gr2));
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Self containment.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence(A - B %= 0);
+ gr.add_congruence(C %= 0);
+
+ bool ok = (gr.contains(gr));
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// A grid strictly containing another.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A - B %= 0);
+ gr1.add_congruence(C %= 0);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(grid_point(2*A + 2*B + 2*C));
+
+ bool ok = (gr1.contains(gr2));
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// test06, the other way round.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_point(2*A + 2*B + 2*C));
+
+ Grid gr2(3);
+ gr2.add_congruence(A - B %= 0);
+ gr2.add_congruence(C %= 0);
+
+ bool ok = (!gr1.contains(gr2));
+
+ print_generators(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// CHINA example that showed an error in cgs::is_included_in.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+
+ Grid gr2(1, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+
+ bool ok = !gr1.contains(gr2) && !gr2.contains(gr1);
+
+ print_generators(gr1, "*** gr1 ***");
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Space dimension exception
+bool
+test09() {
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+
+ Grid gr2(21, EMPTY);
+
+ try {
+ gr1.contains(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/containsintegerpoint1.cc b/tests/Grid/containsintegerpoint1.cc
new file mode 100644
index 0000000..7f89045
--- /dev/null
+++ b/tests/Grid/containsintegerpoint1.cc
@@ -0,0 +1,290 @@
+/* Test Grid::contains_integer_point().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <iostream>
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (!gr.contains_integer_point());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+ Grid gr(0, EMPTY);
+
+ bool ok = (!gr.contains_integer_point());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.contains_integer_point());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_constraint(B == 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.contains_integer_point())
+ && (gr_gs_needs_min.contains_integer_point())
+ && (gr_cgs_needs_min.contains_integer_point());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(5*A == 3);
+ gr_cgs_needs_min.add_constraint(5*B == 2);
+
+ Grid gr_cgs_min(3);
+ gr_cgs_min.add_constraint(5*A == 3);
+ gr_cgs_min.add_constraint(5*B == 2);
+ // Minimize the congruences.
+ gr_cgs_min.minimized_congruences();
+
+ // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+ // are the same grids.
+
+ bool ok = (!gr_gs_min.contains_integer_point())
+ && (!gr_gs_needs_min.contains_integer_point())
+ && (!gr_cgs_needs_min.contains_integer_point())
+ && (!gr_cgs_min.contains_integer_point());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+ print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+ return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B, 5));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 5));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(5*A == 3);
+ gr_cgs_needs_min.add_congruence(5*B %= 0);
+ gr_cgs_needs_min.add_constraint(C == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (!gr_gs_min.contains_integer_point())
+ && (!gr_gs_needs_min.contains_integer_point())
+ && (!gr_cgs_needs_min.contains_integer_point());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B, 3));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 3));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 1);
+ gr_cgs_needs_min.add_congruence(3*B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.contains_integer_point())
+ && (gr_gs_needs_min.contains_integer_point())
+ && (gr_cgs_needs_min.contains_integer_point());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Skew.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.contains_integer_point())
+ && (gr_gs_needs_min.contains_integer_point())
+ && (gr_cgs_needs_min.contains_integer_point());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Empty.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(3);
+ gr.add_constraint(A == 1);
+ gr.add_constraint(A == 2);
+
+ bool ok = (!gr.contains_integer_point());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence(4*A %= 0);
+
+ Grid gr_copy = gr;
+
+ bool ok = (gr.contains_integer_point() && gr == gr_copy);
+
+ print_congruences(gr, "*** gr ***");
+ print_congruences(gr_copy, "*** gr_copy ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc
new file mode 100644
index 0000000..8cc08d1
--- /dev/null
+++ b/tests/Grid/discrete1.cc
@@ -0,0 +1,342 @@
+/* Test Grid::is_pointed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (gr.is_discrete());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.is_discrete());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.is_discrete());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_constraint(B == 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_discrete())
+ && (gr_gs_needs_min.is_discrete())
+ && (gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_constraint(B == 2);
+
+ Grid gr_cgs_min(3);
+ gr_cgs_min.add_constraint(A == 3);
+ gr_cgs_min.add_constraint(B == 2);
+ // Minimize the congruences.
+ gr_cgs_min.minimized_congruences();
+
+ // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+ // are the same grids.
+
+ bool ok = (!gr_gs_min.is_discrete())
+ && (!gr_gs_needs_min.is_discrete())
+ && (!gr_cgs_needs_min.is_discrete())
+ && (!gr_cgs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+ print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+ return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_constraint(C == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_discrete())
+ && (gr_gs_needs_min.is_discrete())
+ && (gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (!gr_gs_min.is_discrete())
+ && (!gr_gs_needs_min.is_discrete())
+ && (!gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Skew.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_discrete())
+ && (gr_gs_needs_min.is_discrete())
+ && (gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_line(C));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (!gr_gs_min.is_discrete())
+ && (!gr_gs_needs_min.is_discrete())
+ && (!gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Plane.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(4, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_constraint(A == 0);
+ gr_cgs_needs_min.add_constraint(D == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (!gr_gs_min.is_discrete())
+ && (!gr_gs_needs_min.is_discrete())
+ && (!gr_cgs_needs_min.is_discrete());
+
+ print_congruences(gr_gs_min, "*** gr_gs_min ***");
+ print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Empty.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(3);
+ gr.add_constraint(A == 1);
+ gr.add_constraint(A == 2);
+
+ bool ok = (gr.is_discrete());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/disjoint1.cc b/tests/Grid/disjoint1.cc
new file mode 100644
index 0000000..e279f89
--- /dev/null
+++ b/tests/Grid/disjoint1.cc
@@ -0,0 +1,255 @@
+/* Test Grid::is_disjoint_from().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Grid of points and empty grid.
+bool
+test01() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+
+ Grid gr1(gs);
+
+ Grid gr2(1, EMPTY);
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+
+ Grid gr2(gs);
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test03() {
+ Grid gr1(4, EMPTY);
+
+ Grid gr2(4, EMPTY);
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+ Grid gr1(0);
+
+ Grid gr2(0);
+
+ bool ok = (!gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Grid and itself.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence(A - B %= 0);
+ gr.add_congruence(C %= 0);
+
+ bool ok = (!gr.is_disjoint_from(gr));
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Two grids which alternate AB planes along C.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A - B %= 0);
+ gr1.add_congruence((C %= 0) / 2);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(C));
+ gr2.add_grid_generator(grid_line(A + B));
+ gr2.add_grid_generator(grid_point(C + B));
+ gr2.add_grid_generator(grid_point(3*C));
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// A sequence of points and a plane.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(A + B + C));
+ gr1.add_grid_generator(grid_point(3*A + 3*B + 3*C));
+
+ Grid gr2(3);
+ gr2.add_congruence(A - B %= 0);
+ gr2.add_constraint(C == 0);
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// A line and a plane.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(A + B + C));
+ gr1.add_grid_generator(grid_line(3*A + 3*B + 3*C));
+
+ Grid gr2(3);
+ gr2.add_congruence(A - B %= 0);
+ gr2.add_constraint(C == 0);
+
+ bool ok = (!gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// CHINA contains example that showed an error in cgs::is_included_in.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.minimized_grid_generators();
+
+ Grid gr2(1, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ gr2.minimized_grid_generators();
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr2, "*** gr2 ***");
+ print_congruences(gr1, "*** gr1.is_disjoint_from(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test10() {
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+
+ Grid gr2(19, EMPTY);
+
+ try {
+ gr1.is_disjoint_from(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Both empty and both not in minimal form.
+bool
+test11() {
+ Variable A(0);
+ Grid gr1(1);
+ gr1.add_congruence((A %= 1) / 2);
+ gr1.add_congruence((A %= 0) / 2);
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 1) / 2);
+ gr2.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr1.is_disjoint_from(gr2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/dropnonintegerpoints1.cc b/tests/Grid/dropnonintegerpoints1.cc
new file mode 100644
index 0000000..13fd988
--- /dev/null
+++ b/tests/Grid/dropnonintegerpoints1.cc
@@ -0,0 +1,323 @@
+/* Test Grid::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty grid.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(1);
+
+ Grid gr2(1, EMPTY);
+
+ gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+ Grid known_gr1(1);
+ known_gr1.add_congruence(A %= 0);
+ bool ok = (gr2.is_empty() && gr1 == known_gr1);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// 0-dimension grids.
+bool
+test02() {
+ Grid gr1(0);
+
+ Grid gr2(0, EMPTY);
+
+ gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+ bool ok = (gr2.is_empty() && gr1.is_universe());
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr1(1);
+ Grid gr2(1);
+ gr1.add_congruence(2*A %= 0);
+ gr2.add_congruence((A %= 1) / 2);
+ Grid known_gr1(1);
+ known_gr1.add_congruence(A %= 0);
+ Grid known_gr2(1);
+ known_gr2.add_congruence((A %= 1) / 2);
+
+ gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+ bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ Grid gr2(2);
+ gr1.add_congruence(2*A %= 0);
+ gr2.add_congruence((A %= 1) / 2);
+ Grid known_gr1(2);
+ Grid known_gr2(2);
+ known_gr1.add_congruence(A %= 0);
+ known_gr1.add_congruence(B %= 0);
+ known_gr2.add_congruence((A %= 1) / 2);
+ known_gr2.add_congruence(B %= 0);
+
+ gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+ bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 1) / 2);
+ gr.add_congruence((B %= 1) / 2);
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 1) / 2);
+ known_gr.add_congruence((B %= 1) / 2);
+ gr.drop_some_non_integer_points(ANY_COMPLEXITY);
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+ gr.add_grid_generator(parameter(10*A, 2));
+ gr.add_grid_generator(grid_line(2*B + C));
+ gr.add_grid_generator(parameter(5*C, 2));
+ gr.add_grid_generator(parameter(10*D, 2));
+ Grid known_gr(gr);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(B %= 0);
+ known_gr.add_congruence(C %= 0);
+ known_gr.add_congruence(D %= 0);
+
+ gr.drop_some_non_integer_points(ANY_COMPLEXITY);
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe and empty grid with variable set A.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr1(1);
+
+ Grid gr2(1, EMPTY);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ Grid known_gr1(1);
+ known_gr1.add_congruence(A %= 0);
+ bool ok = (gr2.is_empty() && gr1 == known_gr1);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// 0-dimension grids with empty variable set.
+
+bool
+test08() {
+ Grid gr1(0);
+
+ Grid gr2(0, EMPTY);
+
+ Variables_Set vars;
+
+ gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ bool ok = (gr2.is_empty() && gr1.is_universe());
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr1(1);
+ Grid gr2(1);
+ gr1.add_congruence(2*A %= 0);
+ gr2.add_congruence((A %= 1) / 2);
+ Grid known_gr1(1);
+ known_gr1.add_congruence(A %= 0);
+ Grid known_gr2(1);
+ known_gr2.add_congruence((A %= 1) / 2);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ Grid gr2(2);
+ gr1.add_congruence(2*A %= 0);
+ gr2.add_congruence((A %= 1) / 2);
+ Grid known_gr1(2);
+ Grid known_gr2(2);
+ known_gr1.add_congruence(A %= 0);
+ known_gr2.add_congruence((A %= 1) / 2);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((B %= 1) / 2);
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 1);
+ known_gr.add_congruence((B %= 1) / 2);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Relational test with variable set {A, C}.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+ gr.add_grid_generator(parameter(10*A, 2));
+ gr.add_grid_generator(grid_line(2*B + C));
+ gr.add_grid_generator(parameter(5*C, 2));
+ gr.add_grid_generator(parameter(10*D, 2));
+ Grid known_gr(gr);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(C %= 0);
+
+ Variables_Set vars;
+ vars.insert(A);
+ vars.insert(C);
+
+ gr.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/equals1.cc b/tests/Grid/equals1.cc
new file mode 100644
index 0000000..535b760
--- /dev/null
+++ b/tests/Grid/equals1.cc
@@ -0,0 +1,286 @@
+/* Test operator==(const Grid&, const Grid&)
+ and operator!=(const Grid&, const Grid&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grids the same, gr defined by generators and known_gr by congruences.
+bool
+test01() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(3*A));
+
+ Grid gr(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 0) / 3);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+ print_congruences(known_gr, "*** known_gr ***");
+
+ return ok;
+}
+
+// Grids the same, gr defined by congruences and known_gr by generators.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(A - B %= 0);
+ cgs.insert((C %= 0) / 7);
+
+ Grid gr(cgs);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_line(A + B));
+ gs.insert(grid_point(B));
+ gs.insert(grid_point(7*C));
+
+ Grid known_gr(gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+ print_congruences(known_gr, "*** known_gr ***");
+
+ return ok;
+}
+
+// Grids differ, gr defined by congruences and known_gr by generators.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(A - B %= 0);
+ cgs.insert((C %= 0) / 7);
+
+ Grid gr(cgs);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_line(A - B));
+ gs.insert(grid_point(B));
+ gs.insert(grid_point(7*C, 3));
+
+ Grid known_gr(gs);
+
+ bool ok = (gr != known_gr);
+
+ print_congruences(gr, "*** gr ***");
+ print_congruences(known_gr, "*** known_gr ***");
+
+ return ok;
+}
+
+// Grids differ by the affine dimension and are defined by points.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*A));
+ gs.insert(grid_point(1*A));
+
+ Grid gr(gs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*A + 0*B));
+ known_gs.insert(grid_point(1*A + 0*B));
+ known_gs.insert(grid_point(0*A + 1*B));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr != known_gr);
+
+ print_congruences(gr, "*** gr ***");
+ print_congruences(known_gr, "*** known_gr ***");
+
+ return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of equalities.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_constraint(A == 0);
+
+ gr1.minimized_congruences();
+
+ Grid gr2(3);
+ gr2.add_congruence(B %= 0);
+
+ gr2.minimized_congruences();
+
+ bool ok = (gr1 != gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of generators.
+bool
+test06() {
+ Variable A(0);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+
+ gr1.minimized_grid_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(grid_line(A));
+
+ gr2.minimized_grid_generators();
+
+ bool ok = (gr1 != gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(B));
+
+ gr1.minimized_grid_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(grid_line(A));
+
+ gr2.minimized_grid_generators();
+
+ bool ok = (gr1 != gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are different.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A));
+ gr1.add_grid_generator(parameter(B));
+ gr1.add_grid_generator(parameter(C));
+
+ gr1.minimized_grid_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(2*A));
+ gr2.add_grid_generator(parameter(2*B));
+ gr2.add_grid_generator(parameter(2*C));
+
+ gr2.minimized_grid_generators();
+
+ bool ok = (gr1 != gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are syntactically the same.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A));
+ gr1.add_grid_generator(parameter(B));
+ gr1.add_grid_generator(parameter(C));
+
+ gr1.minimized_grid_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(A));
+ gr2.add_grid_generator(parameter(B));
+ gr2.add_grid_generator(parameter(C));
+
+ gr2.minimized_grid_generators();
+
+ bool ok = (gr1 == gr2);
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/expandspacedim1.cc b/tests/Grid/expandspacedim1.cc
new file mode 100644
index 0000000..5272ee2
--- /dev/null
+++ b/tests/Grid/expandspacedim1.cc
@@ -0,0 +1,239 @@
+/* Test Grid::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+
+ gr.expand_space_dimension(A, 1);
+
+ Grid known_gr(4);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// Empty.
+bool
+test02() {
+ Variable B(1);
+
+ Grid gr(3, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ gr.expand_space_dimension(B, 1);
+
+ Grid known_gr(4, EMPTY);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(B, 1) ***");
+
+ return ok;
+}
+
+// Trivial expansion.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(A + B %= 2);
+
+ gr.expand_space_dimension(A, 0);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(A + B %= 2);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(A, 0) ***");
+
+ return ok;
+}
+
+// From generators, expanding one dimension.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(A + 2*B));
+ gr.add_grid_generator(grid_point());
+ print_generators(gr, "*** gr ***");
+
+ gr.expand_space_dimension(A, 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(A + 2*B));
+ known_gr.add_grid_generator(grid_point(C));
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// From congruences, expanding one dimension.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(2);
+ gr.add_congruence((A + B %= 2) / 7);
+ print_generators(gr, "*** ***");
+
+ gr.expand_space_dimension(A, 1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A + B %= 2) / 7);
+ known_gr.add_congruence(( B + C %= 2) / 7);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// From congruences, expanding two dimensions.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(2);
+ gr.add_congruence((A + 2*B %= 3) / 5);
+ print_generators(gr, "*** ***");
+
+ gr.expand_space_dimension(B, 2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence((A + 2*B %= 3) / 5);
+ known_gr.add_congruence((A + 2*C %= 3) / 5);
+ known_gr.add_congruence((A + 2*D %= 3) / 5);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(B, 2) ***");
+
+ return ok;
+}
+
+// From congruences, with an equality.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid gr(3);
+ gr.add_constraint(2*C == 1);
+ gr.add_congruence(A - B %= 0);
+
+ gr.expand_space_dimension(A, 1);
+ gr.expand_space_dimension(C, 1);
+
+ Grid known_gr(5);
+ known_gr.add_constraint(2*C == 1);
+ known_gr.add_constraint(2*E == 1);
+ known_gr.add_congruence(A - B %= 0);
+ known_gr.add_congruence( - B + D %= 0);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.expand_space_dimension(...) ***");
+
+ return ok;
+}
+
+// Variable of higher space dimension than grid.
+bool
+test08() {
+ Variable B(1);
+
+ Grid gr(1, EMPTY);
+
+ try {
+ gr.expand_space_dimension(B, 3);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Add more dimensions than are available.
+bool
+test09() {
+ Variable B(1);
+
+ Grid gr(10, EMPTY);
+
+ try {
+ gr.expand_space_dimension(B, Grid::max_space_dimension());
+ }
+ catch (const std::length_error& e) {
+ nout << "length_error: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/foldspacedims1.cc b/tests/Grid/foldspacedims1.cc
new file mode 100644
index 0000000..4564ef0
--- /dev/null
+++ b/tests/Grid/foldspacedims1.cc
@@ -0,0 +1,401 @@
+/* Test Grid::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ gr.fold_space_dimensions(to_fold, B);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(3, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ gr.fold_space_dimensions(to_fold, B);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+ return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B + C %= 2) / 3);
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ Variables_Set to_fold;
+
+ gr.fold_space_dimensions(to_fold, B);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+ return ok;
+}
+
+// Simple fold from congruences.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 1);
+ gr.add_congruence((B %= 1) / 3);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ gr.fold_space_dimensions(to_fold, B);
+
+ Grid known_gr(1);
+ known_gr.add_congruence(A %= 1);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+ return ok;
+}
+
+// Simple fold from generators.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(A + 2*B + 2*C));
+ gr.add_grid_generator(grid_point(A + 2*B + 4*C));
+ gr.add_grid_generator(grid_point(A + 6*B + 2*C));
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(C);
+
+ gr.fold_space_dimensions(to_fold, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(A + 2*B));
+ known_gr.add_grid_generator(grid_point(A + 4*B));
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+ return ok;
+}
+
+// Folding several dimensions into a higher dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 2) / 3);
+ gr.add_congruence((B %= 8) / 9);
+ gr.add_congruence((C == 17) / 0);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ gr.fold_space_dimensions(to_fold, C);
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A %= 2) / 3);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+ return ok;
+}
+
+// Folding dimensions into a lower dimension.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+ gr.add_congruence((A - B %= 3) / 4);
+ gr.add_congruence((C %= 5) / 9);
+ gr.add_congruence((D %= 2) / 6);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ gr.fold_space_dimensions(to_fold, A);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+ return ok;
+}
+
+// Folding dimensions into an intermediate dimension.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((B %= 0) / 9);
+ gr.add_congruence((C %= 0) / 6);
+ gr.add_congruence((D %= 0) / 12);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ gr.fold_space_dimensions(to_fold, C);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((B %= 0) / 3);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+ return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+ gr.add_congruence((A - B %= 0) / 9);
+ gr.add_congruence((C %= 0) / 6);
+ gr.add_congruence((D %= 0) / 12);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ gr.fold_space_dimensions(to_fold, C);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+ return ok;
+}
+
+// One dimension.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence((A %= 3) / 7);
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ Variables_Set to_fold;
+
+ gr.fold_space_dimensions(to_fold, A);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+ return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension, where the resulting grid is smaller than the universe.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_congruence(A %= 0);
+ gr.add_constraint(C == 0);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ gr.fold_space_dimensions(to_fold, C);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(B %= 0);
+
+ bool ok = (gr == known_gr);
+ print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+ return ok;
+}
+
+// Second parameter of greater dimension than grid.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1, EMPTY);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ try {
+ gr.fold_space_dimensions(vars, B);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Highest variable in set of greater dimension than grid.
+bool
+test13() {
+ Variable B(1);
+
+ Grid gr(3, EMPTY);
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ try {
+ gr.fold_space_dimensions(vars, B);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Dimension of highest variable in set greater than dimension of
+// grid.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1, EMPTY);
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ try {
+ gr.fold_space_dimensions(vars, A);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/frequency1.cc b/tests/Grid/frequency1.cc
new file mode 100644
index 0000000..a377192
--- /dev/null
+++ b/tests/Grid/frequency1.cc
@@ -0,0 +1,349 @@
+/* Test Grid::frequency().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty grid.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(1);
+
+ Grid gr2(1, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (!gr1.frequency(A, num1, den1, valn1, vald1)
+ && !gr2.frequency(A, num2, den2, valn2, vald2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// 0-dimension grids.
+bool
+test02() {
+ Grid gr1(0);
+
+ Grid gr2(0, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (gr1.frequency(Linear_Expression(0), num1, den1, valn1, vald1)
+ && num1 == 0 && den1 == 1 && valn1 == 0 && vald1 == 1
+ && !gr2.frequency(Linear_Expression(0), num2, den2, valn2, vald2));
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence(A %= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 1 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!gr.frequency(Linear_Expression(B), num, den, valn, vald));
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+ && num == 1 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 1) / 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(2*A + B), num, den, valn, vald)
+ && num == 2 && den == 1 && valn == 1 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 1) / 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(2*A + 3*B), num, den, valn, vald)
+ && num == 2 && den == 1 && valn == 1 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(3*A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(2*A + 3*B - 1),
+ num, den, valn, vald)
+ && num == 2 && den == 3 && valn == -1 && vald == 3);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 1) / 2);
+ gr.add_congruence((B %= 1) / 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(3*A + 2*B + 5),
+ num, den, valn, vald)
+ && num == 2 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4, EMPTY);
+ gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+ gr.add_grid_generator(parameter(10*A, 2));
+ gr.add_grid_generator(grid_line(2*B + C));
+ gr.add_grid_generator(parameter(5*C, 2));
+ gr.add_grid_generator(parameter(10*D, 2));
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(3*A - B + 2*C - 17),
+ num, den, valn, vald)
+ && num == 5 && den == 1 && valn == -1 && vald == 1);
+
+ Grid known_gr(gr);
+ known_gr.add_congruence((3*A - B + 2*C - 17 %= -1) / 5);
+ print_congruences(gr, "*** gr ***");
+
+ return ok && (gr == known_gr);
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point((2*A - B), 4));
+ gr.add_grid_generator(parameter(B));
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(A),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 1 && vald == 2);
+
+ Grid known_gr(gr);
+ known_gr.add_congruence((2*A %= 1) / 0);
+ print_congruences(gr, "*** gr ***");
+
+ return ok && (gr == known_gr);
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ gr.add_congruence(B %= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(B == 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 1);
+ gr.add_congruence((2*A - B %= 0) / 2);
+ print_congruences(gr, "*** gr ***");
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (gr.frequency(Linear_Expression(B), num, den, valn, vald)
+ && num == 2 && den == 1 && valn == 0 && vald == 1);
+ print_congruences(gr, "*** gr ***");
+ nout << num << den;
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/frombdshape1.cc b/tests/Grid/frombdshape1.cc
new file mode 100644
index 0000000..72051cd
--- /dev/null
+++ b/tests/Grid/frombdshape1.cc
@@ -0,0 +1,77 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - B == 5);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ TBD_Shape bd(cs);
+
+ Grid gr(bd);
+
+ Grid known_result(2);
+
+ known_result.refine_with_constraints(cs);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A >= 5);
+ cs.insert(A <= -7);
+ TBD_Shape bd(cs);
+
+ Grid gr(bd);
+
+ Grid known_result(1, EMPTY);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/frombox1.cc b/tests/Grid/frombox1.cc
new file mode 100644
index 0000000..8f280ad
--- /dev/null
+++ b/tests/Grid/frombox1.cc
@@ -0,0 +1,77 @@
+/* Test Grid::Grid(const Box&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 5);
+ cs.insert(B <= 7);
+ TBox box(cs);
+
+ Grid gr(box);
+
+ Grid known_result(2);
+
+ known_result.refine_with_constraints(cs);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A >= 5);
+ cs.insert(A <= 5);
+ TBox box(cs);
+
+ Grid gr(box);
+
+ Grid known_result(1);
+ known_result.refine_with_constraint(A == 5);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/fromgrid1.cc b/tests/Grid/fromgrid1.cc
new file mode 100644
index 0000000..21272fc
--- /dev/null
+++ b/tests/Grid/fromgrid1.cc
@@ -0,0 +1,102 @@
+/* Test copy construction and assignment for grids.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Assignment for universe and empty grids of the first ten dimensions.
+
+bool
+test01() {
+ bool ok = true;
+ for (unsigned int dim = 0; dim < 10; ++dim) {
+
+ nout << "dimension: " << dim << endl;
+ // Universe.
+ Grid gr(dim);
+ print_congruences(gr, "*** gr ***");
+
+ Grid gr_copy(0);
+ gr_copy = gr;
+
+ Grid known_gr(dim);
+ ok &= (gr_copy == known_gr);
+ print_congruences(gr_copy, "*** gr_copy ***");
+
+ if (ok) {
+ // Empty.
+ gr = Grid(dim, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Grid gr_copy(0);
+ gr_copy = gr;
+
+ Grid known_gr(dim, EMPTY);
+ ok &= (gr_copy == known_gr);
+ print_generators(gr_copy, "*** gr_copy ***");
+ }
+ };
+
+ return ok;
+}
+
+// Copy construct for universe and empty grids of the first ten dimensions.
+bool
+test02() {
+ bool ok = true;
+ for (unsigned int dim = 0; dim < 10; ++dim) {
+
+ nout << "dimension: " << dim << endl;
+ // Universe.
+ Grid gr(dim);
+ print_congruences(gr, "*** gr ***");
+
+ Grid gr_copy(gr);
+
+ Grid known_gr(dim);
+ ok &= (gr_copy == known_gr);
+ print_congruences(gr_copy, "*** gr_copy ***");
+
+ if (ok) {
+ // Empty.
+ gr = Grid(dim, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Grid gr_copy(gr);
+
+ Grid known_gr(dim, EMPTY);
+ ok &= (gr_copy == known_gr);
+ print_generators(gr_copy, "*** gr_copy ***");
+ }
+ };
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/fromoctagonalshape1.cc b/tests/Grid/fromoctagonalshape1.cc
new file mode 100644
index 0000000..091ebda
--- /dev/null
+++ b/tests/Grid/fromoctagonalshape1.cc
@@ -0,0 +1,77 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - B == 5);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ TOctagonal_Shape os(cs);
+
+ Grid gr(os);
+
+ Grid known_result(2);
+
+ known_result.refine_with_constraints(cs);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A >= 5);
+ cs.insert(A <= -7);
+ TOctagonal_Shape bd(cs);
+
+ Grid gr(bd);
+
+ Grid known_result(1, EMPTY);
+
+ bool ok = gr == known_result;
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/frompolyhedron1.cc b/tests/Grid/frompolyhedron1.cc
new file mode 100644
index 0000000..e74d03a
--- /dev/null
+++ b/tests/Grid/frompolyhedron1.cc
@@ -0,0 +1,343 @@
+/* Test construction of grids from polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(ph) - non-empty polyhedron
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ NNC_Polyhedron ph(cs);
+ Grid gr(ph);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+// Grid(ph) - empty polyhedron
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+ cs.insert(A >= 0);
+ cs.insert(B >= 1);
+ cs.insert(C > 0);
+
+ NNC_Polyhedron ph(cs);
+ Grid gr(ph);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+// Grid(ph) - zero dimension universe polyhedron
+bool
+test03() {
+
+ NNC_Polyhedron ph(0);
+ Grid gr(ph);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+// Grid(ph) - zero dimension empty polyhedron
+bool
+test04() {
+
+ NNC_Polyhedron ph(0, EMPTY);
+ Grid gr(ph);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+// Grid(ph) - non-empty polyhedron constructed from generators
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System cs;
+ cs.insert(point(A + B, 3));
+ cs.insert(ray(A - C));
+ cs.insert(point());
+
+ C_Polyhedron ph(cs);
+ Grid gr(ph);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(A - B + C == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+ print_generators(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+ C_polyhedron constructed from generators */
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System cs;
+ cs.insert(point(A + B, 3));
+ cs.insert(line(A - C));
+ cs.insert(point(3 * C, 2));
+
+ C_Polyhedron ph(cs);
+
+ Grid gr(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ Grid known_gr(3);
+ known_gr.add_constraint(2*A + 7*B + 2*C == 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+ print_generators(gr, "*** gr(ph) ***");
+
+ print_congruences(known_gr, "*** known_gr(ph) ***");
+ print_generators(known_gr, "*** known_gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - universe grid built from
+ non-universe C_polyhedron constructed from generators */
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System cs;
+ cs.insert(point(A + B, 3));
+ cs.insert(point(3 * A, 2));
+ cs.insert(point(B, 7));
+ cs.insert(point(5 * C));
+
+ C_Polyhedron ph(cs);
+
+ Grid gr(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+ print_generators(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+// Grid(ph) - universe polyhedron
+bool
+test08() {
+
+ NNC_Polyhedron ph(5);
+ Grid gr(ph);
+
+ Grid known_gr(5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+ C_polyhedron constructed from generators; The complexity
+ limit allows the detection of implicit equalities from
+ any generator system*/
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System cs;
+ cs.insert(point(A + B));
+ cs.insert(line(A - C));
+ cs.insert(point(3 * C));
+
+ C_Polyhedron ph(cs);
+
+ Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Grid known_gr(3);
+ known_gr.add_constraint(A + 2*B + C == 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+ print_generators(gr, "*** gr(ph) ***");
+
+ print_congruences(known_gr, "*** known_gr(ph) ***");
+ print_generators(known_gr, "*** known_gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+ C_polyhedron constructed from constraints; The complexity
+ is unlimited so it is able to detect the implicit equality */
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B >= 0);
+ cs.insert(B <= 0);
+ cs.insert(A >= 0);
+
+ C_Polyhedron ph(cs);
+ Grid gr(ph, ANY_COMPLEXITY);
+
+ Grid known_gr(2);
+ known_gr.add_constraint(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+ C_polyhedron constructed from constraints; The complexity
+ is limited to be polynomial so it is unable to detect the
+ implicit equality */
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B >= 0);
+ cs.insert(B <= 0);
+ cs.insert(A >= 0);
+
+ C_Polyhedron ph(cs);
+ Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+ C_polyhedron constructed from constraints; The complexity
+ is limited to that of simplex so it is unable to detect the
+ implicit equality */
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B >= 0);
+ cs.insert(B <= 0);
+ cs.insert(A >= 0);
+
+ C_Polyhedron ph(cs);
+ Grid gr(ph, SIMPLEX_COMPLEXITY);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ph) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST_F8(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage1.cc b/tests/Grid/generalizedaffineimage1.cc
new file mode 100644
index 0000000..18105ed
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage1.cc
@@ -0,0 +1,556 @@
+/* Test Grid::generalized_affine_image(var, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0) ***");
+
+ return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1) ***");
+
+ return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A - B));
+ known_gr.add_grid_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(B, 2));
+ known_gr.add_grid_generator(grid_point(B + A));
+ known_gr.add_grid_generator(grid_point(3*B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(B, 2));
+ known_gr.add_grid_generator(grid_point(A + B));
+ known_gr.add_grid_generator(grid_point(7*B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3) ***");
+
+ return ok;
+}
+
+// Negative denominator.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A - B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-B));
+ known_gr.add_grid_generator(grid_point(-3*B + 2*A, 2));
+ known_gr.add_grid_generator(grid_point(-2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1) ***");
+
+ return ok;
+}
+
+// Negative modulus.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A - B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*B));
+ known_gr.add_grid_generator(grid_point(A + 3*B));
+ known_gr.add_grid_generator(grid_point(9*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7) ***");
+
+ return ok;
+}
+
+// Expression of many variables.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*A));
+ known_gr.add_grid_generator(grid_point(2*A + 3*B));
+ known_gr.add_grid_generator(grid_line(A + C));
+ known_gr.add_grid_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_grid_generator(grid_point(7*A)); // Transformation modulus.
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5) ***");
+
+ return ok;
+}
+
+// Equality expression comparing
+// generalized_affine_image and affine_image
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0);
+
+ Grid known_gr = Grid(3);
+ known_gr.add_congruence((B %= 0) / 3);
+ known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+ known_gr.affine_image(A, A - C + 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(5, EMPTY);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(B, EQUAL, A + 2, 0, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(B, EQUAL, D + 2, 1, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(D, EQUAL, A + 2, 1, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expressions having common variables.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_constraint(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables, where generalized_affine_image
+// must minimize the grid.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5) ***");
+
+ return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence(C %= -2);
+
+ try {
+ gr.generalized_affine_image(B + C, EQUAL, D + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_image(A + D, EQUAL, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage2.cc b/tests/Grid/generalizedaffineimage2.cc
new file mode 100644
index 0000000..cfc93e6
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage2.cc
@@ -0,0 +1,544 @@
+/* Test Grid::generalized_affine_image(lhs, rhs, modulus).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests 1 to 13 are equivalent to tests 1 to 13 in
+// generalizedaffineimage1.cc.
+
+// Simplest expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*B, EQUAL, Linear_Expression::zero(), 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0) ***");
+
+ return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(B %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*B, EQUAL, Linear_Expression::zero(), 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(2*B, Linear_Expression::zero()) ***");
+
+ return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*B, EQUAL, A + 1, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A - B));
+ known_gr.add_grid_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 1) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*B, EQUAL, A + 1, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(B, 2));
+ known_gr.add_grid_generator(grid_point(A + B));
+ known_gr.add_grid_generator(grid_point(2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(B, 2));
+ known_gr.add_grid_generator(grid_point(A + B));
+ known_gr.add_grid_generator(grid_point(2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+ return ok;
+}
+
+// Negative denominator.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A - B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(-2*B, EQUAL, A + 2, 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-B, 2));
+ known_gr.add_grid_generator(grid_point(2*A + -3*B, 2));
+ known_gr.add_grid_generator(grid_point(-B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(-2*B, A + 2) ***");
+
+ return ok;
+}
+
+// Negative modulus.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((A - B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*B, EQUAL, A + 2, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*B));
+ known_gr.add_grid_generator(grid_point(A + 3*B));
+ known_gr.add_grid_generator(grid_point(9*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 2, -7) ***");
+
+ return ok;
+}
+
+// Expression of many variables.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*A));
+ known_gr.add_grid_generator(grid_point(2*A + 3*B));
+ known_gr.add_grid_generator(grid_line(A + C));
+ known_gr.add_grid_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_grid_generator(grid_point(7*A)); // Transformation modulus.
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(1*A, A - C + 2, 5) ***");
+
+ return ok;
+}
+
+// Equality expression.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 0);
+
+ Grid known_gr = Grid(3);
+ known_gr.add_congruence((B %= 0) / 3);
+ known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+ known_gr.affine_image(A, A - C + 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(1*A, A - C + 2, 0) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(5, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(4*A, EQUAL, A - 2*C + 3, 7);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test13() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+ return ok;
+}
+
+// Expressions both constants.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(Linear_Expression::zero(), EQUAL,
+ Linear_Expression(1), 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
+
+ return ok;
+}
+
+// Left hand side constant.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A + B));
+ known_gr.add_grid_generator(grid_point(5*A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
+
+ return ok;
+}
+
+// Expressions with unique variables.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, EQUAL, C, 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A + B));
+ known_gr.add_grid_generator(grid_point(B));
+ known_gr.add_grid_generator(grid_point(3*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, EQUAL, C, 1) ***");
+
+ return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, EQUAL, A);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, EQUAL, A) ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 1);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(B, 2));
+ known_gr.add_grid_generator(grid_line(2*A - B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3) ***");
+
+ return ok;
+}
+
+// The equivalent of test1 from Polyhedron/generalizedaffineimage10.cc
+// (expressions with unique variables).
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(C == 0);
+ gr.add_constraint(A + 3*B == 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - C, EQUAL, B + 3, 0);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(A - C == B + 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - C, EQUAL, B + 3, 0) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage3.cc b/tests/Grid/generalizedaffineimage3.cc
new file mode 100644
index 0000000..1d014ff
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage3.cc
@@ -0,0 +1,377 @@
+/* Test Grid::generalized_affine_image(var, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero()) ***");
+
+ return ok;
+}
+
+
+// Empty grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(5, EMPTY);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(B, GREATER_OR_EQUAL, D + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(D, GREATER_OR_EQUAL, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_image(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expressions having common variables.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_constraint(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+ return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_constraint(C == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(C == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+ return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence(C %= -2);
+
+ try {
+ gr.generalized_affine_image(B + C, GREATER_THAN, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_image(A + D, GREATER_THAN, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Universe.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, GREATER_THAN, A + 2, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_image(A + D, GREATER_THAN, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Empty with congruences.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A + B, LESS_THAN, A + 2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, LESS_THAN, A + 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage1.cc b/tests/Grid/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..f40e168
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage1.cc
@@ -0,0 +1,540 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence(B %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2 = gr1;
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0 ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2) ***");
+
+ return ok;
+}
+
+// Simple expression, including positive modulus.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2 = gr1;
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3) ***");
+
+ return ok;
+}
+
+// Simple expression, including negative modulus.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2 = gr1;
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-A));
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_grid_generator(grid_point());
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7) ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2 = gr1;
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-3*A));
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_grid_generator(grid_point(-A));
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3) ***");
+
+ return ok;
+}
+
+// Negative denominator.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A - B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2 = gr1;
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-2*A));
+ known_gr.add_grid_generator(grid_point(2*A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_grid_generator(grid_point());
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1) ***");
+
+ return ok;
+}
+
+// Expression of many variables.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(2*A));
+ known_gr.add_grid_generator(grid_point(2*A + 3*B));
+ known_gr.add_grid_generator(grid_line(3*A + C));
+ known_gr.add_grid_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_grid_generator(grid_point(7*A)); // Transformation modulus.
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5) ***");
+
+ return ok;
+}
+
+// Equality expression.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 3);
+ gr.add_congruence((A - 2*C %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0);
+
+ Grid known_gr = Grid(3);
+ known_gr.add_congruence((B %= 0) / 3);
+ known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+ known_gr.affine_preimage(A, A - C + 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(5, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(B, EQUAL, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(B, EQUAL, D + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(D, EQUAL, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression with a 0 modulus, where the variable occurs in
+// the expression.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ // Equality expression.
+ gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(parameter(2*B));
+ known_gr.add_grid_generator(parameter(A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0) ***");
+
+ return ok;
+}
+
+// Expression with a negative modulus, where the variable occurs in
+// the expression.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(parameter(2*B));
+ known_gr.add_grid_generator(parameter(A + B));
+ known_gr.add_grid_generator(parameter(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7) ***");
+
+ return ok;
+}
+
+// Test similar to test01 in
+// tests/Polyhedron/generalizedaffinepreimage2.cc
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A + B));
+ gr.add_grid_generator(grid_point(2*A));
+ gr.add_grid_generator(grid_point(2*A + 2*B));
+ gr.add_grid_generator(grid_point(3*A + B));
+
+ Grid known_gr(gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(B, EQUAL, B+2, 1, 5);
+
+ // A longer way of computing the generalized affine preimage below.
+ known_gr.add_space_dimensions_and_embed(1);
+ known_gr.add_congruence((B %= C+2) / 5);
+ Variables_Set vset;
+ vset.insert(B);
+ known_gr.remove_space_dimensions(vset);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3) ***");
+
+ return ok;
+}
+
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage2.cc b/tests/Grid/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..d6f06c1
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage2.cc
@@ -0,0 +1,321 @@
+/* Test Grid::generalized_affine_preimage(lhs, rhs, modulus).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Expressions both constants.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL,
+ Linear_Expression(1), 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
+
+ return ok;
+}
+
+// Left hand side constant.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A %= 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A + B));
+ known_gr.add_grid_generator(grid_point(5*A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
+
+ return ok;
+}
+
+// Expressions with unique variables.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, EQUAL, C, 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+ known_gr.add_grid_generator(grid_line(B));
+ known_gr.add_grid_generator(grid_point(3*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, EQUAL, A, 0);
+
+ Grid known_gr(2);
+ known_gr.add_constraint(A == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B, EQUAL, A, 0) ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 1);
+ gr.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_constraint(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 5);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5) ***");
+
+ return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence(C %= -2);
+
+ try {
+ gr.generalized_affine_preimage(B + C, EQUAL, D + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_preimage(A + D, EQUAL, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expressions having common variables, with a negative modulus.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_constraint(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, EQUAL, C, -5);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((C %= 0) / 15);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B, EQUAL, C, -5) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage3.cc b/tests/Grid/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..84722b5
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage3.cc
@@ -0,0 +1,462 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence(B %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero() ***");
+
+ return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ // Equality expression.
+ gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(-3*A));
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(5, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test04() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, LESS_THAN A + 2, 1) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test05() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1) ***");
+
+ return ok;
+}
+
+// Zero denominator.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, D + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(D, GREATER_OR_EQUAL, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+ gr.add_congruence((A == 0) / 0);
+
+ try {
+ gr.generalized_affine_preimage(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// The variable occurs in the expression.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence((B %= 0) / 2);
+ gr.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ // Equality expression.
+ gr.generalized_affine_preimage(B, GREATER_THAN, A + B);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(2*B));
+ known_gr.add_grid_generator(parameter(A));
+ known_gr.add_grid_generator(parameter(3*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(B, GREATER_THAN, A + B) ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_constraint(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+ return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_constraint(C == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(C == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+ return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence(C %= -2);
+
+ try {
+ gr.generalized_affine_preimage(B + C, GREATER_THAN, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Universe.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, GREATER_THAN, A + 2, 1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+ return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(3);
+ gr.add_congruence((C == -2) / 0);
+
+ try {
+ gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2, 1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Empty with congruences.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ gr.add_constraint(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A + B, LESS_THAN, A + 2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2) ***");
+
+ return ok;
+}
+
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/generator1.cc b/tests/Grid/generator1.cc
new file mode 100644
index 0000000..784e0cc
--- /dev/null
+++ b/tests/Grid/generator1.cc
@@ -0,0 +1,483 @@
+/* Test class Grid_Generator.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Point.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(A + 2*B + 3*C));
+
+ Grid_Generator b(grid_point(3*C + A + 2*B));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Point with divisor.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+ Grid_Generator b(grid_point(15*C + 5*A + 10*B, 25));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Line.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_line(A + 2*B + 3*C));
+
+ Grid_Generator b(grid_line(15*C + 5*A + 10*B));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Parameter.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(parameter(A + 2*B + 3*C));
+
+ Grid_Generator b(parameter(2*B + 2*A - A + 3*C));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Parameter with divisor.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(parameter(A + 2*B + 3*C, 4));
+
+ Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Negative first coefficient.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+ Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Construction from Generator.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+ Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Construction from reference to Generator.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator g = grid_point(- A + 2*B + 3*C, 4);
+ Grid_Generator& g_ref = g;
+
+ Grid_Generator a(g_ref);
+
+ Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Create from empty linear expression.
+bool
+test09() {
+ Linear_Expression le;
+ Grid_Generator a(grid_point(le));
+
+ Grid_Generator b(grid_point(le));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Parameter with negative divisor.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(parameter(-A - 2*B - 3*C, -4));
+
+ Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Point with negative divisor.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+ Grid_Generator b(grid_point(-15*C - 5*A - 10*B, -25));
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Parameter with zero divisor.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ try {
+ Grid_Generator a(parameter(-A - 2*B - 3*C, 0));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Point with zero divisor.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ try {
+ Grid_Generator a(grid_point(A + 2*B + 3*C, 0));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Line.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ try {
+ Grid_Generator a(grid_line(0*A + 0*B + 0*C));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// is_equivalent_to() and is_equal_to(): generators have different types
+bool
+test15() {
+ Variable A(0);
+
+ Grid_Generator a(grid_point(A));
+ Grid_Generator b(grid_point(A, 2));
+ Grid_Generator c(parameter(A));
+ Grid_Generator d(grid_line(A));
+ Grid_Generator e(grid_point(2*A, 4));
+ Grid_Generator f(parameter(2*A, 2));
+
+ bool ok = (!c.is_equivalent_to(d));
+ ok &= (!a.is_equivalent_to(b));
+ ok &= (!c.is_equal_to(d));
+ ok &= (!a.is_equal_to(b));
+ ok &= (b.is_equal_to(e));
+ ok &= (!c.is_equal_to(f));
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+ print_generator(c, "*** c ***");
+ print_generator(d, "*** d ***");
+ print_generator(e, "*** e ***");
+ print_generator(f, "*** f ***");
+
+ return ok;
+}
+
+// is_equivalent_to(): generators have different space dimensions
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator a(grid_point(A));
+ Grid_Generator b(grid_point(B));
+ Grid_Generator c(parameter(A));
+ Grid_Generator d(parameter(B));
+ Grid_Generator e(grid_line(B));
+ Grid_Generator f(grid_line(A));
+
+ bool ok = (!a.is_equivalent_to(b));
+ ok &= (!c.is_equivalent_to(d));
+ ok &= (!e.is_equivalent_to(f));
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+ print_generator(c, "*** c ***");
+ print_generator(d, "*** d ***");
+ print_generator(e, "*** e ***");
+ print_generator(f, "*** f ***");
+
+ return ok;
+}
+
+// Getting coefficients of dimensions and rebuilding a generator from
+// them. This is based on Example 6 in Grid_Generator_defs.hh
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(grid_point(2*A - B + 3*C, 2));
+ print_generator(a, "*** a ***");
+
+ Linear_Expression e;
+
+ for (dimension_type i = a.space_dimension(); i-- > 0; )
+ e += (i + 1) * a.coefficient(Variable(i)) * Variable(i);
+ Grid_Generator b = parameter(e, 2);
+
+ Grid_Generator c(parameter(2*A - 2*B + 9*C, a.divisor()));
+
+ bool ok = (b.is_equivalent_to(c));
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Copy construction of a grid generator.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator a(parameter(A - 2*B + 3*C, -2));
+
+ Grid_Generator b(a);
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Method zero_dim_point.
+bool
+test19() {
+ Grid_Generator a(Grid_Generator::zero_dim_point());
+
+ Grid_Generator b(grid_point());
+
+ bool ok = (a == b);
+
+ print_generator(a, "*** a ***");
+ print_generator(b, "*** b ***");
+
+ return ok;
+}
+
+// Method `type'.
+bool
+test20() {
+ Variable C(2);
+
+ Grid_Generator::Type a = grid_point(2*C).type();
+
+ Grid_Generator::Type b = grid_point(3*C).type();
+
+ bool ok = (a == b);
+
+ nout << "*** a ***" << a << std::endl;
+ nout << "*** b ***" << b << std::endl;
+
+ return ok;
+}
+
+// Exception when trying to get the divisor of a line.
+bool
+test21() {
+ Variable C(2);
+
+ Grid_Generator a = grid_line(2*C);
+
+ print_generator(a, "*** a ***");
+
+ try {
+ a.divisor();
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test22() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ bool ok = (grid_point(A - B - 2*C) == grid_point(A - B - 2*C));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+END_MAIN
diff --git a/tests/Grid/generators1.cc b/tests/Grid/generators1.cc
new file mode 100644
index 0000000..07f8eab
--- /dev/null
+++ b/tests/Grid/generators1.cc
@@ -0,0 +1,471 @@
+/* Test Grid::generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(7, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+ Grid gr1(7);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+ Grid gr1(0, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+ Grid gr1(0);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B));
+ gr1.add_grid_generator(grid_point(5*A + 2*B));
+ gr1.add_grid_generator(grid_point(7*B));
+ gr1.add_grid_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 10);
+ gr1.add_congruence((B %= 10) / 0);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+ Grid gr1(3, EMPTY);
+
+ const Grid_Generator_System& gs = gr1.grid_generators();
+
+ // Add a point. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_grid_generator(grid_point());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+ Grid gr1(0);
+
+ const Grid_Generator_System& gs = gr1.grid_generators();
+
+ // Empty the grid. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr1(7);
+ gr1.add_constraint(A == 1);
+ gr1.add_constraint(A == 0);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Skew grid in 3D defined with generators with a non-integral parameter.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B, 2));
+ gr1.add_grid_generator(grid_point(5*A + 2*B));
+ gr1.add_grid_generator(parameter(11*B, 2));
+ gr1.add_grid_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Grid defined with an integral point but non-integral parameter.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B));
+ gr1.add_grid_generator(grid_point(5*A + 2*B));
+ gr1.add_grid_generator(parameter(11*B, 2));
+ gr1.add_grid_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// Grid defined with an integral point and parameter.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B));
+ gr1.add_grid_generator(grid_point(5*A + 2*B));
+ gr1.add_grid_generator(parameter(11*B));
+ gr1.add_grid_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+// inserted generator system has more space dimensions that
+// the old generator system.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(3*A, 2));
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(5*A + 2*B, 3));
+ gs1.insert(parameter(11*C, 2));
+
+ gs.insert(gs1, Recycle_Input());
+
+ Grid gr(gs);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(3*A, 2));
+ known_gr.add_grid_generator(grid_point(5*A + 2*B, 3));
+ known_gr.add_grid_generator(parameter(11*C, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr ***");
+
+ return ok;
+}
+
+// test clear() for nonempty generator system.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(3*A, 2));
+ gs.insert(grid_point(5*A + 2*B, 3));
+ gs.insert(parameter(11*C, 2));
+
+ print_generators(gs, "*** gs ***");
+
+ gs.clear();
+
+ Grid gr(gs);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr ***");
+ nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+ return ok;
+}
+
+// test clear() for empty generator system.
+// This test showed a bug in the code for clear() in
+// Grid_Generator_System_inlines.hh which is now corrected.
+bool
+test15() {
+ Grid_Generator_System gs;
+
+ print_generators(gs, "*** gs ***");
+
+ gs.clear();
+
+ Grid gr(gs);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr ***");
+ nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+ return ok;
+}
+
+// space_dimension
+bool
+test16() {
+ Variable A(3);
+ Variable B(7);
+ Variable C(4);
+
+ Grid_Generator_System ggs(grid_point(A - 3*B + 21*C, 21));
+
+ bool ok = (ggs.space_dimension() == 8);
+
+ print_generators(ggs, "*** ggs ***");
+
+ return ok;
+}
+
+// Recycling_insert
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System ggs1;
+ ggs1.insert(parameter(11*B));
+ ggs1.insert(grid_line(C));
+ ggs1.insert(grid_point(3*B));
+
+ Grid_Generator_System ggs;
+ ggs.insert(ggs1, Recycle_Input());
+ print_generators(ggs, "*** ggs ***");
+
+ Grid gr(ggs);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(3*B));
+ known_gr.add_grid_generator(parameter(11*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(ggs} ***");
+
+ return ok;
+}
+
+// Comparing Systems with different space dimensions
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable E(4);
+
+ Grid_Generator_System ggs;
+ ggs.insert(grid_point(3*B));
+ ggs.insert(grid_line(E));
+ print_generators(ggs, "*** ggs ***");
+
+ Grid gr(ggs);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(3*B));
+ known_gr.add_grid_generator(parameter(11*B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ bool ok = (gr != known_gr);
+
+ print_generators(gr, "*** gr(ggs} ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST_F8(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Grid/generators2.cc b/tests/Grid/generators2.cc
new file mode 100644
index 0000000..8a6e8a7
--- /dev/null
+++ b/tests/Grid/generators2.cc
@@ -0,0 +1,56 @@
+/* Test class Grid_Generator_System.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// recycling_insert(g) where the dimension of g is greater than the
+// generator system.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs(1);
+
+ Grid_Generator g = grid_point(A + B);
+
+ gs.insert(g, Recycle_Input());
+
+ print_generators(gs, "*** gs ***");
+
+ Grid_Generator_System known_gs(grid_point(A + B));
+
+ bool ok = (gs == known_gs);
+
+ print_generators(known_gs, "*** known_gs ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/grid1.cc b/tests/Grid/grid1.cc
new file mode 100644
index 0000000..3f6f6f8
--- /dev/null
+++ b/tests/Grid/grid1.cc
@@ -0,0 +1,839 @@
+/* Test reduction and conversion of grids created from generators.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_grid_generator, one variable.
+bool
+test01() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generator(grid_point(2*A));
+
+ Congruence_System known_cgs;
+ known_cgs.insert(A %= 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_grid_generator(grid_point(2*A)) ***");
+
+ return ok;
+}
+
+// add_grid_generator, two variables.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + B));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ Grid_Generator g(grid_point(A + 2*B));
+ gr.add_grid_generator(g);
+
+ Congruence_System known_cgs;
+ known_cgs.insert( 0*A + 0*B %= -1);
+ known_cgs.insert(( A + 0*B %= 1) / 0);
+ known_cgs.insert( 0*A + 1*B %= 1);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generator(g) ***");
+
+ return ok;
+}
+
+// add_grid_generators
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_line(0*A + B));
+ gs.insert(grid_point(3*A + 4*B));
+ gs.insert(grid_point(9*A + 0*B));
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_line(0*A + B));
+ known_gs.insert(grid_point(3*A + 4*B));
+ known_gs.insert(grid_point(9*A + 0*B));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(4*A - B + 0*C, 3));
+ gs.insert(grid_line(2*A + 3*B + 0*C));
+ gs.insert(grid_point(4*A + 0*B + 0*C, 3));
+ gs.insert(grid_point(4*A - B + C, 3));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= -2) / 2);
+ known_cgs.insert((-9*A + 6*B + 0*C %= 14) / 2);
+ known_cgs.insert(( 0*A - 0*B + 6*C %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+ gs.insert(grid_line( 3*A + 2*B - 4*C));
+ gs.insert(grid_line( 0*A + 0*B - 2*C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(0*A + 0*B + 0*C %= -1);
+ known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+ gs.insert(grid_point( 2*A + 6*B - C, 2));
+ gs.insert(grid_point(-1*A + 9*B + 7*C, 2));
+ gs.insert(grid_line( 0*A + 0*B - 2*C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= 15) / 15);
+ known_cgs.insert((-10*A + 0*B + 0*C %= 5) / 15);
+ known_cgs.insert(( 4*A - 6*B + 0*C %= -14) / 15);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+ gs.insert(grid_line( 2*A + B - 2*C));
+ gs.insert(grid_point(-1*A + 9*B + 7*C, 2));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= -10) / 10);
+ known_cgs.insert((-2*A + 4*B + 0*C %= 9) / 10);
+ known_cgs.insert(( 7*A - 4*B + 5*C %= -4) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(2*A));
+ gs.insert(grid_point(A + B));
+ gs.insert(grid_point(A + C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(A %= 0);
+ known_cgs.insert(B %= 0);
+ known_cgs.insert(C %= 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + B));
+ gs.insert(grid_point(A + 2*B));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 1) / 0);
+ known_cgs.insert(B %= 0);
+ known_cgs.insert((C %= 0) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + B + 0*C));
+ gs.insert(grid_point(A + 2*B + 0*C));
+ gs.insert(grid_point(A + B + C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 1) / 0);
+ known_cgs.insert(B %= 0);
+ known_cgs.insert(C %= 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*A + 7*B + 0*C, 3));
+ gs.insert(grid_line(3*A + 2*B + 0*C));
+ gs.insert(grid_line(0*A + 0*B + C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= -1) / 1);
+ known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-1*A + 0*B + 3*C, 4));
+ gs.insert(grid_line( 3*A + 2*B + 0*C));
+ gs.insert(grid_line( 0*A + 0*B + C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((-4*A + 6*B + 0*C %= 1) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// Empty grid, one dimension.
+bool
+test13() {
+ Grid gr(1, EMPTY);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(1, EMPTY) ***");
+
+ return ok;
+}
+
+// Empty grid, many dimensions.
+bool
+test14() {
+ Grid gr(112, EMPTY);
+
+ Grid known_gr(112, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(112, EMPTY) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point( -A + 0*B + 3*C, 4));
+ gs.insert(grid_line(0*A + 2*B + 0*C));
+ gs.insert(grid_line(0*A + 4*B + 0*C));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((4*A + 0*B + 0*C %= -1) / 0);
+ known_cgs.insert((0*A + 0*B + 4*C %= 3) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point( A));
+ gs.insert(grid_point( 2*A + B));
+ gs.insert(grid_point(12*A + 11*B));
+ gs.insert(grid_point(10*A + 12*B));
+ gs.insert(grid_point( 2*A + 33*B, 2));
+ gs.insert(grid_point( 4*A + 35*B, 2));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((C %= 0) / 0);
+ known_cgs.insert((-2*A + 2*B %= 1) / 3);
+ known_cgs.insert(( 3*A %= 0) / 3);
+ known_cgs.insert(( 0*A %= 3) / 3);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(4*A - B + 0*C, 3));
+ gs.insert(grid_line(2*A + 3*B));
+ gs.insert(grid_point(4*A , 3));
+ gs.insert(grid_point(4*A - B + C, 3));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((-9*A + 6*B + 0*C %= 0) / 2);
+ known_cgs.insert(( 6*C %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// Universe grid, one dimension.
+bool
+test18() {
+ Grid gr(1);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(1) ***");
+
+ return ok;
+}
+
+// Universe grid, many dimensions.
+bool
+test19() {
+ Grid gr(21);
+
+ Grid known_gr(21);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(21) ***");
+
+ return ok;
+}
+
+// Universe grid, zero dimensions.
+bool
+test20() {
+ Grid gr(0);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(0) ***");
+
+ return ok;
+}
+
+// Using large values for the coordinates
+bool
+test21() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-9933*A + 2000*B + 3953*C, 9113));
+ gs.insert(grid_point( 0*A + 0*B + 8888*C, 7302));
+ gs.insert(grid_point( 29*A + 23*B + 1111*C, 1010));
+ gs.insert(grid_point( 2394*A + 7273*B + 0*C, 30));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+
+ // Create coefficients with string constructors as they're too big
+ // for the long type.
+
+ // 37315344498526 0 0 0 congruence, modulus = 37315344498526
+ // 0 343455281759218112380 0 0 congruence, modulus = 37315344498526
+ // 0 -133815138923073144612 223892066991156 0 congruence, modulus = 37315344498526
+ // -22220 -31385495955559489171 93798931757298 18255 congruence, modulus = 37315344498526
+
+ Coefficient* tem1 = new Coefficient("37315344498526");
+ known_cgs.insert(( 0*A + 0*B + 0*C %= -*tem1) / *tem1);
+
+ Coefficient* tem2 = new Coefficient("343455281759218112380");
+ known_cgs.insert(( *tem2*A + 0*B + 0*C %= 0) / *tem1);
+ delete tem2;
+
+ tem2 = new Coefficient("-133815138923073144612");
+ Coefficient* tem3 = new Coefficient("223892066991156");
+ known_cgs.insert(( *tem2*A + *tem3*B + 0*C %= 0) / *tem1);
+ delete tem2; delete tem3;
+
+ tem2 = new Coefficient("-31385495955559489171");
+ tem3 = new Coefficient("93798931757298");
+ known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1);
+ delete tem1; delete tem2; delete tem3;
+
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ //print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// Using large values for the coefficients.
+bool
+test22() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(-93*A + 0*B + 39*C, 113));
+ gs.insert(grid_line( 29*A + 23*B + 111*C));
+ gs.insert(grid_point(117*A + 200*B + 88*C, 33));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= 280730) / 280730);
+ known_cgs.insert(( -85767*A + 108141*B + 0*C %= 70587) / 280730);
+ known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test23() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point( 3*A + B + 0*C, 4));
+ gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+ gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+ gs.insert(grid_point( 3*A + B + 2*C, 4));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 0*A + 0*B + 0*C %= -40) / 40);
+ known_cgs.insert((20*A + 0*B + 0*C %= 15) / 40);
+ known_cgs.insert((-4*A + 32*B + 0*C %= 5) / 40);
+ known_cgs.insert(( 0*A + 0*B + 80*C %= 0) / 40);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test24() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point( 3*A + B + 0*C, 4));
+ gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+ gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+ gs.insert(grid_point( 3*A + B + 2*C, 4));
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((20*A + 0*B %= 15) / 40);
+ known_cgs.insert((-4*A + 32*B %= 5) / 40);
+ known_cgs.insert(( 80*C %= 0) / 40);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// add_grid_generators, with more rows than columns.
+bool
+test25() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(3*A + 7*B - 2*C + 3*D));
+ gs.insert(grid_point(0*A + 0*B + C + D));
+ gs.insert(grid_point(3*A + 4*B + 2*C + 0*D));
+ gs.insert(grid_point(3*A + 2*B + C + 2*D));
+ gs.insert(grid_point(9*A + 0*B + 4*C + D));
+
+ Grid gr(4, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( 9*A + 0*B + 0*C + 0*D %= 0) / 27);
+ known_cgs.insert((-18*A + 27*B + 0*C + 0*D %= 0) / 27);
+ known_cgs.insert((-90*A + 135*B + 27*C + 0*D %= 27) / 27);
+ known_cgs.insert((-17*A + 25*B + 6*C + D %= 7) / 27);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test26() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(2*A + 0*B));
+ gs.insert(grid_point(30*A + 36*B));
+ gs.insert(grid_point(450*A + 564*B));
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.add_grid_generators(gs);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 2) / 28);
+ known_cgs.insert((B %= 0) / 12);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+ return ok;
+}
+
+// A generator system with only a line.
+bool
+test27() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_line(0*A + 2*B + 0*C));
+
+ try {
+ Grid gr(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// A generator system containing a parameter.
+bool
+test28() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*C));
+ gs.insert(grid_line(A));
+ gs.insert(grid_line(B));
+ gs.insert(parameter(-C));
+
+ Grid gr(gs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(C %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr(gs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST_F64(test21);
+ DO_TEST_F32(test22);
+ DO_TEST_F8(test23);
+ DO_TEST_F8(test24);
+ DO_TEST_F8(test25);
+ DO_TEST_F8(test26);
+ DO_TEST(test27);
+ DO_TEST(test28);
+END_MAIN
diff --git a/tests/Grid/grid2.cc b/tests/Grid/grid2.cc
new file mode 100644
index 0000000..1d22076
--- /dev/null
+++ b/tests/Grid/grid2.cc
@@ -0,0 +1,634 @@
+/* Test reduction and conversion of grids created from congruences.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruence, one dimension.
+bool
+test01() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+
+ Grid gr(cgs);
+
+ Congruence cg(A %= 0);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruence(cg);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*A));
+ known_gs.insert(grid_point(2*A));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence(cg) ***");
+
+ return ok;
+}
+
+// add_congruence, two dimensions.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A - 3*B %= 4) / 5);
+
+ Grid gr(cgs);
+
+ Congruence cg((2*A - B %= 3) / 4);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruence(cg);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*A - 15*B, 5));
+ known_gs.insert(grid_point( A + 27*B, 5));
+ known_gs.insert(grid_point(0*A + 85*B, 5));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence(cg) ***");
+
+ return ok;
+}
+
+// add_congruences, one dimension.
+bool
+test03() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 3);
+
+ Grid gr(1);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*A));
+ known_gs.insert(grid_point(3*A));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_congruences, one dimension with factors.
+bool
+test04() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 7) / 3);
+
+ Grid gr(1);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(1*A));
+ known_gs.insert(grid_point(4*A));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_congruences, two dimensions.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A - B %= 0) / 3);
+
+ Grid gr(2);
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(3*A));
+ known_gs.insert(grid_point(3*B));
+ known_gs.insert(grid_line(A + B));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert(A + B %= 0);
+ cgs.insert(A + B + C %= 0);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(A));
+ known_gs.insert(grid_point(B));
+ known_gs.insert(grid_point(C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert( -A %= 64);
+ cgs.insert(-6*A + B + 0*C %= -8);
+ cgs.insert( 3*A + 2*B + C %= -4);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(A));
+ known_gs.insert(grid_point(B));
+ known_gs.insert(grid_point(C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// Adding a false equality.
+bool
+test08() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert((0*A %= -1) / 0);
+ cgs.insert(( A %= -1) / 2);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+ }
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert(( B %= 0) / 2);
+ cgs.insert((A + B + C %= 0) / 2);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(2*A));
+ known_gs.insert(grid_point(2*B));
+ known_gs.insert(grid_point(2*C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 2*B + C %= -2) / 5);
+ cgs.insert(( 3*B %= 0) / 5);
+ cgs.insert(( B %= 0) / 5);
+ cgs.insert(( 3*C %= -4) / 5);
+ cgs.insert(( 3*B + C %= -3) / 5);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point( A - 3*C));
+ known_gs.insert(grid_point(6*A - 3*C));
+ known_gs.insert(grid_point( A + 5*B - 3*C));
+ known_gs.insert(grid_point( A + 2*C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((3*A %= -2) / 5);
+ cgs.insert(( B + 2*C %= 0) / 5);
+ cgs.insert(( 2*B + 3*C %= -3) / 5);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(-2*A - 3*B - 6*C, 3));
+ known_gs.insert(grid_point( 3*A - 3*B - 6*C, 3));
+ known_gs.insert(grid_point(-2*A + 12*B - 6*C, 3));
+ known_gs.insert(grid_point(-2*A - 3*B + 9*C, 3));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 1) / 0);
+ cgs.insert((B %= 1) / 0);
+ cgs.insert((C %= 1) / 0);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(A + B + C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 1) / 0);
+ cgs.insert(B %= 1);
+ cgs.insert((C %= 1) / 0);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(A + C));
+ known_gs.insert(grid_point(A + B + C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// An empty grid constructed from congruences.
+bool
+test14() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((C %= 2) / 5);
+ cgs.insert((C %= 3) / 5);
+
+ Grid gr(3);
+ print_congruences(gr, "*** gr ***");
+ gr.add_congruences(cgs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// Adding a congruence system with a capacity larger than the capacity
+// of the existing system.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs1;
+ cgs1.insert(B %= 2);
+
+ Grid gr(2);
+ gr.add_congruences(cgs1);
+
+ gr.add_space_dimensions_and_embed(1);
+ print_congruences(gr, "*** gr ***");
+
+ // gr.con_sys is likely to be expanded within capacity.
+
+ Congruence_System cgs2;
+ cgs2.insert(C %= 2);
+
+ // cgs2 is likely to now have more capacity than gr.con_sys does.
+
+ gr.add_congruences(cgs2);
+
+ Congruence_System cgs3;
+ cgs3.insert(B %= 2);
+ cgs3.insert(C %= 2);
+
+ Grid known_gr(cgs3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cgs2) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+
+bool
+test16() {
+ Congruence_System cgs;
+ cgs.insert(Congruence::zero_dim_false());
+
+ Grid gr(cgs);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+ Congruence_System cgs;
+ cgs.insert(Congruence::zero_dim_integrality());
+
+ Grid gr(cgs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruence, add empty system to zero dimension
+// universe.
+bool
+test18() {
+ Grid gr(0);
+
+ Congruence_System cgs;
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruence, zero dimension empty.
+bool
+test19() {
+ Grid gr(0);
+
+ Congruence_System cgs;
+ cgs.insert(Congruence::zero_dim_false());
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cgs);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((3*A %= -2) / 3);
+ cgs.insert((5*A + 9*B + C %= -1) / 3);
+ cgs.insert(( B + 3*C %= -2) / 3);
+ cgs.insert(( 2*B + 3*C %= -2) / 3);
+
+ Grid gr(3);
+
+ gr.add_congruences(cgs);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(-2*A + 0*B + 7*C, 3));
+ known_gs.insert(grid_point( 1*A + 0*B + C, 3));
+ known_gs.insert(grid_point(-2*A + 9*B + 7*C, 3));
+ known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+// OK(true) and OK(false) test.
+bool
+test21() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((3*A %= 2) / 3);
+
+ Grid gr(3);
+
+ gr.add_congruences(cgs);
+
+ bool ok = (gr.OK(true) && gr.OK(false));
+ print_generators(gr, "*** gr.add_congruences(cgs) ***");
+
+ Grid gr1(1, EMPTY);
+
+ if (ok)
+ ok = (gr1.OK(false));
+ print_generators(gr1, "*** gr1(1, EMPTY) ***");
+
+ Grid gr2(0);
+
+ if (ok)
+ ok = (gr2.OK(true) && gr2.OK(false));
+ print_generators(gr2, "*** gr2(0) ***");
+
+ return ok;
+}
+
+// Non-zero dimension universe when there are two congruences.
+// This showed a bug in Grid_simplify which is now corrected.
+bool
+test22() {
+ Variable A(0);
+ Variable B(1);;
+
+ Congruence_System cgs1(0*A == 0);
+ cgs1.insert(0*B == 0);
+ print_congruences(cgs1, "*** cgs1 ***");
+
+ Grid gr(cgs1);
+ print_congruences(gr, "*** gr(cgs1) ***");
+
+ Grid known_gr(2);
+ print_congruences(known_gr, "*** known_gr ***");
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST_F8(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+END_MAIN
diff --git a/tests/Grid/grid3.cc b/tests/Grid/grid3.cc
new file mode 100644
index 0000000..673e6b5
--- /dev/null
+++ b/tests/Grid/grid3.cc
@@ -0,0 +1,275 @@
+/* Test construction of grids from constraints.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(cs)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+
+ Grid gr(cs);
+
+ Grid known_gr(2);
+ known_gr.add_constraint(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ return ok;
+}
+
+
+// Building from an inequality exception.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+
+ cs.insert(A >= B);
+
+ try {
+ Grid gr(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "cs contains an inequality constraint: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Grid(cs), cs empty and resulting grid universe.
+bool
+test03() {
+
+ Constraint_System cs;
+ print_constraints(cs, "*** cs ***");
+
+ Grid gr(cs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ return ok;
+}
+
+// Grid(const cs)
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B == A);
+ cs.insert(0*C == 0);
+
+ const Constraint_System ccs = cs;
+
+ Grid gr(ccs);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(2*B == A);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ccs) ***");
+
+ return ok;
+}
+
+// Grid(const cs), resulting grid empty.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B == A);
+ cs.insert(2*B == 0);
+ cs.insert(A == 1);
+ cs.insert(C == 4);
+
+ const Congruence_System cgs(cs);
+
+ Grid gr(cgs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cgs) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test06() {
+ try {
+ Grid gr(Constraint_System::max_space_dimension() + 1);
+ }
+ catch (const std::length_error& e) {
+ nout << "length_error: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Assignment of universe grid, zero dimensions.
+bool
+test07() {
+ Grid gr(0, EMPTY);
+
+ gr = Grid(0);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+ try {
+ Grid gr(Grid::max_space_dimension() + 1);
+ }
+ catch (const std::length_error& e) {
+ nout << "length_error: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Create grid from empty zero dimension constraint system.
+bool
+test09() {
+ Constraint_System cs(Constraint::zero_dim_false());
+
+ Grid gr(cs);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ Grid known_gr(0, EMPTY);
+
+ print_congruences(known_gr, "*** known_gr ***");
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+// Create grid from universe zero dimension constraint system.
+bool
+test10() {
+ Constraint_System cs(Constraint::zero_dim_positivity());
+
+ Grid gr(cs);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ Grid known_gr(0);
+
+ print_congruences(known_gr, "*** known_gr ***");
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+// Create grid from const empty zero dimension constraint system.
+bool
+test11() {
+ const Constraint_System cs(Constraint::zero_dim_false());
+
+ Grid gr(cs);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ Grid known_gr(0, EMPTY);
+
+ print_congruences(known_gr, "*** known_gr ***");
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+// Create grid from const universe zero dimension constraint system.
+bool
+test12() {
+ const Constraint_System cs(Constraint::zero_dim_positivity());
+
+ Grid gr(cs);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ Grid known_gr(0);
+
+ print_congruences(known_gr, "*** known_gr ***");
+
+ bool ok = (gr == known_gr);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/griddifference1.cc b/tests/Grid/griddifference1.cc
new file mode 100644
index 0000000..8555d4d
--- /dev/null
+++ b/tests/Grid/griddifference1.cc
@@ -0,0 +1,350 @@
+/* Test Grid::difference_assign() (a.k.a. Grid::difference_assign()).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_congruence(A %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 0) / 2);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(3*A));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test02() {
+ Grid gr1;
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2;
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// First contained in second.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A - B %= 0) / 3);
+ gr1.add_congruence((A %= 0) / 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence(B %= 0);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second contains single equality.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A - B %= 0) / 3);
+ gr1.add_congruence((A %= 0) / 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A == 5);
+
+ Grid known_gr(gr1);
+
+ gr1.difference_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// First empty.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A + 2*B %= 0);
+
+ Grid gr2(2, EMPTY);
+
+ Grid known_gr(gr1);
+
+ gr1.difference_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second empty.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A + 2*B %= 0);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// More complex example, from generators.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_point(A - 2*C));
+ gr1.add_grid_generator(grid_point(3*B));
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ gr2.add_grid_generator(grid_point(A + 2*C));
+ gr2.add_grid_generator(grid_point(3*A));
+ gr2.add_grid_generator(grid_point(A + 3*B));
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(3);
+ known_gr.add_constraint(2*A + C == 0);
+ known_gr.add_congruence((B %= 0) / 3);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension grids.
+bool
+test08() {
+ Grid gr1(0);
+
+ Grid gr2(0);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// The smallest resulting grid is the first grid, even though the
+// first grid has more points than the second.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_line(A));
+ gr1.add_grid_generator(grid_point(B));
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((B %= 0) / 3);
+
+ Grid known_gr(gr1);
+
+ gr1.difference_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Simpler example where the resulting grid contains points.
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_point(A));
+ gr1.add_grid_generator(grid_point(B));
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A - B %= 0) / 2);
+ gr2.add_congruence(A %= 0);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 1) / 2);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Where the 2-complements of more than one congruence are added to
+// the result.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_constraint(B == 0);
+ gr1.add_constraint(C == 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((A + C %= 0) / 4);
+ gr2.add_congruence((A + B %= 0) / 4);
+
+ gr1.difference_assign(gr2);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((A %= 2) / 4);
+ known_gr.add_constraint(B == 0);
+ known_gr.add_constraint(C == 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B + 0*C));
+
+ Grid gr1(gs);
+
+ Grid gr2(4);
+ gr2.add_constraint(A == 0);
+ gr2.add_constraint(B == 0);
+ gr2.add_constraint(C == 0);
+
+ try {
+ gr1.difference_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/intersection1.cc b/tests/Grid/intersection1.cc
new file mode 100644
index 0000000..691c415
--- /dev/null
+++ b/tests/Grid/intersection1.cc
@@ -0,0 +1,316 @@
+/* Test Grid::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids, one dimensions.
+bool
+test01() {
+ Variable A(0);
+
+ Congruence_System cgs1;
+ cgs1.insert((A %= 1) / 2);
+
+ Congruence_System cgs2;
+ cgs2.insert((A %= 0) / 3);
+
+ Grid gr1(cgs1);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs2);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 3) / 6);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Simple grids, many dimensions.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs1;
+ cgs1.insert((A + 0*C %= 0) / 2);
+
+ Congruence_System cgs2;
+ cgs2.insert((B + 0*C %= 0) / 2);
+
+ Grid gr1(cgs1);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs2);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A + 0*C %= 0) / 2);
+ known_cgs.insert((B %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((B + 0*C %= 0) / 2);
+
+ Grid gr1(3, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((B + 0*C %= 0) / 2);
+
+ Grid gr1(cgs);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(3, EMPTY);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid universe.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+ Grid gr1(3, UNIVERSE);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid universe.
+bool
+test06() {
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((2*B + 2*C %= 1) / 3);
+
+ Grid gr1(cgs);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(3, UNIVERSE);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((2*B + 2*C %= 1) / 3);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension grids.
+
+bool
+test07() {
+ Congruence_System cgs;
+ Linear_Expression le;
+ cgs.insert((le %= le) / 1); // (0 %= 0) / 1
+
+ Grid gr1(cgs);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(0, UNIVERSE);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Many dimensioned grids from generators.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(A + C));
+ gs1.insert(grid_line(C));
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(A));
+ gs2.insert(grid_point(A + B));
+
+ Grid gr1(gs1);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generators(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((C == 0) / 0);
+ known_cgs.insert((A == 1) / 0);
+ known_cgs.insert((B == 0) / 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+
+ Grid gr2(3);
+
+ try {
+ gr1.intersection_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Both empty and both not in minimal form.
+bool
+test10() {
+ Variable A(0);
+ Grid gr1(1);
+ gr1.add_congruence((A %= 1) / 2);
+ gr1.add_congruence((A %= 0) / 2);
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 1) / 2);
+ gr2.add_congruence((A %= 0) / 2);
+
+ gr1.intersection_assign(gr2);
+ bool ok = (gr1.is_empty());
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/isempty1.cc b/tests/Grid/isempty1.cc
new file mode 100644
index 0000000..8c52503
--- /dev/null
+++ b/tests/Grid/isempty1.cc
@@ -0,0 +1,294 @@
+/* Test Grid::is_empty().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+ Grid gr(1, EMPTY);
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Many dimensions.
+bool
+test02() {
+ Grid gr(6, EMPTY);
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test03() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test04() {
+ Grid gr(0);
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe grid.
+
+bool
+test05() {
+ Grid gr(2);
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Grid of congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 3);
+
+ Grid gr(cgs);
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Empty grid of congruences.
+bool
+test07() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 4) / 3);
+
+ Grid gr(cgs);
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Grid of generators.
+bool
+test08() {
+ Variable A(0);
+ Variable E(4);
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + 3*E));
+
+ Grid gr(gs);
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + 3*E));
+ gs.insert(grid_line(A));
+ gs.insert(grid_line(B));
+ gs.insert(grid_line(C));
+ gs.insert(grid_line(D));
+ gs.insert(grid_line(E));
+
+ Grid gr(5);
+ gr.add_grid_generators(gs);
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 3);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized empty congruences.
+bool
+test11() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 4) / 3);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized universe congruences.
+
+bool
+test12() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 4) / 2);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe after remove_space_dimensions.
+bool
+test13() {
+ Variable A(0);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 4) / 2);
+
+ Grid gr(cgs);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr.remove_space_dimensions(vars);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (!gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Empty from a simple constraint.
+bool
+test14() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(0*C == 1);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+
+ bool ok = (gr.is_empty());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/isuniverse1.cc b/tests/Grid/isuniverse1.cc
new file mode 100644
index 0000000..5a03998
--- /dev/null
+++ b/tests/Grid/isuniverse1.cc
@@ -0,0 +1,322 @@
+/* Test Grid::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+ Grid gr(1);
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Many dimensions.
+
+bool
+test02() {
+ Grid gr(6);
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test04() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Empty grid.
+
+bool
+test05() {
+ Grid gr(2, EMPTY);
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Grid of congruences.
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 3);
+
+ Grid gr(cgs);
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe grid of congruences.
+
+bool
+test07() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 6) / 3);
+
+ Grid gr(cgs);
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Grid of generators.
+
+bool
+test08() {
+ Variable A(0);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + 3*E));
+
+ Grid gr(gs);
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(A + 3*E));
+ gs.insert(grid_line(A));
+ gs.insert(grid_line(B));
+ gs.insert(grid_line(C));
+ gs.insert(grid_line(D));
+ gs.insert(grid_line(E));
+
+ Grid gr(gs);
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 3);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized universe congruences.
+bool
+test11() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 3) / 3);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Minimized universe congruences.
+bool
+test12() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((0*C %= 4) / 2);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Universe after remove_space_dimensions.
+
+bool
+test13() {
+ Variable A(0);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*C %= 4) / 2);
+
+ Grid gr(cgs);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ gr.remove_space_dimensions(vars);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Empty from a simple constraint.
+
+bool
+test14() {
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(0*C == 0);
+
+ Grid gr(cgs);
+
+ // Minimize the congruences.
+ gr.minimized_congruences();
+
+ bool ok = (gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Congruences before minimization, where a point is required to
+// determine that the grid is a strict subset of the universe.
+
+bool
+test15() {
+ Variable A(0);
+
+ Congruence_System cgs;
+ cgs.insert(A == 3);
+
+ Grid gr(cgs);
+
+ bool ok = (!gr.is_universe());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc
new file mode 100644
index 0000000..4dd0933
--- /dev/null
+++ b/tests/Grid/limitedextrapolation1.cc
@@ -0,0 +1,495 @@
+/* Test Grid::limited_congruence_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 3);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(B == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A == 0);
+ gr2.add_congruence(B %= 1);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(B %= 0);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(C %= 0);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((B %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(A + 0*C %= 0);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test06() {
+ Variable E(4);
+
+ Grid gr1(5);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(5);
+
+ Congruence_System cgs(0*E %= 0);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ gr1.add_congruence((B %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(B %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert(B %= 0);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Tokens.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 6;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+ unsigned int tokens = TOKENS;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr(2);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+ Grid gr1(0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(
+ (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A - B == 0) / 27);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A - B == 0) / 9);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert((A - B == 0) / 3);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence((A - B == 0) / 3);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_line(A - 2*B));
+ gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_line(A - 2*B));
+ gr2.add_grid_generator(grid_line(A + C));
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(5, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point(A));
+ gr1.add_grid_generator(parameter(B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ gr2.add_grid_generator(parameter(B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(A, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+
+ gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr = gr2;
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation2.cc b/tests/Grid/limitedextrapolation2.cc
new file mode 100644
index 0000000..59701ef
--- /dev/null
+++ b/tests/Grid/limitedextrapolation2.cc
@@ -0,0 +1,499 @@
+/* Test Grid::limited_generator_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the generator_widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 3);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(B == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A == 0);
+ gr2.add_congruence(B %= 1);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(B %= 0);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(C %= 0);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((B %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(A + 0*C %= 0);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test06() {
+ Variable E(4);
+
+ Grid gr1(5);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(5);
+
+ Congruence_System cgs(0*E %= 0);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ gr1.add_congruence((B %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(B %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert(B %= 0);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Tokens.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 6;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+ unsigned int tokens = TOKENS;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr(2);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+ Grid gr1(0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(
+ (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A - B == 0) / 27);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A - B == 0) / 9);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert((A - B == 0) / 3);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence((A - B == 0) / 3);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_line(A - 2*B));
+ gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_line(A - 2*B));
+ gr2.add_grid_generator(grid_line(A + C));
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(5, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point(A));
+ gr1.add_grid_generator(parameter(B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ gr2.add_grid_generator(parameter(B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(A, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+
+ gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr = gr2;
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation3.cc b/tests/Grid/limitedextrapolation3.cc
new file mode 100644
index 0000000..eca8ec1
--- /dev/null
+++ b/tests/Grid/limitedextrapolation3.cc
@@ -0,0 +1,499 @@
+/* Test Grid::limited_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs((A %= 0) / 3);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(B == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A == 0);
+ gr2.add_congruence(B %= 1);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(B %= 0);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs(C %= 0);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((B %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(A + 0*C %= 0);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test06() {
+ Variable E(4);
+
+ Grid gr1(5);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(5);
+
+ Congruence_System cgs(0*E %= 0);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ gr1.add_congruence((B %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(B %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert(B %= 0);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Tokens.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 6;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr = gr2;
+
+ gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+ unsigned int tokens = TOKENS;
+
+ Congruence_System cgs;
+ cgs.insert((A + 0*B %= 0) / 2);
+
+ Grid known_gr(2);
+
+ gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+ bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+ Grid gr1(0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs(
+ (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A %= 0);
+ gr1.add_congruence((A - B == 0) / 27);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A - B == 0) / 9);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert((A - B == 0) / 3);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence((A - B == 0) / 3);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_line(A - 2*B));
+ gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_line(A - 2*B));
+ gr2.add_grid_generator(grid_line(A + C));
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(5, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point(A));
+ gr1.add_grid_generator(parameter(B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ gr2.add_grid_generator(parameter(B, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+ cgs.insert(A - 0*C == 3);
+
+ try {
+ gr2.limited_extrapolation_assign(gr1, cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(A, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr = gr2;
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/mapspacedims1.cc b/tests/Grid/mapspacedims1.cc
new file mode 100644
index 0000000..749ef8d
--- /dev/null
+++ b/tests/Grid/mapspacedims1.cc
@@ -0,0 +1,314 @@
+/* Test Grid::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid, empty mapping.
+bool
+test01() {
+ Partial_Function function;
+
+ Grid gr(3, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping all dimensions.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(2, 0);
+ function.insert(1, 1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(2*C));
+ gs.insert(grid_point(4*C));
+ gs.insert(grid_point(A));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(2*A));
+ known_gs.insert(grid_point(4*A));
+ known_gs.insert(grid_point(C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping all dimensions, with overlap.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(2, 0);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(2*A));
+ gs.insert(grid_line(A - C));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(2*B));
+ known_gs.insert(grid_line(B - A));
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping more dimensions than there are in the grid.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(2, 0);
+ function.insert(3, 2);
+ function.insert(4, 1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(B));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*C));
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping all dimensions to themselves.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(1, 1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(B));
+ gs.insert(grid_point(A + B));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+ Grid known_gr(gr);
+
+ gr.map_space_dimensions(function);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping all additional dimensions (in the mapping) to themselves.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+ function.insert(2, 2);
+ function.insert(3, 3);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(A));
+ gs.insert(grid_point(2*B));
+ gs.insert(grid_point(A + 2*B));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(4, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(B));
+ known_gr.add_grid_generator(grid_point(2*A));
+ known_gr.add_grid_generator(grid_point(2*A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping new dimensions over existing ones.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(2, 1);
+ function.insert(3, 2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(A));
+ gs.insert(grid_line(B));
+ gs.insert(grid_line(A + B));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_line(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// Mapping away a dimension in an empty grid.
+bool
+test08() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ Grid gr(3, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+// A minimized grid in which the point contains factors and the
+// divisor is greater than one.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(4*A, 2));
+ gr.add_grid_generator(grid_point(4*A + B, 2));
+
+ // Force minimization.
+ gr.minimized_grid_generators();
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_grid_generator(grid_point(4*B, 2));
+ known_gr.add_grid_generator(grid_point(4*B + A, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/maxmin1.cc b/tests/Grid/maxmin1.cc
new file mode 100644
index 0000000..14d00f5
--- /dev/null
+++ b/tests/Grid/maxmin1.cc
@@ -0,0 +1,519 @@
+/* Test Grid::maximize(const Linear_Expression&, ...)
+ and Grid::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+check_both(Grid& gr, const Linear_Expression& le,
+ const std::string grid_name) {
+ Generator ext_pnt(point());
+ bool dummy;
+ Coefficient ext_n, ext_d;
+
+ bool ok = (!gr.maximize(le, ext_n, ext_d, dummy, ext_pnt)
+ && !gr.minimize(le, ext_n, ext_d, dummy, ext_pnt));
+
+ if (!ok)
+ nout << grid_name << " bounded expr" << endl;
+
+ return ok;
+}
+
+bool
+check_minimize(Grid& gr, const Linear_Expression& le,
+ Coefficient_traits::const_reference expected_n,
+ Coefficient_traits::const_reference expected_d,
+ const Generator& expected_pnt,
+ const std::string grid_name) {
+ Generator inf_pnt(point());
+
+ bool dummy;
+ Coefficient inf_n, inf_d;
+
+ bool ok = (gr.minimize(le, inf_n, inf_d, dummy, inf_pnt)
+ && inf_n == expected_n
+ && inf_d == expected_d
+ && inf_pnt == expected_pnt);
+
+ if (!ok)
+ nout << "grid name " << grid_name << " min point " << inf_pnt
+ << " (expected " << expected_pnt << ")" << endl;
+
+ return ok;
+}
+
+bool
+check_maximize(Grid& gr, const Linear_Expression& le,
+ Coefficient_traits::const_reference expected_n,
+ Coefficient_traits::const_reference expected_d,
+ const Generator& expected_pnt,
+ const std::string grid_name) {
+ Generator sup_pnt(point());
+
+ bool dummy;
+ Coefficient sup_n, sup_d;
+
+ bool ok = (gr.maximize(le, sup_n, sup_d, dummy, sup_pnt)
+ && sup_n == expected_n
+ && sup_d == expected_d
+ && sup_pnt == expected_pnt);
+
+ if (!ok)
+ nout << "grid name " << grid_name << " max point " << sup_pnt
+ << " (expected " << expected_pnt << ")" << endl;
+
+ return ok;
+}
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ Coefficient extr_n, extr_d;
+ bool dummy;
+ Generator pnt(point());
+
+ bool ok = (!gr.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt)
+ && !gr.minimize(Linear_Expression(0), extr_n, extr_d, dummy, pnt));
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Grid gr(0, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ Linear_Expression le = Linear_Expression::zero();
+
+ return check_both(gr, le, "gr");
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Grid gr(0);
+ print_congruences(gr, "*** gr ***");
+
+ Linear_Expression le = Linear_Expression::zero();
+
+ Generator exp_pnt(point());
+
+ bool ok = check_maximize(gr, le, 0, 1, exp_pnt, "gr")
+ && check_minimize(gr, le, 0, 1, exp_pnt, "gr");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 1);
+ gr_cgs_needs_min.add_constraint(3*B == 2);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A + B;
+
+ Generator exp_pnt(point(3*A + 2*B, 3));
+
+ bool ok = check_maximize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min")
+ && check_minimize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min");
+
+ ok &= check_maximize(
+ gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min")
+ && check_minimize(gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min");
+
+ ok &= check_maximize(
+ gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min")
+ && check_minimize(gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+
+ bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+ && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+ && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Line.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(2*A + B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A - 2*B == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B;
+
+ bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+ && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+ && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// A line along the equality `expr == 0'.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A + 2*B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(2*A - B == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+
+ Generator exp_pnt(point(0*B));
+
+ bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+ && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+ ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+ && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+ ok &= check_maximize(
+ gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+ && check_minimize(
+ gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// A parameter along the equality `expr == 0'.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A + 2*B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(2*A - B == 0);
+ gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A - B;
+
+ Generator exp_pnt(point(0*B));
+
+ bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+ && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+ ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+ && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+ ok &= check_maximize(
+ gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+ && check_minimize(
+ gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Two lines which combine to cover any (affine) line defined by expr.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A));
+ gr_gs_min.add_grid_generator(grid_line(B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(2);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A - B;
+
+ bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+ && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+ && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(A));
+ gr_gs_min.add_grid_generator(grid_point(B + C));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(B + C));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(B - C == 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B - C;
+
+ bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+ && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+ && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_line(3*B + C));
+ gr_gs_min.add_grid_generator(grid_line(A - 2*B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+ gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(2*A + B - 3*C - 2 == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = 2*A + B - 3*C;
+
+ Generator exp_pnt1(point(2*B + 0*C));
+
+ bool ok = check_maximize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min")
+ && check_minimize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min");
+
+ ok &= check_maximize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min")
+ &&check_minimize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min");
+
+ Generator exp_pnt2(point(-2*C, 3));
+
+ ok &= check_maximize(
+ gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min")
+ && check_minimize(
+ gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Grid gr_gs_min(6, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(6, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+ Grid gr_cgs_needs_min(6);
+ gr_cgs_needs_min.add_constraint(A == 7);
+ gr_cgs_needs_min.add_constraint(B == -11);
+ gr_cgs_needs_min.add_constraint(C == 0);
+ gr_cgs_needs_min.add_constraint(D == 0);
+ gr_cgs_needs_min.add_constraint(E == 0);
+ gr_cgs_needs_min.add_constraint(F == 19);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+ Generator exp_pnt(point(7*A - 11*B + 19*F));
+
+ bool ok = check_maximize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min")
+ && check_minimize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min");
+
+ ok &= check_maximize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min")
+ &&check_minimize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min");
+
+ ok &= check_maximize(
+ gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min")
+ && check_minimize(
+ gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min");
+
+ return ok;
+}
+
+// Unbounded grid in 1D where the generator system is up-to-date but
+// not minimized.
+bool
+test13() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(A, 2));
+ print_generators(gr, "*** gr generators before ***");
+
+ bool ok = check_both(gr, A, "gr");
+ print_generators(gr, "*** gr generators after ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/membytes1.cc b/tests/Grid/membytes1.cc
new file mode 100644
index 0000000..98e456f
--- /dev/null
+++ b/tests/Grid/membytes1.cc
@@ -0,0 +1,277 @@
+/* Test Grid::total_memory_in_bytes() and
+ Grid::external_memory_in_bytes().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+add_congruence(Grid& gr, const Congruence& cg) {
+ const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+ const memory_size_type cg_memory = cg.total_memory_in_bytes();
+ gr.add_congruence(cg);
+ const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+ nout << gr_memory_before
+ << " + " << cg_memory
+ << " -> " << gr_memory_after
+ << endl;
+}
+
+void
+add_grid_generator(Grid& gr, const Grid_Generator& g) {
+ const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+ const memory_size_type g_memory = g.total_memory_in_bytes();
+ gr.add_grid_generator(g);
+ const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+ nout << gr_memory_before
+ << " + " << g_memory
+ << " -> " << gr_memory_after
+ << endl;
+}
+
+void
+minimize(Grid& gr) {
+ const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+ (void) gr.minimized_grid_generators();
+ const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+ nout << gr_memory_before
+ << " -m-> " << gr_memory_after
+ << endl;
+}
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ const memory_size_type x_total_size = x.total_memory_in_bytes();
+ const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+ nout << "*** Size of variables ***"
+ << endl
+ << "x.total_memory_in_bytes() = " << x_total_size
+ << endl
+ << "x.external_memory_in_bytes() = " << x_external_size
+ << endl << endl;
+
+ nout << "*** Size of linear expressions ***"
+ << endl;
+
+ Linear_Expression le(0);
+ memory_size_type le_total_size = le.total_memory_in_bytes();
+ memory_size_type le_external_size = le.external_memory_in_bytes();
+ using namespace IO_Operators;
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+ le += x;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+ le += 2*y;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+ le += 4*z;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl << endl;
+
+ nout << "*** Adding congruences to a grid ***" << endl;
+
+ Grid gr1(3);
+ add_congruence(gr1, 4*x - 2*y - z + 14 %= 0);
+ add_congruence(gr1, 4*x + 2*y - z + 2 %= 0);
+ add_congruence(gr1, x + y - 1 %= 0);
+ add_congruence(gr1, x + y + 2*z - 5 %= 0);
+ minimize(gr1);
+ add_congruence(gr1, x + 1 %= 0);
+ add_congruence(gr1, x + z - 1 %= 0);
+ add_congruence(gr1, 2*x + y -2*z + 7 %= 0);
+ add_congruence(gr1, x - y + 2*z + 1 %= 0);
+ minimize(gr1);
+ add_congruence(gr1, x - y + 5 %= 0);
+ add_congruence(gr1, 2*x - y - 2*z + 13 %= 0);
+ add_congruence(gr1, -2*x - y + 2*z + 1 %= 0);
+ add_congruence(gr1, -x + y - 1 %= 0);
+ minimize(gr1);
+ add_congruence(gr1, -x + y -2*z + 7 %= 0);
+ add_congruence(gr1, -4*x + 2*y + z - 4 %= 0);
+ add_congruence(gr1, -2*x + y + 2*z - 5 %= 0);
+ add_congruence(gr1, -x + 1 %= 0);
+ minimize(gr1);
+ add_congruence(gr1, -x - z + 5 %= 0);
+ add_congruence(gr1, -4*x - 2*y + z + 8 %= 0);
+ add_congruence(gr1, -x - y + 5 %= 0);
+ add_congruence(gr1, -x - y -2*z +13 %= 0);
+ minimize(gr1);
+
+ const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+ const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+ const Congruence_System& cgs = gr1.congruences();
+ const memory_size_type cgs_total_size = cgs.total_memory_in_bytes();
+ const memory_size_type cgs_external_size = cgs.external_memory_in_bytes();
+ const Grid_Generator_System& gs = gr1.grid_generators();
+ const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+ const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+ nout << endl
+ << "*** Size of the user-visible grid components ***"
+ << endl
+ << "gr1.total_memory_in_bytes() = " << gr1_total_size
+ << endl
+ << "cgs.total_memory_in_bytes() = " << cgs_total_size
+ << endl
+ << "gs.total_memory_in_bytes() = " << gs_total_size
+ << endl
+ << "gr1.external_memory_in_bytes() = " << gr1_external_size
+ << endl
+ << "cgs.external_memory_in_bytes() = " << cgs_external_size
+ << endl
+ << "gs.external_memory_in_bytes() = " << gs_external_size
+ << endl << endl;
+
+ nout << "*** Adding generators to a grid ***" << endl;
+
+ Grid gr2(3, EMPTY);
+ unsigned n = 0;
+ for (Grid_Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ add_grid_generator(gr2, *i);
+ if (++n % 4 == 0)
+ minimize(gr2);
+ }
+
+ nout << endl
+ << "*** Size of a congruence system vs size of contained congruences"
+ << endl
+ << "cgs.total_memory_in_bytes() = " << cgs_total_size
+ << endl;
+
+ memory_size_type cgs_elements_size = 0;
+ for (Congruence_System::const_iterator i = cgs.begin(),
+ cgs_end = cgs.end(); i != cgs_end; ++i)
+ cgs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained congruences = " << cgs_elements_size
+ << endl << endl
+ << "*** Size of a generator system vs size of contained generators"
+ << endl
+ << "gs.total_memory_in_bytes() = " << gs_total_size
+ << endl;
+
+ memory_size_type gs_elements_size = 0;
+ for (Grid_Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ gs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained generators = " << gs_elements_size
+ << endl << endl;
+
+ return true;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr1(3);
+ gr1.refine_with_constraint(4*x - 2*y - z + 14 >= 0);
+ gr1.refine_with_constraint(4*x + 2*y - z + 2 >= 0);
+ gr1.refine_with_constraint(x + y - 1 >= 0);
+ gr1.refine_with_constraint(x + y + 2*z - 5 >= 0);
+
+ const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+ const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+
+ Determinate<Grid> dgr(gr1);
+
+ const memory_size_type dgr_total_size = dgr.total_memory_in_bytes();
+ const memory_size_type dgr_external_size = dgr.external_memory_in_bytes();
+
+ nout << "gr1.total_memory_in_bytes() = " << gr1_total_size
+ << endl
+ << "gr1.external_memory_in_bytes() = " << gr1_external_size
+ << endl
+ << "dgr.total_memory_in_bytes() = " << dgr_total_size
+ << endl
+ << "dgr.external_memory_in_bytes() = " << dgr_external_size
+ << endl;
+
+ Pointset_Powerset<Grid> pgr1(gr1);
+
+ Grid gr2(3);
+ gr2.refine_with_constraint(x >= 0);
+ gr2.refine_with_constraint(y >= 0);
+ gr2.refine_with_constraint(z >= 0);
+ gr2.refine_with_constraint(x <= 1);
+ gr2.refine_with_constraint(y <= 1);
+ gr2.refine_with_constraint(z <= 1);
+ Pointset_Powerset<Grid> pgr2(gr2);
+
+ Pointset_Powerset<Grid> p2gr2 = pgr2;
+ p2gr2.difference_assign(pgr1);
+
+ const memory_size_type pgr1_total_size = pgr1.total_memory_in_bytes();
+ const memory_size_type pgr1_external_size = pgr1.external_memory_in_bytes();
+ const memory_size_type pgr2_total_size = pgr2.total_memory_in_bytes();
+ const memory_size_type pgr2_external_size = pgr2.external_memory_in_bytes();
+ const memory_size_type p2gr2_total_size = p2gr2.total_memory_in_bytes();
+ const memory_size_type p2gr2_external_size = p2gr2.external_memory_in_bytes();
+
+ nout << "pgr1.total_memory_in_bytes() = " << pgr1_total_size
+ << endl
+ << "pgr1.external_memory_in_bytes() = " << pgr1_external_size
+ << endl
+ << "pgr2.total_memory_in_bytes() = " << pgr2_total_size
+ << endl
+ << "pgr2.external_memory_in_bytes() = " << pgr2_external_size
+ << endl
+ << "p2gr2.total_memory_in_bytes() = " << p2gr2_total_size
+ << endl
+ << "p2gr2.external_memory_in_bytes() = " << p2gr2_external_size
+ << endl;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/mincongruences1.cc b/tests/Grid/mincongruences1.cc
new file mode 100644
index 0000000..8a1d41d
--- /dev/null
+++ b/tests/Grid/mincongruences1.cc
@@ -0,0 +1,222 @@
+/* Test Grid::minimized_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(4, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+ Grid gr1(6);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+ Grid gr1(0, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ gr1.OK();
+
+ print_congruences(gr1, "*** gr1(cgs) ***");
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+ Grid gr1(0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ gr1.OK();
+
+ print_congruences(gr1, "*** gr1(cgs) ***");
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A - B %= 3) / 7);
+ gr1.add_congruence((A - B %= 3) / 14);
+ gr1.add_congruence((A %= 0) / 5);
+ gr1.add_congruence((A %= 0) / 10);
+
+ Grid known_gr = gr1;
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Get a reference to the minimized_congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test06() {
+ Grid gr1(3);
+ gr1.add_congruence(Congruence::zero_dim_integrality());
+ print_congruences(gr1, "*** gr1 ***");
+
+ const Congruence_System& cgs = gr1.minimized_congruences();
+
+ // Empty the grid. The idea is to check that `cgs' still refers to
+ // a congruence system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// In zero dimensions get a reference to the universe minimized_congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test07() {
+ Grid gr1(0);
+ gr1.add_congruence(Congruence::zero_dim_integrality());
+ print_congruences(gr1, "*** gr1 ***");
+
+ const Congruence_System& cgs = gr1.minimized_congruences();
+
+ // Empty the grid. The idea is to check that `cgs' still refers to
+ // a congruence system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+
+ Grid known_gr = gr1;
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+// Empty grid, where minimizing the congruences finds the grid empty.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr1(4);
+ gr1.add_constraint(A == 1);
+ gr1.add_constraint(A == 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr(4, EMPTY);
+
+ Congruence_System cgs = gr1.minimized_congruences();
+
+ Grid gr2(cgs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2(cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/mingenerators1.cc b/tests/Grid/mingenerators1.cc
new file mode 100644
index 0000000..1c28e64
--- /dev/null
+++ b/tests/Grid/mingenerators1.cc
@@ -0,0 +1,241 @@
+/* Test Grid::minimized_grid_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(17, EMPTY);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Universe grid.
+
+bool
+test02() {
+ Grid gr1(1);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+ Grid gr1(0, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+ Grid gr1(0);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*B));
+ gr1.add_grid_generator(grid_point(5*A + 2*B));
+ gr1.add_grid_generator(grid_point(10*A + B));
+ gr1.add_grid_generator(grid_point(7*B));
+ gr1.add_grid_generator(grid_point(3*B + 4*C));
+ gr1.add_grid_generator(grid_line(C));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 10);
+ gr1.add_congruence((B %= 10) / 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+ Grid gr1(2, EMPTY);
+
+ const Grid_Generator_System& gs = gr1.minimized_grid_generators();
+
+ // Add a point. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_grid_generator(grid_point());
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+ Grid gr1(0);
+
+ const Grid_Generator_System& gs = gr1.minimized_grid_generators();
+
+ // Empty the grid. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_congruence(Congruence::zero_dim_false());
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+ Variable C(2);
+
+ Grid gr1(4);
+ gr1.add_constraint(C == 4);
+ gr1.add_constraint(C == 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+ Grid gr2(gs);
+
+ bool ok = (known_gr == gr2);
+
+ print_generators(gr2, "*** gr2(gs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/outputoperator1.cc b/tests/Grid/outputoperator1.cc
new file mode 100644
index 0000000..5422174
--- /dev/null
+++ b/tests/Grid/outputoperator1.cc
@@ -0,0 +1,141 @@
+/* Test IO_Operators::operator<<(s, gr).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+ Grid gr1(1, EMPTY);
+
+ std::stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(1);
+
+ std::stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+ Grid gr1(3, EMPTY);
+
+ std::stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(3);
+
+ std::stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+ Grid gr1(4, EMPTY);
+
+ std::stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(3);
+
+ std::stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr1(4, EMPTY);
+ gr1.add_grid_generator(grid_point(3*A + C));
+ gr1.add_grid_generator(parameter(3*A));
+
+ std::stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(4);
+ gr2.add_constraint(3*A == 0);
+
+ std::stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(3*A + C));
+ gr1.add_grid_generator(parameter(3*A));
+
+ std::stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(4);
+ gr2.add_constraint(3*A == 0);
+
+ std::stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/outputoperator2.cc b/tests/Grid/outputoperator2.cc
new file mode 100644
index 0000000..9340008
--- /dev/null
+++ b/tests/Grid/outputoperator2.cc
@@ -0,0 +1,100 @@
+/* Test Grid_Generator IO operators.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Point.
+bool
+test01() {
+ std::stringstream ss1;
+ ss1 << grid_point();
+
+ std::stringstream ss2;
+ ss2 << Grid_Generator::zero_dim_point();
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Point type.
+bool
+test02() {
+ std::stringstream ss1;
+ ss1 << grid_point().type();
+
+ std::stringstream ss2;
+ ss2 << Grid_Generator::zero_dim_point().type();
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Parameter type.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ std::stringstream ss1;
+ ss1 << parameter(B).type();
+
+ std::stringstream ss2;
+ ss2 << parameter(A).type();
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Line type.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ std::stringstream ss1;
+ ss1 << grid_line(2*A).type();
+
+ std::stringstream ss2;
+ ss2 << grid_line(3*A).type();
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/outputoperator3.cc b/tests/Grid/outputoperator3.cc
new file mode 100644
index 0000000..b467c0e
--- /dev/null
+++ b/tests/Grid/outputoperator3.cc
@@ -0,0 +1,91 @@
+/* Test Grid_Generator_System IO operators.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Single point.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs1(grid_point(A + 7*B));
+
+ std::stringstream ss1;
+ ss1 << gs1;
+
+ print_generators(gs1, "*** gs1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(A + 7*B));
+
+ std::stringstream ss2;
+ ss2 << gs2;
+
+ print_generators(gs2, "*** gs2 ***");
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Many generators.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1(grid_point(A + 7*B));
+ gs1.insert(parameter(2*C));
+
+ std::stringstream ss1;
+ ss1 << gs1;
+
+ print_generators(gs1, "*** gs1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(A + 7*B));
+ gs2.insert(parameter(2*C));
+
+ std::stringstream ss2;
+ ss2 << gs2;
+
+ print_generators(gs2, "*** gs2 ***");
+
+ bool ok = (!ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/partition1.cc b/tests/Grid/partition1.cc
new file mode 100644
index 0000000..e5cbd3d
--- /dev/null
+++ b/tests/Grid/partition1.cc
@@ -0,0 +1,101 @@
+/* Test Pointset_Powerset<Grid>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions the grid \p qq according to the congruence \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+ On exit, the intersection of \p qq and congruence \p c is stored
+ in \p qq, whereas the intersection of \p qq with the negation of \p c
+ is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+partition_aux(const Congruence& c,
+ Grid& qq,
+ Pointset_Powerset<Grid>& r) {
+ const Coefficient& c_modulus = c.modulus();
+ const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+ Linear_Expression le(c.expression());
+ le -= c_inhomogeneous_term;
+ PPL_DIRTY_TEMP_COEFFICIENT(n);
+ rem_assign(n, c_inhomogeneous_term, c_modulus);
+ PPL_DIRTY_TEMP_COEFFICIENT(i);
+ for (i = c_modulus; i-- > 0; )
+ if (i != n) {
+ Grid qqq(qq);
+ qqq.add_congruence((le+i %= 0) / c_modulus);
+ if (qqq.is_empty())
+ r.add_disjunct(qqq);
+ }
+ qq.add_congruence(c);
+}
+
+/*! \relates Pointset_Powerset */
+std::pair<Grid, Pointset_Powerset<Grid> >
+partition(const Grid& p, const Grid& q) {
+ Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+ Grid qq = q;
+ const Congruence_System& pcs = p.congruences();
+ for (Congruence_System::const_iterator i = pcs.begin(),
+ pcs_end = pcs.end(); i != pcs_end; ++i)
+ partition_aux(*i, qq, r);
+ return std::pair<Grid, Pointset_Powerset<Grid> >(qq, r);
+}
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ using namespace IO_Operators;
+ nout << "p = " << p << endl;
+
+ Grid q(2);
+ q.add_congruence((x %= 4) / 9);
+
+ nout << "q = " << q << endl;
+
+ std::pair<Grid, Pointset_Powerset<Grid> >
+ result = partition(p, q);
+
+ nout << "*** q partition ***" << endl;
+ nout << " +++ p inters q +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ result = partition(q, p);
+
+ nout << "*** p partition ***" << endl;
+ nout << " +++ q inters p +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ return true;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/powersetdifference1.cc b/tests/Grid/powersetdifference1.cc
new file mode 100644
index 0000000..2aec297
--- /dev/null
+++ b/tests/Grid/powersetdifference1.cc
@@ -0,0 +1,315 @@
+/* Test Pointset_Powerset<Grid>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+ p.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence((x %= 1) / 3);
+ q.add_congruence((y %= 1) / 2);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+
+ Grid known_gr1(2);
+ known_gr1.add_congruence((x %= 0) / 1);
+ known_gr1.add_congruence((y %= 0) / 2);
+
+ Grid known_gr2(2);
+ known_gr2.add_congruence((x %= 2) / 3);
+ known_gr2.add_congruence((y %= 1) / 2);
+
+ Grid known_gr3(2);
+ known_gr3.add_congruence((x %= 0) / 3);
+ known_gr3.add_congruence((y %= 1) / 2);
+
+ Pointset_Powerset<Grid> known_qs(2, EMPTY);
+ known_qs.add_disjunct(known_gr1);
+ known_qs.add_disjunct(known_gr2);
+ known_qs.add_disjunct(known_gr3);
+
+ bool ok = (ps == known_qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_constraint(x == 1);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((x %= 0) / 1);
+
+ Pointset_Powerset<Grid>::iterator i = ps.begin();
+ return i->pointset() == known_gr;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_constraint(x == 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence(x %= 1);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ return ps.begin() == ps.end();
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((x %= 0) / 1);
+
+ Pointset_Powerset<Grid>::iterator i = ps.begin();
+ return i->pointset() == known_gr;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+
+ Grid q(2);
+ q.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ return ps.begin() == ps.end();
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ Grid known_gr(p);
+
+ Pointset_Powerset<Grid>::iterator i = ps.begin();
+ return i->pointset() == known_gr;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ Grid known_gr(p);
+
+ Pointset_Powerset<Grid>::iterator i = ps.begin();
+ return i->pointset() == known_gr;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+ p.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence((x %= 1) / 3);
+ q.add_congruence((y %= 1) / 2);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+
+ Grid known_gr1(2);
+ known_gr1.add_congruence((x %= 0) / 1);
+ known_gr1.add_congruence((y %= 0) / 2);
+
+ Grid known_gr2(2);
+ known_gr2.add_congruence((x %= 2) / 3);
+ known_gr2.add_congruence((y %= 1) / 2);
+
+ Grid known_gr3(2);
+ known_gr3.add_congruence((x %= 0) / 3);
+ known_gr3.add_congruence((y %= 1) / 2);
+
+ Pointset_Powerset<Grid> known_qs(2, EMPTY);
+ known_qs.add_disjunct(known_gr1);
+ known_qs.add_disjunct(known_gr2);
+ known_qs.add_disjunct(known_gr3);
+
+ bool ok = (ps == known_qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_constraint(x == 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence((x %= 0) / 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ ps.difference_assign(qs);
+ print_congruences(ps, "*** ps.difference(qs) ***");
+
+ return ps.is_empty();
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallycovers1.cc b/tests/Grid/powersetgeometricallycovers1.cc
new file mode 100644
index 0000000..8060451
--- /dev/null
+++ b/tests/Grid/powersetgeometricallycovers1.cc
@@ -0,0 +1,181 @@
+/* Test Pointset_Powerset<Grid>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence((x %= 1) / 3);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_constraint(x == 1);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p(2);
+ p.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p);
+
+ Grid q(2);
+ q.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return !ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+
+ Grid q(2);
+ q.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return !ps.geometrically_covers(qs) && qs.geometrically_covers(ps);
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p1(2);
+ p1.add_congruence((x %= 0) / 3);
+ Grid p2(2);
+ p2.add_congruence((x %= 1) / 3);
+ Grid p3(2);
+ p3.add_congruence((x %= 2) / 3);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p1);
+ ps.add_disjunct(p2);
+ ps.add_disjunct(p3);
+
+ Grid q(2);
+ q.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return ps.geometrically_covers(qs);
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p1(2);
+ p1.add_congruence((x %= 0) / 3);
+ Grid p2(2);
+ p2.add_congruence((x %= 1) / 3);
+ Grid p3(2);
+ p3.add_congruence((x %= 2) / 3);
+ p3.add_congruence((y %= 2) / 3);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p1);
+ ps.add_disjunct(p2);
+ ps.add_disjunct(p3);
+
+ Grid q(2);
+ q.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return !ps.geometrically_covers(qs);
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallyequals1.cc b/tests/Grid/powersetgeometricallyequals1.cc
new file mode 100644
index 0000000..3e2b5e1
--- /dev/null
+++ b/tests/Grid/powersetgeometricallyequals1.cc
@@ -0,0 +1,114 @@
+/* Test Pointset_Powerset<Grid>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p1(2);
+ p1.add_congruence((x %= 0) / 2);
+ Grid p2(2);
+ p2.add_congruence((x %= 1) / 2);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p1);
+ ps.add_disjunct(p2);
+
+ Grid q(2);
+ q.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return ps.geometrically_equals(qs);
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p1(2);
+ p1.add_congruence((x %= 0) / 3);
+ Grid p2(2);
+ p2.add_congruence((x %= 1) / 3);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p1);
+ ps.add_disjunct(p2);
+
+ Grid q(2);
+ q.add_congruence(x %= 0);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return !ps.geometrically_equals(qs);
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid p1(2);
+ p1.add_congruence((x %= 0) / 3);
+ Grid p2(2);
+ p2.add_congruence((x %= 1) / 3);
+ Grid p3(2);
+ p3.add_congruence((x %= 2) / 3);
+ p3.add_congruence((y %= 2) / 3);
+
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ ps.add_disjunct(p1);
+ ps.add_disjunct(p2);
+ ps.add_disjunct(p3);
+
+ Grid q(2);
+ q.add_congruence(x %= 0);
+ q.add_congruence((y %= 1) / 1);
+
+ Pointset_Powerset<Grid> qs(2, EMPTY);
+ qs.add_disjunct(q);
+
+ print_congruences(ps, "*** ps ***");
+ print_congruences(qs, "*** qs ***");
+
+ return !ps.geometrically_equals(qs);
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/refinewithcongruences1.cc b/tests/Grid/refinewithcongruences1.cc
new file mode 100644
index 0000000..deed92e
--- /dev/null
+++ b/tests/Grid/refinewithcongruences1.cc
@@ -0,0 +1,211 @@
+/* Test refine_with_congruence() and refine_with_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_congruence()
+bool
+test01() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((B %= 1) / 2);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_congruence((A %= 0) / 2);
+ gr.refine_with_congruence((B %= 1) / 2);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_congruence() ***");
+
+ return ok;
+}
+
+// refine_with_congruences()
+bool
+test02() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((B %= 4) / 2);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_congruences(cgs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+ known_gr.add_congruence((B %= 4) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.refine_with_congruence(A + C %= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+ Variable A(0);
+ Variable B(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((B %= 4) / 2);
+
+ Grid gr(1);
+
+ try {
+ gr.refine_with_congruences(cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// refine_with_constraint()
+bool
+test05() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 1) / 2);
+
+ Grid gr(cgs);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_congruence((B %= 2) / 0);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+ return ok;
+}
+
+// refine_with_constraints()
+bool
+test06() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((0*A %= 3) / 0);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_congruences(cgs);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_congruences(cs) ***");
+
+ return ok;
+}
+
+// refine_with_constraints()
+bool
+test07() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_congruence((Linear_Expression(1) %= 0) / 0);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/refinewithconstraints1.cc b/tests/Grid/refinewithconstraints1.cc
new file mode 100644
index 0000000..540ac5f
--- /dev/null
+++ b/tests/Grid/refinewithconstraints1.cc
@@ -0,0 +1,208 @@
+/* Test refine_with_constraint() and refine_with_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_constraint()
+bool
+test01() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 2) / 0);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraint(A >= 2);
+ gr.refine_with_constraint(B == 2);
+
+ Grid known_gr(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+ return ok;
+}
+
+// refine_with_constraints()
+bool
+test02() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 3);
+ cs.insert(2*B == 3);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraints(cs);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((2*B %= 3) / 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.refine_with_constraint(A + C >= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+ Variable A(0);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A + C >= 0);
+
+ Grid gr(2);
+
+ try {
+ gr.refine_with_constraints(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// refine_with_constraint()
+bool
+test05() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 1) / 2);
+
+ Grid gr(cgs);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraint(B == 2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+ return ok;
+}
+
+// refine_with_constraints()
+bool
+test06() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(0*A >= 3);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraints(cs);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+// refine_with_constraints()
+bool
+test07() {
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.refine_with_constraint(Linear_Expression(1) <= 0);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/relations1.cc b/tests/Grid/relations1.cc
new file mode 100644
index 0000000..e325139
--- /dev/null
+++ b/tests/Grid/relations1.cc
@@ -0,0 +1,367 @@
+/* Test Grid::relation_with(g).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid and point.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr(2, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Universe and point.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr(2);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Lined grid and point.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+ gs.insert(grid_line(A));
+
+ Grid gr(gs);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(grid_point(A + B)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Equality and point.
+bool
+test04() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(grid_point(2*A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Congruences and points.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A - B %= 1) / 2);
+ gr.add_congruence((A %= 1) / 3);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::nothing()
+ && gr.relation_with(grid_point(-B)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Congruence and parameter.
+bool
+test06() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_congruence(2*A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(parameter(A, 2)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Congruence and line.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_congruence(2*A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(grid_line(A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.relation_with(grid_line(A + C));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Zero dimension universe grid.
+bool
+test09() {
+ Grid gr(0);
+
+ bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Empty grid and point.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr(2, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Universe and point.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(2);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Lined grid and point.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+ gs.insert(grid_line(A));
+
+ Grid gr(gs);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(point(A + B)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Equality and point.
+bool
+test13() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_constraint(A == 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(point(2*A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Congruences and points.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A - B %= 1) / 2);
+ gr.add_congruence((A %= 1) / 3);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::nothing()
+ && gr.relation_with(point(-B)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Congruence and parameter.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_congruence(2*A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(ray(A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Congruence and line.
+bool
+test16() {
+ Variable A(0);
+
+ Grid gr(2);
+ gr.add_congruence(2*A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(line(A)) == Poly_Gen_Relation::nothing());
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test17() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.relation_with(line(A + C));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Zero dimension universe grid.
+bool
+test18() {
+ Grid gr(0);
+
+ bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Lined grid and line.
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+ gs.insert(grid_line(A));
+
+ Grid gr(gs);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(line(A + B)) == Poly_Gen_Relation::nothing()
+ && gr.relation_with(line(A)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+// Lined grid and line.
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_point(B));
+ gs.insert(grid_line(A));
+
+ Grid gr(gs);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(closure_point(A + B)) == Poly_Gen_Relation::subsumes()
+ && gr.relation_with(closure_point(A)) == Poly_Gen_Relation::subsumes());
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/relations2.cc b/tests/Grid/relations2.cc
new file mode 100644
index 0000000..991c17b
--- /dev/null
+++ b/tests/Grid/relations2.cc
@@ -0,0 +1,424 @@
+/* Test Grid::relation_with(cg).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A proper congruence and a disjoint point.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A - B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = gr.relation_with((A - B %= 1) / 2) == Poly_Con_Relation::is_disjoint();
+
+ return ok;
+}
+
+// A proper congruence and an included grid.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(4*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 2) == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// A proper congruence and an intersected grid.
+bool
+test03() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A + C %= 0) / 3)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// A line and equalities.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_line(A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A + 0*B %= 0) / 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with((B + 0*B %= -2) / 0)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Inclusion of a point grid.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A + B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(A + 0*B %= 0) == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// Empty grid.
+
+bool
+test06() {
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with((B %= 0) / 2)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+ Grid gr;
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (// Trivially false congruence.
+ gr.relation_with(Congruence::zero_dim_false())
+ == Poly_Con_Relation::is_disjoint()
+ // False congruence.
+ && gr.relation_with((Linear_Expression(5) %= 1) / 3)
+ == Poly_Con_Relation::is_disjoint()
+ // False equality.
+ && gr.relation_with((Linear_Expression(1) %= 0) / 0)
+ == Poly_Con_Relation::is_disjoint()
+ // Proper congruence.
+ && gr.relation_with(Linear_Expression(1) %= 1)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // Proper congruence.
+ && gr.relation_with((Linear_Expression(5) %= 1) / 4)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // Equality.
+ && gr.relation_with(Linear_Expression(1) %= 1)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // Integrality congruence.
+ && gr.relation_with(Congruence::zero_dim_integrality())
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A + 5*B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((5*A - 2*B == 1) / 0)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test09() {
+ Variable A(0);
+ Variable D(3);
+
+ Grid gr(4);
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(A - 2*D %= 0)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(A, 2));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 3) / 0)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with((2*A %= 1) / 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(2*A %= 1)
+ == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: separate spaces.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with((10*A %= 1) / 0)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((10*A %= 0) / 1)
+ == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test13() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with(A %= 0)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ print_generators(gr, "*** gr ***");
+
+ try {
+ gr.relation_with(A + B %= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 1);
+ gr.add_constraint(A == 2);
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((B %= 0) / 2)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test16() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(3*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 4)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test17() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(grid_point(6*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 8)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test18() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(parameter(3*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 8)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// generators are not up-to-date and the grid is empty.
+bool
+test19() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A %= 1) / 2);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 8)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Grid strictly intersects where the inhomogeneous term is non-zero.
+bool
+test20() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence((A %= 0) / 1);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((2*A %= 1) / 3)
+ == (Poly_Con_Relation::strictly_intersects()));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/relations3.cc b/tests/Grid/relations3.cc
new file mode 100644
index 0000000..5bc8244
--- /dev/null
+++ b/tests/Grid/relations3.cc
@@ -0,0 +1,487 @@
+/* Test Grid::relation_with(const Constraint&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A point and an inequality.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A - B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = gr.relation_with(A - B >= 1) == Poly_Con_Relation::is_included();
+
+ return ok;
+}
+
+// A line.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_line(A));
+ print_generators(gr, "*** gr ***");
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+
+ bool ok = (gr.relation_with(A + 0*B == 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(B > -2)
+ == Poly_Con_Relation::is_included()
+ && gr.relation_with(B > 2)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(B >= 2)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(B < -2)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(B <= -2)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(B == -2)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Inclusion of a point grid.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(A + B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(B == 1)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Empty grid.
+
+bool
+test04() {
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(B == 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(B > 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test05() {
+ Grid gr;
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (// False.
+ gr.relation_with(Linear_Expression(1) == 0)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(Linear_Expression(0) > 0)
+ == (Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint())
+ // True.
+ && gr.relation_with(Linear_Expression(1) == 1)
+ == (Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included())
+ && gr.relation_with(Linear_Expression(0) >= 0)
+ == (Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included())
+ // False.
+ && gr.relation_with(Linear_Expression(1) < 0)
+ == Poly_Con_Relation::is_disjoint()
+ // True.
+ && gr.relation_with(Linear_Expression(1) >= 0)
+ == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// A disjoint grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A + 5*B));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(5*A - 2*B == 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(5*A - 2*B > 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(5*A - 2*B >= 1)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(A, 2));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A == 3)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(2*A == 1)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(2*A < 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(2*A >= 1)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: separate spaces.
+bool
+test08() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(10*A == 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(Linear_Expression(10) > 10)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(Linear_Expression(10) == 10)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(Linear_Expression(10) >= 10)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(parameter(A, 5));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A + B == 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A + B >= 0)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(1);
+ print_generators(gr, "*** gr ***");
+
+ try {
+ gr.relation_with(A + B >= 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == 1);
+ gr.add_constraint(A == 2);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(B == 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(B >= 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test13() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(3*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A == 0)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(grid_point(6*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A + B == 0)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(3*A));
+ gr.add_grid_generator(parameter(3*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A + B == 0)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// generators are out of date and the grid is empty.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A %= 1) / 2);
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A + B == 8)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates())
+ && gr.relation_with(A + B > 8)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// A simple example.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(parameter(A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A > 1)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A >= 1)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A < 1)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A <= 1)
+ == Poly_Con_Relation::strictly_intersects());
+
+ return ok;
+}
+
+// A grid in 3D.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ // Regularly spaced parallel lines along a slanted plane in 3D.
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point(A + B + C));
+ gr.add_grid_generator(grid_line(A - 2*B + 3*C));
+ gr.add_grid_generator(parameter(A - B, 3));
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(A + B + C == 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A + B == 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(A == 0)
+ == Poly_Con_Relation::strictly_intersects()
+ && gr.relation_with(Linear_Expression(0) == 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test19() {
+ Grid gr(0, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (// False.
+ gr.relation_with(Linear_Expression(1) == 0)
+ == (Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // True.
+ && gr.relation_with(Linear_Expression(1) == 1)
+ == (Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // False.
+ && gr.relation_with(Linear_Expression(1) < 0)
+ == (Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ // True.
+ && gr.relation_with(Linear_Expression(1) >= 0)
+ == (Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ return ok;
+}
+
+// A variant of test06.
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(2*A + 5*B));
+ // Force minimization.
+ (void) gr.minimized_grid_generators();
+ print_generators(gr, "*** gr ***");
+
+ bool ok = (gr.relation_with(5*A - 2*B == 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(5*A - 2*B > 1)
+ == Poly_Con_Relation::is_disjoint()
+ && gr.relation_with(5*A - 2*B >= 1)
+ == Poly_Con_Relation::is_disjoint());
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/removespacedims1.cc b/tests/Grid/removespacedims1.cc
new file mode 100644
index 0000000..cf97d9e
--- /dev/null
+++ b/tests/Grid/removespacedims1.cc
@@ -0,0 +1,350 @@
+/* Test Grid::remove_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Testing remove_space_dimensions
+
+// Simple grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A - B == 0);
+ gr.add_congruence(A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(1);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+ Variable B(1);
+
+ Grid gr(4, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test03() {
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(7, UNIVERSE);
+
+ Variables_Set vars;
+ vars.insert(C);
+ vars.insert(D);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(5, UNIVERSE);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System ggs;
+ ggs.insert(grid_point(0*A));
+ ggs.insert(grid_point(2*A));
+ ggs.insert(grid_point(3*B));
+
+ Grid gr(ggs);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ gr.remove_space_dimensions(vars);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// From congruences.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Variables_Set vars;
+ vars.insert(B);
+ vars.insert(D);
+
+ Congruence_System cgs;
+ cgs.insert((A + 2*C %= 0) / 3);
+ cgs.insert((B - E %= 0) / 2);
+
+ Grid gr(cgs);
+ print_congruences(gr, "*** gr ***");
+
+ gr.remove_space_dimensions(vars);
+
+ Grid_Generator_System known_ggs;
+ known_ggs.insert(grid_point());
+ known_ggs.insert(grid_line(2*A - B));
+ known_ggs.insert(grid_point(3*B, 2));
+ known_ggs.insert(grid_line(C));
+
+ Grid known_gr(known_ggs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Variable set includes first dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(A - B == 0);
+ gr.add_congruence(A %= 0);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(A);
+ vars.insert(C);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(1);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// The resulting grid contains a parameter that is all zeros.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// The resulting grid contains a line that is all zeros.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(parameter(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(C);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A %= 0);
+ known_gr.add_congruence(B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Empty variable set.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vars;
+
+ Grid known_gr = gr;
+
+ gr.remove_space_dimensions(vars);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(A);
+ vars.insert(B);
+ vars.insert(C);
+
+ gr.remove_space_dimensions(vars);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+ Variable B(1);
+
+ Grid gr(1, EMPTY);
+ print_congruences(gr, "*** gr ***");
+
+ Variables_Set vars;
+ vars.insert(B);
+
+ try {
+ gr.remove_space_dimensions(vars);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/removespacedims2.cc b/tests/Grid/removespacedims2.cc
new file mode 100644
index 0000000..b11f2be
--- /dev/null
+++ b/tests/Grid/removespacedims2.cc
@@ -0,0 +1,280 @@
+/* Test Grid::remove_higher_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 2*C %= 0) / 3);
+
+ Grid gr(cgs);
+ print_congruences(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(2);
+
+ Grid_Generator_System known_ggs;
+ known_ggs.insert(grid_point(0*B));
+ known_ggs.insert(grid_line(A));
+ known_ggs.insert(grid_line(B));
+
+ Grid known_gr(known_ggs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(1);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test03() {
+ Grid gr(7);
+ print_generators(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(3);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System ggs;
+ ggs.insert(grid_point(0*A));
+ ggs.insert(grid_point(2*A));
+ ggs.insert(grid_point(3*B));
+
+ Grid gr(ggs);
+ print_generators(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(1);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+ return ok;
+}
+
+// Resulting grid the same.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.remove_higher_space_dimensions(gr.space_dimension());
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions() ***");
+
+ return ok;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_grid_generator(grid_point());
+ gr.add_grid_generator(grid_point(A));
+ gr.add_grid_generator(grid_point(B));
+ gr.add_grid_generator(grid_line(C));
+ print_generators(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(0);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test07() {
+ Grid gr(1, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ try {
+ gr.remove_higher_space_dimensions(6);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// From congruences.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(B - C == 0);
+ gr.add_congruence(B %= 0);
+ gr.add_constraint(A == 4);
+ print_congruences(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(2);
+
+ Grid_Generator_System known_ggs;
+ known_ggs.insert(grid_point(4*A));
+ known_ggs.insert(parameter(B));
+
+ Grid known_gr(known_ggs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+// From congruences.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_constraint(B - C == 0);
+ gr.add_congruence(B %= 0);
+ gr.add_constraint(A == 4);
+ print_congruences(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(1);
+
+ Grid_Generator_System known_ggs;
+ known_ggs.insert(grid_point(4*A));
+
+ Grid known_gr(known_ggs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+// Where the redundant row with the lowest dim_kinds entry is a
+// congruence or equality.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A - C %= 0) / 2);
+ print_congruences(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(2);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/simplifyusingcontext1.cc b/tests/Grid/simplifyusingcontext1.cc
new file mode 100644
index 0000000..0f0e13f
--- /dev/null
+++ b/tests/Grid/simplifyusingcontext1.cc
@@ -0,0 +1,501 @@
+/* Test Grid::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 2);
+ gr1.add_congruence((y %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(gr1);
+ gr2.affine_image(x, x + 6);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2, UNIVERSE);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 2);
+ gr1.add_congruence((y %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(gr1);
+ gr2.affine_image(x, x + 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2, UNIVERSE);
+ known_result.add_congruence((x %= 0) / 2);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 2);
+ gr1.add_congruence((y %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, UNIVERSE);
+ gr2.add_congruence((x %= 0) / 4);
+ gr2.add_congruence((y %= 0) / 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2, UNIVERSE);
+ known_result.add_congruence((y %= 0) / 2);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 0);
+ gr1.add_congruence((y %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, UNIVERSE);
+ gr2.add_congruence((x %= 0) / 4);
+ gr2.add_congruence((y %= 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2, UNIVERSE);
+ known_result.add_congruence((x %= 0) / 0);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x + y %= 0) / 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, UNIVERSE);
+ gr2.add_congruence((x %= 0) / 0);
+ gr2.add_congruence((y %= 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2, UNIVERSE);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 0);
+ gr1.add_congruence((y %= 0) / 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((x + y %= 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result1(2);
+ known_result1.add_congruence((x %= 0) / 0);
+ Grid known_result2(2);
+ known_result2.add_congruence((y %= 0) / 0);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result1 || gr1 == known_result2);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 0) / 1);
+ gr1.add_congruence((y %= 0) / 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((x + y %= 0) / 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result1(2);
+ known_result1.add_congruence((x %= 0) / 1);
+ Grid known_result2(2);
+ known_result2.add_congruence((y %= 0) / 1);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result1 || gr1 == known_result2);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((x + y %= 0) / 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2);
+ known_result.add_congruence((x + y %= 1) / 0);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((x + y %= 0) / 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2);
+ known_result.add_congruence((2*x + 2*y %= 1) / 0);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((x + y %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2);
+ known_result.add_congruence((x + y %= 1) / 0);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x + y %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(2);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((x + 2*z %= 2) / 4);
+ gr1.add_congruence((y + z %= 2) / 4);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((z %= 1) / 4);
+ gr2.add_congruence((y %= 1) / 4);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(3);
+ known_result.add_congruence((2*y - x %= 2) / 4);
+
+ Grid gr3(gr1);
+ gr3.intersection_assign(gr2);
+ print_congruences(gr3,
+ "*** gr3.intersection_assign(gr2) ***");
+ Grid gr4(gr1);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+
+ gr4.intersection_assign(gr2);
+ print_congruences(gr4,
+ "*** gr4.intersection_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((x - 2*y %= 2) / 4);
+ gr1.add_congruence((x + 2*z %= 1) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((2*z %= 1) / 2);
+ gr2.add_congruence((2*y %= 1) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(gr1);
+
+ Grid gr3(gr1);
+ gr3.intersection_assign(gr2);
+ print_congruences(gr3,
+ "*** gr3.intersection_assign(gr2) ***");
+ Grid gr4(gr1);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+
+ gr4.intersection_assign(gr2);
+ print_congruences(gr4,
+ "*** gr4.intersection_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test14() {
+
+ Grid gr1(0, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(0, UNIVERSE);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test15() {
+
+ Grid gr1(0, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(0, EMPTY);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test16() {
+
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(0);
+
+ bool ok = !gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+bool
+test17() {
+
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_result(0);
+
+ bool ok = gr1.simplify_using_context_assign(gr2);
+ ok &= (gr1 == known_result);
+
+ print_congruences(gr1,
+ "*** gr1.simplify_using_context_assign(gr2) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/timeelapse1.cc b/tests/Grid/timeelapse1.cc
new file mode 100644
index 0000000..5048665
--- /dev/null
+++ b/tests/Grid/timeelapse1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::time_elapse_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Zero dimension.
+bool
+test01() {
+ Grid gr1(0);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(0);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension, second grid empty.
+bool
+test02() {
+ Grid gr1(0);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(0, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr1(4, EMPTY);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4);
+ gr2.add_congruence(A %= 3);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(4, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+ Variable A(0);
+
+ Grid gr1(4);
+ gr1.add_congruence(A %= 3);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(4, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid a single point at the origin.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A + 2*B %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr(gr1);
+
+ gr1.time_elapse_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+
+// One dimension grids of equalities.
+bool
+test06() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_constraint(A == 1);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(1);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// One dimension grids with congruences.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 2);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 0) / 3);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(1);
+ known_gr.add_congruence((A %= 2) / 3);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Multi-dimension grids.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A - B %= 1) / 6);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_constraint(B == 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 1) / 2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Multi-dimension grids with denominators, in timeelapse2.
+
+// Multi-dimension grids from generators in sub-optimal form.
+bool
+test09() {
+ Variable A(0);
+ Variable D(3);
+
+ Grid gr1(4, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_point(2*A));
+ gr1.add_grid_generator(grid_point(4*A));
+ gr1.add_grid_generator(grid_point(D));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_grid_generator(grid_point(A));
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(4, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A));
+ known_gr.add_grid_generator(grid_point(D));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// A grid of a single point, where the position of the second grid
+// causes the result to be more dense than the second grid.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 2);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 1) / 3);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(1);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(19, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ try {
+ gr1.time_elapse_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Multi-dimension grids with denominators.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(3*A - B + 4*C, 7));
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point());
+ known_gr.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
+ known_gr.add_grid_generator(grid_point(3*A - B + 4*C, 7));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST_F8(test12);
+END_MAIN
diff --git a/tests/Grid/topclosed1.cc b/tests/Grid/topclosed1.cc
new file mode 100644
index 0000000..8a0ef5c
--- /dev/null
+++ b/tests/Grid/topclosed1.cc
@@ -0,0 +1,337 @@
+/* Test Grid::is_topologically_closed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(7, EMPTY);
+
+ bool ok = (gr.is_topologically_closed());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test02() {
+ Grid gr(0, EMPTY);
+
+ bool ok = (gr.is_topologically_closed());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+ Grid gr(0);
+
+ bool ok = (gr.is_topologically_closed());
+
+ print_congruences(gr, "*** gr ***");
+
+ return ok;
+}
+
+// Point.
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_constraint(B == 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Line.
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_constraint(B == 2);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_constraint(C == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_constraint(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Skew.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr_gs_min(2, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr_gs_min(3, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_point(A));
+ gr_gs_min.add_grid_generator(grid_line(C));
+ gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_point(A));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+ gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+ gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Plane.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr_gs_min(4, EMPTY);
+ gr_gs_min.add_grid_generator(grid_point());
+ gr_gs_min.add_grid_generator(grid_line(B));
+ gr_gs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_grid_generator(grid_point());
+ gr_gs_needs_min.add_grid_generator(grid_line(B));
+ gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_constraint(A == 0);
+ gr_cgs_needs_min.add_constraint(D == 0);
+
+ // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+ // same grids.
+
+ bool ok = (gr_gs_min.is_topologically_closed())
+ && (gr_gs_needs_min.is_topologically_closed())
+ && (gr_cgs_needs_min.is_topologically_closed());
+
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+ print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ return ok;
+}
+
+// Empty.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(3);
+ gr.add_constraint(A == 1);
+ gr.add_constraint(A == 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ bool ok = (gr.is_topologically_closed());
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/topclosure1.cc b/tests/Grid/topclosure1.cc
new file mode 100644
index 0000000..4c8f269
--- /dev/null
+++ b/tests/Grid/topclosure1.cc
@@ -0,0 +1,94 @@
+/* Test Grid::topological_closure_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Grid gr(6, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.topological_closure_assign();
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+ return ok;
+}
+
+// Universe
+bool
+test02() {
+ Grid gr(5);
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.topological_closure_assign();
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*C));
+ gs.insert(grid_line(A));
+ gs.insert(grid_line(B));
+ gs.insert(parameter(-C));
+
+ Grid gr(gs);
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.topological_closure_assign();
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/unconstrain1.cc b/tests/Grid/unconstrain1.cc
new file mode 100644
index 0000000..dc3189a
--- /dev/null
+++ b/tests/Grid/unconstrain1.cc
@@ -0,0 +1,252 @@
+/* Test Grid::unconstrain().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ gr.unconstrain(A);
+
+ Grid known_result(2, EMPTY);
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vs(A, B);
+ gr.unconstrain(vs);
+
+ Grid known_result(2, EMPTY);
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_constraint(A == B);
+ gr.add_congruence(B %= 0);
+ print_generators(gr, "*** gr ***");
+
+ gr.unconstrain(B);
+
+ Grid known_result(2);
+ known_result.add_congruence(A %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence((A %= B) / 0);
+ gr.add_congruence(B %= 0);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vs(B);
+ gr.unconstrain(vs);
+
+ Grid known_result(2);
+ known_result.add_congruence(A %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Grid gr(0, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vs;
+ gr.unconstrain(vs);
+
+ Grid known_result(0, EMPTY);
+
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Grid gr(0);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vs;
+ gr.unconstrain(vs);
+
+ Grid known_result(0);
+
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ try {
+ Grid gr(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ gr.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ Grid gr(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ Variables_Set vs(Variable(0), Variable(3));
+ gr.unconstrain(vs);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Grid gr(5);
+ gr.add_congruence((A + 3*B - 7 %= 9) / 0);
+ gr.add_congruence(A - 3*B - D + E %= 0);
+ gr.add_congruence(C %= D);
+ gr.add_congruence(E %= 2*B + D);
+ gr.add_congruence(E %= 0);
+ print_generators(gr, "*** gr ***");
+
+ Variables_Set vs(A, B);
+ vs.insert(D);
+ gr.unconstrain(vs);
+
+ Grid known_result(5);
+ known_result.add_congruence((2*C %= 0) / 1);
+ known_result.add_congruence(E %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ try {
+ Grid gr(15);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ gr.unconstrain(Variable(15));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/upperbound1.cc b/tests/Grid/upperbound1.cc
new file mode 100644
index 0000000..b3fae44
--- /dev/null
+++ b/tests/Grid/upperbound1.cc
@@ -0,0 +1,335 @@
+/* Test Grid::upper_bound_assign()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Two grids each with one point and two lines
+bool
+test01() {
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(C));
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(B + 0*C));
+
+ Grid gr1(gs1);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(C));
+ known_gs.insert(grid_point(B));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Two universe grids.
+bool
+test02() {
+ Grid gr1(3);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(3);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid known_gr(3);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Second grid universe.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+ gs.insert(grid_line(A));
+ gs.insert(grid_line(B));
+ gs.insert(grid_line(-C));
+
+ Grid gr2(gs);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid known_gr(3);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Inserting a parameter.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(0*C));
+ gs1.insert(grid_line(A));
+ gs1.insert(grid_line(B));
+
+ Grid gr1(gs1);
+
+ gr1.add_grid_generator(parameter(-C));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(0*C));
+
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(C %= 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Out-of-date generators in the first grid.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(B == 0);
+ gr1.add_constraint(C == 0);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(B + 0*C));
+
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(B + 0*C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Out-of-date generators in the second grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B + 0*C));
+
+ Grid gr1(gs);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_constraint(A == 0);
+ gr2.add_constraint(B == 0);
+ gr2.add_constraint(C == 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_point(B + 0*C));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B + 0*C));
+
+ Grid gr1(gs);
+
+ Grid gr2(4);
+ gr2.add_constraint(A == 0);
+ gr2.add_constraint(B == 0);
+ gr2.add_constraint(C == 0);
+
+ try {
+ gr1.upper_bound_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Out-of-date generators in the first grid, which is empty.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(B + 0*C));
+
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr1.upper_bound_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+// Here there is an input and output version of each variable
+// A, B being input and A1, B1 the output.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ // initial point
+ Grid gr0(4);
+ gr0.add_constraint(A == 2);
+ gr0.add_constraint(B == 0);
+
+ // a pass through the procedure may do nothing
+ Grid gr1(gr0);
+ gr1.add_constraint(A == C);
+ gr1.add_constraint(B == D);
+
+ // one non-trivial pass through procedure
+ Grid gr2(gr0);
+ gr2.add_constraint(15 * A == C);
+ gr2.add_constraint(18 * A + B == D);
+ // combine alternative paths 1 and 2
+ gr2.upper_bound_assign(gr1);
+
+ // two non-trivial passes through procedure
+ Grid gr3(gr0);
+ gr3.add_constraint(225 * A == C);
+ gr3.add_constraint(282 * A + B == D);
+ // combine alternative paths 1, 2 and 3
+ gr3.upper_bound_assign(gr2);
+
+ Variables_Set vars;
+ vars.insert(A);
+ vars.insert(B);
+
+ gr3.remove_space_dimensions(vars);
+
+ // as in paper
+ Grid known_gr(2);
+
+ known_gr.add_congruence((A %= 2) / 28);
+ known_gr.add_congruence((B %= 0) / 12);
+
+ bool ok = (gr3 == known_gr);
+
+ print_congruences(gr3, "*** gr3.remove_space_dimensions(vars) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/Grid/upperbound2.cc b/tests/Grid/upperbound2.cc
new file mode 100644
index 0000000..4054767
--- /dev/null
+++ b/tests/Grid/upperbound2.cc
@@ -0,0 +1,341 @@
+/* Test Grid::upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(A + 0*C));
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(2*A + 0*C));
+
+ Grid gr1(gs1);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(A + 0*C));
+ known_gs.insert(grid_point(2*A));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign and upper_bound_assign_if_exact - Two empty grids.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(4, EMPTY);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(4, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr(4, EMPTY);
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - First grid empty.
+bool
+test04() {
+ Variable A(0);
+
+ Grid gr1(4, EMPTY);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_grid_generator(grid_point(2*A));
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Second grid empty.
+bool
+test05() {
+ Variable B(1);
+
+ Grid gr1(4, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(grid_line(B));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Zero dimension universes.
+bool
+test06() {
+ Grid gr1(0);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(0);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - First included in second.
+bool
+test07() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_congruence((A %= 0) / 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(A %= 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Second included in first.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A - B %= 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A - B == 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Exact join.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((A %= 1) / 2);
+ gr2.add_congruence((B %= 1) / 2);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 2);
+ known_gr.add_congruence(A %= 0);
+
+ bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Two points (join adds more points).
+bool
+test10() {
+ Variable A(0);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(A));
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point(3*A, 5));
+
+ Grid gr1(gs1);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (!gr1.upper_bound_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact - Space dimension exception.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B + 0*C));
+
+ Grid gr1(gs);
+
+ Grid gr2(4);
+ gr2.add_constraint(A == 0);
+ gr2.add_constraint(B == 0);
+ gr2.add_constraint(C == 0);
+
+ try {
+ gr1.upper_bound_assign_if_exact(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// upper_bound_assign - Divisor normalization.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(0*C));
+ gs1.insert(grid_line(A));
+ gs1.insert(grid_line(B));
+
+ Grid gr1(gs1);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid_Generator_System gs2;
+ gs2.insert(grid_point());
+ gs2.insert(grid_point(C, 3));
+
+ Grid gr2(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.upper_bound_assign(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((3*C %= 0) / 1);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/widening1.cc b/tests/Grid/widening1.cc
new file mode 100644
index 0000000..2b93614
--- /dev/null
+++ b/tests/Grid/widening1.cc
@@ -0,0 +1,598 @@
+/* Test Grid::congruence_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// An equality that becomes a congruence.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(B == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_constraint(A == 0);
+ gr2.add_congruence(B %= 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Keep all congruences.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence((A %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Keep some congruences.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence(C %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((B %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B %= 0) / 2);
+ known_gr.add_congruence(C %= 0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Already minimized.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((B %= 0) / 2);
+ gr2.add_congruence(C %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test08() {
+ Grid gr1(5);
+ Grid gr2(5);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Widening when increasing to universe.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr1(4);
+ gr1.add_congruence((A %= 0) / 4);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(4);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(4);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Tokens.
+bool
+test10() {
+ using namespace IO_Operators;
+
+ Variable A(0);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 4;
+
+ Grid known_gr = gr2;
+
+ gr2.congruence_widening_assign(gr1, &tokens);
+
+ bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+ nout << "*** `tokens' should be 3 ***" << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1, &tokens) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(5*A + B %= 0);
+ gr1.add_congruence(22*A %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(5*A + B %= 0);
+ gr2.add_congruence(44*A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(5*A + B %= 0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(9*A + B %= 0);
+ gr1.add_congruence(22*A %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(9*A + B %= 0);
+ gr2.add_congruence(44*A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(9*A + B %= 0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// First case in Example 9 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Second case in Example 9 in Section 6 of [BagnaraDHMZ05TR]
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((3*A + B %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Congruences and equalities.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((A - B == 0) / 6);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A - B == 0) / 3);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B == 0) / 3);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_grid_generator(grid_point(C, 3));
+ known_gr.add_grid_generator(grid_line(A - 2*B));
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+
+// Space dimension exception.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ try {
+ gr2.congruence_widening_assign(gr1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Minimizing the first congruence system finds the empty grid.
+bool
+test19() {
+ Variable A(0);
+
+ Grid gr1(3);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_constraint(A == 0);
+ gr2.add_constraint(A == 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.congruence_widening_assign(gr1);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/widening2.cc b/tests/Grid/widening2.cc
new file mode 100644
index 0000000..4f58f62
--- /dev/null
+++ b/tests/Grid/widening2.cc
@@ -0,0 +1,486 @@
+/* Test Grid::generator_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(grid_point(A));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Initially non-empty changing to the universe.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(A));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test03() {
+ Variable A(0);
+
+ Grid gr1(1, EMPTY);
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(1, EMPTY);
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// An extra affine dimension as a parameter.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point(B));
+ gr1.add_grid_generator(parameter(A));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point(B));
+ gr2.add_grid_generator(parameter(A));
+ gr2.add_grid_generator(parameter(A + B));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Widening does not change the grid.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(A, 2));
+ gr1.add_grid_generator(grid_point(B, 2));
+ gr1.add_grid_generator(grid_point(C));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(A, 2));
+ gr2.add_grid_generator(grid_point(B, 2));
+ gr2.add_grid_generator(grid_point(C));
+ gr2.add_grid_generator(grid_point(4*C + A, 4));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Widening adds a line.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(A, 2));
+ gr1.add_grid_generator(parameter(B));
+ gr1.add_grid_generator(parameter(C));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_grid_generator(grid_point(A, 2));
+ gr2.add_grid_generator(parameter(B, 2));
+ gr2.add_grid_generator(parameter(C, 2));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+ known_gr.add_grid_generator(grid_line(B));
+ known_gr.add_grid_generator(grid_line(C));
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// The next two tests are based on an example in [BagnaraDHMZ06a].
+// Widening should only be applied where the grid to be widened is in
+// strong minimal form.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 2);
+
+ gr2.generator_widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// This uses the same grids as before but with the given representation
+// not in strong minimal form.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((3*A + B %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.generator_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Token used.
+bool
+test09() {
+ using namespace IO_Operators;
+
+ Variable A(0);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 4;
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1, &tokens);
+
+ bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+ nout << "*** `tokens' (which should be 3), are = *** " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+ return ok;
+}
+
+// Token not used.
+bool
+test10() {
+ // using namespace IO_Operators;
+
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+ gr1.add_congruence((B %= 0) / 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence(B %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 4;
+
+ Grid known_gr = gr2;
+
+ gr2.generator_widening_assign(gr1, &tokens);
+
+ bool ok = ((gr2 == known_gr) && (tokens == 4));
+
+ nout << "*** `tokens' (which should be 4), are = *** " << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.generator_widening_assign(gr1);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(5*A + B %= 0);
+ gr1.add_congruence(22*A %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(5*A + B %= 0);
+ gr2.add_congruence(44*A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.generator_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(5*A + B %= 0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(9*A + B %= 0);
+ gr1.add_congruence(22*A %= 0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(9*A + B %= 0);
+ gr2.add_congruence(44*A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.generator_widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(9*A + B %= 0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ try {
+ gr2.generator_widening_assign(gr1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Grid gr1(1);
+ gr1.add_congruence((A %= 1) / 2);
+ gr1.add_congruence((A %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence((A %= 1) / 2);
+ gr2.add_congruence((A %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.generator_widening_assign(gr1);
+ bool ok = (gr1 == gr2);
+
+ print_congruences(gr1, "*** gr1 ***");
+ print_congruences(gr2, "*** gr2.generator_widening_assign ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST_F8(test12);
+ DO_TEST_F8(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/widening3.cc b/tests/Grid/widening3.cc
new file mode 100644
index 0000000..a1316bd
--- /dev/null
+++ b/tests/Grid/widening3.cc
@@ -0,0 +1,315 @@
+/* Test Grid::widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr1(2, EMPTY);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Both empty.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_constraint(A == 0);
+ gr1.add_constraint(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1, EMPTY);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Zero dimension.
+bool
+test03() {
+ Grid gr1(0);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.widening_assign(gr1);
+
+ Grid known_gr(0);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// The next set of tests use the widening example in fm06.
+
+// Both congruence systems are up-to-date.
+// Neither generator systems are up-to-date.
+// Should use the congruence widening..
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Initial grid - only the congruence system is up-to-date but not minimized.
+// Second grid - only the generator system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 2);
+ gr1.add_congruence((B %= 0) / 2);
+ gr1.add_congruence((A + B %= 0) / 2);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(2*A));
+ gr2.add_grid_generator(parameter(A + B));
+ gr2.add_grid_generator(parameter(3*A + B));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Initial grid - only the generator system is up-to-date but not minimized.
+// Second grid - only the congruence system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(2*A));
+ gr1.add_grid_generator(parameter(2*B));
+ gr1.add_grid_generator(parameter(2*A + 2*B));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+ gr2.add_congruence((A + B %= 0) / 2);
+ gr2.add_congruence((A + B %= 0));
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 2);
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Neither congruence systems are up-to-date.
+// Should use the generator widening..
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2, EMPTY);
+ gr1.add_grid_generator(grid_point());
+ gr1.add_grid_generator(parameter(2*A));
+ gr1.add_grid_generator(parameter(2*B));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_grid_generator(grid_point());
+ gr2.add_grid_generator(parameter(2*A));
+ gr2.add_grid_generator(parameter(A + B));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B %= 0) / 2);
+
+ gr2.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Tokens.
+bool
+test08() {
+ using namespace IO_Operators;
+
+ Variable A(0);
+
+ Grid gr1(2);
+ gr1.add_congruence((A %= 0) / 4);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A %= 0);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ unsigned int tokens = 4;
+
+ Grid known_gr = gr2;
+
+ gr2.widening_assign(gr1, &tokens);
+
+ bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+ nout << "*** `tokens' which should be should be 3 are *** "
+ << tokens << endl;
+
+ print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_grid_generator(grid_point(C, 3));
+ gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_grid_generator(grid_point(C, 3));
+ gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ try {
+ gr2.widening_assign(gr1);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/wrap1.cc b/tests/Grid/wrap1.cc
new file mode 100644
index 0000000..dc8101e
--- /dev/null
+++ b/tests/Grid/wrap1.cc
@@ -0,0 +1,564 @@
+/* Test Grid::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Grid gr(2);
+ gr.add_congruence((x + 24 %= 8*y) / 2);
+ gr.add_congruence((y %= 1) / 3);
+
+ Variables_Set vars(x, y);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ Grid known_result(2);
+ known_result.add_congruence((x + 24 %= 8*y) / 2);
+ known_result.add_congruence((y %= 0) / 1);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence(x + 24 %= 8*y);
+ gr.add_congruence((y %= 1) / 2);
+
+ Variables_Set vars(x, y);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ Grid known_result(3);
+ known_result.add_congruence(x %= 0);
+ known_result.add_congruence(y %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Grid gr(2);
+ gr.add_congruence((x + 24 %= 8*y) / 255);
+ gr.add_congruence(x %= 0);
+
+ Variables_Set vars(x, y);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+ Grid known_result(2);
+ known_result.add_congruence(x %= 0);
+ known_result.add_congruence((32*x + 3 %= y) / 255);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(4);
+ gr.add_congruence((x %= 255) / 0);
+
+ Variables_Set vars(x, w);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ Grid known_result(4);
+ known_result.add_congruence((x %= 255) / 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr1(4);
+ gr1.add_congruence((x %= 10) / 255);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_IMPOSSIBLE);
+
+ Grid known_result(4);
+ known_result.add_congruence((x %= 10) / 0);
+
+ bool ok = (gr1 == known_result && gr2 == known_result);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr1(4);
+ gr1.add_congruence((x %= 245) / 255);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_IMPOSSIBLE);
+
+ Grid known_result1(4);
+ known_result1.add_congruence((x %= 245) / 0);
+ Grid known_result2(4);
+ known_result2.add_congruence((x %= -10) / 0);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence(x + 24 %= 8*y);
+ gr.add_congruence((y %= 1) / 0);
+
+ Variables_Set vars(x, y);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ Grid known_result(3);
+ known_result.add_congruence(x %= 0);
+ known_result.add_congruence((y %= 1) / 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+// Expression with a greater space dimension than the grid.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(3);
+ gr.add_congruence((z == -2) / 0);
+ gr.add_congruence((x == 0) / 0);
+
+ Variables_Set vars(x, w);
+
+ try {
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Constraint with a greater space dimension than the grid.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(3);
+ gr.add_congruence((z == -2) / 0);
+ gr.add_congruence((x == 0) / 0);
+
+ Constraint_System pcs;
+ pcs.insert(x+y+z+w == 2);
+
+ Variables_Set vars(x, y);
+
+ try {
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &pcs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(4);
+ gr.add_congruence((x %= 1) / 2);
+
+ Constraint_System pcs;
+ pcs.insert(x+y+z+w == 2);
+
+ Variables_Set vars(x, w);
+
+ // The constraint system pcs will be ignored.
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &pcs);
+
+ Grid known_result(4);
+ known_result.add_congruence((x %= 1) / 2);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Grid gr(2);
+ gr.add_congruence((x %= 256) / 0);
+ gr.add_congruence(y %= 0);
+
+ Variables_Set vars(x);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ Grid known_result(2);
+ known_result.add_congruence((x %= 0) / 1);
+ known_result.add_congruence(y %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Grid gr(2);
+ gr.add_congruence((x %= 256) / 0);
+ gr.add_congruence(y %= 0);
+
+ Variables_Set vars(x);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ Grid known_result(2);
+ known_result.add_congruence((x %= 0) / 0);
+ known_result.add_congruence(y %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Grid gr(2);
+ gr.add_congruence((x %= 25) / 0);
+ gr.add_congruence(y %= 0);
+
+ Variables_Set vars(x);
+
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ Grid known_result(2);
+ known_result.add_congruence((x %= 25) / 0);
+ known_result.add_congruence(y %= 0);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 245) / 255);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+ Grid known_result1(2);
+ known_result1.add_congruence((x %= 0) / 1);
+ Grid known_result2(2);
+ known_result2.add_congruence((x %= 0) / 1);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((x %= 245) / 256);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+ Grid known_result1(2);
+ known_result1.add_congruence((x %= 245) / 0);
+ Grid known_result2(2);
+ known_result2.add_congruence((x %= -11) / 0);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((2*x %= 245) / 0);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+ Grid known_result1(2, EMPTY);
+ Grid known_result2(2, EMPTY);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((4*x %= 3) / 2);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+ Grid known_result1(2, EMPTY);
+ Grid known_result2(2, EMPTY);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((4*x %= 2) / 1);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+ Grid known_result1(2);
+ known_result1.add_congruence((x %= 0) / 1);
+ Grid known_result2(2);
+ known_result2.add_congruence((x %= 0) / 1);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr1(2);
+ gr1.add_congruence((2*x %= 245) / 0);
+ Grid gr2(gr1);
+
+ Variables_Set vars(x, y);
+
+ gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+ gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_UNDEFINED);
+
+ Grid known_result1(2, EMPTY);
+ Grid known_result2(2, EMPTY);
+
+ bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+ print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+ print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(4);
+ gr.add_congruence((x %= 1) / 2);
+
+ Constraint_System pcs;
+ pcs.insert(x+y == 2);
+
+ Variables_Set vars(x, w);
+
+ // The constraint system pcs will be ignored.
+ gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &pcs);
+
+ Grid known_result(4);
+ known_result.add_congruence((x %= 1) / 2);
+
+ bool ok = (gr == known_result);
+
+ print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+ DO_TEST_F8(test03);
+ DO_TEST_F8(test04);
+ DO_TEST_F8(test05);
+ DO_TEST_F8(test06);
+ DO_TEST_F8(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST_F8(test10);
+ DO_TEST_F8(test11);
+ DO_TEST_F8(test12);
+ DO_TEST_F8(test13);
+ DO_TEST_F16(test14);
+ DO_TEST_F8(test15);
+ DO_TEST_F8(test16);
+ DO_TEST_F8(test17);
+ DO_TEST_F8(test18);
+ DO_TEST_F8(test19);
+ DO_TEST_F8(test20);
+END_MAIN
diff --git a/tests/Grid/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc
new file mode 100644
index 0000000..422dfab
--- /dev/null
+++ b/tests/Grid/writecongruencesystem.cc
@@ -0,0 +1,63 @@
+/* Test operator<<(std::ostream&, const Congruence_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+
+ bool ok = (cgs.OK());
+
+ std::stringstream ss;
+ ss << cgs;
+ ok &= (!ss.str().compare("true"));
+
+ cgs.insert(A - 2*B %= 2);
+ cgs.insert(2*A %= 4);
+
+#define OUTPUT "A - 2*B = 0 (mod 1), 2*A = 0 (mod 1)"
+
+ ss.str("");
+ ss << cgs;
+ ok &= (!ss.str().compare(OUTPUT));
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/MIP_Problem/Makefile.am b/tests/MIP_Problem/Makefile.am
new file mode 100644
index 0000000..100f0bc
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.am
@@ -0,0 +1,98 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+ascii_dump_load1 \
+exceptions1 \
+mipproblem1 \
+mipproblem2 \
+mipproblem3 \
+mipproblem4
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+
+mipproblem1_SOURCES = mipproblem1.cc
+
+mipproblem2_SOURCES = mipproblem2.cc
+
+mipproblem3_SOURCES = mipproblem3.cc
+
+mipproblem4_SOURCES = mipproblem4.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/MIP_Problem/Makefile.in b/tests/MIP_Problem/Makefile.in
new file mode 100644
index 0000000..46e50f6
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.in
@@ -0,0 +1,1213 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+ mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT) \
+ mipproblem4$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/MIP_Problem
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+ mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT) \
+ mipproblem4$(EXEEXT)
+am__EXEEXT_2 =
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mipproblem1_OBJECTS = mipproblem1.$(OBJEXT)
+mipproblem1_OBJECTS = $(am_mipproblem1_OBJECTS)
+mipproblem1_LDADD = $(LDADD)
+mipproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mipproblem2_OBJECTS = mipproblem2.$(OBJEXT)
+mipproblem2_OBJECTS = $(am_mipproblem2_OBJECTS)
+mipproblem2_LDADD = $(LDADD)
+mipproblem2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mipproblem3_OBJECTS = mipproblem3.$(OBJEXT)
+mipproblem3_OBJECTS = $(am_mipproblem3_OBJECTS)
+mipproblem3_LDADD = $(LDADD)
+mipproblem3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mipproblem4_OBJECTS = mipproblem4.$(OBJEXT)
+mipproblem4_OBJECTS = $(am_mipproblem4_OBJECTS)
+mipproblem4_LDADD = $(LDADD)
+mipproblem4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+ $(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \
+ $(mipproblem3_SOURCES) $(mipproblem4_SOURCES)
+DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+ $(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \
+ $(mipproblem3_SOURCES) $(mipproblem4_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS =
+
+#
+# Sources for the tests
+#
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+exceptions1_SOURCES = exceptions1.cc
+mipproblem1_SOURCES = mipproblem1.cc
+mipproblem2_SOURCES = mipproblem2.cc
+mipproblem3_SOURCES = mipproblem3.cc
+mipproblem4_SOURCES = mipproblem4.cc
+EXTRA_DIST =
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/MIP_Problem/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/MIP_Problem/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES)
+ @rm -f exceptions1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+mipproblem1$(EXEEXT): $(mipproblem1_OBJECTS) $(mipproblem1_DEPENDENCIES) $(EXTRA_mipproblem1_DEPENDENCIES)
+ @rm -f mipproblem1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mipproblem1_OBJECTS) $(mipproblem1_LDADD) $(LIBS)
+
+mipproblem2$(EXEEXT): $(mipproblem2_OBJECTS) $(mipproblem2_DEPENDENCIES) $(EXTRA_mipproblem2_DEPENDENCIES)
+ @rm -f mipproblem2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mipproblem2_OBJECTS) $(mipproblem2_LDADD) $(LIBS)
+
+mipproblem3$(EXEEXT): $(mipproblem3_OBJECTS) $(mipproblem3_DEPENDENCIES) $(EXTRA_mipproblem3_DEPENDENCIES)
+ @rm -f mipproblem3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mipproblem3_OBJECTS) $(mipproblem3_LDADD) $(LIBS)
+
+mipproblem4$(EXEEXT): $(mipproblem4_OBJECTS) $(mipproblem4_DEPENDENCIES) $(EXTRA_mipproblem4_DEPENDENCIES)
+ @rm -f mipproblem4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mipproblem4_OBJECTS) $(mipproblem4_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem4.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+ @p='ascii_dump_load1$(EXEEXT)'; \
+ b='ascii_dump_load1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+ @p='exceptions1$(EXEEXT)'; \
+ b='exceptions1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem1.log: mipproblem1$(EXEEXT)
+ @p='mipproblem1$(EXEEXT)'; \
+ b='mipproblem1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem2.log: mipproblem2$(EXEEXT)
+ @p='mipproblem2$(EXEEXT)'; \
+ b='mipproblem2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem3.log: mipproblem3$(EXEEXT)
+ @p='mipproblem3$(EXEEXT)'; \
+ b='mipproblem3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem4.log: mipproblem4$(EXEEXT)
+ @p='mipproblem4$(EXEEXT)'; \
+ b='mipproblem4'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/MIP_Problem/ascii_dump_load1.cc b/tests/MIP_Problem/ascii_dump_load1.cc
new file mode 100644
index 0000000..f34a673
--- /dev/null
+++ b/tests/MIP_Problem/ascii_dump_load1.cc
@@ -0,0 +1,418 @@
+/* Test MIP_Problem::ascii_dump() and MIP_Problem::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - B >= 2);
+ cs.insert(B >= 0);
+
+ Linear_Expression cost(A + 2*B);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f);
+ close(f);
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(10*A - B >= 11);
+ cs.insert(B >= 0);
+
+ Linear_Expression cost(17*A + 2*B);
+
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ f.seekp(0);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = !mip2.ascii_load(f);
+ close(f);
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(1);
+
+ Constraint_System cs;
+ cs.insert(15*A - C >= 11);
+ cs.insert(B >= 0);
+ cs.insert(C <= 11);
+
+ Linear_Expression cost(17*A + 2*B -2*C);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "opt_mode");
+ f.seekp(0, ios_base::cur);
+ f << " Q";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = !mip2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 10);
+ cs.insert(A <= 5);
+ cs.insert(C <= 11);
+
+ Linear_Expression cost(A + 2*B + 3*C);
+
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f);
+ close(f);
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 123);
+ cs.insert(A + 2*B + 11*C <= 5434);
+ cs.insert(C <= 11);
+
+ Linear_Expression cost(A - 11*B);
+
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "base(");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = !mip2.ascii_load(f);
+ close(f);
+ return ok;
+}
+
+// Unfeasible problem, not solved.
+bool
+test06() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A - B >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B >= 10);
+ cs.insert(B + C <= 15);
+
+ Linear_Expression cost(A + 2*B);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+ close(f);
+ return ok;
+}
+
+// Unbounded problem, not solved.
+bool
+test07() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+
+ cs.insert(A >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B + A <= 15);
+
+ Linear_Expression cost(1*C);
+
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ MIP_Problem mip2;
+ open(f, my_file, ios_base::in);
+ bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+ close(f);
+ return ok;
+}
+
+// Problem with optimum, not solved.
+bool
+test08() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A + B >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B + C <= 15);
+ cs.insert(A <= 30);
+ cs.insert(B <= 50);
+
+ Linear_Expression cost(1*C + 2*B);
+
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f) &&
+ mip1.optimizing_point() == mip2.optimizing_point();
+ close(f);
+ return ok;
+}
+
+// Unfeasible problem, solved.
+bool
+test09() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A - B >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B >= 10);
+ cs.insert(B + C <= 15);
+
+ Linear_Expression cost(A + 2*B);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+ close(f);
+ return ok;
+}
+
+// Unbounded problem, solved.
+bool
+test10() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+
+ cs.insert(A >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B + A <= 15);
+
+ Linear_Expression cost(1*C);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ MIP_Problem mip2;
+ open(f, my_file, ios_base::in);
+ bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+ close(f);
+ return ok;
+}
+
+// Problem with optimum, solved.
+bool
+test11() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A + B >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B + C <= 15);
+ cs.insert(A <= 30);
+ cs.insert(B <= 50);
+
+ Linear_Expression cost(1*C);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.solve();
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f) &&
+ mip1.optimizing_point() == mip2.optimizing_point();
+ close(f);
+ return ok;
+}
+
+// Problem with optimum and integer variables, solved.
+bool
+test12() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A + B >= 2);
+ cs.insert(C >= 10);
+ cs.insert(B + C <= 15);
+ cs.insert(A <= 20);
+ cs.insert(B <= 40);
+
+ Linear_Expression cost(1*C);
+ MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+ mip1.add_to_integer_space_dimensions(Variables_Set(A,C));
+ mip1.solve();
+ fstream f;
+ open(f, my_file, ios_base::out);
+ mip1.ascii_dump(f);
+ close(f);
+ open(f, my_file, ios_base::in);
+ MIP_Problem mip2;
+ bool ok = mip2.ascii_load(f) &&
+ mip1.optimizing_point() == mip2.optimizing_point();
+ close(f);
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST_F8(test03);
+ DO_TEST(test04);
+ DO_TEST_F16(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/MIP_Problem/exceptions1.cc b/tests/MIP_Problem/exceptions1.cc
new file mode 100644
index 0000000..51aecdd
--- /dev/null
+++ b/tests/MIP_Problem/exceptions1.cc
@@ -0,0 +1,508 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A > -6);
+ MIP_Problem mip(cs.space_dimension());
+
+ try {
+ // This tries to build an invalid MIP_Problem object: the feasible
+ // region can not be defined using strict inequalities.
+ mip.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test02() {
+ Variable A(0);
+ MIP_Problem mip;
+
+ try {
+ // This tries to build an invalid MIP_Problem object: the space dimension
+ // of the objective function can not be greater than the space dimension
+ // of the feasible region.
+ mip.set_objective_function(A);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A <= 0);
+ MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+ try {
+ // We cannot extract a feasible point from an unsatisfiable MIP_Problem.
+ Generator fp = mip.feasible_point();
+ }
+ catch (std::domain_error& e) {
+ nout << "domain_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+ try {
+ // We cannot extract an optimizing point from an unbounded MIP_Problem.
+ Generator fp = mip.optimizing_point();
+ }
+ catch (std::domain_error& e) {
+ nout << "domain_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+ Generator p = point(A + B);
+ Coefficient num;
+ Coefficient den;
+
+ try {
+ // This tries to evaluate the objective function on a space-dimension
+ // incompatible generator.
+ mip.evaluate_objective_function(p, num, den);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+ Generator r = ray(A);
+ Coefficient num;
+ Coefficient den;
+
+ try {
+ // This tries to evaluate the objective function on a ray.
+ mip.evaluate_objective_function(r, num, den);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ try {
+ // This tries to overflow the maximum space dimension.
+ MIP_Problem mip(MIP_Problem::max_space_dimension() + 1);
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test08() {
+ MIP_Problem mip(1);
+ try {
+ // This tries to overflow the maximum space dimension.
+ mip.add_space_dimensions_and_embed(MIP_Problem::max_space_dimension());
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A <= 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to make the cost function incompatible with the MIP_Problem
+ // space dimension.
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A <= 0);
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to overflow the maximum space dimension.
+ MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+ cs, cost, MAXIMIZATION);
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A < 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to build an MIP_Problem with strict inequalities.
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ try {
+ // This tries to add Constraint that exceeds the MIP_Problem
+ // space dimension.
+ mip.add_constraint(C >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ try {
+ // This tries to add a strict inequality.
+ mip.add_constraint(B > 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ Constraint_System incompatible_cs;
+ incompatible_cs.insert(C >= 6);
+ incompatible_cs.insert(D <= 0);
+
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ try {
+ // Adds a Constraint_System that exceeds the space dimension of the
+ // MIP_Problem.
+ mip.add_constraints(incompatible_cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+ dimension_type cs_space_dimension = cs.space_dimension();
+
+ Linear_Expression cost(A + B);
+
+ Constraint_System incompatible_cs;
+ incompatible_cs.insert(A >= 10);
+ incompatible_cs.insert(B < 22 );
+
+ MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+ try {
+ // This tries to add Constraint_System that contains a strict inequality.
+ mip.add_constraints(incompatible_cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to overflow the maximum space dimension.
+ MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+ cs.begin(), cs.end(),
+ A + B, MAXIMIZATION);
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to let exceed the objective function space dimension.
+ MIP_Problem mip(cs.space_dimension(),
+ cs.begin(), cs.end(),
+ A + B + C, MAXIMIZATION);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B < 0);
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to build an MIP_Problem with strict inequalities..
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(),
+ A + B, MAXIMIZATION);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(B <= 0);
+
+ Linear_Expression cost(A + B);
+
+ try {
+ // This tries to build an MIP_Problem with a wrong space dimension.
+ MIP_Problem mip(cs.space_dimension() - 1, cs.begin(), cs.end(),
+ A + B, MAXIMIZATION);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem1.cc b/tests/MIP_Problem/mipproblem1.cc
new file mode 100644
index 0000000..099082e
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem1.cc
@@ -0,0 +1,1696 @@
+/* Test the MIP_Problem class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable X01(0);
+ Variable X02(1);
+ Variable X03(2);
+ Variable X04(3);
+ Variable X05(4);
+ Variable X06(5);
+ Variable X07(6);
+ Variable X08(7);
+ Variable X09(8);
+ Variable X10(9);
+ Variable X11(10);
+ Variable X12(11);
+ Variable X13(12);
+ Variable X14(13);
+ Variable X15(14);
+ Variable X16(15);
+ Variable X17(16);
+ Variable X18(17);
+ Variable X19(18);
+ Variable X20(19);
+ Variable X21(20);
+ Variable X22(21);
+ Variable X23(22);
+ Variable X24(23);
+ Variable X25(24);
+ Variable X26(25);
+ Variable X27(26);
+ Variable X28(27);
+ Variable X29(28);
+ Variable X30(29);
+ Variable X31(30);
+ Variable X32(31);
+ Variable X33(32);
+ Variable X34(33);
+ Variable X35(34);
+ Variable X36(35);
+ Variable X37(36);
+ Variable X38(37);
+ Variable X39(38);
+
+ Constraint_System cs;
+ cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+ cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+ cs.insert(-X01 >= -80);
+ cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+ cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+ cs.insert(Coefficient("2386907802506363")*X06
+ + Coefficient("2386907802506363")*X07
+ + Coefficient("1080863910568919")*X08
+ + Coefficient("7746191359077253")*X09
+ - X16 == 0);
+ cs.insert(-X06 + X10 >= -80);
+ cs.insert(-X07 + X11 >= 0);
+ cs.insert(-X08 + X12 >= 0);
+ cs.insert(-X09 + X13 >= 0);
+ cs.insert(X22 - X23 - X24 - X25 == 0);
+ cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+ cs.insert(-X22 >= -500);
+ cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+ cs.insert(Coefficient("7746191359077253")*X28
+ + Coefficient("7746191359077253")*X29
+ + Coefficient("3512807709348987")*X30
+ + Coefficient("3332663724254167")*X31
+ - X38 == 0);
+ cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+ cs.insert(-X28 + X32 >= -500);
+ cs.insert(-X29 + X33 >= 0);
+ cs.insert(-X30 + X34 >= 0);
+ cs.insert(-X31 + X35 >= 0);
+ cs.insert(Coefficient("-2661627379775963")*X10
+ - Coefficient("2686397177726501")*X11
+ - Coefficient("5422333951354077")*X12
+ - Coefficient("5469621747441467")*X13
+ + X25
+ - Coefficient("2466846695892189")*X32
+ - Coefficient("4996743786567565")*X33
+ - Coefficient("5064297780978123")*X34
+ - Coefficient("641481471923585")*X35 >= 0);
+ cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+ cs.insert(X15
+ - Coefficient("7854277750134145")*X28
+ - Coefficient("7782220156096217")*X29
+ - Coefficient("7782220156096217")*X30
+ - Coefficient("7710162562058289")*X31 >= 0);
+ cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+ cs.insert(X21 >= 2);
+ cs.insert(-X16 - X38 >= -300);
+ for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+ cs.insert(Variable(i) >= 0);
+
+ // Cost function.
+ Linear_Expression cost(-10*X02 - 8*X14 - 15*X23 - 12*X36 + 250*X39);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ // Computed numerator and denominator.
+ Coefficient num;
+ Coefficient den;
+ mip.optimal_value(num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = 11000;
+ Coefficient den_kr = 1;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ // The feasible / optimizing point.
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+
+ // Making mip unfeasible.
+ Constraint_System further_cs;
+ further_cs.insert(X05 >= 5);
+ further_cs.insert(X05 <= 3);
+ mip.add_constraints(further_cs);
+
+ return !mip.is_satisfiable();
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+
+ // Cost function
+ Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A - B + C >= 24);
+ cs.insert(B <= 320);
+ cs.insert(A + B + 2*D == 23);
+ cs.insert(A + 2*B + E == 4112);
+ cs.insert(7*A + 5*B + F <= 200);
+ cs.insert(138*A + 2*G == 25);
+ cs.insert(23*A + 342*B - 34*H == 99);
+ for (dimension_type i = A.id(); i <= H.id(); ++i)
+ cs.insert(Variable(i) >= 0);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point();
+ pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+ if (pg != pg_kr)
+ return false;
+
+ Coefficient num;
+ Coefficient den;
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = 1084869;
+ Coefficient den_kr = 76;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ // Reoptimize using another objective function.
+ Linear_Expression new_cost = -51*A + 632*B;
+ mip.set_objective_function(new_cost);
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+ if (pg != pg_kr)
+ return false;
+
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ num_kr = 14536;
+ den_kr = 1;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ // Reoptimize after changing optimization mode.
+ mip.set_optimization_mode(MINIMIZATION);
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ pg_kr = point(17100*A + 26174*B + 2274482*C
+ + 1063871*D + 388070456*E + 18627830*F + 0*H,
+ 94392);
+ if (pg != pg_kr)
+ return false;
+
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ num_kr = 3917467;
+ den_kr = 23598;
+
+ return num == num_kr && den == den_kr;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(Coefficient("2251799813685248")*A
+ >= Coefficient("-5895288448651847"));
+ cs.insert(Coefficient("5895288437392848")*A
+ + Coefficient("3643488632714799")*B
+ - Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554137963492"));
+ cs.insert(Coefficient("5895288437392848")*A +
+ Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C >=
+ Coefficient("-19077554137963492"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108284934184"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108284934184"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("2947644225451823")*A
+ - Coefficient("1125899906842624")*B
+ + Coefficient("1821744319735099")*D
+ >= Coefficient("-9538777088122044"));
+ cs.insert(Coefficient("11790576892800094")*A
+ - Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108325466584"));
+ cs.insert(Coefficient("5895288437392848")*A
+ - Coefficient("3643488630462999")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554133459892"));
+ cs.insert(Coefficient("2947644218696424")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= Coefficient("-9538777072359446"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108379509776"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108379509776"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("11790576865778496")*C
+ >= Coefficient("-38155108266919784"));
+ cs.insert(Coefficient("7286977251918799")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576870282096")*C
+ >= Coefficient("-38155108244401792"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ + Coefficient("2947644226577723")*D
+ >= Coefficient("-9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ - Coefficient("2947644226577723")*
+ D >= Coefficient("-9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ + Coefficient("2947644228829523")*D
+ >= Coefficient("-9538777096003344"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644228829523")*D
+ >= Coefficient("-9538777096003344"));
+ cs.insert(Coefficient("3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ + Coefficient("5895288468918045")*C
+ >= Coefficient("-19077554257308884"));
+ cs.insert(Coefficient("3643488652980997")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288468918045")*C
+ >= Coefficient("-19077554232539084"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644229392473"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644227140673"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644227703623"));
+ cs.insert(Coefficient("7286977314969193")*A
+ - Coefficient("11790576906310892")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108447063768"));
+ cs.insert(Coefficient("3643488655232797")*A
+ - Coefficient("5895288446400047")*B
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554203265688"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*B
+ + Coefficient("7286977179861205")*C
+ >= Coefficient("-38155107920142616"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576766699304")*B
+ - Coefficient("7286977179861205")*C
+ >= Coefficient("-38155107965178608"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("7286977157343207")*B
+ + Coefficient("11790576712656108")*D
+ >= Coefficient("-38155107816559824"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("3643488592182402")*B
+ - Coefficient("5895288374342453")*D
+ >= Coefficient("-19077553960071308"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*C
+ + Coefficient("7286977175357605")*D
+ >= Coefficient("-38155107924646216"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("5895288390105051")*C
+ - Coefficient("3643488594434202")*D
+ >= Coefficient("-19077553996100104"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288421630249")*C
+ + Coefficient("3643488619204000")*D
+ >= Coefficient("-19077554088423896"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576865778496")*C
+ - Coefficient("7286977247415199")*D
+ >= Coefficient("-38155108244401792"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("7286977247415199")*B
+ + Coefficient("11790576888296494")*D
+ >= Coefficient("-38155108307452184"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("3643488639470198")*B
+ - Coefficient("5895288464414445")*D
+ >= Coefficient("-19077554210021088"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288428385648")*B
+ + Coefficient("3643488630462999")*C
+ >= Coefficient("-19077554131208092"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576843260498")*B
+ - Coefficient("7286977224897201")*C
+ >= Coefficient("-38155108163336992"));
+ cs.insert(Coefficient("1125899906842624")*B
+ >= Coefficient("-2947644227703623"));
+ cs.insert(Coefficient("5895288459910846")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488630462999")*D
+ >= Coefficient("-19077554198762088"));
+ cs.insert(Coefficient("5895288457659046")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488628211199")*D
+ >= Coefficient("-19077554189754888"));
+ cs.insert(Coefficient("11790576915318092")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977269933197")*D
+ >= Coefficient("-38155108393020576"));
+ cs.insert(Coefficient("5895288457659046")*B
+ - Coefficient("2251799813685248")*C
+ - Coefficient("3643488632714799")*D
+ >= Coefficient("-19077554187503088"));
+ cs.insert(Coefficient("7286977292451195")*B
+ + Coefficient("11790576919821692")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108433552976"));
+ cs.insert(Coefficient("3643488664239996")*B
+ + Coefficient("5895288486932443")*C
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554304596680"));
+ cs.insert(Coefficient("3643488643973798")*B
+ - Coefficient("5895288446400047")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554180747688"));
+ cs.insert(Coefficient("7286977314969193")*B
+ - Coefficient("11790576937836090")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108510114168"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977247415199")*C
+ + Coefficient("11790576883792894")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977251918799")*C
+ - Coefficient("11790576883792894")*D
+ >= Coefficient("-38155108280430584"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ + Coefficient("11790576852267696")*D
+ >= Coefficient("-38155108181351392"));
+ cs.insert(Coefficient("1125899906842624")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ - Coefficient("11790576852267696")*D
+ >= Coefficient("-38155108167840592"));
+ cs.insert(Coefficient("-2251799813685248")*D
+ >= Coefficient("-5895288448651847"));
+ cs.insert(Coefficient("2251799813685248")*C
+ >= Coefficient("-5895288446400047"));
+ cs.insert(Coefficient("-2251799813685248")*C
+ >= Coefficient("-5895288444148247"));
+ cs.insert(Coefficient("-1125899906842624")*B
+ + Coefficient("1821744321986899")*C
+ + Coefficient("2947644226577723")*D
+ >= Coefficient("-9538777088122044"));
+ cs.insert(Coefficient("-3643488607945001")*B
+ + Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554059150500"));
+ cs.insert(Coefficient("-4503599627370496")*B
+ + Coefficient("7286977292451195")*C
+ - Coefficient("11790576906310892")*D
+ >= Coefficient("-38155108343480984"));
+ cs.insert(Coefficient("-7286977220393601")*B
+ + Coefficient("11790576829749698")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108086775800"));
+ cs.insert(Coefficient("-4503599627370496")*B
+ - Coefficient("7286977274436797")*C
+ + Coefficient("11790576901807292")*D
+ >= Coefficient("-38155108325466584"));
+ cs.insert(Coefficient("-3643488605693201")*B
+ - Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554059150500"));
+ cs.insert(Coefficient("-1125899906842624")*B
+ - Coefficient("1821744319735099")*C
+ - Coefficient("2947644225451823")*D
+ >= Coefficient("-9538777079114846"));
+ cs.insert(Coefficient("-7286977220393601")*B
+ - Coefficient("11790576834253298")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108113797400"));
+ cs.insert(Coefficient("-5895288462162645")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488639470198")*D
+ >= Coefficient("-19077554144718892"));
+ cs.insert(Coefficient("-11790576924325290")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977292451195")*D
+ >= Coefficient("-38155108320962984"));
+ cs.insert(Coefficient("-5895288468918045")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488641721998")*D
+ >= Coefficient("-19077554160481492"));
+ cs.insert(Coefficient("-11790576928828890")*B
+ - Coefficient("4503599627370496")*C
+ - Coefficient("7286977292451195")*D
+ >= Coefficient("-38155108329970184"));
+ cs.insert(Coefficient("-281474976710656")*B
+ >= Coefficient("-736911053829681"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("11790576658612912")*B
+ + Coefficient("7286977125818009")*C
+ >= Coefficient("-38155107627408640"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ + Coefficient("5895288336061856")*B
+ - Coefficient("3643488560657205")*C
+ >= Coefficient("-19077553829466920"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ + Coefficient("3643488535887407")*B
+ + Coefficient("5895288288774060")*D
+ >= Coefficient("-19077553683099932"));
+ cs.insert(Coefficient("-7286977274436797")*A
+ + Coefficient("11790576766699304")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108032732608"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("7286977098796411")*B
+ - Coefficient("11790576609073318")*D
+ >= Coefficient("-38155107483293448"));
+ cs.insert(Coefficient("-7286977301458395")*A
+ + Coefficient("11790576735174106")*B
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155107983193008"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("11790576708152508")*C
+ + Coefficient("7286977148336007")*D
+ >= Coefficient("-38155107771523824"));
+ cs.insert(Coefficient("-281474976710656")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ + Coefficient("281474976710656")*D
+ >= Coefficient("-1473822119481311"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("2947644178164027")*C
+ - Coefficient("1821744285958102")*D
+ >= Coefficient("-9538776941755056"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ + Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288471169845"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576856771296")*C
+ + Coefficient("7286977247415199")*D
+ >= Coefficient("-38155108221883792"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288471169845"));
+ cs.insert(Coefficient("-140737488355328")*A
+ - Coefficient("368455526774103")*C
+ - Coefficient("227718038700250")*D
+ >= Coefficient("-1192347131793131"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288464414445"));
+ cs.insert(Coefficient("-3643488643973798")*A
+ + Coefficient("2251799813685248")*B
+ + Coefficient("5895288441896447")*C
+ >= Coefficient("-19077554158229692"));
+ cs.insert(Coefficient("-7286977296954795")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576892800094")*C
+ >= Coefficient("-38155108352488176"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("7286977269933197")*B
+ + Coefficient("11790576924325290")*D
+ >= Coefficient("-38155108411034976"));
+ cs.insert(Coefficient("-3643488639470198")*A
+ + Coefficient("2251799813685248")*C
+ + Coefficient("5895288466666245")*D
+ >= Coefficient("-19077554219028288"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("7286977296954795")*B
+ - Coefficient("11790576955850488")*D
+ >= Coefficient("-38155108514617768"));
+ cs.insert(Coefficient("-7286977251918799")*A
+ + Coefficient("4503599627370496")*C
+ - Coefficient("11790576892800094")*D
+ >= Coefficient("-38155108311955784"));
+ cs.insert(Coefficient("-3643488655232797")*A
+ - Coefficient("2251799813685248")*C
+ + Coefficient("5895288480177044")*D
+ >= Coefficient("-19077554264064284"));
+ cs.insert(Coefficient("-1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644229955423")*D
+ >= Coefficient("-9538777099381044"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576874785696")*B
+ + Coefficient("7286977269933197")*C
+ >= Coefficient("-38155108302948584"));
+ cs.insert(Coefficient("-7286977274436797")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("11790576937836090")*C
+ >= Coefficient("-38155108424545776"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576802728102")*B
+ - Coefficient("7286977197875603")*C
+ >= Coefficient("-38155108019221808"));
+ cs.insert(Coefficient("-3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288493687843")*C
+ >= Coefficient("-19077554284330480"));
+ cs.insert(Coefficient("-562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644250784571"));
+ cs.insert(Coefficient("-281474976710656")*A
+ - Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ - Coefficient("281474976710656")*D
+ >= Coefficient("-1473822131021785"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288464414445"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288468918045"));
+ cs.insert(Coefficient("-3643488412038417")*A
+ - Coefficient("5895288318047457")*B
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077553665085532"));
+ cs.insert(Coefficient("-1821744199263809")*A
+ - Coefficient("2947644153394229")*B
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-9538776813402468"));
+ cs.insert(Coefficient("-5895288378846052")*A
+ + Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554023121704"));
+ cs.insert(Coefficient("-11790576834253298")*A
+ + Coefficient("7286977314969193")*B
+ - Coefficient("4503599627370496")*C
+ >= Coefficient("-38155108302948584"));
+ cs.insert(Coefficient("-736911041726257")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("455436077400500")*D
+ >= Coefficient("-2384694241068264"));
+ cs.insert(Coefficient("-5895288347320855")*A
+ + Coefficient("2251799813685248")*B
+ - Coefficient("3643488616952200")*D
+ >= Coefficient("-19077553951064108"));
+ cs.insert(Coefficient("-2947644201807925")*A
+ + Coefficient("1821744319735099")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-9538777048715548"));
+ cs.insert(Coefficient("-11790576820742500")*A
+ + Coefficient("7286977296954795")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108248905384"));
+ cs.insert(Coefficient("-11790576996382886")*A
+ - Coefficient("7286977251918799")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108523624968"));
+ cs.insert(Coefficient("-5895288507198642")*A
+ - Coefficient("3643488632714799")*C
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554291085880"));
+ cs.insert(Coefficient("-11790577113476476")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("7286977319472793")*D
+ >= Coefficient("-38155108861394936"));
+ cs.insert(Coefficient("-5895288572500836")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("3643488652980997")*D
+ >= Coefficient("-19077554450963668"));
+ cs.insert(Coefficient("-5895288484680644")*A
+ - Coefficient("3643488607945001")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554212272888"));
+ cs.insert(Coefficient("-2947644274991419")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= Coefficient("-9538777190578936"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ >= Coefficient("-5895288448651847"));
+
+ // Cost function
+ Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point obtained by simplex:\n";
+ print_generator(pg);
+
+ Coefficient num;
+ Coefficient den;
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "\nOptimum value = " << num << "/" << den << endl;
+
+ C_Polyhedron ph(cs);
+ Coefficient num1;
+ Coefficient den1;
+ bool maximum;
+ Generator pg1 = point();
+ ph.maximize(cost, num1, den1, maximum, pg1);
+
+ nout << "\nOptimizing point obtained by enumeration:\n";
+ print_generator(pg1);
+ nout << "\nOptimum value = " << num1 << "/" << den1 << endl;
+
+ return maximum && num == num1 && den == den1 && pg == pg1;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+
+ // Cost function
+ Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A - B + C >= 24);
+ cs.insert(B <= 320);
+ cs.insert(A + B + 2*D == 23);
+ cs.insert(A + 2*B + E == 4112);
+ cs.insert(7*A + 5*B + F <= 200);
+ cs.insert(138*A + 2*G == 25);
+ cs.insert(23*A + 342*B - 34*H == 99);
+ for (dimension_type i = A.id(); i <= H.id(); ++i)
+ cs.insert(Variable(i) >= 0);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point();
+ pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+ if (pg != pg_kr)
+ return false;
+
+ Coefficient num;
+ Coefficient den;
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = 1084869;
+ Coefficient den_kr = 76;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ // Reoptimize using another objective function.
+ Linear_Expression new_cost = -51*A + 632*B;
+ mip.set_objective_function(new_cost);
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+ if (pg != pg_kr)
+ return false;
+
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ num_kr = 14536;
+ den_kr = 1;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ // Reoptimize after changing optimization mode.
+ mip.set_optimization_mode(MINIMIZATION);
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ pg_kr = point(17100*A + 26174*B + 2274482*C
+ + 1063871*D + 388070456*E + 18627830*F + 0*H,
+ 94392);
+ if (pg != pg_kr)
+ return false;
+
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ num_kr = 3917467;
+ den_kr = 23598;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ return true;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Constraint_System cs;
+ cs.insert(Coefficient("2251799813685248")*A
+ >= Coefficient("-5895288448651847"));
+ cs.insert(Coefficient("5895288437392848")*A
+ + Coefficient("3643488632714799")*B
+ - Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554137963492"));
+ cs.insert(Coefficient("5895288437392848")*A +
+ Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C >=
+ Coefficient("-19077554137963492"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108284934184"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108284934184"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("2947644225451823")*A
+ - Coefficient("1125899906842624")*B
+ + Coefficient("1821744319735099")*D
+ >= Coefficient("-9538777088122044"));
+ cs.insert(Coefficient("11790576892800094")*A
+ - Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= Coefficient("-38155108325466584"));
+ cs.insert(Coefficient("5895288437392848")*A
+ - Coefficient("3643488630462999")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554133459892"));
+ cs.insert(Coefficient("2947644218696424")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= Coefficient("-9538777072359446"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108379509776"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108379509776"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("11790576865778496")*C
+ >= Coefficient("-38155108266919784"));
+ cs.insert(Coefficient("7286977251918799")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576870282096")*C
+ >= Coefficient("-38155108244401792"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ + Coefficient("2947644226577723")*D
+ >= Coefficient("-9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ - Coefficient("2947644226577723")*
+ D >= Coefficient("-9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ + Coefficient("2947644228829523")*D
+ >= Coefficient("-9538777096003344"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644228829523")*D
+ >= Coefficient("-9538777096003344"));
+ cs.insert(Coefficient("3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ + Coefficient("5895288468918045")*C
+ >= Coefficient("-19077554257308884"));
+ cs.insert(Coefficient("3643488652980997")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288468918045")*C
+ >= Coefficient("-19077554232539084"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644229392473"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644227140673"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= Coefficient("-2947644227703623"));
+ cs.insert(Coefficient("7286977314969193")*A
+ - Coefficient("11790576906310892")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108447063768"));
+ cs.insert(Coefficient("3643488655232797")*A
+ - Coefficient("5895288446400047")*B
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554203265688"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*B
+ + Coefficient("7286977179861205")*C
+ >= Coefficient("-38155107920142616"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576766699304")*B
+ - Coefficient("7286977179861205")*C
+ >= Coefficient("-38155107965178608"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("7286977157343207")*B
+ + Coefficient("11790576712656108")*D
+ >= Coefficient("-38155107816559824"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("3643488592182402")*B
+ - Coefficient("5895288374342453")*D
+ >= Coefficient("-19077553960071308"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*C
+ + Coefficient("7286977175357605")*D
+ >= Coefficient("-38155107924646216"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("5895288390105051")*C
+ - Coefficient("3643488594434202")*D
+ >= Coefficient("-19077553996100104"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288421630249")*C
+ + Coefficient("3643488619204000")*D
+ >= Coefficient("-19077554088423896"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576865778496")*C
+ - Coefficient("7286977247415199")*D
+ >= Coefficient("-38155108244401792"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("7286977247415199")*B
+ + Coefficient("11790576888296494")*D
+ >= Coefficient("-38155108307452184"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("3643488639470198")*B
+ - Coefficient("5895288464414445")*D
+ >= Coefficient("-19077554210021088"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288428385648")*B
+ + Coefficient("3643488630462999")*C
+ >= Coefficient("-19077554131208092"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576843260498")*B
+ - Coefficient("7286977224897201")*C
+ >= Coefficient("-38155108163336992"));
+ cs.insert(Coefficient("1125899906842624")*B
+ >= Coefficient("-2947644227703623"));
+ cs.insert(Coefficient("5895288459910846")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488630462999")*D
+ >= Coefficient("-19077554198762088"));
+ cs.insert(Coefficient("5895288457659046")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488628211199")*D
+ >= Coefficient("-19077554189754888"));
+ cs.insert(Coefficient("11790576915318092")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977269933197")*D
+ >= Coefficient("-38155108393020576"));
+ cs.insert(Coefficient("5895288457659046")*B
+ - Coefficient("2251799813685248")*C
+ - Coefficient("3643488632714799")*D
+ >= Coefficient("-19077554187503088"));
+ cs.insert(Coefficient("7286977292451195")*B
+ + Coefficient("11790576919821692")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108433552976"));
+ cs.insert(Coefficient("3643488664239996")*B
+ + Coefficient("5895288486932443")*C
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554304596680"));
+ cs.insert(Coefficient("3643488643973798")*B
+ - Coefficient("5895288446400047")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554180747688"));
+ cs.insert(Coefficient("7286977314969193")*B
+ - Coefficient("11790576937836090")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108510114168"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977247415199")*C
+ + Coefficient("11790576883792894")*D
+ >= Coefficient("-38155108289437784"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977251918799")*C
+ - Coefficient("11790576883792894")*D
+ >= Coefficient("-38155108280430584"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ + Coefficient("11790576852267696")*D
+ >= Coefficient("-38155108181351392"));
+ cs.insert(Coefficient("1125899906842624")*D
+ >= Coefficient("-2947644225451823"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ - Coefficient("11790576852267696")*D
+ >= Coefficient("-38155108167840592"));
+ cs.insert(Coefficient("-2251799813685248")*D
+ >= Coefficient("-5895288448651847"));
+ cs.insert(Coefficient("2251799813685248")*C
+ >= Coefficient("-5895288446400047"));
+ cs.insert(Coefficient("-2251799813685248")*C
+ >= Coefficient("-5895288444148247"));
+ cs.insert(Coefficient("-1125899906842624")*B
+ + Coefficient("1821744321986899")*C
+ + Coefficient("2947644226577723")*D
+ >= Coefficient("-9538777088122044"));
+ cs.insert(Coefficient("-3643488607945001")*B
+ + Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554059150500"));
+ cs.insert(Coefficient("-4503599627370496")*B
+ + Coefficient("7286977292451195")*C
+ - Coefficient("11790576906310892")*D
+ >= Coefficient("-38155108343480984"));
+ cs.insert(Coefficient("-7286977220393601")*B
+ + Coefficient("11790576829749698")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108086775800"));
+ cs.insert(Coefficient("-4503599627370496")*B
+ - Coefficient("7286977274436797")*C
+ + Coefficient("11790576901807292")*D
+ >= Coefficient("-38155108325466584"));
+ cs.insert(Coefficient("-3643488605693201")*B
+ - Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554059150500"));
+ cs.insert(Coefficient("-1125899906842624")*B
+ - Coefficient("1821744319735099")*C
+ - Coefficient("2947644225451823")*D
+ >= Coefficient("-9538777079114846"));
+ cs.insert(Coefficient("-7286977220393601")*B
+ - Coefficient("11790576834253298")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108113797400"));
+ cs.insert(Coefficient("-5895288462162645")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488639470198")*D
+ >= Coefficient("-19077554144718892"));
+ cs.insert(Coefficient("-11790576924325290")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977292451195")*D
+ >= Coefficient("-38155108320962984"));
+ cs.insert(Coefficient("-5895288468918045")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488641721998")*D
+ >= Coefficient("-19077554160481492"));
+ cs.insert(Coefficient("-11790576928828890")*B
+ - Coefficient("4503599627370496")*C
+ - Coefficient("7286977292451195")*D
+ >= Coefficient("-38155108329970184"));
+ cs.insert(Coefficient("-281474976710656")*B
+ >= Coefficient("-736911053829681"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("11790576658612912")*B
+ + Coefficient("7286977125818009")*C
+ >= Coefficient("-38155107627408640"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ + Coefficient("5895288336061856")*B
+ - Coefficient("3643488560657205")*C
+ >= Coefficient("-19077553829466920"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ + Coefficient("3643488535887407")*B
+ + Coefficient("5895288288774060")*D
+ >= Coefficient("-19077553683099932"));
+ cs.insert(Coefficient("-7286977274436797")*A
+ + Coefficient("11790576766699304")*B
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108032732608"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("7286977098796411")*B
+ - Coefficient("11790576609073318")*D
+ >= Coefficient("-38155107483293448"));
+ cs.insert(Coefficient("-7286977301458395")*A
+ + Coefficient("11790576735174106")*B
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155107983193008"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ + Coefficient("11790576708152508")*C
+ + Coefficient("7286977148336007")*D
+ >= Coefficient("-38155107771523824"));
+ cs.insert(Coefficient("-281474976710656")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ + Coefficient("281474976710656")*D
+ >= Coefficient("-1473822119481311"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("2947644178164027")*C
+ - Coefficient("1821744285958102")*D
+ >= Coefficient("-9538776941755056"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ + Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288471169845"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576856771296")*C
+ + Coefficient("7286977247415199")*D
+ >= Coefficient("-38155108221883792"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288471169845"));
+ cs.insert(Coefficient("-140737488355328")*A
+ - Coefficient("368455526774103")*C
+ - Coefficient("227718038700250")*D
+ >= Coefficient("-1192347131793131"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288464414445"));
+ cs.insert(Coefficient("-3643488643973798")*A
+ + Coefficient("2251799813685248")*B
+ + Coefficient("5895288441896447")*C
+ >= Coefficient("-19077554158229692"));
+ cs.insert(Coefficient("-7286977296954795")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576892800094")*C
+ >= Coefficient("-38155108352488176"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("7286977269933197")*B
+ + Coefficient("11790576924325290")*D
+ >= Coefficient("-38155108411034976"));
+ cs.insert(Coefficient("-3643488639470198")*A
+ + Coefficient("2251799813685248")*C
+ + Coefficient("5895288466666245")*D
+ >= Coefficient("-19077554219028288"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("7286977296954795")*B
+ - Coefficient("11790576955850488")*D
+ >= Coefficient("-38155108514617768"));
+ cs.insert(Coefficient("-7286977251918799")*A
+ + Coefficient("4503599627370496")*C
+ - Coefficient("11790576892800094")*D
+ >= Coefficient("-38155108311955784"));
+ cs.insert(Coefficient("-3643488655232797")*A
+ - Coefficient("2251799813685248")*C
+ + Coefficient("5895288480177044")*D
+ >= Coefficient("-19077554264064284"));
+ cs.insert(Coefficient("-1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644229955423")*D
+ >= Coefficient("-9538777099381044"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576874785696")*B
+ + Coefficient("7286977269933197")*C
+ >= Coefficient("-38155108302948584"));
+ cs.insert(Coefficient("-7286977274436797")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("11790576937836090")*C
+ >= Coefficient("-38155108424545776"));
+ cs.insert(Coefficient("-4503599627370496")*A
+ - Coefficient("11790576802728102")*B
+ - Coefficient("7286977197875603")*C
+ >= Coefficient("-38155108019221808"));
+ cs.insert(Coefficient("-3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288493687843")*C
+ >= Coefficient("-19077554284330480"));
+ cs.insert(Coefficient("-562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= Coefficient("-2947644250784571"));
+ cs.insert(Coefficient("-281474976710656")*A
+ - Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ - Coefficient("281474976710656")*D
+ >= Coefficient("-1473822131021785"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288464414445"));
+ cs.insert(Coefficient("-1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-5895288468918045"));
+ cs.insert(Coefficient("-3643488412038417")*A
+ - Coefficient("5895288318047457")*B
+ + Coefficient("2251799813685248")*D
+ >= Coefficient("-19077553665085532"));
+ cs.insert(Coefficient("-1821744199263809")*A
+ - Coefficient("2947644153394229")*B
+ - Coefficient("1125899906842624")*D
+ >= Coefficient("-9538776813402468"));
+ cs.insert(Coefficient("-5895288378846052")*A
+ + Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554023121704"));
+ cs.insert(Coefficient("-11790576834253298")*A
+ + Coefficient("7286977314969193")*B
+ - Coefficient("4503599627370496")*C
+ >= Coefficient("-38155108302948584"));
+ cs.insert(Coefficient("-736911041726257")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("455436077400500")*D
+ >= Coefficient("-2384694241068264"));
+ cs.insert(Coefficient("-5895288347320855")*A
+ + Coefficient("2251799813685248")*B
+ - Coefficient("3643488616952200")*D
+ >= Coefficient("-19077553951064108"));
+ cs.insert(Coefficient("-2947644201807925")*A
+ + Coefficient("1821744319735099")*C
+ + Coefficient("1125899906842624")*D
+ >= Coefficient("-9538777048715548"));
+ cs.insert(Coefficient("-11790576820742500")*A
+ + Coefficient("7286977296954795")*C
+ - Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108248905384"));
+ cs.insert(Coefficient("-11790576996382886")*A
+ - Coefficient("7286977251918799")*C
+ + Coefficient("4503599627370496")*D
+ >= Coefficient("-38155108523624968"));
+ cs.insert(Coefficient("-5895288507198642")*A
+ - Coefficient("3643488632714799")*C
+ - Coefficient("2251799813685248")*D
+ >= Coefficient("-19077554291085880"));
+ cs.insert(Coefficient("-11790577113476476")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("7286977319472793")*D
+ >= Coefficient("-38155108861394936"));
+ cs.insert(Coefficient("-5895288572500836")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("3643488652980997")*D
+ >= Coefficient("-19077554450963668"));
+ cs.insert(Coefficient("-5895288484680644")*A
+ - Coefficient("3643488607945001")*B
+ + Coefficient("2251799813685248")*C
+ >= Coefficient("-19077554212272888"));
+ cs.insert(Coefficient("-2947644274991419")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= Coefficient("-9538777190578936"));
+ cs.insert(Coefficient("-2251799813685248")*A
+ >= Coefficient("-5895288448651847"));
+
+ // Cost function
+ Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+
+ Coefficient num;
+ Coefficient den;
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+
+ return true;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression cost(A + B);
+ Constraint_System cs;
+ cs.insert(-A - B >= -8);
+ cs.insert(-A - 3*B >= -18);
+ cs.insert(-A + B >= -4);
+ cs.insert(A >= 0);
+ cs.insert(A <= 3);
+ cs.insert(B >= 0);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ const Coefficient num_kr = 8;
+ const Coefficient den_kr = 1;
+ Coefficient num;
+ Coefficient den;
+
+ Generator pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(3*A + 5*B);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable A to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable B to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(B));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ return true;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression cost(A + B);
+ Constraint_System cs;
+ cs.insert(-A - 3*B >= -4);
+ cs.insert(-5*A - B >= -5);
+ cs.insert(-3*A - 2*B >= -2);
+ cs.insert(A + 3*B >= -1);
+ cs.insert(2*A - B >= -2);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Coefficient num_kr = 8;
+ Coefficient den_kr = 7;
+ Coefficient num;
+ Coefficient den;
+
+ Generator pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(-2*A + 10*B, 7);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable A to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ num_kr = 1;
+ den_kr = 1;
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ pg_kr = point(B);
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable B to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(B));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ return true;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D >= 0);
+ cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+ cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+ cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+ cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+ cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+ cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+ cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+ cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+ cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+ cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+ cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+ cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+ cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+ cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+ cs.insert(-8554*A - 48955*B >= -10000);
+ cs.insert(-257370*C - 312877*D >= -10000);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Coefficient num_kr = Coefficient("8231960000");
+ Coefficient den_kr = 581120267;
+ Coefficient num;
+ Coefficient den;
+
+ Generator pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(679355000*A + 19925000*C + 0*D, 581120267);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable A to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ num_kr = Coefficient("81926256268");
+ den_kr = Coefficient("6651564805");
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ pg_kr = point(Coefficient("6651564805")*A + 196469466*B + 232165453*C + 0*D,
+ Coefficient("6651564805"));
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable B to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(B));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ num_kr = 1646392;
+ den_kr = 135871;
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ pg_kr = point(135871*A + 3985*C + 0*D, 135871);
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable C to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(C));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ num_kr = 2335041;
+ den_kr = 193393;
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ pg_kr = point(193393*A + 4775*D, 193393);
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable D to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(D));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ num_kr = 12;
+ den_kr = 1;
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ pg_kr = point(A + 0*D);
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ return true;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression cost(A + B + C);
+ Constraint_System cs;
+ cs.insert(A >= -1);
+ cs.insert(B >= -1);
+ cs.insert(C >= -1);
+ cs.insert(-A >= -1);
+ cs.insert(-B >= -1);
+ cs.insert(-C >= -1);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+ Coefficient num_kr = 3;
+ Coefficient den_kr = 1;
+ Coefficient num;
+ Coefficient den;
+
+ Generator pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(A + B + C);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable A to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable B to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(B));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set variable C to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(C));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ return true;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A + B <= 1);
+ cs.insert(A + C <= 1);
+ cs.insert(B + C <= 1);
+
+ // All integer variables.
+ Variables_Set ivs(A, C);
+
+ // Cost function.
+ Linear_Expression cost(-2*A - 3*B - 4*C);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+ MINIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+ DO_TEST_F32(test02);
+ DO_TEST_F64(test03);
+ DO_TEST_F32(test04);
+ DO_TEST_F64(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST_F64(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem2.cc b/tests/MIP_Problem/mipproblem2.cc
new file mode 100644
index 0000000..73b74fa
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem2.cc
@@ -0,0 +1,176 @@
+/* Test the MIP_Problem class with instances that require a watchdog timer.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+class Timeout : virtual public std::exception,
+ public Parma_Polyhedra_Library::Throwable {
+public:
+ const char* what() const throw() {
+ return "Timeout in refine1.cc";
+ }
+
+ void throw_me() const {
+ throw *this;
+ }
+
+ int priority() const {
+ return 0;
+ }
+
+ Timeout() {
+ }
+
+ ~Timeout() throw() {
+ }
+};
+
+Timeout t;
+
+bool test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression cost(10*A + 3*B);
+ Constraint_System cs;
+ cs.insert(A + B >= 0);
+ cs.insert(B >= 0);
+ cs.insert(B == 3);
+ cs.insert(2*C + 2*D == 9);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MINIMIZATION);
+ Coefficient num_kr = -21;
+ Coefficient den_kr = 1;
+ Coefficient num;
+ Coefficient den;
+ Generator pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(-6*A + 6*B + 9*D, 2);
+ if (pg != pg_kr)
+ return false;
+
+ // Set Variable A to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set Variable B to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(B));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set Variable C to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(C));
+ pg = mip.optimizing_point();
+ mip.evaluate_objective_function(pg, num, den);
+
+ nout << "Optimum value = " << num << "/" << den << endl;
+ if (num != num_kr || den != den_kr)
+ return false;
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ if (pg != pg_kr)
+ return false;
+
+ // Set Variable D to be constrained to have an integer value.
+ // This will cause branch-and-bound not to terminate any longer.
+ mip.add_to_integer_space_dimensions(Variables_Set(D));
+
+ try {
+ // Set a 2 seconds timeout.
+ Parma_Polyhedra_Library::Watchdog
+ w(200, abandon_expensive_computations, t);
+
+ pg = mip.optimizing_point();
+
+ // We should never get here.
+ abandon_expensive_computations = 0;
+ nout << "unexpected termination" << endl;
+ return false;
+ }
+ catch (const Timeout&) {
+ abandon_expensive_computations = 0;
+ nout << "timeout, as expected" << endl;
+ return true;
+ }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ // If Watchdog objects are not supported, an std::logic_error exception
+ // will be thrown: this is normal.
+ catch (const std::logic_error& e) {
+ nout << "std::logic_error exception caught: \n" << e.what() << std::endl;
+ exit(0);
+ }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ catch (const std::overflow_error& e) {
+ abandon_expensive_computations = 0;
+ if (std::numeric_limits<Coefficient>::is_integer
+ && std::numeric_limits<Coefficient>::is_bounded
+ && std::numeric_limits<Coefficient>::radix == 2
+ && std::numeric_limits<Coefficient>::digits == 7) {
+ // Overflow is OK with 8-bit coefficients.
+ nout << "arithmetic overflow (" << e.what() << "),"
+ " possible with 8-bit coefficients" << endl;
+ return true;
+ }
+ else
+ // Overflow errors should be propagated in all other cases.
+ throw;
+ }
+ catch (...) {
+ abandon_expensive_computations = 0;
+ nout << "unexpected exception" << endl;
+ return false;
+ }
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem3.cc b/tests/MIP_Problem/mipproblem3.cc
new file mode 100644
index 0000000..6b2d8a0
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem3.cc
@@ -0,0 +1,900 @@
+/* Test the MIP_Problem class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(-2*A - B >= -5);
+ cs.insert(4*A -4*B >= -5);
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+
+ // All integer variables.
+ Variables_Set ivs(A, B);
+
+ // Objective function.
+ Linear_Expression cost(A - 2*B);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+ MAXIMIZATION);
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ mip.set_optimization_mode(MINIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ return true;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(Coefficient("-3152519739159347")*A
+ - Coefficient("4503599627370496")*B
+ >= Coefficient("-2837267765243412480"));
+ cs.insert(Coefficient("-14411518807585588")*A
+ - Coefficient("3602879701896397")*B
+ >= Coefficient("-19455550390240542720"));
+ cs.insert(Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712")*A
+ >= Coefficient("134217729"));
+ cs.insert(B >= 20);
+ cs.insert(-B >= -500);
+
+ // Integer variables.
+ Variables_Set ivs(A);
+
+ // Cost function
+ Linear_Expression cost(-4*A - B);
+
+ MIP_Problem mip = MIP_Problem(cs.space_dimension(),
+ cs.begin(), cs.end(),
+ ivs,
+ cost,
+ MINIMIZATION);
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+
+ Coefficient num;
+ Coefficient den;
+ mip.evaluate_objective_function(pg, num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+
+ return true;
+}
+
+bool
+test03() {
+ MIP_Problem mip = MIP_Problem();
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point();
+ if (pg != pg_kr)
+ return false;
+ return true;
+}
+
+bool
+test04() {
+ MIP_Problem mip = MIP_Problem();
+ mip.add_constraint(Linear_Expression::zero() <= 1);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ Generator pg_kr = point();
+ if (pg != pg_kr)
+ return false;
+ mip.add_constraint(Linear_Expression::zero() >= 1);
+ return !mip.is_satisfiable();
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 3);
+ cs.insert(B >= 0);
+ cs.insert(-A - B >= -8);
+ cs.insert(-A - 3*B >= -18);
+ cs.insert(-A + B >= -4);
+
+ // All integer variables.
+ Variables_Set ivs(A, B);
+
+ // Cost function.
+ Linear_Expression cost(A + B);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+ MAXIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ return pg == point(3*A + 5*B);
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(-A - 3*B >= -4);
+ cs.insert(-5*A - B >= -5);
+ cs.insert(-3*A - 2*B >= -2);
+ cs.insert(A + 3*B >= -1);
+ cs.insert(2*A - B >= -2);
+
+ // Cost function.
+ Linear_Expression cost(A + B);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+ MAXIMIZATION);
+ // Disallow floating point based steepest-edge pricing, so that
+ // predictable overflow behavior is obtained when configured
+ // to use checked 8-bit integers as coefficients.
+ mip.set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_EXACT);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ return pg == point(-2*A + 10*B, 7);
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A + B >= 0);
+ cs.insert(B >= 0);
+ cs.insert(B == 3);
+ cs.insert(2*C + 2*D == 9);
+
+ // Cost function.
+ Linear_Expression cost(10*A + 6*B);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+ MINIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ Coefficient num;
+ Coefficient den;
+ mip.optimal_value(num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = -12;
+ Coefficient den_kr = 1;
+
+ return num == num_kr && den == den_kr;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(Coefficient("2251799813685248")*A
+ >= -Coefficient("5895288448651847"));
+ cs.insert(Coefficient("5895288437392848")*A
+ + Coefficient("3643488632714799")*B
+ - Coefficient("2251799813685248")*C
+ >= -Coefficient("19077554137963492"));
+ cs.insert(Coefficient("5895288437392848")*A
+ + Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C
+ >= -Coefficient("19077554137963492"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("7286977274436797")*D
+ >= -Coefficient("38155108284934184"));
+ cs.insert(Coefficient("11790576874785696")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= -Coefficient("38155108284934184"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ + Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108289437784"));
+ cs.insert(Coefficient("11790576879289294")*A
+ - Coefficient("7286977274436797")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108289437784"));
+ cs.insert(Coefficient("2947644225451823")*A
+ - Coefficient("1125899906842624")*B
+ + Coefficient("1821744319735099")*D
+ >= -Coefficient("9538777088122044"));
+ cs.insert(Coefficient("11790576892800094")*A
+ - Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*D
+ >= -Coefficient("38155108325466584"));
+ cs.insert(Coefficient("5895288437392848")*A
+ - Coefficient("3643488630462999")*B
+ + Coefficient("2251799813685248")*C
+ >= -Coefficient("19077554133459892"));
+ cs.insert(Coefficient("2947644218696424")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= -Coefficient("9538777072359446"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108379509776"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("11790576924325290")*B
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108379509776"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= -Coefficient("2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= -Coefficient("2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= -Coefficient("2947644225451823"));
+ cs.insert(Coefficient("562949953421312")*A
+ + Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= -Coefficient("2947644225451823"));
+ cs.insert(Coefficient("7286977269933197")*A
+ + Coefficient("4503599627370496")*B
+ + Coefficient("11790576865778496")*C
+ >= -Coefficient("38155108266919784"));
+ cs.insert(Coefficient("7286977251918799")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576870282096")*C
+ >= -Coefficient("38155108244401792"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ + Coefficient("2947644226577723")*D
+ >= -Coefficient("9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ + Coefficient("1125899906842624")*C
+ - Coefficient("2947644226577723")*D
+ >= -Coefficient("9538777093751544"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ + Coefficient("2947644228829523")*D
+ >= -Coefficient("9538777096003344"));
+ cs.insert(Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644228829523")*D
+ >= -Coefficient("9538777096003344"));
+ cs.insert(Coefficient("3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ + Coefficient("5895288468918045")*C
+ >= -Coefficient("19077554257308884"));
+ cs.insert(Coefficient("3643488652980997")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288468918045")*C
+ >= -Coefficient("19077554232539084"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= -Coefficient("2947644226577723"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= -Coefficient("2947644229392473"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= -Coefficient("2947644227140673"));
+ cs.insert(Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ - Coefficient("562949953421312")*C
+ - Coefficient("562949953421312")*D
+ >= -Coefficient("2947644227703623"));
+ cs.insert(Coefficient("7286977314969193")*A
+ - Coefficient("11790576906310892")*B
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108447063768"));
+ cs.insert(Coefficient("3643488655232797")*A
+ - Coefficient("5895288446400047")*B
+ - Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554203265688"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*B
+ + Coefficient("7286977179861205")*C
+ >= -Coefficient("38155107920142616"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576766699304")*B
+ - Coefficient("7286977179861205")*C
+ >= -Coefficient("38155107965178608"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("7286977157343207")*B
+ + Coefficient("11790576712656108")*D
+ >= -Coefficient("38155107816559824"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("3643488592182402")*B
+ - Coefficient("5895288374342453")*D
+ >= -Coefficient("19077553960071308"));
+ cs.insert(Coefficient("4503599627370496")*A
+ + Coefficient("11790576753188506")*C
+ + Coefficient("7286977175357605")*D
+ >= -Coefficient("38155107924646216"));
+ cs.insert(Coefficient("2251799813685248")*A
+ + Coefficient("5895288390105051")*C
+ - Coefficient("3643488594434202")*D
+ >= -Coefficient("19077553996100104"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288421630249")*C
+ + Coefficient("3643488619204000")*D
+ >= -Coefficient("19077554088423896"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576865778496")*C
+ - Coefficient("7286977247415199")*D
+ >= -Coefficient("38155108244401792"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("7286977247415199")*B
+ + Coefficient("11790576888296494")*D
+ >= -Coefficient("38155108307452184"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("3643488639470198")*B
+ - Coefficient("5895288464414445")*D
+ >= -Coefficient("19077554210021088"));
+ cs.insert(Coefficient("2251799813685248")*A
+ - Coefficient("5895288428385648")*B
+ + Coefficient("3643488630462999")*C
+ >= -Coefficient("19077554131208092"));
+ cs.insert(Coefficient("4503599627370496")*A
+ - Coefficient("11790576843260498")*B
+ - Coefficient("7286977224897201")*C
+ >= -Coefficient("38155108163336992"));
+ cs.insert(Coefficient("1125899906842624")*B
+ >= -Coefficient("2947644227703623"));
+ cs.insert(Coefficient("5895288459910846")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488630462999")*D
+ >= -Coefficient("19077554198762088"));
+ cs.insert(Coefficient("5895288457659046")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488628211199")*D
+ >= -Coefficient("19077554189754888"));
+ cs.insert(Coefficient("11790576915318092")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977269933197")*D
+ >= -Coefficient("38155108393020576"));
+ cs.insert(Coefficient("5895288457659046")*B
+ - Coefficient("2251799813685248")*C
+ - Coefficient("3643488632714799")*D
+ >= -Coefficient("19077554187503088"));
+ cs.insert(Coefficient("7286977292451195")*B
+ + Coefficient("11790576919821692")*C
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108433552976"));
+ cs.insert(Coefficient("3643488664239996")*B
+ + Coefficient("5895288486932443")*C
+ - Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554304596680"));
+ cs.insert(Coefficient("3643488643973798")*B
+ - Coefficient("5895288446400047")*C
+ + Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554180747688"));
+ cs.insert(Coefficient("7286977314969193")*B
+ - Coefficient("11790576937836090")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108510114168"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977247415199")*C
+ + Coefficient("11790576883792894")*D
+ >= -Coefficient("38155108289437784"));
+ cs.insert(Coefficient("4503599627370496")*B
+ + Coefficient("7286977251918799")*C
+ - Coefficient("11790576883792894")*D
+ >= -Coefficient("38155108280430584"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ + Coefficient("11790576852267696")*D
+ >= -Coefficient("38155108181351392"));
+ cs.insert(Coefficient("1125899906842624")*D
+ >= -Coefficient("2947644225451823"));
+ cs.insert(Coefficient("4503599627370496")*B
+ - Coefficient("7286977229400801")*C
+ - Coefficient("11790576852267696")*D
+ >= -Coefficient("38155108167840592"));
+ cs.insert(-Coefficient("2251799813685248")*D
+ >= -Coefficient("5895288448651847"));
+ cs.insert(Coefficient("2251799813685248")*C
+ >= -Coefficient("5895288446400047"));
+ cs.insert(-Coefficient("2251799813685248")*C
+ >= -Coefficient("5895288444148247"));
+ cs.insert(-Coefficient("1125899906842624")*B
+ + Coefficient("1821744321986899")*C
+ + Coefficient("2947644226577723")*D
+ >= -Coefficient("9538777088122044"));
+ cs.insert(-Coefficient("3643488607945001")*B
+ + Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554059150500"));
+ cs.insert(-Coefficient("4503599627370496")*B
+ + Coefficient("7286977292451195")*C
+ - Coefficient("11790576906310892")*D
+ >= -Coefficient("38155108343480984"));
+ cs.insert(-Coefficient("7286977220393601")*B
+ + Coefficient("11790576829749698")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108086775800"));
+ cs.insert(-Coefficient("4503599627370496")*B
+ - Coefficient("7286977274436797")*C
+ + Coefficient("11790576901807292")*D
+ >= -Coefficient("38155108325466584"));
+ cs.insert(-Coefficient("3643488605693201")*B
+ - Coefficient("5895288414874849")*C
+ + Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554059150500"));
+ cs.insert(-Coefficient("1125899906842624")*B
+ - Coefficient("1821744319735099")*C
+ - Coefficient("2947644225451823")*D
+ >= -Coefficient("9538777079114846"));
+ cs.insert(-Coefficient("7286977220393601")*B
+ - Coefficient("11790576834253298")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108113797400"));
+ cs.insert(-Coefficient("5895288462162645")*B
+ + Coefficient("2251799813685248")*C
+ + Coefficient("3643488639470198")*D
+ >= -Coefficient("19077554144718892"));
+ cs.insert(-Coefficient("11790576924325290")*B
+ - Coefficient("4503599627370496")*C
+ + Coefficient("7286977292451195")*D
+ >= -Coefficient("38155108320962984"));
+ cs.insert(-Coefficient("5895288468918045")*B
+ + Coefficient("2251799813685248")*C
+ - Coefficient("3643488641721998")*D
+ >= -Coefficient("19077554160481492"));
+ cs.insert(-Coefficient("11790576928828890")*B
+ - Coefficient("4503599627370496")*C
+ - Coefficient("7286977292451195")*D
+ >= -Coefficient("38155108329970184"));
+ cs.insert(-Coefficient("281474976710656")*B
+ >= -Coefficient("736911053829681"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ + Coefficient("11790576658612912")*B
+ + Coefficient("7286977125818009")*C
+ >= -Coefficient("38155107627408640"));
+ cs.insert(-Coefficient("2251799813685248")*A
+ + Coefficient("5895288336061856")*B
+ - Coefficient("3643488560657205")*C
+ >= -Coefficient("19077553829466920"));
+ cs.insert(-Coefficient("2251799813685248")*A
+ + Coefficient("3643488535887407")*B
+ + Coefficient("5895288288774060")*D
+ >= -Coefficient("19077553683099932"));
+ cs.insert(-Coefficient("7286977274436797")*A
+ + Coefficient("11790576766699304")*B
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108032732608"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ + Coefficient("7286977098796411")*B
+ - Coefficient("11790576609073318")*D
+ >= -Coefficient("38155107483293448"));
+ cs.insert(-Coefficient("7286977301458395")*A
+ + Coefficient("11790576735174106")*B
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155107983193008"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ + Coefficient("11790576708152508")*C
+ + Coefficient("7286977148336007")*D
+ >= -Coefficient("38155107771523824"));
+ cs.insert(-Coefficient("281474976710656")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ + Coefficient("281474976710656")*D
+ >= -Coefficient("1473822119481311"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ + Coefficient("2947644178164027")*C
+ - Coefficient("1821744285958102")*D
+ >= -Coefficient("9538776941755056"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ + Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= -Coefficient("5895288471169845"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ - Coefficient("11790576856771296")*C
+ + Coefficient("7286977247415199")*D
+ >= -Coefficient("38155108221883792"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= -Coefficient("5895288471169845"));
+ cs.insert(-Coefficient("140737488355328")*A
+ - Coefficient("368455526774103")*C
+ - Coefficient("227718038700250")*D
+ >= -Coefficient("1192347131793131"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ + Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= -Coefficient("5895288464414445"));
+ cs.insert(-Coefficient("3643488643973798")*A
+ + Coefficient("2251799813685248")*B
+ + Coefficient("5895288441896447")*C
+ >= -Coefficient("19077554158229692"));
+ cs.insert(-Coefficient("7286977296954795")*A
+ + Coefficient("4503599627370496")*B
+ - Coefficient("11790576892800094")*C
+ >= -Coefficient("38155108352488176"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ - Coefficient("7286977269933197")*B
+ + Coefficient("11790576924325290")*D
+ >= -Coefficient("38155108411034976"));
+ cs.insert(-Coefficient("3643488639470198")*A
+ + Coefficient("2251799813685248")*C
+ + Coefficient("5895288466666245")*D
+ >= -Coefficient("19077554219028288"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ - Coefficient("7286977296954795")*B
+ - Coefficient("11790576955850488")*D
+ >= -Coefficient("38155108514617768"));
+ cs.insert(-Coefficient("7286977251918799")*A
+ + Coefficient("4503599627370496")*C
+ - Coefficient("11790576892800094")*D
+ >= -Coefficient("38155108311955784"));
+ cs.insert(-Coefficient("3643488655232797")*A
+ - Coefficient("2251799813685248")*C
+ + Coefficient("5895288480177044")*D
+ >= -Coefficient("19077554264064284"));
+ cs.insert(-Coefficient("1821744320860999")*A
+ - Coefficient("1125899906842624")*C
+ - Coefficient("2947644229955423")*D
+ >= -Coefficient("9538777099381044"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ - Coefficient("11790576874785696")*B
+ + Coefficient("7286977269933197")*C
+ >= -Coefficient("38155108302948584"));
+ cs.insert(-Coefficient("7286977274436797")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("11790576937836090")*C
+ >= -Coefficient("38155108424545776"));
+ cs.insert(-Coefficient("4503599627370496")*A
+ - Coefficient("11790576802728102")*B
+ - Coefficient("7286977197875603")*C
+ >= -Coefficient("38155108019221808"));
+ cs.insert(-Coefficient("3643488664239996")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("5895288493687843")*C
+ >= -Coefficient("19077554284330480"));
+ cs.insert(-Coefficient("562949953421312")*A
+ - Coefficient("562949953421312")*B
+ + Coefficient("562949953421312")*C
+ + Coefficient("562949953421312")*D
+ >= -Coefficient("2947644250784571"));
+ cs.insert(-Coefficient("281474976710656")*A
+ - Coefficient("281474976710656")*B
+ + Coefficient("281474976710656")*C
+ - Coefficient("281474976710656")*D
+ >= -Coefficient("1473822131021785"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ + Coefficient("1125899906842624")*D
+ >= -Coefficient("5895288464414445"));
+ cs.insert(-Coefficient("1125899906842624")*A
+ - Coefficient("1125899906842624")*B
+ - Coefficient("1125899906842624")*C
+ - Coefficient("1125899906842624")*D
+ >= -Coefficient("5895288468918045"));
+ cs.insert(-Coefficient("3643488412038417")*A
+ - Coefficient("5895288318047457")*B
+ + Coefficient("2251799813685248")*D
+ >= -Coefficient("19077553665085532"));
+ cs.insert(-Coefficient("1821744199263809")*A
+ - Coefficient("2947644153394229")*B
+ - Coefficient("1125899906842624")*D
+ >= -Coefficient("9538776813402468"));
+ cs.insert(-Coefficient("5895288378846052")*A
+ + Coefficient("3643488632714799")*B
+ + Coefficient("2251799813685248")*C
+ >= -Coefficient("19077554023121704"));
+ cs.insert(-Coefficient("11790576834253298")*A
+ + Coefficient("7286977314969193")*B
+ - Coefficient("4503599627370496")*C
+ >= -Coefficient("38155108302948584"));
+ cs.insert(-Coefficient("736911041726257")*A
+ + Coefficient("281474976710656")*B
+ + Coefficient("455436077400500")*D
+ >= -Coefficient("2384694241068264"));
+ cs.insert(-Coefficient("5895288347320855")*A
+ + Coefficient("2251799813685248")*B
+ - Coefficient("3643488616952200")*D
+ >= -Coefficient("19077553951064108"));
+ cs.insert(-Coefficient("2947644201807925")*A
+ + Coefficient("1821744319735099")*C
+ + Coefficient("1125899906842624")*D
+ >= -Coefficient("9538777048715548"));
+ cs.insert(-Coefficient("11790576820742500")*A
+ + Coefficient("7286977296954795")*C
+ - Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108248905384"));
+ cs.insert(-Coefficient("11790576996382886")*A
+ - Coefficient("7286977251918799")*C
+ + Coefficient("4503599627370496")*D
+ >= -Coefficient("38155108523624968"));
+ cs.insert(-Coefficient("5895288507198642")*A
+ - Coefficient("3643488632714799")*C
+ - Coefficient("2251799813685248")*D
+ >= -Coefficient("19077554291085880"));
+ cs.insert(-Coefficient("11790577113476476")*A
+ - Coefficient("4503599627370496")*B
+ + Coefficient("7286977319472793")*D
+ >= -Coefficient("38155108861394936"));
+ cs.insert(-Coefficient("5895288572500836")*A
+ - Coefficient("2251799813685248")*B
+ - Coefficient("3643488652980997")*D
+ >= -Coefficient("19077554450963668"));
+ cs.insert(-Coefficient("5895288484680644")*A
+ - Coefficient("3643488607945001")*B
+ + Coefficient("2251799813685248")*C
+ >= -Coefficient("19077554212272888"));
+ cs.insert(-Coefficient("2947644274991419")*A
+ - Coefficient("1821744320860999")*B
+ - Coefficient("1125899906842624")*C
+ >= -Coefficient("9538777190578936"));
+ cs.insert(-Coefficient("2251799813685248")*A
+ >= -Coefficient("5895288448651847"));
+
+ // Cost function.
+ Linear_Expression cost(A + B + C + D);
+
+ // All integer variables.
+ Variables_Set ivs(A, D);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+ MINIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ Coefficient num;
+ Coefficient den;
+ mip.optimal_value(num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = -5;
+ Coefficient den_kr = 1;
+
+ return pg == point(-A - 2*B - C - D)
+ && num == num_kr && den == den_kr;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ cs.insert(C >= 0);
+ cs.insert(D >= 0);
+ cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+ cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+ cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+ cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+ cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+ cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+ cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+ cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+ cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+ cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+ cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+ cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+ cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+ cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+ cs.insert(-8554*A - 48955*B >= -10000);
+ cs.insert(-257370*C - 312877*D >= -10000);
+
+ // Cost function.
+ Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+ MAXIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ Coefficient num;
+ Coefficient den;
+ mip.optimal_value(num, den);
+ nout << "Optimum value = " << num << "/" << den << endl;
+ Coefficient num_kr = Coefficient("8231960000");
+ Coefficient den_kr = 581120267;
+
+ return pg == point(679355000*A + 19925000*C + 0*D, 581120267)
+ && num == num_kr && den == den_kr;
+}
+
+bool
+test10() {
+ Variable x1(0);
+ Variable x2(1);
+
+ // Feasible region.
+ Constraint_System cs;
+ cs.insert(Coefficient("-3152519739159347")*x1
+ - Coefficient("4503599627370496")*x2
+ >= Coefficient("-2837267765243412480"));
+ cs.insert(Coefficient("-14411518807585588")*x1
+ - Coefficient("3602879701896397")*x2
+ >= Coefficient("-19455550390240542720"));
+ cs.insert(Coefficient("25300281663413827294061918339864663381194581220517764794612669753428792445999418361495047962679640561898384733039601488923726092173224184608376674992592313740189678034570795170558363467761652042654970959809093133570250935428086587327262919456144944542601257064044846194041676826903812816523290938580750782913463467636686848")*x1
+ >= Coefficient("17591821432561"));
+ cs.insert(x2 >= 20);
+ cs.insert(-x2 >= -500);
+
+ // Cost function.
+ Linear_Expression cost(4*x1 + x2);
+
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+ MAXIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ Generator pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ Coefficient num;
+ Coefficient den;
+ mip.optimal_value(num, den);
+ nout << "Maximum value = " << num << "/" << den << endl;
+
+ if (pg != point(Coefficient("2747195772696002560")*x1
+ + Coefficient("63050394783186940")*x2,
+ Coefficient("3152519739159347"))
+ || num != Coefficient("11051833485567197180")
+ || den != Coefficient("3152519739159347"))
+ return false;
+
+ mip.set_optimization_mode(MINIMIZATION);
+
+ if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+ return false;
+
+ pg = mip.optimizing_point();
+ nout << "Optimizing point = ";
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << pg << endl;
+
+ mip.optimal_value(num, den);
+ nout << "Minimum value = " << num << "/" << den << endl;
+
+ if (pg != point(Coefficient("17591821432561")*x1 + Coefficient("506005633268276545881238366797293267623891624410355295892253395068575848919988367229900959253592811237967694660792029778474521843464483692167533499851846274803793560691415903411167269355233040853099419196181862671405018708561731746545258389122898890852025141280896923880833536538076256330465818771615015658269269352733736960")*x2, Coefficient("2530028166341382729406191833986466338119458122051776479461266975342879244599941836 [...]
+ || num != Coefficient("126501408317069136470309591699323316905972906102588823973063348767143962229997091807475239813398202809491923665198007444618630460866120923041883374962961568700948390172853975852791817338808260213274854799045465667851254677140432936636314597280724722713006285320224230970208384134519064082616454692903753914567334930004866801")
+ || den != Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712"))
+ return false;
+
+ return true;
+}
+
+}
+
+// namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F64(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST_F8(test06);
+ DO_TEST(test07);
+ DO_TEST_F64(test08);
+ DO_TEST_F64(test09);
+ DO_TEST_F64(test10);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem4.cc b/tests/MIP_Problem/mipproblem4.cc
new file mode 100644
index 0000000..ead6d5e
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem4.cc
@@ -0,0 +1,55 @@
+/* Test the MIP_Problem class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ MIP_Problem mip(0);
+ mip.is_satisfiable();
+ mip.set_optimization_mode(MINIMIZATION);
+ mip.solve();
+ return true;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ MIP_Problem mip(1);
+ Generator p1 = mip.optimizing_point();
+ bool ok1 = (p1 == point(0*A));
+ mip.add_space_dimensions_and_embed(1);
+ Generator p2 = mip.optimizing_point();
+ bool ok2 = (p2 == point(0*A + 0*B));
+ return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..065145f
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,59 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = \
+. \
+Concrete_Expression \
+CO_Tree \
+PIP_Problem \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid \
+Watchdog
+
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+
+check_LIBRARIES = libppl_tests.a
+
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+ppl_test.cc
+
+LDADD = \
+$(top_builddir)/src/libppl.la \
+libppl_tests.a \
+ at extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+Random_Number_Generator_defs.hh \
+Random_Number_Generator_inlines.hh \
+Random_Number_Generator_types.hh
+
+EXTRA_DIST = valgrind_suppressions
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..b62176e
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,861 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(noinst_HEADERS) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libppl_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_tests_a_LIBADD =
+am_libppl_tests_a_OBJECTS = files.$(OBJEXT) ppl_test.$(OBJEXT)
+libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_tests_a_SOURCES)
+DIST_SOURCES = $(libppl_tests_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = \
+. \
+Concrete_Expression \
+CO_Tree \
+PIP_Problem \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid \
+Watchdog
+
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+check_LIBRARIES = libppl_tests.a
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+ppl_test.cc
+
+LDADD = \
+$(top_builddir)/src/libppl.la \
+libppl_tests.a \
+ at extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+Random_Number_Generator_defs.hh \
+Random_Number_Generator_inlines.hh \
+Random_Number_Generator_types.hh
+
+EXTRA_DIST = valgrind_suppressions
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkLIBRARIES:
+ -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+
+libppl_tests.a: $(libppl_tests_a_OBJECTS) $(libppl_tests_a_DEPENDENCIES) $(EXTRA_libppl_tests_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libppl_tests.a
+ $(AM_V_AR)$(libppl_tests_a_AR) libppl_tests.a $(libppl_tests_a_OBJECTS) $(libppl_tests_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libppl_tests.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/files.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_test.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES)
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-checkLIBRARIES clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-checkLIBRARIES clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Octagonal_Shape/Makefile.am b/tests/Octagonal_Shape/Makefile.am
new file mode 100644
index 0000000..927fc7e
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.am
@@ -0,0 +1,319 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affineimage2 \
+affinepreimage1 \
+affinepreimage2 \
+ascii_dump_load1 \
+bhz03widening1 \
+bhmz05widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+bounds1 \
+cc76extrapolation1 \
+cc76narrowing1 \
+chinainit \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+empty1 \
+expandspacedim1 \
+frequency1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 \
+generalizedaffineimage2 \
+generalizedaffineimage3 \
+generalizedaffineimage4 \
+generalizedaffineimage5 \
+generalizedaffinepreimage1 \
+generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+generalizedaffinepreimage4 \
+integerupperboundifexact1 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+relatwithcons1 \
+relatwithcons2 \
+relatwithcons3 \
+relatwithgen1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writeoctagon1
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+chinainit_SOURCES = chinainit.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+empty1_SOURCES = empty1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+
+relatwithgen1_SOURCES = relatwithgen1.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writeoctagon1_SOURCES = writeoctagon1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Octagonal_Shape/Makefile.in b/tests/Octagonal_Shape/Makefile.in
new file mode 100644
index 0000000..7ba226c
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.in
@@ -0,0 +1,1870 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addspacedims1$(EXEEXT) affinedimension1$(EXEEXT) \
+ affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+ affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+ ascii_dump_load1$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bhmz05widening1$(EXEEXT) bounded1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+ bounds1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+ cc76narrowing1$(EXEEXT) chinainit$(EXEEXT) \
+ concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+ constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+ discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+ dropsomenonintegerpoints1$(EXEEXT) empty1$(EXEEXT) \
+ expandspacedim1$(EXEEXT) frequency1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) frombdshape1$(EXEEXT) \
+ frombox1$(EXEEXT) fromgensys1$(EXEEXT) fromgrid1$(EXEEXT) \
+ fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+ fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffineimage3$(EXEEXT) \
+ generalizedaffineimage4$(EXEEXT) \
+ generalizedaffineimage5$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) \
+ generalizedaffinepreimage3$(EXEEXT) \
+ generalizedaffinepreimage4$(EXEEXT) \
+ integerupperboundifexact1$(EXEEXT) intersection1$(EXEEXT) \
+ limitedbhmz05extrapolation1$(EXEEXT) \
+ limitedcc76extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+ max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+ membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+ relatwithcons1$(EXEEXT) relatwithcons2$(EXEEXT) \
+ relatwithcons3$(EXEEXT) relatwithgen1$(EXEEXT) \
+ removespacedims1$(EXEEXT) simplifyusingcontext1$(EXEEXT) \
+ timeelapse1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+ upperbound1$(EXEEXT) upperboundifexact1$(EXEEXT) \
+ wrap1$(EXEEXT) writeoctagon1$(EXEEXT)
+XFAIL_TESTS =
+subdir = tests/Octagonal_Shape
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+ $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_chinainit_OBJECTS = chinainit.$(OBJEXT)
+chinainit_OBJECTS = $(am_chinainit_OBJECTS)
+chinainit_LDADD = $(LDADD)
+chinainit_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS = \
+ dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS = \
+ $(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS = \
+ generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS = \
+ $(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS = \
+ generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS = \
+ $(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage4_OBJECTS = \
+ generalizedaffineimage4.$(OBJEXT)
+generalizedaffineimage4_OBJECTS = \
+ $(am_generalizedaffineimage4_OBJECTS)
+generalizedaffineimage4_LDADD = $(LDADD)
+generalizedaffineimage4_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage5_OBJECTS = \
+ generalizedaffineimage5.$(OBJEXT)
+generalizedaffineimage5_OBJECTS = \
+ $(am_generalizedaffineimage5_OBJECTS)
+generalizedaffineimage5_LDADD = $(LDADD)
+generalizedaffineimage5_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS = \
+ generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS = \
+ $(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS = \
+ generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS = \
+ $(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS = \
+ generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS = \
+ $(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage4_OBJECTS = \
+ generalizedaffinepreimage4.$(OBJEXT)
+generalizedaffinepreimage4_OBJECTS = \
+ $(am_generalizedaffinepreimage4_OBJECTS)
+generalizedaffinepreimage4_LDADD = $(LDADD)
+generalizedaffinepreimage4_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_integerupperboundifexact1_OBJECTS = \
+ integerupperboundifexact1.$(OBJEXT)
+integerupperboundifexact1_OBJECTS = \
+ $(am_integerupperboundifexact1_OBJECTS)
+integerupperboundifexact1_LDADD = $(LDADD)
+integerupperboundifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS = \
+ limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS = \
+ $(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS = \
+ limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS = \
+ $(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relatwithcons1_OBJECTS = relatwithcons1.$(OBJEXT)
+relatwithcons1_OBJECTS = $(am_relatwithcons1_OBJECTS)
+relatwithcons1_LDADD = $(LDADD)
+relatwithcons1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relatwithcons2_OBJECTS = relatwithcons2.$(OBJEXT)
+relatwithcons2_OBJECTS = $(am_relatwithcons2_OBJECTS)
+relatwithcons2_LDADD = $(LDADD)
+relatwithcons2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relatwithcons3_OBJECTS = relatwithcons3.$(OBJEXT)
+relatwithcons3_OBJECTS = $(am_relatwithcons3_OBJECTS)
+relatwithcons3_LDADD = $(LDADD)
+relatwithcons3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relatwithgen1_OBJECTS = relatwithgen1.$(OBJEXT)
+relatwithgen1_OBJECTS = $(am_relatwithgen1_OBJECTS)
+relatwithgen1_LDADD = $(LDADD)
+relatwithgen1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writeoctagon1_OBJECTS = writeoctagon1.$(OBJEXT)
+writeoctagon1_OBJECTS = $(am_writeoctagon1_OBJECTS)
+writeoctagon1_LDADD = $(LDADD)
+writeoctagon1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+ $(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+ $(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+ $(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(chinainit_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromgensys1_SOURCES) \
+ $(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(fromspacedim1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffineimage3_SOURCES) \
+ $(generalizedaffineimage4_SOURCES) \
+ $(generalizedaffineimage5_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) \
+ $(generalizedaffinepreimage4_SOURCES) \
+ $(integerupperboundifexact1_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(max_min2_SOURCES) \
+ $(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+ $(minconstraints1_SOURCES) $(relatwithcons1_SOURCES) \
+ $(relatwithcons2_SOURCES) $(relatwithcons3_SOURCES) \
+ $(relatwithgen1_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(unconstrain1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+ $(wrap1_SOURCES) $(writeoctagon1_SOURCES)
+DIST_SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+ $(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+ $(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+ $(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+ $(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+ $(chinainit_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+ $(discrete1_SOURCES) $(disjoint1_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromgensys1_SOURCES) \
+ $(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(fromspacedim1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffineimage3_SOURCES) \
+ $(generalizedaffineimage4_SOURCES) \
+ $(generalizedaffineimage5_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) \
+ $(generalizedaffinepreimage3_SOURCES) \
+ $(generalizedaffinepreimage4_SOURCES) \
+ $(integerupperboundifexact1_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(max_min1_SOURCES) $(max_min2_SOURCES) \
+ $(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+ $(minconstraints1_SOURCES) $(relatwithcons1_SOURCES) \
+ $(relatwithcons2_SOURCES) $(relatwithcons3_SOURCES) \
+ $(relatwithgen1_SOURCES) $(removespacedims1_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+ $(unconstrain1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+ $(wrap1_SOURCES) $(writeoctagon1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+bounds1_SOURCES = bounds1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+chinainit_SOURCES = chinainit.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+empty1_SOURCES = empty1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+relatwithgen1_SOURCES = relatwithgen1.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writeoctagon1_SOURCES = writeoctagon1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Octagonal_Shape/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Octagonal_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES)
+ @rm -f affinedimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) $(EXTRA_affinepreimage2_DEPENDENCIES)
+ @rm -f affinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) $(EXTRA_bhmz05widening1_DEPENDENCIES)
+ @rm -f bhmz05widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) $(EXTRA_cc76extrapolation1_DEPENDENCIES)
+ @rm -f cc76extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES)
+ @rm -f cc76narrowing1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+chinainit$(EXEEXT): $(chinainit_OBJECTS) $(chinainit_DEPENDENCIES) $(EXTRA_chinainit_DEPENDENCIES)
+ @rm -f chinainit$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(chinainit_OBJECTS) $(chinainit_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES)
+ @rm -f constrains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES)
+ @rm -f difference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES)
+ @rm -f dropsomenonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES)
+ @rm -f frequency1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES)
+ @rm -f fromgensys1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES)
+ @rm -f fromspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) $(EXTRA_generalizedaffineimage3_DEPENDENCIES)
+ @rm -f generalizedaffineimage3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
+
+generalizedaffineimage4$(EXEEXT): $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_DEPENDENCIES) $(EXTRA_generalizedaffineimage4_DEPENDENCIES)
+ @rm -f generalizedaffineimage4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_LDADD) $(LIBS)
+
+generalizedaffineimage5$(EXEEXT): $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_DEPENDENCIES) $(EXTRA_generalizedaffineimage5_DEPENDENCIES)
+ @rm -f generalizedaffineimage5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+generalizedaffinepreimage4$(EXEEXT): $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage4_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_LDADD) $(LIBS)
+
+integerupperboundifexact1$(EXEEXT): $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_DEPENDENCIES) $(EXTRA_integerupperboundifexact1_DEPENDENCIES)
+ @rm -f integerupperboundifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhmz05extrapolation1_DEPENDENCIES)
+ @rm -f limitedbhmz05extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES)
+ @rm -f limitedcc76extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES)
+ @rm -f max_min1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) $(EXTRA_max_min2_DEPENDENCIES)
+ @rm -f max_min2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES)
+ @rm -f maxspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+relatwithcons1$(EXEEXT): $(relatwithcons1_OBJECTS) $(relatwithcons1_DEPENDENCIES) $(EXTRA_relatwithcons1_DEPENDENCIES)
+ @rm -f relatwithcons1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relatwithcons1_OBJECTS) $(relatwithcons1_LDADD) $(LIBS)
+
+relatwithcons2$(EXEEXT): $(relatwithcons2_OBJECTS) $(relatwithcons2_DEPENDENCIES) $(EXTRA_relatwithcons2_DEPENDENCIES)
+ @rm -f relatwithcons2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relatwithcons2_OBJECTS) $(relatwithcons2_LDADD) $(LIBS)
+
+relatwithcons3$(EXEEXT): $(relatwithcons3_OBJECTS) $(relatwithcons3_DEPENDENCIES) $(EXTRA_relatwithcons3_DEPENDENCIES)
+ @rm -f relatwithcons3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relatwithcons3_OBJECTS) $(relatwithcons3_LDADD) $(LIBS)
+
+relatwithgen1$(EXEEXT): $(relatwithgen1_OBJECTS) $(relatwithgen1_DEPENDENCIES) $(EXTRA_relatwithgen1_DEPENDENCIES)
+ @rm -f relatwithgen1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relatwithgen1_OBJECTS) $(relatwithgen1_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES)
+ @rm -f unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES)
+ @rm -f upperboundifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES)
+ @rm -f wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writeoctagon1$(EXEEXT): $(writeoctagon1_OBJECTS) $(writeoctagon1_DEPENDENCIES) $(EXTRA_writeoctagon1_DEPENDENCIES)
+ @rm -f writeoctagon1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writeoctagon1_OBJECTS) $(writeoctagon1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/chinainit.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/integerupperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithgen1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeoctagon1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ fi; \
+ echo "$${col}$$dashes$${std}"; \
+ echo "$${col}$$banner$${std}"; \
+ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+ test -z "$$report" || echo "$${col}$$report$${std}"; \
+ echo "$${col}$$dashes$${std}"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+ $(dist_check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+ +MAKE="$(MAKE)" $(srcdir)/run_tests
+ echo "true" >run_tests.stamp
+ chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Octagonal_Shape/addspacedims1.cc b/tests/Octagonal_Shape/addspacedims1.cc
new file mode 100644
index 0000000..e002767
--- /dev/null
+++ b/tests/Octagonal_Shape/addspacedims1.cc
@@ -0,0 +1,235 @@
+/* Test Octagonal_Shape::add_space_dimensions_and_embed() and
+ Octagonal_Shape::add_space_dimensions_and_project().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+// Variable y(1);
+// Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(x <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.add_space_dimensions_and_embed(2);
+ oc.add_constraint(w <= 2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(w <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc,
+ "*** oc.add_space_dimensions_and_embed(2) "
+ "and oc.add_constraint(w <= 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oc1(0, EMPTY);
+ TOctagonal_Shape oc2(1, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.add_space_dimensions_and_embed(2);
+ oc2.add_space_dimensions_and_embed(1);
+
+ bool ok = (oc1 == oc2);
+
+ print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(2) ***");
+ print_constraints(oc2, "*** oc2.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ // Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(x <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.add_space_dimensions_and_project(2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(w == 0);
+ known_result.add_constraint(z == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Constraint_System cs;
+ cs.insert(x >= 2);
+ cs.insert(y >= 2);
+ cs.insert(x <= 6);
+ cs.insert(y <= 6);
+
+ TOctagonal_Shape oc(cs);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.add_space_dimensions_and_project(2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(z == 0);
+ known_result.add_constraint(w == 0);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(y >= 2);
+ known_result.add_constraint(x <= 6);
+ known_result.add_constraint(y <= 6);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(A <= 2);
+
+ TOctagonal_Shape oc2(oc1);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.add_space_dimensions_and_embed(0);
+ oc2.add_space_dimensions_and_project(0);
+
+ bool ok = (oc1 == oc2);
+
+ print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(0) ***");
+ print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(0) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape oc1(0, EMPTY);
+ TOctagonal_Shape oc2(1, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.add_space_dimensions_and_project(2);
+ oc2.add_space_dimensions_and_project(1);
+
+ bool ok = (oc1 == oc2);
+
+ print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+ print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TOctagonal_Shape oc1(0);
+ TOctagonal_Shape oc2(1);
+ oc2.add_constraint(A == 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.add_space_dimensions_and_project(2);
+ oc2.add_space_dimensions_and_project(1);
+
+ bool ok = (oc1 == oc2);
+
+ print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+ print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ // Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(1);
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(B == 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.add_space_dimensions_and_project(2);
+ oc2.add_space_dimensions_and_project(1);
+
+ bool ok = (oc1 == oc2);
+
+ print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+ print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinedimension1.cc b/tests/Octagonal_Shape/affinedimension1.cc
new file mode 100644
index 0000000..dc93425
--- /dev/null
+++ b/tests/Octagonal_Shape/affinedimension1.cc
@@ -0,0 +1,306 @@
+/* Test Octagonal_Shape::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(3);
+
+ oct.add_constraint(x <= 2);
+ oct.add_constraint(x - y == 3);
+ oct.add_constraint(y <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+
+ oct.add_constraint(A <= 5);
+ oct.add_constraint(A - B == 3);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(E - D == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+
+ oct.add_constraint(A == 5);
+ oct.add_constraint(A - B == 3);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(E - D == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 3);
+ oct.add_constraint(B - A <= -5);
+ oct.add_constraint(-B <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape oct(2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(A - D == 8);
+ oct.add_constraint(B <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 3);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A == 1);
+ oct.add_constraint(E == 1);
+ oct.add_constraint(A - D == 8);
+ oct.add_constraint(B <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 2);
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(7);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B == 2);
+ oct.add_constraint(B - A <= -6);
+
+ print_constraints(oct, "*** oct ***");
+
+ dimension_type affine_dim = oct.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `oct' is:"
+ << endl
+ << affine_dim
+ << endl;
+
+ bool ok = (affine_dim == 0);
+
+ return ok;
+}
+
+bool
+test11() {
+ TOctagonal_Shape oct(0, UNIVERSE);
+
+ const dimension_type affine_dim = oct.affine_dimension();
+
+ print_constraints(oct, "*** oct ***");
+
+ return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/affineimage1.cc b/tests/Octagonal_Shape/affineimage1.cc
new file mode 100644
index 0000000..4e4385a
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage1.cc
@@ -0,0 +1,542 @@
+/* Test Octagonal_Shape::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, y);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, -y);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x + y == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, -y) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, x + 4);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 7);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, x + 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, Linear_Expression(4));
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x == 4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, 4) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oc1);
+
+ oc1.affine_image(x, x);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, x) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, 2*x - 2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, 2*x -2, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(y, 2*x, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y - x == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(y, 2*x, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(y, 3*x + 3, 3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y - x == 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(y, 3*x+ 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, 2*A +2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 3);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y >= 0);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(x <= 2);
+
+ Linear_Expression coeff1 = x + 1;
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::affine_image(v, e, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ oct.affine_image(y, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x + y >= 2);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space of
+ // the polyhedron.
+ oct.affine_image(y, z - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y >= 0);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(x <= 2);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+ // use a variable in the expression that does not appear in the
+ // space of the polyhedron.
+ oct.affine_image(x, y - z + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y >= 0);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(x <= 2);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space
+ // of the polyhedron.
+ oct.affine_image(z, y - x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(B - A >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, 2*A +2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A <= 3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(B - A >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -2*A + 3, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A <= -1);
+ known_result.add_constraint(2*A >= -3);
+ known_result.add_constraint(B >= 4);
+ known_result.add_constraint(2*A + 2*B >= 7);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -2*A + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(x <= 2);
+ oc.add_constraint(x - y <= 3);
+ oc.add_constraint(y <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(y, 2*x - 4, -2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x + y == 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc1.affine_image(y, 2*x - 4, -2) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 2);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.affine_image(y, y + 6);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 6);
+ known_result.add_constraint(y <= 8);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.affine_image(y, y + 6) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 2);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.affine_image(y, -y + 6);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 4);
+ known_result.add_constraint(y <= 6);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.affine_image(y, -y + 6) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x + y == 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_image(x, -x);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_image(x, y) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affineimage2.cc b/tests/Octagonal_Shape/affineimage2.cc
new file mode 100644
index 0000000..fc413ae
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage2.cc
@@ -0,0 +1,554 @@
+/* Test Octagonal_Shape::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C >= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, C + B, 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 1);
+ known_result.add_constraint(B - A <= -1);
+ known_result.add_constraint(C - A <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, C + B, 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(A - B <= 1);
+ known_result.add_constraint(A - C >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B >= 2);
+ oc.add_constraint(A >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -A, 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(A <= -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B <= 2);
+ oc.add_constraint(-A + B <= 1);
+ oc.add_constraint(A >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -A, 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(A <= -2);
+ known_result.add_constraint(-A + B <= 2);
+ known_result.add_constraint(A + B <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(C <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + C <= 3);
+ oc.add_constraint(A <= 2);
+ oc.add_constraint(A >= 1);
+ oc.add_constraint(D >= 1);
+ oc.add_constraint(D <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -A + 2*D, 1);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(D >= 1);
+ known_result.add_constraint(D <= 2);
+ known_result.add_constraint(A <= 3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - D <= 1);
+ known_result.add_constraint(D - A <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -A + 2*D, 1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C <= 1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= -1);
+ oc.add_constraint(B >= -2);
+ oc.add_constraint(A + B <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -C - B, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A >= -1);
+ known_result.add_constraint(2*A <= 3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(C >= -1);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(B + A) >= -3);
+ known_result.add_constraint(2*(C + A) >= -1);
+ known_result.add_constraint(2*(B + A) <= 1);
+ known_result.add_constraint(2*(C + A) <= 3);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -C - B, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(B >= -2);
+ oc.add_constraint(A + B <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -B, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B + A >= -1);
+ known_result.add_constraint(B + A <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -B, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(B >= -2);
+ oc.add_constraint(A + B <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, B + 3, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= 1);
+ known_result.add_constraint(2*A <= 3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(A - B) >= 3);
+ known_result.add_constraint(2*(A - B) <= 5);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, B + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(B >= -2);
+ oc.add_constraint(A + B <= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, B + 1, -2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= -1);
+ known_result.add_constraint(2*A <= 1);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(B + A) >= -3);
+ known_result.add_constraint(2*(B + A) <= -1);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, B + 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(B >= -2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(A, -B + 1, -2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= -3);
+ known_result.add_constraint(2*A <= -1);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(A - B) <= 1);
+ known_result.add_constraint(2*(B - A) <= 1);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, -B + 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= 0);
+ oc.add_constraint(C <= 10);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, -A + C + 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C <= 10);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(-A - B <= -1);
+ known_result.add_constraint(A + B <= 11);
+ known_result.add_constraint(B - C >= 1);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(B, -A + C +1) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(C <= 10);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, -A + C + 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 11);
+ known_result.add_constraint(C <= 10);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(-A - B <= -1);
+ known_result.add_constraint(A + B <= 11);
+ known_result.add_constraint(B - C <= 1);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A - B >= 0);
+ oc.add_constraint(C - B <= 10);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, A + C + 1);
+ print_constraints(oc, "*** oc ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C - A <= 10);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(C <= 10);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, A + C + 1);
+ print_constraints(oc, "*** oc ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(C <= 10);
+ known_result.add_constraint(C - A <= 10);
+ known_result.add_constraint(B - A <= 11);
+ known_result.add_constraint(B - C >= 1);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(B, A + C + 1) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(C <= 10);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, A + C + 1, -1);
+ print_constraints(oc, "*** oc ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(C <= 10);
+ known_result.add_constraint(C - A <= 10);
+ known_result.add_constraint(A + B >= -11);
+ known_result.add_constraint(B + C <= -1);
+
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(B, A + C + 1, -1) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C >= 1);
+ oc.add_constraint(A <= 10);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, A + C + 1);
+ print_constraints(oc, "*** oc ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C >= 1);
+ known_result.add_constraint(A <= 10);
+ known_result.add_constraint(B - A >= 2);
+ known_result.add_constraint(B - C <= 11);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, B + C + 1) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(C >= 1);
+ oc.add_constraint(A <= 10);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_image(B, A + C + 1, -1);
+ print_constraints(oc, "*** oc ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C >= 1);
+ known_result.add_constraint(A <= 10);
+ known_result.add_constraint(B + A <= -2);
+ known_result.add_constraint(B + C >= -11);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_image(A, B + C + 1, -1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage1.cc b/tests/Octagonal_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..5fdd4fd
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage1.cc
@@ -0,0 +1,294 @@
+/* Test Octagonal_Shape::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x - y <= 3);
+ oc1.add_constraint(y <= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.affine_preimage(x, y);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.affine_preimage(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A - B - 3 >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, B - 1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, B-1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(A + B >= 2);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, 2*A + 2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, Linear_Expression(3));
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, 3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, B - 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(B >= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x + y >= 0);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(z <= 2);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::affine_preimage(v, e, d): it is illegal to apply
+ // the method to a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ oct.affine_preimage(y, y + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y >= 2);
+ oct.add_constraint(y <= 7);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space of
+ // the polyhedron.
+ oct.affine_preimage(x, z - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y >= 2);
+ oct.add_constraint(y <= 7);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+ // apply this method to a variable that is not in the space of
+ // the polyhedron.
+ oct.affine_preimage(z, x - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B <= -2);
+ oc.add_constraint(B - A >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, A + 3);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, A + 3) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, 3*A, 2);
+
+ Octagonal_Shape<mpq_class> mpq_known_result(3);
+ mpq_known_result.add_constraint(3*A <= -2);
+
+ bool ok = check_result(oc, mpq_known_result,
+ "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(oc, "*** oc.affine_preimage(A, 3*A, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage2.cc b/tests/Octagonal_Shape/affinepreimage2.cc
new file mode 100644
index 0000000..e058320
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage2.cc
@@ -0,0 +1,426 @@
+/* Test Octagonal_Shape::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, B + C - 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(B + C >= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, B + C - 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, -B + C - 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(B - C <= -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, -B + C - 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, A - C + 3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - A <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, A - C + 3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A >= 2);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, -A - C + 3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(A + C <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, -A - C + 3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, B - C + 3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, B - C + 3) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, 2*B - C - 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(2*B >= 1);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = check_result(oc, known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, 2*B - C - 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, 2*B - 2*C - 2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B <= -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(B, 2*B - 2*C - 2, -2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B >= -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(C, 4*B + 6*C + 2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(6*C >= -2);
+
+ bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(C, 4*B + 6*C + 2, -2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, -2*A + 3*C + 2, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - A <= -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.affine_preimage(A, -2*A + 3*C + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(B <= 0);
+ oc.add_constraint(C >= 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(A, 3*A + C - 1, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A <= -1);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(C >= 0);
+ bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(oc, "*** oc.affine_preimage(A, 3*A + C - 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(A == 2);
+ oc.add_constraint(B == 0);
+ oc.add_constraint(C >= -3);
+ oc.add_constraint(D <= 5);
+
+ print_constraints(oc, "*** oc ***");
+
+ oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A == 2);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C >= -3);
+ known_result.add_constraint(5*D <= 14);
+ bool ok = check_result(oc, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oc,
+ "*** oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/ascii_dump_load1.cc b/tests/Octagonal_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..46076e9
--- /dev/null
+++ b/tests/Octagonal_Shape/ascii_dump_load1.cc
@@ -0,0 +1,331 @@
+/* Test Octagonal_Shape::ascii_dump() and Octagonal_Shape::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+ nout << "test01()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A - B >= 2);
+ oc1.add_constraint(B >= 0);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ oc2.ascii_load(f);
+ close(f);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool ok = (oc1 == oc2);
+
+ return ok;
+}
+
+bool
+test02() {
+
+ nout << "test02()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A - B >= 0);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc1.ascii_dump(f);
+ f.seekp(0);
+ f << "A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+
+ nout << "test03()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 0);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while (str != "-EM");
+ f.seekp(0, std::ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+
+ nout << "test04()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 1);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while(str != "+ZE");
+ f.seekp(0, std::ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+
+ nout << "test05()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 2);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while(str != "-SC");
+ f.seekp(0, std::ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+
+ nout << "test06()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 3);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while(str != "+inf");
+ f.seekp(0, std::ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test07() {
+
+ nout << "test07()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 3);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while(str != "+inf");
+ do
+ f >> str;
+ while(str != "+inf");
+ f.seekp(0, std::ios_base::cur);
+ f << " 3 ";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test08() {
+
+ nout << "test08()" << endl;
+
+ TOctagonal_Shape oc1(0, EMPTY);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ oc2.ascii_load(f);
+ close(f);
+
+ bool ok = (oc1 == oc2);
+
+ return ok;
+}
+
+bool
+test09() {
+
+ nout << "test09()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 0);
+
+ std::fstream f;
+ open(f, my_file, std::ios_base::out);
+ oc.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, std::ios_base::in | std::ios_base::out);
+ std::string str;
+ do
+ f >> str;
+ while (str != "space_dim");
+ f.seekp(0, std::ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, std::ios_base::in);
+ TOctagonal_Shape oc2;
+ bool ok = !oc2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bhmz05widening1.cc b/tests/Octagonal_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..7400712
--- /dev/null
+++ b/tests/Octagonal_Shape/bhmz05widening1.cc
@@ -0,0 +1,709 @@
+/* Test Octagonal_Shape::BHMZ05_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x <= 1);
+ oc1.add_constraint(x - y <= 2);
+ oc1.add_constraint(y - x <= 7);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y <= 2);
+ oc2.add_constraint(-x <= 3);
+ oc2.add_constraint(x <= 0);
+ oc2.add_constraint(y - x <= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oc1;
+ TOctagonal_Shape oc2(0, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result;
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(A >= 1);
+ oc1.add_constraint(B >= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(A >= 0);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(A - B >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(C >= 1);
+ oc1.add_constraint(D >= 0);
+ oc1.add_constraint(E >= 0);
+ oc1.add_constraint(C - D <= 76);
+ oc1.add_constraint(C - E <= 76);
+ oc1.add_constraint(E - D == 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A >= 0);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(C >= 1);
+ oc2.add_constraint(D >= 0);
+ oc2.add_constraint(E >= 0);
+ oc2.add_constraint(C - D <= 75);
+ oc2.add_constraint(C - E <= 75);
+ oc2.add_constraint(E - D == 0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 1);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(E - D == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(B <= 39);
+ oc1.add_constraint(C >= 0);
+ oc1.add_constraint(C <= 40);
+ oc1.add_constraint(D >= 0);
+ oc1.add_constraint(D <= 40);
+ oc1.add_constraint(B - A <= 39);
+ oc1.add_constraint(C - A <= 40);
+ oc1.add_constraint(D - A <= 40);
+ oc1.add_constraint(B - C <= 0);
+ oc1.add_constraint(C - B <= 1);
+ oc1.add_constraint(B - D <= 0);
+ oc1.add_constraint(D - B <= 2);
+ oc1.add_constraint(C - D <= 0);
+ oc1.add_constraint(D - C <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(4);
+ oc2.add_constraint(A >= 0);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(B <= 38);
+ oc2.add_constraint(C >= 0);
+ oc2.add_constraint(C <= 39);
+ oc2.add_constraint(D >= 0);
+ oc2.add_constraint(D <= 40);
+ oc2.add_constraint(B - A <= 38);
+ oc2.add_constraint(C - A <= 39);
+ oc2.add_constraint(D - A <= 40);
+ oc2.add_constraint(B - C <= 0);
+ oc2.add_constraint(C - B <= 1);
+ oc2.add_constraint(B - D <= 0);
+ oc2.add_constraint(D - B <= 2);
+ oc2.add_constraint(C - D <= 0);
+ oc2.add_constraint(D - C <= 1);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(B - C <= 0);
+ known_result.add_constraint(C - B <= 1);
+ known_result.add_constraint(C - D <= 0);
+ known_result.add_constraint(D - C <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(B <= 1);
+ oc1.add_constraint(C <= 7);
+ oc1.add_constraint(D >= 0);
+ oc1.add_constraint(A + B <= 10);
+ oc1.add_constraint(C - A <= 10);
+ oc1.add_constraint(D - A <= 10);
+ oc1.add_constraint(B - C <= 0);
+ oc1.add_constraint(C - B <= 1);
+ oc1.add_constraint(B - D <= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(4);
+ oc2.add_constraint(B <= 1);
+ oc2.add_constraint(C <= 7);
+ oc2.add_constraint(D >= 0);
+ oc2.add_constraint(A + B <= 9);
+ oc2.add_constraint(C - A <= 9);
+ oc2.add_constraint(D - A <= 10);
+ oc2.add_constraint(B - C <= 0);
+ oc2.add_constraint(C - B <= 1);
+ oc2.add_constraint(B - D <= 0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C <= 7);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D - A <= 10);
+ known_result.add_constraint(B - C <= 0);
+ known_result.add_constraint(C - B <= 1);
+ known_result.add_constraint(B - D <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A + B >= 9);
+ oc1.add_constraint(B + C >= 11);
+ oc1.add_constraint(C + D >= 12);
+ oc1.add_constraint(D + E >= 5);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A + B >= 10);
+ oc2.add_constraint(B + C >= 11);
+ oc2.add_constraint(C + D >= 12);
+ oc2.add_constraint(D + E >= 13);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(B + C >= 11);
+ known_result.add_constraint(C + D >= 12);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A - B <= 2);
+ oc1.add_constraint(B - C <= 0);
+ oc1.add_constraint(C - A <= -2);
+ oc1.add_constraint(A - D <= 2);
+ oc1.add_constraint(E - D <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A - B <= 2);
+ oc2.add_constraint(B - C <= 0);
+ oc2.add_constraint(C - A <= -2);
+ oc2.add_constraint(B - A <= 3);
+ oc2.add_constraint(A - D <= 1);
+ oc2.add_constraint(E - D <= 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A - B <= 2);
+ known_result.add_constraint(B - C <= 0);
+ known_result.add_constraint(C - A <= -2);
+ known_result.add_constraint(E - D <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A - B <= 2);
+ oc1.add_constraint(B - C <= 0);
+ oc1.add_constraint(C - A <= -2);
+ oc1.add_constraint(A - D <= 2);
+ oc1.add_constraint(E - D <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A - B <= 2);
+ oc2.add_constraint(B - A <= -7);
+ oc2.add_constraint(C - A == -2);
+ oc2.add_constraint(A - D <= 1);
+ oc2.add_constraint(E - D <= 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oc1);
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(B <= 0);
+ oc1.add_constraint(C <= -2);
+ oc1.add_constraint(D <= 2);
+ oc1.add_constraint(E <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A <= 2);
+ oc2.add_constraint(B <= -7);
+ oc2.add_constraint(C <= -2);
+ oc2.add_constraint(D <= 2);
+ oc2.add_constraint(E <= 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(C <= -2);
+ known_result.add_constraint(D <= 2);
+ known_result.add_constraint(E <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A + C <= -1);
+ oc1.add_constraint(A + D <= 1);
+ oc1.add_constraint(B <= 0);
+ oc1.add_constraint(C <= -3);
+ oc1.add_constraint(D <= 2);
+ oc1.add_constraint(E <= 4);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A <= 2);
+ oc2.add_constraint(A + D <= 1);
+ oc2.add_constraint(B <= -1);
+ oc2.add_constraint(C <= -3);
+ oc2.add_constraint(D <= 2);
+ oc2.add_constraint(E <= 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(A + D <= 1);
+ known_result.add_constraint(C <= -3);
+ known_result.add_constraint(D <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(C - A <= -1);
+ oc1.add_constraint(B <= 0);
+ oc1.add_constraint(C >= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3, EMPTY);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+ TOctagonal_Shape oct1(cs1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+ TOctagonal_Shape oct2(cs2);
+
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct2.BHMZ05_widening_assign(oct1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y - x <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ TOctagonal_Shape oc1(5);
+ TOctagonal_Shape oc2(10);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::BHMZ05_widening_assign(oc2): it is illegal to apply
+ // this method to two polyhedra that are not dimensional
+ // compatible.
+ oc2.BHMZ05_widening_assign(oc1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ unsigned tokens = 6;
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(A >= 1);
+ oc1.add_constraint(B >= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(A >= 0);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(A - B >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 5
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens <<
+ endl;
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x <= 1);
+ oc1.add_constraint(x - y <= 2);
+ oc1.add_constraint(y - x <= 7);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y <= 2);
+ oc2.add_constraint(-x <= 3);
+ oc2.add_constraint(x <= 0);
+ oc2.add_constraint(y - x <= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+ unsigned tokens = TOKENS;
+
+ oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens <<
+ endl;
+
+ print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ unsigned tokens = 6;
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+ TOctagonal_Shape oct1(cs1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+ TOctagonal_Shape oct2(cs2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct2.BHMZ05_widening_assign(oct1, &tokens);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y - x <= 0);
+
+#undef TOKENS
+#define TOKENS 6
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens <<
+ endl;
+
+ print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/bhz03widening1.cc b/tests/Octagonal_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..7eac4a7
--- /dev/null
+++ b/tests/Octagonal_Shape/bhz03widening1.cc
@@ -0,0 +1,77 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ typedef Pointset_Powerset<TOctagonal_Shape> PSet;
+
+ TOctagonal_Shape p(2);
+ TOctagonal_Shape q(2);
+ TOctagonal_Shape r(2);
+ TOctagonal_Shape s(2);
+ p.add_constraint(A >= 1);
+ p.add_constraint(B == 0);
+ q.add_constraint(A >= 2);
+ q.add_constraint(A <= 7);
+ q.add_constraint(B == 1);
+ r.add_constraint(A >= 3);
+ r.add_constraint(A <= 8);
+ r.add_constraint(B == 1);
+ s.add_constraint(A >= 1);
+ s.add_constraint(A <= 6);
+ s.add_constraint(B == 1);
+ PSet P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ PSet Q(2, EMPTY);
+ Q.add_disjunct(p);
+ Q.add_disjunct(q);
+ Q.add_disjunct(s);
+
+ using namespace IO_Operators;
+ nout << "P = " << P << endl
+ << "Q = " << Q << endl;
+
+ PSet old_P = P;
+ P.BHZ03_widening_assign<H79_Certificate>
+ (Q, widen_fun_ref(&TOctagonal_Shape::BHMZ05_widening_assign));
+
+ nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+ return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounded1.cc b/tests/Octagonal_Shape/bounded1.cc
new file mode 100644
index 0000000..7adf68f
--- /dev/null
+++ b/tests/Octagonal_Shape/bounded1.cc
@@ -0,0 +1,133 @@
+/* Test Octagonal_Shape::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ // This is a non-bounded OS.
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ return !oct.is_bounded();
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a bounded OS (it is a square);
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= 2);
+ oct.add_constraint(y >= 2);
+ oct.add_constraint(x <= 4);
+ oct.add_constraint(y <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+bool
+test03() {
+ // This is a universal, zero-dimensional OS.
+ TOctagonal_Shape oct;
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+bool
+test04() {
+ // This is an empty, zero-dimensional OS.
+ TOctagonal_Shape oct;
+ oct.add_constraint(Linear_Expression(-3) >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+bool
+test05() {
+ // This is an empty OS.
+ TOctagonal_Shape oct(4, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x + y >= 2);
+ oct.add_constraint(x - y >= 2);
+ oct.add_constraint(x + y <= 4);
+ oct.add_constraint(x - y <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(x + y >= 2);
+ oct.add_constraint(x <= 1);
+ oct.add_constraint(x + y <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ return oct.is_bounded();
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffineimage1.cc b/tests/Octagonal_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..cfa67be
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffineimage1.cc
@@ -0,0 +1,602 @@
+/* Test Octagonal_Shape::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3));
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 7, 3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 7);
+ known_result.add_constraint(A >= 3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+
+ oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, 7) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7), -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, 7, -1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -7);
+ known_result.add_constraint(A <= -3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+
+ oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3), -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 7, 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 3);
+ known_result.add_constraint(A <= 6);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(A - B <= 4);
+
+ oct.bounded_affine_image(A, Linear_Expression(3), A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, A+2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.bounded_affine_image(A, Linear_Expression(3), -A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, -A+2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ TOctagonal_Shape oct1 = oct;
+ TOctagonal_Shape oct2 = oct;
+
+
+ oct.bounded_affine_image(A, Linear_Expression(3), B+5);
+
+ oct1.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(3));
+ oct2.generalized_affine_image(A, LESS_OR_EQUAL, B+5);
+ oct1.intersection_assign(oct2);
+
+ bool ok = (oct == oct1);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, B+5) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -3);
+ known_result.add_constraint(A <= 5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(A + B <= 5);
+
+ oct.bounded_affine_image(A, Linear_Expression(3), B-5, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 3, B-5, -1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(A <= 23);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(A - B <= 19);
+
+ oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 2, 4*A + 3*B - 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(2*A <= 5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(2*(A + B) <= 5);
+
+ oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 2, "
+ "4*A + 3*B - 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -5);
+ known_result.add_constraint(A <= 23);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(A - B <= 19);
+ known_result.add_constraint(B - A <= 5);
+
+ oct.bounded_affine_image(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 4*A + 3*B - 5, "
+ "4*A + 3*B - 5) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(C <= 5);
+ oct.add_constraint(C >= -1);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+ oct.add_constraint(A - C <= 3);
+ oct.add_constraint(B - C <= 7);
+ oct.add_constraint(A - C >= 1);
+ oct.add_constraint(B - C >= -8);
+
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+
+ known_result.add_constraint(A <= 9);
+ known_result.add_constraint(A >= 4);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(C <= 3);
+ known_result.add_constraint(C >= -1);
+ known_result.add_constraint(C - B <= 1);
+
+ oct.bounded_affine_image(A, 4*A + 4, Linear_Expression(9));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 4*A + 4, "
+ "9) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(C <= 5);
+ oct.add_constraint(C >= -1);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+ oct.add_constraint(A - C <= 3);
+ oct.add_constraint(B - C <= 7);
+ oct.add_constraint(A - C >= 1);
+ oct.add_constraint(B - C >= -8);
+
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 9);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(C <= 3);
+ known_result.add_constraint(C >= -1);
+ known_result.add_constraint(A - C >= 0);
+ known_result.add_constraint(B - C >= -1);
+
+ oct.bounded_affine_image(A, 4*C + 3, Linear_Expression(9));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, 4*C + 3, "
+ "9) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+
+ oct.bounded_affine_image(A, A, A);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_image(A, A, A) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression having a
+ // space dimension greater than the OS's space dimension.
+ oct.bounded_affine_image(y, x, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression having a
+ // space dimension greater than the OS's space dimension.
+ oct.bounded_affine_image(y, z, x);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ oct.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d):
+ // it is illegal to apply this method to a variable
+ // that is not in the space of the octagon.
+ oct.bounded_affine_image(y, x + 1, Linear_Expression(8));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffinepreimage1.cc b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..2b93086
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,573 @@
+/* Test Octagonal_Shape::bounded_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 7, 3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, 7) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+ -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(7),
+ Linear_Expression(3), -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(B - A <= 3);
+ known_result.add_constraint(A + B >= 2);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, A+2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, -A+2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(B <= 4);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, B+5) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(2*B <= 7);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A >= -5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(4*(B - A) <= 21);
+ known_result.add_constraint(4*(A + B) >= -5);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 2, "
+ "4*A + 3*B - 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A <= 5);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(4*(A + B) <= 9);
+
+ oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 2, "
+ "4*A + 3*B - 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A >= -7);
+ known_result.add_constraint(4*A <= 9);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(4*(A + B) <= 13);
+ known_result.add_constraint(4*(B - A) <= 23);
+
+ oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+ "4*A + 3*B - 5) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+
+ oct.bounded_affine_preimage(A, A, A);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, A, A) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= 1);
+ known_result.add_constraint(4*A <= 9);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(4*B <= 11);
+ known_result.add_constraint(4*(A + B) <= 13);
+
+ oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+ "2*A - 5*B - 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(B <= 4);
+ oct.add_constraint(A - B <= 2);
+ oct.add_constraint(A - B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A >= -15);
+ known_result.add_constraint(2*A <= 21);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(4*(A + B) >= -3);
+ known_result.add_constraint(2*(A - B) <= 13);
+
+ oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+ "2*A - 5*B - 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression having a
+ // space dimension greater than the OS's space dimension.
+ oct.bounded_affine_preimage(y, x, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression having a
+ // space dimension greater than the OS's space dimension.
+ oct.bounded_affine_preimage(y, z, x);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+ // it is illegal to apply this method to an expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ oct.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_epxr, d):
+ // it is illegal to apply this method to a variable
+ // that is not in the space of the octagon.
+ oct.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounds1.cc b/tests/Octagonal_Shape/bounds1.cc
new file mode 100644
index 0000000..4109060
--- /dev/null
+++ b/tests/Octagonal_Shape/bounds1.cc
@@ -0,0 +1,312 @@
+/* Test OctagonalShape::bounds_from_below() and
+ Octagonal_Shape::bounds_from_above().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1;
+ TOctagonal_Shape oct2(2, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ bool ok = oct1.bounds_from_above(Linear_Expression(3))
+ && oct2.bounds_from_below(A);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(A + B) &&
+ oct.bounds_from_below(A + B);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(A - B <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.bounds_from_above(A - B) &&
+ !oct.bounds_from_below(A - B);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B - C <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.bounds_from_above(A + B - C)
+ && !oct.bounds_from_below(A + B - C);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B - C <= 0);
+ oct.add_constraint(E - D <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+ && !oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B - C >= 0);
+ oct.add_constraint(E - D >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(A + B - C + 2*E - 2*D)
+ && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B - C >= 0);
+ oct.add_constraint(B - C <= -1);
+ oct.add_constraint(E - D >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+ && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B - C >= 0);
+ oct.add_constraint(E - D >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.bounds_from_above(Linear_Expression(3))
+ && oct.bounds_from_below(Linear_Expression(3));
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounds_from_below(expr): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the OS.
+ oct.bounds_from_below(z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::bounds_from_below(expr): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the OS.
+ oct.bounds_from_above(z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(A - B) &&
+ !oct.bounds_from_below(A - B);
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(A + B) &&
+ !oct.bounds_from_below(A + B);
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(A + B + C) &&
+ !oct.bounds_from_below(A + B + C);
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = !oct.bounds_from_above(-A - B - C) &&
+ !oct.bounds_from_below(-A - B - C);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76extrapolation1.cc b/tests/Octagonal_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..cc418a2
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76extrapolation1.cc
@@ -0,0 +1,517 @@
+/* Test Octagonal_Shape::CC76_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x <= 1);
+ oct1.add_constraint(x - y <= 2);
+ oct1.add_constraint(y - x <= 7);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(x - y <= 2);
+ oct2.add_constraint(-x <= 3);
+ oct2.add_constraint(x <= 0);
+ oct2.add_constraint(y - x <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(A + B >= 0);
+ oc1.add_constraint(A - B <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(A + B >= 2);
+ oc2.add_constraint(A - B <= 1);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_extrapolation_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A + B >= 0);
+ known_result.add_constraint(A - B <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(A <= 3);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(A + B >= 0);
+ oc1.add_constraint(A + C >= 0);
+ oc1.add_constraint(A - D <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(4);
+ oc2.add_constraint(A >= 1);
+ oc2.add_constraint(A <= 2);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(C >= 0);
+ oc2.add_constraint(A + B >= 2);
+ oc2.add_constraint(A + C >= 3);
+ oc2.add_constraint(A - D <= 1);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_extrapolation_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(D >= -1);
+ known_result.add_constraint(A + C >= 0);
+ known_result.add_constraint(A - D <= 1);
+ known_result.add_constraint(C + D >= -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oct1(0);
+ TOctagonal_Shape oct2(0, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oct1(2, EMPTY);
+ TOctagonal_Shape oct2(2, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A - B >= -2);
+ oct1.add_constraint(B - A >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A - B >= 2);
+ oct2.add_constraint(B - A >= 1);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A - B >= -2);
+ known_result.add_constraint(B - A >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= 1);
+ oct2.add_constraint(B == -1);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(C <= 4);
+ oct1.add_constraint(B >= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(C <= 3);
+ oct2.add_constraint(B >= 3);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(C - B <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ typedef TOctagonal_Shape::coefficient_type_base ctb;
+ ctb stop_points[] = { ctb(-2), ctb(-1), ctb(0), ctb(1), ctb(2) };
+
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x <= 1);
+ oct1.add_constraint(x - y <= 2);
+ oct1.add_constraint(y - x <= 7);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(x - y <= 2);
+ oct2.add_constraint(-x <= 3);
+ oct2.add_constraint(x <= 0);
+ oct2.add_constraint(y - x <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.CC76_extrapolation_assign(oct2,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]));
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ TOctagonal_Shape oc1(5);
+ TOctagonal_Shape oc2(10);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::CC76_extrapolation_assign(oc2): it is illegal
+ // to apply this method to two polyhedra that are not dimensional
+ // compatible.
+ oc2.CC76_extrapolation_assign(oc1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ unsigned tokens = 6;
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(A >= 1);
+ oc1.add_constraint(B >= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(A >= 0);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(A - B >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 6
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x <= 1);
+ oc1.add_constraint(x - y <= 2);
+ oc1.add_constraint(y - x <= 7);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y <= 2);
+ oc2.add_constraint(-x <= 3);
+ oc2.add_constraint(x <= 0);
+ oc2.add_constraint(y - x <= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+ unsigned tokens = TOKENS;
+
+ oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+ TOctagonal_Shape oct1(cs1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+ TOctagonal_Shape oct2(cs2);
+
+ unsigned tokens = 6;
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct2.CC76_extrapolation_assign(oct1, &tokens);
+
+#undef TOKENS
+#define TOKENS 6
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y - x <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_constraints(oct2, "*** oct2.CC76_extrapolation_assign(oct1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(A >= 0);
+ oc1.add_constraint(A <= 3);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(A + B >= 0);
+ oc1.add_constraint(A + C >= 0);
+ oc1.add_constraint(A - D <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(4);
+ oc2.add_constraint(A >= 1);
+ oc2.add_constraint(A <= 2);
+ oc2.add_constraint(B >= 0);
+ oc2.add_constraint(C >= 0);
+ oc2.add_constraint(A + B >= 2);
+ oc2.add_constraint(A + C >= 3);
+ oc2.add_constraint(A - D <= 1);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ unsigned tokens = 6;
+
+ oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A + C >= 0);
+ known_result.add_constraint(A - D <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+ && (tokens == TOKENS);
+
+ nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+ print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76narrowing1.cc b/tests/Octagonal_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..dd4087f
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76narrowing1.cc
@@ -0,0 +1,265 @@
+/* Test Octagonal_Shape::CC76_narrowing_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TOctagonal_Shape oc1(3, EMPTY);
+ TOctagonal_Shape oc2(3, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oc1(0, EMPTY);
+ TOctagonal_Shape oc2(0);
+
+#if NOISY
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+#endif
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TOctagonal_Shape oc1(2);
+ TOctagonal_Shape oc2(2);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oc1(0, EMPTY);
+ TOctagonal_Shape oc2(0, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oc1(0);
+ TOctagonal_Shape oc2(0);
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(0);
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(B == 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(A <= 3);
+ oc2.add_constraint(A + B <= 5);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 3);
+ known_result.add_constraint(A + B <= 5);
+ known_result.add_constraint(A - B <= 0);
+ known_result.add_constraint(B == 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(-x <= 3);
+ oc1.add_constraint(y - x <= 2);
+ oc1.add_constraint(x - y <= 5);
+ oc1.add_constraint(x <= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x <= 1);
+ oc2.add_constraint(y - x <= 7);
+ oc2.add_constraint(x - y <= 6);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y - x <= 7);
+ known_result.add_constraint(-x <= 3);
+ known_result.add_constraint(x - y <= 6);
+ known_result.add_constraint(-y <= 8);
+ known_result.add_constraint(y <= 8);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable y(1);
+
+ TOctagonal_Shape oc1(1);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(y >= 6);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::CC76_narrowing_assign(oc2): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ oc2.CC76_narrowing_assign(oc1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= 3);
+ oc1.add_constraint(y - x <= 2);
+ oc1.add_constraint(x - y <= 5);
+ oc1.add_constraint(x <= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x <= 1);
+ oc2.add_constraint(y - x <= 7);
+ oc2.add_constraint(x - y <= 6);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.CC76_narrowing_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/chinainit.cc b/tests/Octagonal_Shape/chinainit.cc
new file mode 100644
index 0000000..f0adb75
--- /dev/null
+++ b/tests/Octagonal_Shape/chinainit.cc
@@ -0,0 +1,76 @@
+/* Simulate the initialization phase of the China analyzer.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+TOctagonal_Shape
+init(dimension_type num_vars) {
+ TOctagonal_Shape oc(num_vars);
+ if (num_vars > 0) {
+ Constraint_System cs;
+ for (dimension_type i = num_vars; i-- > 0; )
+ cs.insert(Variable(i) >= 0);
+ oc = TOctagonal_Shape(cs);
+#if NOISY
+ print_constraints(oc, "*** oc ***");
+#endif
+ }
+ return oc;
+}
+
+bool
+test01(){
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+ function.insert(3, 2);
+ function.insert(5, 3);
+ function.insert(7, 4);
+ function.insert(9, 5);
+
+ print_function(function, "*** function ***");
+
+
+ TOctagonal_Shape known_result = init(6);
+
+ for (dimension_type i = 10; i < 50; ++i) {
+ TOctagonal_Shape oc = init(i);
+ oc.map_space_dimensions(function);
+ if (oc != known_result) {
+ print_constraints(oc, "*** oc ***");
+ print_constraints(known_result, "*** known_result ***");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/concatenate1.cc b/tests/Octagonal_Shape/concatenate1.cc
new file mode 100644
index 0000000..aea79aa
--- /dev/null
+++ b/tests/Octagonal_Shape/concatenate1.cc
@@ -0,0 +1,283 @@
+/* Test Octagonal_Shape::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ Variable x7(6);
+ Variable x8(7);
+ Variable x9(8);
+
+ TOctagonal_Shape oc1(6);
+ oc1.add_constraint(x2 - x3 <= 0);
+ oc1.add_constraint(x3 <= 2);
+ oc1.add_constraint(x6 - x5 <= 2);
+ oc1.add_constraint(x5 <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x2 - x3 <= 2);
+ oc2.add_constraint(x3 <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.concatenate_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(9);
+ known_result.add_constraint(x2 - x3 <= 0);
+ known_result.add_constraint(x3 <= 2);
+ known_result.add_constraint(x6 - x5 <= 2);
+ known_result.add_constraint(x5 <= 3);
+ known_result.add_constraint(x8 - x9 <= 2);
+ known_result.add_constraint(x9 <= 7);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(x - y <= 4);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0, EMPTY);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc2.concatenate_assign(oc1);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+ print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(0, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x <= 3);
+ oc2.add_constraint(x - y <= 4);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc2.concatenate_assign(oc1);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+ print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ Variable x7(6);
+ Variable x8(7);
+ Variable x9(8);
+
+ TOctagonal_Shape oc1(6);
+ oc1.add_constraint(x2 + x3 <= 1);
+ oc1.add_constraint(x3 <= 2);
+ oc1.add_constraint(x6 - x5 <= 2);
+ oc1.add_constraint(x5 <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x2 + x3 <= 77);
+ oc2.add_constraint(x3 <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.concatenate_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(9);
+ known_result.add_constraint(x2 + x3 <= 1);
+ known_result.add_constraint(x3 <= 2);
+ known_result.add_constraint(x6 - x5 <= 2);
+ known_result.add_constraint(x5 <= 3);
+ known_result.add_constraint(x8 + x9 <= 77);
+ known_result.add_constraint(x9 <= 7);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oc1(4);
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0);
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.concatenate_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(A - B <= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc2.concatenate_assign(oc1);
+
+ Octagonal_Shape<mpq_class> known_result(oc1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+ print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TOctagonal_Shape oc1(0, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0, EMPTY);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.concatenate_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+ Variable x7(6);
+ Variable x8(7);
+ Variable x9(8);
+
+ TOctagonal_Shape oc1(6);
+ oc1.add_constraint(x2 - x3 <= 1);
+ oc1.add_constraint(x3 <= 12);
+ oc1.add_constraint(x6 - x5 <= 2);
+ oc1.add_constraint(x5 <= 23);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x2 - x3 <= 2);
+ oc2.add_constraint(x3 <= 8);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.concatenate_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(9);
+ known_result.add_constraint(x2 - x3 <= 1);
+ known_result.add_constraint(x3 <= 12);
+ known_result.add_constraint(x6 - x5 <= 2);
+ known_result.add_constraint(x5 <= 23);
+ known_result.add_constraint(x8 - x9 <= 2);
+ known_result.add_constraint(x9 <= 8);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/congruences1.cc b/tests/Octagonal_Shape/congruences1.cc
new file mode 100644
index 0000000..e309700
--- /dev/null
+++ b/tests/Octagonal_Shape/congruences1.cc
@@ -0,0 +1,200 @@
+/* Test Octagonal_Shape::congruences(): we compute the system of
+ congruences of an octagon that is defined by a system of
+ congruences that contains only a trivially false congruence.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_congruence((0*A %= 1) / 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.minimized_constraints();
+
+ print_constraints(cs, "*** cs ***");
+
+ Congruence_System cgs = oct1.congruences();
+ TOctagonal_Shape oct2(cgs);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oct1(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+ TOctagonal_Shape oct2(cgs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_congruence((x %= 1) / 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+ TOctagonal_Shape oct2(3);
+ oct2.add_congruences(cgs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oct1(0, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+ print_constraints(oct1, "*** oct1 ***");
+ TOctagonal_Shape oct2(cgs.space_dimension(), EMPTY);
+
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oct1(0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+ TOctagonal_Shape oct2(cgs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.refine_with_congruence((x %= 1) / 0);
+ oct1.refine_with_congruence((y %= 3) / 2);
+ oct1.refine_with_congruence((y + z %= 0) / 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+ TOctagonal_Shape oct2(3);
+ oct2.refine_with_congruences(cgs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.refine_with_congruence((x + y %= 3) / 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Congruence_System cgs = oct1.congruences();
+
+ TOctagonal_Shape oct2(2);
+ oct2.refine_with_congruences(cgs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/constrains1.cc b/tests/Octagonal_Shape/constrains1.cc
new file mode 100644
index 0000000..35217a9
--- /dev/null
+++ b/tests/Octagonal_Shape/constrains1.cc
@@ -0,0 +1,232 @@
+/* Test Octagonal_Shape::constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred) \
+ if (!pred) { \
+ nout << "!" #pred << endl; \
+ ok = false; \
+ }
+
+#define TEST_PREDICATE_FALSE(pred) \
+ if (pred) { \
+ nout << #pred << endl; \
+ ok = false; \
+ }
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape bds(2);
+ bds.add_constraint(0*A == 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(0*A == 1);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds = TOctagonal_Shape(2);
+ bds.add_constraint(A == B);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds = TOctagonal_Shape(2);
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(A >= 1);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(B >= 2);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ bds.add_constraint(A <= B);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape bds(3, EMPTY);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ TOctagonal_Shape bds(0);
+ bds.add_constraint(Linear_Expression::zero() == 1);
+
+ try {
+ (void) bds.constrains(A);
+ }
+ catch (std::invalid_argument& e) {
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape bds(2);
+ bds.add_constraint(B >= 0);
+ bds.add_constraint(B >= 7);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape bds(3);
+ bds.add_constraint(A == 0);
+ bds.add_constraint(B == 0);
+ bds.add_constraint(A + C == 0);
+ bds.unconstrain(A);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape bds(2);
+ bds.add_constraint(A >= 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_FALSE(bds.constrains(B));
+
+ bds.add_constraint(B >= A);
+
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape bds(3);
+ bds.add_constraint(A >= B+1);
+ bds.add_constraint(A <= B);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape bds(3);
+ bds.add_constraint(A >= B);
+ bds.add_constraint(A <= B-1);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(bds.constrains(C));
+ TEST_PREDICATE_TRUE(bds.constrains(B));
+ TEST_PREDICATE_TRUE(bds.constrains(A));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/constraints1.cc b/tests/Octagonal_Shape/constraints1.cc
new file mode 100644
index 0000000..9c891b6
--- /dev/null
+++ b/tests/Octagonal_Shape/constraints1.cc
@@ -0,0 +1,376 @@
+/* Test Octagonal_Shape::constraints(): we compute the system of
+ constraints of an octagon that is defined by a system of
+ constraints that contains only a trivially false constraint.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(0*A == 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oct1(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x == 1);
+ oct1.add_constraint(y <= 3);
+ oct1.add_constraint(y - x >= 5);
+ oct1.add_constraint(z + x == 2);
+ oct1.add_constraint(z - y <= 7);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oct1(0, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs.space_dimension(), EMPTY);
+
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oct1(0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(B >= 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+
+ oct1.add_constraint(A == 0);
+ oct1.add_constraint(B >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+
+ oct1.add_constraint(A + B == 0);
+ oct1.add_constraint(B <= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+
+ oct1.add_constraint(A - B == 0);
+ oct1.add_constraint(B <= 1);
+ oct1.add_constraint(C + A <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct1(5);
+ oct1.add_constraint(A == 1);
+ oct1.add_constraint(B + C == 1);
+ oct1.add_constraint(E - D == 1);
+ oct1.add_constraint(A + C <= 1);
+ oct1.add_constraint(B - D <= 1);
+ oct1.add_constraint(E + C >= -1);
+ oct1.add_constraint(A - D >= -1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+
+ oct1.add_constraint(A - B == 0);
+ oct1.add_constraint(B <= 1);
+ oct1.add_constraint(-C - A <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ Constraint_System cs = oct1.constraints();
+ TOctagonal_Shape oct2(cs);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test12() {
+
+ TOctagonal_Shape oct1(0);
+ oct1.add_constraint(Linear_Expression(1) == 0);
+
+ TOctagonal_Shape oct2(0, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(3);
+
+ oct.refine_with_constraint(A > 0);
+ oct.refine_with_constraint(B < 0);
+ oct.refine_with_constraint(A + B > 1);
+ oct.refine_with_constraint(A + 2*B > 1);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(A + B >= 1);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A > 0);
+ cs.insert(B < 0);
+ cs.insert(A + B > 1);
+ cs.insert(A + 2*B > 1);
+
+ TOctagonal_Shape oct(3);
+ oct.refine_with_constraints(cs);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 0);
+ known_result.add_constraint(A + B >= 1);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/contains1.cc b/tests/Octagonal_Shape/contains1.cc
new file mode 100644
index 0000000..ddc4df7
--- /dev/null
+++ b/tests/Octagonal_Shape/contains1.cc
@@ -0,0 +1,373 @@
+/* Test Octagonal_Shape::contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TOctagonal_Shape oc1;
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2;
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(C >= 0);
+ oc1.add_constraint(B + C >= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(A == 0);
+ oc2.add_constraint(C >= 0);
+ oc2.add_constraint(B + C >= 1);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(D >= 0);
+ cs.insert(C >= 0);
+ cs.insert(B >= 0);
+ cs.insert(A >= 0);
+
+ TOctagonal_Shape oc1(cs);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(cs);
+ oc2.add_constraint(A + B >= 0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs1;
+ cs1.insert(A + D >= 0);
+ cs1.insert(C >= 0);
+ cs1.insert(B >= 0);
+ cs1.insert(A == 0);
+ TOctagonal_Shape oc1(cs1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(D == 0);
+ cs2.insert(C == 0);
+ cs2.insert(B == 0);
+ cs2.insert(A == 0);
+ TOctagonal_Shape oc2(cs2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return contained;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oc1(0);
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0, EMPTY);
+ print_constraints(oc2, "*** oc2 ***");
+
+ TOctagonal_Shape oc3(0);
+ print_constraints(oc3, "*** oc3 ***");
+
+ bool contained1 = oc1.contains(oc2);
+ bool contained2 = oc1.contains(oc3);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained1 ? "true" : "false") << endl;
+ nout << "*** oc1.contains(oc3) ***" << endl;
+ nout << (contained2 ? "true" : "false") << endl;
+
+ return contained1 && contained2;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs1;
+ cs1.insert(C + D == 0);
+ cs1.insert(A - B <= 0);
+ cs1.insert(A == 0);
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraints(cs1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ Constraint_System cs2(cs1);
+ cs2.insert(D == 0);
+ TOctagonal_Shape oc2(4);
+ oc2.add_constraints(cs2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Constraint_System cs3(cs2);
+ cs3.insert(B == 0);
+ cs3.insert(B + C <= 0);
+ TOctagonal_Shape oc3(4);
+ oc3.add_constraints(cs3);
+
+ print_constraints(oc3, "*** oc3 ***");
+
+ bool contained1 = oc1.contains(oc2);
+ bool contained2 = oc1.contains(oc3);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained1 ? "true" : "false") << endl;
+ nout << "*** oc1.contains(oc3) ***" << endl;
+ nout << (contained2 ? "true" : "false") << endl;
+
+ return contained1 && contained2;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs1;
+ cs1.insert(A - B <= 0);
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraints(cs1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ Constraint_System cs2(cs1);
+ cs2.insert(D == 0);
+ cs2.insert(A - B <= 0);
+ cs2.insert(B - C <= 3);
+ cs2.insert(C - D <= -1);
+ cs2.insert(D - A <= -3);
+ TOctagonal_Shape oc2(4);
+
+ // The octagon oc2 is empty, since it has a negative cycle.
+ oc2.add_constraints(cs2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Constraint_System cs3(cs1);
+ cs3.insert(B <= 2);
+ cs3.insert(B >= 5);
+ TOctagonal_Shape oc3(4);
+
+ // The octagon oc3 is empty.
+ oc3.add_constraints(cs3);
+
+ print_constraints(oc3, "*** oc3 ***");
+
+ bool contained1 = oc1.contains(oc2);
+ bool contained2 = oc1.contains(oc3);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained1 ? "true" : "false") << endl;
+ nout << "*** oc1.contains(oc3) ***" << endl;
+ nout << (contained2 ? "true" : "false") << endl;
+
+ return contained1 && contained2;
+}
+
+bool
+test08() {
+ TOctagonal_Shape oc1(3, UNIVERSE);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3, EMPTY);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+ bool strictly_contained = oc1.strictly_contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ nout << "*** oc1.strictly_contains(oc2) ***" << endl;
+ nout << (strictly_contained ? "true" : "false") << endl;
+
+ return contained && strictly_contained;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x - y >= 0);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y == 0);
+
+ try {
+ // This is an invalid use of Polyhedron::contains(): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ oc1.contains(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test10() {
+ TOctagonal_Shape oc1(0, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (!contained ? "true" : "false") << endl;
+
+ return !contained;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(C <= 0);
+ oc1.add_constraint(B + C <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(A == 0);
+ oc2.add_constraint(C <= 0);
+ oc2.add_constraint(B + C <= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (!contained ? "true" : "false") << endl;
+
+ return !contained;
+}
+
+bool
+test12() {
+ TOctagonal_Shape oc1(3, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3, UNIVERSE);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool contained = oc1.contains(oc2);
+
+ nout << "*** oc1.contains(oc2) ***" << endl;
+ nout << (contained ? "true" : "false") << endl;
+
+ return !contained;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/containsintegerpoint1.cc b/tests/Octagonal_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..7e335a1
--- /dev/null
+++ b/tests/Octagonal_Shape/containsintegerpoint1.cc
@@ -0,0 +1,199 @@
+/* Test Octagonal_Shape::contains_integer_point().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ Octagonal_Shape<mpz_class> oct(2);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ Octagonal_Shape<mpq_class> oct(2);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ // NOTE: results depends on whether or not the rational constraints
+ // on y have been approximated as integral constraints.
+ typedef TOctagonal_Shape::coefficient_type_base T;
+ return std::numeric_limits<T>::is_integer ? contains : !contains;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y - 3*z <= 2);
+ cs.insert(8*z - 8*y >= 7);
+
+ Octagonal_Shape<mpq_class> oct(3);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(3*y - 3*x <= 2);
+ cs.insert(8*x - 8*y >= 7);
+
+ Octagonal_Shape<mpz_class> oct(2);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.add_constraint(x <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraints(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x);
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ oct.remove_space_dimensions(to_be_removed);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool contains = oct.contains_integer_point();
+
+ nout << "oct.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/difference1.cc b/tests/Octagonal_Shape/difference1.cc
new file mode 100644
index 0000000..f406344
--- /dev/null
+++ b/tests/Octagonal_Shape/difference1.cc
@@ -0,0 +1,258 @@
+/* Test Octagonal_Shape::difference_assign(): if `oct1' is
+ contained in `oct2', the result of `oct1.difference_assign(oct2)'
+ is an empty octagon.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A <= -2);
+ oct1.add_constraint(B == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A >= 0);
+ oct2.add_constraint(A <= 2);
+ oct2.add_constraint(B >= 0);
+ oct2.add_constraint(B <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.difference_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.difference_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oct1(0);
+ TOctagonal_Shape oct2(0);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.difference_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(1);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A <= 7);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(1);
+ oct2.add_constraint(A == 5);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.difference_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 7);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oc1(3);
+ TOctagonal_Shape oc2(5);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::difference_assign(oc2): it is impossible to apply
+ // this method to two polyhedra of different dimensions.
+ oc1.difference_assign(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 0);
+ oct1.add_constraint(A >= -2);
+ oct1.add_constraint(B == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, EMPTY);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ oct1.difference_assign(oct2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.difference_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oc1(4);
+ oc1.add_constraint(D == 0);
+ oc1.add_constraint(C == 0);
+ oc1.add_constraint(B == 0);
+ oc1.add_constraint(A == 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(4);
+ oc1.add_constraint(A + D >= 0);
+ oc1.add_constraint(C >= 0);
+ oc1.add_constraint(B >= 0);
+ oc1.add_constraint(A == 0);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+ oc1.difference_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.difference_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 1);
+ oct1.add_constraint(B >= 0);
+ oct1.add_constraint(A + B <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A + B <= 10);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.difference_assign(oct2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.difference_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A + B <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A + B >= 1);
+ oct2.add_constraint(A + B <= 10);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A + B <= 1);
+
+ oct1.difference_assign(oct2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.difference_assign(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/discrete1.cc b/tests/Octagonal_Shape/discrete1.cc
new file mode 100644
index 0000000..0ba31df
--- /dev/null
+++ b/tests/Octagonal_Shape/discrete1.cc
@@ -0,0 +1,213 @@
+/* Test Octagonal_Shape::is_discrete().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(3);
+
+ oct.add_constraint(x <= 2);
+ oct.add_constraint(x - y == 3);
+ oct.add_constraint(y <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+
+ oct.add_constraint(A <= 5);
+ oct.add_constraint(A - B == 3);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(E - D == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+
+ oct.add_constraint(A == 5);
+ oct.add_constraint(A - B == 3);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(E - D == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 3);
+ oct.add_constraint(B - A <= -5);
+ oct.add_constraint(-B <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape oct(2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(A - D == 8);
+ oct.add_constraint(B <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A == 1);
+ oct.add_constraint(E == 1);
+ oct.add_constraint(A - D == 8);
+ oct.add_constraint(B <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return !ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B == 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(7);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B == 2);
+ oct.add_constraint(B - A <= -6);
+
+ print_constraints(oct, "*** oct ***");
+
+ bool ok = oct.is_discrete();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/disjoint1.cc b/tests/Octagonal_Shape/disjoint1.cc
new file mode 100644
index 0000000..bd28dbe
--- /dev/null
+++ b/tests/Octagonal_Shape/disjoint1.cc
@@ -0,0 +1,190 @@
+/* Test Polyhedron::is_disjoint_from(const Octagonal_Shape& y).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(B == 0);
+ oct1.add_constraint(A >= 1);
+ oct1.add_constraint(A <= 2);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A == 0);
+ oct2.add_constraint(B >= 1);
+ oct2.add_constraint(B <= 2);
+
+ bool disjoint = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return disjoint;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A + B == 1);
+ oct1.add_constraint(A <= 1);
+ oct1.add_constraint(B <= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A + B <= 2);
+ oct2.add_constraint(A >= 0);
+ oct2.add_constraint(B >= 3);
+
+ bool disjoint = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return disjoint;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2, EMPTY);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A - B <= 5);
+
+ bool disjoint = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return disjoint;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(A + B));
+ gs1.insert(ray(B));
+
+ TOctagonal_Shape oct1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(A + B));
+ gs2.insert(ray(-B));
+
+ TOctagonal_Shape oct2(gs2);
+
+ bool disjoint = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return !disjoint;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(B >= -4);
+
+ TOctagonal_Shape oct2(2, EMPTY);
+
+ bool disjoint = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return disjoint;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= y);
+
+ TOctagonal_Shape oc2(3);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::is_disjoint_from(oc2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ oc1.is_disjoint_from(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A == 0);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A == 1);
+
+ bool ok = oct1.is_disjoint_from(oct2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc b/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..7a12d83
--- /dev/null
+++ b/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc
@@ -0,0 +1,358 @@
+/* Test Octagonal_Shape::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Octagonal_Shape<mpq_class> os(2);
+
+ os.add_constraint(2*A >= 1);
+ os.add_constraint(2*B >= -1);
+ os.add_constraint(2*A - 2*B >= 1);
+ os.add_constraint(4*A + 4*B >= 1);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points();
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 1);
+ known_result.add_constraint(A + B >= 1);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Octagonal_Shape<mpq_class> os1;
+ Octagonal_Shape<mpq_class> os2(0, EMPTY);
+ Octagonal_Shape<mpq_class> os3(2, EMPTY);
+ Octagonal_Shape<mpq_class> os4(2);
+
+ print_constraints(os1, "*** os1 ***");
+ print_constraints(os2, "*** os2 ***");
+
+ Octagonal_Shape<mpq_class> known_result1(os1);
+ Octagonal_Shape<mpq_class> known_result2(os2);
+ Octagonal_Shape<mpq_class> known_result3(os3);
+ Octagonal_Shape<mpq_class> known_result4(os4);
+
+ os1.drop_some_non_integer_points();
+ os2.drop_some_non_integer_points();
+ os3.drop_some_non_integer_points();
+ os4.drop_some_non_integer_points();
+
+ bool ok = (os1 == known_result1 && os2 == known_result2
+ && os3 == known_result3 && os4 == known_result4);
+
+ print_constraints(os1, "*** after os1.drop_some_non_integer_points() ***");
+ print_constraints(os2, "*** after os2.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(A - B == 0);
+ os.add_constraint(A >= 0);
+
+ Octagonal_Shape<mpq_class> known_result(os);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points();
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(A >= 0);
+ os.add_constraint(A == B);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points();
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(2*A == 1);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points();
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(2*A <= 1);
+ os.add_constraint(2*B <= -1);
+ os.add_constraint(4*A - 4*B <= 7);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points();
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= -1);
+ known_result.add_constraint(A - B <= 1);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ Octagonal_Shape<mpq_class> os(2);
+
+ os.add_constraint(2*A >= 1);
+ os.add_constraint(2*B >= -1);
+ os.add_constraint(2*A - 2*B >= 1);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points(varset_A);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(2*B >= -1);
+ known_result.add_constraint(2*A - 2*B >= 1);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os,
+ "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ Octagonal_Shape<mpq_class> os1(2, EMPTY);
+ Octagonal_Shape<mpq_class> os2(2);
+
+ print_constraints(os1, "*** os1 ***");
+ print_constraints(os2, "*** os2 ***");
+
+ Octagonal_Shape<mpq_class> known_result1(os1);
+ Octagonal_Shape<mpq_class> known_result2(os2);
+
+ os1.drop_some_non_integer_points(varset_A);
+ os2.drop_some_non_integer_points(varset_A);
+
+ bool ok = (os1 == known_result1 && os2 == known_result2);
+
+ print_constraints(os1,
+ "*** after os1.drop_some_non_integer_points(varset_A) ***");
+ print_constraints(os2,
+ "*** after os2.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(2*A - 2*B == 1);
+ os.add_constraint(A >= 0);
+
+ Octagonal_Shape<mpq_class> known_result(os);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points(varset_A);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os,
+ "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(A >= 0);
+ os.add_constraint(A == B);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points(varset_A);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os,
+ "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_B;
+ varset_B.insert(B);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(2*A == 1);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points(varset_B);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os,
+ "*** after os.drop_some_non_integer_points(varset_B) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variables_Set varset_A;
+ varset_A.insert(A);
+
+ Octagonal_Shape<mpq_class> os(2);
+ os.add_constraint(2*A <= 1);
+ os.add_constraint(2*B <= -1);
+ os.add_constraint(4*A - 4*B <= 7);
+
+ print_constraints(os, "*** os ***");
+
+ os.drop_some_non_integer_points(varset_A);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(2*B <= -1);
+ known_result.add_constraint(4*A - 4*B <= 7);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os,
+ "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/empty1.cc b/tests/Octagonal_Shape/empty1.cc
new file mode 100644
index 0000000..a14832e
--- /dev/null
+++ b/tests/Octagonal_Shape/empty1.cc
@@ -0,0 +1,131 @@
+/* Test Octagonal_Shape::is_empty() .
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc1(2, EMPTY);
+
+ bool empty1 = oc1.is_empty();
+
+ nout << "*** oc1.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false ") << endl;
+
+ TOctagonal_Shape oc2(2, UNIVERSE);
+
+ bool empty2 = oc2.is_empty();
+
+ nout << "*** oc2.is_empty() ***" << endl;
+ nout << (empty2 ? "true" : "false") << endl;
+
+ return empty1 && !empty2;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+
+ oc.add_constraint(A == 0);
+ oc.add_constraint(C >= 0);
+ oc.add_constraint(B - C >= 1);
+
+ print_constraints(oc, "*** oc ***");
+
+ bool empty = oc.is_empty();
+
+ nout << "*** oc.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ return !empty;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oc1(5);
+ oc1.add_constraint(A <= 3);
+ oc1.add_constraint(D <= 3);
+ oc1.add_constraint(B - A <= 0);
+ oc1.add_constraint(C - A <= -2);
+ oc1.add_constraint(E - A <= 2);
+ oc1.add_constraint(-B <= 0);
+ oc1.add_constraint(C - B <= 5);
+ oc1.add_constraint(D - C <= -6);
+ oc1.add_constraint(A - D <= 5);
+ oc1.add_constraint(E - D <= 2);
+ oc1.add_constraint(-E <= -5);
+ oc1.add_constraint(C - E <= 7);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ bool empty = oc1.is_empty();
+
+ nout << "*** oc1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ TOctagonal_Shape oc2(5);
+ oc2.add_constraint(A <= 3);
+ oc2.add_constraint(D <= 3);
+ oc2.add_constraint(B - A <= 0);
+ oc2.add_constraint(C - A <= 2);
+ oc2.add_constraint(E - A <= 2);
+ oc2.add_constraint(-B <= 0);
+ oc2.add_constraint(C - B <= 5);
+ oc2.add_constraint(D - C <= 6);
+ oc2.add_constraint(A - D <= 5);
+ oc2.add_constraint(E - D <= 2);
+ oc2.add_constraint(-E <= 5);
+ oc2.add_constraint(C - E <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ bool empty1 = oc2.is_empty();
+
+ nout << "*** oc2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return empty && !empty1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/expandspacedim1.cc b/tests/Octagonal_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..125371f
--- /dev/null
+++ b/tests/Octagonal_Shape/expandspacedim1.cc
@@ -0,0 +1,295 @@
+/* Test Octagonal_Shape::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 1);
+
+ TOctagonal_Shape known_result(4);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** after oct1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ // Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(B, 1);
+
+ TOctagonal_Shape known_result(4, EMPTY);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(B, 1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 0);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(A, 0) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(2, EMPTY);
+ oct1.add_constraint(B >= 0);
+ oct1.add_constraint(A - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 1);
+
+ TOctagonal_Shape known_result(3, EMPTY);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 1);
+
+ TOctagonal_Shape known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B <= 2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 2);
+
+ TOctagonal_Shape known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C - B <= 2);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D - B <= 2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A <= 1);
+ oct1.add_constraint(C == 1);
+ oct1.add_constraint(A - B >= 1);
+ oct1.add_constraint(B <= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(A, 1);
+ oct1.expand_space_dimension(C, 1);
+
+ TOctagonal_Shape known_result(5);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(A - B >= 1);
+ known_result.add_constraint(C == 1);
+ known_result.add_constraint(E == 1);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(D <= 1);
+ known_result.add_constraint(D - B >= 1);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.expand_space_dimension(A, 1);"
+ " oct1.expand_space_dimension(C, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(2, EMPTY);
+ oct1.add_constraint(A <= 2);
+ oct1.add_constraint(A - B >= 1);
+ oct1.add_constraint(B <= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.expand_space_dimension(B, 1);
+
+ TOctagonal_Shape known_result(3, EMPTY);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::expand_space_dimension(v, m):
+ // it is illegal to apply this method to a variable
+ // that is not in the space of the octagon.
+ oct.expand_space_dimension(y, 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::expand_space_dimension(v, m):
+ // it is illegal to apply this method when the maximum allowed space
+ // dimension would be exceeded.
+ oct.expand_space_dimension(x, 40000);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/foldspacedims1.cc b/tests/Octagonal_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..9816cc5
--- /dev/null
+++ b/tests/Octagonal_Shape/foldspacedims1.cc
@@ -0,0 +1,442 @@
+/* Test Octagonal_Shape::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A - C <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - C <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {} into B ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A >= 1);
+ oct1.add_constraint(A <= 3);
+ oct1.add_constraint(B >= 7);
+ oct1.add_constraint(B <= 12);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 12);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A >= 1);
+ oct1.add_constraint(A <= 3);
+ oct1.add_constraint(B >= 7);
+ oct1.add_constraint(B <= 12);
+ oct1.add_constraint(C == 15);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ oct1.fold_space_dimensions(to_fold, C);
+
+ Octagonal_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 15);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A, B} into C ***");
+
+ return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct1(4);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A - B <= 2);
+ oct1.add_constraint(C >= 0);
+ oct1.add_constraint(C - B <= 2);
+ oct1.add_constraint(D >= 0);
+ oct1.add_constraint(D - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ oct1.fold_space_dimensions(to_fold, A);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A - B <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {C, D} into A ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct1(4);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(B == 0);
+ oct1.add_constraint(A - B <= 2);
+ oct1.add_constraint(C >= 0);
+ oct1.add_constraint(C - B <= 2);
+ oct1.add_constraint(D >= 0);
+ oct1.add_constraint(D - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ oct1.fold_space_dimensions(to_fold, C);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A >= 0);
+ oct1.add_constraint(A <= -1);
+ oct1.add_constraint(A - B <= 2);
+ oct1.add_constraint(C >= 0);
+ oct1.add_constraint(C - B <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+
+ oct1.fold_space_dimensions(to_fold, A);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ // Variable G(6);
+
+ TOctagonal_Shape oc(5);
+ oc.add_constraint(A + D <= 2);
+ oc.add_constraint(B - E >= 2);
+
+ Variables_Set to_be_folded;
+ to_be_folded.insert(C);
+ to_be_folded.insert(D);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+ // it is illegal to fold a variable that is not in the space
+ // of the octagon.
+ oc.fold_space_dimensions(to_be_folded, F);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ // Variable D(3);
+ // Variable E(4);
+ Variable F(5);
+ // Variable G(6);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A + B <= 2);
+ oc.add_constraint(C - B >= 2);
+
+ Variables_Set to_be_folded;
+ to_be_folded.insert(C);
+
+ try {
+ to_be_folded.insert(F);
+ // This is an invalid use of the method
+ // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+ // it is illegal to insert in the set `to_be_folded' a variable
+ // that is not in the space of the octagon.
+ oc.fold_space_dimensions(to_be_folded, A);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A + B <= 2);
+ oc.add_constraint(C - B >= 2);
+
+ Variables_Set to_be_folded;
+ to_be_folded.insert(C);
+
+ try {
+ to_be_folded.insert(A);
+ // This is an invalid use of the method
+ // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+ // it is illegal to insert in the set `to_be_folded' the variable
+ // `var' that is not in the space of the octagon.
+ oc.fold_space_dimensions(to_be_folded, A);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ oct1.OK();
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(1, EMPTY);
+
+ oct1.add_space_dimensions_and_embed(1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ oct1.OK();
+
+ oct1.fold_space_dimensions(to_fold, B);
+
+ Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frequency1.cc b/tests/Octagonal_Shape/frequency1.cc
new file mode 100644
index 0000000..2959faf
--- /dev/null
+++ b/tests/Octagonal_Shape/frequency1.cc
@@ -0,0 +1,361 @@
+/* Test Octagonal_Shape::frequency().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+ Variable A(0);
+
+ TOctagonal_Shape os1(1);
+
+ TOctagonal_Shape os2(1, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (!os1.frequency(A, num1, den1, valn1, vald1)
+ && !os2.frequency(A, num2, den2, valn2, vald2));
+ print_constraints(os1, "*** os1 ***");
+ print_constraints(os2, "*** os2 ***");
+
+ return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+ TOctagonal_Shape os1(0);
+
+ TOctagonal_Shape os2(0, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (os1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+ && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+ && !os2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+ print_constraints(os1, "*** os1 ***");
+ print_constraints(os2, "*** os2 ***");
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ TOctagonal_Shape os(1);
+ os.add_constraint(A == 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!os.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(A <= 0);
+ os.add_constraint(A - B >= 5);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!os.frequency(Linear_Expression(B), num, den, valn, vald));
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(2*A == 1);
+ os.add_constraint(B == 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == -1 && vald == 2);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(A <= 1);
+ os.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!os.frequency(Linear_Expression(A - B), num, den, valn, vald));
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(2*A - 2*B == 2);
+ os.add_constraint(2*C == 2);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 3 && vald == 1);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(2*A - 2*B == 2);
+ os.add_constraint(2*C == 2);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 3 && vald == 1);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(2*A + 2*B == 2);
+ os.add_constraint(2*C == 2);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A + B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 3 && vald == 1);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(2*A + 2*B == 2);
+ os.add_constraint(B - C == 2);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A - B + 2*C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == -2 && vald == 1);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(2*A - 2*B == 2);
+ os.add_constraint(B + C == 1);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (os.frequency(Linear_Expression(A + B + 2*C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 4 && vald == 1);
+ print_constraints(os, "*** os ***");
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape os(3);
+ os.add_constraint(4*A - 4*B == 1);
+ os.add_constraint(3*C == 1);
+ os.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool discrete = os.frequency(Linear_Expression(A - B),
+ num, den, valn, vald);
+ // If the shape is based on an integral coefficient type, then
+ // approximations will induce non discreteness of the linear expression.
+ bool ok
+ = std::numeric_limits<TOctagonal_Shape::coefficient_type_base>::is_integer
+ ? (!discrete && num == 0 && den == 0 && valn == 0 && vald == 0)
+ : (discrete && num == 0 && den == 1 && valn == 1 && vald == 4);
+ print_constraints(os, "*** os ***");
+ nout << "num " << num << ", den " << den << endl;
+ nout << "valn " << valn << ", vald " << vald << endl;
+
+ return ok;
+}
+
+// Test of an empty octagonal_shape in 1-dimension.
+bool
+test14() {
+ Variable A(0);
+
+ TOctagonal_Shape os(1);
+ os.add_constraint(A <= 0);
+ os.add_constraint(A >= 1);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!os.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test08, TOctagonal_Shape);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombdshape1.cc b/tests/Octagonal_Shape/frombdshape1.cc
new file mode 100644
index 0000000..71eff8b
--- /dev/null
+++ b/tests/Octagonal_Shape/frombdshape1.cc
@@ -0,0 +1,55 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - B <= 5);
+ cs.insert(A - B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ TBD_Shape bd(cs);
+
+ TOctagonal_Shape os(bd);
+
+ Octagonal_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(os, known_result));
+
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombox1.cc b/tests/Octagonal_Shape/frombox1.cc
new file mode 100644
index 0000000..de330f3
--- /dev/null
+++ b/tests/Octagonal_Shape/frombox1.cc
@@ -0,0 +1,358 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Box<Interval>&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+ Rational_Box box(2);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(3*B == 2);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(3*B == 2);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(3*A == -2);
+ box.add_constraint(B == -10);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(3*A == -2);
+ known_oct.add_constraint(B == -10);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+ print_constraints(known_oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Rational_Box box(3);
+ box.add_constraint(5*C == 15);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(3);
+ known_oct.add_constraint(5*C == 15);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+ Rational_Box box(0);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct;
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+ Rational_Box box(2);
+ box.set_empty();
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2, EMPTY);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Rational_Box box(4);
+ box.add_constraint(D == 4);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(4);
+ known_oct.add_constraint(D == 4);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Unit square.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(A <= 1);
+ box.add_constraint(B >= 0);
+ box.add_constraint(B <= 1);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(A >= 0);
+ known_oct.add_constraint(A <= 1);
+ known_oct.add_constraint(B >= 0);
+ known_oct.add_constraint(B <= 1);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(A >= 0);
+ box.add_constraint(2*B == 1);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(A >= 0);
+ known_oct.add_constraint(2*B == 1);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A <= 3);
+ box.add_constraint(2*B == 1);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(7*A <= 3);
+ known_oct.add_constraint(2*B == 1);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A == 3);
+ box.add_constraint(2*B >= 1);
+ box.add_constraint(2*B <= 0);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(7*A == 3);
+ known_oct.add_constraint(2*B >= 1);
+ known_oct.add_constraint(2*B <= 0);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+ Rational_Box box(0);
+ box.set_empty();
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(0, EMPTY);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Rational_Box box(6);
+ box.add_constraint(3*A == -2);
+ box.add_constraint(4*B == -11);
+ box.add_constraint(3*D == 18);
+ box.add_constraint(7*E == 15);
+ box.add_constraint(7*F == -15);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(6);
+ known_oct.add_constraint(3*A == -2);
+ known_oct.add_constraint(4*B == -11);
+ known_oct.add_constraint(3*D == 18);
+ known_oct.add_constraint(7*E == 15);
+ known_oct.add_constraint(7*F == -15);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Rational_Box box(2);
+ box.add_constraint(7*A == 3);
+ box.add_constraint(2*B >= 1);
+ box.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct(box);
+
+ TOctagonal_Shape known_oct(2);
+ known_oct.add_constraint(7*A == 3);
+ known_oct.add_constraint(2*B >= 1);
+ known_oct.add_constraint(B >= 1);
+
+ bool ok = (oct == known_oct);
+
+ print_constraints(oct, "*** oct(box) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgensys1.cc b/tests/Octagonal_Shape/fromgensys1.cc
new file mode 100644
index 0000000..3ed4315
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgensys1.cc
@@ -0,0 +1,271 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Generator_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Generator_System gs;
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(closure_point(V));
+
+ try {
+ // It is illegal to build a Octagonal_Shape starting from a non-empty
+ // generator system having no points.
+ TOctagonal_Shape oct(gs);
+
+ // It is an error if the exception is not thrown.
+ return false;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ return false;
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable V(10);
+
+ Generator_System gs;
+ gs.insert(ray(V));
+
+ try {
+ // It is illegal to build a Octagonal_Shape starting from a non-empty
+ // generator system having no points.
+ TOctagonal_Shape oct(gs);
+
+ // It is an error if the exception is not thrown.
+ return false;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ return false;
+ }
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(ray(A + B));
+ gs.insert(point(1*A + 2*B + 3*C + 4*D));
+ gs.insert(point(2*A + 3*B + 4*C + 5*D));
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C >= 3);
+ known_result.add_constraint(C <= 4);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 5);
+ known_result.add_constraint(A == B-1);
+ known_result.add_constraint(C == D-1);
+ known_result.add_constraint(C <= A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(A >= B);
+ ph.add_constraint(B >= 2*C);
+ ph.add_constraint(C >= 3*D);
+ ph.add_constraint(D >= 4);
+ ph.add_constraint(A-D <= 50);
+
+ TOctagonal_Shape oct(ph.generators());
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(C <= 30);
+ known_result.add_constraint(D >= 4);
+ known_result.add_constraint(D <= 10);
+ known_result.add_constraint(B - A <= 0);
+ known_result.add_constraint(A - D <= 50);
+ known_result.add_constraint(B - C >= 12);
+ known_result.add_constraint(C - D <= 23);
+ known_result.add_constraint(C - D >= 8);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(2*A + B));
+ gs.insert(ray(-3*A + D));
+
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(-3*A + 4));
+ gs.insert(ray(-2*D - 4));
+
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+ known_result.add_constraint(D <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(line(2*A + B));
+ gs.insert(line(-3*A + D));
+
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(C == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(line(2*A + 4));
+ gs.insert(line(D - 3));
+
+ TOctagonal_Shape oct(gs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B == 0);
+ known_result.add_constraint(C == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgrid1.cc b/tests/Octagonal_Shape/fromgrid1.cc
new file mode 100644
index 0000000..4ca9147
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgrid1.cc
@@ -0,0 +1,202 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+ and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 0) / 0);
+ gr.add_congruence((y - z %= 0) / 0);
+ gr.add_congruence((z %= 0) / 1);
+
+ TOctagonal_Shape oct(gr);
+
+
+ Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+ known_oct.add_constraint(x + y == 0);
+ known_oct.add_constraint(y - z == 0);
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+ Grid gr(2);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 1) / 3);
+ gr.add_congruence((y - z %= 2) / 5);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+ Grid gr(0);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct;
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+ Grid gr(2, EMPTY);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct(2, EMPTY);
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// A single point.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x - y %= 1) / 0);
+ gr.add_congruence((y %= 0) / 0);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+ known_oct.add_constraint(x == 1);
+ known_oct.add_constraint(y == 0);
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+ Grid gr(0, EMPTY);
+
+ TOctagonal_Shape oct(gr);
+
+ Octagonal_Shape<mpq_class> known_oct(0, EMPTY);
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+ Grid gr(2);
+ Constraint_System cs = gr.constraints();
+
+ TOctagonal_Shape oct(cs);
+
+ Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+ bool ok = (check_result(oct, known_oct));
+
+ print_constraints(oct, "*** oct ***");
+ print_constraints(known_oct, "*** known_oct ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromoctagonalshape1.cc b/tests/Octagonal_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..c9754ad
--- /dev/null
+++ b/tests/Octagonal_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,133 @@
+/* Test Octagonal_Shape copy construct, construction from other
+ Octagonal shapes and assignment.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TOctagonal_Shape bds1(cs);
+
+ TOctagonal_Shape bds(bds1);
+
+ Octagonal_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(bds, known_result));
+
+ print_constraints(bds, "*** bds ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TOctagonal_Shape os1(cs);
+
+ TOctagonal_Shape os = os1;
+
+ Octagonal_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(os, known_result));
+
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TOctagonal_Shape os1(cs);
+
+ TOctagonal_Shape os(1);
+ os = os1;
+
+ Octagonal_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(os, known_result));
+
+ print_constraints(os, "*** os ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 18);
+ TOctagonal_Shape os1(cs);
+
+ Octagonal_Shape<mpq_class> os(os1);
+
+ Octagonal_Shape<mpq_class> known_result(cs);
+
+ bool ok = (check_result(os, known_result));
+
+ print_constraints(os, "*** bds ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frompolyhedron1.cc b/tests/Octagonal_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..c036e5e
--- /dev/null
+++ b/tests/Octagonal_Shape/frompolyhedron1.cc
@@ -0,0 +1,245 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B <= 5);
+ cs.insert(A + 2*B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(3*A - 5*B <= 18);
+ C_Polyhedron ph(cs);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(11*A <= 61);
+ known_result.add_constraint(2*B <= 5);
+ known_result.add_constraint(5*B >= -18);
+ known_result.add_constraint(11*A - 11*B <= 64);
+ known_result.add_constraint(11*A + 11*B <= 58);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result,
+ "1.21e-6", "5.76e-7", "3.91e-7"));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph(0, UNIVERSE);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(0);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+// Variable A(0);
+// Variable B(1);
+// Variable C(2);
+// Variable D(3);
+
+ C_Polyhedron ph(4, UNIVERSE);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(2*A - 3*B >= 4);
+ cs.insert(Linear_Expression(-3) >= 0);
+ cs.insert(Linear_Expression(7) == 0);
+ C_Polyhedron ph(cs);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A - B >= 4);
+ cs.insert(-C - D >= 0);
+ cs.insert(A + B - C == 0);
+ cs.insert(-A + B - C < 4);
+ cs.insert(A - B - C + D > 1);
+ NNC_Polyhedron ph(cs);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A >= -2);
+ known_result.add_constraint(4*B <= -5);
+ known_result.add_constraint(A - B >= 4);
+ known_result.add_constraint(4*(A - C) >= 5);
+ known_result.add_constraint(B + D <= 2);
+ known_result.add_constraint(B - C <= 2);
+ known_result.add_constraint(C + D <= 0);
+
+ bool ok = (oct1 == oct2
+ && check_result(oct1, known_result));
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(2*A - 3*B >= 4);
+ cs.insert(-3*A >= 0);
+ cs.insert(B + 2 == 0);
+ C_Polyhedron ph(cs);
+
+ TOctagonal_Shape oct1(ph, POLYNOMIAL_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B == -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 4);
+ cs.insert(B >= 10);
+ cs.insert(B <= 0);
+ C_Polyhedron ph(cs);
+
+ TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+ TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (oct1 == oct2
+ && Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromspacedim1.cc b/tests/Octagonal_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..21ba78f
--- /dev/null
+++ b/tests/Octagonal_Shape/fromspacedim1.cc
@@ -0,0 +1,123 @@
+/* Test Octagonal_Shape::Octagonal_Shape(dimension_type, Degenerate_Element).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TOctagonal_Shape oc(0, EMPTY);
+
+ bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oc(0, UNIVERSE);
+
+ bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 0);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TOctagonal_Shape oc(4, EMPTY);
+
+ bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oc(4, UNIVERSE);
+
+ bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 4);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(A <= -1);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C <= 2);
+ oc.add_constraint(C >= 1);
+
+ bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(A <= 1);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B <= 1);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(C <= 2);
+ oc.add_constraint(C >= 1);
+
+ bool ok = (oc.OK() && oc.space_dimension() == 3);
+
+ print_constraints(oc, "*** oc ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage1.cc b/tests/Octagonal_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..860b721
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,604 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B <= 5);
+ oct.add_constraint(A <= B);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B - A >= 2);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(A - B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+
+ oct.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image"
+ "(A, LESS_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x >= 2);
+ oct.add_constraint(x - y <= 3);
+ oct.add_constraint(y <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(- y <= 1);
+
+ oct.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(x,"
+ "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x >= 2);
+ oct.add_constraint(x - y <= 3);
+ oct.add_constraint(y <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(x <= 5);
+ known_result.add_constraint(x - y <= 1);
+
+ oct.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(y, "
+ "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= 4);
+ oct.add_constraint(x <= -6);
+ oct.add_constraint(y == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2 , EMPTY);
+
+ oct.generalized_affine_image(y, LESS_OR_EQUAL, Linear_Expression(2));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(y, "
+ "LESS_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ // Variable y(1);
+
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+
+ oct.generalized_affine_image(x, EQUAL, Linear_Expression(6));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(x, EQUAL, 6) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A <= 3);
+
+ oct.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(3));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A, "
+ "LESS_OR_EQUAL, 3) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(B, Linear_Expression(5));
+
+ oct.generalized_affine_image(B, EQUAL, Linear_Expression(5));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, EQUAL, 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 0);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(B <= 1);
+
+ oct.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(2));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C + A <= 3);
+ known_result.add_constraint(C + B <= 3);
+
+ oct.generalized_affine_image(C, LESS_OR_EQUAL, C + 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(C, "
+ "LESS_OR_EQUAL, C + 1) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(C, C + 1);
+
+ oct.generalized_affine_image(C, EQUAL, C + 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(C, "
+ "EQUAL, C+1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B - A >= -2);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C + A <= 2);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= C + 3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C + A <= 2);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, C + 3) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <=2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(B, C + 3);
+
+ oct.generalized_affine_image(B, EQUAL, C + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, EQUAL, C+3) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(B <= 4);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, B + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, B + 3) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(B + C <= -3);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, C + 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(A + B <= -3);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 3, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, A + 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(B - A >= 3);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A + 3) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(A + B >= -3);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A + 3, -1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage2.cc b/tests/Octagonal_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..5a470e1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,357 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Linear_Expression e1(x + 2);
+ Linear_Expression e2(x - 2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= 4);
+ oct.add_constraint(x <= -6);
+ oct.add_constraint(y == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(x + 2, "
+ "LESS_OR_EQUAL, x - 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Linear_Expression e1(6);
+ Linear_Expression e2(x - 4);
+
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(6, "
+ "EQUAL, x-4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(B);
+ Linear_Expression e2(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 1);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(A + 5);
+ Linear_Expression e2(4);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(A, Linear_Expression(-1));
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A+5, "
+ "EQUAL, 4) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(2);
+ Linear_Expression e2(B);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 0);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(A + B == 0);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(2, "
+ "GREATER_OR_EQUAL, B) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C + 1);
+ Linear_Expression e2(A - 3);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C <= -3);
+ known_result.add_constraint(A + B <= 2);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(A - C >= 4);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(C + 1, "
+ "LESS_OR_EQUAL, A - 3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(C + 1);
+ Linear_Expression e2(A + 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(C, A + 1);
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(C+1, EQUAL, A+2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(B - 1);
+ Linear_Expression e2(A - 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B - A >= -1);
+ known_result.add_constraint(C + A <= 2);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B - 1, "
+ "GREATER_OR_EQUAL, A - 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(-C + 3);
+ Linear_Expression e2(-B + 4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C >= B - 1);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C - A >= -1);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+ "LESS_OR_EQUAL, -B + 4) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Linear_Expression e1(-C + 3);
+ Linear_Expression e2(-B + 4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <=2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.add_constraint(C <= B - 1);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C + A <= 1);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B + A <= 2);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+ "GREATER_OR_EQUAL, -B + 4) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression e1(2);
+ Linear_Expression e2(B);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 0);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A + B == 0);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(2, "
+ "LESS_OR_EQUAL, B) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage3.cc b/tests/Octagonal_Shape/generalizedaffineimage3.cc
new file mode 100644
index 0000000..7242b2b
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage3.cc
@@ -0,0 +1,593 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x <= 4);
+ oct.add_constraint(x >= -6);
+ oct.add_constraint(y == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(x >= -6);
+ known_result.add_constraint(y <= 1);
+
+ oct.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(y, "
+ "LESS_OR_EQUAL, -y + 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x <= 4);
+ oct.add_constraint(x >= -6);
+ oct.add_constraint(y == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= -7);
+ known_result.add_constraint(y == 0);
+
+ oct.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(x, "
+ "GREATER_OR_EQUAL, -x - 3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 2);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 3*B + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B >= -1);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Linear_Expression expr(2*A + 3);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(A + B == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= 1);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(2*(-A - B) <= -3);
+
+ oct.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A, "
+ "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A + B <= 2);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(C, "
+ "LESS_OR_EQUAL, 2*C + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(C, 5*C - 3, 4);
+
+ oct.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(C, "
+ "EQUAL, 5*C - 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -1);
+ known_result.add_constraint(C + A <= 2);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, -B - 2, 3) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(C + A <= 2);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 2*C + 3, -3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <=2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+ oct.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(B, "
+ "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x + y >= 0);
+ oct.add_constraint(y >= 0);
+ oct.add_constraint(z <= 2);
+ oct.add_constraint(z - x >= 9);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::generalized_affine_image(v, e, d): it is illegal
+ // to apply the method to a linear expression
+ // with the denominator equal to zero.
+ Coefficient d = 0;
+ oct.generalized_affine_image(y, LESS_OR_EQUAL, y + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ oct.generalized_affine_image(x, LESS_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ oct.generalized_affine_image(x, GREATER_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply this method to an expression having space dimension
+ // greater than the octagon's space dimension.
+ oct.generalized_affine_image(y, GREATER_OR_EQUAL, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply this method to a variable having space dimension
+ // greater than the octagon's space dimension.
+ oct.generalized_affine_image(z, GREATER_OR_EQUAL, y);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `rhs' expression that
+ // does not appear in the octagon.
+ oct.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `lhs' expression that
+ // does not appear in the octagon.
+ oct.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+ oct.add_constraint(1 >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_image(lhs, r, rhs): it is illegal
+ // to use a strict relation symbol.
+ oct.generalized_affine_image(y - 3, GREATER_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(C + B >= -3);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3, -1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, C + 3, -1) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(B - C >= 3);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, C + 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage4.cc b/tests/Octagonal_Shape/generalizedaffineimage4.cc
new file mode 100644
index 0000000..bb11643
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage4.cc
@@ -0,0 +1,381 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Linear_Expression e1(3*x + 2);
+ Linear_Expression e2(2*x - 3);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x == 4);
+ oct.add_constraint(y <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y <= 0);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(3*x + 2, "
+ "LESS_OR_EQUAL, 2*x - 3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Linear_Expression e1(6);
+ Linear_Expression e2(3*x - 4);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y <= 7);
+ oct.add_constraint(y >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(x, Linear_Expression(10), 3);
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct, "*** oct.generalized_affine_image(6, "
+ "EQUAL, 3*x - 4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(2*B + 3*A);
+ Linear_Expression e2(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(3*A + 2*B, "
+ "LESS_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-2*A + 5);
+ Linear_Expression e2(-4*B);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.affine_image(A, 4*B + 5, 2);
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(-2*A + 5, "
+ "EQUAL, -4*B) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(A + 2*B - 5);
+ Linear_Expression e2(3*B);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 0);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A + 2*B - 5, "
+ "GREATER_OR_EQUAL, 3*B) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(2*B + C + 1);
+ Linear_Expression e2(A - 3*B + 2*C);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);;
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+ "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(2*B + C + 1);
+ Linear_Expression e2(A - 3*B + 2*C);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+ "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(-2*A - B - 1);
+ Linear_Expression e2(3*A + B + 4*C - 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(-2*A - B - 1, "
+ "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(-2*C + 3);
+ Linear_Expression e2(-3*B + 4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A + B <= 2);
+ known_result.add_constraint(A - B == 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A <= 1);
+
+ oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(-2*C + 3, "
+ "LESS_OR_EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(3);
+ Linear_Expression e2(4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <=2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(3, "
+ "GREATER_OR_EQUAL, 4) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(A - 2*C + 3);
+ Linear_Expression e2(-3*B + 4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 1);
+
+ oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+ "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(A - 2*C + 3);
+ Linear_Expression e2(-3*B + 4);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A - B == 0);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + A <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 1);
+
+ oct.generalized_affine_image(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+ "EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage5.cc b/tests/Octagonal_Shape/generalizedaffineimage5.cc
new file mode 100644
index 0000000..c865a08
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage5.cc
@@ -0,0 +1,344 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(4*B <= 5);
+ known_result.add_constraint(4*(A + B) <= 51);
+ known_result.add_constraint(4*(C + B) <= 1);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, -2*A - 3*C + 3, 4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, -2*A - 3*C + 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(B - C <= 12);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(4*(B - A) <= 9);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(2*(B + C) <= -5);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, A + 2*C + 3, -2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(4*(B + A) <= 9);
+
+ oct.generalized_affine_image(B, LESS_OR_EQUAL, -4*A - 3*C + 3, 4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "LESS_OR_EQUAL, -4*A - 3*C + 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(4*(B - A) >= -3);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(2*(B - C) >= 5);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C <= 2);
+ oct.add_constraint(B >= -1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(C >= -2);
+ known_result.add_constraint(4*(B + A) >= -9);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, -4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, 4*A - 3*C + 3, -4) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 21);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 21);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(2*(B + C) >= 5);
+
+ oct.generalized_affine_image(B, GREATER_OR_EQUAL, A - 2*C + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_image(B, "
+ "GREATER_OR_EQUAL, A - 2*C + 3, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage1.cc b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..dc3c7c1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,618 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(2*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(2*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(4*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A == 1);
+ known_result.add_constraint(-B >= 4);
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -B+1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(4*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(4*A == 1);
+ known_result.add_constraint(B >= 4);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(7*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(7*A == 1);
+ known_result.add_constraint(B >= 2);
+
+ bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(5*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(5*A == 1);
+ known_result.add_constraint(-B >= 2);
+
+ bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(-2*B >= 3);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(B >= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(-2*B >= 5);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B >= 7);
+ oct.add_constraint(3*C <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*B <= 14);
+ known_result.add_constraint(3*B - 3*A <= 13);
+ known_result.add_constraint(3*B - 3*C <= 7);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ // If the Coefficient type is not wide enough, do nothing.
+ if (std::numeric_limits<Coefficient>::is_bounded
+ && (std::numeric_limits<Coefficient>::min() > -203
+ || std::numeric_limits<Coefficient>::max() < 629))
+ return true;
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B >= 7);
+ oct.add_constraint(3*C <= 7);
+ oct.add_constraint(5*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(20*B <= -203);
+ known_result.add_constraint(60*A - 60*B >= 629);
+ known_result.add_constraint(60*A + 60*B <= -589);
+ known_result.add_constraint(20*C - 20*B >= 231);
+ known_result.add_constraint(4*C + 4*B <= -35);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+ bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B >= 7);
+ oct.add_constraint(3*C <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B >= 7);
+ oct.add_constraint(3*C <= 7);
+ oct.add_constraint(5*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(12*B >= -35);
+ known_result.add_constraint(4*A - 4*B <= 13);
+ known_result.add_constraint(4*C - 4*B <= 21);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(oct, known_result, "1.16e-5", "5.04e-6", "3.50e-6");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B <= 7);
+ oct.add_constraint(3*C <= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*B <= 35);
+ known_result.add_constraint(3*B - 3*A <= 34);
+ known_result.add_constraint(3*B - 3*C <= 28);
+ known_result.add_constraint(3*C <= 7);
+
+ bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B <= 7);
+ oct.add_constraint(3*C <= 7);
+ oct.add_constraint(5*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(20*B <= 27);
+ known_result.add_constraint(60*B - 60*A <= 61);
+ known_result.add_constraint(60*A + 60*B <= 101);
+ known_result.add_constraint(20*C - 20*B >= 1);
+ known_result.add_constraint(4*C + 4*B <= 11);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+ bool ok = check_result(oct, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(3*A == 1);
+ oct.add_constraint(2*B >= 7);
+ oct.add_constraint(3*C <= 7);
+ oct.add_constraint(5*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(3*A == 1);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(2*A == 1);
+ oct.add_constraint(B >= 5);
+ oct.add_constraint(3*C <= 7);
+ oct.add_constraint(5*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A == 1);
+ known_result.add_constraint(3*C <= 7);
+ known_result.add_constraint(5*C >= 7);
+
+ oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+ bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(2*A == 1);
+ oct.add_constraint(B <= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(2*A == 1);
+ oct.add_constraint(B <= 5);
+ oct.add_constraint(3*C <= 8);
+ oct.add_constraint(2*C >= 7);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "EQUAL, 3*A+2) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A <= 2);
+ oct.add_constraint(B <= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B, 5) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A <= 2);
+ oct.add_constraint(B <= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3, 2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 5);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B + 3, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage2.cc b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..e9ee9f1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,620 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x + y >= 0);
+ oct.add_constraint(y >= 0);
+ oct.add_constraint(z <= 2);
+ oct.add_constraint(z - x >= 9);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::generalized_affine_preimage(v, e, d):
+ // it is illegal to apply the method with denominator equal to zero.
+ Coefficient d = 0;
+ oct.generalized_affine_preimage(y, LESS_OR_EQUAL, y + 1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+ // it is illegal to use a strict relation symbol.
+ oct.generalized_affine_preimage(x, LESS_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+ // it is illegal to use a strict relation symbol.
+ oct.generalized_affine_preimage(x, GREATER_THAN, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+ // it is illegal to apply the method to an expression having
+ // space dimension greater than the octagon's space dimension.
+ oct.generalized_affine_preimage(y, GREATER_OR_EQUAL, z);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+ // it is illegal to use a variable in the 'expr' expression that
+ // does not appear in the octagon.
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+ // it is illegal to apply the method to a variable having space dimension
+ // greater than the octagon's space dimension.
+ oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B - A);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 4);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, B + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(2*B >= 3);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, -B + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, -B + 3, 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(2);
+ Linear_Expression e2(-B + 3);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B == 1);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(2, "
+ "GREATER_OR_EQUAL, -B + 3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-3);
+ Linear_Expression e2(B + 12);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B >= -15);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(B - A >= 2);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-3, "
+ "LESS_OR_EQUAL, B + 12) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-3);
+ Linear_Expression e2(B + 12);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B == -15);
+ known_result.add_constraint(B - A >= 2);
+ known_result.add_constraint(B + A <= 0);
+
+ oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-3, "
+ "EQUAL, B + 12) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(A - 1);
+ Linear_Expression e2(B - 2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL, e2 + 1);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A - 1, "
+ "GREATER_OR_EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(-A - 1);
+ Linear_Expression e2(2*C + B - 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B - A <= 2);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(C + B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL,
+ 2*C + B - 1, -1);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-A - 1, "
+ "LESS_OR_EQUAL, 2*C + B - 2) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(-A - 1);
+ Linear_Expression e2(D - 3*C - B - 2);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(B + A <= 2);
+ oct.add_constraint(B >= 1);
+ oct.add_constraint(B - D >= 1);
+ oct.add_constraint(C <= 1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(oct);
+ known_result.generalized_affine_preimage(A, EQUAL, D - 3*C - B - 1, -1);
+
+ oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-A - 1, "
+ "EQUAL, D - 3*C - B - 2) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(B - A - 1);
+ Linear_Expression e2(3*C - 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B + A <= 2);
+ oct.add_constraint(B >= 1);
+ oct.add_constraint(C <= 1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(C >= -2);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B - A - 1, "
+ "GREATER_OR_EQUAL, 3*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(B - A - 1);
+ Linear_Expression e2(B + 3*C - 2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 2);
+ oct.add_constraint(B + A <= 2);
+ oct.add_constraint(B >= 1);
+ oct.add_constraint(C <= 1);
+ oct.add_constraint(C >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 1);
+ known_result.add_constraint(C >= -2);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B - A - 1, "
+ "LESS_OR_EQUAL, B + 3*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(B - A);
+ Linear_Expression e2(A);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(B <= 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 3);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B - A, "
+ "GREATER_OR_EQUAL, A) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(B - A);
+ Linear_Expression e2(B + 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(A <= 2);
+ oct.add_constraint(B <= 3);
+ oct.add_constraint(C <= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(C <= -1);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B - A, "
+ "GREATER_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(-C + B - 2);
+ Linear_Expression e2(B + 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(A <= 2);
+ oct.add_constraint(B <= 3);
+ oct.add_constraint(C >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 2);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-C + B - 2, "
+ "LESS_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage3.cc b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..410b6e9
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,618 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(A - C + B - 2);
+ Linear_Expression e2(A + B + 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(A <= 2);
+ oct.add_constraint(B <= 3);
+ oct.add_constraint(C >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A - C + B - 2, "
+ "LESS_OR_EQUAL, A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a variable in the `rhs' expression that
+ // does not appear in the octagon.
+ oct.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a variable in the `lhs' expression that
+ // does not appear in the octagon.
+ oct.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(C + B >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+ // it is illegal to use a strict relation symbol.
+ oct.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(2*A + 3*B - 1);
+ Linear_Expression e2(B - 1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= -4);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(2*A + 3*B - 1, "
+ "LESS_OR_EQUAL, B - 1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(A + B);
+ Linear_Expression e2(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(A + B <= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A + B, "
+ "GREATER_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(A + B - 2*C + 2);
+ Linear_Expression e2(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(C <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A + B - 2*C + 2, "
+ "LESS_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(A - B + 2);
+ Linear_Expression e2(2);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(C <= -1);
+ oct.add_constraint(D >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(C <= -1);
+ known_result.add_constraint(D >= 2);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A - B + 2, "
+ "LESS_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(C - D - 5);
+ Linear_Expression e2(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(C <= -1);
+ oct.add_constraint(D >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C - D - 5, "
+ "GREATER_OR_EQUAL, 3) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(C - D - 5);
+ Linear_Expression e2(-11);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(C <= -1);
+ oct.add_constraint(D >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B >= -2);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C - D - 5, "
+ "GREATER_OR_EQUAL, -11) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-5);
+ Linear_Expression e2(-1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-5, "
+ "GREATER_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-5);
+ Linear_Expression e2(-1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(B >= -2);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-5, "
+ "LESS_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= -4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B + 2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, 2*B + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -5);
+ known_result.add_constraint(A <= 10);
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, A + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, A + 3) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(4*B <= 5);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, 2*B + 3, -2) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -6);
+ known_result.add_constraint(A <= 5);
+
+ oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -A + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "LESS_OR_EQUAL, -A + 3) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= -6);
+ known_result.add_constraint(A <= 10);
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, A + 3) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, 2*B + 3, -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, 2*B + 3, -2) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A >= -1);
+ known_result.add_constraint(A <= 10);
+
+ oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -A + 3);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(B, "
+ "GREATER_OR_EQUAL, -A + 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage4.cc b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
new file mode 100644
index 0000000..0078fd1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
@@ -0,0 +1,638 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3*C + 2, 5);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B + 3*C + 2, 5) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+ oct.add_constraint(C >= -12);
+ oct.add_constraint(C - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(C >= -12);
+ known_result.add_constraint(C <= 14);
+
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 3*C + 2, 5);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B - 3*C + 2, 5) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(2*C >= -31);
+ known_result.add_constraint(2*(B - C) <= 27);
+ known_result.add_constraint(2*(B + C) >= -35);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2*C + 5, 2);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A >= -31);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(B - A) <= 27);
+ known_result.add_constraint(2*(B + A) >= -35);
+
+
+ oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "LESS_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(2*C <= 31);
+ known_result.add_constraint(2*(C - B) <= 35);
+ known_result.add_constraint(2*(B + C) <= 27);
+
+ oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 2*C + 5, 2);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "LESS_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A <= 9);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(A - B) <= 27);
+ known_result.add_constraint(2*(B + A) <= 5);
+
+ oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A <= 19);
+ known_result.add_constraint(2*(A - B) <= 23);
+ known_result.add_constraint(B >= -2);
+
+ oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(B <= -2);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A >= -23);
+ known_result.add_constraint(2*(B - A) <= 19);
+ known_result.add_constraint(B <= -2);
+
+ oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(2*C <= 9);
+ known_result.add_constraint(2*(C - B) <= 13);
+ known_result.add_constraint(2*(B + C) <= 5);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 2*C + 5, 2);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A <= 17);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(A - B) <= 21);
+ known_result.add_constraint(2*(B + A) <= 45);
+
+
+ oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, 2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "GREATER_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 10);
+ oct.add_constraint(A >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(2*C >= -17);
+ known_result.add_constraint(2*(B - C) <= 45);
+ known_result.add_constraint(2*(B + C) >= -21);
+
+ oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B - 2*C + 5, 2);
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A, "
+ "GREATER_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(2*A >= -39);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+ known_result.add_constraint(2*(B - A) <= 67);
+ known_result.add_constraint(2*(B + A) >= -43);
+
+ oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+ oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, D + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "GREATER_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(C <= 10);
+ oct.add_constraint(C >= -11);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - C <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B <= 14);
+ known_result.add_constraint(B >= -2);
+
+ oct.generalized_affine_preimage(C, LESS_OR_EQUAL, D + 2*A + 5, -2);
+
+ bool ok = check_result(oct, known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(C, "
+ "LESS_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Linear_Expression e1(A - C + B - 2);
+ Linear_Expression e2(A + B + 1);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B >= -2);
+ oct.add_constraint(B - A <= -4);
+ oct.add_constraint(B - C <= -4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A - C + B - 2, "
+ "LESS_OR_EQUAL, A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1(-B + 3);
+ Linear_Expression e2(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= -1);
+
+ oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(-B + 3, "
+ "GREATER_OR_EQUAL, 2) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(A + 2*C - 3*D + 1);
+ Linear_Expression e2(B - 2);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B - D >= 2);
+ oct.add_constraint(C + A <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B <= 1);
+
+ oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A + 2*C - 3*D + 1, "
+ "EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(3*D + 1);
+ Linear_Expression e2(B - 2);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B - D >= 2);
+ oct.add_constraint(C + A <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(B - A >= 2);
+ known_result.add_constraint(C + A <= 1);
+
+ oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(3*D + 1, "
+ "EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Linear_Expression e1(A + 2*B - 3*D + 1);
+ Linear_Expression e2(B - 2);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(B - A >= 2);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B - D >= 2);
+ oct.add_constraint(C + A <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Octagonal_Shape<mpq_class> known_result(4);
+
+ oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+ print_constraints(oct,
+ "*** oct.generalized_affine_preimage(A + 2*B - 3*D + 1, "
+ "EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Octagonal_Shape/integerupperboundifexact1.cc b/tests/Octagonal_Shape/integerupperboundifexact1.cc
new file mode 100644
index 0000000..e0c8a8f
--- /dev/null
+++ b/tests/Octagonal_Shape/integerupperboundifexact1.cc
@@ -0,0 +1,462 @@
+/* Test Octagonal_Shape::integer_upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Octagonal_Shape<mpz_class> oct_empty(0, EMPTY);
+ Octagonal_Shape<mpz_class> oct_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ Octagonal_Shape<mpz_class> oct;
+
+ // empty, empty
+ oct = oct_empty;
+ ok &= oct.integer_upper_bound_assign_if_exact(oct_empty);
+ ok &= (oct == oct_empty);
+ print_constraints(oct, "*** empty union empty ***");
+
+ // empty, universe
+ oct = oct_empty;
+ ok &= oct.integer_upper_bound_assign_if_exact(oct_universe);
+ ok &= (oct == oct_universe);
+ print_constraints(oct, "*** empty union universe ***");
+
+ // universe, empty
+ oct = oct_universe;
+ ok &= oct.integer_upper_bound_assign_if_exact(oct_empty);
+ ok &= (oct == oct_universe);
+ print_constraints(oct, "*** universe union empty ***");
+
+ // universe, universe
+ oct = oct_universe;
+ ok &= oct.integer_upper_bound_assign_if_exact(oct_universe);
+ ok &= (oct == oct_universe);
+ print_constraints(oct, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= -2);
+ oct1.add_constraint(x <= -1);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 1);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(oct1);
+
+ bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= -2);
+ oct1.add_constraint(x <= 0);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x == 0);
+ oct1.add_constraint(y == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= -2);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(oct2);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(y == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(y >= 2);
+ oct2.add_constraint(y <= 4);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(oct1);
+
+ bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x == y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x == 0);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(oct1);
+
+ bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(oct1);
+
+ bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x <= y);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Octagonal_Shape<mpz_class> oct(3, UNIVERSE);
+ oct.add_constraint(x >= 0);
+ oct.add_constraint(x <= 2);
+ oct.add_constraint(y >= 0);
+ oct.add_constraint(y <= 4);
+ oct.add_constraint(z >= 0);
+ oct.add_constraint(z <= 4);
+ oct.add_constraint(x - y <= 2);
+ oct.add_constraint(z - y <= 2);
+
+ Octagonal_Shape<mpz_class> oct1(oct);
+ oct1.add_constraint(z <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(oct);
+ oct2.add_constraint(x - y <= 1);
+
+ Octagonal_Shape<mpz_class> known_result(oct);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+
+ ok &= (oct1 == oct);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Octagonal_Shape<mpz_class> oct(4, UNIVERSE);
+ oct.add_constraint(x - y <= 4);
+ oct.add_constraint(z - w <= 4);
+ oct.add_constraint(x - w <= 5);
+ oct.add_constraint(z <= 0);
+ oct.add_constraint(z - y <= 1);
+ oct.add_constraint(y + w >= -1);
+
+ Octagonal_Shape<mpz_class> oct1(oct);
+ oct1.add_constraint(x - y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Octagonal_Shape<mpz_class> oct2(oct);
+ oct2.add_constraint(z - w <= 2);
+
+ Octagonal_Shape<mpz_class> known_result(oct);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == oct);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ // const dimension_type dim = 200;
+ const dimension_type dim = 50;
+ Constraint_System cs;
+ for (dimension_type i = 1; i < dim; ++i) {
+ Variable x(i);
+ cs.insert(x >= 0);
+ cs.insert(x <= 4);
+ }
+
+ Variable x(0);
+
+ Octagonal_Shape<mpz_class> hypercube1(cs);
+ hypercube1.add_constraint(x >= 0);
+ hypercube1.add_constraint(x <= 4);
+
+ Octagonal_Shape<mpz_class> hypercube2(cs);
+ hypercube2.add_constraint(x >= 2);
+ hypercube2.add_constraint(x <= 6);
+
+ Octagonal_Shape<mpz_class> known_result(cs);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = hypercube1.integer_upper_bound_assign_if_exact(hypercube2);
+
+ ok &= (hypercube1 == known_result);
+
+ print_constraints(hypercube1, "*** hyp1 ***");
+ print_constraints(hypercube2, "*** hyp2 ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 3);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+ oct1.add_constraint(x - y <= 2);
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 3);
+ oct2.add_constraint(x <= 6);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+ && (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+/*
+ The following test shows that method
+ Octagonal_Shape<T>::integer_upper_bound_assign_if_exact
+ is not an upper bound operator (on the domain of rational shapes).
+*/
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x + y <= 2);
+ oct1.add_constraint(x - y <= 2);
+ oct1.add_constraint(x + y >= 1);
+ oct1.add_constraint(x - y >= 1);
+
+ Octagonal_Shape<mpz_class> oct2(oct1);
+ oct2.affine_image(x, x + 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(y == 0);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+ && (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Octagonal_Shape/intersection1.cc b/tests/Octagonal_Shape/intersection1.cc
new file mode 100644
index 0000000..57eff5e
--- /dev/null
+++ b/tests/Octagonal_Shape/intersection1.cc
@@ -0,0 +1,309 @@
+/* Test Octagonal_Shape::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(x - y <= 4);
+ oc1.add_constraint(x + y <= 6);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(-y <= -2);
+ oc2.add_constraint(x - y <= 5);
+ oc2.add_constraint(x + y <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 3);
+ known_result.add_constraint(-y <= -2);
+ known_result.add_constraint(x - y <= 4);
+ known_result.add_constraint(x + y <= 6);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 2);
+ oc1.add_constraint(A - B <= -1);
+ oc1.add_constraint(A + B <= 10);
+ oc1.add_constraint(A + C <= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(C <= 2);
+ oc2.add_constraint(A - B <= 5);
+ oc2.add_constraint(A - C <= 5);
+ oc2.add_constraint(A + B <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(A - B <= -1);
+ known_result.add_constraint(A + B <= 7);
+ known_result.add_constraint(A - C <= 5);
+ known_result.add_constraint(A + C <= 1);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 5);
+ oc1.add_constraint(A - B <= -1);
+ oc1.add_constraint(A + B <= -1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(C <= 2);
+ oc2.add_constraint(A - B <= 4);
+ oc2.add_constraint(A + B <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(A - B <= -1);
+ known_result.add_constraint(A + B <= -1);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 5);
+ oc1.add_constraint(A - B <= -1);
+ oc1.add_constraint(A - B >= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(A - B <= 4);
+ oc2.add_constraint(A + B <= 7);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape oc1(0, EMPTY);
+ TOctagonal_Shape oc2;
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape oc1;
+ TOctagonal_Shape oc2;
+
+ print_constraints(oc1, "*** oc1 ***");
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(0);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= y);
+
+ TOctagonal_Shape oc2(3);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::intersection_assign(oc2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ oc1.intersection_assign(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ // Variable C(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(A <= 5);
+ oc1.add_constraint(A + B <= 1);
+ oc1.add_constraint(A + B >= -1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3, EMPTY);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oc1.intersection_assign(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(A - B <= -1);
+ cs.insert(A + B <= -1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraints(cs);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(C <= 2);
+ oc2.add_constraint(A - B <= -2);
+ oc2.add_constraint(A + B <= -3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.intersection_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= -1);
+ known_result.add_constraint(C <= 2);
+ known_result.add_constraint(A - B <= -2);
+ known_result.add_constraint(A + B <= -3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..a9a57b3
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,340 @@
+/* Test Octagonal_Shape::limited_BHMZ05_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+
+ TOctagonal_Shape oct1(cs1);
+ print_constraints(oct1, "*** oct1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+
+ TOctagonal_Shape oct2(cs2);
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(y <= -1);
+ cs.insert(x <= 5);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct2.limited_BHMZ05_extrapolation_assign(oct1, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y - x <= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+ print_constraints(oct2,
+ "*** oct2.limited_BHMZ05_extrapolation_assign(oct1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ TOctagonal_Shape oct1(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ TOctagonal_Shape oct2(cs2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+
+ oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TOctagonal_Shape oct1(0, EMPTY);
+ TOctagonal_Shape oct2(0, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+
+ oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3, EMPTY);
+ TOctagonal_Shape oct2(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A + B <= 0);
+
+ oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A - B <= 1);
+
+ TOctagonal_Shape oct2(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A - B <= 2);
+
+ oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+
+ TOctagonal_Shape oct1(7);
+ oct1.add_constraint(A - B <= 1);
+ oct1.add_constraint(A - C <= 2);
+ oct1.add_constraint(C - B <= 2);
+ oct1.add_constraint(D - E == 0);
+ oct1.add_constraint(G + F == 0);
+
+ TOctagonal_Shape oct2(7);
+ oct2.add_constraint(A - B <= 0);
+ oct2.add_constraint(A - C <= 1);
+ oct2.add_constraint(C - B <= 2);
+ oct2.add_constraint(D - E == 0);
+ oct2.add_constraint(G + F == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(C - B <= 2);
+ cs.insert(D - E == 0);
+ cs.insert(F + G == 0);
+
+ oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(7);
+ known_result.add_constraint(C - B <= 2);
+ known_result.add_constraint(D - E == 0);
+ known_result.add_constraint(F + G == 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable y(1);
+
+ TOctagonal_Shape oc1(1);
+ TOctagonal_Shape oc2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc2, cs): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x - y >= 0);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(x <= 2);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y >= 0);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+ // illegal to apply this method to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x - y >= 0);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(x <= 2);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y >= 0);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+ // illegal to apply this method to a system of constraints that
+ // has a strict-inequality.
+ oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/limitedcc76extrapolation1.cc b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..2880e84
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,661 @@
+/* Test Octagonal_Shape::limited_CC76_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 4);
+ TOctagonal_Shape oct1(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 5);
+ TOctagonal_Shape oct2(cs2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 3);
+ known_result.add_constraint(y - x >= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oct1(0);
+ TOctagonal_Shape oct2(0);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A == -2);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A == -2);
+ oct2.add_constraint(B == 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A == -2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A == -2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 5);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A + B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+ known_result.add_constraint(A - B <= 6);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(A >= 5);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(A >= 3);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(A >= 3);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TOctagonal_Shape oct1(4);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B <= 6);
+ oct1.add_constraint(C - D == 5);
+
+ TOctagonal_Shape oct2(4);
+ oct2.add_constraint(A <= 4);
+ oct2.add_constraint(C - D == 5);
+ oct2.add_constraint(B <= 5);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A == 4);
+ cs.insert(C - D == 5);
+ cs.insert(A - B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(C - D == 5);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 4);
+ oct1.add_constraint(B >= 1);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= -2);
+ oct2.add_constraint(A >= 3);
+ oct2.add_constraint(B >= 4);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - 2*B <= 6);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A <= 2);
+ oct1.add_constraint(A >= 3);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A <= 1);
+ oct2.add_constraint(B == -1);
+ oct2.add_constraint(A >= 4);
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(C <= 4);
+ oct1.add_constraint(B >= 2);
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(C <= 3);
+ oct2.add_constraint(B >= 3);
+ oct2.add_constraint(A <= 3);
+ oct2.add_constraint(A >= 5);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(C <= 2);
+
+ print_constraints(cs, "*** cs ***");
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 4);
+ known_result.add_constraint(B >= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable y(1);
+
+ TOctagonal_Shape oc1(1);
+ TOctagonal_Shape oc2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_CC76_extrapolation_assign(oc2, cs): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ oc2.limited_CC76_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x - y >= 0);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(x <= 2);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y >= 0);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_CC76_extrapolation_assign(oc, cs): it is
+ // illegal to apply this method to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ oc2.limited_CC76_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x - y >= 0);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(x <= 2);
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x - y >= 0);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+ // illegal to apply this method to a system of constraints that
+ // has a strict-inequality.
+ oc2.limited_CC76_extrapolation_assign(oc1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3, EMPTY);
+ TOctagonal_Shape oct2(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A + B <= 0);
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A - B <= 1);
+
+ TOctagonal_Shape oct2(3, EMPTY);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Constraint_System cs;
+ cs.insert(A - B <= 2);
+
+ oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A - B <= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/mapspacedims1.cc b/tests/Octagonal_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..bb92cc1
--- /dev/null
+++ b/tests/Octagonal_Shape/mapspacedims1.cc
@@ -0,0 +1,255 @@
+/* Test Octagonal_Shape::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Partial_Function function;
+
+ TOctagonal_Shape oc1(3);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result;
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+return ok;
+}
+
+bool
+test02() {
+ Partial_Function function;
+
+ TOctagonal_Shape oc1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TOctagonal_Shape oc1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(2, 1);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 3);
+
+ TOctagonal_Shape oc1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x == 1);
+ known_result.add_constraint(y - x <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 0);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 3);
+ cs.insert(z - y <= 7);
+ cs.insert(y - x <= 2);
+
+ TOctagonal_Shape oc1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(x <= 4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 1);
+ function.insert(1, 0);
+
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 1);
+ cs.insert(z - y <= 7);
+ cs.insert(y - x <= 1);
+
+ TOctagonal_Shape oc1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+ known_result.add_constraint(y - x <= 7);
+ known_result.add_constraint(x + y <= 4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Partial_Function function;
+
+ TOctagonal_Shape oc1;
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ oc1.map_space_dimensions(function);
+
+ Octagonal_Shape<mpq_class> known_result;
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function function;
+ function.insert(2, 1);
+ function.insert(1, 0);
+ function.insert(0, 2);
+
+ Constraint_System cs;
+ cs.insert(x == 1);
+ cs.insert(z - x <= 1);
+ cs.insert(y - z <= -3);
+ cs.insert(x - y <= 1);
+
+ TOctagonal_Shape oc1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(oc1, "*** oc1 ***");
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ oc1.map_space_dimensions(function);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min1.cc b/tests/Octagonal_Shape/max_min1.cc
new file mode 100644
index 0000000..a5270d4
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min1.cc
@@ -0,0 +1,691 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+ and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(-x1-x2 >= -5);
+ oct.add_constraint(x1-x2 >= -5);
+ oct.add_constraint(x1 >= 0);
+ oct.add_constraint(x2 >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(x1-2*x2, num, den, included)
+ && num == 5 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(x1-2*x2, num, den, included)
+ && num == -10 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(-x1-x2 >= -5);
+ oct.add_constraint(x1-x2 >= -5);
+ oct.add_constraint(x1 >= 0);
+ oct.add_constraint(x2 >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(x1-x2, num, den, included)
+ && num == 5 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(x1-x2, num, den, included)
+ && num == -5 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(-x1 - x2 >= -10);
+ oct.add_constraint(-10*x1 - 10*x3 >= -60);
+ oct.add_constraint(x1 + x3 >= -150);
+ oct.add_constraint(x1 >= 0);
+ oct.add_constraint(x2 >= 0);
+ oct.add_constraint(x3 >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(-10*x1-6*x2-4*x3+4, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(-10*x1-6*x2-4*x3+4, num, den, included)
+ && num == -80 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(-x1 - x2 >= -10);
+ oct.add_constraint(-10*x1 - 10*x3 >= -60);
+ oct.add_constraint(x1 + x3 >= -150);
+ oct.add_constraint(x1 >= 0);
+ oct.add_constraint(x2 >= 0);
+ oct.add_constraint(x3 >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(x2-x3+5, num, den, included)
+ && num == 15 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(x2-x3+5, num, den, included)
+ && num == -1 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x1 - x2 <= 6);
+ oct.add_constraint(x1 + x2 <= 4);
+ oct.add_constraint(x1 >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(x1-2, num, den, included)
+ && num == 3 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(x1-2, num, den, included)
+ && num == -1 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x1(0);
+
+ TOctagonal_Shape oct(1, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = !oct.maximize(x1-2, num, den, included);
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(x1-2, num, den, included);
+
+ return ok;
+}
+
+bool
+test07() {
+
+ TOctagonal_Shape oct(0, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = !oct.maximize(Linear_Expression(2), num, den, included);
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(Linear_Expression(2), num, den, included);
+
+ return ok;
+}
+
+bool
+test08() {
+
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(Linear_Expression(2), num, den, included)
+ && num == 2 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(Linear_Expression(2), num, den, included);
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x1 <= x2 + 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Linear_Expression LE(x3);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::maximize(LE, num, den, included): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the OS.
+ oct.minimize(LE, num, den, included);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE;
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B);
+ bool ok = !oct.maximize(LE, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(LE, num, den, included, g)
+ && num == 2 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(A - B <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A - B);
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B - C <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C);
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B - C <= 0);
+ oct.add_constraint(E - D <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + B - C + 2*E - 2*D);
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape oct(5);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B - C >= 0);
+ oct.add_constraint(E - D >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(Linear_Expression(3));
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(LE, num, den, included, g)
+ && num == 3 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x >= y);
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(z);
+
+ try {
+ // This is an incorrect use of the method
+ // Octagonal_Shape::minimize(LE, num, den, included, g): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greater than the space dimension of the OS.
+ oct.minimize(LE, num, den, included, g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+
+ Octagonal_Shape<mpq_class> oct(1);
+ oct.add_constraint(5*A <= 2);
+ oct.add_constraint(5*A >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(3*A, num, den, included)
+ && num == 6 && den == 5 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(3*A, num, den, included)
+ && num == 3 && den == 5 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+
+ Octagonal_Shape<mpq_class> oct(1);
+ oct.add_constraint(5*A <= 2);
+ oct.add_constraint(3*A >= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(-7*A, num, den, included)
+ && num == -7 && den == 3 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(-7*A, num, den, included)
+ && num == -14 && den == 5 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST_F8(test03);
+ DO_TEST_F8(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min2.cc b/tests/Octagonal_Shape/max_min2.cc
new file mode 100644
index 0000000..627bf06
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min2.cc
@@ -0,0 +1,311 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+ and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= -1);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(5*A - 1, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(5*A - 1, num, den, included)
+ && num == -6 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= -1);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(-5*A - 1, num, den, included)
+ && num == 4 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(-5*A - 1, num, den, included)
+ && num == -6 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= -1);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(-5*A + 1, num, den, included)
+ && num == 6 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(-5*A + 1, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= -1);
+ oct.add_constraint(A <= 1);
+ oct.add_constraint(B <= 1);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ bool ok = oct.maximize(5*A + 1, num, den, included)
+ && num == 6 && den == 1 && included;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(5*A + 1, num, den, included)
+ && num == -4 && den == 1 && included;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A);
+ bool ok = !oct.maximize(LE, num, den, included, g);
+
+ if (!ok)
+ return false;
+
+ ok = oct.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A);
+
+ bool ok = oct.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = !oct.minimize(LE, num, den, included, g);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(2*A >= 1);
+ oct.add_constraint(B >= 1);
+ oct.add_constraint(2*A <= 3);
+ oct.add_constraint(B <= 4);
+
+ print_constraints(oct, "*** oct ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE(A + 4*B - 1);
+
+ bool ok_max = oct.maximize(LE, num, den, included, g)
+ && num == 33 && den == 2 && included
+ && g.is_point()
+ && g.coefficient(A) == 3 && g.coefficient(B) == 8
+ && g.divisor() == 2;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ bool ok_min = oct.minimize(LE, num, den, included, g)
+ && num == 7 && den == 2 && included
+ && g.is_point()
+ && g.coefficient(A) == 1 && g.coefficient(B) == 2
+ && g.divisor() == 2;
+
+ nout << (included ? "minimum" : "infinum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok_max && ok_min;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/maxspacedim1.cc b/tests/Octagonal_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..1bfc423
--- /dev/null
+++ b/tests/Octagonal_Shape/maxspacedim1.cc
@@ -0,0 +1,99 @@
+/* Test Octagonal_Shape::max_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ nout << Octagonal_Shape<signed char>::max_space_dimension()
+ << " (signed char)"
+ << endl
+ << Octagonal_Shape<short>::max_space_dimension() << " (short)"
+ << endl
+ << Octagonal_Shape<int>::max_space_dimension() << " (int)"
+ << endl
+ << Octagonal_Shape<long>::max_space_dimension() << " (long)"
+ << endl
+ << Octagonal_Shape<long long>::max_space_dimension() << " (long long)"
+ << endl
+#if PPL_SUPPORTED_FLOAT
+ << Octagonal_Shape<float>::max_space_dimension() << " (float)"
+ << endl
+#endif
+#if PPL_SUPPORTED_DOUBLE
+ << Octagonal_Shape<double>::max_space_dimension() << " (double)"
+ << endl
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+ << Octagonal_Shape<long double>::max_space_dimension()
+ << " (long double)"
+ << endl
+#endif
+ << Octagonal_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+ << endl
+ << Octagonal_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+ << endl;
+
+ if (Octagonal_Shape<signed char>::max_space_dimension()
+ < Octagonal_Shape<short>::max_space_dimension())
+ return false;
+
+ if (Octagonal_Shape<short>::max_space_dimension()
+ < Octagonal_Shape<int>::max_space_dimension())
+ return false;
+
+ if (Octagonal_Shape<int>::max_space_dimension()
+ < Octagonal_Shape<long>::max_space_dimension())
+ return false;
+
+ if (Octagonal_Shape<long>::max_space_dimension()
+ < Octagonal_Shape<long long>::max_space_dimension())
+ return false;
+
+#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE
+ if (Octagonal_Shape<float>::max_space_dimension()
+ < Octagonal_Shape<double>::max_space_dimension())
+ return false;
+#endif
+
+#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE
+ if (Octagonal_Shape<double>::max_space_dimension()
+ < Octagonal_Shape<long double>::max_space_dimension())
+ return false;
+#endif
+
+ if (2*Octagonal_Shape<mpz_class>::max_space_dimension()
+ < Octagonal_Shape<mpq_class>::max_space_dimension())
+ return false;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/membytes1.cc b/tests/Octagonal_Shape/membytes1.cc
new file mode 100644
index 0000000..a6482cb
--- /dev/null
+++ b/tests/Octagonal_Shape/membytes1.cc
@@ -0,0 +1,233 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TOctagonal_Shape& oct, const Constraint& c) {
+ const memory_size_type oct_memory_before = oct.total_memory_in_bytes();
+ const memory_size_type c_memory = c.total_memory_in_bytes();
+ oct.add_constraint(c);
+ const memory_size_type oct_memory_after = oct.total_memory_in_bytes();
+
+ nout << oct_memory_before
+ << " + " << c_memory
+ << " -> " << oct_memory_after
+ << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+ using namespace test01_namespace;
+
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ const memory_size_type x_total_size = x.total_memory_in_bytes();
+ const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+ nout << "*** Size of variables ***"
+ << endl
+ << "x.total_memory_in_bytes() = " << x_total_size
+ << endl
+ << "x.external_memory_in_bytes() = " << x_external_size
+ << endl << endl;
+ nout << "*** Size of linear expressions ***"
+ << endl;
+
+ Linear_Expression le(0);
+ memory_size_type le_total_size = le.total_memory_in_bytes();
+ memory_size_type le_external_size = le.external_memory_in_bytes();
+
+ using namespace IO_Operators;
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += x;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += 2*y;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += 4*z;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl << endl;
+
+ nout << "*** Adding constraints to an octagon ***" << endl;
+
+ TOctagonal_Shape oct(3);
+ add_constraint(oct, 4*x - 4*y + 14 >= 0);
+ add_constraint(oct, 4*x + 4*y + 2 >= 0);
+ add_constraint(oct, x + y - 1 >= 0);
+
+ add_constraint(oct, x + 1 >= 0);
+ add_constraint(oct, x + z - 1 >= 0);
+ add_constraint(oct, 2*x -2*z + 7 >= 0);
+ add_constraint(oct, x - y + 1 >= 0);
+
+ add_constraint(oct, x - y + 5 <= 0);
+ add_constraint(oct, 2*x - 2*z + 13 <= 0);
+ add_constraint(oct, -2*x + 2*z + 1 <= 0);
+ add_constraint(oct, -x + y - 1 <= 0);
+
+ add_constraint(oct, -x + y + 7 >= 0);
+ add_constraint(oct, -4*x + 4*y - 4 >= 0);
+ add_constraint(oct, -2*x + 2*z - 5 <= 0);
+ add_constraint(oct, -x + 1 >= 0);
+
+ add_constraint(oct, -x - z + 5 <= 0);
+ add_constraint(oct, -x - y + 5 <= 0);
+ add_constraint(oct, -x - y +13 <= 0);
+
+ const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+ const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+ const Constraint_System& cs = oct.constraints();
+ const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+ const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+ nout << endl;
+
+ nout << "*** Size of the user-visible octagons components ***"
+ << endl
+ << "oct.total_memory_in_bytes() = " << oct_total_size
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl
+ << "oct.external_memory_in_bytes() = " << oct_external_size
+ << endl
+ << "cs.external_memory_in_bytes() = " << cs_external_size
+ << endl << endl;
+
+ nout << "*** Size of a constraint system vs size of contained constraints"
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl;
+
+ memory_size_type cs_elements_size = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ cs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained constraints = " << cs_elements_size
+ << endl << endl;
+
+ return true;
+}
+
+bool test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(4*x - 4*y + 14 >= 0);
+ oct.add_constraint(4*x + 4*y + 2 <= 0);
+ oct.add_constraint(x + y - 1 >= 0);
+ oct.add_constraint(x + y - 5 <= 0);
+
+ const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+ const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+
+ Determinate<TOctagonal_Shape> doct(oct);
+
+ const memory_size_type doct_total_size = doct.total_memory_in_bytes();
+ const memory_size_type doct_external_size = doct.external_memory_in_bytes();
+
+ nout << "oct.total_memory_in_bytes() = " << oct_total_size
+ << endl
+ << "oct.external_memory_in_bytes() = " << oct_external_size
+ << endl
+ << "doct.total_memory_in_bytes() = " << doct_total_size
+ << endl
+ << "doct.external_memory_in_bytes() = " << doct_external_size
+ << endl;
+
+ Pointset_Powerset<TOctagonal_Shape> poct(oct);
+
+ TOctagonal_Shape qoct(3);
+ qoct.add_constraint(x >= 0);
+ qoct.add_constraint(y >= 0);
+ qoct.add_constraint(z >= 0);
+ qoct.add_constraint(x <= 1);
+ qoct.add_constraint(y <= 1);
+ qoct.add_constraint(z <= 1);
+ Pointset_Powerset<TOctagonal_Shape> pqoct(qoct);
+
+ Pointset_Powerset<TOctagonal_Shape> proct = pqoct;
+ proct.difference_assign(poct);
+
+ const memory_size_type poct_total_size = poct.total_memory_in_bytes();
+ const memory_size_type poct_external_size = poct.external_memory_in_bytes();
+ const memory_size_type pqoct_total_size = pqoct.total_memory_in_bytes();
+ const memory_size_type pqoct_external_size = pqoct.external_memory_in_bytes();
+ const memory_size_type proct_total_size = proct.total_memory_in_bytes();
+ const memory_size_type proct_external_size = proct.external_memory_in_bytes();
+
+ nout << "poct.total_memory_in_bytes() = " << poct_total_size
+ << endl
+ << "poct.external_memory_in_bytes() = " << poct_external_size
+ << endl
+ << "pqoct.total_memory_in_bytes() = " << pqoct_total_size
+ << endl
+ << "pqoct.external_memory_in_bytes() = " << pqoct_external_size
+ << endl
+ << "proct.total_memory_in_bytes() = " << proct_total_size
+ << endl
+ << "proct.external_memory_in_bytes() = " << proct_external_size
+ << endl;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Octagonal_Shape/minconstraints1.cc b/tests/Octagonal_Shape/minconstraints1.cc
new file mode 100644
index 0000000..666962e
--- /dev/null
+++ b/tests/Octagonal_Shape/minconstraints1.cc
@@ -0,0 +1,135 @@
+/* Test Octagonal_Shape<T>::minimized_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 1);
+ oct.add_constraint(B >= 0);
+ oct.add_constraint(A - B >= -2);
+ oct.add_constraint(A >= -3);
+ oct.add_constraint(A <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ const Constraint_System cs = oct.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** oct.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ C_Polyhedron ph_oct(cs);
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 2);
+ oct.add_constraint(B == 3);
+ oct.add_constraint(A - B == -1);
+ oct.add_constraint(A + B == 5);
+
+ print_constraints(oct, "*** oct ***");
+
+ const Constraint_System cs = oct.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** oct.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ C_Polyhedron ph_oct(cs);
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 2);
+ known_result.add_constraint(A - B <= -1);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+ return ok;
+}
+
+bool
+test03() {
+ TOctagonal_Shape oc(0, UNIVERSE);
+
+ print_constraints(oc, "*** oc ***");
+
+ const Constraint_System cs = oc.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** oc.minimized_constraints() ***" << endl;
+
+ dimension_type num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ nout << *i << endl;
+ ++num_constraints;
+ }
+
+ nout << "num_constraints == " << num_constraints << endl;
+
+ return num_constraints == 0;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons1.cc b/tests/Octagonal_Shape/relatwithcons1.cc
new file mode 100644
index 0000000..f16186d
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons1.cc
@@ -0,0 +1,596 @@
+/* Test Octagonal_Shape::relation_with(c).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(y <= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(y >= 0);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(y <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(y >= 0);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(x - y == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(x + y == 0);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape oct(4);
+ oct.add_constraint(x - y == 0);
+ oct.add_constraint(w <= 1);
+ oct.add_constraint(x + z >= 3);
+ oct.add_constraint(z - w <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(x + w >= 0);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x + y >= 1);
+ cs.insert(y >= 5);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ // An equality constraint non-intersecting the octagon.
+ Constraint c(y == -1);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+ cs.insert(B <= -1);
+ cs.insert(A - B <= 2);
+
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Constraint::zero_dim_false());
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(Constraint::zero_dim_false()) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(x == 1);
+ oct.add_constraint(y <= 0);
+ oct.add_constraint(z >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(x > 1);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+ Variable S(18);
+ Variable T(19);
+ Variable U(20);
+ Variable V(21);
+ Variable W(22);
+ Variable X(23);
+ Variable Y(24);
+ Variable Z(25);
+ Variable A1(26);
+ Variable B1(27);
+ Variable C1(28);
+ Variable D1(29);
+ Variable E1(30);
+ Variable F1(31);
+ Variable G1(32);
+ Variable H1(33);
+
+ TOctagonal_Shape oct(34);
+ oct.add_constraint(C >= 4);
+ oct.add_constraint(D >= 1);
+ oct.add_constraint(G == 0);
+ oct.add_constraint(L >= 5);
+ oct.add_constraint(O >= 1);
+ oct.add_constraint(A1 >= -1);
+ oct.add_constraint(A1 <= 511);
+ oct.add_constraint(C1 >= 0);
+ oct.add_constraint(H1 >= 1);
+ oct.add_constraint(C + D >= 5);
+ oct.add_constraint(E - F == 0);
+ oct.add_constraint(C - G >= 4);
+ oct.add_constraint(C + G >= 4);
+ oct.add_constraint(D - G >= 1);
+ oct.add_constraint(D + G >= 1);
+ oct.add_constraint(J - K == 0);
+ oct.add_constraint(L - C >= 1);
+ oct.add_constraint(C + L >= 9);
+ oct.add_constraint(D + L >= 6);
+ oct.add_constraint(L - G >= 5);
+ oct.add_constraint(G + L >= 5);
+ oct.add_constraint(M - N == 0);
+ oct.add_constraint(C + O >= 5);
+ oct.add_constraint(D + O >= 2);
+ oct.add_constraint(O - G >= 1);
+ oct.add_constraint(G + O >= 1);
+ oct.add_constraint(L + O >= 6);
+ oct.add_constraint(R - S == 0);
+ oct.add_constraint(U - V == 0);
+ oct.add_constraint(W - X == 0);
+ oct.add_constraint(Y - Z == 0);
+ oct.add_constraint(A1 - C <= 507);
+ oct.add_constraint(C + A1 >= 3);
+ oct.add_constraint(A1 - D <= 510);
+ oct.add_constraint(D + A1 >= 0);
+ oct.add_constraint(G - A1 <= 1);
+ oct.add_constraint(A1 - G <= 511);
+ oct.add_constraint(G + A1 >= -1);
+ oct.add_constraint(G + A1 <= 511);
+ oct.add_constraint(A1 - L <= 506);
+ oct.add_constraint(L + A1 >= 4);
+ oct.add_constraint(A1 - O <= 510);
+ oct.add_constraint(O + A1 >= 0);
+ oct.add_constraint(C + C1 >= 4);
+ oct.add_constraint(D + C1 >= 1);
+ oct.add_constraint(G -C1 <= 0);
+ oct.add_constraint(G + C1 >= 0);
+ oct.add_constraint(L + C1 >= 5);
+ oct.add_constraint(C1 - O <= 0);
+ oct.add_constraint(O + C1 >= 1);
+ oct.add_constraint(A1 - C1 <= 511);
+ oct.add_constraint(A1 + C1 >= -1);
+ oct.add_constraint(D1 - E1 == 0);
+ oct.add_constraint(C + H1 >= 5);
+ oct.add_constraint(D + H1 >= 2);
+ oct.add_constraint(H1 - G >= 1);
+ oct.add_constraint(G + H1 >= 1);
+ oct.add_constraint(L + H1 >= 6);
+ oct.add_constraint(O + H1 >= 2);
+ oct.add_constraint(A1 - H1 <= 510);
+ oct.add_constraint(A1 + H1 >= 0);
+ oct.add_constraint(C1 + H1 >= 1);
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(C1 >= 511);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+ cs.insert(B <= -1);
+ cs.insert(A - B <= 2);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(B - A == 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B - A == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(0 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(0 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(1 >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+
+ // An empty octagon.
+ TOctagonal_Shape oct(1, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B == 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B <= 10);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B <= 10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B >= 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(B - A >= 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B - A >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A == 0);
+ cs.insert(B <= -1);
+ cs.insert(A - B <= 2);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_F8(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons2.cc b/tests/Octagonal_Shape/relatwithcons2.cc
new file mode 100644
index 0000000..286720b
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons2.cc
@@ -0,0 +1,477 @@
+/* Test Octagonal_Shape::relation_with(c).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(0 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(0 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ // The zero-dim universe octagon.
+ TOctagonal_Shape oct(0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(1 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ // An empty octagon.
+ TOctagonal_Shape oct(1, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A > 0);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B == 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B < 10);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B < 10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(A + B > 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + B > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ TOctagonal_Shape oct(cs);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(1 >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 1);
+ oct.add_constraint(B >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(1 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct(3);
+ oct.add_constraint(A == 1);
+ oct.add_constraint(B >= 2);
+ oct.add_constraint(C <= 1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) == 1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(1 == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= -1);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(0 >= -1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // Octagon::relation_with(c):
+ // it is illegal to use a constraint that is not dimension-compatible
+ // with the octagon.
+ Poly_Con_Relation rel = oc.relation_with(-C - B <= 2);
+ (void) rel;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 3);
+ oct.add_constraint(A <= 4);
+ oct.add_constraint(B >= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Constraint c(A + B == 3);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = oct.relation_with(c);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A == -1);
+
+ Poly_Con_Relation rel = oct.relation_with(A == 0);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ // A single point does not subsume another (different) point.
+ Variable A(0);
+
+ Octagonal_Shape<mpz_class> oc(1);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(A <= 1);
+
+ Constraint c(2*A == 1);
+ Poly_Con_Relation rel = oc.relation_with(c);
+
+ print_constraints(oc, "--- oc ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+
+ TOctagonal_Shape oc(1);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(A <= 1);
+
+ Constraint c(Linear_Expression(1) == 0);
+ Poly_Con_Relation rel = oc.relation_with(c);
+
+ print_constraints(oc, "--- oc ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with(1 == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+
+ TOctagonal_Shape oc(1);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(A <= 1);
+
+ Congruence cg((A %= 0) / 0);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with(A == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(A - B <= 1);
+
+ Congruence cg((A + 3*B %= 0) / 1);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with((A + 3*B %= 0)/1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/relatwithcons3.cc b/tests/Octagonal_Shape/relatwithcons3.cc
new file mode 100644
index 0000000..97d6e02
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons3.cc
@@ -0,0 +1,509 @@
+/* Test Octagonal_Shape::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B == 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= -1);
+ cs.insert(B >= 0);
+ cs.insert(A - B <= 3);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B >= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(B - 4*A >= 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B + 4*A >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(B + 4*A == 5);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B + 4*A == 5) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 2);
+ cs.insert(B <= 3);
+ cs.insert(A - B >= -2);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 6);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(B + 4*A >= 6) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 2);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+ test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 2);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B == 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B == 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 0);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 3);
+ cs.insert(B <= 3);
+ cs.insert(B >= 3);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(2*A - B >= 3);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(2*A - B >= 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 1);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(2*A + B >= 9);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(2*A + B >= 9) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A <= 3);
+ cs.insert(A >= 1);
+ cs.insert(B <= 3);
+ cs.insert(B >= 1);
+
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(2*A + B >= 10);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(2*A + B >= 10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A - B == 3);
+ cs.insert(B == 1);
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(A - 2*B > 2);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(A - 2*B > 2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B <= 3);
+ cs.insert(A <= 1);
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(2*A - B > 4);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(2*A - B > 4) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A - B >= 3);
+ cs.insert(A >= 1);
+ TOctagonal_Shape oct(cs);
+
+ Poly_Con_Relation rel = oct.relation_with(2*A - B < 4);
+
+ print_constraints(oct, "*** oct ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(2*A - B < 4) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(2*A >= 1);
+ oc.add_constraint(B >= 1);
+
+ Congruence cg((A + 4*B %= 1) / 2);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 1);
+ oc.add_constraint(A <= 2);
+ oc.add_constraint(B >= 1);
+ oc.add_constraint(B <= 2);
+
+ Congruence cg((A + 4*B %= 1) / 10);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with((A + 4*B %= 1)/10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(2*A <= 1);
+ oc.add_constraint(B <= 1);
+
+ Congruence cg((A + 4*B %= 1) / 2);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 0);
+ oc.add_constraint(B >= 0);
+ oc.add_constraint(B <= 2);
+ oc.add_constraint(A - B <= 1);
+
+ Congruence cg((A + 3*B %= 1) / 10);
+ Poly_Con_Relation rel = oc.relation_with(cg);
+
+ print_constraints(oc, "--- oc ---");
+ print_congruence(cg, "--- cg ---");
+ using namespace IO_Operators;
+ nout << "oc.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithgen1.cc b/tests/Octagonal_Shape/relatwithgen1.cc
new file mode 100644
index 0000000..a3ba655
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithgen1.cc
@@ -0,0 +1,497 @@
+/* Test Octagonal_Shape::relation_with(g): we verify that a generator
+ is not subsumed by an empty octagon.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ TOctagonal_Shape oct(2, EMPTY);
+
+ print_constraints(oct, "*** oct ***");
+
+ Generator g = point(x);
+
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(g);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(v(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oct;
+ print_constraints(oct, "*** oct ***");
+
+ Generator g = point();
+
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(g);
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(point(2*A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(point(2*A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B >= 0);
+ oct.add_constraint(B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel1 = oct.relation_with(point(B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(point(B)) == " << rel1 << endl;
+
+ Poly_Gen_Relation rel2 = oct.relation_with(point(-B));
+
+ nout << "oct.relation_with(point(-B)) == " << rel2 << endl;
+
+ Poly_Gen_Relation known_result1 = Poly_Gen_Relation::subsumes();
+ Poly_Gen_Relation known_result2 = Poly_Gen_Relation::nothing();
+
+ return rel1 == known_result1 && rel2 == known_result2;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B == 1);
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B == 1);
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 0);
+ oct.add_constraint(B >= -1);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A == 0);
+ oct.add_constraint(B >= -1);
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(-A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct (2);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(B == 2);
+
+ print_constraints(oct , "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(closure_point(A));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(A + B <= 3);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(ray(A + B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(ray(A + B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A >= 2);
+ oct.add_constraint(A + B <= 3);
+ oct.add_constraint(A - B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(ray(-2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(ray(-2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oc(2);
+ oc.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of method
+ // Octagon::relation_with(g):
+ // it is illegal to use a generator that is
+ // dimensional incompatible with the OS.
+ Poly_Gen_Relation rel = oc.relation_with(ray(C));
+ (void) rel;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "std::invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A <= 2);
+ oct.add_constraint(A + B <= 3);
+ oct.add_constraint(A - B >= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A + B == 3);
+ oct.add_constraint(A - B == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A - B == 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(A - B <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B - A <= 0);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(B - 3*A + 5));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(B - 3*A + 5)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct(2);
+ oct.add_constraint(B <= 2);
+
+ print_constraints(oct, "*** oct ***");
+
+ Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+ using namespace IO_Operators;
+ nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test20() {
+ // A 1D empty shape that is not in minimal form and the point is the origin.
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A <= 0);
+ oct.add_constraint(A >= 1);
+
+ Generator g = point();
+ Poly_Gen_Relation rel = oct.relation_with(g);
+
+ print_constraints(oct, "*** oct ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test21() {
+ // A single point does not subsume another (different) point.
+ Variable A(0);
+
+ TOctagonal_Shape oct(1);
+ oct.add_constraint(A == 1);
+
+ Generator g = point();
+ Poly_Gen_Relation rel = oct.relation_with(g);
+
+ print_constraints(oct, "*** oct ***");
+ print_generator(g, "*** g ***");
+ using namespace IO_Operators;
+ nout << "oct.relation_with(v()) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+END_MAIN
diff --git a/tests/Octagonal_Shape/removespacedims1.cc b/tests/Octagonal_Shape/removespacedims1.cc
new file mode 100644
index 0000000..2977601
--- /dev/null
+++ b/tests/Octagonal_Shape/removespacedims1.cc
@@ -0,0 +1,375 @@
+/* Remove the higher variables from the space.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x2(1);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x2 <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.remove_higher_space_dimensions(2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x2 <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x2(1);
+ Variable x3(2);
+ Variable x5(4);
+
+ TOctagonal_Shape oc1(6);
+ oc1.add_constraint(x2 - x3 <= 0);
+ oc1.add_constraint(x3 <= 2);
+ oc1.add_constraint(x5 <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x5);
+ oc1.remove_space_dimensions(to_be_removed);
+
+ Octagonal_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(x2 <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oct1.remove_space_dimensions({x3, x5}) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+
+ TOctagonal_Shape oct1(6);
+ oct1.add_constraint(x1 >= 1);
+ oct1.add_constraint(x1 + x3 >= 2);
+ oct1.add_constraint(x2 - x3 <= 4);
+ oct1.add_constraint(x4 - x1 >= 0);
+ oct1.add_constraint(x6 <= 7);
+ oct1.add_constraint(x5 + x4 >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.remove_higher_space_dimensions(3);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 >= 1);
+ known_result.add_constraint(x1 + x3 >= 2);
+ known_result.add_constraint(x2 - x3 <= 4);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(6);
+
+ // A 10-dim space, empty polyhedron.
+ TOctagonal_Shape oc(10, EMPTY);
+
+ print_constraints(oc, "*** oc ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(w);
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ // A 7-dim space, empty polyhedron.
+ Octagonal_Shape<mpq_class> known_result(7, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.remove_space_dimensions({y, z, w}) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ // A 4-dim space, empty polyhedron.
+ TOctagonal_Shape oc(4, EMPTY);
+
+ print_constraints(oc, "*** oc ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(w);
+ to_be_removed.insert(x);
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape oc(5);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::remove_higher_dimensions(n): it is illegal to erase
+ // a variable that is not in the space of the polyhedron.
+ oc.remove_higher_space_dimensions(7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x <= 3);
+ cs.insert(y - z <= 2);
+ TOctagonal_Shape oc(cs);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(z);
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ try {
+ to_be_removed.insert(x);
+ // This is an incorrect use use of method
+ // Octagonal_Shape::remove_space_dimensions(to_be_remove).
+ // Here the set `to_be_removed' still contains variable `z'.
+ // This variable is now beyond the space dimension,
+ // so that a dimension-incompatibility exception is obtained.
+ oc.remove_space_dimensions(to_be_removed);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(x - y <= 0);
+ oc.add_constraint(z <= 2);
+ oc.add_constraint(w >= 3);
+
+ print_constraints(oc, "*** oc ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ Octagonal_Shape<mpq_class> known_result(oc);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TOctagonal_Shape oc(0);
+
+ print_constraints(oc, "*** oc ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ Octagonal_Shape<mpq_class> known_result(oc);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ Variable x6(5);
+
+ TOctagonal_Shape oct1(6);
+ oct1.add_constraint(x1 >= 1);
+ oct1.add_constraint(x1 + x3 >= 2);
+ oct1.add_constraint(x2 - x3 <= 4);
+ oct1.add_constraint(x4 - x1 >= 0);
+ oct1.add_constraint(x6 <= 7);
+ oct1.add_constraint(x5 + x4 >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.remove_higher_space_dimensions(6);
+
+ Octagonal_Shape<mpq_class> known_result(oct1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(6) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x1 - x2 >= 13);
+ oct1.add_constraint(x2 <= 3);
+ oct1.add_constraint(x2 + x3 == 5);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ oct1.remove_higher_space_dimensions(0);
+
+ Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(x - y <= 0);
+ oc.add_constraint(z <= 2);
+ oc.add_constraint(w >= 3);
+
+ print_constraints(oc, "*** oc ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x);
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(w);
+
+ oc.remove_space_dimensions(to_be_removed);
+
+ Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+ print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/run_tests b/tests/Octagonal_Shape/run_tests
new file mode 100755
index 0000000..7f5e33b
--- /dev/null
+++ b/tests/Octagonal_Shape/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the Octagonal_Shape tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+ MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+ echo "**************************** " $instance " ****************************"
+ eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+ [ -f dirty_marker ] && $MAKE clean
+ touch dirty_marker
+ $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DOCTAGONAL_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+ $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Octagonal_Shape/simplifyusingcontext1.cc b/tests/Octagonal_Shape/simplifyusingcontext1.cc
new file mode 100644
index 0000000..2b8163a
--- /dev/null
+++ b/tests/Octagonal_Shape/simplifyusingcontext1.cc
@@ -0,0 +1,340 @@
+/* Test Octagonal_Shape::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 2);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(oct1);
+ oct2.affine_image(x, x + 6);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(x <= 2);
+
+ bool ok = !oct1.simplify_using_context_assign(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 2);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(oct1);
+ oct2.affine_image(x, x + 1);
+ oct2.affine_image(y, y + 6);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ // NOTE: this is the result computed when using the current heuristics.
+ // It turns out that the current heuristics is not smart enough to see
+ // that constraint y <= 2 is not really needed.
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = !oct1.simplify_using_context_assign(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ TOctagonal_Shape oct1(1);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 6);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(1);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(x <= 5);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape computed_result = oct1;
+
+ computed_result.simplify_using_context_assign(oct2);
+
+ TOctagonal_Shape known_result(1);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result,
+ "*** oct1.simplify_using_context_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TOctagonal_Shape oct1 = TOctagonal_Shape(3, UNIVERSE);
+ oct1.add_constraint(i >= 1);
+ oct1.add_constraint(i <= 10);
+ oct1.add_constraint(j >= 1);
+ oct1.add_constraint(j <= 10);
+ oct1.add_constraint(k == 0);
+
+ TOctagonal_Shape oct2 = TOctagonal_Shape(3, UNIVERSE);
+ oct2.add_constraint(i >= 0);
+ oct2.add_constraint(i <= 2);
+ oct2.add_constraint(j >= 2);
+ oct2.add_constraint(j <= 9);
+ oct2.add_constraint(k == 0);
+
+ print_constraints(oct1, "=== oct1 ===");
+ print_constraints(oct2, "=== oct2 ===");
+
+ TOctagonal_Shape known_result = TOctagonal_Shape(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+
+ oct1.simplify_using_context_assign(oct2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "=== oct1.simplify_using_context_assign(oct2) ===");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TOctagonal_Shape oct1(3, UNIVERSE);
+ oct1.add_constraint(i == 1);
+ oct1.add_constraint(j + 1 == 0);
+ oct1.add_constraint(k == 3);
+
+ TOctagonal_Shape oct2(3, UNIVERSE);
+ oct2.add_constraint(i == 1);
+ oct2.add_constraint(j + k == 2);
+ oct2.add_constraint(k >= 0);
+ oct2.add_constraint(k <= 3);
+
+ TOctagonal_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(j + 1 <= 0);
+ // PolyLib 5.22.3 returns { j + 1 == 0, k == 3 };
+ // Using PPL::Polyhedron we get { k == 3 }.
+
+ oct1.simplify_using_context_assign(oct2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1.minimized_constraints(),
+ "=== oct1.simplify_using_context_assign(oct2) ===");
+ print_constraints(known_result.minimized_constraints(),
+ "=== known_result ===");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3, UNIVERSE);
+ oct1.add_constraint(A == 0);
+ oct1.add_constraint(B == C);
+ oct1.add_constraint(B >= 2);
+ print_constraints(oct1, "\n=== oct1 ===");
+
+ TOctagonal_Shape oct2(3, UNIVERSE);
+ oct2.add_constraint(A == 0);
+ oct2.add_constraint(C >= 2);
+ print_constraints(oct2, "\n=== oct2 ===");
+
+ oct1.simplify_using_context_assign(oct2);
+
+ TOctagonal_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(B == C);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1, "\n=== oct1.simplify_using_context_assign(oct2) ===");
+
+ return ok;
+}
+
+bool
+test07() {
+ TOctagonal_Shape oct1(0, EMPTY);
+ TOctagonal_Shape oct2;
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result = oct1;
+
+ oct1.simplify_using_context_assign(oct2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ TOctagonal_Shape oct1(1);
+ TOctagonal_Shape oct2(1);
+
+ oct2.add_constraint(A == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result = oct1;
+
+ oct1.simplify_using_context_assign(oct2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1.minimized_constraints(),
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ TOctagonal_Shape oct1(3, UNIVERSE);
+ oct1.add_constraint(i >= 1);
+ oct1.add_constraint(i <= 10);
+ oct1.add_constraint(j >= 1);
+ oct1.add_constraint(j <= 10);
+ oct1.add_constraint(k == 0);
+
+ TOctagonal_Shape oct2(3, UNIVERSE);
+ oct2.add_constraint(i <= 25);
+ oct2.add_constraint(j <= 25);
+ oct2.add_constraint(i + j >= 25);
+ oct2.add_constraint(k == 0);
+
+ TOctagonal_Shape known_result(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+ known_result.add_constraint(i <= 10);
+ known_result.add_constraint(j <= 10);
+
+ oct1.simplify_using_context_assign(oct2);
+
+ bool ok = (oct1 == known_result);
+
+ print_constraints(oct1.minimized_constraints(),
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(A == 0);
+ oct1.add_constraint(B == 0);
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(A >= 0);
+ oct2.add_constraint(B >= 0);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ bool ok = oct1.simplify_using_context_assign(oct2);
+
+ ok = ok && (oct1 == known_result);
+
+ print_constraints(oct1.minimized_constraints(),
+ "*** oct1.simplify_using_context_assign(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/timeelapse1.cc b/tests/Octagonal_Shape/timeelapse1.cc
new file mode 100644
index 0000000..2c191f7
--- /dev/null
+++ b/tests/Octagonal_Shape/timeelapse1.cc
@@ -0,0 +1,372 @@
+/* Test time_elapse_assign() for particular polyhedra.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TOctagonal_Shape oc1(2, EMPTY);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+
+ TOctagonal_Shape oc3(2);
+
+ print_constraints(oc3, "*** oc3 ***");
+
+ TOctagonal_Shape oc4(2, EMPTY);
+
+ print_constraints(oc4, "*** oc4 ***");
+
+ oc3.time_elapse_assign(oc4);
+
+ print_constraints(oc3, "*** oc3.time_elapse_assign(oc4) ***");
+
+ Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result) &&
+ (Octagonal_Shape<mpq_class>(oc3) == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(y >= 0);
+ oc1.add_constraint(x + y - 2 <= 0);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x >= 2);
+ oc2.add_constraint(x <= 4);
+ oc2.add_constraint(y == 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 0);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(y >= 1);
+ oc1.add_constraint(y <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(y == 5);
+
+ oc1.time_elapse_assign(oc2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x == 3);
+ oc1.add_constraint(y >= 2);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(2);
+ oc2.add_constraint(x >= 3);
+ oc2.add_constraint(y >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(oc2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(y <= 5);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x <= 2);
+ oc2.add_constraint(y <= 3);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(y <= 5);
+ oc1.add_constraint(y >= 6);
+ oc1.add_constraint(z >= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x <= 2);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(y <= 3);
+ oc2.add_constraint(y >= 2);
+ oc2.add_constraint(z >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(y <= 5);
+ oc1.add_constraint(y >= 1);
+ oc1.add_constraint(z >= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x <= 2);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(y <= 3);
+ oc2.add_constraint(y >= 2);
+ oc2.add_constraint(z >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x >= 1);
+ known_result.add_constraint(y >= 1);
+ known_result.add_constraint(z >= 1);
+ known_result.add_constraint(x - y <= 2);
+ known_result.add_constraint(x - z <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc1(3);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(y <= 7);
+ oc1.add_constraint(y >= 6);
+ oc1.add_constraint(z >= 1);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ // The octagon oc2 is empty.
+ TOctagonal_Shape oc2(3);
+ oc2.add_constraint(x <= 2);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(y <= 3);
+ oc2.add_constraint(y >= 4);
+ oc2.add_constraint(z >= 2);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ TOctagonal_Shape oc1(6);
+ oc1.add_constraint(A - B <= 1);
+ oc1.add_constraint(C + D <= 3);
+ oc1.add_constraint(A + E <= 5);
+ oc1.add_constraint(E - F <= 7);
+ oc1.add_constraint(F + E <= 3);
+
+ print_constraints(oc1, "*** oc1 ***");
+
+ TOctagonal_Shape oc2(6);
+ oc2.add_constraint(A + B <= 0);
+ oc2.add_constraint(C + B <= 9);
+ oc2.add_constraint(A + E <= 5);
+ oc2.add_constraint(F + E <= 2);
+ oc2.add_constraint(E - F <= 8);
+
+ print_constraints(oc2, "*** oc2 ***");
+
+ oc1.time_elapse_assign(oc2);
+
+ Octagonal_Shape<mpq_class> known_result(6);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+ print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oct1(1);
+ oct1.add_constraint(x == 1);
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(y + z <= 6);
+
+ try {
+ // This is an invalid use of the method
+ // Octagonal_Shape::time_elapse_assign(oct1): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ oct2.time_elapse_assign(oct1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/unconstrain1.cc b/tests/Octagonal_Shape/unconstrain1.cc
new file mode 100644
index 0000000..57e0814
--- /dev/null
+++ b/tests/Octagonal_Shape/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test Octagonal_Shape::unconstrain().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+ print_constraints(os, "*** os ***");
+
+ os.unconstrain(A);
+
+ TOctagonal_Shape known_result(2, EMPTY);
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+ print_constraints(os, "*** os ***");
+
+ Variables_Set vs(A, B);
+ os.unconstrain(vs);
+
+ TOctagonal_Shape known_result(2, EMPTY);
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(A == B);
+ os.add_constraint(B >= 0);
+ print_constraints(os, "*** os ***");
+
+ os.unconstrain(B);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(A == B);
+ os.add_constraint(B >= 0);
+ print_constraints(os, "*** os ***");
+
+ Variables_Set vs(B);
+ os.unconstrain(vs);
+
+ TOctagonal_Shape known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TOctagonal_Shape os(0, EMPTY);
+ print_constraints(os, "*** os ***");
+
+ Variables_Set vs;
+ os.unconstrain(vs);
+
+ TOctagonal_Shape known_result(0, EMPTY);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TOctagonal_Shape os(0);
+ print_constraints(os, "*** os ***");
+
+ Variables_Set vs;
+ os.unconstrain(vs);
+
+ TOctagonal_Shape known_result(0);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ try {
+ TOctagonal_Shape os(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ os.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ TOctagonal_Shape os(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ Variables_Set vs(Variable(0), Variable(3));
+ os.unconstrain(vs);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TOctagonal_Shape os(5);
+ os.add_constraint(A - B == 9);
+ os.add_constraint(A >= D + 2);
+ os.add_constraint(C <= D);
+ os.add_constraint(E <= B);
+ os.add_constraint(E >= 0);
+ print_constraints(os, "*** os ***");
+
+ Variables_Set vs(A, B);
+ vs.insert(D);
+ os.unconstrain(vs);
+
+ TOctagonal_Shape known_result(5);
+ known_result.add_constraint(E >= 0);
+
+ bool ok = (os == known_result);
+
+ print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ try {
+ TOctagonal_Shape os(4);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ os.unconstrain(Variable(4));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/universe1.cc b/tests/Octagonal_Shape/universe1.cc
new file mode 100644
index 0000000..9f3ce1e
--- /dev/null
+++ b/tests/Octagonal_Shape/universe1.cc
@@ -0,0 +1,112 @@
+/* Test Octagonal_Shape::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape oc(4);
+ oc.add_constraint(-x <= 4);
+ oc.add_constraint(y - x <= 0);
+ oc.add_constraint(x - y <= -5);
+
+ bool universe = oc.is_universe();
+
+ nout << "*** oc.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+bool
+test02() {
+ TOctagonal_Shape oc(4);
+
+ bool universe = oc.is_universe();
+
+ nout << "*** oc.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(x >= 1);
+ oc.add_constraint(y >= 1);
+ oc.add_constraint(x <= 4);
+ oc.add_constraint(y <= 4);
+
+ bool universe = oc.is_universe();
+
+ nout << "*** oc.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+bool
+test04() {
+ TOctagonal_Shape oc(0);
+
+ bool universe = oc.is_universe();
+
+ nout << "*** oc.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return universe;
+}
+
+bool
+test05() {
+ // Variable x(0);
+
+ TOctagonal_Shape oc(1, EMPTY);
+
+ bool universe = oc.is_universe();
+
+ nout << "*** oc.is_universe() ***" << endl;
+ nout << (universe ? "true" : "false") << endl;
+
+ return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Octagonal_Shape/upperbound1.cc b/tests/Octagonal_Shape/upperbound1.cc
new file mode 100644
index 0000000..d3ee77a
--- /dev/null
+++ b/tests/Octagonal_Shape/upperbound1.cc
@@ -0,0 +1,391 @@
+/* Test Octagonal_Shape::poly_hull_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x1 >= 1);
+ oct1.add_constraint(x1 - x2 <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(x2 <= 1);
+ oct2.add_constraint(x1 - x2 <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x1 - x2 <= 3);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TOctagonal_Shape oct1(2);
+ oct1.add_constraint(x1 >= 0);
+ oct1.add_constraint(x1 + x2 >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2);
+ oct2.add_constraint(x2 >= 1);
+ oct2.add_constraint(x1 + x2 >= 3);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x1 + x2 >= 1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TOctagonal_Shape oct1(5);
+ oct1.add_constraint(x1 <= 5);
+ oct1.add_constraint(x2 <= -1);
+ oct1.add_constraint(x1 - x2 <= 10);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(5);
+ oct2.add_constraint(x1 <= 2);
+ oct2.add_constraint(x4 <= 7);
+ oct2.add_constraint(x1 - x2 <= 20);
+ oct2.add_constraint(x4 - x3 <= 3);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(x1 <= 5);
+ known_result.add_constraint(x1 - x2 <= 20);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x1 <= 1);
+ oct1.add_constraint(- x1 - x2 >= 1);
+ oct1.add_constraint(x3 == 2 );
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(x2 >= 1);
+ oct2.add_constraint(x1 + x2 <= 2);
+ oct2.add_constraint(- x1 - x3 <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 <= 1);
+ known_result.add_constraint(-x3 <= 3);
+ known_result.add_constraint(x1 + x2 <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(A <= 1);
+ oct1.add_constraint(B >= 7);
+ oct1.add_constraint(C <= 3);
+ oct1.add_constraint(A >= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(A >= 1);
+ oct2.add_constraint(B <= 2);
+ oct2.add_constraint(C <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(oct2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs1;
+ cs1.insert(A == 1);
+ cs1.insert(C - A <= 2);
+ cs1.insert(C - B <= 7);
+ cs1.insert(B - A <= 3);
+ TOctagonal_Shape oct1(cs1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(A == 1);
+ cs2.insert(C - A <= 3);
+ cs2.insert(C - A >= 7);
+ cs2.insert(B - A <= 2);
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraints(cs2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(cs1);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TOctagonal_Shape oct1(0, EMPTY);
+ TOctagonal_Shape oct2;
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result;
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TOctagonal_Shape oct1(8);
+ TOctagonal_Shape oct2(8);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(8);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x1 <= 2);
+ oct1.add_constraint(- x1 - x2 >= 1);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(x2 >= 1);
+ oct2.add_constraint(x1 + x2 <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 <= 2);
+ known_result.add_constraint(x1 + x2 <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ TOctagonal_Shape oc1(12);
+ TOctagonal_Shape oc2(5);
+
+ try {
+ // This is an incorrect use of method
+ // Octagonal_Shape::upper_bound_assign(oc2): it is impossible to apply
+ // this method to two polyhedra of different dimensions.
+ oc1.upper_bound_assign(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+// CHEKME: is this a duplication of test10?
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc1(2);
+ oc1.add_constraint(x >= y);
+
+ TOctagonal_Shape oc2(3);
+
+ try {
+ // This is an invalid use of method
+ // Octagonal_Shape::upper_bound_assign(oc2): it is illegal
+ // to apply this method to two polyhedra of different dimensions.
+ oc1.upper_bound_assign(oc2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TOctagonal_Shape oct1(3);
+ oct1.add_constraint(x1 <= 1);
+ oct1.add_constraint(- x1 - x2 >= 1);
+ oct1.add_constraint(x3 == 2 );
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(3);
+ oct2.add_constraint(x2 >= 1);
+ oct2.add_constraint(x1 + x2 <= 2);
+ oct2.add_constraint(- x1 - x3 <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ oct1.upper_bound_assign(oct2);
+
+ Octagonal_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x1 <= 1);
+ known_result.add_constraint(-x3 <= 3);
+ known_result.add_constraint(x1 + x2 <= 2);
+
+ bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/upperboundifexact1.cc b/tests/Octagonal_Shape/upperboundifexact1.cc
new file mode 100644
index 0000000..64d9cd7
--- /dev/null
+++ b/tests/Octagonal_Shape/upperboundifexact1.cc
@@ -0,0 +1,424 @@
+/* Test Octagonal_Shape::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TOctagonal_Shape octs_empty(0, EMPTY);
+ TOctagonal_Shape octs_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ TOctagonal_Shape octs;
+
+ // empty, empty
+ octs = octs_empty;
+ ok &= octs.upper_bound_assign_if_exact(octs_empty);
+ ok &= (octs == octs_empty);
+ print_constraints(octs, "*** empty union empty ***");
+
+ // empty, universe
+ octs = octs_empty;
+ ok &= octs.upper_bound_assign_if_exact(octs_universe);
+ ok &= (octs == octs_universe);
+ print_constraints(octs, "*** empty union universe ***");
+
+ // universe, empty
+ octs = octs_universe;
+ ok &= octs.upper_bound_assign_if_exact(octs_empty);
+ ok &= (octs == octs_universe);
+ print_constraints(octs, "*** universe union empty ***");
+
+ // universe, universe
+ octs = octs_universe;
+ ok &= octs.upper_bound_assign_if_exact(octs_universe);
+ ok &= (octs == octs_universe);
+ print_constraints(octs, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= -2);
+ oct1.add_constraint(x <= -1);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 1);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(oct1);
+
+ bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= -2);
+ oct1.add_constraint(x <= 0);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x == 0);
+ oct1.add_constraint(y == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(x <= 2);
+ oct2.add_constraint(y >= -2);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(oct2);
+
+ bool ok = oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(y == 0);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+ oct2.add_constraint(y >= 2);
+ oct2.add_constraint(y <= 4);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(oct1);
+
+ bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x == y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x == 0);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(oct1);
+
+ bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 0);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(oct1);
+
+ bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= y);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(2, UNIVERSE);
+ oct2.add_constraint(x <= y);
+
+ print_constraints(oct2, "*** oct2 ***");
+
+ TOctagonal_Shape known_result(2, UNIVERSE);
+
+ bool ok = oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == known_result);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TOctagonal_Shape octs(3, UNIVERSE);
+ octs.add_constraint(x >= 0);
+ octs.add_constraint(x <= 2);
+ octs.add_constraint(y >= 0);
+ octs.add_constraint(y <= 4);
+ octs.add_constraint(z >= 0);
+ octs.add_constraint(z <= 4);
+ octs.add_constraint(x - y <= 2);
+ octs.add_constraint(z - y <= 2);
+
+ TOctagonal_Shape oct1(octs);
+ oct1.add_constraint(z <= 3);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(octs);
+ oct2.add_constraint(x - y <= 1);
+
+ TOctagonal_Shape known_result(octs);
+
+ C_Polyhedron ph1(oct1);
+ C_Polyhedron ph2(oct2);
+
+ bool exact = ph1.upper_bound_assign_if_exact(ph2);
+ nout << "In the c polyhedra domain, upper_bound_assign_if_exact() returns: "
+ << exact << std::endl;
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ bool ok = oct1.upper_bound_assign_if_exact(oct2);
+
+ ok &= (oct1 == octs);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape octs(4, UNIVERSE);
+ octs.add_constraint(x - y <= 4);
+ octs.add_constraint(z - w <= 4);
+ octs.add_constraint(x - w <= 5);
+ octs.add_constraint(z <= 0);
+ octs.add_constraint(z - y <= 1);
+ octs.add_constraint(y + w >= -1);
+
+ TOctagonal_Shape oct1(octs);
+ oct1.add_constraint(x - y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+
+ TOctagonal_Shape oct2(octs);
+ oct2.add_constraint(z - w <= 2);
+
+ TOctagonal_Shape known_result(octs);
+
+ bool ok = oct1.upper_bound_assign_if_exact(oct2);
+ ok &= (oct1 == octs);
+
+ print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ // const dimension_type dim = 200;
+ const dimension_type dim = 50;
+ Constraint_System cs;
+ for (dimension_type i = 1; i < dim; ++i) {
+ Variable x(i);
+ cs.insert(x >= 0);
+ cs.insert(x <= 4);
+ }
+
+ Variable x(0);
+
+ TOctagonal_Shape hypercube1(cs);
+ hypercube1.add_constraint(x >= 0);
+ hypercube1.add_constraint(x <= 4);
+
+ TOctagonal_Shape hypercube2(cs);
+ hypercube2.add_constraint(x >= 2);
+ hypercube2.add_constraint(x <= 6);
+
+ TOctagonal_Shape known_result(cs);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+
+ bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+ ok &= (hypercube1 == known_result);
+
+ print_constraints(hypercube1, "*** hyp1 ***");
+ print_constraints(hypercube2, "*** hyp2 ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+ oct1.add_constraint(x >= 0);
+ oct1.add_constraint(x <= 3);
+ oct1.add_constraint(y >= 0);
+ oct1.add_constraint(y <= 2);
+ oct1.add_constraint(x - y <= 2);
+
+ Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+ oct2.add_constraint(x >= 3);
+ oct2.add_constraint(x <= 6);
+ oct2.add_constraint(y >= 0);
+ oct2.add_constraint(y <= 2);
+
+ print_constraints(oct1, "*** oct1 ***");
+ print_constraints(oct2, "*** oct2 ***");
+
+ Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 6);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+ && (oct1 == known_result);
+
+ print_constraints(oct1,
+ "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/wrap1.cc b/tests/Octagonal_Shape/wrap1.cc
new file mode 100644
index 0000000..d31ebaa
--- /dev/null
+++ b/tests/Octagonal_Shape/wrap1.cc
@@ -0,0 +1,406 @@
+/* Test Octagonal_Shape::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x >= 224);
+ oct.refine_with_constraint(x-y <= 160);
+ oct.refine_with_constraint(x+y <= 416);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ TOctagonal_Shape known_result(2);
+ typedef TOctagonal_Shape::coefficient_type T;
+ if (!std::numeric_limits<T>::is_bounded
+ || (std::numeric_limits<T>::max() >= 510
+ && (std::numeric_limits<T>::is_iec559
+ || std::numeric_limits<T>::min() <= -510))) {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(y >= 64);
+ known_result.refine_with_constraint(y <= 192);
+ known_result.refine_with_constraint(+x-y <= 160);
+ known_result.refine_with_constraint(-x+y <= 160);
+ known_result.refine_with_constraint(+x+y >= 96);
+ known_result.refine_with_constraint(+x+y <= 416);
+ }
+ else {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 0);
+ }
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x >= 224);
+ oct.refine_with_constraint(x-y <= 160);
+ oct.refine_with_constraint(x+y <= 416);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ TOctagonal_Shape known_result(2);
+ typedef TOctagonal_Shape::coefficient_type_base T;
+ if (!std::numeric_limits<T>::is_bounded
+ || (std::numeric_limits<T>::max() >= 510
+ && (std::numeric_limits<T>::is_iec559
+ || std::numeric_limits<T>::min() <= -510))) {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 96);
+ known_result.refine_with_constraint(-x+y >= 96);
+ known_result.refine_with_constraint(+x+y <= 160);
+ }
+ else {
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 0);
+ known_result.refine_with_constraint(+x-y <= 0);
+ }
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+#if 0
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(y >= 120);
+ known_result.refine_with_constraint(y <= 184);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &cs);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y >= 120);
+ known_result.refine_with_constraint(y <= 184);
+ known_result.refine_with_constraint(x <= y);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(x + 1024 == 8*y);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE, &cs);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(7*x <= 1024);
+ known_result.refine_with_constraint(x + 1024 == 8*y);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(y >= 0);
+ known_result.refine_with_constraint(y <= 255);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y <= 255);
+ known_result.refine_with_constraint(x <= y);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(x + 24*y >= 3072);
+ known_result.refine_with_constraint(193*x + 504*y <= 129792);
+ known_result.refine_with_constraint(x - 8*y >= -1280);
+ known_result.refine_with_constraint(x - 8*y <= -768);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+ oct.refine_with_constraint(-64 <= x);
+ oct.refine_with_constraint(x <= 448);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= y);
+ known_result.refine_with_constraint(x - 8*y >= -1280);
+ known_result.refine_with_constraint(x - 8*y <= -1024);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(x <= 255);
+ known_result.refine_with_constraint(y >= 0);
+ known_result.refine_with_constraint(y <= 255);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ TOctagonal_Shape oct(2);
+ oct.refine_with_constraint(x + 1024 == 8*y);
+
+ print_constraints(oct, "*** oct ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+ TOctagonal_Shape known_result(2);
+ known_result.refine_with_constraint(x >= 0);
+ known_result.refine_with_constraint(y <= 255);
+ known_result.refine_with_constraint(x <= y);
+
+ bool ok = (oct == known_result);
+
+ print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+ return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Octagonal_Shape/writeoctagon1.cc b/tests/Octagonal_Shape/writeoctagon1.cc
new file mode 100644
index 0000000..276e012
--- /dev/null
+++ b/tests/Octagonal_Shape/writeoctagon1.cc
@@ -0,0 +1,211 @@
+/* Test operator<<(ostream&, const Octagonal_Shape&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(x + y == 3);
+ oc.add_constraint(x - y == 4);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A - B = 4, A + B = 3";
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(x - y == 5);
+ oc.add_constraint(x + y == -1);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A - B = 5, A + B = -1";
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(-x - y <= 3);
+ oc.add_constraint(-x + y <= 4);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "B - A <= 4, A + B >= -3";
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+ oc.add_constraint(x - y <= 3);
+ oc.add_constraint(x + y <= 4);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A - B <= 3, A + B <= 4";
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+
+ oc.add_constraint(x - y >= 4);
+ oc.add_constraint(x - y <= 4);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A - B = 4";
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape oc(3);
+
+ oc.add_constraint(x + y <= 3);
+ oc.add_constraint(x + y >= 3);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A + B = 3";
+}
+
+bool
+test07() {
+ TOctagonal_Shape oc(32, UNIVERSE);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "true";
+}
+
+bool
+test08() {
+ TOctagonal_Shape oc(32, EMPTY);
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "false";
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpz_class> oc(2);
+
+ oc.add_constraint(x + y == 2);
+ oc.add_constraint(x - y == 1);
+
+ (void) oc.is_empty();
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "2*A = 3, 2*B = 1, A - B = 1, A + B = 2";
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ Octagonal_Shape<mpq_class> oc(2);
+
+ oc.add_constraint(x + y == 2);
+ oc.add_constraint(x - y == 1);
+
+ (void) oc.is_empty();
+
+ std::stringstream s;
+ s << oc;
+
+ nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "A = 3/2, B = 1/2, A - B = 1, A + B = 2";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/PIP_Problem/Makefile.am b/tests/PIP_Problem/Makefile.am
new file mode 100644
index 0000000..d64b2ea
--- /dev/null
+++ b/tests/PIP_Problem/Makefile.am
@@ -0,0 +1,94 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+ascii_dump_load1 \
+exceptions1 \
+pipproblem1 pipproblem2 pipproblem3 \
+weightwatch1
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+
+pipproblem1_SOURCES = pipproblem1.cc
+pipproblem2_SOURCES = pipproblem2.cc
+pipproblem3_SOURCES = pipproblem3.cc
+
+weightwatch1_SOURCES = weightwatch1.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+#EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/PIP_Problem/Makefile.in b/tests/PIP_Problem/Makefile.in
new file mode 100644
index 0000000..494bc0d
--- /dev/null
+++ b/tests/PIP_Problem/Makefile.in
@@ -0,0 +1,1214 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+ pipproblem1$(EXEEXT) pipproblem2$(EXEEXT) pipproblem3$(EXEEXT) \
+ weightwatch1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/PIP_Problem
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+ pipproblem1$(EXEEXT) pipproblem2$(EXEEXT) pipproblem3$(EXEEXT) \
+ weightwatch1$(EXEEXT)
+am__EXEEXT_2 =
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_pipproblem1_OBJECTS = pipproblem1.$(OBJEXT)
+pipproblem1_OBJECTS = $(am_pipproblem1_OBJECTS)
+pipproblem1_LDADD = $(LDADD)
+pipproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_pipproblem2_OBJECTS = pipproblem2.$(OBJEXT)
+pipproblem2_OBJECTS = $(am_pipproblem2_OBJECTS)
+pipproblem2_LDADD = $(LDADD)
+pipproblem2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_pipproblem3_OBJECTS = pipproblem3.$(OBJEXT)
+pipproblem3_OBJECTS = $(am_pipproblem3_OBJECTS)
+pipproblem3_LDADD = $(LDADD)
+pipproblem3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+ $(pipproblem1_SOURCES) $(pipproblem2_SOURCES) \
+ $(pipproblem3_SOURCES) $(weightwatch1_SOURCES)
+DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+ $(pipproblem1_SOURCES) $(pipproblem2_SOURCES) \
+ $(pipproblem3_SOURCES) $(weightwatch1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS =
+
+#
+# Sources for the tests
+#
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+exceptions1_SOURCES = exceptions1.cc
+pipproblem1_SOURCES = pipproblem1.cc
+pipproblem2_SOURCES = pipproblem2.cc
+pipproblem3_SOURCES = pipproblem3.cc
+weightwatch1_SOURCES = weightwatch1.cc
+
+#EXTRA_DIST =
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/PIP_Problem/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/PIP_Problem/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES)
+ @rm -f exceptions1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+pipproblem1$(EXEEXT): $(pipproblem1_OBJECTS) $(pipproblem1_DEPENDENCIES) $(EXTRA_pipproblem1_DEPENDENCIES)
+ @rm -f pipproblem1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pipproblem1_OBJECTS) $(pipproblem1_LDADD) $(LIBS)
+
+pipproblem2$(EXEEXT): $(pipproblem2_OBJECTS) $(pipproblem2_DEPENDENCIES) $(EXTRA_pipproblem2_DEPENDENCIES)
+ @rm -f pipproblem2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pipproblem2_OBJECTS) $(pipproblem2_LDADD) $(LIBS)
+
+pipproblem3$(EXEEXT): $(pipproblem3_OBJECTS) $(pipproblem3_DEPENDENCIES) $(EXTRA_pipproblem3_DEPENDENCIES)
+ @rm -f pipproblem3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(pipproblem3_OBJECTS) $(pipproblem3_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES)
+ @rm -f weightwatch1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+ @p='ascii_dump_load1$(EXEEXT)'; \
+ b='ascii_dump_load1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+ @p='exceptions1$(EXEEXT)'; \
+ b='exceptions1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem1.log: pipproblem1$(EXEEXT)
+ @p='pipproblem1$(EXEEXT)'; \
+ b='pipproblem1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem2.log: pipproblem2$(EXEEXT)
+ @p='pipproblem2$(EXEEXT)'; \
+ b='pipproblem2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem3.log: pipproblem3$(EXEEXT)
+ @p='pipproblem3$(EXEEXT)'; \
+ b='pipproblem3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+ @p='weightwatch1$(EXEEXT)'; \
+ b='weightwatch1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/PIP_Problem/ascii_dump_load1.cc b/tests/PIP_Problem/ascii_dump_load1.cc
new file mode 100644
index 0000000..49cd163
--- /dev/null
+++ b/tests/PIP_Problem/ascii_dump_load1.cc
@@ -0,0 +1,295 @@
+/* Test PIP_Problem::ascii_dump() and PIP_Problem::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+
+ PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+ pip1.clear();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ pip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ PIP_Problem pip2;
+ pip2.ascii_load(f);
+ close(f);
+
+ bool ok = pip1.space_dimension() == 0
+ && pip2.space_dimension() == 0
+ && pip1.constraints_begin() == pip1.constraints_end()
+ && pip2.constraints_begin() == pip2.constraints_end();
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ PIP_Problem pip1(3);
+ pip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ pip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ PIP_Problem pip2;
+ pip2.ascii_load(f);
+ close(f);
+
+ bool ok = pip1.space_dimension() == 3
+ && pip2.space_dimension() == 3
+ && pip1.constraints_begin() == pip1.constraints_end()
+ && pip2.constraints_begin() == pip2.constraints_end();
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 0);
+
+ PIP_Problem pip1(1, cs.begin(), cs.end(), Variables_Set());
+ pip1.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+ pip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ pip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ PIP_Problem pip2;
+ pip2.ascii_load(f);
+ close(f);
+
+ bool ok = pip1.space_dimension() == pip2.space_dimension()
+ && 2 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+ && 2 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 5);
+
+ PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ pip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ PIP_Problem pip2;
+ pip2.ascii_load(f);
+ close(f);
+
+ bool ok = pip1.space_dimension() == pip2.space_dimension()
+ && 1 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+ && 1 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ Variable A(0);
+ Variable P(1);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 0);
+
+ PIP_Problem pip1(2, cs.begin(), cs.end(), Variables_Set(P));
+ pip1.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+ pip1.set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+ pip1.set_big_parameter_dimension(1);
+ pip1.solve();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ pip1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ PIP_Problem pip2;
+ pip2.ascii_load(f);
+ close(f);
+
+ bool ok = pip1.space_dimension() == pip2.space_dimension()
+ && 2 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+ && 2 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+ return ok;
+}
+
+bool
+test06() {
+ PIP_Problem pip1;
+ using namespace IO_Operators;
+ nout << pip1 << endl;
+ return true;
+}
+
+bool
+test07() {
+ Variable X1(0);
+ Variable X2(1);
+ Variable I0(2);
+ Variable J0(3);
+ Variable N(4);
+ Variables_Set params(I0, N);
+
+ Constraint_System cs;
+ cs.insert(-X1 + N - 1 >= 0);
+ cs.insert(X1 - X2 >= 0);
+ cs.insert(X1 + I0 == N);
+ cs.insert(X2 + J0 - N - 1 >= 0);
+ cs.insert(I0 >= 1);
+ cs.insert(N >= 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ (void) pip.solve();
+
+ std::stringstream ss;
+ pip.ascii_dump(ss);
+
+ PIP_Problem pip2;
+ bool ok = pip2.ascii_load(ss);
+
+ std::stringstream ss2;
+ pip2.ascii_dump(ss2);
+
+ ok &= (ss.str() == ss2.str());
+
+ // This further check is mainly made for coverage purposes.
+ memory_size_type total = pip2.total_memory_in_bytes();
+ memory_size_type external = pip2.external_memory_in_bytes();
+ ok &= (external < total);
+
+ return ok;
+}
+
+bool
+test08() {
+ typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+
+ Variable A(0);
+
+ Art_Param ap1(3*A + 8, -5);
+ std::stringstream ss1;
+ ap1.ascii_dump(ss1);
+
+ Art_Param ap2;
+ bool ok = ap2.ascii_load(ss1);
+
+ std::stringstream ss2;
+ ap2.ascii_dump(ss2);
+
+ ok &= (ap1 == ap2) && (ss1.str() == ss2.str());
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ // Compute the solution tree.
+ (void) pip.solve();
+ // Printing ensures parametric solution values are generated.
+ pip.print_solution(nout);
+
+ std::stringstream ss;
+ pip.ascii_dump(ss);
+
+ PIP_Problem pip2;
+ bool ok = pip2.ascii_load(ss);
+
+ std::stringstream ss2;
+ pip2.ascii_dump(ss2);
+
+ ok &= (ss.str() == ss2.str());
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/PIP_Problem/exceptions1.cc b/tests/PIP_Problem/exceptions1.cc
new file mode 100644
index 0000000..f5bcd0b
--- /dev/null
+++ b/tests/PIP_Problem/exceptions1.cc
@@ -0,0 +1,383 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Constraint_System cs;
+ Variable x(0);
+ Variables_Set params(x);
+
+ try {
+ // This is an incorrect use of the constructor:
+ // the parameters in `params' should be space dimensions
+ // that are valid for the PIP_Problem we are going to build.
+ PIP_Problem pip(0, cs.begin(), cs.end(), params);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test02() {
+ Constraint_System cs;
+
+ try {
+ // This is an incorrect use of the constructor:
+ // invalid space dimension required.
+ PIP_Problem pip(1 + PIP_Problem::max_space_dimension(),
+ cs.begin(), cs.end(), Variables_Set());
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ try {
+ // This is an incorrect use of the constructor:
+ // invalid space dimension required.
+ PIP_Problem pip(1 + PIP_Problem::max_space_dimension());
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ PIP_Problem pip;
+ try {
+ // Adding too many space dimensions.
+ pip.add_space_dimensions_and_embed(1, PIP_Problem::max_space_dimension());
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable X(0);
+ Variable Y(1);
+ Variable Z(2);
+ Constraint_System cs;
+ cs.insert(X == 0);
+ cs.insert(Y == 1);
+ cs.insert(Z <= 2);
+
+ try {
+ // This is an incorrect use of the constructor:
+ // the space dimensions of the constraints should not be greater
+ // than the space dimension of the PIP problem.
+ PIP_Problem pip(2, cs.begin(), cs.end(), Variables_Set());
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ PIP_Problem pip;
+ try {
+ // Adding invalid parameter space dimensions.
+ Variable m(4);
+ pip.add_to_parameter_space_dimensions(Variables_Set(m));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ PIP_Problem pip;
+ try {
+ // Adding space dimension incompatible constraint.
+ Variable x(2);
+ pip.add_constraint(x >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test08() {
+ PIP_Problem pip;
+ try {
+ // Setting an invalid control parameter value.
+ pip.set_control_parameter(PIP_Problem::CONTROL_PARAMETER_VALUE_SIZE);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable X1(0);
+ Variable X2(1);
+ Variable I0(2);
+ Variable J0(3);
+ Variable N(4);
+ Variables_Set params(I0, N);
+
+ Constraint_System cs;
+ cs.insert(-X1 + N - 1 >= 0);
+ cs.insert(X1 - X2 >= 0);
+ cs.insert(X1 + I0 == N);
+ cs.insert(X2 + J0 - N - 1 >= 0);
+ cs.insert(I0 >= 1);
+ cs.insert(N >= 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ (void) pip.is_satisfiable();
+ // Adding 2 additional space dimensions.
+ pip.add_space_dimensions_and_embed(2, 0);
+
+ try {
+ // Trying to mark a problem variable as a parameter.
+ pip.add_to_parameter_space_dimensions(Variables_Set(X1));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ PIP_Problem pip;
+
+ try {
+ // Trying to set an invalid big parameter dimension.
+ pip.set_big_parameter_dimension(1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable X1(0);
+ Variable X2(1);
+ Variable I0(2);
+ Variable J0(3);
+ Variable N(4);
+ Variables_Set params(I0, N);
+
+ Constraint_System cs;
+ cs.insert(-X1 + N - 1 >= 0);
+ cs.insert(X1 - X2 >= 0);
+ cs.insert(X1 + I0 == N);
+ cs.insert(X2 + J0 - N - 1 >= 0);
+ cs.insert(I0 >= 1);
+ cs.insert(N >= 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ (void) pip.is_satisfiable();
+ // Adding 2 additional space dimensions.
+ pip.add_space_dimensions_and_embed(2, 0);
+
+ try {
+ // Trying to set an invalid big parameter dimension.
+ pip.set_big_parameter_dimension(3);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+ Variable A(0);
+
+ try {
+ // Trying to set an invalid (zero) denominator.
+ Art_Param ap(3*A + 8, 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ PIP_Problem pip;
+ try {
+ // Printing the solution before trying to solve the problem.
+ pip.print_solution(nout);
+ }
+ catch (std::logic_error& e) {
+ nout << "logic_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ (void) pip.solve();
+
+ const PIP_Decision_Node* root = pip.solution()->as_decision();
+ const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+ const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+
+ try {
+ // It is illegal to ask for the parametric value of a parameter.
+ (void) t_t_child->parametric_values(n);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ (void) pip.solve();
+
+ const PIP_Decision_Node* root = pip.solution()->as_decision();
+ const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+ const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+
+ try {
+ // It is illegal to ask for the parametric value of a variable
+ // having space dimension greater than that o fthe problem.
+ (void) t_t_child->parametric_values(Variable(4));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST_F8(test14);
+ DO_TEST_F8(test15);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem1.cc b/tests/PIP_Problem/pipproblem1.cc
new file mode 100644
index 0000000..21e0f7c
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem1.cc
@@ -0,0 +1,813 @@
+/* Test the PIP_Problem class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable X1(0);
+ Variable X2(1);
+ Variable I0(2);
+ Variable J0(3);
+ Variable N(4);
+ Variables_Set params(I0, N);
+
+ Constraint_System cs;
+ cs.insert(-X1 + N - 1 >= 0);
+ cs.insert(X1 - X2 >= 0);
+ cs.insert(X1 + I0 == N);
+ cs.insert(X2 + J0 - N - 1 >= 0);
+ cs.insert(I0 >= 1);
+ cs.insert(N >= 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ //cs.insert(j >= 0);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+
+ // Programmatically check the expected solution.
+ const PIP_Decision_Node* root = solution->as_decision();
+ if (root == 0)
+ return false;
+ {
+ // Check the root node.
+ if (root->art_parameter_count() != 0)
+ return false;
+ const Constraint_System& cs = root->constraints();
+ if (std::distance(cs.begin(), cs.end()) != 1)
+ return false;
+ const Constraint& c = *cs.begin();
+ if (!(c.is_inequality()
+ && c.coefficient(n) == 1
+ && c.coefficient(m) == 0
+ && c.inhomogeneous_term() == -2))
+ return false;
+ }
+ if (root->child_node(true) == 0 || root->child_node(false) != 0)
+ return false;
+ const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+ if (t_child == 0)
+ return false;
+ {
+ // Check t_child node context.
+ if (t_child->art_parameter_count() != 0)
+ return false;
+ const Constraint_System& cs = t_child->constraints();
+ if (std::distance(cs.begin(), cs.end()) != 1)
+ return false;
+ const Constraint& c = *cs.begin();
+ if (!(c.is_inequality()
+ && c.coefficient(n) == 0
+ && c.coefficient(m) == 1
+ && c.inhomogeneous_term() == -2))
+ return false;
+ // Dummy print of (non-root) tree node to increase code coverage.
+ using namespace IO_Operators;
+ nout << "\nPrinting the root's true child subtree:\n";
+ nout << (*t_child) << endl;
+ }
+ if (t_child->child_node(true) == 0 || t_child->child_node(false) == 0)
+ return false;
+ const PIP_Solution_Node* t_t_child
+ = t_child->child_node(true)->as_solution();
+ if (t_t_child == 0)
+ return false;
+ {
+ // Check t_t_child node.
+ if (t_t_child->art_parameter_count() != 0)
+ return false;
+ const Constraint_System& cs = t_t_child->constraints();
+ if (std::distance(cs.begin(), cs.end()) != 0)
+ return false;
+ const Linear_Expression& v_i = t_t_child->parametric_values(i);
+ if (!(v_i.coefficient(n) == 0
+ && v_i.coefficient(m) == 0
+ && v_i.inhomogeneous_term() == 2))
+ return false;
+ const Linear_Expression& v_j = t_t_child->parametric_values(j);
+ if (!(v_j.coefficient(n) == 0
+ && v_j.coefficient(m) == 0
+ && v_j.inhomogeneous_term() == 2))
+ return false;
+ }
+ const PIP_Solution_Node* t_f_child
+ = t_child->child_node(false)->as_solution();
+ if (t_f_child == 0)
+ return false;
+ {
+ // Check t_f_child node.
+ // Check artificial parameter.
+ if (t_f_child->art_parameter_count() != 1)
+ return false;
+ const PIP_Tree_Node::Artificial_Parameter& ap
+ = *(t_f_child->art_parameter_begin());
+ if (!(ap.coefficient(n) == 0
+ && ap.coefficient(m) == 1
+ && ap.denominator() == 2))
+ return false;
+ // Check context.
+ const Constraint_System& cs = t_f_child->constraints();
+ if (std::distance(cs.begin(), cs.end()) != 1)
+ return false;
+ const Constraint& c = *cs.begin();
+ if (!(c.is_inequality()
+ && c.coefficient(n) == 2
+ && c.coefficient(m) == 3
+ && c.inhomogeneous_term() == -8))
+ return false;
+ // Check parametric values.
+ Variable art_p(4);
+ const Linear_Expression& v_i = t_f_child->parametric_values(i);
+ if (!(v_i.coefficient(n) == 0
+ && v_i.coefficient(m) == -1
+ && v_i.coefficient(art_p) == -1
+ && v_i.inhomogeneous_term() == 4))
+ return false;
+ const Linear_Expression& v_j = t_f_child->parametric_values(j);
+ if (!(v_j.coefficient(n) == 0
+ && v_j.coefficient(m) == 1
+ && v_j.coefficient(art_p) == 0
+ && v_j.inhomogeneous_term() == 0))
+ return false;
+ }
+ }
+ return ok;
+}
+
+bool
+test03() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+ Variable m(3);
+ Variable n(4);
+ Variables_Set params(k, n);
+
+ Constraint_System cs;
+ cs.insert(i <= m);
+ cs.insert(j <= n);
+ cs.insert(2*i+j == 2*m+n-k);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+ Variable m(3);
+ Variable n(4);
+ Variables_Set params(k, n);
+
+ Constraint_System cs;
+ cs.insert(i <= m);
+ cs.insert(j <= n);
+ cs.insert(2*i+j == 2*m+n-k);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ // Test copy constructor.
+ {
+ PIP_Problem pip_copy = pip;
+ // Here we call the destructor of pip_copy
+ // and we also destroy the (copied) solution tree of pip_copy.
+ const PIP_Tree solution = pip_copy.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable m(2);
+ Variable n(3);
+ Variables_Set params(m, n);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(i <= n);
+ cs.insert(j <= m);
+ cs.insert(n >= 3);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable i(0);
+ Variable n(1);
+ Variables_Set params(n);
+
+ Constraint_System cs;
+ cs.insert(4*i + 2*n == 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ if (ok)
+ pip.print_solution(nout);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable i(0);
+ Variable j(1);
+ Variable m(2);
+ Variable n(3);
+ Variables_Set params(m, n);
+
+ PIP_Problem pip(4);
+ pip.add_to_parameter_space_dimensions(params);
+
+ pip.add_constraint(3*j >= -2*i+8);
+ pip.add_constraint(j <= 4*i - 4);
+ pip.add_constraint(i <= n);
+ pip.add_constraint(n >= 3);
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(j <= m);
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable i(0);
+ Variable j(1);
+ Variable m(2);
+ Variable n(3);
+ Variables_Set params(m, n);
+
+ PIP_Problem pip(4);
+ pip.add_to_parameter_space_dimensions(params);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(i <= n);
+ cs.insert(n >= 3);
+ cs.insert(j <= m);
+
+ pip.add_constraints(cs);
+
+ pip.set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+
+ bool ok = pip.is_satisfiable();
+ if (ok) {
+ const PIP_Tree solution = pip.optimizing_solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ pip.clear();
+ }
+
+ return ok;
+}
+
+bool
+test09() {
+ // Same problem as test02, but using CUTTING_STRATEGY_DEEPEST.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ //cs.insert(j >= 0);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test10() {
+ // Same problem as test02, but using CUTTING_STRATEGY_ALL.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ //cs.insert(j >= 0);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test11() {
+ // 0-dimension trivial PIP problem.
+ PIP_Problem pip;
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test12() {
+ // Trivial PIP problem, but with 4 parameters.
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(0, 4);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test13() {
+ // Trivial PIP problem with 4 variables.
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(4, 0);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test14() {
+ // Trivial PIP problem with 4 variables and 4 parameters.
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(4, 4);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test15() {
+ PIP_Problem pip;
+ // Adding trivial satisfiable constraint.
+ pip.add_constraint(Linear_Expression(5) == 5);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test16() {
+ PIP_Problem pip;
+ // Adding trivial unsatisfiable constraint.
+ pip.add_constraint(Linear_Expression(0) == 1);
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ if (pip.solution() != 0)
+ pip.print_solution(nout);
+ return ok;
+}
+
+bool
+test17() {
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(0, 1);
+ // Adding unsatisfiable context constraints.
+ Variable n(0);
+ pip.add_constraint(n <= 5);
+ pip.add_constraint(n >= 10);
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ if (pip.solution() != 0)
+ pip.print_solution(nout);
+ return ok;
+}
+
+bool
+test18() {
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(0, 2);
+ // Adding unsatisfiable context constraints.
+ Variable n(0);
+ Variable m(1);
+ pip.add_constraint(n == 2);
+ pip.add_constraint(m == 2);
+ pip.add_constraint(n + m == 3);
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ if (pip.solution() != 0)
+ pip.print_solution(nout);
+ return ok;
+}
+
+bool
+test19() {
+ // Same problem as test02, but incrementally adding a parameter constraint
+ // making the problem unfeasible.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(n <= 1);
+ ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test20() {
+ // Same problem as test02, but incrementally adding a parameter constraint
+ // making the solution tree simpler.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(7*m >= 12);
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test21() {
+ // Same problem as test02, but incrementally adding a parameter constraint
+ // making the solution tree simpler.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(7*m < 12);
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test22() {
+ // Same problem as test02, but incrementally adding two parameter constraints
+ // making the problem infeasible.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(7*m < 12);
+ pip.add_constraint(2*n + 3*m < 8);
+ ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test23() {
+ // Same problem as test02, but incrementally adding a parameter constraint
+ // removing one level in the decision tree.
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ pip.add_constraint(7*n >= 10);
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test24() {
+ // Minimization problem, using the big parameter trick to allow the
+ // variables to be negative.
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+
+ Constraint_System cs;
+ cs.insert(y - M >= -2*x + 2*M - 4); // y >= -2*x - 4
+ cs.insert(2*y - 2*M <= x - M + 2*p); // 2*y <= x + 2*p
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test25() {
+ // Lexicographical maximization, using variable substitution.
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable M(3);
+ Variables_Set params(p, M);
+
+ Constraint_System cs;
+ cs.insert(M - y >= 2*M - 2*x - 4); // y >= 2*x - 4
+ cs.insert(M - y <= -M + x + p); // y <= -x + p
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ pip.set_big_parameter_dimension(3); // M is the big parameter
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+bool
+test26() {
+ // Problem generating a solution node with two context constraints.
+ Variable x(0);
+ Variable y(1);
+ Variable p(2);
+ Variable q(3);
+ Variables_Set params(p, q);
+
+ Constraint_System cs;
+ cs.insert(x + p <= 2);
+ cs.insert(y + q <= 1);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST_F8(test05);
+ DO_TEST(test06);
+ DO_TEST_F8(test07);
+ DO_TEST_F8(test08);
+ DO_TEST_F8(test09);
+ DO_TEST_F8(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST_F8(test19);
+ DO_TEST_F8(test20);
+ DO_TEST_F8(test21);
+ DO_TEST_F8(test22);
+ DO_TEST_F8(test23);
+ DO_TEST(test24);
+ DO_TEST(test25);
+ DO_TEST(test26);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem2.cc b/tests/PIP_Problem/pipproblem2.cc
new file mode 100644
index 0000000..dcf0562
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem2.cc
@@ -0,0 +1,349 @@
+/* Test the PIP_Problem class
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable P(2);
+ Variable Q(3);
+ Variables_Set params(P, Q);
+
+ Constraint_System cs;
+ cs.insert(A + B >= 0);
+ cs.insert(A - B <= P);
+ cs.insert(3*A - 2*B == 5*Q);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.space_dimension() == 4);
+
+ pip.add_space_dimensions_and_embed(2, 2);
+ ok &= (pip.space_dimension() == 8);
+ params.insert(Variable(6));
+ params.insert(Variable(7));
+ ok &= (pip.parameter_space_dimensions() == params);
+
+ for (PIP_Problem::const_iterator i = pip.constraints_begin(),
+ i_end = pip.constraints_end(); i != i_end; ++i)
+ print_constraint(*i);
+
+ return ok;
+}
+
+bool
+test02() {
+ PIP_Problem pip_1(2);
+ PIP_Problem pip_2(2);
+ pip_2 = pip_1;
+
+ Variables_Set params(Variable(1));
+ pip_2.add_to_parameter_space_dimensions(params);
+
+ swap(pip_1, pip_2);
+
+ bool ok = (pip_1.space_dimension() == 2
+ && pip_2.space_dimension() == 2
+ && pip_1.parameter_space_dimensions() == params
+ && pip_2.parameter_space_dimensions() == Variables_Set());
+
+ return ok;
+}
+
+bool
+test03() {
+ PIP_Problem pip;
+ PIP_Problem::Control_Parameter_Value cp;
+
+ cp = pip.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+ bool ok = (cp == PIP_Problem::CUTTING_STRATEGY_FIRST);
+
+ pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+ cp = pip.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+ ok &= (cp == PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+ PIP_Problem pip_copy(pip);
+ cp = pip_copy.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+ ok &= (cp == PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+ return ok;
+}
+
+bool
+test04() {
+ PIP_Problem pip(6);
+ Variables_Set params(Variable(3), Variable(5));
+ pip.add_to_parameter_space_dimensions(params);
+
+ bool ok = (pip.get_big_parameter_dimension() == not_a_dimension());
+
+ pip.set_big_parameter_dimension(3);
+ ok &= (pip.get_big_parameter_dimension() == 3);
+
+ pip.set_big_parameter_dimension(5);
+ ok &= (pip.get_big_parameter_dimension() == 5);
+
+ using namespace IO_Operators;
+ nout << pip;
+
+ return ok;
+}
+
+bool
+test05() {
+ PIP_Problem pip(1);
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ // Solving again a problem already optimized.
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable X(0);
+ PIP_Problem pip(1);
+ pip.add_constraint(X == -X);
+ pip.add_constraint(X >= 1);
+
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ // Solving again a problem already detected to be unfeasible.
+ ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable X(0);
+ PIP_Problem pip(1);
+ pip.add_constraint(X == -X);
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+ // Incrementally adding a constraint.
+ pip.add_constraint(X >= 1);
+ // Solving a problem that was optimized and now is unfeasible.
+ ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable X(0);
+ Variable Y(1);
+ Variable Z(2);
+
+ Constraint_System cs;
+ cs.insert(X == 2);
+ cs.insert(Y < 1);
+ cs.insert(Z == 7);
+
+ Variables_Set params(Y, Z);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable X(0);
+ Variable Y(1);
+ Variable Z(2);
+
+ PIP_Problem pip(3);
+ pip.add_constraint(X == 2);
+ pip.add_constraint(Y < 1);
+ pip.add_constraint(Z == 7);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 5);
+
+ PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+ bool ok = (pip1.solve() == OPTIMIZED_PIP_PROBLEM);
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 5);
+
+ PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+ bool ok = (pip1.solution() != 0);
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 5);
+
+ PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+ bool ok = (pip1.optimizing_solution() != 0);
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+ Variable m(3);
+ Variable n(4);
+ Variables_Set params(k, n);
+
+ Constraint_System cs;
+ cs.insert(i <= m);
+ cs.insert(j <= n);
+ cs.insert(2*i+j == 2*m+n-k);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ PIP_Tree pip_tree = pip.solution();
+ const PIP_Solution_Node* sol_node = pip_tree->as_solution();
+ const PIP_Decision_Node* dec_node = pip_tree->as_decision();
+ bool ok = (sol_node == 0 && dec_node != 0);
+
+ return ok;
+}
+
+bool
+test14() {
+ // Some unit testing on inner class Artificial_Parameter.
+ typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+
+ Variable A(0);
+
+ Art_Param ap0;
+ Art_Param ap1(3*A + 8, -5);
+ Art_Param ap2(ap1);
+
+ bool ok = ap0.OK() && ap1.OK() && ap2.OK();
+
+ ok &= (ap0 != ap1) && (ap1 == ap2);
+ ok &= (ap0.denominator() == 1) && (ap1.denominator() == 5);
+
+ swap(ap0, ap2);
+ ok &= (ap0 == ap1) && (ap2.denominator() == 1);
+
+ using namespace IO_Operators;
+ nout << ap1 << endl;
+
+ ok &= (ap1.external_memory_in_bytes() < ap1.total_memory_in_bytes());
+
+ // Difference found in space dimension.
+ ok &= (ap1 != ap2);
+ // Difference found in denominator.
+ Art_Param ap3(3*A + 8, -6);
+ ok &= (ap1 != ap3);
+ // Difference found in inhomogeneous term.
+ Art_Param ap4(3*A + 7, -5);
+ ok &= (ap1 != ap4);
+ // Difference found in A's coefficient.
+ Art_Param ap5(2*A + 8, -5);
+ ok &= (ap1 != ap5);
+
+ return ok;
+}
+
+bool
+test15() {
+ PIP_Problem pip;
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ // Adding no space dimension at all is a no-op:
+ // it does not invalidate the solution computed before.
+ pip.add_space_dimensions_and_embed(0, 0);
+ // This would throw an exception if the solution was invalidated.
+ pip.print_solution(nout);
+ return ok;
+}
+
+bool
+test16() {
+ // NOTE: adopting a strange dimension ordering to increase code coverage.
+ Variable i(2);
+ Variable j(3);
+ Variable n(0);
+ Variable m(1);
+ Variables_Set params(n, m);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ cs.insert(j <= m);
+ cs.insert(i <= n);
+
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ (void) pip.solve();
+
+ const PIP_Decision_Node* root = pip.solution()->as_decision();
+ const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+ const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+ const Linear_Expression& v_i = t_t_child->parametric_values(i);
+ bool ok = v_i.coefficient(n) == 0
+ && v_i.coefficient(m) == 0
+ && v_i.inhomogeneous_term() == 2;
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST_F8(test16);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem3.cc b/tests/PIP_Problem/pipproblem3.cc
new file mode 100644
index 0000000..a876364
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem3.cc
@@ -0,0 +1,179 @@
+/* Test the PIP_Problem class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(2, 0);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+
+ pip.add_constraints(cs);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (!ok)
+ return ok;
+
+ {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ nout << endl;
+ }
+
+ pip.add_space_dimensions_and_embed(0, 2);
+ pip.add_constraint(j <= m);
+ pip.add_constraint(i <= n);
+
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test02() {
+ // NOTE_ changing the order of insertion of variables.
+ Variable i(0);
+ Variable n(1);
+ Variable j(2);
+ Variable m(3);
+
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(1, 1);
+
+ Constraint_System cs;
+ pip.add_constraint(i <= n);
+
+ pip.add_constraints(cs);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (!ok)
+ return ok;
+
+ {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ nout << endl;
+ }
+
+ pip.add_space_dimensions_and_embed(1, 1);
+ pip.add_constraint(3*j >= -2*i+8);
+ pip.add_constraint(j <= 4*i - 4);
+ pip.add_constraint(j <= m);
+
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test03() {
+ Variable i(0);
+ Variable j(1);
+ Variable n(2);
+ Variable m(3);
+
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(2, 2);
+
+ Constraint_System cs;
+ cs.insert(3*j >= -2*i+8);
+ cs.insert(j <= 4*i - 4);
+ pip.add_constraint(j <= m);
+ pip.add_constraint(i <= n);
+
+ pip.add_constraints(cs);
+
+ bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (!ok)
+ return ok;
+
+ {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ nout << endl;
+ }
+
+ Variable k(4);
+ Variable p(5);
+ pip.add_space_dimensions_and_embed(1, 1);
+ pip.add_constraint(k <= i + p);
+ pip.add_constraint(p <= n + 2);
+
+ ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+ if (ok) {
+ const PIP_Tree solution = pip.solution();
+ ok &= solution->OK();
+ pip.print_solution(nout);
+ }
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A == B);
+ cs.insert(A == -1);
+
+ PIP_Problem pip(2);
+ pip.add_constraints(cs);
+
+ bool ok = !pip.is_satisfiable();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+ DO_TEST_F8(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/PIP_Problem/weightwatch1.cc b/tests/PIP_Problem/weightwatch1.cc
new file mode 100644
index 0000000..0d65f8f
--- /dev/null
+++ b/tests/PIP_Problem/weightwatch1.cc
@@ -0,0 +1,187 @@
+/* Test PIP_Problem (and MIP_Problem) with respect to deterministic timeouts.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using namespace IO_Operators;
+
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher<Weightwatch_Traits> Weightwatch;
+
+class Deterministic_Timeout
+ : virtual public std::exception,
+ public Parma_Polyhedra_Library::Throwable {
+public:
+ const char* what() const throw() {
+ return "deterministic timeout in weightwatch1.cc";
+ }
+
+ void throw_me() const {
+ throw *this;
+ }
+
+ int priority() const {
+ return 0;
+ }
+
+ ~Deterministic_Timeout() throw() {
+ }
+};
+
+void too_fat() {
+ throw Deterministic_Timeout();
+}
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+ Variable S(18);
+ Variable T(19);
+ Variable U(20);
+ Variable V(21);
+ Variable W(22);
+ Variable X(23);
+ Variable Y(24);
+ Variable Z(25);
+ Variable A1(26);
+ Variable B1(27);
+ Variable C1(28);
+ Variable D1(29);
+ Variable E1(30);
+ Variable F1(31);
+ Variables_Set params;
+
+ Constraint_System cs;
+ cs.insert(162*B + D + 9*F + 1620*H - F1 == 0);
+ cs.insert(E1 == 0);
+ cs.insert(D1 == 1);
+ cs.insert(162*B + D + 9*F + 1620*H - C1 == 0);
+ cs.insert(B1 == 0);
+ cs.insert(A1 == 1);
+ cs.insert(162*B + D + 9*F + 1620*H - 162*O - Q - 9*S - 1620*Z == 0);
+ cs.insert(O - Y == 0);
+ cs.insert(S - X == 0);
+ cs.insert(Q - W == 0);
+ cs.insert(V == 0);
+ cs.insert(162*B + D + 9*F + 1620*H - 162*O - Q - 9*S - 1620*U == 0);
+ cs.insert(T == 0);
+ cs.insert(R == 0);
+ cs.insert(P == 0);
+ cs.insert(N == 0);
+ cs.insert(H - M == 0);
+ cs.insert(B - L == 0);
+ cs.insert(F - K == 0);
+ cs.insert(D - J == 0);
+ cs.insert(I == 0);
+ cs.insert(G == 0);
+ cs.insert(E == 0);
+ cs.insert(C == 0);
+ cs.insert(A == 0);
+ cs.insert(B - O >= 1);
+ cs.insert(D >= 0);
+ cs.insert(-162*B - D - 9*F - 1620*H + 162*O + Q + 9*S >= -6480);
+ cs.insert(-B >= -9);
+ cs.insert(-D >= -8);
+ cs.insert(-F >= -17);
+ cs.insert(F >= 0);
+ cs.insert(-Q >= -8);
+ cs.insert(-S >= -17);
+ cs.insert(S >= 0);
+ cs.insert(Q >= 0);
+ cs.insert(O >= 0);
+ cs.insert(H >= 0);
+
+ try {
+ PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+ Weightwatch ww(200000000, too_fat);
+
+ (void) pip.is_satisfiable();
+
+ // Should not get there.
+ return false;
+ }
+ // Note: other exceptions are just propagated.
+ catch (const Deterministic_Timeout& e) {
+ // Expected timeout exception.
+ nout << endl << e.what() << endl;
+
+ try {
+ MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), params);
+ // Set all variable to be constrained to have an integer value.
+ mip.add_to_integer_space_dimensions(Variables_Set(A, F1));
+
+ Weightwatch ww(4000000, too_fat);
+
+ if (mip.is_satisfiable()) {
+ nout << "mip is satisfiable?!" << endl;
+ return false;
+ }
+
+ return true;
+ }
+ // Note: other exceptions are just propagated.
+ catch (const Deterministic_Timeout& e) {
+ // Unexpected timeout exception.
+ nout << endl << e.what() << endl;
+ return false;
+ }
+
+ // Should never get here.
+ return false;
+ }
+
+ // Should never get here.
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/Makefile.am b/tests/Partially_Reduced_Product/Makefile.am
new file mode 100644
index 0000000..b803761
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.am
@@ -0,0 +1,228 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+noinst_HEADERS = \
+partially_reduced_product_test.hh
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/tests/Partially_Reduced_Product \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruences1 \
+affineimage1 \
+asciidumpload1 \
+bounded1 \
+boundedaffineimage1 \
+bounds1 \
+concatenate1 \
+congruences1 \
+congruencesproduct1 \
+constraints1 \
+constraintsproduct1 \
+contains1 \
+difference1 \
+dimension1 \
+directproduct1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromproduct1 \
+generalizedaffineimage1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+maxmin1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 \
+shapepreservingproduct1 \
+smashproduct1 \
+spacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+upperbound1
+
+REVERSED_TESTS = \
+reverse_constraints1 \
+reverse_congruences1 \
+reverse_directproduct1 \
+reverse_constraintsproduct1 \
+reverse_congruencesproduct1 \
+reverse_shapepreservingproduct1
+
+TESTS = \
+$(ORIGINAL_TESTS) \
+$(REVERSED_TESTS)
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+congruencesproduct1_SOURCES = congruencesproduct1.cc
+
+constraintsproduct1_SOURCES = constraintsproduct1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+difference1_SOURCES = difference1.cc
+
+dimension1_SOURCES = dimension1.cc
+
+directproduct1_SOURCES = directproduct1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+equals1_SOURCES = equals1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromproduct1_SOURCES = fromproduct1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+isempty1_SOURCES = isempty1.cc
+
+isuniverse1_SOURCES = isuniverse1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+
+shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+
+smashproduct1_SOURCES = smashproduct1.cc
+
+spacedims1_SOURCES = spacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+DERIVED_CXXFLAGS = -DREVERSED_TESTS $(AM_CXXFLAGS)
+
+reverse_congruences1_SOURCES = congruences1.cc
+reverse_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_constraints1_SOURCES = constraints1.cc
+reverse_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_directproduct1_SOURCES = directproduct1.cc
+reverse_directproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_constraintsproduct1_SOURCES = constraintsproduct1.cc
+reverse_constraintsproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_congruencesproduct1_SOURCES = congruencesproduct1.cc
+reverse_congruencesproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+reverse_shapepreservingproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Partially_Reduced_Product/Makefile.in b/tests/Partially_Reduced_Product/Makefile.in
new file mode 100644
index 0000000..e8ba3be
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.in
@@ -0,0 +1,2234 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3)
+subdir = tests/Partially_Reduced_Product
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(noinst_HEADERS) $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruences1$(EXEEXT) affineimage1$(EXEEXT) \
+ asciidumpload1$(EXEEXT) bounded1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) bounds1$(EXEEXT) \
+ concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+ congruencesproduct1$(EXEEXT) constraints1$(EXEEXT) \
+ constraintsproduct1$(EXEEXT) contains1$(EXEEXT) \
+ difference1$(EXEEXT) dimension1$(EXEEXT) \
+ directproduct1$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+ dropsomenonintegerpoints1$(EXEEXT) equals1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+ fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+ fromproduct1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+ intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+ maxmin1$(EXEEXT) refinewithcongruences1$(EXEEXT) \
+ refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+ shapepreservingproduct1$(EXEEXT) smashproduct1$(EXEEXT) \
+ spacedims1$(EXEEXT) timeelapse1$(EXEEXT) topclosed1$(EXEEXT) \
+ topclosure1$(EXEEXT) upperbound1$(EXEEXT)
+am__EXEEXT_2 = reverse_constraints1$(EXEEXT) \
+ reverse_congruences1$(EXEEXT) reverse_directproduct1$(EXEEXT) \
+ reverse_constraintsproduct1$(EXEEXT) \
+ reverse_congruencesproduct1$(EXEEXT) \
+ reverse_shapepreservingproduct1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_asciidumpload1_OBJECTS = asciidumpload1.$(OBJEXT)
+asciidumpload1_OBJECTS = $(am_asciidumpload1_OBJECTS)
+asciidumpload1_LDADD = $(LDADD)
+asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruencesproduct1_OBJECTS = congruencesproduct1.$(OBJEXT)
+congruencesproduct1_OBJECTS = $(am_congruencesproduct1_OBJECTS)
+congruencesproduct1_LDADD = $(LDADD)
+congruencesproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraintsproduct1_OBJECTS = constraintsproduct1.$(OBJEXT)
+constraintsproduct1_OBJECTS = $(am_constraintsproduct1_OBJECTS)
+constraintsproduct1_LDADD = $(LDADD)
+constraintsproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dimension1_OBJECTS = dimension1.$(OBJEXT)
+dimension1_OBJECTS = $(am_dimension1_OBJECTS)
+dimension1_LDADD = $(LDADD)
+dimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_directproduct1_OBJECTS = directproduct1.$(OBJEXT)
+directproduct1_OBJECTS = $(am_directproduct1_OBJECTS)
+directproduct1_LDADD = $(LDADD)
+directproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS = \
+ dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS = \
+ $(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromproduct1_OBJECTS = fromproduct1.$(OBJEXT)
+fromproduct1_OBJECTS = $(am_fromproduct1_OBJECTS)
+fromproduct1_LDADD = $(LDADD)
+fromproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_isempty1_OBJECTS = isempty1.$(OBJEXT)
+isempty1_OBJECTS = $(am_isempty1_OBJECTS)
+isempty1_LDADD = $(LDADD)
+isempty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_isuniverse1_OBJECTS = isuniverse1.$(OBJEXT)
+isuniverse1_OBJECTS = $(am_isuniverse1_OBJECTS)
+isuniverse1_LDADD = $(LDADD)
+isuniverse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_reverse_congruences1_OBJECTS = \
+ reverse_congruences1-congruences1.$(OBJEXT)
+reverse_congruences1_OBJECTS = $(am_reverse_congruences1_OBJECTS)
+reverse_congruences1_LDADD = $(LDADD)
+reverse_congruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_congruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_reverse_congruencesproduct1_OBJECTS = \
+ reverse_congruencesproduct1-congruencesproduct1.$(OBJEXT)
+reverse_congruencesproduct1_OBJECTS = \
+ $(am_reverse_congruencesproduct1_OBJECTS)
+reverse_congruencesproduct1_LDADD = $(LDADD)
+reverse_congruencesproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_congruencesproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_reverse_constraints1_OBJECTS = \
+ reverse_constraints1-constraints1.$(OBJEXT)
+reverse_constraints1_OBJECTS = $(am_reverse_constraints1_OBJECTS)
+reverse_constraints1_LDADD = $(LDADD)
+reverse_constraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_constraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_reverse_constraintsproduct1_OBJECTS = \
+ reverse_constraintsproduct1-constraintsproduct1.$(OBJEXT)
+reverse_constraintsproduct1_OBJECTS = \
+ $(am_reverse_constraintsproduct1_OBJECTS)
+reverse_constraintsproduct1_LDADD = $(LDADD)
+reverse_constraintsproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_constraintsproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_reverse_directproduct1_OBJECTS = \
+ reverse_directproduct1-directproduct1.$(OBJEXT)
+reverse_directproduct1_OBJECTS = $(am_reverse_directproduct1_OBJECTS)
+reverse_directproduct1_LDADD = $(LDADD)
+reverse_directproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_directproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_reverse_shapepreservingproduct1_OBJECTS = reverse_shapepreservingproduct1-shapepreservingproduct1.$(OBJEXT)
+reverse_shapepreservingproduct1_OBJECTS = \
+ $(am_reverse_shapepreservingproduct1_OBJECTS)
+reverse_shapepreservingproduct1_LDADD = $(LDADD)
+reverse_shapepreservingproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+reverse_shapepreservingproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_shapepreservingproduct1_OBJECTS = \
+ shapepreservingproduct1.$(OBJEXT)
+shapepreservingproduct1_OBJECTS = \
+ $(am_shapepreservingproduct1_OBJECTS)
+shapepreservingproduct1_LDADD = $(LDADD)
+shapepreservingproduct1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_smashproduct1_OBJECTS = smashproduct1.$(OBJEXT)
+smashproduct1_OBJECTS = $(am_smashproduct1_OBJECTS)
+smashproduct1_LDADD = $(LDADD)
+smashproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_spacedims1_OBJECTS = spacedims1.$(OBJEXT)
+spacedims1_OBJECTS = $(am_spacedims1_OBJECTS)
+spacedims1_LDADD = $(LDADD)
+spacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addcongruences1_SOURCES) $(affineimage1_SOURCES) \
+ $(asciidumpload1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) $(bounds1_SOURCES) \
+ $(concatenate1_SOURCES) $(congruences1_SOURCES) \
+ $(congruencesproduct1_SOURCES) $(constraints1_SOURCES) \
+ $(constraintsproduct1_SOURCES) $(contains1_SOURCES) \
+ $(difference1_SOURCES) $(dimension1_SOURCES) \
+ $(directproduct1_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(dropsomenonintegerpoints1_SOURCES) \
+ $(equals1_SOURCES) $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(fromproduct1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) $(intersection1_SOURCES) \
+ $(isempty1_SOURCES) $(isuniverse1_SOURCES) $(maxmin1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(reverse_congruences1_SOURCES) \
+ $(reverse_congruencesproduct1_SOURCES) \
+ $(reverse_constraints1_SOURCES) \
+ $(reverse_constraintsproduct1_SOURCES) \
+ $(reverse_directproduct1_SOURCES) \
+ $(reverse_shapepreservingproduct1_SOURCES) \
+ $(shapepreservingproduct1_SOURCES) $(smashproduct1_SOURCES) \
+ $(spacedims1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(upperbound1_SOURCES)
+DIST_SOURCES = $(addcongruences1_SOURCES) $(affineimage1_SOURCES) \
+ $(asciidumpload1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) $(bounds1_SOURCES) \
+ $(concatenate1_SOURCES) $(congruences1_SOURCES) \
+ $(congruencesproduct1_SOURCES) $(constraints1_SOURCES) \
+ $(constraintsproduct1_SOURCES) $(contains1_SOURCES) \
+ $(difference1_SOURCES) $(dimension1_SOURCES) \
+ $(directproduct1_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(dropsomenonintegerpoints1_SOURCES) \
+ $(equals1_SOURCES) $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+ $(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+ $(frompolyhedron1_SOURCES) $(fromproduct1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) $(intersection1_SOURCES) \
+ $(isempty1_SOURCES) $(isuniverse1_SOURCES) $(maxmin1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(reverse_congruences1_SOURCES) \
+ $(reverse_congruencesproduct1_SOURCES) \
+ $(reverse_constraints1_SOURCES) \
+ $(reverse_constraintsproduct1_SOURCES) \
+ $(reverse_directproduct1_SOURCES) \
+ $(reverse_shapepreservingproduct1_SOURCES) \
+ $(shapepreservingproduct1_SOURCES) $(smashproduct1_SOURCES) \
+ $(spacedims1_SOURCES) $(timeelapse1_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(upperbound1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+noinst_HEADERS = \
+partially_reduced_product_test.hh
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/tests/Partially_Reduced_Product \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruences1 \
+affineimage1 \
+asciidumpload1 \
+bounded1 \
+boundedaffineimage1 \
+bounds1 \
+concatenate1 \
+congruences1 \
+congruencesproduct1 \
+constraints1 \
+constraintsproduct1 \
+contains1 \
+difference1 \
+dimension1 \
+directproduct1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromproduct1 \
+generalizedaffineimage1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+maxmin1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 \
+shapepreservingproduct1 \
+smashproduct1 \
+spacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+upperbound1
+
+REVERSED_TESTS = \
+reverse_constraints1 \
+reverse_congruences1 \
+reverse_directproduct1 \
+reverse_constraintsproduct1 \
+reverse_congruencesproduct1 \
+reverse_shapepreservingproduct1
+
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+affineimage1_SOURCES = affineimage1.cc
+asciidumpload1_SOURCES = asciidumpload1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+bounds1_SOURCES = bounds1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+congruencesproduct1_SOURCES = congruencesproduct1.cc
+constraintsproduct1_SOURCES = constraintsproduct1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+difference1_SOURCES = difference1.cc
+dimension1_SOURCES = dimension1.cc
+directproduct1_SOURCES = directproduct1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+equals1_SOURCES = equals1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromproduct1_SOURCES = fromproduct1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+intersection1_SOURCES = intersection1.cc
+isempty1_SOURCES = isempty1.cc
+isuniverse1_SOURCES = isuniverse1.cc
+maxmin1_SOURCES = maxmin1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+relations1_SOURCES = relations1.cc
+shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+smashproduct1_SOURCES = smashproduct1.cc
+spacedims1_SOURCES = spacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+upperbound1_SOURCES = upperbound1.cc
+DERIVED_CXXFLAGS = -DREVERSED_TESTS $(AM_CXXFLAGS)
+reverse_congruences1_SOURCES = congruences1.cc
+reverse_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_constraints1_SOURCES = constraints1.cc
+reverse_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_directproduct1_SOURCES = directproduct1.cc
+reverse_directproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_constraintsproduct1_SOURCES = constraintsproduct1.cc
+reverse_constraintsproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_congruencesproduct1_SOURCES = congruencesproduct1.cc
+reverse_congruencesproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+reverse_shapepreservingproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Partially_Reduced_Product/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Partially_Reduced_Product/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) $(EXTRA_asciidumpload1_DEPENDENCIES)
+ @rm -f asciidumpload1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+congruencesproduct1$(EXEEXT): $(congruencesproduct1_OBJECTS) $(congruencesproduct1_DEPENDENCIES) $(EXTRA_congruencesproduct1_DEPENDENCIES)
+ @rm -f congruencesproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruencesproduct1_OBJECTS) $(congruencesproduct1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+constraintsproduct1$(EXEEXT): $(constraintsproduct1_OBJECTS) $(constraintsproduct1_DEPENDENCIES) $(EXTRA_constraintsproduct1_DEPENDENCIES)
+ @rm -f constraintsproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraintsproduct1_OBJECTS) $(constraintsproduct1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES)
+ @rm -f difference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+dimension1$(EXEEXT): $(dimension1_OBJECTS) $(dimension1_DEPENDENCIES) $(EXTRA_dimension1_DEPENDENCIES)
+ @rm -f dimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dimension1_OBJECTS) $(dimension1_LDADD) $(LIBS)
+
+directproduct1$(EXEEXT): $(directproduct1_OBJECTS) $(directproduct1_DEPENDENCIES) $(EXTRA_directproduct1_DEPENDENCIES)
+ @rm -f directproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(directproduct1_OBJECTS) $(directproduct1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES)
+ @rm -f dropsomenonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromproduct1$(EXEEXT): $(fromproduct1_OBJECTS) $(fromproduct1_DEPENDENCIES) $(EXTRA_fromproduct1_DEPENDENCIES)
+ @rm -f fromproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromproduct1_OBJECTS) $(fromproduct1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) $(EXTRA_isempty1_DEPENDENCIES)
+ @rm -f isempty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) $(EXTRA_isuniverse1_DEPENDENCIES)
+ @rm -f isuniverse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES)
+ @rm -f maxmin1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES)
+ @rm -f refinewithcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES)
+ @rm -f refinewithconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+reverse_congruences1$(EXEEXT): $(reverse_congruences1_OBJECTS) $(reverse_congruences1_DEPENDENCIES) $(EXTRA_reverse_congruences1_DEPENDENCIES)
+ @rm -f reverse_congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_congruences1_LINK) $(reverse_congruences1_OBJECTS) $(reverse_congruences1_LDADD) $(LIBS)
+
+reverse_congruencesproduct1$(EXEEXT): $(reverse_congruencesproduct1_OBJECTS) $(reverse_congruencesproduct1_DEPENDENCIES) $(EXTRA_reverse_congruencesproduct1_DEPENDENCIES)
+ @rm -f reverse_congruencesproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_congruencesproduct1_LINK) $(reverse_congruencesproduct1_OBJECTS) $(reverse_congruencesproduct1_LDADD) $(LIBS)
+
+reverse_constraints1$(EXEEXT): $(reverse_constraints1_OBJECTS) $(reverse_constraints1_DEPENDENCIES) $(EXTRA_reverse_constraints1_DEPENDENCIES)
+ @rm -f reverse_constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_constraints1_LINK) $(reverse_constraints1_OBJECTS) $(reverse_constraints1_LDADD) $(LIBS)
+
+reverse_constraintsproduct1$(EXEEXT): $(reverse_constraintsproduct1_OBJECTS) $(reverse_constraintsproduct1_DEPENDENCIES) $(EXTRA_reverse_constraintsproduct1_DEPENDENCIES)
+ @rm -f reverse_constraintsproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_constraintsproduct1_LINK) $(reverse_constraintsproduct1_OBJECTS) $(reverse_constraintsproduct1_LDADD) $(LIBS)
+
+reverse_directproduct1$(EXEEXT): $(reverse_directproduct1_OBJECTS) $(reverse_directproduct1_DEPENDENCIES) $(EXTRA_reverse_directproduct1_DEPENDENCIES)
+ @rm -f reverse_directproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_directproduct1_LINK) $(reverse_directproduct1_OBJECTS) $(reverse_directproduct1_LDADD) $(LIBS)
+
+reverse_shapepreservingproduct1$(EXEEXT): $(reverse_shapepreservingproduct1_OBJECTS) $(reverse_shapepreservingproduct1_DEPENDENCIES) $(EXTRA_reverse_shapepreservingproduct1_DEPENDENCIES)
+ @rm -f reverse_shapepreservingproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(reverse_shapepreservingproduct1_LINK) $(reverse_shapepreservingproduct1_OBJECTS) $(reverse_shapepreservingproduct1_LDADD) $(LIBS)
+
+shapepreservingproduct1$(EXEEXT): $(shapepreservingproduct1_OBJECTS) $(shapepreservingproduct1_DEPENDENCIES) $(EXTRA_shapepreservingproduct1_DEPENDENCIES)
+ @rm -f shapepreservingproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(shapepreservingproduct1_OBJECTS) $(shapepreservingproduct1_LDADD) $(LIBS)
+
+smashproduct1$(EXEEXT): $(smashproduct1_OBJECTS) $(smashproduct1_DEPENDENCIES) $(EXTRA_smashproduct1_DEPENDENCIES)
+ @rm -f smashproduct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(smashproduct1_OBJECTS) $(smashproduct1_LDADD) $(LIBS)
+
+spacedims1$(EXEEXT): $(spacedims1_OBJECTS) $(spacedims1_DEPENDENCIES) $(EXTRA_spacedims1_DEPENDENCIES)
+ @rm -f spacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spacedims1_OBJECTS) $(spacedims1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES)
+ @rm -f topclosure1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruencesproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraintsproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isempty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isuniverse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_constraints1-constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_directproduct1-directproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/shapepreservingproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smashproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+reverse_congruences1-congruences1.o: congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruences1-congruences1.o -MD -MP -MF $(DEPDIR)/reverse_congruences1-congruences1.Tpo -c -o reverse_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruences1-congruences1.Tpo $(DEPDIR)/reverse_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruences1.cc' object='reverse_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+
+reverse_congruences1-congruences1.obj: congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruences1-congruences1.obj -MD -MP -MF $(DEPDIR)/reverse_congruences1-congruences1.Tpo -c -o reverse_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruences1-congruences1.Tpo $(DEPDIR)/reverse_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruences1.cc' object='reverse_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+
+reverse_congruencesproduct1-congruencesproduct1.o: congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruencesproduct1-congruencesproduct1.o -MD -MP -MF $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo -c -o reverse_congruencesproduct1-congruencesproduct1.o `test -f 'congruencesproduct1.cc' || echo '$(srcdir)/'`congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruencesproduct1.cc' object='reverse_congruencesproduct1-congruencesproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruencesproduct1-congruencesproduct1.o `test -f 'congruencesproduct1.cc' || echo '$(srcdir)/'`congruencesproduct1.cc
+
+reverse_congruencesproduct1-congruencesproduct1.obj: congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruencesproduct1-congruencesproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo -c -o reverse_congruencesproduct1-congruencesproduct1.obj `if test -f 'congruencesproduct1.cc'; then $(CYGPATH_W) 'congruencesproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/congruencesproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruencesproduct1.cc' object='reverse_congruencesproduct1-congruencesproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruencesproduct1-congruencesproduct1.obj `if test -f 'congruencesproduct1.cc'; then $(CYGPATH_W) 'congruencesproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/congruencesproduct1.cc'; fi`
+
+reverse_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraints1-constraints1.o -MD -MP -MF $(DEPDIR)/reverse_constraints1-constraints1.Tpo -c -o reverse_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraints1-constraints1.Tpo $(DEPDIR)/reverse_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraints1.cc' object='reverse_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+
+reverse_constraints1-constraints1.obj: constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraints1-constraints1.obj -MD -MP -MF $(DEPDIR)/reverse_constraints1-constraints1.Tpo -c -o reverse_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraints1-constraints1.Tpo $(DEPDIR)/reverse_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraints1.cc' object='reverse_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+
+reverse_constraintsproduct1-constraintsproduct1.o: constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraintsproduct1-constraintsproduct1.o -MD -MP -MF $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo -c -o reverse_constraintsproduct1-constraintsproduct1.o `test -f 'constraintsproduct1.cc' || echo '$(srcdir)/'`constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraintsproduct1.cc' object='reverse_constraintsproduct1-constraintsproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraintsproduct1-constraintsproduct1.o `test -f 'constraintsproduct1.cc' || echo '$(srcdir)/'`constraintsproduct1.cc
+
+reverse_constraintsproduct1-constraintsproduct1.obj: constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraintsproduct1-constraintsproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo -c -o reverse_constraintsproduct1-constraintsproduct1.obj `if test -f 'constraintsproduct1.cc'; then $(CYGPATH_W) 'constraintsproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/constraintsproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraintsproduct1.cc' object='reverse_constraintsproduct1-constraintsproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraintsproduct1-constraintsproduct1.obj `if test -f 'constraintsproduct1.cc'; then $(CYGPATH_W) 'constraintsproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/constraintsproduct1.cc'; fi`
+
+reverse_directproduct1-directproduct1.o: directproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_directproduct1-directproduct1.o -MD -MP -MF $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo -c -o reverse_directproduct1-directproduct1.o `test -f 'directproduct1.cc' || echo '$(srcdir)/'`directproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo $(DEPDIR)/reverse_directproduct1-directproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='directproduct1.cc' object='reverse_directproduct1-directproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_directproduct1-directproduct1.o `test -f 'directproduct1.cc' || echo '$(srcdir)/'`directproduct1.cc
+
+reverse_directproduct1-directproduct1.obj: directproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_directproduct1-directproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo -c -o reverse_directproduct1-directproduct1.obj `if test -f 'directproduct1.cc'; then $(CYGPATH_W) 'directproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/directproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo $(DEPDIR)/reverse_directproduct1-directproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='directproduct1.cc' object='reverse_directproduct1-directproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_directproduct1-directproduct1.obj `if test -f 'directproduct1.cc'; then $(CYGPATH_W) 'directproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/directproduct1.cc'; fi`
+
+reverse_shapepreservingproduct1-shapepreservingproduct1.o: shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_shapepreservingproduct1-shapepreservingproduct1.o -MD -MP -MF $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.o `test -f 'shapepreservingproduct1.cc' || echo '$(srcdir)/'`shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='shapepreservingproduct1.cc' object='reverse_shapepreservingproduct1-shapepreservingproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.o `test -f 'shapepreservingproduct1.cc' || echo '$(srcdir)/'`shapepreservingproduct1.cc
+
+reverse_shapepreservingproduct1-shapepreservingproduct1.obj: shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_shapepreservingproduct1-shapepreservingproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.obj `if test -f 'shapepreservingproduct1.cc'; then $(CYGPATH_W) 'shapepreservingproduct1.cc'; else $(CYGPATH_W) '$(srcdir [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='shapepreservingproduct1.cc' object='reverse_shapepreservingproduct1-shapepreservingproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.obj `if test -f 'shapepreservingproduct1.cc'; then $(CYGPATH_W) 'shapepreservingproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/shapepreservingproduct1.cc'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+addcongruences1.log: addcongruences1$(EXEEXT)
+ @p='addcongruences1$(EXEEXT)'; \
+ b='addcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+ @p='affineimage1$(EXEEXT)'; \
+ b='affineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload1.log: asciidumpload1$(EXEEXT)
+ @p='asciidumpload1$(EXEEXT)'; \
+ b='asciidumpload1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+ @p='bounded1$(EXEEXT)'; \
+ b='bounded1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+ @p='boundedaffineimage1$(EXEEXT)'; \
+ b='boundedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+ @p='bounds1$(EXEEXT)'; \
+ b='bounds1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+ @p='concatenate1$(EXEEXT)'; \
+ b='concatenate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+ @p='congruences1$(EXEEXT)'; \
+ b='congruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruencesproduct1.log: congruencesproduct1$(EXEEXT)
+ @p='congruencesproduct1$(EXEEXT)'; \
+ b='congruencesproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+ @p='constraints1$(EXEEXT)'; \
+ b='constraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+constraintsproduct1.log: constraintsproduct1$(EXEEXT)
+ @p='constraintsproduct1$(EXEEXT)'; \
+ b='constraintsproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+ @p='contains1$(EXEEXT)'; \
+ b='contains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+difference1.log: difference1$(EXEEXT)
+ @p='difference1$(EXEEXT)'; \
+ b='difference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dimension1.log: dimension1$(EXEEXT)
+ @p='dimension1$(EXEEXT)'; \
+ b='dimension1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+directproduct1.log: directproduct1$(EXEEXT)
+ @p='directproduct1$(EXEEXT)'; \
+ b='directproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+ @p='discrete1$(EXEEXT)'; \
+ b='discrete1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+ @p='disjoint1$(EXEEXT)'; \
+ b='disjoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints1.log: dropsomenonintegerpoints1$(EXEEXT)
+ @p='dropsomenonintegerpoints1$(EXEEXT)'; \
+ b='dropsomenonintegerpoints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+ @p='equals1$(EXEEXT)'; \
+ b='equals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+ @p='frombdshape1$(EXEEXT)'; \
+ b='frombdshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+ @p='frombox1$(EXEEXT)'; \
+ b='frombox1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+ @p='fromgrid1$(EXEEXT)'; \
+ b='fromgrid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+ @p='fromoctagonalshape1$(EXEEXT)'; \
+ b='fromoctagonalshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+ @p='frompolyhedron1$(EXEEXT)'; \
+ b='frompolyhedron1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromproduct1.log: fromproduct1$(EXEEXT)
+ @p='fromproduct1$(EXEEXT)'; \
+ b='fromproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+ @p='generalizedaffineimage1$(EXEEXT)'; \
+ b='generalizedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+ @p='intersection1$(EXEEXT)'; \
+ b='intersection1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+isempty1.log: isempty1$(EXEEXT)
+ @p='isempty1$(EXEEXT)'; \
+ b='isempty1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+isuniverse1.log: isuniverse1$(EXEEXT)
+ @p='isuniverse1$(EXEEXT)'; \
+ b='isuniverse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+ @p='maxmin1$(EXEEXT)'; \
+ b='maxmin1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+ @p='refinewithcongruences1$(EXEEXT)'; \
+ b='refinewithcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+ @p='refinewithconstraints1$(EXEEXT)'; \
+ b='refinewithconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+ @p='relations1$(EXEEXT)'; \
+ b='relations1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+shapepreservingproduct1.log: shapepreservingproduct1$(EXEEXT)
+ @p='shapepreservingproduct1$(EXEEXT)'; \
+ b='shapepreservingproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+smashproduct1.log: smashproduct1$(EXEEXT)
+ @p='smashproduct1$(EXEEXT)'; \
+ b='smashproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spacedims1.log: spacedims1$(EXEEXT)
+ @p='spacedims1$(EXEEXT)'; \
+ b='spacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+ @p='timeelapse1$(EXEEXT)'; \
+ b='timeelapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+ @p='topclosed1$(EXEEXT)'; \
+ b='topclosed1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+ @p='topclosure1$(EXEEXT)'; \
+ b='topclosure1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+ @p='upperbound1$(EXEEXT)'; \
+ b='upperbound1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_constraints1.log: reverse_constraints1$(EXEEXT)
+ @p='reverse_constraints1$(EXEEXT)'; \
+ b='reverse_constraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_congruences1.log: reverse_congruences1$(EXEEXT)
+ @p='reverse_congruences1$(EXEEXT)'; \
+ b='reverse_congruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_directproduct1.log: reverse_directproduct1$(EXEEXT)
+ @p='reverse_directproduct1$(EXEEXT)'; \
+ b='reverse_directproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_constraintsproduct1.log: reverse_constraintsproduct1$(EXEEXT)
+ @p='reverse_constraintsproduct1$(EXEEXT)'; \
+ b='reverse_constraintsproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_congruencesproduct1.log: reverse_congruencesproduct1$(EXEEXT)
+ @p='reverse_congruencesproduct1$(EXEEXT)'; \
+ b='reverse_congruencesproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_shapepreservingproduct1.log: reverse_shapepreservingproduct1$(EXEEXT)
+ @p='reverse_shapepreservingproduct1$(EXEEXT)'; \
+ b='reverse_shapepreservingproduct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Partially_Reduced_Product/addcongruences1.cc b/tests/Partially_Reduced_Product/addcongruences1.cc
new file mode 100644
index 0000000..f5e3372
--- /dev/null
+++ b/tests/Partially_Reduced_Product/addcongruences1.cc
@@ -0,0 +1,101 @@
+/* Test Smash_Product.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// add_recycled_congruences
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+ cgs.insert((A %= 0) / 0);
+
+ Product prp(2);
+
+ Congruence_System cgs_copy = cgs;
+ Congruence_System cgs_copy2 = cgs;
+
+ prp.add_recycled_congruences(cgs_copy);
+
+ Grid gr(cgs_copy2);
+
+ Product known_prp(gr);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// add_recycled_congruences
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 0) / 2);
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((A %= 0) / 1);
+ cgs.insert(A - B == 0);
+
+ Product prp(2);
+
+ Congruence_System cgs_copy = cgs;
+ Congruence_System cgs_copy2 = cgs;
+
+ prp.add_recycled_congruences(cgs_copy);
+
+ Grid gr(cgs_copy2);
+
+ Product known_prp(gr);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/affineimage1.cc b/tests/Partially_Reduced_Product/affineimage1.cc
new file mode 100644
index 0000000..6bbe194
--- /dev/null
+++ b/tests/Partially_Reduced_Product/affineimage1.cc
@@ -0,0 +1,89 @@
+/* Test Product<NNC_Polyhedron, Grid>::()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// affine_image()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((B %= 2) / 14);
+ prp.refine_with_constraint(A <= 5);
+ prp.refine_with_constraint(B <= 10);
+
+ prp.affine_image(A, B + C);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((B %= 2) / 14);
+ known_prp.refine_with_constraint(A - B - C == 0);
+ known_prp.refine_with_constraint(A - C <= 10);
+ known_prp.refine_with_constraint(B <= 10);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// affine_preimage()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_constraint(A - B == 0);
+ prp.refine_with_congruence((A %= 0) / 3);
+
+ prp.affine_preimage(A, B);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((B %= 0) / 3);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/asciidumpload1.cc b/tests/Partially_Reduced_Product/asciidumpload1.cc
new file mode 100644
index 0000000..c6eee38
--- /dev/null
+++ b/tests/Partially_Reduced_Product/asciidumpload1.cc
@@ -0,0 +1,240 @@
+/* Test Direct_Product<nnc_ph, gr> ascii_dump() and ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+typedef Domain_Product<Grid, NNC_Polyhedron>::Direct_Product
+No_Reduction_Product;
+
+namespace {
+
+// Universe.
+bool
+test01() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ No_Reduction_Product dp1(3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Congruence.
+bool
+test02() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+
+ No_Reduction_Product dp1(3);
+ dp1.refine_with_congruence((2*A %= 3) / 3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Constraint.
+bool
+test03() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+
+ No_Reduction_Product dp1(3);
+ dp1.refine_with_constraint(3*A > 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Congruence and constraint.
+bool
+test04() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ No_Reduction_Product dp1(3);
+ dp1.refine_with_constraint(3*B > 2);
+ dp1.refine_with_congruence((A %= 0) / 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Many dimensions.
+bool
+test05() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ No_Reduction_Product dp1(4);
+ dp1.refine_with_constraint(3*A + D > 2);
+ dp1.refine_with_congruence((A - 3*C %= 0) / 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(4);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Empty.
+bool
+test06() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ No_Reduction_Product dp1(7, EMPTY);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Zero-dimension empty.
+bool
+test07() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ No_Reduction_Product dp1(0, EMPTY);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+// Zero-dimension universe.
+bool
+test08() {
+ const char* my_file = "ascii_dump_load1.dat";
+
+ No_Reduction_Product dp1(0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ dp1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ No_Reduction_Product dp2(3);
+ dp2.ascii_load(f);
+ close(f);
+
+ bool ok = (dp1 == dp2);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/bounded1.cc b/tests/Partially_Reduced_Product/bounded1.cc
new file mode 100644
index 0000000..2c12b75
--- /dev/null
+++ b/tests/Partially_Reduced_Product/bounded1.cc
@@ -0,0 +1,58 @@
+/* Test Product<>::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_bounded().
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_congruence((A %= 0) / 0);
+ prp.refine_with_congruence((B %= 0) / 0);
+ prp.refine_with_constraint(B <= 0);
+
+ bool ok = prp.is_bounded();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/boundedaffineimage1.cc b/tests/Partially_Reduced_Product/boundedaffineimage1.cc
new file mode 100644
index 0000000..7b77d24
--- /dev/null
+++ b/tests/Partially_Reduced_Product/boundedaffineimage1.cc
@@ -0,0 +1,270 @@
+/* Test Product<NNC_Polyhedron, Grid>::bounds_from_above() and
+ Product<NNC_Polyhedron, Grid>::bounds_from_below()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Product prp(7, EMPTY);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(0))
+ && prp.bounds_from_below(Linear_Expression(0)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Product prp(0, EMPTY);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(3))
+ && prp.bounds_from_below(Linear_Expression(3)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Product prp(0);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(1))
+ && prp.bounds_from_below(Linear_Expression(1)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(3*B == 2);
+
+ Linear_Expression le = A + B;
+ bool ok = prp.bounds_from_above(le)
+ && prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A - B >= 1);
+ prp.refine_with_constraint(A - B <= 1);
+ prp.refine_with_congruence(3*B %= 2);
+
+ Linear_Expression le = A - B;
+ bool ok = prp.bounds_from_above(le)
+ && prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(B == 1);
+
+ Linear_Expression le = 2*A - B;
+
+ bool ok = !prp.bounds_from_above(le)
+ && !prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Non-empty product. bounded_affine_image/3
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((A == 0) / 0);
+ prp.refine_with_congruence((B == 0) / 0);
+ prp.refine_with_congruence((C == -2) / 0);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_image(A, 7-B, B+3);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(C == -2);
+ known_prp.refine_with_constraint(B == 0);
+ known_prp.refine_with_constraint(A <= 3);
+ known_prp.refine_with_constraint(A - B >= 7);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp,
+ "*** prp.bounded_affine_image(A, 7-B, B+3) congruences ***");
+ print_constraints(prp,
+ "*** prp.bounded_affine_image(A, 7-B, B+3) constraints ***");
+
+ return ok;
+}
+
+// Empty product component. bounded_affine_image/3
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 0);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(C == -2);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_image(A, 7-B, B+3);
+
+ Product known_prp(3, EMPTY);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Non-empty product. bounded_affine_preimage/3
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((A == 0) / 0);
+ prp.refine_with_congruence((B == 0) / 0);
+ prp.refine_with_congruence((C == -2) / 0);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_preimage(A, 7-B, B+3);
+
+ Constraint_System cs;
+ cs.insert(C == -2);
+ cs.insert(B == 0);
+ cs.insert(C >= 3);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraints(cs);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Empty product. bounded_affine_preimage/3
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 0);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(C == -2);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_preimage(A, 7-B, B+3);
+
+ Product known_prp(3, EMPTY);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/bounds1.cc b/tests/Partially_Reduced_Product/bounds1.cc
new file mode 100644
index 0000000..1a45043
--- /dev/null
+++ b/tests/Partially_Reduced_Product/bounds1.cc
@@ -0,0 +1,688 @@
+/* Test Product<NNC_Polyhedron, Grid>::bounds_from_above() and
+ Product<NNC_Polyhedron, Grid>::bounds_from_below()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty.
+bool
+test01() {
+ Product prp(7, EMPTY);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(0))
+ && prp.bounds_from_below(Linear_Expression(0)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Product prp(0, EMPTY);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(3))
+ && prp.bounds_from_below(Linear_Expression(3)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Product prp(0);
+
+ bool ok = (prp.bounds_from_above(Linear_Expression(1))
+ && prp.bounds_from_below(Linear_Expression(1)));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(3*B == 2);
+
+ Linear_Expression le = A + B;
+ bool ok = prp.bounds_from_above(le)
+ && prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+#if Box_Class
+ prp.refine_with_constraint(A >= 1);
+ prp.refine_with_constraint(A <= 1);
+ prp.refine_with_constraint(B >= 1);
+ prp.refine_with_constraint(B <= 0);
+#else
+ prp.refine_with_constraint(A - B >= 1);
+ prp.refine_with_constraint(A - B <= 1);
+#endif
+ prp.refine_with_congruence(3*B %= 2);
+
+ Linear_Expression le = A - B;
+ bool ok = prp.bounds_from_above(le)
+ && prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(B == 1);
+
+ Linear_Expression le = 2*A - B;
+
+ bool ok = !prp.bounds_from_above(le)
+ && !prp.bounds_from_below(le);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Empty. maximize() and minimize()
+bool
+test07() {
+ Product prp(7, EMPTY);
+
+ Coefficient extr_n;
+ Coefficient extr_d;
+ bool dummy;
+
+ bool ok = (!prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test08() {
+ Product prp(0, EMPTY);
+
+ Coefficient extr_n;
+ Coefficient extr_d;
+ bool dummy;
+ Generator pnt(point());
+
+ bool ok = !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+ && !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test09() {
+ Product prp(0);
+
+ Coefficient extr_n, extr_d;
+ bool dummy;
+ Generator pnt(point());
+
+ bool ok = prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+ && prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(3*B == 2);
+
+ Linear_Expression le = A + B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ Generator known_pnt(point(3*A + 2*B, 3));
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ ok = ok
+ && max && min && max_n == 5 && max_d == 3 && min_n == 5 && min_d == 3
+ && pnt_max == known_pnt && pnt_min == known_pnt;
+
+ print_generator(pnt_max, "*** max point ***");
+ print_generator(pnt_min, "*** min point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is bounded.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+#if Box_Class
+ prp.refine_with_constraint(A >= 2);
+ prp.refine_with_constraint(A <= 2);
+ prp.refine_with_constraint(B >= 1);
+ prp.refine_with_constraint(B <= 1);
+#else
+ prp.refine_with_constraint(A - B >= 1);
+ prp.refine_with_constraint(A - B <= 1);
+#endif
+ prp.refine_with_congruence(3*B %= 2);
+;
+ Linear_Expression le = A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ ok = ok
+ && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+ && pnt_max == pnt_min;
+
+ print_generator(pnt_max, "*** maximum point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(B == 1);
+
+ Linear_Expression le = 2*A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ bool max;
+ bool min;
+
+ bool ok = !prp.maximize(le, max_n, max_d, max)
+ && !prp.minimize(le, min_n, min_d, min)
+ && !prp.maximize(le, max_n, max_d, max, pnt_max)
+ && !prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is strictly bounded.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+
+#if NNC_Poly_Class
+ prp.refine_with_constraint(A - B > 0);
+ prp.refine_with_constraint(A - B < 1);
+#else
+#if !Box_Class
+ prp.refine_with_constraint(A - B >= 0);
+ prp.refine_with_constraint(A - B <= 1);
+#else
+ prp.refine_with_constraint(A >= 2);
+ prp.refine_with_constraint(A <= 2);
+ prp.refine_with_constraint(B <= 2);
+ prp.refine_with_constraint(B >= 1);
+#endif
+#endif
+ prp.refine_with_congruence(3*B %= 2);
+
+ Linear_Expression le = A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+#if NNC_Poly_Class
+ ok = ok && !max && !min;
+#else
+ ok = ok && max && min;
+#endif
+
+ ok = ok && max_n == 1 && max_d == 1 && min_n == 0 && min_d == 1;
+
+ print_generator(pnt_max, "*** maximum point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+#if !Box_Class
+// Non-empty product. bounded_affine_image/3
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((A == 0) / 0);
+ prp.refine_with_congruence((B == 0) / 0);
+ prp.refine_with_congruence((C == -2) / 0);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_image(A, 7-B, B+3);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(C == -2);
+ known_prp.refine_with_constraint(B == 0);
+ known_prp.refine_with_constraint(A <= 3);
+ known_prp.refine_with_constraint(A - B >= 7);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp,
+ "*** prp.bounded_affine_image(A, 7-B, B+3) congruences ***");
+ print_constraints(prp,
+ "*** prp.bounded_affine_image(A, 7-B, B+3) constraints ***");
+
+ return ok;
+}
+
+// Empty product component. bounded_affine_image/3
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 0);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(C == -2);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_image(A, 7-B, B+3);
+
+ Product known_prp(3, EMPTY);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Non-empty product. bounded_affine_preimage/3
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((A == 0) / 0);
+ prp.refine_with_congruence((B == 0) / 0);
+ prp.refine_with_congruence((C == -2) / 0);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_preimage(A, 7-B, B+3);
+
+ Constraint_System cs;
+ cs.insert(C == -2);
+ cs.insert(B == 0);
+ cs.insert(C >= 3);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraints(cs);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Empty product. bounded_affine_preimage/3
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 0);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(C == -2);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ prp.bounded_affine_preimage(A, 7-B, B+3);
+
+ Product known_prp(3, EMPTY);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+#endif
+
+typedef Domain_Product<TBox, Grid>::Direct_Product TBox_Grid;
+typedef Domain_Product<Grid, TBox>::Direct_Product Grid_TBox;
+typedef Domain_Product<NNC_Polyhedron, Grid>::Direct_Product NNCPoly_Grid;
+
+// TBox_Grid(nnc_polyhedron, POLYNOMIAL_COMPLEXITY).
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_constraint(3*x + y >= 2);
+ ph.refine_with_constraint(x <= 4);
+ ph.refine_with_constraint(y <= 4);
+
+ TBox_Grid pprp(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox_Grid nprp(ph);
+
+ TBox_Grid known_prp(2);
+ known_prp.refine_with_constraint(3*x >= -2);
+ known_prp.refine_with_constraint(x <= 4);
+ known_prp.refine_with_constraint(y >= -10);
+ known_prp.refine_with_constraint(y <= 4);
+
+ bool ok = (nprp == known_prp && pprp == known_prp);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nprp, "*** nprp ***");
+ print_congruences(nprp, "*** nprp ***");
+ print_constraints(pprp, "*** pprp ***");
+ print_congruences(pprp, "*** pprp ***");
+
+ return ok;
+}
+
+// Copy constructor.
+bool
+test19() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+
+ NNCPoly_Grid src(1);
+ src.refine_with_constraints(cs);
+
+ NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a TBox_Grid.
+bool
+test20() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+ const Congruence_System cgs(A %= 0);
+
+ TBox_Grid src(1);
+ src.refine_with_constraints(cs);
+ src.refine_with_congruences(cgs);
+
+ NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a Grid_TBox.
+bool
+test21() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+ const Congruence_System cgs(A %= 0);
+
+ Grid_TBox src(1);
+ src.refine_with_constraints(cs);
+ src.refine_with_congruences(cgs);
+
+ NNCPoly_Grid prp(src);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(src, "*** src congruences ***");
+ print_constraints(src, "*** src constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(known_prp, "*** known_prp congruences ***");
+ print_constraints(known_prp, "*** known_prp constraints ***");
+
+ return ok && prp.OK();
+}
+
+// max_space_dimension().
+bool
+test22() {
+ dimension_type msd1 = NNC_Polyhedron::max_space_dimension();
+ nout << "NNCPolyhedron max space dimension = "
+ << msd1 << endl;
+ dimension_type msd2 = Grid::max_space_dimension();
+ nout << "Grid max space dimension = "
+ << msd2 << endl;
+ dimension_type msd = NNCPoly_Grid::max_space_dimension();
+ bool ok = (msd <= msd1 && msd <= msd2);
+
+ nout << "NNCPoly_Grid max space dimension = "
+ << msd << endl << endl;
+
+ return ok;
+}
+
+// Attempt to construct a product with too many dimensions.
+bool
+test23() {
+ try {
+ // This is an invalid use of the constructor of a product:
+ // it is illegal to (try to) build a product with a dimension
+ // greater than max_space_dimension().
+ NNCPoly_Grid pg(NNCPoly_Grid::max_space_dimension() + 2);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+#if !Box_Class
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+#endif
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+ DO_TEST(test23);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/concatenate1.cc b/tests/Partially_Reduced_Product/concatenate1.cc
new file mode 100644
index 0000000..0c10b47
--- /dev/null
+++ b/tests/Partially_Reduced_Product/concatenate1.cc
@@ -0,0 +1,71 @@
+/* Test Product<NNC_Polyhedron, Grid>::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// concatenate_assign()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Product prp1(2);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+
+ Product prp2(2);
+ prp2.refine_with_constraint(A <= 1);
+ prp2.refine_with_constraint(B >= 0);
+
+ prp1.concatenate_assign(prp2);
+
+ Product known_prp(4);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+ known_prp.refine_with_constraint(C <= 1);
+ known_prp.refine_with_constraint(D >= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/congruences1.cc b/tests/Partially_Reduced_Product/congruences1.cc
new file mode 100644
index 0000000..e1d4bfc
--- /dev/null
+++ b/tests/Partially_Reduced_Product/congruences1.cc
@@ -0,0 +1,96 @@
+/* Test Product<NNC_Polyhedron, Grid>::congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// congruences()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_congruence(A %= 9);
+ dp.refine_with_congruence(B + C %= 3);
+
+ Congruence_System cgs;
+ cgs.insert(B + C %= 0);
+ cgs.insert(A %= 0);
+
+ Grid known_gr(cgs);
+
+ Grid gr(dp.congruences());
+
+ bool ok = gr == known_gr;
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+// minimized_congruences()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_congruence(B + C %= 3);
+ dp.refine_with_constraint(A >= 9);
+ dp.refine_with_constraint(A <= 9);
+
+ Congruence_System cgs;
+ cgs.insert(B + C %= 3);
+ cgs.insert(A == 9);
+
+ Grid known_gr(cgs);
+
+ Grid gr(dp.minimized_congruences());
+
+ bool ok = gr == known_gr;
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/congruencesproduct1.cc b/tests/Partially_Reduced_Product/congruencesproduct1.cc
new file mode 100644
index 0000000..173dd39
--- /dev/null
+++ b/tests/Partially_Reduced_Product/congruencesproduct1.cc
@@ -0,0 +1,281 @@
+/* Test Partially_Reduced_Product<>:: Congruences_Reduction()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Congruences_Product CGProduct;
+// typedef Domain_Product<Poly, Grid>::Direct_Product CGProduct;
+namespace {
+
+// Congruences_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(3*A >= 7);
+ cs.insert(3*A <= 16);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2);
+
+ known_cgp.refine_with_constraint(A == 4);
+ known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = ok && cgp == known_cgp;
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction with non-strict constraints and
+// equality found. Negative coefficients.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(3*A >= -10);
+ cs.insert(2*A <= -3);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2);
+
+ known_cgp.refine_with_constraint(A == -2);
+ known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = ok && cgp == known_cgp;
+
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction with non-strict constraints and
+// equality found.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 3);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2);
+
+ known_cgp.refine_with_constraints(cs);
+ known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = ok && cgp == known_cgp;
+
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction with strict lower bound and an equality
+// is found.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(A > 0);
+ cs.insert(A <= 3);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2);
+
+ known_cgp.refine_with_constraint(A == 2);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = ok && cgp == known_cgp;
+
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction with strict upper bound and an equality
+// is found.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A < 3);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2);
+
+ known_cgp.refine_with_constraint(A == 2);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = ok && cgp == known_cgp;
+
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction where emptiness is found.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ CGProduct cgp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A < 2);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ CGProduct known_cgp(2, EMPTY);
+
+ bool ok = cgp.OK();
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = cgp == known_cgp;
+
+ print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+ print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+ }
+
+ return ok;
+}
+
+// Congruences_Reduction that calls constraints()
+// and hence reduce().
+bool
+test07() {
+ Variable A(0);
+
+ CGProduct cgp(1);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 2);
+ cgp.refine_with_constraints(cs);
+ cgp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = cgp.OK();
+
+ Constraint_System cs1 = cgp.constraints();
+
+ CGProduct known_cgp(1);
+ known_cgp.refine_with_constraints(cs1);
+
+ print_congruences(cgp, "*** after ok check: cgp congruences ***");
+ print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+ if (ok) {
+ ok = (cgp == known_cgp);
+ print_constraints(cgp,
+ "*** after known_cgp check: cgp constraints ***");
+ print_congruences(cgp,
+ "*** after known_cgp check: cgp congruences ***");
+ if (!ok) {
+ print_constraints(known_cgp,
+ "*** known_cgp constraints ***");
+ print_congruences(known_cgp,
+ "*** known_cgp congruences ***");
+ }
+ }
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/constraints1.cc b/tests/Partially_Reduced_Product/constraints1.cc
new file mode 100644
index 0000000..042369b
--- /dev/null
+++ b/tests/Partially_Reduced_Product/constraints1.cc
@@ -0,0 +1,99 @@
+/* Test constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// constraints()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_congruence((B + C %= 3) / 0);
+ dp.refine_with_constraint(A > 9);
+ dp.refine_with_constraint(A <= 11);
+
+ NNC_Polyhedron ph(dp.space_dimension());
+ ph.refine_with_constraints(dp.constraints());
+
+ NNC_Polyhedron known_ph(dp.space_dimension());
+ known_ph.refine_with_constraint(B + C == 3);
+ known_ph.refine_with_constraint(A <= 11);
+ known_ph.refine_with_constraint(A > 9);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+// minimized_constraints()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_congruence((B + C %= 3) / 0);
+ dp.refine_with_constraint(A > 9);
+ dp.refine_with_constraint(A <= 11);
+
+ DOMAIN1x ph(dp.space_dimension());
+ ph.refine_with_constraints(dp.minimized_constraints());
+
+ DOMAIN1x known_ph(dp.space_dimension());
+ known_ph.refine_with_constraint(B + C == 3);
+ known_ph.refine_with_constraint(A > 9);
+ known_ph.refine_with_constraint(A <= 11);
+
+ bool ok = (ph == known_ph);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/constraintsproduct1.cc b/tests/Partially_Reduced_Product/constraintsproduct1.cc
new file mode 100644
index 0000000..6c532f1
--- /dev/null
+++ b/tests/Partially_Reduced_Product/constraintsproduct1.cc
@@ -0,0 +1,553 @@
+/* Test Partially_Reduced_Product<>:: Shrink_Using_Congruences_Reduction()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Constraints_Product PolyGrid;
+typedef Domain_Product<Poly, TBox>::Constraints_Product PolyBox;
+#if 0
+typedef Domain_Product<Affine_Space, TBox>::Constraints_Product AffBox;
+#endif
+typedef Domain_Product<Grid, TBox>::Constraints_Product GridBox;
+
+namespace {
+
+// Constraints_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(3*A >= 7);
+ cs.insert(3*A <= 7);
+ cp.refine_with_constraints(cs);
+
+ PolyGrid known_cp(2);
+
+ known_cp.refine_with_constraint(3*A == 7);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction with non-strict constraints and
+// equality found. Negative coefficients.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(2*A >= -9);
+ cs.insert(2*A <= -9);
+ cp.refine_with_constraints(cs);
+
+ PolyGrid known_cp(2);
+
+ known_cp.refine_with_constraint(2*A == -9);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction with strict lower bound and an equality
+// is found.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(A > 0);
+ cs.insert(A <= 0);
+ cp.refine_with_constraints(cs);
+
+ PolyGrid known_cp(2, EMPTY);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction with strict upper bound and an equality
+// is found.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A < 3);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_congruence((A %= 1)/ 0);
+
+ PolyGrid known_cp(2);
+
+ known_cp.refine_with_constraint(A == 1);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction where emptiness is found.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 2);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_congruence((A %= 0)/ 0);
+
+ PolyGrid known_cp(2, EMPTY);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction where emptiness is found.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyGrid cp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 1);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_congruence((A %= 0)/ 2);
+
+ PolyGrid known_cp(2, EMPTY);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+// Constraints_Reduction that calls constraints()
+// and hence reduce().
+bool
+test07() {
+ Variable A(0);
+
+ PolyGrid cp(1);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 2);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = cp.OK();
+
+ Constraint_System cs1 = cp.constraints();
+
+ PolyGrid known_cp(1);
+ known_cp.refine_with_constraints(cs1);
+ known_cp.refine_with_congruence((A %= 0)/ 2);
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = (cp == known_cp);
+ print_constraints(cp,
+ "*** after known_cp check: cp constraints ***");
+ print_congruences(cp,
+ "*** after known_cp check: cp congruences ***");
+ if (!ok) {
+ print_constraints(known_cp,
+ "*** known_cp constraints ***");
+ print_congruences(known_cp,
+ "*** known_cp congruences ***");
+ }
+ }
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ PolyBox cp(2);
+
+ Constraint_System cs;
+ cs.insert(A + B >= 0);
+ cs.insert(A + B <= 1);
+ cs.insert(A - 2*B <= 10);
+ cs.insert(A - 2*B >= 0);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_constraint(A >= 4);
+
+ PolyBox known_cp(2);
+ known_cp.refine_with_constraint(A == 4);
+ known_cp.refine_with_constraint(B == -3);
+
+ bool ok = cp.OK();
+
+ print_congruences(cp, "*** after ok check: cp congruences ***");
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+
+ print_congruences(cp, "*** after known_cp check: cp congruences ***");
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+
+#if 0
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ AffBox cp(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 4);
+ cs.insert(B <= 10);
+ cs.insert(B >= 3);
+ cp.refine_with_constraints(cs);
+ cp.refine_with_constraint(A >= 4);
+ cp.refine_with_constraint(B <= 3);
+
+ AffBox known_cp(2);
+ known_cp.refine_with_constraint(A == 4);
+ known_cp.refine_with_constraint(B == 3);
+
+ bool ok = cp.OK();
+
+ print_constraints(cp, "*** after ok check: cp constraints ***");
+
+ if (ok) {
+ ok = ok && cp == known_cp;
+
+ print_constraints(cp, "*** after known_cp check: cp constraints ***");
+ }
+
+ return ok;
+}
+#endif
+
+// space_dimension()
+bool
+test10() {
+ Variable A(0);
+ Variable E(4);
+
+ Constraint_System cs;
+ cs.insert(A + E <= 9);
+ cs.insert(A + E >= 9);
+
+ PolyGrid cp(5);
+ cp.refine_with_constraints(cs);
+
+ bool cons_ok = (cp.space_dimension() == 5);
+
+ print_congruences(cp, "*** cp congruences ***");
+ print_constraints(cp, "*** cp constraints ***");
+
+ return cons_ok;
+}
+
+#if 0
+// Example taken from SenS07 (figure 5(a)
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(B >= -10);
+ cs.insert(B <= 5);
+ cs.insert(C >= 2);
+ cs.insert(C <= 3);
+ cs.insert(D >= 4);
+ cs.insert(D <= 9);
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert((B %= 5) / 15);
+ cgs.insert(C %= 0);
+ cgs.insert(D %= 0);
+
+ AffBox ab1(4);
+ ab1.refine_with_constraints(cs);
+ ab1.refine_with_congruences(cgs);
+ ab1.affine_image(A, 2*B + D);
+ TBox box1(4);
+ box1.refine_with_constraints(cs);
+ box1.refine_with_congruences(cgs);
+ box1.affine_image(A, 2*B + D);
+ Affine_Space affs1(4);
+ affs1.refine_with_constraints(cs);
+ affs1.refine_with_congruences(cgs);
+ affs1.affine_image(A, 2*B + D);
+ GridBox gb1(4);
+ gb1.refine_with_constraints(cs);
+ gb1.refine_with_congruences(cgs);
+ gb1.affine_image(A, 2*B + D);
+ print_constraints(ab1,
+ "*** (Affine_Space x TBox) ab1 constraints ***");
+
+ AffBox ab2(ab1);
+ TBox box2(box1);
+ Affine_Space affs2(affs1);
+ GridBox gb2(gb1);
+
+ ab1.affine_image(A, A - 4*B);
+ box1.affine_image(A, A - 4*B);
+ affs1.affine_image(A, A - 4*B);
+ gb1.affine_image(A, A - 4*B);
+
+ ab2.affine_image(A, A + 2*B);
+ box2.affine_image(A, A + 2*B);
+ affs2.affine_image(A, A + 2*B);
+ gb2.affine_image(A, A + 2*B);
+
+ ab1.upper_bound_assign(ab2);
+ box1.upper_bound_assign(box2);
+ affs1.upper_bound_assign(affs2);
+ gb1.upper_bound_assign(gb2);
+
+ Constraint_System known_cs;
+ known_cs.insert(A >= -36);
+ known_cs.insert(A <= 29);
+ known_cs.insert(B >= -10);
+ known_cs.insert(B <= 5);
+ known_cs.insert(C >= 2);
+ known_cs.insert(C <= 3);
+ known_cs.insert(D >= 4);
+ known_cs.insert(D <= 9);
+ AffBox known_ab(4);
+ known_ab.refine_with_constraints(known_cs);
+ TBox known_box(4);
+ known_box.refine_with_constraints(known_cs);
+ known_box.unconstrain(A);
+ known_box.refine_with_constraint(A >= -36);
+ known_box.refine_with_constraint(A <= 59);
+ Affine_Space known_affs(4);
+ known_affs.refine_with_constraints(known_cs);
+ GridBox known_gb(4);
+ known_gb.refine_with_constraints(known_cs);
+ known_gb.refine_with_congruences(cgs);
+ known_gb.refine_with_congruence((A - D %= 20) / 30);
+ known_gb.refine_with_congruence((B %= 5) / 15);
+
+ bool ok = (ab1 == known_ab
+ && box1 == known_box
+ && affs1 == known_affs && gb1 == known_gb);
+
+ print_constraints(ab1,
+ "*** (Affine_Space x TBox) ab1 constraints ***");
+ print_constraints(box1,
+ "*** (TBox) box1 constraints ***");
+ print_constraints(affs1, "*** (Affine_Space) affs1 constraints ***");
+ print_constraints(gb1,
+ "*** (Grid x TBox) gb1 constraints ***");
+ print_congruences(gb1,
+ "*** (Grid x TBox) gb1 congruences ***");
+
+ return ok;
+}
+
+// Example taken from SenS07 (figure 5(b)
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ Constraint_System cs;
+ cs.insert(B >= 6);
+ cs.insert(B <= 8);
+ cs.insert(C >= 1);
+ cs.insert(C <= 9);
+ Congruence_System cgs;
+ cgs.insert(A %= 0);
+ cgs.insert((B %= 0) / 2);
+ cgs.insert(C %= 0);
+ cgs.insert(D %= 0);
+ cgs.insert(E %= 0);
+
+ AffBox ab1(5);
+ TBox box1(5);
+ Affine_Space affs1(5);
+ GridBox gb1(5);
+ ab1.refine_with_constraints(cs);
+ ab1.refine_with_congruences(cgs);
+ box1.refine_with_constraints(cs);
+ box1.refine_with_congruences(cgs);
+ affs1.refine_with_constraints(cs);
+ affs1.refine_with_congruences(cgs);
+ gb1.refine_with_constraints(cs);
+ gb1.refine_with_congruences(cgs);
+
+ AffBox ab2(ab1);
+ TBox box2(box1);
+ Affine_Space affs2(affs1);
+ GridBox gb2(gb1);
+
+ ab1.affine_image(E, 2*B);
+ box1.affine_image(E, 2*B);
+ affs1.affine_image(E, 2*B);
+ gb1.affine_image(E, 2*B);
+
+ ab2.affine_image(E, B + C);
+ box2.affine_image(E, B + C);
+ affs2.affine_image(E, B + C);
+ gb2.affine_image(E, B + C);
+
+ ab1.upper_bound_assign(ab2);
+ box1.upper_bound_assign(box2);
+ affs1.upper_bound_assign(affs2);
+ gb1.upper_bound_assign(gb2);
+
+ Constraint_System known_cs(cs);
+ known_cs.insert(E >= 7);
+ known_cs.insert(E <= 17);
+ AffBox known_ab(5);
+ known_ab.refine_with_constraints(known_cs);
+ TBox known_box(5);
+ known_box.refine_with_constraints(known_cs);
+ Affine_Space known_affs(5);
+ known_affs.refine_with_constraints(known_cs);
+ GridBox known_gb(5);
+ known_gb.refine_with_constraints(known_cs);
+ known_gb.refine_with_congruences(cgs);
+
+ bool ok = (ab1 == known_ab && box1 == known_box
+ && affs1 == known_affs && gb1 == known_gb);
+
+ print_constraints(ab1, "*** (Affine_Space x TBox) ab1 constraints ***");
+ print_constraints(box1, "*** (TBox) box1 constraints ***");
+ print_constraints(affs1, "*** (Affine_Space) affs1 constraints ***");
+ print_constraints(gb1, "*** (Grid x TBox) gb1 constraints ***");
+ print_congruences(gb1, "*** (Grid x TBox) gb1 congruences ***");
+
+ return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+//DO_TEST(test09);
+ DO_TEST(test10);
+//DO_TEST_F8(test11);
+//DO_TEST(test12);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/contains1.cc b/tests/Partially_Reduced_Product/contains1.cc
new file mode 100644
index 0000000..5630207
--- /dev/null
+++ b/tests/Partially_Reduced_Product/contains1.cc
@@ -0,0 +1,103 @@
+/* Test Product<NNC_Polyhedron, Grid>::contains() and
+ Product<NNC_Polyhedron, Grid>::strictly_contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// contains()
+bool
+test01() {
+ Variable A(0);
+
+ Product prp1(1);
+ prp1.refine_with_constraint(A <= 3);
+ prp1.refine_with_congruence((A %= 3) / 2);
+
+ Product prp2(1);
+ prp2.refine_with_constraint(A <= 3);
+ prp2.refine_with_congruence(A %= 3);
+
+ bool ok1 = !prp1.contains(prp2);
+
+ prp2.refine_with_congruence((A %= 1) / 4);
+
+ bool ok2 = prp1.contains(prp2);
+
+ prp1.refine_with_congruence((A == 1) / 0);
+ prp2.refine_with_constraint(A <= 2);
+ prp2.refine_with_constraint(A >= -1);
+ prp2.refine_with_congruence((A %= 1) / 3);
+
+ bool ok3 = !prp1.contains(prp2);
+
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+
+ return ok1 && ok2 && ok3;
+}
+
+// strictly_contains()
+bool
+test02() {
+ Variable A(0);
+
+ Product prp1(1);
+ prp1.refine_with_constraint(A <= 2);
+ prp1.refine_with_congruence(A %= 0);
+
+ Product prp2(1);
+ prp2.refine_with_constraint(A <= 1);
+ prp2.refine_with_congruence(A %= 0);
+
+ bool ok1 = prp1.strictly_contains(prp2);
+
+ prp1.refine_with_constraint(A <= 1);
+ prp2.refine_with_congruence((A %= 1) /2);
+
+ bool ok2 = prp1.strictly_contains(prp2);
+
+ prp1.refine_with_congruence((A %= 1) /2);
+
+ bool ok3 = !prp1.strictly_contains(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok1 && ok2 && ok3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/difference1.cc b/tests/Partially_Reduced_Product/difference1.cc
new file mode 100644
index 0000000..7ece934
--- /dev/null
+++ b/tests/Partially_Reduced_Product/difference1.cc
@@ -0,0 +1,141 @@
+/* Test Product<NNC_Polyhedron, Grid>::difference_assign() and.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// difference_assign()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(3, UNIVERSE);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A - B %= 0) / 2);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(A >= 3);
+ prp2.refine_with_congruence((A - B %= 0) / 4);
+
+ prp1.difference_assign(prp2);
+ Product known_prp(3);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(A < 3);
+ known_prp.refine_with_congruence((A - B %= 2) / 4);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// difference_assign()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(1);
+ prp.refine_with_constraint(A <= 18);
+ prp.refine_with_constraint(A >= 18);
+
+ Product prp1(prp);
+
+ Product prp2(1);
+ prp2.refine_with_congruence((A %= 18) / 20);
+
+ prp1.difference_assign(prp2);
+
+ bool cons_ok = prp1.is_empty();
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ if (!cons_ok)
+ return false;
+
+ prp2.difference_assign(prp1);
+
+ Product known_prp(1);
+ known_prp.refine_with_congruence((A %= 18) / 20);
+
+ cons_ok = (prp2 == known_prp);
+
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return cons_ok;
+}
+
+// difference_assign() where difference is not reduced.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(1);
+ prp.refine_with_constraint(A >= 1);
+ prp.refine_with_congruence((A %= 0) / 2);
+
+ Product prp1(prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ Product prp2(1);
+ prp2.refine_with_constraint(A > 1);
+ prp2.refine_with_congruence((A %= 1) / 2);
+
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ prp1.difference_assign(prp2);
+
+ bool cons_ok = prp1.is_empty();
+
+ print_congruences(prp1,
+ "*** prp1.difference_assign(prp2) congruences ***");
+ print_constraints(prp1,
+ "*** prp1.difference_assign(prp2) constraints ***");
+
+ return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/dimension1.cc b/tests/Partially_Reduced_Product/dimension1.cc
new file mode 100644
index 0000000..e27ad53
--- /dev/null
+++ b/tests/Partially_Reduced_Product/dimension1.cc
@@ -0,0 +1,84 @@
+/* Test Product<NNC_Polyhedron, Grid>::space_dimension() and
+ Product<NNC_Polyhedron, Grid>::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// space_dimension()
+bool
+test01() {
+ Variable A(0);
+ Variable E(4);
+
+ Constraint_System cs(A + E < 9);
+
+ Product prp(5);
+ prp.refine_with_constraints(cs);
+
+ bool ok = (prp.space_dimension() == 5);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+
+// affine_dimension()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A - C >= 9);
+ prp.refine_with_constraint(A - C <= 9);
+ prp.refine_with_constraint(B >= 2);
+
+ bool ok = (prp.affine_dimension() == 2);
+
+ prp.refine_with_constraint(C == 4);
+ prp.refine_with_constraint(B == 2);
+
+ ok &= (ok && prp.affine_dimension() == 0);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct1.cc b/tests/Partially_Reduced_Product/directproduct1.cc
new file mode 100644
index 0000000..fbf02e6
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct1.cc
@@ -0,0 +1,117 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Direct_Product Product;
+
+namespace {
+
+// Universe product in 0 dimensions
+bool
+test01() {
+ Product dp1;
+
+ Product dp2(0, UNIVERSE);
+
+ bool ok = (dp1 == dp2);
+
+ print_congruences(dp1, "*** dp1 congruences ***");
+ print_constraints(dp1, "*** dp1 constraints ***");
+ print_congruences(dp2, "*** dp2 congruences ***");
+ print_constraints(dp2, "*** dp2 constraints ***");
+
+ return ok && dp1.OK() && dp2.OK();
+}
+
+// Empty product(dims, type)
+bool
+test02() {
+ Product dp(3, EMPTY);
+
+ bool ok = (dp.is_empty());
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok && dp.OK();
+}
+
+// Check equalities are not propagated between components
+bool
+test03() {
+ Variable A(0);
+
+ Product dp(3);
+
+ dp.refine_with_constraint(A >= 7);
+ dp.refine_with_constraint(A <= 7);
+
+ DOMAIN1 known_result_d1(1);
+ known_result_d1.add_constraint(A == 7);
+ DOMAIN2 known_result_d2(1);
+
+ bool ok = ((!dp.domain1().is_universe() && dp.domain2().is_universe())
+ || (!dp.domain2().is_universe() && dp.domain1().is_universe()));
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok && dp.OK();
+}
+
+// Check emptiness is not propagated between components
+bool
+test04() {
+ Variable A(0);
+
+ Product dp(3);
+
+ dp.refine_with_constraint(A >= 7);
+ dp.refine_with_constraint(A <= 5);
+
+ DOMAIN1 known_result_d1(1, EMPTY);
+ DOMAIN2 known_result_d2(1);
+
+ bool ok = ((dp.domain1().is_empty() && dp.domain2().is_universe())
+ || (dp.domain2().is_empty() && dp.domain1().is_universe()));
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/discrete1.cc b/tests/Partially_Reduced_Product/discrete1.cc
new file mode 100644
index 0000000..e298d8b
--- /dev/null
+++ b/tests/Partially_Reduced_Product/discrete1.cc
@@ -0,0 +1,101 @@
+/* Test Product<>::is_discrete().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_discrete(), due to grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(B == 2);
+ prp.refine_with_constraint(C <= 3);
+ prp.refine_with_congruence((C %= 0) / 3);
+
+ bool ok = prp.is_discrete();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_discrete(), due to polyhedron.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A <= 3);
+ prp.refine_with_constraint(A >= 3);
+ prp.refine_with_constraint(B == 0);
+
+ bool ok = prp.is_discrete();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_discrete() is false, as the components are not discrete
+// although the intersection is discrete..
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_congruence((A - B %= 0) / 0);
+ prp.refine_with_constraint(B >= 0);
+ prp.refine_with_constraint(B <= 0);
+
+ bool ok = !prp.is_discrete();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/disjoint1.cc b/tests/Partially_Reduced_Product/disjoint1.cc
new file mode 100644
index 0000000..b1a00ba
--- /dev/null
+++ b/tests/Partially_Reduced_Product/disjoint1.cc
@@ -0,0 +1,163 @@
+/* Test Product<>::is_disjoint().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+
+// is_disjoint_from(prp), due to the Polyhedra.
+bool
+test01() {
+ Variable B(1);
+
+ Product prp1(12);
+ Product prp2(12);
+ prp1.refine_with_constraint(B < 2);
+ prp2.refine_with_constraint(B > 3);
+ bool ok = prp1.is_disjoint_from(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// is_disjoint_from(prp), due to the Grids.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp1(3);
+ prp1.refine_with_congruence((A %= 0) / 7);
+
+ Product prp2(3);
+ prp2.refine_with_congruence((A %= 1) / 7);
+
+ bool ok = prp1.is_disjoint_from(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// is_disjoint_from(prp), due to either.
+bool
+test03() {
+ Variable A(0);
+
+ Product prp1(3);
+ prp1.refine_with_congruence((A %= 0) / 7);
+ Product prp2(3);
+ prp2.refine_with_congruence((A %= 1) / 7);
+ prp1.refine_with_constraint(A < 3);
+ prp2.refine_with_constraint(A > 3);
+
+ bool ok = prp1.is_disjoint_from(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// is_disjoint_from(prp), due to both.
+bool
+test04() {
+ Variable A(0);
+
+ Product prp1(3);
+ prp1.refine_with_congruence((A %= 1) / 7);
+ Product prp2(3);
+ prp2.refine_with_congruence((A %= 1) / 14);
+ prp1.refine_with_constraint(A < 6);
+ prp2.refine_with_constraint(A > 3);
+
+ bool ok = !prp1.is_disjoint_from(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// is_disjoint_from(prp), due to the intersection of the entire direct
+// products (i.e. the prp1 and prp2 polyhedron components intersect, as
+// do the grid components).
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(2);
+ prp1.refine_with_constraint(A <= 4);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_constraint(A - B <= 0);
+ prp1.refine_with_constraint(A - B >= 2);
+ prp1.refine_with_congruence((A %= 0) / 2);
+ prp1.refine_with_congruence((A %= 0) / 4);
+
+ Product prp2(2);
+ prp2.refine_with_constraint(A <= 4);
+ prp2.refine_with_constraint(A <= 0);
+ prp2.refine_with_constraint(A + B >= 4);
+ prp2.refine_with_constraint(A + B <= 6);
+ // Same grid as prp1.
+ prp2.refine_with_congruence((A %= 0) / 2);
+ prp2.refine_with_congruence((A %= 0) / 4);
+
+ bool ok = prp1.is_disjoint_from(prp2);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc b/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..3bd0b1f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc
@@ -0,0 +1,132 @@
+/* Test Product<NNC_Polyhedron, Grid>::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// drop_some_non_integer_points(ANY_COMPLEXITY)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_constraint(B >= 0);
+ prp1.refine_with_constraint(A + B >= 3);
+ prp1.refine_with_constraint(2*A - B == 0);
+ prp1.refine_with_constraint(3*A + C == 0);
+ prp1.refine_with_congruence(3*A %= 0);
+
+ prp1.drop_some_non_integer_points(ANY_COMPLEXITY);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(3*A + C == 0);
+ known_prp.refine_with_constraint(2*A - B == 0);
+ known_prp.refine_with_constraint(A >= 1);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+ print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+
+ return ok;
+}
+
+// drop_some_non_integer_points(ANY_COMPLEXITY)
+// where the initial products are not reduced
+// and the second product has non-intersecting single point components.
+bool
+test02() {
+ Variable A(0);
+
+
+ Product prp1(1);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ prp1.drop_some_non_integer_points(ANY_COMPLEXITY);
+
+ Product known_prp(1);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = prp1.OK() && (prp1 == known_prp);
+
+ print_congruences(prp1,
+ "*** prp1.drop_some_non_integer_points(ANY_COMPLEXITY) congruences ***");
+ print_constraints(prp1,
+ "*** prp1.drop_some_non_integer_points(ANY_COMPLEXITY) constraints ***");
+
+ return ok;
+}
+
+// drop_some_non_integer_points(vars, ANY_COMPLEXITY)
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Variables_Set vars;
+ vars.insert(A);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_constraint(B >= 0);
+ prp1.refine_with_constraint(A + B >= 3);
+ prp1.refine_with_constraint(2*A - B == 0);
+ prp1.refine_with_constraint(3*A + C == 0);
+ prp1.refine_with_congruence(3*A %= 0);
+
+ prp1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(3*A + C == 0);
+ known_prp.refine_with_constraint(2*A - B == 0);
+ known_prp.refine_with_constraint(A >= 1);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+ print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/equals1.cc b/tests/Partially_Reduced_Product/equals1.cc
new file mode 100644
index 0000000..c38acef
--- /dev/null
+++ b/tests/Partially_Reduced_Product/equals1.cc
@@ -0,0 +1,83 @@
+/* Test operator==() and operator!=().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A + B >= 9);
+
+ Product dp(2);
+ dp.refine_with_constraints(cs);
+ dp.refine_with_congruence((A %= 9) / 19);
+
+ Product dp1 = dp;
+
+ bool ok = (dp == dp1);
+
+ print_congruences(dp, "*** dp1 congruences ***");
+ print_constraints(dp, "*** dp1 constraints ***");
+
+ return ok && dp.OK() && dp1.OK();
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A + B >= 9);
+
+ Product dp(2);
+ dp.refine_with_constraints(cs);
+ dp.refine_with_congruence((A %= 9) / 19);
+
+ Product dp1(2);
+
+ bool ok = (dp != dp1);
+
+ print_congruences(dp, "*** dp1 congruences ***");
+ print_constraints(dp, "*** dp1 constraints ***");
+
+ return ok && dp.OK() && dp1.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frombdshape1.cc b/tests/Partially_Reduced_Product/frombdshape1.cc
new file mode 100644
index 0000000..56a8f16
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frombdshape1.cc
@@ -0,0 +1,65 @@
+/* Test construction of product from BD_Shape.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(bds).
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A >= 0);
+ cs.insert(2*A - 2*B >= 5);
+
+ TBD_Shape bd(cs);
+
+ Product dp(bd);
+
+ Product known_result(2);
+ known_result.refine_with_constraint(A >= 0);
+ known_result.refine_with_constraint(2*A - 2*B >= 5);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frombox1.cc b/tests/Partially_Reduced_Product/frombox1.cc
new file mode 100644
index 0000000..7eb7c05
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frombox1.cc
@@ -0,0 +1,87 @@
+/* Test construction of product from a Box.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(bounding_box)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBox box(2);
+ box.refine_with_constraint(3*B >= 2);
+ box.refine_with_constraint(A >= 2);
+ box.refine_with_constraint(A <= 2);
+
+ Product dp(box);
+
+ Product known_dp(2);
+ known_dp.refine_with_constraint(3*B >= 2);
+ known_dp.refine_with_constraint(A == 2);
+
+ bool ok = (dp == known_dp) && dp.OK();
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ const Constraint_System cs(A > 0);
+
+ TBox box(cs);
+
+ Product dp(box);
+
+ Product known_result(1);
+ known_result.refine_with_constraint(A > 0);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromgrid1.cc b/tests/Partially_Reduced_Product/fromgrid1.cc
new file mode 100644
index 0000000..67cb6d7
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromgrid1.cc
@@ -0,0 +1,62 @@
+/* Test construction of product from a grid.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(grid).
+bool
+test01() {
+ Variable A(0);
+
+ const Congruence_System cgs(A %= 0);
+
+ Grid gr(cgs);
+
+ Product dp(gr);
+
+ Product known_result(1);
+ known_result.refine_with_congruence((A %= 0) / 1);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromoctagonalshape1.cc b/tests/Partially_Reduced_Product/fromoctagonalshape1.cc
new file mode 100644
index 0000000..51fe88f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromoctagonalshape1.cc
@@ -0,0 +1,65 @@
+/* Test construction of product from octagonal shape.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(os).
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A >= 0);
+ cs.insert(2*A + 2*B >= 5);
+
+ TOctagonal_Shape os(cs);
+
+ Product dp(os);
+
+ Product known_result(2);
+ known_result.refine_with_constraint(A >= 0);
+ known_result.refine_with_constraint(2*A + 2*B >= 5);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frompolyhedron1.cc b/tests/Partially_Reduced_Product/frompolyhedron1.cc
new file mode 100644
index 0000000..0969988
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frompolyhedron1.cc
@@ -0,0 +1,120 @@
+/* Test construction of product from a polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(c_polyhedron).
+bool
+test01() {
+ Variable A(0);
+
+ const Constraint_System cs(A == 0);
+
+ C_Polyhedron ph(cs);
+
+ Product dp(ph);
+
+ Product known_result(1);
+ known_result.refine_with_congruence((A %= 0) / 0);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+// Product(nnc_polyhedron).
+bool
+test02() {
+ Variable A(0);
+
+ const Constraint_System cs(A > 0);
+
+ NNC_Polyhedron ph(cs);
+
+ Product dp(ph);
+
+ Product known_result(1);
+ known_result.refine_with_constraint(A > 0);
+
+ bool ok = (dp == known_result);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+typedef Domain_Product<TBox, Grid>::Constraints_Product TBox_Grid;
+
+// TBox_Grid(nnc_polyhedron, POLYNOMIAL_COMPLEXITY).
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_constraint(3*x + y >= 2);
+ ph.refine_with_constraint(x <= 4);
+ ph.refine_with_constraint(y <= 4);
+
+ TBox_Grid pprp(ph, POLYNOMIAL_COMPLEXITY);
+
+ TBox_Grid nprp(ph);
+
+ TBox_Grid known_prp(2);
+ known_prp.refine_with_constraint(3*x >= -2);
+ known_prp.refine_with_constraint(x <= 4);
+ known_prp.refine_with_constraint(y >= -10);
+ known_prp.refine_with_constraint(y <= 4);
+
+ bool ok = (nprp == known_prp && pprp == known_prp);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(nprp, "*** nprp ***");
+ print_congruences(nprp, "*** nprp ***");
+ print_constraints(pprp, "*** pprp ***");
+ print_congruences(pprp, "*** pprp ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromproduct1.cc b/tests/Partially_Reduced_Product/fromproduct1.cc
new file mode 100644
index 0000000..2f34301
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromproduct1.cc
@@ -0,0 +1,179 @@
+/* Test construction of product from another product.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Direct_Product DProduct;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product CProduct;
+
+namespace {
+
+// Copy constructor.
+bool
+test01() {
+ Variable A(0);
+ Variable C(2);
+
+ DProduct dp1(3);
+ dp1.refine_with_constraint(A - C == 0);
+
+ DProduct dp(dp1);
+
+ bool ok = (dp == dp1);
+
+ print_congruences(dp, "*** dp congruences ***");
+ print_constraints(dp, "*** dp constraints ***");
+
+ return ok && dp.OK();
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable C(2);
+
+ DProduct dp(3);
+ dp.refine_with_constraint(A - C == 0);
+
+ CProduct cp(dp);
+
+ CProduct known_result(3);
+ known_result.refine_with_constraint(A - C == 0);
+ bool ok = (cp == known_result);
+
+ print_congruences(cp, "*** cp congruences ***");
+ print_constraints(cp, "*** cp constraints ***");
+
+ return ok && dp.OK();
+}
+
+typedef Domain_Product<TBox, Grid>::Constraints_Product TBox_Grid;
+typedef Domain_Product<Grid, TBox>::Constraints_Product Grid_TBox;
+typedef Domain_Product<NNC_Polyhedron, Grid>::Constraints_Product NNCPoly_Grid;
+
+// Copy constructor.
+bool
+test03() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+
+ NNCPoly_Grid src(1);
+ src.refine_with_constraints(cs);
+
+ NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a TBox_Grid.
+bool
+test04() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+ const Congruence_System cgs(A %= 0);
+
+ TBox_Grid src(1);
+ src.refine_with_constraints(cs);
+ src.refine_with_congruences(cgs);
+
+ NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a Grid_TBox.
+bool
+test05() {
+ Variable A(0);
+
+ const Constraint_System cs(A >= 0);
+ const Congruence_System cgs(A %= 0);
+
+ Grid_TBox src(1);
+ src.refine_with_constraints(cs);
+ src.refine_with_congruences(cgs);
+
+ NNCPoly_Grid prp(src);
+
+ NNCPoly_Grid prp1(src);
+
+ NNCPoly_Grid known_prp(1);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp == known_prp && prp1 == known_prp);
+
+ print_congruences(src, "*** src congruences ***");
+ print_constraints(src, "*** src constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(known_prp, "*** known_prp congruences ***");
+ print_constraints(known_prp, "*** known_prp constraints ***");
+
+ return ok && prp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/generalizedaffineimage1.cc b/tests/Partially_Reduced_Product/generalizedaffineimage1.cc
new file mode 100644
index 0000000..25791ca
--- /dev/null
+++ b/tests/Partially_Reduced_Product/generalizedaffineimage1.cc
@@ -0,0 +1,262 @@
+/* Test Product<NNC_Polyhedron, Grid>::generalized_affine_image() and
+ Product<NNC_Polyhedron, Grid>::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// generalized_affine_image(v, EQUAL, e)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_congruence(A %= 0);
+ prp.refine_with_congruence((A + B %= 0) / 2);
+ prp.refine_with_constraint(B >= 0);
+ prp.refine_with_constraint(A - B >= 0);
+
+ Linear_Expression le(A+2);
+
+ prp.generalized_affine_image(A, EQUAL, le);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence(A %= 0);
+ known_prp.refine_with_congruence((A + B %= 0) / 2);
+ known_prp.refine_with_constraint(B >= 0);
+ known_prp.refine_with_constraint(A - B >= 2);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_image(v, EQUAL, e, d)
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_congruence(A %= 0);
+ prp.refine_with_congruence((A + B %= 0) / 2);
+ prp.refine_with_constraint(A >= 3);
+
+ prp.generalized_affine_image(B, EQUAL, A + 1, 2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(A - 2*B == -1);
+ known_prp.refine_with_congruence(A %= 0);
+ known_prp.refine_with_constraint(A >= 3);
+ known_prp.refine_with_constraint(B >= 2);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_preimage(v, GREATER_OR_EQUAL, e)
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_constraint(A >= 0);
+ prp.refine_with_constraint(A <= 4);
+ prp.refine_with_constraint(B <= 5);
+ prp.refine_with_constraint(A <= B);
+ prp.refine_with_congruence(A %= B);
+
+ prp.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(0 <= A);
+ known_prp.refine_with_constraint(A <= 3);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_preimage(v, EQUAL, e, d),
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence(A %= 0);
+ prp.refine_with_congruence((B %= 0) / 2);
+
+ prp.generalized_affine_preimage(B, EQUAL, A + B, 1);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((A + B %= 0) / 2);
+ known_prp.refine_with_congruence(A %= 0);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_image(lhs, relsym, rhs)
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_congruence(A %= 0);
+ prp.refine_with_constraint(B >= 0);
+ prp.refine_with_constraint(A - B >= 1);
+
+ prp.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence(A %= 0);
+ known_prp.refine_with_constraint(B >= 0);
+ known_prp.refine_with_constraint(A - B >= 1);
+ known_prp.refine_with_constraint(2 <= A + B);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_image(lhs, EQUAL, rhs),
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cs;
+ cs.insert((A %= 0) / 1);
+ cs.insert((B %= 0) / 2);
+
+ Product prp(2);
+ prp.refine_with_congruences(cs);
+ prp.refine_with_constraint(A <= 3);
+
+ prp.generalized_affine_image(A + 2*B, EQUAL, A - B);
+
+ Product known_prp(2);
+ known_prp.refine_with_congruence((A + 2*B %= 0) / 1);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_preimage(lhs, relsym, rhs).
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A <= 4);
+ cs.insert(B <= 5);
+ cs.insert(A <= B);
+
+ Product prp(3);
+ prp.refine_with_constraints(cs);
+ prp.refine_with_congruence(A %= B);
+
+ prp.generalized_affine_preimage(1*B, GREATER_OR_EQUAL, A+2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(0 <= A);
+ known_prp.refine_with_constraint(A <= 3);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// generalized_affine_preimage(lhs, EQUAL, rhs)
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(A - B == 1);
+
+ prp.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((2*A - 2*B %= 1) / 0);
+
+ bool ok = (prp == known_prp);
+
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/intersection1.cc b/tests/Partially_Reduced_Product/intersection1.cc
new file mode 100644
index 0000000..ae33049
--- /dev/null
+++ b/tests/Partially_Reduced_Product/intersection1.cc
@@ -0,0 +1,125 @@
+/* Test Product<NNC_Polyhedron, Grid>::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// intersection_assign()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(A <= 0);
+ prp2.refine_with_congruence((A %= 0) / 7);
+
+ prp1.intersection_assign(prp2);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((A %= 0) / 14);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(A <= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok;
+}
+
+// intersection_assign()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+ prp1.refine_with_constraint(B <= 1);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(A <= 0);
+ prp2.refine_with_congruence((A %= 0) / 7);
+ prp2.refine_with_constraint(B >= 1);
+
+ prp1.intersection_assign(prp2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(A == 0);
+ known_prp.refine_with_constraint(B == 1);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok;
+}
+
+// intersection_assign()
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+ prp1.refine_with_constraint(B <= 1);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(A <= 0);
+ prp2.refine_with_congruence((A %= 0) / 7);
+ prp2.refine_with_constraint(B >= 2);
+
+ prp1.intersection_assign(prp2);
+
+ prp1.intersection_assign(prp2);
+ bool ok = prp1.is_empty();
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/isempty1.cc b/tests/Partially_Reduced_Product/isempty1.cc
new file mode 100644
index 0000000..abc31be
--- /dev/null
+++ b/tests/Partially_Reduced_Product/isempty1.cc
@@ -0,0 +1,95 @@
+/* Test Product<>::is_empty().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_empty() where both domain objects have points.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence(A %= 9);
+ prp.refine_with_congruence(B + C %= 3);
+
+ bool ok = !prp.is_empty();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_empty() where one domain object is empty.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp(3);
+
+ prp.refine_with_congruence((A %= 0) / 2);
+ prp.refine_with_congruence((A %= 1) / 2);
+
+ bool ok = prp.is_empty();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_empty() where both domain objects are empty.
+bool
+test03() {
+ Variable A(0);
+
+ Product prp(3);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(A == 3);
+
+ bool ok = prp.is_empty();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/isuniverse1.cc b/tests/Partially_Reduced_Product/isuniverse1.cc
new file mode 100644
index 0000000..01b932f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/isuniverse1.cc
@@ -0,0 +1,84 @@
+/* Test Product<>::is_universe1().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_universe() where both domain objects are empty.
+bool
+test01() {
+ Product prp(3, EMPTY);
+
+ bool ok = !prp.is_universe();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_universe() where one domain object is universe.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp(3);
+ prp.refine_with_congruence((A %= 0) / 2);
+ prp.refine_with_congruence((A %= 1) / 2);
+
+ bool ok = !prp.is_universe();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_universe() where both domain objects are universe.
+bool
+test03() {
+ Product prp(3);
+
+ bool ok = prp.is_universe();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/maxmin1.cc b/tests/Partially_Reduced_Product/maxmin1.cc
new file mode 100644
index 0000000..b171f03
--- /dev/null
+++ b/tests/Partially_Reduced_Product/maxmin1.cc
@@ -0,0 +1,249 @@
+/* Test Product<NNC_Polyhedron, Grid>::maximize() and
+ Product<NNC_Polyhedron, Grid>::minimize()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty. maximize() and minimize()
+bool
+test01() {
+ Product prp(7, EMPTY);
+
+ Coefficient extr_n;
+ Coefficient extr_d;
+ bool dummy;
+
+ bool ok = (!prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy));
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+ Product prp(0, EMPTY);
+
+ Coefficient extr_n;
+ Coefficient extr_d;
+ bool dummy;
+ Generator pnt(point());
+
+ bool ok = !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+ && !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+ Product prp(0);
+
+ Coefficient extr_n, extr_d;
+ bool dummy;
+ Generator pnt(point());
+
+ bool ok = prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+ && prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Point.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A == 1);
+ prp.refine_with_constraint(3*B == 2);
+
+ Linear_Expression le = A + B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ Generator known_pnt(point(3*A + 2*B, 3));
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ ok = ok
+ && max && min && max_n == 5 && max_d == 3 && min_n == 5 && min_d == 3
+ && pnt_max == known_pnt && pnt_min == known_pnt;
+
+ print_generator(pnt_max, "*** max point ***");
+ print_generator(pnt_min, "*** min point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A - B >= 1);
+ prp.refine_with_constraint(A - B <= 1);
+ prp.refine_with_congruence(3*B %= 2);
+
+ Linear_Expression le = A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ ok = ok
+ && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+ && pnt_max == pnt_min;
+
+ print_generator(pnt_max, "*** maximum point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(B == 1);
+
+ Linear_Expression le = 2*A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+ bool max;
+ bool min;
+
+ bool ok = !prp.maximize(le, max_n, max_d, max)
+ && !prp.minimize(le, min_n, min_d, min)
+ && !prp.maximize(le, max_n, max_d, max, pnt_max)
+ && !prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// only one component is strictly bounded.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+
+ prp.refine_with_constraint(A - B > 0);
+ prp.refine_with_constraint(A - B < 1);
+ prp.refine_with_congruence(3*B %= 2);
+
+ Linear_Expression le = A - B;
+
+ Coefficient max_n;
+ Coefficient max_d;
+ Coefficient min_n;
+ Coefficient min_d;
+ Generator pnt_max(point());
+ Generator pnt_min(point());
+
+ bool max;
+ bool min;
+
+ bool ok = prp.maximize(le, max_n, max_d, max)
+ && prp.minimize(le, min_n, min_d, min)
+ && prp.maximize(le, max_n, max_d, max, pnt_max)
+ && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+ ok = ok && !max && !min;
+
+ ok = ok && max_n == 1 && max_d == 1 && min_n == 0 && min_d == 1;
+
+ print_generator(pnt_max, "*** maximum point ***");
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partially_reduced_product_test.hh b/tests/Partially_Reduced_Product/partially_reduced_product_test.hh
new file mode 100644
index 0000000..e05b6fb
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partially_reduced_product_test.hh
@@ -0,0 +1,30 @@
+/* Header file for partially_reduced_product test programs.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifdef REVERSED_TEST
+#define DOMAIN1 DOMAIN2x
+#define DOMAIN2 DOMAIN1x
+#else
+#define DOMAIN1 DOMAIN1x
+#define DOMAIN2 DOMAIN2x
+#endif
diff --git a/tests/Partially_Reduced_Product/refinewithcongruences1.cc b/tests/Partially_Reduced_Product/refinewithcongruences1.cc
new file mode 100644
index 0000000..ef37833
--- /dev/null
+++ b/tests/Partially_Reduced_Product/refinewithcongruences1.cc
@@ -0,0 +1,265 @@
+/* Test refine_with_congruence() and refine_with_congruences()..
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Refine with an equality congruence.
+bool
+test01() {
+ Variable A(0);
+
+ Product prp(1);
+ prp.refine_with_congruence((A == 0) / 0);
+
+ DOMAIN2 gr(1);
+ gr.refine_with_congruence((A == 0) / 0);
+ Product known_result(gr);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Refine with a proper congruence.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp(1);
+ prp.refine_with_congruence((A %= 0) / 4);
+
+ DOMAIN2 gr(1);
+ gr.refine_with_congruence((A %= 0) / 4);
+ Product known_result(gr);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Refine with congruences.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((2*A %= 1) / 4);
+ cgs.insert((A + B %= 1) / 0);
+
+ Product prp(2);
+ prp.refine_with_congruences(cgs);
+
+ DOMAIN2 gr(2);
+ gr.refine_with_congruences(cgs);
+ Product known_result(gr);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Universe product with 0 dimensions.
+bool
+test04() {
+
+ Product prp(0);
+ prp.refine_with_congruence((Linear_Expression(0) == 1) / 2);
+
+ Product known_result(0, EMPTY);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Empty product with 0 dimensions.
+bool
+test05() {
+
+ Product prp(0, EMPTY);
+ prp.refine_with_congruence((Linear_Expression(0) == 0) / 0);
+
+ Product known_result(0, EMPTY);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// refine_with_congruences
+bool
+test06() {
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((B == 0) / 2);
+
+ Product dp(2);
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ dp.refine_with_congruences(cgs);
+
+ Product known_dp(2);
+ known_dp.refine_with_congruence((A %= 0) / 2);
+ known_dp.refine_with_congruence((B == 0) / 2);
+
+ bool ok = (dp == known_dp);
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// refine_with_congruences
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert(A + B == 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_congruences(cgs);
+ bool ok = !prp.is_empty();
+
+ Product known_prp(2);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+ known_prp.refine_with_constraint(A + B == 0);
+
+ ok = ok && (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// refine_with_congruences
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A + B %= 0) / 2);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_congruences(cgs);
+
+ Product known_prp(2);
+ known_prp.refine_with_congruence((A + B %= 0) / 2);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// refine_with_congruences
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 0) / 2);
+ cgs.insert(A - B == 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_congruences(cgs);
+ bool ok = !prp.is_empty();
+
+ Product known_prp(2);
+ known_prp.refine_with_congruence((B %= 0) / 2);
+ known_prp.refine_with_constraint(A - B == 0);
+
+ ok = ok &&(prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/refinewithconstraints1.cc b/tests/Partially_Reduced_Product/refinewithconstraints1.cc
new file mode 100644
index 0000000..f86ce29
--- /dev/null
+++ b/tests/Partially_Reduced_Product/refinewithconstraints1.cc
@@ -0,0 +1,342 @@
+/* Test refine_with_constraint() and refine_with_constraints()..
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Refine with an equality constraint.
+bool
+test01() {
+ Variable A(0);
+
+ Product prp(1);
+ prp.refine_with_constraint(A == 0);
+
+ DOMAIN2 gr(1);
+ gr.refine_with_constraint(A == 0);
+ Product known_result(gr);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Refine with a proper constraint.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp(1);
+ prp.refine_with_constraint(A >= 4);
+
+ DOMAIN1 ph(1);
+ ph.refine_with_constraint(A >= 4);
+ Product known_result(ph);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Refine with constraints.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(2*A <= 1);
+ cs.insert(A + B >= 1);
+
+ Product prp(2);
+ prp.refine_with_constraints(cs);
+
+ DOMAIN1 ph(2);
+ ph.refine_with_constraints(cs);
+ Product known_result(ph);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Universe product with 0 dimensions.
+bool
+test04() {
+
+ Product prp(0);
+ prp.refine_with_constraint(Linear_Expression(0) >= 1);
+
+ Product known_result(0, EMPTY);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// Empty product with 0 dimensions.
+bool
+test05() {
+
+ Product prp(0, EMPTY);
+ prp.refine_with_constraint(Linear_Expression(0) == 0);
+
+ Product known_result(0, EMPTY);
+
+ bool ok = (prp == known_result);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok && prp.OK();
+}
+
+// refine_with_constraints
+bool
+test06() {
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B == 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_constraints(cs);
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(B == 0);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// refine_with_constraints
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_constraints(cs);
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(A + B <= 0);
+
+ bool ok = (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// refine_with_constraints
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A + B == 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_constraints(cs);
+ bool ok = !prp.is_empty();
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(A + B == 0);
+
+ ok = ok && (prp == known_prp);
+
+ return ok;
+}
+
+// refine_with_constraints
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B >= 0);
+ cs.insert(A - B == 0);
+
+ Product prp(2);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ prp.refine_with_constraints(cs);
+ bool ok = !prp.is_empty();
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(B >= 0);
+ known_prp.refine_with_constraint(A - B == 0);
+
+ ok = ok && (prp == known_prp);
+
+ print_constraints(prp, "*** prp constraints ***");
+ print_congruences(prp, "*** prp congruences ***");
+
+ return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 6);
+ prp.refine_with_constraints(cs);
+
+ Product known_prp(prp);
+
+ Constraint_System cs1;
+ cs1.insert(A > 2);
+ cs1.insert(B >= 2);
+ Congruence_System cgs1;
+ cgs1.insert((B %= 2) / 4);
+ cgs1.insert((A + B %= 6) / 0);
+ prp.refine_with_constraint(A > 2);
+ prp.refine_with_constraint(B >= 2);
+ prp.refine_with_congruence((B %= 2) / 4);
+ prp.refine_with_congruence((A + B %= 6) / 0);
+
+ bool ok = prp.OK();
+
+ known_prp.refine_with_constraint(A > 2);
+ known_prp.refine_with_constraint(B >= 2);
+ known_prp.refine_with_congruence((B %= 2) / 4);
+ known_prp.refine_with_congruence((A + B %= 6) / 0);
+
+ ok = ok && prp == known_prp;
+
+ print_congruences(prp, "*** after ok check: prp congruences ***");
+ print_constraints(prp, "*** after ok check: prp constraints ***");
+
+ return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(A <= 6);
+ prp.refine_with_constraints(cs);
+
+ Product known_prp(prp);
+
+ Constraint_System cs1;
+ cs1.insert(A > 2);
+ cs1.insert(B >= 2);
+ Congruence_System cgs1;
+ cgs1.insert((B %= 2) / 4);
+ cgs1.insert((A + B %= 6) / 0);
+ prp.refine_with_constraints(cs1);
+ prp.refine_with_congruences(cgs1);
+
+ bool ok = prp.OK();
+
+ known_prp.refine_with_constraint(A > 2);
+ known_prp.refine_with_constraint(B >= 2);
+ known_prp.refine_with_congruence((B %= 2) / 4);
+ known_prp.refine_with_congruence((A + B %= 6) / 0);
+
+ ok = ok && prp == known_prp;
+
+ print_congruences(prp, "*** after ok check: prp congruences ***");
+ print_constraints(prp, "*** after ok check: prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/relations1.cc b/tests/Partially_Reduced_Product/relations1.cc
new file mode 100644
index 0000000..8f46ced
--- /dev/null
+++ b/tests/Partially_Reduced_Product/relations1.cc
@@ -0,0 +1,316 @@
+/* Test relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// relation_with a generator
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator pnt(point(A + B));
+
+ Product dp(2);
+
+ bool ok = Poly_Gen_Relation::subsumes() == dp.relation_with(pnt);
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// relation_with a constraint
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint c(A == 2);
+
+ Product dp(2);
+
+ bool ok = Poly_Con_Relation::nothing() == dp.relation_with(c);
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// Empty product; relation_with a constraint.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product dp(2);
+ dp.refine_with_constraint(A == 1);
+ dp.refine_with_congruence((A %= 2) / 0);
+
+ bool ok = (dp.relation_with(B == 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates())
+ && dp.relation_with(B >= 0)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// A product in 3D; relation_with a constraint.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_constraint(3*A + 3*B + C == 7);
+ dp.refine_with_constraint(3*A - C >= 2);
+ dp.refine_with_congruence(6*A + 3*B %= 0);
+
+ Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+ Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+ bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+ bool okdp2 = (rel2 == Poly_Con_Relation::is_included());
+
+ if (!okdp1 || !okdp2) {
+ nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+ nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+ return false;
+ }
+
+ Poly_Con_Relation rel3 = dp.relation_with(A + B + C == 0);
+ Poly_Con_Relation rel4 = dp.relation_with(A + B == 0);
+ Poly_Con_Relation rel5 = dp.relation_with(A == 0);
+ Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) == 0);
+ Poly_Con_Relation rel7 = dp.relation_with(2*A + B >= 3);
+ Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C >= 7);
+ bool ok = (rel3 == Poly_Con_Relation::nothing()
+ && rel4 == Poly_Con_Relation::nothing()
+ && rel5 == Poly_Con_Relation::nothing()
+ && rel6 == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ && rel7 == Poly_Con_Relation::is_included()
+ && rel8 == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+ nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+ nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+ nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+ nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+ nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+ return ok;
+}
+
+// A product where the components strictly intersect the constraint.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_constraint(C == 0);
+ dp.refine_with_congruence(6*A + 3*B %= 0);
+
+ Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+ Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+ bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+ bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+
+ if (!okdp1 || !okdp2) {
+ nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+ nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+ return false;
+ }
+
+ Poly_Con_Relation rel3 = dp.relation_with(2*A + B >= 3);
+ bool ok = (rel3 == Poly_Con_Relation::nothing());
+
+ nout << "dp.relation_with(2*A + B >= 3) == " << rel3 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// relation_with a congruence
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence cg(A %= 2);
+
+ Product dp(2);
+
+ Poly_Con_Relation rel = dp.relation_with(cg);
+ bool ok = Poly_Con_Relation::nothing() == rel;
+
+ nout << "dp.relation_with(A %= 2) == " << rel << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// Empty product; relation_with a congruence.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Product dp(2);
+ dp.refine_with_constraint(A == 1);
+ dp.refine_with_congruence((A %= 2) / 0);
+
+ Poly_Con_Relation rel = dp.relation_with(B %= 0);
+ bool ok = (rel == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()
+ && Poly_Con_Relation::saturates()));
+
+ nout << "dp.relation_with(B %= 0) == " << rel << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// A product in 3D; relation_with a congruence.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_constraint(3*A + 3*B + C == 7);
+ dp.refine_with_constraint(3*A - C >= 2);
+ dp.refine_with_congruence((2*A + B %= 0) / 2);
+
+ Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B %= 3);
+ Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B %= 3);
+ bool okdp1 = (rel1 == Poly_Con_Relation::is_included());
+ bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+
+ if (!okdp2 || !okdp1) {
+ nout << "dp.domain1().relation_with(2*A + B %= 3) == " << rel1 << endl;
+ nout << "dp.domain2().relation_with(2*A + B %= 3) == " << rel2 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+ return false;
+ }
+
+ Poly_Con_Relation rel3 = dp.relation_with(A + B + C %= 0);
+ Poly_Con_Relation rel4 = dp.relation_with(A + B %= 0);
+ Poly_Con_Relation rel5 = dp.relation_with(A %= 0);
+ Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) %= 0);
+ Poly_Con_Relation rel7 = dp.relation_with(2*A + B %= 3);
+ Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C %= 7);
+ bool ok = (rel3 == Poly_Con_Relation::nothing()
+ && rel4 == Poly_Con_Relation::nothing()
+ && rel5 == Poly_Con_Relation::nothing()
+ && rel6 == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates())
+ && rel7 == Poly_Con_Relation::is_included()
+ && rel8 == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::saturates()));
+
+ nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+ nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+ nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+ nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+ nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+ nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+
+ return ok;
+}
+
+// A product where the components strictly intersect the congruence.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product dp(3);
+ dp.refine_with_constraint(C == 0);
+ dp.refine_with_congruence(6*A + 3*B %= 0);
+
+ bool okdp1 = (dp.domain1().relation_with(2*A + B %= 3)
+ == Poly_Con_Relation::strictly_intersects());
+
+ bool okdp2 = (dp.domain2().relation_with(2*A + B %= 3)
+ == Poly_Con_Relation::strictly_intersects());
+
+ Poly_Con_Relation rel = dp.relation_with(2*A + B %= 3);
+ bool ok = (okdp1 && okdp2
+ && rel == Poly_Con_Relation::nothing());
+
+ print_constraints(dp, "*** dp constraints ***");
+ print_congruences(dp, "*** dp congruences ***");
+ nout << "dp.relation_with(2*A + B %= 3) == " << rel << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/shapepreservingproduct1.cc b/tests/Partially_Reduced_Product/shapepreservingproduct1.cc
new file mode 100644
index 0000000..af03d55
--- /dev/null
+++ b/tests/Partially_Reduced_Product/shapepreservingproduct1.cc
@@ -0,0 +1,152 @@
+/* Test Partially_Reduced_Product<>:: Shape_Preserving_Reduction()
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Shape_Preserving_Product SHPProduct;
+namespace {
+
+// Shape_Preserving_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ SHPProduct shpp(2);
+ Constraint_System cs;
+ cs.insert(4*A >= 6);
+ cs.insert(4*A <= 17);
+ shpp.refine_with_constraints(cs);
+ shpp.refine_with_congruence((A %= 0)/ 2);
+
+ SHPProduct known_shpp(2);
+
+ known_shpp.refine_with_constraint(A >= 2);
+ known_shpp.refine_with_constraint(A <= 4);
+ known_shpp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = shpp.OK() && shpp == known_shpp;
+
+ print_congruences(shpp, "*** after ok check: shpp congruences ***");
+ print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+ return ok;
+}
+
+// Shape_Preserving_Reduction with non-strict constraints and
+// constraints tightened. Negative coefficients.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ SHPProduct shpp(2);
+ Constraint_System cs;
+ cs.insert(4*A >= -5);
+ cs.insert(4*A <= -1);
+ shpp.refine_with_constraints(cs);
+ shpp.refine_with_congruence((2*A %= 0)/ 1);
+
+ SHPProduct known_shpp(2);
+
+ known_shpp.refine_with_constraint(A >= -1);
+ known_shpp.refine_with_constraint(2*A <= -1);
+ known_shpp.refine_with_congruence((2*A %= 0)/ 1);
+
+ bool ok = shpp.OK() && shpp == known_shpp;
+
+ print_congruences(shpp, "*** after ok check: shpp congruences ***");
+ print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+ return ok;
+}
+
+// Shape_Preserving_Reduction with strict bounds.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ SHPProduct shpp(2);
+ Constraint_System cs;
+ cs.insert(A > 1);
+ cs.insert(A < 5);
+ shpp.refine_with_constraints(cs);
+ shpp.refine_with_congruence((A %= 0)/ 2);
+
+ SHPProduct known_shpp(2);
+
+ known_shpp.refine_with_constraint(A >= 2);
+ known_shpp.refine_with_constraint(A <= 4);
+ known_shpp.refine_with_congruence((A %= 0)/ 2);
+
+ bool ok = shpp.OK() && shpp == known_shpp;
+
+ print_congruences(shpp, "*** after ok check: shpp congruences ***");
+ print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+ return ok;
+}
+
+// Shape_Preserving_Reduction where an equality is found, not found
+// by the congruences reduction.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ SHPProduct shpp(2);
+ Constraint_System cs;
+ cs.insert(A + B >= 1);
+ cs.insert(A + B <= 3);
+ shpp.refine_with_constraints(cs);
+ shpp.refine_with_congruence((A %= 0)/ 2);
+ shpp.refine_with_congruence((B %= 0)/ 2);
+
+ SHPProduct known_shpp(2);
+
+ known_shpp.refine_with_constraint(A + B == 2);
+ known_shpp.refine_with_congruence((A %= 0)/ 2);
+ known_shpp.refine_with_congruence((B %= 0)/ 2);
+
+ bool ok = shpp.OK() && shpp == known_shpp;
+
+ print_congruences(shpp, "*** after ok check: shpp congruences ***");
+ print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/smashproduct1.cc b/tests/Partially_Reduced_Product/smashproduct1.cc
new file mode 100644
index 0000000..4529ff3
--- /dev/null
+++ b/tests/Partially_Reduced_Product/smashproduct1.cc
@@ -0,0 +1,660 @@
+/* Test Smash_Product.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product CProduct;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Smash_Product SProduct;
+
+namespace {
+
+// Product(dims, type); == and !=
+bool
+test01() {
+ Variable A(0);
+
+ SProduct sp1(3);
+ SProduct sp2(3, EMPTY);
+
+ bool ok = (sp1 != sp2);
+
+ if (!ok)
+ return false;
+
+ sp1.refine_with_congruence((A %= 0) / 4);
+ sp1.refine_with_congruence((A %= 1) / 4);
+
+ ok = (sp1 == sp2);
+
+ ok = ok && sp1.OK() && sp2.OK();
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+
+ return ok;
+}
+
+// operator=
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A + B <= 9);
+
+ SProduct sp1(2);
+ sp1.refine_with_congruence((A %= 9) / 19);
+ sp1.refine_with_congruence((A %= 8) / 19);
+ SProduct sp2 = sp1;
+
+ bool ok = (sp1 == sp2);
+
+ ok = ok && sp1.OK() && sp2.OK();
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+
+ return ok;
+}
+
+// ok(), not reduced.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ bool ok;
+
+ SProduct sp(2);
+ sp.refine_with_constraint(A >= 1);
+ sp.refine_with_constraint(A <= 0);
+ sp.refine_with_congruence((A %= 1) / 3);
+
+ ok = sp.is_empty() && sp.OK();
+
+ print_constraints(sp, "*** sp constraints ***");
+ print_congruences(sp, "*** sp congruences ***");
+
+ return ok;
+}
+
+// ok(), is reduced.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ bool ok;
+
+ SProduct sp(2);
+ sp.refine_with_constraint(A >= 1);
+ sp.refine_with_constraint(A <= 0);
+ sp.refine_with_congruence((A %= 1) / 3);
+
+ // reduce the product
+ Constraint_System sp_cs = sp.constraints();
+
+ ok = sp.OK();
+
+ print_constraints(sp_cs, "*** sp.constraints(); ***");
+
+ Grid sp_gr(sp_cs);
+ ok = sp_gr.is_empty();
+
+ return ok;
+}
+
+// Building from inequality constraints()
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(A - C <= 8);
+ cs.insert(A - C >= 9);
+
+ try {
+ SProduct sp(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "cs contains an inequality constraint: " << e.what() << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+// Building from equality congruences()
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs1;
+ cgs1.insert((A - C %= 8) / 0);
+ Congruence_System cgs2;
+ cgs2.insert((A - C %= 9) / 0);
+ cgs2.insert((B %= 21) / 0);
+
+ SProduct sp(cgs1);
+
+ bool ok = sp.OK();
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ return ok;
+}
+
+// refine_with_congruences
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert((A + B %= 0) / 2);
+ cgs.insert((B %= 0) / 2);
+ cgs.insert(A + B == 0);
+
+ SProduct sp(2);
+
+ sp.refine_with_congruences(cgs);
+
+ Grid gr(cgs);
+
+ SProduct known_sp(gr);
+
+ bool ok = (sp == known_sp);
+
+ print_constraints(sp, "*** sp constraints ***");
+ print_congruences(sp, "*** sp congruences ***");
+
+ return ok;
+}
+
+// is_bounded().
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ bool ok;
+
+ SProduct sp(2);
+ sp.refine_with_constraint(A >= 1);
+ sp.refine_with_constraint(A <= 0);
+ sp.refine_with_congruence((A %= 1) / 3);
+
+ ok = sp.is_bounded();
+ ok = ok && sp.OK();
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ return ok;
+}
+
+// space_dimension()
+bool
+test09() {
+ Variable A(0);
+ Variable E(4);
+
+ Constraint_System cs(A + E < 9);
+
+ SProduct sp(5);
+ sp.refine_with_constraints(cs);
+
+ bool smash_ok = (sp.space_dimension() == 5);
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ return smash_ok;
+}
+
+// affine_dimension()
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ SProduct sp(3);
+ sp.refine_with_constraint(A - C <= 9);
+ sp.refine_with_constraint(A - C >= 9);
+ sp.refine_with_constraint(B >= 2);
+
+ bool smash_ok = sp.space_dimension() == 3;
+ smash_ok = smash_ok && sp.affine_dimension() == 2;
+
+ if (smash_ok) {
+ sp.refine_with_constraint(A - C >= 4);
+ sp.refine_with_constraint(A - C <= 4);
+
+ smash_ok = smash_ok && sp.affine_dimension() == 0;
+ }
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ return smash_ok;
+}
+
+// contains()
+bool
+test11() {
+ Variable A(0);
+
+ SProduct sp1(1);
+ sp1.refine_with_constraint(A <= 3);
+ sp1.refine_with_congruence((A %= 1) / 2);
+
+ SProduct sp2(1);
+ sp2.refine_with_constraint(A <= 3);
+ sp2.refine_with_constraint(A >= 4);
+ sp2.refine_with_congruence((A %= 0) / 2);
+
+ bool smash_ok1 = sp1.contains(sp2) && sp1.strictly_contains(sp2);
+
+ print_constraints(sp1, "*** sp1 constraints ***");
+ print_congruences(sp1, "*** sp1 congruences ***");
+
+ if (!smash_ok1)
+ return smash_ok1;
+
+ SProduct sp3(1);
+ sp3.refine_with_constraint(A <= 3);
+ sp3.refine_with_congruence((A %= 1) / 2);
+
+ SProduct sp4(1);
+ sp4.refine_with_constraint(A <= 4);
+ sp4.refine_with_congruence((A %= 0) / 2);
+ sp4.refine_with_congruence((A %= 1) / 2);
+
+ bool smash_ok2 = sp3.contains(sp4) && sp3.strictly_contains(sp4);
+
+ print_constraints(sp3, "*** sp3 constraints ***");
+ print_congruences(sp3, "*** sp3 congruences ***");
+
+ if (!smash_ok2)
+ return smash_ok2;
+
+ SProduct sp5(1);
+ sp5.refine_with_constraint(A <= 3);
+ sp5.refine_with_constraint(A >= 4);
+ sp5.refine_with_congruence((A %= 1) / 2);
+ sp5.refine_with_congruence((A %= 0) / 2);
+
+ SProduct sp6(1, EMPTY);
+
+ bool smash_ok3 = sp5.contains(sp6) && !sp5.strictly_contains(sp6);
+
+ print_constraints(sp5, "*** sp5 constraints ***");
+ print_congruences(sp5, "*** sp5 congruences ***");
+
+ return smash_ok3;
+}
+
+// intersection_assign()
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ SProduct sp1(3);
+ sp1.refine_with_constraint(A >= 0);
+ sp1.refine_with_congruence((A %= 0) / 2);
+
+ SProduct sp2(3);
+ sp2.refine_with_constraint(A <= 0);
+ sp2.refine_with_congruence((A %= 0) / 1);
+
+ sp1.intersection_assign(sp2);
+
+ SProduct known_sp(3);
+ known_sp.refine_with_constraint(A == 0);
+
+ bool smash_ok1 = !(sp1 == known_sp);
+ if (!smash_ok1) {
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+ return smash_ok1;
+ }
+
+ sp2.refine_with_constraint(A >= 1);
+ sp1.intersection_assign(sp2);
+
+ known_sp.refine_with_constraint(A == 1);
+
+ bool smash_ok2 = (sp1 == known_sp);
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+
+ return smash_ok2;
+}
+
+// upper_bound_assign(sp2)
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ SProduct sp(1);
+ sp.refine_with_constraint(A <= 18);
+ sp.refine_with_constraint(A >= 18);
+
+ SProduct sp1(sp);
+
+ SProduct sp2(1);
+ sp2.refine_with_congruence((A %= 19) / 20);
+ sp2.refine_with_congruence((A %= 18) / 20);
+
+ sp1.upper_bound_assign(sp2);
+
+ bool smash_ok = (sp1 == sp);
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+
+ if (!smash_ok)
+ return false;
+
+ sp2.upper_bound_assign(sp1);
+
+ smash_ok = (sp2 == sp);
+
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+
+ return smash_ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ SProduct sp(3);
+ sp.refine_with_congruence((A %= 0) / 2);
+ sp.refine_with_congruence((B %= 0) / 2);
+
+ SProduct sp1(sp);
+
+ SProduct sp2(3);
+ sp2.refine_with_congruence((A %= 1) / 3);
+ sp2.refine_with_congruence((B %= 1) / 3);
+
+ bool smash_ok = (!sp1.upper_bound_assign_if_exact(sp2)
+ && !sp2.upper_bound_assign_if_exact(sp1));
+
+ if (!smash_ok) {
+ print_congruences(sp1, "*** sp1 congruences ub exact ***");
+ print_constraints(sp1, "*** sp1 constraints ub exact ***");
+ print_congruences(sp2, "*** sp2 congruences ub exact ***");
+ print_constraints(sp2, "*** sp2 constraints ub exact ***");
+ return false;
+ }
+
+ smash_ok = (sp == sp1);
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+
+ if (!smash_ok)
+ return false;
+
+ // The grid component is empty so that the smash product
+ // reduces the polyhedron component to empty.
+ sp1.refine_with_congruence((B %= 1) / 2);
+ sp1.refine_with_congruence((B %= 0) / 2);
+
+ // The polyhedron component is empty so that the smash product
+ // reduces the grid component to empty.
+ sp2.refine_with_constraint(B >= 1);
+ sp2.refine_with_constraint(B <= 0);
+
+ smash_ok = sp1.upper_bound_assign_if_exact(sp2)
+ && sp2.upper_bound_assign_if_exact(sp1);
+
+ if (!smash_ok)
+ return false;
+
+ SProduct known_sp(3, EMPTY);
+
+ smash_ok = (sp1 == known_sp) && (sp2 == known_sp);
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+
+ return smash_ok;
+}
+
+// difference_assign(sp2)
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ SProduct sp(1);
+ sp.refine_with_constraint(A <= 18);
+ sp.refine_with_constraint(A >= 18);
+
+ SProduct sp1(sp);
+
+ SProduct sp2(1);
+ sp2.refine_with_congruence((A %= 19) / 20);
+ sp2.refine_with_congruence((A %= 18) / 20);
+
+ sp1.difference_assign(sp2);
+
+ bool smash_ok = (sp1 == sp);
+
+ print_congruences(sp1, "*** sp1 congruences ***");
+ print_constraints(sp1, "*** sp1 constraints ***");
+
+ if (!smash_ok)
+ return false;
+
+ sp2.difference_assign(sp1);
+
+ SProduct known_sp(1, EMPTY);
+
+ smash_ok = (sp2 == known_sp);
+
+ print_congruences(sp2, "*** sp2 congruences ***");
+ print_constraints(sp2, "*** sp2 constraints ***");
+
+ return smash_ok;
+}
+
+// time_elapse_assign(y)
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ SProduct sp1(3);
+ sp1.refine_with_constraint(A >= 0);
+ sp1.refine_with_constraint(B >= 0);
+ sp1.refine_with_constraint(A + B >= 3);
+ sp1.refine_with_constraint(2*A - B == 0);
+ sp1.refine_with_constraint(3*A + C == 0);
+ sp1.refine_with_congruence(3*A %= 0);
+
+ SProduct sp2(3);
+ sp2.refine_with_constraint(7*C == 4);
+ sp2.refine_with_constraint(7*B == -1);
+ sp2.refine_with_constraint(7*A == 3);
+
+ sp1.time_elapse_assign(sp2);
+
+ SProduct known_sp(3);
+ known_sp.refine_with_constraint(5*A - 13*B - 7*C == 0);
+ known_sp.refine_with_constraint(3*A + C >= 0);
+ known_sp.refine_with_constraint(A + B >= 3);
+ known_sp.refine_with_constraint(4*A - 3*C >= 13);
+ known_sp.refine_with_congruence((65*A - B %= 0) / 7);
+ known_sp.refine_with_congruence(21*A %= 0);
+
+ bool smash_ok = (sp1 == known_sp);
+
+ print_congruences(sp1, "*** sp1.time_elapse_assign(sp2) congruences ***");
+ print_constraints(sp1, "*** sp1.time_elapse_assign(sp2) constraints ***");
+ print_congruences(sp2, "*** sp2.time_elapse_assign(sp2) congruences ***");
+ print_constraints(sp2, "*** sp2.time_elapse_assign(sp2) constraints ***");
+
+ return smash_ok;
+}
+
+// topological_closure_assign
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ SProduct sp(3);
+ sp.refine_with_constraint(B >= 0);
+ sp.refine_with_constraint(3*A + C == 0);
+ sp.refine_with_constraint(2*A - B == 0);
+ sp.refine_with_congruence(3*A %= 0);
+#ifdef PH_IS_NNC
+ sp.refine_with_constraint(A > 0);
+#else
+ sp.refine_with_constraint(A >= 0);
+#endif
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ sp.topological_closure_assign();
+
+ SProduct known_sp(3);
+ known_sp.refine_with_constraint(B >= 0);
+ known_sp.refine_with_constraint(3*A + C == 0);
+ known_sp.refine_with_constraint(2*A - B == 0);
+ known_sp.refine_with_congruence(3*A %= 0);
+ known_sp.refine_with_constraint(A >= 0);
+
+ bool smash_ok = (sp == known_sp);
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ return smash_ok;
+}
+
+// widening_assign
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ SProduct sp_prev(3);
+ sp_prev.refine_with_constraint(C == 0);
+ sp_prev.refine_with_constraint(A - B >= 1);
+ sp_prev.refine_with_constraint(A <= 2);
+ sp_prev.refine_with_constraint(B >= 0);
+ sp_prev.refine_with_congruence((B %= 0) / 2);
+ sp_prev.refine_with_congruence(3*A %= 0);
+
+ print_congruences(sp_prev, "*** sp_prev congruences ***");
+ print_constraints(sp_prev, "*** sp_prev constraints ***");
+
+ SProduct sp(3);
+ sp.refine_with_constraint(C == 0);
+ sp.refine_with_constraint(A <= 2);
+ sp.refine_with_constraint(B >= 0);
+ sp.refine_with_constraint(2*A - B >= 2);
+ sp.refine_with_constraint(B >= 0);
+ sp.refine_with_congruence(6*A %= 0);
+ sp.refine_with_congruence((B %= 0) / 2);
+
+ sp.upper_bound_assign(sp_prev);
+
+ print_congruences(sp, "*** sp congruences ***");
+ print_constraints(sp, "*** sp constraints ***");
+
+ sp.widening_assign(sp_prev);
+
+ SProduct known_sp(3);
+ known_sp.refine_with_constraint(C == 0);
+ known_sp.refine_with_constraint(A <= 2);
+ known_sp.refine_with_constraint(B >= 0);
+ known_sp.refine_with_congruence((B %= 0) / 2);
+
+ bool smash_ok = (sp == known_sp);
+
+ print_congruences(sp, "*** sp.widening_assign(sp_prev) congruences ***");
+ print_constraints(sp, "*** sp.widening_assign(sp_prev) constraints ***");
+
+ return smash_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST_F8(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/spacedims1.cc b/tests/Partially_Reduced_Product/spacedims1.cc
new file mode 100644
index 0000000..439cebd
--- /dev/null
+++ b/tests/Partially_Reduced_Product/spacedims1.cc
@@ -0,0 +1,287 @@
+/* Test
+ Product<NNC_Polyhedron, Grid>::add_space_dimensions_and_embed() and
+ Product<NNC_Polyhedron, Grid>::add_space_dimensions_and_project() and
+ Product<NNC_Polyhedron, Grid>::remove_space_dimensions() and
+ Product<NNC_Polyhedron, Grid>::remove_higher_space_dimensions() and
+ Product<NNC_Polyhedron, Grid>::fold_space_dimensions() and
+ Product<NNC_Polyhedron, Grid>::expand_space_dimension() and
+ Product<NNC_Polyhedron, Grid>::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// add_space_dimensions_and_embed()
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(2);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+
+ prp1.add_space_dimensions_and_embed(3);
+
+ Product known_prp(5);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+ known_prp.refine_with_constraint(A >= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok;
+}
+
+// add_space_dimensions_and_project()
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp1(2);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_congruence((A %= 0) / 2);
+
+ prp1.add_space_dimensions_and_project(1);
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(C == 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ return ok;
+}
+
+// remove_space_dimensions()
+bool
+test03() {
+ Variable A(0);
+ Variable C(2);
+ Variable D(3);
+
+ Product prp(4);
+ prp.refine_with_constraint(A >= 0);
+ prp.refine_with_congruence((A %= 0) / 2);
+ prp.refine_with_congruence((A - C %= 0) / 2);
+
+ Variables_Set vars;
+ vars.insert(C);
+ vars.insert(D);
+
+ prp.remove_space_dimensions(vars);
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp ***");
+
+ return ok;
+}
+
+// remove_higher_space_dimensions()
+bool
+test04() {
+ Variable A(0);
+ Variable C(2);
+ Variable D(3);
+
+ Product prp(4);
+ prp.refine_with_constraint(A >= 0);
+ prp.refine_with_congruence((A %= 0) / 2);
+ prp.refine_with_congruence((A - C %= 0) / 2);
+
+ prp.remove_higher_space_dimensions(2);
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_congruence((A %= 0) / 2);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// map_space_dimensions()
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(2);
+ prp.refine_with_constraint(A >= 0);
+ prp.refine_with_congruence((A - B %= 0) / 2);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ prp.map_space_dimensions(function);
+
+ Product known_prp(2);
+ known_prp.refine_with_constraint(B >= 0);
+ known_prp.refine_with_congruence((B - A %= 0) / 2);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// expand_space_dimension()
+bool
+ test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Product prp(3);
+ prp.refine_with_congruence((A + B %= 2) / 7);
+ prp.refine_with_constraint(A >= 0);
+
+ prp.expand_space_dimension(A, 1);
+
+ Product known_prp(4);
+ known_prp.refine_with_congruence((A + B %= 2) / 7);
+ known_prp.refine_with_congruence((D + B %= 2) / 7);
+ known_prp.refine_with_constraint(A >= 0);
+ known_prp.refine_with_constraint(D >= 0);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// fold_space_dimensions()
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_congruence((A %= 2) / 7);
+ prp.refine_with_congruence((B %= 2) / 14);
+ prp.refine_with_congruence((C %= 2) / 21);
+ prp.refine_with_constraint(A <= 5);
+ prp.refine_with_constraint(B <= 10);
+ prp.refine_with_constraint(C <= 0);
+ prp.refine_with_constraint(C >= 0);
+
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(C);
+
+ prp.fold_space_dimensions(to_fold, B);
+
+ Product known_prp(1);
+ known_prp.refine_with_congruence((A %= 2) / 7);
+ known_prp.refine_with_constraint(A <= 10);
+
+ bool ok = (prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// max_space_dimension().
+bool
+test08() {
+ dimension_type msd1 = NNC_Polyhedron::max_space_dimension();
+ nout << "NNCPolyhedron max space dimension = "
+ << msd1 << endl;
+ dimension_type msd2 = Grid::max_space_dimension();
+ nout << "Grid max space dimension = "
+ << msd2 << endl;
+ dimension_type msd = Product::max_space_dimension();
+ bool ok = (msd <= msd1 && msd <= msd2);
+
+ nout << "Product max space dimension = "
+ << msd << endl << endl;
+
+ return ok;
+}
+
+// Attempt to construct a product with too many dimensions.
+bool
+test09() {
+ try {
+ // This is an invalid use of the constructor of a product:
+ // it is illegal to (try to) build a product with a dimension
+ // greater than max_space_dimension().
+ Product pg(Product::max_space_dimension() + 2);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/timeelapse1.cc b/tests/Partially_Reduced_Product/timeelapse1.cc
new file mode 100644
index 0000000..5eec79e
--- /dev/null
+++ b/tests/Partially_Reduced_Product/timeelapse1.cc
@@ -0,0 +1,116 @@
+/* Test Product<NNC_Polyhedron, Grid>::time_elapse_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// time_elapse_assign(y)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(A >= 0);
+ prp1.refine_with_constraint(B >= 0);
+ prp1.refine_with_constraint(A + B >= 3);
+ prp1.refine_with_constraint(2*A - B == 0);
+ prp1.refine_with_constraint(3*A + C == 0);
+ prp1.refine_with_congruence(3*A %= 0);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(7*C == 4);
+ prp2.refine_with_constraint(7*B == -1);
+ prp2.refine_with_constraint(7*A == 3);
+
+ prp1.time_elapse_assign(prp2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(5*A - 13*B - 7*C == 0);
+ known_prp.refine_with_constraint(3*A + C >= 0);
+ known_prp.refine_with_constraint(A + B >= 3);
+ known_prp.refine_with_constraint(4*A - 3*C >= 13);
+ known_prp.refine_with_congruence((65*A - B %= 0) / 7);
+ known_prp.refine_with_congruence(21*A %= 0);
+ known_prp.refine_with_constraint(A >= 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+ print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+ print_congruences(prp2, "*** prp2.time_elapse_assign(prp2) congruences ***");
+ print_constraints(prp2, "*** prp2.time_elapse_assign(prp2) constraints ***");
+
+ return ok;
+}
+
+// time_elapse_assign(y) where the initial products are not reduced
+// and the second product has non-intersecting single point components.
+bool
+test02() {
+ Variable A(0);
+
+
+ Product prp1(1);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+
+ Grid gr(1);
+ gr.refine_with_congruence((A %= 0)/ 2);
+
+ Product prp2(gr);
+
+ prp2.refine_with_constraint(A >= 1);
+ prp2.refine_with_constraint(A <= 1);
+
+ prp1.time_elapse_assign(prp2);
+
+ Product known_prp(1, EMPTY);
+
+ bool cons_ok = prp1.OK() && (prp1 == known_prp);
+
+ print_congruences(prp1,
+ "*** prp1.time_elapse_assign(prp2) congruences ***");
+ print_constraints(prp1,
+ "*** prp1.time_elapse_assign(prp2) constraints ***");
+
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/topclosed1.cc b/tests/Partially_Reduced_Product/topclosed1.cc
new file mode 100644
index 0000000..1edcd74
--- /dev/null
+++ b/tests/Partially_Reduced_Product/topclosed1.cc
@@ -0,0 +1,95 @@
+/* Test Product<>::is_topologically_closed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_topologically_closed() where the NNC Polyhedron is topologically
+// open.
+bool
+test01() {
+ Variable A(0);
+
+ Product prp(3);
+ prp.refine_with_constraint(A < 3);
+ prp.refine_with_congruence((A %= 0) / 3);
+
+ bool ok = !prp.is_topologically_closed();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// closed.
+bool
+test02() {
+ Variable A(0);
+
+ Product prp(3);
+ prp.refine_with_constraint(A <= 3);
+ prp.refine_with_congruence((A %= 0) / 3);
+
+ bool ok = prp.is_topologically_closed();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// open and the intersection is closed.
+bool
+test03() {
+ Variable A(0);
+
+ Product prp(3);
+ prp.refine_with_congruence((A %= 0) / 4);
+ prp.refine_with_constraint(A < 3);
+
+ bool ok = !prp.is_topologically_closed();
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/topclosure1.cc b/tests/Partially_Reduced_Product/topclosure1.cc
new file mode 100644
index 0000000..f9a0a5e
--- /dev/null
+++ b/tests/Partially_Reduced_Product/topclosure1.cc
@@ -0,0 +1,68 @@
+/* Test Product<NNC_Polyhedron, Grid>::topological_closure_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// topological_closure_assign
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Product prp(3);
+ prp.refine_with_constraint(B >= 0);
+ prp.refine_with_constraint(4*A + C == 0);
+ prp.refine_with_constraint(2*A - B == 0);
+ prp.refine_with_congruence(4*A %= 0);
+ prp.refine_with_constraint(A > 0);
+
+ prp.topological_closure_assign();
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(B >= 0);
+ known_prp.refine_with_constraint(4*A + C == 0);
+ known_prp.refine_with_constraint(2*A - B == 0);
+ known_prp.refine_with_congruence(4*A %= 0);
+ known_prp.refine_with_constraint(A >= 0);
+
+ bool ok = (prp.is_topologically_closed() && prp == known_prp);
+
+ print_congruences(prp, "*** prp congruences ***");
+ print_constraints(prp, "*** prp constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/upperbound1.cc b/tests/Partially_Reduced_Product/upperbound1.cc
new file mode 100644
index 0000000..3b14537
--- /dev/null
+++ b/tests/Partially_Reduced_Product/upperbound1.cc
@@ -0,0 +1,191 @@
+/* Test Product<NNC_Polyhedron, Grid>::upper_bound_assign()
+ Product<NNC_Polyhedron, Grid>::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// upper_bound_assign(prp2)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs(A == 9);
+
+ Product prp1(cs);
+
+ Product prp2(1);
+ prp2.refine_with_constraint(A == 19);
+
+ prp1.upper_bound_assign(prp2);
+
+ Product known_prp(1);
+ known_prp.refine_with_constraint(A >= 9);
+ known_prp.refine_with_constraint(A <= 19);
+ known_prp.refine_with_congruence((A %= 9) / 10);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// upper_bound_assign(cp2)
+// The first product is empty and the second a single point in 1D
+bool
+test02() {
+ Variable A(0);
+
+ Product prp1(1);
+ Constraint_System cs1;
+ cs1.insert(A >= 1);
+ cs1.insert(A <= 0);
+ prp1.refine_with_constraints(cs1);
+
+ Product prp2(1);
+ Constraint_System cs2;
+ cs2.insert(A == 1);
+ prp2.refine_with_constraints(cs2);
+
+ Product prp1_copy(prp1);
+
+ prp1.upper_bound_assign(prp2);
+
+
+ bool ok = (prp1 == prp2 && prp1.OK());
+
+ print_congruences(prp1, "*** after OK() check: prp1 congruences ***");
+ print_constraints(prp1, "*** after OK() check: prp1 constraints ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp1(3);
+ prp1.refine_with_constraint(B == 0);
+
+ Product prp2(3);
+ prp2.refine_with_constraint(B == 0);
+ prp2.refine_with_constraint(A == 8);
+
+ prp1.upper_bound_assign_if_exact(prp2);
+
+ Product known_prp(3);
+ known_prp.refine_with_constraint(B == 0);
+
+ bool ok = (prp1 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Product prp(3);
+ prp.refine_with_congruence((A %= 0) / 2);
+ prp.refine_with_congruence((B %= 0) / 2);
+
+ Product prp1(prp);
+
+ Product prp2(3);
+ prp2.refine_with_congruence((A %= 1) / 3);
+ prp2.refine_with_congruence((B %= 1) / 3);
+
+ bool cons_ok = (!prp1.upper_bound_assign_if_exact(prp2)
+ && !prp2.upper_bound_assign_if_exact(prp1));
+
+ if (!cons_ok) {
+ print_congruences(prp1, "*** prp1 congruences ub exact ***");
+ print_constraints(prp1, "*** prp1 constraints ub exact ***");
+ print_congruences(prp2, "*** prp2 congruences ub exact ***");
+ print_constraints(prp2, "*** prp2 constraints ub exact ***");
+ return false;
+ }
+
+ cons_ok = (prp == prp1);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ if (!cons_ok)
+ return false;
+
+ prp1.refine_with_congruence((B %= 1) / 2);
+
+ prp2.refine_with_constraint(B >= 1);
+ prp2.refine_with_constraint(B <= 1);
+
+ cons_ok = prp1.upper_bound_assign_if_exact(prp2)
+ && prp2.upper_bound_assign_if_exact(prp1);
+
+ if (!cons_ok)
+ return false;
+
+ Product known_prp(3);
+ known_prp.refine_with_congruence((B %= 1) / 0);
+ known_prp.refine_with_congruence((A %= 1) / 3);
+
+ cons_ok = (prp1 == known_prp) && (prp2 == known_prp);
+
+ print_congruences(prp1, "*** prp1 congruences ***");
+ print_constraints(prp1, "*** prp1 constraints ***");
+ print_congruences(prp2, "*** prp2 congruences ***");
+ print_constraints(prp2, "*** prp2 constraints ***");
+
+ return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/Makefile.am b/tests/Polyhedron/Makefile.am
new file mode 100644
index 0000000..b328c53
--- /dev/null
+++ b/tests/Polyhedron/Makefile.am
@@ -0,0 +1,724 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 bgp99extrapolation2 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dropsomenonintegerpoints1 dropsomenonintegerpoints2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2 exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frequency1 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+hybrid \
+intersection1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearexpression1 \
+linearpartition1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+nncpostimeelapse1 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+polyhullifexact1 polyhullifexact2 \
+randphull1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+smm1 \
+sparserow1 \
+termination1 termination2 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+watchdog1 \
+weightwatch1 \
+wrap1 wrap2 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
+
+DERIVED_TESTS = \
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_dropsomenonintegerpoints1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_polyhullifexact1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_wrap1 nnc_wrap2 \
+nnc_writepolyhedron1
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+affinetrans_SOURCES = affinetrans.cc
+
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bgp99extrapolation2_SOURCES = bgp99extrapolation2.cc
+
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cnncconversion1_SOURCES = cnncconversion1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+dropsomenonintegerpoints2_SOURCES = dropsomenonintegerpoints2.cc
+
+dualhypercubes_SOURCES = dualhypercubes.cc
+
+empty1_SOURCES = empty1.cc
+
+equals1_SOURCES = equals1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+generators1_SOURCES = generators1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+
+hybrid_SOURCES = hybrid.cc
+
+intersection1_SOURCES = intersection1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+linearpartition1_SOURCES = linearpartition1.cc
+
+linearexpression1_SOURCES = linearexpression1.cc
+
+linearsystem1_SOURCES = linearsystem1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+matrix1_SOURCES = matrix1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+mc91_SOURCES = mc91.cc
+
+membytes1_SOURCES = membytes1.cc
+
+memory2_SOURCES = memory2.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+
+numberinput1_SOURCES = numberinput1.cc
+
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+
+nncpostimeelapse1_SOURCES = nncpostimeelapse1.cc
+
+onepoint_SOURCES = onepoint.cc
+
+permute_SOURCES = permute.cc
+
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+
+polyhullifexact1_SOURCES = polyhullifexact1.cc
+polyhullifexact2_SOURCES = polyhullifexact2.cc
+
+randphull1_SOURCES = randphull1.cc
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+smm1_SOURCES = smm1.cc
+
+sparserow1_SOURCES = sparserow1.cc
+
+termination1_SOURCES = termination1.cc
+termination2_SOURCES = termination2.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+
+variablesset1_SOURCES = variablesset1.cc
+
+watchdog1_SOURCES = watchdog1.cc
+
+weightwatch1_SOURCES = weightwatch1.cc
+
+wrap1_SOURCES = wrap1.cc
+wrap2_SOURCES = wrap2.cc
+
+writeconsys1_SOURCES = writeconsys1.cc
+
+writegensys1_SOURCES = writegensys1.cc
+
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+
+writerelation1_SOURCES = writerelation1.cc
+
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+nnc_dropsomenonintegerpoints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polyhullifexact1_SOURCES = polyhullifexact1.cc
+nnc_polyhullifexact1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_wrap1_SOURCES = wrap1.cc
+nnc_wrap1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap2_SOURCES = wrap2.cc
+nnc_wrap2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+#
+# Sources for the special tests.
+#
+
+memory1_SRCS = memory1.cc
+
+
+if !VALGRIND_TESTS_ENABLED
+# The `memory1' test is currently disabled. The reason is that there
+# is currently no reliable way to make it work, at least on Linux.
+# The reason is that memory is limited using RLIMIT_AS, which limits
+# brk, mmap and the stack: when we run out of stack, then of course
+# we crash. So RLIMIT_AS cannot be used. In principle, we could use
+# RLIMIT_DATA, which limits brk only. However, glibc uses mmap when
+# it cannot obtain memory from brk (and perhaps in other cases as well),
+# but mmap is not limited by RLIMIT_DATA. In summary, RLIMIT_AS limits
+# too much (in particular the stack, that should not be limited);
+# RLIMIT_DATA limits too little (it does not limit mmap, as we would like
+# it to).
+
+#VALGRIND_BRITTLE_TESTS = memory1
+
+#memory1_SOURCES = $(memory1_SRCS)
+
+endif !VALGRIND_TESTS_ENABLED
+
+
+TESTS = \
+$(ORIGINAL_TESTS) \
+$(DERIVED_TESTS) \
+$(VALGRIND_BRITTLE_TESTS)
+
+XFAIL_TESTS =
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+EXTRA_DIST = $(memory1_SRCS)
+
+BUGS =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+densematrix1.dat \
+linearsystem1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writevariable1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in
new file mode 100644
index 0000000..c9dcb21
--- /dev/null
+++ b/tests/Polyhedron/Makefile.in
@@ -0,0 +1,6944 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4)
+subdir = tests/Polyhedron
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+ addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+ addconstraints2$(EXEEXT) addgenerator1$(EXEEXT) \
+ addgenerator2$(EXEEXT) addgenerators1$(EXEEXT) \
+ addgenerators2$(EXEEXT) addspacedims1$(EXEEXT) \
+ addspacedims2$(EXEEXT) affineimage1$(EXEEXT) \
+ affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+ affinetrans$(EXEEXT) append1$(EXEEXT) append2$(EXEEXT) \
+ ascii_dump_load1$(EXEEXT) ascii_dump_load2$(EXEEXT) \
+ ascii_dump_load3$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+ bgp99extrapolation2$(EXEEXT) bhrz03widening1$(EXEEXT) \
+ bhrz03widening2$(EXEEXT) bhrz03widening3$(EXEEXT) \
+ bhz03widening1$(EXEEXT) bounded1$(EXEEXT) \
+ boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+ boundedbhrz03extrapolation1$(EXEEXT) \
+ boundedh79extrapolation1$(EXEEXT) bounds1$(EXEEXT) \
+ cnncconversion1$(EXEEXT) concatenate1$(EXEEXT) \
+ congruences1$(EXEEXT) constrains1$(EXEEXT) \
+ constraints1$(EXEEXT) contains1$(EXEEXT) contains2$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) disjoint1$(EXEEXT) \
+ disjoint2$(EXEEXT) dropsomenonintegerpoints1$(EXEEXT) \
+ dropsomenonintegerpoints2$(EXEEXT) dualhypercubes$(EXEEXT) \
+ empty1$(EXEEXT) equals1$(EXEEXT) exceptions1$(EXEEXT) \
+ exceptions2$(EXEEXT) exceptions3$(EXEEXT) \
+ expandspacedim1$(EXEEXT) expandspacedim2$(EXEEXT) \
+ foldspacedims1$(EXEEXT) foldspacedims2$(EXEEXT) \
+ frequency1$(EXEEXT) frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+ frombox2$(EXEEXT) fromgrid1$(EXEEXT) \
+ fromoctagonalshape1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) generators1$(EXEEXT) \
+ geomcovers1$(EXEEXT) h79widening1$(EXEEXT) \
+ h79widening2$(EXEEXT) hybrid$(EXEEXT) intersection1$(EXEEXT) \
+ limitedbhrz03extrapolation1$(EXEEXT) \
+ limitedh79extrapolation1$(EXEEXT) linearexpression1$(EXEEXT) \
+ linearpartition1$(EXEEXT) linearsystem1$(EXEEXT) \
+ mapspacedims1$(EXEEXT) matrix1$(EXEEXT) max_min1$(EXEEXT) \
+ maxspacedim1$(EXEEXT) mc91$(EXEEXT) membytes1$(EXEEXT) \
+ memory2$(EXEEXT) minconstraints1$(EXEEXT) \
+ minconstraints2$(EXEEXT) mingenerators1$(EXEEXT) \
+ mingenerators2$(EXEEXT) nncminimize1$(EXEEXT) \
+ nncminimize2$(EXEEXT) nncpostimeelapse1$(EXEEXT) \
+ numberinput1$(EXEEXT) onepoint$(EXEEXT) permute$(EXEEXT) \
+ polydifference1$(EXEEXT) polydifference2$(EXEEXT) \
+ polyhull1$(EXEEXT) polyhull2$(EXEEXT) \
+ polyhullifexact1$(EXEEXT) polyhullifexact2$(EXEEXT) \
+ randphull1$(EXEEXT) refinewithcongruence1$(EXEEXT) \
+ refinewithcongruences1$(EXEEXT) refinewithconstraint1$(EXEEXT) \
+ refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+ relations2$(EXEEXT) relations3$(EXEEXT) \
+ removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) smm1$(EXEEXT) \
+ sparserow1$(EXEEXT) termination1$(EXEEXT) \
+ termination2$(EXEEXT) timeelapse1$(EXEEXT) \
+ timeelapse2$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+ unconstrain1$(EXEEXT) universe1$(EXEEXT) universe2$(EXEEXT) \
+ variablesset1$(EXEEXT) watchdog1$(EXEEXT) \
+ weightwatch1$(EXEEXT) wrap1$(EXEEXT) wrap2$(EXEEXT) \
+ writeconsys1$(EXEEXT) writegensys1$(EXEEXT) \
+ writepolyhedron1$(EXEEXT) writepolyhedron2$(EXEEXT) \
+ writerelation1$(EXEEXT) writevariable1$(EXEEXT)
+am__EXEEXT_2 = nnc_addcongruence1$(EXEEXT) \
+ nnc_addcongruences1$(EXEEXT) nnc_addconstraint1$(EXEEXT) \
+ nnc_addconstraints1$(EXEEXT) nnc_addgenerator1$(EXEEXT) \
+ nnc_addgenerators1$(EXEEXT) nnc_addspacedims1$(EXEEXT) \
+ nnc_affineimage1$(EXEEXT) nnc_affinepreimage1$(EXEEXT) \
+ nnc_affinetrans$(EXEEXT) nnc_append1$(EXEEXT) \
+ nnc_append2$(EXEEXT) nnc_ascii_dump_load1$(EXEEXT) \
+ nnc_ascii_dump_load2$(EXEEXT) nnc_bgp99extrapolation1$(EXEEXT) \
+ nnc_bhrz03widening1$(EXEEXT) nnc_bhrz03widening2$(EXEEXT) \
+ nnc_bounded1$(EXEEXT) nnc_boundedaffineimage1$(EXEEXT) \
+ nnc_boundedaffinepreimage1$(EXEEXT) \
+ nnc_boundedbhrz03extrapolation1$(EXEEXT) \
+ nnc_boundedh79extrapolation1$(EXEEXT) nnc_bounds1$(EXEEXT) \
+ nnc_concatenate1$(EXEEXT) nnc_congruences1$(EXEEXT) \
+ nnc_constrains1$(EXEEXT) nnc_constraints1$(EXEEXT) \
+ nnc_contains1$(EXEEXT) nnc_containsintegerpoint1$(EXEEXT) \
+ nnc_disjoint1$(EXEEXT) nnc_dropsomenonintegerpoints1$(EXEEXT) \
+ nnc_empty1$(EXEEXT) nnc_equals1$(EXEEXT) \
+ nnc_exceptions1$(EXEEXT) nnc_exceptions3$(EXEEXT) \
+ nnc_expandspacedim1$(EXEEXT) nnc_foldspacedims1$(EXEEXT) \
+ nnc_frombdshape1$(EXEEXT) nnc_frombox1$(EXEEXT) \
+ nnc_fromgrid1$(EXEEXT) nnc_fromoctagonalshape1$(EXEEXT) \
+ nnc_generalizedaffineimage1$(EXEEXT) \
+ nnc_generalizedaffinepreimage1$(EXEEXT) \
+ nnc_generators1$(EXEEXT) nnc_geomcovers1$(EXEEXT) \
+ nnc_h79widening1$(EXEEXT) nnc_intersection1$(EXEEXT) \
+ nnc_simplifyusingcontext1$(EXEEXT) \
+ nnc_limitedbhrz03extrapolation1$(EXEEXT) \
+ nnc_limitedh79extrapolation1$(EXEEXT) \
+ nnc_linearpartition1$(EXEEXT) nnc_mapspacedims1$(EXEEXT) \
+ nnc_max_min1$(EXEEXT) nnc_mc91$(EXEEXT) nnc_membytes1$(EXEEXT) \
+ nnc_minconstraints1$(EXEEXT) nnc_mingenerators1$(EXEEXT) \
+ nnc_onepoint$(EXEEXT) nnc_permute$(EXEEXT) \
+ nnc_polydifference1$(EXEEXT) nnc_polyhull1$(EXEEXT) \
+ nnc_polyhullifexact1$(EXEEXT) nnc_randphull1$(EXEEXT) \
+ nnc_relations1$(EXEEXT) nnc_relations2$(EXEEXT) \
+ nnc_removespacedims1$(EXEEXT) nnc_smm1$(EXEEXT) \
+ nnc_timeelapse1$(EXEEXT) nnc_unconstrain1$(EXEEXT) \
+ nnc_universe1$(EXEEXT) nnc_wrap1$(EXEEXT) nnc_wrap2$(EXEEXT) \
+ nnc_writepolyhedron1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am__EXEEXT_4 =
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addconstraints2_OBJECTS = addconstraints2.$(OBJEXT)
+addconstraints2_OBJECTS = $(am_addconstraints2_OBJECTS)
+addconstraints2_LDADD = $(LDADD)
+addconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerator2_OBJECTS = addgenerator2.$(OBJEXT)
+addgenerator2_OBJECTS = $(am_addgenerator2_OBJECTS)
+addgenerator2_LDADD = $(LDADD)
+addgenerator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addgenerators2_OBJECTS = addgenerators2.$(OBJEXT)
+addgenerators2_OBJECTS = $(am_addgenerators2_OBJECTS)
+addgenerators2_LDADD = $(LDADD)
+addgenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_addspacedims2_OBJECTS = addspacedims2.$(OBJEXT)
+addspacedims2_OBJECTS = $(am_addspacedims2_OBJECTS)
+addspacedims2_LDADD = $(LDADD)
+addspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinetrans_OBJECTS = affinetrans.$(OBJEXT)
+affinetrans_OBJECTS = $(am_affinetrans_OBJECTS)
+affinetrans_LDADD = $(LDADD)
+affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_append1_OBJECTS = append1.$(OBJEXT)
+append1_OBJECTS = $(am_append1_OBJECTS)
+append1_LDADD = $(LDADD)
+append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_append2_OBJECTS = append2.$(OBJEXT)
+append2_OBJECTS = $(am_append2_OBJECTS)
+append2_LDADD = $(LDADD)
+append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load2_OBJECTS = ascii_dump_load2.$(OBJEXT)
+ascii_dump_load2_OBJECTS = $(am_ascii_dump_load2_OBJECTS)
+ascii_dump_load2_LDADD = $(LDADD)
+ascii_dump_load2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_ascii_dump_load3_OBJECTS = ascii_dump_load3.$(OBJEXT)
+ascii_dump_load3_OBJECTS = $(am_ascii_dump_load3_OBJECTS)
+ascii_dump_load3_LDADD = $(LDADD)
+ascii_dump_load3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bgp99extrapolation2_OBJECTS = bgp99extrapolation2.$(OBJEXT)
+bgp99extrapolation2_OBJECTS = $(am_bgp99extrapolation2_OBJECTS)
+bgp99extrapolation2_LDADD = $(LDADD)
+bgp99extrapolation2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhrz03widening1_OBJECTS = bhrz03widening1.$(OBJEXT)
+bhrz03widening1_OBJECTS = $(am_bhrz03widening1_OBJECTS)
+bhrz03widening1_LDADD = $(LDADD)
+bhrz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhrz03widening2_OBJECTS = bhrz03widening2.$(OBJEXT)
+bhrz03widening2_OBJECTS = $(am_bhrz03widening2_OBJECTS)
+bhrz03widening2_LDADD = $(LDADD)
+bhrz03widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhrz03widening3_OBJECTS = bhrz03widening3.$(OBJEXT)
+bhrz03widening3_OBJECTS = $(am_bhrz03widening3_OBJECTS)
+bhrz03widening3_LDADD = $(LDADD)
+bhrz03widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedbhrz03extrapolation1_OBJECTS = \
+ boundedbhrz03extrapolation1.$(OBJEXT)
+boundedbhrz03extrapolation1_OBJECTS = \
+ $(am_boundedbhrz03extrapolation1_OBJECTS)
+boundedbhrz03extrapolation1_LDADD = $(LDADD)
+boundedbhrz03extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundedh79extrapolation1_OBJECTS = \
+ boundedh79extrapolation1.$(OBJEXT)
+boundedh79extrapolation1_OBJECTS = \
+ $(am_boundedh79extrapolation1_OBJECTS)
+boundedh79extrapolation1_LDADD = $(LDADD)
+boundedh79extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_cnncconversion1_OBJECTS = cnncconversion1.$(OBJEXT)
+cnncconversion1_OBJECTS = $(am_cnncconversion1_OBJECTS)
+cnncconversion1_LDADD = $(LDADD)
+cnncconversion1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains2_OBJECTS = contains2.$(OBJEXT)
+contains2_OBJECTS = $(am_contains2_OBJECTS)
+contains2_LDADD = $(LDADD)
+contains2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint2_OBJECTS = disjoint2.$(OBJEXT)
+disjoint2_OBJECTS = $(am_disjoint2_OBJECTS)
+disjoint2_LDADD = $(LDADD)
+disjoint2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS = \
+ dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS = \
+ $(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints2_OBJECTS = \
+ dropsomenonintegerpoints2.$(OBJEXT)
+dropsomenonintegerpoints2_OBJECTS = \
+ $(am_dropsomenonintegerpoints2_OBJECTS)
+dropsomenonintegerpoints2_LDADD = $(LDADD)
+dropsomenonintegerpoints2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_dualhypercubes_OBJECTS = dualhypercubes.$(OBJEXT)
+dualhypercubes_OBJECTS = $(am_dualhypercubes_OBJECTS)
+dualhypercubes_LDADD = $(LDADD)
+dualhypercubes_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_exceptions2_OBJECTS = exceptions2.$(OBJEXT)
+exceptions2_OBJECTS = $(am_exceptions2_OBJECTS)
+exceptions2_LDADD = $(LDADD)
+exceptions2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_exceptions3_OBJECTS = exceptions3.$(OBJEXT)
+exceptions3_OBJECTS = $(am_exceptions3_OBJECTS)
+exceptions3_LDADD = $(LDADD)
+exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_expandspacedim2_OBJECTS = expandspacedim2.$(OBJEXT)
+expandspacedim2_OBJECTS = $(am_expandspacedim2_OBJECTS)
+expandspacedim2_LDADD = $(LDADD)
+expandspacedim2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_foldspacedims2_OBJECTS = foldspacedims2.$(OBJEXT)
+foldspacedims2_OBJECTS = $(am_foldspacedims2_OBJECTS)
+foldspacedims2_LDADD = $(LDADD)
+foldspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox2_OBJECTS = frombox2.$(OBJEXT)
+frombox2_OBJECTS = $(am_frombox2_OBJECTS)
+frombox2_LDADD = $(LDADD)
+frombox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS = \
+ generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS = \
+ $(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS = \
+ generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS = \
+ $(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS = \
+ generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS = \
+ $(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS = \
+ generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS = \
+ $(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_h79widening2_OBJECTS = h79widening2.$(OBJEXT)
+h79widening2_OBJECTS = $(am_h79widening2_OBJECTS)
+h79widening2_LDADD = $(LDADD)
+h79widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_hybrid_OBJECTS = hybrid.$(OBJEXT)
+hybrid_OBJECTS = $(am_hybrid_OBJECTS)
+hybrid_LDADD = $(LDADD)
+hybrid_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedbhrz03extrapolation1_OBJECTS = \
+ limitedbhrz03extrapolation1.$(OBJEXT)
+limitedbhrz03extrapolation1_OBJECTS = \
+ $(am_limitedbhrz03extrapolation1_OBJECTS)
+limitedbhrz03extrapolation1_LDADD = $(LDADD)
+limitedbhrz03extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS = \
+ limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS = \
+ $(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_linearexpression1_OBJECTS = linearexpression1.$(OBJEXT)
+linearexpression1_OBJECTS = $(am_linearexpression1_OBJECTS)
+linearexpression1_LDADD = $(LDADD)
+linearexpression1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_linearpartition1_OBJECTS = linearpartition1.$(OBJEXT)
+linearpartition1_OBJECTS = $(am_linearpartition1_OBJECTS)
+linearpartition1_LDADD = $(LDADD)
+linearpartition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_linearsystem1_OBJECTS = linearsystem1.$(OBJEXT)
+linearsystem1_OBJECTS = $(am_linearsystem1_OBJECTS)
+linearsystem1_LDADD = $(LDADD)
+linearsystem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_matrix1_OBJECTS = matrix1.$(OBJEXT)
+matrix1_OBJECTS = $(am_matrix1_OBJECTS)
+matrix1_LDADD = $(LDADD)
+matrix1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mc91_OBJECTS = mc91.$(OBJEXT)
+mc91_OBJECTS = $(am_mc91_OBJECTS)
+mc91_LDADD = $(LDADD)
+mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_memory2_OBJECTS = memory2.$(OBJEXT)
+memory2_OBJECTS = $(am_memory2_OBJECTS)
+memory2_LDADD = $(LDADD)
+memory2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_minconstraints2_OBJECTS = minconstraints2.$(OBJEXT)
+minconstraints2_OBJECTS = $(am_minconstraints2_OBJECTS)
+minconstraints2_LDADD = $(LDADD)
+minconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_mingenerators2_OBJECTS = mingenerators2.$(OBJEXT)
+mingenerators2_OBJECTS = $(am_mingenerators2_OBJECTS)
+mingenerators2_LDADD = $(LDADD)
+mingenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nnc_addcongruence1_OBJECTS = \
+ nnc_addcongruence1-addcongruence1.$(OBJEXT)
+nnc_addcongruence1_OBJECTS = $(am_nnc_addcongruence1_OBJECTS)
+nnc_addcongruence1_LDADD = $(LDADD)
+nnc_addcongruence1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addcongruence1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addcongruences1_OBJECTS = \
+ nnc_addcongruences1-addcongruences1.$(OBJEXT)
+nnc_addcongruences1_OBJECTS = $(am_nnc_addcongruences1_OBJECTS)
+nnc_addcongruences1_LDADD = $(LDADD)
+nnc_addcongruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addcongruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addconstraint1_OBJECTS = \
+ nnc_addconstraint1-addconstraint1.$(OBJEXT)
+nnc_addconstraint1_OBJECTS = $(am_nnc_addconstraint1_OBJECTS)
+nnc_addconstraint1_LDADD = $(LDADD)
+nnc_addconstraint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addconstraint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addconstraints1_OBJECTS = \
+ nnc_addconstraints1-addconstraints1.$(OBJEXT)
+nnc_addconstraints1_OBJECTS = $(am_nnc_addconstraints1_OBJECTS)
+nnc_addconstraints1_LDADD = $(LDADD)
+nnc_addconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addconstraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addgenerator1_OBJECTS = \
+ nnc_addgenerator1-addgenerator1.$(OBJEXT)
+nnc_addgenerator1_OBJECTS = $(am_nnc_addgenerator1_OBJECTS)
+nnc_addgenerator1_LDADD = $(LDADD)
+nnc_addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addgenerator1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addgenerators1_OBJECTS = \
+ nnc_addgenerators1-addgenerators1.$(OBJEXT)
+nnc_addgenerators1_OBJECTS = $(am_nnc_addgenerators1_OBJECTS)
+nnc_addgenerators1_LDADD = $(LDADD)
+nnc_addgenerators1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addgenerators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_addspacedims1_OBJECTS = \
+ nnc_addspacedims1-addspacedims1.$(OBJEXT)
+nnc_addspacedims1_OBJECTS = $(am_nnc_addspacedims1_OBJECTS)
+nnc_addspacedims1_LDADD = $(LDADD)
+nnc_addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_addspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_affineimage1_OBJECTS = nnc_affineimage1-affineimage1.$(OBJEXT)
+nnc_affineimage1_OBJECTS = $(am_nnc_affineimage1_OBJECTS)
+nnc_affineimage1_LDADD = $(LDADD)
+nnc_affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_affineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_affinepreimage1_OBJECTS = \
+ nnc_affinepreimage1-affinepreimage1.$(OBJEXT)
+nnc_affinepreimage1_OBJECTS = $(am_nnc_affinepreimage1_OBJECTS)
+nnc_affinepreimage1_LDADD = $(LDADD)
+nnc_affinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_affinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_affinetrans_OBJECTS = nnc_affinetrans-affinetrans.$(OBJEXT)
+nnc_affinetrans_OBJECTS = $(am_nnc_affinetrans_OBJECTS)
+nnc_affinetrans_LDADD = $(LDADD)
+nnc_affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_affinetrans_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_append1_OBJECTS = nnc_append1-append1.$(OBJEXT)
+nnc_append1_OBJECTS = $(am_nnc_append1_OBJECTS)
+nnc_append1_LDADD = $(LDADD)
+nnc_append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_append1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_append2_OBJECTS = nnc_append2-append2.$(OBJEXT)
+nnc_append2_OBJECTS = $(am_nnc_append2_OBJECTS)
+nnc_append2_LDADD = $(LDADD)
+nnc_append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_append2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append2_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_ascii_dump_load1_OBJECTS = \
+ nnc_ascii_dump_load1-ascii_dump_load1.$(OBJEXT)
+nnc_ascii_dump_load1_OBJECTS = $(am_nnc_ascii_dump_load1_OBJECTS)
+nnc_ascii_dump_load1_LDADD = $(LDADD)
+nnc_ascii_dump_load1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_ascii_dump_load1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_ascii_dump_load2_OBJECTS = \
+ nnc_ascii_dump_load2-ascii_dump_load2.$(OBJEXT)
+nnc_ascii_dump_load2_OBJECTS = $(am_nnc_ascii_dump_load2_OBJECTS)
+nnc_ascii_dump_load2_LDADD = $(LDADD)
+nnc_ascii_dump_load2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_ascii_dump_load2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_bgp99extrapolation1_OBJECTS = \
+ nnc_bgp99extrapolation1-bgp99extrapolation1.$(OBJEXT)
+nnc_bgp99extrapolation1_OBJECTS = \
+ $(am_nnc_bgp99extrapolation1_OBJECTS)
+nnc_bgp99extrapolation1_LDADD = $(LDADD)
+nnc_bgp99extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_bgp99extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_bhrz03widening1_OBJECTS = \
+ nnc_bhrz03widening1-bhrz03widening1.$(OBJEXT)
+nnc_bhrz03widening1_OBJECTS = $(am_nnc_bhrz03widening1_OBJECTS)
+nnc_bhrz03widening1_LDADD = $(LDADD)
+nnc_bhrz03widening1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_bhrz03widening1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_bhrz03widening2_OBJECTS = \
+ nnc_bhrz03widening2-bhrz03widening2.$(OBJEXT)
+nnc_bhrz03widening2_OBJECTS = $(am_nnc_bhrz03widening2_OBJECTS)
+nnc_bhrz03widening2_LDADD = $(LDADD)
+nnc_bhrz03widening2_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_bhrz03widening2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_bounded1_OBJECTS = nnc_bounded1-bounded1.$(OBJEXT)
+nnc_bounded1_OBJECTS = $(am_nnc_bounded1_OBJECTS)
+nnc_bounded1_LDADD = $(LDADD)
+nnc_bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_bounded1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounded1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_boundedaffineimage1_OBJECTS = \
+ nnc_boundedaffineimage1-boundedaffineimage1.$(OBJEXT)
+nnc_boundedaffineimage1_OBJECTS = \
+ $(am_nnc_boundedaffineimage1_OBJECTS)
+nnc_boundedaffineimage1_LDADD = $(LDADD)
+nnc_boundedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_boundedaffineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_boundedaffinepreimage1_OBJECTS = \
+ nnc_boundedaffinepreimage1-boundedaffinepreimage1.$(OBJEXT)
+nnc_boundedaffinepreimage1_OBJECTS = \
+ $(am_nnc_boundedaffinepreimage1_OBJECTS)
+nnc_boundedaffinepreimage1_LDADD = $(LDADD)
+nnc_boundedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_boundedaffinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_boundedbhrz03extrapolation1_OBJECTS = \
+ boundedbhrz03extrapolation1.$(OBJEXT)
+nnc_boundedbhrz03extrapolation1_OBJECTS = \
+ $(am_nnc_boundedbhrz03extrapolation1_OBJECTS)
+nnc_boundedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_boundedbhrz03extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nnc_boundedh79extrapolation1_OBJECTS = nnc_boundedh79extrapolation1-boundedh79extrapolation1.$(OBJEXT)
+nnc_boundedh79extrapolation1_OBJECTS = \
+ $(am_nnc_boundedh79extrapolation1_OBJECTS)
+nnc_boundedh79extrapolation1_LDADD = $(LDADD)
+nnc_boundedh79extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_boundedh79extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_bounds1_OBJECTS = nnc_bounds1-bounds1.$(OBJEXT)
+nnc_bounds1_OBJECTS = $(am_nnc_bounds1_OBJECTS)
+nnc_bounds1_LDADD = $(LDADD)
+nnc_bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_bounds1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounds1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_concatenate1_OBJECTS = nnc_concatenate1-concatenate1.$(OBJEXT)
+nnc_concatenate1_OBJECTS = $(am_nnc_concatenate1_OBJECTS)
+nnc_concatenate1_LDADD = $(LDADD)
+nnc_concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_concatenate1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_congruences1_OBJECTS = nnc_congruences1-congruences1.$(OBJEXT)
+nnc_congruences1_OBJECTS = $(am_nnc_congruences1_OBJECTS)
+nnc_congruences1_LDADD = $(LDADD)
+nnc_congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_congruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_constrains1_OBJECTS = nnc_constrains1-constrains1.$(OBJEXT)
+nnc_constrains1_OBJECTS = $(am_nnc_constrains1_OBJECTS)
+nnc_constrains1_LDADD = $(LDADD)
+nnc_constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_constrains1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_constraints1_OBJECTS = nnc_constraints1-constraints1.$(OBJEXT)
+nnc_constraints1_OBJECTS = $(am_nnc_constraints1_OBJECTS)
+nnc_constraints1_LDADD = $(LDADD)
+nnc_constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_constraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_contains1_OBJECTS = nnc_contains1-contains1.$(OBJEXT)
+nnc_contains1_OBJECTS = $(am_nnc_contains1_OBJECTS)
+nnc_contains1_LDADD = $(LDADD)
+nnc_contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_contains1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_containsintegerpoint1_OBJECTS = \
+ nnc_containsintegerpoint1-containsintegerpoint1.$(OBJEXT)
+nnc_containsintegerpoint1_OBJECTS = \
+ $(am_nnc_containsintegerpoint1_OBJECTS)
+nnc_containsintegerpoint1_LDADD = $(LDADD)
+nnc_containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_containsintegerpoint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_disjoint1_OBJECTS = nnc_disjoint1-disjoint1.$(OBJEXT)
+nnc_disjoint1_OBJECTS = $(am_nnc_disjoint1_OBJECTS)
+nnc_disjoint1_LDADD = $(LDADD)
+nnc_disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_disjoint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_dropsomenonintegerpoints1_OBJECTS = nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.$(OBJEXT)
+nnc_dropsomenonintegerpoints1_OBJECTS = \
+ $(am_nnc_dropsomenonintegerpoints1_OBJECTS)
+nnc_dropsomenonintegerpoints1_LDADD = $(LDADD)
+nnc_dropsomenonintegerpoints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_dropsomenonintegerpoints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_empty1_OBJECTS = nnc_empty1-empty1.$(OBJEXT)
+nnc_empty1_OBJECTS = $(am_nnc_empty1_OBJECTS)
+nnc_empty1_LDADD = $(LDADD)
+nnc_empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_empty1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_empty1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_equals1_OBJECTS = nnc_equals1-equals1.$(OBJEXT)
+nnc_equals1_OBJECTS = $(am_nnc_equals1_OBJECTS)
+nnc_equals1_LDADD = $(LDADD)
+nnc_equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_equals1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_equals1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_exceptions1_OBJECTS = nnc_exceptions1-exceptions1.$(OBJEXT)
+nnc_exceptions1_OBJECTS = $(am_nnc_exceptions1_OBJECTS)
+nnc_exceptions1_LDADD = $(LDADD)
+nnc_exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_exceptions1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_exceptions3_OBJECTS = nnc_exceptions3-exceptions3.$(OBJEXT)
+nnc_exceptions3_OBJECTS = $(am_nnc_exceptions3_OBJECTS)
+nnc_exceptions3_LDADD = $(LDADD)
+nnc_exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_exceptions3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_expandspacedim1_OBJECTS = \
+ nnc_expandspacedim1-expandspacedim1.$(OBJEXT)
+nnc_expandspacedim1_OBJECTS = $(am_nnc_expandspacedim1_OBJECTS)
+nnc_expandspacedim1_LDADD = $(LDADD)
+nnc_expandspacedim1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_expandspacedim1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_foldspacedims1_OBJECTS = \
+ nnc_foldspacedims1-foldspacedims1.$(OBJEXT)
+nnc_foldspacedims1_OBJECTS = $(am_nnc_foldspacedims1_OBJECTS)
+nnc_foldspacedims1_LDADD = $(LDADD)
+nnc_foldspacedims1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_foldspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_frombdshape1_OBJECTS = nnc_frombdshape1-frombdshape1.$(OBJEXT)
+nnc_frombdshape1_OBJECTS = $(am_nnc_frombdshape1_OBJECTS)
+nnc_frombdshape1_LDADD = $(LDADD)
+nnc_frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_frombdshape1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_frombox1_OBJECTS = nnc_frombox1-frombox1.$(OBJEXT)
+nnc_frombox1_OBJECTS = $(am_nnc_frombox1_OBJECTS)
+nnc_frombox1_LDADD = $(LDADD)
+nnc_frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_frombox1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_frombox1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_fromgrid1_OBJECTS = nnc_fromgrid1-fromgrid1.$(OBJEXT)
+nnc_fromgrid1_OBJECTS = $(am_nnc_fromgrid1_OBJECTS)
+nnc_fromgrid1_LDADD = $(LDADD)
+nnc_fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_fromgrid1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_fromoctagonalshape1_OBJECTS = \
+ nnc_fromoctagonalshape1-fromoctagonalshape1.$(OBJEXT)
+nnc_fromoctagonalshape1_OBJECTS = \
+ $(am_nnc_fromoctagonalshape1_OBJECTS)
+nnc_fromoctagonalshape1_LDADD = $(LDADD)
+nnc_fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_fromoctagonalshape1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_generalizedaffineimage1_OBJECTS = \
+ nnc_generalizedaffineimage1-generalizedaffineimage1.$(OBJEXT)
+nnc_generalizedaffineimage1_OBJECTS = \
+ $(am_nnc_generalizedaffineimage1_OBJECTS)
+nnc_generalizedaffineimage1_LDADD = $(LDADD)
+nnc_generalizedaffineimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_generalizedaffineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_generalizedaffinepreimage1_OBJECTS = nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.$(OBJEXT)
+nnc_generalizedaffinepreimage1_OBJECTS = \
+ $(am_nnc_generalizedaffinepreimage1_OBJECTS)
+nnc_generalizedaffinepreimage1_LDADD = $(LDADD)
+nnc_generalizedaffinepreimage1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_generalizedaffinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_generators1_OBJECTS = nnc_generators1-generators1.$(OBJEXT)
+nnc_generators1_OBJECTS = $(am_nnc_generators1_OBJECTS)
+nnc_generators1_LDADD = $(LDADD)
+nnc_generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_generators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_geomcovers1_OBJECTS = nnc_geomcovers1-geomcovers1.$(OBJEXT)
+nnc_geomcovers1_OBJECTS = $(am_nnc_geomcovers1_OBJECTS)
+nnc_geomcovers1_LDADD = $(LDADD)
+nnc_geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_geomcovers1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_h79widening1_OBJECTS = nnc_h79widening1-h79widening1.$(OBJEXT)
+nnc_h79widening1_OBJECTS = $(am_nnc_h79widening1_OBJECTS)
+nnc_h79widening1_LDADD = $(LDADD)
+nnc_h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_h79widening1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_intersection1_OBJECTS = \
+ nnc_intersection1-intersection1.$(OBJEXT)
+nnc_intersection1_OBJECTS = $(am_nnc_intersection1_OBJECTS)
+nnc_intersection1_LDADD = $(LDADD)
+nnc_intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_intersection1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_limitedbhrz03extrapolation1_OBJECTS = nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.$(OBJEXT)
+nnc_limitedbhrz03extrapolation1_OBJECTS = \
+ $(am_nnc_limitedbhrz03extrapolation1_OBJECTS)
+nnc_limitedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_limitedbhrz03extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_limitedbhrz03extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_limitedh79extrapolation1_OBJECTS = nnc_limitedh79extrapolation1-limitedh79extrapolation1.$(OBJEXT)
+nnc_limitedh79extrapolation1_OBJECTS = \
+ $(am_nnc_limitedh79extrapolation1_OBJECTS)
+nnc_limitedh79extrapolation1_LDADD = $(LDADD)
+nnc_limitedh79extrapolation1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_limitedh79extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_linearpartition1_OBJECTS = \
+ nnc_linearpartition1-linearpartition1.$(OBJEXT)
+nnc_linearpartition1_OBJECTS = $(am_nnc_linearpartition1_OBJECTS)
+nnc_linearpartition1_LDADD = $(LDADD)
+nnc_linearpartition1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_linearpartition1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_mapspacedims1_OBJECTS = \
+ nnc_mapspacedims1-mapspacedims1.$(OBJEXT)
+nnc_mapspacedims1_OBJECTS = $(am_nnc_mapspacedims1_OBJECTS)
+nnc_mapspacedims1_LDADD = $(LDADD)
+nnc_mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_mapspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_max_min1_OBJECTS = nnc_max_min1-max_min1.$(OBJEXT)
+nnc_max_min1_OBJECTS = $(am_nnc_max_min1_OBJECTS)
+nnc_max_min1_LDADD = $(LDADD)
+nnc_max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_max_min1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_max_min1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_mc91_OBJECTS = nnc_mc91-mc91.$(OBJEXT)
+nnc_mc91_OBJECTS = $(am_nnc_mc91_OBJECTS)
+nnc_mc91_LDADD = $(LDADD)
+nnc_mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_mc91_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_mc91_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_membytes1_OBJECTS = nnc_membytes1-membytes1.$(OBJEXT)
+nnc_membytes1_OBJECTS = $(am_nnc_membytes1_OBJECTS)
+nnc_membytes1_LDADD = $(LDADD)
+nnc_membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_membytes1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_minconstraints1_OBJECTS = \
+ nnc_minconstraints1-minconstraints1.$(OBJEXT)
+nnc_minconstraints1_OBJECTS = $(am_nnc_minconstraints1_OBJECTS)
+nnc_minconstraints1_LDADD = $(LDADD)
+nnc_minconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_minconstraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_mingenerators1_OBJECTS = \
+ nnc_mingenerators1-mingenerators1.$(OBJEXT)
+nnc_mingenerators1_OBJECTS = $(am_nnc_mingenerators1_OBJECTS)
+nnc_mingenerators1_LDADD = $(LDADD)
+nnc_mingenerators1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_mingenerators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_onepoint_OBJECTS = nnc_onepoint-onepoint.$(OBJEXT)
+nnc_onepoint_OBJECTS = $(am_nnc_onepoint_OBJECTS)
+nnc_onepoint_LDADD = $(LDADD)
+nnc_onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_onepoint_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_onepoint_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_permute_OBJECTS = nnc_permute-permute.$(OBJEXT)
+nnc_permute_OBJECTS = $(am_nnc_permute_OBJECTS)
+nnc_permute_LDADD = $(LDADD)
+nnc_permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_permute_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_permute_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_polydifference1_OBJECTS = \
+ nnc_polydifference1-polydifference1.$(OBJEXT)
+nnc_polydifference1_OBJECTS = $(am_nnc_polydifference1_OBJECTS)
+nnc_polydifference1_LDADD = $(LDADD)
+nnc_polydifference1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_polydifference1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_polyhull1_OBJECTS = nnc_polyhull1-polyhull1.$(OBJEXT)
+nnc_polyhull1_OBJECTS = $(am_nnc_polyhull1_OBJECTS)
+nnc_polyhull1_LDADD = $(LDADD)
+nnc_polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_polyhull1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_polyhullifexact1_OBJECTS = \
+ nnc_polyhullifexact1-polyhullifexact1.$(OBJEXT)
+nnc_polyhullifexact1_OBJECTS = $(am_nnc_polyhullifexact1_OBJECTS)
+nnc_polyhullifexact1_LDADD = $(LDADD)
+nnc_polyhullifexact1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_polyhullifexact1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_randphull1_OBJECTS = nnc_randphull1-randphull1.$(OBJEXT)
+nnc_randphull1_OBJECTS = $(am_nnc_randphull1_OBJECTS)
+nnc_randphull1_LDADD = $(LDADD)
+nnc_randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_randphull1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_relations1_OBJECTS = nnc_relations1-relations1.$(OBJEXT)
+nnc_relations1_OBJECTS = $(am_nnc_relations1_OBJECTS)
+nnc_relations1_LDADD = $(LDADD)
+nnc_relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_relations1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_relations2_OBJECTS = nnc_relations2-relations2.$(OBJEXT)
+nnc_relations2_OBJECTS = $(am_nnc_relations2_OBJECTS)
+nnc_relations2_LDADD = $(LDADD)
+nnc_relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_relations2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_removespacedims1_OBJECTS = \
+ nnc_removespacedims1-removespacedims1.$(OBJEXT)
+nnc_removespacedims1_OBJECTS = $(am_nnc_removespacedims1_OBJECTS)
+nnc_removespacedims1_LDADD = $(LDADD)
+nnc_removespacedims1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_removespacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_simplifyusingcontext1_OBJECTS = \
+ nnc_simplifyusingcontext1-simplifyusingcontext1.$(OBJEXT)
+nnc_simplifyusingcontext1_OBJECTS = \
+ $(am_nnc_simplifyusingcontext1_OBJECTS)
+nnc_simplifyusingcontext1_LDADD = $(LDADD)
+nnc_simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_simplifyusingcontext1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_smm1_OBJECTS = nnc_smm1-smm1.$(OBJEXT)
+nnc_smm1_OBJECTS = $(am_nnc_smm1_OBJECTS)
+nnc_smm1_LDADD = $(LDADD)
+nnc_smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_smm1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_smm1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_timeelapse1_OBJECTS = nnc_timeelapse1-timeelapse1.$(OBJEXT)
+nnc_timeelapse1_OBJECTS = $(am_nnc_timeelapse1_OBJECTS)
+nnc_timeelapse1_LDADD = $(LDADD)
+nnc_timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_timeelapse1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_unconstrain1_OBJECTS = nnc_unconstrain1-unconstrain1.$(OBJEXT)
+nnc_unconstrain1_OBJECTS = $(am_nnc_unconstrain1_OBJECTS)
+nnc_unconstrain1_LDADD = $(LDADD)
+nnc_unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_unconstrain1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nnc_universe1_OBJECTS = nnc_universe1-universe1.$(OBJEXT)
+nnc_universe1_OBJECTS = $(am_nnc_universe1_OBJECTS)
+nnc_universe1_LDADD = $(LDADD)
+nnc_universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_universe1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am_nnc_wrap1_OBJECTS = nnc_wrap1-wrap1.$(OBJEXT)
+nnc_wrap1_OBJECTS = $(am_nnc_wrap1_OBJECTS)
+nnc_wrap1_LDADD = $(LDADD)
+nnc_wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_wrap1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_wrap1_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_wrap2_OBJECTS = nnc_wrap2-wrap2.$(OBJEXT)
+nnc_wrap2_OBJECTS = $(am_nnc_wrap2_OBJECTS)
+nnc_wrap2_LDADD = $(LDADD)
+nnc_wrap2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_wrap2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_wrap2_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_writepolyhedron1_OBJECTS = \
+ nnc_writepolyhedron1-writepolyhedron1.$(OBJEXT)
+nnc_writepolyhedron1_OBJECTS = $(am_nnc_writepolyhedron1_OBJECTS)
+nnc_writepolyhedron1_LDADD = $(LDADD)
+nnc_writepolyhedron1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_writepolyhedron1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_nncminimize1_OBJECTS = nncminimize1.$(OBJEXT)
+nncminimize1_OBJECTS = $(am_nncminimize1_OBJECTS)
+nncminimize1_LDADD = $(LDADD)
+nncminimize1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nncminimize2_OBJECTS = nncminimize2.$(OBJEXT)
+nncminimize2_OBJECTS = $(am_nncminimize2_OBJECTS)
+nncminimize2_LDADD = $(LDADD)
+nncminimize2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nncpostimeelapse1_OBJECTS = nncpostimeelapse1.$(OBJEXT)
+nncpostimeelapse1_OBJECTS = $(am_nncpostimeelapse1_OBJECTS)
+nncpostimeelapse1_LDADD = $(LDADD)
+nncpostimeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_numberinput1_OBJECTS = numberinput1.$(OBJEXT)
+numberinput1_OBJECTS = $(am_numberinput1_OBJECTS)
+numberinput1_LDADD = $(LDADD)
+numberinput1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_onepoint_OBJECTS = onepoint.$(OBJEXT)
+onepoint_OBJECTS = $(am_onepoint_OBJECTS)
+onepoint_LDADD = $(LDADD)
+onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_permute_OBJECTS = permute.$(OBJEXT)
+permute_OBJECTS = $(am_permute_OBJECTS)
+permute_LDADD = $(LDADD)
+permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polydifference1_OBJECTS = polydifference1.$(OBJEXT)
+polydifference1_OBJECTS = $(am_polydifference1_OBJECTS)
+polydifference1_LDADD = $(LDADD)
+polydifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polydifference2_OBJECTS = polydifference2.$(OBJEXT)
+polydifference2_OBJECTS = $(am_polydifference2_OBJECTS)
+polydifference2_LDADD = $(LDADD)
+polydifference2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhull1_OBJECTS = polyhull1.$(OBJEXT)
+polyhull1_OBJECTS = $(am_polyhull1_OBJECTS)
+polyhull1_LDADD = $(LDADD)
+polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhull2_OBJECTS = polyhull2.$(OBJEXT)
+polyhull2_OBJECTS = $(am_polyhull2_OBJECTS)
+polyhull2_LDADD = $(LDADD)
+polyhull2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhullifexact1_OBJECTS = polyhullifexact1.$(OBJEXT)
+polyhullifexact1_OBJECTS = $(am_polyhullifexact1_OBJECTS)
+polyhullifexact1_LDADD = $(LDADD)
+polyhullifexact1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_polyhullifexact2_OBJECTS = polyhullifexact2.$(OBJEXT)
+polyhullifexact2_OBJECTS = $(am_polyhullifexact2_OBJECTS)
+polyhullifexact2_LDADD = $(LDADD)
+polyhullifexact2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_randphull1_OBJECTS = randphull1.$(OBJEXT)
+randphull1_OBJECTS = $(am_randphull1_OBJECTS)
+randphull1_LDADD = $(LDADD)
+randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruence1_OBJECTS = refinewithcongruence1.$(OBJEXT)
+refinewithcongruence1_OBJECTS = $(am_refinewithcongruence1_OBJECTS)
+refinewithcongruence1_LDADD = $(LDADD)
+refinewithcongruence1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_smm1_OBJECTS = smm1.$(OBJEXT)
+smm1_OBJECTS = $(am_smm1_OBJECTS)
+smm1_LDADD = $(LDADD)
+smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_sparserow1_OBJECTS = sparserow1.$(OBJEXT)
+sparserow1_OBJECTS = $(am_sparserow1_OBJECTS)
+sparserow1_LDADD = $(LDADD)
+sparserow1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_termination1_OBJECTS = termination1.$(OBJEXT)
+termination1_OBJECTS = $(am_termination1_OBJECTS)
+termination1_LDADD = $(LDADD)
+termination1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_termination2_OBJECTS = termination2.$(OBJEXT)
+termination2_OBJECTS = $(am_termination2_OBJECTS)
+termination2_LDADD = $(LDADD)
+termination2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_timeelapse2_OBJECTS = timeelapse2.$(OBJEXT)
+timeelapse2_OBJECTS = $(am_timeelapse2_OBJECTS)
+timeelapse2_LDADD = $(LDADD)
+timeelapse2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe2_OBJECTS = universe2.$(OBJEXT)
+universe2_OBJECTS = $(am_universe2_OBJECTS)
+universe2_LDADD = $(LDADD)
+universe2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_variablesset1_OBJECTS = variablesset1.$(OBJEXT)
+variablesset1_OBJECTS = $(am_variablesset1_OBJECTS)
+variablesset1_LDADD = $(LDADD)
+variablesset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_wrap2_OBJECTS = wrap2.$(OBJEXT)
+wrap2_OBJECTS = $(am_wrap2_OBJECTS)
+wrap2_LDADD = $(LDADD)
+wrap2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writeconsys1_OBJECTS = writeconsys1.$(OBJEXT)
+writeconsys1_OBJECTS = $(am_writeconsys1_OBJECTS)
+writeconsys1_LDADD = $(LDADD)
+writeconsys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writegensys1_OBJECTS = writegensys1.$(OBJEXT)
+writegensys1_OBJECTS = $(am_writegensys1_OBJECTS)
+writegensys1_LDADD = $(LDADD)
+writegensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writepolyhedron1_OBJECTS = writepolyhedron1.$(OBJEXT)
+writepolyhedron1_OBJECTS = $(am_writepolyhedron1_OBJECTS)
+writepolyhedron1_LDADD = $(LDADD)
+writepolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writepolyhedron2_OBJECTS = writepolyhedron2.$(OBJEXT)
+writepolyhedron2_OBJECTS = $(am_writepolyhedron2_OBJECTS)
+writepolyhedron2_LDADD = $(LDADD)
+writepolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writerelation1_OBJECTS = writerelation1.$(OBJEXT)
+writerelation1_OBJECTS = $(am_writerelation1_OBJECTS)
+writerelation1_LDADD = $(LDADD)
+writerelation1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_writevariable1_OBJECTS = writevariable1.$(OBJEXT)
+writevariable1_OBJECTS = $(am_writevariable1_OBJECTS)
+writevariable1_LDADD = $(LDADD)
+writevariable1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+ $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+ $(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+ $(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+ $(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+ $(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+ $(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+ $(bgp99extrapolation2_SOURCES) $(bhrz03widening1_SOURCES) \
+ $(bhrz03widening2_SOURCES) $(bhrz03widening3_SOURCES) \
+ $(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) \
+ $(boundedbhrz03extrapolation1_SOURCES) \
+ $(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+ $(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) \
+ $(dropsomenonintegerpoints2_SOURCES) $(dualhypercubes_SOURCES) \
+ $(empty1_SOURCES) $(equals1_SOURCES) $(exceptions1_SOURCES) \
+ $(exceptions2_SOURCES) $(exceptions3_SOURCES) \
+ $(expandspacedim1_SOURCES) $(expandspacedim2_SOURCES) \
+ $(foldspacedims1_SOURCES) $(foldspacedims2_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+ $(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+ $(h79widening2_SOURCES) $(hybrid_SOURCES) \
+ $(intersection1_SOURCES) \
+ $(limitedbhrz03extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) \
+ $(linearexpression1_SOURCES) $(linearpartition1_SOURCES) \
+ $(linearsystem1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+ $(mc91_SOURCES) $(membytes1_SOURCES) $(memory2_SOURCES) \
+ $(minconstraints1_SOURCES) $(minconstraints2_SOURCES) \
+ $(mingenerators1_SOURCES) $(mingenerators2_SOURCES) \
+ $(nnc_addcongruence1_SOURCES) $(nnc_addcongruences1_SOURCES) \
+ $(nnc_addconstraint1_SOURCES) $(nnc_addconstraints1_SOURCES) \
+ $(nnc_addgenerator1_SOURCES) $(nnc_addgenerators1_SOURCES) \
+ $(nnc_addspacedims1_SOURCES) $(nnc_affineimage1_SOURCES) \
+ $(nnc_affinepreimage1_SOURCES) $(nnc_affinetrans_SOURCES) \
+ $(nnc_append1_SOURCES) $(nnc_append2_SOURCES) \
+ $(nnc_ascii_dump_load1_SOURCES) \
+ $(nnc_ascii_dump_load2_SOURCES) \
+ $(nnc_bgp99extrapolation1_SOURCES) \
+ $(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+ $(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+ $(nnc_boundedaffinepreimage1_SOURCES) \
+ $(nnc_boundedbhrz03extrapolation1_SOURCES) \
+ $(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+ $(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+ $(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+ $(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+ $(nnc_disjoint1_SOURCES) \
+ $(nnc_dropsomenonintegerpoints1_SOURCES) $(nnc_empty1_SOURCES) \
+ $(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+ $(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+ $(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+ $(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+ $(nnc_fromoctagonalshape1_SOURCES) \
+ $(nnc_generalizedaffineimage1_SOURCES) \
+ $(nnc_generalizedaffinepreimage1_SOURCES) \
+ $(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+ $(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+ $(nnc_limitedbhrz03extrapolation1_SOURCES) \
+ $(nnc_limitedh79extrapolation1_SOURCES) \
+ $(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+ $(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+ $(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+ $(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+ $(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+ $(nnc_polyhull1_SOURCES) $(nnc_polyhullifexact1_SOURCES) \
+ $(nnc_randphull1_SOURCES) $(nnc_relations1_SOURCES) \
+ $(nnc_relations2_SOURCES) $(nnc_removespacedims1_SOURCES) \
+ $(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+ $(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+ $(nnc_universe1_SOURCES) $(nnc_wrap1_SOURCES) \
+ $(nnc_wrap2_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+ $(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+ $(nncpostimeelapse1_SOURCES) $(numberinput1_SOURCES) \
+ $(onepoint_SOURCES) $(permute_SOURCES) \
+ $(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+ $(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+ $(polyhullifexact1_SOURCES) $(polyhullifexact2_SOURCES) \
+ $(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraint1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
+ $(sparserow1_SOURCES) $(termination1_SOURCES) \
+ $(termination2_SOURCES) $(timeelapse1_SOURCES) \
+ $(timeelapse2_SOURCES) $(topclosed1_SOURCES) \
+ $(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+ $(universe1_SOURCES) $(universe2_SOURCES) \
+ $(variablesset1_SOURCES) $(watchdog1_SOURCES) \
+ $(weightwatch1_SOURCES) $(wrap1_SOURCES) $(wrap2_SOURCES) \
+ $(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
+ $(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
+ $(writerelation1_SOURCES) $(writevariable1_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+ $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+ $(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+ $(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+ $(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+ $(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+ $(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+ $(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+ $(bgp99extrapolation2_SOURCES) $(bhrz03widening1_SOURCES) \
+ $(bhrz03widening2_SOURCES) $(bhrz03widening3_SOURCES) \
+ $(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+ $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) \
+ $(boundedbhrz03extrapolation1_SOURCES) \
+ $(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+ $(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruences1_SOURCES) $(constrains1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+ $(dropsomenonintegerpoints1_SOURCES) \
+ $(dropsomenonintegerpoints2_SOURCES) $(dualhypercubes_SOURCES) \
+ $(empty1_SOURCES) $(equals1_SOURCES) $(exceptions1_SOURCES) \
+ $(exceptions2_SOURCES) $(exceptions3_SOURCES) \
+ $(expandspacedim1_SOURCES) $(expandspacedim2_SOURCES) \
+ $(foldspacedims1_SOURCES) $(foldspacedims2_SOURCES) \
+ $(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+ $(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+ $(h79widening2_SOURCES) $(hybrid_SOURCES) \
+ $(intersection1_SOURCES) \
+ $(limitedbhrz03extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) \
+ $(linearexpression1_SOURCES) $(linearpartition1_SOURCES) \
+ $(linearsystem1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+ $(mc91_SOURCES) $(membytes1_SOURCES) $(memory2_SOURCES) \
+ $(minconstraints1_SOURCES) $(minconstraints2_SOURCES) \
+ $(mingenerators1_SOURCES) $(mingenerators2_SOURCES) \
+ $(nnc_addcongruence1_SOURCES) $(nnc_addcongruences1_SOURCES) \
+ $(nnc_addconstraint1_SOURCES) $(nnc_addconstraints1_SOURCES) \
+ $(nnc_addgenerator1_SOURCES) $(nnc_addgenerators1_SOURCES) \
+ $(nnc_addspacedims1_SOURCES) $(nnc_affineimage1_SOURCES) \
+ $(nnc_affinepreimage1_SOURCES) $(nnc_affinetrans_SOURCES) \
+ $(nnc_append1_SOURCES) $(nnc_append2_SOURCES) \
+ $(nnc_ascii_dump_load1_SOURCES) \
+ $(nnc_ascii_dump_load2_SOURCES) \
+ $(nnc_bgp99extrapolation1_SOURCES) \
+ $(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+ $(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+ $(nnc_boundedaffinepreimage1_SOURCES) \
+ $(nnc_boundedbhrz03extrapolation1_SOURCES) \
+ $(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+ $(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+ $(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+ $(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+ $(nnc_disjoint1_SOURCES) \
+ $(nnc_dropsomenonintegerpoints1_SOURCES) $(nnc_empty1_SOURCES) \
+ $(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+ $(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+ $(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+ $(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+ $(nnc_fromoctagonalshape1_SOURCES) \
+ $(nnc_generalizedaffineimage1_SOURCES) \
+ $(nnc_generalizedaffinepreimage1_SOURCES) \
+ $(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+ $(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+ $(nnc_limitedbhrz03extrapolation1_SOURCES) \
+ $(nnc_limitedh79extrapolation1_SOURCES) \
+ $(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+ $(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+ $(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+ $(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+ $(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+ $(nnc_polyhull1_SOURCES) $(nnc_polyhullifexact1_SOURCES) \
+ $(nnc_randphull1_SOURCES) $(nnc_relations1_SOURCES) \
+ $(nnc_relations2_SOURCES) $(nnc_removespacedims1_SOURCES) \
+ $(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+ $(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+ $(nnc_universe1_SOURCES) $(nnc_wrap1_SOURCES) \
+ $(nnc_wrap2_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+ $(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+ $(nncpostimeelapse1_SOURCES) $(numberinput1_SOURCES) \
+ $(onepoint_SOURCES) $(permute_SOURCES) \
+ $(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+ $(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+ $(polyhullifexact1_SOURCES) $(polyhullifexact2_SOURCES) \
+ $(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+ $(refinewithcongruences1_SOURCES) \
+ $(refinewithconstraint1_SOURCES) \
+ $(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(relations3_SOURCES) \
+ $(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+ $(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
+ $(sparserow1_SOURCES) $(termination1_SOURCES) \
+ $(termination2_SOURCES) $(timeelapse1_SOURCES) \
+ $(timeelapse2_SOURCES) $(topclosed1_SOURCES) \
+ $(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+ $(universe1_SOURCES) $(universe2_SOURCES) \
+ $(variablesset1_SOURCES) $(watchdog1_SOURCES) \
+ $(weightwatch1_SOURCES) $(wrap1_SOURCES) $(wrap2_SOURCES) \
+ $(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
+ $(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
+ $(writerelation1_SOURCES) $(writevariable1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 bgp99extrapolation2 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dropsomenonintegerpoints1 dropsomenonintegerpoints2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2 exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frequency1 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+hybrid \
+intersection1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearexpression1 \
+linearpartition1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+nncpostimeelapse1 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+polyhullifexact1 polyhullifexact2 \
+randphull1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+smm1 \
+sparserow1 \
+termination1 termination2 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+watchdog1 \
+weightwatch1 \
+wrap1 wrap2 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
+
+DERIVED_TESTS = \
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_dropsomenonintegerpoints1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_polyhullifexact1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_wrap1 nnc_wrap2 \
+nnc_writepolyhedron1
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinetrans_SOURCES = affinetrans.cc
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bgp99extrapolation2_SOURCES = bgp99extrapolation2.cc
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+bounds1_SOURCES = bounds1.cc
+cnncconversion1_SOURCES = cnncconversion1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+dropsomenonintegerpoints2_SOURCES = dropsomenonintegerpoints2.cc
+dualhypercubes_SOURCES = dualhypercubes.cc
+empty1_SOURCES = empty1.cc
+equals1_SOURCES = equals1.cc
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generators1_SOURCES = generators1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+hybrid_SOURCES = hybrid.cc
+intersection1_SOURCES = intersection1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+linearpartition1_SOURCES = linearpartition1.cc
+linearexpression1_SOURCES = linearexpression1.cc
+linearsystem1_SOURCES = linearsystem1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+matrix1_SOURCES = matrix1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+mc91_SOURCES = mc91.cc
+membytes1_SOURCES = membytes1.cc
+memory2_SOURCES = memory2.cc
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+numberinput1_SOURCES = numberinput1.cc
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+nncpostimeelapse1_SOURCES = nncpostimeelapse1.cc
+onepoint_SOURCES = onepoint.cc
+permute_SOURCES = permute.cc
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+polyhullifexact1_SOURCES = polyhullifexact1.cc
+polyhullifexact2_SOURCES = polyhullifexact2.cc
+randphull1_SOURCES = randphull1.cc
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+smm1_SOURCES = smm1.cc
+sparserow1_SOURCES = sparserow1.cc
+termination1_SOURCES = termination1.cc
+termination2_SOURCES = termination2.cc
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+variablesset1_SOURCES = variablesset1.cc
+watchdog1_SOURCES = watchdog1.cc
+weightwatch1_SOURCES = weightwatch1.cc
+wrap1_SOURCES = wrap1.cc
+wrap2_SOURCES = wrap2.cc
+writeconsys1_SOURCES = writeconsys1.cc
+writegensys1_SOURCES = writegensys1.cc
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+writerelation1_SOURCES = writerelation1.cc
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+nnc_dropsomenonintegerpoints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polyhullifexact1_SOURCES = polyhullifexact1.cc
+nnc_polyhullifexact1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap1_SOURCES = wrap1.cc
+nnc_wrap1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap2_SOURCES = wrap2.cc
+nnc_wrap2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+#
+# Sources for the special tests.
+#
+memory1_SRCS = memory1.cc
+EXTRA_DIST = $(memory1_SRCS)
+BUGS =
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+densematrix1.dat \
+linearsystem1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writevariable1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Polyhedron/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Polyhedron/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) $(EXTRA_addcongruence1_DEPENDENCIES)
+ @rm -f addcongruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) $(EXTRA_addconstraint1_DEPENDENCIES)
+ @rm -f addconstraint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES) $(EXTRA_addconstraints2_DEPENDENCIES)
+ @rm -f addconstraints2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
+
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) $(EXTRA_addgenerator1_DEPENDENCIES)
+ @rm -f addgenerator1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+
+addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES) $(EXTRA_addgenerator2_DEPENDENCIES)
+ @rm -f addgenerator2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
+
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) $(EXTRA_addgenerators1_DEPENDENCIES)
+ @rm -f addgenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+
+addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES) $(EXTRA_addgenerators2_DEPENDENCIES)
+ @rm -f addgenerators2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES) $(EXTRA_addspacedims2_DEPENDENCIES)
+ @rm -f addspacedims2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES) $(EXTRA_affinetrans_DEPENDENCIES)
+ @rm -f affinetrans$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
+
+append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES) $(EXTRA_append1_DEPENDENCIES)
+ @rm -f append1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
+
+append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES) $(EXTRA_append2_DEPENDENCIES)
+ @rm -f append2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES) $(EXTRA_ascii_dump_load2_DEPENDENCIES)
+ @rm -f ascii_dump_load2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
+
+ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES) $(EXTRA_ascii_dump_load3_DEPENDENCIES)
+ @rm -f ascii_dump_load3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES)
+ @rm -f bgp99extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bgp99extrapolation2$(EXEEXT): $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_DEPENDENCIES) $(EXTRA_bgp99extrapolation2_DEPENDENCIES)
+ @rm -f bgp99extrapolation2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_LDADD) $(LIBS)
+
+bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES) $(EXTRA_bhrz03widening1_DEPENDENCIES)
+ @rm -f bhrz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
+
+bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES) $(EXTRA_bhrz03widening2_DEPENDENCIES)
+ @rm -f bhrz03widening2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
+
+bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES) $(EXTRA_bhrz03widening3_DEPENDENCIES)
+ @rm -f bhrz03widening3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_boundedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f boundedbhrz03extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
+
+boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES) $(EXTRA_boundedh79extrapolation1_DEPENDENCIES)
+ @rm -f boundedh79extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES) $(EXTRA_cnncconversion1_DEPENDENCIES)
+ @rm -f cnncconversion1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES)
+ @rm -f constrains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES) $(EXTRA_contains2_DEPENDENCIES)
+ @rm -f contains2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES) $(EXTRA_disjoint2_DEPENDENCIES)
+ @rm -f disjoint2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES)
+ @rm -f dropsomenonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints2$(EXEEXT): $(dropsomenonintegerpoints2_OBJECTS) $(dropsomenonintegerpoints2_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints2_DEPENDENCIES)
+ @rm -f dropsomenonintegerpoints2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints2_OBJECTS) $(dropsomenonintegerpoints2_LDADD) $(LIBS)
+
+dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES) $(EXTRA_dualhypercubes_DEPENDENCIES)
+ @rm -f dualhypercubes$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES)
+ @rm -f exceptions1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES) $(EXTRA_exceptions2_DEPENDENCIES)
+ @rm -f exceptions2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
+
+exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES) $(EXTRA_exceptions3_DEPENDENCIES)
+ @rm -f exceptions3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES) $(EXTRA_expandspacedim2_DEPENDENCIES)
+ @rm -f expandspacedim2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES) $(EXTRA_foldspacedims2_DEPENDENCIES)
+ @rm -f foldspacedims2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES)
+ @rm -f frequency1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+frombox2$(EXEEXT): $(frombox2_OBJECTS) $(frombox2_DEPENDENCIES) $(EXTRA_frombox2_DEPENDENCIES)
+ @rm -f frombox2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox2_OBJECTS) $(frombox2_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) $(EXTRA_generators1_DEPENDENCIES)
+ @rm -f generators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES)
+ @rm -f geomcovers1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) $(EXTRA_h79widening1_DEPENDENCIES)
+ @rm -f h79widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+
+h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES) $(EXTRA_h79widening2_DEPENDENCIES)
+ @rm -f h79widening2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+
+hybrid$(EXEEXT): $(hybrid_OBJECTS) $(hybrid_DEPENDENCIES) $(EXTRA_hybrid_DEPENDENCIES)
+ @rm -f hybrid$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(hybrid_OBJECTS) $(hybrid_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f limitedbhrz03extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
+
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f limitedh79extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+
+linearexpression1$(EXEEXT): $(linearexpression1_OBJECTS) $(linearexpression1_DEPENDENCIES) $(EXTRA_linearexpression1_DEPENDENCIES)
+ @rm -f linearexpression1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(linearexpression1_OBJECTS) $(linearexpression1_LDADD) $(LIBS)
+
+linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES) $(EXTRA_linearpartition1_DEPENDENCIES)
+ @rm -f linearpartition1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
+
+linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES) $(EXTRA_linearsystem1_DEPENDENCIES)
+ @rm -f linearsystem1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES) $(EXTRA_matrix1_DEPENDENCIES)
+ @rm -f matrix1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES)
+ @rm -f max_min1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES)
+ @rm -f maxspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES) $(EXTRA_mc91_DEPENDENCIES)
+ @rm -f mc91$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES) $(EXTRA_memory2_DEPENDENCIES)
+ @rm -f memory2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES) $(EXTRA_minconstraints2_DEPENDENCIES)
+ @rm -f minconstraints2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
+
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) $(EXTRA_mingenerators1_DEPENDENCIES)
+ @rm -f mingenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+
+mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES) $(EXTRA_mingenerators2_DEPENDENCIES)
+ @rm -f mingenerators2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
+
+nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES) $(EXTRA_nnc_addcongruence1_DEPENDENCIES)
+ @rm -f nnc_addcongruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addcongruence1_LINK) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
+
+nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES) $(EXTRA_nnc_addcongruences1_DEPENDENCIES)
+ @rm -f nnc_addcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addcongruences1_LINK) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
+
+nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES) $(EXTRA_nnc_addconstraint1_DEPENDENCIES)
+ @rm -f nnc_addconstraint1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addconstraint1_LINK) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
+
+nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES) $(EXTRA_nnc_addconstraints1_DEPENDENCIES)
+ @rm -f nnc_addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addconstraints1_LINK) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
+
+nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES) $(EXTRA_nnc_addgenerator1_DEPENDENCIES)
+ @rm -f nnc_addgenerator1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addgenerator1_LINK) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
+
+nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES) $(EXTRA_nnc_addgenerators1_DEPENDENCIES)
+ @rm -f nnc_addgenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addgenerators1_LINK) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
+
+nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES) $(EXTRA_nnc_addspacedims1_DEPENDENCIES)
+ @rm -f nnc_addspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_addspacedims1_LINK) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
+
+nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES) $(EXTRA_nnc_affineimage1_DEPENDENCIES)
+ @rm -f nnc_affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_affineimage1_LINK) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
+
+nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES) $(EXTRA_nnc_affinepreimage1_DEPENDENCIES)
+ @rm -f nnc_affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_affinepreimage1_LINK) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
+
+nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES) $(EXTRA_nnc_affinetrans_DEPENDENCIES)
+ @rm -f nnc_affinetrans$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_affinetrans_LINK) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
+
+nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES) $(EXTRA_nnc_append1_DEPENDENCIES)
+ @rm -f nnc_append1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_append1_LINK) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
+
+nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES) $(EXTRA_nnc_append2_DEPENDENCIES)
+ @rm -f nnc_append2$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_append2_LINK) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
+
+nnc_ascii_dump_load1$(EXEEXT): $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_DEPENDENCIES) $(EXTRA_nnc_ascii_dump_load1_DEPENDENCIES)
+ @rm -f nnc_ascii_dump_load1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_ascii_dump_load1_LINK) $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_LDADD) $(LIBS)
+
+nnc_ascii_dump_load2$(EXEEXT): $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_DEPENDENCIES) $(EXTRA_nnc_ascii_dump_load2_DEPENDENCIES)
+ @rm -f nnc_ascii_dump_load2$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_ascii_dump_load2_LINK) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
+
+nnc_bgp99extrapolation1$(EXEEXT): $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_DEPENDENCIES) $(EXTRA_nnc_bgp99extrapolation1_DEPENDENCIES)
+ @rm -f nnc_bgp99extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_bgp99extrapolation1_LINK) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
+
+nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES) $(EXTRA_nnc_bhrz03widening1_DEPENDENCIES)
+ @rm -f nnc_bhrz03widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_bhrz03widening1_LINK) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
+
+nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES) $(EXTRA_nnc_bhrz03widening2_DEPENDENCIES)
+ @rm -f nnc_bhrz03widening2$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_bhrz03widening2_LINK) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
+
+nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES) $(EXTRA_nnc_bounded1_DEPENDENCIES)
+ @rm -f nnc_bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_bounded1_LINK) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
+
+nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES) $(EXTRA_nnc_boundedaffineimage1_DEPENDENCIES)
+ @rm -f nnc_boundedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_boundedaffineimage1_LINK) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
+
+nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_nnc_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f nnc_boundedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_boundedaffinepreimage1_LINK) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
+
+nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_nnc_boundedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
+
+nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES) $(EXTRA_nnc_boundedh79extrapolation1_DEPENDENCIES)
+ @rm -f nnc_boundedh79extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_boundedh79extrapolation1_LINK) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
+
+nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES) $(EXTRA_nnc_bounds1_DEPENDENCIES)
+ @rm -f nnc_bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_bounds1_LINK) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
+
+nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES) $(EXTRA_nnc_concatenate1_DEPENDENCIES)
+ @rm -f nnc_concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_concatenate1_LINK) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
+
+nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES) $(EXTRA_nnc_congruences1_DEPENDENCIES)
+ @rm -f nnc_congruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_congruences1_LINK) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+
+nnc_constrains1$(EXEEXT): $(nnc_constrains1_OBJECTS) $(nnc_constrains1_DEPENDENCIES) $(EXTRA_nnc_constrains1_DEPENDENCIES)
+ @rm -f nnc_constrains1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_constrains1_LINK) $(nnc_constrains1_OBJECTS) $(nnc_constrains1_LDADD) $(LIBS)
+
+nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES) $(EXTRA_nnc_constraints1_DEPENDENCIES)
+ @rm -f nnc_constraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_constraints1_LINK) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
+
+nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES) $(EXTRA_nnc_contains1_DEPENDENCIES)
+ @rm -f nnc_contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_contains1_LINK) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+
+nnc_containsintegerpoint1$(EXEEXT): $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_DEPENDENCIES) $(EXTRA_nnc_containsintegerpoint1_DEPENDENCIES)
+ @rm -f nnc_containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_containsintegerpoint1_LINK) $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_LDADD) $(LIBS)
+
+nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES) $(EXTRA_nnc_disjoint1_DEPENDENCIES)
+ @rm -f nnc_disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_disjoint1_LINK) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
+
+nnc_dropsomenonintegerpoints1$(EXEEXT): $(nnc_dropsomenonintegerpoints1_OBJECTS) $(nnc_dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_nnc_dropsomenonintegerpoints1_DEPENDENCIES)
+ @rm -f nnc_dropsomenonintegerpoints1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_dropsomenonintegerpoints1_LINK) $(nnc_dropsomenonintegerpoints1_OBJECTS) $(nnc_dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES) $(EXTRA_nnc_empty1_DEPENDENCIES)
+ @rm -f nnc_empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_empty1_LINK) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
+
+nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES) $(EXTRA_nnc_equals1_DEPENDENCIES)
+ @rm -f nnc_equals1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_equals1_LINK) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
+
+nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES) $(EXTRA_nnc_exceptions1_DEPENDENCIES)
+ @rm -f nnc_exceptions1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_exceptions1_LINK) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
+
+nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES) $(EXTRA_nnc_exceptions3_DEPENDENCIES)
+ @rm -f nnc_exceptions3$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_exceptions3_LINK) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
+
+nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES) $(EXTRA_nnc_expandspacedim1_DEPENDENCIES)
+ @rm -f nnc_expandspacedim1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_expandspacedim1_LINK) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
+
+nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES) $(EXTRA_nnc_foldspacedims1_DEPENDENCIES)
+ @rm -f nnc_foldspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_foldspacedims1_LINK) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+
+nnc_frombdshape1$(EXEEXT): $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_DEPENDENCIES) $(EXTRA_nnc_frombdshape1_DEPENDENCIES)
+ @rm -f nnc_frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_frombdshape1_LINK) $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_LDADD) $(LIBS)
+
+nnc_frombox1$(EXEEXT): $(nnc_frombox1_OBJECTS) $(nnc_frombox1_DEPENDENCIES) $(EXTRA_nnc_frombox1_DEPENDENCIES)
+ @rm -f nnc_frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_frombox1_LINK) $(nnc_frombox1_OBJECTS) $(nnc_frombox1_LDADD) $(LIBS)
+
+nnc_fromgrid1$(EXEEXT): $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_DEPENDENCIES) $(EXTRA_nnc_fromgrid1_DEPENDENCIES)
+ @rm -f nnc_fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_fromgrid1_LINK) $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_LDADD) $(LIBS)
+
+nnc_fromoctagonalshape1$(EXEEXT): $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_DEPENDENCIES) $(EXTRA_nnc_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f nnc_fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_fromoctagonalshape1_LINK) $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_LDADD) $(LIBS)
+
+nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES) $(EXTRA_nnc_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f nnc_generalizedaffineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_generalizedaffineimage1_LINK) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
+
+nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_nnc_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f nnc_generalizedaffinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_generalizedaffinepreimage1_LINK) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
+
+nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES) $(EXTRA_nnc_generators1_DEPENDENCIES)
+ @rm -f nnc_generators1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_generators1_LINK) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
+
+nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES) $(EXTRA_nnc_geomcovers1_DEPENDENCIES)
+ @rm -f nnc_geomcovers1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_geomcovers1_LINK) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
+
+nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES) $(EXTRA_nnc_h79widening1_DEPENDENCIES)
+ @rm -f nnc_h79widening1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_h79widening1_LINK) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
+
+nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES) $(EXTRA_nnc_intersection1_DEPENDENCIES)
+ @rm -f nnc_intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_intersection1_LINK) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
+
+nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_nnc_limitedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_limitedbhrz03extrapolation1_LINK) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
+
+nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_nnc_limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f nnc_limitedh79extrapolation1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_limitedh79extrapolation1_LINK) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
+
+nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES) $(EXTRA_nnc_linearpartition1_DEPENDENCIES)
+ @rm -f nnc_linearpartition1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_linearpartition1_LINK) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
+
+nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES) $(EXTRA_nnc_mapspacedims1_DEPENDENCIES)
+ @rm -f nnc_mapspacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_mapspacedims1_LINK) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
+
+nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES) $(EXTRA_nnc_max_min1_DEPENDENCIES)
+ @rm -f nnc_max_min1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_max_min1_LINK) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
+
+nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES) $(EXTRA_nnc_mc91_DEPENDENCIES)
+ @rm -f nnc_mc91$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_mc91_LINK) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
+
+nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES) $(EXTRA_nnc_membytes1_DEPENDENCIES)
+ @rm -f nnc_membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_membytes1_LINK) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
+
+nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES) $(EXTRA_nnc_minconstraints1_DEPENDENCIES)
+ @rm -f nnc_minconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_minconstraints1_LINK) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
+
+nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES) $(EXTRA_nnc_mingenerators1_DEPENDENCIES)
+ @rm -f nnc_mingenerators1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_mingenerators1_LINK) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
+
+nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES) $(EXTRA_nnc_onepoint_DEPENDENCIES)
+ @rm -f nnc_onepoint$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_onepoint_LINK) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
+
+nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES) $(EXTRA_nnc_permute_DEPENDENCIES)
+ @rm -f nnc_permute$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_permute_LINK) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
+
+nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES) $(EXTRA_nnc_polydifference1_DEPENDENCIES)
+ @rm -f nnc_polydifference1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_polydifference1_LINK) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
+
+nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES) $(EXTRA_nnc_polyhull1_DEPENDENCIES)
+ @rm -f nnc_polyhull1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_polyhull1_LINK) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
+
+nnc_polyhullifexact1$(EXEEXT): $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_DEPENDENCIES) $(EXTRA_nnc_polyhullifexact1_DEPENDENCIES)
+ @rm -f nnc_polyhullifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_polyhullifexact1_LINK) $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_LDADD) $(LIBS)
+
+nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES) $(EXTRA_nnc_randphull1_DEPENDENCIES)
+ @rm -f nnc_randphull1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_randphull1_LINK) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
+
+nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES) $(EXTRA_nnc_relations1_DEPENDENCIES)
+ @rm -f nnc_relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_relations1_LINK) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
+
+nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES) $(EXTRA_nnc_relations2_DEPENDENCIES)
+ @rm -f nnc_relations2$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_relations2_LINK) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
+
+nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES) $(EXTRA_nnc_removespacedims1_DEPENDENCIES)
+ @rm -f nnc_removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_removespacedims1_LINK) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+
+nnc_simplifyusingcontext1$(EXEEXT): $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_DEPENDENCIES) $(EXTRA_nnc_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f nnc_simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_simplifyusingcontext1_LINK) $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_LDADD) $(LIBS)
+
+nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES) $(EXTRA_nnc_smm1_DEPENDENCIES)
+ @rm -f nnc_smm1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_smm1_LINK) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
+
+nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES) $(EXTRA_nnc_timeelapse1_DEPENDENCIES)
+ @rm -f nnc_timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_timeelapse1_LINK) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+
+nnc_unconstrain1$(EXEEXT): $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_DEPENDENCIES) $(EXTRA_nnc_unconstrain1_DEPENDENCIES)
+ @rm -f nnc_unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_unconstrain1_LINK) $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_LDADD) $(LIBS)
+
+nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES) $(EXTRA_nnc_universe1_DEPENDENCIES)
+ @rm -f nnc_universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_universe1_LINK) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
+
+nnc_wrap1$(EXEEXT): $(nnc_wrap1_OBJECTS) $(nnc_wrap1_DEPENDENCIES) $(EXTRA_nnc_wrap1_DEPENDENCIES)
+ @rm -f nnc_wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_wrap1_LINK) $(nnc_wrap1_OBJECTS) $(nnc_wrap1_LDADD) $(LIBS)
+
+nnc_wrap2$(EXEEXT): $(nnc_wrap2_OBJECTS) $(nnc_wrap2_DEPENDENCIES) $(EXTRA_nnc_wrap2_DEPENDENCIES)
+ @rm -f nnc_wrap2$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_wrap2_LINK) $(nnc_wrap2_OBJECTS) $(nnc_wrap2_LDADD) $(LIBS)
+
+nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES) $(EXTRA_nnc_writepolyhedron1_DEPENDENCIES)
+ @rm -f nnc_writepolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(nnc_writepolyhedron1_LINK) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
+
+nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES) $(EXTRA_nncminimize1_DEPENDENCIES)
+ @rm -f nncminimize1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
+
+nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES) $(EXTRA_nncminimize2_DEPENDENCIES)
+ @rm -f nncminimize2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
+
+nncpostimeelapse1$(EXEEXT): $(nncpostimeelapse1_OBJECTS) $(nncpostimeelapse1_DEPENDENCIES) $(EXTRA_nncpostimeelapse1_DEPENDENCIES)
+ @rm -f nncpostimeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(nncpostimeelapse1_OBJECTS) $(nncpostimeelapse1_LDADD) $(LIBS)
+
+numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES) $(EXTRA_numberinput1_DEPENDENCIES)
+ @rm -f numberinput1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
+
+onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES) $(EXTRA_onepoint_DEPENDENCIES)
+ @rm -f onepoint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
+
+permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES) $(EXTRA_permute_DEPENDENCIES)
+ @rm -f permute$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
+
+polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES) $(EXTRA_polydifference1_DEPENDENCIES)
+ @rm -f polydifference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
+
+polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES) $(EXTRA_polydifference2_DEPENDENCIES)
+ @rm -f polydifference2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
+
+polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES) $(EXTRA_polyhull1_DEPENDENCIES)
+ @rm -f polyhull1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
+
+polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES) $(EXTRA_polyhull2_DEPENDENCIES)
+ @rm -f polyhull2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
+
+polyhullifexact1$(EXEEXT): $(polyhullifexact1_OBJECTS) $(polyhullifexact1_DEPENDENCIES) $(EXTRA_polyhullifexact1_DEPENDENCIES)
+ @rm -f polyhullifexact1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhullifexact1_OBJECTS) $(polyhullifexact1_LDADD) $(LIBS)
+
+polyhullifexact2$(EXEEXT): $(polyhullifexact2_OBJECTS) $(polyhullifexact2_DEPENDENCIES) $(EXTRA_polyhullifexact2_DEPENDENCIES)
+ @rm -f polyhullifexact2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(polyhullifexact2_OBJECTS) $(polyhullifexact2_LDADD) $(LIBS)
+
+randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES) $(EXTRA_randphull1_DEPENDENCIES)
+ @rm -f randphull1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
+
+refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) $(EXTRA_refinewithcongruence1_DEPENDENCIES)
+ @rm -f refinewithcongruence1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES)
+ @rm -f refinewithcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) $(EXTRA_refinewithconstraint1_DEPENDENCIES)
+ @rm -f refinewithconstraint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES)
+ @rm -f refinewithconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) $(EXTRA_removespacedims2_DEPENDENCIES)
+ @rm -f removespacedims2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES) $(EXTRA_smm1_DEPENDENCIES)
+ @rm -f smm1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
+
+sparserow1$(EXEEXT): $(sparserow1_OBJECTS) $(sparserow1_DEPENDENCIES) $(EXTRA_sparserow1_DEPENDENCIES)
+ @rm -f sparserow1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(sparserow1_OBJECTS) $(sparserow1_LDADD) $(LIBS)
+
+termination1$(EXEEXT): $(termination1_OBJECTS) $(termination1_DEPENDENCIES) $(EXTRA_termination1_DEPENDENCIES)
+ @rm -f termination1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(termination1_OBJECTS) $(termination1_LDADD) $(LIBS)
+
+termination2$(EXEEXT): $(termination2_OBJECTS) $(termination2_DEPENDENCIES) $(EXTRA_termination2_DEPENDENCIES)
+ @rm -f termination2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(termination2_OBJECTS) $(termination2_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES) $(EXTRA_timeelapse2_DEPENDENCIES)
+ @rm -f timeelapse2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES)
+ @rm -f topclosure1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES)
+ @rm -f unconstrain1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES) $(EXTRA_universe2_DEPENDENCIES)
+ @rm -f universe2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+
+variablesset1$(EXEEXT): $(variablesset1_OBJECTS) $(variablesset1_DEPENDENCIES) $(EXTRA_variablesset1_DEPENDENCIES)
+ @rm -f variablesset1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(variablesset1_OBJECTS) $(variablesset1_LDADD) $(LIBS)
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES)
+ @rm -f watchdog1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES)
+ @rm -f weightwatch1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES)
+ @rm -f wrap1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+wrap2$(EXEEXT): $(wrap2_OBJECTS) $(wrap2_DEPENDENCIES) $(EXTRA_wrap2_DEPENDENCIES)
+ @rm -f wrap2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(wrap2_OBJECTS) $(wrap2_LDADD) $(LIBS)
+
+writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES) $(EXTRA_writeconsys1_DEPENDENCIES)
+ @rm -f writeconsys1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
+
+writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES) $(EXTRA_writegensys1_DEPENDENCIES)
+ @rm -f writegensys1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
+
+writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES) $(EXTRA_writepolyhedron1_DEPENDENCIES)
+ @rm -f writepolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
+
+writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES) $(EXTRA_writepolyhedron2_DEPENDENCIES)
+ @rm -f writepolyhedron2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
+
+writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES) $(EXTRA_writerelation1_DEPENDENCIES)
+ @rm -f writerelation1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
+
+writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES) $(EXTRA_writevariable1_DEPENDENCIES)
+ @rm -f writevariable1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cnncconversion1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dualhypercubes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hybrid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearexpression1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearsystem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/matrix1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affineimage1-affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinetrans-affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append1-append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append2-append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounded1-bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounds1-bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_concatenate1-concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constrains1-constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constraints1-constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_contains1-contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_disjoint1-disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_empty1-empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_equals1-equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions1-exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions3-exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombdshape1-frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombox1-frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromgrid1-fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generators1-generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_h79widening1-h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_intersection1-intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_max_min1-max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mc91-mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes1-membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_onepoint-onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_permute-permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polydifference1-polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhull1-polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull1-randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations1-relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations2-relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_smm1-smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_unconstrain1-unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_universe1-universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_wrap1-wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_wrap2-wrap2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncpostimeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/numberinput1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhullifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhullifexact2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sparserow1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/variablesset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeconsys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writegensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writerelation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writevariable1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+nnc_addcongruence1-addcongruence1.o: addcongruence1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+
+nnc_addcongruence1-addcongruence1.obj: addcongruence1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+
+nnc_addcongruences1-addcongruences1.o: addcongruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+
+nnc_addcongruences1-addcongruences1.obj: addcongruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+
+nnc_addconstraint1-addconstraint1.o: addconstraint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+
+nnc_addconstraint1-addconstraint1.obj: addconstraint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+
+nnc_addconstraints1-addconstraints1.o: addconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+
+nnc_addconstraints1-addconstraints1.obj: addconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+
+nnc_addgenerator1-addgenerator1.o: addgenerator1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+
+nnc_addgenerator1-addgenerator1.obj: addgenerator1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+
+nnc_addgenerators1-addgenerators1.o: addgenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+
+nnc_addgenerators1-addgenerators1.obj: addgenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+
+nnc_addspacedims1-addspacedims1.o: addspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+
+nnc_addspacedims1-addspacedims1.obj: addspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+
+nnc_affineimage1-affineimage1.o: affineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.o -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affineimage1.cc' object='nnc_affineimage1-affineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+
+nnc_affineimage1-affineimage1.obj: affineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affineimage1.cc' object='nnc_affineimage1-affineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+
+nnc_affinepreimage1-affinepreimage1.o: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+
+nnc_affinepreimage1-affinepreimage1.obj: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+
+nnc_affinetrans-affinetrans.o: affinetrans.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.o -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affinetrans.cc' object='nnc_affinetrans-affinetrans.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+
+nnc_affinetrans-affinetrans.obj: affinetrans.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.obj -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='affinetrans.cc' object='nnc_affinetrans-affinetrans.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+
+nnc_append1-append1.o: append1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.o -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='append1.cc' object='nnc_append1-append1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+
+nnc_append1-append1.obj: append1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.obj -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='append1.cc' object='nnc_append1-append1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+
+nnc_append2-append2.o: append2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.o -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='append2.cc' object='nnc_append2-append2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+
+nnc_append2-append2.obj: append2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.obj -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='append2.cc' object='nnc_append2-append2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+
+nnc_ascii_dump_load1-ascii_dump_load1.o: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+
+nnc_ascii_dump_load1-ascii_dump_load1.obj: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+
+nnc_ascii_dump_load2-ascii_dump_load2.o: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+
+nnc_ascii_dump_load2-ascii_dump_load2.obj: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.o: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.obj: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+
+nnc_bhrz03widening1-bhrz03widening1.o: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+
+nnc_bhrz03widening1-bhrz03widening1.obj: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+
+nnc_bhrz03widening2-bhrz03widening2.o: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+
+nnc_bhrz03widening2-bhrz03widening2.obj: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+
+nnc_bounded1-bounded1.o: bounded1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.o -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bounded1.cc' object='nnc_bounded1-bounded1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+
+nnc_bounded1-bounded1.obj: bounded1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.obj -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bounded1.cc' object='nnc_bounded1-bounded1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+
+nnc_boundedaffineimage1-boundedaffineimage1.o: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+
+nnc_boundedaffineimage1-boundedaffineimage1.obj: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.o: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1. [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.o: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bound [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrapolation1.cc'; fi`
+
+nnc_bounds1-bounds1.o: bounds1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.o -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bounds1.cc' object='nnc_bounds1-bounds1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+
+nnc_bounds1-bounds1.obj: bounds1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.obj -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bounds1.cc' object='nnc_bounds1-bounds1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+
+nnc_concatenate1-concatenate1.o: concatenate1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.o -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='concatenate1.cc' object='nnc_concatenate1-concatenate1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+
+nnc_concatenate1-concatenate1.obj: concatenate1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.obj -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='concatenate1.cc' object='nnc_concatenate1-concatenate1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+
+nnc_congruences1-congruences1.o: congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.o -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruences1.cc' object='nnc_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+
+nnc_congruences1-congruences1.obj: congruences1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.obj -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='congruences1.cc' object='nnc_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+
+nnc_constrains1-constrains1.o: constrains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.o -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constrains1.cc' object='nnc_constrains1-constrains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+
+nnc_constrains1-constrains1.obj: constrains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.obj -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constrains1.cc' object='nnc_constrains1-constrains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+
+nnc_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.o -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraints1.cc' object='nnc_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+
+nnc_constraints1-constraints1.obj: constraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.obj -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constraints1.cc' object='nnc_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+
+nnc_contains1-contains1.o: contains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.o -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contains1.cc' object='nnc_contains1-contains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+
+nnc_contains1-contains1.obj: contains1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.obj -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contains1.cc' object='nnc_contains1-contains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+
+nnc_containsintegerpoint1-containsintegerpoint1.o: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.o -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+
+nnc_containsintegerpoint1-containsintegerpoint1.obj: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.obj -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+
+nnc_disjoint1-disjoint1.o: disjoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.o -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='disjoint1.cc' object='nnc_disjoint1-disjoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+
+nnc_disjoint1-disjoint1.obj: disjoint1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.obj -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='disjoint1.cc' object='nnc_disjoint1-disjoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+
+nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o: dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o -MD -MP -MF $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o `test -f 'dropsomenonintegerpoints1.cc' || echo '$(srcdir)/'`dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dropsomenonintegerpoints1.cc' object='nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o `test -f 'dropsomenonintegerpoints1.cc' || echo '$(srcdir)/'`dropsomenonintegerpoints1.cc
+
+nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj: dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj -MD -MP -MF $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj `if test -f 'dropsomenonintegerpoints1.cc'; then $(CYGPATH_W) 'dropsomenonintegerpoints1.cc'; else $(CYGPATH_W) '$(srcd [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dropsomenonintegerpoints1.cc' object='nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj `if test -f 'dropsomenonintegerpoints1.cc'; then $(CYGPATH_W) 'dropsomenonintegerpoints1.cc'; else $(CYGPATH_W) '$(srcdir)/dropsomenonintegerpoints1.cc'; fi`
+
+nnc_empty1-empty1.o: empty1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.o -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='empty1.cc' object='nnc_empty1-empty1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+
+nnc_empty1-empty1.obj: empty1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.obj -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='empty1.cc' object='nnc_empty1-empty1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+
+nnc_equals1-equals1.o: equals1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.o -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='equals1.cc' object='nnc_equals1-equals1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+
+nnc_equals1-equals1.obj: equals1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.obj -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='equals1.cc' object='nnc_equals1-equals1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+
+nnc_exceptions1-exceptions1.o: exceptions1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.o -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='exceptions1.cc' object='nnc_exceptions1-exceptions1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+
+nnc_exceptions1-exceptions1.obj: exceptions1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='exceptions1.cc' object='nnc_exceptions1-exceptions1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+
+nnc_exceptions3-exceptions3.o: exceptions3.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.o -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='exceptions3.cc' object='nnc_exceptions3-exceptions3.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+
+nnc_exceptions3-exceptions3.obj: exceptions3.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='exceptions3.cc' object='nnc_exceptions3-exceptions3.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+
+nnc_expandspacedim1-expandspacedim1.o: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.o -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+
+nnc_expandspacedim1-expandspacedim1.obj: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.obj -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+
+nnc_foldspacedims1-foldspacedims1.o: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+
+nnc_foldspacedims1-foldspacedims1.obj: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+
+nnc_frombdshape1-frombdshape1.o: frombdshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.o -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+
+nnc_frombdshape1-frombdshape1.obj: frombdshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.obj -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+
+nnc_frombox1-frombox1.o: frombox1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.o -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frombox1.cc' object='nnc_frombox1-frombox1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+
+nnc_frombox1-frombox1.obj: frombox1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.obj -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='frombox1.cc' object='nnc_frombox1-frombox1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+
+nnc_fromgrid1-fromgrid1.o: fromgrid1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.o -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+
+nnc_fromgrid1-fromgrid1.obj: fromgrid1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.obj -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.o: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.o -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.obj: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.obj -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.o: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.obj: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaff [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi`
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffinepreimage1.cc'; fi`
+
+nnc_generators1-generators1.o: generators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.o -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generators1.cc' object='nnc_generators1-generators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+
+nnc_generators1-generators1.obj: generators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.obj -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='generators1.cc' object='nnc_generators1-generators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+
+nnc_geomcovers1-geomcovers1.o: geomcovers1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.o -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+
+nnc_geomcovers1-geomcovers1.obj: geomcovers1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.obj -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+
+nnc_h79widening1-h79widening1.o: h79widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.o -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='h79widening1.cc' object='nnc_h79widening1-h79widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+
+nnc_h79widening1-h79widening1.obj: h79widening1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.obj -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='h79widening1.cc' object='nnc_h79widening1-h79widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+
+nnc_intersection1-intersection1.o: intersection1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.o -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='intersection1.cc' object='nnc_intersection1-intersection1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+
+nnc_intersection1-intersection1.obj: intersection1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.obj -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='intersection1.cc' object='nnc_intersection1-intersection1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $( [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi`
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.o: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limit [...]
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrapolation1.cc'; fi`
+
+nnc_linearpartition1-linearpartition1.o: linearpartition1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.o -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+
+nnc_linearpartition1-linearpartition1.obj: linearpartition1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.obj -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+
+nnc_mapspacedims1-mapspacedims1.o: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+
+nnc_mapspacedims1-mapspacedims1.obj: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+
+nnc_max_min1-max_min1.o: max_min1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.o -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='max_min1.cc' object='nnc_max_min1-max_min1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+
+nnc_max_min1-max_min1.obj: max_min1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.obj -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='max_min1.cc' object='nnc_max_min1-max_min1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+
+nnc_mc91-mc91.o: mc91.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.o -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mc91.cc' object='nnc_mc91-mc91.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+
+nnc_mc91-mc91.obj: mc91.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.obj -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mc91.cc' object='nnc_mc91-mc91.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+
+nnc_membytes1-membytes1.o: membytes1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.o -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='membytes1.cc' object='nnc_membytes1-membytes1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+
+nnc_membytes1-membytes1.obj: membytes1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.obj -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='membytes1.cc' object='nnc_membytes1-membytes1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+
+nnc_minconstraints1-minconstraints1.o: minconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+
+nnc_minconstraints1-minconstraints1.obj: minconstraints1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+
+nnc_mingenerators1-mingenerators1.o: mingenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.o -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+
+nnc_mingenerators1-mingenerators1.obj: mingenerators1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+
+nnc_onepoint-onepoint.o: onepoint.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.o -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='onepoint.cc' object='nnc_onepoint-onepoint.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+
+nnc_onepoint-onepoint.obj: onepoint.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.obj -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='onepoint.cc' object='nnc_onepoint-onepoint.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+
+nnc_permute-permute.o: permute.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.o -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='permute.cc' object='nnc_permute-permute.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+
+nnc_permute-permute.obj: permute.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.obj -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='permute.cc' object='nnc_permute-permute.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+
+nnc_polydifference1-polydifference1.o: polydifference1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.o -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polydifference1.cc' object='nnc_polydifference1-polydifference1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+
+nnc_polydifference1-polydifference1.obj: polydifference1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.obj -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polydifference1.cc' object='nnc_polydifference1-polydifference1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+
+nnc_polyhull1-polyhull1.o: polyhull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.o -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polyhull1.cc' object='nnc_polyhull1-polyhull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+
+nnc_polyhull1-polyhull1.obj: polyhull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.obj -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polyhull1.cc' object='nnc_polyhull1-polyhull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+
+nnc_polyhullifexact1-polyhullifexact1.o: polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhullifexact1-polyhullifexact1.o -MD -MP -MF $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo -c -o nnc_polyhullifexact1-polyhullifexact1.o `test -f 'polyhullifexact1.cc' || echo '$(srcdir)/'`polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhullifexact1-polyhullifexact1.o `test -f 'polyhullifexact1.cc' || echo '$(srcdir)/'`polyhullifexact1.cc
+
+nnc_polyhullifexact1-polyhullifexact1.obj: polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhullifexact1-polyhullifexact1.obj -MD -MP -MF $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo -c -o nnc_polyhullifexact1-polyhullifexact1.obj `if test -f 'polyhullifexact1.cc'; then $(CYGPATH_W) 'polyhullifexact1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhullifexact1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhullifexact1-polyhullifexact1.obj `if test -f 'polyhullifexact1.cc'; then $(CYGPATH_W) 'polyhullifexact1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhullifexact1.cc'; fi`
+
+nnc_randphull1-randphull1.o: randphull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.o -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='randphull1.cc' object='nnc_randphull1-randphull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+
+nnc_randphull1-randphull1.obj: randphull1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.obj -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='randphull1.cc' object='nnc_randphull1-randphull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+
+nnc_relations1-relations1.o: relations1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.o -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='relations1.cc' object='nnc_relations1-relations1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+
+nnc_relations1-relations1.obj: relations1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.obj -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='relations1.cc' object='nnc_relations1-relations1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+
+nnc_relations2-relations2.o: relations2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.o -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='relations2.cc' object='nnc_relations2-relations2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+
+nnc_relations2-relations2.obj: relations2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.obj -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='relations2.cc' object='nnc_relations2-relations2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+
+nnc_removespacedims1-removespacedims1.o: removespacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.o -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+
+nnc_removespacedims1-removespacedims1.obj: removespacedims1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+
+nnc_simplifyusingcontext1-simplifyusingcontext1.o: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.o -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+
+nnc_simplifyusingcontext1-simplifyusingcontext1.obj: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.obj -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+
+nnc_smm1-smm1.o: smm1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.o -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='smm1.cc' object='nnc_smm1-smm1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+
+nnc_smm1-smm1.obj: smm1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.obj -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='smm1.cc' object='nnc_smm1-smm1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+
+nnc_timeelapse1-timeelapse1.o: timeelapse1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.o -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+
+nnc_timeelapse1-timeelapse1.obj: timeelapse1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.obj -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+
+nnc_unconstrain1-unconstrain1.o: unconstrain1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.o -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+
+nnc_unconstrain1-unconstrain1.obj: unconstrain1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.obj -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+
+nnc_universe1-universe1.o: universe1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.o -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='universe1.cc' object='nnc_universe1-universe1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+
+nnc_universe1-universe1.obj: universe1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.obj -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='universe1.cc' object='nnc_universe1-universe1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+
+nnc_wrap1-wrap1.o: wrap1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap1-wrap1.o -MD -MP -MF $(DEPDIR)/nnc_wrap1-wrap1.Tpo -c -o nnc_wrap1-wrap1.o `test -f 'wrap1.cc' || echo '$(srcdir)/'`wrap1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap1-wrap1.Tpo $(DEPDIR)/nnc_wrap1-wrap1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wrap1.cc' object='nnc_wrap1-wrap1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap1-wrap1.o `test -f 'wrap1.cc' || echo '$(srcdir)/'`wrap1.cc
+
+nnc_wrap1-wrap1.obj: wrap1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap1-wrap1.obj -MD -MP -MF $(DEPDIR)/nnc_wrap1-wrap1.Tpo -c -o nnc_wrap1-wrap1.obj `if test -f 'wrap1.cc'; then $(CYGPATH_W) 'wrap1.cc'; else $(CYGPATH_W) '$(srcdir)/wrap1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap1-wrap1.Tpo $(DEPDIR)/nnc_wrap1-wrap1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wrap1.cc' object='nnc_wrap1-wrap1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap1-wrap1.obj `if test -f 'wrap1.cc'; then $(CYGPATH_W) 'wrap1.cc'; else $(CYGPATH_W) '$(srcdir)/wrap1.cc'; fi`
+
+nnc_wrap2-wrap2.o: wrap2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap2-wrap2.o -MD -MP -MF $(DEPDIR)/nnc_wrap2-wrap2.Tpo -c -o nnc_wrap2-wrap2.o `test -f 'wrap2.cc' || echo '$(srcdir)/'`wrap2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap2-wrap2.Tpo $(DEPDIR)/nnc_wrap2-wrap2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wrap2.cc' object='nnc_wrap2-wrap2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap2-wrap2.o `test -f 'wrap2.cc' || echo '$(srcdir)/'`wrap2.cc
+
+nnc_wrap2-wrap2.obj: wrap2.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap2-wrap2.obj -MD -MP -MF $(DEPDIR)/nnc_wrap2-wrap2.Tpo -c -o nnc_wrap2-wrap2.obj `if test -f 'wrap2.cc'; then $(CYGPATH_W) 'wrap2.cc'; else $(CYGPATH_W) '$(srcdir)/wrap2.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap2-wrap2.Tpo $(DEPDIR)/nnc_wrap2-wrap2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wrap2.cc' object='nnc_wrap2-wrap2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap2-wrap2.obj `if test -f 'wrap2.cc'; then $(CYGPATH_W) 'wrap2.cc'; else $(CYGPATH_W) '$(srcdir)/wrap2.cc'; fi`
+
+nnc_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+
+nnc_writepolyhedron1-writepolyhedron1.obj: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+addcongruence1.log: addcongruence1$(EXEEXT)
+ @p='addcongruence1$(EXEEXT)'; \
+ b='addcongruence1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addcongruences1.log: addcongruences1$(EXEEXT)
+ @p='addcongruences1$(EXEEXT)'; \
+ b='addcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraint1.log: addconstraint1$(EXEEXT)
+ @p='addconstraint1$(EXEEXT)'; \
+ b='addconstraint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+ @p='addconstraints1$(EXEEXT)'; \
+ b='addconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints2.log: addconstraints2$(EXEEXT)
+ @p='addconstraints2$(EXEEXT)'; \
+ b='addconstraints2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator1.log: addgenerator1$(EXEEXT)
+ @p='addgenerator1$(EXEEXT)'; \
+ b='addgenerator1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator2.log: addgenerator2$(EXEEXT)
+ @p='addgenerator2$(EXEEXT)'; \
+ b='addgenerator2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators1.log: addgenerators1$(EXEEXT)
+ @p='addgenerators1$(EXEEXT)'; \
+ b='addgenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators2.log: addgenerators2$(EXEEXT)
+ @p='addgenerators2$(EXEEXT)'; \
+ b='addgenerators2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims1.log: addspacedims1$(EXEEXT)
+ @p='addspacedims1$(EXEEXT)'; \
+ b='addspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims2.log: addspacedims2$(EXEEXT)
+ @p='addspacedims2$(EXEEXT)'; \
+ b='addspacedims2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+ @p='affineimage1$(EXEEXT)'; \
+ b='affineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage2.log: affineimage2$(EXEEXT)
+ @p='affineimage2$(EXEEXT)'; \
+ b='affineimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+ @p='affinepreimage1$(EXEEXT)'; \
+ b='affinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinetrans.log: affinetrans$(EXEEXT)
+ @p='affinetrans$(EXEEXT)'; \
+ b='affinetrans'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+append1.log: append1$(EXEEXT)
+ @p='append1$(EXEEXT)'; \
+ b='append1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+append2.log: append2$(EXEEXT)
+ @p='append2$(EXEEXT)'; \
+ b='append2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+ @p='ascii_dump_load1$(EXEEXT)'; \
+ b='ascii_dump_load1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load2.log: ascii_dump_load2$(EXEEXT)
+ @p='ascii_dump_load2$(EXEEXT)'; \
+ b='ascii_dump_load2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load3.log: ascii_dump_load3$(EXEEXT)
+ @p='ascii_dump_load3$(EXEEXT)'; \
+ b='ascii_dump_load3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bgp99extrapolation1.log: bgp99extrapolation1$(EXEEXT)
+ @p='bgp99extrapolation1$(EXEEXT)'; \
+ b='bgp99extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bgp99extrapolation2.log: bgp99extrapolation2$(EXEEXT)
+ @p='bgp99extrapolation2$(EXEEXT)'; \
+ b='bgp99extrapolation2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening1.log: bhrz03widening1$(EXEEXT)
+ @p='bhrz03widening1$(EXEEXT)'; \
+ b='bhrz03widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening2.log: bhrz03widening2$(EXEEXT)
+ @p='bhrz03widening2$(EXEEXT)'; \
+ b='bhrz03widening2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening3.log: bhrz03widening3$(EXEEXT)
+ @p='bhrz03widening3$(EXEEXT)'; \
+ b='bhrz03widening3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bhz03widening1.log: bhz03widening1$(EXEEXT)
+ @p='bhz03widening1$(EXEEXT)'; \
+ b='bhz03widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+ @p='bounded1$(EXEEXT)'; \
+ b='bounded1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+ @p='boundedaffineimage1$(EXEEXT)'; \
+ b='boundedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffinepreimage1.log: boundedaffinepreimage1$(EXEEXT)
+ @p='boundedaffinepreimage1$(EXEEXT)'; \
+ b='boundedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedbhrz03extrapolation1.log: boundedbhrz03extrapolation1$(EXEEXT)
+ @p='boundedbhrz03extrapolation1$(EXEEXT)'; \
+ b='boundedbhrz03extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedh79extrapolation1.log: boundedh79extrapolation1$(EXEEXT)
+ @p='boundedh79extrapolation1$(EXEEXT)'; \
+ b='boundedh79extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+ @p='bounds1$(EXEEXT)'; \
+ b='bounds1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cnncconversion1.log: cnncconversion1$(EXEEXT)
+ @p='cnncconversion1$(EXEEXT)'; \
+ b='cnncconversion1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+ @p='concatenate1$(EXEEXT)'; \
+ b='concatenate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+ @p='congruences1$(EXEEXT)'; \
+ b='congruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+constrains1.log: constrains1$(EXEEXT)
+ @p='constrains1$(EXEEXT)'; \
+ b='constrains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+ @p='constraints1$(EXEEXT)'; \
+ b='constraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+ @p='contains1$(EXEEXT)'; \
+ b='contains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contains2.log: contains2$(EXEEXT)
+ @p='contains2$(EXEEXT)'; \
+ b='contains2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+ @p='containsintegerpoint1$(EXEEXT)'; \
+ b='containsintegerpoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+ @p='disjoint1$(EXEEXT)'; \
+ b='disjoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint2.log: disjoint2$(EXEEXT)
+ @p='disjoint2$(EXEEXT)'; \
+ b='disjoint2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints1.log: dropsomenonintegerpoints1$(EXEEXT)
+ @p='dropsomenonintegerpoints1$(EXEEXT)'; \
+ b='dropsomenonintegerpoints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints2.log: dropsomenonintegerpoints2$(EXEEXT)
+ @p='dropsomenonintegerpoints2$(EXEEXT)'; \
+ b='dropsomenonintegerpoints2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+dualhypercubes.log: dualhypercubes$(EXEEXT)
+ @p='dualhypercubes$(EXEEXT)'; \
+ b='dualhypercubes'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+empty1.log: empty1$(EXEEXT)
+ @p='empty1$(EXEEXT)'; \
+ b='empty1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+ @p='equals1$(EXEEXT)'; \
+ b='equals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+ @p='exceptions1$(EXEEXT)'; \
+ b='exceptions1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions2.log: exceptions2$(EXEEXT)
+ @p='exceptions2$(EXEEXT)'; \
+ b='exceptions2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions3.log: exceptions3$(EXEEXT)
+ @p='exceptions3$(EXEEXT)'; \
+ b='exceptions3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim1.log: expandspacedim1$(EXEEXT)
+ @p='expandspacedim1$(EXEEXT)'; \
+ b='expandspacedim1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim2.log: expandspacedim2$(EXEEXT)
+ @p='expandspacedim2$(EXEEXT)'; \
+ b='expandspacedim2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims1.log: foldspacedims1$(EXEEXT)
+ @p='foldspacedims1$(EXEEXT)'; \
+ b='foldspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims2.log: foldspacedims2$(EXEEXT)
+ @p='foldspacedims2$(EXEEXT)'; \
+ b='foldspacedims2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frequency1.log: frequency1$(EXEEXT)
+ @p='frequency1$(EXEEXT)'; \
+ b='frequency1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+ @p='frombdshape1$(EXEEXT)'; \
+ b='frombdshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+ @p='frombox1$(EXEEXT)'; \
+ b='frombox1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox2.log: frombox2$(EXEEXT)
+ @p='frombox2$(EXEEXT)'; \
+ b='frombox2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+ @p='fromgrid1$(EXEEXT)'; \
+ b='fromgrid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+ @p='fromoctagonalshape1$(EXEEXT)'; \
+ b='fromoctagonalshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+ @p='generalizedaffineimage1$(EXEEXT)'; \
+ b='generalizedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage2.log: generalizedaffineimage2$(EXEEXT)
+ @p='generalizedaffineimage2$(EXEEXT)'; \
+ b='generalizedaffineimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage1.log: generalizedaffinepreimage1$(EXEEXT)
+ @p='generalizedaffinepreimage1$(EXEEXT)'; \
+ b='generalizedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage2.log: generalizedaffinepreimage2$(EXEEXT)
+ @p='generalizedaffinepreimage2$(EXEEXT)'; \
+ b='generalizedaffinepreimage2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+generators1.log: generators1$(EXEEXT)
+ @p='generators1$(EXEEXT)'; \
+ b='generators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+geomcovers1.log: geomcovers1$(EXEEXT)
+ @p='geomcovers1$(EXEEXT)'; \
+ b='geomcovers1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+h79widening1.log: h79widening1$(EXEEXT)
+ @p='h79widening1$(EXEEXT)'; \
+ b='h79widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+h79widening2.log: h79widening2$(EXEEXT)
+ @p='h79widening2$(EXEEXT)'; \
+ b='h79widening2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+hybrid.log: hybrid$(EXEEXT)
+ @p='hybrid$(EXEEXT)'; \
+ b='hybrid'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+ @p='intersection1$(EXEEXT)'; \
+ b='intersection1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedbhrz03extrapolation1.log: limitedbhrz03extrapolation1$(EXEEXT)
+ @p='limitedbhrz03extrapolation1$(EXEEXT)'; \
+ b='limitedbhrz03extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedh79extrapolation1.log: limitedh79extrapolation1$(EXEEXT)
+ @p='limitedh79extrapolation1$(EXEEXT)'; \
+ b='limitedh79extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+linearexpression1.log: linearexpression1$(EXEEXT)
+ @p='linearexpression1$(EXEEXT)'; \
+ b='linearexpression1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+linearpartition1.log: linearpartition1$(EXEEXT)
+ @p='linearpartition1$(EXEEXT)'; \
+ b='linearpartition1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+linearsystem1.log: linearsystem1$(EXEEXT)
+ @p='linearsystem1$(EXEEXT)'; \
+ b='linearsystem1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mapspacedims1.log: mapspacedims1$(EXEEXT)
+ @p='mapspacedims1$(EXEEXT)'; \
+ b='mapspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+matrix1.log: matrix1$(EXEEXT)
+ @p='matrix1$(EXEEXT)'; \
+ b='matrix1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+max_min1.log: max_min1$(EXEEXT)
+ @p='max_min1$(EXEEXT)'; \
+ b='max_min1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+maxspacedim1.log: maxspacedim1$(EXEEXT)
+ @p='maxspacedim1$(EXEEXT)'; \
+ b='maxspacedim1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mc91.log: mc91$(EXEEXT)
+ @p='mc91$(EXEEXT)'; \
+ b='mc91'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+ @p='membytes1$(EXEEXT)'; \
+ b='membytes1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+memory2.log: memory2$(EXEEXT)
+ @p='memory2$(EXEEXT)'; \
+ b='memory2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+minconstraints1.log: minconstraints1$(EXEEXT)
+ @p='minconstraints1$(EXEEXT)'; \
+ b='minconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+minconstraints2.log: minconstraints2$(EXEEXT)
+ @p='minconstraints2$(EXEEXT)'; \
+ b='minconstraints2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators1.log: mingenerators1$(EXEEXT)
+ @p='mingenerators1$(EXEEXT)'; \
+ b='mingenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators2.log: mingenerators2$(EXEEXT)
+ @p='mingenerators2$(EXEEXT)'; \
+ b='mingenerators2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nncminimize1.log: nncminimize1$(EXEEXT)
+ @p='nncminimize1$(EXEEXT)'; \
+ b='nncminimize1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nncminimize2.log: nncminimize2$(EXEEXT)
+ @p='nncminimize2$(EXEEXT)'; \
+ b='nncminimize2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nncpostimeelapse1.log: nncpostimeelapse1$(EXEEXT)
+ @p='nncpostimeelapse1$(EXEEXT)'; \
+ b='nncpostimeelapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+numberinput1.log: numberinput1$(EXEEXT)
+ @p='numberinput1$(EXEEXT)'; \
+ b='numberinput1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+onepoint.log: onepoint$(EXEEXT)
+ @p='onepoint$(EXEEXT)'; \
+ b='onepoint'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+permute.log: permute$(EXEEXT)
+ @p='permute$(EXEEXT)'; \
+ b='permute'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polydifference1.log: polydifference1$(EXEEXT)
+ @p='polydifference1$(EXEEXT)'; \
+ b='polydifference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polydifference2.log: polydifference2$(EXEEXT)
+ @p='polydifference2$(EXEEXT)'; \
+ b='polydifference2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhull1.log: polyhull1$(EXEEXT)
+ @p='polyhull1$(EXEEXT)'; \
+ b='polyhull1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhull2.log: polyhull2$(EXEEXT)
+ @p='polyhull2$(EXEEXT)'; \
+ b='polyhull2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhullifexact1.log: polyhullifexact1$(EXEEXT)
+ @p='polyhullifexact1$(EXEEXT)'; \
+ b='polyhullifexact1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhullifexact2.log: polyhullifexact2$(EXEEXT)
+ @p='polyhullifexact2$(EXEEXT)'; \
+ b='polyhullifexact2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+randphull1.log: randphull1$(EXEEXT)
+ @p='randphull1$(EXEEXT)'; \
+ b='randphull1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruence1.log: refinewithcongruence1$(EXEEXT)
+ @p='refinewithcongruence1$(EXEEXT)'; \
+ b='refinewithcongruence1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+ @p='refinewithcongruences1$(EXEEXT)'; \
+ b='refinewithcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraint1.log: refinewithconstraint1$(EXEEXT)
+ @p='refinewithconstraint1$(EXEEXT)'; \
+ b='refinewithconstraint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+ @p='refinewithconstraints1$(EXEEXT)'; \
+ b='refinewithconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+ @p='relations1$(EXEEXT)'; \
+ b='relations1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations2.log: relations2$(EXEEXT)
+ @p='relations2$(EXEEXT)'; \
+ b='relations2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relations3.log: relations3$(EXEEXT)
+ @p='relations3$(EXEEXT)'; \
+ b='relations3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims1.log: removespacedims1$(EXEEXT)
+ @p='removespacedims1$(EXEEXT)'; \
+ b='removespacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims2.log: removespacedims2$(EXEEXT)
+ @p='removespacedims2$(EXEEXT)'; \
+ b='removespacedims2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+ @p='simplifyusingcontext1$(EXEEXT)'; \
+ b='simplifyusingcontext1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+smm1.log: smm1$(EXEEXT)
+ @p='smm1$(EXEEXT)'; \
+ b='smm1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+sparserow1.log: sparserow1$(EXEEXT)
+ @p='sparserow1$(EXEEXT)'; \
+ b='sparserow1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+termination1.log: termination1$(EXEEXT)
+ @p='termination1$(EXEEXT)'; \
+ b='termination1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+termination2.log: termination2$(EXEEXT)
+ @p='termination2$(EXEEXT)'; \
+ b='termination2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+ @p='timeelapse1$(EXEEXT)'; \
+ b='timeelapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse2.log: timeelapse2$(EXEEXT)
+ @p='timeelapse2$(EXEEXT)'; \
+ b='timeelapse2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+ @p='topclosed1$(EXEEXT)'; \
+ b='topclosed1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+ @p='topclosure1$(EXEEXT)'; \
+ b='topclosure1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unconstrain1.log: unconstrain1$(EXEEXT)
+ @p='unconstrain1$(EXEEXT)'; \
+ b='unconstrain1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+universe1.log: universe1$(EXEEXT)
+ @p='universe1$(EXEEXT)'; \
+ b='universe1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+universe2.log: universe2$(EXEEXT)
+ @p='universe2$(EXEEXT)'; \
+ b='universe2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+variablesset1.log: variablesset1$(EXEEXT)
+ @p='variablesset1$(EXEEXT)'; \
+ b='variablesset1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+watchdog1.log: watchdog1$(EXEEXT)
+ @p='watchdog1$(EXEEXT)'; \
+ b='watchdog1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+ @p='weightwatch1$(EXEEXT)'; \
+ b='weightwatch1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap1.log: wrap1$(EXEEXT)
+ @p='wrap1$(EXEEXT)'; \
+ b='wrap1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap2.log: wrap2$(EXEEXT)
+ @p='wrap2$(EXEEXT)'; \
+ b='wrap2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writeconsys1.log: writeconsys1$(EXEEXT)
+ @p='writeconsys1$(EXEEXT)'; \
+ b='writeconsys1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writegensys1.log: writegensys1$(EXEEXT)
+ @p='writegensys1$(EXEEXT)'; \
+ b='writegensys1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writepolyhedron1.log: writepolyhedron1$(EXEEXT)
+ @p='writepolyhedron1$(EXEEXT)'; \
+ b='writepolyhedron1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writepolyhedron2.log: writepolyhedron2$(EXEEXT)
+ @p='writepolyhedron2$(EXEEXT)'; \
+ b='writepolyhedron2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writerelation1.log: writerelation1$(EXEEXT)
+ @p='writerelation1$(EXEEXT)'; \
+ b='writerelation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+writevariable1.log: writevariable1$(EXEEXT)
+ @p='writevariable1$(EXEEXT)'; \
+ b='writevariable1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addcongruence1.log: nnc_addcongruence1$(EXEEXT)
+ @p='nnc_addcongruence1$(EXEEXT)'; \
+ b='nnc_addcongruence1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addcongruences1.log: nnc_addcongruences1$(EXEEXT)
+ @p='nnc_addcongruences1$(EXEEXT)'; \
+ b='nnc_addcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addconstraint1.log: nnc_addconstraint1$(EXEEXT)
+ @p='nnc_addconstraint1$(EXEEXT)'; \
+ b='nnc_addconstraint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addconstraints1.log: nnc_addconstraints1$(EXEEXT)
+ @p='nnc_addconstraints1$(EXEEXT)'; \
+ b='nnc_addconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addgenerator1.log: nnc_addgenerator1$(EXEEXT)
+ @p='nnc_addgenerator1$(EXEEXT)'; \
+ b='nnc_addgenerator1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addgenerators1.log: nnc_addgenerators1$(EXEEXT)
+ @p='nnc_addgenerators1$(EXEEXT)'; \
+ b='nnc_addgenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addspacedims1.log: nnc_addspacedims1$(EXEEXT)
+ @p='nnc_addspacedims1$(EXEEXT)'; \
+ b='nnc_addspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affineimage1.log: nnc_affineimage1$(EXEEXT)
+ @p='nnc_affineimage1$(EXEEXT)'; \
+ b='nnc_affineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affinepreimage1.log: nnc_affinepreimage1$(EXEEXT)
+ @p='nnc_affinepreimage1$(EXEEXT)'; \
+ b='nnc_affinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affinetrans.log: nnc_affinetrans$(EXEEXT)
+ @p='nnc_affinetrans$(EXEEXT)'; \
+ b='nnc_affinetrans'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_append1.log: nnc_append1$(EXEEXT)
+ @p='nnc_append1$(EXEEXT)'; \
+ b='nnc_append1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_append2.log: nnc_append2$(EXEEXT)
+ @p='nnc_append2$(EXEEXT)'; \
+ b='nnc_append2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_ascii_dump_load1.log: nnc_ascii_dump_load1$(EXEEXT)
+ @p='nnc_ascii_dump_load1$(EXEEXT)'; \
+ b='nnc_ascii_dump_load1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_ascii_dump_load2.log: nnc_ascii_dump_load2$(EXEEXT)
+ @p='nnc_ascii_dump_load2$(EXEEXT)'; \
+ b='nnc_ascii_dump_load2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bgp99extrapolation1.log: nnc_bgp99extrapolation1$(EXEEXT)
+ @p='nnc_bgp99extrapolation1$(EXEEXT)'; \
+ b='nnc_bgp99extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bhrz03widening1.log: nnc_bhrz03widening1$(EXEEXT)
+ @p='nnc_bhrz03widening1$(EXEEXT)'; \
+ b='nnc_bhrz03widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bhrz03widening2.log: nnc_bhrz03widening2$(EXEEXT)
+ @p='nnc_bhrz03widening2$(EXEEXT)'; \
+ b='nnc_bhrz03widening2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bounded1.log: nnc_bounded1$(EXEEXT)
+ @p='nnc_bounded1$(EXEEXT)'; \
+ b='nnc_bounded1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedaffineimage1.log: nnc_boundedaffineimage1$(EXEEXT)
+ @p='nnc_boundedaffineimage1$(EXEEXT)'; \
+ b='nnc_boundedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedaffinepreimage1.log: nnc_boundedaffinepreimage1$(EXEEXT)
+ @p='nnc_boundedaffinepreimage1$(EXEEXT)'; \
+ b='nnc_boundedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedbhrz03extrapolation1.log: nnc_boundedbhrz03extrapolation1$(EXEEXT)
+ @p='nnc_boundedbhrz03extrapolation1$(EXEEXT)'; \
+ b='nnc_boundedbhrz03extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedh79extrapolation1.log: nnc_boundedh79extrapolation1$(EXEEXT)
+ @p='nnc_boundedh79extrapolation1$(EXEEXT)'; \
+ b='nnc_boundedh79extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bounds1.log: nnc_bounds1$(EXEEXT)
+ @p='nnc_bounds1$(EXEEXT)'; \
+ b='nnc_bounds1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_concatenate1.log: nnc_concatenate1$(EXEEXT)
+ @p='nnc_concatenate1$(EXEEXT)'; \
+ b='nnc_concatenate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_congruences1.log: nnc_congruences1$(EXEEXT)
+ @p='nnc_congruences1$(EXEEXT)'; \
+ b='nnc_congruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_constrains1.log: nnc_constrains1$(EXEEXT)
+ @p='nnc_constrains1$(EXEEXT)'; \
+ b='nnc_constrains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_constraints1.log: nnc_constraints1$(EXEEXT)
+ @p='nnc_constraints1$(EXEEXT)'; \
+ b='nnc_constraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_contains1.log: nnc_contains1$(EXEEXT)
+ @p='nnc_contains1$(EXEEXT)'; \
+ b='nnc_contains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_containsintegerpoint1.log: nnc_containsintegerpoint1$(EXEEXT)
+ @p='nnc_containsintegerpoint1$(EXEEXT)'; \
+ b='nnc_containsintegerpoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_disjoint1.log: nnc_disjoint1$(EXEEXT)
+ @p='nnc_disjoint1$(EXEEXT)'; \
+ b='nnc_disjoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_dropsomenonintegerpoints1.log: nnc_dropsomenonintegerpoints1$(EXEEXT)
+ @p='nnc_dropsomenonintegerpoints1$(EXEEXT)'; \
+ b='nnc_dropsomenonintegerpoints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_empty1.log: nnc_empty1$(EXEEXT)
+ @p='nnc_empty1$(EXEEXT)'; \
+ b='nnc_empty1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_equals1.log: nnc_equals1$(EXEEXT)
+ @p='nnc_equals1$(EXEEXT)'; \
+ b='nnc_equals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_exceptions1.log: nnc_exceptions1$(EXEEXT)
+ @p='nnc_exceptions1$(EXEEXT)'; \
+ b='nnc_exceptions1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_exceptions3.log: nnc_exceptions3$(EXEEXT)
+ @p='nnc_exceptions3$(EXEEXT)'; \
+ b='nnc_exceptions3'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_expandspacedim1.log: nnc_expandspacedim1$(EXEEXT)
+ @p='nnc_expandspacedim1$(EXEEXT)'; \
+ b='nnc_expandspacedim1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_foldspacedims1.log: nnc_foldspacedims1$(EXEEXT)
+ @p='nnc_foldspacedims1$(EXEEXT)'; \
+ b='nnc_foldspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_frombdshape1.log: nnc_frombdshape1$(EXEEXT)
+ @p='nnc_frombdshape1$(EXEEXT)'; \
+ b='nnc_frombdshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_frombox1.log: nnc_frombox1$(EXEEXT)
+ @p='nnc_frombox1$(EXEEXT)'; \
+ b='nnc_frombox1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_fromgrid1.log: nnc_fromgrid1$(EXEEXT)
+ @p='nnc_fromgrid1$(EXEEXT)'; \
+ b='nnc_fromgrid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_fromoctagonalshape1.log: nnc_fromoctagonalshape1$(EXEEXT)
+ @p='nnc_fromoctagonalshape1$(EXEEXT)'; \
+ b='nnc_fromoctagonalshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generalizedaffineimage1.log: nnc_generalizedaffineimage1$(EXEEXT)
+ @p='nnc_generalizedaffineimage1$(EXEEXT)'; \
+ b='nnc_generalizedaffineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generalizedaffinepreimage1.log: nnc_generalizedaffinepreimage1$(EXEEXT)
+ @p='nnc_generalizedaffinepreimage1$(EXEEXT)'; \
+ b='nnc_generalizedaffinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generators1.log: nnc_generators1$(EXEEXT)
+ @p='nnc_generators1$(EXEEXT)'; \
+ b='nnc_generators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_geomcovers1.log: nnc_geomcovers1$(EXEEXT)
+ @p='nnc_geomcovers1$(EXEEXT)'; \
+ b='nnc_geomcovers1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_h79widening1.log: nnc_h79widening1$(EXEEXT)
+ @p='nnc_h79widening1$(EXEEXT)'; \
+ b='nnc_h79widening1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_intersection1.log: nnc_intersection1$(EXEEXT)
+ @p='nnc_intersection1$(EXEEXT)'; \
+ b='nnc_intersection1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_simplifyusingcontext1.log: nnc_simplifyusingcontext1$(EXEEXT)
+ @p='nnc_simplifyusingcontext1$(EXEEXT)'; \
+ b='nnc_simplifyusingcontext1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_limitedbhrz03extrapolation1.log: nnc_limitedbhrz03extrapolation1$(EXEEXT)
+ @p='nnc_limitedbhrz03extrapolation1$(EXEEXT)'; \
+ b='nnc_limitedbhrz03extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_limitedh79extrapolation1.log: nnc_limitedh79extrapolation1$(EXEEXT)
+ @p='nnc_limitedh79extrapolation1$(EXEEXT)'; \
+ b='nnc_limitedh79extrapolation1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_linearpartition1.log: nnc_linearpartition1$(EXEEXT)
+ @p='nnc_linearpartition1$(EXEEXT)'; \
+ b='nnc_linearpartition1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mapspacedims1.log: nnc_mapspacedims1$(EXEEXT)
+ @p='nnc_mapspacedims1$(EXEEXT)'; \
+ b='nnc_mapspacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_max_min1.log: nnc_max_min1$(EXEEXT)
+ @p='nnc_max_min1$(EXEEXT)'; \
+ b='nnc_max_min1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mc91.log: nnc_mc91$(EXEEXT)
+ @p='nnc_mc91$(EXEEXT)'; \
+ b='nnc_mc91'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_membytes1.log: nnc_membytes1$(EXEEXT)
+ @p='nnc_membytes1$(EXEEXT)'; \
+ b='nnc_membytes1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_minconstraints1.log: nnc_minconstraints1$(EXEEXT)
+ @p='nnc_minconstraints1$(EXEEXT)'; \
+ b='nnc_minconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mingenerators1.log: nnc_mingenerators1$(EXEEXT)
+ @p='nnc_mingenerators1$(EXEEXT)'; \
+ b='nnc_mingenerators1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_onepoint.log: nnc_onepoint$(EXEEXT)
+ @p='nnc_onepoint$(EXEEXT)'; \
+ b='nnc_onepoint'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_permute.log: nnc_permute$(EXEEXT)
+ @p='nnc_permute$(EXEEXT)'; \
+ b='nnc_permute'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polydifference1.log: nnc_polydifference1$(EXEEXT)
+ @p='nnc_polydifference1$(EXEEXT)'; \
+ b='nnc_polydifference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polyhull1.log: nnc_polyhull1$(EXEEXT)
+ @p='nnc_polyhull1$(EXEEXT)'; \
+ b='nnc_polyhull1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polyhullifexact1.log: nnc_polyhullifexact1$(EXEEXT)
+ @p='nnc_polyhullifexact1$(EXEEXT)'; \
+ b='nnc_polyhullifexact1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_randphull1.log: nnc_randphull1$(EXEEXT)
+ @p='nnc_randphull1$(EXEEXT)'; \
+ b='nnc_randphull1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_relations1.log: nnc_relations1$(EXEEXT)
+ @p='nnc_relations1$(EXEEXT)'; \
+ b='nnc_relations1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_relations2.log: nnc_relations2$(EXEEXT)
+ @p='nnc_relations2$(EXEEXT)'; \
+ b='nnc_relations2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_removespacedims1.log: nnc_removespacedims1$(EXEEXT)
+ @p='nnc_removespacedims1$(EXEEXT)'; \
+ b='nnc_removespacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_smm1.log: nnc_smm1$(EXEEXT)
+ @p='nnc_smm1$(EXEEXT)'; \
+ b='nnc_smm1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_timeelapse1.log: nnc_timeelapse1$(EXEEXT)
+ @p='nnc_timeelapse1$(EXEEXT)'; \
+ b='nnc_timeelapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_unconstrain1.log: nnc_unconstrain1$(EXEEXT)
+ @p='nnc_unconstrain1$(EXEEXT)'; \
+ b='nnc_unconstrain1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_universe1.log: nnc_universe1$(EXEEXT)
+ @p='nnc_universe1$(EXEEXT)'; \
+ b='nnc_universe1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_wrap1.log: nnc_wrap1$(EXEEXT)
+ @p='nnc_wrap1$(EXEEXT)'; \
+ b='nnc_wrap1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_wrap2.log: nnc_wrap2$(EXEEXT)
+ @p='nnc_wrap2$(EXEEXT)'; \
+ b='nnc_wrap2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_writepolyhedron1.log: nnc_writepolyhedron1$(EXEEXT)
+ @p='nnc_writepolyhedron1$(EXEEXT)'; \
+ b='nnc_writepolyhedron1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Polyhedron/addcongruence1.cc b/tests/Polyhedron/addcongruence1.cc
new file mode 100644
index 0000000..9bb09aa
--- /dev/null
+++ b/tests/Polyhedron/addcongruence1.cc
@@ -0,0 +1,234 @@
+/* Test Polyhedron::add_congruence().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_congruence(Linear_Expression(0) %= 0);
+ ph.add_congruence((B == 5) / 0);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B == 5);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+
+ ph.add_congruence((0*(A + B) %= 0) / 4);
+ ph.add_congruence((A == -1) / 0);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == -1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.add_congruence((A - B == 0) / 0);
+ ph.add_congruence((Linear_Expression(0) %= 1) / 2);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruences ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph(0);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(0);
+
+ ph.add_congruence((Linear_Expression::zero() %= 0) / 2);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruence ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph(0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.add_congruence((Linear_Expression::zero() %= 1) / 0);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruence ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_congruence(0*A %= 0);
+ ph.add_congruence((B == 5) / 0);
+ bool b = !ph.is_empty();
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B == 5);
+
+ bool ok = b && (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+
+ ph.add_congruence((Linear_Expression(0) %= 8) / 4);
+ ph.add_congruence((A == -1) / 0);
+ bool b = !ph.is_empty();
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == -1);
+
+ bool ok = b && (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.add_congruence((A - B == 0) / 0);
+ ph.add_congruence((Linear_Expression(0) %= 1) / 2);
+ bool b = !ph.is_empty();
+
+ bool ok = !b && (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruences ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ C_Polyhedron ph(0);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(0);
+
+ ph.add_congruence((Linear_Expression::zero() %= 0) / 2);
+ bool b = !ph.is_empty();
+
+ bool ok = b && (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruence ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ C_Polyhedron ph(0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.add_congruence((Linear_Expression::zero() %= 1) / 0);
+ bool b = !ph.is_empty();
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = !b && (ph == known_result);
+
+ print_constraints(ph, "*** ph after adding congruence ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/addcongruences1.cc b/tests/Polyhedron/addcongruences1.cc
new file mode 100644
index 0000000..7f238ce
--- /dev/null
+++ b/tests/Polyhedron/addcongruences1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::add_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(x));
+ gs.insert(ray(x + y));
+
+ Congruence_System cgs;
+ cgs.insert(0*x %= 0);
+ cgs.insert(y == 3);
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.add_congruences(cgs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y == 3);
+ known_result.add_constraint(x - y >= 0);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after add_congruences ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ Congruence_System cgs;
+ cgs.insert(Linear_Expression(0) %= 0);
+ cgs.insert(B == 7);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.add_congruences(cgs);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ Congruence_System cgs;
+
+ print_constraints(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.add_congruences(cgs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x + y >= 0);
+ C_Polyhedron ph(cs);
+
+ print_constraints(ph, "*** ph ***");
+
+ Linear_Expression e(1);
+ Congruence_System cgs;
+ cgs.insert(e == 0);
+
+ ph.add_congruences(cgs);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool test05() {
+ C_Polyhedron ph;
+ ph.add_constraint(Linear_Expression(-2) >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Congruence_System cgs;
+ cgs.insert(Linear_Expression(-1) %= 0);
+
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.add_congruences(cgs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after add_constraints ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert((Linear_Expression(26) %= 0) / 13);
+ cgs.insert(B == 7);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.add_congruences(cgs);
+
+ C_Polyhedron known_result(cgs);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert(Linear_Expression(0) %= 0);
+ cgs.insert(B == 7);
+
+ Congruence_System cgs_copy = cgs;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.add_recycled_congruences(cgs);
+
+ C_Polyhedron known_result(cgs_copy);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert((Linear_Expression(18) %= 3) / 5);
+ cgs.insert(A == 0);
+ cgs.insert(A + B == 7);
+ cgs.insert(B == 7);
+
+ Congruence_System cgs_copy = cgs;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.add_recycled_congruences(cgs);
+
+ C_Polyhedron known_result(cgs_copy);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/Polyhedron/addconstraint1.cc b/tests/Polyhedron/addconstraint1.cc
new file mode 100644
index 0000000..abcd094
--- /dev/null
+++ b/tests/Polyhedron/addconstraint1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::add_constraint().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B == 5);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2);
+ for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+ cs_end = ph1.constraints().end(); i != cs_end; ++i)
+ ph2.add_constraint(*i);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.add_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.add_constraint(A == B) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 2);
+ ph.add_constraint(A >= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.add_constraint(B >= 1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.add_constraint(B >= 1) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints1.cc b/tests/Polyhedron/addconstraints1.cc
new file mode 100644
index 0000000..a1d3d60
--- /dev/null
+++ b/tests/Polyhedron/addconstraints1.cc
@@ -0,0 +1,361 @@
+/* Test Polyhedron::add_constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // For const-correctness, making a copy is required.
+ Constraint_System cs1 = Constraint_System::zero_dim_empty();
+ C_Polyhedron ph1;
+ ph1.add_constraints(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(Linear_Expression::zero() >= 7);
+ C_Polyhedron ph2;
+ ph2.add_constraints(cs2);
+
+ Constraint_System cs3;
+ cs3.insert(Linear_Expression::zero() >= -3);
+ C_Polyhedron ph3;
+ ph3.add_constraints(cs3);
+
+ C_Polyhedron empty_result(0, EMPTY);
+ C_Polyhedron univ_result;
+
+ bool ok = (ph1 == empty_result
+ && ph2 == empty_result
+ && ph3 == univ_result);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(ph3, "*** ph3 ***");
+ print_constraints(empty_result, "*** empty_result ***");
+ print_constraints(univ_result, "*** univ_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ Constraint_System cs;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.add_constraints(cs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x + y >= 0);
+ C_Polyhedron ph(cs1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Linear_Expression e(1);
+ Constraint_System cs2;
+ cs2.insert(e == 0);
+ ph.add_constraints(cs2);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.add_constraints(cs2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(x >= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Constraint_System cs;
+
+ C_Polyhedron computed_result(ph);
+
+ computed_result.add_constraints(cs);
+
+ bool ok = (computed_result == ph);
+
+ print_constraints(computed_result, "*** after add_constraints ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+
+ C_Polyhedron ph(3, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(x >= 4);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.add_constraints(cs);
+
+ C_Polyhedron computed_result(3, EMPTY);
+
+ bool ok = (ph == computed_result);
+
+ print_constraints(ph, "*** after add_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+
+ Constraint_System cs;
+ cs.insert(x >= 4);
+ cs.insert(x - y >= 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.add_constraints(cs);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(x >= 4);
+ known_result.add_constraint(x - y >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after add_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(y >= 1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y <= 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.add_constraints(cs);
+
+ C_Polyhedron known_result(3, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after add_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ C_Polyhedron ph;
+ ph.add_constraint(Linear_Expression(-2) >= 0);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-1) >= 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.add_constraints(cs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after add_constraints ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(x));
+ gs.insert(ray(x + y));
+
+ C_Polyhedron ph(gs);
+
+ Constraint_System cs;
+ cs.insert(x <= 3);
+
+ print_generators(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.add_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x - y >= 0);
+ known_result.add_constraint(x <= 3);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after add_constraints ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(A - B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.add_constraints(cs);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ Constraint_System cs1;
+ cs1.insert(A == 0);
+ cs1.insert(B >= 0);
+ Constraint_System cs2(cs1);
+
+ ph.add_constraints(cs1);
+ copy_ph.add_constraints(cs2);
+
+ bool ok = (ph == copy_ph);
+
+ print_constraints(ph, "*** after ph.add_constraints(cs1) ***");
+ print_constraints(ph, "*** after copy_ph.add_constraints(cs2) ***");
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(line(A + B));
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point());
+ ph2.constraints();
+ ph2.add_generator(ray(A));
+ ph2.add_generator(ray(B));
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ Constraint_System cs1 = ph2.constraints();
+ Constraint_System cs2 = ph2.constraints();
+
+ ph1.add_constraints(cs1);
+ copy_ph1.add_constraints(cs2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** after add_constraints_assign ***");
+ print_constraints(copy_ph1, "*** after add_constraints ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints2.cc b/tests/Polyhedron/addconstraints2.cc
new file mode 100644
index 0000000..9b20536
--- /dev/null
+++ b/tests/Polyhedron/addconstraints2.cc
@@ -0,0 +1,94 @@
+/* Test Polyhedron::add_constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A - B >= 0);
+ ph1.add_constraint(B >= 0);
+
+ NNC_Polyhedron ph2(1);
+ ph2.add_constraint(A == 0);
+
+ Constraint_System cs = ph2.constraints();
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.add_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 0);
+ known_result.add_constraint(B == 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.add_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+
+ Constraint_System cs = ph1.constraints();
+
+ C_Polyhedron ph2(3);
+ ph2.add_constraint(A <= 2);
+
+ print_constraints(cs, "*** cs ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.add_constraints(cs);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator1.cc b/tests/Polyhedron/addgenerator1.cc
new file mode 100644
index 0000000..96f4a9c
--- /dev/null
+++ b/tests/Polyhedron/addgenerator1.cc
@@ -0,0 +1,118 @@
+/* Test Polyhedron::add_generator().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A + 2*B));
+ gs.insert(point(A + B));
+ gs.insert(point(2*A + 2*B));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.add_generator(ray(A));
+
+ Generator_System known_gs;
+ known_gs.insert(point());
+ known_gs.insert(point(A + 2*B));
+ known_gs.insert(ray(A));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.add_generator(ray(A)) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph_empty(2, EMPTY);
+ Generator_System gs1 = ph_empty.generators();
+ assert(gs1.space_dimension() == ph_empty.space_dimension());
+
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ C_Polyhedron ph1(gs1);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ C_Polyhedron known_result1(2);
+ known_result1.add_constraint(A >= 0);
+ known_result1.add_constraint(B == 0);
+
+ Generator_System gs2 = ph_empty.generators();
+ assert(gs2.space_dimension() == ph_empty.space_dimension());
+
+ gs2.insert(point(C));
+ gs2.insert(line(C));
+ gs2.insert(ray(A));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result2(3);
+ known_result2.add_constraint(A >= 0);
+ known_result2.add_constraint(B == 0);
+
+ bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph(0, EMPTY);
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(0, UNIVERSE);
+ print_constraints(known_result, "*** known_result ***");
+
+ ph.add_generator(point());
+
+ bool ok = (ph == known_result);
+ print_constraints(ph, "*** ph.add_generator(point()) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator2.cc b/tests/Polyhedron/addgenerator2.cc
new file mode 100644
index 0000000..d9d295d
--- /dev/null
+++ b/tests/Polyhedron/addgenerator2.cc
@@ -0,0 +1,130 @@
+/* Test Polyhedron::add_generator().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(line(B));
+ NNC_Polyhedron ph1(gs);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(-A));
+
+ print_generators(ph2, "*** ph2 ***");
+
+ const Generator_System& gs1 = ph1.minimized_generators();
+ for (Generator_System::const_iterator i = gs1.begin(),
+ gs1_end = gs1.end(); i != gs1_end; ++i)
+ ph2.add_generator(*i);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= -1);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2add_generator(*i) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A + B));
+ NNC_Polyhedron ph1(gs);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ const Generator_System& gs1 = ph1.minimized_generators();
+ for (Generator_System::const_iterator i = gs1.begin(),
+ gs1_end = gs1.end(); i != gs1_end; ++i)
+ ph2.add_generator(*i);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B == 1);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.add_generator(*i) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(closure_point(3*A, 2));
+ gs.insert(point(7*A, 4));
+ gs.insert(ray(A - B));
+
+ print_generators(gs, "*** gs ***");
+
+ C_Polyhedron ph(2, EMPTY);
+
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ if (!(*i).is_closure_point())
+ ph.add_generator(*i);
+
+ Generator_System gs_known;
+ gs_known.insert(point(7*A + 0*B, 4));
+ gs_known.insert(ray(A - B));
+ C_Polyhedron known_result(gs_known);
+
+ bool ok = (ph == known_result);
+
+ print_generators(gs, "*** gs ***");
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators1.cc b/tests/Polyhedron/addgenerators1.cc
new file mode 100644
index 0000000..2797566
--- /dev/null
+++ b/tests/Polyhedron/addgenerators1.cc
@@ -0,0 +1,354 @@
+/* Test Polyhedron::add_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point(x));
+ gs1.insert(point(y));
+ gs1.insert(line(x));
+ C_Polyhedron ph1(gs1);
+
+ print_generators(ph1, "*** before ***");
+
+ Generator_System gs2;
+ gs2.insert(point());
+
+ ph1.add_generators(gs2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(y));
+ known_result.add_generator(line(x));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** add_generators ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_generators(ph1, "*** before ***");
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(line(x));
+
+ ph1.add_generators(gs);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(line(x));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** add_generators ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph;
+ ph.add_generator(point());
+
+ print_generators(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(point());
+
+ print_generators(gs, "*** gs ***");
+
+ ph.add_generators(gs);
+
+ C_Polyhedron known_result;
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after add_generators ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(x <= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(ray(x));
+ gs.insert(point());
+
+ print_generators(gs, "*** gs ***");
+
+ ph.add_generators(gs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y == 0);
+ known_result.add_constraint(x >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after add_generators ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(x <= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(ray(x + y));
+ gs.insert(point());
+
+ print_generators(gs, "*** gs ***");
+
+ ph.add_generators(gs);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point());
+ gs_known_result.insert(ray(x + y));
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after add_generators ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(ray(x + y));
+ gs1.insert(point());
+
+ C_Polyhedron ph(gs1);
+
+ print_generators(ph, "*** ph ***");
+
+ Generator_System gs2;
+ gs2.insert(ray(x));
+ gs2.insert(point());
+
+ print_generators(gs2, "*** gs2 ***");
+
+ ph.add_generators(gs2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(ray(x));
+ known_result.add_generator(ray(x + y));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after add_generators ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 3);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ Generator_System gs;
+ ph.add_generators(gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph .add_generators(gs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ C_Polyhedron ph(0, EMPTY);
+
+ print_generators(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(point());
+
+ print_generators(gs, "*** gs ***");
+
+ ph.add_generators(gs);
+
+ C_Polyhedron known_result;
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.add_generators(gs); ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-A));
+ Generator_System gs2(gs1);
+
+ ph.add_generators(gs1);
+ copy_ph.add_generators(gs2);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** after ph.add_generators(gs1) ***");
+ print_generators(copy_ph, "*** after copy_ph.add_generators(gs2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(line(A + B));
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point());
+ ph2.constraints();
+ ph2.add_generator(ray(A));
+ ph2.add_generator(ray(B));
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ Generator_System gs1 = ph2.generators();
+ Generator_System gs2 = ph2.generators();
+
+ ph1.add_generators(gs1);
+ copy_ph1.add_generators(gs2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** after add_generators ***");
+ print_generators(copy_ph1, "*** after add_generators ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ C_Polyhedron ph(1, EMPTY);
+ Generator_System gs(point());
+
+ print_generators(gs, "*** gs ***");
+
+ ph.add_generators(gs);
+
+ C_Polyhedron known_result(1, EMPTY);
+ known_result.add_generator(point());
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** add_generators ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ C_Polyhedron ph(0, EMPTY);
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs(point());
+ print_generators(gs, "*** gs ***");
+
+ C_Polyhedron known_result(0, UNIVERSE);
+
+ ph.add_generators(gs);
+
+ bool ok = (ph == known_result);
+ print_constraints(ph, "*** ph.add_generators(gs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators2.cc b/tests/Polyhedron/addgenerators2.cc
new file mode 100644
index 0000000..12ed28a
--- /dev/null
+++ b/tests/Polyhedron/addgenerators2.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::add_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(closure_point());
+ gs1.insert(closure_point(4*x));
+ gs1.insert(closure_point(4*y));
+ gs1.insert(closure_point(4*x + 4*y));
+ gs1.insert(point(2*x));
+ gs1.insert(point(4*x + y));
+ gs1.insert(point(x + 4*y));
+ gs1.insert(point(3*y));
+
+ NNC_Polyhedron ph(gs1);
+
+ print_generators(ph, "*** ph ***");
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(4*x));
+ gs2.insert(point(4*y));
+ gs2.insert(point(4*x + 4*y));
+
+ ph.add_generators(gs2);
+
+ Generator_System gs3;
+ gs3.insert(point());
+ gs3.insert(point(4*x));
+ gs3.insert(point(4*y));
+ gs3.insert(point(4*x + 4*y));
+
+ NNC_Polyhedron known_result(gs3);
+
+ C_Polyhedron closed_ph(ph);
+ C_Polyhedron closed_known_result(known_result);
+
+ bool ok = (ph == known_result
+ && closed_ph == closed_known_result);
+
+ print_generators(ph, "*** after add_generators(gs) ***");
+ print_generators(closed_ph, "*** closed_ph ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ NNC_Polyhedron ph1(3, EMPTY);
+
+ ph1.add_generator(point(x));
+
+ Generator_System gs;
+ gs.insert(point(1*x + 0*y + 0*z));
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(A + B));
+ gs1.insert(closure_point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(B));
+ NNC_Polyhedron ph1(gs1);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.topological_closure_assign();
+ Generator_System gs2 = ph1.minimized_generators();
+
+ print_generators(gs2, "*** gs2 ***");
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generators(gs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims1.cc b/tests/Polyhedron/addspacedims1.cc
new file mode 100644
index 0000000..e8a87c6
--- /dev/null
+++ b/tests/Polyhedron/addspacedims1.cc
@@ -0,0 +1,202 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+ and Polyhedron::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(x));
+ gs.insert(point(y));
+ gs.insert(point(x + y));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.add_space_dimensions_and_project(1);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(x));
+ known_result.add_generator(point(y));
+ known_result.add_generator(point(x + y));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after add_space_dimensions_and_project ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph(3, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron computed_result1(ph);
+ C_Polyhedron computed_result2(ph);
+
+ computed_result1.add_space_dimensions_and_project(4);
+ computed_result2.add_space_dimensions_and_embed(4);
+
+ C_Polyhedron known_result(7, EMPTY);
+
+ bool ok = (computed_result1 == known_result
+ && computed_result2 == known_result);
+
+ print_constraints(computed_result1, "*** computed_result1 ***");
+ print_constraints(computed_result2, "*** computed_result2 ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable u(3);
+ Variable v(4);
+ Variable w(5);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(x + y));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ Constraint_System cs = ph.constraints();
+
+ ph.add_space_dimensions_and_embed(2);
+
+ print_generators(ph, "*** after add_space_dimensions_and_embed(2) ***");
+
+ ph.add_space_dimensions_and_embed(2);
+
+ C_Polyhedron known_result(6, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(ray(x + y));
+ known_result.add_generator(line(z));
+ known_result.add_generator(line(u));
+ known_result.add_generator(line(v));
+ known_result.add_generator(line(w));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph1;
+
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.add_space_dimensions_and_project(3);
+
+ print_generators(ph1, "*** after add_space_dimensions_and_project(3) ***");
+
+ C_Polyhedron ph2;
+ Constraint_System cs = ph2.constraints();
+
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.add_space_dimensions_and_project(3);
+
+ bool ok = (ph1 == ph2);
+
+ print_generators(ph2, "*** after add_space_dimensions_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable C(2);
+
+ C_Polyhedron ph(2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.add_space_dimensions_and_project(1);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(C == 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph,
+ "*** after ph.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+
+ C_Polyhedron ph2(ph1);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.add_space_dimensions_and_embed(0);
+ ph2.add_space_dimensions_and_project(0);
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1,
+ "*** after ph1.add_space_dimensions_and_embed(0) ***");
+ print_constraints(ph2,
+ "*** after ph2.add_space_dimensions_and_project(0) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims2.cc b/tests/Polyhedron/addspacedims2.cc
new file mode 100644
index 0000000..5f07e06
--- /dev/null
+++ b/tests/Polyhedron/addspacedims2.cc
@@ -0,0 +1,249 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+ and Polyhedron::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Constraint_System cs;
+ cs.insert(x > 2);
+ cs.insert(y > 2);
+ cs.insert(x < 6);
+ cs.insert(y < 6);
+
+ NNC_Polyhedron ph(cs);
+
+ ph.generators();
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+
+ ph.add_space_dimensions_and_project(2);
+
+ NNC_Polyhedron known_result(4);
+ known_result.add_constraint(z == 0);
+ known_result.add_constraint(w == 0);
+ known_result.add_constraint(x > 2);
+ known_result.add_constraint(y > 2);
+ known_result.add_constraint(x < 6);
+ known_result.add_constraint(y < 6);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after add_space_dimensions_and_project ***");
+ print_generators(ph, "*** after add_space_dimensions_and_project ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+
+ NNC_Polyhedron ph1(1);
+
+ ph1.add_constraint(x > 1);
+ ph1.add_constraint(x < 5);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.add_space_dimensions_and_embed(2);
+
+ Generator_System gs;
+ gs.insert(point(2*x));
+ gs.insert(closure_point(x));
+ gs.insert(closure_point(5*x));
+
+ NNC_Polyhedron ph2(gs);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.add_space_dimensions_and_embed(2);
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+ print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ NNC_Polyhedron ph1(1);
+
+ ph1.add_constraint(x > -3);
+ ph1.add_constraint(x < 3);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.add_space_dimensions_and_project(2);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(closure_point(-3*x));
+ gs.insert(closure_point(3*x));
+
+ NNC_Polyhedron ph2(gs);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.add_space_dimensions_and_project(2);
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+ print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ NNC_Polyhedron ph(1, EMPTY);
+ ph.add_generator(point(A));
+ ph.add_generator(closure_point());
+ ph.add_generator(closure_point(3*A));
+
+ print_generators(ph, "*** ph ***");
+
+ ph.add_space_dimensions_and_embed(1);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A > 0);
+ known_result.add_constraint(A < 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
+ print_generators(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(A));
+ NNC_Polyhedron ph(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(A));
+ gs2.insert(ray(A));
+ ph.add_generators(gs2);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.add_space_dimensions_and_embed(1);
+
+ Generator_System known_gs;
+ known_gs.insert(point(A));
+ known_gs.insert(line(B));
+ known_gs.insert(ray(A));
+ NNC_Polyhedron known_result(known_gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(A + B));
+ gs1.insert(closure_point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(B));
+ NNC_Polyhedron ph1(gs1);
+
+ ph1.minimized_constraints();
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.add_space_dimensions_and_embed(1);
+
+ NNC_Polyhedron known_result(3);
+ known_result.add_constraint(A > 0);
+ known_result.add_constraint(B > 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** after ph1.add_space_dimensions_and_embed(1) ***");
+ print_generators(ph1, "*** after ph1.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+
+ // This will change the size of the rows, but not their capacity.
+ ph1.add_space_dimensions_and_embed(1);
+
+ // Assigning the polyhedron to itself:
+ // this used to recompute the row capacity based on row size,
+ // without actually increasing the capacity of the rows,
+ // leading to an inconsistent state.
+ ph1 = ph1;
+
+ return ph1.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage1.cc b/tests/Polyhedron/affineimage1.cc
new file mode 100644
index 0000000..b411e3e
--- /dev/null
+++ b/tests/Polyhedron/affineimage1.cc
@@ -0,0 +1,266 @@
+/* Test Polyhedron::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(C == -2);
+ ph.add_constraint(A == 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(B, A+2, 1);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point(2*B - 2*C));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_image(B, A+2, 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= B);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A <= 3);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(A, A+B+1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A -2*B - 1 >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B <= 4);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after ph.affine_image(A, A+B+1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(B));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_image(A, A + 1, 2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(2*A >= 1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.affine_image(A, A + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A));
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(A, B+2, -3);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(-2*A, 3));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_image(A, B+2, -3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(A <= 3);
+ ph.add_constraint(B >= 1);
+ ph.add_constraint(2*A >= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(B, A-B+2, -3);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(2*A));
+ known_result.add_generator(point(2*A - B));
+ known_result.add_generator(point(9*A + B, 3));
+ known_result.add_generator(point(9*A - 4*B, 3));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_image(B, A-B+2, -3) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.affine_image(A, 2*A + B + 1);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.affine_image(A, 2*A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(point(B));
+ gs.insert(point(A + B));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_image(A, -A - 1, -1);
+
+ Generator_System known_gs;
+ known_gs.insert(point(A));
+ known_gs.insert(point(2*A));
+ known_gs.insert(point(A + B));
+ known_gs.insert(point(2*A + B));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.affine_image(A, -A - 1, -1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(A, A + 1);
+ copy_ph.affine_image(A, -A - 1, -1);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** after ph.affine_image(A, A + 1) ***");
+ print_generators(copy_ph,
+ "*** after copy_ph.affine_image(A, -A - 1, -1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_image(B, A + 1);
+ copy_ph.affine_image(B, -A - 1, -1);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** after ph.affine_image(B, A + 1) ***");
+ print_generators(copy_ph,
+ "*** after copy_ph.affine_image(B, -A - 1, -1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage2.cc b/tests/Polyhedron/affineimage2.cc
new file mode 100644
index 0000000..818f37c
--- /dev/null
+++ b/tests/Polyhedron/affineimage2.cc
@@ -0,0 +1,75 @@
+/* Test Polyhedron::affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable v) {
+ s << char('i' + v.id());
+}
+
+bool
+test01() {
+ Variable i(0);
+ Variable j(1);
+
+ // Install the alternate output function.
+ Variable::set_output_function(aux_test01);
+
+ NNC_Polyhedron p1(2);
+ p1.add_constraint(j == 0);
+ p1.add_constraint(i >= 0);
+
+ NNC_Polyhedron p2(2);
+ p2.add_constraint(j == 0);
+ p2.add_constraint(-i > 0);
+
+ print_constraints(p1, "*** p1 ***");
+ print_constraints(p2, "*** p2 ***");
+
+ p1.affine_image(j, i+2);
+ p2.affine_image(j, i);
+
+ print_constraints(p1, "*** p1.affine_image(j, i+2) ***");
+ print_constraints(p2, "*** p2.affine_image(j, i) ***");
+
+ p1.upper_bound_assign(p2);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(i - j >= -2);
+ known_result.add_constraint(-i + j >= 0);
+
+ bool ok = (p1 == known_result);
+
+ print_constraints(p1, "*** p1.upper_bound_assign(p2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/affinepreimage1.cc b/tests/Polyhedron/affinepreimage1.cc
new file mode 100644
index 0000000..a11c33c
--- /dev/null
+++ b/tests/Polyhedron/affinepreimage1.cc
@@ -0,0 +1,438 @@
+/* Test Polyhedron::affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A + B));
+ gs.insert(point(A));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_preimage(A, A+2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point(-2*A));
+ gs_known_result.insert(ray(A + B));
+ gs_known_result.insert(point(-A));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_preimage(A, A+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(A + C == 0);
+ ph.add_constraint(A + B >= 0);
+ ph.add_constraint(A + B - 1 >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(A, A + B);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A + B + C == 0);
+ known_result.add_constraint(A + 2*B >= 0);
+ known_result.add_constraint(A + 2*B -1 >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after ph.affine_preimage(A, A+B) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A + B - 3 >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(A, B+1);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(B));
+ known_result.add_generator(line(A));
+ known_result.add_generator(ray(B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_preimage(A, B+2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point(x + y));
+ gs.insert(ray(x + 2*y));
+ gs.insert(ray(x));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_preimage(x, y+1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after affine_preimage(x, y+1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(B >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(A, A + 1, 2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 3);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(A, A + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(B, A + 1, 2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(B, A + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(A + B));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_preimage(B, A - B, -1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B <= 0);
+ known_result.add_constraint(2*A - B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(B, A - B, -1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(A, 2*A +B + 1);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(A, 2*A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A <= 1);
+ ph.add_constraint(B <= 1);
+
+ ph.affine_preimage(A, -A - 1, -1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(A >= -1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(A, -A - 1, -1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A <= 1);
+ ph.add_constraint(B <= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(B, -A - 1, -1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.affine_preimage(B, -A - 1, -1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(A, A + 1);
+ copy_ph.affine_preimage(A, -A - 1, -1);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** after ph.affine_preimage(A, A + 1) ***");
+ print_generators(copy_ph,
+ "*** after copy_ph.affine_preimage(A, -A - 1, -1) ***");
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+ C_Polyhedron copy_ph(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.affine_preimage(B, A + 1);
+ copy_ph.affine_preimage(B, -A - 1, -1);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** after ph.affine_preimage(B, A + 1) ***");
+ print_generators(copy_ph,
+ "*** after copy_ph.affine_preimage(B, -A - 1, -1) ***");
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A + B));
+ gs.insert(point(A));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.affine_preimage(B, Linear_Expression(1));
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point(A));
+ gs_known_result.insert(point(2*A));
+ gs_known_result.insert(line(B));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_preimage(B, 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(0*A + 3*B));
+ gs.insert(point(3*A + 0*B));
+ gs.insert(point(3*A + 3*B));
+
+ C_Polyhedron ph(gs);
+
+ C_Polyhedron known_result = ph;
+
+ print_generators(ph, "*** ph before ph.affine_image(A, A + 2*B + 4) ***");
+
+ ph.affine_image(A, A + 2*B + 4);
+
+ print_generators(ph, "*** ph after ph.affine_image(A, A + 2*B + 4) ***");
+
+ ph.affine_preimage(A, A + 2*B + 4);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_preimage(A, A + 2*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(0*A + 3*B));
+ gs.insert(point(3*A + 0*B));
+ gs.insert(point(3*A + 3*B));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph before ph.affine_image(A, B) ***");
+
+ ph.affine_image(A, B);
+
+ print_generators(ph, "*** ph after ph.affine_image(A, B) ***");
+
+ ph.affine_preimage(A, B);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after ph.affine_preimage(A, B) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/affinetrans.cc b/tests/Polyhedron/affinetrans.cc
new file mode 100644
index 0000000..e928e16
--- /dev/null
+++ b/tests/Polyhedron/affinetrans.cc
@@ -0,0 +1,82 @@
+/* Use of the functions affine_image and affine_preimage.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y));
+ gs.insert(point(0*x + 3*y));
+ gs.insert(point(3*x + 0*y));
+ gs.insert(point(3*x + 3*y));
+ C_Polyhedron ph(gs);
+
+ Linear_Expression expr = x + 4;
+
+ C_Polyhedron p1(ph);
+
+ print_generators(p1, "*** p1 ***");
+
+ p1.affine_image(x, expr);
+
+ C_Polyhedron p2(ph);
+
+ print_generators(p2, "*** p2 ***");
+
+ p2.affine_preimage(x, expr);
+
+ Generator_System gs1_known_result;
+ gs1_known_result.insert(point(4*x + 0*y));
+ gs1_known_result.insert(point(4*x + 3*y));
+ gs1_known_result.insert(point(7*x + 0*y));
+ gs1_known_result.insert(point(7*x + 3*y));
+ C_Polyhedron p1_known_result(gs1_known_result);
+
+ Generator_System gs2_known_result;
+ gs2_known_result.insert(point(-4*x + 0*y));
+ gs2_known_result.insert(point(-4*x + 3*y));
+ gs2_known_result.insert(point(-1*x + 0*y));
+ gs2_known_result.insert(point(-1*x + 3*y));
+ C_Polyhedron p2_known_result(gs2_known_result);
+
+ bool ok = (p1 == p1_known_result && p2 == p2_known_result);
+
+ print_generators(p1 ,"*** p1 ***");
+ print_generators(p1_known_result, "*** p1_known_result ***");
+ print_generators(p2 ,"*** p2 ***");
+ print_generators(p2_known_result, "*** p2_known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/append1.cc b/tests/Polyhedron/append1.cc
new file mode 100644
index 0000000..5dac713
--- /dev/null
+++ b/tests/Polyhedron/append1.cc
@@ -0,0 +1,113 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+ dimension_type offset,
+ C_Polyhedron& q) {
+ C_Polyhedron r(offset);
+ r.concatenate_assign(p);
+ q.intersection_assign(r);
+}
+
+} // namespace
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ // This is the base case:
+ // append(A,B,C) :- A = [], B = C.
+ C_Polyhedron base(3);
+ base.add_constraint(A == 0);
+ base.add_constraint(B >= 0);
+ base.add_constraint(C == B);
+
+ print_constraints(base, "*** base ***");
+
+ // This is the inductive case:
+ // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+ C_Polyhedron inductive(6);
+ inductive.add_constraint(A + F == C + D);
+ inductive.add_constraint(B == E);
+ inductive.add_constraint(C + D >= A);
+ inductive.add_constraint(D >= 0);
+ inductive.add_constraint(B >= 0);
+ inductive.add_constraint(A >= D + 1);
+
+ print_constraints(inductive, "*** inductive ***");
+
+ // Initialize the fixpoint iteration.
+ C_Polyhedron current = base;
+
+ print_constraints(current, "*** start ***");
+
+ // Contains the polyhedron computed at the previous iteration.
+ C_Polyhedron previous;
+ do {
+ previous = current;
+ current = inductive;
+ shift_rename_add(previous, 3, current);
+
+ print_constraints(current, "*** after shift_rename_add ***");
+
+ Variables_Set dimensions_to_remove;
+ // Deliberately inserted out of order (!).
+ dimensions_to_remove.insert(D);
+ dimensions_to_remove.insert(F);
+ dimensions_to_remove.insert(E);
+ current.remove_space_dimensions(dimensions_to_remove);
+
+ print_constraints(current, "*** after remove_space_dimensions ***");
+
+ current.upper_bound_assign(previous);
+ (void) current.is_empty();
+
+ print_constraints(current, "*** after upper_bound_assign ***");
+
+ } while (current != previous);
+
+ C_Polyhedron expected(3);
+ expected.add_constraint(A + B == C);
+ expected.add_constraint(B >= 0);
+ expected.add_constraint(C >= B);
+
+ print_constraints(expected, "*** expected ***");
+
+ return current == expected ? true : false;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
+
diff --git a/tests/Polyhedron/append2.cc b/tests/Polyhedron/append2.cc
new file mode 100644
index 0000000..c87c2fb
--- /dev/null
+++ b/tests/Polyhedron/append2.cc
@@ -0,0 +1,132 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+ dimension_type offset,
+ C_Polyhedron& q) {
+ C_Polyhedron r(offset);
+ r.concatenate_assign(p);
+ q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+ dimension_type& offset, unsigned int& arity,
+ unsigned int& num_vars) {
+ offset = 3;
+ arity = 3;
+ num_vars = 6;
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ // This is the base case:
+ // append(A,B,C) :- A = [], B = C.
+ base.add_space_dimensions_and_embed(3);
+ base.add_constraint(A == 0);
+ base.add_constraint(B >= 0);
+ base.add_constraint(C == B);
+
+ print_constraints(base, "*** base ***");
+
+ // This is the inductive case:
+ // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+ induct.add_space_dimensions_and_embed(6);
+ induct.add_constraint(A + F == C + D);
+ induct.add_constraint(B == E);
+ induct.add_constraint(C + D >= A);
+ induct.add_constraint(D >= 0);
+ induct.add_constraint(B >= 0);
+ induct.add_constraint(A >= D + 1);
+
+ print_constraints(induct, "*** inductive ***");
+
+ expect.add_space_dimensions_and_embed(3);
+ expect.add_constraint(A + B == C);
+ expect.add_constraint(B >= 0);
+ expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+ dimension_type offset, unsigned int arity, unsigned int num_vars) {
+ // Initialize the fixpoint iteration.
+ C_Polyhedron current = start;
+
+ print_constraints(current, "*** start ***");
+
+ // Contains the polyhedron computed at the previous iteration.
+ C_Polyhedron previous;
+ do {
+ previous = current;
+ current = induct;
+ shift_rename_add(previous, offset, current);
+
+ print_constraints(current, "*** after shift_rename_add ***");
+
+ Variables_Set dimensions_to_remove;
+ for (unsigned int i = num_vars-1 ; i >= arity; --i )
+ dimensions_to_remove.insert(Variable(i));
+ current.remove_space_dimensions(dimensions_to_remove);
+
+ print_constraints(current, "*** after remove_space_dimensions ***");
+
+ current.upper_bound_assign(previous);
+ (void) current.is_empty();
+
+ print_constraints(current, "*** after upper_bound_assign ***");
+
+ } while (current != previous);
+ finish = current;
+}
+
+} // namespace
+
+bool
+test01() {
+ C_Polyhedron start;
+ C_Polyhedron induct;
+ C_Polyhedron expect;
+ dimension_type recursive_offset;
+ unsigned int arity;
+ unsigned int num_vars;
+ append_init(start, induct, expect, recursive_offset, arity, num_vars);
+ C_Polyhedron final;
+ fix_point(start, induct, final, recursive_offset, arity, num_vars);
+
+ print_constraints(expect, "*** expected ***");
+
+ return final == expect ? true : false;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load1.cc b/tests/Polyhedron/ascii_dump_load1.cc
new file mode 100644
index 0000000..319b600
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load1.cc
@@ -0,0 +1,602 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A - B >= 2);
+ ph1.add_constraint(B >= 0);
+
+ ph1.minimized_generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ ph2.ascii_load(f);
+ close(f);
+
+ bool ok = (ph1 == ph2);
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ f.seekp(0);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "space_dim");
+ f.seekp(0, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "-ZE");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "con_sys");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "A\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test07() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "gen_sys");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test08() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(not_up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "A\n";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test09() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_c");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test10() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_g");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test11() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test12() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(not_up-to-date)");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test13() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_c");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test14() {
+ const char* my_file = "ascii_dump_load1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_g");
+ f.seekp(0, ios_base::cur);
+ f << "\nA";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test15() {
+ const char* my_file = "ascii_dump_load1.dat";
+ C_Polyhedron ph1;
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ ph2.ascii_load(f);
+ close(f);
+
+ bool ok = (ph1 == ph2);
+
+ return ok;
+}
+
+bool
+test16() {
+ const char* my_file = "ascii_dump_load1.dat";
+ C_Polyhedron ph1(2, EMPTY);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ ph2.ascii_load(f);
+ close(f);
+
+ bool ok = (ph1 == ph2);
+
+ return ok;
+}
+
+bool
+test17() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test18() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test19() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test20() {
+ const char* my_file = "ascii_dump_load1.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load2.cc b/tests/Polyhedron/ascii_dump_load2.cc
new file mode 100644
index 0000000..b91e485
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load2.cc
@@ -0,0 +1,139 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM +CS";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM +CS +SC";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM +CS +GS";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load2.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM +CM +GM +CS +GS -SC";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load2.dat";
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A + B));
+ C_Polyhedron ph1(gs);
+ ph1.constraints();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ ph2.ascii_load(f);
+ close(f);
+
+ bool ok = (ph1 == ph2);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load3.cc b/tests/Polyhedron/ascii_dump_load3.cc
new file mode 100644
index 0000000..c7f5f43
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load3.cc
@@ -0,0 +1,434 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A == 2);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test02() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A == 2);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "=");
+ f.seekp(0, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A == 2);
+ ph1.add_constraint(B >= 0);
+
+ Constraint_System cs = ph1.constraints();
+
+ C_Polyhedron ph(6);
+ ph.add_constraints(cs);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "=");
+ f.seekp(-6, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "NECESSARILY_CLOSED");
+ f.seekp(-2, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "x");
+ f.seekp(1, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "(not_sorted)");
+ f.seekp(-2, ios_base::cur);
+ f << "A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test07() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ ph.generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_c");
+ do
+ f >> str;
+ while (str != "x");
+ f.seekp(0, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test08() {
+ const char* my_file = "ascii_dump_load3.dat";
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ ph.generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ ph.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in | ios_base::out);
+ string str;
+ do
+ f >> str;
+ while (str != "sat_c");
+ f.seekp(8, ios_base::cur);
+ f << " A";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test09() {
+ const char* my_file = "ascii_dump_load3.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM -CM -GM +CS -GS -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "topology NECESSARILY_CLOSED\n"
+ << "3 x 3 (not_sorted)\n"
+ << "1 0 0";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test10() {
+ const char* my_file = "ascii_dump_load3.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM -CM -GM +CS -GS -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "topology NECESSARILY_CLOSED\n"
+ << "3 x 3 (not_sorted)\n"
+ << "1 0 0 >=\n"
+ << "0 1 0 >=\n"
+ << "0 0 1 >=\n\n"
+ << "gen_sys (not_up-to-date)\n"
+ << "topology NECESSARILY_CLOSED\n"
+ <<" 3 x 3 (not_sorted)\n"
+ << "1 0 0";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test11() {
+ const char* my_file = "ascii_dump_load3.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM -CM -GM +CS -GS -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "topology NECESSARILY_CLOSED\n"
+ << "3";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test12() {
+ const char* my_file = "ascii_dump_load3.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 2\n"
+ << "-ZE -EM -CM -GM +CS -GS -SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "topology";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test13() {
+ const char* my_file = "ascii_dump_load3.dat";
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << "space_dim 3\n"
+ << "-ZE -EM +CM +GM +CS +GS +SC -SG\n"
+ << "con_sys (up-to-date)\n"
+ << "topology NOT_NECESSARILY_CLOSED\n"
+ << "4 x 5 (sorted)\n"
+ << "1 0 0 0 -1 >\n"
+ << "0 0 0 0 1 >=\n"
+ << "0 0 1 0 0 >=\n"
+ << "-2 1 -1 0 0 >=\n"
+ << "\n"
+ << "gen_sys (up-to-date)\n"
+ << "topology NOT_NECESSARILY_CLOSED\n"
+ << "5 x 5 (sorted)\n"
+ << "0 0 0 1 0 L\n"
+ << "0 1 0 0 0 R\n"
+ << "0 1 1 0 0 R\n"
+ << "1 2 0 0 0 C\n"
+ << "1 2 0 0 1 P\n"
+ << "\n"
+ << "sat_c\n"
+ << "5";
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ C_Polyhedron ph2;
+ bool ok = !ph2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/bgp99extrapolation1.cc b/tests/Polyhedron/bgp99extrapolation1.cc
new file mode 100644
index 0000000..1ecf2cb
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation1.cc
@@ -0,0 +1,160 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+ Variable x(0);
+ Variable y(1);
+
+ static std::vector<C_Polyhedron> p;
+ if (p.size() < 5) {
+ p.resize(5, C_Polyhedron(2));
+ p[2].add_constraint(0 <= x);
+ p[2].add_constraint(x <= 4);
+ p[2].add_constraint(0 <= y);
+ p[2].add_constraint(y <= 4);
+ p[1] = p[2];
+ p[1].add_constraint(x-y <= 3);
+ p[0] = p[1];
+ p[0].add_constraint(x+y >= 1);
+
+ p[3].add_constraint(0 <= x);
+ p[3].add_constraint(x <= 8);
+ p[3].add_constraint(0 <= y);
+ p[3].add_constraint(y <= 8);
+ p[3].add_constraint(x+y <= 14);
+ p[3].add_constraint(x-y >= -6);
+ p[4] = p[3];
+ p[3].add_constraint(5*x-y >= -2);
+ p[3].add_constraint(x+3*y >= 3);
+ p[4].add_constraint(4*x-y >= -3);
+ p[4].add_constraint(x+2*y >= 2);
+ }
+
+ if (n >= p.size()) {
+ unsigned new_size = p.size();
+ while (n >= new_size)
+ new_size *= 2;
+ p.resize(p.size()*2);
+ }
+
+ if (p[n].is_universe()) {
+ p[n] = aux1_test01(n-4);
+ p[n].affine_image(x, 2*x);
+ p[n].affine_image(y, 8 - 2*y);
+ }
+
+ return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+ Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+ if (n == 0) {
+
+ nout << "S0 = { P0 }" << endl;
+
+ s.add_disjunct(aux1_test01(0));
+ return s;
+ }
+
+ const int p_base = (n-1)/3*4;
+
+ switch (n % 3) {
+ case 1:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 1 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 1));
+ s.add_disjunct(aux1_test01(p_base + 3));
+ break;
+ case 2:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 2));
+ s.add_disjunct(aux1_test01(p_base + 3));
+ break;
+ case 0:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 4 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 2));
+ s.add_disjunct(aux1_test01(p_base + 4));
+ break;
+ }
+ return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable v) {
+ s << char('x' + v.id());
+}
+
+bool
+test01() {
+ // Install the alternate output function.
+ Variable::set_output_function(aux3_test01);
+
+ Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+
+ nout << "T0 = " << T << endl;
+
+ bool converged = false;
+ for (unsigned n = 1; !converged && n <= 20; ++n) {
+ Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+ nout << "S" << n << " = " << Sn << endl;
+
+ Sn.BGP99_extrapolation_assign
+ (T, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+
+ nout << "T" << n << " = " << Sn << endl;
+
+ if (Sn.definitely_entails(T))
+ converged = true;
+ else
+ swap(Sn, T);
+ }
+
+ return !converged;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F16(test01);
+END_MAIN
diff --git a/tests/Polyhedron/bgp99extrapolation2.cc b/tests/Polyhedron/bgp99extrapolation2.cc
new file mode 100644
index 0000000..d4f4ef3
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation2.cc
@@ -0,0 +1,256 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+// Same test as test02, but using C_Polyhedron.
+// This overflows when using 8-bit coefficients.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ps1_1(2);
+ ps1_1.add_constraint(-A + B >= 5);
+ ps1_1.add_constraint(A - B >= -13);
+ ps1_1.add_constraint(A >= 3);
+ C_Polyhedron ps1_2(2);
+ ps1_2.add_constraint(-A + B >= 6);
+ ps1_2.add_constraint(A - B >= -16);
+ ps1_2.add_constraint(A >= 3);
+ C_Polyhedron ps1_3(2);
+ ps1_3.add_constraint(-A + B >= 7);
+ ps1_3.add_constraint(A - B >= -20);
+ ps1_3.add_constraint(A >= 4);
+ C_Polyhedron ps1_4(2);
+ ps1_4.add_constraint(-A + B >= 8);
+ ps1_4.add_constraint(A - B >= -24);
+ ps1_4.add_constraint(A >= 5);
+ C_Polyhedron ps1_5(2);
+ ps1_5.add_constraint(-A + B >= 10);
+ ps1_5.add_constraint(A - B >= -28);
+ ps1_5.add_constraint(A >= 6);
+ C_Polyhedron ps1_6(2);
+ ps1_6.add_constraint(-A + B >= 12);
+ ps1_6.add_constraint(A - B >= -32);
+ ps1_6.add_constraint(A >= 7);
+ C_Polyhedron ps1_7(2);
+ ps1_7.add_constraint(-A + B >= 2);
+ ps1_7.add_constraint(A - B >= -4);
+ ps1_7.add_constraint(A >= 0);
+ C_Polyhedron ps1_8(2);
+ ps1_8.add_constraint(-A + B >= 3);
+ ps1_8.add_constraint(A - B >= -8);
+ ps1_8.add_constraint(A >= 1);
+ C_Polyhedron ps1_9(2);
+ ps1_9.add_constraint(-A + B >= 4);
+ ps1_9.add_constraint(A - B >= -12);
+ ps1_9.add_constraint(A >= 2);
+
+ Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+ ps1.add_disjunct(ps1_1);
+ ps1.add_disjunct(ps1_2);
+ ps1.add_disjunct(ps1_3);
+ ps1.add_disjunct(ps1_4);
+ ps1.add_disjunct(ps1_5);
+ ps1.add_disjunct(ps1_6);
+ ps1.add_disjunct(ps1_7);
+ ps1.add_disjunct(ps1_8);
+ ps1.add_disjunct(ps1_9);
+
+ C_Polyhedron ps2_1(2);
+ ps2_1.add_constraint(-A + B >= 2);
+ ps2_1.add_constraint(A - B >= -4);
+ ps2_1.add_constraint(A >= 0);
+ C_Polyhedron ps2_2(2);
+ ps2_2.add_constraint(-A + B >= 3);
+ ps2_2.add_constraint(A - B >= -8);
+ ps2_2.add_constraint(A >= 1);
+ C_Polyhedron ps2_3(2);
+ ps2_3.add_constraint(-A + B >= 4);
+ ps2_3.add_constraint(A - B >= -12);
+ ps2_3.add_constraint(A >= 2);
+ C_Polyhedron ps2_4(2);
+ ps2_4.add_constraint(-A + B >= 6);
+ ps2_4.add_constraint(A - B >= -16);
+ ps2_4.add_constraint(A >= 3);
+
+ Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+ ps2.add_disjunct(ps2_1);
+ ps2.add_disjunct(ps2_2);
+ ps2.add_disjunct(ps2_3);
+ ps2.add_disjunct(ps2_4);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** ps1 ***" << endl
+ << ps1 << endl;
+ nout << "*** ps2 ***" << endl
+ << ps2 << endl;
+
+ ps1.BGP99_extrapolation_assign
+ (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+ C_Polyhedron kr_1(2);
+ kr_1.add_constraint(A - B >= -16);
+ kr_1.add_constraint(A >= 3);
+ C_Polyhedron kr_2(2);
+ kr_2.add_constraint(-A + B >= 3);
+ kr_2.add_constraint(A >= 1);
+ C_Polyhedron kr_3(2);
+ kr_3.add_constraint(A - B >= -12);
+ known_result.add_disjunct(kr_1);
+ known_result.add_disjunct(kr_2);
+ known_result.add_disjunct(kr_3);
+
+ bool ok = ps1.geometrically_equals(known_result);
+
+ nout
+ << "*** ps1.BGP99_extrapolation_assign"
+ << "(ps2, widen_fun_ref(&H79_widening_assign), 7) ***"
+ << endl
+ << ps1 << endl;
+
+ return ok;
+}
+
+// Same test as test01, but using NNC_Polyhedron.
+// This only overflows when using 8-bit coefficients with assertions on.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ps1_1(2);
+ ps1_1.add_constraint(-A + B >= 5);
+ ps1_1.add_constraint(A - B >= -13);
+ ps1_1.add_constraint(A >= 3);
+ NNC_Polyhedron ps1_2(2);
+ ps1_2.add_constraint(-A + B >= 6);
+ ps1_2.add_constraint(A - B >= -16);
+ ps1_2.add_constraint(A >= 3);
+ NNC_Polyhedron ps1_3(2);
+ ps1_3.add_constraint(-A + B >= 7);
+ ps1_3.add_constraint(A - B >= -20);
+ ps1_3.add_constraint(A >= 4);
+ NNC_Polyhedron ps1_4(2);
+ ps1_4.add_constraint(-A + B >= 8);
+ ps1_4.add_constraint(A - B >= -24);
+ ps1_4.add_constraint(A >= 5);
+ NNC_Polyhedron ps1_5(2);
+ ps1_5.add_constraint(-A + B >= 10);
+ ps1_5.add_constraint(A - B >= -28);
+ ps1_5.add_constraint(A >= 6);
+ NNC_Polyhedron ps1_6(2);
+ ps1_6.add_constraint(-A + B >= 12);
+ ps1_6.add_constraint(A - B >= -32);
+ ps1_6.add_constraint(A >= 7);
+ NNC_Polyhedron ps1_7(2);
+ ps1_7.add_constraint(-A + B >= 2);
+ ps1_7.add_constraint(A - B >= -4);
+ ps1_7.add_constraint(A >= 0);
+ NNC_Polyhedron ps1_8(2);
+ ps1_8.add_constraint(-A + B >= 3);
+ ps1_8.add_constraint(A - B >= -8);
+ ps1_8.add_constraint(A >= 1);
+ NNC_Polyhedron ps1_9(2);
+ ps1_9.add_constraint(-A + B >= 4);
+ ps1_9.add_constraint(A - B >= -12);
+ ps1_9.add_constraint(A >= 2);
+
+ Pointset_Powerset<NNC_Polyhedron> ps1(2, EMPTY);
+ ps1.add_disjunct(ps1_1);
+ ps1.add_disjunct(ps1_2);
+ ps1.add_disjunct(ps1_3);
+ ps1.add_disjunct(ps1_4);
+ ps1.add_disjunct(ps1_5);
+ ps1.add_disjunct(ps1_6);
+ ps1.add_disjunct(ps1_7);
+ ps1.add_disjunct(ps1_8);
+ ps1.add_disjunct(ps1_9);
+
+ NNC_Polyhedron ps2_1(2);
+ ps2_1.add_constraint(-A + B >= 2);
+ ps2_1.add_constraint(A - B >= -4);
+ ps2_1.add_constraint(A >= 0);
+ NNC_Polyhedron ps2_2(2);
+ ps2_2.add_constraint(-A + B >= 3);
+ ps2_2.add_constraint(A - B >= -8);
+ ps2_2.add_constraint(A >= 1);
+ NNC_Polyhedron ps2_3(2);
+ ps2_3.add_constraint(-A + B >= 4);
+ ps2_3.add_constraint(A - B >= -12);
+ ps2_3.add_constraint(A >= 2);
+ NNC_Polyhedron ps2_4(2);
+ ps2_4.add_constraint(-A + B >= 6);
+ ps2_4.add_constraint(A - B >= -16);
+ ps2_4.add_constraint(A >= 3);
+
+ Pointset_Powerset<NNC_Polyhedron> ps2(2, EMPTY);
+ ps2.add_disjunct(ps2_1);
+ ps2.add_disjunct(ps2_2);
+ ps2.add_disjunct(ps2_3);
+ ps2.add_disjunct(ps2_4);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** ps1 ***" << endl
+ << ps1 << endl;
+ nout << "*** ps2 ***" << endl
+ << ps2 << endl;
+
+ ps1.BGP99_extrapolation_assign
+ (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
+
+ Pointset_Powerset<NNC_Polyhedron> known_result(2, EMPTY);
+ NNC_Polyhedron kr_1(2);
+ kr_1.add_constraint(A - B >= -16);
+ kr_1.add_constraint(A >= 3);
+ NNC_Polyhedron kr_2(2);
+ kr_2.add_constraint(-A + B >= 3);
+ kr_2.add_constraint(A >= 1);
+ NNC_Polyhedron kr_3(2);
+ kr_3.add_constraint(A - B >= -12);
+ known_result.add_disjunct(kr_1);
+ known_result.add_disjunct(kr_2);
+ known_result.add_disjunct(kr_3);
+
+ bool ok = ps1.geometrically_equals(known_result);
+
+ nout
+ << "*** ps1.BGP99_extrapolation_assign"
+ << "(ps2, widen_fun_ref(&H79_widening_assign), 7) ***"
+ << endl
+ << ps1 << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8A(test02);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening1.cc b/tests/Polyhedron/bhrz03widening1.cc
new file mode 100644
index 0000000..052d618
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening1.cc
@@ -0,0 +1,755 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(A));
+ gs1.insert(point(B));
+ gs1.insert(point(A + B));
+ gs1.insert(point(C));
+ gs1.insert(point(A + C));
+ gs1.insert(point(B + C));
+ gs1.insert(point(A + B + C));
+ C_Polyhedron ph1(gs1);
+
+ C_Polyhedron ph1_copy(ph1);
+
+ Generator_System gs2;
+ gs2.insert(point(0*C));
+ gs2.insert(point(A));
+ gs2.insert(point(B));
+ gs2.insert(point(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ bool ok = (ph1 == ph1_copy);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+
+ C_Polyhedron ph1_copy(ph1);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ bool ok = (ph1 == ph1_copy);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(2*A));
+ gs1.insert(point(2*B));
+
+ C_Polyhedron ph1(gs1);
+ C_Polyhedron ph1_copy(ph1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(A));
+ gs2.insert(point(B));
+ gs2.insert(point(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ bool ok = (ph1 == ph1_copy);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(2*A));
+ gs1.insert(closure_point(A+B));
+ gs1.insert(closure_point(3*A+B));
+ NNC_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(2*A));
+ gs2.insert(closure_point(B));
+ gs2.insert(closure_point(4*A+B));
+ NNC_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B < 1);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A - B >= 0);
+ ph1.add_constraint(A + B <= 2);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(2*A - B >= 0);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(2*A + B <= 4);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(2*A + B >= 0);
+ known_result.add_constraint(2*A - B <= 4);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A - B <= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(2*A - B <= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + 4*B + 2*C));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(B));
+ gs2.insert(ray(A + 2*B + 4*C));
+ C_Polyhedron ph2(gs2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(line(A));
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + B + C));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(line(A));
+ gs2.insert(ray(B));
+ gs2.insert(ray(A + B + 2*C));
+ C_Polyhedron ph2(gs2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+const Generator_System&
+aux1_test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ static Generator_System gs;
+ static bool initialized = false;
+ if (!initialized) {
+ gs.insert(point());
+ gs.insert(ray(C));
+ gs.insert(ray(D));
+ gs.insert(ray(E));
+ gs.insert(ray(A + D));
+ gs.insert(ray(A + B + E));
+ initialized = true;
+ }
+ return gs;
+}
+
+C_Polyhedron
+aux2_test09(unsigned n) {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ C_Polyhedron ph(aux1_test09());
+ n += 2;
+ ph.add_generator(ray(A + (n-1)*B + E));
+ if (n % 2 == 0) {
+ // Even.
+ unsigned m = n / 2;
+ ph.add_generator(ray(m*B + E));
+ ph.add_generator(ray(A + (m-1)*B + D));
+ }
+ else {
+ // Odd.
+ ph.add_generator(ray(n*B + 2*E));
+ ph.add_generator(ray(2*A + (n-2)*B + 2*D));
+ }
+ return ph;
+}
+
+bool
+test09() {
+ // Chain condition for widenings:
+ // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+ // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+ // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ // Initialization: set q_0.
+ C_Polyhedron q_i_minus_1 = aux2_test09(0);
+
+ for (unsigned i = 1; i <= 100; ++i) {
+ print_generators(q_i_minus_1.generators(),
+ "*** Result of the previous iteration ***");
+
+ C_Polyhedron p_i = aux2_test09(i);
+ print_generators(p_i.generators(), "*** New stuff ***");
+
+ C_Polyhedron q_i = q_i_minus_1;
+ q_i.upper_bound_assign(p_i);
+ print_generators(q_i.generators(),
+ "*** Poly-hull of previous with new ***");
+
+ q_i.BHRZ03_widening_assign(q_i_minus_1);
+ print_generators(q_i.generators(),
+ "*** Result of widening poly-hull with new ***");
+
+ if (q_i == q_i_minus_1) {
+
+ C_Polyhedron known_result(5);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(E >= 0);
+ known_result.add_constraint(-A + B + D >= 0);
+
+ bool ok = (q_i == known_result);
+
+ print_constraints(q_i, "*** The constraints of the fix point ***");
+ print_generators(q_i, "*** The generators of the fix point ***");
+
+ return ok;
+ }
+ q_i_minus_1 = q_i;
+ }
+ return false;
+}
+
+bool
+test10() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(0, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ C_Polyhedron known_result;
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 2);
+ ph2.add_constraint(A <= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.BHRZ03_widening_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(A + 2*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-A));
+ gs1.insert(ray(-A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-A));
+ gs2.insert(ray(-A + 2*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-A));
+ gs1.insert(ray(-A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-A));
+ gs2.insert(ray(-A - 2*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(A - 2*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(B));
+ gs2.insert(ray(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(B));
+ gs1.insert(ray(-A + 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(B));
+ gs2.insert(ray(-A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-B));
+ gs1.insert(ray(-A - 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-B));
+ gs2.insert(ray(-A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-B));
+ gs1.insert(ray(A - 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-B));
+ gs2.insert(ray(A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(-A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening2.cc b/tests/Polyhedron/bhrz03widening2.cc
new file mode 100644
index 0000000..35b7dd4
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening2.cc
@@ -0,0 +1,262 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(B));
+ gs1.insert(ray(-A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(B));
+ gs2.insert(ray(-A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-A));
+ gs1.insert(ray(-A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-A));
+ gs2.insert(ray(A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-B));
+ gs1.insert(ray(A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-B));
+ gs2.insert(ray(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-A));
+ gs1.insert(ray(-A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-A));
+ gs2.insert(ray(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(-B));
+ gs1.insert(ray(-A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(-B));
+ gs2.insert(ray(-A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(-A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B <= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(B));
+ gs2.insert(ray(A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening3.cc b/tests/Polyhedron/bhrz03widening3.cc
new file mode 100644
index 0000000..37fe98f
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening3.cc
@@ -0,0 +1,649 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A + B > 0);
+ ph1.add_constraint(A - B < 1);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(A > 0);
+ ph2.add_constraint(A < 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System gs1;
+ gs1.insert(point(A));
+ gs1.insert(closure_point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + B + 2*C));
+ NNC_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(A));
+ gs2.insert(closure_point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(B));
+ gs2.insert(ray(A + B + C));
+ NNC_Polyhedron ph2(gs2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.BHRZ03_widening_assign(ph2);
+
+ NNC_Polyhedron known_result(3);
+ known_result.add_constraint(A > 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(C >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+ return ok;
+}
+
+Generator_System
+aux1_test03(const Coefficient& half_side) {
+ // Square.
+ Variable A(0);
+ Variable B(1);
+ Generator_System gs;
+ gs.insert(point(half_side*A + half_side*B));
+ gs.insert(point(half_side*A - half_side*B));
+ gs.insert(point(-half_side*A - half_side*B));
+ gs.insert(point(-half_side*A + half_side*B));
+ return gs;
+}
+
+Generator_System
+aux2_test03(const Coefficient& half_diagonal) {
+ // Rhombus.
+ Variable A(0);
+ Variable B(1);
+ Generator_System gs;
+ gs.insert(point(half_diagonal*A));
+ gs.insert(point(half_diagonal*B));
+ gs.insert(point(-half_diagonal*A));
+ gs.insert(point(-half_diagonal*B));
+ return gs;
+}
+
+C_Polyhedron
+aux3_test03(unsigned n) {
+
+ Coefficient half_diagonal = 2;
+ for (unsigned i = n / 8; i-- > 0; ) {
+ half_diagonal *= 2;
+ }
+ Coefficient half_side = half_diagonal;
+
+ Generator_System gs;
+ if (n % 8 < 4) {
+ half_side /= 2;
+ gs = aux1_test03(half_side);
+ Generator_System gs2 = aux2_test03(half_diagonal);
+ Generator_System::const_iterator gi = gs2.begin();
+ for (int i = n % 8; i-- > 0; )
+ gs.insert(*gi++);
+ }
+ else {
+ gs = aux2_test03(half_diagonal);
+ Generator_System gs2 = aux1_test03(half_side);
+ Generator_System::const_iterator gi = gs2.begin();
+ for (int i = n % 8 - 4; i-- > 0; )
+ gs.insert(*gi++);
+ }
+ C_Polyhedron ph = C_Polyhedron(gs);
+
+ return ph;
+}
+
+bool
+test03() {
+ // Chain condition for widenings:
+ // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+ // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+ // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+ // Initialization: set q_0.
+ C_Polyhedron q_i_minus_1 = aux3_test03(0);
+
+ for (unsigned i = 1; i <= 100; ++i) {
+ print_generators(q_i_minus_1.generators(),
+ "*** Result of the previous iteration ***");
+
+ C_Polyhedron p_i = aux3_test03(i);
+ print_generators(p_i.generators(), "*** New stuff ***");
+
+ C_Polyhedron q_i = q_i_minus_1;
+ q_i.upper_bound_assign(p_i);
+ print_generators(q_i.generators(),
+ "*** Poly-hull of previous with new ***");
+
+ q_i.BHRZ03_widening_assign(q_i_minus_1);
+ print_generators(q_i.generators(),
+ "*** Result of widening poly-hull with new ***");
+
+ if (q_i == q_i_minus_1) {
+ C_Polyhedron known_result(2);
+
+ bool ok = (q_i == known_result);
+
+ print_constraints(q_i, "*** The constraints of the fix point ***");
+ print_generators(q_i, "*** The generators of the fix point ***");
+
+ return ok;
+ }
+ q_i_minus_1 = q_i;
+ }
+ return false;
+}
+
+Generator_System
+aux1_test04() {
+ Variable A(0);
+ Variable B(1);
+ Generator_System new_gs;
+ new_gs.insert(point(A));
+ new_gs.insert(point(-B));
+ new_gs.insert(point(-A));
+ new_gs.insert(point(B));
+ return new_gs;
+}
+
+Generator
+aux2_test04(const Generator& p1, const Generator& p2, unsigned magic_number) {
+ // Splitting segment.
+ Linear_Expression expr1(p1.expression());
+ Linear_Expression expr2(p2.expression());
+ const Coefficient& d1 = p1.divisor();
+ const Coefficient& d2 = p2.divisor();
+ expr1 *= d2;
+ expr2 *= d1;
+ expr1 += expr2;
+ // The divisor for the average is 2 * d1 * d2.
+ // by carefully taking a smaller divisor, we obtain a point
+ // that won't be redundant in the polyhedron.
+ // NOTE: I am not *sure* this dirty kludge of using such
+ // a magic number will always succeed.
+ return point((magic_number+1)*expr1, magic_number*2*d1*d2);
+}
+
+Generator_System
+aux3_test04(const Generator_System& gs, unsigned magic_number) {
+ // Double generators.
+ Generator_System new_gs;
+ Generator_System::const_iterator i = gs.begin();
+ Generator_System::const_iterator gs_end = gs.end();
+ while (true) {
+ const Generator& g = *i;
+ new_gs.insert(g);
+ ++i;
+ if (i != gs_end)
+ new_gs.insert(aux2_test04(g, *i, magic_number));
+ else {
+ // Split the last segment.
+ Generator_System::const_iterator gs_begin = gs.begin();
+ new_gs.insert(aux2_test04(g, *gs_begin, magic_number));
+ break;
+ }
+ }
+ return new_gs;
+}
+
+C_Polyhedron
+aux4_test04(unsigned n) {
+
+ unsigned needed_vertices = n + 4;
+
+ unsigned magic_number = 1;
+ unsigned magic_factor = 4;
+ Generator_System gs = aux1_test04();
+ unsigned gs_vertices = 4;
+
+ while (gs_vertices * 2 <= needed_vertices) {
+ magic_number *= magic_factor;
+ gs = aux3_test04(gs, magic_number);
+ gs_vertices *= 2;
+ }
+
+ if (gs_vertices < needed_vertices) {
+ magic_number *= magic_factor;
+ Generator_System gs2 = aux3_test04(gs, magic_number);
+ Generator_System::const_iterator gs2_i = gs2.begin();
+ for ( ; gs_vertices < needed_vertices; ++gs_vertices) {
+ // Skip the even indexed vertices of gs2.
+ ++gs2_i;
+ // Add the odd indexed vertices of gs2.
+ gs.insert(*gs2_i++);
+ }
+ }
+
+ C_Polyhedron ph = C_Polyhedron(gs);
+ return ph;
+}
+
+bool
+test04() {
+ // Chain condition for widenings:
+ // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+ // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+ // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+ // Initialization: set q_0.
+ C_Polyhedron q_i_minus_1 = aux4_test04(0);
+
+ for (unsigned i = 1; i <= 100; ++i) {
+ print_generators(q_i_minus_1.generators(),
+ "*** Result of the previous iteration ***");
+
+ C_Polyhedron p_i = aux4_test04(i);
+ print_generators(p_i.generators(), "*** New stuff ***");
+
+ C_Polyhedron q_i = q_i_minus_1;
+ q_i.upper_bound_assign(p_i);
+ print_generators(q_i.generators(),
+ "*** Poly-hull of previous with new ***");
+
+ q_i.BHRZ03_widening_assign(q_i_minus_1);
+ print_generators(q_i.generators(),
+ "*** Result of widening poly-hull with new ***");
+
+ if (q_i == q_i_minus_1) {
+ C_Polyhedron known_result(2);
+
+ bool ok = (q_i == known_result);
+
+ print_constraints(q_i, "*** The constraints of the fix point ***");
+ print_generators(q_i, "*** The generators of the fix point ***");
+
+ return ok;
+ }
+ q_i_minus_1 = q_i;
+ }
+ return false;
+}
+
+Generator_System
+aux1_test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System new_gs;
+ new_gs.insert(ray(A + C));
+ new_gs.insert(ray(-B + C));
+ new_gs.insert(ray(-A + C));
+ new_gs.insert(ray(B + C));
+ return new_gs;
+}
+
+Generator
+aux2_test05(const Generator& r1, const Generator& r2, unsigned magic_number) {
+ // Splitting facet.
+ // Variable A(0);
+ // Variable B(1);
+ Variable C(2);
+ Linear_Expression expr1(r1.expression());
+ Linear_Expression expr2(r2.expression());
+ expr1 += expr2;
+ // NOTE: I am not *sure* this dirty kludge of using such
+ // a magic number will always succeed.
+ expr1 *= (magic_number + 1);
+ expr1 -= C;
+ return ray(expr1);
+}
+
+Generator_System
+aux3_test05(const Generator_System& gs, unsigned magic_number) {
+ // Double generators.
+ Generator_System new_gs;
+ Generator_System::const_iterator i = gs.begin();
+ Generator_System::const_iterator gs_end = gs.end();
+ while (true) {
+ const Generator& g = *i;
+ new_gs.insert(g);
+ ++i;
+ if (i != gs_end)
+ new_gs.insert(aux2_test05(g, *i, magic_number));
+ else {
+ // Split the last facet.
+ Generator_System::const_iterator gs_begin = gs.begin();
+ new_gs.insert(aux2_test05(g, *gs_begin, magic_number));
+ break;
+ }
+ }
+ return new_gs;
+}
+
+C_Polyhedron
+aux4_test05(unsigned n) {
+ unsigned needed_facets = n + 4;
+ unsigned magic_number = 1;
+ unsigned magic_factor = 4;
+ Generator_System gs = aux1_test05();
+ unsigned gs_facets = 4;
+
+ while (gs_facets * 2 <= needed_facets) {
+ magic_number *= magic_factor;
+ gs = aux3_test05(gs, magic_number);
+ gs_facets *= 2;
+ }
+
+ if (gs_facets < needed_facets) {
+ magic_number *= magic_factor;
+ Generator_System gs2 = aux3_test05(gs, magic_number);
+ Generator_System::const_iterator gs2_i = gs2.begin();
+ for ( ; gs_facets < needed_facets; ++gs_facets) {
+ // Skip the even indexed facets of gs2.
+ ++gs2_i;
+ // Add the odd indexed facets of gs2.
+ gs.insert(*gs2_i++);
+ }
+ }
+ gs.insert(point());
+ C_Polyhedron ph = C_Polyhedron(gs);
+ return ph;
+}
+
+bool
+test05() {
+ // Chain condition for widenings:
+ // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+ // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+ // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+ // Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ // Initialization: set q_0.
+ C_Polyhedron q_i_minus_1 = aux4_test05(0);
+
+ for (unsigned i = 1; i <= 100; ++i) {
+ print_generators(q_i_minus_1, "*** Result of the previous iteration ***");
+
+ C_Polyhedron p_i = aux4_test05(i);
+ print_generators(p_i, "*** New stuff ***");
+
+ C_Polyhedron q_i = q_i_minus_1;
+ q_i.upper_bound_assign(p_i);
+ print_generators(q_i, "*** Poly-hull of previous with new ***");
+
+ q_i.BHRZ03_widening_assign(q_i_minus_1);
+ print_generators(q_i, "*** Result of widening poly-hull with new ***");
+
+ if (q_i == q_i_minus_1) {
+ C_Polyhedron known_result(3, UNIVERSE);
+ known_result.add_constraint(-B + C >= 0);
+
+ bool ok = (q_i == known_result);
+
+ print_constraints(q_i, "*** The constraints of the fix point ***");
+ print_generators(q_i, "*** The generators of the fix point ***");
+
+ return ok;
+ }
+ q_i_minus_1 = q_i;
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(A + 2*B));
+ gs1.insert(ray(A));
+ gs1.insert(ray(2*A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(A + 2*B));
+ gs2.insert(ray(A));
+ gs2.insert(ray(A + B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(2*A- B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(A + 3*B));
+ gs1.insert(ray(A));
+ gs1.insert(ray(2*A - B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(A + 3*B));
+ gs2.insert(ray(A + B));
+ gs2.insert(ray(A - B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(3*A - B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(6*A - B));
+ gs1.insert(point(6*B));
+ gs1.insert(point(A + 10*B));
+ gs1.insert(ray(A + 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(6*A - B));
+ gs2.insert(point(6*B));
+ gs2.insert(point(A + 10*B));
+ gs2.insert(ray(A + B));
+ gs2.insert(ray(A + 3*B));
+ gs2.insert(point(-4*A + 3*B, 13));
+ gs2.insert(point(-2*A + B, 8));
+ gs2.insert(point(-A + 12*B, 4));
+
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ // This is the result of applying H79.
+ Generator_System gs_known_result;
+ gs_known_result.insert(point(-36*A + 6*B, 25));
+ gs_known_result.insert(ray(A + 4*B));
+ gs_known_result.insert(ray(6*A - B));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+ print_constraints(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(closure_point());
+ gs1.insert(closure_point(A + B));
+ gs1.insert(point(2*A + B, 2));
+ gs1.insert(ray(A));
+ NNC_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(closure_point());
+ gs2.insert(closure_point(A + B));
+ gs2.insert(closure_point(B, 2));
+ gs2.insert(point(2*A + B, 2));
+ gs2.insert(ray(A));
+ NNC_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.BHRZ03_widening_assign(ph1);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(B > 0);
+ known_result.add_constraint(B < 1);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(B));
+ gs.insert(point(A + 2*B));
+ gs.insert(point(A + B));
+ NNC_Polyhedron ph(gs);
+
+ gs.clear();
+ gs.insert(point());
+ gs.insert(point(B));
+ gs.insert(point(A + 2*B));
+ gs.insert(closure_point(A));
+ NNC_Polyhedron ph1(gs);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.BHRZ03_widening_assign(ph);
+
+ gs.clear();
+ gs.insert(point());
+ gs.insert(point(B));
+ gs.insert(point(A + 2*B));
+ gs.insert(ray(-B));
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.BHRZ03_widening_assin(ph) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST_F8(test04);
+ DO_TEST_F8(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST_F8(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/bhz03widening1.cc b/tests/Polyhedron/bhz03widening1.cc
new file mode 100644
index 0000000..d2886a1
--- /dev/null
+++ b/tests/Polyhedron/bhz03widening1.cc
@@ -0,0 +1,724 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+ Variable x(0);
+ Variable y(1);
+
+ static std::vector<C_Polyhedron> p;
+ if (p.size() < 5) {
+ p.resize(5, C_Polyhedron(2));
+ p[2].add_constraint(0 <= x);
+ p[2].add_constraint(x <= 4);
+ p[2].add_constraint(0 <= y);
+ p[2].add_constraint(y <= 4);
+ p[1] = p[2];
+ p[1].add_constraint(x-y <= 3);
+ p[0] = p[1];
+ p[0].add_constraint(x+y >= 1);
+
+ p[3].add_constraint(0 <= x);
+ p[3].add_constraint(x <= 8);
+ p[3].add_constraint(0 <= y);
+ p[3].add_constraint(y <= 8);
+ p[3].add_constraint(x+y <= 14);
+ p[3].add_constraint(x-y >= -6);
+ p[4] = p[3];
+ p[3].add_constraint(5*x-y >= -2);
+ p[3].add_constraint(x+3*y >= 3);
+ p[4].add_constraint(4*x-y >= -3);
+ p[4].add_constraint(x+2*y >= 2);
+ }
+
+ if (n >= p.size()) {
+ unsigned new_size = p.size();
+ while (n >= new_size)
+ new_size *= 2;
+ p.resize(p.size()*2);
+ }
+
+ if (p[n].is_universe()) {
+ p[n] = aux1_test01(n-4);
+ p[n].affine_image(x, 2*x);
+ p[n].affine_image(y, 8 - 2*y);
+ }
+
+ return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+ Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+ if (n == 0) {
+
+ nout << "S0 = { P0 }" << endl;
+
+ s.add_disjunct(aux1_test01(0));
+ return s;
+ }
+
+ const int p_base = (n-1)/3*4;
+
+ switch (n % 3) {
+ case 1:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 1 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 1));
+ s.add_disjunct(aux1_test01(p_base + 3));
+ break;
+ case 2:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 2));
+ s.add_disjunct(aux1_test01(p_base + 3));
+ break;
+ case 0:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 4 << " }" << endl;
+
+ s.add_disjunct(aux1_test01(p_base + 2));
+ s.add_disjunct(aux1_test01(p_base + 4));
+ break;
+ }
+ return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable v) {
+ s << char('x' + v.id());
+}
+
+bool
+test01() {
+ // Install the alternate output function.
+ Variable::set_output_function(aux3_test01);
+
+ Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+ nout << "T0 = " << T << endl;
+
+ bool converged = false;
+ for (unsigned n = 1; !converged && n <= 20; ++n) {
+ Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+ nout << "S" << n << " = " << Sn << endl;
+
+ Sn.upper_bound_assign(T);
+ Sn.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "T" << n << " = " << Sn << endl;
+
+ if (Sn.definitely_entails(T))
+ converged = true;
+ else
+ swap(Sn, T);
+ }
+
+ return converged;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron p(2);
+ C_Polyhedron q(2);
+ C_Polyhedron r(2);
+ C_Polyhedron s(2);
+ p.add_constraint(A >= 1);
+ p.add_constraint(B == 0);
+ q.add_constraint(A >= 2);
+ q.add_constraint(A <= 7);
+ q.add_constraint(B == 1);
+ r.add_constraint(A >= 3);
+ r.add_constraint(A <= 8);
+ r.add_constraint(B == 1);
+ s.add_constraint(A >= 1);
+ s.add_constraint(A <= 6);
+ s.add_constraint(B == 1);
+ Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
+ Q.add_disjunct(p);
+ Q.add_disjunct(q);
+ Q.add_disjunct(s);
+
+ nout << "P = " << P << endl
+ << "Q = " << Q << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_P = P;
+ P.BHZ03_widening_assign<BHRZ03_Certificate>
+ (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+ return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test03() {
+ Variable X(0);
+ Variable Y(1);
+
+ C_Polyhedron p1(2);
+ p1.add_constraint(X >= 0);
+ p1.add_constraint(Y >= 0);
+ p1.add_constraint(X <= 2);
+ p1.add_constraint(Y <= 1);
+
+ C_Polyhedron p2(2);
+ p2.add_constraint(X >= 0);
+ p2.add_constraint(Y >= 2);
+ p2.add_constraint(X <= 1);
+ p2.add_constraint(Y <= 3);
+
+ C_Polyhedron p3(2);
+ p3.add_constraint(X >= 3);
+ p3.add_constraint(Y >= 1);
+ p3.add_constraint(X <= 4);
+ p3.add_constraint(Y <= 3);
+
+ Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+ T1.add_disjunct(p1);
+ T1.add_disjunct(p2);
+ T1.add_disjunct(p3);
+
+ C_Polyhedron p4(2);
+ p4.add_constraint(X >= 0);
+ p4.add_constraint(Y >= 4);
+ p4.add_constraint(X <= 2);
+ p4.add_constraint(Y <= 5);
+
+ Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+ T2.add_disjunct(p1);
+ T2.add_disjunct(p2);
+ T2.add_disjunct(p3);
+ T2.add_disjunct(p4);
+
+ nout << "T1 = " << T1 << endl
+ << "T2 = " << T2 << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+ T2.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ C_Polyhedron pd(2);
+ pd.add_constraint(X >= 0);
+ pd.add_constraint(X <= 4);
+ pd.add_constraint(X + 2*Y >= 10);
+
+ Pointset_Powerset<C_Polyhedron> known_result = old_T2;
+ known_result.add_disjunct(pd);
+
+ nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+ nout << "known result" << " = " << known_result << endl;
+
+ return T2 == known_result
+ && T2.geometrically_covers(old_T2)
+ && T2.geometrically_covers(T1);
+}
+
+const C_Polyhedron&
+aux1_test04(unsigned n) {
+ Variable x(0);
+ Variable y(1);
+ static std::vector<C_Polyhedron> p;
+ if (p.size() < 5) {
+ p.resize(5, C_Polyhedron(2));
+ p[2].add_constraint(0 <= x);
+ p[2].add_constraint(x <= 4);
+ p[2].add_constraint(0 <= y);
+ p[2].add_constraint(y <= 4);
+ p[1] = p[2];
+ p[1].add_constraint(x-y <= 3);
+ p[0] = p[1];
+ p[0].add_constraint(x+y >= 1);
+
+ p[3].add_constraint(0 <= x);
+ p[3].add_constraint(x <= 8);
+ p[3].add_constraint(0 <= y);
+ p[3].add_constraint(y <= 8);
+ p[3].add_constraint(x+y <= 14);
+ p[3].add_constraint(x-y >= -6);
+ p[4] = p[3];
+ p[3].add_constraint(5*x-y >= -2);
+ p[3].add_constraint(x+3*y >= 3);
+ p[4].add_constraint(4*x-y >= -3);
+ p[4].add_constraint(x+2*y >= 2);
+ }
+
+ if (n >= p.size()) {
+ unsigned new_size = p.size();
+ while (n >= new_size)
+ new_size *= 2;
+ p.resize(p.size()*2);
+ }
+
+ if (p[n].is_universe()) {
+ p[n] = aux1_test04(n-4);
+ p[n].affine_image(x, 2*x);
+ p[n].affine_image(y, 8 - 2*y);
+ }
+
+ return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test04(unsigned n) {
+ Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+ if (n == 0) {
+
+ nout << "S0 = { P0 }" << endl;
+
+ s.add_disjunct(aux1_test04(0));
+ return s;
+ }
+
+ const int p_base = (n-1)/3*4;
+
+ switch (n % 3) {
+ case 1:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 1 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test04(p_base + 1));
+ s.add_disjunct(aux1_test04(p_base + 3));
+ break;
+ case 2:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 3 << " }" << endl;
+
+ s.add_disjunct(aux1_test04(p_base + 2));
+ s.add_disjunct(aux1_test04(p_base + 3));
+ break;
+ case 0:
+
+ nout << "S" << n << " = { "
+ << "P" << p_base + 2 << ", "
+ << "P" << p_base + 4 << " }" << endl;
+
+ s.add_disjunct(aux1_test04(p_base + 2));
+ s.add_disjunct(aux1_test04(p_base + 4));
+ break;
+ }
+ return s;
+}
+
+void
+aux3_test04(std::ostream& s, const Variable v) {
+ s << char('x' + v.id());
+}
+
+bool
+test04() {
+ // Install the alternate output function.
+ Variable::set_output_function(aux3_test04);
+
+ Pointset_Powerset<C_Polyhedron> T = aux2_test04(0);
+
+ nout << "T0 = " << T << endl;
+
+ bool converged = false;
+ for (unsigned n = 1; !converged && n <= 20; ++n) {
+ Pointset_Powerset<C_Polyhedron> Sn = aux2_test04(n);
+
+ nout << "S" << n << " = " << Sn << endl;
+
+ Sn.upper_bound_assign(T);
+ Sn.BHZ03_widening_assign<H79_Certificate>
+ (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "T" << n << " = " << Sn << endl;
+
+ if (Sn.definitely_entails(T))
+ converged = true;
+ else
+ swap(Sn, T);
+ }
+
+ return converged;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron p(2);
+ C_Polyhedron q(2);
+ C_Polyhedron r(2);
+ C_Polyhedron s(2);
+ p.add_constraint(A >= 1);
+ p.add_constraint(B == 0);
+ q.add_constraint(A >= 2);
+ q.add_constraint(A <= 7);
+ q.add_constraint(B == 1);
+ r.add_constraint(A >= 3);
+ r.add_constraint(A <= 8);
+ r.add_constraint(B == 1);
+ s.add_constraint(A >= 1);
+ s.add_constraint(A <= 6);
+ s.add_constraint(B == 1);
+ Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
+ Q.add_disjunct(p);
+ Q.add_disjunct(q);
+ Q.add_disjunct(s);
+
+ nout << "P = " << P << endl
+ << "Q = " << Q << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_P = P;
+ P.BHZ03_widening_assign<H79_Certificate>
+ (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+ return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test06() {
+ Variable X(0);
+ Variable Y(1);
+
+ C_Polyhedron p1(2);
+ p1.add_constraint(X >= 0);
+ p1.add_constraint(Y >= 0);
+ p1.add_constraint(X <= 2);
+ p1.add_constraint(Y <= 1);
+
+ C_Polyhedron p3(2);
+ p3.add_constraint(X >= 3);
+ p3.add_constraint(Y >= 1);
+ p3.add_constraint(X <= 4);
+ p3.add_constraint(Y <= 3);
+
+ C_Polyhedron p4(2);
+ p4.add_constraint(X >= 0);
+ p4.add_constraint(Y >= 4);
+ p4.add_constraint(X <= 2);
+ p4.add_constraint(Y <= 5);
+
+ Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+ T1.add_disjunct(p1);
+ T1.add_disjunct(p3);
+ T1.add_disjunct(p4);
+
+ C_Polyhedron p2(2);
+ p2.add_constraint(X >= 0);
+ p2.add_constraint(Y >= 2);
+ p2.add_constraint(X <= 1);
+ p2.add_constraint(Y <= 3);
+
+ Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+ T2.add_disjunct(p1);
+ T2.add_disjunct(p2);
+ T2.add_disjunct(p3);
+ T2.add_disjunct(p4);
+
+ nout << "T1 = " << T1 << endl
+ << "T2 = " << T2 << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+ T2.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ C_Polyhedron phull_T2(2);
+ phull_T2.add_constraint(X >= 0);
+ phull_T2.add_constraint(X <= 4);
+ phull_T2.add_constraint(Y >= 0);
+ phull_T2.add_constraint(Y <= 5);
+ phull_T2.add_constraint(X - 2*Y <= 2);
+ phull_T2.add_constraint(X + Y <= 7);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+ known_result.add_disjunct(phull_T2);
+
+ nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+ nout << "known result" << " = " << known_result << endl;
+
+ return T2 == known_result
+ && T2.geometrically_covers(old_T2)
+ && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing as the lgo for the poly-hull is decreasing.
+bool
+test07() {
+ Variable X(0);
+ Variable Y(1);
+
+ C_Polyhedron p1(2);
+ p1.add_constraint(Y >= 2);
+ p1.add_constraint(Y - X <= 2);
+ p1.add_constraint(X + Y <= 4);
+
+ C_Polyhedron p2(2);
+ p2.add_constraint(X >= 0);
+ p2.add_constraint(Y >= 0);
+ p2.add_constraint(X <= 1);
+ p2.add_constraint(Y <= 1);
+
+ C_Polyhedron p3(2);
+ p3.add_constraint(X >= 2);
+ p3.add_constraint(Y >= 0);
+ p3.add_constraint(X <= 4);
+ p3.add_constraint(Y <= 1);
+
+ C_Polyhedron p4(2);
+ p4.add_constraint(X >= 3);
+ p4.add_constraint(Y >= 2);
+ p4.add_constraint(X <= 4);
+ p4.add_constraint(Y <= 3);
+
+ Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+ T1.add_disjunct(p1);
+ T1.add_disjunct(p2);
+ T1.add_disjunct(p3);
+ T1.add_disjunct(p4);
+
+ C_Polyhedron q1(2);
+ q1.add_constraint(X >= 0);
+ q1.add_constraint(Y >= 0);
+ q1.add_constraint(X <= 4);
+ q1.add_constraint(Y <= 4);
+
+ C_Polyhedron q2(2);
+ q2.add_constraint(X >= 5);
+ q2.add_constraint(Y >= 3);
+ q2.add_constraint(X <= 6);
+ q2.add_constraint(Y <= 4);
+
+ C_Polyhedron q3(2);
+ q3.add_constraint(X >= 5);
+ q3.add_constraint(Y >= 0);
+ q3.add_constraint(X <= 6);
+ q3.add_constraint(Y <= 2);
+
+ Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+ T2.add_disjunct(q1);
+ T2.add_disjunct(q2);
+ T2.add_disjunct(q3);
+
+ nout << "T1 = " << T1 << endl
+ << "T2 = " << T2 << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+ T2.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+ return T2 == old_T2
+ && T2.geometrically_covers(old_T2)
+ && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing; the poly-hull is stable with respect to the certificate
+// and the multiset ordering for this certificate is decreasing.
+bool
+test08() {
+ Variable X(0);
+ Variable Y(1);
+
+ C_Polyhedron p1(2);
+ p1.add_constraint(X >= 1);
+ p1.add_constraint(Y >= 4);
+ p1.add_constraint(X <= 7);
+ p1.add_constraint(Y <= 7);
+ p1.add_constraint(X - Y <= 2);
+ p1.add_constraint(X + Y >= 6);
+
+ C_Polyhedron p2(2);
+ p2.add_constraint(X >= 1);
+ p2.add_constraint(Y >= 1);
+ p2.add_constraint(X <= 3);
+ p2.add_constraint(Y <= 3);
+
+ C_Polyhedron p3(2);
+ p3.add_constraint(X >= 5);
+ p3.add_constraint(Y >= 1);
+ p3.add_constraint(X <= 7);
+ p3.add_constraint(Y <= 3);
+
+ Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+ T1.add_disjunct(p1);
+ T1.add_disjunct(p2);
+ T1.add_disjunct(p3);
+
+ C_Polyhedron q1(2);
+ q1.add_constraint(X >= 0);
+ q1.add_constraint(Y >= 0);
+ q1.add_constraint(X <= 8);
+ q1.add_constraint(Y <= 8);
+
+ C_Polyhedron q2(2);
+ q2.add_constraint(X >= 10);
+ q2.add_constraint(Y >= 6);
+ q2.add_constraint(X <= 12);
+ q2.add_constraint(Y <= 8);
+
+ C_Polyhedron q3(2);
+ q3.add_constraint(X >= 10);
+ q3.add_constraint(Y >= 0);
+ q3.add_constraint(X <= 12);
+ q3.add_constraint(Y <= 4);
+
+ Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+ T2.add_disjunct(q1);
+ T2.add_disjunct(q2);
+ T2.add_disjunct(q3);
+
+ nout << "T1 = " << T1 << endl
+ << "T2 = " << T2 << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+ T2.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+ return T2 == old_T2
+ && T2.geometrically_covers(old_T2)
+ && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// of the elements of the set reduces the multiset ordering.
+bool
+test09() {
+ Variable X(0);
+ Variable Y(1);
+
+ C_Polyhedron p1(2);
+ p1.add_constraint(Y >= 2);
+ p1.add_constraint(Y <= 3);
+ p1.add_constraint(Y - X <= 2);
+ p1.add_constraint(X + Y <= 8);
+
+ C_Polyhedron p2(2);
+ p2.add_constraint(X >= 0);
+ p2.add_constraint(Y >= 0);
+ p2.add_constraint(X <= 1);
+ p2.add_constraint(Y <= 1);
+
+ C_Polyhedron p3(2);
+ p3.add_constraint(X >= 5);
+ p3.add_constraint(Y >= 0);
+ p3.add_constraint(X <= 8);
+ p3.add_constraint(Y <= 1);
+
+ C_Polyhedron p4(2);
+ p4.add_constraint(X >= 7);
+ p4.add_constraint(Y >= 4);
+ p4.add_constraint(X <= 8);
+ p4.add_constraint(Y <= 5);
+
+ Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+ T1.add_disjunct(p1);
+ T1.add_disjunct(p2);
+ T1.add_disjunct(p3);
+ T1.add_disjunct(p4);
+
+ C_Polyhedron q1(2);
+ q1.add_constraint(Y >= 2);
+ q1.add_constraint(Y <= 4);
+ q1.add_constraint(Y - X <= 2);
+ q1.add_constraint(X + Y <= 8);
+
+ Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+ T2.add_disjunct(q1);
+ T2.add_disjunct(p2);
+ T2.add_disjunct(p3);
+ T2.add_disjunct(p4);
+
+ nout << "T1 = " << T1 << endl
+ << "T2 = " << T2 << endl;
+
+ Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+ T2.BHZ03_widening_assign<BHRZ03_Certificate>
+ (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ C_Polyhedron r1(2);
+ r1.add_constraint(Y >= 2);
+ r1.add_constraint(Y - X <= 2);
+ r1.add_constraint(X + Y <= 8);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+ known_result.add_disjunct(r1);
+ known_result.add_disjunct(p2);
+ known_result.add_disjunct(p3);
+ known_result.add_disjunct(p4);
+
+ nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+ return T2 == known_result
+ && T2.geometrically_covers(old_T2)
+ && T2.geometrically_covers(T1);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST_F8(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/Polyhedron/bounded1.cc b/tests/Polyhedron/bounded1.cc
new file mode 100644
index 0000000..db12664
--- /dev/null
+++ b/tests/Polyhedron/bounded1.cc
@@ -0,0 +1,107 @@
+/* Test Polyhedron::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a non-bounded polyhedron.
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ return !ph1.is_bounded();
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a bounded polyhedron (it is a square);
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(x >= 2);
+ ph2.add_constraint(y >= 2);
+ ph2.add_constraint(x <= 4);
+ ph2.add_constraint(y <= 4);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ph2.is_bounded();
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is a universal, zero-dimensional polyhedron.
+ C_Polyhedron ph3;
+
+ print_constraints(ph3, "*** ph3 ***");
+
+ return ph3.is_bounded();
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is an empty, zero-dimensional polyhedron.
+ C_Polyhedron ph4;
+ ph4.add_constraint(Linear_Expression(-3) >= 0);
+
+ print_constraints(ph4, "*** ph4 ***");
+
+ return ph4.is_bounded();
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ // This is an empty polyhedron.
+ C_Polyhedron ph5(4, EMPTY);
+
+ print_constraints(ph5, "*** ph5 ***");
+
+ return ph5.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffineimage1.cc b/tests/Polyhedron/boundedaffineimage1.cc
new file mode 100644
index 0000000..e52ee53
--- /dev/null
+++ b/tests/Polyhedron/boundedaffineimage1.cc
@@ -0,0 +1,250 @@
+/* Test Polyhedron::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 4);
+ ph.add_constraint(A - B <= 2);
+ ph.add_constraint(A - B >= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron kr1 = ph;
+ C_Polyhedron kr2 = ph;
+
+ ph.bounded_affine_image(A, 7-B, B+3);
+
+ kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-B);
+ kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+3);
+ kr1.intersection_assign(kr2);
+
+ bool ok = (ph == kr1);
+
+ print_generators(ph,
+ "*** ph.bounded_affine_image(A, 7-B, B+3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 4);
+ ph.add_constraint(A - B <= 2);
+ ph.add_constraint(A - B >= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron kr1 = ph;
+ C_Polyhedron kr2 = ph;
+
+ ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3);
+
+ kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-3*A+2*B);
+ kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+5*A-3);
+ kr1.intersection_assign(kr2);
+
+ bool ok = (ph == kr1);
+
+ print_generators(ph,
+ "*** ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
+ print_generators(kr1,
+ "*** kr1.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(A == B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.bounded_affine_image(A, A+5, B);
+
+ C_Polyhedron kr1(2, EMPTY);
+
+ bool ok = (ph == kr1);
+
+ print_generators(ph, "*** ph.bounded_affine_image(A, A+5, B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+
+ ph.add_constraint(x <= 1);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(y <= 2);
+ ph.add_constraint(y >= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron kr1(ph);
+ C_Polyhedron kr2(ph);
+
+ ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+ kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1, -1);
+ kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1, -1);
+ kr1.intersection_assign(kr2);
+
+ bool ok = (kr1 == ph);
+
+ print_constraints(ph,
+ "*** ph.bounded_affine_image("
+ "x, -2*x+y+1, -2*x+y+1, -1) ***");
+ print_constraints(kr1,
+ "*** kr1 ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+
+ ph.add_constraint(x <= 1);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(y <= 2);
+ ph.add_constraint(y >= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron kr1(ph);
+ C_Polyhedron kr2(ph);
+
+ ph.bounded_affine_image(x, 2*x + y + 1, 2*x + y + 1, -1);
+
+ kr1.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x + y + 1, -1);
+ kr2.generalized_affine_image(x, LESS_OR_EQUAL, 2*x + y + 1, -1);
+ kr1.intersection_assign(kr2);
+
+ bool ok = (kr1 == ph);
+
+ print_constraints(ph,
+ "*** ph.bounded_affine_image("
+ "x, 2*x+y+1, 2*x+y+1, -1) ***");
+ print_constraints(kr1,
+ "*** kr1 ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+
+ ph.add_constraint(x <= 1);
+ ph.add_constraint(x >= 0);
+ ph.add_constraint(y <= 2);
+ ph.add_constraint(y >= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron kr1(ph);
+ C_Polyhedron kr2(ph);
+
+ ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+ kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1);
+ kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1);
+ kr1.intersection_assign(kr2);
+
+ bool ok = (kr1 == ph);
+
+ print_constraints(ph,
+ "*** ph.bounded_affine_image("
+ "x, -2*x+y+1, -2*x+y+1) ***");
+ print_constraints(kr1,
+ "*** kr1 ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+ ph.add_constraint(A <= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.bounded_affine_image(A, A, 2*A, 3);
+
+ C_Polyhedron kr1(1, EMPTY);
+
+ bool ok = (ph == kr1);
+
+ print_generators(ph, "*** ph.bounded_affine_image(A, A, 2*A, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffinepreimage1.cc b/tests/Polyhedron/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..53be8ee
--- /dev/null
+++ b/tests/Polyhedron/boundedaffinepreimage1.cc
@@ -0,0 +1,125 @@
+/* Test Polyhedron::bounded_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 4);
+ ph.add_constraint(A - B <= 2);
+ ph.add_constraint(A - B >= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ // A longer way of computing the bounded affine preimage below.
+ C_Polyhedron known_result(ph);
+ known_result.add_space_dimensions_and_embed(1);
+ known_result.add_constraint(7-A <= B);
+ known_result.add_constraint(B <= A+3);
+ Variables_Set var_set;
+ var_set.insert(B);
+ known_result.remove_space_dimensions(var_set);
+
+ ph.bounded_affine_preimage(B, 7-A, A+3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph.bounded_affine_preimage(B, 7-A, A+3) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 4);
+ ph.add_constraint(A - B <= 2);
+ ph.add_constraint(A - B >= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ // A longer way of computing the bounded affine preimage below.
+ C_Polyhedron known_result(ph);
+ known_result.add_space_dimensions_and_embed(1);
+ Variable C(2);
+ known_result.add_constraint(7 - 3*A + 2*C <= B);
+ known_result.add_constraint(B <= C + 5*A - 3);
+ Variables_Set var_set;
+ var_set.insert(B);
+ known_result.remove_space_dimensions(var_set);
+
+ ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** "
+ "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(A == B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.bounded_affine_preimage(A, B+5, A-3);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph.bounded_affine_preimage(A, B+5, A-3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/boundedbhrz03extrapolation1.cc b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..8250529
--- /dev/null
+++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
@@ -0,0 +1,153 @@
+/* Test Polyhedron::bounded_BHRZ03_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PROPAGATION_STEPS 1
+#define NUMBER_OF_TOKENS 1
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable v) {
+ s << char('i' + v.id());
+}
+
+bool
+test01() {
+ Variable::output_function_type* old_output_function
+ = Variable::get_output_function();
+
+ try {
+ Variable::set_output_function(aux_test01);
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(i == 1);
+ ph.add_constraint(j == 1);
+ ph.add_constraint(0 <= k);
+ ph.add_constraint(k <= 1);
+
+ C_Polyhedron old_ph(3, EMPTY);
+
+ // Propagation.
+ for (int steps = 0; steps < PROPAGATION_STEPS; ++steps) {
+ old_ph = ph;
+
+ ph.affine_image(i, i+1);
+ ph.affine_image(j, j+k);
+ ph.affine_image(k, k-1);
+
+ old_ph.upper_bound_assign(ph);
+
+ ph = old_ph;
+ }
+
+ // Widening.
+ Constraint_System up_to_constraints = ph.constraints();
+
+ print_constraints(up_to_constraints, "*** up_to_constraints ***");
+
+ unsigned tokens = NUMBER_OF_TOKENS;
+
+ for (int step = 1; ; ++step) {
+
+ nout << "\nAt step " << step << endl;
+ print_constraints(ph);
+
+ old_ph = ph;
+
+ ph.affine_image(i, i+1);
+ ph.affine_image(j, j+k);
+ ph.affine_image(k, k-1);
+
+ ph.upper_bound_assign(old_ph);
+ if (old_ph.contains(ph))
+ break;
+
+ // Notice that neither the H79 nor the BHRZ03 limited
+ // extrapolations (used as widenings here) allow to obtain the
+ // desired postfixpoint for this example. Both the H79 and the
+ // BHRZ03 bounded extrapolation operators do achieve this result.
+ ph.bounded_H79_extrapolation_assign(old_ph, up_to_constraints, &tokens);
+ }
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(-i - k >= -2);
+ known_result.add_constraint(i - j + k >= 0);
+ known_result.add_constraint(i - j + 2*k >= -1);
+ known_result.add_constraint(i + k >= 1);
+ known_result.add_constraint(i >= 1);
+ known_result.add_constraint(i - j >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "\nPostfixpoint");
+
+ Variable::set_output_function(old_output_function);
+ return ok;
+ }
+ catch (...) {
+ Variable::set_output_function(old_output_function);
+ throw;
+ }
+}
+
+bool test02() {
+ Variable x(0);
+
+ C_Polyhedron P1(1);
+ P1.add_constraint(1 <= x);
+ P1.add_constraint(x <= 2);
+
+ C_Polyhedron P2(1);
+ P2.add_constraint(0 <= x);
+ P2.add_constraint(x <= 3);
+
+ Constraint_System cs;
+
+ print_constraints(P1, "*** P1 ***");
+ print_constraints(P2, "*** P2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ P2.bounded_BHRZ03_extrapolation_assign(P1, cs);
+
+ C_Polyhedron known_result(1);
+ known_result.add_constraint(0 <= x);
+
+ bool ok = (P2 == known_result);
+
+ print_constraints(P2,
+ "*** P2.bounded_BHRZ03_extrapolation_assign(P1, cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8A(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/boundedh79extrapolation1.cc b/tests/Polyhedron/boundedh79extrapolation1.cc
new file mode 100644
index 0000000..ce27ef8
--- /dev/null
+++ b/tests/Polyhedron/boundedh79extrapolation1.cc
@@ -0,0 +1,81 @@
+/* Test Polyhedron::bounded_H79_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x-3 >= 0);
+ ph1.add_constraint(x-3 <= 1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(2*x-5 >= 0);
+ ph2.add_constraint(x-3 <= 1);
+ ph2.add_constraint(2*y+3 >= 0);
+ ph2.add_constraint(2*y-5 <= 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= y);
+
+ print_constraints(cs, "*** cs ***");
+
+ ph2.bounded_H79_extrapolation_assign(ph1, cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 2);
+ known_result.add_constraint(x <= 4);
+ known_result.add_constraint(y >= -2);
+ known_result.add_constraint(x >= y);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2,
+ "*** after ph2.bounded_H79_extrapolation_assign(ph1, cs) "
+ "***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+// Note: test01() only overflows on NNC polyhedra
+// (with 8-bit coefficients and assertions turned on).
+#ifdef DERIVED_TEST
+ DO_TEST_F8A(test01);
+#else
+ DO_TEST(test01);
+#endif
+END_MAIN
diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc
new file mode 100644
index 0000000..9ee3b59
--- /dev/null
+++ b/tests/Polyhedron/bounds1.cc
@@ -0,0 +1,65 @@
+/* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ bool ok = ph1.bounds_from_above(Linear_Expression(3))
+ && ph2.bounds_from_below(A);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 1);
+ ph.add_constraint(B >= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool ok = !ph.bounds_from_above(A + B) && ph.bounds_from_below(A + B);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc
new file mode 100644
index 0000000..092a48f
--- /dev/null
+++ b/tests/Polyhedron/cnncconversion1.cc
@@ -0,0 +1,154 @@
+/* Test conversions between C_Polyhedron and NNC_Polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A - B >= 0);
+ ph1.add_constraint(A >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(ph1);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A - B >= 0);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(3);
+ ph1.add_constraint(x >= 5);
+ ph1.add_constraint(y > x - 3);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(ph1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(x >= 5);
+ known_result.add_constraint(y >= x - 3);
+
+ return ph2 == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A < 2);
+ ph1.add_constraint(B > 0);
+ ph1.add_constraint(A - B > 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(ph1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 0);
+
+ return ph2 == known_result;
+}
+
+bool
+test04() {
+
+ C_Polyhedron ph(4, UNIVERSE);
+
+ NNC_Polyhedron nnc_ph(ph, POLYNOMIAL_COMPLEXITY);
+
+ NNC_Polyhedron known_result(4);
+
+ bool ok = (known_result == nnc_ph);
+
+ print_constraints(nnc_ph, "*** nnc_ph ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(A - B > 4);
+ cs.insert(-C - D >= 0);
+ cs.insert(A + B - C == 0);
+ cs.insert(-A + B - C < 4);
+ cs.insert(A - B - C + D > 1);
+ NNC_Polyhedron ph(cs);
+
+ C_Polyhedron c_ph(ph, SIMPLEX_COMPLEXITY);
+
+ Constraint_System cs1;
+ cs1.insert(A - B >= 4);
+ cs1.insert(-C - D >= 0);
+ cs1.insert(A + B - C == 0);
+ cs1.insert(-A + B - C <= 4);
+ cs1.insert(A - B - C + D >= 1);
+ C_Polyhedron known_result(cs1);
+
+ bool ok = (known_result == c_ph);
+
+ print_constraints(c_ph, "*** c_ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/concatenate1.cc b/tests/Polyhedron/concatenate1.cc
new file mode 100644
index 0000000..a222d52
--- /dev/null
+++ b/tests/Polyhedron/concatenate1.cc
@@ -0,0 +1,284 @@
+/* Test Polyhedron::concatenate_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+ C_Polyhedron ph(cs1);
+
+ print_constraints(ph, "*** ph before ***");
+
+ Constraint_System cs2;
+ cs2.insert(x >= 1);
+ cs2.insert(y >= 1);
+ cs2.insert(x - y >= -1);
+ C_Polyhedron qh(cs2);
+
+ C_Polyhedron copy_ph = ph;
+
+ ph.concatenate_assign(qh);
+
+ copy_ph.add_space_dimensions_and_embed(2);
+ copy_ph.add_constraint(z >= 1);
+ copy_ph.add_constraint(w >= 1);
+ copy_ph.add_constraint(z - w >= -1);
+
+ bool ok = (ph == copy_ph);
+
+ print_constraints(ph, "*** concatenate_assign ***");
+ print_constraints(copy_ph, "*** embed + renaming + insert ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Constraint_System cs;
+ cs.insert(x >= y);
+ cs.insert(x >= 2);
+ C_Polyhedron qh(cs);
+
+ print_constraints(qh, "*** qh ***");
+
+ ph.concatenate_assign(qh);
+
+ C_Polyhedron known_result(4, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after concatenate_assign(qh) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph;
+
+ print_constraints(ph, "*** ph ***");
+
+ Constraint_System cs;
+ cs.insert(x - 3 >= y);
+ cs.insert(y >= 0);
+ C_Polyhedron qh(cs);
+
+ print_constraints(qh, "*** qh ***");
+
+ ph.concatenate_assign(qh);
+
+ bool ok = (ph == qh);
+
+ print_constraints(ph, "*** after concatenate_assign(qh) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(2*A));
+ gs1.insert(point(2*B));
+ gs1.insert(point(2*A + 2*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(2*A));
+ gs2.insert(point(2*A + 3*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.concatenate_assign(ph2);
+
+ C_Polyhedron known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(C == 2);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D <= 3);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after concatenate_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A - B >= 0);
+
+ C_Polyhedron ph2;
+
+ C_Polyhedron known_result(ph1);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.concatenate_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(1);
+ ph1.generators();
+ ph1.add_constraint(A >= 0);
+
+ C_Polyhedron ph2(1);
+ ph2.generators();
+ ph2.add_constraint(A == 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.concatenate_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(1, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(ray(A));
+
+ C_Polyhedron ph2(1, EMPTY);
+ ph2.add_generator(point(2*A));
+ ph2.constraints();
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.concatenate_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(-A >= -2);
+ ph1.generators();
+ ph1.add_generator(point(0*A));
+ ph1.add_generator(point(2*A));
+
+ C_Polyhedron ph2(1, EMPTY);
+ ph2.add_generator(point(10*A));
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.concatenate_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(-A >= -2);
+ known_result.add_constraint(B == 10);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/congruences1.cc b/tests/Polyhedron/congruences1.cc
new file mode 100644
index 0000000..da0af52
--- /dev/null
+++ b/tests/Polyhedron/congruences1.cc
@@ -0,0 +1,365 @@
+/* Test C_Polyhedron(Congruence_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty polyhedron.
+bool
+test01() {
+ C_Polyhedron ph1(7, EMPTY);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron ph2(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Universe polyhedron.
+bool
+test02() {
+ C_Polyhedron ph1(7);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron ph2(7);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test03() {
+ C_Polyhedron ph1(0, EMPTY);
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+ bool ok = (ph1 == known_ph);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test04() {
+ C_Polyhedron ph1(0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron ph2(0);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A + B >= 3);
+ ph1.add_constraint(A == 0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron ph2(3);
+ ph2.add_congruences(cgs);
+ ph2.add_constraint(A + B >= 3);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A + B >= 3);
+ ph1.add_constraint(A + B <= 3);
+ ph1.add_constraint(A == 0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.congruences();
+
+ C_Polyhedron ph2(3);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Empty polyhedron.
+bool
+test07() {
+ C_Polyhedron ph1(7, EMPTY);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron ph2(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Universe polyhedron.
+bool
+test08() {
+ C_Polyhedron ph1(7);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron ph2(7);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test09() {
+ C_Polyhedron ph1(0, EMPTY);
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+ bool ok = (ph1 == known_ph);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test10() {
+ C_Polyhedron ph1(0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron ph2(0);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A + B >= 3);
+ ph1.add_constraint(A == 0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron ph2(3);
+ ph2.add_congruences(cgs);
+ ph2.add_constraint(A + B >= 3);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A + B >= 3);
+ ph1.add_constraint(A + B <= 3);
+ ph1.add_constraint(A == 0);
+
+ C_Polyhedron known_ph = ph1;
+
+ Congruence_System cgs = ph1.minimized_congruences();
+
+ C_Polyhedron ph2(3);
+ ph2.add_congruences(cgs);
+
+ bool ok = (ph2 == known_ph);
+
+ print_congruences(cgs, "*** cgs ***");
+ print_constraints(ph2, "*** ph2(cgs) ***");
+
+ return ok;
+}
+
+bool test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Congruence_System cgs;
+ cgs.insert(0*x %= 3);
+ cgs.insert(y == 3);
+
+ C_Polyhedron ph(cgs);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y == 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after add_congruences ***");
+
+ return ok;
+}
+
+bool test14() {
+ Variable x(0);
+ Variable y(1);
+
+ Congruence_System cgs;
+ cgs.insert((2*y %= 2) / 3);
+
+ Constraint_System cs(cgs);
+ print_constraints(cs, "*** cs ***");
+
+ cs.insert(0*x > -1);
+ print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+ C_Polyhedron ph(cs);
+
+ bool ok = ph.is_universe();
+
+ print_constraints(ph, "*** ph(cs) ***");
+
+ return ok;
+}
+
+// A similar test to the previous test but with 0 dimensions.
+bool test15() {
+ Variable x(0);
+
+ Congruence_System cgs;
+
+ Constraint_System cs(cgs);
+ print_constraints(cs, "*** cs ***");
+
+ cs.insert(0*x > -1);
+ print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+ C_Polyhedron ph(cs);
+
+ bool ok = ph.is_universe();
+
+ print_constraints(ph, "*** ph(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/constrains1.cc b/tests/Polyhedron/constrains1.cc
new file mode 100644
index 0000000..8fb2a87
--- /dev/null
+++ b/tests/Polyhedron/constrains1.cc
@@ -0,0 +1,233 @@
+/* Test Polyhedron::constrains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred) \
+ if (!pred) { \
+ nout << "!" #pred << endl; \
+ ok = false; \
+ }
+
+#define TEST_PREDICATE_FALSE(pred) \
+ if (pred) { \
+ nout << #pred << endl; \
+ ok = false; \
+ }
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(0*A == 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(ph.constrains(A));
+ TEST_PREDICATE_FALSE(ph.constrains(B));
+
+ ph.add_constraint(0*A == 1);
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ ph.add_generator(point());
+ ph.add_generator(line(A+B));
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ ph.add_generator(line(A-B));
+
+ TEST_PREDICATE_FALSE(ph.constrains(A));
+ TEST_PREDICATE_FALSE(ph.constrains(B));
+
+ ph.add_constraint(A >= 1);
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_FALSE(ph.constrains(B));
+
+ ph.add_constraint(B >= 2);
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ ph.add_constraint(A <= B);
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3, EMPTY);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+ TEST_PREDICATE_TRUE(ph.constrains(C));
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ C_Polyhedron ph(0);
+ ph.add_constraint(Linear_Expression::zero() == 1);
+
+ try {
+ (void) ph.constrains(A);
+ }
+ catch (std::invalid_argument& e) {
+ return true;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return false;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.generators();
+ ph.add_constraint(B >= 7);
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point());
+ ph.constraints();
+ ph.add_generator(ray(A));
+ ph.add_generator(ray(-A));
+
+ bool ok = true;
+
+ TEST_PREDICATE_FALSE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_FALSE(ph.constrains(B));
+
+ ph.add_constraint(B >= A);
+
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(A >= B+1);
+ ph.add_constraint(A <= B);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(ph.constrains(C));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(A >= B);
+ ph.add_generator(point());
+ ph.generators();
+ ph.add_constraint(A <= B-1);
+
+ bool ok = true;
+
+ TEST_PREDICATE_TRUE(ph.constrains(C));
+ TEST_PREDICATE_TRUE(ph.constrains(B));
+ TEST_PREDICATE_TRUE(ph.constrains(A));
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/constraints1.cc b/tests/Polyhedron/constraints1.cc
new file mode 100644
index 0000000..39f9827
--- /dev/null
+++ b/tests/Polyhedron/constraints1.cc
@@ -0,0 +1,166 @@
+/* Test Polyhedron::constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(0*A == 1);
+
+ print_constraints(ph1, "*** ph1 constraints ***");
+
+ C_Polyhedron known_result = ph1;
+
+ Constraint_System cs = ph1.constraints();
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1(3, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron known_result = ph1;
+
+ Constraint_System cs = ph1.constraints();
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph1(0);
+ ph1.add_constraint(Linear_Expression::zero() == 1);
+ C_Polyhedron known_result(ph1);
+
+ const Constraint_System cs = ph1.constraints();
+
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.generators();
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron known_result(ph1);
+
+ Constraint_System cs = ph1.constraints();
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(ray(A));
+ ph1.add_generator(ray(B));
+
+ C_Polyhedron known_result(ph1);
+
+ Constraint_System cs = ph1.constraints();
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(B >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Constraint_System cs = ph.constraints();
+ cs.insert(A >= B);
+
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A >= B);
+
+ return C_Polyhedron(cs) == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/contains1.cc b/tests/Polyhedron/contains1.cc
new file mode 100644
index 0000000..212f846
--- /dev/null
+++ b/tests/Polyhedron/contains1.cc
@@ -0,0 +1,115 @@
+/* Test Polyhedron::contains(const Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron segment(2);
+ segment.add_constraint(x >= 0);
+ segment.add_constraint(x <= 1);
+ segment.add_constraint(y == 0);
+
+ print_constraints(segment, "*** segment constraints ***");
+ print_generators(segment, "*** segment generators ***");
+
+ C_Polyhedron halfline(2);
+ halfline.add_constraint(x >= 0);
+ halfline.add_constraint(y == 0);
+
+ print_constraints(halfline, "*** halfline constraints ***");
+ print_generators(halfline, "*** halfline generators ***");
+
+ bool segment_includes_halfline = segment.contains(halfline);
+
+ nout << "segment ";
+ if (segment_includes_halfline)
+ nout << "includes ";
+ else
+ nout << "does not include ";
+ nout << "or is equal to halfline" << endl;
+
+ bool halfline_includes_segment = halfline.contains(segment);
+
+ nout << "halfline ";
+ if (halfline_includes_segment)
+ nout << "includes ";
+ else
+ nout << "does not include ";
+ nout << "or is equal to segment" << endl;
+
+ return halfline_includes_segment && !segment_includes_halfline;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x + 0*y >= 2);
+ C_Polyhedron p_half_space(cs);
+
+ print_constraints(p_half_space, "*** p_half_space constraints ***");
+ print_generators(p_half_space, "*** p_half_space generators ***");
+
+ Generator_System gs;
+ gs.insert(point(2*x));
+ gs.insert(line(x+y));
+ C_Polyhedron p_line(gs);
+
+ print_constraints(p_line, "*** p_line constraints ***");
+ print_generators(p_line, "*** p_line generators ***");
+
+ bool p_half_space_includes_p_line = p_half_space.contains(p_line);
+
+ nout << "p_half_space ";
+ if (p_half_space_includes_p_line)
+ nout << "includes ";
+ else
+ nout << "does not include ";
+ nout << "or is equal to p_line" << endl;
+
+ bool p_line_includes_p_half_space = p_line.contains(p_half_space);
+
+ nout << "p_line ";
+ if (p_line_includes_p_half_space)
+ nout << "includes ";
+ else
+ nout << "does not include ";
+ nout << "or is equal to p_half_space" << endl;
+
+ return !p_line_includes_p_half_space && !p_half_space_includes_p_line;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/contains2.cc b/tests/Polyhedron/contains2.cc
new file mode 100644
index 0000000..69fa50a
--- /dev/null
+++ b/tests/Polyhedron/contains2.cc
@@ -0,0 +1,177 @@
+/* Test NNC_Polyhedron::contains(const Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ // Building a square without vertices.
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 2);
+ cs.insert(x - y < 1);
+ cs.insert(x - y > -1);
+
+ NNC_Polyhedron ph1(cs);
+
+ // Building an equivalent square.
+ Generator_System gs;
+ gs.insert(closure_point());
+ gs.insert(closure_point(x));
+ gs.insert(closure_point(y));
+ gs.insert(closure_point(x + y));
+ gs.insert(point(x, 10));
+ gs.insert(point(y, 10));
+ gs.insert(point(x + 10*y, 10));
+ gs.insert(point(10*x + y, 10));
+
+ NNC_Polyhedron ph2(gs);
+
+ bool ok = ph1.contains(ph2);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A > 0);
+ ph1.add_constraint(B > 0);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(line(A + B));
+ NNC_Polyhedron ph2(gs2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ bool ok = !ph1.contains(ph2);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= B);
+ cs.insert(B >= 0);
+ C_Polyhedron ph1(cs);
+ C_Polyhedron ph2(ph1);
+ ph2.add_constraint(A == B);
+
+ bool ok = ph1.contains(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= B);
+ cs.insert(B >= 0);
+ NNC_Polyhedron ph1(cs);
+ NNC_Polyhedron ph2(ph1);
+ ph2.add_constraint(A > B);
+
+ bool ok = ph1.strictly_contains(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs1;
+ cs1.insert(A >= B);
+ cs1.insert(B >= 0);
+ C_Polyhedron ph1(cs1);
+ Constraint_System cs2;
+ cs2.insert(A >= B);
+ cs2.insert(A <= 0);
+ C_Polyhedron ph2(cs2);
+
+ bool ok = (ph1 != ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(B >= 0);
+ NNC_Polyhedron ph1(cs);
+ NNC_Polyhedron ph2(ph1);
+ ph2.add_constraint(A > 0);
+
+ bool ok = ph1.strictly_contains(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/containsintegerpoint1.cc b/tests/Polyhedron/containsintegerpoint1.cc
new file mode 100644
index 0000000..0c31432
--- /dev/null
+++ b/tests/Polyhedron/containsintegerpoint1.cc
@@ -0,0 +1,176 @@
+/* Test C_Polyhedron::contains_integer_point().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y <= 2);
+ cs.insert(3*y >= 1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(3*y - 3*z <= 2);
+ cs.insert(8*z - 8*y >= 7);
+
+ C_Polyhedron ph(3);
+ ph.add_constraints(cs);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(3*x - 3*y >= 1);
+ cs.insert(3*x - 3*y <= 2);
+
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(3*x + 3*y >= 13);
+ cs.insert(3*x + 3*y < 15);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraints(cs);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test05() {
+ C_Polyhedron ph(2);
+ ph.add_constraint(Linear_Expression(0) >= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test06() {
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(Linear_Expression(1) > 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+bool
+test07() {
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(Linear_Expression(1) >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool contains = ph.contains_integer_point();
+
+ nout << "ph.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint1.cc b/tests/Polyhedron/disjoint1.cc
new file mode 100644
index 0000000..39ec4ad
--- /dev/null
+++ b/tests/Polyhedron/disjoint1.cc
@@ -0,0 +1,146 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(B == 0);
+ ph1.add_constraint(A >= 1);
+ ph1.add_constraint(A <= 2);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A == 0);
+ ph2.add_constraint(B >= 1);
+ ph2.add_constraint(B <= 2);
+
+ bool ok = ph1.is_disjoint_from(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+C_Polyhedron
+half_strip(const Generator& p, const Linear_Expression& e) {
+ assert(p.is_point());
+
+ Linear_Expression e1(p.expression());
+ e1 += 3*Variable(0);
+
+ Generator_System gs;
+ gs.insert(p);
+ gs.insert(ray(e));
+ gs.insert(point(e1, p.divisor()));
+ C_Polyhedron ph(gs);
+ return ph;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1 = half_strip(point(A + B), B);
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(2*A + B));
+ ph2.add_generator(point(4*A + 3*B));
+ ph2.add_generator(ray(A - B));
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return !disjoint;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1 = half_strip(point(A + B), B);
+ C_Polyhedron ph2 = half_strip(point(4*A + B), B);
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return !disjoint;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1 = half_strip(point(A + B), B);
+ C_Polyhedron ph2 = half_strip(point(A + B), -B);
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return !disjoint;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1 = half_strip(point(), B);
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(2*A - 2*B));
+ ph2.add_generator(point(-2*A + 2*B));
+ ph2.add_generator(ray(-A - B));
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return !disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint2.cc b/tests/Polyhedron/disjoint2.cc
new file mode 100644
index 0000000..54d1646
--- /dev/null
+++ b/tests/Polyhedron/disjoint2.cc
@@ -0,0 +1,133 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+NNC_Polyhedron
+half_strip(const Generator& p,
+ const Linear_Expression& e,
+ bool closed = true) {
+ assert((p.is_point() && closed) || (p.is_closure_point() && ! closed));
+
+ Linear_Expression e1(p.expression());
+ e1 += 3*Variable(0);
+
+ Generator_System gs;
+ gs.insert(p);
+ gs.insert(ray(e));
+ if (closed)
+ gs.insert(point(e1, p.divisor()));
+ else {
+ gs.insert(closure_point(e1, p.divisor()));
+ e1 -= Variable(0);
+ e1 += e.coefficient(Variable(1)) * p.divisor() * Variable(1);
+ gs.insert(point(e1));
+ }
+ NNC_Polyhedron ph(gs);
+ return ph;
+}
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+
+ NNC_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(3*A + B));
+ ph2.add_generator(closure_point(2*A + B));
+ ph2.add_generator(closure_point(4*A + 3*B));
+ ph2.add_generator(ray(A - B));
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return !disjoint;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+ NNC_Polyhedron ph2 = half_strip(closure_point(4*A + B), B, false);
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return disjoint;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+ NNC_Polyhedron ph2 = half_strip(closure_point(A + B), -B, false);
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return disjoint;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1 = half_strip(point(), B);
+
+ NNC_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(-2*A - 2*B));
+ ph2.add_generator(closure_point(2*A - 2*B));
+ ph2.add_generator(closure_point(-2*A + 2*B));
+ ph2.add_generator(ray(-A - B));
+
+ bool disjoint = ph1.is_disjoint_from(ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/dropsomenonintegerpoints1.cc b/tests/Polyhedron/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..a1851e9
--- /dev/null
+++ b/tests/Polyhedron/dropsomenonintegerpoints1.cc
@@ -0,0 +1,175 @@
+/* Test Polyhedron::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A >= 1);
+ ph.add_constraint(2*B >= -1);
+ ph.add_constraint(6*A - 3*B >= 7);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(2*A - B >= 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result1(0, EMPTY);
+ C_Polyhedron known_result2(ph2);
+
+ ph1.drop_some_non_integer_points();
+ ph2.drop_some_non_integer_points();
+
+ bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+ print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+ print_constraints(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B == 0);
+ ph.add_constraint(A >= 0);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A == B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A+B, 2));
+ ph.add_generator(line(B));
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A <= 1);
+ ph.add_constraint(2*B <= -1);
+ ph.add_constraint(6*A - 3*B <= 7);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ bool ok = true; //(ph1 == ph2);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/dropsomenonintegerpoints2.cc b/tests/Polyhedron/dropsomenonintegerpoints2.cc
new file mode 100644
index 0000000..42176d9
--- /dev/null
+++ b/tests/Polyhedron/dropsomenonintegerpoints2.cc
@@ -0,0 +1,196 @@
+/* Test Polyhedron::drop_some_non_integer_points().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A > 1);
+ ph1.add_constraint(A - B > 0);
+ Generator_System gs;
+ gs.insert(point(2*A));
+ gs.insert(closure_point(A + B));
+ gs.insert(ray(-B));
+ gs.insert(ray(A + B));
+ NNC_Polyhedron ph2(gs);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.drop_some_non_integer_points();
+ ph2.drop_some_non_integer_points();
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+ print_generators(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ NNC_Polyhedron ph1;
+ NNC_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result1(0, EMPTY);
+ NNC_Polyhedron known_result2(ph2);
+
+ ph1.drop_some_non_integer_points();
+ ph2.drop_some_non_integer_points();
+
+ bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+ print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+ print_constraints(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B == 0);
+ ph.add_constraint(A >= 0);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A > 0);
+ ph.add_constraint(A == B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A));
+ ph.constraints();
+ ph.add_generator(closure_point());
+ ph.add_generator(ray(A));
+ ph.add_generator(ray(B));
+
+ print_generators(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points();
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A, 2));
+ ph.add_generator(point(B, 2));
+
+ print_generators(ph, "*** ph ***");
+
+ ph.drop_some_non_integer_points(Variables_Set(B));
+
+ C_Polyhedron known_result1(2, EMPTY);
+ known_result1.add_generator(point(A, 2));
+
+ bool ok = (ph == known_result1);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points({B}) ***");
+
+ if (!ok)
+ return ok;
+
+ ph.drop_some_non_integer_points(Variables_Set(A));
+
+ C_Polyhedron known_result2(2, EMPTY);
+
+ ok = (ph == known_result2);
+
+ print_constraints(ph, "*** after ph.drop_some_non_integer_points({A}) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc
new file mode 100644
index 0000000..ea46875
--- /dev/null
+++ b/tests/Polyhedron/dualhypercubes.cc
@@ -0,0 +1,392 @@
+/* Exploit smf when computing the intersection of NNC dual hypercubes.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+#include <vector>
+#include <map>
+
+// Define EXP_EVAL to 1 if you want to reproduce the results
+// of the experimental evaluation reported in Table 2 of the paper:
+// R. Bagnara, P.M. Hill, E. Zaffanella
+// Not Necessarily Closed Convex Polyhedra and the Double Description Method.
+// Formal Aspects of Computing, 17, 2 (2005), pp. 222-257.
+#ifndef EXP_EVAL
+#define EXP_EVAL 0
+#endif
+
+namespace {
+
+void
+closure_points_dual_hypercube(const dimension_type dims,
+ const Linear_Expression& weight_center,
+ const Coefficient& half_diagonal,
+ Generator_System& gs) {
+ // An ill-formed (it has no points at all) generator system
+ // for a dual hypercube.
+ for (dimension_type axis = dims; axis-- > 0; ) {
+ gs.insert(closure_point(weight_center + half_diagonal * Variable(axis)));
+ gs.insert(closure_point(weight_center - half_diagonal * Variable(axis)));
+ }
+}
+
+void
+add_facets(dimension_type& to_be_added,
+ Generator_System& gs,
+ const Linear_Expression& expr,
+ const dimension_type axis,
+ const dimension_type dims,
+ const Linear_Expression& weight_center,
+ const Coefficient& half_diagonal) {
+ // Return if we have already added all facets.
+ if (to_be_added == 0)
+ return;
+
+ Linear_Expression expr1 = expr;
+ expr1 += half_diagonal * Variable(axis);
+ Linear_Expression expr2 = expr;
+ expr2 -= half_diagonal * Variable(axis);
+
+ if (axis == 0) {
+ gs.insert(point(dims * weight_center + expr1, dims));
+ --to_be_added;
+ if (to_be_added == 0)
+ return;
+ gs.insert(point(dims * weight_center + expr2, dims));
+ --to_be_added;
+ return;
+ }
+
+ // Here axis > 0.
+ // First recursive call with variable with index `axis'
+ // having coordinate 1/dims.
+ add_facets(to_be_added, gs, expr1,
+ axis-1, dims, weight_center, half_diagonal);
+ if (to_be_added == 0)
+ return;
+ // Second recursive call with variable with index `axis'
+ // having coordinate -1/dims.
+ add_facets(to_be_added, gs, expr2,
+ axis-1, dims, weight_center, half_diagonal);
+}
+
+NNC_Polyhedron
+NNC_dual_hypercube(const dimension_type dims,
+ const Linear_Expression& weight_center,
+ const Coefficient& half_diagonal,
+ const int facet_percentage) {
+ Generator_System gs;
+ closure_points_dual_hypercube(dims, weight_center, half_diagonal, gs);
+ // Number of facets in the closed dual hypercube.
+ dimension_type num_facets = 1;
+ for (dimension_type axis = dims; axis-- > 0; )
+ num_facets *= 2;
+ dimension_type facets_to_be_added = (num_facets * facet_percentage) / 100;
+ if (facets_to_be_added == 0)
+ // There has to be a point, at least.
+ gs.insert(point(weight_center));
+ else
+ add_facets(facets_to_be_added, gs, Linear_Expression(0),
+ dims-1, dims, weight_center, half_diagonal);
+ // Actually build the polyhedron.
+ return NNC_Polyhedron(gs);
+}
+
+void
+build_polyhedra(const dimension_type dims,
+ const int percentage,
+ std::vector<NNC_Polyhedron>& ph) {
+
+ Linear_Expression weight_center;
+
+ // 1st-polyhedron.
+ weight_center = Linear_Expression(0);
+ for (dimension_type axis = dims; axis-- > 0; )
+ weight_center += Variable(axis);
+ ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
+
+ // 2nd-polyhedron.
+ weight_center = Linear_Expression(0);
+ for (dimension_type axis = dims; axis-- > 0; )
+ weight_center += 2*Variable(axis);
+ ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
+
+ // 3rd-polyhedron.
+ weight_center = Linear_Expression(0);
+ for (dimension_type axis = dims; axis-- > 0; )
+ if (axis % 2 == 0)
+ weight_center += 10*Variable(axis);
+ else
+ weight_center += 2*Variable(axis);
+ ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
+
+ // 4th-polyhedron.
+ weight_center = Linear_Expression(0);
+ for (dimension_type axis = dims; axis-- > 0; )
+ if (axis % 2 == 0)
+ weight_center += 10*Variable(axis);
+ else
+ weight_center += Variable(axis);
+ ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
+}
+
+long
+computation(std::vector<NNC_Polyhedron>& ph, bool enhanced) {
+ nout << endl;
+ if (enhanced)
+ nout << "Enhanced computation: ";
+ else
+ nout << "Standard computation: ";
+ nout << "working with 4 NNC dual hypercubes of dimension "
+ << ph[0].space_dimension() << endl;
+
+ start_clock();
+
+ /**** Compute the intersection of ph[0] and ph[1]. ****/
+
+ // Print cardinalities of arguments.
+ nout << " - Computing intersection of ph[0] and ph[1]:" << endl;
+ const Generator_System& gs_0 = ph[0].generators();
+ nout << " # ph[0].generators() = "
+ << std::distance(gs_0.begin(), gs_0.end()) << endl;
+ const Generator_System& gs_1 = ph[1].generators();
+ nout << " # ph[1].generators() = "
+ << std::distance(gs_1.begin(), gs_1.end()) << endl;
+ // Very noisy dump of arguments.
+ vnout << "*** ph[0] generators ***" << endl;
+ gs_0.ascii_dump(vnout);
+ vnout << "*** ph[1] generators ***" << endl;
+ gs_1.ascii_dump(vnout);
+ vnout << endl;
+
+ const Constraint_System& cs_0 = enhanced
+ ? ph[0].minimized_constraints()
+ : ph[0].constraints();
+ const Constraint_System& cs_1 = enhanced
+ ? ph[1].minimized_constraints()
+ : ph[1].constraints();
+
+ // Print cardinalities of constraint systems.
+ nout << " # ph[0].constraints() = "
+ << std::distance(cs_0.begin(), cs_0.end()) << endl;
+ nout << " # ph[1].constraints() = "
+ << std::distance(cs_1.begin(), cs_1.end()) << endl;
+ // Very noisy dump of arguments.
+ vnout << "*** ph[0] constraints ***" << endl;
+ cs_0.ascii_dump(vnout);
+ vnout << "*** ph[1] constraints ***" << endl;
+ cs_1.ascii_dump(vnout);
+ vnout << endl;
+
+ ph[0].intersection_assign(ph[1]);
+
+ /**** Compute the intersection of ph[2] and ph[3]. ****/
+
+ // Print cardinalities of arguments.
+ nout << " - Computing intersection of ph[2] and ph[3]:" << endl;
+ const Generator_System& gs_2 = ph[2].generators();
+ nout << " # ph[2].generators() = "
+ << std::distance(gs_2.begin(), gs_2.end()) << endl;
+ const Generator_System& gs_3 = ph[3].generators();
+ nout << " # ph[3].generators() = "
+ << std::distance(gs_3.begin(), gs_3.end()) << endl;
+ // Very noisy dump of arguments.
+ vnout << "*** ph[2] generators ***" << endl;
+ gs_2.ascii_dump(vnout);
+ vnout << "*** ph[3] generators ***" << endl;
+ gs_3.ascii_dump(vnout);
+ vnout << endl;
+
+ const Constraint_System& cs_2 = enhanced
+ ? ph[2].minimized_constraints()
+ : ph[2].constraints();
+ const Constraint_System& cs_3 = enhanced
+ ? ph[3].minimized_constraints()
+ : ph[3].constraints();
+
+ // Print cardinalities of constraint systems.
+ nout << " # ph[2].constraints() = "
+ << std::distance(cs_2.begin(), cs_2.end()) << endl;
+ nout << " # ph[3].constraints() = "
+ << std::distance(cs_3.begin(), cs_3.end()) << endl;
+ // Very noisy dump of arguments.
+ vnout << "*** ph[2] constraints ***" << endl;
+ cs_2.ascii_dump(vnout);
+ vnout << "*** ph[3] constraints ***" << endl;
+ cs_3.ascii_dump(vnout);
+ vnout << endl;
+
+ ph[2].intersection_assign(ph[3]);
+
+ /**** Compute the poly-hull of ph[0] and ph[2]. ****/
+
+ const Generator_System& gs_01 = enhanced
+ ? ph[0].minimized_generators()
+ : ph[0].generators();
+ const Generator_System& gs_23 = enhanced
+ ? ph[2].minimized_generators()
+ : ph[2].generators();
+
+ // Print cardinalities of arguments.
+ nout << " - Computing poly-hull of ph[0] and ph[2]:" << endl;
+ nout << " # ph[0].generators() = "
+ << std::distance(gs_01.begin(), gs_01.end()) << endl;
+ nout << " # ph[2].generators() = "
+ << std::distance(gs_23.begin(), gs_23.end()) << endl;
+ // Very noisy dump of arguments.
+ vnout << "*** ph[0] generators ***" << endl;
+ gs_01.ascii_dump(vnout);
+ vnout << "*** ph[2] generators ***" << endl;
+ gs_23.ascii_dump(vnout);
+ vnout << endl;
+
+ ph[0].upper_bound_assign(ph[2]);
+
+ /**** Final conversion ****/
+
+ const Constraint_System& cs = ph[0].constraints();
+
+ nout << "Wmf final result timing: ";
+ print_clock(nout);
+ nout << endl;
+
+ // How many constraints obtained?
+ const long cs_cardinality = std::distance(cs.begin(), cs.end());
+
+ // Print cardinality of weakly-minimized final result.
+ nout << " - Final (wmf) result is ph[0]:" << endl;
+ nout << " # ph[0].constraints() = " << cs_cardinality << endl;
+ // Very noisy dump of weakly-minimized final result.
+ vnout << "*** ph[0] constraints ***" << endl;
+ cs.ascii_dump(vnout);
+ vnout << endl;
+
+ /**** Final strong minimization ****/
+
+ nout << "Smf (cons) final result timing: ";
+ start_clock();
+ const Constraint_System& min_cs = ph[0].minimized_constraints();
+ print_clock(nout);
+ nout << endl;
+
+ // How many constraints obtained?
+ const long min_cs_cardinality = std::distance(min_cs.begin(), min_cs.end());
+
+ // Print cardinality of strongly-minimized final result.
+ nout << " - Final (smf) result is ph[0]:" << endl;
+ nout << " # ph[0].minimized_constraints() = "
+ << min_cs_cardinality << endl;
+ // Very noisy dump of strongly-minimized final result.
+ vnout << "*** ph[0] minimized constraints ***" << endl;
+ min_cs.ascii_dump(vnout);
+ vnout << endl;
+
+ return enhanced ? min_cs_cardinality : cs_cardinality;
+}
+
+bool
+test01() {
+ std::vector<NNC_Polyhedron> ph;
+
+#if EXP_EVAL
+ dimension_type first_dim = 4;
+ dimension_type last_dim = 5;
+#else
+ dimension_type first_dim = 2;
+ dimension_type last_dim = 4;
+#endif
+
+ // Storing cardinalities of known results.
+ // NOTE: the numbers reported here differ a little bit from those
+ // in the FAC paper in that here we do not count low-level constraints
+ // related to the epsilon dimension. The difference is at most 2
+ // (the eps_geq_zero and eps_leq_one constraints).
+ typedef std::map<std::pair<dimension_type, int>, long> My_Map;
+ My_Map::const_iterator known_result;
+ My_Map standard_cardinalities;
+ My_Map enhanced_cardinalities;
+
+ using std::make_pair;
+
+ standard_cardinalities[make_pair(4, 25)] = 331; // FAC 332
+ enhanced_cardinalities[make_pair(4, 25)] = 31; // FAC 33
+
+ standard_cardinalities[make_pair(4, 50)] = 519; // FAC 520
+ enhanced_cardinalities[make_pair(4, 50)] = 41; // FAC 43
+
+ standard_cardinalities[make_pair(5, 25)] = 2692; // FAC 2693
+ enhanced_cardinalities[make_pair(5, 25)] = 125; // FAC 127
+
+ standard_cardinalities[make_pair(5, 50)] = 4993; // FAC 4994
+ enhanced_cardinalities[make_pair(5, 50)] = 150; // FAC 152
+
+ int num_errors = 0;
+
+ for (dimension_type dims = first_dim; dims <= last_dim; dims++)
+ for (int percentage = 25; percentage <= 50; percentage += 25) {
+
+ nout << endl
+ << "++++++++ DIMENSIONS = " << dims << " ++++++++"
+ << endl
+ << "++++++++ PERCENTAGE = " << percentage << " ++++++++"
+ << endl;
+
+ // Standard evaluation strategy.
+ ph.clear();
+ build_polyhedra(dims, percentage, ph);
+ const long standard_eval_card = computation(ph, false);
+
+ // Check if there is a known result.
+ known_result = standard_cardinalities.find(make_pair(dims, percentage));
+ if (known_result != standard_cardinalities.end()
+ && known_result->second != standard_eval_card) {
+ ++num_errors;
+ nout << "Cardinality mismatch: "
+ << "expected " << known_result->second << ", "
+ << "obtained " << standard_eval_card << ".\n";
+ }
+
+ // Enhanced evaluation strategy.
+ ph.clear();
+ build_polyhedra(dims, percentage, ph);
+ const long enhanced_eval_card = computation(ph, true);
+
+ // Check if there is a known result.
+ known_result = enhanced_cardinalities.find(make_pair(dims, percentage));
+ if (known_result != enhanced_cardinalities.end()
+ && known_result->second != enhanced_eval_card) {
+ ++num_errors;
+ nout << "Cardinality mismatch: "
+ << "expected " << known_result->second << ", "
+ << "obtained " << enhanced_eval_card <<".\n";
+ }
+
+ }
+ return num_errors == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64A(test01);
+END_MAIN
diff --git a/tests/Polyhedron/empty1.cc b/tests/Polyhedron/empty1.cc
new file mode 100644
index 0000000..3f9cf06
--- /dev/null
+++ b/tests/Polyhedron/empty1.cc
@@ -0,0 +1,51 @@
+/* Different ways of creating an empty polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // This is the easy way to create
+ // the empty polyhedron in the zero-dimension space.
+ C_Polyhedron ph1(0, EMPTY);
+
+ // This is a more convoluted way of doing the same thing
+ // using an empty system of generators.
+ Generator_System gs;
+ C_Polyhedron ph2(gs);
+
+ bool ok = (ph1 == ph2 && ph1.is_empty() && ph2.is_empty());
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/equals1.cc b/tests/Polyhedron/equals1.cc
new file mode 100644
index 0000000..1998212
--- /dev/null
+++ b/tests/Polyhedron/equals1.cc
@@ -0,0 +1,62 @@
+/* Test operator==(const Polyhedron&, const Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(100*A-100*B <= 0);
+ ph1.add_constraint(-100*A <= -300);
+ ph1.add_constraint(-100*B <= -300);
+ ph1.add_constraint(100*A <= 30400);
+ ph1.add_constraint(100*B <= 30400);
+ ph1.add_constraint(-258*A+209*B <= 7093);
+ ph1.add_constraint(258*A-209*B <= 8907);
+ ph1.add_constraint(151*A-214*B <= 5393);
+ ph1.add_constraint(-151*A+214*B <= 10606);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(258*A - 209*B >= -7093);
+ ph2.add_constraint(151*A - 214*B >= -10606);
+ ph2.add_constraint(A >= 3);
+ ph2.add_constraint(-A + B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ bool ok = (ph1 == ph2);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F32(test01);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions1.cc b/tests/Polyhedron/exceptions1.cc
new file mode 100644
index 0000000..ec8dba0
--- /dev/null
+++ b/tests/Polyhedron/exceptions1.cc
@@ -0,0 +1,1463 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ try {
+ // This is an incorrect use of the function Generator::point(expr, d):
+ // it is illegal to build a point with the denominator
+ // equal to zero.
+ gs.insert(point(x + y + z, 0));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point(x + y));
+ gs.insert(ray(x + 0*y));
+ gs.insert(ray(0*x + y));
+ C_Polyhedron ph(gs);
+ Linear_Expression coeff1 = x + y + 1;
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::affine_image(v, expr,d): it is illegal applying
+ // the function with a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ ph.affine_image(x, coeff1, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1;
+ Generator_System gs;
+ gs.insert(point(x + y));
+ C_Polyhedron ph2(gs);
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::upper_bound_assign(p): it is illegal to use
+ // it with two polyhedra of different dimensions.
+ ph1.upper_bound_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ gs.insert(line(x + y + z));
+
+ try {
+ // This is an incorrect use of the function
+ // C_Polyhedron::C_Polyhedron(gs): it is illegal to build a
+ // polyhedron starting from a system of generators that does not
+ // contain a point.
+ C_Polyhedron ph(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ gs.insert(point(0*x + 1*y +2*z));
+ C_Polyhedron ph(gs);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(z);
+
+ ph.remove_space_dimensions(to_be_removed);
+
+ try {
+ to_be_removed.insert(x);
+ // This is an incorrect use use of function
+ // C_Polyhedron::remove_space_dimensions(to_be_remove).
+ // Here the set `to_be_removed' still contains variable `z'.
+ // This variable is now beyond the space dimension,
+ // so that a dimension-incompatibility exception is obtained.
+ ph.remove_space_dimensions(to_be_removed);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+ // apply this function to a variable that is not in the space of
+ // the polyhedron.
+ ph.affine_image(y, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(y >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+ // use a variable in the expression that does not appear in the
+ // space of the polyhedron.
+ ph.affine_image(y, x + z + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= y);
+ Linear_Expression coeff = x + y + 1;
+ try {
+ // This is an incorrect use of the function
+ // C_Polyhedron::affine_preimage(v, expr, d): it is illegal
+ // to apply to a polyhedron an expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ ph.affine_preimage(x, coeff, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(x + y));
+ gs.insert(ray(x));
+
+ C_Polyhedron ph(gs);
+ try {
+ // This is an invalid used of the function
+ // C_Polyhedron::affine_image(v, expr, d): it is illegal apply
+ // the transformation to a variable that is not in the space
+ // of the polyhedron.
+ ph.affine_preimage(z, x + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(x));
+ gs.insert(line(x + y));
+
+ C_Polyhedron ph(gs);
+ try {
+ // This is an invalid used of the function
+ // C_Polyhedron::affine_preimage(v, expr, d): it is illegal to
+ // apply to a polyhedron an expression that contains a variable that
+ // is not in the space of the polyhedron.
+ ph.affine_preimage(y, x + z + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= y);
+
+ C_Polyhedron ph2(3);
+
+ try {
+ // This is an invalid use of method
+ // C_Polyhedron::intersection_assign(ph2): it is illegal
+ // to apply this function to two polyhedra of different dimensions.
+ ph1.intersection_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ C_Polyhedron ph1(7);
+
+ C_Polyhedron ph2(15);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::intersection_assign(ph2): it is illegal to apply
+ // this function to two polyhedra of different dimensions.
+ ph1.intersection_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test13() {
+ Variable w(4);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators(gs): it is illegal
+ // to add a system of generator that is not dimension-compatible
+ // with the polyhedron.
+ Generator_System gs;
+ gs.insert(point(w));
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ C_Polyhedron ph(5);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::remove_higher_space_dimensions(n): it is illegal to
+ // erase a variable that is not in the space of the polyhedron.
+ ph.remove_higher_space_dimensions(7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_constraints(cs): it is illegal to
+ // add a system of constraints that is not dimensional incompatible
+ // with the polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y >= 0);
+ ph.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_constraint(c): it is illegal to insert a
+ // constraints that contains a variable that is not in the space
+ // of the polyhedron.
+ ph.add_constraint(y >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_constraints(cs): it is illegal to add a system
+ // of constraints that is dimensional incompatible with the
+ // polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y == 0);
+ ph.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(x));
+
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(x));
+ gs2.insert(ray(x + y));
+
+ C_Polyhedron ph2(gs2);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::upper_bound_assign(ph2): it is illegal to apply
+ // this function to two polyhedra with different dimensions.
+ ph1.upper_bound_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1, EMPTY);
+
+ try {
+ // This is an invalid use of the function C_Polyhedron::add_generator(g):
+ // it is illegal to insert a generator that is dimensional
+ // incompatible with the polyhedron.
+ ph.add_generator(point(x + y));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test20() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators(gs): it is illegal to a system of
+ // generators that is dimensional incompatible with the
+ // polyhedron.
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(line(x + y));
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test21() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Generator_System gs;
+ gs.insert(ray(x + y));
+ gs.insert(point());
+
+ C_Polyhedron ph(gs);
+ try {
+ // This is an invalid use of the function C_Polyhedron::relation_with(c):
+ // it is illegal to use a constraints that is dimensional
+ // incompatible with the polyhedron.
+ Constraint c(z >= 0);
+ ph.relation_with(c);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+}
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test22() {
+ Variable z(2);
+
+ C_Polyhedron ph(2);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::relation_with(g): it is illegal to apply this
+ // function to a generator that is not dimension-compatible with
+ // the polyhedron.
+ Generator g(point(z));
+ ph.relation_with(g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test23() {
+ C_Polyhedron ph1(5);
+ C_Polyhedron ph2(10);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::H79_widening_assign(ph2): it is illegal to apply
+ // this function to two polyhedra that are not dimensional
+ // compatible.
+ ph2.H79_widening_assign(ph1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test24() {
+ Variable y(1);
+
+ C_Polyhedron ph1(1);
+ C_Polyhedron ph2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::limited_H79_extrapolation_assign(ph2, cs): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test25() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x - y >= 0);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x <= 2);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(x - y >= 0);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::limited_H79_extrapolation_assign(ph, cs): it is
+ // illegal to apply this function to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test26() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(x - y >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(x - y == 0);
+
+ try {
+ // This is an invalid use of Polyhedron::contains(): it is
+ // illegal to apply this method to two polyhedra that are not
+ // dimension-compatible.
+ ph1.contains(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test27() {
+ Variable x(0);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ try {
+ // This is an invalid use of method
+ // C_Polyhedron::add_generator(g): it is illegal to insert a
+ // generator that is not dimension-compatible with the
+ // polyhedron.
+ Generator g(ray(x));
+ ph.add_generator(g);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test28() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators(gs): it is illegal to add a system
+ // of generators with no points to an empty polyhedron.
+ Generator_System gs;
+ gs.insert(ray(x + y));
+ gs.insert(ray(x - y));
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test29() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators(gs): it is illegal
+ // to apply this function with a system of generators with no
+ // points to an empty polyhedron.
+ Generator_System gs;
+ gs.insert(line(x));
+ gs.insert(line(y));
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test30() {
+
+ C_Polyhedron ph1(3);
+ C_Polyhedron ph2(5);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::difference_assign(ph2): it is impossible to apply
+ // this function to two polyhedra of different dimensions.
+ ph1.difference_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test31() {
+ C_Polyhedron ph1(3);
+ C_Polyhedron ph2(8);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::time_elapse_assign(p): it is illegal to use
+ // it with two polyhedra of different dimensions.
+ ph1.time_elapse_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test32() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(ray(A));
+ gs1.insert(line(B));
+
+ const Generator_System gs2 = gs1;
+
+ print_generators(gs2, "*** gs2 ***");
+
+ try {
+ // This is an incorrect use of the function
+ // `C_Polyhedron::C_Polyhedron(gs)': it is illegal to build a
+ // closed polyhedron starting from a constant system of
+ // generators that does not contain points.
+ C_Polyhedron ph2(gs2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test33() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ try {
+ // This is an incorrect use of the function
+ // `add_generator(g)': it is illegal to add a
+ // ray to an empty polyhedron.
+ ph1.add_generator(ray(A));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test34() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 3);
+ ph.add_constraint(A <= 5);
+
+ try {
+ // This is an invalid used of the function
+ // `C_Polyhedron::bounds_from_above(v, expr, d)': it is illegal to
+ // use a variable in the expression that does not appear in the
+ // space of the polyhedron.
+ ph.bounds_from_above(A + B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test35() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(line(A));
+ gs.insert(ray(B));
+
+ try {
+ // This is an invalid used of the function
+ // `add_generators(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test36() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(ray(A));
+ gs.insert(ray(B));
+
+ try {
+ // This is an invalid used of the function
+ // `add_generators(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test37() {
+ C_Polyhedron ph1(5);
+ C_Polyhedron ph2(10);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::BHRZ03_widening_assign(ph2): it is illegal to apply
+ // this function to two polyhedra that are not dimensional
+ // compatible.
+ ph2.BHRZ03_widening_assign(ph1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test38() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal
+ // applying the function with a linear expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ ph.generalized_affine_image(B, GREATER_OR_EQUAL, B + 2, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test39() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+ // use a variable in the expression that does not appear in the polyhedron.
+ ph.generalized_affine_image(A, GREATER_OR_EQUAL, B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test40() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+ // apply this function to a variable that is not in the space of
+ // the polyhedron.
+ ph.generalized_affine_image(B, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test41() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `rhs' expression that
+ // does not appear in the polyhedron.
+ ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test42() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+ // it is illegal to use a variable in the `lhs' expression that
+ // does not appear in the polyhedron.
+ ph.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test43() {
+ Generator_System gs;
+ Linear_Expression e;
+ try {
+ // This is an incorrect use of function
+ // Generator::ray(e):
+ // the origin can not be a ray.
+ gs.insert(ray(e));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test44() {
+ Generator_System gs;
+ Linear_Expression e;
+ try {
+ // This is an incorrect use of function
+ // Generator::line(e):
+ // the origin can not be a line.
+ gs.insert(line(e));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test45() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator g = point(3*A - 2*B);
+ try {
+ // This is an incorrect use of function
+ // Generator::coefficient(v):
+ // it is impossible to compute the coefficient
+ // of a variable that is not in the space of the
+ // generator.
+ g.coefficient(C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test46() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator g = line(3*A - 2*B);
+ try {
+ // This is an incorrect use of method Generator::divisor(): it is
+ // illegal to ask for the divisor of a line.
+ g.divisor();
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test47() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint c(2*A - 3*B <= 2);
+ try {
+ // This is an incorrect use of function
+ // Constraint::coefficient(v):
+ // it is impossible to compute the coefficient
+ // of a variable that is not in the space of the
+ // constraint.
+ c.coefficient(C);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test48() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // any call with a denominator equal to zero is illegal.
+ Coefficient d = 0;
+ ph.bounded_affine_image(B, A - 7, B + 2, d);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test49() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the lower bounding expression
+ // that does not appear in the polyhedron.
+ ph.bounded_affine_image(A, B, A + 7);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test50() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to use a variable in the upper bounding expression
+ // that does not appear in the polyhedron.
+ ph.bounded_affine_image(A, A + 7, B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test51() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+ // it is illegal to bound a variable not occurring in the
+ // vector space embedding the polyhedron.
+ ph.bounded_affine_image(B, A - 7, 2*A - 2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test52() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+
+ Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+ try {
+ // This is an incorrect use of function
+ // Pointset_Powerset::add_disjunct(ph): the powerset and
+ // the added disjunct should have the same space dimension.
+ ps.add_disjunct(ph);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test53() {
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::refine_with_constraint(c): it is illegal to insert a
+ // constraint that contains a variable that is not in the space
+ // of the polyhedron.
+ ph.refine_with_constraint(y >= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test54() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::refine_with_constraints(cs): it is illegal to
+ // refine with a system of constraints that is dimensionally
+ // incompatible with the polyhedron.
+ Constraint_System cs;
+ cs.insert(x - y == 0);
+ ph.refine_with_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test55() {
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::refine_with_congruence(cg): it is illegal to insert a
+ // congruence that contains a variable that is not in the space
+ // of the polyhedron.
+ ph.refine_with_congruence(y %= 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test56() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::refine_with_congruences(cgs): it is illegal to
+ // refine with a system of congruences that is dimensionally
+ // incompatible with the polyhedron.
+ Congruence_System cgs;
+ cgs.insert(x - y == 0);
+ ph.refine_with_congruences(cgs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+ DO_TEST(test23);
+ DO_TEST(test24);
+ DO_TEST(test25);
+ DO_TEST(test26);
+ DO_TEST(test27);
+ DO_TEST(test28);
+ DO_TEST(test29);
+ DO_TEST(test30);
+ DO_TEST(test31);
+ DO_TEST(test32);
+ DO_TEST(test33);
+ DO_TEST(test34);
+ DO_TEST(test35);
+ DO_TEST(test36);
+ DO_TEST(test37);
+ DO_TEST(test38);
+ DO_TEST(test39);
+ DO_TEST(test40);
+ DO_TEST(test41);
+ DO_TEST(test42);
+ DO_TEST(test43);
+ DO_TEST(test44);
+ DO_TEST(test45);
+ DO_TEST(test46);
+ DO_TEST(test47);
+ DO_TEST(test48);
+ DO_TEST(test49);
+ DO_TEST(test50);
+ DO_TEST(test51);
+ DO_TEST(test52);
+ DO_TEST(test53);
+ DO_TEST(test54);
+ DO_TEST(test55);
+ DO_TEST(test56);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions2.cc b/tests/Polyhedron/exceptions2.cc
new file mode 100644
index 0000000..70381b3
--- /dev/null
+++ b/tests/Polyhedron/exceptions2.cc
@@ -0,0 +1,910 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x - y > 0);
+ cs.insert(x >= 0);
+
+ try {
+ // This is an invalid use of the constructor of a polyhedron:
+ // it is illegal to build a closed polyhedron starting from
+ // a system of constraints that contains strict inequalities.
+ C_Polyhedron ph(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(closure_point(2*x + y));
+ gs.insert(point(x + y));
+ gs.insert(ray(x));
+ gs.insert(ray(y));
+
+ try {
+ // This is an invalid use of the constructor of a polyhedron:
+ // it is illegal to build a closed polyhedron starting from
+ // a system of generators that contains closure points.
+ C_Polyhedron ph(gs);
+ exit(1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+
+ try {
+ // This is an invalid use of the function add_constraint(c): it is
+ // illegal to insert a strict inequality into a system of
+ // constraints of a closed polyhedron.
+ ph.add_constraint(x - y > 0);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test04() {
+ C_Polyhedron ph(3, EMPTY);
+
+ try {
+ // This is an incorrect use of the function add_generator(g): it
+ // is illegal to insert a closure-point into a system of
+ // generators of a closed polyhedron.
+ ph.add_generator(closure_point(Linear_Expression(2)));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(x >= 2);
+ ph.add_constraint(y >= 2);
+
+ Constraint_System cs;
+ cs.insert(x == y);
+ cs.insert(x < 5);
+
+ try {
+ // This is an incorrect use of the function
+ // add_constraints(cs): it is illegal to add a system of
+ // constraints that contains strict inequalities to a closed polyhedron.
+ ph.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ Constraint_System cs;
+ cs.insert(x > 3);
+ cs.insert(x > y);
+
+ try {
+ // This is an invalid use of the function add_constraints(cs):
+ // it is illegal to add a system of constraints that contains
+ // strict inequalities to a closed polyhedron.
+ ph.add_constraints(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+}
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+
+ Constraint_System cs;
+ cs.insert(x > 2);
+ cs.insert(x == y);
+ NNC_Polyhedron qh(cs);
+
+ try {
+ // This is an incorrect use of the method concatenate_assign(): it
+ // is illegal to apply this method to a closed polyhedron with a
+ // NNC Polyhedron.
+ ph.concatenate_assign(qh);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(closure_point(-x));
+ gs.insert(ray(x));
+ gs.insert(ray(y));
+
+ try {
+ // This is an incorrect use of the function
+ // add_generators(gs): it is illegal to add a
+ // system of generators that contains closure-points to a closed
+ // polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ Generator_System gs;
+ gs.insert(point(x));
+ gs.insert(closure_point());
+ gs.insert(ray(x+y));
+
+ try {
+ // This is an incorrect use of the function add_generators(gs): it is
+ // illegal to add a system of generators that contains closure-points
+ // to a closed polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 1);
+ ph.add_constraint(B >= 1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::generalized_affine_image(v, expr, d):
+ // `GREATER_THAN' is an illegal relation for necessarily closed
+ // polyhedron.
+ ph.generalized_affine_image(A + B, GREATER_THAN, A - B);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 2);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A - B > 0);
+ ph2.add_constraint(A >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `intersection_assign': it is illegal to apply
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.intersection_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(B >= 2);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A - B > 0);
+ ph2.add_constraint(B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `intersection_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.intersection_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(3*B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(2*A));
+ gs2.insert(closure_point());
+ gs2.insert(closure_point(3*A));
+ NNC_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `upper_bound_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.upper_bound_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 4);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(B <= 4);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 2);
+ ph2.add_constraint(A <= 6);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(B <= 4);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `difference_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.difference_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(A - B >= 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(A <= 4);
+ ph2.add_constraint(A - B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `H79_widening_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph2.H79_widening_assign(ph1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(A - B >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(A <= 4);
+ ph2.add_constraint(A - B >= 0);
+
+ Constraint_System cs;
+ cs.insert(A <= 8);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ try {
+ // This is an invalid use of the function
+ // `limited_H79_widening_assign': it is illegal to
+ // apply this function to a closed polyhedron and
+ // a non-closed polyhedron.
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(A - B >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(A <= 4);
+ ph2.add_constraint(A - B >= 0);
+
+ Constraint_System cs;
+ cs.insert(A < 8);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ try {
+ // This is an invalid use of the function
+ // `limited_H79_extrapolation_assign': it is illegal to
+ // apply this function to two closed polyhedra and
+ // to a non-closed system of constraints.
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+}
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A + B <= 1);
+
+ Generator_System gs;
+ gs.insert(point(2*A + 2*B));
+ gs.insert(ray(A + B));
+ NNC_Polyhedron ph2(gs);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `time_elapse_assign': it is illegal to
+ // apply this function to a closed polyhedron and
+ // a non-closed polyhedron.
+ ph1.time_elapse_assign(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test20() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(A >= 5);
+
+ NNC_Polyhedron ph2(1);
+ ph2.add_constraint(A > 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the Polyhedron::contains(): it is
+ // illegal to apply this method to a closed polyhedron and a
+ // non-closed polyhedron.
+ ph1.contains(ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test21() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A - B > 0);
+
+ const Constraint_System cs = ph1.constraints();
+
+ print_constraints(cs, "*** cs ***");
+
+ try {
+ // This is an incorrect use of the function
+ // C_Polyhedron::C_Polyhedron(cs): it is illegal to build a
+ // closed polyhedron starting from a system of constraints
+ // that contains strict inequalities.
+ C_Polyhedron ph2(cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test22() {
+ Variable A(0);
+
+ Generator_System gs1;
+ gs1.insert(point(3*A));
+ gs1.insert(closure_point(2*A));
+ gs1.insert(ray(A));
+
+ NNC_Polyhedron ph1(gs1);
+
+ const Generator_System gs2 = ph1.generators();
+
+ try {
+ // This is an incorrect use of the function
+ // `C_Polyhedron(const Generator_System)': it is illegal to build
+ // a closed polyhedron starting from a constant non-closed
+ // system of generators.
+ C_Polyhedron ph2(gs2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test23() {
+ NNC_Polyhedron ph(0, EMPTY);
+
+ try {
+ // This is an incorrect use of the function
+ // `add_generator(g)': it is illegal add a closure point
+ // to a zero-dimensional and empty non-closed polyhedron.
+ ph.add_generator(closure_point());
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test24() {
+ NNC_Polyhedron ph(0, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(closure_point());
+
+ try {
+ // This is an invalid used of the function
+ // `add_generators(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty zero-dimensional polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test25() {
+ NNC_Polyhedron ph(0, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Generator_System gs;
+ gs.insert(closure_point());
+
+ try {
+ // This is an invalid used of the function
+ // `add_generators(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty zero-dimensional polyhedron.
+ ph.add_generators(gs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test26() {
+ Variable A(0);
+
+ NNC_Polyhedron ph1(1);
+ ph1.add_constraint(A > 5);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(A >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of Polyhedron::contains():
+ // it is illegal to apply this method to a
+ // closed polyhedron and a non-closed polyhedron.
+ ph2.contains(ph1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test27() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(A - B >= 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(A <= 4);
+ ph2.add_constraint(A - B >= 0);
+
+ Constraint_System cs;
+ cs.insert(A < 8);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ try {
+ // This is an invalid use of the function
+ // `limited_H79_extrapolation_assign': it is illegal to
+ // apply this function to a non-closed polyhedron,
+ // a non-closed polyhedron and a system of
+ // constraints that contains strict inequalities.
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test28() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A - B >= 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A < 5);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(A - B >= 0);
+
+ try {
+ // This is an invalid use of the function
+ // `BHRZ03_widening_assign': it is illegal to
+ // apply this function to a non-closed polyhedron and
+ // a non-closed polyhedron.
+ ph2.BHRZ03_widening_assign(ph1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test29() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ try {
+ // This is an incorrect use of function
+ // Generator::closure_point(e, d):
+ // it is illegal to use a denominator
+ // equal to zero.
+ gs.insert(closure_point(A + 2*B, 0));
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test30() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A < 2);
+ ph1.add_constraint(B > 0);
+
+ C_Polyhedron ph2;
+
+ try {
+ // This is an invalid use of the function
+ // `Polyhedron::swap(Polyhedron&)': it is illegal
+ // to apply this function to a closed and a
+ // not necessarily closed polyhedron.
+ swap(ph1, ph2);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test31() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::generalized_affine_image(v, r, expr,d ):
+ // `GREATER_THAN' is an illegal relation for necessarily closed
+ // polyhedron.
+ ph.generalized_affine_image(A, GREATER_THAN, A + 1);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+ DO_TEST(test23);
+ DO_TEST(test24);
+ DO_TEST(test25);
+ DO_TEST(test26);
+ DO_TEST(test27);
+ DO_TEST(test28);
+ DO_TEST(test29);
+ DO_TEST(test30);
+ DO_TEST(test31);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions3.cc b/tests/Polyhedron/exceptions3.cc
new file mode 100644
index 0000000..8967dc4
--- /dev/null
+++ b/tests/Polyhedron/exceptions3.cc
@@ -0,0 +1,235 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ try {
+ // This is an invalid use of the constructor of a Variable:
+ // it is illegal to (try to) build a variable with an id()
+ // greater than or equal to Variable::max_space_dimension().
+ Variable v(Variable::max_space_dimension());
+
+ // This is only to avoid a compiler warning.
+ (void) v.id();
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test02() {
+ try {
+ Variable v(Linear_Expression::max_space_dimension());
+ // This is an invalid use of the constructor of a Linear_Expression:
+ // it is illegal to (try to) build a linear expression with a dimensions
+ // greater than Linear_Expression::max_space_dimension().
+ Linear_Expression e(v);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test03() {
+ try {
+ Variable v(Linear_Expression::max_space_dimension());
+ // This is an invalid use of the constructor of a Linear_Expression:
+ // it is illegal to (try to) build a linear expression with a dimensions
+ // greater than Linear_Expression::max_space_dimension().
+ Linear_Expression e;
+ e += v;
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test04() {
+ try {
+ Variable v(Linear_Expression::max_space_dimension());
+ // This is an invalid use of the constructor of a Linear_Expression:
+ // it is illegal to (try to) build a linear expression with a dimensions
+ // greater than Linear_Expression::max_space_dimension().
+ Linear_Expression e;
+ e -= v;
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test05() {
+ try {
+ // This is an invalid use of the constructor of a polyhedron:
+ // it is illegal to (try to) build a polyhedron with a dimensions
+ // greater than C_Polyhedron::max_space_dimension().
+ C_Polyhedron ph(C_Polyhedron::max_space_dimension() + 1);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test06() {
+ try {
+ C_Polyhedron ph(1);
+ // This is an invalid use of the method for adding dimensions:
+ // it is illegal to (try to) embed a polyhedron into a vector space
+ // whose dimension is greater than C_Polyhedron::max_space_dimension().
+ ph.add_space_dimensions_and_embed(C_Polyhedron::max_space_dimension());
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test07() {
+ try {
+ C_Polyhedron ph(1);
+ // This is an invalid use of the method for adding dimensions:
+ // it is illegal to (try to) project a polyhedron into a vector space
+ // whose dimension is greater than C_Polyhedron::max_space_dimension().
+ ph.add_space_dimensions_and_project(C_Polyhedron::max_space_dimension());
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ C_Polyhedron ph(C_Polyhedron::max_space_dimension(), EMPTY);
+ // This is an invalid use of the method for concatenating polyhedra:
+ // it is illegal to (try to) concatenate polyhedra if the resulting
+ // vector space will have a dimension greater than
+ // C_Polyhedron::max_space_dimension().
+ ph.concatenate_assign(C_Polyhedron(1));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ try {
+ C_Polyhedron ph(1);
+ // This is an invalid use of the method for expanding space dimensions:
+ // it is illegal to (try to) expand a space dimension if the resulting
+ // vector space will have a dimension greater than
+ // C_Polyhedron::max_space_dimension().
+ ph.expand_space_dimension(Variable(0),
+ C_Polyhedron::max_space_dimension());
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim1.cc b/tests/Polyhedron/expandspacedim1.cc
new file mode 100644
index 0000000..5a890f5
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedron::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1(3);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 1);
+
+ C_Polyhedron known_result(4);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+ // Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(B, 1);
+
+ C_Polyhedron known_result(4, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 1) ***");
+
+ return ok;
+}
+
+// Test trivial expansion.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 0);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 0) ***");
+
+ return ok;
+}
+
+// Test with given generators.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(A));
+ ph1.add_generator(point(A + B));
+ ph1.add_generator(point(B));
+
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 1);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point(A + C));
+ known_result.add_generator(point(A + B));
+ known_result.add_generator(point(A + B + C));
+ known_result.add_generator(point(B));
+ known_result.add_generator(point(B + C));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// Test with given constraints.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 1);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C + B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+ return ok;
+}
+
+// Test using constraints expanding 2 dimensions.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 2);
+
+ C_Polyhedron known_result(4);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B <= 2);
+ known_result.add_constraint(C >= 0);
+ known_result.add_constraint(C + B <= 2);
+ known_result.add_constraint(D >= 0);
+ known_result.add_constraint(D + B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+// Test using constraints with equality constraint.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A <= 1);
+ ph1.add_constraint(C == 1);
+ ph1.add_constraint(A + B >= 1);
+ ph1.add_constraint(B <= 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 1);
+ ph1.expand_space_dimension(C, 1);
+
+ C_Polyhedron known_result(5);
+ known_result.add_constraint(A <= 1);
+ known_result.add_constraint(A + B >= 1);
+ known_result.add_constraint(C == 1);
+ known_result.add_constraint(E == 1);
+ known_result.add_constraint(B <= 1);
+ known_result.add_constraint(D <= 1);
+ known_result.add_constraint(D + B >= 1);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** after ph1.expand_space_dimension(A, 1);"
+ " ph1.expand_space_dimension(C, 1) ***");
+
+ return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(A + 2*B));
+ ph1.add_generator(point(A + 3*B));
+ ph1.add_generator(point(A + 4*B));
+
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(B, 1);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point(A + 2*B + 2*C));
+ known_result.add_generator(point(A + 2*B + 3*C));
+ known_result.add_generator(point(A + 2*B + 4*C));
+ known_result.add_generator(point(A + 3*B + 2*C));
+ known_result.add_generator(point(A + 3*B + 3*C));
+ known_result.add_generator(point(A + 3*B + 4*C));
+ known_result.add_generator(point(A + 4*B + 2*C));
+ known_result.add_generator(point(A + 4*B + 3*C));
+ known_result.add_generator(point(A + 4*B + 4*C));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim2.cc b/tests/Polyhedron/expandspacedim2.cc
new file mode 100644
index 0000000..d9dee50
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim2.cc
@@ -0,0 +1,103 @@
+/* Test Polyhedron::expand_space_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test using constraints for NNC polyhedron.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A - B > 2);
+ ph1.add_constraint(A + 2*B < 6);
+ ph1.add_constraint(B < 6);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(B, 2);
+
+ NNC_Polyhedron known_result(4);
+ known_result.add_constraint(A - B > 2);
+ known_result.add_constraint(A + 2*B < 6);
+ known_result.add_constraint(B < 6);
+ known_result.add_constraint(A - C > 2);
+ known_result.add_constraint(A + 2*C < 6);
+ known_result.add_constraint(C < 6);
+ known_result.add_constraint(A - D > 2);
+ known_result.add_constraint(A + 2*D < 6);
+ known_result.add_constraint(D < 6);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 2) ***");
+
+ return ok;
+}
+
+// Test using generators for NNC polyhedron.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ NNC_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(A));
+ ph1.add_generator(closure_point(A + B));
+ ph1.add_generator(ray(A - B));
+
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.expand_space_dimension(A, 2);
+
+ NNC_Polyhedron known_result(4, EMPTY);
+ known_result.add_generator(point(A + C + D));
+ known_result.add_generator(ray(A -B + C + D));
+ known_result.add_generator(closure_point(A + C + 2*D));
+ known_result.add_generator(closure_point(A + 2*C + D));
+ known_result.add_generator(closure_point(A + 2*C + 2*D));
+ known_result.add_generator(closure_point(A + B + C + D));
+ known_result.add_generator(closure_point(2*A + C + D));
+ known_result.add_generator(closure_point(2*A + C + 2*D));
+ known_result.add_generator(closure_point(2*A + 2*C + D));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims1.cc b/tests/Polyhedron/foldspacedims1.cc
new file mode 100644
index 0000000..48db5a3
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims1.cc
@@ -0,0 +1,337 @@
+/* Test Polyhedron::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(3, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B + C <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B + C <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {} into B ***");
+
+ return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 1);
+ ph1.add_constraint(A <= 3);
+ ph1.add_constraint(B >= 7);
+ ph1.add_constraint(B <= 12);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 12);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+// Test that takes the expected result of the expand operation
+// example given in [GopanDMDRS04] on page 519 and folds it to recover
+// the unexpanded polyhedron.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(3, EMPTY);
+ ph1.add_generator(point(A + 2*B + 2*C));
+ ph1.add_generator(point(A + 2*B + 3*C));
+ ph1.add_generator(point(A + 2*B + 4*C));
+ ph1.add_generator(point(A + 3*B + 2*C));
+ ph1.add_generator(point(A + 3*B + 3*C));
+ ph1.add_generator(point(A + 3*B + 4*C));
+ ph1.add_generator(point(A + 4*B + 2*C));
+ ph1.add_generator(point(A + 4*B + 3*C));
+ ph1.add_generator(point(A + 4*B + 4*C));
+
+ print_generators(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(A + 2*B));
+ known_result.add_generator(point(A + 3*B));
+ known_result.add_generator(point(A + 4*B));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after folding {C} into B ***");
+
+ return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(A >= 1);
+ ph1.add_constraint(A <= 3);
+ ph1.add_constraint(B >= 7);
+ ph1.add_constraint(B <= 12);
+ ph1.add_constraint(C == 15);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ ph1.fold_space_dimensions(to_fold, C);
+
+ C_Polyhedron known_result(1);
+ known_result.add_constraint(A >= 1);
+ known_result.add_constraint(A <= 15);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A,B} into C ***");
+
+ return ok;
+}
+
+// Test fold_space_dimensions() when there are rays.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(3, EMPTY);
+ ph1.add_generator(point(A));
+ ph1.add_generator(ray(A + B));
+ ph1.add_generator(ray(A + 2*C));
+
+ print_generators(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(A));
+ known_result.add_generator(ray(A));
+ known_result.add_generator(ray(A + B));
+ known_result.add_generator(ray(A + 2*B));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after folding {C} into B ***");
+
+ return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B <= 2);
+ ph1.add_constraint(C >= 0);
+ ph1.add_constraint(C + B <= 2);
+ ph1.add_constraint(D >= 0);
+ ph1.add_constraint(D + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ ph1.fold_space_dimensions(to_fold, A);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {C,D} into A ***");
+
+ return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A + B <= 2);
+ ph1.add_constraint(C >= 0);
+ ph1.add_constraint(C + B <= 2);
+ ph1.add_constraint(D >= 0);
+ ph1.add_constraint(D + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ ph1.fold_space_dimensions(to_fold, C);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {B,D} into C ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ // test06() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+ DO_TEST(test06);
+#else
+ DO_TEST_F8(test06);
+#endif // !defined(DERIVED_TEST)
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims2.cc b/tests/Polyhedron/foldspacedims2.cc
new file mode 100644
index 0000000..7580197
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims2.cc
@@ -0,0 +1,231 @@
+/* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with an empty polyhedron.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(3, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ NNC_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+// Trivial fold.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph1(3);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A + B + C < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ NNC_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A + B + C < 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {} into B ***");
+
+ return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519 but with strict constraints.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A > 1);
+ ph1.add_constraint(A < 3);
+ ph1.add_constraint(B > 7);
+ ph1.add_constraint(B < 12);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+
+ ph1.fold_space_dimensions(to_fold, B);
+
+ NNC_Polyhedron known_result(1);
+ known_result.add_constraint(A > 1);
+ known_result.add_constraint(A < 12);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A} into B ***");
+
+ return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph1(3);
+ ph1.add_constraint(A > 1);
+ ph1.add_constraint(A <= 3);
+ ph1.add_constraint(B > 7);
+ ph1.add_constraint(B < 12);
+ ph1.add_constraint(C == 15);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(A);
+ to_fold.insert(B);
+
+ ph1.fold_space_dimensions(to_fold, C);
+
+ NNC_Polyhedron known_result(1);
+ known_result.add_constraint(A > 1);
+ known_result.add_constraint(A <= 15);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {A,B} into C ***");
+
+ return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ NNC_Polyhedron ph1(4);
+ ph1.add_constraint(A > 0);
+ ph1.add_constraint(A + B < 2);
+ ph1.add_constraint(C > 0);
+ ph1.add_constraint(C + B < 2);
+ ph1.add_constraint(D > 0);
+ ph1.add_constraint(D + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(C);
+ to_fold.insert(D);
+
+ ph1.fold_space_dimensions(to_fold, A);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A > 0);
+ known_result.add_constraint(A + B <= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {C,D} into A ***");
+
+ return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ NNC_Polyhedron ph1(4);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B > 0);
+ ph1.add_constraint(A + B <= 2);
+ ph1.add_constraint(C > 0);
+ ph1.add_constraint(C + B <= 2);
+ ph1.add_constraint(D > 0);
+ ph1.add_constraint(D + B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ // This is the set of the variables that we want to fold.
+ Variables_Set to_fold;
+ to_fold.insert(B);
+ to_fold.insert(D);
+
+ ph1.fold_space_dimensions(to_fold, C);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A < 2);
+ known_result.add_constraint(B > 0);
+ known_result.add_constraint(B < 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after folding {B,D} into C ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST_F8(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/frequency1.cc b/tests/Polyhedron/frequency1.cc
new file mode 100644
index 0000000..1e068ca
--- /dev/null
+++ b/tests/Polyhedron/frequency1.cc
@@ -0,0 +1,232 @@
+/* Test Polyhedron::frequency().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty polyhedron.
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+
+ C_Polyhedron ph2(1, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (!ph1.frequency(A, num1, den1, valn1, vald1)
+ && !ph2.frequency(A, num2, den2, valn2, vald2));
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+ C_Polyhedron ph1(0);
+
+ C_Polyhedron ph2(0, EMPTY);
+
+ Coefficient num1;
+ Coefficient den1;
+ Coefficient valn1;
+ Coefficient vald1;
+ Coefficient num2;
+ Coefficient den2;
+ Coefficient valn2;
+ Coefficient vald2;
+ bool ok = (ph1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+ && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+ && !ph2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A == 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (ph.frequency(Linear_Expression(A), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 0 && vald == 1);
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!ph.frequency(Linear_Expression(A), num, den, valn, vald));
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A <= 0);
+ ph.add_constraint(A + B >= 5);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!ph.frequency(Linear_Expression(B), num, den, valn, vald));
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A == 1);
+ ph.add_constraint(B == 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (ph.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+ && num == 0 && den == 1 && valn == -1 && vald == 2);
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A < 1);
+ ph.add_constraint(A >= 0);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (!ph.frequency(Linear_Expression(A - 3), num, den, valn, vald));
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(2*A - 2*B == 1);
+ ph.add_constraint(3*C == 2);
+ ph.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (ph.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 13 && vald == 6);
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(2*A - 2*B == 1);
+ ph.add_constraint(2*C == 1);
+ ph.add_constraint(B <= 2);
+
+ Coefficient num;
+ Coefficient den;
+ Coefficient valn;
+ Coefficient vald;
+ bool ok = (ph.frequency(Linear_Expression(A - B + C + 1),
+ num, den, valn, vald)
+ && num == 0 && den == 1 && valn == 2 && vald == 1);
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/frombdshape1.cc b/tests/Polyhedron/frombdshape1.cc
new file mode 100644
index 0000000..df03661
--- /dev/null
+++ b/tests/Polyhedron/frombdshape1.cc
@@ -0,0 +1,57 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - B <= 5);
+ cs.insert(A - B >= -10);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ TBD_Shape bd(cs);
+
+ C_Polyhedron ph(bd);
+
+ C_Polyhedron known_result(cs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/frombox1.cc b/tests/Polyhedron/frombox1.cc
new file mode 100644
index 0000000..0a44c5f
--- /dev/null
+++ b/tests/Polyhedron/frombox1.cc
@@ -0,0 +1,259 @@
+/* Test C_Polyhedron::C_Polyhedron(const Box<Interval>&)
+ and NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(2*x <= 1);
+ box.add_constraint(y >= 0);
+
+ C_Polyhedron ph(box);
+
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(x >= 0);
+ known_ph.add_constraint(2*x <= 1);
+ known_ph.add_constraint(y >= 0);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// The box is the xy plane.
+bool
+test02() {
+ Rational_Box box(2);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(box.space_dimension());
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// This box is the closed +ve quadrant.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y >= 0);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(x >= 0);
+ known_ph.add_constraint(y >= 0);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A bounded box in 2D.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+
+ Rational_Box box(2);
+ box.add_constraint(3*x >= -2);
+ box.add_constraint(x <= 4);
+ box.add_constraint(y >= -10);
+ box.add_constraint(3*y <= 12);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(3*x >= -2);
+ known_ph.add_constraint(x <= 4);
+ known_ph.add_constraint(y <= 4);
+ known_ph.add_constraint(y >= -10);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// An unbounded closed box in 4D but bounded in 2D.
+bool
+test05() {
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ Rational_Box box(4);
+ box.add_constraint(3*x >= -2);
+ box.add_constraint(x <= 4);
+ box.add_constraint(y >= -10);
+ box.add_constraint(3*y <= 12);
+ box.add_constraint(3*z >= 15);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(3*x >= -2);
+ known_ph.add_constraint(x <= 4);
+ known_ph.add_constraint(y <= 4);
+ known_ph.add_constraint(y >= -10);
+ known_ph.add_constraint(z >= 5);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A zero-dimensional box.
+bool
+test06() {
+ Rational_Box box(0);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph;
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// An empty closed box in 2D.
+bool
+test07() {
+ Rational_Box box(2);
+ box.set_empty();
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(2, EMPTY);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A single point.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x == 2);
+ box.add_constraint(y == 4);
+
+ C_Polyhedron ph(box);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(x == 2);
+ known_ph.add_constraint(y == 4);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A closed unit square.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(x <= 1);
+ box.add_constraint(y >= 0);
+ box.add_constraint(y <= 1);
+
+ C_Polyhedron ph(box);
+
+ Constraint_System known_cs;
+ known_cs.insert(x >= 0);
+ known_cs.insert(x <= 1);
+ known_cs.insert(y >= 0);
+ known_cs.insert(y <= 1);
+
+ C_Polyhedron known_ph(known_cs);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph generators ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/frombox2.cc b/tests/Polyhedron/frombox2.cc
new file mode 100644
index 0000000..2c2c1d7
--- /dev/null
+++ b/tests/Polyhedron/frombox2.cc
@@ -0,0 +1,112 @@
+/* Test NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded box in 4D but bounded in 2D with strict inequalities.
+bool
+test01() {
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ Rational_Box box(4);
+ box.add_constraint(3*x > -2);
+ box.add_constraint(x <= 4);
+ box.add_constraint(y > -10);
+ box.add_constraint(3*y <= 12);
+ box.add_constraint(3*z >= 15);
+
+ NNC_Polyhedron ph(box);
+
+ NNC_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(3*x > -2);
+ known_ph.add_constraint(x <= 4);
+ known_ph.add_constraint(y <= 4);
+ known_ph.add_constraint(y > -10);
+ known_ph.add_constraint(z >= 5);
+
+ bool ok = (ph == known_ph);
+
+ print_generators(ph, "*** ph ***");
+ print_generators(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+ Variable x(1);
+ Variable y(2);
+
+ Rational_Box box(4);
+ box.add_constraint(3*x >= -2);
+ box.add_constraint(x < 4);
+ box.add_constraint(y > -10);
+ box.add_constraint(3*y <= 12);
+
+ NNC_Polyhedron ph(box);
+
+ NNC_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(3*x >= -2);
+ known_ph.add_constraint(x < 4);
+ known_ph.add_constraint(y <= 4);
+ known_ph.add_constraint(y > -10);
+
+ bool ok = (ph == known_ph);
+
+ print_generators(ph, "*** ph ***");
+ print_generators(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// An empty box in 2D.
+bool
+test03() {
+ Rational_Box box(2);
+ box.set_empty();
+
+ NNC_Polyhedron ph(box);
+
+ NNC_Polyhedron known_ph(2, EMPTY);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8A(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/fromgrid1.cc b/tests/Polyhedron/fromgrid1.cc
new file mode 100644
index 0000000..1c997cc
--- /dev/null
+++ b/tests/Polyhedron/fromgrid1.cc
@@ -0,0 +1,202 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+ and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 0) / 0);
+ gr.add_congruence((y - z %= 0) / 0);
+ gr.add_congruence((z %= 0) / 1);
+
+ C_Polyhedron ph(gr);
+
+
+ C_Polyhedron known_ph(gr.space_dimension());
+ known_ph.add_constraint(x + y == 0);
+ known_ph.add_constraint(y - z == 0);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+ Grid gr(2);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph(gr.space_dimension());
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 1) / 3);
+ gr.add_congruence((y - z %= 2) / 5);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph(gr.space_dimension());
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+ Grid gr(0);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph;
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+ Grid gr(2, EMPTY);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph(2, EMPTY);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A single point.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Grid gr(3);
+ gr.add_congruence((x + y %= 1) / 0);
+ gr.add_congruence((y %= 0) / 0);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph(gr.space_dimension());
+ known_ph.add_constraint(x == 1);
+ known_ph.add_constraint(y == 0);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+ Grid gr(0, EMPTY);
+
+ C_Polyhedron ph(gr);
+
+ C_Polyhedron known_ph(0, EMPTY);
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+ Grid gr(2);
+ Constraint_System cs = gr.constraints();
+
+ C_Polyhedron ph(cs);
+
+ C_Polyhedron known_ph(gr.space_dimension());
+
+ bool ok = (ph == known_ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_ph, "*** known_ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/fromoctagonalshape1.cc b/tests/Polyhedron/fromoctagonalshape1.cc
new file mode 100644
index 0000000..10ffbac
--- /dev/null
+++ b/tests/Polyhedron/fromoctagonalshape1.cc
@@ -0,0 +1,56 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B <= 5);
+ cs.insert(A + B >= -8);
+ cs.insert(A >= 0);
+ cs.insert(B <= 7);
+ cs.insert(A - B <= 10);
+ TOctagonal_Shape os(cs);
+
+ C_Polyhedron ph(os);
+
+ C_Polyhedron known_result(cs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage1.cc b/tests/Polyhedron/generalizedaffineimage1.cc
new file mode 100644
index 0000000..90db9cd
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedron::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(2*B));
+ known_result.add_generator(point(4*A + 6*B));
+ known_result.add_generator(ray(B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2)"
+ " ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(-B));
+ known_result.add_generator(point(4*A - 3*B));
+ known_result.add_generator(ray(B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+ " A+2, -2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A <= 3);
+ ph.add_constraint(7*A >= 2);
+ ph.add_constraint(3*B >= 1);
+ ph.add_constraint(2*A >= B);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(9*A - B, 6));
+ known_result.add_generator(point(2*A - 4*B, 7));
+ known_result.add_generator(ray(-B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+ " A-B+2, -3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A - B >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph,
+ "*** after ph.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A + B));
+ ph.add_generator(point(3*A + B));
+ ph.add_generator(point(A + 3*B));
+ ph.add_generator(point(3*A + 3*B));
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A + B >= 1);
+
+ ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph,
+ "*** after ph.generalized_affine_image"
+ "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.generalized_affine_image"
+ "(A, LESS_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.generalized_affine_image(A + B, GREATER_OR_EQUAL, A + B + 1);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.generalized_affine_image"
+ "(A + B, GREATER_OR_EQUAL, A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2);
+
+ C_Polyhedron known_result(1, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2)"
+ " ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= -2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A+1, GREATER_OR_EQUAL, A+2);
+
+ C_Polyhedron known_result(1, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image"
+ "(A+1, GREATER_OR_EQUAL, A+2)"
+ " ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST_F8(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage2.cc b/tests/Polyhedron/generalizedaffineimage2.cc
new file mode 100644
index 0000000..c31a2a6
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage2.cc
@@ -0,0 +1,560 @@
+/* Test Polyhedron::generalized_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A + B));
+ ph.add_generator(closure_point(2*A));
+ ph.add_generator(closure_point(2*A + 2*B));
+ ph.add_generator(closure_point(3*A + B));
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(B, LESS_THAN, B+2);
+
+ NNC_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(A));
+ known_result.add_generator(closure_point(A + 3*B));
+ known_result.add_generator(closure_point(2*A + 4*B));
+ known_result.add_generator(closure_point(3*A + 3*B));
+ known_result.add_generator(ray(-B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+ ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, -2*(A+2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+ " A+2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
+ ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, A+2);
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+ " A+2, -2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A <= 3);
+ ph.add_constraint(7*A >= 2);
+ ph.add_constraint(3*B >= 1);
+ ph.add_constraint(2*A >= B);
+
+ print_generators(ph, "*** ph ***");
+
+ C_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
+ ph2.generalized_affine_image(-3*B, GREATER_OR_EQUAL, A-B+2);
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+ " A-B+2, -3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A + B));
+ ph.add_generator(closure_point(2*A));
+ ph.add_generator(closure_point(2*A + 2*B));
+ ph.add_generator(closure_point(3*A + B));
+
+ print_constraints(ph, "*** ph ***");
+
+ NNC_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(B, LESS_THAN, B+2);
+ ph2.generalized_affine_image(-2*B, GREATER_THAN, -2*(B+2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A - B >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(A, EQUAL, A + 2);
+ ph2.generalized_affine_image(-2*A, EQUAL, -2*(A + 2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph,
+ "*** after ph.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A + B));
+ ph.add_generator(point(3*A + B));
+ ph.add_generator(point(A + 3*B));
+ ph.add_generator(point(3*A + 3*B));
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron ph2 = ph;
+
+ ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
+ ph2.generalized_affine_image(-3*(A + B),
+ LESS_OR_EQUAL,
+ -3*(2*A - B + 2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph,
+ "*** after ph.generalized_affine_image"
+ "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A == 1);
+ ph.add_constraint(B > 1);
+ ph.add_constraint(B < 2);
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+
+ ph.generalized_affine_image(B, GREATER_THAN, A + B + 1);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B > 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(B, GREATER_THAN, A + B + 1) ***");
+ print_generators(ph, "*** after ph.generalized_affine_image"
+ "(B, GREATER_THAN, A + B + 1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A >= 1);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(Linear_Expression(2), EQUAL, A + B);
+
+ known_result.add_constraint(A + B == 2);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(Linear_Expression(2), EQUAL, A + B) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A - B >= 1);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(Linear_Expression(2),
+ GREATER_OR_EQUAL,
+ A + B);
+
+ known_result.add_constraint(2 >= A + B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(Linear_Expression(2), GREATER_OR_EQUAL, A + B)"
+ "***");
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(A - B >= 1);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
+
+ known_result.add_constraint(2 <= A + B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(Linear_Expression(2), LESS_OR_EQUAL, A + B) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(B > 0);
+ ph.add_constraint(A - B > 1);
+
+ NNC_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(Linear_Expression(2), GREATER_THAN, A + B);
+
+ known_result.add_constraint(2 > A + B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(Linear_Expression(2), GREATER_THAN, A + B) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(B > 0);
+ ph.add_constraint(A >= 1);
+
+ NNC_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(Linear_Expression(2), LESS_THAN, A + B);
+
+ known_result.add_constraint(2 < A + B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(Linear_Expression(2), LESS_THAN, A + B) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(C == 0);
+ ph.add_constraint(A + 3*B == 2);
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A - C, EQUAL, B + 3);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A - C == B + 3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.generalized_affine_image"
+ "(A - C, EQUAL, B + 3) ***");
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - C, EQUAL, B + 3) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(C == 0);
+ ph.add_constraint(A - 2*B >= 2);
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A - C, GREATER_OR_EQUAL, B + 3);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A - B - C >= 3);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - C, GREATER_OR_EQUAL, B + 3) ***");
+ print_generators(ph, "*** after ph.generalized_affine_image"
+ "(A - C, GREATER_OR_EQUAL, B + 3) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(C == 0);
+ ph.add_constraint(A >= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A - C, LESS_OR_EQUAL, B - 1);
+
+ C_Polyhedron known_result(ph);
+ known_result.add_constraint(A - B - C <= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - C, LESS_OR_EQUAL, B - 1) ***");
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - C, LESS_OR_EQUAL, B - 1) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph(3);
+ ph.add_constraint(A - C == 0);
+ ph.add_constraint(A >= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A - 2*C, LESS_THAN, B - 1);
+
+ NNC_Polyhedron known_result(ph);
+ known_result.add_constraint(A - B - 2*C < 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - 2*C, LESS_THAN, B - 1) ***");
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - 2*C, LESS_THAN, B - 1) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph(3);
+ ph.add_constraint(A - 2*C == 0);
+ ph.add_constraint(A > B - 2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A - 2*C + 3, GREATER_THAN, B - 1);
+
+ NNC_Polyhedron known_result(ph);
+ known_result.add_constraint(A - B - 2*C + 4 > 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 2);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 2);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_image(A + B, LESS_THAN, 2*A - 3*B);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A + B < 4);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.generalized_affine_image"
+ "(A + B, LESS_THAN, 2*A - 3*B) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST_F8(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage1.cc b/tests/Polyhedron/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..527a2bb
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage1.cc
@@ -0,0 +1,124 @@
+/* Test Polyhedron::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
+
+ C_Polyhedron known_result(2, UNIVERSE);
+ known_result.add_constraint(0 <= A);
+ known_result.add_constraint(A <= 3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_preimage"
+ "(B, GREATER_OR_EQUAL, A+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 4);
+ ph.add_constraint(B <= 5);
+ ph.add_constraint(A <= B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2, -2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(4*A));
+ known_result.add_generator(line(B));
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_preimage"
+ "(B, GREATER_OR_EQUAL, A+2, -2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*A <= 3);
+ ph.add_constraint(7*A >= 2);
+ ph.add_constraint(3*B >= 1);
+ ph.add_constraint(2*A >= B);
+
+ print_generators(ph, "*** ph ***");
+
+ // A longer way of computing the generalized affine preimage below.
+ C_Polyhedron known_result(ph);
+ known_result.add_space_dimensions_and_embed(1);
+ Variable C(2);
+ known_result.add_constraint(-3*B >= A-C+2);
+ Variables_Set vset;
+ vset.insert(B);
+ known_result.remove_space_dimensions(vset);
+
+ ph.generalized_affine_preimage(B, LESS_OR_EQUAL, A-B+2, -3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_preimage"
+ "(B, LESS_OR_EQUAL, A-B+2, -3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST_F8(test03);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage2.cc b/tests/Polyhedron/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..c4a12c9
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage2.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::generalized_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A + B));
+ ph.add_generator(closure_point(2*A));
+ ph.add_generator(closure_point(2*A + 2*B));
+ ph.add_generator(closure_point(3*A + B));
+
+ print_constraints(ph, "*** ph ***");
+
+ // A longer way of computing the generalized affine preimage below.
+ NNC_Polyhedron known_result(ph);
+ known_result.add_space_dimensions_and_embed(1);
+ Variable C(2);
+ known_result.add_constraint(B < C+2);
+ Variables_Set vset;
+ vset.insert(B);
+ known_result.remove_space_dimensions(vset);
+
+ ph.generalized_affine_preimage(B, LESS_THAN, B+2);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph after "
+ "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generators1.cc b/tests/Polyhedron/generators1.cc
new file mode 100644
index 0000000..b03ac65
--- /dev/null
+++ b/tests/Polyhedron/generators1.cc
@@ -0,0 +1,235 @@
+/* Test the construction of a polyhedron using generators.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point(x + y, -1));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ Constraint_System cs = ph.constraints();
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x == -1);
+ known_result.add_constraint(y == -1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph constraints ***");
+ print_generators(ph, "*** ph generators ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x + y >= 2);
+ cs.insert(x + y <= 1);
+
+ C_Polyhedron known_result(cs);
+
+ const Generator_System& gs = known_result.generators();
+
+ print_generators(gs, "*** gs ***");
+
+ C_Polyhedron ph(gs);
+
+ bool ok = (gs.space_dimension() == known_result.space_dimension()
+ && gs.begin() == gs.end()
+ && ph == known_result);
+
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ C_Polyhedron ph2(0);
+
+ C_Polyhedron ph3(2);
+ ph3.add_constraint(A >= 1);
+ ph3.add_constraint(A <= -1);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ print_generators(ph3, "*** ph3 ***");
+
+ Generator_System gs1 = ph1.generators();
+ Generator_System gs2 = ph2.generators();
+ Generator_System gs3 = ph3.generators();
+
+ Generator_System known_result2;
+ known_result2.insert(point());
+
+ bool ok = (gs1.begin() == gs1.end()
+ && C_Polyhedron(gs2) == C_Polyhedron(known_result2)
+ && gs3.begin() == gs3.end());
+
+ print_generators(gs1, "*** gs1 ***");
+ print_generators(gs2, "*** gs2 ***");
+ print_generators(gs3, "*** gs3 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ const Generator_System gs;
+
+ C_Polyhedron ph(gs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Generator_System gs1;
+ gs1.insert(point());
+
+ C_Polyhedron ph1(gs1);
+ C_Polyhedron known_result(ph1);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ const Generator_System gs2 = ph1.generators();
+
+ C_Polyhedron ph2(gs2);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.generators();
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron known_result(ph1);
+
+ Generator_System gs = ph1.generators();
+ C_Polyhedron ph2(gs);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ print_generators(gs, "*** gs ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(ray(A));
+ ph1.add_generator(ray(B));
+
+ C_Polyhedron known_result(ph1);
+
+ Generator_System gs = ph1.generators();
+ C_Polyhedron ph2(gs);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ print_generators(gs, "*** gs ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point());
+ ph.add_generator(ray(A));
+ ph.add_generator(ray(B));
+
+ print_generators(ph, "*** ph ***");
+
+ Generator_System gs = ph.generators();
+ gs.insert(point(A));
+ gs.insert(point(B));
+
+ print_generators(gs, "*** gs ***");
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ return C_Polyhedron(gs) == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/geomcovers1.cc b/tests/Polyhedron/geomcovers1.cc
new file mode 100644
index 0000000..3d55be0
--- /dev/null
+++ b/tests/Polyhedron/geomcovers1.cc
@@ -0,0 +1,61 @@
+/* Test Pointset_Powerset<PH>::geometrically_covers().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ Constraint_System cs1, cs2, cs3, cs4;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 4);
+ cs2.insert(x >= 4);
+ cs2.insert(x <= 6);
+ cs3.insert(x >= 1);
+ cs3.insert(x <= 5);
+ C_Polyhedron ph1(cs1), ph2(cs2), ph3(cs3);
+
+ Pointset_Powerset<C_Polyhedron> ps12(1, EMPTY);
+ ps12.add_disjunct(ph1);
+ ps12.add_disjunct(ph2);
+
+ Pointset_Powerset<C_Polyhedron> ps3(1, EMPTY);
+ ps3.add_disjunct(ph3);
+
+ bool ok = ps12.geometrically_covers(ps3);
+
+ using namespace IO_Operators;
+ nout << "ps12 = " << ps12 << endl
+ << " ps3 = " << ps3 << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening1.cc b/tests/Polyhedron/h79widening1.cc
new file mode 100644
index 0000000..900d63e
--- /dev/null
+++ b/tests/Polyhedron/h79widening1.cc
@@ -0,0 +1,246 @@
+/* Test Polyhedron::H79_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(x <= 2);
+ ph1.add_constraint(y <= 2);
+
+ C_Polyhedron ph2(2);
+ // Add inconsistent constraints to ph2.
+ ph2.add_constraint(x+y <= 0);
+ ph2.add_constraint(x+y >= 2);
+
+ C_Polyhedron ph1_1(ph1);
+ print_constraints(ph1_1, "*** ph1_1 ***");
+ C_Polyhedron ph2_1(ph2);
+ print_constraints(ph2_1, "*** ph2_1 ***");
+ ph1_1.H79_widening_assign(ph2_1);
+ print_generators(ph1_1, "*** after H79_widening_assign ***");
+ C_Polyhedron ph1_2(ph1);
+ bool ok = (ph1_1 == ph1_2);
+
+ C_Polyhedron ph2_2(ph2);
+ print_constraints(ph2_2, "*** ph2_2 ***");
+ C_Polyhedron ph2_3(ph2);
+ print_constraints(ph2_3, "*** ph2_3 ***");
+ ph2_2.H79_widening_assign(ph2_3);
+ print_generators(ph2_2, "*** after H79_widening_assign ***");
+ C_Polyhedron ph2_4(ph2);
+ ok = ok && (ph2_2 == ph2_4);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 2);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(A-B >= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.H79_widening_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after H79_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(ray(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(A));
+ gs2.insert(ray(A + 2*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph2.H79_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(0, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.H79_widening_assign(ph2);
+
+ C_Polyhedron known_result;
+ known_result = ph1;
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(-A - 2*B >= -6);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A - 2*B >= 2);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(-A - 2*B >= -10);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(A - 2*B >= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph2.H79_widening_assign(ph1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - 2*B >= 2);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(-A + B >= 2);
+ ph1.add_constraint(A >= 0);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(-A + B >= 3);
+ ph2.add_constraint(A - B >= -8);
+ ph2.add_constraint(A >= 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.H79_widening_assign(ph2);
+
+ bool ok = ph1.is_universe();
+
+ print_constraints(ph1, "*** after H79_widening_assign ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+ // The addition of the following generator shows a bug
+ // that was affecting PPL version 0.6.1 (now corrected).
+ ph1.add_generator(line(A));
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A >= 0);
+ ph2.add_constraint(B >= 0);
+
+ // Avoid computing the constraints of ph1.
+ C_Polyhedron ph1_copy = ph1;
+ print_constraints(ph1_copy, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.H79_widening_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after H79_widening_assign ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening2.cc b/tests/Polyhedron/h79widening2.cc
new file mode 100644
index 0000000..3e667fc
--- /dev/null
+++ b/tests/Polyhedron/h79widening2.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::H79_widening_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// This is the example of Figure 3 in [BagnaraRZH02TR].
+bool
+test01() {
+ Variable A(0);
+
+ NNC_Polyhedron ph1(1);
+ ph1.add_constraint(A > 0);
+ ph1.add_constraint(A < 2);
+
+ NNC_Polyhedron ph4(1);
+ ph4.add_constraint(4*A >= 1);
+ ph4.add_constraint(4*A <= 3);
+
+ NNC_Polyhedron ph = ph4;
+ ph.intersection_assign(ph1);
+ // At this point, ph and ph4 are two different representations
+ // of the same NNC polyhedron.
+
+ print_constraints(ph4, "*** ph4 ***");
+ print_constraints(ph, "*** ph ***");
+
+ NNC_Polyhedron known_result(ph4);
+
+ ph.H79_widening_assign(ph4);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after H79_widening_assign ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/hybrid.cc b/tests/Polyhedron/hybrid.cc
new file mode 100644
index 0000000..33e0cac
--- /dev/null
+++ b/tests/Polyhedron/hybrid.cc
@@ -0,0 +1,865 @@
+/* Test three examples for linear hybrid systems. These are based on
+ the examples in HalbwachsPR94 and HalbwachsPR97 papers.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// The water monitor example.
+// Note that we have had to add a closure operator as an action
+// for each of the transitions. Without this, the results are empty.
+bool
+test01() {
+ Variable w(0);
+ Variable x(1);
+ NNC_Polyhedron ph0(2, EMPTY);
+ NNC_Polyhedron ph0_prev(2, EMPTY);
+ NNC_Polyhedron ph1(2, EMPTY);
+ NNC_Polyhedron ph2(2, EMPTY);
+ NNC_Polyhedron ph3(2, EMPTY);
+
+ NNC_Polyhedron ph0_init(2);
+ ph0_init.add_constraint(w == 1);
+
+ NNC_Polyhedron ph_tea01(2);
+ ph_tea01.add_constraint(w == 1);
+ ph_tea01.add_constraint(x == 1);
+
+ NNC_Polyhedron ph_tea23(2);
+ ph_tea23.add_constraint(w == -2);
+ ph_tea23.add_constraint(x == 1);
+
+ NNC_Polyhedron ph_tmp(2);
+
+ while (true) {
+ ph0_prev = ph0;
+
+ // ph0
+ ph0 = ph0_init;
+ ph_tmp = ph3;
+ // We must close the constraints since the values of x and w
+ // increase continuously in the transition from l3 to l0.
+ ph_tmp.topological_closure_assign();
+ // Add constraint for the transition from l3 to l0.
+ ph_tmp.add_constraint(x == 2);
+ // Add invariant constraint for l0.
+ ph_tmp.add_constraint(w < 10);
+ // Join with the Init(l0).
+ ph0.upper_bound_assign(ph_tmp);
+ // Time elaspe for l0.
+ ph0.time_elapse_assign(ph_tea01);
+ // Add invariant constraint for l0.
+ ph0.add_constraint(w < 10);
+
+ ph0.H79_widening_assign(ph0_prev);
+
+ if (ph0 == ph0_prev) {
+
+ NNC_Polyhedron known_result0(2);
+ known_result0.add_constraint(1 <= w);
+ known_result0.add_constraint(w < 10);
+ bool ok = (ph0 == known_result0);
+
+ print_constraints(ph0, "*** ph0 final ***");
+
+ NNC_Polyhedron known_result1(2);
+ known_result1.add_constraint(w - x == 10);
+ known_result1.add_constraint(x >= 0);
+ known_result1.add_constraint(x < 2);
+ ok = ok && (ph1 == known_result1);
+
+ print_constraints(ph1, "*** ph1 final ***");
+
+ NNC_Polyhedron known_result2(2);
+ known_result2.add_constraint(w + 2*x == 16);
+ known_result2.add_constraint(x >= 2);
+ known_result2.add_constraint(w > 5);
+ ok = ok && (ph2 == known_result2);
+
+ print_constraints(ph2, "*** ph2 final ***");
+
+ NNC_Polyhedron known_result3(2);
+ known_result3.add_constraint(w + 2*x == 5);
+ known_result3.add_constraint(w <= 5);
+ known_result3.add_constraint(w > 1);
+ ok = ok && (ph3 == known_result3);
+
+ print_constraints(ph3, "*** ph3 final ***");
+
+ return ok;
+ }
+
+ print_constraints(ph0, "*** ph0 ***");
+ // ph1
+ // The only incoming transition is from l0.
+ ph1 = ph0;
+ // We must close the constraints since the values of x and w
+ // increase continuously in the transition from l0 to l1.
+ ph1.topological_closure_assign();
+ // Add constraint for the transition from l0 to l1.
+ ph1.add_constraint(w == 10);
+ // Do the action for the transition from l0 to l1.
+ ph1.affine_image(x, 0*x);
+ // Add invariant constraint for l1.
+ ph1.add_constraint(x < 2);
+ // Time elapse for l1.
+ ph1.time_elapse_assign(ph_tea01);
+ // Add invariant constraint for l1.
+ print_constraints(ph1, "*** ph1 before time elapse ***");
+ // Add invariant constraint for l1.
+ ph1.add_constraint(x < 2);
+
+ // The only incoming transition is from l1.
+ ph2 = ph1;
+ // We must close the constraints since the values of x and w
+ // increase continuously in the transition from l1 to l2.
+ ph2.topological_closure_assign();
+ // Add constraint for the transition from l1 to l2.
+ ph2.add_constraint(x == 2);
+ // There is no action for the transition from l1 to l2.
+ // add invariant constraint for l2.
+ ph2.add_constraint(w > 5);
+ // Time elaspe for l2.
+ ph2.time_elapse_assign(ph_tea23);
+ // Add invariant constraint for l2.
+ ph2.add_constraint(w > 5);
+
+ // The only incoming transition is from l2.
+ ph3 = ph2;
+ // We must close the constraints since the values of x and w
+ // increase continuously in the transition from l2 to l3.
+ ph3.topological_closure_assign();
+ // Add constraint for the transition from l2 to l3.
+ ph3.add_constraint(w == 5);
+ // Do the action for the transition from l2 to l3.
+ ph3.affine_image(x, 0*x);
+ // Add invariant constraint for l3.
+ ph3.add_constraint(x < 2);
+ // Time elaspe for l3.
+ ph3.time_elapse_assign(ph_tea23);
+ // Add invariant constraint for l3.
+ ph3.add_constraint(x < 2);
+ }
+ return false;
+}
+
+// The Fischer protocol example where we make the exclusion variable
+// one of the variables of the automaton.
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable a(2);
+ Variable b(3);
+ Variable k(4);
+
+ NNC_Polyhedron ph0(5, EMPTY);
+ NNC_Polyhedron ph1(5, EMPTY);
+ NNC_Polyhedron ph2(5, EMPTY);
+ NNC_Polyhedron ph3(5, EMPTY);
+ NNC_Polyhedron ph4(5, EMPTY);
+ NNC_Polyhedron ph5(5, EMPTY);
+
+ NNC_Polyhedron ph0_Init(5);
+ ph0_Init.add_constraint(a >= 0);
+ ph0_Init.add_constraint(b >= 0);
+ ph0_Init.add_constraint(k >= 0);
+ ph0_Init.add_constraint(k <= 2);
+
+ NNC_Polyhedron ph0_prev(5, EMPTY);
+
+ // The derivative polyhedron is the same at all locations.
+ NNC_Polyhedron ph_tea(5);
+ ph_tea.add_constraint(a == 0);
+ ph_tea.add_constraint(b == 0);
+ ph_tea.add_constraint(x1 == 1);
+ ph_tea.add_constraint(10*x2 >= 9);
+ ph_tea.add_constraint(10*x2 <= 11);
+
+ NNC_Polyhedron ph_tmp(5);
+
+ while (true) {
+ // nout << "next iteration" << "\n";
+
+ // Location l0.
+ ph0 = ph0_Init;
+ ph_tmp = ph3;
+ ph_tmp.add_constraint(x1 >= b);
+ ph_tmp.add_constraint(k >= 0);
+ ph_tmp.add_constraint(k <= 2);
+ ph0.upper_bound_assign(ph_tmp);
+ ph_tmp = ph4;
+ ph_tmp.affine_image(k, Linear_Expression(0));
+ ph_tmp.add_constraint(k >= 0);
+ ph_tmp.add_constraint(k <= 2);
+ ph0.upper_bound_assign(ph_tmp);
+ ph_tmp = ph5;
+ ph_tmp.add_constraint(k >= 0);
+ ph_tmp.add_constraint(k <= 2);
+ ph0.upper_bound_assign(ph_tmp);
+ ph0.time_elapse_assign(ph_tea);
+ ph0.add_constraint(k >= 0);
+ ph0.add_constraint(k <= 2);
+
+ // Location l1.
+ ph1 = ph0;
+ ph1.add_constraint(k == 0);
+ ph1.affine_image(x1, Linear_Expression(0));
+ ph1.add_constraint(x1 <= a);
+ ph1.add_constraint(k == 0);
+ ph1.time_elapse_assign(ph_tea);
+ ph1.add_constraint(k == 0);
+ ph1.add_constraint(x1 <= a);
+
+ // Location l2.
+ ph2 = ph1;
+ ph2.affine_image(x1, Linear_Expression(0));
+ ph2.affine_image(x2, Linear_Expression(0));
+ ph2.affine_image(k, Linear_Expression(1));
+ ph2.add_constraint(k == 1);
+ ph2.time_elapse_assign(ph_tea);
+ ph2.add_constraint(k == 1);
+
+ // Location l3.
+ ph3 = ph2;
+ ph3.add_constraint(x2 <= a);
+ ph3.add_constraint(x1 < b);
+ ph3.affine_image(k, Linear_Expression(2));
+ ph3.add_constraint(k == 2);
+ ph3.time_elapse_assign(ph_tea);
+ ph3.add_constraint(k == 2);
+
+ // Location l4.
+ ph4 = ph2;
+ ph4.add_constraint(x1 >= b);
+ ph4.add_constraint(k == 1);
+ ph4.time_elapse_assign(ph_tea);
+ ph4.add_constraint(k == 1);
+
+ // Location l5.
+ ph5 = ph4;
+ ph5.add_constraint(x2 <= a);
+ ph5.affine_image(k, Linear_Expression(2));
+ ph5.add_constraint(k == 2);
+ ph5.time_elapse_assign(ph_tea);
+ ph5.add_constraint(k == 2);
+
+ // When we have a fixpoint, check and print results.
+ if (ph0 == ph0_prev) {
+
+ NNC_Polyhedron known_result0(5);
+ known_result0.add_constraint(a >= 0);
+ known_result0.add_constraint(b >= 0);
+ known_result0.add_constraint(k >= 0);
+ known_result0.add_constraint(k <= 2);
+ bool ok = (ph0 == known_result0);
+
+ print_constraints(ph0, "*** ph0 final ***");
+
+ NNC_Polyhedron known_result1(5);
+ known_result1.add_constraint(a >= 0);
+ known_result1.add_constraint(b >= 0);
+ known_result1.add_constraint(x1 >= 0);
+ known_result1.add_constraint(x1 <= a);
+ known_result1.add_constraint(k == 0);
+ ok = ok && (ph1 == known_result1);
+
+ print_constraints(ph1, "*** ph1 final ***");
+
+ NNC_Polyhedron known_result2(5);
+ known_result2.add_constraint(9*x1 - 10*x2 <= 0);
+ known_result2.add_constraint(11*x1 - 10*x2 >= 0);
+ known_result2.add_constraint(a >= 0);
+ known_result2.add_constraint(b >= 0);
+ known_result2.add_constraint(k == 1);
+ ok = ok && (ph2 == known_result2);
+
+ print_constraints(ph2, "*** ph2 final ***");
+
+ NNC_Polyhedron known_result3(5);
+ known_result3.add_constraint(9*x1 - 10*x2 <= 0);
+ known_result3.add_constraint(11*x1 - 10*x2 >= 0);
+ known_result3.add_constraint(a >= 0);
+ known_result3.add_constraint(b > 0);
+ known_result3.add_constraint(k == 2);
+ ok = ok && (ph3 == known_result3);
+
+ print_constraints(ph3, "*** ph3 final ***");
+
+ NNC_Polyhedron known_result4(5);
+ known_result4.add_constraint(9*x1 - 10*x2 <= 0);
+ known_result4.add_constraint(11*x1 - 10*x2 >= 0);
+ known_result4.add_constraint(a >= 0);
+ known_result4.add_constraint(b >= 0);
+ known_result4.add_constraint(x1 >= b);
+ known_result4.add_constraint(k == 1);
+ ok = ok && (ph4 == known_result4);
+
+ print_constraints(ph4, "*** ph4 final ***");
+
+ NNC_Polyhedron known_result5(5);
+ known_result5.add_constraint(9*b - 10*a <= 0);
+ known_result5.add_constraint(11*x1 - 10*x2 >= 0);
+ known_result5.add_constraint(11*x1 - 10*x2 + 10*a - 11*b >= 0);
+ known_result5.add_constraint(9*x1 - 10*x2 <= 0);
+ known_result5.add_constraint(b >= 0);
+ known_result5.add_constraint(x1 >= b);
+ known_result5.add_constraint(k == 2);
+ ok = ok && (ph5 == known_result5);
+
+ print_constraints(ph5, "*** ph5 final ***");
+
+ return ok;
+ }
+
+ ph0.upper_bound_assign(ph0_prev);
+ (void) ph0.is_empty();
+ // ph0.H79_widening_assign(ph0_prev);
+
+ ph0_prev = ph0;
+ }
+ return true;
+}
+
+// The Scheduler example using the Polyhedron domain.
+bool
+test03() {
+ Variable c1(0);
+ Variable c2(1);
+ Variable x1(2);
+ Variable x2(3);
+ Variable k1(4);
+ Variable k2(5);
+
+ NNC_Polyhedron ph_idle_Init(6);
+ ph_idle_Init.add_constraint(c1 >= 0);
+ ph_idle_Init.add_constraint(c2 >= 0);
+ ph_idle_Init.add_constraint(x1 == 0);
+ ph_idle_Init.add_constraint(x2 == 0);
+ ph_idle_Init.add_constraint(k1 == 0);
+ ph_idle_Init.add_constraint(k2 == 0);
+
+ NNC_Polyhedron ph_idle(6, EMPTY);
+ NNC_Polyhedron ph_t1(6, EMPTY);
+ NNC_Polyhedron ph_t2(6, EMPTY);
+
+ NNC_Polyhedron ph_idle_prev(6, EMPTY);
+ NNC_Polyhedron ph_t1_prev(6, EMPTY);
+ NNC_Polyhedron ph_t2_prev(6, EMPTY);
+
+ // The time elapse polyhedron at location Task1.
+ NNC_Polyhedron ph_tea1(6);
+ ph_tea1.add_constraint(c1 == 1);
+ ph_tea1.add_constraint(c2 == 1);
+ ph_tea1.add_constraint(x1 == 1);
+ ph_tea1.add_constraint(x2 == 0);
+ ph_tea1.add_constraint(k1 == 0);
+ ph_tea1.add_constraint(k2 == 0);
+
+ // The time elapse polyhedron at location Task2.
+ NNC_Polyhedron ph_tea2(6);
+ ph_tea2.add_constraint(c1 == 1);
+ ph_tea2.add_constraint(c2 == 1);
+ ph_tea2.add_constraint(x1 == 0);
+ ph_tea2.add_constraint(x2 == 1);
+ ph_tea2.add_constraint(k1 == 0);
+ ph_tea2.add_constraint(k2 == 0);
+
+ NNC_Polyhedron ph_tmp(6);
+
+ while (true) {
+
+ // Location Idle.
+ ph_idle.upper_bound_assign(ph_idle_Init);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(x1 == 4);
+ ph_tmp.add_constraint(k1 <= 1);
+ ph_tmp.affine_image(k1, k1 - 1);
+ ph_tmp.affine_image(x1, Linear_Expression(0));
+ ph_idle.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x2 == 8);
+ ph_tmp.add_constraint(k2 <= 1);
+ ph_tmp.add_constraint(k1 == 0);
+ ph_tmp.affine_image(k2, k2 - 1);
+ ph_tmp.affine_image(x2, Linear_Expression(0));
+ ph_idle.upper_bound_assign(ph_tmp);
+
+ // Location Task1.
+ ph_tmp = ph_idle;
+ ph_tmp.add_constraint(c1 >= 10);
+ ph_tmp.affine_image(c1, Linear_Expression(0));
+ ph_tmp.affine_image(k1, Linear_Expression(1));
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(c1 >= 10);
+ ph_tmp.affine_image(c1, Linear_Expression(0));
+ ph_tmp.affine_image(k1, k1 + 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(x1 == 4);
+ ph_tmp.add_constraint(k1 >= 2);
+ ph_tmp.affine_image(x1, Linear_Expression(0));
+ ph_tmp.affine_image(k1, k1 - 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x1 == 8);
+ ph_tmp.add_constraint(k2 <= 1);
+ ph_tmp.add_constraint(k1 >= 1);
+ ph_tmp.affine_image(x2, Linear_Expression(0));
+ ph_tmp.affine_image(k2, k2 - 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_t1.time_elapse_assign(ph_tea1);
+ ph_t1.add_constraint(x1 <= 4);
+
+ // Location Task2.
+ ph_tmp = ph_idle;
+ ph_tmp.add_constraint(c2 >= 20);
+ ph_tmp.affine_image(c2, Linear_Expression(0));
+ ph_tmp.affine_image(k2, Linear_Expression(1));
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(c2 >= 20);
+ ph_tmp.affine_image(c2, Linear_Expression(0));
+ ph_tmp.affine_image(k2, k2 + 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(c1 >= 10);
+ ph_tmp.affine_image(c1, Linear_Expression(0));
+ ph_tmp.affine_image(k1, k1 + 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x2 == 8);
+ ph_tmp.add_constraint(k2 >= 2);
+ ph_tmp.affine_image(x2, Linear_Expression(0));
+ ph_tmp.affine_image(k2, k2 - 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(c2 >= 20);
+ ph_tmp.affine_image(c2, Linear_Expression(0));
+ ph_tmp.affine_image(k2, Linear_Expression(1));
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_t2.time_elapse_assign(ph_tea2);
+ ph_t2.add_constraint(x2 <= 8);
+
+ ph_t2.H79_widening_assign(ph_t2_prev);
+
+ if (ph_idle == ph_idle_prev
+ && ph_t1 == ph_t1_prev
+ && ph_t2 == ph_t2_prev) {
+
+ NNC_Polyhedron known_result_idle(6);
+ known_result_idle.add_constraint(c2 >= 0);
+ known_result_idle.add_constraint(x1 == 0);
+ known_result_idle.add_constraint(x2 == 0);
+ known_result_idle.add_constraint(k1 == 0);
+ known_result_idle.add_constraint(k2 == 0);
+ bool ok = (ph_idle == known_result_idle);
+
+ print_constraints(ph_idle, "*** ph_idle final ***");
+
+ NNC_Polyhedron known_result_t1(6);
+ known_result_t1.add_constraint(c1 <= c2);
+ known_result_t1.add_constraint(c1 >= 0);
+ known_result_t1.add_constraint(c1 <= 4);
+ known_result_t1.add_constraint(x1 == c1);
+ known_result_t1.add_constraint(x2 == 0);
+ known_result_t1.add_constraint(k1 == 1);
+ known_result_t1.add_constraint(k2 == 0);
+ ok = ok && (ph_t1 == known_result_t1);
+
+ print_constraints(ph_t1, "*** ph_t1 final ***");
+
+ NNC_Polyhedron known_result_t2(6);
+ known_result_t2.add_constraint(c2 >= 0);
+ known_result_t2.add_constraint(x1 >= 0);
+ known_result_t2.add_constraint(x1 <= 4*k1);
+ known_result_t2.add_constraint(c2 <= 8);
+ known_result_t2.add_constraint(x2 == c2);
+ known_result_t2.add_constraint(k2 == 1);
+ ok = ok && (ph_t2 == known_result_t2);
+
+ print_constraints(ph_t2, "*** ph_t2 final ***");
+
+ return ok;
+ }
+
+ ph_idle_prev = ph_idle;
+ ph_t1_prev = ph_t1;
+ ph_t2_prev = ph_t2;
+ }
+ return false;
+}
+
+// Additional procedures needed for the Scheduler example using powersets.
+
+// Compute the time_elapse() for each element of the powerset.
+void
+time_elapse(Pointset_Powerset<NNC_Polyhedron>& ps,
+ const NNC_Polyhedron& ph) {
+ Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+ for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = ps.begin(),
+ ps_end = ps.end(); i != ps_end; ++i) {
+ NNC_Polyhedron di = i->pointset();
+ NNC_Polyhedron d(di);
+ d.time_elapse_assign(ph);
+ ps_result.add_disjunct(d);
+ }
+ ps = ps_result;
+}
+
+// Compute the affine_image() for each element of the powerset.
+void
+affine_image(Pointset_Powerset<NNC_Polyhedron>& ps, Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one()) {
+ Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+ ps_end = ps.end(); i != ps_end; ++i) {
+ NNC_Polyhedron phi = i->pointset();
+ NNC_Polyhedron ph(phi);
+ ph.affine_image(var, expr, denominator);
+ ps_result.add_disjunct(ph);
+ }
+ ps = ps_result;
+}
+
+// Compute the upper_bound of the powerset.
+void
+powerset_upper_bound(Pointset_Powerset<NNC_Polyhedron>& ps,
+ NNC_Polyhedron& ph) {
+ Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+ ps_end = ps.end(); i != ps_end; ++i) {
+ NNC_Polyhedron phi = i->pointset();
+ ph.upper_bound_assign(phi);
+ (void) ph.is_empty();
+ }
+}
+
+// This has been added to replace the expensive geometrically_covers()
+// test at each cycle of the iteration and intended to speed up the
+// computation.
+//
+// Check if every disjunct of the 2nd powerset is contained in an
+// disjunct of the first powerset.
+// If this succeeds then geometrically covers() will also hold.
+bool
+disjunct_covers(Pointset_Powerset<NNC_Polyhedron>& ps1,
+ Pointset_Powerset<NNC_Polyhedron>& ps2) {
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps2.begin(),
+ ps2_end = ps2.end(); i != ps2_end; ++i) {
+ bool is_contained = false;
+ NNC_Polyhedron ph2 = i->pointset();
+ for (Pointset_Powerset<NNC_Polyhedron>::iterator j = ps1.begin(),
+ ps1_end = ps1.end(); j != ps1_end; ++j) {
+ NNC_Polyhedron ph1 = j->pointset();
+ if (ph1.contains(ph2)) {
+ is_contained = true;
+ break;
+ }
+ }
+ if (!is_contained)
+ return false;
+ }
+ return true;
+}
+
+// The Scheduler example using powersets.
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable k1(2);
+ Variable k2(3);
+ Variable c1(4);
+ Variable c2(5);
+
+ Pointset_Powerset<NNC_Polyhedron> ph_idle(6);
+ ph_idle.add_constraint(c1 >= 0);
+ ph_idle.add_constraint(c2 >= 0);
+ ph_idle.add_constraint(x1 == 0);
+ ph_idle.add_constraint(x2 == 0);
+ ph_idle.add_constraint(k1 == 0);
+ ph_idle.add_constraint(k2 == 0);
+ Pointset_Powerset<NNC_Polyhedron>
+ ph_t1 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+ Pointset_Powerset<NNC_Polyhedron>
+ ph_t2 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+ Pointset_Powerset<NNC_Polyhedron>
+ ph_idle_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+ Pointset_Powerset<NNC_Polyhedron>
+ ph_t1_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+ Pointset_Powerset<NNC_Polyhedron>
+ ph_t2_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+ NNC_Polyhedron ph_tea1(6);
+ ph_tea1.add_constraint(c1 == 1);
+ ph_tea1.add_constraint(c2 == 1);
+ ph_tea1.add_constraint(x1 == 1);
+ ph_tea1.add_constraint(x2 == 0);
+ ph_tea1.add_constraint(k1 == 0);
+ ph_tea1.add_constraint(k2 == 0);
+ NNC_Polyhedron ph_tea2(6);
+ ph_tea2.add_constraint(c1 == 1);
+ ph_tea2.add_constraint(c2 == 1);
+ ph_tea2.add_constraint(x1 == 0);
+ ph_tea2.add_constraint(x2 == 1);
+ ph_tea2.add_constraint(k1 == 0);
+ ph_tea2.add_constraint(k2 == 0);
+
+ Pointset_Powerset<NNC_Polyhedron> ph_tmp(6);
+
+ while (true) {
+ // nout << "next iteration" << std::endl;
+
+ // ph_idle
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(x1 == 4);
+ ph_tmp.add_constraint(k1 <= 1);
+ affine_image(ph_tmp, k1, k1 - 1);
+ affine_image(ph_tmp, x1, Linear_Expression(0));
+ ph_idle.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x2 == 8);
+ ph_tmp.add_constraint(k2 <= 1);
+ ph_tmp.add_constraint(k1 == 0);
+ affine_image(ph_tmp, k2, k2 - 1);
+ affine_image(ph_tmp, x2, Linear_Expression(0));
+ ph_idle.upper_bound_assign(ph_tmp);
+
+ // ph_t1
+ ph_tmp = ph_idle;
+ ph_tmp.add_constraint(c1 >= 10);
+ affine_image(ph_tmp, c1, Linear_Expression(0));
+ affine_image(ph_tmp, k1, Linear_Expression(1));
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(c1 >= 10);
+ affine_image(ph_tmp, c1, Linear_Expression(0));
+ affine_image(ph_tmp, k1, k1 + 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(x1 == 4);
+ ph_tmp.add_constraint(k1 >= 2);
+ affine_image(ph_tmp, x1, Linear_Expression(0));
+ affine_image(ph_tmp, k1, k1 - 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x1 == 8);
+ ph_tmp.add_constraint(k2 <= 1);
+ ph_tmp.add_constraint(k1 >= 1);
+ affine_image(ph_tmp, x2, Linear_Expression(0));
+ affine_image(ph_tmp, k2, k2 - 1);
+ ph_tmp.add_constraint(x1 <= 4);
+ ph_t1.upper_bound_assign(ph_tmp);
+ time_elapse(ph_t1, ph_tea1);
+ ph_t1.add_constraint(x1 <= 4);
+ (void) ph_t1.is_empty();
+
+ // ph_t2
+ ph_tmp = ph_idle;
+ ph_tmp.add_constraint(c2 >= 20);
+ affine_image(ph_tmp, c2, Linear_Expression(0));
+ affine_image(ph_tmp, k2, Linear_Expression(1));
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(c2 >= 20);
+ affine_image(ph_tmp, c2, Linear_Expression(0));
+ affine_image(ph_tmp, k2, k2 + 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(c1 >= 10);
+ affine_image(ph_tmp, c1, Linear_Expression(0));
+ affine_image(ph_tmp, k1, k1 + 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t2;
+ ph_tmp.add_constraint(x2 == 8);
+ ph_tmp.add_constraint(k2 >= 2);
+ affine_image(ph_tmp, x2, Linear_Expression(0));
+ affine_image(ph_tmp, k2, k2 - 1);
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ ph_tmp = ph_t1;
+ ph_tmp.add_constraint(c2 >= 20);
+ affine_image(ph_tmp, c2, Linear_Expression(0));
+ affine_image(ph_tmp, k2, Linear_Expression(1));
+ ph_tmp.add_constraint(x2 <= 8);
+ ph_t2.upper_bound_assign(ph_tmp);
+ time_elapse(ph_t2, ph_tea2);
+ ph_t2.add_constraint(x2 <= 8);
+
+ // Note that widening is not needed and the iteration terminates
+ // with the ph_t2 consisting of 4 polyhedra.
+ // The results without any widening are:
+
+ // ph_idle = { F = 0, E = 0, D = 0, C = 0, B >= 0, A >= 0 }
+
+ // ph_t1 =
+ // { F = 0, E = 1, D = 0, A - C = 0, -A + B >= 0, A >= 0, -A >= -4 }
+
+ // ph_t2 =
+ // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+ // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+ // B >= 0, A - B >= 0 },
+ // { F = 1, E = 1, C = 0, B - D = 0, -A + B >= 0, -B >= -8, A >= 0 },
+ // { F = 1, E = 2, B - D = 0, -A + B + C >= 10, -C >= -4, -B >= -8,
+ // A >= 0 }
+
+
+ // However, for ph_t2, a number of different
+ // widening and extrapolation options have been tested.
+ //
+ //
+ // ph_t2.BGP99_extrapolation_assign(
+ // ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 3);
+ // The BGP99 extrapolation with the max number 3 keeps the information
+ // that k1 <= 2 as well as that k2 = 1:
+ // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+ // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+ // B >= 0, A - B >= 0 },
+ // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C + 4*E >= 4,
+ // -E >= -2, C - 2*E >= -2, -B >= -8, A >= 0 }
+
+ // ph_t2.BGP99_extrapolation_assign(
+ // ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+ // If we reduce the number 3 to 2, then we lose the constraint k1 <= 2:
+ // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+ // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C >= -4, E >= 1,
+ // C - 2*E >= -2, A - B - 3*C + 12*E >= 4, -B >= -8, A - C + 4*E >= 4 }
+
+ // ph_t2.BHZ03_widening_assign<BHRZ03_Certificate>
+ // (ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign));
+ // The BHZ03 widening loses the information that k1 <=2
+ // because there is no "with tokens" option:
+ // { F = 1, B - D = 0, -C + 4*E >= 0, C >= 0, B >= 0, -B >= -8 }
+
+ // The simpler test disjunct_covers() which is sufficient here
+ // should be more efficient than geometrically_covers().
+ if (disjunct_covers(ph_idle_prev, ph_idle)
+ && disjunct_covers(ph_t1_prev, ph_t1)
+ && disjunct_covers(ph_t2_prev, ph_t2)) {
+
+ // if (ph_idle_prev.geometrically_covers(ph_idle)
+ // && ph_t1_prev.geometrically_covers(ph_t1)
+ // && ph_t2_prev.geometrically_covers(ph_t2)) {
+
+
+ print_constraints(ph_idle, "*** ph_idle final ***");
+
+ print_constraints(ph_t1, "*** ph_t1 final ***");
+
+ print_constraints(ph_t2, "*** ph_t2 final ***");
+
+ // We project away the variables c1 and C2 only compare the
+ // upper_bounds of the powerset with the expected result.
+
+ Variables_Set vs;
+ vs.insert(c1);
+ vs.insert(c2);
+
+ NNC_Polyhedron ph_idle_hull(6, EMPTY);
+ powerset_upper_bound(ph_idle, ph_idle_hull);
+
+ ph_idle_hull.remove_space_dimensions(vs);
+
+ NNC_Polyhedron known_result_idle(4);
+ known_result_idle.add_constraint(x1 == 0);
+ known_result_idle.add_constraint(x2 == 0);
+ known_result_idle.add_constraint(k1 == 0);
+ known_result_idle.add_constraint(k2 == 0);
+ bool ok = (ph_idle_hull == known_result_idle);
+
+ print_constraints(ph_idle_hull, "*** ph_idle_hull final projected ***");
+
+ NNC_Polyhedron ph_t1_hull(6, EMPTY);
+ powerset_upper_bound(ph_t1, ph_t1_hull);
+ ph_t1_hull.remove_space_dimensions(vs);
+
+ NNC_Polyhedron known_result_t1(4);
+ known_result_t1.add_constraint(x1 >= 0);
+ known_result_t1.add_constraint(x1 <= 4);
+ known_result_t1.add_constraint(x2 == 0);
+ known_result_t1.add_constraint(k1 == 1);
+ known_result_t1.add_constraint(k2 == 0);
+ ok = ok && (ph_t1_hull == known_result_t1);
+
+ print_constraints(ph_t1_hull, "*** ph_t1_hull final projected ***");
+
+ NNC_Polyhedron ph_t2_hull(6, EMPTY);
+ powerset_upper_bound(ph_t2, ph_t2_hull);
+ ph_t2_hull.remove_space_dimensions(vs);
+
+ NNC_Polyhedron known_result_t2(4);
+ known_result_t2.add_constraint(k2 == 1);
+ known_result_t2.add_constraint(k1 <= 2);
+ known_result_t2.add_constraint(x1 >= 0);
+ known_result_t2.add_constraint(x1 <= 4);
+ known_result_t2.add_constraint(x1 >= 0);
+ known_result_t2.add_constraint(x2 <= 8);
+ known_result_t2.add_constraint(x2 >= 0);
+ known_result_t2.add_constraint(x1 <= 4*k1);
+ known_result_t2.add_constraint(2*k1 - x1 <= 2);
+ known_result_t2.add_constraint(x1 + x2 >= 10*k1 -10);
+ known_result_t2.add_constraint(x2 >= 6*k1 - 6);
+ ok = ok && (ph_t2_hull == known_result_t2);
+
+ print_constraints(ph_t2_hull, "*** ph_t2_hull final projected ***");
+
+ return ok;
+ }
+
+ ph_idle_prev = ph_idle;
+ ph_t1_prev = ph_t1;
+ ph_t2_prev = ph_t2;
+ }
+
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/intersection1.cc b/tests/Polyhedron/intersection1.cc
new file mode 100644
index 0000000..cc8b8a1
--- /dev/null
+++ b/tests/Polyhedron/intersection1.cc
@@ -0,0 +1,513 @@
+/* Testing Polyhedron::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Intersection of an icosahedron with a column.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron icosahedron(3);
+ icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+ icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+ icosahedron.add_constraint(x + y - 1 >= 0);
+ icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+ icosahedron.add_constraint(x + 1 >= 0);
+ icosahedron.add_constraint(x + z - 1 >= 0);
+ icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+ icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+ icosahedron.add_constraint(x - y + 5 >= 0);
+ icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+ icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+ icosahedron.add_constraint(-x + y - 1 >= 0);
+ icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+ icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+ icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+ icosahedron.add_constraint(-x + 1 >= 0);
+ icosahedron.add_constraint(-x - z + 5 >= 0);
+ icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+ icosahedron.add_constraint(-x - y + 5 >= 0);
+ icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+ C_Polyhedron column(3);
+ column.add_constraint(y >= 2);
+ column.add_constraint(y <= 4);
+ column.add_constraint(x >= 0);
+ column.add_constraint(x <= 1);
+
+ C_Polyhedron computed_result = icosahedron;
+ computed_result.intersection_assign(column);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(-4*x - 2*y + z >= -8);
+ known_result.add_constraint(-4*x + 2*y + z >= 4);
+ known_result.add_constraint(-2*x - y + 2*z >= -1);
+ known_result.add_constraint(-2*x + y + 2*z >= 5);
+ known_result.add_constraint(-x - y - 2*z >= -13);
+ known_result.add_constraint(-x - z >= -5);
+ known_result.add_constraint(-x >= -1);
+ known_result.add_constraint(-x + y - 2*z >= -7);
+ known_result.add_constraint(-y >= -4);
+ known_result.add_constraint(y >= 2);
+ known_result.add_constraint(x >= 0);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(icosahedron, "*** icosahedron ***");
+ print_constraints(column, "*** column ***");
+ print_constraints(computed_result, "*** computed_result ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+int
+aux_test02(const C_Polyhedron& ph) {
+ if (ph.is_empty() || ph.space_dimension() == 0)
+ return 0;
+
+ int count = 0;
+ const Generator_System& gs = ph.generators();
+ for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+ i != gs_end;
+ ++i)
+ if (i->type() == Generator::POINT)
+ ++count;
+ return count;
+}
+
+// Intersection of a pyramid with an half-space of variable height.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ // This is the height of the pyramid.
+ const Coefficient pyramid_height = 16;
+
+ // We will intersect it with the half-spaces `z <= k' and `z >= k'
+ // with k = i*(height/4) for i = -1, 0, 1, ..., 5.
+ struct {
+ Coefficient plane_height;
+ int num_points_above;
+ int num_points_below;
+ } ph_nv[]
+ = { {-1*(pyramid_height/4), 5, 0},
+ { 0*(pyramid_height/4), 5, 4},
+ { 1*(pyramid_height/4), 5, 8},
+ { 2*(pyramid_height/4), 5, 8},
+ { 3*(pyramid_height/4), 5, 8},
+ { 4*(pyramid_height/4), 1, 5},
+ { 5*(pyramid_height/4), 0, 5}
+ };
+
+ Generator_System gs;
+ gs.insert(point(0*x + 0*y + 0*z));
+ gs.insert(point(2*x + 0*y + 0*z));
+ gs.insert(point(0*x + 2*y + 0*z));
+ gs.insert(point(2*x + 2*y + 0*z));
+ gs.insert(point(x + y + pyramid_height*z));
+ C_Polyhedron pyramid(gs);
+
+ print_constraints(pyramid, "*** pyramid constraints ***");
+ print_generators(pyramid, "*** pyramid generators ***");
+
+ bool ok = true;
+
+ for (dimension_type i = 0; i <= 6; ++i) {
+ // Above.
+ C_Polyhedron hyper_space_above(3);
+ hyper_space_above.add_constraint(z >= ph_nv[i].plane_height);
+
+ C_Polyhedron computed_result = pyramid;
+ computed_result.intersection_assign(hyper_space_above);
+
+ if (ok
+ && aux_test02(computed_result) != ph_nv[i].num_points_above)
+ ok = false;
+
+ print_constraints(hyper_space_above, "*** hyper_space_above ***");
+ print_generators(computed_result, "*** computed_result ***");
+
+ // Below.
+ C_Polyhedron hyper_space_below(3);
+ hyper_space_below.add_constraint(z <= ph_nv[i].plane_height);
+
+ computed_result = pyramid;
+ computed_result.intersection_assign(hyper_space_below);
+
+ if (ok
+ && aux_test02(computed_result) != ph_nv[i].num_points_below)
+ ok = false;
+
+ print_constraints(hyper_space_below, "*** hyper_space_below ***");
+ print_generators(computed_result, "*** computed_result ***");
+
+ }
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x - y >= 0);
+ ph1.add_constraint(x - y <= 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(y >= 0);
+ ph2.add_constraint(x <= 1);
+ ph2.add_constraint(y <= 1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result = ph1;
+
+ computed_result.intersection_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x - y >= 0);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= y);
+ ph1.add_constraint(x >= 0);
+
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result1(ph1);
+ computed_result1.intersection_assign(ph2);
+
+ Constraint_System cs_computed_result2 = ph1.constraints();
+ C_Polyhedron computed_result2(cs_computed_result2);
+ computed_result2.intersection_assign(ph2);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (computed_result1 == known_result
+ && computed_result2 == known_result);
+
+ print_constraints(computed_result1, "*** after intersection_assign ***");
+ print_constraints(computed_result2, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= y);
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point());
+ ph2.add_generator(line(x));
+ ph2.add_generator(ray(y));
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.intersection_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x >= y);
+
+ bool ok = (known_result == ph1);
+
+ print_constraints(ph1, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(3*x));
+ gs1.insert(point(3*y));
+ gs1.insert(point(3*x+ 3*y));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(x));
+ gs2.insert(point(4*x));
+ gs2.insert(point(x + 3*y));
+ gs2.insert(point(4*x+ 3*y));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.intersection_assign(ph2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(x));
+ known_result.add_generator(point(3*x));
+ known_result.add_generator(point(x + 3*y));
+ known_result.add_generator(point(3*x + 3*y));
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+bool
+aux_test07(C_Polyhedron& ph1,
+ const C_Polyhedron& ph2,
+ // Note intentional call-by-value!
+ C_Polyhedron known_result) {
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.intersection_assign(ph2);
+
+ print_generators(ph1, "*** after intersection_assign ***");
+
+ return ph1 == known_result;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1_1(2);
+ ph1_1.add_constraint(x >= 0);
+ ph1_1.add_constraint(y >= 0);
+ ph1_1.add_constraint(x <= 2);
+ ph1_1.add_constraint(y <= 2);
+ C_Polyhedron ph1_2(ph1_1);
+
+ C_Polyhedron ph2_1(2);
+ ph2_1.add_constraint(x+y <= 0);
+ ph2_1.add_constraint(x+y >= 2);
+ C_Polyhedron ph2_2(ph2_1);
+ C_Polyhedron ph2_3(ph2_1);
+ C_Polyhedron ph2_4(ph2_1);
+
+ bool ok = aux_test07(ph1_1, ph2_1, ph2_1)
+ && aux_test07(ph2_2, ph1_2, ph2_2)
+ && aux_test07(ph2_3, ph2_4, ph2_3);
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.intersection_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(0, EMPTY);
+ ph2.add_generator(point());
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result = ph1;
+
+ ph1.intersection_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A - B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.intersection_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.intersection_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.generators();
+ ph1.add_constraint(A == B);
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2);
+ ph2.generators();
+ ph2.add_constraint(A >= B + 1);
+ C_Polyhedron copy_ph2 = ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.intersection_assign(ph2);
+ copy_ph1.intersection_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** after intersection_assign ***");
+ print_constraints(copy_ph1, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(line(A + B));
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point());
+ ph2.constraints();
+ ph2.add_generator(ray(A));
+ ph2.add_generator(ray(B));
+
+ C_Polyhedron copy_ph2 = ph2;
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.intersection_assign(ph2);
+ copy_ph1.intersection_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** after intersection_assign ***");
+ print_constraints(copy_ph1, "*** after intersection_assign ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8A(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/limitedbhrz03extrapolation1.cc b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..83e86bf
--- /dev/null
+++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
@@ -0,0 +1,68 @@
+/* Test Polyhedron::limited_BHRZ03_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(A + B));
+ gs1.insert(point(A));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(point(2*A));
+ gs2.insert(point(2*A + 2*B));
+ C_Polyhedron ph2(gs2);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(B <= 4);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph2.limited_BHRZ03_extrapolation_assign(ph1, cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 0);
+ known_result.add_constraint(B <= 4);
+ known_result.add_constraint(A <= 5);
+
+ bool ok = (ph2 == known_result) ? true : false;
+
+ print_constraints(ph2, "*** after ph2.limited_BHRZ03_widening(ph1, cs) ***");
+
+ return ok;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/limitedh79extrapolation1.cc b/tests/Polyhedron/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..44b2b98
--- /dev/null
+++ b/tests/Polyhedron/limitedh79extrapolation1.cc
@@ -0,0 +1,274 @@
+/* Test Polyhedron::limited_H79_extrapolation_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y >= 0);
+ cs1.insert(x - y >= 0);
+
+ C_Polyhedron ph1(cs1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(x <= 2);
+ cs2.insert(y >= 0);
+ cs2.insert(x - y >= 0);
+
+ C_Polyhedron ph2(cs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron computed_result = ph2;
+ computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x - y >= 0);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(x <= 5);
+
+ print_constraints(computed_result,
+ "*** after limited_H79_extrapolation_assign ***");
+
+ return computed_result == known_result;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ cs1.insert(y == 0);
+
+ C_Polyhedron ph1(cs1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x <= 2);
+ cs2.insert(y >= 0);
+ cs2.insert(y <= x);
+
+ C_Polyhedron ph2(cs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ Constraint_System cs;
+ cs.insert(y <= -1);
+ cs.insert(x <= 5);
+
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron computed_result = ph2;
+ computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+ C_Polyhedron known_result = ph2;
+ known_result.add_generator(point(5*x));
+ known_result.add_generator(point(5*x + 5*y));
+
+ print_constraints(computed_result,
+ "*** after limited_H79_extrapolation_assign ***");
+
+ return computed_result == known_result;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 1);
+ C_Polyhedron ph1(cs1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ C_Polyhedron ph2(cs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron computed_result = ph1;
+ computed_result.limited_H79_extrapolation_assign(ph2, cs);
+
+ C_Polyhedron known_result(cs);
+
+ print_constraints(computed_result,
+ "*** after limited_H79_extrapolation_assign ***");
+
+ return computed_result == known_result;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(B >= 0);
+ ph2.add_constraint(A - B >= 0);
+ ph2.add_constraint(A <= 2);
+
+ Constraint_System cs;
+ cs.insert(B <= 4);
+
+ C_Polyhedron known_result(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2,
+ "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+ " ***");
+ return ok;
+}
+
+bool
+test05() {
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ C_Polyhedron ph2(2, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(B <= 4);
+
+ C_Polyhedron known_result(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2,
+ "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+ " ***");
+ return ok;
+}
+
+bool
+test06() {
+ C_Polyhedron ph1;
+
+ C_Polyhedron ph2;
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(2) <= 4);
+
+ C_Polyhedron known_result(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2,
+ "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+ " ***");
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 2);
+ ph1.add_constraint(A <= -2);
+ ph1.add_constraint(B == 0);
+ C_Polyhedron ph2(2);
+ ph1.add_constraint(A >= 2);
+
+ Constraint_System cs;
+ cs.insert(B <= 4);
+
+ C_Polyhedron known_result(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2,
+ "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+ " ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/linearexpression1.cc b/tests/Polyhedron/linearexpression1.cc
new file mode 100644
index 0000000..a934216
--- /dev/null
+++ b/tests/Polyhedron/linearexpression1.cc
@@ -0,0 +1,138 @@
+/* Testing Linear_Expression.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#define EQUIVALENT(le1, le2) (((le1) == 0) == ((le2) == 0))
+
+// Test operator-=(Linear_Expression& e1, const Linear_Expression& e2):
+// in this case the dimension of e2 is strictly greater than
+// the dimension of e1.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1 = A;
+ Linear_Expression e2 = B;
+ e1 -= e2;
+
+ Linear_Expression known_result = A - B;
+
+ bool ok = EQUIVALENT(e1, known_result);
+
+ nout << "*** known_result ***" << endl
+ << known_result << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(15);
+ Variable B(0);
+
+ Linear_Expression e1 = A;
+ Linear_Expression e2 = B;
+
+ Linear_Expression known_result1 = e1 + e2;
+
+ bool ok1 = EQUIVALENT(A + B, known_result1)
+ && EQUIVALENT(B + A, known_result1)
+ && EQUIVALENT(Linear_Expression(A) + B, known_result1)
+ && EQUIVALENT(B + Linear_Expression(A), known_result1)
+ && EQUIVALENT(A + Linear_Expression(B), known_result1)
+ && EQUIVALENT(Linear_Expression(B) + A, known_result1)
+ && EQUIVALENT(Linear_Expression(B) + Linear_Expression(A), known_result1);
+
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ Linear_Expression known_result2 = e1 + e1;
+
+ bool ok2 = EQUIVALENT(A + A, known_result2)
+ && EQUIVALENT(A + A, known_result2)
+ && EQUIVALENT(Linear_Expression(A) + A, known_result2)
+ && EQUIVALENT(A + Linear_Expression(A), known_result2)
+ && EQUIVALENT(A + Linear_Expression(A), known_result2)
+ && EQUIVALENT(Linear_Expression(A) + A, known_result2)
+ && EQUIVALENT(Linear_Expression(A) + Linear_Expression(A), known_result2);
+
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ return ok1 && ok2;
+}
+
+bool
+test03() {
+ Variable A(15);
+ Variable B(10);
+
+ Linear_Expression e1 = A;
+ Linear_Expression e2 = B;
+
+ Linear_Expression known_result1 = e1 - e2;
+
+ bool ok1 = EQUIVALENT(A - B, known_result1)
+ && EQUIVALENT(Linear_Expression(A) - B, known_result1)
+ && EQUIVALENT(A - Linear_Expression(B), known_result1)
+ && EQUIVALENT(Linear_Expression(A) - Linear_Expression(B), known_result1);
+
+ nout << "*** known_result1 ***" << endl
+ << known_result1 << endl;
+
+ Linear_Expression known_result2 = e2 - e1;
+
+ bool ok2 = EQUIVALENT(B - A, known_result2)
+ && EQUIVALENT(Linear_Expression(B) - A, known_result2)
+ && EQUIVALENT(B - Linear_Expression(A), known_result2)
+ && EQUIVALENT(Linear_Expression(B) - Linear_Expression(A), known_result2);
+
+ nout << "*** known_result2 ***" << endl
+ << known_result2 << endl;
+
+ Linear_Expression known_result3 = e1 - e1;
+
+ bool ok3 = EQUIVALENT(A - A, known_result3)
+ && EQUIVALENT(Linear_Expression(A) - A, known_result3)
+ && EQUIVALENT(A - Linear_Expression(A), known_result3)
+ && EQUIVALENT(Linear_Expression(A) - Linear_Expression(A), known_result3);
+
+ nout << "*** known_result3 ***" << endl
+ << known_result3 << endl;
+
+ return ok1 && ok2 && ok3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/linearpartition1.cc b/tests/Polyhedron/linearpartition1.cc
new file mode 100644
index 0000000..98b5e4d
--- /dev/null
+++ b/tests/Polyhedron/linearpartition1.cc
@@ -0,0 +1,332 @@
+/* Test linear_partition().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(const C_Polyhedron& p,
+ const C_Polyhedron& q,
+ const std::pair<C_Polyhedron,
+ Pointset_Powerset<NNC_Polyhedron> >& partition) {
+ const C_Polyhedron& r = partition.first;
+ // `r' must be a subset of or equal to `q'.
+ if (!q.contains(r))
+ return false;
+ const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+ NNC_Polyhedron the_union(r);
+ // These are the NNC versions of `p' and `q'.
+ NNC_Polyhedron nnc_p(p);
+ NNC_Polyhedron nnc_q(q);
+ typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->pointset();
+ // All elements of `s' must be disjoint from `p'.
+ if (!a.is_disjoint_from(nnc_p))
+ return false;
+ iter j = i;
+ for (++j; j != s_end; ++j) {
+ const NNC_Polyhedron& b = j->pointset();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.upper_bound_assign(a);
+ }
+ // The union of all the elements in `partition' must be exactly `q'.
+ return the_union == nnc_q;
+}
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2);
+ p.add_constraint(x == 0);
+ p.add_constraint(y >= 0);
+ p.add_constraint(y <= 2);
+
+ using namespace IO_Operators;
+ nout << "p = " << p << endl;
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= -1);
+ q.add_constraint(x <= 1);
+ q.add_constraint(y >= 1);
+ q.add_constraint(y <= 3);
+
+ nout << "q = " << q << endl;
+
+ std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+ result = linear_partition(p, q);
+
+ nout << "*** q partition ***" << endl;
+ nout << " +++ p inters q +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ if (!aux_test01(p, q, result))
+ return false;
+
+ result = linear_partition(q, p);
+
+ nout << "*** p partition ***" << endl;
+ nout << " +++ q inters p +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ return aux_test01(q, p, result);
+}
+
+bool
+aux_test02(const C_Polyhedron& p,
+ const C_Polyhedron& q,
+ const std::pair<C_Polyhedron,
+ Pointset_Powerset<NNC_Polyhedron> >& partition) {
+ const C_Polyhedron& r = partition.first;
+ // `r' must be a subset of or equal to `q'.
+ if (!q.contains(r))
+ return false;
+ const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+ NNC_Polyhedron the_union(r);
+ // These are the NNC versions of `p' and `q'.
+ NNC_Polyhedron nnc_p(p);
+ NNC_Polyhedron nnc_q(q);
+ typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->pointset();
+ // All elements of `s' must be disjoint from `p'.
+ if (!a.is_disjoint_from(nnc_p))
+ return false;
+ iter j = i;
+ for (++j; j != s_end; ++j) {
+ const NNC_Polyhedron& b = j->pointset();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.upper_bound_assign(a);
+ }
+ // The union of all the elements in `partition' must be exactly `q'.
+ return the_union == nnc_q;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2);
+ p.add_constraint(x == 5);
+ p.add_constraint(y >= 0);
+ p.add_constraint(y <= 2);
+
+ using namespace IO_Operators;
+ nout << "p = " << p << endl;
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= -1);
+ q.add_constraint(x <= 1);
+ q.add_constraint(y >= 1);
+ q.add_constraint(y <= 3);
+
+ nout << "q = " << q << endl;
+
+ std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+ result = linear_partition(p, q);
+
+ nout << "*** q partition ***" << endl;
+ nout << " +++ p inters q +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ if (!aux_test01(p, q, result))
+ return false;
+
+ result = linear_partition(q, p);
+
+ nout << "*** p partition ***" << endl;
+ nout << " +++ q inters p +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ return aux_test02(q, p, result);
+}
+
+bool
+aux_test03(const C_Polyhedron& p,
+ const C_Polyhedron& q,
+ const std::pair<C_Polyhedron,
+ Pointset_Powerset<NNC_Polyhedron> >& partition) {
+ const C_Polyhedron& r = partition.first;
+ // `r' must be a subset of or equal to `q'.
+ if (!q.contains(r))
+ return false;
+ const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+ NNC_Polyhedron the_union(r);
+ // These are the NNC versions of `p' and `q'.
+ NNC_Polyhedron nnc_p(p);
+ NNC_Polyhedron nnc_q(q);
+ typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->pointset();
+ // All elements of `s' must be disjoint from `p'.
+ if (!a.is_disjoint_from(nnc_p))
+ return false;
+ iter j = i;
+ for (++j; j != s_end; ++j) {
+ const NNC_Polyhedron& b = j->pointset();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.upper_bound_assign(a);
+ }
+ // The union of all the elements in `partition' must be exactly `q'.
+ return the_union == nnc_q;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2);
+ p.add_constraint(x >= -2);
+ p.add_constraint(x <= 2);
+ p.add_constraint(y >= 0);
+ p.add_constraint(y <= 4);
+
+ using namespace IO_Operators;
+ nout << "p = " << p << endl;
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= -1);
+ q.add_constraint(x <= 1);
+ q.add_constraint(y >= 1);
+ q.add_constraint(y <= 3);
+
+ nout << "q = " << q << endl;
+
+ std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+ result = linear_partition(p, q);
+
+ nout << "*** q partition ***" << endl;
+ nout << " +++ p inters q +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ if (!aux_test03(p, q, result))
+ return false;
+
+ result = linear_partition(q, p);
+
+ nout << "*** p partition ***" << endl;
+ nout << " +++ q inters p +++" << endl << " " << result.first << endl;
+ nout << " +++ rest +++" << endl << " " << result.second << endl;
+
+ return aux_test03(q, p, result);
+}
+
+// Compute the complement.
+template <typename PH>
+Pointset_Powerset<NNC_Polyhedron>
+aux_test04(const PH& ph) {
+ std::pair<PH, Pointset_Powerset<NNC_Polyhedron> > partition
+ = linear_partition(ph, PH(ph.space_dimension(), UNIVERSE));
+ return partition.second;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2, EMPTY);
+ p.add_generator(point(x));
+ p.add_generator(point(y));
+ p.add_generator(point(-x));
+ p.add_generator(point(-y));
+
+ using namespace IO_Operators;
+
+ nout << "p = " << p << endl;
+
+ Pointset_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
+
+ nout << "complement(p) = " << p_c << endl;
+
+ Pointset_Powerset<NNC_Polyhedron> p_p(p.space_dimension(), EMPTY);
+ p_p.add_disjunct(NNC_Polyhedron(p));
+ p_p.intersection_assign(p_c);
+
+ nout << "p intersected with complement(p) = " << p_p << endl;
+
+ if (!p_p.empty())
+ return false;
+
+ p_c.add_disjunct(NNC_Polyhedron(p));
+ p_c.pairwise_reduce();
+
+ nout << "p added to complement(p), pairwise reduced = " << p_c << endl;
+
+ if (!p_c.is_top())
+ return false;
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= -1);
+ q.add_constraint(x <= 1);
+ q.add_constraint(y >= 1);
+ q.add_constraint(y <= 3);
+
+ nout << "q = " << q << endl;
+
+ Pointset_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
+
+ nout << "complement(q) = " << q_c << endl;
+
+ Pointset_Powerset<NNC_Polyhedron> q_p(q.space_dimension(), EMPTY);
+ q_p.add_disjunct(NNC_Polyhedron(q));
+ q_p.intersection_assign(q_c);
+
+ nout << "q intersected with complement(q) = " << q_p << endl;
+
+ if (!q_p.empty())
+ return false;
+
+ q_c.add_disjunct(NNC_Polyhedron(q));
+ q_c.pairwise_reduce();
+
+ nout << "q added to complement(q), pairwise reduced = " << q_c << endl;
+
+ if (!q_c.is_top())
+ return false;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/linearsystem1.cc b/tests/Polyhedron/linearsystem1.cc
new file mode 100644
index 0000000..6e1ca90
--- /dev/null
+++ b/tests/Polyhedron/linearsystem1.cc
@@ -0,0 +1,109 @@
+/* Test some functionality of class Linear_System.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+namespace {
+
+bool
+test01() {
+ const char* data_file = "linearsystem1.dat";
+
+ Variable A(0);
+ Variable B(1);
+
+#if 0
+ // Using this seed and the checked 8-bit integer coefficients,
+ // the random number generator produces the minimum value during
+ // the following computations.
+ unsigned long problematic_seed = 1141853716;
+ Random_Number_Generator rng(problematic_seed);
+#else
+ Random_Number_Generator rng;
+#endif
+
+#define ROWS 7
+#define COLS 3
+
+ Linear_System<Constraint> ls1(NOT_NECESSARILY_CLOSED, DENSE);
+ for (dimension_type rowi = 0; rowi < ROWS; ++rowi) {
+ Linear_Expression e;
+ e.set_space_dimension(COLS - 1);
+ for (dimension_type col = 0; col < COLS; ++col) {
+ Coefficient c;
+ rng.get(c, 0);
+ // The following workaround is to avoid trivial positive overflows
+ // when using bounded coefficients.
+ if (std::numeric_limits<Coefficient>::is_bounded
+ && c == std::numeric_limits<Coefficient>::min())
+ // Here the randomly generated coefficients is equal to the
+ // allowed minimum value for a signed integer data type that
+ // might adopt the 2's complement representation
+ // (e.g., -128 for 8 bit signed integers).
+ // Thus, it would cause a positive overflow during the normalization
+ // of the Linear_Row, because the GCD computation will try to negate
+ // such a coefficient.
+ // To avoid the problem, we simply increment the coefficient.
+ ++c;
+
+ if (col == 0)
+ e += c;
+ else
+ add_mul_assign(e, c, Variable(col - 1));
+ }
+
+ ls1.insert(e > 0);
+
+ using std::fstream;
+ using std::ios_base;
+ fstream f;
+ open(f, data_file, ios_base::out);
+ ls1.ascii_dump(f);
+ close(f);
+
+ open(f, data_file, ios_base::in);
+ Linear_System<Constraint> ls2(NECESSARILY_CLOSED, DENSE);
+ ls2.ascii_load(f);
+ close(f);
+
+ if (ls1 == ls2)
+ continue;
+
+ nout << "Linear_System<Constraint>::ascii_dump/load test failed." << endl
+ << "m1.ascii_dump() gives" << endl;
+ ls1.ascii_dump(nout);
+ nout << "m2.ascii_dump() gives" << endl;
+ ls2.ascii_dump(nout);
+
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc
new file mode 100644
index 0000000..4d9ddea
--- /dev/null
+++ b/tests/Polyhedron/mapspacedims1.cc
@@ -0,0 +1,482 @@
+/* Test Polyhedron::map_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Partial_Function function;
+
+ C_Polyhedron ph1(3);
+
+ print_function(function, "*** function ***");
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result;
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Partial_Function function;
+
+ C_Polyhedron ph1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(2, 0);
+ function.insert(1, 1);
+
+ Generator_System gs;
+ gs.insert(point(2*C));
+ gs.insert(line(A + B));
+ gs.insert(ray(A + C));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ Generator_System known_gs;
+ known_gs.insert(point(2*A));
+ known_gs.insert(line(C + B));
+ known_gs.insert(ray(C + A));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(2, 0);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A + B));
+ gs.insert(ray(A - C));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ Generator_System known_gs;
+ known_gs.insert(point());
+ known_gs.insert(ray(B));
+ known_gs.insert(ray(B - A));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(2, 0);
+ function.insert(3, 2);
+ function.insert(4, 1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(B));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point());
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(1, 1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(point(B));
+ gs.insert(point(A + B));
+
+ C_Polyhedron ph1(gs);
+ C_Polyhedron known_result(ph1);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+ function.insert(2, 2);
+ function.insert(3, 3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(point(2*B));
+ gs.insert(point(A + 2*B));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(4, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(B));
+ known_result.add_generator(point(2*A));
+ known_result.add_generator(point(2*A + B));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Partial_Function function;
+ function.insert(0, 0);
+ function.insert(2, 1);
+ function.insert(3, 2);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(ray(B));
+ gs.insert(ray(A + B));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(3, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(ray(A));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ C_Polyhedron ph1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Partial_Function rotate_right;
+ rotate_right.insert(0, 1);
+ rotate_right.insert(1, 2);
+ rotate_right.insert(2, 0);
+
+ Partial_Function rotate_left;
+ rotate_left.insert(0, 2);
+ rotate_left.insert(1, 0);
+ rotate_left.insert(2, 1);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(-4*x - 2*y + z >= -8);
+ ph.add_constraint(-4*x + 2*y + z >= 4);
+ ph.add_constraint(-2*x - y + 2*z >= -1);
+ ph.add_constraint(-2*x + y + 2*z >= 5);
+ ph.add_constraint(-x - y - 2*z >= -13);
+ ph.add_constraint(-x - z >= -5);
+ ph.add_constraint(-x >= -1);
+ ph.add_constraint(-x + y - 2*z >= -7);
+ ph.add_constraint(-y >= -4);
+ ph.add_constraint(y >= 2);
+ ph.add_constraint(x >= 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_function(rotate_right, "*** rotate_right ***");
+ print_function(rotate_left, "*** rotate_left ***");
+
+ C_Polyhedron rs[4];
+ rs[0] = ph;
+
+ print_constraints(rs[0], "*** rs[0] ***");
+
+ for (int i = 1; i <= 3; ++i) {
+ rs[i] = rs[i-1];
+ rs[i].map_space_dimensions(rotate_right);
+
+ print_constraints(rs[i], "*** rs[i] ***");
+
+ }
+
+ C_Polyhedron ls[4];
+ ls[3] = ph;
+
+ print_constraints(ls[3], "*** ls[3] ***");
+
+ for (int i = 2; i >= 0; --i) {
+ ls[i] = ls[i+1];
+ // Force generators to be up-to-date, for a change.
+ (void) ls[i].generators();
+ ls[i].map_space_dimensions(rotate_left);
+
+ print_constraints(ls[i], "*** ls[i] ***");
+
+ }
+
+ for (int i = 0; i <= 3; ++i)
+ if (rs[i] != ls[i]) {
+ nout << "rs[" << i << "] != ls[" << i << "]" << endl;
+ return false;
+ }
+
+ return true;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(B >= 1);
+ ph.add_constraint(C >= 0);
+
+ Partial_Function rotate_right;
+ rotate_right.insert(0, 1);
+ rotate_right.insert(1, 2);
+ rotate_right.insert(2, 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_function(rotate_right, "*** rotate_right ***");
+
+ ph.map_space_dimensions(rotate_right);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 2);
+ known_result.add_constraint(C >= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(-A + B == 0);
+
+ Partial_Function rotate_right;
+ rotate_right.insert(0, 1);
+ rotate_right.insert(1, 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_function(rotate_right, "*** rotate_right ***");
+
+ ph.map_space_dimensions(rotate_right);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(1, 3);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A));
+ gs.insert(point(2*B));
+ gs.insert(point(A + 2*B));
+
+ C_Polyhedron ph1(gs);
+
+ print_function(function, "*** function ***");
+ print_generators(ph1, "*** ph1 ***");
+
+ ph1.map_space_dimensions(function);
+
+ C_Polyhedron known_result(4, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(C));
+ known_result.add_generator(point(2*D));
+ known_result.add_generator(point(C + 2*D));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ // test10() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+ DO_TEST(test10);
+#else
+ DO_TEST_F8(test10);
+#endif // !defined(DERIVED_TEST)
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/matrix1.cc b/tests/Polyhedron/matrix1.cc
new file mode 100644
index 0000000..823bf59
--- /dev/null
+++ b/tests/Polyhedron/matrix1.cc
@@ -0,0 +1,322 @@
+/* Test some functionality of class Matrix.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+
+#include <fstream>
+#include <vector>
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Random_Number_Generator r;
+ const char* data_file = "densematrix1.dat";
+
+ for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows)
+ for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) {
+ Matrix<Dense_Row> m1(num_rows, num_cols);
+ for (dimension_type row = 0; row < num_rows; ++row)
+ for (dimension_type col = 0; col < num_cols; ++col)
+ r.get(m1[row][col], 0);
+
+ std::fstream f;
+ open(f, data_file, std::ios_base::out);
+ m1.ascii_dump(f);
+ close(f);
+
+ open(f, data_file, std::ios_base::in);
+ Matrix<Dense_Row> m2;
+ m2.ascii_load(f);
+ close(f);
+
+ if (m1 != m2) {
+
+ nout << "Matrix<Dense_Row>::ascii_dump/load test failed." << endl
+ << "m1.ascii_dump() gives" << endl;
+ m1.ascii_dump(nout);
+ nout << "m2.ascii_dump() gives" << endl;
+ m2.ascii_dump(nout);
+
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+test02() {
+
+ Matrix<Sparse_Row> matrix(3, 4);
+
+ if (matrix.num_rows() != 3)
+ return false;
+
+ if (matrix.num_columns() != 4)
+ return false;
+
+ matrix.resize(5);
+
+ if (matrix.num_rows() != 5)
+ return false;
+
+ if (matrix.num_columns() != 5)
+ return false;
+
+ matrix.add_zero_rows_and_columns(2, 3);
+
+ if (matrix.num_rows() != 7)
+ return false;
+
+ if (matrix.num_columns() != 8)
+ return false;
+
+ return true;
+}
+
+bool
+test03() {
+
+ Matrix<Sparse_Row> matrix(3, 6);
+
+ // ( 0 1 2 3 4 0 )
+ // ( 0 6 7 8 9 10 )
+ // ( 0 11 12 13 14 15 )
+
+ matrix[0][0] = 0;
+ matrix[0][1] = 1;
+ matrix[0][2] = 2;
+ matrix[0][3] = 3;
+ matrix[0][4] = 4;
+ matrix[0][5] = 0;
+ matrix[1][0] = 0;
+ matrix[1][1] = 6;
+ matrix[1][2] = 7;
+ matrix[1][3] = 8;
+ matrix[1][4] = 9;
+ matrix[1][5] = 10;
+ matrix[2][0] = 0;
+ matrix[2][1] = 11;
+ matrix[2][2] = 12;
+ matrix[2][3] = 13;
+ matrix[2][4] = 14;
+ matrix[2][5] = 15;
+
+ std::vector<dimension_type> cycles;
+
+ // Swap the second and the fourth column
+ cycles.push_back(1);
+ cycles.push_back(3);
+ cycles.push_back(0);
+
+ // Cycle the third, fifth and sixth column
+ cycles.push_back(2);
+ cycles.push_back(4);
+ cycles.push_back(5);
+ cycles.push_back(0);
+
+ matrix.permute_columns(cycles);
+
+
+ // Expected result:
+ //
+ // ( 0 3 0 1 2 4 )
+ // ( 0 8 10 6 7 9 )
+ // ( 0 13 15 11 12 14 )
+
+ if (matrix[0][0] != 0) return false;
+ if (matrix[0][1] != 3) return false;
+ if (matrix[0][2] != 0) return false;
+ if (matrix[0][3] != 1) return false;
+ if (matrix[0][4] != 2) return false;
+ if (matrix[0][5] != 4) return false;
+ if (matrix[1][0] != 0) return false;
+ if (matrix[1][1] != 8) return false;
+ if (matrix[1][2] != 10) return false;
+ if (matrix[1][3] != 6) return false;
+ if (matrix[1][4] != 7) return false;
+ if (matrix[1][5] != 9) return false;
+ if (matrix[2][0] != 0) return false;
+ if (matrix[2][1] != 13) return false;
+ if (matrix[2][2] != 15) return false;
+ if (matrix[2][3] != 11) return false;
+ if (matrix[2][4] != 12) return false;
+ if (matrix[2][5] != 14) return false;
+
+ return true;
+}
+
+bool
+test04() {
+ Matrix<Sparse_Row> large(2,5);
+ Matrix<Sparse_Row> tall(6,3);
+
+ large[0][4] = 10;
+ tall[4][0] = 20;
+
+ using std::swap;
+ swap(large, tall);
+
+ if (large.num_columns() != 3)
+ return false;
+
+ if (large.num_rows() != 6)
+ return false;
+
+ if (tall.num_columns() != 5)
+ return false;
+
+ if (tall.num_rows() != 2)
+ return false;
+
+ if (tall[0][4] != 10)
+ return false;
+
+ if (large[4][0] != 20)
+ return false;
+
+ return true;
+}
+
+bool
+test05() {
+
+ Matrix<Sparse_Row> x(2, 3);
+
+ // ( 1 2 3 )
+ // ( 4 5 6 )
+
+ x[0][0] = 1;
+ x[0][1] = 2;
+ x[0][2] = 3;
+ x[1][0] = 4;
+ x[1][1] = 5;
+ x[1][2] = 6;
+
+ Matrix<Sparse_Row>::iterator itr = x.begin();
+
+ // First row
+
+ if (itr == x.end())
+ return false;
+
+ if ((*itr)[0] != 1)
+ return false;
+ if ((*itr)[1] != 2)
+ return false;
+ if ((*itr)[2] != 3)
+ return false;
+
+ ++itr;
+
+ // Second row
+
+ if (itr == x.end())
+ return false;
+
+ if ((*itr)[0] != 4)
+ return false;
+ if ((*itr)[1] != 5)
+ return false;
+ if ((*itr)[2] != 6)
+ return false;
+
+ ++itr;
+
+ if (itr != x.end())
+ return false;
+
+ return true;
+}
+
+bool
+test06() {
+
+ Matrix<Sparse_Row> matrix(3, 5);
+
+ // ( 1 2 3 4 5 )
+ // ( 6 7 8 9 10 )
+ // ( 11 12 13 14 15 )
+
+ matrix[0][0] = 1;
+ matrix[0][1] = 2;
+ matrix[0][2] = 3;
+ matrix[0][3] = 4;
+ matrix[0][4] = 5;
+ matrix[1][0] = 6;
+ matrix[1][1] = 7;
+ matrix[1][2] = 8;
+ matrix[1][3] = 9;
+ matrix[1][4] = 10;
+ matrix[2][0] = 11;
+ matrix[2][1] = 12;
+ matrix[2][2] = 13;
+ matrix[2][3] = 14;
+ matrix[2][4] = 15;
+
+ matrix.add_row(matrix[1]);
+
+ // ( 1 2 3 4 5 )
+ // ( 6 7 8 9 10 )
+ // ( 11 12 13 14 15 )
+ // ( 6 7 8 9 10 )
+
+ if (matrix[0][0] != 1) return false;
+ if (matrix[0][1] != 2) return false;
+ if (matrix[0][2] != 3) return false;
+ if (matrix[0][3] != 4) return false;
+ if (matrix[0][4] != 5) return false;
+ if (matrix[1][0] != 6) return false;
+ if (matrix[1][1] != 7) return false;
+ if (matrix[1][2] != 8) return false;
+ if (matrix[1][3] != 9) return false;
+ if (matrix[1][4] != 10) return false;
+ if (matrix[2][0] != 11) return false;
+ if (matrix[2][1] != 12) return false;
+ if (matrix[2][2] != 13) return false;
+ if (matrix[2][3] != 14) return false;
+ if (matrix[2][4] != 15) return false;
+ if (matrix[3][0] != 6) return false;
+ if (matrix[3][1] != 7) return false;
+ if (matrix[3][2] != 8) return false;
+ if (matrix[3][3] != 9) return false;
+ if (matrix[3][4] != 10) return false;
+
+ return true;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc
new file mode 100644
index 0000000..572d3ce
--- /dev/null
+++ b/tests/Polyhedron/max_min1.cc
@@ -0,0 +1,205 @@
+/* Test Polyhedron::maximize(const Linear_Expression&, ...)
+ and Polyhedron::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(-2*x1-x2 >= -5);
+ ph.add_constraint(4*x1-4*x2 >= -5);
+ ph.add_constraint(x1 >= 0);
+ ph.add_constraint(x2 >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = ph.maximize(x1-2*x2, num, den, included, g)
+ && num == 5 && den == 2 && included
+ && g.is_point()
+ && g.coefficient(x1) == 5 && g.coefficient(x2) == 0
+ && g.divisor() == 2;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = ph.minimize(x1-2*x2, num, den, included, g)
+ && num == -15 && den == 4 && included
+ && g.is_point()
+ && g.coefficient(x1) == 5 && g.coefficient(x2) == 10
+ && g.divisor() == 4;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(-x1-x2-x3 >= -100);
+ ph.add_constraint(-10*x1-4*x2-5*x3 >= -600);
+ ph.add_constraint(-x1-x2-3*x3 >= -150);
+ ph.add_constraint(x1 >= 0);
+ ph.add_constraint(x2 >= 0);
+ ph.add_constraint(x3 >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ bool ok = ph.maximize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+ && num == 4 && den == 1 && included
+ && g.is_point()
+ && g.coefficient(x1) == 0
+ && g.coefficient(x2) == 0
+ && g.coefficient(x3) == 0
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = ph.minimize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+ && num == -2188 && den == 3 && included
+ && g.is_point()
+ && g.coefficient(x1) == 100
+ && g.coefficient(x2) == 200
+ && g.coefficient(x3) == 0
+ && g.divisor() == 3;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph(0);
+
+ print_constraints(ph, "*** ph ***");
+
+ Coefficient num;
+ Coefficient den;
+ bool included;
+ Generator g(point());
+ Linear_Expression LE;
+ bool ok = ph.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ ok = ph.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "infimum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Linear_Expression LE;
+ bool ok = !ph.maximize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+ ok = ok && !ph.minimize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc
new file mode 100644
index 0000000..3842a8b
--- /dev/null
+++ b/tests/Polyhedron/maxspacedim1.cc
@@ -0,0 +1,137 @@
+/* Test the *::max_space_dimension() methods.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define test01_DO_CLASS(T) \
+ nout << #T "::max_space_dimension() = " \
+ << T::max_space_dimension() << endl; \
+ if (T::max_space_dimension() < max_space_dimension()) \
+ return false
+
+#if PPL_SUPPORTED_FLOAT
+#define test01_DO_WRD_FLOAT(WRD) test01_DO_CLASS(WRD<float>)
+#else
+#define test01_DO_WRD_FLOAT(WRD)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+#define test01_DO_WRD_DOUBLE(WRD) test01_DO_CLASS(WRD<double>)
+#else
+#define test01_DO_WRD_DOUBLE(WRD)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+#define test01_DO_WRD_LONG_DOUBLE(WRD) test01_DO_CLASS(WRD<long double>)
+#else
+#define test01_DO_WRD_LONG_DOUBLE(WRD)
+#endif
+
+#define test01_DO_WRD(WRD) \
+ test01_DO_CLASS(WRD<int8_t>); \
+ test01_DO_CLASS(WRD<int16_t>); \
+ test01_DO_CLASS(WRD<int32_t>); \
+ test01_DO_CLASS(WRD<int64_t>); \
+ test01_DO_CLASS(WRD<mpz_class>); \
+ test01_DO_CLASS(WRD<mpq_class>); \
+ test01_DO_WRD_FLOAT(WRD); \
+ test01_DO_WRD_DOUBLE(WRD); \
+ test01_DO_WRD_LONG_DOUBLE(WRD)
+
+#define test01_DO_CONSTR_CLASS(CONSTR, T) \
+ nout << #CONSTR "<" #T ">::max_space_dimension() = " \
+ << CONSTR<T>::max_space_dimension() << endl; \
+ if (CONSTR<T>::max_space_dimension() < max_space_dimension()) \
+ return false
+
+#if PPL_SUPPORTED_FLOAT
+#define test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD) \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<float>)
+#else
+#define test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+#define test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD) \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<double>)
+#else
+#define test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+#define test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD) \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<long double>)
+#else
+#define test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD)
+#endif
+
+#define test01_DO_CONSTR_WRD(CONSTR, WRD) \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<int8_t>); \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<int16_t>); \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<int32_t>); \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<int64_t>); \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<mpz_class>); \
+ test01_DO_CONSTR_CLASS(CONSTR, WRD<mpq_class>); \
+ test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD); \
+ test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD); \
+ test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD)
+
+bool
+test01() {
+ test01_DO_CLASS(Variable);
+ test01_DO_CLASS(Variables_Set);
+ test01_DO_CLASS(Linear_Expression);
+ test01_DO_CLASS(Constraint);
+ test01_DO_CLASS(Congruence);
+ test01_DO_CLASS(Generator);
+ test01_DO_CLASS(Grid_Generator);
+ test01_DO_CLASS(Constraint_System);
+ test01_DO_CLASS(Congruence_System);
+ test01_DO_CLASS(Generator_System);
+ test01_DO_CLASS(Grid_Generator_System);
+ test01_DO_CLASS(C_Polyhedron);
+ test01_DO_CLASS(NNC_Polyhedron);
+ test01_DO_CLASS(Grid);
+ // FIXME: what about all other boxes?
+ test01_DO_CLASS(Rational_Box);
+ test01_DO_WRD(BD_Shape);
+ test01_DO_WRD(Octagonal_Shape);
+ test01_DO_CONSTR_CLASS(Pointset_Powerset, C_Polyhedron);
+ test01_DO_CONSTR_CLASS(Pointset_Powerset, NNC_Polyhedron);
+ test01_DO_CONSTR_CLASS(Pointset_Powerset, Grid);
+ test01_DO_CONSTR_WRD(Pointset_Powerset, BD_Shape);
+ test01_DO_CONSTR_WRD(Pointset_Powerset, Octagonal_Shape);
+ //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, C_Polyhedron);
+ //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, NNC_Polyhedron);
+ //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, Grid);
+ //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, BD_Shape);
+ //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, Octagonal_Shape);
+
+ nout << "Parma_Polyhedra_Library::max_space_dimension() = "
+ << max_space_dimension() << endl;
+
+ // 9458 is the value of max_space_dimension()
+ // computed on a 32bit architecture.
+ return max_space_dimension() >= 9458;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Polyhedron/mc91.cc b/tests/Polyhedron/mc91.cc
new file mode 100644
index 0000000..ecb7e95
--- /dev/null
+++ b/tests/Polyhedron/mc91.cc
@@ -0,0 +1,118 @@
+/* Test the Pointset_Powerset construction with McCarthy's 91 function.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ typedef Pointset_Powerset<C_Polyhedron> PCS;
+
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ // This is the base case:
+ // mc91(A, B) :- A >= 101, B = A-10.
+ C_Polyhedron base_ph(2);
+ base_ph.add_constraint(A >= 101);
+ base_ph.add_constraint(B == A-10);
+ PCS base(2, EMPTY);
+ base.add_disjunct(base_ph);
+
+ print_constraints(base, "*** base ***");
+
+ // This is the inductive case:
+ // mc91(A, B) :- A =< 100, C = A+11, E = D, F = B, mc91(C, D), mc91(E, F).
+ C_Polyhedron inductive_ph(6);
+ inductive_ph.add_constraint(A <= 100);
+ inductive_ph.add_constraint(C == A+11);
+ inductive_ph.add_constraint(E == D);
+ inductive_ph.add_constraint(F == B);
+ PCS inductive(6, EMPTY);
+ inductive.add_disjunct(inductive_ph);
+
+ print_constraints(inductive, "*** inductive ***");
+
+ // Initialize the fixpoint iteration.
+ PCS current = base;
+
+ print_constraints(current, "*** start ***");
+
+ // Contains the description computed at the previous iteration.
+ PCS previous;
+ do {
+ previous = current;
+ current = inductive;
+ Pointset_Powerset<C_Polyhedron> b1(2);
+ b1.concatenate_assign(previous);
+ b1.add_space_dimensions_and_embed(2);
+ current.intersection_assign(b1);
+ Pointset_Powerset<C_Polyhedron> b2(4);
+ b2.concatenate_assign(previous);
+ current.intersection_assign(b2);
+
+ print_constraints(current, "*** after body solving ***");
+
+ Variables_Set dimensions_to_remove;
+ // Deliberately inserted out of order (!).
+ dimensions_to_remove.insert(D);
+ dimensions_to_remove.insert(C);
+ dimensions_to_remove.insert(F);
+ dimensions_to_remove.insert(E);
+ current.remove_space_dimensions(dimensions_to_remove);
+
+ print_constraints(current, "*** after remove_space_dimensions ***");
+
+ current.least_upper_bound_assign(previous);
+
+ current.BHZ03_widening_assign<BHRZ03_Certificate>
+ (previous, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+ print_constraints(current, "*** after lub+widening ***");
+
+ } while (current != previous);
+
+ C_Polyhedron expected_ph(2);
+ expected_ph.add_constraint(A - B <= 10);
+ expected_ph.add_constraint(B >= 91);
+ Pointset_Powerset<C_Polyhedron> expected(2, EMPTY);
+ expected.add_disjunct(expected_ph);
+
+ bool ok = (expected == current);
+
+ print_constraints(expected, "*** expected ***");
+ print_constraints(current, "*** final result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/membytes1.cc b/tests/Polyhedron/membytes1.cc
new file mode 100644
index 0000000..5cdcd7b
--- /dev/null
+++ b/tests/Polyhedron/membytes1.cc
@@ -0,0 +1,292 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(C_Polyhedron& ph, const Constraint& c) {
+ const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+ const memory_size_type c_memory = c.total_memory_in_bytes();
+ ph.add_constraint(c);
+ const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+ nout << ph_memory_before
+ << " + " << c_memory
+ << " -> " << ph_memory_after
+ << endl;
+}
+
+void
+add_generator(C_Polyhedron& ph, const Generator& g) {
+ const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+ const memory_size_type g_memory = g.total_memory_in_bytes();
+ ph.add_generator(g);
+ const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+ nout << ph_memory_before
+ << " + " << g_memory
+ << " -> " << ph_memory_after
+ << endl;
+}
+
+void
+minimize(C_Polyhedron& ph) {
+ const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+ (void) ph.minimized_generators();
+ const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+ nout << ph_memory_before
+ << " -m-> " << ph_memory_after
+ << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+ using namespace test01_namespace;
+
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ const memory_size_type x_total_size = x.total_memory_in_bytes();
+ const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+ nout << "*** Size of variables ***"
+ << endl
+ << "x.total_memory_in_bytes() = " << x_total_size
+ << endl
+ << "x.external_memory_in_bytes() = " << x_external_size
+ << endl << endl;
+ nout << "*** Size of linear expressions ***"
+ << endl;
+
+ Linear_Expression le(0);
+ memory_size_type le_total_size = le.total_memory_in_bytes();
+ memory_size_type le_external_size = le.external_memory_in_bytes();
+
+ using namespace IO_Operators;
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += x;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += 2*y;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl;
+
+ le += 4*z;
+ le_total_size = le.total_memory_in_bytes();
+ le_external_size = le.external_memory_in_bytes();
+
+ nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+ << endl
+ << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+ << endl << endl;
+
+ nout << "*** Adding constraints to a polyhedron ***" << endl;
+
+ C_Polyhedron ph(3);
+ add_constraint(ph, 4*x - 2*y - z + 14 >= 0);
+ add_constraint(ph, 4*x + 2*y - z + 2 >= 0);
+ add_constraint(ph, x + y - 1 >= 0);
+ add_constraint(ph, x + y + 2*z - 5 >= 0);
+ minimize(ph);
+ add_constraint(ph, x + 1 >= 0);
+ add_constraint(ph, x + z - 1 >= 0);
+ add_constraint(ph, 2*x + y -2*z + 7 >= 0);
+ add_constraint(ph, x - y + 2*z + 1 >= 0);
+ minimize(ph);
+ add_constraint(ph, x - y + 5 >= 0);
+ add_constraint(ph, 2*x - y - 2*z + 13 >= 0);
+ add_constraint(ph, -2*x - y + 2*z + 1 >= 0);
+ add_constraint(ph, -x + y - 1 >= 0);
+ minimize(ph);
+ add_constraint(ph, -x + y -2*z + 7 >= 0);
+ add_constraint(ph, -4*x + 2*y + z - 4 >= 0);
+ add_constraint(ph, -2*x + y + 2*z - 5 >= 0);
+ add_constraint(ph, -x + 1 >= 0);
+ minimize(ph);
+ add_constraint(ph, -x - z + 5 >= 0);
+ add_constraint(ph, -4*x - 2*y + z + 8 >= 0);
+ add_constraint(ph, -x - y + 5 >= 0);
+ add_constraint(ph, -x - y -2*z +13 >= 0);
+ minimize(ph);
+
+ const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+ const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+ const Constraint_System& cs = ph.constraints();
+ const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+ const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+ const Generator_System& gs = ph.generators();
+ const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+ const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+ nout << endl;
+
+ nout << "*** Size of the user-visible polyhedra components ***"
+ << endl
+ << "ph.total_memory_in_bytes() = " << ph_total_size
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl
+ << "gs.total_memory_in_bytes() = " << gs_total_size
+ << endl
+ << "ph.external_memory_in_bytes() = " << ph_external_size
+ << endl
+ << "cs.external_memory_in_bytes() = " << cs_external_size
+ << endl
+ << "gs.external_memory_in_bytes() = " << gs_external_size
+ << endl << endl;
+ nout << "*** Adding generators to a polyhedron ***" << endl;
+
+ C_Polyhedron qh(3, EMPTY);
+ unsigned n = 0;
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ add_generator(qh, *i);
+ if (++n % 4 == 0)
+ minimize(qh);
+ }
+
+ nout << endl;
+
+ nout << "*** Size of a constraint system vs size of contained constraints"
+ << endl
+ << "cs.total_memory_in_bytes() = " << cs_total_size
+ << endl;
+
+ memory_size_type cs_elements_size = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ cs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained constraints = " << cs_elements_size
+ << endl << endl;
+
+ nout << "*** Size of a generator system vs size of contained generators"
+ << endl
+ << "gs.total_memory_in_bytes() = " << gs_total_size
+ << endl;
+
+ memory_size_type gs_elements_size = 0;
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ gs_elements_size += i->total_memory_in_bytes();
+
+ nout << "Sum of sizes of contained generators = " << gs_elements_size
+ << endl << endl;
+
+ return true;
+}
+
+bool test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(4*x - 2*y - z + 14 >= 0);
+ ph.add_constraint(4*x + 2*y - z + 2 >= 0);
+ ph.add_constraint(x + y - 1 >= 0);
+ ph.add_constraint(x + y + 2*z - 5 >= 0);
+
+ const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+ const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+
+ Determinate<C_Polyhedron> dph(ph);
+
+ const memory_size_type dph_total_size = dph.total_memory_in_bytes();
+ const memory_size_type dph_external_size = dph.external_memory_in_bytes();
+
+ nout << "ph.total_memory_in_bytes() = " << ph_total_size
+ << endl
+ << "ph.external_memory_in_bytes() = " << ph_external_size
+ << endl
+ << "dph.total_memory_in_bytes() = " << dph_total_size
+ << endl
+ << "dph.external_memory_in_bytes() = " << dph_external_size
+ << endl;
+
+ Pointset_Powerset<C_Polyhedron> pph(ph);
+
+ C_Polyhedron qh(3);
+ qh.add_constraint(x >= 0);
+ qh.add_constraint(y >= 0);
+ qh.add_constraint(z >= 0);
+ qh.add_constraint(x <= 1);
+ qh.add_constraint(y <= 1);
+ qh.add_constraint(z <= 1);
+ Pointset_Powerset<C_Polyhedron> pqh(qh);
+
+ Pointset_Powerset<C_Polyhedron> prh = pqh;
+ prh.difference_assign(pph);
+
+ const memory_size_type pph_total_size = pph.total_memory_in_bytes();
+ const memory_size_type pph_external_size = pph.external_memory_in_bytes();
+ const memory_size_type pqh_total_size = pqh.total_memory_in_bytes();
+ const memory_size_type pqh_external_size = pqh.external_memory_in_bytes();
+ const memory_size_type prh_total_size = prh.total_memory_in_bytes();
+ const memory_size_type prh_external_size = prh.external_memory_in_bytes();
+
+ nout << "pph.total_memory_in_bytes() = " << pph_total_size
+ << endl
+ << "pph.external_memory_in_bytes() = " << pph_external_size
+ << endl
+ << "pqh.total_memory_in_bytes() = " << pqh_total_size
+ << endl
+ << "pqh.external_memory_in_bytes() = " << pqh_external_size
+ << endl
+ << "prh.total_memory_in_bytes() = " << prh_total_size
+ << endl
+ << "prh.external_memory_in_bytes() = " << prh_external_size
+ << endl;
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F8A(test02);
+END_MAIN
diff --git a/tests/Polyhedron/memory1.cc b/tests/Polyhedron/memory1.cc
new file mode 100644
index 0000000..c8f1e72
--- /dev/null
+++ b/tests/Polyhedron/memory1.cc
@@ -0,0 +1,220 @@
+/* Test the allocation error recovery facility of the library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+// Note: we cannot know, at this stage whether
+// PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK evaluates to true.
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl_test.hh"
+#include <new>
+#include <cstring>
+#include <cerrno>
+#include <cstdlib>
+
+#ifdef PPL_HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+#ifdef PPL_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+// If GMP does not support exceptions, or if we are unable to limit
+// the memory available to processes using setrlimit(), the test is
+// pointless.
+//
+// On the Itanium the test fails because of the bug reported in
+// http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012943.html
+//
+// On s390x-linux the test fails, we do not know why (and without access
+// to such a machine there is little we can do).
+// See http://www.cs.unipr.it/pipermail/ppl-devel/2009-April/014489.html
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS || !PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+ || defined(__ia64) || defined(__s390x__)
+
+int
+main() TRY {
+ return 0;
+}
+CATCH
+
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+ NNC_Polyhedron hypercube(dimension);
+ for (dimension_type i = 0; i < dimension; ++i) {
+ Variable x(i);
+ hypercube.add_constraint(x > 0);
+ hypercube.add_constraint(x < 1);
+ }
+ (void) hypercube.generators();
+}
+
+#define LIMIT(WHAT) \
+ do { \
+ if (getrlimit(WHAT, &t) != 0) { \
+ std::cerr << "getrlimit failed: " << strerror(errno) << endl; \
+ exit(1); \
+ } \
+ t.rlim_cur = bytes; \
+ if (setrlimit(WHAT, &t) != 0) { \
+ std::cerr << "setrlimit failed: " << strerror(errno) << endl; \
+ exit(1); \
+ } \
+ } while (0)
+
+void
+limit_memory(unsigned long bytes) {
+ struct rlimit t;
+#if PPL_HAVE_DECL_RLIMIT_DATA
+ // Limit heap size.
+ LIMIT(RLIMIT_DATA);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_RSS
+ // Limit resident set size.
+ LIMIT(RLIMIT_RSS);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_VMEM
+ // Limit mapped memory (brk + mmap).
+ LIMIT(RLIMIT_VMEM);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_AS
+ // Limit virtual memory.
+ LIMIT(RLIMIT_AS);
+#endif
+}
+
+bool
+guarded_compute_open_hypercube_generators(dimension_type dimension,
+ unsigned long max_memory_in_bytes) {
+ try {
+ limit_memory(max_memory_in_bytes);
+ compute_open_hypercube_generators(dimension);
+ return true;
+ }
+ catch (const std::bad_alloc&) {
+ nout << "out of virtual memory" << endl;
+ return false;
+ }
+ catch (...) {
+ exit(1);
+ }
+ // Should never get here.
+ exit(1);
+}
+
+} // namespace
+
+extern "C" void*
+cxx_malloc(size_t size) {
+ void* p = malloc(size);
+ if (p != 0 || size == 0)
+ return p;
+
+ throw std::bad_alloc();
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t, size_t new_size) {
+ void* p = realloc(q, new_size);
+ if (p != 0 || new_size == 0)
+ return p;
+
+ throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+ free(p);
+}
+
+#define INIT_MEMORY 3*1024*1024
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+#endif // PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+int
+main() TRY {
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+#endif // !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+ // Note: we have included <ppl.hh> under the definition of
+ // PPL_NO_AUTOMATIC_INITIALIZATION.
+ Parma_Polyhedra_Library::initialize();
+
+ set_handlers();
+
+ // Find a dimension that cannot be computed with INIT_MEMORY bytes.
+ dimension_type dimension = 0;
+ do {
+ ++dimension;
+ nout << "Trying dimension " << dimension << endl;
+ } while (guarded_compute_open_hypercube_generators(dimension, INIT_MEMORY));
+
+ // Now find an upper bound to the memory necessary to compute it.
+ unsigned long upper_bound = INIT_MEMORY;
+ do {
+ upper_bound *= 2;
+ nout << "Trying upper bound " << upper_bound << endl;
+ } while (!guarded_compute_open_hypercube_generators(dimension, upper_bound));
+
+ // Search the "exact" amount of memory.
+ int lower_bound = upper_bound/2;
+ do {
+ int test_memory = (lower_bound+upper_bound)/2;
+ nout << "Probing " << test_memory << endl;
+ if (guarded_compute_open_hypercube_generators(dimension, test_memory))
+ upper_bound = test_memory;
+ else
+ lower_bound = test_memory;
+ } while (upper_bound-lower_bound > 1024);
+
+ nout << "Estimated memory for dimension " << dimension
+ << ": " << (lower_bound+upper_bound)/2 << " bytes" << endl;
+
+ // Note: we have included <ppl.hh> under the definition of
+ // PPL_NO_AUTOMATIC_INITIALIZATION.
+ Parma_Polyhedra_Library::finalize();
+
+ return 0;
+}
+CATCH
+
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
diff --git a/tests/Polyhedron/memory2.cc b/tests/Polyhedron/memory2.cc
new file mode 100644
index 0000000..fcd2c84
--- /dev/null
+++ b/tests/Polyhedron/memory2.cc
@@ -0,0 +1,259 @@
+/* Test the allocation error recovery facility of the library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <cstdlib>
+#include <limits>
+
+// If GMP does not support exceptions the test is pointless.
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS
+
+int
+main() TRY {
+ return 0;
+}
+CATCH
+
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS
+
+namespace {
+
+bool before_main;
+
+unsigned long mallocated = 0;
+unsigned long reallocated = 0;
+unsigned long freed = 0;
+unsigned long malloc_threshold = 0;
+unsigned long realloc_threshold = 0;
+
+void
+reset_allocators(unsigned long new_malloc_threshold,
+ unsigned long new_realloc_threshold) {
+ mallocated = reallocated = freed = 0;
+ malloc_threshold = new_malloc_threshold;
+ realloc_threshold = new_realloc_threshold;
+}
+
+void
+fail_if_leaked() {
+ if (mallocated != freed) {
+ nout << "Memory leak: allocated " << mallocated
+ << ", freed " << freed
+ << endl;
+ exit(1);
+ }
+ else {
+ nout << "allocated = freed = " << mallocated
+ << endl;
+ }
+}
+
+extern "C" void*
+cxx_malloc(size_t size) {
+ if (mallocated >= malloc_threshold) {
+ nout << "std::bad_alloc thrown from cxx_malloc()" << endl;
+ throw std::bad_alloc();
+ }
+
+ void* p = malloc(size);
+ if (p != 0 || size == 0) {
+ if (!before_main)
+ vnout << "allocated " << size << " @ " << p << endl;
+ ++mallocated;
+ return p;
+ }
+
+ nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+ << endl;
+ throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+ free(p);
+ if (!before_main)
+ vnout << "freed " << p << endl;
+ ++freed;
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t old_size, size_t new_size) {
+ if (q == 0)
+ return cxx_malloc(new_size);
+
+ if (new_size == 0) {
+ cxx_free(q, old_size);
+ return 0;
+ }
+
+ if (new_size <= old_size) {
+ void* p = realloc(q, new_size);
+ if (p != 0 || new_size == 0) {
+ if (!before_main)
+ vnout << "reallocated " << old_size << " @ " << p
+ << " down to " << new_size << " @ " << p
+ << endl;
+ return p;
+ }
+
+ nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+ << endl;
+ throw std::bad_alloc();
+ }
+
+ assert(new_size > old_size);
+ if (reallocated >= realloc_threshold) {
+ if (!before_main)
+ nout << "std::bad_alloc thrown from cxx_realloc()" << endl;
+ throw std::bad_alloc();
+ }
+
+ void* p = realloc(q, new_size);
+ if (p != 0 || new_size == 0) {
+ if (!before_main)
+ vnout << "reallocated " << old_size << " @ " << q
+ << " up to " << new_size << " @ " << p
+ << endl;
+ ++reallocated;
+ return p;
+ }
+
+ nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+ << endl;
+ throw std::bad_alloc();
+}
+
+void
+test1() {
+ nout << "test1()" << endl;
+
+ reset_allocators(6, ULONG_MAX);
+ try {
+ Matrix<Dense_Row>* matrix = new Matrix<Dense_Row>(2, 5);
+ // We will get here only if no exception is thrown:
+ // this happens when using native coefficients.
+ delete matrix;
+ }
+ catch (const std::bad_alloc&) {
+ nout << "std::bad_alloc caught" << endl;
+ fail_if_leaked();
+ }
+ catch (...) {
+ nout << "exception different from std::bad_alloc caught" << endl;
+ fail_if_leaked();
+ }
+}
+
+enum Threshold { Malloc, Realloc };
+
+void
+test_every_allocation(const dimension_type d, const Threshold threshold) {
+ // Run once without checking so as to allow for the allocation of
+ // statically allocated coefficients.
+ bool dry_run = true;
+ unsigned long k = ULONG_MAX;
+ bool go_ahead;
+ do {
+ nout << "**************** k = " << k << " ****************" << endl;
+ if (dry_run)
+ nout << "*************** dry run ***************" << endl;
+ go_ahead = dry_run;
+ if (threshold == Malloc)
+ reset_allocators(k, ULONG_MAX);
+ else
+ reset_allocators(ULONG_MAX, k);
+ try {
+ C_Polyhedron ph(d);
+ ph.add_constraint(Variable(0) == ULONG_MAX);
+ for (dimension_type i = 1; i < d; ++i)
+ ph.add_constraint(Variable(i) == ULONG_MAX*Variable(i-1));
+
+ (void) ph.minimized_generators();
+ }
+ catch (const std::bad_alloc&) {
+ nout << "std::bad_alloc caught" << endl;
+ fail_if_leaked();
+ go_ahead = true;
+ ++k;
+ }
+ catch (...) {
+ nout << "exception different from std::bad_alloc caught" << endl;
+ fail_if_leaked();
+ // Notice that we do not go ahead if we did not catch a bad_alloc.
+ }
+ if (dry_run) {
+ dry_run = false;
+ k = 0;
+ }
+ } while (go_ahead);
+}
+
+void
+test2() {
+ nout << "test2()" << endl;
+ test_every_allocation(5, Malloc);
+}
+
+void
+test3() {
+ nout << "test3()" << endl;
+ test_every_allocation(10, Realloc);
+}
+
+
+} // namespace
+
+#define IGNORE_OVERFLOWS(fun) \
+ try { \
+ fun; \
+ } \
+ catch (const std::overflow_error&) { \
+ }
+
+extern "C" void
+ppl_set_GMP_memory_allocation_functions() {
+ before_main = true;
+ // Allow the static coefficients of the library to be allocated
+ // without any limit.
+ reset_allocators(ULONG_MAX, ULONG_MAX);
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+
+int
+main() TRY {
+ before_main = false;
+
+ set_handlers();
+
+ // The point of this test is to detect memory leaks.
+ // So we plainly ignore overflow exceptions.
+ IGNORE_OVERFLOWS(test1());
+ IGNORE_OVERFLOWS(test2());
+ IGNORE_OVERFLOWS(test3());
+
+ return 0;
+}
+CATCH
+
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS
diff --git a/tests/Polyhedron/minconstraints1.cc b/tests/Polyhedron/minconstraints1.cc
new file mode 100644
index 0000000..ad02887
--- /dev/null
+++ b/tests/Polyhedron/minconstraints1.cc
@@ -0,0 +1,78 @@
+/* Test Polyhedron::minimized_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(A + B >= -2);
+ ph1.add_constraint(A >= -3);
+
+ const Constraint_System cs = ph1.minimized_constraints();
+
+ C_Polyhedron ph2(cs);
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (known_result == ph2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron known_result;
+ known_result = ph1;
+
+ Constraint_System cs = ph1.minimized_constraints();
+
+ C_Polyhedron ph2(cs);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/minconstraints2.cc b/tests/Polyhedron/minconstraints2.cc
new file mode 100644
index 0000000..fecb201
--- /dev/null
+++ b/tests/Polyhedron/minconstraints2.cc
@@ -0,0 +1,71 @@
+/* Test Polyhedron::minimized_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+ NNC_Polyhedron ph1;
+
+ Constraint_System cs = ph1.minimized_constraints();
+
+ NNC_Polyhedron ph2(cs);
+
+ const Constraint_System& min_cs = ph2.minimized_constraints();
+
+ bool ok = (ph1 == ph2
+ && min_cs.begin() == min_cs.end());
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x < 1);
+ cs.insert(y > 0);
+
+ NNC_Polyhedron ph(cs);
+ const Constraint_System& min_cs = ph.minimized_constraints();
+ return std::distance(min_cs.begin(), min_cs.end()) == 3;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Polyhedron/mingenerators1.cc b/tests/Polyhedron/mingenerators1.cc
new file mode 100644
index 0000000..ad6ebb8
--- /dev/null
+++ b/tests/Polyhedron/mingenerators1.cc
@@ -0,0 +1,86 @@
+/* Test Polyhedron::minimized_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(B));
+ gs1.insert(line(A));
+ gs1.insert(ray(B));
+ gs1.insert(ray(A + B));
+ gs1.insert(ray(-A + B));
+
+ C_Polyhedron ph1(gs1);
+
+ const Generator_System gs2 = ph1.minimized_generators();
+
+ print_generators(gs2, "*** gs2 ***");
+
+ C_Polyhedron ph2(gs2);
+ Generator_System known_gs;
+ known_gs.insert(point());
+ known_gs.insert(line(A));
+ known_gs.insert(ray(B));
+ C_Polyhedron known_result(known_gs);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1(2, EMPTY);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ C_Polyhedron known_result = ph1;
+
+ Generator_System gs = ph1.minimized_generators();
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generators(gs);
+
+ bool ok = (ph2 == known_result);
+
+ print_generators(gs, "*** gs ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/mingenerators2.cc b/tests/Polyhedron/mingenerators2.cc
new file mode 100644
index 0000000..8dbb799
--- /dev/null
+++ b/tests/Polyhedron/mingenerators2.cc
@@ -0,0 +1,49 @@
+/* Test Polyhedron::minimized_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ NNC_Polyhedron ph1;
+
+ Generator_System gs = ph1.minimized_generators();
+
+ NNC_Polyhedron ph2(gs);
+
+ bool ok = (ph1 == ph2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(gs, "*** gs ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize1.cc b/tests/Polyhedron/nncminimize1.cc
new file mode 100644
index 0000000..6b8da8c
--- /dev/null
+++ b/tests/Polyhedron/nncminimize1.cc
@@ -0,0 +1,380 @@
+/* Test minimization of NNC polyhedra.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ // Building a square.
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 6);
+ cs.insert(y >= 0);
+ cs.insert(y <= 6);
+
+ NNC_Polyhedron ph(cs);
+
+ nout << "Topologically closed square" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ // Removing all the vertices using strict inequalities.
+ cs.clear();
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 12);
+ cs.insert(x - y < 6);
+ cs.insert(x - y > -6);
+
+ ph.add_constraints(cs);
+
+ nout << "After vertices removal:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ ph.minimized_generators();
+
+ Generator_System gs;
+ gs.insert(closure_point());
+ gs.insert(closure_point(6*x));
+ gs.insert(closure_point(6*y));
+ gs.insert(closure_point(6*x + 6*y));
+ gs.insert(point(3*x));
+ gs.insert(point(3*y));
+ gs.insert(point(3*x + 6*y));
+ gs.insert(point(6*x + 3*y));
+
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph == known_result);
+
+ const Generator_System& min_gs = ph.minimized_generators();
+ bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+ nout << "After NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ return ok && ok1;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ // Building a square.
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+
+ NNC_Polyhedron ph(cs);
+
+ nout << "Topologically closed square" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ // Removing all the vertices using strict inequalities.
+ cs.clear();
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 2);
+ cs.insert(x - y < 1);
+ cs.insert(x - y > -1);
+
+ ph.add_constraints(cs);
+
+ nout << "After vertices removal:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ ph.minimized_generators();
+
+ Generator_System gs;
+ gs.insert(closure_point());
+ gs.insert(closure_point(x));
+ gs.insert(closure_point(y));
+ gs.insert(closure_point(x + y));
+ gs.insert(point(x, 10));
+ gs.insert(point(y, 10));
+ gs.insert(point(x + 10*y, 10));
+ gs.insert(point(10*x + y, 10));
+
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph == known_result);
+
+ const Generator_System& min_gs = ph.minimized_generators();
+ bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+ nout << "After NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+ nout << endl;
+ nout << "known result" << endl;
+ print_constraints(known_result.constraints(), "*** known constraints ***");
+ print_generators(known_result.generators(), "*** known generators ***");
+
+ return ok && ok1;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ // Building a square.
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+
+ NNC_Polyhedron ph(cs);
+
+ nout << "Topologically closed square" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ // Removing all the vertices using strict inequalities.
+ cs.clear();
+ cs.insert(x + y > 0);
+ cs.insert(x + y < 2);
+ cs.insert(x - y < 1);
+ cs.insert(x - y > -1);
+
+ ph.add_constraints(cs);
+
+ nout << "After vertices removal:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ Generator_System gs;
+ gs.insert(point(x + y, 4));
+ gs.insert(point(x + 5*y, 4));
+ gs.insert(point(5*x + y, 4));
+ gs.insert(point(5*x + 5*y, 4));
+
+ NNC_Polyhedron ph2(gs);
+
+ ph.intersection_assign(ph2);
+
+ nout << "After intersection:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ ph.minimized_generators();
+
+ gs.clear();
+ gs.insert(closure_point(x + y));
+ gs.insert(point(x + y, 4));
+ gs.insert(point(x + 4*y, 4));
+ gs.insert(point(4*x + y, 4));
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph == known_result);
+
+ const Generator_System& min_gs = ph.minimized_generators();
+ bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 4);
+
+ nout << "After NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ return ok && ok1;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ // Building an open square.
+ Generator_System gs;
+ gs.insert(closure_point());
+ gs.insert(closure_point(15*x));
+ gs.insert(closure_point(15*y));
+ gs.insert(closure_point(15*x + 15*y));
+
+ // All of these points, but a (any) single one of them, are redundant.
+ gs.insert(point(3*x + 3*y));
+ gs.insert(point(6*x + y));
+ gs.insert(point(9*x + y));
+ gs.insert(point(12*x + 3*y));
+ gs.insert(point(3*x + 12*y));
+ gs.insert(point(6*x + 14*y));
+ gs.insert(point(9*x + 14*y));
+ gs.insert(point(12*x + 12*y));
+ gs.insert(point(x + 6*y));
+ gs.insert(point(x + 9*y));
+ gs.insert(point(14*x + 6*y));
+ gs.insert(point(14*x + 9*y));
+
+ NNC_Polyhedron ph(gs);
+
+ nout << endl << "Before NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ ph.minimized_constraints();
+
+ nout << endl << "After NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ gs.clear();
+ gs.insert(closure_point());
+ gs.insert(closure_point(15*x));
+ gs.insert(closure_point(15*y));
+ gs.insert(closure_point(15*x + 15*y));
+ gs.insert(point(x + y));
+
+ NNC_Polyhedron known_result(gs);
+ bool ok = (ph == known_result);
+
+ const Generator_System& min_gs = ph.minimized_generators();
+ bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 5);
+
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ print_constraints(known_result.constraints(),
+ "*** known_result constraints ***");
+ print_generators(known_result.generators(),
+ "*** known_result generators ***");
+ return ok && ok1;
+}
+
+bool
+test05() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x > 0);
+ cs.insert(x < 2);
+
+ NNC_Polyhedron ph1(cs);
+
+ cs.clear();
+ cs.insert(x > 2);
+ cs.insert(x < 3);
+
+ NNC_Polyhedron ph2(cs);
+
+ ph1.upper_bound_assign(ph2);
+ (void) ph1.is_empty();
+
+ nout << "(Weakly) minimized poly hull" << endl;
+ print_constraints(ph1.constraints(), "*** ph1 constraints ***");
+ print_generators(ph1.generators(), "*** ph1 generators ***");
+
+ NNC_Polyhedron copy_ph1(ph1);
+
+ const Constraint_System& ph1_cs = ph1.constraints();
+ const int num_constraints = std::distance(ph1_cs.begin(), ph1_cs.end());
+
+ const Constraint_System& ph1_min_cs = ph1.minimized_constraints();
+ const int num_minimized_constraints = std::distance(ph1_min_cs.begin(),
+ ph1_min_cs.end());
+
+ print_constraints(ph1, "*** after ph1.minimized_constraints() ***");
+ nout << "num_constraints = " << num_constraints << endl;
+ nout << "num_minimized_constraints = "
+ << num_minimized_constraints << endl;
+
+ int num_points = 0;
+ for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+ gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+ if ((*i).is_point() || (*i).is_closure_point())
+ ++num_points;
+
+ copy_ph1.minimized_generators();
+
+ int num_minimized_points = 0;
+ for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+ gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+ if ((*i).is_point() || (*i).is_closure_point())
+ ++num_minimized_points;
+
+ bool ok = (num_constraints == num_minimized_constraints + 1
+ && num_points == num_minimized_points + 1);
+
+ print_generators(copy_ph1,
+ "*** after copy_ph1_minimized_generators() ***");
+ nout << "num_points = " << num_points << endl;
+ nout << "num_minimized_points = "
+ << num_minimized_points << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+
+ Constraint_System cs;
+ cs.insert(x > 0);
+
+ NNC_Polyhedron ph(cs);
+
+ cs.clear();
+ cs.insert(3*x >= 1);
+ cs.insert(2*x <= 1);
+
+ ph.add_constraints(cs);
+
+ nout << endl << "Before NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ ph.minimized_constraints();
+
+ NNC_Polyhedron known_result(1);
+ known_result.add_constraint(3*x >= 1);
+ known_result.add_constraint(2*x <= 1);
+
+ bool ok = (ph == known_result);
+
+ nout << endl << "After NNC minimization:" << endl;
+ print_constraints(ph.constraints(), "*** ph constraints ***");
+ print_generators(ph.generators(), "*** ph generators ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8A(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST_F8(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize2.cc b/tests/Polyhedron/nncminimize2.cc
new file mode 100644
index 0000000..e6cd0bc
--- /dev/null
+++ b/tests/Polyhedron/nncminimize2.cc
@@ -0,0 +1,81 @@
+/* Test NNC_Polyhedron::ph.minimized_generators().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ NNC_Polyhedron ph(5, EMPTY);
+ ph.add_generator(point(52131*A + 11369*B - 483036*C - 776212*D - 401649*E));
+ ph.add_generator(point(-80461*A + 86836*B + 88698*C - 269590*D + 951545*E));
+ ph.add_generator(point(215169*A - 42532*B + 234755*C + 705077*D - 632177*E));
+ ph.add_generator(point(-294493*A - 44546*B + 861680*C + 344228*D + 224283*E));
+ ph.add_generator(point(-158536*A + 273936*B - 854715*C - 151614*D + 382491*E));
+ ph.add_generator(point(-207881*A - 205091*B - 385540*C + 729319*D + 483915*E));
+ ph.add_generator(point(-1084*A + 2507*B - 28428*C + 1882*D - 999590*E));
+
+ ph.add_generator(point(450943*A - 416394*B + 883*C + 680432*D - 400345*E));
+ ph.add_generator(point(-483589*A - 16983*B - 824243*C + 106969*D - 273921*E));
+ ph.add_generator(point(554952*A - 155460*B - 572886*C - 91530*D + 575571*E));
+ ph.ascii_dump(vnout);
+ vnout << endl;
+
+ const Generator_System& gs = ph.minimized_generators();
+ ph.ascii_dump(vnout);
+ vnout << endl;
+
+ if (!ph.OK())
+ return false;
+
+ bool ok = true;
+ unsigned num_points = 0;
+ for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+ i != gs_end;
+ ++i) {
+ using namespace IO_Operators;
+ nout << *i << endl;
+ if (i->type() != Generator::POINT) {
+ nout << "i->type() == " << i->type() << endl;
+ ok = false;
+ }
+ ++num_points;
+ }
+
+ nout << "points = " << num_points << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Polyhedron/nncpostimeelapse1.cc b/tests/Polyhedron/nncpostimeelapse1.cc
new file mode 100644
index 0000000..b6d4048
--- /dev/null
+++ b/tests/Polyhedron/nncpostimeelapse1.cc
@@ -0,0 +1,432 @@
+/* Test Polyhedron::positive_time_elapse_assign().
+ Copyright (C) 2013 Marco Faella <marfaella at gmail.com>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Positive time elapse between: the origin and an open half-plane.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x == 0);
+ ph1.add_constraint(y == 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(x>0);
+
+ bool ok = (ph1 == known_result);
+
+ return ok;
+}
+
+// Positive time elapse between: a square without a side and a half-strip.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x <= 1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 1);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y < 0);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(x>0);
+ known_result.add_constraint(y<1);
+
+ bool ok = (ph1 == known_result);
+
+ return ok;
+}
+
+// Positive time elapse between: a closed square and an unbounded C-polyhedron.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x <= 1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 1);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y <= 0);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+// The same as test03, but with two NNC polyhedra.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x <= 1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 1);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y <= 0);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = (ph1 == known_result);
+
+ return ok;
+}
+
+// Positive time elapse between the universe and a point.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x == 1);
+ ph2.add_constraint(y == 1);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+
+ bool ok = (ph1 == known_result);
+
+ return ok;
+}
+
+// Positive time elapse between a point and the universe.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x == 1);
+ ph1.add_constraint(y == 1);
+
+ NNC_Polyhedron ph2(2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+// Positive time elapse between two rational points with different
+// denominators.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(x+y,2));
+
+ NNC_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(x+y,3));
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(2*x > 1);
+ known_result.add_constraint(x == y);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+
+// Positive time elapse between Polyhedra with two different dimensions.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(1);
+ ph1.add_constraint(x > 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 0);
+ ph2.add_constraint(y > 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ bool known_result = false;
+
+ try
+ {
+ ph1.positive_time_elapse_assign(ph2);
+ print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+ }
+ catch (std::invalid_argument& e)
+ {
+ known_result=true;
+ }
+
+ bool ok = (known_result == true);
+ return ok;
+}
+
+
+// Positive time elapse between two zero-dimensional polyhedra where
+// the second one is empty.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(0);
+
+ NNC_Polyhedron ph2(0, EMPTY);
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+// Positive time elapse between a polyhedron and the empty polyhedron.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(y > 1);
+
+ NNC_Polyhedron ph2(2, EMPTY);
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+// Positive time elapse between the empty polyhedron and another polyhedron.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, EMPTY);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 0);
+ ph2.add_constraint(y > 1);
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+// Positive time elapse between an empty polyhedron with non-processed
+// pending constraints and a normal polyhedron.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 255);
+ ph1.add_constraint(x <= 257);
+ ph1.add_constraint(y >= 255);
+ ph1.add_constraint(y <= 257);
+
+ Variables_Set vars(x, y);
+
+ // Defines constraints of an empty polyhedron.
+ Constraint_System cs;
+ cs.insert(x > y);
+ cs.insert(x < y);
+
+ // Adding pending constraints.
+ ph1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 0);
+ ph2.add_constraint(y > 1);
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+// Positive time elapse between a normal polyhedron and an empty
+// polyhedron with non-processed pending constraints.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(y > 1);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x >= 255);
+ ph2.add_constraint(x <= 257);
+ ph2.add_constraint(y >= 255);
+ ph2.add_constraint(y <= 257);
+
+ Variables_Set vars(x, y);
+
+ // Defines constraints of an EMPTY Polyhedron
+ Constraint_System cs;
+ cs.insert(x > y);
+ cs.insert(x < y);
+
+ // Adding pending constraints
+ ph2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, true);
+
+ ph1.positive_time_elapse_assign(ph2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph1 == known_result);
+ return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/numberinput1.cc b/tests/Polyhedron/numberinput1.cc
new file mode 100644
index 0000000..890e322
--- /dev/null
+++ b/tests/Polyhedron/numberinput1.cc
@@ -0,0 +1,354 @@
+/* Test number input.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+#include <sstream>
+#include <cstdlib>
+
+namespace {
+
+using namespace Checked;
+
+struct Test_Extended_Number_Policy {
+ const_bool_nodef(check_overflow, true);
+ const_bool_nodef(check_inf_add_inf, false);
+ const_bool_nodef(check_inf_sub_inf, false);
+ const_bool_nodef(check_inf_mul_zero, false);
+ const_bool_nodef(check_div_zero, false);
+ const_bool_nodef(check_inf_div_inf, false);
+ const_bool_nodef(check_inf_mod, false);
+ const_bool_nodef(check_sqrt_neg, false);
+ const_bool_nodef(has_nan, true);
+ const_bool_nodef(has_infinity, true);
+ const_bool_nodef(fpu_check_inexact, false);
+ const_bool_nodef(check_nan_result, true);
+ static const Rounding_Dir ROUND_DEFAULT = ROUND_UP;
+ static void handle_result(Result r);
+};
+
+inline void
+Test_Extended_Number_Policy::handle_result(Result r) {
+ if (r == V_NAN)
+ return;
+ Extended_Number_Policy::handle_result(r);
+}
+
+bool
+aux_test(std::string input_string,
+ std::string expected_output,
+ std::string expected_residual,
+ Result expected_result) {
+ std::stringstream input_stream(input_string);
+ Checked_Number<mpq_class, Test_Extended_Number_Policy> value;
+ Result result = input(value, input_stream, ROUND_UP);
+ // NOTE: clear input_stream status bits, since otherwise the next call
+ // to getline will retrieve nothing at all.
+ input_stream.clear();
+ std::string residual;
+ getline(input_stream, residual, '\0');
+ std::stringstream output_stream;
+ output_stream << value;
+ std::string output = output_stream.str();
+
+ bool ok = (result == expected_result
+ && residual == expected_residual
+ && output == expected_output);
+
+ nout << "input = \"" << input_string << "\""
+ << endl
+ << "expected result = " << expected_result
+ << ", actual result = " << result
+ << endl
+ << "expected value = \"" << expected_output << "\""
+ << ", actual value = \"" << output << "\""
+ << endl
+ << "expected residual = \"" << expected_residual << "\""
+ << ", actual residual = \"" << residual << "\""
+ << endl;
+
+ return ok;
+}
+
+// Testing symbols.
+bool
+test01() {
+ return aux_test("inf", "+inf", "", V_EQ_PLUS_INFINITY)
+ && aux_test("InF", "+inf", "", V_EQ_PLUS_INFINITY)
+ && aux_test("+inF", "+inf", "", V_EQ_PLUS_INFINITY)
+ && aux_test("-InF", "-inf", "", V_EQ_MINUS_INFINITY)
+ && aux_test("-InFinity", "-inf", "inity", V_EQ_MINUS_INFINITY)
+ && aux_test("Inf7", "+inf", "7", V_EQ_PLUS_INFINITY)
+ && aux_test("nan", "nan", "", V_NAN)
+ && aux_test("NAN", "nan", "", V_NAN)
+ && aux_test("Nan", "nan", "", V_NAN);
+}
+
+// Testing symbols with trailing input and errors.
+bool
+test02() {
+ return aux_test("nAn+", "nan", "+", V_NAN)
+ && aux_test("naN/", "nan", "/", V_NAN)
+ && aux_test("nAN/0", "nan", "/0", V_NAN)
+ && aux_test("nAN/-3", "nan", "/-3", V_NAN)
+ && aux_test("inF/3", "+inf", "/3", V_EQ_PLUS_INFINITY)
+ && aux_test("Inf/-3", "+inf", "/-3", V_EQ_PLUS_INFINITY)
+ && aux_test("-inf/-3", "-inf", "/-3", V_EQ_MINUS_INFINITY)
+ && aux_test("-NAn", "nan", "NAn", V_CVT_STR_UNK);
+}
+
+// Testing integers.
+bool
+test03() {
+ return aux_test(" - 2", "nan", " 2", V_CVT_STR_UNK)
+ && aux_test("15", "15", "", V_EQ)
+ && aux_test("34976098", "34976098", "", V_EQ)
+ && aux_test("34976098349760983497609834976098",
+ "34976098349760983497609834976098", "", V_EQ)
+ && aux_test("3/-inf", "nan", "", V_CVT_STR_UNK)
+ && aux_test("+77", "77", "", V_EQ)
+ && aux_test("-77", "-77", "", V_EQ)
+ && aux_test("-7777777777777777777777777",
+ "-7777777777777777777777777", "", V_EQ)
+ && aux_test("-77 ", "-77", " ", V_EQ)
+ && aux_test("-77 ", "-77", " ", V_EQ)
+ && aux_test("-77ab", "-77", "ab", V_EQ)
+ && aux_test("-77,33", "-77", ",33", V_EQ)
+ && aux_test(" - 2", "nan", " 2", V_CVT_STR_UNK);
+}
+
+// Testing fractions.
+bool
+test04() {
+ return aux_test("71.3", "713/10", "", V_EQ)
+ && aux_test("0.123456", "1929/15625", "", V_EQ)
+ && aux_test("12345678910111213141516.12345678910111213141516",
+ "308641972752780328537903086419727527803285379/25000000000000000000000",
+ "", V_EQ)
+ && aux_test("0.123456 101", "1929/15625", " 101", V_EQ)
+ && aux_test("0.123456 101", "1929/15625", " 101", V_EQ)
+ && aux_test("0.123456 ", "1929/15625", " ", V_EQ)
+ && aux_test(".499975", "19999/40000", "", V_EQ)
+ && aux_test(".333", "333/1000", "", V_EQ)
+ && aux_test("+.333", "333/1000", "", V_EQ)
+ && aux_test("-.333", "-333/1000", "", V_EQ)
+ && aux_test(".0x333", "0", "x333", V_EQ);
+}
+
+// Testing exponent.
+bool
+test05() {
+ return aux_test("15e1", "150", "", V_EQ)
+ && aux_test("15*^8", "1500000000", "", V_EQ)
+ && aux_test("1*^009", "1000000000", "", V_EQ)
+ && aux_test("15*^111",
+ "15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "", V_EQ)
+ && aux_test("151515e+1", "1515150", "", V_EQ)
+ && aux_test("151515151515151515e+1", "1515151515151515150", "", V_EQ)
+ && aux_test("9200e-2", "92", "", V_EQ)
+ && aux_test("15*^7e4", "150000000", "e4", V_EQ)
+ && aux_test("15*^6/", "nan", "", V_CVT_STR_UNK)
+ && aux_test("9200e", "nan", "", V_CVT_STR_UNK)
+ && aux_test("9200ea", "nan", "a", V_CVT_STR_UNK)
+ && aux_test("9200*^", "nan", "", V_CVT_STR_UNK)
+ && aux_test("9200*^b", "nan", "b", V_CVT_STR_UNK)
+ // Exponent and fraction.
+ && aux_test("5.3e3", "5300", "", V_EQ)
+ && aux_test("2.2e-1", "11/50", "", V_EQ)
+ && aux_test("5.33333*^-4", "533333/1000000000", "", V_EQ)
+ && aux_test("-2.20001*^+3", "-220001/100", "", V_EQ)
+ && aux_test("7.e", "nan", "", V_CVT_STR_UNK)
+ && aux_test("7.0 e3", "7", " e3", V_EQ);
+}
+
+// Testing exponent size limit.
+bool
+test06() {
+ std::stringstream ss;
+ ss << "1e" << (LONG_MAX / 10) + 1 << "0";
+ std::stringstream ss2;
+ ss2 << "1e" << (LONG_MAX / 10) << (LONG_MAX % 10) + 1;
+ return aux_test(ss.str(), "nan", "", V_CVT_STR_UNK)
+ && aux_test(ss2.str(), "nan", "", V_CVT_STR_UNK);
+}
+
+// Testing hexadecimals.
+bool
+test07() {
+ return aux_test("0x", "nan", "", V_CVT_STR_UNK)
+ && aux_test("0xx", "nan", "x", V_CVT_STR_UNK)
+ && aux_test("0x0.f", "15/16", "", V_EQ)
+ && aux_test("0x.f", "15/16", "", V_EQ)
+ && aux_test("0x.fp3", "15/2", "", V_EQ)
+ && aux_test("16^^.fp3", "15/2", "", V_EQ)
+ && aux_test("0x100p-9", "1/2", "", V_EQ)
+ && aux_test("16^^100p-9", "1/2", "", V_EQ)
+ && aux_test("100p-9", "nan", "p-9", V_CVT_STR_UNK)
+ && aux_test("0x.f*^1", "15", "", V_EQ)
+ && aux_test("0x-f", "nan", "-f", V_CVT_STR_UNK)
+ && aux_test("0xfa", "250", "", V_EQ)
+ && aux_test("-0xfa", "-250", "", V_EQ)
+ && aux_test("-0x000000000000000000000000fa", "-250", "", V_EQ)
+ && aux_test("-0xfaz", "-250", "z", V_EQ)
+ && aux_test("-0xfa .", "-250", " .", V_EQ)
+ && aux_test("0xfa0xfa", "4000", "xfa", V_EQ)
+ && aux_test("0x0b123", "45347", "", V_EQ);
+}
+
+// Testing hexadecimals fractions and exponents.
+bool
+test08() {
+ return
+ // Fraction.
+ aux_test("0xfa.a", "2005/8", "", V_EQ)
+ && aux_test("0xfa.ay", "2005/8", "y", V_EQ)
+ && aux_test("-0xfa.", "-250", "", V_EQ)
+ // Exponent.
+ && aux_test("0x1e2", "482", "", V_EQ)
+ && aux_test("0x1*^2", "256", "", V_EQ)
+ && aux_test("0x1*^2-1", "256", "-1", V_EQ)
+ // Fraction and exponent.
+ && aux_test("0x0.1*^3", "256", "", V_EQ)
+ && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-2",
+ "-493504168323155221903720496056512238754896365637429427/590295810358705651712",
+ "", V_EQ)
+ && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20",
+ "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+ "", V_EQ)
+ && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20b",
+ "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+ "b", V_EQ)
+ && aux_test("0x0.1*^3 -0", "256", " -0", V_EQ);
+}
+
+// Testing bases.
+bool
+test09() {
+ return aux_test("3^^", "nan", "", V_CVT_STR_UNK)
+ && aux_test("3^^z", "nan", "z", V_CVT_STR_UNK)
+ && aux_test("^^3", "nan", "^^3", V_CVT_STR_UNK)
+ && aux_test("3^^1", "1", "", V_EQ)
+ && aux_test("2^^0", "0", "", V_EQ)
+ && aux_test("2^^1", "1", "", V_EQ)
+ && aux_test("2^^10", "2", "", V_EQ)
+ && aux_test("2^^11", "3", "", V_EQ)
+ && aux_test("36^^z", "35", "", V_EQ)
+ && aux_test("36^^yz", "1259", "", V_EQ)
+ && aux_test("36^^xyz", "44027", "", V_EQ)
+ && aux_test("37^^2", "nan", "^2", V_CVT_STR_UNK)
+ && aux_test("37^^1.1", "nan", "^1.1", V_CVT_STR_UNK)
+ && aux_test("2^^113", "3", "3", V_EQ)
+ && aux_test("2^^11 3", "3", " 3", V_EQ)
+ && aux_test("3^^e2", "nan", "e2", V_CVT_STR_UNK);
+}
+
+// Testing bases with fractions and exponents.
+bool
+test10() {
+ return
+ // Fraction.
+ aux_test("2^^11.1", "7/2", "", V_EQ)
+ && aux_test("2^^11.1a", "7/2", "a", V_EQ)
+ && aux_test("2^^11.1.", "7/2", ".", V_EQ)
+ && aux_test("2^^11.1 ", "7/2", " ", V_EQ)
+ // Exponent.
+ && aux_test("10^^2e3", "2000", "", V_EQ)
+ && aux_test("8^^2e3", "1024", "", V_EQ)
+ && aux_test("8^^2e38", "41538374868278621028243970633760768", "", V_EQ)
+ && aux_test("8^^2e3e", "1024", "e", V_EQ)
+ // Fraction and exponent.
+ && aux_test("8^^2.1e3", "1088", "", V_EQ)
+ && aux_test("8^^20402543.120347e7", "9073863231288", "", V_EQ)
+ && aux_test("8^^2.18e3", "17/8", "8e3", V_EQ);
+}
+
+// Testing denominators.
+bool
+test11() {
+ return aux_test("15/0", "nan", "", V_NAN)
+ && aux_test("15/1", "15", "", V_EQ)
+ && aux_test("15/3", "5", "", V_EQ)
+ && aux_test("15/-3", "-5", "", V_EQ)
+ && aux_test("15/3f", "5", "f", V_EQ);
+}
+
+// Testing denominators with fractions and exponents.
+bool
+test12() {
+ return
+ // Fraction.
+ aux_test("27.9/3.1", "9", "", V_EQ)
+ && aux_test("27.9/3.1=9", "9", "=9", V_EQ)
+ // Exponent.
+ && aux_test("15/30e-1", "5", "", V_EQ)
+ && aux_test("27e3/30e-1", "9000", "", V_EQ)
+ && aux_test("15*^-3/29e2", "3/580000", "", V_EQ)
+ && aux_test("15/30e-1,2", "5", ",2", V_EQ)
+ && aux_test("15/30e-1.2", "5", ".2", V_EQ)
+ // Exponent and fraction.
+ && aux_test("27.9e3/30e-1", "9300", "", V_EQ)
+ && aux_test("27.9e3/30e-1/2", "9300", "/2", V_EQ)
+ && aux_test("27.9e3/30e-1^^", "9300", "^^", V_EQ);
+}
+
+// Testing denominators with hexadecimals and bases.
+bool
+test13() {
+ return
+ // Hexadecimal.
+ aux_test("0xf/0x3", "5", "", V_EQ)
+ && aux_test("3048227.23429e3/0x230abc43",
+ "304822723429/58790611500", "", V_EQ)
+ && aux_test("0xf/0x3g", "5", "g", V_EQ)
+ // Base.
+ && aux_test("16^^f/4^^3.0e0*^3", "5", "*^3", V_EQ);
+}
+
+// LARGE_NUM has 14057 digits.
+#define LARGE_NUM "29382093589501594796725672938209358950159472967256372938209358950159472967256729382093589501594729672567293820935899501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938 [...]
+
+// Testing a very large number.
+bool
+test14() {
+ return aux_test(LARGE_NUM, LARGE_NUM, "", V_EQ);
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+END_MAIN
diff --git a/tests/Polyhedron/onepoint.cc b/tests/Polyhedron/onepoint.cc
new file mode 100644
index 0000000..3494347
--- /dev/null
+++ b/tests/Polyhedron/onepoint.cc
@@ -0,0 +1,57 @@
+/* Creation of a one-point polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ ph.add_generator(point(-1000*x - 9*y, 16));
+
+ print_generators(ph, "*** generators ***");
+ print_constraints(ph, "*** constraints ***");
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(2*x == -125);
+ known_result.add_constraint(16*y == -9);
+ known_result.add_constraint(z == 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/permute.cc b/tests/Polyhedron/permute.cc
new file mode 100644
index 0000000..b460bcc
--- /dev/null
+++ b/tests/Polyhedron/permute.cc
@@ -0,0 +1,223 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+ dimension_type offset,
+ C_Polyhedron& q) {
+ C_Polyhedron r(offset);
+ r.concatenate_assign(p);
+ q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+ dimension_type& offset, unsigned int& arity) {
+ offset = 3;
+ arity = 3;
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ // This is the base case:
+ // append(A,B,C) :- A = [], B = C.
+ base.add_space_dimensions_and_embed(3);
+ base.add_constraint(A == 0);
+ base.add_constraint(B >= 0);
+ base.add_constraint(C == B);
+
+ print_constraints(base, "*** base ***");
+
+ // This is the inductive case:
+ // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+ induct.add_space_dimensions_and_embed(6);
+ induct.add_constraint(A + F == C + D);
+ induct.add_constraint(B == E);
+ induct.add_constraint(C + D >= A);
+ induct.add_constraint(D >= 0);
+ induct.add_constraint(B >= 0);
+ induct.add_constraint(A >= D + 1);
+
+ print_constraints(induct, "*** inductive ***");
+
+ expect.add_space_dimensions_and_embed(3);
+ expect.add_constraint(A + B == C);
+ expect.add_constraint(B >= 0);
+ expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+ dimension_type offset, unsigned int arity) {
+ // Initialize the fixpoint iteration.
+ C_Polyhedron current = start;
+
+ print_constraints(current, "*** start ***");
+
+ // Contains the polyhedron computed at the previous iteration.
+ C_Polyhedron previous;
+ do {
+ previous = current;
+ current = induct;
+ shift_rename_add(previous, offset, current);
+
+ print_constraints(current, "*** after shift_rename_add ***");
+
+ Variables_Set dimensions_to_remove;
+ dimension_type current_dim;
+ current_dim = current.space_dimension();
+ for (dimension_type i = current_dim-1 ; i >= arity; --i )
+ dimensions_to_remove.insert(Variable(i));
+ current.remove_space_dimensions(dimensions_to_remove);
+
+ print_constraints(current, "*** after remove_space_dimensions ***");
+
+ current.upper_bound_assign(previous);
+ (void) current.is_empty();
+
+ print_constraints(current, "*** after upper_bound_assign ***");
+
+ current.H79_widening_assign(previous);
+
+ print_constraints(current, "*** after H79_widening_assign ***");
+
+ } while (current != previous);
+ finish = current;
+}
+
+void
+append_size_rel(C_Polyhedron& ph) {
+ C_Polyhedron start;
+ C_Polyhedron induct;
+ C_Polyhedron expect;
+ dimension_type recursive_offset;
+ unsigned int arity;
+ append_init(start, induct, expect, recursive_offset, arity);
+ fix_point(start, induct, ph, recursive_offset, arity);
+}
+
+void
+permute_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+ C_Polyhedron& ph_append,
+ dimension_type& offset, unsigned int& arity) {
+ arity = 2;
+ offset = 10;
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+
+ // This is the base case:
+ // permute(A,B) :- A = [], B = [].
+ base.add_space_dimensions_and_embed(2);
+ base.add_constraint(A == 0);
+ base.add_constraint(B == 0);
+
+ print_constraints(base, "*** base ***");
+
+ // This is the inductive case:
+ // permute(A,B) :- B = [X|C],
+ // E = [X|G], F = A, append(D,E,F),
+ // D = H, I = G, append(H,I,J),
+ // K = J, L = C, permute(K,L).
+ induct.add_space_dimensions_and_embed(6);
+ induct.add_constraint(B == C + 1);
+ induct.add_constraint(F == A);
+ shift_rename_add(ph_append, 3, induct);
+ induct.add_space_dimensions_and_embed(4);
+ induct.add_constraint(E == G + 1);
+ shift_rename_add(ph_append, 7, induct);
+ induct.add_space_dimensions_and_embed(2);
+ induct.add_constraint(D + G == H + I);
+ induct.add_constraint(D == H);
+ induct.add_constraint(I == G);
+ induct.add_constraint(K == J);
+ induct.add_constraint(L == C);
+ induct.add_constraint(A >= 0);
+ induct.add_constraint(C >= 0);
+
+ print_constraints(induct, "*** inductive ***");
+
+ expect.add_space_dimensions_and_embed(2);
+ expect.add_constraint(A == B);
+ expect.add_constraint(A >= 0);
+ expect.add_constraint(B >= 0);
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ C_Polyhedron start;
+ C_Polyhedron induct;
+ C_Polyhedron expect;
+ dimension_type recursive_offset;
+ unsigned int arity;
+ C_Polyhedron ph_append;
+ append_size_rel(ph_append);
+ permute_init(start, induct, expect, ph_append, recursive_offset, arity);
+ C_Polyhedron final;
+ fix_point(start, induct, final, recursive_offset, arity);
+
+ print_constraints(expect, "*** expected ***");
+
+ C_Polyhedron final1;
+ final1 = induct;
+ shift_rename_add(final, recursive_offset, final1);
+
+ print_constraints(final1, "*** after shift_rename_add ***");
+
+ C_Polyhedron final2;
+ final2 = final1;
+ Variable A(0);
+ Variable B(1);
+ Variable K(10);
+ Variable L(11);
+ final2.add_constraint(B - L >= 1);
+ final2.add_constraint(A - K >= 1);
+
+ if (final2 == final1)
+ print_constraints(final2, "*** termination condition satisfied ***");
+ else
+ print_constraints(final2, "*** termination condition not satisfied ***");
+
+ return final2 == final1 ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/polydifference1.cc b/tests/Polyhedron/polydifference1.cc
new file mode 100644
index 0000000..f58ebdc
--- /dev/null
+++ b/tests/Polyhedron/polydifference1.cc
@@ -0,0 +1,206 @@
+/* Test Polyhedron::difference_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point(0*x + 0*y));
+ gs1.insert(point(4*x + 0*y));
+ gs1.insert(point(2*x + 2*y));
+
+ C_Polyhedron ph1(gs1);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ Generator_System gs2;
+ gs2.insert(point(0*x + 3*y));
+ gs2.insert(point(4*x + 3*y));
+ gs2.insert(point(2*x + 1*y));
+
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result = ph1;
+
+ computed_result.difference_assign(ph2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point());
+ gs_known_result.insert(point(3*x + 3*y, 2));
+ gs_known_result.insert(point(4*x));
+ gs_known_result.insert(point(5*x + 3*y, 2));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ C_Polyhedron ph3(2);
+ ph3.add_constraint(2*y >= 3);
+
+ known_result.difference_assign(ph3);
+
+ bool ok = (computed_result == known_result);
+
+ print_generators(computed_result, "*** after difference_assign ***");
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-4) >= 0);
+ C_Polyhedron known_result(cs);
+
+ ph1.difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(B == 0);
+
+ C_Polyhedron ph2(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 2);
+ ph1.add_constraint(B >= 0);
+ ph1.add_constraint(B <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ ph1.difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(A <= 7);
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(A == 5);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(A == B);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A + B == 0);
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/polydifference2.cc b/tests/Polyhedron/polydifference2.cc
new file mode 100644
index 0000000..663d002
--- /dev/null
+++ b/tests/Polyhedron/polydifference2.cc
@@ -0,0 +1,176 @@
+/* Test Polyhedron::difference_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point(0*x + 0*y));
+ gs1.insert(point(0*x + 3*y));
+ gs1.insert(point(3*x + 0*y));
+ gs1.insert(point(3*x + 3*y));
+
+ NNC_Polyhedron ph1(gs1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(1*x + 0*y == 0);
+
+ NNC_Polyhedron ph2(cs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron computed_result = ph1;
+
+ computed_result.difference_assign(ph2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(closure_point(0*x + 0*y));
+ gs_known_result.insert(closure_point(0*x + 3*y));
+ gs_known_result.insert(point(3*x + 0*y));
+ gs_known_result.insert(point(3*x + 3*y));
+
+ NNC_Polyhedron known_result(gs_known_result);
+
+ bool ok = (computed_result == known_result);
+
+ print_generators(computed_result, "*** after difference_assign ***");
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A >= 0);
+ ph1.add_constraint(B >= 0);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(A > 2);
+ ph2.add_constraint(B >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.difference_assign(ph2);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(y >= 0);
+ cs1.insert(x <= 4);
+ cs1.insert(x - 2*y <= 2);
+
+ C_Polyhedron ph1(cs1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ Constraint_System cs2;
+ cs2.insert(x >= 0);
+ cs2.insert(y >= 0);
+ cs2.insert(x <= 4);
+ cs2.insert(y <= 5);
+ cs2.insert(x - 2*y <= 2);
+ cs2.insert(x + y <= 7);
+
+ C_Polyhedron ph2(cs2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result = ph1;
+ computed_result.difference_assign(ph2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point(0*x + 5*y));
+ gs_known_result.insert(point(4*x + 3*y));
+ gs_known_result.insert(ray(0*x + 1*y));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result, "*** after difference_assign ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(A >= 1);
+ ph2.add_constraint(A <= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.difference_assign(ph2);
+
+ C_Polyhedron known_result(1);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull1.cc b/tests/Polyhedron/polyhull1.cc
new file mode 100644
index 0000000..0a62855
--- /dev/null
+++ b/tests/Polyhedron/polyhull1.cc
@@ -0,0 +1,400 @@
+/* Test Polyhedron::upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(x));
+ gs1.insert(ray(y));
+
+ C_Polyhedron ph1(gs1);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ Generator_System gs2;
+ gs2.insert(point(-x + y));
+ gs2.insert(point(x + y));
+ gs2.insert(point(3*x));
+
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result = ph1;
+
+ computed_result.upper_bound_assign(ph2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point());
+ gs_known_result.insert(point(-x + y));
+ gs_known_result.insert(ray(x));
+ gs_known_result.insert(ray(y));
+
+ C_Polyhedron known_result(gs_known_result);
+
+ print_generators(computed_result, "*** ph1.upper_bound_assign(ph2) ***");
+
+ return computed_result == known_result;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(x + y));
+ C_Polyhedron ph2(gs);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result1(ph1);
+
+ computed_result1.upper_bound_assign(ph2);
+
+ C_Polyhedron known_result(ph2);
+
+ bool ok = (computed_result1 == known_result);
+
+ print_generators(computed_result1,
+ "*** after upper_bound_assign ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(x <= 2);
+ ph1.add_constraint(y <= 2);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(y >= 2);
+ ph2.add_constraint(y <= 4);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.upper_bound_assign(ph2);
+
+ print_generators(ph1, "*** after upper_bound_assign ***");
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point());
+ known_result.add_generator(point(2*x));
+ known_result.add_generator(point(4*y));
+ known_result.add_generator(point(2*x + 4*y));
+
+ bool ok = (ph1 == known_result);
+
+ return ok;
+}
+
+bool
+aux_test04(C_Polyhedron& ph1, const C_Polyhedron& ph2,
+ // Note intentional call-by-value!
+ C_Polyhedron known_result) {
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.upper_bound_assign(ph2);
+
+ print_generators(ph1, "*** after upper_bound_assign ***");
+
+ return ph1 == known_result;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1_1(2);
+ ph1_1.add_constraint(x >= 0);
+ ph1_1.add_constraint(y >= 0);
+ ph1_1.add_constraint(x <= 2);
+ ph1_1.add_constraint(y <= 2);
+ C_Polyhedron ph1_2(ph1_1);
+
+ C_Polyhedron ph2_1(2);
+ ph2_1.add_constraint(x+y <= 0);
+ ph2_1.add_constraint(x+y >= 2);
+ C_Polyhedron ph2_2(ph2_1);
+ C_Polyhedron ph2_3(ph2_1);
+ C_Polyhedron ph2_4(ph2_1);
+
+ bool ok = aux_test04(ph1_1, ph2_1, ph1_1)
+ && aux_test04(ph2_2, ph1_2, ph1_2)
+ && aux_test04(ph2_3, ph2_4, ph2_3);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(A));
+ ph1.add_generator(ray(A));
+ ph1.add_generator(ray(B));
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.upper_bound_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1,
+ "*** after ph1.upper_bound_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2;
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.upper_bound_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1,
+ "*** after ph1.upper_bound_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(ray(A));
+ gs1.insert(point(B));
+ C_Polyhedron ph1(gs1);
+ ph1.generators();
+ ph1.constraints();
+
+ Generator_System gs2;
+ gs2.insert(point());
+ gs2.insert(ray(B));
+ C_Polyhedron ph2(gs2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.upper_bound_assign(ph2);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1,
+ "*** after ph1.upper_bound_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A - B >= 0);
+ C_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.upper_bound_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.upper_bound_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.upper_bound_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.upper_bound_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.generators();
+ ph1.add_constraint(A == B);
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2);
+ ph2.generators();
+ ph2.add_constraint(A >= B + 1);
+ C_Polyhedron copy_ph2 = ph2;
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.upper_bound_assign(ph2);
+ copy_ph1.upper_bound_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** after upper_bound_assign ***");
+ print_generators(copy_ph1,
+ "*** after upper_bound_assign ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point());
+ ph1.constraints();
+ ph1.add_generator(line(A + B));
+ C_Polyhedron copy_ph1 = ph1;
+
+ C_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point());
+ ph2.constraints();
+ ph2.add_generator(ray(A));
+ ph2.add_generator(ray(B));
+
+ C_Polyhedron copy_ph2 = ph2;
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.upper_bound_assign(ph2);
+ copy_ph1.upper_bound_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** after upper_bound_assign ***");
+ print_generators(copy_ph1,
+ "*** after upper_bound_assign ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ // Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron p(3);
+ p.add_constraint(B >= 0);
+ p.add_constraint(C >= 0);
+
+ C_Polyhedron q(3);
+ q.add_constraint(C >= 0);
+
+ print_constraints(p, "*** p ***");
+ print_constraints(q, "*** q ***");
+
+ p.upper_bound_assign(q);
+
+ bool ok = (p == q);
+
+ print_constraints(p, "*** p.upper_bound_assign(q) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull2.cc b/tests/Polyhedron/polyhull2.cc
new file mode 100644
index 0000000..75fed42
--- /dev/null
+++ b/tests/Polyhedron/polyhull2.cc
@@ -0,0 +1,59 @@
+/* Test Polyhedron::upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable i(0);
+ Variable j(1);
+
+ NNC_Polyhedron p1(2);
+ p1.add_constraint(j == 0);
+ p1.add_constraint(i >= 0);
+ p1.add_constraint(j-i == 2);
+
+ NNC_Polyhedron p2(2);
+ p2.add_constraint(j == 0);
+ p2.add_constraint(-i > 0);
+ p2.add_constraint(j-i == 0);
+
+ print_constraints(p1, "*** p1 ***");
+ print_constraints(p2, "*** p2 ***");
+
+ p1.upper_bound_assign(p2);
+
+ bool ok = p1.is_empty();
+
+ print_constraints(p1, "*** p1.upper_bound_assign(p2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/polyhullifexact1.cc b/tests/Polyhedron/polyhullifexact1.cc
new file mode 100644
index 0000000..8d6064f
--- /dev/null
+++ b/tests/Polyhedron/polyhullifexact1.cc
@@ -0,0 +1,465 @@
+/* Test Polyhedron::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ C_Polyhedron ph_empty(0, EMPTY);
+ C_Polyhedron ph_universe(0, UNIVERSE);
+
+ // Testing all combinations for 0-dim polyhedra.
+ bool ok = true;
+ C_Polyhedron ph;
+
+ // empty, empty
+ ph = ph_empty;
+ ok &= ph.upper_bound_assign_if_exact(ph_empty);
+ ok &= (ph == ph_empty);
+ print_constraints(ph, "*** empty union empty ***");
+
+ // empty, universe
+ ph = ph_empty;
+ ok &= ph.upper_bound_assign_if_exact(ph_universe);
+ ok &= (ph == ph_universe);
+ print_constraints(ph, "*** empty union universe ***");
+
+ // universe, empty
+ ph = ph_universe;
+ ok &= ph.upper_bound_assign_if_exact(ph_empty);
+ ok &= (ph == ph_universe);
+ print_constraints(ph, "*** universe union empty ***");
+
+ // universe, universe
+ ph = ph_universe;
+ ok &= ph.upper_bound_assign_if_exact(ph_universe);
+ ok &= (ph == ph_universe);
+ print_constraints(ph, "*** universe union universe ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= -2);
+ ph1.add_constraint(x <= -1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 1);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y >= 0);
+ ph2.add_constraint(y <= 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= -2);
+ ph1.add_constraint(x <= 0);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y >= 0);
+ ph2.add_constraint(y <= 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= -2);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x == 0);
+ ph1.add_constraint(y == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y >= -2);
+ ph2.add_constraint(y <= 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(y == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(y >= 2);
+ ph2.add_constraint(y <= 4);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x == y);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x == 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= y);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= y);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x <= y);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(2, UNIVERSE);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable w(0);
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ Constraint_System cs;
+ cs.insert(4*x - 2*y - z + 14 >= 0);
+ cs.insert(4*x + 2*y - z + 2 >= 0);
+ cs.insert(x + y - 1 >= 0);
+ cs.insert(x + y + 2*z - 5 >= 0);
+ cs.insert(x + 1 >= 0);
+ cs.insert(x + z - 1 >= 0);
+ cs.insert(2*x + y -2*z + 7 >= 0);
+ cs.insert(x - y + 2*z + 1 >= 0);
+ cs.insert(x - y + 5 >= 0);
+ cs.insert(2*x - y - 2*z + 13 >= 0);
+ cs.insert(-2*x - y + 2*z + 1 >= 0);
+ cs.insert(-x + y - 1 >= 0);
+ cs.insert(-x + y -2*z + 7 >= 0);
+ cs.insert(-4*x + 2*y + z - 4 >= 0);
+ cs.insert(-2*x + y + 2*z - 5 >= 0);
+ cs.insert(-x + 1 >= 0);
+ cs.insert(-x - z + 5 >= 0);
+ cs.insert(-4*x - 2*y + z + 8 >= 0);
+ cs.insert(-x - y + 5 >= 0);
+ cs.insert(-x - y -2*z +13 >= 0);
+
+ C_Polyhedron icosahedron1(4);
+ icosahedron1.add_constraints(cs);
+ icosahedron1.add_constraint(w >= 0);
+ icosahedron1.add_constraint(w <= 5);
+
+ C_Polyhedron icosahedron2(4);
+ icosahedron2.add_constraints(cs);
+ icosahedron2.add_constraint(w >= -7);
+ icosahedron2.add_constraint(w <= 2);
+
+ C_Polyhedron known_result(4);
+ known_result.add_constraints(cs);
+ known_result.add_constraint(w >= -7);
+ known_result.add_constraint(w <= 5);
+
+ C_Polyhedron computed_result = icosahedron1;
+ bool ok = computed_result.poly_hull_assign_if_exact(icosahedron2);
+ ok &= (computed_result == known_result);
+
+ print_constraints(icosahedron1, "*** icosahedron1 ***");
+ print_constraints(icosahedron2, "*** icosahedron2 ***");
+ print_constraints(computed_result, "*** computed_result ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable X01(0);
+ Variable X02(1);
+ Variable X03(2);
+ Variable X04(3);
+ Variable X05(4);
+ Variable X06(5);
+ Variable X07(6);
+ Variable X08(7);
+ Variable X09(8);
+ Variable X10(9);
+ Variable X11(10);
+ Variable X12(11);
+ Variable X13(12);
+ Variable X14(13);
+ Variable X15(14);
+ Variable X16(15);
+ Variable X17(16);
+ Variable X18(17);
+ Variable X19(18);
+ Variable X20(19);
+ Variable X21(20);
+ Variable X22(21);
+ Variable X23(22);
+ Variable X24(23);
+ Variable X25(24);
+ Variable X26(25);
+ Variable X27(26);
+ Variable X28(27);
+ Variable X29(28);
+ Variable X30(29);
+ Variable X31(30);
+ Variable X32(31);
+ Variable X33(32);
+ Variable X34(33);
+ Variable X35(34);
+ Variable X36(35);
+ Variable X37(36);
+ Variable X38(37);
+ Variable X39(38);
+
+ Constraint_System cs;
+ cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+ cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+ cs.insert(-X01 >= -80);
+ cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+ cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+ cs.insert(Coefficient("2386907802506363")*X06
+ + Coefficient("2386907802506363")*X07
+ + Coefficient("1080863910568919")*X08
+ + Coefficient("7746191359077253")*X09
+ - X16 == 0);
+ cs.insert(-X06 + X10 >= -80);
+ cs.insert(-X07 + X11 >= 0);
+ cs.insert(-X08 + X12 >= 0);
+ cs.insert(-X09 + X13 >= 0);
+ cs.insert(X22 - X23 - X24 - X25 == 0);
+ cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+ cs.insert(-X22 >= -500);
+ cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+ cs.insert(Coefficient("7746191359077253")*X28
+ + Coefficient("7746191359077253")*X29
+ + Coefficient("3512807709348987")*X30
+ + Coefficient("3332663724254167")*X31
+ - X38 == 0);
+ cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+ cs.insert(-X28 + X32 >= -500);
+ cs.insert(-X29 + X33 >= 0);
+ cs.insert(-X30 + X34 >= 0);
+ cs.insert(-X31 + X35 >= 0);
+ cs.insert(Coefficient("-2661627379775963")*X10
+ - Coefficient("2686397177726501")*X11
+ - Coefficient("5422333951354077")*X12
+ - Coefficient("5469621747441467")*X13
+ + X25
+ - Coefficient("2466846695892189")*X32
+ - Coefficient("4996743786567565")*X33
+ - Coefficient("5064297780978123")*X34
+ - Coefficient("641481471923585")*X35 >= 0);
+ cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+ cs.insert(X15
+ - Coefficient("7854277750134145")*X28
+ - Coefficient("7782220156096217")*X29
+ - Coefficient("7782220156096217")*X30
+ - Coefficient("7710162562058289")*X31 >= 0);
+ cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+ cs.insert(X21 >= 2);
+ cs.insert(-X16 - X38 >= -300);
+ for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+ cs.insert(Variable(i) >= 0);
+
+ C_Polyhedron ph1(cs);
+ ph1.add_constraint(X25 - X22 <= 5);
+
+ C_Polyhedron ph2(cs);
+ ph1.add_constraint(X25 - X22 >= 1);
+
+ C_Polyhedron known_result(cs);
+
+ bool ok = ph1.poly_hull_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+ return ok;
+}
+
+bool
+test11() {
+ const dimension_type dim = 5;
+ Constraint_System cs;
+ for (dimension_type i = 1; i < dim; ++i) {
+ Variable x(i);
+ cs.insert(x >= 0);
+ cs.insert(x <= 4);
+ }
+
+ Variable x(0);
+
+ C_Polyhedron hypercube1(cs);
+ hypercube1.add_constraint(x >= 0);
+ hypercube1.add_constraint(x <= 4);
+
+ C_Polyhedron hypercube2(cs);
+ hypercube2.add_constraint(x >= 2);
+ hypercube2.add_constraint(x <= 6);
+
+ bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+ print_generators(hypercube1, "*** hyp1 ***");
+ print_generators(hypercube2, "*** hyp2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST_F8(test09);
+ DO_TEST_F64(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/polyhullifexact2.cc b/tests/Polyhedron/polyhullifexact2.cc
new file mode 100644
index 0000000..d3d124b
--- /dev/null
+++ b/tests/Polyhedron/polyhullifexact2.cc
@@ -0,0 +1,471 @@
+/* Test NNC_Polyhedron::upper_bound_assign_if_exact().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+
+ NNC_Polyhedron ph1(1, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x <= 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(1, UNIVERSE);
+ ph2.add_constraint(x == 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(1, UNIVERSE);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 1);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x <= 2);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y == 1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x <= 2);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 2);
+ ph1.add_constraint(x + y > 0);
+ ph1.add_constraint(x + y < 4);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x == y);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y >= 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, UNIVERSE);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x - y >= 0);
+ ph1.add_constraint(x + y >= 0);
+ ph1.add_constraint(4*x < 1);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x - y >= 0);
+ ph2.add_constraint(x + y >= 0);
+ ph2.add_constraint(4*x > 1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(x < 2);
+ ph1.add_constraint(y < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x == 2);
+ ph2.add_constraint(y == 1);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(x < 2);
+ ph1.add_constraint(y < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x == 2);
+ ph2.add_constraint(y > 0);
+ ph2.add_constraint(y < 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, UNIVERSE);
+ known_result.add_constraint(x > 0);
+ known_result.add_constraint(y > 0);
+ known_result.add_constraint(x <= 2);
+ known_result.add_constraint(y < 2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x == 2);
+ ph2.add_constraint(y == 0);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x < 1);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(y <= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x > 1);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(y >= 0);
+ ph2.add_constraint(y <= 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(0*x + 0*y));
+ ph1.add_generator(point(0*x + 1*y));
+ ph1.add_generator(closure_point(2*x + 2*y));
+ ph1.add_generator(closure_point(3*x + 0*y));
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, EMPTY);
+ ph2.add_generator(point(4*x + 0*y));
+ ph2.add_generator(point(4*x + 1*y));
+ ph2.add_generator(closure_point(2*x + 2*y));
+ ph2.add_generator(closure_point(1*x + 0*y));
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+ known_result.add_generator(point(0*x + 0*y));
+ known_result.add_generator(point(0*x + 1*y));
+ known_result.add_generator(point(4*x + 0*y));
+ known_result.add_generator(point(4*x + 1*y));
+ known_result.add_generator(closure_point(2*x + 2*y));
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x < 1);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(y < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x > 1);
+ ph2.add_constraint(x < 2);
+ ph2.add_constraint(y > 0);
+ ph2.add_constraint(y < 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x < 1);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(y < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(2, UNIVERSE);
+ ph2.add_constraint(x >= 1);
+ ph2.add_constraint(x < 2);
+ ph2.add_constraint(y > 0);
+ ph2.add_constraint(y < 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(2, UNIVERSE);
+ known_result.add_constraint(x > 0);
+ known_result.add_constraint(x < 2);
+ known_result.add_constraint(y > 0);
+ known_result.add_constraint(y < 2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ NNC_Polyhedron ph1(3, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x <= 1);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(y < 2);
+ ph1.add_constraint(z > 0);
+ ph1.add_constraint(z < 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(3, UNIVERSE);
+ ph2.add_constraint(x >= 1);
+ ph2.add_constraint(x < 2);
+ ph2.add_constraint(y > 0);
+ ph2.add_constraint(y < 2);
+ ph2.add_constraint(z > 0);
+ ph2.add_constraint(z < 2);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result(3, UNIVERSE);
+ known_result.add_constraint(x > 0);
+ known_result.add_constraint(x < 2);
+ known_result.add_constraint(y > 0);
+ known_result.add_constraint(y < 2);
+ known_result.add_constraint(z > 0);
+ known_result.add_constraint(z < 2);
+
+ bool ok = ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ NNC_Polyhedron ph1(3, UNIVERSE);
+ ph1.add_constraint(x > 0);
+ ph1.add_constraint(x <= 1);
+ ph1.add_constraint(y > 0);
+ ph1.add_constraint(y < 2);
+ ph1.add_constraint(z > 0);
+ ph1.add_constraint(z <= 2);
+ ph1.add_constraint(x + z < 3);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph1.minimized_generators(), "*** ph1 ***");
+
+ NNC_Polyhedron ph2(3, UNIVERSE);
+ ph2.add_constraint(x >= 1);
+ ph2.add_constraint(x < 2);
+ ph2.add_constraint(y > 0);
+ ph2.add_constraint(y < 2);
+ ph2.add_constraint(z > 0);
+ ph2.add_constraint(z <= 2);
+ ph1.add_constraint(x - z > -1);
+
+ print_constraints(ph2, "*** ph2 ***");
+ print_generators(ph2.minimized_generators(), "*** ph2 ***");
+
+ NNC_Polyhedron known_result(ph1);
+
+ bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc
new file mode 100644
index 0000000..554c64a
--- /dev/null
+++ b/tests/Polyhedron/randphull1.cc
@@ -0,0 +1,201 @@
+/* Compute poly-hulls of random polytopes.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+#include <cmath>
+
+#ifndef M_PI
+# define M_PI 3.14159265358979323846 /* pi */
+#endif
+
+namespace {
+
+namespace test01_namespace {
+
+int
+count_points(const C_Polyhedron& ph) {
+ int count = 0;
+ const Generator_System& gs = ph.minimized_generators();
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ if (i->type() == Generator::POINT)
+ ++count;
+ return count;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+ // Set up a random numbers' generator.
+ gmp_randclass rg(gmp_randinit_default);
+
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ const int maxc = 10000;
+ C_Polyhedron ph(3, EMPTY);
+ nout << test01_namespace::count_points(ph) << endl;
+ for (int n = 1; n <= 200; ++n) {
+ const Coefficient cx = mpz_class(rg.get_z_range(maxc));
+ const Coefficient cy = mpz_class(rg.get_z_range(maxc));
+ const Coefficient cz = mpz_class(rg.get_z_range(maxc));
+ ph.add_generator(point(cx*x + cy*y + cz*z));
+ if (ph.is_empty())
+ return false;
+ nout << test01_namespace::count_points(ph) << endl;
+ }
+ return true;
+}
+
+
+namespace test02_namespace {
+
+// Compute random polytopes by generating points on the surface
+// of an n-dimensional sphere.
+
+// Please note: the following function picks up random point on the
+// n-dimensional sphere, but they are not uniformly distributed.
+// See the following paper on how to obtain a uniform distribution:
+
+// J. S. Hicks, R. F. Wheeling.
+// An efficient method for generating uniformly distributed points
+// on the surface of an n-dimensional sphere,
+// Communications of the ACM, Volume 2, Issue 4, pp. 17-19, April 1959.
+//
+// M. E. Muller.
+// A note on a method for generating points uniformly on n-dimensional spheres,
+// Communications of the ACM, Volume 2 Issue 4, pp. 19-20, April 1959.
+//
+// G. F. Schrack.
+// Remark on algorithm 381 [G5],
+// Communications of the ACM, Volume 15 Issue 6, p. 468, June 1972.
+
+void
+point_on_the_unit_n_sphere(unsigned n,
+ const std::vector<float>& theta,
+ std::vector<float>& coordinate) {
+ assert(n >= 2);
+
+ if (n == 2) {
+ coordinate[0] *= sin(theta[0]);
+ coordinate[1] *= cos(theta[0]);
+ }
+ else {
+ point_on_the_unit_n_sphere(n-1, theta, coordinate);
+ float sin_theta_n_2 = sin(theta[n-2]);
+ for (unsigned i = n-1; i-- > 0; )
+ coordinate[i] *= sin_theta_n_2;
+ coordinate[n-1] *= cos(theta[n-2]);
+ }
+}
+
+void
+random_polytope(C_Polyhedron& ph,
+ unsigned dimension,
+ unsigned num_points,
+ float radius = 1.0) {
+ assert(dimension >= 2);
+
+ // This setting and resetting of the rounding mode was prompted by
+ // the GLIBC bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=6869 .
+ // However, even when this bug will be fixed, we want to keep this
+ // rounding mode setting/resetting code, so that it gets tested.
+ restore_pre_PPL_rounding();
+
+ std::vector<float> theta(dimension-1);
+ std::vector<float> coordinate(dimension);
+
+ for (unsigned n = num_points; n > 0; --n) {
+ // Compute n-1 random angles.
+ for (unsigned i = dimension-1; i-- > 0; )
+ theta[i] = 2.0*M_PI*static_cast<double>(rand())/RAND_MAX;
+ // Compute float coordinates.
+ for (unsigned i = dimension; i-- > 0; )
+ coordinate[i] = radius;
+ point_on_the_unit_n_sphere(dimension, theta, coordinate);
+
+ Linear_Expression le;
+ for (unsigned i = dimension; i-- > 0; ) {
+#if 0
+ le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
+#else
+ // FIXME: this is a temporary workaround for machines
+ // where we cannot control the FPU.
+ mpz_class z = coordinate[i]*1000000.0;
+ le += Variable(i)*Coefficient(z);
+#endif
+ }
+ ph.add_generator(point(le));
+ }
+
+ // Restore the rounding mode as needed by the PPL.
+ set_rounding_for_PPL();
+}
+
+} // namespace test02_namespace
+
+bool
+test02() {
+ for (unsigned dimension = 2;
+#ifdef NDEBUG
+ dimension <= 6;
+#else
+ dimension <= 4;
+#endif
+ ++dimension) {
+ C_Polyhedron ph(dimension, EMPTY);
+ test02_namespace::random_polytope(ph, dimension, dimension*dimension);
+ // Count the number of constraints.
+ const Constraint_System& cs = ph.minimized_constraints();
+ unsigned num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ ++num_constraints;
+ // Count the number of generators.
+ const Generator_System& gs = ph.minimized_generators();
+ unsigned num_points = 0;
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ if (i->type() == Generator::POINT)
+ ++num_points;
+ else {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "i->type() == " << i->type() << endl;
+ return false;
+ }
+ nout << "dimension = " << dimension
+ << ", points = " << num_points << " (" << dimension*dimension << ")"
+ << ", constraints = " << num_constraints << endl;
+ }
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+ DO_TEST_F64(test02);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithcongruence1.cc b/tests/Polyhedron/refinewithcongruence1.cc
new file mode 100644
index 0000000..7fa0ea7
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruence1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::refine_with_congruence().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ NNC_Polyhedron ph1(3);
+ ph1.refine_with_congruence((A %= 0) / 2);
+ ph1.refine_with_congruence((B %= 5) / 0);
+ ph1.refine_with_congruence(A + B %= 6);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(ph1);
+ ph2.refine_with_congruence((A %= 1) / 0);
+ ph2.refine_with_congruence((B + C %= 4) / 5);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(A == 1);
+ known_result.add_constraint(B == 5);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.refine_with_congruence((A %= B) / 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph,
+ "*** after ph.refine_with_congruence((A %= B) / 0) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_congruence((A %= 0) / 4);
+ ph.refine_with_congruence((A + B %= 2) / 5);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.refine_with_congruence((B %= 1) / 0);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B == 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph,
+ "*** after ph.refine_with_congruence(B >= 1) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithcongruences1.cc b/tests/Polyhedron/refinewithcongruences1.cc
new file mode 100644
index 0000000..fcb6925
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruences1.cc
@@ -0,0 +1,337 @@
+/* Test Polyhedron::refine_with_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_congruence(A %= 0);
+ ph.refine_with_congruence(B %= 0);
+
+ Congruence_System cgs;
+
+ print_constraints(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ C_Polyhedron known_result(2);
+
+ ph.refine_with_congruences(cgs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs1;
+ cs1.insert(A + B >= 0);
+ C_Polyhedron ph(cs1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Linear_Expression e(1);
+ Congruence_System cgs2;
+ cgs2.insert((e %= 0) / 0);
+ ph.refine_with_congruences(cgs2);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.refine_with_congruences(cgs2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ C_Polyhedron ph(3);
+ ph.refine_with_congruence(A %= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron computed_result(3);
+
+ bool ok = (computed_result == ph);
+
+ print_constraints(computed_result,
+ "*** after refine_with_congruences ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ C_Polyhedron ph(3, EMPTY);
+
+ Congruence_System cgs;
+ cgs.insert(A %= 4);
+
+ print_constraints(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.refine_with_congruences(cgs);
+
+ C_Polyhedron computed_result(3, EMPTY);
+
+ bool ok = (ph == computed_result);
+
+ print_constraints(ph, "*** after refine_with_congruences(cs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph;
+ ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+ Congruence_System cgs;
+ cgs.insert((Linear_Expression(-1) %= 0) / 2);
+
+ print_constraints(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after refine_with_congruences ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(A + B));
+
+ C_Polyhedron ph(gs);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 3) / 2);
+
+ print_generators(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 0);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after refine_with_congruences ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert(A - B == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert((A - B %= 0) / 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert((A - B %= 1) / 0);
+ cgs.insert(A + B %= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 1);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+
+ Congruence_System cgs;
+ cgs.insert((A - B %= 0) / 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.refine_with_congruences(cgs);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+
+ NNC_Polyhedron ph1(2);
+ Congruence_System cgs;
+ cgs.insert((A - B %= 1) / 0);
+ cgs.insert(A + B %= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph1.refine_with_congruences(cgs);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 1);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ C_Polyhedron ph;
+ ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+ Congruence_System cgs;
+ cgs.insert((Linear_Expression(-1) %= 0) / 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_congruences(cgs, "*** cgs ***");
+
+ ph.refine_with_congruences(cgs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after refine_with_congruences ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraint1.cc b/tests/Polyhedron/refinewithconstraint1.cc
new file mode 100644
index 0000000..95ce198
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraint1.cc
@@ -0,0 +1,109 @@
+/* Test Polyhedron::refine_with_constraint().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.refine_with_constraint(A > 0);
+ ph1.refine_with_constraint(B == 5);
+ ph1.refine_with_constraint(A + B < 6);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(2);
+ for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+ cs_end = ph1.constraints().end(); i != cs_end; ++i)
+ ph2.refine_with_constraint(*i);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B == 5);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = (ph2 == known_result);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.refine_with_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.refine_with_constraint(A == B) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_constraint(A >= 0);
+ ph.refine_with_constraint(A <= 2);
+ ph.refine_with_constraint(A >= -1);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.refine_with_constraint(B > 1);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph,
+ "*** after ph.refine_with_constraint(B >= 1) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraints1.cc b/tests/Polyhedron/refinewithconstraints1.cc
new file mode 100644
index 0000000..cca5c02
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraints1.cc
@@ -0,0 +1,323 @@
+/* Test Polyhedron::refine_with_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.refine_with_constraint(A >= 0);
+ ph.refine_with_constraint(B >= 0);
+
+ Constraint_System cs;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.refine_with_constraints(cs);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs1;
+ cs1.insert(A + B >= 0);
+ C_Polyhedron ph(cs1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Linear_Expression e(1);
+ Constraint_System cs2;
+ cs2.insert(e == 0);
+ ph.refine_with_constraints(cs2);
+
+ C_Polyhedron known_result(2, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.refine_with_constraints(cs2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(3);
+ ph.refine_with_constraint(A >= 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+
+ C_Polyhedron computed_result(ph);
+
+ computed_result.add_constraints(cs);
+
+ bool ok = (computed_result == ph);
+
+ print_constraints(computed_result,
+ "*** after refine_with_constraints ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+
+ C_Polyhedron ph(3, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(A >= 4);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.refine_with_constraints(cs);
+
+ C_Polyhedron computed_result(3, EMPTY);
+
+ bool ok = (ph == computed_result);
+
+ print_constraints(ph, "*** after refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph;
+ ph.refine_with_constraint(Linear_Expression(-2) >= 0);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-1) >= 0);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.refine_with_constraints(cs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after refine_with_constraints ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(ray(A + B));
+
+ C_Polyhedron ph(gs);
+
+ Constraint_System cs;
+ cs.insert(A < 3);
+
+ print_generators(ph, "*** ph ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph.refine_with_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(B >= 0);
+ known_result.add_constraint(A - B >= 0);
+ known_result.add_constraint(A <= 3);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** after refine_with_constraints ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Constraint_System cs;
+ cs.insert(A - B == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.refine_with_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B == 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Constraint_System cs;
+ cs.insert(A - B > 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.refine_with_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B >= 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+
+ Constraint_System cs;
+ cs.insert(A - B > 1);
+ cs.insert(A + B >= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.refine_with_constraints(cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B >= 1);
+ known_result.add_constraint(A + B >= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+
+ Constraint_System cs;
+ cs.insert(A - B > 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.refine_with_constraints(cs);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A - B > 0);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+
+ NNC_Polyhedron ph1(2);
+ Constraint_System cs;
+ cs.insert(A - B > 1);
+ cs.insert(A + B >= 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(cs, "*** cs ***");
+
+ ph1.refine_with_constraints(cs);
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A - B > 1);
+ known_result.add_constraint(A + B >= 2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/relations1.cc b/tests/Polyhedron/relations1.cc
new file mode 100644
index 0000000..b733baa
--- /dev/null
+++ b/tests/Polyhedron/relations1.cc
@@ -0,0 +1,485 @@
+/* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(2*x - y >= 0);
+ cs.insert(y >= 0);
+ C_Polyhedron ph(cs);
+ print_constraints(ph, "*** ph ***");
+
+ Generator g = ray(x + y);
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = ph.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(r(A + B)) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+
+ C_Polyhedron ph(2, EMPTY);
+ print_constraints(ph, "*** ph ***");
+
+ Generator g = point(x);
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = ph.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(v(A)) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ C_Polyhedron ph;
+ print_constraints(ph, "*** ph ***");
+
+ Generator g = point();
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = ph.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(v()) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(y));
+ gs.insert(line(x));
+ C_Polyhedron ph(gs);
+ print_generators(ph, "*** ph ***");
+
+ Generator g = point(x + y);
+ print_generator(g, "*** g ***");
+
+ Poly_Gen_Relation rel = ph.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(v(A + B)) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(1*A + 1*B));
+ C_Polyhedron ph(gs);
+ print_generators(ph, "*** ph ***");
+
+ Poly_Con_Relation rel = ph.relation_with(A >= 0);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_included();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(A >= 0) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable y(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ print_generators(ph, "*** ph ***");
+
+ Constraint c(y >= 0);
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = ph.relation_with(c);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(c) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+ Poly_Con_Relation known_result = Poly_Con_Relation::nothing();
+
+ C_Polyhedron ph;
+ print_generators(ph, "*** ph ***");
+
+ // A false inequality constraint.
+ Constraint c_false1(Linear_Expression(-1) >= 0);
+ print_constraint(c_false1, "*** c_false1 ***");
+
+ rel = ph.relation_with(c_false1);
+
+ nout << "ph.relation_with(c_false1) == " << rel << endl;
+
+ known_result = Poly_Con_Relation::is_disjoint();
+ bool ok = (rel == known_result);
+
+ // A false equality constraint.
+ Constraint c_false2(Linear_Expression(5) == -2);
+ print_constraint(c_false2, "*** c_false2 ***");
+
+ rel = ph.relation_with(c_false2);
+
+ nout << "ph.relation_with(c_false2) == " << rel << endl;
+
+ known_result = Poly_Con_Relation::is_disjoint();
+ bool ok1 = (rel == known_result);
+
+ // A saturated inequality.
+ Constraint c_saturated1(Linear_Expression(3) >= 3);
+ print_constraint(c_saturated1, "*** c_saturated1 ***");
+
+ rel = ph.relation_with(c_saturated1);
+
+ nout << "ph.relation_with(c_saturated1) == " << rel << endl;
+
+ known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ bool ok2 = (rel == known_result);
+
+ // A saturated equality.
+ Constraint c_saturated2(Linear_Expression(1) == 1);
+ print_constraint(c_saturated2, "*** c_saturated2 ***");
+
+ rel = ph.relation_with(c_saturated2);
+
+ nout << "ph.relation_with(c_saturated2) == " << rel << endl;
+
+ known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ bool ok3 = (rel == known_result);
+
+ // A satisfied inequality which is not saturated.
+ Constraint c_satisfied(Linear_Expression(7) >= 5);
+ print_constraint(c_satisfied, "*** c_satisfied ***");
+
+ rel = ph.relation_with(c_satisfied);
+
+ nout << "ph.relation_with(c_satisfied) == " << rel << endl;
+
+ known_result = Poly_Con_Relation::is_included();
+ bool ok4 = (rel == known_result);
+
+ return ok && ok1 && ok2 && ok3 && ok4;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x + y >= 1);
+ cs.insert(y >= 5);
+
+ C_Polyhedron ph(cs);
+
+ print_generators(ph, "*** ph ***");
+
+ // An equality constraint non-intersecting the polyhedron.
+ Constraint c(y == -1);
+
+ print_constraint(c, "*** c ***");
+
+ Poly_Con_Relation rel = ph.relation_with(c);
+
+ nout << "ph.relation_with(c) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+ return rel == known_result;
+}
+
+bool
+test09() {
+ // The zero-dim universe polyhedron.
+ C_Polyhedron ph;
+ Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 0);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(0 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test10() {
+ // The zero-dim universe polyhedron.
+ C_Polyhedron ph;
+ Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 1);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(0 > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test11() {
+ // The zero-dim universe polyhedron.
+ C_Polyhedron ph;
+ Poly_Con_Relation rel = ph.relation_with(Linear_Expression(1) > 0);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(1 > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test12() {
+ // An empty polyhedron.
+ C_Polyhedron ph(1);
+ ph.add_constraint(Linear_Expression(0) >= 1);
+ Variable A(0);
+ Poly_Con_Relation rel = ph.relation_with(A > 0);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B == 3);
+ C_Polyhedron ph(cs);
+
+ Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs(A + B <= 3);
+ C_Polyhedron ph(cs);
+
+ Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ C_Polyhedron ph(cs);
+
+ Poly_Con_Relation rel = ph.relation_with(A + 2*B < 10);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A + 2*B < 10) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+ return rel == known_result;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A >= 1);
+ cs.insert(B >= 0);
+ cs.insert(A + B <= 3);
+ C_Polyhedron ph(cs);
+
+ Poly_Con_Relation rel = ph.relation_with(A + B > 1);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A + B > 1) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+ return rel == known_result;
+}
+
+bool
+test17() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A == 0);
+
+ Poly_Gen_Relation rel = ph.relation_with(point(2*A));
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(point(2*A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+ return rel == known_result;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A + 0*B));
+ gs.insert(point(3*A));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ Poly_Con_Relation rel = ph.relation_with(B == 0);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ bool ok = (rel == known_rel);
+
+ nout << "ph.relation_with(B == 0) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = ph.relation_with(ray(-A));
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(ray(-A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+ return rel == known_result;
+}
+
+bool
+test20() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = ph.relation_with(line(A));
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/relations2.cc b/tests/Polyhedron/relations2.cc
new file mode 100644
index 0000000..f1c3cfa
--- /dev/null
+++ b/tests/Polyhedron/relations2.cc
@@ -0,0 +1,227 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(line(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(ray(A));
+ gs2.insert(point(B));
+ gs2.insert(point(-B));
+ C_Polyhedron ph2(gs2);
+
+ Poly_Con_Relation rel1 = ph1.relation_with(A == 0);
+ Poly_Con_Relation rel2 = ph2.relation_with(A == 0);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ nout << "ph1.relation_with(A == 0) == " << rel1 << endl;
+ nout << "ph2.relation_with(A == 0) == " << rel2 << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+ return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A));
+ gs.insert(line(B));
+ C_Polyhedron ph(gs);
+
+ Poly_Con_Relation rel = ph.relation_with(B > 0);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(B > 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+ return rel == known_result;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = ph.relation_with(ray(A + B));
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+ bool ok = (rel == known_rel);
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(ray(A + B)) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point());
+ ph.constraints();
+ ph.add_generator(ray(A));
+ ph.add_generator(ray(B));
+
+ Poly_Con_Relation rel = ph.relation_with(A == 0);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(A == 0) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(line(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(ray(A));
+ gs2.insert(point(B));
+ gs2.insert(point(-B));
+ C_Polyhedron ph2(gs2);
+
+ Poly_Con_Relation rel1 = ph1.relation_with((A %= 0) / 5);
+ Poly_Con_Relation rel2 = ph2.relation_with((A %= 0) / 5);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+ nout << "ph1.relation_with((A %= 0) / 5) == " << rel1 << endl;
+ nout << "ph2.relation_with((A %= 0) / 5) == " << rel2 << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+ return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A));
+ C_Polyhedron ph(gs);
+
+ Poly_Con_Relation rel = ph.relation_with(A %= 0);
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(A %= 0) == " << rel << endl;
+
+ Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ return rel == known_result;
+}
+
+bool
+test07() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A >= 2);
+ ph.add_constraint(A <= 4);
+
+ Poly_Con_Relation rel = ph.relation_with((A %= 1) / 4);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+ bool ok = (rel == known_rel);
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with((A %= 1) / 4) == " << rel << endl;
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(2*A, 3));
+// ph.add_generator(point(-A));
+ ph.add_generator(ray(B));
+
+ Poly_Con_Relation rel1 = ph.relation_with(A %= 0);
+
+ Poly_Con_Relation rel2 = ph.relation_with((A %= 1) / 5);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+ bool ok = (rel1 == known_rel && rel2 == known_rel);
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(A %= 0) == " << rel1 << endl;
+ nout << "ph.relation_with((A %= 1) / 5) == " << rel2 << endl;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/relations3.cc b/tests/Polyhedron/relations3.cc
new file mode 100644
index 0000000..8cd07a2
--- /dev/null
+++ b/tests/Polyhedron/relations3.cc
@@ -0,0 +1,317 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A - B > 0);
+ ph.add_constraint(B >= 0);
+
+ Poly_Gen_Relation rel1 = ph.relation_with(point(B));
+ Poly_Gen_Relation rel2 = ph.relation_with(point(-B));
+
+ print_generators(ph, "*** ph ***");
+ nout << "ph.relation_with(point(B)) == " << rel1 << endl;
+ nout << "ph.relation_with(point(-B)) == " << rel2 << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+ return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2, EMPTY);
+ ph1.add_generator(point(A + B));
+
+ Poly_Con_Relation rel = ph1.relation_with(A - B == 0);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(A - B == 0) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ gs.insert(line(B));
+
+ NNC_Polyhedron ph1(gs);
+
+ Poly_Con_Relation rel = ph1.relation_with(A >= 1);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(A >= 1) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(line(A));
+ gs.insert(ray(B));
+ gs.insert(point());
+ NNC_Polyhedron ph1(gs);
+
+ Poly_Con_Relation rel = ph1.relation_with(A > 1);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(A > 1) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(line(B));
+ gs.insert(point());
+ gs.insert(ray(A));
+ NNC_Polyhedron ph(gs);
+ Generator_System gs1;
+ for (Generator_System::const_iterator i = ph.generators().begin(),
+ gs_end = ph.generators().end(); i != gs_end; ++i)
+ if (!(*i).is_closure_point())
+ gs.insert(*i);
+ C_Polyhedron ph1(gs);
+
+ Poly_Con_Relation rel = ph1.relation_with(B >= 1);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(B >= 1) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A));
+ NNC_Polyhedron ph(gs);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(A == 1);
+ ph1.add_constraint(B == 1);
+ Generator_System gs1;
+ for (Generator_System::const_iterator i = ph.generators().begin(),
+ gs_end = ph.generators().end(); i != gs_end; ++i)
+ if (!(*i).is_closure_point())
+ gs1.insert(*i);
+ ph1.add_generators(gs1);
+
+ Poly_Con_Relation rel = ph1.relation_with(B == 1);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(B == 1) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(ray(B));
+ gs.insert(point(-A));
+ C_Polyhedron ph1(gs);
+ ph1.generators();
+
+ Poly_Con_Relation rel = ph1.relation_with(B <= 0);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(B <= 0) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(A + B));
+ gs.insert(point(-A + B));
+ C_Polyhedron ph1(gs);
+ ph1.generators();
+
+ Poly_Con_Relation rel = ph1.relation_with(A >= 0);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(A >= 0) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(-A));
+ gs.insert(ray(-B));
+ gs.insert(ray(A + B));
+ NNC_Polyhedron ph1(gs);
+ ph1.generators();
+
+ Poly_Con_Relation rel = ph1.relation_with(B < 0);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(B < 0) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(ray(A));
+ gs.insert(ray(A + B));
+ gs.insert(point(-B));
+ NNC_Polyhedron ph1(gs);
+ ph1.generators();
+
+ Poly_Con_Relation rel = ph1.relation_with(A < 0);
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+ bool ok = (rel == known_rel);
+
+ print_generators(ph1, "*** ph1 ***");
+ nout << "ph1.relation_with(A < 0) = " << rel << endl;
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A == 0);
+ ph.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = ph.relation_with(closure_point(A));
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+ return rel == known_result;
+}
+
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(A >= B);
+ ph.add_generator(point());
+ ph.generators();
+ ph.add_constraint(A <= B-1);
+
+ Poly_Gen_Relation rel = ph.relation_with(line(C));
+
+ print_constraints(ph, "*** ph ***");
+ nout << "ph.relation_with(line(C)) == " << rel << endl;
+
+ Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+ return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims1.cc b/tests/Polyhedron/removespacedims1.cc
new file mode 100644
index 0000000..cc6c264
--- /dev/null
+++ b/tests/Polyhedron/removespacedims1.cc
@@ -0,0 +1,299 @@
+/* Removing space dimensions from a polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+ Generator_System gs;
+ gs.insert(point(0*x + y +0*z + 2*w));
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ ph.remove_space_dimensions(to_be_removed);
+
+ Generator_System known_result_gs;
+ known_result_gs.insert(point(0*x +2*y));
+ C_Polyhedron known_result(known_result_gs);
+
+ bool ok = (known_result == ph);
+
+ print_generators(ph, "*** ph ***");
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Generator_System gs;
+
+ // Creating 10 points.
+ for (int i = 0; i < 10; i++) {
+ Linear_Expression e;
+ for (int j = 0; j < 10; j++)
+ e += (10*i + j) * Variable(j);
+ gs.insert(point(e));
+ }
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** before ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(Variable(0));
+ to_be_removed.insert(Variable(5));
+ to_be_removed.insert(Variable(3));
+ to_be_removed.insert(Variable(4));
+ to_be_removed.insert(Variable(8));
+
+ ph.remove_space_dimensions(to_be_removed);
+
+ // Useless, but much clearer.
+ gs.clear();
+
+ Variable a(0);
+ Variable b(1);
+ Variable c(2);
+ Variable d(3);
+ Variable e(4);
+
+ Linear_Expression expr01 = (1*a + 2*b + 6*c + 7*d + 9*e);
+ Linear_Expression expr10 = 10 * (a + b + c + d + e);
+
+ for (int i = 0; i < 10; i++) {
+ Linear_Expression expr = i * expr10 + expr01;
+ gs.insert(point(expr));
+ }
+
+ C_Polyhedron known_result(gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ***");
+ print_generators(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable y(1);
+ Variable z(2);
+ Variable w(6);
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(w);
+
+ // A 10-dim space, empty polyhedron.
+ C_Polyhedron ph(10, EMPTY);
+ ph.remove_space_dimensions(to_be_removed);
+
+ // A 7-dim space, empty polyhedron.
+ C_Polyhedron known_result(7, EMPTY);
+
+ bool ok = (known_result == ph);
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Generator_System gs;
+ gs.insert(point(x + y + 2*z - w));
+
+ C_Polyhedron ph(gs);
+
+ print_generators(ph, "*** ph ***");
+
+ ph.remove_higher_space_dimensions(2);
+
+ Generator_System gs_known_result;
+ gs_known_result.insert(point(x + y));
+ C_Polyhedron known_result(gs_known_result);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph(4, EMPTY);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.remove_higher_space_dimensions(0);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph after remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph1(3);
+ ph1.add_constraint(x >= 3);
+ ph1.add_constraint(x - y >= 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2 = ph1;
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(x);
+
+ ph1.remove_space_dimensions(to_be_removed);
+ ph2.remove_higher_space_dimensions(0);
+
+ bool ok = (ph1 == ph2);
+
+ print_generators(ph1, "*** ph1 after remove_space_dimensions ***");
+ print_generators(ph2, "*** ph2 after remove_higher_space_dimensions ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(A));
+ C_Polyhedron ph(gs);
+ ph.add_constraint(A >= 2);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+
+ ph.remove_space_dimensions(to_be_removed);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph,
+ "*** after ph.remove_space_dimensions(to_be_removed) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A >= 3);
+
+ print_constraints(ph, "*** ph ***");
+
+ C_Polyhedron known_result(ph);
+
+ ph.remove_higher_space_dimensions(2);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(2*A + B, 4));
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.remove_higher_space_dimensions(1);
+
+ C_Polyhedron known_result(1, EMPTY);
+ known_result.add_generator(point(A, 2));
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.remove_higher_space_dimensions(1) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+#ifdef DERIVED_TEST
+ DO_TEST_F8A(test02);
+#else
+ DO_TEST_F8(test02);
+#endif // !defined(DERIVED_TEST)
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims2.cc b/tests/Polyhedron/removespacedims2.cc
new file mode 100644
index 0000000..fea8601
--- /dev/null
+++ b/tests/Polyhedron/removespacedims2.cc
@@ -0,0 +1,99 @@
+/* Removing space dimensions form an NNC polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ NNC_Polyhedron ph1(4);
+
+ ph1.add_constraint(x - y == 3);
+ ph1.add_constraint(z > x + 4);
+ ph1.add_constraint(y < 6);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ NNC_Polyhedron ph2(ph1);
+
+ ph1.remove_higher_space_dimensions(1);
+
+ // This is the set of the variables that we want to remove.
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ to_be_removed.insert(Variable(3));
+
+ ph2.remove_space_dimensions(to_be_removed);
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1, "*** after remove_higher_space_dimensions(1) ***");
+ print_constraints(ph2,
+ "*** after remove_space_dimensions(to_be_removed) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ NNC_Polyhedron ph(3);
+
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(y >= 1);
+ ph.add_constraint(z >= 1);
+
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x);
+ to_be_removed.insert(z);
+
+ ph.remove_space_dimensions(to_be_removed);
+
+ NNC_Polyhedron known_result(1);
+ known_result.add_constraint(x >= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.remove_space_dimensions() ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/simplifyusingcontext1.cc b/tests/Polyhedron/simplifyusingcontext1.cc
new file mode 100644
index 0000000..f7b0496
--- /dev/null
+++ b/tests/Polyhedron/simplifyusingcontext1.cc
@@ -0,0 +1,489 @@
+/* Test Polyhedron::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron icosahedron(3);
+ icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+ icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+ icosahedron.add_constraint(x + y - 1 >= 0);
+ icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+ icosahedron.add_constraint(x + 1 >= 0);
+ icosahedron.add_constraint(x + z - 1 >= 0);
+ icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+ icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+ icosahedron.add_constraint(x - y + 5 >= 0);
+ icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+ icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+ icosahedron.add_constraint(-x + y - 1 >= 0);
+ icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+ icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+ icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+ icosahedron.add_constraint(-x + 1 >= 0);
+ icosahedron.add_constraint(-x - z + 5 >= 0);
+ icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+ icosahedron.add_constraint(-x - y + 5 >= 0);
+ icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+ C_Polyhedron column(3);
+ column.add_constraint(y >= 2);
+ column.add_constraint(y <= 4);
+ column.add_constraint(x >= 0);
+ column.add_constraint(x <= 1);
+
+ C_Polyhedron computed_result = icosahedron;
+ computed_result.simplify_using_context_assign(column);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(-4*x - 2*y + z >= -8);
+ known_result.add_constraint(-4*x + 2*y + z >= 4);
+ known_result.add_constraint(-2*x - y + 2*z >= -1);
+ known_result.add_constraint(-2*x + y + 2*z >= 5);
+ known_result.add_constraint(-x - y - 2*z >= -13);
+ known_result.add_constraint(-x - z >= -5);
+ known_result.add_constraint(-x + y - 2*z >= -7);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(icosahedron, "*** icosahedron ***");
+ print_constraints(column, "*** column ***");
+ print_constraints(computed_result, "*** computed_result ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron icosahedron1(3);
+ icosahedron1.add_constraint(4*x - 2*y - z + 14 >= 0);
+ icosahedron1.add_constraint(4*x + 2*y - z + 2 >= 0);
+ icosahedron1.add_constraint(x + y - 1 >= 0);
+ icosahedron1.add_constraint(x + y + 2*z - 5 >= 0);
+ icosahedron1.add_constraint(x + 1 >= 0);
+ icosahedron1.add_constraint(x + z - 1 >= 0);
+ icosahedron1.add_constraint(2*x + y -2*z + 7 >= 0);
+ icosahedron1.add_constraint(x - y + 2*z + 1 >= 0);
+ icosahedron1.add_constraint(x - y + 5 >= 0);
+ icosahedron1.add_constraint(2*x - y - 2*z + 13 >= 0);
+ icosahedron1.add_constraint(-2*x - y + 2*z + 1 >= 0);
+ icosahedron1.add_constraint(-x + y - 1 >= 0);
+ icosahedron1.add_constraint(-x + y -2*z + 7 >= 0);
+ icosahedron1.add_constraint(-4*x + 2*y + z - 4 >= 0);
+ icosahedron1.add_constraint(-2*x + y + 2*z - 5 >= 0);
+ icosahedron1.add_constraint(-x + 1 >= 0);
+ icosahedron1.add_constraint(-x - z + 5 >= 0);
+ icosahedron1.add_constraint(-4*x - 2*y + z + 8 >= 0);
+ icosahedron1.add_constraint(-x - y + 5 >= 0);
+ icosahedron1.add_constraint(-x - y -2*z +13 >= 0);
+
+ C_Polyhedron icosahedron2 = icosahedron1;
+ icosahedron2.affine_image(x, x+5);
+
+
+ C_Polyhedron computed_result = icosahedron1;
+ computed_result.simplify_using_context_assign(icosahedron2);
+
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(-4*x - 2*y + z >= -8);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(icosahedron1, "*** icosahedron1 ***");
+ print_constraints(icosahedron2, "*** icosahedron2 ***");
+ print_constraints(computed_result, "*** computed_result ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(x <= 6);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x >= 0);
+ ph2.add_constraint(x <= 5);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron computed_result = ph1;
+
+ computed_result.simplify_using_context_assign(ph2);
+
+ C_Polyhedron known_result(1);
+
+ bool ok = (computed_result == known_result);
+
+ print_constraints(computed_result,
+ "*** ph1.simplify_using_context_assign ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph1 = C_Polyhedron(3, UNIVERSE);
+ ph1.add_constraint(i >= 1);
+ ph1.add_constraint(i <= 10);
+ ph1.add_constraint(j >= 1);
+ ph1.add_constraint(j <= 10);
+ ph1.add_constraint(k == 0);
+
+ C_Polyhedron ph2 = C_Polyhedron(3, UNIVERSE);
+ ph2.add_constraint(i >= 0);
+ ph2.add_constraint(i <= 2);
+ ph2.add_constraint(j >= 2);
+ ph2.add_constraint(j <= 9);
+ ph2.add_constraint(k == 0);
+
+ print_constraints(ph1, "=== ph1 ===");
+ print_constraints(ph2, "=== ph2 ===");
+
+ C_Polyhedron known_result = C_Polyhedron(3, UNIVERSE);
+ known_result.add_constraint(i >= 1);
+
+ ph1.simplify_using_context_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph1(3, UNIVERSE);
+ ph1.add_constraint(i == 1);
+ ph1.add_constraint(j + 1 == 0);
+ ph1.add_constraint(k == 3);
+
+ C_Polyhedron ph2(3, UNIVERSE);
+ ph2.add_constraint(i == 1);
+ ph2.add_constraint(j + k == 2);
+ ph2.add_constraint(k >= 0);
+ ph2.add_constraint(k <= 3);
+
+ C_Polyhedron known_result(3, UNIVERSE);
+ known_result.add_constraint(k == 3);
+ // PolyLib 5.22.3 does not simplify away the following equality.
+ // known_result.add_constraint(j + 1 == 0);
+
+ ph1.simplify_using_context_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph1(3, UNIVERSE);
+ ph1.add_constraint(A == 0);
+ ph1.add_constraint(B == C);
+ ph1.add_constraint(B >= 2);
+ print_constraints(ph1, "\n=== ph1 ===");
+
+ C_Polyhedron ph2(3, UNIVERSE);
+ ph2.add_constraint(A == 0);
+ ph2.add_constraint(C >= 2);
+ print_constraints(ph2, "\n=== ph2 ===");
+
+ ph1.simplify_using_context_assign(ph2);
+
+ C_Polyhedron known_result(3, UNIVERSE);
+ known_result.add_constraint(B == C);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "\n=== ph1.simplify_using_context_assign(ph2) ===");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2);
+ p.add_constraint(x == 0);
+ p.add_constraint(y == 0);
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= 0);
+ q.add_constraint(y >= 0);
+
+ C_Polyhedron known_result(p);
+
+ print_constraints(p, "*** p ***");
+ print_constraints(q, "*** q ***");
+
+ (void) p.simplify_using_context_assign(q);
+
+ bool ok = (p == known_result);
+
+ print_constraints(p, "*** p.simplify_using_context_assign(q) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron p(2);
+ p.add_constraint(x <= 0);
+ p.add_constraint(y <= 0);
+
+ C_Polyhedron q(2);
+ q.add_constraint(x >= 0);
+ q.add_constraint(y >= 0);
+
+ C_Polyhedron known_result(p);
+
+ print_constraints(p, "*** p ***");
+ print_constraints(q, "*** q ***");
+
+ (void) p.simplify_using_context_assign(q);
+
+ bool ok = (p == known_result);
+
+ print_constraints(p, "*** p.simplify_using_context_assign(q) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+ C_Polyhedron ph2(1);
+
+ ph2.add_constraint(A == 0);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result = ph1;
+
+ ph1.simplify_using_context_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph1(3, UNIVERSE);
+ ph1.add_constraint(i >= 1);
+ ph1.add_constraint(i <= 10);
+ ph1.add_constraint(j >= 1);
+ ph1.add_constraint(j <= 10);
+ ph1.add_constraint(k == 0);
+
+ C_Polyhedron ph2(3, UNIVERSE);
+ ph2.add_constraint(i <= 25);
+ ph2.add_constraint(j <= 25);
+ ph2.add_constraint(i + j >= 25);
+ ph2.add_constraint(k == 0);
+
+ C_Polyhedron known_result(3, UNIVERSE);
+ known_result.add_constraint(i <= 10);
+ known_result.add_constraint(j <= 10);
+
+ ph1.simplify_using_context_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1);
+
+ return ok;
+}
+
+bool
+test11() {
+ C_Polyhedron ph1(0, EMPTY);
+ C_Polyhedron ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result = ph1;
+
+ ph1.simplify_using_context_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+
+ C_Polyhedron ph1(0, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(0, EMPTY);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(0, UNIVERSE);
+
+ bool ok = !ph1.simplify_using_context_assign(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** ph1.simplify_using_context_assign(ph2) ***");
+ return ok;
+}
+
+bool
+test13() {
+
+ C_Polyhedron ph1(0, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(0, UNIVERSE);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = !ph1.simplify_using_context_assign(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** ph1.simplify_using_context_assign(ph2) ***");
+ return ok;
+}
+
+bool
+test14() {
+
+ C_Polyhedron ph1(0, UNIVERSE);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(0, EMPTY);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(0, UNIVERSE);
+
+ bool ok = !ph1.simplify_using_context_assign(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** ph1.simplify_using_context_assign(ph2) ***");
+ return ok;
+}
+
+bool
+test15() {
+
+ C_Polyhedron ph1(0, UNIVERSE);
+
+ print_constraints(ph1, "*** ph1 ***");
+
+ C_Polyhedron ph2(0, UNIVERSE);
+
+ print_constraints(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(0, UNIVERSE);
+
+ bool ok = ph1.simplify_using_context_assign(ph2);
+ ok &= (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** ph1.simplify_using_context_assign(ph2) ***");
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8A(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/smm1.cc b/tests/Polyhedron/smm1.cc
new file mode 100644
index 0000000..fa438ed
--- /dev/null
+++ b/tests/Polyhedron/smm1.cc
@@ -0,0 +1,152 @@
+/* SEND + MORE = MONEY.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace Parma_Polyhedra_Library {
+ // Import all the output operators into the main PPL namespace.
+ using IO_Operators::operator<<;
+}
+
+namespace {
+
+namespace test01_namespace {
+
+// The classic cryptarithmetic puzzle:
+//
+// S E N D
+// + M O R E
+// ---------
+// M O N E Y
+
+void
+less_than(C_Polyhedron& ph, Variable X, Variable Y) {
+ ph.add_constraint(X+1 <= Y);
+}
+
+void
+constraints(C_Polyhedron& ph,
+ Variable S,
+ Variable E,
+ Variable N,
+ Variable D,
+ Variable M,
+ Variable O,
+ Variable R,
+ Variable Y,
+ int C1,
+ int C2,
+ int C3,
+ int C4) {
+ ph.add_constraint(S >= 0);
+ ph.add_constraint(E >= 0);
+ ph.add_constraint(N >= 0);
+ ph.add_constraint(D >= 0);
+ ph.add_constraint(M >= 0);
+ ph.add_constraint(O >= 0);
+ ph.add_constraint(R >= 0);
+ ph.add_constraint(Y >= 0);
+ ph.add_constraint(S <= 9);
+ ph.add_constraint(E <= 9);
+ ph.add_constraint(N <= 9);
+ ph.add_constraint(D <= 9);
+ ph.add_constraint(M <= 9);
+ ph.add_constraint(O <= 9);
+ ph.add_constraint(R <= 9);
+ ph.add_constraint(Y <= 9);
+ ph.add_constraint(S >= 1);
+ ph.add_constraint(M >= 1);
+ ph.add_constraint(M == C1);
+ ph.add_constraint(C2 + S + M == O + C1 * 10);
+ ph.add_constraint(C3 + E + O == N + 10 * C2);
+ ph.add_constraint(C4 + N + R == E + 10 * C3);
+ ph.add_constraint(D + E == Y + 10*C4);
+
+ less_than(ph, O, M);
+ less_than(ph, M, Y);
+ less_than(ph, Y, E);
+ less_than(ph, E, N);
+ less_than(ph, N, D);
+ less_than(ph, D, R);
+ less_than(ph, R, S);
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+ Variable S(0);
+ Variable E(1);
+ Variable N(2);
+ Variable D(3);
+ Variable M(4);
+ Variable O(5);
+ Variable R(6);
+ Variable Y(7);
+
+ bool solution_found = false;
+
+ for (int C1 = 0; C1 <= 1; ++C1)
+ for (int C2 = 0; C2 <= 1; ++C2)
+ for (int C3 = 0; C3 <= 1; ++C3)
+ for (int C4 = 0; C4 <= 1; ++C4) {
+ C_Polyhedron ph(8);
+ test01_namespace::constraints(ph,
+ S, E, N, D, M, O, R, Y,
+ C1, C2, C3, C4);
+ if (ph.is_empty())
+ continue;
+
+ nout << "Solution constraints" << endl;
+ const Constraint_System& cs = ph.constraints();
+ std::copy(cs.begin(), cs.end(),
+ std::ostream_iterator<Constraint>(nout, "\n"));
+ nout << "Solution generators" << endl;
+ const Generator_System& gs = ph.generators();
+ std::copy(gs.begin(), gs.end(),
+ std::ostream_iterator<Generator>(nout, "\n"));
+ if (solution_found)
+ return true;
+ solution_found = true;
+
+ C_Polyhedron expected(8);
+ expected.add_constraint(S == 9);
+ expected.add_constraint(E == 5);
+ expected.add_constraint(N == 6);
+ expected.add_constraint(D == 7);
+ expected.add_constraint(M == 1);
+ expected.add_constraint(O == 0);
+ expected.add_constraint(R == 8);
+ expected.add_constraint(Y == 2);
+
+ if (ph != expected)
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/sparserow1.cc b/tests/Polyhedron/sparserow1.cc
new file mode 100644
index 0000000..744e846
--- /dev/null
+++ b/tests/Polyhedron/sparserow1.cc
@@ -0,0 +1,626 @@
+/* Test the Sparse_Matrix class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_USE_SPARSE_MATRIX
+
+#include <vector>
+#include <algorithm>
+#include <set>
+
+namespace {
+
+bool
+test01() {
+
+ Sparse_Row row(5);
+
+ if (row.size() != 5)
+ return false;
+
+ row.resize(4);
+
+ if (row.size() != 4)
+ return false;
+
+ return true;
+}
+
+bool
+test02() {
+
+ Sparse_Row row(5);
+
+ row[1] = 5;
+ row[3] = 6;
+
+ Sparse_Row::iterator itr = row.begin();
+
+ if (itr == row.end())
+ return false;
+
+ if (itr.index() != 1)
+ return false;
+
+ if (*itr != 5)
+ return false;
+
+ ++itr;
+
+ if (itr == row.end())
+ return false;
+
+ if (itr.index() != 3)
+ return false;
+
+ if (*itr != 6)
+ return false;
+
+ ++itr;
+
+ if (itr != row.end())
+ return false;
+
+ --itr;
+
+ if (itr == row.end())
+ return false;
+
+ if (itr.index() != 3)
+ return false;
+
+ if (*itr != 6)
+ return false;
+
+ Sparse_Row::const_iterator citr = row.cbegin();
+
+ if (citr == row.cend())
+ return false;
+
+ if (citr.index() != 1)
+ return false;
+
+ if (*citr != 5)
+ return false;
+
+ ++citr;
+
+ if (citr == row.cend())
+ return false;
+
+ if (citr.index() != 3)
+ return false;
+
+ if (*citr != 6)
+ return false;
+
+ ++citr;
+
+ if (citr != row.cend())
+ return false;
+
+ --citr;
+
+ if (citr == row.cend())
+ return false;
+
+ if (citr.index() != 3)
+ return false;
+
+ if (*citr != 6)
+ return false;
+
+ return true;
+}
+
+bool
+test03() {
+
+ Sparse_Row row(10);
+
+ row[1] = 2;
+ row[3] = 4;
+ row[5] = 6;
+ row[7] = 8;
+ row[9] = 10;
+
+ Sparse_Row::iterator itr = row.find(3);
+
+ row.reset(itr);
+
+ if (row.get(3) != 0)
+ return false;
+
+ row[3] = 4;
+
+ itr = row.find(3);
+ Sparse_Row::iterator itr2 = row.find(7);
+
+ row.reset(itr, itr2);
+
+ if (row.get(1) != 2)
+ return false;
+
+ if (row.get(3) != 0)
+ return false;
+
+ if (row.get(5) != 0)
+ return false;
+
+ if (row.get(7) != 8)
+ return false;
+
+ return true;
+}
+
+bool
+test04() {
+
+ Sparse_Row row(2);
+
+ row[1] = 2;
+
+ if (row.get(1) != 2)
+ return false;
+
+ if (row.find(0) != row.end())
+ return false;
+
+ row.swap_coefficients(0, 1);
+
+ if (row.get(0) != 2)
+ return false;
+
+ if (row.find(1) != row.end())
+ return false;
+
+ row.swap_coefficients(0, 1);
+
+ if (row.get(1) != 2)
+ return false;
+
+ if (row.find(0) != row.end())
+ return false;
+
+ row[0] = 3;
+
+ if (row.get(1) != 2)
+ return false;
+
+ if (row.get(0) != 3)
+ return false;
+
+ row.swap_coefficients(0, 1);
+
+ if (row.get(1) != 3)
+ return false;
+
+ if (row.get(0) != 2)
+ return false;
+
+ row.clear();
+
+ if (row.find(1) != row.end())
+ return false;
+
+ if (row.find(0) != row.end())
+ return false;
+
+ row.swap_coefficients(0, 1);
+
+ if (row.find(1) != row.end())
+ return false;
+
+ if (row.find(0) != row.end())
+ return false;
+
+ if (row.begin() != row.end())
+ return false;
+
+ if (row.cbegin() != row.cend())
+ return false;
+
+ return true;
+}
+
+class test05_functor {
+public:
+
+ inline void
+ operator()(Coefficient& x, const Coefficient& y) const {
+ x *= 2 - y;
+ }
+
+ inline void
+ operator()(Coefficient& x) const {
+ x *= 2;
+ }
+};
+
+bool
+test05() {
+
+ Sparse_Row x(9);
+
+ // x: ***000111
+ // (`*' is an unstored zero)
+
+ x[3] = 0;
+ x[4] = 0;
+ x[5] = 0;
+ x[6] = 1;
+ x[7] = 1;
+ x[8] = 1;
+
+ Sparse_Row y(9);
+
+ // y: *01*01*01
+ // (`*' is an unstored zero)
+
+ y[1] = 0;
+ y[2] = 1;
+ y[4] = 0;
+ y[5] = 1;
+ y[7] = 0;
+ y[8] = 1;
+
+ // x *= 2 - y
+
+ x.combine_needs_first(y, test05_functor(), test05_functor());
+
+ // x: ******221
+ // (`*' is an unstored zero)
+
+ if (x.find(0) != x.end())
+ return false;
+
+ if (x.find(1) != x.end())
+ return false;
+
+ if (x.find(2) != x.end())
+ return false;
+
+ if (x.find(3) != x.end())
+ return false;
+
+ if (x.find(4) != x.end())
+ return false;
+
+ if (x.find(5) != x.end())
+ return false;
+
+ if (x.get(6) != 2)
+ return false;
+
+ if (x.get(7) != 2)
+ return false;
+
+ if (x.get(8) != 1)
+ return false;
+
+ return true;
+}
+
+class test06_functor {
+public:
+
+ inline void
+ operator()(Coefficient& x, const Coefficient& y) const {
+ x += y;
+ }
+
+ inline void
+ operator()(Coefficient& /* x */) const {
+ }
+};
+
+bool
+test06() {
+
+ Sparse_Row x(3);
+
+ x[1] = 0;
+ x[2] = 1;
+
+ // x: *01
+
+ x.combine(x, test06_functor(), test06_functor(), test06_functor());
+
+ // x: *02
+
+ if (x.find(0) != x.end())
+ return false;
+
+ if (x.get(1) != 0)
+ return false;
+
+ if (x.get(2) != 2)
+ return false;
+
+ return true;
+}
+
+class test07_functor_1 {
+public:
+
+ inline void
+ operator()(Coefficient& x, const Coefficient& y) const {
+ x = (x % 2) - (y % 2);
+ }
+
+ inline void
+ operator()(Coefficient& x) const {
+ x %= 2;
+ }
+};
+
+class test07_functor_2 {
+public:
+
+ inline void
+ operator()(Coefficient& x, const Coefficient& y) const {
+ PPL_ASSERT(x == 0);
+ x = -(y % 2);
+ }
+};
+
+bool
+test07() {
+
+ Sparse_Row x(16);
+
+ // 0123456789ABCDEF
+ // x: ****000011112222
+
+ x[ 4] = 0;
+ x[ 5] = 0;
+ x[ 6] = 0;
+ x[ 7] = 0;
+ x[ 8] = 1;
+ x[ 9] = 1;
+ x[10] = 1;
+ x[11] = 1;
+ x[12] = 2;
+ x[13] = 2;
+ x[14] = 2;
+ x[15] = 2;
+
+ Sparse_Row y(16);
+
+ // 0123456789ABCDEF
+ // y: *012*012*012*012
+
+ y[ 1] = 0;
+ y[ 2] = 1;
+ y[ 3] = 2;
+ y[ 5] = 0;
+ y[ 6] = 1;
+ y[ 7] = 2;
+ y[ 9] = 0;
+ y[10] = 1;
+ y[11] = 2;
+ y[13] = 0;
+ y[14] = 1;
+ y[15] = 2;
+
+ // x = (x % 2) - (y % 2)
+
+ x.combine(y, test07_functor_1(), test07_functor_1(), test07_functor_2());
+
+ // 0123456789ABCDEF
+ // x: ******-**1*1**-*
+ //
+ // Legend:
+ // *: unstored zero
+ // -: -1
+
+ if (x.find(0) != x.end()) return false;
+ if (x.find(1) != x.end()) return false;
+ if (x.get(2) != -1) return false;
+ if (x.find(3) != x.end()) return false;
+ if (x.find(4) != x.end()) return false;
+ if (x.find(5) != x.end()) return false;
+ if (x.get(6) != -1) return false;
+ if (x.find(7) != x.end()) return false;
+ if (x.get(8) != 1) return false;
+ if (x.get(9) != 1) return false;
+ if (x.find(10) != x.end()) return false;
+ if (x.get(11) != 1) return false;
+ if (x.find(12) != x.end()) return false;
+ if (x.find(13) != x.end()) return false;
+ if (x.get(14) != -1) return false;
+ if (x.find(15) != x.end()) return false;
+
+ return true;
+}
+
+bool
+test08() {
+
+ Sparse_Row row(4);
+
+ if (row.lower_bound(2) != row.end())
+ return false;
+
+ const Sparse_Row& crow = row;
+
+ if (crow.lower_bound(2) != crow.end())
+ return false;
+
+ row[2] = 3;
+
+ if (row.lower_bound(1).index() != 2)
+ return false;
+
+ if (crow.lower_bound(1).index() != 2)
+ return false;
+
+ if (row.lower_bound(2).index() != 2)
+ return false;
+
+ if (crow.lower_bound(2).index() != 2)
+ return false;
+
+ if (row.lower_bound(3) != row.end())
+ return false;
+
+ if (crow.lower_bound(3) != crow.end())
+ return false;
+
+ // Now the same checks with a dummy hint.
+
+ if (row.lower_bound(row.end(), 1).index() != 2)
+ return false;
+
+ if (crow.lower_bound(crow.end(), 1).index() != 2)
+ return false;
+
+ if (row.lower_bound(row.end(), 2).index() != 2)
+ return false;
+
+ if (crow.lower_bound(crow.end(), 2).index() != 2)
+ return false;
+
+ if (row.lower_bound(row.end(), 3) != row.end())
+ return false;
+
+ if (crow.lower_bound(crow.end(), 3) != crow.end())
+ return false;
+
+ return true;
+}
+
+bool
+test09() {
+ // These test the construction of a Sparse_Row from a Dense_Row.
+ {
+ Dense_Row dense(3);
+ Sparse_Row sparse(dense);
+ if (sparse.size() != dense.size())
+ return false;
+ if (sparse.begin() != sparse.end())
+ return false;
+ }
+
+ {
+ Dense_Row dense(5);
+ dense[1] = 2;
+ dense[3] = 4;
+ Sparse_Row sparse(dense);
+ if (sparse.size() != dense.size())
+ return false;
+ Sparse_Row::iterator itr = sparse.begin();
+
+ if (itr == sparse.end())
+ return false;
+ if (itr.index() != 1)
+ return false;
+ if (*itr != 2)
+ return false;
+
+ ++itr;
+
+ if (itr == sparse.end())
+ return false;
+ if (itr.index() != 3)
+ return false;
+ if (*itr != 4)
+ return false;
+
+ ++itr;
+
+ if (itr != sparse.end())
+ return false;
+ }
+
+ {
+ Dense_Row dense(5);
+ dense[0] = 1;
+ dense[2] = 3;
+ dense[4] = 5;
+ Sparse_Row sparse(dense);
+ if (sparse.size() != dense.size())
+ return false;
+ Sparse_Row::iterator itr = sparse.begin();
+
+ if (itr == sparse.end())
+ return false;
+ if (itr.index() != 0)
+ return false;
+ if (*itr != 1)
+ return false;
+
+ ++itr;
+
+ if (itr == sparse.end())
+ return false;
+ if (itr.index() != 2)
+ return false;
+ if (*itr != 3)
+ return false;
+
+ ++itr;
+
+ if (itr == sparse.end())
+ return false;
+ if (itr.index() != 4)
+ return false;
+ if (*itr != 5)
+ return false;
+
+ ++itr;
+
+ if (itr != sparse.end())
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+// A dummy test to avoid compiler warnings in BEGIN_MAIN.
+bool test01() {
+ return true;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
+
+#endif // !PPL_USE_SPARSE_MATRIX
diff --git a/tests/Polyhedron/termination1.cc b/tests/Polyhedron/termination1.cc
new file mode 100644
index 0000000..1e35daf
--- /dev/null
+++ b/tests/Polyhedron/termination1.cc
@@ -0,0 +1,536 @@
+/* Test the termination analysis facilities of the PPL.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 2);
+ ph.add_constraint(2*xp1 + 1 >= x1);
+ ph.add_constraint(2*xp1 <= x1);
+ ph.add_constraint(xp2 == x2 + 1);
+ ph.add_constraint(xp2 >= 1);
+
+ C_Polyhedron mu_space;
+ all_affine_ranking_functions_MS(ph, mu_space);
+
+ print_constraints(mu_space, "*** mu_space ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu0(2);
+ C_Polyhedron known_result(3);
+ known_result.add_constraint(mu1 - mu2 >= 1);
+ known_result.add_constraint(mu0 + 2*mu1 >= 0);
+ known_result.add_constraint(mu2 >= 0);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return known_result == mu_space;
+}
+
+bool
+test02() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 2);
+ ph.add_constraint(2*xp1 + 1 >= x1);
+ ph.add_constraint(2*xp1 <= x1);
+ ph.add_constraint(xp2 == x2 + 1);
+ ph.add_constraint(xp2 >= 1);
+
+ Generator witness(point());
+ one_affine_ranking_function_MS(ph, witness);
+
+ print_generator(witness, "*** witness ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu0(2);
+ Generator known_result(point(0*mu0 + 1*mu1 + 0*mu2));
+
+ print_generator(known_result, "*** known_result ***");
+
+ return known_result == witness;
+}
+
+bool
+test03() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 2);
+ ph.add_constraint(2*xp1 + 1 >= x1);
+ ph.add_constraint(2*xp1 <= x1);
+ ph.add_constraint(xp2 == x2 + 1);
+ ph.add_constraint(xp2 >= 1);
+
+ return termination_test_MS(ph);
+}
+
+bool
+test04() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 2);
+ ph.add_constraint(2*xp1 + 1 >= x1);
+ ph.add_constraint(2*xp1 <= x1);
+ ph.add_constraint(xp2 == x2 + 1);
+ ph.add_constraint(xp2 >= 1);
+
+ NNC_Polyhedron mu_space;
+ all_affine_ranking_functions_PR(ph, mu_space);
+
+ print_constraints(mu_space, "*** mu_space ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu0(2);
+ NNC_Polyhedron known_result(3);
+ known_result.add_constraint(mu1 - mu2 > 0);
+ known_result.add_constraint(mu2 >= 0);
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return known_result == mu_space;
+}
+
+bool
+test05() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 2);
+ ph.add_constraint(2*xp1 + 1 >= x1);
+ ph.add_constraint(2*xp1 <= x1);
+ ph.add_constraint(xp2 == x2 + 1);
+ ph.add_constraint(xp2 >= 1);
+
+ Generator witness(point());
+ one_affine_ranking_function_PR(ph, witness);
+
+ print_generator(witness, "*** witness ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu0(2);
+ Generator known_result(point(0*mu0 + 2*mu1 + 0*mu2));
+
+ print_generator(known_result, "*** known_result ***");
+
+ return known_result == witness;
+}
+
+bool
+test06() {
+ C_Polyhedron ph_before(2);
+ {
+ Variable x1(0);
+ Variable x2(1);
+ ph_before.add_constraint(-x1 <= -1);
+ ph_before.add_constraint(x1 - x2 <= 0);
+ }
+
+ C_Polyhedron ph_after(4);
+ {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ ph_after.add_constraint(x1 - x2 + xp2 <= 0);
+ ph_after.add_constraint(-x1 + x2 - xp2 <= 0);
+ }
+
+ return termination_test_PR_2(ph_before, ph_after);
+}
+
+bool
+test07() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ BD_Shape<int> bds(4);
+ bds.add_constraint(x1 >= 2);
+ bds.add_constraint(xp1 >= x1 - 2);
+ bds.add_constraint(xp1 <= x1 - 1);
+ bds.add_constraint(xp2 == x2 + 1);
+ bds.add_constraint(xp2 >= 1);
+
+ return termination_test_MS(bds) && termination_test_PR(bds);
+}
+
+bool
+test08() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(xp1 - x1 >= 0);
+ ph.add_constraint(-xp1 + x1 >= 0);
+ ph.add_constraint(-xp2 + x2 >= 1);
+ ph.add_constraint(xp2 >= 0);
+ ph.add_constraint(xp1 >= 1);
+
+ return termination_test_MS(ph);
+}
+
+bool
+test09() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(xp1 - x1 >= 0);
+ ph.add_constraint(-xp1 + x1 >= 0);
+ ph.add_constraint(-xp2 + x2 >= 1);
+ ph.add_constraint(xp2 >= 0);
+ ph.add_constraint(xp1 >= 1);
+
+ return termination_test_PR(ph);
+}
+
+bool
+test10() {
+ C_Polyhedron ph(10);
+ {
+ Variable x1(5);
+ Variable x2(6);
+ Variable x3(7);
+ Variable x4(8);
+ Variable x5(9);
+ ph.add_constraint(x4 >= 0);
+ ph.add_constraint(x2 - x3 - x4 >= 1);
+ }
+
+ {
+ Variable x1(5);
+ Variable x2(6);
+ Variable x3(7);
+ Variable x4(8);
+ Variable x5(9);
+
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable xp3(2);
+ Variable xp4(3);
+ Variable xp5(4);
+
+ ph.add_constraint(x4 - xp4 <= -1);
+ ph.add_constraint(x3 == xp3);
+ ph.add_constraint(x2 == xp2);
+ ph.add_constraint(x1 == xp1);
+ }
+
+ return termination_test_MS(ph);
+}
+
+bool
+test11() {
+ C_Polyhedron ph_before(5);
+ {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+ Variable x5(4);
+ ph_before.add_constraint(x4 >= 0);
+ ph_before.add_constraint(x2 - x3 - x4 >= 1);
+ }
+
+ C_Polyhedron ph_after(10);
+ {
+ Variable x1(5);
+ Variable x2(6);
+ Variable x3(7);
+ Variable x4(8);
+ Variable x5(9);
+
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable xp3(2);
+ Variable xp4(3);
+ Variable xp5(4);
+
+ ph_after.add_constraint(x4 - xp4 <= -1);
+ ph_after.add_constraint(x3 == xp3);
+ ph_after.add_constraint(x2 == xp2);
+ ph_after.add_constraint(x1 == xp1);
+ }
+
+ return termination_test_MS_2(ph_before, ph_after);
+}
+
+bool
+test12() {
+ C_Polyhedron ph_before(2);
+ {
+ Variable x1(0);
+ Variable x2(1);
+ ph_before.add_constraint(x1 >= 1);
+ ph_before.add_constraint(x2 <= 0);
+ }
+
+ C_Polyhedron ph_after(4);
+ {
+ Variable x1(2);
+ Variable x2(3);
+
+ Variable xp1(0);
+ Variable xp2(1);
+
+ ph_after.add_constraint(xp2 == 1);
+ ph_after.add_constraint(x1 - xp1 >= 1);
+ }
+
+ return termination_test_MS_2(ph_before, ph_after);
+}
+
+bool
+test13() {
+ C_Polyhedron ph_before(2);
+ {
+ Variable x1(0);
+ Variable x2(1);
+ ph_before.add_constraint(x1 >= 1);
+ ph_before.add_constraint(x2 <= 0);
+ }
+
+ C_Polyhedron ph_after(4);
+ {
+ Variable x1(2);
+ Variable x2(3);
+
+ Variable xp1(0);
+ Variable xp2(1);
+
+ ph_after.add_constraint(xp2 == 1);
+ ph_after.add_constraint(x1 - xp1 >= 1);
+ }
+
+ return termination_test_PR_2(ph_before, ph_after);
+}
+
+bool
+test14() {
+ C_Polyhedron ph(4);
+ {
+ Variable x1(2);
+ Variable x2(3);
+
+ Variable xp1(0);
+ Variable xp2(1);
+
+ ph.add_constraint(xp2 == 1);
+ ph.add_constraint(x1 >= 1);
+ ph.add_constraint(x1 - xp1 >= 1);
+ ph.add_constraint(x2 <= 0);
+ }
+
+ return termination_test_PR(ph);
+}
+
+
+bool
+test15() {
+ Variable xp1(0);
+ Variable x1(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x1 >= 3);
+ ph.add_constraint(xp1 >= 1);
+
+ return !termination_test_MS(ph);
+}
+
+bool
+test16() {
+ Variable xp1(0);
+ Variable x1(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x1 >= 3);
+ ph.add_constraint(xp1 >= 1);
+
+ return !termination_test_PR(ph);
+}
+
+bool
+test17() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 1);
+ ph.add_constraint(x2 >= 1);
+ ph.add_constraint(x1 - x2 <= -1);
+ ph.add_constraint(xp1 >= 1);
+ ph.add_constraint(xp2 >= 1);
+ ph.add_constraint(x1 == xp1);
+
+ return !termination_test_MS(ph);
+}
+
+bool
+test18() {
+ Variable xp1(0);
+ Variable xp2(1);
+ Variable x1(2);
+ Variable x2(3);
+ C_Polyhedron ph(4);
+ ph.add_constraint(x1 >= 1);
+ ph.add_constraint(x2 >= 1);
+ ph.add_constraint(x1 - x2 <= -1);
+ ph.add_constraint(xp1 >= 1);
+ ph.add_constraint(xp2 >= 1);
+ ph.add_constraint(x1 == xp1);
+
+ return !termination_test_PR(ph);
+}
+
+bool
+test19() {
+ Variable D(0);
+ Variable E(1);
+ Variable F(2);
+ Variable A(3);
+ Variable B(4);
+ Variable C(5);
+ C_Polyhedron ph(6);
+
+ ph.add_constraint(A == D);
+ ph.add_constraint(B == E);
+ ph.add_constraint(B - F >= 0);
+ ph.add_constraint(A - F >= 0);
+ ph.add_constraint(C >=0);
+ ph.add_constraint(C - F <= -1);
+
+ Generator witness(point());
+ one_affine_ranking_function_PR(ph, witness);
+
+ print_generator(witness, "*** witness ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu3(2);
+ Variable mu0(3);
+ Generator known_result(point(0*mu0 + 1*mu1 - 1*mu3));
+
+ print_generator(known_result, "*** known_result ***");
+
+ return known_result == witness;
+}
+
+bool
+test20() {
+ Variable D(0);
+ Variable E(1);
+ Variable F(2);
+ Variable A(3);
+ Variable B(4);
+ Variable C(5);
+ C_Polyhedron ph(6);
+
+ ph.add_constraint(A == D);
+ ph.add_constraint(B == E);
+ ph.add_constraint(B - F >= 0);
+ ph.add_constraint(A - F >= 0);
+ ph.add_constraint(C >=0);
+ ph.add_constraint(C - F <= -1);
+
+ Generator witness(point());
+ one_affine_ranking_function_MS(ph, witness);
+
+ print_generator(witness, "*** witness ***");
+
+ Variable mu1(0);
+ Variable mu2(1);
+ Variable mu3(2);
+ Variable mu0(3);
+ Generator known_result(point(-1*mu0 + 1*mu1 - 1*mu3));
+
+ print_generator(known_result, "*** known_result ***");
+
+ return known_result == witness;
+}
+
+bool
+test21() {
+ C_Polyhedron ph(2);
+ return !termination_test_PR(ph);
+}
+
+bool
+test22() {
+ C_Polyhedron ph(2);
+ NNC_Polyhedron mu_space;
+ all_affine_ranking_functions_PR(ph, mu_space);
+
+ print_constraints(ph, "*** ph ***");
+ return ph.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+ DO_TEST(test22);
+END_MAIN
diff --git a/tests/Polyhedron/termination2.cc b/tests/Polyhedron/termination2.cc
new file mode 100644
index 0000000..05a8c7e
--- /dev/null
+++ b/tests/Polyhedron/termination2.cc
@@ -0,0 +1,178 @@
+/* Test the termination analysis facilities of the PPL.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ C_Polyhedron ph1(2);
+ C_Polyhedron ph2(4);
+ bool ok1 = !termination_test_MS(ph1) && !termination_test_PR(ph1);
+ bool ok2 = !termination_test_MS_2(ph1, ph2)
+ && !termination_test_PR_2(ph1, ph2);
+ return ok1 && ok2;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(4, EMPTY);
+ bool ok1 = termination_test_MS(ph1) && termination_test_PR(ph1);
+ bool ok2 = termination_test_MS_2(ph1, ph2)
+ && termination_test_PR_2(ph1, ph2);
+ return ok1 && ok2;
+}
+
+bool
+test03() {
+ C_Polyhedron ph1(2);
+ C_Polyhedron ph2(4, EMPTY);
+ bool ok = termination_test_MS_2(ph1, ph2)
+ && termination_test_PR_2(ph1, ph2);
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(4);
+ bool ok = termination_test_PR_2(ph1, ph2);
+ ok = ok && termination_test_MS_2(ph1, ph2);
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph1(2);
+ C_Polyhedron ph2(4);
+ Generator witness(point());
+ bool ok = !one_affine_ranking_function_MS(ph1, witness);
+ ok = ok && !one_affine_ranking_function_PR(ph1, witness);
+ ok = ok && !one_affine_ranking_function_MS_2(ph1, ph2, witness);
+ ok = ok && !one_affine_ranking_function_PR_2(ph1, ph2, witness);
+ return ok;
+}
+
+bool
+test06() {
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(4, EMPTY);
+ Generator witness(point());
+ bool ok = one_affine_ranking_function_MS(ph1, witness);
+ ok = ok && one_affine_ranking_function_PR(ph1, witness);
+ ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+ ok = ok && one_affine_ranking_function_PR_2(ph1, ph2, witness);
+ return ok;
+}
+
+bool
+test07() {
+ C_Polyhedron ph1(2, EMPTY);
+ C_Polyhedron ph2(4);
+ Generator witness(point());
+ bool ok = one_affine_ranking_function_PR_2(ph1, ph2, witness);
+ ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+ return ok;
+}
+
+bool
+test08() {
+ C_Polyhedron ph1(2);
+ C_Polyhedron ph2(4, EMPTY);
+ Generator witness(point());
+ bool ok = one_affine_ranking_function_PR_2(ph1, ph2, witness);
+ ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+ return ok;
+}
+
+bool
+test09() {
+ C_Polyhedron ph1(2);
+ C_Polyhedron ph2(4);
+ C_Polyhedron c_mu_space;
+ NNC_Polyhedron nnc_mu_space;
+ all_affine_ranking_functions_MS(ph1, c_mu_space);
+ all_affine_ranking_functions_MS_2(ph1, ph2, c_mu_space);
+ all_affine_ranking_functions_PR(ph1, nnc_mu_space);
+ all_affine_ranking_functions_PR_2(ph1, ph2, nnc_mu_space);
+
+ C_Polyhedron c_known_result(3, EMPTY);
+ NNC_Polyhedron nnc_known_result(3, EMPTY);
+
+ print_constraints(ph1, "*** ph ***");
+ print_constraints(c_mu_space, "*** c_mu_space ***");
+ print_constraints(nnc_mu_space, "*** nnc_mu_space ***");
+ return ph1.OK() && (nnc_mu_space == nnc_known_result);
+}
+
+bool
+test10() {
+ C_Polyhedron ph_before(2, EMPTY);
+ C_Polyhedron ph_after(4, EMPTY);
+ C_Polyhedron c_mu_space;
+ NNC_Polyhedron nnc_mu_space;
+ C_Polyhedron c_known_result(3, UNIVERSE);
+ NNC_Polyhedron nnc_known_result(3, UNIVERSE);
+ bool ok = true;
+
+ all_affine_ranking_functions_MS(ph_after, c_mu_space);
+ ok &= (c_mu_space == c_known_result);
+
+ all_affine_ranking_functions_MS_2(ph_before, ph_after, c_mu_space);
+ ok &= (c_mu_space == c_known_result);
+
+// all_affine_ranking_functions_PR(ph_after, nnc_mu_space);
+// ok &= (nnc_mu_space == nnc_known_result);
+
+ all_affine_ranking_functions_PR_2(ph_before, ph_after, nnc_mu_space);
+ ok &= (nnc_mu_space == nnc_known_result);
+
+ print_constraints(ph_after, "*** ph_after ***");
+
+ print_generators(c_known_result.minimized_generators(),
+ "*** c_known_result ***");
+ print_generators(nnc_known_result.minimized_generators(),
+ "*** nnc_known_result ***");
+
+ print_generators(c_mu_space.minimized_generators(), "*** c_mu_space ***");
+ print_generators(nnc_mu_space.minimized_generators(), "*** nnc_mu_space ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc
new file mode 100644
index 0000000..588b14b
--- /dev/null
+++ b/tests/Polyhedron/timeelapse1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::time_elapse_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(x >= 1);
+ ph1.add_constraint(x <= 3);
+ ph1.add_constraint(y >= 1);
+ ph1.add_constraint(y <= 3);
+
+ C_Polyhedron ph2(2);
+ ph2.add_constraint(y == 5);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ C_Polyhedron known_result(2, EMPTY);
+ known_result.add_generator(point(y));
+ known_result.add_generator(ray(y));
+ known_result.add_generator(line(x));
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ C_Polyhedron ph1(0, EMPTY);
+ C_Polyhedron ph2;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ C_Polyhedron ph3(2, EMPTY);
+ C_Polyhedron ph4(2);
+
+ print_constraints(ph3, "*** ph3 ***");
+ print_constraints(ph4, "*** ph4 ***");
+
+ ph3.time_elapse_assign(ph4);
+
+ C_Polyhedron ph5(2);
+ C_Polyhedron ph6(2, EMPTY);
+
+ print_constraints(ph5, "*** ph5 ***");
+ print_constraints(ph6, "*** ph6 ***");
+
+ ph5.time_elapse_assign(ph6);
+
+ bool ok = ph1.is_empty() && ph3.is_empty() && ph5.is_empty();
+
+ print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+ print_generators(ph3, "*** ph3_time_elapse_assign(ph4) ***");
+ print_generators(ph5, "*** ph5_time_elapse_assign(ph6) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point(A));
+ gs1.insert(point(A + B));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(0*B));
+ C_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ C_Polyhedron known_result(ph1);
+
+ ph1.time_elapse_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1 ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ C_Polyhedron ph1;
+ C_Polyhedron ph2(0, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph1(2);
+ ph1.generators();
+ ph1.add_constraint(A == 0);
+ ph1.add_constraint(B == 0);
+
+ C_Polyhedron ph2(2);
+ ph2.generators();
+ ph2.add_constraint(A == 2);
+ ph2.add_constraint(B == 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ C_Polyhedron ph3(2, EMPTY);
+ ph3.add_generator(point());
+ ph3.constraints();
+
+ C_Polyhedron ph4(2, EMPTY);
+ ph4.add_generator(point(2*A + 2*B));
+
+ print_generators(ph3, "*** ph3 ***");
+ print_generators(ph4, "*** ph4 ***");
+
+ ph3.time_elapse_assign(ph4);
+
+ bool ok = (ph1 == ph3);
+
+ print_generators(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
+ print_generators(ph3, "*** after ph3.time_elapse_assign(ph4) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph1(2);
+
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(x + y - 2 <= 0);
+
+ C_Polyhedron ph2(2);
+
+ ph2.add_constraint(x == -1);
+ ph2.add_constraint(y == -1);
+
+ Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+ ps1.add_disjunct(ph1);
+ ps1.add_disjunct(ph2);
+
+ C_Polyhedron ph3(2);
+
+ ph3.add_constraint(x >= 2);
+ ph3.add_constraint(x <= 4);
+ ph3.add_constraint(y == 3);
+
+ Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+ ps2.add_disjunct(ph3);
+
+ print_constraints(ps1, "*** ps1 ***");
+ print_constraints(ps2, "*** ps2 ***");
+
+ ps1.time_elapse_assign(ps2);
+
+ Generator_System known_gs;
+ known_gs.insert(point());
+ known_gs.insert(point(2*x));
+ known_gs.insert(point(2*y));
+ known_gs.insert(ray(2*x + 3*y));
+ known_gs.insert(ray(4*x + 3*y));
+
+ C_Polyhedron known_ph1(known_gs);
+
+ known_gs.clear();
+ known_gs.insert(point(-x - y));
+ known_gs.insert(ray(2*x + 3*y));
+ known_gs.insert(ray(4*x + 3*y));
+ C_Polyhedron known_ph2(known_gs);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+ // Inserting out of order on purpose.
+ known_result.add_disjunct(known_ph2);
+ known_result.add_disjunct(known_ph1);
+
+ bool ok = (ps1 == known_result);
+
+ print_constraints(ps1, "*** ps1.time_elapse_assign(ps2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse2.cc b/tests/Polyhedron/timeelapse2.cc
new file mode 100644
index 0000000..a0d8f32
--- /dev/null
+++ b/tests/Polyhedron/timeelapse2.cc
@@ -0,0 +1,133 @@
+/* Test time_elapse_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+
+ ph1.add_constraint(x >= 0);
+ ph1.add_constraint(y >= 0);
+ ph1.add_constraint(x + y - 2 <= 0);
+
+ NNC_Polyhedron ph2(2);
+
+ ph2.add_constraint(x > 2);
+ ph2.add_constraint(x < 4);
+ ph2.add_constraint(y == 3);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ Generator_System known_gs;
+ known_gs.insert(point());
+ known_gs.insert(point(2*x));
+ known_gs.insert(point(2*y));
+ known_gs.insert(ray(2*x + 3*y));
+ known_gs.insert(ray(4*x + 3*y));
+
+ NNC_Polyhedron known_result(known_gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs1;
+ cs1.insert(x > 3);
+ cs1.insert(y > 3);
+ NNC_Polyhedron ph(cs1);
+
+ NNC_Polyhedron ph1(ph);
+
+ Generator_System gs;
+ gs.insert(point(x + y));
+ NNC_Polyhedron ph2(gs);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ bool ok = (ph1 == ph);
+
+ print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(x == 3);
+ ph1.add_constraint(y > 2);
+
+ NNC_Polyhedron ph2(2);
+ ph2.add_constraint(x > 3);
+ ph2.add_constraint(y > 2);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ ph1.time_elapse_assign(ph2);
+
+ Generator_System gs;
+ gs.insert(closure_point(3*x + 2*y));
+ gs.insert(point(3*x + 3*y));
+ gs.insert(ray(y));
+ gs.insert(ray(x));
+
+ NNC_Polyhedron known_result(gs);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosed1.cc b/tests/Polyhedron/topclosed1.cc
new file mode 100644
index 0000000..a2e6c79
--- /dev/null
+++ b/tests/Polyhedron/topclosed1.cc
@@ -0,0 +1,96 @@
+/* Test Polyhedron::is_topologically_closed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(A >= 0);
+
+ NNC_Polyhedron ph2(2, EMPTY);
+
+ NNC_Polyhedron ph3;
+
+ bool ok = ph1.is_topologically_closed()
+ && ph2.is_topologically_closed()
+ && ph3.is_topologically_closed();
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(ph3, "*** ph3 ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+
+ NNC_Polyhedron ph1(1, EMPTY);
+
+ Generator_System gs1;
+ gs1.insert(point(A));
+ gs1.insert(closure_point());
+ gs1.insert(closure_point(A));
+ ph1.add_generators(gs1);
+
+ bool ok = !ph1.is_topologically_closed();
+
+ print_generators(ph1, "*** ph1 ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs;
+ gs.insert(point(0*B));
+ gs.insert(closure_point(-A));
+ gs.insert(closure_point(A));
+ gs.insert(line(A));
+
+ NNC_Polyhedron ph(gs);
+
+ bool ok = ph.is_topologically_closed();
+
+ print_constraints(ph, "*** ph ***");
+ print_generators(ph, "*** ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosure1.cc b/tests/Polyhedron/topclosure1.cc
new file mode 100644
index 0000000..c41adf3
--- /dev/null
+++ b/tests/Polyhedron/topclosure1.cc
@@ -0,0 +1,161 @@
+/* Test Polyhedron::topological_closure_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph1(2);
+ ph1.add_constraint(A > 1);
+ ph1.add_constraint(A - B > 0);
+ Generator_System gs;
+ gs.insert(point(2*A));
+ gs.insert(closure_point(A + B));
+ gs.insert(ray(-B));
+ gs.insert(ray(A + B));
+ NNC_Polyhedron ph2(gs);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ ph1.topological_closure_assign();
+ ph2.topological_closure_assign();
+
+ bool ok = (ph1 == ph2);
+
+ print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+ print_generators(ph2, "*** after ph2.topological_closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ NNC_Polyhedron ph1;
+ NNC_Polyhedron ph2(2, EMPTY);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+
+ NNC_Polyhedron known_result1 = ph1;
+ NNC_Polyhedron known_result2 = ph2;
+
+ ph1.topological_closure_assign();
+ ph2.topological_closure_assign();
+
+ bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+ print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+ print_constraints(ph2, "*** after ph2.topological_closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A - B == 0);
+ ph.add_constraint(A >= 0);
+
+ C_Polyhedron known_result(ph);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.topological_closure_assign();
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.generators();
+ ph.add_constraint(A > 0);
+ ph.add_constraint(A == B);
+
+ print_constraints(ph, "*** ph ***");
+
+ ph.topological_closure_assign();
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(A == B);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point(A));
+ ph.constraints();
+ ph.add_generator(closure_point());
+ ph.add_generator(ray(A));
+ ph.add_generator(ray(B));
+
+ print_generators(ph, "*** ph ***");
+
+ ph.topological_closure_assign();
+
+ NNC_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/unconstrain1.cc b/tests/Polyhedron/unconstrain1.cc
new file mode 100644
index 0000000..dfb04e0
--- /dev/null
+++ b/tests/Polyhedron/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::unconstrain().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ print_generators(ph, "*** ph ***");
+
+ ph.unconstrain(A);
+
+ C_Polyhedron known_result(2, EMPTY);
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(A) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set vs(A, B);
+ ph.unconstrain(vs);
+
+ C_Polyhedron known_result(2, EMPTY);
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A == B);
+ ph.add_constraint(B >= 0);
+ print_generators(ph, "*** ph ***");
+
+ ph.unconstrain(B);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(B) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(A == B);
+ ph.add_constraint(B >= 0);
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set vs(B);
+ ph.unconstrain(vs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ C_Polyhedron ph(0, EMPTY);
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set vs;
+ ph.unconstrain(vs);
+
+ C_Polyhedron known_result(0, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ C_Polyhedron ph(0);
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set vs;
+ ph.unconstrain(vs);
+
+ C_Polyhedron known_result(0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ try {
+ C_Polyhedron ph(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ ph.unconstrain(Variable(7));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test08() {
+ try {
+ C_Polyhedron ph(1);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ Variables_Set vs(Variable(0), Variable(3));
+ ph.unconstrain(vs);
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ C_Polyhedron ph(5);
+ ph.add_constraint(A + 3*B - 7 == 9);
+ ph.add_constraint(A - 3*B - D + E >= 0);
+ ph.add_constraint(C <= D);
+ ph.add_constraint(E <= 2*B + D);
+ ph.add_constraint(E >= 0);
+ print_generators(ph, "*** ph ***");
+
+ Variables_Set vs(A, B);
+ vs.insert(D);
+ ph.unconstrain(vs);
+
+ C_Polyhedron known_result(5);
+ known_result.add_constraint(E >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ try {
+ C_Polyhedron ph(8);
+ // This is an invalid use of the method unconstrain(Variable):
+ // it is illegal to (try to) unconstrain a space dimension
+ // that is not in the polyhedron.
+ ph.unconstrain(Variable(8));
+
+ // It is an error if the exception is not thrown.
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ }
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/universe1.cc b/tests/Polyhedron/universe1.cc
new file mode 100644
index 0000000..0a53180
--- /dev/null
+++ b/tests/Polyhedron/universe1.cc
@@ -0,0 +1,165 @@
+/* Test Polyhedron::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ C_Polyhedron ph(3);
+ print_constraints(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return universe;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable z(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(x >= z);
+ ph.add_constraint(z == 3);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return !universe;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(y == 0);
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(x <= 3);
+
+ Constraint_System cs = ph.constraints();
+ print_constraints(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return !universe;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(x >= 1);
+ ph.add_constraint(y >= 1);
+ ph.add_constraint(x <= 4);
+ ph.add_constraint(y <= 4);
+
+ Constraint_System cs = ph.constraints();
+ print_constraints(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return !universe;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint(x - y - z >= 0);
+
+ print_constraints(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return !universe;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(ray(-x));
+ gs.insert(ray(x + y));
+ gs.insert(ray(x - y));
+
+ C_Polyhedron ph(gs);
+ print_generators(ph, "*** ph ***");
+
+ bool universe = ph.is_universe();
+
+ nout << "*** ph.is_universe() ***"
+ << endl
+ << (universe ? "true" : "false")
+ << endl;
+
+ return universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/universe2.cc b/tests/Polyhedron/universe2.cc
new file mode 100644
index 0000000..913f662
--- /dev/null
+++ b/tests/Polyhedron/universe2.cc
@@ -0,0 +1,80 @@
+/* Test the function is_universe() for a NNC_polyhedron.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ NNC_Polyhedron ph1(4);
+ NNC_Polyhedron ph2(3);
+ NNC_Polyhedron ph3(3);
+
+ ph2.add_constraint(Linear_Expression(1) > 0);
+ ph3.add_constraint(Linear_Expression(1) < 0);
+
+ Constraint_System cs;
+ NNC_Polyhedron ph4(cs);
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(ph2, "*** ph2 ***");
+ print_constraints(ph3, "*** ph3 ***");
+ print_constraints(ph4, "*** ph4 ***");
+
+ bool universe1 = ph1.is_universe();
+
+ nout << "*** ph1.is_universe() ***"
+ << endl
+ << (universe1 ? "true" : "false")
+ << endl;
+
+ bool universe2 = ph2.is_universe();
+
+ nout << "*** ph2.is_universe() ***"
+ << endl
+ << (universe2 ? "true" : "false")
+ << endl;
+
+ bool universe3 = ph3.is_universe();
+
+ nout << "*** ph3.is_universe() ***"
+ << endl
+ << (universe3 ? "true" : "false")
+ << endl;
+
+ bool universe4 = ph4.is_universe();
+
+ nout << "*** ph4.is_universe() ***"
+ << endl
+ << (universe4 ? "true" : "false")
+ << endl;
+
+ return universe1 && universe2 && !universe3 && universe4;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/variablesset1.cc b/tests/Polyhedron/variablesset1.cc
new file mode 100644
index 0000000..6c2881a
--- /dev/null
+++ b/tests/Polyhedron/variablesset1.cc
@@ -0,0 +1,160 @@
+/* Test the Variables_Set class.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+
+ Variables_Set v_set(A, F);
+ v_set.insert(C);
+ v_set.insert(B);
+ v_set.insert(G);
+
+ Variables_Set known_result(A, G);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** v_set ***" << endl << v_set << endl;
+ nout << "*** known_result ***" << endl << known_result << endl;
+
+ return v_set == known_result;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+
+ Variables_Set v_set(F, A);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** v_set ***" << endl << v_set << endl;
+
+ return v_set.empty();
+}
+
+bool
+test03() {
+ Variable first(Variable::max_space_dimension()-1);
+ Variable last(0);
+
+ Variables_Set v_set(first, last);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** v_set ***" << endl << v_set << endl;
+
+ return v_set.empty();
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+
+ Variables_Set vs1(A, C);
+ Variables_Set vs2(C, I);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** vs1 ***" << endl << vs1 << endl;
+ nout << "*** vs2 ***" << endl << vs2 << endl;
+
+ Variables_Set vs_union;
+ Variables_Set vs_difference;
+ Variables_Set vs_intersection;
+
+ std::set_union(vs1.begin(), vs1.end(),
+ vs2.begin(), vs2.end(),
+ std::inserter(vs_union, vs_union.begin()));
+ nout << "*** vs_union ***" << endl << vs_union << endl;
+ if (vs_union != Variables_Set(A, I))
+ return false;
+
+ std::set_difference(vs1.begin(), vs1.end(),
+ vs2.begin(), vs2.end(),
+ std::inserter(vs_difference, vs_difference.begin()));
+ nout << "*** vs_difference ***" << endl << vs_difference << endl;
+ if (vs_difference != Variables_Set(A, B))
+ return false;
+
+ std::set_intersection(vs1.begin(), vs1.end(),
+ vs2.begin(), vs2.end(),
+ std::inserter(vs_intersection,
+ vs_intersection.begin()));
+ nout << "*** vs_intersection ***" << endl << vs_intersection << endl;
+ if (vs_intersection != Variables_Set(C))
+ return false;
+
+ return true;
+}
+
+
+bool
+test05() {
+ Variable A(0);
+
+ Variables_Set v_set;
+
+ if (!v_set.empty())
+ return false;
+
+ v_set.insert(Variable(A));
+ if (v_set.space_dimension() != 1)
+ return false;
+
+ v_set.insert(Variable(Variable::max_space_dimension()-1));
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "*** v_set ***" << endl << v_set << endl;
+
+ return v_set.space_dimension() == Variable::max_space_dimension();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/watchdog1.cc b/tests/Polyhedron/watchdog1.cc
new file mode 100644
index 0000000..69f2f09
--- /dev/null
+++ b/tests/Polyhedron/watchdog1.cc
@@ -0,0 +1,141 @@
+/* Test the timeout facility of the library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+ NNC_Polyhedron hypercube(dimension);
+ for (dimension_type i = 0; i < dimension; ++i) {
+ Variable x(i);
+ hypercube.add_constraint(x > 0);
+ hypercube.add_constraint(x < 1);
+ }
+ (void) hypercube.generators();
+}
+
+class Timeout : virtual public std::exception,
+ public Parma_Polyhedra_Library::Throwable {
+public:
+ const char* what() const throw() {
+ return "timeout in watchdog1.cc";
+ }
+
+ void throw_me() const {
+ throw *this;
+ }
+
+ int priority() const {
+ return 0;
+ }
+
+ Timeout() {
+ }
+
+ ~Timeout() throw() {
+ }
+};
+
+Timeout t;
+
+bool
+timed_compute_open_hypercube_generators(dimension_type dimension, int csecs) {
+ try {
+ Parma_Polyhedra_Library::Watchdog
+ w(csecs, abandon_expensive_computations, t);
+
+ start_clock();
+
+ compute_open_hypercube_generators(dimension);
+ abandon_expensive_computations = 0;
+ return true;
+ }
+ catch (const Timeout& e) {
+ abandon_expensive_computations = 0;
+ nout << e.what() << " after ";
+ print_clock(nout);
+ nout << " s" << endl;
+ return false;
+ }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ // If Watchdog objects are not supported, an std::logic_error exception
+ // will be thrown: this is normal.
+ catch (const std::logic_error& e) {
+ nout << "std::logic_error exception caught: \n" << e.what() << std::endl;
+ exit(0);
+ }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ catch (const std::exception& e) {
+ nout << "unexpected std::exception caught: \n" << e.what() << endl;
+ exit(1);
+ }
+ catch (...) {
+ nout << "unexpected unknown exception caught" << endl;
+ exit(1);
+ }
+ // Should never get here.
+ return false;
+}
+
+} // namespace
+
+#define INIT_TIME 20
+
+int
+main() TRY {
+ set_handlers();
+
+ // Find a dimension that cannot be computed with a INIT_TIME timeout.
+ dimension_type dimension = 0;
+ do {
+ ++dimension;
+ nout << "Trying dimension " << dimension << endl;
+ } while (timed_compute_open_hypercube_generators(dimension, INIT_TIME));
+
+ // Now find an upper bound to the time necessary to compute it.
+ int upper_bound = INIT_TIME;
+ do {
+ upper_bound *= 2;
+ nout << "Trying upper bound " << upper_bound << endl;
+ } while (!timed_compute_open_hypercube_generators(dimension, upper_bound));
+
+ // Search the "exact" time.
+ int lower_bound = upper_bound/2;
+ do {
+ int test_time = (lower_bound+upper_bound)/2;
+ nout << "Probing " << test_time << endl;
+ if (timed_compute_open_hypercube_generators(dimension, test_time))
+ upper_bound = test_time;
+ else
+ lower_bound = test_time;
+ } while (upper_bound-lower_bound > 4);
+
+ nout << "Estimated time for dimension " << dimension
+ << ": " << (lower_bound+upper_bound)/2 << " 100th of sec" << endl;
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/weightwatch1.cc b/tests/Polyhedron/weightwatch1.cc
new file mode 100644
index 0000000..a5a3649
--- /dev/null
+++ b/tests/Polyhedron/weightwatch1.cc
@@ -0,0 +1,232 @@
+/* Test the weightwatch (i.e., deterministic timeout) facility of the library.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <stdexcept>
+
+namespace {
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher<Weightwatch_Traits> Weightwatch;
+
+class Deterministic_Timeout
+ : virtual public std::exception,
+ public Parma_Polyhedra_Library::Throwable {
+public:
+ const char* what() const throw() {
+ return "deterministic timeout in weightwatch1.cc";
+ }
+
+ void throw_me() const {
+ throw *this;
+ }
+
+ int priority() const {
+ return 0;
+ }
+
+ ~Deterministic_Timeout() throw() {
+ }
+};
+
+void too_fat() {
+ throw Deterministic_Timeout();
+}
+
+bool test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+
+ Constraint_System cs;
+ cs.insert(B + 8192*D - R == 0);
+ cs.insert(Q == 1);
+ cs.insert(B + 8192*D - P == 0);
+ cs.insert(O == 1);
+ cs.insert(B + 8192*D - I - 8192*N == 0);
+ cs.insert(I - M == 0);
+ cs.insert(L == 0);
+ cs.insert(B + 8192*D - I - 8192*K == 0);
+ cs.insert(J == 0);
+ cs.insert(H == 0);
+ cs.insert(D - G == 0);
+ cs.insert(B - F == 0);
+ cs.insert(E == 0);
+ cs.insert(C == 0);
+ cs.insert(A == 0);
+ // Blind relaxation of strict constraint B - I > 0.
+ cs.insert(B - I >= 0);
+ cs.insert(-B - 8192*D + I >= -67100672);
+ cs.insert(-B >= -8191);
+ cs.insert(I >= 0);
+ cs.insert(D >= 0);
+
+ C_Polyhedron ph(cs);
+ print_constraints(ph, "*** ph ***");
+
+ try {
+ Weightwatch ww(5000000, too_fat);
+ // Thanks to the blind relaxation of the strict inequality constraint,
+ // polyhedron ph is easily seen to contain an integer point.
+ const bool contains = ph.contains_integer_point();
+ nout << endl << "ph "
+ << (contains ? "contains" : "does not contain")
+ << " an integer point" << endl;
+ return contains;
+ }
+ // Note: other exceptions are just propagated.
+ catch (const Deterministic_Timeout& e) {
+ // Unexpected timeout exception.
+ nout << endl << e.what() << endl;
+ return false;
+ }
+ // Should never get here.
+ return false;
+}
+
+bool test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+ Variable F(5);
+ Variable G(6);
+ Variable H(7);
+ Variable I(8);
+ Variable J(9);
+ Variable K(10);
+ Variable L(11);
+ Variable M(12);
+ Variable N(13);
+ Variable O(14);
+ Variable P(15);
+ Variable Q(16);
+ Variable R(17);
+
+ Constraint_System cs;
+ cs.insert(B + 8192*D - R == 0);
+ cs.insert(Q == 1);
+ cs.insert(B + 8192*D - P == 0);
+ cs.insert(O == 1);
+ cs.insert(B + 8192*D - I - 8192*N == 0);
+ cs.insert(I - M == 0);
+ cs.insert(L == 0);
+ cs.insert(B + 8192*D - I - 8192*K == 0);
+ cs.insert(J == 0);
+ cs.insert(H == 0);
+ cs.insert(D - G == 0);
+ cs.insert(B - F == 0);
+ cs.insert(E == 0);
+ cs.insert(C == 0);
+ cs.insert(A == 0);
+ // Rewriting the strict constraint B - I > 0.
+ cs.insert(B - I >= 1);
+ cs.insert(-B - 8192*D + I >= -67100672);
+ cs.insert(-B >= -8191);
+ cs.insert(I >= 0);
+ cs.insert(D >= 0);
+
+ C_Polyhedron ph(cs);
+ print_constraints(ph, "*** ph ***");
+
+ try {
+ Weightwatch ww(2500000, too_fat);
+ // The branch-and-bound heuristics of the MIP solver behaves badly
+ // on this particular example, causing timeout to expire.
+ const bool contains = ph.contains_integer_point();
+ nout << endl
+ << "ph " << (contains ? "contains" : "does not contain")
+ << " an integer point" << endl;
+ return false;
+ }
+ // Note: other exceptions are just propagated.
+ catch (const Deterministic_Timeout& e) {
+ // Expected exception.
+ nout << endl << e.what() << endl;
+ return true;
+ }
+ // Should never get here.
+ return false;
+}
+
+bool test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(8192*A + B - 8192*C - D == 0);
+ cs.insert(D >= 0);
+ cs.insert(-B >= -8191);
+ cs.insert(B -D >= 1);
+ cs.insert(-B + 8192*C + D >= 0);
+ cs.insert(-C >= -8191);
+
+ C_Polyhedron ph(cs);
+ print_constraints(ph, "*** ph ***");
+
+ try {
+ Weightwatch ww(1000000000, too_fat);
+ // Polyhedron ph is the projection of the polyehdron of test01
+ // onto a lower dimensional space: the performance issue of previous
+ // test does not depend on high dimension vector space.
+ const bool contains = ph.contains_integer_point();
+ nout << endl
+ << "ph " << (contains ? "contains" : "does not contain")
+ << " an integer point" << endl;
+ return false;
+ }
+ // Note: other exceptions are just propagated.
+ catch (const Deterministic_Timeout& e) {
+ // Expected exception.
+ nout << endl << e.what() << endl;
+ return true;
+ }
+ // Should never get here.
+ return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F32(test01);
+ DO_TEST_F32(test02);
+ DO_TEST_F32(test03);
+END_MAIN
diff --git a/tests/Polyhedron/wrap1.cc b/tests/Polyhedron/wrap1.cc
new file mode 100644
index 0000000..d87faf2
--- /dev/null
+++ b/tests/Polyhedron/wrap1.cc
@@ -0,0 +1,626 @@
+/* Test Polyhedron::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(x + 24*y >= 3072);
+ known_result.add_constraint(193*x + 504*y <= 129792);
+ known_result.add_constraint(x - 8*y >= -1280);
+ known_result.add_constraint(x - 8*y <= -768);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= y);
+ known_result.add_constraint(x - 8*y >= -1280);
+ known_result.add_constraint(x - 8*y <= -1024);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(y >= 120);
+ known_result.add_constraint(y <= 184);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 120);
+ known_result.add_constraint(y <= 184);
+ known_result.add_constraint(x <= y);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(x + 1024 == 8*y);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(7*x <= 1024);
+ known_result.add_constraint(x + 1024 == 8*y);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 255);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y <= 255);
+ known_result.add_constraint(x <= y);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(x + 24*y >= 3072);
+ known_result.add_constraint(193*x + 504*y <= 129792);
+ known_result.add_constraint(x - 8*y >= -1280);
+ known_result.add_constraint(x - 8*y <= -768);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+ ph.add_constraint(-64 <= x);
+ ph.add_constraint(x <= 448);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= y);
+ known_result.add_constraint(x - 8*y >= -1280);
+ known_result.add_constraint(x - 8*y <= -1024);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 255);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x + 1024 == 8*y);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y <= 255);
+ known_result.add_constraint(x <= y);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 224);
+ ph.add_constraint(x-y <= 160);
+ ph.add_constraint(x+y <= 416);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 255);
+ known_result.add_constraint(+x-y <= 160);
+ known_result.add_constraint(+x+y <= 416);
+ known_result.add_constraint(x + 7*y >= 672);
+ known_result.add_constraint(x - 7*y >= -1120);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 224);
+ ph.add_constraint(x-y <= 160);
+ ph.add_constraint(x+y <= 416);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x <= y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 96);
+ known_result.add_constraint(-x+y >= 96);
+ known_result.add_constraint(+x+y <= 160);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ C_Polyhedron ph(1);
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars;
+
+ Variable x(0);
+ Constraint_System cs;
+ cs.insert(x == 10);
+
+ try {
+ // This is an invalid use of wrap_assign(): since `vars' is empty,
+ // `cs' can only contain 0-dimensional constraints.
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test16() {
+ C_Polyhedron ph(1);
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars;
+
+ Variable x(0);
+ Constraint_System cs;
+ cs.insert(Linear_Expression(0) == 1);
+ cs.insert(Linear_Expression(0) == 0);
+
+ try {
+ // This is a valid use of wrap_assign(): `vars' is empty,
+ // but `cs' only contains 0-dimensional constraints.
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "unexpected exception thrown: " << e.what() << endl << endl;
+ return false;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return ph.is_empty();
+}
+
+bool
+test17() {
+ C_Polyhedron ph(1);
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars;
+
+ Variable x(0);
+ Constraint_System cs;
+ cs.insert(Linear_Expression(0) == 0);
+
+ try {
+ // This is a valid use of wrap_assign(): `vars' is empty,
+ // but `cs' only contains 0-dimensional constraints.
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "unexpected exception thrown: " << e.what() << endl << endl;
+ return false;
+ }
+ catch (...) {
+ return false;
+ }
+
+ return ph.is_universe();
+}
+
+bool
+test18() {
+ C_Polyhedron ph(1);
+ print_constraints(ph, "*** ph ***");
+
+ Variable x(0);
+ Variable y(1);
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x == 10);
+
+ try {
+ // This is an invalid use of wrap_assign(): the space dimension
+ // of `vars' is higher than the space dimension of `ph'.
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ return true;
+ }
+ catch (...) {
+ }
+ return false;
+}
+
+bool
+test19() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x == 256);
+ ph.add_constraint(y == 256 + 256 + 1);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x + 1 == y);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x == 0);
+ known_result.add_constraint(y == 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*x >= 1);
+ ph.add_constraint(3*x <= 2);
+ ph.add_constraint(y >= 255);
+ ph.add_constraint(y <= 257);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x + y <= 100);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(2*x >= 1);
+ known_result.add_constraint(3*x <= 2);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F16(test01);
+ DO_TEST_F16(test02);
+ DO_TEST_F16A(test03);
+ DO_TEST_F8(test04);
+ DO_TEST_F16(test05);
+ DO_TEST_F16(test06);
+ DO_TEST_F8(test07);
+ DO_TEST_F8(test08);
+ DO_TEST_F16(test09);
+ DO_TEST_F16(test10);
+ DO_TEST_F8(test11);
+ DO_TEST_F8(test12);
+ DO_TEST_F16(test13);
+ DO_TEST_F8(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST_F8(test19);
+ DO_TEST_F8(test20);
+END_MAIN
diff --git a/tests/Polyhedron/wrap2.cc b/tests/Polyhedron/wrap2.cc
new file mode 100644
index 0000000..9e26ea6
--- /dev/null
+++ b/tests/Polyhedron/wrap2.cc
@@ -0,0 +1,99 @@
+/* Test Polyhedron::wrap_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 255);
+ ph.add_constraint(x <= 257);
+ ph.add_constraint(y >= 255);
+ ph.add_constraint(y <= 257);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x + y <= 100);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 1);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= 255);
+ ph.add_constraint(x <= 257);
+ ph.add_constraint(y >= 255);
+ ph.add_constraint(y <= 257);
+
+ print_constraints(ph, "*** ph ***");
+
+ Variables_Set vars(x, y);
+
+ Constraint_System cs;
+ cs.insert(x + y <= 100);
+
+ ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, true);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 0);
+ known_result.add_constraint(y <= 1);
+ known_result.add_constraint(x+y <= 100);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+ DO_TEST_F16(test02);
+END_MAIN
diff --git a/tests/Polyhedron/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc
new file mode 100644
index 0000000..1b15530
--- /dev/null
+++ b/tests/Polyhedron/writeconsys1.cc
@@ -0,0 +1,83 @@
+/* Test operator<<(std::ostream&, const Constraint_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A - 2*B > 2);
+ cs.insert(Linear_Expression(0) <= -7);
+ cs.insert(A == 2);
+
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << cs;
+ nout << "*** s << cs ***" << endl << s.str() << endl;
+ return s.str() == "A - 2*B > 2, 0 >= 1, A = 2";
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << cs;
+ nout << "*** s << cs ***" << endl << s.str() << endl;
+ return s.str() == "true";
+}
+
+bool
+test03() {
+ Variable A(0);
+
+ Constraint_System cs;
+ cs.insert(A > 2);
+ cs.insert(Linear_Expression(0) >= -1);
+ cs.insert(A == 2);
+
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << cs;
+ nout << "*** s << cs ***" << endl << s.str() << endl;
+ return s.str() == "A > 2, A = 2";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/writegensys1.cc b/tests/Polyhedron/writegensys1.cc
new file mode 100644
index 0000000..24a3086
--- /dev/null
+++ b/tests/Polyhedron/writegensys1.cc
@@ -0,0 +1,90 @@
+/* Test operator<<(std::ostream&, const Generator_System&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Generator_System gs;
+ gs.insert(point());
+ gs.insert(point(A - B));
+ gs.insert(point(A + C));
+ gs.insert(ray(B + C));
+ gs.insert(line(C));
+
+ std::stringstream s;
+ s << gs;
+
+ nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "p(0), p(A - B), p(A + C), r(B + C), l(C)";
+}
+
+bool
+test02() {
+ C_Polyhedron ph(3, EMPTY);
+
+ Generator_System gs = ph.generators();
+
+ std::stringstream s;
+ s << gs;
+
+ nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "false";
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Linear_Expression e1 = 2*A + 4;
+ e1 += B;
+ Generator_System gs;
+ gs.insert(ray(e1));
+ gs.insert(point(3*A + B, 2));
+
+ std::stringstream s;
+ s << gs;
+
+ nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "r(2*A + B), p((3*A + B)/2)";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron1.cc b/tests/Polyhedron/writepolyhedron1.cc
new file mode 100644
index 0000000..039509c
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron1.cc
@@ -0,0 +1,70 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ C_Polyhedron ph(3);
+ ph.add_constraint( A - B >= 3);
+ ph.add_constraint( - B + C >= 3);
+ ph.add_constraint( A - B <= 1);
+ ph.add_constraint( A - B + 3*C >= 3);
+ ph.add_constraint(3*A + 2*C >= 3);
+
+ std::stringstream s;
+ s << ph;
+
+ nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "false";
+}
+
+bool
+test02() {
+ NNC_Polyhedron ph1;
+
+ C_Polyhedron ph(ph1.constraints());
+
+ std::stringstream s;
+ s << ph;
+
+ nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "true";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron2.cc b/tests/Polyhedron/writepolyhedron2.cc
new file mode 100644
index 0000000..3022794
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron2.cc
@@ -0,0 +1,67 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ NNC_Polyhedron ph(4);
+
+ ph.add_constraint( +x2-x3-x4 <= 0);
+ ph.add_constraint(- x1 +x3-x4 < 0);
+ ph.add_constraint(+ x1 -x3-x4 <= 0);
+ ph.add_constraint(-2*x1+x2+x3-x4 < 0);
+ ph.add_constraint( +x4 <= 1);
+ ph.add_constraint( +x3 < 1);
+ ph.add_constraint(- x1+x2+x3 <= 1);
+ ph.add_constraint( -x3 < 0);
+ ph.add_constraint(- x1 <= 0);
+ ph.add_constraint( -x2 < 0);
+ ph.add_constraint( +x2 <= 1);
+ ph.add_constraint(+ x1 < 1);
+ ph.add_constraint(+ x1-x2+x3+x4 <= 2);
+
+ std::stringstream s;
+ s << ph;
+
+ nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+ return s.str() == "-A > -1, -A + C + D >= 0, -A + B - C - D >= -2, -B >= -1,"
+ " -B + C + D >= 0, -C > -1, -D >= -1, 2*A - B - C + D > 0, C > 0, B > 0,"
+ " A - B - C >= -1, A - C + D > 0, A >= 0";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/writerelation1.cc b/tests/Polyhedron/writerelation1.cc
new file mode 100644
index 0000000..5bc0158
--- /dev/null
+++ b/tests/Polyhedron/writerelation1.cc
@@ -0,0 +1,109 @@
+/* Test operator<<(std::ostream& s, const Poly_Con_Relation& r)
+ and operator<<(std::ostream& s, const Poly_Gen_Relation& r).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "NOTHING";
+}
+
+bool
+test02() {
+ Poly_Con_Relation rel = Poly_Con_Relation::is_disjoint();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "IS_DISJOINT";
+}
+
+bool
+test03() {
+ Poly_Con_Relation rel = Poly_Con_Relation::strictly_intersects();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "STRICTLY_INTERSECTS";
+}
+
+bool
+test04() {
+ Poly_Con_Relation rel = Poly_Con_Relation::is_included();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "IS_INCLUDED";
+}
+
+bool
+test05() {
+ Poly_Con_Relation rel = Poly_Con_Relation::saturates();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "SATURATES";
+}
+
+bool
+test06() {
+ Poly_Gen_Relation rel = Poly_Gen_Relation::nothing();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "NOTHING";
+}
+
+bool
+test07() {
+ Poly_Gen_Relation rel = Poly_Gen_Relation::subsumes();
+ std::stringstream s;
+ using namespace IO_Operators;
+ s << rel;
+ nout << s.str() << endl;
+ return s.str() == "SUBSUMES";
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/writevariable1.cc b/tests/Polyhedron/writevariable1.cc
new file mode 100644
index 0000000..79bd3ef
--- /dev/null
+++ b/tests/Polyhedron/writevariable1.cc
@@ -0,0 +1,104 @@
+/* Test operator<<(std::ostream& s, Variable v)
+ and the related machinery.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+const char* my_file = "writevariable1.dat";
+
+void
+write_variables() {
+ fstream f;
+ open(f, my_file, ios_base::out);
+ for (dimension_type id = 0; id <= 100; id += 5)
+ f << Variable(id) << " ";
+ f << endl;
+ close(f);
+}
+
+void
+read_variables_and_check(const string& s) {
+ fstream f;
+ open(f, my_file, ios_base::in);
+ string t;
+ getline(f, t);
+ close(f);
+ if (s != t)
+ exit(1);
+}
+
+void
+my_output_function(std::ostream& s, const Variable v) {
+ s << "x" << v.id();
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ // Default output function: write...
+ write_variables();
+ // ... read back.
+ read_variables_and_check("A F K P U Z E1 J1 O1 T1 Y1 "
+ "D2 I2 N2 S2 X2 C3 H3 M3 R3 W3 ");
+
+ // Save the default output function.
+ Variable::output_function_type* p_default_output_function
+ = Variable::get_output_function();
+
+ // Install an alternate output function.
+ Variable::set_output_function(my_output_function);
+
+ // Check that the installation worked as expected.
+ if (Variable::get_output_function() != my_output_function)
+ return 1;
+
+ // Alternate output function: write...
+ write_variables();
+ // ... read back.
+ read_variables_and_check("x0 x5 x10 x15 x20 x25 x30 x35 x40 x45 "
+ "x50 x55 x60 x65 x70 x75 x80 x85 x90 x95 x100 ");
+
+ // Restore the default output function.
+ Variable::set_output_function(p_default_output_function);
+
+ // Check that the restoration worked as expected.
+ if (Variable::get_output_function() != p_default_output_function)
+ return 1;
+
+ return 0;
+}
+CATCH
diff --git a/tests/Powerset/Makefile.am b/tests/Powerset/Makefile.am
new file mode 100644
index 0000000..16c6046
--- /dev/null
+++ b/tests/Powerset/Makefile.am
@@ -0,0 +1,192 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruences1 \
+addconstraints1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+bounded1 \
+bounds1 \
+closed1 \
+closure1 \
+collapse1 \
+concatenate1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+disjunct1 \
+empty1 \
+entails1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromcongruences1 \
+fromconstraints1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedimension1 \
+intersection1 \
+maxmin1 \
+meet1 \
+membytes1 \
+powerset1 \
+reduce1 \
+refinewith1 \
+relationwith1 \
+simplifyusingcontext1 \
+size1 \
+spacedims1 \
+universe1 \
+upperbound1
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+closed1_SOURCES = closed1.cc
+
+closure1_SOURCES = closure1.cc
+
+collapse1_SOURCES = collapse1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+disjunct1_SOURCES = disjunct1.cc
+
+empty1_SOURCES = empty1.cc
+
+entails1_SOURCES = entails1.cc
+
+equals1_SOURCES = equals1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromcongruences1_SOURCES = fromcongruences1.cc
+
+fromconstraints1_SOURCES = fromconstraints1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedimension1_SOURCES = fromspacedimension1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+meet1_SOURCES = meet1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+powerset1_SOURCES = powerset1.cc
+
+reduce1_SOURCES = reduce1.cc
+
+refinewith1_SOURCES = refinewith1.cc
+
+relationwith1_SOURCES = relationwith1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+size1_SOURCES = size1.cc
+
+spacedims1_SOURCES = spacedims1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+check_PROGRAMS = $(TESTS)
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Powerset/Makefile.in b/tests/Powerset/Makefile.in
new file mode 100644
index 0000000..7317ac0
--- /dev/null
+++ b/tests/Powerset/Makefile.in
@@ -0,0 +1,1932 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = addcongruences1$(EXEEXT) addconstraints1$(EXEEXT) \
+ affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+ affinepreimage1$(EXEEXT) bounded1$(EXEEXT) bounds1$(EXEEXT) \
+ closed1$(EXEEXT) closure1$(EXEEXT) collapse1$(EXEEXT) \
+ concatenate1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+ discrete1$(EXEEXT) disjoint1$(EXEEXT) disjunct1$(EXEEXT) \
+ empty1$(EXEEXT) entails1$(EXEEXT) equals1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+ fromcongruences1$(EXEEXT) fromconstraints1$(EXEEXT) \
+ fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+ frompolyhedron1$(EXEEXT) fromspacedimension1$(EXEEXT) \
+ intersection1$(EXEEXT) maxmin1$(EXEEXT) meet1$(EXEEXT) \
+ membytes1$(EXEEXT) powerset1$(EXEEXT) reduce1$(EXEEXT) \
+ refinewith1$(EXEEXT) relationwith1$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) size1$(EXEEXT) \
+ spacedims1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Powerset
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruences1$(EXEEXT) addconstraints1$(EXEEXT) \
+ affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+ affinepreimage1$(EXEEXT) bounded1$(EXEEXT) bounds1$(EXEEXT) \
+ closed1$(EXEEXT) closure1$(EXEEXT) collapse1$(EXEEXT) \
+ concatenate1$(EXEEXT) contains1$(EXEEXT) \
+ containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+ discrete1$(EXEEXT) disjoint1$(EXEEXT) disjunct1$(EXEEXT) \
+ empty1$(EXEEXT) entails1$(EXEEXT) equals1$(EXEEXT) \
+ frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+ fromcongruences1$(EXEEXT) fromconstraints1$(EXEEXT) \
+ fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+ frompolyhedron1$(EXEEXT) fromspacedimension1$(EXEEXT) \
+ intersection1$(EXEEXT) maxmin1$(EXEEXT) meet1$(EXEEXT) \
+ membytes1$(EXEEXT) powerset1$(EXEEXT) reduce1$(EXEEXT) \
+ refinewith1$(EXEEXT) relationwith1$(EXEEXT) \
+ simplifyusingcontext1$(EXEEXT) size1$(EXEEXT) \
+ spacedims1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT)
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_closed1_OBJECTS = closed1.$(OBJEXT)
+closed1_OBJECTS = $(am_closed1_OBJECTS)
+closed1_LDADD = $(LDADD)
+closed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_closure1_OBJECTS = closure1.$(OBJEXT)
+closure1_OBJECTS = $(am_closure1_OBJECTS)
+closure1_LDADD = $(LDADD)
+closure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_collapse1_OBJECTS = collapse1.$(OBJEXT)
+collapse1_OBJECTS = $(am_collapse1_OBJECTS)
+collapse1_LDADD = $(LDADD)
+collapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_disjunct1_OBJECTS = disjunct1.$(OBJEXT)
+disjunct1_OBJECTS = $(am_disjunct1_OBJECTS)
+disjunct1_LDADD = $(LDADD)
+disjunct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_entails1_OBJECTS = entails1.$(OBJEXT)
+entails1_OBJECTS = $(am_entails1_OBJECTS)
+entails1_LDADD = $(LDADD)
+entails1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromcongruences1_OBJECTS = fromcongruences1.$(OBJEXT)
+fromcongruences1_OBJECTS = $(am_fromcongruences1_OBJECTS)
+fromcongruences1_LDADD = $(LDADD)
+fromcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromconstraints1_OBJECTS = fromconstraints1.$(OBJEXT)
+fromconstraints1_OBJECTS = $(am_fromconstraints1_OBJECTS)
+fromconstraints1_LDADD = $(LDADD)
+fromconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_fromspacedimension1_OBJECTS = fromspacedimension1.$(OBJEXT)
+fromspacedimension1_OBJECTS = $(am_fromspacedimension1_OBJECTS)
+fromspacedimension1_LDADD = $(LDADD)
+fromspacedimension1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_meet1_OBJECTS = meet1.$(OBJEXT)
+meet1_OBJECTS = $(am_meet1_OBJECTS)
+meet1_LDADD = $(LDADD)
+meet1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_powerset1_OBJECTS = powerset1.$(OBJEXT)
+powerset1_OBJECTS = $(am_powerset1_OBJECTS)
+powerset1_LDADD = $(LDADD)
+powerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_reduce1_OBJECTS = reduce1.$(OBJEXT)
+reduce1_OBJECTS = $(am_reduce1_OBJECTS)
+reduce1_LDADD = $(LDADD)
+reduce1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_refinewith1_OBJECTS = refinewith1.$(OBJEXT)
+refinewith1_OBJECTS = $(am_refinewith1_OBJECTS)
+refinewith1_LDADD = $(LDADD)
+refinewith1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_relationwith1_OBJECTS = relationwith1.$(OBJEXT)
+relationwith1_OBJECTS = $(am_relationwith1_OBJECTS)
+relationwith1_LDADD = $(LDADD)
+relationwith1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES = \
+ $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_size1_OBJECTS = size1.$(OBJEXT)
+size1_OBJECTS = $(am_size1_OBJECTS)
+size1_LDADD = $(LDADD)
+size1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_spacedims1_OBJECTS = spacedims1.$(OBJEXT)
+spacedims1_OBJECTS = $(am_spacedims1_OBJECTS)
+spacedims1_LDADD = $(LDADD)
+spacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(addcongruences1_SOURCES) $(addconstraints1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affinepreimage1_SOURCES) $(bounded1_SOURCES) \
+ $(bounds1_SOURCES) $(closed1_SOURCES) $(closure1_SOURCES) \
+ $(collapse1_SOURCES) $(concatenate1_SOURCES) \
+ $(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(difference1_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(disjunct1_SOURCES) $(empty1_SOURCES) \
+ $(entails1_SOURCES) $(equals1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromcongruences1_SOURCES) \
+ $(fromconstraints1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(fromspacedimension1_SOURCES) $(intersection1_SOURCES) \
+ $(maxmin1_SOURCES) $(meet1_SOURCES) $(membytes1_SOURCES) \
+ $(powerset1_SOURCES) $(reduce1_SOURCES) $(refinewith1_SOURCES) \
+ $(relationwith1_SOURCES) $(simplifyusingcontext1_SOURCES) \
+ $(size1_SOURCES) $(spacedims1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES)
+DIST_SOURCES = $(addcongruences1_SOURCES) $(addconstraints1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affinepreimage1_SOURCES) $(bounded1_SOURCES) \
+ $(bounds1_SOURCES) $(closed1_SOURCES) $(closure1_SOURCES) \
+ $(collapse1_SOURCES) $(concatenate1_SOURCES) \
+ $(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+ $(difference1_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(disjunct1_SOURCES) $(empty1_SOURCES) \
+ $(entails1_SOURCES) $(equals1_SOURCES) $(frombdshape1_SOURCES) \
+ $(frombox1_SOURCES) $(fromcongruences1_SOURCES) \
+ $(fromconstraints1_SOURCES) $(fromgrid1_SOURCES) \
+ $(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+ $(fromspacedimension1_SOURCES) $(intersection1_SOURCES) \
+ $(maxmin1_SOURCES) $(meet1_SOURCES) $(membytes1_SOURCES) \
+ $(powerset1_SOURCES) $(reduce1_SOURCES) $(refinewith1_SOURCES) \
+ $(relationwith1_SOURCES) $(simplifyusingcontext1_SOURCES) \
+ $(size1_SOURCES) $(spacedims1_SOURCES) $(universe1_SOURCES) \
+ $(upperbound1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+closed1_SOURCES = closed1.cc
+closure1_SOURCES = closure1.cc
+collapse1_SOURCES = collapse1.cc
+concatenate1_SOURCES = concatenate1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+disjunct1_SOURCES = disjunct1.cc
+empty1_SOURCES = empty1.cc
+entails1_SOURCES = entails1.cc
+equals1_SOURCES = equals1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromcongruences1_SOURCES = fromcongruences1.cc
+fromconstraints1_SOURCES = fromconstraints1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedimension1_SOURCES = fromspacedimension1.cc
+intersection1_SOURCES = intersection1.cc
+maxmin1_SOURCES = maxmin1.cc
+meet1_SOURCES = meet1.cc
+membytes1_SOURCES = membytes1.cc
+powerset1_SOURCES = powerset1.cc
+reduce1_SOURCES = reduce1.cc
+refinewith1_SOURCES = refinewith1.cc
+relationwith1_SOURCES = relationwith1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+size1_SOURCES = size1.cc
+spacedims1_SOURCES = spacedims1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Powerset/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Powerset/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES)
+ @rm -f affinedimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+closed1$(EXEEXT): $(closed1_OBJECTS) $(closed1_DEPENDENCIES) $(EXTRA_closed1_DEPENDENCIES)
+ @rm -f closed1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(closed1_OBJECTS) $(closed1_LDADD) $(LIBS)
+
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) $(EXTRA_closure1_DEPENDENCIES)
+ @rm -f closure1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+
+collapse1$(EXEEXT): $(collapse1_OBJECTS) $(collapse1_DEPENDENCIES) $(EXTRA_collapse1_DEPENDENCIES)
+ @rm -f collapse1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(collapse1_OBJECTS) $(collapse1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES)
+ @rm -f containsintegerpoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES)
+ @rm -f difference1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+disjunct1$(EXEEXT): $(disjunct1_OBJECTS) $(disjunct1_DEPENDENCIES) $(EXTRA_disjunct1_DEPENDENCIES)
+ @rm -f disjunct1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(disjunct1_OBJECTS) $(disjunct1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+entails1$(EXEEXT): $(entails1_OBJECTS) $(entails1_DEPENDENCIES) $(EXTRA_entails1_DEPENDENCIES)
+ @rm -f entails1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(entails1_OBJECTS) $(entails1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES)
+ @rm -f frombdshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES)
+ @rm -f frombox1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromcongruences1$(EXEEXT): $(fromcongruences1_OBJECTS) $(fromcongruences1_DEPENDENCIES) $(EXTRA_fromcongruences1_DEPENDENCIES)
+ @rm -f fromcongruences1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromcongruences1_OBJECTS) $(fromcongruences1_LDADD) $(LIBS)
+
+fromconstraints1$(EXEEXT): $(fromconstraints1_OBJECTS) $(fromconstraints1_DEPENDENCIES) $(EXTRA_fromconstraints1_DEPENDENCIES)
+ @rm -f fromconstraints1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromconstraints1_OBJECTS) $(fromconstraints1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES)
+ @rm -f fromgrid1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES)
+ @rm -f fromoctagonalshape1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES)
+ @rm -f frompolyhedron1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedimension1$(EXEEXT): $(fromspacedimension1_OBJECTS) $(fromspacedimension1_DEPENDENCIES) $(EXTRA_fromspacedimension1_DEPENDENCIES)
+ @rm -f fromspacedimension1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fromspacedimension1_OBJECTS) $(fromspacedimension1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES)
+ @rm -f maxmin1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+meet1$(EXEEXT): $(meet1_OBJECTS) $(meet1_DEPENDENCIES) $(EXTRA_meet1_DEPENDENCIES)
+ @rm -f meet1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(meet1_OBJECTS) $(meet1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) $(EXTRA_powerset1_DEPENDENCIES)
+ @rm -f powerset1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+
+reduce1$(EXEEXT): $(reduce1_OBJECTS) $(reduce1_DEPENDENCIES) $(EXTRA_reduce1_DEPENDENCIES)
+ @rm -f reduce1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(reduce1_OBJECTS) $(reduce1_LDADD) $(LIBS)
+
+refinewith1$(EXEEXT): $(refinewith1_OBJECTS) $(refinewith1_DEPENDENCIES) $(EXTRA_refinewith1_DEPENDENCIES)
+ @rm -f refinewith1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(refinewith1_OBJECTS) $(refinewith1_LDADD) $(LIBS)
+
+relationwith1$(EXEEXT): $(relationwith1_OBJECTS) $(relationwith1_DEPENDENCIES) $(EXTRA_relationwith1_DEPENDENCIES)
+ @rm -f relationwith1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(relationwith1_OBJECTS) $(relationwith1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES)
+ @rm -f simplifyusingcontext1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+size1$(EXEEXT): $(size1_OBJECTS) $(size1_DEPENDENCIES) $(EXTRA_size1_DEPENDENCIES)
+ @rm -f size1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(size1_OBJECTS) $(size1_LDADD) $(LIBS)
+
+spacedims1$(EXEEXT): $(spacedims1_OBJECTS) $(spacedims1_DEPENDENCIES) $(EXTRA_spacedims1_DEPENDENCIES)
+ @rm -f spacedims1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spacedims1_OBJECTS) $(spacedims1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES)
+ @rm -f upperbound1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/collapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjunct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/entails1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/meet1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reduce1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewith1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relationwith1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/size1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+addcongruences1.log: addcongruences1$(EXEEXT)
+ @p='addcongruences1$(EXEEXT)'; \
+ b='addcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+ @p='addconstraints1$(EXEEXT)'; \
+ b='addconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinedimension1.log: affinedimension1$(EXEEXT)
+ @p='affinedimension1$(EXEEXT)'; \
+ b='affinedimension1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+ @p='affineimage1$(EXEEXT)'; \
+ b='affineimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+ @p='affinepreimage1$(EXEEXT)'; \
+ b='affinepreimage1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+ @p='bounded1$(EXEEXT)'; \
+ b='bounded1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+ @p='bounds1$(EXEEXT)'; \
+ b='bounds1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+closed1.log: closed1$(EXEEXT)
+ @p='closed1$(EXEEXT)'; \
+ b='closed1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+closure1.log: closure1$(EXEEXT)
+ @p='closure1$(EXEEXT)'; \
+ b='closure1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+collapse1.log: collapse1$(EXEEXT)
+ @p='collapse1$(EXEEXT)'; \
+ b='collapse1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+ @p='concatenate1$(EXEEXT)'; \
+ b='concatenate1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+ @p='contains1$(EXEEXT)'; \
+ b='contains1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+ @p='containsintegerpoint1$(EXEEXT)'; \
+ b='containsintegerpoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+difference1.log: difference1$(EXEEXT)
+ @p='difference1$(EXEEXT)'; \
+ b='difference1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+ @p='discrete1$(EXEEXT)'; \
+ b='discrete1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+ @p='disjoint1$(EXEEXT)'; \
+ b='disjoint1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disjunct1.log: disjunct1$(EXEEXT)
+ @p='disjunct1$(EXEEXT)'; \
+ b='disjunct1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+empty1.log: empty1$(EXEEXT)
+ @p='empty1$(EXEEXT)'; \
+ b='empty1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+entails1.log: entails1$(EXEEXT)
+ @p='entails1$(EXEEXT)'; \
+ b='entails1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+ @p='equals1$(EXEEXT)'; \
+ b='equals1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+ @p='frombdshape1$(EXEEXT)'; \
+ b='frombdshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+ @p='frombox1$(EXEEXT)'; \
+ b='frombox1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromcongruences1.log: fromcongruences1$(EXEEXT)
+ @p='fromcongruences1$(EXEEXT)'; \
+ b='fromcongruences1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromconstraints1.log: fromconstraints1$(EXEEXT)
+ @p='fromconstraints1$(EXEEXT)'; \
+ b='fromconstraints1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+ @p='fromgrid1$(EXEEXT)'; \
+ b='fromgrid1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+ @p='fromoctagonalshape1$(EXEEXT)'; \
+ b='fromoctagonalshape1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+ @p='frompolyhedron1$(EXEEXT)'; \
+ b='frompolyhedron1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+fromspacedimension1.log: fromspacedimension1$(EXEEXT)
+ @p='fromspacedimension1$(EXEEXT)'; \
+ b='fromspacedimension1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+ @p='intersection1$(EXEEXT)'; \
+ b='intersection1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+ @p='maxmin1$(EXEEXT)'; \
+ b='maxmin1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+meet1.log: meet1$(EXEEXT)
+ @p='meet1$(EXEEXT)'; \
+ b='meet1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+ @p='membytes1$(EXEEXT)'; \
+ b='membytes1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+powerset1.log: powerset1$(EXEEXT)
+ @p='powerset1$(EXEEXT)'; \
+ b='powerset1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+reduce1.log: reduce1$(EXEEXT)
+ @p='reduce1$(EXEEXT)'; \
+ b='reduce1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewith1.log: refinewith1$(EXEEXT)
+ @p='refinewith1$(EXEEXT)'; \
+ b='refinewith1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+relationwith1.log: relationwith1$(EXEEXT)
+ @p='relationwith1$(EXEEXT)'; \
+ b='relationwith1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+ @p='simplifyusingcontext1$(EXEEXT)'; \
+ b='simplifyusingcontext1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+size1.log: size1$(EXEEXT)
+ @p='size1$(EXEEXT)'; \
+ b='size1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+spacedims1.log: spacedims1$(EXEEXT)
+ @p='spacedims1$(EXEEXT)'; \
+ b='spacedims1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+universe1.log: universe1$(EXEEXT)
+ @p='universe1$(EXEEXT)'; \
+ b='universe1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+ @p='upperbound1$(EXEEXT)'; \
+ b='upperbound1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Powerset/addcongruences1.cc b/tests/Powerset/addcongruences1.cc
new file mode 100644
index 0000000..5053689
--- /dev/null
+++ b/tests/Powerset/addcongruences1.cc
@@ -0,0 +1,68 @@
+/* Test Pointset_Powerset<PH>::add_congruence().
+ Pointset_Powerset<PH>::add_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_congruence().
+bool
+test01() {
+ Variable x(0);
+ Congruence cg = (Linear_Expression(0) %= 0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_congruence(cg);
+ Congruence cg1 = ((Linear_Expression(25) %= 1) / 2);
+ ps.add_congruence(cg1);
+ bool ok = !ps.is_empty() && ps.OK();
+ return ok;
+}
+
+// Powerset of C polyhedra: add_congruences().
+bool
+test02() {
+ Variable x(0);
+ Congruence_System cgs;
+ cgs.insert((x %= 0) / 0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_congruences(cgs);
+ cgs.insert((x %= 0) / 0);
+ ps.add_congruences(cgs);
+ bool ok = !ps.is_empty();
+ cgs.insert((x %= 0) / 0);
+ cgs.insert((x %= 1) / 0);
+ ps.add_congruences(cgs);
+ ok &= ps.is_empty() && ps.OK();
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/addconstraints1.cc b/tests/Powerset/addconstraints1.cc
new file mode 100644
index 0000000..664ad47
--- /dev/null
+++ b/tests/Powerset/addconstraints1.cc
@@ -0,0 +1,69 @@
+/* Test Pointset_Powerset<PH>::add_constraint().
+ Pointset_Powerset<PH>::add_constraints().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_constraint().
+bool
+test01() {
+ Variable x(0);
+ Constraint c = (x >= 0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_constraint(c);
+ Constraint c1 = (x >= 1);
+ ps.add_constraint(c1);
+ bool ok = !ps.is_empty();
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: add_constraints().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ cs.insert(x >= 3);
+ cs.insert(x <= 4);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_constraints(cs);
+ cs.insert(x <= 3);
+ ps.add_constraints(cs);
+ bool ok = !ps.is_empty();
+ cs.insert(x <= 2);
+ ps.add_constraints(cs);
+ ok &= ps.is_empty();
+
+ return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/affinedimension1.cc b/tests/Powerset/affinedimension1.cc
new file mode 100644
index 0000000..8c0d0c9
--- /dev/null
+++ b/tests/Powerset/affinedimension1.cc
@@ -0,0 +1,139 @@
+/* Test Pointset_Powerset<PH>::affine_dimension().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: affine_dimension().
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(3, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ cs.insert(z <= 2);
+ cs.insert(z >= 2);
+ C_Polyhedron ph(3);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ cs1.insert(x == 6);
+ C_Polyhedron ph1(3);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ dimension_type d = c_ps.affine_dimension();
+
+ bool ok = (d == 3);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ print_constraints(phi, "*** phi ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ c_ps.add_constraint(z == 2);
+
+ dimension_type d1 = c_ps.affine_dimension();
+
+ bool ok1 = (d1 == 2);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator j = c_ps.begin();
+ C_Polyhedron phj = j->pointset();
+ j++;
+ C_Polyhedron phj1 = j->pointset();
+
+ print_constraints(phj, "*** phj ***");
+ print_constraints(phj1, "*** phj1 ***");
+
+ return ok && ok1;
+}
+
+// Powerset of NNC polyhedra: affine_dimension().
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(1);
+ Pointset_Powerset<NNC_Polyhedron> c_ps(3, EMPTY);
+ Constraint_System cs;
+ cs.insert(x > 0);
+ cs.insert(x <= 2);
+ cs.insert(z <= 2);
+ cs.insert(z >= 2);
+ NNC_Polyhedron ph(3);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ cs1.insert(x == 6);
+ NNC_Polyhedron ph1(3);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ dimension_type d = c_ps.affine_dimension();
+
+ bool ok = (d == 3);
+
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator i = c_ps.begin();
+ NNC_Polyhedron phi = i->pointset();
+ i++;
+ NNC_Polyhedron phi1 = i->pointset();
+
+ print_constraints(phi, "*** phi ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ c_ps.add_constraint(z == 2);
+
+ dimension_type d1 = c_ps.affine_dimension();
+
+ bool ok1 = (d1 == 2);
+
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator j = c_ps.begin();
+ NNC_Polyhedron phj = j->pointset();
+ j++;
+ NNC_Polyhedron phj1 = j->pointset();
+
+ print_constraints(phj, "*** phj ***");
+ print_constraints(phj1, "*** phj1 ***");
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/affineimage1.cc b/tests/Powerset/affineimage1.cc
new file mode 100644
index 0000000..41d6db4
--- /dev/null
+++ b/tests/Powerset/affineimage1.cc
@@ -0,0 +1,240 @@
+/* Test Pointset_Powerset<PH>::affine_image(),
+ Pointset_Powerset<PH>::generalized_affine_image(),
+ Pointset_Powerset<PH>::bounded_affine_image().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: affine_image().
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.affine_image(x, x + y);
+
+ ph.affine_image(x, x + y);
+ ph1.affine_image(x, x + y);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: affine_image() and intersection_assign().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<TBox> ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps1.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x < 1);
+ ps1.add_disjunct(TBox(cs));
+
+ Pointset_Powerset<TBox> ps2(ps1);
+ ps2.affine_image(x, 2*x+1, 2);
+
+ print_constraints(ps1, "*** ps1 ***");
+ print_constraints(ps2, "*** ps2 ***");
+
+ ps1.intersection_assign(ps2);
+
+ Pointset_Powerset<TBox> known_result(1, EMPTY);
+ TBox box(1);
+ box.add_constraint(2*x >= 1);
+ box.add_constraint(2*x <= 2);
+ known_result.add_disjunct(box);
+
+ bool ok = (ps1 == known_result);
+
+ print_constraints(ps1, "*** ps1.intersect_assign(ps2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Powerset of Boxes: affine_image().
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Pointset_Powerset<TBox> ps(3, EMPTY);
+ for (int i = -10; i <= 9; ++i) {
+ TBox pps_box(3, UNIVERSE);
+ pps_box.add_constraint(i <= x);
+ pps_box.add_constraint(x <= i+1);
+ const TBox::interval_type& ix = pps_box.get_interval(x);
+ TBox::interval_type iy = ix*ix;
+ pps_box.set_interval(y, iy);
+ ps.add_disjunct(pps_box);
+ }
+
+ print_constraints(ps, "*** ps ***");
+
+ ps.affine_image(z, y+2*x+1, 2);
+
+ print_constraints(ps, "*** ps ***");
+
+ return ps.OK();
+}
+
+// Powerset of polyhedra: generalized_affine_image(
+// const Linear_Expression&,
+// Relation_Symbol relsym,
+// const Linear_Expression&).
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+ ph.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+ ph1.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+// Powerset of polyhedra: bounded_affine_image(
+// Variable,
+// Relation_Symbol relsym,
+// const Linear_Expression&,
+// Coefficient_traits::const_reference)..
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+ ph.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+ ph1.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/affinepreimage1.cc b/tests/Powerset/affinepreimage1.cc
new file mode 100644
index 0000000..04f4158
--- /dev/null
+++ b/tests/Powerset/affinepreimage1.cc
@@ -0,0 +1,172 @@
+/* Test Pointset_Powerset<PH>::affine_preimage(),
+ Pointset_Powerset<PH>::generalized_affine_preimage(),
+ Pointset_Powerset<PH>::bounded_affine_preimage().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: affine_preimage().
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.affine_preimage(x, x + y);
+
+ ph.affine_preimage(x, x + y);
+ ph1.affine_preimage(x, x + y);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+// Powerset of polyhedra: generalized_affine_preimage(
+// const Linear_Expression&,
+// Relation_Symbol relsym,
+// const Linear_Expression&).
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+ ph.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+ ph1.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+// Powerset of polyhedra: bounded_affine_preimage(
+// Variable,
+// Relation_Symbol relsym,
+// const Linear_Expression&,
+// Coefficient_traits::const_reference).
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ c_ps.bounded_affine_preimage(y, x, 2*y, 5);
+
+ ph.bounded_affine_preimage(y, x, 2*y, 5);
+ ph1.bounded_affine_preimage(y, x, 2*y, 5);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/bounded1.cc b/tests/Powerset/bounded1.cc
new file mode 100644
index 0000000..4cae2ad
--- /dev/null
+++ b/tests/Powerset/bounded1.cc
@@ -0,0 +1,78 @@
+/* Test Pointset_Powerset<PH>::is_bounded().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_bounded().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ bool b = ps.is_bounded();
+
+ ps.add_disjunct(C_Polyhedron(0));
+ // A zero-dimension universe is bounded.
+ bool b1 = ps.is_bounded();
+ return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_bounded().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 2);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = !ps.is_bounded();
+ return b;
+}
+
+// Powerset of C polyhedra: is_bounded().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ bool b = ps.is_bounded();
+
+ ps.add_disjunct(C_Polyhedron(1));
+
+ bool b1 = !ps.is_bounded();
+ return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/bounds1.cc b/tests/Powerset/bounds1.cc
new file mode 100644
index 0000000..2f09478
--- /dev/null
+++ b/tests/Powerset/bounds1.cc
@@ -0,0 +1,97 @@
+/* Test Pointset_Powerset<PH>::bounds_from_above(),
+ Pointset_Powerset<PH>::bounds_from_below().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ Linear_Expression LE;
+ bool ok1 = ps.bounds_from_above(LE);
+ bool ok2 = ps.bounds_from_below(LE);
+
+ if (!ok1 || !ok2)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(0));
+ ok1 = ps.bounds_from_above(LE);
+ ok2 = ps.bounds_from_below(LE);
+
+ return ok1 && ok2;
+}
+
+// Powerset of NNC polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+ Linear_Expression LE = x;
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x > 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool ok1 = !ps.bounds_from_above(LE);
+ bool ok2 = ps.bounds_from_below(LE);
+
+ return ok1 && ok2;
+}
+
+// Powerset of C polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test03() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ Linear_Expression LE = x;
+
+ bool ok1 = ps.bounds_from_above(LE);
+ bool ok2 = ps.bounds_from_below(LE);
+
+ if (!ok1 || !ok2)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(1));
+
+ ok1 = !ps.bounds_from_above(LE);
+ ok2 = !ps.bounds_from_below(LE);
+
+ return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/closed1.cc b/tests/Powerset/closed1.cc
new file mode 100644
index 0000000..60cbfb3
--- /dev/null
+++ b/tests/Powerset/closed1.cc
@@ -0,0 +1,100 @@
+/* Test Pointset_Powerset<PH>::is_topologically_closed().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_topologically_closed().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ bool b = ps.is_topologically_closed();
+
+ ps.add_disjunct(C_Polyhedron(0));
+ bool b1 = ps.is_topologically_closed();
+ return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_topologically_closed().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = ps.is_topologically_closed();
+ return b;
+}
+
+// Powerset of NNC polyhedra: is_topologically_closed().
+bool
+test03() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x < 2);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = !ps.is_topologically_closed();
+ return b;
+}
+
+// Powerset of C polyhedra: is_topologically_closed().
+bool
+test04() {
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ bool b = ps.is_topologically_closed();
+
+ ps.add_disjunct(C_Polyhedron(1));
+
+ bool b1 = ps.is_topologically_closed();
+ return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/closure1.cc b/tests/Powerset/closure1.cc
new file mode 100644
index 0000000..524debc
--- /dev/null
+++ b/tests/Powerset/closure1.cc
@@ -0,0 +1,59 @@
+/* Test Pointset_Powerset<PH>::topological_closure_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: topological_closure_assign().
+
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<NNC_Polyhedron> ps(1);
+ Constraint_System cs;
+ cs.clear();
+ cs.insert(x > 5);
+ cs.insert(x > 8);
+ ps.add_constraints(cs);
+
+ ps.topological_closure_assign();
+
+ bool ok = ps.OK();
+
+ Pointset_Powerset<NNC_Polyhedron> known_ps(1);
+ cs.clear();
+ cs.insert(x >= 5);
+ cs.insert(x >= 8);
+ known_ps.add_constraints(cs);
+
+ ok = ok && ps.contains(known_ps);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Powerset/collapse1.cc b/tests/Powerset/collapse1.cc
new file mode 100644
index 0000000..fe1a92f
--- /dev/null
+++ b/tests/Powerset/collapse1.cc
@@ -0,0 +1,95 @@
+/* Test Pointset_Powerset<PH>::collapse().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: collapse().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ c_ps.collapse();
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+ c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.definitely_entails(c_ps_expected);
+ bool ok1 = c_ps_expected.definitely_entails(c_ps);
+ bool ok2 = (c_ps.size() == 1);
+
+ return ok && ok1 && ok2;
+}
+
+// Powerset of boxes: collapse().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ pps_box.add_disjunct(TBox(cs));
+
+ pps_box.collapse();
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+ pps_box_expected.add_disjunct(TBox(cs));
+
+ bool ok = pps_box.definitely_entails(pps_box_expected);
+ bool ok1 = pps_box_expected.definitely_entails(pps_box);
+ bool ok2 = (pps_box.size() == 1);
+
+ return ok && ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/concatenate1.cc b/tests/Powerset/concatenate1.cc
new file mode 100644
index 0000000..235d98b
--- /dev/null
+++ b/tests/Powerset/concatenate1.cc
@@ -0,0 +1,75 @@
+/* Test Pointset_Powerset<PH>::concatenate().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: concatenate_assign().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ c_ps.concatenate_assign(c_ps);
+
+ return c_ps.OK();
+}
+
+// Powerset of boxes: concatenate_assign().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ pps_box.add_disjunct(TBox(cs));
+
+ pps_box.concatenate_assign(pps_box);
+
+ return pps_box.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/contains1.cc b/tests/Powerset/contains1.cc
new file mode 100644
index 0000000..5c38033
--- /dev/null
+++ b/tests/Powerset/contains1.cc
@@ -0,0 +1,109 @@
+/* Test Pointset_Powerset<PH>::contains(),
+ Pointset_Powerset<PH>::strictly_contains().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: contains(), strictly_contains().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+ bool b = ps1.contains(ps2);
+ bool c = ps2.contains(ps1);
+ bool bs = ps1.strictly_contains(ps2);
+ bool cs = ps2.strictly_contains(ps1);
+
+ ps1.add_disjunct(C_Polyhedron(1));
+ bool b1 = ps1.contains(ps2);
+ bool c1 = !ps2.contains(ps1);
+ bool bs1 = ps1.strictly_contains(ps2);
+ bool cs1 = !ps2.strictly_contains(ps1);
+
+ ps2.add_disjunct(C_Polyhedron(1));
+ bool b2 = ps1.contains(ps2);
+ bool c2 = ps2.contains(ps1);
+ bool bs2 = !ps1.strictly_contains(ps2);
+ bool cs2 = !ps2.strictly_contains(ps1);
+
+ bool ok = b && c && b1 && c1 && b2 && c2;
+ bool oks = bs && cs && bs1 && cs1 && bs2 && cs2;
+
+ return ok && oks;
+}
+
+// Powerset of C polyhedra: contains(), strictly_contains().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 4);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.contains(c_ps1)
+ && !c_ps1.contains(c_ps)
+ && c_ps.strictly_contains(c_ps1)
+ && !c_ps1.strictly_contains(c_ps);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 4);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+
+ bool ok1 = c_ps.contains(c_ps1)
+ && !c_ps1.contains(c_ps)
+ && !c_ps.strictly_contains(c_ps1)
+ && !c_ps1.strictly_contains(c_ps);
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/containsintegerpoint1.cc b/tests/Powerset/containsintegerpoint1.cc
new file mode 100644
index 0000000..18dd0ef
--- /dev/null
+++ b/tests/Powerset/containsintegerpoint1.cc
@@ -0,0 +1,132 @@
+/* Test Pointset_Powerset<PH>::contains_integer_point(),
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: contains_integer_point() returns false.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Pointset_Powerset<C_Polyhedron> ps(2);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(4*y <= 3);
+ cs.insert(4*y >= 1);
+
+ ps.refine_with_constraints(cs);
+
+ bool contains = ps.contains_integer_point();
+
+ print_constraints(ps, "*** ps ***");
+ nout << "ps.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+// Powerset of C polyhedra: contains_integer_point() returns true.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ Pointset_Powerset<C_Polyhedron> ps(3);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(4*z - 4*y >= 3);
+
+ ps.refine_with_constraints(cs);
+
+ print_constraints(ps, "*** ps ***");
+
+ bool contains = ps.contains_integer_point();
+
+ nout << "ps.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+// Empty 0-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+ print_constraints(ps, "*** ps ***");
+
+ bool contains = ps.contains_integer_point();
+
+ nout << "ps.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+// Universe 0-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test04() {
+ Pointset_Powerset<C_Polyhedron> ps(0);
+
+ bool contains = ps.contains_integer_point();
+
+ print_constraints(ps, "*** ps ***");
+
+ nout << "ps.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return contains;
+}
+
+// Empty 1-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test05() {
+ Pointset_Powerset<C_Polyhedron> ps(1);
+
+ ps.refine_with_constraint(Linear_Expression(0) == 1);
+
+ bool contains = ps.contains_integer_point();
+
+ print_constraints(ps, "*** ps ***");
+
+ nout << "ps.contains_integer_point() == "
+ << (contains ? "true" : "false") << endl;
+
+ return !contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/difference1.cc b/tests/Powerset/difference1.cc
new file mode 100644
index 0000000..543754a
--- /dev/null
+++ b/tests/Powerset/difference1.cc
@@ -0,0 +1,151 @@
+/* Test Pointset_Powerset<PH>::difference_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: difference_assign().
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+ Pointset_Powerset<C_Polyhedron> c_ps2(2);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ c_ps2.add_constraints(cs);
+
+ using namespace IO_Operators;
+ c_ps1.difference_assign(c_ps2);
+
+ nout << c_ps1 << endl;
+
+ return true;
+}
+
+// Powerset of C polyhedra: difference_assign().
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+ Pointset_Powerset<C_Polyhedron> c_ps2(2);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ cs.insert(y >= 0);
+ cs.insert(y <= 1);
+ c_ps2.add_constraints(cs);
+
+ using namespace IO_Operators;
+ c_ps1.difference_assign(c_ps2);
+
+ nout << c_ps1 << endl;
+
+ return true;
+}
+
+// Creating a rectangle.
+C_Polyhedron
+aux_test03(int lx, int ly, int dx, int dy) {
+ Variable x(0);
+ Variable y(1);
+ C_Polyhedron ph(2, EMPTY);
+ ph.add_generator(point((lx+0*dx)*x + (ly+0*dy)*y));
+ ph.add_generator(point((lx+1*dx)*x + (ly+0*dy)*y));
+ ph.add_generator(point((lx+1*dx)*x + (ly+1*dy)*y));
+ ph.add_generator(point((lx+0*dx)*x + (ly+1*dy)*y));
+ return ph;
+}
+
+// Powerset of C polyhedra: difference_assign(), meet_assign,
+// upper_bound_assign() and pairwise_reduce().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> cross(2, EMPTY);
+ cross.add_disjunct(aux_test03(0, 3, 9, 3));
+ cross.add_disjunct(aux_test03(3, 0, 3, 9));
+
+ using namespace IO_Operators;
+ nout << "cross = " << cross << endl;
+
+ Pointset_Powerset<C_Polyhedron> squares(2, EMPTY);
+ squares.add_disjunct(aux_test03(1, 4, 1, 1));
+ squares.add_disjunct(aux_test03(4, 4, 1, 1));
+ squares.add_disjunct(aux_test03(7, 4, 1, 1));
+ squares.add_disjunct(aux_test03(4, 1, 1, 1));
+ squares.add_disjunct(aux_test03(4, 7, 1, 1));
+
+ nout << "squares = " << squares << endl;
+
+ Pointset_Powerset<C_Polyhedron> difference = cross;
+ difference.difference_assign(squares);
+
+ nout << "cross - squares = " << difference << endl;
+
+ Pointset_Powerset<C_Polyhedron> intersection = difference;
+ intersection.meet_assign(squares);
+
+ nout << "(cross - squares) inters squares = " << intersection << endl;
+
+ // When using Pointset_Powerset<NNC_Polyhedron>, intersection will be
+ // empty. When using Pointset_Powerset<C_Polyhedron>,
+ // intersection will consist of objects of affine dimension at most 1.
+ bool ok1 = true;
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator
+ i = intersection.begin(), in_end = intersection.end();
+ i != in_end; ++i)
+ if (i->pointset().affine_dimension() > 1) {
+ nout << "intersection contains " << i->pointset() << "," << endl
+ << "which is of affine dimension greater than 1" << endl;
+ ok1 = false;
+ }
+
+ Pointset_Powerset<C_Polyhedron> re_union = difference;
+ re_union.upper_bound_assign(squares);
+
+ nout << "(cross - squares) union squares = " << re_union << endl;
+ re_union.pairwise_reduce();
+ nout << "<Above union pairwise reduced> = " << re_union << endl;
+
+ bool ok2 = re_union.geometrically_equals(cross);
+
+ if (!ok2)
+ nout << "Union does not give back the original!" << endl;
+
+ return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/discrete1.cc b/tests/Powerset/discrete1.cc
new file mode 100644
index 0000000..c46522a
--- /dev/null
+++ b/tests/Powerset/discrete1.cc
@@ -0,0 +1,80 @@
+/* Test Pointset_Powerset<PH>::is_discrete().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_discrete().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ bool b = ps.is_discrete();
+
+ ps.add_disjunct(C_Polyhedron(0));
+ // A zero-dimension universe is discrete.
+ bool b1 = ps.is_discrete();
+ return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_discrete().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x == 2);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = ps.is_discrete();
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b1 = !ps.is_discrete();
+ return b && b1;
+}
+
+// Powerset of C polyhedra: is_discrete().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ bool b = ps.is_discrete();
+
+ ps.add_disjunct(C_Polyhedron(1));
+
+ bool b1 = !ps.is_discrete();
+ return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/disjoint1.cc b/tests/Powerset/disjoint1.cc
new file mode 100644
index 0000000..6c171ce
--- /dev/null
+++ b/tests/Powerset/disjoint1.cc
@@ -0,0 +1,117 @@
+/* Test Pointset_Powerset<PH>::is_disjoint_from().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_disjoint_from().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps1(0, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> ps2(0, EMPTY);
+ bool b = ps1.is_disjoint_from(ps2);
+ bool c = ps2.is_disjoint_from(ps1);
+
+ ps1.add_disjunct(C_Polyhedron(0));
+ bool b1 = ps1.is_disjoint_from(ps2);
+ bool c1 = ps2.is_disjoint_from(ps1);
+
+ ps2.add_disjunct(C_Polyhedron(0));
+ bool b2 = !ps1.is_disjoint_from(ps2);
+ bool c2 = !ps2.is_disjoint_from(ps1);
+
+ return b && c && b1 && c1 && b2 && c2;
+}
+
+// Powerset of NNC polyhedra: is_disjoint_from().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps1.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x == 2);
+ ps1.add_disjunct(NNC_Polyhedron(cs));
+
+ Pointset_Powerset<NNC_Polyhedron> ps2(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 2);
+ cs.insert(x <= 6);
+ ps2.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = ps1.is_disjoint_from(ps2);
+ bool c = ps2.is_disjoint_from(ps1);
+
+ cs.clear();
+ cs.insert(x >= 2);
+ ps2.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b1 = !ps1.is_disjoint_from(ps2);
+ bool c1 = !ps2.is_disjoint_from(ps1);
+
+ return b && c && b1 && c1;
+}
+
+// Powerset of C polyhedra: is_disjoint_from().
+bool
+test03() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+ bool b = ps1.is_disjoint_from(ps2);
+ bool c = ps2.is_disjoint_from(ps1);
+
+ ps1.add_disjunct(C_Polyhedron(1));
+
+ bool b1 = ps1.is_disjoint_from(ps2);
+ bool c1 = ps2.is_disjoint_from(ps1);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 1);
+ ps2.add_disjunct(C_Polyhedron(cs));
+
+ bool b2 = !ps1.is_disjoint_from(ps2);
+ bool c2 = !ps2.is_disjoint_from(ps1);
+
+ return b && c && b1 && c1 && b2 && c2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/disjunct1.cc b/tests/Powerset/disjunct1.cc
new file mode 100644
index 0000000..bf01aa5
--- /dev/null
+++ b/tests/Powerset/disjunct1.cc
@@ -0,0 +1,311 @@
+/* Test Pointset_Powerset<PH>::add_disjunct().
+ Pointset_Powerset<PH>::drop_disjunct().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_disjunct().
+bool
+test01() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ c_ps.add_constraint(x == 1);
+
+ Pointset_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_ps.begin();
+ C_Polyhedron c_phi = c_i->pointset();
+ print_constraints(c_phi, "*** c_phi ***");
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_ps.begin();
+ NNC_Polyhedron nnc_phi = nnc_i->pointset();
+ print_constraints(nnc_phi, "*** nnc_phi ***");
+
+ return c_ps.OK() && nnc_ps.OK();
+}
+
+// Powerset of NNC polyhedra: add_disjunct().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> nnc_ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x < 1);
+ nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps(nnc_ps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_ps.begin();
+ C_Polyhedron c_phi = c_i->pointset();
+ print_constraints(c_phi, "*** c_phi ***");
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_ps.begin();
+ NNC_Polyhedron nnc_phi = nnc_i->pointset();
+ print_constraints(nnc_phi, "*** nnc_phi ***");
+
+ return nnc_ps.OK() && c_ps.OK();
+}
+
+// Powerset of C polyhedra: add_disjunct() and drop_disjunct().
+bool
+test03() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ Constraint_System cs1 = cs;
+ c_ps.add_disjunct(C_Polyhedron(cs));
+ c_ps.drop_disjunct(c_ps.begin());
+
+ bool ok = c_ps.empty();
+
+ Constraint_System cs2 = cs1;
+ c_ps.add_disjunct(C_Polyhedron(cs1));
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+ c_ps.drop_disjuncts(c_ps.begin(), c_ps.end());
+
+ bool ok1 = c_ps.empty();
+
+ return ok && ok1;
+}
+
+// Powerset of C polyhedra: add_disjunct().
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ C_Polyhedron ph(2);
+ ph.add_constraints(cs);
+ c_ps.add_disjunct(ph);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ C_Polyhedron ph1(2);
+ ph1.add_constraints(cs1);
+ c_ps.add_disjunct(ph1);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+ C_Polyhedron phi = i->pointset();
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+
+ bool ok = phi.OK() && phi == ph;
+
+ print_constraints(ph, "*** ph ***");
+ print_constraints(phi, "*** phi ***");
+
+ bool ok1 = phi1.OK() && phi1 == ph1;
+
+ print_constraints(ph1, "*** ph1 ***");
+ print_constraints(phi1, "*** phi1 ***");
+
+ phi.upper_bound_assign(phi1);
+ print_constraints(phi, "*** phi ***");
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct().
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<TBox> pps_box(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ TBox box(2);
+ box.add_constraints(cs);
+ pps_box.add_disjunct(box);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ TBox box1(2);
+ box1.add_constraints(cs1);
+ pps_box.add_disjunct(box1);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps_box.begin();
+ TBox pps_boxi = i->pointset();
+ i++;
+ TBox pps_boxi1 = i->pointset();
+
+ bool ok = pps_boxi.OK() && pps_boxi == box;
+
+ print_constraints(box, "*** box ***");
+ print_constraints(pps_boxi, "*** pps_boxi ***");
+
+ bool ok1 = pps_boxi1.OK() && pps_boxi1 == box1;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(pps_boxi1, "*** pps_boxi1 ***");
+
+ pps_boxi.upper_bound_assign(pps_boxi1);
+ print_constraints(pps_boxi, "*** pps_boxi ***");
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct().
+bool
+test06() {
+ Variable x(0);
+
+ Pointset_Powerset<TBox> ps(1, EMPTY);
+ Constraint_System cs;
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x < 2);
+ ps.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ ps.add_disjunct(TBox(cs));
+
+ print_constraints(ps, "*** ps ***");
+
+ ps.add_constraint(x == 1);
+
+ Pointset_Powerset<TBox> known_result(1, EMPTY);
+ TBox box(1);
+ box.add_constraint(x == 1);
+ known_result.add_disjunct(box);
+
+ bool ok = (ps == known_result);
+
+ print_constraints(ps, "*** ps.add_constraint(x == 1) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+// Powerset of boxes: add_disjuncts().
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Pointset_Powerset<TBox> pps_box(2, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ TBox box(2);
+ box.add_constraints(cs);
+ pps_box.add_disjunct(box);
+
+ Constraint_System cs1;
+ cs1.insert(y >= 3);
+ cs1.insert(y <= 5);
+ TBox box1(2);
+ box1.add_constraints(cs1);
+ pps_box.add_disjunct(box1);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps_box.begin();
+ TBox pps_boxi = i->pointset();
+ i++;
+ TBox pps_boxi1 = i->pointset();
+
+ bool ok = pps_boxi.OK() && pps_boxi == box;
+
+ print_constraints(box, "*** box ***");
+ print_constraints(pps_boxi, "*** pps_boxi ***");
+
+ bool ok1 = pps_boxi1.OK() && pps_boxi1 == box1;
+
+ print_constraints(box1, "*** box1 ***");
+ print_constraints(pps_boxi1, "*** pps_boxi1 ***");
+
+ pps_boxi.upper_bound_assign(pps_boxi1);
+ print_constraints(pps_boxi, "*** pps_boxi ***");
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct(), drop_disjuncts().
+bool
+test08() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ Constraint_System cs1 = cs;
+ pps_box.add_disjunct(TBox(cs));
+ pps_box.drop_disjunct(pps_box.begin());
+
+ bool ok = pps_box.empty();
+
+ Constraint_System cs2 = cs1;
+ pps_box.add_disjunct(TBox(cs1));
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ pps_box.add_disjunct(TBox(cs));
+ pps_box.drop_disjuncts(pps_box.begin(), pps_box.end());
+
+ bool ok1 = pps_box.empty();
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Powerset/empty1.cc b/tests/Powerset/empty1.cc
new file mode 100644
index 0000000..1a6bc7c
--- /dev/null
+++ b/tests/Powerset/empty1.cc
@@ -0,0 +1,142 @@
+/* Test Pointset_Powerset<PH>::is_empty(),
+ Pointset_Powerset<PH>::empty().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: empty().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1;
+ c_ps1 = c_ps;
+
+ bool ok = !c_ps.empty();
+ return ok;
+}
+
+// Powerset of C polyhedra: empty().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+ swap(c_ps, c_ps1);
+
+ bool ok = (c_ps.empty() && !c_ps1.empty());
+ return ok;
+}
+
+// Powerset of C polyhedra: is_empty().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ bool b = ps.is_empty();
+
+ ps.add_disjunct(C_Polyhedron(0));
+ bool b1 = !ps.is_empty();
+ return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_empty().
+bool
+test04() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x < 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = !ps.is_empty();
+ return b;
+}
+
+// Powerset of boxes: !empty().
+bool
+test05() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ Pointset_Powerset<TBox> pps_box1;
+ pps_box1 = pps_box;
+
+ bool ok = !pps_box.empty();
+ return ok;
+}
+
+// Powerset of boxes: empty().
+bool
+test06() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+ swap(pps_box, pps_box1);
+
+ bool ok = (pps_box.empty() && !pps_box1.empty());
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Powerset/entails1.cc b/tests/Powerset/entails1.cc
new file mode 100644
index 0000000..837d5d8
--- /dev/null
+++ b/tests/Powerset/entails1.cc
@@ -0,0 +1,73 @@
+/* Test Pointset_Powerset<PH>::definitely_entails().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: definitely_entails().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ c_ps1.add_disjunct(C_Polyhedron(cs1));
+
+ bool ok = c_ps1.definitely_entails(c_ps);
+
+ return ok;
+}
+
+// Powerset of boxes: definitely_entails().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ pps_box.add_disjunct(TBox(cs));
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+ Constraint_System cs1;
+ cs1.insert(x >= 0);
+ cs1.insert(x <= 2);
+ pps_box1.add_disjunct(TBox(cs1));
+
+ bool ok = pps_box1.definitely_entails(pps_box);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/equals1.cc b/tests/Powerset/equals1.cc
new file mode 100644
index 0000000..6f66873
--- /dev/null
+++ b/tests/Powerset/equals1.cc
@@ -0,0 +1,79 @@
+/* Test Pointset_Powerset<PH>::equals(),
+ Pointset_Powerset<PH>::geometrically_equals().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// geometrically_equals().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1);
+ Constraint_System cs;
+ cs.insert(x >= 5);
+ cs.insert(x <= 3);
+ pps_box.add_constraints(cs);
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+ // pps_box.ascii_dump();
+ // pps_box1.ascii_dump();
+
+ bool ok = pps_box.geometrically_equals(pps_box1);
+ bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+ return ok && ok1;
+}
+
+// geometrically_equals().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1);
+ Constraint_System cs;
+ cs.insert(x >= 5);
+ cs.insert(x >= 8);
+ pps_box.add_constraints(cs);
+
+ Pointset_Powerset<TBox> pps_box1(1);
+ cs.clear();
+ cs.insert(x >= 8);
+ pps_box1.add_constraints(cs);
+
+ // pps_box.ascii_dump();
+ // pps_box1.ascii_dump();
+
+ bool ok = pps_box.geometrically_equals(pps_box1);
+ bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/frombdshape1.cc b/tests/Powerset/frombdshape1.cc
new file mode 100644
index 0000000..9104bdc
--- /dev/null
+++ b/tests/Powerset/frombdshape1.cc
@@ -0,0 +1,425 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(BD_Shape<T>),
+ Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(BD_Shape<T>)).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a bd shape.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x >= 0);
+ bds.add_constraint(x - y <= 1);
+ bds.add_constraint(y >= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps(bds);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x >= 0);
+ known_pps.add_constraint(x - y <= 1);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty bd shape.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> pps(bds);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of bd shapes.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TBD_Shape bds(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps_bds(bds, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<C_Polyhedron> pps(pps_bds, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+ C_Polyhedron phj = j->pointset();
+ print_constraints(phj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a bd shape.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TBD_Shape bds(4);
+ bds.add_constraint(x >= 2);
+ bds.add_constraint(x - y <= 4);
+ bds.add_constraint(z == 1);
+
+ Pointset_Powerset<TBD_Shape> pps1(bds);
+ Pointset_Powerset<TBD_Shape> pps2(4, EMPTY);
+ pps2.add_disjunct(bds);
+
+ bool ok = (pps1 == pps2);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps1.begin();
+ TBD_Shape bdsi = i->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+ Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+ TBD_Shape bdsi2 = i2->pointset();
+ print_constraints(bdsi2, "*** bdsi2 ***");
+
+ return ok && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from an empty bd shape.
+bool
+ test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Pointset_Powerset<TBD_Shape> pps(bds);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of bd shapes.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TBD_Shape bds(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps_bds(bds, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps(pps_bds, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator j = pps.begin();
+ TBD_Shape bdsj = j->pointset();
+ print_constraints(bdsj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a bd shape.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 0);
+ bds.add_constraint(x - y <= 1);
+ bds.add_constraint(y >= 0);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(x == 0);
+ known_pps.add_constraint(x - y <= 1);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+ TOctagonal_Shape osi = i->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty bd shape.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of bd shapes.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TBD_Shape bd(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+ TOctagonal_Shape osi = i_os->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a bd shape.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 0);
+ bds.add_constraint(x - y <= 1);
+ bds.add_constraint(y >= 0);
+
+ Pointset_Powerset<TBox> pps(bds);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(x == 0);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+ TBox phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from an empty bd shape.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(bds);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of bd shapes.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TBD_Shape bd(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+ TBox boxi = i_box->pointset();
+ print_constraints(boxi, "*** boxi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a bd shape.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2);
+ bds.add_constraint(x == 0);
+ bds.add_constraint(x - y <= 1);
+ bds.add_constraint(y >= 0);
+
+ Pointset_Powerset<Grid> pps(bds);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_congruence((x %= 0) / 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+ Grid phi = i->pointset();
+ print_congruences(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from an empty bd shape.
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bds(2, EMPTY);
+
+ Pointset_Powerset<Grid> pps(bds);
+
+ Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a powerset of bd shapes.
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TBD_Shape bd(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i_bd = pps_bd.begin();
+ TBD_Shape bdi = i_bd->pointset();
+ print_constraints(bdi, "*** bdi ***");
+
+ // The complexity should be ignored.
+ Pointset_Powerset<Grid> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+ Grid gri = i_gr->pointset();
+ print_congruences(gri, "*** gri ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/frombox1.cc b/tests/Powerset/frombox1.cc
new file mode 100644
index 0000000..aafdbdf
--- /dev/null
+++ b/tests/Powerset/frombox1.cc
@@ -0,0 +1,421 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Box<T>),
+ Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(Box<T>)).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a box.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(2*x <= 1);
+ box.add_constraint(y >= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps(box);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x >= 0);
+ known_pps.add_constraint(2*x <= 1);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty box.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> pps(box);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of boxes.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TBox box(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<C_Polyhedron> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+ C_Polyhedron phj = j->pointset();
+ print_constraints(phj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a box.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y >= 0);
+
+ // Complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(x >= 0);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+ TBD_Shape bdsi = i->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty box.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2, EMPTY);
+
+ Pointset_Powerset<TBD_Shape> pps(box);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of boxes.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(y <= 0);
+ TBox box(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(x >= 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+ TBD_Shape bdsi = i_bds->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a box.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(y >= 0);
+
+ // Complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(x >= 0);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+ TOctagonal_Shape osi = i->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty box.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBox box(2, EMPTY);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(box);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of boxes.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(y <= 0);
+ TBox box(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(x >= 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+ TOctagonal_Shape osi = i_os->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a box.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TBox box(4);
+ box.add_constraint(x >= 2);
+ box.add_constraint(z == 1);
+
+ Pointset_Powerset<TBox> pps1(box);
+ Pointset_Powerset<TBox> pps2(4, EMPTY);
+ pps2.add_disjunct(box);
+
+ bool ok = (pps1 == pps2);
+
+ print_constraints(box, "*** box ***");
+ Pointset_Powerset<TBox>::const_iterator i = pps1.begin();
+ TBox boxi = i->pointset();
+ print_constraints(boxi, "*** boxi ***");
+ Pointset_Powerset<TBox>::const_iterator i2 = pps2.begin();
+ TBox boxi2 = i2->pointset();
+ print_constraints(boxi2, "*** boxi2 ***");
+
+ return ok && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty box.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(box);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of boxes.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TBox box(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator j = pps.begin();
+ TBox boxj = j->pointset();
+ print_constraints(boxj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a box.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2);
+ box.add_constraint(x >= 0);
+ box.add_constraint(2*x == 1);
+ box.add_constraint(y >= 0);
+
+ Pointset_Powerset<Grid> pps(box);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+ Grid phi = i->pointset();
+ print_congruences(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from an empty box.
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ Rational_Box box(2, EMPTY);
+
+ Pointset_Powerset<Grid> pps(box);
+
+ Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a powerset of boxes.
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TBox box(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox>::const_iterator i_box = pps_box.begin();
+ TBox boxi = i_box->pointset();
+ print_constraints(boxi, "*** boxi ***");
+
+ // The complexity should be ignored.
+ Pointset_Powerset<Grid> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_constraint(x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+ Grid gri = i_gr->pointset();
+ print_congruences(gri, "*** gri ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/fromcongruences1.cc b/tests/Powerset/fromcongruences1.cc
new file mode 100644
index 0000000..adf53e8
--- /dev/null
+++ b/tests/Powerset/fromcongruences1.cc
@@ -0,0 +1,78 @@
+/* Test Pointset_Powerset<PH>::
+ Pointset_Powerset(Congruence_System).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Congruence_System cs;
+ Pointset_Powerset<C_Polyhedron> ps(cs);
+
+ bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 0);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cs;
+ cs.insert((A %= -1) / 0);
+ cs.insert((B %= 1) / 0);
+ Pointset_Powerset<C_Polyhedron> ps(cs);
+
+ bool ok = (ps.OK() && !ps.is_universe() && ps.space_dimension() == 2);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cs;
+ cs.insert((A %= -1) / 0);
+ cs.insert((B %= 1)/ 0);
+ cs.insert((C %= 2) / 0);
+ cs.insert((C %= 1) / 0);
+ Pointset_Powerset<C_Polyhedron> ps(cs);
+
+ bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 3);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/fromconstraints1.cc b/tests/Powerset/fromconstraints1.cc
new file mode 100644
index 0000000..c9800a7
--- /dev/null
+++ b/tests/Powerset/fromconstraints1.cc
@@ -0,0 +1,182 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Constraint_System).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Construct powerset of polyhedra from a 0 dimension empty constraint system.
+bool
+test01() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<C_Polyhedron> ps(cs);
+ return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of polyhedra from a non-empty constraint system.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Constraint_System cs;
+
+ cs.insert(x + y > 0);
+ cs.insert(x - 2*y <= 2);
+ cs.insert(z == 2);
+ Pointset_Powerset<NNC_Polyhedron> ps(cs);
+
+ return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of bd shapes from a 0 dimension empty constraint system.
+bool
+test03() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<TBD_Shape> ps(cs);
+ return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of bd shapes from non-empty constraint system.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Constraint_System cs;
+
+ cs.insert(x - y <= 2);
+ cs.insert(z == 2);
+ Pointset_Powerset<TBD_Shape> ps(cs);
+
+ return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of octagonal shapes from a 0 dimension empty constraint system.
+bool
+test05() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<TOctagonal_Shape> ps(cs);
+ return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of octagonal shapes from non-empty constraint system.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Constraint_System cs;
+
+ cs.insert(x + y >= -2);
+ cs.insert(x - y <= 2);
+ cs.insert(z == 2);
+ Pointset_Powerset<TOctagonal_Shape> ps(cs);
+
+ return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of boxes from a 0 dimension empty constraint system.
+bool
+test07() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<TBox> ps(cs);
+
+ print_constraints(ps, "*** ps ***");
+
+ return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of boxes from a non-empty constraint system.
+bool
+test08() {
+ Variable x(0);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ Pointset_Powerset<TBox> ps(cs);
+
+ return ps.OK() && ps.space_dimension() == 1;
+}
+
+// Construct powerset of grids from a 0 dimension empty constraint system.
+bool
+test09() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<Grid> ps(cs);
+
+ print_constraints(ps, "*** ps ***");
+
+ return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of grids from non-empty constraint system.
+bool
+test10() {
+ Variable x(0);
+ Constraint_System cs;
+
+ cs.insert(x == 0);
+ Pointset_Powerset<Grid> ps(cs);
+
+ return ps.OK() && ps.space_dimension() == 1;
+}
+
+// Construct powerset of products from a 0-dim inconsistent constraint system.
+ typedef Domain_Product<NNC_Polyhedron, Grid>::Constraints_Product CProduct;
+bool
+test11() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<CProduct> pscp(cs);
+ return pscp.OK();
+}
+
+// Construct powerset of products from a 1-dim constraint system.
+bool
+test12() {
+ Variable A(0);
+
+ CProduct cp(1);
+ cp.add_constraint(A == 0);
+ Pointset_Powerset<CProduct> pscp(1);
+ pscp.add_disjunct(cp);
+ return pscp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Powerset/fromgrid1.cc b/tests/Powerset/fromgrid1.cc
new file mode 100644
index 0000000..dbac760
--- /dev/null
+++ b/tests/Powerset/fromgrid1.cc
@@ -0,0 +1,435 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Grid),
+ Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(Grid)).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a grid.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid grid(2);
+ grid.add_congruence((2*x %= 1) / 0);
+ grid.add_congruence(y %= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps(grid);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty grid.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid grid(2, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> pps(grid);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of grids.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid grid(2);
+ grid.add_congruence((2*x %= 1) / 0);
+ grid.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> pps_gr(grid);
+
+ Pointset_Powerset<C_Polyhedron> pps(pps_gr);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a grid.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<TBD_Shape> pps(gr);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+ TBD_Shape bdsi = i->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty grid.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2, EMPTY);
+
+ Pointset_Powerset<TBD_Shape> pps(gr);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of grids.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> pps_gr(gr);
+
+ Pointset_Powerset<TBD_Shape> pps(pps_gr);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+ TBD_Shape bdsi = i->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a grid.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+ TOctagonal_Shape osi = i->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty grid.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2, EMPTY);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of grids.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> pps_gr(gr);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(pps_gr);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+ TOctagonal_Shape osi = i->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a grid.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<TBox> pps(gr);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+ TBox phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from an empty grid.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(gr);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of grids.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2);
+ gr.add_congruence((2*x %= 1) / 0);
+ gr.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> pps_gr(gr);
+
+ Pointset_Powerset<TBox> pps(pps_gr);
+
+ Pointset_Powerset<TBox> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+ TBox boxi = i->pointset();
+ print_constraints(boxi, "*** boxi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a grid.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ Grid gr(4);
+ gr.add_congruence(x %= 2);
+ gr.add_constraint(z == 1);
+
+ Pointset_Powerset<Grid> pps1(gr);
+ Pointset_Powerset<Grid> pps2(4, EMPTY);
+ pps2.add_disjunct(gr);
+
+ bool ok = (pps1 == pps2);
+
+ print_congruences(gr, "*** gr ***");
+ Pointset_Powerset<Grid>::const_iterator i = pps1.begin();
+ Grid gri = i->pointset();
+ print_congruences(gri, "*** gri ***");
+ Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+ Grid gri2 = i2->pointset();
+ print_congruences(gri2, "*** gri2 ***");
+
+ return ok && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty grid.
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid gr(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(gr);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a powerset of grids.
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid grid(2);
+ grid.add_congruence((2*x %= 1) / 0);
+ grid.add_congruence(y %= 0);
+
+ Pointset_Powerset<Grid> pps_gr(grid);
+
+ Pointset_Powerset<Grid> pps(pps_gr);
+
+ Pointset_Powerset<Grid> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+ known_pps.add_congruence(y %= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+ Grid gri = i->pointset();
+ print_congruences(gri, "*** gri ***");
+
+ return ok;
+}
+
+// Constructs the powerset of NNC polyhedra from a powerset of grids
+// where set of grids is omega reduced but the constructed set
+// of NNC polyhedra is not omega reduced.
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ Grid grid1(2);
+ grid1.add_congruence((x %= 0) / 2);
+ grid1.add_congruence((y %= 0) / 2);
+ Grid grid2(2);
+ grid2.add_congruence((x %= 1) / 2);
+ grid2.add_congruence((y %= 1) / 0);
+
+ Pointset_Powerset<Grid> pps_gr(grid1);
+ pps_gr.add_disjunct(grid2);
+
+ // At this stage, pps_gr is omega reduced but pps_gr.reduced flag will
+ // be set to false.
+ // So we add this test to set the omega reduction pps_gr.reduced
+ // flag to true.
+ pps_gr.is_topologically_closed();
+
+ Pointset_Powerset<NNC_Polyhedron> pps(pps_gr);
+
+ // pps is not omega reduced.
+ bool ok = (pps.size() == 2);
+
+ Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+ ok = ok && (pps == known_pps) && pps.OK();
+
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+ NNC_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+END_MAIN
diff --git a/tests/Powerset/fromoctagonalshape1.cc b/tests/Powerset/fromoctagonalshape1.cc
new file mode 100644
index 0000000..6d3da9d
--- /dev/null
+++ b/tests/Powerset/fromoctagonalshape1.cc
@@ -0,0 +1,432 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(BD_Shape<T>),
+ Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(BD_Shape<T>)).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from an octagonal shape.
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(x >= 0);
+ os.add_constraint(x - y <= 1);
+ os.add_constraint(y >= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps(os);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x >= 0);
+ known_pps.add_constraint(x - y <= 1);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty octagonal shape.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+
+ Pointset_Powerset<C_Polyhedron> pps(os);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of octagonal shapes.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TOctagonal_Shape os(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<C_Polyhedron> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+ C_Polyhedron phj = j->pointset();
+ print_constraints(phj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from an octagonal shape.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(x == 0);
+ os.add_constraint(x + y <= 3);
+ os.add_constraint(y >= 1);
+
+ Pointset_Powerset<TBD_Shape> pps(os);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(x == 0);
+ known_pps.add_constraint(y >= 1);
+ known_pps.add_constraint(y <= 3);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+ TBD_Shape bdsi = i->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty octagonal shape.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+
+ Pointset_Powerset<TBD_Shape> pps(os);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of octagonal shapes.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TOctagonal_Shape os(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBD_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+ TBD_Shape bdsi = i_bds->pointset();
+ print_constraints(bdsi, "*** bdsi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an octagonal shape.
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TOctagonal_Shape os(4);
+ os.add_constraint(x >= 2);
+ os.add_constraint(x + y <= 4);
+ os.add_constraint(z == 1);
+
+ Pointset_Powerset<TOctagonal_Shape> pps1(os);
+ Pointset_Powerset<TOctagonal_Shape> pps2(4, EMPTY);
+ pps2.add_disjunct(os);
+
+ bool ok = (pps1 == pps2);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps1.begin();
+ TOctagonal_Shape osi = i->pointset();
+ print_constraints(osi, "*** osi ***");
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+ TOctagonal_Shape osi2 = i2->pointset();
+ print_constraints(osi2, "*** osi2 ***");
+
+ return ok && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty octagonal shape.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(os);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of
+// octagonal_shapes.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x <= 1);
+ cs.insert(y <= 0);
+ TOctagonal_Shape os(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y <= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator j = pps.begin();
+ TOctagonal_Shape osj = j->pointset();
+ print_constraints(osj, "*** pps disjunct ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from an octagonal shape.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(x >= 0);
+ os.add_constraint(x + y <= 4);
+ os.add_constraint(x - y == 3);
+ os.add_constraint(y >= 0);
+
+ // Complexity should be ignored.
+ Pointset_Powerset<TBox> pps(os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(x >= 3);
+ known_pps.add_constraint(2*x <= 7);
+ known_pps.add_constraint(y >= 0);
+ known_pps.add_constraint(2*y <= 1);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+ TBox phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from an empty octagonal shape.
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(os);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of octagonal shapes.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TOctagonal_Shape os(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TBox> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+ TBox boxi = i_box->pointset();
+ print_constraints(boxi, "*** boxi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from an octagonal shape.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2);
+ os.add_constraint(x >= 0);
+ os.add_constraint(x + y <= 4);
+ os.add_constraint(x - y == 3);
+ os.add_constraint(y >= 0);
+
+ // Complexity should be ignored.
+ Pointset_Powerset<Grid> pps(os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_constraint(x - y == 3);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+ Grid phi = i->pointset();
+ print_congruences(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from an empty octagonal shape.
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TOctagonal_Shape os(2, EMPTY);
+
+ Pointset_Powerset<Grid> pps(os);
+
+ Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a powerset of octagonal shapes.
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(x >= 1);
+ cs.insert(x - y <= 1);
+ cs.insert(y <= 0);
+ TOctagonal_Shape os(cs);
+
+ // The complexity should be ignored.
+ Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps_os.begin();
+ TOctagonal_Shape osi = i_os->pointset();
+ print_constraints(osi, "*** osi ***");
+
+ // The complexity should be ignored.
+ Pointset_Powerset<Grid> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(2);
+ known_pps.add_constraint(x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+ Grid gri = i_gr->pointset();
+ print_congruences(gri, "*** gri ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/frompolyhedron1.cc b/tests/Powerset/frompolyhedron1.cc
new file mode 100644
index 0000000..e663f0a
--- /dev/null
+++ b/tests/Powerset/frompolyhedron1.cc
@@ -0,0 +1,741 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(C_Polyhedron),
+ Pointset_Powerset<PH>::Pointset_Powerset(NNC_Polyhedron).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from an empty polyhedron.
+bool
+test01() {
+ C_Polyhedron c_ph(0, EMPTY);
+ Pointset_Powerset<C_Polyhedron> c_ps(c_ph);
+
+ bool ok = (c_ps.OK() && c_ps.is_empty() && c_ps.space_dimension() == 0);
+
+ NNC_Polyhedron nnc_ph(0, EMPTY);
+ Pointset_Powerset<NNC_Polyhedron> nnc_ps(nnc_ph);
+
+ ok = ok
+ && (nnc_ps.OK() && nnc_ps.is_empty() && nnc_ps.space_dimension() == 0);
+
+ return ok;
+}
+
+// Constructs the powerset of polyhedra from a closed polyhedron.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron c_ph(4);
+ c_ph.add_constraint(x <= 2);
+ c_ph.add_constraint(z == 1);
+ NNC_Polyhedron nnc_ph(c_ph);
+
+ Pointset_Powerset<C_Polyhedron> c_pps1(c_ph);
+ Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+ c_pps2.add_disjunct(c_ph);
+
+ Pointset_Powerset<NNC_Polyhedron> nnc_pps1(c_ph);
+ Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+ nnc_pps2.add_disjunct(nnc_ph);
+
+ bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+ C_Polyhedron c_phi = c_i->pointset();
+ print_constraints(c_phi, "*** c_phi ***");
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+ NNC_Polyhedron nnc_phi = nnc_i->pointset();
+ print_constraints(nnc_phi, "*** nnc_phi ***");
+
+ return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of polyhedra from an nnc polyhedron.
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ NNC_Polyhedron nnc_ph(4);
+ nnc_ph.add_constraint(x <= 2);
+ nnc_ph.add_constraint(z == 1);
+ C_Polyhedron c_ph(nnc_ph);
+
+ Pointset_Powerset<C_Polyhedron> c_pps1(nnc_ph);
+ Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+ c_pps2.add_disjunct(c_ph);
+
+ Pointset_Powerset<NNC_Polyhedron> nnc_pps1(nnc_ph);
+ Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+ nnc_pps2.add_disjunct(nnc_ph);
+
+ bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+ C_Polyhedron c_phi = c_i->pointset();
+ print_constraints(c_phi, "*** c_phi ***");
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+ NNC_Polyhedron nnc_phi = nnc_i->pointset();
+ print_constraints(nnc_phi, "*** nnc_phi ***");
+
+ return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(2*x == 1);
+ ph.add_constraint(y >= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps_c(ph);
+
+ Pointset_Powerset<NNC_Polyhedron> pps(pps_c);
+
+ Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+ known_pps.add_constraint(2*x == 1);
+ known_pps.add_constraint(y >= 0);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+ NNC_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ Pointset_Powerset<C_Polyhedron> pps(2);
+
+ pps.add_constraint(x >= 1);
+ pps.add_constraint(x <= 1);
+ pps.add_constraint(y >= 0);
+
+ Pointset_Powerset<C_Polyhedron> pps1(pps, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i1 = pps.begin();
+ C_Polyhedron phi1 = i1->pointset();
+ print_constraints(phi1, "*** phi1 ***");
+
+ pps.OK();
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ phi.OK();
+ print_constraints(phi, "*** phi after ok check ***");
+
+ bool ok = true;
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a polyhedron.
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(3*x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(3*x + z <= 3);
+ C_Polyhedron ph1(ph);
+
+ // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+ // are found
+ Pointset_Powerset<TBD_Shape> pps(ph);
+ Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+ TBD_Shape bdsi = i->pointset();
+
+ BD_Shape<mpq_class> known_bdsi(4);
+ known_bdsi.add_constraint(3*x == 2);
+ known_bdsi.add_constraint(z == 1);
+
+ bool ok = check_result(bdsi, known_bdsi, "5.97e-8", "3.15e-8", "1.99e-8");
+
+ print_constraints(bdsi, "*** bdsi ***");
+ print_constraints(known_bdsi, "*** known_bdsi ***");
+
+ // With the polynomial complexity, implied equalities are not found.
+ Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+ TBD_Shape bdsi1 = i1->pointset();
+
+ BD_Shape<mpq_class> known_bdsi1(4);
+ known_bdsi1.add_constraint(3*x >= 2);
+ known_bdsi1.add_constraint(z >= 1);
+
+ ok = check_result(bdsi1, known_bdsi1, "3.98e-8", "3.98e-8", "3.98e-8") && ok;
+
+ print_constraints(bdsi1, "*** bdsi1 ***");
+ print_constraints(known_bdsi1, "*** known_bds1i ***");
+
+ ok = ok && pps.OK() && pps1.OK();
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i_ok = pps.begin();
+ TBD_Shape bdsi_ok = i_ok->pointset();
+ Pointset_Powerset<TBD_Shape>::const_iterator i1_ok = pps1.begin();
+ TBD_Shape bdsi1_ok = i1_ok->pointset();
+
+ print_constraints(bdsi_ok, "*** bdsi after OK() ***");
+ print_constraints(bdsi1_ok, "*** bdsi1 after OK() ***");
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(3*x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(3*x + z <= 2);
+ C_Polyhedron ph1(ph);
+
+ // With the default complexity, the built powerset is empty.
+ Pointset_Powerset<TBD_Shape> pps(ph);
+ // With the polynomial complexity, the built powerset is non-empty.
+ Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ BD_Shape<mpq_class> known_bds1(4);
+ known_bds1.add_constraint(3*x >= 2);
+ known_bds1.add_constraint(z >= 1);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+ TBD_Shape bdsi1 = i1->pointset();
+
+ bool ok = check_result(bdsi1, known_bds1, "1.92e-7", "8.89e-8", "7.95e-8")
+ && pps.is_empty();
+
+ print_constraints(bdsi1, "*** bdsi1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from an empty polyhedron.
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+
+ Pointset_Powerset<TBD_Shape> pps(ph);
+
+ Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of polyhedra.
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(2*x >= 1);
+ cs.insert(2*x + y <= 1);
+ cs.insert(y >= 0);
+ C_Polyhedron ph1(cs);
+ C_Polyhedron ph2(cs);
+
+ Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+ Pointset_Powerset<TBD_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<TBD_Shape> pps2(pps2_c);
+
+ Pointset_Powerset<TBD_Shape> known_pps1(2);
+ known_pps1.add_constraint(2*x >= 1);
+ known_pps1.add_constraint(y >= 0);
+ Pointset_Powerset<TBD_Shape> known_pps2(2);
+ known_pps2.add_constraint(2*x == 1);
+ known_pps2.add_constraint(y == 0);
+
+ bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+ TBD_Shape bdsi1 = i1->pointset();
+ print_constraints(bdsi1, "*** bdsi1 ***");
+
+ Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+ TBD_Shape bdsi2 = i2->pointset();
+ print_constraints(bdsi2, "*** bdsi2 ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron.
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(3*x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(3*x + z <= 3);
+ C_Polyhedron ph1(ph);
+
+ // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+ // are found
+ Pointset_Powerset<TOctagonal_Shape> pps(ph);
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+ TOctagonal_Shape osi = i->pointset();
+
+ Octagonal_Shape<mpq_class> known_osi(4);
+ known_osi.add_constraint(3*x == 2);
+ known_osi.add_constraint(z == 1);
+
+ bool ok = check_result(osi, known_osi, "1.193e-7", "5.45e-8", "3.98e-8");
+
+ print_constraints(osi, "*** osi ***");
+ print_constraints(known_osi, "*** known_osi ***");
+
+ // With the polynomial complexity, implied equalities are not found.
+ Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+ TOctagonal_Shape osi1 = i1->pointset();
+
+ Octagonal_Shape<mpq_class> known_osi1(4);
+ known_osi1.add_constraint(3*x >= 2);
+ known_osi1.add_constraint(z >= 1);
+
+ ok = check_result(osi1, known_osi1, "1.193e-7", "8.89e-8", "7.95e-8") && ok;
+
+ print_constraints(osi1, "*** osi1 ***");
+ print_constraints(known_osi1, "*** known_osi1 ***");
+
+ ok = ok && pps.OK() && pps1.OK();
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i_ok = pps.begin();
+ TOctagonal_Shape osi_ok = i_ok->pointset();
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i1_ok = pps1.begin();
+ TOctagonal_Shape osi1_ok = i1_ok->pointset();
+
+ print_constraints(osi_ok, "*** osi after OK() ***");
+ print_constraints(osi1_ok, "*** osi1 after OK() ***");
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(3*x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(3*x + z <= 2);
+ C_Polyhedron ph1(ph);
+
+ // With the default complexity, the built powerset is empty.
+ Pointset_Powerset<TOctagonal_Shape> pps(ph);
+ // With the polynomial complexity, the built powerset is non-empty.
+ Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ Octagonal_Shape<mpq_class> known_os1(4);
+ known_os1.add_constraint(3*x >= 2);
+ known_os1.add_constraint(z >= 1);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+ TOctagonal_Shape osi1 = i1->pointset();
+
+ bool ok = check_result(osi1, known_os1, "1.92e-7", "8.89e-8", "7.95e-8")
+ && pps.is_empty();
+
+ print_constraints(osi1, "*** osi1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty polyhedron.
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+
+ Pointset_Powerset<TOctagonal_Shape> pps(ph);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of polyhedra.
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(2*x >= 1);
+ cs.insert(2*x + y <= 1);
+ cs.insert(y >= 0);
+ C_Polyhedron ph1(cs);
+ C_Polyhedron ph2(cs);
+
+ Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+ Pointset_Powerset<TOctagonal_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<TOctagonal_Shape> pps2(pps2_c);
+
+ Pointset_Powerset<TOctagonal_Shape> known_pps1(2);
+ known_pps1.add_constraint(2*x >= 1);
+ known_pps1.add_constraint(y >= 0);
+ Pointset_Powerset<TOctagonal_Shape> known_pps2(2);
+ known_pps2.add_constraint(2*x == 1);
+ known_pps2.add_constraint(y == 0);
+
+ bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+ TOctagonal_Shape osi1 = i1->pointset();
+ print_constraints(osi1, "*** osi1 ***");
+
+ Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+ TOctagonal_Shape osi2 = i2->pointset();
+ print_constraints(osi2, "*** osi2 ***");
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a polyhedron.
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(x >= 2);
+ ph.add_constraint(y >= 5);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(x + y + z <= 8);
+
+ C_Polyhedron ph1(ph);
+
+ // With both the default and polynomial complexities,
+ // the implied equalities x = 2, y = 5 and z = 1 are found.
+ Pointset_Powerset<TBox> pps(ph);
+ Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(4);
+ known_pps.add_constraint(x == 2);
+ known_pps.add_constraint(y == 5);
+ known_pps.add_constraint(z == 1);
+
+ bool ok = (pps == known_pps && pps1 == known_pps);
+
+ if (pps.size() > 0)
+ print_constraints(pps.begin()->pointset(), "*** box ***");
+
+ if (pps1.size() > 0)
+ print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(x >= 2);
+ ph.add_constraint(y >= 5);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(x + y + z <= 7);
+
+ C_Polyhedron ph1(ph);
+
+ // With both the default and polynomial complexity,
+ // the built powerset is detected to be empty.
+ Pointset_Powerset<TBox> pps(ph);
+ Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<TBox> known_pps(4, EMPTY);
+
+ bool ok = (pps == known_pps && pps1 == known_pps);
+
+ // These will print something only if test is going to fail.
+ if (pps.size() > 0)
+ print_constraints(pps.begin()->pointset(), "*** box ***");
+ if (pps1.size() > 0)
+ print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty polyhedron.
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+
+ Pointset_Powerset<TBox> pps(ph);
+
+ Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of polyhedra.
+bool
+test17() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(2*x >= 1);
+ cs.insert(2*x + y <= 1);
+ cs.insert(y >= 0);
+ C_Polyhedron ph1(cs);
+ C_Polyhedron ph2(cs);
+
+ Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+ Pointset_Powerset<TBox> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<TBox> pps2(pps2_c);
+
+ Pointset_Powerset<TBox> known_pps(2);
+ known_pps.add_constraint(2*x == 1);
+ known_pps.add_constraint(y == 0);
+
+ bool ok = (pps1 == known_pps && pps2 == known_pps);
+
+ if (pps1.size() > 0)
+ print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+ if (pps2.size() > 0)
+ print_constraints(pps2.begin()->pointset(), "*** box2 ***");
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a polyhedron.
+bool
+test18() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(x + z <= 3);
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(x >= 2);
+ ph1.add_constraint(z >= 1);
+ ph1.add_constraint(x + z <= 3);
+
+ // With the default complexity, the implied equalities x = 2 and z = 1.
+ // are found
+ Pointset_Powerset<Grid> pps(ph);
+ // With the polynomial complexity, no implied equalities are found.
+ Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(4);
+ known_pps.add_congruence((x %= 2) / 0);
+ known_pps.add_congruence((z %= 1) / 0);
+ Pointset_Powerset<Grid> known_pps1(4);
+
+ bool ok = (pps == known_pps && pps1 == known_pps1);
+
+ Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+ Grid gri = i->pointset();
+ print_congruences(gri, "*** gri ***");
+ Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+ Grid gri1 = i1->pointset();
+ print_congruences(gri1, "*** gri1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test19() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph(4);
+ ph.add_constraint(x >= 2);
+ ph.add_constraint(z >= 1);
+ ph.add_constraint(x + z <= 2);
+
+ C_Polyhedron ph1(ph);
+
+ // With the default complexity, the built powerset is empty.
+ Pointset_Powerset<Grid> pps(ph);
+ // With the polynomial complexity, the built powerset is the universe.
+ Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+ Pointset_Powerset<Grid> known_pps(4, EMPTY);
+ Pointset_Powerset<Grid> known_pps1(4);
+
+ bool ok = (pps == known_pps && pps1 == known_pps1);
+
+ Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+ Grid gri1 = i1->pointset();
+ print_congruences(gri1, "*** gri1 ***");
+
+ return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from an empty polyhedron.
+bool
+test20() {
+ Variable x(0);
+ Variable y(1);
+
+ NNC_Polyhedron ph(2, EMPTY);
+
+ Pointset_Powerset<Grid> pps(ph);
+
+ Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Constructs the powerset of grids from a powerset of polyhedra.
+bool
+test21() {
+ Variable x(0);
+ Variable y(1);
+
+ Constraint_System cs;
+ cs.insert(2*x >= 1);
+ cs.insert(2*x + y <= 1);
+ cs.insert(y >= 0);
+ C_Polyhedron ph1(cs);
+ C_Polyhedron ph2(cs);
+
+ Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+ Pointset_Powerset<Grid> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+ Pointset_Powerset<Grid> pps2(pps2_c);
+
+ Pointset_Powerset<Grid> known_pps1(2);
+ Pointset_Powerset<Grid> known_pps2(2);
+ known_pps2.add_constraint(2*x == 1);
+ known_pps2.add_constraint(y == 0);
+
+ bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+ Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+ Grid gri1 = i1->pointset();
+ print_congruences(gri1, "*** gri1 ***");
+
+ Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+ Grid gri2 = i2->pointset();
+ print_congruences(gri2, "*** gri2 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+ DO_TEST(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+ DO_TEST(test20);
+ DO_TEST(test21);
+END_MAIN
diff --git a/tests/Powerset/fromspacedimension1.cc b/tests/Powerset/fromspacedimension1.cc
new file mode 100644
index 0000000..08656cc
--- /dev/null
+++ b/tests/Powerset/fromspacedimension1.cc
@@ -0,0 +1,102 @@
+/* Test Pointset_Powerset<PH>::
+ Pointset_Powerset(dimension_type, Degenerate_Element).
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+ bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 0);
+
+ return ok;
+}
+
+bool
+test02() {
+ Pointset_Powerset<C_Polyhedron> ps(0, UNIVERSE);
+
+ bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 0);
+
+ return ok;
+}
+
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+ bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 4);
+
+ return ok;
+}
+
+bool
+test04() {
+ Pointset_Powerset<C_Polyhedron> ps(4, UNIVERSE);
+
+ bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 4);
+
+ return ok;
+}
+
+bool
+test05() {
+ Pointset_Powerset<C_Polyhedron> ps(4);
+
+ bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 4);
+
+ return ok;
+}
+
+// Construct powerset from zero dimension empty constraint system.
+bool
+test06() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Pointset_Powerset<TBox> ps(cs);
+
+ print_constraints(ps, "*** ps ***");
+
+ return ps.OK();
+}
+
+bool
+test07() {
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ bool ok = (pps_box.space_dimension() == 1);
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+END_MAIN
diff --git a/tests/Powerset/intersection1.cc b/tests/Powerset/intersection1.cc
new file mode 100644
index 0000000..fff3652
--- /dev/null
+++ b/tests/Powerset/intersection1.cc
@@ -0,0 +1,106 @@
+/* Test Pointset_Powerset<PH>::intersection_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: intersection_assign().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+
+ c_ps.intersection_assign(c_ps1);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 2);
+ Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+ c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.definitely_entails(c_ps_expected);
+ bool ok1 = c_ps_expected.definitely_entails(c_ps);
+
+ return ok && ok1 && c_ps.OK() && c_ps1.OK();
+}
+
+// Powerset of C polyhedra: intersection_assign().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+
+ c_ps.intersection_assign(c_ps1);
+ bool ok = !c_ps.empty();
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 2);
+ Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+ c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+ bool ok1 = c_ps.definitely_entails(c_ps_expected);
+ bool ok2 = c_ps_expected.definitely_entails(c_ps);
+
+ Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+ cs.clear();
+ cs.insert(x == 4);
+ c_ps2.add_disjunct(C_Polyhedron(cs));
+
+ c_ps2.intersection_assign(c_ps1);
+ bool ok3 = c_ps2.empty();
+
+ return ok && ok1 && ok2 && ok3 && c_ps.OK() && c_ps1.OK() && c_ps2.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/maxmin1.cc b/tests/Powerset/maxmin1.cc
new file mode 100644
index 0000000..a08d224
--- /dev/null
+++ b/tests/Powerset/maxmin1.cc
@@ -0,0 +1,400 @@
+/* Test Pointset_Powerset<PH>::maximize().
+ Pointset_Powerset<PH>::minimize().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: maximize().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Linear_Expression LE;
+ bool ok = !ps.maximize(LE, num, den, included)
+ && num == 0 && den == 0 && !included;
+ ok = ok && !ps.maximize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ if (!ok)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(0));
+ bool ok1 = ps.maximize(LE, num, den, included)
+ && num == 0 && den == 1 && included;
+ ok1 = ok1 && ps.maximize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "maximum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok1;
+}
+
+// Powerset of NNC polyhedra: maximize().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Linear_Expression LE = x;
+
+ Coefficient max_n = 0;
+ Coefficient max_d = 0;
+ bool max_included = false;
+ Generator max_g(point());
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 3);
+ cs.insert(x < 14);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool ok = ps.maximize(LE, max_n, max_d, max_included)
+ && max_n == 14 && max_d == 1 && !max_included;
+ ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+ && max_n == 14 && max_d == 1 && !max_included
+ && max_g.is_closure_point()
+ && max_g.divisor() == 1;
+
+ nout << max_n << "/" << max_d;
+ nout << " @ ";
+ print_generator(max_g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ cs.clear();
+ cs.insert(x >= 3);
+ cs.insert(x <= 14);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ ok = ps.maximize(LE, max_n, max_d, max_included)
+ && max_n == 14 && max_d == 1 && max_included;
+ ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+ && max_n == 14 && max_d == 1 && max_included
+ && max_g.is_point()
+ && max_g.divisor() == 1;
+
+ nout << max_n << "/" << max_d;
+ nout << " @ ";
+ print_generator(max_g);
+ nout << endl;
+
+ return ok;
+}
+
+// Powerset of C polyhedra: maximize().
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Constraint_System cs;
+ Linear_Expression LE = 9*x + y;
+
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 3);
+ cs.insert(3*x <= 14);
+ cs.insert(y >= 5);
+ cs.insert(11*y <= 87);
+ ps.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = ps.maximize(LE, num, den, included)
+ && num == 549 && den == 11 && included;
+ ok = ok && ps.maximize(LE, num, den, included, g)
+ && num == 549 && den == 11 && included
+ && g.is_point()
+ && g.divisor() == 33;
+
+ nout << num << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ cs.clear();
+ cs.insert(x - 3*y >= 5);
+ cs.insert(x <= 28);
+ cs.insert(y >= 5);
+ cs.insert(4*y <= 85);
+ ps.add_disjunct(C_Polyhedron(cs));
+
+ ok = ps.maximize(LE, num, den, included)
+ && num == 779 && den == 3 && included;
+ ok = ok && ps.maximize(LE, num, den, included, g)
+ && num == 779 && den == 3 && included
+ && g.is_point()
+ && g.divisor() == 3;
+
+ nout << num << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+// Powerset of C polyhedra: maximize().
+bool
+test04() {
+ Variable x(0);
+ Linear_Expression LE = x;
+
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ bool ok = !ps.maximize(LE, num, den, included)
+ && num == 0 && den == 0 && !included;
+ ok = ok && !ps.maximize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ if (!ok)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(1));
+ ok = !ps.maximize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test05() {
+ Linear_Expression LE;
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+ bool ok = !ps.minimize(LE, num, den, included)
+ && num == 0 && den == 0 && !included;
+ ok = ok && !ps.minimize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ if (!ok)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(0));
+ ok = ps.minimize(LE, num, den, included)
+ && num == 0 && den == 1 && included;
+ ok = ok && ps.minimize(LE, num, den, included, g)
+ && num == 0 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << (included ? "minimum" : "supremum") << " = " << num;
+ if (den != 1)
+ nout << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+// Powerset of NNC polyhedra: minimize().
+bool
+test06() {
+ Variable x(0);
+ Constraint_System cs;
+ Linear_Expression LE = x;
+
+ Coefficient min_n = 0;
+ Coefficient min_d = 0;
+ bool min_included = false;
+ Generator min_g(point());
+
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(2*x > 3);
+ cs.insert(x < 14);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool ok = ps.minimize(LE, min_n, min_d, min_included)
+ && min_n == 3 && min_d == 2 && !min_included;
+ ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+ && min_n == 3 && min_d == 2 && !min_included
+ && min_g.is_closure_point()
+ && min_g.divisor() == 2;
+
+ nout << min_n << "/" << min_d;
+ nout << " @ ";
+ print_generator(min_g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ cs.clear();
+ cs.insert(2*x >= 3);
+ cs.insert(x < 14);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ ok = ps.minimize(LE, min_n, min_d, min_included)
+ && min_n == 3 && min_d == 2 && min_included;
+ ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+ && min_n == 3 && min_d == 2 && min_included
+ && min_g.is_point()
+ && min_g.divisor() == 2;
+
+ nout << min_n << "/" << min_d;
+ nout << " @ ";
+ print_generator(min_g);
+ nout << endl;
+
+ return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ Constraint_System cs;
+ Linear_Expression LE = x + y;
+
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 3);
+ cs.insert(x <= 4);
+ cs.insert(y >= 5);
+ cs.insert(y <= 8);
+ ps.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = ps.minimize(LE, num, den, included)
+ && num == 8 && den == 1 && included;
+ ok = ok && ps.minimize(LE, num, den, included, g)
+ && num == 8 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << num << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ if (!ok)
+ return false;
+
+ cs.clear();
+ cs.insert(x - y >= 1);
+ cs.insert(x <= 8);
+ cs.insert(y >= 2);
+ cs.insert(y <= 10);
+ ps.add_disjunct(C_Polyhedron(cs));
+
+ ok = ps.minimize(LE, num, den, included)
+ && num == 5 && den == 1 && included;
+ ok = ok && ps.minimize(LE, num, den, included, g)
+ && num == 5 && den == 1 && included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ nout << num << "/" << den;
+ nout << " @ ";
+ print_generator(g);
+ nout << endl;
+
+ return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test08() {
+ Variable x(0);
+ Linear_Expression LE = x;
+
+ Coefficient num = 0;
+ Coefficient den = 0;
+ bool included = false;
+ Generator g(point());
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ bool ok = !ps.minimize(LE, num, den, included)
+ && num == 0 && den == 0 && !included;
+ ok = ok && !ps.minimize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ if (!ok)
+ return false;
+
+ ps.add_disjunct(C_Polyhedron(1));
+ ok = !ps.minimize(LE, num, den, included, g)
+ && num == 0 && den == 0 && !included
+ && g.is_point()
+ && g.divisor() == 1;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST_F8(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST_F8(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+END_MAIN
diff --git a/tests/Powerset/meet1.cc b/tests/Powerset/meet1.cc
new file mode 100644
index 0000000..981cf70
--- /dev/null
+++ b/tests/Powerset/meet1.cc
@@ -0,0 +1,95 @@
+/* Test Pointset_Powerset<PH>::meet_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: meet_assign().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ c_ps.meet_assign(c_ps1);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 2);
+ Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+ c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.definitely_entails(c_ps_expected);
+ bool ok1 = !c_ps_expected.definitely_entails(c_ps);
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: meet_assign().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ pps_box.meet_assign(pps_box1);
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 2);
+ Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+ pps_box_expected.add_disjunct(TBox(cs));
+
+ bool ok = pps_box.definitely_entails(pps_box_expected);
+ bool ok1 = !pps_box_expected.definitely_entails(pps_box);
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/membytes1.cc b/tests/Powerset/membytes1.cc
new file mode 100644
index 0000000..ea127ef
--- /dev/null
+++ b/tests/Powerset/membytes1.cc
@@ -0,0 +1,69 @@
+/* Test Pointset_Powerset<PH>::total_memory_in_bytes().
+ Pointset_Powerset<PH>::external_memory_in_bytes().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: total_memory_in_bytes() and
+// external_memory_in_bytes().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+ bool ok = c_ps.is_bottom();
+
+ c_ps.add_disjunct(C_Polyhedron(1, UNIVERSE));
+
+ bool ok1 = c_ps.is_top();
+
+ c_ps.total_memory_in_bytes();
+ c_ps.external_memory_in_bytes();
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: total_memory_in_bytes() and external_memory_in_bytes().
+bool
+test02() {
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+
+ bool ok = pps_box.is_bottom();
+
+ pps_box.add_disjunct(TBox(1, UNIVERSE));
+
+ bool ok1 = pps_box.is_top();
+
+ pps_box.total_memory_in_bytes();
+ pps_box.external_memory_in_bytes();
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/powerset1.cc b/tests/Powerset/powerset1.cc
new file mode 100644
index 0000000..215bd3a
--- /dev/null
+++ b/tests/Powerset/powerset1.cc
@@ -0,0 +1,178 @@
+/* Test Powerset<D>.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Uses every public Powerset method.
+bool
+test01() {
+ typedef Powerset<FCAIBVP> PSET;
+
+ Variable A(0);
+
+ PSET ps1;
+ ps1.add_disjunct(FCAIBVP(A));
+
+ PSET ps2 = ps1;
+
+ if (ps2 != ps1 || !(ps2 == ps1))
+ return false;
+
+ using IO_Operators::operator<<;
+ nout << "ps1:" << endl << ps1 << endl;
+
+ FCAIBVP d(A);
+ PSET ps3(d);
+
+ if (!ps1.definitely_entails(ps3))
+ return false;
+
+ if (ps3.is_top())
+ return false;
+
+ if (ps1.is_bottom())
+ return false;
+
+ nout << "Total memory: " << ps3.total_memory_in_bytes() << endl
+ << "External memory: " << ps3.external_memory_in_bytes() << endl;
+
+ ps3.omega_reduce();
+
+ if (ps3.size() == 0)
+ return false;
+
+ if (ps3.empty())
+ return false;
+
+ // Iterator.
+ dimension_type count = 0;
+ for (PSET::iterator i = ps3.begin(); i != ps3.end(); ++i)
+ ++count;
+ if (count != 1)
+ return false;
+
+ // Constant iterator.
+ count = 0;
+ for (PSET::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
+ ++count;
+ if (count != 1)
+ return false;
+
+ // Reverse iterator.
+ count = 0;
+ for (PSET::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
+ ++count;
+ if (count != 1)
+ return false;
+
+ // Constant reverse iterator.
+ count = 0;
+ for (PSET::const_reverse_iterator i = ps3.rbegin(),
+ ps3_rend = ps3.rend(); i != ps3_rend; ++i)
+ ++count;
+ if (count != 1)
+ return false;
+
+ ps2 = ps3;
+ PSET ps_empty;
+ ps2.drop_disjunct(ps2.begin());
+ if (ps2 != ps_empty)
+ return false;
+
+ ps2 = ps3;
+ ps2.drop_disjuncts(ps2.begin(),ps2.end());
+ if (ps2 != ps_empty)
+ return false;
+
+ ps2 = ps3;
+ ps2.clear();
+ if (ps2 != ps_empty)
+ return false;
+
+ swap(ps3, ps2);
+ swap(ps3, ps2);
+ if (ps3 != ps1 || ps2 != ps_empty)
+ return false;
+
+ ps2 = ps_empty;
+ ps2.least_upper_bound_assign(ps3);
+ if (ps2 != ps3)
+ return false;
+
+ ps2 = ps_empty;
+ ps2.upper_bound_assign(ps3);
+ if (ps2 != ps3)
+ return false;
+
+ Variable B(1);
+ ps2 = ps1;
+ ps2.meet_assign(ps3);
+ if (ps2 != ps3)
+ return false;
+
+ ps3.collapse();
+ if (ps3.size() != 1)
+ return false;
+
+ return true;
+}
+
+bool
+test02() {
+ Variable X(0);
+ Variable Y(1);
+
+ FCAIBVP XY(X);
+ XY.meet_assign(FCAIBVP(Y));
+
+ Powerset<FCAIBVP> ps;
+
+ ps.add_disjunct(FCAIBVP(X));
+ ps.add_disjunct(XY);
+ return ps.OK();
+}
+
+bool
+test03() {
+ Variable X(0);
+ Variable Y(1);
+
+ FCAIBVP XY(X);
+ XY.meet_assign(FCAIBVP(Y));
+
+ Powerset<FCAIBVP> ps;
+
+ ps.add_disjunct(XY);
+ ps.add_disjunct(FCAIBVP(X));
+ return ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/reduce1.cc b/tests/Powerset/reduce1.cc
new file mode 100644
index 0000000..b424eea
--- /dev/null
+++ b/tests/Powerset/reduce1.cc
@@ -0,0 +1,81 @@
+/* Test Pointset_Powerset<PH>::omega_reduce().
+ Pointset_Powerset<PH>::pairwise_reduce().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: omega_reduce().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+ c_ps.omega_reduce();
+
+ bool ok = (c_ps.size() == 1);
+
+ return ok;
+}
+
+// Powerset of boxes: omega_reduce().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+ pps_box.add_disjunct(TBox(cs));
+ pps_box.omega_reduce();
+
+ bool ok = (pps_box.size() == 1);
+
+ return ok;
+}
+
+/* test07() in difference1.cc includes a use of pairwise_reduce
+ for C polyhedra. */
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/refinewith1.cc b/tests/Powerset/refinewith1.cc
new file mode 100644
index 0000000..db886be
--- /dev/null
+++ b/tests/Powerset/refinewith1.cc
@@ -0,0 +1,225 @@
+/* Test Pointset_Powerset<PH>::refine_with_constraint().
+ Pointset_Powerset<PH>::refine_with_constraints().
+ Pointset_Powerset<PH>::refine_with_congruence().
+ Pointset_Powerset<PH>::refine_with_congruences().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: refine_with_constraint(), refine_with_congruence().
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(A == 1);
+ ph1.add_constraint(C >= 0);
+ ph1.add_constraint(B >= 0);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(A <= 2);
+ ph2.add_constraint(B >= 2);
+ Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+ pps.add_disjunct(ph1);
+ pps.add_disjunct(ph2);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+ pps.refine_with_constraint(C == 0);
+ pps.refine_with_constraint(D < 0);
+ pps.refine_with_congruence(B + D %= 2);
+ pps.refine_with_congruence((B - D %= 2) / 0);
+
+
+ known_pps.add_constraint(C == 0);
+ known_pps.add_constraint(A <= 2);
+ known_pps.add_constraint(B <= 2);
+ known_pps.add_constraint(B - D == 2);
+
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+ i++;
+ C_Polyhedron phi1 = i->pointset();
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok;
+}
+
+// Powerset of C polyhedra: refine_with_constraints(),
+// refine_with_congruences().
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(A == 1);
+ ph1.add_constraint(C >= 0);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(A <= 2);
+ Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+ pps.add_disjunct(ph1);
+ pps.add_disjunct(ph2);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B >= 0);
+ cs.insert(B - C < 3);
+ cs.insert(D == 1);
+
+ Congruence_System cgs;
+ cgs.insert(A + B %= 0);
+ cgs.insert((C %= 2) / 0);
+
+ pps.refine_with_constraints(cs);
+ pps.refine_with_congruences(cgs);
+
+ known_pps.add_constraint(C == 2);
+ known_pps.add_constraint(D == 1);
+ known_pps.add_constraint(A + 2*B >= 0);
+ known_pps.add_constraint(B - C <= 3);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+ C_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+
+ return ok;
+}
+
+// Powerset of C polyhedra: refine_with_constraints(),
+// refine_with_congruences() make the powerset empty.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(A == 1);
+ ph1.add_constraint(C >= 0);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(A <= 2);
+ Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+ pps.add_disjunct(ph1);
+ pps.add_disjunct(ph2);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B >= 0);
+ cs.insert(B - C < 3);
+ cs.insert(A > 1);
+
+ Congruence_System cgs;
+ cgs.insert(A + B %= 0);
+ cgs.insert((B - C %= 4) / 0);
+
+ pps.refine_with_constraints(cs);
+ pps.refine_with_congruences(cgs);
+
+ Pointset_Powerset<C_Polyhedron> known_pps(4, EMPTY);
+
+ bool ok = (pps == known_pps);
+
+ return ok;
+}
+
+// Powerset of NNC polyhedra: refine_with_constraints(),
+// refine_with_congruences().
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ NNC_Polyhedron ph1(4);
+ ph1.add_constraint(A == 1);
+ ph1.add_constraint(C >= 0);
+ ph1.add_constraint(B >= 0);
+
+ NNC_Polyhedron ph2(4);
+ ph2.add_constraint(A <= 2);
+ ph2.add_constraint(B >= 2);
+ Pointset_Powerset<NNC_Polyhedron> pps(4, EMPTY);
+
+ pps.add_disjunct(ph1);
+ pps.add_disjunct(ph2);
+
+ Pointset_Powerset<NNC_Polyhedron> known_pps(pps);
+
+ Constraint_System cs;
+ cs.insert(A + 2*B >= 0);
+ cs.insert(B - C < 3);
+ cs.insert(D == 1);
+
+ Congruence_System cgs;
+ cgs.insert(A + B %= 0);
+ cgs.insert((C %= 2) / 0);
+
+ pps.refine_with_constraints(cs);
+ pps.refine_with_congruences(cgs);
+
+ known_pps.add_constraint(C == 2);
+ known_pps.add_constraint(D == 1);
+ known_pps.add_constraint(A + 2*B >= 0);
+ known_pps.add_constraint(B - C < 3);
+
+ bool ok = (pps == known_pps);
+
+ Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+ NNC_Polyhedron phi = i->pointset();
+ print_constraints(phi, "*** phi ***");
+ i++;
+ NNC_Polyhedron phi1 = i->pointset();
+ print_constraints(phi1, "*** phi1 ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/relationwith1.cc b/tests/Powerset/relationwith1.cc
new file mode 100644
index 0000000..d587f85
--- /dev/null
+++ b/tests/Powerset/relationwith1.cc
@@ -0,0 +1,278 @@
+/* Test Pointset_Powerset<PH>::relation_with().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: relation_with().
+bool
+test01() {
+ Variable x(0);
+ Constraint c = (x == 0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_constraint(c);
+ Congruence cg((x %= 0) / 0);
+ Poly_Con_Relation rel = ps.relation_with(cg);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ bool ok = (rel == known_rel);;
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test02() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x == 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Congruence cg((x %= 1) / 0);
+ Poly_Con_Relation rel = ps.relation_with(cg);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test03() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x == 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Congruence cg((x %= 3) / 4);
+ Poly_Con_Relation rel = ps.relation_with(cg);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test04() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x >= 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x <= 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Congruence cg((x %= 3) / 4);
+ Poly_Con_Relation rel = ps.relation_with(cg);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test05() {
+ Variable x(0);
+ Constraint c = (x == 0);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ ps.add_disjunct(C_Polyhedron(1));
+ ps.add_constraint(c);
+ Poly_Con_Relation rel = ps.relation_with(c);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+
+ bool ok = (rel == known_rel);;
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test06() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x == 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Constraint c(x == 1);
+ Poly_Con_Relation rel = ps.relation_with(c);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test07() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x == 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Constraint c(x >= 3);
+ Poly_Con_Relation rel = ps.relation_with(c);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test08() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x >= 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x <= 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Constraint c(x >= 3);
+ Poly_Con_Relation rel = ps.relation_with(c);
+
+ Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test09() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x == 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Generator g(point(x));
+ Poly_Gen_Relation rel = ps.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test10() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x <= 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Generator g(line(3*x));
+ Poly_Gen_Relation rel = ps.relation_with(g);
+
+ Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+ bool ok = (rel == known_rel);
+
+ return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+ DO_TEST(test10);
+END_MAIN
diff --git a/tests/Powerset/simplifyusingcontext1.cc b/tests/Powerset/simplifyusingcontext1.cc
new file mode 100644
index 0000000..28af59e
--- /dev/null
+++ b/tests/Powerset/simplifyusingcontext1.cc
@@ -0,0 +1,459 @@
+/* Test Pointset_Powerset::simplify_using_context_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps1.add_disjunct(ph);
+ ps2.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k >= 1);
+ ph.add_constraint(k <= 10);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(k == 0);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k >= 1);
+ ph.add_constraint(k <= 10);
+
+ ps1.add_disjunct(ph);
+ ps2.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(k >= 1);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i <= 25);
+ ph.add_constraint(j <= 25);
+ ph.add_constraint(i + j >= 25);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+ ps1_end = ps1.end(); it != ps1_end; ++it)
+ print_constraints(it->pointset());
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i <= 25);
+ ph.add_constraint(j <= 25);
+ ph.add_constraint(i + j >= 25);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 0);
+ ph.add_constraint(i <= 2);
+ ph.add_constraint(j >= 2);
+ ph.add_constraint(j <= 9);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j <= 10);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+ ps1_end = ps1.end(); it != ps1_end; ++it)
+ print_constraints(it->pointset());
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 1);
+ ph.add_constraint(i <= 10);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 28);
+ ph.add_constraint(i <= 31);
+ ph.add_constraint(j >= 1);
+ ph.add_constraint(j <= 10);
+ ph.add_constraint(k == 0);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i <= 25);
+ ph.add_constraint(j <= 25);
+ ph.add_constraint(i + j >= 25);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 30);
+ ph.add_constraint(i <= 32);
+ ph.add_constraint(j >= 2);
+ ph.add_constraint(j <= 9);
+ ph.add_constraint(k == 0);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i >= 28);
+ ph.add_constraint(i <= 31);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+ ps1_end = ps1.end(); it != ps1_end; ++it)
+ print_constraints(it->pointset());
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable i(0);
+ Variable j(1);
+ Variable k(2);
+
+ C_Polyhedron ph(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i == 1);
+ ph.add_constraint(j + 1 == 0);
+ ph.add_constraint(k == 3);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(i == 1);
+ ph.add_constraint(j + k == 2);
+ ph.add_constraint(k >= 0);
+ ph.add_constraint(k <= 3);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+ ph = C_Polyhedron(3, UNIVERSE);
+ ph.add_constraint(k == 3);
+ // ph.add_constraint(j + 1 == 0);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+ ps1_end = ps1.end(); it != ps1_end; ++it)
+ print_constraints(it->pointset());
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable i(0);
+ Variable j(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(i <= j);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(i == j);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, UNIVERSE);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+ ps1_end = ps1.end(); it != ps1_end; ++it)
+ print_constraints(it->pointset());
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(A >= 0);
+
+ ps1.add_disjunct(ph);
+
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(A <= 0);
+
+ ps2.add_disjunct(ph);
+
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(B >= 0);
+
+ ps2.add_disjunct(ph);
+
+ Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(A >= 0);
+ known_result.add_disjunct(ph);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+ iend = ps1.end(); i != iend; ++i)
+ print_constraints(i->pointset());
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+ Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+ // Populate ps1 with a single square.
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(A >= 10);
+ ph.add_constraint(A <= 40);
+ ph.add_constraint(B >= 10);
+ ph.add_constraint(B <= 40);
+
+ ps1.add_disjunct(ph);
+
+ nout << "Pointset_Powerset to be simplified:\n";
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+ iend = ps1.end(); i != iend; ++i) {
+ print_constraints(i->pointset());
+ nout << "\n";
+ }
+
+ // Populate ps2 with four squares intersecting the single square above.
+ ph = C_Polyhedron(2, UNIVERSE);
+ ph.add_constraint(A >= 0);
+ ph.add_constraint(A <= 20);
+ ph.add_constraint(B >= 0);
+ ph.add_constraint(B <= 20);
+
+ ps2.add_disjunct(ph);
+
+ ph.affine_image(B, B + 30);
+ ps2.add_disjunct(ph);
+
+ ph.affine_image(A, A + 30);
+ ps2.add_disjunct(ph);
+
+ ph.affine_image(B, B - 30);
+ ps2.add_disjunct(ph);
+
+ nout << "\nPointset_Powerset to be used as context:\n";
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps2.begin(),
+ iend = ps2.end(); i != iend; ++i) {
+ print_constraints(i->pointset());
+ nout << "\n";
+ }
+
+ Pointset_Powerset<C_Polyhedron> known_result(ps1);
+
+ ps1.simplify_using_context_assign(ps2);
+
+ bool ok = (ps1 == known_result);
+
+ for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+ iend = ps1.end(); i != iend; ++i) {
+ print_constraints(i->pointset());
+ nout << "\n";
+ }
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST_F8A(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
+ DO_TEST(test09);
+END_MAIN
diff --git a/tests/Powerset/size1.cc b/tests/Powerset/size1.cc
new file mode 100644
index 0000000..dad4020
--- /dev/null
+++ b/tests/Powerset/size1.cc
@@ -0,0 +1,75 @@
+/* Test Pointset_Powerset<PH>::size().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: size().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = (c_ps.size() == 2);
+
+ return ok;
+}
+
+// Powerset of boxes: size().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+ pps_box.add_disjunct(TBox(cs));
+
+ bool ok = (pps_box.size() == 2);
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/spacedims1.cc b/tests/Powerset/spacedims1.cc
new file mode 100644
index 0000000..1bdef39
--- /dev/null
+++ b/tests/Powerset/spacedims1.cc
@@ -0,0 +1,213 @@
+/* Test Pointset_Powerset<PH>::add_space_dimensions(),
+ Pointset_Powerset<PH>::remove_higher_space_dimensions(),
+ Pointset_Powerset<PH>::remove_space_dimensions(),
+ Pointset_Powerset<PH>::expand_space_dimensions(),
+ Pointset_Powerset<PH>::fold_space_dimensions().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_space_dimensions_and_embed(),
+// add_space_dimensions_and_project().
+bool
+test01() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x <= 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ dimension_type m = 2;
+
+ ps.add_space_dimensions_and_embed(m);
+ bool ok = (ps.space_dimension() == 3 && ps.affine_dimension() == 3);
+
+ ps.add_space_dimensions_and_project(m);
+ bool ok1 = (ps.space_dimension() == 5 && ps.affine_dimension() == 3);
+
+ ps.remove_higher_space_dimensions(4);
+ bool ok2 = (ps.space_dimension() == 4 && ps.affine_dimension() == 3);
+
+ Pointset_Powerset<Rational_Box> psb(7, EMPTY);
+ Rational_Box b(7);
+ b.add_constraint(x >= 1);
+ b.add_constraint(x <= 0);
+ psb.add_disjunct(b);
+ bool ok3 = (psb.space_dimension() == 7 && psb.affine_dimension() == 0);
+
+ Pointset_Powerset<Grid> psg(7, EMPTY);
+ Grid g(7);
+ g.add_congruence((x %= 0) / 2);
+ g.add_congruence((x %= 1) / 2);
+ psg.add_disjunct(g);
+ bool ok4 = (psg.space_dimension() == 7 && psg.affine_dimension() == 0);
+
+ return ok && ok1 && ok2 && ok3 && ok4 && ps.OK();
+}
+
+// Powerset of C polyhedra: remove_higher_space_dimensions().
+bool
+test02() {
+ Variable x(0);
+
+ C_Polyhedron ph1(1);
+ ph1.add_constraint(x == 1);
+
+ C_Polyhedron ph2(1);
+ ph2.add_constraint(x <= 2);
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ dimension_type m = 2;
+
+ ps.add_space_dimensions_and_embed(m);
+ bool ok = (ps.space_dimension() == 3 && ps.affine_dimension() == 3);
+
+ ps.add_space_dimensions_and_project(m);
+ bool ok1 = (ps.space_dimension() == 5 && ps.affine_dimension() == 3);
+
+ ps.remove_higher_space_dimensions(4);
+ bool ok2 = (ps.space_dimension() == 4 && ps.affine_dimension() == 3);
+
+ Pointset_Powerset<Rational_Box> psb(7, EMPTY);
+ Rational_Box b(7);
+ b.add_constraint(x >= 1);
+ b.add_constraint(x <= 0);
+ psb.add_disjunct(b);
+ bool ok3 = (psb.space_dimension() == 7 && psb.affine_dimension() == 0);
+
+ Pointset_Powerset<Grid> psg(7, EMPTY);
+ Grid g(7);
+ g.add_congruence((x %= 0) / 2);
+ g.add_congruence((x %= 1) / 2);
+ psg.add_disjunct(g);
+ bool ok4 = (psg.space_dimension() == 7 && psg.affine_dimension() == 0);
+
+ return ok && ok1 && ok2 && ok3 && ok4 && ps.OK();
+}
+
+// Powerset of C polyhedra: remove_space_dimensions().
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(x == 1);
+ ph1.add_constraint(z == 1);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(z == 1);
+ Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(w);
+
+ ps.remove_space_dimensions(to_be_removed);
+ bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 1);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: expand_space_dimension().
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(x == 1);
+ ph1.add_constraint(z == 1);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(z == 1);
+ Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ ps.expand_space_dimension(y, 2);
+ bool ok = (ps.space_dimension() == 6 && ps.affine_dimension() == 5);
+
+ return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: fold_space_dimensions().
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ C_Polyhedron ph1(4);
+ ph1.add_constraint(x == 1);
+ ph1.add_constraint(z == 1);
+
+ C_Polyhedron ph2(4);
+ ph2.add_constraint(x <= 2);
+ ph2.add_constraint(z == 1);
+ Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+ ps.add_disjunct(ph1);
+ ps.add_disjunct(ph2);
+
+ Variables_Set to_be_folded;
+ to_be_folded.insert(y);
+ to_be_folded.insert(w);
+
+ ps.fold_space_dimensions(to_be_folded, z);
+ bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 2);
+
+ return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/universe1.cc b/tests/Powerset/universe1.cc
new file mode 100644
index 0000000..6f67d28
--- /dev/null
+++ b/tests/Powerset/universe1.cc
@@ -0,0 +1,104 @@
+/* Test Pointset_Powerset<PH>::is_universe().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_universe().
+bool
+test01() {
+ Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+ bool b = !ps.is_universe();
+
+ ps.add_disjunct(C_Polyhedron(0));
+ bool b1 = ps.is_universe();
+ return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_universe().
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+ cs.clear();
+ cs.insert(x > 0);
+ cs.insert(x <= 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x < 1);
+ ps.add_disjunct(NNC_Polyhedron(cs));
+
+ bool b = !ps.is_universe();
+ return b;
+}
+
+// Powerset of C polyhedra: is_universe().
+bool
+test03() {
+ Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+ bool b = !ps.is_universe();
+
+ ps.add_disjunct(C_Polyhedron(1));
+
+ bool b1 = ps.is_universe();
+ return b && b1;
+}
+
+// Powerset of grids: is_universe().
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Pointset_Powerset<Grid> ps(2, EMPTY);
+ bool b0 = !ps.is_universe();
+
+ Grid g(2);
+ g.add_congruence((A %= 0) / 2);
+ ps.add_disjunct(g);
+ bool b1 = !ps.is_universe();
+
+ g = Grid(2);
+ g.add_congruence((A + B %= 0) / 2);
+ ps.add_disjunct(g);
+ bool b2 = !ps.is_universe();
+
+ g = Grid(2);
+ ps.add_disjunct(g);
+ bool b3 = ps.is_universe();
+
+ return b0 && b1 && b2 && b3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/upperbound1.cc b/tests/Powerset/upperbound1.cc
new file mode 100644
index 0000000..ecd9b86
--- /dev/null
+++ b/tests/Powerset/upperbound1.cc
@@ -0,0 +1,164 @@
+/* Test Pointset_Powerset<PH>::upper_bound_assign(),
+ Pointset_Powerset<PH>::least_upper_bound_assign().
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: least_upper_bound_assign().
+bool
+test01() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+ c_ps.least_upper_bound_assign(c_ps1);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+ c_ps2.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.definitely_entails(c_ps2);
+ bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+ return ok && ok1;
+}
+
+// Powerset of C polyhedra: upper_bound_assign().
+bool
+test02() {
+ Variable x(0);
+ Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+ c_ps1.add_disjunct(C_Polyhedron(cs));
+ c_ps.upper_bound_assign(c_ps1);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+ c_ps2.add_disjunct(C_Polyhedron(cs));
+
+ bool ok = c_ps.definitely_entails(c_ps2);
+ bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: upper_bound_assign().
+bool
+test03() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+ pps_box1.add_disjunct(TBox(cs));
+ pps_box.upper_bound_assign(pps_box1);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+ pps_box2.add_disjunct(TBox(cs));
+
+ bool ok = pps_box.definitely_entails(pps_box2);
+ bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+ return ok && ok1;
+}
+
+// Powerset of boxes: least_upper_bound_assign().
+bool
+test04() {
+ Variable x(0);
+ Pointset_Powerset<TBox> pps_box(1, EMPTY);
+ Constraint_System cs;
+
+ cs.insert(x >= 0);
+ cs.insert(x <= 2);
+ pps_box.add_disjunct(TBox(cs));
+
+ cs.clear();
+ cs.insert(x >= 1);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+ pps_box1.add_disjunct(TBox(cs));
+ pps_box.least_upper_bound_assign(pps_box1);
+
+ cs.clear();
+ cs.insert(x >= 0);
+ cs.insert(x <= 3);
+
+ Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+ pps_box2.add_disjunct(TBox(cs));
+
+ bool ok = pps_box.definitely_entails(pps_box2);
+ bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+ return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..efcc5f2
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,117 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+How To Use the Test Programs (If You Really Want To Use Them)
+=============================================================
+
+The programs in this directory are part of the extensive test suite of
+the Parma Polyhedra Library (PPL). They have various origins:
+
+1) some have been written to test the expressivity of the library;
+2) some have been written to reproduce bugs that have now been fixed;
+3) some have been written in order to increase the proportion of the
+ library's code exercised by test suite.
+
+Regardless of their origin, they are only used for the regression
+testing of the library. For this reason, we do not pay much attention
+to them; we simply keep adding new tests to the test suite and, once
+in, they stay there forever. Despite any defects, they serve this
+purpose well.
+
+On the other hand, in order to get an idea of how to use the PPL,
+several new users have found it convenient to take one of these test
+programs, change it a bit, and then try to compile it. If you want to
+do something similar, here is some advice that may help you get
+something working and completely self-contained in a matter of
+minutes:
+
+a) Replace the line
+
+ #include "ppl_test.hh"
+
+ with
+
+ #include <ppl.hh>
+
+b) Erase the line reading
+
+ set_handlers();
+
+c) Either remove the `TRY' and `CATCH' macro invocations from the program
+ or substitute `TRY' with `try' and `CATCH' with something like
+
+ catch (const std::exception& e) {
+ cerr << "std::exception caught: "
+ << e.what() << " (type == " << typeid(e).name() << ")"
+ << endl;
+ exit(1);
+ }
+ catch (...) {
+ cerr << "unknown exception caught"
+ << endl;
+ exit(1);
+ }
+
+d) If you want to print something make sure the expansion of the `NOISY'
+ macro evaluates to true; add the line
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+
+ just after the other two using directives of the program; and then
+ use the PPL output facilities directly. For instance, the effect of a
+ line like
+
+ print_constraints(ph, "*** ph ***");
+
+ can be obtained, more or less, by replacing it with
+
+ cout << "*** ph ***" << endl << ph.constraints() << endl;
+
+ Similarly, a line of the form
+
+ print_generators(ph, "*** ph ***");
+
+ can be replaced by
+
+ cout << "*** ph ***" << endl << ph.generators() << endl;
+
+e) Compile the program with a command like
+
+ g++ mytest.cc -o mytest -lppl -lgmpxx -lgmp
+
+f) Run `mytest' and enjoy!
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version. The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/tests/Random_Number_Generator_defs.hh b/tests/Random_Number_Generator_defs.hh
new file mode 100644
index 0000000..6dd7f96
--- /dev/null
+++ b/tests/Random_Number_Generator_defs.hh
@@ -0,0 +1,47 @@
+/* Random_Number_Generator class declaration.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_defs_hh
+#define PPL_Random_Number_Generator_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator {
+public:
+ Random_Number_Generator();
+
+ explicit Random_Number_Generator(unsigned long seed);
+
+ template <typename T>
+ void get(T& x, unsigned int info);
+
+private:
+ gmp_randclass rand;
+ unsigned int max_bits;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Random_Number_Generator_inlines.hh"
+
+#endif // !defined(PPL_Random_Number_Generator_defs_hh)
diff --git a/tests/Random_Number_Generator_inlines.hh b/tests/Random_Number_Generator_inlines.hh
new file mode 100644
index 0000000..885f2b0
--- /dev/null
+++ b/tests/Random_Number_Generator_inlines.hh
@@ -0,0 +1,92 @@
+/* Random_Number_Generator class implementation: inline functions.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_inlines_hh
+#define PPL_Random_Number_Generator_inlines_hh 1
+
+#include <ctime>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace Random_Numbers {
+
+template <typename T>
+class Random_Number_Generator_Aux {
+public:
+ Random_Number_Generator_Aux(unsigned int max_bits) {
+ if (std::numeric_limits<T>::is_bounded) {
+ assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+ assign_r(zrange, std::numeric_limits<T>::max(), ROUND_NOT_NEEDED);
+ zrange -= zmin;
+ ++zrange;
+ }
+ else if (std::numeric_limits<T>::is_signed) {
+ zmin = 1;
+ zmin <<= (max_bits - 1);
+ zmin = -zmin;
+ }
+ else {
+ assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+ }
+ }
+ mpz_class zmin;
+ mpz_class zrange;
+};
+
+} // namespace Random_Numbers
+} // namespace Implementation
+
+inline
+Random_Number_Generator::Random_Number_Generator()
+ : rand(gmp_randinit_default), max_bits(512) {
+ // Seed the random number generator with the current time.
+ rand.seed((unsigned long) time(0));
+}
+
+inline
+Random_Number_Generator::Random_Number_Generator(const unsigned long seed)
+ : rand(gmp_randinit_default), max_bits(512) {
+ // Seed the random number generator with the given value.
+ rand.seed(seed);
+}
+
+template <typename T>
+inline void
+Random_Number_Generator::get(T& x, unsigned int) {
+ using Implementation::Random_Numbers::Random_Number_Generator_Aux;
+ static Random_Number_Generator_Aux<T> aux(max_bits);
+ mpz_class n;
+ if (std::numeric_limits<T>::is_bounded) {
+ n = rand.get_z_range(aux.zrange);
+ }
+ else {
+ n = rand.get_z_bits(max_bits);
+ }
+ n += aux.zmin;
+ assign_r(x, n, ROUND_NOT_NEEDED);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Random_Number_Generator_inlines_hh)
diff --git a/tests/Random_Number_Generator_types.hh b/tests/Random_Number_Generator_types.hh
new file mode 100644
index 0000000..45e2bf5
--- /dev/null
+++ b/tests/Random_Number_Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Random_Number_Generator_types_hh
+#define PPL_Random_Number_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator;
+
+}
+
+#endif // !defined(PPL_Random_Number_Generator_types_hh)
diff --git a/tests/Watchdog/Makefile.am b/tests/Watchdog/Makefile.am
new file mode 100644
index 0000000..dbb66ca
--- /dev/null
+++ b/tests/Watchdog/Makefile.am
@@ -0,0 +1,70 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ . */
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la
+
+EXTRA_DIST =
+
+TESTS = \
+watchdog1
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+watchdog1_SOURCES = watchdog1.cc
+
+check_PROGRAMS = $(TESTS)
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Watchdog/Makefile.in b/tests/Watchdog/Makefile.in
new file mode 100644
index 0000000..8983f83
--- /dev/null
+++ b/tests/Watchdog/Makefile.in
@@ -0,0 +1,1097 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ . */
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = watchdog1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Watchdog
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = watchdog1$(EXEEXT)
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(watchdog1_SOURCES)
+DIST_SOURCES = $(watchdog1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red='[0;31m'; \
+ grn='[0;32m'; \
+ lgn='[1;32m'; \
+ blu='[1;34m'; \
+ mgn='[0;35m'; \
+ brg='[1m'; \
+ std='[m'; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER =
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la
+
+EXTRA_DIST =
+
+#
+# Sources for the tests
+#
+watchdog1_SOURCES = watchdog1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Watchdog/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Watchdog/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES)
+ @rm -f watchdog1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ else \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+watchdog1.log: watchdog1$(EXEEXT)
+ @p='watchdog1$(EXEEXT)'; \
+ b='watchdog1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@ @p='$<'; \
+ at am__EXEEXT_TRUE@ $(am__set_b); \
+ at am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/tests/libppl_tests.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Watchdog/watchdog1.cc b/tests/Watchdog/watchdog1.cc
new file mode 100644
index 0000000..5738a38
--- /dev/null
+++ b/tests/Watchdog/watchdog1.cc
@@ -0,0 +1,78 @@
+/* Some simple tests for the basic functionality of PPL::Watchdog.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+volatile bool interrupt = false;
+
+void
+do_interrupt() {
+ interrupt = true;
+}
+
+bool
+test01() {
+ const int csecs = 10;
+ try {
+ bool ok;
+ {
+ Watchdog w(csecs, do_interrupt);
+ nout << ((float) csecs)/100.0 << " seconds watchdog" << endl;
+
+ nout << "starting iteration... " << std::flush;
+ for (unsigned long i = 0; i < 1000000000; ++i) {
+ if (interrupt) {
+ nout << "interrupted" << endl;
+ ok = true;
+ goto done;
+ }
+ }
+ nout << "not interrupted" << endl;
+ ok = false;
+ done:
+ ;
+ }
+ interrupt = false;
+ return ok;
+ }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ catch (const std::logic_error& e) {
+ nout << "std::logic_error caught (" << e.what() << ")" << endl;
+ return true;
+ }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+ catch (...) {
+ return false;
+ }
+ // Should never get here.
+ return false;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/files.cc b/tests/files.cc
new file mode 100644
index 0000000..2fe1004
--- /dev/null
+++ b/tests/files.cc
@@ -0,0 +1,51 @@
+/* Definition of simple helper functions to open and close files.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "files.hh"
+#include <fstream>
+#include <iostream>
+#include <cstdlib>
+
+using namespace std;
+
+void
+open(fstream& s, const char* path, ios_base::openmode mode) {
+ s.open(path, mode);
+ if (!s) {
+ cerr << "Cannot open `" << path << "'";
+ if (mode == ios_base::in)
+ cerr << " for reading";
+ else if (mode == ios_base::out)
+ cerr << " for writing";
+ else if (mode == (ios_base::in | ios_base::out))
+ cerr << " for reading/writing";
+ cerr << endl;
+ exit(1);
+ }
+}
+
+void
+close(fstream& s) {
+ if (s)
+ s.close();
+}
diff --git a/tests/files.hh b/tests/files.hh
new file mode 100644
index 0000000..a9531f2
--- /dev/null
+++ b/tests/files.hh
@@ -0,0 +1,36 @@
+/* Declaration of simple helper functions to open and close files.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_files_hh
+#define PPL_files_hh 1
+
+#include <iostream>
+#include <fstream>
+
+void
+open(std::fstream& s, const char* path, std::ios_base::openmode mode);
+
+void
+close(std::fstream& s);
+
+#endif // !defined(PPL_files_hh)
diff --git a/tests/ppl_test.cc b/tests/ppl_test.cc
new file mode 100644
index 0000000..ad9d6df
--- /dev/null
+++ b/tests/ppl_test.cc
@@ -0,0 +1,487 @@
+/* Implementation of utility functions used in test programs.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <csignal>
+#include <iostream>
+#include <exception>
+#include <limits>
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#endif
+
+namespace {
+
+void
+unexpected_exception_handler() {
+ std::cerr << "unexpected exception thrown" << std::endl;
+ exit(1);
+}
+
+void
+uncaught_exception_handler() {
+ std::cerr << "uncaught exception" << std::endl;
+ exit(1);
+}
+
+#if PPL_HAVE_DECL_SIGACTION
+
+#if defined(PPL_HAVE_SIGINFO_T) && defined(SA_SIGINFO)
+
+void
+fpe_sigaction(int sig, siginfo_t* sip, void*) {
+ if (sig != SIGFPE) {
+ std::cerr << "fpe_handler called on signal different from SIGFPE"
+ << std::endl;
+ exit(1);
+ }
+ const char* s = 0;
+ switch (sip->si_code) {
+ case FPE_INTDIV:
+ s = "integer divide by zero";
+ break;
+ case FPE_INTOVF:
+ s = "integer overflow";
+ break;
+ case FPE_FLTDIV:
+ s = "floating point divide by zero";
+ break;
+ case FPE_FLTOVF:
+ s = "floating point overflow";
+ break;
+ case FPE_FLTUND:
+ s = "floating point underflow";
+ break;
+ case FPE_FLTRES:
+ s = "floating point inexact result";
+ break;
+ case FPE_FLTINV:
+ s = "floating point invalid operation";
+ break;
+ case FPE_FLTSUB:
+ s = "subscript out of range";
+ break;
+ default:
+ break;
+ }
+ if (s != 0)
+ std::cerr << "SIGFPE caught (cause: " << s << ")"
+ << std::endl;
+ else {
+ std::cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")"
+ << std::endl;
+#if defined(PPL_HAVE_FENV_H)
+ std::cerr << "Inquire with fetestexcept(): ";
+#ifdef FE_INEXACT
+ if (fetestexcept(FE_INEXACT))
+ std::cerr << "FE_INEXACT ";
+#endif
+#ifdef FE_DIVBYZERO
+ if (fetestexcept(FE_DIVBYZERO))
+ std::cerr << "FE_DIVBYZERO ";
+#endif
+#ifdef FE_UNDERFLOW
+ if (fetestexcept(FE_UNDERFLOW))
+ std::cerr << "FE_UNDERFLOW ";
+#endif
+#ifdef FE_OVERFLOW
+ if (fetestexcept(FE_OVERFLOW))
+ std::cerr << "FE_OVERFLOW ";
+#endif
+#if FE_INVALID
+ if (fetestexcept(FE_INVALID))
+ std::cerr << "FE_INVALID ";
+#endif
+ std::cerr << std::endl;
+#endif // defined(PPL_HAVE_FENV_H)
+ }
+ exit(1);
+}
+
+#else // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+
+void
+fpe_handler(int sig) {
+ if (sig != SIGFPE) {
+ std::cerr << "fpe_handler called on signal different from SIGFPE"
+ << std::endl;
+ exit(1);
+ }
+ std::cerr << "SIGFPE caught"
+ << std::endl;
+#if defined(PPL_HAVE_FENV_H)
+ std::cerr << "Inquire with fetestexcept(): ";
+#ifdef FE_INEXACT
+ if (fetestexcept(FE_INEXACT))
+ std::cerr << "FE_INEXACT ";
+#endif
+#ifdef FE_DIVBYZERO
+ if (fetestexcept(FE_DIVBYZERO))
+ std::cerr << "FE_DIVBYZERO ";
+#endif
+#ifdef FE_UNDERFLOW
+ if (fetestexcept(FE_UNDERFLOW))
+ std::cerr << "FE_UNDERFLOW ";
+#endif
+#ifdef FE_OVERFLOW
+ if (fetestexcept(FE_OVERFLOW))
+ std::cerr << "FE_OVERFLOW ";
+#endif
+#if FE_INVALID
+ if (fetestexcept(FE_INVALID))
+ std::cerr << "FE_INVALID ";
+#endif
+ std::cerr << std::endl;
+#endif // defined(PPL_HAVE_FENV_H)
+ exit(1);
+}
+
+#endif // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+
+#endif // PPL_HAVE_DECL_SIGACTION
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+namespace Test {
+
+void
+set_handlers() {
+#if PPL_HAVE_DECL_SIGACTION
+ struct sigaction action;
+ sigemptyset(&action.sa_mask);
+#if defined(PPL_HAVE_SIGINFO_T) && defined(SA_SIGINFO)
+ action.sa_sigaction = fpe_sigaction;
+ action.sa_flags = SA_SIGINFO;
+#else // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+ action.sa_handler = fpe_handler;
+ action.sa_flags = 0;
+#endif // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+ if (sigaction(SIGFPE, &action, NULL) != 0) {
+ std::cerr << "sigaction() failed"
+ << std::endl;
+ abort();
+ }
+#endif // PPL_HAVE_DECL_SIGACTION
+
+ std::set_unexpected(unexpected_exception_handler);
+ std::set_terminate(uncaught_exception_handler);
+}
+
+bool
+check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+ const char* max_d_s, const char* d_name) {
+ Checked_Number<mpq_class, Extended_Number_Policy>
+ max_d((max_d_s ? max_d_s : "0"), ROUND_NOT_NEEDED);
+ assert(max_d >= 0);
+ if (d > max_d) {
+ nout << "Excessive " << d_name << " distance ";
+ if (is_plus_infinity(d))
+ nout << "+inf";
+ else if (raw_value(d) > std::numeric_limits<double>::max())
+ nout << ">" << std::numeric_limits<double>::max();
+ else
+ nout << raw_value(d).get_d() << " (rounded towards zero)";
+ nout << ": should be at most " << max_d << "."
+ << std::endl;
+ return false;
+ }
+ else
+ return true;
+}
+
+bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+ const BD_Shape<mpq_class>& known_result) {
+ if (computed_result == known_result)
+ return true;
+ else {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << endl;
+ return false;
+ }
+}
+
+bool
+check_result(const Rational_Box& computed_result,
+ const Rational_Box& known_result) {
+ if (computed_result == known_result)
+ return true;
+ else {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << endl;
+ return false;
+ }
+}
+
+bool
+check_result(const Generator& computed_result,
+ const Generator& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ // Handle in a more efficient way the case where equality is expected.
+ if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+ if (computed_result != known_result) {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+ rectilinear_distance_assign(r_d, known_result, computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+ euclidean_distance_assign(e_d, known_result, computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+ l_infinity_distance_assign(l_d, known_result, computed_result, ROUND_UP);
+ bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+ bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+ bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+ bool ok = ok_r && ok_e && ok_l;
+ if (!ok) {
+ using IO_Operators::operator<<;
+ nout << "Computed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << endl;
+ }
+ return ok;
+}
+
+bool
+check_result(const Checked_Number<mpq_class, Extended_Number_Policy>& computed,
+ const Checked_Number<mpq_class, Extended_Number_Policy>& known,
+ const char* max_r_d_s) {
+ // Handle in a more efficient way the case where equality is expected.
+ if (max_r_d_s == 0) {
+ if (computed != known) {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed
+ << "\nknown result is\n"
+ << known
+ << endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+ sub_assign_r(r_d, known, computed, ROUND_NOT_NEEDED);
+ abs_assign_r(r_d, r_d, ROUND_NOT_NEEDED);
+ bool ok = check_distance(r_d, max_r_d_s, "rectilinear");
+ if (!ok) {
+ using IO_Operators::operator<<;
+ nout << "Computed result is\n"
+ << computed
+ << "\nknown result is\n"
+ << known
+ << endl;
+ }
+ return ok;
+}
+
+std::ostream&
+operator<<(std::ostream& s, const FCAIBVP& x) {
+ s << "{";
+ for (FCAIBVP::Set::const_iterator i = x.set.begin(),
+ x_end = x.set.end(); i != x_end; ) {
+ const Variable v(*i++);
+ using IO_Operators::operator<<;
+ s << v;
+ if (i != x_end)
+ s << ", ";
+ }
+ s << "}";
+ return s;
+}
+
+void
+print_constraint(const Constraint& c,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ using IO_Operators::operator<<;
+ s << c << std::endl;
+}
+
+void
+print_constraints(const Polyhedron& ph,
+ const std::string& intro, std::ostream& s) {
+ print_constraints(ph.constraints(), intro, s);
+}
+
+#if 0
+void
+print_constraints(const Affine_Space& affs,
+ const std::string& intro, std::ostream& s) {
+ print_constraints(affs.constraints(), intro, s);
+}
+#endif
+
+void
+print_constraints(const Constraint_System& cs,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ Constraint_System::const_iterator i = cs.begin();
+ Constraint_System::const_iterator cs_end = cs.end();
+ bool printed_something = i != cs_end;
+ while (i != cs_end) {
+ using IO_Operators::operator<<;
+ s << *i++;
+ if (i != cs_end)
+ s << ",\n";
+ }
+ s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruence(const Congruence& c,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ using IO_Operators::operator<<;
+ s << c << std::endl;
+}
+
+void
+print_congruences(const Congruence_System& cs,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ Congruence_System::const_iterator i = cs.begin();
+ Congruence_System::const_iterator cs_end = cs.end();
+ bool printed_something = i != cs_end;
+ while (i != cs_end) {
+ using IO_Operators::operator<<;
+ s << *i++;
+ if (i != cs_end)
+ s << "," << std::endl;
+ }
+ s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruences(const Grid& gr,
+ const std::string& intro, std::ostream& s) {
+ print_congruences(gr.congruences(), intro, s);
+}
+
+void
+print_generator(const Generator& g,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ using IO_Operators::operator<<;
+ s << g << std::endl;
+}
+
+void
+print_generator(const Grid_Generator& g,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ using IO_Operators::operator<<;
+ s << g << std::endl;
+}
+
+void
+print_generators(const Polyhedron& ph,
+ const std::string& intro, std::ostream& s) {
+ print_generators(ph.generators(), intro, s);
+}
+
+void
+print_generators(const Grid& gr,
+ const std::string& intro, std::ostream& s) {
+ print_generators(gr.grid_generators(), intro, s);
+}
+
+void
+print_generators(const Generator_System& gs,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ Generator_System::const_iterator i = gs.begin();
+ Generator_System::const_iterator gs_end = gs.end();
+ bool printed_something = i != gs_end;
+ while (i != gs_end) {
+ using IO_Operators::operator<<;
+ s << *i++;
+ if (i != gs_end)
+ s << ",\n";
+ }
+ s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_generators(const Grid_Generator_System& gs,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ Grid_Generator_System::const_iterator i = gs.begin();
+ Grid_Generator_System::const_iterator gs_end = gs.end();
+ bool printed_something = i != gs_end;
+ while (i != gs_end) {
+ using IO_Operators::operator<<;
+ s << *i++;
+ if (i != gs_end)
+ s << ",\n";
+ }
+ s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ function.print(s);
+}
+
+} // namespace Test
+
+} // namespace Parma_Polyhedra_Library
diff --git a/tests/ppl_test.hh b/tests/ppl_test.hh
new file mode 100644
index 0000000..e45338b
--- /dev/null
+++ b/tests/ppl_test.hh
@@ -0,0 +1,1159 @@
+/* Header file for test programs.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_test_hh
+#define PPL_ppl_test_hh 1
+
+#include "ppl_header.hh"
+#include "Random_Number_Generator_defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <list>
+#include <map>
+#include <iterator>
+#include <string>
+#include <iostream>
+#include <algorithm>
+#include <typeinfo>
+#include <cstdlib>
+
+#ifndef NOISY
+#define NOISY 0
+#endif
+
+#ifndef VERY_NOISY
+#define VERY_NOISY 0
+#endif
+
+#define TRY try
+
+#define CATCH \
+catch (const std::overflow_error& e) { \
+ std::cerr << "arithmetic overflow (" << e.what() << ")" \
+ << std::endl; \
+ exit(1); \
+} \
+catch (const std::exception& e) { \
+ std::cerr << "std::exception caught: " \
+ << e.what() << " (type == " << typeid(e).name() << ")" \
+ << std::endl; \
+ exit(1); \
+}
+
+#define BEGIN_MAIN \
+int \
+main() try { \
+ set_handlers(); \
+ bool succeeded = false; \
+ bool overflow = false; \
+ (void) overflow; \
+ std::list<std::string> failed_tests; \
+ std::list<std::string> unexpectedly_succeeded_tests;
+
+#define END_MAIN \
+ if (!failed_tests.empty()) { \
+ std::cerr << "tests failed: "; \
+ std::copy(failed_tests.begin(), \
+ failed_tests.end(), \
+ std::ostream_iterator<std::string>(std::cerr, " ")); \
+ std::cerr << std::endl; \
+ return 1; \
+ } \
+ if (!unexpectedly_succeeded_tests.empty()) { \
+ std::cerr << "tests unexpectedly succeeded: "; \
+ std::copy(unexpectedly_succeeded_tests.begin(), \
+ unexpectedly_succeeded_tests.end(), \
+ std::ostream_iterator<std::string>(std::cerr, " ")); \
+ std::cerr << std::endl; \
+ return 1; \
+ } \
+ return 0; \
+} \
+catch (const std::overflow_error& e) { \
+ std::cerr << "arithmetic overflow (" << e.what() << ")" \
+ << std::endl; \
+ exit(1); \
+} \
+catch (const std::exception& e) { \
+ std::cerr << "std::exception caught: " \
+ << e.what() << " (type == " << typeid(e).name() << ")" \
+ << std::endl; \
+ exit(1); \
+}
+
+#define ANNOUNCE_TEST(test) \
+ nout << "\n=== " #test " ===" << std::endl
+
+#define RUN_TEST(test) \
+ try { \
+ overflow = false; \
+ succeeded = test(); \
+ } \
+ catch (const std::overflow_error& e) { \
+ nout << "arithmetic overflow (" << e.what() << ")" \
+ << std::endl; \
+ overflow = true; \
+ succeeded = false; \
+ } \
+ catch (const std::exception& e) { \
+ nout << "std::exception caught: " \
+ << e.what() << " (type == " << typeid(e).name() << ")" \
+ << std::endl; \
+ succeeded = false; \
+ } \
+ catch (...) { \
+ nout << "unknown exception caught" \
+ << std::endl; \
+ succeeded = false; \
+ }
+
+#define DO_TEST(test) \
+ ANNOUNCE_TEST(test); \
+ RUN_TEST(test); \
+ if (!succeeded) \
+ failed_tests.push_back(#test);
+
+#define DO_TEST_F(test) \
+ ANNOUNCE_TEST(test); \
+ RUN_TEST(test); \
+ if (succeeded) \
+ unexpectedly_succeeded_tests.push_back(#test);
+
+#define DO_TEST_OVERFLOW(test) \
+ ANNOUNCE_TEST(test); \
+ RUN_TEST(test); \
+ if (succeeded) \
+ unexpectedly_succeeded_tests.push_back(#test); \
+ else if (!overflow) \
+ failed_tests.push_back(#test);
+
+#define DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ ANNOUNCE_TEST(test); \
+ RUN_TEST(test); \
+ if (!succeeded) \
+ if (!overflow || has_exact_coefficient_type(shape(0, EMPTY))) \
+ failed_tests.push_back(#test);
+
+
+// Macros for arbitrary combination of preprocessor conditions.
+
+#define PPL_CPP_AND_false_false false
+#define PPL_CPP_AND_false_true false
+#define PPL_CPP_AND_true_false false
+#define PPL_CPP_AND_true_true true
+#define PPL_CPP_AND_(x,y) PPL_CPP_AND_ ## x ## _ ## y
+#define PPL_CPP_AND(x,y) PPL_CPP_AND_(x, y)
+
+#define PPL_CPP_OR_false_false false
+#define PPL_CPP_OR_false_true true
+#define PPL_CPP_OR_true_false true
+#define PPL_CPP_OR_true_true true
+#define PPL_CPP_OR_(x,y) PPL_CPP_OR_ ## x ## _ ## y
+#define PPL_CPP_OR(x,y) PPL_CPP_OR_(x, y)
+
+#define PPL_CPP_NOT_false true
+#define PPL_CPP_NOT_true false
+#define PPL_CPP_NOT_(x) PPL_CPP_NOT_ ## x
+#define PPL_CPP_NOT(x) PPL_CPP_NOT_(x)
+
+#define PPL_CPP_VAL_true_ true
+#define PPL_CPP_VAL_false_ false
+#define PPL_CPP_VAL_false(v) PPL_CPP_VAL_true
+#define PPL_CPP_VAL_b(v) PPL_CPP_VAL_false
+#define PPL_CPP_VAL_a(v) PPL_CPP_VAL_b(v)
+
+#define PPL_CPP_IS_NEGx_arg_neg 0)(0
+#define PPL_CPP_IS_NEGx(v) PPL_CPP_VAL_a(PPL_CPP_IS_NEGx_arg_##v)
+
+#define PPL_CPP_IS_NEG__(v) v ## _
+#define PPL_CPP_IS_NEG_(v) PPL_CPP_IS_NEG__(v)
+#define PPL_CPP_IS_NEG(v) PPL_CPP_IS_NEG_(PPL_CPP_IS_NEGx(v))
+
+#define PPL_CPP_IS_ZEROx_arg_0 0)(0
+#define PPL_CPP_IS_ZEROx(v) PPL_CPP_VAL_a(PPL_CPP_IS_ZEROx_arg_##v)
+
+#define PPL_CPP_IS_ZERO__(v) v ## _
+#define PPL_CPP_IS_ZERO_(v) PPL_CPP_IS_ZERO__(v)
+#define PPL_CPP_IS_ZERO(v) PPL_CPP_IS_ZERO_(PPL_CPP_IS_ZEROx(v))
+
+#define PPL_CPP_DECR_neg neg
+#define PPL_CPP_DECR_0 neg
+#define PPL_CPP_DECR_1 0
+#define PPL_CPP_DECR_2 1
+#define PPL_CPP_DECR_3 2
+#define PPL_CPP_DECR_4 3
+#define PPL_CPP_DECR_5 4
+#define PPL_CPP_DECR_6 5
+#define PPL_CPP_DECR_7 6
+#define PPL_CPP_DECR_8 7
+#define PPL_CPP_DECR_9 8
+
+#define PPL_CPP_DECR_(x) PPL_CPP_DECR_ ## x
+#define PPL_CPP_DECR(x) PPL_CPP_DECR_(x)
+
+#define PPL_CPP_SUB_0(x) x
+#define PPL_CPP_SUB_1(x) PPL_CPP_DECR(x)
+#define PPL_CPP_SUB_2(x) PPL_CPP_DECR(PPL_CPP_SUB_1(x))
+#define PPL_CPP_SUB_3(x) PPL_CPP_DECR(PPL_CPP_SUB_2(x))
+#define PPL_CPP_SUB_4(x) PPL_CPP_DECR(PPL_CPP_SUB_3(x))
+#define PPL_CPP_SUB_5(x) PPL_CPP_DECR(PPL_CPP_SUB_4(x))
+#define PPL_CPP_SUB_6(x) PPL_CPP_DECR(PPL_CPP_SUB_5(x))
+#define PPL_CPP_SUB_7(x) PPL_CPP_DECR(PPL_CPP_SUB_6(x))
+#define PPL_CPP_SUB_8(x) PPL_CPP_DECR(PPL_CPP_SUB_7(x))
+#define PPL_CPP_SUB_9(x) PPL_CPP_DECR(PPL_CPP_SUB_8(x))
+
+#define PPL_CPP_SUB_(x, y) PPL_CPP_SUB_ ## y (x)
+#define PPL_CPP_SUB(x, y) PPL_CPP_SUB_(x, y)
+
+#define PPL_CPP_LT(x, y) PPL_CPP_IS_NEG(PPL_CPP_SUB(x, y))
+#define PPL_CPP_GT(x, y) PPL_CPP_LT(y, x)
+#define PPL_CPP_LE(x, y) PPL_CPP_NOT(PPL_CPP_LT(y, x))
+#define PPL_CPP_GE(x, y) PPL_CPP_NOT(PPL_CPP_LT(x, y))
+#define PPL_CPP_EQ(x, y) PPL_CPP_IS_ZERO(PPL_CPP_SUB(x, y))
+#define PPL_CPP_NE(x, y) PPL_CPP_NOT(PPL_CPP_EQ(x,y))
+
+#define PPL_CPP_LOG2_64 6
+#define PPL_CPP_LOG2_32 5
+#define PPL_CPP_LOG2_16 4
+#define PPL_CPP_LOG2_8 3
+#define PPL_CPP_LOG2_0 neg
+
+#define PPL_CPP_LOG2_(x) PPL_CPP_LOG2_ ## x
+#define PPL_CPP_LOG2(x) PPL_CPP_LOG2_(x)
+
+#define COND_MACRO_2(prefix, v) prefix ## _ ## v
+#define COND_MACRO_1(prefix, v) COND_MACRO_2(prefix, v)
+#define COND_MACRO(prefix, expr) COND_MACRO_1(prefix, expr)
+
+
+#define PPL_CPP_LOGBITS PPL_CPP_LOG2(PPL_COEFFICIENT_BITS)
+
+#define COND_F64 PPL_CPP_LT(PPL_CPP_LOGBITS, 0)
+#define COND_F32 PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 5), \
+ PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+#define COND_F16 PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 4), \
+ PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+#define COND_F8 PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 3), \
+ PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+
+#ifndef NDEBUG
+# define COND_ASSERT_OFF false
+#else
+# define COND_ASSERT_OFF true
+#endif
+
+#define COND_SUCC_64_ONLY \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 6), COND_ASSERT_OFF)
+#define COND_SUCC_32_ONLY \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 5), COND_ASSERT_OFF)
+#define COND_SUCC_16_ONLY \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 4), COND_ASSERT_OFF)
+#define COND_SUCC_8_ONLY \
+ PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 3), COND_ASSERT_OFF)
+
+#define COND_F64A PPL_CPP_OR(COND_F64, COND_SUCC_64_ONLY)
+#define COND_F32A PPL_CPP_OR(COND_F32, COND_SUCC_32_ONLY)
+#define COND_F16A PPL_CPP_OR(COND_F16, COND_SUCC_16_ONLY)
+#define COND_F8A PPL_CPP_OR(COND_F8, COND_SUCC_8_ONLY)
+
+
+#define COND_DO_TEST_false(test) DO_TEST_OVERFLOW(test)
+#define COND_DO_TEST_true(test) DO_TEST(test)
+#define COND_DO_TEST(cond, test) COND_MACRO(COND_DO_TEST, cond)(test)
+
+#define DO_TEST_F64(test) COND_DO_TEST(COND_F64, test)
+#define DO_TEST_F64A(test) COND_DO_TEST(COND_F64A, test)
+#define DO_TEST_F32(test) COND_DO_TEST(COND_F32, test)
+#define DO_TEST_F32A(test) COND_DO_TEST(COND_F32A, test)
+#define DO_TEST_F16(test) COND_DO_TEST(COND_F16, test)
+#define DO_TEST_F16A(test) COND_DO_TEST(COND_F16A, test)
+#define DO_TEST_F8(test) COND_DO_TEST(COND_F8, test)
+#define DO_TEST_F8A(test) COND_DO_TEST(COND_F8A, test)
+
+
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT_false(test, shape) \
+ DO_TEST_OVERFLOW(test)
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT_true(test, shape) \
+ DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(cond, test, shape) \
+ COND_MACRO(COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT, cond)(test, shape)
+
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F64, test, shape)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F64A, test, shape)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F32, test, shape)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F32A, test, shape)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F16, test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F16A, test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F8, test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+ COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F8A, test, shape)
+
+// Encoding floating point formats.
+#define PPL_CPP_FP_FORMAT_float 1
+#define PPL_CPP_FP_FORMAT_double 2
+#define PPL_CPP_FP_FORMAT_long_double 3
+#define PPL_CPP_FP_FORMAT_float_ieee754_single 4
+#define PPL_CPP_FP_FORMAT_float_ieee754_double 5
+#define PPL_CPP_FP_FORMAT_float_ieee754_quad 6
+#define PPL_CPP_FP_FORMAT_(format) PPL_CPP_FP_FORMAT_ ## format
+#define PPL_CPP_FP_FORMAT(format) PPL_CPP_FP_FORMAT_(format)
+
+
+// Turn s into a string: PPL_TEST_STR(x + y) => "x + y".
+#define PPL_TEST_STR(s) #s
+
+// Turn the expansion of s into a string: PPL_TEST_XSTR(x) => "s expanded".
+#define PPL_TEST_XSTR(s) PPL_TEST_STR(s)
+
+
+#ifdef DERIVED_TEST
+#define C_Polyhedron NNC_Polyhedron
+#endif
+
+#ifndef BOX_INSTANCE
+#define BOX_INSTANCE rt_r_oc
+#endif
+
+#ifndef BD_SHAPE_INSTANCE
+#define BD_SHAPE_INSTANCE mpq_class
+#endif
+
+#ifndef OCTAGONAL_SHAPE_INSTANCE
+#define OCTAGONAL_SHAPE_INSTANCE mpq_class
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Test {
+
+static bool
+check_noisy(const char*
+#if PPL_HAVE_DECL_GETENV || NOISY || VERY_NOISY
+ environment_variable
+#endif
+) {
+#if PPL_HAVE_DECL_GETENV
+ return getenv(environment_variable) != 0;
+#else
+#if NOISY
+ if (strcmp(environment_variable, "PPL_NOISY_TESTS") == 0)
+ return true;
+#endif
+#if VERY_NOISY
+ if (strcmp(environment_variable, "PPL_VERY_NOISY_TESTS") == 0)
+ return true;
+#endif
+ return false;
+#endif // !PPL_HAVE_DECL_GETENV
+}
+
+template<typename CharT, typename Traits = std::char_traits<CharT> >
+class nullbuf : public std::basic_streambuf<CharT, Traits> {
+protected:
+ virtual typename Traits::int_type overflow(typename Traits::int_type c) {
+ return Traits::not_eof(c);
+ }
+};
+
+template <class CharT, class Traits = std::char_traits<CharT> >
+class noisy_ostream : public std::basic_ostream<CharT, Traits> {
+private:
+ nullbuf<CharT, Traits> black_hole;
+
+public:
+ noisy_ostream(const std::basic_ostream<CharT, Traits>& os,
+ const char* environment_variable)
+ : std::basic_ostream<CharT, Traits>(check_noisy(environment_variable)
+ ? os.rdbuf()
+ : &black_hole) {
+ }
+};
+
+static noisy_ostream<char> nout(std::cout, "PPL_NOISY_TESTS");
+static noisy_ostream<char> vnout(std::cout, "PPL_VERY_NOISY_TESTS");
+
+void
+set_handlers();
+
+//! Utility typedef to allow a macro argument to denote the long double type.
+typedef long double long_double;
+
+struct Floating_Real_Open_Interval_Info_Policy {
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+struct Floating_Real_Closed_Interval_Info_Policy {
+ const_bool_nodef(store_special, false);
+ const_bool_nodef(store_open, false);
+ const_bool_nodef(cache_empty, false);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, false);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Floating_Real_Open_Interval_Info_Policy> Floating_Real_Open_Interval_Info;
+
+typedef Interval<float, Floating_Real_Open_Interval_Info> fl_r_oc;
+typedef Interval<double, Floating_Real_Open_Interval_Info> db_r_oc;
+typedef Interval<long double, Floating_Real_Open_Interval_Info> ld_r_oc;
+
+struct Rational_Real_Open_Interval_Info_Policy {
+ const_bool_nodef(store_special, true);
+ const_bool_nodef(store_open, true);
+ const_bool_nodef(cache_empty, true);
+ const_bool_nodef(cache_singleton, true);
+ const_bool_nodef(cache_normalized, false);
+ const_int_nodef(next_bit, 0);
+ const_bool_nodef(may_be_empty, true);
+ const_bool_nodef(may_contain_infinity, false);
+ const_bool_nodef(check_empty_result, false);
+ const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+ Rational_Real_Open_Interval_Info_Policy> Rational_Real_Open_Interval_Info;
+
+typedef Interval<mpq_class, Rational_Real_Open_Interval_Info> rt_r_oc;
+
+//! The incarnation of Box under test.
+typedef Box<BOX_INSTANCE> TBox;
+
+//! The incarnation of BD_Shape under test.
+typedef BD_Shape<BD_SHAPE_INSTANCE> TBD_Shape;
+
+//! The incarnation of Octagonal_Shape under test.
+typedef Octagonal_Shape<OCTAGONAL_SHAPE_INSTANCE> TOctagonal_Shape;
+
+// For floating point analysis.
+#ifdef ANALYZER_FP_FORMAT
+#ifdef ANALYZED_FP_FORMAT
+//! The type of an interval with floating point boundaries.
+typedef Interval<ANALYZER_FP_FORMAT,
+ Floating_Real_Open_Interval_Info> FP_Interval;
+
+//! The type of an interval linear form.
+typedef Linear_Form<FP_Interval> FP_Linear_Form;
+
+//! The type of an interval abstract store.
+typedef Box<FP_Interval> FP_Interval_Abstract_Store;
+
+//! The type of a linear form abstract store.
+typedef std::map<dimension_type, FP_Linear_Form>
+ FP_Linear_Form_Abstract_Store;
+
+/*! \brief
+ The incarnation of BD_Shape under test for analyzing
+ floating point computations.
+*/
+typedef BD_Shape<ANALYZER_FP_FORMAT> FP_BD_Shape;
+
+/*! \brief
+ The incarnation of Octagonal_Shape under test for analyzing
+ floating point computations.
+*/
+typedef Octagonal_Shape<ANALYZER_FP_FORMAT> FP_Octagonal_Shape;
+#endif // ANALYZED_FP_FORMAT
+#endif // ANALYZER_FP_FORMAT
+
+template <typename Shape>
+inline bool
+has_exact_coefficient_type(const Shape&) {
+ return std::numeric_limits<typename Shape::coefficient_type>::is_exact;
+}
+
+template <typename Interval>
+inline bool
+has_exact_coefficient_type(const Box<Interval>&) {
+ return std::numeric_limits<typename Interval::boundary_type>::is_exact;
+}
+
+bool
+check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+ const char* max_d_s, const char* d_name);
+
+template <typename T>
+bool
+check_result_i(const BD_Shape<T>& computed_result,
+ const BD_Shape<mpq_class>& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ BD_Shape<mpq_class> q_computed_result(computed_result);
+ // Handle in a more efficient way the case where equality is expected.
+ if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+ if (q_computed_result != known_result) {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ if (!q_computed_result.contains(known_result)) {
+ using IO_Operators::operator<<;
+ nout << "Containment does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+
+ Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+ rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+ euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+ l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+ bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+ bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+ bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+ bool ok = ok_r && ok_e && ok_l;
+ if (!ok) {
+ using IO_Operators::operator<<;
+ nout << "Computed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ }
+ return ok;
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+ const BD_Shape<mpq_class>& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ return std::numeric_limits<T>::is_integer
+ ? check_result_i(computed_result, known_result,
+ "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result,
+ max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+ const BD_Shape<T>& known_result) {
+ if (computed_result == known_result)
+ return true;
+ else {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+ const BD_Shape<mpq_class>& known_result) {
+ return std::numeric_limits<T>::is_integer
+ ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+ const BD_Shape<mpq_class>& known_result);
+
+template <typename T>
+bool
+check_result_i(const Octagonal_Shape<T>& computed_result,
+ const Octagonal_Shape<mpq_class>& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ Octagonal_Shape<mpq_class> q_computed_result(computed_result);
+ // Handle in a more efficient way the case where equality is expected.
+ if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+ if (q_computed_result != known_result) {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ if (!q_computed_result.contains(known_result)) {
+ using IO_Operators::operator<<;
+ nout << "Containment does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+
+ Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+ rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+ euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+ l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+ bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+ bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+ bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+ bool ok = ok_r && ok_e && ok_l;
+ if (!ok) {
+ using IO_Operators::operator<<;
+ nout << "Computed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ }
+ return ok;
+}
+
+template <typename T>
+bool
+check_result(const Octagonal_Shape<T>& computed_result,
+ const Octagonal_Shape<mpq_class>& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ return std::numeric_limits<T>::is_integer
+ ? check_result_i(computed_result, known_result,
+ "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result,
+ max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <>
+inline bool
+check_result(const Octagonal_Shape<mpq_class>& computed_result,
+ const Octagonal_Shape<mpq_class>& known_result,
+ const char*,
+ const char*,
+ const char*) {
+ return check_result_i(computed_result, known_result,
+ 0, 0, 0);
+}
+
+template <typename T>
+bool
+check_result(const Octagonal_Shape<T>& computed_result,
+ const Octagonal_Shape<mpq_class>& known_result) {
+ return std::numeric_limits<T>::is_integer
+ ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+
+template <typename Interval>
+bool
+check_result_i(const Box<Interval>& computed_result,
+ const Rational_Box& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ Rational_Box q_computed_result(computed_result);
+ // Handle in a more efficient way the case where equality is expected.
+ if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+ if (q_computed_result != known_result) {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ if (!q_computed_result.contains(known_result)) {
+ using IO_Operators::operator<<;
+ nout << "Containment does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ nout << "Individual dimensions where containment does not hold"
+ << "\n(Variable: computed-result known-result):\n";
+ for (dimension_type i = 0; i < computed_result.space_dimension(); ++i) {
+ if (!q_computed_result.get_interval(Variable(i))
+ .contains(known_result.get_interval(Variable(i)))) {
+ using IO_Operators::operator<<;
+ nout << Variable(i) << ": "
+ << q_computed_result.get_interval(Variable(i))
+ << ' '
+ << known_result.get_interval(Variable(i))
+ << std::endl;
+ }
+ }
+ return false;
+ }
+
+ Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+ rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+ euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+ Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+ l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+ bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+ bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+ bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+ bool ok = ok_r && ok_e && ok_l;
+ if (!ok) {
+ using IO_Operators::operator<<;
+ nout << "Computed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ }
+ return ok;
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+ const Rational_Box& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s) {
+ return std::numeric_limits<typename Interval::boundary_type>::is_integer
+ ? check_result_i(computed_result, known_result,
+ "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result,
+ max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+ const Box<Interval>& known_result) {
+ if (computed_result == known_result)
+ return true;
+ else {
+ using IO_Operators::operator<<;
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << computed_result
+ << "\nknown result is\n"
+ << known_result
+ << std::endl;
+ return false;
+ }
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+ const Rational_Box& known_result) {
+ return std::numeric_limits<typename Interval::boundary_type>::is_integer
+ ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+ : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+bool
+check_result(const Rational_Box& computed_result,
+ const Rational_Box& known_result);
+
+bool
+check_result(const Generator& computed_result,
+ const Generator& known_result,
+ const char* max_r_d_s,
+ const char* max_e_d_s,
+ const char* max_l_d_s);
+
+bool
+check_result(const Checked_Number<mpq_class, Extended_Number_Policy>& computed,
+ const Checked_Number<mpq_class, Extended_Number_Policy>& known,
+ const char* max_r_d_s);
+
+class FCAIBVP;
+
+bool
+operator==(const FCAIBVP& x, const FCAIBVP& y);
+
+bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y);
+
+std::ostream&
+operator<<(std::ostream& s, const FCAIBVP& x);
+
+/*! \brief
+ A class for representing Finite Conjunctions of Attribute
+ Independent Boolean Variable Properties.
+*/
+class FCAIBVP {
+private:
+ typedef size_t dim_t;
+
+ typedef std::set<dim_t> Set;
+
+ Set set;
+
+public:
+ FCAIBVP();
+
+ explicit FCAIBVP(const Variable x);
+
+ explicit FCAIBVP(const Variables_Set& y);
+
+ FCAIBVP(const FCAIBVP& y, unsigned offset);
+
+ memory_size_type total_memory_in_bytes() const;
+
+ memory_size_type external_memory_in_bytes() const;
+
+ bool is_top() const;
+
+ bool is_bottom() const;
+
+ bool definitely_entails(const FCAIBVP& y) const;
+
+ void upper_bound_assign(const FCAIBVP& y);
+
+ void difference_assign(const FCAIBVP& y);
+
+ void meet_assign(const FCAIBVP& y);
+
+ void weakening_assign(const FCAIBVP& y);
+
+ static bool has_nontrivial_weakening();
+
+ bool OK() const;
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::Test::operator<<(std::ostream& s,
+ const FCAIBVP& x);
+};
+
+inline
+FCAIBVP::FCAIBVP()
+ : set() {
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variable x)
+ : set() {
+ set.insert(x.id());
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variables_Set& y)
+ : set() {
+ for (Variables_Set::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ set.insert(*i);
+}
+
+inline
+FCAIBVP::FCAIBVP(const FCAIBVP& y, unsigned offset)
+ : set() {
+ for (Set::const_iterator i = y.set.begin(),
+ y_set_end = y.set.end(); i != y_set_end; ++i)
+ set.insert(*i + offset);
+}
+
+inline memory_size_type
+FCAIBVP::total_memory_in_bytes() const {
+ return 1;
+}
+
+inline bool
+FCAIBVP::is_top() const {
+ return set.empty();
+}
+
+inline bool
+FCAIBVP::is_bottom() const {
+ return false;
+}
+
+inline bool
+FCAIBVP::definitely_entails(const FCAIBVP& y) const{
+ const FCAIBVP& x = *this;
+ return std::includes(x.set.begin(), x.set.end(),
+ y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::upper_bound_assign(const FCAIBVP& y) {
+ FCAIBVP& x = *this;
+ FCAIBVP z;
+ std::set_intersection(x.set.begin(), x.set.end(),
+ y.set.begin(), y.set.end(),
+ std::inserter(z.set, z.set.begin()));
+ using std::swap;
+ swap(x, z);
+}
+
+inline void
+FCAIBVP::difference_assign(const FCAIBVP& y) {
+ FCAIBVP& x = *this;
+ FCAIBVP z;
+ std::set_difference(x.set.begin(), x.set.end(),
+ y.set.begin(), y.set.end(),
+ std::inserter(z.set, z.set.begin()));
+ using std::swap;
+ swap(x, z);
+}
+
+inline void
+FCAIBVP::meet_assign(const FCAIBVP& y) {
+ set.insert(y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::weakening_assign(const FCAIBVP& y) {
+ difference_assign(y);
+}
+
+inline bool
+FCAIBVP::has_nontrivial_weakening() {
+ return true;
+}
+
+inline bool
+FCAIBVP::OK() const {
+ return true;
+}
+
+inline bool
+operator==(const FCAIBVP& x, const FCAIBVP& y) {
+ return x.definitely_entails(y) && y.definitely_entails(x);
+}
+
+inline bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y) {
+ return !(x == y);
+}
+
+void
+print_constraint(const Constraint& c,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_constraints(const Constraint_System& cs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_constraints(const Polyhedron& ph,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+#if 0
+void
+print_constraints(const Affine_Space& affs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+#endif
+
+template <typename Interval>
+void
+print_constraints(const Box<Interval>& box,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << box << std::endl;
+}
+
+template <typename T>
+void
+print_constraints(const BD_Shape<T>& bd,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << bd << std::endl;
+}
+
+template <typename T>
+void
+print_constraints(const Octagonal_Shape<T>& oc,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << oc << std::endl;
+}
+
+template <typename PH>
+void
+print_constraints(const Pointset_Powerset<PH>& pps,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << pps << std::endl;
+}
+
+template <typename PH>
+void
+print_congruences(const Pointset_Powerset<PH>& pps,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << pps << std::endl;
+}
+
+/*
+template <typename PH>
+void
+print_constraints(const Pointset_Ask_Tell<PH>& pat,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ using IO_Operators::operator<<;
+ s << pat << std::endl;
+}
+*/
+
+void
+print_congruence(const Congruence& c,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_congruences(const Congruence_System& cgs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_congruences(const Grid& gr,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generator(const Generator& g,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generator(const Grid_Generator& g,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Generator_System& gs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Grid_Generator_System& gs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Polyhedron& ph,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Grid& gr,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+template <typename D1, typename D2, typename R>
+void
+print_constraints(const Partially_Reduced_Product<D1, D2, R>& pd,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ print_constraints(pd.constraints(), intro, s);
+}
+
+template <typename D1, typename D2, typename R>
+void
+print_congruences(const Partially_Reduced_Product<D1, D2, R>& pd,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ print_congruences(pd.congruences(), intro, s);
+}
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+} // namespace Test
+
+} // namespace Parma_Polyhedra_Library
+
+// These using directive and declaration are just to avoid the
+// corresponding namespace qualifications in all the tests.
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Test;
+using std::endl;
+
+#endif // !defined(PPL_ppl_test_hh)
diff --git a/tests/valgrind_suppressions b/tests/valgrind_suppressions
new file mode 100644
index 0000000..094660b
--- /dev/null
+++ b/tests/valgrind_suppressions
@@ -0,0 +1,18 @@
+{
+ 1
+ Memcheck:Leak
+ fun:*
+ obj:/bin/bash
+}
+{
+ 2
+ Memcheck:Leak
+ fun:*
+ obj:/bin/sed
+}
+{
+ 3
+ Memcheck:Leak
+ fun:*
+ obj:/bin/rm
+}
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..5ab9309
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1,61 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AM_CPPFLAGS = @extra_includes@
+
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution. Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \
+ -e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+build_header: build_header.in
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+
+text2cxxarray: text2cxxarray.in
+ $(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+ chmod +x text2cxxarray
+
+CLEANFILES = $(noinst_SCRIPTS)
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644
index 0000000..a670a08
--- /dev/null
+++ b/utils/Makefile.in
@@ -0,0 +1,752 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/mkinstalldirs $(dist_noinst_SCRIPTS) \
+ $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+ $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+ $(top_srcdir)/m4/ac_check_gmp.m4 \
+ $(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+ $(top_srcdir)/m4/ac_check_yap.m4 \
+ $(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+ $(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+ $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+ $(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+ $(top_srcdir)/m4/ac_prog_jar.m4 \
+ $(top_srcdir)/m4/ac_prog_java.m4 \
+ $(top_srcdir)/m4/ac_prog_javac.m4 \
+ $(top_srcdir)/m4/ac_prog_javah.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libppl_utils_a_AR = $(AR) $(ARFLAGS)
+libppl_utils_a_LIBADD =
+am_libppl_utils_a_OBJECTS = timings.$(OBJEXT)
+libppl_utils_a_OBJECTS = $(am_libppl_utils_a_OBJECTS)
+SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libppl_utils_a_SOURCES)
+DIST_SOURCES = $(libppl_utils_a_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AM_CPPFLAGS = @extra_includes@
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \
+ -e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+CLEANFILES = $(noinst_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libppl_utils.a: $(libppl_utils_a_OBJECTS) $(libppl_utils_a_DEPENDENCIES) $(EXTRA_libppl_utils_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libppl_utils.a
+ $(AM_V_AR)$(libppl_utils_a_AR) libppl_utils.a $(libppl_utils_a_OBJECTS) $(libppl_utils_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libppl_utils.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timings.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+ ctags-am dist-hook distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution. Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+build_header: build_header.in
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+
+text2cxxarray: text2cxxarray.in
+ $(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+ chmod +x text2cxxarray
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/build_header.in b/utils/build_header.in
new file mode 100644
index 0000000..8e0f139
--- /dev/null
+++ b/utils/build_header.in
@@ -0,0 +1,103 @@
+#! @PERL@
+# -*- Perl -*-
+# @generated_automatically@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+ if 0;
+
+# Builds a self-contained C++ header file by performing recursive inclusion.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+sub filter($$$$);
+sub filter($$$$) {
+ my ($file, $dirs, $level, $files) = @_;
+ return if (exists($$files{$file}));
+ $$files{$file} = undef;
+ my $fh;
+ open $fh, $file or die "Cannot open $file";
+ my $comment = 0;
+ my $copyright = 0;
+ my $print_from = 1;
+ while (my $line = <$fh>) {
+ my $iname;
+ if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) {
+ my $lineno = $.;
+ my $ifile;
+ foreach my $idir (@$dirs) {
+ $ifile = $idir . '/' . $iname;
+ last if -e $ifile;
+ }
+ filter($ifile, $dirs, $level+1, $files);
+ $print_from = 1;
+ next;
+ }
+ if ($level > 0) {
+ if ($print_from) {
+ print "/* Automatically generated from PPL source file $file line $.. */\n";
+ $print_from = 0;
+ }
+ next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$');
+ next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$');
+ next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$');
+ if ($line =~ '/\*') {
+ $comment = 1;
+ }
+ if ($comment && $line =~ 'Copyright.*Roberto Bagnara <bagnara at cs.unipr.it>') {
+ $copyright = 1;
+ print "*/\n" unless $line =~ '/\*';
+ }
+ if ($line =~ '\*/') {
+ $comment = 0;
+ if ($copyright) {
+ $copyright = 0;
+ next;
+ }
+ }
+ next if $copyright;
+ }
+ print $line;
+ }
+ close $fh;
+
+}
+
+
+my @dirs;
+
+unless (GetOptions("I=s" => \@dirs) && @ARGV == 1) {
+ print STDERR "Usage: $0 [-I dir]... file\n";
+ exit;
+}
+my $file = $ARGV[0];
+
+my ($dir, $name) = ($file =~ '^(?:(.*)/)?([^/]+)$');
+$dir = '.' unless defined($dir);
+unshift @dirs, $dir;
+
+my %files;
+
+filter($file, \@dirs, 0, \%files);
diff --git a/utils/cm_cleaner.sh b/utils/cm_cleaner.sh
new file mode 100755
index 0000000..c81a14f
--- /dev/null
+++ b/utils/cm_cleaner.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# Erases all files listed in the cutting markers found on stdin.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+___BEGIN_OF_FILE___() {
+ rm -f $1
+ cat > /dev/null
+}
+
+___END_OF_FILE___() {
+ :
+}
+
+. $1
diff --git a/utils/cm_splitter.sh b/utils/cm_splitter.sh
new file mode 100755
index 0000000..9d9e6e0
--- /dev/null
+++ b/utils/cm_splitter.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Splits stdin according to cutting markers.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+___BEGIN_OF_FILE___() {
+ cat >> $1
+}
+
+___END_OF_FILE___() {
+ :
+}
+
+. $1
diff --git a/utils/text2cxxarray.in b/utils/text2cxxarray.in
new file mode 100644
index 0000000..e3dc569
--- /dev/null
+++ b/utils/text2cxxarray.in
@@ -0,0 +1,76 @@
+#! @PERL@
+# -*- Perl -*-
+# @configure_input@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+ if 0;
+
+# Convert an ASCII text into the declaration of a C++ array.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+use Getopt::Long;
+
+sub usage {
+ print STDERR <<EOF;
+Convert ASCII text into the declaration of a C++ array.
+Usage: text2cxxarray [OPTIONS] [FILE ...]
+ [FILE ...] ASCII text file(s) to convert.
+
+ [OPTIONS]
+ --name=NAME Use NAME as the array name.
+ --definition Emit a defining declaration.
+ -h, --help Display this help message.
+EOF
+ exit 1;
+}
+
+my $array_name = "a";
+my $decl_only = 0;
+
+GetOptions(
+ 'name=s' => \$array_name,
+ 'decl-only' => \$decl_only,
+ 'help|h' => \&usage,
+) || usage();
+
+my @lines = <>;
+my $size = @lines + 1;
+
+print "extern const char* const ";
+print $array_name;
+print "[$size]";
+
+if (! $decl_only) {
+ print " = {\n";
+ foreach (@lines) {
+ chop;
+ s/\\/\\\\/g;
+ s/\t/\\t/g;
+ s/\"/\\"/g;
+ print " \"$_\",\n";
+ }
+ print " 0";
+ print "}";
+}
+
+print ";\n";
diff --git a/utils/timings.cc b/utils/timings.cc
new file mode 100644
index 0000000..f0029b4
--- /dev/null
+++ b/utils/timings.cc
@@ -0,0 +1,102 @@
+/* Definitions of simple functions for printing timings.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "timings.hh"
+#include <cassert>
+#include <ctime>
+#include <iostream>
+#include <iomanip>
+#include <cstring>
+#include <cerrno>
+#include <cstdlib>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+using namespace std;
+
+#ifdef PPL_HAVE_TIMEVAL
+// To save the time when start_clock is called.
+static struct timeval saved_ru_utime;
+#endif
+
+void
+start_clock() {
+#if PPL_HAVE_DECL_GETRUSAGE && defined(PPL_HAVE_TIMEVAL)
+ struct rusage usage;
+ if (getrusage(RUSAGE_SELF, &usage) != 0) {
+ cerr << "getrusage failed: " << strerror(errno) << endl;
+ exit(1);
+ }
+ else
+ saved_ru_utime = usage.ru_utime;
+#endif
+}
+
+void
+print_clock(ostream& s) {
+#if PPL_HAVE_DECL_GETRUSAGE && defined(PPL_HAVE_TIMEVAL)
+ struct rusage usage;
+ if (getrusage(RUSAGE_SELF, &usage) != 0) {
+ cerr << "getrusage failed: " << strerror(errno) << endl;
+ exit(1);
+ }
+ else {
+ const time_t current_secs = usage.ru_utime.tv_sec;
+ const time_t current_usecs = usage.ru_utime.tv_usec;
+ const time_t saved_secs = saved_ru_utime.tv_sec;
+ const time_t saved_usecs = saved_ru_utime.tv_usec;
+ time_t secs;
+ time_t csecs;
+ secs = current_secs - saved_secs;
+ if (current_usecs < saved_usecs) {
+ csecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+ if (csecs < 100)
+ --secs;
+ else
+ csecs = 0;
+ }
+ else {
+ csecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+ if (csecs == 100) {
+ ++secs;
+ csecs = 0;
+ }
+ }
+ assert(csecs >= 0 && csecs < 100 && secs >= 0);
+ const char fill_char = s.fill();
+ s << secs << "." << setfill('0') << setw(2) << csecs;
+ s.fill(fill_char);
+ }
+#else
+ s << "(no clock available)";
+#endif
+}
diff --git a/utils/timings.hh b/utils/timings.hh
new file mode 100644
index 0000000..0fac175
--- /dev/null
+++ b/utils/timings.hh
@@ -0,0 +1,32 @@
+/* Declaration of simple functions for printing timings.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+ Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_timings_hh
+#define PPL_timings_hh 1
+
+#include <iosfwd>
+
+void start_clock();
+void print_clock(std::ostream& s);
+
+#endif // !defined(PPL_timings_hh)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ppl.git
More information about the debian-science-commits
mailing list